[
  {
    "path": ".bazelci/presubmit.yml",
    "content": "---\nbuildifier: latest\nmatrix:\n  bazel:\n    - 7.x\n    - 8.x\ntasks:\n  verify_ubuntu2004:\n    platform: ubuntu2004\n    bazel: ${{ bazel }}\n    environment:\n      CC: clang\n      SWIFT_VERSION: \"5.10\"\n      SWIFT_HOME: \"$HOME/swift-$SWIFT_VERSION\"\n      PATH: \"$PATH:$SWIFT_HOME/usr/bin\"\n    shell_commands:\n      - \"echo --- Downloading and extracting Swift $SWIFT_VERSION to $SWIFT_HOME\"\n      - \"mkdir $SWIFT_HOME\"\n      - \"curl https://download.swift.org/swift-${SWIFT_VERSION}-release/ubuntu2004/swift-${SWIFT_VERSION}-RELEASE/swift-${SWIFT_VERSION}-RELEASE-ubuntu20.04.tar.gz | tar xvz --strip-components=1 -C $SWIFT_HOME\"\n    build_targets:\n    - \"//...\"\n    test_targets:\n    - \"//...\"\n  verify_ubuntu2204:\n    platform: ubuntu2204\n    bazel: ${{ bazel }}\n    environment:\n      CC: clang\n      SWIFT_VERSION: \"5.10\"\n      SWIFT_HOME: \"$HOME/swift-$SWIFT_VERSION\"\n      PATH: \"$PATH:$SWIFT_HOME/usr/bin\"\n    shell_commands:\n      - \"echo --- Downloading and extracting Swift $SWIFT_VERSION to $SWIFT_HOME\"\n      - \"mkdir $SWIFT_HOME\"\n      - \"curl https://download.swift.org/swift-${SWIFT_VERSION}-release/ubuntu2204/swift-${SWIFT_VERSION}-RELEASE/swift-${SWIFT_VERSION}-RELEASE-ubuntu22.04.tar.gz | tar xvz --strip-components=1 -C $SWIFT_HOME\"\n    build_targets:\n    - \"//...\"\n    test_targets:\n    - \"//...\"\n  test_module_cpp:\n    platform: ubuntu2204\n    bazel: ${{ bazel }}\n    working_directory: tests/bazel_repository_test_dir\n    build_targets:\n    - \"//...\"\n  test_module_ts:\n    platform: ubuntu2204\n    bazel: ${{ bazel }}\n    working_directory: tests/ts/bazel_repository_test_dir\n    test_targets:\n    - \"//...\"\n  verify_macos:\n    platform: macos\n    bazel: ${{ bazel }}\n    xcode_version: \"15.2\"\n    build_targets:\n    - \"//:flatbuffers\"\n    - \"//:flatc\"\n    test_targets:\n    - \"//tests:flatbuffers_test\"\n"
  },
  {
    "path": ".bazelignore",
    "content": "ts/node_modules\n\n# Test workspaces\ntests/bazel_repository_test_dir\ntests/ts/bazel_repository_test_dir\n"
  },
  {
    "path": ".bazelrc",
    "content": "# We cannot use \"common\" here because the \"version\" command doesn't support\n# --deleted_packages. We need to specify it for both build and query instead.\nbuild --deleted_packages=tests/bazel_repository_test_dir,tests/ts/bazel_repository_test_dir\nquery --deleted_packages=tests/bazel_repository_test_dir,tests/ts/bazel_repository_test_dir\n# Point tools such as coursier (used in rules_jvm_external) to Bazel's internal JDK\n# suggested in https://github.com/bazelbuild/rules_jvm_external/issues/445\ncommon --repo_env=JAVA_HOME=../bazel_tools/jdk\ncommon --action_env=JAVA_HOME=../bazel_tools/jdk\n# Workaround \"Error: need --enable_runfiles on Windows for to support rules_js\"\ncommon:windows --enable_runfiles\n# Swift is not required on Windows\ncommon:windows --deleted_packages=swift\n# Ignore warnings in external dependencies\nbuild --per_file_copt=external/.*@-Wno-everything --host_per_file_copt=external/.*@-Wno-everything\n# Honor the setting of `skipLibCheck` in the tsconfig.json file.\ncommon --@aspect_rules_ts//ts:skipLibCheck=honor_tsconfig\n# Use \"tsc\" as the transpiler when ts_project has no `transpiler` set.\ncommon --@aspect_rules_ts//ts:default_to_tsc_transpiler\n"
  },
  {
    "path": ".clang-format",
    "content": "---\nLanguage: Cpp\nBasedOnStyle: Google\n...\n\n"
  },
  {
    "path": ".clang-tidy",
    "content": "---\nFormatStyle: \"file\"\nWarningsAsErrors: \"*\"\nHeaderFilterRegex: \".*\"\nChecks: \"google-build-explicit-make-pair,\n         google-build-namespaces,\n         google-build-using-namespace,\n         google-default-arguments,\n         google-explicit-constructor,\n         google-global-names-in-headers,\n         google-objc-avoid-nsobject-new,\n         google-objc-avoid-throwing-exception,\n         google-objc-function-naming,\n         google-objc-global-variable-declaration,\n         google-readability-avoid-underscore-in-googletest-name,\n         google-readability-braces-around-statements,\n         google-readability-casting,\n         google-readability-function-size,\n         google-readability-namespace-comments,\n         google-runtime-int,\n         google-runtime-operator,\n         google-upgrade-googletest-case,\n         clang-analyzer-apiModeling.StdCLibraryFunctions,\n         clang-analyzer-apiModeling.TrustNonnull,\n         clang-analyzer-apiModeling.google.GTest,\n         clang-analyzer-apiModeling.llvm.CastValue,\n         clang-analyzer-apiModeling.llvm.ReturnValue,\n         clang-analyzer-core.CallAndMessage,\n         clang-analyzer-core.CallAndMessageModeling,\n         clang-analyzer-core.DivideZero,\n         clang-analyzer-core.DynamicTypePropagation,\n         clang-analyzer-core.NonNullParamChecker,\n         clang-analyzer-core.NonnilStringConstants,\n         clang-analyzer-core.NullDereference,\n         clang-analyzer-core.StackAddrEscapeBase,\n         clang-analyzer-core.StackAddressEscape,\n         clang-analyzer-core.UndefinedBinaryOperatorResult,\n         clang-analyzer-core.VLASize,\n         clang-analyzer-core.builtin.BuiltinFunctions,\n         clang-analyzer-core.builtin.NoReturnFunctions,\n         clang-analyzer-core.uninitialized.ArraySubscript,\n         clang-analyzer-core.uninitialized.Assign,\n         clang-analyzer-core.uninitialized.Branch,\n         clang-analyzer-core.uninitialized.CapturedBlockVariable,\n         clang-analyzer-core.uninitialized.UndefReturn,\n         clang-analyzer-cplusplus.InnerPointer,\n         clang-analyzer-cplusplus.Move,\n         clang-analyzer-cplusplus.NewDelete,\n         clang-analyzer-cplusplus.NewDeleteLeaks,\n         clang-analyzer-cplusplus.PlacementNew,\n         clang-analyzer-cplusplus.PureVirtualCall,\n         clang-analyzer-cplusplus.SelfAssignment,\n         clang-analyzer-cplusplus.SmartPtrModeling,\n         clang-analyzer-cplusplus.StringChecker,\n         clang-analyzer-cplusplus.VirtualCallModeling,\n         clang-analyzer-deadcode.DeadStores,\n         clang-analyzer-fuchsia.HandleChecker,\n         clang-analyzer-nullability.NullPassedToNonnull,\n         clang-analyzer-nullability.NullReturnedFromNonnull,\n         clang-analyzer-nullability.NullabilityBase,\n         clang-analyzer-nullability.NullableDereferenced,\n         clang-analyzer-nullability.NullablePassedToNonnull,\n         clang-analyzer-nullability.NullableReturnedFromNonnull,\n         clang-analyzer-optin.cplusplus.UninitializedObject,\n         clang-analyzer-optin.cplusplus.VirtualCall,\n         clang-analyzer-optin.mpi.MPI-Checker,\n         clang-analyzer-optin.osx.OSObjectCStyleCast,\n         clang-analyzer-optin.osx.cocoa.localizability.EmptyLocalizationContextChecker,\n         clang-analyzer-optin.osx.cocoa.localizability.NonLocalizedStringChecker,\n         clang-analyzer-optin.performance.GCDAntipattern,\n         clang-analyzer-optin.performance.Padding,\n         clang-analyzer-optin.portability.UnixAPI,\n         clang-analyzer-osx.API,\n         clang-analyzer-osx.MIG,\n         clang-analyzer-osx.NSOrCFErrorDerefChecker,\n         clang-analyzer-osx.NumberObjectConversion,\n         clang-analyzer-osx.OSObjectRetainCount,\n         clang-analyzer-osx.ObjCProperty,\n         clang-analyzer-osx.SecKeychainAPI,\n         clang-analyzer-osx.cocoa.AtSync,\n         clang-analyzer-osx.cocoa.AutoreleaseWrite,\n         clang-analyzer-osx.cocoa.ClassRelease,\n         clang-analyzer-osx.cocoa.Dealloc,\n         clang-analyzer-osx.cocoa.IncompatibleMethodTypes,\n         clang-analyzer-osx.cocoa.Loops,\n         clang-analyzer-osx.cocoa.MissingSuperCall,\n         clang-analyzer-osx.cocoa.NSAutoreleasePool,\n         clang-analyzer-osx.cocoa.NSError,\n         clang-analyzer-osx.cocoa.NilArg,\n         clang-analyzer-osx.cocoa.NonNilReturnValue,\n         clang-analyzer-osx.cocoa.ObjCGenerics,\n         clang-analyzer-osx.cocoa.RetainCount,\n         clang-analyzer-osx.cocoa.RetainCountBase,\n         clang-analyzer-osx.cocoa.RunLoopAutoreleaseLeak,\n         clang-analyzer-osx.cocoa.SelfInit,\n         clang-analyzer-osx.cocoa.SuperDealloc,\n         clang-analyzer-osx.cocoa.UnusedIvars,\n         clang-analyzer-osx.cocoa.VariadicMethodTypes,\n         clang-analyzer-osx.coreFoundation.CFError,\n         clang-analyzer-osx.coreFoundation.CFNumber,\n         clang-analyzer-osx.coreFoundation.CFRetainRelease,\n         clang-analyzer-osx.coreFoundation.containers.OutOfBounds,\n         clang-analyzer-osx.coreFoundation.containers.PointerSizedValues,\n         clang-analyzer-security.FloatLoopCounter,\n         clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling,\n         clang-analyzer-security.insecureAPI.SecuritySyntaxChecker,\n         clang-analyzer-security.insecureAPI.UncheckedReturn,\n         clang-analyzer-security.insecureAPI.bcmp,\n         clang-analyzer-security.insecureAPI.bcopy,\n         clang-analyzer-security.insecureAPI.bzero,\n         clang-analyzer-security.insecureAPI.decodeValueOfObjCType,\n         clang-analyzer-security.insecureAPI.getpw,\n         clang-analyzer-security.insecureAPI.gets,\n         clang-analyzer-security.insecureAPI.mkstemp,\n         clang-analyzer-security.insecureAPI.mktemp,\n         clang-analyzer-security.insecureAPI.rand,\n         clang-analyzer-security.insecureAPI.strcpy,\n         clang-analyzer-security.insecureAPI.vfork,\n         clang-analyzer-unix.API,\n         clang-analyzer-unix.DynamicMemoryModeling,\n         clang-analyzer-unix.Malloc,\n         clang-analyzer-unix.MallocSizeof,\n         clang-analyzer-unix.MismatchedDeallocator,\n         clang-analyzer-unix.Vfork,\n         clang-analyzer-unix.cstring.BadSizeArg,\n         clang-analyzer-unix.cstring.CStringModeling,\n         clang-analyzer-unix.cstring.NullArg,\n         clang-analyzer-valist.CopyToSelf,\n         clang-analyzer-valist.Uninitialized,\n         clang-analyzer-valist.Unterminated,\n         clang-analyzer-valist.ValistBase,\n         clang-analyzer-webkit.NoUncountedMemberChecker,\n         clang-analyzer-webkit.RefCntblBaseVirtualDtor,\n         clang-analyzer-webkit.UncountedLambdaCapturesChecker,\n\n################################################ Optional checks ################################################\n\n         #google-readability-todo,\n         #bugprone-argument-comment,\n         #bugprone-assert-side-effect,\n         #bugprone-bad-signal-to-kill-thread,\n         #bugprone-bool-pointer-implicit-conversion,\n         #bugprone-branch-clone,\n         #bugprone-copy-constructor-init,\n         #bugprone-dangling-handle,\n         #bugprone-dynamic-static-initializers,\n         #bugprone-easily-swappable-parameters,\n         #bugprone-exception-escape,\n         #bugprone-fold-init-type,\n         #bugprone-forward-declaration-namespace,\n         #bugprone-forwarding-reference-overload,\n         #bugprone-implicit-widening-of-multiplication-result,\n         #bugprone-inaccurate-erase,\n         #bugprone-incorrect-roundings,\n         #bugprone-infinite-loop,\n         #bugprone-integer-division,\n         #bugprone-lambda-function-name,\n         #bugprone-macro-parentheses,\n         #bugprone-macro-repeated-side-effects,\n         #bugprone-misplaced-operator-in-strlen-in-alloc,\n         #bugprone-misplaced-pointer-arithmetic-in-alloc,\n         #bugprone-misplaced-widening-cast,\n         #bugprone-move-forwarding-reference,\n         #bugprone-multiple-statement-macro,\n         #bugprone-narrowing-conversions,\n         #bugprone-no-escape,\n         #bugprone-not-null-terminated-result,\n         #bugprone-parent-virtual-call,\n         #bugprone-posix-return,\n         #bugprone-redundant-branch-condition,\n         #bugprone-reserved-identifier,\n         #bugprone-signal-handler,\n         #bugprone-signed-char-misuse,\n         #bugprone-sizeof-container,\n         #bugprone-sizeof-expression,\n         #bugprone-spuriously-wake-up-functions,\n         #bugprone-string-constructor,\n         #bugprone-string-integer-assignment,\n         #bugprone-string-literal-with-embedded-nul,\n         #bugprone-stringview-nullptr,\n         #bugprone-suspicious-enum-usage,\n         #bugprone-suspicious-include,\n         #bugprone-suspicious-memory-comparison,\n         #bugprone-suspicious-memset-usage,\n         #bugprone-suspicious-missing-comma,\n         #bugprone-suspicious-semicolon,\n         #bugprone-suspicious-string-compare,\n         #bugprone-swapped-arguments,\n         #bugprone-terminating-continue,\n         #bugprone-throw-keyword-missing,\n         #bugprone-too-small-loop-variable,\n         #bugprone-undefined-memory-manipulation,\n         #bugprone-undelegated-constructor,\n         #bugprone-unhandled-exception-at-new,\n         #bugprone-unhandled-self-assignment,\n         #bugprone-unused-raii,\n         #bugprone-unused-return-value,\n         #bugprone-use-after-move,\n         #bugprone-virtual-near-miss,\n         #cppcoreguidelines-avoid-c-arrays,\n         #cppcoreguidelines-avoid-goto,\n         #cppcoreguidelines-avoid-magic-numbers,\n         #cppcoreguidelines-avoid-non-const-global-variables,\n         #cppcoreguidelines-c-copy-assignment-signature,\n         #cppcoreguidelines-explicit-virtual-functions,\n         #cppcoreguidelines-init-variables,\n         #cppcoreguidelines-interfaces-global-init,\n         #cppcoreguidelines-macro-usage,\n         #cppcoreguidelines-narrowing-conversions,\n         #cppcoreguidelines-no-malloc,\n         #cppcoreguidelines-non-private-member-variables-in-classes,\n         #cppcoreguidelines-owning-memory,\n         #cppcoreguidelines-prefer-member-initializer,\n         #cppcoreguidelines-pro-bounds-array-to-pointer-decay,\n         #cppcoreguidelines-pro-bounds-constant-array-index,\n         #cppcoreguidelines-pro-bounds-pointer-arithmetic,\n         #cppcoreguidelines-pro-type-const-cast,\n         #cppcoreguidelines-pro-type-cstyle-cast,\n         #cppcoreguidelines-pro-type-member-init,\n         #cppcoreguidelines-pro-type-reinterpret-cast,\n         #cppcoreguidelines-pro-type-static-cast-downcast,\n         #cppcoreguidelines-pro-type-union-access,\n         #cppcoreguidelines-pro-type-vararg,\n         #cppcoreguidelines-slicing,\n         #cppcoreguidelines-special-member-functions,\n         #cppcoreguidelines-virtual-class-destructor,\n         #hicpp-avoid-c-arrays,\n         #hicpp-avoid-goto,\n         #hicpp-braces-around-statements,\n         #hicpp-deprecated-headers,\n         #hicpp-exception-baseclass,\n         #hicpp-explicit-conversions,\n         #hicpp-function-size,\n         #hicpp-invalid-access-moved,\n         #hicpp-member-init,\n         #hicpp-move-const-arg,\n         #hicpp-multiway-paths-covered,\n         #hicpp-named-parameter,\n         #hicpp-new-delete-operators,\n         #hicpp-no-array-decay,\n         #hicpp-no-assembler,\n         #hicpp-no-malloc,\n         #hicpp-noexcept-move,\n         #hicpp-signed-bitwise,\n         #hicpp-special-member-functions,\n         #hicpp-static-assert,\n         #hicpp-undelegated-constructor,\n         #hicpp-uppercase-literal-suffix,\n         #hicpp-use-auto,\n         #hicpp-use-emplace,\n         #hicpp-use-equals-default,\n         #hicpp-use-equals-delete,\n         #hicpp-use-noexcept,\n         #hicpp-use-nullptr,\n         #hicpp-use-override,\n         #hicpp-vararg,\n         #modernize-avoid-bind,\n         #modernize-avoid-c-arrays,\n         #modernize-concat-nested-namespaces,\n         #modernize-deprecated-headers,\n         #modernize-deprecated-ios-base-aliases,\n         #modernize-loop-convert,\n         #modernize-make-shared,\n         #modernize-make-unique,\n         #modernize-pass-by-value,\n         #modernize-raw-string-literal,\n         #modernize-redundant-void-arg,\n         #modernize-replace-auto-ptr,\n         #modernize-replace-disallow-copy-and-assign-macro,\n         #modernize-replace-random-shuffle,\n         #modernize-return-braced-init-list,\n         #modernize-shrink-to-fit,\n         #modernize-unary-static-assert,\n         #modernize-use-auto,\n         #modernize-use-bool-literals,\n         #modernize-use-default-member-init,\n         #modernize-use-emplace,\n         #modernize-use-equals-default,\n         #modernize-use-equals-delete,\n         #modernize-use-nodiscard,\n         #modernize-use-noexcept,\n         #modernize-use-nullptr,\n         #modernize-use-override,\n         #modernize-use-trailing-return-type,\n         #modernize-use-transparent-functors,\n         #modernize-use-uncaught-exceptions,\n         #modernize-use-using,\n         #performance-faster-string-find,\n         #performance-for-range-copy,\n         #performance-implicit-conversion-in-loop,\n         #performance-inefficient-algorithm,\n         #performance-inefficient-string-concatenation,\n         #performance-inefficient-vector-operation,\n         #performance-move-const-arg,\n         #performance-move-constructor-init,\n         #performance-no-automatic-move,\n         #performance-no-int-to-ptr,\n         #performance-noexcept-move-constructor,\n         #performance-trivially-destructible,\n         #performance-type-promotion-in-math-fn,\n         #performance-unnecessary-copy-initialization,\n         #performance-unnecessary-value-param,\n         #portability-restrict-system-includes,\n         #portability-simd-intrinsics,\n         #readability-avoid-const-params-in-decls,\n         #readability-braces-around-statements,\n         #readability-const-return-type,\n         #readability-container-contains,\n         #readability-container-data-pointer,\n         #readability-container-size-empty,\n         #readability-convert-member-functions-to-static,\n         #readability-delete-null-pointer,\n         #readability-duplicate-include,\n         #readability-else-after-return,\n         #readability-function-cognitive-complexity,\n         #readability-function-size,\n         #readability-identifier-length,\n         #readability-identifier-naming,\n         #readability-implicit-bool-conversion,\n         #readability-inconsistent-declaration-parameter-name,\n         #readability-isolate-declaration,\n         #readability-magic-numbers,\n         #readability-make-member-function-const,\n         #readability-misleading-indentation,\n         #readability-misplaced-array-index,\n         #readability-named-parameter,\n         #readability-non-const-parameter,\n         #readability-qualified-auto,\n         #readability-redundant-access-specifiers,\n         #readability-redundant-control-flow,\n         #readability-redundant-declaration,\n         #readability-redundant-function-ptr-dereference,\n         #readability-redundant-member-init,\n         #readability-redundant-preprocessor,\n         #readability-redundant-smartptr-get,\n         #readability-redundant-string-cstr,\n         #readability-redundant-string-init,\n         #readability-simplify-boolean-expr,\n         #readability-simplify-subscript-expr,\n         #readability-static-accessed-through-instance,\n         #readability-static-definition-in-anonymous-namespace,\n         #readability-string-compare,\n         #readability-suspicious-call-argument,\n         #readability-uniqueptr-delete-release,\n         #readability-uppercase-literal-suffix,\n         #readability-use-anyofallof\n         \"\n"
  },
  {
    "path": ".editorconfig",
    "content": "root = true\n# Don't set line endings to avoid conflict with core.autocrlf flag.\n# Line endings on checkout/checkin are controlled by .gitattributes file.\n[*]\nindent_style = space\nindent_size = 2\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n"
  },
  {
    "path": ".gitattributes",
    "content": "# Set the default behavior, in case people don't have core.autocrlf set.\n* text=auto\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "content": "# Default owner\n* @dbaileychess derekbailey@google.com\n\n# Prevent modification of this file\n.github/CODEOWNERS @dbaileychess derekbailey@google.com\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/404-doc.md",
    "content": "---\nname: 404 Doc\nabout: To fix broken documentation links\ntitle: \"[Doc 404]\"\nlabels: documentation\nassignees: dbaileychess\n\n---\n\nTarget URL:\n[Optional] Source Site:\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "content": "Thank you for submitting an issue!\n\nPlease make sure you include the names of the affected language(s), compiler version(s), operating system version(s), and FlatBuffers version(s) in your issue title.\n\nThis helps us get the correct maintainers to look at your issue. Here are examples of good titles:\n\n- Crash when accessing FlatBuffer [C++, gcc 4.8, OS X, master]\n- Flatc converts a protobuf 'bytes' field to 'string' in fbs schema file [all languages, FlatBuffers 1.4]\n\nInclude other details as appropriate.\n\nThanks!\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "Thank you for submitting a PR!\n\nPlease delete this standard text once you've created your own description.\n\nIf you make changes to any of the code generators (`src/idl_gen*`) be sure to\n[build](https://google.github.io/flatbuffers/flatbuffers_guide_building.html) your project, as it will generate code based on the changes. If necessary\nthe code generation script can be directly run (`scripts/generate_code.py`),\nrequires Python3. This allows us to better see the effect of the PR.\n\nIf your PR includes C++ code, please adhere to the\n[Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html),\nand don't forget we try to support older compilers (e.g. VS2010, GCC 4.6.3),\nso only some C++11 support is available.\n\nFor any C++ changes, please make sure to run `sh scripts/clang-format-git.sh`\n\nInclude other details as appropriate.\n\nThanks!\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n  - package-ecosystem: \"github-actions\"\n    directory: \"/\"\n    schedule:\n      interval: \"weekly\"\n"
  },
  {
    "path": ".github/labeler.yml",
    "content": "# Configuration for Auto Labeler during pull request\n#\n# See https://github.com/actions/labeler for file format\n# and https://github.com/google/flatbuffers/labels for a list of valid labels\n#\n# See .github/workflows/label.yml for Github Action workflow script\n\n\"c#\":\n  - changed-files:\n    - any-glob-to-any-file:\n      - '**/*.cs'\n      - 'net/**/*'\n      - 'tests/FlatBuffers.Test/**/*'\n      - 'tests/FlatBuffers.Benchmarks/**/*'\n      - 'src/idl_gen_csharp.cpp'\n\nswift:\n  - changed-files:\n    - any-glob-to-any-file:\n      - '**/*.swift'\n      - 'swift/**/*'\n      - 'tests/swift/**'\n      - 'src/idl_gen_swift.cpp'\n\nnim:\n  - changed-files:\n    - any-glob-to-any-file:\n      - '**/*.nim'\n      - 'nim/**/*'\n      - 'src/idl_gen_nim.cpp'\n      - 'src/bfbs_gen_nim.cpp'\n\njavascript:\n  - changed-files:\n    - any-glob-to-any-file:\n      - '**/*.js'\n      - 'src/idl_gen_ts.cpp'\n\ntypescript:\n  - changed-files:\n    - any-glob-to-any-file:\n      - '**/*.ts'\n      - 'src/idl_gen_ts.cpp'\n      - 'grpc/flatbuffers-js-grpc/**/*.ts'\n\ngolang:\n  - changed-files:\n    - any-glob-to-any-file:\n      - '**/*.go'\n      - 'src/idl_gen_go.cpp'\n\npython:\n  - changed-files:\n    - any-glob-to-any-file:\n      - '**/*.py'\n      - 'src/idl_gen_python.cpp'\n\njava:\n  - changed-files:\n    - any-glob-to-any-file:\n      - '**/*.java'\n      - 'src/idl_gen_java.cpp'\n\nkotlin:\n  - changed-files:\n    - any-glob-to-any-file:\n      - '**/*.kt'\n      - 'src/idl_gen_kotlin.cpp'\n      - 'src/idl_gen_kotlin_kmp.cpp'\n\nlua:\n  - changed-files:\n    - any-glob-to-any-file:\n      - '**/*.lua'\n      - 'lua/**/*'\n      - 'src/bfbs_gen_lua.cpp'\n\nlobster:\n  - changed-files:\n    - any-glob-to-any-file:\n      - '**/*.lobster'\n      - 'src/idl_gen_lobster.cpp'\n\nphp:\n  - changed-files:\n    - any-glob-to-any-file:\n      - '**/*.php'\n      - 'src/idl_gen_php.cpp'\n\nrust:\n  - changed-files:\n    - any-glob-to-any-file:\n      - '**/*.rs'\n      - 'rust/**/*'\n      - 'src/idl_gen_rust.cpp'\n\ndart:\n  - changed-files:\n    - any-glob-to-any-file:\n      - '**/*.dart'\n      - 'src/idl_gen_dart.cpp'\n\n\"c++\":\n  - changed-files:\n    - any-glob-to-any-file:\n      - '**/*.cc'\n      - '**/*.cpp'\n      - '**/*.h'\n\njson:\n  - changed-files:\n    - any-glob-to-any-file:\n      - '**/*.json'\n      - 'src/idl_gen_json_schema.cpp'\n\ncodegen:\n  - changed-files:\n    - any-glob-to-any-file:\n      - 'src/**/*'\n\ndocumentation:\n  - changed-files:\n    - any-glob-to-any-file:\n      - 'docs/**/*'\n      - '**/*.md'\n\nCI:\n  - changed-files:\n    - any-glob-to-any-file:\n      - '.github/**/*'\n      - '.bazelci/**/*'\n\ngrpc:\n  - changed-files:\n    - any-glob-to-any-file:\n      - 'grpc/**/*'\n      - 'src/idl_gen_grpc.cpp'\n"
  },
  {
    "path": ".github/workflows/build.yml",
    "content": "name: CI\npermissions: read-all\n\non:\n  # For manual tests.\n  workflow_dispatch:\n  push:\n    tags:\n      - \"*\" # new tag version, like `0.8.4` or else\n    branches:\n      - master\n  pull_request:\n    branches:\n      - master\n  schedule:\n    # Run daily at 4:45 A.M. to catch dependencies that break us.\n    - cron: '45 4 * * *'\n\njobs:\n  build-linux:\n    permissions:\n      contents: write\n    outputs:\n      digests-gcc: ${{ steps.hash-gcc.outputs.hashes }}\n      digests-clang: ${{ steps.hash-clang.outputs.hashes }}\n    name: Build Linux\n    runs-on: ubuntu-24.04\n    strategy:\n      matrix:\n        cxx: [g++-13, clang++-18]\n      fail-fast: false\n    steps:\n    - uses: actions/checkout@v6\n    - name: cmake\n      run: CXX=${{ matrix.cxx }} cmake -G \"Unix Makefiles\" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_STRICT_MODE=ON -DFLATBUFFERS_STATIC_FLATC=ON .\n    - name: build\n      run: make -j\n    - name: test\n      run: ./flattests\n    - name: make flatc executable\n      run: |\n        chmod +x flatc\n        ./flatc --version\n    - name: upload build artifacts\n      uses: actions/upload-artifact@v7\n      with:\n        name: Linux flatc binary ${{ matrix.cxx }}\n        path: flatc\n    # Below if only for release.\n    - name: Zip file\n      if: startsWith(github.ref, 'refs/tags/')\n      run: zip Linux.flatc.binary.${{ matrix.cxx }}.zip flatc\n    - name: Release zip file\n      uses: softprops/action-gh-release@v2\n      if: startsWith(github.ref, 'refs/tags/')\n      with:\n        files: Linux.flatc.binary.${{ matrix.cxx }}.zip\n    - name: Generate SLSA subjects - clang\n      if: matrix.cxx == 'clang++-18' && startsWith(github.ref, 'refs/tags/')\n      id: hash-clang\n      run: echo \"hashes=$(sha256sum Linux.flatc.binary.${{ matrix.cxx }}.zip | base64 -w0)\" >> $GITHUB_OUTPUT\n    - name: Generate SLSA subjects - gcc\n      if: matrix.cxx == 'g++-13' && startsWith(github.ref, 'refs/tags/')\n      id: hash-gcc\n      run: echo \"hashes=$(sha256sum Linux.flatc.binary.${{ matrix.cxx }}.zip | base64 -w0)\" >> $GITHUB_OUTPUT\n\n  build-linux-no-file-tests:\n    name: Build Linux with -DFLATBUFFERS_NO_FILE_TESTS\n    runs-on: ubuntu-24.04\n    steps:\n    - uses: actions/checkout@v6\n    - name: cmake\n      run: CXX=clang++-18 cmake -G \"Unix Makefiles\" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_STRICT_MODE=ON -DFLATBUFFERS_CXX_FLAGS=\"-DFLATBUFFERS_NO_FILE_TESTS\" .\n    - name: build\n      run: make -j\n    - name: test\n      run: ./flattests\n\n  build-linux-out-of-source:\n    name: Build Linux with out-of-source build location\n    runs-on: ubuntu-24.04\n    steps:\n    - uses: actions/checkout@v6\n    - name: make build directory\n      run: mkdir build\n    - name: cmake\n      working-directory: build\n      run: >\n        CXX=clang++-18 cmake .. -G \"Unix Makefiles\" -DFLATBUFFERS_STRICT_MODE=ON\n        -DFLATBUFFERS_BUILD_CPP17=ON -DFLATBUFFERS_CPP_STD=17\n    - name: build\n      working-directory: build\n      run: make -j\n    - name: test\n      working-directory: build\n      run: pwd && ./flattests\n    - name: test C++17\n      working-directory: build\n      run: ./flattests_cpp17\n\n  build-linux-cpp-std:\n    name: Build Linux C++\n    runs-on: ubuntu-24.04\n    strategy:\n      fail-fast: false\n      matrix:\n        std: [11, 14, 17, 20, 23]\n        cxx: [g++-13, clang++-18]\n        exclude:\n          # Clang++15 10.3.0 stdlibc++ doesn't fully support std 23\n          - cxx: clang++-18\n            std: 23\n\n    steps:\n    - uses: actions/checkout@v6\n    - name: cmake\n      run: >\n        CXX=${{ matrix.cxx }} cmake -G \"Unix Makefiles\"\n        -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_STRICT_MODE=ON\n        -DFLATBUFFERS_CPP_STD=${{ matrix.std }}\n        -DFLATBUFFERS_BUILD_CPP17=${{ matrix.std >= 17 && 'On' || 'Off'}}\n    - name: build\n      run: make -j\n    - name: test\n      run: ./flattests\n    - name: test C++17\n      if: matrix.std >= 17\n      run: ./flattests_cpp17\n\n  build-cpp-std:\n    name: Build Windows C++\n    runs-on: windows-2022\n    strategy:\n      matrix:\n        std: [11, 14, 17, 20, 23]\n      fail-fast: false\n    steps:\n    - uses: actions/checkout@v6\n    - name: Add msbuild to PATH\n      uses: microsoft/setup-msbuild@v2\n    - name: cmake\n      run: >\n        cmake -G \"Visual Studio 17 2022\" -A x64 -DCMAKE_BUILD_TYPE=Release\n        -DFLATBUFFERS_STRICT_MODE=ON\n        -DFLATBUFFERS_CPP_STD=${{ matrix.std }}\n        -DFLATBUFFERS_BUILD_CPP17=${{ matrix.std >= 17 && 'On' || 'Off'}}\n    - name: build\n      run: msbuild.exe FlatBuffers.sln /p:Configuration=Release /p:Platform=x64\n    - name: test\n      run: Release\\flattests.exe\n    - name: test C++17\n      if: matrix.std >= 17\n      run: Release\\flattests_cpp17.exe\n\n  build-windows:\n    permissions:\n      contents: write\n    outputs:\n      digests: ${{ steps.hash.outputs.hashes }}\n    name: Build Windows 2022\n    runs-on: windows-2022\n    steps:\n    - uses: actions/checkout@v6\n    - name: Add msbuild to PATH\n      uses: microsoft/setup-msbuild@v2\n    - name: cmake\n      run: cmake -G \"Visual Studio 17 2022\" -A x64 -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_BUILD_CPP17=ON -DFLATBUFFERS_STRICT_MODE=ON .\n    - name: build\n      run: msbuild.exe FlatBuffers.sln /p:Configuration=Release /p:Platform=x64\n    - name: test\n      run: Release\\flattests.exe\n    - name: upload build artifacts\n      uses: actions/upload-artifact@v7\n      with:\n        name: Windows flatc binary\n        path: Release\\flatc.exe\n    # Below if only for release.\n    - name: Zip file\n      if: startsWith(github.ref, 'refs/tags/')\n      run: move Release/flatc.exe . && Compress-Archive flatc.exe Windows.flatc.binary.zip\n    - name: Release binary\n      uses: softprops/action-gh-release@v2\n      if: startsWith(github.ref, 'refs/tags/')\n      with:\n        files: Windows.flatc.binary.zip\n    - name: Generate SLSA subjects\n      if: startsWith(github.ref, 'refs/tags/')\n      id: hash\n      shell: bash\n      run: echo \"hashes=$(sha256sum Windows.flatc.binary.zip | base64 -w0)\" >> $GITHUB_OUTPUT\n\n  build-dotnet-windows:\n    name: Build .NET Windows\n    runs-on: windows-2022\n    strategy:\n      matrix:\n        configuration: [\n          '',\n          '-p:UnsafeByteBuffer=true',\n          '-p:EnableSpanT=true,UnsafeByteBuffer=true'\n          ]\n    steps:\n    - uses: actions/checkout@v6\n    - name: Setup .NET Core SDK\n      uses: actions/setup-dotnet@v5\n      with:\n        dotnet-version: '8.0.x'\n    - name: Build\n      run: |\n        cd tests\\FlatBuffers.Test\n        dotnet new sln --force --name FlatBuffers.Test --format sln\n        dotnet sln FlatBuffers.Test.sln add FlatBuffers.Test.csproj\n        dotnet build -c Release ${{matrix.configuration}} FlatBuffers.Test.sln\n    - name: Run net6.0\n      run: |\n        cd tests\\FlatBuffers.Test\\bin\\Release\\net6.0\n        dir\n        .\\FlatBuffers.Test.exe\n    - name: Run net8.0\n      run: |\n        cd tests\\FlatBuffers.Test\\bin\\Release\\net8.0\n        .\\FlatBuffers.Test.exe\n\n  build-mac-intel:\n    permissions:\n      contents: write\n    outputs:\n      digests: ${{ steps.hash.outputs.hashes }}\n    name: Build Mac (for Intel)\n    runs-on: macos-15-intel\n    steps:\n    - uses: actions/checkout@v6\n    - name: cmake\n      run: cmake -G \"Xcode\" -DCMAKE_OSX_ARCHITECTURES=\"x86_64\" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_STRICT_MODE=ON .\n    - name: build\n      run: xcodebuild -toolchain clang -configuration Release -target flattests\n    - name: check that the binary is x86_64\n      run: |\n        info=$(file Release/flatc)\n        echo $info\n        echo $info | grep \"Mach-O 64-bit executable x86_64\"\n    - name: test\n      run: Release/flattests\n    - name: make flatc executable\n      run: |\n        chmod +x Release/flatc\n        Release/flatc --version\n    - name: upload build artifacts\n      uses: actions/upload-artifact@v7\n      with:\n        name: Mac flatc binary Intel\n        path: Release/flatc\n    # Below if only for release.\n    - name: Zip file\n      if: startsWith(github.ref, 'refs/tags/')\n      run: mv Release/flatc . && zip MacIntel.flatc.binary.zip flatc\n    - name: Release binary\n      uses: softprops/action-gh-release@v2\n      if: startsWith(github.ref, 'refs/tags/')\n      with:\n        files: MacIntel.flatc.binary.zip\n    - name: Generate SLSA subjects\n      if: startsWith(github.ref, 'refs/tags/')\n      id: hash\n      run: echo \"hashes=$(shasum -a 256 MacIntel.flatc.binary.zip | base64)\" >> $GITHUB_OUTPUT\n\n  build-mac-universal:\n    permissions:\n      contents: write\n    outputs:\n      digests: ${{ steps.hash.outputs.hashes }}\n    name: Build Mac (universal build)\n    runs-on: macos-latest\n    steps:\n    - uses: actions/checkout@v6\n    - name: cmake\n      run: cmake -G \"Xcode\" -DCMAKE_OSX_ARCHITECTURES=\"arm64;x86_64\" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_STRICT_MODE=ON .\n    - name: build\n      run: xcodebuild -toolchain clang -configuration Release -target flattests\n    - name: check that the binary is \"universal\"\n      run: |\n        info=$(file Release/flatc)\n        echo $info\n        echo $info | grep \"Mach-O universal binary with 2 architectures\"\n    - name: test\n      run: Release/flattests\n    - name: make flatc executable\n      run: |\n        chmod +x Release/flatc\n        Release/flatc --version\n    - name: upload build artifacts\n      uses: actions/upload-artifact@v7\n      with:\n        name: Mac flatc binary Universal\n        path: Release/flatc\n    # Below if only for release.\n    - name: Zip file\n      if: startsWith(github.ref, 'refs/tags/')\n      run: mv Release/flatc . && zip Mac.flatc.binary.zip flatc\n    - name: Release binary\n      uses: softprops/action-gh-release@v2\n      if: startsWith(github.ref, 'refs/tags/')\n      with:\n        files: Mac.flatc.binary.zip\n    - name: Generate SLSA subjects\n      if: startsWith(github.ref, 'refs/tags/')\n      id: hash\n      run: echo \"hashes=$(shasum -a 256 Mac.flatc.binary.zip | base64)\" >> $GITHUB_OUTPUT\n\n  build-android:\n   name: Build Android (on Linux)\n   if: false #disabled due to continual failure\n   runs-on: ubuntu-24.04\n   steps:\n   - uses: actions/checkout@v6\n   - name: set up Java\n     uses: actions/setup-java@v5\n     with:\n       distribution: temurin\n       java-version: 17\n   - name: set up Gradle\n     uses: gradle/actions/setup-gradle@v5\n   - name: set up flatc\n     run: |\n       cmake -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_BUILD_FLATLIB=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF -DFLATBUFFERS_STRICT_MODE=ON .\n       make -j\n       echo \"${PWD}\" >> $GITHUB_PATH\n   - name: build\n     working-directory: android\n     run: gradle clean build\n\n  build-generator:\n    name: Check Generated Code\n    runs-on: ubuntu-24.04\n    strategy:\n      matrix:\n        cxx: [g++-13, clang++-18]\n    steps:\n    - uses: actions/checkout@v6\n    - name: cmake\n      run: CXX=${{ matrix.cxx }} cmake -G \"Unix Makefiles\" -DFLATBUFFERS_BUILD_TESTS=OFF -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_STRICT_MODE=ON . && make -j\n    - name: Generate\n      run: scripts/check_generate_code.py\n    - name: Generate gRPC\n      run: scripts/check-grpc-generated-code.py\n\n  build-generator-windows:\n    name: Check Generated Code on Windows\n    runs-on: windows-2022\n    steps:\n    - uses: actions/checkout@v6\n    - name: Add msbuild to PATH\n      uses: microsoft/setup-msbuild@v2\n    - name: cmake\n      run: cmake -G \"Visual Studio 17 2022\" -A x64 -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_BUILD_CPP17=ON -DFLATBUFFERS_STRICT_MODE=ON .\n    - name: build\n      run: msbuild.exe FlatBuffers.sln /p:Configuration=Release /p:Platform=x64\n    - name: Generate\n      run: python3 scripts/check_generate_code.py --flatc Release\\flatc.exe\n    - name: Generate gRPC\n      run: python3 scripts/check-grpc-generated-code.py --flatc Release\\flatc.exe\n\n  build-benchmarks:\n    name: Build Benchmarks (on Linux)\n    runs-on: ubuntu-24.04\n    strategy:\n      matrix:\n        cxx: [g++-13]\n    steps:\n    - uses: actions/checkout@v6\n    - name: cmake\n      run: CXX=${{ matrix.cxx }} cmake -G \"Unix Makefiles\" -DFLATBUFFERS_CXX_FLAGS=\"-Wno-unused-parameter -fno-aligned-new\" -DFLATBUFFERS_BUILD_BENCHMARKS=ON -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_STRICT_MODE=ON . && make -j\n    - name: Run benchmarks\n      run: ./flatbenchmark --benchmark_repetitions=5 --benchmark_display_aggregates_only=true --benchmark_out_format=console --benchmark_out=benchmarks/results_${{matrix.cxx}}\n    - name: Upload benchmarks results\n      uses: actions/upload-artifact@v7\n      with:\n        name: Linux flatbenchmark results ${{matrix.cxx}}\n        path: benchmarks/results_${{matrix.cxx}}\n\n  build-java:\n    name: Build Java\n    runs-on: ubuntu-24.04\n    steps:\n    - uses: actions/checkout@v6\n    - name: test\n      working-directory: java\n      run: mvn test\n\n  build-kotlin-macos:\n    name: Build Kotlin MacOS\n    runs-on: macos-15\n    steps:\n    - name: Checkout\n      uses: actions/checkout@v6\n    - name: set up Java\n      uses: actions/setup-java@v5\n      with:\n        distribution: temurin\n        java-version: 17\n    - name: set up Gradle\n      uses: gradle/actions/setup-gradle@v5\n    - name: Build flatc\n      run: |\n       cmake -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_BUILD_FLATLIB=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF .\n       make -j\n       echo \"${PWD}\" >> $GITHUB_PATH\n    - name: Build\n      working-directory: kotlin\n      run: ./gradlew clean iosSimulatorArm64Test macosX64Test macosArm64Test\n\n  build-kotlin-linux:\n    name: Build Kotlin Linux\n    if: false #disabled due to continual failure\n    runs-on: ubuntu-24.04\n    steps:\n    - name: Checkout\n      uses: actions/checkout@v6\n    - name: set up Java\n      uses: actions/setup-java@v5\n      with:\n        distribution: temurin\n        java-version: 17\n    - name: set up Gradle\n      uses: gradle/actions/setup-gradle@v5\n    - name: Build flatc\n      run: |\n       cmake -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_BUILD_FLATLIB=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF .\n       make -j\n       echo \"${PWD}\" >> $GITHUB_PATH\n    - name: Build\n      working-directory: kotlin\n      # we are using docker's version of gradle\n      # so no need for wrapper validation or user\n      # gradlew\n      run: gradle jvmMainClasses jvmTest jsTest jsBrowserTest\n\n  build-rust-linux:\n    name: Build Rust Linux\n    runs-on: ubuntu-24.04\n    steps:\n    - uses: actions/checkout@v6\n    - name: test\n      working-directory: tests\n      run: bash RustTest.sh\n\n  build-rust-windows:\n    name: Build Rust Windows\n    runs-on: windows-2022\n    steps:\n    - uses: actions/checkout@v6\n    - name: test\n      working-directory: tests\n      run: ./RustTest.bat\n\n  build-python:\n    name: Build Python\n    runs-on: ubuntu-24.04\n    steps:\n    - uses: actions/checkout@v6\n    - name: flatc\n      # FIXME: make test script not rely on flatc\n      run: cmake -G \"Unix Makefiles\" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_INSTALL=OFF -DFLATBUFFERS_BUILD_FLATLIB=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF -DFLATBUFFERS_STRICT_MODE=ON . && make -j\n    - name: test\n      working-directory: tests\n      run: bash PythonTest.sh\n\n  build-go:\n    name: Build Go\n    runs-on: ubuntu-24.04\n    steps:\n    - uses: actions/checkout@v6\n    - name: flatc\n      # FIXME: make test script not rely on flatc\n      run: cmake -G \"Unix Makefiles\" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_INSTALL=OFF -DFLATBUFFERS_BUILD_FLATLIB=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF -DFLATBUFFERS_STRICT_MODE=ON . && make -j\n    - name: test\n      working-directory: tests\n      run: bash GoTest.sh\n\n  build-php:\n   name: Build PHP\n   runs-on: ubuntu-24.04\n   steps:\n   - uses: actions/checkout@v6\n   - name: flatc\n     # FIXME: make test script not rely on flatc\n     run: cmake -G \"Unix Makefiles\" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_INSTALL=OFF -DFLATBUFFERS_BUILD_FLATLIB=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF -DFLATBUFFERS_STRICT_MODE=ON . && make -j\n   - name: test\n     working-directory: tests\n     run: |\n       php phpTest.php\n       sh phpUnionVectorTest.sh\n\n  build-swift:\n    name: Test Swift Linux\n    strategy:\n      matrix:\n        swift: [\"5.10\", \"6.1\", \"6.2\"]\n    runs-on: ubuntu-24.04\n    steps:\n    - uses: actions/checkout@v6\n    - uses: swift-actions/setup-swift@v2\n      with:\n        swift-version: ${{ matrix.swift }}\n    - name: Get swift version\n      run: swift --version\n    - name: test\n      run: swift test\n\n  build-swift-windows:\n    name: Test swift windows\n    runs-on: windows-latest\n    steps:\n      - uses: actions/checkout@v6\n      - uses: SwiftyLab/setup-swift@latest\n        with:\n          swift-version: '6.1'\n      - run: swift build\n      - run: swift test\n\n  build-swift-wasm:\n    name: Test Swift Wasm\n    runs-on: ubuntu-24.04\n    steps:\n       - uses: actions/checkout@v6\n       - uses: swift-actions/setup-swift@v2\n         with:\n           swift-version: 6.2.1\n       - uses: bytecodealliance/actions/wasmtime/setup@v1\n       - name: Install Swift SDK\n         run: swift sdk install https://download.swift.org/swift-6.2.1-release/wasm-sdk/swift-6.2.1-RELEASE/swift-6.2.1-RELEASE_wasm.artifactbundle.tar.gz --checksum 482b9f95462b87bedfafca94a092cf9ec4496671ca13b43745097122d20f18af\n       - name: Test\n         working-directory: tests/swift/Wasm.tests\n         run: |\n           swift sdk list\n           swift build --build-tests --swift-sdk swift-6.2.1-RELEASE_wasm\n           wasmtime --dir . .build/wasm32-unknown-wasip1/debug/FlatBuffers.Test.Swift.WasmPackageTests.xctest\n\n  build-ts:\n    name: Build TS\n    runs-on: ubuntu-24.04\n    steps:\n    - uses: actions/checkout@v6\n    - name: flatc\n      # FIXME: make test script not rely on flatc\n      run: cmake -G \"Unix Makefiles\" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_INSTALL=OFF -DFLATBUFFERS_BUILD_FLATLIB=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF . && make -j\n    - name: pnpm\n      run: npm install -g pnpm esbuild\n    - name: deps\n      run: pnpm i\n    - name: compile\n      run: pnpm compile\n    - name: test\n      working-directory: tests/ts\n      run: |\n        python3 TypeScriptTest.py\n\n  build-dart:\n    name: Build Dart\n    runs-on: ubuntu-24.04\n    steps:\n      - uses: actions/checkout@v6\n      - uses: dart-lang/setup-dart@v1\n        with:\n          sdk: stable\n      - name: flatc\n        # FIXME: make test script not rely on flatc\n        run: cmake -G \"Unix Makefiles\" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_INSTALL=OFF -DFLATBUFFERS_BUILD_FLATLIB=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF -DFLATBUFFERS_STRICT_MODE=ON . && make -j\n      - name: test\n        working-directory: tests\n        run: bash DartTest.sh\n\n  build-nim:\n    name: Build Nim\n    runs-on: ubuntu-24.04\n    steps:\n    - uses: actions/checkout@v6\n    - name: flatc\n      # FIXME: make test script not rely on flatc\n      run: cmake -G \"Unix Makefiles\" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_INSTALL=OFF -DFLATBUFFERS_BUILD_FLATLIB=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF . && make -j\n    - uses: jiro4989/setup-nim-action@v2\n    - name: install library\n      working-directory: nim\n      run: nimble -y develop && nimble install\n    - name: test\n      working-directory: tests/nim\n      run: python3 testnim.py\n\n  bazel:\n    name: Bazel\n    runs-on: ubuntu-24.04\n    steps:\n      - uses: actions/checkout@v6\n      # Explicitly use 8.5.1 until we can update or https://github.com/actions/runner-images/issues/13564 is fixed.\n      - name: Set env\n        run: >\n          echo \"USE_BAZEL_VERSION=8.5.1\" >> $GITHUB_ENV\n      - name: bazel build\n        run: >\n          bazel build\n          //:flatc\n          //:flatbuffers\n          //tests:flatbuffers_test\n      - name: bazel test\n        run: >\n          bazel test\n          //tests:flatbuffers_test\n\n  release-digests:\n    if: startsWith(github.ref, 'refs/tags/')\n    needs: [build-linux, build-windows, build-mac-intel, build-mac-universal]\n    outputs:\n      digests: ${{ steps.hash.outputs.digests }}\n    runs-on: ubuntu-24.04\n    steps:\n      - name: Merge results\n        id: hash\n        env:\n          LINUXGCC_DIGESTS: \"${{ needs.build-linux.outputs.digests-gcc }}\"\n          LINUXCLANG_DIGESTS: \"${{ needs.build-linux.outputs.digests-clang }}\"\n          MAC_DIGESTS: \"${{ needs.build-mac-universal.outputs.digests }}\"\n          MACINTEL_DIGESTS: \"${{ needs.build-mac-intel.outputs.digests }}\"\n          WINDOWS_DIGESTS: \"${{ needs.build-windows.outputs.digests }}\"\n        run: |\n          set -euo pipefail\n          echo \"$LINUXGCC_DIGESTS\" | base64 -d > checksums.txt\n          echo \"$LINUXCLANG_DIGESTS\" | base64 -d >> checksums.txt\n          echo \"$MAC_DIGESTS\" | base64 -d >> checksums.txt\n          echo \"$MACINTEL_DIGESTS\" | base64 -d >> checksums.txt\n          echo \"$WINDOWS_DIGESTS\" | base64 -d >> checksums.txt\n          echo \"digests=$(cat checksums.txt | base64 -w0)\" >> $GITHUB_OUTPUT\n\n  provenance:\n    if: startsWith(github.ref, 'refs/tags/')\n    needs: [release-digests]\n    permissions:\n      actions: read   # To read the workflow path.\n      id-token: write # To sign the provenance.\n      contents: write # To add assets to a release.\n    uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v2.1.0\n    with:\n      base64-subjects: \"${{ needs.release-digests.outputs.digests }}\"\n      upload-assets: true # Optional: Upload to a new release\n"
  },
  {
    "path": ".github/workflows/docs.yml",
    "content": "name: docs\non:\n  # For manual pushes.\n  workflow_dispatch: \n\n  # Pushes to main that touch the documentation directory.\n  push:\n    branches:\n      - master\n    paths:\n      - 'docs/**'\n\npermissions:\n  contents: write\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n      - name: Configure Git Credentials\n        run: |\n          git config user.name github-actions[bot]\n          git config user.email 41898282+github-actions[bot]@users.noreply.github.com\n      - uses: actions/setup-python@v6\n        with:\n          python-version: 3.x\n      - run: echo \"cache_id=$(date --utc '+%V')\" >> $GITHUB_ENV \n      - uses: actions/cache@v5\n        with:\n          key: mkdocs-material-${{ env.cache_id }}\n          path: .cache\n          restore-keys: |\n            mkdocs-material-\n      - run: pip install mkdocs-material \n      - run: pip install mkdocs-redirects\n      - run: mkdocs gh-deploy --force -f docs/mkdocs.yml\n"
  },
  {
    "path": ".github/workflows/label.yml",
    "content": "# This workflow will triage pull requests and apply a label based on the\n# paths that are modified in the pull request.\n#\n# To use this workflow, you will need to set up a .github/labeler.yml\n# file with configuration.  For more information, see:\n# https://github.com/actions/labeler\n\nname: Labeler\npermissions: read-all\n\non: [pull_request_target]\n\njobs:\n  label:\n    permissions:\n      contents: read\n      pull-requests: write\n      \n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/labeler@v6\n      with:\n        repo-token: \"${{ secrets.GITHUB_TOKEN }}\"\n"
  },
  {
    "path": ".github/workflows/main.yml",
    "content": "name: OSS-Fuzz\npermissions: read-all\n\non:\n  pull_request:\n    branches:\n      - master\n    paths:\n      - include/**\n      - src/**\n      - tests/**.cpp\n      - tests/**.h\njobs:\n Fuzzing:\n   runs-on: ubuntu-latest\n   steps:\n   - name: Build Fuzzers\n     id: build\n     uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master\n     with:\n       oss-fuzz-project-name: 'flatbuffers'\n       language: c++\n   - name: Run Fuzzers\n     uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master\n     with:\n       oss-fuzz-project-name: 'flatbuffers'\n       language: c++\n       fuzz-seconds: 60\n   - name: Upload Crash\n     uses: actions/upload-artifact@v7\n     if: failure() && steps.build.outcome == 'success'\n     with:\n       name: artifacts\n       path: ./out/artifacts\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: Release\npermissions: read-all\n\non:\n  # For manual tests.\n  workflow_dispatch:\n  release:\n    types: [published]\n\njobs:\n  publish-npm:\n    name: Publish NPM\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n      - uses: actions/setup-node@v6\n        with:\n          node-version: '20.x'\n          registry-url: 'https://registry.npmjs.org'\n\n      - run: npm publish\n        env:\n          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}\n\n  publish-pypi:\n    name: Publish PyPi\n    runs-on: ubuntu-latest\n    defaults:\n      run:\n        working-directory: ./python\n    steps:\n      - uses: actions/checkout@v6\n      - uses: actions/setup-python@v6\n        with:\n          python-version: '3.10'\n\n      - name: Install Dependencies\n        run: |\n          python3 -m pip install --upgrade pip\n          python3 -m pip install build twine\n\n      - name: Build\n        run: |\n          python3 -m build .\n\n      - name: Upload to PyPi\n        run: |\n          python3 -m twine upload dist/*\n        env:\n          TWINE_USERNAME: __token__\n          TWINE_PASSWORD: ${{ secrets.TWINE_TOKEN }}\n\n  publish-nuget:\n    name: Publish NuGet\n    runs-on: windows-latest\n    defaults:\n      run:\n        working-directory: ./net/flatbuffers\n    steps:\n      - uses: actions/checkout@v6\n      - uses: actions/setup-dotnet@v5\n        with:\n          dotnet-version: '8.0.x'\n      - name: Build\n        run: |\n          dotnet build Google.FlatBuffers.csproj -c Release\n\n      - name: Pack\n        run: |\n          dotnet pack Google.FlatBuffers.csproj -c Release\n\n      - name: Upload to NuGet\n        run: |\n          dotnet nuget push .\\bin\\Release\\Google.FlatBuffers.*.nupkg -k ${{ secrets.NUGET_API_KEY }} -s https://api.nuget.org/v3/index.json\n\n  publish-maven:\n    name: Publish Maven\n    runs-on: ubuntu-latest\n    defaults:\n      run:\n        working-directory: ./java\n    steps:\n      - uses: actions/checkout@v6\n\n      - name: Set up Maven Central Repository\n        uses: actions/setup-java@v5\n        with:\n          java-version: '11'\n          distribution: 'adopt'\n          cache: 'maven'\n          server-id: ossrh\n          server-username: OSSRH_USERNAME\n          server-password: OSSRH_PASSWORD\n          gpg-private-key: ${{ secrets.MAVEN_GPG_PRIVATE_KEY }}\n          gpg-passphrase: MAVEN_GPG_PASSPHRASE # this needs to be an env var\n\n      - name: Publish Maven\n        run: mvn --batch-mode clean deploy\n        env:\n          OSSRH_USERNAME: ${{ secrets.OSSRH_USER_V2 }}\n          OSSRH_PASSWORD: ${{ secrets.OSSRH_TOKEN_V2 }}\n          MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }}\n          \n  publish-maven-kotlin:\n    name: Publish Maven - Kotlin\n    runs-on: ubuntu-latest\n    defaults:\n      run:\n        working-directory: ./kotlin\n    steps:\n      - uses: actions/checkout@v6\n      - name: Set up Maven Central Repository\n        uses: actions/setup-java@v5\n        with:\n          java-version: '11'\n          distribution: 'adopt'\n          cache: 'maven'\n          server-id: ossrh\n          server-username: OSSRH_USERNAME\n          server-password: OSSRH_PASSWORD\n          gpg-private-key: ${{ secrets.MAVEN_GPG_PRIVATE_KEY }}\n          gpg-passphrase: MAVEN_GPG_PASSPHRASE # this needs to be an env var\n\n      - name: Publish Kotlin Library on Maven\n        run: ./gradlew publishAllPublicationsToSonatypeRepository\n        env:\n          OSSRH_USERNAME: ${{ secrets.OSSRH_USER_V2 }}\n          OSSRH_PASSWORD: ${{ secrets.OSSRH_TOKEN_V2 }}\n          MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }}\n\n\n  publish-crates:\n    name: Publish crates.io\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n      - uses: actions-rs/toolchain@v1\n        with:\n          toolchain: stable\n          override: true\n          \n      - name: Publish Flatbuffers\n        uses: katyo/publish-crates@v2\n        with:\n          path: ./rust/flatbuffers\n          registry-token: ${{ secrets.CARGO_TOKEN }}\n\n      - name: Publish Flexbuffers\n        uses: katyo/publish-crates@v2\n        with:\n          path: ./rust/flexbuffers\n          registry-token: ${{ secrets.CARGO_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/stale.yml",
    "content": "name: Mark stale issues and pull requests\npermissions:\n  issues: write\n  pull-requests: write\n\non:\n  # For manual tests.\n  workflow_dispatch:\n  schedule:\n    - cron: \"30 20 * * *\"\n\njobs:\n  stale:\n\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/stale@v10\n      with:\n        repo-token: ${{ secrets.GITHUB_TOKEN }}\n        operations-per-run: 500\n        exempt-all-milestones: true\n        remove-stale-when-updated: true\n      \n        stale-issue-message: 'This issue is stale because it has been open 6 months with no activity. Please comment or label `not-stale`, or this will be closed in 14 days.'\n        close-issue-message: 'This issue was automatically closed due to no activity for 6 months plus the 14 day notice period.'\n        days-before-issue-stale: 182 # 6 months\n        days-before-issue-close: 14 # 2 weeks\n        exempt-issue-labels: not-stale\n        \n        stale-pr-message: 'This pull request is stale because it has been open 6 months with no activity. Please comment or label `not-stale`, or this will be closed in 14 days.'\n        close-pr-message: 'This pull request was automatically closed due to no activity for 6 months plus the 14 day notice period.'\n        days-before-pr-stale: 182 # 6 months\n        days-before-pr-close: 14 # 2 week\n        exempt-pr-labels: not-stale\n        exempt-draft-pr: false\n\n"
  },
  {
    "path": ".gitignore",
    "content": "*_wire.txt\n*_wire.bin\n.DS_Store\n**/.build\nbuild\n**/Packages\n/*.xcodeproj\n**/xcuserdata/\n**/xcshareddata/\n**/.swiftpm/\n*.o\n*.o.d\n*.class\n*.a\n*.swp\n*~\n*.vcxproj\n*.vcxproj.filters\n*.vcxproj.user\n*.sln\n*.suo\n*.opendb\n*.keystore\n**/.vs/**\n**/bin/**\n!tests/rust_usage_test/bin/**\n**/gen/**\n**/libs/**\n**/obj/**\n**/*.dir/**\n**/CMakeFiles/**\n**/cmake_install.cmake\n**/install_manifest.txt\n**/CMakeCache.txt\n**/CMakeTestfile.cmake\n**/CPackConfig.cmake\n**/CPackSourceConfig.cmake\n**/compile_commands.json\n**/Debug/**\n**/Release/**\n**/RelWithDebInfo/**\n**/x64/ #build artifacts from VS\nbuild.xml\nlocal.properties\nproject.properties\nproguard-project.txt\nlinklint_results\nMakefile\nflatbenchmark\nflatbenchmark.exe\nflatc\nflatc.exe\nflathash\nflathash.exe\nflattests\nflattests.exe\nflattests_cpp17\nflattests_cpp17.exe\nflatsamplebinary\nflatsamplebinary.exe\nflatsampletext\nflatsampletext.exe\nflatsamplebfbs\nflatsamplebfbs.exe\ngrpctest\ngrpctest.exe\nsnapshot.sh\ntags\ntests/dart_gen\ntests/go_gen\ntests/monsterdata_java_wire.mon\ntests/monsterdata_java_wire_sp.mon\ntests/monsterdata_go_wire.mon\ntests/monsterdata_javascript_wire.mon\ntests/monsterdata_lobster_wire.mon\ntests/monsterdata_rust_wire.mon\ntests/php/\nCMakeLists.txt.user\nCMakeScripts/**\nCTestTestfile.cmake\nflatbuffers-config-version.cmake\nFlatBuffers.cbp\nbuild/Xcode/FlatBuffers.xcodeproj/project.xcworkspace/**\nbuild/Xcode/FlatBuffers.xcodeproj/xcuserdata/**\nFlatBuffers.xcodeproj/\njava/.idea\njava/*.iml\n.idea\n*.iml\ntarget\njava/target\n**/*.pyc\nbuild/VS2010/FlatBuffers.sdf\nbuild/VS2010/FlatBuffers.opensdf\nbuild/VS2010/ipch/**/*.ipch\n*.so\nTesting/Temporary\n.cproject\n.settings/\n.project\nnet/**/obj\nnode_modules/\nandroid/.externalNativeBuild/\nandroid/.gradle/\nandroid/build/\nsamples/android/.externalNativeBuild/\nsamples/android/.gradle/\nsamples/android/build/\njs/**/*.js\njs/**/*.d.ts\nmjs/**/*.js\nmjs/**/*.d.ts\n/bazel-bin\n/bazel-flatbuffers\n/bazel-genfiles\n/bazel-out\n/bazel-testlogs\n.ninja_deps\n.ninja_log\nbuild.ninja\nrules.ninja\n.vscode\ndart/.pub/\ndart/.packages\ndart/pubspec.lock\ndart/.dart_tool/\ndart/build/\ndart/doc/api/\nCargo.lock\n.corpus**\n.seed**\n.crash**\ngrpc/google/\n**/Package.resolved\n.clangd/**\npackage-lock.json\n/*.ilk\n/*.pdb\n.clwb\nyarn-error.log\n.cache/\n/flatbuffers.lib\n.cmake/\n**/dist\n**/vendor\n**/go.sum\nflatbuffers.pc\n**/FlatBuffers.Test.Swift.xcodeproj\n**/html/**\n**/latex/**\n# https://cmake.org/cmake/help/latest/module/FetchContent.html#variable:FETCHCONTENT_BASE_DIR\ncmake-build-debug/\n_deps/\n**/.gradle/**\nkotlin/**/generated\nMODULE.bazel.lock\n\n# Ignore the generated docs\ndocs/site\n\n# Ignore generated files\n*.fbs.h\n"
  },
  {
    "path": ".npmrc",
    "content": "hoist=false\n"
  },
  {
    "path": "BUILD.bazel",
    "content": "load(\"@rules_cc//cc:defs.bzl\", \"cc_binary\", \"cc_library\")\n\nlicenses([\"notice\"])\n\npackage(\n    default_visibility = [\"//visibility:public\"],\n)\n\nexports_files([\n    \"LICENSE\",\n    \"tsconfig.json\",\n])\n\nconfig_setting(\n    name = \"platform_freebsd\",\n    constraint_values = [\n        \"@platforms//os:freebsd\",\n    ],\n)\n\nconfig_setting(\n    name = \"platform_openbsd\",\n    constraint_values = [\n        \"@platforms//os:openbsd\",\n    ],\n)\n\nfilegroup(\n    name = \"distribution\",\n    srcs = [\n        \".bazelignore\",\n        \".npmrc\",\n        \"BUILD.bazel\",\n        \"MODULE.bazel\",\n        \"build_defs.bzl\",\n        \"package.json\",\n        \"pnpm-lock.yaml\",\n        \"typescript.bzl\",\n        \"//grpc/src/compiler:distribution\",\n        \"//include/codegen:distribution\",\n        \"//reflection:distribution\",\n        \"//src:distribution\",\n        \"//ts:distribution\",\n    ] + glob([\n        \"include/flatbuffers/*.h\",\n    ]),\n    visibility = [\"//visibility:public\"],\n)\n\n# Public flatc library to compile flatbuffer files at runtime.\ncc_library(\n    name = \"flatbuffers\",\n    hdrs = [\"//:public_headers\"],\n    linkstatic = 1,\n    strip_include_prefix = \"/include\",\n    deps = [\"//src:flatbuffers\"],\n)\n\n# Public C++ headers for the Flatbuffers library.\nfilegroup(\n    name = \"public_headers\",\n    srcs = [\n        \"include/flatbuffers/allocator.h\",\n        \"include/flatbuffers/array.h\",\n        \"include/flatbuffers/base.h\",\n        \"include/flatbuffers/buffer.h\",\n        \"include/flatbuffers/buffer_ref.h\",\n        \"include/flatbuffers/code_generator.h\",\n        \"include/flatbuffers/code_generators.h\",\n        \"include/flatbuffers/default_allocator.h\",\n        \"include/flatbuffers/detached_buffer.h\",\n        \"include/flatbuffers/file_manager.h\",\n        \"include/flatbuffers/flatbuffer_builder.h\",\n        \"include/flatbuffers/flatbuffers.h\",\n        \"include/flatbuffers/flex_flat_util.h\",\n        \"include/flatbuffers/flexbuffers.h\",\n        \"include/flatbuffers/grpc.h\",\n        \"include/flatbuffers/hash.h\",\n        \"include/flatbuffers/idl.h\",\n        \"include/flatbuffers/minireflect.h\",\n        \"include/flatbuffers/reflection.h\",\n        \"include/flatbuffers/reflection_generated.h\",\n        \"include/flatbuffers/registry.h\",\n        \"include/flatbuffers/stl_emulation.h\",\n        \"include/flatbuffers/string.h\",\n        \"include/flatbuffers/struct.h\",\n        \"include/flatbuffers/table.h\",\n        \"include/flatbuffers/util.h\",\n        \"include/flatbuffers/vector.h\",\n        \"include/flatbuffers/vector_downward.h\",\n        \"include/flatbuffers/verifier.h\",\n    ],\n)\n\n# Public flatc compiler library.\ncc_library(\n    name = \"flatc_library\",\n    linkstatic = 1,\n    deps = [\n        \"//src:flatc_library\",\n    ],\n)\n\n# Public flatc compiler.\ncc_binary(\n    name = \"flatc\",\n    data = [\"//reflection:reflection_fbs_schema\"],\n    deps = [\n        \"//src:flatc\",\n    ],\n)\n\nfilegroup(\n    name = \"flatc_headers\",\n    srcs = [\n        \"include/flatbuffers/flatc.h\",\n    ],\n    visibility = [\"//:__subpackages__\"],\n)\n\n# Library used by flatbuffer_cc_library rules.\ncc_library(\n    name = \"runtime_cc\",\n    hdrs = [\"//:public_headers\"],\n    linkstatic = 1,\n    strip_include_prefix = \"/include\",\n)\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Flatbuffers Change Log\n\nAll major or breaking changes will be documented in this file, as well as any\nnew features that should be highlighted. Minor fixes or improvements are not\nnecessarily listed.\n\n## [25.12.19] (December 19 2025)(https://github.com/google/flatbuffers/releases/tag/v25.12.19)\n\n* [C++] Default emptry vector support (#8870)\n* [C++] Add --gen-absl-hash option (#8868)\n* [Kotlin] Upgrade to MacOS 15 (#8845)\n* [C++] Fix vector of table with naked ptrs (#8830)\n* [Python] Optimize Offset/Pad/Prep (#8808)\n* Implement `--file-names-only` (#8788)\n* [C++] Fix size verifer (#8740)\n\n## [25.9.23] (September 23 2025)(https://github.com/google/flatbuffers/releases/tag/v25.9.23)\n\n* flatc: `--grpc-callback-api` flag generates C++ gRPC Callback API server `CallbackService` skeletons AND client native callback/async stubs (unary + all streaming reactor forms) (opt-in, non-breaking, issue #8596).\n* Swift - Adds new API to reduce memory copying within swift (#8484)\n* Rust - Support Rust edition 2024 (#8638)\n* [C++] - Use the Google Style for clang-format without exceptions (#8706)\n\n## [25.2.10] (February 10 2025)(https://github.com/google/flatbuffers/releases/tag/v25.2.10)\n\n* Removed the old documentation pages. The new one is live at https://flatbuffers.dev\n* Swift version 6.0 support (#8414)\n\n## [25.1.24] (January 24 2025)(https://github.com/google/flatbuffers/releases/tag/v25.1.24)\n\n* Mostly related to bazel build support.\n* Min bazel supported is now 7 or higher, as WORKSPACE files are removed (#8509)\n* Minor C++ codegen fix removing extra semicolon (#8488)\n\n## [25.1.21] (January 21 2025)(https://github.com/google/flatbuffers/releases/tag/v25.1.21)\n\n* Rust Full Reflection (#8102)\n* Mostly documentation updates hosted at https://flatbuffers.dev\n\n## [24.3.25] (March 25 2024)(https://github.com/google/flatbuffers/releases/tag/v24.3.25)\n\n* Fixed license metadata parsing (#8253)\n* [C++] Allow string_view in `LookUpByKey` in addition to null-terminated c-style strings (#8203)\n\n## [24.3.7] (March 7 2024)(https://github.com/google/flatbuffers/releases/tag/v24.3.7)\n\n* Just to fix some of the CI build issues from the 24.3.6 release.\n\n## [24.3.6] (March 6 2024)(https://github.com/google/flatbuffers/releases/tag/v24.3.6)\n\n* Fix typescript object API to allow 0 values for null-default scalars (#7864)\n\n## [23.5.26 (May 26 2023)](https://github.com/google/flatbuffers/releases/tag/v23.5.26)\n\n* Mostly bug fixing for 64-bit support\n* Adds support for specifying underling type of unions in C++ and TS/JS (#7954)\n\n## [23.5.9 (May 9 2023)](https://github.com/google/flatbuffers/releases/tag/v23.5.9)\n\n* 64-bit support for C++ (#7935)\n\n## [23.5.8 (May 8 2023)](https://github.com/google/flatbuffers/releases/tag/v23.5.8)\n\n* add key_field to compiled tests\n* Add golden language directory\n* Rework cmake flatc codegeneration (#7938)\n* remove defining generated files in test srcs\n* Add binary schema reflection (#7932)\n* Migrate from rules_nodejs to rules_js/rules_ts (take 2) (#7928)\n* `flat_buffers.dart`: mark const variable finals for internal Dart linters\n* fixed some windows warnings (#7929)\n* inject no long for FBS generation to remove logs in flattests (#7926)\n* Revert \"Migrate from rules_nodejs to rules_js/rules_ts (#7923)\" (#7927)\n* Migrate from rules_nodejs to rules_js/rules_ts (#7923)\n* Only generate @kotlin.ExperimentalUnsigned annotation on create*Vector methods having an unsigned array type parameter. (#7881)\n* additional check for absl::string_view availability (#7897)\n* Optionally generate Python type annotations (#7858)\n* Replace deprecated command with environment file (#7921)\n* drop glibc from runtime dependencies (#7906)\n* Make JSON supporting advanced union features (#7869)\n* Allow to use functions from `BuildFlatBuffers.cmake` from a flatbuffers installation installed with CMake. (#7912)\n* TS/JS: Use TypeError instead of Error when appropriate (#7910)\n* Go: make generated code more compliant to \"go fmt\" (#7907)\n* Support file_identifier in Go (#7904)\n* Optionally generate type prefixes and suffixes for python code (#7857)\n* Go: add test for FinishWithFileIdentifier (#7905)\n* Fix go_sample.sh (#7903)\n* [TS/JS] Upgrade dependencies (#7889)\n* Add a FileWriter interface (#7821)\n* TS/JS: Use minvalue from enum if not found (#7888)\n* [CS] Verifier (#7850)\n* README.md: PyPI case typo (#7880)\n* Update go documentation link to point to root module (#7879)\n* use Bool for flatbuffers bool instead of Byte (#7876)\n* fix using null string in vector (#7872)\n* Add `flatbuffers-64` branch to CI for pushes\n* made changes to the rust docs so they would compile. new_with_capacity is deprecated should use with_capacity, get_root_as_monster should be root_as_monster (#7871)\n* Adding comment for code clarification (#7856)\n* ToCamelCase() when kLowerCamel now converts first char to lower. (#7838)\n* Fix help output for --java-checkerframework (#7854)\n* Update filename to README.md and improve formatting (#7855)\n* Update stale.yml\n* Updated remaining usages of LICENSE.txt\n\n## [23.3.3 (Mar 3 2023)](https://github.com/google/flatbuffers/releases/tag/v23.3.3)\n\n* Refactoring of `flatc` generators to use an interface (#7797).\n\n* Removed legacy cmake support and set min to 3.8 (#7801).\n\n## [23.1.21 (Jan 21 2023)](https://github.com/google/flatbuffers/releases/tag/v23.1.20)\n\n* Reworked entry points for Typescript/Javascript and compatibility for single\n  file build (#7510)\n\n## [23.1.20 (Jan 20 2023)](https://github.com/google/flatbuffers/releases/tag/v23.1.20)\n\n* Removed go.mod files after some versioning issues were being report (#7780).\n\n## [23.1.4 (Jan 4 2023)](https://github.com/google/flatbuffers/releases/tag/v23.1.4)\n\n* Major release! Just kidding, we are continuing the\n  [versioning scheme](https://github.com/google/flatbuffers/wiki/Versioning) of\n  using a date to signify releases. This results in the first release of the new\n  year to bump the tradition major version field.\n\n* Go minimum version is now 1.19 (#7720) with the addition of Go modules.\n\n* Added CI support for Big Endian regression testing (#7707).\n\n* Fixed `getFullyQualifiedName` in typescript to return name delimited by '.'\n  instead of '_' (#7730).\n\n* Fixed the versioning scheme to not include leading zeros which are not\n  consistently handled by every package manager. Only the last release\n  (12.12.06) should have suffered from this.\n\n## [22.12.06 (Dec 06 2022)](https://github.com/google/flatbuffers/releases/tag/v22.12.06)\n\n* Bug fixing release, no major changes.\n\n## [22.10.25 (Oct 25 2022)](https://github.com/google/flatbuffers/releases/tag/v22.10.25)\n\n* Added Nim language support with generator and runtime libraries (#7534).\n\n## [22.9.29 (Sept 29 2022)](https://github.com/google/flatbuffers/releases/tag/v22.9.29)\n\n* Rust soundness fixes to avoid the crate from bing labelled unsafe (#7518).\n\n## [22.9.24 (Sept 24 2022)](https://github.com/google/flatbuffers/releases/tag/v22.9.24)\n\n* 20 Major releases in a row? Nope, we switched to a new\n  [versioning scheme](https://github.com/google/flatbuffers/wiki/Versioning)\n  that is based on date.\n\n* Python supports fixed size arrays now (#7529).\n\n* Behavior change in how C++ object API uses `UnPackTo`. The original intent of\n  this was to reduce allocations by reusing an existing object to pack data\n  into. At some point, this logic started to merge the states of the two objects\n  instead of clearing the state of the packee. This change goes back to the\n  original intention, the packed object is cleared when getting data packed into\n  it (#7527).\n\n* Fixed a bug in C++ alignment that was using `sizeof()` instead of the intended\n  `AlignOf()` for structs (#7520).\n\n* C# has an\n  [official Nuget package](https://www.nuget.org/packages/Google.FlatBuffers)\n  now (#7496).\n\n## 2.0.8 (Aug 29 2022)\n\n* Fix for `--keep-prefix` the was generating the wrong include statements for\n  C++ (#7469). The bug was introduced in 2.0.7.\n\n* Added the `Verifier::Options` option struct to allow specifying runtime\n  configuration settings for the verifier (#7489). This allows to skip verifying\n  nested flatbuffers, a on-by-default change that was introduced in 2.0.7. This\n  deprecates the existing `Verifier` constructor, which may be removed in a\n  future version.\n\n* Refactor of `tests/test.cpp` that lead to ~10% speedup in compilation of the\n  entire project (#7487).\n\n## 2.0.7 (Aug 22 2022)\n\n* This is the first version with an explicit change log, so all the previous\n  features will not be listed.\n\n* Verifier now checks that buffers are at least the minimum size required to be\n  a flatbuffers (12 bytes). This includes nested flatbuffers, which previously\n  could be declared valid at size 0.\n\n* Annotated binaries. Given a flatbuffer binary and a schema (or binary schema)\n  one can generate an annotated flatbuffer (.afb) to describe each byte in the\n  binary with schema metadata and value.\n\n* First binary schema generator (Lua) to generate Lua code via a .bfbs file.\n  This is mostly an implementation detail of flatc internals, but will be slowly\n  applied to the other language generators.\n"
  },
  {
    "path": "CMake/BuildFlatBuffers.cmake",
    "content": "# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# General function to create FlatBuffer build rules for the given list of\n# schemas.\n#\n# flatbuffers_schemas: A list of flatbuffer schema files to process.\n#\n# schema_include_dirs: A list of schema file include directories, which will be\n# passed to flatc via the -I parameter.\n#\n# custom_target_name: The generated files will be added as dependencies for a\n# new custom target with this name. You should add that target as a dependency\n# for your main target to ensure these files are built. You can also retrieve\n# various properties from this target, such as GENERATED_INCLUDES_DIR,\n# BINARY_SCHEMAS_DIR, and COPY_TEXT_SCHEMAS_DIR.\n#\n# additional_dependencies: A list of additional dependencies that you'd like\n# all generated files to depend on. Pass in a blank string if you have none.\n#\n# generated_includes_dir: Where to generate the C++ header files for these\n# schemas. The generated includes directory will automatically be added to\n# CMake's include directories, and will be where generated header files are\n# placed. This parameter is optional; pass in empty string if you don't want to\n# generate include files for these schemas.\n#\n# binary_schemas_dir: If you specify an optional binary schema directory, binary\n# schemas will be generated for these schemas as well, and placed into the given\n# directory.\n#\n# copy_text_schemas_dir: If you want all text schemas (including schemas from\n# all schema include directories) copied into a directory (for example, if you\n# need them within your project to build JSON files), you can specify that\n# folder here. All text schemas will be copied to that folder.\n#\n# IMPORTANT: Make sure you quote all list arguments you pass to this function!\n# Otherwise CMake will only pass in the first element.\n# Example: build_flatbuffers(\"${fb_files}\" \"${include_dirs}\" target_name ...)\nfunction(build_flatbuffers flatbuffers_schemas\n                           schema_include_dirs\n                           custom_target_name\n                           additional_dependencies\n                           generated_includes_dir\n                           binary_schemas_dir\n                           copy_text_schemas_dir)\n\n  # Test if including from FindFlatBuffers\n  if(FLATBUFFERS_FLATC_EXECUTABLE)\n    set(FLATC_TARGET \"\")\n    set(FLATC ${FLATBUFFERS_FLATC_EXECUTABLE})\n  elseif(TARGET flatbuffers::flatc)\n    set(FLATC_TARGET flatbuffers::flatc)\n    set(FLATC flatbuffers::flatc)\n  else()\n    set(FLATC_TARGET flatc)\n    set(FLATC flatc)\n  endif()\n  set(FLATC_SCHEMA_ARGS --gen-mutable)\n  if(FLATBUFFERS_FLATC_SCHEMA_EXTRA_ARGS)\n    set(FLATC_SCHEMA_ARGS\n      ${FLATBUFFERS_FLATC_SCHEMA_EXTRA_ARGS}\n      ${FLATC_SCHEMA_ARGS}\n      )\n  endif()\n\n  set(working_dir \"${CMAKE_CURRENT_SOURCE_DIR}\")\n\n  set(schema_glob \"*.fbs\")\n  # Generate the include files parameters.\n  set(include_params \"\")\n  set(all_generated_files \"\")\n  foreach (include_dir ${schema_include_dirs})\n    set(include_params -I ${include_dir} ${include_params})\n    if (NOT ${copy_text_schemas_dir} STREQUAL \"\")\n      # Copy text schemas from dependent folders.\n      file(GLOB_RECURSE dependent_schemas ${include_dir}/${schema_glob})\n      foreach (dependent_schema ${dependent_schemas})\n        file(COPY ${dependent_schema} DESTINATION ${copy_text_schemas_dir})\n      endforeach()\n    endif()\n  endforeach()\n\n  foreach(schema ${flatbuffers_schemas})\n    get_filename_component(filename ${schema} NAME_WE)\n    # For each schema, do the things we requested.\n    if (NOT ${generated_includes_dir} STREQUAL \"\")\n      set(generated_include ${generated_includes_dir}/${filename}_generated.h)\n      add_custom_command(\n        OUTPUT ${generated_include}\n        COMMAND ${FLATC} ${FLATC_SCHEMA_ARGS}\n        -o ${generated_includes_dir}\n        ${include_params}\n        -c ${schema}\n        DEPENDS ${FLATC_TARGET} ${schema} ${additional_dependencies}\n        WORKING_DIRECTORY \"${working_dir}\")\n      list(APPEND all_generated_files ${generated_include})\n    endif()\n\n    if (NOT ${binary_schemas_dir} STREQUAL \"\")\n      set(binary_schema ${binary_schemas_dir}/${filename}.bfbs)\n      add_custom_command(\n        OUTPUT ${binary_schema}\n        COMMAND ${FLATC} -b --schema\n        -o ${binary_schemas_dir}\n        ${include_params}\n        ${schema}\n        DEPENDS ${FLATC_TARGET} ${schema} ${additional_dependencies}\n        WORKING_DIRECTORY \"${working_dir}\")\n      list(APPEND all_generated_files ${binary_schema})\n    endif()\n\n    if (NOT ${copy_text_schemas_dir} STREQUAL \"\")\n      file(COPY ${schema} DESTINATION ${copy_text_schemas_dir})\n    endif()\n  endforeach()\n\n  # Create a custom target that depends on all the generated files.\n  # This is the target that you can depend on to trigger all these\n  # to be built.\n  add_custom_target(${custom_target_name}\n                    DEPENDS ${all_generated_files} ${additional_dependencies})\n\n  # Register the include directory we are using.\n  if (NOT ${generated_includes_dir} STREQUAL \"\")\n    include_directories(${generated_includes_dir})\n    set_property(TARGET ${custom_target_name}\n      PROPERTY GENERATED_INCLUDES_DIR\n      ${generated_includes_dir})\n  endif()\n\n  # Register the binary schemas dir we are using.\n  if (NOT ${binary_schemas_dir} STREQUAL \"\")\n    set_property(TARGET ${custom_target_name}\n      PROPERTY BINARY_SCHEMAS_DIR\n      ${binary_schemas_dir})\n  endif()\n\n  # Register the text schema copy dir we are using.\n  if (NOT ${copy_text_schemas_dir} STREQUAL \"\")\n    set_property(TARGET ${custom_target_name}\n      PROPERTY COPY_TEXT_SCHEMAS_DIR\n      ${copy_text_schemas_dir})\n  endif()\nendfunction()\n\n# Creates a target that can be linked against that generates flatbuffer headers.\n#\n# This function takes a target name and a list of schemas. You can also specify\n# other flagc flags using the FLAGS option to change the behavior of the flatc\n# tool.\n#\n# When the target_link_libraries is done within a different directory than\n# flatbuffers_generate_headers is called, then the target should also be dependent\n# the custom generation target called GENERATE_<TARGET>.\n#\n# Arguments:\n#   TARGET: The name of the target to generate.\n#   SCHEMAS: The list of schema files to generate code for.\n#   BINARY_SCHEMAS_DIR: Optional. The directory in which to generate binary\n#       schemas. Binary schemas will only be generated if a path is provided.\n#   INCLUDE: Optional. Search for includes in the specified paths. (Use this\n#       instead of \"-I <path>\" and the FLAGS option so that CMake is aware of\n#       the directories that need to be searched).\n#   INCLUDE_PREFIX: Optional. The directory in which to place the generated\n#       files. Use this instead of the --include-prefix option.\n#   FLAGS: Optional. A list of any additional flags that you would like to pass\n#       to flatc.\n#\n# Example:\n#\n#     flatbuffers_generate_headers(\n#         TARGET my_generated_headers_target\n#         INCLUDE_PREFIX ${MY_INCLUDE_PREFIX}\"\n#         SCHEMAS ${MY_SCHEMA_FILES}\n#         BINARY_SCHEMAS_DIR \"${MY_BINARY_SCHEMA_DIRECTORY}\"\n#         FLAGS --gen-object-api)\n#\n#     target_link_libraries(MyExecutableTarget\n#         PRIVATE my_generated_headers_target\n#     )\n#\n# Optional (only needed within different directory):\n#     add_dependencies(app GENERATE_my_generated_headers_target)\nfunction(flatbuffers_generate_headers)\n  # Parse function arguments.\n  set(options)\n  set(one_value_args\n    \"TARGET\"\n    \"INCLUDE_PREFIX\"\n    \"BINARY_SCHEMAS_DIR\")\n  set(multi_value_args\n    \"SCHEMAS\"\n    \"INCLUDE\"\n    \"FLAGS\")\n  cmake_parse_arguments(\n    PARSE_ARGV 0\n    FLATBUFFERS_GENERATE_HEADERS\n    \"${options}\"\n    \"${one_value_args}\"\n    \"${multi_value_args}\")\n\n  # Test if including from FindFlatBuffers\n  if(FLATBUFFERS_FLATC_EXECUTABLE)\n    set(FLATC_TARGET \"\")\n    set(FLATC ${FLATBUFFERS_FLATC_EXECUTABLE})\n  elseif(TARGET flatbuffers::flatc)\n    set(FLATC_TARGET flatbuffers::flatc)\n    set(FLATC flatbuffers::flatc)\n  else()\n    set(FLATC_TARGET flatc)\n    set(FLATC flatc)\n  endif()\n\n  set(working_dir \"${CMAKE_CURRENT_SOURCE_DIR}\")\n\n  # Generate the include files parameters.\n  set(include_params \"\")\n  foreach (include_dir ${FLATBUFFERS_GENERATE_HEADERS_INCLUDE})\n    set(include_params -I ${include_dir} ${include_params})\n  endforeach()\n\n  # Create a directory to place the generated code.\n  set(generated_target_dir \"${CMAKE_CURRENT_BINARY_DIR}/${FLATBUFFERS_GENERATE_HEADERS_TARGET}\")\n  set(generated_include_dir \"${generated_target_dir}\")\n  if (NOT ${FLATBUFFERS_GENERATE_HEADERS_INCLUDE_PREFIX} STREQUAL \"\")\n    set(generated_include_dir \"${generated_include_dir}/${FLATBUFFERS_GENERATE_HEADERS_INCLUDE_PREFIX}\")\n    list(APPEND FLATBUFFERS_GENERATE_HEADERS_FLAGS \n         \"--include-prefix\" ${FLATBUFFERS_GENERATE_HEADERS_INCLUDE_PREFIX})\n  endif()\n\n  set(generated_custom_commands)\n\n  # Create rules to generate the code for each schema.\n  foreach(schema ${FLATBUFFERS_GENERATE_HEADERS_SCHEMAS})\n    get_filename_component(filename ${schema} NAME_WE)\n    set(generated_include \"${generated_include_dir}/${filename}_generated.h\")\n\n    # Generate files for grpc if needed\n    set(generated_source_file)\n    if(\"${FLATBUFFERS_GENERATE_HEADERS_FLAGS}\" MATCHES \"--grpc\")\n      # Check if schema file contain a rpc_service definition\n      file(STRINGS ${schema} has_grpc REGEX \"rpc_service\")\n      if(has_grpc)\n        list(APPEND generated_include \"${generated_include_dir}/${filename}.grpc.fb.h\")\n        set(generated_source_file \"${generated_include_dir}/${filename}.grpc.fb.cc\")\n      endif()\n    endif()\n\n    add_custom_command(\n      OUTPUT ${generated_include} ${generated_source_file}\n      COMMAND ${FLATC} ${FLATC_ARGS}\n      -o ${generated_include_dir}\n      ${include_params}\n      -c ${schema}\n      ${FLATBUFFERS_GENERATE_HEADERS_FLAGS}\n      DEPENDS ${FLATC_TARGET} ${schema}\n      WORKING_DIRECTORY \"${working_dir}\"\n      COMMENT \"Building ${schema} flatbuffers...\")\n    list(APPEND all_generated_header_files ${generated_include})\n    list(APPEND all_generated_source_files ${generated_source_file})\n    list(APPEND generated_custom_commands \"${generated_include}\" \"${generated_source_file}\")\n\n    # Geneate the binary flatbuffers schemas if instructed to.\n    if (NOT ${FLATBUFFERS_GENERATE_HEADERS_BINARY_SCHEMAS_DIR} STREQUAL \"\")\n      set(binary_schema\n          \"${FLATBUFFERS_GENERATE_HEADERS_BINARY_SCHEMAS_DIR}/${filename}.bfbs\")\n      add_custom_command(\n        OUTPUT ${binary_schema}\n        COMMAND ${FLATC} -b --schema\n        -o ${FLATBUFFERS_GENERATE_HEADERS_BINARY_SCHEMAS_DIR}\n        ${include_params}\n        ${schema}\n        DEPENDS ${FLATC_TARGET} ${schema}\n        WORKING_DIRECTORY \"${working_dir}\")\n      list(APPEND generated_custom_commands \"${binary_schema}\")\n      list(APPEND all_generated_binary_files ${binary_schema})\n    endif()\n  endforeach()\n\n  # Create an additional target as add_custom_command scope is only within same directory (CMakeFile.txt)\n  set(generate_target GENERATE_${FLATBUFFERS_GENERATE_HEADERS_TARGET})\n  add_custom_target(${generate_target} ALL\n                    DEPENDS ${generated_custom_commands}\n                    COMMENT \"Generating flatbuffer target ${FLATBUFFERS_GENERATE_HEADERS_TARGET}\")\n\n  # Set up interface library\n  add_library(${FLATBUFFERS_GENERATE_HEADERS_TARGET} INTERFACE)\n  target_sources(\n    ${FLATBUFFERS_GENERATE_HEADERS_TARGET}\n    INTERFACE\n      ${all_generated_header_files}\n      ${all_generated_binary_files}\n      ${all_generated_source_files}\n      ${FLATBUFFERS_GENERATE_HEADERS_SCHEMAS})\n  add_dependencies(\n    ${FLATBUFFERS_GENERATE_HEADERS_TARGET}\n    ${FLATC_TARGET})\n  target_include_directories(\n    ${FLATBUFFERS_GENERATE_HEADERS_TARGET}\n    INTERFACE ${generated_target_dir})\n\n  # Organize file layout for IDEs.\n  source_group(\n    TREE \"${generated_target_dir}\"\n    PREFIX \"Flatbuffers/Generated/Headers Files\"\n    FILES ${all_generated_header_files})\n  source_group(\n    TREE \"${generated_target_dir}\"\n    PREFIX \"Flatbuffers/Generated/Source Files\"\n    FILES ${all_generated_source_files})\n  source_group(\n    TREE ${working_dir}\n    PREFIX \"Flatbuffers/Schemas\"\n    FILES ${FLATBUFFERS_GENERATE_HEADERS_SCHEMAS})\n  if (NOT ${FLATBUFFERS_GENERATE_HEADERS_BINARY_SCHEMAS_DIR} STREQUAL \"\")\n    source_group(\n      TREE \"${FLATBUFFERS_GENERATE_HEADERS_BINARY_SCHEMAS_DIR}\"\n      PREFIX \"Flatbuffers/Generated/Binary Schemas\"\n      FILES ${all_generated_binary_files})\n  endif()\nendfunction()\n\n# Creates a target that can be linked against that generates flatbuffer binaries\n# from json files.\n#\n# This function takes a target name and a list of schemas and Json files. You\n# can also specify other flagc flags and options to change the behavior of the\n# flatc compiler.\n#\n# Adding this target to your executable ensurses that the flatbuffer binaries\n# are compiled before your executable is run.\n#\n# Arguments:\n#   TARGET: The name of the target to generate.\n#   JSON_FILES: The list of json files to compile to flatbuffers binaries.\n#   SCHEMA: The flatbuffers schema of the Json files to be compiled.\n#   INCLUDE: Optional. Search for includes in the specified paths. (Use this \n#       instead of \"-I <path>\" and the FLAGS option so that CMake is aware of \n#       the directories that need to be searched).\n#   OUTPUT_DIR: The directly where the generated flatbuffers binaries should be\n#       placed.\n#   FLAGS: Optional. A list of any additional flags that you would like to pass\n#       to flatc.\n#\n# Example:\n#\n#     flatbuffers_generate_binary_files(\n#         TARGET my_binary_data\n#         SCHEMA \"${MY_SCHEMA_DIR}/my_example_schema.fbs\"\n#         JSON_FILES ${MY_JSON_FILES}\n#         OUTPUT_DIR \"${MY_BINARY_DATA_DIRECTORY}\"\n#         FLAGS --strict-json)\n#\n#     target_link_libraries(MyExecutableTarget\n#         PRIVATE my_binary_data\n#     )\nfunction(flatbuffers_generate_binary_files)\n  # Parse function arguments.\n  set(options)\n  set(one_value_args\n    \"TARGET\"\n    \"SCHEMA\"\n    \"OUTPUT_DIR\")\n  set(multi_value_args\n    \"JSON_FILES\"\n    \"INCLUDE\"\n    \"FLAGS\")\n  cmake_parse_arguments(\n    PARSE_ARGV 0\n    FLATBUFFERS_GENERATE_BINARY_FILES\n    \"${options}\"\n    \"${one_value_args}\"\n    \"${multi_value_args}\")\n\n  # Test if including from FindFlatBuffers\n  if(FLATBUFFERS_FLATC_EXECUTABLE)\n    set(FLATC_TARGET \"\")\n    set(FLATC ${FLATBUFFERS_FLATC_EXECUTABLE})\n  elseif(TARGET flatbuffers::flatc)\n    set(FLATC_TARGET flatbuffers::flatc)\n    set(FLATC flatbuffers::flatc)\n  else()\n    set(FLATC_TARGET flatc)\n    set(FLATC flatc)\n  endif()\n\n  set(working_dir \"${CMAKE_CURRENT_SOURCE_DIR}\")\n\n  # Generate the include files parameters.\n  set(include_params \"\")\n  foreach (include_dir ${FLATBUFFERS_GENERATE_BINARY_FILES_INCLUDE})\n    set(include_params -I ${include_dir} ${include_params})\n  endforeach()\n\n  # Create rules to generate the flatbuffers binary for each json file.\n  foreach(json_file ${FLATBUFFERS_GENERATE_BINARY_FILES_JSON_FILES})\n    get_filename_component(filename ${json_file} NAME_WE)\n    set(generated_binary_file \"${FLATBUFFERS_GENERATE_BINARY_FILES_OUTPUT_DIR}/${filename}.bin\")\n    add_custom_command(\n      OUTPUT ${generated_binary_file}\n      COMMAND ${FLATC} ${FLATC_ARGS}\n      -o ${FLATBUFFERS_GENERATE_BINARY_FILES_OUTPUT_DIR}\n      ${include_params}\n      -b ${FLATBUFFERS_GENERATE_BINARY_FILES_SCHEMA} ${json_file}\n      ${FLATBUFFERS_GENERATE_BINARY_FILES_FLAGS}\n      DEPENDS ${FLATC_TARGET} ${json_file}\n      WORKING_DIRECTORY \"${working_dir}\"\n      COMMENT \"Building ${json_file} binary flatbuffers...\")\n      list(APPEND all_generated_binary_files ${generated_binary_file})\n  endforeach()\n\n  # Set up interface library\n  add_library(${FLATBUFFERS_GENERATE_BINARY_FILES_TARGET} INTERFACE)\n  target_sources(\n    ${FLATBUFFERS_GENERATE_BINARY_FILES_TARGET}\n    INTERFACE\n      ${all_generated_binary_files}\n      ${FLATBUFFERS_GENERATE_BINARY_FILES_JSON_FILES}\n      ${FLATBUFFERS_GENERATE_BINARY_FILES_SCHEMA})\n  add_dependencies(\n    ${FLATBUFFERS_GENERATE_BINARY_FILES_TARGET}\n    ${FLATC})\n\n  # Organize file layout for IDEs.\n  source_group(\n    TREE ${working_dir}\n    PREFIX \"Flatbuffers/JSON Files\"\n    FILES ${FLATBUFFERS_GENERATE_BINARY_FILES_JSON_FILES})\n  source_group(\n    TREE ${working_dir}\n    PREFIX \"Flatbuffers/Schemas\"\n    FILES ${FLATBUFFERS_GENERATE_BINARY_FILES_SCHEMA})\n  source_group(\n    TREE ${FLATBUFFERS_GENERATE_BINARY_FILES_OUTPUT_DIR}\n    PREFIX \"Flatbuffers/Generated/Binary Files\"\n    FILES ${all_generated_binary_files})\nendfunction()\n"
  },
  {
    "path": "CMake/DESCRIPTION.txt",
    "content": "FlatBuffers is a cross platform serialization library architected for\nmaximum memory efficiency. It allows you to directly access serialized\ndata without parsing/unpacking it first, while still having great \nforwards/backwards compatibility.\n"
  },
  {
    "path": "CMake/FindFlatBuffers.cmake",
    "content": "# Copyright 2014 Stefan.Eilemann@epfl.ch\n# Copyright 2014 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Find the flatbuffers schema compiler\n#\n# Output Variables:\n# * FLATBUFFERS_FLATC_EXECUTABLE the flatc compiler executable\n# * FLATBUFFERS_FOUND\n#\n# Provides:\n# * FLATBUFFERS_GENERATE_C_HEADERS(Name <files>) creates the C++ headers\n#   for the given flatbuffer schema files.\n#   Returns the header files in ${Name}_OUTPUTS\n\nset(FLATBUFFERS_CMAKE_DIR ${CMAKE_CURRENT_LIST_DIR})\n\nfind_program(FLATBUFFERS_FLATC_EXECUTABLE NAMES flatc)\nfind_path(FLATBUFFERS_INCLUDE_DIR NAMES flatbuffers/flatbuffers.h)\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(FlatBuffers\n  DEFAULT_MSG FLATBUFFERS_FLATC_EXECUTABLE FLATBUFFERS_INCLUDE_DIR)\n\nif(FLATBUFFERS_FOUND)\n  function(FLATBUFFERS_GENERATE_C_HEADERS Name)\n    set(FLATC_OUTPUTS)\n    foreach(FILE ${ARGN})\n      get_filename_component(FLATC_OUTPUT ${FILE} NAME_WE)\n      set(FLATC_OUTPUT\n        \"${CMAKE_CURRENT_BINARY_DIR}/${FLATC_OUTPUT}_generated.h\")\n      list(APPEND FLATC_OUTPUTS ${FLATC_OUTPUT})\n\n      add_custom_command(OUTPUT ${FLATC_OUTPUT}\n        COMMAND ${FLATBUFFERS_FLATC_EXECUTABLE}\n        ARGS -c -o \"${CMAKE_CURRENT_BINARY_DIR}/\" ${FILE}\n        DEPENDS ${FILE}\n        COMMENT \"Building C++ header for ${FILE}\"\n        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})\n    endforeach()\n    set(${Name}_OUTPUTS ${FLATC_OUTPUTS} PARENT_SCOPE)\n  endfunction()\n\n  set(FLATBUFFERS_INCLUDE_DIRS ${FLATBUFFERS_INCLUDE_DIR})\n  include_directories(${CMAKE_BINARY_DIR})\nelse()\n  set(FLATBUFFERS_INCLUDE_DIR)\nendif()\n\ninclude(\"${FLATBUFFERS_CMAKE_DIR}/BuildFlatBuffers.cmake\")\n"
  },
  {
    "path": "CMake/PackageDebian.cmake",
    "content": "# ------------------- Debianization ---------------------\nif (UNIX)\n\n    # Set build environment\n    SET(CPACK_GENERATOR \"TGZ;DEB\")\n    SET(CPACK_SOURCE_TGZ \"ON\")\n\n    # Common package information\n    SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY\n        \"FlatBuffers is an efficient cross platform serialization library for C++, with support for Java, C# and Go. It was created at Google specifically for game development and other performance-critical applications.\")\n    SET(CPACK_DEBIAN_PACKAGE_HOMEPAGE \"https://github.com/google/flatbuffers\")\n    SET(CPACK_DEBIAN_PACKAGE_MAINTAINER \"Vitaly Isaev <vitalyisaev2@gmail.com>\")\n\n    SET(CPACK_PACKAGE_VERSION_MAJOR ${VERSION_MAJOR})\n    SET(CPACK_PACKAGE_VERSION_MINOR ${VERSION_MINOR})\n    SET(CPACK_PACKAGE_VERSION_PATCH ${VERSION_PATCH})\n    SET(CPACK_PACKAGE_VERSION \"${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-${VERSION_COMMIT}\")\n    SET(CPACK_DEBIAN_PACKAGE_VERSION \"${CPACK_PACKAGE_VERSION}\")\n\n    # Package name\n    SET(CPACK_DEBIAN_PACKAGE_NAME \"flatbuffers\")\n    SET(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_SOURCE_DIR}/LICENSE)\n    set(CPACK_DEBIAN_FILE_NAME \"DEB-DEFAULT\")\n\nendif(UNIX)\n"
  },
  {
    "path": "CMake/PackageRedhat.cmake",
    "content": "if (UNIX)\n    set(CPACK_GENERATOR \"RPM\")\n    set(CPACK_SOURCE_TGZ \"ON\")\n\n    set(CPACK_PACKAGE_DESCRIPTION_SUMMARY \"FlatBuffers serialization library and schema compiler.\")\n    \n    set(CPACK_RPM_PACKAGE_HOMEPAGE \"https://github.com/google/flatbuffers\")\n    set(CPACK_RPM_PACKAGE_MAINTAINER \"Marc Butler <mockbutler@gmail.com>\")\n\n    set(CPACK_PACKAGE_VERSION_MAJOR ${VERSION_MAJOR})\n    set(CPACK_PACKAGE_VERSION_MINOR ${VERSION_MINOR})\n    set(CPACK_PACKAGE_VERSION_PATCH ${VERSION_PATCH})\n    set(CPACK_PACKAGE_VERSION \"${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-${VERSION_COMMIT}\")\n    set(CPACK_RPM_PACKAGE_VERSION \"${CPACK_PACKAGE_VERSION}\")\n\n    set(CPACK_RPM_PACKAGE_NAME \"flatbuffers\")\n\n    # Assume this is not a cross compilation build.\n    if(NOT CPACK_RPM_PACKAGE_ARCHITECTURE)\n        set(CPACK_RPM_PACKAGE_ARCHITECTURE \"${CMAKE_SYSTEM_PROCESSOR}\")\n    endif(NOT CPACK_RPM_PACKAGE_ARCHITECTURE)\n\n    set(CPACK_RPM_PACKAGE_VENDOR \"Google, Inc.\")\n    set(CPACK_RPM_PACKAGE_LICENSE \"Apache 2.0\")\n    set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_SOURCE_DIR}/LICENSE)\n    set(CPACK_PACKAGE_DESCRIPTION_FILE ${CMAKE_SOURCE_DIR}/CMake/DESCRIPTION.txt)\n\n    # This may reduce rpm compatiblity with very old systems.\n    set(CPACK_RPM_COMPRESSION_TYPE lzma)\n    \n    set(CPACK_RPM_PACKAGE_NAME \"flatbuffers\")\n    set(CPACK_PACKAGE_FILE_NAME\n        \"${CPACK_RPM_PACKAGE_NAME}_${CPACK_RPM_PACKAGE_VERSION}_${CPACK_RPM_PACKAGE_ARCHITECTURE}\")\n    if(NOT DEFINED ${CPACK_PACKAGING_INSTALL_PREFIX})\n       # Default packaging install prefix on RedHat systems is /usr.\n       # This is the assumed value when this variable is not defined.\n       # There is currently a conflict with\n       # /usr/${CMAKE_INSTALL_LIBDIR}/cmake which is installed by default\n       # by other packages on RedHat (most notably cmake-filesystem). Ensure\n       # that on these systems, flatbuffers does not package this path.\n       # This patch is required for cmake pre-3.17.\n       list(APPEND CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION \"/usr/${CMAKE_INSTALL_LIBDIR}/cmake\")\n   endif()\nendif(UNIX)\n"
  },
  {
    "path": "CMake/Version.cmake",
    "content": "set(VERSION_MAJOR 25)\nset(VERSION_MINOR 12)\nset(VERSION_PATCH 19)\nset(VERSION_COMMIT 0)\n\nif(EXISTS \"${CMAKE_CURRENT_SOURCE_DIR}/.git\")\n  find_program(GIT git)\n  if(GIT)\n    execute_process(\n      COMMAND ${GIT} describe --tags\n      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}\n      OUTPUT_VARIABLE GIT_DESCRIBE_DIRTY\n      OUTPUT_STRIP_TRAILING_WHITESPACE\n      RESULT_VARIABLE GIT_DESCRIBE_RESULT\n    )\n\n    if(GIT_DESCRIBE_RESULT EQUAL 0)\n      # Test if the most recent Git tag matches the pattern \"v<major>.<minor>.<patch>*\"\n      if(GIT_DESCRIBE_DIRTY MATCHES \"^v[0-9]+\\\\.[0-9]+\\\\.[0-9]+.*\")\n        string(REGEX REPLACE \"^v([0-9]+)\\\\..*\" \"\\\\1\" VERSION_MAJOR \"${GIT_DESCRIBE_DIRTY}\")\n        string(REGEX REPLACE \"^v[0-9]+\\\\.([0-9]+).*\" \"\\\\1\" VERSION_MINOR \"${GIT_DESCRIBE_DIRTY}\")\n        string(REGEX REPLACE \"^v[0-9]+\\\\.[0-9]+\\\\.([0-9]+).*\" \"\\\\1\" VERSION_PATCH \"${GIT_DESCRIBE_DIRTY}\")\n        string(REGEX REPLACE \"^v[0-9]+\\\\.[0-9]+\\\\.[0-9]+\\\\-([0-9]+).*\" \"\\\\1\" VERSION_COMMIT \"${GIT_DESCRIBE_DIRTY}\")\n        # If the tag points to the commit, then only the tag is shown in \"git describe\"\n        if(VERSION_COMMIT STREQUAL GIT_DESCRIBE_DIRTY)\n          set(VERSION_COMMIT 0)\n        endif()\n      else()\n        message(WARNING \"\\\"${GIT_DESCRIBE_DIRTY}\\\" does not match pattern v<major>.<minor>.<patch>-<commit>\")\n      endif()\n    else()\n      message(WARNING \"git describe failed with exit code: ${GIT_DESCRIBE_RESULT}\\nMake sure you cloned with tags or run 'git fetch --tags'.\")\n    endif()\n  else()\n    message(WARNING \"git is not found\")\n  endif()\nendif()\n\nmessage(STATUS \"Proceeding with version: ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_COMMIT}\")\n"
  },
  {
    "path": "CMake/flatbuffers-config-version.cmake.in",
    "content": "set(PACKAGE_VERSION \"@VERSION_MAJOR@.@VERSION_MINOR@.@VERSION_PATCH@\")\n\n# Check whether the requested PACKAGE_FIND_VERSION is compatible\nif(\"${PACKAGE_VERSION}\" VERSION_LESS \"${PACKAGE_FIND_VERSION}\")\n  set(PACKAGE_VERSION_COMPATIBLE FALSE)\nelse()\n  set(PACKAGE_VERSION_COMPATIBLE TRUE)\n  if (\"${PACKAGE_VERSION}\" VERSION_EQUAL \"${PACKAGE_FIND_VERSION}\")\n    set(PACKAGE_VERSION_EXACT TRUE)\n  endif()\nendif()\n"
  },
  {
    "path": "CMake/flatbuffers-config.cmake",
    "content": "include(\"${CMAKE_CURRENT_LIST_DIR}/FlatBuffersTargets.cmake\" OPTIONAL)\ninclude(\"${CMAKE_CURRENT_LIST_DIR}/FlatcTargets.cmake\" OPTIONAL)\ninclude(\"${CMAKE_CURRENT_LIST_DIR}/FlatBuffersSharedTargets.cmake\" OPTIONAL)\ninclude(\"${CMAKE_CURRENT_LIST_DIR}/BuildFlatBuffers.cmake\" OPTIONAL)"
  },
  {
    "path": "CMake/flatbuffers.pc.in",
    "content": "libdir=@CMAKE_INSTALL_FULL_LIBDIR@\nincludedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@\n\nName: FlatBuffers\nDescription: Memory Efficient Serialization Library\nVersion: @VERSION_MAJOR@.@VERSION_MINOR@.@VERSION_PATCH@\n\nLibs: -L${libdir} -lflatbuffers\nCflags: -I${includedir}\n"
  },
  {
    "path": "CMakeLists.txt",
    "content": "# This is the legacy minimum version flatbuffers supported for a while.\ncmake_minimum_required(VERSION 3.8...3.25.2)\n\n# Attempt to read the current version of flatbuffers by looking at the latest tag.\ninclude(CMake/Version.cmake)\n\nproject(FlatBuffers\n        VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}\n        LANGUAGES CXX)\n\n# generate compile_commands.json\nset(CMAKE_EXPORT_COMPILE_COMMANDS ON)\n\n# NOTE: Code coverage only works on Linux & OSX.\noption(FLATBUFFERS_CODE_COVERAGE \"Enable the code coverage build option.\" OFF)\noption(FLATBUFFERS_BUILD_TESTS \"Enable the build of tests and samples.\" ON)\noption(FLATBUFFERS_INSTALL \"Enable the installation of targets.\" ON)\noption(FLATBUFFERS_BUILD_FLATLIB \"Enable the build of the flatbuffers library\"\n       ON)\noption(FLATBUFFERS_BUILD_FLATC \"Enable the build of the flatbuffers compiler\"\n       ON)\noption(FLATBUFFERS_STATIC_FLATC \"Build flatbuffers compiler with -static flag\"\n       OFF)\noption(FLATBUFFERS_BUILD_FLATHASH \"Enable the build of flathash\" OFF)\noption(FLATBUFFERS_BUILD_BENCHMARKS \"Enable the build of flatbenchmark.\"\n       OFF)\noption(FLATBUFFERS_BUILD_GRPCTEST \"Enable the build of grpctest\" OFF)\noption(FLATBUFFERS_BUILD_SHAREDLIB\n       \"Enable the build of the flatbuffers shared library\"\n       OFF)\noption(FLATBUFFERS_LIBCXX_WITH_CLANG \"Force libc++ when using Clang\" ON)\n# NOTE: Sanitizer check only works on Linux & OSX (gcc & llvm).\noption(FLATBUFFERS_CODE_SANITIZE\n      \"Add '-fsanitize' flags to 'flattests' and 'flatc' targets.\"\n      OFF)\noption(FLATBUFFERS_PACKAGE_REDHAT\n       \"Build an rpm using the 'package' target.\"\n       OFF)\noption(FLATBUFFERS_PACKAGE_DEBIAN\n       \"Build an deb using the 'package' target.\"\n       OFF)\noption(FLATBUFFERS_BUILD_CPP17\n       \"Enable the build of c++17 test target. \\\"\n       Requirements: Clang6, GCC7, MSVC2017 (_MSC_VER >= 1914)  or higher.\"\n       OFF)\noption(FLATBUFFERS_BUILD_LEGACY\n       \"Run C++ code generator with '--cpp-std c++0x' switch.\"\n       OFF)\noption(FLATBUFFERS_ENABLE_PCH\n       \"Enable precompile headers support for 'flatbuffers' and 'flatc'. \\\"\n        Only work if CMake supports 'target_precompile_headers'. \\\"\n        This can speed up compilation time.\"\n       OFF)\noption(FLATBUFFERS_SKIP_MONSTER_EXTRA\n      \"Skip generating monster_extra.fbs that contains non-supported numerical\\\"\n      types.\" OFF)\noption(FLATBUFFERS_STRICT_MODE\n      \"Build flatbuffers with all warnings as errors (-Werror or /WX).\"\n      OFF)\n\nif(NOT DEFINED FLATBUFFERS_CPP_STD)\n  set(FLATBUFFERS_CPP_STD 11)\nendif()\n\nset(MSVC_LIKE OFF)\nif(MSVC OR CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL \"MSVC\")\n    set(MSVC_LIKE ON)\nendif()\n\nif(CMAKE_CXX_COMPILER_ID MATCHES \"Clang\")\n  set(IS_CLANG ON)\nelse()\n  set(IS_CLANG OFF)\nendif()\n\nif(DEFINED FLATBUFFERS_COMPILATION_TIMINGS)\n  message(\"Recording Compilation Timings to ${FLATBUFFERS_COMPILATION_TIMINGS}\")\n  file(REMOVE ${FLATBUFFERS_COMPILATION_TIMINGS})\n  set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE \"time -f 'Wall: %E User: %U Sys: %S | %C' -q -a -o ${FLATBUFFERS_COMPILATION_TIMINGS}\")\n  set_property(GLOBAL PROPERTY RULE_LAUNCH_CUSTOM \"time -f 'Wall: %E User: %U Sys: %S | %C' -q -a -o ${FLATBUFFERS_COMPILATION_TIMINGS}\")\n  set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK \"time -f 'Wall: %E User: %U Sys: %S | %C' -q -a -o ${FLATBUFFERS_COMPILATION_TIMINGS}\")\nendif()\n\nif(NOT FLATBUFFERS_BUILD_FLATC AND FLATBUFFERS_BUILD_TESTS)\n    message(WARNING\n    \"Cannot build tests without building the compiler. Tests will be disabled.\")\n    set(FLATBUFFERS_BUILD_TESTS OFF)\nendif()\n\nif(DEFINED FLATBUFFERS_MAX_PARSING_DEPTH)\n  # Override the default recursion depth limit.\n  add_definitions(-DFLATBUFFERS_MAX_PARSING_DEPTH=${FLATBUFFERS_MAX_PARSING_DEPTH})\n  message(STATUS \"FLATBUFFERS_MAX_PARSING_DEPTH: ${FLATBUFFERS_MAX_PARSING_DEPTH}\")\nendif()\n\n# Auto-detect locale-narrow 'strtod_l' and  'strtoull_l' functions.\nif(NOT DEFINED FLATBUFFERS_LOCALE_INDEPENDENT)\n  include(CheckCXXSymbolExists)\n\n  set(FLATBUFFERS_LOCALE_INDEPENDENT 0)\n  if(MSVC_LIKE)\n    check_cxx_symbol_exists(_strtof_l stdlib.h FLATBUFFERS_HAS_STRTOF_L)\n    check_cxx_symbol_exists(_strtoui64_l stdlib.h FLATBUFFERS_HAS_STRTOULL_L)\n  else()\n    check_cxx_symbol_exists(strtof_l stdlib.h FLATBUFFERS_HAS_STRTOF_L)\n    check_cxx_symbol_exists(strtoull_l stdlib.h FLATBUFFERS_HAS_STRTOULL_L)\n  endif()\n  if(FLATBUFFERS_HAS_STRTOF_L AND FLATBUFFERS_HAS_STRTOULL_L)\n    set(FLATBUFFERS_LOCALE_INDEPENDENT 1)\n  endif()\nendif()\nadd_definitions(-DFLATBUFFERS_LOCALE_INDEPENDENT=$<BOOL:${FLATBUFFERS_LOCALE_INDEPENDENT}>)\n\nif(NOT WIN32)\n  include(CheckSymbolExists)\n  check_symbol_exists(realpath \"stdlib.h\" HAVE_REALPATH)\n  if(NOT HAVE_REALPATH)\n    add_definitions(-DFLATBUFFERS_NO_ABSOLUTE_PATH_RESOLUTION)\n  endif()\nendif()\n\nset(FlatBuffers_Library_SRCS\n  include/flatbuffers/allocator.h\n  include/flatbuffers/array.h\n  include/flatbuffers/base.h\n  include/flatbuffers/buffer.h\n  include/flatbuffers/buffer_ref.h\n  include/flatbuffers/default_allocator.h\n  include/flatbuffers/detached_buffer.h\n  include/flatbuffers/code_generator.h\n  include/flatbuffers/file_manager.h\n  include/flatbuffers/flatbuffer_builder.h\n  include/flatbuffers/flatbuffers.h\n  include/flatbuffers/flexbuffers.h\n  include/flatbuffers/flex_flat_util.h\n  include/flatbuffers/hash.h\n  include/flatbuffers/idl.h\n  include/flatbuffers/minireflect.h\n  include/flatbuffers/reflection.h\n  include/flatbuffers/reflection_generated.h\n  include/flatbuffers/registry.h\n  include/flatbuffers/stl_emulation.h\n  include/flatbuffers/string.h\n  include/flatbuffers/struct.h\n  include/flatbuffers/table.h\n  include/flatbuffers/util.h\n  include/flatbuffers/vector.h\n  include/flatbuffers/vector_downward.h\n  include/flatbuffers/verifier.h\n  src/file_manager.cpp\n  src/file_name_manager.cpp\n  src/idl_parser.cpp\n  src/idl_gen_text.cpp\n  src/reflection.cpp\n  src/util.cpp\n)\n\nset(FlatBuffers_Compiler_SRCS\n  ${FlatBuffers_Library_SRCS}\n  src/idl_gen_binary.cpp\n  src/idl_gen_text.cpp\n  src/idl_gen_cpp.cpp\n  src/idl_gen_csharp.cpp\n  src/idl_gen_dart.cpp\n  src/idl_gen_kotlin.cpp\n  src/idl_gen_kotlin_kmp.cpp\n  src/idl_gen_go.cpp\n  src/idl_gen_java.cpp\n  src/idl_gen_ts.cpp\n  src/idl_gen_php.cpp\n  src/idl_gen_python.cpp\n  src/idl_gen_lobster.cpp\n  src/idl_gen_rust.cpp\n  src/idl_gen_fbs.cpp\n  src/idl_gen_grpc.cpp\n  src/idl_gen_json_schema.cpp\n  src/idl_gen_swift.cpp\n  src/idl_namer.h\n  src/namer.h\n  src/flatc.cpp\n  src/flatc_main.cpp\n  src/bfbs_gen.h\n  src/bfbs_gen_lua.h\n  src/bfbs_gen_nim.h\n  src/bfbs_namer.h\n  include/codegen/idl_namer.h\n  include/codegen/namer.h\n  include/codegen/python.h\n  include/codegen/python.cc\n  include/flatbuffers/code_generators.h\n  src/binary_annotator.h\n  src/binary_annotator.cpp\n  src/annotated_binary_text_gen.h\n  src/annotated_binary_text_gen.cpp\n  src/bfbs_gen_lua.cpp\n  src/bfbs_gen_nim.cpp\n  src/code_generators.cpp\n  grpc/src/compiler/schema_interface.h\n  grpc/src/compiler/cpp_generator.h\n  grpc/src/compiler/cpp_generator.cc\n  grpc/src/compiler/go_generator.h\n  grpc/src/compiler/go_generator.cc\n  grpc/src/compiler/java_generator.h\n  grpc/src/compiler/java_generator.cc\n  grpc/src/compiler/python_generator.h\n  grpc/src/compiler/python_generator.cc\n  grpc/src/compiler/swift_generator.h\n  grpc/src/compiler/swift_generator.cc\n  grpc/src/compiler/ts_generator.h\n  grpc/src/compiler/ts_generator.cc\n)\n\nset(FlatHash_SRCS\n  include/flatbuffers/hash.h\n  src/flathash.cpp\n)\n\nset(FlatBuffers_Tests_SRCS\n  ${FlatBuffers_Library_SRCS}\n  src/idl_gen_fbs.cpp\n  tests/default_vectors_strings_test.cpp\n  tests/default_vectors_strings_test.h\n  tests/evolution_test.cpp\n  tests/flexbuffers_test.cpp\n  tests/fuzz_test.cpp\n  tests/json_test.cpp\n  tests/key_field_test.cpp\n  tests/monster_test.cpp\n  tests/optional_scalars_test.cpp\n  tests/parser_test.cpp\n  tests/proto_test.cpp\n  tests/reflection_test.cpp\n  tests/test.cpp\n  tests/test_assert.h\n  tests/test_assert.cpp\n  tests/test_builder.h\n  tests/test_builder.cpp\n  tests/util_test.cpp\n  tests/vector_table_naked_ptr_test.h\n  tests/vector_table_naked_ptr_test.cpp\n  tests/native_type_test_impl.h\n  tests/native_type_test_impl.cpp\n  tests/alignment_test.h\n  tests/alignment_test.cpp\n  tests/64bit/offset64_test.h\n  tests/64bit/offset64_test.cpp\n  include/flatbuffers/code_generators.h\n  src/code_generators.cpp\n)\n\nset(FlatBuffers_Tests_CPP17_SRCS\n  ${FlatBuffers_Library_SRCS}\n  tests/test_assert.h\n  tests/test_assert.cpp\n  tests/cpp17/test_cpp17.cpp\n)\n\nset(FlatBuffers_Sample_Binary_SRCS\n  samples/sample_binary.cpp\n)\n\nset(FlatBuffers_Sample_Text_SRCS\n  ${FlatBuffers_Library_SRCS}\n  samples/sample_text.cpp\n)\n\nset(FlatBuffers_Sample_BFBS_SRCS\n  ${FlatBuffers_Library_SRCS}\n  samples/sample_bfbs.cpp\n)\n\nset(FlatBuffers_GRPCTest_SRCS\n  include/flatbuffers/flatbuffers.h\n  include/flatbuffers/grpc.h\n  include/flatbuffers/util.h\n  src/util.cpp\n  tests/monster_test.grpc.fb.h\n  tests/test_assert.h\n  tests/test_builder.h\n  tests/monster_test.grpc.fb.cc\n  tests/test_assert.cpp\n  tests/test_builder.cpp\n  grpc/tests/grpctest.cpp\n  grpc/tests/message_builder_test.cpp\n  grpc/tests/grpctest_callback_compile.cpp\n  grpc/tests/grpctest_callback_client_compile.cpp\n)\n\n# TODO(dbaileychess): Figure out how this would now work. I posted a question on\n# https://stackoverflow.com/questions/71772330/override-target-compile-options-via-cmake-command-line.\n# Append FLATBUFFERS_CXX_FLAGS to CMAKE_CXX_FLAGS.\nif(DEFINED FLATBUFFERS_CXX_FLAGS)\n  message(STATUS \"extend CXX_FLAGS with ${FLATBUFFERS_CXX_FLAGS}\")\n  set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} ${FLATBUFFERS_CXX_FLAGS}\")\nendif()\nmessage(STATUS \"CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}\")\n\nfunction(add_fsanitize_to_target _target _sanitizer)\n  if(WIN32)\n    target_compile_definitions(${_target} PRIVATE FLATBUFFERS_MEMORY_LEAK_TRACKING)\n    message(STATUS \"Sanitizer MSVC::_CrtDumpMemoryLeaks added to ${_target}\")\n  else()\n    # FLATBUFFERS_CODE_SANITIZE: boolean {ON,OFF,YES,NO} or string with list of sanitizer.\n    # List of sanitizer is string starts with '=': \"=address,undefined,thread,memory\".\n    if(IS_CLANG OR (CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 4.9))\n      set(_sanitizer_flags \"=address,undefined\")\n      if(_sanitizer MATCHES \"=.*\")\n        # override default by user-defined sanitizer list\n        set(_sanitizer_flags ${_sanitizer})\n      endif()\n      target_compile_options(${_target} PRIVATE\n        -g -fsigned-char -fno-omit-frame-pointer\n        \"-fsanitize${_sanitizer_flags}\")\n      target_link_libraries(${_target} PRIVATE\n        \"-fsanitize${_sanitizer_flags}\")\n      set_target_properties(${_target} PROPERTIES POSITION_INDEPENDENT_CODE ON)\n      message(STATUS \"Sanitizer ${_sanitizer_flags} added to ${_target}\")\n    endif()\n  endif()\nendfunction()\n\nfunction(add_pch_to_target _target _pch_header)\n  # the command is available since cmake 3.16\n  if(COMMAND target_precompile_headers)\n    target_precompile_headers(${_target} PRIVATE ${_pch_header})\n    if(NOT MSVC)\n      set_source_files_properties(src/util.cpp PROPERTIES SKIP_PRECOMPILE_HEADERS ON)\n    endif()\n  endif()\nendfunction()\n\ninclude_directories(include)\ninclude_directories(grpc)\n\n# Creates an interface library that stores the configuration settings that each\n# target links too. This is a compromise between setting configuration globally\n# with add_compile_options() and the more targetted target_compile_options().\n# This way each target in this file can share settings and override them if\n# needed.\nadd_library(ProjectConfig INTERFACE)\ntarget_compile_features(ProjectConfig\n  INTERFACE\n    cxx_std_${FLATBUFFERS_CPP_STD}\n)\n\n# Force the standard to be met.\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\n\n# We shouldn't rely on any compiler-extensions to make things work.\nset(CMAKE_CXX_EXTENSIONS OFF)\n\nif(MSVC_LIKE)\n  target_compile_options(ProjectConfig\n    INTERFACE\n      /W4\n      $<$<BOOL:${FLATBUFFERS_STRICT_MODE}>:\n        /WX       # Treat all compiler warnings as errors\n      >\n      /wd4512   # C4512: assignment operator could not be generated\n      /wd4316   # C4316: object allocated on the heap may not be aligned\n      /wd4456   # C4456: hides previous local declaration\n      $<$<CXX_COMPILER_ID:Clang>:\n        /D_CRT_SECURE_NO_WARNINGS\n      >\n  )\nelse()\n  target_compile_options(ProjectConfig\n    INTERFACE\n      -Wall\n      $<$<BOOL:${FLATBUFFERS_STRICT_MODE}>:\n        -Werror   # Treat all compiler warnings as errors\n\n        -fno-rtti # Disable runtime type information\n\n        $<$<CXX_COMPILER_ID:GNU>:\n          # False positive string overflow\n          # https://github.com/google/flatbuffers/issues/7366\n          -Wno-error=stringop-overflow\n        >\n      >\n      -pedantic\n      -Wextra\n      -Wno-unused-parameter\n      -Wold-style-cast\n      -fsigned-char\n      -Wnon-virtual-dtor\n\n      # This isn't working for some reason: $<$<CXX_COMPILER_ID:CLANG>:\n      $<$<BOOL:${IS_CLANG}>:\n        -Wnewline-eof\n        -Wno-unknown-warning-option\n        -Wmissing-declarations\n        -Wzero-as-null-pointer-constant\n        $<$<VERSION_GREATER:$<CXX_COMPILER_VERSION>,3.8>:\n          -Wimplicit-fallthrough\n          -Wextra-semi\n          $<$<BOOL:${FLATBUFFERS_STRICT_MODE}>:\n            -Werror=unused-private-field\n          >\n        >\n      >\n\n      $<$<CXX_COMPILER_ID:GNU>:\n        $<$<VERSION_GREATER:$<CXX_COMPILER_VERSION>,4.4>:\n          -Wunused-result\n          -Wunused-parameter\n          -Werror=unused-parameter\n          -Wmissing-declarations\n        >\n        $<$<VERSION_GREATER:$<CXX_COMPILER_VERSION>,4.7>:\n          -Wzero-as-null-pointer-constant\n        >\n        $<$<VERSION_GREATER:$<CXX_COMPILER_VERSION>,7.0>:\n          -faligned-new\n          $<$<BOOL:${FLATBUFFERS_STRICT_MODE}>:\n            -Werror=implicit-fallthrough=2\n          >\n        >\n        $<$<VERSION_GREATER:$<CXX_COMPILER_VERSION>,8.0>:\n          -Wextra-semi\n        >\n      >\n\n      $<$<BOOL:${FLATBUFFERS_CODE_COVERAGE}>:\n        -g\n        -fprofile-arcs\n        -ftest-coverage\n      >\n    )\n\n  if(FLATBUFFERS_CODE_COVERAGE)\n    target_link_options(ProjectConfig\n      INTERFACE\n        -fprofile-arcs\n        -ftest-coverage\n    )\n  endif()\nendif()\n\nif(FLATBUFFERS_BUILD_FLATLIB)\n  add_library(flatbuffers STATIC ${FlatBuffers_Library_SRCS})\n\n  # Attach header directory for when build via add_subdirectory().\n  target_include_directories(flatbuffers\n    INTERFACE\n      $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>\n  )\n  target_link_libraries(flatbuffers PRIVATE $<BUILD_INTERFACE:ProjectConfig>)\n\n  if(FLATBUFFERS_ENABLE_PCH)\n    add_pch_to_target(flatbuffers include/flatbuffers/pch/pch.h)\n  endif()\nendif()\n\nif(FLATBUFFERS_BUILD_FLATC)\n  add_executable(flatc ${FlatBuffers_Compiler_SRCS})\n  if(FLATBUFFERS_ENABLE_PCH)\n    add_pch_to_target(flatc include/flatbuffers/pch/flatc_pch.h)\n  endif()\n\n  target_link_libraries(flatc PRIVATE $<BUILD_INTERFACE:ProjectConfig>)\n  target_compile_options(flatc\n    PRIVATE\n      $<$<AND:$<BOOL:${MSVC_LIKE}>,$<CONFIG:Release>>:\n        /MT\n      >\n  )\n\n  if(FLATBUFFERS_CODE_SANITIZE AND NOT WIN32)\n    add_fsanitize_to_target(flatc ${FLATBUFFERS_CODE_SANITIZE})\n  endif()\n  if(NOT FLATBUFFERS_FLATC_EXECUTABLE)\n    set(FLATBUFFERS_FLATC_EXECUTABLE $<TARGET_FILE:flatc>)\n  endif()\n  if(FLATBUFFERS_STATIC_FLATC AND NOT MSVC)\n    target_link_libraries(flatc PRIVATE -static)\n  endif()\nendif()\n\nif(FLATBUFFERS_BUILD_FLATHASH)\n  add_executable(flathash ${FlatHash_SRCS})\n  target_link_libraries(flathash PRIVATE $<BUILD_INTERFACE:ProjectConfig>)\nendif()\n\nif(FLATBUFFERS_BUILD_SHAREDLIB)\n  add_library(flatbuffers_shared SHARED ${FlatBuffers_Library_SRCS})\n  target_link_libraries(flatbuffers_shared PRIVATE $<BUILD_INTERFACE:ProjectConfig>)\n  # FlatBuffers use calendar-based versioning and do not provide any ABI\n  # stability guarantees. Therefore, always use the full version as SOVERSION\n  # in order to avoid breaking reverse dependencies on upgrades.\n  set(FlatBuffers_Library_SONAME_FULL \"${PROJECT_VERSION}\")\n  set_target_properties(flatbuffers_shared PROPERTIES\n                        OUTPUT_NAME flatbuffers\n                        SOVERSION \"${FlatBuffers_Library_SONAME_FULL}\"\n                        VERSION \"${FlatBuffers_Library_SONAME_FULL}\")\n  if(FLATBUFFERS_ENABLE_PCH)\n    add_pch_to_target(flatbuffers_shared include/flatbuffers/pch/pch.h)\n  endif()\nendif()\n\nfunction(compile_schema SRC_FBS OPT SUFFIX OUT_GEN_FILE) \n  get_filename_component(SRC_FBS_DIR ${SRC_FBS} PATH)\n  string(REGEX REPLACE \"\\\\.fbs$\" \"${SUFFIX}.h\" GEN_HEADER ${SRC_FBS})\n  add_custom_command(\n    OUTPUT ${GEN_HEADER}\n    COMMAND \"${FLATBUFFERS_FLATC_EXECUTABLE}\"\n      ${OPT}\n      --filename-suffix ${SUFFIX}\n      -o \"${SRC_FBS_DIR}\"\n      \"${CMAKE_CURRENT_SOURCE_DIR}/${SRC_FBS}\"\n    DEPENDS flatc ${SRC_FBS}\n    COMMENT \"flatc generation: `${SRC_FBS}` -> `${GEN_HEADER}`\"\n  )\n  set(${OUT_GEN_FILE} ${GEN_HEADER} PARENT_SCOPE)\nendfunction()\n\nfunction(compile_schema_for_test SRC_FBS OPT)\n  compile_schema(\"${SRC_FBS}\" \"${OPT}\" \"_generated\" GEN_FILE)\n  target_sources(flattests PRIVATE ${GEN_FILE})\nendfunction()\n\nfunction(compile_schema_for_test_fbsh SRC_FBS OPT)\n  compile_schema(\"${SRC_FBS}\" \"${OPT}\" \".fbs\" GEN_FILE)\n  target_sources(flattests PRIVATE ${GEN_FILE})\nendfunction()\n\nfunction(compile_schema_for_samples SRC_FBS OPT)\n  compile_schema(\"${SRC_FBS}\" \"${OPT}\" \"_generated\" GEN_FILE)\n  target_sources(flatsample PRIVATE ${GEN_FILE})\nendfunction()\n\nif(FLATBUFFERS_BUILD_TESTS)\n  add_executable(flattests ${FlatBuffers_Tests_SRCS})\n  target_link_libraries(flattests PRIVATE $<BUILD_INTERFACE:ProjectConfig>)\n  target_include_directories(flattests PUBLIC \n    # Ideally everything is fully qualified from the root directories\n    ${CMAKE_CURRENT_SOURCE_DIR}\n    ${CMAKE_CURRENT_BINARY_DIR}\n    # TODO(derekbailey): update includes to fully qualify src/ and tests/\n    src \n    tests \n    ${CMAKE_CURRENT_BINARY_DIR}/tests \n  )\n\n  # Have tests load data from the source directory, not the build directory.\n  add_definitions(-DFLATBUFFERS_TEST_PATH_PREFIX=${CMAKE_CURRENT_SOURCE_DIR}/)\n\n  # The flattest target needs some generated files\n  SET(FLATC_OPT_COMP --cpp --gen-compare --gen-mutable --gen-object-api --reflect-names)\n  SET(FLATC_OPT_SCOPED_ENUMS ${FLATC_OPT_COMP};--scoped-enums)\n\n  compile_schema_for_test(tests/alignment_test.fbs \"${FLATC_OPT_COMP}\")\n  compile_schema_for_test_fbsh(tests/default_vectors_strings_test.fbs \"${FLATC_OPT_COMP}\")\n  compile_schema_for_test(tests/arrays_test.fbs \"${FLATC_OPT_SCOPED_ENUMS}\")\n  compile_schema_for_test(tests/native_inline_table_test.fbs \"${FLATC_OPT_COMP}\")\n  compile_schema_for_test(tests/native_type_test.fbs \"${FLATC_OPT_COMP}\")\n  compile_schema_for_test(tests/key_field/key_field_sample.fbs \"${FLATC_OPT_COMP}\")\n  compile_schema_for_test(tests/64bit/test_64bit.fbs \"${FLATC_OPT_COMP};--bfbs-gen-embed\")\n  compile_schema_for_test(tests/64bit/evolution/v1.fbs \"${FLATC_OPT_COMP}\")\n  compile_schema_for_test(tests/64bit/evolution/v2.fbs \"${FLATC_OPT_COMP}\")\n  compile_schema_for_test(tests/union_underlying_type_test.fbs \"${FLATC_OPT_SCOPED_ENUMS}\")\n  compile_schema_for_test(tests/cross_namespace_pack_test.fbs \"${FLATC_OPT_COMP}\")\n\n  if(FLATBUFFERS_CODE_SANITIZE)\n    add_fsanitize_to_target(flattests ${FLATBUFFERS_CODE_SANITIZE})\n  endif()\n  \n  include_directories(${CMAKE_CURRENT_BINARY_DIR}/samples)\n\n  add_executable(flatsamplebinary ${FlatBuffers_Sample_Binary_SRCS})\n  add_executable(flatsampletext ${FlatBuffers_Sample_Text_SRCS})\n  add_executable(flatsamplebfbs ${FlatBuffers_Sample_BFBS_SRCS})\n\n  # Add a library so there is a single target that the generated samples can \n  # link too.\n  if(MSVC OR ${CMAKE_VERSION} VERSION_GREATER_EQUAL \"3.20.0\")\n    add_library(flatsample INTERFACE)\n  else()\n    add_library(flatsample STATIC)\n  endif()\n\n  # Since flatsample has no sources, we have to explicitly set the linker lang.\n  set_target_properties(flatsample PROPERTIES LINKER_LANGUAGE CXX)\n\n  target_link_libraries(flatsamplebinary PRIVATE $<BUILD_INTERFACE:ProjectConfig> flatsample)\n  target_link_libraries(flatsampletext PRIVATE $<BUILD_INTERFACE:ProjectConfig> flatsample)\n  target_link_libraries(flatsamplebfbs PRIVATE $<BUILD_INTERFACE:ProjectConfig> flatsample)\n\n  if(FLATBUFFERS_BUILD_CPP17)\n    add_executable(flattests_cpp17 ${FlatBuffers_Tests_CPP17_SRCS})\n    target_link_libraries(flattests_cpp17 PRIVATE $<BUILD_INTERFACE:ProjectConfig>)\n    target_include_directories(flattests_cpp17 PUBLIC src tests)\n    target_compile_features(flattests_cpp17 PRIVATE cxx_std_17) # requires cmake 3.8\n\n    if(FLATBUFFERS_CODE_SANITIZE)\n      add_fsanitize_to_target(flattests_cpp17 ${FLATBUFFERS_CODE_SANITIZE})\n    endif()\n  endif(FLATBUFFERS_BUILD_CPP17)\nendif()\n\nif(FLATBUFFERS_BUILD_GRPCTEST)\n  if(NOT GRPC_INSTALL_PATH)\n    message(SEND_ERROR \"GRPC_INSTALL_PATH variable is not defined. See grpc/README.md\")\n  endif()\n  if(NOT PROTOBUF_DOWNLOAD_PATH)\n    message(SEND_ERROR \"PROTOBUF_DOWNLOAD_PATH variable is not defined. See grpc/README.md\")\n  endif()\n  INCLUDE_DIRECTORIES(${GRPC_INSTALL_PATH}/include)\n  INCLUDE_DIRECTORIES(${PROTOBUF_DOWNLOAD_PATH}/src)\n  find_package(Threads REQUIRED)\n  list(APPEND CMAKE_PREFIX_PATH ${GRPC_INSTALL_PATH})\n  find_package(absl CONFIG REQUIRED)\n  find_package(protobuf CONFIG REQUIRED)\n  find_package(gRPC CONFIG REQUIRED)\n  add_executable(grpctest ${FlatBuffers_GRPCTest_SRCS})\n  target_link_libraries(grpctest\n    PRIVATE\n      $<BUILD_INTERFACE:ProjectConfig>\n      gRPC::grpc++_unsecure\n      gRPC::gpr\n      pthread\n      dl\n  )\nendif()\n\nif(FLATBUFFERS_INSTALL)\n  include(GNUInstallDirs)\n\n  install(DIRECTORY include/flatbuffers DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})\n\n  set(FB_CMAKE_DIR \"${CMAKE_INSTALL_LIBDIR}/cmake/flatbuffers\")\n\n  configure_file(CMake/flatbuffers-config-version.cmake.in flatbuffers-config-version.cmake @ONLY)\n  install(\n      FILES\n        \"CMake/flatbuffers-config.cmake\"\n        \"CMake/BuildFlatBuffers.cmake\"\n        \"${CMAKE_CURRENT_BINARY_DIR}/flatbuffers-config-version.cmake\"\n      DESTINATION ${FB_CMAKE_DIR}\n  )\n\n  if(FLATBUFFERS_BUILD_FLATLIB)\n    install(\n      TARGETS flatbuffers EXPORT FlatBuffersTargets\n      ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}\n      INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}\n    )\n\n    install(EXPORT FlatBuffersTargets\n      FILE FlatBuffersTargets.cmake\n      NAMESPACE flatbuffers::\n      DESTINATION ${FB_CMAKE_DIR}\n    )\n  endif()\n\n  if(FLATBUFFERS_BUILD_FLATC)\n    install(\n      TARGETS flatc EXPORT FlatcTargets\n      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}\n    )\n\n    install(\n      EXPORT FlatcTargets\n      FILE FlatcTargets.cmake\n      NAMESPACE flatbuffers::\n      DESTINATION ${FB_CMAKE_DIR}\n    )\n  endif()\n\n  if(FLATBUFFERS_BUILD_SHAREDLIB)\n    install(\n      TARGETS flatbuffers_shared EXPORT FlatBuffersSharedTargets\n      ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}\n      RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR}\n      LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}\n      INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}\n    )\n\n    install(\n      EXPORT FlatBuffersSharedTargets\n      FILE FlatBuffersSharedTargets.cmake\n      NAMESPACE flatbuffers::\n      DESTINATION ${FB_CMAKE_DIR}\n    )\n  endif()\n\n  if(FLATBUFFERS_BUILD_SHAREDLIB OR FLATBUFFERS_BUILD_FLATLIB)\n      configure_file(CMake/flatbuffers.pc.in flatbuffers.pc @ONLY)\n      install(\n        FILES \"${CMAKE_CURRENT_BINARY_DIR}/flatbuffers.pc\"\n        DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig\n      )\n  endif()\nendif()\n\nif(FLATBUFFERS_BUILD_TESTS)\n  enable_testing()\n\n  add_test(NAME flattests COMMAND flattests)\n  if(FLATBUFFERS_BUILD_CPP17)\n    add_test(NAME flattests_cpp17 COMMAND flattests_cpp17)\n  endif()\n  if(FLATBUFFERS_BUILD_GRPCTEST)\n    add_test(NAME grpctest COMMAND grpctest)\n  endif()\nendif()\n\ninclude(CMake/BuildFlatBuffers.cmake)\n\nif(UNIX)\n    # Use of CPack only supported on Linux systems.\n    if(FLATBUFFERS_PACKAGE_DEBIAN)\n        include(CMake/PackageDebian.cmake)\n        include(CPack)\n    endif()\n    if (FLATBUFFERS_PACKAGE_REDHAT)\n        include(CMake/PackageRedhat.cmake)\n        include(CPack)\n    endif()\nendif()\n\n# Include for running Google Benchmarks.\nif(FLATBUFFERS_BUILD_BENCHMARKS)\n  add_subdirectory(benchmarks)\nendif()\n\n# Add FlatBuffers::FlatBuffers interface, needed for FetchContent_Declare\nadd_library(FlatBuffers INTERFACE)\nadd_library(FlatBuffers::FlatBuffers ALIAS FlatBuffers)\ntarget_include_directories(\n  FlatBuffers\n  INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>\n            $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/include>)\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "Contributing    {#contributing}\n============\n\nWant to contribute? Great! First, read this page (including the small print at\nthe end).\n\n# Before you contribute\nBefore we can use your code, you must sign the\n[Google Individual Contributor License Agreement](https://developers.google.com/open-source/cla/individual?csw=1)\n(CLA), which you can do online. The CLA is necessary mainly because you own the\ncopyright to your changes, even after your contribution becomes part of our\ncodebase, so we need your permission to use and distribute your code. We also\nneed to be sure of various other things—for instance that you'll tell us if you\nknow that your code infringes on other people's patents. You don't have to sign\nthe CLA until after you've submitted your code for review and a member has\napproved it, but you must do it before we can put your code into our codebase.\nBefore you start working on a larger contribution, you should get in touch with\nus first through the issue tracker with your idea so that we can help out and\npossibly guide you. Coordinating up front makes it much easier to avoid\nfrustration later on.\n\n# Code reviews\nAll submissions, including submissions by project members, require review. We\nuse Github pull requests for this purpose.\n\nSome tips for good pull requests:\n* Use our code\n  [style guide](https://google.github.io/styleguide/cppguide.html).\n  When in doubt, try to stay true to the existing code of the project.\n* Write a descriptive commit message. What problem are you solving and what\n  are the consequences? Where and what did you test? Some good tips:\n  [here](http://robots.thoughtbot.com/5-useful-tips-for-a-better-commit-message)\n  and [here](https://www.kernel.org/doc/Documentation/process/submitting-patches.rst).\n* If your PR consists of multiple commits which are successive improvements /\n  fixes to your first commit, consider squashing them into a single commit\n  (`git rebase -i`) such that your PR is a single commit on top of the current\n  HEAD. This make reviewing the code so much easier, and our history more\n  readable.\n\n# The small print\nContributions made by corporations are covered by a different agreement than\nthe one above, the Software Grant and Corporate Contributor License Agreement.\n\n# Code\n\nTL/DR\n\nSee [how to build flatc](https://flatbuffers.dev/building/).\n\nWhen making changes, build `flatc` and then re-generate the goldens files to see the effect of your changes:\n\n```\n$ cp build/flatc .\n$ goldens/generate_goldens.py\n```\n\nRe-generate other code files to see the effects of the changes:\n\n```\n$ scripts/generate_code.py\n```\n\nRun tests with [TestAll.sh](tests/TestAll.sh) in [tests](tests), or directly any of the sub-scripts run by it.\n\n[Format the code](Formatters.md) before submitting a PR.\n"
  },
  {
    "path": "FlatBuffers.podspec",
    "content": "Pod::Spec.new do |s|\n  s.name             = 'FlatBuffers'\n  s.version          = '25.12.19'\n  s.summary          = 'FlatBuffers: Memory Efficient Serialization Library'\n\n  s.description      = \"FlatBuffers is a cross platform serialization library architected for\n  maximum memory efficiency. It allows you to directly access serialized\n  data without parsing/unpacking it first, while still having great \n  forwards/backwards compatibility.\"\n\n  s.homepage         = 'https://github.com/google/flatbuffers'\n  s.license          = { :type => 'Apache2.0', :file => 'LICENSE' }\n  s.author           = { 'mustii' => 'me@mustiikhalil.se' }\n  s.source           = { :git => 'https://github.com/google/flatbuffers.git', :tag => \"v\" + s.version.to_s, :submodules => true }\n\n  s.ios.deployment_target = '11.0'\n  s.osx.deployment_target = '10.14'\n\n  s.swift_version = '5.10'\n  s.source_files = 'swift/Sources/Flatbuffers/*.swift'\n  s.pod_target_xcconfig = {\n    'BUILD_LIBRARY_FOR_DISTRIBUTION' => 'YES'\n  }\nend\n"
  },
  {
    "path": "Formatters.md",
    "content": "# Format Guidelines\n\nIf you are interesting in contributing to the flatbuffers project, please take a second to read this document. Each language has it's own set of rules, that are defined in their respective formatter/linter documents.\n\n# Notes\n\n- Run the linter on the language you are working on before making a Pull Request.\n- DONT format/lint the generated code.\n\n# Languages\n\n## C++\n\nC++ uses `clang-format` as it's formatter. Run the following script `sh scripts/clang-format-git.sh`, and it should style the C++ code according to [google style guide](https://google.github.io/styleguide/cppguide.html).\n\n## Swift\n\nSwift uses swiftformat as it's formatter. Take a look at [how to install here](https://github.com/nicklockwood/SwiftFormat/blob/master/README.md#how-do-i-install-it). Run the following command `swiftformat --config swift.swiftformat .` in the root directory of the project\n\n## Typescript\n\nTypescript uses eslint as it's linter. Take a look at [how to install here](https://eslint.org/docs/user-guide/getting-started). Run the following command `eslint ts/** --ext .ts` in the root directory of the project\n"
  },
  {
    "path": "LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "MODULE.bazel",
    "content": "module(\n    name = \"flatbuffers\",\n    version = \"25.12.19\",\n    compatibility_level = 1,\n    repo_name = \"com_github_google_flatbuffers\",\n)\n\nbazel_dep(\n    name = \"aspect_bazel_lib\",\n    version = \"2.14.0\",\n)\nbazel_dep(\n    name = \"aspect_rules_esbuild\",\n    version = \"0.21.0\",\n)\nbazel_dep(\n    name = \"aspect_rules_js\",\n    version = \"2.3.8\",\n)\nbazel_dep(\n    name = \"aspect_rules_ts\",\n    version = \"3.6.0\",\n)\nbazel_dep(\n    name = \"grpc\",\n    version = \"1.76.0\",\n    repo_name = \"com_github_grpc_grpc\",\n)\nbazel_dep(\n    name = \"platforms\",\n    version = \"0.0.11\",\n)\nbazel_dep(\n    name = \"rules_cc\",\n    version = \"0.1.1\",\n)\nbazel_dep(\n    name = \"rules_go\",\n    version = \"0.50.1\",\n    repo_name = \"io_bazel_rules_go\",\n)\nbazel_dep(\n    name = \"rules_nodejs\",\n    version = \"6.3.3\",\n)\nbazel_dep(\n    name = \"rules_shell\",\n    version = \"0.3.0\",\n)\nbazel_dep(\n    name = \"rules_swift\",\n    version = \"3.1.2\",\n    max_compatibility_level = 3,\n    repo_name = \"build_bazel_rules_swift\",\n)\nbazel_dep(\n    name = \"bazel_skylib\",\n    version = \"1.7.1\",\n)\n\nnpm = use_extension(\"@aspect_rules_js//npm:extensions.bzl\", \"npm\")\nnpm.npm_translate_lock(\n    name = \"flatbuffers_npm\",\n    npmrc = \"//:.npmrc\",\n    pnpm_lock = \"//ts:pnpm-lock.yaml\",\n    verify_node_modules_ignored = \"//:.bazelignore\",\n)\nuse_repo(npm, \"flatbuffers_npm\")\n\nnode = use_extension(\"@rules_nodejs//nodejs:extensions.bzl\", \"node\")\nuse_repo(node, \"nodejs_linux_amd64\")\n\nrules_ts_ext = use_extension(\"@aspect_rules_ts//ts:extensions.bzl\", \"ext\", dev_dependency = True)\nrules_ts_ext.deps()\nuse_repo(rules_ts_ext, \"npm_typescript\")\n"
  },
  {
    "path": "Package.swift",
    "content": "// swift-tools-version:5.10\n/*\n * Copyright 2020 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport PackageDescription\n\nlet package = Package(\n  name: \"FlatBuffers\",\n  platforms: [\n    .iOS(.v12),\n    .macOS(.v10_14),\n  ],\n  products: [\n    .library(\n      name: \"FlatBuffers\",\n      targets: [\"FlatBuffers\"]),\n    .library(\n      name: \"FlexBuffers\",\n      targets: [\"FlexBuffers\"]),\n  ],\n  dependencies: .dependencies,\n  targets: [\n    .target(\n      name: \"FlatBuffers\",\n      dependencies: [\"Common\"],\n      path: \"swift/Sources/FlatBuffers\"),\n    .target(\n      name: \"FlexBuffers\",\n      dependencies: [\"Common\"],\n      path: \"swift/Sources/FlexBuffers\"),\n    .target(\n      name: \"Common\",\n      path: \"swift/Sources/Common\"),\n    .testTarget(\n      name: \"FlatbuffersTests\",\n      dependencies: .dependencies,\n      path: \"tests/swift/Tests/Flatbuffers\"),\n    .testTarget(\n      name: \"FlexbuffersTests\",\n      dependencies: [\"FlexBuffers\"],\n      path: \"tests/swift/Tests/Flexbuffers\"),\n  ])\n\nextension Array where Element == Package.Dependency {\n  static var dependencies: [Package.Dependency] {\n    #if os(Windows)\n    []\n    #else\n    // Test only Dependency\n    [.package(url: \"https://github.com/grpc/grpc-swift.git\", from: \"1.4.1\")]\n    #endif\n  }\n}\n\nextension Array where Element == PackageDescription.Target.Dependency {\n  static var dependencies: [PackageDescription.Target.Dependency] {\n    #if os(Windows)\n    [\"FlatBuffers\"]\n    #else\n    // Test only Dependency\n    [\n      .product(name: \"GRPC\", package: \"grpc-swift\"),\n      \"FlatBuffers\",\n    ]\n    #endif\n  }\n}\n"
  },
  {
    "path": "README.md",
    "content": "![logo](https://flatbuffers.dev/assets/flatbuffers_logo.svg) FlatBuffers\n===========\n\n![Build status](https://github.com/google/flatbuffers/actions/workflows/build.yml/badge.svg?branch=master)\n[![BuildKite status](https://badge.buildkite.com/7979d93bc6279aa539971f271253c65d5e8fe2fe43c90bbb25.svg)](https://buildkite.com/bazel/flatbuffers)\n[![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/flatbuffers.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:flatbuffers)\n[![Discord Chat](https://img.shields.io/discord/656202785926152206.svg)](https:///discord.gg/6qgKs3R)\n[![Twitter Follow](https://img.shields.io/twitter/follow/wvo.svg?style=social)](https://twitter.com/wvo)\n[![Twitter Follow](https://img.shields.io/twitter/follow/dbaileychess.svg?style=social)](https://twitter.com/dbaileychess)\n\n\n**FlatBuffers** is a cross platform serialization library architected for\nmaximum memory efficiency. It allows you to directly access serialized data without parsing/unpacking it first, while still having great forwards/backwards compatibility.\n\n## Quick Start\n\n1. Build the compiler for flatbuffers (`flatc`)\n\n    Use `cmake` to create the build files for your platform and then perform the compilation (Linux example).\n\n    ```\n    cmake -G \"Unix Makefiles\"\n    make -j\n    ```\n\n2. Define your flatbuffer schema (`.fbs`)\n\n    Write the [schema](https://flatbuffers.dev/flatbuffers_guide_writing_schema.html) to define the data you want to serialize. See [monster.fbs](https://github.com/google/flatbuffers/blob/master/samples/monster.fbs) for an example.\n\n3. Generate code for your language(s)\n\n    Use the `flatc` compiler to take your schema and generate language-specific code:\n\n    ```\n    ./flatc --cpp --rust monster.fbs\n    ```\n\n    Which generates `monster_generated.h` and `monster_generated.rs` files.\n\n4. Serialize data\n\n    Use the generated code, as well as the `FlatBufferBuilder` to construct your serialized buffer. ([`C++` example](https://github.com/google/flatbuffers/blob/master/samples/sample_binary.cpp#L24-L56))\n\n5. Transmit/store/save Buffer\n\n    Use your serialized buffer however you want. Send it to someone, save it for later, etc...\n\n6. Read the data\n\n    Use the generated accessors to read the data from the serialized buffer.\n\n    It doesn't need to be the same language/schema version, FlatBuffers ensures the data is readable across languages and schema versions. See the [`Rust` example](https://github.com/google/flatbuffers/blob/master/samples/sample_binary.rs#L92-L106) reading the data written by `C++`.\n\n## Documentation\n\n**Go to our [landing page][] to browse our documentation.**\n\n## Supported operating systems\n- Windows\n- macOS\n- Linux\n- Android\n- And any others with a recent C++ compiler (C++ 11 and newer)\n\n## Supported programming languages\n\nCode generation and runtime libraries for many popular languages.\n\n1. C\n1. C++ - [snapcraft.io](https://snapcraft.io/flatbuffers)\n1. C# - [nuget.org](https://www.nuget.org/packages/Google.FlatBuffers)\n1. Dart - [pub.dev](https://pub.dev/packages/flat_buffers)\n1. Go - [go.dev](https://pkg.go.dev/github.com/google/flatbuffers)\n1. Java - [Maven](https://search.maven.org/artifact/com.google.flatbuffers/flatbuffers-java)\n1. JavaScript - [NPM](https://www.npmjs.com/package/flatbuffers)\n1. Kotlin\n1. Lobster\n1. Lua\n1. PHP\n1. Python - [PyPI](https://pypi.org/project/flatbuffers/)\n1. Rust - [crates.io](https://crates.io/crates/flatbuffers)\n1. Swift - [swiftpackageindex](https://swiftpackageindex.com/google/flatbuffers)\n1. TypeScript - [NPM](https://www.npmjs.com/package/flatbuffers)\n1. Nim\n\n## Versioning\n\nFlatBuffers does not follow traditional SemVer versioning (see [rationale](https://github.com/google/flatbuffers/wiki/Versioning)) but rather uses a format of the date of the release.\n\n## Contribution\n\n* [FlatBuffers Issues Tracker][] to submit an issue.\n* [stackoverflow.com][] with [`flatbuffers` tag][] for any questions regarding FlatBuffers.\n\n*To contribute to this project,* see [CONTRIBUTING][].\n\n## Community\n\n* [Discord Server](https:///discord.gg/6qgKs3R)\n\n## Security\n\nPlease see our [Security Policy](SECURITY.md) for reporting vulnerabilities.\n\n## Licensing\n*Flatbuffers* is licensed under the Apache License, Version 2.0. See [LICENSE][] for the full license text.\n\n<br>\n\n   [CONTRIBUTING]: http://github.com/google/flatbuffers/blob/master/CONTRIBUTING.md\n   [`flatbuffers` tag]: https://stackoverflow.com/questions/tagged/flatbuffers\n   [FlatBuffers Google Group]: https://groups.google.com/forum/#!forum/flatbuffers\n   [FlatBuffers Issues Tracker]: http://github.com/google/flatbuffers/issues\n   [stackoverflow.com]: http://stackoverflow.com/search?q=flatbuffers\n   [landing page]: https://google.github.io/flatbuffers\n   [LICENSE]: https://github.com/google/flatbuffers/blob/master/LICENSE\n"
  },
  {
    "path": "SECURITY.md",
    "content": "# Security Policy\n\n## Reporting a Vulnerability\n\nTo report a security issue, please use http://g.co/vulnz. We use\nhttp://g.co/vulnz for our intake, and do coordination and disclosure here on\nGitHub (including using GitHub Security Advisory). The Google Security Team will\nrespond within 5 working days of your report on g.co/vulnz.\n\nSelect the `I want to report a technical security or an abuse risk related bug\nin a Google product (SQLi, XSS, etc.)` option and complete the form.\n"
  },
  {
    "path": "android/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- BEGIN_INCLUDE(manifest) -->\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n          package=\"com.example.FlatBufferTest\">\n\n    <uses-sdk android:minSdkVersion=\"14\"/>\n    <uses-feature android:glEsVersion=\"0x00020000\"></uses-feature>\n\n    <!-- This .apk has no Java code itself, so set hasCode to false. -->\n    <application android:name=\"android.support.multidex.MultiDexApplication\"\n                 android:label=\"@string/app_name\"\n                 android:hasCode=\"false\"\n                 android:allowBackup=\"false\">\n        <!-- Our activity is the built-in NativeActivity framework class.\n             This will take care of integrating with our NDK code. -->\n        <activity android:name=\"android.app.NativeActivity\"\n                android:label=\"@string/app_name\"\n                android:configChanges=\"orientation|keyboardHidden\"\n                android:screenOrientation=\"landscape\">\n            <!-- Tell NativeActivity the name of or .so -->\n            <meta-data android:name=\"android.app.lib_name\"\n                    android:value=\"FlatBufferTest\" />\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n    </application>\n\n</manifest>\n<!-- END_INCLUDE(manifest) -->\n"
  },
  {
    "path": "android/app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "android/app/build.gradle",
    "content": "apply plugin: 'com.android.application'\napply plugin: 'kotlin-android'\n\nandroid {\n  compileSdk 33\n\n  defaultConfig {\n    applicationId \"com.flatbuffers.app\"\n    minSdkVersion 26\n    targetSdkVersion 33\n    versionCode 1\n    versionName \"1.0\"\n\n    compileOptions {\n      sourceCompatibility JavaVersion.VERSION_1_8\n      targetCompatibility JavaVersion.VERSION_1_8\n    }\n\n    sourceSets {\n      main {\n        java {\n          srcDir '../../java/src/main/java/'\n        }\n      }\n    }\n\n    ndk {\n      abiFilters 'arm64-v8a', 'armeabi-v7a'\n    }\n    \n    testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n    externalNativeBuild {\n      cmake {\n        arguments \"-DFLATBUFFERS_SRC=${rootProject.projectDir}/..\"\n      }\n    }\n  }\n\n  buildTypes {\n    release {\n      minifyEnabled false\n      proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n    }\n  }\n\n  externalNativeBuild {\n    cmake {\n      path \"src/main/cpp/CMakeLists.txt\"\n    }\n  }\n\n  task generateFbsCpp(type: Exec) {\n    def inputDir = file(\"$projectDir/src/main/fbs\")\n    def outputCppDir = file(\"$projectDir/src/main/cpp/generated/\")\n    def fbsFiles = layout.files { file(inputDir).listFiles() }.filter { File f -> f.name.endsWith(\".fbs\") }.toList()\n    ignoreExitValue(true)\n\n    standardOutput = new ByteArrayOutputStream()\n    errorOutput = new ByteArrayOutputStream()\n    def commandLineArgs = ['flatc', '-o', outputCppDir, '--cpp']\n    fbsFiles.forEach{\n      commandLineArgs.add(it.path)\n    }\n\n    commandLine commandLineArgs\n\n    doFirst {\n      delete \"$outputCppDir/\"\n      mkdir \"$outputCppDir/\"\n    }\n\n    doLast {\n      if (executionResult.get().exitValue != 0) {\n        throw new GradleException(\"flatc failed with: ${executionResult.get().toString()}\")\n      }\n    }\n  }\n\n  task generateFbsKotlin(type: Exec) {\n    def inputDir = file(\"$projectDir/src/main/fbs\")\n    def outputKotlinDir = file(\"$projectDir/src/main/java/generated/\")\n    def fbsFiles = layout.files { file(inputDir).listFiles() }.filter { File f -> f.name.endsWith(\".fbs\") }.toList()\n    ignoreExitValue(true)\n\n    standardOutput = new ByteArrayOutputStream()\n    errorOutput = new ByteArrayOutputStream()\n\n    setErrorOutput(errorOutput)\n    setStandardOutput(standardOutput)\n\n    def commandLineArgs = ['flatc', '-o', outputKotlinDir, '--kotlin']\n    fbsFiles.forEach{\n      commandLineArgs.add(it.path)\n    }\n    commandLine commandLineArgs\n\n    doFirst {\n      delete \"$outputKotlinDir/\"\n      mkdir \"$outputKotlinDir/\"\n    }\n    doLast {\n      if (executionResult.get().exitValue != 0) {\n        throw new GradleException(\"flatc failed with: ${executionResult.get().toString()}\")\n      }\n    }\n  }\n\n  afterEvaluate {\n    tasks.named(\"preBuild\") {\n      dependsOn(generateFbsKotlin)\n      dependsOn(generateFbsCpp)\n    }\n  }\n  namespace 'com.flatbuffers.app'\n}\n\ndependencies {\n  implementation fileTree(dir: \"libs\", include: [\"*.jar\"])\n  implementation \"org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version\"\n  implementation 'androidx.appcompat:appcompat:1.6.1'\n\n  // If you using java runtime you can add its dependency as the example below\n  // implementation 'com.google.flatbuffers:flatbuffers-java:$latest_version'\n\n}\n"
  },
  {
    "path": "android/app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n  <application\n    android:allowBackup=\"true\"\n    android:icon=\"@mipmap/ic_launcher\"\n    android:label=\"@string/app_name\"\n    android:roundIcon=\"@mipmap/ic_launcher_round\"\n    android:supportsRtl=\"true\"\n    android:theme=\"@style/AppTheme\">\n    <activity android:name=\".MainActivity\"\n      android:exported=\"true\">\n      <intent-filter>\n        <action android:name=\"android.intent.action.MAIN\" />\n\n        <category android:name=\"android.intent.category.LAUNCHER\" />\n      </intent-filter>\n    </activity>\n  </application>\n\n</manifest>\n"
  },
  {
    "path": "android/app/src/main/cpp/CMakeLists.txt",
    "content": "# For more information about using CMake with Android Studio, read the\n# documentation: https://d.android.com/studio/projects/add-native-code.html\n\n# Sets the minimum version of CMake required to build the native library.\n\ncmake_minimum_required(VERSION 3.4.1)\n\n# Creates and names a library, sets it as either STATIC\n# or SHARED, and provides the relative paths to its source code.\n# You can define multiple libraries, and CMake builds them for you.\n# Gradle automatically packages shared libraries with your APK.\n\ninclude_directories(${FLATBUFFERS_SRC}/include)\n\nadd_subdirectory(flatbuffers)\n\nFILE(GLOB Generated_SRCS generated/*.h)\n\nadd_library( # Sets the name of the library.\n             native-lib\n\n             # Sets the library as a shared library.\n             SHARED\n\n             # Provides a relative path to your source file(s).\n             animals.cpp\n             ${Generated_SRCS}\n\n)\n\n# Searches for a specified prebuilt library and stores the path as a\n# variable. Because CMake includes system libraries in the search path by\n# default, you only need to specify the name of the public NDK library\n# you want to add. CMake verifies that the library exists before\n# completing its build.\n\nfind_library( # Sets the name of the path variable.\n              log-lib\n\n              # Specifies the name of the NDK library that\n              # you want CMake to locate.\n              log )\n\n# Specifies libraries CMake should link to your target library. You\n# can link multiple libraries, such as libraries you define in this\n# build script, prebuilt third-party libraries, or system libraries.\n\ntarget_link_libraries( # Specifies the target library.\n                       native-lib\n                       flatbuffers\n                       # Links the target library to the log library\n                       # included in the NDK.\n                       ${log-lib} )\n"
  },
  {
    "path": "android/app/src/main/cpp/animals.cpp",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include <jni.h>\n#include <search.h>\n\n#include <string>\n\n#include \"generated/animal_generated.h\"\n\nusing namespace com::fbs::app;\nusing namespace flatbuffers;\n\nextern \"C\" JNIEXPORT jbyteArray JNICALL\nJava_com_flatbuffers_app_MainActivity_createAnimalFromJNI(JNIEnv* env,\n                                                          jobject /* this */) {\n  // create a new animal flatbuffers\n  auto fb = FlatBufferBuilder(1024);\n  auto tiger = CreateAnimalDirect(fb, \"Tiger\", \"Roar\", 300);\n  fb.Finish(tiger);\n\n  // copies it to a Java byte array.\n  auto buf = reinterpret_cast<jbyte*>(fb.GetBufferPointer());\n  int size = fb.GetSize();\n  auto ret = env->NewByteArray(size);\n  env->SetByteArrayRegion(ret, 0, fb.GetSize(), buf);\n  return ret;\n}\n"
  },
  {
    "path": "android/app/src/main/cpp/flatbuffers/CMakeLists.txt",
    "content": "# For more information about using CMake with Android Studio, read the\n# documentation: https://d.android.com/studio/projects/add-native-code.html\n\n# Sets the minimum version of CMake required to build the native library.\n\ncmake_minimum_required(VERSION 3.4.1)\n\ninclude_directories(${FLATBUFFERS_SRC}/include)\n\nset(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -std=gnu++11 -fexceptions -Wall -DFLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE\")\n\n# Certain platforms such as ARM do not use signed chars by default\n# which causes issues with certain bounds checks.\nset(CMAKE_CXX_FLAGS\n   \"${CMAKE_CXX_FLAGS} -fsigned-char\")\n\nset(FlatBuffers_Library_SRCS\n        ${FLATBUFFERS_SRC}/include/flatbuffers/allocator.h\n        ${FLATBUFFERS_SRC}/include/flatbuffers/array.h\n        ${FLATBUFFERS_SRC}/include/flatbuffers/base.h\n        ${FLATBUFFERS_SRC}/include/flatbuffers/buffer.h\n        ${FLATBUFFERS_SRC}/include/flatbuffers/buffer_ref.h\n        ${FLATBUFFERS_SRC}/include/flatbuffers/default_allocator.h\n        ${FLATBUFFERS_SRC}/include/flatbuffers/detached_buffer.h\n        ${FLATBUFFERS_SRC}/include/flatbuffers/flatbuffer_builder.h\n        ${FLATBUFFERS_SRC}/include/flatbuffers/flatbuffers.h\n        ${FLATBUFFERS_SRC}/include/flatbuffers/flexbuffers.h\n        ${FLATBUFFERS_SRC}/include/flatbuffers/flex_flat_util.h\n        ${FLATBUFFERS_SRC}/include/flatbuffers/hash.h\n        ${FLATBUFFERS_SRC}/include/flatbuffers/idl.h\n        ${FLATBUFFERS_SRC}/include/flatbuffers/minireflect.h\n        ${FLATBUFFERS_SRC}/include/flatbuffers/reflection.h\n        ${FLATBUFFERS_SRC}/include/flatbuffers/reflection_generated.h\n        ${FLATBUFFERS_SRC}/include/flatbuffers/registry.h\n        ${FLATBUFFERS_SRC}/include/flatbuffers/stl_emulation.h\n        ${FLATBUFFERS_SRC}/include/flatbuffers/string.h\n        ${FLATBUFFERS_SRC}/include/flatbuffers/struct.h\n        ${FLATBUFFERS_SRC}/include/flatbuffers/table.h\n        ${FLATBUFFERS_SRC}/include/flatbuffers/util.h\n        ${FLATBUFFERS_SRC}/include/flatbuffers/vector.h\n        ${FLATBUFFERS_SRC}/include/flatbuffers/vector_downward.h\n        ${FLATBUFFERS_SRC}/include/flatbuffers/verifier.h\n        ${FLATBUFFERS_SRC}/src/idl_parser.cpp\n        ${FLATBUFFERS_SRC}/src/idl_gen_text.cpp\n        ${FLATBUFFERS_SRC}/src/reflection.cpp\n        ${FLATBUFFERS_SRC}/src/util.cpp\n        ${FLATBUFFERS_SRC}/src/idl_gen_fbs.cpp\n        ${FLATBUFFERS_SRC}/src/code_generators.cpp\n        )\n\nadd_library( # Sets the name of the library.\n             flatbuffers\n\n             ${FlatBuffers_Library_SRCS}\n             ${Generated_SRCS}\n)\n"
  },
  {
    "path": "android/app/src/main/cpp/generated/animal_generated.h",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n#ifndef FLATBUFFERS_GENERATED_ANIMAL_COM_FBS_APP_H_\n#define FLATBUFFERS_GENERATED_ANIMAL_COM_FBS_APP_H_\n\n#include \"flatbuffers/flatbuffers.h\"\n\n// Ensure the included flatbuffers.h is the same version as when this file was\n// generated, otherwise it may not be compatible.\nstatic_assert(FLATBUFFERS_VERSION_MAJOR == 24 &&\n                  FLATBUFFERS_VERSION_MINOR == 12 &&\n                  FLATBUFFERS_VERSION_REVISION == 23,\n              \"Non-compatible flatbuffers version included\");\n\nnamespace com {\nnamespace fbs {\nnamespace app {\n\nstruct Animal;\nstruct AnimalBuilder;\n\nstruct Animal FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef AnimalBuilder Builder;\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_NAME = 4,\n    VT_SOUND = 6,\n    VT_WEIGHT = 8\n  };\n  const ::flatbuffers::String* name() const {\n    return GetPointer<const ::flatbuffers::String*>(VT_NAME);\n  }\n  const ::flatbuffers::String* sound() const {\n    return GetPointer<const ::flatbuffers::String*>(VT_SOUND);\n  }\n  uint16_t weight() const { return GetField<uint16_t>(VT_WEIGHT, 0); }\n  bool Verify(::flatbuffers::Verifier& verifier) const {\n    return VerifyTableStart(verifier) && VerifyOffset(verifier, VT_NAME) &&\n           verifier.VerifyString(name()) && VerifyOffset(verifier, VT_SOUND) &&\n           verifier.VerifyString(sound()) &&\n           VerifyField<uint16_t>(verifier, VT_WEIGHT, 2) && verifier.EndTable();\n  }\n};\n\nstruct AnimalBuilder {\n  typedef Animal Table;\n  ::flatbuffers::FlatBufferBuilder& fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_name(::flatbuffers::Offset<::flatbuffers::String> name) {\n    fbb_.AddOffset(Animal::VT_NAME, name);\n  }\n  void add_sound(::flatbuffers::Offset<::flatbuffers::String> sound) {\n    fbb_.AddOffset(Animal::VT_SOUND, sound);\n  }\n  void add_weight(uint16_t weight) {\n    fbb_.AddElement<uint16_t>(Animal::VT_WEIGHT, weight, 0);\n  }\n  explicit AnimalBuilder(::flatbuffers::FlatBufferBuilder& _fbb) : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<Animal> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<Animal>(end);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<Animal> CreateAnimal(\n    ::flatbuffers::FlatBufferBuilder& _fbb,\n    ::flatbuffers::Offset<::flatbuffers::String> name = 0,\n    ::flatbuffers::Offset<::flatbuffers::String> sound = 0,\n    uint16_t weight = 0) {\n  AnimalBuilder builder_(_fbb);\n  builder_.add_sound(sound);\n  builder_.add_name(name);\n  builder_.add_weight(weight);\n  return builder_.Finish();\n}\n\ninline ::flatbuffers::Offset<Animal> CreateAnimalDirect(\n    ::flatbuffers::FlatBufferBuilder& _fbb, const char* name = nullptr,\n    const char* sound = nullptr, uint16_t weight = 0) {\n  auto name__ = name ? _fbb.CreateString(name) : 0;\n  auto sound__ = sound ? _fbb.CreateString(sound) : 0;\n  return com::fbs::app::CreateAnimal(_fbb, name__, sound__, weight);\n}\n\ninline const com::fbs::app::Animal* GetAnimal(const void* buf) {\n  return ::flatbuffers::GetRoot<com::fbs::app::Animal>(buf);\n}\n\ninline const com::fbs::app::Animal* GetSizePrefixedAnimal(const void* buf) {\n  return ::flatbuffers::GetSizePrefixedRoot<com::fbs::app::Animal>(buf);\n}\n\ninline bool VerifyAnimalBuffer(::flatbuffers::Verifier& verifier) {\n  return verifier.VerifyBuffer<com::fbs::app::Animal>(nullptr);\n}\n\ninline bool VerifySizePrefixedAnimalBuffer(::flatbuffers::Verifier& verifier) {\n  return verifier.VerifySizePrefixedBuffer<com::fbs::app::Animal>(nullptr);\n}\n\ninline void FinishAnimalBuffer(\n    ::flatbuffers::FlatBufferBuilder& fbb,\n    ::flatbuffers::Offset<com::fbs::app::Animal> root) {\n  fbb.Finish(root);\n}\n\ninline void FinishSizePrefixedAnimalBuffer(\n    ::flatbuffers::FlatBufferBuilder& fbb,\n    ::flatbuffers::Offset<com::fbs::app::Animal> root) {\n  fbb.FinishSizePrefixed(root);\n}\n\n}  // namespace app\n}  // namespace fbs\n}  // namespace com\n\n#endif  // FLATBUFFERS_GENERATED_ANIMAL_COM_FBS_APP_H_\n"
  },
  {
    "path": "android/app/src/main/fbs/animal.fbs",
    "content": "// Copyright 2015 Google Inc. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nnamespace com.fbs.app;\n\ntable Animal {\n  name:string;\n  sound:string;\n  weight: uint16;\n}\n\nroot_type Animal;\n"
  },
  {
    "path": "android/app/src/main/java/com/flatbuffers/app/MainActivity.kt",
    "content": "package com.flatbuffers.app\n\nimport android.annotation.SuppressLint\nimport android.os.Bundle\nimport android.widget.TextView\nimport androidx.appcompat.app.AppCompatActivity\nimport com.fbs.app.Animal\nimport com.google.flatbuffers.FlatBufferBuilder\nimport java.nio.ByteBuffer\n\n@ExperimentalUnsignedTypes\nclass MainActivity : AppCompatActivity() {\n\n  @SuppressLint(\"SetTextI18n\")\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContentView(R.layout.activity_main)\n\n    val tiger = Animal.getRootAsAnimal(ByteBuffer.wrap(createAnimalFromJNI()))\n    findViewById<TextView>(R.id.tv_animal_one).text = animalInfo(tiger)\n\n    findViewById<TextView>(R.id.tv_animal_two).text = animalInfo(createAnimalFromKotlin())\n  }\n\n  // This function is a sample of communicating FlatBuffers between JNI (native C++) and Java.\n  // Implementation can be found on animals.cpp file.\n  private external fun createAnimalFromJNI(): ByteArray\n\n  // Create a \"Cow\" Animal flatbuffers from Kotlin\n  private fun createAnimalFromKotlin(): Animal {\n    val fb = FlatBufferBuilder(100)\n    val cowOffset =\n      Animal.createAnimal(\n        builder = fb,\n        nameOffset = fb.createString(\"Cow\"),\n        soundOffset = fb.createString(\"Moo\"),\n        weight = 720u,\n      )\n    fb.finish(cowOffset)\n    return Animal.getRootAsAnimal(fb.dataBuffer())\n  }\n\n  private fun animalInfo(animal: Animal): String =\n    \"The ${animal.name} sound is ${animal.sound} and it weights ${animal.weight}kg.\"\n\n  companion object {\n    // Used to load the 'native-lib' library on application startup.\n    init {\n      System.loadLibrary(\"native-lib\")\n    }\n  }\n}\n"
  },
  {
    "path": "android/app/src/main/java/generated/com/fbs/app/Animal.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage com.fbs.app\n\nimport com.google.flatbuffers.Constants\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.Table\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\n\n@Suppress(\"unused\")\n@kotlin.ExperimentalUnsignedTypes\nclass Animal : Table() {\n\n  fun __init(_i: Int, _bb: ByteBuffer) {\n    __reset(_i, _bb)\n  }\n\n  fun __assign(_i: Int, _bb: ByteBuffer): Animal {\n    __init(_i, _bb)\n    return this\n  }\n\n  val name: String?\n    get() {\n      val o = __offset(4)\n      return if (o != 0) {\n        __string(o + bb_pos)\n      } else {\n        null\n      }\n    }\n\n  val nameAsByteBuffer: ByteBuffer\n    get() = __vector_as_bytebuffer(4, 1)\n\n  fun nameInByteBuffer(_bb: ByteBuffer): ByteBuffer = __vector_in_bytebuffer(_bb, 4, 1)\n\n  val sound: String?\n    get() {\n      val o = __offset(6)\n      return if (o != 0) {\n        __string(o + bb_pos)\n      } else {\n        null\n      }\n    }\n\n  val soundAsByteBuffer: ByteBuffer\n    get() = __vector_as_bytebuffer(6, 1)\n\n  fun soundInByteBuffer(_bb: ByteBuffer): ByteBuffer = __vector_in_bytebuffer(_bb, 6, 1)\n\n  val weight: UShort\n    get() {\n      val o = __offset(8)\n      return if (o != 0) bb.getShort(o + bb_pos).toUShort() else 0u\n    }\n\n  companion object {\n    fun validateVersion() = Constants.FLATBUFFERS_25_12_19()\n\n    fun getRootAsAnimal(_bb: ByteBuffer): Animal = getRootAsAnimal(_bb, Animal())\n\n    fun getRootAsAnimal(_bb: ByteBuffer, obj: Animal): Animal {\n      _bb.order(ByteOrder.LITTLE_ENDIAN)\n      return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb))\n    }\n\n    fun createAnimal(\n      builder: FlatBufferBuilder,\n      nameOffset: Int,\n      soundOffset: Int,\n      weight: UShort,\n    ): Int {\n      builder.startTable(3)\n      addSound(builder, soundOffset)\n      addName(builder, nameOffset)\n      addWeight(builder, weight)\n      return endAnimal(builder)\n    }\n\n    fun startAnimal(builder: FlatBufferBuilder) = builder.startTable(3)\n\n    fun addName(builder: FlatBufferBuilder, name: Int) = builder.addOffset(0, name, 0)\n\n    fun addSound(builder: FlatBufferBuilder, sound: Int) = builder.addOffset(1, sound, 0)\n\n    fun addWeight(builder: FlatBufferBuilder, weight: UShort) =\n      builder.addShort(2, weight.toShort(), 0)\n\n    fun endAnimal(builder: FlatBufferBuilder): Int {\n      val o = builder.endTable()\n      return o\n    }\n\n    fun finishAnimalBuffer(builder: FlatBufferBuilder, offset: Int) = builder.finish(offset)\n\n    fun finishSizePrefixedAnimalBuffer(builder: FlatBufferBuilder, offset: Int) =\n      builder.finishSizePrefixed(offset)\n  }\n}\n"
  },
  {
    "path": "android/app/src/main/res/drawable/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path\n        android:fillColor=\"#3DDC84\"\n        android:pathData=\"M0,0h108v108h-108z\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M9,0L9,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,0L19,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,0L29,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,0L39,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,0L49,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,0L59,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,0L69,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,0L79,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M89,0L89,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M99,0L99,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,9L108,9\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,19L108,19\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,29L108,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,39L108,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,49L108,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,59L108,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,69L108,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,79L108,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,89L108,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,99L108,99\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,29L89,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,39L89,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,49L89,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,59L89,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,69L89,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,79L89,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,19L29,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,19L39,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,19L49,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,19L59,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,19L69,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,19L79,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n</vector>\n"
  },
  {
    "path": "android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path android:pathData=\"M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z\">\n        <aapt:attr name=\"android:fillColor\">\n            <gradient\n                android:endX=\"85.84757\"\n                android:endY=\"92.4963\"\n                android:startX=\"42.9492\"\n                android:startY=\"49.59793\"\n                android:type=\"linear\">\n                <item\n                    android:color=\"#44000000\"\n                    android:offset=\"0.0\" />\n                <item\n                    android:color=\"#00000000\"\n                    android:offset=\"1.0\" />\n            </gradient>\n        </aapt:attr>\n    </path>\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:fillType=\"nonZero\"\n        android:pathData=\"M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z\"\n        android:strokeWidth=\"1\"\n        android:strokeColor=\"#00000000\" />\n</vector>\n"
  },
  {
    "path": "android/app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"match_parent\"\n  android:orientation=\"vertical\"\n  android:gravity=\"center\"\n  tools:context=\".MainActivity\">\n\n  <TextView\n    android:id=\"@+id/tv_animal_one\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    tools:text=\"Text Sample\"/>\n\n  <TextView\n    android:id=\"@+id/tv_animal_two\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    tools:text=\"Text Sample 2\"/>\n\n</LinearLayout>\n"
  },
  {
    "path": "android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>\n"
  },
  {
    "path": "android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>\n"
  },
  {
    "path": "android/app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#6200EE</color>\n    <color name=\"colorPrimaryDark\">#3700B3</color>\n    <color name=\"colorAccent\">#03DAC5</color>\n</resources>\n"
  },
  {
    "path": "android/app/src/main/res/values/strings.xml",
    "content": "<resources>\n  <string name=\"app_name\">FlatbuffersTestApp</string>\n</resources>\n"
  },
  {
    "path": "android/app/src/main/res/values/styles.xml",
    "content": "<resources>\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.DarkActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "android/build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\nbuildscript {\n  ext.kotlin_version = \"1.7.21\"\n  repositories {\n    google()\n    mavenCentral()\n  }\n  dependencies {\n    classpath 'com.android.tools.build:gradle:7.4.1'\n    classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\n\n    // NOTE: Do not place your application dependencies here; they belong\n    // in the individual module build.gradle files\n  }\n}\n\nallprojects {\n  repositories {\n    google()\n    mavenCentral()\n  }\n}\n\ntasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {\n  sourceCompatibility = JavaVersion.VERSION_1_8\n  targetCompatibility = JavaVersion.VERSION_1_8\n\n  compileKotlin {\n    dependsOn flatbuffer\n  }\n}\n\ntask clean(type: Delete) {\n  delete rootProject.buildDir\n}\n"
  },
  {
    "path": "android/gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.0.1-bin.zip\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "android/gradle.properties",
    "content": "# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\norg.gradle.jvmargs=-Xmx2048m\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n# AndroidX package structure to make it clearer which packages are bundled with the\n# Android operating system, and which are packaged with your app\"s APK\n# https://developer.android.com/topic/libraries/support-library/androidx-rn\nandroid.useAndroidX=true\n# Automatically convert third-party libraries to use AndroidX\nandroid.enableJetifier=true\n# Kotlin code style for this project: \"official\" or \"obsolete\":\nkotlin.code.style=official\n# Use parallel builds\norg.gradle.parallel=true"
  },
  {
    "path": "android/gradlew",
    "content": "#!/usr/bin/env sh\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=$(save \"$@\")\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\n# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong\nif [ \"$(uname)\" = \"Darwin\" ] && [ \"$HOME\" = \"$PWD\" ]; then\n  cd \"$(dirname \"$0\")\"\nfi\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "android/gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto init\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto init\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:init\n@rem Get command-line arguments, handling Windows variants\n\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\n\n:win9xME_args\n@rem Slurp the command line arguments.\nset CMD_LINE_ARGS=\nset _SKIP=2\n\n:win9xME_args_slurp\nif \"x%~1\" == \"x\" goto execute\n\nset CMD_LINE_ARGS=%*\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "android/settings.gradle",
    "content": "include ':app'\nrootProject.name = \"FlatbuffersTest\"\n"
  },
  {
    "path": "bazel/BUILD.bazel",
    "content": ""
  },
  {
    "path": "benchmarks/CMakeLists.txt",
    "content": "# Setup for running Google Benchmarks (https://github.com/google/benchmark) on\n# flatbuffers. This requires both that benchmark library and its dependency gtest\n# to build. Instead of including them here or doing a submodule, this uses\n# FetchContent (https://cmake.org/cmake/help/latest/module/FetchContent.html) to\n# grab the dependencies at config time. This requires CMake 3.14 or higher.\n\ncmake_minimum_required(VERSION 3.14)\ninclude(FetchContent)\n\n# No particular reason for the specific GIT_TAGs for the following repos, they\n# were just the latest releases when this was added.\nFetchContent_Declare(\n    googletest\n    GIT_REPOSITORY https://github.com/google/googletest.git\n    GIT_TAG        e2239ee6043f73722e7aa812a459f54a28552929 # release-1.11.0\n)\nFetchContent_Declare(\n    googlebenchmark\n    GIT_REPOSITORY https://github.com/google/benchmark.git\n    GIT_TAG        0d98dba29d66e93259db7daa53a9327df767a415 # v1.6.1\n)\n\n# For Windows: Prevent overriding the parent project's compiler/linker \n# settings.\nset(gtest_force_shared_crt ON CACHE BOOL \"\" FORCE)\nFetchContent_MakeAvailable(\n    googletest\n    googlebenchmark\n)\n\nset(CPP_BENCH_DIR ${CMAKE_CURRENT_SOURCE_DIR}/cpp)\nset(CPP_FB_BENCH_DIR ${CPP_BENCH_DIR}/flatbuffers)\nset(CPP_RAW_BENCH_DIR ${CPP_BENCH_DIR}/raw)\nset(CPP_BENCH_FBS ${CPP_FB_BENCH_DIR}/bench.fbs)\nset(CPP_BENCH_FB_GEN ${CPP_FB_BENCH_DIR}/bench_generated.h)\n\nset(FlatBenchmark_SRCS\n    ${CPP_BENCH_DIR}/benchmark_main.cpp\n    ${CPP_FB_BENCH_DIR}/fb_bench.cpp\n    ${CPP_RAW_BENCH_DIR}/raw_bench.cpp\n    ${CPP_BENCH_FB_GEN}\n)\n\n# Generate the flatbuffers benchmark code from the flatbuffers schema using\n# flatc itself, thus it depends on flatc. This also depends on the C++ runtime\n# flatbuffers and the schema file itself, so it should auto-generated at the\n# correct times.\nadd_custom_command(\n    OUTPUT ${CPP_BENCH_FB_GEN}\n    COMMAND \n        \"${FLATBUFFERS_FLATC_EXECUTABLE}\"\n        --cpp\n        -o ${CPP_FB_BENCH_DIR}\n        ${CPP_BENCH_FBS}\n    DEPENDS \n        flatc\n        flatbuffers\n        ${CPP_BENCH_FBS}\n    COMMENT \"Run Flatbuffers Benchmark Codegen: ${CPP_BENCH_FB_GEN}\"\n    VERBATIM)\n\n# The main flatbuffers benchmark executable\nadd_executable(flatbenchmark ${FlatBenchmark_SRCS})\n\n# Benchmark requires C++11 \ntarget_compile_features(flatbenchmark PRIVATE\n    cxx_std_11 # requires cmake 3.8\n)\n\ntarget_compile_options(flatbenchmark\n    PRIVATE\n        -fno-aligned-new\n        -Wno-deprecated-declarations\n)\n\n# Set the output directory to the root binary directory\nset_target_properties(flatbenchmark \n    PROPERTIES RUNTIME_OUTPUT_DIRECTORY \n    \"${CMAKE_BINARY_DIR}\"\n)\n\n# The includes of the benchmark files are fully qualified from flatbuffers root.\ntarget_include_directories(flatbenchmark PUBLIC ${CMAKE_SOURCE_DIR})\n\ntarget_link_libraries(flatbenchmark PRIVATE\n    benchmark::benchmark_main # _main to use their entry point \n    gtest # Link to gtest so we can also assert in the benchmarks\n)"
  },
  {
    "path": "benchmarks/cpp/bench.h",
    "content": "#ifndef BENCHMARKS_CPP_BENCH_H_\n#define BENCHMARKS_CPP_BENCH_H_\n\n#include <cstdint>\n\nstruct Bench {\n  virtual ~Bench() {}\n\n  inline void Add(int64_t value) { sum += value; }\n\n  virtual uint8_t* Encode(void* buf, int64_t& len) = 0;\n  virtual void* Decode(void* buf, int64_t len) = 0;\n  virtual int64_t Use(void* decoded) = 0;\n  virtual void Dealloc(void* decoded) = 0;\n\n  int64_t sum = 0;\n};\n\n#endif  // BENCHMARKS_CPP_BENCH_H_"
  },
  {
    "path": "benchmarks/cpp/benchmark_main.cpp",
    "content": "#include <benchmark/benchmark.h>\n#include <gtest/gtest.h>\n\n#include \"benchmarks/cpp/bench.h\"\n#include \"benchmarks/cpp/flatbuffers/fb_bench.h\"\n#include \"benchmarks/cpp/raw/raw_bench.h\"\n\nstatic inline void Encode(benchmark::State& state,\n                          std::unique_ptr<Bench>& bench, uint8_t* buffer) {\n  int64_t length;\n  for (auto _ : state) {\n    bench->Encode(buffer, length);\n    benchmark::DoNotOptimize(length);\n  }\n}\n\nstatic inline void Decode(benchmark::State& state,\n                          std::unique_ptr<Bench>& bench, uint8_t* buffer) {\n  int64_t length;\n  uint8_t* encoded = bench->Encode(buffer, length);\n\n  for (auto _ : state) {\n    void* decoded = bench->Decode(encoded, length);\n    benchmark::DoNotOptimize(decoded);\n  }\n}\n\nstatic inline void Use(benchmark::State& state, std::unique_ptr<Bench>& bench,\n                       uint8_t* buffer, int64_t check_sum) {\n  int64_t length;\n  uint8_t* encoded = bench->Encode(buffer, length);\n  void* decoded = bench->Decode(encoded, length);\n\n  int64_t sum = 0;\n\n  for (auto _ : state) {\n    sum = bench->Use(decoded);\n  }\n\n  EXPECT_EQ(sum, check_sum);\n}\n\nstatic void BM_Flatbuffers_Encode(benchmark::State& state) {\n  const int64_t kBufferLength = 1024;\n  uint8_t buffer[kBufferLength];\n\n  StaticAllocator allocator(&buffer[0]);\n  std::unique_ptr<Bench> bench = NewFlatBuffersBench(kBufferLength, &allocator);\n  Encode(state, bench, buffer);\n}\nBENCHMARK(BM_Flatbuffers_Encode);\n\nstatic void BM_Flatbuffers_Decode(benchmark::State& state) {\n  const int64_t kBufferLength = 1024;\n  uint8_t buffer[kBufferLength];\n\n  StaticAllocator allocator(&buffer[0]);\n  std::unique_ptr<Bench> bench = NewFlatBuffersBench(kBufferLength, &allocator);\n  Decode(state, bench, buffer);\n}\nBENCHMARK(BM_Flatbuffers_Decode);\n\nstatic void BM_Flatbuffers_Use(benchmark::State& state) {\n  const int64_t kBufferLength = 1024;\n  uint8_t buffer[kBufferLength];\n\n  StaticAllocator allocator(&buffer[0]);\n  std::unique_ptr<Bench> bench = NewFlatBuffersBench(kBufferLength, &allocator);\n  Use(state, bench, buffer, 218812692406581874);\n}\nBENCHMARK(BM_Flatbuffers_Use);\n\nstatic void BM_Raw_Encode(benchmark::State& state) {\n  const int64_t kBufferLength = 1024;\n  uint8_t buffer[kBufferLength];\n\n  std::unique_ptr<Bench> bench = NewRawBench();\n  Encode(state, bench, buffer);\n}\nBENCHMARK(BM_Raw_Encode);\n\nstatic void BM_Raw_Decode(benchmark::State& state) {\n  const int64_t kBufferLength = 1024;\n  uint8_t buffer[kBufferLength];\n\n  std::unique_ptr<Bench> bench = NewRawBench();\n  Decode(state, bench, buffer);\n}\nBENCHMARK(BM_Raw_Decode);\n\nstatic void BM_Raw_Use(benchmark::State& state) {\n  const int64_t kBufferLength = 1024;\n  uint8_t buffer[kBufferLength];\n\n  std::unique_ptr<Bench> bench = NewRawBench();\n  Use(state, bench, buffer, 218812692406581874);\n}\nBENCHMARK(BM_Raw_Use);\n"
  },
  {
    "path": "benchmarks/cpp/flatbuffers/bench.fbs",
    "content": "// Copyright 2021 Google Inc. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n// trying to represent a typical mix of datatypes:\n// 1 array of 3 elements, each element: 1 string, 3 nested objects, 9 scalars\n// root element has the array, additional string and an enum\n\nnamespace benchmarks_flatbuffers;\n\nenum Enum : short { Apples, Pears, Bananas}\n\nstruct Foo {\n  id:ulong;\n  count:short;\n  prefix:byte;\n  length:uint;\n}\n\nstruct Bar {\n  parent:Foo;\n  time:int;\n  ratio:float;\n  size:ushort;\n}\n\ntable FooBar {\n  sibling:Bar;\n  name:string;\n  rating:double;\n  postfix:ubyte;\n}\n\ntable FooBarContainer {\n  list:[FooBar];  // 3 copies of the above\n  initialized:bool;\n  fruit:Enum;\n  location:string;\n}\n\nroot_type FooBarContainer;\n"
  },
  {
    "path": "benchmarks/cpp/flatbuffers/bench_generated.h",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n#ifndef FLATBUFFERS_GENERATED_BENCH_BENCHMARKS_FLATBUFFERS_H_\n#define FLATBUFFERS_GENERATED_BENCH_BENCHMARKS_FLATBUFFERS_H_\n\n#include \"flatbuffers/flatbuffers.h\"\n\n// Ensure the included flatbuffers.h is the same version as when this file was\n// generated, otherwise it may not be compatible.\nstatic_assert(FLATBUFFERS_VERSION_MAJOR == 24 &&\n                  FLATBUFFERS_VERSION_MINOR == 12 &&\n                  FLATBUFFERS_VERSION_REVISION == 23,\n              \"Non-compatible flatbuffers version included\");\n\nnamespace benchmarks_flatbuffers {\n\nstruct Foo;\n\nstruct Bar;\n\nstruct FooBar;\nstruct FooBarBuilder;\n\nstruct FooBarContainer;\nstruct FooBarContainerBuilder;\n\nenum Enum : int16_t {\n  Enum_Apples = 0,\n  Enum_Pears = 1,\n  Enum_Bananas = 2,\n  Enum_MIN = Enum_Apples,\n  Enum_MAX = Enum_Bananas\n};\n\ninline const Enum (&EnumValuesEnum())[3] {\n  static const Enum values[] = {Enum_Apples, Enum_Pears, Enum_Bananas};\n  return values;\n}\n\ninline const char* const* EnumNamesEnum() {\n  static const char* const names[4] = {\"Apples\", \"Pears\", \"Bananas\", nullptr};\n  return names;\n}\n\ninline const char* EnumNameEnum(Enum e) {\n  if (flatbuffers::IsOutRange(e, Enum_Apples, Enum_Bananas)) return \"\";\n  const size_t index = static_cast<size_t>(e);\n  return EnumNamesEnum()[index];\n}\n\nFLATBUFFERS_MANUALLY_ALIGNED_STRUCT(8) Foo FLATBUFFERS_FINAL_CLASS {\n private:\n  uint64_t id_;\n  int16_t count_;\n  int8_t prefix_;\n  int8_t padding0__;\n  uint32_t length_;\n\n public:\n  Foo() : id_(0), count_(0), prefix_(0), padding0__(0), length_(0) {\n    (void)padding0__;\n  }\n  Foo(uint64_t _id, int16_t _count, int8_t _prefix, uint32_t _length)\n      : id_(flatbuffers::EndianScalar(_id)),\n        count_(flatbuffers::EndianScalar(_count)),\n        prefix_(flatbuffers::EndianScalar(_prefix)),\n        padding0__(0),\n        length_(flatbuffers::EndianScalar(_length)) {\n    (void)padding0__;\n  }\n  uint64_t id() const { return flatbuffers::EndianScalar(id_); }\n  int16_t count() const { return flatbuffers::EndianScalar(count_); }\n  int8_t prefix() const { return flatbuffers::EndianScalar(prefix_); }\n  uint32_t length() const { return flatbuffers::EndianScalar(length_); }\n};\nFLATBUFFERS_STRUCT_END(Foo, 16);\n\nFLATBUFFERS_MANUALLY_ALIGNED_STRUCT(8) Bar FLATBUFFERS_FINAL_CLASS {\n private:\n  benchmarks_flatbuffers::Foo parent_;\n  int32_t time_;\n  float ratio_;\n  uint16_t size_;\n  int16_t padding0__;\n  int32_t padding1__;\n\n public:\n  Bar()\n      : parent_(), time_(0), ratio_(0), size_(0), padding0__(0), padding1__(0) {\n    (void)padding0__;\n    (void)padding1__;\n  }\n  Bar(const benchmarks_flatbuffers::Foo& _parent, int32_t _time, float _ratio,\n      uint16_t _size)\n      : parent_(_parent),\n        time_(flatbuffers::EndianScalar(_time)),\n        ratio_(flatbuffers::EndianScalar(_ratio)),\n        size_(flatbuffers::EndianScalar(_size)),\n        padding0__(0),\n        padding1__(0) {\n    (void)padding0__;\n    (void)padding1__;\n  }\n  const benchmarks_flatbuffers::Foo& parent() const { return parent_; }\n  int32_t time() const { return flatbuffers::EndianScalar(time_); }\n  float ratio() const { return flatbuffers::EndianScalar(ratio_); }\n  uint16_t size() const { return flatbuffers::EndianScalar(size_); }\n};\nFLATBUFFERS_STRUCT_END(Bar, 32);\n\nstruct FooBar FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {\n  typedef FooBarBuilder Builder;\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_SIBLING = 4,\n    VT_NAME = 6,\n    VT_RATING = 8,\n    VT_POSTFIX = 10\n  };\n  const benchmarks_flatbuffers::Bar* sibling() const {\n    return GetStruct<const benchmarks_flatbuffers::Bar*>(VT_SIBLING);\n  }\n  const flatbuffers::String* name() const {\n    return GetPointer<const flatbuffers::String*>(VT_NAME);\n  }\n  double rating() const { return GetField<double>(VT_RATING, 0.0); }\n  uint8_t postfix() const { return GetField<uint8_t>(VT_POSTFIX, 0); }\n  bool Verify(flatbuffers::Verifier& verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyField<benchmarks_flatbuffers::Bar>(verifier, VT_SIBLING, 8) &&\n           VerifyOffset(verifier, VT_NAME) && verifier.VerifyString(name()) &&\n           VerifyField<double>(verifier, VT_RATING, 8) &&\n           VerifyField<uint8_t>(verifier, VT_POSTFIX, 1) && verifier.EndTable();\n  }\n};\n\nstruct FooBarBuilder {\n  typedef FooBar Table;\n  flatbuffers::FlatBufferBuilder& fbb_;\n  flatbuffers::uoffset_t start_;\n  void add_sibling(const benchmarks_flatbuffers::Bar* sibling) {\n    fbb_.AddStruct(FooBar::VT_SIBLING, sibling);\n  }\n  void add_name(flatbuffers::Offset<flatbuffers::String> name) {\n    fbb_.AddOffset(FooBar::VT_NAME, name);\n  }\n  void add_rating(double rating) {\n    fbb_.AddElement<double>(FooBar::VT_RATING, rating, 0.0);\n  }\n  void add_postfix(uint8_t postfix) {\n    fbb_.AddElement<uint8_t>(FooBar::VT_POSTFIX, postfix, 0);\n  }\n  explicit FooBarBuilder(flatbuffers::FlatBufferBuilder& _fbb) : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  flatbuffers::Offset<FooBar> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = flatbuffers::Offset<FooBar>(end);\n    return o;\n  }\n};\n\ninline flatbuffers::Offset<FooBar> CreateFooBar(\n    flatbuffers::FlatBufferBuilder& _fbb,\n    const benchmarks_flatbuffers::Bar* sibling = nullptr,\n    flatbuffers::Offset<flatbuffers::String> name = 0, double rating = 0.0,\n    uint8_t postfix = 0) {\n  FooBarBuilder builder_(_fbb);\n  builder_.add_rating(rating);\n  builder_.add_name(name);\n  builder_.add_sibling(sibling);\n  builder_.add_postfix(postfix);\n  return builder_.Finish();\n}\n\ninline flatbuffers::Offset<FooBar> CreateFooBarDirect(\n    flatbuffers::FlatBufferBuilder& _fbb,\n    const benchmarks_flatbuffers::Bar* sibling = nullptr,\n    const char* name = nullptr, double rating = 0.0, uint8_t postfix = 0) {\n  auto name__ = name ? _fbb.CreateString(name) : 0;\n  return benchmarks_flatbuffers::CreateFooBar(_fbb, sibling, name__, rating,\n                                              postfix);\n}\n\nstruct FooBarContainer FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {\n  typedef FooBarContainerBuilder Builder;\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_LIST = 4,\n    VT_INITIALIZED = 6,\n    VT_FRUIT = 8,\n    VT_LOCATION = 10\n  };\n  const flatbuffers::Vector<\n      flatbuffers::Offset<benchmarks_flatbuffers::FooBar>>*\n  list() const {\n    return GetPointer<const flatbuffers::Vector<\n        flatbuffers::Offset<benchmarks_flatbuffers::FooBar>>*>(VT_LIST);\n  }\n  bool initialized() const { return GetField<uint8_t>(VT_INITIALIZED, 0) != 0; }\n  benchmarks_flatbuffers::Enum fruit() const {\n    return static_cast<benchmarks_flatbuffers::Enum>(\n        GetField<int16_t>(VT_FRUIT, 0));\n  }\n  const flatbuffers::String* location() const {\n    return GetPointer<const flatbuffers::String*>(VT_LOCATION);\n  }\n  bool Verify(flatbuffers::Verifier& verifier) const {\n    return VerifyTableStart(verifier) && VerifyOffset(verifier, VT_LIST) &&\n           verifier.VerifyVector(list()) &&\n           verifier.VerifyVectorOfTables(list()) &&\n           VerifyField<uint8_t>(verifier, VT_INITIALIZED, 1) &&\n           VerifyField<int16_t>(verifier, VT_FRUIT, 2) &&\n           VerifyOffset(verifier, VT_LOCATION) &&\n           verifier.VerifyString(location()) && verifier.EndTable();\n  }\n};\n\nstruct FooBarContainerBuilder {\n  typedef FooBarContainer Table;\n  flatbuffers::FlatBufferBuilder& fbb_;\n  flatbuffers::uoffset_t start_;\n  void add_list(flatbuffers::Offset<flatbuffers::Vector<\n                    flatbuffers::Offset<benchmarks_flatbuffers::FooBar>>>\n                    list) {\n    fbb_.AddOffset(FooBarContainer::VT_LIST, list);\n  }\n  void add_initialized(bool initialized) {\n    fbb_.AddElement<uint8_t>(FooBarContainer::VT_INITIALIZED,\n                             static_cast<uint8_t>(initialized), 0);\n  }\n  void add_fruit(benchmarks_flatbuffers::Enum fruit) {\n    fbb_.AddElement<int16_t>(FooBarContainer::VT_FRUIT,\n                             static_cast<int16_t>(fruit), 0);\n  }\n  void add_location(flatbuffers::Offset<flatbuffers::String> location) {\n    fbb_.AddOffset(FooBarContainer::VT_LOCATION, location);\n  }\n  explicit FooBarContainerBuilder(flatbuffers::FlatBufferBuilder& _fbb)\n      : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  flatbuffers::Offset<FooBarContainer> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = flatbuffers::Offset<FooBarContainer>(end);\n    return o;\n  }\n};\n\ninline flatbuffers::Offset<FooBarContainer> CreateFooBarContainer(\n    flatbuffers::FlatBufferBuilder& _fbb,\n    flatbuffers::Offset<flatbuffers::Vector<\n        flatbuffers::Offset<benchmarks_flatbuffers::FooBar>>>\n        list = 0,\n    bool initialized = false,\n    benchmarks_flatbuffers::Enum fruit = benchmarks_flatbuffers::Enum_Apples,\n    flatbuffers::Offset<flatbuffers::String> location = 0) {\n  FooBarContainerBuilder builder_(_fbb);\n  builder_.add_location(location);\n  builder_.add_list(list);\n  builder_.add_fruit(fruit);\n  builder_.add_initialized(initialized);\n  return builder_.Finish();\n}\n\ninline flatbuffers::Offset<FooBarContainer> CreateFooBarContainerDirect(\n    flatbuffers::FlatBufferBuilder& _fbb,\n    const std::vector<flatbuffers::Offset<benchmarks_flatbuffers::FooBar>>*\n        list = nullptr,\n    bool initialized = false,\n    benchmarks_flatbuffers::Enum fruit = benchmarks_flatbuffers::Enum_Apples,\n    const char* location = nullptr) {\n  auto list__ =\n      list ? _fbb.CreateVector<\n                 flatbuffers::Offset<benchmarks_flatbuffers::FooBar>>(*list)\n           : 0;\n  auto location__ = location ? _fbb.CreateString(location) : 0;\n  return benchmarks_flatbuffers::CreateFooBarContainer(\n      _fbb, list__, initialized, fruit, location__);\n}\n\ninline const benchmarks_flatbuffers::FooBarContainer* GetFooBarContainer(\n    const void* buf) {\n  return flatbuffers::GetRoot<benchmarks_flatbuffers::FooBarContainer>(buf);\n}\n\ninline const benchmarks_flatbuffers::FooBarContainer*\nGetSizePrefixedFooBarContainer(const void* buf) {\n  return flatbuffers::GetSizePrefixedRoot<\n      benchmarks_flatbuffers::FooBarContainer>(buf);\n}\n\ninline bool VerifyFooBarContainerBuffer(flatbuffers::Verifier& verifier) {\n  return verifier.VerifyBuffer<benchmarks_flatbuffers::FooBarContainer>(\n      nullptr);\n}\n\ninline bool VerifySizePrefixedFooBarContainerBuffer(\n    flatbuffers::Verifier& verifier) {\n  return verifier\n      .VerifySizePrefixedBuffer<benchmarks_flatbuffers::FooBarContainer>(\n          nullptr);\n}\n\ninline void FinishFooBarContainerBuffer(\n    flatbuffers::FlatBufferBuilder& fbb,\n    flatbuffers::Offset<benchmarks_flatbuffers::FooBarContainer> root) {\n  fbb.Finish(root);\n}\n\ninline void FinishSizePrefixedFooBarContainerBuffer(\n    flatbuffers::FlatBufferBuilder& fbb,\n    flatbuffers::Offset<benchmarks_flatbuffers::FooBarContainer> root) {\n  fbb.FinishSizePrefixed(root);\n}\n\n}  // namespace benchmarks_flatbuffers\n\n#endif  // FLATBUFFERS_GENERATED_BENCH_BENCHMARKS_FLATBUFFERS_H_\n"
  },
  {
    "path": "benchmarks/cpp/flatbuffers/fb_bench.cpp",
    "content": "#include \"benchmarks/cpp/flatbuffers/fb_bench.h\"\n\n#include <cstdint>\n#include <memory>\n\n#include \"benchmarks/cpp/bench.h\"\n#include \"benchmarks/cpp/flatbuffers/bench_generated.h\"\n#include \"flatbuffers/flatbuffers.h\"\n\nusing namespace flatbuffers;\nusing namespace benchmarks_flatbuffers;\n\nnamespace {\n\nstruct FlatBufferBench : Bench {\n  explicit FlatBufferBench(int64_t initial_size, Allocator* allocator)\n      : fbb(initial_size, allocator, false) {}\n\n  uint8_t* Encode(void*, int64_t& len) override {\n    fbb.Clear();\n\n    const int kVectorLength = 3;\n    Offset<FooBar> vec[kVectorLength];\n\n    for (int i = 0; i < kVectorLength; ++i) {\n      Foo foo(0xABADCAFEABADCAFE + i, 10000 + i, '@' + i, 1000000 + i);\n      Bar bar(foo, 123456 + i, 3.14159f + i, 10000 + i);\n      auto name = fbb.CreateString(\"Hello, World!\");\n      auto foobar =\n          CreateFooBar(fbb, &bar, name, 3.1415432432445543543 + i, '!' + i);\n      vec[i] = foobar;\n    }\n    auto location = fbb.CreateString(\"http://google.com/flatbuffers/\");\n    auto foobarvec = fbb.CreateVector(vec, kVectorLength);\n    auto foobarcontainer =\n        CreateFooBarContainer(fbb, foobarvec, true, Enum_Bananas, location);\n    fbb.Finish(foobarcontainer);\n\n    len = fbb.GetSize();\n    return fbb.GetBufferPointer();\n  }\n\n  int64_t Use(void* decoded) override {\n    sum = 0;\n    auto foobarcontainer = GetFooBarContainer(decoded);\n    sum = 0;\n    Add(foobarcontainer->initialized());\n    Add(foobarcontainer->location()->Length());\n    Add(foobarcontainer->fruit());\n    for (unsigned int i = 0; i < foobarcontainer->list()->Length(); i++) {\n      auto foobar = foobarcontainer->list()->Get(i);\n      Add(foobar->name()->Length());\n      Add(foobar->postfix());\n      Add(static_cast<int64_t>(foobar->rating()));\n      auto bar = foobar->sibling();\n      Add(static_cast<int64_t>(bar->ratio()));\n      Add(bar->size());\n      Add(bar->time());\n      auto& foo = bar->parent();\n      Add(foo.count());\n      Add(foo.id());\n      Add(foo.length());\n      Add(foo.prefix());\n    }\n    return sum;\n  }\n\n  void* Decode(void* buffer, int64_t) override { return buffer; }\n  void Dealloc(void*) override {};\n\n  FlatBufferBuilder fbb;\n};\n\n}  // namespace\n\nstd::unique_ptr<Bench> NewFlatBuffersBench(int64_t initial_size,\n                                           Allocator* allocator) {\n  return std::unique_ptr<FlatBufferBench>(\n      new FlatBufferBench(initial_size, allocator));\n}\n"
  },
  {
    "path": "benchmarks/cpp/flatbuffers/fb_bench.h",
    "content": "#ifndef BENCHMARKS_CPP_FLATBUFFERS_FB_BENCH_H_\n#define BENCHMARKS_CPP_FLATBUFFERS_FB_BENCH_H_\n\n#include <cstdint>\n#include <memory>\n\n#include \"benchmarks/cpp/bench.h\"\n#include \"include/flatbuffers/flatbuffers.h\"\n\nstruct StaticAllocator : public flatbuffers::Allocator {\n  explicit StaticAllocator(uint8_t* buffer) : buffer_(buffer) {}\n\n  uint8_t* allocate(size_t) override { return buffer_; }\n\n  void deallocate(uint8_t*, size_t) override {}\n\n  uint8_t* buffer_;\n};\n\nstd::unique_ptr<Bench> NewFlatBuffersBench(\n    int64_t initial_size = 1024, flatbuffers::Allocator* allocator = nullptr);\n\n#endif  // BENCHMARKS_CPP_FLATBUFFERS_FB_BENCH_H_"
  },
  {
    "path": "benchmarks/cpp/raw/raw_bench.cpp",
    "content": "#include \"benchmarks/cpp/raw/raw_bench.h\"\n\n#include <cstdint>\n#include <cstring>\n#include <memory>\n\n#include \"benchmarks/cpp/bench.h\"\n\nnamespace {\nconst int64_t kStringLength = 32;\nconst int64_t kVectorLength = 3;\n\nenum Enum { Apples, Pears, Bananas };\n\nstruct Foo {\n  int64_t id;\n  short count;\n  char prefix;\n  int length;\n};\n\nstruct Bar {\n  Foo parent;\n  int time;\n  float ratio;\n  unsigned short size;\n};\n\nstruct FooBar {\n  Bar sibling;\n  // We have to stick this in, otherwise strlen() will make it slower than\n  // FlatBuffers:\n  int name_len;\n  char name[kStringLength];\n  double rating;\n  unsigned char postfix;\n};\n\nstruct FooBarContainer {\n  FooBar list[kVectorLength];  // 3 copies of the above\n  bool initialized;\n  Enum fruit;\n  int location_len;\n  char location[kStringLength];\n};\n\nstruct RawBench : Bench {\n  uint8_t* Encode(void* buf, int64_t& len) override {\n    FooBarContainer* fbc = new (buf) FooBarContainer;\n    strcpy(fbc->location, \"http://google.com/flatbuffers/\");  // Unsafe eek!\n    fbc->location_len = (int)strlen(fbc->location);\n    fbc->fruit = Bananas;\n    fbc->initialized = true;\n    for (int i = 0; i < kVectorLength; i++) {\n      // We add + i to not make these identical copies for a more realistic\n      // compression test.\n      auto& foobar = fbc->list[i];\n      foobar.rating = 3.1415432432445543543 + i;\n      foobar.postfix = '!' + i;\n      strcpy(foobar.name, \"Hello, World!\");\n      foobar.name_len = (int)strlen(foobar.name);\n      auto& bar = foobar.sibling;\n      bar.ratio = 3.14159f + i;\n      bar.size = 10000 + i;\n      bar.time = 123456 + i;\n      auto& foo = bar.parent;\n      foo.id = 0xABADCAFEABADCAFE + i;\n      foo.count = 10000 + i;\n      foo.length = 1000000 + i;\n      foo.prefix = '@' + i;\n    }\n\n    len = sizeof(FooBarContainer);\n    return reinterpret_cast<uint8_t*>(fbc);\n  };\n\n  int64_t Use(void* decoded) override {\n    auto foobarcontainer = reinterpret_cast<FooBarContainer*>(decoded);\n    sum = 0;\n    Add(foobarcontainer->initialized);\n    Add(foobarcontainer->location_len);\n    Add(foobarcontainer->fruit);\n    for (unsigned int i = 0; i < kVectorLength; i++) {\n      auto foobar = &foobarcontainer->list[i];\n      Add(foobar->name_len);\n      Add(foobar->postfix);\n      Add(static_cast<int64_t>(foobar->rating));\n      auto bar = &foobar->sibling;\n      Add(static_cast<int64_t>(bar->ratio));\n      Add(bar->size);\n      Add(bar->time);\n      auto& foo = bar->parent;\n      Add(foo.count);\n      Add(foo.id);\n      Add(foo.length);\n      Add(foo.prefix);\n    }\n    return sum;\n  }\n\n  void* Decode(void* buf, int64_t) override { return buf; }\n  void Dealloc(void*) override {};\n};\n\n}  // namespace\n\nstd::unique_ptr<Bench> NewRawBench() {\n  return std::unique_ptr<RawBench>(new RawBench());\n}\n"
  },
  {
    "path": "benchmarks/cpp/raw/raw_bench.h",
    "content": "#ifndef BENCHMARKS_CPP_RAW_RAW_BENCH_H_\n#define BENCHMARKS_CPP_RAW_RAW_BENCH_H_\n\n#include <memory>\n\n#include \"benchmarks/cpp/bench.h\"\n\nstd::unique_ptr<Bench> NewRawBench();\n\n#endif  // BENCHMARKS_CPP_RAW_RAW_BENCH_H_"
  },
  {
    "path": "benchmarks/swift/Benchmarks/FlatbuffersBenchmarks/FlatbuffersBenchmarks.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Benchmark\nimport FlatBuffers\nimport Foundation\n\n@usableFromInline\nstruct AA: NativeStruct {\n  public init(a: Double, b: Double) {\n    self.a = a\n    self.b = b\n  }\n  var a: Double\n  var b: Double\n}\n\nlet benchmarks = {\n  let oneGB: Int32 = 1_024_000_000\n  let data = {\n    var array = [8888.88, 8888.88]\n    var data = Data()\n    array.withUnsafeBytes { ptr in\n      data.append(contentsOf: ptr)\n    }\n    return data\n  }()\n  let ints: [Int] = Array(repeating: 42, count: 100)\n  let bytes: [UInt8] = Array(repeating: 42, count: 100)\n  let str10 = (0...9).map { _ -> String in \"x\" }.joined()\n  let str100 = (0...99).map { _ -> String in \"x\" }.joined()\n  let array: [AA] = [\n    AA(a: 2.4, b: 2.4),\n    AA(a: 2.4, b: 2.4),\n    AA(a: 2.4, b: 2.4),\n    AA(a: 2.4, b: 2.4),\n    AA(a: 2.4, b: 2.4),\n  ]\n\n  let metrics: [BenchmarkMetric] = [\n    .cpuTotal,\n    .wallClock,\n    .mallocCountTotal,\n    .releaseCount,\n    .peakMemoryResident,\n  ]\n  let maxIterations = 1_000_000\n  let maxDuration: Duration = .seconds(3)\n  let singleConfiguration: Benchmark.Configuration = .init(\n    metrics: metrics,\n    warmupIterations: 1,\n    scalingFactor: .one,\n    maxDuration: maxDuration,\n    maxIterations: maxIterations)\n  let kiloConfiguration: Benchmark.Configuration = .init(\n    metrics: metrics,\n    warmupIterations: 1,\n    scalingFactor: .kilo,\n    maxDuration: maxDuration,\n    maxIterations: maxIterations)\n  let megaConfiguration: Benchmark.Configuration = .init(\n    metrics: metrics,\n    warmupIterations: 1,\n    scalingFactor: .mega,\n    maxDuration: maxDuration,\n    maxIterations: maxIterations)\n\n  Benchmark.defaultConfiguration = megaConfiguration\n\n  Benchmark(\"Allocating 1GB\", configuration: singleConfiguration) { benchmark in\n    for _ in benchmark.scaledIterations {\n      blackHole(FlatBufferBuilder(initialSize: oneGB))\n    }\n  }\n\n  Benchmark(\n    \"Allocating ByteBuffer 1GB\",\n    configuration: singleConfiguration)\n  { benchmark in\n    let memory = UnsafeMutableRawPointer.allocate(\n      byteCount: 1_024_000_000,\n      alignment: 1)\n    benchmark.startMeasurement()\n    for _ in benchmark.scaledIterations {\n      blackHole(ByteBuffer(assumingMemoryBound: memory, capacity: Int(oneGB)))\n    }\n  }\n\n  Benchmark(\"Clearing 1GB\", configuration: singleConfiguration) { benchmark in\n    var fb = FlatBufferBuilder(initialSize: oneGB)\n    benchmark.startMeasurement()\n    for _ in benchmark.scaledIterations {\n      blackHole(fb.clear())\n    }\n  }\n\n  Benchmark(\"Strings 10\") { benchmark in\n    var fb = FlatBufferBuilder(initialSize: 1 << 20)\n    benchmark.startMeasurement()\n    for _ in benchmark.scaledIterations {\n      blackHole(fb.create(string: str10))\n    }\n  }\n\n  Benchmark(\"Strings 100\") { benchmark in\n    var fb = FlatBufferBuilder(initialSize: 1 << 20)\n    benchmark.startMeasurement()\n    for _ in benchmark.scaledIterations {\n      blackHole(fb.create(string: str100))\n    }\n  }\n\n  Benchmark(\"Vector 1 Bytes\") { benchmark in\n    var fb = FlatBufferBuilder(initialSize: 1 << 20)\n    benchmark.startMeasurement()\n    for _ in benchmark.scaledIterations {\n      blackHole(fb.createVector(bytes: bytes))\n    }\n  }\n\n  Benchmark(\"Vector 1 Ints\") { benchmark in\n    var fb = FlatBufferBuilder(initialSize: 1 << 20)\n    benchmark.startMeasurement()\n    for _ in benchmark.scaledIterations {\n      blackHole(fb.createVector(ints))\n    }\n  }\n\n  Benchmark(\"Vector 100 Ints\") { benchmark in\n    var fb = FlatBufferBuilder(initialSize: 1 << 20)\n    benchmark.startMeasurement()\n    for i in benchmark.scaledIterations {\n      blackHole(fb.createVector(ints))\n    }\n  }\n\n  Benchmark(\"Vector 100 Bytes\") { benchmark in\n    var fb = FlatBufferBuilder(initialSize: 1 << 20)\n    benchmark.startMeasurement()\n    for i in benchmark.scaledIterations {\n      blackHole(fb.createVector(bytes))\n    }\n  }\n\n  Benchmark(\"Vector 100 ContiguousBytes\") { benchmark in\n    var fb = FlatBufferBuilder(initialSize: 1 << 20)\n    benchmark.startMeasurement()\n    for i in benchmark.scaledIterations {\n      blackHole(fb.createVector(bytes: bytes))\n    }\n  }\n\n  Benchmark(\n    \"FlatBufferBuilder Add\",\n    configuration: kiloConfiguration)\n  { benchmark in\n    var fb = FlatBufferBuilder(initialSize: 1024 * 1024 * 32)\n    benchmark.startMeasurement()\n    for _ in benchmark.scaledIterations {\n      let off = fb.create(string: \"T\")\n      let s = fb.startTable(with: 4)\n      fb.add(element: 3.2, def: 0, at: 2)\n      fb.add(element: 4.2, def: 0, at: 4)\n      fb.add(element: 5.2, def: 0, at: 6)\n      fb.add(offset: off, at: 8)\n      blackHole(fb.endTable(at: s))\n    }\n  }\n\n  Benchmark(\n    \"FlatBufferBuilder Start table\",\n    configuration: kiloConfiguration)\n  { benchmark in\n    var fb = FlatBufferBuilder(initialSize: 1024 * 1024 * 32)\n    benchmark.startMeasurement()\n    for _ in benchmark.scaledIterations {\n      let s = fb.startTable(with: 4)\n      blackHole(fb.endTable(at: s))\n    }\n  }\n\n  Benchmark(\"Struct\") { benchmark in\n    var fb = FlatBufferBuilder(initialSize: 1024 * 1024 * 32)\n    benchmark.startMeasurement()\n    for _ in benchmark.scaledIterations {\n      blackHole(fb.create(struct: array.first!))\n    }\n  }\n\n  Benchmark(\"Structs\") { benchmark in\n    let rawSize = ((16 * 5) * benchmark.scaledIterations.count) / 1024\n    var fb = FlatBufferBuilder(initialSize: Int32(rawSize * 1600))\n    var offsets: [Offset] = []\n\n    benchmark.startMeasurement()\n    for _ in benchmark.scaledIterations {\n      let vector = fb.createVector(\n        ofStructs: array)\n      let start = fb.startTable(with: 1)\n      fb.add(offset: vector, at: 4)\n      offsets.append(Offset(offset: fb.endTable(at: start)))\n    }\n\n    let vector = fb.createVector(ofOffsets: offsets)\n    let start = fb.startTable(with: 1)\n    fb.add(offset: vector, at: 4)\n    let root = Offset(offset: fb.endTable(at: start))\n    blackHole(fb.finish(offset: root))\n  }\n\n  Benchmark(\"Vector of Offsets\") { benchmark in\n    let rawSize = ((16 * 5) * benchmark.scaledIterations.count) / 1024\n    var fb = FlatBufferBuilder(initialSize: Int32(rawSize * 1600))\n    benchmark.startMeasurement()\n    for _ in benchmark.scaledIterations {\n      let offsets = [\n        fb.create(string: \"T\"),\n        fb.create(string: \"2\"),\n        fb.create(string: \"3\"),\n      ]\n      let off = fb.createVector(ofOffsets: [\n        fb.createVector(ofOffsets: offsets),\n        fb.createVector(ofOffsets: offsets),\n      ])\n      let s = fb.startTable(with: 2)\n      fb.add(offset: off, at: 2)\n      blackHole(fb.endTable(at: s))\n    }\n  }\n\n  Benchmark(\"Reading Doubles\") { benchmark in\n    let byteBuffer = ByteBuffer(data: data)\n    for _ in benchmark.scaledIterations {\n      blackHole(byteBuffer.read(def: Double.self, position: 0))\n    }\n  }\n}\n"
  },
  {
    "path": "benchmarks/swift/Package.swift",
    "content": "// swift-tools-version:5.10\n/*\n * Copyright 2020 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport PackageDescription\n\nlet package = Package(\n  name: \"benchmarks\",\n  platforms: [\n    .macOS(.v13),\n  ],\n  dependencies: [\n    .package(path: \"../..\"),\n    .package(\n      url: \"https://github.com/ordo-one/package-benchmark\",\n      from: \"1.27.0\"),\n  ],\n  targets: [\n    .executableTarget(\n      name: \"FlatbuffersBenchmarks\",\n      dependencies: [\n        .product(name: \"FlatBuffers\", package: \"flatbuffers\"),\n        .product(name: \"Benchmark\", package: \"package-benchmark\"),\n      ],\n      path: \"Benchmarks/FlatbuffersBenchmarks\",\n      plugins: [\n        .plugin(name: \"BenchmarkPlugin\", package: \"package-benchmark\"),\n      ]),\n  ])\n"
  },
  {
    "path": "benchmarks/swift/README.md",
    "content": "# Benchmarks\n\nTo open the benchmarks in xcode use:\n\n`open --env BENCHMARK_DISABLE_JEMALLOC=true Package.swift`\n\nor running them directly within terminal using:\n\n`swift package benchmark`\n"
  },
  {
    "path": "build_defs.bzl",
    "content": "# Description:\n#   BUILD rules for generating flatbuffer files in various languages.\n\n\"\"\"\nRules for building C++ flatbuffers with Bazel.\n\"\"\"\n\nload(\"@rules_cc//cc:defs.bzl\", \"cc_library\")\n\nTRUE_FLATC_PATH = Label(\"//:flatc\")\n\nDEFAULT_INCLUDE_PATHS = [\n    \"./\",\n    \"$(GENDIR)\",\n    \"$(BINDIR)\",\n    \"$(execpath %s).runfiles/%s\" % (TRUE_FLATC_PATH, TRUE_FLATC_PATH.repo_name),\n]\n\ndef default_include_paths(flatc_path):\n    return [\n        \"./\",\n        \"$(GENDIR)\",\n        \"$(BINDIR)\",\n        \"$(execpath %s).runfiles/%s\" % (flatc_path, flatc_path.repo_name),\n    ]\n\nDEFAULT_FLATC_ARGS = [\n    \"--gen-object-api\",\n    \"--gen-compare\",\n    \"--no-includes\",\n    \"--gen-mutable\",\n    \"--reflect-names\",\n    \"--cpp-ptr-type flatbuffers::unique_ptr\",\n]\n\ndef flatbuffer_library_public(\n        name,\n        srcs,\n        outs,\n        language_flag,\n        out_prefix = \"\",\n        includes = [],\n        include_paths = None,\n        flatc_args = DEFAULT_FLATC_ARGS,\n        reflection_name = \"\",\n        reflection_visibility = None,\n        compatible_with = None,\n        restricted_to = None,\n        target_compatible_with = None,\n        flatc_path = None,\n        output_to_bindir = False,\n        tools = None,\n        extra_env = None,\n        **kwargs):\n    \"\"\"Generates code files for reading/writing the given flatbuffers in the requested language using the public compiler.\n\n    Args:\n      name: Rule name.\n      srcs: Source .fbs files. Sent in order to the compiler.\n      outs: Output files from flatc.\n      language_flag: Target language flag. One of [-c, -j, -js].\n      out_prefix: Prepend this path to the front of all generated files except on\n          single source targets. Usually is a directory name.\n      includes: Optional, list of filegroups of schemas that the srcs depend on.\n      include_paths: Optional, list of paths the includes files can be found in.\n      flatc_args: Optional, list of additional arguments to pass to flatc.\n      reflection_name: Optional, if set this will generate the flatbuffer\n        reflection binaries for the schemas.\n      reflection_visibility: The visibility of the generated reflection Fileset.\n      output_to_bindir: Passed to genrule for output to bin directory.\n      compatible_with: Optional, The list of environments this rule can be\n        built for, in addition to default-supported environments.\n      restricted_to: Optional, The list of environments this rule can be built\n        for, instead of default-supported environments.\n      target_compatible_with: Optional, The list of target platform constraints\n        to use.\n      flatc_path: Bazel target corresponding to the flatc compiler to use.\n      output_to_bindir: Passed to genrule for output to bin directory.\n      tools: Optional, passed to genrule for list of tools to make available\n        during the action.\n      extra_env: Optional, must be a string of \"VAR1=VAL1 VAR2=VAL2\". These get\n        set as environment variables that \"flatc_path\" sees.\n      **kwargs: Passed to the underlying genrule.\n\n\n    This rule creates a filegroup(name) with all generated source files, and\n    optionally a Fileset([reflection_name]) with all generated reflection\n    binaries.\n    \"\"\"\n    if flatc_path == None:\n        flatc_path = TRUE_FLATC_PATH\n    else:\n        flatc_path = native.package_relative_label(flatc_path)\n\n    reflection_include_paths = include_paths\n    if include_paths == None:\n        include_paths = default_include_paths(flatc_path)\n    include_paths_cmd = [\"-I %s\" % (s) for s in include_paths]\n\n    extra_env = extra_env or \"\"\n\n    # '$(@D)' when given a single source target will give the appropriate\n    # directory. Appending 'out_prefix' is only necessary when given a build\n    # target with multiple sources.\n    output_directory = (\n        (\"-o $(@D)/%s\" % (out_prefix)) if len(srcs) > 1 else (\"-o $(@D)\")\n    )\n    genrule_cmd = \" \".join([\n        \"SRCS=($(SRCS));\",\n        \"for f in $${SRCS[@]:0:%s}; do\" % len(srcs),\n        \"OUTPUT_FILE=\\\"$(OUTS)\\\" %s $(location %s)\" % (extra_env, flatc_path),\n        \" \".join(include_paths_cmd),\n        \" \".join(flatc_args),\n        language_flag,\n        output_directory,\n        \"$$f;\",\n        \"done\",\n    ])\n    native.genrule(\n        name = name,\n        srcs = srcs + includes,\n        outs = outs,\n        output_to_bindir = output_to_bindir,\n        tools = (tools or []) + [flatc_path],\n        cmd = genrule_cmd,\n        compatible_with = compatible_with,\n        target_compatible_with = target_compatible_with,\n        restricted_to = restricted_to,\n        message = \"Generating flatbuffer files for %s:\" % (name),\n        **kwargs\n    )\n    if reflection_name:\n        if reflection_include_paths == None:\n            reflection_include_paths = default_include_paths(TRUE_FLATC_PATH)\n        reflection_include_paths_cmd = [\"-I %s\" % (s) for s in reflection_include_paths]\n        reflection_genrule_cmd = \" \".join([\n            \"SRCS=($(SRCS));\",\n            \"for f in $${SRCS[@]:0:%s}; do\" % len(srcs),\n            # Move the .fbs file into the current package if it is not there already\n            'if [[ $$(dirname $$f) != \"{0}\" ]]; then s=\"$$f\"; f=\"{0}/$$(basename \"$$f\")\"; mkdir -p \"{0}\"; mv \"$$s\" \"$$f\"; fi;'.format(native.package_relative_label(\":invalid\").package),\n            \"$(location %s)\" % (TRUE_FLATC_PATH),\n            \"-b --schema\",\n            \" \".join(flatc_args),\n            \" \".join(reflection_include_paths_cmd),\n            language_flag,\n            output_directory,\n            \"$$f;\",\n            \"done\",\n        ])\n        reflection_outs = [\n            (out_prefix + \"%s.bfbs\") % (native.package_relative_label(s).name.removesuffix(\".fbs\"))\n            for s in srcs\n        ]\n\n        native.genrule(\n            name = \"%s_srcs\" % reflection_name,\n            srcs = srcs + includes,\n            outs = reflection_outs,\n            output_to_bindir = output_to_bindir,\n            tools = [TRUE_FLATC_PATH],\n            compatible_with = compatible_with,\n            restricted_to = restricted_to,\n            target_compatible_with = target_compatible_with,\n            cmd = reflection_genrule_cmd,\n            message = \"Generating flatbuffer reflection binary for %s:\" % (name),\n            visibility = reflection_visibility,\n        )\n        native.filegroup(\n            name = \"%s_out\" % reflection_name,\n            srcs = reflection_outs,\n            visibility = reflection_visibility,\n            compatible_with = compatible_with,\n            restricted_to = restricted_to,\n        )\n\ndef flatbuffer_cc_library(\n        name,\n        srcs,\n        srcs_filegroup_name = \"\",\n        outs = [],\n        out_prefix = \"\",\n        deps = [],\n        includes = [],\n        include_paths = None,\n        cc_include_paths = [],\n        flatc_args = DEFAULT_FLATC_ARGS,\n        visibility = None,\n        compatible_with = None,\n        restricted_to = None,\n        filename_suffix = \"_generated\",\n        target_compatible_with = None,\n        srcs_filegroup_visibility = None,\n        gen_reflections = False):\n    \"\"\"A cc_library with the generated reader/writers for the given flatbuffer definitions.\n\n    Args:\n      name: Rule name.\n      srcs: Source .fbs files. Sent in order to the compiler.\n      srcs_filegroup_name: Name of the output filegroup that holds srcs. Pass this\n          filegroup into the `includes` parameter of any other\n          flatbuffer_cc_library that depends on this one's schemas.\n      outs: Additional outputs expected to be generated by flatc.\n      out_prefix: Prepend this path to the front of all generated files. Usually\n          is a directory name.\n      deps: Optional, list of other flatbuffer_cc_library's to depend on. Cannot be specified\n          alongside includes.\n      includes: Optional, list of filegroups of schemas that the srcs depend on.\n          Use of this is discouraged, and may be deprecated.\n      include_paths: Optional, list of paths the includes files can be found in.\n      cc_include_paths: Optional, list of paths to add to the cc_library includes attribute.\n      flatc_args: Optional list of additional arguments to pass to flatc\n          (e.g. --gen-mutable).\n      visibility: The visibility of the generated cc_library. By default, use the\n          default visibility of the project.\n      srcs_filegroup_visibility: The visibility of the generated srcs filegroup.\n          By default, use the value of the visibility parameter above.\n      gen_reflections: Optional, if true this will generate the flatbuffer\n        reflection binaries for the schemas.\n      compatible_with: Optional, The list of environments this rule can be built\n        for, in addition to default-supported environments.\n      restricted_to: Optional, The list of environments this rule can be built\n        for, instead of default-supported environments.\n      target_compatible_with: Optional, The list of target platform constraints\n        to use.\n\n    This produces:\n      filegroup([name]_srcs): all generated .h files.\n      filegroup(srcs_filegroup_name if specified, or [name]_includes if not):\n          Other flatbuffer_cc_library's can pass this in for their `includes`\n          parameter, if they depend on the schemas in this library.\n      Fileset([name]_reflection): (Optional) all generated reflection binaries.\n      cc_library([name]): library with sources and flatbuffers deps.\n    \"\"\"\n\n    output_headers = []\n    for s in srcs:\n        base_name = s.split(\"/\")[-1].split(\":\")[-1].replace(\".fbs\", \"\")\n        header = out_prefix + base_name + filename_suffix + \".h\"\n        output_headers.append(header)\n\n    if deps and includes:\n        # There is no inherent reason we couldn't support both, but this discourages\n        # use of includes without good reason.\n        fail(\"Cannot specify both deps and include in flatbuffer_cc_library.\")\n    if deps:\n        includes = [d + \"_includes\" for d in deps]\n    reflection_name = \"%s_reflection\" % name if gen_reflections else \"\"\n\n    srcs_lib = \"%s_srcs\" % (name)\n    flatbuffer_library_public(\n        name = srcs_lib,\n        srcs = srcs,\n        outs = outs + output_headers,\n        language_flag = \"-c\",\n        out_prefix = out_prefix,\n        includes = includes,\n        include_paths = include_paths,\n        flatc_args = flatc_args,\n        compatible_with = compatible_with,\n        restricted_to = restricted_to,\n        target_compatible_with = target_compatible_with,\n        reflection_name = reflection_name,\n        reflection_visibility = visibility,\n    )\n    cc_library(\n        name = name,\n        hdrs = [\n            \":\" + srcs_lib,\n        ],\n        srcs = [\n            \":\" + srcs_lib,\n        ],\n        features = [\n            \"-parse_headers\",\n        ],\n        deps = [\n            Label(\"//:runtime_cc\"),\n            Label(\"//:flatbuffers\"),\n        ] + deps,\n        includes = cc_include_paths,\n        compatible_with = compatible_with,\n        restricted_to = restricted_to,\n        target_compatible_with = target_compatible_with,\n        linkstatic = 1,\n        visibility = visibility,\n    )\n\n    # A filegroup for the `srcs`. That is, all the schema files for this\n    # Flatbuffer set.\n    native.filegroup(\n        name = srcs_filegroup_name if srcs_filegroup_name else \"%s_includes\" % (name),\n        srcs = srcs + includes,\n        compatible_with = compatible_with,\n        restricted_to = restricted_to,\n        visibility = srcs_filegroup_visibility if srcs_filegroup_visibility != None else visibility,\n    )\n"
  },
  {
    "path": "composer.json",
    "content": "{\n  \"name\": \"google/flatbuffers\",\n  \"type\": \"library\",\n  \"description\": \"FlatBuffers for PHP\",\n  \"keywords\": [\"google\", \"flatbuffers\", \"serialization\"],\n  \"homepage\": \"https://github.com/google/flatbuffers\",\n  \"license\": \"Apache-2.0\",\n  \"require\": {\n    \"php\": \">=5.4\"\n  },\n  \"require-dev\": {\n  },\n  \"autoload\": {\n    \"psr-4\": {\n      \"Google\\\\FlatBuffers\\\\\": \"php\"\n    }\n  }\n}"
  },
  {
    "path": "dart/CHANGELOG.md",
    "content": "# Changelog\n\n## 25.9.23\n\n- use enhanced enums (#8313)\n- fix incorrect write in Float64 write method (#8290)\n- code format improvements (#8707)\n\n## 23.5.26\n\n- omit type annotationes for local variables (#7067, #7069, #7070)\n- remove BSD 3-clause license (#7073)\n- correctly parse lists of enums (#7157)\n- align naming conventions for generated code (#7187)\n- add `putBool` to fix errors when serializing structs with booleans (#7359)\n- fix handling of +/-inf defaults in codegen (#7588)\n- fix import issues in generated code (#7621)\n- Fix incorrect storage of floats as ints in some cases (#7703)\n- add final modifiers to the library implementation (#7943)\n\n## 2.0.5\n\n- switch to null safety (#6696)\n- add Object APIs (pack/unpack) (#6682, #6723, #6846)\n- add custom builder buffer allocator support (#6711)\n- add `Builder.size()` - finished buffer size (#6403)\n- make `writeString()` argument non-nullable (#6737)\n- make tables fixed size (expect the number of fields when creating) (#6735)\n- make table deduplication optional (param `deduplicateTables`) (#6734)\n- change `Builder.reset()` to reuse an existing buffer (#6661)\n- change table building to assert() instead of exceptions (#6754)\n- optimize `writeString()` for ASCII (param `asciiOptimization`) (#6736)\n- change `StringReader` to make ASCII optimization optional (param `asciiOptimization`) (#6758)\n- change `[byte]` and `[ubyte]` representation to `dart:typed_data` `Int8List` and `Uint8List` (#6839)\n- rename `lowFinish()` to `buffer` getter (#6712)\n- fix `Builder._writeString()` - always write trailing zero byte (#6390)\n- fix `Builder.reset()` - clear vTables (#6386)\n- make sure added padding is zeroed, same as in C++ (#6716)\n- many performance improvements (#6755)\n\n## 1.9.2\n\n- Ensure `_writeString` adds enough padding to null terminate strings.\n\n## 1.9.1\n\n- Changed constant identifiers to be compatible with Dart 2.x\n- No longer supports Dart 1.x\n\n## 1.9.0\n\n- Initial release, supports Dart 1.x and many dev versions of Dart 2.x\n"
  },
  {
    "path": "dart/LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2014 Google Inc.\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "dart/README.md",
    "content": "# FlatBuffers for Dart\n\nThis package is used to read and write [FlatBuffers](https://google.github.io/flatbuffers/).\n\nMost consumers will want to use the [`flatc` - FlatBuffer compiler](https://github.com/google/flatbuffers) binary for your platform.\nYou can download the flatc version matching your dart package version from [GitHub releases](https://github.com/google/flatbuffers/releases).\n\nThe FlatBuffer compiler `flatc` reads a FlatBuffers IDL schema and generates Dart code.\nThe generated classes can be used to read or write binary data/files that are interoperable with\nother languages and platforms supported by FlatBuffers, as illustrated in the `example.dart` in the\nexamples folder.\n\nFor more details and documentation, head over to the official site and read the\n[Tutorial](https://google.github.io/flatbuffers/flatbuffers_guide_tutorial.html) and how to\n[use FlatBuffers in Dart](https://google.github.io/flatbuffers/flatbuffers_guide_use_dart.html).\n"
  },
  {
    "path": "dart/analysis_options.yaml",
    "content": "include: package:lints/recommended.yaml\n"
  },
  {
    "path": "dart/example/example.dart",
    "content": "/*\n * Copyright 2018 Dan Field. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport 'package:flat_buffers/flat_buffers.dart' as fb;\n\nimport './monster_my_game.sample_generated.dart' as my_game;\n\n// Example how to use FlatBuffers to create and read binary buffers.\n\nvoid main() {\n  builderTest();\n  objectBuilderTest();\n}\n\nvoid builderTest() {\n  final builder = fb.Builder(initialSize: 1024);\n  final int? weaponOneName = builder.writeString(\"Sword\");\n  final int weaponOneDamage = 3;\n\n  final int? weaponTwoName = builder.writeString(\"Axe\");\n  final int weaponTwoDamage = 5;\n\n  final swordBuilder = my_game.WeaponBuilder(builder)\n    ..begin()\n    ..addNameOffset(weaponOneName)\n    ..addDamage(weaponOneDamage);\n  final int sword = swordBuilder.finish();\n\n  final axeBuilder = my_game.WeaponBuilder(builder)\n    ..begin()\n    ..addNameOffset(weaponTwoName)\n    ..addDamage(weaponTwoDamage);\n  final int axe = axeBuilder.finish();\n\n  // Serialize a name for our monster, called \"Orc\".\n  final int? name = builder.writeString('Orc');\n\n  // Create a list representing the inventory of the Orc. Each number\n  // could correspond to an item that can be claimed after he is slain.\n  final List<int> treasure = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];\n  final inventory = builder.writeListUint8(treasure);\n  final weapons = builder.writeList([sword, axe]);\n\n  // Struct builders are very easy to reuse.\n  final vec3Builder = my_game.Vec3Builder(builder);\n\n  vec3Builder.finish(4.0, 5.0, 6.0);\n  vec3Builder.finish(1.0, 2.0, 3.0);\n  // Set his hit points to 300 and his mana to 150.\n  final int hp = 300;\n  final int mana = 150;\n\n  final monster = my_game.MonsterBuilder(builder)\n    ..begin()\n    ..addNameOffset(name)\n    ..addInventoryOffset(inventory)\n    ..addWeaponsOffset(weapons)\n    ..addEquippedType(my_game.EquipmentTypeId.Weapon)\n    ..addEquippedOffset(axe)\n    ..addHp(hp)\n    ..addMana(mana)\n    ..addPos(vec3Builder.finish(1.0, 2.0, 3.0))\n    ..addColor(my_game.Color.Red);\n\n  final int monsteroff = monster.finish();\n  builder.finish(monsteroff);\n  if (verify(builder.buffer)) {\n    print(\n      \"The FlatBuffer was successfully created with a builder and verified!\",\n    );\n  }\n}\n\nvoid objectBuilderTest() {\n  // Create the builder here so we can use it for both weapons and equipped\n  // the actual data will only be written to the buffer once.\n  var axe = my_game.WeaponObjectBuilder(name: 'Axe', damage: 5);\n\n  var monsterBuilder = my_game.MonsterObjectBuilder(\n    pos: my_game.Vec3ObjectBuilder(x: 1.0, y: 2.0, z: 3.0),\n    mana: 150,\n    hp: 300,\n    name: 'Orc',\n    inventory: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\n    color: my_game.Color.Red,\n    weapons: [\n      my_game.WeaponObjectBuilder(name: 'Sword', damage: 3),\n      axe,\n    ],\n    equippedType: my_game.EquipmentTypeId.Weapon,\n    equipped: axe,\n  );\n\n  var buffer = monsterBuilder.toBytes();\n\n  // We now have a FlatBuffer we can store on disk or send over a network.\n\n  // ** file/network code goes here :) **\n\n  // Instead, we're going to access it right away (as if we just received it).\n  if (verify(buffer)) {\n    print(\n      \"The FlatBuffer was successfully created with an object builder and verified!\",\n    );\n  }\n}\n\nbool verify(List<int> buffer) {\n  // Get access to the root:\n  var monster = my_game.Monster(buffer);\n\n  // Get and test some scalar types from the FlatBuffer.\n  assert(monster.hp == 80);\n  assert(monster.mana == 150); // default\n  assert(monster.name == \"MyMonster\");\n\n  // Get and test a field of the FlatBuffer's `struct`.\n  var pos = monster.pos!;\n  assert(pos.z == 3.0);\n\n  // Get a test an element from the `inventory` FlatBuffer's `vector`.\n  var inv = monster.inventory!;\n  assert(inv.length == 10);\n  assert(inv[9] == 9);\n\n  // Get and test the `weapons` FlatBuffers's `vector`.\n  var expectedWeaponNames = [\"Sword\", \"Axe\"];\n  var expectedWeaponDamages = [3, 5];\n  var weps = monster.weapons!;\n  for (int i = 0; i < weps.length; i++) {\n    assert(weps[i].name == expectedWeaponNames[i]);\n    assert(weps[i].damage == expectedWeaponDamages[i]);\n  }\n\n  // Get and test the `Equipment` union (`equipped` field).\n  assert(monster.equippedType!.value == my_game.EquipmentTypeId.Weapon.value);\n  assert(monster.equippedType == my_game.EquipmentTypeId.Weapon);\n\n  assert(monster.equipped is my_game.Weapon);\n  var equipped = monster.equipped as my_game.Weapon;\n  assert(equipped.name == \"Axe\");\n  assert(equipped.damage == 5);\n\n  print(monster);\n  return true;\n}\n"
  },
  {
    "path": "dart/example/monster_my_game.sample_generated.dart",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable\n\nlibrary my_game.sample;\n\nimport 'dart:typed_data' show Uint8List;\n\nimport 'package:flat_buffers/flat_buffers.dart' as fb;\n\nclass Color {\n  final int value;\n  const Color._(this.value);\n\n  factory Color.fromValue(int value) {\n    final result = values[value];\n    if (result == null) {\n      throw StateError('Invalid value $value for bit flag enum Color');\n    }\n    return result;\n  }\n\n  static Color? _createOrNull(int? value) =>\n      value == null ? null : Color.fromValue(value);\n\n  static const int minValue = 0;\n  static const int maxValue = 2;\n  static bool containsValue(int value) => values.containsKey(value);\n\n  static const Color Red = Color._(0);\n  static const Color Green = Color._(1);\n  static const Color Blue = Color._(2);\n  static const Map<int, Color> values = {0: Red, 1: Green, 2: Blue};\n\n  static const fb.Reader<Color> reader = _ColorReader();\n\n  @override\n  String toString() {\n    return 'Color{value: $value}';\n  }\n}\n\nclass _ColorReader extends fb.Reader<Color> {\n  const _ColorReader();\n\n  @override\n  int get size => 1;\n\n  @override\n  Color read(fb.BufferContext bc, int offset) =>\n      Color.fromValue(const fb.Int8Reader().read(bc, offset));\n}\n\nclass EquipmentTypeId {\n  final int value;\n  const EquipmentTypeId._(this.value);\n\n  factory EquipmentTypeId.fromValue(int value) {\n    final result = values[value];\n    if (result == null) {\n      throw StateError(\n        'Invalid value $value for bit flag enum EquipmentTypeId',\n      );\n    }\n    return result;\n  }\n\n  static EquipmentTypeId? _createOrNull(int? value) =>\n      value == null ? null : EquipmentTypeId.fromValue(value);\n\n  static const int minValue = 0;\n  static const int maxValue = 1;\n  static bool containsValue(int value) => values.containsKey(value);\n\n  static const EquipmentTypeId NONE = EquipmentTypeId._(0);\n  static const EquipmentTypeId Weapon = EquipmentTypeId._(1);\n  static const Map<int, EquipmentTypeId> values = {0: NONE, 1: Weapon};\n\n  static const fb.Reader<EquipmentTypeId> reader = _EquipmentTypeIdReader();\n\n  @override\n  String toString() {\n    return 'EquipmentTypeId{value: $value}';\n  }\n}\n\nclass _EquipmentTypeIdReader extends fb.Reader<EquipmentTypeId> {\n  const _EquipmentTypeIdReader();\n\n  @override\n  int get size => 1;\n\n  @override\n  EquipmentTypeId read(fb.BufferContext bc, int offset) =>\n      EquipmentTypeId.fromValue(const fb.Uint8Reader().read(bc, offset));\n}\n\nclass Vec3 {\n  Vec3._(this._bc, this._bcOffset);\n\n  static const fb.Reader<Vec3> reader = _Vec3Reader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  double get x => const fb.Float32Reader().read(_bc, _bcOffset + 0);\n  double get y => const fb.Float32Reader().read(_bc, _bcOffset + 4);\n  double get z => const fb.Float32Reader().read(_bc, _bcOffset + 8);\n\n  @override\n  String toString() {\n    return 'Vec3{x: $x, y: $y, z: $z}';\n  }\n}\n\nclass _Vec3Reader extends fb.StructReader<Vec3> {\n  const _Vec3Reader();\n\n  @override\n  int get size => 12;\n\n  @override\n  Vec3 createObject(fb.BufferContext bc, int offset) => Vec3._(bc, offset);\n}\n\nclass Vec3Builder {\n  Vec3Builder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  int finish(double x, double y, double z) {\n    fbBuilder.putFloat32(z);\n    fbBuilder.putFloat32(y);\n    fbBuilder.putFloat32(x);\n    return fbBuilder.offset;\n  }\n}\n\nclass Vec3ObjectBuilder extends fb.ObjectBuilder {\n  final double _x;\n  final double _y;\n  final double _z;\n\n  Vec3ObjectBuilder({required double x, required double y, required double z})\n    : _x = x,\n      _y = y,\n      _z = z;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    fbBuilder.putFloat32(_z);\n    fbBuilder.putFloat32(_y);\n    fbBuilder.putFloat32(_x);\n    return fbBuilder.offset;\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n\nclass Monster {\n  Monster._(this._bc, this._bcOffset);\n  factory Monster(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<Monster> reader = _MonsterReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  Vec3? get pos => Vec3.reader.vTableGetNullable(_bc, _bcOffset, 4);\n  int get mana => const fb.Int16Reader().vTableGet(_bc, _bcOffset, 6, 150);\n  int get hp => const fb.Int16Reader().vTableGet(_bc, _bcOffset, 8, 100);\n  String? get name =>\n      const fb.StringReader().vTableGetNullable(_bc, _bcOffset, 10);\n  List<int>? get inventory =>\n      const fb.Uint8ListReader().vTableGetNullable(_bc, _bcOffset, 14);\n  Color get color =>\n      Color.fromValue(const fb.Int8Reader().vTableGet(_bc, _bcOffset, 16, 2));\n  List<Weapon>? get weapons => const fb.ListReader<Weapon>(\n    Weapon.reader,\n  ).vTableGetNullable(_bc, _bcOffset, 18);\n  EquipmentTypeId? get equippedType => EquipmentTypeId._createOrNull(\n    const fb.Uint8Reader().vTableGetNullable(_bc, _bcOffset, 20),\n  );\n  dynamic get equipped {\n    switch (equippedType?.value) {\n      case 1:\n        return Weapon.reader.vTableGetNullable(_bc, _bcOffset, 22);\n      default:\n        return null;\n    }\n  }\n\n  List<Vec3>? get path => const fb.ListReader<Vec3>(\n    Vec3.reader,\n  ).vTableGetNullable(_bc, _bcOffset, 24);\n\n  @override\n  String toString() {\n    return 'Monster{pos: $pos, mana: $mana, hp: $hp, name: $name, inventory: $inventory, color: $color, weapons: $weapons, equippedType: $equippedType, equipped: $equipped, path: $path}';\n  }\n}\n\nclass _MonsterReader extends fb.TableReader<Monster> {\n  const _MonsterReader();\n\n  @override\n  Monster createObject(fb.BufferContext bc, int offset) =>\n      Monster._(bc, offset);\n}\n\nclass MonsterBuilder {\n  MonsterBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  void begin() {\n    fbBuilder.startTable(10);\n  }\n\n  int addPos(int offset) {\n    fbBuilder.addStruct(0, offset);\n    return fbBuilder.offset;\n  }\n\n  int addMana(int? mana) {\n    fbBuilder.addInt16(1, mana);\n    return fbBuilder.offset;\n  }\n\n  int addHp(int? hp) {\n    fbBuilder.addInt16(2, hp);\n    return fbBuilder.offset;\n  }\n\n  int addNameOffset(int? offset) {\n    fbBuilder.addOffset(3, offset);\n    return fbBuilder.offset;\n  }\n\n  int addInventoryOffset(int? offset) {\n    fbBuilder.addOffset(5, offset);\n    return fbBuilder.offset;\n  }\n\n  int addColor(Color? color) {\n    fbBuilder.addInt8(6, color?.value);\n    return fbBuilder.offset;\n  }\n\n  int addWeaponsOffset(int? offset) {\n    fbBuilder.addOffset(7, offset);\n    return fbBuilder.offset;\n  }\n\n  int addEquippedType(EquipmentTypeId? equippedType) {\n    fbBuilder.addUint8(8, equippedType?.value);\n    return fbBuilder.offset;\n  }\n\n  int addEquippedOffset(int? offset) {\n    fbBuilder.addOffset(9, offset);\n    return fbBuilder.offset;\n  }\n\n  int addPathOffset(int? offset) {\n    fbBuilder.addOffset(10, offset);\n    return fbBuilder.offset;\n  }\n\n  int finish() {\n    return fbBuilder.endTable();\n  }\n}\n\nclass MonsterObjectBuilder extends fb.ObjectBuilder {\n  final Vec3ObjectBuilder? _pos;\n  final int? _mana;\n  final int? _hp;\n  final String? _name;\n  final List<int>? _inventory;\n  final Color? _color;\n  final List<WeaponObjectBuilder>? _weapons;\n  final EquipmentTypeId? _equippedType;\n  final dynamic _equipped;\n  final List<Vec3ObjectBuilder>? _path;\n\n  MonsterObjectBuilder({\n    Vec3ObjectBuilder? pos,\n    int? mana,\n    int? hp,\n    String? name,\n    List<int>? inventory,\n    Color? color,\n    List<WeaponObjectBuilder>? weapons,\n    EquipmentTypeId? equippedType,\n    dynamic equipped,\n    List<Vec3ObjectBuilder>? path,\n  }) : _pos = pos,\n       _mana = mana,\n       _hp = hp,\n       _name = name,\n       _inventory = inventory,\n       _color = color,\n       _weapons = weapons,\n       _equippedType = equippedType,\n       _equipped = equipped,\n       _path = path;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    final int? nameOffset = _name == null\n        ? null\n        : fbBuilder.writeString(_name!);\n    final int? inventoryOffset = _inventory == null\n        ? null\n        : fbBuilder.writeListUint8(_inventory!);\n    final int? weaponsOffset = _weapons == null\n        ? null\n        : fbBuilder.writeList(\n            _weapons!.map((b) => b.getOrCreateOffset(fbBuilder)).toList(),\n          );\n    final int? equippedOffset = _equipped?.getOrCreateOffset(fbBuilder);\n    final int? pathOffset = _path == null\n        ? null\n        : fbBuilder.writeListOfStructs(_path!);\n    fbBuilder.startTable(10);\n    if (_pos != null) {\n      fbBuilder.addStruct(0, _pos!.finish(fbBuilder));\n    }\n    fbBuilder.addInt16(1, _mana);\n    fbBuilder.addInt16(2, _hp);\n    fbBuilder.addOffset(3, nameOffset);\n    fbBuilder.addOffset(5, inventoryOffset);\n    fbBuilder.addInt8(6, _color?.value);\n    fbBuilder.addOffset(7, weaponsOffset);\n    fbBuilder.addUint8(8, _equippedType?.value);\n    fbBuilder.addOffset(9, equippedOffset);\n    fbBuilder.addOffset(10, pathOffset);\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n\nclass Weapon {\n  Weapon._(this._bc, this._bcOffset);\n  factory Weapon(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<Weapon> reader = _WeaponReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  String? get name =>\n      const fb.StringReader().vTableGetNullable(_bc, _bcOffset, 4);\n  int get damage => const fb.Int16Reader().vTableGet(_bc, _bcOffset, 6, 0);\n\n  @override\n  String toString() {\n    return 'Weapon{name: $name, damage: $damage}';\n  }\n}\n\nclass _WeaponReader extends fb.TableReader<Weapon> {\n  const _WeaponReader();\n\n  @override\n  Weapon createObject(fb.BufferContext bc, int offset) => Weapon._(bc, offset);\n}\n\nclass WeaponBuilder {\n  WeaponBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  void begin() {\n    fbBuilder.startTable(2);\n  }\n\n  int addNameOffset(int? offset) {\n    fbBuilder.addOffset(0, offset);\n    return fbBuilder.offset;\n  }\n\n  int addDamage(int? damage) {\n    fbBuilder.addInt16(1, damage);\n    return fbBuilder.offset;\n  }\n\n  int finish() {\n    return fbBuilder.endTable();\n  }\n}\n\nclass WeaponObjectBuilder extends fb.ObjectBuilder {\n  final String? _name;\n  final int? _damage;\n\n  WeaponObjectBuilder({String? name, int? damage})\n    : _name = name,\n      _damage = damage;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    final int? nameOffset = _name == null\n        ? null\n        : fbBuilder.writeString(_name!);\n    fbBuilder.startTable(2);\n    fbBuilder.addOffset(0, nameOffset);\n    fbBuilder.addInt16(1, _damage);\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n"
  },
  {
    "path": "dart/lib/flat_buffers.dart",
    "content": "import 'dart:collection';\nimport 'dart:convert';\nimport 'dart:math';\nimport 'dart:typed_data';\n\nconst int _sizeofUint8 = 1;\nconst int _sizeofUint16 = 2;\nconst int _sizeofUint32 = 4;\nconst int _sizeofUint64 = 8;\nconst int _sizeofInt8 = 1;\nconst int _sizeofInt16 = 2;\nconst int _sizeofInt32 = 4;\nconst int _sizeofInt64 = 8;\nconst int _sizeofFloat32 = 4;\nconst int _sizeofFloat64 = 8;\n\n/// Callback used to invoke a struct builder's finish method.\n///\n/// This callback is used by other struct's `finish` methods to write the nested\n/// struct's fields inline.\ntypedef StructBuilder = void Function();\n\n/// Buffer with data and some context about it.\nclass BufferContext {\n  final ByteData _buffer;\n\n  ByteData get buffer => _buffer;\n\n  /// Create from a FlatBuffer represented by a list of bytes (uint8).\n  factory BufferContext.fromBytes(List<int> byteList) => BufferContext(\n    byteList is Uint8List\n        ? byteList.buffer.asByteData(byteList.offsetInBytes)\n        : ByteData.view(Uint8List.fromList(byteList).buffer),\n  );\n\n  /// Create from a FlatBuffer represented by ByteData.\n  BufferContext(this._buffer);\n\n  @pragma('vm:prefer-inline')\n  int derefObject(int offset) => offset + _getUint32(offset);\n\n  @pragma('vm:prefer-inline')\n  Uint8List _asUint8List(int offset, int length) =>\n      _buffer.buffer.asUint8List(_buffer.offsetInBytes + offset, length);\n\n  @pragma('vm:prefer-inline')\n  double _getFloat64(int offset) => _buffer.getFloat64(offset, Endian.little);\n\n  @pragma('vm:prefer-inline')\n  double _getFloat32(int offset) => _buffer.getFloat32(offset, Endian.little);\n\n  @pragma('vm:prefer-inline')\n  int _getInt64(int offset) => _buffer.getInt64(offset, Endian.little);\n\n  @pragma('vm:prefer-inline')\n  int _getInt32(int offset) => _buffer.getInt32(offset, Endian.little);\n\n  @pragma('vm:prefer-inline')\n  int _getInt16(int offset) => _buffer.getInt16(offset, Endian.little);\n\n  @pragma('vm:prefer-inline')\n  int _getInt8(int offset) => _buffer.getInt8(offset);\n\n  @pragma('vm:prefer-inline')\n  int _getUint64(int offset) => _buffer.getUint64(offset, Endian.little);\n\n  @pragma('vm:prefer-inline')\n  int _getUint32(int offset) => _buffer.getUint32(offset, Endian.little);\n\n  @pragma('vm:prefer-inline')\n  int _getUint16(int offset) => _buffer.getUint16(offset, Endian.little);\n\n  @pragma('vm:prefer-inline')\n  int _getUint8(int offset) => _buffer.getUint8(offset);\n}\n\n/// Interface implemented by the \"object-api\" classes (ending with \"T\").\nabstract class Packable {\n  /// Serialize the object using the given builder, returning the offset.\n  int pack(Builder fbBuilder);\n}\n\n/// Class implemented by typed builders generated by flatc.\nabstract class ObjectBuilder {\n  int? _firstOffset;\n\n  /// Can be used to write the data represented by this builder to the [Builder]\n  /// and reuse the offset created in multiple tables.\n  ///\n  /// Note that this method assumes you call it using the same [Builder] instance\n  /// every time. The returned offset is only good for the [Builder] used in the\n  /// first call to this method.\n  int getOrCreateOffset(Builder fbBuilder) {\n    _firstOffset ??= finish(fbBuilder);\n    return _firstOffset!;\n  }\n\n  /// Writes the data in this helper to the [Builder].\n  int finish(Builder fbBuilder);\n\n  /// Convenience method that will create a new [Builder], [finish]es the data,\n  /// and returns the buffer as a [Uint8List] of bytes.\n  Uint8List toBytes();\n}\n\n/// Class that helps building flat buffers.\nclass Builder {\n  bool _finished = false;\n\n  final int initialSize;\n\n  /// The list of existing VTable(s).\n  final List<int> _vTables;\n\n  final bool deduplicateTables;\n\n  ByteData _buf;\n\n  final Allocator _allocator;\n\n  /// The maximum alignment that has been seen so far.  If [_buf] has to be\n  /// reallocated in the future (to insert room at its start for more bytes) the\n  /// reallocation will need to be a multiple of this many bytes.\n  int _maxAlign = 1;\n\n  /// The number of bytes that have been written to the buffer so far.  The\n  /// most recently written byte is this many bytes from the end of [_buf].\n  int _tail = 0;\n\n  /// The location of the end of the current table, measured in bytes from the\n  /// end of [_buf].\n  int _currentTableEndTail = 0;\n\n  _VTable? _currentVTable;\n\n  /// Map containing all strings that have been written so far.  This allows us\n  /// to avoid duplicating strings.\n  ///\n  /// Allocated only if `internStrings` is set to true on the constructor.\n  Map<String, int>? _strings;\n\n  /// Creates a new FlatBuffers Builder.\n  ///\n  /// `initialSize` is the initial array size in bytes.  The [Builder] will\n  /// automatically grow the array if/as needed.  `internStrings`, if set to\n  /// true, will cause [writeString] to pool strings in the buffer so that\n  /// identical strings will always use the same offset in tables.\n  Builder({\n    this.initialSize = 1024,\n    bool internStrings = false,\n    Allocator allocator = const DefaultAllocator(),\n    this.deduplicateTables = true,\n  }) : _allocator = allocator,\n       _buf = allocator.allocate(initialSize),\n       _vTables = deduplicateTables ? [] : const [] {\n    if (internStrings) {\n      _strings = <String, int>{};\n    }\n  }\n\n  /// Calculate the finished buffer size (aligned).\n  @pragma('vm:prefer-inline')\n  int size() => _tail + ((-_tail) & (_maxAlign - 1));\n\n  /// Add the [field] with the given boolean [value].  The field is not added if\n  /// the [value] is equal to [def].  Booleans are stored as 8-bit fields with\n  /// `0` for `false` and `1` for `true`.\n  void addBool(int field, bool? value, [bool? def]) {\n    assert(_inVTable);\n    if (value != null && value != def) {\n      _prepare(_sizeofUint8, 1);\n      _trackField(field);\n      _buf.setInt8(_buf.lengthInBytes - _tail, value ? 1 : 0);\n    }\n  }\n\n  /// Add the [field] with the given 32-bit signed integer [value].  The field is\n  /// not added if the [value] is equal to [def].\n  void addInt32(int field, int? value, [int? def]) {\n    assert(_inVTable);\n    if (value != null && value != def) {\n      _prepare(_sizeofInt32, 1);\n      _trackField(field);\n      _setInt32AtTail(_tail, value);\n    }\n  }\n\n  /// Add the [field] with the given 32-bit signed integer [value].  The field is\n  /// not added if the [value] is equal to [def].\n  void addInt16(int field, int? value, [int? def]) {\n    assert(_inVTable);\n    if (value != null && value != def) {\n      _prepare(_sizeofInt16, 1);\n      _trackField(field);\n      _setInt16AtTail(_tail, value);\n    }\n  }\n\n  /// Add the [field] with the given 8-bit signed integer [value].  The field is\n  /// not added if the [value] is equal to [def].\n  void addInt8(int field, int? value, [int? def]) {\n    assert(_inVTable);\n    if (value != null && value != def) {\n      _prepare(_sizeofInt8, 1);\n      _trackField(field);\n      _setInt8AtTail(_tail, value);\n    }\n  }\n\n  void addStruct(int field, int offset) {\n    assert(_inVTable);\n    _trackField(field);\n    _currentVTable!.addField(field, offset);\n  }\n\n  /// Add the [field] referencing an object with the given [offset].\n  void addOffset(int field, int? offset) {\n    assert(_inVTable);\n    if (offset != null) {\n      _prepare(_sizeofUint32, 1);\n      _trackField(field);\n      _setUint32AtTail(_tail, _tail - offset);\n    }\n  }\n\n  /// Add the [field] with the given 32-bit unsigned integer [value].  The field\n  /// is not added if the [value] is equal to [def].\n  void addUint32(int field, int? value, [int? def]) {\n    assert(_inVTable);\n    if (value != null && value != def) {\n      _prepare(_sizeofUint32, 1);\n      _trackField(field);\n      _setUint32AtTail(_tail, value);\n    }\n  }\n\n  /// Add the [field] with the given 32-bit unsigned integer [value].  The field\n  /// is not added if the [value] is equal to [def].\n  void addUint16(int field, int? value, [int? def]) {\n    assert(_inVTable);\n    if (value != null && value != def) {\n      _prepare(_sizeofUint16, 1);\n      _trackField(field);\n      _setUint16AtTail(_tail, value);\n    }\n  }\n\n  /// Add the [field] with the given 8-bit unsigned integer [value].  The field\n  /// is not added if the [value] is equal to [def].\n  void addUint8(int field, int? value, [int? def]) {\n    assert(_inVTable);\n    if (value != null && value != def) {\n      _prepare(_sizeofUint8, 1);\n      _trackField(field);\n      _setUint8AtTail(_tail, value);\n    }\n  }\n\n  /// Add the [field] with the given 32-bit float [value].  The field\n  /// is not added if the [value] is equal to [def].\n  void addFloat32(int field, double? value, [double? def]) {\n    assert(_inVTable);\n    if (value != null && value != def) {\n      _prepare(_sizeofFloat32, 1);\n      _trackField(field);\n      _setFloat32AtTail(_tail, value);\n    }\n  }\n\n  /// Add the [field] with the given 64-bit double [value].  The field\n  /// is not added if the [value] is equal to [def].\n  void addFloat64(int field, double? value, [double? def]) {\n    assert(_inVTable);\n    if (value != null && value != def) {\n      _prepare(_sizeofFloat64, 1);\n      _trackField(field);\n      _setFloat64AtTail(_tail, value);\n    }\n  }\n\n  /// Add the [field] with the given 64-bit unsigned integer [value].  The field\n  /// is not added if the [value] is equal to [def].\n  void addUint64(int field, int? value, [double? def]) {\n    assert(_inVTable);\n    if (value != null && value != def) {\n      _prepare(_sizeofUint64, 1);\n      _trackField(field);\n      _setUint64AtTail(_tail, value);\n    }\n  }\n\n  /// Add the [field] with the given 64-bit unsigned integer [value].  The field\n  /// is not added if the [value] is equal to [def].\n  void addInt64(int field, int? value, [double? def]) {\n    assert(_inVTable);\n    if (value != null && value != def) {\n      _prepare(_sizeofInt64, 1);\n      _trackField(field);\n      _setInt64AtTail(_tail, value);\n    }\n  }\n\n  /// End the current table and return its offset.\n  int endTable() {\n    assert(_inVTable);\n    // Prepare for writing the VTable.\n    _prepare(_sizeofInt32, 1);\n    final tableTail = _tail;\n    // Prepare the size of the current table.\n    final currentVTable = _currentVTable!;\n    currentVTable.tableSize = tableTail - _currentTableEndTail;\n    // Prepare the VTable to use for the current table.\n    int? vTableTail;\n    {\n      currentVTable.computeFieldOffsets(tableTail);\n\n      // Try to find an existing compatible VTable.\n      if (deduplicateTables) {\n        // Search backward - more likely to have recently used one\n        for (var i = _vTables.length - 1; i >= 0; i--) {\n          final vt2Offset = _vTables[i];\n          final vt2Start = _buf.lengthInBytes - vt2Offset;\n          final vt2Size = _buf.getUint16(vt2Start, Endian.little);\n\n          if (currentVTable._vTableSize == vt2Size &&\n              currentVTable._offsetsMatch(vt2Start, _buf)) {\n            vTableTail = vt2Offset;\n            break;\n          }\n        }\n      }\n\n      // Write a new VTable.\n      if (vTableTail == null) {\n        _prepare(_sizeofUint16, _currentVTable!.numOfUint16);\n        vTableTail = _tail;\n        currentVTable.tail = vTableTail;\n        currentVTable.output(_buf, _buf.lengthInBytes - _tail);\n        if (deduplicateTables) _vTables.add(currentVTable.tail);\n      }\n    }\n    // Set the VTable offset.\n    _setInt32AtTail(tableTail, vTableTail - tableTail);\n    // Done with this table.\n    _currentVTable = null;\n    return tableTail;\n  }\n\n  /// Returns the finished buffer. You must call [finish] before accessing this.\n  @pragma('vm:prefer-inline')\n  Uint8List get buffer {\n    assert(_finished);\n    final finishedSize = size();\n    return _buf.buffer.asUint8List(\n      _buf.lengthInBytes - finishedSize,\n      finishedSize,\n    );\n  }\n\n  /// Finish off the creation of the buffer.  The given [offset] is used as the\n  /// root object offset, and usually references directly or indirectly every\n  /// written object.  If [fileIdentifier] is specified (and not `null`), it is\n  /// interpreted as a 4-byte Latin-1 encoded string that should be placed at\n  /// bytes 4-7 of the file.\n  void finish(int offset, [String? fileIdentifier]) {\n    final sizeBeforePadding = size();\n    final requiredBytes = _sizeofUint32 * (fileIdentifier == null ? 1 : 2);\n    _prepare(max(requiredBytes, _maxAlign), 1);\n    final finishedSize = size();\n    _setUint32AtTail(finishedSize, finishedSize - offset);\n    if (fileIdentifier != null) {\n      for (var i = 0; i < 4; i++) {\n        _setUint8AtTail(\n          finishedSize - _sizeofUint32 - i,\n          fileIdentifier.codeUnitAt(i),\n        );\n      }\n    }\n\n    // zero out the added padding\n    for (\n      var i = sizeBeforePadding + 1;\n      i <= finishedSize - requiredBytes;\n      i++\n    ) {\n      _setUint8AtTail(i, 0);\n    }\n    _finished = true;\n  }\n\n  /// Writes a Float64 to the tail of the buffer after preparing space for it.\n  ///\n  /// Updates the [offset] pointer.  This method is intended for use when writing structs to the buffer.\n  void putFloat64(double value) {\n    _prepare(_sizeofFloat64, 1);\n    _setFloat64AtTail(_tail, value);\n  }\n\n  /// Writes a Float32 to the tail of the buffer after preparing space for it.\n  ///\n  /// Updates the [offset] pointer.  This method is intended for use when writing structs to the buffer.\n  void putFloat32(double value) {\n    _prepare(_sizeofFloat32, 1);\n    _setFloat32AtTail(_tail, value);\n  }\n\n  /// Writes a bool to the tail of the buffer after preparing space for it.\n  /// Bools are represented as a Uint8, with the value set to '1' for true, and '0' for false\n  ///\n  /// Updates the [offset] pointer.  This method is intended for use when writing structs to the buffer.\n  void putBool(bool value) {\n    _prepare(_sizeofUint8, 1);\n    _buf.setInt8(_buf.lengthInBytes - _tail, value ? 1 : 0);\n  }\n\n  /// Writes a Int64 to the tail of the buffer after preparing space for it.\n  ///\n  /// Updates the [offset] pointer.  This method is intended for use when writing structs to the buffer.\n  void putInt64(int value) {\n    _prepare(_sizeofInt64, 1);\n    _setInt64AtTail(_tail, value);\n  }\n\n  /// Writes a Uint32 to the tail of the buffer after preparing space for it.\n  ///\n  /// Updates the [offset] pointer.  This method is intended for use when writing structs to the buffer.\n  void putInt32(int value) {\n    _prepare(_sizeofInt32, 1);\n    _setInt32AtTail(_tail, value);\n  }\n\n  /// Writes a Uint16 to the tail of the buffer after preparing space for it.\n  ///\n  /// Updates the [offset] pointer.  This method is intended for use when writing structs to the buffer.\n  void putInt16(int value) {\n    _prepare(_sizeofInt16, 1);\n    _setInt16AtTail(_tail, value);\n  }\n\n  /// Writes a Uint8 to the tail of the buffer after preparing space for it.\n  ///\n  /// Updates the [offset] pointer.  This method is intended for use when writing structs to the buffer.\n  void putInt8(int value) {\n    _prepare(_sizeofInt8, 1);\n    _buf.setInt8(_buf.lengthInBytes - _tail, value);\n  }\n\n  /// Writes a Uint64 to the tail of the buffer after preparing space for it.\n  ///\n  /// Updates the [offset] pointer.  This method is intended for use when writing structs to the buffer.\n  void putUint64(int value) {\n    _prepare(_sizeofUint64, 1);\n    _setUint64AtTail(_tail, value);\n  }\n\n  /// Writes a Uint32 to the tail of the buffer after preparing space for it.\n  ///\n  /// Updates the [offset] pointer.  This method is intended for use when writing structs to the buffer.\n  void putUint32(int value) {\n    _prepare(_sizeofUint32, 1);\n    _setUint32AtTail(_tail, value);\n  }\n\n  /// Writes a Uint16 to the tail of the buffer after preparing space for it.\n  ///\n  /// Updates the [offset] pointer.  This method is intended for use when writing structs to the buffer.\n  void putUint16(int value) {\n    _prepare(_sizeofUint16, 1);\n    _setUint16AtTail(_tail, value);\n  }\n\n  /// Writes a Uint8 to the tail of the buffer after preparing space for it.\n  ///\n  /// Updates the [offset] pointer.  This method is intended for use when writing structs to the buffer.\n  void putUint8(int value) {\n    _prepare(_sizeofUint8, 1);\n    _buf.setUint8(_buf.lengthInBytes - _tail, value);\n  }\n\n  /// Reset the builder and make it ready for filling a new buffer.\n  void reset() {\n    _finished = false;\n    _maxAlign = 1;\n    _tail = 0;\n    _currentVTable = null;\n    if (deduplicateTables) _vTables.clear();\n    if (_strings != null) {\n      _strings = <String, int>{};\n    }\n  }\n\n  /// Start a new table. Must be finished with [endTable] invocation.\n  void startTable(int numFields) {\n    assert(!_inVTable); // Inline tables are not supported.\n    _currentVTable = _VTable(numFields);\n    _currentTableEndTail = _tail;\n  }\n\n  /// Finish a Struct vector.  Most callers should preferto use [writeListOfStructs].\n  ///\n  /// Most callers should prefer [writeListOfStructs].\n  int endStructVector(int count) {\n    putUint32(count);\n    return _tail;\n  }\n\n  /// Writes a list of Structs to the buffer, returning the offset\n  int writeListOfStructs(List<ObjectBuilder> structBuilders) {\n    assert(!_inVTable);\n    for (var i = structBuilders.length - 1; i >= 0; i--) {\n      structBuilders[i].finish(this);\n    }\n    return endStructVector(structBuilders.length);\n  }\n\n  /// Write the given list of [values].\n  int writeList(List<int> values) {\n    assert(!_inVTable);\n    _prepare(_sizeofUint32, 1 + values.length);\n    final result = _tail;\n    var tail = _tail;\n    _setUint32AtTail(tail, values.length);\n    tail -= _sizeofUint32;\n    for (final value in values) {\n      _setUint32AtTail(tail, tail - value);\n      tail -= _sizeofUint32;\n    }\n    return result;\n  }\n\n  /// Write the given list of 64-bit float [values].\n  int writeListFloat64(List<double> values) {\n    assert(!_inVTable);\n    _prepare(_sizeofFloat64, values.length, additionalBytes: _sizeofUint32);\n    final result = _tail;\n    var tail = _tail;\n    _setUint32AtTail(tail, values.length);\n    tail -= _sizeofUint32;\n    for (final value in values) {\n      _setFloat64AtTail(tail, value);\n      tail -= _sizeofFloat64;\n    }\n    return result;\n  }\n\n  /// Write the given list of 32-bit float [values].\n  int writeListFloat32(List<double> values) {\n    assert(!_inVTable);\n    _prepare(_sizeofFloat32, 1 + values.length);\n    final result = _tail;\n    var tail = _tail;\n    _setUint32AtTail(tail, values.length);\n    tail -= _sizeofUint32;\n    for (final value in values) {\n      _setFloat32AtTail(tail, value);\n      tail -= _sizeofFloat32;\n    }\n    return result;\n  }\n\n  /// Write the given list of signed 64-bit integer [values].\n  int writeListInt64(List<int> values) {\n    assert(!_inVTable);\n    _prepare(_sizeofInt64, values.length, additionalBytes: _sizeofUint32);\n    final result = _tail;\n    var tail = _tail;\n    _setUint32AtTail(tail, values.length);\n    tail -= _sizeofUint32;\n    for (final value in values) {\n      _setInt64AtTail(tail, value);\n      tail -= _sizeofInt64;\n    }\n    return result;\n  }\n\n  /// Write the given list of signed 64-bit integer [values].\n  int writeListUint64(List<int> values) {\n    assert(!_inVTable);\n    _prepare(_sizeofUint64, values.length, additionalBytes: _sizeofUint32);\n    final result = _tail;\n    var tail = _tail;\n    _setUint32AtTail(tail, values.length);\n    tail -= _sizeofUint32;\n    for (final value in values) {\n      _setUint64AtTail(tail, value);\n      tail -= _sizeofUint64;\n    }\n    return result;\n  }\n\n  /// Write the given list of signed 32-bit integer [values].\n  int writeListInt32(List<int> values) {\n    assert(!_inVTable);\n    _prepare(_sizeofUint32, 1 + values.length);\n    final result = _tail;\n    var tail = _tail;\n    _setUint32AtTail(tail, values.length);\n    tail -= _sizeofUint32;\n    for (final value in values) {\n      _setInt32AtTail(tail, value);\n      tail -= _sizeofInt32;\n    }\n    return result;\n  }\n\n  /// Write the given list of unsigned 32-bit integer [values].\n  int writeListUint32(List<int> values) {\n    assert(!_inVTable);\n    _prepare(_sizeofUint32, 1 + values.length);\n    final result = _tail;\n    var tail = _tail;\n    _setUint32AtTail(tail, values.length);\n    tail -= _sizeofUint32;\n    for (final value in values) {\n      _setUint32AtTail(tail, value);\n      tail -= _sizeofUint32;\n    }\n    return result;\n  }\n\n  /// Write the given list of signed 16-bit integer [values].\n  int writeListInt16(List<int> values) {\n    assert(!_inVTable);\n    _prepare(_sizeofUint32, 1, additionalBytes: 2 * values.length);\n    final result = _tail;\n    var tail = _tail;\n    _setUint32AtTail(tail, values.length);\n    tail -= _sizeofUint32;\n    for (final value in values) {\n      _setInt16AtTail(tail, value);\n      tail -= _sizeofInt16;\n    }\n    return result;\n  }\n\n  /// Write the given list of unsigned 16-bit integer [values].\n  int writeListUint16(List<int> values) {\n    assert(!_inVTable);\n    _prepare(_sizeofUint32, 1, additionalBytes: 2 * values.length);\n    final result = _tail;\n    var tail = _tail;\n    _setUint32AtTail(tail, values.length);\n    tail -= _sizeofUint32;\n    for (final value in values) {\n      _setUint16AtTail(tail, value);\n      tail -= _sizeofUint16;\n    }\n    return result;\n  }\n\n  /// Write the given list of bools as unsigend 8-bit integer [values].\n  int writeListBool(List<bool> values) {\n    return writeListUint8(values.map((b) => b ? 1 : 0).toList());\n  }\n\n  /// Write the given list of signed 8-bit integer [values].\n  int writeListInt8(List<int> values) {\n    assert(!_inVTable);\n    _prepare(_sizeofUint32, 1, additionalBytes: values.length);\n    final result = _tail;\n    var tail = _tail;\n    _setUint32AtTail(tail, values.length);\n    tail -= _sizeofUint32;\n    for (final value in values) {\n      _setInt8AtTail(tail, value);\n      tail -= _sizeofUint8;\n    }\n    return result;\n  }\n\n  /// Write the given list of unsigned 8-bit integer [values].\n  int writeListUint8(List<int> values) {\n    assert(!_inVTable);\n    _prepare(_sizeofUint32, 1, additionalBytes: values.length);\n    final result = _tail;\n    var tail = _tail;\n    _setUint32AtTail(tail, values.length);\n    tail -= _sizeofUint32;\n    for (final value in values) {\n      _setUint8AtTail(tail, value);\n      tail -= _sizeofUint8;\n    }\n    return result;\n  }\n\n  /// Write the given string [value] and return its offset.\n  ///\n  /// Dart strings are UTF-16 but must be stored as UTF-8 in FlatBuffers.\n  /// If the given string consists only of ASCII characters, you can indicate\n  /// enable [asciiOptimization]. In this mode, [writeString()] first tries to\n  /// copy the ASCII string directly to the output buffer and if that fails\n  /// (because there are no-ASCII characters in the string) it falls back and to\n  /// the default UTF-16 -> UTF-8 conversion (with slight performance penalty).\n  int writeString(String value, {bool asciiOptimization = false}) {\n    assert(!_inVTable);\n    if (_strings != null) {\n      return _strings!.putIfAbsent(\n        value,\n        () => _writeString(value, asciiOptimization),\n      );\n    } else {\n      return _writeString(value, asciiOptimization);\n    }\n  }\n\n  int _writeString(String value, bool asciiOptimization) {\n    if (asciiOptimization) {\n      // [utf8.encode()] is slow (up to at least Dart SDK 2.13). If the given\n      // string is ASCII we can just write it directly, without any conversion.\n      final originalTail = _tail;\n      if (_tryWriteASCIIString(value)) return _tail;\n      // if non-ASCII: reset the output buffer position for [_writeUTFString()]\n      _tail = originalTail;\n    }\n    _writeUTFString(value);\n    return _tail;\n  }\n\n  // Try to write the string as ASCII, return false if there's a non-ascii char.\n  @pragma('vm:prefer-inline')\n  bool _tryWriteASCIIString(String value) {\n    _prepare(4, 1, additionalBytes: value.length + 1);\n    final length = value.length;\n    var offset = _buf.lengthInBytes - _tail + 4;\n    for (var i = 0; i < length; i++) {\n      // utf16 code unit, e.g. for '†' it's [0x20 0x20], which is 8224 decimal.\n      // ASCII characters go from 0x00 to 0x7F (which is 0 to 127 decimal).\n      final char = value.codeUnitAt(i);\n      if ((char & ~0x7F) != 0) {\n        return false;\n      }\n      _buf.setUint8(offset++, char);\n    }\n    _buf.setUint8(offset, 0); // trailing zero\n    _setUint32AtTail(_tail, value.length);\n    return true;\n  }\n\n  @pragma('vm:prefer-inline')\n  void _writeUTFString(String value) {\n    final bytes = utf8.encode(value) as Uint8List;\n    final length = bytes.length;\n    _prepare(4, 1, additionalBytes: length + 1);\n    _setUint32AtTail(_tail, length);\n    var offset = _buf.lengthInBytes - _tail + 4;\n    for (var i = 0; i < length; i++) {\n      _buf.setUint8(offset++, bytes[i]);\n    }\n    _buf.setUint8(offset, 0); // trailing zero\n  }\n\n  /// Used to assert whether a \"Table\" is currently being built.\n  ///\n  /// If you hit `assert(!_inVTable())`, you're trying to add table fields\n  /// without starting a table with [Builder.startTable()].\n  ///\n  /// If you hit `assert(_inVTable())`, you're trying to construct a\n  /// Table/Vector/String during the construction of its parent table,\n  /// between the MyTableBuilder and [Builder.endTable()].\n  /// Move the creation of these sub-objects to before the MyTableBuilder to\n  /// not get this assert.\n  @pragma('vm:prefer-inline')\n  bool get _inVTable => _currentVTable != null;\n\n  /// The number of bytes that have been written to the buffer so far.  The\n  /// most recently written byte is this many bytes from the end of the buffer.\n  @pragma('vm:prefer-inline')\n  int get offset => _tail;\n\n  /// Zero-pads the buffer, which may be required for some struct layouts.\n  @pragma('vm:prefer-inline')\n  void pad(int howManyBytes) {\n    for (var i = 0; i < howManyBytes; i++) {\n      putUint8(0);\n    }\n  }\n\n  /// Prepare for writing the given `count` of scalars of the given `size`.\n  /// Additionally allocate the specified `additionalBytes`. Update the current\n  /// tail pointer to point at the allocated space.\n  @pragma('vm:prefer-inline')\n  void _prepare(int size, int count, {int additionalBytes = 0}) {\n    assert(!_finished);\n    // Update the alignment.\n    if (_maxAlign < size) {\n      _maxAlign = size;\n    }\n    // Prepare amount of required space.\n    final dataSize = size * count + additionalBytes;\n    final alignDelta = (-(_tail + dataSize)) & (size - 1);\n    final bufSize = alignDelta + dataSize;\n    // Ensure that we have the required amount of space.\n    {\n      final oldCapacity = _buf.lengthInBytes;\n      if (_tail + bufSize > oldCapacity) {\n        final desiredNewCapacity = (oldCapacity + bufSize) * 2;\n        var deltaCapacity = desiredNewCapacity - oldCapacity;\n        deltaCapacity += (-deltaCapacity) & (_maxAlign - 1);\n        final newCapacity = oldCapacity + deltaCapacity;\n        _buf = _allocator.resize(_buf, newCapacity, _tail, 0);\n      }\n    }\n\n    // zero out the added padding\n    for (var i = _tail + 1; i <= _tail + alignDelta; i++) {\n      _setUint8AtTail(i, 0);\n    }\n\n    // Update the tail pointer.\n    _tail += bufSize;\n  }\n\n  /// Record the offset of the given [field].\n  @pragma('vm:prefer-inline')\n  void _trackField(int field) => _currentVTable!.addField(field, _tail);\n\n  @pragma('vm:prefer-inline')\n  void _setFloat64AtTail(int tail, double x) =>\n      _buf.setFloat64(_buf.lengthInBytes - tail, x, Endian.little);\n\n  @pragma('vm:prefer-inline')\n  void _setFloat32AtTail(int tail, double x) =>\n      _buf.setFloat32(_buf.lengthInBytes - tail, x, Endian.little);\n\n  @pragma('vm:prefer-inline')\n  void _setUint64AtTail(int tail, int x) =>\n      _buf.setUint64(_buf.lengthInBytes - tail, x, Endian.little);\n\n  @pragma('vm:prefer-inline')\n  void _setInt64AtTail(int tail, int x) =>\n      _buf.setInt64(_buf.lengthInBytes - tail, x, Endian.little);\n\n  @pragma('vm:prefer-inline')\n  void _setInt32AtTail(int tail, int x) =>\n      _buf.setInt32(_buf.lengthInBytes - tail, x, Endian.little);\n\n  @pragma('vm:prefer-inline')\n  void _setUint32AtTail(int tail, int x) =>\n      _buf.setUint32(_buf.lengthInBytes - tail, x, Endian.little);\n\n  @pragma('vm:prefer-inline')\n  void _setInt16AtTail(int tail, int x) =>\n      _buf.setInt16(_buf.lengthInBytes - tail, x, Endian.little);\n\n  @pragma('vm:prefer-inline')\n  void _setUint16AtTail(int tail, int x) =>\n      _buf.setUint16(_buf.lengthInBytes - tail, x, Endian.little);\n\n  @pragma('vm:prefer-inline')\n  void _setInt8AtTail(int tail, int x) =>\n      _buf.setInt8(_buf.lengthInBytes - tail, x);\n\n  @pragma('vm:prefer-inline')\n  void _setUint8AtTail(int tail, int x) =>\n      _buf.setUint8(_buf.lengthInBytes - tail, x);\n}\n\n/// Reader of lists of boolean values.\n///\n/// The returned unmodifiable lists lazily read values on access.\nclass BoolListReader extends Reader<List<bool>> {\n  const BoolListReader();\n\n  @override\n  @pragma('vm:prefer-inline')\n  int get size => _sizeofUint32;\n\n  @override\n  @pragma('vm:prefer-inline')\n  List<bool> read(BufferContext bc, int offset) =>\n      _FbBoolList(bc, bc.derefObject(offset));\n}\n\n/// The reader of booleans.\nclass BoolReader extends Reader<bool> {\n  const BoolReader() : super();\n\n  @override\n  @pragma('vm:prefer-inline')\n  int get size => _sizeofUint8;\n\n  @override\n  @pragma('vm:prefer-inline')\n  bool read(BufferContext bc, int offset) => bc._getInt8(offset) != 0;\n}\n\n/// The reader of lists of 64-bit float values.\n///\n/// The returned unmodifiable lists lazily read values on access.\nclass Float64ListReader extends Reader<List<double>> {\n  const Float64ListReader();\n\n  @override\n  @pragma('vm:prefer-inline')\n  int get size => _sizeofFloat64;\n\n  @override\n  @pragma('vm:prefer-inline')\n  List<double> read(BufferContext bc, int offset) =>\n      _FbFloat64List(bc, bc.derefObject(offset));\n}\n\nclass Float32ListReader extends Reader<List<double>> {\n  const Float32ListReader();\n\n  @override\n  @pragma('vm:prefer-inline')\n  int get size => _sizeofFloat32;\n\n  @override\n  @pragma('vm:prefer-inline')\n  List<double> read(BufferContext bc, int offset) =>\n      _FbFloat32List(bc, bc.derefObject(offset));\n}\n\nclass Float64Reader extends Reader<double> {\n  const Float64Reader();\n\n  @override\n  @pragma('vm:prefer-inline')\n  int get size => _sizeofFloat64;\n\n  @override\n  @pragma('vm:prefer-inline')\n  double read(BufferContext bc, int offset) => bc._getFloat64(offset);\n}\n\nclass Float32Reader extends Reader<double> {\n  const Float32Reader();\n\n  @override\n  @pragma('vm:prefer-inline')\n  int get size => _sizeofFloat32;\n\n  @override\n  @pragma('vm:prefer-inline')\n  double read(BufferContext bc, int offset) => bc._getFloat32(offset);\n}\n\nclass Int64Reader extends Reader<int> {\n  const Int64Reader() : super();\n\n  @override\n  @pragma('vm:prefer-inline')\n  int get size => _sizeofInt64;\n\n  @override\n  @pragma('vm:prefer-inline')\n  int read(BufferContext bc, int offset) => bc._getInt64(offset);\n}\n\n/// The reader of signed 32-bit integers.\nclass Int32Reader extends Reader<int> {\n  const Int32Reader() : super();\n\n  @override\n  @pragma('vm:prefer-inline')\n  int get size => _sizeofInt32;\n\n  @override\n  @pragma('vm:prefer-inline')\n  int read(BufferContext bc, int offset) => bc._getInt32(offset);\n}\n\n/// The reader of signed 32-bit integers.\nclass Int16Reader extends Reader<int> {\n  const Int16Reader() : super();\n\n  @override\n  @pragma('vm:prefer-inline')\n  int get size => _sizeofInt16;\n\n  @override\n  @pragma('vm:prefer-inline')\n  int read(BufferContext bc, int offset) => bc._getInt16(offset);\n}\n\n/// The reader of 8-bit signed integers.\nclass Int8Reader extends Reader<int> {\n  const Int8Reader() : super();\n\n  @override\n  @pragma('vm:prefer-inline')\n  int get size => _sizeofInt8;\n\n  @override\n  @pragma('vm:prefer-inline')\n  int read(BufferContext bc, int offset) => bc._getInt8(offset);\n}\n\n/// The reader of lists of objects. Lazy by default - see [lazy].\nclass ListReader<E> extends Reader<List<E>> {\n  final Reader<E> _elementReader;\n\n  /// Enables lazy reading of the list\n  ///\n  /// If true, the returned unmodifiable list lazily reads objects on access.\n  /// Therefore, the underlying buffer must not change while accessing the list.\n  ///\n  /// If false, reads the whole list immediately on access.\n  final bool lazy;\n\n  const ListReader(this._elementReader, {this.lazy = true});\n\n  @override\n  @pragma('vm:prefer-inline')\n  int get size => _sizeofUint32;\n\n  @override\n  List<E> read(BufferContext bc, int offset) {\n    final listOffset = bc.derefObject(offset);\n    return lazy\n        ? _FbGenericList<E>(_elementReader, bc, listOffset)\n        : List<E>.generate(\n            bc.buffer.getUint32(listOffset, Endian.little),\n            (int index) => _elementReader.read(\n              bc,\n              listOffset + size + _elementReader.size * index,\n            ),\n            growable: true,\n          );\n  }\n}\n\n/// Object that can read a value at a [BufferContext].\nabstract class Reader<T> {\n  const Reader();\n\n  /// The size of the value in bytes.\n  int get size;\n\n  /// Read the value at the given [offset] in [bc].\n  T read(BufferContext bc, int offset);\n\n  /// Read the value of the given [field] in the given [object].\n  @pragma('vm:prefer-inline')\n  T vTableGet(BufferContext object, int offset, int field, T defaultValue) {\n    final fieldOffset = _vTableFieldOffset(object, offset, field);\n    return fieldOffset == 0 ? defaultValue : read(object, offset + fieldOffset);\n  }\n\n  /// Read the value of the given [field] in the given [object].\n  @pragma('vm:prefer-inline')\n  T? vTableGetNullable(BufferContext object, int offset, int field) {\n    final fieldOffset = _vTableFieldOffset(object, offset, field);\n    return fieldOffset == 0 ? null : read(object, offset + fieldOffset);\n  }\n\n  @pragma('vm:prefer-inline')\n  int _vTableFieldOffset(BufferContext object, int offset, int field) {\n    final vTableSOffset = object._getInt32(offset);\n    final vTableOffset = offset - vTableSOffset;\n    final vTableSize = object._getUint16(vTableOffset);\n    if (field >= vTableSize) return 0;\n    return object._getUint16(vTableOffset + field);\n  }\n}\n\n/// The reader of string values.\nclass StringReader extends Reader<String> {\n  final bool asciiOptimization;\n\n  const StringReader({this.asciiOptimization = false}) : super();\n\n  @override\n  @pragma('vm:prefer-inline')\n  int get size => _sizeofUint32;\n\n  @override\n  @pragma('vm:prefer-inline')\n  String read(BufferContext bc, int offset) {\n    final strOffset = bc.derefObject(offset);\n    final length = bc._getUint32(strOffset);\n    final bytes = bc._asUint8List(strOffset + _sizeofUint32, length);\n    if (asciiOptimization && _isLatin(bytes)) {\n      return String.fromCharCodes(bytes);\n    }\n    return utf8.decode(bytes);\n  }\n\n  @pragma('vm:prefer-inline')\n  static bool _isLatin(Uint8List bytes) {\n    final length = bytes.length;\n    for (var i = 0; i < length; i++) {\n      if (bytes[i] > 127) {\n        return false;\n      }\n    }\n    return true;\n  }\n}\n\n/// An abstract reader for structs.\nabstract class StructReader<T> extends Reader<T> {\n  const StructReader();\n\n  /// Return the object at `offset`.\n  T createObject(BufferContext bc, int offset);\n\n  @override\n  T read(BufferContext bc, int offset) {\n    return createObject(bc, offset);\n  }\n}\n\n/// An abstract reader for tables.\nabstract class TableReader<T> extends Reader<T> {\n  const TableReader();\n\n  @override\n  @pragma('vm:prefer-inline')\n  int get size => 4;\n\n  /// Return the object at [offset].\n  T createObject(BufferContext bc, int offset);\n\n  @override\n  T read(BufferContext bc, int offset) {\n    final objectOffset = bc.derefObject(offset);\n    return createObject(bc, objectOffset);\n  }\n}\n\n/// Reader of lists of unsigned 32-bit integer values.\n///\n/// The returned unmodifiable lists lazily read values on access.\nclass Uint32ListReader extends Reader<List<int>> {\n  const Uint32ListReader();\n\n  @override\n  @pragma('vm:prefer-inline')\n  int get size => _sizeofUint32;\n\n  @override\n  @pragma('vm:prefer-inline')\n  List<int> read(BufferContext bc, int offset) =>\n      _FbUint32List(bc, bc.derefObject(offset));\n}\n\n/// The reader of unsigned 64-bit integers.\n///\n/// WARNING: May have compatibility issues with JavaScript\nclass Uint64Reader extends Reader<int> {\n  const Uint64Reader() : super();\n\n  @override\n  @pragma('vm:prefer-inline')\n  int get size => _sizeofUint64;\n\n  @override\n  @pragma('vm:prefer-inline')\n  int read(BufferContext bc, int offset) => bc._getUint64(offset);\n}\n\n/// The reader of unsigned 32-bit integers.\nclass Uint32Reader extends Reader<int> {\n  const Uint32Reader() : super();\n\n  @override\n  @pragma('vm:prefer-inline')\n  int get size => _sizeofUint32;\n\n  @override\n  @pragma('vm:prefer-inline')\n  int read(BufferContext bc, int offset) => bc._getUint32(offset);\n}\n\n/// Reader of lists of unsigned 32-bit integer values.\n///\n/// The returned unmodifiable lists lazily read values on access.\nclass Uint16ListReader extends Reader<List<int>> {\n  const Uint16ListReader();\n\n  @override\n  @pragma('vm:prefer-inline')\n  int get size => _sizeofUint32;\n\n  @override\n  @pragma('vm:prefer-inline')\n  List<int> read(BufferContext bc, int offset) =>\n      _FbUint16List(bc, bc.derefObject(offset));\n}\n\n/// The reader of unsigned 32-bit integers.\nclass Uint16Reader extends Reader<int> {\n  const Uint16Reader() : super();\n\n  @override\n  @pragma('vm:prefer-inline')\n  int get size => _sizeofUint16;\n\n  @override\n  @pragma('vm:prefer-inline')\n  int read(BufferContext bc, int offset) => bc._getUint16(offset);\n}\n\n/// Reader of unmodifiable binary data (a list of unsigned 8-bit integers).\nclass Uint8ListReader extends Reader<List<int>> {\n  /// Enables lazy reading of the list\n  ///\n  /// If true, the returned unmodifiable list lazily reads bytes on access.\n  /// Therefore, the underlying buffer must not change while accessing the list.\n  ///\n  /// If false, reads the whole list immediately as an Uint8List.\n  final bool lazy;\n\n  const Uint8ListReader({this.lazy = true});\n\n  @override\n  @pragma('vm:prefer-inline')\n  int get size => _sizeofUint32;\n\n  @override\n  @pragma('vm:prefer-inline')\n  List<int> read(BufferContext bc, int offset) {\n    final listOffset = bc.derefObject(offset);\n    if (lazy) return _FbUint8List(bc, listOffset);\n\n    final length = bc._getUint32(listOffset);\n    final result = Uint8List(length);\n    var pos = listOffset + _sizeofUint32;\n    for (var i = 0; i < length; i++, pos++) {\n      result[i] = bc._getUint8(pos);\n    }\n    return result;\n  }\n}\n\n/// The reader of unsigned 8-bit integers.\nclass Uint8Reader extends Reader<int> {\n  const Uint8Reader() : super();\n\n  @override\n  @pragma('vm:prefer-inline')\n  int get size => _sizeofUint8;\n\n  @override\n  @pragma('vm:prefer-inline')\n  int read(BufferContext bc, int offset) => bc._getUint8(offset);\n}\n\n/// Reader of unmodifiable binary data (a list of signed 8-bit integers).\nclass Int8ListReader extends Reader<List<int>> {\n  /// Enables lazy reading of the list\n  ///\n  /// If true, the returned unmodifiable list lazily reads bytes on access.\n  /// Therefore, the underlying buffer must not change while accessing the list.\n  ///\n  /// If false, reads the whole list immediately as an Uint8List.\n  final bool lazy;\n\n  const Int8ListReader({this.lazy = true});\n\n  @override\n  @pragma('vm:prefer-inline')\n  int get size => _sizeofUint32;\n\n  @override\n  @pragma('vm:prefer-inline')\n  List<int> read(BufferContext bc, int offset) {\n    final listOffset = bc.derefObject(offset);\n    if (lazy) return _FbUint8List(bc, listOffset);\n\n    final length = bc._getUint32(listOffset);\n    final result = Int8List(length);\n    var pos = listOffset + _sizeofUint32;\n    for (var i = 0; i < length; i++, pos++) {\n      result[i] = bc._getInt8(pos);\n    }\n    return result;\n  }\n}\n\n/// The list backed by 64-bit values - Uint64 length and Float64.\nclass _FbFloat64List extends _FbList<double> {\n  _FbFloat64List(BufferContext bc, int offset) : super(bc, offset);\n\n  @override\n  @pragma('vm:prefer-inline')\n  double operator [](int i) => bc._getFloat64(offset + 4 + 8 * i);\n}\n\n/// The list backed by 32-bit values - Float32.\nclass _FbFloat32List extends _FbList<double> {\n  _FbFloat32List(BufferContext bc, int offset) : super(bc, offset);\n\n  @override\n  @pragma('vm:prefer-inline')\n  double operator [](int i) => bc._getFloat32(offset + 4 + 4 * i);\n}\n\n/// List backed by a generic object which may have any size.\nclass _FbGenericList<E> extends _FbList<E> {\n  final Reader<E> elementReader;\n\n  List<E?>? _items;\n\n  _FbGenericList(this.elementReader, BufferContext bp, int offset)\n    : super(bp, offset);\n\n  @override\n  @pragma('vm:prefer-inline')\n  E operator [](int i) {\n    _items ??= List<E?>.filled(length, null);\n    var item = _items![i];\n    if (item == null) {\n      item = elementReader.read(bc, offset + 4 + elementReader.size * i);\n      _items![i] = item;\n    }\n    return item!;\n  }\n}\n\n/// The base class for immutable lists read from flat buffers.\nabstract class _FbList<E> extends Object with ListMixin<E> implements List<E> {\n  final BufferContext bc;\n  final int offset;\n  int? _length;\n\n  _FbList(this.bc, this.offset);\n\n  @override\n  @pragma('vm:prefer-inline')\n  int get length => _length ??= bc._getUint32(offset);\n\n  @override\n  set length(int i) => throw StateError('Attempt to modify immutable list');\n\n  @override\n  void operator []=(int i, E e) =>\n      throw StateError('Attempt to modify immutable list');\n}\n\n/// List backed by 32-bit unsigned integers.\nclass _FbUint32List extends _FbList<int> {\n  _FbUint32List(BufferContext bc, int offset) : super(bc, offset);\n\n  @override\n  @pragma('vm:prefer-inline')\n  int operator [](int i) => bc._getUint32(offset + 4 + 4 * i);\n}\n\n/// List backed by 16-bit unsigned integers.\nclass _FbUint16List extends _FbList<int> {\n  _FbUint16List(BufferContext bc, int offset) : super(bc, offset);\n\n  @override\n  @pragma('vm:prefer-inline')\n  int operator [](int i) => bc._getUint16(offset + 4 + 2 * i);\n}\n\n/// List backed by 8-bit unsigned integers.\nclass _FbUint8List extends _FbList<int> {\n  _FbUint8List(BufferContext bc, int offset) : super(bc, offset);\n\n  @override\n  @pragma('vm:prefer-inline')\n  int operator [](int i) => bc._getUint8(offset + 4 + i);\n}\n\n/// List backed by 8-bit signed integers.\nclass _FbInt8List extends _FbList<int> {\n  _FbInt8List(BufferContext bc, int offset) : super(bc, offset);\n\n  @override\n  @pragma('vm:prefer-inline')\n  int operator [](int i) => bc._getInt8(offset + 4 + i);\n}\n\n/// List backed by 8-bit unsigned integers.\nclass _FbBoolList extends _FbList<bool> {\n  _FbBoolList(BufferContext bc, int offset) : super(bc, offset);\n\n  @override\n  @pragma('vm:prefer-inline')\n  bool operator [](int i) => bc._getUint8(offset + 4 + i) == 1 ? true : false;\n}\n\n/// Class that describes the structure of a table.\nclass _VTable {\n  static const int _metadataLength = 4;\n\n  final int numFields;\n\n  // Note: fieldOffsets start as \"tail offsets\" and are then transformed by\n  // [computeFieldOffsets()] to actual offsets when a table is finished.\n  final Uint32List fieldOffsets;\n  bool offsetsComputed = false;\n\n  _VTable(this.numFields) : fieldOffsets = Uint32List(numFields);\n\n  /// The size of the table that uses this VTable.\n  int tableSize = 0;\n\n  /// The tail of this VTable. It is used to share the same VTable between\n  /// multiple tables of identical structure.\n  int tail = 0;\n\n  int get _vTableSize => numOfUint16 * _sizeofUint16;\n\n  int get numOfUint16 => 1 + 1 + numFields;\n\n  @pragma('vm:prefer-inline')\n  void addField(int field, int offset) {\n    assert(!offsetsComputed);\n    assert(offset > 0); // it's impossible for field to start at the buffer end\n    assert(offset <= 4294967295); // uint32 max\n    fieldOffsets[field] = offset;\n  }\n\n  @pragma('vm:prefer-inline')\n  bool _offsetsMatch(int vt2Start, ByteData buf) {\n    assert(offsetsComputed);\n    for (var i = 0; i < numFields; i++) {\n      if (fieldOffsets[i] !=\n          buf.getUint16(vt2Start + _metadataLength + (2 * i), Endian.little)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /// Fill the [fieldOffsets] field.\n  @pragma('vm:prefer-inline')\n  void computeFieldOffsets(int tableTail) {\n    assert(!offsetsComputed);\n    offsetsComputed = true;\n    for (var i = 0; i < numFields; i++) {\n      if (fieldOffsets[i] != 0) {\n        fieldOffsets[i] = tableTail - fieldOffsets[i];\n      }\n    }\n  }\n\n  /// Outputs this VTable to [buf], which is is expected to be aligned to 16-bit\n  /// and have at least [numOfUint16] 16-bit words available.\n  @pragma('vm:prefer-inline')\n  void output(ByteData buf, int bufOffset) {\n    assert(offsetsComputed);\n    // VTable size.\n    buf.setUint16(bufOffset, numOfUint16 * 2, Endian.little);\n    bufOffset += 2;\n    // Table size.\n    buf.setUint16(bufOffset, tableSize, Endian.little);\n    bufOffset += 2;\n    // Field offsets.\n    for (var i = 0; i < numFields; i++) {\n      buf.setUint16(bufOffset, fieldOffsets[i], Endian.little);\n      bufOffset += 2;\n    }\n  }\n}\n\n/// The interface that [Builder] uses to allocate buffers for encoding.\nabstract class Allocator {\n  const Allocator();\n\n  /// Allocate a [ByteData] buffer of a given size.\n  ByteData allocate(int size);\n\n  /// Free the given [ByteData] buffer previously allocated by [allocate].\n  void deallocate(ByteData data);\n\n  /// Reallocate [newSize] bytes of memory, replacing the old [oldData]. This\n  /// grows downwards, and is intended specifically for use with [Builder].\n  /// Params [inUseBack] and [inUseFront] indicate how much of [oldData] is\n  /// actually in use at each end, and needs to be copied.\n  ByteData resize(\n    ByteData oldData,\n    int newSize,\n    int inUseBack,\n    int inUseFront,\n  ) {\n    final newData = allocate(newSize);\n    _copyDownward(oldData, newData, inUseBack, inUseFront);\n    deallocate(oldData);\n    return newData;\n  }\n\n  /// Called by [resize] to copy memory from [oldData] to [newData]. Only\n  /// memory of size [inUseFront] and [inUseBack] will be copied from the front\n  /// and back of the old memory allocation.\n  void _copyDownward(\n    ByteData oldData,\n    ByteData newData,\n    int inUseBack,\n    int inUseFront,\n  ) {\n    if (inUseBack != 0) {\n      newData.buffer.asUint8List().setAll(\n        newData.lengthInBytes - inUseBack,\n        oldData.buffer.asUint8List().getRange(\n          oldData.lengthInBytes - inUseBack,\n          oldData.lengthInBytes,\n        ),\n      );\n    }\n    if (inUseFront != 0) {\n      newData.buffer.asUint8List().setAll(\n        0,\n        oldData.buffer.asUint8List().getRange(0, inUseFront),\n      );\n    }\n  }\n}\n\nclass DefaultAllocator extends Allocator {\n  const DefaultAllocator();\n\n  @override\n  ByteData allocate(int size) => ByteData(size);\n\n  @override\n  void deallocate(ByteData data) {\n    // nothing to do, it's garbage-collected\n  }\n}\n"
  },
  {
    "path": "dart/lib/flex_buffers.dart",
    "content": "export 'src/builder.dart';\nexport 'src/reference.dart';\n"
  },
  {
    "path": "dart/lib/src/builder.dart",
    "content": "import 'dart:convert';\nimport 'dart:typed_data';\n\nimport 'types.dart';\n\n/// The main builder class for creation of a FlexBuffer.\nclass Builder {\n  ByteData _buffer;\n  List<_StackValue> _stack = [];\n  List<_StackPointer> _stackPointers = [];\n  int _offset = 0;\n  bool _finished = false;\n  final Map<String, _StackValue> _stringCache = {};\n  final Map<String, _StackValue> _keyCache = {};\n  final Map<_KeysHash, _StackValue> _keyVectorCache = {};\n  final Map<int, _StackValue> _indirectIntCache = {};\n  final Map<double, _StackValue> _indirectDoubleCache = {};\n\n  /// Instantiate the builder if you intent to gradually build up the buffer by calling\n  /// add... methods and calling [finish] to receive the resulting byte array.\n  ///\n  /// The default size of internal buffer is set to 2048. Provide a different value in order to avoid buffer copies.\n  Builder({int size = 2048}) : _buffer = ByteData(size);\n\n  /// Use this method in order to turn an object into a FlexBuffer directly.\n  ///\n  /// Use the manual instantiation of the [Builder] and gradual addition of values, if performance is more important than convenience.\n  static ByteBuffer buildFromObject(Object? value) {\n    final builder = Builder();\n    builder._add(value);\n    final buffer = builder.finish();\n    final byteData = ByteData(buffer.lengthInBytes);\n    byteData.buffer.asUint8List().setAll(0, buffer);\n    return byteData.buffer;\n  }\n\n  void _add(Object? value) {\n    if (value == null) {\n      addNull();\n    } else if (value is bool) {\n      addBool(value);\n    } else if (value is int) {\n      addInt(value);\n    } else if (value is double) {\n      addDouble(value);\n    } else if (value is ByteBuffer) {\n      addBlob(value);\n    } else if (value is String) {\n      addString(value);\n    } else if (value is List<dynamic>) {\n      startVector();\n      for (var i = 0; i < value.length; i++) {\n        _add(value[i]);\n      }\n      end();\n    } else if (value is Map<String, dynamic>) {\n      startMap();\n      value.forEach((key, value) {\n        addKey(key);\n        _add(value);\n      });\n      end();\n    } else {\n      throw UnsupportedError('Value of unexpected type: $value');\n    }\n  }\n\n  /// Use this method if you want to store a null value.\n  ///\n  /// Specifically useful when building up a vector where values can be null.\n  void addNull() {\n    _integrityCheckOnValueAddition();\n    _stack.add(_StackValue.withNull());\n  }\n\n  /// Adds a string value.\n  void addInt(int value) {\n    _integrityCheckOnValueAddition();\n    _stack.add(_StackValue.withInt(value));\n  }\n\n  /// Adds a bool value.\n  void addBool(bool value) {\n    _integrityCheckOnValueAddition();\n    _stack.add(_StackValue.withBool(value));\n  }\n\n  /// Adds a double value.\n  void addDouble(double value) {\n    _integrityCheckOnValueAddition();\n    _stack.add(_StackValue.withDouble(value));\n  }\n\n  /// Adds a string value.\n  void addString(String value) {\n    _integrityCheckOnValueAddition();\n    if (_stringCache.containsKey(value)) {\n      _stack.add(_stringCache[value]!);\n      return;\n    }\n    final utf8String = utf8.encode(value);\n    final length = utf8String.length;\n    final bitWidth = BitWidthUtil.uwidth(length);\n    final byteWidth = _align(bitWidth);\n    _writeUInt(length, byteWidth);\n    final stringOffset = _offset;\n    final newOffset = _newOffset(length + 1);\n    _pushBuffer(utf8String);\n    _offset = newOffset;\n    final stackValue = _StackValue.withOffset(\n      stringOffset,\n      ValueType.String,\n      bitWidth,\n    );\n    _stack.add(stackValue);\n    _stringCache[value] = stackValue;\n  }\n\n  /// This methods adds a key to a map and should be followed by an add... value call.\n  ///\n  /// It also implies that you call this method only after you called [startMap].\n  void addKey(String value) {\n    _integrityCheckOnKeyAddition();\n    if (_keyCache.containsKey(value)) {\n      _stack.add(_keyCache[value]!);\n      return;\n    }\n    final utf8String = utf8.encode(value);\n    final length = utf8String.length;\n    final keyOffset = _offset;\n    final newOffset = _newOffset(length + 1);\n    _pushBuffer(utf8String);\n    _offset = newOffset;\n    final stackValue = _StackValue.withOffset(\n      keyOffset,\n      ValueType.Key,\n      BitWidth.width8,\n    );\n    _stack.add(stackValue);\n    _keyCache[value] = stackValue;\n  }\n\n  /// Adds a byte array.\n  ///\n  /// This method can be used to store any generic BLOB.\n  void addBlob(ByteBuffer value) {\n    _integrityCheckOnValueAddition();\n    final length = value.lengthInBytes;\n    final bitWidth = BitWidthUtil.uwidth(length);\n    final byteWidth = _align(bitWidth);\n    _writeUInt(length, byteWidth);\n    final blobOffset = _offset;\n    final newOffset = _newOffset(length);\n    _pushBuffer(value.asUint8List());\n    _offset = newOffset;\n    final stackValue = _StackValue.withOffset(\n      blobOffset,\n      ValueType.Blob,\n      bitWidth,\n    );\n    _stack.add(stackValue);\n  }\n\n  /// Stores int value indirectly in the buffer.\n  ///\n  /// Adding large integer values indirectly might be beneficial if those values suppose to be store in a vector together with small integer values.\n  /// This is due to the fact that FlexBuffers will add padding to small integer values, if they are stored together with large integer values.\n  /// When we add integer indirectly the vector of ints will contain not the value itself, but only the relative offset to the value.\n  /// By setting the [cache] parameter to true, you make sure that the builder tracks added int value and performs deduplication.\n  void addIntIndirectly(int value, {bool cache = false}) {\n    _integrityCheckOnValueAddition();\n    if (_indirectIntCache.containsKey(value)) {\n      _stack.add(_indirectIntCache[value]!);\n      return;\n    }\n    final stackValue = _StackValue.withInt(value);\n    final byteWidth = _align(stackValue.width);\n    final newOffset = _newOffset(byteWidth);\n    final valueOffset = _offset;\n    _pushBuffer(stackValue.asU8List(stackValue.width));\n    final stackOffset = _StackValue.withOffset(\n      valueOffset,\n      ValueType.IndirectInt,\n      stackValue.width,\n    );\n    _stack.add(stackOffset);\n    _offset = newOffset;\n    if (cache) {\n      _indirectIntCache[value] = stackOffset;\n    }\n  }\n\n  /// Stores double value indirectly in the buffer.\n  ///\n  /// Double are stored as 8 or 4 byte values in FlexBuffers. If they are stored in a mixed vector, values which are smaller than 4 / 8 bytes will be padded.\n  /// When we add double indirectly, the vector will contain not the value itself, but only the relative offset to the value. Which could occupy only 1 or 2 bytes, reducing the odds for unnecessary padding.\n  /// By setting the [cache] parameter to true, you make sure that the builder tracks already added double value and performs deduplication.\n  void addDoubleIndirectly(double value, {bool cache = false}) {\n    _integrityCheckOnValueAddition();\n    if (cache && _indirectDoubleCache.containsKey(value)) {\n      _stack.add(_indirectDoubleCache[value]!);\n      return;\n    }\n    final stackValue = _StackValue.withDouble(value);\n    final byteWidth = _align(stackValue.width);\n    final newOffset = _newOffset(byteWidth);\n    final valueOffset = _offset;\n    _pushBuffer(stackValue.asU8List(stackValue.width));\n    final stackOffset = _StackValue.withOffset(\n      valueOffset,\n      ValueType.IndirectFloat,\n      stackValue.width,\n    );\n    _stack.add(stackOffset);\n    _offset = newOffset;\n    if (cache) {\n      _indirectDoubleCache[value] = stackOffset;\n    }\n  }\n\n  /// This method starts a vector definition and needs to be followed by 0 to n add... value calls.\n  ///\n  /// The vector definition needs to be finished with an [end] call.\n  /// It is also possible to add nested vector or map by calling [startVector] / [startMap].\n  void startVector() {\n    _integrityCheckOnValueAddition();\n    _stackPointers.add(_StackPointer(_stack.length, true));\n  }\n\n  /// This method starts a map definition.\n  ///\n  /// This method call needs to be followed by 0 to n [addKey] +  add... value calls.\n  /// The map definition needs to be finished with an [end] call.\n  /// It is also possible to add nested vector or map by calling [startVector] / [startMap] after calling [addKey].\n  void startMap() {\n    _integrityCheckOnValueAddition();\n    _stackPointers.add(_StackPointer(_stack.length, false));\n  }\n\n  /// Marks that the addition of values to the last vector, or map have ended.\n  void end() {\n    final pointer = _stackPointers.removeLast();\n    if (pointer.isVector) {\n      _endVector(pointer);\n    } else {\n      _sortKeysAndEndMap(pointer);\n    }\n  }\n\n  /// Finish building the FlatBuffer and return array of bytes.\n  ///\n  /// Can be called multiple times, to get the array of bytes.\n  /// After the first call, adding values, or starting vectors / maps will result in an exception.\n  Uint8List finish() {\n    if (_finished == false) {\n      _finish();\n    }\n    return _buffer.buffer.asUint8List(0, _offset);\n  }\n\n  /// Builds a FlatBuffer with current state without finishing the builder.\n  ///\n  /// Creates an internal temporary copy of current builder and finishes the copy.\n  /// Use this method, when the state of a long lasting builder need to be persisted periodically.\n  ByteBuffer snapshot() {\n    final tmp = Builder(size: _offset + 200);\n    tmp._offset = _offset;\n    tmp._stack = List.from(_stack);\n    tmp._stackPointers = List.from(_stackPointers);\n    tmp._buffer.buffer.asUint8List().setAll(\n      0,\n      _buffer.buffer.asUint8List(0, _offset),\n    );\n    for (var i = 0; i < tmp._stackPointers.length; i++) {\n      tmp.end();\n    }\n    final buffer = tmp.finish();\n    final bd = ByteData(buffer.lengthInBytes);\n    bd.buffer.asUint8List().setAll(0, buffer);\n    return bd.buffer;\n  }\n\n  void _integrityCheckOnValueAddition() {\n    if (_finished) {\n      throw StateError('Adding values after finish is prohibited');\n    }\n    if (_stackPointers.isNotEmpty && _stackPointers.last.isVector == false) {\n      if (_stack.last.type != ValueType.Key) {\n        throw StateError(\n          'Adding value to a map before adding a key is prohibited',\n        );\n      }\n    }\n  }\n\n  void _integrityCheckOnKeyAddition() {\n    if (_finished) {\n      throw StateError('Adding values after finish is prohibited');\n    }\n    if (_stackPointers.isEmpty || _stackPointers.last.isVector) {\n      throw StateError('Adding key before staring a map is prohibited');\n    }\n  }\n\n  void _finish() {\n    if (_stack.length != 1) {\n      throw StateError(\n        'Stack has to be exactly 1, but is ${_stack.length}. You have to end all started vectors and maps, before calling [finish]',\n      );\n    }\n    final value = _stack[0];\n    final byteWidth = _align(value.elementWidth(_offset, 0));\n    _writeStackValue(value, byteWidth);\n    _writeUInt(value.storedPackedType(), 1);\n    _writeUInt(byteWidth, 1);\n    _finished = true;\n  }\n\n  _StackValue _createVector(\n    int start,\n    int vecLength,\n    int step, [\n    _StackValue? keys,\n  ]) {\n    var bitWidth = BitWidthUtil.uwidth(vecLength);\n    var prefixElements = 1;\n    if (keys != null) {\n      var elemWidth = keys.elementWidth(_offset, 0);\n      if (elemWidth.index > bitWidth.index) {\n        bitWidth = elemWidth;\n      }\n      prefixElements += 2;\n    }\n    var vectorType = ValueType.Key;\n    var typed = keys == null;\n    for (var i = start; i < _stack.length; i += step) {\n      final elemWidth = _stack[i].elementWidth(_offset, i + prefixElements);\n      if (elemWidth.index > bitWidth.index) {\n        bitWidth = elemWidth;\n      }\n      if (i == start) {\n        vectorType = _stack[i].type;\n        typed &= ValueTypeUtils.isTypedVectorElement(vectorType);\n      } else {\n        if (vectorType != _stack[i].type) {\n          typed = false;\n        }\n      }\n    }\n    final byteWidth = _align(bitWidth);\n    final fix =\n        typed & ValueTypeUtils.isNumber(vectorType) &&\n        vecLength >= 2 &&\n        vecLength <= 4;\n    if (keys != null) {\n      _writeStackValue(keys, byteWidth);\n      _writeUInt(1 << keys.width.index, byteWidth);\n    }\n    if (fix == false) {\n      _writeUInt(vecLength, byteWidth);\n    }\n    final vecOffset = _offset;\n    for (var i = start; i < _stack.length; i += step) {\n      _writeStackValue(_stack[i], byteWidth);\n    }\n    if (typed == false) {\n      for (var i = start; i < _stack.length; i += step) {\n        _writeUInt(_stack[i].storedPackedType(), 1);\n      }\n    }\n    if (keys != null) {\n      return _StackValue.withOffset(vecOffset, ValueType.Map, bitWidth);\n    }\n    if (typed) {\n      final vType = ValueTypeUtils.toTypedVector(\n        vectorType,\n        fix ? vecLength : 0,\n      );\n      return _StackValue.withOffset(vecOffset, vType, bitWidth);\n    }\n    return _StackValue.withOffset(vecOffset, ValueType.Vector, bitWidth);\n  }\n\n  void _endVector(_StackPointer pointer) {\n    final vecLength = _stack.length - pointer.stackPosition;\n    final vec = _createVector(pointer.stackPosition, vecLength, 1);\n    _stack.removeRange(pointer.stackPosition, _stack.length);\n    _stack.add(vec);\n  }\n\n  void _sortKeysAndEndMap(_StackPointer pointer) {\n    if (((_stack.length - pointer.stackPosition) & 1) == 1) {\n      throw StateError(\n        'The stack needs to hold key value pairs (even number of elements). Check if you combined [addKey] with add... method calls properly.',\n      );\n    }\n\n    var sorted = true;\n    for (var i = pointer.stackPosition; i < _stack.length - 2; i += 2) {\n      if (_shouldFlip(_stack[i], _stack[i + 2])) {\n        sorted = false;\n        break;\n      }\n    }\n\n    if (sorted == false) {\n      for (var i = pointer.stackPosition; i < _stack.length; i += 2) {\n        var flipIndex = i;\n        for (var j = i + 2; j < _stack.length; j += 2) {\n          if (_shouldFlip(_stack[flipIndex], _stack[j])) {\n            flipIndex = j;\n          }\n        }\n        if (flipIndex != i) {\n          var k = _stack[flipIndex];\n          var v = _stack[flipIndex + 1];\n          _stack[flipIndex] = _stack[i];\n          _stack[flipIndex + 1] = _stack[i + 1];\n          _stack[i] = k;\n          _stack[i + 1] = v;\n        }\n      }\n    }\n    _endMap(pointer);\n  }\n\n  void _endMap(_StackPointer pointer) {\n    final vecLength = (_stack.length - pointer.stackPosition) >> 1;\n    final offsets = <int>[];\n    for (var i = pointer.stackPosition; i < _stack.length; i += 2) {\n      offsets.add(_stack[i].offset!);\n    }\n    final keysHash = _KeysHash(offsets);\n    _StackValue? keysStackValue;\n    if (_keyVectorCache.containsKey(keysHash)) {\n      keysStackValue = _keyVectorCache[keysHash];\n    } else {\n      keysStackValue = _createVector(pointer.stackPosition, vecLength, 2);\n      _keyVectorCache[keysHash] = keysStackValue;\n    }\n    final vec = _createVector(\n      pointer.stackPosition + 1,\n      vecLength,\n      2,\n      keysStackValue,\n    );\n    _stack.removeRange(pointer.stackPosition, _stack.length);\n    _stack.add(vec);\n  }\n\n  bool _shouldFlip(_StackValue v1, _StackValue v2) {\n    if (v1.type != ValueType.Key || v2.type != ValueType.Key) {\n      throw StateError(\n        'Stack values are not keys $v1 | $v2. Check if you combined [addKey] with add... method calls properly.',\n      );\n    }\n\n    late int c1, c2;\n    var index = 0;\n    do {\n      c1 = _buffer.getUint8(v1.offset! + index);\n      c2 = _buffer.getUint8(v2.offset! + index);\n      if (c2 < c1) return true;\n      if (c1 < c2) return false;\n      index += 1;\n    } while (c1 != 0 && c2 != 0);\n    return false;\n  }\n\n  int _align(BitWidth width) {\n    final byteWidth = BitWidthUtil.toByteWidth(width);\n    _offset += BitWidthUtil.paddingSize(_offset, byteWidth);\n    return byteWidth;\n  }\n\n  void _writeStackValue(_StackValue value, int byteWidth) {\n    final newOffset = _newOffset(byteWidth);\n    if (value.isOffset) {\n      final relativeOffset = _offset - value.offset!;\n      if (byteWidth == 8 || relativeOffset < (1 << (byteWidth * 8))) {\n        _writeUInt(relativeOffset, byteWidth);\n      } else {\n        throw StateError(\n          'Unexpected size $byteWidth. This might be a bug. Please create an issue https://github.com/google/flatbuffers/issues/new',\n        );\n      }\n    } else {\n      _pushBuffer(value.asU8List(BitWidthUtil.fromByteWidth(byteWidth)));\n    }\n    _offset = newOffset;\n  }\n\n  void _writeUInt(int value, int byteWidth) {\n    final newOffset = _newOffset(byteWidth);\n    _pushUInt(value, BitWidthUtil.fromByteWidth(byteWidth));\n    _offset = newOffset;\n  }\n\n  int _newOffset(int newValueSize) {\n    final newOffset = _offset + newValueSize;\n    var size = _buffer.lengthInBytes;\n    final prevSize = size;\n    while (size < newOffset) {\n      size <<= 1;\n    }\n    if (prevSize < size) {\n      final newBuf = ByteData(size);\n      newBuf.buffer.asUint8List().setAll(0, _buffer.buffer.asUint8List());\n      _buffer = newBuf;\n    }\n    return newOffset;\n  }\n\n  void _pushInt(int value, BitWidth width) {\n    switch (width) {\n      case BitWidth.width8:\n        _buffer.setInt8(_offset, value);\n        break;\n      case BitWidth.width16:\n        _buffer.setInt16(_offset, value, Endian.little);\n        break;\n      case BitWidth.width32:\n        _buffer.setInt32(_offset, value, Endian.little);\n        break;\n      case BitWidth.width64:\n        _buffer.setInt64(_offset, value, Endian.little);\n        break;\n    }\n  }\n\n  void _pushUInt(int value, BitWidth width) {\n    switch (width) {\n      case BitWidth.width8:\n        _buffer.setUint8(_offset, value);\n        break;\n      case BitWidth.width16:\n        _buffer.setUint16(_offset, value, Endian.little);\n        break;\n      case BitWidth.width32:\n        _buffer.setUint32(_offset, value, Endian.little);\n        break;\n      case BitWidth.width64:\n        _buffer.setUint64(_offset, value, Endian.little);\n        break;\n    }\n  }\n\n  void _pushBuffer(List<int> value) {\n    _buffer.buffer.asUint8List().setAll(_offset, value);\n  }\n}\n\nclass _StackValue {\n  late Object _value;\n  int? _offset;\n  final ValueType _type;\n  final BitWidth _width;\n\n  _StackValue.withNull() : _type = ValueType.Null, _width = BitWidth.width8;\n\n  _StackValue.withInt(int value)\n    : _type = ValueType.Int,\n      _width = BitWidthUtil.width(value),\n      _value = value;\n\n  _StackValue.withBool(bool value)\n    : _type = ValueType.Bool,\n      _width = BitWidth.width8,\n      _value = value;\n\n  _StackValue.withDouble(double value)\n    : _type = ValueType.Float,\n      _width = BitWidthUtil.width(value),\n      _value = value;\n\n  _StackValue.withOffset(int value, ValueType type, BitWidth width)\n    : _offset = value,\n      _type = type,\n      _width = width;\n\n  BitWidth storedWidth({BitWidth width = BitWidth.width8}) {\n    return ValueTypeUtils.isInline(_type)\n        ? BitWidthUtil.max(_width, width)\n        : _width;\n  }\n\n  int storedPackedType({BitWidth width = BitWidth.width8}) {\n    return ValueTypeUtils.packedType(_type, storedWidth(width: width));\n  }\n\n  BitWidth elementWidth(int size, int index) {\n    if (ValueTypeUtils.isInline(_type)) return _width;\n    final offset = _offset!;\n    for (var i = 0; i < 4; i++) {\n      final width = 1 << i;\n      final bitWidth = BitWidthUtil.uwidth(\n        size + BitWidthUtil.paddingSize(size, width) + index * width - offset,\n      );\n      if (1 << bitWidth.index == width) {\n        return bitWidth;\n      }\n    }\n    throw StateError(\n      'Element is of unknown. Size: $size at index: $index. This might be a bug. Please create an issue https://github.com/google/flatbuffers/issues/new',\n    );\n  }\n\n  List<int> asU8List(BitWidth width) {\n    if (ValueTypeUtils.isNumber(_type)) {\n      if (_type == ValueType.Float) {\n        if (width == BitWidth.width32) {\n          final result = ByteData(4);\n          result.setFloat32(0, _value as double, Endian.little);\n          return result.buffer.asUint8List();\n        } else {\n          final result = ByteData(8);\n          result.setFloat64(0, _value as double, Endian.little);\n          return result.buffer.asUint8List();\n        }\n      } else {\n        switch (width) {\n          case BitWidth.width8:\n            final result = ByteData(1);\n            result.setInt8(0, _value as int);\n            return result.buffer.asUint8List();\n          case BitWidth.width16:\n            final result = ByteData(2);\n            result.setInt16(0, _value as int, Endian.little);\n            return result.buffer.asUint8List();\n          case BitWidth.width32:\n            final result = ByteData(4);\n            result.setInt32(0, _value as int, Endian.little);\n            return result.buffer.asUint8List();\n          case BitWidth.width64:\n            final result = ByteData(8);\n            result.setInt64(0, _value as int, Endian.little);\n            return result.buffer.asUint8List();\n        }\n      }\n    }\n    if (_type == ValueType.Null) {\n      final result = ByteData(1);\n      result.setInt8(0, 0);\n      return result.buffer.asUint8List();\n    }\n    if (_type == ValueType.Bool) {\n      final result = ByteData(1);\n      result.setInt8(0, _value as bool ? 1 : 0);\n      return result.buffer.asUint8List();\n    }\n\n    throw StateError(\n      'Unexpected type: $_type. This might be a bug. Please create an issue https://github.com/google/flatbuffers/issues/new',\n    );\n  }\n\n  ValueType get type {\n    return _type;\n  }\n\n  BitWidth get width {\n    return _width;\n  }\n\n  bool get isOffset {\n    return !ValueTypeUtils.isInline(_type);\n  }\n\n  int? get offset => _offset;\n\n  bool get isFloat32 {\n    return _type == ValueType.Float && _width == BitWidth.width32;\n  }\n}\n\nclass _StackPointer {\n  int stackPosition;\n  bool isVector;\n\n  _StackPointer(this.stackPosition, this.isVector);\n}\n\nclass _KeysHash {\n  final List<int> keys;\n\n  const _KeysHash(this.keys);\n\n  @override\n  bool operator ==(Object other) {\n    if (other is _KeysHash) {\n      if (keys.length != other.keys.length) return false;\n      for (var i = 0; i < keys.length; i++) {\n        if (keys[i] != other.keys[i]) return false;\n      }\n      return true;\n    }\n    return false;\n  }\n\n  @override\n  int get hashCode {\n    var result = 17;\n    for (var i = 0; i < keys.length; i++) {\n      result = result * 23 + keys[i];\n    }\n    return result;\n  }\n}\n"
  },
  {
    "path": "dart/lib/src/reference.dart",
    "content": "import 'dart:collection';\nimport 'dart:convert';\nimport 'dart:typed_data';\n\nimport 'types.dart';\n\n/// Main class to read a value out of a FlexBuffer.\n///\n/// This class let you access values stored in the buffer in a lazy fashion.\nclass Reference {\n  final ByteData _buffer;\n  final int _offset;\n  final BitWidth _parentWidth;\n  final String _path;\n  final int _byteWidth;\n  final ValueType _valueType;\n  int? _length;\n\n  Reference._(\n    this._buffer,\n    this._offset,\n    this._parentWidth,\n    int packedType,\n    this._path, [\n    int? byteWidth,\n    ValueType? valueType,\n  ]) : _byteWidth = byteWidth ?? 1 << (packedType & 3),\n       _valueType = valueType ?? ValueTypeUtils.fromInt(packedType >> 2);\n\n  /// Use this method to access the root value of a FlexBuffer.\n  static Reference fromBuffer(ByteBuffer buffer) {\n    final len = buffer.lengthInBytes;\n    if (len < 3) {\n      throw UnsupportedError('Buffer needs to be bigger than 3');\n    }\n    final byteData = ByteData.view(buffer);\n    final byteWidth = byteData.getUint8(len - 1);\n    final packedType = byteData.getUint8(len - 2);\n    final offset = len - byteWidth - 2;\n    return Reference._(\n      ByteData.view(buffer),\n      offset,\n      BitWidthUtil.fromByteWidth(byteWidth),\n      packedType,\n      \"/\",\n    );\n  }\n\n  /// Returns true if the underlying value is null.\n  bool get isNull => _valueType == ValueType.Null;\n\n  /// Returns true if the underlying value can be represented as [num].\n  bool get isNum =>\n      ValueTypeUtils.isNumber(_valueType) ||\n      ValueTypeUtils.isIndirectNumber(_valueType);\n\n  /// Returns true if the underlying value was encoded as a float (direct or indirect).\n  bool get isDouble =>\n      _valueType == ValueType.Float || _valueType == ValueType.IndirectFloat;\n\n  /// Returns true if the underlying value was encoded as an int or uint (direct or indirect).\n  bool get isInt => isNum && !isDouble;\n\n  /// Returns true if the underlying value was encoded as a string or a key.\n  bool get isString =>\n      _valueType == ValueType.String || _valueType == ValueType.Key;\n\n  /// Returns true if the underlying value was encoded as a bool.\n  bool get isBool => _valueType == ValueType.Bool;\n\n  /// Returns true if the underlying value was encoded as a blob.\n  bool get isBlob => _valueType == ValueType.Blob;\n\n  /// Returns true if the underlying value points to a vector.\n  bool get isVector => ValueTypeUtils.isAVector(_valueType);\n\n  /// Returns true if the underlying value points to a map.\n  bool get isMap => _valueType == ValueType.Map;\n\n  /// If this [isBool], returns the bool value. Otherwise, returns null.\n  bool? get boolValue {\n    if (_valueType == ValueType.Bool) {\n      return _readInt(_offset, _parentWidth) != 0;\n    }\n    return null;\n  }\n\n  /// Returns an [int], if the underlying value can be represented as an int.\n  ///\n  /// Otherwise returns [null].\n  int? get intValue {\n    if (_valueType == ValueType.Int) {\n      return _readInt(_offset, _parentWidth);\n    }\n    if (_valueType == ValueType.UInt) {\n      return _readUInt(_offset, _parentWidth);\n    }\n    if (_valueType == ValueType.IndirectInt) {\n      return _readInt(_indirect, BitWidthUtil.fromByteWidth(_byteWidth));\n    }\n    if (_valueType == ValueType.IndirectUInt) {\n      return _readUInt(_indirect, BitWidthUtil.fromByteWidth(_byteWidth));\n    }\n    return null;\n  }\n\n  /// Returns [double], if the underlying value [isDouble].\n  ///\n  /// Otherwise returns [null].\n  double? get doubleValue {\n    if (_valueType == ValueType.Float) {\n      return _readFloat(_offset, _parentWidth);\n    }\n    if (_valueType == ValueType.IndirectFloat) {\n      return _readFloat(_indirect, BitWidthUtil.fromByteWidth(_byteWidth));\n    }\n    return null;\n  }\n\n  /// Returns [num], if the underlying value is numeric, be it int uint, or float (direct or indirect).\n  ///\n  /// Otherwise returns [null].\n  num? get numValue => doubleValue ?? intValue;\n\n  /// Returns [String] value or null otherwise.\n  ///\n  /// This method performers a utf8 decoding, as FlexBuffers format stores strings in utf8 encoding.\n  String? get stringValue {\n    if (_valueType == ValueType.String || _valueType == ValueType.Key) {\n      return utf8.decode(_buffer.buffer.asUint8List(_indirect, length));\n    }\n    return null;\n  }\n\n  /// Returns [Uint8List] value or null otherwise.\n  Uint8List? get blobValue {\n    if (_valueType == ValueType.Blob) {\n      return _buffer.buffer.asUint8List(_indirect, length);\n    }\n    return null;\n  }\n\n  /// Can be used with an [int] or a [String] value for key.\n  /// If the underlying value in FlexBuffer is a vector, then use [int] for access.\n  /// If the underlying value in FlexBuffer is a map, then use [String] for access.\n  /// Returns [Reference] value. Throws an exception when [key] is not applicable.\n  Reference operator [](Object key) {\n    if (key is int && ValueTypeUtils.isAVector(_valueType)) {\n      final index = key;\n      if (index >= length || index < 0) {\n        throw ArgumentError(\n          'Key: [$key] is not applicable on: $_path of: $_valueType length: $length',\n        );\n      }\n      final elementOffset = _indirect + index * _byteWidth;\n      int packedType = 0;\n      int? byteWidth;\n      ValueType? valueType;\n      if (ValueTypeUtils.isTypedVector(_valueType)) {\n        byteWidth = 1;\n        valueType = ValueTypeUtils.typedVectorElementType(_valueType);\n      } else if (ValueTypeUtils.isFixedTypedVector(_valueType)) {\n        byteWidth = 1;\n        valueType = ValueTypeUtils.fixedTypedVectorElementType(_valueType);\n      } else {\n        packedType = _buffer.getUint8(_indirect + length * _byteWidth + index);\n      }\n      return Reference._(\n        _buffer,\n        elementOffset,\n        BitWidthUtil.fromByteWidth(_byteWidth),\n        packedType,\n        \"$_path[$index]\",\n        byteWidth,\n        valueType,\n      );\n    }\n    if (key is String && _valueType == ValueType.Map) {\n      final index = _keyIndex(key);\n      if (index != null) {\n        return _valueForIndexWithKey(index, key);\n      }\n    }\n    throw ArgumentError(\n      'Key: [$key] is not applicable on: $_path of: $_valueType',\n    );\n  }\n\n  /// Get an iterable if the underlying flexBuffer value is a vector.\n  /// Otherwise throws an exception.\n  Iterable<Reference> get vectorIterable {\n    if (isVector == false) {\n      throw UnsupportedError('Value is not a vector. It is: $_valueType');\n    }\n    return _VectorIterator(this);\n  }\n\n  /// Get an iterable for keys if the underlying flexBuffer value is a map.\n  /// Otherwise throws an exception.\n  Iterable<String> get mapKeyIterable {\n    if (isMap == false) {\n      throw UnsupportedError('Value is not a map. It is: $_valueType');\n    }\n    return _MapKeyIterator(this);\n  }\n\n  /// Get an iterable for values if the underlying flexBuffer value is a map.\n  /// Otherwise throws an exception.\n  Iterable<Reference> get mapValueIterable {\n    if (isMap == false) {\n      throw UnsupportedError('Value is not a map. It is: $_valueType');\n    }\n    return _MapValueIterator(this);\n  }\n\n  /// Returns the length of the underlying FlexBuffer value.\n  /// If the underlying value is [null] the length is 0.\n  /// If the underlying value is a number, or a bool, the length is 1.\n  /// If the underlying value is a vector, or map, the length reflects number of elements / element pairs.\n  /// If the values is a string or a blob, the length reflects a number of bytes the value occupies (strings are encoded in utf8 format).\n  int get length {\n    if (_length == null) {\n      // needs to be checked before more generic isAVector\n      if (ValueTypeUtils.isFixedTypedVector(_valueType)) {\n        _length = ValueTypeUtils.fixedTypedVectorElementSize(_valueType);\n      } else if (_valueType == ValueType.Blob ||\n          ValueTypeUtils.isAVector(_valueType) ||\n          _valueType == ValueType.Map) {\n        _length = _readUInt(\n          _indirect - _byteWidth,\n          BitWidthUtil.fromByteWidth(_byteWidth),\n        );\n      } else if (_valueType == ValueType.Null) {\n        _length = 0;\n      } else if (_valueType == ValueType.String) {\n        final indirect = _indirect;\n        var sizeByteWidth = _byteWidth;\n        var size = _readUInt(\n          indirect - sizeByteWidth,\n          BitWidthUtil.fromByteWidth(sizeByteWidth),\n        );\n        while (_buffer.getInt8(indirect + size) != 0) {\n          sizeByteWidth <<= 1;\n          size = _readUInt(\n            indirect - sizeByteWidth,\n            BitWidthUtil.fromByteWidth(sizeByteWidth),\n          );\n        }\n        _length = size;\n      } else if (_valueType == ValueType.Key) {\n        final indirect = _indirect;\n        var size = 1;\n        while (_buffer.getInt8(indirect + size) != 0) {\n          size += 1;\n        }\n        _length = size;\n      } else {\n        _length = 1;\n      }\n    }\n    return _length!;\n  }\n\n  /// Returns a minified JSON representation of the underlying FlexBuffer value.\n  ///\n  /// This method involves materializing the entire object tree, which may be\n  /// expensive. It is more efficient to work with [Reference] and access only the needed data.\n  /// Blob values are represented as base64 encoded string.\n  String get json {\n    if (_valueType == ValueType.Bool) {\n      return boolValue! ? 'true' : 'false';\n    }\n    if (_valueType == ValueType.Null) {\n      return 'null';\n    }\n    if (ValueTypeUtils.isNumber(_valueType)) {\n      return jsonEncode(numValue);\n    }\n    if (_valueType == ValueType.String) {\n      return jsonEncode(stringValue);\n    }\n    if (_valueType == ValueType.Blob) {\n      return jsonEncode(base64Encode(blobValue!));\n    }\n    if (ValueTypeUtils.isAVector(_valueType)) {\n      final result = StringBuffer();\n      result.write('[');\n      for (var i = 0; i < length; i++) {\n        result.write(this[i].json);\n        if (i < length - 1) {\n          result.write(',');\n        }\n      }\n      result.write(']');\n      return result.toString();\n    }\n    if (_valueType == ValueType.Map) {\n      final result = StringBuffer();\n      result.write('{');\n      for (var i = 0; i < length; i++) {\n        result.write(jsonEncode(_keyForIndex(i)));\n        result.write(':');\n        result.write(_valueForIndex(i).json);\n        if (i < length - 1) {\n          result.write(',');\n        }\n      }\n      result.write('}');\n      return result.toString();\n    }\n    throw UnsupportedError(\n      'Type: $_valueType is not supported for JSON conversion',\n    );\n  }\n\n  /// Computes the indirect offset of the value.\n  ///\n  /// To optimize for the more common case of being called only once, this\n  /// value is not cached. Callers that need to use it more than once should\n  /// cache the return value in a local variable.\n  int get _indirect {\n    final step = _readUInt(_offset, _parentWidth);\n    return _offset - step;\n  }\n\n  int _readInt(int offset, BitWidth width) {\n    _validateOffset(offset, width);\n    if (width == BitWidth.width8) {\n      return _buffer.getInt8(offset);\n    }\n    if (width == BitWidth.width16) {\n      return _buffer.getInt16(offset, Endian.little);\n    }\n    if (width == BitWidth.width32) {\n      return _buffer.getInt32(offset, Endian.little);\n    }\n    return _buffer.getInt64(offset, Endian.little);\n  }\n\n  int _readUInt(int offset, BitWidth width) {\n    _validateOffset(offset, width);\n    if (width == BitWidth.width8) {\n      return _buffer.getUint8(offset);\n    }\n    if (width == BitWidth.width16) {\n      return _buffer.getUint16(offset, Endian.little);\n    }\n    if (width == BitWidth.width32) {\n      return _buffer.getUint32(offset, Endian.little);\n    }\n    return _buffer.getUint64(offset, Endian.little);\n  }\n\n  double _readFloat(int offset, BitWidth width) {\n    _validateOffset(offset, width);\n    if (width.index < BitWidth.width32.index) {\n      throw StateError('Bad width: $width');\n    }\n\n    if (width == BitWidth.width32) {\n      return _buffer.getFloat32(offset, Endian.little);\n    }\n\n    return _buffer.getFloat64(offset, Endian.little);\n  }\n\n  void _validateOffset(int offset, BitWidth width) {\n    if (_offset < 0 ||\n        _buffer.lengthInBytes <= offset + width.index ||\n        offset & (BitWidthUtil.toByteWidth(width) - 1) != 0) {\n      throw StateError('Bad offset: $offset, width: $width');\n    }\n  }\n\n  int? _keyIndex(String key) {\n    final input = utf8.encode(key);\n    final keysVectorOffset = _indirect - _byteWidth * 3;\n    final indirectOffset =\n        keysVectorOffset -\n        _readUInt(keysVectorOffset, BitWidthUtil.fromByteWidth(_byteWidth));\n    final byteWidth = _readUInt(\n      keysVectorOffset + _byteWidth,\n      BitWidthUtil.fromByteWidth(_byteWidth),\n    );\n    var low = 0;\n    var high = length - 1;\n    while (low <= high) {\n      final mid = (high + low) >> 1;\n      final dif = _diffKeys(input, mid, indirectOffset, byteWidth);\n      if (dif == 0) return mid;\n      if (dif < 0) {\n        high = mid - 1;\n      } else {\n        low = mid + 1;\n      }\n    }\n    return null;\n  }\n\n  int _diffKeys(List<int> input, int index, int indirectOffset, int byteWidth) {\n    final keyOffset = indirectOffset + index * byteWidth;\n    final keyIndirectOffset =\n        keyOffset - _readUInt(keyOffset, BitWidthUtil.fromByteWidth(byteWidth));\n    for (var i = 0; i < input.length; i++) {\n      final dif = input[i] - _buffer.getUint8(keyIndirectOffset + i);\n      if (dif != 0) {\n        return dif;\n      }\n    }\n    return (_buffer.getUint8(keyIndirectOffset + input.length) == 0) ? 0 : -1;\n  }\n\n  Reference _valueForIndexWithKey(int index, String key) {\n    final indirect = _indirect;\n    final elementOffset = indirect + index * _byteWidth;\n    final packedType = _buffer.getUint8(indirect + length * _byteWidth + index);\n    return Reference._(\n      _buffer,\n      elementOffset,\n      BitWidthUtil.fromByteWidth(_byteWidth),\n      packedType,\n      \"$_path/$key\",\n    );\n  }\n\n  Reference _valueForIndex(int index) {\n    final indirect = _indirect;\n    final elementOffset = indirect + index * _byteWidth;\n    final packedType = _buffer.getUint8(indirect + length * _byteWidth + index);\n    return Reference._(\n      _buffer,\n      elementOffset,\n      BitWidthUtil.fromByteWidth(_byteWidth),\n      packedType,\n      \"$_path/[$index]\",\n    );\n  }\n\n  String _keyForIndex(int index) {\n    final keysVectorOffset = _indirect - _byteWidth * 3;\n    final indirectOffset =\n        keysVectorOffset -\n        _readUInt(keysVectorOffset, BitWidthUtil.fromByteWidth(_byteWidth));\n    final byteWidth = _readUInt(\n      keysVectorOffset + _byteWidth,\n      BitWidthUtil.fromByteWidth(_byteWidth),\n    );\n    final keyOffset = indirectOffset + index * byteWidth;\n    final keyIndirectOffset =\n        keyOffset - _readUInt(keyOffset, BitWidthUtil.fromByteWidth(byteWidth));\n    var length = 0;\n    while (_buffer.getUint8(keyIndirectOffset + length) != 0) {\n      length += 1;\n    }\n    return utf8.decode(_buffer.buffer.asUint8List(keyIndirectOffset, length));\n  }\n}\n\nclass _VectorIterator\n    with IterableMixin<Reference>\n    implements Iterator<Reference> {\n  final Reference _vector;\n  int index = -1;\n\n  _VectorIterator(this._vector);\n\n  @override\n  Reference get current => _vector[index];\n\n  @override\n  bool moveNext() {\n    index++;\n    return index < _vector.length;\n  }\n\n  @override\n  Iterator<Reference> get iterator => this;\n}\n\nclass _MapKeyIterator with IterableMixin<String> implements Iterator<String> {\n  final Reference _map;\n  int index = -1;\n\n  _MapKeyIterator(this._map);\n\n  @override\n  String get current => _map._keyForIndex(index);\n\n  @override\n  bool moveNext() {\n    index++;\n    return index < _map.length;\n  }\n\n  @override\n  Iterator<String> get iterator => this;\n}\n\nclass _MapValueIterator\n    with IterableMixin<Reference>\n    implements Iterator<Reference> {\n  final Reference _map;\n  int index = -1;\n\n  _MapValueIterator(this._map);\n\n  @override\n  Reference get current => _map._valueForIndex(index);\n\n  @override\n  bool moveNext() {\n    index++;\n    return index < _map.length;\n  }\n\n  @override\n  Iterator<Reference> get iterator => this;\n}\n"
  },
  {
    "path": "dart/lib/src/types.dart",
    "content": "import 'dart:typed_data';\n\n/// Represents the number of bits a value occupies.\nenum BitWidth { width8, width16, width32, width64 }\n\nclass BitWidthUtil {\n  static int toByteWidth(BitWidth self) {\n    return 1 << self.index;\n  }\n\n  static BitWidth width(num value) {\n    if (value is int) {\n      var v = value.toInt().abs();\n      if (v >> 7 == 0) return BitWidth.width8;\n      if (v >> 15 == 0) return BitWidth.width16;\n      if (v >> 31 == 0) return BitWidth.width32;\n      return BitWidth.width64;\n    }\n    return value == _toF32(value as double)\n        ? BitWidth.width32\n        : BitWidth.width64;\n  }\n\n  static BitWidth uwidth(num value) {\n    if (value.toInt() == value) {\n      var v = value.toInt().abs();\n      if (v >> 8 == 0) return BitWidth.width8;\n      if (v >> 16 == 0) return BitWidth.width16;\n      if (v >> 32 == 0) return BitWidth.width32;\n      return BitWidth.width64;\n    }\n    return value == _toF32(value as double)\n        ? BitWidth.width32\n        : BitWidth.width64;\n  }\n\n  static BitWidth fromByteWidth(int value) {\n    if (value == 1) {\n      return BitWidth.width8;\n    }\n    if (value == 2) {\n      return BitWidth.width16;\n    }\n    if (value == 4) {\n      return BitWidth.width32;\n    }\n    if (value == 8) {\n      return BitWidth.width64;\n    }\n    throw Exception('Unexpected value $value');\n  }\n\n  static int paddingSize(int bufSize, int scalarSize) {\n    return (~bufSize + 1) & (scalarSize - 1);\n  }\n\n  static double _toF32(double value) {\n    var bdata = ByteData(4);\n    bdata.setFloat32(0, value);\n    return bdata.getFloat32(0);\n  }\n\n  static BitWidth max(BitWidth self, BitWidth other) {\n    if (self.index < other.index) {\n      return other;\n    }\n    return self;\n  }\n}\n\n/// Represents all internal FlexBuffer types.\nenum ValueType {\n  Null,\n  Int,\n  UInt,\n  Float,\n  Key,\n  String,\n  IndirectInt,\n  IndirectUInt,\n  IndirectFloat,\n  Map,\n  Vector,\n  VectorInt,\n  VectorUInt,\n  VectorFloat,\n  VectorKey,\n  @Deprecated(\n    'VectorString is deprecated due to a flaw in the binary format (https://github.com/google/flatbuffers/issues/5627)',\n  )\n  VectorString,\n  VectorInt2,\n  VectorUInt2,\n  VectorFloat2,\n  VectorInt3,\n  VectorUInt3,\n  VectorFloat3,\n  VectorInt4,\n  VectorUInt4,\n  VectorFloat4,\n  Blob,\n  Bool,\n  VectorBool,\n}\n\nclass ValueTypeUtils {\n  static int toInt(ValueType self) {\n    if (self == ValueType.VectorBool) return 36;\n    return self.index;\n  }\n\n  static ValueType fromInt(int value) {\n    if (value == 36) return ValueType.VectorBool;\n    return ValueType.values[value];\n  }\n\n  static bool isInline(ValueType self) {\n    return self == ValueType.Bool || toInt(self) <= toInt(ValueType.Float);\n  }\n\n  static bool isNumber(ValueType self) {\n    return toInt(self) >= toInt(ValueType.Int) &&\n        toInt(self) <= toInt(ValueType.Float);\n  }\n\n  static bool isIndirectNumber(ValueType self) {\n    return toInt(self) >= toInt(ValueType.IndirectInt) &&\n        toInt(self) <= toInt(ValueType.IndirectFloat);\n  }\n\n  static bool isTypedVectorElement(ValueType self) {\n    return self == ValueType.Bool ||\n        (toInt(self) >= toInt(ValueType.Int) &&\n            toInt(self) <= toInt(ValueType.String));\n  }\n\n  static bool isTypedVector(ValueType self) {\n    return self == ValueType.VectorBool ||\n        (toInt(self) >= toInt(ValueType.VectorInt) &&\n            toInt(self) <= toInt(ValueType.VectorString));\n  }\n\n  static bool isFixedTypedVector(ValueType self) {\n    return (toInt(self) >= toInt(ValueType.VectorInt2) &&\n        toInt(self) <= toInt(ValueType.VectorFloat4));\n  }\n\n  static bool isAVector(ValueType self) {\n    return (isTypedVector(self) ||\n        isFixedTypedVector(self) ||\n        self == ValueType.Vector);\n  }\n\n  static ValueType toTypedVector(ValueType self, int length) {\n    if (length == 0) {\n      return ValueTypeUtils.fromInt(\n        toInt(self) - toInt(ValueType.Int) + toInt(ValueType.VectorInt),\n      );\n    }\n    if (length == 2) {\n      return ValueTypeUtils.fromInt(\n        toInt(self) - toInt(ValueType.Int) + toInt(ValueType.VectorInt2),\n      );\n    }\n    if (length == 3) {\n      return ValueTypeUtils.fromInt(\n        toInt(self) - toInt(ValueType.Int) + toInt(ValueType.VectorInt3),\n      );\n    }\n    if (length == 4) {\n      return ValueTypeUtils.fromInt(\n        toInt(self) - toInt(ValueType.Int) + toInt(ValueType.VectorInt4),\n      );\n    }\n    throw Exception('unexpected length ' + length.toString());\n  }\n\n  static ValueType typedVectorElementType(ValueType self) {\n    return ValueTypeUtils.fromInt(\n      toInt(self) - toInt(ValueType.VectorInt) + toInt(ValueType.Int),\n    );\n  }\n\n  static ValueType fixedTypedVectorElementType(ValueType self) {\n    return ValueTypeUtils.fromInt(\n      (toInt(self) - toInt(ValueType.VectorInt2)) % 3 + toInt(ValueType.Int),\n    );\n  }\n\n  static int fixedTypedVectorElementSize(ValueType self) {\n    return (toInt(self) - toInt(ValueType.VectorInt2)) ~/ 3 + 2;\n  }\n\n  static int packedType(ValueType self, BitWidth bitWidth) {\n    return bitWidth.index | (toInt(self) << 2);\n  }\n}\n"
  },
  {
    "path": "dart/publish.sh",
    "content": "#!/bin/sh\n#\n# Copyright 2018 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n# Note to pub consumers: this file is used to assist with publishing the\n# pub package from the flatbuffers repository and is not meant for general use.\n# As pub does not currently provide a way to exclude files, it is included here.\nset -e\n\ncommand -v dart >/dev/null 2>&1 || { echo >&2 \"Require `dart` but it's not installed.  Aborting.\"; exit 1; }\n\npushd ../tests\n./DartTest.sh\npopd\n\npushd ../samples\n./dart_sample.sh\npopd\n\ndart pub publish\n\nrm example/monster.fbs\nrm test/*.fbs\nrm -rf test/sub\n"
  },
  {
    "path": "dart/pubspec.yaml",
    "content": "name: flat_buffers\nversion: 25.12.19\ndescription: FlatBuffers reading and writing library for Dart. Based on original work by Konstantin Scheglov and Paul Berry of the Dart SDK team.\nhomepage: https://github.com/google/flatbuffers\ndocumentation: https://google.github.io/flatbuffers/index.html\n\nenvironment:\n  sdk: '>=2.17.0 <4.0.0'\n\ndev_dependencies:\n  test: ^1.17.7\n  test_reflective_loader: ^0.2.0\n  path: ^1.8.0\n  lints: ^1.0.1\n"
  },
  {
    "path": "dart/test/bool_structs.fbs",
    "content": "// Test for #7355\ntable Foo {\n  my_foo : foo_properties;\n}\n\nstruct foo_properties\n{\n    a : bool;\n    b : bool;\n}\n"
  },
  {
    "path": "dart/test/bool_structs_generated.dart",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable, constant_identifier_names\n\nimport 'dart:typed_data' show Uint8List;\n\nimport 'package:flat_buffers/flat_buffers.dart' as fb;\n\nclass Foo {\n  Foo._(this._bc, this._bcOffset);\n  factory Foo(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<Foo> reader = _FooReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  FooProperties? get myFoo =>\n      FooProperties.reader.vTableGetNullable(_bc, _bcOffset, 4);\n\n  @override\n  String toString() {\n    return 'Foo{myFoo: ${myFoo}}';\n  }\n\n  FooT unpack() => FooT(myFoo: myFoo?.unpack());\n\n  static int pack(fb.Builder fbBuilder, FooT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass FooT implements fb.Packable {\n  FooPropertiesT? myFoo;\n\n  FooT({this.myFoo});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    fbBuilder.startTable(1);\n    if (myFoo != null) {\n      fbBuilder.addStruct(0, myFoo!.pack(fbBuilder));\n    }\n    return fbBuilder.endTable();\n  }\n\n  @override\n  String toString() {\n    return 'FooT{myFoo: ${myFoo}}';\n  }\n}\n\nclass _FooReader extends fb.TableReader<Foo> {\n  const _FooReader();\n\n  @override\n  Foo createObject(fb.BufferContext bc, int offset) => Foo._(bc, offset);\n}\n\nclass FooBuilder {\n  FooBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  void begin() {\n    fbBuilder.startTable(1);\n  }\n\n  int addMyFoo(int offset) {\n    fbBuilder.addStruct(0, offset);\n    return fbBuilder.offset;\n  }\n\n  int finish() {\n    return fbBuilder.endTable();\n  }\n}\n\nclass FooObjectBuilder extends fb.ObjectBuilder {\n  final FooPropertiesObjectBuilder? _myFoo;\n\n  FooObjectBuilder({FooPropertiesObjectBuilder? myFoo}) : _myFoo = myFoo;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    fbBuilder.startTable(1);\n    if (_myFoo != null) {\n      fbBuilder.addStruct(0, _myFoo!.finish(fbBuilder));\n    }\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n\nclass FooProperties {\n  FooProperties._(this._bc, this._bcOffset);\n\n  static const fb.Reader<FooProperties> reader = _FooPropertiesReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  bool get a => const fb.BoolReader().read(_bc, _bcOffset + 0);\n  bool get b => const fb.BoolReader().read(_bc, _bcOffset + 1);\n\n  @override\n  String toString() {\n    return 'FooProperties{a: ${a}, b: ${b}}';\n  }\n\n  FooPropertiesT unpack() => FooPropertiesT(a: a, b: b);\n\n  static int pack(fb.Builder fbBuilder, FooPropertiesT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass FooPropertiesT implements fb.Packable {\n  bool a;\n  bool b;\n\n  FooPropertiesT({required this.a, required this.b});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    fbBuilder.putBool(b);\n    fbBuilder.putBool(a);\n    return fbBuilder.offset;\n  }\n\n  @override\n  String toString() {\n    return 'FooPropertiesT{a: ${a}, b: ${b}}';\n  }\n}\n\nclass _FooPropertiesReader extends fb.StructReader<FooProperties> {\n  const _FooPropertiesReader();\n\n  @override\n  int get size => 2;\n\n  @override\n  FooProperties createObject(fb.BufferContext bc, int offset) =>\n      FooProperties._(bc, offset);\n}\n\nclass FooPropertiesBuilder {\n  FooPropertiesBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  int finish(bool a, bool b) {\n    fbBuilder.putBool(b);\n    fbBuilder.putBool(a);\n    return fbBuilder.offset;\n  }\n}\n\nclass FooPropertiesObjectBuilder extends fb.ObjectBuilder {\n  final bool _a;\n  final bool _b;\n\n  FooPropertiesObjectBuilder({required bool a, required bool b})\n    : _a = a,\n      _b = b;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    fbBuilder.putBool(_b);\n    fbBuilder.putBool(_a);\n    return fbBuilder.offset;\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n"
  },
  {
    "path": "dart/test/enums.fbs",
    "content": "enum OptionsEnum : uint32\n{\n    A = 1,\n    B = 2,\n    C = 3\n}\n\ntable MyTable {\n    options : [OptionsEnum];\n}\n"
  },
  {
    "path": "dart/test/enums_generated.dart",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable, constant_identifier_names\n\nimport 'dart:typed_data' show Uint8List;\n\nimport 'package:flat_buffers/flat_buffers.dart' as fb;\n\nenum OptionsEnum {\n  A(1),\n  B(2),\n  C(3);\n\n  final int value;\n  const OptionsEnum(this.value);\n\n  factory OptionsEnum.fromValue(int value) {\n    switch (value) {\n      case 1:\n        return OptionsEnum.A;\n      case 2:\n        return OptionsEnum.B;\n      case 3:\n        return OptionsEnum.C;\n      default:\n        throw StateError('Invalid value $value for bit flag enum');\n    }\n  }\n\n  static OptionsEnum? _createOrNull(int? value) =>\n      value == null ? null : OptionsEnum.fromValue(value);\n\n  static const int minValue = 1;\n  static const int maxValue = 3;\n  static const fb.Reader<OptionsEnum> reader = _OptionsEnumReader();\n}\n\nclass _OptionsEnumReader extends fb.Reader<OptionsEnum> {\n  const _OptionsEnumReader();\n\n  @override\n  int get size => 4;\n\n  @override\n  OptionsEnum read(fb.BufferContext bc, int offset) =>\n      OptionsEnum.fromValue(const fb.Uint32Reader().read(bc, offset));\n}\n\nclass MyTable {\n  MyTable._(this._bc, this._bcOffset);\n  factory MyTable(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<MyTable> reader = _MyTableReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  List<OptionsEnum>? get options => const fb.ListReader<OptionsEnum>(\n    OptionsEnum.reader,\n  ).vTableGetNullable(_bc, _bcOffset, 4);\n\n  @override\n  String toString() {\n    return 'MyTable{options: ${options}}';\n  }\n\n  MyTableT unpack() => MyTableT(\n    options: const fb.ListReader<OptionsEnum>(\n      OptionsEnum.reader,\n      lazy: false,\n    ).vTableGetNullable(_bc, _bcOffset, 4),\n  );\n\n  static int pack(fb.Builder fbBuilder, MyTableT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass MyTableT implements fb.Packable {\n  List<OptionsEnum>? options;\n\n  MyTableT({this.options});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    final int? optionsOffset = options == null\n        ? null\n        : fbBuilder.writeListUint32(options!.map((f) => f.value).toList());\n    fbBuilder.startTable(1);\n    fbBuilder.addOffset(0, optionsOffset);\n    return fbBuilder.endTable();\n  }\n\n  @override\n  String toString() {\n    return 'MyTableT{options: ${options}}';\n  }\n}\n\nclass _MyTableReader extends fb.TableReader<MyTable> {\n  const _MyTableReader();\n\n  @override\n  MyTable createObject(fb.BufferContext bc, int offset) =>\n      MyTable._(bc, offset);\n}\n\nclass MyTableBuilder {\n  MyTableBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  void begin() {\n    fbBuilder.startTable(1);\n  }\n\n  int addOptionsOffset(int? offset) {\n    fbBuilder.addOffset(0, offset);\n    return fbBuilder.offset;\n  }\n\n  int finish() {\n    return fbBuilder.endTable();\n  }\n}\n\nclass MyTableObjectBuilder extends fb.ObjectBuilder {\n  final List<OptionsEnum>? _options;\n\n  MyTableObjectBuilder({List<OptionsEnum>? options}) : _options = options;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    final int? optionsOffset = _options == null\n        ? null\n        : fbBuilder.writeListUint32(_options!.map((f) => f.value).toList());\n    fbBuilder.startTable(1);\n    fbBuilder.addOffset(0, optionsOffset);\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n"
  },
  {
    "path": "dart/test/flat_buffers_test.dart",
    "content": "import 'dart:io' as io;\nimport 'dart:typed_data';\n\nimport 'package:flat_buffers/flat_buffers.dart';\nimport 'package:path/path.dart' as path;\nimport 'package:test/test.dart';\nimport 'package:test_reflective_loader/test_reflective_loader.dart';\n\nimport './bool_structs_generated.dart' as example4;\nimport './monster_test_my_game.example2_generated.dart' as example2;\nimport './monster_test_my_game.example_generated.dart' as example;\nimport 'enums_generated.dart' as example3;\n\nmain() {\n  defineReflectiveSuite(() {\n    defineReflectiveTests(BuilderTest);\n    defineReflectiveTests(ObjectAPITest);\n    defineReflectiveTests(CheckOtherLangaugesData);\n    defineReflectiveTests(GeneratorTest);\n    defineReflectiveTests(ListOfEnumsTest);\n  });\n}\n\nint indexToField(int index) {\n  return (1 + 1 + index) * 2;\n}\n\n@reflectiveTest\nclass CheckOtherLangaugesData {\n  test_cppData() async {\n    List<int> data = await io.File(\n      path.join(path.context.current, 'test', 'monsterdata_test.mon'),\n    ).readAsBytes();\n    example.Monster mon = example.Monster(data);\n    expect(mon.hp, 80);\n    expect(mon.mana, 150);\n    expect(mon.name, 'MyMonster');\n    expect(mon.pos!.x, 1.0);\n    expect(mon.pos!.y, 2.0);\n    expect(mon.pos!.z, 3.0);\n    expect(mon.pos!.test1, 3.0);\n    expect(mon.pos!.test2.value, 2.0);\n    expect(mon.pos!.test3.a, 5);\n    expect(mon.pos!.test3.b, 6);\n    expect(mon.testType!.value, example.AnyTypeId.Monster.value);\n    expect(mon.test is example.Monster, true);\n    final monster2 = mon.test as example.Monster;\n    expect(monster2.name, \"Fred\");\n\n    expect(mon.inventory!.length, 5);\n    expect(mon.inventory!.reduce((cur, next) => cur + next), 10);\n    final test4 = mon.test4!;\n    expect(test4.length, 2);\n    expect(test4[0].a + test4[0].b + test4[1].a + test4[1].b, 100);\n    expect(mon.testarrayofstring!.length, 2);\n    expect(mon.testarrayofstring![0], \"test1\");\n    expect(mon.testarrayofstring![1], \"test2\");\n\n    // this will fail if accessing any field fails.\n    expect(\n      mon.toString(),\n      'Monster{'\n      'pos: Vec3{x: 1.0, y: 2.0, z: 3.0, test1: 3.0, test2: Color.Green, test3: Test{a: 5, b: 6}}, '\n      'mana: 150, hp: 80, name: MyMonster, inventory: [0, 1, 2, 3, 4], '\n      'color: Color.Blue, testType: AnyTypeId.Monster, '\n      'test: Monster{pos: null, mana: 150, hp: 100, name: Fred, '\n      'inventory: null, color: Color.Blue, testType: null, '\n      'test: null, test4: null, testarrayofstring: null, '\n      'testarrayoftables: null, enemy: null, testnestedflatbuffer: null, '\n      'testempty: null, testbool: false, testhashs32Fnv1: 0, '\n      'testhashu32Fnv1: 0, testhashs64Fnv1: 0, testhashu64Fnv1: 0, '\n      'testhashs32Fnv1a: 0, testhashu32Fnv1a: 0, testhashs64Fnv1a: 0, '\n      'testhashu64Fnv1a: 0, testarrayofbools: null, testf: 3.14159, '\n      'testf2: 3.0, testf3: 0.0, testarrayofstring2: null, '\n      'testarrayofsortedstruct: null, flex: null, test5: null, '\n      'vectorOfLongs: null, vectorOfDoubles: null, parentNamespaceTest: null, '\n      'vectorOfReferrables: null, singleWeakReference: 0, '\n      'vectorOfWeakReferences: null, vectorOfStrongReferrables: null, '\n      'coOwningReference: 0, vectorOfCoOwningReferences: null, '\n      'nonOwningReference: 0, vectorOfNonOwningReferences: null, '\n      'anyUniqueType: null, anyUnique: null, anyAmbiguousType: null, '\n      'anyAmbiguous: null, vectorOfEnums: null, signedEnum: Race.None, '\n      'testrequirednestedflatbuffer: null, scalarKeySortedTables: null, '\n      'nativeInline: null, '\n      'longEnumNonEnumDefault: LongEnum._default, '\n      'longEnumNormalDefault: LongEnum.LongOne, nanDefault: NaN, '\n      'infDefault: Infinity, positiveInfDefault: Infinity, infinityDefault: '\n      'Infinity, positiveInfinityDefault: Infinity, negativeInfDefault: '\n      '-Infinity, negativeInfinityDefault: -Infinity, doubleInfDefault: Infinity}, '\n      'test4: [Test{a: 10, b: 20}, Test{a: 30, b: 40}], '\n      'testarrayofstring: [test1, test2], testarrayoftables: null, '\n      'enemy: Monster{pos: null, mana: 150, hp: 100, name: Fred, '\n      'inventory: null, color: Color.Blue, testType: null, '\n      'test: null, test4: null, testarrayofstring: null, '\n      'testarrayoftables: null, enemy: null, testnestedflatbuffer: null, '\n      'testempty: null, testbool: false, testhashs32Fnv1: 0, '\n      'testhashu32Fnv1: 0, testhashs64Fnv1: 0, testhashu64Fnv1: 0, '\n      'testhashs32Fnv1a: 0, testhashu32Fnv1a: 0, testhashs64Fnv1a: 0, '\n      'testhashu64Fnv1a: 0, testarrayofbools: null, testf: 3.14159, '\n      'testf2: 3.0, testf3: 0.0, testarrayofstring2: null, '\n      'testarrayofsortedstruct: null, flex: null, test5: null, '\n      'vectorOfLongs: null, vectorOfDoubles: null, parentNamespaceTest: null, '\n      'vectorOfReferrables: null, singleWeakReference: 0, '\n      'vectorOfWeakReferences: null, vectorOfStrongReferrables: null, '\n      'coOwningReference: 0, vectorOfCoOwningReferences: null, '\n      'nonOwningReference: 0, vectorOfNonOwningReferences: null, '\n      'anyUniqueType: null, anyUnique: null, anyAmbiguousType: null, '\n      'anyAmbiguous: null, vectorOfEnums: null, signedEnum: Race.None, '\n      'testrequirednestedflatbuffer: null, scalarKeySortedTables: null, '\n      'nativeInline: null, '\n      'longEnumNonEnumDefault: LongEnum._default, '\n      'longEnumNormalDefault: LongEnum.LongOne, nanDefault: NaN, '\n      'infDefault: Infinity, positiveInfDefault: Infinity, infinityDefault: '\n      'Infinity, positiveInfinityDefault: Infinity, negativeInfDefault: '\n      '-Infinity, negativeInfinityDefault: -Infinity, doubleInfDefault: Infinity}, '\n      'testnestedflatbuffer: null, testempty: null, testbool: true, '\n      'testhashs32Fnv1: -579221183, testhashu32Fnv1: 3715746113, '\n      'testhashs64Fnv1: 7930699090847568257, '\n      'testhashu64Fnv1: 7930699090847568257, '\n      'testhashs32Fnv1a: -1904106383, testhashu32Fnv1a: 2390860913, '\n      'testhashs64Fnv1a: 4898026182817603057, '\n      'testhashu64Fnv1a: 4898026182817603057, '\n      'testarrayofbools: [true, false, true], testf: 3.14159, testf2: 3.0, '\n      'testf3: 0.0, testarrayofstring2: null, testarrayofsortedstruct: ['\n      'Ability{id: 0, distance: 45}, Ability{id: 1, distance: 21}, '\n      'Ability{id: 5, distance: 12}], '\n      'flex: null, test5: [Test{a: 10, b: 20}, Test{a: 30, b: 40}], '\n      'vectorOfLongs: [1, 100, 10000, 1000000, 100000000], '\n      'vectorOfDoubles: [-1.7976931348623157e+308, 0.0, 1.7976931348623157e+308], '\n      'parentNamespaceTest: null, vectorOfReferrables: null, '\n      'singleWeakReference: 0, vectorOfWeakReferences: null, '\n      'vectorOfStrongReferrables: null, coOwningReference: 0, '\n      'vectorOfCoOwningReferences: null, nonOwningReference: 0, '\n      'vectorOfNonOwningReferences: null, '\n      'anyUniqueType: null, anyUnique: null, '\n      'anyAmbiguousType: null, '\n      'anyAmbiguous: null, vectorOfEnums: null, signedEnum: Race.None, '\n      'testrequirednestedflatbuffer: null, scalarKeySortedTables: [Stat{id: '\n      'miss, val: 0, count: 0}, Stat{id: hit, val: 10, count: 1}], '\n      'nativeInline: Test{a: 1, b: 2}, '\n      'longEnumNonEnumDefault: LongEnum._default, '\n      'longEnumNormalDefault: LongEnum.LongOne, nanDefault: NaN, '\n      'infDefault: Infinity, positiveInfDefault: Infinity, infinityDefault: '\n      'Infinity, positiveInfinityDefault: Infinity, negativeInfDefault: '\n      '-Infinity, negativeInfinityDefault: -Infinity, doubleInfDefault: Infinity}',\n    );\n  }\n}\n\n/// Test a custom, fixed-memory allocator (no actual allocations performed)\nclass CustomAllocator extends Allocator {\n  final _memory = ByteData(10 * 1024);\n  int _used = 0;\n\n  Uint8List buffer(int size) => _memory.buffer.asUint8List(_used - size, size);\n\n  @override\n  ByteData allocate(int size) {\n    if (size > _memory.lengthInBytes) {\n      throw UnsupportedError('Trying to allocate too much');\n    }\n    _used = size;\n    return ByteData.sublistView(_memory, 0, size);\n  }\n\n  @override\n  void deallocate(ByteData _) {}\n}\n\n@reflectiveTest\nclass BuilderTest {\n  void test_monsterBuilder([Builder? builder]) {\n    final fbBuilder = builder ?? Builder();\n    final str = fbBuilder.writeString('MyMonster');\n\n    fbBuilder.writeString('test1');\n    fbBuilder.writeString('test2', asciiOptimization: true);\n    final testArrayOfString = fbBuilder.endStructVector(2);\n\n    final fred = fbBuilder.writeString('Fred');\n\n    final List<int> treasure = [0, 1, 2, 3, 4];\n    final inventory = fbBuilder.writeListUint8(treasure);\n\n    final monBuilder = example.MonsterBuilder(fbBuilder)\n      ..begin()\n      ..addNameOffset(fred);\n    final mon2 = monBuilder.finish();\n\n    final testBuilder = example.TestBuilder(fbBuilder);\n    testBuilder.finish(10, 20);\n    testBuilder.finish(30, 40);\n    final test4 = fbBuilder.endStructVector(2);\n\n    monBuilder\n      ..begin()\n      ..addPos(\n        example.Vec3Builder(fbBuilder).finish(\n          1.0,\n          2.0,\n          3.0,\n          3.0,\n          example.Color.Green,\n          () => testBuilder.finish(5, 6),\n        ),\n      )\n      ..addHp(80)\n      ..addNameOffset(str)\n      ..addInventoryOffset(inventory)\n      ..addTestType(example.AnyTypeId.Monster)\n      ..addTestOffset(mon2)\n      ..addTest4Offset(test4)\n      ..addTestarrayofstringOffset(testArrayOfString);\n    final mon = monBuilder.finish();\n    fbBuilder.finish(mon);\n\n    final mon3 = example.Monster(fbBuilder.buffer);\n    expect(mon3.name, 'MyMonster');\n    expect(mon3.pos!.test1, 3.0);\n  }\n\n  void test_error_addInt32_withoutStartTable([Builder? builder]) {\n    builder ??= Builder();\n    expect(() {\n      builder!.addInt32(0, 0);\n    }, throwsA(isA<AssertionError>()));\n  }\n\n  void test_error_addOffset_withoutStartTable() {\n    Builder builder = Builder();\n    expect(() {\n      builder.addOffset(0, 0);\n    }, throwsA(isA<AssertionError>()));\n  }\n\n  void test_error_endTable_withoutStartTable() {\n    Builder builder = Builder();\n    expect(() {\n      builder.endTable();\n    }, throwsA(isA<AssertionError>()));\n  }\n\n  void test_error_startTable_duringTable() {\n    Builder builder = Builder();\n    builder.startTable(0);\n    expect(() {\n      builder.startTable(0);\n    }, throwsA(isA<AssertionError>()));\n  }\n\n  void test_error_writeString_duringTable() {\n    Builder builder = Builder();\n    builder.startTable(1);\n    expect(() {\n      builder.writeString('12345');\n    }, throwsA(isA<AssertionError>()));\n  }\n\n  void test_file_identifier() {\n    Uint8List byteList;\n    {\n      Builder builder = Builder(initialSize: 0);\n      builder.startTable(0);\n      int offset = builder.endTable();\n      builder.finish(offset, 'Az~ÿ');\n      byteList = builder.buffer;\n    }\n    // Convert byteList to a ByteData so that we can read data from it.\n    ByteData byteData = byteList.buffer.asByteData(byteList.offsetInBytes);\n    // First 4 bytes are an offset to the table data.\n    int tableDataLoc = byteData.getUint32(0, Endian.little);\n    // Next 4 bytes are the file identifier.\n    expect(byteData.getUint8(4), 65); // 'a'\n    expect(byteData.getUint8(5), 122); // 'z'\n    expect(byteData.getUint8(6), 126); // '~'\n    expect(byteData.getUint8(7), 255); // 'ÿ'\n    // First 4 bytes of the table data are a backwards offset to the vtable.\n    int vTableLoc =\n        tableDataLoc - byteData.getInt32(tableDataLoc, Endian.little);\n    // First 2 bytes of the vtable are the size of the vtable in bytes, which\n    // should be 4.\n    expect(byteData.getUint16(vTableLoc, Endian.little), 4);\n    // Next 2 bytes are the size of the object in bytes (including the vtable\n    // pointer), which should be 4.\n    expect(byteData.getUint16(vTableLoc + 2, Endian.little), 4);\n  }\n\n  void test_low() {\n    final allocator = CustomAllocator();\n    final builder = Builder(initialSize: 0, allocator: allocator);\n\n    builder.putUint8(1);\n    expect(allocator.buffer(builder.size()), [1]);\n\n    builder.putUint32(2);\n    expect(allocator.buffer(builder.size()), [2, 0, 0, 0, 0, 0, 0, 1]);\n\n    builder.putUint8(3);\n    expect(allocator.buffer(builder.size()), [\n      0,\n      0,\n      0,\n      3,\n      2,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      1,\n    ]);\n\n    builder.putUint8(4);\n    expect(allocator.buffer(builder.size()), [\n      0,\n      0,\n      4,\n      3,\n      2,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      1,\n    ]);\n\n    builder.putUint8(5);\n    expect(allocator.buffer(builder.size()), [\n      0,\n      5,\n      4,\n      3,\n      2,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      1,\n    ]);\n\n    builder.putUint32(6);\n    expect(allocator.buffer(builder.size()), [\n      6,\n      0,\n      0,\n      0,\n      0,\n      5,\n      4,\n      3,\n      2,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      1,\n    ]);\n  }\n\n  void test_table_default() {\n    List<int> byteList;\n    {\n      final builder = Builder(initialSize: 0, allocator: CustomAllocator());\n      builder.startTable(2);\n      builder.addInt32(0, 10, 10);\n      builder.addInt32(1, 20, 10);\n      int offset = builder.endTable();\n      builder.finish(offset);\n      byteList = builder.buffer;\n      expect(builder.size(), byteList.length);\n    }\n    // read and verify\n    BufferContext buffer = BufferContext.fromBytes(byteList);\n    int objectOffset = buffer.derefObject(0);\n    // was not written, so uses the new default value\n    expect(\n      const Int32Reader().vTableGet(buffer, objectOffset, indexToField(0), 15),\n      15,\n    );\n    // has the written value\n    expect(\n      const Int32Reader().vTableGet(buffer, objectOffset, indexToField(1), 15),\n      20,\n    );\n  }\n\n  void test_table_format([Builder? builder]) {\n    Uint8List byteList;\n    {\n      builder ??= Builder(initialSize: 0);\n      builder.startTable(3);\n      builder.addInt32(0, 10);\n      builder.addInt32(1, 20);\n      builder.addInt32(2, 30);\n      builder.finish(builder.endTable());\n      byteList = builder.buffer;\n    }\n    // Convert byteList to a ByteData so that we can read data from it.\n    ByteData byteData = byteList.buffer.asByteData(byteList.offsetInBytes);\n    // First 4 bytes are an offset to the table data.\n    int tableDataLoc = byteData.getUint32(0, Endian.little);\n    // First 4 bytes of the table data are a backwards offset to the vtable.\n    int vTableLoc =\n        tableDataLoc - byteData.getInt32(tableDataLoc, Endian.little);\n    // First 2 bytes of the vtable are the size of the vtable in bytes, which\n    // should be 10.\n    expect(byteData.getUint16(vTableLoc, Endian.little), 10);\n    // Next 2 bytes are the size of the object in bytes (including the vtable\n    // pointer), which should be 16.\n    expect(byteData.getUint16(vTableLoc + 2, Endian.little), 16);\n    // Remaining 6 bytes are the offsets within the object where the ints are\n    // located.\n    for (int i = 0; i < 3; i++) {\n      int offset = byteData.getUint16(vTableLoc + 4 + 2 * i, Endian.little);\n      expect(\n        byteData.getInt32(tableDataLoc + offset, Endian.little),\n        10 + 10 * i,\n      );\n    }\n  }\n\n  void test_table_string() {\n    String latinString = 'test';\n    String unicodeString = 'Проба пера';\n    List<int> byteList;\n    {\n      Builder builder = Builder(initialSize: 0);\n      int? latinStringOffset = builder.writeString(\n        latinString,\n        asciiOptimization: true,\n      );\n      int? unicodeStringOffset = builder.writeString(\n        unicodeString,\n        asciiOptimization: true,\n      );\n      builder.startTable(2);\n      builder.addOffset(0, latinStringOffset);\n      builder.addOffset(1, unicodeStringOffset);\n      int offset = builder.endTable();\n      builder.finish(offset);\n      byteList = builder.buffer;\n    }\n    // read and verify\n    BufferContext buf = BufferContext.fromBytes(byteList);\n    int objectOffset = buf.derefObject(0);\n    expect(\n      const StringReader().vTableGetNullable(\n        buf,\n        objectOffset,\n        indexToField(0),\n      ),\n      latinString,\n    );\n    expect(\n      const StringReader(\n        asciiOptimization: true,\n      ).vTableGetNullable(buf, objectOffset, indexToField(1)),\n      unicodeString,\n    );\n  }\n\n  void test_table_types([Builder? builder]) {\n    List<int> byteList;\n    {\n      builder ??= Builder(initialSize: 0);\n      int? stringOffset = builder.writeString('12345');\n      builder.startTable(7);\n      builder.addBool(0, true);\n      builder.addInt8(1, 10);\n      builder.addInt32(2, 20);\n      builder.addOffset(3, stringOffset);\n      builder.addInt32(4, 40);\n      builder.addUint32(5, 0x9ABCDEF0);\n      builder.addUint8(6, 0x9A);\n      int offset = builder.endTable();\n      builder.finish(offset);\n      byteList = builder.buffer;\n    }\n    // read and verify\n    BufferContext buf = BufferContext.fromBytes(byteList);\n    int objectOffset = buf.derefObject(0);\n    expect(\n      const BoolReader().vTableGetNullable(buf, objectOffset, indexToField(0)),\n      true,\n    );\n    expect(\n      const Int8Reader().vTableGetNullable(buf, objectOffset, indexToField(1)),\n      10,\n    );\n    expect(\n      const Int32Reader().vTableGetNullable(buf, objectOffset, indexToField(2)),\n      20,\n    );\n    expect(\n      const StringReader().vTableGetNullable(\n        buf,\n        objectOffset,\n        indexToField(3),\n      ),\n      '12345',\n    );\n    expect(\n      const Int32Reader().vTableGetNullable(buf, objectOffset, indexToField(4)),\n      40,\n    );\n    expect(\n      const Uint32Reader().vTableGetNullable(\n        buf,\n        objectOffset,\n        indexToField(5),\n      ),\n      0x9ABCDEF0,\n    );\n    expect(\n      const Uint8Reader().vTableGetNullable(buf, objectOffset, indexToField(6)),\n      0x9A,\n    );\n  }\n\n  void test_writeList_of_Uint32() {\n    List<int> values = <int>[10, 100, 12345, 0x9abcdef0];\n    // write\n    List<int> byteList;\n    {\n      Builder builder = Builder(initialSize: 0);\n      int offset = builder.writeListUint32(values);\n      builder.finish(offset);\n      byteList = builder.buffer;\n    }\n    // read and verify\n    BufferContext buf = BufferContext.fromBytes(byteList);\n    List<int> items = const Uint32ListReader().read(buf, 0);\n    expect(items, hasLength(4));\n    expect(items, orderedEquals(values));\n  }\n\n  void test_writeList_ofBool() {\n    void verifyListBooleans(int len, List<int> trueBits) {\n      // write\n      List<int> byteList;\n      {\n        Builder builder = Builder(initialSize: 0);\n        List<bool> values = List<bool>.filled(len, false);\n        for (int bit in trueBits) {\n          values[bit] = true;\n        }\n        int offset = builder.writeListBool(values);\n        builder.finish(offset);\n        byteList = builder.buffer;\n      }\n      // read and verify\n      BufferContext buf = BufferContext.fromBytes(byteList);\n      List<bool> items = const BoolListReader().read(buf, 0);\n      expect(items, hasLength(len));\n      for (int i = 0; i < items.length; i++) {\n        expect(items[i], trueBits.contains(i), reason: 'bit $i of $len');\n      }\n    }\n\n    verifyListBooleans(0, <int>[]);\n    verifyListBooleans(1, <int>[]);\n    verifyListBooleans(1, <int>[0]);\n    verifyListBooleans(31, <int>[0, 1]);\n    verifyListBooleans(31, <int>[1, 2, 24, 25, 30]);\n    verifyListBooleans(31, <int>[0, 30]);\n    verifyListBooleans(32, <int>[1, 2, 24, 25, 31]);\n    verifyListBooleans(33, <int>[1, 2, 24, 25, 32]);\n    verifyListBooleans(33, <int>[1, 2, 24, 25, 31, 32]);\n    verifyListBooleans(63, <int>[]);\n    verifyListBooleans(63, <int>[0, 1, 2, 61, 62]);\n    verifyListBooleans(63, List<int>.generate(63, (i) => i));\n    verifyListBooleans(64, <int>[]);\n    verifyListBooleans(64, <int>[0, 1, 2, 61, 62, 63]);\n    verifyListBooleans(64, <int>[1, 2, 62]);\n    verifyListBooleans(64, <int>[0, 1, 2, 63]);\n    verifyListBooleans(64, List<int>.generate(64, (i) => i));\n    verifyListBooleans(100, <int>[0, 3, 30, 60, 90, 99]);\n  }\n\n  void test_writeList_ofInt32() {\n    List<int> byteList;\n    {\n      Builder builder = Builder(initialSize: 0);\n      int offset = builder.writeListInt32(<int>[1, 2, 3, 4, 5]);\n      builder.finish(offset);\n      byteList = builder.buffer;\n    }\n    // read and verify\n    BufferContext buf = BufferContext.fromBytes(byteList);\n    List<int> items = const ListReader<int>(Int32Reader()).read(buf, 0);\n    expect(items, hasLength(5));\n    expect(items, orderedEquals(<int>[1, 2, 3, 4, 5]));\n  }\n\n  void test_writeList_ofFloat64() {\n    List<double> values = <double>[-1.234567, 3.4E+9, -5.6E-13, 7.8, 12.13];\n    // write\n    List<int> byteList;\n    {\n      Builder builder = Builder(initialSize: 0);\n      int offset = builder.writeListFloat64(values);\n      builder.finish(offset);\n      byteList = builder.buffer;\n    }\n\n    // read and verify\n    BufferContext buf = BufferContext.fromBytes(byteList);\n    List<double> items = const Float64ListReader().read(buf, 0);\n\n    expect(items, hasLength(values.length));\n    for (int i = 0; i < values.length; i++) {\n      expect(values[i], closeTo(items[i], .001));\n    }\n  }\n\n  void test_writeList_ofFloat32() {\n    List<double> values = [1.0, 2.23, -3.213, 7.8, 12.13];\n    // write\n    List<int> byteList;\n    {\n      Builder builder = Builder(initialSize: 0);\n      int offset = builder.writeListFloat32(values);\n      builder.finish(offset);\n      byteList = builder.buffer;\n    }\n    // read and verify\n    BufferContext buf = BufferContext.fromBytes(byteList);\n    List<double> items = const Float32ListReader().read(buf, 0);\n    expect(items, hasLength(5));\n    for (int i = 0; i < values.length; i++) {\n      expect(values[i], closeTo(items[i], .001));\n    }\n  }\n\n  void test_writeList_ofObjects([Builder? builder]) {\n    List<int> byteList;\n    {\n      builder ??= Builder(initialSize: 0);\n      // write the object #1\n      int object1;\n      {\n        builder.startTable(2);\n        builder.addInt32(0, 10);\n        builder.addInt32(1, 20);\n        object1 = builder.endTable();\n      }\n      // write the object #1\n      int object2;\n      {\n        builder.startTable(2);\n        builder.addInt32(0, 100);\n        builder.addInt32(1, 200);\n        object2 = builder.endTable();\n      }\n      // write the list\n      int offset = builder.writeList([object1, object2]);\n      builder.finish(offset);\n      byteList = builder.buffer;\n    }\n    // read and verify\n    BufferContext buf = BufferContext.fromBytes(byteList);\n    List<TestPointImpl> items = const ListReader<TestPointImpl>(\n      TestPointReader(),\n    ).read(buf, 0);\n    expect(items, hasLength(2));\n    expect(items[0].x, 10);\n    expect(items[0].y, 20);\n    expect(items[1].x, 100);\n    expect(items[1].y, 200);\n  }\n\n  void test_writeList_ofStrings_asRoot() {\n    List<int> byteList;\n    {\n      Builder builder = Builder(initialSize: 0);\n      int? str1 = builder.writeString('12345');\n      int? str2 = builder.writeString('ABC');\n      int offset = builder.writeList([str1, str2]);\n      builder.finish(offset);\n      byteList = builder.buffer;\n    }\n    // read and verify\n    BufferContext buf = BufferContext.fromBytes(byteList);\n    List<String> items = const ListReader<String>(StringReader()).read(buf, 0);\n    expect(items, hasLength(2));\n    expect(items, contains('12345'));\n    expect(items, contains('ABC'));\n  }\n\n  void test_writeList_ofStrings_inObject([Builder? builder]) {\n    List<int> byteList;\n    {\n      builder ??= Builder(initialSize: 0);\n      int listOffset = builder.writeList([\n        builder.writeString('12345'),\n        builder.writeString('ABC'),\n      ]);\n      builder.startTable(1);\n      builder.addOffset(0, listOffset);\n      int offset = builder.endTable();\n      builder.finish(offset);\n      byteList = builder.buffer;\n    }\n    // read and verify\n    BufferContext buf = BufferContext.fromBytes(byteList);\n    StringListWrapperImpl reader = StringListWrapperReader().read(buf, 0);\n    List<String>? items = reader.items;\n    expect(items, hasLength(2));\n    expect(items, contains('12345'));\n    expect(items, contains('ABC'));\n  }\n\n  void test_writeList_ofUint32() {\n    List<int> byteList;\n    {\n      Builder builder = Builder(initialSize: 0);\n      int offset = builder.writeListUint32(<int>[1, 2, 0x9ABCDEF0]);\n      builder.finish(offset);\n      byteList = builder.buffer;\n    }\n    // read and verify\n    BufferContext buf = BufferContext.fromBytes(byteList);\n    List<int> items = const Uint32ListReader().read(buf, 0);\n    expect(items, hasLength(3));\n    expect(items, orderedEquals(<int>[1, 2, 0x9ABCDEF0]));\n  }\n\n  void test_writeList_ofUint16() {\n    List<int> byteList;\n    {\n      Builder builder = Builder(initialSize: 0);\n      int offset = builder.writeListUint16(<int>[1, 2, 60000]);\n      builder.finish(offset);\n      byteList = builder.buffer;\n    }\n    // read and verify\n    BufferContext buf = BufferContext.fromBytes(byteList);\n    List<int> items = const Uint16ListReader().read(buf, 0);\n    expect(items, hasLength(3));\n    expect(items, orderedEquals(<int>[1, 2, 60000]));\n  }\n\n  void test_writeList_ofUint8() {\n    List<int> byteList;\n    {\n      Builder builder = Builder(initialSize: 0);\n      int offset = builder.writeListUint8(<int>[1, 2, 3, 4, 0x9A, 0xFA]);\n      builder.finish(offset);\n      byteList = builder.buffer;\n    }\n    // read and verify\n    BufferContext buf = BufferContext.fromBytes(byteList);\n    const buffOffset = 8; // 32-bit offset to the list, + 32-bit length\n    for (final lazy in [true, false]) {\n      List<int> items = Uint8ListReader(lazy: lazy).read(buf, 0);\n      expect(items, hasLength(6));\n      expect(items, orderedEquals(<int>[1, 2, 3, 4, 0x9A, 0xFA]));\n\n      // overwrite the buffer to verify the laziness\n      buf.buffer.setUint8(buffOffset + 1, 99);\n      expect(items, orderedEquals(<int>[1, lazy ? 99 : 2, 3, 4, 0x9A, 0xFA]));\n\n      // restore the previous value for the next loop\n      buf.buffer.setUint8(buffOffset + 1, 2);\n    }\n  }\n\n  void test_reset() {\n    // We'll run a selection of tests , reusing the builder between them.\n    final testCases = <void Function(Builder?)>[\n      test_monsterBuilder,\n      test_error_addInt32_withoutStartTable,\n      test_table_format,\n      test_table_types,\n      test_writeList_ofObjects,\n      test_writeList_ofStrings_inObject,\n    ];\n\n    // Execute all test cases in all permutations of their order.\n    // To do that, we generate permutations of test case indexes.\n    final testCasesPermutations = _permutationsOf(\n      List.generate(testCases.length, (index) => index),\n    );\n    expect(testCasesPermutations.length, _factorial(testCases.length));\n\n    for (var indexes in testCasesPermutations) {\n      // print the order so failures are reproducible\n      printOnFailure('Running reset() test cases in order: $indexes');\n\n      Builder? builder;\n      for (var index in indexes) {\n        if (builder == null) {\n          // Initial size small enough so at least one test case increases it.\n          // On the other hand, it's large enough so that some test cases don't.\n          builder = Builder(initialSize: 32);\n        } else {\n          builder.reset();\n        }\n        testCases[index](builder);\n      }\n    }\n  }\n\n  // Generate permutations of the given list\n  List<List<T>> _permutationsOf<T>(List<T> source) {\n    final result = <List<T>>[];\n\n    void permutate(List<T> items, int startAt) {\n      for (var i = startAt; i < items.length; i++) {\n        List<T> permutation = items.toList(growable: false);\n        permutation[i] = items[startAt];\n        permutation[startAt] = items[i];\n\n        // add the current list upon reaching the end\n        if (startAt == items.length - 1) {\n          result.add(items);\n        } else {\n          permutate(permutation, startAt + 1);\n        }\n      }\n    }\n\n    permutate(source, 0);\n    return result;\n  }\n\n  // a very simple implementation of n!\n  int _factorial(int n) {\n    var result = 1;\n    for (var i = 2; i <= n; i++) {\n      result *= i;\n    }\n    return result;\n  }\n}\n\n@reflectiveTest\nclass ObjectAPITest {\n  void test_tableStat() {\n    final object1 = example.StatT(count: 3, id: \"foo\", val: 4);\n    final fbb = Builder();\n    fbb.finish(object1.pack(fbb));\n    final object2 = example.Stat(fbb.buffer).unpack();\n    expect(object2.count, object1.count);\n    expect(object2.id, object1.id);\n    expect(object2.val, object1.val);\n    expect(object2.toString(), object1.toString());\n  }\n\n  void test_tableMonster() {\n    final monster = example.MonsterT()\n      ..pos = example.Vec3T(\n        x: 1,\n        y: 2,\n        z: 3,\n        test1: 4.0,\n        test2: example.Color.Red,\n        test3: example.TestT(a: 1, b: 2),\n      )\n      ..mana = 2\n      ..name = 'Monstrous'\n      ..inventory = [24, 42]\n      ..color = example.Color.Green\n      ..testType = example.AnyTypeId.MyGame_Example2_Monster\n      ..test = example2.MonsterT()\n      ..test4 = [example.TestT(a: 3, b: 4), example.TestT(a: 5, b: 6)]\n      ..testarrayofstring = [\"foo\", \"bar\"]\n      ..testarrayoftables = [example.MonsterT(name: 'Oof', testf: 2.75)]\n      ..enemy = example.MonsterT(name: 'Enemy', testf: 2.5)\n      ..testarrayofbools = [false, true, false]\n      ..testf = 42.25\n      ..testarrayofsortedstruct = [\n        example.AbilityT(id: 1, distance: 5),\n        example.AbilityT(id: 3, distance: 7),\n      ]\n      ..vectorOfLongs = [5, 6, 7]\n      ..vectorOfDoubles = [8.9, 9.0, 10.1, 11.2]\n      ..anyAmbiguousType = example.AnyAmbiguousAliasesTypeId.M2\n      ..anyAmbiguous = null\n      ..vectorOfEnums = [example.Color.Blue, example.Color.Green]\n      ..signedEnum = example.Race.None;\n\n    final fbBuilder = Builder();\n    final offset = monster.pack(fbBuilder);\n    expect(offset, isNonZero);\n    fbBuilder.finish(offset);\n    final data = fbBuilder.buffer;\n\n    final monster2 = example.Monster(data); // Monster (reader)\n    expect(\n        // map Monster => MonsterT, Vec3 => Vec3T, ...\n        monster2.toString().replaceAllMapped(\n            RegExp('([a-zA-z0-9]+){'), (match) => match.group(1)! + 'T{'),\n        monster.toString());\n\n    final monster3 = monster2.unpack(); // MonsterT\n    expect(monster3.toString(), monster.toString());\n  }\n\n  void test_Lists() {\n    // Ensure unpack() reads lists eagerly by reusing the same builder and\n    // overwriting data. Why: because standard reader reads lists lazily...\n    final fbb = Builder();\n\n    final object1 = example.TypeAliasesT(v8: [1, 2, 3], vf64: [5, 6]);\n    fbb.finish(object1.pack(fbb));\n    final object1Read = example.TypeAliases(fbb.buffer).unpack();\n\n    // overwrite the original buffer by writing to the same builder\n    fbb.reset();\n    final object2 = example.TypeAliasesT(v8: [7, 8, 9], vf64: [10, 11]);\n    fbb.finish(object2.pack(fbb));\n    final object2Read = example.TypeAliases(fbb.buffer).unpack();\n\n    // this is fine even with lazy lists:\n    expect(object2.toString(), object2Read.toString());\n\n    // this fails with lazy lists:\n    expect(object1.toString(), object1Read.toString());\n\n    // empty list must be serialized as such (were stored NULL before v2.0)\n    fbb.reset();\n    final object3 = example.TypeAliasesT(v8: [], vf64: null);\n    fbb.finish(object3.pack(fbb));\n    final object3Read = example.TypeAliases(fbb.buffer).unpack();\n    expect(object3.toString(), object3Read.toString());\n  }\n}\n\nclass StringListWrapperImpl {\n  final BufferContext bp;\n  final int offset;\n\n  StringListWrapperImpl(this.bp, this.offset);\n\n  List<String>? get items => const ListReader<String>(\n    StringReader(),\n  ).vTableGetNullable(bp, offset, indexToField(0));\n}\n\nclass StringListWrapperReader extends TableReader<StringListWrapperImpl> {\n  const StringListWrapperReader();\n\n  @override\n  StringListWrapperImpl createObject(BufferContext object, int offset) {\n    return StringListWrapperImpl(object, offset);\n  }\n}\n\nclass TestPointImpl {\n  final BufferContext bp;\n  final int offset;\n\n  TestPointImpl(this.bp, this.offset);\n\n  int get x => const Int32Reader().vTableGet(bp, offset, indexToField(0), 0);\n\n  int get y => const Int32Reader().vTableGet(bp, offset, indexToField(1), 0);\n}\n\nclass TestPointReader extends TableReader<TestPointImpl> {\n  const TestPointReader();\n\n  @override\n  TestPointImpl createObject(BufferContext object, int offset) {\n    return TestPointImpl(object, offset);\n  }\n}\n\n@reflectiveTest\nclass GeneratorTest {\n  void test_constantEnumValues() async {\n    expect(example.Color.values, same(example.Color.values));\n    expect(example.Race.values, same(example.Race.values));\n    expect(example.AnyTypeId.values, same(example.AnyTypeId.values));\n    expect(\n      example.AnyUniqueAliasesTypeId.values,\n      same(example.AnyUniqueAliasesTypeId.values),\n    );\n    expect(\n      example.AnyAmbiguousAliasesTypeId.values,\n      same(example.AnyAmbiguousAliasesTypeId.values),\n    );\n  }\n}\n\n// See #6869\n@reflectiveTest\nclass ListOfEnumsTest {\n  void test_listOfEnums() async {\n    var mytable = example3.MyTableObjectBuilder(\n      options: [\n        example3.OptionsEnum.A,\n        example3.OptionsEnum.B,\n        example3.OptionsEnum.C,\n      ],\n    );\n    var bytes = mytable.toBytes();\n    var mytable_read = example3.MyTable(bytes);\n    expect(mytable_read.options![0].value, example3.OptionsEnum.A.value);\n    expect(mytable_read.options![1].value, example3.OptionsEnum.B.value);\n    expect(mytable_read.options![2].value, example3.OptionsEnum.C.value);\n  }\n}\n\n@reflectiveTest\nclass BoolInStructTest {\n  void test_boolInStruct() async {\n    var mystruct = example4.FooObjectBuilder(\n      myFoo: example4.FooPropertiesObjectBuilder(a: true, b: false),\n    );\n    var bytes = mystruct.toBytes();\n    var mystruct_read = example4.Foo(bytes);\n    expect(mystruct_read.myFoo!.a, true);\n    expect(mystruct_read.myFoo!.b, false);\n  }\n}\n"
  },
  {
    "path": "dart/test/flex_builder_test.dart",
    "content": "import 'dart:typed_data';\n\nimport 'package:flat_buffers/flex_buffers.dart' show Builder;\nimport 'package:test/test.dart';\n\nvoid main() {\n  test('build with single value', () {\n    {\n      var flx = Builder();\n      flx.addNull();\n      expect(flx.finish(), [0, 0, 1]);\n    }\n    {\n      var flx = Builder();\n      flx.addBool(true);\n      expect(flx.finish(), [1, 104, 1]);\n    }\n    {\n      var flx = Builder();\n      flx.addBool(false);\n      expect(flx.finish(), [0, 104, 1]);\n    }\n    {\n      var flx = Builder();\n      flx.addInt(1);\n      expect(flx.finish(), [1, 4, 1]);\n    }\n    {\n      var flx = Builder();\n      flx.addInt(230);\n      expect(flx.finish(), [230, 0, 5, 2]);\n    }\n    {\n      var flx = Builder();\n      flx.addInt(1025);\n      expect(flx.finish(), [1, 4, 5, 2]);\n    }\n    {\n      var flx = Builder();\n      flx.addInt(-1025);\n      expect(flx.finish(), [255, 251, 5, 2]);\n    }\n    {\n      var builder = Builder()..addDouble(1.0);\n      expect(builder.finish(), [0, 0, 128, 63, 14, 4]);\n    }\n    {\n      var flx = Builder();\n      flx.addDouble(0.1);\n      expect(flx.finish(), [154, 153, 153, 153, 153, 153, 185, 63, 15, 8]);\n    }\n    {\n      var flx = Builder();\n      flx.addDouble(0.5);\n      expect(flx.finish(), [0, 0, 0, 63, 14, 4]);\n    }\n    {\n      var flx = Builder();\n      flx.addString('Maxim');\n      expect(flx.finish(), [5, 77, 97, 120, 105, 109, 0, 6, 20, 1]);\n    }\n    {\n      var flx = Builder();\n      flx.addString('hello 😱');\n      expect(flx.finish(), [\n        10,\n        104,\n        101,\n        108,\n        108,\n        111,\n        32,\n        240,\n        159,\n        152,\n        177,\n        0,\n        11,\n        20,\n        1,\n      ]);\n    }\n  });\n\n  test('build vector', () {\n    {\n      var flx = Builder()\n        ..startVector()\n        ..addInt(1)\n        ..addInt(2)\n        ..end();\n      expect(flx.finish(), [1, 2, 2, 64, 1]);\n    }\n    {\n      var flx = Builder()\n        ..startVector()\n        ..addInt(-1)\n        ..addInt(256)\n        ..end();\n      expect(flx.finish(), [255, 255, 0, 1, 4, 65, 1]);\n    }\n    {\n      var flx = Builder()\n        ..startVector()\n        ..addInt(-45)\n        ..addInt(256000)\n        ..end();\n      expect(flx.finish(), [211, 255, 255, 255, 0, 232, 3, 0, 8, 66, 1]);\n    }\n    {\n      var flx = Builder()\n        ..startVector()\n        ..addDouble(1.1)\n        ..addDouble(-256)\n        ..end();\n      expect(flx.finish(), [\n        154,\n        153,\n        153,\n        153,\n        153,\n        153,\n        241,\n        63,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        112,\n        192,\n        16,\n        75,\n        1,\n      ]);\n    }\n    {\n      var flx = Builder()\n        ..startVector()\n        ..addInt(1)\n        ..addInt(2)\n        ..addInt(4)\n        ..end();\n      expect(flx.finish(), [1, 2, 4, 3, 76, 1]);\n    }\n    {\n      var flx = Builder()\n        ..startVector()\n        ..addInt(-1)\n        ..addInt(256)\n        ..addInt(4)\n        ..end();\n      expect(flx.finish(), [255, 255, 0, 1, 4, 0, 6, 77, 1]);\n    }\n    {\n      var flx = Builder()\n        ..startVector()\n        ..startVector()\n        ..addInt(61)\n        ..end()\n        ..addInt(64)\n        ..end();\n      expect(flx.finish(), [1, 61, 2, 2, 64, 44, 4, 4, 40, 1]);\n    }\n    {\n      var flx = Builder()\n        ..startVector()\n        ..addString('foo')\n        ..addString('bar')\n        ..addString('baz')\n        ..end();\n      expect(flx.finish(), [\n        3,\n        102,\n        111,\n        111,\n        0,\n        3,\n        98,\n        97,\n        114,\n        0,\n        3,\n        98,\n        97,\n        122,\n        0,\n        3,\n        15,\n        11,\n        7,\n        3,\n        60,\n        1,\n      ]);\n    }\n    {\n      var flx = Builder()\n        ..startVector()\n        ..addString('foo')\n        ..addString('bar')\n        ..addString('baz')\n        ..addString('foo')\n        ..addString('bar')\n        ..addString('baz')\n        ..end();\n      expect(flx.finish(), [\n        3,\n        102,\n        111,\n        111,\n        0,\n        3,\n        98,\n        97,\n        114,\n        0,\n        3,\n        98,\n        97,\n        122,\n        0,\n        6,\n        15,\n        11,\n        7,\n        18,\n        14,\n        10,\n        6,\n        60,\n        1,\n      ]);\n    }\n    {\n      var flx = Builder()\n        ..startVector()\n        ..addBool(true)\n        ..addBool(false)\n        ..addBool(true)\n        ..end();\n      expect(flx.finish(), [3, 1, 0, 1, 3, 144, 1]);\n    }\n    {\n      var flx = Builder()\n        ..startVector()\n        ..addString('foo')\n        ..addInt(1)\n        ..addInt(-5)\n        ..addDouble(1.3)\n        ..addBool(true)\n        ..end();\n      expect(flx.finish(), [\n        3,\n        102,\n        111,\n        111,\n        0,\n        0,\n        0,\n        0,\n        5,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        15,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        1,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        251,\n        255,\n        255,\n        255,\n        255,\n        255,\n        255,\n        255,\n        205,\n        204,\n        204,\n        204,\n        204,\n        204,\n        244,\n        63,\n        1,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        20,\n        4,\n        4,\n        15,\n        104,\n        45,\n        43,\n        1,\n      ]);\n    }\n    {\n      // Default buffer is 2048 bytes, add 2300 bytes of strings that force it\n      // to grow.\n      final s1 = 'A' * 1000;\n      final s2 = 'B' * 800;\n      final s3 = 'C' * 500;\n\n      var flx = Builder()\n        ..startVector()\n        ..addString(s1)\n        ..addString(s2)\n        ..addString(s3)\n        ..end();\n      expect(flx.finish().length, 2323);\n    }\n  });\n\n  test('build map', () {\n    {\n      var flx = Builder()\n        ..startMap()\n        ..addKey('a')\n        ..addInt(12)\n        ..end();\n      expect(flx.finish(), [97, 0, 1, 3, 1, 1, 1, 12, 4, 2, 36, 1]);\n    }\n    {\n      var flx = Builder()\n        ..startMap()\n        ..addKey('a')\n        ..addInt(12)\n        ..addKey('')\n        ..addInt(45)\n        ..end();\n      expect(flx.finish(), [\n        97,\n        0,\n        0,\n        2,\n        2,\n        5,\n        2,\n        1,\n        2,\n        45,\n        12,\n        4,\n        4,\n        4,\n        36,\n        1,\n      ]);\n    }\n    {\n      var flx = Builder()\n        ..startVector()\n        ..startMap()\n        ..addKey('something')\n        ..addInt(12)\n        ..end()\n        ..startMap()\n        ..addKey('something')\n        ..addInt(45)\n        ..end()\n        ..end();\n      expect(flx.finish(), [\n        115,\n        111,\n        109,\n        101,\n        116,\n        104,\n        105,\n        110,\n        103,\n        0,\n        1,\n        11,\n        1,\n        1,\n        1,\n        12,\n        4,\n        6,\n        1,\n        1,\n        45,\n        4,\n        2,\n        8,\n        4,\n        36,\n        36,\n        4,\n        40,\n        1,\n      ]);\n    }\n  });\n\n  test('build blob', () {\n    {\n      var flx = Builder()..addBlob(Uint8List.fromList([1, 2, 3]).buffer);\n      expect(flx.finish(), [3, 1, 2, 3, 3, 100, 1]);\n    }\n  });\n\n  test('build from object', () {\n    expect(\n      Builder.buildFromObject(\n        Uint8List.fromList([1, 2, 3]).buffer,\n      ).asUint8List(),\n      [3, 1, 2, 3, 3, 100, 1],\n    );\n    expect(Builder.buildFromObject(null).asUint8List(), [0, 0, 1]);\n    expect(Builder.buildFromObject(true).asUint8List(), [1, 104, 1]);\n    expect(Builder.buildFromObject(false).asUint8List(), [0, 104, 1]);\n    expect(Builder.buildFromObject(25).asUint8List(), [25, 4, 1]);\n    expect(Builder.buildFromObject(-250).asUint8List(), [6, 255, 5, 2]);\n    expect(Builder.buildFromObject(-2.50).asUint8List(), [\n      0,\n      0,\n      32,\n      192,\n      14,\n      4,\n    ]);\n    expect(Builder.buildFromObject('Maxim').asUint8List(), [\n      5,\n      77,\n      97,\n      120,\n      105,\n      109,\n      0,\n      6,\n      20,\n      1,\n    ]);\n    expect(\n      Builder.buildFromObject([1, 3.3, 'max', true, null, false]).asUint8List(),\n      [\n        3,\n        109,\n        97,\n        120,\n        0,\n        0,\n        0,\n        0,\n        6,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        1,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        102,\n        102,\n        102,\n        102,\n        102,\n        102,\n        10,\n        64,\n        31,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        1,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        4,\n        15,\n        20,\n        104,\n        0,\n        104,\n        54,\n        43,\n        1,\n      ],\n    );\n    expect(\n      Builder.buildFromObject([\n        {'something': 12},\n        {'something': 45},\n      ]).asUint8List(),\n      [\n        115,\n        111,\n        109,\n        101,\n        116,\n        104,\n        105,\n        110,\n        103,\n        0,\n        1,\n        11,\n        1,\n        1,\n        1,\n        12,\n        4,\n        6,\n        1,\n        1,\n        45,\n        4,\n        2,\n        8,\n        4,\n        36,\n        36,\n        4,\n        40,\n        1,\n      ],\n    );\n  });\n\n  test('add double indirectly', () {\n    var flx = Builder()..addDoubleIndirectly(0.1);\n    expect(flx.finish(), [154, 153, 153, 153, 153, 153, 185, 63, 8, 35, 1]);\n  });\n\n  test('add double indirectly to vector with cache', () {\n    var flx = Builder()\n      ..startVector()\n      ..addDoubleIndirectly(0.1, cache: true)\n      ..addDoubleIndirectly(0.1, cache: true)\n      ..addDoubleIndirectly(0.1, cache: true)\n      ..addDoubleIndirectly(0.1, cache: true)\n      ..end();\n    expect(flx.finish(), [\n      154,\n      153,\n      153,\n      153,\n      153,\n      153,\n      185,\n      63,\n      4,\n      9,\n      10,\n      11,\n      12,\n      35,\n      35,\n      35,\n      35,\n      8,\n      40,\n      1,\n    ]);\n  });\n\n  test('add int indirectly', () {\n    var flx = Builder()..addIntIndirectly(2345234523452345);\n    expect(flx.finish(), [185, 115, 175, 118, 250, 84, 8, 0, 8, 27, 1]);\n  });\n\n  test('add int indirectly to vector with cache', () {\n    var flx = Builder()\n      ..startVector()\n      ..addIntIndirectly(2345234523452345, cache: true)\n      ..addIntIndirectly(2345234523452345, cache: true)\n      ..addIntIndirectly(2345234523452345, cache: true)\n      ..addIntIndirectly(2345234523452345, cache: true)\n      ..end();\n    expect(flx.finish(), [\n      185,\n      115,\n      175,\n      118,\n      250,\n      84,\n      8,\n      0,\n      4,\n      9,\n      10,\n      11,\n      12,\n      27,\n      27,\n      27,\n      27,\n      8,\n      40,\n      1,\n    ]);\n  });\n\n  test('snapshot', () {\n    var flx = Builder();\n    flx.startVector();\n    flx.addInt(12);\n    expect(flx.snapshot().asUint8List(), [1, 12, 1, 44, 1]);\n    flx.addInt(24);\n    expect(flx.snapshot().asUint8List(), [12, 24, 2, 64, 1]);\n    flx.addInt(45);\n    expect(flx.snapshot().asUint8List(), [12, 24, 45, 3, 76, 1]);\n  });\n}\n"
  },
  {
    "path": "dart/test/flex_reader_test.dart",
    "content": "import 'dart:typed_data';\n\nimport 'package:flat_buffers/flex_buffers.dart' show Reference, Builder;\nimport 'package:test/test.dart';\n\nvoid main() {\n  test('is null', () {\n    expect(Reference.fromBuffer(b([0, 0, 1])).isNull, isTrue);\n  });\n\n  test('bool value', () {\n    expect(Reference.fromBuffer(b([1, 104, 1])).boolValue, isTrue);\n    expect(Reference.fromBuffer(b([0, 104, 1])).boolValue, isFalse);\n  });\n  test('int value', () {\n    expect(Reference.fromBuffer(b([25, 4, 1])).intValue, 25);\n    expect(Reference.fromBuffer(b([231, 4, 1])).intValue, -25);\n    expect(Reference.fromBuffer(b([230, 8, 1])).intValue, 230);\n    expect(Reference.fromBuffer(b([230, 0, 5, 2])).intValue, 230);\n    expect(Reference.fromBuffer(b([1, 4, 5, 2])).intValue, 1025);\n    expect(Reference.fromBuffer(b([255, 251, 5, 2])).intValue, -1025);\n    expect(Reference.fromBuffer(b([1, 4, 9, 2])).intValue, 1025);\n    expect(\n      Reference.fromBuffer(b([255, 255, 255, 127, 6, 4])).intValue,\n      2147483647,\n    );\n    expect(Reference.fromBuffer(b([0, 0, 0, 128, 6, 4])).intValue, -2147483648);\n    expect(\n      Reference.fromBuffer(b([255, 255, 255, 255, 0, 0, 0, 0, 7, 8])).intValue,\n      4294967295,\n    );\n    expect(\n      Reference.fromBuffer(\n        b([255, 255, 255, 255, 255, 255, 255, 127, 7, 8]),\n      ).intValue,\n      9223372036854775807,\n    );\n    expect(\n      Reference.fromBuffer(b([0, 0, 0, 0, 0, 0, 0, 128, 7, 8])).intValue,\n      -9223372036854775808,\n    );\n    // Dart does not really support UInt64\n    //      expect(FlxValue.fromBuffer(b([255, 255, 255, 255, 255, 255, 255, 255, 11, 8])).intValue, 18446744073709551615);\n  });\n  test('double value', () {\n    expect(Reference.fromBuffer(b([0, 0, 128, 63, 14, 4])).doubleValue, 1.0);\n    expect(Reference.fromBuffer(b([0, 0, 144, 64, 14, 4])).doubleValue, 4.5);\n    expect(\n      Reference.fromBuffer(b([205, 204, 204, 61, 14, 4])).doubleValue,\n      closeTo(.1, .001),\n    );\n    expect(\n      Reference.fromBuffer(\n        b([154, 153, 153, 153, 153, 153, 185, 63, 15, 8]),\n      ).doubleValue,\n      .1,\n    );\n  });\n  test('num value', () {\n    expect(Reference.fromBuffer(b([0, 0, 144, 64, 14, 4])).numValue, 4.5);\n    expect(\n      Reference.fromBuffer(b([205, 204, 204, 61, 14, 4])).numValue,\n      closeTo(.1, .001),\n    );\n    expect(\n      Reference.fromBuffer(\n        b([154, 153, 153, 153, 153, 153, 185, 63, 15, 8]),\n      ).numValue,\n      .1,\n    );\n    expect(Reference.fromBuffer(b([255, 251, 5, 2])).numValue, -1025);\n  });\n  test('string value', () {\n    expect(\n      Reference.fromBuffer(\n        b([5, 77, 97, 120, 105, 109, 0, 6, 20, 1]),\n      ).stringValue,\n      'Maxim',\n    );\n    expect(\n      Reference.fromBuffer(\n        b([10, 104, 101, 108, 108, 111, 32, 240, 159, 152, 177, 0, 11, 20, 1]),\n      ).stringValue,\n      'hello 😱',\n    );\n  });\n  test('blob value', () {\n    expect(Reference.fromBuffer(b([3, 1, 2, 3, 3, 100, 1])).blobValue, [\n      1,\n      2,\n      3,\n    ]);\n  });\n  test('bool vector', () {\n    var flx = Reference.fromBuffer(b([3, 1, 0, 1, 3, 144, 1]));\n    expect(flx[0].boolValue, true);\n    expect(flx[1].boolValue, false);\n    expect(flx[2].boolValue, true);\n  });\n  test('number vector', () {\n    testNumbers([3, 1, 2, 3, 3, 44, 1], [1, 2, 3]);\n    testNumbers([3, 255, 2, 3, 3, 44, 1], [-1, 2, 3]);\n    testNumbers([3, 0, 1, 0, 43, 2, 3, 0, 6, 45, 1], [1, 555, 3]);\n    testNumbers(\n      [3, 0, 0, 0, 1, 0, 0, 0, 204, 216, 0, 0, 3, 0, 0, 0, 12, 46, 1],\n      [1, 55500, 3],\n    );\n    testNumbers(\n      [\n        3,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        1,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        172,\n        128,\n        94,\n        239,\n        12,\n        0,\n        0,\n        0,\n        3,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        24,\n        47,\n        1,\n      ],\n      [1, 55555555500, 3],\n    );\n    testNumbers(\n      [3, 0, 0, 0, 0, 0, 192, 63, 0, 0, 32, 64, 0, 0, 96, 64, 12, 54, 1],\n      [1.5, 2.5, 3.5],\n    );\n    testNumbers(\n      [\n        3,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        154,\n        153,\n        153,\n        153,\n        153,\n        153,\n        241,\n        63,\n        154,\n        153,\n        153,\n        153,\n        153,\n        153,\n        1,\n        64,\n        102,\n        102,\n        102,\n        102,\n        102,\n        102,\n        10,\n        64,\n        24,\n        55,\n        1,\n      ],\n      [1.1, 2.2, 3.3],\n    );\n  });\n  test('number vector, fixed type', () {\n    testNumbers([1, 2, 2, 64, 1], [1, 2]);\n    testNumbers([255, 255, 0, 1, 4, 65, 1], [-1, 256]);\n    testNumbers([211, 255, 255, 255, 0, 232, 3, 0, 8, 66, 1], [-45, 256000]);\n    testNumbers(\n      [\n        211,\n        255,\n        255,\n        255,\n        255,\n        255,\n        255,\n        255,\n        255,\n        255,\n        255,\n        255,\n        255,\n        255,\n        255,\n        127,\n        16,\n        67,\n        1,\n      ],\n      [-45, 9223372036854775807],\n    );\n\n    testNumbers([1, 2, 2, 68, 1], [1, 2]);\n    testNumbers([1, 0, 0, 1, 4, 69, 1], [1, 256]);\n    testNumbers([45, 0, 0, 0, 0, 232, 3, 0, 8, 70, 1], [45, 256000]);\n\n    testNumbers([205, 204, 140, 63, 0, 0, 0, 192, 8, 74, 1], [1.1, -2]);\n    testNumbers(\n      [\n        154,\n        153,\n        153,\n        153,\n        153,\n        153,\n        241,\n        63,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        112,\n        192,\n        16,\n        75,\n        1,\n      ],\n      [1.1, -256],\n    );\n\n    testNumbers(\n      [211, 255, 255, 255, 0, 232, 3, 0, 4, 0, 0, 0, 12, 78, 1],\n      [-45, 256000, 4],\n    );\n\n    testNumbers(\n      [\n        211,\n        255,\n        255,\n        255,\n        255,\n        255,\n        255,\n        255,\n        255,\n        255,\n        255,\n        255,\n        255,\n        255,\n        255,\n        127,\n        4,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        9,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        32,\n        91,\n        1,\n      ],\n      [-45, 9223372036854775807, 4, 9],\n    );\n\n    testNumbers(\n      [\n        45,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        255,\n        255,\n        255,\n        255,\n        255,\n        255,\n        255,\n        127,\n        4,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        9,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        32,\n        95,\n        1,\n      ],\n      [45, 9223372036854775807, 4, 9],\n    );\n\n    testNumbers(\n      [\n        154,\n        153,\n        153,\n        153,\n        153,\n        153,\n        241,\n        63,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        112,\n        64,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        16,\n        64,\n        24,\n        87,\n        1,\n      ],\n      [1.1, 256, 4],\n    );\n\n    testNumbers(\n      [\n        154,\n        153,\n        153,\n        153,\n        153,\n        153,\n        241,\n        63,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        112,\n        64,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        16,\n        64,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        34,\n        64,\n        32,\n        99,\n        1,\n      ],\n      [1.1, 256, 4, 9],\n    );\n  });\n  test('string vector', () {\n    testStrings(\n      [\n        3,\n        102,\n        111,\n        111,\n        0,\n        3,\n        98,\n        97,\n        114,\n        0,\n        3,\n        98,\n        97,\n        122,\n        0,\n        3,\n        15,\n        11,\n        7,\n        3,\n        60,\n        1,\n      ],\n      ['foo', 'bar', 'baz'],\n    );\n    testStrings(\n      [\n        3,\n        102,\n        111,\n        111,\n        0,\n        3,\n        98,\n        97,\n        114,\n        0,\n        3,\n        98,\n        97,\n        122,\n        0,\n        6,\n        15,\n        11,\n        7,\n        18,\n        14,\n        10,\n        6,\n        60,\n        1,\n      ],\n      ['foo', 'bar', 'baz', 'foo', 'bar', 'baz'],\n    );\n  });\n  test('mixed vector', () {\n    var flx = Reference.fromBuffer(\n      b([\n        3,\n        102,\n        111,\n        111,\n        0,\n        0,\n        0,\n        0,\n        5,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        15,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        1,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        251,\n        255,\n        255,\n        255,\n        255,\n        255,\n        255,\n        255,\n        205,\n        204,\n        204,\n        204,\n        204,\n        204,\n        244,\n        63,\n        1,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        20,\n        4,\n        4,\n        15,\n        104,\n        45,\n        43,\n        1,\n      ]),\n    );\n    expect(flx.length, 5);\n    expect(flx[0].stringValue, 'foo');\n    expect(flx[1].numValue, 1);\n    expect(flx[2].numValue, -5);\n    expect(flx[3].numValue, 1.3);\n    expect(flx[4].boolValue, true);\n  });\n\n  test('single value map', () {\n    var flx = Reference.fromBuffer(b([97, 0, 1, 3, 1, 1, 1, 12, 4, 2, 36, 1]));\n    expect(flx.length, 1);\n    expect(flx['a'].numValue, 12);\n  });\n  test('two value map', () {\n    var flx = Reference.fromBuffer(\n      b([0, 97, 0, 2, 4, 4, 2, 1, 2, 45, 12, 4, 4, 4, 36, 1]),\n    );\n    expect(flx.length, 2);\n    expect(flx['a'].numValue, 12);\n    expect(flx[''].numValue, 45);\n  });\n  test('complex map', () {\n    var flx = complexMap();\n    expect(flx.length, 5);\n    expect(flx['age'].numValue, 35);\n    expect(flx['weight'].numValue, 72.5);\n    expect(flx['name'].stringValue, 'Maxim');\n\n    expect(flx['flags'].length, 4);\n    expect(flx['flags'][0].boolValue, true);\n    expect(flx['flags'][1].boolValue, false);\n    expect(flx['flags'][2].boolValue, true);\n    expect(flx['flags'][3].boolValue, true);\n\n    expect(flx['address'].length, 3);\n    expect(flx['address']['city'].stringValue, 'Bla');\n    expect(flx['address']['zip'].stringValue, '12345');\n    expect(flx['address']['countryCode'].stringValue, 'XX');\n\n    expect(\n      () => flx['address']['country'].stringValue,\n      throwsA(\n        predicate(\n          (dynamic e) =>\n              e is ArgumentError &&\n              e.message ==\n                  'Key: [country] is not applicable on: //address of: ValueType.Map',\n        ),\n      ),\n    );\n    expect(\n      () => flx['address']['countryCode'][0],\n      throwsA(\n        predicate(\n          (dynamic e) =>\n              e is ArgumentError &&\n              e.message ==\n                  'Key: [0] is not applicable on: //address/countryCode of: ValueType.String',\n        ),\n      ),\n    );\n    expect(\n      () => flx[1],\n      throwsA(\n        predicate(\n          (dynamic e) =>\n              e is ArgumentError &&\n              e.message == 'Key: [1] is not applicable on: / of: ValueType.Map',\n        ),\n      ),\n    );\n    expect(\n      () => flx['flags'][4],\n      throwsA(\n        predicate(\n          (dynamic e) =>\n              e is ArgumentError &&\n              e.message ==\n                  'Key: [4] is not applicable on: //flags of: ValueType.VectorBool length: 4',\n        ),\n      ),\n    );\n    expect(\n      () => flx['flags'][-1],\n      throwsA(\n        predicate(\n          (dynamic e) =>\n              e is ArgumentError &&\n              e.message ==\n                  'Key: [-1] is not applicable on: //flags of: ValueType.VectorBool length: 4',\n        ),\n      ),\n    );\n  });\n  test('complex map to json', () {\n    var flx = complexMap();\n    expect(\n      flx.json,\n      '{\"address\":{\"city\":\"Bla\",\"countryCode\":\"XX\",\"zip\":\"12345\"},\"age\":35,\"flags\":[true,false,true,true],\"name\":\"Maxim\",\"weight\":72.5}',\n    );\n  });\n\n  test('complex map iterators', () {\n    var flx = complexMap();\n    expect(flx.mapKeyIterable.map((e) => e).toList(), [\n      'address',\n      'age',\n      'flags',\n      'name',\n      'weight',\n    ]);\n    expect(flx.mapValueIterable.map((e) => e.json).toList(), [\n      flx['address'].json,\n      flx['age'].json,\n      flx['flags'].json,\n      flx['name'].json,\n      flx['weight'].json,\n    ]);\n    expect(flx['flags'].vectorIterable.map((e) => e.boolValue).toList(), [\n      true,\n      false,\n      true,\n      true,\n    ]);\n  });\n\n  test('bug where offest were stored as int instead of uint', () {\n    const data = [\n      99,\n      104,\n      97,\n      110,\n      110,\n      101,\n      108,\n      115,\n      95,\n      105,\n      110,\n      0,\n      100,\n      105,\n      108,\n      97,\n      116,\n      105,\n      111,\n      110,\n      95,\n      104,\n      101,\n      105,\n      103,\n      104,\n      116,\n      95,\n      102,\n      97,\n      99,\n      116,\n      111,\n      114,\n      0,\n      100,\n      105,\n      108,\n      97,\n      116,\n      105,\n      111,\n      110,\n      95,\n      119,\n      105,\n      100,\n      116,\n      104,\n      95,\n      102,\n      97,\n      99,\n      116,\n      111,\n      114,\n      0,\n      102,\n      117,\n      115,\n      101,\n      100,\n      95,\n      97,\n      99,\n      116,\n      105,\n      118,\n      97,\n      116,\n      105,\n      111,\n      110,\n      95,\n      102,\n      117,\n      110,\n      99,\n      116,\n      105,\n      111,\n      110,\n      0,\n      112,\n      97,\n      100,\n      95,\n      118,\n      97,\n      108,\n      117,\n      101,\n      115,\n      0,\n      112,\n      97,\n      100,\n      100,\n      105,\n      110,\n      103,\n      0,\n      115,\n      116,\n      114,\n      105,\n      100,\n      101,\n      95,\n      104,\n      101,\n      105,\n      103,\n      104,\n      116,\n      0,\n      115,\n      116,\n      114,\n      105,\n      100,\n      101,\n      95,\n      119,\n      105,\n      100,\n      116,\n      104,\n      0,\n      8,\n      130,\n      119,\n      97,\n      76,\n      51,\n      41,\n      34,\n      21,\n      8,\n      1,\n      8,\n      64,\n      1,\n      1,\n      1,\n      1,\n      0,\n      1,\n      1,\n      4,\n      4,\n      4,\n      4,\n      4,\n      4,\n      4,\n      4,\n      16,\n      36,\n      1,\n    ];\n    var flx = Reference.fromBuffer(b(data));\n    expect(\n      flx.json,\n      '{\"channels_in\":64,\"dilation_height_factor\":1,\"dilation_width_factor\":1,\"fused_activation_function\":1,\"pad_values\":1,\"padding\":0,\"stride_height\":1,\"stride_width\":1}',\n    );\n    const object = {\n      \"channels_in\": 64,\n      \"dilation_height_factor\": 1,\n      \"dilation_width_factor\": 1,\n      \"fused_activation_function\": 1,\n      \"pad_values\": 1,\n      \"padding\": 0,\n      \"stride_height\": 1,\n      \"stride_width\": 1,\n    };\n    var data1 = Builder.buildFromObject(object).asUint8List();\n    expect(data1.length, data.length);\n    var flx1 = Reference.fromBuffer(b(data1));\n    expect(\n      flx1.json,\n      '{\"channels_in\":64,\"dilation_height_factor\":1,\"dilation_width_factor\":1,\"fused_activation_function\":1,\"pad_values\":1,\"padding\":0,\"stride_height\":1,\"stride_width\":1}',\n    );\n  });\n}\n\nByteBuffer b(List<int> values) {\n  var data = Uint8List.fromList(values);\n  return data.buffer;\n}\n\nvoid testNumbers(List<int> buffer, List<num> numbers) {\n  var flx = Reference.fromBuffer(b(buffer));\n  expect(flx.length, numbers.length);\n  for (var i = 0; i < flx.length; i++) {\n    expect(flx[i].numValue, closeTo(numbers[i], 0.001));\n  }\n}\n\nvoid testStrings(List<int> buffer, List<String> numbers) {\n  var flx = Reference.fromBuffer(b(buffer));\n  expect(flx.length, numbers.length);\n  for (var i = 0; i < flx.length; i++) {\n    expect(flx[i].stringValue, numbers[i]);\n  }\n}\n\nReference complexMap() {\n  //  {\n  //    \"age\": 35,\n  //    \"flags\": [True, False, True, True],\n  //    \"weight\": 72.5,\n  //    \"name\": \"Maxim\",\n  //    \"address\": {\n  //      \"city\": \"Bla\",\n  //      \"zip\": \"12345\",\n  //      \"countryCode\": \"XX\",\n  //    }\n  //  }\n  return Reference.fromBuffer(\n    b([\n      97,\n      100,\n      100,\n      114,\n      101,\n      115,\n      115,\n      0,\n      99,\n      105,\n      116,\n      121,\n      0,\n      3,\n      66,\n      108,\n      97,\n      0,\n      99,\n      111,\n      117,\n      110,\n      116,\n      114,\n      121,\n      67,\n      111,\n      100,\n      101,\n      0,\n      2,\n      88,\n      88,\n      0,\n      122,\n      105,\n      112,\n      0,\n      5,\n      49,\n      50,\n      51,\n      52,\n      53,\n      0,\n      3,\n      38,\n      29,\n      14,\n      3,\n      1,\n      3,\n      38,\n      22,\n      15,\n      20,\n      20,\n      20,\n      97,\n      103,\n      101,\n      0,\n      102,\n      108,\n      97,\n      103,\n      115,\n      0,\n      4,\n      1,\n      0,\n      1,\n      1,\n      110,\n      97,\n      109,\n      101,\n      0,\n      5,\n      77,\n      97,\n      120,\n      105,\n      109,\n      0,\n      119,\n      101,\n      105,\n      103,\n      104,\n      116,\n      0,\n      5,\n      93,\n      36,\n      33,\n      23,\n      12,\n      0,\n      0,\n      7,\n      0,\n      0,\n      0,\n      1,\n      0,\n      0,\n      0,\n      5,\n      0,\n      0,\n      0,\n      60,\n      0,\n      0,\n      0,\n      35,\n      0,\n      0,\n      0,\n      51,\n      0,\n      0,\n      0,\n      45,\n      0,\n      0,\n      0,\n      0,\n      0,\n      145,\n      66,\n      36,\n      4,\n      144,\n      20,\n      14,\n      25,\n      38,\n      1,\n    ]),\n  );\n}\n"
  },
  {
    "path": "dart/test/flex_types_test.dart",
    "content": "import 'package:flat_buffers/src/types.dart';\nimport 'package:test/test.dart';\n\nvoid main() {\n  test('is inline', () {\n    expect(ValueTypeUtils.isInline(ValueType.Bool), isTrue);\n    expect(ValueTypeUtils.isInline(ValueType.Int), isTrue);\n    expect(ValueTypeUtils.isInline(ValueType.UInt), isTrue);\n    expect(ValueTypeUtils.isInline(ValueType.Float), isTrue);\n    expect(ValueTypeUtils.isInline(ValueType.Null), isTrue);\n    expect(ValueTypeUtils.isInline(ValueType.String), isFalse);\n  });\n  test('is type vector element', () {\n    expect(ValueTypeUtils.isTypedVectorElement(ValueType.Bool), isTrue);\n    expect(ValueTypeUtils.isTypedVectorElement(ValueType.Int), isTrue);\n    expect(ValueTypeUtils.isTypedVectorElement(ValueType.UInt), isTrue);\n    expect(ValueTypeUtils.isTypedVectorElement(ValueType.Float), isTrue);\n    expect(ValueTypeUtils.isTypedVectorElement(ValueType.Key), isTrue);\n    expect(ValueTypeUtils.isTypedVectorElement(ValueType.String), isTrue);\n\n    expect(ValueTypeUtils.isTypedVectorElement(ValueType.Null), isFalse);\n    expect(ValueTypeUtils.isTypedVectorElement(ValueType.Blob), isFalse);\n  });\n  test('is typed vector', () {\n    expect(ValueTypeUtils.isTypedVector(ValueType.VectorInt), isTrue);\n    expect(ValueTypeUtils.isTypedVector(ValueType.VectorUInt), isTrue);\n    expect(ValueTypeUtils.isTypedVector(ValueType.VectorFloat), isTrue);\n    expect(ValueTypeUtils.isTypedVector(ValueType.VectorBool), isTrue);\n    expect(ValueTypeUtils.isTypedVector(ValueType.VectorKey), isTrue);\n    expect(ValueTypeUtils.isTypedVector(ValueType.VectorString), isTrue);\n\n    expect(ValueTypeUtils.isTypedVector(ValueType.Vector), isFalse);\n    expect(ValueTypeUtils.isTypedVector(ValueType.Map), isFalse);\n    expect(ValueTypeUtils.isTypedVector(ValueType.Bool), isFalse);\n    expect(ValueTypeUtils.isTypedVector(ValueType.VectorInt2), isFalse);\n  });\n  test('is fixed typed vector', () {\n    expect(ValueTypeUtils.isFixedTypedVector(ValueType.VectorInt2), isTrue);\n    expect(ValueTypeUtils.isFixedTypedVector(ValueType.VectorInt3), isTrue);\n    expect(ValueTypeUtils.isFixedTypedVector(ValueType.VectorInt4), isTrue);\n    expect(ValueTypeUtils.isFixedTypedVector(ValueType.VectorUInt2), isTrue);\n    expect(ValueTypeUtils.isFixedTypedVector(ValueType.VectorUInt3), isTrue);\n    expect(ValueTypeUtils.isFixedTypedVector(ValueType.VectorUInt4), isTrue);\n    expect(ValueTypeUtils.isFixedTypedVector(ValueType.VectorFloat2), isTrue);\n    expect(ValueTypeUtils.isFixedTypedVector(ValueType.VectorFloat3), isTrue);\n    expect(ValueTypeUtils.isFixedTypedVector(ValueType.VectorFloat4), isTrue);\n\n    expect(ValueTypeUtils.isFixedTypedVector(ValueType.VectorInt), isFalse);\n  });\n  test('to typed vector', () {\n    expect(\n      ValueTypeUtils.toTypedVector(ValueType.Int, 0),\n      equals(ValueType.VectorInt),\n    );\n    expect(\n      ValueTypeUtils.toTypedVector(ValueType.UInt, 0),\n      equals(ValueType.VectorUInt),\n    );\n    expect(\n      ValueTypeUtils.toTypedVector(ValueType.Bool, 0),\n      equals(ValueType.VectorBool),\n    );\n    expect(\n      ValueTypeUtils.toTypedVector(ValueType.Float, 0),\n      equals(ValueType.VectorFloat),\n    );\n    expect(\n      ValueTypeUtils.toTypedVector(ValueType.Key, 0),\n      equals(ValueType.VectorKey),\n    );\n    expect(\n      ValueTypeUtils.toTypedVector(ValueType.String, 0),\n      equals(ValueType.VectorString),\n    );\n\n    expect(\n      ValueTypeUtils.toTypedVector(ValueType.Int, 2),\n      equals(ValueType.VectorInt2),\n    );\n    expect(\n      ValueTypeUtils.toTypedVector(ValueType.UInt, 2),\n      equals(ValueType.VectorUInt2),\n    );\n    expect(\n      ValueTypeUtils.toTypedVector(ValueType.Float, 2),\n      equals(ValueType.VectorFloat2),\n    );\n\n    expect(\n      ValueTypeUtils.toTypedVector(ValueType.Int, 3),\n      equals(ValueType.VectorInt3),\n    );\n    expect(\n      ValueTypeUtils.toTypedVector(ValueType.UInt, 3),\n      equals(ValueType.VectorUInt3),\n    );\n    expect(\n      ValueTypeUtils.toTypedVector(ValueType.Float, 3),\n      equals(ValueType.VectorFloat3),\n    );\n\n    expect(\n      ValueTypeUtils.toTypedVector(ValueType.Int, 4),\n      equals(ValueType.VectorInt4),\n    );\n    expect(\n      ValueTypeUtils.toTypedVector(ValueType.UInt, 4),\n      equals(ValueType.VectorUInt4),\n    );\n    expect(\n      ValueTypeUtils.toTypedVector(ValueType.Float, 4),\n      equals(ValueType.VectorFloat4),\n    );\n  });\n  test('typed vector element type', () {\n    expect(\n      ValueTypeUtils.typedVectorElementType(ValueType.VectorInt),\n      equals(ValueType.Int),\n    );\n    expect(\n      ValueTypeUtils.typedVectorElementType(ValueType.VectorUInt),\n      equals(ValueType.UInt),\n    );\n    expect(\n      ValueTypeUtils.typedVectorElementType(ValueType.VectorFloat),\n      equals(ValueType.Float),\n    );\n    expect(\n      ValueTypeUtils.typedVectorElementType(ValueType.VectorString),\n      equals(ValueType.String),\n    );\n    expect(\n      ValueTypeUtils.typedVectorElementType(ValueType.VectorKey),\n      equals(ValueType.Key),\n    );\n    expect(\n      ValueTypeUtils.typedVectorElementType(ValueType.VectorBool),\n      equals(ValueType.Bool),\n    );\n  });\n  test('fixed typed vector element type', () {\n    expect(\n      ValueTypeUtils.fixedTypedVectorElementType(ValueType.VectorInt2),\n      equals(ValueType.Int),\n    );\n    expect(\n      ValueTypeUtils.fixedTypedVectorElementType(ValueType.VectorInt3),\n      equals(ValueType.Int),\n    );\n    expect(\n      ValueTypeUtils.fixedTypedVectorElementType(ValueType.VectorInt4),\n      equals(ValueType.Int),\n    );\n\n    expect(\n      ValueTypeUtils.fixedTypedVectorElementType(ValueType.VectorUInt2),\n      equals(ValueType.UInt),\n    );\n    expect(\n      ValueTypeUtils.fixedTypedVectorElementType(ValueType.VectorUInt3),\n      equals(ValueType.UInt),\n    );\n    expect(\n      ValueTypeUtils.fixedTypedVectorElementType(ValueType.VectorUInt4),\n      equals(ValueType.UInt),\n    );\n\n    expect(\n      ValueTypeUtils.fixedTypedVectorElementType(ValueType.VectorFloat2),\n      equals(ValueType.Float),\n    );\n    expect(\n      ValueTypeUtils.fixedTypedVectorElementType(ValueType.VectorFloat3),\n      equals(ValueType.Float),\n    );\n    expect(\n      ValueTypeUtils.fixedTypedVectorElementType(ValueType.VectorFloat4),\n      equals(ValueType.Float),\n    );\n  });\n  test('fixed typed vector element size', () {\n    expect(\n      ValueTypeUtils.fixedTypedVectorElementSize(ValueType.VectorInt2),\n      equals(2),\n    );\n    expect(\n      ValueTypeUtils.fixedTypedVectorElementSize(ValueType.VectorInt3),\n      equals(3),\n    );\n    expect(\n      ValueTypeUtils.fixedTypedVectorElementSize(ValueType.VectorInt4),\n      equals(4),\n    );\n\n    expect(\n      ValueTypeUtils.fixedTypedVectorElementSize(ValueType.VectorUInt2),\n      equals(2),\n    );\n    expect(\n      ValueTypeUtils.fixedTypedVectorElementSize(ValueType.VectorUInt3),\n      equals(3),\n    );\n    expect(\n      ValueTypeUtils.fixedTypedVectorElementSize(ValueType.VectorUInt4),\n      equals(4),\n    );\n\n    expect(\n      ValueTypeUtils.fixedTypedVectorElementSize(ValueType.VectorFloat2),\n      equals(2),\n    );\n    expect(\n      ValueTypeUtils.fixedTypedVectorElementSize(ValueType.VectorFloat3),\n      equals(3),\n    );\n    expect(\n      ValueTypeUtils.fixedTypedVectorElementSize(ValueType.VectorFloat4),\n      equals(4),\n    );\n  });\n  test('packed type', () {\n    expect(\n      ValueTypeUtils.packedType(ValueType.Null, BitWidth.width8),\n      equals(0),\n    );\n    expect(\n      ValueTypeUtils.packedType(ValueType.Null, BitWidth.width16),\n      equals(1),\n    );\n    expect(\n      ValueTypeUtils.packedType(ValueType.Null, BitWidth.width32),\n      equals(2),\n    );\n    expect(\n      ValueTypeUtils.packedType(ValueType.Null, BitWidth.width64),\n      equals(3),\n    );\n\n    expect(\n      ValueTypeUtils.packedType(ValueType.Int, BitWidth.width8),\n      equals(4),\n    );\n    expect(\n      ValueTypeUtils.packedType(ValueType.Int, BitWidth.width16),\n      equals(5),\n    );\n    expect(\n      ValueTypeUtils.packedType(ValueType.Int, BitWidth.width32),\n      equals(6),\n    );\n    expect(\n      ValueTypeUtils.packedType(ValueType.Int, BitWidth.width64),\n      equals(7),\n    );\n  });\n  test('bit width', () {\n    expect(BitWidthUtil.width(0), BitWidth.width8);\n    expect(BitWidthUtil.width(-20), BitWidth.width8);\n    expect(BitWidthUtil.width(127), BitWidth.width8);\n    expect(BitWidthUtil.width(128), BitWidth.width16);\n    expect(BitWidthUtil.width(128123), BitWidth.width32);\n    expect(BitWidthUtil.width(12812324534), BitWidth.width64);\n    expect(BitWidthUtil.width(-127), BitWidth.width8);\n    expect(BitWidthUtil.width(-128), BitWidth.width16);\n    expect(BitWidthUtil.width(-12812324534), BitWidth.width64);\n    expect(BitWidthUtil.width(-0.1), BitWidth.width64);\n    expect(BitWidthUtil.width(0.25), BitWidth.width32);\n  });\n  test('padding size', () {\n    expect(BitWidthUtil.paddingSize(10, 8), 6);\n    expect(BitWidthUtil.paddingSize(10, 4), 2);\n    expect(BitWidthUtil.paddingSize(15, 4), 1);\n    expect(BitWidthUtil.paddingSize(15, 2), 1);\n    expect(BitWidthUtil.paddingSize(15, 1), 0);\n    expect(BitWidthUtil.paddingSize(16, 8), 0);\n    expect(BitWidthUtil.paddingSize(17, 8), 7);\n  });\n}\n"
  },
  {
    "path": "dart/test/include_test1_generated.dart",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable, constant_identifier_names\n\nimport 'dart:typed_data' show Uint8List;\n\nimport 'package:flat_buffers/flat_buffers.dart' as fb;\n\nimport './include_test2_my_game.other_name_space_generated.dart'\n    as my_game_other_name_space;\n\nclass TableA {\n  TableA._(this._bc, this._bcOffset);\n  factory TableA(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<TableA> reader = _TableAReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  my_game_other_name_space.TableB? get b => my_game_other_name_space\n      .TableB\n      .reader\n      .vTableGetNullable(_bc, _bcOffset, 4);\n\n  @override\n  String toString() {\n    return 'TableA{b: ${b}}';\n  }\n\n  TableAT unpack() => TableAT(b: b?.unpack());\n\n  static int pack(fb.Builder fbBuilder, TableAT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass TableAT implements fb.Packable {\n  my_game_other_name_space.TableBT? b;\n\n  TableAT({this.b});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    final int? bOffset = b?.pack(fbBuilder);\n    fbBuilder.startTable(1);\n    fbBuilder.addOffset(0, bOffset);\n    return fbBuilder.endTable();\n  }\n\n  @override\n  String toString() {\n    return 'TableAT{b: ${b}}';\n  }\n}\n\nclass _TableAReader extends fb.TableReader<TableA> {\n  const _TableAReader();\n\n  @override\n  TableA createObject(fb.BufferContext bc, int offset) => TableA._(bc, offset);\n}\n\nclass TableABuilder {\n  TableABuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  void begin() {\n    fbBuilder.startTable(1);\n  }\n\n  int addBOffset(int? offset) {\n    fbBuilder.addOffset(0, offset);\n    return fbBuilder.offset;\n  }\n\n  int finish() {\n    return fbBuilder.endTable();\n  }\n}\n\nclass TableAObjectBuilder extends fb.ObjectBuilder {\n  final my_game_other_name_space.TableBObjectBuilder? _b;\n\n  TableAObjectBuilder({my_game_other_name_space.TableBObjectBuilder? b})\n    : _b = b;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    final int? bOffset = _b?.getOrCreateOffset(fbBuilder);\n    fbBuilder.startTable(1);\n    fbBuilder.addOffset(0, bOffset);\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n"
  },
  {
    "path": "dart/test/include_test2_my_game.other_name_space_generated.dart",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable, constant_identifier_names\n\nlibrary my_game.other_name_space;\n\nimport 'dart:typed_data' show Uint8List;\n\nimport 'package:flat_buffers/flat_buffers.dart' as fb;\n\nimport './include_test1_generated.dart';\n\nenum FromInclude {\n  IncludeVal(0);\n\n  final int value;\n  const FromInclude(this.value);\n\n  factory FromInclude.fromValue(int value) {\n    switch (value) {\n      case 0:\n        return FromInclude.IncludeVal;\n      default:\n        throw StateError('Invalid value $value for bit flag enum');\n    }\n  }\n\n  static FromInclude? _createOrNull(int? value) =>\n      value == null ? null : FromInclude.fromValue(value);\n\n  static const int minValue = 0;\n  static const int maxValue = 0;\n  static const fb.Reader<FromInclude> reader = _FromIncludeReader();\n}\n\nclass _FromIncludeReader extends fb.Reader<FromInclude> {\n  const _FromIncludeReader();\n\n  @override\n  int get size => 8;\n\n  @override\n  FromInclude read(fb.BufferContext bc, int offset) =>\n      FromInclude.fromValue(const fb.Int64Reader().read(bc, offset));\n}\n\nclass Unused {\n  Unused._(this._bc, this._bcOffset);\n\n  static const fb.Reader<Unused> reader = _UnusedReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  int get a => const fb.Int32Reader().read(_bc, _bcOffset + 0);\n\n  @override\n  String toString() {\n    return 'Unused{a: ${a}}';\n  }\n\n  UnusedT unpack() => UnusedT(a: a);\n\n  static int pack(fb.Builder fbBuilder, UnusedT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass UnusedT implements fb.Packable {\n  int a;\n\n  UnusedT({required this.a});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    fbBuilder.putInt32(a);\n    return fbBuilder.offset;\n  }\n\n  @override\n  String toString() {\n    return 'UnusedT{a: ${a}}';\n  }\n}\n\nclass _UnusedReader extends fb.StructReader<Unused> {\n  const _UnusedReader();\n\n  @override\n  int get size => 4;\n\n  @override\n  Unused createObject(fb.BufferContext bc, int offset) => Unused._(bc, offset);\n}\n\nclass UnusedBuilder {\n  UnusedBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  int finish(int a) {\n    fbBuilder.putInt32(a);\n    return fbBuilder.offset;\n  }\n}\n\nclass UnusedObjectBuilder extends fb.ObjectBuilder {\n  final int _a;\n\n  UnusedObjectBuilder({required int a}) : _a = a;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    fbBuilder.putInt32(_a);\n    return fbBuilder.offset;\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n\nclass TableB {\n  TableB._(this._bc, this._bcOffset);\n  factory TableB(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<TableB> reader = _TableBReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  TableA? get a => TableA.reader.vTableGetNullable(_bc, _bcOffset, 4);\n\n  @override\n  String toString() {\n    return 'TableB{a: ${a}}';\n  }\n\n  TableBT unpack() => TableBT(a: a?.unpack());\n\n  static int pack(fb.Builder fbBuilder, TableBT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass TableBT implements fb.Packable {\n  TableAT? a;\n\n  TableBT({this.a});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    final int? aOffset = a?.pack(fbBuilder);\n    fbBuilder.startTable(1);\n    fbBuilder.addOffset(0, aOffset);\n    return fbBuilder.endTable();\n  }\n\n  @override\n  String toString() {\n    return 'TableBT{a: ${a}}';\n  }\n}\n\nclass _TableBReader extends fb.TableReader<TableB> {\n  const _TableBReader();\n\n  @override\n  TableB createObject(fb.BufferContext bc, int offset) => TableB._(bc, offset);\n}\n\nclass TableBBuilder {\n  TableBBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  void begin() {\n    fbBuilder.startTable(1);\n  }\n\n  int addAOffset(int? offset) {\n    fbBuilder.addOffset(0, offset);\n    return fbBuilder.offset;\n  }\n\n  int finish() {\n    return fbBuilder.endTable();\n  }\n}\n\nclass TableBObjectBuilder extends fb.ObjectBuilder {\n  final TableAObjectBuilder? _a;\n\n  TableBObjectBuilder({TableAObjectBuilder? a}) : _a = a;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    final int? aOffset = _a?.getOrCreateOffset(fbBuilder);\n    fbBuilder.startTable(1);\n    fbBuilder.addOffset(0, aOffset);\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n"
  },
  {
    "path": "dart/test/keyword_test_keyword_test_generated.dart",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable, constant_identifier_names\n\nlibrary keyword_test;\n\nimport 'dart:typed_data' show Uint8List;\nimport 'package:flat_buffers/flat_buffers.dart' as fb;\n\n\n\nenum Abc {\n  $void(0),\n  where(1),\n  stackalloc(2);\n\n  final int value;\n  const Abc(this.value);\n\n  factory Abc.fromValue(int value) {\n    switch (value) {\n      case 0: return Abc.$void;\n      case 1: return Abc.where;\n      case 2: return Abc.stackalloc;\n      default: throw StateError('Invalid value $value for bit flag enum');\n    }\n  }\n\n  static Abc? _createOrNull(int? value) =>\n      value == null ? null : Abc.fromValue(value);\n\n  static const int minValue = 0;\n  static const int maxValue = 2;\n  static const fb.Reader<Abc> reader = _AbcReader();\n}\n\nclass _AbcReader extends fb.Reader<Abc> {\n  const _AbcReader();\n\n  @override\n  int get size => 4;\n\n  @override\n  Abc read(fb.BufferContext bc, int offset) =>\n      Abc.fromValue(const fb.Int32Reader().read(bc, offset));\n}\n\nenum Public {\n  NONE(0);\n\n  final int value;\n  const Public(this.value);\n\n  factory Public.fromValue(int value) {\n    switch (value) {\n      case 0: return Public.NONE;\n      default: throw StateError('Invalid value $value for bit flag enum');\n    }\n  }\n\n  static Public? _createOrNull(int? value) =>\n      value == null ? null : Public.fromValue(value);\n\n  static const int minValue = 0;\n  static const int maxValue = 0;\n  static const fb.Reader<Public> reader = _PublicReader();\n}\n\nclass _PublicReader extends fb.Reader<Public> {\n  const _PublicReader();\n\n  @override\n  int get size => 4;\n\n  @override\n  Public read(fb.BufferContext bc, int offset) =>\n      Public.fromValue(const fb.Int32Reader().read(bc, offset));\n}\n\nenum KeywordsInUnionTypeId {\n  NONE(0),\n  $static(1),\n  internal(2);\n\n  final int value;\n  const KeywordsInUnionTypeId(this.value);\n\n  factory KeywordsInUnionTypeId.fromValue(int value) {\n    switch (value) {\n      case 0: return KeywordsInUnionTypeId.NONE;\n      case 1: return KeywordsInUnionTypeId.$static;\n      case 2: return KeywordsInUnionTypeId.internal;\n      default: throw StateError('Invalid value $value for bit flag enum');\n    }\n  }\n\n  static KeywordsInUnionTypeId? _createOrNull(int? value) =>\n      value == null ? null : KeywordsInUnionTypeId.fromValue(value);\n\n  static const int minValue = 0;\n  static const int maxValue = 2;\n  static const fb.Reader<KeywordsInUnionTypeId> reader = _KeywordsInUnionTypeIdReader();\n}\n\nclass _KeywordsInUnionTypeIdReader extends fb.Reader<KeywordsInUnionTypeId> {\n  const _KeywordsInUnionTypeIdReader();\n\n  @override\n  int get size => 1;\n\n  @override\n  KeywordsInUnionTypeId read(fb.BufferContext bc, int offset) =>\n      KeywordsInUnionTypeId.fromValue(const fb.Uint8Reader().read(bc, offset));\n}\n\nclass KeywordsInTable {\n  KeywordsInTable._(this._bc, this._bcOffset);\n  factory KeywordsInTable(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<KeywordsInTable> reader = _KeywordsInTableReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  Abc get $is => Abc.fromValue(const fb.Int32Reader().vTableGet(_bc, _bcOffset, 4, 0));\n  Public get private => Public.fromValue(const fb.Int32Reader().vTableGet(_bc, _bcOffset, 6, 0));\n  int get type => const fb.Int32Reader().vTableGet(_bc, _bcOffset, 8, 0);\n  bool get $default => const fb.BoolReader().vTableGet(_bc, _bcOffset, 10, false);\n\n  @override\n  String toString() {\n    return 'KeywordsInTable{\\$is: ${$is}, private: ${private}, type: ${type}, \\$default: ${$default}}';\n  }\n\n  KeywordsInTableT unpack() => KeywordsInTableT(\n      $is: $is,\n      private: private,\n      type: type,\n      $default: $default);\n\n  static int pack(fb.Builder fbBuilder, KeywordsInTableT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass KeywordsInTableT implements fb.Packable {\n  Abc $is;\n  Public private;\n  int type;\n  bool $default;\n\n  KeywordsInTableT({\n      this.$is = Abc.$void,\n      this.private = Public.NONE,\n      this.type = 0,\n      this.$default = false});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    fbBuilder.startTable(4);\n    fbBuilder.addInt32(0, $is.value);\n    fbBuilder.addInt32(1, private.value);\n    fbBuilder.addInt32(2, type);\n    fbBuilder.addBool(3, $default);\n    return fbBuilder.endTable();\n  }\n\n  @override\n  String toString() {\n    return 'KeywordsInTableT{\\$is: ${$is}, private: ${private}, type: ${type}, \\$default: ${$default}}';\n  }\n}\n\nclass _KeywordsInTableReader extends fb.TableReader<KeywordsInTable> {\n  const _KeywordsInTableReader();\n\n  @override\n  KeywordsInTable createObject(fb.BufferContext bc, int offset) => \n    KeywordsInTable._(bc, offset);\n}\n\nclass KeywordsInTableBuilder {\n  KeywordsInTableBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  void begin() {\n    fbBuilder.startTable(4);\n  }\n\n  int addIs(Abc? $is) {\n    fbBuilder.addInt32(0, $is?.value);\n    return fbBuilder.offset;\n  }\n  int addPrivate(Public? private) {\n    fbBuilder.addInt32(1, private?.value);\n    return fbBuilder.offset;\n  }\n  int addType(int? type) {\n    fbBuilder.addInt32(2, type);\n    return fbBuilder.offset;\n  }\n  int addDefault(bool? $default) {\n    fbBuilder.addBool(3, $default);\n    return fbBuilder.offset;\n  }\n\n  int finish() {\n    return fbBuilder.endTable();\n  }\n}\n\nclass KeywordsInTableObjectBuilder extends fb.ObjectBuilder {\n  final Abc? _$is;\n  final Public? _private;\n  final int? _type;\n  final bool? _$default;\n\n  KeywordsInTableObjectBuilder({\n    Abc? $is,\n    Public? private,\n    int? type,\n    bool? $default,\n  })\n      : _$is = $is,\n        _private = private,\n        _type = type,\n        _$default = $default;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    fbBuilder.startTable(4);\n    fbBuilder.addInt32(0, _$is?.value);\n    fbBuilder.addInt32(1, _private?.value);\n    fbBuilder.addInt32(2, _type);\n    fbBuilder.addBool(3, _$default);\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\nclass Table2 {\n  Table2._(this._bc, this._bcOffset);\n  factory Table2(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<Table2> reader = _Table2Reader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  KeywordsInUnionTypeId? get typeType => KeywordsInUnionTypeId._createOrNull(const fb.Uint8Reader().vTableGetNullable(_bc, _bcOffset, 4));\n  dynamic get type {\n    switch (typeType?.value) {\n      case 1: return KeywordsInTable.reader.vTableGetNullable(_bc, _bcOffset, 6);\n      case 2: return KeywordsInTable.reader.vTableGetNullable(_bc, _bcOffset, 6);\n      default: return null;\n    }\n  }\n\n  @override\n  String toString() {\n    return 'Table2{typeType: ${typeType}, type: ${type}}';\n  }\n\n  Table2T unpack() => Table2T(\n      typeType: typeType,\n      type: type?.unpack());\n\n  static int pack(fb.Builder fbBuilder, Table2T? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass Table2T implements fb.Packable {\n  KeywordsInUnionTypeId? typeType;\n  dynamic type;\n\n  Table2T({\n      this.typeType,\n      this.type});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    final int? typeOffset = type?.pack(fbBuilder);\n    fbBuilder.startTable(2);\n    fbBuilder.addUint8(0, typeType?.value);\n    fbBuilder.addOffset(1, typeOffset);\n    return fbBuilder.endTable();\n  }\n\n  @override\n  String toString() {\n    return 'Table2T{typeType: ${typeType}, type: ${type}}';\n  }\n}\n\nclass _Table2Reader extends fb.TableReader<Table2> {\n  const _Table2Reader();\n\n  @override\n  Table2 createObject(fb.BufferContext bc, int offset) => \n    Table2._(bc, offset);\n}\n\nclass Table2Builder {\n  Table2Builder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  void begin() {\n    fbBuilder.startTable(2);\n  }\n\n  int addTypeType(KeywordsInUnionTypeId? typeType) {\n    fbBuilder.addUint8(0, typeType?.value);\n    return fbBuilder.offset;\n  }\n  int addTypeOffset(int? offset) {\n    fbBuilder.addOffset(1, offset);\n    return fbBuilder.offset;\n  }\n\n  int finish() {\n    return fbBuilder.endTable();\n  }\n}\n\nclass Table2ObjectBuilder extends fb.ObjectBuilder {\n  final KeywordsInUnionTypeId? _typeType;\n  final dynamic _type;\n\n  Table2ObjectBuilder({\n    KeywordsInUnionTypeId? typeType,\n    dynamic type,\n  })\n      : _typeType = typeType,\n        _type = type;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    final int? typeOffset = _type?.getOrCreateOffset(fbBuilder);\n    fbBuilder.startTable(2);\n    fbBuilder.addUint8(0, _typeType?.value);\n    fbBuilder.addOffset(1, typeOffset);\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n"
  },
  {
    "path": "dart/test/monster_test.fbs",
    "content": "// test schema file\n\ninclude \"include_test1.fbs\";\n\nnamespace MyGame;\n\ntable InParentNamespace {}\n\nnamespace MyGame.Example2;\n\ntable Monster {}  // Test having same name as below, but in different namespace.\n\nnamespace MyGame.Example;\n\nattribute \"priority\";\n\n/// Composite components of Monster color.\nenum Color:ubyte (bit_flags) {\n  Red = 0, // color Red = (1u << 0)\n  /// \\brief color Green\n  /// Green is bit_flag with value (1u << 1)\n  Green,\n  /// \\brief color Blue (1u << 3)\n  Blue = 3,\n}\n\nenum Race:byte {\n  None = -1,\n  Human = 0,\n  Dwarf,\n  Elf,\n}\n\nenum LongEnum:ulong (bit_flags) {\n  LongOne = 1,\n  LongTwo = 2,\n  // Because this is a bitflag, 40 will be out of range of a 32-bit integer,\n  // allowing us to exercise any logic special to big numbers.\n  LongBig = 40,\n}\n\nunion Any { Monster, TestSimpleTableWithEnum, MyGame.Example2.Monster }\n\nunion AnyUniqueAliases { M: Monster, TS: TestSimpleTableWithEnum, M2: MyGame.Example2.Monster }\nunion AnyAmbiguousAliases { M1: Monster, M2: Monster, M3: Monster }\n\nstruct Test { a:short; b:byte; }\n\ntable TestSimpleTableWithEnum (csharp_partial, private) {\n  color: Color = Green;\n}\n\nstruct Vec3 (force_align: 8) {\n  x:float;\n  y:float;\n  z:float;\n  test1:double;\n  test2:Color;\n  test3:Test;\n}\n\nstruct Ability {\n  id:uint(key);\n  distance:uint;\n}\n\nstruct StructOfStructs {\n  a: Ability;\n  b: Test;\n  c: Ability;\n}\n\nstruct StructOfStructsOfStructs {\n a: StructOfStructs;\n}\n\ntable Stat {\n  id:string;\n  val:long;\n  count:ushort (key);\n}\n\ntable Referrable {\n  id:ulong(key, hash:\"fnv1a_64\");\n}\n\n/// an example documentation comment: \"monster object\"\ntable Monster {\n  pos:Vec3 (id: 0);\n  hp:short = 100 (id: 2);\n  mana:short = 150 (id: 1);\n  name:string (id: 3, key);\n  color:Color = Blue (id: 6);\n  inventory:[ubyte] (id: 5);\n  friendly:bool = false (deprecated, priority: 1, id: 4);\n  /// an example documentation comment: this will end up in the generated code\n  /// multiline too\n  testarrayoftables:[Monster] (id: 11);\n  testarrayofstring:[string] (id: 10);\n  testarrayofstring2:[string] (id: 28);\n  testarrayofbools:[bool] (id: 24);\n  testarrayofsortedstruct:[Ability] (id: 29);\n  enemy:MyGame.Example.Monster (id:12);  // Test referring by full namespace.\n  test:Any (id: 8);\n  test4:[Test] (id: 9);\n  test5:[Test] (id: 31);\n  testnestedflatbuffer:[ubyte] (id:13, nested_flatbuffer: \"Monster\");\n  testempty:Stat (id:14);\n  testbool:bool (id:15);\n  testhashs32_fnv1:int (id:16, hash:\"fnv1_32\");\n  testhashu32_fnv1:uint (id:17, hash:\"fnv1_32\");\n  testhashs64_fnv1:long (id:18, hash:\"fnv1_64\");\n  testhashu64_fnv1:ulong (id:19, hash:\"fnv1_64\");\n  testhashs32_fnv1a:int (id:20, hash:\"fnv1a_32\");\n  testhashu32_fnv1a:uint (id:21, hash:\"fnv1a_32\", cpp_type:\"Stat\");\n  testhashs64_fnv1a:long (id:22, hash:\"fnv1a_64\");\n  testhashu64_fnv1a:ulong (id:23, hash:\"fnv1a_64\");\n  testf:float = 3.14159 (id:25);\n  testf2:float = 3 (id:26);\n  testf3:float (id:27);\n  flex:[ubyte] (id:30, flexbuffer);\n  vector_of_longs:[long] (id:32);\n  vector_of_doubles:[double] (id:33);\n  parent_namespace_test:InParentNamespace (id:34);\n  vector_of_referrables:[Referrable](id:35);\n  single_weak_reference:ulong(id:36, hash:\"fnv1a_64\", cpp_type:\"ReferrableT\");\n  vector_of_weak_references:[ulong](id:37, hash:\"fnv1a_64\", cpp_type:\"ReferrableT\");\n  vector_of_strong_referrables:[Referrable](id:38, cpp_ptr_type:\"default_ptr_type\");                 //was shared_ptr\n  co_owning_reference:ulong(id:39, hash:\"fnv1a_64\", cpp_type:\"ReferrableT\", cpp_ptr_type:\"naked\");  //was shared_ptr as well\n  vector_of_co_owning_references:[ulong](id:40, hash:\"fnv1a_64\", cpp_type:\"ReferrableT\", cpp_ptr_type:\"default_ptr_type\", cpp_ptr_type_get:\".get()\");  //was shared_ptr\n  non_owning_reference:ulong(id:41, hash:\"fnv1a_64\", cpp_type:\"ReferrableT\", cpp_ptr_type:\"naked\", cpp_ptr_type_get:\"\");                              //was weak_ptr\n  vector_of_non_owning_references:[ulong](id:42, hash:\"fnv1a_64\", cpp_type:\"ReferrableT\", cpp_ptr_type:\"naked\", cpp_ptr_type_get:\"\");                 //was weak_ptr\n  any_unique:AnyUniqueAliases(id:44);\n  any_ambiguous:AnyAmbiguousAliases (id:46);\n  vector_of_enums:[Color] (id:47);\n  signed_enum:Race = None (id:48);\n  testrequirednestedflatbuffer:[ubyte] (id:49, nested_flatbuffer: \"Monster\");\n  scalar_key_sorted_tables:[Stat] (id: 50);\n  native_inline:Test (id: 51, native_inline);\n  // The default value of this enum will be a numeric zero, which isn't a valid\n  // enum value.\n  long_enum_non_enum_default:LongEnum (id: 52);\n  long_enum_normal_default:LongEnum = LongOne (id: 53);\n  // Test that default values nan and +/-inf work.\n  nan_default:float = nan (id: 54);\n  inf_default:float = inf (id: 55);\n  positive_inf_default:float = +inf (id: 56);\n  infinity_default:float = infinity (id: 57);\n  positive_infinity_default:float = +infinity (id: 58);\n  negative_inf_default:float = -inf (id: 59);\n  negative_infinity_default:float = -infinity (id: 60);\n  double_inf_default:double = inf (id: 61);\n}\n\ntable TypeAliases {\n    i8:int8;\n    u8:uint8;\n    i16:int16;\n    u16:uint16;\n    i32:int32;\n    u32:uint32;\n    i64:int64;\n    u64:uint64;\n    f32:float32;\n    f64:float64;\n    v8:[int8];\n    vf64:[float64];\n}\n\nrpc_service MonsterStorage {\n  Store(Monster):Stat (streaming: \"none\");\n  Retrieve(Stat):Monster (streaming: \"server\", idempotent);\n  GetMaxHitPoint(Monster):Stat (streaming: \"client\");\n  GetMinMaxHitPoints(Monster):Stat (streaming: \"bidi\");\n}\n\nroot_type Monster;\n\nfile_identifier \"MONS\";\nfile_extension \"mon\";\n"
  },
  {
    "path": "dart/test/monster_test_my_game.example2_generated.dart",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable, constant_identifier_names\n\nlibrary my_game.example2;\n\nimport 'dart:typed_data' show Uint8List;\n\nimport 'package:flat_buffers/flat_buffers.dart' as fb;\n\nimport './include_test1_generated.dart';\nimport './monster_test_my_game.example_generated.dart' as my_game_example;\nimport './monster_test_my_game_generated.dart' as my_game;\n\nclass Monster {\n  Monster._(this._bc, this._bcOffset);\n  factory Monster(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<Monster> reader = _MonsterReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  @override\n  String toString() {\n    return 'Monster{}';\n  }\n\n  MonsterT unpack() => MonsterT();\n\n  static int pack(fb.Builder fbBuilder, MonsterT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass MonsterT implements fb.Packable {\n  @override\n  int pack(fb.Builder fbBuilder) {\n    fbBuilder.startTable(0);\n    return fbBuilder.endTable();\n  }\n\n  @override\n  String toString() {\n    return 'MonsterT{}';\n  }\n}\n\nclass _MonsterReader extends fb.TableReader<Monster> {\n  const _MonsterReader();\n\n  @override\n  Monster createObject(fb.BufferContext bc, int offset) =>\n      Monster._(bc, offset);\n}\n\nclass MonsterObjectBuilder extends fb.ObjectBuilder {\n  MonsterObjectBuilder();\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    fbBuilder.startTable(0);\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n"
  },
  {
    "path": "dart/test/monster_test_my_game.example_generated.dart",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable, constant_identifier_names\n\nlibrary my_game.example;\n\nimport 'dart:typed_data' show Uint8List;\n\nimport 'package:flat_buffers/flat_buffers.dart' as fb;\n\nimport './include_test1_generated.dart';\nimport './monster_test_my_game.example2_generated.dart' as my_game_example2;\nimport './monster_test_my_game_generated.dart' as my_game;\n\n///  Composite components of Monster color.\nenum Color {\n  Red(1),\n  Green(2),\n  Blue(8),\n  _default(0);\n\n  final int value;\n  const Color(this.value);\n\n  factory Color.fromValue(int value) {\n    switch (value) {\n      case 1:\n        return Color.Red;\n      case 2:\n        return Color.Green;\n      case 8:\n        return Color.Blue;\n      case 0:\n        return Color._default;\n      default:\n        throw StateError('Invalid value $value for bit flag enum');\n    }\n  }\n\n  static Color? _createOrNull(int? value) =>\n      value == null ? null : Color.fromValue(value);\n\n  static const fb.Reader<Color> reader = _ColorReader();\n}\n\nclass _ColorReader extends fb.Reader<Color> {\n  const _ColorReader();\n\n  @override\n  int get size => 1;\n\n  @override\n  Color read(fb.BufferContext bc, int offset) =>\n      Color.fromValue(const fb.Uint8Reader().read(bc, offset));\n}\n\nenum Race {\n  None(-1),\n  Human(0),\n  Dwarf(1),\n  Elf(2);\n\n  final int value;\n  const Race(this.value);\n\n  factory Race.fromValue(int value) {\n    switch (value) {\n      case -1:\n        return Race.None;\n      case 0:\n        return Race.Human;\n      case 1:\n        return Race.Dwarf;\n      case 2:\n        return Race.Elf;\n      default:\n        throw StateError('Invalid value $value for bit flag enum');\n    }\n  }\n\n  static Race? _createOrNull(int? value) =>\n      value == null ? null : Race.fromValue(value);\n\n  static const int minValue = -1;\n  static const int maxValue = 2;\n  static const fb.Reader<Race> reader = _RaceReader();\n}\n\nclass _RaceReader extends fb.Reader<Race> {\n  const _RaceReader();\n\n  @override\n  int get size => 1;\n\n  @override\n  Race read(fb.BufferContext bc, int offset) =>\n      Race.fromValue(const fb.Int8Reader().read(bc, offset));\n}\n\nenum LongEnum {\n  LongOne(2),\n  LongTwo(4),\n  LongBig(1099511627776),\n  _default(0);\n\n  final int value;\n  const LongEnum(this.value);\n\n  factory LongEnum.fromValue(int value) {\n    switch (value) {\n      case 2:\n        return LongEnum.LongOne;\n      case 4:\n        return LongEnum.LongTwo;\n      case 1099511627776:\n        return LongEnum.LongBig;\n      case 0:\n        return LongEnum._default;\n      default:\n        throw StateError('Invalid value $value for bit flag enum');\n    }\n  }\n\n  static LongEnum? _createOrNull(int? value) =>\n      value == null ? null : LongEnum.fromValue(value);\n\n  static const fb.Reader<LongEnum> reader = _LongEnumReader();\n}\n\nclass _LongEnumReader extends fb.Reader<LongEnum> {\n  const _LongEnumReader();\n\n  @override\n  int get size => 8;\n\n  @override\n  LongEnum read(fb.BufferContext bc, int offset) =>\n      LongEnum.fromValue(const fb.Uint64Reader().read(bc, offset));\n}\n\nenum AnyTypeId {\n  NONE(0),\n  Monster(1),\n  TestSimpleTableWithEnum(2),\n  MyGame_Example2_Monster(3);\n\n  final int value;\n  const AnyTypeId(this.value);\n\n  factory AnyTypeId.fromValue(int value) {\n    switch (value) {\n      case 0:\n        return AnyTypeId.NONE;\n      case 1:\n        return AnyTypeId.Monster;\n      case 2:\n        return AnyTypeId.TestSimpleTableWithEnum;\n      case 3:\n        return AnyTypeId.MyGame_Example2_Monster;\n      default:\n        throw StateError('Invalid value $value for bit flag enum');\n    }\n  }\n\n  static AnyTypeId? _createOrNull(int? value) =>\n      value == null ? null : AnyTypeId.fromValue(value);\n\n  static const int minValue = 0;\n  static const int maxValue = 3;\n  static const fb.Reader<AnyTypeId> reader = _AnyTypeIdReader();\n}\n\nclass _AnyTypeIdReader extends fb.Reader<AnyTypeId> {\n  const _AnyTypeIdReader();\n\n  @override\n  int get size => 1;\n\n  @override\n  AnyTypeId read(fb.BufferContext bc, int offset) =>\n      AnyTypeId.fromValue(const fb.Uint8Reader().read(bc, offset));\n}\n\nenum AnyUniqueAliasesTypeId {\n  NONE(0),\n  M(1),\n  TS(2),\n  M2(3);\n\n  final int value;\n  const AnyUniqueAliasesTypeId(this.value);\n\n  factory AnyUniqueAliasesTypeId.fromValue(int value) {\n    switch (value) {\n      case 0:\n        return AnyUniqueAliasesTypeId.NONE;\n      case 1:\n        return AnyUniqueAliasesTypeId.M;\n      case 2:\n        return AnyUniqueAliasesTypeId.TS;\n      case 3:\n        return AnyUniqueAliasesTypeId.M2;\n      default:\n        throw StateError('Invalid value $value for bit flag enum');\n    }\n  }\n\n  static AnyUniqueAliasesTypeId? _createOrNull(int? value) =>\n      value == null ? null : AnyUniqueAliasesTypeId.fromValue(value);\n\n  static const int minValue = 0;\n  static const int maxValue = 3;\n  static const fb.Reader<AnyUniqueAliasesTypeId> reader =\n      _AnyUniqueAliasesTypeIdReader();\n}\n\nclass _AnyUniqueAliasesTypeIdReader extends fb.Reader<AnyUniqueAliasesTypeId> {\n  const _AnyUniqueAliasesTypeIdReader();\n\n  @override\n  int get size => 1;\n\n  @override\n  AnyUniqueAliasesTypeId read(fb.BufferContext bc, int offset) =>\n      AnyUniqueAliasesTypeId.fromValue(const fb.Uint8Reader().read(bc, offset));\n}\n\nenum AnyAmbiguousAliasesTypeId {\n  NONE(0),\n  M1(1),\n  M2(2),\n  M3(3);\n\n  final int value;\n  const AnyAmbiguousAliasesTypeId(this.value);\n\n  factory AnyAmbiguousAliasesTypeId.fromValue(int value) {\n    switch (value) {\n      case 0:\n        return AnyAmbiguousAliasesTypeId.NONE;\n      case 1:\n        return AnyAmbiguousAliasesTypeId.M1;\n      case 2:\n        return AnyAmbiguousAliasesTypeId.M2;\n      case 3:\n        return AnyAmbiguousAliasesTypeId.M3;\n      default:\n        throw StateError('Invalid value $value for bit flag enum');\n    }\n  }\n\n  static AnyAmbiguousAliasesTypeId? _createOrNull(int? value) =>\n      value == null ? null : AnyAmbiguousAliasesTypeId.fromValue(value);\n\n  static const int minValue = 0;\n  static const int maxValue = 3;\n  static const fb.Reader<AnyAmbiguousAliasesTypeId> reader =\n      _AnyAmbiguousAliasesTypeIdReader();\n}\n\nclass _AnyAmbiguousAliasesTypeIdReader\n    extends fb.Reader<AnyAmbiguousAliasesTypeId> {\n  const _AnyAmbiguousAliasesTypeIdReader();\n\n  @override\n  int get size => 1;\n\n  @override\n  AnyAmbiguousAliasesTypeId read(fb.BufferContext bc, int offset) =>\n      AnyAmbiguousAliasesTypeId.fromValue(\n        const fb.Uint8Reader().read(bc, offset),\n      );\n}\n\nclass Test {\n  Test._(this._bc, this._bcOffset);\n\n  static const fb.Reader<Test> reader = _TestReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  int get a => const fb.Int16Reader().read(_bc, _bcOffset + 0);\n  int get b => const fb.Int8Reader().read(_bc, _bcOffset + 2);\n\n  @override\n  String toString() {\n    return 'Test{a: ${a}, b: ${b}}';\n  }\n\n  TestT unpack() => TestT(a: a, b: b);\n\n  static int pack(fb.Builder fbBuilder, TestT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass TestT implements fb.Packable {\n  int a;\n  int b;\n\n  TestT({required this.a, required this.b});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    fbBuilder.pad(1);\n    fbBuilder.putInt8(b);\n    fbBuilder.putInt16(a);\n    return fbBuilder.offset;\n  }\n\n  @override\n  String toString() {\n    return 'TestT{a: ${a}, b: ${b}}';\n  }\n}\n\nclass _TestReader extends fb.StructReader<Test> {\n  const _TestReader();\n\n  @override\n  int get size => 4;\n\n  @override\n  Test createObject(fb.BufferContext bc, int offset) => Test._(bc, offset);\n}\n\nclass TestBuilder {\n  TestBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  int finish(int a, int b) {\n    fbBuilder.pad(1);\n    fbBuilder.putInt8(b);\n    fbBuilder.putInt16(a);\n    return fbBuilder.offset;\n  }\n}\n\nclass TestObjectBuilder extends fb.ObjectBuilder {\n  final int _a;\n  final int _b;\n\n  TestObjectBuilder({required int a, required int b}) : _a = a, _b = b;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    fbBuilder.pad(1);\n    fbBuilder.putInt8(_b);\n    fbBuilder.putInt16(_a);\n    return fbBuilder.offset;\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n\nclass TestSimpleTableWithEnum {\n  TestSimpleTableWithEnum._(this._bc, this._bcOffset);\n  factory TestSimpleTableWithEnum(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<TestSimpleTableWithEnum> reader =\n      _TestSimpleTableWithEnumReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  Color get color =>\n      Color.fromValue(const fb.Uint8Reader().vTableGet(_bc, _bcOffset, 4, 2));\n\n  @override\n  String toString() {\n    return 'TestSimpleTableWithEnum{color: ${color}}';\n  }\n\n  TestSimpleTableWithEnumT unpack() => TestSimpleTableWithEnumT(color: color);\n\n  static int pack(fb.Builder fbBuilder, TestSimpleTableWithEnumT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass TestSimpleTableWithEnumT implements fb.Packable {\n  Color color;\n\n  TestSimpleTableWithEnumT({this.color = Color.Green});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    fbBuilder.startTable(1);\n    fbBuilder.addUint8(0, color.value);\n    return fbBuilder.endTable();\n  }\n\n  @override\n  String toString() {\n    return 'TestSimpleTableWithEnumT{color: ${color}}';\n  }\n}\n\nclass _TestSimpleTableWithEnumReader\n    extends fb.TableReader<TestSimpleTableWithEnum> {\n  const _TestSimpleTableWithEnumReader();\n\n  @override\n  TestSimpleTableWithEnum createObject(fb.BufferContext bc, int offset) =>\n      TestSimpleTableWithEnum._(bc, offset);\n}\n\nclass TestSimpleTableWithEnumBuilder {\n  TestSimpleTableWithEnumBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  void begin() {\n    fbBuilder.startTable(1);\n  }\n\n  int addColor(Color? color) {\n    fbBuilder.addUint8(0, color?.value);\n    return fbBuilder.offset;\n  }\n\n  int finish() {\n    return fbBuilder.endTable();\n  }\n}\n\nclass TestSimpleTableWithEnumObjectBuilder extends fb.ObjectBuilder {\n  final Color? _color;\n\n  TestSimpleTableWithEnumObjectBuilder({Color? color}) : _color = color;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    fbBuilder.startTable(1);\n    fbBuilder.addUint8(0, _color?.value);\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n\nclass Vec3 {\n  Vec3._(this._bc, this._bcOffset);\n\n  static const fb.Reader<Vec3> reader = _Vec3Reader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  double get x => const fb.Float32Reader().read(_bc, _bcOffset + 0);\n  double get y => const fb.Float32Reader().read(_bc, _bcOffset + 4);\n  double get z => const fb.Float32Reader().read(_bc, _bcOffset + 8);\n  double get test1 => const fb.Float64Reader().read(_bc, _bcOffset + 16);\n  Color get test2 =>\n      Color.fromValue(const fb.Uint8Reader().read(_bc, _bcOffset + 24));\n  Test get test3 => Test.reader.read(_bc, _bcOffset + 26);\n\n  @override\n  String toString() {\n    return 'Vec3{x: ${x}, y: ${y}, z: ${z}, test1: ${test1}, test2: ${test2}, test3: ${test3}}';\n  }\n\n  Vec3T unpack() => Vec3T(\n    x: x,\n    y: y,\n    z: z,\n    test1: test1,\n    test2: test2,\n    test3: test3.unpack(),\n  );\n\n  static int pack(fb.Builder fbBuilder, Vec3T? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass Vec3T implements fb.Packable {\n  double x;\n  double y;\n  double z;\n  double test1;\n  Color test2;\n  TestT test3;\n\n  Vec3T({\n    required this.x,\n    required this.y,\n    required this.z,\n    required this.test1,\n    required this.test2,\n    required this.test3,\n  });\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    fbBuilder.pad(2);\n    test3.pack(fbBuilder);\n    fbBuilder.pad(1);\n    fbBuilder.putUint8(test2.value);\n    fbBuilder.putFloat64(test1);\n    fbBuilder.pad(4);\n    fbBuilder.putFloat32(z);\n    fbBuilder.putFloat32(y);\n    fbBuilder.putFloat32(x);\n    return fbBuilder.offset;\n  }\n\n  @override\n  String toString() {\n    return 'Vec3T{x: ${x}, y: ${y}, z: ${z}, test1: ${test1}, test2: ${test2}, test3: ${test3}}';\n  }\n}\n\nclass _Vec3Reader extends fb.StructReader<Vec3> {\n  const _Vec3Reader();\n\n  @override\n  int get size => 32;\n\n  @override\n  Vec3 createObject(fb.BufferContext bc, int offset) => Vec3._(bc, offset);\n}\n\nclass Vec3Builder {\n  Vec3Builder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  int finish(\n    double x,\n    double y,\n    double z,\n    double test1,\n    Color test2,\n    fb.StructBuilder test3,\n  ) {\n    fbBuilder.pad(2);\n    test3();\n    fbBuilder.pad(1);\n    fbBuilder.putUint8(test2.value);\n    fbBuilder.putFloat64(test1);\n    fbBuilder.pad(4);\n    fbBuilder.putFloat32(z);\n    fbBuilder.putFloat32(y);\n    fbBuilder.putFloat32(x);\n    return fbBuilder.offset;\n  }\n}\n\nclass Vec3ObjectBuilder extends fb.ObjectBuilder {\n  final double _x;\n  final double _y;\n  final double _z;\n  final double _test1;\n  final Color _test2;\n  final TestObjectBuilder _test3;\n\n  Vec3ObjectBuilder({\n    required double x,\n    required double y,\n    required double z,\n    required double test1,\n    required Color test2,\n    required TestObjectBuilder test3,\n  }) : _x = x,\n       _y = y,\n       _z = z,\n       _test1 = test1,\n       _test2 = test2,\n       _test3 = test3;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    fbBuilder.pad(2);\n    _test3.finish(fbBuilder);\n    fbBuilder.pad(1);\n    fbBuilder.putUint8(_test2.value);\n    fbBuilder.putFloat64(_test1);\n    fbBuilder.pad(4);\n    fbBuilder.putFloat32(_z);\n    fbBuilder.putFloat32(_y);\n    fbBuilder.putFloat32(_x);\n    return fbBuilder.offset;\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n\nclass Ability {\n  Ability._(this._bc, this._bcOffset);\n\n  static const fb.Reader<Ability> reader = _AbilityReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  int get id => const fb.Uint32Reader().read(_bc, _bcOffset + 0);\n  int get distance => const fb.Uint32Reader().read(_bc, _bcOffset + 4);\n\n  @override\n  String toString() {\n    return 'Ability{id: ${id}, distance: ${distance}}';\n  }\n\n  AbilityT unpack() => AbilityT(id: id, distance: distance);\n\n  static int pack(fb.Builder fbBuilder, AbilityT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass AbilityT implements fb.Packable {\n  int id;\n  int distance;\n\n  AbilityT({required this.id, required this.distance});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    fbBuilder.putUint32(distance);\n    fbBuilder.putUint32(id);\n    return fbBuilder.offset;\n  }\n\n  @override\n  String toString() {\n    return 'AbilityT{id: ${id}, distance: ${distance}}';\n  }\n}\n\nclass _AbilityReader extends fb.StructReader<Ability> {\n  const _AbilityReader();\n\n  @override\n  int get size => 8;\n\n  @override\n  Ability createObject(fb.BufferContext bc, int offset) =>\n      Ability._(bc, offset);\n}\n\nclass AbilityBuilder {\n  AbilityBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  int finish(int id, int distance) {\n    fbBuilder.putUint32(distance);\n    fbBuilder.putUint32(id);\n    return fbBuilder.offset;\n  }\n}\n\nclass AbilityObjectBuilder extends fb.ObjectBuilder {\n  final int _id;\n  final int _distance;\n\n  AbilityObjectBuilder({required int id, required int distance})\n    : _id = id,\n      _distance = distance;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    fbBuilder.putUint32(_distance);\n    fbBuilder.putUint32(_id);\n    return fbBuilder.offset;\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n\nclass StructOfStructs {\n  StructOfStructs._(this._bc, this._bcOffset);\n\n  static const fb.Reader<StructOfStructs> reader = _StructOfStructsReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  Ability get a => Ability.reader.read(_bc, _bcOffset + 0);\n  Test get b => Test.reader.read(_bc, _bcOffset + 8);\n  Ability get c => Ability.reader.read(_bc, _bcOffset + 12);\n\n  @override\n  String toString() {\n    return 'StructOfStructs{a: ${a}, b: ${b}, c: ${c}}';\n  }\n\n  StructOfStructsT unpack() =>\n      StructOfStructsT(a: a.unpack(), b: b.unpack(), c: c.unpack());\n\n  static int pack(fb.Builder fbBuilder, StructOfStructsT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass StructOfStructsT implements fb.Packable {\n  AbilityT a;\n  TestT b;\n  AbilityT c;\n\n  StructOfStructsT({required this.a, required this.b, required this.c});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    c.pack(fbBuilder);\n    b.pack(fbBuilder);\n    a.pack(fbBuilder);\n    return fbBuilder.offset;\n  }\n\n  @override\n  String toString() {\n    return 'StructOfStructsT{a: ${a}, b: ${b}, c: ${c}}';\n  }\n}\n\nclass _StructOfStructsReader extends fb.StructReader<StructOfStructs> {\n  const _StructOfStructsReader();\n\n  @override\n  int get size => 20;\n\n  @override\n  StructOfStructs createObject(fb.BufferContext bc, int offset) =>\n      StructOfStructs._(bc, offset);\n}\n\nclass StructOfStructsBuilder {\n  StructOfStructsBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  int finish(fb.StructBuilder a, fb.StructBuilder b, fb.StructBuilder c) {\n    c();\n    b();\n    a();\n    return fbBuilder.offset;\n  }\n}\n\nclass StructOfStructsObjectBuilder extends fb.ObjectBuilder {\n  final AbilityObjectBuilder _a;\n  final TestObjectBuilder _b;\n  final AbilityObjectBuilder _c;\n\n  StructOfStructsObjectBuilder({\n    required AbilityObjectBuilder a,\n    required TestObjectBuilder b,\n    required AbilityObjectBuilder c,\n  }) : _a = a,\n       _b = b,\n       _c = c;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    _c.finish(fbBuilder);\n    _b.finish(fbBuilder);\n    _a.finish(fbBuilder);\n    return fbBuilder.offset;\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n\nclass StructOfStructsOfStructs {\n  StructOfStructsOfStructs._(this._bc, this._bcOffset);\n\n  static const fb.Reader<StructOfStructsOfStructs> reader =\n      _StructOfStructsOfStructsReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  StructOfStructs get a => StructOfStructs.reader.read(_bc, _bcOffset + 0);\n\n  @override\n  String toString() {\n    return 'StructOfStructsOfStructs{a: ${a}}';\n  }\n\n  StructOfStructsOfStructsT unpack() =>\n      StructOfStructsOfStructsT(a: a.unpack());\n\n  static int pack(fb.Builder fbBuilder, StructOfStructsOfStructsT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass StructOfStructsOfStructsT implements fb.Packable {\n  StructOfStructsT a;\n\n  StructOfStructsOfStructsT({required this.a});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    a.pack(fbBuilder);\n    return fbBuilder.offset;\n  }\n\n  @override\n  String toString() {\n    return 'StructOfStructsOfStructsT{a: ${a}}';\n  }\n}\n\nclass _StructOfStructsOfStructsReader\n    extends fb.StructReader<StructOfStructsOfStructs> {\n  const _StructOfStructsOfStructsReader();\n\n  @override\n  int get size => 20;\n\n  @override\n  StructOfStructsOfStructs createObject(fb.BufferContext bc, int offset) =>\n      StructOfStructsOfStructs._(bc, offset);\n}\n\nclass StructOfStructsOfStructsBuilder {\n  StructOfStructsOfStructsBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  int finish(fb.StructBuilder a) {\n    a();\n    return fbBuilder.offset;\n  }\n}\n\nclass StructOfStructsOfStructsObjectBuilder extends fb.ObjectBuilder {\n  final StructOfStructsObjectBuilder _a;\n\n  StructOfStructsOfStructsObjectBuilder({\n    required StructOfStructsObjectBuilder a,\n  }) : _a = a;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    _a.finish(fbBuilder);\n    return fbBuilder.offset;\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n\nclass Stat {\n  Stat._(this._bc, this._bcOffset);\n  factory Stat(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<Stat> reader = _StatReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  String? get id =>\n      const fb.StringReader().vTableGetNullable(_bc, _bcOffset, 4);\n  int get val => const fb.Int64Reader().vTableGet(_bc, _bcOffset, 6, 0);\n  int get count => const fb.Uint16Reader().vTableGet(_bc, _bcOffset, 8, 0);\n\n  @override\n  String toString() {\n    return 'Stat{id: ${id}, val: ${val}, count: ${count}}';\n  }\n\n  StatT unpack() => StatT(id: id, val: val, count: count);\n\n  static int pack(fb.Builder fbBuilder, StatT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass StatT implements fb.Packable {\n  String? id;\n  int val;\n  int count;\n\n  StatT({this.id, this.val = 0, this.count = 0});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    final int? idOffset = id == null ? null : fbBuilder.writeString(id!);\n    fbBuilder.startTable(3);\n    fbBuilder.addOffset(0, idOffset);\n    fbBuilder.addInt64(1, val);\n    fbBuilder.addUint16(2, count);\n    return fbBuilder.endTable();\n  }\n\n  @override\n  String toString() {\n    return 'StatT{id: ${id}, val: ${val}, count: ${count}}';\n  }\n}\n\nclass _StatReader extends fb.TableReader<Stat> {\n  const _StatReader();\n\n  @override\n  Stat createObject(fb.BufferContext bc, int offset) => Stat._(bc, offset);\n}\n\nclass StatBuilder {\n  StatBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  void begin() {\n    fbBuilder.startTable(3);\n  }\n\n  int addIdOffset(int? offset) {\n    fbBuilder.addOffset(0, offset);\n    return fbBuilder.offset;\n  }\n\n  int addVal(int? val) {\n    fbBuilder.addInt64(1, val);\n    return fbBuilder.offset;\n  }\n\n  int addCount(int? count) {\n    fbBuilder.addUint16(2, count);\n    return fbBuilder.offset;\n  }\n\n  int finish() {\n    return fbBuilder.endTable();\n  }\n}\n\nclass StatObjectBuilder extends fb.ObjectBuilder {\n  final String? _id;\n  final int? _val;\n  final int? _count;\n\n  StatObjectBuilder({String? id, int? val, int? count})\n    : _id = id,\n      _val = val,\n      _count = count;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    final int? idOffset = _id == null ? null : fbBuilder.writeString(_id!);\n    fbBuilder.startTable(3);\n    fbBuilder.addOffset(0, idOffset);\n    fbBuilder.addInt64(1, _val);\n    fbBuilder.addUint16(2, _count);\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n\nclass Referrable {\n  Referrable._(this._bc, this._bcOffset);\n  factory Referrable(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<Referrable> reader = _ReferrableReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  int get id => const fb.Uint64Reader().vTableGet(_bc, _bcOffset, 4, 0);\n\n  @override\n  String toString() {\n    return 'Referrable{id: ${id}}';\n  }\n\n  ReferrableT unpack() => ReferrableT(id: id);\n\n  static int pack(fb.Builder fbBuilder, ReferrableT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass ReferrableT implements fb.Packable {\n  int id;\n\n  ReferrableT({this.id = 0});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    fbBuilder.startTable(1);\n    fbBuilder.addUint64(0, id);\n    return fbBuilder.endTable();\n  }\n\n  @override\n  String toString() {\n    return 'ReferrableT{id: ${id}}';\n  }\n}\n\nclass _ReferrableReader extends fb.TableReader<Referrable> {\n  const _ReferrableReader();\n\n  @override\n  Referrable createObject(fb.BufferContext bc, int offset) =>\n      Referrable._(bc, offset);\n}\n\nclass ReferrableBuilder {\n  ReferrableBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  void begin() {\n    fbBuilder.startTable(1);\n  }\n\n  int addId(int? id) {\n    fbBuilder.addUint64(0, id);\n    return fbBuilder.offset;\n  }\n\n  int finish() {\n    return fbBuilder.endTable();\n  }\n}\n\nclass ReferrableObjectBuilder extends fb.ObjectBuilder {\n  final int? _id;\n\n  ReferrableObjectBuilder({int? id}) : _id = id;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    fbBuilder.startTable(1);\n    fbBuilder.addUint64(0, _id);\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n\n///  an example documentation comment: \"monster object\"\nclass Monster {\n  Monster._(this._bc, this._bcOffset);\n  factory Monster(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<Monster> reader = _MonsterReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  Vec3? get pos => Vec3.reader.vTableGetNullable(_bc, _bcOffset, 4);\n  int get mana => const fb.Int16Reader().vTableGet(_bc, _bcOffset, 6, 150);\n  int get hp => const fb.Int16Reader().vTableGet(_bc, _bcOffset, 8, 100);\n  String? get name =>\n      const fb.StringReader().vTableGetNullable(_bc, _bcOffset, 10);\n  List<int>? get inventory =>\n      const fb.Uint8ListReader().vTableGetNullable(_bc, _bcOffset, 14);\n  Color get color =>\n      Color.fromValue(const fb.Uint8Reader().vTableGet(_bc, _bcOffset, 16, 8));\n  AnyTypeId? get testType => AnyTypeId._createOrNull(\n    const fb.Uint8Reader().vTableGetNullable(_bc, _bcOffset, 18),\n  );\n  dynamic get test {\n    switch (testType?.value) {\n      case 1:\n        return Monster.reader.vTableGetNullable(_bc, _bcOffset, 20);\n      case 2:\n        return TestSimpleTableWithEnum.reader.vTableGetNullable(\n          _bc,\n          _bcOffset,\n          20,\n        );\n      case 3:\n        return my_game_example2.Monster.reader.vTableGetNullable(\n          _bc,\n          _bcOffset,\n          20,\n        );\n      default:\n        return null;\n    }\n  }\n\n  List<Test>? get test4 => const fb.ListReader<Test>(\n    Test.reader,\n  ).vTableGetNullable(_bc, _bcOffset, 22);\n  List<String>? get testarrayofstring => const fb.ListReader<String>(\n    fb.StringReader(),\n  ).vTableGetNullable(_bc, _bcOffset, 24);\n\n  ///  an example documentation comment: this will end up in the generated code\n  ///  multiline too\n  List<Monster>? get testarrayoftables => const fb.ListReader<Monster>(\n    Monster.reader,\n  ).vTableGetNullable(_bc, _bcOffset, 26);\n  Monster? get enemy => Monster.reader.vTableGetNullable(_bc, _bcOffset, 28);\n  List<int>? get testnestedflatbuffer =>\n      const fb.Uint8ListReader().vTableGetNullable(_bc, _bcOffset, 30);\n  Stat? get testempty => Stat.reader.vTableGetNullable(_bc, _bcOffset, 32);\n  bool get testbool =>\n      const fb.BoolReader().vTableGet(_bc, _bcOffset, 34, false);\n  int get testhashs32Fnv1 =>\n      const fb.Int32Reader().vTableGet(_bc, _bcOffset, 36, 0);\n  int get testhashu32Fnv1 =>\n      const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 38, 0);\n  int get testhashs64Fnv1 =>\n      const fb.Int64Reader().vTableGet(_bc, _bcOffset, 40, 0);\n  int get testhashu64Fnv1 =>\n      const fb.Uint64Reader().vTableGet(_bc, _bcOffset, 42, 0);\n  int get testhashs32Fnv1a =>\n      const fb.Int32Reader().vTableGet(_bc, _bcOffset, 44, 0);\n  int get testhashu32Fnv1a =>\n      const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 46, 0);\n  int get testhashs64Fnv1a =>\n      const fb.Int64Reader().vTableGet(_bc, _bcOffset, 48, 0);\n  int get testhashu64Fnv1a =>\n      const fb.Uint64Reader().vTableGet(_bc, _bcOffset, 50, 0);\n  List<bool>? get testarrayofbools => const fb.ListReader<bool>(\n    fb.BoolReader(),\n  ).vTableGetNullable(_bc, _bcOffset, 52);\n  double get testf =>\n      const fb.Float32Reader().vTableGet(_bc, _bcOffset, 54, 3.14159);\n  double get testf2 =>\n      const fb.Float32Reader().vTableGet(_bc, _bcOffset, 56, 3.0);\n  double get testf3 =>\n      const fb.Float32Reader().vTableGet(_bc, _bcOffset, 58, 0.0);\n  List<String>? get testarrayofstring2 => const fb.ListReader<String>(\n    fb.StringReader(),\n  ).vTableGetNullable(_bc, _bcOffset, 60);\n  List<Ability>? get testarrayofsortedstruct => const fb.ListReader<Ability>(\n    Ability.reader,\n  ).vTableGetNullable(_bc, _bcOffset, 62);\n  List<int>? get flex =>\n      const fb.Uint8ListReader().vTableGetNullable(_bc, _bcOffset, 64);\n  List<Test>? get test5 => const fb.ListReader<Test>(\n    Test.reader,\n  ).vTableGetNullable(_bc, _bcOffset, 66);\n  List<int>? get vectorOfLongs => const fb.ListReader<int>(\n    fb.Int64Reader(),\n  ).vTableGetNullable(_bc, _bcOffset, 68);\n  List<double>? get vectorOfDoubles => const fb.ListReader<double>(\n    fb.Float64Reader(),\n  ).vTableGetNullable(_bc, _bcOffset, 70);\n  my_game.InParentNamespace? get parentNamespaceTest =>\n      my_game.InParentNamespace.reader.vTableGetNullable(_bc, _bcOffset, 72);\n  List<Referrable>? get vectorOfReferrables => const fb.ListReader<Referrable>(\n    Referrable.reader,\n  ).vTableGetNullable(_bc, _bcOffset, 74);\n  int get singleWeakReference =>\n      const fb.Uint64Reader().vTableGet(_bc, _bcOffset, 76, 0);\n  List<int>? get vectorOfWeakReferences => const fb.ListReader<int>(\n    fb.Uint64Reader(),\n  ).vTableGetNullable(_bc, _bcOffset, 78);\n  List<Referrable>? get vectorOfStrongReferrables =>\n      const fb.ListReader<Referrable>(\n        Referrable.reader,\n      ).vTableGetNullable(_bc, _bcOffset, 80);\n  int get coOwningReference =>\n      const fb.Uint64Reader().vTableGet(_bc, _bcOffset, 82, 0);\n  List<int>? get vectorOfCoOwningReferences => const fb.ListReader<int>(\n    fb.Uint64Reader(),\n  ).vTableGetNullable(_bc, _bcOffset, 84);\n  int get nonOwningReference =>\n      const fb.Uint64Reader().vTableGet(_bc, _bcOffset, 86, 0);\n  List<int>? get vectorOfNonOwningReferences => const fb.ListReader<int>(\n    fb.Uint64Reader(),\n  ).vTableGetNullable(_bc, _bcOffset, 88);\n  AnyUniqueAliasesTypeId? get anyUniqueType =>\n      AnyUniqueAliasesTypeId._createOrNull(\n        const fb.Uint8Reader().vTableGetNullable(_bc, _bcOffset, 90),\n      );\n  dynamic get anyUnique {\n    switch (anyUniqueType?.value) {\n      case 1:\n        return Monster.reader.vTableGetNullable(_bc, _bcOffset, 92);\n      case 2:\n        return TestSimpleTableWithEnum.reader.vTableGetNullable(\n          _bc,\n          _bcOffset,\n          92,\n        );\n      case 3:\n        return my_game_example2.Monster.reader.vTableGetNullable(\n          _bc,\n          _bcOffset,\n          92,\n        );\n      default:\n        return null;\n    }\n  }\n\n  AnyAmbiguousAliasesTypeId? get anyAmbiguousType =>\n      AnyAmbiguousAliasesTypeId._createOrNull(\n        const fb.Uint8Reader().vTableGetNullable(_bc, _bcOffset, 94),\n      );\n  dynamic get anyAmbiguous {\n    switch (anyAmbiguousType?.value) {\n      case 1:\n        return Monster.reader.vTableGetNullable(_bc, _bcOffset, 96);\n      case 2:\n        return Monster.reader.vTableGetNullable(_bc, _bcOffset, 96);\n      case 3:\n        return Monster.reader.vTableGetNullable(_bc, _bcOffset, 96);\n      default:\n        return null;\n    }\n  }\n\n  List<Color>? get vectorOfEnums => const fb.ListReader<Color>(\n    Color.reader,\n  ).vTableGetNullable(_bc, _bcOffset, 98);\n  Race get signedEnum =>\n      Race.fromValue(const fb.Int8Reader().vTableGet(_bc, _bcOffset, 100, -1));\n  List<int>? get testrequirednestedflatbuffer =>\n      const fb.Uint8ListReader().vTableGetNullable(_bc, _bcOffset, 102);\n  List<Stat>? get scalarKeySortedTables => const fb.ListReader<Stat>(\n    Stat.reader,\n  ).vTableGetNullable(_bc, _bcOffset, 104);\n  Test? get nativeInline => Test.reader.vTableGetNullable(_bc, _bcOffset, 106);\n  LongEnum get longEnumNonEnumDefault => LongEnum.fromValue(\n    const fb.Uint64Reader().vTableGet(_bc, _bcOffset, 108, 0),\n  );\n  LongEnum get longEnumNormalDefault => LongEnum.fromValue(\n    const fb.Uint64Reader().vTableGet(_bc, _bcOffset, 110, 2),\n  );\n  double get nanDefault =>\n      const fb.Float32Reader().vTableGet(_bc, _bcOffset, 112, double.nan);\n  double get infDefault =>\n      const fb.Float32Reader().vTableGet(_bc, _bcOffset, 114, double.infinity);\n  double get positiveInfDefault =>\n      const fb.Float32Reader().vTableGet(_bc, _bcOffset, 116, double.infinity);\n  double get infinityDefault =>\n      const fb.Float32Reader().vTableGet(_bc, _bcOffset, 118, double.infinity);\n  double get positiveInfinityDefault =>\n      const fb.Float32Reader().vTableGet(_bc, _bcOffset, 120, double.infinity);\n  double get negativeInfDefault => const fb.Float32Reader().vTableGet(\n    _bc,\n    _bcOffset,\n    122,\n    double.negativeInfinity,\n  );\n  double get negativeInfinityDefault => const fb.Float32Reader().vTableGet(\n    _bc,\n    _bcOffset,\n    124,\n    double.negativeInfinity,\n  );\n  double get doubleInfDefault =>\n      const fb.Float64Reader().vTableGet(_bc, _bcOffset, 126, double.infinity);\n\n  @override\n  String toString() {\n    return 'Monster{pos: ${pos}, mana: ${mana}, hp: ${hp}, name: ${name}, inventory: ${inventory}, color: ${color}, testType: ${testType}, test: ${test}, test4: ${test4}, testarrayofstring: ${testarrayofstring}, testarrayoftables: ${testarrayoftables}, enemy: ${enemy}, testnestedflatbuffer: ${testnestedflatbuffer}, testempty: ${testempty}, testbool: ${testbool}, testhashs32Fnv1: ${testhashs32Fnv1}, testhashu32Fnv1: ${testhashu32Fnv1}, testhashs64Fnv1: ${testhashs64Fnv1}, testhashu64Fnv1: ${testhashu64Fnv1}, testhashs32Fnv1a: ${testhashs32Fnv1a}, testhashu32Fnv1a: ${testhashu32Fnv1a}, testhashs64Fnv1a: ${testhashs64Fnv1a}, testhashu64Fnv1a: ${testhashu64Fnv1a}, testarrayofbools: ${testarrayofbools}, testf: ${testf}, testf2: ${testf2}, testf3: ${testf3}, testarrayofstring2: ${testarrayofstring2}, testarrayofsortedstruct: ${testarrayofsortedstruct}, flex: ${flex}, test5: ${test5}, vectorOfLongs: ${vectorOfLongs}, vectorOfDoubles: ${vectorOfDoubles}, parentNamespaceTest: ${parentNamespaceTest}, vectorOfReferrables: ${vectorOfReferrables}, singleWeakReference: ${singleWeakReference}, vectorOfWeakReferences: ${vectorOfWeakReferences}, vectorOfStrongReferrables: ${vectorOfStrongReferrables}, coOwningReference: ${coOwningReference}, vectorOfCoOwningReferences: ${vectorOfCoOwningReferences}, nonOwningReference: ${nonOwningReference}, vectorOfNonOwningReferences: ${vectorOfNonOwningReferences}, anyUniqueType: ${anyUniqueType}, anyUnique: ${anyUnique}, anyAmbiguousType: ${anyAmbiguousType}, anyAmbiguous: ${anyAmbiguous}, vectorOfEnums: ${vectorOfEnums}, signedEnum: ${signedEnum}, testrequirednestedflatbuffer: ${testrequirednestedflatbuffer}, scalarKeySortedTables: ${scalarKeySortedTables}, nativeInline: ${nativeInline}, longEnumNonEnumDefault: ${longEnumNonEnumDefault}, longEnumNormalDefault: ${longEnumNormalDefault}, nanDefault: ${nanDefault}, infDefault: ${infDefault}, positiveInfDefault: ${positiveInfDefault}, infinityDefault: ${infinityDefault}, positiveInfinityDefault: ${positiveInfinityDefault}, negativeInfDefault: ${negativeInfDefault}, negativeInfinityDefault: ${negativeInfinityDefault}, doubleInfDefault: ${doubleInfDefault}}';\n  }\n\n  MonsterT unpack() => MonsterT(\n    pos: pos?.unpack(),\n    mana: mana,\n    hp: hp,\n    name: name,\n    inventory: inventory?.toList(),\n    color: color,\n    testType: testType,\n    test: test?.unpack(),\n    test4: test4?.map((e) => e.unpack()).toList(),\n    testarrayofstring: testarrayofstring?.toList(),\n    testarrayoftables: testarrayoftables?.map((e) => e.unpack()).toList(),\n    enemy: enemy?.unpack(),\n    testnestedflatbuffer: testnestedflatbuffer?.toList(),\n    testempty: testempty?.unpack(),\n    testbool: testbool,\n    testhashs32Fnv1: testhashs32Fnv1,\n    testhashu32Fnv1: testhashu32Fnv1,\n    testhashs64Fnv1: testhashs64Fnv1,\n    testhashu64Fnv1: testhashu64Fnv1,\n    testhashs32Fnv1a: testhashs32Fnv1a,\n    testhashu32Fnv1a: testhashu32Fnv1a,\n    testhashs64Fnv1a: testhashs64Fnv1a,\n    testhashu64Fnv1a: testhashu64Fnv1a,\n    testarrayofbools: testarrayofbools?.toList(),\n    testf: testf,\n    testf2: testf2,\n    testf3: testf3,\n    testarrayofstring2: testarrayofstring2?.toList(),\n    testarrayofsortedstruct: testarrayofsortedstruct?.map((e) => e.unpack()).toList(),\n    flex: flex?.toList(),\n    test5: test5?.map((e) => e.unpack()).toList(),\n    vectorOfLongs: vectorOfLongs?.toList(),\n    vectorOfDoubles: vectorOfDoubles?.toList(),\n    parentNamespaceTest: parentNamespaceTest?.unpack(),\n    vectorOfReferrables: vectorOfReferrables?.map((e) => e.unpack()).toList(),\n    singleWeakReference: singleWeakReference,\n    vectorOfWeakReferences: vectorOfWeakReferences?.toList(),\n    vectorOfStrongReferrables: vectorOfStrongReferrables?.map((e) => e.unpack()).toList(),\n    coOwningReference: coOwningReference,\n    vectorOfCoOwningReferences: vectorOfCoOwningReferences?.toList(),\n    nonOwningReference: nonOwningReference,\n    vectorOfNonOwningReferences: vectorOfNonOwningReferences?.toList(),\n    anyUniqueType: anyUniqueType,\n    anyUnique: anyUnique?.unpack(),\n    anyAmbiguousType: anyAmbiguousType,\n    anyAmbiguous: anyAmbiguous?.unpack(),\n    vectorOfEnums: vectorOfEnums?.toList(),\n    signedEnum: signedEnum,\n    testrequirednestedflatbuffer: testrequirednestedflatbuffer?.toList(),\n    scalarKeySortedTables: scalarKeySortedTables?.map((e) => e.unpack()).toList(),\n    nativeInline: nativeInline?.unpack(),\n    longEnumNonEnumDefault: longEnumNonEnumDefault,\n    longEnumNormalDefault: longEnumNormalDefault,\n    nanDefault: nanDefault,\n    infDefault: infDefault,\n    positiveInfDefault: positiveInfDefault,\n    infinityDefault: infinityDefault,\n    positiveInfinityDefault: positiveInfinityDefault,\n    negativeInfDefault: negativeInfDefault,\n    negativeInfinityDefault: negativeInfinityDefault,\n    doubleInfDefault: doubleInfDefault,\n  );\n\n  static int pack(fb.Builder fbBuilder, MonsterT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\n///  an example documentation comment: \"monster object\"\nclass MonsterT implements fb.Packable {\n  Vec3T? pos;\n  int mana;\n  int hp;\n  String? name;\n  List<int>? inventory;\n  Color color;\n  AnyTypeId? testType;\n  dynamic test;\n  List<TestT>? test4;\n  List<String>? testarrayofstring;\n\n  ///  an example documentation comment: this will end up in the generated code\n  ///  multiline too\n  List<MonsterT>? testarrayoftables;\n  MonsterT? enemy;\n  List<int>? testnestedflatbuffer;\n  StatT? testempty;\n  bool testbool;\n  int testhashs32Fnv1;\n  int testhashu32Fnv1;\n  int testhashs64Fnv1;\n  int testhashu64Fnv1;\n  int testhashs32Fnv1a;\n  int testhashu32Fnv1a;\n  int testhashs64Fnv1a;\n  int testhashu64Fnv1a;\n  List<bool>? testarrayofbools;\n  double testf;\n  double testf2;\n  double testf3;\n  List<String>? testarrayofstring2;\n  List<AbilityT>? testarrayofsortedstruct;\n  List<int>? flex;\n  List<TestT>? test5;\n  List<int>? vectorOfLongs;\n  List<double>? vectorOfDoubles;\n  my_game.InParentNamespaceT? parentNamespaceTest;\n  List<ReferrableT>? vectorOfReferrables;\n  int singleWeakReference;\n  List<int>? vectorOfWeakReferences;\n  List<ReferrableT>? vectorOfStrongReferrables;\n  int coOwningReference;\n  List<int>? vectorOfCoOwningReferences;\n  int nonOwningReference;\n  List<int>? vectorOfNonOwningReferences;\n  AnyUniqueAliasesTypeId? anyUniqueType;\n  dynamic anyUnique;\n  AnyAmbiguousAliasesTypeId? anyAmbiguousType;\n  dynamic anyAmbiguous;\n  List<Color>? vectorOfEnums;\n  Race signedEnum;\n  List<int>? testrequirednestedflatbuffer;\n  List<StatT>? scalarKeySortedTables;\n  TestT? nativeInline;\n  LongEnum longEnumNonEnumDefault;\n  LongEnum longEnumNormalDefault;\n  double nanDefault;\n  double infDefault;\n  double positiveInfDefault;\n  double infinityDefault;\n  double positiveInfinityDefault;\n  double negativeInfDefault;\n  double negativeInfinityDefault;\n  double doubleInfDefault;\n\n  MonsterT({\n    this.pos,\n    this.mana = 150,\n    this.hp = 100,\n    this.name,\n    this.inventory,\n    this.color = Color.Blue,\n    this.testType,\n    this.test,\n    this.test4,\n    this.testarrayofstring,\n    this.testarrayoftables,\n    this.enemy,\n    this.testnestedflatbuffer,\n    this.testempty,\n    this.testbool = false,\n    this.testhashs32Fnv1 = 0,\n    this.testhashu32Fnv1 = 0,\n    this.testhashs64Fnv1 = 0,\n    this.testhashu64Fnv1 = 0,\n    this.testhashs32Fnv1a = 0,\n    this.testhashu32Fnv1a = 0,\n    this.testhashs64Fnv1a = 0,\n    this.testhashu64Fnv1a = 0,\n    this.testarrayofbools,\n    this.testf = 3.14159,\n    this.testf2 = 3.0,\n    this.testf3 = 0.0,\n    this.testarrayofstring2,\n    this.testarrayofsortedstruct,\n    this.flex,\n    this.test5,\n    this.vectorOfLongs,\n    this.vectorOfDoubles,\n    this.parentNamespaceTest,\n    this.vectorOfReferrables,\n    this.singleWeakReference = 0,\n    this.vectorOfWeakReferences,\n    this.vectorOfStrongReferrables,\n    this.coOwningReference = 0,\n    this.vectorOfCoOwningReferences,\n    this.nonOwningReference = 0,\n    this.vectorOfNonOwningReferences,\n    this.anyUniqueType,\n    this.anyUnique,\n    this.anyAmbiguousType,\n    this.anyAmbiguous,\n    this.vectorOfEnums,\n    this.signedEnum = Race.None,\n    this.testrequirednestedflatbuffer,\n    this.scalarKeySortedTables,\n    this.nativeInline,\n    this.longEnumNonEnumDefault = LongEnum._default,\n    this.longEnumNormalDefault = LongEnum.LongOne,\n    this.nanDefault = double.nan,\n    this.infDefault = double.infinity,\n    this.positiveInfDefault = double.infinity,\n    this.infinityDefault = double.infinity,\n    this.positiveInfinityDefault = double.infinity,\n    this.negativeInfDefault = double.negativeInfinity,\n    this.negativeInfinityDefault = double.negativeInfinity,\n    this.doubleInfDefault = double.infinity,\n  });\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    final int? nameOffset = name == null ? null : fbBuilder.writeString(name!);\n    final int? inventoryOffset = inventory == null\n        ? null\n        : fbBuilder.writeListUint8(inventory!);\n    final int? testOffset = test?.pack(fbBuilder);\n    int? test4Offset;\n    if (test4 != null) {\n      for (var e in test4!.reversed) {\n        e.pack(fbBuilder);\n      }\n      test4Offset = fbBuilder.endStructVector(test4!.length);\n    }\n    final int? testarrayofstringOffset = testarrayofstring == null\n        ? null\n        : fbBuilder.writeList(\n            testarrayofstring!.map(fbBuilder.writeString).toList(),\n          );\n    final int? testarrayoftablesOffset = testarrayoftables == null\n        ? null\n        : fbBuilder.writeList(\n            testarrayoftables!.map((b) => b.pack(fbBuilder)).toList(),\n          );\n    final int? enemyOffset = enemy?.pack(fbBuilder);\n    final int? testnestedflatbufferOffset = testnestedflatbuffer == null\n        ? null\n        : fbBuilder.writeListUint8(testnestedflatbuffer!);\n    final int? testemptyOffset = testempty?.pack(fbBuilder);\n    final int? testarrayofboolsOffset = testarrayofbools == null\n        ? null\n        : fbBuilder.writeListBool(testarrayofbools!);\n    final int? testarrayofstring2Offset = testarrayofstring2 == null\n        ? null\n        : fbBuilder.writeList(\n            testarrayofstring2!.map(fbBuilder.writeString).toList(),\n          );\n    int? testarrayofsortedstructOffset;\n    if (testarrayofsortedstruct != null) {\n      for (var e in testarrayofsortedstruct!.reversed) {\n        e.pack(fbBuilder);\n      }\n      testarrayofsortedstructOffset = fbBuilder.endStructVector(\n        testarrayofsortedstruct!.length,\n      );\n    }\n    final int? flexOffset = flex == null\n        ? null\n        : fbBuilder.writeListUint8(flex!);\n    int? test5Offset;\n    if (test5 != null) {\n      for (var e in test5!.reversed) {\n        e.pack(fbBuilder);\n      }\n      test5Offset = fbBuilder.endStructVector(test5!.length);\n    }\n    final int? vectorOfLongsOffset = vectorOfLongs == null\n        ? null\n        : fbBuilder.writeListInt64(vectorOfLongs!);\n    final int? vectorOfDoublesOffset = vectorOfDoubles == null\n        ? null\n        : fbBuilder.writeListFloat64(vectorOfDoubles!);\n    final int? parentNamespaceTestOffset = parentNamespaceTest?.pack(fbBuilder);\n    final int? vectorOfReferrablesOffset = vectorOfReferrables == null\n        ? null\n        : fbBuilder.writeList(\n            vectorOfReferrables!.map((b) => b.pack(fbBuilder)).toList(),\n          );\n    final int? vectorOfWeakReferencesOffset = vectorOfWeakReferences == null\n        ? null\n        : fbBuilder.writeListUint64(vectorOfWeakReferences!);\n    final int? vectorOfStrongReferrablesOffset =\n        vectorOfStrongReferrables == null\n        ? null\n        : fbBuilder.writeList(\n            vectorOfStrongReferrables!.map((b) => b.pack(fbBuilder)).toList(),\n          );\n    final int? vectorOfCoOwningReferencesOffset =\n        vectorOfCoOwningReferences == null\n        ? null\n        : fbBuilder.writeListUint64(vectorOfCoOwningReferences!);\n    final int? vectorOfNonOwningReferencesOffset =\n        vectorOfNonOwningReferences == null\n        ? null\n        : fbBuilder.writeListUint64(vectorOfNonOwningReferences!);\n    final int? anyUniqueOffset = anyUnique?.pack(fbBuilder);\n    final int? anyAmbiguousOffset = anyAmbiguous?.pack(fbBuilder);\n    final int? vectorOfEnumsOffset = vectorOfEnums == null\n        ? null\n        : fbBuilder.writeListUint8(vectorOfEnums!.map((f) => f.value).toList());\n    final int? testrequirednestedflatbufferOffset =\n        testrequirednestedflatbuffer == null\n        ? null\n        : fbBuilder.writeListUint8(testrequirednestedflatbuffer!);\n    final int? scalarKeySortedTablesOffset = scalarKeySortedTables == null\n        ? null\n        : fbBuilder.writeList(\n            scalarKeySortedTables!.map((b) => b.pack(fbBuilder)).toList(),\n          );\n    fbBuilder.startTable(62);\n    if (pos != null) {\n      fbBuilder.addStruct(0, pos!.pack(fbBuilder));\n    }\n    fbBuilder.addInt16(1, mana);\n    fbBuilder.addInt16(2, hp);\n    fbBuilder.addOffset(3, nameOffset);\n    fbBuilder.addOffset(5, inventoryOffset);\n    fbBuilder.addUint8(6, color.value);\n    fbBuilder.addUint8(7, testType?.value);\n    fbBuilder.addOffset(8, testOffset);\n    fbBuilder.addOffset(9, test4Offset);\n    fbBuilder.addOffset(10, testarrayofstringOffset);\n    fbBuilder.addOffset(11, testarrayoftablesOffset);\n    fbBuilder.addOffset(12, enemyOffset);\n    fbBuilder.addOffset(13, testnestedflatbufferOffset);\n    fbBuilder.addOffset(14, testemptyOffset);\n    fbBuilder.addBool(15, testbool);\n    fbBuilder.addInt32(16, testhashs32Fnv1);\n    fbBuilder.addUint32(17, testhashu32Fnv1);\n    fbBuilder.addInt64(18, testhashs64Fnv1);\n    fbBuilder.addUint64(19, testhashu64Fnv1);\n    fbBuilder.addInt32(20, testhashs32Fnv1a);\n    fbBuilder.addUint32(21, testhashu32Fnv1a);\n    fbBuilder.addInt64(22, testhashs64Fnv1a);\n    fbBuilder.addUint64(23, testhashu64Fnv1a);\n    fbBuilder.addOffset(24, testarrayofboolsOffset);\n    fbBuilder.addFloat32(25, testf);\n    fbBuilder.addFloat32(26, testf2);\n    fbBuilder.addFloat32(27, testf3);\n    fbBuilder.addOffset(28, testarrayofstring2Offset);\n    fbBuilder.addOffset(29, testarrayofsortedstructOffset);\n    fbBuilder.addOffset(30, flexOffset);\n    fbBuilder.addOffset(31, test5Offset);\n    fbBuilder.addOffset(32, vectorOfLongsOffset);\n    fbBuilder.addOffset(33, vectorOfDoublesOffset);\n    fbBuilder.addOffset(34, parentNamespaceTestOffset);\n    fbBuilder.addOffset(35, vectorOfReferrablesOffset);\n    fbBuilder.addUint64(36, singleWeakReference);\n    fbBuilder.addOffset(37, vectorOfWeakReferencesOffset);\n    fbBuilder.addOffset(38, vectorOfStrongReferrablesOffset);\n    fbBuilder.addUint64(39, coOwningReference);\n    fbBuilder.addOffset(40, vectorOfCoOwningReferencesOffset);\n    fbBuilder.addUint64(41, nonOwningReference);\n    fbBuilder.addOffset(42, vectorOfNonOwningReferencesOffset);\n    fbBuilder.addUint8(43, anyUniqueType?.value);\n    fbBuilder.addOffset(44, anyUniqueOffset);\n    fbBuilder.addUint8(45, anyAmbiguousType?.value);\n    fbBuilder.addOffset(46, anyAmbiguousOffset);\n    fbBuilder.addOffset(47, vectorOfEnumsOffset);\n    fbBuilder.addInt8(48, signedEnum.value);\n    fbBuilder.addOffset(49, testrequirednestedflatbufferOffset);\n    fbBuilder.addOffset(50, scalarKeySortedTablesOffset);\n    if (nativeInline != null) {\n      fbBuilder.addStruct(51, nativeInline!.pack(fbBuilder));\n    }\n    fbBuilder.addUint64(52, longEnumNonEnumDefault.value);\n    fbBuilder.addUint64(53, longEnumNormalDefault.value);\n    fbBuilder.addFloat32(54, nanDefault);\n    fbBuilder.addFloat32(55, infDefault);\n    fbBuilder.addFloat32(56, positiveInfDefault);\n    fbBuilder.addFloat32(57, infinityDefault);\n    fbBuilder.addFloat32(58, positiveInfinityDefault);\n    fbBuilder.addFloat32(59, negativeInfDefault);\n    fbBuilder.addFloat32(60, negativeInfinityDefault);\n    fbBuilder.addFloat64(61, doubleInfDefault);\n    return fbBuilder.endTable();\n  }\n\n  @override\n  String toString() {\n    return 'MonsterT{pos: ${pos}, mana: ${mana}, hp: ${hp}, name: ${name}, inventory: ${inventory}, color: ${color}, testType: ${testType}, test: ${test}, test4: ${test4}, testarrayofstring: ${testarrayofstring}, testarrayoftables: ${testarrayoftables}, enemy: ${enemy}, testnestedflatbuffer: ${testnestedflatbuffer}, testempty: ${testempty}, testbool: ${testbool}, testhashs32Fnv1: ${testhashs32Fnv1}, testhashu32Fnv1: ${testhashu32Fnv1}, testhashs64Fnv1: ${testhashs64Fnv1}, testhashu64Fnv1: ${testhashu64Fnv1}, testhashs32Fnv1a: ${testhashs32Fnv1a}, testhashu32Fnv1a: ${testhashu32Fnv1a}, testhashs64Fnv1a: ${testhashs64Fnv1a}, testhashu64Fnv1a: ${testhashu64Fnv1a}, testarrayofbools: ${testarrayofbools}, testf: ${testf}, testf2: ${testf2}, testf3: ${testf3}, testarrayofstring2: ${testarrayofstring2}, testarrayofsortedstruct: ${testarrayofsortedstruct}, flex: ${flex}, test5: ${test5}, vectorOfLongs: ${vectorOfLongs}, vectorOfDoubles: ${vectorOfDoubles}, parentNamespaceTest: ${parentNamespaceTest}, vectorOfReferrables: ${vectorOfReferrables}, singleWeakReference: ${singleWeakReference}, vectorOfWeakReferences: ${vectorOfWeakReferences}, vectorOfStrongReferrables: ${vectorOfStrongReferrables}, coOwningReference: ${coOwningReference}, vectorOfCoOwningReferences: ${vectorOfCoOwningReferences}, nonOwningReference: ${nonOwningReference}, vectorOfNonOwningReferences: ${vectorOfNonOwningReferences}, anyUniqueType: ${anyUniqueType}, anyUnique: ${anyUnique}, anyAmbiguousType: ${anyAmbiguousType}, anyAmbiguous: ${anyAmbiguous}, vectorOfEnums: ${vectorOfEnums}, signedEnum: ${signedEnum}, testrequirednestedflatbuffer: ${testrequirednestedflatbuffer}, scalarKeySortedTables: ${scalarKeySortedTables}, nativeInline: ${nativeInline}, longEnumNonEnumDefault: ${longEnumNonEnumDefault}, longEnumNormalDefault: ${longEnumNormalDefault}, nanDefault: ${nanDefault}, infDefault: ${infDefault}, positiveInfDefault: ${positiveInfDefault}, infinityDefault: ${infinityDefault}, positiveInfinityDefault: ${positiveInfinityDefault}, negativeInfDefault: ${negativeInfDefault}, negativeInfinityDefault: ${negativeInfinityDefault}, doubleInfDefault: ${doubleInfDefault}}';\n  }\n}\n\nclass _MonsterReader extends fb.TableReader<Monster> {\n  const _MonsterReader();\n\n  @override\n  Monster createObject(fb.BufferContext bc, int offset) =>\n      Monster._(bc, offset);\n}\n\nclass MonsterBuilder {\n  MonsterBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  void begin() {\n    fbBuilder.startTable(62);\n  }\n\n  int addPos(int offset) {\n    fbBuilder.addStruct(0, offset);\n    return fbBuilder.offset;\n  }\n\n  int addMana(int? mana) {\n    fbBuilder.addInt16(1, mana);\n    return fbBuilder.offset;\n  }\n\n  int addHp(int? hp) {\n    fbBuilder.addInt16(2, hp);\n    return fbBuilder.offset;\n  }\n\n  int addNameOffset(int? offset) {\n    fbBuilder.addOffset(3, offset);\n    return fbBuilder.offset;\n  }\n\n  int addInventoryOffset(int? offset) {\n    fbBuilder.addOffset(5, offset);\n    return fbBuilder.offset;\n  }\n\n  int addColor(Color? color) {\n    fbBuilder.addUint8(6, color?.value);\n    return fbBuilder.offset;\n  }\n\n  int addTestType(AnyTypeId? testType) {\n    fbBuilder.addUint8(7, testType?.value);\n    return fbBuilder.offset;\n  }\n\n  int addTestOffset(int? offset) {\n    fbBuilder.addOffset(8, offset);\n    return fbBuilder.offset;\n  }\n\n  int addTest4Offset(int? offset) {\n    fbBuilder.addOffset(9, offset);\n    return fbBuilder.offset;\n  }\n\n  int addTestarrayofstringOffset(int? offset) {\n    fbBuilder.addOffset(10, offset);\n    return fbBuilder.offset;\n  }\n\n  int addTestarrayoftablesOffset(int? offset) {\n    fbBuilder.addOffset(11, offset);\n    return fbBuilder.offset;\n  }\n\n  int addEnemyOffset(int? offset) {\n    fbBuilder.addOffset(12, offset);\n    return fbBuilder.offset;\n  }\n\n  int addTestnestedflatbufferOffset(int? offset) {\n    fbBuilder.addOffset(13, offset);\n    return fbBuilder.offset;\n  }\n\n  int addTestemptyOffset(int? offset) {\n    fbBuilder.addOffset(14, offset);\n    return fbBuilder.offset;\n  }\n\n  int addTestbool(bool? testbool) {\n    fbBuilder.addBool(15, testbool);\n    return fbBuilder.offset;\n  }\n\n  int addTesthashs32Fnv1(int? testhashs32Fnv1) {\n    fbBuilder.addInt32(16, testhashs32Fnv1);\n    return fbBuilder.offset;\n  }\n\n  int addTesthashu32Fnv1(int? testhashu32Fnv1) {\n    fbBuilder.addUint32(17, testhashu32Fnv1);\n    return fbBuilder.offset;\n  }\n\n  int addTesthashs64Fnv1(int? testhashs64Fnv1) {\n    fbBuilder.addInt64(18, testhashs64Fnv1);\n    return fbBuilder.offset;\n  }\n\n  int addTesthashu64Fnv1(int? testhashu64Fnv1) {\n    fbBuilder.addUint64(19, testhashu64Fnv1);\n    return fbBuilder.offset;\n  }\n\n  int addTesthashs32Fnv1a(int? testhashs32Fnv1a) {\n    fbBuilder.addInt32(20, testhashs32Fnv1a);\n    return fbBuilder.offset;\n  }\n\n  int addTesthashu32Fnv1a(int? testhashu32Fnv1a) {\n    fbBuilder.addUint32(21, testhashu32Fnv1a);\n    return fbBuilder.offset;\n  }\n\n  int addTesthashs64Fnv1a(int? testhashs64Fnv1a) {\n    fbBuilder.addInt64(22, testhashs64Fnv1a);\n    return fbBuilder.offset;\n  }\n\n  int addTesthashu64Fnv1a(int? testhashu64Fnv1a) {\n    fbBuilder.addUint64(23, testhashu64Fnv1a);\n    return fbBuilder.offset;\n  }\n\n  int addTestarrayofboolsOffset(int? offset) {\n    fbBuilder.addOffset(24, offset);\n    return fbBuilder.offset;\n  }\n\n  int addTestf(double? testf) {\n    fbBuilder.addFloat32(25, testf);\n    return fbBuilder.offset;\n  }\n\n  int addTestf2(double? testf2) {\n    fbBuilder.addFloat32(26, testf2);\n    return fbBuilder.offset;\n  }\n\n  int addTestf3(double? testf3) {\n    fbBuilder.addFloat32(27, testf3);\n    return fbBuilder.offset;\n  }\n\n  int addTestarrayofstring2Offset(int? offset) {\n    fbBuilder.addOffset(28, offset);\n    return fbBuilder.offset;\n  }\n\n  int addTestarrayofsortedstructOffset(int? offset) {\n    fbBuilder.addOffset(29, offset);\n    return fbBuilder.offset;\n  }\n\n  int addFlexOffset(int? offset) {\n    fbBuilder.addOffset(30, offset);\n    return fbBuilder.offset;\n  }\n\n  int addTest5Offset(int? offset) {\n    fbBuilder.addOffset(31, offset);\n    return fbBuilder.offset;\n  }\n\n  int addVectorOfLongsOffset(int? offset) {\n    fbBuilder.addOffset(32, offset);\n    return fbBuilder.offset;\n  }\n\n  int addVectorOfDoublesOffset(int? offset) {\n    fbBuilder.addOffset(33, offset);\n    return fbBuilder.offset;\n  }\n\n  int addParentNamespaceTestOffset(int? offset) {\n    fbBuilder.addOffset(34, offset);\n    return fbBuilder.offset;\n  }\n\n  int addVectorOfReferrablesOffset(int? offset) {\n    fbBuilder.addOffset(35, offset);\n    return fbBuilder.offset;\n  }\n\n  int addSingleWeakReference(int? singleWeakReference) {\n    fbBuilder.addUint64(36, singleWeakReference);\n    return fbBuilder.offset;\n  }\n\n  int addVectorOfWeakReferencesOffset(int? offset) {\n    fbBuilder.addOffset(37, offset);\n    return fbBuilder.offset;\n  }\n\n  int addVectorOfStrongReferrablesOffset(int? offset) {\n    fbBuilder.addOffset(38, offset);\n    return fbBuilder.offset;\n  }\n\n  int addCoOwningReference(int? coOwningReference) {\n    fbBuilder.addUint64(39, coOwningReference);\n    return fbBuilder.offset;\n  }\n\n  int addVectorOfCoOwningReferencesOffset(int? offset) {\n    fbBuilder.addOffset(40, offset);\n    return fbBuilder.offset;\n  }\n\n  int addNonOwningReference(int? nonOwningReference) {\n    fbBuilder.addUint64(41, nonOwningReference);\n    return fbBuilder.offset;\n  }\n\n  int addVectorOfNonOwningReferencesOffset(int? offset) {\n    fbBuilder.addOffset(42, offset);\n    return fbBuilder.offset;\n  }\n\n  int addAnyUniqueType(AnyUniqueAliasesTypeId? anyUniqueType) {\n    fbBuilder.addUint8(43, anyUniqueType?.value);\n    return fbBuilder.offset;\n  }\n\n  int addAnyUniqueOffset(int? offset) {\n    fbBuilder.addOffset(44, offset);\n    return fbBuilder.offset;\n  }\n\n  int addAnyAmbiguousType(AnyAmbiguousAliasesTypeId? anyAmbiguousType) {\n    fbBuilder.addUint8(45, anyAmbiguousType?.value);\n    return fbBuilder.offset;\n  }\n\n  int addAnyAmbiguousOffset(int? offset) {\n    fbBuilder.addOffset(46, offset);\n    return fbBuilder.offset;\n  }\n\n  int addVectorOfEnumsOffset(int? offset) {\n    fbBuilder.addOffset(47, offset);\n    return fbBuilder.offset;\n  }\n\n  int addSignedEnum(Race? signedEnum) {\n    fbBuilder.addInt8(48, signedEnum?.value);\n    return fbBuilder.offset;\n  }\n\n  int addTestrequirednestedflatbufferOffset(int? offset) {\n    fbBuilder.addOffset(49, offset);\n    return fbBuilder.offset;\n  }\n\n  int addScalarKeySortedTablesOffset(int? offset) {\n    fbBuilder.addOffset(50, offset);\n    return fbBuilder.offset;\n  }\n\n  int addNativeInline(int offset) {\n    fbBuilder.addStruct(51, offset);\n    return fbBuilder.offset;\n  }\n\n  int addLongEnumNonEnumDefault(LongEnum? longEnumNonEnumDefault) {\n    fbBuilder.addUint64(52, longEnumNonEnumDefault?.value);\n    return fbBuilder.offset;\n  }\n\n  int addLongEnumNormalDefault(LongEnum? longEnumNormalDefault) {\n    fbBuilder.addUint64(53, longEnumNormalDefault?.value);\n    return fbBuilder.offset;\n  }\n\n  int addNanDefault(double? nanDefault) {\n    fbBuilder.addFloat32(54, nanDefault);\n    return fbBuilder.offset;\n  }\n\n  int addInfDefault(double? infDefault) {\n    fbBuilder.addFloat32(55, infDefault);\n    return fbBuilder.offset;\n  }\n\n  int addPositiveInfDefault(double? positiveInfDefault) {\n    fbBuilder.addFloat32(56, positiveInfDefault);\n    return fbBuilder.offset;\n  }\n\n  int addInfinityDefault(double? infinityDefault) {\n    fbBuilder.addFloat32(57, infinityDefault);\n    return fbBuilder.offset;\n  }\n\n  int addPositiveInfinityDefault(double? positiveInfinityDefault) {\n    fbBuilder.addFloat32(58, positiveInfinityDefault);\n    return fbBuilder.offset;\n  }\n\n  int addNegativeInfDefault(double? negativeInfDefault) {\n    fbBuilder.addFloat32(59, negativeInfDefault);\n    return fbBuilder.offset;\n  }\n\n  int addNegativeInfinityDefault(double? negativeInfinityDefault) {\n    fbBuilder.addFloat32(60, negativeInfinityDefault);\n    return fbBuilder.offset;\n  }\n\n  int addDoubleInfDefault(double? doubleInfDefault) {\n    fbBuilder.addFloat64(61, doubleInfDefault);\n    return fbBuilder.offset;\n  }\n\n  int finish() {\n    return fbBuilder.endTable();\n  }\n}\n\nclass MonsterObjectBuilder extends fb.ObjectBuilder {\n  final Vec3ObjectBuilder? _pos;\n  final int? _mana;\n  final int? _hp;\n  final String? _name;\n  final List<int>? _inventory;\n  final Color? _color;\n  final AnyTypeId? _testType;\n  final dynamic _test;\n  final List<TestObjectBuilder>? _test4;\n  final List<String>? _testarrayofstring;\n  final List<MonsterObjectBuilder>? _testarrayoftables;\n  final MonsterObjectBuilder? _enemy;\n  final List<int>? _testnestedflatbuffer;\n  final StatObjectBuilder? _testempty;\n  final bool? _testbool;\n  final int? _testhashs32Fnv1;\n  final int? _testhashu32Fnv1;\n  final int? _testhashs64Fnv1;\n  final int? _testhashu64Fnv1;\n  final int? _testhashs32Fnv1a;\n  final int? _testhashu32Fnv1a;\n  final int? _testhashs64Fnv1a;\n  final int? _testhashu64Fnv1a;\n  final List<bool>? _testarrayofbools;\n  final double? _testf;\n  final double? _testf2;\n  final double? _testf3;\n  final List<String>? _testarrayofstring2;\n  final List<AbilityObjectBuilder>? _testarrayofsortedstruct;\n  final List<int>? _flex;\n  final List<TestObjectBuilder>? _test5;\n  final List<int>? _vectorOfLongs;\n  final List<double>? _vectorOfDoubles;\n  final my_game.InParentNamespaceObjectBuilder? _parentNamespaceTest;\n  final List<ReferrableObjectBuilder>? _vectorOfReferrables;\n  final int? _singleWeakReference;\n  final List<int>? _vectorOfWeakReferences;\n  final List<ReferrableObjectBuilder>? _vectorOfStrongReferrables;\n  final int? _coOwningReference;\n  final List<int>? _vectorOfCoOwningReferences;\n  final int? _nonOwningReference;\n  final List<int>? _vectorOfNonOwningReferences;\n  final AnyUniqueAliasesTypeId? _anyUniqueType;\n  final dynamic _anyUnique;\n  final AnyAmbiguousAliasesTypeId? _anyAmbiguousType;\n  final dynamic _anyAmbiguous;\n  final List<Color>? _vectorOfEnums;\n  final Race? _signedEnum;\n  final List<int>? _testrequirednestedflatbuffer;\n  final List<StatObjectBuilder>? _scalarKeySortedTables;\n  final TestObjectBuilder? _nativeInline;\n  final LongEnum? _longEnumNonEnumDefault;\n  final LongEnum? _longEnumNormalDefault;\n  final double? _nanDefault;\n  final double? _infDefault;\n  final double? _positiveInfDefault;\n  final double? _infinityDefault;\n  final double? _positiveInfinityDefault;\n  final double? _negativeInfDefault;\n  final double? _negativeInfinityDefault;\n  final double? _doubleInfDefault;\n\n  MonsterObjectBuilder({\n    Vec3ObjectBuilder? pos,\n    int? mana,\n    int? hp,\n    String? name,\n    List<int>? inventory,\n    Color? color,\n    AnyTypeId? testType,\n    dynamic test,\n    List<TestObjectBuilder>? test4,\n    List<String>? testarrayofstring,\n    List<MonsterObjectBuilder>? testarrayoftables,\n    MonsterObjectBuilder? enemy,\n    List<int>? testnestedflatbuffer,\n    StatObjectBuilder? testempty,\n    bool? testbool,\n    int? testhashs32Fnv1,\n    int? testhashu32Fnv1,\n    int? testhashs64Fnv1,\n    int? testhashu64Fnv1,\n    int? testhashs32Fnv1a,\n    int? testhashu32Fnv1a,\n    int? testhashs64Fnv1a,\n    int? testhashu64Fnv1a,\n    List<bool>? testarrayofbools,\n    double? testf,\n    double? testf2,\n    double? testf3,\n    List<String>? testarrayofstring2,\n    List<AbilityObjectBuilder>? testarrayofsortedstruct,\n    List<int>? flex,\n    List<TestObjectBuilder>? test5,\n    List<int>? vectorOfLongs,\n    List<double>? vectorOfDoubles,\n    my_game.InParentNamespaceObjectBuilder? parentNamespaceTest,\n    List<ReferrableObjectBuilder>? vectorOfReferrables,\n    int? singleWeakReference,\n    List<int>? vectorOfWeakReferences,\n    List<ReferrableObjectBuilder>? vectorOfStrongReferrables,\n    int? coOwningReference,\n    List<int>? vectorOfCoOwningReferences,\n    int? nonOwningReference,\n    List<int>? vectorOfNonOwningReferences,\n    AnyUniqueAliasesTypeId? anyUniqueType,\n    dynamic anyUnique,\n    AnyAmbiguousAliasesTypeId? anyAmbiguousType,\n    dynamic anyAmbiguous,\n    List<Color>? vectorOfEnums,\n    Race? signedEnum,\n    List<int>? testrequirednestedflatbuffer,\n    List<StatObjectBuilder>? scalarKeySortedTables,\n    TestObjectBuilder? nativeInline,\n    LongEnum? longEnumNonEnumDefault,\n    LongEnum? longEnumNormalDefault,\n    double? nanDefault,\n    double? infDefault,\n    double? positiveInfDefault,\n    double? infinityDefault,\n    double? positiveInfinityDefault,\n    double? negativeInfDefault,\n    double? negativeInfinityDefault,\n    double? doubleInfDefault,\n  }) : _pos = pos,\n       _mana = mana,\n       _hp = hp,\n       _name = name,\n       _inventory = inventory,\n       _color = color,\n       _testType = testType,\n       _test = test,\n       _test4 = test4,\n       _testarrayofstring = testarrayofstring,\n       _testarrayoftables = testarrayoftables,\n       _enemy = enemy,\n       _testnestedflatbuffer = testnestedflatbuffer,\n       _testempty = testempty,\n       _testbool = testbool,\n       _testhashs32Fnv1 = testhashs32Fnv1,\n       _testhashu32Fnv1 = testhashu32Fnv1,\n       _testhashs64Fnv1 = testhashs64Fnv1,\n       _testhashu64Fnv1 = testhashu64Fnv1,\n       _testhashs32Fnv1a = testhashs32Fnv1a,\n       _testhashu32Fnv1a = testhashu32Fnv1a,\n       _testhashs64Fnv1a = testhashs64Fnv1a,\n       _testhashu64Fnv1a = testhashu64Fnv1a,\n       _testarrayofbools = testarrayofbools,\n       _testf = testf,\n       _testf2 = testf2,\n       _testf3 = testf3,\n       _testarrayofstring2 = testarrayofstring2,\n       _testarrayofsortedstruct = testarrayofsortedstruct,\n       _flex = flex,\n       _test5 = test5,\n       _vectorOfLongs = vectorOfLongs,\n       _vectorOfDoubles = vectorOfDoubles,\n       _parentNamespaceTest = parentNamespaceTest,\n       _vectorOfReferrables = vectorOfReferrables,\n       _singleWeakReference = singleWeakReference,\n       _vectorOfWeakReferences = vectorOfWeakReferences,\n       _vectorOfStrongReferrables = vectorOfStrongReferrables,\n       _coOwningReference = coOwningReference,\n       _vectorOfCoOwningReferences = vectorOfCoOwningReferences,\n       _nonOwningReference = nonOwningReference,\n       _vectorOfNonOwningReferences = vectorOfNonOwningReferences,\n       _anyUniqueType = anyUniqueType,\n       _anyUnique = anyUnique,\n       _anyAmbiguousType = anyAmbiguousType,\n       _anyAmbiguous = anyAmbiguous,\n       _vectorOfEnums = vectorOfEnums,\n       _signedEnum = signedEnum,\n       _testrequirednestedflatbuffer = testrequirednestedflatbuffer,\n       _scalarKeySortedTables = scalarKeySortedTables,\n       _nativeInline = nativeInline,\n       _longEnumNonEnumDefault = longEnumNonEnumDefault,\n       _longEnumNormalDefault = longEnumNormalDefault,\n       _nanDefault = nanDefault,\n       _infDefault = infDefault,\n       _positiveInfDefault = positiveInfDefault,\n       _infinityDefault = infinityDefault,\n       _positiveInfinityDefault = positiveInfinityDefault,\n       _negativeInfDefault = negativeInfDefault,\n       _negativeInfinityDefault = negativeInfinityDefault,\n       _doubleInfDefault = doubleInfDefault;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    final int? nameOffset = _name == null\n        ? null\n        : fbBuilder.writeString(_name!);\n    final int? inventoryOffset = _inventory == null\n        ? null\n        : fbBuilder.writeListUint8(_inventory!);\n    final int? testOffset = _test?.getOrCreateOffset(fbBuilder);\n    final int? test4Offset = _test4 == null\n        ? null\n        : fbBuilder.writeListOfStructs(_test4!);\n    final int? testarrayofstringOffset = _testarrayofstring == null\n        ? null\n        : fbBuilder.writeList(\n            _testarrayofstring!.map(fbBuilder.writeString).toList(),\n          );\n    final int? testarrayoftablesOffset = _testarrayoftables == null\n        ? null\n        : fbBuilder.writeList(\n            _testarrayoftables!\n                .map((b) => b.getOrCreateOffset(fbBuilder))\n                .toList(),\n          );\n    final int? enemyOffset = _enemy?.getOrCreateOffset(fbBuilder);\n    final int? testnestedflatbufferOffset = _testnestedflatbuffer == null\n        ? null\n        : fbBuilder.writeListUint8(_testnestedflatbuffer!);\n    final int? testemptyOffset = _testempty?.getOrCreateOffset(fbBuilder);\n    final int? testarrayofboolsOffset = _testarrayofbools == null\n        ? null\n        : fbBuilder.writeListBool(_testarrayofbools!);\n    final int? testarrayofstring2Offset = _testarrayofstring2 == null\n        ? null\n        : fbBuilder.writeList(\n            _testarrayofstring2!.map(fbBuilder.writeString).toList(),\n          );\n    final int? testarrayofsortedstructOffset = _testarrayofsortedstruct == null\n        ? null\n        : fbBuilder.writeListOfStructs(_testarrayofsortedstruct!);\n    final int? flexOffset = _flex == null\n        ? null\n        : fbBuilder.writeListUint8(_flex!);\n    final int? test5Offset = _test5 == null\n        ? null\n        : fbBuilder.writeListOfStructs(_test5!);\n    final int? vectorOfLongsOffset = _vectorOfLongs == null\n        ? null\n        : fbBuilder.writeListInt64(_vectorOfLongs!);\n    final int? vectorOfDoublesOffset = _vectorOfDoubles == null\n        ? null\n        : fbBuilder.writeListFloat64(_vectorOfDoubles!);\n    final int? parentNamespaceTestOffset = _parentNamespaceTest\n        ?.getOrCreateOffset(fbBuilder);\n    final int? vectorOfReferrablesOffset = _vectorOfReferrables == null\n        ? null\n        : fbBuilder.writeList(\n            _vectorOfReferrables!\n                .map((b) => b.getOrCreateOffset(fbBuilder))\n                .toList(),\n          );\n    final int? vectorOfWeakReferencesOffset = _vectorOfWeakReferences == null\n        ? null\n        : fbBuilder.writeListUint64(_vectorOfWeakReferences!);\n    final int? vectorOfStrongReferrablesOffset =\n        _vectorOfStrongReferrables == null\n        ? null\n        : fbBuilder.writeList(\n            _vectorOfStrongReferrables!\n                .map((b) => b.getOrCreateOffset(fbBuilder))\n                .toList(),\n          );\n    final int? vectorOfCoOwningReferencesOffset =\n        _vectorOfCoOwningReferences == null\n        ? null\n        : fbBuilder.writeListUint64(_vectorOfCoOwningReferences!);\n    final int? vectorOfNonOwningReferencesOffset =\n        _vectorOfNonOwningReferences == null\n        ? null\n        : fbBuilder.writeListUint64(_vectorOfNonOwningReferences!);\n    final int? anyUniqueOffset = _anyUnique?.getOrCreateOffset(fbBuilder);\n    final int? anyAmbiguousOffset = _anyAmbiguous?.getOrCreateOffset(fbBuilder);\n    final int? vectorOfEnumsOffset = _vectorOfEnums == null\n        ? null\n        : fbBuilder.writeListUint8(\n            _vectorOfEnums!.map((f) => f.value).toList(),\n          );\n    final int? testrequirednestedflatbufferOffset =\n        _testrequirednestedflatbuffer == null\n        ? null\n        : fbBuilder.writeListUint8(_testrequirednestedflatbuffer!);\n    final int? scalarKeySortedTablesOffset = _scalarKeySortedTables == null\n        ? null\n        : fbBuilder.writeList(\n            _scalarKeySortedTables!\n                .map((b) => b.getOrCreateOffset(fbBuilder))\n                .toList(),\n          );\n    fbBuilder.startTable(62);\n    if (_pos != null) {\n      fbBuilder.addStruct(0, _pos!.finish(fbBuilder));\n    }\n    fbBuilder.addInt16(1, _mana);\n    fbBuilder.addInt16(2, _hp);\n    fbBuilder.addOffset(3, nameOffset);\n    fbBuilder.addOffset(5, inventoryOffset);\n    fbBuilder.addUint8(6, _color?.value);\n    fbBuilder.addUint8(7, _testType?.value);\n    fbBuilder.addOffset(8, testOffset);\n    fbBuilder.addOffset(9, test4Offset);\n    fbBuilder.addOffset(10, testarrayofstringOffset);\n    fbBuilder.addOffset(11, testarrayoftablesOffset);\n    fbBuilder.addOffset(12, enemyOffset);\n    fbBuilder.addOffset(13, testnestedflatbufferOffset);\n    fbBuilder.addOffset(14, testemptyOffset);\n    fbBuilder.addBool(15, _testbool);\n    fbBuilder.addInt32(16, _testhashs32Fnv1);\n    fbBuilder.addUint32(17, _testhashu32Fnv1);\n    fbBuilder.addInt64(18, _testhashs64Fnv1);\n    fbBuilder.addUint64(19, _testhashu64Fnv1);\n    fbBuilder.addInt32(20, _testhashs32Fnv1a);\n    fbBuilder.addUint32(21, _testhashu32Fnv1a);\n    fbBuilder.addInt64(22, _testhashs64Fnv1a);\n    fbBuilder.addUint64(23, _testhashu64Fnv1a);\n    fbBuilder.addOffset(24, testarrayofboolsOffset);\n    fbBuilder.addFloat32(25, _testf);\n    fbBuilder.addFloat32(26, _testf2);\n    fbBuilder.addFloat32(27, _testf3);\n    fbBuilder.addOffset(28, testarrayofstring2Offset);\n    fbBuilder.addOffset(29, testarrayofsortedstructOffset);\n    fbBuilder.addOffset(30, flexOffset);\n    fbBuilder.addOffset(31, test5Offset);\n    fbBuilder.addOffset(32, vectorOfLongsOffset);\n    fbBuilder.addOffset(33, vectorOfDoublesOffset);\n    fbBuilder.addOffset(34, parentNamespaceTestOffset);\n    fbBuilder.addOffset(35, vectorOfReferrablesOffset);\n    fbBuilder.addUint64(36, _singleWeakReference);\n    fbBuilder.addOffset(37, vectorOfWeakReferencesOffset);\n    fbBuilder.addOffset(38, vectorOfStrongReferrablesOffset);\n    fbBuilder.addUint64(39, _coOwningReference);\n    fbBuilder.addOffset(40, vectorOfCoOwningReferencesOffset);\n    fbBuilder.addUint64(41, _nonOwningReference);\n    fbBuilder.addOffset(42, vectorOfNonOwningReferencesOffset);\n    fbBuilder.addUint8(43, _anyUniqueType?.value);\n    fbBuilder.addOffset(44, anyUniqueOffset);\n    fbBuilder.addUint8(45, _anyAmbiguousType?.value);\n    fbBuilder.addOffset(46, anyAmbiguousOffset);\n    fbBuilder.addOffset(47, vectorOfEnumsOffset);\n    fbBuilder.addInt8(48, _signedEnum?.value);\n    fbBuilder.addOffset(49, testrequirednestedflatbufferOffset);\n    fbBuilder.addOffset(50, scalarKeySortedTablesOffset);\n    if (_nativeInline != null) {\n      fbBuilder.addStruct(51, _nativeInline!.finish(fbBuilder));\n    }\n    fbBuilder.addUint64(52, _longEnumNonEnumDefault?.value);\n    fbBuilder.addUint64(53, _longEnumNormalDefault?.value);\n    fbBuilder.addFloat32(54, _nanDefault);\n    fbBuilder.addFloat32(55, _infDefault);\n    fbBuilder.addFloat32(56, _positiveInfDefault);\n    fbBuilder.addFloat32(57, _infinityDefault);\n    fbBuilder.addFloat32(58, _positiveInfinityDefault);\n    fbBuilder.addFloat32(59, _negativeInfDefault);\n    fbBuilder.addFloat32(60, _negativeInfinityDefault);\n    fbBuilder.addFloat64(61, _doubleInfDefault);\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n\nclass TypeAliases {\n  TypeAliases._(this._bc, this._bcOffset);\n  factory TypeAliases(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<TypeAliases> reader = _TypeAliasesReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  int get i8 => const fb.Int8Reader().vTableGet(_bc, _bcOffset, 4, 0);\n  int get u8 => const fb.Uint8Reader().vTableGet(_bc, _bcOffset, 6, 0);\n  int get i16 => const fb.Int16Reader().vTableGet(_bc, _bcOffset, 8, 0);\n  int get u16 => const fb.Uint16Reader().vTableGet(_bc, _bcOffset, 10, 0);\n  int get i32 => const fb.Int32Reader().vTableGet(_bc, _bcOffset, 12, 0);\n  int get u32 => const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 14, 0);\n  int get i64 => const fb.Int64Reader().vTableGet(_bc, _bcOffset, 16, 0);\n  int get u64 => const fb.Uint64Reader().vTableGet(_bc, _bcOffset, 18, 0);\n  double get f32 => const fb.Float32Reader().vTableGet(_bc, _bcOffset, 20, 0.0);\n  double get f64 => const fb.Float64Reader().vTableGet(_bc, _bcOffset, 22, 0.0);\n  List<int>? get v8 =>\n      const fb.Int8ListReader().vTableGetNullable(_bc, _bcOffset, 24);\n  List<double>? get vf64 => const fb.ListReader<double>(\n    fb.Float64Reader(),\n  ).vTableGetNullable(_bc, _bcOffset, 26);\n\n  @override\n  String toString() {\n    return 'TypeAliases{i8: ${i8}, u8: ${u8}, i16: ${i16}, u16: ${u16}, i32: ${i32}, u32: ${u32}, i64: ${i64}, u64: ${u64}, f32: ${f32}, f64: ${f64}, v8: ${v8}, vf64: ${vf64}}';\n  }\n\n  TypeAliasesT unpack() => TypeAliasesT(\n    i8: i8,\n    u8: u8,\n    i16: i16,\n    u16: u16,\n    i32: i32,\n    u32: u32,\n    i64: i64,\n    u64: u64,\n    f32: f32,\n    f64: f64,\n    v8: v8?.toList(),\n    vf64: vf64?.toList(),\n  );\n\n  static int pack(fb.Builder fbBuilder, TypeAliasesT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass TypeAliasesT implements fb.Packable {\n  int i8;\n  int u8;\n  int i16;\n  int u16;\n  int i32;\n  int u32;\n  int i64;\n  int u64;\n  double f32;\n  double f64;\n  List<int>? v8;\n  List<double>? vf64;\n\n  TypeAliasesT({\n    this.i8 = 0,\n    this.u8 = 0,\n    this.i16 = 0,\n    this.u16 = 0,\n    this.i32 = 0,\n    this.u32 = 0,\n    this.i64 = 0,\n    this.u64 = 0,\n    this.f32 = 0.0,\n    this.f64 = 0.0,\n    this.v8,\n    this.vf64,\n  });\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    final int? v8Offset = v8 == null ? null : fbBuilder.writeListInt8(v8!);\n    final int? vf64Offset = vf64 == null\n        ? null\n        : fbBuilder.writeListFloat64(vf64!);\n    fbBuilder.startTable(12);\n    fbBuilder.addInt8(0, i8);\n    fbBuilder.addUint8(1, u8);\n    fbBuilder.addInt16(2, i16);\n    fbBuilder.addUint16(3, u16);\n    fbBuilder.addInt32(4, i32);\n    fbBuilder.addUint32(5, u32);\n    fbBuilder.addInt64(6, i64);\n    fbBuilder.addUint64(7, u64);\n    fbBuilder.addFloat32(8, f32);\n    fbBuilder.addFloat64(9, f64);\n    fbBuilder.addOffset(10, v8Offset);\n    fbBuilder.addOffset(11, vf64Offset);\n    return fbBuilder.endTable();\n  }\n\n  @override\n  String toString() {\n    return 'TypeAliasesT{i8: ${i8}, u8: ${u8}, i16: ${i16}, u16: ${u16}, i32: ${i32}, u32: ${u32}, i64: ${i64}, u64: ${u64}, f32: ${f32}, f64: ${f64}, v8: ${v8}, vf64: ${vf64}}';\n  }\n}\n\nclass _TypeAliasesReader extends fb.TableReader<TypeAliases> {\n  const _TypeAliasesReader();\n\n  @override\n  TypeAliases createObject(fb.BufferContext bc, int offset) =>\n      TypeAliases._(bc, offset);\n}\n\nclass TypeAliasesBuilder {\n  TypeAliasesBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  void begin() {\n    fbBuilder.startTable(12);\n  }\n\n  int addI8(int? i8) {\n    fbBuilder.addInt8(0, i8);\n    return fbBuilder.offset;\n  }\n\n  int addU8(int? u8) {\n    fbBuilder.addUint8(1, u8);\n    return fbBuilder.offset;\n  }\n\n  int addI16(int? i16) {\n    fbBuilder.addInt16(2, i16);\n    return fbBuilder.offset;\n  }\n\n  int addU16(int? u16) {\n    fbBuilder.addUint16(3, u16);\n    return fbBuilder.offset;\n  }\n\n  int addI32(int? i32) {\n    fbBuilder.addInt32(4, i32);\n    return fbBuilder.offset;\n  }\n\n  int addU32(int? u32) {\n    fbBuilder.addUint32(5, u32);\n    return fbBuilder.offset;\n  }\n\n  int addI64(int? i64) {\n    fbBuilder.addInt64(6, i64);\n    return fbBuilder.offset;\n  }\n\n  int addU64(int? u64) {\n    fbBuilder.addUint64(7, u64);\n    return fbBuilder.offset;\n  }\n\n  int addF32(double? f32) {\n    fbBuilder.addFloat32(8, f32);\n    return fbBuilder.offset;\n  }\n\n  int addF64(double? f64) {\n    fbBuilder.addFloat64(9, f64);\n    return fbBuilder.offset;\n  }\n\n  int addV8Offset(int? offset) {\n    fbBuilder.addOffset(10, offset);\n    return fbBuilder.offset;\n  }\n\n  int addVf64Offset(int? offset) {\n    fbBuilder.addOffset(11, offset);\n    return fbBuilder.offset;\n  }\n\n  int finish() {\n    return fbBuilder.endTable();\n  }\n}\n\nclass TypeAliasesObjectBuilder extends fb.ObjectBuilder {\n  final int? _i8;\n  final int? _u8;\n  final int? _i16;\n  final int? _u16;\n  final int? _i32;\n  final int? _u32;\n  final int? _i64;\n  final int? _u64;\n  final double? _f32;\n  final double? _f64;\n  final List<int>? _v8;\n  final List<double>? _vf64;\n\n  TypeAliasesObjectBuilder({\n    int? i8,\n    int? u8,\n    int? i16,\n    int? u16,\n    int? i32,\n    int? u32,\n    int? i64,\n    int? u64,\n    double? f32,\n    double? f64,\n    List<int>? v8,\n    List<double>? vf64,\n  }) : _i8 = i8,\n       _u8 = u8,\n       _i16 = i16,\n       _u16 = u16,\n       _i32 = i32,\n       _u32 = u32,\n       _i64 = i64,\n       _u64 = u64,\n       _f32 = f32,\n       _f64 = f64,\n       _v8 = v8,\n       _vf64 = vf64;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    final int? v8Offset = _v8 == null ? null : fbBuilder.writeListInt8(_v8!);\n    final int? vf64Offset = _vf64 == null\n        ? null\n        : fbBuilder.writeListFloat64(_vf64!);\n    fbBuilder.startTable(12);\n    fbBuilder.addInt8(0, _i8);\n    fbBuilder.addUint8(1, _u8);\n    fbBuilder.addInt16(2, _i16);\n    fbBuilder.addUint16(3, _u16);\n    fbBuilder.addInt32(4, _i32);\n    fbBuilder.addUint32(5, _u32);\n    fbBuilder.addInt64(6, _i64);\n    fbBuilder.addUint64(7, _u64);\n    fbBuilder.addFloat32(8, _f32);\n    fbBuilder.addFloat64(9, _f64);\n    fbBuilder.addOffset(10, v8Offset);\n    fbBuilder.addOffset(11, vf64Offset);\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n"
  },
  {
    "path": "dart/test/monster_test_my_game_generated.dart",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable, constant_identifier_names\n\nlibrary my_game;\n\nimport 'dart:typed_data' show Uint8List;\n\nimport 'package:flat_buffers/flat_buffers.dart' as fb;\n\nimport './include_test1_generated.dart';\nimport './monster_test_my_game.example2_generated.dart' as my_game_example2;\nimport './monster_test_my_game.example_generated.dart' as my_game_example;\n\nclass InParentNamespace {\n  InParentNamespace._(this._bc, this._bcOffset);\n  factory InParentNamespace(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<InParentNamespace> reader = _InParentNamespaceReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  @override\n  String toString() {\n    return 'InParentNamespace{}';\n  }\n\n  InParentNamespaceT unpack() => InParentNamespaceT();\n\n  static int pack(fb.Builder fbBuilder, InParentNamespaceT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass InParentNamespaceT implements fb.Packable {\n  @override\n  int pack(fb.Builder fbBuilder) {\n    fbBuilder.startTable(0);\n    return fbBuilder.endTable();\n  }\n\n  @override\n  String toString() {\n    return 'InParentNamespaceT{}';\n  }\n}\n\nclass _InParentNamespaceReader extends fb.TableReader<InParentNamespace> {\n  const _InParentNamespaceReader();\n\n  @override\n  InParentNamespace createObject(fb.BufferContext bc, int offset) =>\n      InParentNamespace._(bc, offset);\n}\n\nclass InParentNamespaceObjectBuilder extends fb.ObjectBuilder {\n  InParentNamespaceObjectBuilder();\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    fbBuilder.startTable(0);\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n"
  },
  {
    "path": "docs/README.md",
    "content": "# Documentation\n\nThis is the source of the FlatBuffers documentation, that is served at\nhttps://flatbuffers.dev.\n\n\n## Local Building\n\nThe documentation can be built and served locally during development, see <https://flatbuffers.dev/contributing/#local-development> for full details.\n\n__tl;dr__\n\nInstall:\n\n```\npip install mkdocs-material\npip install mkdocs-redirects\n```\n\nBuild and Serve:\n\n```\nmkdocs serve -f docs/mkdocs.yml\n```\n"
  },
  {
    "path": "docs/mkdocs.yml",
    "content": "site_name: FlatBuffers Docs\ndocs_dir: source\nsite_url: https://flatbuffers.dev\nrepo_name: google/FlatBuffers\nrepo_url: https://github.com/google/flatbuffers\nedit_uri: edit/master/docs/source/\ncopyright: Copyright &copy; 2025 Google\ntheme:\n  name: material\n  logo: assets/flatbuffers_logo.svg\n  icon:\n    repo: fontawesome/brands/github\n  custom_dir: overrides\n  palette:\n    # Palette toggle for light mode\n    - scheme: default\n      toggle:\n        icon: material/brightness-7\n        name: Switch to dark mode\n\n    # Palette toggle for dark mode\n    - scheme: slate\n      toggle:\n        icon: material/brightness-4\n        name: Switch to light mode\n\n  features:\n    # Allows code block annotations\n    - content.code.annotate\n\n    # Allows content tabs to link together\n    - content.tabs.link\n  \n    # Expand nav folders by default\n    - navigation.expand\n\n    # Enable the footer\n    - navigation.footer\n    \n    # Auto hide the header after scrolling\n    - header.autohide\n\n    - content.action.edit\n\nextra:\n  social:\n    - icon: fontawesome/brands/github\n      link: https://github.com/google/flatbuffers\n\n    - icon: fontawesome/brands/discord\n      link: https:///discord.gg/6qgKs3R\n\n    - icon: fontawesome/brands/x-twitter\n      link: https://twitter.com/dbaileychess\n\nplugins:\n  # Use redirects to update links from the original docs to the new ones.\n  #\n  # https://github.com/mkdocs/mkdocs-redirects\n  - redirects:\n      # Note the .html are suffixed with .md to avoid warnings. Got from \n      # https://github.com/mkdocs/mkdocs-redirects/issues/51#issuecomment-2408548029\n      redirect_maps:\n        'flatbuffers_guide_building.html.md': 'building.md'\n        'flatbuffers_guide_tutorial.html.md': 'tutorial.md'\n        'flatbuffers_guide_using_schema_compiler.html.md': 'flatc.md'\n        'flatbuffers_guide_writing_schema.html.md': 'schema.md'\n        'md__schemas.html.md': 'schema.md' # issue #8485\n        'flatbuffers_guide_use_c.html.md': 'languages/c.md'\n        'flatbuffers_guide_use_cpp.html.md': 'languages/cpp.md'\n        'flatbuffers_guide_use_c-sharp.html.md': 'languages/c_sharp.md'\n        'flatbuffers_guide_use_dart.html.md': 'languages/dart.md'\n        'flatbuffers_guide_use_go.html.md': 'languages/go.md'\n        'flatbuffers_guide_use_java.html.md': 'languages/java.md'\n        'flatbuffers_guide_use_javascript.html.md': 'languages/javascript.md'\n        'flatbuffers_guide_use_lobster.html.md': 'languages/lobster.md'\n        'flatbuffers_guide_use_lua.html.md': 'languages/lua.md'\n        'flatbuffers_guide_use_php.html.md': 'languages/php.md'\n        'flatbuffers_guide_use_python.html.md': 'languages/python.md'\n        'flatbuffers_guide_use_rust.html.md': 'languages/rust.md'\n        'flatbuffers_guide_use_swift.html.md': 'languages/swift.md'\n        'flatbuffers_guide_use_typescript.html.md': 'languages/typescript.md'\n        'flatbuffers_grpc_guide_use_cpp.html.md' : \"languages/cpp.md#grpc\"\n        'flatbuffers_support.html.md': 'support.md'\n        'flatbuffers_white_paper.html.md': 'white_paper.md'\n        'flatbuffers_grammar.html.md': 'grammar.md'\n        'flatbuffers_internals.html.md': 'internals.md'\n        'intermediate_representation.html.md': 'intermediate_representation.md'\n        'flatbuffers_benchmarks.html.md': 'benchmarks.md'\n        'flexbuffers.html.md': 'flexbuffers.md'\n        'contributing.html.md': 'contributing.md'\n\n\nmarkdown_extensions:\n  - admonition\n  - attr_list\n  - md_in_html\n  - pymdownx.critic\n  - pymdownx.details\n  - pymdownx.emoji:\n      emoji_index: !!python/name:material.extensions.emoji.twemoji\n      emoji_generator: !!python/name:material.extensions.emoji.to_svg\n  - pymdownx.snippets:\n      # Allows direct embedded of remote files\n      url_download: true\n  - pymdownx.superfences\n  - pymdownx.tabbed:\n      alternate_style: true\n      slugify: !!python/object/apply:pymdownx.slugs.slugify\n        kwds:\n          case: lower\n  - pymdownx.highlight:\n      extend_pygments_lang:\n        # PHP wasn't highlighting correctly. This is a work around found\n        # https://github.com/squidfunk/mkdocs-material/issues/138#issuecomment-2294025627\n        - name: php\n          lang: php\n          options:\n            startinline: true\n  - tables\n\n\n\nnav:\n  - Overview: \"index.md\"\n  - Quick Start: \"quick_start.md\"\n  - Tutorial: \"tutorial.md\"\n  - Compiler (flatc): \n    - Building: \"building.md\"\n    - Using: \"flatc.md\"\n  - Schema (.fbs): \n    - Overview: \"schema.md\"\n    - Evolution: \"evolution.md\"\n    - Grammar: \"grammar.md\"\n  - Language Guides:\n    - C: \"languages/c.md\"\n    - C++: \"languages/cpp.md\"\n    - C#: \"languages/c_sharp.md\"\n    - Dart: \"languages/dart.md\"\n    - Go: \"languages/go.md\"\n    - Java: \"languages/java.md\"\n    - JavaScript: \"languages/javascript.md\"\n    - Kotlin: \"languages/kotlin.md\"\n    - Lobster: \"languages/lobster.md\"\n    - Lua: \"languages/lua.md\"\n    - PHP: \"languages/php.md\"\n    - Python: \"languages/python.md\"\n    - Rust: \"languages/rust.md\"\n    - Swift: \"languages/swift.md\"\n    - TypeScript: \"languages/typescript.md\"\n  - Supported Configurations: \"support.md\"\n  - White Paper: \"white_paper.md\"\n  - Advanced:\n    - FlatBuffers Internals: \"internals.md\"\n    - Intermediate Representation: \"intermediate_representation.md\"\n    - Annotating Buffers (.afb): \"annotation.md\"\n    - Benchmarks: \"benchmarks.md\"\n  - FlexBuffers (Schema-less version): \"flexbuffers.md\"\n  - Contributing: \"contributing.md\"\n"
  },
  {
    "path": "docs/overrides/404.html",
    "content": "{% extends \"main.html\" %}\n\n<!-- Content -->\n{% block content %}\n  <h1>404 - Not found</h1>\n  <br>\n  FlatBuffers has migrated their documentation system recently.\n  \n  Please <a href=\"https://github.com/google/flatbuffers/issues/new?template=404-doc.md\">file an issue</a> indicating the broken link.\n{% endblock %}"
  },
  {
    "path": "docs/overrides/main.html",
    "content": "{% extends \"base.html\" %}\n"
  },
  {
    "path": "docs/source/CNAME",
    "content": "flatbuffers.dev"
  },
  {
    "path": "docs/source/annotation.md",
    "content": "# Annotating FlatBuffers\n\nThis provides a way to annotate flatbuffer binary data, byte-by-byte, with a\nschema. It is useful for development purposes and understanding the details of\nthe internal format.\n\n## Annotating\n\nGiven a `schema`, as either a plain-text (`.fbs`) or a binary schema (`.bfbs`),\nand `binary` file(s) that were created by the `schema`. You can annotate them\nusing:\n\n```sh\nflatc --annotate SCHEMA -- BINARY_FILES...\n```\n\nThis will produce a set of annotated files (`.afb` Annotated FlatBuffer)\ncorresponding to the input binary files.\n\n### Example\n\nTaken from the [tests/annotated_binary](https://github.com/google/flatbuffers/tree/master/tests/annotated_binary).\n\n```sh\ncd tests/annotated_binary\n../../flatc --annotate annotated_binary.fbs -- annotated_binary.bin\n```\n\nWhich will produce a `annotated_binary.afb` file in the current directory.\n\nThe `annotated_binary.bin` is the flatbufer binary of the data contained within\n`annotated_binary.json`, which was made by the following command:\n\n```sh\n..\\..\\flatc -b annotated_binary.fbs annotated_binary.json\n```\n\n## .afb Text Format\n\nCurrently there is a built-in text-based format for outputting the annotations.\nA full example is shown here:\n[`annotated_binary.afb`](https://github.com/google/flatbuffers/blob/master/tests/annotated_binary/annotated_binary.afb)\n\nThe data is organized as a table with fixed [columns](#columns) grouped into\nBinary [sections](#binary-sections) and [regions](#binary-regions), starting\nfrom the beginning of the binary (offset `0`).\n\n### Columns\n\nThe columns are as follows:\n\n1. The offset from the start of the binary, expressed in hexadecimal format\n   (e.g. `+0x003c`).\n\n    The prefix `+` is added to make searching for the offset (compared to some\n    random value) a bit easier.\n\n2. The raw binary data, expressed in hexadecimal format.\n\n    This is in the little endian format the buffer uses internally and what you\n    would see with a normal binary text viewer.\n\n3. The type of the data.\n\n    This may be the type specified in the schema or some internally defined\n    types:\n\n\n    | Internal Type | Purpose                                            |\n    |---------------|----------------------------------------------------|\n    | `VOffset16`   | Virtual table offset, relative to the table offset |\n    | `UOffset32`   | Unsigned offset, relative to the current offset    |\n    | `SOffset32`   | Signed offset, relative to the current offset      |\n\n\n4. The value of the data.\n\n    This is shown in big endian format that is generally written for humans to\n    consume (e.g. `0x0013`). As well as the \"casted\" value (e.g. `0x0013 `is\n    `19` in decimal) in parentheses.\n\n5. Notes about the particular data.\n\n    This describes what the data is about, either some internal usage, or tied\n    to the schema.\n\n### Binary Sections\n\nThe file is broken up into Binary Sections, which are comprised of contiguous\n[binary regions](#binary-regions) that are logically grouped together. For\nexample, a binary section may be a single instance of a flatbuffer `Table` or\nits `vtable`. The sections may be labelled with the name of the associated type,\nas defined in the input schema.\n\nAn example of a `vtable` Binary Section that is associated with the user-defined\n`AnnotateBinary.Bar` table.\n\n```\nvtable (AnnotatedBinary.Bar):\n  +0x00A0 | 08 00      | uint16_t   | 0x0008 (8)   | size of this vtable\n  +0x00A2 | 13 00      | uint16_t   | 0x0013 (19)  | size of referring table\n  +0x00A4 | 08 00      | VOffset16  | 0x0008 (8)   | offset to field `a` (id: 0)\n  +0x00A6 | 04 00      | VOffset16  | 0x0004 (4)   | offset to field `b` (id: 1)\n```\n\nThese are purely annotative, there is no embedded information about these\nregions in the flatbuffer itself.\n\n### Binary Regions\n\nBinary regions are contiguous bytes regions that are grouped together to form\nsome sort of value, e.g. a `scalar` or an array of scalars. A binary region may\nbe split up over multiple text lines, if the size of the region is large.\n\n#### Annotation Example\n\nLooking at an example binary region:\n\n```\nvtable (AnnotatedBinary.Bar):\n  +0x00A0 | 08 00      | uint16_t   | 0x0008 (8)   | size of this vtable\n```\n\nThe first column (`+0x00A0`) is the offset to this region from the beginning of\nthe buffer.\n\nThe second column are the raw bytes (hexadecimal) that make up this region.\nThese are expressed in the little-endian format that flatbuffers uses for the\nwire format.\n\nThe third column is the type to interpret the bytes as. For the above example,\nthe type is `uint16_t` which is a 16-bit unsigned integer type.\n\nThe fourth column shows the raw bytes as a compacted, big-endian value. The raw\nbytes are duplicated in this fashion since it is more intuitive to read the data\nin the big-endian format (e.g., `0x0008`). This value is followed by the decimal\nrepresentation of the value (e.g., `(8)`). For strings, the raw string value is\nshown instead.\n\nThe fifth column is a textual comment on what the value is. As much metadata as\nknown is provided.\n\n### Offsets\n\nIf the type in the 3rd column is of an absolute offset (`SOffet32` or\n`Offset32`), the fourth column also shows an `Loc: +0x025A` value which shows\nwhere in the binary this region is pointing to. These values are absolute from\nthe beginning of the file, their calculation from the raw value in the 4th\ncolumn depends on the context.\n"
  },
  {
    "path": "docs/source/benchmarks.md",
    "content": "C++ Benchmarks    {#flatbuffers_benchmarks}\n==========\n\nComparing against other serialization solutions, running on Windows 7\n64bit. We use the LITE runtime for Protocol Buffers (less code / lower\noverhead), Rapid JSON (one of the fastest C++ JSON parsers around),\nand pugixml, also one of the fastest XML parsers.\n\nWe also compare against code that doesn't use a serialization library\nat all (the column \"Raw structs\"), which is what you get if you write\nhardcoded code that just writes structs. This is the fastest possible,\nbut of course is not cross platform nor has any kind of forwards /\nbackwards compatibility.\n\nWe compare against Flatbuffers with the binary wire format (as\nintended), and also with JSON as the wire format with the optional JSON\nparser (which, using a schema, parses JSON into a binary buffer that can\nthen be accessed as before).\n\nThe benchmark object is a set of about 10 objects containing an array, 4\nstrings, and a large variety of int/float scalar values of all sizes,\nmeant to be representative of game data, e.g. a scene format.\n\n|                                                        | FlatBuffers (binary)  | Protocol Buffers LITE | Rapid JSON            | FlatBuffers (JSON)     | pugixml               | Raw structs           |\n|--------------------------------------------------------|-----------------------|-----------------------|-----------------------|------------------------| ----------------------| ----------------------|\n| Decode + Traverse + Dealloc (1 million times, seconds) | 0.08                  | 302                   | 583                   | 105                    | 196                   | 0.02                  |\n| Decode / Traverse / Dealloc (breakdown)                | 0 / 0.08 / 0          | 220 / 0.15 / 81       | 294 / 0.9 / 287       | 70 / 0.08 / 35         | 41 / 3.9 / 150        | 0 / 0.02 / 0          |\n| Encode (1 million times, seconds)                      | 3.2                   | 185                   | 650                   | 169                    | 273                   | 0.15                  |\n| Wire format size (normal / zlib, bytes)                | 344 / 220             | 228 / 174             | 1475 / 322            | 1029 / 298             | 1137 / 341            | 312 / 187             |\n| Memory needed to store decoded wire (bytes / blocks)   | 0 / 0                 | 760 / 20              | 65689 / 4             | 328 / 1                | 34194 / 3             | 0 / 0                 |\n| Transient memory allocated during decode (KB)          | 0                     | 1                     | 131                   | 4                      | 34                    | 0                     |\n| Generated source code size (KB)                        | 4                     | 61                    | 0                     | 4                      | 0                     | 0                     |\n| Field access in handwritten traversal code             | typed accessors       | typed accessors       | manual error checking | typed accessors        | manual error checking | typed but no safety   |\n| Library source code (KB)                               | 15                    | some subset of 3800   | 87                    | 43                     | 327                   | 0                     |\n\n### Some other serialization systems we compared against but did not benchmark (yet), in rough order of applicability:\n\n-   Cap'n'Proto promises to reduce Protocol Buffers much like FlatBuffers does,\n    though with a more complicated binary encoding and less flexibility (no\n    optional fields to allow deprecating fields or serializing with missing\n    fields for which defaults exist).\n    It currently also isn't fully cross-platform portable (lack of VS support).\n-   msgpack: has very minimal forwards/backwards compatibility support when used\n    with the typed C++ interface. Also lacks VS2010 support.\n-   Thrift: very similar to Protocol Buffers, but appears to be less efficient,\n    and have more dependencies.\n-   YAML: a superset of JSON and otherwise very similar. Used by e.g. Unity.\n-   C# comes with built-in serialization functionality, as used by Unity also.\n    Being tied to the language, and having no automatic versioning support\n    limits its applicability.\n-   Project Anarchy (the free mobile engine by Havok) comes with a serialization\n    system, that however does no automatic versioning (have to code around new\n    fields manually), is very much tied to the rest of the engine, and works\n    without a schema to generate code (tied to your C++ class definition).\n\n### Code for benchmarks\n\nCode for these benchmarks sits in `benchmarks/` in git branch `benchmarks`.\nIt sits in its own branch because it has submodule dependencies that the main\nproject doesn't need, and the code standards do not meet those of the main\nproject. Please read `benchmarks/cpp/README.txt` before working with the code.\n\n<br>\n"
  },
  {
    "path": "docs/source/building.md",
    "content": "# Building\n\n## Building with CMake\n\nThe distribution main build system is configured by\n[`cmake`](https://www.cmake.org) which allows you to build the project for any\nplatform.\n\n### Configuration\n\nUse `cmake` to configure a project based on your environment and platform.\n\n=== \"Unix\"\n\n    ```sh\n    cmake -G \"Unix Makefiles\" -DCMAKE_BUILD_TYPE=Release\n    ```\n\nTo use `clang` instead of `gcc` you may need to set prepend some environment\nvariables e.g. `CC=/usr/bin/clang CXX=/usr/bin/clang++ cmake -G \"Unix\nMakeFiles\"`\n\n=== \"Windows\"\n\n    ```sh\n    cmake -G \"Visual Studio 17 2022\" -DCMAKE_BUILD_TYPE=Release\n    ```\n\n=== \"MacOS\"\n\n    ```sh\n    cmake -G \"Xcode\" -DCMAKE_BUILD_TYPE=Release\n    ```\n\n#### Strict Mode\n\nBy default, `cmake` will configure targets to **not** build with strict warnings\non (e.g. `-Werror` or `/WX`). This may cause into issues when submitting code\nchanges since our CI requires the code to compile in strict mode.\n\nTo enable the extra warnings, turn on strict mode with the\n`FLATBUFFERS_STRICT_MODE` cmake option.\n\n```cmake\ncmake -DFLATBUFFERS_STRICT_MODE=ON\n```\n\n\n### Building\n\nOnce the project files are generated, build as normal for your platform.\n\n=== \"Unix\"\n\n    ```sh\n    make -j\n    ```\n\n=== \"Windows\"\n\n    ```sh\n    msbuild.exe FlatBuffers.sln\n    ```\n\n=== \"MacOS\"\n\n    ```sh\n    xcodebuild -toolchain clang -configuration Release\n    ```\n\n\n\n\n\n\n## Building with Bazel\n\nYou can use [Bazelisk](https://github.com/bazelbuild/bazelisk) to manage your Bazel environment.\nFor Swift support, you also need Clang and [Swift SDK](https://download.swift.org/).\n\n```sh\ncurl -sL --fail https://github.com/bazelbuild/bazelisk/releases/download/v1.25.0/bazelisk-linux-amd64 -o bazelisk && chmod +x bazelisk\nsudo apt install -y clang\nSWIFT_VERSION=\"6.0.3\"\ncurl -L https://download.swift.org/swift-${SWIFT_VERSION}-release/debian12/swift-${SWIFT_VERSION}-RELEASE/swift-${SWIFT_VERSION}-RELEASE-debian12.tar.gz | tar xz\nCC=clang PATH=$PATH:$(pwd)/swift-${SWIFT_VERSION}-RELEASE-debian12/usr/bin bazel build //...\nCC=clang PATH=$PATH:$(pwd)/swift-${SWIFT_VERSION}-RELEASE-debian12/usr/bin bazel test //...\n```\n\nIf you are unsure which versions to use, check our CI config at `.bazelci/presubmit.yml`.\n\n## Building with Conan\n\nYou can download and install flatbuffers using the [Conan](https://conan.io/) dependency manager:\n\n    conan install --requires=\"flatbuffers/[*]\" --build=missing\n\nThe flatbuffers package in Conan Center is maintained by\n[ConanCenterIndex](https://github.com/conan-io/conan-center-index) community.\nIf the version is out of date or the package does not work,\nplease create an issue or pull request on the [Conan Center Index repository](https://github.com/conan-io/conan-center-index).\n\n## Building with VCPKG\n\nYou can download and install flatbuffers using the [vcpkg](https://github.com/Microsoft/vcpkg/) dependency manager:\n\n    git clone https://github.com/Microsoft/vcpkg.git\n    cd vcpkg\n    ./bootstrap-vcpkg.sh\n    ./vcpkg integrate install\n    ./vcpkg install flatbuffers\n\nThe flatbuffers port in vcpkg is kept up to date by Microsoft team members and community contributors.\nIf the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository.\n\n\n\n## Building for Android\n\nThere is a `flatbuffers/android` directory that contains all you need to build\nthe test executable on android (use the included `build_apk.sh` script, or use\n`ndk_build` / `adb` etc. as usual). Upon running, it will output to the log\nif tests succeeded or not.\n\nYou may also run an android sample from inside the `flatbuffers/samples`, by\nrunning the `android_sample.sh` script. Optionally, you may go to the\n`flatbuffers/samples/android` folder and build the sample with the\n`build_apk.sh` script or `ndk_build` / `adb` etc.\n\n## Using FlatBuffers in your own projects\n\nFor C++, there is usually no runtime to compile, as the code consists of a\nsingle header, `include/flatbuffers/flatbuffers.h`. You should add the\n`include` folder to your include paths. If you wish to be\nable to load schemas and/or parse text into binary buffers at runtime,\nyou additionally need the other headers in `include/flatbuffers`. You must\nalso compile/link `src/idl_parser.cpp` (and `src/idl_gen_text.cpp` if you\nalso want to be able convert binary to text).\n\nTo see how to include FlatBuffers in any of our supported languages, please\nview the [Tutorial](tutorial.md) and select your appropriate\nlanguage using the radio buttons.\n\n### Using in CMake-based projects\nIf you want to use FlatBuffers in a project which already uses CMake, then a more\nrobust and flexible approach is to build FlatBuffers as part of that project directly.\nThis is done by making the FlatBuffers source code available to the main build\nand adding it using CMake's `add_subdirectory()` command. This has the\nsignificant advantage that the same compiler and linker settings are used\nbetween FlatBuffers and the rest of your project, so issues associated with using\nincompatible libraries (eg debug/release), etc. are avoided. This is\nparticularly useful on Windows.\n\nSuppose you put FlatBuffers source code in directory `${FLATBUFFERS_SRC_DIR}`.\nTo build it as part of your project, add following code to your `CMakeLists.txt` file:\n```cmake\n# Add FlatBuffers directly to our build. This defines the `flatbuffers` target.\nadd_subdirectory(${FLATBUFFERS_SRC_DIR}\n                 ${CMAKE_CURRENT_BINARY_DIR}/flatbuffers-build\n                 EXCLUDE_FROM_ALL)\n\n# Now simply link against flatbuffers as needed to your already declared target.\n# The flatbuffers target carry header search path automatically if CMake > 2.8.11.\ntarget_link_libraries(own_project_target PRIVATE flatbuffers)\n```\nWhen build your project the `flatbuffers` library will be compiled and linked\nto a target as part of your project.\n\n#### Override default depth limit of nested objects\nTo override [the depth limit of recursion](languages/cpp.md),\nadd this directive:\n```cmake\nset(FLATBUFFERS_MAX_PARSING_DEPTH 16)\n```\nto `CMakeLists.txt` file before `add_subdirectory(${FLATBUFFERS_SRC_DIR})` line.\n\n## Downloading binaries\nYou can download the binaries from the\n[GitHub release page](https://github.com/google/flatbuffers/releases).\n\nWe generate [SLSA3 signatures](http://slsa.dev) using the OpenSSF's [slsa-framework/slsa-github-generator](https://github.com/slsa-framework/slsa-github-generator). To verify the binaries:\n1. Install the verification tool from [slsa-framework/slsa-verifier#installation](https://github.com/slsa-framework/slsa-verifier#installation)\n1. Download the file named `attestation.intoto.jsonl` from the GitHub release\n1. Run:\n```shell\n$ slsa-verifier -artifact-path <downloaded.zip> -provenance attestation.intoto.jsonl -source github.com/google/flatbuffers -tag <version>\n  PASSED: Verified SLSA provenance\n```\n"
  },
  {
    "path": "docs/source/contributing.md",
    "content": "# Contributing\n\nWe encourage community contributions to FlatBuffers through pull requests at the\nmain\n[http://github.com/google/flatbuffers](http://github.com/google/flatbuffers)\nrepository.\n\n!!! note\n\n    The FlatBuffers project is not staffed by any full time Google employee, and\n    is managed by a small team of 20%ers. So response time and expertise vary.\n\n## Before you contribute\n\nBefore we can use your contributions, you __must__ sign one of the following license agreements. The agreements are self-served at the following links.\n\nOur code review process will automatically check if you have signed the CLA, so\ndon't fret. Though it may be prudent to check before spending a lot of time on\ncontribution.\n\n### Individual Contributions\n\nFor individuals, the [Google Individual\nContributor License Agreement\n(CLA)](https://cla.developers.google.com/about/google-individual?csw=1) which is\nself served at the link. The CLA is required since you own the copyright to your\nchanges, even after your contribution becomes part of our codebase, so we need\nyour permission to use and distribute your code.\n\n### Corporate Contributions\n\nContributions made by corporations are covered by the [Google Software Grant and\nCorporate Contributor License\nAgreement](https://cla.developers.google.com/about/google-corporate).\n\n## Code Reviews\n\nAll submissions require a code review via Github Pull Requests.\n\n1. Please adhere to the [Google Style Guide](https://google.github.io/styleguide/cppguide.html) for the language(s) you are submitting in.\n2. Keep PRs small and focused. Its good practice and makes it more likely your PR will be approved.\n3. Please add tests if possible.\n4. Include descriptive commit messages and context to the change/issues fixed.\n\n## Documentation\n\nFlatBuffers uses [MkDocs](https://www.mkdocs.org/) to generate the static\ndocumentation pages served at\n[https://flatbuffers.dev](https://flatbuffers.dev). Specifically, we use the\n[Material for MkDocs](https://squidfunk.github.io/mkdocs-material/) framework.\n\nThe documentation source is contained in the main repo under the\n[docs/](https://github.com/google/flatbuffers/tree/master/docs) directory. This\n[automatically](https://github.com/google/flatbuffers/blob/46cc3d6432da17cca7694777dcce12e49dd48387/.github/workflows/docs.yml#L6-L11) get built and published when the commit is made.\n\n### Local Development\n\nWe encourage contributors to keep the documentation up-to-date as well, and it\nis easy to with `MkDocs` local building and serving tools.\n\nFirst install `mkdocs-material` (see\n[Installation](https://squidfunk.github.io/mkdocs-material/getting-started/) for\nother ways)\n\n```\npip install mkdocs-material\npip install mkdocs-redirects\n```\n\nThen, in the `root` directory of flatbuffers, run\n\n```\nmkdocs serve -f docs/mkdocs.yml\n```\n\nThis will continually watch the repo for changes to the documentation and serve\nthe rendered pages locally.\n\nSubmit your documentation changes with your code changes and they will\nautomatically get published when your code is submitted.\n"
  },
  {
    "path": "docs/source/evolution.md",
    "content": "# Evolution\n\nFlatBuffers enables the [schema](schema.md) to evolve over time while still\nmaintaining forwards and backwards compatibility with old flatbuffers.\n\nSome rules must be followed to ensure the evolution of a schema is valid.\n\n## Rules\n\nAdding new tables, vectors, structs to the schema is always allowed. Its only\nwhen you add a new field to a [`table`](schema.md#tables) that certain rules\nmust be followed.\n\n### Addition\n\n**New fields MUST be added to the end of the table definition.**\n\nThis allows older data to still be read correctly (giving you the default value\nof the added field if accessed).\n\nOlder code will simply ignore the new field in the flatbuffer.\n\nYou can ignore this rule if you use the `id` attribute on all the fields of a\ntable.\n\n### Removal\n\n**You MUST not remove a field from the schema, even if you don't use it\nanymore.** You simply stop writing them to the buffer.\n\nIts encouraged to mark the field deprecated by adding the `deprecated`\nattribute. This will skip the generation of accessors and setters in the code,\nto enforce the field not to be used any more.\n\n### Name Changes\n\nIts generally OK to change the name of tables and fields, as these are not\nserialized to the buffer. It may break code that would have to be refactored\nwith the updated name.\n\n## Examples\n\nThe following examples uses a base schema and attempts to evolve it a few times.\nThe versions are tracked by `V1`, `V2`, etc.. and `CodeV1` means code compiled\nagainst the `V1` schema.\n\n### Table Evolution\n\nLets start with a simple table `T` with two fields.\n\n```c++ title=\"Schema V1\"\ntable T {\n  a:int;\n  b:int;\n}\n```\n\n=== \"Well Evolved\"\n\n    First lets extend the table with a new field.\n\n    ```c++ title=\"Schema V2\"\n    table T {\n      a:int;\n      b:int;\n      c:int;\n    }\n    ```\n\n    This is OK. `CodeV1` reading `V2` data will simply ignore the presence of the\n    new field `c`. `CodeV2` reading `V1` data will get a default value (0) when\n    reading `c`.\n\n    ```c++ title=\"Schema V3\"\n    table T {\n      a:int (deprecated);\n      b:int;\n      c:int;\n    }\n    ```\n\n    This is OK, removing field `a` via deprecation. `CodeV1`, `CodeV2` and `CodeV3`\n    reading `V3` data will now always get the default value of `a`, since it is not\n    present. `CodeV3` cannot write `a` anymore. `CodeV3` reading old data (`V1` or\n    `V2`) will not be able to access the field anymore, since no generated accessors\n    are omitted.\n\n=== \"Improper Addition\"\n\n    Add a new field, but this time at the beginning.\n\n    ```c++ title=\"Schema V2\"\n    table T {\n      c:int;\n      a:int;\n      b:int;\n    }\n    ```\n\n    This is NOT OK, as it makes `V2` incompatible. `CodeV1` reading `V2` data\n    will access `a` but will read `c` data.\n\n    `CodeV2` reading `V1` data will access `c` but will read `a` data.\n\n=== \"Improper Deletion\"\n\n    Remove a field from the schema.\n\n    ```c++ title=\"Schema V2\"\n    table T {\n      b:int;\n    }\n    ```\n\n    This is NOT OK. `CodeV1` reading `V2` data will access `a` but read `b` data.\n\n    `CodeV2` reading `V1` data will access `b` but will read `a` data.\n\n=== \"Proper Reordering\"\n\n    Lets add a new field to the beginning, but use `id` attributes.\n\n    ```c++ title=\"Schema V2\"\n    table T {\n      c:int (id: 2);\n      a:int (id: 0);\n      b:int (id: 1);\n    }\n    ```\n\n    This is OK. This adds the a new field in the beginning, but because all the\n    `id` attributes were added, it is OK.\n\n=== \"Changing Types\"\n\n    Let change the types of the fields.\n\n    ```c++ title=\"Schema V2\"\n    table T {\n      a:uint;\n      b:uint;\n    }\n    ```\n\n    This is MAYBE OK, and only in the case where the type change is the same\n    width. This is tricky if the `V1` data contained any negative numbers. So\n    this should be done with care.\n\n=== \"Changing Defaults\"\n\n    Lets change the default values of the existing fields.\n\n    ```c++ title=\"Schema V2\"\n    table T {\n      a:int = 1;\n      b:int = 2;\n    }\n    ```\n\n    This is NOT OK. Any `V1` data that did not have a value written to the\n    buffer relied on generated code to provide the default value.\n\n    There MAY be cases where this is OK, if you control all the producers and\n    consumers, and you can update them in tandem.\n\n=== \"Renaming Fields\"\n\n    Lets change the name of the fields\n\n    ```c++ title=\"Schema V2\"\n    table T {\n      aa:int;\n      bb:int;\n    }\n    ```\n\n    This is generally OK. You've renamed fields will break all code and JSON\n    files that use this schema, but you can refactor those without affecting the\n    binary data, since the binary only address fields by id and offset, not by\n    names.\n\n### Union Evolution\n\nLets start with a simple union `U` with two members.\n\n```c++ title=\"Schema V1\"\nunion U {\n  A,\n  B\n}\n```\n\n=== \"Well Evolved\"\n\n    Lets add a another variant to the end.\n\n    ```c++ title=\"Schema V2\"\n    union U {\n      A,\n      B,\n      another_a: A\n    }\n    ```\n\n    This is OK. `CodeV1` will not recognize the `another_a`.\n\n=== \"Improper Evolved\"\n\n    Lets add a another variant to the middle.\n\n    ```c++ title=\"Schema V2\"\n    union U {\n      A,\n      another_a: A,\n      B\n    }\n    ```\n\n    This is NOT OK. `CodeV1` reading `V2` data will interpret `B` as `another_a`.\n    `CodeV2` reading `V1` data will interpret `another_a` as `B`.\n\n=== \"Evolved With Discriminant\"\n\n    Lets add a another variant to the middle, this time adding a union \"discriminant\".\n\n    ```c++ title=\"Schema V2\"\n    union U {\n      A = 1,\n      another_a: A = 3,\n      B = 2\n    }\n    ```\n\n    This is OK. Its like you added it to the end, but using the discriminant\n    value to physically place it elsewhere in the union.\n\n## Version Control\n\nFlatBuffers relies on new field declarations being added at the end, and earlier\ndeclarations to not be removed, but be marked deprecated when needed. We think\nthis is an improvement over the manual number assignment that happens in\nProtocol Buffers (and which is still an option using the `id` attribute\nmentioned above).\n\nOne place where this is possibly problematic however is source control. If user\n`A` adds a field, generates new binary data with this new schema, then tries to\ncommit both to source control after user `B` already committed a new field also,\nand just auto-merges the schema, the binary files are now invalid compared to\nthe new schema.\n\nThe solution of course is that you should not be generating binary data before\nyour schema changes have been committed, ensuring consistency with the rest of\nthe world. If this is not practical for you, use explicit field `id`s, which\nshould always generate a merge conflict if two people try to allocate the same\nid.\n\n## Checking Conformity\n\nTo check that schema are properly evolved, the [`flatc`](flatc.md) compiler has\na [option](flatc.md#additional-options) to do just that:\n\n```sh\n--conform FILE\n```\n\nWhere `FILE` is the base schema the rest of the input schemas must evolve from.\nIt returns `0` if they are properly evolved, otherwise returns a non-zero value\nand provides errors on the reason why the schema are not properly evolved.\n\nAs an example, the following checks if `schema_v2.fbs` is properly evolved from\n`schema_v1.fbs`.\n\n```sh\nflatc --conform schema_v1.fbs schema_v2.fbs\n```\n\n"
  },
  {
    "path": "docs/source/flatc.md",
    "content": "# FlatBuffers Compiler (`flatc`)\n\nThe main compiler for FlatBuffers is called `flatc` and is used to convert\nschema definitions into generated code files for a variety of languages.\n\nAfter [building](building.md) `flatc`, it is used as follows:\n\n```sh\nflatc [ GENERATOR_OPTIONS ] [ -o PATH ] [- I PATH ]\n  FILES...\n  [ -- BINARY_FILES... ]\n```\n\n* The `GENERATOR_OPTIONS` specify the language(s) to compile code for as well as\nvarious features to enable/disable.\n\n* The `-o PATH` specifies the path where the generated files are placed. It\ndefaults to the current path if not specified.\n\n* The `-I PATH` specifies the paths where included schema files are located. It\n  defaults to the current path if not specified.\n\n## Input Files\n\n`FILES...` specifies one or more schema or data files to process. They are\nprocessed in the order provided.\n\n### Schema Files\n\nFor schema files, language specifiers indicate what languages to generate code\nfor.\n\n  * `--cpp`: C++\n  * `--java`: Java\n  * `--kotlin`: Kotlin\n  * `--csharp`: C#\n  * `--go`: Golang\n  * `--python`: Python\n  * `--js`: JavaScript\n  * `--ts`: TypeScript\n  * `--php`: PHP\n  * `--dart`: Dart\n  * `--lua`: Lua\n  * `--lobster`: Lobster\n  * `--rust`: Rust\n  * `--swift`: Swift\n  * `--nim`: Nim\n\nAdditionally, adding:\n\n  * `--grpc` Will generate RPC stub code for gRPC (not available in all\n    languages)\n\n### Data Files\n\nIf `FILES...` contain data files, they can be exported to either a binary or\nJSON representation.\n\n* `--binary`, `-b`: Generate a binary file containing a serialized flatbuffer.\n* `--json`, `-j`: Generate JSON file from a serialized flatbuffer.\n\nBoth options require the corresponding schema file to be included first in the\nlist of `FILES...`.\n\n=== \"To Binary\"\n\n    To serialize the JSON data in `mydata.json` using the schema `myschema.fbs`:\n\n    ```sh\n    flatc --binary myschema.fbs mydata.json\n    ```\n\n    This will generate a `mydata_wire.bin` file containing the serialized\n    flatbuffer data.\n\n=== \"To JSON\"\n\n    To convert the serialized binary flatbuffer `mydata.bin` using the schema\n    `myschema.fbs` to JSON:\n\n    ```sh\n    flatc --json myschema.fbs -- mydata.bin\n    ```\n\n    This will generate a `mydata.json` file. If there is no\n    [`file_identifier`](schema.md/#file-identification-and-extension) defined\n    for this schema, you will need to use the `--raw-binary` option.\n\n### Additional options\n\n-   `-o PATH` : Output all generated files to PATH (either absolute, or\n    relative to the current directory). If omitted, PATH will be the\n    current directory. PATH should end in your systems path separator,\n    e.g. `/` or `\\`.\n\n-   `-I PATH` : when encountering `include` statements, attempt to load the\n    files from this path. Paths will be tried in the order given, and if all\n    fail (or none are specified) it will try to load relative to the path of\n    the schema file being parsed.\n\n-   `-M` : Print make rules for generated files.\n\n-   `--strict-json` : Require & generate strict JSON (field names are enclosed\n    in quotes, no trailing commas in tables/vectors). By default, no quotes are\n    required/generated, and trailing commas are allowed.\n\n-   `--allow-non-utf8` : Pass non-UTF-8 input through parser and emit nonstandard\n    \\x escapes in JSON. (Default is to raise parse error on non-UTF-8 input.)\n\n-   `--natural-utf8` : Output strings with UTF-8 as human-readable strings.\n     By default, UTF-8 characters are printed as \\uXXXX escapes.\"\n\n-   `--defaults-json` : Output fields whose value is equal to the default value\n    when writing JSON text.\n\n-   `--no-prefix` : Don't prefix enum values in generated C++ by their enum\n    type.\n\n-   `--scoped-enums` : Use C++11 style scoped and strongly typed enums in\n    generated C++. This also implies `--no-prefix`.\n\n-   `--no-emit-min-max-enum-values` : Disable generation of MIN and MAX\n    enumerated values for scoped enums and prefixed enums.\n\n-   `--gen-includes` : (deprecated), this is the default behavior.\n                       If the original behavior is required (no include\n\t                   statements) use `--no-includes.`\n\n-   `--no-includes` : Don't generate include statements for included schemas the\n    generated file depends on (C++ / Python).\n\n-   `--gen-mutable` : Generate additional non-const accessors for mutating\n    FlatBuffers in-place.\n\n-   `--gen-onefile` : Generate a single output file for C#, Go, Java, Kotlin and Python.\n\n-   `--gen-name-strings` : Generate type name functions for C++.\n\n-   `--gen-object-api` : Generate an additional object-based API. This API is\n    more convenient for object construction and mutation than the base API,\n    at the cost of efficiency (object allocation). Recommended only to be used\n    if other options are insufficient.\n\n-   `--gen-compare`  :  Generate operator== for object-based API types.\n\n-   `--gen-nullable` : Add Clang \\_Nullable for C++ pointer. or @Nullable for Java.\n\n-   `--gen-generated` : Add @Generated annotation for Java.\n\n-   `--gen-jvmstatic` : Add @JvmStatic annotation for Kotlin methods\n    in companion object for interop from Java to Kotlin.\n\n-   `--gen-all` : Generate not just code for the current schema files, but\n    for all files it includes as well. If the language uses a single file for\n    output (by default the case for C++ and JS), all code will end up in\n    this one file.\n\n-   `--cpp-include` : Adds an #include in generated file\n\n-   `--cpp-ptr-type T` : Set object API pointer type (default std::unique_ptr)\n\n-   `--cpp-str-type T` : Set object API string type (default std::string)\n    T::c_str(), T::length() and T::empty() must be supported.\n    The custom type also needs to be constructible from std::string (see the\n\t--cpp-str-flex-ctor option to change this behavior).\n\n-   `--cpp-str-flex-ctor` : Don't construct custom string types by passing\n    std::string from Flatbuffers, but (char* + length). This allows efficient\n\tconstruction of custom string types, including zero-copy construction.\n\n-   `--no-cpp-direct-copy` : Don't generate direct copy methods for C++\n    object-based API.\n\n-   `--cpp-std CPP_STD` : Generate a C++ code using features of selected C++ standard.\n     Supported `CPP_STD` values:\n    * `c++0x` - generate code compatible with old compilers (VS2010),\n    * `c++11` - use C++11 code generator (default),\n    * `c++17` - use C++17 features in generated code (experimental).\n\n-   `--object-prefix` : Customise class prefix for C++ object-based API.\n\n-   `--object-suffix` : Customise class suffix for C++ object-based API.\n\n-   `--go-namespace` : Generate the overrided namespace in Golang.\n\n-   `--go-import` : Generate the overrided import for flatbuffers in Golang.\n     (default is \"github.com/google/flatbuffers/go\").\n\n-   `--raw-binary` : Allow binaries without a file_indentifier to be read.\n    This may crash flatc given a mismatched schema.\n\n-   `--size-prefixed` : Input binaries are size prefixed buffers.\n\n-   `--proto`: Expect input files to be .proto files (protocol buffers).\n    Output the corresponding .fbs file.\n    Currently supports: `package`, `message`, `enum`, nested declarations,\n    `import` (use `-I` for paths), `extend`, `oneof`, `group`.\n    Does not support, but will skip without error: `option`, `service`,\n    `extensions`, and most everything else.\n\n-   `--oneof-union` : Translate .proto oneofs to flatbuffer unions.\n\n-   `--grpc` : Generate GRPC interfaces for the specified languages.\n\n-   `--schema`: Serialize schemas instead of JSON (use with -b). This will\n    output a binary version of the specified schema that itself corresponds\n    to the reflection/reflection.fbs schema. Loading this binary file is the\n    basis for reflection functionality.\n\n-   `--bfbs-comments`: Add doc comments to the binary schema files.\n\n-   `--conform FILE` : Specify a schema the following schemas should be\n    an evolution of. Gives errors if not. Useful to check if schema\n    modifications don't break schema evolution rules.\n\n-   `--conform-includes PATH` : Include path for the schema given with\n    `--conform PATH`.\n\n-   `--filename-suffix SUFFIX` : The suffix appended to the generated\n    file names. Default is '\\_generated'.\n\n-   `--filename-ext EXTENSION` : The extension appended to the generated\n    file names. Default is language-specific (e.g. \"h\" for C++). This\n    should not be used when multiple languages are specified.\n\n-   `--include-prefix PATH` : Prefix this path to any generated include\n    statements.\n\n-   `--keep-prefix` : Keep original prefix of schema include statement.\n\n-   `--reflect-types` : Add minimal type reflection to code generation.\n\n-   `--reflect-names` : Add minimal type/name reflection.\n\n-   `--root-type T` : Select or override the default root_type.\n\n-   `--require-explicit-ids` : When parsing schemas, require explicit ids (id: x).\n\n-   `--force-defaults` : Emit default values in binary output from JSON.\n\n-   `--force-empty` : When serializing from object API representation, force\n     strings and vectors to empty rather than null.\n\n-   `--force-empty-vectors` : When serializing from object API representation, force\n     vectors to empty rather than null.\n\n-   `--flexbuffers` : Used with \"binary\" and \"json\" options, it generates\n     data using schema-less FlexBuffers.\n\n-   `--no-warnings` : Inhibit all warning messages.\n\n-   `--cs-global-alias` : Prepend `global::` to all user generated csharp classes and structs.\n\n-   `--json-nested-bytes` : Allow a nested_flatbuffer field to be parsed as a\n    vector of bytes in JSON, which is unsafe unless checked by a verifier\n    afterwards.\n\n-   `--python-no-type-prefix-suffix` : Skip emission of Python functions that are prefixed\n    with typenames\n\n-   `--python-typing` : Generate Python type annotations\n\n-   `--python-decode-obj-api-strings` : Decode bytes automaticaly with utf-8\n\n-   `--file-names-only` : Prints out files which would be generated by this command, one per\n    line, to `stdout`. No actual files are generated. This is useful for various CI checks.\n\nAdditional gRPC options:\n\n-   `--grpc-filename-suffix`: `[C++]` An optional suffix for the generated\n    files' names. For example, compiling gRPC for C++ with\n    `--grpc-filename-suffix=.fbs` will generate `{name}.fbs.h` and\n    `{name}.fbs.cc` files.\n\n-   `--grpc-additional-header`: `[C++]` Additional headers to include in the\n    generated files.\n\n-   `--grpc-search-path`: `[C++]` An optional prefix for the gRPC runtime path.\n    For example, compiling gRPC for C++ with `--grpc-search-path=some/path` will\n    generate the following includes:\n\n    ```cpp\n      #include \"some/path/grpcpp/impl/codegen/async_stream.h\"\n      #include \"some/path/grpcpp/impl/codegen/async_unary_call.h\"\n      #include \"some/path/grpcpp/impl/codegen/method_handler.h\"\n      ...\n    ```\n\n-   `--grpc-use-system-headers`: `[C++]` Whether to generate `#include <header>`\n    instead of `#include \"header.h\"` for all headers when compiling gRPC for\n    C++. For example, compiling gRPC for C++ with `--grpc-use-system-headers`\n    will generate the following includes:\n\n    ```cpp\n      #include <some/path/grpcpp/impl/codegen/async_stream.h>\n      #include <some/path/grpcpp/impl/codegen/async_unary_call.h>\n      #include <some/path/grpcpp/impl/codegen/method_handler.h>\n      ...\n    ```\n\n    NOTE: This option can be negated with `--no-grpc-use-system-headers`.\n\n-   `--grpc-python-typed-handlers`: `[Python]` Whether to generate the typed\n    handlers that use the generated Python classes instead of raw bytes for\n    requests/responses.\n\nNOTE: short-form options for generators are deprecated, use the long form\nwhenever possible.\n\n"
  },
  {
    "path": "docs/source/flexbuffers.md",
    "content": "FlexBuffers    {#flexbuffers}\n==========\n\nFlatBuffers was designed around schemas, because when you want maximum\nperformance and data consistency, strong typing is helpful.\n\nThere are however times when you want to store data that doesn't fit a\nschema, because you can't know ahead of time what all needs to be stored.\n\nFor this, FlatBuffers has a dedicated format, called FlexBuffers.\nThis is a binary format that can be used in conjunction\nwith FlatBuffers (by storing a part of a buffer in FlexBuffers\nformat), or also as its own independent serialization format.\n\nWhile it loses the strong typing, you retain the most unique advantage\nFlatBuffers has over other serialization formats (schema-based or not):\nFlexBuffers can also be accessed without parsing / copying / object allocation.\nThis is a huge win in efficiency / memory friendly-ness, and allows unique\nuse cases such as mmap-ing large amounts of free-form data.\n\nFlexBuffers' design and implementation allows for a very compact encoding,\ncombining automatic pooling of strings with automatic sizing of containers to\ntheir smallest possible representation (8/16/32/64 bits). Many values and\noffsets can be encoded in just 8 bits. While a schema-less representation is\nusually more bulky because of the need to be self-descriptive, FlexBuffers\ngenerates smaller binaries for many cases than regular FlatBuffers.\n\nFlexBuffers is still slower than regular FlatBuffers though, so we recommend to\nonly use it if you need it.\n\n\n# Usage in C++\n\nInclude the header `flexbuffers.h`, which in turn depends on `flatbuffers.h`\nand `util.h`.\n\nTo create a buffer:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp}\nflexbuffers::Builder fbb;\nfbb.Int(13);\nfbb.Finish();\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nYou create any value, followed by `Finish`. Unlike FlatBuffers which requires\nthe root value to be a table, here any value can be the root, including a lonely\nint value.\n\nYou can now access the `std::vector<uint8_t>` that contains the encoded value\nas `fbb.GetBuffer()`. Write it, send it, or store it in a parent FlatBuffer. In\nthis case, the buffer is just 3 bytes in size.\n\nTo read this value back, you could just say:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp}\nauto root = flexbuffers::GetRoot(my_buffer);\nint64_t i = root.AsInt64();\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nFlexBuffers stores ints only as big as needed, so it doesn't differentiate\nbetween different sizes of ints. You can ask for the 64 bit version,\nregardless of what you put in. In fact, since you demand to read the root\nas an int, if you supply a buffer that actually contains a float, or a\nstring with numbers in it, it will convert it for you on the fly as well,\nor return 0 if it can't. If instead you actually want to know what is inside\nthe buffer before you access it, you can call `root.GetType()` or `root.IsInt()`\netc.\n\nHere's a slightly more complex value you could write instead of `fbb.Int` above:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp}\nfbb.Map([&]() {\n  fbb.Vector(\"vec\", [&]() {\n    fbb.Int(-100);\n    fbb.String(\"Fred\");\n    fbb.IndirectFloat(4.0f);\n  });\n  fbb.UInt(\"foo\", 100);\n});\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThis stores the equivalent of the JSON value\n`{ vec: [ -100, \"Fred\", 4.0 ], foo: 100 }`. The root is a dictionary that has\njust two key-value pairs, with keys `vec` and `foo`. Unlike FlatBuffers, it\nactually has to store these keys in the buffer (which it does only once if\nyou store multiple such objects, by pooling key values), but also unlike\nFlatBuffers it has no restriction on the keys (fields) that you use.\n\nThe map constructor uses a C++11 Lambda to group its children, but you can\nalso use more conventional start/end calls if you prefer.\n\nThe first value in the map is a vector. You'll notice that unlike FlatBuffers,\nyou can use mixed types. There is also a `TypedVector` variant that only\nallows a single type, and uses a bit less memory.\n\n`IndirectFloat` is an interesting feature that allows you to store values\nby offset rather than inline. Though that doesn't make any visible change\nto the user, the consequence is that large values (especially doubles or\n64 bit ints) that occur more than once can be shared (see ReuseValue).\nAnother use case is inside of vectors, where the largest element makes\nup the size of all elements (e.g. a single double forces all elements to\n64bit), so storing a lot of small integers together with a double is more efficient if the double is indirect.\n\nAccessing it:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp}\nauto map = flexbuffers::GetRoot(my_buffer).AsMap();\nmap.size();  // 2\nauto vec = map[\"vec\"].AsVector();\nvec.size();  // 3\nvec[0].AsInt64();  // -100;\nvec[1].AsString().c_str();  // \"Fred\";\nvec[1].AsInt64();  // 0 (Number parsing failed).\nvec[2].AsDouble();  // 4.0\nvec[2].AsString().IsTheEmptyString();  // true (Wrong Type).\nvec[2].AsString().c_str();  // \"\" (This still works though).\nvec[2].ToString().c_str();  // \"4\" (Or have it converted).\nmap[\"foo\"].AsUInt8();  // 100\nmap[\"unknown\"].IsNull();  // true\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n\n# Usage in Java\n\nJava implementation follows the C++ one, closely.\n\nFor creating the equivalent of the same JSON `{ vec: [ -100, \"Fred\", 4.0 ], foo: 100 }`,\none could use the following code:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.java}\nFlexBuffersBuilder builder = new FlexBuffersBuilder(ByteBuffer.allocate(512),\n\t\t                                                FlexBuffersBuilder.BUILDER_FLAG_SHARE_KEYS_AND_STRINGS);\nint smap = builder.startMap();\nint svec = builder.startVector();\nbuilder.putInt(-100);\nbuilder.putString(\"Fred\");\nbuilder.putFloat(4.0);\nbuilder.endVector(\"vec\", svec, false, false);\nbuilder.putInt(\"foo\", 100);\nbuilder.endMap(null, smap);\nByteBuffer bb = builder.finish();\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nSimilarly, to read the data, just:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.java}\nFlexBuffers.Map map = FlexBuffers.getRoot(bb).asMap();\nmap.size();  // 2\nFlexBuffers.Vector vec = map.get(\"vec\").asVector();\nvec.size();  // 3\nvec.get(0).asLong();  // -100;\nvec.get(1).asString();  // \"Fred\";\nvec.get(1).asLong();  // 0 (Number parsing failed).\nvec.get(2).asFloat();  // 4.0\nvec.get(2).asString().isEmpty();  // true (Wrong Type).\nvec.get(2).asString();  // \"\" (This still works though).\nvec.get(2).toString();  // \"4.0\" (Or have it converted).\nmap.get(\"foo\").asUInt();  // 100\nmap.get(\"unknown\").isNull();  // true\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n\n# Binary encoding\n\nA description of how FlexBuffers are encoded is in the\n[internals](internals.md) document.\n\n\n# Nesting inside a FlatBuffer\n\nYou can mark a field as containing a FlexBuffer, e.g.\n\n    a:[ubyte] (flexbuffer);\n\nA special accessor will be generated that allows you to access the root value\ndirectly, e.g. `a_flexbuffer_root().AsInt64()`.\n\n\n# Efficiency tips\n\n* Vectors generally are a lot more efficient than maps, so prefer them over maps\n  when possible for small objects. Instead of a map with keys `x`, `y` and `z`,\n  use a vector. Better yet, use a typed vector. Or even better, use a fixed\n  size typed vector.\n* Maps are backwards compatible with vectors, and can be iterated as such.\n  You can iterate either just the values (`map.Values()`), or in parallel with\n  the keys vector (`map.Keys()`). If you intend\n  to access most or all elements, this is faster than looking up each element\n  by key, since that involves a binary search of the key vector.\n* When possible, don't mix values that require a big bit width (such as double)\n  in a large vector of smaller values, since all elements will take on this\n  width. Use `IndirectDouble` when this is a possibility. Note that\n  integers automatically use the smallest width possible, i.e. if you ask\n  to serialize an int64_t whose value is actually small, you will use less\n  bits. Doubles are represented as floats whenever possible losslessly, but\n  this is only possible for few values.\n  Since nested vectors/maps are stored over offsets, they typically don't\n  affect the vector width.\n* To store large arrays of byte data, use a blob. If you'd use a typed\n  vector, the bit width of the size field may make it use more space than\n  expected, and may not be compatible with `memcpy`.\n  Similarly, large arrays of (u)int16_t may be better off stored as a\n  binary blob if their size could exceed 64k elements.\n  Construction and use are otherwise similar to strings.\n"
  },
  {
    "path": "docs/source/grammar.md",
    "content": "## EBNF\n\n```ebnf\nschema = include* ( namespace_decl | type_decl | enum_decl | root_decl |\n           file_extension_decl | file_identifier_decl |\n           attribute_decl | rpc_decl | object )*\n\ninclude = `include` string_constant `;`\n\nnamespace_decl = `namespace` ident ( `.` ident )* `;`\n\nattribute_decl = `attribute` ident | `\"` ident `\"` `;`\n\ntype_decl = ( `table` | `struct` ) ident metadata `{` field_decl+ `}`\n\nenum_decl = ( `enum` ident `:` type | `union` ident )  metadata `{`\ncommasep( enumval_decl ) `}`\n\nroot_decl = `root_type` ident `;`\n\nfield_decl = ident `:` type [ `=` scalar ] metadata `;`\n\nrpc_decl = `rpc_service` ident `{` rpc_method+ `}`\n\nrpc_method = ident `(` ident `)` `:` ident metadata `;`\n\ntype = `bool` | `byte` | `ubyte` | `short` | `ushort` | `int` | `uint` |\n       `float` | `long` | `ulong` | `double` | `int8` | `uint8` | `int16` |\n       `uint16` | `int32` | `uint32`| `int64` | `uint64` | `float32` |\n       `float64` | `string` | `[` type `]` | ident\n\nenumval_decl = ident [ `=` integer_constant ] metadata\n\nmetadata = [ `(` commasep( ident [ `:` single_value ] ) `)` ]\n\nscalar = boolean_constant | integer_constant | float_constant\n\nobject = `{` commasep( ident `:` value ) `}`\n\nsingle_value = scalar | string_constant\n\nvalue = single_value | object | `[` commasep( value ) `]`\n\ncommasep(x) = [ x ( `,` x )\\* ]\n\nfile_extension_decl = `file_extension` string_constant `;`\n\nfile_identifier_decl = `file_identifier` string_constant `;`\n\nstring_constant = `\\\".*?\\\"`\n\nident = `[a-zA-Z_][a-zA-Z0-9_]*`\n\n`[:digit:]` = `[0-9]`\n\n`[:xdigit:]` = `[0-9a-fA-F]`\n\ndec_integer_constant = `[-+]?[:digit:]+`\n\nhex_integer_constant = `[-+]?0[xX][:xdigit:]+`\n\ninteger_constant = dec_integer_constant | hex_integer_constant\n\ndec_float_constant = `[-+]?(([.][:digit:]+)|([:digit:]+[.][:digit:]*)|([:digit:]+))([eE][-+]?[:digit:]+)?`\n\nhex_float_constant = `[-+]?0[xX](([.][:xdigit:]+)|([:xdigit:]+[.][:xdigit:]*)|([:xdigit:]+))([pP][-+]?[:digit:]+)`\n\nspecial_float_constant = `[-+]?(nan|inf|infinity)`\n\nfloat_constant = dec_float_constant | hex_float_constant | special_float_constant\n\nboolean_constant = `true` | `false`\n```\n"
  },
  {
    "path": "docs/source/index.md",
    "content": "# Overview\n\nFlatBuffers is an efficient cross platform serialization library for C++, C#, C,\nGo, Java, Kotlin, JavaScript, Lobster, Lua, TypeScript, PHP, Python, Rust and\nSwift. It was originally created at Google for game development and other\nperformance-critical applications.\n\nIt is available as Open Source on\n[GitHub](https://github.com/google/flatbuffers) under the Apache license v2.0.\n\n## Why Use FlatBuffers?\n\n<div class=\"grid cards\" markdown>\n\n- :material-clock-fast:{ .lg .middle } **Access to serialized data without\n  parsing/unpacking**\n\n    ---\n    Access the data directly without unpacking or parsing.\n\n- :material-memory:{ .lg .middle } **Memory Efficiency and Speed**\n\n    ---\n    The only memory needed to access your data is that of the buffer.\n  No heap is required.\n\n- :material-compare-horizontal:{ .lg .middle } **Backwards and Forwards\n  Compatibility**\n\n    ---\n    FlatBuffers enables the schema to evolve over time while still maintaining\n  forwards and backwards compatibility with old flatbuffers.\n\n- :material-scale-off:{ .lg .middle } **Small Footprint**\n\n    ---\n    Minimal dependencies and small code footprint.\n\n</div>\n\n## Why not use...\n\n=== \"Protocol Buffers\"\n\n    Protocol Buffers is indeed relatively similar to FlatBuffers, with the primary\n    difference being that FlatBuffers does not need a parsing/unpacking step to a\n    secondary representation before you can access data, often coupled with\n    per-object memory allocation. The code is an order of magnitude bigger, too.\n\n=== \"JSON\"\n\n    JSON is very readable (which is why we use it as our optional text format) and\n    very convenient when used together with dynamically typed languages (such as\n    JavaScript). When serializing data from statically typed languages, however,\n    JSON not only has the obvious drawback of runtime inefficiency, but also forces\n    you to write more code to access data (counterintuitively) due to its\n    dynamic-typing serialization system. In this context, it is only a better choice\n    for systems that have very little to no information ahead of time about what\n    data needs to be stored.\n"
  },
  {
    "path": "docs/source/intermediate_representation.md",
    "content": "# Flatbuffers Intermediate Representation {#intermediate_representation}\n\nWe use [reflection.fbs](https://github.com/google/flatbuffers/blob/master/reflection/reflection.fbs)\nas our intermediate representation. `flatc` parses `.fbs` files, checks them for\nerrors and stores the resulting data in this IR, outputting `.bfbs` files.\nSince this IR is a Flatbuffer, you can load and use it at runtime for runtime\nreflection purposes.\n\nThere are some quirks:\n- Tables and Structs are serialized as `Object`s.\n- Unions and Enums are serialized as `Enum`s.\n- It is the responsibility of the code generator to check the `advanced_features`\n  field of `Schema`. These mark the presence of new, backwards incompatible,\n  schema features. Code generators must error if generating a schema with\n  unrecognized advanced features.\n- Filenames are relative to a \"project root\" denoted by \"//\" in the path. This\n  may be specified in flatc with `--bfbs-filenames=$PROJECT_ROOT`, or it will be\n  inferred to be the directory containing the first provided schema file.\n\n\n## Invocation\nYou can invoke it like so\n```{.sh}\nflatc -b --schema ${your_fbs_files}\n```\nThis generates `.bfbs` (binary flatbuffer schema) files.\n\nSome information is not included by default. See the `--bfbs-filenames` and\n`--bfbs-comments` flags. These may be necessary for code-generators, so they can\nadd documentation and maybe name generated files (depending on the generator).\n\n\nTODO(cneo): Flags to output bfbs as flexbuffers or json.\n\nTODO(cneo): Tutorial for building a flatc plugin.\n"
  },
  {
    "path": "docs/source/internals.md",
    "content": "FlatBuffer Internals    {#flatbuffers_internals}\n====================\n\nThis section is entirely optional for the use of FlatBuffers. In normal\nusage, you should never need the information contained herein. If you're\ninterested however, it should give you more of an appreciation of why\nFlatBuffers is both efficient and convenient.\n\n### Format components\n\nA FlatBuffer is a binary file and in-memory format consisting mostly of\nscalars of various sizes, all aligned to their own size. Each scalar is\nalso always represented in little-endian format, as this corresponds to\nall commonly used CPUs today. FlatBuffers will also work on big-endian\nmachines, but will be slightly slower because of additional\nbyte-swap intrinsics.\n\nIt is assumed that the following conditions are met, to ensure\ncross-platform interoperability:\n- The binary `IEEE-754` format is used for floating-point numbers.\n- The `two's complemented` representation is used for signed integers.\n- The endianness is the same for floating-point numbers as for integers.\n\nOn purpose, the format leaves a lot of details about where exactly\nthings live in memory undefined, e.g. fields in a table can have any\norder, and objects to some extent can be stored in many orders. This is\nbecause the format doesn't need this information to be efficient, and it\nleaves room for optimization and extension (for example, fields can be\npacked in a way that is most compact). Instead, the format is defined in\nterms of offsets and adjacency only. This may mean two different\nimplementations may produce different binaries given the same input\nvalues, and this is perfectly valid.\n\n### Format identification\n\nThe format also doesn't contain information for format identification\nand versioning, which is also by design. FlatBuffers is a statically typed\nsystem, meaning the user of a buffer needs to know what kind of buffer\nit is. FlatBuffers can of course be wrapped inside other containers\nwhere needed, or you can use its union feature to dynamically identify\nmultiple possible sub-objects stored. Additionally, it can be used\ntogether with the schema parser if full reflective capabilities are\ndesired.\n\nVersioning is something that is intrinsically part of the format (the\noptionality / extensibility of fields), so the format itself does not\nneed a version number (it's a meta-format, in a sense). We're hoping\nthat this format can accommodate all data needed. If format breaking\nchanges are ever necessary, it would become a new kind of format rather\nthan just a variation.\n\n### Offsets\n\nThe most important and generic offset type (see `flatbuffers.h`) is\n`uoffset_t`, which is currently always a `uint32_t`, and is used to\nrefer to all tables/unions/strings/vectors (these are never stored\nin-line). 32bit is\nintentional, since we want to keep the format binary compatible between\n32 and 64bit systems, and a 64bit offset would bloat the size for almost\nall uses. A version of this format with 64bit (or 16bit) offsets is easy to set\nwhen needed. Unsigned means they can only point in one direction, which\ntypically is forward (towards a higher memory location). Any backwards\noffsets will be explicitly marked as such.\n\nThe format starts with an `uoffset_t` to the root table in the buffer.\n\nWe have two kinds of objects, structs and tables.\n\n### Structs\n\nThese are the simplest, and as mentioned, intended for simple data that\nbenefits from being extra efficient and doesn't need versioning /\nextensibility. They are always stored inline in their parent (a struct,\ntable, or vector) for maximum compactness. Structs define a consistent\nmemory layout where all components are aligned to their size, and\nstructs aligned to their largest scalar member. This is done independent\nof the alignment rules of the underlying compiler to guarantee a cross\nplatform compatible layout. This layout is then enforced in the generated\ncode.\n\n### Tables\n\nUnlike structs, these are not stored in inline in their parent, but are\nreferred to by offset.\n\nThey start with an `soffset_t` to a vtable. This is a signed version of\n`uoffset_t`, since vtables may be stored anywhere relative to the object.\nThis offset is subtracted (not added) from the object start to arrive at\nthe vtable start. This offset is followed by all the\nfields as aligned scalars (or offsets). Unlike structs, not all fields\nneed to be present. There is no set order and layout. A table may contain\nfield offsets that point to the same value if the user explicitly\nserializes the same offset twice.\n\nTo be able to access fields regardless of these uncertainties, we go\nthrough a vtable of offsets. Vtables are shared between any objects that\nhappen to have the same vtable values.\n\nThe elements of a vtable are all of type `voffset_t`, which is\na `uint16_t`. The first element is the size of the vtable in bytes,\nincluding the size element. The second one is the size of the object, in bytes\n(including the vtable offset). This size could be used for streaming, to know\nhow many bytes to read to be able to access all *inline* fields of the object.\nThe remaining elements are the N offsets, where N is the amount of fields\ndeclared in the schema when the code that constructed this buffer was\ncompiled (thus, the size of the table is N + 2).\n\nAll accessor functions in the generated code for tables contain the\noffset into this table as a constant. This offset is checked against the\nfirst field (the number of elements), to protect against newer code\nreading older data. If this offset is out of range, or the vtable entry\nis 0, that means the field is not present in this object, and the\ndefault value is return. Otherwise, the entry is used as offset to the\nfield to be read.\n\n### Unions\n\nUnions are encoded as the combination of two fields: an enum representing the\nunion choice and the offset to the actual element. FlatBuffers reserves the\nenumeration constant `NONE` (encoded as 0) to mean that the union field is not\nset.\n\n### Strings and Vectors\n\nStrings are simply a vector of bytes, and are always\nnull-terminated. Vectors are stored as contiguous aligned scalar\nelements prefixed by a 32bit element count (not including any\nnull termination). Neither is stored inline in their parent, but are referred to\nby offset. A vector may consist of more than one offset pointing to the same\nvalue if the user explicitly serializes the same offset twice.\n\n### Construction\n\nThe current implementation constructs these buffers backwards (starting\nat the highest memory address of the buffer), since\nthat significantly reduces the amount of bookkeeping and simplifies the\nconstruction API.\n\n### Code example\n\nHere's an example of the code that gets generated for the `samples/monster.fbs`.\nWhat follows is the entire file, broken up by comments:\n\n    // automatically generated, do not modify\n\n    #include \"flatbuffers/flatbuffers.h\"\n\n    namespace MyGame {\n    namespace Sample {\n\nNested namespace support.\n\n    enum {\n      Color_Red = 0,\n      Color_Green = 1,\n      Color_Blue = 2,\n    };\n\n    inline const char **EnumNamesColor() {\n      static const char *names[] = { \"Red\", \"Green\", \"Blue\", nullptr };\n      return names;\n    }\n\n    inline const char *EnumNameColor(int e) { return EnumNamesColor()[e]; }\n\nEnums and convenient reverse lookup.\n\n    enum {\n      Any_NONE = 0,\n      Any_Monster = 1,\n    };\n\n    inline const char **EnumNamesAny() {\n      static const char *names[] = { \"NONE\", \"Monster\", nullptr };\n      return names;\n    }\n\n    inline const char *EnumNameAny(int e) { return EnumNamesAny()[e]; }\n\nUnions share a lot with enums.\n\n    struct Vec3;\n    struct Monster;\n\nPredeclare all data types since circular references between types are allowed\n(circular references between object are not, though).\n\n    FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(4) Vec3 {\n     private:\n      float x_;\n      float y_;\n      float z_;\n\n     public:\n      Vec3(float x, float y, float z)\n        : x_(flatbuffers::EndianScalar(x)), y_(flatbuffers::EndianScalar(y)), z_(flatbuffers::EndianScalar(z)) {}\n\n      float x() const { return flatbuffers::EndianScalar(x_); }\n      float y() const { return flatbuffers::EndianScalar(y_); }\n      float z() const { return flatbuffers::EndianScalar(z_); }\n    };\n    FLATBUFFERS_STRUCT_END(Vec3, 12);\n\nThese ugly macros do a couple of things: they turn off any padding the compiler\nmight normally do, since we add padding manually (though none in this example),\nand they enforce alignment chosen by FlatBuffers. This ensures the layout of\nthis struct will look the same regardless of compiler and platform. Note that\nthe fields are private: this is because these store little endian scalars\nregardless of platform (since this is part of the serialized data).\n`EndianScalar` then converts back and forth, which is a no-op on all current\nmobile and desktop platforms, and a single machine instruction on the few\nremaining big endian platforms.\n\n    struct Monster : private flatbuffers::Table {\n      const Vec3 *pos() const { return GetStruct<const Vec3 *>(4); }\n      int16_t mana() const { return GetField<int16_t>(6, 150); }\n      int16_t hp() const { return GetField<int16_t>(8, 100); }\n      const flatbuffers::String *name() const { return GetPointer<const flatbuffers::String *>(10); }\n      const flatbuffers::Vector<uint8_t> *inventory() const { return GetPointer<const flatbuffers::Vector<uint8_t> *>(14); }\n      int8_t color() const { return GetField<int8_t>(16, 2); }\n    };\n\nTables are a bit more complicated. A table accessor struct is used to point at\nthe serialized data for a table, which always starts with an offset to its\nvtable. It derives from `Table`, which contains the `GetField` helper functions.\nGetField takes a vtable offset, and a default value. It will look in the vtable\nat that offset. If the offset is out of bounds (data from an older version) or\nthe vtable entry is 0, the field is not present and the default is returned.\nOtherwise, it uses the entry as an offset into the table to locate the field.\n\n    struct MonsterBuilder {\n      flatbuffers::FlatBufferBuilder &fbb_;\n      flatbuffers::uoffset_t start_;\n      void add_pos(const Vec3 *pos) { fbb_.AddStruct(4, pos); }\n      void add_mana(int16_t mana) { fbb_.AddElement<int16_t>(6, mana, 150); }\n      void add_hp(int16_t hp) { fbb_.AddElement<int16_t>(8, hp, 100); }\n      void add_name(flatbuffers::Offset<flatbuffers::String> name) { fbb_.AddOffset(10, name); }\n      void add_inventory(flatbuffers::Offset<flatbuffers::Vector<uint8_t>> inventory) { fbb_.AddOffset(14, inventory); }\n      void add_color(int8_t color) { fbb_.AddElement<int8_t>(16, color, 2); }\n      MonsterBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); }\n      flatbuffers::Offset<Monster> Finish() { return flatbuffers::Offset<Monster>(fbb_.EndTable(start_, 7)); }\n    };\n\n`MonsterBuilder` is the base helper struct to construct a table using a\n`FlatBufferBuilder`. You can add the fields in any order, and the `Finish`\ncall will ensure the correct vtable gets generated.\n\n    inline flatbuffers::Offset<Monster> CreateMonster(flatbuffers::FlatBufferBuilder &_fbb,\n                                                      const Vec3 *pos, int16_t mana,\n                                                      int16_t hp,\n                                                      flatbuffers::Offset<flatbuffers::String> name,\n                                                      flatbuffers::Offset<flatbuffers::Vector<uint8_t>> inventory,\n                                                      int8_t color) {\n      MonsterBuilder builder_(_fbb);\n      builder_.add_inventory(inventory);\n      builder_.add_name(name);\n      builder_.add_pos(pos);\n      builder_.add_hp(hp);\n      builder_.add_mana(mana);\n      builder_.add_color(color);\n      return builder_.Finish();\n    }\n\n`CreateMonster` is a convenience function that calls all functions in\n`MonsterBuilder` above for you. Note that if you pass values which are\ndefaults as arguments, it will not actually construct that field, so\nyou can probably use this function instead of the builder class in\nalmost all cases.\n\n    inline const Monster *GetMonster(const void *buf) { return flatbuffers::GetRoot<Monster>(buf); }\n\nThis function is only generated for the root table type, to be able to\nstart traversing a FlatBuffer from a raw buffer pointer.\n\n    }; // namespace MyGame\n    }; // namespace Sample\n\n### Encoding example.\n\nBelow is a sample encoding for the following JSON corresponding to the above\nschema:\n\n    { pos: { x: 1, y: 2, z: 3 }, name: \"fred\", hp: 50 }\n\nResulting in this binary buffer:\n\n    // Start of the buffer:\n    uint32_t 20  // Offset to the root table.\n\n    // Start of the vtable. Not shared in this example, but could be:\n    uint16_t 16 // Size of table, starting from here.\n    uint16_t 22 // Size of object inline data.\n    uint16_t 4, 0, 20, 16, 0, 0  // Offsets to fields from start of (root) table, 0 for not present.\n\n    // Start of the root table:\n    int32_t 16     // Offset to vtable used (default negative direction)\n    float 1, 2, 3  // the Vec3 struct, inline.\n    uint32_t 8     // Offset to the name string.\n    int16_t 50     // hp field.\n    int16_t 0      // Padding for alignment.\n\n    // Start of name string:\n    uint32_t 4  // Length of string.\n    int8_t 'f', 'r', 'e', 'd', 0, 0, 0, 0  // Text + 0 termination + padding.\n\nNote that this not the only possible encoding, since the writer has some\nflexibility in which of the children of root object to write first (though in\nthis case there's only one string), and what order to write the fields in.\nDifferent orders may also cause different alignments to happen.\n\n### Additional reading.\n\nThe author of the C language implementation has made a similar\n[document](https://github.com/dvidelabs/flatcc/blob/master/doc/binary-format.md#flatbuffers-binary-format)\nthat may further help clarify the format.\n\n# FlexBuffers\n\nThe [schema-less](flexbuffers.md) version of FlatBuffers have their\nown encoding, detailed here.\n\nIt shares many properties mentioned above, in that all data is accessed\nover offsets, all scalars are aligned to their own size, and\nall data is always stored in little endian format.\n\nOne difference is that FlexBuffers are built front to back, so children are\nstored before parents, and the root of the data starts at the last byte.\n\nAnother difference is that scalar data is stored with a variable number of bits\n(8/16/32/64). The current width is always determined by the *parent*, i.e. if\nthe scalar sits in a vector, the vector determines the bit width for all\nelements at once. Selecting the minimum bit width for a particular vector is\nsomething the encoder does automatically and thus is typically of no concern\nto the user, though being aware of this feature (and not sticking a double in\nthe same vector as a bunch of byte sized elements) is helpful for efficiency.\n\nUnlike FlatBuffers there is only one kind of offset, and that is an unsigned\ninteger indicating the number of bytes in a negative direction from the address\nof itself (where the offset is stored).\n\n### Vectors\n\nThe representation of the vector is at the core of how FlexBuffers works (since\nmaps are really just a combination of 2 vectors), so it is worth starting there.\n\nAs mentioned, a vector is governed by a single bit width (supplied by its\nparent). This includes the size field. For example, a vector that stores the\ninteger values `1, 2, 3` is encoded as follows:\n\n    uint8_t 3, 1, 2, 3, 4, 4, 4\n\nThe first `3` is the size field, and is placed before the vector (an offset\nfrom the parent to this vector points to the first element, not the size\nfield, so the size field is effectively at index -1).\nSince this is an untyped vector `SL_VECTOR`, it is followed by 3 type\nbytes (one per element of the vector), which are always following the vector,\nand are always a uint8_t even if the vector is made up of bigger scalars.\n\nA vector may include more than one offset pointing to the same value if the\nuser explicitly serializes the same offset twice.\n\n### Types\n\nA type byte is made up of 2 components (see flexbuffers.h for exact values):\n\n* 2 lower bits representing the bit-width of the child (8, 16, 32, 64).\n  This is only used if the child is accessed over an offset, such as a child\n  vector. It is ignored for inline types.\n* 6 bits representing the actual type (see flexbuffers.h).\n\nThus, in this example `4` means 8 bit child (value 0, unused, since the value is\nin-line), type `SL_INT` (value 1).\n\n### Typed Vectors\n\nThese are like the Vectors above, but omit the type bytes. The type is instead\ndetermined by the vector type supplied by the parent. Typed vectors are only\navailable for a subset of types for which these savings can be significant,\nnamely inline signed/unsigned integers (`TYPE_VECTOR_INT` / `TYPE_VECTOR_UINT`),\nfloats (`TYPE_VECTOR_FLOAT`), and keys (`TYPE_VECTOR_KEY`, see below).\n\nAdditionally, for scalars, there are fixed length vectors of sizes 2 / 3 / 4\nthat don't store the size (`TYPE_VECTOR_INT2` etc.), for an additional savings\nin space when storing common vector or color data.\n\n### Scalars\n\nFlexBuffers supports integers (`TYPE_INT` and `TYPE_UINT`) and floats\n(`TYPE_FLOAT`), available in the bit-widths mentioned above. They can be stored\nboth inline and over an offset (`TYPE_INDIRECT_*`).\n\nThe offset version is useful to encode costly 64bit (or even 32bit) quantities\ninto vectors / maps of smaller sizes, and to share / repeat a value multiple\ntimes.\n\n### Booleans and Nulls\n\nBooleans (`TYPE_BOOL`) and nulls (`TYPE_NULL`) are encoded as inlined unsigned integers.\n\n### Blobs, Strings and Keys.\n\nA blob (`TYPE_BLOB`) is encoded similar to a vector, with one difference: the\nelements are always `uint8_t`. The parent bit width only determines the width of\nthe size field, allowing blobs to be large without the elements being large.\n\nStrings (`TYPE_STRING`) are similar to blobs, except they have an additional 0\ntermination byte for convenience, and they MUST be UTF-8 encoded (since an\naccessor in a language that does not support pointers to UTF-8 data may have to\nconvert them to a native string type).\n\nA \"Key\" (`TYPE_KEY`) is similar to a string, but doesn't store the size\nfield. They're so named because they are used with maps, which don't care\nfor the size, and can thus be even more compact. Unlike strings, keys cannot\ncontain bytes of value 0 as part of their data (size can only be determined by\n`strlen`), so while you can use them outside the context of maps if you so\ndesire, you're usually better off with strings.\n\n### Maps\n\nA map (`TYPE_MAP`) is like an (untyped) vector, but with 2 prefixes before the\nsize field:\n\n| index | field                                                        |\n| ----: | :----------------------------------------------------------- |\n| -3    | An offset to the keys vector (may be shared between tables). |\n| -2    | Byte width of the keys vector.                               |\n| -1    | Size (from here on it is compatible with `TYPE_VECTOR`)      |\n| 0     | Elements.                                                    |\n| Size  | Types.                                                       |\n\nSince a map is otherwise the same as a vector, it can be iterated like\na vector (which is probably faster than lookup by key).\n\nThe keys vector is a typed vector of keys. Both the keys and corresponding\nvalues *have* to be stored in sorted order (as determined by `strcmp`), such\nthat lookups can be made using binary search.\n\nThe reason the key vector is a separate structure from the value vector is\nsuch that it can be shared between multiple value vectors, and also to\nallow it to be treated as its own individual vector in code.\n\nAn example map { foo: 13, bar: 14 } would be encoded as:\n\n    0 : uint8_t 'b', 'a', 'r', 0\n    4 : uint8_t 'f', 'o', 'o', 0\n    8 : uint8_t 2      // key vector of size 2\n    // key vector offset points here\n    9 : uint8_t 9, 6   // offsets to bar_key and foo_key\n    11: uint8_t 2, 1   // offset to key vector, and its byte width\n    13: uint8_t 2      // value vector of size\n    // value vector offset points here\n    14: uint8_t 14, 13 // values\n    16: uint8_t 4, 4   // types\n\n### The root\n\nAs mentioned, the root starts at the end of the buffer.\nThe last uint8_t is the width in bytes of the root (normally the parent\ndetermines the width, but the root has no parent). The uint8_t before this is\nthe type of the root, and the bytes before that are the root value (of the\nnumber of bytes specified by the last byte).\n\nSo for example, the integer value `13` as root would be:\n\n    uint8_t 13, 4, 1    // Value, type, root byte width.\n\n"
  },
  {
    "path": "docs/source/languages/c.md",
    "content": "Use in C    {#flatbuffers_guide_use_c}\n==========\n\nThe C language binding exists in a separate project named [FlatCC](https://github.com/dvidelabs/flatcc).\n\nThe `flatcc` C schema compiler can generate code offline as well as\nonline via a C library. It can also generate buffer verifiers and fast\nJSON parsers, printers.\n\nGreat care has been taken to ensure compatibility with the main `flatc`\nproject.\n\n## General Documention\n\n- [Tutorial](../tutorial.md) - select C as language\n  when scrolling down\n- [FlatCC Guide](https://github.com/dvidelabs/flatcc#flatcc-flatbuffers-in-c-for-c)\n- [The C Builder Interface](https://github.com/dvidelabs/flatcc/blob/master/doc/builder.md#the-builder-interface)\n- [The Monster Sample in C](https://github.com/dvidelabs/flatcc/blob/master/samples/monster/monster.c)\n- [GitHub](https://github.com/dvidelabs/flatcc)\n\n\n## Supported Platforms\n\n- Ubuntu (clang / gcc, ninja / gnu make)\n- OS-X (clang / gcc, ninja / gnu make)\n- Windows MSVC 2010, 2013, 2015\n\nCI builds recent versions of gcc, clang and MSVC on OS-X, Ubuntu, and\nWindows, and occasionally older compiler versions. See main project [Status](https://github.com/dvidelabs/flatcc#status).\n\nOther platforms may well work, including Centos, but are not tested\nregularly.\n\nThe monster sample project was specifically written for C99 in order to\nfollow the C++ version and for that reason it will not work with MSVC\n2010.\n\n## Modular Object Creation\n\nIn the tutorial we used the call `Monster_create_as_root` to create the\nroot buffer object since this is easier in simple use cases. Sometimes\nwe need more modularity so we can reuse a function to create nested\ntables and root tables the same way. For this we need the\n`flatcc_builder_buffer_create_call`. It is best to keep `flatcc_builder`\ncalls isolated at the top driver level, so we get:\n\n<div class=\"language-c\">\n~~~{.c}\n  ns(Monster_ref_t) create_orc(flatcc_builder_t *B)\n  {\n    // ... same as in the tutorial.\n    return s(Monster_create(B, ...));\n  }\n\n  void create_monster_buffer()\n  {\n      uint8_t *buf;\n      size_t size;\n      flatcc_builder_t builder, *B;\n\n      // Initialize the builder object.\n      B = &builder;\n      flatcc_builder_init(B);\n      // Only use `buffer_create` without `create/start/end_as_root`.\n      flatcc_builder_buffer_create(create_orc(B));\n      // Allocate and copy buffer to user memory.\n      buf = flatcc_builder_finalize_buffer(B, &size);\n      // ... write the buffer to disk or network, or something.\n\n      free(buf);\n      flatcc_builder_clear(B);\n  }\n~~~\n</div>\n\nThe same principle applies with `start/end` vs `start/end_as_root` in\nthe top-down approach.\n\n\n## Top Down Example\n\nThe tutorial uses a bottom up approach. In C it is also possible to use\na top-down approach by starting and ending objects nested within each\nother. In the tutorial there is no deep nesting, so the difference is\nlimited, but it shows the idea:\n\n<div class=\"language-c\">\n<br>\n~~~{.c}\n  uint8_t treasure[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};\n  size_t treasure_count = c_vec_len(treasure);\n  ns(Weapon_ref_t) axe;\n\n  // NOTE: if we use end_as_root, we MUST also start as root.\n  ns(Monster_start_as_root(B));\n  ns(Monster_pos_create(B, 1.0f, 2.0f, 3.0f));\n  ns(Monster_hp_add(B, 300));\n  ns(Monster_mana_add(B, 150));\n  // We use create_str instead of add because we have no existing string reference.\n  ns(Monster_name_create_str(B, \"Orc\"));\n  // Again we use create because we no existing vector object, only a C-array.\n  ns(Monster_inventory_create(B, treasure, treasure_count));\n  ns(Monster_color_add(B, ns(Color_Red)));\n  if (1) {\n      ns(Monster_weapons_start(B));\n      ns(Monster_weapons_push_create(B, flatbuffers_string_create_str(B, \"Sword\"), 3));\n      // We reuse the axe object later. Note that we dereference a pointer\n      // because push always returns a short-term pointer to the stored element.\n      // We could also have created the axe object first and simply pushed it.\n      axe = *ns(Monster_weapons_push_create(B, flatbuffers_string_create_str(B, \"Axe\"), 5));\n      ns(Monster_weapons_end(B));\n  } else {\n      // We can have more control with the table elements added to a vector:\n      //\n      ns(Monster_weapons_start(B));\n      ns(Monster_weapons_push_start(B));\n      ns(Weapon_name_create_str(B, \"Sword\"));\n      ns(Weapon_damage_add(B, 3));\n      ns(Monster_weapons_push_end(B));\n      ns(Monster_weapons_push_start(B));\n      ns(Monster_weapons_push_start(B));\n      ns(Weapon_name_create_str(B, \"Axe\"));\n      ns(Weapon_damage_add(B, 5));\n      axe = *ns(Monster_weapons_push_end(B));\n      ns(Monster_weapons_end(B));\n  }\n  // Unions can get their type by using a type-specific add/create/start method.\n  ns(Monster_equipped_Weapon_add(B, axe));\n\n  ns(Monster_end_as_root(B));\n~~~\n</div>\n\n\n## Basic Reflection\n\nThe C-API does support reading binary schema (.bfbs)\nfiles via code generated from the `reflection.fbs` schema, and an\n[example usage](https://github.com/dvidelabs/flatcc/tree/master/samples/reflection)\nshows how to use this. The reflection schema files are pre-generated\nin the [runtime distribution](https://github.com/dvidelabs/flatcc/tree/master/include/flatcc/reflection).\n\n\n## Mutations and Reflection\n\nThe C-API does not support mutating reflection like C++ does, nor does\nthe reader interface support mutating scalars (and it is generally\nunsafe to do so even after verification).\n\nThe generated reader interface supports sorting vectors in-place after\ncasting them to a mutating type because it is not practical to do so\nwhile building a buffer. This is covered in the builder documentation.  \nThe reflection example makes use of this feature to look up objects by\nname.\n\nIt is possible to build new buffers using complex objects from existing\nbuffers as source. This can be very efficient due to direct copy\nsemantics without endian conversion or temporary stack allocation.\n\nScalars, structs and strings can be used as source, as well vectors of\nthese.\n\nIt is currently not possible to use an existing table or vector of table\nas source, but it would be possible to add support for this at some\npoint.\n\n\n## Namespaces\n\nThe `FLATBUFFERS_WRAP_NAMESPACE` approach used in the tutorial is convenient\nwhen each function has a very long namespace prefix. But it isn't always\nthe best approach. If the namespace is absent, or simple and\ninformative, we might as well use the prefix directly. The\n[reflection example](https://github.com/dvidelabs/flatcc/blob/master/samples/reflection/bfbs2json.c)\nmentioned above uses this approach.\n\n\n## Checking for Present Members\n\nNot all languages support testing if a field is present, but in C we can\nelaborate the reader section of the tutorial with tests for this. Recall\nthat `mana` was set to the default value `150` and therefore shouldn't\nbe present.\n\n<div class=\"language-c\">\n~~~{.c}\n  int hp_present = ns(Monster_hp_is_present(monster)); // 1\n  int mana_present = ns(Monster_mana_is_present(monster)); // 0\n~~~\n</div>\n\n## Alternative ways to add a Union\n\nIn the tutorial we used a single call to add a union.  Here we show\ndifferent ways to accomplish the same thing. The last form is rarely\nused, but is the low-level way to do it. It can be used to group small\nvalues together in the table by adding type and data at different\npoints in time.\n\n<div class=\"language-c\">\n~~~{.c}\n   ns(Equipment_union_ref_t) equipped = ns(Equipment_as_Weapon(axe));\n   ns(Monster_equipped_add(B, equipped));\n   // or alternatively\n   ns(Monster_equipped_Weapon_add(B, axe);\n   // or alternatively\n   ns(Monster_equipped_add_type(B, ns(Equipment_Weapon));\n   ns(Monster_equipped_add_member(B, axe));\n~~~\n</div>\n\n## Why not integrate with the `flatc` tool?\n\n[It was considered how the C code generator could be integrated into the\n`flatc` tool](https://github.com/dvidelabs/flatcc/issues/1), but it\nwould either require that the standalone C implementation of the schema\ncompiler was dropped, or it would lead to excessive code duplication, or\na complicated intermediate representation would have to be invented.\nNeither of these alternatives are very attractive, and it isn't a big\ndeal to use the `flatcc` tool instead of `flatc` given that the\nFlatBuffers C runtime library needs to be made available regardless.\n\n\n"
  },
  {
    "path": "docs/source/languages/c_sharp.md",
    "content": "Use in C\\#    {#flatbuffers_guide_use_c-sharp}\n==============\n\n## Before you get started\n\nBefore diving into the FlatBuffers usage in C#, it should be noted that\nthe [Tutorial](../tutorial.md) page has a complete guide to\ngeneral FlatBuffers usage in all of the supported languages (including C#).\nThis page is designed to cover the nuances of FlatBuffers usage,\nspecific to C#.\n\nYou should also have read the [Building](../building.md)\ndocumentation to build `flatc` and should be familiar with\n[Using the schema compiler](../flatc.md) and\n[Writing a schema](../schema.md).\n\n## FlatBuffers C# code location\n\nThe code for the FlatBuffers C# library can be found at\n`flatbuffers/net/FlatBuffers`. You can browse the library on the\n[FlatBuffers GitHub page](https://github.com/google/flatbuffers/tree/master/net/\nFlatBuffers).\n\n## Building the FlatBuffers C# library\n\nThe `FlatBuffers.csproj` project contains multitargeting for .NET Standard 2.0, 2.1,\n.NET 6 and .NET 8.\n\nYou can build for a specific framework target when using the cross-platform\n[.NET Core SDK](https://dotnet.microsoft.com/download) by adding the `-f`\ncommand line option:\n\n~~~{.sh}\n    dotnet build -f netstandard2.1 \"FlatBuffers.csproj\"\n~~~\n\nThe `FlatBuffers.csproj` project also provides support for defining various\nconditional compilation symbols (see \"Conditional compilation symbols\" section\nbelow) using the `-p` command line option:\n\n~~~{.sh}\n    dotnet build -f netstandard2.1 -p:ENABLE_SPAN_T=true -p:UNSAFE_BYTEBUFFER=true \"FlatBuffers.csproj\"\n~~~\n\n## Testing the FlatBuffers C# library\n\nThe code to test the libraries can be found at `flatbuffers/tests`.\n\nThe test code for C# is located in the [FlatBuffers.Test](https://github.com/\ngoogle/flatbuffers/tree/master/tests/FlatBuffers.Test) subfolder. To run the\ntests, open `FlatBuffers.Test.csproj` in [Visual Studio](\nhttps://www.visualstudio.com), and compile/run the project.\n\nOptionally, you can run this using [Mono](http://www.mono-project.com/) instead.\nOnce you have installed Mono, you can run the tests from the command line\nby running the following commands from inside the `FlatBuffers.Test` folder:\n\n~~~{.sh}\n    mcs *.cs ../MyGame/Example/*.cs ../../net/FlatBuffers/*.cs\n    mono Assert.exe\n~~~\n\n## Using the FlatBuffers C# library\n\n*Note: See [Tutorial](../tutorial.md) for a more in-depth\nexample of how to use FlatBuffers in C#.*\n\nFlatBuffers supports reading and writing binary FlatBuffers in C#.\n\nTo use FlatBuffers in your own code, first generate C# classes from your\nschema with the `--csharp` option to `flatc`.\nThen you can include both FlatBuffers and the generated code to read\nor write a FlatBuffer.\n\nFor example, here is how you would read a FlatBuffer binary file in C#:\nFirst, import the library and generated code. Then, you read a FlatBuffer binary\nfile into a `byte[]`.  You then turn the `byte[]` into a `ByteBuffer`, which you\npass to the `GetRootAsMyRootType` function:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cs}\n    using MyGame.Example;\n    using Google.FlatBuffers;\n\n    // This snippet ignores exceptions for brevity.\n    byte[] data = File.ReadAllBytes(\"monsterdata_test.mon\");\n\n    ByteBuffer bb = new ByteBuffer(data);\n    Monster monster = Monster.GetRootAsMonster(bb);\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nNow you can access the data from the `Monster monster`:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cs}\n    short hp = monster.Hp;\n    Vec3 pos = monster.Pos;\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nC# code naming follows standard C# style with PascalCasing identifiers,\ne.g. `GetRootAsMyRootType`. Also, values (except vectors and unions) are\navailable as properties instead of parameterless accessor methods.\nThe performance-enhancing methods to which you can pass an already created\nobject are prefixed with `Get`, e.g.:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cs}\n    // property\n    var pos = monster.Pos;\n\n    // method filling a preconstructed object\n    var preconstructedPos = new Vec3();\n    monster.GetPos(preconstructedPos);\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n## Storing dictionaries in a FlatBuffer\n\nFlatBuffers doesn't support dictionaries natively, but there is support to\nemulate their behavior with vectors and binary search, which means you\ncan have fast lookups directly from a FlatBuffer without having to unpack\nyour data into a `Dictionary` or similar.\n\nTo use it:\n-   Designate one of the fields in a table as the \"key\" field. You do this\n    by setting the `key` attribute on this field, e.g.\n    `name:string (key)`.\n    You may only have one key field, and it must be of string or scalar type.\n-   Write out tables of this type as usual, collect their offsets in an\n    array.\n-   Instead of calling standard generated method,\n    e.g.: `Monster.createTestarrayoftablesVector`,\n    call `CreateSortedVectorOfMonster` in C#\n    which will first sort all offsets such that the tables they refer to\n    are sorted by the key field, then serialize it.\n-   Now when you're accessing the FlatBuffer, you can use\n    the `ByKey` accessor to access elements of the vector, e.g.:\n    `monster.TestarrayoftablesByKey(\"Frodo\")` in C#,\n    which returns an object of the corresponding table type,\n    or `null` if not found.\n    `ByKey` performs a binary search, so should have a similar\n    speed to `Dictionary`, though may be faster because of better caching.\n    `ByKey` only works if the vector has been sorted, it will\n    likely not find elements if it hasn't been sorted.\n\n## Buffer verification\n\nAs mentioned in [C++ Usage](cpp.md) buffer\naccessor functions do not verify buffer offsets at run-time.\nIf it is necessary, you can optionally use a buffer verifier before you\naccess the data. This verifier will check all offsets, all sizes of\nfields, and null termination of strings to ensure that when a buffer\nis accessed, all reads will end up inside the buffer.\n\nEach root type will have a verification function generated for it,\ne.g. `Monster.VerifyMonster`. This can be called as shown:\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cs}\n    var ok = Monster.VerifyMonster(buf);\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nif `ok` is true, the buffer is safe to read.\n\nFor a more detailed control of verification `MonsterVerify.Verify`\nfor `Monster` type can be used:\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cs}\n    # Sequence of calls\n    FlatBuffers.Verifier verifier = new FlatBuffers.Verifier(buf);\n    var ok = verifier.VerifyBuffer(\"MONS\", false, MonsterVerify.Verify);\n\n    # Or single line call\n    var ok = new FlatBuffers.Verifier(bb).setStringCheck(true).\\\n             VerifyBuffer(\"MONS\", false, MonsterVerify.Verify);\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nif `ok` is true, the buffer is safe to read.\n\nA second parameter of `verifyBuffer` specifies whether buffer content is\nsize prefixed or not. In the example above, the buffer is assumed to not include\nsize prefix (`false`).\n\nVerifier supports options that can be set using appropriate fluent methods:\n* SetMaxDepth - limit the nesting depth. Default: 1000000\n* SetMaxTables - total amount of tables the verifier may encounter. Default: 64\n* SetAlignmentCheck - check content alignment. Default: True\n* SetStringCheck - check if strings contain termination '0' character. Default: true\n\n\n## Text parsing\n\nThere currently is no support for parsing text (Schema's and JSON) directly\nfrom C#, though you could use the C++ parser through native call\ninterfaces available to each language. Please see the\nC++ documentation for more on text parsing.\n\n## Object based API\n\nFlatBuffers is all about memory efficiency, which is why its base API is written\naround using as little as possible of it. This does make the API clumsier\n(requiring pre-order construction of all data, and making mutation harder).\n\nFor times when efficiency is less important a more convenient object based API\ncan be used (through `--gen-object-api`) that is able to unpack & pack a\nFlatBuffer into objects and standard `System.Collections.Generic` containers,\nallowing for convenient construction, access and mutation.\n\nTo use:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cs}\n    // Deserialize from buffer into object.\n    MonsterT monsterobj = GetMonster(flatbuffer).UnPack();\n\n    // Update object directly like a C# class instance.\n    Console.WriteLine(monsterobj.Name);\n    monsterobj.Name = \"Bob\";  // Change the name.\n\n    // Serialize into new flatbuffer.\n    FlatBufferBuilder fbb = new FlatBufferBuilder(1);\n    fbb.Finish(Monster.Pack(fbb, monsterobj).Value);\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n### Json Serialization\n\nAn additional feature of the object API is the ability to allow you to\nserialize & deserialize a JSON text.\nTo use Json Serialization, add `--cs-gen-json-serializer` option to `flatc` and\nadd `Newtonsoft.Json` nuget package to csproj. This requires explicitly setting\nthe `--gen-object-api` option as well.\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cs}\n    // Deserialize MonsterT from json\n    string jsonText = File.ReadAllText(@\"Resources/monsterdata_test.json\");\n    MonsterT mon = MonsterT.DeserializeFromJson(jsonText);\n\n    // Serialize MonsterT to json\n    string jsonText2 = mon.SerializeToJson();\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n* Limitation\n  * `hash` attribute currently not supported.\n* NuGet package Dependency\n  * [Newtonsoft.Json](https://github.com/JamesNK/Newtonsoft.Json)\n\n## Conditional compilation symbols\n\nThere are three conditional compilation symbols that have an impact on\nperformance/features of the C# `ByteBuffer` implementation.\n\n* `UNSAFE_BYTEBUFFER`\n\n  This will use unsafe code to manipulate the underlying byte array. This can\n  yield a reasonable performance increase.\n\n* `BYTEBUFFER_NO_BOUNDS_CHECK`\n\n  This will disable the bounds check asserts to the byte array. This can yield a\n  small performance gain in normal code.\n\n* `ENABLE_SPAN_T`\n\n  This will enable reading and writing blocks of memory with a `Span<T>` instead\n  of just `T[]`. You can also enable writing directly to shared memory or other\n  types of memory by providing a custom implementation of `ByteBufferAllocator`.\n  `ENABLE_SPAN_T` also requires `UNSAFE_BYTEBUFFER` to be defined, or .NET\n  Standard 2.1.\n\nUsing `UNSAFE_BYTEBUFFER` and `BYTEBUFFER_NO_BOUNDS_CHECK` together can yield a\nperformance gain of ~15% for some operations, however doing so is potentially\ndangerous. Do so at your own risk!\n\n<br>\n"
  },
  {
    "path": "docs/source/languages/cpp.md",
    "content": "# Language Guide: C++\n\n## Before you get started\n\nBefore diving into the FlatBuffers usage in C++, it should be noted that\nthe [Tutorial](../tutorial.md) page has a complete guide\nto general FlatBuffers usage in all of the supported languages (including C++).\nThis page is designed to cover the nuances of FlatBuffers usage, specific to\nC++.\n\n#### Prerequisites\n\nThis page assumes you have written a FlatBuffers schema and compiled it\nwith the Schema Compiler. If you have not, please see\n[Using the schema compiler](../flatc.md)\nand [Writing a schema](../schema.md).\n\nAssuming you wrote a schema, say `mygame.fbs` (though the extension doesn't\nmatter), you've generated a C++ header called `mygame_generated.h` using the\ncompiler (e.g. `flatc -c mygame.fbs`), you can now start using this in\nyour program by including the header. As noted, this header relies on\n`flatbuffers/flatbuffers.h`, which should be in your include path.\n\n## FlatBuffers C++ library code location\n\nThe code for the FlatBuffers C++ library can be found at\n`flatbuffers/include/flatbuffers`. You can browse the library code on the\n[FlatBuffers GitHub page](https://github.com/google/flatbuffers/tree/master/include/flatbuffers).\n\n## Testing the FlatBuffers C++ library\n\nThe code to test the C++ library can be found at `flatbuffers/tests`.\nThe test code itself is located in\n[test.cpp](https://github.com/google/flatbuffers/blob/master/tests/test.cpp).\n\nThis test file is built alongside `flatc`. To review how to build the project,\nplease read the [Building](../building.md) documentation.\n\nTo run the tests, execute `flattests` from the root `flatbuffers/` directory.\nFor example, on [Linux](https://en.wikipedia.org/wiki/Linux), you would simply\nrun: `./flattests`.\n\n## Using the FlatBuffers C++ library\n\n*Note: See [Tutorial](../tutorial.md) for a more in-depth\nexample of how to use FlatBuffers in C++.*\n\nFlatBuffers supports both reading and writing FlatBuffers in C++.\n\nTo use FlatBuffers in your code, first generate the C++ classes from your\nschema with the `--cpp` option to `flatc`. Then you can include both FlatBuffers\nand the generated code to read or write FlatBuffers.\n\nFor example, here is how you would read a FlatBuffer binary file in C++:\nFirst, include the library and generated code. Then read the file into\na `char *` array, which you pass to `GetMonster()`.\n\n```cpp\n    #include \"flatbuffers/flatbuffers.h\"\n    #include \"monster_test_generate.h\"\n    #include <iostream> // C++ header file for printing\n    #include <fstream> // C++ header file for file access\n\n\n    std::ifstream infile;\n    infile.open(\"monsterdata_test.mon\", std::ios::binary | std::ios::in);\n    infile.seekg(0,std::ios::end);\n    int length = infile.tellg();\n    infile.seekg(0,std::ios::beg);\n    char *data = new char[length];\n    infile.read(data, length);\n    infile.close();\n\n    auto monster = GetMonster(data);\n```\n\n`monster` is of type `Monster *`, and points to somewhere *inside* your\nbuffer (root object pointers are not the same as `buffer_pointer` \\!).\nIf you look in your generated header, you'll see it has\nconvenient accessors for all fields, e.g. `hp()`, `mana()`, etc:\n\n```cpp\n    std::cout << \"hp : \" << monster->hp() << std::endl;              // '80'\n    std::cout << \"mana : \" << monster->mana() << std::endl;          // default value of '150'\n    std::cout << \"name : \" << monster->name()->c_str() << std::endl; // \"MyMonster\"\n```\n\n*Note: That we never stored a `mana` value, so it will return the default.*\n\nThe following attributes are supported:\n\n-   `shared` (on a field): For string fields, this enables the usage of string\n    pooling (i.e. `CreateSharedString`) as default serialization behavior.\n\n    Specifically, `CreateXxxDirect` functions and `Pack` functions for object\n    based API (see below) will use `CreateSharedString` to create strings.\n\n## Object based API\n\nFlatBuffers is all about memory efficiency, which is why its base API is written\naround using as little as possible of it. This does make the API clumsier\n(requiring pre-order construction of all data, and making mutation harder).\n\nFor times when efficiency is less important a more convenient object based API\ncan be used (through `--gen-object-api`) that is able to unpack & pack a\nFlatBuffer into objects and standard STL containers, allowing for convenient\nconstruction, access and mutation.\n\nTo use:\n\n```cpp\n    // Autogenerated class from table Monster.\n    MonsterT monsterobj;\n\n    // Deserialize from buffer into object.\n    GetMonster(flatbuffer)->UnPackTo(&monsterobj);\n\n    // Update object directly like a C++ class instance.\n    cout << monsterobj.name;  // This is now a std::string!\n    monsterobj.name = \"Bob\";  // Change the name.\n\n    // Serialize into new flatbuffer.\n    FlatBufferBuilder fbb;\n    fbb.Finish(Monster::Pack(fbb, &monsterobj));\n```\n\nThe following attributes are specific to the object-based API code generation:\n\n-   `native_inline` (on a field): Because FlatBuffer tables and structs are\n    optionally present in a given buffer, they are best represented as pointers\n    (specifically std::unique_ptrs) in the native class since they can be null.\n    This attribute changes the member declaration to use the type directly\n    rather than wrapped in a unique_ptr.\n\n-   `native_default(\"value\")` (on a field): For members that are declared\n    \"native_inline\", the value specified with this attribute will be included\n    verbatim in the class constructor initializer list for this member.\n\n-   `native_custom_alloc(\"custom_allocator\")` (on a table or struct): When using the\n    object-based API all generated NativeTables that  are allocated when unpacking\n    your  flatbuffer will use \"custom allocator\". The allocator is also used by\n    any std::vector that appears in a table defined with `native_custom_alloc`.\n    This can be  used to provide allocation from a pool for example, for faster\n    unpacking when using the object-based API.\n\nMinimal Example:\n\nschema:\n\n```cpp\n    table mytable(native_custom_alloc:\"custom_allocator\") {\n      ...\n    }\n```\n\nwith `custom_allocator` defined before `flatbuffers.h` is included, as:\n\n```cpp\n    template <typename T> struct custom_allocator : public std::allocator<T> {\n\n      typedef T *pointer;\n\n      template <class U>\n      struct rebind {\n        typedef custom_allocator<U> other;\n      };\n\n      pointer allocate(const std::size_t n) {\n        return std::allocator<T>::allocate(n);\n      }\n\n      void deallocate(T* ptr, std::size_t n) {\n        return std::allocator<T>::deallocate(ptr,n);\n      }\n\n      custom_allocator() throw() {}\n\n      template <class U>\n      custom_allocator(const custom_allocator<U>&) throw() {}\n    };\n```\n\n-   `native_type(\"type\")` (on a struct): In some cases, a more optimal C++ data\ntype exists for a given struct.  For example, the following schema:\n\n```cpp\n    struct Vec2 {\n      x: float;\n      y: float;\n    }\n```\n\ngenerates the following Object-Based API class:\n\n```cpp\n    struct Vec2T : flatbuffers::NativeTable {\n      float x;\n      float y;\n    };\n```\n\nHowever, it can be useful to instead use a user-defined C++ type since it\ncan provide more functionality, eg.\n\n```cpp\n    struct vector2 {\n      float x = 0, y = 0;\n      vector2 operator+(vector2 rhs) const { ... }\n      vector2 operator-(vector2 rhs) const { ... }\n      float length() const { ... }\n      // etc.\n    };\n```\n\nThe `native_type` attribute will replace the usage of the generated class\nwith the given type.  So, continuing with the example, the generated\ncode would use `vector2` in place of `Vec2T` for all generated code of\nthe Object-Based API.\n\nHowever, because the `native_type` is unknown to flatbuffers, the user must\nprovide the following functions to aide in the serialization process:\n\n```cpp\n    namespace flatbuffers {\n      Vec2 Pack(const vector2& obj);\n      vector2 UnPack(const Vec2& obj);\n    }\n```\n\n-   `native_type_pack_name(\"name\")` (on a struct when `native_type` is\n    specified, too): when you want to use the same `native_type` multiple times\n    (e. g. with different precision) you must make the names of the Pack/UnPack\n    functions unique, otherwise you will run into compile errors. This attribute\n    appends a name to the expected Pack/UnPack functions. So when you\n    specify `native_type_pack_name(\"Vec2\")` in the above example you now need to\n    implement these serialization functions instead:\n\n```cpp\n    namespace flatbuffers {\n      Vec2 PackVec2(const vector2& obj);\n      vector2 UnPackVec2(const Vec2& obj);\n    }\n```\n\n-   `native_type(\"type\")` (on a table): Tables can also be represented with\nnative types. For example, the following schema:\n\n```cpp\n    table Matrix (native_type: \"NativeMatrix\") {\n      rows: int32;\n      columns: int32;\n      values: [float];\n    }\n```\n\nWould be represented by a user-defined C++ class:\n\n```cpp\n    class NativeMatrix { ... }\n```\n\nIn this case, the following function declarations are generated by the compiler.\nThe user must provide and link the matching function definitions:\n\n```cpp\n    struct Matrix FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n      // ...\n\n      static ::flatbuffers::Offset<Matrix> Pack(\n          ::flatbuffers::FlatBufferBuilder& _fbb,\n          const NativeMatrix* _o,\n          const ::flatbuffers::rehasher_function_t* _rehasher = nullptr);\n\n      void UnPackTo(\n          NativeMatrix* _o,\n          const ::flatbuffers::resolver_function_t* _resolver = nullptr) const;\n    }\n```\n\nFinally, the following top-level attributes:\n\n-   `native_include(\"path\")` (at file level): Because the `native_type` attribute\n    can be used to introduce types that are unknown to flatbuffers, it may be\n    necessary to include \"external\" header files in the generated code.  This\n    attribute can be used to directly add an #include directive to the top of\n    the generated code that includes the specified path directly.\n\n-   `force_align`: this attribute may not be respected in the object API,\n    depending on the aligned of the allocator used with `new`.\n\n## External references\n\nAn additional feature of the object API is the ability to allow you to load\nmultiple independent FlatBuffers, and have them refer to eachothers objects\nusing hashes which are then represented as typed pointers in the object API.\n\nTo make this work have a field in the objects you want to referred to which is\nusing the string hashing feature (see `hash` attribute in the\n[schema](../schema.md) documentation). Then you have\na similar hash in the field referring to it, along with a `cpp_type`\nattribute specifying the C++ type this will refer to (this can be any C++\ntype, and will get a `*` added).\n\nThen, in JSON or however you create these buffers, make sure they use the\nsame string (or hash).\n\nWhen you call `UnPack` (or `Create`), you'll need a function that maps from\nhash to the object (see `resolver_function_t` for details).\n\n## Using different pointer types\n\nBy default the object tree is built out of `std::unique_ptr`, but you can\ninfluence this either globally (using the `--cpp-ptr-type` argument to\n`flatc`) or per field (using the `cpp_ptr_type` attribute) to by any smart\npointer type (`my_ptr<T>`), or by specifying `naked` as the type to get `T *`\npointers. Unlike the smart pointers, naked pointers do not manage memory for\nyou, so you'll have to manage their lifecycles manually.  To reference the\npointer type specified by the `--cpp-ptr-type` argument to `flatc` from a\nflatbuffer field set the `cpp_ptr_type` attribute to `default_ptr_type`.\n\n## Using different string type\n\nBy default the object tree is built out of `std::string`, but you can\ninfluence this either globally (using the `--cpp-str-type` argument to\n`flatc`) or per field using the `cpp_str_type` attribute.\n\nThe type must support `T::c_str()`, `T::length()` and `T::empty()` as member functions.\n\nFurther, the type must be constructible from std::string, as by default a\nstd::string instance is constructed and then used to initialize the custom\nstring type. This behavior impedes efficient and zero-copy construction of\ncustom string types; the `--cpp-str-flex-ctor` argument to `flatc` or the\nper field attribute `cpp_str_flex_ctor` can be used to change this behavior,\nso that the custom string type is constructed by passing the pointer and\nlength of the FlatBuffers String. The custom string class will require a\nconstructor in the following format: `custom_str_class(const char *, size_t)`.\nPlease note that the character array is not guaranteed to be NULL terminated,\nyou should always use the provided size to determine end of string.\n\n## Reflection (& Resizing)\n\nThere is experimental support for reflection in FlatBuffers, allowing you to\nread and write data even if you don't know the exact format of a buffer, and\neven allows you to change sizes of strings and vectors in-place.\n\nThe way this works is very elegant; there is actually a FlatBuffer schema that\ndescribes schemas (\\!) which you can find in `reflection/reflection.fbs`.\nThe compiler, `flatc`, can write out any schemas it has just parsed as a binary\nFlatBuffer, corresponding to this meta-schema.\n\nLoading in one of these binary schemas at runtime allows you traverse any\nFlatBuffer data that corresponds to it without knowing the exact format. You\ncan query what fields are present, and then read/write them after.\n\nFor convenient field manipulation, you can include the header\n`flatbuffers/reflection.h` which includes both the generated code from the meta\nschema, as well as a lot of helper functions.\n\nAnd example of usage, for the time being, can be found in\n`test.cpp/ReflectionTest()`.\n\n## Mini Reflection\n\nA more limited form of reflection is available for direct inclusion in\ngenerated code, which doesn't do any (binary) schema access at all. It was designed\nto keep the overhead of reflection as low as possible (on the order of 2-6\nbytes per field added to your executable), but doesn't contain all the\ninformation the (binary) schema contains.\n\nYou add this information to your generated code by specifying `--reflect-types`\n(or instead `--reflect-names` if you also want field / enum names).\n\nYou can now use this information, for example to print a FlatBuffer to text:\n\n    auto s = flatbuffers::FlatBufferToString(flatbuf, MonsterTypeTable());\n\n`MonsterTypeTable()` is declared in the generated code for each type. The\nstring produced is very similar to the JSON produced by the `Parser` based\ntext generator.\n\nYou'll need `flatbuffers/minireflect.h` for this functionality. In there is also\na convenient visitor/iterator so you can write your own output / functionality\nbased on the mini reflection tables without having to know the FlatBuffers or\nreflection encoding.\n\n## Storing maps / dictionaries in a FlatBuffer\n\nFlatBuffers doesn't support maps natively, but there is support to\nemulate their behavior with vectors and binary search, which means you\ncan have fast lookups directly from a FlatBuffer without having to unpack\nyour data into a `std::map` or similar.\n\nTo use it:\n-   Designate one of the fields in a table as they \"key\" field. You do this\n    by setting the `key` attribute on this field, e.g.\n    `name:string (key)`.\n    You may only have one key field, and it must be of string or scalar type.\n-   Write out tables of this type as usual, collect their offsets in an\n    array or vector.\n-   Instead of `CreateVector`, call `CreateVectorOfSortedTables`,\n    which will first sort all offsets such that the tables they refer to\n    are sorted by the key field, then serialize it.\n-   Now when you're accessing the FlatBuffer, you can use `Vector::LookupByKey`\n    instead of just `Vector::Get` to access elements of the vector, e.g.:\n    `myvector->LookupByKey(\"Fred\")`, which returns a pointer to the\n    corresponding table type, or `nullptr` if not found.\n    `LookupByKey` performs a binary search, so should have a similar speed to\n    `std::map`, though may be faster because of better caching. `LookupByKey`\n    only works if the vector has been sorted, it will likely not find elements\n    if it hasn't been sorted.\n\n## Direct memory access\n\nAs you can see from the above examples, all elements in a buffer are\naccessed through generated accessors. This is because everything is\nstored in little endian format on all platforms (the accessor\nperforms a swap operation on big endian machines), and also because\nthe layout of things is generally not known to the user.\n\nFor structs, layout is deterministic and guaranteed to be the same\nacross platforms (scalars are aligned to their\nown size, and structs themselves to their largest member), and you\nare allowed to access this memory directly by using `sizeof()` and\n`memcpy` on the pointer to a struct, or even an array of structs.\n\nTo compute offsets to sub-elements of a struct, make sure they\nare a structs themselves, as then you can use the pointers to\nfigure out the offset without having to hardcode it. This is\nhandy for use of arrays of structs with calls like `glVertexAttribPointer`\nin OpenGL or similar APIs.\n\nIt is important to note is that structs are still little endian on all\nmachines, so only use tricks like this if you can guarantee you're not\nshipping on a big endian machine (an `assert(FLATBUFFERS_LITTLEENDIAN)`\nwould be wise).\n\n## Access of untrusted buffers\n\nThe generated accessor functions access fields over offsets, which is\nvery quick. These offsets are not verified at run-time, so a malformed\nbuffer could cause a program to crash by accessing random memory.\n\nWhen you're processing large amounts of data from a source you know (e.g.\nyour own generated data on disk), this is acceptable, but when reading\ndata from the network that can potentially have been modified by an\nattacker, this is undesirable.\n\nFor this reason, you can optionally use a buffer verifier before you\naccess the data. This verifier will check all offsets, all sizes of\nfields, and null termination of strings to ensure that when a buffer\nis accessed, all reads will end up inside the buffer.\n\nEach root type will have a verification function generated for it,\ne.g. for `Monster`, you can call:\n\n```cpp\n\tVerifier verifier(buf, len);\n\tbool ok = VerifyMonsterBuffer(verifier);\n```\n\nif `ok` is true, the buffer is safe to read.\n\nBesides untrusted data, this function may be useful to call in debug\nmode, as extra insurance against data being corrupted somewhere along\nthe way.\n\nWhile verifying a buffer isn't \"free\", it is typically faster than\na full traversal (since any scalar data is not actually touched),\nand since it may cause the buffer to be brought into cache before\nreading, the actual overhead may be even lower than expected.\n\nIn specialized cases where a denial of service attack is possible,\nthe verifier has two additional constructor arguments that allow\nyou to limit the nesting depth and total amount of tables the\nverifier may encounter before declaring the buffer malformed. The default is\n`Verifier(buf, len, 64 /* max depth */, 1000000, /* max tables */)` which\nshould be sufficient for most uses.\n\n## Text & schema parsing\n\nUsing binary buffers with the generated header provides a super low\noverhead use of FlatBuffer data. There are, however, times when you want\nto use text formats, for example because it interacts better with source\ncontrol, or you want to give your users easy access to data.\n\nAnother reason might be that you already have a lot of data in JSON\nformat, or a tool that generates JSON, and if you can write a schema for\nit, this will provide you an easy way to use that data directly.\n\n(see the schema documentation for some specifics on the JSON format\naccepted).\n\nSchema evolution compatibility for the JSON format follows the same rules as the binary format (JSON formatted data will be forwards/backwards compatible with schemas that evolve in a compatible way).\n\nThere are two ways to use text formats:\n\n#### Using the compiler as a conversion tool\n\nThis is the preferred path, as it doesn't require you to add any new\ncode to your program, and is maximally efficient since you can ship with\nbinary data. The disadvantage is that it is an extra step for your\nusers/developers to perform, though you might be able to automate it.\n\n    flatc -b myschema.fbs mydata.json\n\nThis will generate the binary file `mydata_wire.bin` which can be loaded\nas before.\n\n#### Making your program capable of loading text directly\n\nThis gives you maximum flexibility. You could even opt to support both,\ni.e. check for both files, and regenerate the binary from text when\nrequired, otherwise just load the binary.\n\nThis option is currently only available for C++, or Java through JNI.\n\nAs mentioned in the section \"Building\" above, this technique requires\nyou to link a few more files into your program, and you'll want to include\n`flatbuffers/idl.h`.\n\nLoad text (either a schema or json) into an in-memory buffer (there is a\nconvenient `LoadFile()` utility function in `flatbuffers/util.h` if you\nwish). Construct a parser:\n\n```cpp\n    flatbuffers::Parser parser;\n```\n\nNow you can parse any number of text files in sequence:\n\n```cpp\n    parser.Parse(text_file.c_str());\n```\n\nThis works similarly to how the command-line compiler works: a sequence\nof files parsed by the same `Parser` object allow later files to\nreference definitions in earlier files. Typically this means you first\nload a schema file (which populates `Parser` with definitions), followed\nby one or more JSON files.\n\nAs optional argument to `Parse`, you may specify a null-terminated list of\ninclude paths. If not specified, any include statements try to resolve from\nthe current directory.\n\nIf there were any parsing errors, `Parse` will return `false`, and\n`Parser::error_` contains a human readable error string with a line number\netc, which you should present to the creator of that file.\n\nAfter each JSON file, the `Parser::fbb` member variable is the\n`FlatBufferBuilder` that contains the binary buffer version of that\nfile, that you can access as described above.\n\n`samples/sample_text.cpp` is a code sample showing the above operations.\n\n## Threading\n\nReading a FlatBuffer does not touch any memory outside the original buffer,\nand is entirely read-only (all const), so is safe to access from multiple\nthreads even without synchronisation primitives.\n\nCreating a FlatBuffer is not thread safe. All state related to building\na FlatBuffer is contained in a FlatBufferBuilder instance, and no memory\noutside of it is touched. To make this thread safe, either do not\nshare instances of FlatBufferBuilder between threads (recommended), or\nmanually wrap it in synchronisation primitives. There's no automatic way to\naccomplish this, by design, as we feel multithreaded construction\nof a single buffer will be rare, and synchronisation overhead would be costly.\n\n## Advanced union features\n\nThe C++ implementation currently supports vectors of unions (i.e. you can\ndeclare a field as `[T]` where `T` is a union type instead of a table type). It\nalso supports structs and strings in unions, besides tables.\n\nFor an example of these features, see `tests/union_vector`, and\n`UnionVectorTest` in `test.cpp`.\n\nSince these features haven't been ported to other languages yet, if you\nchoose to use them, you won't be able to use these buffers in other languages\n(`flatc` will refuse to compile a schema that uses these features).\n\nThese features reduce the amount of \"table wrapping\" that was previously\nneeded to use unions.\n\nTo use scalars, simply wrap them in a struct.\n\n## Depth limit of nested objects and stack-overflow control\nThe parser of Flatbuffers schema or json-files is kind of recursive parser.\nTo avoid stack-overflow problem the parser has a built-in limiter of\nrecursion depth. Number of nested declarations in a schema or number of\nnested json-objects is limited. By default, this depth limit set to `64`.\nIt is possible to override this limit with `FLATBUFFERS_MAX_PARSING_DEPTH`\ndefinition. This definition can be helpful for testing purposes or embedded\napplications. For details see [build](../building.md) of\nCMake-based projects.\n\n## Dependence from C-locale {#flatbuffers_locale_cpp}\nThe Flatbuffers [grammar](../grammar.md) uses ASCII\ncharacter set for identifiers, alphanumeric literals, reserved words.\n\nInternal implementation of the Flatbuffers depends from functions which\ndepend from C-locale: `strtod()` or `strtof()`, for example.\nThe library expects the dot `.` symbol as the separator of an integer\npart from the fractional part of a float number.\nAnother separator symbols (`,` for example) will break the compatibility\nand may lead to an error while parsing a Flatbuffers schema or a json file.\n\nThe Standard C locale is a global resource, there is only one locale for\nthe entire application. Some modern compilers and platforms have\nlocale-independent or locale-narrow functions `strtof_l`, `strtod_l`,\n`strtoll_l`, `strtoull_l` to resolve this dependency.\nThese functions use specified locale rather than the global or per-thread\nlocale instead. They are part of POSIX-2008 but not part of the C/C++\nstandard library, therefore, may be missing on some platforms.\nThe Flatbuffers library try to detect these functions at configuration and\ncompile time:\n- CMake `\"CMakeLists.txt\"`:\n  - Check existence of `strtol_l` and `strtod_l` in the `<stdlib.h>`.\n- Compile-time `\"/include/base.h\"`:\n  - `_MSC_VER >= 1900`: MSVC2012 or higher if build with MSVC.\n  - `_XOPEN_SOURCE>=700`: POSIX-2008 if build with GCC/Clang.\n\nAfter detection, the definition `FLATBUFFERS_LOCALE_INDEPENDENT` will be\nset to `0` or `1`.\nTo override or stop this detection use CMake `-DFLATBUFFERS_LOCALE_INDEPENDENT={0|1}`\nor predefine `FLATBUFFERS_LOCALE_INDEPENDENT` symbol.\n\nTo test the compatibility of the Flatbuffers library with\na specific locale use the environment variable `FLATBUFFERS_TEST_LOCALE`:\n```sh\n>FLATBUFFERS_TEST_LOCALE=\"\" ./flattests\n>FLATBUFFERS_TEST_LOCALE=\"ru_RU.CP1251\" ./flattests\n```\n\n## Support of floating-point numbers\nThe Flatbuffers library assumes that a C++ compiler and a CPU are\ncompatible with the `IEEE-754` floating-point standard.\nThe schema and json parser may fail if `fast-math` or `/fp:fast` mode is active.\n\n### Support of hexadecimal and special floating-point numbers\nAccording to the [grammar](../grammar.md) `fbs` and `json` files\nmay use hexadecimal and special (`NaN`, `Inf`) floating-point literals.\nThe Flatbuffers uses `strtof` and `strtod` functions to parse floating-point\nliterals. The Flatbuffers library has a code to detect a compiler compatibility\nwith the literals. If necessary conditions are met the preprocessor constant\n`FLATBUFFERS_HAS_NEW_STRTOD` will be set to `1`.\nThe support of floating-point literals will be limited at compile time\nif `FLATBUFFERS_HAS_NEW_STRTOD` constant is less than `1`.\nIn this case, schemas with hexadecimal or special literals cannot be used.\n\n### Comparison of floating-point NaN values\nThe floating-point `NaN` (`not a number`) is special value which\nrepresenting an undefined or unrepresentable value.\n`NaN` may be explicitly assigned to variables, typically as a representation\nfor missing values or may be a result of a mathematical operation.\nThe `IEEE-754` defines two kind of `NaNs`:\n- Quiet NaNs, or `qNaNs`.\n- Signaling NaNs, or `sNaNs`.\n\nAccording to the `IEEE-754`, a comparison with `NaN` always returns\nan unordered result even when compared with itself. As a result, a whole\nFlatbuffers object will be not equal to itself if has one or more `NaN`.\nFlatbuffers scalar fields that have the default value are not actually stored\nin the serialized data but are generated in code (see [Writing a schema](../schema.md)).\nScalar fields with `NaN` defaults break this behavior.\nIf a schema has a lot of `NaN` defaults the Flatbuffers can override\nthe unordered comparison by the ordered: `(NaN==NaN)->true`.\nThis ordered comparison is enabled when compiling a program with the symbol\n`FLATBUFFERS_NAN_DEFAULTS` defined.\nAdditional computations added by `FLATBUFFERS_NAN_DEFAULTS` are very cheap\nif GCC or Clang used. These compilers have a compile-time implementation\nof `isnan` checking which MSVC does not.\n\n## gRPC\n\n### Before you get started\n\nBefore diving into the FlatBuffers gRPC usage in C++, you should already be\nfamiliar with the following:\n\n- FlatBuffers as a serialization format\n- [gRPC](http://www.grpc.io/docs/) usage\n\n### Using the FlatBuffers gRPC C++ library\n\nNOTE: The examples below are also in the `grpc/samples/greeter` directory.\n\nWe will illustrate usage with the following schema:\n\n```c++ title=\"grpc/samples/greeter/greeter.fbs\"\n--8<-- \"https://raw.githubusercontent.com/google/flatbuffers/refs/heads/master/grpc/samples/greeter/greeter.fbs\"\n```\n\nWhen we run `flatc`, we pass in the `--grpc` option and generage an additional\n`greeter.grpc.fb.h` and `greeter.grpc.fb.cc`.\n\nExample server code looks like this:\n\n```c++ title=\"grpc/samples/greeter/server.cpp\"\n--8<-- \"https://raw.githubusercontent.com/google/flatbuffers/refs/heads/master/grpc/samples/greeter/server.cpp\"\n```\n\nExample client code looks like this:\n\n```c++ title=\"grpc/samples/greeter/client.cpp\"\n--8<-- \"https://raw.githubusercontent.com/google/flatbuffers/refs/heads/master/grpc/samples/greeter/client.cpp\"\n```\n\n"
  },
  {
    "path": "docs/source/languages/dart.md",
    "content": "Use in Dart    {#flatbuffers_guide_use_dart}\n===========\n\n## Before you get started\n\nBefore diving into the FlatBuffers usage in Dart, it should be noted that\nthe [Tutorial](../tutorial.md) page has a complete guide\nto general FlatBuffers usage in all of the supported languages (including Dart).\nThis page is designed to cover the nuances of FlatBuffers usage, specific to\nDart.\n\nYou should also have read the [Building](../building.md)\ndocumentation to build `flatc` and should be familiar with\n[Using the schema compiler](../flatc.md) and\n[Writing a schema](../schema.md).\n\n## FlatBuffers Dart library code location\n\nThe code for the FlatBuffers Dart library can be found at\n`flatbuffers/dart`. You can browse the library code on the [FlatBuffers\nGitHub page](https://github.com/google/flatbuffers/tree/master/dart).\n\n## Testing the FlatBuffers Dart library\n\nThe code to test the Dart library can be found at `flatbuffers/tests`.\nThe test code itself is located in [dart_test.dart](https://github.com/google/\nflatbuffers/blob/master/tests/dart_test.dart).\n\nTo run the tests, use the [DartTest.sh](https://github.com/google/flatbuffers/\nblob/master/tests/DartTest.sh) shell script.\n\n*Note: The shell script requires the [Dart SDK](https://www.dartlang.org/tools/sdk)\nto be installed.*\n\n## Using the FlatBuffers Dart library\n\n*Note: See [Tutorial](../tutorial.md) for a more in-depth\nexample of how to use FlatBuffers in Dart.*\n\nFlatBuffers supports reading and writing binary FlatBuffers in Dart.\n\nTo use FlatBuffers in your own code, first generate Dart classes from your\nschema with the `--dart` option to `flatc`. Then you can include both FlatBuffers\nand the generated code to read or write a FlatBuffer.\n\nFor example, here is how you would read a FlatBuffer binary file in Dart: First,\ninclude the library and generated code. Then read a FlatBuffer binary file into\na `List<int>`, which you pass to the factory constructor for `Monster`:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.dart}\nimport 'dart:io' as io;\n\nimport 'package:flat_buffers/flat_buffers.dart' as fb;\nimport './monster_my_game.sample_generated.dart' as myGame;\n\nList<int> data = await new io.File('monster.dat').readAsBytes();\nvar monster = new myGame.Monster(data);\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nNow you can access values like this:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.dart}\nvar hp = monster.hp;\nvar pos = monster.pos;\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n## Differences from the Dart SDK Front End flat_buffers\n\nThe work in this repository is signfiicantly based on the implementation used\ninternally by the Dart SDK in the front end/analyzer package. Several\nsignificant changes have been made.\n\n1. Support for packed boolean lists has been removed.  This is not standard\n   in other implementations and is not compatible with them.  Do note that,\n   like in the JavaScript implementation, __null values in boolean lists\n   will be treated as false__.  It is also still entirely possible to pack data\n   in a single scalar field, but that would have to be done on the application\n   side.\n2. The SDK implementation supports enums with regular Dart enums, which\n   works if enums are always indexed at 1; however, FlatBuffers does not\n   require that.  This implementation uses specialized enum-like classes to\n   ensure proper mapping from FlatBuffers to Dart and other platforms.\n3. The SDK implementation does not appear to support FlatBuffer structs or\n   vectors of structs - it treated everything as a built-in scalar or a table.\n   This implementation treats structs in a way that is compatible with other\n   non-Dart implementations, and properly handles vectors of structs.  Many of\n   the methods prefixed with 'low' have been prepurposed to support this.\n4. The SDK implementation treats int64 and uint64 as float64s. This\n   implementation does not.  This may cause problems with JavaScript\n   compatibility - however, it should be possible to use the JavaScript\n   implementation, or to do a customized implementation that treats all 64 bit\n   numbers as floats.  Supporting the Dart VM and Flutter was a more important\n   goal of this implementation.  Support for 16 bit integers was also added.\n5. The code generation in this offers an \"ObjectBuilder\", which generates code\n   very similar to the SDK classes that consume FlatBuffers, as well as Builder\n   classes, which produces code which more closely resembles the builders in\n   other languages. The ObjectBuilder classes are easier to use, at the cost of\n   additional references allocated.\n\n## Text Parsing\n\nThere currently is no support for parsing text (Schema's and JSON) directly\nfrom Dart, though you could use the C++ parser through Dart Native Extensions.\nPlease see the C++ documentation for more on text parsing (note that this is\nnot currently an option in Flutter - follow [this issue](https://github.com/flutter/flutter/issues/7053)\nfor the latest).\n\n## Object based API\n\nFlatBuffers is all about memory efficiency, which is why its base API is written\naround using as little as possible of it. This does make the API clumsier\n(requiring pre-order construction of all data, and making mutation harder).\n\nFor times when efficiency is less important a more convenient object based API\ncan be used (through `--gen-object-api`) that is able to unpack & pack a FlatBuffer\ninto objects and lists, allowing for convenient construction, access and mutation.\n\nTo use:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.dart}\n    // Deserialize from buffer into object.\n    MonsterT monster = Monster(flatbuffer).unpack();\n\n    // Update object directly like a Dart class instance.\n    print(monster.Name);\n    monster.Name = \"Bob\";  // Change the name.\n\n    // Serialize into new flatbuffer.\n    final fbb = Builder();\n    fbb.Finish(monster.pack(fbb));\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"
  },
  {
    "path": "docs/source/languages/go.md",
    "content": "Use in Go    {#flatbuffers_guide_use_go}\n=========\n\n## Before you get started\n\nBefore diving into the FlatBuffers usage in Go, it should be noted that\nthe [Tutorial](../tutorial.md) page has a complete guide\nto general FlatBuffers usage in all of the supported languages (including Go).\nThis page is designed to cover the nuances of FlatBuffers usage, specific to\nGo.\n\nYou should also have read the [Building](../building.md)\ndocumentation to build `flatc` and should be familiar with\n[Using the schema compiler](../flatc.md) and\n[Writing a schema](../schema.md).\n\n## FlatBuffers Go library code location\n\nThe code for the FlatBuffers Go library can be found at\n`flatbuffers/go`. You can browse the library code on the [FlatBuffers\nGitHub page](https://github.com/google/flatbuffers/tree/master/go).\n\n## Testing the FlatBuffers Go library\n\nThe code to test the Go library can be found at `flatbuffers/tests`.\nThe test code itself is located in [go_test.go](https://github.com/google/\nflatbuffers/blob/master/tests/go_test.go).\n\nTo run the tests, use the [GoTest.sh](https://github.com/google/flatbuffers/\nblob/master/tests/GoTest.sh) shell script.\n\n*Note: The shell script requires [Go](https://golang.org/doc/install) to\nbe installed.*\n\n## Using the FlatBuffers Go library\n\n*Note: See [Tutorial](../tutorial.md) for a more in-depth\nexample of how to use FlatBuffers in Go.*\n\nFlatBuffers supports reading and writing binary FlatBuffers in Go.\n\nTo use FlatBuffers in your own code, first generate Go classes from your\nschema with the `--go` option to `flatc`. Then you can include both FlatBuffers\nand the generated code to read or write a FlatBuffer.\n\nFor example, here is how you would read a FlatBuffer binary file in Go: First,\ninclude the library and generated code. Then read a FlatBuffer binary file into\na `[]byte`, which you pass to the `GetRootAsMonster` function:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.go}\n    import (\n       example \"MyGame/Example\"\n       flatbuffers \"github.com/google/flatbuffers/go\"\n\n       \"os\"\n    )\n\n    buf, err := os.ReadFile(\"monster.dat\")\n    // handle err\n    monster := example.GetRootAsMonster(buf, 0)\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nNow you can access values like this:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.go}\n    hp := monster.Hp()\n    pos := monster.Pos(nil)\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n\nIn some cases it's necessary to modify values in an existing FlatBuffer in place (without creating a copy). For this reason, scalar fields of a Flatbuffer table or struct can be mutated.\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.go}\n    monster := example.GetRootAsMonster(buf, 0)\n\n    // Set table field.\n    if ok := monster.MutateHp(10); !ok {\n      panic(\"failed to mutate Hp\")\n    }\n\n    // Set struct field.\n    monster.Pos().MutateZ(4)\n\n    // This mutation will fail because the mana field is not available in\n    // the buffer. It should be set when creating the buffer.\n    if ok := monster.MutateMana(20); !ok {\n      panic(\"failed to mutate Hp\")\n    }\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe term `mutate` is used instead of `set` to indicate that this is a special use case. All mutate functions return a boolean value which is false if the field we're trying to mutate is not available in the buffer.\n\n## Text Parsing\n\nThere currently is no support for parsing text (Schema's and JSON) directly\nfrom Go, though you could use the C++ parser through cgo. Please see the\nC++ documentation for more on text parsing.\n\n<br>\n"
  },
  {
    "path": "docs/source/languages/java.md",
    "content": "Use in Java    {#flatbuffers_guide_use_java}\n==============\n\n## Before you get started\n\nBefore diving into the FlatBuffers usage in Java, it should be noted that\nthe [Tutorial](../tutorial.md) page has a complete guide to\ngeneral FlatBuffers usage in all of the supported languages (including Java).\nThis page is designed to cover the nuances of FlatBuffers usage,\nspecific to Java.\n\nYou should also have read the [Building](../building.md)\ndocumentation to build `flatc` and should be familiar with\n[Using the schema compiler](../flatc.md) and\n[Writing a schema](../schema.md).\n\n## FlatBuffers Java code location\n\nThe code for the FlatBuffers Java library can be found at\n`flatbuffers/java/com/google/flatbuffers`. You can browse the library on the\n[FlatBuffers GitHub page](https://github.com/google/flatbuffers/tree/master/\njava/com/google/flatbuffers).\n\n## Testing the FlatBuffers Java libraries\n\nThe code to test the libraries can be found at `flatbuffers/tests`.\n\nThe test code for Java is located in [JavaTest.java](https://github.com/google\n/flatbuffers/blob/master/tests/JavaTest.java).\n\nTo run the tests, use either [JavaTest.sh](https://github.com/google/\nflatbuffers/blob/master/tests/JavaTest.sh) or [JavaTest.bat](https://github.com/\ngoogle/flatbuffers/blob/master/tests/JavaTest.bat), depending on your operating\nsystem.\n\n*Note: These scripts require that [Java](https://www.oracle.com/java/index.html)\nis installed.*\n\n## Using the FlatBuffers Java library\n\n*Note: See [Tutorial](../tutorial.md) for a more in-depth\nexample of how to use FlatBuffers in Java.*\n\nFlatBuffers supports reading and writing binary FlatBuffers in Java.\n\nTo use FlatBuffers in your own code, first generate Java classes from your\nschema with the `--java` option to `flatc`.\nThen you can include both FlatBuffers and the generated code to read\nor write a FlatBuffer.\n\nFor example, here is how you would read a FlatBuffer binary file in Java:\nFirst, import the library and generated code. Then, you read a FlatBuffer binary\nfile into a `byte[]`.  You then turn the `byte[]` into a `ByteBuffer`, which you\npass to the `getRootAsMyRootType` function:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.java}\n    import MyGame.Example.*;\n    import com.google.flatbuffers.FlatBufferBuilder;\n\n    // This snippet ignores exceptions for brevity.\n    File file = new File(\"monsterdata_test.mon\");\n    RandomAccessFile f = new RandomAccessFile(file, \"r\");\n    byte[] data = new byte[(int)f.length()];\n    f.readFully(data);\n    f.close();\n\n    ByteBuffer bb = ByteBuffer.wrap(data);\n    Monster monster = Monster.getRootAsMonster(bb);\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nNow you can access the data from the `Monster monster`:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.java}\n    short hp = monster.hp();\n    Vec3 pos = monster.pos();\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n## Storing dictionaries in a FlatBuffer\n\nFlatBuffers doesn't support dictionaries natively, but there is support to\nemulate their behavior with vectors and binary search, which means you\ncan have fast lookups directly from a FlatBuffer without having to unpack\nyour data into a `Dictionary` or similar.\n\nTo use it:\n-   Designate one of the fields in a table as the \"key\" field. You do this\n    by setting the `key` attribute on this field, e.g.\n    `name:string (key)`.\n    You may only have one key field, and it must be of string or scalar type.\n-   Write out tables of this type as usual, collect their offsets in an\n    array.\n-   Instead of calling standard generated method,\n    e.g.: `Monster.createTestarrayoftablesVector`,\n    call `createSortedVectorOfTables` (from the `FlatBufferBuilder` object).\n    which will first sort all offsets such that the tables they refer to\n    are sorted by the key field, then serialize it.\n-   Now when you're accessing the FlatBuffer, you can use\n    the `ByKey` accessor to access elements of the vector, e.g.:\n    `monster.testarrayoftablesByKey(\"Frodo\")`.\n    which returns an object of the corresponding table type,\n    or `null` if not found.\n    `ByKey` performs a binary search, so should have a similar\n    speed to `Dictionary`, though may be faster because of better caching.\n    `ByKey` only works if the vector has been sorted, it will\n    likely not find elements if it hasn't been sorted.\n\n## Text parsing\n\nThere currently is no support for parsing text (Schema's and JSON) directly\nfrom Java, though you could use the C++ parser through native call\ninterfaces available to each language. Please see the\nC++ documentation for more on text parsing.\n\n<br>\n"
  },
  {
    "path": "docs/source/languages/javascript.md",
    "content": "Use in JavaScript    {#flatbuffers_guide_use_javascript}\n=================\n\n## Before you get started\n\nBefore diving into the FlatBuffers usage in JavaScript, it should be noted that\nthe [Tutorial](../tutorial.md) page has a complete guide to\ngeneral FlatBuffers usage in all of the supported languages\n(including JavaScript). This page is specifically designed to cover the nuances\nof FlatBuffers usage in JavaScript.\n\nYou should also have read the [Building](../building.md)\ndocumentation to build `flatc` and should be familiar with\n[Using the schema compiler](../flatc.md) and\n[Writing a schema](../schema.md).\n\n## FlatBuffers JavaScript library code location\n\nThe generated code for the FlatBuffers JavaScript library can be found at\nhttps://www.npmjs.com/package/flatbuffers. To use it from sources:\n\n1. Run `npm run compile` from the main folder to generate JS files from TS.\n1. In your project, install it as a normal dependency, using the flatbuffers\nfolder as the source.\n\n## Using the FlatBuffers JavaScript library\n\n*Note: See [Tutorial](../tutorial.md) for a more in-depth\nexample of how to use FlatBuffers.*\n\nDue to the complexity related with large amounts of JS flavors and module types,\nnative JS support has been replaced in 2.0 by transpilation from TypeScript.\n\nPlease look at [TypeScript usage](typescript.md) and\ntranspile your sources to desired JS flavor. The minimal steps to get up and\nrunning with JS are:\n\n1. Generate TS files from `*.fbs` by using the `--ts` option.\n1. Transpile resulting TS files to desired JS flavor using `tsc` (see\n   https://www.typescriptlang.org/download for installation instructions).\n\n~~~{.js}\n  // Note: These require functions are an example - use your desired module flavor.\n  var fs = require('fs');\n\n  var flatbuffers = require('../flatbuffers').flatbuffers;\n  var MyGame = require('./monster_generated').MyGame;\n\n  var data = new Uint8Array(fs.readFileSync('monster.dat'));\n  var buf = new flatbuffers.ByteBuffer(data);\n\n  var monster = MyGame.Example.Monster.getRootAsMonster(buf);\n\n  //--------------------------------------------------------------------------//\n\n  // Note: This code is an example of browser-based HTML/JavaScript. See above\n  //       for the code using JavaScript module loaders (e.g. Node.js).\n  <script src=\"../js/flatbuffers.js\"></script>\n  <script src=\"monster_generated.js\"></script>\n  <script>\n    function readFile() {\n      var reader = new FileReader(); // This example uses the HTML5 FileReader.\n      var file = document.getElementById(\n          'file_input').files[0]; // \"monster.dat\" from the HTML <input> field.\n\n      reader.onload = function() { // Executes after the file is read.\n        var data = new Uint8Array(reader.result);\n\n        var buf = new flatbuffers.ByteBuffer(data);\n\n        var monster = MyGame.Example.Monster.getRootAsMonster(buf);\n      }\n\n      reader.readAsArrayBuffer(file);\n    }\n  </script>\n\n  // Open the HTML file in a browser and select \"monster.dat\" from with the\n  // <input> field.\n  <input type=\"file\" id=\"file_input\" onchange=\"readFile();\">\n~~~\n\nNow you can access values like this:\n\n~~~{.js}\n  var hp = monster.hp();\n  var pos = monster.pos();\n~~~\n\n## Text parsing FlatBuffers in JavaScript\n\nThere currently is no support for parsing text (Schema's and JSON) directly\nfrom JavaScript.\n"
  },
  {
    "path": "docs/source/languages/kotlin.md",
    "content": "Use in Kotlin    {#flatbuffers_guide_use_kotlin}\n==============\n\n## Before you get started\n\nBefore diving into the FlatBuffers usage in Kotlin, it should be noted that\nthe [Tutorial](../tutorial.md) page has a complete guide to\ngeneral FlatBuffers usage in all of the supported languages (including K).\n\nThis page is designed to cover the nuances of FlatBuffers usage, specific to Kotlin.\n\nYou should also have read the [Building](../building.md)\ndocumentation to build `flatc` and should be familiar with\n[Using the schema compiler](../flatc.md) and\n[Writing a schema](../schema.md).\n\n## Kotlin and FlatBuffers Java code location\n\nCode generated for Kotlin currently uses the flatbuffers java runtime library. That means that Kotlin generated code can only have Java virtual machine as target architecture (which includes Android). Kotlin Native and Kotlin.js are currently not supported.\n\nThe code for the FlatBuffers Java library can be found at\n`flatbuffers/java/com/google/flatbuffers`. You can browse the library on the\n[FlatBuffers GitHub page](https://github.com/google/flatbuffers/tree/master/\njava/com/google/flatbuffers).\n\n## Testing FlatBuffers Kotlin\n\nThe test code for Java is located in [KotlinTest.java](https://github.com/google\n/flatbuffers/blob/master/tests/KotlinTest.kt).\n\nTo run the tests, use  [KotlinTest.sh](https://github.com/google/\nflatbuffers/blob/master/tests/KotlinTest.sh) shell script.\n\n*Note: These scripts require that [Kotlin](https://kotlinlang.org/) is installed.*\n\n## Using the FlatBuffers Kotlin library\n\n*Note: See [Tutorial](../tutorial.md) for a more in-depth\nexample of how to use FlatBuffers in Kotlin.*\n\nFlatBuffers supports reading and writing binary FlatBuffers in Kotlin.\n\nTo use FlatBuffers in your own code, first generate Java classes from your\nschema with the `--kotlin` option to `flatc`.\nThen you can include both FlatBuffers and the generated code to read\nor write a FlatBuffer.\n\nFor example, here is how you would read a FlatBuffer binary file in Kotlin:\nFirst, import the library and generated code. Then, you read a FlatBuffer binary\nfile into a `ByteArray`.  You then turn the `ByteArray` into a `ByteBuffer`, which you\npass to the `getRootAsMyRootType` function:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.kt}\n    import MyGame.Example.*\n    import com.google.flatbuffers.FlatBufferBuilder\n\n    // This snippet ignores exceptions for brevity.\n    val data = RandomAccessFile(File(\"monsterdata_test.mon\"), \"r\").use {\n        val temp = ByteArray(it.length().toInt())\n        it.readFully(temp)\n        temp\n    }\n\n    val bb = ByteBuffer.wrap(data)\n    val monster = Monster.getRootAsMonster(bb)\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nNow you can access the data from the `Monster monster`:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.kt}\n    val hp = monster.hp\n    val pos = monster.pos!!;\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n\n\n## Differences between Kotlin and Java code\n\nKotlin generated code was designed to be as close as possible to the java counterpart, as for now, we only support kotlin on java virtual machine. So the differences in implementation and usage are basically the ones introduced by the Kotlin language itself. You can find more in-depth information [here](https://kotlinlang.org/docs/reference/comparison-to-java.html).\n\nThe most obvious ones are:\n\n* Fields as accessed as Kotlin [properties](https://kotlinlang.org/docs/reference/properties.html)\n* Static methods are accessed in [companion object](https://kotlinlang.org/docs/reference/classes.html#companion-objects)\n"
  },
  {
    "path": "docs/source/languages/lobster.md",
    "content": "Use in Lobster    {#flatbuffers_guide_use_lobster}\n==============\n\n## Before you get started\n\nBefore diving into the FlatBuffers usage in Lobster, it should be noted that the\n[Tutorial](../tutorial.md) page has a complete guide to general\nFlatBuffers usage in all of the supported languages (including Lobster). This\npage is designed to cover the nuances of FlatBuffers usage, specific to\nLobster.\n\nYou should also have read the [Building](../building.md)\ndocumentation to build `flatc` and should be familiar with\n[Using the schema compiler](../flatc.md) and\n[Writing a schema](../schema.md).\n\n## FlatBuffers Lobster library code location\n\nThe code for the FlatBuffers Lobster library can be found at\n`flatbuffers/lobster`. You can browse the library code on the\n[FlatBuffers GitHub page](https://github.com/google/flatbuffers/tree/master/\nlobster).\n\n## Testing the FlatBuffers Lobster library\n\nThe code to test the Lobster library can be found at `flatbuffers/tests`.\nThe test code itself is located in [lobstertest.lobster](https://github.com/google/\nflatbuffers/blob/master/tests/lobstertest.lobster).\n\nTo run the tests, run `lobster lobstertest.lobster`. To obtain Lobster itself,\ngo to the [Lobster homepage](http://strlen.com/lobster) or\n[github](https://github.com/aardappel/lobster) to learn how to build it for your\nplatform.\n\n## Using the FlatBuffers Lobster library\n\n*Note: See [Tutorial](../tutorial.md) for a more in-depth\nexample of how to use FlatBuffers in Lobster.*\n\nThere is support for both reading and writing FlatBuffers in Lobster.\n\nTo use FlatBuffers in your own code, first generate Lobster classes from your\nschema with the `--lobster` option to `flatc`. Then you can include both\nFlatBuffers and the generated code to read or write a FlatBuffer.\n\nFor example, here is how you would read a FlatBuffer binary file in Lobster:\nFirst, import the library and the generated code. Then read a FlatBuffer binary\nfile into a string, which you pass to the `GetRootAsMonster` function:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.lobster}\n    include \"monster_generated.lobster\"\n\n    let fb = read_file(\"monsterdata_test.mon\")\n    assert fb\n    let monster = MyGame_Example_GetRootAsMonster(fb)\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nNow you can access values like this:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.lobster}\n    let hp = monster.hp\n    let pos = monster.pos\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nAs you can see, even though `hp` and `pos` are functions that access FlatBuffer\ndata in-place in the string buffer, they appear as field accesses.\n\n## Speed\n\nUsing FlatBuffers in Lobster should be relatively fast, as the implementation\nmakes use of native support for writing binary values, and access of vtables.\nBoth generated code and the runtime library are therefore small and fast.\n\nActual speed will depend on whether you use Lobster as bytecode VM or compiled to\nC++.\n\n## Text Parsing\n\nLobster has full support for parsing JSON into FlatBuffers, or generating\nJSON from FlatBuffers. See `samples/sample_test.lobster` for an example.\n\nThis uses the C++ parser and generator underneath, so should be both fast and\nconformant.\n\n<br>\n"
  },
  {
    "path": "docs/source/languages/lua.md",
    "content": "Use in Lua    {#flatbuffers_guide_use_lua}\n=============\n\n## Before you get started\n\nBefore diving into the FlatBuffers usage in Lua, it should be noted that the\n[Tutorial](../tutorial.md) page has a complete guide to general\nFlatBuffers usage in all of the supported languages (including Lua). This\npage is designed to cover the nuances of FlatBuffers usage, specific to\nLua.\n\nYou should also have read the [Building](../building.md)\ndocumentation to build `flatc` and should be familiar with\n[Using the schema compiler](../flatc.md) and\n[Writing a schema](../schema.md).\n\n## FlatBuffers Lua library code location\n\nThe code for the FlatBuffers Lua library can be found at\n`flatbuffers/lua`. You can browse the library code on the\n[FlatBuffers GitHub page](https://github.com/google/flatbuffers/tree/master/lua).\n\n## Testing the FlatBuffers Lua library\n\nThe code to test the Lua library can be found at `flatbuffers/tests`.\nThe test code itself is located in [luatest.lua](https://github.com/google/\nflatbuffers/blob/master/tests/luatest.lua).\n\nTo run the tests, use the [LuaTest.sh](https://github.com/google/flatbuffers/\nblob/master/tests/LuaTest.sh) shell script.\n\n*Note: This script requires [Lua 5.3](https://www.lua.org/) and\n[LuaJIT](http://luajit.org/) to be installed.*\n\n## Using the FlatBuffers Lua library\n\n*Note: See [Tutorial](../tutorial.md) for a more in-depth\nexample of how to use FlatBuffers in Lua.*\n\nThere is support for both reading and writing FlatBuffers in Lua.\n\nTo use FlatBuffers in your own code, first generate Lua classes from your\nschema with the `--lua` option to `flatc`. Then you can include both\nFlatBuffers and the generated code to read or write a FlatBuffer.\n\nFor example, here is how you would read a FlatBuffer binary file in Lua:\nFirst, require the module and the generated code. Then read a FlatBuffer binary\nfile into a `string`, which you pass to the `GetRootAsMonster` function:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.lua}\n    -- require the library\n    local flatbuffers = require(\"flatbuffers\")\n\n    -- require the generated code\n    local monster = require(\"MyGame.Sample.Monster\")\n\n    -- read the flatbuffer from a file into a string\n    local f = io.open('monster.dat', 'rb')\n    local buf = f:read('*a')\n    f:close()\n\n    -- parse the flatbuffer to get an instance to the root monster\n    local monster1 = monster.GetRootAsMonster(buf, 0)\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nNow you can access values like this:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.lua}\n    -- use the : notation to access member data\n    local hp = monster1:Hp()\n    local pos = monster1:Pos()\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n\n## Text Parsing\n\nThere currently is no support for parsing text (Schema's and JSON) directly\nfrom Lua, though you could use the C++ parser through SWIG or ctypes. Please\nsee the C++ documentation for more on text parsing.\n\n<br>\n"
  },
  {
    "path": "docs/source/languages/php.md",
    "content": "Use in PHP    {#flatbuffers_guide_use_php}\n==========\n\n## Before you get started\n\nBefore diving into the FlatBuffers usage in PHP, it should be noted that\nthe [Tutorial](../tutorial.md) page has a complete guide to\ngeneral FlatBuffers usage in all of the supported languages\n(including PHP). This page is specifically designed to cover the nuances of\nFlatBuffers usage in PHP.\n\nYou should also have read the [Building](../building.md)\ndocumentation to build `flatc` and should be familiar with\n[Using the schema compiler](../flatc.md) and\n[Writing a schema](../schema.md).\n\n## FlatBuffers PHP library code location\n\nThe code for FlatBuffers PHP library can be found at `flatbuffers/php`. You\ncan browse the library code on the [FlatBuffers\nGitHub page](https://github.com/google/flatbuffers/tree/master/php).\n\n## Testing the FlatBuffers JavaScript library\n\nThe code to test the PHP library can be found at `flatbuffers/tests`.\nThe test code itself is located in [phpTest.php](https://github.com/google/\nflatbuffers/blob/master/tests/phpTest.php).\n\nYou can run the test with `php phpTest.php` from the command line.\n\n*Note: The PHP test file requires\n[PHP](http://php.net/manual/en/install.php) to be installed.*\n\n## Using theFlatBuffers PHP library\n\n*Note: See [Tutorial](../tutorial.md) for a more in-depth\nexample of how to use FlatBuffers in PHP.*\n\nFlatBuffers supports both reading and writing FlatBuffers in PHP.\n\nTo use FlatBuffers in your own code, first generate PHP classes from your schema\nwith the `--php` option to `flatc`. Then you can include both FlatBuffers and\nthe generated code to read or write a FlatBuffer.\n\nFor example, here is how you would read a FlatBuffer binary file in PHP:\nFirst, include the library and generated code (using the PSR `autoload`\nfunction). Then you can read a FlatBuffer binary file, which you\npass the contents of to the `GetRootAsMonster` function:\n\n~~~{.php}\n  // It is recommended that you use PSR autoload when using FlatBuffers in PHP.\n  // Here is an example:\n  function __autoload($class_name) {\n    // The last segment of the class name matches the file name.\n    $class = substr($class_name, strrpos($class_name, \"\\\\\") + 1);\n    $root_dir = join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)))); // `flatbuffers` root.\n\n    // Contains the `*.php` files for the FlatBuffers library and the `flatc` generated files.\n    $paths = array(join(DIRECTORY_SEPARATOR, array($root_dir, \"php\")),\n                   join(DIRECTORY_SEPARATOR, array($root_dir, \"tests\", \"MyGame\", \"Example\")));\n    foreach ($paths as $path) {\n      $file = join(DIRECTORY_SEPARATOR, array($path, $class . \".php\"));\n      if (file_exists($file)) {\n        require($file);\n        break;\n    }\n  }\n\n  // Read the contents of the FlatBuffer binary file.\n  $filename = \"monster.dat\";\n  $handle = fopen($filename, \"rb\");\n  $contents = fread($handle, filesize($filename));\n  fclose($handle);\n\n  // Pass the contents to `GetRootAsMonster`.\n  $monster = \\MyGame\\Example\\Monster::GetRootAsMonster($contents);\n~~~\n\nNow you can access values like this:\n\n~~~{.php}\n  $hp = $monster->GetHp();\n  $pos = $monster->GetPos();\n~~~\n\n## Text Parsing\n\nThere currently is no support for parsing text (Schema's and JSON) directly\nfrom PHP.\n"
  },
  {
    "path": "docs/source/languages/python.md",
    "content": "Use in Python    {#flatbuffers_guide_use_python}\n=============\n\n## Before you get started\n\nBefore diving into the FlatBuffers usage in Python, it should be noted that the\n[Tutorial](../tutorial.md) page has a complete guide to general\nFlatBuffers usage in all of the supported languages (including Python). This\npage is designed to cover the nuances of FlatBuffers usage, specific to\nPython.\n\nYou should also have read the [Building](../building.md)\ndocumentation to build `flatc` and should be familiar with\n[Using the schema compiler](../flatc.md) and\n[Writing a schema](../schema.md).\n\n## FlatBuffers Python library code location\n\nThe code for the FlatBuffers Python library can be found at\n`flatbuffers/python/flatbuffers`. You can browse the library code on the\n[FlatBuffers GitHub page](https://github.com/google/flatbuffers/tree/master/\npython).\n\n## Testing the FlatBuffers Python library\n\nThe code to test the Python library can be found at `flatbuffers/tests`.\nThe test code itself is located in [py_test.py](https://github.com/google/\nflatbuffers/blob/master/tests/py_test.py).\n\nTo run the tests, use the [PythonTest.sh](https://github.com/google/flatbuffers/\nblob/master/tests/PythonTest.sh) shell script.\n\n*Note: This script requires [python](https://www.python.org/) to be\ninstalled.*\n\n## Using the FlatBuffers Python library\n\n*Note: See [Tutorial](../tutorial.md) for a more in-depth\nexample of how to use FlatBuffers in Python.*\n\nThere is support for both reading and writing FlatBuffers in Python.\n\nTo use FlatBuffers in your own code, first generate Python classes from your\nschema with the `--python` option to `flatc`. Then you can include both\nFlatBuffers and the generated code to read or write a FlatBuffer.\n\nFor example, here is how you would read a FlatBuffer binary file in Python:\nFirst, import the library and the generated code. Then read a FlatBuffer binary\nfile into a `bytearray`, which you pass to the `GetRootAsMonster` function:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.py}\n    import MyGame.Example as example\n    import flatbuffers\n\n    buf = open('monster.dat', 'rb').read()\n    buf = bytearray(buf)\n    monster = example.GetRootAsMonster(buf, 0)\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nNow you can access values like this:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.py}\n    hp = monster.Hp()\n    pos = monster.Pos()\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n## Support for Numpy arrays\n\nThe Flatbuffers python library also has support for accessing scalar\nvectors as numpy arrays. This can be orders of magnitude faster than\niterating over the vector one element at a time, and is particularly\nuseful when unpacking large nested flatbuffers. The generated code for\na scalar vector will have a method `<vector name>AsNumpy()`. In the\ncase of the Monster example, you could access the inventory vector\nlike this:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.py}\n    inventory = monster.InventoryAsNumpy()\n    # inventory is a numpy array of type np.dtype('uint8')\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\ninstead of\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.py}\n    inventory = []\n    for i in range(monster.InventoryLength()):\n        inventory.append(int(monster.Inventory(i)))\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nNumpy is not a requirement. If numpy is not installed on your system,\nthen attempting to access one of the `*asNumpy()` methods will result\nin a `NumpyRequiredForThisFeature` exception.\n\n## Text Parsing\n\nThere currently is no support for parsing text (Schema's and JSON) directly\nfrom Python, though you could use the C++ parser through SWIG or ctypes. Please\nsee the C++ documentation for more on text parsing.\n\n<br>\n"
  },
  {
    "path": "docs/source/languages/rust.md",
    "content": "Use in Rust    {#flatbuffers_guide_use_rust}\n==========\n\n## Before you get started\n\nBefore diving into the FlatBuffers usage in Rust, it should be noted that\nthe [Tutorial](../tutorial.md) page has a complete guide\nto general FlatBuffers usage in all of the supported languages (including Rust).\nThis page is designed to cover the nuances of FlatBuffers usage, specific to\nRust.\n\n#### Prerequisites\n\nThis page assumes you have written a FlatBuffers schema and compiled it\nwith the Schema Compiler. If you have not, please see\n[Using the schema compiler](../flatc.md)\nand [Writing a schema](../schema.md).\n\nAssuming you wrote a schema, say `mygame.fbs` (though the extension doesn't\nmatter), you've generated a Rust file called `mygame_generated.rs` using the\ncompiler (e.g. `flatc --rust mygame.fbs` or via helpers listed in \"Useful\ntools created by others\" section bellow), you can now start using this in\nyour program by including the file. As noted, this header relies on the crate\n`flatbuffers`, which should be in your include `Cargo.toml`.\n\n## FlatBuffers Rust library code location\n\nThe code for the FlatBuffers Rust library can be found at\n`flatbuffers/rust`. You can browse the library code on the\n[FlatBuffers GitHub page](https://github.com/google/flatbuffers/tree/master/rust).\n\n## Testing the FlatBuffers Rust library\n\nThe code to test the Rust library can be found at `flatbuffers/tests/rust_usage_test`.\nThe test code itself is located in\n[integration_test.rs](https://github.com/google/flatbuffers/blob/master/tests/rust_usage_test/tests/integration_test.rs)\n\nThis test file requires `flatc` to be present. To review how to build the project,\nplease read the [Building](../building.md) documentation.\n\nTo run the tests, execute `RustTest.sh` from the `flatbuffers/tests` directory.\nFor example, on [Linux](https://en.wikipedia.org/wiki/Linux), you would simply\nrun: `cd tests && ./RustTest.sh`.\n\n*Note: The shell script requires [Rust](https://www.rust-lang.org) to\nbe installed.*\n\n## Using the FlatBuffers Rust library\n\n*Note: See [Tutorial](../tutorial.md) for a more in-depth\nexample of how to use FlatBuffers in Rust.*\n\nFlatBuffers supports both reading and writing FlatBuffers in Rust.\n\nTo use FlatBuffers in your code, first generate the Rust modules from your\nschema with the `--rust` option to `flatc`. Then you can import both FlatBuffers\nand the generated code to read or write FlatBuffers.\n\nFor example, here is how you would read a FlatBuffer binary file in Rust:\nFirst, include the library and generated code. Then read the file into\na `u8` vector, which you pass, as a byte slice, to `root_as_monster()`.\n\nThis full example program is available in the Rust test suite:\n[monster_example.rs](https://github.com/google/flatbuffers/blob/master/tests/rust_usage_test/bin/monster_example.rs)\n\nIt can be run by `cd`ing to the `rust_usage_test` directory and executing: `cargo run monster_example`.\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.rs}\n    extern crate flatbuffers;\n\n    #[allow(dead_code, unused_imports)]\n    #[path = \"../../monster_test_generated.rs\"]\n    mod monster_test_generated;\n    pub use monster_test_generated::my_game;\n\n    use std::io::Read;\n\n    fn main() {\n        let mut f = std::fs::File::open(\"../monsterdata_test.mon\").unwrap();\n        let mut buf = Vec::new();\n        f.read_to_end(&mut buf).expect(\"file reading failed\");\n\n        let monster = my_game::example::root_as_monster(&buf[..]);\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n`monster` is of type `Monster`, and points to somewhere *inside* your\nbuffer (root object pointers are not the same as `buffer_pointer` !).\nIf you look in your generated header, you'll see it has\nconvenient accessors for all fields, e.g. `hp()`, `mana()`, etc:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.rs}\n        println!(\"{}\", monster.hp());     // `80`\n        println!(\"{}\", monster.mana());   // default value of `150`\n        println!(\"{:?}\", monster.name()); // Some(\"MyMonster\")\n    }\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n*Note: That we never stored a `mana` value, so it will return the default.*\n\n## Direct memory access\n\nAs you can see from the above examples, all elements in a buffer are\naccessed through generated accessors. This is because everything is\nstored in little endian format on all platforms (the accessor\nperforms a swap operation on big endian machines), and also because\nthe layout of things is generally not known to the user.\n\nFor structs, layout is deterministic and guaranteed to be the same\nacross platforms (scalars are aligned to their\nown size, and structs themselves to their largest member), and you\nare allowed to access this memory directly by using `safe_slice`\non the reference to a struct, or even an array of structs.\n\nTo compute offsets to sub-elements of a struct, make sure they\nare structs themselves, as then you can use the pointers to\nfigure out the offset without having to hardcode it. This is\nhandy for use of arrays of structs with calls like `glVertexAttribPointer`\nin OpenGL or similar APIs.\n\nIt is important to note is that structs are still little endian on all\nmachines, so the functions to enable tricks like this are only exposed on little\nendian machines. If you also ship on big endian machines, using an\n`#[cfg(target_endian = \"little\")]` attribute would be wise or your code will not\ncompile.\n\nThe special function `safe_slice` is implemented on Vector objects that are\nrepresented in memory the same way as they are represented on the wire. This\nfunction is always available on vectors of struct, bool, u8, and i8. It is\nconditionally-compiled on little-endian systems for all the remaining scalar\ntypes.\n\nThe FlatBufferBuilder function `create_vector_direct` is implemented for all\ntypes that are endian-safe to write with a `memcpy`. It is the write-equivalent\nof `safe_slice`.\n\n## Access of untrusted buffers\n\nThe safe Rust functions to interpret a slice as a table (`root`,\n`size_prefixed_root`, `root_with_opts`, and `size_prefixed_root_with_opts`)\nverify the data first. This has some performance cost, but is intended to be\nsafe for use on flatbuffers from untrusted sources. There are corresponding\n`unsafe` versions with names ending in `_unchecked` which skip this\nverification, and may access arbitrary memory.\n\nThe generated accessor functions access fields over offsets, which is\nvery quick. The current implementation uses these to access memory without any\nfurther bounds checking. All of the safe Rust APIs ensure the verifier is run\nover these flatbuffers before accessing them.\n\nWhen you're processing large amounts of data from a source you know (e.g.\nyour own generated data on disk), the `_unchecked` versions are acceptable, but\nwhen reading data from the network that can potentially have been modified by an\nattacker, it is desirable to use the safe versions which use the verifier.\n\n## Threading\n\nReading a FlatBuffer does not touch any memory outside the original buffer,\nand is entirely read-only (all immutable), so is safe to access from multiple\nthreads even without synchronisation primitives.\n\nCreating a FlatBuffer is not thread safe. All state related to building\na FlatBuffer is contained in a FlatBufferBuilder instance, and no memory\noutside of it is touched. To make this thread safe, either do not\nshare instances of FlatBufferBuilder between threads (recommended), or\nmanually wrap it in synchronisation primitives. There's no automatic way to\naccomplish this, by design, as we feel multithreaded construction\nof a single buffer will be rare, and synchronisation overhead would be costly.\n\nUnlike most other languages, in Rust these properties are exposed to and\nenforced by the type system. `flatbuffers::Table` and the generated table types\nare `Send + Sync`, indicating they may be freely shared across threads and data\nmay be accessed from any thread which receives a const (aka shared) reference.\nThere are no functions which require a mutable (aka exclusive) reference, which\nmeans all the available functions may be called like this.\n`flatbuffers::FlatBufferBuilder` is also `Send + Sync`, but all of the mutating\nfunctions require a mutable (aka exclusive) reference which can only be created\nwhen no other references to the `FlatBufferBuilder` exist, and may not be copied\nwithin the same thread, let alone to a second thread.\n\n## Reflection (& Resizing)\n\nThere is experimental support for reflection in FlatBuffers, allowing you to\nread and write data even if you don't know the exact format of a buffer, and\neven allows you to change sizes of strings in-place.\n\nThe way this works is very elegant; there is actually a FlatBuffer schema that\ndescribes schemas (\\!) which you can find in `reflection/reflection.fbs`.\nThe compiler, `flatc`, can write out any schemas it has just parsed as a binary\nFlatBuffer, corresponding to this meta-schema.\n\nLoading in one of these binary schemas at runtime allows you to traverse any\nFlatBuffer data that corresponds to it without knowing the exact format. You\ncan query what fields are present, and then read/write them after.\n\nFor convenient field manipulation, you can use the crate\n`flatbuffers-reflection` which includes both the generated code from the meta\nschema, as well as a lot of helper functions.\n\nAnd example of usage, for the time being, can be found in\n`tests/rust_reflection_test/src/lib.rs`. Two sets of APIs are provided:\n\n- [Unsafe getters/setters](https://docs.rs/flatbuffers-reflection/latest/flatbuffers_reflection/#functions),\n which you can use when you are processing trusted data (either from a source you know, or has been verified)\n\n- Safe getters in [SafeBuffer](https://docs.rs/flatbuffers-reflection/latest/flatbuffers_reflection/struct.SafeBuffer.html),\n which does verification when constructed so you can use it for any data source\n\n## Buffer pre allocation in a latency-sensitive context\n\nIn latency-sensitive applications, dynamic memory allocations can introduce unpredictable latency spikes. The `FlatBufferBuilder` internally uses several `Vec`s that may reallocate during serialization:\n\n- The backing buffer for the FlatBuffer data\n- `field_locs` for tracking field locations within tables\n- `written_vtable_revpos` for deduplicating vtables\n- `strings_pool` for shared string interning\n\nTo avoid allocations during serialization, you can preallocate all internal vectors upfront using the `with_internal_capacity` constructor:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.rs}\n    // Preallocate: 1KB buffer, 8 field locations, 16 vtables, 32 shared strings\n    let mut builder = FlatBufferBuilder::with_internal_capacity(1024, 8, 16, 32);\n\n    // All subsequent operations will not allocate (if capacities are sufficient)\n    let name = builder.create_shared_string(\"MyMonster\");\n    // ... build your FlatBuffer ...\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThere are three variants available:\n\n- `with_internal_capacity(size, field_locs, vtables, strings)` - Creates a new builder with all capacities preallocated\n- `from_vec_with_internal_capacity(buffer, field_locs, vtables, strings)` - Reuses an existing `Vec<u8>` as the backing buffer\n- `new_in_with_internal_capacity(allocator, field_locs, vtables, strings)` - Uses a custom `Allocator` with preallocated internal vecs\n\nWhen combined with `reset()`, you can reuse the same builder across multiple serializations without any allocations after the initial setup:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.rs}\n    let mut builder = FlatBufferBuilder::with_internal_capacity(1024, 8, 16, 32);\n\n    loop {\n        // Build a FlatBuffer (allocation-free if capacities are sufficient)\n        let data = build_message(&mut builder);\n        send(data);\n\n        // Reset for reuse - clears state but retains allocated capacity\n        builder.reset();\n    }\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n## Useful tools created by others\n\n* [flatc-rust](https://github.com/frol/flatc-rust) - FlatBuffers compiler\n(flatc) as API for transparent `.fbs` to `.rs` code-generation via Cargo\nbuild scripts integration.\n\n<br>\n"
  },
  {
    "path": "docs/source/languages/swift.md",
    "content": "Use in Swift {#flatbuffers_guide_use_swift}\n=========\n\n## Before you get started\n\nBefore diving into the FlatBuffers usage in Swift, it should be noted that\nthe [Tutorial](../tutorial.md) page has a complete guide\nto general FlatBuffers usage in all of the supported languages (including Swift).\nThis page is designed to cover the nuances of FlatBuffers usage, specific to\nSwift.\n\nYou should also have read the [Building](../building.md)\ndocumentation to build `flatc` and should be familiar with\n[Using the schema compiler](../flatc.md) and\n[Writing a schema](../schema.md).\n\n## FlatBuffers Swift library code location\n\nThe code for the FlatBuffers Swift library can be found at\n`flatbuffers/swift`. You can browse the library code on the [FlatBuffers\nGitHub page](https://github.com/google/flatbuffers/tree/master/swift).\n\n## Testing the FlatBuffers Swift library\n\nThe code to test the Swift library can be found at `flatbuffers/tests/swift/tests`.\nThe test code itself is located in [flatbuffers/tests/swift/tests](https://github.com/google/flatbuffers/blob/master/tests/swift/tests).\n\nTo run the tests, use the [SwiftTest.sh](https://github.com/google/flatbuffers/blob/master/tests/swift/tests/SwiftTest.sh) shell script.\n\n*Note: The shell script requires [Swift](https://swift.org) to\nbe installed.*\n\n## Using the FlatBuffers Swift library\n\n*Note: See [Tutorial](../tutorial.md) for a more in-depth\nexample of how to use FlatBuffers in Swift.*\n\nFlatBuffers supports reading and writing binary FlatBuffers in Swift.\n\nTo use FlatBuffers in your own code, first generate Swift structs from your\nschema with the `--swift` option to `flatc`. Then include FlatBuffers using `SPM` in\nby adding the path to `FlatBuffers/swift` into it. The generated code should also be\nadded to xcode or the path of the package you will be using. Note: sometimes xcode cant\nand wont see the generated files, so it's better that you copy them to xcode.\n\nFor example, here is how you would read a FlatBuffer binary file in Swift: First,\ninclude the library and copy thegenerated code. Then read a FlatBuffer binary file or\na data object from the server, which you can pass into the `GetRootAsMonster` function.\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.swift}\n    import FlatBuffers\n\n    typealias Monster1 = MyGame.Sample.Monster\n    typealias Vec3 = MyGame.Sample.Vec3\n\n    let path = FileManager.default.currentDirectoryPath\n    let url = URL(fileURLWithPath: path, isDirectory: true).appendingPathComponent(\"monsterdata_test\").appendingPathExtension(\"mon\")\n    guard let data = try? Data(contentsOf: url) else { return }\n\n    let monster: Monster = try! getCheckedRoot(byteBuffer: &byteBuffer)\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nNow you can access values like this:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.swift}\n    let hp = monster.hp\n    let pos = monster.pos // uses native swift structs\n    let pos = monster.mutablePos // uses flatbuffers structs\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n\nIn some cases it's necessary to modify values in an existing FlatBuffer in place (without creating a copy). For this reason, scalar fields of a Flatbuffer table or struct can be mutated.\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.swift}\n    var byteBuffer = ByteBuffer(bytes: data)\n    // Get an accessor to the root object inside the buffer.\n    let monster: Monster = try! getCheckedRoot(byteBuffer: &byteBuffer)\n    // let monster: Monster = getRoot(byteBuffer: &byteBuffer)\n\n    if !monster.mutate(hp: 10) {\n      fatalError(\"couldn't mutate\")\n    }\n    // mutate a struct field using flatbuffers struct\n    // DONT use monster.pos to mutate since swift copy on write\n    // will not mutate the value in the buffer\n    let vec = monster.mutablePos.mutate(z: 4)\n\n    // This mutation will fail because the mana field is not available in\n    // the buffer. It should be set when creating the buffer.\n    if !monster.mutate(mana: 20) {\n      fatalError(\"couldn't mutate\")\n    }\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe term `mutate` is used instead of `set` to indicate that this is a special use case. All mutate functions return a boolean value which is false if the field we're trying to mutate is not available in the buffer.\n\n<br>\n"
  },
  {
    "path": "docs/source/languages/typescript.md",
    "content": "Use in TypeScript    {#flatbuffers_guide_use_typescript}\n=================\n\n## Before you get started\n\nBefore diving into the FlatBuffers usage in TypeScript, it should be noted that\nthe [Tutorial](../tutorial.md) page has a complete guide to\ngeneral FlatBuffers usage in all of the supported languages\n(including TypeScript). This page is specifically designed to cover the nuances\nof FlatBuffers usage in TypeScript.\n\nYou should also have read the [Building](../building.md)\ndocumentation to build `flatc` and should be familiar with\n[Using the schema compiler](../flatc.md) and\n[Writing a schema](../schema.md).\n\n## FlatBuffers TypeScript library code location\n\nThe code for the FlatBuffers TypeScript library can be found at\nhttps://www.npmjs.com/package/flatbuffers.\n\n## Testing the FlatBuffers TypeScript library\n\nTo run the tests, use the [TypeScriptTest.py](https://github.com/google/\nflatbuffers/blob/master/tests/TypeScriptTest.py) Python3 script.\n\n*Note: The TypeScript test file requires [Node.js](https://nodejs.org/en/).*\n\n## Using the FlatBuffers TypeScript library\n\n*Note: See [Tutorial](../tutorial.md) for a more in-depth\nexample of how to use FlatBuffers in TypeScript.*\n\nFlatBuffers supports both reading and writing FlatBuffers in TypeScript.\n\nTo use FlatBuffers in your own code, first generate TypeScript classes from your\nschema with the `--ts` option to `flatc`. Then you can include both FlatBuffers\nand the generated code to read or write a FlatBuffer.\n\nFor example, here is how you would read a FlatBuffer binary file in TypeScript:\nFirst, include the library and generated code. Then read the file into an\n`Uint8Array`. Make a `flatbuffers.ByteBuffer` out of the `Uint8Array`, and pass\nthe ByteBuffer to the `getRootAsMonster` function.\n\n~~~{.ts}\n  import * as flatbuffers from 'flatbuffers';\n\n  import { MyGame } from './monster_generated';\n\n  let data = new Uint8Array(fs.readFileSync('monster.dat'));\n  let buf = new flatbuffers.ByteBuffer(data);\n\n  let monster = MyGame.Example.Monster.getRootAsMonster(buf);\n~~~\n\nNow you can access values like this:\n\n~~~{.ts}\n  let hp = monster.hp();\n  let pos = monster.pos();\n~~~\n\n## Object based API\n\nFlatBuffers is all about memory efficiency, which is why its base API is written\naround using as little as possible of it. This does make the API clumsier\n(requiring pre-order construction of all data, and making mutation harder).\n\nFor times when efficiency is less important a more convenient object based API\ncan be used (through `--gen-object-api`) that is able to unpack & pack a\nFlatBuffer into objects and standard TS types.\n\nTo use:\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.ts}\n    // Autogenerated class from table Monster.\n    let monsterobj = new MonsterT();\n\n    // Deserialize from buffer into object.\n    Monster.getRootAsMonster(flatbuffer).unpackTo(monsterobj);\n    // or\n    let monsterobj = Monster.getRootAsMonster(flatbuffer).unpack();\n\n    // Update object directly like a regular TS class instance.\n    console.log(monsterobj.name);\n    monsterobj.name = \"Bob\";\n\n    // Serialize into new flatbuffer.\n    let fbb = new flatbuffers.Builder(1);\n    Monster.finishMonsterBuffer(fbb, monsterobj.pack(fbb));\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n## Text parsing FlatBuffers in TypeScript\n\nThere currently is no support for parsing text (Schema's and JSON) directly\nfrom TypeScript.\n"
  },
  {
    "path": "docs/source/quick_start.md",
    "content": "# Quick Start\n\nThis will quickly go over the parts of using FlatBuffers to serialize some data.\nSee the [Tutorial](tutorial.md) for a more in depth guide.\n\n1. **Build the compiler for FlatBuffers ([`flatc`](flatc.md))**\n\n    ```sh\n    cmake -G \"Unix Makefiles\"\n    make -j\n    ```\n\n2. **Define your FlatBuffer [schema](schema.md) (`.fbs`)**\n\n    ```c title=\"monster.fbs\" linenums=\"1\"\n    table Monster {\n      name:string;\n      health:int;\n    }\n\n    root_type Monster;\n    ```\n\n    See [monster.fbs](https://github.com/google/flatbuffers/blob/master/samples/monster.fbs)\n    for an complete example.\n\n3. **Generate code for your language(s)**\n\n    Use the `flatc` compiler to take your schema and generate language-specific\n    code:\n\n    ```sh\n    ./flatc --cpp --rust monster.fbs\n    ```\n\n    Which generates `monster_generated.h` and `monster_generated.rs` files.\n\n4. **Serialize data**\n\n    Use the generated code files, as well as the `FlatBufferBuilder` to construct\n    your serialized buffer.\n\n    ```c++ title=\"my_monster_factory.cc\" linenums=\"1\"\n    #include \"flatbuffers.h\"\n    #include \"monster_generated.h\"\n\n    int main() {\n      // Used to build the flatbuffer\n      FlatBufferBuilder builder;\n\n      // Auto-generated function emitted from `flatc` and the input\n      // `monster.fbs` schema.\n      auto monster = CreateMonsterDirect(builder, \"Abominable Snowman\", 100);\n\n      // Finalize the buffer.\n      builder.Finish(monster);\n    }\n    ```\n\n    See complete [C++ Example](https://github.com/google/flatbuffers/blob/master/samples/sample_binary.cpp#L24-L56).\n\n5.  **Transmit/Store the serialized FlatBuffer**\n\n    Use your serialized buffer however you want. Send it to someone, save it for\n    later, etc...\n\n    ```c++ title=\"my_monster_factory.cc\" linenums=\"13\"\n    // Get a pointer to the flatbuffer.\n    const uint8_t* flatbuffer = builder.GetBufferPointer();\n    ```\n\n6.  **Read the data**\n\n    Use the generated accessors to read the data from the serialized buffer.\n\n    It doesn't need to be the same language, or even schema version (see\n    [Evolving](evolution.md)), FlatBuffers ensures the data is readable across\n    languages and schema versions.\n\n    ```c++ title=\"my_monster_factory.cc\" linenums=\"15\"\n    // Get a view of the root monster from the flatbuffer.\n    const Monster snowman = GetMonster(flatbuffer);\n\n    // Access the monster's fields directly.\n    ASSERT_EQ(snowman->name(), \"Abominable Snowman\");\n    ASSERT_EQ(snowman->health(), 100);\n    ```\n\n    See [`Rust` examples](https://github.com/google/flatbuffers/blob/master/samples/sample_binary.rs#L92-L106)\n    for reading the data written by `C++`.\n"
  },
  {
    "path": "docs/source/schema.md",
    "content": "# Schema\n\nThe syntax of the schema language (aka IDL,\n[Interface Definition Language](https://en.wikipedia.org/wiki/Interface_description_language))\nshould look quite familiar to users of any of the C family of languages, and\nalso to users of other IDLs. Let's look at an example first:\n\n```c title=\"monster.fbs\" linenums=\"1\"\n// example IDL file\n\nnamespace MyGame;\n\nattribute \"priority\";\n\nenum Color : byte { Red = 1, Green, Blue }\n\nunion Any { Monster, Weapon, Pickup }\n\nstruct Vec3 {\n  x:float;\n  y:float;\n  z:float;\n}\n\ntable Monster {\n  pos:Vec3;\n  mana:short = 150;\n  hp:short = 100;\n  name:string;\n  friendly:bool = false (deprecated, priority: 1);\n  inventory:[ubyte];\n  color:Color = Blue;\n  test:Any;\n}\n\ntable Weapon {}\ntable Pickup {}\n\nroot_type Monster;\n```\n\n## Tables\n\nTables are the main way of defining objects in FlatBuffers.\n\n```c title=\"monster.fbs - Example Table\" linenums=\"17\"\ntable Monster {\n  pos:Vec3;\n  mana:short = 150;\n  hp:short = 100;\n  name:string;\n  friendly:bool = false (deprecated, priority: 1);\n  inventory:[ubyte];\n  color:Color = Blue;\n  test:Any;\n}\n```\n\nThey consist of a name (here `Monster`) and a list of [fields](#fields). This\nfield list can be appended to (and deprecated from) while still maintaining\ncompatibility.\n\n### Fields\n\nTable fields have a name identifier, a [type](#types), optional default value,\noptional [attributes](#attributes) and ends with a `;`. See the\n[grammar](grammar.md) for full details.\n\n```ebnf\nfield_decl = ident `:` type [ `=` scalar ] metadata `;`\n```\n\nFields do not have to appear in the wire representation, and you can choose to\nomit fields when constructing an object. You have the flexibility to add fields\nwithout fear of bloating your data. This design is also FlatBuffer's mechanism\nfor forward and backwards compatibility.\n\nThere are three, mutually exclusive, reactions to the non-presence of a table's\nfield in the binary data.\n\n#### 1. Default\n\nDefault value fields with return the default value as defined in the schema. If\nthe default value is not specified in the schema, it will be `0` for scalar\ntypes, or `null` for other types.\n\n```c++\nmana:short = 150;\nhp:short;\ninventory:[ubyte];\n```\n\nHere `mana` would default to the value `150`, `hp` to value `0`, and `inventory`\nto `null`, if those fields are not set.\n\nOnly scalar values can have explicit defaults, non-scalar fields (strings,\nvectors, tables) are `null` when not present.\n\nThis is the normal mode that fields will take.\n\n??? danger \"Don't change Default values\"\n\n    You generally do not want to change default values after they're initially\n    defined. Fields that have the default value are not actually stored in the\n    serialized data (see also Gotchas below). Values explicitly written by code\n    generated by the old schema old version, if they happen to be the default, will\n    be read as a different value by code generated with the new schema. This is\n    slightly less bad when converting an optional scalar into a default valued\n    scalar since non-presence would not be overloaded with a previous default value.\n    There are situations, however, where this may be desirable, especially if you\n    can ensure a simultaneous rebuild of all code.\n\n#### 2. Optional\n\nOptional value fields will return some form of `null` in the language generated.\n\n=== \"C++\"\n\n    ```c++\n    std::optional<T> field;\n    ```\n\nFor optional scalars, just set the field default value to `null`. If the\nproducer of the buffer does not explicitly set that field, it will be marked\n`null`.\n\n```c++\n  hp:short = null;\n```\n\n!!! note\n\n    Not every languages support scalar defaults yet\n\n#### 3. Required\n\nRequired valued fields will cause an error if they are not set. The FlatBuffers\nverifier would consider the whole buffer invalid.\n\nThis is enabled by the [`required` attribute](#required) on the field.\n\n```\n  hp:short (required)\n```\n\nYou cannot have `required` set with an explicit default value, it will result in\na compiler error.\n\n## Structs\n\nSimilar to a table, `structs` consist of fields are required (so no defaults\neither), and fields may not be added or be deprecated.\n\n```c title=\"monster.fbs - Example Struct\" linenums=\"11\"\nstruct Vec3 {\n  x:float;\n  y:float;\n  z:float;\n}\n```\n\nStructs may only contain scalars or other structs. Use this for simple objects\nwhere you are very sure no changes will ever be made (as quite clear in the\nexample `Vec3`). Structs use less memory than tables and are even faster to\naccess (they are always stored in-line in their parent object, and use no\nvirtual table).\n\n### Arrays\n\nArrays are a convenience short-hand for a fixed-length collection of elements.\nArrays allow the following syntax, while maintaining binary equivalency.\n\n<div class=\"grid cards\" markdown>\n\n- **Normal Syntax**\n\n  ===\n\n  ```c++\n  struct Vec3 {\n    x:float;\n    y:float;\n    z:float;\n  }\n  ```\n\n- **Array Syntax**\n\n  ===\n\n  ```c++\n  struct Vec3 {\n    v:[float:3];\n  }\n  ```\n\n</div>\n\nArrays are currently only supported in a `struct`.\n\n## Types\n\nThe following are the built-in types that can be used in FlatBuffers.\n\n### Scalars\n\nThe standard assortment of fixed sized scalars are available. There are no\nvariable sized integers (e.g., `varints`).\n\n| Size   | Signed            | Unsigned            | Floating Point       |\n| ------ | ----------------- | ------------------- | -------------------- |\n| 8-bit  | `byte`, `bool`    | `ubyte` (`uint8`)   |                      |\n| 16-bit | `short` (`int16`) | `ushort` (`uint16`) |\n| 32-bit | `int` (`int32`)   | `uint` (`uint32`)   | `float` (`float32`)  |\n| 64-bit | `long` (`int64`)  | `ulong` (`uint64`)  | `double` (`float64`) |\n\nThe type names in parentheses are alias names such that for example `uint8` can\nbe used in place of `ubyte`, and `int32` can be used in place of `int` without\naffecting code generation.\n\n### Non-scalars\n\n#### Vectors\n\nVector of any other type (denoted with `[type]`).\n\n```c++\ninventory:[ubyte];\n```\n\n!!! note \"Nesting vectors\"\n\n    Nesting vectors is not supported, instead you can wrap the inner vector with\n    a table.\n\n    ```\n    table nest{\n       a:[ubyte]\n    }\n\n    table monster {\n     a:[nest]\n    }\n    ```\n\n#### Strings\n\nStrings (indicated by `string`) are zero-terminated strings, prefixed by their\nlength. Strings may only hold UTF-8 or 7-bit ASCII. For other text encodings or\ngeneral binary data use vectors (`[byte]` or `[ubyte]`) instead.\n\n```c++\nname:string;\n```\n\n## Enums\n\nDefine a sequence of named constants, each with a given value, or increasing by\none from the previous one. The default first value is `0`. As you can see in the\nenum declaration, you specify the underlying integral type of the enum with `:`\n(in this case `byte`), which then determines the type of any fields declared\nwith this enum type.\n\nOnly integer types are allowed, i.e. `byte`, `ubyte`, `short` `ushort`, `int`,\n`uint`, `long` and `ulong`.\n\nTypically, enum values should only ever be added, never removed (there is no\ndeprecation for enums). This requires code to handle forwards compatibility\nitself, by handling unknown enum values.\n\n## Unions\n\nUnions share a lot of properties with enums, but instead of new names for\nconstants, you use names of tables. You can then declare a union field, which\ncan hold a reference to any of those types, and additionally a field with the\nsuffix `_type` is generated that holds the corresponding enum value, allowing\nyou to know which type to cast to at runtime.\n\nIt's possible to give an alias name to a type union. This way a type can even be\nused to mean different things depending on the name used:\n\n```txt\ntable PointPosition { x:uint; y:uint; }\ntable MarkerPosition {}\nunion Position {\n  Start:MarkerPosition,\n  Point:PointPosition,\n  Finish:MarkerPosition\n}\n```\n\nUnions contain a special `NONE` marker to denote that no value is stored so that\nname cannot be used as an alias.\n\nUnions are a good way to be able to send multiple message types as a FlatBuffer.\nNote that because a union field is really two fields, it must always be part of\na table, it cannot be the root of a FlatBuffer by itself.\n\nIf you have a need to distinguish between different FlatBuffers in a more\nopen-ended way, for example for use as files, see the file identification\nfeature below.\n\nThere is an experimental support only in C++ for a vector of unions (and types).\nIn the example IDL file above, use [Any] to add a vector of Any to Monster\ntable. There is also experimental support for other types besides tables in\nunions, in particular structs and strings. There's no direct support for scalars\nin unions, but they can be wrapped in a struct at no space cost.\n\n## Namespaces\n\nThese will generate the corresponding namespace in C++ for all helper code, and\npackages in Java. You can use `.` to specify nested namespaces / packages.\n\n## Includes\n\nYou can include other schemas files in your current one, e.g.:\n\n```txt\ninclude \"mydefinitions.fbs\";\n```\n\nThis makes it easier to refer to types defined elsewhere. `include`\nautomatically ensures each file is parsed just once, even when referred to more\nthan once.\n\nWhen using the `flatc` compiler to generate code for schema definitions, only\ndefinitions in the current file will be generated, not those from the included\nfiles (those you still generate separately).\n\n## Root type\n\nThis declares what you consider to be the root table of the serialized data.\nThis is particularly important for parsing JSON data, which doesn't include\nobject type information.\n\n## File identification and extension\n\nTypically, a FlatBuffer binary buffer is not self-describing, i.e. it needs you\nto know its schema to parse it correctly. But if you want to use a FlatBuffer as\na file format, it would be convenient to be able to have a \"magic number\" in\nthere, like most file formats have, to be able to do a sanity check to see if\nyou're reading the kind of file you're expecting.\n\nNow, you can always prefix a FlatBuffer with your own file header, but\nFlatBuffers has a built-in way to add an identifier to a FlatBuffer that takes\nup minimal space, and keeps the buffer compatible with buffers that don't have\nsuch an identifier.\n\nYou can specify in a schema, similar to `root_type`, that you intend for this\ntype of FlatBuffer to be used as a file format:\n\n```txt\nfile_identifier \"MYFI\";\n```\n\nIdentifiers must always be exactly 4 characters long. These 4 characters will\nend up as bytes at offsets 4-7 (inclusive) in the buffer.\n\nFor any schema that has such an identifier, `flatc` will automatically add the\nidentifier to any binaries it generates (with `-b`), and generated calls like\n`FinishMonsterBuffer` also add the identifier. If you have specified an\nidentifier and wish to generate a buffer without one, you can always still do so\nby calling `FlatBufferBuilder::Finish` explicitly.\n\nAfter loading a buffer, you can use a call like `MonsterBufferHasIdentifier` to\ncheck if the identifier is present.\n\nNote that this is best for open-ended uses such as files. If you simply wanted\nto send one of a set of possible messages over a network for example, you'd be\nbetter off with a union.\n\nAdditionally, by default `flatc` will output binary files as `.bin`. This\ndeclaration in the schema will change that to whatever you want:\n\n```txt\nfile_extension \"ext\";\n```\n\n## RPC interface declarations\n\nYou can declare RPC calls in a schema, that define a set of functions that take\na FlatBuffer as an argument (the request) and return a FlatBuffer as the\nresponse (both of which must be table types):\n\n```txt\nrpc_service MonsterStorage {\n    Store(Monster):StoreResponse;\n    Retrieve(MonsterId):Monster;\n}\n```\n\nWhat code this produces and how it is used depends on language and RPC system\nused, there is preliminary support for GRPC through the `--grpc` code generator,\nsee `grpc/tests` for an example.\n\n## Comments & documentation\n\nMay be written as in most C-based languages. Additionally, a triple comment\n(`///`) on a line by itself signals that a comment is documentation for whatever\nis declared on the line after it (table/struct/field/enum/union/element), and\nthe comment is output in the corresponding C++ code. Multiple such lines per\nitem are allowed.\n\n## Attributes\n\nAttributes may be attached to a declaration, behind a field/enum value, or after\nthe name of a table/struct/enum/union. These may either have a value or not.\nSome attributes like `deprecated` are understood by the compiler; user defined\nones need to be declared with the attribute declaration (like `priority` in the\nexample above), and are available to query if you parse the schema at runtime.\nThis is useful if you write your own code generators/editors etc., and you wish\nto add additional information specific to your tool (such as a help text).\n\nCurrent understood attributes:\n\n- `id: n` (on a table field): manually set the field identifier to `n`. If you\n  use this attribute, you must use it on ALL fields of this table, and the\n  numbers must be a contiguous range from 0 onwards. Additionally, since a union\n  type effectively adds two fields, its id must be that of the second field (the\n  first field is the type field and not explicitly declared in the schema). For\n  example, if the last field before the union field had id 6, the union field\n  should have id 8, and the unions type field will implicitly be 7. IDs allow\n  the fields to be placed in any order in the schema. When a new field is added\n  to the schema it must use the next available ID.\n- `deprecated` (on a field): do not generate accessors for this field anymore,\n  code should stop using this data. Old data may still contain this field, but\n  it won't be accessible anymore by newer code. Note that if you deprecate a\n  field that was previous required, old code may fail to validate new data (when\n  using the optional verifier).\n- `required` (on a non-scalar table field): this field must always be set. By\n  default, fields do not need to be present in the binary. This is desirable, as\n  it helps with forwards/backwards compatibility, and flexibility of data\n  structures. By specifying this attribute, you make non- presence in an error\n  for both reader and writer. The reading code may access the field directly,\n  without checking for null. If the constructing code does not initialize this\n  field, they will get an assert, and also the verifier will fail on buffers\n  that have missing required fields. Both adding and removing this attribute may\n  be forwards/backwards incompatible as readers will be unable read old or new\n  data, respectively, unless the data happens to always have the field set.\n- `force_align: size` (on a struct): force the alignment of this struct to be\n  something higher than what it is naturally aligned to. Causes these structs to\n  be aligned to that amount inside a buffer, IF that buffer is allocated with\n  that alignment (which is not necessarily the case for buffers accessed\n  directly inside a `FlatBufferBuilder`). Note: currently not guaranteed to have\n  an effect when used with `--object-api`, since that may allocate objects at\n  alignments less than what you specify with `force_align`.\n- `force_align: size` (on a vector): force the alignment of this vector to be\n  something different than what the element size would normally dictate. Note:\n  Now only work for generated C++ code.\n- `bit_flags` (on an unsigned enum): the values of this field indicate bits,\n  meaning that any unsigned value N specified in the schema will end up\n  representing 1<<N, or if you don't specify values at all, you'll get the\n  sequence 1, 2, 4, 8, ...\n- `nested_flatbuffer: \"table_name\"` (on a field): this indicates that the field\n  (which must be a vector of ubyte) contains flatbuffer data, for which the root\n  type is given by `table_name`. The generated code will then produce a\n  convenient accessor for the nested FlatBuffer.\n- `flexbuffer` (on a field): this indicates that the field (which must be a\n  vector of ubyte) contains flexbuffer data. The generated code will then\n  produce a convenient accessor for the FlexBuffer root.\n- `key` (on a field): this field is meant to be used as a key when sorting a\n  vector of the type of table it sits in. Can be used for in-place binary\n  search.\n- `hash` (on a field). This is an (un)signed 32/64 bit integer field, whose\n  value during JSON parsing is allowed to be a string, which will then be stored\n  as its hash. The value of attribute is the hashing algorithm to use, one of\n  `fnv1_32` `fnv1_64` `fnv1a_32` `fnv1a_64`.\n- `original_order` (on a table): since elements in a table do not need to be\n  stored in any particular order, they are often optimized for space by sorting\n  them to size. This attribute stops that from happening. There should generally\n  not be any reason to use this flag.\n- 'native*\\*'. Several attributes have been added to support the C++ object\n  Based API. All such attributes are prefixed with the term \"native*\".\n\n## JSON Parsing\n\nThe same parser that parses the schema declarations above is also able to parse\nJSON objects that conform to this schema. So, unlike other JSON parsers, this\nparser is strongly typed, and parses directly into a FlatBuffer (see the\ncompiler documentation on how to do this from the command line, or the C++\ndocumentation on how to do this at runtime).\n\nBesides needing a schema, there are a few other changes to how it parses JSON:\n\n- It accepts field names with and without quotes, like many JSON parsers already\n  do. It outputs them without quotes as well, though can be made to output them\n  using the `strict_json` flag.\n- If a field has an enum type, the parser will recognize symbolic enum values\n  (with or without quotes) instead of numbers, e.g. `field: EnumVal`. If a field\n  is of integral type, you can still use symbolic names, but values need to be\n  prefixed with their type and need to be quoted, e.g. `field: \"Enum.EnumVal\"`.\n  For enums representing flags, you may place multiple inside a string separated\n  by spaces to OR them, e.g. `field: \"EnumVal1 EnumVal2\"` or\n  `field: \"Enum.EnumVal1 Enum.EnumVal2\"`.\n- Similarly, for unions, these need to specified with two fields much like you\n  do when serializing from code. E.g. for a field `foo`, you must add a field\n  `foo_type: FooOne` right before the `foo` field, where `FooOne` would be the\n  table out of the union you want to use.\n- A field that has the value `null` (e.g. `field: null`) is intended to have the\n  default value for that field (thus has the same effect as if that field wasn't\n  specified at all).\n- It has some built in conversion functions, so you can write for example\n  `rad(180)` where ever you'd normally write `3.14159`. Currently supports the\n  following functions: `rad`, `deg`, `cos`, `sin`, `tan`, `acos`, `asin`,\n  `atan`.\n\nWhen parsing JSON, it recognizes the following escape codes in strings:\n\n- `\\n` - linefeed.\n- `\\t` - tab.\n- `\\r` - carriage return.\n- `\\b` - backspace.\n- `\\f` - form feed.\n- `\\\"` - double quote.\n- `\\\\` - backslash.\n- `\\/` - forward slash.\n- `\\uXXXX` - 16-bit unicode code point, converted to the equivalent UTF-8\n  representation.\n- `\\xXX` - 8-bit binary hexadecimal number XX. This is the only one that is not\n  in the JSON spec (see http://json.org/), but is needed to be able to encode\n  arbitrary binary in strings to text and back without losing information (e.g.\n  the byte 0xFF can't be represented in standard JSON).\n\nIt also generates these escape codes back again when generating JSON from a\nbinary representation.\n\nWhen parsing numbers, the parser is more flexible than JSON. A format of numeric\nliterals is more close to the C/C++. According to the\n[grammar](grammar.md), it accepts the following numerical literals:\n\n- An integer literal can have any number of leading zero `0` digits. Unlike\n  C/C++, the parser ignores a leading zero, not interpreting it as the beginning\n  of the octal number. The numbers `[081, -00094]` are equal to `[81, -94]`\n  decimal integers.\n- The parser accepts unsigned and signed hexadecimal integer numbers. For\n  example: `[0x123, +0x45, -0x67]` are equal to `[291, 69, -103]` decimals.\n- The format of float-point numbers is fully compatible with C/C++ format. If a\n  modern C++ compiler is used the parser accepts hexadecimal and special\n  floating-point literals as well:\n  `[-1.0, 2., .3e0, 3.e4, 0x21.34p-5, -inf, nan]`.\n\n  The following conventions for floating-point numbers are used:\n\n  - The exponent suffix of hexadecimal floating-point number is mandatory.\n  - Parsed `NaN` converted to unsigned IEEE-754 `quiet-NaN` value.\n\n  Extended floating-point support was tested with:\n\n  - x64 Windows: `MSVC2015` and higher.\n  - x64 Linux: `LLVM 6.0`, `GCC 4.9` and higher.\n\n- For compatibility with a JSON lint tool all numeric literals of scalar fields\n  can be wrapped to quoted string:\n  `\"1\", \"2.0\", \"0x48A\", \"0x0C.0Ep-1\", \"-inf\", \"true\"`.\n\n## Guidelines\n\n### Efficiency\n\nFlatBuffers is all about efficiency, but to realize that efficiency you require\nan efficient schema. There are usually multiple choices on how to represent data\nthat have vastly different size characteristics.\n\nIt is very common nowadays to represent any kind of data as dictionaries (as in\ne.g. JSON), because of its flexibility and extensibility. While it is possible\nto emulate this in FlatBuffers (as a vector of tables with key and value(s)),\nthis is a bad match for a strongly typed system like FlatBuffers, leading to\nrelatively large binaries. FlatBuffer tables are more flexible than\nclasses/structs in most systems, since having a large number of fields only few\nof which are actually used is still efficient. You should thus try to organize\nyour data as much as possible such that you can use tables where you might be\ntempted to use a dictionary.\n\nSimilarly, strings as values should only be used when they are truly open-ended.\nIf you can, always use an enum instead.\n\nFlatBuffers doesn't have inheritance, so the way to represent a set of related\ndata structures is a union. Unions do have a cost however, so an alternative to\na union is to have a single table that has all the fields of all the data\nstructures you are trying to represent, if they are relatively similar / share\nmany fields. Again, this is efficient because non-present fields are cheap.\n\nFlatBuffers supports the full range of integer sizes, so try to pick the\nsmallest size needed, rather than defaulting to int/long.\n\nRemember that you can share data (refer to the same string/table within a\nbuffer), so factoring out repeating data into its own data structure may be\nworth it.\n\n### Style guide\n\nIdentifiers in a schema are meant to translate to many different programming\nlanguages, so using the style of your \"main\" language is generally a bad idea.\n\nFor this reason, below is a suggested style guide to adhere to, to keep schemas\nconsistent for interoperation regardless of the target language.\n\nWhere possible, the code generators for specific languages will generate\nidentifiers that adhere to the language style, based on the schema identifiers.\n\n- Table, struct, enum and rpc names (types): UpperCamelCase.\n- Table and struct field names: snake_case. This is translated to lowerCamelCase\n  automatically for some languages, e.g. Java.\n- Enum values: UpperCamelCase.\n- namespaces: UpperCamelCase.\n\nFormatting (this is less important, but still worth adhering to):\n\n- Opening brace: on the same line as the start of the declaration.\n- Spacing: Indent by 2 spaces. None around `:` for types, on both sides for `=`.\n\nFor an example, see the schema at the top of this file.\n\n## Gotchas\n\n\n\n### Testing whether a field is present in a table\n\nMost serialization formats (e.g. JSON or Protocol Buffers) make it very explicit\nin the format whether a field is present in an object or not, allowing you to\nuse this as \"extra\" information.\n\nFlatBuffers will not write fields that are equal to their default value,\nsometimes resulting in significant space savings. However, this also means we\ncannot disambiguate the meaning of non-presence as \"written default value\" or\n\"not written at all\". This only applies to scalar fields since only they support\ndefault values. Unless otherwise specified, their default is 0.\n\nIf you care about the presence of scalars, most languages support \"optional\nscalars.\" You can set `null` as the default value in the schema. `null` is a\nvalue that's outside of all types, so we will always write if `add_field` is\ncalled. The generated field accessor should use the local language's canonical\noptional type.\n\nSome `FlatBufferBuilder` implementations have an option called `force_defaults`\nthat circumvents this \"not writing defaults\" behavior you can then use\n`IsFieldPresent` to query presence. / Another option that works in all languages\nis to wrap a scalar field in a struct. This way it will return null if it is not\npresent. This will be slightly less ergonomic but structs don't take up any more\nspace than the scalar they represent.\n\n"
  },
  {
    "path": "docs/source/support.md",
    "content": "Platform / Language / Feature support    {#flatbuffers_support}\n=====================================\n\nFlatBuffers is actively being worked on, which means that certain platform /\nlanguage / feature combinations may not be available yet.\n\nThis page tries to track those issues, to make informed decisions easier.\nIn general:\n\n  * Languages: language support beyond the ones created by the original\n    FlatBuffer authors typically depends on community contributions.\n  * Features: C++ was the first language supported, since our original\n    target was high performance game development. It thus has the richest\n    feature set, and is likely most robust. Other languages are catching up\n    however.\n  * Platforms: All language implementations are typically portable to most\n    platforms, unless where noted otherwise.\n\nNOTE: this table is a start, it needs to be extended.\n\nFeature                        | C++    | Java  | C#       | Go    | Python | JS    | TS  | C      | PHP | Dart    | Lobster | Rust   | Swift\n------------------------------ | ------ | ----- | -------- | ----- | ------ | ----- | --- | ------ | --- | ------- | ------- | ------ | ------\nCodegen for all basic features | Yes    | Yes   | Yes      | Yes   | Yes    | Yes   | Yes | Yes    | WiP | Yes     | Yes     | Yes    | Yes\nJSON parsing                   | Yes    | No    | No       | No    | No     | No    | No  | Yes    | No  | No      | Yes     | No     | No\nSimple mutation                | Yes    | Yes   | Yes      | Yes   | No     | No    | No  | No     | No  | No      | No      | No     | Yes\nReflection                     | Yes    | No    | No       | No    | No     | No    | No  | Basic  | No  | No      | No      | No     | No\nBuffer verifier                | Yes    | No    | No       | No    | No     | No    | No  | Yes    | No  | No      | No      | No     | Yes\nNative Object API              | Yes    | No    | Yes      | Yes   | Yes    | Yes   | Yes | No     | No  | Yes     | No      | No     | Yes\nOptional Scalars               | Yes    | Yes   | Yes      | Yes   | No     | Yes   | Yes | Yes    | No  | No      | Yes     | Yes    | Yes\nFlexbuffers                    | Yes    | Yes   | ?        | ?     | ?      | ?     | ?   | ?      | ?   | ?       | ?       | Yes    | Yes\nTesting: basic                 | Yes    | Yes   | Yes      | Yes   | Yes    | Yes   | Yes | Yes    | ?   | Yes     | Yes     | Yes    | Yes\nTesting: fuzz                  | Yes    | No    | No       | Yes   | Yes    | No    | No  | No     | ?   | No      | No      | Yes    | No\nPerformance:                   | Superb | Great | Great    | Great | Ok     | ?     | ?   | Superb | ?   | ?       | Great   | Superb | Great\nPlatform: Windows              | VS2010 | Yes   | Yes      | ?     | ?      | ?     | Yes | VS2010 | ?   | Yes     | Yes     | Yes    | Yes\nPlatform: Linux                | GCC282 | Yes   | ?        | Yes   | Yes    | ?     | Yes | Yes    | ?   | Yes     | Yes     | Yes    | Yes\nPlatform: OS X                 | Xcode4 | ?     | ?        | ?     | Yes    | ?     | Yes | Yes    | ?   | Yes     | Yes     | Yes    | Yes\nPlatform: Android              | NDK10d | Yes   | ?        | ?     | ?      | ?     | ?   | ?      | ?   | Flutter | Yes     | ?      | No\nPlatform: iOS                  | ?      | ?     | ?        | ?     | ?      | ?     | ?   | ?      | ?   | Flutter | Yes     | ?      | Yes\nEngine: Unity                  | ?      | ?     | Yes      | ?     | ?      | ?     | ?   | ?      | ?   | ?       | No      | ?      | No\nPrimary authors (github)       | aard   | aard  | ev/js/df | rw    | rw     | ew/ev | kr  | mik    | ch  | df      | aard    | rw/cn  | mi/mz\n\nAbove | Github username\n----- | -----------------------------\naard  | aardappel (previously: gwvo)\nch    | chobie\ncn    | caspern\ndf    | dnfield\nev    | evolutional\new    | evanw\njs    | jonsimantov\nkr    | krojew\nmi    | mustiikhalil\nmik   | mikkelfj\nmz    | mzaks\nrw    | rw\n\n<br>\n"
  },
  {
    "path": "docs/source/tutorial.md",
    "content": "# Tutorial\n\nThis tutorial provides an example of how to work with FlatBuffers in a variety\nof languages. The following topics will cover all the steps of using FlatBuffers\nin your application.\n\n1. Writing a FlatBuffers schema file (`.fbs`).\n2. Using the `flatc` compiler to transform the schema into language-specific\n   code.\n3. Importing the generated code and libraries into your application.\n4. Serializing data into a flatbuffer.\n5. Deserializing a flatbuffer.\n\nThe tutorial is structured to be language agnostic, with language specifics in\ncode blocks providing more context. Additionally, this tries to cover the major\nparts and type system of flatbuffers to give a general overview. It's not\nexpected to be an exhaustive list of all features, or provide the best way to do\nthings.\n\n## FlatBuffers Schema (`.fbs`)\n\nTo start working with FlatBuffers, you first need to create a\n[schema](schema.md) file which defines the format of the data structures you\nwish to serialize. The schema is processed by the `flatc` compiler to generate\nlanguage-specific code that you use in your projects.\n\nThe following\n[`monster.fbs`](https://github.com/google/flatbuffers/blob/master/samples/monster.fbs)\nschema will be used for this tutorial. This is part of the FlatBuffers\n[sample code](https://github.com/google/flatbuffers/tree/master/samples) to give\ncomplete sample binaries demonstrations.\n\nFlatBuffers schema is a Interface Definition Language (IDL) that has a couple\ndata structures, see the [schema](schema.md) documentation for a detail\ndescription. Use the inline code annotations to get a brief synopsis of each\npart of the schema.\n\n```proto title=\"monster.fbs\" linenums=\"1\"\n// Example IDL file for our monster's schema.\n\nnamespace MyGame.Sample; //(1)!\n\nenum Color:byte { Red = 0, Green, Blue = 2 } //(2)!\n\n// Optionally add more tables.\nunion Equipment { Weapon } //(3)!\n\nstruct Vec3 { //(4)!\n  x:float; //(5)!\n  y:float;\n  z:float;\n}\n\ntable Monster { //(6)!\n  pos:Vec3; //(7)!\n  mana:short = 150; //(8)!\n  hp:short = 100;\n  name:string; //(9)!\n  friendly:bool = false (deprecated); //(10)!\n  inventory:[ubyte]; //(11)!\n  color:Color = Blue;\n  weapons:[Weapon]; //(12)!\n  equipped:Equipment; //(13)!\n  path:[Vec3];\n}\n\ntable Weapon {\n  name:string;\n  damage:short;\n}\n\nroot_type Monster; //(14)!\n```\n\n1. FlatBuffers has support for namespaces to place the generated code into.\n   There is mixed level of support for namespaces (some languages don't have\n   namespaces), but for the C family of languages, it is fully supported.\n\n2. Enums definitions can be defined with the backing numerical type. Implicit\n   numbering is supported, so that `Green` would have a value of 1.\n\n3. A union represents a single value from a set of possible values. Its\n   effectively an enum (to represent the type actually store) and a value,\n   combined into one. In this example, the union is not very useful, since it\n   only has a single type.\n\n4. A struct is a collection of scalar fields with names. It is itself a scalar\n   type, which uses less memory and has faster lookup. However, once a struct is\n   defined, it cannot be changed. Use tables for data structures that can evolve\n   over time.\n\n5. FlatBuffers has the standard set of scalar numerical types (`int8`, `int16`,\n   `int32`, `int64`, `uint8`, `uint16`, `uint32`, `uint64`, `float`, `double`),\n   as well as `bool`. Note, scalars are fixed width, `varints` are not\n   supported.\n\n6. Tables are the main data structure for grouping data together. It can evolve\n   by adding and deprecating fields over time, while preserving forward and\n   backwards compatibility.\n\n7. A field that happens to be a `struct`. This means the data of the `Vec3`\n   struct will be serialized inline in the table without any need for offset.\n\n8. Fields can be provided a default value. Default values can be configured to\n   not be serialized at all while still providing the default value while\n   deserializing. However, once set, a default value cannot be changed.\n\n9. A `string` field which points to a serialized string external to the table.\n\n10. A deprecated field that is no longer being used. This is used instead of\n    removing the field outright.\n\n11. A `vector` field that points to a vector of bytes. Like `strings`, the\n    vector data is serialized elsewhere and this field just stores an offset to\n    the vector.\n\n12. Vector of `tables` and `structs` are also possible.\n\n13. A field to a `union` type.\n\n14. The root of the flatbuffer is always a `table`. This indicates the type of\n    `table` the \"entry\" point of the flatbuffer will point to.\n\n## Compiling Schema to Code (`flatc`)\n\nAfter a schema file is written, you compile it to code in the languages you wish\nto work with. This compilation is done by the [FlatBuffers Compiler](flatc.md)\n(`flatc`) which is one of the binaries built in the repo.\n\n### Building `flatc`\n\nFlatBuffers uses [`cmake`](https://cmake.org/) to build projects files for your\nenvironment.\n\n=== \"Unix\"\n\n    ```sh\n    cmake -G \"Unix Makefiles\"\n    make flatc\n    ```\n\n=== \"Windows\"\n\n    ```sh\n    cmake -G \"Visual Studio 17 2022\"\n    msbuild.exe FlatBuffers.sln\n    ```\n\nSee the documentation on [building](building.md) for more details and other\nenvironments. Some languages also include a prebuilt `flatc` via their package\nmanager.\n\n### Compiling Schema\n\nTo compile the schema, invoke `flatc` with the schema file and the language\nflags you wish to generate code for. This compilation will generate files that\nyou include in your application code. These files provide convenient APIs for\nserializing and deserializing the flatbuffer binary data.\n\n=== \"C++\"\n\n    ```sh\n    flatc --cpp monster.fbs\n    ```\n\n=== \"C\"\n\n    !!! Note\n\n        If you're working in C, you need to use the separate project\n        [FlatCC](https://github.com/dvidelabs/flatcc) which contains a schema\n        compiler and runtime library in C for C. See\n        [flatcc build instructions](https://github.com/dvidelabs/flatcc#building).\n\n        Please be aware of the difference between `flatc` and `flatcc` tools.\n\n    ```sh\n    cd flatcc\n    mkdir -p build/tmp/samples/monster\n    bin/flatcc -a -o build/tmp/samples/monster samples/monster/monster.fbs\n    # or just\n    flatcc/samples/monster/build.sh\n    ```\n\n=== \"C#\"\n\n    ```sh\n    flatc --csharp monster.fbs\n    ```\n\n=== \"Dart\"\n\n    ```sh\n    flatc --dart monster.fbs\n    ```\n\n=== \"Go\"\n\n    ```sh\n    flatc --go monster.fbs\n    ```\n\n=== \"Java\"\n\n    ```sh\n    flatc --java monster.fbs\n    ```\n\n=== \"JavaScript\"\n\n    ```sh\n    flatc --js monster.fbs\n    ```\n\n=== \"Kotlin\"\n\n    ```sh\n    flatc --kotlin monster.fbs\n    ```\n\n=== \"Lobster\"\n\n    ```sh\n    flatc --lobster monster.fbs\n    ```\n\n=== \"Lua\"\n\n    ```sh\n    flatc --lua monster.fbs\n    ```\n\n=== \"PHP\"\n\n    ```sh\n    flatc --php monster.fbs\n    ```\n\n=== \"Python\"\n\n    ```sh\n    flatc --python monster.fbs\n    ```\n\n=== \"Rust\"\n\n    ```sh\n    flatc --rust monster.fbs\n    ```\n\n=== \"Swift\"\n\n    ```sh\n    flatc --swift monster.fbs\n    ```\n\n=== \"TypeScript\"\n\n    ```sh\n    flatc --ts monster.fbs\n    ```\n\nYou can deserialize flatbuffers in languages that differ from the language that\nserialized it. For purpose of this tutorial, we assume one language is used for\nboth serializing and deserializing.\n\n## Application Integration\n\nThe generated files are then included in your project to be built into your\napplication. This is heavily dependent on your build system and language, but\ngenerally involves two things:\n\n1. Importing the generated code.\n2. Importing the \"runtime\" libraries.\n\n=== \"C++\"\n\n    ```c++\n    #include \"monster_generated.h\" // This was generated by `flatc`\n    #include \"flatbuffers.h\" // The runtime library for C++\n\n    // Simplifies naming in the following examples.\n    using namespace MyGame::Sample; // Specified in the schema.\n    ```\n\n=== \"C\"\n\n    ```c\n    #include \"monster_builder.h\" // Generated by `flatcc`.\n\n    // Convenient namespace macro to manage long namespace prefix.\n    #undef ns\n    // Specified in the schema.\n    #define ns(x) FLATBUFFERS_WRAP_NAMESPACE(MyGame_Sample, x)\n\n    // A helper to simplify creating vectors from C-arrays.\n    #define c_vec_len(V) (sizeof(V)/sizeof((V)[0]))\n    ```\n\n=== \"C#\"\n\n    ```c#\n    using Google.FlatBuffers; // The runtime library for C#\n    using MyGame.Sample; // The generated files from `flatc`\n    ```\n\n=== \"Dart\"\n\n    ```dart\n    import 'package:flat_buffers/flat_buffers.dart' as fb;\n\n    // Generated by `flatc`.\n    import 'monster_my_game.sample_generated.dart' as myGame;\n    ```\n\n=== \"Go\"\n\n    ```go\n    import (\n          flatbuffers \"github.com/google/flatbuffers/go\"\n          sample \"MyGame/Sample\"\n    )\n    ```\n\n=== \"Java\"\n\n    ```java\n    import MyGame.Sample.*; //The `flatc` generated files. (Monster, Vec3, etc.)\n\n    import com.google.flatbuffers.FlatBufferBuilder;\n    ```\n\n=== \"JavaScript\"\n\n    ```javascript\n    // The following code is an example - use your desired module flavor by\n    // transpiling from TS.\n    var flatbuffers = require('/js/flatbuffers').flatbuffers;\n    var MyGame = require('./monster_generated').MyGame; // Generated by `flatc`.\n\n    //------------------------------------------------------------------------//\n\n    // The following code is for browser-based HTML/JavaScript. Use the above\n    // code for JavaScript module loaders (e.g. Node.js).\n    <script src=\"../js/flatbuffers.js\"></script>\n    <script src=\"monster_generated.js\"></script> // Generated by `flatc`.\n    ```\n\n=== \"Kotlin\"\n\n    ```kotlin\n    import MyGame.Sample.* //The `flatc` generated files. (Monster, Vec3, etc.)\n\n    import com.google.flatbuffers.FlatBufferBuilder\n    ```\n\n=== \"Lobster\"\n\n    ```lobster\n    import from \"../lobster/\"  // Where to find flatbuffers.lobster\n    import monster_generated\n    ```\n\n=== \"Lua\"\n\n    ```lua\n    -- require the flatbuffers module\n    local flatbuffers = require(\"flatbuffers\")\n\n    -- require the generated files from `flatc`.\n    local color = require(\"MyGame.Sample.Color\")\n    local equipment = require(\"MyGame.Sample.Equipment\")\n    local monster = require(\"MyGame.Sample.Monster\")\n    local vec3 = require(\"MyGame.Sample.Vec3\")\n    local weapon = require(\"MyGame.Sample.Weapon\")\n    ```\n\n=== \"PHP\"\n\n    ```php\n    // It is recommended that your use PSR autoload when using FlatBuffers in\n    // PHP. Here is an example from `SampleBinary.php`:\n    function __autoload($class_name) {\n        // The last segment of the class name matches the file name.\n        $class = substr($class_name, strrpos($class_name, \"\\\\\") + 1);\n        // `flatbuffers` root.\n        $root_dir = join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__))));\n\n        // Contains the `*.php` files for the FlatBuffers library and the `flatc`\n        // generated files.\n        $paths = array(join(DIRECTORY_SEPARATOR, array($root_dir, \"php\")),\n          join(DIRECTORY_SEPARATOR,\n            array($root_dir, \"samples\", \"MyGame\", \"Sample\")));\n        foreach ($paths as $path) {\n        $file = join(DIRECTORY_SEPARATOR, array($path, $class . \".php\"));\n        if (file_exists($file)) {\n            require($file);\n            break;\n        }\n      }\n    }\n    ```\n\n=== \"Python\"\n\n    ```py\n    import flatbuffers\n\n    # Generated by `flatc`.\n    import MyGame.Sample.Color\n    import MyGame.Sample.Equipment\n    import MyGame.Sample.Monster\n    import MyGame.Sample.Vec3\n    import MyGame.Sample.Weapon\n    ```\n\n=== \"Rust\"\n\n    ```rust\n    // import the flatbuffers runtime library\n    extern crate flatbuffers;\n\n    // import the generated code\n    #[allow(dead_code, unused_imports)]\n    #[path = \"./monster_generated.rs\"]\n    mod monster_generated;\n    pub use monster_generated::my_game::sample::{root_as_monster,\n                                                Color, Equipment,\n                                                Monster, MonsterArgs,\n                                                Vec3,\n                                                Weapon, WeaponArgs};\n    ```\n\n=== \"Swift\"\n\n    ```swift\n    /**\n    // make sure that monster_generated.swift is included in your project\n    */\n    import Flatbuffers\n\n    // typealiases for convenience\n    typealias Monster = MyGame1_Sample_Monster\n    typealias Weapon = MyGame1_Sample_Weapon\n    typealias Color = MyGame1_Sample_Color\n    typealias Vec3 = MyGame1_Sample_Vec3\n    ```\n\n=== \"TypeScript\"\n\n    ```ts\n    // note: import flatbuffers with your desired import method\n\n    import { MyGame } from './monster_generated';\n    ```\n\nFor some languages the runtime libraries are just code files you compile into\nyour application. While other languages provide packaged libraries via their\npackage managers.\n\nThe generated files include APIs for both serializing and deserializing\nFlatBuffers. So these steps are identical for both the consumer and producer.\n\n## Serialization\n\nOnce all the files are included into your application, it's time to start\nserializing some data!\n\nWith FlatBuffers, serialization can be a bit verbose, since each piece of data\nmust be serialized separately and in a particular order (depth-first, pre-order\ntraversal). The verbosity allows efficient serialization without heap\nallocations, at the cost of more complex serialization APIs.\n\nFor example, any reference type (e.g. `table`, `vector`, `string`) must be\nserialized before it can be referred to by other structures. So its typical to\nserialize the data from leaf to root node, as will be shown below.\n\n### FlatBufferBuilder\n\nMost languages use a Builder object for managing the binary array that the data\nis serialized into. It provides an API for serializing data, as well as keeps\ntrack of some internal state. The generated code wraps methods on the Builder\nobject to provide an API tailored to the schema.\n\nFirst instantiate a Builder (or reuse an existing one) and specify some memory\nfor it. The builder will automatically resize the backing buffer when necessary.\n\n=== \"C++\"\n\n    ```c++\n    // Construct a Builder with 1024 byte backing array.\n    flatbuffers::FlatBufferBuilder builder(1024);\n    ```\n\n=== \"C\"\n\n    ```c\n    flatcc_builder_t builder, *B;\n    B = &builder;\n    // Initialize the builder object.\n    flatcc_builder_init(B);\n    ```\n\n=== \"C#\"\n\n    ```c#\n    // Construct a Builder with 1024 byte backing array.\n    FlatBufferBuilder builder = new FlatBufferBuilder(1024);\n    ```\n\n=== \"Dart\"\n\n    ```dart\n    // Construct a Builder with 1024 byte backing array.\n    var builder = new fb.Builder(initialSize: 1024);\n    ```\n\n=== \"Go\"\n\n    ```go\n    // Construct a Builder with 1024 byte backing array.\n    builder := flatbuffers.NewBuilder(1024)\n    ```\n\n=== \"Java\"\n\n    ```java\n    // Construct a Builder with 1024 byte backing array.\n    FlatBufferBuilder builder = new FlatBufferBuilder(1024);\n    ```\n\n=== \"JavaScript\"\n\n    ```javascript\n    // Construct a Builder with 1024 byte backing array.\n    var builder = new flatbuffers.Builder(1024);\n    ```\n\n=== \"Kotlin\"\n\n    ```kotlin\n    // Construct a Builder with 1024 byte backing array.\n    val builder = FlatBufferBuilder(1024)\n    ```\n\n=== \"Lobster\"\n\n    ```lobster\n    // Construct a Builder with 1024 byte backing array.\n    let builder = flatbuffers_builder {}\n    ```\n\n=== \"Lua\"\n\n    ```lua\n    -- Construct a Builder with 1024 byte backing array.\n    local builder = flatbuffers.Builder(1024)\n    ```\n\n=== \"PHP\"\n\n    ```php\n    // Construct a Builder with 1024 byte backing array.\n    $builder = new Google\\FlatBuffers\\FlatbufferBuilder(1024);\n    ```\n\n=== \"Python\"\n\n    ```py\n    # Construct a Builder with 1024 byte backing array.\n    builder = flatbuffers.Builder(1024)\n    ```\n\n=== \"Rust\"\n\n    ```rust\n    // Construct a Builder with 1024 byte backing array.\n    let mut builder = flatbuffers::FlatBufferBuilder::with_capacity(1024);\n    ```\n\n=== \"Swift\"\n\n    ```swift\n    // Construct a Builder with 1024 byte backing array.\n    let builder = FlatBufferBuilder(initialSize: 1024)\n    ```\n\n=== \"TypeScript\"\n\n    ```ts\n    // Construct a Builder with 1024 byte backing array.\n    let builder = new flatbuffers.Builder(1024);\n    ```\n\nOnce a Builder is available, data can be serialized to it via the Builder APIs\nand the generated code.\n\n### Serializing Data\n\nIn this tutorial, we are building `Monsters` and `Weapons` for a computer game.\nA `Weapon` is represented by a flatbuffer `table` with some fields. One field is\nthe `name` field, which is type `string` and the other `damage` field is a\nnumerical scalar.\n\n```c title=\"monster.fbs\" linenums=\"28\"\ntable Weapon {\n  name:string;\n  damage:short;\n}\n```\n\n#### Strings\n\nSince `string` is a reference type, we first need to serialize it before\nassigning it to the `name` field of the `Weapon` table. This is done through the\nBuilder `CreateString` method.\n\nLet's serialize two weapon strings.\n\n=== \"C++\"\n\n    ```c++\n    flatbuffers::Offset<String> weapon_one_name = builder.CreateString(\"Sword\");\n    flatbuffers::Offset<String> weapon_two_name = builder.CreateString(\"Axe\");\n    ```\n\n    `flatbuffers::Offset<>` is a just a \"typed\" integer tied to a particular\n    type. It helps make the numerical offset more strongly typed.\n\n=== \"C\"\n\n    ```c\n    flatbuffers_string_ref_t weapon_one_name\n        = flatbuffers_string_create_str(B, \"Sword\");\n    flatbuffers_string_ref_t weapon_two_name\n        = flatbuffers_string_create_str(B, \"Axe\");\n    ```\n\n=== \"C#\"\n\n    ```c#\n    Offset<String> weaponOneName = builder.CreateString(\"Sword\");\n    Offset<String> weaponTwoName = builder.CreateString(\"Axe\");\n    ```\n\n=== \"Dart\"\n\n    ```dart\n    final int weaponOneName = builder.writeString(\"Sword\");\n    final int weaponTwoName = builder.writeString(\"Axe\");\n    ```\n\n=== \"Go\"\n\n    ```go\n    weaponOne := builder.CreateString(\"Sword\")\n    weaponTwo := builder.CreateString(\"Axe\")\n    ```\n\n=== \"Java\"\n\n    ```java\n    int weaponOneName = builder.createString(\"Sword\")\n    int weaponTwoName = builder.createString(\"Axe\");\n    ```\n\n=== \"JavaScript\"\n\n    ```javascript\n    var weaponOne = builder.createString('Sword');\n    var weaponTwo = builder.createString('Axe');\n    ```\n\n=== \"Kotlin\"\n\n    ```kotlin\n    val weaponOneName = builder.createString(\"Sword\")\n    val weaponTwoName = builder.createString(\"Axe\")\n    ```\n\n=== \"Lobster\"\n\n    ```lobster\n    let weapon_one = builder.CreateString(\"Sword\")\n    let weapon_two = builder.CreateString(\"Axe\")\n    ```\n\n=== \"Lua\"\n\n    ```lua\n    local weaponOne = builder:CreateString(\"Sword\")\n    local weaponTwo = builder:CreateString(\"Axe\")\n    ```\n\n=== \"PHP\"\n\n    ```php\n    $weapon_one_name = $builder->createString(\"Sword\")\n    $weapon_two_name = $builder->createString(\"Axe\");\n    ```\n\n=== \"Python\"\n\n    ```py\n    weapon_one = builder.CreateString('Sword')\n    weapon_two = builder.CreateString('Axe')\n    ```\n\n=== \"Rust\"\n\n    ```rust\n    let weapon_one_name = builder.create_string(\"Sword\");\n    let weapon_two_name = builder.create_string(\"Axe\");\n    ```\n\n=== \"Swift\"\n\n    ```swift\n    let weapon1Name = builder.create(string: \"Sword\")\n    let weapon2Name = builder.create(string: \"Axe\")\n    ```\n\n=== \"TypeScript\"\n\n    ```ts\n    let weaponOne = builder.createString('Sword');\n    let weaponTwo = builder.createString('Axe');\n    ```\n\n\nThis performs the actual serialization (the string data is copied into the\nbacking array) and returns an offset. Think of the offset as a handle to that\nreference. It's just a \"typed\" numerical offset to where that data resides in\nthe buffer.\n\n#### Tables\n\nNow that we have some names serialized, we can serialize the `Weapon` tables.\nHere we will use one of the generated helper functions that was emitted by\n`flatc`. The `CreateWeapon` function takes in the Builder object, as well as the\noffset to the weapon's name and a numerical value for the damage field.\n\n=== \"C++\"\n\n    ```c++\n    short weapon_one_damage = 3;\n    short weapon_two_damage = 5;\n\n    // Use the `CreateWeapon()` shortcut to create Weapons with all the fields\n    // set.\n    flatbuffers::Offset<Weapon> sword =\n        CreateWeapon(builder, weapon_one_name, weapon_one_damage);\n    flatbuffers::Offset<Weapon> axe =\n        CreateWeapon(builder, weapon_two_name, weapon_two_damage);\n    ```\n\n=== \"C\"\n\n    ```c\n    uint16_t weapon_one_damage = 3;\n    uint16_t weapon_two_damage = 5;\n\n    ns(Weapon_ref_t) sword\n        = ns(Weapon_create(B, weapon_one_name, weapon_one_damage));\n    ns(Weapon_ref_t) axe\n        = ns(Weapon_create(B, weapon_two_name, weapon_two_damage));\n    ```\n\n=== \"C#\"\n\n    ```c#\n    short weaponOneDamage = 3;\n    short weaponTwoDamage = 5;\n\n    // Use the `CreateWeapon()` helper function to create the weapons, since we\n    // set every field.\n    Offset<Weapon> sword =\n        Weapon.CreateWeapon(builder, weaponOneName, weaponOneDamage);\n    Offset<Weapon> axe =\n        Weapon.CreateWeapon(builder, weaponTwoName, weaponTwoDamage);\n    ```\n\n=== \"Dart\"\n\n    ```dart\n    final int weaponOneDamage = 3;\n    final int weaponTwoDamage = 5;\n\n    final swordBuilder = new myGame.WeaponBuilder(builder)\n        ..begin()\n        ..addNameOffset(weaponOneName)\n        ..addDamage(weaponOneDamage);\n    final int sword = swordBuilder.finish();\n\n    final axeBuilder = new myGame.WeaponBuilder(builder)\n        ..begin()\n        ..addNameOffset(weaponTwoName)\n        ..addDamage(weaponTwoDamage);\n    final int axe = axeBuilder.finish();\n    ```\n\n    Note, as an alternative, the previous steps can be combined using the\n    generative Builder classes.\n\n    ```dart\n    final myGame.WeaponBuilder sword = new myGame.WeaponObjectBuilder(\n        name: \"Sword\",\n        damage: 3,\n    );\n\n    final myGame.WeaponBuilder axe = new myGame.WeaponObjectBuilder(\n        name: \"Axe\",\n        damage: 5,\n    );\n    ```\n\n=== \"Go\"\n\n    ```go\n    // Create the first `Weapon` (\"Sword\").\n    sample.WeaponStart(builder)\n    sample.WeaponAddName(builder, weaponOne)\n    sample.WeaponAddDamage(builder, 3)\n    sword := sample.WeaponEnd(builder)\n\n    // Create the second `Weapon` (\"Axe\").\n    sample.WeaponStart(builder)\n    sample.WeaponAddName(builder, weaponTwo)\n    sample.WeaponAddDamage(builder, 5)\n    axe := sample.WeaponEnd(builder)\n    ```\n\n=== \"Java\"\n\n    ```java\n    short weaponOneDamage = 3;\n    short weaponTwoDamage = 5;\n\n    // Use the `createWeapon()` helper function to create the weapons, since we\n    // set every field.\n    int sword = Weapon.createWeapon(builder, weaponOneName, weaponOneDamage);\n    int axe = Weapon.createWeapon(builder, weaponTwoName, weaponTwoDamage);\n    ```\n\n=== \"JavaScript\"\n\n    ```javascript\n    // Create the first `Weapon` ('Sword').\n    MyGame.Sample.Weapon.startWeapon(builder);\n    MyGame.Sample.Weapon.addName(builder, weaponOne);\n    MyGame.Sample.Weapon.addDamage(builder, 3);\n    var sword = MyGame.Sample.Weapon.endWeapon(builder);\n\n    // Create the second `Weapon` ('Axe').\n    MyGame.Sample.Weapon.startWeapon(builder);\n    MyGame.Sample.Weapon.addName(builder, weaponTwo);\n    MyGame.Sample.Weapon.addDamage(builder, 5);\n    var axe = MyGame.Sample.Weapon.endWeapon(builder);\n    ```\n\n=== \"Kotlin\"\n\n    ```kotlin\n    val weaponOneDamage: Short = 3;\n    val weaponTwoDamage: Short = 5;\n\n    // Use the `createWeapon()` helper function to create the weapons, since we\n    // set every field.\n    val sword = Weapon.createWeapon(builder, weaponOneName, weaponOneDamage)\n    val axe = Weapon.createWeapon(builder, weaponTwoName, weaponTwoDamage)\n    ```\n\n=== \"Lobster\"\n\n    ```lobster\n    let sword = MyGame_Sample_WeaponBuilder { b }\n          .start()\n          .add_name(weapon_one)\n          .add_damage(3)\n          .end()\n\n    let axe = MyGame_Sample_WeaponBuilder { b }\n          .start()\n          .add_name(weapon_two)\n          .add_damage(5)\n          .end()\n    ```\n\n=== \"Lua\"\n\n    ```lua\n    -- Create the first 'Weapon'\n    weapon.Start(builder)\n    weapon.AddName(builder, weaponOne)\n    weapon.AddDamage(builder, 3)\n    local sword = weapon.End(builder)\n\n    -- Create the second 'Weapon'\n    weapon.Start(builder)\n    weapon.AddName(builder, weaponTwo)\n    weapon.AddDamage(builder, 5)\n    local axe = weapon.End(builder)\n    ```\n\n=== \"PHP\"\n\n    ```php\n    $sword = \\MyGame\\Sample\\Weapon::CreateWeapon($builder, $weapon_one_name, 3);\n    $axe = \\MyGame\\Sample\\Weapon::CreateWeapon($builder, $weapon_two_name, 5);\n    ```\n\n=== \"Python\"\n\n    ```py\n    # Create the first `Weapon` ('Sword').\n    MyGame.Sample.Weapon.Start(builder)\n    MyGame.Sample.Weapon.AddName(builder, weapon_one)\n    MyGame.Sample.Weapon.AddDamage(builder, 3)\n    sword = MyGame.Sample.Weapon.End(builder)\n\n    # Create the second `Weapon` ('Axe').\n    MyGame.Sample.Weapon.Start(builder)\n    MyGame.Sample.Weapon.AddName(builder, weapon_two)\n    MyGame.Sample.Weapon.AddDamage(builder, 5)\n    axe = MyGame.Sample.Weapon.End(builder)\n    ```\n\n=== \"Rust\"\n\n    ```rust\n    // Use the `Weapon::create` shortcut to create Weapons with named field\n    // arguments.\n    let sword = Weapon::create(&mut builder, &WeaponArgs{\n        name: Some(weapon_one_name),\n        damage: 3,\n    });\n    let axe = Weapon::create(&mut builder, &WeaponArgs{\n        name: Some(weapon_two_name),\n        damage: 5,\n    });\n    ```\n\n=== \"Swift\"\n\n    ```swift\n    // start creating the weapon by calling startWeapon\n    let weapon1Start = Weapon.startWeapon(&builder)\n    Weapon.add(name: weapon1Name, &builder)\n    Weapon.add(damage: 3, &builder)\n    // end the object by passing the start point for the weapon 1\n    let sword = Weapon.endWeapon(&builder, start: weapon1Start)\n\n    let weapon2Start = Weapon.startWeapon(&builder)\n    Weapon.add(name: weapon2Name, &builder)\n    Weapon.add(damage: 5, &builder)\n    let axe = Weapon.endWeapon(&builder, start: weapon2Start)\n    ```\n\n=== \"TypeScript\"\n\n    ```ts\n    // Create the first `Weapon` ('Sword').\n    MyGame.Sample.Weapon.startWeapon(builder);\n    MyGame.Sample.Weapon.addName(builder, weaponOne);\n    MyGame.Sample.Weapon.addDamage(builder, 3);\n    let sword = MyGame.Sample.Weapon.endWeapon(builder);\n\n    // Create the second `Weapon` ('Axe').\n    MyGame.Sample.Weapon.startWeapon(builder);\n    MyGame.Sample.Weapon.addName(builder, weaponTwo);\n    MyGame.Sample.Weapon.addDamage(builder, 5);\n    let axe = MyGame.Sample.Weapon.endWeapon(builder);\n    ```\n\n\nThe generated functions from `flatc`, like `CreateWeapon`, are just composed of\nvarious Builder API methods. So its not required to use the generated code, but\nit does make things much simpler and compact.\n\nJust like the `CreateString` methods, the table serialization functions return\nan offset to the location of the serialized `Weapon` table.\n\nNow that we have some `Weapons` serialized, we can serialize a `Monster`.\nLooking at the schema again, this table has a lot more fields of various types.\nSome of these need to be serialized beforehand, for the same reason we\nserialized the name string before the weapon table.\n\n!!! note inline end\n\n    There is no prescribed ordering of which table fields must be serialized\n    first, you could serialize in any order you want. You can also not serialize\n    a field to provide a `null` value, this is done by using an 0 offset value.\n\n```c title=\"monster.fbs\" linenums=\"15\"\ntable Monster {\n  pos:Vec3;\n  mana:short = 150;\n  hp:short = 100;\n  name:string;\n  friendly:bool = false (deprecated);\n  inventory:[ubyte];\n  color:Color = Blue;\n  weapons:[Weapon];\n  equipped:Equipment;\n  path:[Vec3];\n}\n```\n\n#### Vectors\n\nThe `weapons` field is a `vector` of `Weapon` tables. We already have two\n`Weapons` serialized, so we just need to serialize a `vector` of those offsets.\nThe Builder provides multiple ways to create `vectors`.\n\n=== \"C++\"\n\n    ```c++\n    // Create a std::vector of the offsets we had previous made.\n    std::vector<flatbuffers::Offset<Weapon>> weapons_vector;\n    weapons_vector.push_back(sword);\n    weapons_vector.push_back(axe);\n\n    // Then serialize that std::vector into the buffer and again get an Offset\n    // to that vector. Use `auto` here since the full type is long, and it just\n    // a \"typed\" number.\n    auto weapons = builder.CreateVector(weapons_vector);\n    ```\n\n=== \"C\"\n\n    ```c\n    // We use the internal builder stack to implement a dynamic vector.\n    ns(Weapon_vec_start(B));\n    ns(Weapon_vec_push(B, sword));\n    ns(Weapon_vec_push(B, axe));\n    ns(Weapon_vec_ref_t) weapons = ns(Weapon_vec_end(B));\n    ```\n\n=== \"C#\"\n\n    ```c#\n    // Create an array of the two weapon offsets.\n    var weaps = new Offset<Weapon>[2];\n    weaps[0] = sword;\n    weaps[1] = axe;\n\n    // Pass the `weaps` array into the `CreateWeaponsVector()` method to create\n    // a FlatBuffer vector.\n    var weapons = Monster.CreateWeaponsVector(builder, weaps);\n    ```\n\n=== \"Dart\"\n\n    ```dart\n    // If using the Builder classes, serialize the `[sword,axe]`\n    final weapons = builder.writeList([sword, axe]);\n\n    // If using the ObjectBuilders, just create an array from the two `Weapon`s\n    final List<myGame.WeaponBuilder> weaps = [sword, axe];\n    ```\n\n=== \"Go\"\n\n    ```go\n    // Create a FlatBuffer vector and prepend the weapons.\n    // Note: Since we prepend the data, prepend them in reverse order.\n    sample.MonsterStartWeaponsVector(builder, 2)\n    builder.PrependUOffsetT(axe)\n    builder.PrependUOffsetT(sword)\n    weapons := builder.EndVector(2)\n    ```\n\n=== \"Java\"\n\n    ```java\n    // Place the two weapons into an array, and pass it to the\n    // `createWeaponsVector()` method to create a FlatBuffer vector.\n    int[] weaps = new int[2];\n    weaps[0] = sword;\n    weaps[1] = axe;\n\n    // Pass the `weaps` array into the `createWeaponsVector()` method to create\n    // a FlatBuffer vector.\n    int weapons = Monster.createWeaponsVector(builder, weaps);\n    ```\n\n=== \"JavaScript\"\n\n    ```javascript\n    // Create an array from the two `Weapon`s and pass it to the\n    // `createWeaponsVector()` method to create a FlatBuffer vector.\n    var weaps = [sword, axe];\n    var weapons = MyGame.Sample.Monster.createWeaponsVector(builder, weaps);\n    ```\n\n=== \"Kotlin\"\n\n    ```kotlin\n    // Place the two weapons into an array, and pass it to the\n    // `createWeaponsVector()` method to create a FlatBuffer vector.\n    val weaps = intArrayOf(sword, axe)\n\n    // Pass the `weaps` array into the `createWeaponsVector()` method to create\n    // a FlatBuffer vector.\n    val weapons = Monster.createWeaponsVector(builder, weaps)\n    ```\n\n=== \"Lobster\"\n\n    ```lobster\n    let weapons = builder.MyGame_Sample_MonsterCreateWeaponsVector([sword, axe])\n    ```\n\n=== \"Lua\"\n\n    ```lua\n    -- Create a FlatBuffer vector and prepend the weapons.\n    -- Note: Since we prepend the data, prepend them in reverse order.\n    monster.StartWeaponsVector(builder, 2)\n    builder:PrependUOffsetTRelative(axe)\n    builder:PrependUOffsetTRelative(sword)\n    local weapons = builder:EndVector(2)\n    ```\n\n=== \"PHP\"\n\n    ```php\n    // Create an array from the two `Weapon`s and pass it to the\n    // `CreateWeaponsVector()` method to create a FlatBuffer vector.\n    $weaps = array($sword, $axe);\n    $weapons = \\MyGame\\Sample\\Monster::CreateWeaponsVector($builder, $weaps);\n    ```\n\n=== \"Python\"\n\n    ```py\n    # Use the generated helper to create the weapons vector from offsets.\n    weapons = MyGame.Sample.Monster.CreateWeaponsVector(builder, [sword, axe])\n    ```\n\n=== \"Rust\"\n\n    ```rust\n    // Create a FlatBuffer `vector` that contains offsets to the sword and axe\n    // we created above.\n    let weapons = builder.create_vector(&[sword, axe]);\n    ```\n\n=== \"Swift\"\n\n    ```swift\n    // Create a FlatBuffer `vector` that contains offsets to the sword and axe\n    // we created above.\n    let weaponsOffset = builder.createVector(ofOffsets: [sword, axe])\n    ```\n\n=== \"TypeScript\"\n\n    ```ts\n    // Create an array from the two `Weapon`s and pass it to the\n    // `createWeaponsVector()` method to create a FlatBuffer vector.\n    let weaps = [sword, axe];\n    let weapons = MyGame.Sample.Monster.createWeaponsVector(builder, weaps);\n    ```\n\n\nWhile we are at it, let us serialize the other two vector fields: the\n`inventory` field is just a vector of scalars, and the `path` field is a vector\nof structs (which are scalar data as well). So these vectors can be serialized a\nbit more directly.\n\n=== \"C++\"\n\n    ```c++\n    // Create a `vector` representing the inventory of the Orc. Each number\n    // could correspond to an item that can be claimed after he is slain.\n    unsigned char treasure[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};\n    flatbuffers::Offset<flatbuffers::Vector<unsigned char>> inventory =\n        builder.CreateVector(treasure, 10);\n\n    // Construct an array of two `Vec3` structs.\n    Vec3 points[] = { Vec3(1.0f, 2.0f, 3.0f), Vec3(4.0f, 5.0f, 6.0f) };\n\n    // Serialize it as a vector of structs.\n    flatbuffers::Offset<flatbuffers::Vector<Vec3>> path =\n        builder.CreateVectorOfStructs(points, 2);\n    ```\n\n=== \"C\"\n\n    ```c\n    // Create a `vector` representing the inventory of the Orc. Each number\n    // could correspond to an item that can be claimed after he is slain.\n    uint8_t treasure[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};\n    flatbuffers_uint8_vec_ref_t inventory;\n    // `c_vec_len` is the convenience macro we defined earlier.\n    inventory = flatbuffers_uint8_vec_create(B, treasure, c_vec_len(treasure));\n    ```\n\n=== \"C#\"\n\n    ```c#\n    // Create a `vector` representing the inventory of the Orc. Each number\n    // could correspond to an item that can be claimed after he is slain.\n    // Note: Since we prepend the bytes, this loop iterates in reverse order.\n    Monster.StartInventoryVector(builder, 10);\n    for (int i = 9; i >= 0; i--)\n    {\n        builder.AddByte((byte)i);\n    }\n    Offset<Vector<byte>> inventory = builder.EndVector();\n\n      // Start building a path vector of length 2.\n    Monster.StartPathVector(fbb, 2);\n\n    // Serialize the individual Vec3 structs\n    Vec3.CreateVec3(builder, 1.0f, 2.0f, 3.0f);\n    Vec3.CreateVec3(builder, 4.0f, 5.0f, 6.0f);\n\n    // End the vector to get the offset\n    Offset<Vector<Vec3>> path = fbb.EndVector();\n    ```\n\n=== \"Dart\"\n\n    ```dart\n    // Create a list representing the inventory of the Orc. Each number\n    // could correspond to an item that can be claimed after he is slain.\n    final List<int> treasure = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];\n    final inventory = builder.writeListUint8(treasure);\n\n    // Using the Builder classes, you can write a list of structs like so:\n    // Note that the intended order should be reversed if order is important.\n    final vec3Builder = new myGame.Vec3Builder(builder);\n    vec3Builder.finish(4.0, 5.0, 6.0);\n    vec3Builder.finish(1.0, 2.0, 3.0);\n    final int path = builder.endStructVector(2); // the length of the vector\n    ```\n\n=== \"Go\"\n\n    ```go\n    // Create a `vector` representing the inventory of the Orc. Each number\n    // could correspond to an item that can be claimed after he is slain.\n    // Note: Since we prepend the bytes, this loop iterates in reverse.\n    sample.MonsterStartInventoryVector(builder, 10)\n    for i := 9; i >= 0; i-- {\n            builder.PrependByte(byte(i))\n    }\n    inv := builder.EndVector(10)\n\n    sample.MonsterStartPathVector(builder, 2)\n    sample.CreateVec3(builder, 1.0, 2.0, 3.0)\n    sample.CreateVec3(builder, 4.0, 5.0, 6.0)\n    path := builder.EndVector(2)\n    ```\n\n=== \"Java\"\n\n    ```java\n    // Create a `vector` representing the inventory of the Orc. Each number\n    // could correspond to an item that can be claimed after he is slain.\n    byte[] treasure = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};\n    int inv = Monster.createInventoryVector(builder, treasure);\n\n    Monster.startPathVector(fbb, 2);\n    Vec3.createVec3(builder, 1.0f, 2.0f, 3.0f);\n    Vec3.createVec3(builder, 4.0f, 5.0f, 6.0f);\n    int path = fbb.endVector();\n    ```\n\n=== \"JavaScript\"\n\n    ```javascript\n    // Create a `vector` representing the inventory of the Orc. Each number\n    // could correspond to an item that can be claimed after he is slain.\n    var treasure = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];\n    var inv = MyGame.Sample.Monster.createInventoryVector(builder, treasure);\n\n    MyGame.Sample.Monster.startPathVector(builder, 2);\n    MyGame.Sample.Vec3.createVec3(builder, 1.0, 2.0, 3.0);\n    MyGame.Sample.Vec3.createVec3(builder, 4.0, 5.0, 6.0);\n    var path = builder.endVector();\n    ```\n\n=== \"Kotlin\"\n\n    ```kotlin\n    // Create a `vector` representing the inventory of the Orc. Each number\n    // could correspond to an item that can be claimed after he is slain.\n    val treasure = byteArrayOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)\n    val inv = Monster.createInventoryVector(builder, treasure)\n\n    Monster.startPathVector(fbb, 2)\n    Vec3.createVec3(builder, 1.0f, 2.0f, 3.0f)\n    Vec3.createVec3(builder, 4.0f, 5.0f, 6.0f)\n    val path = fbb.endVector()\n    ```\n\n=== \"Lobster\"\n\n    ```lobster\n    // Inventory.\n    let inv = builder.MyGame_Sample_MonsterCreateInventoryVector(map(10): _)\n\n    builder.MyGame_Sample_MonsterStartPathVector(2)\n    builder.MyGame_Sample_CreateVec3(1.0, 2.0, 3.0)\n    builder.MyGame_Sample_CreateVec3(4.0, 5.0, 6.0)\n    let path = builder.EndVector(2)\n    ```\n\n=== \"Lua\"\n\n    ```lua\n    -- Create a `vector` representing the inventory of the Orc. Each number\n    -- could correspond to an item that can be claimed after he is slain.\n    -- Note: Since we prepend the bytes, this loop iterates in reverse.\n    monster.StartInventoryVector(builder, 10)\n    for i=10,1,-1 do\n        builder:PrependByte(i)\n    end\n    local inv = builder:EndVector(10)\n\n    -- Create a FlatBuffer vector and prepend the path locations.\n    -- Note: Since we prepend the data, prepend them in reverse order.\n    monster.StartPathVector(builder, 2)\n    vec3.CreateVec3(builder, 1.0, 2.0, 3.0)\n    vec3.CreateVec3(builder, 4.0, 5.0, 6.0)\n    local path = builder:EndVector(2)\n    ```\n\n=== \"PHP\"\n\n    ```php\n    // Create a `vector` representing the inventory of the Orc. Each number\n    // could correspond to an item that can be claimed after he is slain.\n    $treasure = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);\n    $inv = \\MyGame\\Sample\\Monster::CreateInventoryVector($builder, $treasure);\n\n    \\MyGame\\Example\\Monster::StartPathVector($builder, 2);\n    \\MyGame\\Sample\\Vec3::CreateVec3($builder, 1.0, 2.0, 3.0);\n    \\MyGame\\Sample\\Vec3::CreateVec3($builder, 1.0, 2.0, 3.0);\n    $path = $builder->endVector();\n    ```\n\n=== \"Python\"\n\n    ```py\n    # Create a `vector` representing the inventory of the Orc. Each number\n    # could correspond to an item that can be claimed after he is slain.\n    inv = MyGame.Sample.Monster.CreateInventoryVector(builder, range(0, 10))\n\n    path_points = [\n        MyGame.Sample.Vec3T(x=1.0, y=2.0, z=3.0),\n        MyGame.Sample.Vec3T(x=4.0, y=5.0, z=6.0),\n    ]\n    path = MyGame.Sample.Monster.CreatePathVector(builder, path_points)\n    ```\n\n=== \"Rust\"\n\n    ```rust\n    // Inventory.\n    let inventory = builder.create_vector(&[0u8, 1, 2, 3, 4, 5, 6, 7, 8, 9]);\n\n    // Create the path vector of Vec3 objects.\n    let x = Vec3::new(1.0, 2.0, 3.0);\n    let y = Vec3::new(4.0, 5.0, 6.0);\n    let path = builder.create_vector(&[x, y]);\n    ```\n\n=== \"Swift\"\n\n    ```swift\n    // create inventory\n    let inventory: [Byte] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n    let inventoryOffset = builder.createVector(inventory)\n\n    let path = fbb.createVector(ofStructs: [\n        Vec3(x: 1, y: 2, z: 3),\n        Vec3(x: 4, y: 5, z: 6)\n    ])\n    ```\n\n=== \"TypeScript\"\n\n    ```ts\n    // Create a `vector` representing the inventory of the Orc. Each number\n    // could correspond to an item that can be claimed after he is slain.\n    let treasure = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];\n    let inv = MyGame.Sample.Monster.createInventoryVector(builder, treasure);\n\n    MyGame.Sample.Monster.startPathVector(builder, 2);\n    MyGame.Sample.Vec3.createVec3(builder, 1.0, 2.0, 3.0);\n    MyGame.Sample.Vec3.createVec3(builder, 4.0, 5.0, 6.0);\n    let path = builder.endVector();\n    ```\n\n\n#### Unions\n\nThe last non-scalar data field for the `Monster` table is the `equipped` `union`\nfield. For this case, we will reuse an already serialized `Weapon` (the only\ntype in the union), without needing to reserialize it. Union fields implicitly\nadd a hidden `_type` field that stores the type of value stored in the union.\nWhen serializing a union, you must explicitly set this type field, along with\nproviding the union value.\n\nWe will also serialize the other scalar data at the same time, since we have all\nthe necessary values and Offsets to make a `Monster`.\n\n=== \"C++\"\n\n    ```c++\n    // Create the remaining data needed for the Monster.\n    auto name = builder.CreateString(\"Orc\");\n\n    // Create the position struct\n    auto position = Vec3(1.0f, 2.0f, 3.0f);\n\n    // Set his hit points to 300 and his mana to 150.\n    int hp = 300;\n    int mana = 150;\n\n    // Finally, create the monster using the `CreateMonster` helper function\n    // to set all fields.\n    //\n    // Here we set the union field by using the `.Union()` method of the\n    // `Offset<Weapon>` axe we already serialized above. We just have to specify\n    // which type of object we put in the union, and do that with the\n    // auto-generated `Equipment_Weapon` enum.\n    flatbuffers::Offset<Monster> orc =\n        CreateMonster(builder, &position, mana, hp, name, inventory,\n                      Color_Red, weapons, Equipment_Weapon, axe.Union(),\n                      path);\n\n    ```\n\n=== \"C\"\n\n    ```c\n    // Serialize a name for our monster, called \"Orc\".\n    // The _str suffix indicates the source is an ascii-z string.\n    flatbuffers_string_ref_t name = flatbuffers_string_create_str(B, \"Orc\");\n\n    // Set his hit points to 300 and his mana to 150.\n    uint16_t hp = 300;\n    uint16_t mana = 150;\n\n    // Define an equipment union. `create` calls in C has a single\n    // argument for unions where C++ has both a type and a data argument.\n    ns(Equipment_union_ref_t) equipped = ns(Equipment_as_Weapon(axe));\n    ns(Vec3_t) pos = { 1.0f, 2.0f, 3.0f };\n    ns(Monster_create_as_root(B, &pos, mana, hp, name, inventory, ns(Color_Red),\n            weapons, equipped, path));\n    ```\n\n=== \"C#\"\n\n    ```c#\n    // Create the remaining data needed for the Monster.\n    var name = builder.CreateString(\"Orc\");\n\n    // Create our monster using `StartMonster()` and `EndMonster()`.\n    Monster.StartMonster(builder);\n    Monster.AddPos(builder, Vec3.CreateVec3(builder, 1.0f, 2.0f, 3.0f));\n    Monster.AddHp(builder, (short)300);\n    Monster.AddName(builder, name);\n    Monster.AddInventory(builder, inv);\n    Monster.AddColor(builder, Color.Red);\n    Monster.AddWeapons(builder, weapons);\n    // For union fields, we explicitly add the auto-generated enum for the type\n    // of value stored in the union.\n    Monster.AddEquippedType(builder, Equipment.Weapon);\n    // And we just use the `.Value` property of the already serialized axe.\n    Monster.AddEquipped(builder, axe.Value); // Axe\n    Monster.AddPath(builder, path);\n    Offset<Monster> orc = Monster.EndMonster(builder);\n    ```\n\n=== \"Dart\"\n\n    ```dart\n    // Serialize a name for our monster, called \"Orc\".\n    final int name = builder.writeString('Orc');\n\n    // Using the Builder API:\n    // Set his hit points to 300 and his mana to 150.\n    final int hp = 300;\n    final int mana = 150;\n\n    final monster = new myGame.MonsterBuilder(builder)\n        ..begin()\n        ..addNameOffset(name)\n        ..addInventoryOffset(inventory)\n        ..addWeaponsOffset(weapons)\n        ..addEquippedType(myGame.EquipmentTypeId.Weapon)\n        ..addEquippedOffset(axe)\n        ..addHp(hp)\n        ..addMana(mana)\n        ..addPos(vec3Builder.finish(1.0, 2.0, 3.0))\n        ..addPathOffset(path)\n        ..addColor(myGame.Color.Red);\n\n    final int orc = monster.finish();\n    ```\n\n=== \"Go\"\n\n    ```go\n    // Serialize a name for our monster, called \"Orc\".\n    name := builder.CreateString(\"Orc\")\n\n    // Create our monster using `MonsterStart()` and `MonsterEnd()`.\n    sample.MonsterStart(builder)\n    sample.MonsterAddPos(builder, sample.CreateVec3(builder, 1.0, 2.0, 3.0))\n    sample.MonsterAddHp(builder, 300)\n    sample.MonsterAddName(builder, name)\n    sample.MonsterAddInventory(builder, inv)\n    sample.MonsterAddColor(builder, sample.ColorRed)\n    sample.MonsterAddWeapons(builder, weapons)\n    sample.MonsterAddEquippedType(builder, sample.EquipmentWeapon)\n    sample.MonsterAddEquipped(builder, axe)\n    sample.MonsterAddPath(builder, path)\n    orc := sample.MonsterEnd(builder)\n    ```\n\n=== \"Java\"\n\n    ```java\n    // Serialize a name for our monster, called \"Orc\".\n    int name = builder.createString(\"Orc\");\n\n    // Create our monster using `startMonster()` and `endMonster()`.\n    Monster.startMonster(builder);\n    Monster.addPos(builder, Vec3.createVec3(builder, 1.0f, 2.0f, 3.0f));\n    Monster.addName(builder, name);\n    Monster.addColor(builder, Color.Red);\n    Monster.addHp(builder, (short)300);\n    Monster.addInventory(builder, inv);\n    Monster.addWeapons(builder, weapons);\n    Monster.addEquippedType(builder, Equipment.Weapon);\n    Monster.addEquipped(builder, axe);\n    Monster.addPath(builder, path);\n    int orc = Monster.endMonster(builder);\n    ```\n\n=== \"JavaScript\"\n\n    ```javascript\n    // Serialize a name for our monster, called 'Orc'.\n    var name = builder.createString('Orc');\n\n    // Create our monster by using `startMonster()` and `endMonster()`.\n    MyGame.Sample.Monster.startMonster(builder);\n    MyGame.Sample.Monster.addPos(builder,\n       MyGame.Sample.Vec3.createVec3(builder, 1.0, 2.0, 3.0));\n    MyGame.Sample.Monster.addHp(builder, 300);\n    MyGame.Sample.Monster.addColor(builder, MyGame.Sample.Color.Red)\n    MyGame.Sample.Monster.addName(builder, name);\n    MyGame.Sample.Monster.addInventory(builder, inv);\n    MyGame.Sample.Monster.addWeapons(builder, weapons);\n    MyGame.Sample.Monster.addEquippedType(builder,\n        MyGame.Sample.Equipment.Weapon);\n    MyGame.Sample.Monster.addEquipped(builder, axe);\n    MyGame.Sample.Monster.addPath(builder, path);\n    var orc = MyGame.Sample.Monster.endMonster(builder);\n    ```\n\n=== \"Kotlin\"\n\n    ```kotlin\n    // Serialize a name for our monster, called \"Orc\".\n    val name = builder.createString(\"Orc\")\n\n    // Create our monster using `startMonster()` and `endMonster()`.\n    Monster.startMonster(builder)\n    Monster.addPos(builder, Vec3.createVec3(builder, 1.0f, 2.0f, 3.0f))\n    Monster.addName(builder, name)\n    Monster.addColor(builder, Color.Red)\n    Monster.addHp(builder, 300.toShort())\n    Monster.addInventory(builder, inv)\n    Monster.addWeapons(builder, weapons)\n    Monster.addEquippedType(builder, Equipment.Weapon)\n    Monster.addEquipped(builder, axe)\n    Monster.addPath(builder, path)\n    val orc = Monster.endMonster(builder)\n    ```\n\n=== \"Lobster\"\n\n    ```lobster\n    // Name of the monster.\n    let name = builder.CreateString(\"Orc\")\n\n    let orc = MyGame_Sample_MonsterBuilder { b }\n        .start()\n        .add_pos(b.MyGame_Sample_CreateVec3(1.0, 2.0, 3.0))\n        .add_hp(300)\n        .add_name(name)\n        .add_inventory(inv)\n        .add_color(MyGame_Sample_Color_Red)\n        .add_weapons(weapons)\n        .add_equipped_type(MyGame_Sample_Equipment_Weapon)\n        .add_equipped(weapon_offsets[1])\n        .add_path(path)\n        .end()\n    ```\n\n=== \"Lua\"\n\n    ```lua\n    -- Serialize a name for our monster, called 'orc'\n    local name = builder:CreateString(\"Orc\")\n\n    -- Create our monster by using Start() andEnd()\n    monster.Start(builder)\n    monster.AddPos(builder, vec3.CreateVec3(builder, 1.0, 2.0, 3.0))\n    monster.AddHp(builder, 300)\n    monster.AddName(builder, name)\n    monster.AddInventory(builder, inv)\n    monster.AddColor(builder, color.Red)\n    monster.AddWeapons(builder, weapons)\n    monster.AddEquippedType(builder, equipment.Weapon)\n    monster.AddEquipped(builder, axe)\n    monster.AddPath(builder, path)\n    local orc = monster.End(builder)\n    ```\n\n=== \"PHP\"\n\n    ```php\n    // Serialize a name for our monster, called \"Orc\".\n    $name = $builder->createString(\"Orc\");\n\n        // Create our monster by using `StartMonster()` and `EndMonster()`.\n    \\MyGame\\Sample\\Monster::StartMonster($builder);\n    \\MyGame\\Sample\\Monster::AddPos($builder,\n        \\MyGame\\Sample\\Vec3::CreateVec3($builder, 1.0, 2.0, 3.0));\n    \\MyGame\\Sample\\Monster::AddHp($builder, 300);\n    \\MyGame\\Sample\\Monster::AddName($builder, $name);\n    \\MyGame\\Sample\\Monster::AddInventory($builder, $inv);\n    \\MyGame\\Sample\\Monster::AddColor($builder, \\MyGame\\Sample\\Color::Red);\n    \\MyGame\\Sample\\Monster::AddWeapons($builder, $weapons);\n    \\MyGame\\Sample\\Monster::AddEquippedType($builder,\n        \\MyGame\\Sample\\Equipment::Weapon);\n    \\MyGame\\Sample\\Monster::AddEquipped($builder, $axe);\n    \\MyGame\\Sample\\Monster::AddPath($builder, $path);\n    $orc = \\MyGame\\Sample\\Monster::EndMonster($builder);\n    ```\n\n=== \"Python\"\n\n    ```py\n    # Serialize a name for our monster, called \"Orc\".\n    name = builder.CreateString(\"Orc\")\n\n    # Create our monster by using `Monster.Start()` and `Monster.End()`.\n    MyGame.Sample.Monster.Start(builder)\n    MyGame.Sample.Monster.AddPos(builder,\n        MyGame.Sample.Vec3.CreateVec3(builder, 1.0, 2.0, 3.0))\n    MyGame.Sample.Monster.AddHp(builder, 300)\n    MyGame.Sample.Monster.AddName(builder, name)\n    MyGame.Sample.Monster.AddInventory(builder, inv)\n    MyGame.Sample.Monster.AddColor(builder,\n                                            MyGame.Sample.Color.Color().Red)\n    MyGame.Sample.Monster.AddWeapons(builder, weapons)\n    MyGame.Sample.Monster.AddEquippedType(\n        builder, MyGame.Sample.Equipment.Equipment().Weapon)\n    MyGame.Sample.Monster.AddEquipped(builder, axe)\n    MyGame.Sample.Monster.AddPath(builder, path)\n    orc = MyGame.Sample.Monster.End(builder)\n    ```\n\n=== \"Rust\"\n\n    ```rust\n    // Name of the Monster.\n    let name = builder.create_string(\"Orc\");\n\n    // Create the monster using the `Monster::create` helper function. This\n    // function accepts a `MonsterArgs` struct, which supplies all of the data\n    // needed to build a `Monster`. To supply empty/default fields, just use the\n    // Rust built-in `Default::default()` function, as demonstrated below.\n    let orc = Monster::create(&mut builder, &MonsterArgs{\n        pos: Some(&Vec3::new(1.0f32, 2.0f32, 3.0f32)),\n        mana: 150,\n        hp: 80,\n        name: Some(name),\n        inventory: Some(inventory),\n        color: Color::Red,\n        weapons: Some(weapons),\n        equipped_type: Equipment::Weapon,\n        equipped: Some(axe.as_union_value()),\n        path: Some(path),\n        ..Default::default()\n    });\n    ```\n\n=== \"Swift\"\n\n    ```swift\n    // Name of the Monster.\n    let name = builder.create(string: \"Orc\")\n\n    let orc = Monster.createMonster(\n        &builder,\n        pos: MyGame_Sample_Vec3(x: 1, y: 2, z: 3),\n        hp: 300,\n        nameOffset: name,\n        inventoryVectorOffset: inventoryOffset,\n        color: .red,\n        weaponsVectorOffset: weaponsOffset,\n        equippedType: .weapon,\n        equippedOffset: axe)\n    ```\n\n=== \"TypeScript\"\n\n    ```ts\n    // Serialize a name for our monster, called 'Orc'.\n    let name = builder.createString('Orc');\n\n    // Create our monster by using `startMonster()` and `endMonster()`.\n    MyGame.Sample.Monster.startMonster(builder);\n    MyGame.Sample.Monster.addPos(builder,\n        MyGame.Sample.Vec3.createVec3(builder, 1.0, 2.0, 3.0));\n    MyGame.Sample.Monster.addHp(builder, 300);\n    MyGame.Sample.Monster.addColor(builder, MyGame.Sample.Color.Red)\n    MyGame.Sample.Monster.addName(builder, name);\n    MyGame.Sample.Monster.addInventory(builder, inv);\n    MyGame.Sample.Monster.addWeapons(builder, weapons);\n    MyGame.Sample.Monster.addEquippedType(builder,\n        MyGame.Sample.Equipment.Weapon);\n    MyGame.Sample.Monster.addEquipped(builder, axe);\n    MyGame.Sample.Monster.addPath(builder, path);\n    let orc = MyGame.Sample.Monster.endMonster(builder);\n    ```\n\n\n### Finishing\n\nAt this point, we have serialized a `Monster` we've named \"orc\" to the\nflatbuffer and have its offset. The `root_type` of the schema is also a\n`Monster`, so we have everything we need to finish the serialization step.\n\nThis is done by calling the appropriate `finish` method on the Builder, passing\nin the orc offset to indicate this `table` is the \"entry\" point when\ndeserializing the buffer later.\n\n=== \"C++\"\n\n    ```c++\n    // Call `Finish()` to instruct the builder that this monster is complete.\n    // You could also call `FinishMonsterBuffer(builder, orc);`\n    builder.Finish(orc);\n    ```\n\n=== \"C\"\n\n    ```c\n    // Because we used `Monster_create_as_root`, we do not need a `finish` call\n    // in C.\n    ```\n\n=== \"C#\"\n\n    ```c#\n    // Call `Finish()` to instruct the builder that this monster is complete.\n    // You could also call `Monster.FinishMonsterBuffer(builder, orc);`\n    builder.Finish(orc.Value);\n    ```\n\n=== \"Dart\"\n\n    ```dart\n    // Call `finish()` to instruct the builder that this monster is complete.\n    // See the next code section, as in Dart `finish` will also return the byte\n    // array.\n    ```\n\n=== \"Go\"\n\n    ```go\n    // Call `Finish()` to instruct the builder that this monster is complete.\n    builder.Finish(orc)\n    ```\n\n=== \"Java\"\n\n    ```java\n    // Call `finish()` to instruct the builder that this monster is complete.\n    builder.finish(orc);\n    ```\n\n=== \"JavaScript\"\n\n    ```javascript\n    // Call `finish()` to instruct the builder that this monster is complete.\n    builder.finish(orc);\n    ```\n\n=== \"Kotlin\"\n\n    ```kotlin\n    // Call `finish()` to instruct the builder that this monster is complete.\n    builder.finish(orc) ;\n    ```\n\n=== \"Lobster\"\n\n    ```lobster\n    // Call `Finish()` to instruct the builder that this monster is complete.\n    builder.Finish(orc)\n    ```\n\n=== \"Lua\"\n\n    ```lua\n    -- Call 'Finish()' to instruct the builder that this monster is complete.\n    builder:Finish(orc)\n    ```\n\n=== \"PHP\"\n\n    ```php\n    // Call `finish()` to instruct the builder that this monster is complete.\n    $builder->finish($orc);\n    ```\n\n=== \"Python\"\n\n    ```py\n    # Call `Finish()` to instruct the builder that this monster is complete.\n    builder.Finish(orc)\n    ```\n\n=== \"Rust\"\n\n    ```rust\n    // Call `finish()` to instruct the builder that this monster is complete.\n    builder.finish(orc, None);\n    ```\n\n=== \"Swift\"\n\n    ```swift\n    // Call `finish()` to instruct the builder that this monster is complete.\n    builder.finish(offset: orc)\n    ```\n\n=== \"TypeScript\"\n\n    ```ts\n    // Call `finish()` to instruct the builder that this monster is complete.\n    builder.finish(orc);\n    ```\n\n\nOnce you finish a Builder, you can no longer serialize more data to it.\n\n#### Buffer Access\n\nThe flatbuffer is now ready to be stored somewhere, sent over the network,\ncompressed, or whatever you would like to do with it. You access the raw buffer\nlike so:\n\n=== \"C++\"\n\n    ```c++\n    // This must be called after `Finish()`.\n    uint8_t *buf = builder.GetBufferPointer();\n\n    // Returns the size of the buffer that `GetBufferPointer()` points to.\n    int size = builder.GetSize();\n    ```\n\n=== \"C\"\n\n    ```c\n    uint8_t *buf;\n    size_t size;\n\n    // Allocate and extract a readable buffer from internal builder heap.\n    // The returned buffer must be deallocated using `free`.\n    // NOTE: Finalizing the buffer does NOT change the builder, it\n    // just creates a snapshot of the builder content.\n    buf = flatcc_builder_finalize_buffer(B, &size);\n    // use buf\n    free(buf);\n\n    // Optionally reset builder to reuse builder without deallocating\n    // internal stack and heap.\n    flatcc_builder_reset(B);\n    // build next buffer.\n    // ...\n\n    // Cleanup.\n    flatcc_builder_clear(B);\n    ```\n\n=== \"C#\"\n\n    ```c#\n    // This must be called after `Finish()`.\n    //\n    // The data in this ByteBuffer does NOT start at 0, but at buf.Position.\n    // The end of the data is marked by buf.Length, so the size is\n    // buf.Length - buf.Position.\n    FlatBuffers.ByteBuffer dataBuffer = builder.DataBuffer;\n\n    // Alternatively this copies the above data out of the ByteBuffer for you:\n    byte[] buf = builder.SizedByteArray();\n    ```\n\n=== \"Dart\"\n\n    ```dart\n    final Uint8List buf = builder.finish(orc);\n    ```\n\n=== \"Go\"\n\n    ```go\n    // This must be called after `Finish()`.\n    buf := builder.FinishedBytes() // Of type `byte[]`.\n    ```\n\n=== \"Java\"\n\n    ```java\n    // This must be called after `finish()`.\n    java.nio.ByteBuffer buf = builder.dataBuffer();\n    // The data in this ByteBuffer does NOT start at 0, but at buf.position().\n    // The number of bytes is buf.remaining().\n\n    // Alternatively this copies the above data out of the ByteBuffer for you:\n    byte[] buf = builder.sizedByteArray();\n    ```\n\n=== \"JavaScript\"\n\n    ```javascript\n    // This must be called after `finish()`.\n    var buf = builder.asUint8Array(); // Of type `Uint8Array`.\n    ```\n\n=== \"Kotlin\"\n\n    ```kotlin\n    // This must be called after `finish()`.\n    val buf = builder.dataBuffer()\n    // The data in this ByteBuffer does NOT start at 0, but at buf.position().\n    // The number of bytes is buf.remaining().\n\n    // Alternatively this copies the above data out of the ByteBuffer for you:\n    val buf = builder.sizedByteArray()\n    ```\n\n=== \"Lobster\"\n\n    ```lobster\n    // This must be called after `Finish()`.\n    let buf = builder.SizedCopy() // Of type `string`.\n    ```\n\n=== \"Lua\"\n\n    ```lua\n    local bufAsString = builder:Output()\n    ```\n\n=== \"PHP\"\n\n    ```php\n    // This must be called after `finish()`.\n    $buf = $builder->dataBuffer(); // Of type `Google\\FlatBuffers\\ByteBuffer`\n    // The data in this ByteBuffer does NOT start at 0, but at\n    // buf->getPosition().\n    // The end of the data is marked by buf->capacity(), so the size is\n    // buf->capacity() - buf->getPosition().\n    ```\n\n=== \"Python\"\n\n    ```py\n    # This must be called after `Finish()`.\n    buf = builder.Output() // Of type `bytearray`.\n    ```\n\n=== \"Rust\"\n\n    ```rust\n    // This must be called after `finish()`.\n    // `finished_data` returns a byte slice.\n    let buf = builder.finished_data(); // Of type `&[u8]`\n    ```\n\n=== \"Swift\"\n\n    ```swift\n    // This must be called after `finish()`.\n    // `sizedByteArray` returns the finished buf of type [UInt8].\n    let buf = builder.sizedByteArray\n    // or you can use to get an object of type Data\n    let bufData = ByteBuffer(data: builder.data)\n    // or\n    let buf = builder.sizedBuffer\n    ```\n\n=== \"TypeScript\"\n\n    ```ts\n    // This must be called after `finish()`.\n    let buf = builder.asUint8Array(); // Of type `Uint8Array`.\n    ```\n\n\nNow you can write the bytes to a file or send them over the network. The buffer\nstays valid until the Builder is cleared or destroyed.\n\nMake sure your file mode (or transfer protocol) is set to BINARY, and not TEXT.\nIf you try to transfer a flatbuffer in TEXT mode, the buffer will be corrupted\nand be hard to diagnose.\n\n## Deserialization\n\nDeserialization is a bit of a misnomer, since FlatBuffers doesn't deserialize\nthe whole buffer when accessed. It just \"decodes\" the data that is requested,\nleaving all the other data untouched. It is up to the application to decide if\nthe data is copied out or even read in the first place. However, we continue to\nuse the word `deserialize` to mean accessing data from a binary flatbuffer.\n\nNow that we have successfully create an orc FlatBuffer, the data can be saved,\nsent over a network, etc. At some point, the buffer will be accessed to obtain\nthe underlying data.\n\nThe same application setup used for serialization is needed for deserialization\n(see [application integration](#application-integration)).\n\n### Root Access\n\nAll access to the data in the flatbuffer must first go through the root object.\nThere is only one root object per flatbuffer. The generated code provides\nfunctions to get the root object given the buffer.\n\n=== \"C++\"\n\n    ```c++\n    uint8_t *buffer_pointer = /* the data you just read */;\n\n    // Get a view to the root object inside the buffer.\n    Monster monster = GetMonster(buffer_pointer);\n    ```\n\n=== \"C\"\n\n    ```c\n    // Note that we use the `table_t` suffix when reading a table object\n    // as opposed to the `ref_t` suffix used during the construction of\n    // the buffer.\n    ns(Monster_table_t) monster = ns(Monster_as_root(buffer));\n\n    // Note: root object pointers are NOT the same as the `buffer` pointer.\n    ```\n\n=== \"C#\"\n\n    ```c#\n    byte[] bytes = /* the data you just read */\n\n    // Get a view to the root object inside the buffer.\n    Monster monster = Monster.GetRootAsMonster(new ByteBuffer(bytes));\n    ```\n\n=== \"Dart\"\n\n    ```dart\n    List<int> data = ... // the data, e.g. from file or network\n    // A generated factory constructor that will read the data.\n    myGame.Monster monster = new myGame.Monster(data);\n    ```\n\n=== \"Go\"\n\n    ```go\n    var buf []byte = /* the data you just read */\n\n    // Get an accessor to the root object inside the buffer.\n    monster := sample.GetRootAsMonster(buf, 0)\n\n    // Note: We use `0` for the offset here, which is typical for most buffers\n    // you would read. If you wanted to read from `builder.Bytes` directly, you\n    // would need to pass in the offset of `builder.Head()`, as the builder\n    // constructs the buffer backwards, so may not start at offset 0.\n    ```\n\n=== \"Java\"\n\n    ```java\n    byte[] bytes = /* the data you just read */\n    java.nio.ByteBuffer buf = java.nio.ByteBuffer.wrap(bytes);\n\n    // Get an accessor to the root object inside the buffer.\n    Monster monster = Monster.getRootAsMonster(buf);\n    ```\n\n=== \"JavaScript\"\n\n    ```javascript\n    // the data you just read, as a `Uint8Array`\n    // Note that the example here uses `readFileSync` from the built-in `fs`\n    // module, but other methods for accessing the file contents will also work.\n    var bytes = new Uint8Array(readFileSync('./monsterdata.bin'));\n\n    var buf = new flatbuffers.ByteBuffer(bytes);\n\n    // Get an accessor to the root object inside the buffer.\n    var monster = MyGame.Sample.Monster.getRootAsMonster(buf);\n    ```\n\n=== \"Kotlin\"\n\n    ```kotlin\n    val bytes = /* the data you just read */\n    val buf = java.nio.ByteBuffer.wrap(bytes)\n\n    // Get an accessor to the root object inside the buffer.\n    Monster monster = Monster.getRootAsMonster(buf)\n    ```\n\n=== \"Lobster\"\n\n    ```lobster\n    buf = /* the data you just read, in a string */\n\n    // Get an accessor to the root object inside the buffer.\n    let monster = MyGame_Sample_GetRootAsMonster(buf)\n    ```\n\n=== \"Lua\"\n\n    ```lua\n    local bufAsString =   -- The data you just read in\n\n    -- Convert the string representation into binary array Lua structure\n    local buf = flatbuffers.binaryArray.New(bufAsString)\n\n    -- Get an accessor to the root object insert the buffer\n    local mon = monster.GetRootAsMonster(buf, 0)\n    ```\n\n=== \"PHP\"\n\n    ```php\n    $bytes = /* the data you just read, in a string */\n    $buf = Google\\FlatBuffers\\ByteBuffer::wrap($bytes);\n\n    // Get an accessor to the root object inside the buffer.\n    $monster = \\MyGame\\Sample\\Monster::GetRootAsMonster($buf);\n    ```\n\n=== \"Python\"\n\n    ```py\n    buf = /* the data you just read, in an object of type \"bytearray\" */\n\n    # Get an accessor to the root object inside the buffer.\n    monster = MyGame.Sample.Monster.Monster.GetRootAs(buf, 0)\n\n    # Note: We use `0` for the offset here, which is typical for most buffers\n    # you would read.  If you wanted to read from the `builder.Bytes` directly,\n    # you would need to pass in the offset of `builder.Head()`, as the builder\n    # constructs the buffer backwards, so may not start at offset 0.\n    ```\n\n=== \"Rust\"\n\n    ```rust\n    let buf = /* the data you just read, in a &[u8] */\n\n    // Get an accessor to the root object inside the buffer.\n    let monster = root_as_monster(buf).unwrap();\n    ```\n\n=== \"Swift\"\n\n    ```swift\n    // create a ByteBuffer(:) from an [UInt8] or Data()\n    var buf = // Get your data\n    // Get an accessor to the root object inside the buffer.\n    let monster: Monster = try! getCheckedRoot(byteBuffer: &byteBuffer)\n    // let monster: Monster = getRoot(byteBuffer: &byteBuffer)\n    ```\n\n=== \"TypeScript\"\n\n    ```ts\n    // the data you just read, as a `Uint8Array`.\n    // Note that the example here uses `readFileSync` from the built-in `fs`\n    // module, but other methods for accessing the file contents will also work.\n    let bytes = new Uint8Array(readFileSync('./monsterdata.bin'));\n\n    let buf = new flatbuffers.ByteBuffer(bytes);\n\n    // Get an accessor to the root object inside the buffer.\n    let monster = MyGame.Sample.Monster.getRootAsMonster(buf);\n    ```\n\n\nAgain, make sure you read the bytes in BINARY mode, otherwise the buffer may be\ncorrupted.\n\nIn most languages, the returned object is just a \"view\" of the data with helpful\naccessors. Data is typically not copied out of the backing buffer. This also\nmeans the backing buffer must remain alive for the duration of the views.\n\n### Table Access\n\nIf you look in the generated files emitted by `flatc`, you will see it generated\n, for each `table`, accessors of all its non-`deprecated` fields. For example,\nsome of the accessors of the `Monster` root table would look like:\n\n=== \"C++\"\n\n    ```c++\n    auto hp = monster->hp();\n    auto mana = monster->mana();\n    auto name = monster->name()->c_str();\n    ```\n\n=== \"C\"\n\n    ```c\n    uint16_t hp = ns(Monster_hp(monster));\n    uint16_t mana = ns(Monster_mana(monster));\n    flatbuffers_string_t name = ns(Monster_name(monster));\n    ```\n\n=== \"C#\"\n\n    ```c#\n    // For C#, unlike most other languages support by FlatBuffers, most values\n    // (except for vectors and unions) are available as properties instead of\n    // accessor methods.\n    var hp = monster.Hp;\n    var mana = monster.Mana;\n    var name = monster.Name;\n    ```\n\n=== \"Dart\"\n\n    ```dart\n    // For Dart, unlike other languages support by FlatBuffers, most values\n    // are available as properties instead of accessor methods.\n    var hp = monster.hp;\n    var mana = monster.mana;\n    var name = monster.name;\n    ```\n\n=== \"Go\"\n\n    ```go\n    hp := monster.Hp()\n    mana := monster.Mana()\n    name := string(monster.Name()) // Note: `monster.Name()` returns a byte[].\n    ```\n\n=== \"Java\"\n\n    ```java\n    short hp = monster.hp();\n    short mana = monster.mana();\n    String name = monster.name();\n    ```\n\n=== \"JavaScript\"\n\n    ```javascript\n    var hp = monster.hp();\n    var mana = monster.mana();\n    var name = monster.name();\n    ```\n\n=== \"Kotlin\"\n\n    ```kotlin\n    val hp = monster.hp\n    val mana = monster.mana\n    val name = monster.name\n    ```\n\n=== \"Lobster\"\n\n    ```lobster\n    let hp = monster.hp\n    let mana = monster.mana\n    let name = monster.name\n    ```\n\n=== \"Lua\"\n\n    ```lua\n    local hp = mon:Hp()\n    local mana = mon:Mana()\n    local name = mon:Name()\n    ```\n\n=== \"PHP\"\n\n    ```php\n    $hp = $monster->getHp();\n    $mana = $monster->getMana();\n    $name = monster->getName();\n    ```\n\n=== \"Python\"\n\n    ```py\n    hp = monster.Hp()\n    mana = monster.Mana()\n    name = monster.Name()\n    ```\n\n=== \"Rust\"\n\n    ```rust\n    // Get and test some scalar types from the FlatBuffer.\n    let hp = monster.hp();\n    let mana = monster.mana();\n    let name = monster.name();\n    ```\n\n=== \"Swift\"\n\n    ```swift\n    let hp = monster.hp\n    let mana = monster.mana\n    let name = monster.name // returns an optional string\n    ```\n\n=== \"TypeScript\"\n\n    ```ts\n    let hp = monster.hp();\n    let mana = monster.mana();\n    let name = monster.name();\n    ```\n\n\nThese accessors should hold the values `300`, `150`, and `\"Orc\"` respectively.\n\nThe default value of `150` wasn't stored in the `mana` field, but we are still\nable to retrieve it. That is because the generated accessors return a hard-coded\ndefault value when it doesn't find the value in the buffer.\n\n#### Nested Object Access\n\nAccessing nested objects is very similar, with the nested field pointing to\nanother object type. Be careful, the field could be `null` if not present.\n\nFor example, accessing the `pos` `struct`, which is type `Vec3` you would do:\n\n=== \"C++\"\n\n    ```c++\n    auto pos = monster->pos();\n    auto x = pos->x();\n    auto y = pos->y();\n    auto z = pos->z();\n    ```\n\n=== \"C\"\n\n    ```c\n    ns(Vec3_struct_t) pos = ns(Monster_pos(monster));\n    float x = ns(Vec3_x(pos));\n    float y = ns(Vec3_y(pos));\n    float z = ns(Vec3_z(pos));\n    ```\n\n=== \"C#\"\n\n    ```c#\n    var pos = monster.Pos.Value;\n    var x = pos.X;\n    var y = pos.Y;\n    var z = pos.Z;\n    ```\n\n=== \"Dart\"\n\n    ```dart\n    myGame.Vec3 pos = monster.pos;\n    double x = pos.x;\n    double y = pos.y;\n    double z = pos.z;\n    ```\n\n=== \"Go\"\n\n    ```go\n    pos := monster.Pos(nil)\n    x := pos.X()\n    y := pos.Y()\n    z := pos.Z()\n\n    // Note: Whenever you access a new object, like in `Pos()`, a new temporary\n    // accessor object gets created. If your code is very performance sensitive,\n    // you can pass in a pointer to an existing `Vec3` instead of `nil`. This\n    // allows you to reuse it across many calls to reduce the amount of object\n    // allocation/garbage collection.\n    ```\n\n=== \"Java\"\n\n    ```java\n    Vec3 pos = monster.pos();\n    float x = pos.x();\n    float y = pos.y();\n    float z = pos.z();\n    ```\n\n=== \"JavaScript\"\n\n    ```javascript\n    var pos = monster.pos();\n    var x = pos.x();\n    var y = pos.y();\n    var z = pos.z();\n    ```\n\n=== \"Kotlin\"\n\n    ```kotlin\n    val pos = monster.pos!!\n    val x = pos.x\n    val y = pos.y\n    val z = pos.z\n    ```\n\n=== \"Lobster\"\n\n    ```lobster\n    let pos = monster.pos\n    let x = pos.x\n    let y = pos.y\n    let z = pos.z\n    ```\n\n=== \"Lua\"\n\n    ```lua\n    local pos = mon:Pos()\n    local x = pos:X()\n    local y = pos:Y()\n    local z = pos:Z()\n    ```\n\n=== \"PHP\"\n\n    ```php\n    $pos = $monster->getPos();\n    $x = $pos->getX();\n    $y = $pos->getY();\n    $z = $pos->getZ();\n    ```\n\n=== \"Python\"\n\n    ```py\n    pos = monster.Pos()\n    x = pos.X()\n    y = pos.Y()\n    z = pos.Z()\n    ```\n\n=== \"Rust\"\n\n    ```rust\n    let pos = monster.pos().unwrap();\n    let x = pos.x();\n    let y = pos.y();\n    let z = pos.z();\n    ```\n\n=== \"Swift\"\n\n    ```swift\n    let pos = monster.pos\n    let x = pos.x\n    let y = pos.y\n    let z = pos.z\n    ```\n\n=== \"TypeScript\"\n\n    ```ts\n    let pos = monster.pos();\n    let x = pos.x();\n    let y = pos.y();\n    let z = pos.z();\n    ```\n\n\nWhere `x`, `y`, and `z` will contain `1.0`, `2.0`, and `3.0` respectively.\n\n### Vector Access\n\nSimilarly, we can access elements of the `inventory` `vector` by indexing it.\nYou can also iterate over the length of the vector.\n\n=== \"C++\"\n\n    ```c++\n    flatbuffers::Vector<unsigned char> inv = monster->inventory();\n    auto inv_len = inv->size();\n    auto third_item = inv->Get(2);\n    ```\n\n=== \"C\"\n\n    ```c\n    // If `inv` hasn't been set, it will be null. It is valid get\n    // the length of null which will be 0, useful for iteration.\n    flatbuffers_uint8_vec_t inv = ns(Monster_inventory(monster));\n    size_t inv_len = flatbuffers_uint8_vec_len(inv);\n    ```\n\n=== \"C#\"\n\n    ```c#\n    int invLength = monster.InventoryLength;\n    var thirdItem = monster.Inventory(2);\n    ```\n\n=== \"Dart\"\n\n    ```dart\n    int invLength = monster.inventory.length;\n    var thirdItem = monster.inventory[2];\n    ```\n\n=== \"Go\"\n\n    ```go\n    invLength := monster.InventoryLength()\n    thirdItem := monster.Inventory(2)\n    ```\n\n=== \"Java\"\n\n    ```java\n    int invLength = monster.inventoryLength();\n    byte thirdItem = monster.inventory(2);\n    ```\n\n=== \"JavaScript\"\n\n    ```javascript\n    var invLength = monster.inventoryLength();\n    var thirdItem = monster.inventory(2);\n    ```\n\n=== \"Kotlin\"\n\n    ```kotlin\n    val invLength = monster.inventoryLength\n    val thirdItem = monster.inventory(2)!!\n    ```\n\n=== \"Lobster\"\n\n    ```lobster\n    let inv_len = monster.inventory_length\n    let third_item = monster.inventory(2)\n    ```\n\n=== \"Lua\"\n\n    ```lua\n    local invLength = mon:InventoryLength()\n    local thirdItem = mon:Inventory(3) -- Lua is 1-based\n    ```\n\n=== \"PHP\"\n\n    ```php\n    $inv_len = $monster->getInventoryLength();\n    $third_item = $monster->getInventory(2);\n    ```\n\n=== \"Python\"\n\n    ```py\n    inv_len = monster.InventoryLength()\n    third_item = monster.Inventory(2)\n    ```\n\n=== \"Rust\"\n\n    ```rust\n    // Get and test an element from the `inventory` FlatBuffer's `vector`.\n    let inv = monster.inventory().unwrap();\n\n    // Note that this vector is returned as a slice, because direct access for\n    // this type, a `u8` vector, is safe on all platforms:\n    let third_item = inv[2];\n    ```\n\n=== \"Swift\"\n\n    ```swift\n    // Get a the count of objects in the vector\n    let count = monster.inventoryCount\n\n    // get item at index 4\n    let object = monster.inventory(at: 4)\n\n    // or you can fetch the entire array\n    let inv = monster.inventory\n    // inv[4] should equal object\n    ```\n\n=== \"TypeScript\"\n\n    ```ts\n    let invLength = monster.inventoryLength();\n    let thirdItem = monster.inventory(2);\n    ```\n\n\nFor vectors of tables, you can access the elements like any other vector, except\nyou need to handle the result as a FlatBuffer table. Here we iterate over the\n`weapons` vector that is houses `Weapon` `tables`.\n\n=== \"C++\"\n\n    ```c++\n    flatbuffers::Vector<Weapon> weapons = monster->weapons();\n    auto weapon_len = weapons->size();\n    auto second_weapon_name = weapons->Get(1)->name()->str();\n    auto second_weapon_damage = weapons->Get(1)->damage()\n    ```\n\n=== \"C\"\n\n    ```c\n    ns(Weapon_vec_t) weapons = ns(Monster_weapons(monster));\n    size_t weapons_len = ns(Weapon_vec_len(weapons));\n    // We can use `const char *` instead of `flatbuffers_string_t`.\n    const char *second_weapon_name =\n        ns(Weapon_name(ns(Weapon_vec_at(weapons, 1))));\n    uint16_t second_weapon_damage =\n        ns(Weapon_damage(ns(Weapon_vec_at(weapons, 1))));\n    ```\n\n=== \"C#\"\n\n    ```c#\n    int weaponsLength = monster.WeaponsLength;\n    var secondWeaponName = monster.Weapons(1).Name;\n    var secondWeaponDamage = monster.Weapons(1).Damage;\n    ```\n\n=== \"Dart\"\n\n    ```dart\n    int weaponsLength = monster.weapons.length;\n    var secondWeaponName = monster.weapons[1].name;\n    var secondWeaponDamage = monster.Weapons[1].damage;\n    ```\n\n=== \"Go\"\n\n    ```go\n    weaponLength := monster.WeaponsLength()\n    // We need a `sample.Weapon` to pass into `monster.Weapons()`\n    // to capture the output of the function.k\n    weapon := new(sample.Weapon)\n    if monster.Weapons(weapon, 1) {\n            secondWeaponName := weapon.Name()\n            secondWeaponDamage := weapon.Damage()\n    }\n    ```\n\n=== \"Java\"\n\n    ```java\n    int weaponsLength = monster.weaponsLength();\n    String secondWeaponName = monster.weapons(1).name();\n    short secondWeaponDamage = monster.weapons(1).damage();\n    ```\n\n=== \"JavaScript\"\n\n    ```javascript\n    var weaponsLength = monster.weaponsLength();\n    var secondWeaponName = monster.weapons(1).name();\n    var secondWeaponDamage = monster.weapons(1).damage();\n    ```\n\n=== \"Kotlin\"\n\n    ```kotlin\n    val weaponsLength = monster.weaponsLength\n    val secondWeaponName = monster.weapons(1)!!.name\n    val secondWeaponDamage = monster.weapons(1)!!.damage\n    ```\n\n=== \"Lobster\"\n\n    ```lobster\n    let weapons_length = monster.weapons_length\n    let second_weapon_name = monster.weapons(1).name\n    let second_weapon_damage = monster.weapons(1).damage\n    ```\n\n=== \"Lua\"\n\n    ```lua\n    local weaponsLength = mon:WeaponsLength()\n    local secondWeaponName = mon:Weapon(2):Name()\n    local secondWeaponDamage = mon:Weapon(2):Damage()\n    ```\n\n=== \"PHP\"\n\n    ```php\n    $weapons_len = $monster->getWeaponsLength();\n    $second_weapon_name = $monster->getWeapons(1)->getName();\n    $second_weapon_damage = $monster->getWeapons(1)->getDamage();\n    ```\n\n=== \"Python\"\n\n    ```py\n    weapons_length = monster.WeaponsLength()\n    second_weapon_name = monster.Weapons(1).Name()\n    second_weapon_damage = monster.Weapons(1).Damage()\n    ```\n\n=== \"Rust\"\n\n    ```rust\n    // Get and test the `weapons` FlatBuffers's `vector`.\n    let weps = monster.weapons().unwrap();\n    let weps_len = weps.len();\n\n    let wep2 = weps.get(1);\n    let second_weapon_name = wep2.name();\n    let second_weapon_damage = wep2.damage();\n    ```\n\n=== \"Swift\"\n\n    ```swift\n    // Get the count of weapon objects\n    let wepsCount = monster.weaponsCount\n\n    let weapon2 = monster.weapons(at: 1)\n    let weaponName = weapon2.name\n    let weaponDmg = weapon2.damage\n    ```\n\n=== \"TypeScript\"\n\n    ```ts\n    let weaponsLength = monster.weaponsLength();\n    let secondWeaponName = monster.weapons(1).name();\n    let secondWeaponDamage = monster.weapons(1).damage();\n    ```\n\n\n### Union Access\n\nLastly , we can access our `equipped` `union` field. Just like when we created\nthe union, we need to get both parts of the union: the type and the data.\n\nWe can access the type to dynamically cast the data as needed (since the union\nonly stores a FlatBuffer `table`).\n\n=== \"C++\"\n\n    ```c++\n    auto union_type = monster.equipped_type();\n\n    if (union_type == Equipment_Weapon) {\n         // Requires `static_cast` to type `const Weapon*`.\n        auto weapon = static_cast<const Weapon*>(monster->equipped());\n\n        auto weapon_name = weapon->name()->str(); // \"Axe\"\n        auto weapon_damage = weapon->damage();    // 5\n    }\n    ```\n\n=== \"C\"\n\n    ```c\n    // Access union type field.\n    if (ns(Monster_equipped_type(monster)) == ns(Equipment_Weapon)) {\n        // Cast to appropriate type:\n        // C allows for silent void pointer assignment, so we need no\n        // explicit cast.\n        ns(Weapon_table_t) weapon = ns(Monster_equipped(monster));\n        const char *weapon_name = ns(Weapon_name(weapon)); // \"Axe\"\n        uint16_t weapon_damage = ns(Weapon_damage(weapon)); // 5\n    }\n    ```\n\n=== \"C#\"\n\n    ```c#\n    var unionType = monster.EquippedType;\n\n    if (unionType == Equipment.Weapon) {\n        var weapon = monster.Equipped<Weapon>().Value;\n\n        var weaponName = weapon.Name;     // \"Axe\"\n        var weaponDamage = weapon.Damage; // 5\n    }\n    ```\n\n=== \"Dart\"\n\n    ```dart\n    var unionType = monster.equippedType.value;\n\n    if (unionType == myGame.EquipmentTypeId.Weapon.value) {\n        myGame.Weapon weapon = mon.equipped as myGame.Weapon;\n\n        var weaponName = weapon.name;     // \"Axe\"\n        var weaponDamage = weapon.damage; // 5\n    }\n    ```\n\n=== \"Go\"\n\n    ```go\n    // We need a `flatbuffers.Table` to capture the output of the\n    // `monster.Equipped()` function.\n    unionTable := new(flatbuffers.Table)\n\n    if monster.Equipped(unionTable) {\n        unionType := monster.EquippedType()\n\n        if unionType == sample.EquipmentWeapon {\n            // Create a `sample.Weapon` object that can be initialized with the\n            // contents of the `flatbuffers.Table` (`unionTable`), which was\n            // populated by `monster.Equipped()`.\n            unionWeapon = new(sample.Weapon)\n            unionWeapon.Init(unionTable.Bytes, unionTable.Pos)\n\n            weaponName = unionWeapon.Name()\n            weaponDamage = unionWeapon.Damage()\n        }\n    }\n    ```\n\n=== \"Java\"\n\n    ```java\n    int unionType = monster.EquippedType();\n\n    if (unionType == Equipment.Weapon) {\n        // Requires an explicit cast to `Weapon`.\n        Weapon weapon = (Weapon)monster.equipped(new Weapon());\n\n        String weaponName = weapon.name();    // \"Axe\"\n        short weaponDamage = weapon.damage(); // 5\n    }\n    ```\n\n=== \"JavaScript\"\n\n    ```javascript\n    var unionType = monster.equippedType();\n\n    if (unionType == MyGame.Sample.Equipment.Weapon) {\n        // 'Axe'\n        var weaponName = monster.equipped(new MyGame.Sample.Weapon()).name();\n        // 5\n        var weaponDamage =\n            monster.equipped(new MyGame.Sample.Weapon()).damage();\n    }\n    ```\n\n=== \"Kotlin\"\n\n    ```kotlin\n    val unionType = monster.EquippedType\n\n    if (unionType == Equipment.Weapon) {\n        // Requires an explicit cast to `Weapon`.\n        val weapon = monster.equipped(Weapon()) as Weapon\n\n        val weaponName = weapon.name   // \"Axe\"\n        val weaponDamage = weapon.damage // 5\n    }\n    ```\n\n=== \"Lobster\"\n\n    ```lobster\n    union_type = monster.equipped_type\n\n    if union_type == MyGame_Sample_Equipment_Weapon:\n        // `monster.equipped_as_Weapon` returns a FlatBuffer handle much like\n        // normal table fields, but this is only valid to call if we already\n        // know it is the correct type.\n        let union_weapon = monster.equipped_as_Weapon\n\n        let weapon_name = union_weapon.name     // \"Axe\"\n        let weapon_damage = union_weapon.damage // 5\n    ```\n\n=== \"Lua\"\n\n    ```lua\n    local unionType = mon:EquippedType()\n\n    if unionType == equipment.Weapon then\n        local unionWeapon = weapon.New()\n        unionWeapon:Init(mon:Equipped().bytes, mon:Equipped().pos)\n\n        local weaponName = unionWeapon:Name()     -- 'Axe'\n        local weaponDamage = unionWeapon:Damage() -- 5\n    end\n    ```\n\n=== \"PHP\"\n\n    ```php\n    $union_type = $monster->getEquippedType();\n\n    if ($union_type == \\MyGame\\Sample\\Equipment::Weapon) {\n        // \"Axe\"\n        $weapon_name =\n            $monster->getEquipped(new \\MyGame\\Sample\\Weapon())->getName();\n        // 5\n        $weapon_damage =\n            $monster->getEquipped(new \\MyGame\\Sample\\Weapon())->getDamage();\n    }\n    ```\n\n=== \"Python\"\n\n    ```py\n    union_type = monster.EquippedType()\n\n    if union_type == MyGame.Sample.Equipment.Equipment().Weapon:\n        # `monster.Equipped()` returns a `flatbuffers.Table`, which can be used\n        # to initialize a `MyGame.Sample.Weapon.Weapon()`.\n        union_weapon = MyGame.Sample.Weapon.Weapon()\n        union_weapon.Init(monster.Equipped().Bytes, monster.Equipped().Pos)\n\n        weapon_name = union_weapon.Name()     // 'Axe'\n        weapon_damage = union_weapon.Damage() // 5\n    ```\n\n=== \"Rust\"\n\n    ```rust\n    // Get and test the `Equipment` union (`equipped` field).\n    // `equipped_as_weapon` returns a FlatBuffer handle much like normal table\n    // fields, but this will return `None` if the union is not actually of that\n    // type.\n    if monster.equipped_type() == Equipment::Weapon {\n        let equipped = monster.equipped_as_weapon().unwrap();\n        let weapon_name = equipped.name();\n        let weapon_damage = equipped.damage();\n    ```\n\n=== \"Swift\"\n\n    ```swift\n    // Get and check if the monster has an equipped item\n    if monster.equippedType == .weapon {\n        let _weapon = monster.equipped(type: Weapon.self)\n        let name = _weapon.name // should return \"Axe\"\n        let dmg = _weapon.damage // should return 5\n    }\n    ```\n\n=== \"TypeScript\"\n\n    ```ts\n    let unionType = monster.equippedType();\n\n    if (unionType == MyGame.Sample.Equipment.Weapon) {\n        // 'Axe'\n        let weaponName = monster.equipped(new MyGame.Sample.Weapon()).name();\n        // 5\n        let weaponDamage = monster.equipped(new MyGame.Sample.Weapon()).damage();\n    }\n    ```\n"
  },
  {
    "path": "docs/source/white_paper.md",
    "content": "FlatBuffers white paper    {#flatbuffers_white_paper}\n=======================\n\nThis document tries to shed some light on to the \"why\" of FlatBuffers, a\nnew serialization library.\n\n## Motivation\n\nBack in the good old days, performance was all about instructions and\ncycles. Nowadays, processing units have run so far ahead of the memory\nsubsystem, that making an efficient application should start and finish\nwith thinking about memory. How much you use of it. How you lay it out\nand access it. How you allocate it. When you copy it.\n\nSerialization is a pervasive activity in a lot programs, and a common\nsource of memory inefficiency, with lots of temporary data structures\nneeded to parse and represent data, and inefficient allocation patterns\nand locality.\n\nIf it would be possible to do serialization with no temporary objects,\nno additional allocation, no copying, and good locality, this could be\nof great value. The reason serialization systems usually don't manage\nthis is because it goes counter to forwards/backwards compatibility, and\nplatform specifics like endianness and alignment.\n\nFlatBuffers is what you get if you try anyway.\n\nIn particular, FlatBuffers focus is on mobile hardware (where memory\nsize and memory bandwidth is even more constrained than on desktop\nhardware), and applications that have the highest performance needs:\ngames.\n\n## FlatBuffers\n\n*This is a summary of FlatBuffers functionality, with some rationale.\nA more detailed description can be found in the FlatBuffers\ndocumentation.*\n\n### Summary\n\nA FlatBuffer is a binary buffer containing nested objects (structs,\ntables, vectors,..) organized using offsets so that the data can be\ntraversed in-place just like any pointer-based data structure. Unlike\nmost in-memory data structures however, it uses strict rules of\nalignment and endianness (always little) to ensure these buffers are\ncross platform. Additionally, for objects that are tables, FlatBuffers\nprovides forwards/backwards compatibility and general optionality of\nfields, to support most forms of format evolution.\n\nYou define your object types in a schema, which can then be compiled to\nC++ or Java for low to zero overhead reading & writing.\nOptionally, JSON data can be dynamically parsed into buffers.\n\n### Tables\n\nTables are the cornerstone of FlatBuffers, since format evolution is\nessential for most applications of serialization. Typically, dealing\nwith format changes is something that can be done transparently during\nthe parsing process of most serialization solutions out there.\nBut a FlatBuffer isn't parsed before it is accessed.\n\nTables get around this by using an extra indirection to access fields,\nthrough a *vtable*. Each table comes with a vtable (which may be shared\nbetween multiple tables with the same layout), and contains information\nwhere fields for this particular kind of instance of vtable are stored.\nThe vtable may also indicate that the field is not present (because this\nFlatBuffer was written with an older version of the software, or simply\nbecause the information was not necessary for this instance, or deemed\ndeprecated), in which case a default value is returned.\n\nTables have a low overhead in memory (since vtables are small and\nshared) and in access cost (an extra indirection), but provide great\nflexibility. Tables may even cost less memory than the equivalent\nstruct, since fields do not need to be stored when they are equal to\ntheir default.\n\nFlatBuffers additionally offers \"naked\" structs, which do not offer\nforwards/backwards compatibility, but can be even smaller (useful for\nvery small objects that are unlikely to change, like e.g. a coordinate\npair or a RGBA color).\n\n### Schemas\n\nWhile schemas reduce some generality (you can't just read any data\nwithout having its schema), they have a lot of upsides:\n\n-   Most information about the format can be factored into the generated\n    code, reducing memory needed to store data, and time to access it.\n\n-   The strong typing of the data definitions means less error\n    checking/handling at runtime (less can go wrong).\n\n-   A schema enables us to access a buffer without parsing.\n\nFlatBuffer schemas are fairly similar to those of the incumbent,\nProtocol Buffers, and generally should be readable to those familiar\nwith the C family of languages. We chose to improve upon the features\noffered by .proto files in the following ways:\n\n-   Deprecation of fields instead of manual field id assignment.\n    Extending an object in a .proto means hunting for a free slot among\n    the numbers (preferring lower numbers since they have a more compact\n    representation). Besides being inconvenient, it also makes removing\n    fields problematic: you either have to keep them, not making it\n    obvious that this field shouldn't be read/written anymore, and still\n    generating accessors. Or you remove it, but now you risk that\n    there's still old data around that uses that field by the time\n    someone reuses that field id, with nasty consequences.\n\n-   Differentiating between tables and structs (see above). Effectively\n    all table fields are `optional`, and all struct fields are\n    `required`.\n\n-   Having a native vector type instead of `repeated`. This gives you a\n    length without having to collect all items, and in the case of\n    scalars provides for a more compact representation, and one that\n    guarantees adjacency.\n\n-   Having a native `union` type instead of using a series of `optional`\n    fields, all of which must be checked individually.\n\n-   Being able to define defaults for all scalars, instead of having to\n    deal with their optionality at each access.\n\n-   A parser that can deal with both schemas and data definitions (JSON\n    compatible) uniformly.\n\n<br>\n"
  },
  {
    "path": "eslint.config.mjs",
    "content": "import globals from \"globals\";\nimport pluginJs from \"@eslint/js\";\nimport tseslint from \"typescript-eslint\";\n\nexport default [\n  {files: [\"**/*.{js,mjs,cjs,ts}\"]},\n  {languageOptions: { globals: {...globals.browser, ...globals.node} }},\n  pluginJs.configs.recommended,\n  ...tseslint.configs.recommended,\n];\n"
  },
  {
    "path": "examples/go-echo/README.md",
    "content": "# Go Echo Example\n\nA simple example demonstrating how to send flatbuffers over the network in Go.\n\n## Generate flatbuffer code\n\n```\nflatc -g --gen-object-api --go-module-name echo hero.fbs net.fbs\n```\n\n## Running example\n\n1. Run go mod tidy to get dependencies\n```\ngo mod tidy\n```\n\n2. Start a server\n```\ngo run server/server.go\n```\n\n3. Run the client in another terminal\n```\ngo run client/client.go\n```\n\n"
  },
  {
    "path": "examples/go-echo/client/client.go",
    "content": "package main\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\n\t\"echo/hero\"\n\t\"echo/net\"\n\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n)\n\nfunc RequestBody() *bytes.Reader {\n\tb := flatbuffers.NewBuilder(0)\n\tr := net.RequestT{Player: &hero.WarriorT{Name: \"Krull\", Hp: 100}}\n\tb.Finish(r.Pack(b))\n\treturn bytes.NewReader(b.FinishedBytes())\n}\n\nfunc ReadResponse(r *http.Response) {\n\tbody, err := ioutil.ReadAll(r.Body)\n\tif err != nil {\n\t\tfmt.Printf(\"Unable to read request body: %v\\n\", err)\n\t\treturn\n\t}\n\n\tres := net.GetRootAsResponse(body, 0)\n\tplayer := res.Player(nil)\n\n\tfmt.Printf(\"Got response (name: %v, hp: %v)\\n\", string(player.Name()), player.Hp())\n}\n\nfunc main() {\n\tbody := RequestBody()\n\treq, err := http.NewRequest(\"POST\", \"http://localhost:8080/echo\", body)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\tclient := http.DefaultClient\n\tresp, err := client.Do(req)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\tReadResponse(resp)\n}\n"
  },
  {
    "path": "examples/go-echo/go.mod",
    "content": "module echo\n\ngo 1.19\n\nrequire github.com/google/flatbuffers v22.10.26+incompatible\n"
  },
  {
    "path": "examples/go-echo/hero/Warrior.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage hero\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n)\n\ntype WarriorT struct {\n\tName string `json:\"name\"`\n\tHp   uint32 `json:\"hp\"`\n}\n\nfunc (t *WarriorT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\tif t == nil {\n\t\treturn 0\n\t}\n\tnameOffset := flatbuffers.UOffsetT(0)\n\tif t.Name != \"\" {\n\t\tnameOffset = builder.CreateString(t.Name)\n\t}\n\tWarriorStart(builder)\n\tWarriorAddName(builder, nameOffset)\n\tWarriorAddHp(builder, t.Hp)\n\treturn WarriorEnd(builder)\n}\n\nfunc (rcv *Warrior) UnPackTo(t *WarriorT) {\n\tt.Name = string(rcv.Name())\n\tt.Hp = rcv.Hp()\n}\n\nfunc (rcv *Warrior) UnPack() *WarriorT {\n\tif rcv == nil {\n\t\treturn nil\n\t}\n\tt := &WarriorT{}\n\trcv.UnPackTo(t)\n\treturn t\n}\n\ntype Warrior struct {\n\t_tab flatbuffers.Table\n}\n\nfunc GetRootAsWarrior(buf []byte, offset flatbuffers.UOffsetT) *Warrior {\n\tn := flatbuffers.GetUOffsetT(buf[offset:])\n\tx := &Warrior{}\n\tx.Init(buf, n+offset)\n\treturn x\n}\n\nfunc GetSizePrefixedRootAsWarrior(buf []byte, offset flatbuffers.UOffsetT) *Warrior {\n\tn := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])\n\tx := &Warrior{}\n\tx.Init(buf, n+offset+flatbuffers.SizeUint32)\n\treturn x\n}\n\nfunc (rcv *Warrior) Init(buf []byte, i flatbuffers.UOffsetT) {\n\trcv._tab.Bytes = buf\n\trcv._tab.Pos = i\n}\n\nfunc (rcv *Warrior) Table() flatbuffers.Table {\n\treturn rcv._tab\n}\n\nfunc (rcv *Warrior) Name() []byte {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(4))\n\tif o != 0 {\n\t\treturn rcv._tab.ByteVector(o + rcv._tab.Pos)\n\t}\n\treturn nil\n}\n\nfunc (rcv *Warrior) Hp() uint32 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(6))\n\tif o != 0 {\n\t\treturn rcv._tab.GetUint32(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Warrior) MutateHp(n uint32) bool {\n\treturn rcv._tab.MutateUint32Slot(6, n)\n}\n\nfunc WarriorStart(builder *flatbuffers.Builder) {\n\tbuilder.StartObject(2)\n}\nfunc WarriorAddName(builder *flatbuffers.Builder, name flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(name), 0)\n}\nfunc WarriorAddHp(builder *flatbuffers.Builder, hp uint32) {\n\tbuilder.PrependUint32Slot(1, hp, 0)\n}\nfunc WarriorEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\treturn builder.EndObject()\n}\n"
  },
  {
    "path": "examples/go-echo/hero.fbs",
    "content": "namespace hero;\n\ntable Warrior {\n\tname: string;\n\thp: uint32;\n}\n"
  },
  {
    "path": "examples/go-echo/net/Request.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage net\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n\n\thero \"echo/hero\"\n)\n\ntype RequestT struct {\n\tPlayer *hero.WarriorT `json:\"player\"`\n}\n\nfunc (t *RequestT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\tif t == nil {\n\t\treturn 0\n\t}\n\tplayerOffset := t.Player.Pack(builder)\n\tRequestStart(builder)\n\tRequestAddPlayer(builder, playerOffset)\n\treturn RequestEnd(builder)\n}\n\nfunc (rcv *Request) UnPackTo(t *RequestT) {\n\tt.Player = rcv.Player(nil).UnPack()\n}\n\nfunc (rcv *Request) UnPack() *RequestT {\n\tif rcv == nil {\n\t\treturn nil\n\t}\n\tt := &RequestT{}\n\trcv.UnPackTo(t)\n\treturn t\n}\n\ntype Request struct {\n\t_tab flatbuffers.Table\n}\n\nfunc GetRootAsRequest(buf []byte, offset flatbuffers.UOffsetT) *Request {\n\tn := flatbuffers.GetUOffsetT(buf[offset:])\n\tx := &Request{}\n\tx.Init(buf, n+offset)\n\treturn x\n}\n\nfunc GetSizePrefixedRootAsRequest(buf []byte, offset flatbuffers.UOffsetT) *Request {\n\tn := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])\n\tx := &Request{}\n\tx.Init(buf, n+offset+flatbuffers.SizeUint32)\n\treturn x\n}\n\nfunc (rcv *Request) Init(buf []byte, i flatbuffers.UOffsetT) {\n\trcv._tab.Bytes = buf\n\trcv._tab.Pos = i\n}\n\nfunc (rcv *Request) Table() flatbuffers.Table {\n\treturn rcv._tab\n}\n\nfunc (rcv *Request) Player(obj *hero.Warrior) *hero.Warrior {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(4))\n\tif o != 0 {\n\t\tx := rcv._tab.Indirect(o + rcv._tab.Pos)\n\t\tif obj == nil {\n\t\t\tobj = new(hero.Warrior)\n\t\t}\n\t\tobj.Init(rcv._tab.Bytes, x)\n\t\treturn obj\n\t}\n\treturn nil\n}\n\nfunc RequestStart(builder *flatbuffers.Builder) {\n\tbuilder.StartObject(1)\n}\nfunc RequestAddPlayer(builder *flatbuffers.Builder, player flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(player), 0)\n}\nfunc RequestEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\treturn builder.EndObject()\n}\n"
  },
  {
    "path": "examples/go-echo/net/Response.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage net\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n\n\thero \"echo/hero\"\n)\n\ntype ResponseT struct {\n\tPlayer *hero.WarriorT `json:\"player\"`\n}\n\nfunc (t *ResponseT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\tif t == nil {\n\t\treturn 0\n\t}\n\tplayerOffset := t.Player.Pack(builder)\n\tResponseStart(builder)\n\tResponseAddPlayer(builder, playerOffset)\n\treturn ResponseEnd(builder)\n}\n\nfunc (rcv *Response) UnPackTo(t *ResponseT) {\n\tt.Player = rcv.Player(nil).UnPack()\n}\n\nfunc (rcv *Response) UnPack() *ResponseT {\n\tif rcv == nil {\n\t\treturn nil\n\t}\n\tt := &ResponseT{}\n\trcv.UnPackTo(t)\n\treturn t\n}\n\ntype Response struct {\n\t_tab flatbuffers.Table\n}\n\nfunc GetRootAsResponse(buf []byte, offset flatbuffers.UOffsetT) *Response {\n\tn := flatbuffers.GetUOffsetT(buf[offset:])\n\tx := &Response{}\n\tx.Init(buf, n+offset)\n\treturn x\n}\n\nfunc GetSizePrefixedRootAsResponse(buf []byte, offset flatbuffers.UOffsetT) *Response {\n\tn := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])\n\tx := &Response{}\n\tx.Init(buf, n+offset+flatbuffers.SizeUint32)\n\treturn x\n}\n\nfunc (rcv *Response) Init(buf []byte, i flatbuffers.UOffsetT) {\n\trcv._tab.Bytes = buf\n\trcv._tab.Pos = i\n}\n\nfunc (rcv *Response) Table() flatbuffers.Table {\n\treturn rcv._tab\n}\n\nfunc (rcv *Response) Player(obj *hero.Warrior) *hero.Warrior {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(4))\n\tif o != 0 {\n\t\tx := rcv._tab.Indirect(o + rcv._tab.Pos)\n\t\tif obj == nil {\n\t\t\tobj = new(hero.Warrior)\n\t\t}\n\t\tobj.Init(rcv._tab.Bytes, x)\n\t\treturn obj\n\t}\n\treturn nil\n}\n\nfunc ResponseStart(builder *flatbuffers.Builder) {\n\tbuilder.StartObject(1)\n}\nfunc ResponseAddPlayer(builder *flatbuffers.Builder, player flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(player), 0)\n}\nfunc ResponseEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\treturn builder.EndObject()\n}\n"
  },
  {
    "path": "examples/go-echo/net.fbs",
    "content": "include \"hero.fbs\";\n\nnamespace net;\n\ntable Request {\n\tplayer: hero.Warrior;\n}\n\ntable Response  {\n\tplayer: hero.Warrior;\n}\n"
  },
  {
    "path": "examples/go-echo/server/server.go",
    "content": "package main\n\nimport (\n\t\"echo/net\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"net/http\"\n)\n\nfunc echo(w http.ResponseWriter, r *http.Request) {\n\tbody, err := ioutil.ReadAll(r.Body)\n\tif err != nil {\n\t\tfmt.Printf(\"Unable to read request body: %v\\n\", err)\n\t\treturn\n\t}\n\n\treq := net.GetRootAsRequest(body, 0)\n\tplayer := req.Player(nil)\n\n\tfmt.Printf(\"Got request (name: %v, hp: %v)\\n\", string(player.Name()), player.Hp())\n\tw.Write(body)\n}\n\nfunc main() {\n\thttp.HandleFunc(\"/echo\", echo)\n\n\tfmt.Println(\"Listening on port :8080\")\n\thttp.ListenAndServe(\":8080\", nil)\n}\n"
  },
  {
    "path": "extensions.bzl",
    "content": "\"\"\"Bzlmod extensions\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_file\")\n\ndef _non_module_dependencies_impl(_ctx):\n    \"\"\"Non module dependencies\"\"\"\n    http_file(\n        name = \"bazel_linux_x86_64\",\n        downloaded_file_path = \"bazel\",\n        executable = True,\n        sha256 = \"e78fc3394deae5408d6f49a15c7b1e615901969ecf6e50d55ef899996b0b8458\",\n        urls = [\n            \"https://github.com/bazelbuild/bazel/releases/download/6.3.2/bazel-6.3.2-linux-x86_64\",\n        ],\n    )\n\nnon_module_dependencies = module_extension(\n    implementation = _non_module_dependencies_impl,\n)\n"
  },
  {
    "path": "go/BUILD.bazel",
    "content": "load(\"@io_bazel_rules_go//go:def.bzl\", \"go_library\")\n\nalias(\n    name = \"go_default_library\",\n    actual = \":go\",\n    visibility = [\"//visibility:public\"],\n)\n\ngo_library(\n    name = \"go\",\n    srcs = [\n        \"builder.go\",\n        \"doc.go\",\n        \"encode.go\",\n        \"grpc.go\",\n        \"lib.go\",\n        \"sizes.go\",\n        \"struct.go\",\n        \"table.go\",\n    ],\n    importpath = \"github.com/google/flatbuffers/go\",\n    visibility = [\"//visibility:public\"],\n)\n"
  },
  {
    "path": "go/builder.go",
    "content": "package flatbuffers\n\nimport \"sort\"\n\n// Builder is a state machine for creating FlatBuffer objects.\n// Use a Builder to construct object(s) starting from leaf nodes.\n//\n// A Builder constructs byte buffers in a last-first manner for simplicity and\n// performance.\ntype Builder struct {\n\t// `Bytes` gives raw access to the buffer. Most users will want to use\n\t// FinishedBytes() instead.\n\tBytes []byte\n\n\tminalign  int\n\tvtable    []UOffsetT\n\tobjectEnd UOffsetT\n\tvtables   []UOffsetT\n\thead      UOffsetT\n\tnested    bool\n\tfinished  bool\n\n\tsharedStrings map[string]UOffsetT\n}\n\nconst fileIdentifierLength = 4\nconst sizePrefixLength = 4\n\n// NewBuilder initializes a Builder of size `initial_size`.\n// The internal buffer is grown as needed.\nfunc NewBuilder(initialSize int) *Builder {\n\tif initialSize <= 0 {\n\t\tinitialSize = 0\n\t}\n\n\tb := &Builder{}\n\tb.Bytes = make([]byte, initialSize)\n\tb.head = UOffsetT(initialSize)\n\tb.minalign = 1\n\tb.vtables = make([]UOffsetT, 0, 16) // sensible default capacity\n\treturn b\n}\n\n// Reset truncates the underlying Builder buffer, facilitating alloc-free\n// reuse of a Builder. It also resets bookkeeping data.\nfunc (b *Builder) Reset() {\n\tif b.Bytes != nil {\n\t\tb.Bytes = b.Bytes[:cap(b.Bytes)]\n\t}\n\n\tif b.vtables != nil {\n\t\tb.vtables = b.vtables[:0]\n\t}\n\n\tif b.vtable != nil {\n\t\tb.vtable = b.vtable[:0]\n\t}\n\n\tif b.sharedStrings != nil {\n\t\tfor key := range b.sharedStrings {\n\t\t\tdelete(b.sharedStrings, key)\n\t\t}\n\t}\n\n\tb.head = UOffsetT(len(b.Bytes))\n\tb.minalign = 1\n\tb.nested = false\n\tb.finished = false\n}\n\n// FinishedBytes returns a pointer to the written data in the byte buffer.\n// Panics if the builder is not in a finished state (which is caused by calling\n// `Finish()`).\nfunc (b *Builder) FinishedBytes() []byte {\n\tb.assertFinished()\n\treturn b.Bytes[b.Head():]\n}\n\n// StartObject initializes bookkeeping for writing a new object.\nfunc (b *Builder) StartObject(numfields int) {\n\tb.assertNotNested()\n\tb.nested = true\n\n\t// use 32-bit offsets so that arithmetic doesn't overflow.\n\tif cap(b.vtable) < numfields || b.vtable == nil {\n\t\tb.vtable = make([]UOffsetT, numfields)\n\t} else {\n\t\tb.vtable = b.vtable[:numfields]\n\t\tfor i := 0; i < len(b.vtable); i++ {\n\t\t\tb.vtable[i] = 0\n\t\t}\n\t}\n\n\tb.objectEnd = b.Offset()\n}\n\n// WriteVtable serializes the vtable for the current object, if applicable.\n//\n// Before writing out the vtable, this checks pre-existing vtables for equality\n// to this one. If an equal vtable is found, point the object to the existing\n// vtable and return.\n//\n// Because vtable values are sensitive to alignment of object data, not all\n// logically-equal vtables will be deduplicated.\n//\n// A vtable has the following format:\n//\n//\t  <VOffsetT: size of the vtable in bytes, including this value>\n//\t  <VOffsetT: size of the object in bytes, including the vtable offset>\n//\t  <VOffsetT: offset for a field> * N, where N is the number of fields in\n//\t\t        the schema for this type. Includes deprecated fields.\n//\n// Thus, a vtable is made of 2 + N elements, each SizeVOffsetT bytes wide.\n//\n// An object has the following format:\n//\n//\t<SOffsetT: offset to this object's vtable (may be negative)>\n//\t<byte: data>+\nfunc (b *Builder) WriteVtable() (n UOffsetT) {\n\t// Prepend a zero scalar to the object. Later in this function we'll\n\t// write an offset here that points to the object's vtable:\n\tb.PrependSOffsetT(0)\n\n\tobjectOffset := b.Offset()\n\texistingVtable := UOffsetT(0)\n\n\t// Trim vtable of trailing zeroes.\n\ti := len(b.vtable) - 1\n\tfor ; i >= 0 && b.vtable[i] == 0; i-- {\n\t}\n\tb.vtable = b.vtable[:i+1]\n\n\t// Search backwards through existing vtables, because similar vtables\n\t// are likely to have been recently appended. See\n\t// BenchmarkVtableDeduplication for a case in which this heuristic\n\t// saves about 30% of the time used in writing objects with duplicate\n\t// tables.\n\tfor i := len(b.vtables) - 1; i >= 0; i-- {\n\t\t// Find the other vtable, which is associated with `i`:\n\t\tvt2Offset := b.vtables[i]\n\t\tvt2Start := len(b.Bytes) - int(vt2Offset)\n\t\tvt2Len := GetVOffsetT(b.Bytes[vt2Start:])\n\n\t\tmetadata := VtableMetadataFields * SizeVOffsetT\n\t\tvt2End := vt2Start + int(vt2Len)\n\t\tvt2 := b.Bytes[vt2Start+metadata : vt2End]\n\n\t\t// Compare the other vtable to the one under consideration.\n\t\t// If they are equal, store the offset and break:\n\t\tif vtableEqual(b.vtable, objectOffset, vt2) {\n\t\t\texistingVtable = vt2Offset\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif existingVtable == 0 {\n\t\t// Did not find a vtable, so write this one to the buffer.\n\n\t\t// Write out the current vtable in reverse , because\n\t\t// serialization occurs in last-first order:\n\t\tfor i := len(b.vtable) - 1; i >= 0; i-- {\n\t\t\tvar off UOffsetT\n\t\t\tif b.vtable[i] != 0 {\n\t\t\t\t// Forward reference to field;\n\t\t\t\t// use 32bit number to assert no overflow:\n\t\t\t\toff = objectOffset - b.vtable[i]\n\t\t\t}\n\n\t\t\tb.PrependVOffsetT(VOffsetT(off))\n\t\t}\n\n\t\t// The two metadata fields are written last.\n\n\t\t// First, store the object bytesize:\n\t\tobjectSize := objectOffset - b.objectEnd\n\t\tb.PrependVOffsetT(VOffsetT(objectSize))\n\n\t\t// Second, store the vtable bytesize:\n\t\tvBytes := (len(b.vtable) + VtableMetadataFields) * SizeVOffsetT\n\t\tb.PrependVOffsetT(VOffsetT(vBytes))\n\n\t\t// Next, write the offset to the new vtable in the\n\t\t// already-allocated SOffsetT at the beginning of this object:\n\t\tobjectStart := SOffsetT(len(b.Bytes)) - SOffsetT(objectOffset)\n\t\tWriteSOffsetT(b.Bytes[objectStart:],\n\t\t\tSOffsetT(b.Offset())-SOffsetT(objectOffset))\n\n\t\t// Finally, store this vtable in memory for future\n\t\t// deduplication:\n\t\tb.vtables = append(b.vtables, b.Offset())\n\t} else {\n\t\t// Found a duplicate vtable.\n\n\t\tobjectStart := SOffsetT(len(b.Bytes)) - SOffsetT(objectOffset)\n\t\tb.head = UOffsetT(objectStart)\n\n\t\t// Write the offset to the found vtable in the\n\t\t// already-allocated SOffsetT at the beginning of this object:\n\t\tWriteSOffsetT(b.Bytes[b.head:],\n\t\t\tSOffsetT(existingVtable)-SOffsetT(objectOffset))\n\t}\n\n\tb.vtable = b.vtable[:0]\n\treturn objectOffset\n}\n\n// EndObject writes data necessary to finish object construction.\nfunc (b *Builder) EndObject() UOffsetT {\n\tb.assertNested()\n\tn := b.WriteVtable()\n\tb.nested = false\n\treturn n\n}\n\n// Doubles the size of the byteslice, and copies the old data towards the\n// end of the new byteslice (since we build the buffer backwards).\nfunc (b *Builder) growByteBuffer() {\n\tif (int64(len(b.Bytes)) & int64(0xC0000000)) != 0 {\n\t\tpanic(\"cannot grow buffer beyond 2 gigabytes\")\n\t}\n\tnewLen := len(b.Bytes) * 2\n\tif newLen == 0 {\n\t\tnewLen = 1\n\t}\n\n\tif cap(b.Bytes) >= newLen {\n\t\tb.Bytes = b.Bytes[:newLen]\n\t} else {\n\t\textension := make([]byte, newLen-len(b.Bytes))\n\t\tb.Bytes = append(b.Bytes, extension...)\n\t}\n\n\tmiddle := newLen / 2\n\tcopy(b.Bytes[middle:], b.Bytes[:middle])\n}\n\n// Head gives the start of useful data in the underlying byte buffer.\n// Note: unlike other functions, this value is interpreted as from the left.\nfunc (b *Builder) Head() UOffsetT {\n\treturn b.head\n}\n\n// Offset relative to the end of the buffer.\nfunc (b *Builder) Offset() UOffsetT {\n\treturn UOffsetT(len(b.Bytes)) - b.head\n}\n\n// Pad places zeros at the current offset.\nfunc (b *Builder) Pad(n int) {\n\tfor i := 0; i < n; i++ {\n\t\tb.PlaceByte(0)\n\t}\n}\n\n// Prep prepares to write an element of `size` after `additional_bytes`\n// have been written, e.g. if you write a string, you need to align such\n// the int length field is aligned to SizeInt32, and the string data follows it\n// directly.\n// If all you need to do is align, `additionalBytes` will be 0.\nfunc (b *Builder) Prep(size, additionalBytes int) {\n\t// Track the biggest thing we've ever aligned to.\n\tif size > b.minalign {\n\t\tb.minalign = size\n\t}\n\t// Find the amount of alignment needed such that `size` is properly\n\t// aligned after `additionalBytes`:\n\talignSize := (^(len(b.Bytes) - int(b.Head()) + additionalBytes)) + 1\n\talignSize &= (size - 1)\n\n\t// Reallocate the buffer if needed:\n\tfor int(b.head) <= alignSize+size+additionalBytes {\n\t\toldBufSize := len(b.Bytes)\n\t\tb.growByteBuffer()\n\t\tb.head += UOffsetT(len(b.Bytes) - oldBufSize)\n\t}\n\tb.Pad(alignSize)\n}\n\n// PrependSOffsetT prepends an SOffsetT, relative to where it will be written.\nfunc (b *Builder) PrependSOffsetT(off SOffsetT) {\n\tb.Prep(SizeSOffsetT, 0) // Ensure alignment is already done.\n\tif !(UOffsetT(off) <= b.Offset()) {\n\t\tpanic(\"unreachable: off <= b.Offset()\")\n\t}\n\toff2 := SOffsetT(b.Offset()) - off + SOffsetT(SizeSOffsetT)\n\tb.PlaceSOffsetT(off2)\n}\n\n// PrependUOffsetT prepends an UOffsetT, relative to where it will be written.\nfunc (b *Builder) PrependUOffsetT(off UOffsetT) {\n\tb.Prep(SizeUOffsetT, 0) // Ensure alignment is already done.\n\tif !(off <= b.Offset()) {\n\t\tpanic(\"unreachable: off <= b.Offset()\")\n\t}\n\toff2 := b.Offset() - off + UOffsetT(SizeUOffsetT)\n\tb.PlaceUOffsetT(off2)\n}\n\n// StartVector initializes bookkeeping for writing a new vector.\n//\n// A vector has the following format:\n//\n//\t<UOffsetT: number of elements in this vector>\n//\t<T: data>+, where T is the type of elements of this vector.\nfunc (b *Builder) StartVector(elemSize, numElems, alignment int) UOffsetT {\n\tb.assertNotNested()\n\tb.nested = true\n\tb.Prep(SizeUint32, elemSize*numElems)\n\tb.Prep(alignment, elemSize*numElems) // Just in case alignment > int.\n\treturn b.Offset()\n}\n\n// EndVector writes data necessary to finish vector construction.\nfunc (b *Builder) EndVector(vectorNumElems int) UOffsetT {\n\tb.assertNested()\n\n\t// we already made space for this, so write without PrependUint32\n\tb.PlaceUOffsetT(UOffsetT(vectorNumElems))\n\n\tb.nested = false\n\treturn b.Offset()\n}\n\n// CreateVectorOfTables serializes slice of table offsets into a vector.\nfunc (b *Builder) CreateVectorOfTables(offsets []UOffsetT) UOffsetT {\n\tb.assertNotNested()\n\tb.StartVector(4, len(offsets), 4)\n\tfor i := len(offsets) - 1; i >= 0; i-- {\n\t\tb.PrependUOffsetT(offsets[i])\n\t}\n\treturn b.EndVector(len(offsets))\n}\n\ntype KeyCompare func(o1, o2 UOffsetT, buf []byte) bool\n\nfunc (b *Builder) CreateVectorOfSortedTables(offsets []UOffsetT, keyCompare KeyCompare) UOffsetT {\n\tsort.Slice(offsets, func(i, j int) bool {\n\t\treturn keyCompare(offsets[i], offsets[j], b.Bytes)\n\t})\n\treturn b.CreateVectorOfTables(offsets)\n}\n\n// CreateSharedString Checks if the string is already written\n// to the buffer before calling CreateString\nfunc (b *Builder) CreateSharedString(s string) UOffsetT {\n\tif b.sharedStrings == nil {\n\t\tb.sharedStrings = make(map[string]UOffsetT)\n\t}\n\tif v, ok := b.sharedStrings[s]; ok {\n\t\treturn v\n\t}\n\toff := b.CreateString(s)\n\tb.sharedStrings[s] = off\n\treturn off\n}\n\n// CreateString writes a null-terminated string as a vector.\nfunc (b *Builder) CreateString(s string) UOffsetT {\n\tb.assertNotNested()\n\tb.nested = true\n\n\tb.Prep(int(SizeUOffsetT), (len(s)+1)*SizeByte)\n\tb.PlaceByte(0)\n\n\tl := UOffsetT(len(s))\n\n\tb.head -= l\n\tcopy(b.Bytes[b.head:b.head+l], s)\n\n\treturn b.EndVector(len(s))\n}\n\n// CreateByteString writes a byte slice as a string (null-terminated).\nfunc (b *Builder) CreateByteString(s []byte) UOffsetT {\n\tb.assertNotNested()\n\tb.nested = true\n\n\tb.Prep(int(SizeUOffsetT), (len(s)+1)*SizeByte)\n\tb.PlaceByte(0)\n\n\tl := UOffsetT(len(s))\n\n\tb.head -= l\n\tcopy(b.Bytes[b.head:b.head+l], s)\n\n\treturn b.EndVector(len(s))\n}\n\n// CreateByteVector writes a ubyte vector\nfunc (b *Builder) CreateByteVector(v []byte) UOffsetT {\n\tb.assertNotNested()\n\tb.nested = true\n\n\tb.Prep(int(SizeUOffsetT), len(v)*SizeByte)\n\n\tl := UOffsetT(len(v))\n\n\tb.head -= l\n\tcopy(b.Bytes[b.head:b.head+l], v)\n\n\treturn b.EndVector(len(v))\n}\n\nfunc (b *Builder) assertNested() {\n\t// If you get this assert, you're in an object while trying to write\n\t// data that belongs outside of an object.\n\t// To fix this, write non-inline data (like vectors) before creating\n\t// objects.\n\tif !b.nested {\n\t\tpanic(\"Incorrect creation order: must be inside object.\")\n\t}\n}\n\nfunc (b *Builder) assertNotNested() {\n\t// If you hit this, you're trying to construct a Table/Vector/String\n\t// during the construction of its parent table (between the MyTableBuilder\n\t// and builder.Finish()).\n\t// Move the creation of these sub-objects to above the MyTableBuilder to\n\t// not get this assert.\n\t// Ignoring this assert may appear to work in simple cases, but the reason\n\t// it is here is that storing objects in-line may cause vtable offsets\n\t// to not fit anymore. It also leads to vtable duplication.\n\tif b.nested {\n\t\tpanic(\"Incorrect creation order: object must not be nested.\")\n\t}\n}\n\nfunc (b *Builder) assertFinished() {\n\t// If you get this assert, you're attempting to get access a buffer\n\t// which hasn't been finished yet. Be sure to call builder.Finish()\n\t// with your root table.\n\t// If you really need to access an unfinished buffer, use the Bytes\n\t// buffer directly.\n\tif !b.finished {\n\t\tpanic(\"Incorrect use of FinishedBytes(): must call 'Finish' first.\")\n\t}\n}\n\n// PrependBoolSlot prepends a bool onto the object at vtable slot `o`.\n// If value `x` equals default `d`, then the slot will be set to zero and no\n// other data will be written.\nfunc (b *Builder) PrependBoolSlot(o int, x, d bool) {\n\tval := byte(0)\n\tif x {\n\t\tval = 1\n\t}\n\tdef := byte(0)\n\tif d {\n\t\tdef = 1\n\t}\n\tb.PrependByteSlot(o, val, def)\n}\n\n// PrependByteSlot prepends a byte onto the object at vtable slot `o`.\n// If value `x` equals default `d`, then the slot will be set to zero and no\n// other data will be written.\nfunc (b *Builder) PrependByteSlot(o int, x, d byte) {\n\tif x != d {\n\t\tb.PrependByte(x)\n\t\tb.Slot(o)\n\t}\n}\n\n// PrependUint8Slot prepends a uint8 onto the object at vtable slot `o`.\n// If value `x` equals default `d`, then the slot will be set to zero and no\n// other data will be written.\nfunc (b *Builder) PrependUint8Slot(o int, x, d uint8) {\n\tif x != d {\n\t\tb.PrependUint8(x)\n\t\tb.Slot(o)\n\t}\n}\n\n// PrependUint16Slot prepends a uint16 onto the object at vtable slot `o`.\n// If value `x` equals default `d`, then the slot will be set to zero and no\n// other data will be written.\nfunc (b *Builder) PrependUint16Slot(o int, x, d uint16) {\n\tif x != d {\n\t\tb.PrependUint16(x)\n\t\tb.Slot(o)\n\t}\n}\n\n// PrependUint32Slot prepends a uint32 onto the object at vtable slot `o`.\n// If value `x` equals default `d`, then the slot will be set to zero and no\n// other data will be written.\nfunc (b *Builder) PrependUint32Slot(o int, x, d uint32) {\n\tif x != d {\n\t\tb.PrependUint32(x)\n\t\tb.Slot(o)\n\t}\n}\n\n// PrependUint64Slot prepends a uint64 onto the object at vtable slot `o`.\n// If value `x` equals default `d`, then the slot will be set to zero and no\n// other data will be written.\nfunc (b *Builder) PrependUint64Slot(o int, x, d uint64) {\n\tif x != d {\n\t\tb.PrependUint64(x)\n\t\tb.Slot(o)\n\t}\n}\n\n// PrependInt8Slot prepends a int8 onto the object at vtable slot `o`.\n// If value `x` equals default `d`, then the slot will be set to zero and no\n// other data will be written.\nfunc (b *Builder) PrependInt8Slot(o int, x, d int8) {\n\tif x != d {\n\t\tb.PrependInt8(x)\n\t\tb.Slot(o)\n\t}\n}\n\n// PrependInt16Slot prepends a int16 onto the object at vtable slot `o`.\n// If value `x` equals default `d`, then the slot will be set to zero and no\n// other data will be written.\nfunc (b *Builder) PrependInt16Slot(o int, x, d int16) {\n\tif x != d {\n\t\tb.PrependInt16(x)\n\t\tb.Slot(o)\n\t}\n}\n\n// PrependInt32Slot prepends a int32 onto the object at vtable slot `o`.\n// If value `x` equals default `d`, then the slot will be set to zero and no\n// other data will be written.\nfunc (b *Builder) PrependInt32Slot(o int, x, d int32) {\n\tif x != d {\n\t\tb.PrependInt32(x)\n\t\tb.Slot(o)\n\t}\n}\n\n// PrependInt64Slot prepends a int64 onto the object at vtable slot `o`.\n// If value `x` equals default `d`, then the slot will be set to zero and no\n// other data will be written.\nfunc (b *Builder) PrependInt64Slot(o int, x, d int64) {\n\tif x != d {\n\t\tb.PrependInt64(x)\n\t\tb.Slot(o)\n\t}\n}\n\n// PrependFloat32Slot prepends a float32 onto the object at vtable slot `o`.\n// If value `x` equals default `d`, then the slot will be set to zero and no\n// other data will be written.\nfunc (b *Builder) PrependFloat32Slot(o int, x, d float32) {\n\tif x != d {\n\t\tb.PrependFloat32(x)\n\t\tb.Slot(o)\n\t}\n}\n\n// PrependFloat64Slot prepends a float64 onto the object at vtable slot `o`.\n// If value `x` equals default `d`, then the slot will be set to zero and no\n// other data will be written.\nfunc (b *Builder) PrependFloat64Slot(o int, x, d float64) {\n\tif x != d {\n\t\tb.PrependFloat64(x)\n\t\tb.Slot(o)\n\t}\n}\n\n// PrependUOffsetTSlot prepends an UOffsetT onto the object at vtable slot `o`.\n// If value `x` equals default `d`, then the slot will be set to zero and no\n// other data will be written.\nfunc (b *Builder) PrependUOffsetTSlot(o int, x, d UOffsetT) {\n\tif x != d {\n\t\tb.PrependUOffsetT(x)\n\t\tb.Slot(o)\n\t}\n}\n\n// PrependStructSlot prepends a struct onto the object at vtable slot `o`.\n// Structs are stored inline, so nothing additional is being added.\n// In generated code, `d` is always 0.\nfunc (b *Builder) PrependStructSlot(voffset int, x, d UOffsetT) {\n\tif x != d {\n\t\tb.assertNested()\n\t\tif x != b.Offset() {\n\t\t\tpanic(\"inline data write outside of object\")\n\t\t}\n\t\tb.Slot(voffset)\n\t}\n}\n\n// Slot sets the vtable key `voffset` to the current location in the buffer.\nfunc (b *Builder) Slot(slotnum int) {\n\tb.vtable[slotnum] = UOffsetT(b.Offset())\n}\n\n// FinishWithFileIdentifier finalizes a buffer, pointing to the given `rootTable`.\n// as well as applys a file identifier\nfunc (b *Builder) FinishWithFileIdentifier(rootTable UOffsetT, fid []byte) {\n\tif fid == nil || len(fid) != fileIdentifierLength {\n\t\tpanic(\"incorrect file identifier length\")\n\t}\n\t// In order to add a file identifier to the flatbuffer message, we need\n\t// to prepare an alignment and file identifier length\n\tb.Prep(b.minalign, SizeInt32+fileIdentifierLength)\n\tfor i := fileIdentifierLength - 1; i >= 0; i-- {\n\t\t// place the file identifier\n\t\tb.PlaceByte(fid[i])\n\t}\n\t// finish\n\tb.Finish(rootTable)\n}\n\n// FinishSizePrefixed finalizes a buffer, pointing to the given `rootTable`.\n// The buffer is prefixed with the size of the buffer, excluding the size\n// of the prefix itself.\nfunc (b *Builder) FinishSizePrefixed(rootTable UOffsetT) {\n\tb.finish(rootTable, true)\n}\n\n// FinishSizePrefixedWithFileIdentifier finalizes a buffer, pointing to the given `rootTable`\n// and applies a file identifier. The buffer is prefixed with the size of the buffer,\n// excluding the size of the prefix itself.\nfunc (b *Builder) FinishSizePrefixedWithFileIdentifier(rootTable UOffsetT, fid []byte) {\n\tif fid == nil || len(fid) != fileIdentifierLength {\n\t\tpanic(\"incorrect file identifier length\")\n\t}\n\t// In order to add a file identifier and size prefix to the flatbuffer message,\n\t// we need to prepare an alignment, a size prefix length, and file identifier length\n\tb.Prep(b.minalign, SizeInt32+fileIdentifierLength+sizePrefixLength)\n\tfor i := fileIdentifierLength - 1; i >= 0; i-- {\n\t\t// place the file identifier\n\t\tb.PlaceByte(fid[i])\n\t}\n\t// finish\n\tb.finish(rootTable, true)\n}\n\n// Finish finalizes a buffer, pointing to the given `rootTable`.\nfunc (b *Builder) Finish(rootTable UOffsetT) {\n\tb.finish(rootTable, false)\n}\n\n// finish finalizes a buffer, pointing to the given `rootTable`\n// with an optional size prefix.\nfunc (b *Builder) finish(rootTable UOffsetT, sizePrefix bool) {\n\tb.assertNotNested()\n\n\tif sizePrefix {\n\t\tb.Prep(b.minalign, SizeUOffsetT+sizePrefixLength)\n\t} else {\n\t\tb.Prep(b.minalign, SizeUOffsetT)\n\t}\n\n\tb.PrependUOffsetT(rootTable)\n\n\tif sizePrefix {\n\t\tb.PlaceUint32(uint32(b.Offset()))\n\t}\n\n\tb.finished = true\n}\n\n// vtableEqual compares an unwritten vtable to a written vtable.\nfunc vtableEqual(a []UOffsetT, objectStart UOffsetT, b []byte) bool {\n\tif len(a)*SizeVOffsetT != len(b) {\n\t\treturn false\n\t}\n\n\tfor i := 0; i < len(a); i++ {\n\t\tx := GetVOffsetT(b[i*SizeVOffsetT : (i+1)*SizeVOffsetT])\n\n\t\t// Skip vtable entries that indicate a default value.\n\t\tif x == 0 && a[i] == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\ty := SOffsetT(objectStart) - SOffsetT(a[i])\n\t\tif SOffsetT(x) != y {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\n// PrependBool prepends a bool to the Builder buffer.\n// Aligns and checks for space.\nfunc (b *Builder) PrependBool(x bool) {\n\tb.Prep(SizeBool, 0)\n\tb.PlaceBool(x)\n}\n\n// PrependUint8 prepends a uint8 to the Builder buffer.\n// Aligns and checks for space.\nfunc (b *Builder) PrependUint8(x uint8) {\n\tb.Prep(SizeUint8, 0)\n\tb.PlaceUint8(x)\n}\n\n// PrependUint16 prepends a uint16 to the Builder buffer.\n// Aligns and checks for space.\nfunc (b *Builder) PrependUint16(x uint16) {\n\tb.Prep(SizeUint16, 0)\n\tb.PlaceUint16(x)\n}\n\n// PrependUint32 prepends a uint32 to the Builder buffer.\n// Aligns and checks for space.\nfunc (b *Builder) PrependUint32(x uint32) {\n\tb.Prep(SizeUint32, 0)\n\tb.PlaceUint32(x)\n}\n\n// PrependUint64 prepends a uint64 to the Builder buffer.\n// Aligns and checks for space.\nfunc (b *Builder) PrependUint64(x uint64) {\n\tb.Prep(SizeUint64, 0)\n\tb.PlaceUint64(x)\n}\n\n// PrependInt8 prepends a int8 to the Builder buffer.\n// Aligns and checks for space.\nfunc (b *Builder) PrependInt8(x int8) {\n\tb.Prep(SizeInt8, 0)\n\tb.PlaceInt8(x)\n}\n\n// PrependInt16 prepends a int16 to the Builder buffer.\n// Aligns and checks for space.\nfunc (b *Builder) PrependInt16(x int16) {\n\tb.Prep(SizeInt16, 0)\n\tb.PlaceInt16(x)\n}\n\n// PrependInt32 prepends a int32 to the Builder buffer.\n// Aligns and checks for space.\nfunc (b *Builder) PrependInt32(x int32) {\n\tb.Prep(SizeInt32, 0)\n\tb.PlaceInt32(x)\n}\n\n// PrependInt64 prepends a int64 to the Builder buffer.\n// Aligns and checks for space.\nfunc (b *Builder) PrependInt64(x int64) {\n\tb.Prep(SizeInt64, 0)\n\tb.PlaceInt64(x)\n}\n\n// PrependFloat32 prepends a float32 to the Builder buffer.\n// Aligns and checks for space.\nfunc (b *Builder) PrependFloat32(x float32) {\n\tb.Prep(SizeFloat32, 0)\n\tb.PlaceFloat32(x)\n}\n\n// PrependFloat64 prepends a float64 to the Builder buffer.\n// Aligns and checks for space.\nfunc (b *Builder) PrependFloat64(x float64) {\n\tb.Prep(SizeFloat64, 0)\n\tb.PlaceFloat64(x)\n}\n\n// PrependByte prepends a byte to the Builder buffer.\n// Aligns and checks for space.\nfunc (b *Builder) PrependByte(x byte) {\n\tb.Prep(SizeByte, 0)\n\tb.PlaceByte(x)\n}\n\n// PrependVOffsetT prepends a VOffsetT to the Builder buffer.\n// Aligns and checks for space.\nfunc (b *Builder) PrependVOffsetT(x VOffsetT) {\n\tb.Prep(SizeVOffsetT, 0)\n\tb.PlaceVOffsetT(x)\n}\n\n// PlaceBool prepends a bool to the Builder, without checking for space.\nfunc (b *Builder) PlaceBool(x bool) {\n\tb.head -= UOffsetT(SizeBool)\n\tWriteBool(b.Bytes[b.head:], x)\n}\n\n// PlaceUint8 prepends a uint8 to the Builder, without checking for space.\nfunc (b *Builder) PlaceUint8(x uint8) {\n\tb.head -= UOffsetT(SizeUint8)\n\tWriteUint8(b.Bytes[b.head:], x)\n}\n\n// PlaceUint16 prepends a uint16 to the Builder, without checking for space.\nfunc (b *Builder) PlaceUint16(x uint16) {\n\tb.head -= UOffsetT(SizeUint16)\n\tWriteUint16(b.Bytes[b.head:], x)\n}\n\n// PlaceUint32 prepends a uint32 to the Builder, without checking for space.\nfunc (b *Builder) PlaceUint32(x uint32) {\n\tb.head -= UOffsetT(SizeUint32)\n\tWriteUint32(b.Bytes[b.head:], x)\n}\n\n// PlaceUint64 prepends a uint64 to the Builder, without checking for space.\nfunc (b *Builder) PlaceUint64(x uint64) {\n\tb.head -= UOffsetT(SizeUint64)\n\tWriteUint64(b.Bytes[b.head:], x)\n}\n\n// PlaceInt8 prepends a int8 to the Builder, without checking for space.\nfunc (b *Builder) PlaceInt8(x int8) {\n\tb.head -= UOffsetT(SizeInt8)\n\tWriteInt8(b.Bytes[b.head:], x)\n}\n\n// PlaceInt16 prepends a int16 to the Builder, without checking for space.\nfunc (b *Builder) PlaceInt16(x int16) {\n\tb.head -= UOffsetT(SizeInt16)\n\tWriteInt16(b.Bytes[b.head:], x)\n}\n\n// PlaceInt32 prepends a int32 to the Builder, without checking for space.\nfunc (b *Builder) PlaceInt32(x int32) {\n\tb.head -= UOffsetT(SizeInt32)\n\tWriteInt32(b.Bytes[b.head:], x)\n}\n\n// PlaceInt64 prepends a int64 to the Builder, without checking for space.\nfunc (b *Builder) PlaceInt64(x int64) {\n\tb.head -= UOffsetT(SizeInt64)\n\tWriteInt64(b.Bytes[b.head:], x)\n}\n\n// PlaceFloat32 prepends a float32 to the Builder, without checking for space.\nfunc (b *Builder) PlaceFloat32(x float32) {\n\tb.head -= UOffsetT(SizeFloat32)\n\tWriteFloat32(b.Bytes[b.head:], x)\n}\n\n// PlaceFloat64 prepends a float64 to the Builder, without checking for space.\nfunc (b *Builder) PlaceFloat64(x float64) {\n\tb.head -= UOffsetT(SizeFloat64)\n\tWriteFloat64(b.Bytes[b.head:], x)\n}\n\n// PlaceByte prepends a byte to the Builder, without checking for space.\nfunc (b *Builder) PlaceByte(x byte) {\n\tb.head -= UOffsetT(SizeByte)\n\tWriteByte(b.Bytes[b.head:], x)\n}\n\n// PlaceVOffsetT prepends a VOffsetT to the Builder, without checking for space.\nfunc (b *Builder) PlaceVOffsetT(x VOffsetT) {\n\tb.head -= UOffsetT(SizeVOffsetT)\n\tWriteVOffsetT(b.Bytes[b.head:], x)\n}\n\n// PlaceSOffsetT prepends a SOffsetT to the Builder, without checking for space.\nfunc (b *Builder) PlaceSOffsetT(x SOffsetT) {\n\tb.head -= UOffsetT(SizeSOffsetT)\n\tWriteSOffsetT(b.Bytes[b.head:], x)\n}\n\n// PlaceUOffsetT prepends a UOffsetT to the Builder, without checking for space.\nfunc (b *Builder) PlaceUOffsetT(x UOffsetT) {\n\tb.head -= UOffsetT(SizeUOffsetT)\n\tWriteUOffsetT(b.Bytes[b.head:], x)\n}\n"
  },
  {
    "path": "go/doc.go",
    "content": "// Package flatbuffers provides facilities to read and write flatbuffers\n// objects.\npackage flatbuffers\n"
  },
  {
    "path": "go/encode.go",
    "content": "package flatbuffers\n\nimport (\n\t\"math\"\n)\n\ntype (\n\t// A SOffsetT stores a signed offset into arbitrary data.\n\tSOffsetT int32\n\t// A UOffsetT stores an unsigned offset into vector data.\n\tUOffsetT uint32\n\t// A VOffsetT stores an unsigned offset in a vtable.\n\tVOffsetT uint16\n)\n\nconst (\n\t// VtableMetadataFields is the count of metadata fields in each vtable.\n\tVtableMetadataFields = 2\n)\n\n// GetByte decodes a little-endian byte from a byte slice.\nfunc GetByte(buf []byte) byte {\n\treturn byte(GetUint8(buf))\n}\n\n// GetBool decodes a little-endian bool from a byte slice.\nfunc GetBool(buf []byte) bool {\n\treturn buf[0] != 0\n}\n\n// GetUint8 decodes a little-endian uint8 from a byte slice.\nfunc GetUint8(buf []byte) (n uint8) {\n\tn = uint8(buf[0])\n\treturn\n}\n\n// GetUint16 decodes a little-endian uint16 from a byte slice.\nfunc GetUint16(buf []byte) (n uint16) {\n\t_ = buf[1] // Force one bounds check. See: golang.org/issue/14808\n\tn |= uint16(buf[0])\n\tn |= uint16(buf[1]) << 8\n\treturn\n}\n\n// GetUint32 decodes a little-endian uint32 from a byte slice.\nfunc GetUint32(buf []byte) (n uint32) {\n\t_ = buf[3] // Force one bounds check. See: golang.org/issue/14808\n\tn |= uint32(buf[0])\n\tn |= uint32(buf[1]) << 8\n\tn |= uint32(buf[2]) << 16\n\tn |= uint32(buf[3]) << 24\n\treturn\n}\n\n// GetUint64 decodes a little-endian uint64 from a byte slice.\nfunc GetUint64(buf []byte) (n uint64) {\n\t_ = buf[7] // Force one bounds check. See: golang.org/issue/14808\n\tn |= uint64(buf[0])\n\tn |= uint64(buf[1]) << 8\n\tn |= uint64(buf[2]) << 16\n\tn |= uint64(buf[3]) << 24\n\tn |= uint64(buf[4]) << 32\n\tn |= uint64(buf[5]) << 40\n\tn |= uint64(buf[6]) << 48\n\tn |= uint64(buf[7]) << 56\n\treturn\n}\n\n// GetInt8 decodes a little-endian int8 from a byte slice.\nfunc GetInt8(buf []byte) (n int8) {\n\tn = int8(buf[0])\n\treturn\n}\n\n// GetInt16 decodes a little-endian int16 from a byte slice.\nfunc GetInt16(buf []byte) (n int16) {\n\t_ = buf[1] // Force one bounds check. See: golang.org/issue/14808\n\tn |= int16(buf[0])\n\tn |= int16(buf[1]) << 8\n\treturn\n}\n\n// GetInt32 decodes a little-endian int32 from a byte slice.\nfunc GetInt32(buf []byte) (n int32) {\n\t_ = buf[3] // Force one bounds check. See: golang.org/issue/14808\n\tn |= int32(buf[0])\n\tn |= int32(buf[1]) << 8\n\tn |= int32(buf[2]) << 16\n\tn |= int32(buf[3]) << 24\n\treturn\n}\n\n// GetInt64 decodes a little-endian int64 from a byte slice.\nfunc GetInt64(buf []byte) (n int64) {\n\t_ = buf[7] // Force one bounds check. See: golang.org/issue/14808\n\tn |= int64(buf[0])\n\tn |= int64(buf[1]) << 8\n\tn |= int64(buf[2]) << 16\n\tn |= int64(buf[3]) << 24\n\tn |= int64(buf[4]) << 32\n\tn |= int64(buf[5]) << 40\n\tn |= int64(buf[6]) << 48\n\tn |= int64(buf[7]) << 56\n\treturn\n}\n\n// GetFloat32 decodes a little-endian float32 from a byte slice.\nfunc GetFloat32(buf []byte) float32 {\n\tx := GetUint32(buf)\n\treturn math.Float32frombits(x)\n}\n\n// GetFloat64 decodes a little-endian float64 from a byte slice.\nfunc GetFloat64(buf []byte) float64 {\n\tx := GetUint64(buf)\n\treturn math.Float64frombits(x)\n}\n\n// GetUOffsetT decodes a little-endian UOffsetT from a byte slice.\nfunc GetUOffsetT(buf []byte) UOffsetT {\n\treturn UOffsetT(GetUint32(buf))\n}\n\n// GetSOffsetT decodes a little-endian SOffsetT from a byte slice.\nfunc GetSOffsetT(buf []byte) SOffsetT {\n\treturn SOffsetT(GetInt32(buf))\n}\n\n// GetVOffsetT decodes a little-endian VOffsetT from a byte slice.\nfunc GetVOffsetT(buf []byte) VOffsetT {\n\treturn VOffsetT(GetUint16(buf))\n}\n\n// WriteByte encodes a little-endian uint8 into a byte slice.\nfunc WriteByte(buf []byte, n byte) {\n\tWriteUint8(buf, uint8(n))\n}\n\n// WriteBool encodes a little-endian bool into a byte slice.\nfunc WriteBool(buf []byte, b bool) {\n\tbuf[0] = 0\n\tif b {\n\t\tbuf[0] = 1\n\t}\n}\n\n// WriteUint8 encodes a little-endian uint8 into a byte slice.\nfunc WriteUint8(buf []byte, n uint8) {\n\tbuf[0] = byte(n)\n}\n\n// WriteUint16 encodes a little-endian uint16 into a byte slice.\nfunc WriteUint16(buf []byte, n uint16) {\n\t_ = buf[1] // Force one bounds check. See: golang.org/issue/14808\n\tbuf[0] = byte(n)\n\tbuf[1] = byte(n >> 8)\n}\n\n// WriteUint32 encodes a little-endian uint32 into a byte slice.\nfunc WriteUint32(buf []byte, n uint32) {\n\t_ = buf[3] // Force one bounds check. See: golang.org/issue/14808\n\tbuf[0] = byte(n)\n\tbuf[1] = byte(n >> 8)\n\tbuf[2] = byte(n >> 16)\n\tbuf[3] = byte(n >> 24)\n}\n\n// WriteUint64 encodes a little-endian uint64 into a byte slice.\nfunc WriteUint64(buf []byte, n uint64) {\n\t_ = buf[7] // Force one bounds check. See: golang.org/issue/14808\n\tbuf[0] = byte(n)\n\tbuf[1] = byte(n >> 8)\n\tbuf[2] = byte(n >> 16)\n\tbuf[3] = byte(n >> 24)\n\tbuf[4] = byte(n >> 32)\n\tbuf[5] = byte(n >> 40)\n\tbuf[6] = byte(n >> 48)\n\tbuf[7] = byte(n >> 56)\n}\n\n// WriteInt8 encodes a little-endian int8 into a byte slice.\nfunc WriteInt8(buf []byte, n int8) {\n\tbuf[0] = byte(n)\n}\n\n// WriteInt16 encodes a little-endian int16 into a byte slice.\nfunc WriteInt16(buf []byte, n int16) {\n\t_ = buf[1] // Force one bounds check. See: golang.org/issue/14808\n\tbuf[0] = byte(n)\n\tbuf[1] = byte(n >> 8)\n}\n\n// WriteInt32 encodes a little-endian int32 into a byte slice.\nfunc WriteInt32(buf []byte, n int32) {\n\t_ = buf[3] // Force one bounds check. See: golang.org/issue/14808\n\tbuf[0] = byte(n)\n\tbuf[1] = byte(n >> 8)\n\tbuf[2] = byte(n >> 16)\n\tbuf[3] = byte(n >> 24)\n}\n\n// WriteInt64 encodes a little-endian int64 into a byte slice.\nfunc WriteInt64(buf []byte, n int64) {\n\t_ = buf[7] // Force one bounds check. See: golang.org/issue/14808\n\tbuf[0] = byte(n)\n\tbuf[1] = byte(n >> 8)\n\tbuf[2] = byte(n >> 16)\n\tbuf[3] = byte(n >> 24)\n\tbuf[4] = byte(n >> 32)\n\tbuf[5] = byte(n >> 40)\n\tbuf[6] = byte(n >> 48)\n\tbuf[7] = byte(n >> 56)\n}\n\n// WriteFloat32 encodes a little-endian float32 into a byte slice.\nfunc WriteFloat32(buf []byte, n float32) {\n\tWriteUint32(buf, math.Float32bits(n))\n}\n\n// WriteFloat64 encodes a little-endian float64 into a byte slice.\nfunc WriteFloat64(buf []byte, n float64) {\n\tWriteUint64(buf, math.Float64bits(n))\n}\n\n// WriteVOffsetT encodes a little-endian VOffsetT into a byte slice.\nfunc WriteVOffsetT(buf []byte, n VOffsetT) {\n\tWriteUint16(buf, uint16(n))\n}\n\n// WriteSOffsetT encodes a little-endian SOffsetT into a byte slice.\nfunc WriteSOffsetT(buf []byte, n SOffsetT) {\n\tWriteInt32(buf, int32(n))\n}\n\n// WriteUOffsetT encodes a little-endian UOffsetT into a byte slice.\nfunc WriteUOffsetT(buf []byte, n UOffsetT) {\n\tWriteUint32(buf, uint32(n))\n}\n"
  },
  {
    "path": "go/grpc.go",
    "content": "package flatbuffers\n\nimport \"errors\"\n\nvar (\n\t// Codec implements gRPC-go Codec which is used to encode and decode messages.\n\tCodec = \"flatbuffers\"\n\n\t// ErrInsufficientData is returned when the data is too short to read the root UOffsetT.\n\tErrInsufficientData = errors.New(\"insufficient data\")\n\n\t// ErrInvalidRootOffset is returned when the root UOffsetT is out of bounds.\n\tErrInvalidRootOffset = errors.New(\"invalid root offset\")\n)\n\n// FlatbuffersCodec defines the interface gRPC uses to encode and decode messages.  Note\n// that implementations of this interface must be thread safe; a Codec's\n// methods can be called from concurrent goroutines.\ntype FlatbuffersCodec struct{}\n\n// Marshal returns the wire format of v.\nfunc (FlatbuffersCodec) Marshal(v interface{}) ([]byte, error) {\n\treturn v.(*Builder).FinishedBytes(), nil\n}\n\n// Unmarshal parses the wire format into v.\nfunc (FlatbuffersCodec) Unmarshal(data []byte, v interface{}) error {\n\t// Need at least 4 bytes to read the root table offset (UOffsetT).\n\t// Vtable soffset_t and metadata are read later during field access.\n\tif len(data) < SizeUOffsetT {\n\t\treturn ErrInsufficientData\n\t}\n\n\toff := GetUOffsetT(data)\n\n\t// The root UOffsetT must be within the data buffer\n\t// Compare in the unsigned domain to avoid signedness pitfalls\n\tif off > UOffsetT(len(data)-SizeUOffsetT) {\n\t\treturn ErrInvalidRootOffset\n\t}\n\n\tv.(flatbuffersInit).Init(data, off)\n\treturn nil\n}\n\n// String  old gRPC Codec interface func\nfunc (FlatbuffersCodec) String() string {\n\treturn Codec\n}\n\n// Name returns the name of the Codec implementation. The returned string\n// will be used as part of content type in transmission.  The result must be\n// static; the result cannot change between calls.\n//\n// add Name() for ForceCodec interface\nfunc (FlatbuffersCodec) Name() string {\n\treturn Codec\n}\n\ntype flatbuffersInit interface {\n\tInit(data []byte, i UOffsetT)\n}\n"
  },
  {
    "path": "go/lib.go",
    "content": "package flatbuffers\n\n// FlatBuffer is the interface that represents a flatbuffer.\ntype FlatBuffer interface {\n\tTable() Table\n\tInit(buf []byte, i UOffsetT)\n}\n\n// GetRootAs is a generic helper to initialize a FlatBuffer with the provided buffer bytes and its data offset.\nfunc GetRootAs(buf []byte, offset UOffsetT, fb FlatBuffer) {\n\tn := GetUOffsetT(buf[offset:])\n\tfb.Init(buf, n+offset)\n}\n\n// GetSizePrefixedRootAs is a generic helper to initialize a FlatBuffer with the provided size-prefixed buffer\n// bytes and its data offset\nfunc GetSizePrefixedRootAs(buf []byte, offset UOffsetT, fb FlatBuffer) {\n\tn := GetUOffsetT(buf[offset+sizePrefixLength:])\n\tfb.Init(buf, n+offset+sizePrefixLength)\n}\n\n// GetSizePrefix reads the size from a size-prefixed flatbuffer\nfunc GetSizePrefix(buf []byte, offset UOffsetT) uint32 {\n\treturn GetUint32(buf[offset:])\n}\n\n// GetIndirectOffset retrives the relative offset in the provided buffer stored at `offset`.\nfunc GetIndirectOffset(buf []byte, offset UOffsetT) UOffsetT {\n\treturn offset + GetUOffsetT(buf[offset:])\n}\n\n// GetBufferIdentifier returns the file identifier as string\nfunc GetBufferIdentifier(buf []byte) string {\n\treturn string(buf[SizeUOffsetT:][:fileIdentifierLength])\n}\n\n// GetBufferIdentifier returns the file identifier as string for a size-prefixed buffer\nfunc GetSizePrefixedBufferIdentifier(buf []byte) string {\n\treturn string(buf[SizeUOffsetT+sizePrefixLength:][:fileIdentifierLength])\n}\n\n// BufferHasIdentifier checks if the identifier in a buffer has the expected value\nfunc BufferHasIdentifier(buf []byte, identifier string) bool {\n\treturn GetBufferIdentifier(buf) == identifier\n}\n\n// BufferHasIdentifier checks if the identifier in a buffer has the expected value for a size-prefixed buffer\nfunc SizePrefixedBufferHasIdentifier(buf []byte, identifier string) bool {\n\treturn GetSizePrefixedBufferIdentifier(buf) == identifier\n}\n"
  },
  {
    "path": "go/sizes.go",
    "content": "package flatbuffers\n\nimport (\n\t\"unsafe\"\n)\n\nconst (\n\t// See http://golang.org/ref/spec#Numeric_types\n\n\t// SizeUint8 is the byte size of a uint8.\n\tSizeUint8 = 1\n\t// SizeUint16 is the byte size of a uint16.\n\tSizeUint16 = 2\n\t// SizeUint32 is the byte size of a uint32.\n\tSizeUint32 = 4\n\t// SizeUint64 is the byte size of a uint64.\n\tSizeUint64 = 8\n\n\t// SizeInt8 is the byte size of a int8.\n\tSizeInt8 = 1\n\t// SizeInt16 is the byte size of a int16.\n\tSizeInt16 = 2\n\t// SizeInt32 is the byte size of a int32.\n\tSizeInt32 = 4\n\t// SizeInt64 is the byte size of a int64.\n\tSizeInt64 = 8\n\n\t// SizeFloat32 is the byte size of a float32.\n\tSizeFloat32 = 4\n\t// SizeFloat64 is the byte size of a float64.\n\tSizeFloat64 = 8\n\n\t// SizeByte is the byte size of a byte.\n\t// The `byte` type is aliased (by Go definition) to uint8.\n\tSizeByte = 1\n\n\t// SizeBool is the byte size of a bool.\n\t// The `bool` type is aliased (by flatbuffers convention) to uint8.\n\tSizeBool = 1\n\n\t// SizeSOffsetT is the byte size of an SOffsetT.\n\t// The `SOffsetT` type is aliased (by flatbuffers convention) to int32.\n\tSizeSOffsetT = 4\n\t// SizeUOffsetT is the byte size of an UOffsetT.\n\t// The `UOffsetT` type is aliased (by flatbuffers convention) to uint32.\n\tSizeUOffsetT = 4\n\t// SizeVOffsetT is the byte size of an VOffsetT.\n\t// The `VOffsetT` type is aliased (by flatbuffers convention) to uint16.\n\tSizeVOffsetT = 2\n)\n\n// byteSliceToString converts a []byte to string without a heap allocation.\nfunc byteSliceToString(b []byte) string {\n\treturn *(*string)(unsafe.Pointer(&b))\n}\n"
  },
  {
    "path": "go/struct.go",
    "content": "package flatbuffers\n\n// Struct wraps a byte slice and provides read access to its data.\n//\n// Structs do not have a vtable.\ntype Struct struct {\n\tTable\n}\n"
  },
  {
    "path": "go/table.go",
    "content": "package flatbuffers\n\n// Table wraps a byte slice and provides read access to its data.\n//\n// The variable `Pos` indicates the root of the FlatBuffers object therein.\ntype Table struct {\n\tBytes []byte\n\tPos   UOffsetT // Always < 1<<31.\n}\n\n// Offset provides access into the Table's vtable.\n//\n// Fields which are deprecated are ignored by checking against the vtable's length.\nfunc (t *Table) Offset(vtableOffset VOffsetT) VOffsetT {\n\tvtable := UOffsetT(SOffsetT(t.Pos) - t.GetSOffsetT(t.Pos))\n\tif vtableOffset < t.GetVOffsetT(vtable) {\n\t\treturn t.GetVOffsetT(vtable + UOffsetT(vtableOffset))\n\t}\n\treturn 0\n}\n\n// Indirect retrieves the relative offset stored at `offset`.\nfunc (t *Table) Indirect(off UOffsetT) UOffsetT {\n\treturn off + GetUOffsetT(t.Bytes[off:])\n}\n\n// String gets a string from data stored inside the flatbuffer.\nfunc (t *Table) String(off UOffsetT) string {\n\tb := t.ByteVector(off)\n\treturn byteSliceToString(b)\n}\n\n// ByteVector gets a byte slice from data stored inside the flatbuffer.\n// If the offset is invalid or out of bounds, returns nil to prevent crashes.\nfunc (t *Table) ByteVector(off UOffsetT) []byte {\n\tn := UOffsetT(len(t.Bytes))\n\t// Need at least SizeUOffsetT bytes to read the relative vector offset.\n\tu := UOffsetT(SizeUOffsetT)\n\tif n < u || off > n-u {\n\t\treturn nil\n\t}\n\toff += GetUOffsetT(t.Bytes[off:])\n\t// Need at least SizeUOffsetT bytes to read the vector length.\n\tif n < u || off > n-u {\n\t\treturn nil\n\t}\n\tstart := off + UOffsetT(SizeUOffsetT)\n\tlength := GetUOffsetT(t.Bytes[off:])\n\t// Avoid overflow by checking the length against the remaining buffer space.\n\tif length > n-start {\n\t\treturn nil\n\t}\n\treturn t.Bytes[start : start+length]\n}\n\n// VectorLen retrieves the length of the vector whose offset is stored at\n// \"off\" in this object.\nfunc (t *Table) VectorLen(off UOffsetT) int {\n\toff += t.Pos\n\toff += GetUOffsetT(t.Bytes[off:])\n\treturn int(GetUOffsetT(t.Bytes[off:]))\n}\n\n// Vector retrieves the start of data of the vector whose offset is stored\n// at \"off\" in this object.\nfunc (t *Table) Vector(off UOffsetT) UOffsetT {\n\toff += t.Pos\n\tx := off + GetUOffsetT(t.Bytes[off:])\n\t// data starts after metadata containing the vector length\n\tx += UOffsetT(SizeUOffsetT)\n\treturn x\n}\n\n// Union initializes any Table-derived type to point to the union at the given\n// offset.\nfunc (t *Table) Union(t2 *Table, off UOffsetT) {\n\toff += t.Pos\n\tt2.Pos = off + t.GetUOffsetT(off)\n\tt2.Bytes = t.Bytes\n}\n\n// GetBool retrieves a bool at the given offset.\nfunc (t *Table) GetBool(off UOffsetT) bool {\n\treturn GetBool(t.Bytes[off:])\n}\n\n// GetByte retrieves a byte at the given offset.\nfunc (t *Table) GetByte(off UOffsetT) byte {\n\treturn GetByte(t.Bytes[off:])\n}\n\n// GetUint8 retrieves a uint8 at the given offset.\nfunc (t *Table) GetUint8(off UOffsetT) uint8 {\n\treturn GetUint8(t.Bytes[off:])\n}\n\n// GetUint16 retrieves a uint16 at the given offset.\nfunc (t *Table) GetUint16(off UOffsetT) uint16 {\n\treturn GetUint16(t.Bytes[off:])\n}\n\n// GetUint32 retrieves a uint32 at the given offset.\nfunc (t *Table) GetUint32(off UOffsetT) uint32 {\n\treturn GetUint32(t.Bytes[off:])\n}\n\n// GetUint64 retrieves a uint64 at the given offset.\nfunc (t *Table) GetUint64(off UOffsetT) uint64 {\n\treturn GetUint64(t.Bytes[off:])\n}\n\n// GetInt8 retrieves a int8 at the given offset.\nfunc (t *Table) GetInt8(off UOffsetT) int8 {\n\treturn GetInt8(t.Bytes[off:])\n}\n\n// GetInt16 retrieves a int16 at the given offset.\nfunc (t *Table) GetInt16(off UOffsetT) int16 {\n\treturn GetInt16(t.Bytes[off:])\n}\n\n// GetInt32 retrieves a int32 at the given offset.\nfunc (t *Table) GetInt32(off UOffsetT) int32 {\n\treturn GetInt32(t.Bytes[off:])\n}\n\n// GetInt64 retrieves a int64 at the given offset.\nfunc (t *Table) GetInt64(off UOffsetT) int64 {\n\treturn GetInt64(t.Bytes[off:])\n}\n\n// GetFloat32 retrieves a float32 at the given offset.\nfunc (t *Table) GetFloat32(off UOffsetT) float32 {\n\treturn GetFloat32(t.Bytes[off:])\n}\n\n// GetFloat64 retrieves a float64 at the given offset.\nfunc (t *Table) GetFloat64(off UOffsetT) float64 {\n\treturn GetFloat64(t.Bytes[off:])\n}\n\n// GetUOffsetT retrieves a UOffsetT at the given offset.\nfunc (t *Table) GetUOffsetT(off UOffsetT) UOffsetT {\n\treturn GetUOffsetT(t.Bytes[off:])\n}\n\n// GetVOffsetT retrieves a VOffsetT at the given offset.\nfunc (t *Table) GetVOffsetT(off UOffsetT) VOffsetT {\n\treturn GetVOffsetT(t.Bytes[off:])\n}\n\n// GetSOffsetT retrieves a SOffsetT at the given offset.\nfunc (t *Table) GetSOffsetT(off UOffsetT) SOffsetT {\n\treturn GetSOffsetT(t.Bytes[off:])\n}\n\n// GetBoolSlot retrieves the bool that the given vtable location\n// points to. If the vtable value is zero, the default value `d`\n// will be returned.\nfunc (t *Table) GetBoolSlot(slot VOffsetT, d bool) bool {\n\toff := t.Offset(slot)\n\tif off == 0 {\n\t\treturn d\n\t}\n\n\treturn t.GetBool(t.Pos + UOffsetT(off))\n}\n\n// GetByteSlot retrieves the byte that the given vtable location\n// points to. If the vtable value is zero, the default value `d`\n// will be returned.\nfunc (t *Table) GetByteSlot(slot VOffsetT, d byte) byte {\n\toff := t.Offset(slot)\n\tif off == 0 {\n\t\treturn d\n\t}\n\n\treturn t.GetByte(t.Pos + UOffsetT(off))\n}\n\n// GetInt8Slot retrieves the int8 that the given vtable location\n// points to. If the vtable value is zero, the default value `d`\n// will be returned.\nfunc (t *Table) GetInt8Slot(slot VOffsetT, d int8) int8 {\n\toff := t.Offset(slot)\n\tif off == 0 {\n\t\treturn d\n\t}\n\n\treturn t.GetInt8(t.Pos + UOffsetT(off))\n}\n\n// GetUint8Slot retrieves the uint8 that the given vtable location\n// points to. If the vtable value is zero, the default value `d`\n// will be returned.\nfunc (t *Table) GetUint8Slot(slot VOffsetT, d uint8) uint8 {\n\toff := t.Offset(slot)\n\tif off == 0 {\n\t\treturn d\n\t}\n\n\treturn t.GetUint8(t.Pos + UOffsetT(off))\n}\n\n// GetInt16Slot retrieves the int16 that the given vtable location\n// points to. If the vtable value is zero, the default value `d`\n// will be returned.\nfunc (t *Table) GetInt16Slot(slot VOffsetT, d int16) int16 {\n\toff := t.Offset(slot)\n\tif off == 0 {\n\t\treturn d\n\t}\n\n\treturn t.GetInt16(t.Pos + UOffsetT(off))\n}\n\n// GetUint16Slot retrieves the uint16 that the given vtable location\n// points to. If the vtable value is zero, the default value `d`\n// will be returned.\nfunc (t *Table) GetUint16Slot(slot VOffsetT, d uint16) uint16 {\n\toff := t.Offset(slot)\n\tif off == 0 {\n\t\treturn d\n\t}\n\n\treturn t.GetUint16(t.Pos + UOffsetT(off))\n}\n\n// GetInt32Slot retrieves the int32 that the given vtable location\n// points to. If the vtable value is zero, the default value `d`\n// will be returned.\nfunc (t *Table) GetInt32Slot(slot VOffsetT, d int32) int32 {\n\toff := t.Offset(slot)\n\tif off == 0 {\n\t\treturn d\n\t}\n\n\treturn t.GetInt32(t.Pos + UOffsetT(off))\n}\n\n// GetUint32Slot retrieves the uint32 that the given vtable location\n// points to. If the vtable value is zero, the default value `d`\n// will be returned.\nfunc (t *Table) GetUint32Slot(slot VOffsetT, d uint32) uint32 {\n\toff := t.Offset(slot)\n\tif off == 0 {\n\t\treturn d\n\t}\n\n\treturn t.GetUint32(t.Pos + UOffsetT(off))\n}\n\n// GetInt64Slot retrieves the int64 that the given vtable location\n// points to. If the vtable value is zero, the default value `d`\n// will be returned.\nfunc (t *Table) GetInt64Slot(slot VOffsetT, d int64) int64 {\n\toff := t.Offset(slot)\n\tif off == 0 {\n\t\treturn d\n\t}\n\n\treturn t.GetInt64(t.Pos + UOffsetT(off))\n}\n\n// GetUint64Slot retrieves the uint64 that the given vtable location\n// points to. If the vtable value is zero, the default value `d`\n// will be returned.\nfunc (t *Table) GetUint64Slot(slot VOffsetT, d uint64) uint64 {\n\toff := t.Offset(slot)\n\tif off == 0 {\n\t\treturn d\n\t}\n\n\treturn t.GetUint64(t.Pos + UOffsetT(off))\n}\n\n// GetFloat32Slot retrieves the float32 that the given vtable location\n// points to. If the vtable value is zero, the default value `d`\n// will be returned.\nfunc (t *Table) GetFloat32Slot(slot VOffsetT, d float32) float32 {\n\toff := t.Offset(slot)\n\tif off == 0 {\n\t\treturn d\n\t}\n\n\treturn t.GetFloat32(t.Pos + UOffsetT(off))\n}\n\n// GetFloat64Slot retrieves the float64 that the given vtable location\n// points to. If the vtable value is zero, the default value `d`\n// will be returned.\nfunc (t *Table) GetFloat64Slot(slot VOffsetT, d float64) float64 {\n\toff := t.Offset(slot)\n\tif off == 0 {\n\t\treturn d\n\t}\n\n\treturn t.GetFloat64(t.Pos + UOffsetT(off))\n}\n\n// GetVOffsetTSlot retrieves the VOffsetT that the given vtable location\n// points to. If the vtable value is zero, the default value `d`\n// will be returned.\nfunc (t *Table) GetVOffsetTSlot(slot VOffsetT, d VOffsetT) VOffsetT {\n\toff := t.Offset(slot)\n\tif off == 0 {\n\t\treturn d\n\t}\n\treturn VOffsetT(off)\n}\n\n// MutateBool updates a bool at the given offset.\nfunc (t *Table) MutateBool(off UOffsetT, n bool) bool {\n\tWriteBool(t.Bytes[off:], n)\n\treturn true\n}\n\n// MutateByte updates a Byte at the given offset.\nfunc (t *Table) MutateByte(off UOffsetT, n byte) bool {\n\tWriteByte(t.Bytes[off:], n)\n\treturn true\n}\n\n// MutateUint8 updates a Uint8 at the given offset.\nfunc (t *Table) MutateUint8(off UOffsetT, n uint8) bool {\n\tWriteUint8(t.Bytes[off:], n)\n\treturn true\n}\n\n// MutateUint16 updates a Uint16 at the given offset.\nfunc (t *Table) MutateUint16(off UOffsetT, n uint16) bool {\n\tWriteUint16(t.Bytes[off:], n)\n\treturn true\n}\n\n// MutateUint32 updates a Uint32 at the given offset.\nfunc (t *Table) MutateUint32(off UOffsetT, n uint32) bool {\n\tWriteUint32(t.Bytes[off:], n)\n\treturn true\n}\n\n// MutateUint64 updates a Uint64 at the given offset.\nfunc (t *Table) MutateUint64(off UOffsetT, n uint64) bool {\n\tWriteUint64(t.Bytes[off:], n)\n\treturn true\n}\n\n// MutateInt8 updates a Int8 at the given offset.\nfunc (t *Table) MutateInt8(off UOffsetT, n int8) bool {\n\tWriteInt8(t.Bytes[off:], n)\n\treturn true\n}\n\n// MutateInt16 updates a Int16 at the given offset.\nfunc (t *Table) MutateInt16(off UOffsetT, n int16) bool {\n\tWriteInt16(t.Bytes[off:], n)\n\treturn true\n}\n\n// MutateInt32 updates a Int32 at the given offset.\nfunc (t *Table) MutateInt32(off UOffsetT, n int32) bool {\n\tWriteInt32(t.Bytes[off:], n)\n\treturn true\n}\n\n// MutateInt64 updates a Int64 at the given offset.\nfunc (t *Table) MutateInt64(off UOffsetT, n int64) bool {\n\tWriteInt64(t.Bytes[off:], n)\n\treturn true\n}\n\n// MutateFloat32 updates a Float32 at the given offset.\nfunc (t *Table) MutateFloat32(off UOffsetT, n float32) bool {\n\tWriteFloat32(t.Bytes[off:], n)\n\treturn true\n}\n\n// MutateFloat64 updates a Float64 at the given offset.\nfunc (t *Table) MutateFloat64(off UOffsetT, n float64) bool {\n\tWriteFloat64(t.Bytes[off:], n)\n\treturn true\n}\n\n// MutateUOffsetT updates a UOffsetT at the given offset.\nfunc (t *Table) MutateUOffsetT(off UOffsetT, n UOffsetT) bool {\n\tWriteUOffsetT(t.Bytes[off:], n)\n\treturn true\n}\n\n// MutateVOffsetT updates a VOffsetT at the given offset.\nfunc (t *Table) MutateVOffsetT(off UOffsetT, n VOffsetT) bool {\n\tWriteVOffsetT(t.Bytes[off:], n)\n\treturn true\n}\n\n// MutateSOffsetT updates a SOffsetT at the given offset.\nfunc (t *Table) MutateSOffsetT(off UOffsetT, n SOffsetT) bool {\n\tWriteSOffsetT(t.Bytes[off:], n)\n\treturn true\n}\n\n// MutateBoolSlot updates the bool at given vtable location\nfunc (t *Table) MutateBoolSlot(slot VOffsetT, n bool) bool {\n\tif off := t.Offset(slot); off != 0 {\n\t\tt.MutateBool(t.Pos+UOffsetT(off), n)\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n// MutateByteSlot updates the byte at given vtable location\nfunc (t *Table) MutateByteSlot(slot VOffsetT, n byte) bool {\n\tif off := t.Offset(slot); off != 0 {\n\t\tt.MutateByte(t.Pos+UOffsetT(off), n)\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n// MutateInt8Slot updates the int8 at given vtable location\nfunc (t *Table) MutateInt8Slot(slot VOffsetT, n int8) bool {\n\tif off := t.Offset(slot); off != 0 {\n\t\tt.MutateInt8(t.Pos+UOffsetT(off), n)\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n// MutateUint8Slot updates the uint8 at given vtable location\nfunc (t *Table) MutateUint8Slot(slot VOffsetT, n uint8) bool {\n\tif off := t.Offset(slot); off != 0 {\n\t\tt.MutateUint8(t.Pos+UOffsetT(off), n)\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n// MutateInt16Slot updates the int16 at given vtable location\nfunc (t *Table) MutateInt16Slot(slot VOffsetT, n int16) bool {\n\tif off := t.Offset(slot); off != 0 {\n\t\tt.MutateInt16(t.Pos+UOffsetT(off), n)\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n// MutateUint16Slot updates the uint16 at given vtable location\nfunc (t *Table) MutateUint16Slot(slot VOffsetT, n uint16) bool {\n\tif off := t.Offset(slot); off != 0 {\n\t\tt.MutateUint16(t.Pos+UOffsetT(off), n)\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n// MutateInt32Slot updates the int32 at given vtable location\nfunc (t *Table) MutateInt32Slot(slot VOffsetT, n int32) bool {\n\tif off := t.Offset(slot); off != 0 {\n\t\tt.MutateInt32(t.Pos+UOffsetT(off), n)\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n// MutateUint32Slot updates the uint32 at given vtable location\nfunc (t *Table) MutateUint32Slot(slot VOffsetT, n uint32) bool {\n\tif off := t.Offset(slot); off != 0 {\n\t\tt.MutateUint32(t.Pos+UOffsetT(off), n)\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n// MutateInt64Slot updates the int64 at given vtable location\nfunc (t *Table) MutateInt64Slot(slot VOffsetT, n int64) bool {\n\tif off := t.Offset(slot); off != 0 {\n\t\tt.MutateInt64(t.Pos+UOffsetT(off), n)\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n// MutateUint64Slot updates the uint64 at given vtable location\nfunc (t *Table) MutateUint64Slot(slot VOffsetT, n uint64) bool {\n\tif off := t.Offset(slot); off != 0 {\n\t\tt.MutateUint64(t.Pos+UOffsetT(off), n)\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n// MutateFloat32Slot updates the float32 at given vtable location\nfunc (t *Table) MutateFloat32Slot(slot VOffsetT, n float32) bool {\n\tif off := t.Offset(slot); off != 0 {\n\t\tt.MutateFloat32(t.Pos+UOffsetT(off), n)\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n// MutateFloat64Slot updates the float64 at given vtable location\nfunc (t *Table) MutateFloat64Slot(slot VOffsetT, n float64) bool {\n\tif off := t.Offset(slot); off != 0 {\n\t\tt.MutateFloat64(t.Pos+UOffsetT(off), n)\n\t\treturn true\n\t}\n\n\treturn false\n}\n"
  },
  {
    "path": "goldens/README.md",
    "content": "# Golden Generated Files\n\nThis directory is a repository for the generated files of `flatc`.\n\nWe check in the generated code so we can see, during a PR review, how the\nchanges affect the generated output. It's also useful as a reference to show\nhow things work across various languages.\n\nThese files are **NOT** intended to be depended on by any code, such as tests or\nor compiled examples.\n\n## Languages Specifics\n\nEach language should keep their generated code in their respective directories.\nHowever, the parent schemas can, and should, be shared so we have a consistent\nview of things across languages. These are kept in the `schema/` directory.\n\nSome languages may not support every generation feature, so each language is\nrequired to specify the `flatc` arguments individually.\n\n* Try to avoid includes and nested directories, preferring it as flat as\npossible.\n\n## Updating\n\nJust run the `generate_goldens.py` script and it should generate them all.\n"
  },
  {
    "path": "goldens/cpp/basic_generated.h",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n\n#ifndef FLATBUFFERS_GENERATED_BASIC_FLATBUFFERS_GOLDENS_H_\n#define FLATBUFFERS_GENERATED_BASIC_FLATBUFFERS_GOLDENS_H_\n\n#include \"flatbuffers/flatbuffers.h\"\n\n// Ensure the included flatbuffers.h is the same version as when this file was\n// generated, otherwise it may not be compatible.\nstatic_assert(FLATBUFFERS_VERSION_MAJOR == 25 &&\n              FLATBUFFERS_VERSION_MINOR == 12 &&\n              FLATBUFFERS_VERSION_REVISION == 19,\n             \"Non-compatible flatbuffers version included\");\n\nnamespace flatbuffers {\nnamespace goldens {\n\nstruct Galaxy;\nstruct GalaxyBuilder;\n\nstruct Universe;\nstruct UniverseBuilder;\n\nstruct Galaxy FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef GalaxyBuilder Builder;\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_NUM_STARS = 4\n  };\n  int64_t num_stars() const {\n    return GetField<int64_t>(VT_NUM_STARS, 0);\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyField<int64_t>(verifier, VT_NUM_STARS, 8) &&\n           verifier.EndTable();\n  }\n};\n\nstruct GalaxyBuilder {\n  typedef Galaxy Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_num_stars(int64_t num_stars) {\n    fbb_.AddElement<int64_t>(Galaxy::VT_NUM_STARS, num_stars, 0);\n  }\n  explicit GalaxyBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<Galaxy> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<Galaxy>(end);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<Galaxy> CreateGalaxy(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    int64_t num_stars = 0) {\n  GalaxyBuilder builder_(_fbb);\n  builder_.add_num_stars(num_stars);\n  return builder_.Finish();\n}\n\nstruct Universe FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef UniverseBuilder Builder;\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_AGE = 4,\n    VT_GALAXIES = 6\n  };\n  double age() const {\n    return GetField<double>(VT_AGE, 0.0);\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<flatbuffers::goldens::Galaxy>> *galaxies() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<flatbuffers::goldens::Galaxy>> *>(VT_GALAXIES);\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyField<double>(verifier, VT_AGE, 8) &&\n           VerifyOffset(verifier, VT_GALAXIES) &&\n           verifier.VerifyVector(galaxies()) &&\n           verifier.VerifyVectorOfTables(galaxies()) &&\n           verifier.EndTable();\n  }\n};\n\nstruct UniverseBuilder {\n  typedef Universe Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_age(double age) {\n    fbb_.AddElement<double>(Universe::VT_AGE, age, 0.0);\n  }\n  void add_galaxies(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<flatbuffers::goldens::Galaxy>>> galaxies) {\n    fbb_.AddOffset(Universe::VT_GALAXIES, galaxies);\n  }\n  explicit UniverseBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<Universe> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<Universe>(end);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<Universe> CreateUniverse(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    double age = 0.0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<flatbuffers::goldens::Galaxy>>> galaxies = 0) {\n  UniverseBuilder builder_(_fbb);\n  builder_.add_age(age);\n  builder_.add_galaxies(galaxies);\n  return builder_.Finish();\n}\n\ninline ::flatbuffers::Offset<Universe> CreateUniverseDirect(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    double age = 0.0,\n    const std::vector<::flatbuffers::Offset<flatbuffers::goldens::Galaxy>> *galaxies = nullptr) {\n  auto galaxies__ = galaxies ? _fbb.CreateVector<::flatbuffers::Offset<flatbuffers::goldens::Galaxy>>(*galaxies) : 0;\n  return flatbuffers::goldens::CreateUniverse(\n      _fbb,\n      age,\n      galaxies__);\n}\n\ninline const flatbuffers::goldens::Universe *GetUniverse(const void *buf) {\n  return ::flatbuffers::GetRoot<flatbuffers::goldens::Universe>(buf);\n}\n\ninline const flatbuffers::goldens::Universe *GetSizePrefixedUniverse(const void *buf) {\n  return ::flatbuffers::GetSizePrefixedRoot<flatbuffers::goldens::Universe>(buf);\n}\n\ntemplate <bool B = false>\ninline bool VerifyUniverseBuffer(\n    ::flatbuffers::VerifierTemplate<B> &verifier) {\n  return verifier.template VerifyBuffer<flatbuffers::goldens::Universe>(nullptr);\n}\n\ntemplate <bool B = false>\ninline bool VerifySizePrefixedUniverseBuffer(\n    ::flatbuffers::VerifierTemplate<B> &verifier) {\n  return verifier.template VerifySizePrefixedBuffer<flatbuffers::goldens::Universe>(nullptr);\n}\n\ninline void FinishUniverseBuffer(\n    ::flatbuffers::FlatBufferBuilder &fbb,\n    ::flatbuffers::Offset<flatbuffers::goldens::Universe> root) {\n  fbb.Finish(root);\n}\n\ninline void FinishSizePrefixedUniverseBuffer(\n    ::flatbuffers::FlatBufferBuilder &fbb,\n    ::flatbuffers::Offset<flatbuffers::goldens::Universe> root) {\n  fbb.FinishSizePrefixed(root);\n}\n\n}  // namespace goldens\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_GENERATED_BASIC_FLATBUFFERS_GOLDENS_H_\n"
  },
  {
    "path": "goldens/cpp/generate.py",
    "content": "from golden_utils import flatc_golden\n\n\ndef flatc(options, schema):\n  # Wrap the golden flatc generator with C++ specifics\n  flatc_golden(options=[\"--cpp\"] + options, schema=schema, prefix=\"cpp\")\n\n\ndef GenerateCpp():\n  flatc([], \"basic.fbs\")\n"
  },
  {
    "path": "goldens/csharp/flatbuffers/goldens/Galaxy.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace flatbuffers.goldens\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct Galaxy : IFlatbufferObject\n{\n  private Table __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_25_12_19(); }\n  public static Galaxy GetRootAsGalaxy(ByteBuffer _bb) { return GetRootAsGalaxy(_bb, new Galaxy()); }\n  public static Galaxy GetRootAsGalaxy(ByteBuffer _bb, Galaxy obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }\n  public Galaxy __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public long NumStars { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetLong(o + __p.bb_pos) : (long)0; } }\n\n  public static Offset<flatbuffers.goldens.Galaxy> CreateGalaxy(FlatBufferBuilder builder,\n      long num_stars = 0) {\n    builder.StartTable(1);\n    Galaxy.AddNumStars(builder, num_stars);\n    return Galaxy.EndGalaxy(builder);\n  }\n\n  public static void StartGalaxy(FlatBufferBuilder builder) { builder.StartTable(1); }\n  public static void AddNumStars(FlatBufferBuilder builder, long numStars) { builder.AddLong(0, numStars, 0); }\n  public static Offset<flatbuffers.goldens.Galaxy> EndGalaxy(FlatBufferBuilder builder) {\n    int o = builder.EndTable();\n    return new Offset<flatbuffers.goldens.Galaxy>(o);\n  }\n}\n\n\nstatic public class GalaxyVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos)\n  {\n    return verifier.VerifyTableStart(tablePos)\n      && verifier.VerifyField(tablePos, 4 /*NumStars*/, 8 /*long*/, 8, false)\n      && verifier.VerifyTableEnd(tablePos);\n  }\n}\n\n}\n"
  },
  {
    "path": "goldens/csharp/flatbuffers/goldens/Universe.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace flatbuffers.goldens\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct Universe : IFlatbufferObject\n{\n  private Table __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_25_12_19(); }\n  public static Universe GetRootAsUniverse(ByteBuffer _bb) { return GetRootAsUniverse(_bb, new Universe()); }\n  public static Universe GetRootAsUniverse(ByteBuffer _bb, Universe obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }\n  public static bool VerifyUniverse(ByteBuffer _bb) {Google.FlatBuffers.Verifier verifier = new Google.FlatBuffers.Verifier(_bb); return verifier.VerifyBuffer(\"\", false, UniverseVerify.Verify); }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }\n  public Universe __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public double Age { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetDouble(o + __p.bb_pos) : (double)0.0; } }\n  public flatbuffers.goldens.Galaxy? Galaxies(int j) { int o = __p.__offset(6); return o != 0 ? (flatbuffers.goldens.Galaxy?)(new flatbuffers.goldens.Galaxy()).__assign(__p.__indirect(__p.__vector(o) + j * 4), __p.bb) : null; }\n  public int GalaxiesLength { get { int o = __p.__offset(6); return o != 0 ? __p.__vector_len(o) : 0; } }\n\n  public static Offset<flatbuffers.goldens.Universe> CreateUniverse(FlatBufferBuilder builder,\n      double age = 0.0,\n      VectorOffset galaxiesOffset = default(VectorOffset)) {\n    builder.StartTable(2);\n    Universe.AddAge(builder, age);\n    Universe.AddGalaxies(builder, galaxiesOffset);\n    return Universe.EndUniverse(builder);\n  }\n\n  public static void StartUniverse(FlatBufferBuilder builder) { builder.StartTable(2); }\n  public static void AddAge(FlatBufferBuilder builder, double age) { builder.AddDouble(0, age, 0.0); }\n  public static void AddGalaxies(FlatBufferBuilder builder, VectorOffset galaxiesOffset) { builder.AddOffset(1, galaxiesOffset.Value, 0); }\n  public static VectorOffset CreateGalaxiesVector(FlatBufferBuilder builder, Offset<flatbuffers.goldens.Galaxy>[] data) { builder.StartVector(4, data.Length, 4); for (int i = data.Length - 1; i >= 0; i--) builder.AddOffset(data[i].Value); return builder.EndVector(); }\n  public static VectorOffset CreateGalaxiesVectorBlock(FlatBufferBuilder builder, Offset<flatbuffers.goldens.Galaxy>[] data) { builder.StartVector(4, data.Length, 4); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateGalaxiesVectorBlock(FlatBufferBuilder builder, ArraySegment<Offset<flatbuffers.goldens.Galaxy>> data) { builder.StartVector(4, data.Count, 4); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateGalaxiesVectorBlock(FlatBufferBuilder builder, IntPtr dataPtr, int sizeInBytes) { builder.StartVector(1, sizeInBytes, 1); builder.Add<Offset<flatbuffers.goldens.Galaxy>>(dataPtr, sizeInBytes); return builder.EndVector(); }\n  public static void StartGalaxiesVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 4); }\n  public static Offset<flatbuffers.goldens.Universe> EndUniverse(FlatBufferBuilder builder) {\n    int o = builder.EndTable();\n    return new Offset<flatbuffers.goldens.Universe>(o);\n  }\n  public static void FinishUniverseBuffer(FlatBufferBuilder builder, Offset<flatbuffers.goldens.Universe> offset) { builder.Finish(offset.Value); }\n  public static void FinishSizePrefixedUniverseBuffer(FlatBufferBuilder builder, Offset<flatbuffers.goldens.Universe> offset) { builder.FinishSizePrefixed(offset.Value); }\n}\n\n\nstatic public class UniverseVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos)\n  {\n    return verifier.VerifyTableStart(tablePos)\n      && verifier.VerifyField(tablePos, 4 /*Age*/, 8 /*double*/, 8, false)\n      && verifier.VerifyVectorOfTables(tablePos, 6 /*Galaxies*/, flatbuffers.goldens.GalaxyVerify.Verify, false)\n      && verifier.VerifyTableEnd(tablePos);\n  }\n}\n\n}\n"
  },
  {
    "path": "goldens/csharp/generate.py",
    "content": "from golden_utils import flatc_golden\n\n\ndef flatc(options, schema):\n  # Wrap the golden flatc generator with C# specifics\n  flatc_golden(options=[\"--csharp\"] + options, schema=schema, prefix=\"csharp\")\n\n\ndef GenerateCSharp():\n  flatc([], \"basic.fbs\")\n"
  },
  {
    "path": "goldens/dart/basic_flatbuffers.goldens_generated.dart",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable, constant_identifier_names\n\nlibrary flatbuffers.goldens;\n\nimport 'dart:typed_data' show Uint8List;\nimport 'package:flat_buffers/flat_buffers.dart' as fb;\n\n\n\nclass Galaxy {\n  Galaxy._(this._bc, this._bcOffset);\n  factory Galaxy(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<Galaxy> reader = _GalaxyReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  int get numStars => const fb.Int64Reader().vTableGet(_bc, _bcOffset, 4, 0);\n\n  @override\n  String toString() {\n    return 'Galaxy{numStars: ${numStars}}';\n  }\n}\n\nclass _GalaxyReader extends fb.TableReader<Galaxy> {\n  const _GalaxyReader();\n\n  @override\n  Galaxy createObject(fb.BufferContext bc, int offset) => \n    Galaxy._(bc, offset);\n}\n\nclass GalaxyBuilder {\n  GalaxyBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  void begin() {\n    fbBuilder.startTable(1);\n  }\n\n  int addNumStars(int? numStars) {\n    fbBuilder.addInt64(0, numStars);\n    return fbBuilder.offset;\n  }\n\n  int finish() {\n    return fbBuilder.endTable();\n  }\n}\n\nclass GalaxyObjectBuilder extends fb.ObjectBuilder {\n  final int? _numStars;\n\n  GalaxyObjectBuilder({\n    int? numStars,\n  })\n      : _numStars = numStars;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    fbBuilder.startTable(1);\n    fbBuilder.addInt64(0, _numStars);\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\nclass Universe {\n  Universe._(this._bc, this._bcOffset);\n  factory Universe(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<Universe> reader = _UniverseReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  double get age => const fb.Float64Reader().vTableGet(_bc, _bcOffset, 4, 0.0);\n  List<Galaxy>? get galaxies => const fb.ListReader<Galaxy>(Galaxy.reader).vTableGetNullable(_bc, _bcOffset, 6);\n\n  @override\n  String toString() {\n    return 'Universe{age: ${age}, galaxies: ${galaxies}}';\n  }\n}\n\nclass _UniverseReader extends fb.TableReader<Universe> {\n  const _UniverseReader();\n\n  @override\n  Universe createObject(fb.BufferContext bc, int offset) => \n    Universe._(bc, offset);\n}\n\nclass UniverseBuilder {\n  UniverseBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  void begin() {\n    fbBuilder.startTable(2);\n  }\n\n  int addAge(double? age) {\n    fbBuilder.addFloat64(0, age);\n    return fbBuilder.offset;\n  }\n  int addGalaxiesOffset(int? offset) {\n    fbBuilder.addOffset(1, offset);\n    return fbBuilder.offset;\n  }\n\n  int finish() {\n    return fbBuilder.endTable();\n  }\n}\n\nclass UniverseObjectBuilder extends fb.ObjectBuilder {\n  final double? _age;\n  final List<GalaxyObjectBuilder>? _galaxies;\n\n  UniverseObjectBuilder({\n    double? age,\n    List<GalaxyObjectBuilder>? galaxies,\n  })\n      : _age = age,\n        _galaxies = galaxies;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    final int? galaxiesOffset = _galaxies == null ? null\n        : fbBuilder.writeList(_galaxies!.map((b) => b.getOrCreateOffset(fbBuilder)).toList());\n    fbBuilder.startTable(2);\n    fbBuilder.addFloat64(0, _age);\n    fbBuilder.addOffset(1, galaxiesOffset);\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n"
  },
  {
    "path": "goldens/dart/generate.py",
    "content": "from golden_utils import flatc_golden\n\n\ndef flatc(options, schema):\n  # Wrap the golden flatc generator with Dart specifics\n  flatc_golden(options=[\"--dart\"] + options, schema=schema, prefix=\"dart\")\n\n\ndef GenerateDart():\n  flatc([], \"basic.fbs\")\n"
  },
  {
    "path": "goldens/generate_goldens.py",
    "content": "#!/usr/bin/env python3\n\nfrom cpp.generate import GenerateCpp\nfrom csharp.generate import GenerateCSharp\nfrom dart.generate import GenerateDart\nfrom go.generate import GenerateGo\nfrom java.generate import GenerateJava\nfrom kotlin.generate import GenerateKotlin\nfrom lobster.generate import GenerateLobster\nfrom lua.generate import GenerateLua\nfrom nim.generate import GenerateNim\nfrom php.generate import GeneratePhp\nfrom py.generate import GeneratePython\nfrom rust.generate import GenerateRust\nfrom swift.generate import GenerateSwift\nfrom ts.generate import GenerateTs\n\n# Run each language generation logic\nGenerateCpp()\nGenerateCSharp()\nGenerateDart()\nGenerateGo()\nGenerateJava()\nGenerateKotlin()\nGenerateLobster()\nGenerateLua()\nGenerateNim()\nGeneratePhp()\nGeneratePython()\nGenerateRust()\nGenerateSwift()\nGenerateTs()\n"
  },
  {
    "path": "goldens/go/flatbuffers/goldens/Galaxy.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage goldens\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n)\n\ntype Galaxy struct {\n\t_tab flatbuffers.Table\n}\n\nfunc GetRootAsGalaxy(buf []byte, offset flatbuffers.UOffsetT) *Galaxy {\n\tn := flatbuffers.GetUOffsetT(buf[offset:])\n\tx := &Galaxy{}\n\tx.Init(buf, n+offset)\n\treturn x\n}\n\nfunc FinishGalaxyBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {\n\tbuilder.Finish(offset)\n}\n\nfunc GetSizePrefixedRootAsGalaxy(buf []byte, offset flatbuffers.UOffsetT) *Galaxy {\n\tn := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])\n\tx := &Galaxy{}\n\tx.Init(buf, n+offset+flatbuffers.SizeUint32)\n\treturn x\n}\n\nfunc FinishSizePrefixedGalaxyBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {\n\tbuilder.FinishSizePrefixed(offset)\n}\n\nfunc (rcv *Galaxy) Init(buf []byte, i flatbuffers.UOffsetT) {\n\trcv._tab.Bytes = buf\n\trcv._tab.Pos = i\n}\n\nfunc (rcv *Galaxy) Table() flatbuffers.Table {\n\treturn rcv._tab\n}\n\nfunc (rcv *Galaxy) NumStars() int64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(4))\n\tif o != 0 {\n\t\treturn rcv._tab.GetInt64(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Galaxy) MutateNumStars(n int64) bool {\n\treturn rcv._tab.MutateInt64Slot(4, n)\n}\n\nfunc GalaxyStart(builder *flatbuffers.Builder) {\n\tbuilder.StartObject(1)\n}\nfunc GalaxyAddNumStars(builder *flatbuffers.Builder, numStars int64) {\n\tbuilder.PrependInt64Slot(0, numStars, 0)\n}\nfunc GalaxyEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\treturn builder.EndObject()\n}\n"
  },
  {
    "path": "goldens/go/flatbuffers/goldens/Universe.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage goldens\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n)\n\ntype Universe struct {\n\t_tab flatbuffers.Table\n}\n\nfunc GetRootAsUniverse(buf []byte, offset flatbuffers.UOffsetT) *Universe {\n\tn := flatbuffers.GetUOffsetT(buf[offset:])\n\tx := &Universe{}\n\tx.Init(buf, n+offset)\n\treturn x\n}\n\nfunc FinishUniverseBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {\n\tbuilder.Finish(offset)\n}\n\nfunc GetSizePrefixedRootAsUniverse(buf []byte, offset flatbuffers.UOffsetT) *Universe {\n\tn := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])\n\tx := &Universe{}\n\tx.Init(buf, n+offset+flatbuffers.SizeUint32)\n\treturn x\n}\n\nfunc FinishSizePrefixedUniverseBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {\n\tbuilder.FinishSizePrefixed(offset)\n}\n\nfunc (rcv *Universe) Init(buf []byte, i flatbuffers.UOffsetT) {\n\trcv._tab.Bytes = buf\n\trcv._tab.Pos = i\n}\n\nfunc (rcv *Universe) Table() flatbuffers.Table {\n\treturn rcv._tab\n}\n\nfunc (rcv *Universe) Age() float64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(4))\n\tif o != 0 {\n\t\treturn rcv._tab.GetFloat64(o + rcv._tab.Pos)\n\t}\n\treturn 0.0\n}\n\nfunc (rcv *Universe) MutateAge(n float64) bool {\n\treturn rcv._tab.MutateFloat64Slot(4, n)\n}\n\nfunc (rcv *Universe) Galaxies(obj *Galaxy, j int) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(6))\n\tif o != 0 {\n\t\tx := rcv._tab.Vector(o)\n\t\tx += flatbuffers.UOffsetT(j) * 4\n\t\tx = rcv._tab.Indirect(x)\n\t\tobj.Init(rcv._tab.Bytes, x)\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (rcv *Universe) GalaxiesLength() int {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(6))\n\tif o != 0 {\n\t\treturn rcv._tab.VectorLen(o)\n\t}\n\treturn 0\n}\n\nfunc UniverseStart(builder *flatbuffers.Builder) {\n\tbuilder.StartObject(2)\n}\nfunc UniverseAddAge(builder *flatbuffers.Builder, age float64) {\n\tbuilder.PrependFloat64Slot(0, age, 0.0)\n}\nfunc UniverseAddGalaxies(builder *flatbuffers.Builder, galaxies flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(1, flatbuffers.UOffsetT(galaxies), 0)\n}\nfunc UniverseStartGalaxiesVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {\n\treturn builder.StartVector(4, numElems, 4)\n}\nfunc UniverseEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\treturn builder.EndObject()\n}\n"
  },
  {
    "path": "goldens/go/generate.py",
    "content": "from golden_utils import flatc_golden\n\n\ndef flatc(options, schema):\n  # Wrap the golden flatc generator with Go specifics\n  flatc_golden(options=[\"--go\"] + options, schema=schema, prefix=\"go\")\n\n\ndef GenerateGo():\n  flatc([], \"basic.fbs\")\n"
  },
  {
    "path": "goldens/golden_utils.py",
    "content": "from pathlib import Path\nimport sys\n\n# Get the path where this script is located so we can invoke the script from\n# any directory and have the paths work correctly.\nscript_path = Path(__file__).parent.resolve()\n\n# Get the root path as an absolute path, so all derived paths are absolute.\nroot_path = script_path.parent.absolute()\n\n# Get the location of the schema\nschema_path = Path(script_path, \"schema\")\n\n# Too add the util package in /scripts/util.py\nsys.path.append(str(root_path.absolute()))\n\nfrom scripts.util import flatc\n\n\ndef flatc_golden(options, schema, prefix):\n  # wrap the generic flatc call with specifis for these goldens.\n  flatc(\n      options=options,\n      # where the files are generated, typically the language (e.g. \"cpp\").\n      prefix=prefix,\n      # The schema are relative to the schema directory.\n      schema=str(Path(schema_path, schema)),\n      # Run flatc from this location.\n      cwd=script_path,\n  )\n"
  },
  {
    "path": "goldens/java/flatbuffers/goldens/Galaxy.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage flatbuffers.goldens;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class Galaxy extends com.google.flatbuffers.Table {\n  public static void ValidateVersion() { Constants.FLATBUFFERS_25_12_19(); }\n  public static Galaxy getRootAsGalaxy(ByteBuffer _bb) { return getRootAsGalaxy(_bb, new Galaxy()); }\n  public static Galaxy getRootAsGalaxy(ByteBuffer _bb, Galaxy obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public Galaxy __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public long numStars() { int o = __offset(4); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }\n\n  public static int createGalaxy(FlatBufferBuilder builder,\n      long numStars) {\n    builder.startTable(1);\n    Galaxy.addNumStars(builder, numStars);\n    return Galaxy.endGalaxy(builder);\n  }\n\n  public static void startGalaxy(FlatBufferBuilder builder) { builder.startTable(1); }\n  public static void addNumStars(FlatBufferBuilder builder, long numStars) { builder.addLong(0, numStars, 0L); }\n  public static int endGalaxy(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    return o;\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public Galaxy get(int j) { return get(new Galaxy(), j); }\n    public Galaxy get(Galaxy obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); }\n  }\n}\n\n"
  },
  {
    "path": "goldens/java/flatbuffers/goldens/Universe.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage flatbuffers.goldens;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class Universe extends com.google.flatbuffers.Table {\n  public static void ValidateVersion() { Constants.FLATBUFFERS_25_12_19(); }\n  public static Universe getRootAsUniverse(ByteBuffer _bb) { return getRootAsUniverse(_bb, new Universe()); }\n  public static Universe getRootAsUniverse(ByteBuffer _bb, Universe obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public Universe __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public double age() { int o = __offset(4); return o != 0 ? bb.getDouble(o + bb_pos) : 0.0; }\n  public flatbuffers.goldens.Galaxy galaxies(int j) { return galaxies(new flatbuffers.goldens.Galaxy(), j); }\n  public flatbuffers.goldens.Galaxy galaxies(flatbuffers.goldens.Galaxy obj, int j) { int o = __offset(6); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }\n  public int galaxiesLength() { int o = __offset(6); return o != 0 ? __vector_len(o) : 0; }\n  public flatbuffers.goldens.Galaxy.Vector galaxiesVector() { return galaxiesVector(new flatbuffers.goldens.Galaxy.Vector()); }\n  public flatbuffers.goldens.Galaxy.Vector galaxiesVector(flatbuffers.goldens.Galaxy.Vector obj) { int o = __offset(6); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n\n  public static int createUniverse(FlatBufferBuilder builder,\n      double age,\n      int galaxiesOffset) {\n    builder.startTable(2);\n    Universe.addAge(builder, age);\n    Universe.addGalaxies(builder, galaxiesOffset);\n    return Universe.endUniverse(builder);\n  }\n\n  public static void startUniverse(FlatBufferBuilder builder) { builder.startTable(2); }\n  public static void addAge(FlatBufferBuilder builder, double age) { builder.addDouble(0, age, 0.0); }\n  public static void addGalaxies(FlatBufferBuilder builder, int galaxiesOffset) { builder.addOffset(1, galaxiesOffset, 0); }\n  public static int createGalaxiesVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }\n  public static void startGalaxiesVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static int endUniverse(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    return o;\n  }\n  public static void finishUniverseBuffer(FlatBufferBuilder builder, int offset) { builder.finish(offset); }\n  public static void finishSizePrefixedUniverseBuffer(FlatBufferBuilder builder, int offset) { builder.finishSizePrefixed(offset); }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public Universe get(int j) { return get(new Universe(), j); }\n    public Universe get(Universe obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); }\n  }\n}\n\n"
  },
  {
    "path": "goldens/java/generate.py",
    "content": "from golden_utils import flatc_golden\n\n\ndef flatc(options, schema):\n  # Wrap the golden flatc generator with Java specifics\n  flatc_golden(options=[\"--java\"] + options, schema=schema, prefix=\"java\")\n\n\ndef GenerateJava():\n  flatc([], \"basic.fbs\")\n"
  },
  {
    "path": "goldens/kotlin/flatbuffers/goldens/Galaxy.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage flatbuffers.goldens\n\nimport com.google.flatbuffers.BaseVector\nimport com.google.flatbuffers.BooleanVector\nimport com.google.flatbuffers.ByteVector\nimport com.google.flatbuffers.Constants\nimport com.google.flatbuffers.DoubleVector\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.FloatVector\nimport com.google.flatbuffers.LongVector\nimport com.google.flatbuffers.StringVector\nimport com.google.flatbuffers.Struct\nimport com.google.flatbuffers.Table\nimport com.google.flatbuffers.UnionVector\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport kotlin.math.sign\n\n@Suppress(\"unused\")\nclass Galaxy : Table() {\n\n    fun __init(_i: Int, _bb: ByteBuffer)  {\n        __reset(_i, _bb)\n    }\n    fun __assign(_i: Int, _bb: ByteBuffer) : Galaxy {\n        __init(_i, _bb)\n        return this\n    }\n    val numStars : Long\n        get() {\n            val o = __offset(4)\n            return if(o != 0) bb.getLong(o + bb_pos) else 0L\n        }\n    companion object {\n        fun validateVersion() = Constants.FLATBUFFERS_25_12_19()\n        fun getRootAsGalaxy(_bb: ByteBuffer): Galaxy = getRootAsGalaxy(_bb, Galaxy())\n        fun getRootAsGalaxy(_bb: ByteBuffer, obj: Galaxy): Galaxy {\n            _bb.order(ByteOrder.LITTLE_ENDIAN)\n            return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb))\n        }\n        fun createGalaxy(builder: FlatBufferBuilder, numStars: Long) : Int {\n            builder.startTable(1)\n            addNumStars(builder, numStars)\n            return endGalaxy(builder)\n        }\n        fun startGalaxy(builder: FlatBufferBuilder) = builder.startTable(1)\n        fun addNumStars(builder: FlatBufferBuilder, numStars: Long) = builder.addLong(0, numStars, 0L)\n        fun endGalaxy(builder: FlatBufferBuilder) : Int {\n            val o = builder.endTable()\n            return o\n        }\n    }\n}\n"
  },
  {
    "path": "goldens/kotlin/flatbuffers/goldens/Universe.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage flatbuffers.goldens\n\nimport com.google.flatbuffers.BaseVector\nimport com.google.flatbuffers.BooleanVector\nimport com.google.flatbuffers.ByteVector\nimport com.google.flatbuffers.Constants\nimport com.google.flatbuffers.DoubleVector\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.FloatVector\nimport com.google.flatbuffers.LongVector\nimport com.google.flatbuffers.StringVector\nimport com.google.flatbuffers.Struct\nimport com.google.flatbuffers.Table\nimport com.google.flatbuffers.UnionVector\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport kotlin.math.sign\n\n@Suppress(\"unused\")\nclass Universe : Table() {\n\n    fun __init(_i: Int, _bb: ByteBuffer)  {\n        __reset(_i, _bb)\n    }\n    fun __assign(_i: Int, _bb: ByteBuffer) : Universe {\n        __init(_i, _bb)\n        return this\n    }\n    val age : Double\n        get() {\n            val o = __offset(4)\n            return if(o != 0) bb.getDouble(o + bb_pos) else 0.0\n        }\n    fun galaxies(j: Int) : flatbuffers.goldens.Galaxy? = galaxies(flatbuffers.goldens.Galaxy(), j)\n    fun galaxies(obj: flatbuffers.goldens.Galaxy, j: Int) : flatbuffers.goldens.Galaxy? {\n        val o = __offset(6)\n        return if (o != 0) {\n            obj.__assign(__indirect(__vector(o) + j * 4), bb)\n        } else {\n            null\n        }\n    }\n    val galaxiesLength : Int\n        get() {\n            val o = __offset(6); return if (o != 0) __vector_len(o) else 0\n        }\n    companion object {\n        fun validateVersion() = Constants.FLATBUFFERS_25_12_19()\n        fun getRootAsUniverse(_bb: ByteBuffer): Universe = getRootAsUniverse(_bb, Universe())\n        fun getRootAsUniverse(_bb: ByteBuffer, obj: Universe): Universe {\n            _bb.order(ByteOrder.LITTLE_ENDIAN)\n            return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb))\n        }\n        fun createUniverse(builder: FlatBufferBuilder, age: Double, galaxiesOffset: Int) : Int {\n            builder.startTable(2)\n            addAge(builder, age)\n            addGalaxies(builder, galaxiesOffset)\n            return endUniverse(builder)\n        }\n        fun startUniverse(builder: FlatBufferBuilder) = builder.startTable(2)\n        fun addAge(builder: FlatBufferBuilder, age: Double) = builder.addDouble(0, age, 0.0)\n        fun addGalaxies(builder: FlatBufferBuilder, galaxies: Int) = builder.addOffset(1, galaxies, 0)\n        fun createGalaxiesVector(builder: FlatBufferBuilder, data: IntArray) : Int {\n            builder.startVector(4, data.size, 4)\n            for (i in data.size - 1 downTo 0) {\n                builder.addOffset(data[i])\n            }\n            return builder.endVector()\n        }\n        fun startGalaxiesVector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(4, numElems, 4)\n        fun endUniverse(builder: FlatBufferBuilder) : Int {\n            val o = builder.endTable()\n            return o\n        }\n        fun finishUniverseBuffer(builder: FlatBufferBuilder, offset: Int) = builder.finish(offset)\n        fun finishSizePrefixedUniverseBuffer(builder: FlatBufferBuilder, offset: Int) = builder.finishSizePrefixed(offset)\n    }\n}\n"
  },
  {
    "path": "goldens/kotlin/generate.py",
    "content": "from golden_utils import flatc_golden\n\n\ndef flatc(options, schema):\n  # Wrap the golden flatc generator with Kotlin specifics\n  flatc_golden(options=[\"--kotlin\"] + options, schema=schema, prefix=\"kotlin\")\n\n\ndef GenerateKotlin():\n  flatc([], \"basic.fbs\")\n"
  },
  {
    "path": "goldens/lobster/basic_generated.lobster",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\nimport flatbuffers\n\nnamespace flatbuffers.goldens\n\nclass Galaxy\n\nclass Universe\n\nclass Galaxy : flatbuffers.handle\n    def num_stars() -> int:\n        return flatbuffers.field_int64(buf_, pos_, 4, 0)\n\ndef GetRootAsGalaxy(buf:string): return Galaxy { buf, flatbuffers.indirect(buf, 0) }\n\nstruct GalaxyBuilder:\n    b_:flatbuffers.builder\n    def start():\n        b_.StartObject(1)\n        return this\n    def add_num_stars(num_stars:int):\n        b_.PrependInt64Slot(0, num_stars, 0)\n        return this\n    def end():\n        return b_.EndObject()\n\nclass Universe : flatbuffers.handle\n    def age() -> float:\n        return flatbuffers.field_float64(buf_, pos_, 4, 0.0)\n    def galaxies(i:int) -> flatbuffers.goldens.Galaxy:\n        return flatbuffers.goldens.Galaxy { buf_, flatbuffers.indirect(buf_, flatbuffers.field_vector(buf_, pos_, 6) + i * 4) }\n    def galaxies_length() -> int:\n        return flatbuffers.field_vector_len(buf_, pos_, 6)\n\ndef GetRootAsUniverse(buf:string): return Universe { buf, flatbuffers.indirect(buf, 0) }\n\nstruct UniverseBuilder:\n    b_:flatbuffers.builder\n    def start():\n        b_.StartObject(2)\n        return this\n    def add_age(age:float):\n        b_.PrependFloat64Slot(0, age, 0.0)\n        return this\n    def add_galaxies(galaxies:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(1, galaxies)\n        return this\n    def end():\n        return b_.EndObject()\n\ndef UniverseStartGalaxiesVector(b_:flatbuffers.builder, n_:int):\n    b_.StartVector(4, n_, 4)\ndef UniverseCreateGalaxiesVector(b_:flatbuffers.builder, v_:[flatbuffers.offset]):\n    b_.StartVector(4, v_.length, 4)\n    reverse(v_) e_: b_.PrependUOffsetTRelative(e_)\n    return b_.EndVector(v_.length)\n\n"
  },
  {
    "path": "goldens/lobster/generate.py",
    "content": "from golden_utils import flatc_golden\n\n\ndef flatc(options, schema):\n  # Wrap the golden flatc generator with Lobster specifics\n  flatc_golden(options=[\"--lobster\"] + options, schema=schema, prefix=\"lobster\")\n\n\ndef GenerateLobster():\n  flatc([], \"basic.fbs\")\n"
  },
  {
    "path": "goldens/lua/Galaxy.lua",
    "content": "--[[ Galaxy\n\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 23.5.26\n\n  Declared by  : //basic.fbs\n  Rooting type : Universe (//basic.fbs)\n\n--]]\n\nlocal flatbuffers = require('flatbuffers')\n\nlocal Galaxy = {}\nlocal mt = {}\n\nfunction Galaxy.New()\n  local o = {}\n  setmetatable(o, {__index = mt})\n  return o\nend\n\nfunction mt:Init(buf, pos)\n  self.view = flatbuffers.view.New(buf, pos)\nend\n\nfunction mt:NumStars()\n  local o = self.view:Offset(4)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Int64, self.view.pos + o)\n  end\n  return 0\nend\n\nfunction Galaxy.Start(builder)\n  builder:StartObject(1)\nend\n\nfunction Galaxy.AddNumStars(builder, numStars)\n  builder:PrependInt64Slot(0, numStars, 0)\nend\n\nfunction Galaxy.End(builder)\n  return builder:EndObject()\nend\n\nreturn Galaxy"
  },
  {
    "path": "goldens/lua/Universe.lua",
    "content": "--[[ Universe\n\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 23.5.26\n\n  Declared by  : //basic.fbs\n  Rooting type : Universe (//basic.fbs)\n\n--]]\n\nlocal __Galaxy = require('Galaxy')\nlocal flatbuffers = require('flatbuffers')\n\nlocal Universe = {}\nlocal mt = {}\n\nfunction Universe.New()\n  local o = {}\n  setmetatable(o, {__index = mt})\n  return o\nend\n\nfunction Universe.GetRootAsUniverse(buf, offset)\n  if type(buf) == \"string\" then\n    buf = flatbuffers.binaryArray.New(buf)\n  end\n\n  local n = flatbuffers.N.UOffsetT:Unpack(buf, offset)\n  local o = Universe.New()\n  o:Init(buf, n + offset)\n  return o\nend\n\nfunction mt:Init(buf, pos)\n  self.view = flatbuffers.view.New(buf, pos)\nend\n\nfunction mt:Age()\n  local o = self.view:Offset(4)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Float64, self.view.pos + o)\n  end\n  return 0.0\nend\n\nfunction mt:Galaxies(j)\n  local o = self.view:Offset(6)\n  if o ~= 0 then\n    local x = self.view:Vector(o)\n    x = x + ((j-1) * 4)\n    x = self.view:Indirect(x)\n    local obj = __Galaxy.New()\n    obj:Init(self.view.bytes, x)\n    return obj\n  end\nend\n\nfunction mt:GalaxiesLength()\n  local o = self.view:Offset(6)\n  if o ~= 0 then\n    return self.view:VectorLen(o)\n  end\n  return 0\nend\n\nfunction Universe.Start(builder)\n  builder:StartObject(2)\nend\n\nfunction Universe.AddAge(builder, age)\n  builder:PrependFloat64Slot(0, age, 0.0)\nend\n\nfunction Universe.AddGalaxies(builder, galaxies)\n  builder:PrependUOffsetTRelativeSlot(1, galaxies, 0)\nend\n\nfunction Universe.StartGalaxiesVector(builder, numElems)\n  return builder:StartVector(4, numElems, 4)\nend\n\nfunction Universe.End(builder)\n  return builder:EndObject()\nend\n\nreturn Universe"
  },
  {
    "path": "goldens/lua/generate.py",
    "content": "from golden_utils import flatc_golden\n\n\ndef flatc(options, schema):\n  # Wrap the golden flatc generator with Lua specifics\n  flatc_golden(options=[\"--lua\"] + options, schema=schema, prefix=\"lua\")\n\n\ndef GenerateLua():\n  flatc([], \"basic.fbs\")\n"
  },
  {
    "path": "goldens/nim/Galaxy.nim",
    "content": "#[ Galaxy\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 23.5.26\n\n  Declared by  : //basic.fbs\n  Rooting type : Universe (//basic.fbs)\n]#\n\nimport flatbuffers\n\ntype Galaxy* = object of FlatObj\nfunc numStars*(self: Galaxy): int64 =\n  let o = self.tab.Offset(4)\n  if o != 0:\n    return Get[int64](self.tab, self.tab.Pos + o)\n  return 0\nfunc `numStars=`*(self: var Galaxy, n: int64): bool =\n  return self.tab.MutateSlot(4, n)\nproc GalaxyStart*(builder: var Builder) =\n  builder.StartObject(1)\nproc GalaxyAddnumStars*(builder: var Builder, numStars: int64) =\n  builder.PrependSlot(0, numStars, default(int64))\nproc GalaxyEnd*(builder: var Builder): uoffset =\n  return builder.EndObject()\n"
  },
  {
    "path": "goldens/nim/Universe.nim",
    "content": "#[ Universe\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 23.5.26\n\n  Declared by  : //basic.fbs\n  Rooting type : Universe (//basic.fbs)\n]#\n\nimport Galaxy as Galaxy\nimport flatbuffers\nimport std/options\n\ntype Universe* = object of FlatObj\nfunc age*(self: Universe): float64 =\n  let o = self.tab.Offset(4)\n  if o != 0:\n    return Get[float64](self.tab, self.tab.Pos + o)\n  return 0.0\nfunc `age=`*(self: var Universe, n: float64): bool =\n  return self.tab.MutateSlot(4, n)\nfunc galaxiesLength*(self: Universe): int = \n  let o = self.tab.Offset(6)\n  if o != 0:\n    return self.tab.VectorLen(o)\nfunc galaxies*(self: Universe, j: int): Galaxy.Galaxy = \n  let o = self.tab.Offset(6)\n  if o != 0:\n    var x = self.tab.Vector(o)\n    x += j.uoffset * 4.uoffset\n    return Galaxy.Galaxy(tab: Vtable(Bytes: self.tab.Bytes, Pos: x))\nfunc galaxies*(self: Universe): seq[Galaxy.Galaxy] = \n  let len = self.galaxiesLength\n  for i in countup(0, len - 1):\n    result.add(self.galaxies(i))\nproc UniverseStart*(builder: var Builder) =\n  builder.StartObject(2)\nproc UniverseAddage*(builder: var Builder, age: float64) =\n  builder.PrependSlot(0, age, default(float64))\nproc UniverseAddgalaxies*(builder: var Builder, galaxies: uoffset) =\n  builder.PrependSlot(1, galaxies, default(uoffset))\nproc UniverseStartgalaxiesVector*(builder: var Builder, numElems: uoffset) =\n  builder.StartVector(4, numElems, 4)\nproc UniverseEnd*(builder: var Builder): uoffset =\n  return builder.EndObject()\n"
  },
  {
    "path": "goldens/nim/generate.py",
    "content": "from golden_utils import flatc_golden\n\n\ndef flatc(options, schema):\n  # Wrap the golden flatc generator with Nim specifics\n  flatc_golden(options=[\"--nim\"] + options, schema=schema, prefix=\"nim\")\n\n\ndef GenerateNim():\n  flatc([], \"basic.fbs\")\n"
  },
  {
    "path": "goldens/php/flatbuffers/goldens/Galaxy.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nnamespace flatbuffers\\goldens;\n\nuse \\Google\\FlatBuffers\\Struct;\nuse \\Google\\FlatBuffers\\Table;\nuse \\Google\\FlatBuffers\\ByteBuffer;\nuse \\Google\\FlatBuffers\\FlatBufferBuilder;\n\nclass Galaxy extends Table\n{\n    /**\n     * @param ByteBuffer $bb\n     * @return Galaxy\n     */\n    public static function getRootAsGalaxy(ByteBuffer $bb)\n    {\n        $obj = new Galaxy();\n        return ($obj->init($bb->getInt($bb->getPosition()) + $bb->getPosition(), $bb));\n    }\n\n    /**\n     * @param int $_i offset\n     * @param ByteBuffer $_bb\n     * @return Galaxy\n     **/\n    public function init($_i, ByteBuffer $_bb)\n    {\n        $this->bb_pos = $_i;\n        $this->bb = $_bb;\n        return $this;\n    }\n\n    /**\n     * @return long\n     */\n    public function getNumStars()\n    {\n        $o = $this->__offset(4);\n        return $o != 0 ? $this->bb->getLong($o + $this->bb_pos) : 0;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return void\n     */\n    public static function startGalaxy(FlatBufferBuilder $builder)\n    {\n        $builder->StartObject(1);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return Galaxy\n     */\n    public static function createGalaxy(FlatBufferBuilder $builder, $num_stars)\n    {\n        $builder->startObject(1);\n        self::addNumStars($builder, $num_stars);\n        $o = $builder->endObject();\n        return $o;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param long\n     * @return void\n     */\n    public static function addNumStars(FlatBufferBuilder $builder, $numStars)\n    {\n        $builder->addLongX(0, $numStars, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return int table offset\n     */\n    public static function endGalaxy(FlatBufferBuilder $builder)\n    {\n        $o = $builder->endObject();\n        return $o;\n    }\n}\n"
  },
  {
    "path": "goldens/php/flatbuffers/goldens/Universe.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nnamespace flatbuffers\\goldens;\n\nuse \\Google\\FlatBuffers\\Struct;\nuse \\Google\\FlatBuffers\\Table;\nuse \\Google\\FlatBuffers\\ByteBuffer;\nuse \\Google\\FlatBuffers\\FlatBufferBuilder;\n\nclass Universe extends Table\n{\n    /**\n     * @param ByteBuffer $bb\n     * @return Universe\n     */\n    public static function getRootAsUniverse(ByteBuffer $bb)\n    {\n        $obj = new Universe();\n        return ($obj->init($bb->getInt($bb->getPosition()) + $bb->getPosition(), $bb));\n    }\n\n    /**\n     * @param int $_i offset\n     * @param ByteBuffer $_bb\n     * @return Universe\n     **/\n    public function init($_i, ByteBuffer $_bb)\n    {\n        $this->bb_pos = $_i;\n        $this->bb = $_bb;\n        return $this;\n    }\n\n    /**\n     * @return double\n     */\n    public function getAge()\n    {\n        $o = $this->__offset(4);\n        return $o != 0 ? $this->bb->getDouble($o + $this->bb_pos) : 0.0;\n    }\n\n    /**\n     * @returnVectorOffset\n     */\n    public function getGalaxies($j)\n    {\n        $o = $this->__offset(6);\n        $obj = new Galaxy();\n        return $o != 0 ? $obj->init($this->__indirect($this->__vector($o) + $j * 4), $this->bb) : null;\n    }\n\n    /**\n     * @return int\n     */\n    public function getGalaxiesLength()\n    {\n        $o = $this->__offset(6);\n        return $o != 0 ? $this->__vector_len($o) : 0;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return void\n     */\n    public static function startUniverse(FlatBufferBuilder $builder)\n    {\n        $builder->StartObject(2);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return Universe\n     */\n    public static function createUniverse(FlatBufferBuilder $builder, $age, $galaxies)\n    {\n        $builder->startObject(2);\n        self::addAge($builder, $age);\n        self::addGalaxies($builder, $galaxies);\n        $o = $builder->endObject();\n        return $o;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param double\n     * @return void\n     */\n    public static function addAge(FlatBufferBuilder $builder, $age)\n    {\n        $builder->addDoubleX(0, $age, 0.0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addGalaxies(FlatBufferBuilder $builder, $galaxies)\n    {\n        $builder->addOffsetX(1, $galaxies, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param array offset array\n     * @return int vector offset\n     */\n    public static function createGalaxiesVector(FlatBufferBuilder $builder, array $data)\n    {\n        $builder->startVector(4, count($data), 4);\n        for ($i = count($data) - 1; $i >= 0; $i--) {\n            $builder->putOffset($data[$i]);\n        }\n        return $builder->endVector();\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int $numElems\n     * @return void\n     */\n    public static function startGalaxiesVector(FlatBufferBuilder $builder, $numElems)\n    {\n        $builder->startVector(4, $numElems, 4);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return int table offset\n     */\n    public static function endUniverse(FlatBufferBuilder $builder)\n    {\n        $o = $builder->endObject();\n        return $o;\n    }\n\n    public static function finishUniverseBuffer(FlatBufferBuilder $builder, $offset)\n    {\n        $builder->finish($offset);\n    }\n}\n"
  },
  {
    "path": "goldens/php/generate.py",
    "content": "from golden_utils import flatc_golden\n\n\ndef flatc(options, schema):\n  # Wrap the golden flatc generator with PHP specifics\n  flatc_golden(options=[\"--php\"] + options, schema=schema, prefix=\"php\")\n\n\ndef GeneratePhp():\n  flatc([], \"basic.fbs\")\n"
  },
  {
    "path": "goldens/py/__init__.py",
    "content": ""
  },
  {
    "path": "goldens/py/flatbuffers/__init__.py",
    "content": ""
  },
  {
    "path": "goldens/py/flatbuffers/goldens/Galaxy.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: goldens\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\nclass Galaxy(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = Galaxy()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsGalaxy(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    # Galaxy\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # Galaxy\n    def NumStars(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int64Flags, o + self._tab.Pos)\n        return 0\n\ndef GalaxyStart(builder):\n    builder.StartObject(1)\n\ndef Start(builder):\n    GalaxyStart(builder)\n\ndef GalaxyAddNumStars(builder, numStars):\n    builder.PrependInt64Slot(0, numStars, 0)\n\ndef AddNumStars(builder, numStars):\n    GalaxyAddNumStars(builder, numStars)\n\ndef GalaxyEnd(builder):\n    return builder.EndObject()\n\ndef End(builder):\n    return GalaxyEnd(builder)\n"
  },
  {
    "path": "goldens/py/flatbuffers/goldens/Universe.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: goldens\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\nclass Universe(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = Universe()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsUniverse(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    # Universe\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # Universe\n    def Age(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float64Flags, o + self._tab.Pos)\n        return 0.0\n\n    # Universe\n    def Galaxies(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        if o != 0:\n            x = self._tab.Vector(o)\n            x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4\n            x = self._tab.Indirect(x)\n            from flatbuffers.goldens.Galaxy import Galaxy\n            obj = Galaxy()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Universe\n    def GalaxiesLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Universe\n    def GalaxiesIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        return o == 0\n\ndef UniverseStart(builder):\n    builder.StartObject(2)\n\ndef Start(builder):\n    UniverseStart(builder)\n\ndef UniverseAddAge(builder, age):\n    builder.PrependFloat64Slot(0, age, 0.0)\n\ndef AddAge(builder, age):\n    UniverseAddAge(builder, age)\n\ndef UniverseAddGalaxies(builder, galaxies):\n    builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(galaxies), 0)\n\ndef AddGalaxies(builder, galaxies):\n    UniverseAddGalaxies(builder, galaxies)\n\ndef UniverseStartGalaxiesVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef StartGalaxiesVector(builder, numElems):\n    return UniverseStartGalaxiesVector(builder, numElems)\n\ndef UniverseCreateGalaxiesVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef CreateGalaxiesVector(builder, data):\n    UniverseCreateGalaxiesVector(builder, data)\n\ndef UniverseEnd(builder):\n    return builder.EndObject()\n\ndef End(builder):\n    return UniverseEnd(builder)\n"
  },
  {
    "path": "goldens/py/flatbuffers/goldens/__init__.py",
    "content": ""
  },
  {
    "path": "goldens/py/generate.py",
    "content": "from golden_utils import flatc_golden\n\n\ndef flatc(options, schema):\n  # Wrap the golden flatc generator with Python specifics\n  flatc_golden(options=[\"--python\"] + options, schema=schema, prefix=\"py\")\n\n\ndef GeneratePython():\n  flatc([], \"basic.fbs\")\n"
  },
  {
    "path": "goldens/rust/basic_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\n\n#[allow(unused_imports, dead_code)]\npub mod flatbuffers {\n    extern crate alloc;\n\n    #[allow(unused_imports, dead_code)]\n    pub mod goldens {\n        extern crate alloc;\n\n        pub enum GalaxyOffset {}\n\n        #[derive(Copy, Clone, PartialEq)]\n        pub struct Galaxy<'a> {\n            pub _tab: ::flatbuffers::Table<'a>,\n        }\n\n        impl<'a> ::flatbuffers::Follow<'a> for Galaxy<'a> {\n            type Inner = Galaxy<'a>;\n\n            #[inline]\n            unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n                Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n            }\n        }\n\n        impl<'a> Galaxy<'a> {\n            pub const VT_NUM_STARS: ::flatbuffers::VOffsetT = 4;\n\n            #[inline]\n            pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n                Galaxy { _tab: table }\n            }\n\n            #[allow(unused_mut)]\n            pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n                _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n                args: &'args GalaxyArgs\n            ) -> ::flatbuffers::WIPOffset<Galaxy<'bldr>> {\n                let mut builder = GalaxyBuilder::new(_fbb);\n                builder.add_num_stars(args.num_stars);\n                builder.finish()\n            }\n\n\n            #[inline]\n            pub fn num_stars(&self) -> i64 {\n                // Safety:\n                // Created from valid Table for this object\n                // which contains a valid value in this slot\n                unsafe { self._tab.get::<i64>(Galaxy::VT_NUM_STARS, Some(0)).unwrap()}\n            }\n        }\n\n        impl ::flatbuffers::Verifiable for Galaxy<'_> {\n            #[inline]\n            fn run_verifier(\n                v: &mut ::flatbuffers::Verifier, pos: usize\n            ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n                v.visit_table(pos)?\n                    .visit_field::<i64>(\"num_stars\", Self::VT_NUM_STARS, false)?\n                    .finish();\n                Ok(())\n            }\n        }\n\n        pub struct GalaxyArgs {\n            pub num_stars: i64,\n        }\n\n        impl<'a> Default for GalaxyArgs {\n            #[inline]\n            fn default() -> Self {\n                GalaxyArgs {\n                    num_stars: 0,\n                }\n            }\n        }\n\n        pub struct GalaxyBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n            fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n            start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n        }\n\n        impl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> GalaxyBuilder<'a, 'b, A> {\n            #[inline]\n            pub fn add_num_stars(&mut self, num_stars: i64) {\n                self.fbb_.push_slot::<i64>(Galaxy::VT_NUM_STARS, num_stars, 0);\n            }\n\n            #[inline]\n            pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> GalaxyBuilder<'a, 'b, A> {\n                let start = _fbb.start_table();\n                GalaxyBuilder {\n                    fbb_: _fbb,\n                    start_: start,\n                }\n            }\n\n            #[inline]\n            pub fn finish(self) -> ::flatbuffers::WIPOffset<Galaxy<'a>> {\n                let o = self.fbb_.end_table(self.start_);\n                ::flatbuffers::WIPOffset::new(o.value())\n            }\n        }\n\n        impl ::core::fmt::Debug for Galaxy<'_> {\n            fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n                let mut ds = f.debug_struct(\"Galaxy\");\n                ds.field(\"num_stars\", &self.num_stars());\n                ds.finish()\n            }\n        }\n\n        pub enum UniverseOffset {}\n\n        #[derive(Copy, Clone, PartialEq)]\n        pub struct Universe<'a> {\n            pub _tab: ::flatbuffers::Table<'a>,\n        }\n\n        impl<'a> ::flatbuffers::Follow<'a> for Universe<'a> {\n            type Inner = Universe<'a>;\n\n            #[inline]\n            unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n                Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n            }\n        }\n\n        impl<'a> Universe<'a> {\n            pub const VT_AGE: ::flatbuffers::VOffsetT = 4;\n            pub const VT_GALAXIES: ::flatbuffers::VOffsetT = 6;\n\n            #[inline]\n            pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n                Universe { _tab: table }\n            }\n\n            #[allow(unused_mut)]\n            pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n                _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n                args: &'args UniverseArgs<'args>\n            ) -> ::flatbuffers::WIPOffset<Universe<'bldr>> {\n                let mut builder = UniverseBuilder::new(_fbb);\n                builder.add_age(args.age);\n                if let Some(x) = args.galaxies { builder.add_galaxies(x); }\n                builder.finish()\n            }\n\n\n            #[inline]\n            pub fn age(&self) -> f64 {\n                // Safety:\n                // Created from valid Table for this object\n                // which contains a valid value in this slot\n                unsafe { self._tab.get::<f64>(Universe::VT_AGE, Some(0.0)).unwrap()}\n            }\n\n            #[inline]\n            pub fn galaxies(&self) -> Option<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Galaxy<'a>>>> {\n                // Safety:\n                // Created from valid Table for this object\n                // which contains a valid value in this slot\n                unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Galaxy>>>>(Universe::VT_GALAXIES, None)}\n            }\n        }\n\n        impl ::flatbuffers::Verifiable for Universe<'_> {\n            #[inline]\n            fn run_verifier(\n                v: &mut ::flatbuffers::Verifier, pos: usize\n            ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n                v.visit_table(pos)?\n                    .visit_field::<f64>(\"age\", Self::VT_AGE, false)?\n                    .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, ::flatbuffers::ForwardsUOffset<Galaxy>>>>(\"galaxies\", Self::VT_GALAXIES, false)?\n                    .finish();\n                Ok(())\n            }\n        }\n\n        pub struct UniverseArgs<'a> {\n            pub age: f64,\n            pub galaxies: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Galaxy<'a>>>>>,\n        }\n\n        impl<'a> Default for UniverseArgs<'a> {\n            #[inline]\n            fn default() -> Self {\n                UniverseArgs {\n                    age: 0.0,\n                    galaxies: None,\n                }\n            }\n        }\n\n        pub struct UniverseBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n            fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n            start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n        }\n\n        impl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> UniverseBuilder<'a, 'b, A> {\n            #[inline]\n            pub fn add_age(&mut self, age: f64) {\n                self.fbb_.push_slot::<f64>(Universe::VT_AGE, age, 0.0);\n            }\n\n            #[inline]\n            pub fn add_galaxies(&mut self, galaxies: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , ::flatbuffers::ForwardsUOffset<Galaxy<'b >>>>) {\n                self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Universe::VT_GALAXIES, galaxies);\n            }\n\n            #[inline]\n            pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> UniverseBuilder<'a, 'b, A> {\n                let start = _fbb.start_table();\n                UniverseBuilder {\n                    fbb_: _fbb,\n                    start_: start,\n                }\n            }\n\n            #[inline]\n            pub fn finish(self) -> ::flatbuffers::WIPOffset<Universe<'a>> {\n                let o = self.fbb_.end_table(self.start_);\n                ::flatbuffers::WIPOffset::new(o.value())\n            }\n        }\n\n        impl ::core::fmt::Debug for Universe<'_> {\n            fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n                let mut ds = f.debug_struct(\"Universe\");\n                ds.field(\"age\", &self.age());\n                ds.field(\"galaxies\", &self.galaxies());\n                ds.finish()\n            }\n        }\n\n        /// Verifies that a buffer of bytes contains a `Universe`\n        /// and returns it.\n        /// Note that verification is still experimental and may not\n        /// catch every error, or be maximally performant. For the\n        /// previous, unchecked, behavior use\n        /// `root_as_universe_unchecked`.\n        #[inline]\n        pub fn root_as_universe(buf: &[u8]) -> Result<Universe<'_>, ::flatbuffers::InvalidFlatbuffer> {\n            ::flatbuffers::root::<Universe>(buf)\n        }\n\n        /// Verifies that a buffer of bytes contains a size prefixed\n        /// `Universe` and returns it.\n        /// Note that verification is still experimental and may not\n        /// catch every error, or be maximally performant. For the\n        /// previous, unchecked, behavior use\n        /// `size_prefixed_root_as_universe_unchecked`.\n        #[inline]\n        pub fn size_prefixed_root_as_universe(buf: &[u8]) -> Result<Universe<'_>, ::flatbuffers::InvalidFlatbuffer> {\n            ::flatbuffers::size_prefixed_root::<Universe>(buf)\n        }\n\n        /// Verifies, with the given options, that a buffer of bytes\n        /// contains a `Universe` and returns it.\n        /// Note that verification is still experimental and may not\n        /// catch every error, or be maximally performant. For the\n        /// previous, unchecked, behavior use\n        /// `root_as_universe_unchecked`.\n        #[inline]\n        pub fn root_as_universe_with_opts<'b, 'o>(\n            opts: &'o ::flatbuffers::VerifierOptions,\n            buf: &'b [u8],\n        ) -> Result<Universe<'b>, ::flatbuffers::InvalidFlatbuffer> {\n            ::flatbuffers::root_with_opts::<Universe<'b>>(opts, buf)\n        }\n\n        /// Verifies, with the given verifier options, that a buffer of\n        /// bytes contains a size prefixed `Universe` and returns\n        /// it. Note that verification is still experimental and may not\n        /// catch every error, or be maximally performant. For the\n        /// previous, unchecked, behavior use\n        /// `root_as_universe_unchecked`.\n        #[inline]\n        pub fn size_prefixed_root_as_universe_with_opts<'b, 'o>(\n            opts: &'o ::flatbuffers::VerifierOptions,\n            buf: &'b [u8],\n        ) -> Result<Universe<'b>, ::flatbuffers::InvalidFlatbuffer> {\n            ::flatbuffers::size_prefixed_root_with_opts::<Universe<'b>>(opts, buf)\n        }\n\n        /// Assumes, without verification, that a buffer of bytes contains a Universe and returns it.\n        /// # Safety\n        /// Callers must trust the given bytes do indeed contain a valid `Universe`.\n        #[inline]\n        pub unsafe fn root_as_universe_unchecked(buf: &[u8]) -> Universe<'_> {\n            unsafe { ::flatbuffers::root_unchecked::<Universe>(buf) }\n        }\n\n        /// Assumes, without verification, that a buffer of bytes contains a size prefixed Universe and returns it.\n        /// # Safety\n        /// Callers must trust the given bytes do indeed contain a valid size prefixed `Universe`.\n        #[inline]\n        pub unsafe fn size_prefixed_root_as_universe_unchecked(buf: &[u8]) -> Universe<'_> {\n            unsafe { ::flatbuffers::size_prefixed_root_unchecked::<Universe>(buf) }\n        }\n\n        #[inline]\n        pub fn finish_universe_buffer<'a, 'b, A: ::flatbuffers::Allocator + 'a>(\n            fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n            root: ::flatbuffers::WIPOffset<Universe<'a>>\n        ) {\n            fbb.finish(root, None);\n        }\n\n        #[inline]\n        pub fn finish_size_prefixed_universe_buffer<'a, 'b, A: ::flatbuffers::Allocator + 'a>(\n            fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n            root: ::flatbuffers::WIPOffset<Universe<'a>>\n        ) {\n            fbb.finish_size_prefixed(root, None);\n        }\n    } // pub mod goldens\n} // pub mod flatbuffers\n"
  },
  {
    "path": "goldens/rust/generate.py",
    "content": "from golden_utils import flatc_golden\n\n\ndef flatc(options, schema):\n  # Wrap the golden flatc generator with Rust specifics\n  flatc_golden(options=[\"--rust\"] + options, schema=schema, prefix=\"rust\")\n\n\ndef GenerateRust():\n  flatc([], \"basic.fbs\")\n"
  },
  {
    "path": "goldens/schema/basic.fbs",
    "content": "// This file should contain the basics of flatbuffers that all languages should\n// support.\n\nnamespace flatbuffers.goldens;\n\ntable Galaxy {\n  num_stars:long;\n}\n\ntable Universe {\n  age:double;\n  galaxies:[Galaxy];\n}\n\nroot_type Universe;"
  },
  {
    "path": "goldens/swift/__init__.py",
    "content": ""
  },
  {
    "path": "goldens/swift/basic_generated.swift",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// swiftlint:disable all\n// swiftformat:disable all\n\n#if canImport(Common)\nimport Common\n#endif\n\nimport FlatBuffers\n\npublic struct flatbuffers_goldens_Galaxy: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private enum VTOFFSET: VOffset {\n    case numStars = 4\n    var v: Int32 { Int32(self.rawValue) }\n    var p: VOffset { self.rawValue }\n  }\n\n  public var numStars: Int64 { let o = _accessor.offset(VTOFFSET.numStars.v); return o == 0 ? 0 : _accessor.readBuffer(of: Int64.self, at: o) }\n  public static func startGalaxy(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) }\n  public static func add(numStars: Int64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: numStars, def: 0, at: VTOFFSET.numStars.p) }\n  public static func endGalaxy(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n  public static func createGalaxy(\n    _ fbb: inout FlatBufferBuilder,\n    numStars: Int64 = 0\n  ) -> Offset {\n    let __start = flatbuffers_goldens_Galaxy.startGalaxy(&fbb)\n    flatbuffers_goldens_Galaxy.add(numStars: numStars, &fbb)\n    return flatbuffers_goldens_Galaxy.endGalaxy(&fbb, start: __start)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    try _v.visit(field: VTOFFSET.numStars.p, fieldName: \"numStars\", required: false, type: Int64.self)\n    _v.finish()\n  }\n}\n\npublic struct flatbuffers_goldens_Universe: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private enum VTOFFSET: VOffset {\n    case age = 4\n    case galaxies = 6\n    var v: Int32 { Int32(self.rawValue) }\n    var p: VOffset { self.rawValue }\n  }\n\n  public var age: Double { let o = _accessor.offset(VTOFFSET.age.v); return o == 0 ? 0.0 : _accessor.readBuffer(of: Double.self, at: o) }\n  public var galaxies: FlatbufferVector<flatbuffers_goldens_Galaxy> { return _accessor.vector(at: VTOFFSET.galaxies.v, byteSize: 4) }\n  public static func startUniverse(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 2) }\n  public static func add(age: Double, _ fbb: inout FlatBufferBuilder) { fbb.add(element: age, def: 0.0, at: VTOFFSET.age.p) }\n  public static func addVectorOf(galaxies: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: galaxies, at: VTOFFSET.galaxies.p) }\n  public static func endUniverse(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n  public static func createUniverse(\n    _ fbb: inout FlatBufferBuilder,\n    age: Double = 0.0,\n    galaxiesVectorOffset galaxies: Offset = Offset()\n  ) -> Offset {\n    let __start = flatbuffers_goldens_Universe.startUniverse(&fbb)\n    flatbuffers_goldens_Universe.add(age: age, &fbb)\n    flatbuffers_goldens_Universe.addVectorOf(galaxies: galaxies, &fbb)\n    return flatbuffers_goldens_Universe.endUniverse(&fbb, start: __start)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    try _v.visit(field: VTOFFSET.age.p, fieldName: \"age\", required: false, type: Double.self)\n    try _v.visit(field: VTOFFSET.galaxies.p, fieldName: \"galaxies\", required: false, type: ForwardOffset<Vector<ForwardOffset<flatbuffers_goldens_Galaxy>, flatbuffers_goldens_Galaxy>>.self)\n    _v.finish()\n  }\n}\n\n"
  },
  {
    "path": "goldens/swift/generate.py",
    "content": "from golden_utils import flatc_golden\n\n\ndef flatc(options, schema):\n  # Wrap the golden flatc generator with Swift specifics\n  flatc_golden(options=[\"--swift\"] + options, schema=schema, prefix=\"swift\")\n\n\ndef GenerateSwift():\n  flatc([], \"basic.fbs\")\n"
  },
  {
    "path": "goldens/ts/basic.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport {Galaxy} from './galaxy.js';\nexport {Universe} from './universe.js';\n"
  },
  {
    "path": "goldens/ts/flatbuffers/goldens/galaxy.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nexport class Galaxy {\n  bb: flatbuffers.ByteBuffer|null = null;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):Galaxy {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\nstatic getRootAsGalaxy(bb:flatbuffers.ByteBuffer, obj?:Galaxy):Galaxy {\n  return (obj || new Galaxy()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic getSizePrefixedRootAsGalaxy(bb:flatbuffers.ByteBuffer, obj?:Galaxy):Galaxy {\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n  return (obj || new Galaxy()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nnumStars():bigint {\n  const offset = this.bb!.__offset(this.bb_pos, 4);\n  return offset ? this.bb!.readInt64(this.bb_pos + offset) : BigInt('0');\n}\n\nstatic startGalaxy(builder:flatbuffers.Builder) {\n  builder.startObject(1);\n}\n\nstatic addNumStars(builder:flatbuffers.Builder, numStars:bigint) {\n  builder.addFieldInt64(0, numStars, BigInt('0'));\n}\n\nstatic endGalaxy(builder:flatbuffers.Builder):flatbuffers.Offset {\n  const offset = builder.endObject();\n  return offset;\n}\n\nstatic createGalaxy(builder:flatbuffers.Builder, numStars:bigint):flatbuffers.Offset {\n  Galaxy.startGalaxy(builder);\n  Galaxy.addNumStars(builder, numStars);\n  return Galaxy.endGalaxy(builder);\n}\n}\n"
  },
  {
    "path": "goldens/ts/flatbuffers/goldens/universe.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport { Galaxy } from './galaxy.js';\n\n\nexport class Universe {\n  bb: flatbuffers.ByteBuffer|null = null;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):Universe {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\nstatic getRootAsUniverse(bb:flatbuffers.ByteBuffer, obj?:Universe):Universe {\n  return (obj || new Universe()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic getSizePrefixedRootAsUniverse(bb:flatbuffers.ByteBuffer, obj?:Universe):Universe {\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n  return (obj || new Universe()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nage():number {\n  const offset = this.bb!.__offset(this.bb_pos, 4);\n  return offset ? this.bb!.readFloat64(this.bb_pos + offset) : 0.0;\n}\n\ngalaxies(index: number, obj?:Galaxy):Galaxy|null {\n  const offset = this.bb!.__offset(this.bb_pos, 6);\n  return offset ? (obj || new Galaxy()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;\n}\n\ngalaxiesLength():number {\n  const offset = this.bb!.__offset(this.bb_pos, 6);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\nstatic startUniverse(builder:flatbuffers.Builder) {\n  builder.startObject(2);\n}\n\nstatic addAge(builder:flatbuffers.Builder, age:number) {\n  builder.addFieldFloat64(0, age, 0.0);\n}\n\nstatic addGalaxies(builder:flatbuffers.Builder, galaxiesOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(1, galaxiesOffset, 0);\n}\n\nstatic createGalaxiesVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {\n  builder.startVector(4, data.length, 4);\n  for (let i = data.length - 1; i >= 0; i--) {\n    builder.addOffset(data[i]!);\n  }\n  return builder.endVector();\n}\n\nstatic startGalaxiesVector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(4, numElems, 4);\n}\n\nstatic endUniverse(builder:flatbuffers.Builder):flatbuffers.Offset {\n  const offset = builder.endObject();\n  return offset;\n}\n\nstatic finishUniverseBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) {\n  builder.finish(offset);\n}\n\nstatic finishSizePrefixedUniverseBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) {\n  builder.finish(offset, undefined, true);\n}\n\nstatic createUniverse(builder:flatbuffers.Builder, age:number, galaxiesOffset:flatbuffers.Offset):flatbuffers.Offset {\n  Universe.startUniverse(builder);\n  Universe.addAge(builder, age);\n  Universe.addGalaxies(builder, galaxiesOffset);\n  return Universe.endUniverse(builder);\n}\n}\n"
  },
  {
    "path": "goldens/ts/flatbuffers/goldens.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport { Galaxy } from './goldens/galaxy.js';\nexport { Universe } from './goldens/universe.js';\n"
  },
  {
    "path": "goldens/ts/generate.py",
    "content": "from golden_utils import flatc_golden\n\n\ndef flatc(options, schema):\n  # Wrap the golden flatc generator with Swift specifics\n  flatc_golden(options=[\"--ts\"] + options, schema=schema, prefix=\"ts\")\n\n\ndef GenerateTs():\n  flatc([], \"basic.fbs\")\n"
  },
  {
    "path": "grpc/BUILD.bazel",
    "content": ""
  },
  {
    "path": "grpc/README.md",
    "content": "GRPC implementation and test\n\nNOTE: files in `src/` are shared with the GRPC project, and maintained there\n(any changes should be submitted to GRPC instead). These files are copied\nfrom GRPC, and work with both the Protobuf and FlatBuffers code generator.\n\n`tests/` contains a GRPC specific test, you need to have built and installed\nthe GRPC libraries for this to compile. This test will build using the\n`FLATBUFFERS_BUILD_GRPCTEST` option to the main FlatBuffers CMake project.\n\n## Building Flatbuffers with gRPC\n\n### Linux\n\n1. Download, build and install gRPC. See [instructions](https://github.com/grpc/grpc/tree/master/src/cpp).\n    * Lets say your gRPC clone is at `/your/path/to/grpc_repo`.\n    * Install gRPC in a custom directory by running `make install prefix=/your/path/to/grpc_repo/install`.\n2. `export GRPC_INSTALL_PATH=/your/path/to/grpc_repo/install`\n3. `export PROTOBUF_DOWNLOAD_PATH=/your/path/to/grpc_repo/third_party/protobuf`\n4. `mkdir build ; cd build`\n5. `cmake -DFLATBUFFERS_BUILD_GRPCTEST=ON -DGRPC_INSTALL_PATH=${GRPC_INSTALL_PATH} -DPROTOBUF_DOWNLOAD_PATH=${PROTOBUF_DOWNLOAD_PATH} ..`\n6. `make`\n\nFor Bazel users:\n\n```shell\n$bazel test src/compiler/...\n```\n\n## Running FlatBuffer gRPC tests\n\n### Linux\n\n1. `export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${GRPC_INSTALL_PATH}/lib`\n2. `make test ARGS=-V`\n\nFor Bazel users:\n\n```shell\n$bazel test tests/...\n```\n\n## C++ Callback API Generation\n\nFlatBuffers gRPC C++ code generation now optionally supports the modern gRPC Callback API.\n\nTo enable generation of a `CallbackService` skeleton alongside the existing `Service` and async mixins, invoke `flatc` with both `--grpc` and `--grpc-callback-api`:\n\n```shell\nflatc --cpp --grpc --grpc-callback-api your_service.fbs\n```\n\nThis adds (guarded by `#if defined(GRPC_CALLBACK_API_NONEXPERIMENTAL)`) a class:\n\n```cpp\nclass YourService::CallbackService : public ::grpc::Service { /* reactor virtuals */ };\n```\n\nEach RPC shape maps to the appropriate reactor return type:\n\n- Unary -> `::grpc::ServerUnaryReactor*` Method(...)\n- Client streaming -> `::grpc::ServerReadReactor<Request>*`\n- Server streaming -> `::grpc::ServerWriteReactor<Response>*`\n- Bidi streaming -> `::grpc::ServerBidiReactor<Request, Response>*`\n\nDefault generated implementations return `nullptr`; override in your derived class and return a reactor instance you manage (see gRPC docs for lifecycle patterns).\n\nIf your gRPC library predates the stable callback API macro, the code inside the guard will be skipped (no breaking changes). Ensure you build against a recent gRPC (1.38+; verify current minimum in grpc repo) to use this feature.\n\n### Client Callback Stubs\n\nWhen `--grpc-callback-api` is supplied, the generated C++ client stub gains native callback / reactor based async methods in addition to the existing synchronous / generic async flavors, guarded by the same macro. For each RPC named `Foo`:\n\nUnary:\n\n```\nvoid async_Foo(::grpc::ClientContext*, const Request&, Response*, std::function<void(::grpc::Status)>);\nvoid async_Foo(::grpc::ClientContext*, const Request&, Response*, ::grpc::ClientUnaryReactor*);\n```\n\nClient streaming:\n\n```\n::grpc::ClientWriteReactor<Request>* async_Foo(::grpc::ClientContext*, Response*, ::grpc::ClientWriteReactor<Request>*);\n```\n\nServer streaming:\n\n```\n::grpc::ClientReadReactor<Response>* async_Foo(::grpc::ClientContext*, const Request&, ::grpc::ClientReadReactor<Response>*);\n```\n\nBidirectional streaming:\n\n```\n::grpc::ClientBidiReactor<Request, Response>* async_Foo(::grpc::ClientContext*, ::grpc::ClientBidiReactor<Request, Response>*);\n```\n\nThese map directly onto the native gRPC callback API factories (e.g. `CallbackUnaryCall`, `ClientCallbackWriterFactory::Create`, etc.) and do not spawn threads. Override the appropriate reactor callbacks per gRPC's documentation to drive I/O.\n\nIf your build uses an older gRPC lacking the non-experimental macro, these symbols will not be emitted, preserving backwards compatibility.\n"
  },
  {
    "path": "grpc/boringssl.patch",
    "content": "diff --git a/CMakeLists.txt b/CMakeLists.txt\nindex 1645a264a..12f8ca999 100644\n--- a/CMakeLists.txt\n+++ b/CMakeLists.txt\n@@ -635,6 +635,8 @@ add_library(\n   src/ssl/tls_record.cc\n )\n \n+target_link_libraries(ssl crypto)\n+\n add_executable(\n   bssl\n \ndiff --git a/src/crypto/x509/t_x509.c b/src/crypto/x509/t_x509.c\nindex 7c32a8798..6e50d040e 100644\n--- a/src/crypto/x509/t_x509.c\n+++ b/src/crypto/x509/t_x509.c\n@@ -318,9 +318,7 @@ int X509_signature_print(BIO *bp, const X509_ALGOR *sigalg,\n int X509_NAME_print(BIO *bp, const X509_NAME *name, int obase)\n {\n     char *s, *c, *b;\n-    int ret = 0, l, i;\n-\n-    l = 80 - 2 - obase;\n+    int ret = 0, i;\n\n     b = X509_NAME_oneline(name, NULL, 0);\n     if (!b)\n@@ -347,12 +345,10 @@ int X509_NAME_print(BIO *bp, const X509_NAME *name, int obase)\n                 if (BIO_write(bp, \", \", 2) != 2)\n                     goto err;\n             }\n-            l--;\n         }\n         if (*s == '\\0')\n             break;\n         s++;\n-        l--;\n     }\n\n     ret = 1;\n"
  },
  {
    "path": "grpc/build_grpc.sh",
    "content": "#!/bin/bash\n\ngrpc_1_39_0_githash=58602e20a3f3e48f24a4114c757099b25b947f7b\n\nfunction build_grpc () {\n  git clone https://github.com/grpc/grpc.git google/grpc\n  cd google/grpc\n  git checkout ${grpc_1_39_0_githash}\n  git submodule update --init\n  # Apply boringssl build patch\n  cd third_party/boringssl-with-bazel\n  git apply ../../../../grpc/boringssl.patch\n  cd ../..\n  mkdir ../grpc_build\n  cd ../grpc_build\n  cmake ../grpc -DgRPC_INSTALL=ON -DgRPC_BUILD_TESTS=OFF -DABSL_ENABLE_INSTALL=ON -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=`pwd`/../grpc/install\n  cmake --build . --target install ${JOBS:+-j$JOBS}\n  cd ../..\n}\n\nGRPC_INSTALL_PATH=`pwd`/google/grpc/install\nPROTOBUF_DOWNLOAD_PATH=`pwd`/google/grpc/third_party/protobuf\n\nbuild_grpc\n"
  },
  {
    "path": "grpc/build_grpc_with_cxx14.patch",
    "content": "diff --git a/bazel/copts.bzl b/bazel/copts.bzl\nindex 10be944f25..879518b92f 100644\n--- a/bazel/copts.bzl\n+++ b/bazel/copts.bzl\n@@ -59,4 +59,7 @@ GRPC_LLVM_WARNING_FLAGS = [\n GRPC_DEFAULT_COPTS = select({\n     \"//:use_strict_warning\": GRPC_LLVM_WARNING_FLAGS + [\"-DUSE_STRICT_WARNING=1\"],\n     \"//conditions:default\": [],\n-})\n+}) + select({\n+        \"@bazel_tools//src/conditions:windows\": [\"/std:c++14\"],\n+        \"//conditions:default\": [\"-std=c++14\"],\n+})\n"
  },
  {
    "path": "grpc/examples/README.md",
    "content": "## Languages known issues\n\n### Python\n\n- Assert the type required in your server/client since python is able to receive `Bytes array` or `utf8 strings`.\n\n```python\ndef SayHello(self, request, context):\n    # request might be a byte array or a utf8 string\n\n    r = HelloRequest.HelloRequest().GetRootAs(request, 0)\n    reply = \"Unknown\"\n    if r.Name():\n        reply = r.Name()\n    # Issues might happen if type checking isnt present.\n    # thus encoding it as a `reply.decode('UTF-8')`\n    return build_reply(\"welcome \" + reply.decode('UTF-8'))\n\n```\n\nThis can be prevented by making sure all the requests coming to/from python are `Bytes array`\n\n```python\ndef say_hello(stub, builder):\n    hello_request = bytes(builder.Output())\n    reply = stub.SayHello(hello_request)\n    r = HelloReply.HelloReply.GetRootAs(reply)\n    print(r.Message())\n```\n\n### Go\n\n- Always requires the `content-type` of the payload to be set to `application/grpc+flatbuffers`\n\nexample: `.SayHello(ctx, b, grpc.CallContentSubtype(\"flatbuffers\"))`\n"
  },
  {
    "path": "grpc/examples/go/format.sh",
    "content": "#!/bin/bash\n#\n# Copyright 2021 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -e\n\n\nformat_greeter() {\n  cd greeter\n\n  # Format client\n  cd client\n  gofmt -w .\n  cd ..\n\n  # Format server\n  cd server\n  gofmt -w .\n  cd ..\n\n  cd ..\n}\n\nformat_greeter"
  },
  {
    "path": "grpc/examples/go/greeter/.gitignore",
    "content": "**/server\n**/client"
  },
  {
    "path": "grpc/examples/go/greeter/README.md",
    "content": "# Go Greeter example\n\n## Project Structure\n\n    .\n    ├── server                   # Server module\n    ├── client                   # Client module\n    ├── models                   # Flatbuffers models & main grpc code.\n    └── README.md\n\n## How to run Server:\n\n- `cd server`\n\n- `go clean`\n\n- `go run main.go`\n\n## How to run Client:\n\n- `cd client`\n\n- `go clean`\n\n- `go run main.go --name NAME`\n"
  },
  {
    "path": "grpc/examples/go/greeter/models/Greeter_grpc.go",
    "content": "//Generated by gRPC Go plugin\n//If you make any local changes, they will be lost\n//source: greeter\n\npackage models\n\nimport (\n\tcontext \"context\"\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n\tgrpc \"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/codes\"\n\t\"google.golang.org/grpc/status\"\n)\n\n// Client API for Greeter service\ntype GreeterClient interface {\n\tSayHello(ctx context.Context, in *flatbuffers.Builder,\n\t\topts ...grpc.CallOption) (*HelloReply, error)\n\tSayManyHellos(ctx context.Context, in *flatbuffers.Builder,\n\t\topts ...grpc.CallOption) (Greeter_SayManyHellosClient, error)\n}\n\ntype greeterClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewGreeterClient(cc grpc.ClientConnInterface) GreeterClient {\n\treturn &greeterClient{cc}\n}\n\nfunc (c *greeterClient) SayHello(ctx context.Context, in *flatbuffers.Builder,\n\topts ...grpc.CallOption) (*HelloReply, error) {\n\tout := new(HelloReply)\n\terr := c.cc.Invoke(ctx, \"/models.Greeter/SayHello\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *greeterClient) SayManyHellos(ctx context.Context, in *flatbuffers.Builder,\n\topts ...grpc.CallOption) (Greeter_SayManyHellosClient, error) {\n\tstream, err := c.cc.NewStream(ctx, &_Greeter_serviceDesc.Streams[0], \"/models.Greeter/SayManyHellos\", opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tx := &greeterSayManyHellosClient{stream}\n\tif err := x.ClientStream.SendMsg(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := x.ClientStream.CloseSend(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn x, nil\n}\n\ntype Greeter_SayManyHellosClient interface {\n\tRecv() (*HelloReply, error)\n\tgrpc.ClientStream\n}\n\ntype greeterSayManyHellosClient struct {\n\tgrpc.ClientStream\n}\n\nfunc (x *greeterSayManyHellosClient) Recv() (*HelloReply, error) {\n\tm := new(HelloReply)\n\tif err := x.ClientStream.RecvMsg(m); err != nil {\n\t\treturn nil, err\n\t}\n\treturn m, nil\n}\n\n// Server API for Greeter service\ntype GreeterServer interface {\n\tSayHello(context.Context, *HelloRequest) (*flatbuffers.Builder, error)\n\tSayManyHellos(*HelloRequest, Greeter_SayManyHellosServer) error\n\tmustEmbedUnimplementedGreeterServer()\n}\n\ntype UnimplementedGreeterServer struct {\n}\n\nfunc (UnimplementedGreeterServer) SayHello(context.Context, *HelloRequest) (*flatbuffers.Builder, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method SayHello not implemented\")\n}\n\nfunc (UnimplementedGreeterServer) SayManyHellos(*HelloRequest, Greeter_SayManyHellosServer) error {\n\treturn status.Errorf(codes.Unimplemented, \"method SayManyHellos not implemented\")\n}\n\nfunc (UnimplementedGreeterServer) mustEmbedUnimplementedGreeterServer() {}\n\ntype UnsafeGreeterServer interface {\n\tmustEmbedUnimplementedGreeterServer()\n}\n\nfunc RegisterGreeterServer(s grpc.ServiceRegistrar, srv GreeterServer) {\n\ts.RegisterService(&_Greeter_serviceDesc, srv)\n}\n\nfunc _Greeter_SayHello_Handler(srv interface{}, ctx context.Context,\n\tdec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(HelloRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GreeterServer).SayHello(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/models.Greeter/SayHello\",\n\t}\n\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GreeterServer).SayHello(ctx, req.(*HelloRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\nfunc _Greeter_SayManyHellos_Handler(srv interface{}, stream grpc.ServerStream) error {\n\tm := new(HelloRequest)\n\tif err := stream.RecvMsg(m); err != nil {\n\t\treturn err\n\t}\n\treturn srv.(GreeterServer).SayManyHellos(m, &greeterSayManyHellosServer{stream})\n}\n\ntype Greeter_SayManyHellosServer interface {\n\tSend(*flatbuffers.Builder) error\n\tgrpc.ServerStream\n}\n\ntype greeterSayManyHellosServer struct {\n\tgrpc.ServerStream\n}\n\nfunc (x *greeterSayManyHellosServer) Send(m *flatbuffers.Builder) error {\n\treturn x.ServerStream.SendMsg(m)\n}\n\nvar _Greeter_serviceDesc = grpc.ServiceDesc{\n\tServiceName: \"models.Greeter\",\n\tHandlerType: (*GreeterServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"SayHello\",\n\t\t\tHandler:    _Greeter_SayHello_Handler,\n\t\t},\n\t},\n\tStreams: []grpc.StreamDesc{\n\t\t{\n\t\t\tStreamName:    \"SayManyHellos\",\n\t\t\tHandler:       _Greeter_SayManyHellos_Handler,\n\t\t\tServerStreams: true,\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "grpc/examples/go/greeter/models/HelloReply.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage models\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n)\n\ntype HelloReply struct {\n\t_tab flatbuffers.Table\n}\n\nfunc GetRootAsHelloReply(buf []byte, offset flatbuffers.UOffsetT) *HelloReply {\n\tn := flatbuffers.GetUOffsetT(buf[offset:])\n\tx := &HelloReply{}\n\tx.Init(buf, n+offset)\n\treturn x\n}\n\nfunc FinishHelloReplyBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {\n\tbuilder.Finish(offset)\n}\n\nfunc GetSizePrefixedRootAsHelloReply(buf []byte, offset flatbuffers.UOffsetT) *HelloReply {\n\tn := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])\n\tx := &HelloReply{}\n\tx.Init(buf, n+offset+flatbuffers.SizeUint32)\n\treturn x\n}\n\nfunc FinishSizePrefixedHelloReplyBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {\n\tbuilder.FinishSizePrefixed(offset)\n}\n\nfunc (rcv *HelloReply) Init(buf []byte, i flatbuffers.UOffsetT) {\n\trcv._tab.Bytes = buf\n\trcv._tab.Pos = i\n}\n\nfunc (rcv *HelloReply) Table() flatbuffers.Table {\n\treturn rcv._tab\n}\n\nfunc (rcv *HelloReply) Message() []byte {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(4))\n\tif o != 0 {\n\t\treturn rcv._tab.ByteVector(o + rcv._tab.Pos)\n\t}\n\treturn nil\n}\n\nfunc HelloReplyStart(builder *flatbuffers.Builder) {\n\tbuilder.StartObject(1)\n}\nfunc HelloReplyAddMessage(builder *flatbuffers.Builder, message flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(message), 0)\n}\nfunc HelloReplyEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\treturn builder.EndObject()\n}\n"
  },
  {
    "path": "grpc/examples/go/greeter/models/HelloRequest.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage models\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n)\n\ntype HelloRequest struct {\n\t_tab flatbuffers.Table\n}\n\nfunc GetRootAsHelloRequest(buf []byte, offset flatbuffers.UOffsetT) *HelloRequest {\n\tn := flatbuffers.GetUOffsetT(buf[offset:])\n\tx := &HelloRequest{}\n\tx.Init(buf, n+offset)\n\treturn x\n}\n\nfunc FinishHelloRequestBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {\n\tbuilder.Finish(offset)\n}\n\nfunc GetSizePrefixedRootAsHelloRequest(buf []byte, offset flatbuffers.UOffsetT) *HelloRequest {\n\tn := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])\n\tx := &HelloRequest{}\n\tx.Init(buf, n+offset+flatbuffers.SizeUint32)\n\treturn x\n}\n\nfunc FinishSizePrefixedHelloRequestBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {\n\tbuilder.FinishSizePrefixed(offset)\n}\n\nfunc (rcv *HelloRequest) Init(buf []byte, i flatbuffers.UOffsetT) {\n\trcv._tab.Bytes = buf\n\trcv._tab.Pos = i\n}\n\nfunc (rcv *HelloRequest) Table() flatbuffers.Table {\n\treturn rcv._tab\n}\n\nfunc (rcv *HelloRequest) Name() []byte {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(4))\n\tif o != 0 {\n\t\treturn rcv._tab.ByteVector(o + rcv._tab.Pos)\n\t}\n\treturn nil\n}\n\nfunc HelloRequestStart(builder *flatbuffers.Builder) {\n\tbuilder.StartObject(1)\n}\nfunc HelloRequestAddName(builder *flatbuffers.Builder, name flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(name), 0)\n}\nfunc HelloRequestEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\treturn builder.EndObject()\n}\n"
  },
  {
    "path": "grpc/examples/go/greeter/models/go.mod",
    "content": "module github.com/google/flatbuffers/grpc/examples/go/greeter/models\n\ngo 1.15\n\nrequire (\n\tgithub.com/google/flatbuffers v2.0.8+incompatible\n\tgoogle.golang.org/grpc v1.56.3\n)\n"
  },
  {
    "path": "grpc/examples/greeter.fbs",
    "content": "namespace models;\n\ntable HelloReply {\n  message:string;\n}\n\ntable HelloRequest {\n  name:string;\n}\n\nrpc_service Greeter {\n  SayHello(HelloRequest):HelloReply;\n  SayManyHellos(HelloRequest):HelloReply (streaming: \"server\");\n}\n"
  },
  {
    "path": "grpc/examples/python/greeter/README.md",
    "content": "# Python Greeter example\n\n## Prerequisite\n\n- You need to have grpc python installed on your device `pip install grpcio`\n## How to run Server:\n\n- `python server.py ${PORT}`\n\n## How to run Client:\n\n- `python client.py ${PORT} ${NAME}`\n"
  },
  {
    "path": "grpc/examples/python/greeter/client.py",
    "content": "import argparse\nimport sys\nimport grpc\n\nsys.path.insert(0, \"../../../../../flatbuffers/python\")\n\nimport flatbuffers\nfrom models import HelloReply, HelloRequest, greeter_grpc_fb\n\nparser = argparse.ArgumentParser()\nparser.add_argument(\"port\", help=\"server port to connect to\", default=3000)\nparser.add_argument(\n    \"name\", help=\"name to be sent to server\", default=\"flatbuffers\"\n)\n\n\ndef say_hello(stub, hello_request):\n  reply = stub.SayHello(hello_request)\n  r = HelloReply.HelloReply.GetRootAs(reply)\n  print(r.Message())\n\n\ndef say_many_hellos(stub, hello_request):\n  greetings = stub.SayManyHellos(hello_request)\n  for greeting in greetings:\n    r = HelloReply.HelloReply.GetRootAs(greeting)\n    print(r.Message())\n\n\ndef main():\n  args = parser.parse_args()\n\n  with grpc.insecure_channel(\"localhost:\" + args.port) as channel:\n    builder = flatbuffers.Builder()\n    ind = builder.CreateString(args.name)\n    HelloRequest.HelloRequestStart(builder)\n    HelloRequest.HelloRequestAddName(builder, ind)\n    root = HelloRequest.HelloRequestEnd(builder)\n    builder.Finish(root)\n    output = bytes(builder.Output())\n    stub = greeter_grpc_fb.GreeterStub(channel)\n    say_hello(stub, output)\n    say_many_hellos(stub, output)\n\n\nmain()\n"
  },
  {
    "path": "grpc/examples/python/greeter/greeter_grpc.fb.py",
    "content": "# Generated by the gRPC FlatBuffers compiler. DO NOT EDIT!\n\nimport flatbuffers\nimport grpc\nfrom models.HelloReply import HelloReply\nfrom models.HelloRequest import HelloRequest\n\n\nclass GreeterStub(object):\n  \"\"\"Interface exported by the server.\"\"\"\n\n  def __init__(self, channel):\n    \"\"\"Constructor.\n\n    Args:\n      channel: A grpc.Channel.\n    \"\"\"\n\n    self.SayHello = channel.unary_unary(method='/models.Greeter/SayHello')\n\n    self.SayManyHellos = channel.unary_stream(\n        method='/models.Greeter/SayManyHellos'\n    )\n\n\nclass GreeterServicer(object):\n  \"\"\"Interface exported by the server.\"\"\"\n\n  def SayHello(self, request, context):\n    context.set_code(grpc.StatusCode.UNIMPLEMENTED)\n    context.set_details('Method not implemented!')\n    raise NotImplementedError('Method not implemented!')\n\n  def SayManyHellos(self, request, context):\n    context.set_code(grpc.StatusCode.UNIMPLEMENTED)\n    context.set_details('Method not implemented!')\n    raise NotImplementedError('Method not implemented!')\n\n\ndef add_GreeterServicer_to_server(servicer, server):\n  rpc_method_handlers = {\n      'SayHello': grpc.unary_unary_rpc_method_handler(servicer.SayHello),\n      'SayManyHellos': grpc.unary_stream_rpc_method_handler(\n          servicer.SayManyHellos\n      ),\n  }\n\n  generic_handler = grpc.method_handlers_generic_handler(\n      'models.Greeter', rpc_method_handlers\n  )\n\n  server.add_generic_rpc_handlers((generic_handler,))\n"
  },
  {
    "path": "grpc/examples/python/greeter/models/HelloReply.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: models\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\nclass HelloReply(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = HelloReply()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsHelloReply(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    # HelloReply\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # HelloReply\n    def Message(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.String(o + self._tab.Pos)\n        return None\n\ndef HelloReplyStart(builder):\n    builder.StartObject(1)\n\ndef Start(builder):\n    HelloReplyStart(builder)\n\ndef HelloReplyAddMessage(builder, message):\n    builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(message), 0)\n\ndef AddMessage(builder, message):\n    HelloReplyAddMessage(builder, message)\n\ndef HelloReplyEnd(builder):\n    return builder.EndObject()\n\ndef End(builder):\n    return HelloReplyEnd(builder)\n"
  },
  {
    "path": "grpc/examples/python/greeter/models/HelloRequest.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: models\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\nclass HelloRequest(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = HelloRequest()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsHelloRequest(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    # HelloRequest\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # HelloRequest\n    def Name(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.String(o + self._tab.Pos)\n        return None\n\ndef HelloRequestStart(builder):\n    builder.StartObject(1)\n\ndef Start(builder):\n    HelloRequestStart(builder)\n\ndef HelloRequestAddName(builder, name):\n    builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(name), 0)\n\ndef AddName(builder, name):\n    HelloRequestAddName(builder, name)\n\ndef HelloRequestEnd(builder):\n    return builder.EndObject()\n\ndef End(builder):\n    return HelloRequestEnd(builder)\n"
  },
  {
    "path": "grpc/examples/python/greeter/models/__init__.py",
    "content": ""
  },
  {
    "path": "grpc/examples/python/greeter/models/greeter_grpc_fb.py",
    "content": "# Generated by the gRPC FlatBuffers compiler. DO NOT EDIT!\n\nimport flatbuffers\nimport grpc\n\nfrom models.HelloReply import HelloReply\nfrom models.HelloRequest import HelloRequest\n\n\nclass GreeterStub(object):\n  '''Interface exported by the server.'''\n\n  def __init__(self, channel):\n    '''Constructor.\n\n    Args:\n      channel: A grpc.Channel.\n    '''\n\n    self.SayHello = channel.unary_unary(\n      method='/models.Greeter/SayHello')\n\n    self.SayManyHellos = channel.unary_stream(\n      method='/models.Greeter/SayManyHellos')\n\n\nclass GreeterServicer(object):\n  '''Interface exported by the server.'''\n\n  def SayHello(self, request, context):\n    context.set_code(grpc.StatusCode.UNIMPLEMENTED)\n    context.set_details('Method not implemented!')\n    raise NotImplementedError('Method not implemented!')\n\n  def SayManyHellos(self, request, context):\n    context.set_code(grpc.StatusCode.UNIMPLEMENTED)\n    context.set_details('Method not implemented!')\n    raise NotImplementedError('Method not implemented!')\n\n\ndef add_GreeterServicer_to_server(servicer, server):\n  rpc_method_handlers = {\n    'SayHello': grpc.unary_unary_rpc_method_handler(\n      servicer.SayHello),\n    'SayManyHellos': grpc.unary_stream_rpc_method_handler(\n      servicer.SayManyHellos),\n  }\n\n  generic_handler = grpc.method_handlers_generic_handler(\n    'models.Greeter', rpc_method_handlers)\n\n  server.add_generic_rpc_handlers((generic_handler,))\n\n\n"
  },
  {
    "path": "grpc/examples/python/greeter/server.py",
    "content": "import argparse\nfrom concurrent import futures\nimport sys\nimport grpc\n\nsys.path.insert(0, \"../../../../../flatbuffers/python\")\n\nimport flatbuffers\nfrom models import HelloReply, HelloRequest, greeter_grpc_fb\n\nparser = argparse.ArgumentParser()\nparser.add_argument(\"port\", help=\"server on port\", default=3000)\n\n\ndef build_reply(message):\n  builder = flatbuffers.Builder()\n  ind = builder.CreateString(message)\n  HelloReply.HelloReplyStart(builder)\n  HelloReply.HelloReplyAddMessage(builder, ind)\n  root = HelloReply.HelloReplyEnd(builder)\n  builder.Finish(root)\n  return bytes(builder.Output())\n\n\nclass GreeterServicer(greeter_grpc_fb.GreeterServicer):\n\n  def __init__(self):\n    self.greetings = [\"Hi\", \"Hallo\", \"Ciao\"]\n\n  def SayHello(self, request, context):\n    r = HelloRequest.HelloRequest().GetRootAs(request, 0)\n    reply = \"Unknown\"\n    if r.Name():\n      reply = r.Name()\n    return build_reply(\"welcome \" + reply.decode(\"UTF-8\"))\n\n  def SayManyHellos(self, request, context):\n    r = HelloRequest.HelloRequest().GetRootAs(request, 0)\n    reply = \"Unknown\"\n    if r.Name():\n      reply = r.Name()\n\n    for greeting in self.greetings:\n      print(type(reply))\n      yield build_reply(greeting + \" \" + reply.decode(\"UTF-8\"))\n\n\ndef serve():\n  args = parser.parse_args()\n  server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))\n  greeter_grpc_fb.add_GreeterServicer_to_server(GreeterServicer(), server)\n  server.add_insecure_port(\"[::]:\" + args.port)\n  server.start()\n  server.wait_for_termination()\n\n\nif __name__ == \"__main__\":\n  serve()\n"
  },
  {
    "path": "grpc/examples/swift/Greeter/Package.swift",
    "content": "// swift-tools-version:5.10\n/*\n * Copyright 2020 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport PackageDescription\n\nlet package = Package(\n  name: \"Greeter\",\n  platforms: [\n    .iOS(.v12),\n    .macOS(.v10_14),\n  ],\n  dependencies: [\n    .package(path: \"../../../../swift\"),\n    .package(url: \"https://github.com/grpc/grpc-swift.git\", from: \"1.0.0\"),\n  ],\n  targets: [\n    // Targets are the basic building blocks of a package. A target can define a module or a test suite.\n    // Targets can depend on other targets in this package, and on products in packages which this package depends on.\n    .target(\n      name: \"Model\",\n      dependencies: [\n        \"GRPC\",\n        \"FlatBuffers\",\n      ],\n      path: \"Sources/Model\"),\n\n    // Client for the Greeter example\n    .target(\n      name: \"Client\",\n      dependencies: [\n        \"GRPC\",\n        \"Model\",\n      ],\n      path: \"Sources/client\"),\n\n    // Server for the Greeter example\n    .target(\n      name: \"Server\",\n      dependencies: [\n        \"GRPC\",\n        \"Model\",\n      ],\n      path: \"Sources/server\"),\n  ])\n"
  },
  {
    "path": "grpc/examples/swift/Greeter/README.md",
    "content": "# FlatBuffers.GRPC.Swift\n\nThe following is Swift example on how GRPC would be with Swift Flatbuffers, you can simply run the following commands:\n\n`swift run Server`\n\n`swift run Client {port} {name}`\n"
  },
  {
    "path": "grpc/examples/swift/Greeter/Sources/Model/greeter.grpc.swift",
    "content": "// Generated GRPC code for FlatBuffers swift!\n/// The following code is generated by the Flatbuffers library which might not be in sync with grpc-swift\n/// in case of an issue please open github issue, though it would be maintained\n\n// swiftlint:disable all\n// swiftformat:disable all\n\n#if !os(Windows)\nimport Foundation\nimport GRPC\nimport NIO\nimport NIOHTTP1\nimport FlatBuffers\n\npublic protocol GRPCFlatBufPayload: GRPCPayload, FlatBufferGRPCMessage {}\npublic extension GRPCFlatBufPayload {\n  init(serializedByteBuffer: inout NIO.ByteBuffer) throws {\n    self.init(byteBuffer: FlatBuffers.ByteBuffer(contiguousBytes: serializedByteBuffer.readableBytesView, count: serializedByteBuffer.readableBytes))\n  }\n  func serialize(into buffer: inout NIO.ByteBuffer) throws {\n    withUnsafeReadableBytes { buffer.writeBytes($0) }\n  }\n}\nextension Message: GRPCFlatBufPayload {}\n\n/// Usage: instantiate models_GreeterServiceClient, then call methods of this protocol to make API calls.\npublic protocol models_GreeterClientProtocol: GRPCClient {\n\n  var serviceName: String { get }\n\n  var interceptors: models_GreeterClientInterceptorFactoryProtocol? { get }\n\n  func SayHello(\n    _ request: Message<models_HelloRequest>\n    , callOptions: CallOptions?\n  ) -> UnaryCall<Message<models_HelloRequest>, Message<models_HelloReply>>\n\n  func SayManyHellos(\n    _ request: Message<models_HelloRequest>\n    , callOptions: CallOptions?,\n    handler: @escaping (Message<models_HelloReply>) -> Void\n  ) -> ServerStreamingCall<Message<models_HelloRequest>, Message<models_HelloReply>>\n\n}\n\nextension models_GreeterClientProtocol {\n\n  public var serviceName: String { \"models.Greeter\" }\n\n  public func SayHello(\n    _ request: Message<models_HelloRequest>\n    , callOptions: CallOptions? = nil\n  ) -> UnaryCall<Message<models_HelloRequest>, Message<models_HelloReply>> {\n    return self.makeUnaryCall(\n      path: \"/models.Greeter/SayHello\",\n      request: request,\n      callOptions: callOptions ?? self.defaultCallOptions,\n      interceptors: self.interceptors?.makeSayHelloInterceptors() ?? []\n    )\n  }\n\n  public func SayManyHellos(\n    _ request: Message<models_HelloRequest>\n    , callOptions: CallOptions? = nil,\n    handler: @escaping (Message<models_HelloReply>) -> Void\n  ) -> ServerStreamingCall<Message<models_HelloRequest>, Message<models_HelloReply>> {\n    return self.makeServerStreamingCall(\n      path: \"/models.Greeter/SayManyHellos\",\n      request: request,\n      callOptions: callOptions ?? self.defaultCallOptions,\n      interceptors: self.interceptors?.makeSayManyHellosInterceptors() ?? [],\n      handler: handler\n    )\n  }\n}\n\npublic protocol models_GreeterClientInterceptorFactoryProtocol {\n  /// - Returns: Interceptors to use when invoking 'SayHello'.\n  func makeSayHelloInterceptors() -> [ClientInterceptor<Message<models_HelloRequest>, Message<models_HelloReply>>]\n\n  /// - Returns: Interceptors to use when invoking 'SayManyHellos'.\n  func makeSayManyHellosInterceptors() -> [ClientInterceptor<Message<models_HelloRequest>, Message<models_HelloReply>>]\n\n}\n\npublic final class models_GreeterServiceClient: models_GreeterClientProtocol {\n  public let channel: GRPCChannel\n  public var defaultCallOptions: CallOptions\n  public var interceptors: models_GreeterClientInterceptorFactoryProtocol?\n\n  public init(\n    channel: GRPCChannel,\n    defaultCallOptions: CallOptions = CallOptions(),\n    interceptors: models_GreeterClientInterceptorFactoryProtocol? = nil\n  ) {\n    self.channel = channel\n    self.defaultCallOptions = defaultCallOptions\n    self.interceptors = interceptors\n  }\n}\n\npublic protocol models_GreeterProvider: CallHandlerProvider {\n  var interceptors: models_GreeterServerInterceptorFactoryProtocol? { get }\n  func SayHello(request: Message<models_HelloRequest>, context: StatusOnlyCallContext) -> EventLoopFuture<Message<models_HelloReply>>\n  func SayManyHellos(request: Message<models_HelloRequest>, context: StreamingResponseCallContext<Message<models_HelloReply>>) -> EventLoopFuture<GRPCStatus>\n}\n\npublic extension models_GreeterProvider {\n\n  var serviceName: Substring { return \"models.Greeter\" }\n\n  func handle(method name: Substring, context: CallHandlerContext) -> GRPCServerHandlerProtocol? {\n    switch name {\n    case \"SayHello\":\n    return UnaryServerHandler(\n      context: context,\n      requestDeserializer: GRPCPayloadDeserializer<Message<models_HelloRequest>>(),\n      responseSerializer: GRPCPayloadSerializer<Message<models_HelloReply>>(),\n      interceptors: self.interceptors?.makeSayHelloInterceptors() ?? [],\n      userFunction: self.SayHello(request:context:))\n\n    case \"SayManyHellos\":\n    return ServerStreamingServerHandler(\n      context: context,\n      requestDeserializer: GRPCPayloadDeserializer<Message<models_HelloRequest>>(),\n      responseSerializer: GRPCPayloadSerializer<Message<models_HelloReply>>(),\n      interceptors: self.interceptors?.makeSayManyHellosInterceptors() ?? [],\n      userFunction: self.SayManyHellos(request:context:))\n\n    default: return nil;\n    }\n  }\n\n}\n\npublic protocol models_GreeterServerInterceptorFactoryProtocol {\n  /// - Returns: Interceptors to use when handling 'SayHello'.\n  ///   Defaults to calling `self.makeInterceptors()`.\n  func makeSayHelloInterceptors() -> [ServerInterceptor<Message<models_HelloRequest>, Message<models_HelloReply>>]\n\n  /// - Returns: Interceptors to use when handling 'SayManyHellos'.\n  ///   Defaults to calling `self.makeInterceptors()`.\n  func makeSayManyHellosInterceptors() -> [ServerInterceptor<Message<models_HelloRequest>, Message<models_HelloReply>>]\n\n}\n#endif\n\n"
  },
  {
    "path": "grpc/examples/swift/Greeter/Sources/Model/greeter_generated.swift",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// swiftlint:disable all\n// swiftformat:disable all\n\n#if canImport(Common)\nimport Common\n#endif\n\nimport FlatBuffers\n\npublic struct models_HelloReply: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private struct VT {\n    static let message: VOffset = 4\n  }\n\n  public var message: String? { let o = _accessor.offset(VT.message); return o == 0 ? nil : _accessor.string(at: o) }\n  public var messageSegmentArray: [UInt8]? { return _accessor.getVector(at: VT.message) }\n  public static func startHelloReply(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) }\n  public static func add(message: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: message, at: VT.message) }\n  public static func endHelloReply(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n  public static func createHelloReply(\n    _ fbb: inout FlatBufferBuilder,\n    messageOffset message: Offset = Offset()\n  ) -> Offset {\n    let __start = models_HelloReply.startHelloReply(&fbb)\n    models_HelloReply.add(message: message, &fbb)\n    return models_HelloReply.endHelloReply(&fbb, start: __start)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    try _v.visit(field: VT.message, fieldName: \"message\", required: false, type: ForwardOffset<String>.self)\n    _v.finish()\n  }\n}\n\nextension models_HelloReply: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case message = \"message\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    try container.encodeIfPresent(message, forKey: .message)\n  }\n}\n\npublic struct models_HelloRequest: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private struct VT {\n    static let name: VOffset = 4\n  }\n\n  public var name: String? { let o = _accessor.offset(VT.name); return o == 0 ? nil : _accessor.string(at: o) }\n  public var nameSegmentArray: [UInt8]? { return _accessor.getVector(at: VT.name) }\n  public static func startHelloRequest(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) }\n  public static func add(name: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: name, at: VT.name) }\n  public static func endHelloRequest(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n  public static func createHelloRequest(\n    _ fbb: inout FlatBufferBuilder,\n    nameOffset name: Offset = Offset()\n  ) -> Offset {\n    let __start = models_HelloRequest.startHelloRequest(&fbb)\n    models_HelloRequest.add(name: name, &fbb)\n    return models_HelloRequest.endHelloRequest(&fbb, start: __start)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    try _v.visit(field: VT.name, fieldName: \"name\", required: false, type: ForwardOffset<String>.self)\n    _v.finish()\n  }\n}\n\nextension models_HelloRequest: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case name = \"name\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    try container.encodeIfPresent(name, forKey: .name)\n  }\n}\n\n"
  },
  {
    "path": "grpc/examples/swift/Greeter/Sources/client/main.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport FlatBuffers\nimport GRPC\nimport Logging\nimport Model\nimport NIO\n\n// Quieten the logs.\nLoggingSystem.bootstrap {\n  var handler = StreamLogHandler.standardOutput(label: $0)\n  handler.logLevel = .critical\n  return handler\n}\n\nfunc greet(name: String, client greeter: models_GreeterServiceClient) {\n  // Form the request with the name, if one was provided.\n  var builder = FlatBufferBuilder()\n  let nameOff = builder.create(string: name)\n  let root = models_HelloRequest.createHelloRequest(\n    &builder,\n    nameOffset: nameOff)\n  builder.finish(offset: root)\n\n  // Make the RPC call to the server.\n  let sayHello =\n    greeter\n      .SayHello(Message<models_HelloRequest>(builder: &builder))\n\n  // wait() on the response to stop the program from exiting before the response is received.\n  do {\n    let response = try sayHello.response.wait()\n    print(\"Greeter SayHello received: \\(response.object.message ?? \"Unknown\")\")\n  } catch {\n    print(\"Greeter failed: \\(error)\")\n  }\n\n  let surname = builder.create(string: name)\n  let manyRoot = models_HelloRequest.createHelloRequest(\n    &builder,\n    nameOffset: surname)\n  builder.finish(offset: manyRoot)\n\n  let call = greeter.SayManyHellos(Message(builder: &builder)) { message in\n    print(\n      \"Greeter SayManyHellos received: \\(message.object.message  ?? \"Unknown\")\")\n  }\n\n  let status = try! call.status.recover { _ in .processingError }.wait()\n  if status.code != .ok {\n    print(\"RPC failed: \\(status)\")\n  }\n}\n\nfunc main(args: [String]) {\n  // arg0 (dropped) is the program name. We expect arg1 to be the port, and arg2 (optional) to be\n  // the name sent in the request.\n  let arg1 = args.dropFirst(1).first\n  let arg2 = args.dropFirst(2).first\n\n  switch (arg1.flatMap(Int.init), arg2) {\n  case (.none, _):\n    print(\"Usage: PORT [NAME]\")\n    exit(1)\n\n  case (.some(let port), let name):\n    // Setup an `EventLoopGroup` for the connection to run on.\n    //\n    // See: https://github.com/apple/swift-nio#eventloops-and-eventloopgroups\n    let group = MultiThreadedEventLoopGroup(numberOfThreads: 1)\n\n    // Make sure the group is shutdown when we're done with it.\n    defer {\n      try! group.syncShutdownGracefully()\n    }\n\n    // Configure the channel, we're not using TLS so the connection is `insecure`.\n    let channel = ClientConnection.insecure(group: group)\n      .connect(host: \"localhost\", port: port)\n\n    // Close the connection when we're done with it.\n    defer {\n      try! channel.close().wait()\n    }\n\n    // Provide the connection to the generated client.\n    let greeter = models_GreeterServiceClient(channel: channel)\n\n    // Do the greeting.\n    greet(name: name ?? \"FlatBuffers!\", client: greeter)\n  }\n}\n\nmain(args: CommandLine.arguments)\n"
  },
  {
    "path": "grpc/examples/swift/Greeter/Sources/server/main.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport FlatBuffers\nimport GRPC\nimport Logging\nimport Model\nimport NIO\n\nclass Greeter: models_GreeterProvider {\n\n  var interceptors: models_GreeterServerInterceptorFactoryProtocol?\n\n  let greetings: [String]\n\n  init() {\n    greetings = [\"Hi\", \"Hallo\", \"Ciao\"]\n  }\n\n  func SayHello(\n    request: Message<models_HelloRequest>,\n    context: StatusOnlyCallContext)\n    -> EventLoopFuture<Message<models_HelloReply>>\n  {\n    let recipient = request.object.name ?? \"Stranger\"\n\n    var builder = FlatBufferBuilder()\n    let off = builder.create(string: \"Hello \\(recipient)\")\n    let root = models_HelloReply.createHelloReply(&builder, messageOffset: off)\n    builder.finish(offset: root)\n    return context.eventLoop\n      .makeSucceededFuture(Message<models_HelloReply>(builder: &builder))\n  }\n\n  func SayManyHellos(\n    request: Message<models_HelloRequest>,\n    context: StreamingResponseCallContext<Message<models_HelloReply>>)\n    -> EventLoopFuture<GRPCStatus>\n  {\n    for name in greetings {\n      var builder = FlatBufferBuilder()\n      let off =\n        builder\n          .create(string: \"\\(name) \\(request.object.name ?? \"Unknown\")\")\n      let root = models_HelloReply.createHelloReply(\n        &builder,\n        messageOffset: off)\n      builder.finish(offset: root)\n      _ = context.sendResponse(Message<models_HelloReply>(builder: &builder))\n    }\n    return context.eventLoop.makeSucceededFuture(.ok)\n  }\n}\n\n// Quieten the logs.\nLoggingSystem.bootstrap {\n  var handler = StreamLogHandler.standardOutput(label: $0)\n  handler.logLevel = .critical\n  return handler\n}\n\nlet group = MultiThreadedEventLoopGroup(numberOfThreads: 1)\ndefer {\n  try! group.syncShutdownGracefully()\n}\n\n// Create some configuration for the server:\nlet configuration = Server.Configuration(\n  target: .hostAndPort(\"localhost\", 0),\n  eventLoopGroup: group,\n  serviceProviders: [Greeter()])\n\n// Start the server and print its address once it has started.\nlet server = Server.start(configuration: configuration)\nserver.map {\n  $0.channel.localAddress\n}.whenSuccess { address in\n  print(\"server started on port \\(address!.port!)\")\n}\n\n// Wait on the server's `onClose` future to stop the program from exiting.\n_ = try server.flatMap {\n  $0.onClose\n}.wait()\n"
  },
  {
    "path": "grpc/examples/ts/greeter/README.md",
    "content": "# TS Greeter example\n\nThe following is an example on how to run the TS grpc server. Make sure that you have `Typescript` installed\n\nyou would need to run `npm run build` or simply use `npm install && tsc`\n\n## How to run Server:\n\n- `npm run server`\n\n## How to run Client:\n\n- `npm run client 3000`\n"
  },
  {
    "path": "grpc/examples/ts/greeter/package.json",
    "content": "{\n  \"name\": \"flatbuffers-js-grpc\",\n  \"version\": \"1.0.0\",\n  \"author\": \"mustii@mmk.one\",\n  \"scripts\": {\n    \"build\": \"npm install && tsc\",\n    \"client\": \"node dist/client.js\",\n    \"server\": \"node dist/server.js\"\n  },\n  \"dependencies\": {\n    \"@grpc/grpc-js\": \"^1.3.2\",\n    \"flatbuffers\": \"^2.0.0\"\n  }\n}\n"
  },
  {
    "path": "grpc/examples/ts/greeter/src/client.ts",
    "content": "import * as grpc from '@grpc/grpc-js';\nimport * as flatbuffers from 'flatbuffers';\nimport {GreeterClient} from './greeter_grpc';\nimport {HelloReply} from './models/hello-reply';\nimport {HelloRequest} from './models/hello-request';\n\nasync function main(PORT: Number, name: string) {\n  const client = new GreeterClient(\n    `localhost:${PORT}`,\n    grpc.credentials.createInsecure(),\n  );\n  const builder = new flatbuffers.Builder();\n  const offset = builder.createString(name);\n  const root = HelloRequest.createHelloRequest(builder, offset);\n  builder.finish(root);\n  const buffer = HelloRequest.getRootAsHelloRequest(\n    new flatbuffers.ByteBuffer(builder.asUint8Array()),\n  );\n\n  client.SayHello(buffer, (err, response) => {\n    console.log(response.message());\n  });\n\n  const data = client.SayManyHellos(buffer, null);\n\n  data.on('data', (data) => {\n    console.log(data.message());\n  });\n}\n\nconst args = process.argv.slice(2);\nconst PORT = Number(args[0]);\nconst name: string = args[1] ?? 'flatbuffers';\n\nif (PORT) {\n  main(PORT, name);\n} else {\n  throw new Error('Requires a valid port number.');\n}\n"
  },
  {
    "path": "grpc/examples/ts/greeter/src/greeter.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport * as models from './models.js';\n"
  },
  {
    "path": "grpc/examples/ts/greeter/src/greeter_generated.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\nexport {HelloReply} from './models/hello-reply.js';\nexport {HelloRequest} from './models/hello-request.js';\n"
  },
  {
    "path": "grpc/examples/ts/greeter/src/greeter_grpc.d.ts",
    "content": "// Generated GRPC code for FlatBuffers TS *** DO NOT EDIT ***\nimport * as flatbuffers from 'flatbuffers';\nimport { HelloReply as models_HelloReply } from './models/hello-reply';\nimport { HelloRequest as models_HelloRequest } from './models/hello-request';\n\nimport * as grpc from '@grpc/grpc-js';\n\ninterface IGreeterService extends grpc.ServiceDefinition<grpc.UntypedServiceImplementation> {\n  SayHello: IGreeterService_ISayHello;\n  SayManyHellos: IGreeterService_ISayManyHellos;\n}\ninterface IGreeterService_ISayHello extends grpc.MethodDefinition<models_HelloRequest, models_HelloReply> {\n  path: string; // /models.Greeter/SayHello\n  requestStream: boolean; // false\n  responseStream: boolean; // false\n  requestSerialize: grpc.serialize<models_HelloRequest>;\n  requestDeserialize: grpc.deserialize<models_HelloRequest>;\n  responseSerialize: grpc.serialize<models_HelloReply>;\n  responseDeserialize: grpc.deserialize<models_HelloReply>;\n}\n\ninterface IGreeterService_ISayManyHellos extends grpc.MethodDefinition<models_HelloRequest, models_HelloReply> {\n  path: string; // /models.Greeter/SayManyHellos\n  requestStream: boolean; // false\n  responseStream: boolean; // true\n  requestSerialize: grpc.serialize<models_HelloRequest>;\n  requestDeserialize: grpc.deserialize<models_HelloRequest>;\n  responseSerialize: grpc.serialize<models_HelloReply>;\n  responseDeserialize: grpc.deserialize<models_HelloReply>;\n}\n\n\nexport const GreeterService: IGreeterService;\n\nexport interface IGreeterServer extends grpc.UntypedServiceImplementation {\n  SayHello: grpc.handleUnaryCall<models_HelloRequest, models_HelloReply>;\n  SayManyHellos: grpc.handleServerStreamingCall<models_HelloRequest, models_HelloReply>;\n}\n\nexport interface IGreeterClient {\n  SayHello(request: models_HelloRequest, callback: (error: grpc.ServiceError | null, response: models_HelloReply) => void): grpc.ClientUnaryCall;\n  SayHello(request: models_HelloRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: models_HelloReply) => void): grpc.ClientUnaryCall;\n  SayHello(request: models_HelloRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: models_HelloReply) => void): grpc.ClientUnaryCall;\n  SayManyHellos(request: models_HelloRequest, metadata: grpc.Metadata): grpc.ClientReadableStream<models_HelloReply>;\n  SayManyHellos(request: models_HelloRequest, options: Partial<grpc.CallOptions>): grpc.ClientReadableStream<models_HelloReply>;\n}\n\nexport class GreeterClient extends grpc.Client implements IGreeterClient {\n  constructor(address: string, credentials: grpc.ChannelCredentials, options?: object);\n  public SayHello(request: models_HelloRequest, callback: (error: grpc.ServiceError | null, response: models_HelloReply) => void): grpc.ClientUnaryCall;\n  public SayHello(request: models_HelloRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: models_HelloReply) => void): grpc.ClientUnaryCall;\n  public SayHello(request: models_HelloRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: models_HelloReply) => void): grpc.ClientUnaryCall;\n  public SayManyHellos(request: models_HelloRequest, metadata: grpc.Metadata): grpc.ClientReadableStream<models_HelloReply>;\n  public SayManyHellos(request: models_HelloRequest, options: Partial<grpc.CallOptions>): grpc.ClientReadableStream<models_HelloReply>;\n}\n\n"
  },
  {
    "path": "grpc/examples/ts/greeter/src/greeter_grpc.js",
    "content": "// Generated GRPC code for FlatBuffers TS *** DO NOT EDIT ***\nimport * as flatbuffers from 'flatbuffers';\nimport { HelloReply as models_HelloReply } from './models/hello-reply';\nimport { HelloRequest as models_HelloRequest } from './models/hello-request';\n\nvar grpc = require('@grpc/grpc-js');\n\nfunction serialize_models_HelloReply(buffer_args) {\n  if (!(buffer_args instanceof models_HelloReply)) {\n    throw new Error('Expected argument of type HelloReply');\n  }\n  return Buffer.from(buffer_args.serialize());\n}\n\nfunction deserialize_models_HelloReply(buffer) {\n  return models_HelloReply.getRootAsHelloReply(new flatbuffers.ByteBuffer(buffer))\n}\n\n\nfunction serialize_models_HelloRequest(buffer_args) {\n  if (!(buffer_args instanceof models_HelloRequest)) {\n    throw new Error('Expected argument of type HelloRequest');\n  }\n  return Buffer.from(buffer_args.serialize());\n}\n\nfunction deserialize_models_HelloRequest(buffer) {\n  return models_HelloRequest.getRootAsHelloRequest(new flatbuffers.ByteBuffer(buffer))\n}\n\n\nvar GreeterService = exports.GreeterService = {\n  SayHello: {\n    path: '/models.Greeter/SayHello',\n    requestStream: false,\n    responseStream: false,\n    requestType: flatbuffers.ByteBuffer,\n    responseType: models_HelloReply,\n    requestSerialize: serialize_models_HelloRequest,\n    requestDeserialize: deserialize_models_HelloRequest,\n    responseSerialize: serialize_models_HelloReply,\n    responseDeserialize: deserialize_models_HelloReply,\n  },\n  SayManyHellos: {\n    path: '/models.Greeter/SayManyHellos',\n    requestStream: false,\n    responseStream: true,\n    requestType: flatbuffers.ByteBuffer,\n    responseType: models_HelloReply,\n    requestSerialize: serialize_models_HelloRequest,\n    requestDeserialize: deserialize_models_HelloRequest,\n    responseSerialize: serialize_models_HelloReply,\n    responseDeserialize: deserialize_models_HelloReply,\n  },\n};\nexports.GreeterClient = grpc.makeGenericClientConstructor(GreeterService);\n"
  },
  {
    "path": "grpc/examples/ts/greeter/src/models/hello-reply.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\n\n\nexport class HelloReply {\n  bb: flatbuffers.ByteBuffer|null = null;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):HelloReply {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\nstatic getRootAsHelloReply(bb:flatbuffers.ByteBuffer, obj?:HelloReply):HelloReply {\n  return (obj || new HelloReply()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic getSizePrefixedRootAsHelloReply(bb:flatbuffers.ByteBuffer, obj?:HelloReply):HelloReply {\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n  return (obj || new HelloReply()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nmessage():string|null\nmessage(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null\nmessage(optionalEncoding?:any):string|Uint8Array|null {\n  const offset = this.bb!.__offset(this.bb_pos, 4);\n  return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n}\n\nstatic startHelloReply(builder:flatbuffers.Builder) {\n  builder.startObject(1);\n}\n\nstatic addMessage(builder:flatbuffers.Builder, messageOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(0, messageOffset, 0);\n}\n\nstatic endHelloReply(builder:flatbuffers.Builder):flatbuffers.Offset {\n  const offset = builder.endObject();\n  return offset;\n}\n\nstatic createHelloReply(builder:flatbuffers.Builder, messageOffset:flatbuffers.Offset):flatbuffers.Offset {\n  HelloReply.startHelloReply(builder);\n  HelloReply.addMessage(builder, messageOffset);\n  return HelloReply.endHelloReply(builder);\n}\n\nserialize():Uint8Array {\n  return this.bb!.bytes();\n}\n\nstatic deserialize(buffer: Uint8Array):HelloReply {\n  return HelloReply.getRootAsHelloReply(new flatbuffers.ByteBuffer(buffer))\n}\n}\n"
  },
  {
    "path": "grpc/examples/ts/greeter/src/models/hello-request.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\n\n\nexport class HelloRequest {\n  bb: flatbuffers.ByteBuffer|null = null;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):HelloRequest {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\nstatic getRootAsHelloRequest(bb:flatbuffers.ByteBuffer, obj?:HelloRequest):HelloRequest {\n  return (obj || new HelloRequest()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic getSizePrefixedRootAsHelloRequest(bb:flatbuffers.ByteBuffer, obj?:HelloRequest):HelloRequest {\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n  return (obj || new HelloRequest()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nname():string|null\nname(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null\nname(optionalEncoding?:any):string|Uint8Array|null {\n  const offset = this.bb!.__offset(this.bb_pos, 4);\n  return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n}\n\nstatic startHelloRequest(builder:flatbuffers.Builder) {\n  builder.startObject(1);\n}\n\nstatic addName(builder:flatbuffers.Builder, nameOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(0, nameOffset, 0);\n}\n\nstatic endHelloRequest(builder:flatbuffers.Builder):flatbuffers.Offset {\n  const offset = builder.endObject();\n  return offset;\n}\n\nstatic createHelloRequest(builder:flatbuffers.Builder, nameOffset:flatbuffers.Offset):flatbuffers.Offset {\n  HelloRequest.startHelloRequest(builder);\n  HelloRequest.addName(builder, nameOffset);\n  return HelloRequest.endHelloRequest(builder);\n}\n\nserialize():Uint8Array {\n  return this.bb!.bytes();\n}\n\nstatic deserialize(buffer: Uint8Array):HelloRequest {\n  return HelloRequest.getRootAsHelloRequest(new flatbuffers.ByteBuffer(buffer))\n}\n}\n"
  },
  {
    "path": "grpc/examples/ts/greeter/src/models.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport { HelloReply } from './models/hello-reply.js';\nexport { HelloRequest } from './models/hello-request.js';\n"
  },
  {
    "path": "grpc/examples/ts/greeter/src/server.ts",
    "content": "import * as grpc from '@grpc/grpc-js';\nimport * as flatbuffers from 'flatbuffers';\nimport {GreeterService, IGreeterServer} from './greeter_grpc';\nimport {HelloReply} from './models/hello-reply';\nimport {HelloRequest} from './models/hello-request';\n\nconst greeter: IGreeterServer = {\n  SayHello(\n    call: grpc.ServerUnaryCall<HelloRequest, HelloReply>,\n    callback: grpc.sendUnaryData<HelloReply>,\n  ): void {\n    console.log(`SayHello ${call.request.name()}`);\n    const builder = new flatbuffers.Builder();\n    const offset = builder.createString(`welcome ${call.request.name()}`);\n    const root = HelloReply.createHelloReply(builder, offset);\n    builder.finish(root);\n    callback(\n      null,\n      HelloReply.getRootAsHelloReply(\n        new flatbuffers.ByteBuffer(builder.asUint8Array()),\n      ),\n    );\n  },\n  async SayManyHellos(\n    call: grpc.ServerWritableStream<HelloRequest, HelloReply>,\n  ): Promise<void> {\n    const name = call.request.name();\n    console.log(`${call.request.name()} saying hi in different langagues`);\n    ['Hi', 'Hallo', 'Ciao'].forEach((element) => {\n      const builder = new flatbuffers.Builder();\n      const offset = builder.createString(`${element} ${name}`);\n      const root = HelloReply.createHelloReply(builder, offset);\n      builder.finish(root);\n      call.write(\n        HelloReply.getRootAsHelloReply(\n          new flatbuffers.ByteBuffer(builder.asUint8Array()),\n        ),\n      );\n    });\n    call.end();\n  },\n};\n\nfunction serve(): void {\n  const PORT = 3000;\n  const server = new grpc.Server();\n  server.addService(GreeterService, greeter);\n  console.log(`Listening on ${PORT}`);\n  server.bindAsync(\n    `localhost:${PORT}`,\n    grpc.ServerCredentials.createInsecure(),\n    (err: Error | null, port: number) => {\n      if (err) {\n        console.error(`Server error: ${err.message}`);\n      } else {\n        console.log(`Server bound on port: ${port}`);\n        server.start();\n      }\n    },\n  );\n}\n\nserve();\n"
  },
  {
    "path": "grpc/examples/ts/greeter/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n      \"target\": \"es5\",\n      \"module\": \"commonjs\",\n      \"outDir\": \"./dist\",\n      \"allowJs\": true,\n      \"sourceMap\": true,\n      \"strict\": true,\n      \"noImplicitAny\": false,\n      \"strictNullChecks\": false,\n      \"esModuleInterop\": true,\n      \"baseUrl\": \"./\",\n      \"typeRoots\": [\"node_modules/@types\"],\n      \"skipLibCheck\": true, \n      \"forceConsistentCasingInFileNames\": true\n    }\n  }"
  },
  {
    "path": "grpc/flatbuffers-java-grpc/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <groupId>com.google.flatbuffers</groupId>\n        <artifactId>flatbuffers-parent</artifactId>\n        <version>2.0.3</version>\n    </parent>\n    <artifactId>flatbuffers-java-grpc</artifactId>\n    <name>${project.artifactId}</name>\n    <packaging>bundle</packaging>\n    <description>\n        Utilities supporting generated code for GRPC\n    </description>\n    <developers>\n        <developer>\n            <name>Wouter van Oortmerssen</name>\n        </developer>\n        <developer>\n            <name>Yuri Finkelstein</name>\n            <url>https://github.com/yfinkelstein</url>\n        </developer>\n    </developers>\n    <properties>\n        <gRPC.version>1.67.1</gRPC.version>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.flatbuffers</groupId>\n            <artifactId>flatbuffers-java</artifactId>\n            <version>${project.parent.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>io.grpc</groupId>\n            <artifactId>grpc-core</artifactId>\n            <version>${gRPC.version}</version>\n        </dependency>\n  </dependencies>\n</project>\n\n"
  },
  {
    "path": "grpc/flatbuffers-java-grpc/src/main/java/com/google/flatbuffers/grpc/FlatbuffersUtils.java",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.google.flatbuffers.grpc;\n\nimport com.google.flatbuffers.Table;\nimport io.grpc.Drainable;\nimport io.grpc.KnownLength;\nimport io.grpc.MethodDescriptor;\nimport java.io.ByteArrayInputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.OutputStream;\nimport java.nio.ByteBuffer;\nimport javax.annotation.Nullable;\n\npublic class FlatbuffersUtils {\n  public abstract static class FBExtactor<T extends Table> {\n    T extract(InputStream stream) throws IOException {\n      if (stream instanceof KnownLength) {\n        int size = stream.available();\n        ByteBuffer buffer = ByteBuffer.allocate(size);\n        stream.read(buffer.array());\n        return extract(buffer);\n      } else\n        throw new RuntimeException(\n            \"The class \"\n                + stream.getClass().getCanonicalName()\n                + \" does not extend from KnownLength \");\n    }\n\n    public abstract T extract(ByteBuffer buffer);\n  }\n\n  static class FBInputStream extends InputStream implements Drainable, KnownLength {\n    private final ByteBuffer buffer;\n    private final int size;\n    @Nullable private ByteArrayInputStream inputStream;\n\n    FBInputStream(ByteBuffer buffer) {\n      this.buffer = buffer;\n      this.size = buffer.remaining();\n    }\n\n    private void makeStreamIfNotAlready() {\n      if (inputStream == null)\n        inputStream = new ByteArrayInputStream(buffer.array(), buffer.position(), size);\n    }\n\n    @Override\n    public int drainTo(OutputStream target) throws IOException {\n      target.write(buffer.array(), buffer.position(), size);\n      return size;\n    }\n\n    @Override\n    public int read() throws IOException {\n      makeStreamIfNotAlready();\n      return inputStream.read();\n    }\n\n    @Override\n    public int read(byte[] b, int off, int len) throws IOException {\n      makeStreamIfNotAlready();\n      if (inputStream == null) {\n        if (len >= size) {\n          System.arraycopy(buffer.array(), buffer.position(), b, off, size);\n          return size;\n        } else {\n          makeStreamIfNotAlready();\n          return inputStream.read(b, off, len);\n        }\n      } else return inputStream.read(b, off, len);\n    }\n\n    @Override\n    public int available() throws IOException {\n      return inputStream == null ? size : inputStream.available();\n    }\n  }\n\n  public static <T extends Table> MethodDescriptor.Marshaller<T> marshaller(\n      final Class<T> clazz, final FBExtactor<T> extractor) {\n    return new MethodDescriptor.ReflectableMarshaller<T>() {\n      @Override\n      public Class<T> getMessageClass() {\n        return clazz;\n      }\n\n      @Override\n      public InputStream stream(T value) {\n        return new FBInputStream(value.getByteBuffer());\n      }\n\n      @Override\n      public T parse(InputStream stream) {\n        try {\n          return extractor.extract(stream);\n        } catch (IOException e) {\n          throw new RuntimeException(e);\n        }\n      }\n    };\n  }\n}\n"
  },
  {
    "path": "grpc/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <groupId>com.google.flatbuffers</groupId>\n    <artifactId>flatbuffers-parent</artifactId>\n    <packaging>pom</packaging>\n    <version>2.0.3</version>\n    <name>flatbuffers-parent</name>\n    <description>parent pom for flatbuffers java artifacts</description>\n    <properties>\n        <scm.url>https://github.com/google/flatbuffers</scm.url>\n        <scm.connection>scm:git:${scm.url}.git</scm.connection>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n    </properties>\n\n    <licenses>\n        <license>\n            <name>The Apache Software License, Version 2.0</name>\n            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>\n            <distribution>repo</distribution>\n        </license>\n    </licenses>\n\n    <issueManagement>\n        <system>GitHub</system>\n        <url>https://github.com/google/flatbuffers/issues</url>\n    </issueManagement>\n\n    <developers>\n        <developer>\n            <name>Wouter van Oortmerssen</name>\n        </developer>\n    </developers>\n\n    <url>${scm.url}</url>\n\n    <scm>\n        <connection>${scm.connection}</connection>\n        <developerConnection>${scm.connection}</developerConnection>\n        <url>${scm.url}</url>\n        <tag>HEAD</tag>\n    </scm>\n\n    <distributionManagement>\n        <snapshotRepository>\n            <id>ossrh</id>\n            <url>https://oss.sonatype.org/content/repositories/snapshots</url>\n        </snapshotRepository>\n    </distributionManagement>\n\n    <dependencies>\n        <dependency>\n            <groupId>junit</groupId>\n            <artifactId>junit</artifactId>\n            <version>4.13.1</version>\n            <scope>test</scope>\n        </dependency>\n\n    </dependencies>\n    <build>\n        <extensions>\n            <extension>\n                <!--\n                    os-maven-plugin is a Maven extension/plugin that generates various useful platform-dependent\n                    project properties normalized from ${os.detected.name} and ${os.detected.arch}.\n                -->\n                <groupId>kr.motd.maven</groupId>\n                <artifactId>os-maven-plugin</artifactId>\n                <version>1.5.0.Final</version>\n            </extension>\n        </extensions>\n        <pluginManagement>\n            <plugins>\n                <plugin>\n                    <artifactId>maven-compiler-plugin</artifactId>\n                    <version>3.6.1</version>\n                </plugin>\n                <plugin>\n                    <artifactId>maven-jar-plugin</artifactId>\n                    <version>3.0.2</version>\n                </plugin>\n                <plugin>\n                    <artifactId>maven-source-plugin</artifactId>\n                    <version>3.0.1</version>\n                </plugin>\n                <plugin>\n                    <artifactId>maven-surefire-plugin</artifactId>\n                    <version>2.19.1</version>\n                </plugin>\n                <plugin>\n                    <artifactId>maven-javadoc-plugin</artifactId>\n                    <version>2.10.4</version>\n                </plugin>\n                <plugin>\n                    <groupId>org.codehaus.mojo</groupId>\n                    <artifactId>build-helper-maven-plugin</artifactId>\n                    <version>1.12</version>\n                </plugin>\n                <plugin>\n                    <artifactId>maven-dependency-plugin</artifactId>\n                    <version>2.8</version>\n                </plugin>\n                <plugin>\n                    <artifactId>maven-deploy-plugin</artifactId>\n                    <version>2.7</version>\n                </plugin>\n                <plugin>\n                    <artifactId>maven-gpg-plugin</artifactId>\n                    <version>1.5</version>\n                </plugin>\n                <plugin>\n                    <artifactId>maven-release-plugin</artifactId>\n                    <version>2.5.3</version>\n                </plugin>\n\n                <plugin>\n                    <groupId>org.codehaus.mojo</groupId>\n                    <artifactId>exec-maven-plugin</artifactId>\n                    <version>1.5.0</version>\n                </plugin>\n            </plugins>\n        </pluginManagement>\n\n        <plugins>\n            <plugin>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <configuration>\n                    <source>1.6</source>\n                    <target>1.6</target>\n                </configuration>\n            </plugin>\n            <plugin>\n                <artifactId>maven-surefire-plugin</artifactId>\n                <configuration>\n                    <includes>\n                        <include>**/*Test.java</include>\n                    </includes>\n                </configuration>\n            </plugin>\n            <plugin>\n                <artifactId>maven-source-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>attach-sources</id>\n                        <goals>\n                            <goal>jar</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <artifactId>maven-javadoc-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>attach-javadocs</id>\n                        <goals>\n                            <goal>jar</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.felix</groupId>\n                <artifactId>maven-bundle-plugin</artifactId>\n                <version>3.0.1</version>\n                <extensions>true</extensions>\n            </plugin>\n            <plugin>\n                <groupId>org.sonatype.plugins</groupId>\n                <artifactId>nexus-staging-maven-plugin</artifactId>\n                <version>1.6.7</version>\n                <extensions>true</extensions>\n                <configuration>\n                    <serverId>ossrh</serverId>\n                    <nexusUrl>https://oss.sonatype.org/</nexusUrl>\n                    <autoReleaseAfterClose>true</autoReleaseAfterClose>\n                </configuration>\n            </plugin>\n            <plugin>\n                <artifactId>maven-gpg-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>sign-artifacts</id>\n                        <phase>verify</phase>\n                        <goals>\n                            <goal>sign</goal>\n                        </goals>\n                        <configuration>\n                            <gpgArguments>\n                                <arg>--pinentry-mode</arg>\n                                <arg>loopback</arg>\n                            </gpgArguments>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <artifactId>maven-release-plugin</artifactId>\n                <configuration>\n                    <autoVersionSubmodules>true</autoVersionSubmodules>\n                    <useReleaseProfile>false</useReleaseProfile>\n                    <releaseProfiles>release</releaseProfiles>\n                    <goals>deploy</goals>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n\n    <modules>\n<!-- consider the benefits of publishing all maven artifacts in this project\n\n        <module>flatbuffers-compiler</module>\n        <module>flatbuffers-java</module>\n\n-->\n        <module>flatbuffers-java-grpc</module>\n    </modules>\n\n</project>\n"
  },
  {
    "path": "grpc/samples/greeter/client.cpp",
    "content": "#include <grpcpp/grpcpp.h>\n\n#include <iostream>\n#include <memory>\n#include <string>\n\n#include \"greeter.grpc.fb.h\"\n#include \"greeter_generated.h\"\n\nclass GreeterClient {\n public:\n  GreeterClient(std::shared_ptr<grpc::Channel> channel)\n      : stub_(Greeter::NewStub(channel)) {}\n\n  std::string SayHello(const std::string& name) {\n    flatbuffers::grpc::MessageBuilder mb;\n    auto name_offset = mb.CreateString(name);\n    auto request_offset = CreateHelloRequest(mb, name_offset);\n    mb.Finish(request_offset);\n    auto request_msg = mb.ReleaseMessage<HelloRequest>();\n\n    flatbuffers::grpc::Message<HelloReply> response_msg;\n\n    grpc::ClientContext context;\n\n    auto status = stub_->SayHello(&context, request_msg, &response_msg);\n    if (status.ok()) {\n      const HelloReply* response = response_msg.GetRoot();\n      return response->message()->str();\n    } else {\n      std::cerr << status.error_code() << \": \" << status.error_message()\n                << std::endl;\n      return \"RPC failed\";\n    }\n  }\n\n  void SayManyHellos(const std::string& name, int num_greetings,\n                     std::function<void(const std::string&)> callback) {\n    flatbuffers::grpc::MessageBuilder mb;\n    auto name_offset = mb.CreateString(name);\n    auto request_offset =\n        CreateManyHellosRequest(mb, name_offset, num_greetings);\n    mb.Finish(request_offset);\n    auto request_msg = mb.ReleaseMessage<ManyHellosRequest>();\n\n    flatbuffers::grpc::Message<HelloReply> response_msg;\n\n    grpc::ClientContext context;\n\n    auto stream = stub_->SayManyHellos(&context, request_msg);\n    while (stream->Read(&response_msg)) {\n      const HelloReply* response = response_msg.GetRoot();\n      callback(response->message()->str());\n    }\n    auto status = stream->Finish();\n    if (!status.ok()) {\n      std::cerr << status.error_code() << \": \" << status.error_message()\n                << std::endl;\n      callback(\"RPC failed\");\n    }\n  }\n\n private:\n  std::unique_ptr<Greeter::Stub> stub_;\n};\n\nint main(int argc, char** argv) {\n  std::string server_address(\"localhost:50051\");\n\n  auto channel =\n      grpc::CreateChannel(server_address, grpc::InsecureChannelCredentials());\n  GreeterClient greeter(channel);\n\n  std::string name(\"world\");\n\n  std::string message = greeter.SayHello(name);\n  std::cerr << \"Greeter received: \" << message << std::endl;\n\n  int num_greetings = 10;\n  greeter.SayManyHellos(name, num_greetings, [](const std::string& message) {\n    std::cerr << \"Greeter received: \" << message << std::endl;\n  });\n\n  return 0;\n}\n"
  },
  {
    "path": "grpc/samples/greeter/greeter.fbs",
    "content": "table HelloReply {\n  message:string;\n}\n\ntable HelloRequest {\n  name:string;\n}\n\ntable ManyHellosRequest {\n  name:string;\n  num_greetings:int;\n}\n\nrpc_service Greeter {\n  SayHello(HelloRequest):HelloReply;\n  SayManyHellos(ManyHellosRequest):HelloReply (streaming: \"server\");\n}\n"
  },
  {
    "path": "grpc/samples/greeter/server.cpp",
    "content": "#include <grpcpp/grpcpp.h>\n\n#include <iostream>\n#include <memory>\n#include <string>\n\n#include \"greeter.grpc.fb.h\"\n#include \"greeter_generated.h\"\n\nclass GreeterServiceImpl final : public Greeter::Service {\n  virtual grpc::Status SayHello(\n      grpc::ServerContext* context,\n      const flatbuffers::grpc::Message<HelloRequest>* request_msg,\n      flatbuffers::grpc::Message<HelloReply>* response_msg) override {\n    flatbuffers::grpc::MessageBuilder mb_;\n\n    // We call GetRoot to \"parse\" the message. Verification is already\n    // performed by default. See the notes below for more details.\n    const HelloRequest* request = request_msg->GetRoot();\n\n    // Fields are retrieved as usual with FlatBuffers\n    const std::string& name = request->name()->str();\n\n    // `flatbuffers::grpc::MessageBuilder` is a `FlatBufferBuilder` with a\n    // special allocator for efficient gRPC buffer transfer, but otherwise\n    // usage is the same as usual.\n    auto msg_offset = mb_.CreateString(\"Hello, \" + name);\n    auto hello_offset = CreateHelloReply(mb_, msg_offset);\n    mb_.Finish(hello_offset);\n\n    // The `ReleaseMessage<T>()` function detaches the message from the\n    // builder, so we can transfer the resopnse to gRPC while simultaneously\n    // detaching that memory buffer from the builer.\n    *response_msg = mb_.ReleaseMessage<HelloReply>();\n    assert(response_msg->Verify());\n\n    // Return an OK status.\n    return grpc::Status::OK;\n  }\n\n  virtual grpc::Status SayManyHellos(\n      grpc::ServerContext* context,\n      const flatbuffers::grpc::Message<ManyHellosRequest>* request_msg,\n      grpc::ServerWriter<flatbuffers::grpc::Message<HelloReply>>* writer)\n      override {\n    // The streaming usage below is simply a combination of standard gRPC\n    // streaming with the FlatBuffers usage shown above.\n    const ManyHellosRequest* request = request_msg->GetRoot();\n    const std::string& name = request->name()->str();\n    int num_greetings = request->num_greetings();\n\n    for (int i = 0; i < num_greetings; i++) {\n      auto msg_offset = mb_.CreateString(\"Many hellos, \" + name);\n      auto hello_offset = CreateHelloReply(mb_, msg_offset);\n      mb_.Finish(hello_offset);\n      writer->Write(mb_.ReleaseMessage<HelloReply>());\n    }\n\n    return grpc::Status::OK;\n  }\n\n  flatbuffers::grpc::MessageBuilder mb_;\n};\n\nvoid RunServer() {\n  std::string server_address(\"0.0.0.0:50051\");\n  GreeterServiceImpl service;\n\n  grpc::ServerBuilder builder;\n  builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());\n  builder.RegisterService(&service);\n  std::unique_ptr<grpc::Server> server(builder.BuildAndStart());\n  std::cerr << \"Server listening on \" << server_address << std::endl;\n\n  server->Wait();\n}\n\nint main(int argc, const char* argv[]) {\n  RunServer();\n  return 0;\n}\n"
  },
  {
    "path": "grpc/src/compiler/BUILD.bazel",
    "content": "load(\"@rules_cc//cc:defs.bzl\", \"cc_library\")\n\npackage(\n    default_visibility = [\"//visibility:public\"],\n)\n\nfilegroup(\n    name = \"distribution\",\n    srcs = [\n        \"BUILD.bazel\",\n    ] + glob([\n        \"*.cc\",\n        \"*.h\",\n    ]),\n)\n\nfilegroup(\n    name = \"common_headers\",\n    srcs = [\n        \"schema_interface.h\",\n    ],\n)\n\ncc_library(\n    name = \"cpp_generator\",\n    srcs = [\n        \"cpp_generator.cc\",\n    ],\n    hdrs = [\n        \"cpp_generator.h\",\n        \":common_headers\",\n    ],\n    include_prefix = \"src/compiler\",\n    strip_include_prefix = \"/grpc/src/compiler\",\n    deps = [\n        \"//:flatbuffers\",\n    ],\n)\n\ncc_library(\n    name = \"go_generator\",\n    srcs = [\n        \"go_generator.cc\",\n    ],\n    hdrs = [\n        \"go_generator.h\",\n        \":common_headers\",\n    ],\n    include_prefix = \"src/compiler\",\n    strip_include_prefix = \"/grpc/src/compiler\",\n    deps = [\n        \"//:flatbuffers\",\n    ],\n)\n\ncc_library(\n    name = \"java_generator\",\n    srcs = [\n        \"java_generator.cc\",\n    ],\n    hdrs = [\n        \"java_generator.h\",\n        \":common_headers\",\n    ],\n    include_prefix = \"src/compiler\",\n    strip_include_prefix = \"/grpc/src/compiler\",\n    deps = [\n        \"//:flatbuffers\",\n    ],\n)\n\ncc_library(\n    name = \"python_generator\",\n    hdrs = [\n        \"python_generator.h\",\n    ],\n    include_prefix = \"src/compiler\",\n    strip_include_prefix = \"/grpc/src/compiler\",\n    deps = [\n        \":python_generator_private\",\n    ],\n)\n\ncc_library(\n    name = \"python_generator_private\",\n    srcs = [\n        \"python_generator.cc\",\n    ],\n    hdrs = [\n        \"python_generator.h\",\n        \":common_headers\",\n    ],\n    include_prefix = \"src/compiler\",\n    strip_include_prefix = \"/grpc/src/compiler\",\n    visibility = [\"//visibility:private\"],\n    deps = [\n        \"//:flatbuffers\",\n        \"//include/codegen:namer\",\n        \"//include/codegen:python\",\n    ],\n)\n\ncc_library(\n    name = \"swift_generator\",\n    srcs = [\n        \"swift_generator.cc\",\n    ],\n    hdrs = [\n        \"swift_generator.h\",\n        \":common_headers\",\n    ],\n    include_prefix = \"src/compiler\",\n    strip_include_prefix = \"/grpc/src/compiler\",\n    deps = [\n        \"//:flatbuffers\",\n    ],\n)\n\ncc_library(\n    name = \"ts_generator\",\n    srcs = [\n        \"ts_generator.cc\",\n    ],\n    hdrs = [\n        \"ts_generator.h\",\n        \":common_headers\",\n    ],\n    include_prefix = \"src/compiler\",\n    strip_include_prefix = \"/grpc/src/compiler\",\n    deps = [\n        \"//:flatbuffers\",\n    ],\n)\n"
  },
  {
    "path": "grpc/src/compiler/cpp_generator.cc",
    "content": "#include \"src/compiler/cpp_generator.h\"\n\n#include <map>\n#include <sstream>\n\n#include \"flatbuffers/util.h\"\n\nnamespace grpc_cpp_generator {\nnamespace {\n\ntemplate <class T>\nstatic grpc::string as_string(T x) {\n  std::ostringstream out;\n  out << x;\n  return out.str();\n}\n\nstatic inline bool ClientOnlyStreaming(const grpc_generator::Method* method) {\n  return method->ClientStreaming() && !method->ServerStreaming();\n}\n\nstatic inline bool ServerOnlyStreaming(const grpc_generator::Method* method) {\n  return !method->ClientStreaming() && method->ServerStreaming();\n}\n\nstatic grpc::string FilenameIdentifier(const grpc::string& filename) {\n  grpc::string result;\n  for (unsigned i = 0; i < filename.size(); i++) {\n    char c = filename[i];\n    if (isalnum(c)) {\n      result.push_back(c);\n    } else {\n      static char hex[] = \"0123456789abcdef\";\n      result.push_back('_');\n      result.push_back(hex[(c >> 4) & 0xf]);\n      result.push_back(hex[c & 0xf]);\n    }\n  }\n  return result;\n}\n\ntemplate <class T, size_t N>\nstatic T* array_end(T (&array)[N]) {\n  return array + N;\n}\n\nstatic void PrintIncludes(grpc_generator::Printer* printer,\n                          const std::vector<grpc::string>& headers,\n                          const Parameters& params) {\n  std::map<grpc::string, grpc::string> vars;\n\n  vars[\"l\"] = params.use_system_headers ? '<' : '\"';\n  vars[\"r\"] = params.use_system_headers ? '>' : '\"';\n\n  auto& s = params.grpc_search_path;\n  if (!s.empty()) {\n    vars[\"l\"] += s;\n    if (s[s.size() - 1] != '/') {\n      vars[\"l\"] += '/';\n    }\n  }\n\n  for (auto i = headers.begin(); i != headers.end(); i++) {\n    vars[\"h\"] = *i;\n    printer->Print(vars, \"#include $l$$h$$r$\\n\");\n  }\n  if (params.generate_callback_api) {\n    // Callback API headers (guarded later by feature macro in emitted code).\n    static const char* cb_headers[] = {\n        \"grpcpp/impl/codegen/callback_common.h\",\n        \"grpcpp/impl/codegen/server_callback_handlers.h\",\n        \"grpcpp/support/client_callback.h\"};\n    for (auto& h : cb_headers) {\n      vars[\"h\"] = h;\n      printer->Print(vars, \"#include $l$$h$$r$\\n\");\n    }\n  }\n}\n\n}  // namespace\n\ngrpc::string GetHeaderPrologue(grpc_generator::File* file,\n                               const Parameters& params) {\n  grpc::string output;\n  {\n    // Scope the output stream so it closes and finalizes output to the string.\n    auto printer = file->CreatePrinter(&output);\n    std::map<grpc::string, grpc::string> vars;\n\n    vars[\"filename\"] = file->filename();\n    vars[\"filename_identifier\"] = FilenameIdentifier(file->filename());\n    vars[\"filename_base\"] = file->filename_without_ext();\n    vars[\"message_header_ext\"] = params.message_header_extension;\n\n    printer->Print(vars, \"// Generated by the gRPC C++ plugin.\\n\");\n    printer->Print(vars,\n                   \"// If you make any local change, they will be lost.\\n\");\n    printer->Print(vars, \"// source: $filename$\\n\");\n    grpc::string leading_comments = file->GetLeadingComments(\"//\");\n    if (!leading_comments.empty()) {\n      printer->Print(vars, \"// Original file comments:\\n\");\n      printer->Print(leading_comments.c_str());\n    }\n    printer->Print(vars, \"#ifndef GRPC_$filename_identifier$__INCLUDED\\n\");\n    printer->Print(vars, \"#define GRPC_$filename_identifier$__INCLUDED\\n\");\n    printer->Print(vars, \"\\n\");\n    printer->Print(vars, \"#include \\\"$filename_base$$message_header_ext$\\\"\\n\");\n    printer->Print(vars, file->additional_headers().c_str());\n    printer->Print(vars, \"\\n\");\n  }\n  return output;\n}\n\ngrpc::string GetHeaderIncludes(grpc_generator::File* file,\n                               const Parameters& params) {\n  grpc::string output;\n  {\n    // Scope the output stream so it closes and finalizes output to the string.\n    auto printer = file->CreatePrinter(&output);\n    std::map<grpc::string, grpc::string> vars;\n\n    static const char* headers_strs[] = {\n        \"grpcpp/impl/codegen/async_stream.h\",\n        \"grpcpp/impl/codegen/async_unary_call.h\",\n        \"grpcpp/impl/codegen/method_handler.h\",\n        \"grpcpp/impl/codegen/proto_utils.h\",\n        \"grpcpp/impl/codegen/rpc_method.h\",\n        \"grpcpp/impl/codegen/service_type.h\",\n        \"grpcpp/impl/codegen/status.h\",\n        \"grpcpp/impl/codegen/stub_options.h\",\n        \"grpcpp/impl/codegen/sync_stream.h\"};\n    std::vector<grpc::string> headers(headers_strs, array_end(headers_strs));\n    PrintIncludes(printer.get(), headers, params);\n    printer->Print(vars, \"\\n\");\n    printer->Print(vars, \"namespace grpc {\\n\");\n    printer->Print(vars, \"class CompletionQueue;\\n\");\n    printer->Print(vars, \"class Channel;\\n\");\n    printer->Print(vars, \"class ServerCompletionQueue;\\n\");\n    printer->Print(vars, \"class ServerContext;\\n\");\n    printer->Print(vars, \"}  // namespace grpc\\n\\n\");\n\n    if (!file->package().empty()) {\n      std::vector<grpc::string> parts = file->package_parts();\n\n      for (auto part = parts.begin(); part != parts.end(); part++) {\n        vars[\"part\"] = *part;\n        printer->Print(vars, \"namespace $part$ {\\n\");\n      }\n      printer->Print(vars, \"\\n\");\n    }\n  }\n  return output;\n}\n\nnamespace {\n\nstatic void PrintHeaderClientMethodInterfaces(\n    grpc_generator::Printer* printer, const grpc_generator::Method* method,\n    std::map<grpc::string, grpc::string>* vars, bool is_public) {\n  (*vars)[\"Method\"] = method->name();\n  (*vars)[\"Request\"] = method->input_type_name();\n  (*vars)[\"Response\"] = method->output_type_name();\n\n  struct {\n    grpc::string prefix;\n    grpc::string method_params;  // extra arguments to method\n    grpc::string raw_args;       // extra arguments to raw version of method\n  } async_prefixes[] = {{\"Async\", \", void* tag\", \", tag\"},\n                        {\"PrepareAsync\", \"\", \"\"}};\n\n  if (is_public) {\n    if (method->NoStreaming()) {\n      printer->Print(\n          *vars,\n          \"virtual ::grpc::Status $Method$(::grpc::ClientContext* context, \"\n          \"const $Request$& request, $Response$* response) = 0;\\n\");\n      for (size_t i = 0; i < sizeof(async_prefixes) / sizeof(async_prefixes[0]);\n           i++) {\n        auto& async_prefix = async_prefixes[i];\n        (*vars)[\"AsyncPrefix\"] = async_prefix.prefix;\n        printer->Print(\n            *vars,\n            \"std::unique_ptr< \"\n            \"::grpc::ClientAsyncResponseReaderInterface< $Response$>> \"\n            \"$AsyncPrefix$$Method$(::grpc::ClientContext* context, \"\n            \"const $Request$& request, \"\n            \"::grpc::CompletionQueue* cq) {\\n\");\n        printer->Indent();\n        printer->Print(\n            *vars,\n            \"return std::unique_ptr< \"\n            \"::grpc::ClientAsyncResponseReaderInterface< $Response$>>(\"\n            \"$AsyncPrefix$$Method$Raw(context, request, cq));\\n\");\n        printer->Outdent();\n        printer->Print(\"}\\n\");\n      }\n    } else if (ClientOnlyStreaming(method)) {\n      printer->Print(\n          *vars,\n          \"std::unique_ptr< ::grpc::ClientWriterInterface< $Request$>>\"\n          \" $Method$(\"\n          \"::grpc::ClientContext* context, $Response$* response) {\\n\");\n      printer->Indent();\n      printer->Print(\n          *vars,\n          \"return std::unique_ptr< ::grpc::ClientWriterInterface< $Request$>>\"\n          \"($Method$Raw(context, response));\\n\");\n      printer->Outdent();\n      printer->Print(\"}\\n\");\n      for (size_t i = 0; i < sizeof(async_prefixes) / sizeof(async_prefixes[0]);\n           i++) {\n        auto& async_prefix = async_prefixes[i];\n        (*vars)[\"AsyncPrefix\"] = async_prefix.prefix;\n        (*vars)[\"AsyncMethodParams\"] = async_prefix.method_params;\n        (*vars)[\"AsyncRawArgs\"] = async_prefix.raw_args;\n        printer->Print(\n            *vars,\n            \"std::unique_ptr< ::grpc::ClientAsyncWriterInterface< $Request$>>\"\n            \" $AsyncPrefix$$Method$(::grpc::ClientContext* context, \"\n            \"$Response$* \"\n            \"response, \"\n            \"::grpc::CompletionQueue* cq$AsyncMethodParams$) {\\n\");\n        printer->Indent();\n        printer->Print(*vars,\n                       \"return std::unique_ptr< \"\n                       \"::grpc::ClientAsyncWriterInterface< $Request$>>(\"\n                       \"$AsyncPrefix$$Method$Raw(context, response, \"\n                       \"cq$AsyncRawArgs$));\\n\");\n        printer->Outdent();\n        printer->Print(\"}\\n\");\n      }\n    } else if (ServerOnlyStreaming(method)) {\n      printer->Print(\n          *vars,\n          \"std::unique_ptr< ::grpc::ClientReaderInterface< $Response$>>\"\n          \" $Method$(::grpc::ClientContext* context, const $Request$& request)\"\n          \" {\\n\");\n      printer->Indent();\n      printer->Print(\n          *vars,\n          \"return std::unique_ptr< ::grpc::ClientReaderInterface< $Response$>>\"\n          \"($Method$Raw(context, request));\\n\");\n      printer->Outdent();\n      printer->Print(\"}\\n\");\n      for (size_t i = 0; i < sizeof(async_prefixes) / sizeof(async_prefixes[0]);\n           i++) {\n        auto& async_prefix = async_prefixes[i];\n        (*vars)[\"AsyncPrefix\"] = async_prefix.prefix;\n        (*vars)[\"AsyncMethodParams\"] = async_prefix.method_params;\n        (*vars)[\"AsyncRawArgs\"] = async_prefix.raw_args;\n        printer->Print(\n            *vars,\n            \"std::unique_ptr< ::grpc::ClientAsyncReaderInterface< $Response$>> \"\n            \"$AsyncPrefix$$Method$(\"\n            \"::grpc::ClientContext* context, const $Request$& request, \"\n            \"::grpc::CompletionQueue* cq$AsyncMethodParams$) {\\n\");\n        printer->Indent();\n        printer->Print(\n            *vars,\n            \"return std::unique_ptr< \"\n            \"::grpc::ClientAsyncReaderInterface< $Response$>>(\"\n            \"$AsyncPrefix$$Method$Raw(context, request, cq$AsyncRawArgs$));\\n\");\n        printer->Outdent();\n        printer->Print(\"}\\n\");\n      }\n    } else if (method->BidiStreaming()) {\n      printer->Print(*vars,\n                     \"std::unique_ptr< ::grpc::ClientReaderWriterInterface< \"\n                     \"$Request$, $Response$>> \"\n                     \"$Method$(::grpc::ClientContext* context) {\\n\");\n      printer->Indent();\n      printer->Print(\n          *vars,\n          \"return std::unique_ptr< \"\n          \"::grpc::ClientReaderWriterInterface< $Request$, $Response$>>(\"\n          \"$Method$Raw(context));\\n\");\n      printer->Outdent();\n      printer->Print(\"}\\n\");\n      for (size_t i = 0; i < sizeof(async_prefixes) / sizeof(async_prefixes[0]);\n           i++) {\n        auto& async_prefix = async_prefixes[i];\n        (*vars)[\"AsyncPrefix\"] = async_prefix.prefix;\n        (*vars)[\"AsyncMethodParams\"] = async_prefix.method_params;\n        (*vars)[\"AsyncRawArgs\"] = async_prefix.raw_args;\n        printer->Print(\n            *vars,\n            \"std::unique_ptr< \"\n            \"::grpc::ClientAsyncReaderWriterInterface< $Request$, $Response$>> \"\n            \"$AsyncPrefix$$Method$(::grpc::ClientContext* context, \"\n            \"::grpc::CompletionQueue* cq$AsyncMethodParams$) {\\n\");\n        printer->Indent();\n        printer->Print(\n            *vars,\n            \"return std::unique_ptr< \"\n            \"::grpc::ClientAsyncReaderWriterInterface< $Request$, $Response$>>(\"\n            \"$AsyncPrefix$$Method$Raw(context, cq$AsyncRawArgs$));\\n\");\n        printer->Outdent();\n        printer->Print(\"}\\n\");\n      }\n    }\n  } else {\n    if (method->NoStreaming()) {\n      for (size_t i = 0; i < sizeof(async_prefixes) / sizeof(async_prefixes[0]);\n           i++) {\n        auto& async_prefix = async_prefixes[i];\n        (*vars)[\"AsyncPrefix\"] = async_prefix.prefix;\n        printer->Print(\n            *vars,\n            \"virtual ::grpc::ClientAsyncResponseReaderInterface< $Response$>* \"\n            \"$AsyncPrefix$$Method$Raw(::grpc::ClientContext* context, \"\n            \"const $Request$& request, \"\n            \"::grpc::CompletionQueue* cq) = 0;\\n\");\n      }\n    } else if (ClientOnlyStreaming(method)) {\n      printer->Print(\n          *vars,\n          \"virtual ::grpc::ClientWriterInterface< $Request$>*\"\n          \" $Method$Raw(\"\n          \"::grpc::ClientContext* context, $Response$* response) = 0;\\n\");\n      for (size_t i = 0; i < sizeof(async_prefixes) / sizeof(async_prefixes[0]);\n           i++) {\n        auto& async_prefix = async_prefixes[i];\n        (*vars)[\"AsyncPrefix\"] = async_prefix.prefix;\n        (*vars)[\"AsyncMethodParams\"] = async_prefix.method_params;\n        printer->Print(\n            *vars,\n            \"virtual ::grpc::ClientAsyncWriterInterface< $Request$>*\"\n            \" $AsyncPrefix$$Method$Raw(::grpc::ClientContext* context, \"\n            \"$Response$* response, \"\n            \"::grpc::CompletionQueue* cq$AsyncMethodParams$) = 0;\\n\");\n      }\n    } else if (ServerOnlyStreaming(method)) {\n      printer->Print(\n          *vars,\n          \"virtual ::grpc::ClientReaderInterface< $Response$>* \"\n          \"$Method$Raw(\"\n          \"::grpc::ClientContext* context, const $Request$& request) = 0;\\n\");\n      for (size_t i = 0; i < sizeof(async_prefixes) / sizeof(async_prefixes[0]);\n           i++) {\n        auto& async_prefix = async_prefixes[i];\n        (*vars)[\"AsyncPrefix\"] = async_prefix.prefix;\n        (*vars)[\"AsyncMethodParams\"] = async_prefix.method_params;\n        printer->Print(\n            *vars,\n            \"virtual ::grpc::ClientAsyncReaderInterface< $Response$>* \"\n            \"$AsyncPrefix$$Method$Raw(\"\n            \"::grpc::ClientContext* context, const $Request$& request, \"\n            \"::grpc::CompletionQueue* cq$AsyncMethodParams$) = 0;\\n\");\n      }\n    } else if (method->BidiStreaming()) {\n      printer->Print(*vars,\n                     \"virtual ::grpc::ClientReaderWriterInterface< $Request$, \"\n                     \"$Response$>* \"\n                     \"$Method$Raw(::grpc::ClientContext* context) = 0;\\n\");\n      for (size_t i = 0; i < sizeof(async_prefixes) / sizeof(async_prefixes[0]);\n           i++) {\n        auto& async_prefix = async_prefixes[i];\n        (*vars)[\"AsyncPrefix\"] = async_prefix.prefix;\n        (*vars)[\"AsyncMethodParams\"] = async_prefix.method_params;\n        printer->Print(\n            *vars,\n            \"virtual ::grpc::ClientAsyncReaderWriterInterface< \"\n            \"$Request$, $Response$>* \"\n            \"$AsyncPrefix$$Method$Raw(::grpc::ClientContext* context, \"\n            \"::grpc::CompletionQueue* cq$AsyncMethodParams$) = 0;\\n\");\n      }\n    }\n  }\n}\n\nstatic void PrintHeaderClientMethod(grpc_generator::Printer* printer,\n                                    const grpc_generator::Method* method,\n                                    std::map<grpc::string, grpc::string>* vars,\n                                    bool is_public) {\n  (*vars)[\"Method\"] = method->name();\n  (*vars)[\"Request\"] = method->input_type_name();\n  (*vars)[\"Response\"] = method->output_type_name();\n  struct {\n    grpc::string prefix;\n    grpc::string method_params;  // extra arguments to method\n    grpc::string raw_args;       // extra arguments to raw version of method\n  } async_prefixes[] = {{\"Async\", \", void* tag\", \", tag\"},\n                        {\"PrepareAsync\", \"\", \"\"}};\n\n  if (is_public) {\n    if (method->NoStreaming()) {\n      printer->Print(\n          *vars,\n          \"::grpc::Status $Method$(::grpc::ClientContext* context, \"\n          \"const $Request$& request, $Response$* response) override;\\n\");\n      if ((*vars)[\"generate_callback_api\"] == \"1\") {\n        // Native gRPC callback unary wrappers (function callback & reactor\n        // variants).\n        printer->Print(*vars,\n                       \"// Callback unary (function form). Request/response \"\n                       \"must outlive callback.\\n\");\n        printer->Print(*vars,\n                       \"void async_$Method$(::grpc::ClientContext* context, \"\n                       \"const $Request$& request, $Response$* response, \"\n                       \"std::function<void(::grpc::Status)> on_done);\\n\");\n        printer->Print(*vars, \"// Callback unary (reactor form).\\n\");\n        printer->Print(*vars,\n                       \"void async_$Method$(::grpc::ClientContext* context, \"\n                       \"const $Request$& request, $Response$* response, \"\n                       \"::grpc::ClientUnaryReactor* reactor);\\n\");\n      }\n      for (size_t i = 0; i < sizeof(async_prefixes) / sizeof(async_prefixes[0]);\n           i++) {\n        auto& async_prefix = async_prefixes[i];\n        (*vars)[\"AsyncPrefix\"] = async_prefix.prefix;\n        printer->Print(\n            *vars,\n            \"std::unique_ptr< ::grpc::ClientAsyncResponseReader< $Response$>> \"\n            \"$AsyncPrefix$$Method$(::grpc::ClientContext* context, \"\n            \"const $Request$& request, \"\n            \"::grpc::CompletionQueue* cq) {\\n\");\n        printer->Indent();\n        printer->Print(*vars,\n                       \"return std::unique_ptr< \"\n                       \"::grpc::ClientAsyncResponseReader< $Response$>>(\"\n                       \"$AsyncPrefix$$Method$Raw(context, request, cq));\\n\");\n        printer->Outdent();\n        printer->Print(\"}\\n\");\n      }\n    } else if (ClientOnlyStreaming(method)) {\n      printer->Print(\n          *vars,\n          \"std::unique_ptr< ::grpc::ClientWriter< $Request$>>\"\n          \" $Method$(\"\n          \"::grpc::ClientContext* context, $Response$* response) {\\n\");\n      printer->Indent();\n      printer->Print(*vars,\n                     \"return std::unique_ptr< ::grpc::ClientWriter< $Request$>>\"\n                     \"($Method$Raw(context, response));\\n\");\n      printer->Outdent();\n      printer->Print(\"}\\n\");\n      if ((*vars)[\"generate_callback_api\"] == \"1\") {\n        printer->Print(*vars, \"// Client streaming callback reactor entry.\\n\");\n        printer->Print(\n            *vars,\n            \"void async_$Method$(::grpc::ClientContext* context, $Response$* \"\n            \"response, ::grpc::ClientWriteReactor< $Request$ >* reactor);\\n\");\n      }\n      for (size_t i = 0; i < sizeof(async_prefixes) / sizeof(async_prefixes[0]);\n           i++) {\n        auto& async_prefix = async_prefixes[i];\n        (*vars)[\"AsyncPrefix\"] = async_prefix.prefix;\n        (*vars)[\"AsyncMethodParams\"] = async_prefix.method_params;\n        (*vars)[\"AsyncRawArgs\"] = async_prefix.raw_args;\n        printer->Print(*vars,\n                       \"std::unique_ptr< ::grpc::ClientAsyncWriter< $Request$>>\"\n                       \" $AsyncPrefix$$Method$(::grpc::ClientContext* context, \"\n                       \"$Response$* response, \"\n                       \"::grpc::CompletionQueue* cq$AsyncMethodParams$) {\\n\");\n        printer->Indent();\n        printer->Print(\n            *vars,\n            \"return std::unique_ptr< ::grpc::ClientAsyncWriter< $Request$>>(\"\n            \"$AsyncPrefix$$Method$Raw(context, response, \"\n            \"cq$AsyncRawArgs$));\\n\");\n        printer->Outdent();\n        printer->Print(\"}\\n\");\n      }\n    } else if (ServerOnlyStreaming(method)) {\n      printer->Print(\n          *vars,\n          \"std::unique_ptr< ::grpc::ClientReader< $Response$>>\"\n          \" $Method$(::grpc::ClientContext* context, const $Request$& request)\"\n          \" {\\n\");\n      printer->Indent();\n      printer->Print(\n          *vars,\n          \"return std::unique_ptr< ::grpc::ClientReader< $Response$>>\"\n          \"($Method$Raw(context, request));\\n\");\n      printer->Outdent();\n      printer->Print(\"}\\n\");\n      if ((*vars)[\"generate_callback_api\"] == \"1\") {\n        printer->Print(*vars, \"// Server streaming callback reactor entry.\\n\");\n        printer->Print(*vars,\n                       \"void async_$Method$(::grpc::ClientContext* context, \"\n                       \"const $Request$& request, ::grpc::ClientReadReactor< \"\n                       \"$Response$ >* reactor);\\n\");\n      }\n      for (size_t i = 0; i < sizeof(async_prefixes) / sizeof(async_prefixes[0]);\n           i++) {\n        auto& async_prefix = async_prefixes[i];\n        (*vars)[\"AsyncPrefix\"] = async_prefix.prefix;\n        (*vars)[\"AsyncMethodParams\"] = async_prefix.method_params;\n        (*vars)[\"AsyncRawArgs\"] = async_prefix.raw_args;\n        printer->Print(\n            *vars,\n            \"std::unique_ptr< ::grpc::ClientAsyncReader< $Response$>> \"\n            \"$AsyncPrefix$$Method$(\"\n            \"::grpc::ClientContext* context, const $Request$& request, \"\n            \"::grpc::CompletionQueue* cq$AsyncMethodParams$) {\\n\");\n        printer->Indent();\n        printer->Print(\n            *vars,\n            \"return std::unique_ptr< ::grpc::ClientAsyncReader< $Response$>>(\"\n            \"$AsyncPrefix$$Method$Raw(context, request, cq$AsyncRawArgs$));\\n\");\n        printer->Outdent();\n        printer->Print(\"}\\n\");\n      }\n    } else if (method->BidiStreaming()) {\n      printer->Print(\n          *vars,\n          \"std::unique_ptr< ::grpc::ClientReaderWriter< $Request$, $Response$>>\"\n          \" $Method$(::grpc::ClientContext* context) {\\n\");\n      printer->Indent();\n      printer->Print(*vars,\n                     \"return std::unique_ptr< \"\n                     \"::grpc::ClientReaderWriter< $Request$, $Response$>>(\"\n                     \"$Method$Raw(context));\\n\");\n      printer->Outdent();\n      printer->Print(\"}\\n\");\n      if ((*vars)[\"generate_callback_api\"] == \"1\") {\n        printer->Print(*vars,\n                       \"// Bidirectional streaming callback reactor entry.\\n\");\n        printer->Print(\n            *vars,\n            \"void async_$Method$(::grpc::ClientContext* context, \"\n            \"::grpc::ClientBidiReactor< $Request$, $Response$ >* reactor);\\n\");\n      }\n      for (size_t i = 0; i < sizeof(async_prefixes) / sizeof(async_prefixes[0]);\n           i++) {\n        auto& async_prefix = async_prefixes[i];\n        (*vars)[\"AsyncPrefix\"] = async_prefix.prefix;\n        (*vars)[\"AsyncMethodParams\"] = async_prefix.method_params;\n        (*vars)[\"AsyncRawArgs\"] = async_prefix.raw_args;\n        printer->Print(*vars,\n                       \"std::unique_ptr<  ::grpc::ClientAsyncReaderWriter< \"\n                       \"$Request$, $Response$>> \"\n                       \"$AsyncPrefix$$Method$(::grpc::ClientContext* context, \"\n                       \"::grpc::CompletionQueue* cq$AsyncMethodParams$) {\\n\");\n        printer->Indent();\n        printer->Print(\n            *vars,\n            \"return std::unique_ptr< \"\n            \"::grpc::ClientAsyncReaderWriter< $Request$, $Response$>>(\"\n            \"$AsyncPrefix$$Method$Raw(context, cq$AsyncRawArgs$));\\n\");\n        printer->Outdent();\n        printer->Print(\"}\\n\");\n      }\n    }\n  } else {\n    if (method->NoStreaming()) {\n      for (size_t i = 0; i < sizeof(async_prefixes) / sizeof(async_prefixes[0]);\n           i++) {\n        auto& async_prefix = async_prefixes[i];\n        (*vars)[\"AsyncPrefix\"] = async_prefix.prefix;\n        printer->Print(\n            *vars,\n            \"::grpc::ClientAsyncResponseReader< $Response$>* \"\n            \"$AsyncPrefix$$Method$Raw(::grpc::ClientContext* context, \"\n            \"const $Request$& request, \"\n            \"::grpc::CompletionQueue* cq) override;\\n\");\n      }\n      if ((*vars)[\"generate_callback_api\"] == \"1\") {\n        // Native callback unary forms declared earlier (no private sync helper\n        // needed).\n      }\n    } else if (ClientOnlyStreaming(method)) {\n      printer->Print(*vars,\n                     \"::grpc::ClientWriter< $Request$>* $Method$Raw(\"\n                     \"::grpc::ClientContext* context, $Response$* response) \"\n                     \"override;\\n\");\n      for (size_t i = 0; i < sizeof(async_prefixes) / sizeof(async_prefixes[0]);\n           i++) {\n        auto& async_prefix = async_prefixes[i];\n        (*vars)[\"AsyncPrefix\"] = async_prefix.prefix;\n        (*vars)[\"AsyncMethodParams\"] = async_prefix.method_params;\n        (*vars)[\"AsyncRawArgs\"] = async_prefix.raw_args;\n        printer->Print(\n            *vars,\n            \"::grpc::ClientAsyncWriter< $Request$>* $AsyncPrefix$$Method$Raw(\"\n            \"::grpc::ClientContext* context, $Response$* response, \"\n            \"::grpc::CompletionQueue* cq$AsyncMethodParams$) override;\\n\");\n      }\n    } else if (ServerOnlyStreaming(method)) {\n      printer->Print(*vars,\n                     \"::grpc::ClientReader< $Response$>* $Method$Raw(\"\n                     \"::grpc::ClientContext* context, const $Request$& request)\"\n                     \" override;\\n\");\n      for (size_t i = 0; i < sizeof(async_prefixes) / sizeof(async_prefixes[0]);\n           i++) {\n        auto& async_prefix = async_prefixes[i];\n        (*vars)[\"AsyncPrefix\"] = async_prefix.prefix;\n        (*vars)[\"AsyncMethodParams\"] = async_prefix.method_params;\n        (*vars)[\"AsyncRawArgs\"] = async_prefix.raw_args;\n        printer->Print(\n            *vars,\n            \"::grpc::ClientAsyncReader< $Response$>* $AsyncPrefix$$Method$Raw(\"\n            \"::grpc::ClientContext* context, const $Request$& request, \"\n            \"::grpc::CompletionQueue* cq$AsyncMethodParams$) override;\\n\");\n      }\n    } else if (method->BidiStreaming()) {\n      printer->Print(*vars,\n                     \"::grpc::ClientReaderWriter< $Request$, $Response$>* \"\n                     \"$Method$Raw(::grpc::ClientContext* context) override;\\n\");\n      for (size_t i = 0; i < sizeof(async_prefixes) / sizeof(async_prefixes[0]);\n           i++) {\n        auto& async_prefix = async_prefixes[i];\n        (*vars)[\"AsyncPrefix\"] = async_prefix.prefix;\n        (*vars)[\"AsyncMethodParams\"] = async_prefix.method_params;\n        (*vars)[\"AsyncRawArgs\"] = async_prefix.raw_args;\n        printer->Print(\n            *vars,\n            \"::grpc::ClientAsyncReaderWriter< $Request$, $Response$>* \"\n            \"$AsyncPrefix$$Method$Raw(::grpc::ClientContext* context, \"\n            \"::grpc::CompletionQueue* cq$AsyncMethodParams$) override;\\n\");\n      }\n    }\n  }\n}\n\nstatic void PrintHeaderClientMethodData(\n    grpc_generator::Printer* printer, const grpc_generator::Method* method,\n    std::map<grpc::string, grpc::string>* vars) {\n  (*vars)[\"Method\"] = method->name();\n  printer->Print(*vars,\n                 \"const ::grpc::internal::RpcMethod rpcmethod_$Method$_;\\n\");\n}\n\nstatic void PrintHeaderServerMethodSync(\n    grpc_generator::Printer* printer, const grpc_generator::Method* method,\n    std::map<grpc::string, grpc::string>* vars) {\n  (*vars)[\"Method\"] = method->name();\n  (*vars)[\"Request\"] = method->input_type_name();\n  (*vars)[\"Response\"] = method->output_type_name();\n  printer->Print(method->GetLeadingComments(\"//\").c_str());\n  if (method->NoStreaming()) {\n    printer->Print(*vars,\n                   \"virtual ::grpc::Status $Method$(\"\n                   \"::grpc::ServerContext* context, const $Request$* request, \"\n                   \"$Response$* response);\\n\");\n  } else if (ClientOnlyStreaming(method)) {\n    printer->Print(*vars,\n                   \"virtual ::grpc::Status $Method$(\"\n                   \"::grpc::ServerContext* context, \"\n                   \"::grpc::ServerReader< $Request$>* reader, \"\n                   \"$Response$* response);\\n\");\n  } else if (ServerOnlyStreaming(method)) {\n    printer->Print(*vars,\n                   \"virtual ::grpc::Status $Method$(\"\n                   \"::grpc::ServerContext* context, const $Request$* request, \"\n                   \"::grpc::ServerWriter< $Response$>* writer);\\n\");\n  } else if (method->BidiStreaming()) {\n    printer->Print(\n        *vars,\n        \"virtual ::grpc::Status $Method$(\"\n        \"::grpc::ServerContext* context, \"\n        \"::grpc::ServerReaderWriter< $Response$, $Request$>* stream);\"\n        \"\\n\");\n  }\n  printer->Print(method->GetTrailingComments(\"//\").c_str());\n}\n\nstatic void PrintHeaderServerMethodAsync(\n    grpc_generator::Printer* printer, const grpc_generator::Method* method,\n    std::map<grpc::string, grpc::string>* vars) {\n  (*vars)[\"Method\"] = method->name();\n  (*vars)[\"Request\"] = method->input_type_name();\n  (*vars)[\"Response\"] = method->output_type_name();\n  printer->Print(*vars, \"template <class BaseClass>\\n\");\n  printer->Print(*vars,\n                 \"class WithAsyncMethod_$Method$ : public BaseClass {\\n\");\n  printer->Print(\n      \" private:\\n\"\n      \"  void BaseClassMustBeDerivedFromService(const Service */*service*/) \"\n      \"{}\\n\");\n  printer->Print(\" public:\\n\");\n  printer->Indent();\n  printer->Print(*vars,\n                 \"WithAsyncMethod_$Method$() {\\n\"\n                 \"  ::grpc::Service::MarkMethodAsync($Idx$);\\n\"\n                 \"}\\n\");\n  printer->Print(*vars,\n                 \"~WithAsyncMethod_$Method$() override {\\n\"\n                 \"  BaseClassMustBeDerivedFromService(this);\\n\"\n                 \"}\\n\");\n  if (method->NoStreaming()) {\n    printer->Print(\n        *vars,\n        \"// disable synchronous version of this method\\n\"\n        \"::grpc::Status $Method$(\"\n        \"::grpc::ServerContext* /*context*/, const $Request$* /*request*/, \"\n        \"$Response$* /*response*/) final override {\\n\"\n        \"  abort();\\n\"\n        \"  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \\\"\\\");\\n\"\n        \"}\\n\");\n    printer->Print(\n        *vars,\n        \"void Request$Method$(\"\n        \"::grpc::ServerContext* context, $Request$* request, \"\n        \"::grpc::ServerAsyncResponseWriter< $Response$>* response, \"\n        \"::grpc::CompletionQueue* new_call_cq, \"\n        \"::grpc::ServerCompletionQueue* notification_cq, void *tag) {\\n\");\n    printer->Print(*vars,\n                   \"  ::grpc::Service::RequestAsyncUnary($Idx$, context, \"\n                   \"request, response, new_call_cq, notification_cq, tag);\\n\");\n    printer->Print(\"}\\n\");\n  } else if (ClientOnlyStreaming(method)) {\n    printer->Print(\n        *vars,\n        \"// disable synchronous version of this method\\n\"\n        \"::grpc::Status $Method$(\"\n        \"::grpc::ServerContext* /*context*/, \"\n        \"::grpc::ServerReader< $Request$>* /*reader*/, \"\n        \"$Response$* /*response*/) final override {\\n\"\n        \"  abort();\\n\"\n        \"  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \\\"\\\");\\n\"\n        \"}\\n\");\n    printer->Print(\n        *vars,\n        \"void Request$Method$(\"\n        \"::grpc::ServerContext* context, \"\n        \"::grpc::ServerAsyncReader< $Response$, $Request$>* reader, \"\n        \"::grpc::CompletionQueue* new_call_cq, \"\n        \"::grpc::ServerCompletionQueue* notification_cq, void *tag) {\\n\");\n    printer->Print(*vars,\n                   \"  ::grpc::Service::RequestAsyncClientStreaming($Idx$, \"\n                   \"context, reader, new_call_cq, notification_cq, tag);\\n\");\n    printer->Print(\"}\\n\");\n  } else if (ServerOnlyStreaming(method)) {\n    printer->Print(\n        *vars,\n        \"// disable synchronous version of this method\\n\"\n        \"::grpc::Status $Method$(\"\n        \"::grpc::ServerContext* /*context*/, const $Request$* /*request*/, \"\n        \"::grpc::ServerWriter< $Response$>* /*writer*/) final override \"\n        \"{\\n\"\n        \"  abort();\\n\"\n        \"  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \\\"\\\");\\n\"\n        \"}\\n\");\n    printer->Print(\n        *vars,\n        \"void Request$Method$(\"\n        \"::grpc::ServerContext* context, $Request$* request, \"\n        \"::grpc::ServerAsyncWriter< $Response$>* writer, \"\n        \"::grpc::CompletionQueue* new_call_cq, \"\n        \"::grpc::ServerCompletionQueue* notification_cq, void *tag) {\\n\");\n    printer->Print(\n        *vars,\n        \"  ::grpc::Service::RequestAsyncServerStreaming($Idx$, \"\n        \"context, request, writer, new_call_cq, notification_cq, tag);\\n\");\n    printer->Print(\"}\\n\");\n  } else if (method->BidiStreaming()) {\n    printer->Print(\n        *vars,\n        \"// disable synchronous version of this method\\n\"\n        \"::grpc::Status $Method$(\"\n        \"::grpc::ServerContext* /*context*/, \"\n        \"::grpc::ServerReaderWriter< $Response$, $Request$>* /*stream*/) \"\n        \"final override {\\n\"\n        \"  abort();\\n\"\n        \"  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \\\"\\\");\\n\"\n        \"}\\n\");\n    printer->Print(\n        *vars,\n        \"void Request$Method$(\"\n        \"::grpc::ServerContext* context, \"\n        \"::grpc::ServerAsyncReaderWriter< $Response$, $Request$>* stream, \"\n        \"::grpc::CompletionQueue* new_call_cq, \"\n        \"::grpc::ServerCompletionQueue* notification_cq, void *tag) {\\n\");\n    printer->Print(*vars,\n                   \"  ::grpc::Service::RequestAsyncBidiStreaming($Idx$, \"\n                   \"context, stream, new_call_cq, notification_cq, tag);\\n\");\n    printer->Print(\"}\\n\");\n  }\n  printer->Outdent();\n  printer->Print(*vars, \"};\\n\");\n}\n\nstatic void PrintHeaderServerMethodStreamedUnary(\n    grpc_generator::Printer* printer, const grpc_generator::Method* method,\n    std::map<grpc::string, grpc::string>* vars) {\n  (*vars)[\"Method\"] = method->name();\n  (*vars)[\"Request\"] = method->input_type_name();\n  (*vars)[\"Response\"] = method->output_type_name();\n  if (method->NoStreaming()) {\n    printer->Print(*vars, \"template <class BaseClass>\\n\");\n    printer->Print(*vars,\n                   \"class WithStreamedUnaryMethod_$Method$ : \"\n                   \"public BaseClass {\\n\");\n    printer->Print(\n        \" private:\\n\"\n        \"  void BaseClassMustBeDerivedFromService(const Service */*service*/) \"\n        \"{}\\n\");\n    printer->Print(\" public:\\n\");\n    printer->Indent();\n    printer->Print(*vars,\n                   \"WithStreamedUnaryMethod_$Method$() {\\n\"\n                   \"  ::grpc::Service::MarkMethodStreamed($Idx$,\\n\"\n                   \"    new ::grpc::internal::StreamedUnaryHandler< $Request$, \"\n                   \"$Response$>(std::bind\"\n                   \"(&WithStreamedUnaryMethod_$Method$<BaseClass>::\"\n                   \"Streamed$Method$, this, std::placeholders::_1, \"\n                   \"std::placeholders::_2)));\\n\"\n                   \"}\\n\");\n    printer->Print(*vars,\n                   \"~WithStreamedUnaryMethod_$Method$() override {\\n\"\n                   \"  BaseClassMustBeDerivedFromService(this);\\n\"\n                   \"}\\n\");\n    printer->Print(\n        *vars,\n        \"// disable regular version of this method\\n\"\n        \"::grpc::Status $Method$(\"\n        \"::grpc::ServerContext* /*context*/, const $Request$* /*request*/, \"\n        \"$Response$* /*response*/) final override {\\n\"\n        \"  abort();\\n\"\n        \"  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \\\"\\\");\\n\"\n        \"}\\n\");\n    printer->Print(*vars,\n                   \"// replace default version of method with streamed unary\\n\"\n                   \"virtual ::grpc::Status Streamed$Method$(\"\n                   \"::grpc::ServerContext* context, \"\n                   \"::grpc::ServerUnaryStreamer< \"\n                   \"$Request$,$Response$>* server_unary_streamer)\"\n                   \" = 0;\\n\");\n    printer->Outdent();\n    printer->Print(*vars, \"};\\n\");\n  }\n}\n\nstatic void PrintHeaderServerMethodSplitStreaming(\n    grpc_generator::Printer* printer, const grpc_generator::Method* method,\n    std::map<grpc::string, grpc::string>* vars) {\n  (*vars)[\"Method\"] = method->name();\n  (*vars)[\"Request\"] = method->input_type_name();\n  (*vars)[\"Response\"] = method->output_type_name();\n  if (ServerOnlyStreaming(method)) {\n    printer->Print(*vars, \"template <class BaseClass>\\n\");\n    printer->Print(*vars,\n                   \"class WithSplitStreamingMethod_$Method$ : \"\n                   \"public BaseClass {\\n\");\n    printer->Print(\n        \" private:\\n\"\n        \"  void BaseClassMustBeDerivedFromService(const Service */*service*/) \"\n        \"{ }\\n\");\n    printer->Print(\" public:\\n\");\n    printer->Indent();\n    printer->Print(\n        *vars,\n        \"WithSplitStreamingMethod_$Method$() {\\n\"\n        \"  ::grpc::Service::MarkMethodStreamed($Idx$,\\n\"\n        \"    new ::grpc::internal::SplitServerStreamingHandler< $Request$, \"\n        \"$Response$>(std::bind\"\n        \"(&WithSplitStreamingMethod_$Method$<BaseClass>::\"\n        \"Streamed$Method$, this, std::placeholders::_1, \"\n        \"std::placeholders::_2)));\\n\"\n        \"}\\n\");\n    printer->Print(*vars,\n                   \"~WithSplitStreamingMethod_$Method$() override {\\n\"\n                   \"  BaseClassMustBeDerivedFromService(this);\\n\"\n                   \"}\\n\");\n    printer->Print(\n        *vars,\n        \"// disable regular version of this method\\n\"\n        \"::grpc::Status $Method$(\"\n        \"::grpc::ServerContext* /*context*/, const $Request$* /*request*/, \"\n        \"::grpc::ServerWriter< $Response$>* /*writer*/) final override \"\n        \"{\\n\"\n        \"  abort();\\n\"\n        \"  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \\\"\\\");\\n\"\n        \"}\\n\");\n    printer->Print(*vars,\n                   \"// replace default version of method with split streamed\\n\"\n                   \"virtual ::grpc::Status Streamed$Method$(\"\n                   \"::grpc::ServerContext* context, \"\n                   \"::grpc::ServerSplitStreamer< \"\n                   \"$Request$,$Response$>* server_split_streamer)\"\n                   \" = 0;\\n\");\n    printer->Outdent();\n    printer->Print(*vars, \"};\\n\");\n  }\n}\n\nstatic void PrintHeaderServerMethodGeneric(\n    grpc_generator::Printer* printer, const grpc_generator::Method* method,\n    std::map<grpc::string, grpc::string>* vars) {\n  (*vars)[\"Method\"] = method->name();\n  (*vars)[\"Request\"] = method->input_type_name();\n  (*vars)[\"Response\"] = method->output_type_name();\n  printer->Print(*vars, \"template <class BaseClass>\\n\");\n  printer->Print(*vars,\n                 \"class WithGenericMethod_$Method$ : public BaseClass {\\n\");\n  printer->Print(\n      \" private:\\n\"\n      \"  void BaseClassMustBeDerivedFromService(const Service */*service*/) \"\n      \"{}\\n\");\n  printer->Print(\" public:\\n\");\n  printer->Indent();\n  printer->Print(*vars,\n                 \"WithGenericMethod_$Method$() {\\n\"\n                 \"  ::grpc::Service::MarkMethodGeneric($Idx$);\\n\"\n                 \"}\\n\");\n  printer->Print(*vars,\n                 \"~WithGenericMethod_$Method$() override {\\n\"\n                 \"  BaseClassMustBeDerivedFromService(this);\\n\"\n                 \"}\\n\");\n  if (method->NoStreaming()) {\n    printer->Print(\n        *vars,\n        \"// disable synchronous version of this method\\n\"\n        \"::grpc::Status $Method$(\"\n        \"::grpc::ServerContext* /*context*/, const $Request$* /*request*/, \"\n        \"$Response$* /*response*/) final override {\\n\"\n        \"  abort();\\n\"\n        \"  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \\\"\\\");\\n\"\n        \"}\\n\");\n  } else if (ClientOnlyStreaming(method)) {\n    printer->Print(\n        *vars,\n        \"// disable synchronous version of this method\\n\"\n        \"::grpc::Status $Method$(\"\n        \"::grpc::ServerContext* /*context*/, \"\n        \"::grpc::ServerReader< $Request$>* /*reader*/, \"\n        \"$Response$* /*response*/) final override {\\n\"\n        \"  abort();\\n\"\n        \"  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \\\"\\\");\\n\"\n        \"}\\n\");\n  } else if (ServerOnlyStreaming(method)) {\n    printer->Print(\n        *vars,\n        \"// disable synchronous version of this method\\n\"\n        \"::grpc::Status $Method$(\"\n        \"::grpc::ServerContext* /*context*/, const $Request$* /*request*/, \"\n        \"::grpc::ServerWriter< $Response$>* /*writer*/) final override \"\n        \"{\\n\"\n        \"  abort();\\n\"\n        \"  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \\\"\\\");\\n\"\n        \"}\\n\");\n  } else if (method->BidiStreaming()) {\n    printer->Print(\n        *vars,\n        \"// disable synchronous version of this method\\n\"\n        \"::grpc::Status $Method$(\"\n        \"::grpc::ServerContext* /*context*/, \"\n        \"::grpc::ServerReaderWriter< $Response$, $Request$>* /*stream*/) \"\n        \"final override {\\n\"\n        \"  abort();\\n\"\n        \"  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \\\"\\\");\\n\"\n        \"}\\n\");\n  }\n  printer->Outdent();\n  printer->Print(*vars, \"};\\n\");\n}\n\nstatic void PrintHeaderService(grpc_generator::Printer* printer,\n                               const grpc_generator::Service* service,\n                               std::map<grpc::string, grpc::string>* vars) {\n  (*vars)[\"Service\"] = service->name();\n\n  printer->Print(service->GetLeadingComments(\"//\").c_str());\n  printer->Print(*vars,\n                 \"class $Service$ final {\\n\"\n                 \" public:\\n\");\n  printer->Indent();\n\n  // Service metadata\n  printer->Print(*vars,\n                 \"static constexpr char const* service_full_name() {\\n\"\n                 \"  return \\\"$Package$$Service$\\\";\\n\"\n                 \"}\\n\");\n\n  // Client side\n  printer->Print(\n      \"class StubInterface {\\n\"\n      \" public:\\n\");\n  printer->Indent();\n  printer->Print(\"virtual ~StubInterface() {}\\n\");\n  for (int i = 0; i < service->method_count(); ++i) {\n    printer->Print(service->method(i)->GetLeadingComments(\"//\").c_str());\n    PrintHeaderClientMethodInterfaces(printer, service->method(i).get(), vars,\n                                      true);\n    printer->Print(service->method(i)->GetTrailingComments(\"//\").c_str());\n  }\n  printer->Outdent();\n  printer->Print(\"private:\\n\");\n  printer->Indent();\n  for (int i = 0; i < service->method_count(); ++i) {\n    PrintHeaderClientMethodInterfaces(printer, service->method(i).get(), vars,\n                                      false);\n  }\n  printer->Outdent();\n  // Forward declaration of nested CallbackService if callback API enabled.\n  if ((*vars)[\"generate_callback_api\"] == \"1\") {\n    printer->Print(\"class CallbackService;\\n\");\n  }\n  printer->Print(\"};\\n\");\n  printer->Print(\n      \"class Stub final : public StubInterface\"\n      \" {\\n public:\\n\");\n  printer->Indent();\n  printer->Print(\n      \"Stub(const std::shared_ptr< ::grpc::ChannelInterface>& \"\n      \"channel);\\n\");\n  for (int i = 0; i < service->method_count(); ++i) {\n    PrintHeaderClientMethod(printer, service->method(i).get(), vars, true);\n  }\n  printer->Outdent();\n  printer->Print(\"\\n private:\\n\");\n  printer->Indent();\n  printer->Print(\"std::shared_ptr< ::grpc::ChannelInterface> channel_;\\n\");\n  for (int i = 0; i < service->method_count(); ++i) {\n    PrintHeaderClientMethod(printer, service->method(i).get(), vars, false);\n  }\n  for (int i = 0; i < service->method_count(); ++i) {\n    PrintHeaderClientMethodData(printer, service->method(i).get(), vars);\n  }\n  printer->Outdent();\n  printer->Print(\"};\\n\");\n  printer->Print(\n      \"static std::unique_ptr<Stub> NewStub(const std::shared_ptr< \"\n      \"::grpc::ChannelInterface>& channel, \"\n      \"const ::grpc::StubOptions& options = ::grpc::StubOptions());\\n\");\n\n  printer->Print(\"\\n\");\n\n  // Server side - base\n  printer->Print(\n      \"class Service : public ::grpc::Service {\\n\"\n      \" public:\\n\");\n  printer->Indent();\n  printer->Print(\"Service();\\n\");\n  printer->Print(\"virtual ~Service();\\n\");\n  for (int i = 0; i < service->method_count(); ++i) {\n    PrintHeaderServerMethodSync(printer, service->method(i).get(), vars);\n  }\n  printer->Outdent();\n  printer->Print(\"};\\n\");\n\n  // Server side - Asynchronous\n  for (int i = 0; i < service->method_count(); ++i) {\n    (*vars)[\"Idx\"] = as_string(i);\n    PrintHeaderServerMethodAsync(printer, service->method(i).get(), vars);\n  }\n\n  printer->Print(\"typedef \");\n\n  for (int i = 0; i < service->method_count(); ++i) {\n    (*vars)[\"method_name\"] = service->method(i).get()->name();\n    printer->Print(*vars, \"WithAsyncMethod_$method_name$<\");\n  }\n  printer->Print(\"Service\");\n  for (int i = 0; i < service->method_count(); ++i) {\n    printer->Print(\" >\");\n  }\n  printer->Print(\" AsyncService;\\n\");\n\n  // Server side - Generic\n  for (int i = 0; i < service->method_count(); ++i) {\n    (*vars)[\"Idx\"] = as_string(i);\n    PrintHeaderServerMethodGeneric(printer, service->method(i).get(), vars);\n  }\n\n  // Server side - Streamed Unary\n  for (int i = 0; i < service->method_count(); ++i) {\n    (*vars)[\"Idx\"] = as_string(i);\n    PrintHeaderServerMethodStreamedUnary(printer, service->method(i).get(),\n                                         vars);\n  }\n\n  printer->Print(\"typedef \");\n  for (int i = 0; i < service->method_count(); ++i) {\n    (*vars)[\"method_name\"] = service->method(i).get()->name();\n    if (service->method(i)->NoStreaming()) {\n      printer->Print(*vars, \"WithStreamedUnaryMethod_$method_name$<\");\n    }\n  }\n  printer->Print(\"Service\");\n  for (int i = 0; i < service->method_count(); ++i) {\n    if (service->method(i)->NoStreaming()) {\n      printer->Print(\" >\");\n    }\n  }\n  printer->Print(\" StreamedUnaryService;\\n\");\n\n  // Server side - controlled server-side streaming\n  for (int i = 0; i < service->method_count(); ++i) {\n    (*vars)[\"Idx\"] = as_string(i);\n    PrintHeaderServerMethodSplitStreaming(printer, service->method(i).get(),\n                                          vars);\n  }\n\n  printer->Print(\"typedef \");\n  for (int i = 0; i < service->method_count(); ++i) {\n    (*vars)[\"method_name\"] = service->method(i).get()->name();\n    auto method = service->method(i);\n    if (ServerOnlyStreaming(method.get())) {\n      printer->Print(*vars, \"WithSplitStreamingMethod_$method_name$<\");\n    }\n  }\n  printer->Print(\"Service\");\n  for (int i = 0; i < service->method_count(); ++i) {\n    auto method = service->method(i);\n    if (ServerOnlyStreaming(method.get())) {\n      printer->Print(\" >\");\n    }\n  }\n  printer->Print(\" SplitStreamedService;\\n\");\n\n  // Server side - typedef for controlled both unary and server-side streaming\n  printer->Print(\"typedef \");\n  for (int i = 0; i < service->method_count(); ++i) {\n    (*vars)[\"method_name\"] = service->method(i).get()->name();\n    auto method = service->method(i);\n    if (ServerOnlyStreaming(method.get())) {\n      printer->Print(*vars, \"WithSplitStreamingMethod_$method_name$<\");\n    }\n    if (service->method(i)->NoStreaming()) {\n      printer->Print(*vars, \"WithStreamedUnaryMethod_$method_name$<\");\n    }\n  }\n  printer->Print(\"Service\");\n  for (int i = 0; i < service->method_count(); ++i) {\n    auto method = service->method(i);\n    if (service->method(i)->NoStreaming() ||\n        ServerOnlyStreaming(method.get())) {\n      printer->Print(\" >\");\n    }\n  }\n  printer->Print(\" StreamedService;\\n\");\n\n  printer->Outdent();\n  printer->Print(\"};\\n\");\n  printer->Print(service->GetTrailingComments(\"//\").c_str());\n\n  // Optional CallbackService (modern async API)\n  if ((*vars)[\"generate_callback_api\"] == \"1\") {\n    (*vars)[\"Service\"] = service->name();\n    printer->Print(\"\\n#if defined(GRPC_CALLBACK_API_NONEXPERIMENTAL)\\n\");\n    printer->Print(*vars,\n                   \"class $Service$::CallbackService : public ::grpc::Service \"\n                   \"{\\n public:\\n  CallbackService();\\n  virtual \"\n                   \"~CallbackService();\\n\");\n    printer->Indent();\n    for (int i = 0; i < service->method_count(); ++i) {\n      auto m = service->method(i);\n      (*vars)[\"Method\"] = m->name();\n      (*vars)[\"Request\"] = m->input_type_name();\n      (*vars)[\"Response\"] = m->output_type_name();\n      if (m->NoStreaming()) {\n        printer->Print(*vars,\n                       \"virtual ::grpc::ServerUnaryReactor* \"\n                       \"$Method$(::grpc::CallbackServerContext* context, const \"\n                       \"$Request$* request, $Response$* response);\\n\");\n      } else if (ClientOnlyStreaming(m.get())) {\n        printer->Print(*vars,\n                       \"virtual ::grpc::ServerReadReactor<$Request$>* \"\n                       \"$Method$(::grpc::CallbackServerContext* context, \"\n                       \"$Response$* response);\\n\");\n      } else if (ServerOnlyStreaming(m.get())) {\n        printer->Print(*vars,\n                       \"virtual ::grpc::ServerWriteReactor<$Response$>* \"\n                       \"$Method$(::grpc::CallbackServerContext* context, const \"\n                       \"$Request$* request);\\n\");\n      } else if (m->BidiStreaming()) {\n        printer->Print(\n            *vars,\n            \"virtual ::grpc::ServerBidiReactor<$Request$, $Response$>* \"\n            \"$Method$(::grpc::CallbackServerContext* context);\\n\");\n      }\n    }\n    printer->Outdent();\n    printer->Print(\n        \"};\\n#else\\n// Callback API requested but not available in this gRPC \"\n        \"version.\\n#endif // GRPC_CALLBACK_API_NONEXPERIMENTAL\\n\");\n  }\n}\n\n}  // namespace\n\ngrpc::string GetHeaderServices(grpc_generator::File* file,\n                               const Parameters& params) {\n  grpc::string output;\n  {\n    // Scope the output stream so it closes and finalizes output to the string.\n    auto printer = file->CreatePrinter(&output);\n    std::map<grpc::string, grpc::string> vars;\n    // Package string is empty or ends with a dot. It is used to fully qualify\n    // method names.\n    vars[\"Package\"] = file->package();\n    if (!file->package().empty()) {\n      vars[\"Package\"].append(\".\");\n    }\n\n    if (!params.services_namespace.empty()) {\n      vars[\"services_namespace\"] = params.services_namespace;\n      printer->Print(vars, \"\\nnamespace $services_namespace$ {\\n\\n\");\n    }\n\n    for (int i = 0; i < file->service_count(); ++i) {\n      vars[\"generate_callback_api\"] = params.generate_callback_api ? \"1\" : \"0\";\n      PrintHeaderService(printer.get(), file->service(i).get(), &vars);\n      printer->Print(\"\\n\");\n    }\n    if (params.generate_callback_api) {\n      printer->Print(\"// FlatBuffers: Callback API code generated.\\n\");\n      printer->Print(\"#define FLATBUFFERS_GENERATED_GRPC_CALLBACK_API 1\\n\\n\");\n    }\n\n    if (!params.services_namespace.empty()) {\n      printer->Print(vars, \"}  // namespace $services_namespace$\\n\\n\");\n    }\n  }\n  return output;\n}\n\ngrpc::string GetHeaderEpilogue(grpc_generator::File* file,\n                               const Parameters& /*params*/) {\n  grpc::string output;\n  {\n    // Scope the output stream so it closes and finalizes output to the string.\n    auto printer = file->CreatePrinter(&output);\n    std::map<grpc::string, grpc::string> vars;\n\n    vars[\"filename\"] = file->filename();\n    vars[\"filename_identifier\"] = FilenameIdentifier(file->filename());\n\n    if (!file->package().empty()) {\n      std::vector<grpc::string> parts = file->package_parts();\n\n      for (auto part = parts.rbegin(); part != parts.rend(); part++) {\n        vars[\"part\"] = *part;\n        printer->Print(vars, \"}  // namespace $part$\\n\");\n      }\n      printer->Print(vars, \"\\n\");\n    }\n\n    printer->Print(vars, \"\\n\");\n    printer->Print(vars, \"#endif  // GRPC_$filename_identifier$__INCLUDED\\n\");\n\n    printer->Print(file->GetTrailingComments(\"//\").c_str());\n  }\n  return output;\n}\n\ngrpc::string GetSourcePrologue(grpc_generator::File* file,\n                               const Parameters& params) {\n  grpc::string output;\n  {\n    // Scope the output stream so it closes and finalizes output to the string.\n    auto printer = file->CreatePrinter(&output);\n    std::map<grpc::string, grpc::string> vars;\n\n    vars[\"filename\"] = file->filename();\n    vars[\"filename_base\"] = file->filename_without_ext();\n    vars[\"message_header_ext\"] = params.message_header_extension;\n    vars[\"service_header_ext\"] = params.service_header_extension;\n\n    printer->Print(vars, \"// Generated by the gRPC C++ plugin.\\n\");\n    printer->Print(vars,\n                   \"// FlatBuffers modified generator: native gRPC callback \"\n                   \"client API enabled when --grpc-callback-api.\\n\");\n    printer->Print(vars, \"// source: $filename$\\n\\n\");\n\n    printer->Print(vars, \"#include \\\"$filename_base$$message_header_ext$\\\"\\n\");\n    printer->Print(vars, \"#include \\\"$filename_base$$service_header_ext$\\\"\\n\");\n    printer->Print(vars, \"\\n\");\n  }\n  return output;\n}\n\ngrpc::string GetSourceIncludes(grpc_generator::File* file,\n                               const Parameters& params) {\n  grpc::string output;\n  {\n    // Scope the output stream so it closes and finalizes output to the string.\n    auto printer = file->CreatePrinter(&output);\n    std::map<grpc::string, grpc::string> vars;\n\n    static const char* headers_strs[] = {\n        \"grpcpp/impl/codegen/async_stream.h\",\n        \"grpcpp/impl/codegen/async_unary_call.h\",\n        \"grpcpp/impl/codegen/channel_interface.h\",\n        \"grpcpp/impl/codegen/client_unary_call.h\",\n        \"grpcpp/impl/codegen/method_handler.h\",\n        \"grpcpp/impl/codegen/rpc_service_method.h\",\n        \"grpcpp/impl/codegen/service_type.h\",\n        \"grpcpp/impl/codegen/sync_stream.h\"};\n    std::vector<grpc::string> headers(headers_strs, array_end(headers_strs));\n    PrintIncludes(printer.get(), headers, params);\n\n    if (!file->package().empty()) {\n      std::vector<grpc::string> parts = file->package_parts();\n\n      for (auto part = parts.begin(); part != parts.end(); part++) {\n        vars[\"part\"] = *part;\n        printer->Print(vars, \"namespace $part$ {\\n\");\n      }\n    }\n\n    printer->Print(vars, \"\\n\");\n  }\n  return output;\n}\n\nnamespace {\n\nstatic void PrintSourceClientMethod(\n    grpc_generator::Printer* printer, const grpc_generator::Method* method,\n    std::map<grpc::string, grpc::string>* vars) {\n  (*vars)[\"Method\"] = method->name();\n  (*vars)[\"Request\"] = method->input_type_name();\n  (*vars)[\"Response\"] = method->output_type_name();\n  struct {\n    grpc::string prefix;\n    grpc::string start;          // bool literal expressed as string\n    grpc::string method_params;  // extra arguments to method\n    grpc::string create_args;    // extra arguments to creator\n  } async_prefixes[] = {{\"Async\", \"true\", \", void* tag\", \", tag\"},\n                        {\"PrepareAsync\", \"false\", \"\", \", nullptr\"}};\n  if (method->NoStreaming()) {\n    printer->Print(*vars,\n                   \"::grpc::Status $ns$$Service$::Stub::$Method$(\"\n                   \"::grpc::ClientContext* context, \"\n                   \"const $Request$& request, $Response$* response) {\\n\");\n    printer->Print(*vars,\n                   \"  return ::grpc::internal::BlockingUnaryCall\"\n                   \"(channel_.get(), rpcmethod_$Method$_, \"\n                   \"context, request, response);\\n}\\n\\n\");\n    if ((*vars)[\"generate_callback_api\"] == \"1\") {\n      printer->Print(\n          *vars,\n          \"void $ns$$Service$::Stub::async_$Method$(::grpc::ClientContext* \"\n          \"context, const $Request$& request, $Response$* response, \"\n          \"std::function<void(::grpc::Status)> on_done) {\\n\");\n      printer->Print(*vars,\n                     \"  ::grpc::internal::CallbackUnaryCall(channel_.get(), \"\n                     \"rpcmethod_$Method$_, context, &request, response, \"\n                     \"std::move(on_done));\\n}\\n\\n\");\n      printer->Print(\n          *vars,\n          \"void $ns$$Service$::Stub::async_$Method$(::grpc::ClientContext* \"\n          \"context, const $Request$& request, $Response$* response, \"\n          \"::grpc::ClientUnaryReactor* reactor) {\\n\");\n      printer->Print(\n          *vars,\n          \"  \"\n          \"::grpc::internal::ClientCallbackUnaryFactory::Create(channel_.get(),\"\n          \" rpcmethod_$Method$_, context, &request, response, \"\n          \"reactor);\\n}\\n\\n\");\n    }\n    for (size_t i = 0; i < sizeof(async_prefixes) / sizeof(async_prefixes[0]);\n         i++) {\n      auto& async_prefix = async_prefixes[i];\n      (*vars)[\"AsyncPrefix\"] = async_prefix.prefix;\n      (*vars)[\"AsyncStart\"] = async_prefix.start;\n      printer->Print(*vars,\n                     \"::grpc::ClientAsyncResponseReader< $Response$>* \"\n                     \"$ns$$Service$::Stub::$AsyncPrefix$$Method$Raw(::grpc::\"\n                     \"ClientContext* context, \"\n                     \"const $Request$& request, \"\n                     \"::grpc::CompletionQueue* cq) {\\n\");\n      printer->Print(\n          *vars,\n          \"  return \"\n          \"::grpc::internal::ClientAsyncResponseReaderFactory< $Response$>\"\n          \"::Create(channel_.get(), cq, \"\n          \"rpcmethod_$Method$_, \"\n          \"context, request, $AsyncStart$);\\n\"\n          \"}\\n\\n\");\n    }\n  } else if (ClientOnlyStreaming(method)) {\n    printer->Print(*vars,\n                   \"::grpc::ClientWriter< $Request$>* \"\n                   \"$ns$$Service$::Stub::$Method$Raw(\"\n                   \"::grpc::ClientContext* context, $Response$* response) {\\n\");\n    printer->Print(\n        *vars,\n        \"  return ::grpc::internal::ClientWriterFactory< $Request$>::Create(\"\n        \"channel_.get(), \"\n        \"rpcmethod_$Method$_, \"\n        \"context, response);\\n\"\n        \"}\\n\\n\");\n    if ((*vars)[\"generate_callback_api\"] == \"1\") {\n      printer->Print(\n          *vars,\n          \"void $ns$$Service$::Stub::async_$Method$(::grpc::ClientContext* \"\n          \"context, $Response$* response, ::grpc::ClientWriteReactor< \"\n          \"$Request$ >* reactor) {\\n\");\n      printer->Print(*vars,\n                     \"  ::grpc::internal::ClientCallbackWriterFactory< \"\n                     \"$Request$ >::Create(channel_.get(), rpcmethod_$Method$_, \"\n                     \"context, response, reactor);\\n}\\n\\n\");\n    }\n    for (size_t i = 0; i < sizeof(async_prefixes) / sizeof(async_prefixes[0]);\n         i++) {\n      auto& async_prefix = async_prefixes[i];\n      (*vars)[\"AsyncPrefix\"] = async_prefix.prefix;\n      (*vars)[\"AsyncStart\"] = async_prefix.start;\n      (*vars)[\"AsyncMethodParams\"] = async_prefix.method_params;\n      (*vars)[\"AsyncCreateArgs\"] = async_prefix.create_args;\n      printer->Print(*vars,\n                     \"::grpc::ClientAsyncWriter< $Request$>* \"\n                     \"$ns$$Service$::Stub::$AsyncPrefix$$Method$Raw(\"\n                     \"::grpc::ClientContext* context, $Response$* response, \"\n                     \"::grpc::CompletionQueue* cq$AsyncMethodParams$) {\\n\");\n      printer->Print(\n          *vars,\n          \"  return ::grpc::internal::ClientAsyncWriterFactory< $Request$>\"\n          \"::Create(channel_.get(), cq, \"\n          \"rpcmethod_$Method$_, \"\n          \"context, response, $AsyncStart$$AsyncCreateArgs$);\\n\"\n          \"}\\n\\n\");\n    }\n  } else if (ServerOnlyStreaming(method)) {\n    printer->Print(\n        *vars,\n        \"::grpc::ClientReader< $Response$>* \"\n        \"$ns$$Service$::Stub::$Method$Raw(\"\n        \"::grpc::ClientContext* context, const $Request$& request) {\\n\");\n    printer->Print(\n        *vars,\n        \"  return ::grpc::internal::ClientReaderFactory< $Response$>::Create(\"\n        \"channel_.get(), \"\n        \"rpcmethod_$Method$_, \"\n        \"context, request);\\n\"\n        \"}\\n\\n\");\n    if ((*vars)[\"generate_callback_api\"] == \"1\") {\n      printer->Print(\n          *vars,\n          \"void $ns$$Service$::Stub::async_$Method$(::grpc::ClientContext* \"\n          \"context, const $Request$& request, ::grpc::ClientReadReactor< \"\n          \"$Response$ >* reactor) {\\n\");\n      printer->Print(\n          *vars,\n          \"  ::grpc::internal::ClientCallbackReaderFactory< \"\n          \"$Response$ >::Create(channel_.get(), \"\n          \"rpcmethod_$Method$_, context, &request, reactor);\\n}\\n\\n\");\n    }\n    for (size_t i = 0; i < sizeof(async_prefixes) / sizeof(async_prefixes[0]);\n         i++) {\n      auto& async_prefix = async_prefixes[i];\n      (*vars)[\"AsyncPrefix\"] = async_prefix.prefix;\n      (*vars)[\"AsyncStart\"] = async_prefix.start;\n      (*vars)[\"AsyncMethodParams\"] = async_prefix.method_params;\n      (*vars)[\"AsyncCreateArgs\"] = async_prefix.create_args;\n      printer->Print(\n          *vars,\n          \"::grpc::ClientAsyncReader< $Response$>* \"\n          \"$ns$$Service$::Stub::$AsyncPrefix$$Method$Raw(\"\n          \"::grpc::ClientContext* context, const $Request$& request, \"\n          \"::grpc::CompletionQueue* cq$AsyncMethodParams$) {\\n\");\n      printer->Print(\n          *vars,\n          \"  return ::grpc::internal::ClientAsyncReaderFactory< $Response$>\"\n          \"::Create(channel_.get(), cq, \"\n          \"rpcmethod_$Method$_, \"\n          \"context, request, $AsyncStart$$AsyncCreateArgs$);\\n\"\n          \"}\\n\\n\");\n    }\n  } else if (method->BidiStreaming()) {\n    printer->Print(\n        *vars,\n        \"::grpc::ClientReaderWriter< $Request$, $Response$>* \"\n        \"$ns$$Service$::Stub::$Method$Raw(::grpc::ClientContext* context) {\\n\");\n    printer->Print(*vars,\n                   \"  return ::grpc::internal::ClientReaderWriterFactory< \"\n                   \"$Request$, $Response$>::Create(\"\n                   \"channel_.get(), \"\n                   \"rpcmethod_$Method$_, \"\n                   \"context);\\n\"\n                   \"}\\n\\n\");\n    if ((*vars)[\"generate_callback_api\"] == \"1\") {\n      printer->Print(\n          *vars,\n          \"void $ns$$Service$::Stub::async_$Method$(::grpc::ClientContext* \"\n          \"context, ::grpc::ClientBidiReactor< $Request$, $Response$ >* \"\n          \"reactor) {\\n\");\n      printer->Print(*vars,\n                     \"  ::grpc::internal::ClientCallbackReaderWriterFactory< \"\n                     \"$Request$, $Response$ >::Create(channel_.get(), \"\n                     \"rpcmethod_$Method$_, context, reactor);\\n}\\n\\n\");\n    }\n    for (size_t i = 0; i < sizeof(async_prefixes) / sizeof(async_prefixes[0]);\n         i++) {\n      auto& async_prefix = async_prefixes[i];\n      (*vars)[\"AsyncPrefix\"] = async_prefix.prefix;\n      (*vars)[\"AsyncStart\"] = async_prefix.start;\n      (*vars)[\"AsyncMethodParams\"] = async_prefix.method_params;\n      (*vars)[\"AsyncCreateArgs\"] = async_prefix.create_args;\n      printer->Print(*vars,\n                     \"::grpc::ClientAsyncReaderWriter< $Request$, $Response$>* \"\n                     \"$ns$$Service$::Stub::$AsyncPrefix$$Method$Raw(::grpc::\"\n                     \"ClientContext* context, \"\n                     \"::grpc::CompletionQueue* cq$AsyncMethodParams$) {\\n\");\n      printer->Print(*vars,\n                     \"  return \"\n                     \"::grpc::internal::ClientAsyncReaderWriterFactory< \"\n                     \"$Request$, $Response$>::Create(\"\n                     \"channel_.get(), cq, \"\n                     \"rpcmethod_$Method$_, \"\n                     \"context, $AsyncStart$$AsyncCreateArgs$);\\n\"\n                     \"}\\n\\n\");\n    }\n  }\n}\n\nstatic void PrintSourceServerMethod(\n    grpc_generator::Printer* printer, const grpc_generator::Method* method,\n    std::map<grpc::string, grpc::string>* vars) {\n  (*vars)[\"Method\"] = method->name();\n  (*vars)[\"Request\"] = method->input_type_name();\n  (*vars)[\"Response\"] = method->output_type_name();\n  if (method->NoStreaming()) {\n    printer->Print(\n        *vars,\n        \"::grpc::Status $ns$$Service$::Service::$Method$(\"\n        \"::grpc::ServerContext* /*context*/, \"\n        \"const $Request$* /*request*/, $Response$* /*response*/) {\\n\");\n    printer->Print(\n        \"  return ::grpc::Status(\"\n        \"::grpc::StatusCode::UNIMPLEMENTED, \\\"\\\");\\n\");\n    printer->Print(\"}\\n\\n\");\n  } else if (ClientOnlyStreaming(method)) {\n    printer->Print(*vars,\n                   \"::grpc::Status $ns$$Service$::Service::$Method$(\"\n                   \"::grpc::ServerContext* /*context*/, \"\n                   \"::grpc::ServerReader< $Request$>* /*reader*/, \"\n                   \"$Response$* /*response*/) {\\n\");\n    printer->Print(\n        \"  return ::grpc::Status(\"\n        \"::grpc::StatusCode::UNIMPLEMENTED, \\\"\\\");\\n\");\n    printer->Print(\"}\\n\\n\");\n  } else if (ServerOnlyStreaming(method)) {\n    printer->Print(*vars,\n                   \"::grpc::Status $ns$$Service$::Service::$Method$(\"\n                   \"::grpc::ServerContext* /*context*/, \"\n                   \"const $Request$* /*request*/, \"\n                   \"::grpc::ServerWriter< $Response$>* /*writer*/) {\\n\");\n    printer->Print(\n        \"  return ::grpc::Status(\"\n        \"::grpc::StatusCode::UNIMPLEMENTED, \\\"\\\");\\n\");\n    printer->Print(\"}\\n\\n\");\n  } else if (method->BidiStreaming()) {\n    printer->Print(*vars,\n                   \"::grpc::Status $ns$$Service$::Service::$Method$(\"\n                   \"::grpc::ServerContext* /*context*/, \"\n                   \"::grpc::ServerReaderWriter< $Response$, $Request$>* \"\n                   \"/*stream*/) {\\n\");\n    printer->Print(\n        \"  return ::grpc::Status(\"\n        \"::grpc::StatusCode::UNIMPLEMENTED, \\\"\\\");\\n\");\n    printer->Print(\"}\\n\\n\");\n  }\n}\n\nstatic void PrintSourceService(grpc_generator::Printer* printer,\n                               const grpc_generator::Service* service,\n                               std::map<grpc::string, grpc::string>* vars) {\n  (*vars)[\"Service\"] = service->name();\n\n  if (service->method_count() > 0) {\n    printer->Print(*vars,\n                   \"static const char* $prefix$$Service$_method_names[] = {\\n\");\n    for (int i = 0; i < service->method_count(); ++i) {\n      (*vars)[\"Method\"] = service->method(i).get()->name();\n      printer->Print(*vars, \"  \\\"/$Package$$Service$/$Method$\\\",\\n\");\n    }\n    printer->Print(*vars, \"};\\n\\n\");\n  }\n\n  printer->Print(*vars,\n                 \"std::unique_ptr< $ns$$Service$::Stub> $ns$$Service$::NewStub(\"\n                 \"const std::shared_ptr< ::grpc::ChannelInterface>& channel, \"\n                 \"const ::grpc::StubOptions& /*options*/) {\\n\"\n                 \"  std::unique_ptr< $ns$$Service$::Stub> stub(new \"\n                 \"$ns$$Service$::Stub(channel));\\n\"\n                 \"  return stub;\\n\"\n                 \"}\\n\\n\");\n  printer->Print(*vars,\n                 \"$ns$$Service$::Stub::Stub(const std::shared_ptr< \"\n                 \"::grpc::ChannelInterface>& channel)\\n\");\n  printer->Indent();\n  printer->Print(\": channel_(channel)\");\n  for (int i = 0; i < service->method_count(); ++i) {\n    auto method = service->method(i);\n    (*vars)[\"Method\"] = method->name();\n    (*vars)[\"Idx\"] = as_string(i);\n    if (method->NoStreaming()) {\n      (*vars)[\"StreamingType\"] = \"NORMAL_RPC\";\n      // NOTE: There is no reason to consider streamed-unary as a separate\n      // category here since this part is setting up the client-side stub\n      // and this appears as a NORMAL_RPC from the client-side.\n    } else if (ClientOnlyStreaming(method.get())) {\n      (*vars)[\"StreamingType\"] = \"CLIENT_STREAMING\";\n    } else if (ServerOnlyStreaming(method.get())) {\n      (*vars)[\"StreamingType\"] = \"SERVER_STREAMING\";\n    } else {\n      (*vars)[\"StreamingType\"] = \"BIDI_STREAMING\";\n    }\n    printer->Print(*vars,\n                   \", rpcmethod_$Method$_(\"\n                   \"$prefix$$Service$_method_names[$Idx$], \"\n                   \"::grpc::internal::RpcMethod::$StreamingType$, \"\n                   \"channel\"\n                   \")\\n\");\n  }\n  printer->Print(\"{}\\n\\n\");\n  printer->Outdent();\n\n  for (int i = 0; i < service->method_count(); ++i) {\n    (*vars)[\"Idx\"] = as_string(i);\n    PrintSourceClientMethod(printer, service->method(i).get(), vars);\n  }\n\n  printer->Print(*vars, \"$ns$$Service$::Service::Service() {\\n\");\n  printer->Indent();\n  for (int i = 0; i < service->method_count(); ++i) {\n    auto method = service->method(i);\n    (*vars)[\"Idx\"] = as_string(i);\n    (*vars)[\"Method\"] = method->name();\n    (*vars)[\"Request\"] = method->input_type_name();\n    (*vars)[\"Response\"] = method->output_type_name();\n    if (method->NoStreaming()) {\n      printer->Print(\n          *vars,\n          \"AddMethod(new ::grpc::internal::RpcServiceMethod(\\n\"\n          \"    $prefix$$Service$_method_names[$Idx$],\\n\"\n          \"    ::grpc::internal::RpcMethod::NORMAL_RPC,\\n\"\n          \"    new ::grpc::internal::RpcMethodHandler< $ns$$Service$::Service, \"\n          \"$Request$, \"\n          \"$Response$>(\\n\"\n          \"        std::mem_fn(&$ns$$Service$::Service::$Method$), this)));\\n\");\n    } else if (ClientOnlyStreaming(method.get())) {\n      printer->Print(\n          *vars,\n          \"AddMethod(new ::grpc::internal::RpcServiceMethod(\\n\"\n          \"    $prefix$$Service$_method_names[$Idx$],\\n\"\n          \"    ::grpc::internal::RpcMethod::CLIENT_STREAMING,\\n\"\n          \"    new ::grpc::internal::ClientStreamingHandler< \"\n          \"$ns$$Service$::Service, $Request$, $Response$>(\\n\"\n          \"        std::mem_fn(&$ns$$Service$::Service::$Method$), this)));\\n\");\n    } else if (ServerOnlyStreaming(method.get())) {\n      printer->Print(\n          *vars,\n          \"AddMethod(new ::grpc::internal::RpcServiceMethod(\\n\"\n          \"    $prefix$$Service$_method_names[$Idx$],\\n\"\n          \"    ::grpc::internal::RpcMethod::SERVER_STREAMING,\\n\"\n          \"    new ::grpc::internal::ServerStreamingHandler< \"\n          \"$ns$$Service$::Service, $Request$, $Response$>(\\n\"\n          \"        std::mem_fn(&$ns$$Service$::Service::$Method$), this)));\\n\");\n    } else if (method->BidiStreaming()) {\n      printer->Print(\n          *vars,\n          \"AddMethod(new ::grpc::internal::RpcServiceMethod(\\n\"\n          \"    $prefix$$Service$_method_names[$Idx$],\\n\"\n          \"    ::grpc::internal::RpcMethod::BIDI_STREAMING,\\n\"\n          \"    new ::grpc::internal::BidiStreamingHandler< \"\n          \"$ns$$Service$::Service, $Request$, $Response$>(\\n\"\n          \"        std::mem_fn(&$ns$$Service$::Service::$Method$), this)));\\n\");\n    }\n  }\n  printer->Outdent();\n  printer->Print(*vars, \"}\\n\\n\");\n  printer->Print(*vars,\n                 \"$ns$$Service$::Service::~Service() {\\n\"\n                 \"}\\n\\n\");\n  for (int i = 0; i < service->method_count(); ++i) {\n    (*vars)[\"Idx\"] = as_string(i);\n    PrintSourceServerMethod(printer, service->method(i).get(), vars);\n  }\n\n  // CallbackService implementation (if enabled)\n  if ((*vars)[\"generate_callback_api\"] == \"1\") {\n    (*vars)[\"Service\"] = service->name();\n    printer->Print(\"#if defined(GRPC_CALLBACK_API_NONEXPERIMENTAL)\\n\");\n    printer->Print(*vars,\n                   \"$ns$$Service$::CallbackService::CallbackService() {\\n\");\n    printer->Indent();\n    for (int i = 0; i < service->method_count(); ++i) {\n      auto method = service->method(i);\n      (*vars)[\"Idx\"] = as_string(i);\n      (*vars)[\"Method\"] = method->name();\n      (*vars)[\"Request\"] = method->input_type_name();\n      (*vars)[\"Response\"] = method->output_type_name();\n      if (method->NoStreaming()) {\n        printer->Print(\n            *vars,\n            \"AddMethod(new ::grpc::internal::RpcServiceMethod(\\n\"\n            \"    $prefix$$Service$_method_names[$Idx$],\\n\"\n            \"    ::grpc::internal::RpcMethod::NORMAL_RPC,\\n\"\n            \"    new ::grpc::internal::CallbackUnaryHandler<$Request$, \"\n            \"$Response$>(\\n\"\n            \"      [this](::grpc::CallbackServerContext* ctx, const $Request$* \"\n            \"req, $Response$* resp) {\\n\"\n            \"        return this->$Method$(ctx, req, resp);\\n\"\n            \"      })));\\n\");\n      } else if (ClientOnlyStreaming(method.get())) {\n        printer->Print(*vars,\n                       \"AddMethod(new ::grpc::internal::RpcServiceMethod(\\n\"\n                       \"    $prefix$$Service$_method_names[$Idx$],\\n\"\n                       \"    ::grpc::internal::RpcMethod::CLIENT_STREAMING,\\n\"\n                       \"    new \"\n                       \"::grpc::internal::CallbackClientStreamingHandler<$\"\n                       \"Request$, $Response$>(\\n\"\n                       \"      [this](::grpc::CallbackServerContext* ctx, \"\n                       \"$Response$* resp) {\\n\"\n                       \"        return this->$Method$(ctx, resp);\\n\"\n                       \"      })));\\n\");\n      } else if (ServerOnlyStreaming(method.get())) {\n        printer->Print(*vars,\n                       \"AddMethod(new ::grpc::internal::RpcServiceMethod(\\n\"\n                       \"    $prefix$$Service$_method_names[$Idx$],\\n\"\n                       \"    ::grpc::internal::RpcMethod::SERVER_STREAMING,\\n\"\n                       \"    new \"\n                       \"::grpc::internal::CallbackServerStreamingHandler<$\"\n                       \"Request$, $Response$>(\\n\"\n                       \"      [this](::grpc::CallbackServerContext* ctx, const \"\n                       \"$Request$* req) {\\n\"\n                       \"        return this->$Method$(ctx, req);\\n\"\n                       \"      })));\\n\");\n      } else if (method->BidiStreaming()) {\n        printer->Print(\n            *vars,\n            \"AddMethod(new ::grpc::internal::RpcServiceMethod(\\n\"\n            \"    $prefix$$Service$_method_names[$Idx$],\\n\"\n            \"    ::grpc::internal::RpcMethod::BIDI_STREAMING,\\n\"\n            \"    new ::grpc::internal::CallbackBidiHandler<$Request$, \"\n            \"$Response$>(\\n\"\n            \"      [this](::grpc::CallbackServerContext* ctx) {\\n\"\n            \"        return this->$Method$(ctx);\\n\"\n            \"      })));\\n\");\n      }\n    }\n    printer->Outdent();\n    printer->Print(\"}\\n\\n\");\n    printer->Print(*vars,\n                   \"$ns$$Service$::CallbackService::~CallbackService() {}\\n\\n\");\n    // Default method bodies returning UNIMPLEMENTED reactors.\n    for (int i = 0; i < service->method_count(); ++i) {\n      auto method = service->method(i);\n      (*vars)[\"Method\"] = method->name();\n      (*vars)[\"Request\"] = method->input_type_name();\n      (*vars)[\"Response\"] = method->output_type_name();\n      if (method->NoStreaming()) {\n        printer->Print(*vars,\n                       \"::grpc::ServerUnaryReactor* \"\n                       \"$ns$$Service$::CallbackService::$Method$(::grpc::\"\n                       \"CallbackServerContext* /*context*/, const $Request$* \"\n                       \"/*request*/, $Response$* /*response*/) {\\n\"\n                       \"  return nullptr; // user must override\\n\"\n                       \"}\\n\\n\");\n      } else if (ClientOnlyStreaming(method.get())) {\n        printer->Print(\n            *vars,\n            \"::grpc::ServerReadReactor<$Request$>* \"\n            \"$ns$$Service$::CallbackService::$Method$(::grpc::\"\n            \"CallbackServerContext* /*context*/, $Response$* /*response*/) {\\n\"\n            \"  return nullptr; // user must override\\n\"\n            \"}\\n\\n\");\n      } else if (ServerOnlyStreaming(method.get())) {\n        printer->Print(*vars,\n                       \"::grpc::ServerWriteReactor<$Response$>* \"\n                       \"$ns$$Service$::CallbackService::$Method$(::grpc::\"\n                       \"CallbackServerContext* /*context*/, const $Request$* \"\n                       \"/*request*/) {\\n\"\n                       \"  return nullptr; // user must override\\n\"\n                       \"}\\n\\n\");\n      } else if (method->BidiStreaming()) {\n        printer->Print(*vars,\n                       \"::grpc::ServerBidiReactor<$Request$, $Response$>* \"\n                       \"$ns$$Service$::CallbackService::$Method$(::grpc::\"\n                       \"CallbackServerContext* /*context*/) {\\n\"\n                       \"  return nullptr; // user must override\\n\"\n                       \"}\\n\\n\");\n      }\n    }\n    printer->Print(\"#endif // GRPC_CALLBACK_API_NONEXPERIMENTAL\\n\");\n  }\n}\n\n}  // namespace\n\ngrpc::string GetSourceServices(grpc_generator::File* file,\n                               const Parameters& params) {\n  grpc::string output;\n  {\n    // Scope the output stream so it closes and finalizes output to the string.\n    auto printer = file->CreatePrinter(&output);\n    std::map<grpc::string, grpc::string> vars;\n    // Package string is empty or ends with a dot. It is used to fully qualify\n    // method names.\n    vars[\"Package\"] = file->package();\n    if (!file->package().empty()) {\n      vars[\"Package\"].append(\".\");\n    }\n    if (!params.services_namespace.empty()) {\n      vars[\"ns\"] = params.services_namespace + \"::\";\n      vars[\"prefix\"] = params.services_namespace;\n    } else {\n      vars[\"ns\"] = \"\";\n      vars[\"prefix\"] = \"\";\n    }\n\n    for (int i = 0; i < file->service_count(); ++i) {\n      vars[\"generate_callback_api\"] = params.generate_callback_api ? \"1\" : \"0\";\n      PrintSourceService(printer.get(), file->service(i).get(), &vars);\n      printer->Print(\"\\n\");\n    }\n  }\n  return output;\n}\n\ngrpc::string GetSourceEpilogue(grpc_generator::File* file,\n                               const Parameters& /*params*/) {\n  grpc::string temp;\n\n  if (!file->package().empty()) {\n    std::vector<grpc::string> parts = file->package_parts();\n\n    for (auto part = parts.begin(); part != parts.end(); part++) {\n      temp.append(\"}  // namespace \");\n      temp.append(*part);\n      temp.append(\"\\n\");\n    }\n    temp.append(\"\\n\");\n  }\n\n  return temp;\n}\n\ngrpc::string GetMockPrologue(grpc_generator::File* file,\n                             const Parameters& params) {\n  grpc::string output;\n  {\n    // Scope the output stream so it closes and finalizes output to the string.\n    auto printer = file->CreatePrinter(&output);\n    std::map<grpc::string, grpc::string> vars;\n\n    vars[\"filename\"] = file->filename();\n    vars[\"filename_base\"] = file->filename_without_ext();\n    vars[\"message_header_ext\"] = params.message_header_extension;\n    vars[\"service_header_ext\"] = params.service_header_extension;\n\n    printer->Print(vars, \"// Generated by the gRPC C++ plugin.\\n\");\n    printer->Print(vars,\n                   \"// If you make any local change, they will be lost.\\n\");\n    printer->Print(vars, \"// source: $filename$\\n\\n\");\n\n    printer->Print(vars, \"#include \\\"$filename_base$$message_header_ext$\\\"\\n\");\n    printer->Print(vars, \"#include \\\"$filename_base$$service_header_ext$\\\"\\n\");\n    printer->Print(vars, file->additional_headers().c_str());\n    printer->Print(vars, \"\\n\");\n  }\n  return output;\n}\n\n// TODO(mmukhi): Add client-stream and completion-queue headers.\ngrpc::string GetMockIncludes(grpc_generator::File* file,\n                             const Parameters& params) {\n  grpc::string output;\n  {\n    // Scope the output stream so it closes and finalizes output to the string.\n    auto printer = file->CreatePrinter(&output);\n    std::map<grpc::string, grpc::string> vars;\n\n    static const char* headers_strs[] = {\n        \"grpcpp/impl/codegen/async_stream.h\",\n        \"grpcpp/impl/codegen/sync_stream.h\",\n        \"gmock/gmock.h\",\n    };\n    std::vector<grpc::string> headers(headers_strs, array_end(headers_strs));\n    PrintIncludes(printer.get(), headers, params);\n\n    if (!file->package().empty()) {\n      std::vector<grpc::string> parts = file->package_parts();\n\n      for (auto part = parts.begin(); part != parts.end(); part++) {\n        vars[\"part\"] = *part;\n        printer->Print(vars, \"namespace $part$ {\\n\");\n      }\n    }\n\n    printer->Print(vars, \"\\n\");\n  }\n  return output;\n}\n\nnamespace {\n\nstatic void PrintMockClientMethods(grpc_generator::Printer* printer,\n                                   const grpc_generator::Method* method,\n                                   std::map<grpc::string, grpc::string>* vars) {\n  (*vars)[\"Method\"] = method->name();\n  (*vars)[\"Request\"] = method->input_type_name();\n  (*vars)[\"Response\"] = method->output_type_name();\n\n  struct {\n    grpc::string prefix;\n    grpc::string method_params;  // extra arguments to method\n    int extra_method_param_count;\n  } async_prefixes[] = {{\"Async\", \", void* tag\", 1}, {\"PrepareAsync\", \"\", 0}};\n\n  if (method->NoStreaming()) {\n    printer->Print(\n        *vars,\n        \"MOCK_METHOD3($Method$, ::grpc::Status(::grpc::ClientContext* context, \"\n        \"const $Request$& request, $Response$* response));\\n\");\n    for (size_t i = 0; i < sizeof(async_prefixes) / sizeof(async_prefixes[0]);\n         i++) {\n      auto& async_prefix = async_prefixes[i];\n      (*vars)[\"AsyncPrefix\"] = async_prefix.prefix;\n      printer->Print(\n          *vars,\n          \"MOCK_METHOD3($AsyncPrefix$$Method$Raw, \"\n          \"::grpc::ClientAsyncResponseReaderInterface< $Response$>*\"\n          \"(::grpc::ClientContext* context, const $Request$& request, \"\n          \"::grpc::CompletionQueue* cq));\\n\");\n    }\n  } else if (ClientOnlyStreaming(method)) {\n    printer->Print(\n        *vars,\n        \"MOCK_METHOD2($Method$Raw, \"\n        \"::grpc::ClientWriterInterface< $Request$>*\"\n        \"(::grpc::ClientContext* context, $Response$* response));\\n\");\n    for (size_t i = 0; i < sizeof(async_prefixes) / sizeof(async_prefixes[0]);\n         i++) {\n      auto& async_prefix = async_prefixes[i];\n      (*vars)[\"AsyncPrefix\"] = async_prefix.prefix;\n      (*vars)[\"AsyncMethodParams\"] = async_prefix.method_params;\n      (*vars)[\"MockArgs\"] =\n          flatbuffers::NumToString(3 + async_prefix.extra_method_param_count);\n      printer->Print(*vars,\n                     \"MOCK_METHOD$MockArgs$($AsyncPrefix$$Method$Raw, \"\n                     \"::grpc::ClientAsyncWriterInterface< $Request$>*\"\n                     \"(::grpc::ClientContext* context, $Response$* response, \"\n                     \"::grpc::CompletionQueue* cq$AsyncMethodParams$));\\n\");\n    }\n  } else if (ServerOnlyStreaming(method)) {\n    printer->Print(\n        *vars,\n        \"MOCK_METHOD2($Method$Raw, \"\n        \"::grpc::ClientReaderInterface< $Response$>*\"\n        \"(::grpc::ClientContext* context, const $Request$& request));\\n\");\n    for (size_t i = 0; i < sizeof(async_prefixes) / sizeof(async_prefixes[0]);\n         i++) {\n      auto& async_prefix = async_prefixes[i];\n      (*vars)[\"AsyncPrefix\"] = async_prefix.prefix;\n      (*vars)[\"AsyncMethodParams\"] = async_prefix.method_params;\n      (*vars)[\"MockArgs\"] =\n          flatbuffers::NumToString(3 + async_prefix.extra_method_param_count);\n      printer->Print(\n          *vars,\n          \"MOCK_METHOD$MockArgs$($AsyncPrefix$$Method$Raw, \"\n          \"::grpc::ClientAsyncReaderInterface< $Response$>*\"\n          \"(::grpc::ClientContext* context, const $Request$& request, \"\n          \"::grpc::CompletionQueue* cq$AsyncMethodParams$));\\n\");\n    }\n  } else if (method->BidiStreaming()) {\n    printer->Print(\n        *vars,\n        \"MOCK_METHOD1($Method$Raw, \"\n        \"::grpc::ClientReaderWriterInterface< $Request$, $Response$>*\"\n        \"(::grpc::ClientContext* context));\\n\");\n    for (size_t i = 0; i < sizeof(async_prefixes) / sizeof(async_prefixes[0]);\n         i++) {\n      auto& async_prefix = async_prefixes[i];\n      (*vars)[\"AsyncPrefix\"] = async_prefix.prefix;\n      (*vars)[\"AsyncMethodParams\"] = async_prefix.method_params;\n      (*vars)[\"MockArgs\"] =\n          flatbuffers::NumToString(2 + async_prefix.extra_method_param_count);\n      printer->Print(\n          *vars,\n          \"MOCK_METHOD$MockArgs$($AsyncPrefix$$Method$Raw, \"\n          \"::grpc::ClientAsyncReaderWriterInterface<$Request$, $Response$>*\"\n          \"(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq\"\n          \"$AsyncMethodParams$));\\n\");\n    }\n  }\n}\n\nstatic void PrintMockService(grpc_generator::Printer* printer,\n                             const grpc_generator::Service* service,\n                             std::map<grpc::string, grpc::string>* vars) {\n  (*vars)[\"Service\"] = service->name();\n\n  printer->Print(*vars,\n                 \"class Mock$Service$Stub : public $Service$::StubInterface {\\n\"\n                 \" public:\\n\");\n  printer->Indent();\n  for (int i = 0; i < service->method_count(); ++i) {\n    PrintMockClientMethods(printer, service->method(i).get(), vars);\n  }\n  printer->Outdent();\n  printer->Print(\"};\\n\");\n}\n\n}  // namespace\n\ngrpc::string GetMockServices(grpc_generator::File* file,\n                             const Parameters& params) {\n  grpc::string output;\n  {\n    // Scope the output stream so it closes and finalizes output to the string.\n    auto printer = file->CreatePrinter(&output);\n    std::map<grpc::string, grpc::string> vars;\n    // Package string is empty or ends with a dot. It is used to fully qualify\n    // method names.\n    vars[\"Package\"] = file->package();\n    if (!file->package().empty()) {\n      vars[\"Package\"].append(\".\");\n    }\n\n    if (!params.services_namespace.empty()) {\n      vars[\"services_namespace\"] = params.services_namespace;\n      printer->Print(vars, \"\\nnamespace $services_namespace$ {\\n\\n\");\n    }\n\n    for (int i = 0; i < file->service_count(); i++) {\n      PrintMockService(printer.get(), file->service(i).get(), &vars);\n      printer->Print(\"\\n\");\n    }\n\n    if (!params.services_namespace.empty()) {\n      printer->Print(vars, \"} // namespace $services_namespace$\\n\\n\");\n    }\n  }\n  return output;\n}\n\ngrpc::string GetMockEpilogue(grpc_generator::File* file,\n                             const Parameters& /*params*/) {\n  grpc::string temp;\n\n  if (!file->package().empty()) {\n    std::vector<grpc::string> parts = file->package_parts();\n\n    for (auto part = parts.begin(); part != parts.end(); part++) {\n      temp.append(\"} // namespace \");\n      temp.append(*part);\n      temp.append(\"\\n\");\n    }\n    temp.append(\"\\n\");\n  }\n\n  return temp;\n}\n\n}  // namespace grpc_cpp_generator\n"
  },
  {
    "path": "grpc/src/compiler/cpp_generator.h",
    "content": "#ifndef GRPC_INTERNAL_COMPILER_CPP_GENERATOR_H\n#define GRPC_INTERNAL_COMPILER_CPP_GENERATOR_H\n\n// cpp_generator.h/.cc do not directly depend on GRPC/ProtoBuf, such that they\n// can be used to generate code for other serialization systems, such as\n// FlatBuffers.\n\n#include <memory>\n#include <vector>\n\n#include \"src/compiler/schema_interface.h\"\n\n#ifndef GRPC_CUSTOM_STRING\n#include <string>\n#define GRPC_CUSTOM_STRING std::string\n#endif\n\nnamespace grpc {\n\ntypedef GRPC_CUSTOM_STRING string;\n\n}  // namespace grpc\n\nnamespace grpc_cpp_generator {\n\n// Contains all the parameters that are parsed from the command line.\nstruct Parameters {\n  // Puts the service into a namespace\n  grpc::string services_namespace;\n  // Use system includes (<>) or local includes (\"\")\n  bool use_system_headers;\n  // Prefix to any grpc include\n  grpc::string grpc_search_path;\n  // Generate GMOCK code to facilitate unit testing.\n  bool generate_mock_code;\n  // By default, use \"_generated.h\"\n  std::string message_header_extension;\n  // Default: \".grpc.fb.h\"\n  std::string service_header_extension;\n  // Generate modern callback-based async API service code (CallbackService)\n  bool generate_callback_api = false;\n};\n\n// Return the prologue of the generated header file.\ngrpc::string GetHeaderPrologue(grpc_generator::File* file,\n                               const Parameters& params);\n\n// Return the includes needed for generated header file.\ngrpc::string GetHeaderIncludes(grpc_generator::File* file,\n                               const Parameters& params);\n\n// Return the includes needed for generated source file.\ngrpc::string GetSourceIncludes(grpc_generator::File* file,\n                               const Parameters& params);\n\n// Return the epilogue of the generated header file.\ngrpc::string GetHeaderEpilogue(grpc_generator::File* file,\n                               const Parameters& params);\n\n// Return the prologue of the generated source file.\ngrpc::string GetSourcePrologue(grpc_generator::File* file,\n                               const Parameters& params);\n\n// Return the services for generated header file.\ngrpc::string GetHeaderServices(grpc_generator::File* file,\n                               const Parameters& params);\n\n// Return the services for generated source file.\ngrpc::string GetSourceServices(grpc_generator::File* file,\n                               const Parameters& params);\n\n// Return the epilogue of the generated source file.\ngrpc::string GetSourceEpilogue(grpc_generator::File* file,\n                               const Parameters& params);\n\n// Return the prologue of the generated mock file.\ngrpc::string GetMockPrologue(grpc_generator::File* file,\n                             const Parameters& params);\n\n// Return the includes needed for generated mock file.\ngrpc::string GetMockIncludes(grpc_generator::File* file,\n                             const Parameters& params);\n\n// Return the services for generated mock file.\ngrpc::string GetMockServices(grpc_generator::File* file,\n                             const Parameters& params);\n\n// Return the epilogue of generated mock file.\ngrpc::string GetMockEpilogue(grpc_generator::File* file,\n                             const Parameters& params);\n\n// Return the prologue of the generated mock file.\ngrpc::string GetMockPrologue(grpc_generator::File* file,\n                             const Parameters& params);\n\n// Return the includes needed for generated mock file.\ngrpc::string GetMockIncludes(grpc_generator::File* file,\n                             const Parameters& params);\n\n// Return the services for generated mock file.\ngrpc::string GetMockServices(grpc_generator::File* file,\n                             const Parameters& params);\n\n// Return the epilogue of generated mock file.\ngrpc::string GetMockEpilogue(grpc_generator::File* file,\n                             const Parameters& params);\n\n}  // namespace grpc_cpp_generator\n\n#endif  // GRPC_INTERNAL_COMPILER_CPP_GENERATOR_H\n"
  },
  {
    "path": "grpc/src/compiler/go_generator.cc",
    "content": "#include \"src/compiler/go_generator.h\"\n\n#include <cctype>\n#include <map>\n#include <sstream>\n\ntemplate <class T>\ngrpc::string as_string(T x) {\n  std::ostringstream out;\n  out << x;\n  return out.str();\n}\n\ninline bool ClientOnlyStreaming(const grpc_generator::Method* method) {\n  return method->ClientStreaming() && !method->ServerStreaming();\n}\n\ninline bool ServerOnlyStreaming(const grpc_generator::Method* method) {\n  return !method->ClientStreaming() && method->ServerStreaming();\n}\n\nnamespace grpc_go_generator {\nnamespace {\n\n// Returns string with first letter to lowerCase\nstatic grpc::string unexportName(grpc::string s) {\n  if (s.empty()) return s;\n  s[0] = static_cast<char>(std::tolower(s[0]));\n  return s;\n}\n\n// Returns string with first letter to uppercase\nstatic grpc::string exportName(grpc::string s) {\n  if (s.empty()) return s;\n  s[0] = static_cast<char>(std::toupper(s[0]));\n  return s;\n}\n\nstatic void GenerateError(grpc_generator::Printer* printer,\n                          std::map<grpc::string, grpc::string> vars,\n                          const bool multiple_return = true) {\n  printer->Print(vars, \"if $Error_Check$ {\\n\");\n  printer->Indent();\n  vars[\"Return\"] = multiple_return ? \"nil, err\" : \"err\";\n  printer->Print(vars, \"return $Return$\\n\");\n  printer->Outdent();\n  printer->Print(\"}\\n\");\n}\n\n// Generates imports for the service\nstatic void GenerateImports(grpc_generator::File* file,\n                            grpc_generator::Printer* printer,\n                            std::map<grpc::string, grpc::string> vars) {\n  vars[\"filename\"] = file->filename();\n  printer->Print(\"//Generated by gRPC Go plugin\\n\");\n  printer->Print(\"//If you make any local changes, they will be lost\\n\");\n  printer->Print(vars, \"//source: $filename$\\n\\n\");\n  printer->Print(vars, \"package $Package$\\n\\n\");\n  printer->Print(\"import (\\n\");\n  printer->Indent();\n  printer->Print(vars, \"$context$ \\\"context\\\"\\n\");\n  printer->Print(\"flatbuffers \\\"github.com/google/flatbuffers/go\\\"\\n\");\n  printer->Print(vars, \"$grpc$ \\\"google.golang.org/grpc\\\"\\n\");\n  printer->Print(\"\\\"google.golang.org/grpc/codes\\\"\\n\");\n  printer->Print(\"\\\"google.golang.org/grpc/status\\\"\\n\");\n  printer->Outdent();\n  printer->Print(\")\\n\\n\");\n}\n\n// Generates Server method signature source\nstatic void GenerateServerMethodSignature(\n    const grpc_generator::Method* method, grpc_generator::Printer* printer,\n    std::map<grpc::string, grpc::string> vars) {\n  vars[\"Method\"] = exportName(method->name());\n  vars[\"Request\"] = method->get_input_type_name();\n  vars[\"Response\"] = (vars[\"CustomMethodIO\"] == \"\")\n                         ? method->get_output_type_name()\n                         : vars[\"CustomMethodIO\"];\n  if (method->NoStreaming()) {\n    printer->Print(\n        vars,\n        \"$Method$($context$.Context, *$Request$) (*$Response$, error)$Ending$\");\n  } else if (ServerOnlyStreaming(method)) {\n    printer->Print(\n        vars, \"$Method$(*$Request$, $Service$_$Method$Server) error$Ending$\");\n  } else {\n    printer->Print(vars, \"$Method$($Service$_$Method$Server) error$Ending$\");\n  }\n}\n\nstatic void GenerateServerMethod(const grpc_generator::Method* method,\n                                 grpc_generator::Printer* printer,\n                                 std::map<grpc::string, grpc::string> vars) {\n  vars[\"Method\"] = exportName(method->name());\n  vars[\"Request\"] = method->get_input_type_name();\n  vars[\"Response\"] = (vars[\"CustomMethodIO\"] == \"\")\n                         ? method->get_output_type_name()\n                         : vars[\"CustomMethodIO\"];\n  vars[\"FullMethodName\"] =\n      \"/\" + vars[\"ServicePrefix\"] + vars[\"Service\"] + \"/\" + vars[\"Method\"];\n  vars[\"Handler\"] = \"_\" + vars[\"Service\"] + \"_\" + vars[\"Method\"] + \"_Handler\";\n  if (method->NoStreaming()) {\n    printer->Print(\n        vars,\n        \"func $Handler$(srv interface{}, ctx $context$.Context,\\n\\tdec \"\n        \"func(interface{}) error, interceptor $grpc$.UnaryServerInterceptor) \"\n        \"(interface{}, error) {\\n\");\n    printer->Indent();\n    printer->Print(vars, \"in := new($Request$)\\n\");\n    vars[\"Error_Check\"] = \"err := dec(in); err != nil\";\n    GenerateError(printer, vars);\n    printer->Print(\"if interceptor == nil {\\n\");\n    printer->Indent();\n    printer->Print(vars, \"return srv.($Service$Server).$Method$(ctx, in)\\n\");\n    printer->Outdent();\n    printer->Print(\"}\\n\");\n    printer->Print(vars, \"info := &$grpc$.UnaryServerInfo{\\n\");\n    printer->Indent();\n    printer->Print(\"Server:     srv,\\n\");\n    printer->Print(vars, \"FullMethod: \\\"$FullMethodName$\\\",\\n\");\n    printer->Outdent();\n    printer->Print(\"}\\n\");\n    printer->Outdent();\n    printer->Print(\"\\n\");\n    printer->Indent();\n    printer->Print(vars,\n                   \"handler := func(ctx $context$.Context, req interface{}) \"\n                   \"(interface{}, error) {\\n\");\n    printer->Indent();\n    printer->Print(\n        vars, \"return srv.($Service$Server).$Method$(ctx, req.(*$Request$))\\n\");\n    printer->Outdent();\n    printer->Print(\"}\\n\");\n    printer->Print(\"return interceptor(ctx, in, info, handler)\\n\");\n    printer->Outdent();\n    printer->Print(\"}\\n\");\n    return;\n  }\n  vars[\"StreamType\"] = vars[\"ServiceUnexported\"] + vars[\"Method\"] + \"Server\";\n  printer->Print(\n      vars,\n      \"func $Handler$(srv interface{}, stream $grpc$.ServerStream) error {\\n\");\n  printer->Indent();\n  if (ServerOnlyStreaming(method)) {\n    printer->Print(vars, \"m := new($Request$)\\n\");\n    vars[\"Error_Check\"] = \"err := stream.RecvMsg(m); err != nil\";\n    GenerateError(printer, vars, false);\n    printer->Print(\n        vars,\n        \"return srv.($Service$Server).$Method$(m, &$StreamType${stream})\\n\");\n  } else {\n    printer->Print(\n        vars, \"return srv.($Service$Server).$Method$(&$StreamType${stream})\\n\");\n  }\n  printer->Outdent();\n  printer->Print(\"}\\n\\n\");\n\n  bool genSend = method->BidiStreaming() || ServerOnlyStreaming(method);\n  bool genRecv = method->BidiStreaming() || ClientOnlyStreaming(method);\n  bool genSendAndClose = ClientOnlyStreaming(method);\n\n  printer->Print(vars, \"type $Service$_$Method$Server interface {\\n\");\n  printer->Indent();\n  if (genSend) {\n    printer->Print(vars, \"Send(*$Response$) error\\n\");\n  }\n  if (genRecv) {\n    printer->Print(vars, \"Recv() (*$Request$, error)\\n\");\n  }\n  if (genSendAndClose) {\n    printer->Print(vars, \"SendAndClose(*$Response$) error\\n\");\n  }\n  printer->Print(vars, \"$grpc$.ServerStream\\n\");\n  printer->Outdent();\n  printer->Print(\"}\\n\\n\");\n\n  printer->Print(vars, \"type $StreamType$ struct {\\n\");\n  printer->Indent();\n  printer->Print(vars, \"$grpc$.ServerStream\\n\");\n  printer->Outdent();\n  printer->Print(\"}\\n\\n\");\n\n  if (genSend) {\n    printer->Print(vars,\n                   \"func (x *$StreamType$) Send(m *$Response$) error {\\n\");\n    printer->Indent();\n    printer->Print(\"return x.ServerStream.SendMsg(m)\\n\");\n    printer->Outdent();\n    printer->Print(\"}\\n\\n\");\n  }\n  if (genRecv) {\n    printer->Print(vars,\n                   \"func (x *$StreamType$) Recv() (*$Request$, error) {\\n\");\n    printer->Indent();\n    printer->Print(vars, \"m := new($Request$)\\n\");\n    vars[\"Error_Check\"] = \"err := x.ServerStream.RecvMsg(m); err != nil\";\n    GenerateError(printer, vars);\n    printer->Print(\"return m, nil\\n\");\n    printer->Outdent();\n    printer->Print(\"}\\n\\n\");\n  }\n  if (genSendAndClose) {\n    printer->Print(\n        vars, \"func (x *$StreamType$) SendAndClose(m *$Response$) error {\\n\");\n    printer->Indent();\n    printer->Print(\"return x.ServerStream.SendMsg(m)\\n\");\n    printer->Outdent();\n    printer->Print(\"}\\n\\n\");\n  }\n}\n\n// Generates Client method signature source\nstatic void GenerateClientMethodSignature(\n    const grpc_generator::Method* method, grpc_generator::Printer* printer,\n    std::map<grpc::string, grpc::string> vars) {\n  vars[\"Method\"] = exportName(method->name());\n  vars[\"Request\"] =\n      \", in *\" + ((vars[\"CustomMethodIO\"] == \"\") ? method->get_input_type_name()\n                                                 : vars[\"CustomMethodIO\"]);\n  if (ClientOnlyStreaming(method) || method->BidiStreaming()) {\n    vars[\"Request\"] = \"\";\n  }\n  vars[\"Response\"] = \"*\" + method->get_output_type_name();\n  if (ClientOnlyStreaming(method) || method->BidiStreaming() ||\n      ServerOnlyStreaming(method)) {\n    vars[\"Response\"] = vars[\"Service\"] + \"_\" + vars[\"Method\"] + \"Client\";\n  }\n  printer->Print(vars,\n                 \"$Method$(ctx $context$.Context$Request$,\\n\\topts \"\n                 \"...$grpc$.CallOption) ($Response$, error)$Ending$\");\n}\n\n// Generates Client method source\nstatic void GenerateClientMethod(const grpc_generator::Method* method,\n                                 grpc_generator::Printer* printer,\n                                 std::map<grpc::string, grpc::string> vars) {\n  printer->Print(vars, \"func (c *$ServiceUnexported$Client) \");\n  vars[\"Ending\"] = \" {\\n\";\n  GenerateClientMethodSignature(method, printer, vars);\n  printer->Indent();\n  vars[\"Method\"] = exportName(method->name());\n  vars[\"Request\"] = (vars[\"CustomMethodIO\"] == \"\")\n                        ? method->get_input_type_name()\n                        : vars[\"CustomMethodIO\"];\n  vars[\"Response\"] = method->get_output_type_name();\n  vars[\"FullMethodName\"] =\n      \"/\" + vars[\"ServicePrefix\"] + vars[\"Service\"] + \"/\" + vars[\"Method\"];\n  if (method->NoStreaming()) {\n    printer->Print(vars, \"out := new($Response$)\\n\");\n    printer->Print(\n        vars,\n        \"err := c.cc.Invoke(ctx, \\\"$FullMethodName$\\\", in, out, opts...)\\n\");\n    vars[\"Error_Check\"] = \"err != nil\";\n    GenerateError(printer, vars);\n    printer->Print(\"return out, nil\\n\");\n    printer->Outdent();\n    printer->Print(\"}\\n\\n\");\n    return;\n  }\n  vars[\"StreamType\"] = vars[\"ServiceUnexported\"] + vars[\"Method\"] + \"Client\";\n  printer->Print(vars,\n                 \"stream, err := c.cc.NewStream(ctx, &$MethodDesc$, \"\n                 \"\\\"$FullMethodName$\\\", opts...)\\n\");\n  vars[\"Error_Check\"] = \"err != nil\";\n  GenerateError(printer, vars);\n\n  printer->Print(vars, \"x := &$StreamType${stream}\\n\");\n  if (ServerOnlyStreaming(method)) {\n    vars[\"Error_Check\"] = \"err := x.ClientStream.SendMsg(in); err != nil\";\n    GenerateError(printer, vars);\n    vars[\"Error_Check\"] = \"err := x.ClientStream.CloseSend(); err != nil\";\n    GenerateError(printer, vars);\n  }\n  printer->Print(\"return x, nil\\n\");\n  printer->Outdent();\n  printer->Print(\"}\\n\\n\");\n\n  bool genSend = method->BidiStreaming() || ClientOnlyStreaming(method);\n  bool genRecv = method->BidiStreaming() || ServerOnlyStreaming(method);\n  bool genCloseAndRecv = ClientOnlyStreaming(method);\n\n  // Stream interface\n  printer->Print(vars, \"type $Service$_$Method$Client interface {\\n\");\n  printer->Indent();\n  if (genSend) {\n    printer->Print(vars, \"Send(*$Request$) error\\n\");\n  }\n  if (genRecv) {\n    printer->Print(vars, \"Recv() (*$Response$, error)\\n\");\n  }\n  if (genCloseAndRecv) {\n    printer->Print(vars, \"CloseAndRecv() (*$Response$, error)\\n\");\n  }\n  printer->Print(vars, \"$grpc$.ClientStream\\n\");\n  printer->Outdent();\n  printer->Print(\"}\\n\\n\");\n\n  // Stream Client\n  printer->Print(vars, \"type $StreamType$ struct {\\n\");\n  printer->Indent();\n  printer->Print(vars, \"$grpc$.ClientStream\\n\");\n  printer->Outdent();\n  printer->Print(\"}\\n\\n\");\n\n  if (genSend) {\n    printer->Print(vars, \"func (x *$StreamType$) Send(m *$Request$) error {\\n\");\n    printer->Indent();\n    printer->Print(\"return x.ClientStream.SendMsg(m)\\n\");\n    printer->Outdent();\n    printer->Print(\"}\\n\\n\");\n  }\n\n  if (genRecv) {\n    printer->Print(vars,\n                   \"func (x *$StreamType$) Recv() (*$Response$, error) {\\n\");\n    printer->Indent();\n    printer->Print(vars, \"m := new($Response$)\\n\");\n    vars[\"Error_Check\"] = \"err := x.ClientStream.RecvMsg(m); err != nil\";\n    GenerateError(printer, vars);\n    printer->Print(\"return m, nil\\n\");\n    printer->Outdent();\n    printer->Print(\"}\\n\\n\");\n  }\n\n  if (genCloseAndRecv) {\n    printer->Print(\n        vars, \"func (x *$StreamType$) CloseAndRecv() (*$Response$, error) {\\n\");\n    printer->Indent();\n    vars[\"Error_Check\"] = \"err := x.ClientStream.CloseSend(); err != nil\";\n    GenerateError(printer, vars);\n    printer->Print(vars, \"m := new($Response$)\\n\");\n    vars[\"Error_Check\"] = \"err := x.ClientStream.RecvMsg(m); err != nil\";\n    GenerateError(printer, vars);\n    printer->Print(\"return m, nil\\n\");\n    printer->Outdent();\n    printer->Print(\"}\\n\\n\");\n  }\n}\n\n// Generates client API for the service\nvoid GenerateService(const grpc_generator::Service* service,\n                     grpc_generator::Printer* printer,\n                     std::map<grpc::string, grpc::string> vars) {\n  vars[\"Service\"] = exportName(service->name());\n  // Client Interface\n  printer->Print(vars, \"// Client API for $Service$ service\\n\");\n  printer->Print(vars, \"type $Service$Client interface {\\n\");\n  printer->Indent();\n  vars[\"Ending\"] = \"\\n\";\n  for (int i = 0; i < service->method_count(); i++) {\n    GenerateClientMethodSignature(service->method(i).get(), printer, vars);\n  }\n  printer->Outdent();\n  printer->Print(\"}\\n\\n\");\n\n  // Client structure\n  vars[\"ServiceUnexported\"] = unexportName(vars[\"Service\"]);\n  printer->Print(vars, \"type $ServiceUnexported$Client struct {\\n\");\n  printer->Indent();\n  printer->Print(vars, \"cc $grpc$.ClientConnInterface\\n\");\n  printer->Outdent();\n  printer->Print(\"}\\n\\n\");\n\n  // NewClient\n  printer->Print(vars,\n                 \"func New$Service$Client(cc $grpc$.ClientConnInterface) \"\n                 \"$Service$Client {\\n\");\n  printer->Indent();\n  printer->Print(vars, \"return &$ServiceUnexported$Client{cc}\");\n  printer->Outdent();\n  printer->Print(\"\\n}\\n\\n\");\n\n  int unary_methods = 0, streaming_methods = 0;\n  vars[\"ServiceDesc\"] = \"_\" + vars[\"Service\"] + \"_serviceDesc\";\n  for (int i = 0; i < service->method_count(); i++) {\n    auto method = service->method(i);\n    if (method->NoStreaming()) {\n      vars[\"MethodDesc\"] =\n          vars[\"ServiceDesc\"] + \".Method[\" + as_string(unary_methods) + \"]\";\n      unary_methods++;\n    } else {\n      vars[\"MethodDesc\"] = vars[\"ServiceDesc\"] + \".Streams[\" +\n                           as_string(streaming_methods) + \"]\";\n      streaming_methods++;\n    }\n    GenerateClientMethod(method.get(), printer, vars);\n  }\n\n  // Server Interface\n  printer->Print(vars, \"// Server API for $Service$ service\\n\");\n  printer->Print(vars, \"type $Service$Server interface {\\n\");\n  printer->Indent();\n  vars[\"Ending\"] = \"\\n\";\n  for (int i = 0; i < service->method_count(); i++) {\n    GenerateServerMethodSignature(service->method(i).get(), printer, vars);\n  }\n  printer->Print(vars, \"mustEmbedUnimplemented$Service$Server()\\n\");\n  printer->Outdent();\n  printer->Print(\"}\\n\\n\");\n\n  printer->Print(vars, \"type Unimplemented$Service$Server struct {\\n\");\n  printer->Print(\"}\\n\\n\");\n\n  vars[\"Ending\"] = \" {\\n\";\n  for (int i = 0; i < service->method_count(); i++) {\n    auto method = service->method(i);\n    vars[\"Method\"] = exportName(method->name());\n    vars[\"Nil\"] = method->NoStreaming() ? \"nil, \" : \"\";\n    printer->Print(vars, \"func (Unimplemented$Service$Server) \");\n    GenerateServerMethodSignature(method.get(), printer, vars);\n    printer->Indent();\n    printer->Print(vars,\n                   \"return $Nil$status.Errorf(codes.Unimplemented, \\\"method \"\n                   \"$Method$ not implemented\\\")\\n\");\n    printer->Outdent();\n    printer->Print(\"}\\n\");\n    printer->Print(\"\\n\");\n  }\n\n  printer->Print(vars,\n                 \"func (Unimplemented$Service$Server) \"\n                 \"mustEmbedUnimplemented$Service$Server() {}\");\n  printer->Print(\"\\n\\n\");\n\n  printer->Print(vars, \"type Unsafe$Service$Server interface {\\n\");\n  printer->Indent();\n  printer->Print(vars, \"mustEmbedUnimplemented$Service$Server()\\n\");\n  printer->Outdent();\n  printer->Print(\"}\\n\\n\");\n  // Server registration.\n  printer->Print(vars,\n                 \"func Register$Service$Server(s $grpc$.ServiceRegistrar, srv \"\n                 \"$Service$Server) {\\n\");\n  printer->Indent();\n  printer->Print(vars, \"s.RegisterService(&$ServiceDesc$, srv)\\n\");\n  printer->Outdent();\n  printer->Print(\"}\\n\\n\");\n\n  for (int i = 0; i < service->method_count(); i++) {\n    GenerateServerMethod(service->method(i).get(), printer, vars);\n  }\n\n  // Service Descriptor\n  printer->Print(vars, \"var $ServiceDesc$ = $grpc$.ServiceDesc{\\n\");\n  printer->Indent();\n  printer->Print(vars, \"ServiceName: \\\"$ServicePrefix$$Service$\\\",\\n\");\n  printer->Print(vars, \"HandlerType: (*$Service$Server)(nil),\\n\");\n  printer->Print(vars, \"Methods: []$grpc$.MethodDesc{\\n\");\n  printer->Indent();\n  for (int i = 0; i < service->method_count(); i++) {\n    auto method = service->method(i);\n    vars[\"Method\"] = exportName(method->name());\n    vars[\"Handler\"] = \"_\" + vars[\"Service\"] + \"_\" + vars[\"Method\"] + \"_Handler\";\n    if (method->NoStreaming()) {\n      printer->Print(\"{\\n\");\n      printer->Indent();\n      printer->Print(vars, \"MethodName: \\\"$Method$\\\",\\n\");\n      printer->Print(vars, \"Handler:    $Handler$,\\n\");\n      printer->Outdent();\n      printer->Print(\"},\\n\");\n    }\n  }\n  printer->Outdent();\n  printer->Print(\"},\\n\");\n  printer->Print(vars, \"Streams: []$grpc$.StreamDesc{\\n\");\n  printer->Indent();\n  for (int i = 0; i < service->method_count(); i++) {\n    auto method = service->method(i);\n    vars[\"Method\"] = exportName(method->name());\n    vars[\"Handler\"] = \"_\" + vars[\"Service\"] + \"_\" + vars[\"Method\"] + \"_Handler\";\n    if (!method->NoStreaming()) {\n      printer->Print(\"{\\n\");\n      printer->Indent();\n      printer->Print(vars, \"StreamName:    \\\"$Method$\\\",\\n\");\n      printer->Print(vars, \"Handler:       $Handler$,\\n\");\n      if (ClientOnlyStreaming(method.get())) {\n        printer->Print(\"ClientStreams: true,\\n\");\n      } else if (ServerOnlyStreaming(method.get())) {\n        printer->Print(\"ServerStreams: true,\\n\");\n      } else {\n        printer->Print(\"ServerStreams: true,\\n\");\n        printer->Print(\"ClientStreams: true,\\n\");\n      }\n      printer->Outdent();\n      printer->Print(\"},\\n\");\n    }\n  }\n  printer->Outdent();\n  printer->Print(\"},\\n\");\n  printer->Outdent();\n  printer->Print(\"}\\n\");\n}\n}  // namespace\n\n// Returns source for the service\ngrpc::string GenerateServiceSource(grpc_generator::File* file,\n                                   const grpc_generator::Service* service,\n                                   grpc_go_generator::Parameters* parameters) {\n  grpc::string out;\n  auto p = file->CreatePrinter(&out, '\\t');\n  p->SetIndentationSize(1);\n  auto printer = p.get();\n  std::map<grpc::string, grpc::string> vars;\n  vars[\"Package\"] = parameters->package_name;\n  vars[\"ServicePrefix\"] = parameters->service_prefix;\n  if (!parameters->service_prefix.empty()) vars[\"ServicePrefix\"].append(\".\");\n  vars[\"grpc\"] = \"grpc\";\n  vars[\"context\"] = \"context\";\n  GenerateImports(file, printer, vars);\n  if (parameters->custom_method_io_type != \"\") {\n    vars[\"CustomMethodIO\"] = parameters->custom_method_io_type;\n  }\n  GenerateService(service, printer, vars);\n  return out;\n}\n}  // Namespace grpc_go_generator\n"
  },
  {
    "path": "grpc/src/compiler/go_generator.h",
    "content": "#ifndef GRPC_INTERNAL_COMPILER_GO_GENERATOR_H\n#define GRPC_INTERNAL_COMPILER_GO_GENERATOR_H\n\n// go generator is used to generate GRPC code for serialization system, such as\n// flatbuffers\n#include <memory>\n#include <vector>\n\n#include \"src/compiler/schema_interface.h\"\n\nnamespace grpc_go_generator {\n\nstruct Parameters {\n  // Defines the custom parameter types for methods\n  // eg: flatbuffers uses flatbuffers.Builder as input for the client and output\n  // for the server\n  grpc::string custom_method_io_type;\n\n  // Package name for the service\n  grpc::string package_name;\n\n  // Prefix for RPC Calls\n  grpc::string service_prefix;\n};\n\n// Return the source of the generated service file.\ngrpc::string GenerateServiceSource(grpc_generator::File* file,\n                                   const grpc_generator::Service* service,\n                                   grpc_go_generator::Parameters* parameters);\n\n}  // namespace grpc_go_generator\n\n#endif  // GRPC_INTERNAL_COMPILER_GO_GENERATOR_H\n"
  },
  {
    "path": "grpc/src/compiler/java_generator.cc",
    "content": "/*\n * Copyright 2016 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"src/compiler/java_generator.h\"\n\n#include <algorithm>\n#include <iostream>\n#include <iterator>\n#include <map>\n#include <utility>\n#include <vector>\n\n#include \"flatbuffers/util.h\"\n#define to_string flatbuffers::NumToString\n\n// Stringify helpers used solely to cast GRPC_VERSION\n#ifndef STR\n#define STR(s) #s\n#endif\n\n#ifndef XSTR\n#define XSTR(s) STR(s)\n#endif\n\ntypedef grpc_generator::Printer Printer;\ntypedef std::map<grpc::string, grpc::string> VARS;\ntypedef grpc_generator::Service ServiceDescriptor;\ntypedef grpc_generator::CommentHolder\n    DescriptorType;  // base class of all 'descriptors'\ntypedef grpc_generator::Method MethodDescriptor;\n\nnamespace grpc_java_generator {\ntypedef std::string string;\nnamespace {\n// Generates imports for the service\nstatic void GenerateImports(grpc_generator::File* file,\n                            grpc_generator::Printer* printer, VARS& vars) {\n  vars[\"filename\"] = file->filename();\n  printer->Print(vars,\n                 \"//Generated by flatc compiler (version $flatc_version$)\\n\");\n  printer->Print(\"//If you make any local changes, they will be lost\\n\");\n  printer->Print(vars, \"//source: $filename$.fbs\\n\\n\");\n  printer->Print(vars, \"package $Package$;\\n\\n\");\n  vars[\"Package\"] = vars[\"Package\"] + \".\";\n  if (!file->additional_headers().empty()) {\n    printer->Print(file->additional_headers().c_str());\n    printer->Print(\"\\n\\n\");\n  }\n}\n\n// Adjust a method name prefix identifier to follow the JavaBean spec:\n//   - decapitalize the first letter\n//   - remove embedded underscores & capitalize the following letter\nstatic string MixedLower(const string& word) {\n  string w;\n  w += static_cast<string::value_type>(tolower(word[0]));\n  bool after_underscore = false;\n  for (size_t i = 1; i < word.length(); ++i) {\n    if (word[i] == '_') {\n      after_underscore = true;\n    } else {\n      w += after_underscore ? static_cast<string::value_type>(toupper(word[i]))\n                            : word[i];\n      after_underscore = false;\n    }\n  }\n  return w;\n}\n\n// Converts to the identifier to the ALL_UPPER_CASE format.\n//   - An underscore is inserted where a lower case letter is followed by an\n//     upper case letter.\n//   - All letters are converted to upper case\nstatic string ToAllUpperCase(const string& word) {\n  string w;\n  for (size_t i = 0; i < word.length(); ++i) {\n    w += static_cast<string::value_type>(toupper(word[i]));\n    if ((i < word.length() - 1) && islower(word[i]) && isupper(word[i + 1])) {\n      w += '_';\n    }\n  }\n  return w;\n}\n\nstatic inline string LowerMethodName(const MethodDescriptor* method) {\n  return MixedLower(method->name());\n}\n\nstatic inline string MethodPropertiesFieldName(const MethodDescriptor* method) {\n  return \"METHOD_\" + ToAllUpperCase(method->name());\n}\n\nstatic inline string MethodPropertiesGetterName(\n    const MethodDescriptor* method) {\n  return MixedLower(\"get_\" + method->name() + \"_method\");\n}\n\nstatic inline string MethodIdFieldName(const MethodDescriptor* method) {\n  return \"METHODID_\" + ToAllUpperCase(method->name());\n}\n\nstatic inline string JavaClassName(VARS& vars, const string& name) {\n  // string name = google::protobuf::compiler::java::ClassName(desc);\n  return vars[\"Package\"] + name;\n}\n\nstatic inline string ServiceClassName(const string& service_name) {\n  return service_name + \"Grpc\";\n}\n\n// TODO(nmittler): Remove once protobuf includes javadoc methods in\n// distribution.\ntemplate <typename ITR>\nstatic void GrpcSplitStringToIteratorUsing(const string& full,\n                                           const char* delim, ITR& result) {\n  // Optimize the common case where delim is a single character.\n  if (delim[0] != '\\0' && delim[1] == '\\0') {\n    char c = delim[0];\n    const char* p = full.data();\n    const char* end = p + full.size();\n    while (p != end) {\n      if (*p == c) {\n        ++p;\n      } else {\n        const char* start = p;\n        while (++p != end && *p != c);\n        *result++ = string(start, p - start);\n      }\n    }\n    return;\n  }\n\n  string::size_type begin_index, end_index;\n  begin_index = full.find_first_not_of(delim);\n  while (begin_index != string::npos) {\n    end_index = full.find_first_of(delim, begin_index);\n    if (end_index == string::npos) {\n      *result++ = full.substr(begin_index);\n      return;\n    }\n    *result++ = full.substr(begin_index, (end_index - begin_index));\n    begin_index = full.find_first_not_of(delim, end_index);\n  }\n}\n\nstatic void GrpcSplitStringUsing(const string& full, const char* delim,\n                                 std::vector<string>* result) {\n  std::back_insert_iterator<std::vector<string>> it(*result);\n  GrpcSplitStringToIteratorUsing(full, delim, it);\n}\n\nstatic std::vector<string> GrpcSplit(const string& full, const char* delim) {\n  std::vector<string> result;\n  GrpcSplitStringUsing(full, delim, &result);\n  return result;\n}\n\n// TODO(nmittler): Remove once protobuf includes javadoc methods in\n// distribution.\nstatic string GrpcEscapeJavadoc(const string& input) {\n  string result;\n  result.reserve(input.size() * 2);\n\n  char prev = '*';\n\n  for (string::size_type i = 0; i < input.size(); i++) {\n    char c = input[i];\n    switch (c) {\n      case '*':\n        // Avoid \"/*\".\n        if (prev == '/') {\n          result.append(\"&#42;\");\n        } else {\n          result.push_back(c);\n        }\n        break;\n      case '/':\n        // Avoid \"*/\".\n        if (prev == '*') {\n          result.append(\"&#47;\");\n        } else {\n          result.push_back(c);\n        }\n        break;\n      case '@':\n        // '@' starts javadoc tags including the @deprecated tag, which will\n        // cause a compile-time error if inserted before a declaration that\n        // does not have a corresponding @Deprecated annotation.\n        result.append(\"&#64;\");\n        break;\n      case '<':\n        // Avoid interpretation as HTML.\n        result.append(\"&lt;\");\n        break;\n      case '>':\n        // Avoid interpretation as HTML.\n        result.append(\"&gt;\");\n        break;\n      case '&':\n        // Avoid interpretation as HTML.\n        result.append(\"&amp;\");\n        break;\n      case '\\\\':\n        // Java interprets Unicode escape sequences anywhere!\n        result.append(\"&#92;\");\n        break;\n      default:\n        result.push_back(c);\n        break;\n    }\n\n    prev = c;\n  }\n\n  return result;\n}\n\nstatic std::vector<string> GrpcGetDocLines(const string& comments) {\n  if (!comments.empty()) {\n    // TODO(kenton):  Ideally we should parse the comment text as Markdown and\n    //   write it back as HTML, but this requires a Markdown parser.  For now\n    //   we just use <pre> to get fixed-width text formatting.\n\n    // If the comment itself contains block comment start or end markers,\n    // HTML-escape them so that they don't accidentally close the doc comment.\n    string escapedComments = GrpcEscapeJavadoc(comments);\n\n    std::vector<string> lines = GrpcSplit(escapedComments, \"\\n\");\n    while (!lines.empty() && lines.back().empty()) {\n      lines.pop_back();\n    }\n    return lines;\n  }\n  return std::vector<string>();\n}\n\nstatic std::vector<string> GrpcGetDocLinesForDescriptor(\n    const DescriptorType* descriptor) {\n  return descriptor->GetAllComments();\n  // return GrpcGetDocLines(descriptor->GetLeadingComments(\"///\"));\n}\n\nstatic void GrpcWriteDocCommentBody(Printer* printer, VARS& vars,\n                                    const std::vector<string>& lines,\n                                    bool surroundWithPreTag) {\n  if (!lines.empty()) {\n    if (surroundWithPreTag) {\n      printer->Print(\" * <pre>\\n\");\n    }\n\n    for (size_t i = 0; i < lines.size(); i++) {\n      // Most lines should start with a space.  Watch out for lines that start\n      // with a /, since putting that right after the leading asterisk will\n      // close the comment.\n      vars[\"line\"] = lines[i];\n      if (!lines[i].empty() && lines[i][0] == '/') {\n        printer->Print(vars, \" * $line$\\n\");\n      } else {\n        printer->Print(vars, \" *$line$\\n\");\n      }\n    }\n\n    if (surroundWithPreTag) {\n      printer->Print(\" * </pre>\\n\");\n    }\n  }\n}\n\nstatic void GrpcWriteDocComment(Printer* printer, VARS& vars,\n                                const string& comments) {\n  printer->Print(\"/**\\n\");\n  std::vector<string> lines = GrpcGetDocLines(comments);\n  GrpcWriteDocCommentBody(printer, vars, lines, false);\n  printer->Print(\" */\\n\");\n}\n\nstatic void GrpcWriteServiceDocComment(Printer* printer, VARS& vars,\n                                       const ServiceDescriptor* service) {\n  printer->Print(\"/**\\n\");\n  std::vector<string> lines = GrpcGetDocLinesForDescriptor(service);\n  GrpcWriteDocCommentBody(printer, vars, lines, true);\n  printer->Print(\" */\\n\");\n}\n\nstatic void GrpcWriteMethodDocComment(Printer* printer, VARS& vars,\n                                      const MethodDescriptor* method) {\n  printer->Print(\"/**\\n\");\n  std::vector<string> lines = GrpcGetDocLinesForDescriptor(method);\n  GrpcWriteDocCommentBody(printer, vars, lines, true);\n  printer->Print(\" */\\n\");\n}\n\n// outputs static singleton extractor for type stored in \"extr_type\" and\n// \"extr_type_name\" vars\nstatic void PrintTypeExtractor(Printer* p, VARS& vars) {\n  p->Print(vars,\n           \"private static volatile FlatbuffersUtils.FBExtactor<$extr_type$> \"\n           \"extractorOf$extr_type_name$;\\n\"\n           \"private static FlatbuffersUtils.FBExtactor<$extr_type$> \"\n           \"getExtractorOf$extr_type_name$() {\\n\"\n           \"    if (extractorOf$extr_type_name$ != null) return \"\n           \"extractorOf$extr_type_name$;\\n\"\n           \"    synchronized ($service_class_name$.class) {\\n\"\n           \"        if (extractorOf$extr_type_name$ != null) return \"\n           \"extractorOf$extr_type_name$;\\n\"\n           \"        extractorOf$extr_type_name$ = new \"\n           \"FlatbuffersUtils.FBExtactor<$extr_type$>() {\\n\"\n           \"            public $extr_type$ extract (ByteBuffer buffer) {\\n\"\n           \"                return \"\n           \"$extr_type$.getRootAs$extr_type_name$(buffer);\\n\"\n           \"            }\\n\"\n           \"        };\\n\"\n           \"        return extractorOf$extr_type_name$;\\n\"\n           \"    }\\n\"\n           \"}\\n\\n\");\n}\nstatic void PrintMethodFields(Printer* p, VARS& vars,\n                              const ServiceDescriptor* service) {\n  p->Print(\"// Static method descriptors that strictly reflect the proto.\\n\");\n  vars[\"service_name\"] = service->name();\n\n  // set of names of rpc input- and output- types that were already encountered.\n  // this is needed to avoid duplicating type extractor since it's possible that\n  // the same type is used as an input or output type of more than a single RPC\n  // method\n  std::set<std::string> encounteredTypes;\n\n  for (int i = 0; i < service->method_count(); ++i) {\n    auto method = service->method(i);\n    vars[\"arg_in_id\"] = to_string(2L * i);  // trying to make msvc 10 happy\n    vars[\"arg_out_id\"] = to_string(2L * i + 1);\n    vars[\"method_name\"] = method->name();\n    vars[\"input_type_name\"] = method->get_input_type_name();\n    vars[\"output_type_name\"] = method->get_output_type_name();\n    vars[\"input_type\"] = JavaClassName(vars, method->get_input_type_name());\n    vars[\"output_type\"] = JavaClassName(vars, method->get_output_type_name());\n    vars[\"method_field_name\"] = MethodPropertiesFieldName(method.get());\n    vars[\"method_new_field_name\"] = MethodPropertiesGetterName(method.get());\n    vars[\"method_method_name\"] = MethodPropertiesGetterName(method.get());\n    bool client_streaming =\n        method->ClientStreaming() || method->BidiStreaming();\n    bool server_streaming =\n        method->ServerStreaming() || method->BidiStreaming();\n    if (client_streaming) {\n      if (server_streaming) {\n        vars[\"method_type\"] = \"BIDI_STREAMING\";\n      } else {\n        vars[\"method_type\"] = \"CLIENT_STREAMING\";\n      }\n    } else {\n      if (server_streaming) {\n        vars[\"method_type\"] = \"SERVER_STREAMING\";\n      } else {\n        vars[\"method_type\"] = \"UNARY\";\n      }\n    }\n\n    p->Print(\n        vars,\n        \"@$ExperimentalApi$(\\\"https://github.com/grpc/grpc-java/issues/\"\n        \"1901\\\")\\n\"\n        \"@$Deprecated$ // Use {@link #$method_method_name$()} instead. \\n\"\n        \"public static final $MethodDescriptor$<$input_type$,\\n\"\n        \"    $output_type$> $method_field_name$ = $method_method_name$();\\n\"\n        \"\\n\"\n        \"private static volatile $MethodDescriptor$<$input_type$,\\n\"\n        \"    $output_type$> $method_new_field_name$;\\n\"\n        \"\\n\");\n\n    if (encounteredTypes.insert(vars[\"input_type_name\"]).second) {\n      vars[\"extr_type\"] = vars[\"input_type\"];\n      vars[\"extr_type_name\"] = vars[\"input_type_name\"];\n      PrintTypeExtractor(p, vars);\n    }\n\n    if (encounteredTypes.insert(vars[\"output_type_name\"]).second) {\n      vars[\"extr_type\"] = vars[\"output_type\"];\n      vars[\"extr_type_name\"] = vars[\"output_type_name\"];\n      PrintTypeExtractor(p, vars);\n    }\n\n    p->Print(\n        vars,\n        \"@$ExperimentalApi$(\\\"https://github.com/grpc/grpc-java/issues/\"\n        \"1901\\\")\\n\"\n        \"public static $MethodDescriptor$<$input_type$,\\n\"\n        \"    $output_type$> $method_method_name$() {\\n\"\n        \"  $MethodDescriptor$<$input_type$, $output_type$> \"\n        \"$method_new_field_name$;\\n\"\n        \"  if (($method_new_field_name$ = \"\n        \"$service_class_name$.$method_new_field_name$) == null) {\\n\"\n        \"    synchronized ($service_class_name$.class) {\\n\"\n        \"      if (($method_new_field_name$ = \"\n        \"$service_class_name$.$method_new_field_name$) == null) {\\n\"\n        \"        $service_class_name$.$method_new_field_name$ = \"\n        \"$method_new_field_name$ = \\n\"\n        \"            $MethodDescriptor$.<$input_type$, \"\n        \"$output_type$>newBuilder()\\n\"\n        \"            .setType($MethodType$.$method_type$)\\n\"\n        \"            .setFullMethodName(generateFullMethodName(\\n\"\n        \"                \\\"$Package$$service_name$\\\", \\\"$method_name$\\\"))\\n\"\n        \"            .setSampledToLocalTracing(true)\\n\"\n        \"            .setRequestMarshaller(FlatbuffersUtils.marshaller(\\n\"\n        \"                $input_type$.class, \"\n        \"getExtractorOf$input_type_name$()))\\n\"\n        \"            .setResponseMarshaller(FlatbuffersUtils.marshaller(\\n\"\n        \"                $output_type$.class, \"\n        \"getExtractorOf$output_type_name$()))\\n\");\n\n    //            vars[\"proto_method_descriptor_supplier\"] = service->name() +\n    //            \"MethodDescriptorSupplier\";\n    p->Print(vars, \"                .setSchemaDescriptor(null)\\n\");\n    //\"                .setSchemaDescriptor(new\n    //$proto_method_descriptor_supplier$(\\\"$method_name$\\\"))\\n\");\n\n    p->Print(vars, \"                .build();\\n\");\n    p->Print(vars,\n             \"        }\\n\"\n             \"      }\\n\"\n             \"   }\\n\"\n             \"   return $method_new_field_name$;\\n\"\n             \"}\\n\");\n\n    p->Print(\"\\n\");\n  }\n}\nenum StubType {\n  ASYNC_INTERFACE = 0,\n  BLOCKING_CLIENT_INTERFACE = 1,\n  FUTURE_CLIENT_INTERFACE = 2,\n  BLOCKING_SERVER_INTERFACE = 3,\n  ASYNC_CLIENT_IMPL = 4,\n  BLOCKING_CLIENT_IMPL = 5,\n  FUTURE_CLIENT_IMPL = 6,\n  ABSTRACT_CLASS = 7,\n};\n\nenum CallType { ASYNC_CALL = 0, BLOCKING_CALL = 1, FUTURE_CALL = 2 };\n\nstatic void PrintBindServiceMethodBody(Printer* p, VARS& vars,\n                                       const ServiceDescriptor* service);\n\n// Prints a client interface or implementation class, or a server interface.\nstatic void PrintStub(Printer* p, VARS& vars, const ServiceDescriptor* service,\n                      StubType type) {\n  const string service_name = service->name();\n  vars[\"service_name\"] = service_name;\n  vars[\"abstract_name\"] = service_name + \"ImplBase\";\n  string stub_name = service_name;\n  string client_name = service_name;\n  CallType call_type = ASYNC_CALL;\n  bool impl_base = false;\n  bool interface = false;\n  switch (type) {\n    case ABSTRACT_CLASS:\n      call_type = ASYNC_CALL;\n      impl_base = true;\n      break;\n    case ASYNC_CLIENT_IMPL:\n      call_type = ASYNC_CALL;\n      stub_name += \"Stub\";\n      break;\n    case BLOCKING_CLIENT_INTERFACE:\n      interface = true;\n      FLATBUFFERS_FALLTHROUGH();  // fall thru\n    case BLOCKING_CLIENT_IMPL:\n      call_type = BLOCKING_CALL;\n      stub_name += \"BlockingStub\";\n      client_name += \"BlockingClient\";\n      break;\n    case FUTURE_CLIENT_INTERFACE:\n      interface = true;\n      FLATBUFFERS_FALLTHROUGH();  // fall thru\n    case FUTURE_CLIENT_IMPL:\n      call_type = FUTURE_CALL;\n      stub_name += \"FutureStub\";\n      client_name += \"FutureClient\";\n      break;\n    case ASYNC_INTERFACE:\n      call_type = ASYNC_CALL;\n      interface = true;\n      break;\n    default:\n      GRPC_CODEGEN_FAIL << \"Cannot determine class name for StubType: \" << type;\n  }\n  vars[\"stub_name\"] = stub_name;\n  vars[\"client_name\"] = client_name;\n\n  // Class head\n  if (!interface) {\n    GrpcWriteServiceDocComment(p, vars, service);\n  }\n  if (impl_base) {\n    p->Print(vars,\n             \"public static abstract class $abstract_name$ implements \"\n             \"$BindableService$ {\\n\");\n  } else {\n    p->Print(vars,\n             \"public static final class $stub_name$ extends \"\n             \"$AbstractStub$<$stub_name$> {\\n\");\n  }\n  p->Indent();\n\n  // Constructor and build() method\n  if (!impl_base && !interface) {\n    p->Print(vars, \"private $stub_name$($Channel$ channel) {\\n\");\n    p->Indent();\n    p->Print(\"super(channel);\\n\");\n    p->Outdent();\n    p->Print(\"}\\n\\n\");\n    p->Print(vars,\n             \"private $stub_name$($Channel$ channel,\\n\"\n             \"    $CallOptions$ callOptions) {\\n\");\n    p->Indent();\n    p->Print(\"super(channel, callOptions);\\n\");\n    p->Outdent();\n    p->Print(\"}\\n\\n\");\n    p->Print(vars,\n             \"@$Override$\\n\"\n             \"protected $stub_name$ build($Channel$ channel,\\n\"\n             \"    $CallOptions$ callOptions) {\\n\");\n    p->Indent();\n    p->Print(vars, \"return new $stub_name$(channel, callOptions);\\n\");\n    p->Outdent();\n    p->Print(\"}\\n\");\n  }\n\n  // RPC methods\n  for (int i = 0; i < service->method_count(); ++i) {\n    auto method = service->method(i);\n    vars[\"input_type\"] = JavaClassName(vars, method->get_input_type_name());\n    vars[\"output_type\"] = JavaClassName(vars, method->get_output_type_name());\n    vars[\"lower_method_name\"] = LowerMethodName(&*method);\n    vars[\"method_method_name\"] = MethodPropertiesGetterName(&*method);\n    bool client_streaming =\n        method->ClientStreaming() || method->BidiStreaming();\n    bool server_streaming =\n        method->ServerStreaming() || method->BidiStreaming();\n\n    if (call_type == BLOCKING_CALL && client_streaming) {\n      // Blocking client interface with client streaming is not available\n      continue;\n    }\n\n    if (call_type == FUTURE_CALL && (client_streaming || server_streaming)) {\n      // Future interface doesn't support streaming.\n      continue;\n    }\n\n    // Method signature\n    p->Print(\"\\n\");\n    // TODO(nmittler): Replace with WriteMethodDocComment once included by the\n    // protobuf distro.\n    if (!interface) {\n      GrpcWriteMethodDocComment(p, vars, &*method);\n    }\n    p->Print(\"public \");\n    switch (call_type) {\n      case BLOCKING_CALL:\n        GRPC_CODEGEN_CHECK(!client_streaming)\n            << \"Blocking client interface with client streaming is unavailable\";\n        if (server_streaming) {\n          // Server streaming\n          p->Print(vars,\n                   \"$Iterator$<$output_type$> $lower_method_name$(\\n\"\n                   \"    $input_type$ request)\");\n        } else {\n          // Simple RPC\n          p->Print(vars,\n                   \"$output_type$ $lower_method_name$($input_type$ request)\");\n        }\n        break;\n      case ASYNC_CALL:\n        if (client_streaming) {\n          // Bidirectional streaming or client streaming\n          p->Print(vars,\n                   \"$StreamObserver$<$input_type$> $lower_method_name$(\\n\"\n                   \"    $StreamObserver$<$output_type$> responseObserver)\");\n        } else {\n          // Server streaming or simple RPC\n          p->Print(vars,\n                   \"void $lower_method_name$($input_type$ request,\\n\"\n                   \"    $StreamObserver$<$output_type$> responseObserver)\");\n        }\n        break;\n      case FUTURE_CALL:\n        GRPC_CODEGEN_CHECK(!client_streaming && !server_streaming)\n            << \"Future interface doesn't support streaming. \"\n            << \"client_streaming=\" << client_streaming << \", \"\n            << \"server_streaming=\" << server_streaming;\n        p->Print(vars,\n                 \"$ListenableFuture$<$output_type$> $lower_method_name$(\\n\"\n                 \"    $input_type$ request)\");\n        break;\n    }\n\n    if (interface) {\n      p->Print(\";\\n\");\n      continue;\n    }\n    // Method body.\n    p->Print(\" {\\n\");\n    p->Indent();\n    if (impl_base) {\n      switch (call_type) {\n          // NB: Skipping validation of service methods. If something is wrong,\n          // we wouldn't get to this point as compiler would return errors when\n          // generating service interface.\n        case ASYNC_CALL:\n          if (client_streaming) {\n            p->Print(vars,\n                     \"return \"\n                     \"asyncUnimplementedStreamingCall($method_method_name$(), \"\n                     \"responseObserver);\\n\");\n          } else {\n            p->Print(vars,\n                     \"asyncUnimplementedUnaryCall($method_method_name$(), \"\n                     \"responseObserver);\\n\");\n          }\n          break;\n        default:\n          break;\n      }\n    } else if (!interface) {\n      switch (call_type) {\n        case BLOCKING_CALL:\n          GRPC_CODEGEN_CHECK(!client_streaming)\n              << \"Blocking client streaming interface is not available\";\n          if (server_streaming) {\n            vars[\"calls_method\"] = \"blockingServerStreamingCall\";\n            vars[\"params\"] = \"request\";\n          } else {\n            vars[\"calls_method\"] = \"blockingUnaryCall\";\n            vars[\"params\"] = \"request\";\n          }\n          p->Print(vars,\n                   \"return $calls_method$(\\n\"\n                   \"    getChannel(), $method_method_name$(), \"\n                   \"getCallOptions(), $params$);\\n\");\n          break;\n        case ASYNC_CALL:\n          if (server_streaming) {\n            if (client_streaming) {\n              vars[\"calls_method\"] = \"asyncBidiStreamingCall\";\n              vars[\"params\"] = \"responseObserver\";\n            } else {\n              vars[\"calls_method\"] = \"asyncServerStreamingCall\";\n              vars[\"params\"] = \"request, responseObserver\";\n            }\n          } else {\n            if (client_streaming) {\n              vars[\"calls_method\"] = \"asyncClientStreamingCall\";\n              vars[\"params\"] = \"responseObserver\";\n            } else {\n              vars[\"calls_method\"] = \"asyncUnaryCall\";\n              vars[\"params\"] = \"request, responseObserver\";\n            }\n          }\n          vars[\"last_line_prefix\"] = client_streaming ? \"return \" : \"\";\n          p->Print(vars,\n                   \"$last_line_prefix$$calls_method$(\\n\"\n                   \"    getChannel().newCall($method_method_name$(), \"\n                   \"getCallOptions()), $params$);\\n\");\n          break;\n        case FUTURE_CALL:\n          GRPC_CODEGEN_CHECK(!client_streaming && !server_streaming)\n              << \"Future interface doesn't support streaming. \"\n              << \"client_streaming=\" << client_streaming << \", \"\n              << \"server_streaming=\" << server_streaming;\n          vars[\"calls_method\"] = \"futureUnaryCall\";\n          p->Print(vars,\n                   \"return $calls_method$(\\n\"\n                   \"    getChannel().newCall($method_method_name$(), \"\n                   \"getCallOptions()), request);\\n\");\n          break;\n      }\n    }\n    p->Outdent();\n    p->Print(\"}\\n\");\n  }\n\n  if (impl_base) {\n    p->Print(\"\\n\");\n    p->Print(\n        vars,\n        \"@$Override$ public final $ServerServiceDefinition$ bindService() {\\n\");\n    vars[\"instance\"] = \"this\";\n    PrintBindServiceMethodBody(p, vars, service);\n    p->Print(\"}\\n\");\n  }\n\n  p->Outdent();\n  p->Print(\"}\\n\\n\");\n}\n\nstatic bool CompareMethodClientStreaming(\n    const std::unique_ptr<const grpc_generator::Method>& method1,\n    const std::unique_ptr<const grpc_generator::Method>& method2) {\n  return method1->ClientStreaming() < method2->ClientStreaming();\n}\n\n// Place all method invocations into a single class to reduce memory footprint\n// on Android.\nstatic void PrintMethodHandlerClass(Printer* p, VARS& vars,\n                                    const ServiceDescriptor* service) {\n  // Sort method ids based on ClientStreaming() so switch tables are compact.\n  std::vector<std::unique_ptr<const grpc_generator::Method>> sorted_methods(\n      service->method_count());\n  for (int i = 0; i < service->method_count(); ++i) {\n    sorted_methods[i] = service->method(i);\n  }\n  stable_sort(sorted_methods.begin(), sorted_methods.end(),\n              CompareMethodClientStreaming);\n  for (size_t i = 0; i < sorted_methods.size(); i++) {\n    auto& method = sorted_methods[i];\n    vars[\"method_id\"] = to_string(i);\n    vars[\"method_id_name\"] = MethodIdFieldName(&*method);\n    p->Print(vars,\n             \"private static final int $method_id_name$ = $method_id$;\\n\");\n  }\n  p->Print(\"\\n\");\n  vars[\"service_name\"] = service->name() + \"ImplBase\";\n  p->Print(vars,\n           \"private static final class MethodHandlers<Req, Resp> implements\\n\"\n           \"    io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>,\\n\"\n           \"    io.grpc.stub.ServerCalls.ServerStreamingMethod<Req, Resp>,\\n\"\n           \"    io.grpc.stub.ServerCalls.ClientStreamingMethod<Req, Resp>,\\n\"\n           \"    io.grpc.stub.ServerCalls.BidiStreamingMethod<Req, Resp> {\\n\"\n           \"  private final $service_name$ serviceImpl;\\n\"\n           \"  private final int methodId;\\n\"\n           \"\\n\"\n           \"  MethodHandlers($service_name$ serviceImpl, int methodId) {\\n\"\n           \"    this.serviceImpl = serviceImpl;\\n\"\n           \"    this.methodId = methodId;\\n\"\n           \"  }\\n\\n\");\n  p->Indent();\n  p->Print(vars,\n           \"@$Override$\\n\"\n           \"@java.lang.SuppressWarnings(\\\"unchecked\\\")\\n\"\n           \"public void invoke(Req request, $StreamObserver$<Resp> \"\n           \"responseObserver) {\\n\"\n           \"  switch (methodId) {\\n\");\n  p->Indent();\n  p->Indent();\n\n  for (int i = 0; i < service->method_count(); ++i) {\n    auto method = service->method(i);\n    if (method->ClientStreaming() || method->BidiStreaming()) {\n      continue;\n    }\n    vars[\"method_id_name\"] = MethodIdFieldName(&*method);\n    vars[\"lower_method_name\"] = LowerMethodName(&*method);\n    vars[\"input_type\"] = JavaClassName(vars, method->get_input_type_name());\n    vars[\"output_type\"] = JavaClassName(vars, method->get_output_type_name());\n    p->Print(vars,\n             \"case $method_id_name$:\\n\"\n             \"  serviceImpl.$lower_method_name$(($input_type$) request,\\n\"\n             \"      ($StreamObserver$<$output_type$>) responseObserver);\\n\"\n             \"  break;\\n\");\n  }\n  p->Print(\n      \"default:\\n\"\n      \"  throw new AssertionError();\\n\");\n\n  p->Outdent();\n  p->Outdent();\n  p->Print(\n      \"  }\\n\"\n      \"}\\n\\n\");\n\n  p->Print(vars,\n           \"@$Override$\\n\"\n           \"@java.lang.SuppressWarnings(\\\"unchecked\\\")\\n\"\n           \"public $StreamObserver$<Req> invoke(\\n\"\n           \"    $StreamObserver$<Resp> responseObserver) {\\n\"\n           \"  switch (methodId) {\\n\");\n  p->Indent();\n  p->Indent();\n\n  for (int i = 0; i < service->method_count(); ++i) {\n    auto method = service->method(i);\n    if (!(method->ClientStreaming() || method->BidiStreaming())) {\n      continue;\n    }\n    vars[\"method_id_name\"] = MethodIdFieldName(&*method);\n    vars[\"lower_method_name\"] = LowerMethodName(&*method);\n    vars[\"input_type\"] = JavaClassName(vars, method->get_input_type_name());\n    vars[\"output_type\"] = JavaClassName(vars, method->get_output_type_name());\n    p->Print(\n        vars,\n        \"case $method_id_name$:\\n\"\n        \"  return ($StreamObserver$<Req>) serviceImpl.$lower_method_name$(\\n\"\n        \"      ($StreamObserver$<$output_type$>) responseObserver);\\n\");\n  }\n  p->Print(\n      \"default:\\n\"\n      \"  throw new AssertionError();\\n\");\n\n  p->Outdent();\n  p->Outdent();\n  p->Print(\n      \"  }\\n\"\n      \"}\\n\");\n\n  p->Outdent();\n  p->Print(\"}\\n\\n\");\n}\n\nstatic void PrintGetServiceDescriptorMethod(Printer* p, VARS& vars,\n                                            const ServiceDescriptor* service) {\n  vars[\"service_name\"] = service->name();\n  //        vars[\"proto_base_descriptor_supplier\"] = service->name() +\n  //        \"BaseDescriptorSupplier\"; vars[\"proto_file_descriptor_supplier\"] =\n  //        service->name() + \"FileDescriptorSupplier\";\n  //        vars[\"proto_method_descriptor_supplier\"] = service->name() +\n  //        \"MethodDescriptorSupplier\"; vars[\"proto_class_name\"] =\n  //        google::protobuf::compiler::java::ClassName(service->file());\n  //        p->Print(\n  //                 vars,\n  //                 \"private static abstract class\n  //                 $proto_base_descriptor_supplier$\\n\" \"    implements\n  //                 $ProtoFileDescriptorSupplier$,\n  //                 $ProtoServiceDescriptorSupplier$ {\\n\" \"\n  //                 $proto_base_descriptor_supplier$() {}\\n\"\n  //                 \"\\n\"\n  //                 \"  @$Override$\\n\"\n  //                 \"  public com.google.protobuf.Descriptors.FileDescriptor\n  //                 getFileDescriptor() {\\n\" \"    return\n  //                 $proto_class_name$.getDescriptor();\\n\" \"  }\\n\"\n  //                 \"\\n\"\n  //                 \"  @$Override$\\n\"\n  //                 \"  public com.google.protobuf.Descriptors.ServiceDescriptor\n  //                 getServiceDescriptor() {\\n\" \"    return\n  //                 getFileDescriptor().findServiceByName(\\\"$service_name$\\\");\\n\"\n  //                 \"  }\\n\"\n  //                 \"}\\n\"\n  //                 \"\\n\"\n  //                 \"private static final class\n  //                 $proto_file_descriptor_supplier$\\n\" \"    extends\n  //                 $proto_base_descriptor_supplier$ {\\n\" \"\n  //                 $proto_file_descriptor_supplier$() {}\\n\"\n  //                 \"}\\n\"\n  //                 \"\\n\"\n  //                 \"private static final class\n  //                 $proto_method_descriptor_supplier$\\n\" \"    extends\n  //                 $proto_base_descriptor_supplier$\\n\" \"    implements\n  //                 $ProtoMethodDescriptorSupplier$ {\\n\" \"  private final\n  //                 String methodName;\\n\"\n  //                 \"\\n\"\n  //                 \"  $proto_method_descriptor_supplier$(String methodName)\n  //                 {\\n\" \"    this.methodName = methodName;\\n\" \"  }\\n\"\n  //                 \"\\n\"\n  //                 \"  @$Override$\\n\"\n  //                 \"  public com.google.protobuf.Descriptors.MethodDescriptor\n  //                 getMethodDescriptor() {\\n\" \"    return\n  //                 getServiceDescriptor().findMethodByName(methodName);\\n\" \"\n  //                 }\\n\"\n  //                 \"}\\n\\n\");\n\n  p->Print(\n      vars,\n      \"private static volatile $ServiceDescriptor$ serviceDescriptor;\\n\\n\");\n\n  p->Print(vars,\n           \"public static $ServiceDescriptor$ getServiceDescriptor() {\\n\");\n  p->Indent();\n  p->Print(vars, \"$ServiceDescriptor$ result = serviceDescriptor;\\n\");\n  p->Print(\"if (result == null) {\\n\");\n  p->Indent();\n  p->Print(vars, \"synchronized ($service_class_name$.class) {\\n\");\n  p->Indent();\n  p->Print(\"result = serviceDescriptor;\\n\");\n  p->Print(\"if (result == null) {\\n\");\n  p->Indent();\n\n  p->Print(vars,\n           \"serviceDescriptor = result = \"\n           \"$ServiceDescriptor$.newBuilder(SERVICE_NAME)\");\n  p->Indent();\n  p->Indent();\n  p->Print(vars, \"\\n.setSchemaDescriptor(null)\");\n  for (int i = 0; i < service->method_count(); ++i) {\n    auto method = service->method(i);\n    vars[\"method_method_name\"] = MethodPropertiesGetterName(&*method);\n    p->Print(vars, \"\\n.addMethod($method_method_name$())\");\n  }\n  p->Print(\"\\n.build();\\n\");\n  p->Outdent();\n  p->Outdent();\n\n  p->Outdent();\n  p->Print(\"}\\n\");\n  p->Outdent();\n  p->Print(\"}\\n\");\n  p->Outdent();\n  p->Print(\"}\\n\");\n  p->Print(\"return result;\\n\");\n  p->Outdent();\n  p->Print(\"}\\n\");\n}\n\nstatic void PrintBindServiceMethodBody(Printer* p, VARS& vars,\n                                       const ServiceDescriptor* service) {\n  vars[\"service_name\"] = service->name();\n  p->Indent();\n  p->Print(vars,\n           \"return \"\n           \"$ServerServiceDefinition$.builder(getServiceDescriptor())\\n\");\n  p->Indent();\n  p->Indent();\n  for (int i = 0; i < service->method_count(); ++i) {\n    auto method = service->method(i);\n    vars[\"lower_method_name\"] = LowerMethodName(&*method);\n    vars[\"method_method_name\"] = MethodPropertiesGetterName(&*method);\n    vars[\"input_type\"] = JavaClassName(vars, method->get_input_type_name());\n    vars[\"output_type\"] = JavaClassName(vars, method->get_output_type_name());\n    vars[\"method_id_name\"] = MethodIdFieldName(&*method);\n    bool client_streaming =\n        method->ClientStreaming() || method->BidiStreaming();\n    bool server_streaming =\n        method->ServerStreaming() || method->BidiStreaming();\n    if (client_streaming) {\n      if (server_streaming) {\n        vars[\"calls_method\"] = \"asyncBidiStreamingCall\";\n      } else {\n        vars[\"calls_method\"] = \"asyncClientStreamingCall\";\n      }\n    } else {\n      if (server_streaming) {\n        vars[\"calls_method\"] = \"asyncServerStreamingCall\";\n      } else {\n        vars[\"calls_method\"] = \"asyncUnaryCall\";\n      }\n    }\n    p->Print(vars, \".addMethod(\\n\");\n    p->Indent();\n    p->Print(vars,\n             \"$method_method_name$(),\\n\"\n             \"$calls_method$(\\n\");\n    p->Indent();\n    p->Print(vars,\n             \"new MethodHandlers<\\n\"\n             \"  $input_type$,\\n\"\n             \"  $output_type$>(\\n\"\n             \"    $instance$, $method_id_name$)))\\n\");\n    p->Outdent();\n    p->Outdent();\n  }\n  p->Print(\".build();\\n\");\n  p->Outdent();\n  p->Outdent();\n  p->Outdent();\n}\n\nstatic void PrintService(Printer* p, VARS& vars,\n                         const ServiceDescriptor* service,\n                         bool disable_version) {\n  vars[\"service_name\"] = service->name();\n  vars[\"service_class_name\"] = ServiceClassName(service->name());\n  vars[\"grpc_version\"] = \"\";\n#ifdef GRPC_VERSION\n  if (!disable_version) {\n    vars[\"grpc_version\"] = \" (version \" XSTR(GRPC_VERSION) \")\";\n  }\n#else\n  (void)disable_version;\n#endif\n  // TODO(nmittler): Replace with WriteServiceDocComment once included by\n  // protobuf distro.\n  GrpcWriteServiceDocComment(p, vars, service);\n  p->Print(vars,\n           \"@$Generated$(\\n\"\n           \"    value = \\\"by gRPC proto compiler$grpc_version$\\\",\\n\"\n           \"    comments = \\\"Source: $file_name$.fbs\\\")\\n\"\n           \"public final class $service_class_name$ {\\n\\n\");\n  p->Indent();\n  p->Print(vars, \"private $service_class_name$() {}\\n\\n\");\n\n  p->Print(vars,\n           \"public static final String SERVICE_NAME = \"\n           \"\\\"$Package$$service_name$\\\";\\n\\n\");\n\n  PrintMethodFields(p, vars, service);\n\n  // TODO(nmittler): Replace with WriteDocComment once included by protobuf\n  // distro.\n  GrpcWriteDocComment(\n      p, vars,\n      \" Creates a new async stub that supports all call types for the service\");\n  p->Print(vars,\n           \"public static $service_name$Stub newStub($Channel$ channel) {\\n\");\n  p->Indent();\n  p->Print(vars, \"return new $service_name$Stub(channel);\\n\");\n  p->Outdent();\n  p->Print(\"}\\n\\n\");\n\n  // TODO(nmittler): Replace with WriteDocComment once included by protobuf\n  // distro.\n  GrpcWriteDocComment(\n      p, vars,\n      \" Creates a new blocking-style stub that supports unary and streaming \"\n      \"output calls on the service\");\n  p->Print(vars,\n           \"public static $service_name$BlockingStub newBlockingStub(\\n\"\n           \"    $Channel$ channel) {\\n\");\n  p->Indent();\n  p->Print(vars, \"return new $service_name$BlockingStub(channel);\\n\");\n  p->Outdent();\n  p->Print(\"}\\n\\n\");\n\n  // TODO(nmittler): Replace with WriteDocComment once included by protobuf\n  // distro.\n  GrpcWriteDocComment(\n      p, vars,\n      \" Creates a new ListenableFuture-style stub that supports unary calls \"\n      \"on the service\");\n  p->Print(vars,\n           \"public static $service_name$FutureStub newFutureStub(\\n\"\n           \"    $Channel$ channel) {\\n\");\n  p->Indent();\n  p->Print(vars, \"return new $service_name$FutureStub(channel);\\n\");\n  p->Outdent();\n  p->Print(\"}\\n\\n\");\n\n  PrintStub(p, vars, service, ABSTRACT_CLASS);\n  PrintStub(p, vars, service, ASYNC_CLIENT_IMPL);\n  PrintStub(p, vars, service, BLOCKING_CLIENT_IMPL);\n  PrintStub(p, vars, service, FUTURE_CLIENT_IMPL);\n\n  PrintMethodHandlerClass(p, vars, service);\n  PrintGetServiceDescriptorMethod(p, vars, service);\n  p->Outdent();\n  p->Print(\"}\\n\");\n}\n\nstatic void PrintStaticImports(Printer* p) {\n  p->Print(\n      \"import java.nio.ByteBuffer;\\n\"\n      \"import static \"\n      \"io.grpc.MethodDescriptor.generateFullMethodName;\\n\"\n      \"import static \"\n      \"io.grpc.stub.ClientCalls.asyncBidiStreamingCall;\\n\"\n      \"import static \"\n      \"io.grpc.stub.ClientCalls.asyncClientStreamingCall;\\n\"\n      \"import static \"\n      \"io.grpc.stub.ClientCalls.asyncServerStreamingCall;\\n\"\n      \"import static \"\n      \"io.grpc.stub.ClientCalls.asyncUnaryCall;\\n\"\n      \"import static \"\n      \"io.grpc.stub.ClientCalls.blockingServerStreamingCall;\\n\"\n      \"import static \"\n      \"io.grpc.stub.ClientCalls.blockingUnaryCall;\\n\"\n      \"import static \"\n      \"io.grpc.stub.ClientCalls.futureUnaryCall;\\n\"\n      \"import static \"\n      \"io.grpc.stub.ServerCalls.asyncBidiStreamingCall;\\n\"\n      \"import static \"\n      \"io.grpc.stub.ServerCalls.asyncClientStreamingCall;\\n\"\n      \"import static \"\n      \"io.grpc.stub.ServerCalls.asyncServerStreamingCall;\\n\"\n      \"import static \"\n      \"io.grpc.stub.ServerCalls.asyncUnaryCall;\\n\"\n      \"import static \"\n      \"io.grpc.stub.ServerCalls.asyncUnimplementedStreamingCall;\\n\"\n      \"import static \"\n      \"io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall;\\n\\n\");\n}\n\nstatic void GenerateService(const grpc_generator::Service* service,\n                            grpc_generator::Printer* printer, VARS& vars,\n                            bool disable_version) {\n  // All non-generated classes must be referred by fully qualified names to\n  // avoid collision with generated classes.\n  vars[\"String\"] = \"java.lang.String\";\n  vars[\"Deprecated\"] = \"java.lang.Deprecated\";\n  vars[\"Override\"] = \"java.lang.Override\";\n  vars[\"Channel\"] = \"io.grpc.Channel\";\n  vars[\"CallOptions\"] = \"io.grpc.CallOptions\";\n  vars[\"MethodType\"] = \"io.grpc.MethodDescriptor.MethodType\";\n  vars[\"ServerMethodDefinition\"] = \"io.grpc.ServerMethodDefinition\";\n  vars[\"BindableService\"] = \"io.grpc.BindableService\";\n  vars[\"ServerServiceDefinition\"] = \"io.grpc.ServerServiceDefinition\";\n  vars[\"ServiceDescriptor\"] = \"io.grpc.ServiceDescriptor\";\n  vars[\"ProtoFileDescriptorSupplier\"] =\n      \"io.grpc.protobuf.ProtoFileDescriptorSupplier\";\n  vars[\"ProtoServiceDescriptorSupplier\"] =\n      \"io.grpc.protobuf.ProtoServiceDescriptorSupplier\";\n  vars[\"ProtoMethodDescriptorSupplier\"] =\n      \"io.grpc.protobuf.ProtoMethodDescriptorSupplier\";\n  vars[\"AbstractStub\"] = \"io.grpc.stub.AbstractStub\";\n  vars[\"MethodDescriptor\"] = \"io.grpc.MethodDescriptor\";\n  vars[\"NanoUtils\"] = \"io.grpc.protobuf.nano.NanoUtils\";\n  vars[\"StreamObserver\"] = \"io.grpc.stub.StreamObserver\";\n  vars[\"Iterator\"] = \"java.util.Iterator\";\n  vars[\"Generated\"] = \"javax.annotation.Generated\";\n  vars[\"ListenableFuture\"] =\n      \"com.google.common.util.concurrent.ListenableFuture\";\n  vars[\"ExperimentalApi\"] = \"io.grpc.ExperimentalApi\";\n\n  PrintStaticImports(printer);\n\n  PrintService(printer, vars, service, disable_version);\n}\n}  // namespace\n\ngrpc::string GenerateServiceSource(\n    grpc_generator::File* file, const grpc_generator::Service* service,\n    grpc_java_generator::Parameters* parameters) {\n  grpc::string out;\n  auto printer = file->CreatePrinter(&out);\n  VARS vars;\n  vars[\"flatc_version\"] = grpc::string(\n      FLATBUFFERS_STRING(FLATBUFFERS_VERSION_MAJOR) \".\" FLATBUFFERS_STRING(\n          FLATBUFFERS_VERSION_MINOR) \".\" FLATBUFFERS_STRING(FLATBUFFERS_VERSION_REVISION));\n\n  vars[\"file_name\"] = file->filename();\n\n  if (!parameters->package_name.empty()) {\n    vars[\"Package\"] = parameters->package_name;  // ServiceJavaPackage(service);\n  }\n  GenerateImports(file, &*printer, vars);\n  GenerateService(service, &*printer, vars, false);\n  return out;\n}\n\n}  // namespace grpc_java_generator\n"
  },
  {
    "path": "grpc/src/compiler/java_generator.h",
    "content": "/*\n * Copyright 2016 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef NET_GRPC_COMPILER_JAVA_GENERATOR_H_\n#define NET_GRPC_COMPILER_JAVA_GENERATOR_H_\n\n#include <stdlib.h>  // for abort()\n\n#include <iostream>\n#include <map>\n#include <string>\n\n#include \"src/compiler/schema_interface.h\"\n\nclass LogMessageVoidify {\n public:\n  LogMessageVoidify() {}\n  // This has to be an operator with a precedence lower than << but\n  // higher than ?:\n  void operator&(std::ostream&) {}\n};\n\nclass LogHelper {\n  std::ostream* os_;\n\n public:\n  LogHelper(std::ostream* os) : os_(os) {}\n#if defined(_MSC_VER)\n#pragma warning(push)\n#pragma warning(disable \\\n                : 4722)  // the flow of control terminates in a destructor\n  // (needed to compile ~LogHelper where destructor emits abort intentionally -\n  // inherited from grpc/java code generator).\n#endif\n  ~LogHelper() {\n    *os_ << std::endl;\n    ::abort();\n  }\n#if defined(_MSC_VER)\n#pragma warning(pop)\n#endif\n  std::ostream& get_os() const { return *os_; }\n};\n\n// Abort the program after logging the mesage if the given condition is not\n// true. Otherwise, do nothing.\n#define GRPC_CODEGEN_CHECK(x)                                            \\\n  (x) ? (void)0                                                          \\\n      : LogMessageVoidify() & LogHelper(&std::cerr).get_os()             \\\n                                  << \"CHECK FAILED: \" << __FILE__ << \":\" \\\n                                  << __LINE__ << \": \"\n\n// Abort the program after logging the mesage.\n#define GRPC_CODEGEN_FAIL GRPC_CODEGEN_CHECK(false)\n\nnamespace grpc_java_generator {\nstruct Parameters {\n  //        //Defines the custom parameter types for methods\n  //        //eg: flatbuffers uses flatbuffers.Builder as input for the client\n  //        and output for the server grpc::string custom_method_io_type;\n\n  // Package name for the service\n  grpc::string package_name;\n};\n\n// Return the source of the generated service file.\ngrpc::string GenerateServiceSource(grpc_generator::File* file,\n                                   const grpc_generator::Service* service,\n                                   grpc_java_generator::Parameters* parameters);\n\n}  // namespace grpc_java_generator\n\n#endif  // NET_GRPC_COMPILER_JAVA_GENERATOR_H_\n"
  },
  {
    "path": "grpc/src/compiler/python_generator.cc",
    "content": "/*\n *\n * Copyright 2015 gRPC authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\n#include \"src/compiler/python_generator.h\"\n\n#include <algorithm>\n#include <cstddef>\n#include <map>\n#include <set>\n#include <sstream>\n#include <string>\n\n#include \"codegen/idl_namer.h\"\n#include \"codegen/namer.h\"\n#include \"codegen/python.h\"\n#include \"flatbuffers/idl.h\"\n#include \"flatbuffers/util.h\"\n\nnamespace flatbuffers {\nnamespace python {\nnamespace grpc {\nnamespace {\nbool ClientStreaming(const RPCCall* method) {\n  const Value* val = method->attributes.Lookup(\"streaming\");\n  return val != nullptr &&\n         (val->constant == \"client\" || val->constant == \"bidi\");\n}\n\nbool ServerStreaming(const RPCCall* method) {\n  const Value* val = method->attributes.Lookup(\"streaming\");\n  return val != nullptr &&\n         (val->constant == \"server\" || val->constant == \"bidi\");\n}\n\nvoid FormatImports(std::stringstream& ss, const Imports& imports) {\n  std::set<std::string> modules;\n  std::map<std::string, std::set<std::string>> names_by_module;\n  for (const Import& import : imports.imports) {\n    if (import.IsLocal()) continue;  // skip all local imports\n    if (import.name == \"\") {\n      modules.insert(import.module);\n    } else {\n      names_by_module[import.module].insert(import.name);\n    }\n  }\n\n  for (const std::string& module : modules) {\n    ss << \"import \" << module << '\\n';\n  }\n  ss << '\\n';\n  for (const auto& import : names_by_module) {\n    ss << \"from \" << import.first << \" import \";\n    size_t i = 0;\n    for (const std::string& name : import.second) {\n      if (i > 0) ss << \", \";\n      ss << name;\n      ++i;\n    }\n    ss << '\\n';\n  }\n  ss << \"\\n\\n\";\n}\n\nclass BaseGenerator {\n protected:\n  BaseGenerator(const Parser& parser, const Namer::Config& config,\n                const std::string& path, const Version& version)\n      : parser_{parser},\n        namer_{WithFlagOptions(config, parser.opts, path), Keywords(version)},\n        version_{version},\n        path_(path) {}\n\n protected:\n  std::string ModuleForFile(const std::string& file) const {\n    std::string module = parser_.opts.include_prefix + StripExtension(file) +\n                         parser_.opts.filename_suffix;\n    std::replace(module.begin(), module.end(), '/', '.');\n    return module;\n  }\n\n  template <typename T>\n  std::string ModuleFor(const T* def) const {\n    if (parser_.opts.one_file) return ModuleForFile(def->file);\n    return namer_.NamespacedType(*def);\n  }\n\n  std::string NamespaceDir(const Parser& parser, const std::string& path,\n                           const Namespace& ns, const bool dasherize) {\n    EnsureDirExists(path);\n    if (parser.opts.one_file) return path;\n    std::string namespace_dir = path;  // Either empty or ends in separator.\n    auto& namespaces = ns.components;\n    for (auto it = namespaces.begin(); it != namespaces.end(); ++it) {\n      namespace_dir +=\n          !dasherize ? *it : ConvertCase(*it, Case::kDasher, Case::kUpperCamel);\n      namespace_dir += kPathSeparator;\n      EnsureDirExists(namespace_dir);\n    }\n    return namespace_dir;\n  }\n\n  std::string NamespaceDir(const Namespace& ns, const bool dasherize) {\n    return NamespaceDir(parser_, path_, ns, dasherize);\n  }\n\n  const Parser& parser_;\n  const IdlNamer namer_;\n  const Version version_;\n  const std::string& path_;\n};\n\nclass StubGenerator : public BaseGenerator {\n public:\n  StubGenerator(const Parser& parser, const std::string& path,\n                const Version& version)\n      : BaseGenerator(parser, kStubConfig, path, version) {}\n\n  bool Generate() {\n    Imports imports;\n    std::stringstream stub;\n    std::string ns_name{};\n    for (const ServiceDef* service : parser_.services_.vec) {\n      Generate(stub, service, &imports);\n      ns_name = NamespaceDir(*service->defined_namespace, false);\n    }\n\n    std::string sanitized_suffix{parser_.opts.grpc_filename_suffix};\n    std::replace(sanitized_suffix.begin(), sanitized_suffix.end(), '.', '_');\n    std::string filename =\n        ns_name + kPathSeparator +\n        StripPath(StripExtension(parser_.file_being_parsed_)) + \"_grpc\" +\n        sanitized_suffix + namer_.config_.filename_extension;\n\n    return SaveStub(filename, imports, stub.str());\n  }\n\n private:\n  bool SaveStub(const std::string& filename, const Imports& imports,\n                const std::string& content) {\n    std::stringstream ss;\n    ss << \"# Generated by the gRPC FlatBuffers compiler. DO NOT EDIT!\\n\"\n       << '\\n'\n       << \"from __future__ import annotations\\n\"\n       << '\\n';\n    FormatImports(ss, imports);\n    ss << content << '\\n';\n\n    EnsureDirExists(StripFileName(filename));\n    return parser_.opts.file_saver->SaveFile(filename.c_str(), ss.str(), false);\n  }\n\n  void Generate(std::stringstream& ss, const ServiceDef* service,\n                Imports* imports) {\n    imports->Import(\"grpc\");\n\n    ss << \"class \" << service->name << \"Stub(object):\\n\"\n       << \"  def __init__(self, channel: grpc.Channel) -> None: ...\\n\";\n\n    for (const RPCCall* method : service->calls.vec) {\n      std::string request = \"bytes\";\n      std::string response = \"bytes\";\n\n      if (parser_.opts.grpc_python_typed_handlers) {\n        request = namer_.Type(*method->request);\n        response = namer_.Type(*method->response);\n\n        imports->Import(ModuleFor(method->request), request);\n        imports->Import(ModuleFor(method->response), response);\n      }\n\n      ss << \"  def \" << method->name << \"(self, \";\n      if (ClientStreaming(method)) {\n        imports->Import(\"typing\");\n        ss << \"request_iterator: typing.Iterator[\" << request << \"]\";\n      } else {\n        ss << \"request: \" << request;\n      }\n      ss << \") -> \";\n      if (ServerStreaming(method)) {\n        imports->Import(\"typing\");\n        ss << \"typing.Iterator[\" << response << \"]\";\n      } else {\n        ss << response;\n      }\n      ss << \": ...\\n\";\n    }\n\n    ss << \"\\n\\n\";\n    ss << \"class \" << service->name << \"Servicer(object):\\n\";\n\n    for (const RPCCall* method : service->calls.vec) {\n      std::string request = \"bytes\";\n      std::string response = \"bytes\";\n\n      if (parser_.opts.grpc_python_typed_handlers) {\n        request = namer_.Type(*method->request);\n        response = namer_.Type(*method->response);\n\n        imports->Import(ModuleFor(method->request), request);\n        imports->Import(ModuleFor(method->response), response);\n      }\n\n      ss << \"  def \" << method->name << \"(self, \";\n      if (ClientStreaming(method)) {\n        imports->Import(\"typing\");\n        ss << \"request_iterator: typing.Iterator[\" << request << \"]\";\n      } else {\n        ss << \"request: \" << request;\n      }\n      ss << \", context: grpc.ServicerContext) -> \";\n      if (ServerStreaming(method)) {\n        imports->Import(\"typing\");\n        ss << \"typing.Iterator[\" << response << \"]\";\n      } else {\n        ss << response;\n      }\n      ss << \": ...\\n\";\n    }\n\n    ss << '\\n'\n       << '\\n'\n       << \"def add_\" << service->name\n       << \"Servicer_to_server(servicer: \" << service->name\n       << \"Servicer, server: grpc.Server) -> None: ...\\n\";\n  }\n};\n\nclass ServiceGenerator : public BaseGenerator {\n public:\n  ServiceGenerator(const Parser& parser, const std::string& path,\n                   const Version& version)\n      : BaseGenerator(parser, kConfig, path, version) {}\n\n  bool Generate() {\n    Imports imports;\n    std::stringstream ss;\n\n    imports.Import(\"flatbuffers\");\n\n    if (parser_.opts.grpc_python_typed_handlers) {\n      ss << \"def _serialize_to_bytes(table):\\n\"\n         << \"  buf = table._tab.Bytes\\n\"\n         << \"  n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, 0)\\n\"\n         << \"  if table._tab.Pos != n:\\n\"\n         << \"    raise ValueError('must be a top-level table')\\n\"\n         << \"  return bytes(buf)\\n\"\n         << '\\n'\n         << '\\n';\n    }\n\n    std::string ns_name{};\n    for (const ServiceDef* service : parser_.services_.vec) {\n      GenerateStub(ss, service, &imports);\n      GenerateServicer(ss, service, &imports);\n      GenerateRegister(ss, service, &imports);\n      ns_name = NamespaceDir(*service->defined_namespace, false);\n    }\n\n    std::string sanitized_suffix{parser_.opts.grpc_filename_suffix};\n    std::replace(sanitized_suffix.begin(), sanitized_suffix.end(), '.', '_');\n    std::string filename =\n        ns_name + kPathSeparator +\n        StripPath(StripExtension(parser_.file_being_parsed_)) + \"_grpc\" +\n        sanitized_suffix + namer_.config_.filename_extension;\n\n    return SaveService(filename, imports, ss.str());\n  }\n\n private:\n  bool SaveService(const std::string& filename, const Imports& imports,\n                   const std::string& content) {\n    std::stringstream ss;\n    ss << \"# Generated by the gRPC FlatBuffers compiler. DO NOT EDIT!\\n\"\n       << '\\n';\n    FormatImports(ss, imports);\n    ss << content << '\\n';\n\n    EnsureDirExists(StripFileName(filename));\n    return parser_.opts.file_saver->SaveFile(filename.c_str(), ss.str(), false);\n  }\n\n  void GenerateStub(std::stringstream& ss, const ServiceDef* service,\n                    Imports* imports) {\n    ss << \"class \" << service->name << \"Stub\";\n    if (version_.major != 3) ss << \"(object)\";\n    ss << \":\\n\"\n       << \"  '''Interface exported by the server.'''\\n\"\n       << '\\n'\n       << \"  def __init__(self, channel):\\n\"\n       << \"    '''Constructor.\\n\"\n       << '\\n'\n       << \"    Args:\\n\"\n       << \"      channel: A grpc.Channel.\\n\"\n       << \"    '''\\n\"\n       << '\\n';\n\n    for (const RPCCall* method : service->calls.vec) {\n      std::string response = namer_.Type(*method->response);\n\n      imports->Import(ModuleFor(method->response), response);\n\n      ss << \"    self.\" << method->name << \" = channel.\"\n         << (ClientStreaming(method) ? \"stream\" : \"unary\") << \"_\"\n         << (ServerStreaming(method) ? \"stream\" : \"unary\") << \"(\\n\"\n         << \"      method='/\"\n         << service->defined_namespace->GetFullyQualifiedName(service->name)\n         << \"/\" << method->name << \"'\";\n\n      if (parser_.opts.grpc_python_typed_handlers) {\n        ss << \",\\n\"\n           << \"      request_serializer=_serialize_to_bytes,\\n\"\n           << \"      response_deserializer=\" << response << \".GetRootAs\";\n      }\n      ss << \")\\n\\n\";\n    }\n\n    ss << '\\n';\n  }\n\n  void GenerateServicer(std::stringstream& ss, const ServiceDef* service,\n                        Imports* imports) {\n    imports->Import(\"grpc\");\n\n    ss << \"class \" << service->name << \"Servicer\";\n    if (version_.major != 3) ss << \"(object)\";\n    ss << \":\\n\"\n       << \"  '''Interface exported by the server.'''\\n\"\n       << '\\n';\n\n    for (const RPCCall* method : service->calls.vec) {\n      const std::string request_param =\n          ClientStreaming(method) ? \"request_iterator\" : \"request\";\n      ss << \"  def \" << method->name << \"(self, \" << request_param\n         << \", context):\\n\"\n         << \"    context.set_code(grpc.StatusCode.UNIMPLEMENTED)\\n\"\n         << \"    context.set_details('Method not implemented!')\\n\"\n         << \"    raise NotImplementedError('Method not implemented!')\\n\"\n         << '\\n';\n    }\n\n    ss << '\\n';\n  }\n\n  void GenerateRegister(std::stringstream& ss, const ServiceDef* service,\n                        Imports* imports) {\n    imports->Import(\"grpc\");\n\n    ss << \"def add_\" << service->name\n       << \"Servicer_to_server(servicer, server):\\n\"\n       << \"  rpc_method_handlers = {\\n\";\n\n    for (const RPCCall* method : service->calls.vec) {\n      std::string request = namer_.Type(*method->request);\n\n      imports->Import(ModuleFor(method->request), request);\n\n      ss << \"    '\" << method->name << \"': grpc.\"\n         << (ClientStreaming(method) ? \"stream\" : \"unary\") << \"_\"\n         << (ServerStreaming(method) ? \"stream\" : \"unary\")\n         << \"_rpc_method_handler(\\n\"\n         << \"      servicer.\" << method->name;\n\n      if (parser_.opts.grpc_python_typed_handlers) {\n        ss << \",\\n\"\n           << \"      request_deserializer=\" << request << \".GetRootAs,\\n\"\n           << \"      response_serializer=_serialize_to_bytes\";\n      }\n      ss << \"),\\n\";\n    }\n    ss << \"  }\\n\"\n       << '\\n'\n       << \"  generic_handler = grpc.method_handlers_generic_handler(\\n\"\n       << \"    '\"\n       << service->defined_namespace->GetFullyQualifiedName(service->name)\n       << \"', rpc_method_handlers)\\n\"\n       << '\\n'\n       << \"  server.add_generic_rpc_handlers((generic_handler,))\\n\"\n       << '\\n';\n  }\n};\n}  // namespace\n\nbool Generate(const Parser& parser, const std::string& path,\n              const Version& version) {\n  ServiceGenerator generator{parser, path, version};\n  return generator.Generate();\n}\n\nbool GenerateStub(const Parser& parser, const std::string& path,\n                  const Version& version) {\n  StubGenerator generator{parser, path, version};\n  return generator.Generate();\n}\n\n}  // namespace grpc\n}  // namespace python\n}  // namespace flatbuffers\n"
  },
  {
    "path": "grpc/src/compiler/python_generator.h",
    "content": "/*\n *\n * Copyright 2015 gRPC authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\n#ifndef GRPC_INTERNAL_COMPILER_PYTHON_GENERATOR_H\n#define GRPC_INTERNAL_COMPILER_PYTHON_GENERATOR_H\n\n#include <string>\n\n#include \"codegen/python.h\"\n#include \"flatbuffers/idl.h\"\n\nnamespace flatbuffers {\nnamespace python {\nnamespace grpc {\nbool Generate(const Parser& parser, const std::string& path,\n              const Version& version);\n\nbool GenerateStub(const Parser& parser, const std::string& path,\n                  const Version& version);\n}  // namespace grpc\n}  // namespace python\n}  // namespace flatbuffers\n\n#endif  // GRPC_INTERNAL_COMPILER_PYTHON_GENERATOR_H\n"
  },
  {
    "path": "grpc/src/compiler/schema_interface.h",
    "content": "/*\n *\n * Copyright 2015 gRPC authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\n#ifndef GRPC_INTERNAL_COMPILER_SCHEMA_INTERFACE_H\n#define GRPC_INTERNAL_COMPILER_SCHEMA_INTERFACE_H\n\n#include <map>\n#include <memory>\n#include <vector>\n\n#ifndef GRPC_CUSTOM_STRING\n#include <string>\n#define GRPC_CUSTOM_STRING std::string\n#endif\n\nnamespace grpc {\n\ntypedef GRPC_CUSTOM_STRING string;\n\n}  // namespace grpc\n\nnamespace grpc_generator {\n\n// A common interface for objects having comments in the source.\n// Return formatted comments to be inserted in generated code.\nstruct CommentHolder {\n  virtual ~CommentHolder() {}\n  virtual grpc::string GetLeadingComments(const grpc::string prefix) const = 0;\n  virtual grpc::string GetTrailingComments(const grpc::string prefix) const = 0;\n  virtual std::vector<grpc::string> GetAllComments() const = 0;\n};\n\n// An abstract interface representing a method.\nstruct Method : public CommentHolder {\n  virtual ~Method() {}\n\n  virtual grpc::string name() const = 0;\n\n  virtual grpc::string input_type_name() const = 0;\n  virtual grpc::string output_type_name() const = 0;\n\n  virtual bool get_module_and_message_path_input(\n      grpc::string* str, grpc::string generator_file_name,\n      bool generate_in_pb2_grpc, grpc::string import_prefix) const = 0;\n  virtual bool get_module_and_message_path_output(\n      grpc::string* str, grpc::string generator_file_name,\n      bool generate_in_pb2_grpc, grpc::string import_prefix) const = 0;\n\n  virtual std::vector<grpc::string> get_input_namespace_parts() const = 0;\n  virtual grpc::string get_input_type_name() const = 0;\n  virtual std::vector<grpc::string> get_output_namespace_parts() const = 0;\n  virtual grpc::string get_output_type_name() const = 0;\n\n  virtual grpc::string get_fb_builder() const = 0;\n\n  virtual bool NoStreaming() const = 0;\n  virtual bool ClientStreaming() const = 0;\n  virtual bool ServerStreaming() const = 0;\n  virtual bool BidiStreaming() const = 0;\n};\n\n// An abstract interface representing a service.\nstruct Service : public CommentHolder {\n  virtual ~Service() {}\n\n  virtual std::vector<grpc::string> namespace_parts() const = 0;\n  virtual grpc::string name() const = 0;\n  virtual bool is_internal() const = 0;\n\n  virtual int method_count() const = 0;\n  virtual std::unique_ptr<const Method> method(int i) const = 0;\n};\n\nstruct Printer {\n  virtual ~Printer() {}\n\n  virtual void Print(const std::map<grpc::string, grpc::string>& vars,\n                     const char* template_string) = 0;\n  virtual void Print(const char* string) = 0;\n  virtual void SetIndentationSize(const size_t size) = 0;\n  virtual void Indent() = 0;\n  virtual void Outdent() = 0;\n};\n\n// An interface that allows the source generated to be output using various\n// libraries/idls/serializers.\nstruct File : public CommentHolder {\n  virtual ~File() {}\n\n  virtual grpc::string filename() const = 0;\n  virtual grpc::string filename_without_ext() const = 0;\n  virtual grpc::string package() const = 0;\n  virtual std::vector<grpc::string> package_parts() const = 0;\n  virtual grpc::string additional_headers() const = 0;\n\n  virtual int service_count() const = 0;\n  virtual std::unique_ptr<const Service> service(int i) const = 0;\n\n  virtual std::unique_ptr<Printer> CreatePrinter(\n      grpc::string* str, const char indentation_type = ' ') const = 0;\n};\n}  // namespace grpc_generator\n\n#endif  // GRPC_INTERNAL_COMPILER_SCHEMA_INTERFACE_H\n"
  },
  {
    "path": "grpc/src/compiler/swift_generator.cc",
    "content": "/*\n * Copyright 2020 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * NOTE: The following implementation is a translation for the Swift-grpc\n * generator since flatbuffers doesnt allow plugins for now. if an issue arises\n * please open an issue in the flatbuffers repository. This file should always\n * be maintained according to the Swift-grpc repository\n */\n#include \"src/compiler/swift_generator.h\"\n\n#include <map>\n#include <sstream>\n\n#include \"flatbuffers/util.h\"\n#include \"src/compiler/schema_interface.h\"\n\nnamespace grpc_swift_generator {\nnamespace {\n\nstatic std::string WrapInNameSpace(const std::vector<std::string>& components,\n                                   const grpc::string& name) {\n  std::string qualified_name;\n  for (auto it = components.begin(); it != components.end(); ++it)\n    qualified_name += *it + \"_\";\n  return qualified_name + name;\n}\n\nstatic grpc::string GenerateMessage(const std::vector<std::string>& components,\n                                    const grpc::string& name) {\n  return \"Message<\" + WrapInNameSpace(components, name) + \">\";\n}\n\n// MARK: - Client\n\nstatic void GenerateClientFuncName(\n    const grpc_generator::Method* method, grpc_generator::Printer* printer,\n    std::map<grpc::string, grpc::string>* dictonary) {\n  auto vars = *dictonary;\n  if (method->NoStreaming()) {\n    printer->Print(vars,\n                   \"  $GenAccess$func $MethodName$(\\n\"\n                   \"    _ request: $Input$\\n\"\n                   \"    , callOptions: CallOptions?$isNil$\\n\"\n                   \"  ) -> UnaryCall<$Input$, $Output$>\");\n    return;\n  }\n\n  if (method->ServerStreaming()) {\n    printer->Print(vars,\n                   \"  $GenAccess$func $MethodName$(\\n\"\n                   \"    _ request: $Input$\\n\"\n                   \"    , callOptions: CallOptions?$isNil$,\\n\"\n                   \"    handler: @escaping ($Output$) -> Void\\n\"\n                   \"  ) -> ServerStreamingCall<$Input$, $Output$>\");\n    return;\n  }\n\n  if (method->ClientStreaming()) {\n    printer->Print(vars,\n                   \"  $GenAccess$func $MethodName$(\\n\"\n                   \"    callOptions: CallOptions?$isNil$\\n\"\n                   \"  ) -> ClientStreamingCall<$Input$, $Output$>\");\n    return;\n  }\n\n  printer->Print(vars,\n                 \"  $GenAccess$func $MethodName$(\\n\"\n                 \"    callOptions: CallOptions?$isNil$,\\n\"\n                 \"    handler: @escaping ($Output$ ) -> Void\\n\"\n                 \"  ) -> BidirectionalStreamingCall<$Input$, $Output$>\");\n}\n\nstatic void GenerateClientFuncBody(\n    const grpc_generator::Method* method, grpc_generator::Printer* printer,\n    std::map<grpc::string, grpc::string>* dictonary) {\n  auto vars = *dictonary;\n  vars[\"Interceptor\"] =\n      \"interceptors: self.interceptors?.make$MethodName$Interceptors() ?? []\";\n  if (method->NoStreaming()) {\n    printer->Print(\n        vars,\n        \"    return self.makeUnaryCall(\\n\"\n        \"      path: \\\"/$PATH$$ServiceName$/$MethodName$\\\",\\n\"\n        \"      request: request,\\n\"\n        \"      callOptions: callOptions ?? self.defaultCallOptions,\\n\"\n        \"      $Interceptor$\\n\"\n        \"    )\\n\");\n    return;\n  }\n\n  if (method->ServerStreaming()) {\n    printer->Print(\n        vars,\n        \"    return self.makeServerStreamingCall(\\n\"\n        \"      path: \\\"/$PATH$$ServiceName$/$MethodName$\\\",\\n\"\n        \"      request: request,\\n\"\n        \"      callOptions: callOptions ?? self.defaultCallOptions,\\n\"\n        \"      $Interceptor$,\\n\"\n        \"      handler: handler\\n\"\n        \"    )\\n\");\n    return;\n  }\n\n  if (method->ClientStreaming()) {\n    printer->Print(\n        vars,\n        \"    return self.makeClientStreamingCall(\\n\"\n        \"      path: \\\"/$PATH$$ServiceName$/$MethodName$\\\",\\n\"\n        \"      callOptions: callOptions ?? self.defaultCallOptions,\\n\"\n        \"      $Interceptor$\\n\"\n        \"    )\\n\");\n    return;\n  }\n  printer->Print(vars,\n                 \"    return self.makeBidirectionalStreamingCall(\\n\"\n                 \"      path: \\\"/$PATH$$ServiceName$/$MethodName$\\\",\\n\"\n                 \"      callOptions: callOptions ?? self.defaultCallOptions,\\n\"\n                 \"      $Interceptor$,\\n\"\n                 \"      handler: handler\\n\"\n                 \"    )\\n\");\n}\n\nvoid GenerateClientProtocol(const grpc_generator::Service* service,\n                            grpc_generator::Printer* printer,\n                            std::map<grpc::string, grpc::string>* dictonary) {\n  auto vars = *dictonary;\n  printer->Print(\n      vars,\n      \"$ACCESS$ protocol $ServiceQualifiedName$ClientProtocol: GRPCClient {\");\n  printer->Print(\"\\n\\n\");\n  printer->Print(\"  var serviceName: String { get }\");\n  printer->Print(\"\\n\\n\");\n  printer->Print(\n      vars,\n      \"  var interceptors: \"\n      \"$ServiceQualifiedName$ClientInterceptorFactoryProtocol? { get }\");\n  printer->Print(\"\\n\\n\");\n\n  vars[\"GenAccess\"] = \"\";\n  for (auto it = 0; it < service->method_count(); it++) {\n    auto method = service->method(it);\n    vars[\"Input\"] = GenerateMessage(method->get_input_namespace_parts(),\n                                    method->get_input_type_name());\n    vars[\"Output\"] = GenerateMessage(method->get_output_namespace_parts(),\n                                     method->get_output_type_name());\n    vars[\"MethodName\"] = method->name();\n    vars[\"isNil\"] = \"\";\n    GenerateClientFuncName(method.get(), &*printer, &vars);\n    printer->Print(\"\\n\\n\");\n  }\n  printer->Print(\"}\\n\\n\");\n\n  printer->Print(vars, \"extension $ServiceQualifiedName$ClientProtocol {\");\n  printer->Print(\"\\n\\n\");\n  printer->Print(vars,\n                 \"  $ACCESS$ var serviceName: String { \"\n                 \"\\\"$PATH$$ServiceName$\\\" }\\n\");\n\n  vars[\"GenAccess\"] = service->is_internal() ? \"internal \" : \"public \";\n  for (auto it = 0; it < service->method_count(); it++) {\n    auto method = service->method(it);\n    vars[\"Input\"] = GenerateMessage(method->get_input_namespace_parts(),\n                                    method->get_input_type_name());\n    vars[\"Output\"] = GenerateMessage(method->get_output_namespace_parts(),\n                                     method->get_output_type_name());\n    vars[\"MethodName\"] = method->name();\n    vars[\"isNil\"] = \" = nil\";\n    printer->Print(\"\\n\");\n    GenerateClientFuncName(method.get(), &*printer, &vars);\n    printer->Print(\" {\\n\");\n    GenerateClientFuncBody(method.get(), &*printer, &vars);\n    printer->Print(\"  }\\n\");\n  }\n  printer->Print(\"}\\n\\n\");\n\n  printer->Print(vars,\n                 \"$ACCESS$ protocol \"\n                 \"$ServiceQualifiedName$ClientInterceptorFactoryProtocol {\\n\");\n\n  for (auto it = 0; it < service->method_count(); it++) {\n    auto method = service->method(it);\n    vars[\"Input\"] = GenerateMessage(method->get_input_namespace_parts(),\n                                    method->get_input_type_name());\n    vars[\"Output\"] = GenerateMessage(method->get_output_namespace_parts(),\n                                     method->get_output_type_name());\n    vars[\"MethodName\"] = method->name();\n    printer->Print(\n        vars,\n        \"  /// - Returns: Interceptors to use when invoking '$MethodName$'.\\n\");\n    printer->Print(vars,\n                   \"  func make$MethodName$Interceptors() -> \"\n                   \"[ClientInterceptor<$Input$, $Output$>]\\n\\n\");\n  }\n  printer->Print(\"}\\n\\n\");\n}\n\nvoid GenerateClientClass(grpc_generator::Printer* printer,\n                         std::map<grpc::string, grpc::string>* dictonary) {\n  auto vars = *dictonary;\n  printer->Print(vars,\n                 \"$ACCESS$ final class $ServiceQualifiedName$ServiceClient: \"\n                 \"$ServiceQualifiedName$ClientProtocol {\\n\");\n  printer->Print(vars, \"  $ACCESS$ let channel: GRPCChannel\\n\");\n  printer->Print(vars, \"  $ACCESS$ var defaultCallOptions: CallOptions\\n\");\n  printer->Print(vars,\n                 \"  $ACCESS$ var interceptors: \"\n                 \"$ServiceQualifiedName$ClientInterceptorFactoryProtocol?\\n\");\n  printer->Print(\"\\n\");\n  printer->Print(\n      vars,\n      \"  $ACCESS$ init(\\n\"\n      \"    channel: GRPCChannel,\\n\"\n      \"    defaultCallOptions: CallOptions = CallOptions(),\\n\"\n      \"    interceptors: \"\n      \"$ServiceQualifiedName$ClientInterceptorFactoryProtocol? = nil\\n\"\n      \"  ) {\\n\");\n  printer->Print(\"    self.channel = channel\\n\");\n  printer->Print(\"    self.defaultCallOptions = defaultCallOptions\\n\");\n  printer->Print(\"    self.interceptors = interceptors\\n\");\n  printer->Print(\"  }\");\n  printer->Print(\"\\n\");\n  printer->Print(\"}\\n\");\n}\n\n// MARK: - Server\n\ngrpc::string GenerateServerFuncName(const grpc_generator::Method* method) {\n  if (method->NoStreaming()) {\n    return \"func $MethodName$(request: $Input$\"\n           \", context: StatusOnlyCallContext) -> EventLoopFuture<$Output$>\";\n  }\n\n  if (method->ClientStreaming()) {\n    return \"func $MethodName$(context: UnaryResponseCallContext<$Output$>) -> \"\n           \"EventLoopFuture<(StreamEvent<$Input$\"\n           \">) -> Void>\";\n  }\n\n  if (method->ServerStreaming()) {\n    return \"func $MethodName$(request: $Input$\"\n           \", context: StreamingResponseCallContext<$Output$>) -> \"\n           \"EventLoopFuture<GRPCStatus>\";\n  }\n  return \"func $MethodName$(context: StreamingResponseCallContext<$Output$>) \"\n         \"-> EventLoopFuture<(StreamEvent<$Input$>) -> Void>\";\n}\n\ngrpc::string GenerateServerExtensionBody(const grpc_generator::Method* method) {\n  grpc::string start = \"    case \\\"$MethodName$\\\":\\n    \";\n  grpc::string interceptors =\n      \"      interceptors: self.interceptors?.make$MethodName$Interceptors() \"\n      \"?? [],\\n\";\n  if (method->NoStreaming()) {\n    return start +\n           \"return UnaryServerHandler(\\n\"\n           \"      context: context,\\n\"\n           \"      requestDeserializer: GRPCPayloadDeserializer<$Input$>(),\\n\"\n           \"      responseSerializer: GRPCPayloadSerializer<$Output$>(),\\n\" +\n           interceptors +\n           \"      userFunction: self.$MethodName$(request:context:))\\n\";\n  }\n  if (method->ServerStreaming()) {\n    return start +\n           \"return ServerStreamingServerHandler(\\n\"\n           \"      context: context,\\n\"\n           \"      requestDeserializer: GRPCPayloadDeserializer<$Input$>(),\\n\"\n           \"      responseSerializer: GRPCPayloadSerializer<$Output$>(),\\n\" +\n           interceptors +\n           \"      userFunction: self.$MethodName$(request:context:))\\n\";\n  }\n  if (method->ClientStreaming()) {\n    return start +\n           \"return ClientStreamingServerHandler(\\n\"\n           \"      context: context,\\n\"\n           \"      requestDeserializer: GRPCPayloadDeserializer<$Input$>(),\\n\"\n           \"      responseSerializer: GRPCPayloadSerializer<$Output$>(),\\n\" +\n           interceptors +\n           \"      observerFactory: self.$MethodName$(context:))\\n\";\n  }\n  if (method->BidiStreaming()) {\n    return start +\n           \"return BidirectionalStreamingServerHandler(\\n\"\n           \"      context: context,\\n\"\n           \"      requestDeserializer: GRPCPayloadDeserializer<$Input$>(),\\n\"\n           \"      responseSerializer: GRPCPayloadSerializer<$Output$>(),\\n\" +\n           interceptors +\n           \"      observerFactory: self.$MethodName$(context:))\\n\";\n  }\n  return \"\";\n}\n\nvoid GenerateServerProtocol(const grpc_generator::Service* service,\n                            grpc_generator::Printer* printer,\n                            std::map<grpc::string, grpc::string>* dictonary) {\n  auto vars = *dictonary;\n  printer->Print(vars,\n                 \"$ACCESS$ protocol $ServiceQualifiedName$Provider: \"\n                 \"CallHandlerProvider {\\n\");\n  printer->Print(\n      vars,\n      \"  var interceptors: \"\n      \"$ServiceQualifiedName$ServerInterceptorFactoryProtocol? { get }\\n\");\n  for (auto it = 0; it < service->method_count(); it++) {\n    auto method = service->method(it);\n    vars[\"Input\"] = GenerateMessage(method->get_input_namespace_parts(),\n                                    method->get_input_type_name());\n    vars[\"Output\"] = GenerateMessage(method->get_output_namespace_parts(),\n                                     method->get_output_type_name());\n    vars[\"MethodName\"] = method->name();\n    printer->Print(\"  \");\n    auto func = GenerateServerFuncName(method.get());\n    printer->Print(vars, func.c_str());\n    printer->Print(\"\\n\");\n  }\n  printer->Print(\"}\\n\\n\");\n\n  printer->Print(vars, \"$ACCESS$ extension $ServiceQualifiedName$Provider {\\n\");\n  printer->Print(\"\\n\");\n  printer->Print(vars,\n                 \"  var serviceName: Substring { return \"\n                 \"\\\"$PATH$$ServiceName$\\\" }\\n\");\n  printer->Print(\"\\n\");\n  printer->Print(\n      \"  func handle(method name: Substring, context: \"\n      \"CallHandlerContext) -> GRPCServerHandlerProtocol? {\\n\");\n  printer->Print(\"    switch name {\\n\");\n  for (auto it = 0; it < service->method_count(); it++) {\n    auto method = service->method(it);\n    vars[\"Input\"] = GenerateMessage(method->get_input_namespace_parts(),\n                                    method->get_input_type_name());\n    vars[\"Output\"] = GenerateMessage(method->get_output_namespace_parts(),\n                                     method->get_output_type_name());\n    vars[\"MethodName\"] = method->name();\n    auto body = GenerateServerExtensionBody(method.get());\n    printer->Print(vars, body.c_str());\n    printer->Print(\"\\n\");\n  }\n  printer->Print(\"    default: return nil;\\n\");\n  printer->Print(\"    }\\n\");\n  printer->Print(\"  }\\n\\n\");\n  printer->Print(\"}\\n\\n\");\n\n  printer->Print(vars,\n                 \"$ACCESS$ protocol \"\n                 \"$ServiceQualifiedName$ServerInterceptorFactoryProtocol {\\n\");\n  for (auto it = 0; it < service->method_count(); it++) {\n    auto method = service->method(it);\n    vars[\"Input\"] = GenerateMessage(method->get_input_namespace_parts(),\n                                    method->get_input_type_name());\n    vars[\"Output\"] = GenerateMessage(method->get_output_namespace_parts(),\n                                     method->get_output_type_name());\n    vars[\"MethodName\"] = method->name();\n    printer->Print(\n        vars,\n        \"  /// - Returns: Interceptors to use when handling '$MethodName$'.\\n\"\n        \"  ///   Defaults to calling `self.makeInterceptors()`.\\n\");\n    printer->Print(vars,\n                   \"  func make$MethodName$Interceptors() -> \"\n                   \"[ServerInterceptor<$Input$, $Output$>]\\n\\n\");\n  }\n  printer->Print(\"}\");\n}\n}  // namespace\n\ngrpc::string Generate(grpc_generator::File* file,\n                      const grpc_generator::Service* service) {\n  grpc::string output;\n  std::map<grpc::string, grpc::string> vars;\n  vars[\"PATH\"] = file->package();\n  if (!file->package().empty()) {\n    vars[\"PATH\"].append(\".\");\n  }\n  vars[\"ServiceQualifiedName\"] =\n      WrapInNameSpace(service->namespace_parts(), service->name());\n  vars[\"ServiceName\"] = service->name();\n  vars[\"ACCESS\"] = service->is_internal() ? \"internal\" : \"public\";\n  auto printer = file->CreatePrinter(&output);\n  printer->Print(\n      vars,\n      \"/// Usage: instantiate $ServiceQualifiedName$ServiceClient, then call \"\n      \"methods of this protocol to make API calls.\\n\");\n  GenerateClientProtocol(service, &*printer, &vars);\n  GenerateClientClass(&*printer, &vars);\n  printer->Print(\"\\n\");\n  GenerateServerProtocol(service, &*printer, &vars);\n  printer->Print(\"\\n\");\n  printer->Print(\"#endif\\n\");\n  return output;\n}\n\ngrpc::string GenerateHeader() {\n  grpc::string code;\n  code +=\n      \"/// The following code is generated by the Flatbuffers library which \"\n      \"might not be in sync with grpc-swift\\n\";\n  code +=\n      \"/// in case of an issue please open github issue, though it would be \"\n      \"maintained\\n\";\n  code += \"\\n\";\n  code += \"// swiftlint:disable all\\n\";\n  code += \"// swiftformat:disable all\\n\";\n  code += \"\\n\";\n  code += \"#if !os(Windows)\\n\";\n  code += \"import Foundation\\n\";\n  code += \"import GRPC\\n\";\n  code += \"import NIO\\n\";\n  code += \"import NIOHTTP1\\n\";\n  code += \"import FlatBuffers\\n\";\n  code += \"\\n\";\n  code +=\n      \"public protocol GRPCFlatBufPayload: GRPCPayload, FlatBufferGRPCMessage \"\n      \"{}\\n\";\n\n  code += \"public extension GRPCFlatBufPayload {\\n\";\n  code += \"  init(serializedByteBuffer: inout NIO.ByteBuffer) throws {\\n\";\n  code +=\n      \"    self.init(byteBuffer: FlatBuffers.ByteBuffer(contiguousBytes: \"\n      \"serializedByteBuffer.readableBytesView, count: \"\n      \"serializedByteBuffer.readableBytes))\\n\";\n  code += \"  }\\n\";\n\n  code += \"  func serialize(into buffer: inout NIO.ByteBuffer) throws {\\n\";\n  code += \"    withUnsafeReadableBytes { buffer.writeBytes($0) }\\n\";\n  code += \"  }\\n\";\n  code += \"}\\n\";\n  code += \"extension Message: GRPCFlatBufPayload {}\\n\";\n  return code;\n}\n}  // namespace grpc_swift_generator\n"
  },
  {
    "path": "grpc/src/compiler/swift_generator.h",
    "content": "/*\n * Copyright 2020 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include <memory>\n#include <vector>\n\n#include \"src/compiler/schema_interface.h\"\n\n#ifndef GRPC_CUSTOM_STRING\n#include <string>\n#define GRPC_CUSTOM_STRING std::string\n#endif\n\nnamespace grpc {\n\ntypedef GRPC_CUSTOM_STRING string;\n\n}  // namespace grpc\n\nnamespace grpc_swift_generator {\ngrpc::string Generate(grpc_generator::File* file,\n                      const grpc_generator::Service* service);\ngrpc::string GenerateHeader();\n}  // namespace grpc_swift_generator\n"
  },
  {
    "path": "grpc/src/compiler/ts_generator.cc",
    "content": "/*\n * Copyright 2020 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * NOTE: The following implementation is a translation for the Swift-grpc\n * generator since flatbuffers doesnt allow plugins for now. if an issue arises\n * please open an issue in the flatbuffers repository. This file should always\n * be maintained according to the Swift-grpc repository\n */\n\n#include \"src/compiler/ts_generator.h\"\n\n#include <map>\n#include <sstream>\n\n#include \"flatbuffers/util.h\"\n#include \"src/compiler/schema_interface.h\"\n\nnamespace grpc_ts_generator {\nnamespace {\n\nstatic grpc::string GenerateNamespace(const std::vector<std::string> ns,\n                                      const std::string filename,\n                                      const bool include_separator) {\n  grpc::string path = \"\";\n  if (include_separator) path += \".\";\n\n  for (auto it = ns.begin(); it < ns.end(); it++) {\n    if (include_separator) path += \"/\";\n    path += include_separator\n                ? flatbuffers::ConvertCase(*it, flatbuffers::Case::kDasher,\n                                           flatbuffers::Case::kUpperCamel)\n                : *it + \"_\";\n  }\n\n  if (include_separator) path += \"/\";\n  path += include_separator\n              ? flatbuffers::ConvertCase(filename, flatbuffers::Case::kDasher,\n                                         flatbuffers::Case::kUpperCamel)\n              : filename;\n  return path;\n}\n\n// MARK: - Shared code\n\nstatic void GenerateImports(const grpc_generator::Service* service,\n                            grpc_generator::Printer* printer,\n                            std::map<grpc::string, grpc::string>* dictonary,\n                            const bool grpc_var_import) {\n  auto vars = *dictonary;\n  printer->Print(\n      \"// Generated GRPC code for FlatBuffers TS *** DO NOT EDIT ***\\n\");\n  printer->Print(\"import * as flatbuffers from 'flatbuffers';\\n\");\n\n  std::set<grpc::string> generated_imports;\n\n  for (auto it = 0; it < service->method_count(); it++) {\n    auto method = service->method(it);\n    auto output = method->get_output_type_name();\n    auto input = method->get_input_type_name();\n    auto input_namespace = method->get_input_namespace_parts();\n\n    vars[\"OUTPUT\"] = output;\n    vars[\"INPUT\"] = input;\n\n    if (generated_imports.find(output) == generated_imports.end()) {\n      generated_imports.insert(output);\n      vars[\"OUTPUT_DIR\"] =\n          GenerateNamespace(method->get_output_namespace_parts(), output, true);\n      vars[\"Output_alias\"] = GenerateNamespace(\n          method->get_output_namespace_parts(), output, false);\n      printer->Print(\n          vars, \"import { $OUTPUT$ as $Output_alias$ } from '$OUTPUT_DIR$';\\n\");\n    }\n    if (generated_imports.find(input) == generated_imports.end()) {\n      generated_imports.insert(input);\n      vars[\"INPUT_DIR\"] =\n          GenerateNamespace(method->get_output_namespace_parts(), input, true);\n      vars[\"Input_alias\"] =\n          GenerateNamespace(method->get_output_namespace_parts(), input, false);\n      printer->Print(\n          vars, \"import { $INPUT$ as $Input_alias$ } from '$INPUT_DIR$';\\n\");\n    }\n  }\n  printer->Print(\"\\n\");\n  if (grpc_var_import)\n    printer->Print(\"var grpc = require('@grpc/grpc-js');\\n\");\n  else\n    printer->Print(\"import * as grpc from '@grpc/grpc-js';\\n\");\n  printer->Print(\"\\n\");\n}\n\n// MARK: - Generate Main GRPC Code\n\nstatic void GetStreamType(grpc_generator::Printer* printer,\n                          const grpc_generator::Method* method,\n                          std::map<grpc::string, grpc::string>* dictonary) {\n  auto vars = *dictonary;\n  auto client_streaming = method->ClientStreaming() || method->BidiStreaming();\n  auto server_streaming = method->ServerStreaming() || method->BidiStreaming();\n  vars[\"ClientStreaming\"] = client_streaming ? \"true\" : \"false\";\n  vars[\"ServerStreaming\"] = server_streaming ? \"true\" : \"false\";\n  printer->Print(vars, \"requestStream: $ClientStreaming$,\\n\");\n  printer->Print(vars, \"responseStream: $ServerStreaming$,\\n\");\n}\n\nstatic void GenerateSerializeMethod(\n    grpc_generator::Printer* printer,\n    std::map<grpc::string, grpc::string>* dictonary) {\n  auto vars = *dictonary;\n  printer->Print(vars, \"function serialize_$Type$(buffer_args) {\\n\");\n  printer->Indent();\n  printer->Print(vars, \"if (!(buffer_args instanceof $Type$)) {\\n\");\n  printer->Indent();\n  printer->Print(vars,\n                 \"throw new Error('Expected argument of type $VALUE$');\\n\");\n  printer->Outdent();\n  printer->Print(\"}\\n\");\n  printer->Print(vars, \"return Buffer.from(buffer_args.serialize());\\n\");\n  printer->Outdent();\n  printer->Print(\"}\\n\\n\");\n}\n\nstatic void GenerateDeserializeMethod(\n    grpc_generator::Printer* printer,\n    std::map<grpc::string, grpc::string>* dictonary) {\n  auto vars = *dictonary;\n  printer->Print(vars, \"function deserialize_$Type$(buffer) {\\n\");\n  printer->Indent();\n  printer->Print(vars,\n                 \"return $Type$.getRootAs$VALUE$(new \"\n                 \"flatbuffers.ByteBuffer(buffer))\\n\");\n  printer->Outdent();\n  printer->Print(\"}\\n\\n\");\n}\n\nstatic void GenerateMethods(const grpc_generator::Service* service,\n                            grpc_generator::Printer* printer,\n                            std::map<grpc::string, grpc::string>* dictonary) {\n  auto vars = *dictonary;\n\n  std::set<grpc::string> generated_functions;\n\n  for (auto it = 0; it < service->method_count(); it++) {\n    auto method = service->method(it);\n    auto output = method->get_output_type_name();\n    auto input = method->get_input_type_name();\n\n    if (generated_functions.find(output) == generated_functions.end()) {\n      generated_functions.insert(output);\n      vars[\"VALUE\"] = output;\n      vars[\"Type\"] = GenerateNamespace(method->get_output_namespace_parts(),\n                                       output, false);\n      GenerateSerializeMethod(printer, &vars);\n      GenerateDeserializeMethod(printer, &vars);\n    }\n    printer->Print(\"\\n\");\n    if (generated_functions.find(input) == generated_functions.end()) {\n      generated_functions.insert(input);\n      vars[\"VALUE\"] = input;\n      vars[\"Type\"] =\n          GenerateNamespace(method->get_input_namespace_parts(), input, false);\n      GenerateSerializeMethod(printer, &vars);\n      GenerateDeserializeMethod(printer, &vars);\n    }\n  }\n}\n\nstatic void GenerateService(const grpc_generator::Service* service,\n                            grpc_generator::Printer* printer,\n                            std::map<grpc::string, grpc::string>* dictonary) {\n  auto vars = *dictonary;\n  vars[\"NAME\"] = service->name() + \"Service\";\n\n  printer->Print(vars, \"var $NAME$ = exports.$NAME$ = {\\n\");\n  printer->Indent();\n  for (auto it = 0; it < service->method_count(); it++) {\n    auto method = service->method(it);\n    vars[\"MethodName\"] = method->name();\n    vars[\"OUTPUT\"] = GenerateNamespace(method->get_output_namespace_parts(),\n                                       method->get_output_type_name(), false);\n    vars[\"INPUT\"] = GenerateNamespace(method->get_input_namespace_parts(),\n                                      method->get_input_type_name(), false);\n    printer->Print(vars, \"$MethodName$: {\\n\");\n    printer->Indent();\n    printer->Print(vars, \"path: '/$PATH$$ServiceName$/$MethodName$',\\n\");\n    GetStreamType(printer, &*method, &vars);\n    printer->Print(vars, \"requestType: flatbuffers.ByteBuffer,\\n\");\n    printer->Print(vars, \"responseType: $OUTPUT$,\\n\");\n    printer->Print(vars, \"requestSerialize: serialize_$INPUT$,\\n\");\n    printer->Print(vars, \"requestDeserialize: deserialize_$INPUT$,\\n\");\n    printer->Print(vars, \"responseSerialize: serialize_$OUTPUT$,\\n\");\n    printer->Print(vars, \"responseDeserialize: deserialize_$OUTPUT$,\\n\");\n    printer->Outdent();\n    printer->Print(\"},\\n\");\n  }\n  printer->Outdent();\n  printer->Print(\"};\\n\");\n  printer->Print(vars,\n                 \"exports.$ServiceName$Client = \"\n                 \"grpc.makeGenericClientConstructor($NAME$);\");\n}\n\n}  // namespace\n\ngrpc::string Generate(grpc_generator::File* file,\n                      const grpc_generator::Service* service,\n                      const grpc::string& filename) {\n  grpc::string output;\n  std::map<grpc::string, grpc::string> vars;\n\n  vars[\"PATH\"] = file->package();\n\n  if (!file->package().empty()) {\n    vars[\"PATH\"].append(\".\");\n  }\n\n  vars[\"ServiceName\"] = service->name();\n  vars[\"FBSFile\"] = service->name() + \"_fbs\";\n  vars[\"Filename\"] = filename;\n  auto printer = file->CreatePrinter(&output);\n\n  GenerateImports(service, &*printer, &vars, true);\n  GenerateMethods(service, &*printer, &vars);\n  GenerateService(service, &*printer, &vars);\n  return output;\n}\n\nnamespace {\n\n// MARK: - Generate Interface\n\nstatic void FillInterface(grpc_generator::Printer* printer,\n                          std::map<grpc::string, grpc::string>* dictonary) {\n  auto vars = *dictonary;\n  printer->Print(vars,\n                 \"interface I$ServiceName$Service_I$MethodName$ extends \"\n                 \"grpc.MethodDefinition<$INPUT$, $OUTPUT$> {\\n\");\n  printer->Indent();\n  printer->Print(vars, \"path: string; // /$PATH$$ServiceName$/$MethodName$\\n\");\n  printer->Print(vars, \"requestStream: boolean; // $ClientStreaming$\\n\");\n  printer->Print(vars, \"responseStream: boolean; // $ServerStreaming$\\n\");\n  printer->Print(vars, \"requestSerialize: grpc.serialize<$INPUT$>;\\n\");\n  printer->Print(vars, \"requestDeserialize: grpc.deserialize<$INPUT$>;\\n\");\n  printer->Print(vars, \"responseSerialize: grpc.serialize<$OUTPUT$>;\\n\");\n  printer->Print(vars, \"responseDeserialize: grpc.deserialize<$OUTPUT$>;\\n\");\n  printer->Outdent();\n  printer->Print(\"}\\n\");\n}\n\nstatic void GenerateInterfaces(\n    const grpc_generator::Service* service, grpc_generator::Printer* printer,\n    std::map<grpc::string, grpc::string>* dictonary) {\n  auto vars = *dictonary;\n  for (auto it = 0; it < service->method_count(); it++) {\n    auto method = service->method(it);\n    auto client_streaming =\n        method->ClientStreaming() || method->BidiStreaming();\n    auto server_streaming =\n        method->ServerStreaming() || method->BidiStreaming();\n    vars[\"ClientStreaming\"] = client_streaming ? \"true\" : \"false\";\n    vars[\"ServerStreaming\"] = server_streaming ? \"true\" : \"false\";\n    vars[\"MethodName\"] = method->name();\n    vars[\"OUTPUT\"] = GenerateNamespace(method->get_output_namespace_parts(),\n                                       method->get_output_type_name(), false);\n    vars[\"INPUT\"] = GenerateNamespace(method->get_input_namespace_parts(),\n                                      method->get_input_type_name(), false);\n    FillInterface(printer, &vars);\n    printer->Print(\"\\n\");\n  }\n}\n\nstatic void GenerateExportedInterface(\n    const grpc_generator::Service* service, grpc_generator::Printer* printer,\n    std::map<grpc::string, grpc::string>* dictonary) {\n  auto vars = *dictonary;\n  printer->Print(vars,\n                 \"export interface I$ServiceName$Server extends \"\n                 \"grpc.UntypedServiceImplementation {\\n\");\n  printer->Indent();\n  for (auto it = 0; it < service->method_count(); it++) {\n    auto method = service->method(it);\n    vars[\"Name\"] = method->name();\n    vars[\"OUTPUT\"] = GenerateNamespace(method->get_output_namespace_parts(),\n                                       method->get_output_type_name(), false);\n    vars[\"INPUT\"] = GenerateNamespace(method->get_input_namespace_parts(),\n                                      method->get_input_type_name(), false);\n    if (method->BidiStreaming()) {\n      printer->Print(vars,\n                     \"$Name$: grpc.handleBidiStreamingCall<$INPUT$, \"\n                     \"$OUTPUT$>;\\n\");\n      continue;\n    }\n    if (method->NoStreaming()) {\n      printer->Print(vars,\n                     \"$Name$: grpc.handleUnaryCall<$INPUT$, \"\n                     \"$OUTPUT$>;\\n\");\n      continue;\n    }\n    if (method->ClientStreaming()) {\n      printer->Print(vars,\n                     \"$Name$: grpc.handleClientStreamingCall<$INPUT$, \"\n                     \"$OUTPUT$>;\\n\");\n      continue;\n    }\n    if (method->ServerStreaming()) {\n      printer->Print(vars,\n                     \"$Name$: grpc.handleServerStreamingCall<$INPUT$, \"\n                     \"$OUTPUT$>;\\n\");\n      continue;\n    }\n  }\n  printer->Outdent();\n  printer->Print(\"}\\n\");\n}\n\nstatic void GenerateMainInterface(\n    const grpc_generator::Service* service, grpc_generator::Printer* printer,\n    std::map<grpc::string, grpc::string>* dictonary) {\n  auto vars = *dictonary;\n  printer->Print(\n      vars,\n      \"interface I$ServiceName$Service extends \"\n      \"grpc.ServiceDefinition<grpc.UntypedServiceImplementation> {\\n\");\n  printer->Indent();\n  for (auto it = 0; it < service->method_count(); it++) {\n    auto method = service->method(it);\n    vars[\"MethodName\"] = method->name();\n    printer->Print(vars,\n                   \"$MethodName$: I$ServiceName$Service_I$MethodName$;\\n\");\n  }\n  printer->Outdent();\n  printer->Print(\"}\\n\");\n  GenerateInterfaces(service, printer, &vars);\n  printer->Print(\"\\n\");\n  printer->Print(vars,\n                 \"export const $ServiceName$Service: I$ServiceName$Service;\\n\");\n  printer->Print(\"\\n\");\n  GenerateExportedInterface(service, printer, &vars);\n}\n\nstatic grpc::string GenerateMetaData() { return \"metadata: grpc.Metadata\"; }\n\nstatic grpc::string GenerateOptions() {\n  return \"options: Partial<grpc.CallOptions>\";\n}\n\nstatic void GenerateUnaryClientInterface(\n    grpc_generator::Printer* printer,\n    std::map<grpc::string, grpc::string>* dictonary) {\n  auto vars = *dictonary;\n  grpc::string main = \"$ISPUBLIC$$MethodName$(request: $INPUT$, \";\n  grpc::string callback =\n      \"callback: (error: grpc.ServiceError | null, response: \"\n      \"$OUTPUT$) => void): grpc.ClientUnaryCall;\\n\";\n  auto meta_data = GenerateMetaData() + \", \";\n  auto options = GenerateOptions() + \", \";\n  printer->Print(vars, (main + callback).c_str());\n  printer->Print(vars, (main + meta_data + callback).c_str());\n  printer->Print(vars, (main + meta_data + options + callback).c_str());\n}\n\nstatic void GenerateClientWriteStreamInterface(\n    grpc_generator::Printer* printer,\n    std::map<grpc::string, grpc::string>* dictonary) {\n  auto vars = *dictonary;\n  grpc::string main = \"$ISPUBLIC$$MethodName$(\";\n  grpc::string callback =\n      \"callback: (error: grpc.ServiceError | null, response: \"\n      \"$INPUT$) => void): \"\n      \"grpc.ClientWritableStream<$OUTPUT$>;\\n\";\n  auto meta_data = GenerateMetaData() + \", \";\n  auto options = GenerateOptions() + \", \";\n  printer->Print(vars, (main + callback).c_str());\n  printer->Print(vars, (main + meta_data + callback).c_str());\n  printer->Print(vars, (main + options + callback).c_str());\n  printer->Print(vars, (main + meta_data + options + callback).c_str());\n}\n\nstatic void GenerateClientReadableStreamInterface(\n    grpc_generator::Printer* printer,\n    std::map<grpc::string, grpc::string>* dictonary) {\n  auto vars = *dictonary;\n  grpc::string main = \"$ISPUBLIC$$MethodName$(request: $INPUT$, \";\n  grpc::string end_function = \"): grpc.ClientReadableStream<$OUTPUT$>;\\n\";\n  auto meta_data = GenerateMetaData();\n  auto options = GenerateOptions();\n  printer->Print(vars, (main + meta_data + end_function).c_str());\n  printer->Print(vars, (main + options + end_function).c_str());\n}\n\nstatic void GenerateDepluxStreamInterface(\n    grpc_generator::Printer* printer,\n    std::map<grpc::string, grpc::string>* dictonary) {\n  auto vars = *dictonary;\n  grpc::string main = \"$ISPUBLIC$$MethodName$(\";\n  grpc::string end_function =\n      \"): grpc.ClientDuplexStream<$INPUT$, $OUTPUT$>;\\n\";\n  auto meta_data = GenerateMetaData();\n  auto options = GenerateOptions();\n  printer->Print(vars, (main + end_function).c_str());\n  printer->Print(vars, (main + options + end_function).c_str());\n  printer->Print(vars, (main + meta_data +\n                        \", options?: Partial<grpc.CallOptions>\" + end_function)\n                           .c_str());\n}\n\nstatic void GenerateClientInterface(\n    const grpc_generator::Service* service, grpc_generator::Printer* printer,\n    std::map<grpc::string, grpc::string>* dictonary) {\n  auto vars = *dictonary;\n  printer->Print(vars, \"export interface I$ServiceName$Client {\\n\");\n  printer->Indent();\n  for (auto it = 0; it < service->method_count(); it++) {\n    auto method = service->method(it);\n    vars[\"MethodName\"] = method->name();\n    vars[\"OUTPUT\"] = GenerateNamespace(method->get_output_namespace_parts(),\n                                       method->get_output_type_name(), false);\n    vars[\"INPUT\"] = GenerateNamespace(method->get_input_namespace_parts(),\n                                      method->get_input_type_name(), false);\n    vars[\"ISPUBLIC\"] = \"\";\n\n    if (method->NoStreaming()) {\n      GenerateUnaryClientInterface(printer, &vars);\n      continue;\n    }\n    if (method->BidiStreaming()) {\n      GenerateDepluxStreamInterface(printer, &vars);\n      continue;\n    }\n\n    if (method->ClientStreaming()) {\n      GenerateClientWriteStreamInterface(printer, &vars);\n      continue;\n    }\n\n    if (method->ServerStreaming()) {\n      GenerateClientReadableStreamInterface(printer, &vars);\n      continue;\n    }\n  }\n  printer->Outdent();\n  printer->Print(\"}\\n\");\n}\n\nstatic void GenerateClientClassInterface(\n    const grpc_generator::Service* service, grpc_generator::Printer* printer,\n    std::map<grpc::string, grpc::string>* dictonary) {\n  auto vars = *dictonary;\n  printer->Print(vars,\n                 \"export class $ServiceName$Client extends grpc.Client \"\n                 \"implements I$ServiceName$Client {\\n\");\n  printer->Indent();\n  printer->Print(\n      \"constructor(address: string, credentials: grpc.ChannelCredentials, \"\n      \"options?: object);\\n\");\n  for (auto it = 0; it < service->method_count(); it++) {\n    auto method = service->method(it);\n    vars[\"MethodName\"] = method->name();\n    vars[\"OUTPUT\"] = GenerateNamespace(method->get_output_namespace_parts(),\n                                       method->get_output_type_name(), false);\n    vars[\"INPUT\"] = GenerateNamespace(method->get_input_namespace_parts(),\n                                      method->get_input_type_name(), false);\n    vars[\"ISPUBLIC\"] = \"public \";\n    if (method->NoStreaming()) {\n      GenerateUnaryClientInterface(printer, &vars);\n      continue;\n    }\n    if (method->BidiStreaming()) {\n      GenerateDepluxStreamInterface(printer, &vars);\n      continue;\n    }\n\n    if (method->ClientStreaming()) {\n      GenerateClientWriteStreamInterface(printer, &vars);\n      continue;\n    }\n\n    if (method->ServerStreaming()) {\n      GenerateClientReadableStreamInterface(printer, &vars);\n      continue;\n    }\n  }\n  printer->Outdent();\n  printer->Print(\"}\\n\");\n}\n}  // namespace\n\ngrpc::string GenerateInterface(grpc_generator::File* file,\n                               const grpc_generator::Service* service,\n                               const grpc::string& filename) {\n  grpc::string output;\n\n  std::set<grpc::string> generated_functions;\n  std::map<grpc::string, grpc::string> vars;\n\n  vars[\"PATH\"] = file->package();\n\n  if (!file->package().empty()) {\n    vars[\"PATH\"].append(\".\");\n  }\n\n  vars[\"ServiceName\"] = service->name();\n  vars[\"FBSFile\"] = service->name() + \"_fbs\";\n  vars[\"Filename\"] = filename;\n  auto printer = file->CreatePrinter(&output);\n\n  GenerateImports(service, &*printer, &vars, false);\n  GenerateMainInterface(service, &*printer, &vars);\n  printer->Print(\"\\n\");\n  GenerateClientInterface(service, &*printer, &vars);\n  printer->Print(\"\\n\");\n  GenerateClientClassInterface(service, &*printer, &vars);\n  return output;\n}\n}  // namespace grpc_ts_generator\n"
  },
  {
    "path": "grpc/src/compiler/ts_generator.h",
    "content": "#include <memory>\n#include <set>\n#include <vector>\n\n#include \"src/compiler/schema_interface.h\"\n\n#ifndef GRPC_CUSTOM_STRING\n#include <string>\n#define GRPC_CUSTOM_STRING std::string\n#endif\n\nnamespace grpc {\n\ntypedef GRPC_CUSTOM_STRING string;\n\n}  // namespace grpc\n\nnamespace grpc_ts_generator {\ngrpc::string Generate(grpc_generator::File* file,\n                      const grpc_generator::Service* service,\n                      const grpc::string& filename);\n\ngrpc::string GenerateInterface(grpc_generator::File* file,\n                               const grpc_generator::Service* service,\n                               const grpc::string& filename);\n}  // namespace grpc_ts_generator\n"
  },
  {
    "path": "grpc/tests/BUILD",
    "content": "load(\"@rules_cc//cc:defs.bzl\", \"cc_test\")\n\ncc_test(\n    name = \"grpc_test\",\n    srcs = [\n        \"grpctest.cpp\",\n        \"message_builder_test.cpp\",\n    ],\n    copts = [\"-Itests\"],\n    # This is required.\n    linkstatic = 1,\n    deps = [\n        \"//tests:monster_test_cc_fbs\",\n        \"//tests:monster_test_grpc\",\n        \"//tests:test_assert\",\n        \"//tests:test_builder\",\n        \"@com_github_grpc_grpc//:grpc++\",\n    ],\n)\n\ncc_test(\n    name = \"grpc_callback_compile_test\",\n    srcs = [\"grpctest_callback_compile.cpp\"],\n    copts = [\"-Itests\"],\n    linkstatic = 1,\n    deps = [\n        \"//tests:monster_test_cc_fbs\",\n        \"//tests:monster_test_grpc\",\n        \"@com_github_grpc_grpc//:grpc++\",\n    ],\n)\n\ncc_test(\n    name = \"grpc_callback_client_compile_test\",\n    srcs = [\"grpctest_callback_client_compile.cpp\"],\n    copts = [\"-Itests\"],\n    linkstatic = 1,\n    deps = [\n        \"//tests:monster_test_cc_fbs\",\n        \"//tests:monster_test_grpc\",\n        \"@com_github_grpc_grpc//:grpc++\",\n    ],\n)\n"
  },
  {
    "path": "grpc/tests/GameFactory.java",
    "content": "import MyGame.Example.Monster;\nimport MyGame.Example.Stat;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport java.nio.ByteBuffer;\n\nclass GameFactory {\n  public static Monster createMonster(\n      String monsterName, short nestedMonsterHp, short nestedMonsterMana) {\n    FlatBufferBuilder builder = new FlatBufferBuilder();\n\n    int name_offset = builder.createString(monsterName);\n    Monster.startMonster(builder);\n    Monster.addName(builder, name_offset);\n    Monster.addHp(builder, nestedMonsterHp);\n    Monster.addMana(builder, nestedMonsterMana);\n    int monster_offset = Monster.endMonster(builder);\n    Monster.finishMonsterBuffer(builder, monster_offset);\n\n    ByteBuffer buffer = builder.dataBuffer();\n    Monster monster = Monster.getRootAsMonster(buffer);\n    return monster;\n  }\n\n  public static Monster createMonsterFromStat(Stat stat, int seqNo) {\n    FlatBufferBuilder builder = new FlatBufferBuilder();\n    int name_offset = builder.createString(stat.id() + \" No.\" + seqNo);\n    Monster.startMonster(builder);\n    Monster.addName(builder, name_offset);\n    int monster_offset = Monster.endMonster(builder);\n    Monster.finishMonsterBuffer(builder, monster_offset);\n    Monster monster = Monster.getRootAsMonster(builder.dataBuffer());\n    return monster;\n  }\n\n  public static Stat createStat(String greeting, long val, int count) {\n    FlatBufferBuilder builder = new FlatBufferBuilder();\n    int statOffset = Stat.createStat(builder, builder.createString(greeting), val, count);\n    builder.finish(statOffset);\n    Stat stat = Stat.getRootAsStat(builder.dataBuffer());\n    return stat;\n  }\n}\n"
  },
  {
    "path": "grpc/tests/JavaGrpcTest.java",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport MyGame.Example.Monster;\nimport MyGame.Example.MonsterStorageGrpc;\nimport MyGame.Example.Stat;\nimport io.grpc.ManagedChannel;\nimport io.grpc.ManagedChannelBuilder;\nimport io.grpc.Server;\nimport io.grpc.ServerBuilder;\nimport io.grpc.stub.StreamObserver;\nimport java.io.IOException;\nimport java.util.Iterator;\nimport java.util.concurrent.CountDownLatch;\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.atomic.AtomicInteger;\nimport java.util.concurrent.atomic.AtomicReference;\nimport org.junit.Assert;\n\n/** Demonstrates basic client-server interaction using grpc-java over netty. */\npublic class JavaGrpcTest {\n  static final String BIG_MONSTER_NAME = \"Cyberdemon\";\n  static final short nestedMonsterHp = 600;\n  static final short nestedMonsterMana = 1024;\n  static final int numStreamedMsgs = 10;\n  static final int timeoutMs = 3000;\n  static Server server;\n  static ManagedChannel channel;\n  static MonsterStorageGrpc.MonsterStorageBlockingStub blockingStub;\n  static MonsterStorageGrpc.MonsterStorageStub asyncStub;\n\n  static class MyService extends MonsterStorageGrpc.MonsterStorageImplBase {\n    @Override\n    public void store(Monster request, io.grpc.stub.StreamObserver<Stat> responseObserver) {\n      Assert.assertEquals(request.name(), BIG_MONSTER_NAME);\n      Assert.assertEquals(request.hp(), nestedMonsterHp);\n      Assert.assertEquals(request.mana(), nestedMonsterMana);\n      System.out.println(\"Received store request from \" + request.name());\n      // Create a response from the incoming request name.\n      Stat stat = GameFactory.createStat(\"Hello \" + request.name(), 100, 10);\n      responseObserver.onNext(stat);\n      responseObserver.onCompleted();\n    }\n\n    @Override\n    public void retrieve(Stat request, io.grpc.stub.StreamObserver<Monster> responseObserver) {\n      // Create 10 monsters for streaming response.\n      for (int i = 0; i < numStreamedMsgs; i++) {\n        Monster monster = GameFactory.createMonsterFromStat(request, i);\n        responseObserver.onNext(monster);\n      }\n      responseObserver.onCompleted();\n    }\n\n    @Override\n    public StreamObserver<Monster> getMaxHitPoint(final StreamObserver<Stat> responseObserver) {\n      return computeMinMax(responseObserver, false);\n    }\n\n    @Override\n    public StreamObserver<Monster> getMinMaxHitPoints(final StreamObserver<Stat> responseObserver) {\n      return computeMinMax(responseObserver, true);\n    }\n\n    private StreamObserver<Monster> computeMinMax(\n        final StreamObserver<Stat> responseObserver, final boolean includeMin) {\n      final AtomicInteger maxHp = new AtomicInteger(Integer.MIN_VALUE);\n      final AtomicReference<String> maxHpMonsterName = new AtomicReference<String>();\n      final AtomicInteger maxHpCount = new AtomicInteger();\n\n      final AtomicInteger minHp = new AtomicInteger(Integer.MAX_VALUE);\n      final AtomicReference<String> minHpMonsterName = new AtomicReference<String>();\n      final AtomicInteger minHpCount = new AtomicInteger();\n\n      return new StreamObserver<Monster>() {\n        public void onNext(Monster monster) {\n          if (monster.hp() > maxHp.get()) {\n            // Found a monster of higher hit points.\n            maxHp.set(monster.hp());\n            maxHpMonsterName.set(monster.name());\n            maxHpCount.set(1);\n          } else if (monster.hp() == maxHp.get()) {\n            // Count how many times we saw a monster of current max hit points.\n            maxHpCount.getAndIncrement();\n          }\n\n          if (monster.hp() < minHp.get()) {\n            // Found a monster of a lower hit points.\n            minHp.set(monster.hp());\n            minHpMonsterName.set(monster.name());\n            minHpCount.set(1);\n          } else if (monster.hp() == minHp.get()) {\n            // Count how many times we saw a monster of current min hit points.\n            minHpCount.getAndIncrement();\n          }\n        }\n\n        public void onCompleted() {\n          Stat maxHpStat =\n              GameFactory.createStat(maxHpMonsterName.get(), maxHp.get(), maxHpCount.get());\n          // Send max hit points first.\n          responseObserver.onNext(maxHpStat);\n          if (includeMin) {\n            // Send min hit points.\n            Stat minHpStat =\n                GameFactory.createStat(minHpMonsterName.get(), minHp.get(), minHpCount.get());\n            responseObserver.onNext(minHpStat);\n          }\n          responseObserver.onCompleted();\n        }\n\n        public void onError(Throwable t) {\n          // Not expected\n          Assert.fail();\n        }\n        ;\n      };\n    }\n  }\n\n  @org.junit.BeforeClass\n  public static void startServer() throws IOException {\n    server = ServerBuilder.forPort(0).addService(new MyService()).build().start();\n    int port = server.getPort();\n    channel =\n        ManagedChannelBuilder.forAddress(\"localhost\", port)\n            // Channels are secure by default (via SSL/TLS). For the example we disable TLS to avoid\n            // needing certificates.\n            .usePlaintext()\n            .directExecutor()\n            .build();\n    blockingStub = MonsterStorageGrpc.newBlockingStub(channel);\n    asyncStub = MonsterStorageGrpc.newStub(channel);\n  }\n\n  @org.junit.Test\n  public void testUnary() throws IOException {\n    Monster monsterRequest =\n        GameFactory.createMonster(BIG_MONSTER_NAME, nestedMonsterHp, nestedMonsterMana);\n    Stat stat = blockingStub.store(monsterRequest);\n    Assert.assertEquals(stat.id(), \"Hello \" + BIG_MONSTER_NAME);\n    System.out.println(\"Received stat response from service: \" + stat.id());\n  }\n\n  @org.junit.Test\n  public void testServerStreaming() throws IOException {\n    Monster monsterRequest =\n        GameFactory.createMonster(BIG_MONSTER_NAME, nestedMonsterHp, nestedMonsterMana);\n    Stat stat = blockingStub.store(monsterRequest);\n    Iterator<Monster> iterator = blockingStub.retrieve(stat);\n    int counter = 0;\n    while (iterator.hasNext()) {\n      Monster m = iterator.next();\n      System.out.println(\"Received monster \" + m.name());\n      counter++;\n    }\n    Assert.assertEquals(counter, numStreamedMsgs);\n    System.out.println(\"FlatBuffers GRPC client/server test: completed successfully\");\n  }\n\n  @org.junit.Test\n  public void testClientStreaming() throws IOException, InterruptedException {\n    final AtomicReference<Stat> maxHitStat = new AtomicReference<Stat>();\n    final CountDownLatch streamAlive = new CountDownLatch(1);\n\n    StreamObserver<Stat> statObserver =\n        new StreamObserver<Stat>() {\n          public void onCompleted() {\n            streamAlive.countDown();\n          }\n\n          public void onError(Throwable ex) {}\n\n          public void onNext(Stat stat) {\n            maxHitStat.set(stat);\n          }\n        };\n    StreamObserver<Monster> monsterStream = asyncStub.getMaxHitPoint(statObserver);\n    short count = 10;\n    for (short i = 0; i < count; ++i) {\n      Monster monster =\n          GameFactory.createMonster(\n              BIG_MONSTER_NAME + i, (short) (nestedMonsterHp * i), nestedMonsterMana);\n      monsterStream.onNext(monster);\n    }\n    monsterStream.onCompleted();\n    // Wait a little bit for the server to send the stats of the monster with the max hit-points.\n    streamAlive.await(timeoutMs, TimeUnit.MILLISECONDS);\n    Assert.assertEquals(maxHitStat.get().id(), BIG_MONSTER_NAME + (count - 1));\n    Assert.assertEquals(maxHitStat.get().val(), nestedMonsterHp * (count - 1));\n    Assert.assertEquals(maxHitStat.get().count(), 1);\n  }\n\n  @org.junit.Test\n  public void testBiDiStreaming() throws IOException, InterruptedException {\n    final AtomicReference<Stat> maxHitStat = new AtomicReference<Stat>();\n    final AtomicReference<Stat> minHitStat = new AtomicReference<Stat>();\n    final CountDownLatch streamAlive = new CountDownLatch(1);\n\n    StreamObserver<Stat> statObserver =\n        new StreamObserver<Stat>() {\n          public void onCompleted() {\n            streamAlive.countDown();\n          }\n\n          public void onError(Throwable ex) {}\n\n          public void onNext(Stat stat) {\n            // We expect the server to send the max stat first and then the min stat.\n            if (maxHitStat.get() == null) {\n              maxHitStat.set(stat);\n            } else {\n              minHitStat.set(stat);\n            }\n          }\n        };\n    StreamObserver<Monster> monsterStream = asyncStub.getMinMaxHitPoints(statObserver);\n    short count = 10;\n    for (short i = 0; i < count; ++i) {\n      Monster monster =\n          GameFactory.createMonster(\n              BIG_MONSTER_NAME + i, (short) (nestedMonsterHp * i), nestedMonsterMana);\n      monsterStream.onNext(monster);\n    }\n    monsterStream.onCompleted();\n\n    // Wait a little bit for the server to send the stats of the monster with the max and min\n    // hit-points.\n    streamAlive.await(timeoutMs, TimeUnit.MILLISECONDS);\n\n    Assert.assertEquals(maxHitStat.get().id(), BIG_MONSTER_NAME + (count - 1));\n    Assert.assertEquals(maxHitStat.get().val(), nestedMonsterHp * (count - 1));\n    Assert.assertEquals(maxHitStat.get().count(), 1);\n\n    Assert.assertEquals(minHitStat.get().id(), BIG_MONSTER_NAME + 0);\n    Assert.assertEquals(minHitStat.get().val(), nestedMonsterHp * 0);\n    Assert.assertEquals(minHitStat.get().count(), 1);\n  }\n}\n"
  },
  {
    "path": "grpc/tests/go_test.go",
    "content": "package testing\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n\t\"github.com/google/flatbuffers/tests/MyGame/Example\"\n\n\t\"context\"\n\t\"net\"\n\t\"testing\"\n\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/encoding\"\n)\n\ntype server struct {\n\tExample.UnimplementedMonsterStorageServer\n}\n\n// test used to send and receive in grpc methods\nvar test = \"Flatbuffers\"\nvar addr = \"0.0.0.0:50051\"\n\n// gRPC server store method\nfunc (s *server) Store(context context.Context, in *Example.Monster) (*flatbuffers.Builder, error) {\n\tb := flatbuffers.NewBuilder(0)\n\ti := b.CreateString(test)\n\tExample.StatStart(b)\n\tExample.StatAddId(b, i)\n\tb.Finish(Example.StatEnd(b))\n\treturn b, nil\n\n}\n\n// gRPC server retrieve method\nfunc (s *server) Retrieve(context context.Context, in *Example.Stat) (*flatbuffers.Builder, error) {\n\tb := flatbuffers.NewBuilder(0)\n\ti := b.CreateString(test)\n\tExample.MonsterStart(b)\n\tExample.MonsterAddName(b, i)\n\tb.Finish(Example.MonsterEnd(b))\n\treturn b, nil\n}\n\nfunc StoreClient(c Example.MonsterStorageClient, t *testing.T) {\n\tb := flatbuffers.NewBuilder(0)\n\ti := b.CreateString(test)\n\tExample.MonsterStart(b)\n\tExample.MonsterAddName(b, i)\n\tb.Finish(Example.MonsterEnd(b))\n\tout, err := c.Store(context.Background(), b)\n\tif err != nil {\n\t\tt.Fatalf(\"Store client failed: %v\", err)\n\t}\n\tif string(out.Id()) != test {\n\t\tt.Errorf(\"StoreClient failed: expected=%s, got=%s\\n\", test, out.Id())\n\t\tt.Fail()\n\t}\n}\n\nfunc RetrieveClient(c Example.MonsterStorageClient, t *testing.T) {\n\tb := flatbuffers.NewBuilder(0)\n\ti := b.CreateString(test)\n\tExample.StatStart(b)\n\tExample.StatAddId(b, i)\n\tb.Finish(Example.StatEnd(b))\n\tout, err := c.Retrieve(context.Background(), b)\n\tif err != nil {\n\t\tt.Fatalf(\"Retrieve client failed: %v\", err)\n\t}\n\tmonster, err := out.Recv()\n\tif err != nil {\n\t\tt.Fatalf(\"Recv failed: %v\", err)\n\t}\n\tif string(monster.Name()) != test {\n\t\tt.Errorf(\"RetrieveClient failed: expected=%s, got=%s\\n\", test, monster.Name())\n\t\tt.Fail()\n\t}\n}\n\nfunc TestGRPC(t *testing.T) {\n\tlis, err := net.Listen(\"tcp\", addr)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to listen: %v\", err)\n\t}\n\tser := grpc.NewServer()\n\tencoding.RegisterCodec(flatbuffers.FlatbuffersCodec{})\n\tExample.RegisterMonsterStorageServer(ser, &server{})\n\tgo func() {\n\t\tif err := ser.Serve(lis); err != nil {\n\t\t\tt.Fatalf(\"Failed to serve: %v\", err)\n\t\t\tt.FailNow()\n\t\t}\n\t}()\n\tconn, err := grpc.Dial(addr, grpc.WithInsecure(), grpc.WithCodec(flatbuffers.FlatbuffersCodec{}))\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to connect: %v\", err)\n\t}\n\tdefer conn.Close()\n\tclient := Example.NewMonsterStorageClient(conn)\n\tStoreClient(client, t)\n\tRetrieveClient(client, t)\n}\n"
  },
  {
    "path": "grpc/tests/grpctest.cpp",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include <grpcpp/grpcpp.h>\n\n#include <condition_variable>\n#include <thread>\n\n#include \"monster_test.grpc.fb.h\"\n#include \"monster_test_generated.h\"\n#include \"test_assert.h\"\n\nusing namespace MyGame::Example;\nusing flatbuffers::FlatBufferBuilder;\nusing flatbuffers::grpc::MessageBuilder;\n\nvoid message_builder_tests();\n\n// The callback implementation of our server, that derives from the generated\n// code. It implements all rpcs specified in the FlatBuffers schema.\nclass ServiceImpl final : public MyGame::Example::MonsterStorage::Service {\n  virtual ::grpc::Status Store(\n      ::grpc::ServerContext* context,\n      const flatbuffers::grpc::Message<Monster>* request,\n      flatbuffers::grpc::Message<Stat>* response) override {\n    // Create a response from the incoming request name.\n    fbb_.Clear();\n    auto stat_offset = CreateStat(\n        fbb_, fbb_.CreateString(\"Hello, \" + request->GetRoot()->name()->str()));\n    fbb_.Finish(stat_offset);\n    // Transfer ownership of the message to gRPC\n    *response = fbb_.ReleaseMessage<Stat>();\n    return grpc::Status::OK;\n  }\n  virtual ::grpc::Status Retrieve(\n      ::grpc::ServerContext* context,\n      const flatbuffers::grpc::Message<Stat>* request,\n      ::grpc::ServerWriter<flatbuffers::grpc::Message<Monster>>* writer)\n      override {\n    for (int i = 0; i < 5; i++) {\n      fbb_.Clear();\n      // Create 5 monsters for resposne.\n      auto monster_offset =\n          CreateMonster(fbb_, 0, 0, 0,\n                        fbb_.CreateString(request->GetRoot()->id()->str() +\n                                          \" No.\" + std::to_string(i)));\n      fbb_.Finish(monster_offset);\n\n      flatbuffers::grpc::Message<Monster> monster =\n          fbb_.ReleaseMessage<Monster>();\n\n      // Send monster to client using streaming.\n      writer->Write(monster);\n    }\n    return grpc::Status::OK;\n  }\n\n private:\n  flatbuffers::grpc::MessageBuilder fbb_;\n};\n\n// Track the server instance, so we can terminate it later.\ngrpc::Server* server_instance = nullptr;\n// Mutex to protec this variable.\nstd::mutex wait_for_server;\nstd::condition_variable server_instance_cv;\n\n// This function implements the server thread.\nvoid RunServer() {\n  auto server_address = \"0.0.0.0:50051\";\n  // Callback interface we implemented above.\n  ServiceImpl service;\n  grpc::ServerBuilder builder;\n  builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());\n  builder.RegisterService(&service);\n\n  // Start the server. Lock to change the variable we're changing.\n  wait_for_server.lock();\n  server_instance = builder.BuildAndStart().release();\n  wait_for_server.unlock();\n  server_instance_cv.notify_one();\n\n  std::cout << \"Server listening on \" << server_address << std::endl;\n  // This will block the thread and serve requests.\n  server_instance->Wait();\n}\n\ntemplate <class Builder>\nvoid StoreRPC(MonsterStorage::Stub* stub) {\n  Builder fbb;\n  grpc::ClientContext context;\n  // Build a request with the name set.\n  auto monster_offset = CreateMonster(fbb, 0, 0, 0, fbb.CreateString(\"Fred\"));\n  MessageBuilder mb(std::move(fbb));\n  mb.Finish(monster_offset);\n  auto request = mb.ReleaseMessage<Monster>();\n  flatbuffers::grpc::Message<Stat> response;\n\n  // The actual RPC.\n  auto status = stub->Store(&context, request, &response);\n\n  if (status.ok()) {\n    auto resp = response.GetRoot()->id();\n    std::cout << \"RPC response: \" << resp->str() << std::endl;\n  } else {\n    std::cout << \"RPC failed\" << std::endl;\n  }\n}\n\ntemplate <class Builder>\nvoid RetrieveRPC(MonsterStorage::Stub* stub) {\n  Builder fbb;\n  grpc::ClientContext context;\n  fbb.Clear();\n  auto stat_offset = CreateStat(fbb, fbb.CreateString(\"Fred\"));\n  fbb.Finish(stat_offset);\n  auto request = MessageBuilder(std::move(fbb)).ReleaseMessage<Stat>();\n\n  flatbuffers::grpc::Message<Monster> response;\n  auto stream = stub->Retrieve(&context, request);\n  while (stream->Read(&response)) {\n    auto resp = response.GetRoot()->name();\n    std::cout << \"RPC Streaming response: \" << resp->str() << std::endl;\n  }\n}\n\nint grpc_server_test() {\n  // Launch server.\n  std::thread server_thread(RunServer);\n\n  // wait for server to spin up.\n  std::unique_lock<std::mutex> lock(wait_for_server);\n  while (!server_instance) server_instance_cv.wait(lock);\n\n  // Now connect the client.\n  auto channel = grpc::CreateChannel(\"localhost:50051\",\n                                     grpc::InsecureChannelCredentials());\n  auto stub = MyGame::Example::MonsterStorage::NewStub(channel);\n\n  StoreRPC<MessageBuilder>(stub.get());\n  StoreRPC<FlatBufferBuilder>(stub.get());\n\n  RetrieveRPC<MessageBuilder>(stub.get());\n  RetrieveRPC<FlatBufferBuilder>(stub.get());\n\n#if !FLATBUFFERS_GRPC_DISABLE_AUTO_VERIFICATION\n  {\n    // Test that an invalid request errors out correctly\n    grpc::ClientContext context;\n    flatbuffers::grpc::Message<Monster> request;  // simulate invalid message\n    flatbuffers::grpc::Message<Stat> response;\n    auto status = stub->Store(&context, request, &response);\n    // The rpc status should be INTERNAL to indicate a verification error. This\n    // matches the protobuf gRPC status code for an unparseable message.\n    assert(!status.ok());\n    assert(status.error_code() == ::grpc::StatusCode::INTERNAL);\n    assert(strcmp(status.error_message().c_str(),\n                  \"Message verification failed\") == 0);\n  }\n#endif\n\n  server_instance->Shutdown();\n\n  server_thread.join();\n\n  delete server_instance;\n\n  return 0;\n}\n\nint main(int /*argc*/, const char* /*argv*/[]) {\n  message_builder_tests();\n  grpc_server_test();\n\n  if (!testing_fails) {\n    TEST_OUTPUT_LINE(\"ALL TESTS PASSED\");\n    return 0;\n  } else {\n    TEST_OUTPUT_LINE(\"%d FAILED TESTS\", testing_fails);\n    return 1;\n  }\n}\n"
  },
  {
    "path": "grpc/tests/grpctest.py",
    "content": "from __future__ import print_function\n\nfrom concurrent import futures\nimport os\nimport sys\n\nimport flatbuffers\nimport grpc\n\nsys.path.append(os.path.join(os.path.dirname(__file__), \"..\", \"..\", \"tests\"))\nimport MyGame.Example.Monster as Monster\nimport MyGame.Example.Stat as Stat\nimport MyGame.Example.Vec3 as Vec3\nimport MyGame.Example.Test as Test\nimport MyGame.Example.monster_test_grpc_fb as monster_grpc_fb\n\n\ntest_stat_id = \"test_stat_id\"\ntest_stat_val = 8\ntest_stat_count = 1\n\ntest_monster_name1 = \"test_monster_name1\"\ntest_monster_name2 = \"test_monster_name2\"\ntest_string = \"test_string\"\ntest_color = 2\ntest_X = 3.0\ntest_Y = 2.0\ntest_Z = 6.0\ntest_test1 = 4.0\ntest_a = 8\ntest_b = 5\ntest_hp = 67\ntest_inventory = [1, 1, 2, 3, 5, 8]\ntest_testtype = 4\n\ntest_monsters_name_retrieve = [\"big_monster\", \"small_monster\"]\ntest_no_of_monsters = 2\n\n\nclass MonsterStorage(monster_grpc_fb.MonsterStorageServicer):\n\n  def Store(self, request, context):\n\n    m = Monster.Monster().GetRootAsMonster(request, 0)\n\n    assert m.Name().decode(\"utf-8\") == test_monster_name1\n\n    assert m.Pos().X() == test_X\n    assert m.Pos().Y() == test_Y\n    assert m.Pos().Z() == test_Z\n    assert m.Pos().Test1() == test_test1\n    assert m.Pos().Test2() == test_color\n    test3 = Test.Test()\n    assert m.Pos().Test3(test3).A() == test_a\n    assert m.Pos().Test3(test3).B() == test_b\n\n    assert m.Hp() == test_hp\n\n    assert m.Color() == test_color\n\n    assert m.InventoryLength() == len(test_inventory)\n    for i in range(0, len(test_inventory)):\n      assert m.Inventory(i) == test_inventory[len(test_inventory) - i - 1]\n\n    assert m.TestType() == test_testtype\n\n    assert m.Test() is not None\n    table = m.Test()\n\n    m2 = Monster.Monster()\n    m2.Init(table.Bytes, table.Pos)\n    assert m2.Name().decode(\"utf-8\") == test_monster_name2\n\n    m3 = m.Enemy()\n    assert m3.Name().decode(\"utf-8\") == test_monster_name2\n\n    assert m.Testarrayofstring(0).decode(\"utf-8\") == test_string\n\n    b = flatbuffers.Builder(0)\n    i = b.CreateString(test_stat_id)\n    Stat.StatStart(b)\n    Stat.StatAddId(b, i)\n    Stat.StatAddVal(b, test_stat_val)\n    Stat.StatAddCount(b, test_stat_count)\n    b.Finish(Stat.StatEnd(b))\n    return bytes(b.Output())\n\n  def Retrieve(self, request, context):\n\n    s = Stat.Stat().GetRootAsStat(request, 0)\n\n    no_of_monsters = test_no_of_monsters\n    for i in range(0, no_of_monsters):\n      b = flatbuffers.Builder(0)\n      i = b.CreateString(test_monsters_name_retrieve[i])\n      Monster.MonsterStart(b)\n      Monster.MonsterAddName(b, i)\n      b.Finish(Monster.MonsterEnd(b))\n      yield bytes(b.Output())\n\n\ndef serve():\n\n  server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))\n  monster_grpc_fb.add_MonsterStorageServicer_to_server(MonsterStorage(), server)\n  server.add_insecure_port(\"[::]:50051\")\n\n  server.start()\n\n  run()\n\n\ndef run():\n\n  channel = grpc.insecure_channel(\"127.0.0.1:50051\")\n  stub = monster_grpc_fb.MonsterStorageStub(channel)\n\n  b = flatbuffers.Builder(0)\n  name2 = b.CreateString(test_monster_name2)\n  name1 = b.CreateString(test_monster_name1)\n  Monster.MonsterStart(b)\n  Monster.MonsterAddName(b, name2)\n  monster2 = Monster.MonsterEnd(b)\n  test1 = b.CreateString(test_string)\n\n  Monster.MonsterStartInventoryVector(b, len(test_inventory))\n  for i in range(0, len(test_inventory)):\n    b.PrependByte(test_inventory[i])\n  inv = b.EndVector()\n\n  Monster.MonsterStartTest4Vector(b, 2)\n  Test.CreateTest(b, 10, 20)\n  Test.CreateTest(b, 30, 40)\n  test4 = b.EndVector()\n\n  Monster.MonsterStartTestarrayofstringVector(b, 1)\n  b.PrependUOffsetTRelative(test1)\n  test_array_of_string = b.EndVector()\n\n  Monster.MonsterStart(b)\n\n  Monster.MonsterAddHp(b, test_hp)\n  Monster.MonsterAddName(b, name1)\n  Monster.MonsterAddColor(b, test_color)\n  pos = Vec3.CreateVec3(\n      b, test_X, test_Y, test_Z, test_test1, test_color, test_a, test_b\n  )\n  Monster.MonsterAddPos(b, pos)\n  Monster.MonsterAddInventory(b, inv)\n  Monster.MonsterAddTestType(b, test_testtype)\n  Monster.MonsterAddTest(b, monster2)\n  Monster.MonsterAddTest4(b, test4)\n  Monster.MonsterAddEnemy(b, monster2)\n  Monster.MonsterAddTestarrayofstring(b, test_array_of_string)\n  monster = Monster.MonsterEnd(b)\n\n  b.Finish(monster)\n\n  stat_response = stub.Store(bytes(b.Output()))\n\n  s = Stat.Stat().GetRootAsStat(stat_response, 0)\n\n  assert s.Id().decode(\"utf-8\") == test_stat_id\n  assert s.Val() == test_stat_val\n  assert s.Count() == test_stat_count\n\n  monster_reponses = stub.Retrieve(stat_response)\n  count = 0\n  for monster_reponse in monster_reponses:\n    m = Monster.Monster().GetRootAsMonster(monster_reponse, 0)\n    assert m.Name().decode(\"utf-8\") == test_monsters_name_retrieve[count]\n    count = count + 1\n\n\nif __name__ == \"__main__\":\n  serve()\n"
  },
  {
    "path": "grpc/tests/grpctest_callback_client_compile.cpp",
    "content": "// Verifies that the generated gRPC callback client stub methods are present.\n// This is a compile-time only test: it never performs an actual RPC.\n// It supplements grpctest_callback_compile.cpp (server side) by checking\n// client-side async_ / reactor entry points.\n\n#include <type_traits>\n\n#include \"monster_test.grpc.fb.h\"\n\n#if defined(FLATBUFFERS_GENERATED_GRPC_CALLBACK_API) && \\\n    defined(GRPC_CALLBACK_API_NONEXPERIMENTAL)\nusing Stub = MyGame::Example::MonsterStorage::Stub;\nusing namespace MyGame::Example;  // NOLINT\n\n// Unary async overloads\nstatic_assert(std::is_member_function_pointer<\n                  decltype(static_cast<void (Stub::*)(\n                               ::grpc::ClientContext*,\n                               const flatbuffers::grpc::Message<Monster>&,\n                               flatbuffers::grpc::Message<Stat>*,\n                               std::function<void(::grpc::Status)>)>(\n                      &Stub::async_Store))>::value,\n              \"Function-form unary async_Store missing\");\nstatic_assert(\n    std::is_member_function_pointer<\n        decltype(static_cast<void (Stub::*)(\n                     ::grpc::ClientContext*,\n                     const flatbuffers::grpc::Message<Monster>&,\n                     flatbuffers::grpc::Message<Stat>*,\n                     ::grpc::ClientUnaryReactor*)>(&Stub::async_Store))>::value,\n    \"Reactor-form unary async_Store missing\");\n\n// Streaming reactor entry points\nstatic_assert(\n    std::is_member_function_pointer<\n        decltype(static_cast<void (Stub::*)(\n                     ::grpc::ClientContext*,\n                     const flatbuffers::grpc::Message<Stat>&,\n                     ::grpc::ClientReadReactor<flatbuffers::grpc::Message<\n                         Monster> >*)>(&Stub::async_Retrieve))>::value,\n    \"Server streaming reactor async_Retrieve missing\");\nstatic_assert(\n    std::is_member_function_pointer<\n        decltype(static_cast<void (Stub::*)(\n                     ::grpc::ClientContext*, flatbuffers::grpc::Message<Stat>*,\n                     ::grpc::ClientWriteReactor<flatbuffers::grpc::Message<\n                         Monster> >*)>(&Stub::async_GetMaxHitPoint))>::value,\n    \"Client streaming reactor async_GetMaxHitPoint missing\");\nstatic_assert(std::is_member_function_pointer<\n                  decltype(static_cast<void (Stub::*)(\n                               ::grpc::ClientContext*,\n                               ::grpc::ClientBidiReactor<\n                                   flatbuffers::grpc::Message<Monster>,\n                                   flatbuffers::grpc::Message<Stat> >*)>(\n                      &Stub::async_GetMinMaxHitPoints))>::value,\n              \"Bidi streaming reactor async_GetMinMaxHitPoints missing\");\n#endif  // FLATBUFFERS_GENERATED_GRPC_CALLBACK_API &&\n        // GRPC_CALLBACK_API_NONEXPERIMENTAL\n\nint main() { return 0; }\n"
  },
  {
    "path": "grpc/tests/grpctest_callback_compile.cpp",
    "content": "#include \"monster_test.grpc.fb.h\"\n\n// This test only verifies that the generated CallbackService compiles when the\n// callback API is available. It does not run any RPCs.\n\n#if defined(FLATBUFFERS_GENERATED_GRPC_CALLBACK_API) && \\\n    defined(GRPC_CALLBACK_API_NONEXPERIMENTAL)\nclass CallbackServiceImpl\n    : public MyGame::Example::MonsterStorage::CallbackService {\n public:\n  // For brevity we don't override methods; user code will provide reactors.\n};\n#endif\n\nint main() {\n#if defined(FLATBUFFERS_GENERATED_GRPC_CALLBACK_API) && \\\n    defined(GRPC_CALLBACK_API_NONEXPERIMENTAL)\n  CallbackServiceImpl svc;\n  (void)svc;  // suppress unused\n#endif\n  return 0;\n}\n"
  },
  {
    "path": "grpc/tests/java-grpc-test.sh",
    "content": "#!/bin/sh\n\n# NOTE: make sure `mvn install` in /gprc is executed before running this test\nmvn test\n"
  },
  {
    "path": "grpc/tests/message_builder_test.cpp",
    "content": "#include \"flatbuffers/grpc.h\"\n#include \"monster_test_generated.h\"\n#include \"test_assert.h\"\n#include \"test_builder.h\"\n\nusing MyGame::Example::Any_NONE;\nusing MyGame::Example::CreateStat;\nusing MyGame::Example::Vec3;\n\nbool verify(flatbuffers::grpc::Message<Monster>& msg,\n            const std::string& expected_name, Color expected_color) {\n  const Monster* monster = msg.GetRoot();\n  const auto name = monster->name()->str();\n  const auto color = monster->color();\n  TEST_EQ(name, expected_name);\n  TEST_EQ(color, expected_color);\n  return (name == expected_name) && (color == expected_color);\n}\n\nbool release_n_verify(flatbuffers::grpc::MessageBuilder& mbb,\n                      const std::string& expected_name, Color expected_color) {\n  flatbuffers::grpc::Message<Monster> msg = mbb.ReleaseMessage<Monster>();\n  return verify(msg, expected_name, expected_color);\n}\n\nvoid builder_move_assign_after_releaseraw_test(\n    flatbuffers::grpc::MessageBuilder dst) {\n  auto root_offset1 = populate1(dst);\n  dst.Finish(root_offset1);\n  size_t size, offset;\n  ::grpc::Slice slice;\n  dst.ReleaseRaw(size, offset, slice);\n  flatbuffers::FlatBufferBuilder src;\n  auto root_offset2 = populate2(src);\n  src.Finish(root_offset2);\n  auto src_size = src.GetSize();\n  // Move into a released builder.\n  dst = std::move(src);\n  TEST_EQ(dst.GetSize(), src_size);\n  TEST_ASSERT(release_n_verify(dst, m2_name(), m2_color()));\n  TEST_EQ(src.GetSize(), 0);\n}\n\ntemplate <class SrcBuilder>\nstruct BuilderReuseTests<flatbuffers::grpc::MessageBuilder, SrcBuilder> {\n  static void builder_reusable_after_release_message_test(\n      TestSelector selector) {\n    if (!selector.count(REUSABLE_AFTER_RELEASE_MESSAGE)) {\n      return;\n    }\n\n    flatbuffers::grpc::MessageBuilder mb;\n    std::vector<flatbuffers::grpc::Message<Monster>> buffers;\n    for (int i = 0; i < 5; ++i) {\n      auto root_offset1 = populate1(mb);\n      mb.Finish(root_offset1);\n      buffers.push_back(mb.ReleaseMessage<Monster>());\n      TEST_ASSERT_FUNC(verify(buffers[i], m1_name(), m1_color()));\n    }\n  }\n\n  static void builder_reusable_after_release_test(TestSelector selector) {\n    if (!selector.count(REUSABLE_AFTER_RELEASE)) {\n      return;\n    }\n\n    // FIXME: Populate-Release loop fails assert(GRPC_SLICE_IS_EMPTY(slice_)) in\n    // SliceAllocator::allocate in the second iteration.\n\n    flatbuffers::grpc::MessageBuilder mb;\n    std::vector<flatbuffers::DetachedBuffer> buffers;\n    for (int i = 0; i < 2; ++i) {\n      auto root_offset1 = populate1(mb);\n      mb.Finish(root_offset1);\n      buffers.push_back(mb.Release());\n      TEST_ASSERT_FUNC(verify(buffers[i], m1_name(), m1_color()));\n    }\n  }\n\n  static void builder_reusable_after_releaseraw_test(TestSelector selector) {\n    if (!selector.count(REUSABLE_AFTER_RELEASE_RAW)) {\n      return;\n    }\n\n    flatbuffers::grpc::MessageBuilder mb;\n    for (int i = 0; i < 5; ++i) {\n      auto root_offset1 = populate1(mb);\n      mb.Finish(root_offset1);\n      size_t size, offset;\n      ::grpc::Slice slice;\n      const uint8_t* buf = mb.ReleaseRaw(size, offset, slice);\n      TEST_ASSERT_FUNC(verify(buf, offset, m1_name(), m1_color()));\n    }\n  }\n\n  static void builder_reusable_after_release_and_move_assign_test(\n      TestSelector selector) {\n    if (!selector.count(REUSABLE_AFTER_RELEASE_AND_MOVE_ASSIGN)) {\n      return;\n    }\n\n    // FIXME: Release-move_assign loop fails assert(p ==\n    // GRPC_SLICE_START_PTR(slice_)) in DetachedBuffer destructor after all the\n    // iterations\n\n    flatbuffers::grpc::MessageBuilder dst;\n    std::vector<flatbuffers::DetachedBuffer> buffers;\n\n    for (int i = 0; i < 2; ++i) {\n      auto root_offset1 = populate1(dst);\n      dst.Finish(root_offset1);\n      buffers.push_back(dst.Release());\n      TEST_ASSERT_FUNC(verify(buffers[i], m1_name(), m1_color()));\n\n      // bring dst back to life.\n      SrcBuilder src;\n      dst = std::move(src);\n      TEST_EQ_FUNC(dst.GetSize(), 0);\n      TEST_EQ_FUNC(src.GetSize(), 0);\n    }\n  }\n\n  static void builder_reusable_after_release_message_and_move_assign_test(\n      TestSelector selector) {\n    if (!selector.count(REUSABLE_AFTER_RELEASE_MESSAGE_AND_MOVE_ASSIGN)) {\n      return;\n    }\n\n    flatbuffers::grpc::MessageBuilder dst;\n    std::vector<flatbuffers::grpc::Message<Monster>> buffers;\n\n    for (int i = 0; i < 5; ++i) {\n      auto root_offset1 = populate1(dst);\n      dst.Finish(root_offset1);\n      buffers.push_back(dst.ReleaseMessage<Monster>());\n      TEST_ASSERT_FUNC(verify(buffers[i], m1_name(), m1_color()));\n\n      // bring dst back to life.\n      SrcBuilder src;\n      dst = std::move(src);\n      TEST_EQ_FUNC(dst.GetSize(), 0);\n      TEST_EQ_FUNC(src.GetSize(), 0);\n    }\n  }\n\n  static void builder_reusable_after_releaseraw_and_move_assign_test(\n      TestSelector selector) {\n    if (!selector.count(REUSABLE_AFTER_RELEASE_RAW_AND_MOVE_ASSIGN)) {\n      return;\n    }\n\n    flatbuffers::grpc::MessageBuilder dst;\n    for (int i = 0; i < 5; ++i) {\n      auto root_offset1 = populate1(dst);\n      dst.Finish(root_offset1);\n      size_t size, offset;\n      ::grpc::Slice slice;\n      const uint8_t* buf = dst.ReleaseRaw(size, offset, slice);\n      TEST_ASSERT_FUNC(verify(buf, offset, m1_name(), m1_color()));\n\n      SrcBuilder src;\n      dst = std::move(src);\n      TEST_EQ_FUNC(dst.GetSize(), 0);\n      TEST_EQ_FUNC(src.GetSize(), 0);\n    }\n  }\n\n  static void run_tests(TestSelector selector) {\n    builder_reusable_after_release_test(selector);\n    builder_reusable_after_release_message_test(selector);\n    builder_reusable_after_releaseraw_test(selector);\n    builder_reusable_after_release_and_move_assign_test(selector);\n    builder_reusable_after_releaseraw_and_move_assign_test(selector);\n    builder_reusable_after_release_message_and_move_assign_test(selector);\n  }\n};\n\nvoid slice_allocator_tests() {\n  // move-construct no-delete test\n  {\n    size_t size = 2048;\n    flatbuffers::grpc::SliceAllocator sa1;\n    uint8_t* buf = sa1.allocate(size);\n    TEST_ASSERT_FUNC(buf != 0);\n    buf[0] = 100;\n    buf[size - 1] = 200;\n    flatbuffers::grpc::SliceAllocator sa2(std::move(sa1));\n    // buf should not be deleted after move-construct\n    TEST_EQ_FUNC(buf[0], 100);\n    TEST_EQ_FUNC(buf[size - 1], 200);\n    // buf is freed here\n  }\n\n  // move-assign test\n  {\n    flatbuffers::grpc::SliceAllocator sa1, sa2;\n    uint8_t* buf = sa1.allocate(2048);\n    sa1 = std::move(sa2);\n    // sa1 deletes previously allocated memory in move-assign.\n    // So buf is no longer usable here.\n    TEST_ASSERT_FUNC(buf != 0);\n  }\n}\n\n/// This function does not populate exactly the first half of the table. But it\n/// could.\nvoid populate_first_half(MyGame::Example::MonsterBuilder& wrapper,\n                         flatbuffers::Offset<flatbuffers::String> name_offset) {\n  wrapper.add_name(name_offset);\n  wrapper.add_color(m1_color());\n}\n\n/// This function does not populate exactly the second half of the table. But it\n/// could.\nvoid populate_second_half(MyGame::Example::MonsterBuilder& wrapper) {\n  wrapper.add_hp(77);\n  wrapper.add_mana(88);\n  Vec3 vec3;\n  wrapper.add_pos(&vec3);\n}\n\n/// This function is a hack to update the FlatBufferBuilder reference (fbb_) in\n/// the MonsterBuilder object. This function will break if fbb_ is not the first\n/// member in MonsterBuilder. In that case, some offset must be added. This\n/// function is used exclusively for testing correctness of move operations\n/// between FlatBufferBuilders. If MonsterBuilder had a fbb_ pointer, this hack\n/// would be unnecessary. That involves a code-generator change though.\nvoid test_only_hack_update_fbb_reference(\n    MyGame::Example::MonsterBuilder& monsterBuilder,\n    flatbuffers::grpc::MessageBuilder& mb) {\n  *reinterpret_cast<flatbuffers::FlatBufferBuilder**>(&monsterBuilder) = &mb;\n}\n\n/// This test validates correctness of move conversion of FlatBufferBuilder to a\n/// MessageBuilder DURING a table construction. Half of the table is constructed\n/// using FlatBufferBuilder and the other half of the table is constructed using\n/// a MessageBuilder.\nvoid builder_move_ctor_conversion_before_finish_half_n_half_table_test() {\n  for (size_t initial_size = 4; initial_size <= 2048; initial_size *= 2) {\n    flatbuffers::FlatBufferBuilder fbb(initial_size);\n    auto name_offset = fbb.CreateString(m1_name());\n    MyGame::Example::MonsterBuilder monsterBuilder(\n        fbb);  // starts a table in FlatBufferBuilder\n    populate_first_half(monsterBuilder, name_offset);\n    flatbuffers::grpc::MessageBuilder mb(std::move(fbb));\n    test_only_hack_update_fbb_reference(monsterBuilder, mb);  // hack\n    populate_second_half(monsterBuilder);\n    mb.Finish(monsterBuilder.Finish());  // ends the table in MessageBuilder\n    TEST_ASSERT_FUNC(release_n_verify(mb, m1_name(), m1_color()));\n    TEST_EQ_FUNC(fbb.GetSize(), 0);\n  }\n}\n\n/// This test populates a COMPLETE inner table before move conversion and later\n/// populates more members in the outer table.\nvoid builder_move_ctor_conversion_before_finish_test() {\n  for (size_t initial_size = 1; initial_size <= 2048; initial_size += 1) {\n    flatbuffers::FlatBufferBuilder fbb(initial_size);\n    auto stat_offset = CreateStat(fbb, fbb.CreateString(\"SomeId\"), 0, 0);\n    flatbuffers::grpc::MessageBuilder mb(std::move(fbb));\n    auto monster_offset =\n        CreateMonster(mb, 0, 150, 100, mb.CreateString(m1_name()), 0,\n                      m1_color(), Any_NONE, 0, 0, 0, 0, 0, 0, stat_offset);\n    mb.Finish(monster_offset);\n    {\n      auto mon = flatbuffers::GetRoot<Monster>(mb.GetBufferPointer());\n      TEST_NOTNULL(mon);\n      TEST_NOTNULL(mon->name());\n      TEST_EQ_STR(mon->name()->c_str(), m1_name().c_str());\n      TEST_EQ(mon->color(), m1_color());\n    }\n    TEST_EQ(1, MyGame::Example::Color_Red);\n    TEST_EQ(1, m1_color());\n    TEST_ASSERT_FUNC(release_n_verify(mb, m1_name(), m1_color()));\n    TEST_EQ_FUNC(fbb.GetSize(), 0);\n  }\n}\n\n/// This test validates correctness of move conversion of FlatBufferBuilder to a\n/// MessageBuilder DURING a table construction. Half of the table is constructed\n/// using FlatBufferBuilder and the other half of the table is constructed using\n/// a MessageBuilder.\nvoid builder_move_assign_conversion_before_finish_half_n_half_table_test() {\n  flatbuffers::FlatBufferBuilder fbb;\n  flatbuffers::grpc::MessageBuilder mb;\n\n  for (int i = 0; i < 5; ++i) {\n    flatbuffers::FlatBufferBuilder fbb;\n    auto name_offset = fbb.CreateString(m1_name());\n    MyGame::Example::MonsterBuilder monsterBuilder(\n        fbb);  // starts a table in FlatBufferBuilder\n    populate_first_half(monsterBuilder, name_offset);\n    mb = std::move(fbb);\n    test_only_hack_update_fbb_reference(monsterBuilder, mb);  // hack\n    populate_second_half(monsterBuilder);\n    mb.Finish(monsterBuilder.Finish());  // ends the table in MessageBuilder\n    TEST_ASSERT_FUNC(release_n_verify(mb, m1_name(), m1_color()));\n    TEST_EQ_FUNC(fbb.GetSize(), 0);\n  }\n}\n\n/// This test populates a COMPLETE inner table before move conversion and later\n/// populates more members in the outer table.\nvoid builder_move_assign_conversion_before_finish_test() {\n  flatbuffers::FlatBufferBuilder fbb;\n  flatbuffers::grpc::MessageBuilder mb;\n\n  for (int i = 0; i < 5; ++i) {\n    auto stat_offset = CreateStat(fbb, fbb.CreateString(\"SomeId\"), 0, 0);\n    mb = std::move(fbb);\n    auto monster_offset =\n        CreateMonster(mb, 0, 150, 100, mb.CreateString(m1_name()), 0,\n                      m1_color(), Any_NONE, 0, 0, 0, 0, 0, 0, stat_offset);\n    mb.Finish(monster_offset);\n    TEST_ASSERT_FUNC(release_n_verify(mb, m1_name(), m1_color()));\n    TEST_EQ_FUNC(fbb.GetSize(), 0);\n  }\n}\n\n/// This test populates data, finishes the buffer, and does move conversion\n/// after.\nvoid builder_move_ctor_conversion_after_finish_test() {\n  flatbuffers::FlatBufferBuilder fbb;\n  fbb.Finish(populate1(fbb));\n  flatbuffers::grpc::MessageBuilder mb(std::move(fbb));\n  TEST_ASSERT_FUNC(release_n_verify(mb, m1_name(), m1_color()));\n  TEST_EQ_FUNC(fbb.GetSize(), 0);\n}\n\n/// This test populates data, finishes the buffer, and does move conversion\n/// after.\nvoid builder_move_assign_conversion_after_finish_test() {\n  flatbuffers::FlatBufferBuilder fbb;\n  flatbuffers::grpc::MessageBuilder mb;\n\n  for (int i = 0; i < 5; ++i) {\n    fbb.Finish(populate1(fbb));\n    mb = std::move(fbb);\n    TEST_ASSERT_FUNC(release_n_verify(mb, m1_name(), m1_color()));\n    TEST_EQ_FUNC(fbb.GetSize(), 0);\n  }\n}\n\nvoid message_builder_tests() {\n  using flatbuffers::FlatBufferBuilder;\n  using flatbuffers::grpc::MessageBuilder;\n\n  slice_allocator_tests();\n\n#ifndef __APPLE__\n  builder_move_ctor_conversion_before_finish_half_n_half_table_test();\n  builder_move_assign_conversion_before_finish_half_n_half_table_test();\n#endif  // __APPLE__\n  builder_move_ctor_conversion_before_finish_test();\n  builder_move_assign_conversion_before_finish_test();\n\n  builder_move_ctor_conversion_after_finish_test();\n  builder_move_assign_conversion_after_finish_test();\n\n  BuilderTests<MessageBuilder, MessageBuilder>::all_tests();\n  BuilderTests<MessageBuilder, FlatBufferBuilder>::all_tests();\n\n  BuilderReuseTestSelector tests[6] = {\n      // REUSABLE_AFTER_RELEASE,                 // Assertion failed:\n      // (GRPC_SLICE_IS_EMPTY(slice_))\n      // REUSABLE_AFTER_RELEASE_AND_MOVE_ASSIGN, // Assertion failed: (p ==\n      // GRPC_SLICE_START_PTR(slice_)\n\n      REUSABLE_AFTER_RELEASE_RAW, REUSABLE_AFTER_RELEASE_MESSAGE,\n      REUSABLE_AFTER_RELEASE_MESSAGE_AND_MOVE_ASSIGN,\n      REUSABLE_AFTER_RELEASE_RAW_AND_MOVE_ASSIGN};\n\n  BuilderReuseTests<MessageBuilder, MessageBuilder>::run_tests(\n      TestSelector(tests, tests + 6));\n  BuilderReuseTests<MessageBuilder, FlatBufferBuilder>::run_tests(\n      TestSelector(tests, tests + 6));\n}\n"
  },
  {
    "path": "grpc/tests/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <groupId>com.google.flatbuffers</groupId>\n        <artifactId>flatbuffers-parent</artifactId>\n        <version>2.0.3</version>\n    </parent>\n    <artifactId>grpc-test</artifactId>\n    <description>Example/Test project demonstrating usage of flatbuffers with GRPC-Java instead of protobufs\n    </description>\n    <properties>\n        <gRPC.version>2.0.3</gRPC.version>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.flatbuffers</groupId>\n            <artifactId>flatbuffers-java</artifactId>\n            <version>${project.parent.version}</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>com.google.flatbuffers</groupId>\n            <artifactId>flatbuffers-java-grpc</artifactId>\n            <version>${project.parent.version}</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.grpc</groupId>\n            <artifactId>grpc-stub</artifactId>\n            <version>${gRPC.version}</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.grpc</groupId>\n            <artifactId>grpc-netty</artifactId>\n            <version>${gRPC.version}</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>junit</groupId>\n            <artifactId>junit</artifactId>\n            <version>4.13.1</version>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>build-helper-maven-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>add-source</id>\n                        <phase>generate-sources</phase>\n                        <goals>\n                            <goal>add-test-source</goal>\n                        </goals>\n                        <configuration>\n                            <sources>\n                                <source>${project.basedir}</source>\n\t\t\t\t<source>${project.basedir}/../../tests</source>\n                            </sources>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n        <!--<testSourceDirectory>${project.basedir}</testSourceDirectory>-->\n    </build>\n</project>\n\n"
  },
  {
    "path": "include/codegen/BUILD.bazel",
    "content": "load(\"@rules_cc//cc:defs.bzl\", \"cc_library\")\n\npackage(\n    default_visibility = [\"//visibility:private\"],\n)\n\nfilegroup(\n    name = \"distribution\",\n    srcs = [\n        \"BUILD.bazel\",\n    ] + glob([\n        \"*.cc\",\n        \"*.h\",\n    ]),\n    visibility = [\"//visibility:public\"],\n)\n\ncc_library(\n    name = \"namer\",\n    hdrs = [\n        \"idl_namer.h\",\n        \"namer.h\",\n    ],\n    strip_include_prefix = \"/include\",\n    visibility = [\"//:__subpackages__\"],\n    deps = [\"//:runtime_cc\"],\n)\n\ncc_library(\n    name = \"python\",\n    srcs = [\"python.cc\"],\n    hdrs = [\"python.h\"],\n    strip_include_prefix = \"/include\",\n    visibility = [\n        \"//grpc:__subpackages__\",\n        \"//src:__subpackages__\",\n    ],\n    deps = [\":namer\"],\n)\n"
  },
  {
    "path": "include/codegen/idl_namer.h",
    "content": "#ifndef FLATBUFFERS_INCLUDE_CODEGEN_IDL_NAMER_H_\n#define FLATBUFFERS_INCLUDE_CODEGEN_IDL_NAMER_H_\n\n#include \"codegen/namer.h\"\n#include \"flatbuffers/idl.h\"\n\nnamespace flatbuffers {\n\n// Provides Namer capabilities to types defined in the flatbuffers IDL.\nclass IdlNamer : public Namer {\n public:\n  explicit IdlNamer(Config config, std::set<std::string> keywords)\n      : Namer(config, std::move(keywords)) {}\n\n  using Namer::Constant;\n  using Namer::Directories;\n  using Namer::Field;\n  using Namer::File;\n  using Namer::Function;\n  using Namer::Method;\n  using Namer::Namespace;\n  using Namer::NamespacedType;\n  using Namer::ObjectType;\n  using Namer::Type;\n  using Namer::Variable;\n  using Namer::Variant;\n\n  std::string Constant(const FieldDef& d) const { return Constant(d.name); }\n\n  // Types are always structs or enums so we can only expose these two\n  // overloads.\n  std::string Type(const StructDef& d) const { return Type(d.name); }\n  std::string Type(const EnumDef& d) const { return Type(d.name); }\n\n  std::string Function(const Definition& s) const { return Function(s.name); }\n  std::string Function(const std::string& prefix, const Definition& s) const {\n    return Function(prefix + s.name);\n  }\n\n  std::string Field(const FieldDef& s) const { return Field(s.name); }\n  std::string Field(const FieldDef& d, const std::string& s) const {\n    return Field(d.name + \"_\" + s);\n  }\n\n  std::string Variable(const FieldDef& s) const { return Variable(s.name); }\n\n  std::string Variable(const StructDef& s) const { return Variable(s.name); }\n\n  std::string Variant(const EnumVal& s) const { return Variant(s.name); }\n\n  std::string EnumVariant(const EnumDef& e, const EnumVal& v) const {\n    return Type(e) + config_.enum_variant_seperator + Variant(v);\n  }\n\n  std::string ObjectType(const StructDef& d) const {\n    return ObjectType(d.name);\n  }\n  std::string ObjectType(const EnumDef& d) const { return ObjectType(d.name); }\n\n  std::string Method(const FieldDef& d, const std::string& suffix) const {\n    return Method(d.name, suffix);\n  }\n  std::string Method(const std::string& prefix, const StructDef& d) const {\n    return Method(prefix, d.name);\n  }\n  std::string Method(const std::string& prefix, const FieldDef& d) const {\n    return Method(prefix, d.name);\n  }\n  std::string Method(const std::string& prefix, const FieldDef& d,\n                     const std::string& suffix) const {\n    return Method(prefix, d.name, suffix);\n  }\n\n  std::string Namespace(const struct Namespace& ns) const {\n    return Namespace(ns.components);\n  }\n\n  std::string NamespacedEnumVariant(const EnumDef& e, const EnumVal& v) const {\n    return NamespacedString(e.defined_namespace, EnumVariant(e, v));\n  }\n\n  std::string NamespacedType(const Definition& def) const {\n    return NamespacedString(def.defined_namespace, Type(def.name));\n  }\n\n  std::string NamespacedObjectType(const Definition& def) const {\n    return NamespacedString(def.defined_namespace, ObjectType(def.name));\n  }\n\n  std::string Directories(const struct Namespace& ns,\n                          SkipDir skips = SkipDir::None,\n                          Case input_case = Case::kUpperCamel) const {\n    return Directories(ns.components, skips, input_case);\n  }\n\n  // Legacy fields do not really follow the usual config and should be\n  // considered for deprecation.\n\n  std::string LegacyRustNativeVariant(const EnumVal& v) const {\n    return ConvertCase(EscapeKeyword(v.name), Case::kUpperCamel);\n  }\n\n  std::string LegacyRustFieldOffsetName(const FieldDef& field) const {\n    return \"VT_\" + ConvertCase(EscapeKeyword(field.name), Case::kAllUpper);\n  }\n  std::string LegacyRustUnionTypeOffsetName(const FieldDef& field) const {\n    return \"VT_\" +\n           ConvertCase(EscapeKeyword(field.name + \"_type\"), Case::kAllUpper);\n  }\n\n  std::string LegacySwiftVariant(const EnumVal& ev) const {\n    auto name = ev.name;\n    if (isupper(name.front())) {\n      std::transform(name.begin(), name.end(), name.begin(), CharToLower);\n    }\n    return EscapeKeyword(ConvertCase(name, Case::kLowerCamel));\n  }\n\n  // Also used by Kotlin, lol.\n  std::string LegacyJavaMethod2(const std::string& prefix, const StructDef& sd,\n                                const std::string& suffix) const {\n    return prefix + sd.name + suffix;\n  }\n\n  std::string LegacyKotlinVariant(EnumVal& ev) const {\n    // Namer assumes the input case is snake case which is wrong...\n    return ConvertCase(EscapeKeyword(ev.name), Case::kLowerCamel);\n  }\n  // Kotlin methods escapes keywords after case conversion but before\n  // prefixing and suffixing.\n  std::string LegacyKotlinMethod(const std::string& prefix, const FieldDef& d,\n                                 const std::string& suffix) const {\n    return prefix + ConvertCase(EscapeKeyword(d.name), Case::kUpperCamel) +\n           suffix;\n  }\n  std::string LegacyKotlinMethod(const std::string& prefix, const StructDef& d,\n                                 const std::string& suffix) const {\n    return prefix + ConvertCase(EscapeKeyword(d.name), Case::kUpperCamel) +\n           suffix;\n  }\n\n  // This is a mix of snake case and keep casing, when Ts should be using\n  // lower camel case.\n  std::string LegacyTsMutateMethod(const FieldDef& d) {\n    return \"mutate_\" + d.name;\n  }\n\n  std::string LegacyRustUnionTypeMethod(const FieldDef& d) {\n    // assert d is a union\n    // d should convert case but not escape keywords due to historical reasons\n    return ConvertCase(d.name, config_.fields, Case::kLowerCamel) + \"_type\";\n  }\n\n private:\n  std::string NamespacedString(const struct Namespace* ns,\n                               const std::string& str) const {\n    std::string ret;\n    if (ns != nullptr) {\n      ret += Namespace(ns->components);\n    }\n    if (!ret.empty()) ret += config_.namespace_seperator;\n    return ret + str;\n  }\n};\n\n// This is a temporary helper function for code generators to call until all\n// flag-overriding logic into flatc.cpp\ninline Namer::Config WithFlagOptions(const Namer::Config& input,\n                                     const IDLOptions& opts,\n                                     const std::string& path) {\n  Namer::Config result = input;\n  result.object_prefix = opts.object_prefix;\n  result.object_suffix = opts.object_suffix;\n  result.output_path = path;\n  result.filename_suffix = opts.filename_suffix;\n  return result;\n}\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_INCLUDE_CODEGEN_IDL_NAMER_H_\n"
  },
  {
    "path": "include/codegen/namer.h",
    "content": "#ifndef FLATBUFFERS_INCLUDE_CODEGEN_NAMER_H_\n#define FLATBUFFERS_INCLUDE_CODEGEN_NAMER_H_\n\n#include \"flatbuffers/util.h\"\n\nnamespace flatbuffers {\n\n// Options for Namer::File.\nenum class SkipFile {\n  None = 0,\n  Suffix = 1,\n  Extension = 2,\n  SuffixAndExtension = 3,\n};\ninline SkipFile operator&(SkipFile a, SkipFile b) {\n  return static_cast<SkipFile>(static_cast<int>(a) & static_cast<int>(b));\n}\n// Options for Namer::Directories\nenum class SkipDir {\n  None = 0,\n  // Skip prefixing the -o $output_path.\n  OutputPath = 1,\n  // Skip trailing path seperator.\n  TrailingPathSeperator = 2,\n  OutputPathAndTrailingPathSeparator = 3,\n};\ninline SkipDir operator&(SkipDir a, SkipDir b) {\n  return static_cast<SkipDir>(static_cast<int>(a) & static_cast<int>(b));\n}\n\n// `Namer` applies style configuration to symbols in generated code. It manages\n// casing, escapes keywords, and object API naming.\n// TODO: Refactor all code generators to use this.\nclass Namer {\n public:\n  struct Config {\n    // Symbols in code.\n\n    // Case style for flatbuffers-defined types.\n    // e.g. `class TableA {}`\n    Case types;\n    // Case style for flatbuffers-defined constants.\n    // e.g. `uint64_t ENUM_A_MAX`;\n    Case constants;\n    // Case style for flatbuffers-defined methods.\n    // e.g. `class TableA { int field_a(); }`\n    Case methods;\n    // Case style for flatbuffers-defined functions.\n    // e.g. `TableA* get_table_a_root()`;\n    Case functions;\n    // Case style for flatbuffers-defined fields.\n    // e.g. `struct Struct { int my_field; }`\n    Case fields;\n    // Case style for flatbuffers-defined variables.\n    // e.g. `int my_variable = 2`\n    Case variables;\n    // Case style for flatbuffers-defined variants.\n    // e.g. `enum class Enum { MyVariant, }`\n    Case variants;\n    // Seperator for qualified enum names.\n    // e.g. `Enum::MyVariant` uses `::`.\n    std::string enum_variant_seperator;\n\n    // Configures, when formatting code, whether symbols are checked against\n    // keywords and escaped before or after case conversion. It does not make\n    // sense to do so before, but its legacy behavior. :shrug:\n    // TODO(caspern): Deprecate.\n    enum class Escape {\n      BeforeConvertingCase,\n      AfterConvertingCase,\n    };\n    Escape escape_keywords;\n\n    // Namespaces\n\n    // e.g. `namespace my_namespace {}`\n    Case namespaces;\n    // The seperator between namespaces in a namespace path.\n    std::string namespace_seperator;\n\n    // Object API.\n    // Native versions flatbuffers types have this prefix.\n    // e.g. \"\" (it's usually empty string)\n    std::string object_prefix;\n    // Native versions flatbuffers types have this suffix.\n    // e.g. \"T\"\n    std::string object_suffix;\n\n    // Keywords.\n    // Prefix used to escape keywords. It is usually empty string.\n    std::string keyword_prefix;\n    // Suffix used to escape keywords. It is usually \"_\".\n    std::string keyword_suffix;\n    // The casing used for keywords when escaping. For most languages, keywords\n    // are case sensitive. PHP is an instance where some keywords are case\n    // insensitive.\n    enum class KeywordsCasing {\n      CaseSensitive,\n      CaseInsensitive,\n    };\n    KeywordsCasing keywords_casing;\n\n    // Files.\n\n    // Case style for filenames. e.g. `foo_bar_generated.rs`\n    Case filenames;\n    // Case style for directories, e.g. `output_files/foo_bar/baz/`\n    Case directories;\n    // The directory within which we will generate files.\n    std::string output_path;\n    // Suffix for generated file names, e.g. \"_generated\".\n    std::string filename_suffix;\n    // Extension for generated files, e.g. \".cpp\" or \".rs\".\n    std::string filename_extension;\n  };\n  Namer(Config config, std::set<std::string> keywords)\n      : config_(config), keywords_(std::move(keywords)) {}\n\n  virtual ~Namer() {}\n\n  template <typename T>\n  std::string Method(const T& s) const {\n    return Method(s.name);\n  }\n\n  virtual std::string Method(const std::string& pre, const std::string& mid,\n                             const std::string& suf) const {\n    return Format(pre + \"_\" + mid + \"_\" + suf, config_.methods);\n  }\n  virtual std::string Method(const std::string& pre,\n                             const std::string& suf) const {\n    return Format(pre + \"_\" + suf, config_.methods);\n  }\n  virtual std::string Method(const std::string& s) const {\n    return Format(s, config_.methods);\n  }\n\n  virtual std::string Constant(const std::string& s) const {\n    return Format(s, config_.constants);\n  }\n\n  virtual std::string Function(const std::string& s) const {\n    return Format(s, config_.functions);\n  }\n\n  virtual std::string Variable(const std::string& s) const {\n    return Format(s, config_.variables);\n  }\n\n  template <typename T>\n  std::string Variable(const std::string& p, const T& s) const {\n    return Format(p + \"_\" + s.name, config_.variables);\n  }\n  virtual std::string Variable(const std::string& p,\n                               const std::string& s) const {\n    return Format(p + \"_\" + s, config_.variables);\n  }\n\n  virtual std::string Namespace(const std::string& s) const {\n    return Format(s, config_.namespaces);\n  }\n\n  virtual std::string Namespace(const std::vector<std::string>& ns) const {\n    std::string result;\n    for (auto it = ns.begin(); it != ns.end(); it++) {\n      if (it != ns.begin()) result += config_.namespace_seperator;\n      result += Namespace(*it);\n    }\n    return result;\n  }\n\n  virtual std::string NamespacedType(const std::vector<std::string>& ns,\n                                     const std::string& s) const {\n    return (ns.empty() ? \"\" : (Namespace(ns) + config_.namespace_seperator)) +\n           Type(s);\n  }\n\n  // Returns `filename` with the right casing, suffix, and extension.\n  virtual std::string File(const std::string& filename,\n                           SkipFile skips = SkipFile::None) const {\n    const bool skip_suffix = (skips & SkipFile::Suffix) != SkipFile::None;\n    const bool skip_ext = (skips & SkipFile::Extension) != SkipFile::None;\n    return ConvertCase(filename, config_.filenames, Case::kUpperCamel) +\n           (skip_suffix ? \"\" : config_.filename_suffix) +\n           (skip_ext ? \"\" : config_.filename_extension);\n  }\n  template <typename T>\n  std::string File(const T& f, SkipFile skips = SkipFile::None) const {\n    return File(f.name, skips);\n  }\n\n  // Formats `directories` prefixed with the output_path and joined with the\n  // right seperator. Output path prefixing and the trailing separator may be\n  // skiped using `skips`.\n  // Callers may want to use `EnsureDirExists` with the result.\n  // input_case is used to tell how to modify namespace. e.g. kUpperCamel will\n  // add a underscode between case changes, so MyGame turns into My_Game\n  // (depending also on the output_case).\n  virtual std::string Directories(const std::vector<std::string>& directories,\n                                  SkipDir skips = SkipDir::None,\n                                  Case input_case = Case::kUpperCamel) const {\n    const bool skip_output_path =\n        (skips & SkipDir::OutputPath) != SkipDir::None;\n    const bool skip_trailing_seperator =\n        (skips & SkipDir::TrailingPathSeperator) != SkipDir::None;\n    std::string result = skip_output_path ? \"\" : config_.output_path;\n    for (auto d = directories.begin(); d != directories.end(); d++) {\n      result += ConvertCase(*d, config_.directories, input_case);\n      result.push_back(kPathSeparator);\n    }\n    if (skip_trailing_seperator && !result.empty()) result.pop_back();\n    return result;\n  }\n\n  virtual std::string NormalizeKeywordCase(const std::string& name) const {\n    if (config_.keywords_casing == Config::KeywordsCasing::CaseInsensitive) {\n      return ConvertCase(name, Case::kAllLower);\n    } else {\n      return name;\n    }\n  }\n\n  virtual std::string EscapeKeyword(const std::string& name) const {\n    if (keywords_.find(NormalizeKeywordCase(name)) == keywords_.end()) {\n      return name;\n    } else {\n      return config_.keyword_prefix + name + config_.keyword_suffix;\n    }\n  }\n\n  virtual std::string Type(const std::string& s) const {\n    return Format(s, config_.types);\n  }\n  virtual std::string Type(const std::string& t, const std::string& s) const {\n    return Format(t + \"_\" + s, config_.types);\n  }\n\n  virtual std::string ObjectType(const std::string& s) const {\n    return config_.object_prefix + Type(s) + config_.object_suffix;\n  }\n\n  virtual std::string Field(const std::string& s) const {\n    return Format(s, config_.fields);\n  }\n\n  virtual std::string Variant(const std::string& s) const {\n    return Format(s, config_.variants);\n  }\n\n  virtual std::string Format(const std::string& s, Case casing) const {\n    if (config_.escape_keywords == Config::Escape::BeforeConvertingCase) {\n      return ConvertCase(EscapeKeyword(s), casing, Case::kLowerCamel);\n    } else {\n      return EscapeKeyword(ConvertCase(s, casing, Case::kLowerCamel));\n    }\n  }\n\n  // Denamespaces a string (e.g. The.Quick.Brown.Fox) by returning the last part\n  // after the `delimiter` (Fox) and placing the rest in `namespace_prefix`\n  // (The.Quick.Brown).\n  virtual std::string Denamespace(const std::string& s,\n                                  std::string& namespace_prefix,\n                                  const char delimiter = '.') const {\n    const size_t pos = s.find_last_of(delimiter);\n    if (pos == std::string::npos) {\n      namespace_prefix = \"\";\n      return s;\n    }\n    namespace_prefix = s.substr(0, pos);\n    return s.substr(pos + 1);\n  }\n\n  // Same as above, but disregards the prefix.\n  virtual std::string Denamespace(const std::string& s,\n                                  const char delimiter = '.') const {\n    std::string prefix;\n    return Denamespace(s, prefix, delimiter);\n  }\n\n  const Config config_;\n  const std::set<std::string> keywords_;\n};\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_INCLUDE_CODEGEN_NAMER_H_\n"
  },
  {
    "path": "include/codegen/python.cc",
    "content": "#include \"codegen/python.h\"\n\n#include <set>\n#include <sstream>\n#include <string>\n#include <utility>\n\nnamespace flatbuffers {\nnamespace python {\nVersion::Version(const std::string& version) {\n  std::stringstream ss(version);\n  char dot;\n  ss >> major >> dot >> minor >> dot >> micro;\n}\n\nbool Version::IsValid() const {\n  return (major == 0 || major == 2 || major == 3) && minor >= 0 && micro >= 0;\n}\n\nstd::set<std::string> Keywords(const Version& version) {\n  switch (version.major) {\n    case 2:\n      // https://docs.python.org/2/reference/lexical_analysis.html#keywords\n      return {\n          \"and\",   \"as\",     \"assert\", \"break\",  \"class\", \"continue\", \"def\",\n          \"del\",   \"elif\",   \"else\",   \"except\", \"exec\",  \"finally\",  \"for\",\n          \"from\",  \"global\", \"if\",     \"import\", \"in\",    \"is\",       \"lambda\",\n          \"not\",   \"or\",     \"pass\",   \"print\",  \"raise\", \"return\",   \"try\",\n          \"while\", \"with\",   \"yield\",\n      };\n    case 0:\n    case 3:\n      // https://docs.python.org/3/reference/lexical_analysis.html#keywords\n      return {\n          \"and\",      \"as\",       \"assert\",  \"async\", \"await\",  \"break\",\n          \"class\",    \"continue\", \"def\",     \"del\",   \"elif\",   \"else\",\n          \"except\",   \"False\",    \"finally\", \"for\",   \"from\",   \"global\",\n          \"if\",       \"import\",   \"in\",      \"is\",    \"lambda\", \"None\",\n          \"nonlocal\", \"not\",      \"or\",      \"pass\",  \"raise\",  \"return\",\n          \"True\",     \"try\",      \"while\",   \"with\",  \"yield\",\n      };\n    default:\n      return {};\n  }\n}\n\nconst python::Import& python::Imports::Import(const std::string& module) {\n  python::Import import;\n  import.module = module;\n  imports.push_back(std::move(import));\n  return imports.back();\n}\n\nconst python::Import& python::Imports::Import(const std::string& module,\n                                              const std::string& name) {\n  python::Import import;\n  import.module = module;\n  import.name = name;\n  imports.push_back(std::move(import));\n  return imports.back();\n}\n\nconst python::Import& python::Imports::Export(const std::string& module) {\n  python::Import import;\n  import.module = module;\n  exports.push_back(std::move(import));\n  return exports.back();\n}\n\nconst python::Import& python::Imports::Export(const std::string& module,\n                                              const std::string& name) {\n  python::Import import;\n  import.module = module;\n  import.name = name;\n  exports.push_back(std::move(import));\n  return exports.back();\n}\n}  // namespace python\n}  // namespace flatbuffers\n"
  },
  {
    "path": "include/codegen/python.h",
    "content": "#ifndef FLATBUFFERS_INCLUDE_CODEGEN_PYTHON_H_\n#define FLATBUFFERS_INCLUDE_CODEGEN_PYTHON_H_\n\n#include <cstdint>\n#include <set>\n#include <string>\n#include <vector>\n\n#include \"codegen/namer.h\"\n\nnamespace flatbuffers {\nnamespace python {\nstatic const Namer::Config kConfig = {\n    /*types=*/Case::kKeep,\n    /*constants=*/Case::kScreamingSnake,\n    /*methods=*/Case::kUpperCamel,\n    /*functions=*/Case::kUpperCamel,\n    /*fields=*/Case::kLowerCamel,\n    /*variable=*/Case::kLowerCamel,\n    /*variants=*/Case::kKeep,\n    /*enum_variant_seperator=*/\".\",\n    /*escape_keywords=*/Namer::Config::Escape::AfterConvertingCase,\n    /*namespaces=*/Case::kKeep,  // Packages in python.\n    /*namespace_seperator=*/\".\",\n    /*object_prefix=*/\"\",\n    /*object_suffix=*/\"T\",\n    /*keyword_prefix=*/\"\",\n    /*keyword_suffix=*/\"_\",\n    /*keywords_casing=*/Namer::Config::KeywordsCasing::CaseSensitive,\n    /*filenames=*/Case::kKeep,\n    /*directories=*/Case::kKeep,\n    /*output_path=*/\"\",\n    /*filename_suffix=*/\"\",\n    /*filename_extension=*/\".py\",\n};\n\nstatic const Namer::Config kStubConfig = {\n    /*types=*/Case::kKeep,\n    /*constants=*/Case::kScreamingSnake,\n    /*methods=*/Case::kUpperCamel,\n    /*functions=*/Case::kUpperCamel,\n    /*fields=*/Case::kLowerCamel,\n    /*variables=*/Case::kLowerCamel,\n    /*variants=*/Case::kKeep,\n    /*enum_variant_seperator=*/\".\",\n    /*escape_keywords=*/Namer::Config::Escape::AfterConvertingCase,\n    /*namespaces=*/Case::kKeep,  // Packages in python.\n    /*namespace_seperator=*/\".\",\n    /*object_prefix=*/\"\",\n    /*object_suffix=*/\"T\",\n    /*keyword_prefix=*/\"\",\n    /*keyword_suffix=*/\"_\",\n    /*keywords_casing=*/Namer::Config::KeywordsCasing::CaseSensitive,\n    /*filenames=*/Case::kKeep,\n    /*directories=*/Case::kKeep,\n    /*output_path=*/\"\",\n    /*filename_suffix=*/\"\",\n    /*filename_extension=*/\".pyi\",\n};\n\n// `Version` represent a Python version.\n//\n// The zero value (i.e. `Version{}`) represents both Python2 and Python3.\n//\n// https://docs.python.org/3/faq/general.html#how-does-the-python-version-numbering-scheme-work\nstruct Version {\n  explicit Version(const std::string& version);\n\n  bool IsValid() const;\n\n  int16_t major = 0;\n  int16_t minor = 0;\n  int16_t micro = 0;\n};\n\nstd::set<std::string> Keywords(const Version& version);\n\nstruct Import {\n  bool IsLocal() const { return module == \".\"; }\n\n  std::string module;\n  std::string name;\n};\n\nstruct Imports {\n  const python::Import& Import(const std::string& module);\n  const python::Import& Import(const std::string& module,\n                               const std::string& name);\n\n  const python::Import& Export(const std::string& module);\n  const python::Import& Export(const std::string& module,\n                               const std::string& name);\n\n  std::vector<python::Import> imports;\n  std::vector<python::Import> exports;\n};\n}  // namespace python\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_INCLUDE_CODEGEN_PYTHON_H_\n"
  },
  {
    "path": "include/flatbuffers/allocator.h",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_ALLOCATOR_H_\n#define FLATBUFFERS_ALLOCATOR_H_\n\n#include \"flatbuffers/base.h\"\n\nnamespace flatbuffers {\n\n// Allocator interface. This is flatbuffers-specific and meant only for\n// `vector_downward` usage.\nclass Allocator {\n public:\n  virtual ~Allocator() {}\n\n  // Allocate `size` bytes of memory.\n  virtual uint8_t* allocate(size_t size) = 0;\n\n  // Deallocate `size` bytes of memory at `p` allocated by this allocator.\n  virtual void deallocate(uint8_t* p, size_t size) = 0;\n\n  // Reallocate `new_size` bytes of memory, replacing the old region of size\n  // `old_size` at `p`. In contrast to a normal realloc, this grows downwards,\n  // and is intended specifcally for `vector_downward` use.\n  // `in_use_back` and `in_use_front` indicate how much of `old_size` is\n  // actually in use at each end, and needs to be copied.\n  virtual uint8_t* reallocate_downward(uint8_t* old_p, size_t old_size,\n                                       size_t new_size, size_t in_use_back,\n                                       size_t in_use_front) {\n    FLATBUFFERS_ASSERT(new_size > old_size);  // vector_downward only grows\n    uint8_t* new_p = allocate(new_size);\n    memcpy_downward(old_p, old_size, new_p, new_size, in_use_back,\n                    in_use_front);\n    deallocate(old_p, old_size);\n    return new_p;\n  }\n\n protected:\n  // Called by `reallocate_downward` to copy memory from `old_p` of `old_size`\n  // to `new_p` of `new_size`. Only memory of size `in_use_front` and\n  // `in_use_back` will be copied from the front and back of the old memory\n  // allocation.\n  void memcpy_downward(uint8_t* old_p, size_t old_size, uint8_t* new_p,\n                       size_t new_size, size_t in_use_back,\n                       size_t in_use_front) {\n    memcpy(new_p + new_size - in_use_back, old_p + old_size - in_use_back,\n           in_use_back);\n    memcpy(new_p, old_p, in_use_front);\n  }\n};\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_ALLOCATOR_H_\n"
  },
  {
    "path": "include/flatbuffers/array.h",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_ARRAY_H_\n#define FLATBUFFERS_ARRAY_H_\n\n#include <cstdint>\n#include <memory>\n\n#include \"flatbuffers/base.h\"\n#include \"flatbuffers/stl_emulation.h\"\n#include \"flatbuffers/vector.h\"\n\nnamespace flatbuffers {\n\n// This is used as a helper type for accessing arrays.\ntemplate <typename T, uint16_t length>\nclass Array {\n  // Array<T> can carry only POD data types (scalars or structs).\n  typedef typename flatbuffers::bool_constant<flatbuffers::is_scalar<T>::value>\n      scalar_tag;\n\n public:\n  typedef uint16_t size_type;\n  typedef typename IndirectHelper<T>::return_type return_type;\n  typedef VectorConstIterator<T, return_type, uoffset_t> const_iterator;\n  typedef VectorReverseIterator<const_iterator> const_reverse_iterator;\n\n  // If T is a non-pointer and a LE-scalar or a struct (!scalar_tag::value).\n  static FLATBUFFERS_CONSTEXPR bool is_span_observable =\n      !std::is_pointer<T>::value &&\n      ((scalar_tag::value && (FLATBUFFERS_LITTLEENDIAN || sizeof(T) == 1)) ||\n       !scalar_tag::value);\n\n  FLATBUFFERS_CONSTEXPR uint16_t size() const { return length; }\n\n  return_type Get(uoffset_t i) const {\n    FLATBUFFERS_ASSERT(i < size());\n    return IndirectHelper<T>::Read(Data(), i);\n  }\n\n  return_type operator[](uoffset_t i) const { return Get(i); }\n\n  // If this is a Vector of enums, T will be its storage type, not the enum\n  // type. This function makes it convenient to retrieve value with enum\n  // type E.\n  template <typename E>\n  E GetEnum(uoffset_t i) const {\n    return static_cast<E>(Get(i));\n  }\n\n  const_iterator begin() const { return const_iterator(Data(), 0); }\n  const_iterator end() const { return const_iterator(Data(), size()); }\n\n  const_reverse_iterator rbegin() const {\n    return const_reverse_iterator(end());\n  }\n  const_reverse_iterator rend() const {\n    return const_reverse_iterator(begin());\n  }\n\n  const_iterator cbegin() const { return begin(); }\n  const_iterator cend() const { return end(); }\n\n  const_reverse_iterator crbegin() const { return rbegin(); }\n  const_reverse_iterator crend() const { return rend(); }\n\n  // Get a mutable pointer to elements inside this array.\n  // This method used to mutate arrays of structs followed by a @p Mutate\n  // operation. For primitive types use @p Mutate directly.\n  // @warning Assignments and reads to/from the dereferenced pointer are not\n  //  automatically converted to the correct endianness.\n  typename flatbuffers::conditional<scalar_tag::value, void, T*>::type\n  GetMutablePointer(uoffset_t i) const {\n    FLATBUFFERS_ASSERT(i < size());\n    return const_cast<T*>(&data()[i]);\n  }\n\n  // Change elements if you have a non-const pointer to this object.\n  void Mutate(uoffset_t i, const T& val) { MutateImpl(scalar_tag(), i, val); }\n\n  // The raw data in little endian format. Use with care.\n  const uint8_t* Data() const { return data_; }\n\n  uint8_t* Data() { return data_; }\n\n  // Similarly, but typed, much like std::vector::data\n  const T* data() const { return reinterpret_cast<const T*>(Data()); }\n  T* data() { return reinterpret_cast<T*>(Data()); }\n\n  // Copy data from a span with endian conversion.\n  // If this Array and the span overlap, the behavior is undefined.\n  void CopyFromSpan(flatbuffers::span<const T, length> src) {\n    const auto p1 = reinterpret_cast<const uint8_t*>(src.data());\n    const auto p2 = Data();\n    FLATBUFFERS_ASSERT(!(p1 >= p2 && p1 < (p2 + length)) &&\n                       !(p2 >= p1 && p2 < (p1 + length)));\n    (void)p1;\n    (void)p2;\n    CopyFromSpanImpl(flatbuffers::bool_constant<is_span_observable>(), src);\n  }\n\n protected:\n  void MutateImpl(flatbuffers::true_type, uoffset_t i, const T& val) {\n    FLATBUFFERS_ASSERT(i < size());\n    WriteScalar(data() + i, val);\n  }\n\n  void MutateImpl(flatbuffers::false_type, uoffset_t i, const T& val) {\n    *(GetMutablePointer(i)) = val;\n  }\n\n  void CopyFromSpanImpl(flatbuffers::true_type,\n                        flatbuffers::span<const T, length> src) {\n    // Use std::memcpy() instead of std::copy() to avoid performance degradation\n    // due to aliasing if T is char or unsigned char.\n    // The size is known at compile time, so memcpy would be inlined.\n    std::memcpy(data(), src.data(), length * sizeof(T));\n  }\n\n  // Copy data from flatbuffers::span with endian conversion.\n  void CopyFromSpanImpl(flatbuffers::false_type,\n                        flatbuffers::span<const T, length> src) {\n    for (size_type k = 0; k < length; k++) {\n      Mutate(k, src[k]);\n    }\n  }\n\n  // This class is only used to access pre-existing data. Don't ever\n  // try to construct these manually.\n  // 'constexpr' allows us to use 'size()' at compile time.\n  // @note Must not use 'FLATBUFFERS_CONSTEXPR' here, as const is not allowed on\n  //  a constructor.\n#if defined(__cpp_constexpr)\n  constexpr Array();\n#else\n  Array();\n#endif\n\n  uint8_t data_[length * sizeof(T)];\n\n private:\n  // This class is a pointer. Copying will therefore create an invalid object.\n  // Private and unimplemented copy constructor.\n  Array(const Array&);\n  Array& operator=(const Array&);\n};\n\n// Specialization for Array[struct] with access using Offset<void> pointer.\n// This specialization used by idl_gen_text.cpp.\ntemplate <typename T, uint16_t length, template <typename> class OffsetT>\nclass Array<OffsetT<T>, length> {\n  static_assert(flatbuffers::is_same<T, void>::value, \"unexpected type T\");\n\n public:\n  typedef const void* return_type;\n  typedef uint16_t size_type;\n\n  const uint8_t* Data() const { return data_; }\n\n  // Make idl_gen_text.cpp::PrintContainer happy.\n  return_type operator[](uoffset_t) const {\n    FLATBUFFERS_ASSERT(false);\n    return nullptr;\n  }\n\n private:\n  // This class is only used to access pre-existing data.\n  Array();\n  Array(const Array&);\n  Array& operator=(const Array&);\n\n  uint8_t data_[1];\n};\n\ntemplate <class U, uint16_t N>\nFLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<U, N> make_span(Array<U, N>& arr)\n    FLATBUFFERS_NOEXCEPT {\n  static_assert(\n      Array<U, N>::is_span_observable,\n      \"wrong type U, only plain struct, LE-scalar, or byte types are allowed\");\n  return span<U, N>(arr.data(), N);\n}\n\ntemplate <class U, uint16_t N>\nFLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<const U, N> make_span(\n    const Array<U, N>& arr) FLATBUFFERS_NOEXCEPT {\n  static_assert(\n      Array<U, N>::is_span_observable,\n      \"wrong type U, only plain struct, LE-scalar, or byte types are allowed\");\n  return span<const U, N>(arr.data(), N);\n}\n\ntemplate <class U, uint16_t N>\nFLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<uint8_t, sizeof(U) * N>\nmake_bytes_span(Array<U, N>& arr) FLATBUFFERS_NOEXCEPT {\n  static_assert(Array<U, N>::is_span_observable,\n                \"internal error, Array<T> might hold only scalars or structs\");\n  return span<uint8_t, sizeof(U) * N>(arr.Data(), sizeof(U) * N);\n}\n\ntemplate <class U, uint16_t N>\nFLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<const uint8_t, sizeof(U) * N>\nmake_bytes_span(const Array<U, N>& arr) FLATBUFFERS_NOEXCEPT {\n  static_assert(Array<U, N>::is_span_observable,\n                \"internal error, Array<T> might hold only scalars or structs\");\n  return span<const uint8_t, sizeof(U) * N>(arr.Data(), sizeof(U) * N);\n}\n\n// Cast a raw T[length] to a raw flatbuffers::Array<T, length>\n// without endian conversion. Use with care.\n// TODO: move these Cast-methods to `internal` namespace.\ntemplate <typename T, uint16_t length>\nArray<T, length>& CastToArray(T (&arr)[length]) {\n  return *reinterpret_cast<Array<T, length>*>(arr);\n}\n\ntemplate <typename T, uint16_t length>\nconst Array<T, length>& CastToArray(const T (&arr)[length]) {\n  return *reinterpret_cast<const Array<T, length>*>(arr);\n}\n\ntemplate <typename E, typename T, uint16_t length>\nArray<E, length>& CastToArrayOfEnum(T (&arr)[length]) {\n  static_assert(sizeof(E) == sizeof(T), \"invalid enum type E\");\n  return *reinterpret_cast<Array<E, length>*>(arr);\n}\n\ntemplate <typename E, typename T, uint16_t length>\nconst Array<E, length>& CastToArrayOfEnum(const T (&arr)[length]) {\n  static_assert(sizeof(E) == sizeof(T), \"invalid enum type E\");\n  return *reinterpret_cast<const Array<E, length>*>(arr);\n}\n\ntemplate <typename T, uint16_t length>\nbool operator==(const Array<T, length>& lhs,\n                const Array<T, length>& rhs) noexcept {\n  return std::addressof(lhs) == std::addressof(rhs) ||\n         (lhs.size() == rhs.size() &&\n          std::memcmp(lhs.Data(), rhs.Data(), rhs.size() * sizeof(T)) == 0);\n}\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_ARRAY_H_\n"
  },
  {
    "path": "include/flatbuffers/base.h",
    "content": "#ifndef FLATBUFFERS_BASE_H_\n#define FLATBUFFERS_BASE_H_\n\n// clang-format off\n\n// If activate should be declared and included first.\n#if defined(FLATBUFFERS_MEMORY_LEAK_TRACKING) && \\\n    defined(_MSC_VER) && defined(_DEBUG)\n  // The _CRTDBG_MAP_ALLOC inside <crtdbg.h> will replace\n  // calloc/free (etc) to its debug version using #define directives.\n  #define _CRTDBG_MAP_ALLOC\n  #include <stdlib.h>\n  #include <crtdbg.h>\n  // Replace operator new by trace-enabled version.\n  #define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)\n  #define new DEBUG_NEW\n#endif\n\n#if !defined(FLATBUFFERS_ASSERT)\n#include <assert.h>\n#define FLATBUFFERS_ASSERT assert\n#elif defined(FLATBUFFERS_ASSERT_INCLUDE)\n// Include file with forward declaration\n#include FLATBUFFERS_ASSERT_INCLUDE\n#endif\n\n#ifndef ARDUINO\n#include <cstdint>\n#endif\n\n#include <cstddef>\n#include <cstdlib>\n#include <cstring>\n\n#if defined(ARDUINO) && !defined(ARDUINOSTL_M_H) && defined(__AVR__)\n  #include <utility.h>\n#else\n  #include <utility>\n#endif\n\n#include <string>\n#include <type_traits>\n#include <vector>\n#include <set>\n#include <algorithm>\n#include <limits>\n#include <iterator>\n#include <memory>\n\n#if defined(__unix__) && !defined(FLATBUFFERS_LOCALE_INDEPENDENT)\n  #include <unistd.h>\n#endif\n\n#ifdef __ANDROID__\n  #include <android/api-level.h>\n#endif\n\n#if defined(__ICCARM__)\n#include <intrinsics.h>\n#endif\n\n// Note the __clang__ check is needed, because clang presents itself\n// as an older GNUC compiler (4.2).\n// Clang 3.3 and later implement all of the ISO C++ 2011 standard.\n// Clang 3.4 and later implement all of the ISO C++ 2014 standard.\n// http://clang.llvm.org/cxx_status.html\n\n// Note the MSVC value '__cplusplus' may be incorrect:\n// The '__cplusplus' predefined macro in the MSVC stuck at the value 199711L,\n// indicating (erroneously!) that the compiler conformed to the C++98 Standard.\n// This value should be correct starting from MSVC2017-15.7-Preview-3.\n// The '__cplusplus' will be valid only if MSVC2017-15.7-P3 and the `/Zc:__cplusplus` switch is set.\n// Workaround (for details see MSDN):\n// Use the _MSC_VER and _MSVC_LANG definition instead of the __cplusplus  for compatibility.\n// The _MSVC_LANG macro reports the Standard version regardless of the '/Zc:__cplusplus' switch.\n\n#if defined(__GNUC__) && !defined(__clang__)\n  #define FLATBUFFERS_GCC (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)\n#else\n  #define FLATBUFFERS_GCC 0\n#endif\n\n#if defined(__clang__)\n  #define FLATBUFFERS_CLANG (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)\n#else\n  #define FLATBUFFERS_CLANG 0\n#endif\n\n/// @cond FLATBUFFERS_INTERNAL\n#if __cplusplus <= 199711L && \\\n    (!defined(_MSC_VER) || _MSC_VER < 1600) && \\\n    (!defined(__GNUC__) || \\\n      (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__ < 40400))\n  #error A C++11 compatible compiler with support for the auto typing is \\\n         required for FlatBuffers.\n  #error __cplusplus _MSC_VER __GNUC__  __GNUC_MINOR__  __GNUC_PATCHLEVEL__\n#endif\n\n#if !defined(__clang__) && \\\n    defined(__GNUC__) && \\\n    (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__ < 40600)\n  // Backwards compatibility for g++ 4.4, and 4.5 which don't have the nullptr\n  // and constexpr keywords. Note the __clang__ check is needed, because clang\n  // presents itself as an older GNUC compiler.\n  #ifndef nullptr_t\n    const class nullptr_t {\n    public:\n      template<class T> inline operator T*() const { return 0; }\n    private:\n      void operator&() const;\n    } nullptr = {};\n  #endif\n  #ifndef constexpr\n    #define constexpr const\n  #endif\n#endif\n\n// The wire format uses a little endian encoding (since that's efficient for\n// the common platforms).\n#if defined(__s390x__)\n  #define FLATBUFFERS_LITTLEENDIAN 0\n#endif // __s390x__\n#if !defined(FLATBUFFERS_LITTLEENDIAN)\n  #if defined(__GNUC__) || defined(__clang__) || defined(__ICCARM__)\n    #if (defined(__BIG_ENDIAN__) || \\\n         (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__))\n      #define FLATBUFFERS_LITTLEENDIAN 0\n    #else\n      #define FLATBUFFERS_LITTLEENDIAN 1\n    #endif // __BIG_ENDIAN__\n  #elif defined(_MSC_VER)\n    #if defined(_M_PPC)\n      #define FLATBUFFERS_LITTLEENDIAN 0\n    #else\n      #define FLATBUFFERS_LITTLEENDIAN 1\n    #endif\n  #else\n    #error Unable to determine endianness, define FLATBUFFERS_LITTLEENDIAN.\n  #endif\n#endif // !defined(FLATBUFFERS_LITTLEENDIAN)\n\n#define FLATBUFFERS_VERSION_MAJOR 25\n#define FLATBUFFERS_VERSION_MINOR 12\n#define FLATBUFFERS_VERSION_REVISION 19\n#define FLATBUFFERS_STRING_EXPAND(X) #X\n#define FLATBUFFERS_STRING(X) FLATBUFFERS_STRING_EXPAND(X)\nnamespace flatbuffers {\n  // Returns version as string  \"MAJOR.MINOR.REVISION\".\n  const char* FLATBUFFERS_VERSION();\n}\n\n#if (!defined(_MSC_VER) || _MSC_VER > 1600) && \\\n    (!defined(__GNUC__) || (__GNUC__ * 100 + __GNUC_MINOR__ >= 407)) || \\\n    defined(__clang__)\n  #define FLATBUFFERS_FINAL_CLASS final\n  #define FLATBUFFERS_OVERRIDE override\n  #define FLATBUFFERS_EXPLICIT_CPP11 explicit\n  #define FLATBUFFERS_VTABLE_UNDERLYING_TYPE : ::flatbuffers::voffset_t\n#else\n  #define FLATBUFFERS_FINAL_CLASS\n  #define FLATBUFFERS_OVERRIDE\n  #define FLATBUFFERS_EXPLICIT_CPP11\n  #define FLATBUFFERS_VTABLE_UNDERLYING_TYPE\n#endif\n\n#if (!defined(_MSC_VER) || _MSC_VER >= 1900) && \\\n    (!defined(__GNUC__) || (__GNUC__ * 100 + __GNUC_MINOR__ >= 406)) || \\\n    (defined(__cpp_constexpr) && __cpp_constexpr >= 200704)\n  #define FLATBUFFERS_CONSTEXPR constexpr\n  #define FLATBUFFERS_CONSTEXPR_CPP11 constexpr\n  #define FLATBUFFERS_CONSTEXPR_DEFINED\n#else\n  #define FLATBUFFERS_CONSTEXPR const\n  #define FLATBUFFERS_CONSTEXPR_CPP11\n#endif\n\n#if (defined(__cplusplus) && __cplusplus >= 201402L) || \\\n    (defined(__cpp_constexpr) && __cpp_constexpr >= 201304)\n  #define FLATBUFFERS_CONSTEXPR_CPP14 FLATBUFFERS_CONSTEXPR_CPP11\n#else\n  #define FLATBUFFERS_CONSTEXPR_CPP14\n#endif\n\n#if (defined(__GXX_EXPERIMENTAL_CXX0X__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 406)) || \\\n    (defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 190023026)) || \\\n    defined(__clang__)\n  #define FLATBUFFERS_NOEXCEPT noexcept\n#else\n  #define FLATBUFFERS_NOEXCEPT\n#endif\n\n// NOTE: the FLATBUFFERS_DELETE_FUNC macro may change the access mode to\n// private, so be sure to put it at the end or reset access mode explicitly.\n#if (!defined(_MSC_VER) || _MSC_FULL_VER >= 180020827) && \\\n    (!defined(__GNUC__) || (__GNUC__ * 100 + __GNUC_MINOR__ >= 404)) || \\\n    defined(__clang__)\n  #define FLATBUFFERS_DELETE_FUNC(func) func = delete\n#else\n  #define FLATBUFFERS_DELETE_FUNC(func) private: func\n#endif\n\n#if (!defined(_MSC_VER) || _MSC_VER >= 1900) && \\\n    (!defined(__GNUC__) || (__GNUC__ * 100 + __GNUC_MINOR__ >= 409)) || \\\n    defined(__clang__)\n  #define FLATBUFFERS_DEFAULT_DECLARATION\n#endif\n\n// Check if we can use template aliases\n// Not possible if Microsoft Compiler before 2012\n// Possible is the language feature __cpp_alias_templates is defined well\n// Or possible if the C++ std is C+11 or newer\n#if (defined(_MSC_VER) && _MSC_VER > 1700 /* MSVC2012 */) \\\n    || (defined(__cpp_alias_templates) && __cpp_alias_templates >= 200704) \\\n    || (defined(__cplusplus) && __cplusplus >= 201103L)\n  #define FLATBUFFERS_TEMPLATES_ALIASES\n#endif\n\n#ifndef FLATBUFFERS_HAS_STRING_VIEW\n  // Only provide flatbuffers::string_view if __has_include can be used\n  // to detect a header that provides an implementation\n  #if defined(__has_include)\n    // Check for std::string_view (in c++17)\n    #if __has_include(<string_view>) && (__cplusplus >= 201606 || (defined(_HAS_CXX17) && _HAS_CXX17))\n      #include <string_view>\n      namespace flatbuffers {\n        typedef std::string_view string_view;\n      }\n      #define FLATBUFFERS_HAS_STRING_VIEW 1\n    // Check for std::experimental::string_view (in c++14, compiler-dependent)\n    #elif __has_include(<experimental/string_view>) && (__cplusplus >= 201411)\n      #include <experimental/string_view>\n      namespace flatbuffers {\n        typedef std::experimental::string_view string_view;\n      }\n      #define FLATBUFFERS_HAS_STRING_VIEW 1\n    // Check for absl::string_view\n    #elif __has_include(\"absl/strings/string_view.h\") && \\\n          __has_include(\"absl/base/config.h\") && \\\n          (__cplusplus >= 201411)\n      #include \"absl/base/config.h\"\n      #if !defined(ABSL_USES_STD_STRING_VIEW)\n        #include \"absl/strings/string_view.h\"\n        namespace flatbuffers {\n          typedef absl::string_view string_view;\n        }\n        #define FLATBUFFERS_HAS_STRING_VIEW 1\n      #endif\n    #endif\n  #endif // __has_include\n#endif // !FLATBUFFERS_HAS_STRING_VIEW\n\n#ifndef FLATBUFFERS_GENERAL_HEAP_ALLOC_OK\n  // Allow heap allocations to be used\n  #define FLATBUFFERS_GENERAL_HEAP_ALLOC_OK 1\n#endif // !FLATBUFFERS_GENERAL_HEAP_ALLOC_OK\n\n#ifndef FLATBUFFERS_HAS_NEW_STRTOD\n  // Modern (C++11) strtod and strtof functions are available for use.\n  // 1) nan/inf strings as argument of strtod;\n  // 2) hex-float  as argument of  strtod/strtof.\n  #if (defined(_MSC_VER) && _MSC_VER >= 1900) || \\\n      (defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 409)) || \\\n      (defined(__clang__))\n    #define FLATBUFFERS_HAS_NEW_STRTOD 1\n  #endif\n#endif // !FLATBUFFERS_HAS_NEW_STRTOD\n\n#ifndef FLATBUFFERS_LOCALE_INDEPENDENT\n  // Enable locale independent functions {strtof_l, strtod_l,strtoll_l,\n  // strtoull_l} on platforms that support them.\n  #if (defined(_MSC_VER) && _MSC_VER >= 1800) || \\\n      (defined(__ANDROID__) && defined(__ANDROID_API__) && __ANDROID_API__>= 26) || \\\n      (defined(_XOPEN_VERSION) && (_XOPEN_VERSION >= 700)) && \\\n      !defined(__Fuchsia__)\n    #define FLATBUFFERS_LOCALE_INDEPENDENT 1\n  #else\n    #define FLATBUFFERS_LOCALE_INDEPENDENT 0\n  #endif\n#endif  // !FLATBUFFERS_LOCALE_INDEPENDENT\n\n// Suppress Undefined Behavior Sanitizer (recoverable only). Usage:\n// - FLATBUFFERS_SUPPRESS_UBSAN(\"undefined\")\n// - FLATBUFFERS_SUPPRESS_UBSAN(\"signed-integer-overflow\")\n#if defined(__clang__) && (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >=7))\n  #define FLATBUFFERS_SUPPRESS_UBSAN(type) __attribute__((no_sanitize(type)))\n#elif defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 409)\n  #define FLATBUFFERS_SUPPRESS_UBSAN(type) __attribute__((no_sanitize_undefined))\n#else\n  #define FLATBUFFERS_SUPPRESS_UBSAN(type)\n#endif\n\nnamespace flatbuffers {\n  // This is constexpr function used for checking compile-time constants.\n  // Avoid `#pragma warning(disable: 4127) // C4127: expression is constant`.\n  template<typename T> FLATBUFFERS_CONSTEXPR inline bool IsConstTrue(T t) {\n    return !!t;\n  }\n}\n\n// Enable C++ attribute [[]] if std:c++17 or higher.\n#if ((__cplusplus >= 201703L) \\\n    || (defined(_MSVC_LANG) &&  (_MSVC_LANG >= 201703L)))\n  // All attributes unknown to an implementation are ignored without causing an error.\n  #define FLATBUFFERS_ATTRIBUTE(attr) attr\n\n  #define FLATBUFFERS_FALLTHROUGH() [[fallthrough]]\n#else\n  #define FLATBUFFERS_ATTRIBUTE(attr)\n\n  #if FLATBUFFERS_CLANG >= 30800\n    #define FLATBUFFERS_FALLTHROUGH() [[clang::fallthrough]]\n  #elif FLATBUFFERS_GCC >= 70300\n    #define FLATBUFFERS_FALLTHROUGH() [[gnu::fallthrough]]\n  #else\n    #define FLATBUFFERS_FALLTHROUGH()\n  #endif\n#endif\n\n/// @endcond\n\n/// @file\nnamespace flatbuffers {\n\n/// @cond FLATBUFFERS_INTERNAL\n// Our default offset / size type, 32bit on purpose on 64bit systems.\n// Also, using a consistent offset type maintains compatibility of serialized\n// offset values between 32bit and 64bit systems.\ntypedef uint32_t uoffset_t;\ntypedef uint64_t uoffset64_t;\n\n// Signed offsets for references that can go in both directions.\ntypedef int32_t soffset_t;\ntypedef int64_t soffset64_t;\n\n// Offset/index used in v-tables, can be changed to uint8_t in\n// format forks to save a bit of space if desired.\ntypedef uint16_t voffset_t;\n\ntypedef uintmax_t largest_scalar_t;\n\n// In 32bits, this evaluates to 2GB - 1\n#define FLATBUFFERS_MAX_BUFFER_SIZE (std::numeric_limits<::flatbuffers::soffset_t>::max)()\n#define FLATBUFFERS_MAX_64_BUFFER_SIZE (std::numeric_limits<::flatbuffers::soffset64_t>::max)()\n\n// The minimum size buffer that can be a valid flatbuffer.\n// Includes the offset to the root table (uoffset_t), the offset to the vtable\n// of the root table (soffset_t), the size of the vtable (uint16_t), and the\n// size of the referring table (uint16_t).\n#define FLATBUFFERS_MIN_BUFFER_SIZE sizeof(::flatbuffers::uoffset_t) + \\\n  sizeof(::flatbuffers::soffset_t) + sizeof(uint16_t) + sizeof(uint16_t)\n\n// We support aligning the contents of buffers up to this size.\n#ifndef FLATBUFFERS_MAX_ALIGNMENT\n  #define FLATBUFFERS_MAX_ALIGNMENT 32\n#endif\n\n/// @brief The length of a FlatBuffer file header.\nstatic const size_t kFileIdentifierLength = 4;\n\ninline bool VerifyAlignmentRequirements(size_t align, size_t min_align = 1) {\n  return (min_align <= align) && (align <= (FLATBUFFERS_MAX_ALIGNMENT)) &&\n         (align & (align - 1)) == 0;  // must be power of 2\n}\n\n#if defined(_MSC_VER)\n  #pragma warning(push)\n  #pragma warning(disable: 4127) // C4127: conditional expression is constant\n#endif\n\ntemplate<typename T> T EndianSwap(T t) {\n  #if defined(_MSC_VER)\n    #define FLATBUFFERS_BYTESWAP16 _byteswap_ushort\n    #define FLATBUFFERS_BYTESWAP32 _byteswap_ulong\n    #define FLATBUFFERS_BYTESWAP64 _byteswap_uint64\n  #elif defined(__ICCARM__)\n    #define FLATBUFFERS_BYTESWAP16 __REV16\n    #define FLATBUFFERS_BYTESWAP32 __REV\n    #define FLATBUFFERS_BYTESWAP64(x) \\\n       ((__REV(static_cast<uint32_t>(x >> 32U))) | (static_cast<uint64_t>(__REV(static_cast<uint32_t>(x)))) << 32U)\n  #else\n    #if defined(__GNUC__) && __GNUC__ * 100 + __GNUC_MINOR__ < 408 && !defined(__clang__)\n      // __builtin_bswap16 was missing prior to GCC 4.8.\n      #define FLATBUFFERS_BYTESWAP16(x) \\\n        static_cast<uint16_t>(__builtin_bswap32(static_cast<uint32_t>(x) << 16))\n    #else\n      #define FLATBUFFERS_BYTESWAP16 __builtin_bswap16\n    #endif\n    #define FLATBUFFERS_BYTESWAP32 __builtin_bswap32\n    #define FLATBUFFERS_BYTESWAP64 __builtin_bswap64\n  #endif\n  if (sizeof(T) == 1) {   // Compile-time if-then's.\n    return t;\n  } else if (sizeof(T) == 2) {\n    union { T t; uint16_t i; } u = { t };\n    u.i = FLATBUFFERS_BYTESWAP16(u.i);\n    return u.t;\n  } else if (sizeof(T) == 4) {\n    union { T t; uint32_t i; } u = { t };\n    u.i = FLATBUFFERS_BYTESWAP32(u.i);\n    return u.t;\n  } else if (sizeof(T) == 8) {\n    union { T t; uint64_t i; } u = { t };\n    u.i = FLATBUFFERS_BYTESWAP64(u.i);\n    return u.t;\n  } else {\n    FLATBUFFERS_ASSERT(0);\n    return t;\n  }\n}\n\n#if defined(_MSC_VER)\n  #pragma warning(pop)\n#endif\n\n\ntemplate<typename T> T EndianScalar(T t) {\n  #if FLATBUFFERS_LITTLEENDIAN\n    return t;\n  #else\n    return EndianSwap(t);\n  #endif\n}\n\ntemplate<typename T>\n// UBSAN: C++ aliasing type rules, see std::bit_cast<> for details.\nFLATBUFFERS_SUPPRESS_UBSAN(\"alignment\")\nT ReadScalar(const void *p) {\n  return EndianScalar(*reinterpret_cast<const T *>(p));\n}\n\n// See https://github.com/google/flatbuffers/issues/5950\n\n#if (FLATBUFFERS_GCC >= 100000) && (FLATBUFFERS_GCC < 110000)\n  #pragma GCC diagnostic push\n  #pragma GCC diagnostic ignored \"-Wstringop-overflow\"\n#endif\n\ntemplate<typename T>\n// UBSAN: C++ aliasing type rules, see std::bit_cast<> for details.\nFLATBUFFERS_SUPPRESS_UBSAN(\"alignment\")\nvoid WriteScalar(void *p, T t) {\n  *reinterpret_cast<T *>(p) = EndianScalar(t);\n}\n\ntemplate<typename T> struct Offset;\ntemplate<typename T> FLATBUFFERS_SUPPRESS_UBSAN(\"alignment\") void WriteScalar(void *p, Offset<T> t) {\n  *reinterpret_cast<uoffset_t *>(p) = EndianScalar(t.o);\n}\n\n#if (FLATBUFFERS_GCC >= 100000) && (FLATBUFFERS_GCC < 110000)\n  #pragma GCC diagnostic pop\n#endif\n\n// Computes how many bytes you'd have to pad to be able to write an\n// \"scalar_size\" scalar if the buffer had grown to \"buf_size\" (downwards in\n// memory).\nFLATBUFFERS_SUPPRESS_UBSAN(\"unsigned-integer-overflow\")\ninline size_t PaddingBytes(size_t buf_size, size_t scalar_size) {\n  return ((~buf_size) + 1) & (scalar_size - 1);\n}\n\n#if !defined(_MSC_VER)\n  #pragma GCC diagnostic push\n  #pragma GCC diagnostic ignored \"-Wfloat-equal\"\n#endif\n// Generic 'operator==' with conditional specialisations.\n// T e - new value of a scalar field.\n// T def - default of scalar (is known at compile-time).\ntemplate<typename T> inline bool IsTheSameAs(T e, T def) { return e == def; }\n#if !defined(_MSC_VER)\n  #pragma GCC diagnostic pop\n#endif\n\n#if defined(FLATBUFFERS_NAN_DEFAULTS) && \\\n    defined(FLATBUFFERS_HAS_NEW_STRTOD) && (FLATBUFFERS_HAS_NEW_STRTOD > 0)\n// Like `operator==(e, def)` with weak NaN if T=(float|double).\ntemplate<typename T> inline bool IsFloatTheSameAs(T e, T def) {\n  return (e == def) || ((def != def) && (e != e));\n}\ntemplate<> inline bool IsTheSameAs<float>(float e, float def) {\n  return IsFloatTheSameAs(e, def);\n}\ntemplate<> inline bool IsTheSameAs<double>(double e, double def) {\n  return IsFloatTheSameAs(e, def);\n}\n#endif\n\n// Check 'v' is out of closed range [low; high].\n// Workaround for GCC warning [-Werror=type-limits]:\n// comparison is always true due to limited range of data type.\ntemplate<typename T>\ninline bool IsOutRange(const T &v, const T &low, const T &high) {\n  return (v < low) || (high < v);\n}\n\n// Check 'v' is in closed range [low; high].\ntemplate<typename T>\ninline bool IsInRange(const T &v, const T &low, const T &high) {\n  return !IsOutRange(v, low, high);\n}\n\n}  // namespace flatbuffers\n#endif  // FLATBUFFERS_BASE_H_\n"
  },
  {
    "path": "include/flatbuffers/buffer.h",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_BUFFER_H_\n#define FLATBUFFERS_BUFFER_H_\n\n#include <algorithm>\n\n#include \"flatbuffers/base.h\"\n#include \"flatbuffers/stl_emulation.h\"\n\nnamespace flatbuffers {\n\n// Wrapper for uoffset_t to allow safe template specialization.\n// Value is allowed to be 0 to indicate a null object (see e.g. AddOffset).\ntemplate <typename T = void>\nstruct Offset {\n  // The type of offset to use.\n  typedef uoffset_t offset_type;\n\n  offset_type o;\n  Offset() : o(0) {}\n  Offset(const offset_type _o) : o(_o) {}\n  Offset<> Union() const { return o; }\n  bool IsNull() const { return !o; }\n};\n\ntemplate <typename T>\nstruct is_specialisation_of_Offset : false_type {};\ntemplate <typename T>\nstruct is_specialisation_of_Offset<Offset<T>> : true_type {};\n\n// Wrapper for uoffset64_t Offsets.\ntemplate <typename T = void>\nstruct Offset64 {\n  // The type of offset to use.\n  typedef uoffset64_t offset_type;\n\n  offset_type o;\n  Offset64() : o(0) {}\n  Offset64(const offset_type offset) : o(offset) {}\n  Offset64<> Union() const { return o; }\n  bool IsNull() const { return !o; }\n};\n\ntemplate <typename T>\nstruct is_specialisation_of_Offset64 : false_type {};\ntemplate <typename T>\nstruct is_specialisation_of_Offset64<Offset64<T>> : true_type {};\n\n// Litmus check for ensuring the Offsets are the expected size.\nstatic_assert(sizeof(Offset<>) == 4, \"Offset has wrong size\");\nstatic_assert(sizeof(Offset64<>) == 8, \"Offset64 has wrong size\");\n\ninline void EndianCheck() {\n  int endiantest = 1;\n  // If this fails, see FLATBUFFERS_LITTLEENDIAN above.\n  FLATBUFFERS_ASSERT(*reinterpret_cast<char*>(&endiantest) ==\n                     FLATBUFFERS_LITTLEENDIAN);\n  (void)endiantest;\n}\n\ntemplate <typename T>\nFLATBUFFERS_CONSTEXPR size_t AlignOf() {\n  // clang-format off\n  #ifdef _MSC_VER\n    return __alignof(T);\n  #else\n    #ifndef alignof\n      return __alignof__(T);\n    #else\n      return alignof(T);\n    #endif\n  #endif\n  // clang-format on\n}\n\n// Lexicographically compare two strings (possibly containing nulls), and\n// return true if the first is less than the second.\nstatic inline bool StringLessThan(const char* a_data, uoffset_t a_size,\n                                  const char* b_data, uoffset_t b_size) {\n  const auto cmp = memcmp(a_data, b_data, (std::min)(a_size, b_size));\n  return cmp == 0 ? a_size < b_size : cmp < 0;\n}\n\n// When we read serialized data from memory, in the case of most scalars,\n// we want to just read T, but in the case of Offset, we want to actually\n// perform the indirection and return a pointer.\n// The template specialization below does just that.\n// It is wrapped in a struct since function templates can't overload on the\n// return type like this.\n// The typedef is for the convenience of callers of this function\n// (avoiding the need for a trailing return decltype)\ntemplate <typename T, typename Enable = void>\nstruct IndirectHelper {\n  typedef T return_type;\n  typedef T mutable_return_type;\n  static const size_t element_stride = sizeof(T);\n\n  static return_type Read(const uint8_t* p, const size_t i) {\n    return EndianScalar((reinterpret_cast<const T*>(p))[i]);\n  }\n  static mutable_return_type Read(uint8_t* p, const size_t i) {\n    return reinterpret_cast<mutable_return_type>(\n        Read(const_cast<const uint8_t*>(p), i));\n  }\n};\n\n// For vector of Offsets.\ntemplate <typename T, template <typename> class OffsetT>\nstruct IndirectHelper<OffsetT<T>> {\n  typedef const T* return_type;\n  typedef T* mutable_return_type;\n  typedef typename OffsetT<T>::offset_type offset_type;\n  static const offset_type element_stride = sizeof(offset_type);\n\n  static return_type Read(const uint8_t* const p, const offset_type i) {\n    // Offsets are relative to themselves, so first update the pointer to\n    // point to the offset location.\n    const uint8_t* const offset_location = p + i * element_stride;\n\n    // Then read the scalar value of the offset (which may be 32 or 64-bits) and\n    // then determine the relative location from the offset location.\n    return reinterpret_cast<return_type>(\n        offset_location + ReadScalar<offset_type>(offset_location));\n  }\n  static mutable_return_type Read(uint8_t* const p, const offset_type i) {\n    // Offsets are relative to themselves, so first update the pointer to\n    // point to the offset location.\n    uint8_t* const offset_location = p + i * element_stride;\n\n    // Then read the scalar value of the offset (which may be 32 or 64-bits) and\n    // then determine the relative location from the offset location.\n    return reinterpret_cast<mutable_return_type>(\n        offset_location + ReadScalar<offset_type>(offset_location));\n  }\n};\n\n// For vector of structs.\ntemplate <typename T>\nstruct IndirectHelper<\n    T, typename std::enable_if<\n           !std::is_scalar<typename std::remove_pointer<T>::type>::value &&\n           !is_specialisation_of_Offset<T>::value &&\n           !is_specialisation_of_Offset64<T>::value>::type> {\n private:\n  typedef typename std::remove_pointer<typename std::remove_cv<T>::type>::type\n      pointee_type;\n\n public:\n  typedef const pointee_type* return_type;\n  typedef pointee_type* mutable_return_type;\n  static const size_t element_stride = sizeof(pointee_type);\n\n  static return_type Read(const uint8_t* const p, const size_t i) {\n    // Structs are stored inline, relative to the first struct pointer.\n    return reinterpret_cast<return_type>(p + i * element_stride);\n  }\n  static mutable_return_type Read(uint8_t* const p, const size_t i) {\n    // Structs are stored inline, relative to the first struct pointer.\n    return reinterpret_cast<mutable_return_type>(p + i * element_stride);\n  }\n};\n\n/// @brief Get a pointer to the file_identifier section of the buffer.\n/// @return Returns a const char pointer to the start of the file_identifier\n/// characters in the buffer.  The returned char * has length\n/// 'flatbuffers::FlatBufferBuilder::kFileIdentifierLength'.\n/// This function is UNDEFINED for FlatBuffers whose schema does not include\n/// a file_identifier (likely points at padding or the start of a the root\n/// vtable).\ninline const char* GetBufferIdentifier(const void* buf,\n                                       bool size_prefixed = false) {\n  return reinterpret_cast<const char*>(buf) +\n         ((size_prefixed) ? 2 * sizeof(uoffset_t) : sizeof(uoffset_t));\n}\n\n// Helper to see if the identifier in a buffer has the expected value.\ninline bool BufferHasIdentifier(const void* buf, const char* identifier,\n                                bool size_prefixed = false) {\n  return strncmp(GetBufferIdentifier(buf, size_prefixed), identifier,\n                 flatbuffers::kFileIdentifierLength) == 0;\n}\n\n/// @cond FLATBUFFERS_INTERNAL\n// Helpers to get a typed pointer to the root object contained in the buffer.\ntemplate <typename T>\nT* GetMutableRoot(void* buf) {\n  if (!buf) return nullptr;\n  EndianCheck();\n  return reinterpret_cast<T*>(reinterpret_cast<uint8_t*>(buf) +\n                              EndianScalar(*reinterpret_cast<uoffset_t*>(buf)));\n}\n\ntemplate <typename T, typename SizeT = uoffset_t>\nT* GetMutableSizePrefixedRoot(void* buf) {\n  return GetMutableRoot<T>(reinterpret_cast<uint8_t*>(buf) + sizeof(SizeT));\n}\n\ntemplate <typename T>\nconst T* GetRoot(const void* buf) {\n  return GetMutableRoot<T>(const_cast<void*>(buf));\n}\n\ntemplate <typename T, typename SizeT = uoffset_t>\nconst T* GetSizePrefixedRoot(const void* buf) {\n  return GetRoot<T>(reinterpret_cast<const uint8_t*>(buf) + sizeof(SizeT));\n}\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_BUFFER_H_\n"
  },
  {
    "path": "include/flatbuffers/buffer_ref.h",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_BUFFER_REF_H_\n#define FLATBUFFERS_BUFFER_REF_H_\n\n#include \"flatbuffers/base.h\"\n#include \"flatbuffers/verifier.h\"\n\nnamespace flatbuffers {\n\n// Convenient way to bundle a buffer and its length, to pass it around\n// typed by its root.\n// A BufferRef does not own its buffer.\nstruct BufferRefBase {};  // for std::is_base_of\n\ntemplate <typename T>\nstruct BufferRef : BufferRefBase {\n  BufferRef() : buf(nullptr), len(0), must_free(false) {}\n  BufferRef(uint8_t* _buf, uoffset_t _len)\n      : buf(_buf), len(_len), must_free(false) {}\n\n  ~BufferRef() {\n    if (must_free) free(buf);\n  }\n\n  const T* GetRoot() const { return flatbuffers::GetRoot<T>(buf); }\n\n  bool Verify() {\n    Verifier verifier(buf, len);\n    return verifier.VerifyBuffer<T>(nullptr);\n  }\n\n  uint8_t* buf;\n  uoffset_t len;\n  bool must_free;\n};\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_BUFFER_REF_H_\n"
  },
  {
    "path": "include/flatbuffers/code_generator.h",
    "content": "/*\n * Copyright 2023 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_CODE_GENERATOR_H_\n#define FLATBUFFERS_CODE_GENERATOR_H_\n\n#include <string>\n\n#include \"flatbuffers/file_manager.h\"\n#include \"flatbuffers/idl.h\"\n\nnamespace flatbuffers {\n\nstruct CodeGenOptions {\n  std::string output_path;\n  FileSaver* file_saver{nullptr};\n};\n\n// A code generator interface for producing converting flatbuffer schema into\n// code.\nclass CodeGenerator {\n public:\n  virtual ~CodeGenerator() = default;\n\n  enum Status {\n    OK = 0,\n    ERROR = 1,\n    FAILED_VERIFICATION = 2,\n    NOT_IMPLEMENTED = 3\n  };\n\n  std::string status_detail;\n\n  // Generate code from the provided `parser`.\n  //\n  // DEPRECATED: prefer using the other overload of GenerateCode for bfbs.\n  virtual Status GenerateCode(const Parser& parser, const std::string& path,\n                              const std::string& filename) = 0;\n\n  // Generate code from the provided `parser` and place it in the output.\n  virtual Status GenerateCodeString(const Parser& parser,\n                                    const std::string& filename,\n                                    std::string& output) {\n    (void)parser;\n    (void)filename;\n    (void)output;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  // Generate code from the provided `buffer` of given `length`. The buffer is a\n  // serialized reflection.fbs.\n  virtual Status GenerateCode(const uint8_t* buffer, int64_t length,\n                              const CodeGenOptions& options) = 0;\n\n  virtual Status GenerateMakeRule(const Parser& parser, const std::string& path,\n                                  const std::string& filename,\n                                  std::string& output) = 0;\n\n  virtual Status GenerateGrpcCode(const Parser& parser, const std::string& path,\n                                  const std::string& filename) = 0;\n\n  virtual Status GenerateRootFile(const Parser& parser,\n                                  const std::string& path) = 0;\n\n  virtual bool IsSchemaOnly() const = 0;\n\n  virtual bool SupportsBfbsGeneration() const = 0;\n\n  virtual bool SupportsRootFileGeneration() const = 0;\n\n  virtual IDLOptions::Language Language() const = 0;\n\n  virtual std::string LanguageName() const = 0;\n\n protected:\n  CodeGenerator() = default;\n\n private:\n  // Copying is not supported.\n  CodeGenerator(const CodeGenerator&) = delete;\n  CodeGenerator& operator=(const CodeGenerator&) = delete;\n};\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_CODE_GENERATOR_H_\n"
  },
  {
    "path": "include/flatbuffers/code_generators.h",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_CODE_GENERATORS_H_\n#define FLATBUFFERS_CODE_GENERATORS_H_\n\n#include <map>\n#include <sstream>\n\n#include \"flatbuffers/idl.h\"\n\nnamespace flatbuffers {\n\n// Utility class to assist in generating code through use of text templates.\n//\n// Example code:\n//   CodeWriter code(\"\\t\");\n//   code.SetValue(\"NAME\", \"Foo\");\n//   code += \"void {{NAME}}() { printf(\"%s\", \"{{NAME}}\"); }\";\n//   code.SetValue(\"NAME\", \"Bar\");\n//   code += \"void {{NAME}}() { printf(\"%s\", \"{{NAME}}\"); }\";\n//   std::cout << code.ToString() << std::endl;\n//\n// Output:\n//  void Foo() { printf(\"%s\", \"Foo\"); }\n//  void Bar() { printf(\"%s\", \"Bar\"); }\nclass CodeWriter {\n public:\n  CodeWriter(std::string pad = std::string())\n      : pad_(pad), cur_ident_lvl_(0), ignore_ident_(false) {}\n\n  // Clears the current \"written\" code.\n  void Clear() {\n    stream_.str(\"\");\n    stream_.clear();\n  }\n\n  // Associates a key with a value.  All subsequent calls to operator+=, where\n  // the specified key is contained in {{ and }} delimiters will be replaced by\n  // the given value.\n  void SetValue(const std::string& key, const std::string& value) {\n    value_map_[key] = value;\n  }\n\n  std::string GetValue(const std::string& key) const {\n    const auto it = value_map_.find(key);\n    return it == value_map_.end() ? \"\" : it->second;\n  }\n\n  // Appends the given text to the generated code as well as a newline\n  // character.  Any text within {{ and }} delimiters is replaced by values\n  // previously stored in the CodeWriter by calling SetValue above.  The newline\n  // will be suppressed if the text ends with the \\\\ character.\n  void operator+=(std::string text);\n\n  // Returns the current contents of the CodeWriter as a std::string.\n  std::string ToString() const { return stream_.str(); }\n\n  // Increase ident level for writing code\n  void IncrementIdentLevel() { cur_ident_lvl_++; }\n  // Decrease ident level for writing code\n  void DecrementIdentLevel() {\n    if (cur_ident_lvl_) cur_ident_lvl_--;\n  }\n\n  void SetPadding(const std::string& padding) { pad_ = padding; }\n\n private:\n  std::map<std::string, std::string> value_map_;\n  std::stringstream stream_;\n  std::string pad_;\n  int cur_ident_lvl_;\n  bool ignore_ident_;\n\n  // Add ident padding (tab or space) based on ident level\n  void AppendIdent(std::stringstream& stream);\n};\n\nclass BaseGenerator {\n public:\n  virtual bool generate() = 0;\n\n  static std::string NamespaceDir(const Parser& parser, const std::string& path,\n                                  const Namespace& ns,\n                                  const bool dasherize = false);\n\n  std::string GeneratedFileName(const std::string& path,\n                                const std::string& file_name,\n                                const IDLOptions& options) const;\n\n protected:\n  BaseGenerator(const Parser& parser, const std::string& path,\n                const std::string& file_name, std::string qualifying_start,\n                std::string qualifying_separator, std::string default_extension)\n      : parser_(parser),\n        path_(path),\n        file_name_(file_name),\n        qualifying_start_(qualifying_start),\n        qualifying_separator_(qualifying_separator),\n        default_extension_(default_extension) {}\n  virtual ~BaseGenerator() {}\n\n  // No copy/assign.\n  BaseGenerator& operator=(const BaseGenerator&);\n  BaseGenerator(const BaseGenerator&);\n\n  std::string NamespaceDir(const Namespace& ns,\n                           const bool dasherize = false) const;\n\n  static const char* FlatBuffersGeneratedWarning();\n\n  static std::string FullNamespace(const char* separator, const Namespace& ns);\n\n  static std::string LastNamespacePart(const Namespace& ns);\n\n  // tracks the current namespace for early exit in WrapInNameSpace\n  // c++, java and csharp returns a different namespace from\n  // the following default (no early exit, always fully qualify),\n  // which works for js and php\n  virtual const Namespace* CurrentNameSpace() const { return nullptr; }\n\n  // Ensure that a type is prefixed with its namespace even within\n  // its own namespace to avoid conflict between generated method\n  // names and similarly named classes or structs\n  std::string WrapInNameSpace(const Namespace* ns,\n                              const std::string& name) const;\n\n  std::string WrapInNameSpace(const Definition& def,\n                              const std::string& suffix = \"\") const;\n\n  std::string GetNameSpace(const Definition& def) const;\n\n  const Parser& parser_;\n  const std::string& path_;\n  const std::string& file_name_;\n  const std::string qualifying_start_;\n  const std::string qualifying_separator_;\n  const std::string default_extension_;\n};\n\nstruct CommentConfig {\n  const char* first_line;\n  const char* content_line_prefix;\n  const char* last_line;\n};\n\nextern void GenComment(const std::vector<std::string>& dc,\n                       std::string* code_ptr, const CommentConfig* config,\n                       const char* prefix = \"\");\n\nclass FloatConstantGenerator {\n public:\n  virtual ~FloatConstantGenerator() {}\n  std::string GenFloatConstant(const FieldDef& field) const;\n\n private:\n  virtual std::string Value(double v, const std::string& src) const = 0;\n  virtual std::string Inf(double v) const = 0;\n  virtual std::string NaN(double v) const = 0;\n\n  virtual std::string Value(float v, const std::string& src) const = 0;\n  virtual std::string Inf(float v) const = 0;\n  virtual std::string NaN(float v) const = 0;\n\n  template <typename T>\n  std::string GenFloatConstantImpl(const FieldDef& field) const;\n};\n\nclass SimpleFloatConstantGenerator : public FloatConstantGenerator {\n public:\n  SimpleFloatConstantGenerator(const char* nan_number,\n                               const char* pos_inf_number,\n                               const char* neg_inf_number);\n\n private:\n  std::string Value(double v,\n                    const std::string& src) const FLATBUFFERS_OVERRIDE;\n  std::string Inf(double v) const FLATBUFFERS_OVERRIDE;\n  std::string NaN(double v) const FLATBUFFERS_OVERRIDE;\n\n  std::string Value(float v, const std::string& src) const FLATBUFFERS_OVERRIDE;\n  std::string Inf(float v) const FLATBUFFERS_OVERRIDE;\n  std::string NaN(float v) const FLATBUFFERS_OVERRIDE;\n\n  const std::string nan_number_;\n  const std::string pos_inf_number_;\n  const std::string neg_inf_number_;\n};\n\n// C++, C#, Java like generator.\nclass TypedFloatConstantGenerator : public FloatConstantGenerator {\n public:\n  TypedFloatConstantGenerator(const char* double_prefix,\n                              const char* single_prefix, const char* nan_number,\n                              const char* pos_inf_number,\n                              const char* neg_inf_number = \"\");\n\n private:\n  std::string Value(double v,\n                    const std::string& src) const FLATBUFFERS_OVERRIDE;\n  std::string Inf(double v) const FLATBUFFERS_OVERRIDE;\n\n  std::string NaN(double v) const FLATBUFFERS_OVERRIDE;\n\n  std::string Value(float v, const std::string& src) const FLATBUFFERS_OVERRIDE;\n  std::string Inf(float v) const FLATBUFFERS_OVERRIDE;\n  std::string NaN(float v) const FLATBUFFERS_OVERRIDE;\n\n  std::string MakeNaN(const std::string& prefix) const;\n  std::string MakeInf(bool neg, const std::string& prefix) const;\n\n  const std::string double_prefix_;\n  const std::string single_prefix_;\n  const std::string nan_number_;\n  const std::string pos_inf_number_;\n  const std::string neg_inf_number_;\n};\n\nstd::string JavaCSharpMakeRule(const bool java, const Parser& parser,\n                               const std::string& path,\n                               const std::string& file_name);\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_CODE_GENERATORS_H_\n"
  },
  {
    "path": "include/flatbuffers/default_allocator.h",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_DEFAULT_ALLOCATOR_H_\n#define FLATBUFFERS_DEFAULT_ALLOCATOR_H_\n\n#include \"flatbuffers/allocator.h\"\n#include \"flatbuffers/base.h\"\n\nnamespace flatbuffers {\n\n// DefaultAllocator uses new/delete to allocate memory regions\nclass DefaultAllocator : public Allocator {\n public:\n  uint8_t* allocate(size_t size) FLATBUFFERS_OVERRIDE {\n    return new uint8_t[size];\n  }\n\n  void deallocate(uint8_t* p, size_t) FLATBUFFERS_OVERRIDE { delete[] p; }\n\n  static void dealloc(void* p, size_t) { delete[] static_cast<uint8_t*>(p); }\n};\n\n// These functions allow for a null allocator to mean use the default allocator,\n// as used by DetachedBuffer and vector_downward below.\n// This is to avoid having a statically or dynamically allocated default\n// allocator, or having to move it between the classes that may own it.\ninline uint8_t* Allocate(Allocator* allocator, size_t size) {\n  return allocator ? allocator->allocate(size)\n                   : DefaultAllocator().allocate(size);\n}\n\ninline void Deallocate(Allocator* allocator, uint8_t* p, size_t size) {\n  if (allocator)\n    allocator->deallocate(p, size);\n  else\n    DefaultAllocator().deallocate(p, size);\n}\n\ninline uint8_t* ReallocateDownward(Allocator* allocator, uint8_t* old_p,\n                                   size_t old_size, size_t new_size,\n                                   size_t in_use_back, size_t in_use_front) {\n  return allocator ? allocator->reallocate_downward(old_p, old_size, new_size,\n                                                    in_use_back, in_use_front)\n                   : DefaultAllocator().reallocate_downward(\n                         old_p, old_size, new_size, in_use_back, in_use_front);\n}\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_DEFAULT_ALLOCATOR_H_\n"
  },
  {
    "path": "include/flatbuffers/detached_buffer.h",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_DETACHED_BUFFER_H_\n#define FLATBUFFERS_DETACHED_BUFFER_H_\n\n#include \"flatbuffers/allocator.h\"\n#include \"flatbuffers/base.h\"\n#include \"flatbuffers/default_allocator.h\"\n\nnamespace flatbuffers {\n\n// DetachedBuffer is a finished flatbuffer memory region, detached from its\n// builder. The original memory region and allocator are also stored so that\n// the DetachedBuffer can manage the memory lifetime.\nclass DetachedBuffer {\n public:\n  DetachedBuffer()\n      : allocator_(nullptr),\n        own_allocator_(false),\n        buf_(nullptr),\n        reserved_(0),\n        cur_(nullptr),\n        size_(0) {}\n\n  DetachedBuffer(Allocator* allocator, bool own_allocator, uint8_t* buf,\n                 size_t reserved, uint8_t* cur, size_t sz)\n      : allocator_(allocator),\n        own_allocator_(own_allocator),\n        buf_(buf),\n        reserved_(reserved),\n        cur_(cur),\n        size_(sz) {}\n\n  DetachedBuffer(DetachedBuffer&& other) noexcept\n      : allocator_(other.allocator_),\n        own_allocator_(other.own_allocator_),\n        buf_(other.buf_),\n        reserved_(other.reserved_),\n        cur_(other.cur_),\n        size_(other.size_) {\n    other.reset();\n  }\n\n  DetachedBuffer& operator=(DetachedBuffer&& other) noexcept {\n    if (this == &other) return *this;\n\n    destroy();\n\n    allocator_ = other.allocator_;\n    own_allocator_ = other.own_allocator_;\n    buf_ = other.buf_;\n    reserved_ = other.reserved_;\n    cur_ = other.cur_;\n    size_ = other.size_;\n\n    other.reset();\n\n    return *this;\n  }\n\n  ~DetachedBuffer() { destroy(); }\n\n  const uint8_t* data() const { return cur_; }\n\n  uint8_t* data() { return cur_; }\n\n  size_t size() const { return size_; }\n\n  uint8_t* begin() { return data(); }\n  const uint8_t* begin() const { return data(); }\n  uint8_t* end() { return data() + size(); }\n  const uint8_t* end() const { return data() + size(); }\n\n  // These may change access mode, leave these at end of public section\n  FLATBUFFERS_DELETE_FUNC(DetachedBuffer(const DetachedBuffer& other));\n  FLATBUFFERS_DELETE_FUNC(\n      DetachedBuffer& operator=(const DetachedBuffer& other));\n\n protected:\n  Allocator* allocator_;\n  bool own_allocator_;\n  uint8_t* buf_;\n  size_t reserved_;\n  uint8_t* cur_;\n  size_t size_;\n\n  inline void destroy() {\n    if (buf_) Deallocate(allocator_, buf_, reserved_);\n    if (own_allocator_ && allocator_) {\n      delete allocator_;\n    }\n    reset();\n  }\n\n  inline void reset() {\n    allocator_ = nullptr;\n    own_allocator_ = false;\n    buf_ = nullptr;\n    reserved_ = 0;\n    cur_ = nullptr;\n    size_ = 0;\n  }\n};\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_DETACHED_BUFFER_H_\n"
  },
  {
    "path": "include/flatbuffers/file_manager.h",
    "content": "/*\n * Copyright 2023 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_FILE_MANAGER_H_\n#define FLATBUFFERS_FILE_MANAGER_H_\n\n#include <cstddef>\n#include <set>\n#include <string>\n\nnamespace flatbuffers {\n\n// A File interface to write data to file by default or\n// save only file names\nclass FileSaver {\n public:\n  FileSaver() = default;\n  virtual ~FileSaver() = default;\n\n  virtual bool SaveFile(const char* name, const char* buf, size_t len,\n                        bool binary) = 0;\n\n  bool SaveFile(const char* name, const std::string& buf, bool binary) {\n    return SaveFile(name, buf.c_str(), buf.size(), binary);\n  }\n\n  virtual void Finish() {}\n\n private:\n  // Copying is not supported.\n  FileSaver(const FileSaver&) = delete;\n  FileSaver& operator=(const FileSaver&) = delete;\n  // Rule of 5\n  FileSaver(FileSaver&&) = default;\n  FileSaver& operator=(FileSaver&&) = default;\n};\n\nclass RealFileSaver final : public FileSaver {\n public:\n  bool SaveFile(const char* name, const char* buf, size_t len,\n                bool binary) final;\n};\n\nclass FileNameSaver final : public FileSaver {\n public:\n  bool SaveFile(const char* name, const char* buf, size_t len,\n                bool binary) final;\n\n  void Finish() final;\n\n private:\n  std::set<std::string> file_names_{};\n};\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_FILE_MANAGER_H_\n"
  },
  {
    "path": "include/flatbuffers/flatbuffer_builder.h",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_FLATBUFFER_BUILDER_H_\n#define FLATBUFFERS_FLATBUFFER_BUILDER_H_\n\n#include <algorithm>\n#include <cstdint>\n#include <functional>\n#include <initializer_list>\n#include <type_traits>\n\n#include \"flatbuffers/allocator.h\"\n#include \"flatbuffers/array.h\"\n#include \"flatbuffers/base.h\"\n#include \"flatbuffers/buffer.h\"\n#include \"flatbuffers/buffer_ref.h\"\n#include \"flatbuffers/default_allocator.h\"\n#include \"flatbuffers/detached_buffer.h\"\n#include \"flatbuffers/stl_emulation.h\"\n#include \"flatbuffers/string.h\"\n#include \"flatbuffers/struct.h\"\n#include \"flatbuffers/table.h\"\n#include \"flatbuffers/vector.h\"\n#include \"flatbuffers/vector_downward.h\"\n#include \"flatbuffers/verifier.h\"\n\nnamespace flatbuffers {\n\n// Converts a Field ID to a virtual table offset.\ninline voffset_t FieldIndexToOffset(voffset_t field_id) {\n  // Should correspond to what EndTable() below builds up.\n  const voffset_t fixed_fields =\n      2 * sizeof(voffset_t);  // Vtable size and Object Size.\n  size_t offset = fixed_fields + field_id * sizeof(voffset_t);\n  FLATBUFFERS_ASSERT(offset < std::numeric_limits<voffset_t>::max());\n  return static_cast<voffset_t>(offset);\n}\n\ntemplate <typename T, typename Alloc = std::allocator<T>>\nconst T* data(const std::vector<T, Alloc>& v) {\n  // Eventually the returned pointer gets passed down to memcpy, so\n  // we need it to be non-null to avoid undefined behavior.\n  static uint8_t t;\n  return v.empty() ? reinterpret_cast<const T*>(&t) : &v.front();\n}\ntemplate <typename T, typename Alloc = std::allocator<T>>\nT* data(std::vector<T, Alloc>& v) {\n  // Eventually the returned pointer gets passed down to memcpy, so\n  // we need it to be non-null to avoid undefined behavior.\n  static uint8_t t;\n  return v.empty() ? reinterpret_cast<T*>(&t) : &v.front();\n}\n\n/// @addtogroup flatbuffers_cpp_api\n/// @{\n/// @class FlatBufferBuilder\n/// @brief Helper class to hold data needed in creation of a FlatBuffer.\n/// To serialize data, you typically call one of the `Create*()` functions in\n/// the generated code, which in turn call a sequence of `StartTable`/\n/// `PushElement`/`AddElement`/`EndTable`, or the builtin `CreateString`/\n/// `CreateVector` functions. Do this is depth-first order to build up a tree to\n/// the root. `Finish()` wraps up the buffer ready for transport.\ntemplate <bool Is64Aware = false>\nclass FlatBufferBuilderImpl {\n public:\n  // This switches the size type of the builder, based on if its 64-bit aware\n  // (uoffset64_t) or not (uoffset_t).\n  typedef\n      typename std::conditional<Is64Aware, uoffset64_t, uoffset_t>::type SizeT;\n\n  /// @brief Default constructor for FlatBufferBuilder.\n  /// @param[in] initial_size The initial size of the buffer, in bytes. Defaults\n  /// to `1024`.\n  /// @param[in] allocator An `Allocator` to use. If null will use\n  /// `DefaultAllocator`.\n  /// @param[in] own_allocator Whether the builder/vector should own the\n  /// allocator. Defaults to / `false`.\n  /// @param[in] buffer_minalign Force the buffer to be aligned to the given\n  /// minimum alignment upon reallocation. Only needed if you intend to store\n  /// types with custom alignment AND you wish to read the buffer in-place\n  /// directly after creation.\n  explicit FlatBufferBuilderImpl(\n      size_t initial_size = 1024, Allocator* allocator = nullptr,\n      bool own_allocator = false,\n      size_t buffer_minalign = AlignOf<largest_scalar_t>())\n      : buf_(initial_size, allocator, own_allocator, buffer_minalign,\n             static_cast<SizeT>(Is64Aware ? FLATBUFFERS_MAX_64_BUFFER_SIZE\n                                          : FLATBUFFERS_MAX_BUFFER_SIZE)),\n        num_field_loc(0),\n        max_voffset_(0),\n        length_of_64_bit_region_(0),\n        nested(false),\n        finished(false),\n        minalign_(1),\n        force_defaults_(false),\n        dedup_vtables_(true),\n        string_pool(nullptr) {\n    EndianCheck();\n  }\n\n  /// @brief Move constructor for FlatBufferBuilder.\n  FlatBufferBuilderImpl(FlatBufferBuilderImpl&& other) noexcept\n      : buf_(1024, nullptr, false, AlignOf<largest_scalar_t>(),\n             static_cast<SizeT>(Is64Aware ? FLATBUFFERS_MAX_64_BUFFER_SIZE\n                                          : FLATBUFFERS_MAX_BUFFER_SIZE)),\n        num_field_loc(0),\n        max_voffset_(0),\n        length_of_64_bit_region_(0),\n        nested(false),\n        finished(false),\n        minalign_(1),\n        force_defaults_(false),\n        dedup_vtables_(true),\n        string_pool(nullptr) {\n    EndianCheck();\n    // Default construct and swap idiom.\n    // Lack of delegating constructors in vs2010 makes it more verbose than\n    // needed.\n    Swap(other);\n  }\n\n  /// @brief Move assignment operator for FlatBufferBuilder.\n  FlatBufferBuilderImpl& operator=(FlatBufferBuilderImpl&& other) noexcept {\n    // Move construct a temporary and swap idiom\n    FlatBufferBuilderImpl temp(std::move(other));\n    Swap(temp);\n    return *this;\n  }\n\n  void Swap(FlatBufferBuilderImpl& other) {\n    using std::swap;\n    buf_.swap(other.buf_);\n    swap(num_field_loc, other.num_field_loc);\n    swap(max_voffset_, other.max_voffset_);\n    swap(length_of_64_bit_region_, other.length_of_64_bit_region_);\n    swap(nested, other.nested);\n    swap(finished, other.finished);\n    swap(minalign_, other.minalign_);\n    swap(force_defaults_, other.force_defaults_);\n    swap(dedup_vtables_, other.dedup_vtables_);\n    swap(string_pool, other.string_pool);\n  }\n\n  ~FlatBufferBuilderImpl() {\n    if (string_pool) delete string_pool;\n  }\n\n  void Reset() {\n    Clear();       // clear builder state\n    buf_.reset();  // deallocate buffer\n  }\n\n  /// @brief Reset all the state in this FlatBufferBuilder so it can be reused\n  /// to construct another buffer.\n  void Clear() {\n    ClearOffsets();\n    buf_.clear();\n    nested = false;\n    finished = false;\n    minalign_ = 1;\n    length_of_64_bit_region_ = 0;\n    if (string_pool) string_pool->clear();\n  }\n\n  /// @brief The current size of the serialized buffer, counting from the end.\n  /// @return Returns an `SizeT` with the current size of the buffer.\n  SizeT GetSize() const { return buf_.size(); }\n\n  /// @brief The current size of the serialized buffer relative to the end of\n  /// the 32-bit region.\n  /// @return Returns an `uoffset_t` with the current size of the buffer.\n  template <bool is_64 = Is64Aware>\n  // Only enable this method for the 64-bit builder, as only that builder is\n  // concerned with the 32/64-bit boundary, and should be the one to bare any\n  // run time costs.\n  typename std::enable_if<is_64, uoffset_t>::type GetSizeRelative32BitRegion()\n      const {\n    //[32-bit region][64-bit region]\n    //         [XXXXXXXXXXXXXXXXXXX] GetSize()\n    //               [YYYYYYYYYYYYY] length_of_64_bit_region_\n    //         [ZZZZ]                return size\n    return static_cast<uoffset_t>(GetSize() - length_of_64_bit_region_);\n  }\n\n  template <bool is_64 = Is64Aware>\n  // Only enable this method for the 32-bit builder.\n  typename std::enable_if<!is_64, uoffset_t>::type GetSizeRelative32BitRegion()\n      const {\n    return static_cast<uoffset_t>(GetSize());\n  }\n\n  /// @brief Get the serialized buffer (after you call `Finish()`).\n  /// @return Returns an `uint8_t` pointer to the FlatBuffer data inside the\n  /// buffer.\n  uint8_t* GetBufferPointer() const {\n    Finished();\n    return buf_.data();\n  }\n\n  /// @brief Get the serialized buffer (after you call `Finish()`) as a span.\n  /// @return Returns a constructed flatbuffers::span that is a view over the\n  /// FlatBuffer data inside the buffer.\n  flatbuffers::span<uint8_t> GetBufferSpan() const {\n    Finished();\n    return flatbuffers::span<uint8_t>(buf_.data(), buf_.size());\n  }\n\n  /// @brief Get a pointer to an unfinished buffer.\n  /// @return Returns a `uint8_t` pointer to the unfinished buffer.\n  uint8_t* GetCurrentBufferPointer() const { return buf_.data(); }\n\n  /// @brief Get the released DetachedBuffer.\n  /// @return A `DetachedBuffer` that owns the buffer and its allocator.\n  DetachedBuffer Release() {\n    Finished();\n    DetachedBuffer buffer = buf_.release();\n    Clear();\n    return buffer;\n  }\n\n  /// @brief Get the released pointer to the serialized buffer.\n  /// @param size The size of the memory block containing\n  /// the serialized `FlatBuffer`.\n  /// @param offset The offset from the released pointer where the finished\n  /// `FlatBuffer` starts.\n  /// @return A raw pointer to the start of the memory block containing\n  /// the serialized `FlatBuffer`.\n  /// @remark If the allocator is owned, it gets deleted when the destructor is\n  /// called.\n  uint8_t* ReleaseRaw(size_t& size, size_t& offset) {\n    Finished();\n    uint8_t* raw = buf_.release_raw(size, offset);\n    Clear();\n    return raw;\n  }\n\n  /// @brief get the minimum alignment this buffer needs to be accessed\n  /// properly. This is only known once all elements have been written (after\n  /// you call Finish()). You can use this information if you need to embed\n  /// a FlatBuffer in some other buffer, such that you can later read it\n  /// without first having to copy it into its own buffer.\n  size_t GetBufferMinAlignment() const {\n    Finished();\n    return minalign_;\n  }\n\n  /// @cond FLATBUFFERS_INTERNAL\n  void Finished() const {\n    // If you get this assert, you're attempting to get access a buffer\n    // which hasn't been finished yet. Be sure to call\n    // FlatBufferBuilder::Finish with your root table.\n    // If you really need to access an unfinished buffer, call\n    // GetCurrentBufferPointer instead.\n    FLATBUFFERS_ASSERT(finished);\n  }\n  /// @endcond\n\n  /// @brief In order to save space, fields that are set to their default value\n  /// don't get serialized into the buffer.\n  /// @param[in] fd When set to `true`, always serializes default values that\n  /// are set. Optional fields which are not set explicitly, will still not be\n  /// serialized.\n  void ForceDefaults(bool fd) { force_defaults_ = fd; }\n\n  /// @brief By default vtables are deduped in order to save space.\n  /// @param[in] dedup When set to `true`, dedup vtables.\n  void DedupVtables(bool dedup) { dedup_vtables_ = dedup; }\n\n  /// @cond FLATBUFFERS_INTERNAL\n  void Pad(size_t num_bytes) { buf_.fill(num_bytes); }\n\n  void TrackMinAlign(size_t elem_size) {\n    if (elem_size > minalign_) minalign_ = elem_size;\n  }\n\n  void Align(size_t elem_size) {\n    TrackMinAlign(elem_size);\n    buf_.fill(PaddingBytes(buf_.size(), elem_size));\n  }\n\n  void PushFlatBuffer(const uint8_t* bytes, size_t size) {\n    PushBytes(bytes, size);\n    finished = true;\n  }\n\n  void PushBytes(const uint8_t* bytes, size_t size) { buf_.push(bytes, size); }\n\n  void PopBytes(size_t amount) { buf_.pop(amount); }\n\n  template <typename T>\n  void AssertScalarT() {\n    // The code assumes power of 2 sizes and endian-swap-ability.\n    static_assert(flatbuffers::is_scalar<T>::value, \"T must be a scalar type\");\n  }\n\n  // Write a single aligned scalar to the buffer\n  template <typename T, typename ReturnT = uoffset_t>\n  ReturnT PushElement(T element) {\n    AssertScalarT<T>();\n    Align(sizeof(T));\n    buf_.push_small(EndianScalar(element));\n    return CalculateOffset<ReturnT>();\n  }\n\n  template <typename T, template <typename> class OffsetT = Offset>\n  uoffset_t PushElement(OffsetT<T> off) {\n    // Special case for offsets: see ReferTo below.\n    return PushElement(ReferTo(off.o));\n  }\n\n  // When writing fields, we track where they are, so we can create correct\n  // vtables later.\n  void TrackField(voffset_t field, uoffset_t off) {\n    FieldLoc fl = {off, field};\n    buf_.scratch_push_small(fl);\n    num_field_loc++;\n    if (field > max_voffset_) {\n      max_voffset_ = field;\n    }\n  }\n\n  // Like PushElement, but additionally tracks the field this represents.\n  template <typename T>\n  void AddElement(voffset_t field, T e, T def) {\n    // We don't serialize values equal to the default.\n    if (IsTheSameAs(e, def) && !force_defaults_) return;\n    TrackField(field, PushElement(e));\n  }\n\n  template <typename T>\n  void AddElement(voffset_t field, T e) {\n    TrackField(field, PushElement(e));\n  }\n\n  template <typename T>\n  void AddOffset(voffset_t field, Offset<T> off) {\n    if (off.IsNull()) return;  // Don't store.\n    AddElement(field, ReferTo(off.o), static_cast<uoffset_t>(0));\n  }\n\n  template <typename T>\n  void AddOffset(voffset_t field, Offset64<T> off) {\n    if (off.IsNull()) return;  // Don't store.\n    AddElement(field, ReferTo(off.o), static_cast<uoffset64_t>(0));\n  }\n\n  template <typename T>\n  void AddStruct(voffset_t field, const T* structptr) {\n    if (!structptr) return;  // Default, don't store.\n    Align(AlignOf<T>());\n    buf_.push_small(*structptr);\n    TrackField(field, CalculateOffset<uoffset_t>());\n  }\n\n  void AddStructOffset(voffset_t field, uoffset_t off) {\n    TrackField(field, off);\n  }\n\n  // Offsets initially are relative to the end of the buffer (downwards).\n  // This function converts them to be relative to the current location\n  // in the buffer (when stored here), pointing upwards.\n  uoffset_t ReferTo(uoffset_t off) {\n    // Align to ensure GetSizeRelative32BitRegion() below is correct.\n    Align(sizeof(uoffset_t));\n    // 32-bit offsets are relative to the tail of the 32-bit region of the\n    // buffer. For most cases (without 64-bit entities) this is equivalent to\n    // size of the whole buffer (e.g. GetSize())\n    return ReferTo(off, GetSizeRelative32BitRegion());\n  }\n\n  uoffset64_t ReferTo(uoffset64_t off) {\n    // Align to ensure GetSize() below is correct.\n    Align(sizeof(uoffset64_t));\n    // 64-bit offsets are relative to tail of the whole buffer\n    return ReferTo(off, GetSize());\n  }\n\n  template <typename T, typename T2>\n  T ReferTo(const T off, const T2 size) {\n    FLATBUFFERS_ASSERT(off && off <= size);\n    return size - off + static_cast<T>(sizeof(T));\n  }\n\n  template <typename T>\n  T ReferTo(const T off, const T size) {\n    FLATBUFFERS_ASSERT(off && off <= size);\n    return size - off + static_cast<T>(sizeof(T));\n  }\n\n  void NotNested() {\n    // If you hit this, you're trying to construct a Table/Vector/String\n    // during the construction of its parent table (between the MyTableBuilder\n    // and table.Finish().\n    // Move the creation of these sub-objects to above the MyTableBuilder to\n    // not get this assert.\n    // Ignoring this assert may appear to work in simple cases, but the reason\n    // it is here is that storing objects in-line may cause vtable offsets\n    // to not fit anymore. It also leads to vtable duplication.\n    FLATBUFFERS_ASSERT(!nested);\n    // If you hit this, fields were added outside the scope of a table.\n    FLATBUFFERS_ASSERT(!num_field_loc);\n  }\n\n  // From generated code (or from the parser), we call StartTable/EndTable\n  // with a sequence of AddElement calls in between.\n  uoffset_t StartTable() {\n    NotNested();\n    nested = true;\n    return GetSizeRelative32BitRegion();\n  }\n\n  // This finishes one serialized object by generating the vtable if it's a\n  // table, comparing it against existing vtables, and writing the\n  // resulting vtable offset.\n  uoffset_t EndTable(uoffset_t start) {\n    // If you get this assert, a corresponding StartTable wasn't called.\n    FLATBUFFERS_ASSERT(nested);\n    // Write the vtable offset, which is the start of any Table.\n    // We fill its value later.\n    // This is relative to the end of the 32-bit region.\n    const uoffset_t vtable_offset_loc =\n        static_cast<uoffset_t>(PushElement<soffset_t>(0));\n    // Write a vtable, which consists entirely of voffset_t elements.\n    // It starts with the number of offsets, followed by a type id, followed\n    // by the offsets themselves. In reverse:\n    // Include space for the last offset and ensure empty tables have a\n    // minimum size.\n    max_voffset_ =\n        (std::max)(static_cast<voffset_t>(max_voffset_ + sizeof(voffset_t)),\n                   FieldIndexToOffset(0));\n    buf_.fill_big(max_voffset_);\n    const uoffset_t table_object_size = vtable_offset_loc - start;\n    // Vtable use 16bit offsets.\n    FLATBUFFERS_ASSERT(table_object_size < 0x10000);\n    WriteScalar<voffset_t>(buf_.data() + sizeof(voffset_t),\n                           static_cast<voffset_t>(table_object_size));\n    WriteScalar<voffset_t>(buf_.data(), max_voffset_);\n    // Write the offsets into the table\n    for (auto it = buf_.scratch_end() - num_field_loc * sizeof(FieldLoc);\n         it < buf_.scratch_end(); it += sizeof(FieldLoc)) {\n      auto field_location = reinterpret_cast<FieldLoc*>(it);\n      const voffset_t pos =\n          static_cast<voffset_t>(vtable_offset_loc - field_location->off);\n      // If this asserts, it means you've set a field twice.\n      FLATBUFFERS_ASSERT(\n          !ReadScalar<voffset_t>(buf_.data() + field_location->id));\n      WriteScalar<voffset_t>(buf_.data() + field_location->id, pos);\n    }\n    ClearOffsets();\n    auto vt1 = reinterpret_cast<voffset_t*>(buf_.data());\n    auto vt1_size = ReadScalar<voffset_t>(vt1);\n    auto vt_use = GetSizeRelative32BitRegion();\n    // See if we already have generated a vtable with this exact same\n    // layout before. If so, make it point to the old one, remove this one.\n    if (dedup_vtables_) {\n      for (auto it = buf_.scratch_data(); it < buf_.scratch_end();\n           it += sizeof(uoffset_t)) {\n        auto vt_offset_ptr = reinterpret_cast<uoffset_t*>(it);\n        auto vt2 = reinterpret_cast<voffset_t*>(\n            buf_.data_at(*vt_offset_ptr + length_of_64_bit_region_));\n        auto vt2_size = ReadScalar<voffset_t>(vt2);\n        if (vt1_size != vt2_size || 0 != memcmp(vt2, vt1, vt1_size)) continue;\n        vt_use = *vt_offset_ptr;\n        buf_.pop(GetSizeRelative32BitRegion() - vtable_offset_loc);\n        break;\n      }\n    }\n    // If this is a new vtable, remember it.\n    if (vt_use == GetSizeRelative32BitRegion()) {\n      buf_.scratch_push_small(vt_use);\n    }\n    // Fill the vtable offset we created above.\n    // The offset points from the beginning of the object to where the vtable is\n    // stored.\n    // Offsets default direction is downward in memory for future format\n    // flexibility (storing all vtables at the start of the file).\n    WriteScalar(buf_.data_at(vtable_offset_loc + length_of_64_bit_region_),\n                static_cast<soffset_t>(vt_use) -\n                    static_cast<soffset_t>(vtable_offset_loc));\n    nested = false;\n    return vtable_offset_loc;\n  }\n\n  FLATBUFFERS_ATTRIBUTE([[deprecated(\"call the version above instead\")]])\n  uoffset_t EndTable(uoffset_t start, voffset_t /*numfields*/) {\n    return EndTable(start);\n  }\n\n  // This checks a required field has been set in a given table that has\n  // just been constructed.\n  template <typename T>\n  void Required(Offset<T> table, voffset_t field) {\n    auto table_ptr = reinterpret_cast<const Table*>(buf_.data_at(table.o));\n    bool ok = table_ptr->GetOptionalFieldOffset(field) != 0;\n    // If this fails, the caller will show what field needs to be set.\n    FLATBUFFERS_ASSERT(ok);\n    (void)ok;\n  }\n\n  uoffset_t StartStruct(size_t alignment) {\n    Align(alignment);\n    return GetSizeRelative32BitRegion();\n  }\n\n  uoffset_t EndStruct() { return GetSizeRelative32BitRegion(); }\n\n  void ClearOffsets() {\n    buf_.scratch_pop(num_field_loc * sizeof(FieldLoc));\n    num_field_loc = 0;\n    max_voffset_ = 0;\n  }\n\n  // Aligns such that when \"len\" bytes are written, an object can be written\n  // after it (forward in the buffer) with \"alignment\" without padding.\n  void PreAlign(size_t len, size_t alignment) {\n    if (len == 0) return;\n    TrackMinAlign(alignment);\n    buf_.fill(PaddingBytes(GetSize() + len, alignment));\n  }\n\n  // Aligns such than when \"len\" bytes are written, an object of type `AlignT`\n  // can be written after it (forward in the buffer) without padding.\n  template <typename AlignT>\n  void PreAlign(size_t len) {\n    AssertScalarT<AlignT>();\n    PreAlign(len, AlignOf<AlignT>());\n  }\n  /// @endcond\n\n  /// @brief Store a string in the buffer, which can contain any binary data.\n  /// @param[in] str A const char pointer to the data to be stored as a string.\n  /// @param[in] len The number of bytes that should be stored from `str`.\n  /// @return Returns the offset in the buffer where the string starts.\n  template <template <typename> class OffsetT = Offset>\n  OffsetT<String> CreateString(const char* str, size_t len) {\n    CreateStringImpl(str, len);\n    return OffsetT<String>(\n        CalculateOffset<typename OffsetT<String>::offset_type>());\n  }\n\n  /// @brief Store a string in the buffer, which is null-terminated.\n  /// @param[in] str A const char pointer to a C-string to add to the buffer.\n  /// @return Returns the offset in the buffer where the string starts.\n  template <template <typename> class OffsetT = Offset>\n  OffsetT<String> CreateString(const char* str) {\n    return CreateString<OffsetT>(str, strlen(str));\n  }\n\n  /// @brief Store a string in the buffer, which is null-terminated.\n  /// @param[in] str A char pointer to a C-string to add to the buffer.\n  /// @return Returns the offset in the buffer where the string starts.\n  template <template <typename> class OffsetT = Offset>\n  OffsetT<String> CreateString(char* str) {\n    return CreateString<OffsetT>(str, strlen(str));\n  }\n\n  /// @brief Store a string in the buffer, which can contain any binary data.\n  /// @param[in] str A const reference to a std::string to store in the buffer.\n  /// @return Returns the offset in the buffer where the string starts.\n  template <template <typename> class OffsetT = Offset>\n  OffsetT<String> CreateString(const std::string& str) {\n    return CreateString<OffsetT>(str.c_str(), str.length());\n  }\n\n  // clang-format off\n  #ifdef FLATBUFFERS_HAS_STRING_VIEW\n  /// @brief Store a string in the buffer, which can contain any binary data.\n  /// @param[in] str A const string_view to copy in to the buffer.\n  /// @return Returns the offset in the buffer where the string starts.\n  template<template <typename> class OffsetT = Offset>\n  OffsetT<String>CreateString(flatbuffers::string_view str) {\n    return CreateString<OffsetT>(str.data(), str.size());\n  }\n  #endif // FLATBUFFERS_HAS_STRING_VIEW\n  // clang-format on\n\n  /// @brief Store a string in the buffer, which can contain any binary data.\n  /// @param[in] str A const pointer to a `String` struct to add to the buffer.\n  /// @return Returns the offset in the buffer where the string starts\n  template <template <typename> class OffsetT = Offset>\n  OffsetT<String> CreateString(const String* str) {\n    return str ? CreateString<OffsetT>(str->c_str(), str->size()) : 0;\n  }\n\n  /// @brief Store a string in the buffer, which can contain any binary data.\n  /// @param[in] str A const reference to a std::string like type with support\n  /// of T::data() and T::length() to store in the buffer.\n  /// @return Returns the offset in the buffer where the string starts.\n  template <template <typename> class OffsetT = Offset,\n            // No need to explicitly declare the T type, let the compiler deduce\n            // it.\n            int&... ExplicitArgumentBarrier, typename T>\n  OffsetT<String> CreateString(const T& str) {\n    return CreateString<OffsetT>(str.data(), str.length());\n  }\n\n  /// @brief Store a string in the buffer, which can contain any binary data.\n  /// If a string with this exact contents has already been serialized before,\n  /// instead simply returns the offset of the existing string. This uses a map\n  /// stored on the heap, but only stores the numerical offsets.\n  /// @param[in] str A const char pointer to the data to be stored as a string.\n  /// @param[in] len The number of bytes that should be stored from `str`.\n  /// @return Returns the offset in the buffer where the string starts.\n  Offset<String> CreateSharedString(const char* str, size_t len) {\n    FLATBUFFERS_ASSERT(FLATBUFFERS_GENERAL_HEAP_ALLOC_OK);\n    if (!string_pool) {\n      string_pool = new StringOffsetMap(StringOffsetCompare(buf_));\n    }\n\n    const size_t size_before_string = buf_.size();\n    // Must first serialize the string, since the set is all offsets into\n    // buffer.\n    const Offset<String> off = CreateString<Offset>(str, len);\n    auto it = string_pool->find(off);\n    // If it exists we reuse existing serialized data!\n    if (it != string_pool->end()) {\n      // We can remove the string we serialized.\n      buf_.pop(buf_.size() - size_before_string);\n      return *it;\n    }\n    // Record this string for future use.\n    string_pool->insert(off);\n    return off;\n  }\n\n#ifdef FLATBUFFERS_HAS_STRING_VIEW\n  /// @brief Store a string in the buffer, which can contain any binary data.\n  /// If a string with this exact contents has already been serialized before,\n  /// instead simply returns the offset of the existing string. This uses a map\n  /// stored on the heap, but only stores the numerical offsets.\n  /// @param[in] str A const std::string_view to store in the buffer.\n  /// @return Returns the offset in the buffer where the string starts\n  Offset<String> CreateSharedString(const flatbuffers::string_view str) {\n    return CreateSharedString(str.data(), str.size());\n  }\n#else\n  /// @brief Store a string in the buffer, which null-terminated.\n  /// If a string with this exact contents has already been serialized before,\n  /// instead simply returns the offset of the existing string. This uses a map\n  /// stored on the heap, but only stores the numerical offsets.\n  /// @param[in] str A const char pointer to a C-string to add to the buffer.\n  /// @return Returns the offset in the buffer where the string starts.\n  Offset<String> CreateSharedString(const char* str) {\n    return CreateSharedString(str, strlen(str));\n  }\n\n  /// @brief Store a string in the buffer, which can contain any binary data.\n  /// If a string with this exact contents has already been serialized before,\n  /// instead simply returns the offset of the existing string. This uses a map\n  /// stored on the heap, but only stores the numerical offsets.\n  /// @param[in] str A const reference to a std::string to store in the buffer.\n  /// @return Returns the offset in the buffer where the string starts.\n  Offset<String> CreateSharedString(const std::string& str) {\n    return CreateSharedString(str.c_str(), str.length());\n  }\n#endif\n\n  /// @brief Store a string in the buffer, which can contain any binary data.\n  /// If a string with this exact contents has already been serialized before,\n  /// instead simply returns the offset of the existing string. This uses a map\n  /// stored on the heap, but only stores the numerical offsets.\n  /// @param[in] str A const pointer to a `String` struct to add to the buffer.\n  /// @return Returns the offset in the buffer where the string starts\n  Offset<String> CreateSharedString(const String* str) {\n    return str ? CreateSharedString(str->c_str(), str->size()) : 0;\n  }\n\n  /// @cond FLATBUFFERS_INTERNAL\n  template <typename LenT = uoffset_t, typename ReturnT = uoffset_t>\n  ReturnT EndVector(size_t len) {\n    FLATBUFFERS_ASSERT(nested);  // Hit if no corresponding StartVector.\n    nested = false;\n    return PushElement<LenT, ReturnT>(static_cast<LenT>(len));\n  }\n\n  template <template <typename> class OffsetT = Offset,\n            typename LenT = uint32_t>\n  void StartVector(size_t len, size_t elemsize, size_t alignment) {\n    NotNested();\n    nested = true;\n    // Align to the Length type of the vector (either 32-bit or 64-bit), so\n    // that the length of the buffer can be added without padding.\n    PreAlign<LenT>(len * elemsize);\n    PreAlign(len * elemsize, alignment);  // Just in case elemsize > uoffset_t.\n  }\n\n  template <typename T, template <typename> class OffsetT = Offset,\n            typename LenT = uint32_t>\n  void StartVector(size_t len) {\n    return StartVector<OffsetT, LenT>(len, sizeof(T), AlignOf<T>());\n  }\n\n  // Call this right before StartVector/CreateVector if you want to force the\n  // alignment to be something different than what the element size would\n  // normally dictate.\n  // This is useful when storing a nested_flatbuffer in a vector of bytes,\n  // or when storing SIMD floats, etc.\n  void ForceVectorAlignment(const size_t len, const size_t elemsize,\n                            const size_t alignment) {\n    if (len == 0) return;\n    FLATBUFFERS_ASSERT(VerifyAlignmentRequirements(alignment));\n    PreAlign(len * elemsize, alignment);\n  }\n\n  template <bool is_64 = Is64Aware>\n  typename std::enable_if<is_64, void>::type ForceVectorAlignment64(\n      const size_t len, const size_t elemsize, const size_t alignment) {\n    // If you hit this assertion, you are trying to force alignment on a\n    // vector with offset64 after serializing a 32-bit offset.\n    FLATBUFFERS_ASSERT(GetSize() == length_of_64_bit_region_);\n\n    // Call through.\n    ForceVectorAlignment(len, elemsize, alignment);\n\n    // Update the 64 bit region.\n    length_of_64_bit_region_ = GetSize();\n  }\n\n  // Similar to ForceVectorAlignment but for String fields.\n  void ForceStringAlignment(size_t len, size_t alignment) {\n    if (len == 0) return;\n    FLATBUFFERS_ASSERT(VerifyAlignmentRequirements(alignment));\n    PreAlign((len + 1) * sizeof(char), alignment);\n  }\n\n  /// @endcond\n\n  /// @brief Serialize an array into a FlatBuffer `vector`.\n  /// @tparam T The data type of the array elements.\n  /// @tparam OffsetT the type of offset to return\n  /// @tparam VectorT the type of vector to cast to.\n  /// @param[in] v A pointer to the array of type `T` to serialize into the\n  /// buffer as a `vector`.\n  /// @param[in] len The number of elements to serialize.\n  /// @return Returns a typed `TOffset` into the serialized data indicating\n  /// where the vector is stored.\n  template <typename T, template <typename...> class OffsetT = Offset,\n            template <typename...> class VectorT = Vector>\n  OffsetT<VectorT<T>> CreateVector(const T* v, size_t len) {\n    // The type of the length field in the vector.\n    typedef typename VectorT<T>::size_type LenT;\n    typedef typename OffsetT<VectorT<T>>::offset_type offset_type;\n    // If this assert hits, you're specifying a template argument that is\n    // causing the wrong overload to be selected, remove it.\n    AssertScalarT<T>();\n    StartVector<T, OffsetT, LenT>(len);\n    if (len > 0) {\n      // clang-format off\n      #if FLATBUFFERS_LITTLEENDIAN\n        PushBytes(reinterpret_cast<const uint8_t *>(v), len * sizeof(T));\n      #else\n        if (sizeof(T) == 1) {\n          PushBytes(reinterpret_cast<const uint8_t *>(v), len);\n        } else {\n          for (auto i = len; i > 0; ) {\n            PushElement(v[--i]);\n          }\n        }\n      #endif\n      // clang-format on\n    }\n    return OffsetT<VectorT<T>>(EndVector<LenT, offset_type>(len));\n  }\n\n  /// @brief Serialize an array like object into a FlatBuffer `vector`.\n  /// @tparam T The data type of the array elements.\n  /// @tparam C The type of the array.\n  /// @param[in] array A reference to an array like object of type `T` to\n  /// serialize into the buffer as a `vector`.\n  /// @return Returns a typed `Offset` into the serialized data indicating\n  /// where the vector is stored.\n  template <typename T, class C>\n  Offset<Vector<T>> CreateVector(const C& array) {\n    return CreateVector(array.data(), array.size());\n  }\n\n  /// @brief Serialize an initializer list into a FlatBuffer `vector`.\n  /// @tparam T The data type of the initializer list elements.\n  /// @param[in] v The value of the initializer list.\n  /// @return Returns a typed `Offset` into the serialized data indicating\n  /// where the vector is stored.\n  template <typename T>\n  Offset<Vector<T>> CreateVector(std::initializer_list<T> v) {\n    return CreateVector(v.begin(), v.size());\n  }\n\n  template <typename T>\n  Offset<Vector<Offset<T>>> CreateVector(const Offset<T>* v, size_t len) {\n    StartVector<Offset<T>>(len);\n    for (auto i = len; i > 0;) {\n      PushElement(v[--i]);\n    }\n    return Offset<Vector<Offset<T>>>(EndVector(len));\n  }\n\n  /// @brief Serialize a `std::vector` into a FlatBuffer `vector`.\n  /// @tparam T The data type of the `std::vector` elements.\n  /// @param v A const reference to the `std::vector` to serialize into the\n  /// buffer as a `vector`.\n  /// @return Returns a typed `Offset` into the serialized data indicating\n  /// where the vector is stored.\n  template <typename T, typename Alloc = std::allocator<T>>\n  Offset<Vector<T>> CreateVector(const std::vector<T, Alloc>& v) {\n    return CreateVector(data(v), v.size());\n  }\n\n  template <template <typename...> class VectorT = Vector64,\n            int&... ExplicitArgumentBarrier, typename T>\n  Offset64<VectorT<T>> CreateVector64(const std::vector<T>& v) {\n    return CreateVector<T, Offset64, VectorT>(data(v), v.size());\n  }\n\n  // vector<bool> may be implemented using a bit-set, so we can't access it as\n  // an array. Instead, read elements manually.\n  // Background: https://isocpp.org/blog/2012/11/on-vectorbool\n  Offset<Vector<uint8_t>> CreateVector(const std::vector<bool>& v) {\n    StartVector<uint8_t>(v.size());\n    for (auto i = v.size(); i > 0;) {\n      PushElement(static_cast<uint8_t>(v[--i]));\n    }\n    return Offset<Vector<uint8_t>>(EndVector(v.size()));\n  }\n\n  Offset64<Vector64<uint8_t>> CreateVector64(const std::vector<bool>& v) {\n    StartVector<uint8_t, Offset64, Vector64<uint8_t>::size_type>(v.size());\n    for (auto i = v.size(); i > 0;) {\n      PushElement(static_cast<uint8_t>(v[--i]));\n    }\n    return Offset64<Vector64<uint8_t>>(\n        EndVector<Vector64<uint8_t>::size_type,\n                  Offset64<Vector64<uint8_t>>::offset_type>(v.size()));\n  }\n\n  /// @brief Serialize values returned by a function into a FlatBuffer `vector`.\n  /// This is a convenience function that takes care of iteration for you.\n  /// @tparam T The data type of the `std::vector` elements.\n  /// @param f A function that takes the current iteration 0..vector_size-1 and\n  /// returns any type that you can construct a FlatBuffers vector out of.\n  /// @return Returns a typed `Offset` into the serialized data indicating\n  /// where the vector is stored.\n  template <typename T>\n  Offset<Vector<T>> CreateVector(size_t vector_size,\n                                 const std::function<T(size_t i)>& f) {\n    FLATBUFFERS_ASSERT(FLATBUFFERS_GENERAL_HEAP_ALLOC_OK);\n    std::vector<T> elems(vector_size);\n    for (size_t i = 0; i < vector_size; i++) elems[i] = f(i);\n    return CreateVector(elems);\n  }\n\n  /// @brief Serialize values returned by a function into a FlatBuffer `vector`.\n  /// This is a convenience function that takes care of iteration for you. This\n  /// uses a vector stored on the heap to store the intermediate results of the\n  /// iteration.\n  /// @tparam T The data type of the `std::vector` elements.\n  /// @param f A function that takes the current iteration 0..vector_size-1,\n  /// and the state parameter returning any type that you can construct a\n  /// FlatBuffers vector out of.\n  /// @param state State passed to f.\n  /// @return Returns a typed `Offset` into the serialized data indicating\n  /// where the vector is stored.\n  template <typename T, typename F, typename S>\n  Offset<Vector<T>> CreateVector(size_t vector_size, F f, S* state) {\n    FLATBUFFERS_ASSERT(FLATBUFFERS_GENERAL_HEAP_ALLOC_OK);\n    std::vector<T> elems(vector_size);\n    for (size_t i = 0; i < vector_size; i++) elems[i] = f(i, state);\n    return CreateVector(elems);\n  }\n\n  /// @brief Serialize a `std::vector<StringType>` into a FlatBuffer `vector`.\n  /// whereas StringType is any type that is accepted by the CreateString()\n  /// overloads.\n  /// This is a convenience function for a common case.\n  /// @param v A const reference to the `std::vector` to serialize into the\n  /// buffer as a `vector`.\n  /// @return Returns a typed `Offset` into the serialized data indicating\n  /// where the vector is stored.\n  template <typename StringType = std::string,\n            typename Alloc = std::allocator<StringType>>\n  Offset<Vector<Offset<String>>> CreateVectorOfStrings(\n      const std::vector<StringType, Alloc>& v) {\n    return CreateVectorOfStrings(v.cbegin(), v.cend());\n  }\n\n  /// @brief Serialize a collection of Strings into a FlatBuffer `vector`.\n  /// This is a convenience function for a common case.\n  /// @param begin The beginning iterator of the collection\n  /// @param end The ending iterator of the collection\n  /// @return Returns a typed `Offset` into the serialized data indicating\n  /// where the vector is stored.\n  template <class It>\n  Offset<Vector<Offset<String>>> CreateVectorOfStrings(It begin, It end) {\n    auto distance = std::distance(begin, end);\n    FLATBUFFERS_ASSERT(distance >= 0);\n    auto size = static_cast<size_t>(distance);\n    auto scratch_buffer_usage = size * sizeof(Offset<String>);\n    // If there is not enough space to store the offsets, there definitely won't\n    // be enough space to store all the strings. So ensuring space for the\n    // scratch region is OK, for if it fails, it would have failed later.\n    buf_.ensure_space(scratch_buffer_usage);\n    for (auto it = begin; it != end; ++it) {\n      buf_.scratch_push_small(CreateString(*it));\n    }\n    StartVector<Offset<String>>(size);\n    for (size_t i = 1; i <= size; i++) {\n      // Note we re-evaluate the buf location each iteration to account for any\n      // underlying buffer resizing that may occur.\n      PushElement(*reinterpret_cast<Offset<String>*>(\n          buf_.scratch_end() - i * sizeof(Offset<String>)));\n    }\n    buf_.scratch_pop(scratch_buffer_usage);\n    return Offset<Vector<Offset<String>>>(EndVector(size));\n  }\n\n  /// @brief Serialize an array of structs into a FlatBuffer `vector`.\n  /// @tparam T The data type of the struct array elements.\n  /// @param[in] v A pointer to the array of type `T` to serialize into the\n  /// buffer as a `vector`.\n  /// @param[in] len The number of elements to serialize.\n  /// @return Returns a typed `Offset` into the serialized data indicating\n  /// where the vector is stored.\n  template <typename T, template <typename...> class OffsetT = Offset,\n            template <typename...> class VectorT = Vector>\n  OffsetT<VectorT<const T*>> CreateVectorOfStructs(const T* v, size_t len) {\n    // The type of the length field in the vector.\n    typedef typename VectorT<T>::size_type LenT;\n    typedef typename OffsetT<VectorT<const T*>>::offset_type offset_type;\n\n    StartVector<OffsetT, LenT>(len, sizeof(T), AlignOf<T>());\n    if (len > 0) {\n      PushBytes(reinterpret_cast<const uint8_t*>(v), sizeof(T) * len);\n    }\n    return OffsetT<VectorT<const T*>>(EndVector<LenT, offset_type>(len));\n  }\n\n  /// @brief Serialize an array of structs into a FlatBuffer `vector`.\n  /// @tparam T The data type of the struct array elements.\n  /// @param[in] filler A function that takes the current iteration\n  /// 0..vector_size-1 and a pointer to the struct that must be filled.\n  /// @return Returns a typed `Offset` into the serialized data indicating\n  /// where the vector is stored.\n  /// This is mostly useful when flatbuffers are generated with mutation\n  /// accessors.\n  template <typename T>\n  Offset<Vector<const T*>> CreateVectorOfStructs(\n      size_t vector_size, const std::function<void(size_t i, T*)>& filler) {\n    T* structs = StartVectorOfStructs<T>(vector_size);\n    for (size_t i = 0; i < vector_size; i++) {\n      filler(i, structs);\n      structs++;\n    }\n    return EndVectorOfStructs<T>(vector_size);\n  }\n\n  /// @brief Serialize an array of structs into a FlatBuffer `vector`.\n  /// @tparam T The data type of the struct array elements.\n  /// @param[in] f A function that takes the current iteration 0..vector_size-1,\n  /// a pointer to the struct that must be filled and the state argument.\n  /// @param[in] state Arbitrary state to pass to f.\n  /// @return Returns a typed `Offset` into the serialized data indicating\n  /// where the vector is stored.\n  /// This is mostly useful when flatbuffers are generated with mutation\n  /// accessors.\n  template <typename T, typename F, typename S>\n  Offset<Vector<const T*>> CreateVectorOfStructs(size_t vector_size, F f,\n                                                 S* state) {\n    T* structs = StartVectorOfStructs<T>(vector_size);\n    for (size_t i = 0; i < vector_size; i++) {\n      f(i, structs, state);\n      structs++;\n    }\n    return EndVectorOfStructs<T>(vector_size);\n  }\n\n  /// @brief Serialize a `std::vector` of structs into a FlatBuffer `vector`.\n  /// @tparam T The data type of the `std::vector` struct elements.\n  /// @param[in] v A const reference to the `std::vector` of structs to\n  /// serialize into the buffer as a `vector`.\n  /// @return Returns a typed `Offset` into the serialized data indicating\n  /// where the vector is stored.\n  template <typename T, template <typename...> class OffsetT = Offset,\n            template <typename...> class VectorT = Vector,\n            typename Alloc = std::allocator<T>>\n  OffsetT<VectorT<const T*>> CreateVectorOfStructs(\n      const std::vector<T, Alloc>& v) {\n    return CreateVectorOfStructs<T, OffsetT, VectorT>(data(v), v.size());\n  }\n\n  template <template <typename...> class VectorT = Vector64, int&...,\n            typename T>\n  Offset64<VectorT<const T*>> CreateVectorOfStructs64(const std::vector<T>& v) {\n    return CreateVectorOfStructs<T, Offset64, VectorT>(data(v), v.size());\n  }\n\n  /// @brief Serialize an array of native structs into a FlatBuffer `vector`.\n  /// @tparam T The data type of the struct array elements.\n  /// @tparam S The data type of the native struct array elements.\n  /// @param[in] v A pointer to the array of type `S` to serialize into the\n  /// buffer as a `vector`.\n  /// @param[in] len The number of elements to serialize.\n  /// @param[in] pack_func Pointer to a function to convert the native struct\n  /// to the FlatBuffer struct.\n  /// @return Returns a typed `Offset` into the serialized data indicating\n  /// where the vector is stored.\n  template <typename T, typename S>\n  Offset<Vector<const T*>> CreateVectorOfNativeStructs(\n      const S* v, size_t len, T (*const pack_func)(const S&)) {\n    FLATBUFFERS_ASSERT(pack_func);\n    auto structs = StartVectorOfStructs<T>(len);\n    for (size_t i = 0; i < len; i++) {\n      structs[i] = pack_func(v[i]);\n    }\n    return EndVectorOfStructs<T>(len);\n  }\n\n  /// @brief Serialize an array of native structs into a FlatBuffer `vector`.\n  /// @tparam T The data type of the struct array elements.\n  /// @tparam S The data type of the native struct array elements.\n  /// @param[in] v A pointer to the array of type `S` to serialize into the\n  /// buffer as a `vector`.\n  /// @param[in] len The number of elements to serialize.\n  /// @return Returns a typed `Offset` into the serialized data indicating\n  /// where the vector is stored.\n  template <typename T, typename S>\n  Offset<Vector<const T*>> CreateVectorOfNativeStructs(const S* v, size_t len) {\n    extern T Pack(const S&);\n    return CreateVectorOfNativeStructs(v, len, Pack);\n  }\n\n  /// @brief Serialize a `std::vector` of native structs into a FlatBuffer\n  /// `vector`.\n  /// @tparam T The data type of the `std::vector` struct elements.\n  /// @tparam S The data type of the `std::vector` native struct elements.\n  /// @param[in] v A const reference to the `std::vector` of structs to\n  /// serialize into the buffer as a `vector`.\n  /// @param[in] pack_func Pointer to a function to convert the native struct\n  /// to the FlatBuffer struct.\n  /// @return Returns a typed `Offset` into the serialized data indicating\n  /// where the vector is stored.\n  template <typename T, typename S, typename Alloc = std::allocator<T>>\n  Offset<Vector<const T*>> CreateVectorOfNativeStructs(\n      const std::vector<S, Alloc>& v, T (*const pack_func)(const S&)) {\n    return CreateVectorOfNativeStructs<T, S>(data(v), v.size(), pack_func);\n  }\n\n  /// @brief Serialize a `std::vector` of native structs into a FlatBuffer\n  /// `vector`.\n  /// @tparam T The data type of the `std::vector` struct elements.\n  /// @tparam S The data type of the `std::vector` native struct elements.\n  /// @param[in] v A const reference to the `std::vector` of structs to\n  /// serialize into the buffer as a `vector`.\n  /// @return Returns a typed `Offset` into the serialized data indicating\n  /// where the vector is stored.\n  template <typename T, typename S, typename Alloc = std::allocator<S>>\n  Offset<Vector<const T*>> CreateVectorOfNativeStructs(\n      const std::vector<S, Alloc>& v) {\n    return CreateVectorOfNativeStructs<T, S>(data(v), v.size());\n  }\n\n  /// @cond FLATBUFFERS_INTERNAL\n  template <typename T>\n  struct StructKeyComparator {\n    bool operator()(const T& a, const T& b) const {\n      return a.KeyCompareLessThan(&b);\n    }\n  };\n  /// @endcond\n\n  /// @brief Serialize a `std::vector` of structs into a FlatBuffer `vector`\n  /// in sorted order.\n  /// @tparam T The data type of the `std::vector` struct elements.\n  /// @param[in] v A const reference to the `std::vector` of structs to\n  /// serialize into the buffer as a `vector`.\n  /// @return Returns a typed `Offset` into the serialized data indicating\n  /// where the vector is stored.\n  template <typename T, typename Alloc = std::allocator<T>>\n  Offset<Vector<const T*>> CreateVectorOfSortedStructs(\n      std::vector<T, Alloc>* v) {\n    return CreateVectorOfSortedStructs(data(*v), v->size());\n  }\n\n  /// @brief Serialize a `std::vector` of native structs into a FlatBuffer\n  /// `vector` in sorted order.\n  /// @tparam T The data type of the `std::vector` struct elements.\n  /// @tparam S The data type of the `std::vector` native struct elements.\n  /// @param[in] v A const reference to the `std::vector` of structs to\n  /// serialize into the buffer as a `vector`.\n  /// @return Returns a typed `Offset` into the serialized data indicating\n  /// where the vector is stored.\n  template <typename T, typename S, typename Alloc = std::allocator<T>>\n  Offset<Vector<const T*>> CreateVectorOfSortedNativeStructs(\n      std::vector<S, Alloc>* v) {\n    return CreateVectorOfSortedNativeStructs<T, S>(data(*v), v->size());\n  }\n\n  /// @brief Serialize an array of structs into a FlatBuffer `vector` in sorted\n  /// order.\n  /// @tparam T The data type of the struct array elements.\n  /// @param[in] v A pointer to the array of type `T` to serialize into the\n  /// buffer as a `vector`.\n  /// @param[in] len The number of elements to serialize.\n  /// @return Returns a typed `Offset` into the serialized data indicating\n  /// where the vector is stored.\n  template <typename T>\n  Offset<Vector<const T*>> CreateVectorOfSortedStructs(T* v, size_t len) {\n    std::stable_sort(v, v + len, StructKeyComparator<T>());\n    return CreateVectorOfStructs(v, len);\n  }\n\n  /// @brief Serialize an array of native structs into a FlatBuffer `vector` in\n  /// sorted order.\n  /// @tparam T The data type of the struct array elements.\n  /// @tparam S The data type of the native struct array elements.\n  /// @param[in] v A pointer to the array of type `S` to serialize into the\n  /// buffer as a `vector`.\n  /// @param[in] len The number of elements to serialize.\n  /// @return Returns a typed `Offset` into the serialized data indicating\n  /// where the vector is stored.\n  template <typename T, typename S>\n  Offset<Vector<const T*>> CreateVectorOfSortedNativeStructs(S* v, size_t len) {\n    extern T Pack(const S&);\n    auto structs = StartVectorOfStructs<T>(len);\n    for (size_t i = 0; i < len; i++) {\n      structs[i] = Pack(v[i]);\n    }\n    std::stable_sort(structs, structs + len, StructKeyComparator<T>());\n    return EndVectorOfStructs<T>(len);\n  }\n\n  /// @cond FLATBUFFERS_INTERNAL\n  template <typename T>\n  struct TableKeyComparator {\n    explicit TableKeyComparator(vector_downward<SizeT>& buf) : buf_(buf) {}\n    TableKeyComparator(const TableKeyComparator& other) : buf_(other.buf_) {}\n    bool operator()(const Offset<T>& a, const Offset<T>& b) const {\n      auto table_a = reinterpret_cast<T*>(buf_.data_at(a.o));\n      auto table_b = reinterpret_cast<T*>(buf_.data_at(b.o));\n      return table_a->KeyCompareLessThan(table_b);\n    }\n    vector_downward<SizeT>& buf_;\n\n   private:\n    FLATBUFFERS_DELETE_FUNC(\n        TableKeyComparator& operator=(const TableKeyComparator& other));\n  };\n  /// @endcond\n\n  /// @brief Serialize an array of `table` offsets as a `vector` in the buffer\n  /// in sorted order.\n  /// @tparam T The data type that the offset refers to.\n  /// @param[in] v An array of type `Offset<T>` that contains the `table`\n  /// offsets to store in the buffer in sorted order.\n  /// @param[in] len The number of elements to store in the `vector`.\n  /// @return Returns a typed `Offset` into the serialized data indicating\n  /// where the vector is stored.\n  template <typename T>\n  Offset<Vector<Offset<T>>> CreateVectorOfSortedTables(Offset<T>* v,\n                                                       size_t len) {\n    std::stable_sort(v, v + len, TableKeyComparator<T>(buf_));\n    return CreateVector(v, len);\n  }\n\n  /// @brief Serialize an array of `table` offsets as a `vector` in the buffer\n  /// in sorted order.\n  /// @tparam T The data type that the offset refers to.\n  /// @param[in] v An array of type `Offset<T>` that contains the `table`\n  /// offsets to store in the buffer in sorted order.\n  /// @return Returns a typed `Offset` into the serialized data indicating\n  /// where the vector is stored.\n  template <typename T, typename Alloc = std::allocator<T>>\n  Offset<Vector<Offset<T>>> CreateVectorOfSortedTables(\n      std::vector<Offset<T>, Alloc>* v) {\n    return CreateVectorOfSortedTables(data(*v), v->size());\n  }\n\n  /// @brief Specialized version of `CreateVector` for non-copying use cases.\n  /// Write the data any time later to the returned buffer pointer `buf`.\n  /// @param[in] len The number of elements to store in the `vector`.\n  /// @param[in] elemsize The size of each element in the `vector`.\n  /// @param[out] buf A pointer to a `uint8_t` pointer that can be\n  /// written to at a later time to serialize the data into a `vector`\n  /// in the buffer.\n  uoffset_t CreateUninitializedVector(size_t len, size_t elemsize,\n                                      size_t alignment, uint8_t** buf) {\n    NotNested();\n    StartVector(len, elemsize, alignment);\n    buf_.make_space(len * elemsize);\n    const uoffset_t vec_start = GetSizeRelative32BitRegion();\n    auto vec_end = EndVector(len);\n    *buf = buf_.data_at(vec_start);\n    return vec_end;\n  }\n\n  FLATBUFFERS_ATTRIBUTE([[deprecated(\"call the version above instead\")]])\n  uoffset_t CreateUninitializedVector(size_t len, size_t elemsize,\n                                      uint8_t** buf) {\n    return CreateUninitializedVector(len, elemsize, elemsize, buf);\n  }\n\n  /// @brief Specialized version of `CreateVector` for non-copying use cases.\n  /// Write the data any time later to the returned buffer pointer `buf`.\n  /// @tparam T The data type of the data that will be stored in the buffer\n  /// as a `vector`.\n  /// @param[in] len The number of elements to store in the `vector`.\n  /// @param[out] buf A pointer to a pointer of type `T` that can be\n  /// written to at a later time to serialize the data into a `vector`\n  /// in the buffer.\n  template <typename T>\n  Offset<Vector<T>> CreateUninitializedVector(size_t len, T** buf) {\n    AssertScalarT<T>();\n    return CreateUninitializedVector(len, sizeof(T), AlignOf<T>(),\n                                     reinterpret_cast<uint8_t**>(buf));\n  }\n\n  template <typename T>\n  Offset<Vector<const T*>> CreateUninitializedVectorOfStructs(size_t len,\n                                                              T** buf) {\n    return CreateUninitializedVector(len, sizeof(T), AlignOf<T>(),\n                                     reinterpret_cast<uint8_t**>(buf));\n  }\n\n  // @brief Create a vector of scalar type T given as input a vector of scalar\n  // type U, useful with e.g. pre \"enum class\" enums, or any existing scalar\n  // data of the wrong type.\n  template <typename T, typename U>\n  Offset<Vector<T>> CreateVectorScalarCast(const U* v, size_t len) {\n    AssertScalarT<T>();\n    AssertScalarT<U>();\n    StartVector<T>(len);\n    for (auto i = len; i > 0;) {\n      PushElement(static_cast<T>(v[--i]));\n    }\n    return Offset<Vector<T>>(EndVector(len));\n  }\n\n  /// @brief Write a struct by itself, typically to be part of a union.\n  template <typename T>\n  Offset<const T*> CreateStruct(const T& structobj) {\n    NotNested();\n    Align(AlignOf<T>());\n    buf_.push_small(structobj);\n    return Offset<const T*>(\n        CalculateOffset<typename Offset<const T*>::offset_type>());\n  }\n\n  /// @brief Finish serializing a buffer by writing the root offset.\n  /// @param[in] file_identifier If a `file_identifier` is given, the buffer\n  /// will be prefixed with a standard FlatBuffers file header.\n  template <typename T>\n  void Finish(Offset<T> root, const char* file_identifier = nullptr) {\n    Finish(root.o, file_identifier, false);\n  }\n\n  /// @brief Finish a buffer with a 32 bit size field pre-fixed (size of the\n  /// buffer following the size field). These buffers are NOT compatible\n  /// with standard buffers created by Finish, i.e. you can't call GetRoot\n  /// on them, you have to use GetSizePrefixedRoot instead.\n  /// All >32 bit quantities in this buffer will be aligned when the whole\n  /// size pre-fixed buffer is aligned.\n  /// These kinds of buffers are useful for creating a stream of FlatBuffers.\n  template <typename T>\n  void FinishSizePrefixed(Offset<T> root,\n                          const char* file_identifier = nullptr) {\n    Finish(root.o, file_identifier, true);\n  }\n\n  void SwapBufAllocator(FlatBufferBuilderImpl& other) {\n    buf_.swap_allocator(other.buf_);\n  }\n\n  /// @brief The length of a FlatBuffer file header.\n  static const size_t kFileIdentifierLength =\n      ::flatbuffers::kFileIdentifierLength;\n\n protected:\n  // You shouldn't really be copying instances of this class.\n  FlatBufferBuilderImpl(const FlatBufferBuilderImpl&);\n  FlatBufferBuilderImpl& operator=(const FlatBufferBuilderImpl&);\n\n  void Finish(uoffset_t root, const char* file_identifier, bool size_prefix) {\n    // A buffer can only be finished once. To reuse a builder use `clear()`.\n    FLATBUFFERS_ASSERT(!finished);\n\n    NotNested();\n    buf_.clear_scratch();\n\n    const size_t prefix_size = size_prefix ? sizeof(SizeT) : 0;\n    // Make sure we track the alignment of the size prefix.\n    TrackMinAlign(prefix_size);\n\n    const size_t root_offset_size = sizeof(uoffset_t);\n    const size_t file_id_size = file_identifier ? kFileIdentifierLength : 0;\n\n    // This will cause the whole buffer to be aligned.\n    PreAlign(prefix_size + root_offset_size + file_id_size, minalign_);\n\n    if (file_identifier) {\n      FLATBUFFERS_ASSERT(strlen(file_identifier) == kFileIdentifierLength);\n      PushBytes(reinterpret_cast<const uint8_t*>(file_identifier),\n                kFileIdentifierLength);\n    }\n    PushElement(ReferTo(root));  // Location of root.\n    if (size_prefix) {\n      PushElement(GetSize());\n    }\n    finished = true;\n  }\n\n  struct FieldLoc {\n    uoffset_t off;\n    voffset_t id;\n  };\n\n  vector_downward<SizeT> buf_;\n\n  // Accumulating offsets of table members while it is being built.\n  // We store these in the scratch pad of buf_, after the vtable offsets.\n  uoffset_t num_field_loc;\n  // Track how much of the vtable is in use, so we can output the most compact\n  // possible vtable.\n  voffset_t max_voffset_;\n\n  // This is the length of the 64-bit region of the buffer. The buffer supports\n  // 64-bit offsets by forcing serialization of those elements in the \"tail\"\n  // region of the buffer (i.e. \"64-bit region\"). To properly keep track of\n  // offsets that are referenced from the tail of the buffer to not overflow\n  // their size (e.g. Offset is a uint32_t type), the boundary of the 32-/64-bit\n  // regions must be tracked.\n  //\n  // [    Complete FlatBuffer     ]\n  // [32-bit region][64-bit region]\n  //               ^              ^\n  //               |              Tail of the buffer.\n  //               |\n  //               Tail of the 32-bit region of the buffer.\n  //\n  // This keeps track of the size of the 64-bit region so that the tail of the\n  // 32-bit region can be calculated as `GetSize() - length_of_64_bit_region_`.\n  //\n  // This will remain 0 if no 64-bit offset types are added to the buffer.\n  size_t length_of_64_bit_region_;\n\n  // Ensure objects are not nested.\n  bool nested;\n\n  // Ensure the buffer is finished before it is being accessed.\n  bool finished;\n\n  size_t minalign_;\n\n  bool force_defaults_;  // Serialize values equal to their defaults anyway.\n\n  bool dedup_vtables_;\n\n  struct StringOffsetCompare {\n    explicit StringOffsetCompare(const vector_downward<SizeT>& buf)\n        : buf_(&buf) {}\n    bool operator()(const Offset<String>& a, const Offset<String>& b) const {\n      auto stra = reinterpret_cast<const String*>(buf_->data_at(a.o));\n      auto strb = reinterpret_cast<const String*>(buf_->data_at(b.o));\n      return StringLessThan(stra->data(), stra->size(), strb->data(),\n                            strb->size());\n    }\n    const vector_downward<SizeT>* buf_;\n  };\n\n  // For use with CreateSharedString. Instantiated on first use only.\n  typedef std::set<Offset<String>, StringOffsetCompare> StringOffsetMap;\n  StringOffsetMap* string_pool;\n\n private:\n  void CanAddOffset64() {\n    // If you hit this assertion, you are attempting to add a 64-bit offset to\n    // a 32-bit only builder. This is because the builder has overloads that\n    // differ only on the offset size returned: e.g.:\n    //\n    //   FlatBufferBuilder builder;\n    //   Offset64<String> string_offset = builder.CreateString<Offset64>();\n    //\n    // Either use a 64-bit aware builder, or don't try to create an Offset64\n    // return type.\n    //\n    // TODO(derekbailey): we can probably do more enable_if to avoid this\n    // looking like its possible to the user.\n    static_assert(Is64Aware, \"cannot add 64-bit offset to a 32-bit builder\");\n\n    // If you hit this assertion, you are attempting to add an 64-bit offset\n    // item after already serializing a 32-bit item. All 64-bit offsets have to\n    // added to the tail of the buffer before any 32-bit items can be added.\n    // Otherwise some items might not be addressable due to the maximum range of\n    // the 32-bit offset.\n    FLATBUFFERS_ASSERT(GetSize() == length_of_64_bit_region_);\n  }\n\n  /// @brief Store a string in the buffer, which can contain any binary data.\n  /// @param[in] str A const char pointer to the data to be stored as a string.\n  /// @param[in] len The number of bytes that should be stored from `str`.\n  /// @return Returns the offset in the buffer where the string starts.\n  void CreateStringImpl(const char* str, size_t len) {\n    NotNested();\n    PreAlign<uoffset_t>(len + 1);  // Always 0-terminated.\n    buf_.fill(1);\n    PushBytes(reinterpret_cast<const uint8_t*>(str), len);\n    PushElement(static_cast<uoffset_t>(len));\n  }\n\n  // Allocates space for a vector of structures.\n  // Must be completed with EndVectorOfStructs().\n  template <typename T, template <typename> class OffsetT = Offset>\n  T* StartVectorOfStructs(size_t vector_size) {\n    StartVector<OffsetT>(vector_size, sizeof(T), AlignOf<T>());\n    return reinterpret_cast<T*>(buf_.make_space(vector_size * sizeof(T)));\n  }\n\n  // End the vector of structures in the flatbuffers.\n  // Vector should have previously be started with StartVectorOfStructs().\n  template <typename T, template <typename> class OffsetT = Offset>\n  OffsetT<Vector<const T*>> EndVectorOfStructs(size_t vector_size) {\n    return OffsetT<Vector<const T*>>(\n        EndVector<typename Vector<const T*>::size_type,\n                  typename OffsetT<Vector<const T*>>::offset_type>(\n            vector_size));\n  }\n\n  template <typename T>\n  typename std::enable_if<std::is_same<T, uoffset_t>::value, T>::type\n  CalculateOffset() {\n    // Default to the end of the 32-bit region. This may or may not be the end\n    // of the buffer, depending on if any 64-bit offsets have been added.\n    return GetSizeRelative32BitRegion();\n  }\n\n  // Specializations to handle the 64-bit CalculateOffset, which is relative to\n  // end of the buffer.\n  template <typename T>\n  typename std::enable_if<std::is_same<T, uoffset64_t>::value, T>::type\n  CalculateOffset() {\n    // This should never be compiled in when not using a 64-bit builder.\n    static_assert(Is64Aware, \"invalid 64-bit offset in 32-bit builder\");\n\n    // Store how big the 64-bit region of the buffer is, so we can determine\n    // where the 32/64 bit boundary is.\n    length_of_64_bit_region_ = GetSize();\n\n    return length_of_64_bit_region_;\n  }\n};\n/// @}\n\n// Hack to `FlatBufferBuilder` mean `FlatBufferBuilder<false>` or\n// `FlatBufferBuilder<>`, where the template < > syntax is required.\nusing FlatBufferBuilder = FlatBufferBuilderImpl<false>;\nusing FlatBufferBuilder64 = FlatBufferBuilderImpl<true>;\n\n// These are external due to GCC not allowing them in the class.\n// See: https://stackoverflow.com/q/8061456/868247\ntemplate <>\ntemplate <>\ninline Offset64<String> FlatBufferBuilder64::CreateString(const char* str,\n                                                          size_t len) {\n  CanAddOffset64();\n  CreateStringImpl(str, len);\n  return Offset64<String>(\n      CalculateOffset<typename Offset64<String>::offset_type>());\n}\n\n// Used to distinguish from real Offsets.\ntemplate <typename T = void>\nstruct EmptyOffset {};\n\n// TODO(derekbailey): it would be nice to combine these two methods.\ntemplate <>\ntemplate <>\ninline void FlatBufferBuilder64::StartVector<Offset64, uint32_t>(\n    size_t len, size_t elemsize, size_t alignment) {\n  CanAddOffset64();\n  StartVector<EmptyOffset, uint32_t>(len, elemsize, alignment);\n}\n\ntemplate <>\ntemplate <>\ninline void FlatBufferBuilder64::StartVector<Offset64, uint64_t>(\n    size_t len, size_t elemsize, size_t alignment) {\n  CanAddOffset64();\n  StartVector<EmptyOffset, uint64_t>(len, elemsize, alignment);\n}\n\n/// Helpers to get a typed pointer to objects that are currently being built.\n/// @warning Creating new objects will lead to reallocations and invalidates\n/// the pointer!\ntemplate <typename T>\nT* GetMutableTemporaryPointer(FlatBufferBuilder& fbb, Offset<T> offset) {\n  return reinterpret_cast<T*>(fbb.GetCurrentBufferPointer() + fbb.GetSize() -\n                              offset.o);\n}\n\ntemplate <typename T>\nconst T* GetTemporaryPointer(const FlatBufferBuilder& fbb, Offset<T> offset) {\n  return reinterpret_cast<const T*>(fbb.GetCurrentBufferPointer() +\n                                    fbb.GetSize() - offset.o);\n}\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_FLATBUFFER_BUILDER_H_\n"
  },
  {
    "path": "include/flatbuffers/flatbuffers.h",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_H_\n#define FLATBUFFERS_H_\n\n#include <algorithm>\n\n// TODO: These includes are for mitigating the pains of users editing their\n// source because they relied on flatbuffers.h to include everything for them.\n#include \"flatbuffers/array.h\"\n#include \"flatbuffers/base.h\"\n#include \"flatbuffers/buffer.h\"\n#include \"flatbuffers/buffer_ref.h\"\n#include \"flatbuffers/detached_buffer.h\"\n#include \"flatbuffers/flatbuffer_builder.h\"\n#include \"flatbuffers/stl_emulation.h\"\n#include \"flatbuffers/string.h\"\n#include \"flatbuffers/struct.h\"\n#include \"flatbuffers/table.h\"\n#include \"flatbuffers/vector.h\"\n#include \"flatbuffers/vector_downward.h\"\n#include \"flatbuffers/verifier.h\"\n\nnamespace flatbuffers {\n\n/// @brief This can compute the start of a FlatBuffer from a root pointer, i.e.\n/// it is the opposite transformation of GetRoot().\n/// This may be useful if you want to pass on a root and have the recipient\n/// delete the buffer afterwards.\ninline const uint8_t* GetBufferStartFromRootPointer(const void* root) {\n  auto table = reinterpret_cast<const Table*>(root);\n  auto vtable = table->GetVTable();\n  // Either the vtable is before the root or after the root.\n  auto start = (std::min)(vtable, reinterpret_cast<const uint8_t*>(root));\n  // Align to at least sizeof(uoffset_t).\n  start = reinterpret_cast<const uint8_t*>(reinterpret_cast<uintptr_t>(start) &\n                                           ~(sizeof(uoffset_t) - 1));\n  // Additionally, there may be a file_identifier in the buffer, and the root\n  // offset. The buffer may have been aligned to any size between\n  // sizeof(uoffset_t) and FLATBUFFERS_MAX_ALIGNMENT (see \"force_align\").\n  // Sadly, the exact alignment is only known when constructing the buffer,\n  // since it depends on the presence of values with said alignment properties.\n  // So instead, we simply look at the next uoffset_t values (root,\n  // file_identifier, and alignment padding) to see which points to the root.\n  // None of the other values can \"impersonate\" the root since they will either\n  // be 0 or four ASCII characters.\n  static_assert(flatbuffers::kFileIdentifierLength == sizeof(uoffset_t),\n                \"file_identifier is assumed to be the same size as uoffset_t\");\n  for (auto possible_roots = FLATBUFFERS_MAX_ALIGNMENT / sizeof(uoffset_t) + 1;\n       possible_roots; possible_roots--) {\n    start -= sizeof(uoffset_t);\n    if (ReadScalar<uoffset_t>(start) + start ==\n        reinterpret_cast<const uint8_t*>(root))\n      return start;\n  }\n  // We didn't find the root, either the \"root\" passed isn't really a root,\n  // or the buffer is corrupt.\n  // Assert, because calling this function with bad data may cause reads\n  // outside of buffer boundaries.\n  FLATBUFFERS_ASSERT(false);\n  return nullptr;\n}\n\n/// @brief This return the prefixed size of a FlatBuffer.\ntemplate <typename SizeT = uoffset_t>\ninline SizeT GetPrefixedSize(const uint8_t* buf) {\n  return ReadScalar<SizeT>(buf);\n}\n\n// Gets the total length of the buffer given a sized prefixed FlatBuffer.\n//\n// This includes the size of the prefix as well as the buffer:\n//\n//  [size prefix][flatbuffer]\n//  |---------length--------|\ntemplate <typename SizeT = uoffset_t>\ninline SizeT GetSizePrefixedBufferLength(const uint8_t* const buf) {\n  return ReadScalar<SizeT>(buf) + sizeof(SizeT);\n}\n\n// Base class for native objects (FlatBuffer data de-serialized into native\n// C++ data structures).\n// Contains no functionality, purely documentative.\nstruct NativeTable {};\n\n/// @brief Function types to be used with resolving hashes into objects and\n/// back again. The resolver gets a pointer to a field inside an object API\n/// object that is of the type specified in the schema using the attribute\n/// `cpp_type` (it is thus important whatever you write to this address\n/// matches that type). The value of this field is initially null, so you\n/// may choose to implement a delayed binding lookup using this function\n/// if you wish. The resolver does the opposite lookup, for when the object\n/// is being serialized again.\ntypedef uint64_t hash_value_t;\ntypedef std::function<void(void** pointer_adr, hash_value_t hash)>\n    resolver_function_t;\ntypedef std::function<hash_value_t(void* pointer)> rehasher_function_t;\n\n// Helper function to test if a field is present, using any of the field\n// enums in the generated code.\n// `table` must be a generated table type. Since this is a template parameter,\n// this is not typechecked to be a subclass of Table, so beware!\n// Note: this function will return false for fields equal to the default\n// value, since they're not stored in the buffer (unless force_defaults was\n// used).\ntemplate <typename T>\nbool IsFieldPresent(const T* table, typename T::FlatBuffersVTableOffset field) {\n  // Cast, since Table is a private baseclass of any table types.\n  return reinterpret_cast<const Table*>(table)->CheckField(\n      static_cast<voffset_t>(field));\n}\n\n// Utility function for reverse lookups on the EnumNames*() functions\n// (in the generated C++ code)\n// names must be NULL terminated.\ninline int LookupEnum(const char** names, const char* name) {\n  for (const char** p = names; *p; p++)\n    if (!strcmp(*p, name)) return static_cast<int>(p - names);\n  return -1;\n}\n\n// These macros allow us to layout a struct with a guarantee that they'll end\n// up looking the same on different compilers and platforms.\n// It does this by disallowing the compiler to do any padding, and then\n// does padding itself by inserting extra padding fields that make every\n// element aligned to its own size.\n// Additionally, it manually sets the alignment of the struct as a whole,\n// which is typically its largest element, or a custom size set in the schema\n// by the force_align attribute.\n// These are used in the generated code only.\n\n// clang-format off\n#if defined(_MSC_VER)\n  #define FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(alignment) \\\n    __pragma(pack(1)) \\\n    struct __declspec(align(alignment))\n  #define FLATBUFFERS_STRUCT_END(name, size) \\\n    __pragma(pack()) \\\n    static_assert(sizeof(name) == size, \"compiler breaks packing rules\")\n#elif defined(__GNUC__) || defined(__clang__) || defined(__ICCARM__)\n  #define FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(alignment) \\\n    _Pragma(\"pack(1)\") \\\n    struct __attribute__((aligned(alignment)))\n  #define FLATBUFFERS_STRUCT_END(name, size) \\\n    _Pragma(\"pack()\") \\\n    static_assert(sizeof(name) == size, \"compiler breaks packing rules\")\n#else\n  #error Unknown compiler, please define structure alignment macros\n#endif\n// clang-format on\n\n// Minimal reflection via code generation.\n// Besides full-fat reflection (see reflection.h) and parsing/printing by\n// loading schemas (see idl.h), we can also have code generation for minimal\n// reflection data which allows pretty-printing and other uses without needing\n// a schema or a parser.\n// Generate code with --reflect-types (types only) or --reflect-names (names\n// also) to enable.\n// See minireflect.h for utilities using this functionality.\n\n// These types are organized slightly differently as the ones in idl.h.\nenum SequenceType { ST_TABLE, ST_STRUCT, ST_UNION, ST_ENUM };\n\n// Scalars have the same order as in idl.h\n// clang-format off\n#define FLATBUFFERS_GEN_ELEMENTARY_TYPES(ET) \\\n  ET(ET_UTYPE) \\\n  ET(ET_BOOL) \\\n  ET(ET_CHAR) \\\n  ET(ET_UCHAR) \\\n  ET(ET_SHORT) \\\n  ET(ET_USHORT) \\\n  ET(ET_INT) \\\n  ET(ET_UINT) \\\n  ET(ET_LONG) \\\n  ET(ET_ULONG) \\\n  ET(ET_FLOAT) \\\n  ET(ET_DOUBLE) \\\n  ET(ET_STRING) \\\n  ET(ET_SEQUENCE)  // See SequenceType.\n\nenum ElementaryType {\n  #define FLATBUFFERS_ET(E) E,\n    FLATBUFFERS_GEN_ELEMENTARY_TYPES(FLATBUFFERS_ET)\n  #undef FLATBUFFERS_ET\n};\n\ninline const char * const *ElementaryTypeNames() {\n  static const char * const names[] = {\n    #define FLATBUFFERS_ET(E) #E,\n      FLATBUFFERS_GEN_ELEMENTARY_TYPES(FLATBUFFERS_ET)\n    #undef FLATBUFFERS_ET\n  };\n  return names;\n}\n// clang-format on\n\n// Basic type info cost just 16bits per field!\n// We're explicitly defining the signedness since the signedness of integer\n// bitfields is otherwise implementation-defined and causes warnings on older\n// GCC compilers.\nstruct TypeCode {\n  // ElementaryType\n  unsigned short base_type : 4;\n  // Either vector (in table) or array (in struct)\n  unsigned short is_repeating : 1;\n  // Index into type_refs below, or -1 for none.\n  signed short sequence_ref : 11;\n};\n\nstatic_assert(sizeof(TypeCode) == 2, \"TypeCode\");\n\nstruct TypeTable;\n\n// Signature of the static method present in each type.\ntypedef const TypeTable* (*TypeFunction)();\n\nstruct TypeTable {\n  SequenceType st;\n  size_t num_elems;  // of type_codes, values, names (but not type_refs).\n  const TypeCode* type_codes;     // num_elems count\n  const TypeFunction* type_refs;  // less than num_elems entries (see TypeCode).\n  const int16_t* array_sizes;     // less than num_elems entries (see TypeCode).\n  const int64_t* values;  // Only set for non-consecutive enum/union or structs.\n  const char* const* names;  // Only set if compiled with --reflect-names.\n};\n\n// String which identifies the current version of FlatBuffers.\ninline const char* flatbuffers_version_string() {\n  return \"FlatBuffers \" FLATBUFFERS_STRING(FLATBUFFERS_VERSION_MAJOR) \".\"\n      FLATBUFFERS_STRING(FLATBUFFERS_VERSION_MINOR) \".\"\n      FLATBUFFERS_STRING(FLATBUFFERS_VERSION_REVISION);\n}\n\n// clang-format off\n#define FLATBUFFERS_DEFINE_BITMASK_OPERATORS(E, T)\\\n    inline FLATBUFFERS_CONSTEXPR_CPP11 E operator | (E lhs, E rhs){\\\n        return E(T(lhs) | T(rhs));\\\n    }\\\n    inline FLATBUFFERS_CONSTEXPR_CPP11 E operator & (E lhs, E rhs){\\\n        return E(T(lhs) & T(rhs));\\\n    }\\\n    inline FLATBUFFERS_CONSTEXPR_CPP11 E operator ^ (E lhs, E rhs){\\\n        return E(T(lhs) ^ T(rhs));\\\n    }\\\n    inline FLATBUFFERS_CONSTEXPR_CPP11 E operator ~ (E lhs){\\\n        return E(~T(lhs));\\\n    }\\\n    inline FLATBUFFERS_CONSTEXPR_CPP14 E operator |= (E &lhs, E rhs){\\\n        lhs = lhs | rhs;\\\n        return lhs;\\\n    }\\\n    inline FLATBUFFERS_CONSTEXPR_CPP14 E operator &= (E &lhs, E rhs){\\\n        lhs = lhs & rhs;\\\n        return lhs;\\\n    }\\\n    inline FLATBUFFERS_CONSTEXPR_CPP14 E operator ^= (E &lhs, E rhs){\\\n        lhs = lhs ^ rhs;\\\n        return lhs;\\\n    }\\\n    inline FLATBUFFERS_CONSTEXPR_CPP11 bool operator !(E rhs) \\\n    {\\\n        return !bool(T(rhs)); \\\n    }\n/// @endcond\n}  // namespace flatbuffers\n\n// clang-format on\n\n#endif  // FLATBUFFERS_H_\n"
  },
  {
    "path": "include/flatbuffers/flatc.h",
    "content": "/*\n * Copyright 2017 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_FLATC_H_\n#define FLATBUFFERS_FLATC_H_\n\n#include <functional>\n#include <limits>\n#include <list>\n#include <memory>\n#include <string>\n\n#include \"flatbuffers/code_generator.h\"\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/idl.h\"\n#include \"flatbuffers/util.h\"\n\nnamespace flatbuffers {\n\nextern void LogCompilerWarn(const std::string& warn);\nextern void LogCompilerError(const std::string& err);\n\nstruct FlatCOptions {\n  IDLOptions opts;\n\n  std::string program_name;\n\n  std::string output_path;\n\n  std::vector<std::string> filenames;\n\n  std::list<std::string> include_directories_storage;\n  std::vector<const char*> include_directories;\n  std::vector<const char*> conform_include_directories;\n  std::vector<bool> generator_enabled;\n  size_t binary_files_from = std::numeric_limits<size_t>::max();\n  std::string conform_to_schema;\n  std::string annotate_schema;\n  bool annotate_include_vector_contents = true;\n  bool any_generator = false;\n  bool print_make_rules = false;\n  bool raw_binary = false;\n  bool schema_binary = false;\n  bool grpc_enabled = false;\n  bool requires_bfbs = false;\n  bool file_names_only = false;\n\n  std::vector<std::shared_ptr<CodeGenerator>> generators;\n};\n\nstruct FlatCOption {\n  std::string short_opt;\n  std::string long_opt;\n  std::string parameter;\n  std::string description;\n};\n\nclass FlatCompiler {\n public:\n  typedef void (*WarnFn)(const FlatCompiler* flatc, const std::string& warn,\n                         bool show_exe_name);\n\n  typedef void (*ErrorFn)(const FlatCompiler* flatc, const std::string& err,\n                          bool usage, bool show_exe_name);\n\n  // Parameters required to initialize the FlatCompiler.\n  struct InitParams {\n    InitParams() : warn_fn(nullptr), error_fn(nullptr) {}\n\n    WarnFn warn_fn;\n    ErrorFn error_fn;\n  };\n\n  explicit FlatCompiler(const InitParams& params) : params_(params) {}\n\n  bool RegisterCodeGenerator(const FlatCOption& option,\n                             std::shared_ptr<CodeGenerator> code_generator);\n\n  int Compile(const FlatCOptions& options);\n\n  std::string GetShortUsageString(const std::string& program_name) const;\n  std::string GetUsageString(const std::string& program_name) const;\n\n  // Parse the FlatC options from command line arguments.\n  FlatCOptions ParseFromCommandLineArguments(int argc, const char** argv);\n\n private:\n  void ParseFile(flatbuffers::Parser& parser, const std::string& filename,\n                 const std::string& contents,\n                 const std::vector<const char*>& include_directories) const;\n\n  void LoadBinarySchema(Parser& parser, const std::string& filename,\n                        const std::string& contents);\n\n  void Warn(const std::string& warn, bool show_exe_name = true) const;\n\n  void Error(const std::string& err, bool usage = true,\n             bool show_exe_name = true) const;\n\n  void AnnotateBinaries(const uint8_t* binary_schema,\n                        uint64_t binary_schema_size,\n                        const FlatCOptions& options);\n\n  void ValidateOptions(const FlatCOptions& options);\n\n  Parser GetConformParser(const FlatCOptions& options);\n\n  std::unique_ptr<Parser> GenerateCode(const FlatCOptions& options,\n                                       Parser& conform_parser);\n\n  std::map<std::string, std::shared_ptr<CodeGenerator>> code_generators_;\n\n  InitParams params_;\n};\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_FLATC_H_\n"
  },
  {
    "path": "include/flatbuffers/flex_flat_util.h",
    "content": "/*\n * Copyright 2022 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_FLEX_FLAT_UTIL_H_\n#define FLATBUFFERS_FLEX_FLAT_UTIL_H_\n\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/flexbuffers.h\"\n\nnamespace flexbuffers {\n\n// Verifies the `nested` flexbuffer within a flatbuffer vector is valid.\ntemplate <bool B>\ninline bool VerifyNestedFlexBuffer(\n    const flatbuffers::Vector<uint8_t>* const nested,\n    flatbuffers::VerifierTemplate<B>& verifier) {\n  if (!nested) return true;\n  return verifier.Check(flexbuffers::VerifyBuffer(\n      nested->data(), nested->size(), verifier.GetFlexReuseTracker()));\n}\n\n}  // namespace flexbuffers\n\n#endif  // FLATBUFFERS_FLEX_FLAT_UTIL_H_\n"
  },
  {
    "path": "include/flatbuffers/flexbuffers.h",
    "content": "/*\n * Copyright 2017 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_FLEXBUFFERS_H_\n#define FLATBUFFERS_FLEXBUFFERS_H_\n\n#include <algorithm>\n#include <map>\n// Used to select STL variant.\n#include \"flatbuffers/base.h\"\n// We use the basic binary writing functions from the regular FlatBuffers.\n#include \"flatbuffers/util.h\"\n\n#ifdef _MSC_VER\n#include <intrin.h>\n#endif\n\n#if defined(_MSC_VER)\n#pragma warning(push)\n#pragma warning(disable : 4127)  // C4127: conditional expression is constant\n#endif\n\nnamespace flexbuffers {\n\nclass Reference;\nclass Map;\n\n// These are used in the lower 2 bits of a type field to determine the size of\n// the elements (and or size field) of the item pointed to (e.g. vector).\nenum BitWidth {\n  BIT_WIDTH_8 = 0,\n  BIT_WIDTH_16 = 1,\n  BIT_WIDTH_32 = 2,\n  BIT_WIDTH_64 = 3,\n};\n\n// These are used as the upper 6 bits of a type field to indicate the actual\n// type.\nenum Type {\n  FBT_NULL = 0,\n  FBT_INT = 1,\n  FBT_UINT = 2,\n  FBT_FLOAT = 3,\n  // Types above stored inline, types below (except FBT_BOOL) store an offset.\n  FBT_KEY = 4,\n  FBT_STRING = 5,\n  FBT_INDIRECT_INT = 6,\n  FBT_INDIRECT_UINT = 7,\n  FBT_INDIRECT_FLOAT = 8,\n  FBT_MAP = 9,\n  FBT_VECTOR = 10,      // Untyped.\n  FBT_VECTOR_INT = 11,  // Typed any size (stores no type table).\n  FBT_VECTOR_UINT = 12,\n  FBT_VECTOR_FLOAT = 13,\n  FBT_VECTOR_KEY = 14,\n  // DEPRECATED, use FBT_VECTOR or FBT_VECTOR_KEY instead.\n  // Read test.cpp/FlexBuffersDeprecatedTest() for details on why.\n  FBT_VECTOR_STRING_DEPRECATED = 15,\n  FBT_VECTOR_INT2 = 16,  // Typed tuple (no type table, no size field).\n  FBT_VECTOR_UINT2 = 17,\n  FBT_VECTOR_FLOAT2 = 18,\n  FBT_VECTOR_INT3 = 19,  // Typed triple (no type table, no size field).\n  FBT_VECTOR_UINT3 = 20,\n  FBT_VECTOR_FLOAT3 = 21,\n  FBT_VECTOR_INT4 = 22,  // Typed quad (no type table, no size field).\n  FBT_VECTOR_UINT4 = 23,\n  FBT_VECTOR_FLOAT4 = 24,\n  FBT_BLOB = 25,\n  FBT_BOOL = 26,\n  FBT_VECTOR_BOOL =\n      36,  // To Allow the same type of conversion of type to vector type\n\n  FBT_MAX_TYPE = 37\n};\n\ninline bool IsInline(Type t) { return t <= FBT_FLOAT || t == FBT_BOOL; }\n\ninline bool IsTypedVectorElementType(Type t) {\n  return (t >= FBT_INT && t <= FBT_STRING) || t == FBT_BOOL;\n}\n\ninline bool IsTypedVector(Type t) {\n  return (t >= FBT_VECTOR_INT && t <= FBT_VECTOR_STRING_DEPRECATED) ||\n         t == FBT_VECTOR_BOOL;\n}\n\ninline bool IsFixedTypedVector(Type t) {\n  return t >= FBT_VECTOR_INT2 && t <= FBT_VECTOR_FLOAT4;\n}\n\ninline Type ToTypedVector(Type t, size_t fixed_len = 0) {\n  FLATBUFFERS_ASSERT(IsTypedVectorElementType(t));\n  switch (fixed_len) {\n    case 0:\n      return static_cast<Type>(t - FBT_INT + FBT_VECTOR_INT);\n    case 2:\n      return static_cast<Type>(t - FBT_INT + FBT_VECTOR_INT2);\n    case 3:\n      return static_cast<Type>(t - FBT_INT + FBT_VECTOR_INT3);\n    case 4:\n      return static_cast<Type>(t - FBT_INT + FBT_VECTOR_INT4);\n    default:\n      FLATBUFFERS_ASSERT(0);\n      return FBT_NULL;\n  }\n}\n\ninline Type ToTypedVectorElementType(Type t) {\n  FLATBUFFERS_ASSERT(IsTypedVector(t));\n  return static_cast<Type>(t - FBT_VECTOR_INT + FBT_INT);\n}\n\ninline Type ToFixedTypedVectorElementType(Type t, uint8_t* len) {\n  FLATBUFFERS_ASSERT(IsFixedTypedVector(t));\n  auto fixed_type = t - FBT_VECTOR_INT2;\n  *len = static_cast<uint8_t>(fixed_type / 3 +\n                              2);  // 3 types each, starting from length 2.\n  return static_cast<Type>(fixed_type % 3 + FBT_INT);\n}\n\n// TODO: implement proper support for 8/16bit floats, or decide not to\n// support them.\ntypedef int16_t half;\ntypedef int8_t quarter;\n\n// TODO: can we do this without conditionals using intrinsics or inline asm\n// on some platforms? Given branch prediction the method below should be\n// decently quick, but it is the most frequently executed function.\n// We could do an (unaligned) 64-bit read if we ifdef out the platforms for\n// which that doesn't work (or where we'd read into un-owned memory).\ntemplate <typename R, typename T1, typename T2, typename T4, typename T8>\nR ReadSizedScalar(const uint8_t* data, uint8_t byte_width) {\n  return byte_width < 4\n             ? (byte_width < 2\n                    ? static_cast<R>(flatbuffers::ReadScalar<T1>(data))\n                    : static_cast<R>(flatbuffers::ReadScalar<T2>(data)))\n             : (byte_width < 8\n                    ? static_cast<R>(flatbuffers::ReadScalar<T4>(data))\n                    : static_cast<R>(flatbuffers::ReadScalar<T8>(data)));\n}\n\ninline int64_t ReadInt64(const uint8_t* data, uint8_t byte_width) {\n  return ReadSizedScalar<int64_t, int8_t, int16_t, int32_t, int64_t>(\n      data, byte_width);\n}\n\ninline uint64_t ReadUInt64(const uint8_t* data, uint8_t byte_width) {\n  // This is the \"hottest\" function (all offset lookups use this), so worth\n  // optimizing if possible.\n  // TODO: GCC apparently replaces memcpy by a rep movsb, but only if count is a\n  // constant, which here it isn't. Test if memcpy is still faster than\n  // the conditionals in ReadSizedScalar. Can also use inline asm.\n\n  // clang-format off\n  #if defined(_MSC_VER) && defined(_M_X64) && !defined(_M_ARM64EC)\n  // This is 64-bit Windows only, __movsb does not work on 32-bit Windows.\n    uint64_t u = 0;\n    __movsb(reinterpret_cast<uint8_t *>(&u),\n            reinterpret_cast<const uint8_t *>(data), byte_width);\n    return flatbuffers::EndianScalar(u);\n  #else\n    return ReadSizedScalar<uint64_t, uint8_t, uint16_t, uint32_t, uint64_t>(\n             data, byte_width);\n  #endif\n  // clang-format on\n}\n\ninline double ReadDouble(const uint8_t* data, uint8_t byte_width) {\n  return ReadSizedScalar<double, quarter, half, float, double>(data,\n                                                               byte_width);\n}\n\ninline const uint8_t* Indirect(const uint8_t* offset, uint8_t byte_width) {\n  return offset - ReadUInt64(offset, byte_width);\n}\n\ntemplate <typename T>\nconst uint8_t* Indirect(const uint8_t* offset) {\n  return offset - flatbuffers::ReadScalar<T>(offset);\n}\n\ninline BitWidth WidthU(uint64_t u) {\n#define FLATBUFFERS_GET_FIELD_BIT_WIDTH(value, width)                   \\\n  {                                                                     \\\n    if (!((u) & ~((1ULL << (width)) - 1ULL))) return BIT_WIDTH_##width; \\\n  }\n  FLATBUFFERS_GET_FIELD_BIT_WIDTH(u, 8);\n  FLATBUFFERS_GET_FIELD_BIT_WIDTH(u, 16);\n  FLATBUFFERS_GET_FIELD_BIT_WIDTH(u, 32);\n#undef FLATBUFFERS_GET_FIELD_BIT_WIDTH\n  return BIT_WIDTH_64;\n}\n\ninline BitWidth WidthI(int64_t i) {\n  auto u = static_cast<uint64_t>(i) << 1;\n  return WidthU(i >= 0 ? u : ~u);\n}\n\ninline BitWidth WidthF(double f) {\n  return static_cast<double>(static_cast<float>(f)) == f ? BIT_WIDTH_32\n                                                         : BIT_WIDTH_64;\n}\n\n// Base class of all types below.\n// Points into the data buffer and allows access to one type.\nclass Object {\n public:\n  Object(const uint8_t* data, uint8_t byte_width)\n      : data_(data), byte_width_(byte_width) {}\n\n protected:\n  const uint8_t* data_;\n  uint8_t byte_width_;\n};\n\n// Object that has a size, obtained either from size prefix, or elsewhere.\nclass Sized : public Object {\n public:\n  // Size prefix.\n  Sized(const uint8_t* data, uint8_t byte_width)\n      : Object(data, byte_width), size_(read_size()) {}\n  // Manual size.\n  Sized(const uint8_t* data, uint8_t byte_width, size_t sz)\n      : Object(data, byte_width), size_(sz) {}\n  size_t size() const { return size_; }\n  // Access size stored in `byte_width_` bytes before data_ pointer.\n  size_t read_size() const {\n    return static_cast<size_t>(ReadUInt64(data_ - byte_width_, byte_width_));\n  }\n\n protected:\n  size_t size_;\n};\n\nclass String : public Sized {\n public:\n  // Size prefix.\n  String(const uint8_t* data, uint8_t byte_width) : Sized(data, byte_width) {}\n  // Manual size.\n  String(const uint8_t* data, uint8_t byte_width, size_t sz)\n      : Sized(data, byte_width, sz) {}\n\n  size_t length() const { return size(); }\n  const char* c_str() const { return reinterpret_cast<const char*>(data_); }\n  std::string str() const { return std::string(c_str(), size()); }\n\n  static String EmptyString() {\n    static const char* empty_string = \"\";\n    return String(reinterpret_cast<const uint8_t*>(empty_string), 1, 0);\n  }\n  bool IsTheEmptyString() const { return data_ == EmptyString().data_; }\n};\n\nclass Blob : public Sized {\n public:\n  Blob(const uint8_t* data_buf, uint8_t byte_width)\n      : Sized(data_buf, byte_width) {}\n\n  static Blob EmptyBlob() {\n    static const uint8_t empty_blob[] = {0 /*len*/};\n    return Blob(empty_blob + 1, 1);\n  }\n  bool IsTheEmptyBlob() const { return data_ == EmptyBlob().data_; }\n  const uint8_t* data() const { return data_; }\n};\n\nclass Vector : public Sized {\n public:\n  Vector(const uint8_t* data, uint8_t byte_width) : Sized(data, byte_width) {}\n\n  Reference operator[](size_t i) const;\n\n  static Vector EmptyVector() {\n    static const uint8_t empty_vector[] = {0 /*len*/};\n    return Vector(empty_vector + 1, 1);\n  }\n  bool IsTheEmptyVector() const { return data_ == EmptyVector().data_; }\n};\n\nclass TypedVector : public Sized {\n public:\n  TypedVector(const uint8_t* data, uint8_t byte_width, Type element_type)\n      : Sized(data, byte_width), type_(element_type) {}\n\n  Reference operator[](size_t i) const;\n\n  static TypedVector EmptyTypedVector() {\n    static const uint8_t empty_typed_vector[] = {0 /*len*/};\n    return TypedVector(empty_typed_vector + 1, 1, FBT_INT);\n  }\n  bool IsTheEmptyVector() const {\n    return data_ == TypedVector::EmptyTypedVector().data_;\n  }\n\n  Type ElementType() { return type_; }\n\n  friend Reference;\n\n private:\n  Type type_;\n\n  friend Map;\n};\n\nclass FixedTypedVector : public Object {\n public:\n  FixedTypedVector(const uint8_t* data, uint8_t byte_width, Type element_type,\n                   uint8_t len)\n      : Object(data, byte_width), type_(element_type), len_(len) {}\n\n  Reference operator[](size_t i) const;\n\n  static FixedTypedVector EmptyFixedTypedVector() {\n    static const uint8_t fixed_empty_vector[] = {0 /* unused */};\n    return FixedTypedVector(fixed_empty_vector, 1, FBT_INT, 0);\n  }\n  bool IsTheEmptyFixedTypedVector() const {\n    return data_ == FixedTypedVector::EmptyFixedTypedVector().data_;\n  }\n\n  Type ElementType() const { return type_; }\n  uint8_t size() const { return len_; }\n\n private:\n  Type type_;\n  uint8_t len_;\n};\n\nclass Map : public Vector {\n public:\n  Map(const uint8_t* data, uint8_t byte_width) : Vector(data, byte_width) {}\n\n  Reference operator[](const char* key) const;\n  Reference operator[](const std::string& key) const;\n\n  Vector Values() const { return Vector(data_, byte_width_); }\n\n  TypedVector Keys() const {\n    const size_t num_prefixed_fields = 3;\n    auto keys_offset = data_ - byte_width_ * num_prefixed_fields;\n    return TypedVector(Indirect(keys_offset, byte_width_),\n                       static_cast<uint8_t>(\n                           ReadUInt64(keys_offset + byte_width_, byte_width_)),\n                       FBT_KEY);\n  }\n\n  static Map EmptyMap() {\n    static const uint8_t empty_map[] = {\n        0 /*keys_len*/, 0 /*keys_offset*/, 1 /*keys_width*/, 0 /*len*/\n    };\n    return Map(empty_map + 4, 1);\n  }\n\n  bool IsTheEmptyMap() const { return data_ == EmptyMap().data_; }\n};\n\ninline void IndentString(std::string& s, int indent,\n                         const char* indent_string) {\n  for (int i = 0; i < indent; i++) s += indent_string;\n}\n\ntemplate <typename T>\nvoid AppendToString(std::string& s, T&& v, bool keys_quoted, bool indented,\n                    int cur_indent, const char* indent_string,\n                    bool natural_utf8) {\n  s += \"[\";\n  s += indented ? \"\\n\" : \" \";\n  for (size_t i = 0; i < v.size(); i++) {\n    if (i) {\n      s += \",\";\n      s += indented ? \"\\n\" : \" \";\n    }\n    if (indented) IndentString(s, cur_indent, indent_string);\n    v[i].ToString(true, keys_quoted, s, indented, cur_indent, indent_string,\n                  natural_utf8);\n  }\n  if (indented) {\n    s += \"\\n\";\n    IndentString(s, cur_indent - 1, indent_string);\n  } else {\n    s += \" \";\n  }\n  s += \"]\";\n}\n\ntemplate <typename T>\nvoid AppendToString(std::string& s, T&& v, bool keys_quoted) {\n  AppendToString(s, v, keys_quoted);\n}\n\nclass Reference {\n public:\n  Reference()\n      : data_(nullptr), parent_width_(0), byte_width_(0), type_(FBT_NULL) {}\n\n  Reference(const uint8_t* data, uint8_t parent_width, uint8_t byte_width,\n            Type type)\n      : data_(data),\n        parent_width_(parent_width),\n        byte_width_(byte_width),\n        type_(type) {}\n\n  Reference(const uint8_t* data, uint8_t parent_width, uint8_t packed_type)\n      : data_(data),\n        parent_width_(parent_width),\n        byte_width_(static_cast<uint8_t>(1 << (packed_type & 3))),\n        type_(static_cast<Type>(packed_type >> 2)) {}\n\n  Type GetType() const { return type_; }\n\n  bool IsNull() const { return type_ == FBT_NULL; }\n  bool IsBool() const { return type_ == FBT_BOOL; }\n  bool IsInt() const { return type_ == FBT_INT || type_ == FBT_INDIRECT_INT; }\n  bool IsUInt() const {\n    return type_ == FBT_UINT || type_ == FBT_INDIRECT_UINT;\n  }\n  bool IsIntOrUint() const { return IsInt() || IsUInt(); }\n  bool IsFloat() const {\n    return type_ == FBT_FLOAT || type_ == FBT_INDIRECT_FLOAT;\n  }\n  bool IsNumeric() const { return IsIntOrUint() || IsFloat(); }\n  bool IsString() const { return type_ == FBT_STRING; }\n  bool IsKey() const { return type_ == FBT_KEY; }\n  bool IsVector() const { return type_ == FBT_VECTOR || type_ == FBT_MAP; }\n  bool IsUntypedVector() const { return type_ == FBT_VECTOR; }\n  bool IsTypedVector() const { return flexbuffers::IsTypedVector(type_); }\n  bool IsFixedTypedVector() const {\n    return flexbuffers::IsFixedTypedVector(type_);\n  }\n  bool IsAnyVector() const {\n    return (IsTypedVector() || IsFixedTypedVector() || IsVector());\n  }\n  bool IsMap() const { return type_ == FBT_MAP; }\n  bool IsBlob() const { return type_ == FBT_BLOB; }\n  bool AsBool() const {\n    return (type_ == FBT_BOOL ? ReadUInt64(data_, parent_width_)\n                              : AsUInt64()) != 0;\n  }\n\n  // Reads any type as a int64_t. Never fails, does most sensible conversion.\n  // Truncates floats, strings are attempted to be parsed for a number,\n  // vectors/maps return their size. Returns 0 if all else fails.\n  int64_t AsInt64() const {\n    if (type_ == FBT_INT) {\n      // A fast path for the common case.\n      return ReadInt64(data_, parent_width_);\n    } else\n      switch (type_) {\n        case FBT_INDIRECT_INT:\n          return ReadInt64(Indirect(), byte_width_);\n        case FBT_UINT:\n          return ReadUInt64(data_, parent_width_);\n        case FBT_INDIRECT_UINT:\n          return ReadUInt64(Indirect(), byte_width_);\n        case FBT_FLOAT:\n          return static_cast<int64_t>(ReadDouble(data_, parent_width_));\n        case FBT_INDIRECT_FLOAT:\n          return static_cast<int64_t>(ReadDouble(Indirect(), byte_width_));\n        case FBT_NULL:\n          return 0;\n        case FBT_STRING:\n          return flatbuffers::StringToInt(AsString().c_str());\n        case FBT_VECTOR:\n          return static_cast<int64_t>(AsVector().size());\n        case FBT_BOOL:\n          return ReadInt64(data_, parent_width_);\n        default:\n          // Convert other things to int.\n          return 0;\n      }\n  }\n\n  // TODO: could specialize these to not use AsInt64() if that saves\n  // extension ops in generated code, and use a faster op than ReadInt64.\n  int32_t AsInt32() const { return static_cast<int32_t>(AsInt64()); }\n  int16_t AsInt16() const { return static_cast<int16_t>(AsInt64()); }\n  int8_t AsInt8() const { return static_cast<int8_t>(AsInt64()); }\n\n  uint64_t AsUInt64() const {\n    if (type_ == FBT_UINT) {\n      // A fast path for the common case.\n      return ReadUInt64(data_, parent_width_);\n    } else\n      switch (type_) {\n        case FBT_INDIRECT_UINT:\n          return ReadUInt64(Indirect(), byte_width_);\n        case FBT_INT:\n          return ReadInt64(data_, parent_width_);\n        case FBT_INDIRECT_INT:\n          return ReadInt64(Indirect(), byte_width_);\n        case FBT_FLOAT:\n          return static_cast<uint64_t>(ReadDouble(data_, parent_width_));\n        case FBT_INDIRECT_FLOAT:\n          return static_cast<uint64_t>(ReadDouble(Indirect(), byte_width_));\n        case FBT_NULL:\n          return 0;\n        case FBT_STRING:\n          return flatbuffers::StringToUInt(AsString().c_str());\n        case FBT_VECTOR:\n          return static_cast<uint64_t>(AsVector().size());\n        case FBT_BOOL:\n          return ReadUInt64(data_, parent_width_);\n        default:\n          // Convert other things to uint.\n          return 0;\n      }\n  }\n\n  uint32_t AsUInt32() const { return static_cast<uint32_t>(AsUInt64()); }\n  uint16_t AsUInt16() const { return static_cast<uint16_t>(AsUInt64()); }\n  uint8_t AsUInt8() const { return static_cast<uint8_t>(AsUInt64()); }\n\n  double AsDouble() const {\n    if (type_ == FBT_FLOAT) {\n      // A fast path for the common case.\n      return ReadDouble(data_, parent_width_);\n    } else\n      switch (type_) {\n        case FBT_INDIRECT_FLOAT:\n          return ReadDouble(Indirect(), byte_width_);\n        case FBT_INT:\n          return static_cast<double>(ReadInt64(data_, parent_width_));\n        case FBT_UINT:\n          return static_cast<double>(ReadUInt64(data_, parent_width_));\n        case FBT_INDIRECT_INT:\n          return static_cast<double>(ReadInt64(Indirect(), byte_width_));\n        case FBT_INDIRECT_UINT:\n          return static_cast<double>(ReadUInt64(Indirect(), byte_width_));\n        case FBT_NULL:\n          return 0.0;\n        case FBT_STRING: {\n          double d;\n          flatbuffers::StringToNumber(AsString().c_str(), &d);\n          return d;\n        }\n        case FBT_VECTOR:\n          return static_cast<double>(AsVector().size());\n        case FBT_BOOL:\n          return static_cast<double>(ReadUInt64(data_, parent_width_));\n        default:\n          // Convert strings and other things to float.\n          return 0;\n      }\n  }\n\n  float AsFloat() const { return static_cast<float>(AsDouble()); }\n\n  const char* AsKey() const {\n    if (type_ == FBT_KEY || type_ == FBT_STRING) {\n      return reinterpret_cast<const char*>(Indirect());\n    } else {\n      return \"\";\n    }\n  }\n\n  // This function returns the empty string if you try to read something that\n  // is not a string or key.\n  String AsString() const {\n    if (type_ == FBT_STRING) {\n      return String(Indirect(), byte_width_);\n    } else if (type_ == FBT_KEY) {\n      auto key = Indirect();\n      return String(key, byte_width_,\n                    strlen(reinterpret_cast<const char*>(key)));\n    } else {\n      return String::EmptyString();\n    }\n  }\n\n  // Unlike AsString(), this will convert any type to a std::string.\n  std::string ToString() const {\n    std::string s;\n    ToString(false, false, s);\n    return s;\n  }\n\n  // Convert any type to a JSON-like string. strings_quoted determines if\n  // string values at the top level receive \"\" quotes (inside other values\n  // they always do). keys_quoted determines if keys are quoted, at any level.\n  void ToString(bool strings_quoted, bool keys_quoted, std::string& s) const {\n    ToString(strings_quoted, keys_quoted, s, false, 0, \"\", false);\n  }\n\n  // This version additionally allow you to specify if you want indentation.\n  void ToString(bool strings_quoted, bool keys_quoted, std::string& s,\n                bool indented, int cur_indent, const char* indent_string,\n                bool natural_utf8 = false) const {\n    if (type_ == FBT_STRING) {\n      String str(Indirect(), byte_width_);\n      if (strings_quoted) {\n        flatbuffers::EscapeString(str.c_str(), str.length(), &s, true,\n                                  natural_utf8);\n      } else {\n        s.append(str.c_str(), str.length());\n      }\n    } else if (IsKey()) {\n      auto str = AsKey();\n      if (keys_quoted) {\n        flatbuffers::EscapeString(str, strlen(str), &s, true, natural_utf8);\n      } else {\n        s += str;\n      }\n    } else if (IsInt()) {\n      s += flatbuffers::NumToString(AsInt64());\n    } else if (IsUInt()) {\n      s += flatbuffers::NumToString(AsUInt64());\n    } else if (IsFloat()) {\n      s += flatbuffers::NumToString(AsDouble());\n    } else if (IsNull()) {\n      s += \"null\";\n    } else if (IsBool()) {\n      s += AsBool() ? \"true\" : \"false\";\n    } else if (IsMap()) {\n      s += \"{\";\n      s += indented ? \"\\n\" : \" \";\n      auto m = AsMap();\n      auto keys = m.Keys();\n      auto vals = m.Values();\n      for (size_t i = 0; i < keys.size(); i++) {\n        bool kq = keys_quoted;\n        if (!kq) {\n          // FlexBuffers keys may contain arbitrary characters, only allow\n          // unquoted if it looks like an \"identifier\":\n          const char* p = keys[i].AsKey();\n          if (!flatbuffers::is_alpha(*p) && *p != '_') {\n            kq = true;\n          } else {\n            while (*++p) {\n              if (!flatbuffers::is_alnum(*p) && *p != '_') {\n                kq = true;\n                break;\n              }\n            }\n          }\n        }\n        if (indented) IndentString(s, cur_indent + 1, indent_string);\n        keys[i].ToString(true, kq, s);\n        s += \": \";\n        vals[i].ToString(true, keys_quoted, s, indented, cur_indent + 1,\n                         indent_string, natural_utf8);\n        if (i < keys.size() - 1) {\n          s += \",\";\n          if (!indented) s += \" \";\n        }\n        if (indented) s += \"\\n\";\n      }\n      if (!indented) s += \" \";\n      if (indented) IndentString(s, cur_indent, indent_string);\n      s += \"}\";\n    } else if (IsVector()) {\n      AppendToString<Vector>(s, AsVector(), keys_quoted, indented,\n                             cur_indent + 1, indent_string, natural_utf8);\n    } else if (IsTypedVector()) {\n      AppendToString<TypedVector>(s, AsTypedVector(), keys_quoted, indented,\n                                  cur_indent + 1, indent_string, natural_utf8);\n    } else if (IsFixedTypedVector()) {\n      AppendToString<FixedTypedVector>(s, AsFixedTypedVector(), keys_quoted,\n                                       indented, cur_indent + 1, indent_string,\n                                       natural_utf8);\n    } else if (IsBlob()) {\n      auto blob = AsBlob();\n      flatbuffers::EscapeString(reinterpret_cast<const char*>(blob.data()),\n                                blob.size(), &s, true, false);\n    } else {\n      s += \"(?)\";\n    }\n  }\n\n  // This function returns the empty blob if you try to read a not-blob.\n  // Strings can be viewed as blobs too.\n  Blob AsBlob() const {\n    if (type_ == FBT_BLOB || type_ == FBT_STRING) {\n      return Blob(Indirect(), byte_width_);\n    } else {\n      return Blob::EmptyBlob();\n    }\n  }\n\n  // This function returns the empty vector if you try to read a not-vector.\n  // Maps can be viewed as vectors too.\n  Vector AsVector() const {\n    if (type_ == FBT_VECTOR || type_ == FBT_MAP) {\n      return Vector(Indirect(), byte_width_);\n    } else {\n      return Vector::EmptyVector();\n    }\n  }\n\n  TypedVector AsTypedVector() const {\n    if (IsTypedVector()) {\n      auto tv =\n          TypedVector(Indirect(), byte_width_, ToTypedVectorElementType(type_));\n      if (tv.type_ == FBT_STRING) {\n        // These can't be accessed as strings, since we don't know the bit-width\n        // of the size field, see the declaration of\n        // FBT_VECTOR_STRING_DEPRECATED above for details.\n        // We change the type here to be keys, which are a subtype of strings,\n        // and will ignore the size field. This will truncate strings with\n        // embedded nulls.\n        tv.type_ = FBT_KEY;\n      }\n      return tv;\n    } else {\n      return TypedVector::EmptyTypedVector();\n    }\n  }\n\n  FixedTypedVector AsFixedTypedVector() const {\n    if (IsFixedTypedVector()) {\n      uint8_t len = 0;\n      auto vtype = ToFixedTypedVectorElementType(type_, &len);\n      return FixedTypedVector(Indirect(), byte_width_, vtype, len);\n    } else {\n      return FixedTypedVector::EmptyFixedTypedVector();\n    }\n  }\n\n  Map AsMap() const {\n    if (type_ == FBT_MAP) {\n      return Map(Indirect(), byte_width_);\n    } else {\n      return Map::EmptyMap();\n    }\n  }\n\n  template <typename T>\n  T As() const;\n\n  // Experimental: Mutation functions.\n  // These allow scalars in an already created buffer to be updated in-place.\n  // Since by default scalars are stored in the smallest possible space,\n  // the new value may not fit, in which case these functions return false.\n  // To avoid this, you can construct the values you intend to mutate using\n  // Builder::ForceMinimumBitWidth.\n  bool MutateInt(int64_t i) {\n    if (type_ == FBT_INT) {\n      return Mutate(data_, i, parent_width_, WidthI(i));\n    } else if (type_ == FBT_INDIRECT_INT) {\n      return Mutate(Indirect(), i, byte_width_, WidthI(i));\n    } else if (type_ == FBT_UINT) {\n      auto u = static_cast<uint64_t>(i);\n      return Mutate(data_, u, parent_width_, WidthU(u));\n    } else if (type_ == FBT_INDIRECT_UINT) {\n      auto u = static_cast<uint64_t>(i);\n      return Mutate(Indirect(), u, byte_width_, WidthU(u));\n    } else {\n      return false;\n    }\n  }\n\n  bool MutateBool(bool b) {\n    return type_ == FBT_BOOL && Mutate(data_, b, parent_width_, BIT_WIDTH_8);\n  }\n\n  bool MutateUInt(uint64_t u) {\n    if (type_ == FBT_UINT) {\n      return Mutate(data_, u, parent_width_, WidthU(u));\n    } else if (type_ == FBT_INDIRECT_UINT) {\n      return Mutate(Indirect(), u, byte_width_, WidthU(u));\n    } else if (type_ == FBT_INT) {\n      auto i = static_cast<int64_t>(u);\n      return Mutate(data_, i, parent_width_, WidthI(i));\n    } else if (type_ == FBT_INDIRECT_INT) {\n      auto i = static_cast<int64_t>(u);\n      return Mutate(Indirect(), i, byte_width_, WidthI(i));\n    } else {\n      return false;\n    }\n  }\n\n  bool MutateFloat(float f) {\n    if (type_ == FBT_FLOAT) {\n      return MutateF(data_, f, parent_width_, BIT_WIDTH_32);\n    } else if (type_ == FBT_INDIRECT_FLOAT) {\n      return MutateF(Indirect(), f, byte_width_, BIT_WIDTH_32);\n    } else {\n      return false;\n    }\n  }\n\n  bool MutateFloat(double d) {\n    if (type_ == FBT_FLOAT) {\n      return MutateF(data_, d, parent_width_, WidthF(d));\n    } else if (type_ == FBT_INDIRECT_FLOAT) {\n      return MutateF(Indirect(), d, byte_width_, WidthF(d));\n    } else {\n      return false;\n    }\n  }\n\n  bool MutateString(const char* str, size_t len) {\n    auto s = AsString();\n    if (s.IsTheEmptyString()) return false;\n    // This is very strict, could allow shorter strings, but that creates\n    // garbage.\n    if (s.length() != len) return false;\n    memcpy(const_cast<char*>(s.c_str()), str, len);\n    return true;\n  }\n  bool MutateString(const char* str) { return MutateString(str, strlen(str)); }\n  bool MutateString(const std::string& str) {\n    return MutateString(str.data(), str.length());\n  }\n\n private:\n  const uint8_t* Indirect() const {\n    return flexbuffers::Indirect(data_, parent_width_);\n  }\n\n  template <typename T>\n  bool Mutate(const uint8_t* dest, T t, size_t byte_width,\n              BitWidth value_width) {\n    auto fits = static_cast<size_t>(static_cast<size_t>(1U) << value_width) <=\n                byte_width;\n    if (fits) {\n      t = flatbuffers::EndianScalar(t);\n      memcpy(const_cast<uint8_t*>(dest), &t, byte_width);\n    }\n    return fits;\n  }\n\n  template <typename T>\n  bool MutateF(const uint8_t* dest, T t, size_t byte_width,\n               BitWidth value_width) {\n    if (byte_width == sizeof(double))\n      return Mutate(dest, static_cast<double>(t), byte_width, value_width);\n    if (byte_width == sizeof(float))\n      return Mutate(dest, static_cast<float>(t), byte_width, value_width);\n    FLATBUFFERS_ASSERT(false);\n    return false;\n  }\n\n  friend class Verifier;\n\n  const uint8_t* data_;\n  uint8_t parent_width_;\n  uint8_t byte_width_;\n  Type type_;\n};\n\n// Template specialization for As().\ntemplate <>\ninline bool Reference::As<bool>() const {\n  return AsBool();\n}\n\ntemplate <>\ninline int8_t Reference::As<int8_t>() const {\n  return AsInt8();\n}\ntemplate <>\ninline int16_t Reference::As<int16_t>() const {\n  return AsInt16();\n}\ntemplate <>\ninline int32_t Reference::As<int32_t>() const {\n  return AsInt32();\n}\ntemplate <>\ninline int64_t Reference::As<int64_t>() const {\n  return AsInt64();\n}\n\ntemplate <>\ninline uint8_t Reference::As<uint8_t>() const {\n  return AsUInt8();\n}\ntemplate <>\ninline uint16_t Reference::As<uint16_t>() const {\n  return AsUInt16();\n}\ntemplate <>\ninline uint32_t Reference::As<uint32_t>() const {\n  return AsUInt32();\n}\ntemplate <>\ninline uint64_t Reference::As<uint64_t>() const {\n  return AsUInt64();\n}\n\ntemplate <>\ninline double Reference::As<double>() const {\n  return AsDouble();\n}\ntemplate <>\ninline float Reference::As<float>() const {\n  return AsFloat();\n}\n\ntemplate <>\ninline String Reference::As<String>() const {\n  return AsString();\n}\ntemplate <>\ninline std::string Reference::As<std::string>() const {\n  return AsString().str();\n}\n\ntemplate <>\ninline Blob Reference::As<Blob>() const {\n  return AsBlob();\n}\ntemplate <>\ninline Vector Reference::As<Vector>() const {\n  return AsVector();\n}\ntemplate <>\ninline TypedVector Reference::As<TypedVector>() const {\n  return AsTypedVector();\n}\ntemplate <>\ninline FixedTypedVector Reference::As<FixedTypedVector>() const {\n  return AsFixedTypedVector();\n}\ntemplate <>\ninline Map Reference::As<Map>() const {\n  return AsMap();\n}\n\ninline uint8_t PackedType(BitWidth bit_width, Type type) {\n  return static_cast<uint8_t>(bit_width | (type << 2));\n}\n\ninline uint8_t NullPackedType() { return PackedType(BIT_WIDTH_8, FBT_NULL); }\n\n// Vector accessors.\n// Note: if you try to access outside of bounds, you get a Null value back\n// instead. Normally this would be an assert, but since this is \"dynamically\n// typed\" data, you may not want that (someone sends you a 2d vector and you\n// wanted 3d).\n// The Null converts seamlessly into a default value for any other type.\n// TODO(wvo): Could introduce an #ifdef that makes this into an assert?\ninline Reference Vector::operator[](size_t i) const {\n  auto len = size();\n  if (i >= len) return Reference(nullptr, 1, NullPackedType());\n  auto packed_type = (data_ + len * byte_width_)[i];\n  auto elem = data_ + i * byte_width_;\n  return Reference(elem, byte_width_, packed_type);\n}\n\ninline Reference TypedVector::operator[](size_t i) const {\n  auto len = size();\n  if (i >= len) return Reference(nullptr, 1, NullPackedType());\n  auto elem = data_ + i * byte_width_;\n  return Reference(elem, byte_width_, 1, type_);\n}\n\ninline Reference FixedTypedVector::operator[](size_t i) const {\n  if (i >= len_) return Reference(nullptr, 1, NullPackedType());\n  auto elem = data_ + i * byte_width_;\n  return Reference(elem, byte_width_, 1, type_);\n}\n\ntemplate <typename T>\nint KeyCompare(const void* key, const void* elem) {\n  auto str_elem = reinterpret_cast<const char*>(\n      Indirect<T>(reinterpret_cast<const uint8_t*>(elem)));\n  auto skey = reinterpret_cast<const char*>(key);\n  return strcmp(skey, str_elem);\n}\n\ninline Reference Map::operator[](const char* key) const {\n  auto keys = Keys();\n  // We can't pass keys.byte_width_ to the comparison function, so we have\n  // to pick the right one ahead of time.\n  int (*comp)(const void*, const void*) = nullptr;\n  switch (keys.byte_width_) {\n    case 1:\n      comp = KeyCompare<uint8_t>;\n      break;\n    case 2:\n      comp = KeyCompare<uint16_t>;\n      break;\n    case 4:\n      comp = KeyCompare<uint32_t>;\n      break;\n    case 8:\n      comp = KeyCompare<uint64_t>;\n      break;\n    default:\n      FLATBUFFERS_ASSERT(false);\n      return Reference();\n  }\n  auto res = std::bsearch(key, keys.data_, keys.size(), keys.byte_width_, comp);\n  if (!res) return Reference(nullptr, 1, NullPackedType());\n  auto i = (reinterpret_cast<uint8_t*>(res) - keys.data_) / keys.byte_width_;\n  return (*static_cast<const Vector*>(this))[i];\n}\n\ninline Reference Map::operator[](const std::string& key) const {\n  return (*this)[key.c_str()];\n}\n\ninline Reference GetRoot(const uint8_t* buffer, size_t size) {\n  // See Finish() below for the serialization counterpart of this.\n  // The root starts at the end of the buffer, so we parse backwards from there.\n  auto end = buffer + size;\n  auto byte_width = *--end;\n  auto packed_type = *--end;\n  end -= byte_width;  // The root data item.\n  return Reference(end, byte_width, packed_type);\n}\n\ninline Reference GetRoot(const std::vector<uint8_t>& buffer) {\n  return GetRoot(buffer.data(), buffer.size());\n}\n\n// Flags that configure how the Builder behaves.\n// The \"Share\" flags determine if the Builder automatically tries to pool\n// this type. Pooling can reduce the size of serialized data if there are\n// multiple maps of the same kind, at the expense of slightly slower\n// serialization (the cost of lookups) and more memory use (std::set).\n// By default this is on for keys, but off for strings.\n// Turn keys off if you have e.g. only one map.\n// Turn strings on if you expect many non-unique string values.\n// Additionally, sharing key vectors can save space if you have maps with\n// identical field populations.\nenum BuilderFlag {\n  BUILDER_FLAG_NONE = 0,\n  BUILDER_FLAG_SHARE_KEYS = 1,\n  BUILDER_FLAG_SHARE_STRINGS = 2,\n  BUILDER_FLAG_SHARE_KEYS_AND_STRINGS = 3,\n  BUILDER_FLAG_SHARE_KEY_VECTORS = 4,\n  BUILDER_FLAG_SHARE_ALL = 7,\n};\n\nclass Builder FLATBUFFERS_FINAL_CLASS {\n public:\n  Builder(size_t initial_size = 256,\n          BuilderFlag flags = BUILDER_FLAG_SHARE_KEYS)\n      : buf_(initial_size),\n        finished_(false),\n        has_duplicate_keys_(false),\n        flags_(flags),\n        force_min_bit_width_(BIT_WIDTH_8),\n        key_pool(KeyOffsetCompare(buf_)),\n        string_pool(StringOffsetCompare(buf_)) {\n    buf_.clear();\n  }\n\n#ifdef FLATBUFFERS_DEFAULT_DECLARATION\n  Builder(Builder&&) = default;\n  Builder& operator=(Builder&&) = default;\n#endif\n\n  /// @brief Get the serialized buffer (after you call `Finish()`).\n  /// @return Returns a vector owned by this class.\n  const std::vector<uint8_t>& GetBuffer() const {\n    Finished();\n    return buf_;\n  }\n\n  // Size of the buffer. Does not include unfinished values.\n  size_t GetSize() const { return buf_.size(); }\n\n  // Reset all state so we can re-use the buffer.\n  void Clear() {\n    buf_.clear();\n    stack_.clear();\n    finished_ = false;\n    // flags_ remains as-is;\n    force_min_bit_width_ = BIT_WIDTH_8;\n    key_pool.clear();\n    string_pool.clear();\n  }\n\n  // All value constructing functions below have two versions: one that\n  // takes a key (for placement inside a map) and one that doesn't (for inside\n  // vectors and elsewhere).\n\n  void Null() { stack_.push_back(Value()); }\n  void Null(const char* key) {\n    Key(key);\n    Null();\n  }\n\n  void Int(int64_t i) { stack_.push_back(Value(i, FBT_INT, WidthI(i))); }\n  void Int(const char* key, int64_t i) {\n    Key(key);\n    Int(i);\n  }\n\n  void UInt(uint64_t u) { stack_.push_back(Value(u, FBT_UINT, WidthU(u))); }\n  void UInt(const char* key, uint64_t u) {\n    Key(key);\n    UInt(u);\n  }\n\n  void Float(float f) { stack_.push_back(Value(f)); }\n  void Float(const char* key, float f) {\n    Key(key);\n    Float(f);\n  }\n\n  void Double(double f) { stack_.push_back(Value(f)); }\n  void Double(const char* key, double d) {\n    Key(key);\n    Double(d);\n  }\n\n  void Bool(bool b) { stack_.push_back(Value(b)); }\n  void Bool(const char* key, bool b) {\n    Key(key);\n    Bool(b);\n  }\n\n  void IndirectInt(int64_t i) { PushIndirect(i, FBT_INDIRECT_INT, WidthI(i)); }\n  void IndirectInt(const char* key, int64_t i) {\n    Key(key);\n    IndirectInt(i);\n  }\n\n  void IndirectUInt(uint64_t u) {\n    PushIndirect(u, FBT_INDIRECT_UINT, WidthU(u));\n  }\n  void IndirectUInt(const char* key, uint64_t u) {\n    Key(key);\n    IndirectUInt(u);\n  }\n\n  void IndirectFloat(float f) {\n    PushIndirect(f, FBT_INDIRECT_FLOAT, BIT_WIDTH_32);\n  }\n  void IndirectFloat(const char* key, float f) {\n    Key(key);\n    IndirectFloat(f);\n  }\n\n  void IndirectDouble(double f) {\n    PushIndirect(f, FBT_INDIRECT_FLOAT, WidthF(f));\n  }\n  void IndirectDouble(const char* key, double d) {\n    Key(key);\n    IndirectDouble(d);\n  }\n\n  size_t Key(const char* str, size_t len) {\n    auto sloc = buf_.size();\n    WriteBytes(str, len + 1);\n    if (flags_ & BUILDER_FLAG_SHARE_KEYS) {\n      auto it = key_pool.find(sloc);\n      if (it != key_pool.end()) {\n        // Already in the buffer. Remove key we just serialized, and use\n        // existing offset instead.\n        buf_.resize(sloc);\n        sloc = *it;\n      } else {\n        key_pool.insert(sloc);\n      }\n    }\n    stack_.push_back(Value(static_cast<uint64_t>(sloc), FBT_KEY, BIT_WIDTH_8));\n    return sloc;\n  }\n\n  size_t Key(const char* str) { return Key(str, strlen(str)); }\n  size_t Key(const std::string& str) { return Key(str.c_str(), str.size()); }\n\n  size_t String(const char* str, size_t len) {\n    auto reset_to = buf_.size();\n    auto sloc = CreateBlob(str, len, 1, FBT_STRING);\n    if (flags_ & BUILDER_FLAG_SHARE_STRINGS) {\n      StringOffset so(sloc, len);\n      auto it = string_pool.find(so);\n      if (it != string_pool.end()) {\n        // Already in the buffer. Remove string we just serialized, and use\n        // existing offset instead.\n        buf_.resize(reset_to);\n        sloc = it->first;\n        stack_.back().u_ = sloc;\n      } else {\n        string_pool.insert(so);\n      }\n    }\n    return sloc;\n  }\n  size_t String(const char* str) { return String(str, strlen(str)); }\n  size_t String(const std::string& str) {\n    return String(str.c_str(), str.size());\n  }\n  void String(const flexbuffers::String& str) {\n    String(str.c_str(), str.length());\n  }\n\n  void String(const char* key, const char* str) {\n    Key(key);\n    String(str);\n  }\n  void String(const char* key, const std::string& str) {\n    Key(key);\n    String(str);\n  }\n  void String(const char* key, const flexbuffers::String& str) {\n    Key(key);\n    String(str);\n  }\n\n  size_t Blob(const void* data, size_t len) {\n    return CreateBlob(data, len, 0, FBT_BLOB);\n  }\n  size_t Blob(const std::vector<uint8_t>& v) {\n    return CreateBlob(v.data(), v.size(), 0, FBT_BLOB);\n  }\n\n  void Blob(const char* key, const void* data, size_t len) {\n    Key(key);\n    Blob(data, len);\n  }\n  void Blob(const char* key, const std::vector<uint8_t>& v) {\n    Key(key);\n    Blob(v);\n  }\n\n  // TODO(wvo): support all the FlexBuffer types (like flexbuffers::String),\n  // e.g. Vector etc. Also in overloaded versions.\n  // Also some FlatBuffers types?\n\n  size_t StartVector() { return stack_.size(); }\n  size_t StartVector(const char* key) {\n    Key(key);\n    return stack_.size();\n  }\n  size_t StartMap() { return stack_.size(); }\n  size_t StartMap(const char* key) {\n    Key(key);\n    return stack_.size();\n  }\n\n  // TODO(wvo): allow this to specify an alignment greater than the natural\n  // alignment.\n  size_t EndVector(size_t start, bool typed, bool fixed) {\n    auto vec = CreateVector(start, stack_.size() - start, 1, typed, fixed);\n    // Remove temp elements and return vector.\n    stack_.resize(start);\n    stack_.push_back(vec);\n    return static_cast<size_t>(vec.u_);\n  }\n\n  size_t EndMap(size_t start) {\n    // We should have interleaved keys and values on the stack.\n    auto len = MapElementCount(start);\n    // Make sure keys are all strings:\n    for (auto key = start; key < stack_.size(); key += 2) {\n      FLATBUFFERS_ASSERT(stack_[key].type_ == FBT_KEY);\n    }\n    // Now sort values, so later we can do a binary search lookup.\n    // We want to sort 2 array elements at a time.\n    struct TwoValue {\n      Value key;\n      Value val;\n    };\n    // TODO(wvo): strict aliasing?\n    // TODO(wvo): allow the caller to indicate the data is already sorted\n    // for maximum efficiency? With an assert to check sortedness to make sure\n    // we're not breaking binary search.\n    // Or, we can track if the map is sorted as keys are added which would be\n    // be quite cheap (cheaper than checking it here), so we can skip this\n    // step automatically when appliccable, and encourage people to write in\n    // sorted fashion.\n    // std::sort is typically already a lot faster on sorted data though.\n    auto dict = reinterpret_cast<TwoValue*>(stack_.data() + start);\n    std::sort(dict, dict + len,\n              [&](const TwoValue& a, const TwoValue& b) -> bool {\n                auto as = reinterpret_cast<const char*>(buf_.data() + a.key.u_);\n                auto bs = reinterpret_cast<const char*>(buf_.data() + b.key.u_);\n                auto comp = strcmp(as, bs);\n                // We want to disallow duplicate keys, since this results in a\n                // map where values cannot be found.\n                // But we can't assert here (since we don't want to fail on\n                // random JSON input) or have an error mechanism.\n                // Instead, we set has_duplicate_keys_ in the builder to\n                // signal this.\n                // TODO: Have to check for pointer equality, as some sort\n                // implementation apparently call this function with the same\n                // element?? Why?\n                if (!comp && &a != &b) has_duplicate_keys_ = true;\n                return comp < 0;\n              });\n    // First create a vector out of all keys.\n    // TODO(wvo): if kBuilderFlagShareKeyVectors is true, see if we can share\n    // the first vector.\n    auto keys = CreateVector(start, len, 2, true, false);\n    auto vec = CreateVector(start + 1, len, 2, false, false, &keys);\n    // Remove temp elements and return map.\n    stack_.resize(start);\n    stack_.push_back(vec);\n    return static_cast<size_t>(vec.u_);\n  }\n\n  // Call this after EndMap to see if the map had any duplicate keys.\n  // Any map with such keys won't be able to retrieve all values.\n  bool HasDuplicateKeys() const { return has_duplicate_keys_; }\n\n  template <typename F>\n  size_t Vector(F f) {\n    auto start = StartVector();\n    f();\n    return EndVector(start, false, false);\n  }\n  template <typename F, typename T>\n  size_t Vector(F f, T& state) {\n    auto start = StartVector();\n    f(state);\n    return EndVector(start, false, false);\n  }\n  template <typename F>\n  size_t Vector(const char* key, F f) {\n    auto start = StartVector(key);\n    f();\n    return EndVector(start, false, false);\n  }\n  template <typename F, typename T>\n  size_t Vector(const char* key, F f, T& state) {\n    auto start = StartVector(key);\n    f(state);\n    return EndVector(start, false, false);\n  }\n\n  template <typename T>\n  void Vector(const T* elems, size_t len) {\n    if (flatbuffers::is_scalar<T>::value) {\n      // This path should be a lot quicker and use less space.\n      ScalarVector(elems, len, false);\n    } else {\n      auto start = StartVector();\n      for (size_t i = 0; i < len; i++) Add(elems[i]);\n      EndVector(start, false, false);\n    }\n  }\n  template <typename T>\n  void Vector(const char* key, const T* elems, size_t len) {\n    Key(key);\n    Vector(elems, len);\n  }\n  template <typename T>\n  void Vector(const std::vector<T>& vec) {\n    Vector(vec.data(), vec.size());\n  }\n\n  template <typename F>\n  size_t TypedVector(F f) {\n    auto start = StartVector();\n    f();\n    return EndVector(start, true, false);\n  }\n  template <typename F, typename T>\n  size_t TypedVector(F f, T& state) {\n    auto start = StartVector();\n    f(state);\n    return EndVector(start, true, false);\n  }\n  template <typename F>\n  size_t TypedVector(const char* key, F f) {\n    auto start = StartVector(key);\n    f();\n    return EndVector(start, true, false);\n  }\n  template <typename F, typename T>\n  size_t TypedVector(const char* key, F f, T& state) {\n    auto start = StartVector(key);\n    f(state);\n    return EndVector(start, true, false);\n  }\n\n  template <typename T>\n  size_t FixedTypedVector(const T* elems, size_t len) {\n    // We only support a few fixed vector lengths. Anything bigger use a\n    // regular typed vector.\n    FLATBUFFERS_ASSERT(len >= 2 && len <= 4);\n    // And only scalar values.\n    static_assert(flatbuffers::is_scalar<T>::value, \"Unrelated types\");\n    return ScalarVector(elems, len, true);\n  }\n\n  template <typename T>\n  size_t FixedTypedVector(const char* key, const T* elems, size_t len) {\n    Key(key);\n    return FixedTypedVector(elems, len);\n  }\n\n  template <typename F>\n  size_t Map(F f) {\n    auto start = StartMap();\n    f();\n    return EndMap(start);\n  }\n  template <typename F, typename T>\n  size_t Map(F f, T& state) {\n    auto start = StartMap();\n    f(state);\n    return EndMap(start);\n  }\n  template <typename F>\n  size_t Map(const char* key, F f) {\n    auto start = StartMap(key);\n    f();\n    return EndMap(start);\n  }\n  template <typename F, typename T>\n  size_t Map(const char* key, F f, T& state) {\n    auto start = StartMap(key);\n    f(state);\n    return EndMap(start);\n  }\n  template <typename T>\n  void Map(const std::map<std::string, T>& map) {\n    auto start = StartMap();\n    for (auto it = map.begin(); it != map.end(); ++it)\n      Add(it->first.c_str(), it->second);\n    EndMap(start);\n  }\n\n  size_t MapElementCount(size_t start) {\n    // Make sure it is an even number:\n    auto len = stack_.size() - start;\n    FLATBUFFERS_ASSERT(!(len & 1));\n    len /= 2;\n    return len;\n  }\n\n  // If you wish to share a value explicitly (a value not shared automatically\n  // through one of the BUILDER_FLAG_SHARE_* flags) you can do so with these\n  // functions. Or if you wish to turn those flags off for performance reasons\n  // and still do some explicit sharing. For example:\n  // builder.IndirectDouble(M_PI);\n  // auto id = builder.LastValue();  // Remember where we stored it.\n  // .. more code goes here ..\n  // builder.ReuseValue(id);  // Refers to same double by offset.\n  // LastValue works regardless of whether the value has a key or not.\n  // Works on any data type.\n  struct Value;\n  Value LastValue() { return stack_.back(); }\n  void ReuseValue(Value v) { stack_.push_back(v); }\n  void ReuseValue(const char* key, Value v) {\n    Key(key);\n    ReuseValue(v);\n  }\n\n  // Undo the last element serialized. Call once for a value and once for a\n  // key.\n  void Undo() { stack_.pop_back(); }\n\n  // Overloaded Add that tries to call the correct function above.\n  void Add(int8_t i) { Int(i); }\n  void Add(int16_t i) { Int(i); }\n  void Add(int32_t i) { Int(i); }\n  void Add(int64_t i) { Int(i); }\n  void Add(uint8_t u) { UInt(u); }\n  void Add(uint16_t u) { UInt(u); }\n  void Add(uint32_t u) { UInt(u); }\n  void Add(uint64_t u) { UInt(u); }\n  void Add(float f) { Float(f); }\n  void Add(double d) { Double(d); }\n  void Add(bool b) { Bool(b); }\n  void Add(const char* str) { String(str); }\n  void Add(const std::string& str) { String(str); }\n  void Add(const flexbuffers::String& str) { String(str); }\n\n  template <typename T>\n  void Add(const std::vector<T>& vec) {\n    Vector(vec);\n  }\n\n  template <typename T>\n  void Add(const char* key, const T& t) {\n    Key(key);\n    Add(t);\n  }\n\n  template <typename T>\n  void Add(const std::map<std::string, T>& map) {\n    Map(map);\n  }\n\n  template <typename T>\n  void operator+=(const T& t) {\n    Add(t);\n  }\n\n  // This function is useful in combination with the Mutate* functions above.\n  // It forces elements of vectors and maps to have a minimum size, such that\n  // they can later be updated without failing.\n  // Call with no arguments to reset.\n  void ForceMinimumBitWidth(BitWidth bw = BIT_WIDTH_8) {\n    force_min_bit_width_ = bw;\n  }\n\n  void Finish() {\n    // If you hit this assert, you likely have objects that were never included\n    // in a parent. You need to have exactly one root to finish a buffer.\n    // Check your Start/End calls are matched, and all objects are inside\n    // some other object.\n    FLATBUFFERS_ASSERT(stack_.size() == 1);\n\n    // Write root value.\n    auto byte_width = Align(stack_[0].ElemWidth(buf_.size(), 0));\n    WriteAny(stack_[0], byte_width);\n    // Write root type.\n    Write(stack_[0].StoredPackedType(), 1);\n    // Write root size. Normally determined by parent, but root has no parent :)\n    Write(byte_width, 1);\n\n    finished_ = true;\n  }\n\n private:\n  void Finished() const {\n    // If you get this assert, you're attempting to get access a buffer\n    // which hasn't been finished yet. Be sure to call\n    // Builder::Finish with your root object.\n    FLATBUFFERS_ASSERT(finished_);\n  }\n\n  // Align to prepare for writing a scalar with a certain size.\n  uint8_t Align(BitWidth alignment) {\n    auto byte_width = 1U << alignment;\n    buf_.insert(buf_.end(), flatbuffers::PaddingBytes(buf_.size(), byte_width),\n                0);\n    return static_cast<uint8_t>(byte_width);\n  }\n\n  void WriteBytes(const void* val, size_t size) {\n    buf_.insert(buf_.end(), reinterpret_cast<const uint8_t*>(val),\n                reinterpret_cast<const uint8_t*>(val) + size);\n  }\n\n  template <typename T>\n  void Write(T val, size_t byte_width) {\n    FLATBUFFERS_ASSERT(sizeof(T) >= byte_width);\n    val = flatbuffers::EndianScalar(val);\n    WriteBytes(&val, byte_width);\n  }\n\n  void WriteDouble(double f, uint8_t byte_width) {\n    switch (byte_width) {\n      case 8:\n        Write(f, byte_width);\n        break;\n      case 4:\n        Write(static_cast<float>(f), byte_width);\n        break;\n      // case 2: Write(static_cast<half>(f), byte_width); break;\n      // case 1: Write(static_cast<quarter>(f), byte_width); break;\n      default:\n        FLATBUFFERS_ASSERT(0);\n    }\n  }\n\n  void WriteOffset(uint64_t o, uint8_t byte_width) {\n    auto reloff = buf_.size() - o;\n    FLATBUFFERS_ASSERT(byte_width == 8 || reloff < 1ULL << (byte_width * 8));\n    Write(reloff, byte_width);\n  }\n\n  template <typename T>\n  void PushIndirect(T val, Type type, BitWidth bit_width) {\n    auto byte_width = Align(bit_width);\n    auto iloc = buf_.size();\n    Write(val, byte_width);\n    stack_.push_back(Value(static_cast<uint64_t>(iloc), type, bit_width));\n  }\n\n  static BitWidth WidthB(size_t byte_width) {\n    switch (byte_width) {\n      case 1:\n        return BIT_WIDTH_8;\n      case 2:\n        return BIT_WIDTH_16;\n      case 4:\n        return BIT_WIDTH_32;\n      case 8:\n        return BIT_WIDTH_64;\n      default:\n        FLATBUFFERS_ASSERT(false);\n        return BIT_WIDTH_64;\n    }\n  }\n\n  template <typename T>\n  static Type GetScalarType() {\n    static_assert(flatbuffers::is_scalar<T>::value, \"Unrelated types\");\n    return flatbuffers::is_floating_point<T>::value ? FBT_FLOAT\n           : flatbuffers::is_same<T, bool>::value\n               ? FBT_BOOL\n               : (flatbuffers::is_unsigned<T>::value ? FBT_UINT : FBT_INT);\n  }\n\n public:\n  // This was really intended to be private, except for LastValue/ReuseValue.\n  struct Value {\n    union {\n      int64_t i_;\n      uint64_t u_;\n      double f_;\n    };\n\n    Type type_;\n\n    // For scalars: of itself, for vector: of its elements, for string: length.\n    BitWidth min_bit_width_;\n\n    Value() : i_(0), type_(FBT_NULL), min_bit_width_(BIT_WIDTH_8) {}\n\n    Value(bool b)\n        : u_(static_cast<uint64_t>(b)),\n          type_(FBT_BOOL),\n          min_bit_width_(BIT_WIDTH_8) {}\n\n    Value(int64_t i, Type t, BitWidth bw)\n        : i_(i), type_(t), min_bit_width_(bw) {}\n    Value(uint64_t u, Type t, BitWidth bw)\n        : u_(u), type_(t), min_bit_width_(bw) {}\n\n    Value(float f)\n        : f_(static_cast<double>(f)),\n          type_(FBT_FLOAT),\n          min_bit_width_(BIT_WIDTH_32) {}\n    Value(double f) : f_(f), type_(FBT_FLOAT), min_bit_width_(WidthF(f)) {}\n\n    uint8_t StoredPackedType(BitWidth parent_bit_width_ = BIT_WIDTH_8) const {\n      return PackedType(StoredWidth(parent_bit_width_), type_);\n    }\n\n    BitWidth ElemWidth(size_t buf_size, size_t elem_index) const {\n      if (IsInline(type_)) {\n        return min_bit_width_;\n      } else {\n        // We have an absolute offset, but want to store a relative offset\n        // elem_index elements beyond the current buffer end. Since whether\n        // the relative offset fits in a certain byte_width depends on\n        // the size of the elements before it (and their alignment), we have\n        // to test for each size in turn.\n        for (size_t byte_width = 1;\n             byte_width <= sizeof(flatbuffers::largest_scalar_t);\n             byte_width *= 2) {\n          // Where are we going to write this offset?\n          auto offset_loc = buf_size +\n                            flatbuffers::PaddingBytes(buf_size, byte_width) +\n                            elem_index * byte_width;\n          // Compute relative offset.\n          auto offset = offset_loc - u_;\n          // Does it fit?\n          auto bit_width = WidthU(offset);\n          if (static_cast<size_t>(static_cast<size_t>(1U) << bit_width) ==\n              byte_width)\n            return bit_width;\n        }\n        FLATBUFFERS_ASSERT(false);  // Must match one of the sizes above.\n        return BIT_WIDTH_64;\n      }\n    }\n\n    BitWidth StoredWidth(BitWidth parent_bit_width_ = BIT_WIDTH_8) const {\n      if (IsInline(type_)) {\n        return (std::max)(min_bit_width_, parent_bit_width_);\n      } else {\n        return min_bit_width_;\n      }\n    }\n  };\n\n private:\n  void WriteAny(const Value& val, uint8_t byte_width) {\n    switch (val.type_) {\n      case FBT_NULL:\n      case FBT_INT:\n        Write(val.i_, byte_width);\n        break;\n      case FBT_BOOL:\n      case FBT_UINT:\n        Write(val.u_, byte_width);\n        break;\n      case FBT_FLOAT:\n        WriteDouble(val.f_, byte_width);\n        break;\n      default:\n        WriteOffset(val.u_, byte_width);\n        break;\n    }\n  }\n\n  size_t CreateBlob(const void* data, size_t len, size_t trailing, Type type) {\n    auto bit_width = WidthU(len);\n    auto byte_width = Align(bit_width);\n    Write<uint64_t>(len, byte_width);\n    auto sloc = buf_.size();\n    WriteBytes(data, len + trailing);\n    stack_.push_back(Value(static_cast<uint64_t>(sloc), type, bit_width));\n    return sloc;\n  }\n\n  template <typename T>\n  size_t ScalarVector(const T* elems, size_t len, bool fixed) {\n    auto vector_type = GetScalarType<T>();\n    auto byte_width = sizeof(T);\n    auto bit_width = WidthB(byte_width);\n    // If you get this assert, you're trying to write a vector with a size\n    // field that is bigger than the scalars you're trying to write (e.g. a\n    // byte vector > 255 elements). For such types, write a \"blob\" instead.\n    // TODO: instead of asserting, could write vector with larger elements\n    // instead, though that would be wasteful.\n    FLATBUFFERS_ASSERT(WidthU(len) <= bit_width);\n    Align(bit_width);\n    if (!fixed) Write<uint64_t>(len, byte_width);\n    auto vloc = buf_.size();\n    for (size_t i = 0; i < len; i++) Write(elems[i], byte_width);\n    stack_.push_back(Value(static_cast<uint64_t>(vloc),\n                           ToTypedVector(vector_type, fixed ? len : 0),\n                           bit_width));\n    return vloc;\n  }\n\n  Value CreateVector(size_t start, size_t vec_len, size_t step, bool typed,\n                     bool fixed, const Value* keys = nullptr) {\n    FLATBUFFERS_ASSERT(\n        !fixed ||\n        typed);  // typed=false, fixed=true combination is not supported.\n    // Figure out smallest bit width we can store this vector with.\n    auto bit_width = (std::max)(force_min_bit_width_, WidthU(vec_len));\n    auto prefix_elems = 1;\n    if (keys) {\n      // If this vector is part of a map, we will pre-fix an offset to the keys\n      // to this vector.\n      bit_width = (std::max)(bit_width, keys->ElemWidth(buf_.size(), 0));\n      prefix_elems += 2;\n    }\n    Type vector_type = FBT_KEY;\n    // Check bit widths and types for all elements.\n    for (size_t i = start; i < stack_.size(); i += step) {\n      auto elem_width =\n          stack_[i].ElemWidth(buf_.size(), i - start + prefix_elems);\n      bit_width = (std::max)(bit_width, elem_width);\n      if (typed) {\n        if (i == start) {\n          vector_type = stack_[i].type_;\n        } else {\n          // If you get this assert, you are writing a typed vector with\n          // elements that are not all the same type.\n          FLATBUFFERS_ASSERT(vector_type == stack_[i].type_);\n        }\n      }\n    }\n    // If you get this assert, your typed types are not one of:\n    // Int / UInt / Float / Key.\n    FLATBUFFERS_ASSERT(!typed || IsTypedVectorElementType(vector_type));\n    auto byte_width = Align(bit_width);\n    // Write vector. First the keys width/offset if available, and size.\n    if (keys) {\n      WriteOffset(keys->u_, byte_width);\n      Write<uint64_t>(1ULL << keys->min_bit_width_, byte_width);\n    }\n    if (!fixed) Write<uint64_t>(vec_len, byte_width);\n    // Then the actual data.\n    auto vloc = buf_.size();\n    for (size_t i = start; i < stack_.size(); i += step) {\n      WriteAny(stack_[i], byte_width);\n    }\n    // Then the types.\n    if (!typed) {\n      for (size_t i = start; i < stack_.size(); i += step) {\n        buf_.push_back(stack_[i].StoredPackedType(bit_width));\n      }\n    }\n    return Value(static_cast<uint64_t>(vloc),\n                 keys ? FBT_MAP\n                      : (typed ? ToTypedVector(vector_type, fixed ? vec_len : 0)\n                               : FBT_VECTOR),\n                 bit_width);\n  }\n\n  // You shouldn't really be copying instances of this class.\n  Builder(const Builder&);\n  Builder& operator=(const Builder&);\n\n  std::vector<uint8_t> buf_;\n  std::vector<Value> stack_;\n\n  bool finished_;\n  bool has_duplicate_keys_;\n\n  BuilderFlag flags_;\n\n  BitWidth force_min_bit_width_;\n\n  struct KeyOffsetCompare {\n    explicit KeyOffsetCompare(const std::vector<uint8_t>& buf) : buf_(&buf) {}\n    bool operator()(size_t a, size_t b) const {\n      auto stra = reinterpret_cast<const char*>(buf_->data() + a);\n      auto strb = reinterpret_cast<const char*>(buf_->data() + b);\n      return strcmp(stra, strb) < 0;\n    }\n    const std::vector<uint8_t>* buf_;\n  };\n\n  typedef std::pair<size_t, size_t> StringOffset;\n  struct StringOffsetCompare {\n    explicit StringOffsetCompare(const std::vector<uint8_t>& buf)\n        : buf_(&buf) {}\n    bool operator()(const StringOffset& a, const StringOffset& b) const {\n      auto stra = buf_->data() + a.first;\n      auto strb = buf_->data() + b.first;\n      auto cr = memcmp(stra, strb, (std::min)(a.second, b.second) + 1);\n      return cr < 0 || (cr == 0 && a.second < b.second);\n    }\n    const std::vector<uint8_t>* buf_;\n  };\n\n  typedef std::set<size_t, KeyOffsetCompare> KeyOffsetMap;\n  typedef std::set<StringOffset, StringOffsetCompare> StringOffsetMap;\n\n  KeyOffsetMap key_pool;\n  StringOffsetMap string_pool;\n\n  friend class Verifier;\n};\n\n// Helper class to verify the integrity of a FlexBuffer\nclass Verifier FLATBUFFERS_FINAL_CLASS {\n public:\n  Verifier(const uint8_t* buf, size_t buf_len,\n           // Supplying this vector likely results in faster verification\n           // of larger buffers with many shared keys/strings, but\n           // comes at the cost of using additional memory the same size of\n           // the buffer being verified, so it is by default off.\n           std::vector<uint8_t>* reuse_tracker = nullptr,\n           bool _check_alignment = true, size_t max_depth = 64)\n      : buf_(buf),\n        size_(buf_len),\n        depth_(0),\n        max_depth_(max_depth),\n        num_vectors_(0),\n        max_vectors_(buf_len),\n        check_alignment_(_check_alignment),\n        reuse_tracker_(reuse_tracker) {\n    FLATBUFFERS_ASSERT(static_cast<int32_t>(size_) <\n                       FLATBUFFERS_MAX_BUFFER_SIZE);\n    if (reuse_tracker_) {\n      reuse_tracker_->clear();\n      reuse_tracker_->resize(size_, PackedType(BIT_WIDTH_8, FBT_NULL));\n    }\n  }\n\n private:\n  // Central location where any verification failures register.\n  bool Check(bool ok) const {\n    // clang-format off\n    #ifdef FLATBUFFERS_DEBUG_VERIFICATION_FAILURE\n      FLATBUFFERS_ASSERT(ok);\n    #endif\n    // clang-format on\n    return ok;\n  }\n\n  // Verify any range within the buffer.\n  bool VerifyFrom(size_t elem, size_t elem_len) const {\n    return Check(elem_len < size_ && elem <= size_ - elem_len);\n  }\n  bool VerifyBefore(size_t elem, size_t elem_len) const {\n    return Check(elem_len <= elem);\n  }\n\n  bool VerifyFromPointer(const uint8_t* p, size_t len) {\n    auto o = static_cast<size_t>(p - buf_);\n    return VerifyFrom(o, len);\n  }\n  bool VerifyBeforePointer(const uint8_t* p, size_t len) {\n    auto o = static_cast<size_t>(p - buf_);\n    return VerifyBefore(o, len);\n  }\n\n  bool VerifyByteWidth(size_t width) {\n    return Check(width == 1 || width == 2 || width == 4 || width == 8);\n  }\n\n  bool VerifyType(int type) { return Check(type >= 0 && type < FBT_MAX_TYPE); }\n\n  bool VerifyOffset(uint64_t off, const uint8_t* p) {\n    return Check(off <= static_cast<uint64_t>(size_)) &&\n           off <= static_cast<uint64_t>(p - buf_);\n  }\n\n  bool VerifyAlignment(const uint8_t* p, size_t size) const {\n    auto o = static_cast<size_t>(p - buf_);\n    return Check((o & (size - 1)) == 0 || !check_alignment_);\n  }\n\n// Macro, since we want to escape from parent function & use lazy args.\n#define FLEX_CHECK_VERIFIED(P, PACKED_TYPE)                     \\\n  if (reuse_tracker_) {                                         \\\n    auto packed_type = PACKED_TYPE;                             \\\n    auto existing = (*reuse_tracker_)[P - buf_];                \\\n    if (existing == packed_type) return true;                   \\\n    /* Fail verification if already set with different type! */ \\\n    if (!Check(existing == 0)) return false;                    \\\n    (*reuse_tracker_)[P - buf_] = packed_type;                  \\\n  }\n\n  bool VerifyVector(Reference r, const uint8_t* p, Type elem_type) {\n    // Any kind of nesting goes thru this function, so guard against that\n    // here, both with simple nesting checks, and the reuse tracker if on.\n    depth_++;\n    num_vectors_++;\n    if (!Check(depth_ <= max_depth_ && num_vectors_ <= max_vectors_))\n      return false;\n    auto size_byte_width = r.byte_width_;\n    if (!VerifyBeforePointer(p, size_byte_width)) return false;\n    FLEX_CHECK_VERIFIED(p - size_byte_width,\n                        PackedType(Builder::WidthB(size_byte_width), r.type_));\n    auto sized = Sized(p, size_byte_width);\n    auto num_elems = sized.size();\n    auto elem_byte_width = r.type_ == FBT_STRING || r.type_ == FBT_BLOB\n                               ? uint8_t(1)\n                               : r.byte_width_;\n    auto max_elems = SIZE_MAX / elem_byte_width;\n    if (!Check(num_elems < max_elems))\n      return false;  // Protect against byte_size overflowing.\n    auto byte_size = num_elems * elem_byte_width;\n    if (!VerifyFromPointer(p, byte_size)) return false;\n    if (elem_type == FBT_NULL) {\n      // Verify type bytes after the vector.\n      if (!VerifyFromPointer(p + byte_size, num_elems)) return false;\n      auto v = Vector(p, size_byte_width);\n      for (size_t i = 0; i < num_elems; i++)\n        if (!VerifyRef(v[i])) return false;\n    } else if (elem_type == FBT_KEY) {\n      auto v = TypedVector(p, elem_byte_width, FBT_KEY);\n      for (size_t i = 0; i < num_elems; i++)\n        if (!VerifyRef(v[i])) return false;\n    } else {\n      FLATBUFFERS_ASSERT(IsInline(elem_type));\n    }\n    depth_--;\n    return true;\n  }\n\n  bool VerifyKeys(const uint8_t* p, uint8_t byte_width) {\n    // The vector part of the map has already been verified.\n    const size_t num_prefixed_fields = 3;\n    if (!VerifyBeforePointer(p, byte_width * num_prefixed_fields)) return false;\n    p -= byte_width * num_prefixed_fields;\n    auto off = ReadUInt64(p, byte_width);\n    if (!VerifyOffset(off, p)) return false;\n    auto key_byte_with =\n        static_cast<uint8_t>(ReadUInt64(p + byte_width, byte_width));\n    if (!VerifyByteWidth(key_byte_with)) return false;\n    return VerifyVector(Reference(p, byte_width, key_byte_with, FBT_VECTOR_KEY),\n                        p - off, FBT_KEY);\n  }\n\n  bool VerifyKey(const uint8_t* p) {\n    FLEX_CHECK_VERIFIED(p, PackedType(BIT_WIDTH_8, FBT_KEY));\n    while (p < buf_ + size_)\n      if (*p++) return true;\n    return false;\n  }\n\n#undef FLEX_CHECK_VERIFIED\n\n  bool VerifyTerminator(const String& s) {\n    return VerifyFromPointer(reinterpret_cast<const uint8_t*>(s.c_str()),\n                             s.size() + 1);\n  }\n\n  bool VerifyRef(Reference r) {\n    // r.parent_width_ and r.data_ already verified.\n    if (!VerifyByteWidth(r.byte_width_) || !VerifyType(r.type_)) {\n      return false;\n    }\n    if (IsInline(r.type_)) {\n      // Inline scalars, don't require further verification.\n      return true;\n    }\n    // All remaining types are an offset.\n    auto off = ReadUInt64(r.data_, r.parent_width_);\n    if (!VerifyOffset(off, r.data_)) return false;\n    auto p = r.Indirect();\n    if (!VerifyAlignment(p, r.byte_width_)) return false;\n    switch (r.type_) {\n      case FBT_INDIRECT_INT:\n      case FBT_INDIRECT_UINT:\n      case FBT_INDIRECT_FLOAT:\n        return VerifyFromPointer(p, r.byte_width_);\n      case FBT_KEY:\n        return VerifyKey(p);\n      case FBT_MAP:\n        return VerifyVector(r, p, FBT_NULL) && VerifyKeys(p, r.byte_width_);\n      case FBT_VECTOR:\n        return VerifyVector(r, p, FBT_NULL);\n      case FBT_VECTOR_INT:\n        return VerifyVector(r, p, FBT_INT);\n      case FBT_VECTOR_BOOL:\n      case FBT_VECTOR_UINT:\n        return VerifyVector(r, p, FBT_UINT);\n      case FBT_VECTOR_FLOAT:\n        return VerifyVector(r, p, FBT_FLOAT);\n      case FBT_VECTOR_KEY:\n        return VerifyVector(r, p, FBT_KEY);\n      case FBT_VECTOR_STRING_DEPRECATED:\n        // Use of FBT_KEY here intentional, see elsewhere.\n        return VerifyVector(r, p, FBT_KEY);\n      case FBT_BLOB:\n        return VerifyVector(r, p, FBT_UINT);\n      case FBT_STRING:\n        return VerifyVector(r, p, FBT_UINT) &&\n               VerifyTerminator(String(p, r.byte_width_));\n      case FBT_VECTOR_INT2:\n      case FBT_VECTOR_UINT2:\n      case FBT_VECTOR_FLOAT2:\n      case FBT_VECTOR_INT3:\n      case FBT_VECTOR_UINT3:\n      case FBT_VECTOR_FLOAT3:\n      case FBT_VECTOR_INT4:\n      case FBT_VECTOR_UINT4:\n      case FBT_VECTOR_FLOAT4: {\n        uint8_t len = 0;\n        auto vtype = ToFixedTypedVectorElementType(r.type_, &len);\n        if (!VerifyType(vtype)) return false;\n        return VerifyFromPointer(p, static_cast<size_t>(r.byte_width_) * len);\n      }\n      default:\n        return false;\n    }\n  }\n\n public:\n  bool VerifyBuffer() {\n    if (!Check(size_ >= 3)) return false;\n    auto end = buf_ + size_;\n    auto byte_width = *--end;\n    auto packed_type = *--end;\n    return VerifyByteWidth(byte_width) && Check(end - buf_ >= byte_width) &&\n           VerifyRef(Reference(end - byte_width, byte_width, packed_type));\n  }\n\n private:\n  const uint8_t* buf_;\n  size_t size_;\n  size_t depth_;\n  const size_t max_depth_;\n  size_t num_vectors_;\n  const size_t max_vectors_;\n  bool check_alignment_;\n  std::vector<uint8_t>* reuse_tracker_;\n};\n\n// Utility function that constructs the Verifier for you, see above for\n// parameters.\ninline bool VerifyBuffer(const uint8_t* buf, size_t buf_len,\n                         std::vector<uint8_t>* reuse_tracker = nullptr) {\n  Verifier verifier(buf, buf_len, reuse_tracker);\n  return verifier.VerifyBuffer();\n}\n\n}  // namespace flexbuffers\n\n#if defined(_MSC_VER)\n#pragma warning(pop)\n#endif\n\n#endif  // FLATBUFFERS_FLEXBUFFERS_H_\n"
  },
  {
    "path": "include/flatbuffers/grpc.h",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_GRPC_H_\n#define FLATBUFFERS_GRPC_H_\n\n// Helper functionality to glue FlatBuffers and GRPC.\n\n#include \"flatbuffers/flatbuffers.h\"\n#include \"grpcpp/support/byte_buffer.h\"\n#include \"grpcpp/support/slice.h\"\n\nnamespace flatbuffers {\nnamespace grpc {\n\n// Message is a typed wrapper around a buffer that manages the underlying\n// `grpc_slice` and also provides flatbuffers-specific helpers such as `Verify`\n// and `GetRoot`. Since it is backed by a `grpc_slice`, the underlying buffer\n// is refcounted and ownership is be managed automatically.\ntemplate <class T>\nclass Message {\n public:\n  Message() {}\n\n  Message(::grpc::Slice slice) : slice_(slice) {}\n\n  Message& operator=(const Message& other) = delete;\n\n  Message(Message&& other) = default;\n\n  Message(const Message& other) = delete;\n\n  Message& operator=(Message&& other) = default;\n\n  const uint8_t* mutable_data() const { return slice_.begin(); }\n\n  const uint8_t* data() const { return slice_.begin(); }\n\n  size_t size() const { return slice_.size(); }\n\n  bool Verify() const {\n    Verifier verifier(data(), size());\n    return verifier.VerifyBuffer<T>(nullptr);\n  }\n\n  T* GetMutableRoot() { return flatbuffers::GetMutableRoot<T>(mutable_data()); }\n\n  const T* GetRoot() const { return flatbuffers::GetRoot<T>(data()); }\n\n  // This is only intended for serializer use, or if you know what you're doing\n  const ::grpc::Slice& BorrowSlice() const { return slice_; }\n\n private:\n  ::grpc::Slice slice_;\n};\n\nclass MessageBuilder;\n\n// SliceAllocator is a gRPC-specific allocator that uses the `grpc_slice`\n// refcounted slices to manage memory ownership. This makes it easy and\n// efficient to transfer buffers to gRPC.\nclass SliceAllocator : public Allocator {\n public:\n  SliceAllocator() {}\n\n  SliceAllocator(const SliceAllocator& other) = delete;\n  SliceAllocator& operator=(const SliceAllocator& other) = delete;\n\n  SliceAllocator(SliceAllocator&& other) {\n    // default-construct and swap idiom\n    swap(other);\n  }\n\n  SliceAllocator& operator=(SliceAllocator&& other) {\n    // move-construct and swap idiom\n    SliceAllocator temp(std::move(other));\n    swap(temp);\n    return *this;\n  }\n\n  void swap(SliceAllocator& other) {\n    using std::swap;\n    swap(slice_, other.slice_);\n  }\n\n  virtual ~SliceAllocator() {}\n\n  virtual uint8_t* allocate(size_t size) override {\n    FLATBUFFERS_ASSERT(slice_.size() == 0);\n    slice_ = ::grpc::Slice(size);\n    return const_cast<uint8_t*>(slice_.begin());\n  }\n\n  virtual void deallocate(uint8_t* p, size_t size) override {\n    FLATBUFFERS_ASSERT(p == slice_.begin());\n    FLATBUFFERS_ASSERT(size == slice_.size());\n    slice_ = ::grpc::Slice();\n  }\n\n  virtual uint8_t* reallocate_downward(uint8_t* old_p, size_t old_size,\n                                       size_t new_size, size_t in_use_back,\n                                       size_t in_use_front) override {\n    FLATBUFFERS_ASSERT(old_p == slice_.begin());\n    FLATBUFFERS_ASSERT(old_size == slice_.size());\n    FLATBUFFERS_ASSERT(new_size > old_size);\n    ::grpc::Slice old_slice = slice_;\n    ::grpc::Slice new_slice = ::grpc::Slice(new_size);\n    uint8_t* new_p = const_cast<uint8_t*>(new_slice.begin());\n    memcpy_downward(old_p, old_size, new_p, new_size, in_use_back,\n                    in_use_front);\n    slice_ = new_slice;\n    return const_cast<uint8_t*>(slice_.begin());\n  }\n\n private:\n  ::grpc::Slice& get_slice(uint8_t* p, size_t size) {\n    FLATBUFFERS_ASSERT(p == slice_.begin());\n    FLATBUFFERS_ASSERT(size == slice_.size());\n    return slice_;\n  }\n\n  ::grpc::Slice slice_;\n\n  friend class MessageBuilder;\n};\n\n// SliceAllocatorMember is a hack to ensure that the MessageBuilder's\n// slice_allocator_ member is constructed before the FlatBufferBuilder, since\n// the allocator is used in the FlatBufferBuilder ctor.\nnamespace detail {\nstruct SliceAllocatorMember {\n  SliceAllocator slice_allocator_;\n};\n}  // namespace detail\n\n// MessageBuilder is a gRPC-specific FlatBufferBuilder that uses SliceAllocator\n// to allocate gRPC buffers.\nclass MessageBuilder : private detail::SliceAllocatorMember,\n                       public FlatBufferBuilder {\n public:\n  explicit MessageBuilder(uoffset_t initial_size = 1024)\n      : FlatBufferBuilder(initial_size, &slice_allocator_, false) {}\n\n  MessageBuilder(const MessageBuilder& other) = delete;\n  MessageBuilder& operator=(const MessageBuilder& other) = delete;\n\n  MessageBuilder(MessageBuilder&& other)\n      : FlatBufferBuilder(1024, &slice_allocator_, false) {\n    // Default construct and swap idiom.\n    Swap(other);\n  }\n\n  /// Create a MessageBuilder from a FlatBufferBuilder.\n  explicit MessageBuilder(FlatBufferBuilder&& src,\n                          void (*dealloc)(void*,\n                                          size_t) = &DefaultAllocator::dealloc)\n      : FlatBufferBuilder(1024, &slice_allocator_, false) {\n    src.Swap(*this);\n    src.SwapBufAllocator(*this);\n    if (buf_.capacity()) {\n      uint8_t* buf = buf_.scratch_data();  // pointer to memory\n      size_t capacity = buf_.capacity();   // size of memory\n      slice_allocator_.slice_ = ::grpc::Slice(buf, capacity, dealloc);\n    } else {\n      slice_allocator_.slice_ = ::grpc::Slice();\n    }\n  }\n\n  /// Move-assign a FlatBufferBuilder to a MessageBuilder.\n  /// Only FlatBufferBuilder with default allocator (basically, nullptr) is\n  /// supported.\n  MessageBuilder& operator=(FlatBufferBuilder&& src) {\n    // Move construct a temporary and swap\n    MessageBuilder temp(std::move(src));\n    Swap(temp);\n    return *this;\n  }\n\n  MessageBuilder& operator=(MessageBuilder&& other) {\n    // Move construct a temporary and swap\n    MessageBuilder temp(std::move(other));\n    Swap(temp);\n    return *this;\n  }\n\n  void Swap(MessageBuilder& other) {\n    slice_allocator_.swap(other.slice_allocator_);\n    FlatBufferBuilder::Swap(other);\n    // After swapping the FlatBufferBuilder, we swap back the allocator, which\n    // restores the original allocator back in place. This is necessary because\n    // MessageBuilder's allocator is its own member (SliceAllocatorMember). The\n    // allocator passed to FlatBufferBuilder::vector_downward must point to this\n    // member.\n    buf_.swap_allocator(other.buf_);\n  }\n\n  // Releases the ownership of the buffer pointer.\n  // Returns the size, offset, and the original grpc_slice that\n  // allocated the buffer. Also see grpc_slice_unref().\n  uint8_t* ReleaseRaw(size_t& size, size_t& offset, ::grpc::Slice& slice) {\n    uint8_t* buf = FlatBufferBuilder::ReleaseRaw(size, offset);\n    slice = slice_allocator_.slice_;\n    slice_allocator_.slice_ = ::grpc::Slice();\n    return buf;\n  }\n\n  ~MessageBuilder() {}\n\n  // GetMessage extracts the subslice of the buffer corresponding to the\n  // flatbuffers-encoded region and wraps it in a `Message<T>` to handle buffer\n  // ownership.\n  template <class T>\n  Message<T> GetMessage() {\n    auto buf_data = buf_.scratch_data();  // pointer to memory\n    auto buf_size = buf_.capacity();      // size of memory\n    auto msg_data = buf_.data();          // pointer to msg\n    auto msg_size = buf_.size();          // size of msg\n    // Do some sanity checks on data/size\n    FLATBUFFERS_ASSERT(msg_data);\n    FLATBUFFERS_ASSERT(msg_size);\n    FLATBUFFERS_ASSERT(msg_data >= buf_data);\n    FLATBUFFERS_ASSERT(msg_data + msg_size <= buf_data + buf_size);\n    // Calculate offsets from the buffer start\n    auto begin = msg_data - buf_data;\n    auto end = begin + msg_size;\n    // Get the slice we are working with (no refcount change)\n    ::grpc::Slice slice = slice_allocator_.get_slice(buf_data, buf_size);\n    // Extract a subslice of the existing slice (increment refcount)\n    ::grpc::Slice subslice = slice.sub(begin, end);\n    // Wrap the subslice in a `Message<T>`, but don't increment refcount\n    Message<T> msg(subslice);\n    return msg;\n  }\n\n  template <class T>\n  Message<T> ReleaseMessage() {\n    Message<T> msg = GetMessage<T>();\n    Reset();\n    return msg;\n  }\n\n private:\n  // SliceAllocator slice_allocator_;  // part of SliceAllocatorMember\n};\n\n}  // namespace grpc\n}  // namespace flatbuffers\n\nnamespace grpc {\n\ntemplate <class T>\nclass SerializationTraits<flatbuffers::grpc::Message<T>> {\n public:\n  static grpc::Status Serialize(const flatbuffers::grpc::Message<T>& msg,\n                                ByteBuffer* buffer, bool* own_buffer) {\n    // Package the single slice into a `ByteBuffer`,\n    // incrementing the refcount in the process.\n    *buffer = ByteBuffer(&msg.BorrowSlice(), 1);\n    *own_buffer = true;\n    return grpc::Status::OK;\n  }\n\n  // Deserialize by pulling the\n  static grpc::Status Deserialize(ByteBuffer* buf,\n                                  flatbuffers::grpc::Message<T>* msg) {\n    Slice slice;\n    if (!buf->TrySingleSlice(&slice).ok()) {\n      if (!buf->DumpToSingleSlice(&slice).ok()) {\n        buf->Clear();\n        return ::grpc::Status(::grpc::StatusCode::INTERNAL, \"No payload\");\n      }\n    }\n    *msg = flatbuffers::grpc::Message<T>(slice);\n    buf->Clear();\n#if FLATBUFFERS_GRPC_DISABLE_AUTO_VERIFICATION\n    return ::grpc::Status::OK;\n#else\n    if (msg->Verify()) {\n      return ::grpc::Status::OK;\n    } else {\n      return ::grpc::Status(::grpc::StatusCode::INTERNAL,\n                            \"Message verification failed\");\n    }\n#endif\n  }\n};\n\n}  // namespace grpc\n\n#endif  // FLATBUFFERS_GRPC_H_\n"
  },
  {
    "path": "include/flatbuffers/hash.h",
    "content": "/*\n * Copyright 2015 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_HASH_H_\n#define FLATBUFFERS_HASH_H_\n\n#include <cstdint>\n#include <cstring>\n\n#include \"flatbuffers/flatbuffers.h\"\n\nnamespace flatbuffers {\n\ntemplate <typename T>\nstruct FnvTraits {\n  static const T kFnvPrime;\n  static const T kOffsetBasis;\n};\n\ntemplate <>\nstruct FnvTraits<uint32_t> {\n  static const uint32_t kFnvPrime = 0x01000193;\n  static const uint32_t kOffsetBasis = 0x811C9DC5;\n};\n\ntemplate <>\nstruct FnvTraits<uint64_t> {\n  static const uint64_t kFnvPrime = 0x00000100000001b3ULL;\n  static const uint64_t kOffsetBasis = 0xcbf29ce484222645ULL;\n};\n\ntemplate <typename T>\nT HashFnv1(const char* input) {\n  T hash = FnvTraits<T>::kOffsetBasis;\n  for (const char* c = input; *c; ++c) {\n    hash *= FnvTraits<T>::kFnvPrime;\n    hash ^= static_cast<unsigned char>(*c);\n  }\n  return hash;\n}\n\ntemplate <typename T>\nT HashFnv1a(const char* input) {\n  T hash = FnvTraits<T>::kOffsetBasis;\n  for (const char* c = input; *c; ++c) {\n    hash ^= static_cast<unsigned char>(*c);\n    hash *= FnvTraits<T>::kFnvPrime;\n  }\n  return hash;\n}\n\ntemplate <>\ninline uint16_t HashFnv1<uint16_t>(const char* input) {\n  uint32_t hash = HashFnv1<uint32_t>(input);\n  return (hash >> 16) ^ (hash & 0xffff);\n}\n\ntemplate <>\ninline uint16_t HashFnv1a<uint16_t>(const char* input) {\n  uint32_t hash = HashFnv1a<uint32_t>(input);\n  return (hash >> 16) ^ (hash & 0xffff);\n}\n\ntemplate <typename T>\nstruct NamedHashFunction {\n  const char* name;\n\n  typedef T (*HashFunction)(const char*);\n  HashFunction function;\n};\n\nconst NamedHashFunction<uint16_t> kHashFunctions16[] = {\n    {\"fnv1_16\", HashFnv1<uint16_t>},\n    {\"fnv1a_16\", HashFnv1a<uint16_t>},\n};\n\nconst NamedHashFunction<uint32_t> kHashFunctions32[] = {\n    {\"fnv1_32\", HashFnv1<uint32_t>},\n    {\"fnv1a_32\", HashFnv1a<uint32_t>},\n};\n\nconst NamedHashFunction<uint64_t> kHashFunctions64[] = {\n    {\"fnv1_64\", HashFnv1<uint64_t>},\n    {\"fnv1a_64\", HashFnv1a<uint64_t>},\n};\n\ninline NamedHashFunction<uint16_t>::HashFunction FindHashFunction16(\n    const char* name) {\n  std::size_t size = sizeof(kHashFunctions16) / sizeof(kHashFunctions16[0]);\n  for (std::size_t i = 0; i < size; ++i) {\n    if (std::strcmp(name, kHashFunctions16[i].name) == 0) {\n      return kHashFunctions16[i].function;\n    }\n  }\n  return nullptr;\n}\n\ninline NamedHashFunction<uint32_t>::HashFunction FindHashFunction32(\n    const char* name) {\n  std::size_t size = sizeof(kHashFunctions32) / sizeof(kHashFunctions32[0]);\n  for (std::size_t i = 0; i < size; ++i) {\n    if (std::strcmp(name, kHashFunctions32[i].name) == 0) {\n      return kHashFunctions32[i].function;\n    }\n  }\n  return nullptr;\n}\n\ninline NamedHashFunction<uint64_t>::HashFunction FindHashFunction64(\n    const char* name) {\n  std::size_t size = sizeof(kHashFunctions64) / sizeof(kHashFunctions64[0]);\n  for (std::size_t i = 0; i < size; ++i) {\n    if (std::strcmp(name, kHashFunctions64[i].name) == 0) {\n      return kHashFunctions64[i].function;\n    }\n  }\n  return nullptr;\n}\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_HASH_H_\n"
  },
  {
    "path": "include/flatbuffers/idl.h",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_IDL_H_\n#define FLATBUFFERS_IDL_H_\n\n#include <algorithm>\n#include <functional>\n#include <map>\n#include <memory>\n#include <stack>\n#include <vector>\n\n#include \"flatbuffers/base.h\"\n#include \"flatbuffers/file_manager.h\"\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/flexbuffers.h\"\n#include \"flatbuffers/hash.h\"\n#include \"flatbuffers/reflection.h\"\n\n// This file defines the data types representing a parsed IDL (Interface\n// Definition Language) / schema file.\n\n// Limits maximum depth of nested objects.\n// Prevents stack overflow while parse scheme, or json, or flexbuffer.\n#if !defined(FLATBUFFERS_MAX_PARSING_DEPTH)\n#define FLATBUFFERS_MAX_PARSING_DEPTH 64\n#endif\n\nnamespace flatbuffers {\n\n// The order of these matters for Is*() functions below.\n// Additionally, Parser::ParseType assumes bool..string is a contiguous range\n// of type tokens.\n// clang-format off\n#define FLATBUFFERS_GEN_TYPES_SCALAR(TD) \\\n  TD(NONE,     \"\",       uint8_t,  byte,   byte,    byte,   uint8,   u8,   UByte, UInt8, 0) \\\n  TD(UTYPE,    \"\",       uint8_t,  byte,   byte,    byte,   uint8,   u8,   UByte, UInt8, 1) /* begin scalar/int */ \\\n  TD(BOOL,     \"bool\",   uint8_t,  boolean,bool,    bool,   bool,    bool, Boolean, Bool, 2) \\\n  TD(CHAR,     \"byte\",   int8_t,   byte,   int8,    sbyte,  int8,    i8,   Byte, Int8, 3) \\\n  TD(UCHAR,    \"ubyte\",  uint8_t,  byte,   byte,    byte,   uint8,   u8,   UByte, UInt8, 4) \\\n  TD(SHORT,    \"short\",  int16_t,  short,  int16,   short,  int16,   i16,  Short, Int16, 5) \\\n  TD(USHORT,   \"ushort\", uint16_t, short,  uint16,  ushort, uint16,  u16,  UShort, UInt16, 6) \\\n  TD(INT,      \"int\",    int32_t,  int,    int32,   int,    int32,   i32,  Int, Int32, 7) \\\n  TD(UINT,     \"uint\",   uint32_t, int,    uint32,  uint,   uint32,  u32,  UInt, UInt32, 8) \\\n  TD(LONG,     \"long\",   int64_t,  long,   int64,   long,   int64,   i64,  Long, Int64, 9) \\\n  TD(ULONG,    \"ulong\",  uint64_t, long,   uint64,  ulong,  uint64,  u64,  ULong, UInt64, 10) /* end int */ \\\n  TD(FLOAT,    \"float\",  float,    float,  float32, float,  float32, f32,  Float, Float32, 11) /* begin float */ \\\n  TD(DOUBLE,   \"double\", double,   double, float64, double, float64, f64,  Double, Double, 12) /* end float/scalar */\n#define FLATBUFFERS_GEN_TYPES_POINTER(TD) \\\n  TD(STRING,   \"string\", Offset<void>,   int, int, StringOffset, int, unused, Int, Offset<String>, 13) \\\n  TD(VECTOR,   \"\",       Offset<void>,   int, int, VectorOffset, int, unused, Int, Offset<UOffset>, 14) \\\n  TD(VECTOR64, \"\",       Offset64<void>, int, int, VectorOffset, int, unused, Int, Offset<UOffset>, 18) \\\n  TD(STRUCT,   \"\",       Offset<void>,   int, int, int,          int, unused, Int, Offset<UOffset>, 15) \\\n  TD(UNION,    \"\",       Offset<void>,   int, int, int,          int, unused, Int, Offset<UOffset>, 16)\n#define FLATBUFFERS_GEN_TYPE_ARRAY(TD) \\\n  TD(ARRAY,    \"\",       int,            int, int, int,          int, unused, Int, Offset<UOffset>, 17)\n// The fields are:\n// - enum\n// - FlatBuffers schema type.\n// - C++ type.\n// - Java type.\n// - Go type.\n// - C# / .Net type.\n// - Python type.\n// - Kotlin type.\n// - Rust type.\n// - Swift type.\n// - enum value (matches the reflected values)\n\n// using these macros, we can now write code dealing with types just once, e.g.\n\n/*\nswitch (type) {\n  #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, \\\n                         RTYPE, KTYPE, STYPE, ...) \\\n    case BASE_TYPE_ ## ENUM: \\\n      // do something specific to CTYPE here\n    FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)\n  #undef FLATBUFFERS_TD\n}\n*/\n\n// If not all FLATBUFFERS_GEN_() arguments are necessary for implementation\n// of FLATBUFFERS_TD, you can use a variadic macro (with __VA_ARGS__ if needed).\n// In the above example, only CTYPE is used to generate the code, it can be rewritten:\n\n/*\nswitch (type) {\n  #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \\\n    case BASE_TYPE_ ## ENUM: \\\n      // do something specific to CTYPE here\n    FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)\n  #undef FLATBUFFERS_TD\n}\n*/\n\n#define FLATBUFFERS_GEN_TYPES(TD) \\\n        FLATBUFFERS_GEN_TYPES_SCALAR(TD) \\\n        FLATBUFFERS_GEN_TYPES_POINTER(TD) \\\n        FLATBUFFERS_GEN_TYPE_ARRAY(TD)\n\n// Create an enum for all the types above.\n#ifdef __GNUC__\n__extension__  // Stop GCC complaining about trailing comma with -Wpendantic.\n#endif\nenum BaseType {\n  #define FLATBUFFERS_TD(ENUM, IDLTYPE, \\\n              CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, RTYPE, KTYPE, STYPE, ENUM_VALUE) \\\n    BASE_TYPE_ ## ENUM = ENUM_VALUE,\n    FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)\n  #undef FLATBUFFERS_TD\n};\n\n#define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \\\n  static_assert(sizeof(CTYPE) <= sizeof(largest_scalar_t), \\\n                \"define largest_scalar_t as \" #CTYPE);\n  FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)\n#undef FLATBUFFERS_TD\n\ninline bool IsScalar (BaseType t) { return t >= BASE_TYPE_UTYPE &&\n                                           t <= BASE_TYPE_DOUBLE; }\ninline bool IsInteger(BaseType t) { return t >= BASE_TYPE_UTYPE &&\n                                           t <= BASE_TYPE_ULONG; }\ninline bool IsFloat  (BaseType t) { return t == BASE_TYPE_FLOAT ||\n                                           t == BASE_TYPE_DOUBLE; }\ninline bool IsLong   (BaseType t) { return t == BASE_TYPE_LONG ||\n                                           t == BASE_TYPE_ULONG; }\ninline bool IsBool   (BaseType t) { return t == BASE_TYPE_BOOL; }\ninline bool IsOneByte(BaseType t) { return t >= BASE_TYPE_UTYPE &&\n                                           t <= BASE_TYPE_UCHAR; }\ninline bool IsVector (BaseType t) { return t == BASE_TYPE_VECTOR ||\n                                           t == BASE_TYPE_VECTOR64; }\n\ninline bool IsUnsigned(BaseType t) {\n  return (t == BASE_TYPE_UTYPE)  || (t == BASE_TYPE_UCHAR) ||\n         (t == BASE_TYPE_USHORT) || (t == BASE_TYPE_UINT)  ||\n         (t == BASE_TYPE_ULONG);\n}\n\ninline size_t SizeOf(const BaseType t) {\n  switch (t) {\n  #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \\\n    case BASE_TYPE_##ENUM: return sizeof(CTYPE);\n      FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)\n  #undef FLATBUFFERS_TD\n    default: FLATBUFFERS_ASSERT(0);\n  }\n  return 0;\n}\n\ninline const char* TypeName(const BaseType t) {\n  switch (t) {\n  #define FLATBUFFERS_TD(ENUM, IDLTYPE, ...) \\\n    case BASE_TYPE_##ENUM: return IDLTYPE;\n      FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)\n  #undef FLATBUFFERS_TD\n    default: FLATBUFFERS_ASSERT(0);\n  }\n  return nullptr;\n}\n\ninline const char* StringOf(const BaseType t) {\n  switch (t) {\n  #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \\\n    case BASE_TYPE_##ENUM: return #CTYPE;\n      FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)\n  #undef FLATBUFFERS_TD\n    default: FLATBUFFERS_ASSERT(0);\n  }\n  return \"\";\n}\n\n// clang-format on\n\nstruct StructDef;\nstruct EnumDef;\nclass Parser;\n\n// Represents any type in the IDL, which is a combination of the BaseType\n// and additional information for vectors/structs_.\nstruct Type {\n  explicit Type(BaseType _base_type = BASE_TYPE_NONE, StructDef* _sd = nullptr,\n                EnumDef* _ed = nullptr, uint16_t _fixed_length = 0)\n      : base_type(_base_type),\n        element(BASE_TYPE_NONE),\n        struct_def(_sd),\n        enum_def(_ed),\n        fixed_length(_fixed_length) {}\n\n  bool operator==(const Type& o) const {\n    return base_type == o.base_type && element == o.element &&\n           struct_def == o.struct_def && enum_def == o.enum_def;\n  }\n\n  Type VectorType() const {\n    return Type(element, struct_def, enum_def, fixed_length);\n  }\n\n  Offset<reflection::Type> Serialize(FlatBufferBuilder* builder) const;\n\n  bool Deserialize(const Parser& parser, const reflection::Type* type);\n\n  BaseType base_type;\n  BaseType element;       // only set if t == BASE_TYPE_VECTOR or\n                          // BASE_TYPE_VECTOR64\n  StructDef* struct_def;  // only set if t or element == BASE_TYPE_STRUCT\n  EnumDef* enum_def;      // set if t == BASE_TYPE_UNION / BASE_TYPE_UTYPE,\n                          // or for an integral type derived from an enum.\n  uint16_t fixed_length;  // only set if t == BASE_TYPE_ARRAY\n};\n\n// Represents a parsed scalar value, its type, and field offset.\nstruct Value {\n  Value()\n      : constant(\"0\"),\n        offset(static_cast<voffset_t>(~(static_cast<voffset_t>(0U)))) {}\n  Type type;\n  std::string constant;\n  voffset_t offset;\n};\n\n// Helper class that retains the original order of a set of identifiers and\n// also provides quick lookup.\ntemplate <typename T>\nclass SymbolTable {\n public:\n  ~SymbolTable() {\n    for (auto it = vec.begin(); it != vec.end(); ++it) {\n      delete *it;\n    }\n  }\n\n  bool Add(const std::string& name, T* e) {\n    vec.emplace_back(e);\n    auto it = dict.find(name);\n    if (it != dict.end()) return true;\n    dict[name] = e;\n    return false;\n  }\n\n  void Move(const std::string& oldname, const std::string& newname) {\n    auto it = dict.find(oldname);\n    if (it != dict.end()) {\n      auto obj = it->second;\n      dict.erase(it);\n      dict[newname] = obj;\n    } else {\n      FLATBUFFERS_ASSERT(false);\n    }\n  }\n\n  T* Lookup(const std::string& name) const {\n    auto it = dict.find(name);\n    return it == dict.end() ? nullptr : it->second;\n  }\n\n public:\n  std::map<std::string, T*> dict;  // quick lookup\n  std::vector<T*> vec;             // Used to iterate in order of insertion\n};\n\n// A name space, as set in the schema.\nstruct Namespace {\n  Namespace() : from_table(0) {}\n\n  // Given a (potentially unqualified) name, return the \"fully qualified\" name\n  // which has a full namespaced descriptor.\n  // With max_components you can request less than the number of components\n  // the current namespace has.\n  std::string GetFullyQualifiedName(const std::string& name,\n                                    size_t max_components = 1000) const;\n\n  std::vector<std::string> components;\n  size_t from_table;  // Part of the namespace corresponds to a message/table.\n};\n\ninline bool operator<(const Namespace& a, const Namespace& b) {\n  size_t min_size = std::min(a.components.size(), b.components.size());\n  for (size_t i = 0; i < min_size; ++i) {\n    if (a.components[i] != b.components[i])\n      return a.components[i] < b.components[i];\n  }\n  return a.components.size() < b.components.size();\n}\n\n// Base class for all definition types (fields, structs_, enums_).\nstruct Definition {\n  Definition()\n      : generated(false),\n        defined_namespace(nullptr),\n        serialized_location(0),\n        index(-1),\n        refcount(1),\n        declaration_file(nullptr) {}\n\n  flatbuffers::Offset<\n      flatbuffers::Vector<flatbuffers::Offset<reflection::KeyValue>>>\n  SerializeAttributes(FlatBufferBuilder* builder, const Parser& parser) const;\n\n  bool DeserializeAttributes(Parser& parser,\n                             const Vector<Offset<reflection::KeyValue>>* attrs);\n\n  std::string name;\n  std::string file;\n  std::vector<std::string> doc_comment;\n  SymbolTable<Value> attributes;\n  bool generated;  // did we already output code for this definition?\n  Namespace* defined_namespace;  // Where it was defined.\n\n  // For use with Serialize()\n  uoffset_t serialized_location;\n  int index;  // Inside the vector it is stored.\n  int refcount;\n  const std::string* declaration_file;\n};\n\nstruct FieldDef : public Definition {\n  FieldDef()\n      : deprecated(false),\n        key(false),\n        shared(false),\n        native_inline(false),\n        flexbuffer(false),\n        offset64(false),\n        presence(kDefault),\n        nested_flatbuffer(nullptr),\n        padding(0),\n        sibling_union_field(nullptr) {}\n\n  Offset<reflection::Field> Serialize(FlatBufferBuilder* builder, uint16_t id,\n                                      const Parser& parser) const;\n\n  bool Deserialize(Parser& parser, const reflection::Field* field);\n\n  bool IsScalarOptional() const { return IsScalar() && IsOptional(); }\n  bool IsScalar() const {\n    return ::flatbuffers::IsScalar(value.type.base_type);\n  }\n  bool IsOptional() const { return presence == kOptional; }\n  bool IsRequired() const { return presence == kRequired; }\n  bool IsDefault() const { return presence == kDefault; }\n\n  Value value;\n  bool deprecated;  // Field is allowed to be present in old data, but can't be.\n                    // written in new data nor accessed in new code.\n  bool key;         // Field functions as a key for creating sorted vectors.\n  bool shared;  // Field will be using string pooling (i.e. CreateSharedString)\n                // as default serialization behavior if field is a string.\n  bool native_inline;  // Field will be defined inline (instead of as a pointer)\n                       // for native tables if field is a struct.\n  bool flexbuffer;     // This field contains FlexBuffer data.\n  bool offset64;       // If the field uses 64-bit offsets.\n\n  enum Presence {\n    // Field must always be present.\n    kRequired,\n    // Non-presence should be signalled to and controlled by users.\n    kOptional,\n    // Non-presence is hidden from users.\n    // Implementations may omit writing default values.\n    kDefault,\n  };\n  Presence static MakeFieldPresence(bool optional, bool required) {\n    FLATBUFFERS_ASSERT(!(required && optional));\n    // clang-format off\n    return required ? FieldDef::kRequired\n         : optional ? FieldDef::kOptional\n                    : FieldDef::kDefault;\n    // clang-format on\n  }\n  Presence presence;\n\n  StructDef* nested_flatbuffer;  // This field contains nested FlatBuffer data.\n  size_t padding;                // Bytes to always pad after this field.\n\n  // sibling_union_field is always set to nullptr. The only exception is\n  // when FieldDef is a union field or an union type field. Therefore,\n  // sibling_union_field on a union field points to the union type field\n  // and vice-versa.\n  FieldDef* sibling_union_field;\n};\n\nstruct StructDef : public Definition {\n  enum class CycleStatus {\n    NotChecked,\n    InProgress,\n    Checked,\n  };\n\n  StructDef()\n      : fixed(false),\n        predecl(true),\n        sortbysize(true),\n        has_key(false),\n        minalign(1),\n        bytesize(0),\n        cycle_status{CycleStatus::NotChecked} {}\n\n  void PadLastField(size_t min_align) {\n    auto padding = PaddingBytes(bytesize, min_align);\n    bytesize += padding;\n    if (fields.vec.size()) fields.vec.back()->padding = padding;\n  }\n\n  Offset<reflection::Object> Serialize(FlatBufferBuilder* builder,\n                                       const Parser& parser) const;\n\n  bool Deserialize(Parser& parser, const reflection::Object* object);\n\n  SymbolTable<FieldDef> fields;\n\n  bool fixed;       // If it's struct, not a table.\n  bool predecl;     // If it's used before it was defined.\n  bool sortbysize;  // Whether fields come in the declaration or size order.\n  bool has_key;     // It has a key field.\n  size_t minalign;  // What the whole object needs to be aligned to.\n  size_t bytesize;  // Size if fixed.\n\n  CycleStatus cycle_status;  // used for determining if we have circular references\n\n  flatbuffers::unique_ptr<std::string> original_location;\n  std::vector<voffset_t> reserved_ids;\n};\n\nstruct EnumDef;\nstruct EnumValBuilder;\n\nstruct EnumVal {\n  Offset<reflection::EnumVal> Serialize(FlatBufferBuilder* builder,\n                                        const Parser& parser) const;\n\n  bool Deserialize(Parser& parser, const reflection::EnumVal* val);\n\n  flatbuffers::Offset<\n      flatbuffers::Vector<flatbuffers::Offset<reflection::KeyValue>>>\n  SerializeAttributes(FlatBufferBuilder* builder, const Parser& parser) const;\n\n  bool DeserializeAttributes(Parser& parser,\n                             const Vector<Offset<reflection::KeyValue>>* attrs);\n\n  uint64_t GetAsUInt64() const { return static_cast<uint64_t>(value); }\n  int64_t GetAsInt64() const { return value; }\n  bool IsZero() const { return 0 == value; }\n  bool IsNonZero() const { return !IsZero(); }\n\n  std::string name;\n  std::vector<std::string> doc_comment;\n  Type union_type;\n  SymbolTable<Value> attributes;\n\n private:\n  friend EnumDef;\n  friend EnumValBuilder;\n  friend bool operator==(const EnumVal& lhs, const EnumVal& rhs);\n\n  EnumVal(const std::string& _name, int64_t _val) : name(_name), value(_val) {}\n  EnumVal() : value(0) {}\n\n  int64_t value;\n};\n\nstruct EnumDef : public Definition {\n  EnumDef() : is_union(false), uses_multiple_type_instances(false) {}\n\n  Offset<reflection::Enum> Serialize(FlatBufferBuilder* builder,\n                                     const Parser& parser) const;\n\n  bool Deserialize(Parser& parser, const reflection::Enum* values);\n\n  template <typename T>\n  void ChangeEnumValue(EnumVal* ev, T new_val);\n  void SortByValue();\n  void RemoveDuplicates();\n\n  std::string AllFlags() const;\n  const EnumVal* MinValue() const;\n  const EnumVal* MaxValue() const;\n  // Returns the number of integer steps from v1 to v2.\n  uint64_t Distance(const EnumVal* v1, const EnumVal* v2) const;\n  // Returns the number of integer steps from Min to Max.\n  uint64_t Distance() const { return Distance(MinValue(), MaxValue()); }\n\n  EnumVal* ReverseLookup(int64_t enum_idx,\n                         bool skip_union_default = false) const;\n  EnumVal* FindByValue(const std::string& constant) const;\n\n  std::string ToString(const EnumVal& ev) const {\n    return IsUInt64() ? NumToString(ev.GetAsUInt64())\n                      : NumToString(ev.GetAsInt64());\n  }\n\n  size_t size() const { return vals.vec.size(); }\n\n  const std::vector<EnumVal*>& Vals() const { return vals.vec; }\n\n  const EnumVal* Lookup(const std::string& enum_name) const {\n    return vals.Lookup(enum_name);\n  }\n\n  bool is_union;\n  // Type is a union which uses type aliases where at least one type is\n  // available under two different names.\n  bool uses_multiple_type_instances;\n  Type underlying_type;\n\n private:\n  bool IsUInt64() const {\n    return (BASE_TYPE_ULONG == underlying_type.base_type);\n  }\n\n  friend EnumValBuilder;\n  SymbolTable<EnumVal> vals;\n};\n\ninline bool IsString(const Type& type) {\n  return type.base_type == BASE_TYPE_STRING;\n}\n\ninline bool IsStruct(const Type& type) {\n  return type.base_type == BASE_TYPE_STRUCT && type.struct_def->fixed;\n}\n\ninline bool IsIncompleteStruct(const Type& type) {\n  return type.base_type == BASE_TYPE_STRUCT && type.struct_def->predecl;\n}\n\ninline bool IsTable(const Type& type) {\n  return type.base_type == BASE_TYPE_STRUCT && !type.struct_def->fixed;\n}\n\ninline bool IsUnion(const Type& type) {\n  return type.enum_def != nullptr && type.enum_def->is_union;\n}\n\ninline bool IsUnionType(const Type& type) {\n  return IsUnion(type) && IsInteger(type.base_type);\n}\n\ninline bool IsVector(const Type& type) { return IsVector(type.base_type); }\n\ninline bool IsVectorOfStruct(const Type& type) {\n  return IsVector(type) && IsStruct(type.VectorType());\n}\n\ninline bool IsVectorOfTable(const Type& type) {\n  return IsVector(type) && IsTable(type.VectorType());\n}\n\ninline bool IsArray(const Type& type) {\n  return type.base_type == BASE_TYPE_ARRAY;\n}\n\ninline bool IsSeries(const Type& type) {\n  return IsVector(type) || IsArray(type);\n}\n\ninline bool IsEnum(const Type& type) {\n  return type.enum_def != nullptr && IsInteger(type.base_type);\n}\n\ninline size_t InlineSize(const Type& type) {\n  return IsStruct(type)\n             ? type.struct_def->bytesize\n             : (IsArray(type)\n                    ? InlineSize(type.VectorType()) * type.fixed_length\n                    : SizeOf(type.base_type));\n}\n\ninline size_t InlineAlignment(const Type& type) {\n  if (IsStruct(type)) {\n    return type.struct_def->minalign;\n  } else if (IsArray(type)) {\n    return IsStruct(type.VectorType()) ? type.struct_def->minalign\n                                       : SizeOf(type.element);\n  } else {\n    return SizeOf(type.base_type);\n  }\n}\ninline bool operator==(const EnumVal& lhs, const EnumVal& rhs) {\n  return lhs.value == rhs.value;\n}\ninline bool operator!=(const EnumVal& lhs, const EnumVal& rhs) {\n  return !(lhs == rhs);\n}\n\ninline bool EqualByName(const Type& a, const Type& b) {\n  return a.base_type == b.base_type && a.element == b.element &&\n         (a.struct_def == b.struct_def ||\n          (a.struct_def != nullptr && b.struct_def != nullptr &&\n           a.struct_def->name == b.struct_def->name)) &&\n         (a.enum_def == b.enum_def ||\n          (a.enum_def != nullptr && b.enum_def != nullptr &&\n           a.enum_def->name == b.enum_def->name));\n}\n\nstruct RPCCall : public Definition {\n  Offset<reflection::RPCCall> Serialize(FlatBufferBuilder* builder,\n                                        const Parser& parser) const;\n\n  bool Deserialize(Parser& parser, const reflection::RPCCall* call);\n\n  StructDef *request, *response;\n};\n\nstruct ServiceDef : public Definition {\n  Offset<reflection::Service> Serialize(FlatBufferBuilder* builder,\n                                        const Parser& parser) const;\n  bool Deserialize(Parser& parser, const reflection::Service* service);\n\n  SymbolTable<RPCCall> calls;\n};\n\nstruct IncludedFile {\n  // The name of the schema file being included, as defined in the .fbs file.\n  // This includes the prefix (e.g., include \"foo/bar/baz.fbs\" would mean this\n  // value is \"foo/bar/baz.fbs\").\n  std::string schema_name;\n\n  // The filename of where the included file was found, after searching the\n  // relative paths plus any other paths included with `flatc -I ...`. Note,\n  // while this is sometimes the same as schema_name, it is not always, since it\n  // can be defined relative to where flatc was invoked.\n  std::string filename;\n};\n\n// Since IncludedFile is contained within a std::set, need to provide ordering.\ninline bool operator<(const IncludedFile& a, const IncludedFile& b) {\n  return a.filename < b.filename;\n}\n\n// Container of options that may apply to any of the source/text generators.\nstruct IDLOptions {\n  // file saver\n  // shared pointer since this object gets copied and modified.\n  FileSaver* file_saver = nullptr;\n\n  // field case style options for C++\n  enum CaseStyle { CaseStyle_Unchanged = 0, CaseStyle_Upper, CaseStyle_Lower };\n  enum class ProtoIdGapAction { NO_OP, WARNING, ERROR };\n  bool gen_jvmstatic;\n  // Use flexbuffers instead for binary and text generation\n  bool use_flexbuffers;\n  bool strict_json;\n  bool output_default_scalars_in_json;\n  int indent_step;\n  bool cpp_minify_enums;\n  bool output_enum_identifiers;\n  bool prefixed_enums;\n  bool scoped_enums;\n  bool emit_min_max_enum_values;\n  bool swift_implementation_only;\n  bool include_dependence_headers;\n  bool mutable_buffer;\n  bool one_file;\n  bool proto_mode;\n  bool proto_oneof_union;\n  bool generate_all;\n  bool skip_unexpected_fields_in_json;\n  bool generate_name_strings;\n  bool generate_object_based_api;\n  bool gen_compare;\n  bool gen_absl_hash;\n  std::string cpp_object_api_pointer_type;\n  std::string cpp_object_api_string_type;\n  bool cpp_object_api_string_flexible_constructor;\n  CaseStyle cpp_object_api_field_case_style;\n  bool cpp_direct_copy;\n  bool gen_nullable;\n  std::string java_package_prefix;\n  bool java_checkerframework;\n  bool gen_generated;\n  bool gen_json_coders;\n  std::string object_prefix;\n  std::string object_suffix;\n  bool union_value_namespacing;\n  bool allow_non_utf8;\n  bool natural_utf8;\n  std::string include_prefix;\n  bool keep_prefix;\n  bool binary_schema_comments;\n  bool binary_schema_builtins;\n  bool binary_schema_gen_embed;\n  bool binary_schema_absolute_paths;\n  std::string go_import;\n  std::string go_namespace;\n  std::string go_module_name;\n  bool protobuf_ascii_alike;\n  bool size_prefixed;\n  std::string root_type;\n  bool force_defaults;\n  bool java_primitive_has_method;\n  bool cs_gen_json_serializer;\n  std::vector<std::string> cpp_includes;\n  std::string cpp_std;\n  bool cpp_static_reflection;\n  std::string proto_namespace_suffix;\n  std::string filename_suffix;\n  std::string filename_extension;\n  bool no_warnings;\n  bool warnings_as_errors;\n  std::string project_root;\n  bool cs_global_alias;\n  bool json_nested_flatbuffers;\n  bool json_nested_flexbuffers;\n  bool json_nested_legacy_flatbuffers;\n  bool ts_no_import_ext;\n  bool no_leak_private_annotations;\n  bool require_json_eof;\n  bool keep_proto_id;\n\n  /********************************** Python **********************************/\n  bool python_no_type_prefix_suffix;\n  bool python_typing;\n  bool python_decode_obj_api_strings = false;\n\n  // The target Python version. Can be one of the following:\n  // -  \"0\"\n  // -  \"2\"\n  // -  \"3\"\n  // -  \"2.<minor>\"\n  // -  \"3.<minor>\"\n  // -  \"2.<minor>.<micro>\"\n  // -  \"3.<minor>.<micro>\"\n  //\n  // https://docs.python.org/3/faq/general.html#how-does-the-python-version-numbering-scheme-work\n  std::string python_version;\n\n  // Whether to generate numpy helpers.\n  bool python_gen_numpy;\n\n  bool ts_omit_entrypoint;\n  bool ts_undefined_for_optionals;\n  ProtoIdGapAction proto_id_gap_action;\n\n  // Possible options for the more general generator below.\n  enum Language {\n    kJava = 1 << 0,\n    kCSharp = 1 << 1,\n    kGo = 1 << 2,\n    kCpp = 1 << 3,\n    kPython = 1 << 5,\n    kPhp = 1 << 6,\n    kJson = 1 << 7,\n    kBinary = 1 << 8,\n    kTs = 1 << 9,\n    kJsonSchema = 1 << 10,\n    kDart = 1 << 11,\n    kLua = 1 << 12,\n    kLobster = 1 << 13,\n    kRust = 1 << 14,\n    kKotlin = 1 << 15,\n    kSwift = 1 << 16,\n    kNim = 1 << 17,\n    kProto = 1 << 18,\n    kKotlinKmp = 1 << 19,\n    kMAX\n  };\n\n  enum MiniReflect { kNone, kTypes, kTypesAndNames };\n\n  MiniReflect mini_reflect;\n\n  // If set, require all fields in a table to be explicitly numbered.\n  bool require_explicit_ids;\n\n  // If set, implement serde::Serialize for generated Rust types\n  bool rust_serialize;\n\n  // If set, generate rust types in individual files with a root module file.\n  bool rust_module_root_file;\n\n  // The corresponding language bit will be set if a language is included\n  // for code generation.\n  unsigned long lang_to_generate;\n\n  // If set (default behavior), empty string fields will be set to nullptr to\n  // make the flatbuffer more compact.\n  bool set_empty_strings_to_null;\n\n  // If set (default behavior), empty vector fields will be set to nullptr to\n  // make the flatbuffer more compact.\n  bool set_empty_vectors_to_null;\n\n  /*********************************** gRPC ***********************************/\n  std::string grpc_filename_suffix;\n  bool grpc_use_system_headers;\n  std::string grpc_search_path;\n  std::vector<std::string> grpc_additional_headers;\n  // Generate C++ gRPC Callback API (modern async API) service code when used\n  // together with --grpc. This is an additive, opt-in feature.\n  bool grpc_callback_api;\n\n  /******************************* Python gRPC ********************************/\n  bool grpc_python_typed_handlers;\n\n  IDLOptions()\n      : gen_jvmstatic(false),\n        use_flexbuffers(false),\n        strict_json(false),\n        output_default_scalars_in_json(false),\n        indent_step(2),\n        cpp_minify_enums(false),\n        output_enum_identifiers(true),\n        prefixed_enums(true),\n        scoped_enums(false),\n        emit_min_max_enum_values(true),\n        swift_implementation_only(false),\n        include_dependence_headers(true),\n        mutable_buffer(false),\n        one_file(false),\n        proto_mode(false),\n        proto_oneof_union(false),\n        generate_all(false),\n        skip_unexpected_fields_in_json(false),\n        generate_name_strings(false),\n        generate_object_based_api(false),\n        gen_compare(false),\n        gen_absl_hash(false),\n        cpp_object_api_pointer_type(\"std::unique_ptr\"),\n        cpp_object_api_string_flexible_constructor(false),\n        cpp_object_api_field_case_style(CaseStyle_Unchanged),\n        cpp_direct_copy(true),\n        gen_nullable(false),\n        java_checkerframework(false),\n        gen_generated(false),\n        gen_json_coders(false),\n        object_suffix(\"T\"),\n        union_value_namespacing(true),\n        allow_non_utf8(false),\n        natural_utf8(false),\n        keep_prefix(false),\n        binary_schema_comments(false),\n        binary_schema_builtins(false),\n        binary_schema_gen_embed(false),\n        binary_schema_absolute_paths(false),\n        protobuf_ascii_alike(false),\n        size_prefixed(false),\n        force_defaults(false),\n        java_primitive_has_method(false),\n        cs_gen_json_serializer(false),\n        cpp_static_reflection(false),\n        filename_suffix(\"_generated\"),\n        filename_extension(),\n        no_warnings(false),\n        warnings_as_errors(false),\n        project_root(\"\"),\n        cs_global_alias(false),\n        json_nested_flatbuffers(true),\n        json_nested_flexbuffers(true),\n        json_nested_legacy_flatbuffers(false),\n        ts_no_import_ext(false),\n        no_leak_private_annotations(false),\n        require_json_eof(true),\n        keep_proto_id(false),\n        python_no_type_prefix_suffix(false),\n        python_typing(false),\n        python_gen_numpy(true),\n        ts_omit_entrypoint(false),\n        ts_undefined_for_optionals(false),\n        proto_id_gap_action(ProtoIdGapAction::WARNING),\n        mini_reflect(IDLOptions::kNone),\n        require_explicit_ids(false),\n        rust_serialize(false),\n        rust_module_root_file(false),\n        lang_to_generate(0),\n        set_empty_strings_to_null(true),\n        set_empty_vectors_to_null(true),\n        grpc_filename_suffix(\".fb\"),\n        grpc_use_system_headers(true),\n        grpc_callback_api(false),\n        grpc_python_typed_handlers(false) {}\n};\n\n// This encapsulates where the parser is in the current source file.\nstruct ParserState {\n  ParserState()\n      : prev_cursor_(nullptr),\n        cursor_(nullptr),\n        line_start_(nullptr),\n        line_(0),\n        token_(-1),\n        attr_is_trivial_ascii_string_(true) {}\n\n protected:\n  void ResetState(const char* source) {\n    prev_cursor_ = source;\n    cursor_ = source;\n    line_ = 0;\n    MarkNewLine();\n  }\n\n  void MarkNewLine() {\n    line_start_ = cursor_;\n    line_ += 1;\n  }\n\n  int64_t CursorPosition() const {\n    FLATBUFFERS_ASSERT(cursor_ && line_start_ && cursor_ >= line_start_);\n    return static_cast<int64_t>(cursor_ - line_start_);\n  }\n\n  const char* prev_cursor_;\n  const char* cursor_;\n  const char* line_start_;\n  int line_;  // the current line being parsed\n  int token_;\n\n  // Flag: text in attribute_ is true ASCII string without escape\n  // sequences. Only printable ASCII (without [\\t\\r\\n]).\n  // Used for number-in-string (and base64 string in future).\n  bool attr_is_trivial_ascii_string_;\n  std::string attribute_;\n  std::vector<std::string> doc_comment_;\n};\n\n// A way to make error propagation less error prone by requiring values to be\n// checked.\n// Once you create a value of this type you must either:\n// - Call Check() on it.\n// - Copy or assign it to another value.\n// Failure to do so leads to an assert.\n// This guarantees that this as return value cannot be ignored.\nclass CheckedError {\n public:\n  explicit CheckedError(bool error)\n      : is_error_(error), has_been_checked_(false) {}\n\n  CheckedError& operator=(const CheckedError& other) {\n    is_error_ = other.is_error_;\n    has_been_checked_ = false;\n    other.has_been_checked_ = true;\n    return *this;\n  }\n\n  CheckedError(const CheckedError& other) {\n    *this = other;  // Use assignment operator.\n  }\n\n  ~CheckedError() { FLATBUFFERS_ASSERT(has_been_checked_); }\n\n  bool Check() {\n    has_been_checked_ = true;\n    return is_error_;\n  }\n\n private:\n  bool is_error_;\n  mutable bool has_been_checked_;\n};\n\n// Additionally, in GCC we can get these errors statically, for additional\n// assurance:\n// clang-format off\n#ifdef __GNUC__\n#define FLATBUFFERS_CHECKED_ERROR CheckedError \\\n          __attribute__((warn_unused_result))\n#else\n#define FLATBUFFERS_CHECKED_ERROR CheckedError\n#endif\n// clang-format on\n\nclass Parser : public ParserState {\n public:\n  explicit Parser(const IDLOptions& options = IDLOptions())\n      : current_namespace_(nullptr),\n        empty_namespace_(nullptr),\n        flex_builder_(256, flexbuffers::BUILDER_FLAG_SHARE_ALL),\n        root_struct_def_(nullptr),\n        opts(options),\n        uses_flexbuffers_(false),\n        has_warning_(false),\n        advanced_features_(0),\n        source_(nullptr),\n        anonymous_counter_(0),\n        parse_depth_counter_(0) {\n    if (opts.force_defaults) {\n      builder_.ForceDefaults(true);\n    }\n    // Start out with the empty namespace being current.\n    empty_namespace_ = new Namespace();\n    namespaces_.push_back(empty_namespace_);\n    current_namespace_ = empty_namespace_;\n    known_attributes_[\"deprecated\"] = true;\n    known_attributes_[\"required\"] = true;\n    known_attributes_[\"key\"] = true;\n    known_attributes_[\"shared\"] = true;\n    known_attributes_[\"hash\"] = true;\n    known_attributes_[\"id\"] = true;\n    known_attributes_[\"force_align\"] = true;\n    known_attributes_[\"bit_flags\"] = true;\n    known_attributes_[\"original_order\"] = true;\n    known_attributes_[\"nested_flatbuffer\"] = true;\n    known_attributes_[\"csharp_partial\"] = true;\n    known_attributes_[\"streaming\"] = true;\n    known_attributes_[\"idempotent\"] = true;\n    known_attributes_[\"cpp_type\"] = true;\n    known_attributes_[\"cpp_ptr_type\"] = true;\n    known_attributes_[\"cpp_ptr_type_get\"] = true;\n    known_attributes_[\"cpp_str_type\"] = true;\n    known_attributes_[\"cpp_str_flex_ctor\"] = true;\n    known_attributes_[\"native_inline\"] = true;\n    known_attributes_[\"native_custom_alloc\"] = true;\n    known_attributes_[\"native_type\"] = true;\n    known_attributes_[\"native_type_pack_name\"] = true;\n    known_attributes_[\"native_default\"] = true;\n    known_attributes_[\"flexbuffer\"] = true;\n    known_attributes_[\"private\"] = true;\n\n    // An attribute added to a field to indicate that is uses 64-bit addressing.\n    known_attributes_[\"offset64\"] = true;\n\n    // An attribute added to a vector field to indicate that it uses 64-bit\n    // addressing and it has a 64-bit length.\n    known_attributes_[\"vector64\"] = true;\n  }\n\n  // Copying is not allowed\n  Parser(const Parser&) = delete;\n  Parser& operator=(const Parser&) = delete;\n\n  Parser(Parser&&) = default;\n  Parser& operator=(Parser&&) = default;\n\n  ~Parser() {\n    for (auto it = namespaces_.begin(); it != namespaces_.end(); ++it) {\n      delete *it;\n    }\n  }\n\n  // Parse the string containing either schema or JSON data, which will\n  // populate the SymbolTable's or the FlatBufferBuilder above.\n  // include_paths is used to resolve any include statements, and typically\n  // should at least include the project path (where you loaded source_ from).\n  // include_paths must be nullptr terminated if specified.\n  // If include_paths is nullptr, it will attempt to load from the current\n  // directory.\n  // If the source was loaded from a file and isn't an include file,\n  // supply its name in source_filename.\n  // All paths specified in this call must be in posix format, if you accept\n  // paths from user input, please call PosixPath on them first.\n  bool Parse(const char* _source, const char** include_paths = nullptr,\n             const char* source_filename = nullptr);\n\n  bool ParseJson(const char* json, const char* json_filename = nullptr);\n\n  // Returns the number of characters were consumed when parsing a JSON string.\n  std::ptrdiff_t BytesConsumed() const;\n\n  // Set the root type. May override the one set in the schema.\n  bool SetRootType(const char* name);\n\n  // Mark all definitions as already having code generated.\n  void MarkGenerated();\n\n  // Get the files recursively included by the given file. The returned\n  // container will have at least the given file.\n  std::set<std::string> GetIncludedFilesRecursive(\n      const std::string& file_name) const;\n\n  // Fills builder_ with a binary version of the schema parsed.\n  // See reflection/reflection.fbs\n  void Serialize();\n\n  // Deserialize a schema buffer\n  bool Deserialize(const uint8_t* buf, const size_t size);\n\n  // Fills internal structure as if the schema passed had been loaded by parsing\n  // with Parse except that included filenames will not be populated.\n  bool Deserialize(const reflection::Schema* schema);\n\n  Type* DeserializeType(const reflection::Type* type);\n\n  // Checks that the schema represented by this parser is a safe evolution\n  // of the schema provided. Returns non-empty error on any problems.\n  std::string ConformTo(const Parser& base);\n\n  // Similar to Parse(), but now only accepts JSON to be parsed into a\n  // FlexBuffer.\n  bool ParseFlexBuffer(const char* source, const char* source_filename,\n                       flexbuffers::Builder* builder);\n\n  StructDef* LookupStruct(const std::string& id) const;\n  StructDef* LookupStructThruParentNamespaces(const std::string& id) const;\n\n  std::string UnqualifiedName(const std::string& fullQualifiedName);\n\n  FLATBUFFERS_CHECKED_ERROR Error(const std::string& msg);\n\n  // @brief Verify that any of 'opts.lang_to_generate' supports Optional scalars\n  // in a schema.\n  // @param opts Options used to parce a schema and generate code.\n  static bool SupportsOptionalScalars(const flatbuffers::IDLOptions& opts);\n\n  // Get the set of included files that are directly referenced by the file\n  // being parsed. This does not include files that are transitively included by\n  // others includes.\n  std::vector<IncludedFile> GetIncludedFiles() const;\n\n  bool HasCircularStructDependency();\n\n private:\n  class ParseDepthGuard;\n\n  void Message(const std::string& msg);\n  void Warning(const std::string& msg);\n  FLATBUFFERS_CHECKED_ERROR ParseHexNum(int nibbles, uint64_t* val);\n  FLATBUFFERS_CHECKED_ERROR Next();\n  FLATBUFFERS_CHECKED_ERROR SkipByteOrderMark();\n  bool Is(int t) const;\n  bool IsIdent(const char* id) const;\n  FLATBUFFERS_CHECKED_ERROR Expect(int t);\n  std::string TokenToStringId(int t) const;\n  EnumDef* LookupEnum(const std::string& id);\n  FLATBUFFERS_CHECKED_ERROR ParseNamespacing(std::string* id,\n                                             std::string* last);\n  FLATBUFFERS_CHECKED_ERROR ParseTypeIdent(Type& type);\n  FLATBUFFERS_CHECKED_ERROR ParseType(Type& type);\n  FLATBUFFERS_CHECKED_ERROR AddField(StructDef& struct_def,\n                                     const std::string& name, const Type& type,\n                                     FieldDef** dest);\n  FLATBUFFERS_CHECKED_ERROR ParseField(StructDef& struct_def);\n  FLATBUFFERS_CHECKED_ERROR ParseString(Value& val, bool use_string_pooling);\n  FLATBUFFERS_CHECKED_ERROR ParseComma();\n  FLATBUFFERS_CHECKED_ERROR ParseAnyValue(Value& val, FieldDef* field,\n                                          size_t parent_fieldn,\n                                          const StructDef* parent_struct_def,\n                                          size_t count,\n                                          bool inside_vector = false);\n  template <typename F>\n  FLATBUFFERS_CHECKED_ERROR ParseTableDelimiters(size_t& fieldn,\n                                                 const StructDef* struct_def,\n                                                 F body);\n  FLATBUFFERS_CHECKED_ERROR ParseTable(const StructDef& struct_def,\n                                       std::string* value, uoffset_t* ovalue);\n  void SerializeStruct(const StructDef& struct_def, const Value& val);\n  void SerializeStruct(FlatBufferBuilder& builder, const StructDef& struct_def,\n                       const Value& val);\n  template <typename F>\n  FLATBUFFERS_CHECKED_ERROR ParseVectorDelimiters(size_t& count, F body);\n  FLATBUFFERS_CHECKED_ERROR ParseVector(const Type& type, uoffset_t* ovalue,\n                                        FieldDef* field, size_t fieldn);\n  FLATBUFFERS_CHECKED_ERROR ParseArray(Value& array);\n  FLATBUFFERS_CHECKED_ERROR ParseNestedFlatbuffer(\n      Value& val, FieldDef* field, size_t fieldn,\n      const StructDef* parent_struct_def);\n  FLATBUFFERS_CHECKED_ERROR ParseMetaData(SymbolTable<Value>* attributes);\n  FLATBUFFERS_CHECKED_ERROR TryTypedValue(const std::string* name, int dtoken,\n                                          bool check, Value& e, BaseType req,\n                                          bool* destmatch);\n  FLATBUFFERS_CHECKED_ERROR ParseHash(Value& e, FieldDef* field);\n  FLATBUFFERS_CHECKED_ERROR TokenError();\n  FLATBUFFERS_CHECKED_ERROR ParseSingleValue(const std::string* name, Value& e,\n                                             bool check_now);\n  FLATBUFFERS_CHECKED_ERROR ParseFunction(const std::string* name, Value& e);\n  FLATBUFFERS_CHECKED_ERROR ParseEnumFromString(const Type& type,\n                                                std::string* result);\n  StructDef* LookupCreateStruct(const std::string& name,\n                                bool create_if_new = true,\n                                bool definition = false);\n  FLATBUFFERS_CHECKED_ERROR ParseEnum(bool is_union, EnumDef** dest,\n                                      const char* filename);\n  FLATBUFFERS_CHECKED_ERROR ParseNamespace();\n  FLATBUFFERS_CHECKED_ERROR StartStruct(const std::string& name,\n                                        StructDef** dest);\n  FLATBUFFERS_CHECKED_ERROR StartEnum(const std::string& name, bool is_union,\n                                      EnumDef** dest);\n  FLATBUFFERS_CHECKED_ERROR ParseDecl(const char* filename);\n  FLATBUFFERS_CHECKED_ERROR ParseService(const char* filename);\n  FLATBUFFERS_CHECKED_ERROR ParseProtoFields(StructDef* struct_def,\n                                             bool isextend, bool inside_oneof);\n  FLATBUFFERS_CHECKED_ERROR ParseProtoMapField(StructDef* struct_def);\n  FLATBUFFERS_CHECKED_ERROR ParseProtoOption();\n  FLATBUFFERS_CHECKED_ERROR ParseProtoKey();\n  FLATBUFFERS_CHECKED_ERROR ParseProtoDecl();\n  FLATBUFFERS_CHECKED_ERROR ParseProtoCurliesOrIdent();\n  FLATBUFFERS_CHECKED_ERROR ParseTypeFromProtoType(Type* type);\n  FLATBUFFERS_CHECKED_ERROR SkipAnyJsonValue();\n  FLATBUFFERS_CHECKED_ERROR ParseFlexBufferNumericConstant(\n      flexbuffers::Builder* builder);\n  FLATBUFFERS_CHECKED_ERROR ParseFlexBufferValue(flexbuffers::Builder* builder);\n  FLATBUFFERS_CHECKED_ERROR StartParseFile(const char* source,\n                                           const char* source_filename);\n  FLATBUFFERS_CHECKED_ERROR ParseRoot(const char* _source,\n                                      const char** include_paths,\n                                      const char* source_filename);\n  FLATBUFFERS_CHECKED_ERROR CheckPrivateLeak();\n  FLATBUFFERS_CHECKED_ERROR CheckPrivatelyLeakedFields(\n      const Definition& def, const Definition& value_type);\n  FLATBUFFERS_CHECKED_ERROR DoParse(const char* _source,\n                                    const char** include_paths,\n                                    const char* source_filename,\n                                    const char* include_filename);\n  FLATBUFFERS_CHECKED_ERROR DoParseJson();\n  FLATBUFFERS_CHECKED_ERROR CheckClash(std::vector<FieldDef*>& fields,\n                                       StructDef* struct_def,\n                                       const char* suffix, BaseType baseType);\n  FLATBUFFERS_CHECKED_ERROR ParseAlignAttribute(\n      const std::string& align_constant, size_t min_align, size_t* align);\n\n  bool SupportsAdvancedUnionFeatures() const;\n  bool SupportsAdvancedArrayFeatures() const;\n  bool SupportsOptionalScalars() const;\n  bool SupportsDefaultVectorsAndStrings() const;\n  bool Supports64BitOffsets() const;\n  bool SupportsUnionUnderlyingType() const;\n  Namespace* UniqueNamespace(Namespace* ns);\n\n  FLATBUFFERS_CHECKED_ERROR RecurseError();\n  template <typename F>\n  CheckedError Recurse(F f);\n\n  const std::string& GetPooledString(const std::string& s) const;\n\n public:\n  SymbolTable<Type> types_;\n  SymbolTable<StructDef> structs_;\n  SymbolTable<EnumDef> enums_;\n  SymbolTable<ServiceDef> services_;\n  std::vector<Namespace*> namespaces_;\n  Namespace* current_namespace_;\n  Namespace* empty_namespace_;\n  std::string error_;  // User readable error_ if Parse() == false\n\n  FlatBufferBuilder builder_;  // any data contained in the file\n  flexbuffers::Builder flex_builder_;\n  flexbuffers::Reference flex_root_;\n  StructDef* root_struct_def_;\n  std::string file_identifier_;\n  std::string file_extension_;\n\n  std::map<uint64_t, std::string> included_files_;\n  std::map<std::string, std::set<IncludedFile>> files_included_per_file_;\n  std::vector<std::string> native_included_files_;\n\n  std::map<std::string, bool> known_attributes_;\n\n  IDLOptions opts;\n  bool uses_flexbuffers_;\n  bool has_warning_;\n\n  uint64_t advanced_features_;\n\n  std::string file_being_parsed_;\n\n private:\n  const char* source_;\n\n  std::vector<std::pair<Value, FieldDef*>> field_stack_;\n\n  // TODO(cneo): Refactor parser to use string_cache more often to save\n  // on memory usage.\n  mutable std::set<std::string> string_cache_;\n\n  int anonymous_counter_;\n  int parse_depth_counter_;  // stack-overflow guard\n};\n\n// Utility functions for multiple generators:\n\n// Generate text (JSON) from a given FlatBuffer, and a given Parser\n// object that has been populated with the corresponding schema.\n// If ident_step is 0, no indentation will be generated. Additionally,\n// if it is less than 0, no linefeeds will be generated either.\n// See idl_gen_text.cpp.\n// strict_json adds \"quotes\" around field names if true.\n// These functions return nullptr on success, or an error string,\n// which may happen if the flatbuffer cannot be encoded in JSON (e.g.,\n// it contains non-UTF-8 byte arrays in String values).\nextern bool GenerateTextFromTable(const Parser& parser, const void* table,\n                                  const std::string& tablename,\n                                  std::string* text);\nextern const char* GenerateText(const Parser& parser, const void* flatbuffer,\n                                std::string* text);\nextern const char* GenerateTextFile(const Parser& parser,\n                                    const std::string& path,\n                                    const std::string& file_name);\n\nextern const char* GenTextFromTable(const Parser& parser, const void* table,\n                                    const std::string& tablename,\n                                    std::string* text);\nextern const char* GenText(const Parser& parser, const void* flatbuffer,\n                           std::string* text);\nextern const char* GenTextFile(const Parser& parser, const std::string& path,\n                               const std::string& file_name);\n\n// Generate GRPC Cpp interfaces.\n// See idl_gen_grpc.cpp.\nbool GenerateCppGRPC(const Parser& parser, const std::string& path,\n                     const std::string& file_name);\n\n// Generate GRPC Go interfaces.\n// See idl_gen_grpc.cpp.\nbool GenerateGoGRPC(const Parser& parser, const std::string& path,\n                    const std::string& file_name);\n\n// Generate GRPC Java classes.\n// See idl_gen_grpc.cpp\nbool GenerateJavaGRPC(const Parser& parser, const std::string& path,\n                      const std::string& file_name);\n\n// Generate GRPC Python interfaces.\n// See idl_gen_grpc.cpp.\nbool GeneratePythonGRPC(const Parser& parser, const std::string& path,\n                        const std::string& file_name);\n\n// Generate GRPC Swift interfaces.\n// See idl_gen_grpc.cpp.\nextern bool GenerateSwiftGRPC(const Parser& parser, const std::string& path,\n                              const std::string& file_name);\n\nextern bool GenerateTSGRPC(const Parser& parser, const std::string& path,\n                           const std::string& file_name);\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_IDL_H_\n"
  },
  {
    "path": "include/flatbuffers/minireflect.h",
    "content": "/*\n * Copyright 2017 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_MINIREFLECT_H_\n#define FLATBUFFERS_MINIREFLECT_H_\n\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/util.h\"\n\nnamespace flatbuffers {\n\n// Utilities that can be used with the \"mini reflection\" tables present\n// in generated code with --reflect-types (only types) or --reflect-names\n// (also names).\n// This allows basic reflection functionality such as pretty-printing\n// that does not require the use of the schema parser or loading of binary\n// schema files at runtime (reflection.h).\n\n// For any of the functions below that take `const TypeTable *`, you pass\n// `FooTypeTable()` if the type of the root is `Foo`.\n\n// First, a generic iterator that can be used by multiple algorithms.\n\nstruct IterationVisitor {\n  // These mark the scope of a table or struct.\n  virtual void StartSequence() {}\n  virtual void EndSequence() {}\n  // Called for each field regardless of whether it is present or not.\n  // If not present, val == nullptr. set_idx is the index of all set fields.\n  virtual void Field(size_t /*field_idx*/, size_t /*set_idx*/,\n                     ElementaryType /*type*/, bool /*is_vector*/,\n                     const TypeTable* /*type_table*/, const char* /*name*/,\n                     const uint8_t* /*val*/) {}\n  // Called for a value that is actually present, after a field, or as part\n  // of a vector.\n  virtual void UType(uint8_t, const char*) {}\n  virtual void Bool(bool) {}\n  virtual void Char(int8_t, const char*) {}\n  virtual void UChar(uint8_t, const char*) {}\n  virtual void Short(int16_t, const char*) {}\n  virtual void UShort(uint16_t, const char*) {}\n  virtual void Int(int32_t, const char*) {}\n  virtual void UInt(uint32_t, const char*) {}\n  virtual void Long(int64_t) {}\n  virtual void ULong(uint64_t) {}\n  virtual void Float(float) {}\n  virtual void Double(double) {}\n  virtual void String(const String*) {}\n  virtual void Unknown(const uint8_t*) {}  // From a future version.\n  // These mark the scope of a vector.\n  virtual void StartVector() {}\n  virtual void EndVector() {}\n  virtual void Element(size_t /*i*/, ElementaryType /*type*/,\n                       const TypeTable* /*type_table*/,\n                       const uint8_t* /*val*/) {}\n  virtual ~IterationVisitor() {}\n};\n\ninline size_t InlineSize(ElementaryType type, const TypeTable* type_table) {\n  switch (type) {\n    case ET_UTYPE:\n    case ET_BOOL:\n    case ET_CHAR:\n    case ET_UCHAR:\n      return 1;\n    case ET_SHORT:\n    case ET_USHORT:\n      return 2;\n    case ET_INT:\n    case ET_UINT:\n    case ET_FLOAT:\n    case ET_STRING:\n      return 4;\n    case ET_LONG:\n    case ET_ULONG:\n    case ET_DOUBLE:\n      return 8;\n    case ET_SEQUENCE:\n      switch (type_table->st) {\n        case ST_TABLE:\n        case ST_UNION:\n          return 4;\n        case ST_STRUCT:\n          return static_cast<size_t>(type_table->values[type_table->num_elems]);\n        default:\n          FLATBUFFERS_ASSERT(false);\n          return 1;\n      }\n    default:\n      FLATBUFFERS_ASSERT(false);\n      return 1;\n  }\n}\n\ninline int64_t LookupEnum(int64_t enum_val, const int64_t* values,\n                          size_t num_values) {\n  if (!values) return enum_val;\n  for (size_t i = 0; i < num_values; i++) {\n    if (enum_val == values[i]) return static_cast<int64_t>(i);\n  }\n  return -1;  // Unknown enum value.\n}\n\ntemplate <typename T>\nconst char* EnumName(T tval, const TypeTable* type_table) {\n  if (!type_table || !type_table->names) return nullptr;\n  auto i = LookupEnum(static_cast<int64_t>(tval), type_table->values,\n                      type_table->num_elems);\n  if (i >= 0 && i < static_cast<int64_t>(type_table->num_elems)) {\n    return type_table->names[i];\n  }\n  return nullptr;\n}\n\nvoid IterateObject(const uint8_t* obj, const TypeTable* type_table,\n                   IterationVisitor* visitor);\n\ninline void IterateValue(ElementaryType type, const uint8_t* val,\n                         const TypeTable* type_table, const uint8_t* prev_val,\n                         soffset_t vector_index, IterationVisitor* visitor) {\n  switch (type) {\n    case ET_UTYPE: {\n      auto tval = ReadScalar<uint8_t>(val);\n      visitor->UType(tval, EnumName(tval, type_table));\n      break;\n    }\n    case ET_BOOL: {\n      visitor->Bool(ReadScalar<uint8_t>(val) != 0);\n      break;\n    }\n    case ET_CHAR: {\n      auto tval = ReadScalar<int8_t>(val);\n      visitor->Char(tval, EnumName(tval, type_table));\n      break;\n    }\n    case ET_UCHAR: {\n      auto tval = ReadScalar<uint8_t>(val);\n      visitor->UChar(tval, EnumName(tval, type_table));\n      break;\n    }\n    case ET_SHORT: {\n      auto tval = ReadScalar<int16_t>(val);\n      visitor->Short(tval, EnumName(tval, type_table));\n      break;\n    }\n    case ET_USHORT: {\n      auto tval = ReadScalar<uint16_t>(val);\n      visitor->UShort(tval, EnumName(tval, type_table));\n      break;\n    }\n    case ET_INT: {\n      auto tval = ReadScalar<int32_t>(val);\n      visitor->Int(tval, EnumName(tval, type_table));\n      break;\n    }\n    case ET_UINT: {\n      auto tval = ReadScalar<uint32_t>(val);\n      visitor->UInt(tval, EnumName(tval, type_table));\n      break;\n    }\n    case ET_LONG: {\n      visitor->Long(ReadScalar<int64_t>(val));\n      break;\n    }\n    case ET_ULONG: {\n      visitor->ULong(ReadScalar<uint64_t>(val));\n      break;\n    }\n    case ET_FLOAT: {\n      visitor->Float(ReadScalar<float>(val));\n      break;\n    }\n    case ET_DOUBLE: {\n      visitor->Double(ReadScalar<double>(val));\n      break;\n    }\n    case ET_STRING: {\n      val += ReadScalar<uoffset_t>(val);\n      visitor->String(reinterpret_cast<const String*>(val));\n      break;\n    }\n    case ET_SEQUENCE: {\n      switch (type_table->st) {\n        case ST_TABLE:\n          val += ReadScalar<uoffset_t>(val);\n          IterateObject(val, type_table, visitor);\n          break;\n        case ST_STRUCT:\n          IterateObject(val, type_table, visitor);\n          break;\n        case ST_UNION: {\n          val += ReadScalar<uoffset_t>(val);\n          FLATBUFFERS_ASSERT(prev_val);\n          auto union_type = *prev_val;  // Always a uint8_t.\n          if (vector_index >= 0) {\n            auto type_vec = reinterpret_cast<const Vector<uint8_t>*>(prev_val);\n            union_type = type_vec->Get(static_cast<uoffset_t>(vector_index));\n          }\n          auto type_code_idx =\n              LookupEnum(union_type, type_table->values, type_table->num_elems);\n          if (type_code_idx >= 0 &&\n              type_code_idx < static_cast<int32_t>(type_table->num_elems)) {\n            auto type_code = type_table->type_codes[type_code_idx];\n            switch (type_code.base_type) {\n              case ET_SEQUENCE: {\n                auto ref = type_table->type_refs[type_code.sequence_ref]();\n                IterateObject(val, ref, visitor);\n                break;\n              }\n              case ET_STRING:\n                visitor->String(reinterpret_cast<const String*>(val));\n                break;\n              default:\n                visitor->Unknown(val);\n            }\n          } else {\n            visitor->Unknown(val);\n          }\n          break;\n        }\n        case ST_ENUM:\n          FLATBUFFERS_ASSERT(false);\n          break;\n      }\n      break;\n    }\n    default: {\n      visitor->Unknown(val);\n      break;\n    }\n  }\n}\n\ninline void IterateObject(const uint8_t* obj, const TypeTable* type_table,\n                          IterationVisitor* visitor) {\n  visitor->StartSequence();\n  const uint8_t* prev_val = nullptr;\n  size_t set_idx = 0;\n  size_t array_idx = 0;\n  for (size_t i = 0; i < type_table->num_elems; i++) {\n    auto type_code = type_table->type_codes[i];\n    auto type = static_cast<ElementaryType>(type_code.base_type);\n    auto is_repeating = type_code.is_repeating != 0;\n    auto ref_idx = type_code.sequence_ref;\n    const TypeTable* ref = nullptr;\n    if (ref_idx >= 0) {\n      ref = type_table->type_refs[ref_idx]();\n    }\n    auto name = type_table->names ? type_table->names[i] : nullptr;\n    const uint8_t* val = nullptr;\n    if (type_table->st == ST_TABLE) {\n      val = reinterpret_cast<const Table*>(obj)->GetAddressOf(\n          FieldIndexToOffset(static_cast<voffset_t>(i)));\n    } else {\n      val = obj + type_table->values[i];\n    }\n    visitor->Field(i, set_idx, type, is_repeating, ref, name, val);\n    if (val) {\n      set_idx++;\n      if (is_repeating) {\n        auto elem_ptr = val;\n        size_t size = 0;\n        if (type_table->st == ST_TABLE) {\n          // variable length vector\n          val += ReadScalar<uoffset_t>(val);\n          auto vec = reinterpret_cast<const Vector<uint8_t>*>(val);\n          elem_ptr = vec->Data();\n          size = vec->size();\n        } else {\n          // otherwise fixed size array\n          size = type_table->array_sizes[array_idx];\n          ++array_idx;\n        }\n        visitor->StartVector();\n        for (size_t j = 0; j < size; j++) {\n          visitor->Element(j, type, ref, elem_ptr);\n          IterateValue(type, elem_ptr, ref, prev_val, static_cast<soffset_t>(j),\n                       visitor);\n          elem_ptr += InlineSize(type, ref);\n        }\n        visitor->EndVector();\n      } else {\n        IterateValue(type, val, ref, prev_val, -1, visitor);\n      }\n    }\n    prev_val = val;\n  }\n  visitor->EndSequence();\n}\n\ninline void IterateFlatBuffer(const uint8_t* buffer,\n                              const TypeTable* type_table,\n                              IterationVisitor* callback) {\n  IterateObject(GetRoot<uint8_t>(buffer), type_table, callback);\n}\n\n// Outputting a Flatbuffer to a string. Tries to conform as close to JSON /\n// the output generated by idl_gen_text.cpp.\n\nstruct ToStringVisitor : public IterationVisitor {\n  std::string s;\n  std::string d;\n  bool q;\n  std::string in;\n  size_t indent_level;\n  bool vector_delimited;\n  ToStringVisitor(std::string delimiter, bool quotes, std::string indent,\n                  bool vdelimited = true)\n      : d(delimiter),\n        q(quotes),\n        in(indent),\n        indent_level(0),\n        vector_delimited(vdelimited) {}\n  ToStringVisitor(std::string delimiter)\n      : d(delimiter),\n        q(false),\n        in(\"\"),\n        indent_level(0),\n        vector_delimited(true) {}\n\n  void append_indent() {\n    for (size_t i = 0; i < indent_level; i++) {\n      s += in;\n    }\n  }\n\n  void StartSequence() {\n    s += \"{\";\n    s += d;\n    indent_level++;\n  }\n  void EndSequence() {\n    s += d;\n    indent_level--;\n    append_indent();\n    s += \"}\";\n  }\n  void Field(size_t /*field_idx*/, size_t set_idx, ElementaryType /*type*/,\n             bool /*is_vector*/, const TypeTable* /*type_table*/,\n             const char* name, const uint8_t* val) {\n    if (!val) return;\n    if (set_idx) {\n      s += \",\";\n      s += d;\n    }\n    append_indent();\n    if (name) {\n      if (q) s += \"\\\"\";\n      s += name;\n      if (q) s += \"\\\"\";\n      s += \": \";\n    }\n  }\n  template <typename T>\n  void Named(T x, const char* name) {\n    if (name) {\n      if (q) s += \"\\\"\";\n      s += name;\n      if (q) s += \"\\\"\";\n    } else {\n      s += NumToString(x);\n    }\n  }\n  void UType(uint8_t x, const char* name) { Named(x, name); }\n  void Bool(bool x) { s += x ? \"true\" : \"false\"; }\n  void Char(int8_t x, const char* name) { Named(x, name); }\n  void UChar(uint8_t x, const char* name) { Named(x, name); }\n  void Short(int16_t x, const char* name) { Named(x, name); }\n  void UShort(uint16_t x, const char* name) { Named(x, name); }\n  void Int(int32_t x, const char* name) { Named(x, name); }\n  void UInt(uint32_t x, const char* name) { Named(x, name); }\n  void Long(int64_t x) { s += NumToString(x); }\n  void ULong(uint64_t x) { s += NumToString(x); }\n  void Float(float x) { s += NumToString(x); }\n  void Double(double x) { s += NumToString(x); }\n  void String(const struct String* str) {\n    EscapeString(str->c_str(), str->size(), &s, true, false);\n  }\n  void Unknown(const uint8_t*) { s += \"(?)\"; }\n  void StartVector() {\n    s += \"[\";\n    if (vector_delimited) {\n      s += d;\n      indent_level++;\n      append_indent();\n    } else {\n      s += \" \";\n    }\n  }\n  void EndVector() {\n    if (vector_delimited) {\n      s += d;\n      indent_level--;\n      append_indent();\n    } else {\n      s += \" \";\n    }\n    s += \"]\";\n  }\n  void Element(size_t i, ElementaryType /*type*/,\n               const TypeTable* /*type_table*/, const uint8_t* /*val*/) {\n    if (i) {\n      s += \",\";\n      if (vector_delimited) {\n        s += d;\n        append_indent();\n      } else {\n        s += \" \";\n      }\n    }\n  }\n};\n\ninline std::string FlatBufferToString(const uint8_t* buffer,\n                                      const TypeTable* type_table,\n                                      bool multi_line = false,\n                                      bool vector_delimited = true,\n                                      const std::string& indent = \"\",\n                                      bool quotes = false) {\n  ToStringVisitor tostring_visitor(multi_line ? \"\\n\" : \" \", quotes, indent,\n                                   vector_delimited);\n  IterateFlatBuffer(buffer, type_table, &tostring_visitor);\n  return tostring_visitor.s;\n}\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_MINIREFLECT_H_\n"
  },
  {
    "path": "include/flatbuffers/pch/flatc_pch.h",
    "content": "/*\n * Copyright 2017 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_FLATC_PCH_H_\n#define FLATBUFFERS_FLATC_PCH_H_\n\n// stl\n#include <cassert>\n#include <cmath>\n#include <functional>\n#include <iostream>\n#include <iterator>\n#include <set>\n#include <sstream>\n#include <tuple>\n#include <unordered_map>\n#include <unordered_set>\n\n// flatbuffers\n#include \"flatbuffers/code_generators.h\"\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/flexbuffers.h\"\n#include \"flatbuffers/idl.h\"\n#include \"flatbuffers/pch/pch.h\"\n\n#endif  // FLATBUFFERS_FLATC_PCH_H_\n"
  },
  {
    "path": "include/flatbuffers/pch/pch.h",
    "content": "/*\n * Copyright 2017 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_PCH_H_\n#define FLATBUFFERS_PCH_H_\n\n// stl\n#include <algorithm>\n#include <cstdint>\n#include <cstring>\n#include <iomanip>\n#include <limits>\n#include <list>\n#include <map>\n#include <memory>\n#include <stack>\n#include <string>\n#include <type_traits>\n#include <utility>\n#include <vector>\n\n// flatbuffers\n#include \"flatbuffers/util.h\"\n\n#endif  // FLATBUFFERS_PCH_H_\n"
  },
  {
    "path": "include/flatbuffers/reflection.h",
    "content": "/*\n * Copyright 2015 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_REFLECTION_H_\n#define FLATBUFFERS_REFLECTION_H_\n\n// This is somewhat of a circular dependency because flatc (and thus this\n// file) is needed to generate this header in the first place.\n// Should normally not be a problem since it can be generated by the\n// previous version of flatc whenever this code needs to change.\n// See scripts/generate_code.py for generation.\n#include \"flatbuffers/reflection_generated.h\"\n\n// Helper functionality for reflection.\n\nnamespace flatbuffers {\n\n// ------------------------- GETTERS -------------------------\n\nconstexpr bool IsScalar(reflection::BaseType t) {\n  return t >= reflection::UType && t <= reflection::Double;\n}\nconstexpr bool IsInteger(reflection::BaseType t) {\n  return t >= reflection::UType && t <= reflection::ULong;\n}\nconstexpr bool IsFloat(reflection::BaseType t) {\n  return t == reflection::Float || t == reflection::Double;\n}\nconstexpr bool IsLong(reflection::BaseType t) {\n  return t == reflection::Long || t == reflection::ULong;\n}\n\n// This needs to correspond to the BaseType enum.\nconstexpr size_t kBaseTypeSize[] = {\n    0,  // None\n    1,  // UType\n    1,  // Bool\n    1,  // Byte\n    1,  // UByte\n    2,  // Short\n    2,  // UShort\n    4,  // Int\n    4,  // UInt\n    8,  // Long\n    8,  // ULong\n    4,  // Float\n    8,  // Double\n    4,  // String\n    4,  // Vector\n    4,  // Obj\n    4,  // Union\n    0,  // Array. Only used in structs. 0 was chosen to prevent out-of-bounds\n        // errors.\n    8,  // Vector64\n\n    0  // MaxBaseType. This must be kept the last entry in this array.\n};\nstatic_assert(sizeof(kBaseTypeSize) / sizeof(size_t) ==\n                  reflection::MaxBaseType + 1,\n              \"Size of sizes[] array does not match the count of BaseType \"\n              \"enum values.\");\n\n// Size of a basic type, don't use with structs.\nconstexpr size_t GetTypeSize(reflection::BaseType base_type) {\n  return kBaseTypeSize[base_type];\n}\n\n// Same as above, but now correctly returns the size of a struct if\n// the field (or vector element) is a struct.\ninline size_t GetTypeSizeInline(reflection::BaseType base_type, int type_index,\n                                const reflection::Schema& schema) {\n  if (base_type == reflection::Obj &&\n      schema.objects()->Get(type_index)->is_struct()) {\n    return schema.objects()->Get(type_index)->bytesize();\n  } else {\n    return GetTypeSize(base_type);\n  }\n}\n\n// Get the root, regardless of what type it is.\ninline Table* GetAnyRoot(uint8_t* const flatbuf) {\n  return GetMutableRoot<Table>(flatbuf);\n}\n\ninline const Table* GetAnyRoot(const uint8_t* const flatbuf) {\n  return GetRoot<Table>(flatbuf);\n}\n\ninline Table* GetAnySizePrefixedRoot(uint8_t* const flatbuf) {\n  return GetMutableSizePrefixedRoot<Table>(flatbuf);\n}\n\ninline const Table* GetAnySizePrefixedRoot(const uint8_t* const flatbuf) {\n  return GetSizePrefixedRoot<Table>(flatbuf);\n}\n\n// Get a field's default, if you know it's an integer, and its exact type.\ntemplate <typename T>\nT GetFieldDefaultI(const reflection::Field& field) {\n  FLATBUFFERS_ASSERT(sizeof(T) == GetTypeSize(field.type()->base_type()));\n  return static_cast<T>(field.default_integer());\n}\n\n// Get a field's default, if you know it's floating point and its exact type.\ntemplate <typename T>\nT GetFieldDefaultF(const reflection::Field& field) {\n  FLATBUFFERS_ASSERT(sizeof(T) == GetTypeSize(field.type()->base_type()));\n  return static_cast<T>(field.default_real());\n}\n\n// Get a field, if you know it's an integer, and its exact type.\ntemplate <typename T>\nT GetFieldI(const Table& table, const reflection::Field& field) {\n  FLATBUFFERS_ASSERT(sizeof(T) == GetTypeSize(field.type()->base_type()));\n  return table.GetField<T>(field.offset(),\n                           static_cast<T>(field.default_integer()));\n}\n\n// Get a field, if you know it's floating point and its exact type.\ntemplate <typename T>\nT GetFieldF(const Table& table, const reflection::Field& field) {\n  FLATBUFFERS_ASSERT(sizeof(T) == GetTypeSize(field.type()->base_type()));\n  return table.GetField<T>(field.offset(),\n                           static_cast<T>(field.default_real()));\n}\n\n// Get a field, if you know it's a string.\ninline const String* GetFieldS(const Table& table,\n                               const reflection::Field& field) {\n  FLATBUFFERS_ASSERT(field.type()->base_type() == reflection::String);\n  return table.GetPointer<const String*>(field.offset());\n}\n\n// Get a field, if you know it's a vector.\ntemplate <typename T>\nVector<T>* GetFieldV(const Table& table, const reflection::Field& field) {\n  FLATBUFFERS_ASSERT(field.type()->base_type() == reflection::Vector &&\n                     sizeof(T) == GetTypeSize(field.type()->element()));\n  return table.GetPointer<Vector<T>*>(field.offset());\n}\n\n// Get a field, if you know it's a vector, generically.\n// To actually access elements, use the return value together with\n// field.type()->element() in any of GetAnyVectorElemI below etc.\ninline VectorOfAny* GetFieldAnyV(const Table& table,\n                                 const reflection::Field& field) {\n  return table.GetPointer<VectorOfAny*>(field.offset());\n}\n\n// Get a field, if you know it's a table.\ninline Table* GetFieldT(const Table& table, const reflection::Field& field) {\n  FLATBUFFERS_ASSERT(field.type()->base_type() == reflection::Obj ||\n                     field.type()->base_type() == reflection::Union);\n  return table.GetPointer<Table*>(field.offset());\n}\n\n// Get a field, if you know it's a struct.\ninline const Struct* GetFieldStruct(const Table& table,\n                                    const reflection::Field& field) {\n  // TODO: This does NOT check if the field is a table or struct, but we'd need\n  // access to the schema to check the is_struct flag.\n  FLATBUFFERS_ASSERT(field.type()->base_type() == reflection::Obj);\n  return table.GetStruct<const Struct*>(field.offset());\n}\n\n// Get a structure's field, if you know it's a struct.\ninline const Struct* GetFieldStruct(const Struct& structure,\n                                    const reflection::Field& field) {\n  FLATBUFFERS_ASSERT(field.type()->base_type() == reflection::Obj);\n  return structure.GetStruct<const Struct*>(field.offset());\n}\n\n// Raw helper functions used below: get any value in memory as a 64bit int, a\n// double or a string.\n// All scalars get static_cast to an int64_t, strings use strtoull, every other\n// data type returns 0.\nint64_t GetAnyValueI(reflection::BaseType type, const uint8_t* data);\n// All scalars static cast to double, strings use strtod, every other data\n// type is 0.0.\ndouble GetAnyValueF(reflection::BaseType type, const uint8_t* data);\n// All scalars converted using stringstream, strings as-is, and all other\n// data types provide some level of debug-pretty-printing.\nstd::string GetAnyValueS(reflection::BaseType type, const uint8_t* data,\n                         const reflection::Schema* schema, int type_index);\n\n// Get any table field as a 64bit int, regardless of what type it is.\ninline int64_t GetAnyFieldI(const Table& table,\n                            const reflection::Field& field) {\n  auto field_ptr = table.GetAddressOf(field.offset());\n  return field_ptr ? GetAnyValueI(field.type()->base_type(), field_ptr)\n                   : field.default_integer();\n}\n\n// Get any table field as a double, regardless of what type it is.\ninline double GetAnyFieldF(const Table& table, const reflection::Field& field) {\n  auto field_ptr = table.GetAddressOf(field.offset());\n  return field_ptr ? GetAnyValueF(field.type()->base_type(), field_ptr)\n                   : field.default_real();\n}\n\n// Get any table field as a string, regardless of what type it is.\n// You may pass nullptr for the schema if you don't care to have fields that\n// are of table type pretty-printed.\ninline std::string GetAnyFieldS(const Table& table,\n                                const reflection::Field& field,\n                                const reflection::Schema* schema) {\n  auto field_ptr = table.GetAddressOf(field.offset());\n  return field_ptr ? GetAnyValueS(field.type()->base_type(), field_ptr, schema,\n                                  field.type()->index())\n                   : \"\";\n}\n\n// Get any struct field as a 64bit int, regardless of what type it is.\ninline int64_t GetAnyFieldI(const Struct& st, const reflection::Field& field) {\n  return GetAnyValueI(field.type()->base_type(),\n                      st.GetAddressOf(field.offset()));\n}\n\n// Get any struct field as a double, regardless of what type it is.\ninline double GetAnyFieldF(const Struct& st, const reflection::Field& field) {\n  return GetAnyValueF(field.type()->base_type(),\n                      st.GetAddressOf(field.offset()));\n}\n\n// Get any struct field as a string, regardless of what type it is.\ninline std::string GetAnyFieldS(const Struct& st,\n                                const reflection::Field& field) {\n  return GetAnyValueS(field.type()->base_type(),\n                      st.GetAddressOf(field.offset()), nullptr, -1);\n}\n\n// Get any vector element as a 64bit int, regardless of what type it is.\ninline int64_t GetAnyVectorElemI(const VectorOfAny* vec,\n                                 reflection::BaseType elem_type, size_t i) {\n  return GetAnyValueI(elem_type, vec->Data() + GetTypeSize(elem_type) * i);\n}\n\n// Get any vector element as a double, regardless of what type it is.\ninline double GetAnyVectorElemF(const VectorOfAny* vec,\n                                reflection::BaseType elem_type, size_t i) {\n  return GetAnyValueF(elem_type, vec->Data() + GetTypeSize(elem_type) * i);\n}\n\n// Get any vector element as a string, regardless of what type it is.\ninline std::string GetAnyVectorElemS(const VectorOfAny* vec,\n                                     reflection::BaseType elem_type, size_t i) {\n  return GetAnyValueS(elem_type, vec->Data() + GetTypeSize(elem_type) * i,\n                      nullptr, -1);\n}\n\n// Get a vector element that's a table/string/vector from a generic vector.\n// Pass Table/String/VectorOfAny as template parameter.\n// Warning: does no typechecking.\ntemplate <typename T>\nT* GetAnyVectorElemPointer(const VectorOfAny* vec, size_t i) {\n  auto elem_ptr = vec->Data() + sizeof(uoffset_t) * i;\n  return reinterpret_cast<T*>(elem_ptr + ReadScalar<uoffset_t>(elem_ptr));\n}\n\n// Get the inline-address of a vector element. Useful for Structs (pass Struct\n// as template arg), or being able to address a range of scalars in-line.\n// Get elem_size from GetTypeSizeInline().\n// Note: little-endian data on all platforms, use EndianScalar() instead of\n// raw pointer access with scalars).\ntemplate <typename T>\nT* GetAnyVectorElemAddressOf(const VectorOfAny* vec, size_t i,\n                             size_t elem_size) {\n  return reinterpret_cast<T*>(vec->Data() + elem_size * i);\n}\n\n// Similarly, for elements of tables.\ntemplate <typename T>\nT* GetAnyFieldAddressOf(const Table& table, const reflection::Field& field) {\n  return reinterpret_cast<T*>(table.GetAddressOf(field.offset()));\n}\n\n// Similarly, for elements of structs.\ntemplate <typename T>\nT* GetAnyFieldAddressOf(const Struct& st, const reflection::Field& field) {\n  return reinterpret_cast<T*>(st.GetAddressOf(field.offset()));\n}\n\n// Loop over all the fields of the provided `object` and call `func` on each one\n// in increasing order by their field->id(). If `reverse` is true, `func` is\n// called in descending order\nvoid ForAllFields(const reflection::Object* object, bool reverse,\n                  std::function<void(const reflection::Field*)> func);\n\n// ------------------------- SETTERS -------------------------\n\n// Set any scalar field, if you know its exact type.\ntemplate <typename T>\nbool SetField(Table* table, const reflection::Field& field, T val) {\n  reflection::BaseType type = field.type()->base_type();\n  if (!IsScalar(type)) {\n    return false;\n  }\n  FLATBUFFERS_ASSERT(sizeof(T) == GetTypeSize(type));\n  T def;\n  if (IsInteger(type)) {\n    def = GetFieldDefaultI<T>(field);\n  } else {\n    FLATBUFFERS_ASSERT(IsFloat(type));\n    def = GetFieldDefaultF<T>(field);\n  }\n  return table->SetField(field.offset(), val, def);\n}\n\n// Raw helper functions used below: set any value in memory as a 64bit int, a\n// double or a string.\n// These work for all scalar values, but do nothing for other data types.\n// To set a string, see SetString below.\nvoid SetAnyValueI(reflection::BaseType type, uint8_t* data, int64_t val);\nvoid SetAnyValueF(reflection::BaseType type, uint8_t* data, double val);\nvoid SetAnyValueS(reflection::BaseType type, uint8_t* data, const char* val);\n\n// Set any table field as a 64bit int, regardless of type what it is.\ninline bool SetAnyFieldI(Table* table, const reflection::Field& field,\n                         int64_t val) {\n  auto field_ptr = table->GetAddressOf(field.offset());\n  if (!field_ptr) return val == GetFieldDefaultI<int64_t>(field);\n  SetAnyValueI(field.type()->base_type(), field_ptr, val);\n  return true;\n}\n\n// Set any table field as a double, regardless of what type it is.\ninline bool SetAnyFieldF(Table* table, const reflection::Field& field,\n                         double val) {\n  auto field_ptr = table->GetAddressOf(field.offset());\n  if (!field_ptr) return val == GetFieldDefaultF<double>(field);\n  SetAnyValueF(field.type()->base_type(), field_ptr, val);\n  return true;\n}\n\n// Set any table field as a string, regardless of what type it is.\ninline bool SetAnyFieldS(Table* table, const reflection::Field& field,\n                         const char* val) {\n  auto field_ptr = table->GetAddressOf(field.offset());\n  if (!field_ptr) return false;\n  SetAnyValueS(field.type()->base_type(), field_ptr, val);\n  return true;\n}\n\n// Set any struct field as a 64bit int, regardless of type what it is.\ninline void SetAnyFieldI(Struct* st, const reflection::Field& field,\n                         int64_t val) {\n  SetAnyValueI(field.type()->base_type(), st->GetAddressOf(field.offset()),\n               val);\n}\n\n// Set any struct field as a double, regardless of type what it is.\ninline void SetAnyFieldF(Struct* st, const reflection::Field& field,\n                         double val) {\n  SetAnyValueF(field.type()->base_type(), st->GetAddressOf(field.offset()),\n               val);\n}\n\n// Set any struct field as a string, regardless of type what it is.\ninline void SetAnyFieldS(Struct* st, const reflection::Field& field,\n                         const char* val) {\n  SetAnyValueS(field.type()->base_type(), st->GetAddressOf(field.offset()),\n               val);\n}\n\n// Set any vector element as a 64bit int, regardless of type what it is.\ninline void SetAnyVectorElemI(VectorOfAny* vec, reflection::BaseType elem_type,\n                              size_t i, int64_t val) {\n  SetAnyValueI(elem_type, vec->Data() + GetTypeSize(elem_type) * i, val);\n}\n\n// Set any vector element as a double, regardless of type what it is.\ninline void SetAnyVectorElemF(VectorOfAny* vec, reflection::BaseType elem_type,\n                              size_t i, double val) {\n  SetAnyValueF(elem_type, vec->Data() + GetTypeSize(elem_type) * i, val);\n}\n\n// Set any vector element as a string, regardless of type what it is.\ninline void SetAnyVectorElemS(VectorOfAny* vec, reflection::BaseType elem_type,\n                              size_t i, const char* val) {\n  SetAnyValueS(elem_type, vec->Data() + GetTypeSize(elem_type) * i, val);\n}\n\n// ------------------------- RESIZING SETTERS -------------------------\n\n// \"smart\" pointer for use with resizing vectors: turns a pointer inside\n// a vector into a relative offset, such that it is not affected by resizes.\ntemplate <typename T, typename U>\nclass pointer_inside_vector {\n public:\n  pointer_inside_vector(T* ptr, std::vector<U>& vec)\n      : offset_(reinterpret_cast<uint8_t*>(ptr) -\n                reinterpret_cast<uint8_t*>(vec.data())),\n        vec_(vec) {}\n\n  T* operator*() const {\n    return reinterpret_cast<T*>(reinterpret_cast<uint8_t*>(vec_.data()) +\n                                offset_);\n  }\n  T* operator->() const { return operator*(); }\n\n private:\n  size_t offset_;\n  std::vector<U>& vec_;\n};\n\n// Helper to create the above easily without specifying template args.\ntemplate <typename T, typename U>\npointer_inside_vector<T, U> piv(T* ptr, std::vector<U>& vec) {\n  return pointer_inside_vector<T, U>(ptr, vec);\n}\n\nconstexpr const char* UnionTypeFieldSuffix() { return \"_type\"; }\n\n// Helper to figure out the actual table type a union refers to.\ninline const reflection::Object& GetUnionType(\n    const reflection::Schema& schema, const reflection::Object& parent,\n    const reflection::Field& unionfield, const Table& table) {\n  auto enumdef = schema.enums()->Get(unionfield.type()->index());\n  // TODO: this is clumsy and slow, but no other way to find it?\n  auto type_field = parent.fields()->LookupByKey(\n      (unionfield.name()->str() + UnionTypeFieldSuffix()).c_str());\n  FLATBUFFERS_ASSERT(type_field);\n  auto union_type = GetFieldI<uint8_t>(table, *type_field);\n  auto enumval = enumdef->values()->LookupByKey(union_type);\n  return *schema.objects()->Get(enumval->union_type()->index());\n}\n\n// Changes the contents of a string inside a FlatBuffer. FlatBuffer must\n// live inside a std::vector so we can resize the buffer if needed.\n// \"str\" must live inside \"flatbuf\" and may be invalidated after this call.\n// If your FlatBuffer's root table is not the schema's root table, you should\n// pass in your root_table type as well.\nvoid SetString(const reflection::Schema& schema, const std::string& val,\n               const String* str, std::vector<uint8_t>* flatbuf,\n               const reflection::Object* root_table = nullptr);\n\n// Resizes a flatbuffers::Vector inside a FlatBuffer. FlatBuffer must\n// live inside a std::vector so we can resize the buffer if needed.\n// \"vec\" must live inside \"flatbuf\" and may be invalidated after this call.\n// If your FlatBuffer's root table is not the schema's root table, you should\n// pass in your root_table type as well.\nuint8_t* ResizeAnyVector(const reflection::Schema& schema, uoffset_t newsize,\n                         const VectorOfAny* vec, uoffset_t num_elems,\n                         uoffset_t elem_size, std::vector<uint8_t>* flatbuf,\n                         const reflection::Object* root_table = nullptr);\n\ntemplate <typename T>\nvoid ResizeVector(const reflection::Schema& schema, uoffset_t newsize, T val,\n                  const Vector<T>* vec, std::vector<uint8_t>* flatbuf,\n                  const reflection::Object* root_table = nullptr) {\n  auto delta_elem = static_cast<int>(newsize) - static_cast<int>(vec->size());\n  auto newelems = ResizeAnyVector(\n      schema, newsize, reinterpret_cast<const VectorOfAny*>(vec), vec->size(),\n      static_cast<uoffset_t>(sizeof(T)), flatbuf, root_table);\n  // Set new elements to \"val\".\n  for (int i = 0; i < delta_elem; i++) {\n    auto loc = newelems + i * sizeof(T);\n    auto is_scalar = flatbuffers::is_scalar<T>::value;\n    if (is_scalar) {\n      WriteScalar(loc, val);\n    } else {  // struct\n      *reinterpret_cast<T*>(loc) = val;\n    }\n  }\n}\n\n// Adds any new data (in the form of a new FlatBuffer) to an existing\n// FlatBuffer. This can be used when any of the above methods are not\n// sufficient, in particular for adding new tables and new fields.\n// This is potentially slightly less efficient than a FlatBuffer constructed\n// in one piece, since the new FlatBuffer doesn't share any vtables with the\n// existing one.\n// The return value can now be set using Vector::MutateOffset or SetFieldT\n// below.\nconst uint8_t* AddFlatBuffer(std::vector<uint8_t>& flatbuf,\n                             const uint8_t* newbuf, size_t newlen);\n\ninline bool SetFieldT(Table* table, const reflection::Field& field,\n                      const uint8_t* val) {\n  FLATBUFFERS_ASSERT(sizeof(uoffset_t) ==\n                     GetTypeSize(field.type()->base_type()));\n  return table->SetPointer(field.offset(), val);\n}\n\n// ------------------------- COPYING -------------------------\n\n// Generic copying of tables from a FlatBuffer into a FlatBuffer builder.\n// Can be used to do any kind of merging/selecting you may want to do out\n// of existing buffers. Also useful to reconstruct a whole buffer if the\n// above resizing functionality has introduced garbage in a buffer you want\n// to remove.\n// Note: this does not deal with DAGs correctly. If the table passed forms a\n// DAG, the copy will be a tree instead (with duplicates). Strings can be\n// shared however, by passing true for use_string_pooling.\n\nOffset<const Table*> CopyTable(FlatBufferBuilder& fbb,\n                               const reflection::Schema& schema,\n                               const reflection::Object& objectdef,\n                               const Table& table,\n                               bool use_string_pooling = false);\n\n// Verifies the provided flatbuffer using reflection.\n// root should point to the root type for this flatbuffer.\n// buf should point to the start of flatbuffer data.\n// length specifies the size of the flatbuffer data.\nbool Verify(const reflection::Schema& schema, const reflection::Object& root,\n            const uint8_t* buf, size_t length, uoffset_t max_depth = 64,\n            uoffset_t max_tables = 1000000);\n\nbool VerifySizePrefixed(const reflection::Schema& schema,\n                        const reflection::Object& root, const uint8_t* buf,\n                        size_t length, uoffset_t max_depth = 64,\n                        uoffset_t max_tables = 1000000);\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_REFLECTION_H_\n"
  },
  {
    "path": "include/flatbuffers/reflection_generated.h",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n\n#ifndef FLATBUFFERS_GENERATED_REFLECTION_REFLECTION_H_\n#define FLATBUFFERS_GENERATED_REFLECTION_REFLECTION_H_\n\n#include \"flatbuffers/flatbuffers.h\"\n\n// Ensure the included flatbuffers.h is the same version as when this file was\n// generated, otherwise it may not be compatible.\nstatic_assert(FLATBUFFERS_VERSION_MAJOR == 25 &&\n              FLATBUFFERS_VERSION_MINOR == 12 &&\n              FLATBUFFERS_VERSION_REVISION == 19,\n             \"Non-compatible flatbuffers version included\");\n\nnamespace reflection {\n\nstruct Type;\nstruct TypeBuilder;\n\nstruct KeyValue;\nstruct KeyValueBuilder;\n\nstruct EnumVal;\nstruct EnumValBuilder;\n\nstruct Enum;\nstruct EnumBuilder;\n\nstruct Field;\nstruct FieldBuilder;\n\nstruct Object;\nstruct ObjectBuilder;\n\nstruct RPCCall;\nstruct RPCCallBuilder;\n\nstruct Service;\nstruct ServiceBuilder;\n\nstruct SchemaFile;\nstruct SchemaFileBuilder;\n\nstruct Schema;\nstruct SchemaBuilder;\n\nenum BaseType {\n  None = 0,\n  UType = 1,\n  Bool = 2,\n  Byte = 3,\n  UByte = 4,\n  Short = 5,\n  UShort = 6,\n  Int = 7,\n  UInt = 8,\n  Long = 9,\n  ULong = 10,\n  Float = 11,\n  Double = 12,\n  String = 13,\n  Vector = 14,\n  Obj = 15,\n  Union = 16,\n  Array = 17,\n  Vector64 = 18,\n  MaxBaseType = 19\n};\n\ninline const BaseType (&EnumValuesBaseType())[20] {\n  static const BaseType values[] = {\n    None,\n    UType,\n    Bool,\n    Byte,\n    UByte,\n    Short,\n    UShort,\n    Int,\n    UInt,\n    Long,\n    ULong,\n    Float,\n    Double,\n    String,\n    Vector,\n    Obj,\n    Union,\n    Array,\n    Vector64,\n    MaxBaseType\n  };\n  return values;\n}\n\ninline const char * const *EnumNamesBaseType() {\n  static const char * const names[21] = {\n    \"None\",\n    \"UType\",\n    \"Bool\",\n    \"Byte\",\n    \"UByte\",\n    \"Short\",\n    \"UShort\",\n    \"Int\",\n    \"UInt\",\n    \"Long\",\n    \"ULong\",\n    \"Float\",\n    \"Double\",\n    \"String\",\n    \"Vector\",\n    \"Obj\",\n    \"Union\",\n    \"Array\",\n    \"Vector64\",\n    \"MaxBaseType\",\n    nullptr\n  };\n  return names;\n}\n\ninline const char *EnumNameBaseType(BaseType e) {\n  if (::flatbuffers::IsOutRange(e, None, MaxBaseType)) return \"\";\n  const size_t index = static_cast<size_t>(e);\n  return EnumNamesBaseType()[index];\n}\n\n/// New schema language features that are not supported by old code generators.\nenum AdvancedFeatures {\n  AdvancedArrayFeatures = 1ULL,\n  AdvancedUnionFeatures = 2ULL,\n  OptionalScalars = 4ULL,\n  DefaultVectorsAndStrings = 8ULL\n};\n\ninline const AdvancedFeatures (&EnumValuesAdvancedFeatures())[4] {\n  static const AdvancedFeatures values[] = {\n    AdvancedArrayFeatures,\n    AdvancedUnionFeatures,\n    OptionalScalars,\n    DefaultVectorsAndStrings\n  };\n  return values;\n}\n\ninline const char * const *EnumNamesAdvancedFeatures() {\n  static const char * const names[9] = {\n    \"AdvancedArrayFeatures\",\n    \"AdvancedUnionFeatures\",\n    \"\",\n    \"OptionalScalars\",\n    \"\",\n    \"\",\n    \"\",\n    \"DefaultVectorsAndStrings\",\n    nullptr\n  };\n  return names;\n}\n\ninline const char *EnumNameAdvancedFeatures(AdvancedFeatures e) {\n  if (::flatbuffers::IsOutRange(e, AdvancedArrayFeatures, DefaultVectorsAndStrings)) return \"\";\n  const size_t index = static_cast<size_t>(e) - static_cast<size_t>(AdvancedArrayFeatures);\n  return EnumNamesAdvancedFeatures()[index];\n}\n\nstruct Type FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef TypeBuilder Builder;\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_BASE_TYPE = 4,\n    VT_ELEMENT = 6,\n    VT_INDEX = 8,\n    VT_FIXED_LENGTH = 10,\n    VT_BASE_SIZE = 12,\n    VT_ELEMENT_SIZE = 14\n  };\n  reflection::BaseType base_type() const {\n    return static_cast<reflection::BaseType>(GetField<int8_t>(VT_BASE_TYPE, 0));\n  }\n  reflection::BaseType element() const {\n    return static_cast<reflection::BaseType>(GetField<int8_t>(VT_ELEMENT, 0));\n  }\n  int32_t index() const {\n    return GetField<int32_t>(VT_INDEX, -1);\n  }\n  uint16_t fixed_length() const {\n    return GetField<uint16_t>(VT_FIXED_LENGTH, 0);\n  }\n  /// The size (octets) of the `base_type` field.\n  uint32_t base_size() const {\n    return GetField<uint32_t>(VT_BASE_SIZE, 4);\n  }\n  /// The size (octets) of the `element` field, if present.\n  uint32_t element_size() const {\n    return GetField<uint32_t>(VT_ELEMENT_SIZE, 0);\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyField<int8_t>(verifier, VT_BASE_TYPE, 1) &&\n           VerifyField<int8_t>(verifier, VT_ELEMENT, 1) &&\n           VerifyField<int32_t>(verifier, VT_INDEX, 4) &&\n           VerifyField<uint16_t>(verifier, VT_FIXED_LENGTH, 2) &&\n           VerifyField<uint32_t>(verifier, VT_BASE_SIZE, 4) &&\n           VerifyField<uint32_t>(verifier, VT_ELEMENT_SIZE, 4) &&\n           verifier.EndTable();\n  }\n};\n\nstruct TypeBuilder {\n  typedef Type Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_base_type(reflection::BaseType base_type) {\n    fbb_.AddElement<int8_t>(Type::VT_BASE_TYPE, static_cast<int8_t>(base_type), 0);\n  }\n  void add_element(reflection::BaseType element) {\n    fbb_.AddElement<int8_t>(Type::VT_ELEMENT, static_cast<int8_t>(element), 0);\n  }\n  void add_index(int32_t index) {\n    fbb_.AddElement<int32_t>(Type::VT_INDEX, index, -1);\n  }\n  void add_fixed_length(uint16_t fixed_length) {\n    fbb_.AddElement<uint16_t>(Type::VT_FIXED_LENGTH, fixed_length, 0);\n  }\n  void add_base_size(uint32_t base_size) {\n    fbb_.AddElement<uint32_t>(Type::VT_BASE_SIZE, base_size, 4);\n  }\n  void add_element_size(uint32_t element_size) {\n    fbb_.AddElement<uint32_t>(Type::VT_ELEMENT_SIZE, element_size, 0);\n  }\n  explicit TypeBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<Type> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<Type>(end);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<Type> CreateType(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    reflection::BaseType base_type = reflection::None,\n    reflection::BaseType element = reflection::None,\n    int32_t index = -1,\n    uint16_t fixed_length = 0,\n    uint32_t base_size = 4,\n    uint32_t element_size = 0) {\n  TypeBuilder builder_(_fbb);\n  builder_.add_element_size(element_size);\n  builder_.add_base_size(base_size);\n  builder_.add_index(index);\n  builder_.add_fixed_length(fixed_length);\n  builder_.add_element(element);\n  builder_.add_base_type(base_type);\n  return builder_.Finish();\n}\n\nstruct KeyValue FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef KeyValueBuilder Builder;\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_KEY = 4,\n    VT_VALUE = 6\n  };\n  const ::flatbuffers::String *key() const {\n    return GetPointer<const ::flatbuffers::String *>(VT_KEY);\n  }\n  bool KeyCompareLessThan(const KeyValue * const o) const {\n    return *key() < *o->key();\n  }\n  int KeyCompareWithValue(const char *_key) const {\n    return strcmp(key()->c_str(), _key);\n  }\n  template<typename StringType>\n  int KeyCompareWithValue(const StringType& _key) const {\n    if (key()->c_str() < _key) return -1;\n    if (_key < key()->c_str()) return 1;\n    return 0;\n  }\n  const ::flatbuffers::String *value() const {\n    return GetPointer<const ::flatbuffers::String *>(VT_VALUE);\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyOffsetRequired(verifier, VT_KEY) &&\n           verifier.VerifyString(key()) &&\n           VerifyOffset(verifier, VT_VALUE) &&\n           verifier.VerifyString(value()) &&\n           verifier.EndTable();\n  }\n};\n\nstruct KeyValueBuilder {\n  typedef KeyValue Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_key(::flatbuffers::Offset<::flatbuffers::String> key) {\n    fbb_.AddOffset(KeyValue::VT_KEY, key);\n  }\n  void add_value(::flatbuffers::Offset<::flatbuffers::String> value) {\n    fbb_.AddOffset(KeyValue::VT_VALUE, value);\n  }\n  explicit KeyValueBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<KeyValue> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<KeyValue>(end);\n    fbb_.Required(o, KeyValue::VT_KEY);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<KeyValue> CreateKeyValue(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    ::flatbuffers::Offset<::flatbuffers::String> key = 0,\n    ::flatbuffers::Offset<::flatbuffers::String> value = 0) {\n  KeyValueBuilder builder_(_fbb);\n  builder_.add_value(value);\n  builder_.add_key(key);\n  return builder_.Finish();\n}\n\ninline ::flatbuffers::Offset<KeyValue> CreateKeyValueDirect(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    const char *key = nullptr,\n    const char *value = nullptr) {\n  auto key__ = key ? _fbb.CreateString(key) : 0;\n  auto value__ = value ? _fbb.CreateString(value) : 0;\n  return reflection::CreateKeyValue(\n      _fbb,\n      key__,\n      value__);\n}\n\nstruct EnumVal FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef EnumValBuilder Builder;\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_NAME = 4,\n    VT_VALUE = 6,\n    VT_UNION_TYPE = 10,\n    VT_DOCUMENTATION = 12,\n    VT_ATTRIBUTES = 14\n  };\n  const ::flatbuffers::String *name() const {\n    return GetPointer<const ::flatbuffers::String *>(VT_NAME);\n  }\n  int64_t value() const {\n    return GetField<int64_t>(VT_VALUE, 0);\n  }\n  bool KeyCompareLessThan(const EnumVal * const o) const {\n    return value() < o->value();\n  }\n  int KeyCompareWithValue(int64_t _value) const {\n    return static_cast<int>(value() > _value) - static_cast<int>(value() < _value);\n  }\n  const reflection::Type *union_type() const {\n    return GetPointer<const reflection::Type *>(VT_UNION_TYPE);\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *documentation() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_DOCUMENTATION);\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>> *attributes() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>> *>(VT_ATTRIBUTES);\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyOffsetRequired(verifier, VT_NAME) &&\n           verifier.VerifyString(name()) &&\n           VerifyField<int64_t>(verifier, VT_VALUE, 8) &&\n           VerifyOffset(verifier, VT_UNION_TYPE) &&\n           verifier.VerifyTable(union_type()) &&\n           VerifyOffset(verifier, VT_DOCUMENTATION) &&\n           verifier.VerifyVector(documentation()) &&\n           verifier.VerifyVectorOfStrings(documentation()) &&\n           VerifyOffset(verifier, VT_ATTRIBUTES) &&\n           verifier.VerifyVector(attributes()) &&\n           verifier.VerifyVectorOfTables(attributes()) &&\n           verifier.EndTable();\n  }\n};\n\nstruct EnumValBuilder {\n  typedef EnumVal Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_name(::flatbuffers::Offset<::flatbuffers::String> name) {\n    fbb_.AddOffset(EnumVal::VT_NAME, name);\n  }\n  void add_value(int64_t value) {\n    fbb_.AddElement<int64_t>(EnumVal::VT_VALUE, value, 0);\n  }\n  void add_union_type(::flatbuffers::Offset<reflection::Type> union_type) {\n    fbb_.AddOffset(EnumVal::VT_UNION_TYPE, union_type);\n  }\n  void add_documentation(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> documentation) {\n    fbb_.AddOffset(EnumVal::VT_DOCUMENTATION, documentation);\n  }\n  void add_attributes(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>>> attributes) {\n    fbb_.AddOffset(EnumVal::VT_ATTRIBUTES, attributes);\n  }\n  explicit EnumValBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<EnumVal> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<EnumVal>(end);\n    fbb_.Required(o, EnumVal::VT_NAME);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<EnumVal> CreateEnumVal(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    ::flatbuffers::Offset<::flatbuffers::String> name = 0,\n    int64_t value = 0,\n    ::flatbuffers::Offset<reflection::Type> union_type = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> documentation = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>>> attributes = 0) {\n  EnumValBuilder builder_(_fbb);\n  builder_.add_value(value);\n  builder_.add_attributes(attributes);\n  builder_.add_documentation(documentation);\n  builder_.add_union_type(union_type);\n  builder_.add_name(name);\n  return builder_.Finish();\n}\n\ninline ::flatbuffers::Offset<EnumVal> CreateEnumValDirect(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    const char *name = nullptr,\n    int64_t value = 0,\n    ::flatbuffers::Offset<reflection::Type> union_type = 0,\n    const std::vector<::flatbuffers::Offset<::flatbuffers::String>> *documentation = nullptr,\n    std::vector<::flatbuffers::Offset<reflection::KeyValue>> *attributes = nullptr) {\n  auto name__ = name ? _fbb.CreateString(name) : 0;\n  auto documentation__ = documentation ? _fbb.CreateVector<::flatbuffers::Offset<::flatbuffers::String>>(*documentation) : 0;\n  auto attributes__ = attributes ? _fbb.CreateVectorOfSortedTables<reflection::KeyValue>(attributes) : 0;\n  return reflection::CreateEnumVal(\n      _fbb,\n      name__,\n      value,\n      union_type,\n      documentation__,\n      attributes__);\n}\n\nstruct Enum FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef EnumBuilder Builder;\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_NAME = 4,\n    VT_VALUES = 6,\n    VT_IS_UNION = 8,\n    VT_UNDERLYING_TYPE = 10,\n    VT_ATTRIBUTES = 12,\n    VT_DOCUMENTATION = 14,\n    VT_DECLARATION_FILE = 16\n  };\n  const ::flatbuffers::String *name() const {\n    return GetPointer<const ::flatbuffers::String *>(VT_NAME);\n  }\n  bool KeyCompareLessThan(const Enum * const o) const {\n    return *name() < *o->name();\n  }\n  int KeyCompareWithValue(const char *_name) const {\n    return strcmp(name()->c_str(), _name);\n  }\n  template<typename StringType>\n  int KeyCompareWithValue(const StringType& _name) const {\n    if (name()->c_str() < _name) return -1;\n    if (_name < name()->c_str()) return 1;\n    return 0;\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::EnumVal>> *values() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::EnumVal>> *>(VT_VALUES);\n  }\n  bool is_union() const {\n    return GetField<uint8_t>(VT_IS_UNION, 0) != 0;\n  }\n  const reflection::Type *underlying_type() const {\n    return GetPointer<const reflection::Type *>(VT_UNDERLYING_TYPE);\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>> *attributes() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>> *>(VT_ATTRIBUTES);\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *documentation() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_DOCUMENTATION);\n  }\n  /// File that this Enum is declared in.\n  const ::flatbuffers::String *declaration_file() const {\n    return GetPointer<const ::flatbuffers::String *>(VT_DECLARATION_FILE);\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyOffsetRequired(verifier, VT_NAME) &&\n           verifier.VerifyString(name()) &&\n           VerifyOffsetRequired(verifier, VT_VALUES) &&\n           verifier.VerifyVector(values()) &&\n           verifier.VerifyVectorOfTables(values()) &&\n           VerifyField<uint8_t>(verifier, VT_IS_UNION, 1) &&\n           VerifyOffsetRequired(verifier, VT_UNDERLYING_TYPE) &&\n           verifier.VerifyTable(underlying_type()) &&\n           VerifyOffset(verifier, VT_ATTRIBUTES) &&\n           verifier.VerifyVector(attributes()) &&\n           verifier.VerifyVectorOfTables(attributes()) &&\n           VerifyOffset(verifier, VT_DOCUMENTATION) &&\n           verifier.VerifyVector(documentation()) &&\n           verifier.VerifyVectorOfStrings(documentation()) &&\n           VerifyOffset(verifier, VT_DECLARATION_FILE) &&\n           verifier.VerifyString(declaration_file()) &&\n           verifier.EndTable();\n  }\n};\n\nstruct EnumBuilder {\n  typedef Enum Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_name(::flatbuffers::Offset<::flatbuffers::String> name) {\n    fbb_.AddOffset(Enum::VT_NAME, name);\n  }\n  void add_values(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::EnumVal>>> values) {\n    fbb_.AddOffset(Enum::VT_VALUES, values);\n  }\n  void add_is_union(bool is_union) {\n    fbb_.AddElement<uint8_t>(Enum::VT_IS_UNION, static_cast<uint8_t>(is_union), 0);\n  }\n  void add_underlying_type(::flatbuffers::Offset<reflection::Type> underlying_type) {\n    fbb_.AddOffset(Enum::VT_UNDERLYING_TYPE, underlying_type);\n  }\n  void add_attributes(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>>> attributes) {\n    fbb_.AddOffset(Enum::VT_ATTRIBUTES, attributes);\n  }\n  void add_documentation(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> documentation) {\n    fbb_.AddOffset(Enum::VT_DOCUMENTATION, documentation);\n  }\n  void add_declaration_file(::flatbuffers::Offset<::flatbuffers::String> declaration_file) {\n    fbb_.AddOffset(Enum::VT_DECLARATION_FILE, declaration_file);\n  }\n  explicit EnumBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<Enum> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<Enum>(end);\n    fbb_.Required(o, Enum::VT_NAME);\n    fbb_.Required(o, Enum::VT_VALUES);\n    fbb_.Required(o, Enum::VT_UNDERLYING_TYPE);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<Enum> CreateEnum(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    ::flatbuffers::Offset<::flatbuffers::String> name = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::EnumVal>>> values = 0,\n    bool is_union = false,\n    ::flatbuffers::Offset<reflection::Type> underlying_type = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>>> attributes = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> documentation = 0,\n    ::flatbuffers::Offset<::flatbuffers::String> declaration_file = 0) {\n  EnumBuilder builder_(_fbb);\n  builder_.add_declaration_file(declaration_file);\n  builder_.add_documentation(documentation);\n  builder_.add_attributes(attributes);\n  builder_.add_underlying_type(underlying_type);\n  builder_.add_values(values);\n  builder_.add_name(name);\n  builder_.add_is_union(is_union);\n  return builder_.Finish();\n}\n\ninline ::flatbuffers::Offset<Enum> CreateEnumDirect(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    const char *name = nullptr,\n    std::vector<::flatbuffers::Offset<reflection::EnumVal>> *values = nullptr,\n    bool is_union = false,\n    ::flatbuffers::Offset<reflection::Type> underlying_type = 0,\n    std::vector<::flatbuffers::Offset<reflection::KeyValue>> *attributes = nullptr,\n    const std::vector<::flatbuffers::Offset<::flatbuffers::String>> *documentation = nullptr,\n    const char *declaration_file = nullptr) {\n  auto name__ = name ? _fbb.CreateString(name) : 0;\n  auto values__ = values ? _fbb.CreateVectorOfSortedTables<reflection::EnumVal>(values) : 0;\n  auto attributes__ = attributes ? _fbb.CreateVectorOfSortedTables<reflection::KeyValue>(attributes) : 0;\n  auto documentation__ = documentation ? _fbb.CreateVector<::flatbuffers::Offset<::flatbuffers::String>>(*documentation) : 0;\n  auto declaration_file__ = declaration_file ? _fbb.CreateString(declaration_file) : 0;\n  return reflection::CreateEnum(\n      _fbb,\n      name__,\n      values__,\n      is_union,\n      underlying_type,\n      attributes__,\n      documentation__,\n      declaration_file__);\n}\n\nstruct Field FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef FieldBuilder Builder;\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_NAME = 4,\n    VT_TYPE = 6,\n    VT_ID = 8,\n    VT_OFFSET = 10,\n    VT_DEFAULT_INTEGER = 12,\n    VT_DEFAULT_REAL = 14,\n    VT_DEPRECATED = 16,\n    VT_REQUIRED = 18,\n    VT_KEY = 20,\n    VT_ATTRIBUTES = 22,\n    VT_DOCUMENTATION = 24,\n    VT_OPTIONAL = 26,\n    VT_PADDING = 28,\n    VT_OFFSET64 = 30\n  };\n  const ::flatbuffers::String *name() const {\n    return GetPointer<const ::flatbuffers::String *>(VT_NAME);\n  }\n  bool KeyCompareLessThan(const Field * const o) const {\n    return *name() < *o->name();\n  }\n  int KeyCompareWithValue(const char *_name) const {\n    return strcmp(name()->c_str(), _name);\n  }\n  template<typename StringType>\n  int KeyCompareWithValue(const StringType& _name) const {\n    if (name()->c_str() < _name) return -1;\n    if (_name < name()->c_str()) return 1;\n    return 0;\n  }\n  const reflection::Type *type() const {\n    return GetPointer<const reflection::Type *>(VT_TYPE);\n  }\n  uint16_t id() const {\n    return GetField<uint16_t>(VT_ID, 0);\n  }\n  uint16_t offset() const {\n    return GetField<uint16_t>(VT_OFFSET, 0);\n  }\n  int64_t default_integer() const {\n    return GetField<int64_t>(VT_DEFAULT_INTEGER, 0);\n  }\n  double default_real() const {\n    return GetField<double>(VT_DEFAULT_REAL, 0.0);\n  }\n  bool deprecated() const {\n    return GetField<uint8_t>(VT_DEPRECATED, 0) != 0;\n  }\n  bool required() const {\n    return GetField<uint8_t>(VT_REQUIRED, 0) != 0;\n  }\n  bool key() const {\n    return GetField<uint8_t>(VT_KEY, 0) != 0;\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>> *attributes() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>> *>(VT_ATTRIBUTES);\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *documentation() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_DOCUMENTATION);\n  }\n  bool optional() const {\n    return GetField<uint8_t>(VT_OPTIONAL, 0) != 0;\n  }\n  /// Number of padding octets to always add after this field. Structs only.\n  uint16_t padding() const {\n    return GetField<uint16_t>(VT_PADDING, 0);\n  }\n  /// If the field uses 64-bit offsets.\n  bool offset64() const {\n    return GetField<uint8_t>(VT_OFFSET64, 0) != 0;\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyOffsetRequired(verifier, VT_NAME) &&\n           verifier.VerifyString(name()) &&\n           VerifyOffsetRequired(verifier, VT_TYPE) &&\n           verifier.VerifyTable(type()) &&\n           VerifyField<uint16_t>(verifier, VT_ID, 2) &&\n           VerifyField<uint16_t>(verifier, VT_OFFSET, 2) &&\n           VerifyField<int64_t>(verifier, VT_DEFAULT_INTEGER, 8) &&\n           VerifyField<double>(verifier, VT_DEFAULT_REAL, 8) &&\n           VerifyField<uint8_t>(verifier, VT_DEPRECATED, 1) &&\n           VerifyField<uint8_t>(verifier, VT_REQUIRED, 1) &&\n           VerifyField<uint8_t>(verifier, VT_KEY, 1) &&\n           VerifyOffset(verifier, VT_ATTRIBUTES) &&\n           verifier.VerifyVector(attributes()) &&\n           verifier.VerifyVectorOfTables(attributes()) &&\n           VerifyOffset(verifier, VT_DOCUMENTATION) &&\n           verifier.VerifyVector(documentation()) &&\n           verifier.VerifyVectorOfStrings(documentation()) &&\n           VerifyField<uint8_t>(verifier, VT_OPTIONAL, 1) &&\n           VerifyField<uint16_t>(verifier, VT_PADDING, 2) &&\n           VerifyField<uint8_t>(verifier, VT_OFFSET64, 1) &&\n           verifier.EndTable();\n  }\n};\n\nstruct FieldBuilder {\n  typedef Field Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_name(::flatbuffers::Offset<::flatbuffers::String> name) {\n    fbb_.AddOffset(Field::VT_NAME, name);\n  }\n  void add_type(::flatbuffers::Offset<reflection::Type> type) {\n    fbb_.AddOffset(Field::VT_TYPE, type);\n  }\n  void add_id(uint16_t id) {\n    fbb_.AddElement<uint16_t>(Field::VT_ID, id, 0);\n  }\n  void add_offset(uint16_t offset) {\n    fbb_.AddElement<uint16_t>(Field::VT_OFFSET, offset, 0);\n  }\n  void add_default_integer(int64_t default_integer) {\n    fbb_.AddElement<int64_t>(Field::VT_DEFAULT_INTEGER, default_integer, 0);\n  }\n  void add_default_real(double default_real) {\n    fbb_.AddElement<double>(Field::VT_DEFAULT_REAL, default_real, 0.0);\n  }\n  void add_deprecated(bool deprecated) {\n    fbb_.AddElement<uint8_t>(Field::VT_DEPRECATED, static_cast<uint8_t>(deprecated), 0);\n  }\n  void add_required(bool required) {\n    fbb_.AddElement<uint8_t>(Field::VT_REQUIRED, static_cast<uint8_t>(required), 0);\n  }\n  void add_key(bool key) {\n    fbb_.AddElement<uint8_t>(Field::VT_KEY, static_cast<uint8_t>(key), 0);\n  }\n  void add_attributes(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>>> attributes) {\n    fbb_.AddOffset(Field::VT_ATTRIBUTES, attributes);\n  }\n  void add_documentation(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> documentation) {\n    fbb_.AddOffset(Field::VT_DOCUMENTATION, documentation);\n  }\n  void add_optional(bool optional) {\n    fbb_.AddElement<uint8_t>(Field::VT_OPTIONAL, static_cast<uint8_t>(optional), 0);\n  }\n  void add_padding(uint16_t padding) {\n    fbb_.AddElement<uint16_t>(Field::VT_PADDING, padding, 0);\n  }\n  void add_offset64(bool offset64) {\n    fbb_.AddElement<uint8_t>(Field::VT_OFFSET64, static_cast<uint8_t>(offset64), 0);\n  }\n  explicit FieldBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<Field> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<Field>(end);\n    fbb_.Required(o, Field::VT_NAME);\n    fbb_.Required(o, Field::VT_TYPE);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<Field> CreateField(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    ::flatbuffers::Offset<::flatbuffers::String> name = 0,\n    ::flatbuffers::Offset<reflection::Type> type = 0,\n    uint16_t id = 0,\n    uint16_t offset = 0,\n    int64_t default_integer = 0,\n    double default_real = 0.0,\n    bool deprecated = false,\n    bool required = false,\n    bool key = false,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>>> attributes = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> documentation = 0,\n    bool optional = false,\n    uint16_t padding = 0,\n    bool offset64 = false) {\n  FieldBuilder builder_(_fbb);\n  builder_.add_default_real(default_real);\n  builder_.add_default_integer(default_integer);\n  builder_.add_documentation(documentation);\n  builder_.add_attributes(attributes);\n  builder_.add_type(type);\n  builder_.add_name(name);\n  builder_.add_padding(padding);\n  builder_.add_offset(offset);\n  builder_.add_id(id);\n  builder_.add_offset64(offset64);\n  builder_.add_optional(optional);\n  builder_.add_key(key);\n  builder_.add_required(required);\n  builder_.add_deprecated(deprecated);\n  return builder_.Finish();\n}\n\ninline ::flatbuffers::Offset<Field> CreateFieldDirect(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    const char *name = nullptr,\n    ::flatbuffers::Offset<reflection::Type> type = 0,\n    uint16_t id = 0,\n    uint16_t offset = 0,\n    int64_t default_integer = 0,\n    double default_real = 0.0,\n    bool deprecated = false,\n    bool required = false,\n    bool key = false,\n    std::vector<::flatbuffers::Offset<reflection::KeyValue>> *attributes = nullptr,\n    const std::vector<::flatbuffers::Offset<::flatbuffers::String>> *documentation = nullptr,\n    bool optional = false,\n    uint16_t padding = 0,\n    bool offset64 = false) {\n  auto name__ = name ? _fbb.CreateString(name) : 0;\n  auto attributes__ = attributes ? _fbb.CreateVectorOfSortedTables<reflection::KeyValue>(attributes) : 0;\n  auto documentation__ = documentation ? _fbb.CreateVector<::flatbuffers::Offset<::flatbuffers::String>>(*documentation) : 0;\n  return reflection::CreateField(\n      _fbb,\n      name__,\n      type,\n      id,\n      offset,\n      default_integer,\n      default_real,\n      deprecated,\n      required,\n      key,\n      attributes__,\n      documentation__,\n      optional,\n      padding,\n      offset64);\n}\n\nstruct Object FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef ObjectBuilder Builder;\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_NAME = 4,\n    VT_FIELDS = 6,\n    VT_IS_STRUCT = 8,\n    VT_MINALIGN = 10,\n    VT_BYTESIZE = 12,\n    VT_ATTRIBUTES = 14,\n    VT_DOCUMENTATION = 16,\n    VT_DECLARATION_FILE = 18\n  };\n  const ::flatbuffers::String *name() const {\n    return GetPointer<const ::flatbuffers::String *>(VT_NAME);\n  }\n  bool KeyCompareLessThan(const Object * const o) const {\n    return *name() < *o->name();\n  }\n  int KeyCompareWithValue(const char *_name) const {\n    return strcmp(name()->c_str(), _name);\n  }\n  template<typename StringType>\n  int KeyCompareWithValue(const StringType& _name) const {\n    if (name()->c_str() < _name) return -1;\n    if (_name < name()->c_str()) return 1;\n    return 0;\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::Field>> *fields() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::Field>> *>(VT_FIELDS);\n  }\n  bool is_struct() const {\n    return GetField<uint8_t>(VT_IS_STRUCT, 0) != 0;\n  }\n  int32_t minalign() const {\n    return GetField<int32_t>(VT_MINALIGN, 0);\n  }\n  int32_t bytesize() const {\n    return GetField<int32_t>(VT_BYTESIZE, 0);\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>> *attributes() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>> *>(VT_ATTRIBUTES);\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *documentation() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_DOCUMENTATION);\n  }\n  /// File that this Object is declared in.\n  const ::flatbuffers::String *declaration_file() const {\n    return GetPointer<const ::flatbuffers::String *>(VT_DECLARATION_FILE);\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyOffsetRequired(verifier, VT_NAME) &&\n           verifier.VerifyString(name()) &&\n           VerifyOffsetRequired(verifier, VT_FIELDS) &&\n           verifier.VerifyVector(fields()) &&\n           verifier.VerifyVectorOfTables(fields()) &&\n           VerifyField<uint8_t>(verifier, VT_IS_STRUCT, 1) &&\n           VerifyField<int32_t>(verifier, VT_MINALIGN, 4) &&\n           VerifyField<int32_t>(verifier, VT_BYTESIZE, 4) &&\n           VerifyOffset(verifier, VT_ATTRIBUTES) &&\n           verifier.VerifyVector(attributes()) &&\n           verifier.VerifyVectorOfTables(attributes()) &&\n           VerifyOffset(verifier, VT_DOCUMENTATION) &&\n           verifier.VerifyVector(documentation()) &&\n           verifier.VerifyVectorOfStrings(documentation()) &&\n           VerifyOffset(verifier, VT_DECLARATION_FILE) &&\n           verifier.VerifyString(declaration_file()) &&\n           verifier.EndTable();\n  }\n};\n\nstruct ObjectBuilder {\n  typedef Object Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_name(::flatbuffers::Offset<::flatbuffers::String> name) {\n    fbb_.AddOffset(Object::VT_NAME, name);\n  }\n  void add_fields(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::Field>>> fields) {\n    fbb_.AddOffset(Object::VT_FIELDS, fields);\n  }\n  void add_is_struct(bool is_struct) {\n    fbb_.AddElement<uint8_t>(Object::VT_IS_STRUCT, static_cast<uint8_t>(is_struct), 0);\n  }\n  void add_minalign(int32_t minalign) {\n    fbb_.AddElement<int32_t>(Object::VT_MINALIGN, minalign, 0);\n  }\n  void add_bytesize(int32_t bytesize) {\n    fbb_.AddElement<int32_t>(Object::VT_BYTESIZE, bytesize, 0);\n  }\n  void add_attributes(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>>> attributes) {\n    fbb_.AddOffset(Object::VT_ATTRIBUTES, attributes);\n  }\n  void add_documentation(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> documentation) {\n    fbb_.AddOffset(Object::VT_DOCUMENTATION, documentation);\n  }\n  void add_declaration_file(::flatbuffers::Offset<::flatbuffers::String> declaration_file) {\n    fbb_.AddOffset(Object::VT_DECLARATION_FILE, declaration_file);\n  }\n  explicit ObjectBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<Object> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<Object>(end);\n    fbb_.Required(o, Object::VT_NAME);\n    fbb_.Required(o, Object::VT_FIELDS);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<Object> CreateObject(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    ::flatbuffers::Offset<::flatbuffers::String> name = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::Field>>> fields = 0,\n    bool is_struct = false,\n    int32_t minalign = 0,\n    int32_t bytesize = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>>> attributes = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> documentation = 0,\n    ::flatbuffers::Offset<::flatbuffers::String> declaration_file = 0) {\n  ObjectBuilder builder_(_fbb);\n  builder_.add_declaration_file(declaration_file);\n  builder_.add_documentation(documentation);\n  builder_.add_attributes(attributes);\n  builder_.add_bytesize(bytesize);\n  builder_.add_minalign(minalign);\n  builder_.add_fields(fields);\n  builder_.add_name(name);\n  builder_.add_is_struct(is_struct);\n  return builder_.Finish();\n}\n\ninline ::flatbuffers::Offset<Object> CreateObjectDirect(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    const char *name = nullptr,\n    std::vector<::flatbuffers::Offset<reflection::Field>> *fields = nullptr,\n    bool is_struct = false,\n    int32_t minalign = 0,\n    int32_t bytesize = 0,\n    std::vector<::flatbuffers::Offset<reflection::KeyValue>> *attributes = nullptr,\n    const std::vector<::flatbuffers::Offset<::flatbuffers::String>> *documentation = nullptr,\n    const char *declaration_file = nullptr) {\n  auto name__ = name ? _fbb.CreateString(name) : 0;\n  auto fields__ = fields ? _fbb.CreateVectorOfSortedTables<reflection::Field>(fields) : 0;\n  auto attributes__ = attributes ? _fbb.CreateVectorOfSortedTables<reflection::KeyValue>(attributes) : 0;\n  auto documentation__ = documentation ? _fbb.CreateVector<::flatbuffers::Offset<::flatbuffers::String>>(*documentation) : 0;\n  auto declaration_file__ = declaration_file ? _fbb.CreateString(declaration_file) : 0;\n  return reflection::CreateObject(\n      _fbb,\n      name__,\n      fields__,\n      is_struct,\n      minalign,\n      bytesize,\n      attributes__,\n      documentation__,\n      declaration_file__);\n}\n\nstruct RPCCall FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef RPCCallBuilder Builder;\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_NAME = 4,\n    VT_REQUEST = 6,\n    VT_RESPONSE = 8,\n    VT_ATTRIBUTES = 10,\n    VT_DOCUMENTATION = 12\n  };\n  const ::flatbuffers::String *name() const {\n    return GetPointer<const ::flatbuffers::String *>(VT_NAME);\n  }\n  bool KeyCompareLessThan(const RPCCall * const o) const {\n    return *name() < *o->name();\n  }\n  int KeyCompareWithValue(const char *_name) const {\n    return strcmp(name()->c_str(), _name);\n  }\n  template<typename StringType>\n  int KeyCompareWithValue(const StringType& _name) const {\n    if (name()->c_str() < _name) return -1;\n    if (_name < name()->c_str()) return 1;\n    return 0;\n  }\n  const reflection::Object *request() const {\n    return GetPointer<const reflection::Object *>(VT_REQUEST);\n  }\n  const reflection::Object *response() const {\n    return GetPointer<const reflection::Object *>(VT_RESPONSE);\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>> *attributes() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>> *>(VT_ATTRIBUTES);\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *documentation() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_DOCUMENTATION);\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyOffsetRequired(verifier, VT_NAME) &&\n           verifier.VerifyString(name()) &&\n           VerifyOffsetRequired(verifier, VT_REQUEST) &&\n           verifier.VerifyTable(request()) &&\n           VerifyOffsetRequired(verifier, VT_RESPONSE) &&\n           verifier.VerifyTable(response()) &&\n           VerifyOffset(verifier, VT_ATTRIBUTES) &&\n           verifier.VerifyVector(attributes()) &&\n           verifier.VerifyVectorOfTables(attributes()) &&\n           VerifyOffset(verifier, VT_DOCUMENTATION) &&\n           verifier.VerifyVector(documentation()) &&\n           verifier.VerifyVectorOfStrings(documentation()) &&\n           verifier.EndTable();\n  }\n};\n\nstruct RPCCallBuilder {\n  typedef RPCCall Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_name(::flatbuffers::Offset<::flatbuffers::String> name) {\n    fbb_.AddOffset(RPCCall::VT_NAME, name);\n  }\n  void add_request(::flatbuffers::Offset<reflection::Object> request) {\n    fbb_.AddOffset(RPCCall::VT_REQUEST, request);\n  }\n  void add_response(::flatbuffers::Offset<reflection::Object> response) {\n    fbb_.AddOffset(RPCCall::VT_RESPONSE, response);\n  }\n  void add_attributes(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>>> attributes) {\n    fbb_.AddOffset(RPCCall::VT_ATTRIBUTES, attributes);\n  }\n  void add_documentation(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> documentation) {\n    fbb_.AddOffset(RPCCall::VT_DOCUMENTATION, documentation);\n  }\n  explicit RPCCallBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<RPCCall> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<RPCCall>(end);\n    fbb_.Required(o, RPCCall::VT_NAME);\n    fbb_.Required(o, RPCCall::VT_REQUEST);\n    fbb_.Required(o, RPCCall::VT_RESPONSE);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<RPCCall> CreateRPCCall(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    ::flatbuffers::Offset<::flatbuffers::String> name = 0,\n    ::flatbuffers::Offset<reflection::Object> request = 0,\n    ::flatbuffers::Offset<reflection::Object> response = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>>> attributes = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> documentation = 0) {\n  RPCCallBuilder builder_(_fbb);\n  builder_.add_documentation(documentation);\n  builder_.add_attributes(attributes);\n  builder_.add_response(response);\n  builder_.add_request(request);\n  builder_.add_name(name);\n  return builder_.Finish();\n}\n\ninline ::flatbuffers::Offset<RPCCall> CreateRPCCallDirect(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    const char *name = nullptr,\n    ::flatbuffers::Offset<reflection::Object> request = 0,\n    ::flatbuffers::Offset<reflection::Object> response = 0,\n    std::vector<::flatbuffers::Offset<reflection::KeyValue>> *attributes = nullptr,\n    const std::vector<::flatbuffers::Offset<::flatbuffers::String>> *documentation = nullptr) {\n  auto name__ = name ? _fbb.CreateString(name) : 0;\n  auto attributes__ = attributes ? _fbb.CreateVectorOfSortedTables<reflection::KeyValue>(attributes) : 0;\n  auto documentation__ = documentation ? _fbb.CreateVector<::flatbuffers::Offset<::flatbuffers::String>>(*documentation) : 0;\n  return reflection::CreateRPCCall(\n      _fbb,\n      name__,\n      request,\n      response,\n      attributes__,\n      documentation__);\n}\n\nstruct Service FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef ServiceBuilder Builder;\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_NAME = 4,\n    VT_CALLS = 6,\n    VT_ATTRIBUTES = 8,\n    VT_DOCUMENTATION = 10,\n    VT_DECLARATION_FILE = 12\n  };\n  const ::flatbuffers::String *name() const {\n    return GetPointer<const ::flatbuffers::String *>(VT_NAME);\n  }\n  bool KeyCompareLessThan(const Service * const o) const {\n    return *name() < *o->name();\n  }\n  int KeyCompareWithValue(const char *_name) const {\n    return strcmp(name()->c_str(), _name);\n  }\n  template<typename StringType>\n  int KeyCompareWithValue(const StringType& _name) const {\n    if (name()->c_str() < _name) return -1;\n    if (_name < name()->c_str()) return 1;\n    return 0;\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::RPCCall>> *calls() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::RPCCall>> *>(VT_CALLS);\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>> *attributes() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>> *>(VT_ATTRIBUTES);\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *documentation() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_DOCUMENTATION);\n  }\n  /// File that this Service is declared in.\n  const ::flatbuffers::String *declaration_file() const {\n    return GetPointer<const ::flatbuffers::String *>(VT_DECLARATION_FILE);\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyOffsetRequired(verifier, VT_NAME) &&\n           verifier.VerifyString(name()) &&\n           VerifyOffset(verifier, VT_CALLS) &&\n           verifier.VerifyVector(calls()) &&\n           verifier.VerifyVectorOfTables(calls()) &&\n           VerifyOffset(verifier, VT_ATTRIBUTES) &&\n           verifier.VerifyVector(attributes()) &&\n           verifier.VerifyVectorOfTables(attributes()) &&\n           VerifyOffset(verifier, VT_DOCUMENTATION) &&\n           verifier.VerifyVector(documentation()) &&\n           verifier.VerifyVectorOfStrings(documentation()) &&\n           VerifyOffset(verifier, VT_DECLARATION_FILE) &&\n           verifier.VerifyString(declaration_file()) &&\n           verifier.EndTable();\n  }\n};\n\nstruct ServiceBuilder {\n  typedef Service Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_name(::flatbuffers::Offset<::flatbuffers::String> name) {\n    fbb_.AddOffset(Service::VT_NAME, name);\n  }\n  void add_calls(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::RPCCall>>> calls) {\n    fbb_.AddOffset(Service::VT_CALLS, calls);\n  }\n  void add_attributes(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>>> attributes) {\n    fbb_.AddOffset(Service::VT_ATTRIBUTES, attributes);\n  }\n  void add_documentation(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> documentation) {\n    fbb_.AddOffset(Service::VT_DOCUMENTATION, documentation);\n  }\n  void add_declaration_file(::flatbuffers::Offset<::flatbuffers::String> declaration_file) {\n    fbb_.AddOffset(Service::VT_DECLARATION_FILE, declaration_file);\n  }\n  explicit ServiceBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<Service> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<Service>(end);\n    fbb_.Required(o, Service::VT_NAME);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<Service> CreateService(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    ::flatbuffers::Offset<::flatbuffers::String> name = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::RPCCall>>> calls = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>>> attributes = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> documentation = 0,\n    ::flatbuffers::Offset<::flatbuffers::String> declaration_file = 0) {\n  ServiceBuilder builder_(_fbb);\n  builder_.add_declaration_file(declaration_file);\n  builder_.add_documentation(documentation);\n  builder_.add_attributes(attributes);\n  builder_.add_calls(calls);\n  builder_.add_name(name);\n  return builder_.Finish();\n}\n\ninline ::flatbuffers::Offset<Service> CreateServiceDirect(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    const char *name = nullptr,\n    std::vector<::flatbuffers::Offset<reflection::RPCCall>> *calls = nullptr,\n    std::vector<::flatbuffers::Offset<reflection::KeyValue>> *attributes = nullptr,\n    const std::vector<::flatbuffers::Offset<::flatbuffers::String>> *documentation = nullptr,\n    const char *declaration_file = nullptr) {\n  auto name__ = name ? _fbb.CreateString(name) : 0;\n  auto calls__ = calls ? _fbb.CreateVectorOfSortedTables<reflection::RPCCall>(calls) : 0;\n  auto attributes__ = attributes ? _fbb.CreateVectorOfSortedTables<reflection::KeyValue>(attributes) : 0;\n  auto documentation__ = documentation ? _fbb.CreateVector<::flatbuffers::Offset<::flatbuffers::String>>(*documentation) : 0;\n  auto declaration_file__ = declaration_file ? _fbb.CreateString(declaration_file) : 0;\n  return reflection::CreateService(\n      _fbb,\n      name__,\n      calls__,\n      attributes__,\n      documentation__,\n      declaration_file__);\n}\n\n/// File specific information.\n/// Symbols declared within a file may be recovered by iterating over all\n/// symbols and examining the `declaration_file` field.\nstruct SchemaFile FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef SchemaFileBuilder Builder;\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_FILENAME = 4,\n    VT_INCLUDED_FILENAMES = 6\n  };\n  /// Filename, relative to project root.\n  const ::flatbuffers::String *filename() const {\n    return GetPointer<const ::flatbuffers::String *>(VT_FILENAME);\n  }\n  bool KeyCompareLessThan(const SchemaFile * const o) const {\n    return *filename() < *o->filename();\n  }\n  int KeyCompareWithValue(const char *_filename) const {\n    return strcmp(filename()->c_str(), _filename);\n  }\n  template<typename StringType>\n  int KeyCompareWithValue(const StringType& _filename) const {\n    if (filename()->c_str() < _filename) return -1;\n    if (_filename < filename()->c_str()) return 1;\n    return 0;\n  }\n  /// Names of included files, relative to project root.\n  const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *included_filenames() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_INCLUDED_FILENAMES);\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyOffsetRequired(verifier, VT_FILENAME) &&\n           verifier.VerifyString(filename()) &&\n           VerifyOffset(verifier, VT_INCLUDED_FILENAMES) &&\n           verifier.VerifyVector(included_filenames()) &&\n           verifier.VerifyVectorOfStrings(included_filenames()) &&\n           verifier.EndTable();\n  }\n};\n\nstruct SchemaFileBuilder {\n  typedef SchemaFile Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_filename(::flatbuffers::Offset<::flatbuffers::String> filename) {\n    fbb_.AddOffset(SchemaFile::VT_FILENAME, filename);\n  }\n  void add_included_filenames(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> included_filenames) {\n    fbb_.AddOffset(SchemaFile::VT_INCLUDED_FILENAMES, included_filenames);\n  }\n  explicit SchemaFileBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<SchemaFile> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<SchemaFile>(end);\n    fbb_.Required(o, SchemaFile::VT_FILENAME);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<SchemaFile> CreateSchemaFile(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    ::flatbuffers::Offset<::flatbuffers::String> filename = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> included_filenames = 0) {\n  SchemaFileBuilder builder_(_fbb);\n  builder_.add_included_filenames(included_filenames);\n  builder_.add_filename(filename);\n  return builder_.Finish();\n}\n\ninline ::flatbuffers::Offset<SchemaFile> CreateSchemaFileDirect(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    const char *filename = nullptr,\n    const std::vector<::flatbuffers::Offset<::flatbuffers::String>> *included_filenames = nullptr) {\n  auto filename__ = filename ? _fbb.CreateString(filename) : 0;\n  auto included_filenames__ = included_filenames ? _fbb.CreateVector<::flatbuffers::Offset<::flatbuffers::String>>(*included_filenames) : 0;\n  return reflection::CreateSchemaFile(\n      _fbb,\n      filename__,\n      included_filenames__);\n}\n\nstruct Schema FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef SchemaBuilder Builder;\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_OBJECTS = 4,\n    VT_ENUMS = 6,\n    VT_FILE_IDENT = 8,\n    VT_FILE_EXT = 10,\n    VT_ROOT_TABLE = 12,\n    VT_SERVICES = 14,\n    VT_ADVANCED_FEATURES = 16,\n    VT_FBS_FILES = 18\n  };\n  const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::Object>> *objects() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::Object>> *>(VT_OBJECTS);\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::Enum>> *enums() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::Enum>> *>(VT_ENUMS);\n  }\n  const ::flatbuffers::String *file_ident() const {\n    return GetPointer<const ::flatbuffers::String *>(VT_FILE_IDENT);\n  }\n  const ::flatbuffers::String *file_ext() const {\n    return GetPointer<const ::flatbuffers::String *>(VT_FILE_EXT);\n  }\n  const reflection::Object *root_table() const {\n    return GetPointer<const reflection::Object *>(VT_ROOT_TABLE);\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::Service>> *services() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::Service>> *>(VT_SERVICES);\n  }\n  reflection::AdvancedFeatures advanced_features() const {\n    return static_cast<reflection::AdvancedFeatures>(GetField<uint64_t>(VT_ADVANCED_FEATURES, 0));\n  }\n  /// All the files used in this compilation. Files are relative to where\n  /// flatc was invoked.\n  const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::SchemaFile>> *fbs_files() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::SchemaFile>> *>(VT_FBS_FILES);\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyOffsetRequired(verifier, VT_OBJECTS) &&\n           verifier.VerifyVector(objects()) &&\n           verifier.VerifyVectorOfTables(objects()) &&\n           VerifyOffsetRequired(verifier, VT_ENUMS) &&\n           verifier.VerifyVector(enums()) &&\n           verifier.VerifyVectorOfTables(enums()) &&\n           VerifyOffset(verifier, VT_FILE_IDENT) &&\n           verifier.VerifyString(file_ident()) &&\n           VerifyOffset(verifier, VT_FILE_EXT) &&\n           verifier.VerifyString(file_ext()) &&\n           VerifyOffset(verifier, VT_ROOT_TABLE) &&\n           verifier.VerifyTable(root_table()) &&\n           VerifyOffset(verifier, VT_SERVICES) &&\n           verifier.VerifyVector(services()) &&\n           verifier.VerifyVectorOfTables(services()) &&\n           VerifyField<uint64_t>(verifier, VT_ADVANCED_FEATURES, 8) &&\n           VerifyOffset(verifier, VT_FBS_FILES) &&\n           verifier.VerifyVector(fbs_files()) &&\n           verifier.VerifyVectorOfTables(fbs_files()) &&\n           verifier.EndTable();\n  }\n};\n\nstruct SchemaBuilder {\n  typedef Schema Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_objects(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::Object>>> objects) {\n    fbb_.AddOffset(Schema::VT_OBJECTS, objects);\n  }\n  void add_enums(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::Enum>>> enums) {\n    fbb_.AddOffset(Schema::VT_ENUMS, enums);\n  }\n  void add_file_ident(::flatbuffers::Offset<::flatbuffers::String> file_ident) {\n    fbb_.AddOffset(Schema::VT_FILE_IDENT, file_ident);\n  }\n  void add_file_ext(::flatbuffers::Offset<::flatbuffers::String> file_ext) {\n    fbb_.AddOffset(Schema::VT_FILE_EXT, file_ext);\n  }\n  void add_root_table(::flatbuffers::Offset<reflection::Object> root_table) {\n    fbb_.AddOffset(Schema::VT_ROOT_TABLE, root_table);\n  }\n  void add_services(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::Service>>> services) {\n    fbb_.AddOffset(Schema::VT_SERVICES, services);\n  }\n  void add_advanced_features(reflection::AdvancedFeatures advanced_features) {\n    fbb_.AddElement<uint64_t>(Schema::VT_ADVANCED_FEATURES, static_cast<uint64_t>(advanced_features), 0);\n  }\n  void add_fbs_files(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::SchemaFile>>> fbs_files) {\n    fbb_.AddOffset(Schema::VT_FBS_FILES, fbs_files);\n  }\n  explicit SchemaBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<Schema> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<Schema>(end);\n    fbb_.Required(o, Schema::VT_OBJECTS);\n    fbb_.Required(o, Schema::VT_ENUMS);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<Schema> CreateSchema(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::Object>>> objects = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::Enum>>> enums = 0,\n    ::flatbuffers::Offset<::flatbuffers::String> file_ident = 0,\n    ::flatbuffers::Offset<::flatbuffers::String> file_ext = 0,\n    ::flatbuffers::Offset<reflection::Object> root_table = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::Service>>> services = 0,\n    reflection::AdvancedFeatures advanced_features = static_cast<reflection::AdvancedFeatures>(0),\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::SchemaFile>>> fbs_files = 0) {\n  SchemaBuilder builder_(_fbb);\n  builder_.add_advanced_features(advanced_features);\n  builder_.add_fbs_files(fbs_files);\n  builder_.add_services(services);\n  builder_.add_root_table(root_table);\n  builder_.add_file_ext(file_ext);\n  builder_.add_file_ident(file_ident);\n  builder_.add_enums(enums);\n  builder_.add_objects(objects);\n  return builder_.Finish();\n}\n\ninline ::flatbuffers::Offset<Schema> CreateSchemaDirect(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    std::vector<::flatbuffers::Offset<reflection::Object>> *objects = nullptr,\n    std::vector<::flatbuffers::Offset<reflection::Enum>> *enums = nullptr,\n    const char *file_ident = nullptr,\n    const char *file_ext = nullptr,\n    ::flatbuffers::Offset<reflection::Object> root_table = 0,\n    std::vector<::flatbuffers::Offset<reflection::Service>> *services = nullptr,\n    reflection::AdvancedFeatures advanced_features = static_cast<reflection::AdvancedFeatures>(0),\n    std::vector<::flatbuffers::Offset<reflection::SchemaFile>> *fbs_files = nullptr) {\n  auto objects__ = objects ? _fbb.CreateVectorOfSortedTables<reflection::Object>(objects) : 0;\n  auto enums__ = enums ? _fbb.CreateVectorOfSortedTables<reflection::Enum>(enums) : 0;\n  auto file_ident__ = file_ident ? _fbb.CreateString(file_ident) : 0;\n  auto file_ext__ = file_ext ? _fbb.CreateString(file_ext) : 0;\n  auto services__ = services ? _fbb.CreateVectorOfSortedTables<reflection::Service>(services) : 0;\n  auto fbs_files__ = fbs_files ? _fbb.CreateVectorOfSortedTables<reflection::SchemaFile>(fbs_files) : 0;\n  return reflection::CreateSchema(\n      _fbb,\n      objects__,\n      enums__,\n      file_ident__,\n      file_ext__,\n      root_table,\n      services__,\n      advanced_features,\n      fbs_files__);\n}\n\ninline const reflection::Schema *GetSchema(const void *buf) {\n  return ::flatbuffers::GetRoot<reflection::Schema>(buf);\n}\n\ninline const reflection::Schema *GetSizePrefixedSchema(const void *buf) {\n  return ::flatbuffers::GetSizePrefixedRoot<reflection::Schema>(buf);\n}\n\ninline const char *SchemaIdentifier() {\n  return \"BFBS\";\n}\n\ninline bool SchemaBufferHasIdentifier(const void *buf) {\n  return ::flatbuffers::BufferHasIdentifier(\n      buf, SchemaIdentifier());\n}\n\ninline bool SizePrefixedSchemaBufferHasIdentifier(const void *buf) {\n  return ::flatbuffers::BufferHasIdentifier(\n      buf, SchemaIdentifier(), true);\n}\n\ntemplate <bool B = false>\ninline bool VerifySchemaBuffer(\n    ::flatbuffers::VerifierTemplate<B> &verifier) {\n  return verifier.template VerifyBuffer<reflection::Schema>(SchemaIdentifier());\n}\n\ntemplate <bool B = false>\ninline bool VerifySizePrefixedSchemaBuffer(\n    ::flatbuffers::VerifierTemplate<B> &verifier) {\n  return verifier.template VerifySizePrefixedBuffer<reflection::Schema>(SchemaIdentifier());\n}\n\ninline const char *SchemaExtension() {\n  return \"bfbs\";\n}\n\ninline void FinishSchemaBuffer(\n    ::flatbuffers::FlatBufferBuilder &fbb,\n    ::flatbuffers::Offset<reflection::Schema> root) {\n  fbb.Finish(root, SchemaIdentifier());\n}\n\ninline void FinishSizePrefixedSchemaBuffer(\n    ::flatbuffers::FlatBufferBuilder &fbb,\n    ::flatbuffers::Offset<reflection::Schema> root) {\n  fbb.FinishSizePrefixed(root, SchemaIdentifier());\n}\n\n}  // namespace reflection\n\n#endif  // FLATBUFFERS_GENERATED_REFLECTION_REFLECTION_H_\n"
  },
  {
    "path": "include/flatbuffers/registry.h",
    "content": "/*\n * Copyright 2017 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_REGISTRY_H_\n#define FLATBUFFERS_REGISTRY_H_\n\n#include \"flatbuffers/base.h\"\n#include \"flatbuffers/idl.h\"\n\nnamespace flatbuffers {\n\n// Convenience class to easily parse or generate text for arbitrary FlatBuffers.\n// Simply pre-populate it with all schema filenames that may be in use, and\n// This class will look them up using the file_identifier declared in the\n// schema.\nclass Registry {\n public:\n  // Call this for all schemas that may be in use. The identifier has\n  // a function in the generated code, e.g. MonsterIdentifier().\n  void Register(const char* file_identifier, const char* schema_path) {\n    Schema schema;\n    schema.path_ = schema_path;\n    schemas_[file_identifier] = schema;\n  }\n\n  // Generate text from an arbitrary FlatBuffer by looking up its\n  // file_identifier in the registry.\n  bool FlatBufferToText(const uint8_t* flatbuf, size_t len, std::string* dest) {\n    // Get the identifier out of the buffer.\n    // If the buffer is truncated, exit.\n    if (len < sizeof(uoffset_t) + kFileIdentifierLength) {\n      lasterror_ = \"buffer truncated\";\n      return false;\n    }\n    std::string ident(\n        reinterpret_cast<const char*>(flatbuf) + sizeof(uoffset_t),\n        kFileIdentifierLength);\n    // Load and parse the schema.\n    Parser parser;\n    if (!LoadSchema(ident, &parser)) return false;\n    // Now we're ready to generate text.\n    auto err = GenText(parser, flatbuf, dest);\n    if (err) {\n      lasterror_ =\n          \"unable to generate text for FlatBuffer binary: \" + std::string(err);\n      return false;\n    }\n    return true;\n  }\n\n  // Converts a binary buffer to text using one of the schemas in the registry,\n  // use the file_identifier to indicate which.\n  // If DetachedBuffer::data() is null then parsing failed.\n  DetachedBuffer TextToFlatBuffer(const char* text,\n                                  const char* file_identifier) {\n    // Load and parse the schema.\n    Parser parser;\n    if (!LoadSchema(file_identifier, &parser)) return DetachedBuffer();\n    // Parse the text.\n    if (!parser.Parse(text)) {\n      lasterror_ = parser.error_;\n      return DetachedBuffer();\n    }\n    // We have a valid FlatBuffer. Detach it from the builder and return.\n    return parser.builder_.Release();\n  }\n\n  // Modify any parsing / output options used by the other functions.\n  void SetOptions(const IDLOptions& opts) { opts_ = opts; }\n\n  // If schemas used contain include statements, call this function for every\n  // directory the parser should search them for.\n  void AddIncludeDirectory(const char* path) { include_paths_.push_back(path); }\n\n  // Returns a human readable error if any of the above functions fail.\n  const std::string& GetLastError() { return lasterror_; }\n\n private:\n  bool LoadSchema(const std::string& ident, Parser* parser) {\n    // Find the schema, if not, exit.\n    auto it = schemas_.find(ident);\n    if (it == schemas_.end()) {\n      // Don't attach the identifier, since it may not be human readable.\n      lasterror_ = \"identifier for this buffer not in the registry\";\n      return false;\n    }\n    auto& schema = it->second;\n    // Load the schema from disk. If not, exit.\n    std::string schematext;\n    if (!LoadFile(schema.path_.c_str(), false, &schematext)) {\n      lasterror_ = \"could not load schema: \" + schema.path_;\n      return false;\n    }\n    // Parse schema.\n    parser->opts = opts_;\n    if (!parser->Parse(schematext.c_str(), include_paths_.data(),\n                       schema.path_.c_str())) {\n      lasterror_ = parser->error_;\n      return false;\n    }\n    return true;\n  }\n\n  struct Schema {\n    std::string path_;\n    // TODO(wvo) optionally cache schema file or parsed schema here.\n  };\n\n  std::string lasterror_;\n  IDLOptions opts_;\n  std::vector<const char*> include_paths_;\n  std::map<std::string, Schema> schemas_;\n};\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_REGISTRY_H_\n"
  },
  {
    "path": "include/flatbuffers/stl_emulation.h",
    "content": "/*\n * Copyright 2017 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_STL_EMULATION_H_\n#define FLATBUFFERS_STL_EMULATION_H_\n\n// clang-format off\n#include \"flatbuffers/base.h\"\n\n#include <string>\n#include <type_traits>\n#include <vector>\n#include <memory>\n#include <limits>\n\n#ifndef FLATBUFFERS_USE_STD_OPTIONAL\n  // Detect C++17 compatible compiler.\n  // __cplusplus >= 201703L - a compiler has support of 'static inline' variables.\n  #if (defined(__cplusplus) && __cplusplus >= 201703L) \\\n      || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)\n    #define FLATBUFFERS_USE_STD_OPTIONAL 1\n  #else\n    #define FLATBUFFERS_USE_STD_OPTIONAL 0\n  #endif // (defined(__cplusplus) && __cplusplus >= 201703L) ...\n#endif // FLATBUFFERS_USE_STD_OPTIONAL\n\n#if FLATBUFFERS_USE_STD_OPTIONAL\n  #include <optional>\n#endif\n\n#ifndef FLATBUFFERS_USE_STD_SPAN\n  // Testing __cpp_lib_span requires including either <version> or <span>,\n  // both of which were added in C++20.\n  // See: https://en.cppreference.com/w/cpp/utility/feature_test\n  #if defined(__cplusplus) && __cplusplus >= 202002L \\\n      || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L)\n    #if __has_include(<span>)\n      #define FLATBUFFERS_USE_STD_SPAN 1\n    #endif\n  #endif\n#endif // FLATBUFFERS_USE_STD_SPAN\n\n#if defined(FLATBUFFERS_USE_STD_SPAN)\n  #include <array>\n  #include <span>\n#else\n  // Disable non-trivial ctors if FLATBUFFERS_SPAN_MINIMAL defined.\n  #if !defined(FLATBUFFERS_TEMPLATES_ALIASES)\n    #define FLATBUFFERS_SPAN_MINIMAL\n  #else\n    // Enable implicit construction of a span<T,N> from a std::array<T,N>.\n    #include <array>\n  #endif\n#endif // defined(FLATBUFFERS_USE_STD_SPAN)\n\n// This header provides backwards compatibility for older versions of the STL.\nnamespace flatbuffers {\n\n#if defined(FLATBUFFERS_TEMPLATES_ALIASES)\n  template <typename T>\n  using numeric_limits = std::numeric_limits<T>;\n#else\n  template <typename T> class numeric_limits :\n    public std::numeric_limits<T> {};\n#endif  // defined(FLATBUFFERS_TEMPLATES_ALIASES)\n\n#if defined(FLATBUFFERS_TEMPLATES_ALIASES)\n  template <typename T> using is_scalar = std::is_scalar<T>;\n  template <typename T, typename U> using is_same = std::is_same<T,U>;\n  template <typename T> using is_floating_point = std::is_floating_point<T>;\n  template <typename T> using is_unsigned = std::is_unsigned<T>;\n  template <typename T> using is_enum = std::is_enum<T>;\n  template <typename T> using make_unsigned = std::make_unsigned<T>;\n  template<bool B, class T, class F>\n  using conditional = std::conditional<B, T, F>;\n  template<class T, T v>\n  using integral_constant = std::integral_constant<T, v>;\n  template <bool B>\n  using bool_constant = integral_constant<bool, B>;\n  using true_type  = std::true_type;\n  using false_type = std::false_type;\n#else\n  // MSVC 2010 doesn't support C++11 aliases.\n  template <typename T> struct is_scalar : public std::is_scalar<T> {};\n  template <typename T, typename U> struct is_same : public std::is_same<T,U> {};\n  template <typename T> struct is_floating_point :\n        public std::is_floating_point<T> {};\n  template <typename T> struct is_unsigned : public std::is_unsigned<T> {};\n  template <typename T> struct is_enum : public std::is_enum<T> {};\n  template <typename T> struct make_unsigned : public std::make_unsigned<T> {};\n  template<bool B, class T, class F>\n  struct conditional : public std::conditional<B, T, F> {};\n  template<class T, T v>\n  struct integral_constant : public std::integral_constant<T, v> {};\n  template <bool B>\n  struct bool_constant : public integral_constant<bool, B> {};\n  typedef bool_constant<true>  true_type;\n  typedef bool_constant<false> false_type;\n#endif  // defined(FLATBUFFERS_TEMPLATES_ALIASES)\n\n#if defined(FLATBUFFERS_TEMPLATES_ALIASES)\n  template <class T> using unique_ptr = std::unique_ptr<T>;\n#else\n  // MSVC 2010 doesn't support C++11 aliases.\n  // We're manually \"aliasing\" the class here as we want to bring unique_ptr\n  // into the flatbuffers namespace.  We have unique_ptr in the flatbuffers\n  // namespace we have a completely independent implementation (see below)\n  // for C++98 STL implementations.\n  template <class T> class unique_ptr : public std::unique_ptr<T> {\n    public:\n    unique_ptr() {}\n    explicit unique_ptr(T* p) : std::unique_ptr<T>(p) {}\n    unique_ptr(std::unique_ptr<T>&& u) { *this = std::move(u); }\n    unique_ptr(unique_ptr&& u) { *this = std::move(u); }\n    unique_ptr& operator=(std::unique_ptr<T>&& u) {\n      std::unique_ptr<T>::reset(u.release());\n      return *this;\n    }\n    unique_ptr& operator=(unique_ptr&& u) {\n      std::unique_ptr<T>::reset(u.release());\n      return *this;\n    }\n    unique_ptr& operator=(T* p) {\n      return std::unique_ptr<T>::operator=(p);\n    }\n  };\n#endif  // defined(FLATBUFFERS_TEMPLATES_ALIASES)\n\n#if FLATBUFFERS_USE_STD_OPTIONAL\ntemplate<class T>\nusing Optional = std::optional<T>;\nusing nullopt_t = std::nullopt_t;\ninline constexpr nullopt_t nullopt = std::nullopt;\n\n#else\n// Limited implementation of Optional<T> type for a scalar T.\n// This implementation limited by trivial types compatible with\n// std::is_arithmetic<T> or std::is_enum<T> type traits.\n\n// A tag to indicate an empty flatbuffers::optional<T>.\nstruct nullopt_t {\n  explicit FLATBUFFERS_CONSTEXPR_CPP11 nullopt_t(int) {}\n};\n\n#if defined(FLATBUFFERS_CONSTEXPR_DEFINED)\n  namespace internal {\n    template <class> struct nullopt_holder {\n      static constexpr nullopt_t instance_ = nullopt_t(0);\n    };\n    template<class Dummy>\n    constexpr nullopt_t nullopt_holder<Dummy>::instance_;\n  }\n  static constexpr const nullopt_t &nullopt = internal::nullopt_holder<void>::instance_;\n\n#else\n  namespace internal {\n    template <class> struct nullopt_holder {\n      static const nullopt_t instance_;\n    };\n    template<class Dummy>\n    const nullopt_t nullopt_holder<Dummy>::instance_  = nullopt_t(0);\n  }\n  static const nullopt_t &nullopt = internal::nullopt_holder<void>::instance_;\n\n#endif\n\ntemplate<class T>\nclass Optional FLATBUFFERS_FINAL_CLASS {\n  // Non-scalar 'T' would extremely complicated Optional<T>.\n  // Use is_scalar<T> checking because flatbuffers flatbuffers::is_arithmetic<T>\n  // isn't implemented.\n  static_assert(flatbuffers::is_scalar<T>::value, \"unexpected type T\");\n\n public:\n  ~Optional() {}\n\n  FLATBUFFERS_CONSTEXPR_CPP11 Optional() FLATBUFFERS_NOEXCEPT\n    : value_(), has_value_(false) {}\n\n  FLATBUFFERS_CONSTEXPR_CPP11 Optional(nullopt_t) FLATBUFFERS_NOEXCEPT\n    : value_(), has_value_(false) {}\n\n  FLATBUFFERS_CONSTEXPR_CPP11 Optional(T val) FLATBUFFERS_NOEXCEPT\n    : value_(val), has_value_(true) {}\n\n  FLATBUFFERS_CONSTEXPR_CPP11 Optional(const Optional &other) FLATBUFFERS_NOEXCEPT\n    : value_(other.value_), has_value_(other.has_value_) {}\n\n  FLATBUFFERS_CONSTEXPR_CPP14 Optional &operator=(const Optional &other) FLATBUFFERS_NOEXCEPT {\n    value_ = other.value_;\n    has_value_ = other.has_value_;\n    return *this;\n  }\n\n  FLATBUFFERS_CONSTEXPR_CPP14 Optional &operator=(nullopt_t) FLATBUFFERS_NOEXCEPT {\n    value_ = T();\n    has_value_ = false;\n    return *this;\n  }\n\n  FLATBUFFERS_CONSTEXPR_CPP14 Optional &operator=(T val) FLATBUFFERS_NOEXCEPT {\n    value_ = val;\n    has_value_ = true;\n    return *this;\n  }\n\n  void reset() FLATBUFFERS_NOEXCEPT {\n    *this = nullopt;\n  }\n\n  void swap(Optional &other) FLATBUFFERS_NOEXCEPT {\n    std::swap(value_, other.value_);\n    std::swap(has_value_, other.has_value_);\n  }\n\n  FLATBUFFERS_CONSTEXPR_CPP11 FLATBUFFERS_EXPLICIT_CPP11 operator bool() const FLATBUFFERS_NOEXCEPT {\n    return has_value_;\n  }\n\n  FLATBUFFERS_CONSTEXPR_CPP11 bool has_value() const FLATBUFFERS_NOEXCEPT {\n    return has_value_;\n  }\n\n  FLATBUFFERS_CONSTEXPR_CPP11 const T& operator*() const FLATBUFFERS_NOEXCEPT {\n    return value_;\n  }\n\n  const T& value() const {\n    FLATBUFFERS_ASSERT(has_value());\n    return value_;\n  }\n\n  T value_or(T default_value) const FLATBUFFERS_NOEXCEPT {\n    return has_value() ? value_ : default_value;\n  }\n\n private:\n  T value_;\n  bool has_value_;\n};\n\ntemplate<class T>\nFLATBUFFERS_CONSTEXPR_CPP11 bool operator==(const Optional<T>& opt, nullopt_t) FLATBUFFERS_NOEXCEPT {\n  return !opt;\n}\ntemplate<class T>\nFLATBUFFERS_CONSTEXPR_CPP11 bool operator==(nullopt_t, const Optional<T>& opt) FLATBUFFERS_NOEXCEPT {\n  return !opt;\n}\n\ntemplate<class T, class U>\nFLATBUFFERS_CONSTEXPR_CPP11 bool operator==(const Optional<T>& lhs, const U& rhs) FLATBUFFERS_NOEXCEPT {\n  return static_cast<bool>(lhs) && (*lhs == rhs);\n}\n\ntemplate<class T, class U>\nFLATBUFFERS_CONSTEXPR_CPP11 bool operator==(const T& lhs, const Optional<U>& rhs) FLATBUFFERS_NOEXCEPT {\n  return static_cast<bool>(rhs) && (lhs == *rhs);\n}\n\ntemplate<class T, class U>\nFLATBUFFERS_CONSTEXPR_CPP11 bool operator==(const Optional<T>& lhs, const Optional<U>& rhs) FLATBUFFERS_NOEXCEPT {\n  return static_cast<bool>(lhs) != static_cast<bool>(rhs)\n              ? false\n              : !static_cast<bool>(lhs) ? true : (*lhs == *rhs);\n}\n#endif // FLATBUFFERS_USE_STD_OPTIONAL\n\n\n// Very limited and naive partial implementation of C++20 std::span<T,Extent>.\n#if defined(FLATBUFFERS_USE_STD_SPAN)\n  inline constexpr std::size_t dynamic_extent = std::dynamic_extent;\n  template<class T, std::size_t Extent = std::dynamic_extent>\n  using span = std::span<T, Extent>;\n\n#else // !defined(FLATBUFFERS_USE_STD_SPAN)\nFLATBUFFERS_CONSTEXPR std::size_t dynamic_extent = static_cast<std::size_t>(-1);\n\n// Exclude this code if MSVC2010 or non-STL Android is active.\n// The non-STL Android doesn't have `std::is_convertible` required for SFINAE.\n#if !defined(FLATBUFFERS_SPAN_MINIMAL)\nnamespace internal {\n  // This is SFINAE helper class for checking of a common condition:\n  // > This overload only participates in overload resolution\n  // > Check whether a pointer to an array of From can be converted\n  // > to a pointer to an array of To.\n  // This helper is used for checking of 'From -> const From'.\n  template<class To, std::size_t Extent, class From, std::size_t N>\n  struct is_span_convertible {\n    using type =\n      typename std::conditional<std::is_convertible<From (*)[], To (*)[]>::value\n                                && (Extent == dynamic_extent || N == Extent),\n                                int, void>::type;\n  };\n\n  template<typename T>\n  struct SpanIterator {\n    // TODO: upgrade to std::random_access_iterator_tag.\n    using iterator_category = std::forward_iterator_tag;\n    using difference_type  = std::ptrdiff_t;\n    using value_type = typename std::remove_cv<T>::type;\n    using reference = T&;\n    using pointer   = T*;\n\n    // Convince MSVC compiler that this iterator is trusted (it is verified).\n    #ifdef _MSC_VER\n      using _Unchecked_type = pointer;\n    #endif // _MSC_VER\n\n    SpanIterator(pointer ptr) : ptr_(ptr) {}\n    reference operator*() const { return *ptr_; }\n    pointer operator->() { return ptr_; }\n    SpanIterator& operator++() { ptr_++; return *this; }\n    SpanIterator  operator++(int) { auto tmp = *this; ++(*this); return tmp; }\n\n    friend bool operator== (const SpanIterator& lhs, const SpanIterator& rhs) { return lhs.ptr_ == rhs.ptr_; }\n    friend bool operator!= (const SpanIterator& lhs, const SpanIterator& rhs) { return lhs.ptr_ != rhs.ptr_; }\n\n   private:\n    pointer ptr_;\n  };\n}  // namespace internal\n#endif  // !defined(FLATBUFFERS_SPAN_MINIMAL)\n\n// T - element type; must be a complete type that is not an abstract\n// class type.\n// Extent - the number of elements in the sequence, or dynamic.\ntemplate<class T, std::size_t Extent = dynamic_extent>\nclass span FLATBUFFERS_FINAL_CLASS {\n public:\n  typedef T element_type;\n  typedef T& reference;\n  typedef const T& const_reference;\n  typedef T* pointer;\n  typedef const T* const_pointer;\n  typedef std::size_t size_type;\n\n  static FLATBUFFERS_CONSTEXPR size_type extent = Extent;\n\n  // Returns the number of elements in the span.\n  FLATBUFFERS_CONSTEXPR_CPP11 size_type size() const FLATBUFFERS_NOEXCEPT {\n    return count_;\n  }\n\n  // Returns the size of the sequence in bytes.\n  FLATBUFFERS_CONSTEXPR_CPP11\n  size_type size_bytes() const FLATBUFFERS_NOEXCEPT {\n    return size() * sizeof(element_type);\n  }\n\n  // Checks if the span is empty.\n  FLATBUFFERS_CONSTEXPR_CPP11 bool empty() const FLATBUFFERS_NOEXCEPT {\n    return size() == 0;\n  }\n\n  // Returns a pointer to the beginning of the sequence.\n  FLATBUFFERS_CONSTEXPR_CPP11 pointer data() const FLATBUFFERS_NOEXCEPT {\n    return data_;\n  }\n\n  #if !defined(FLATBUFFERS_SPAN_MINIMAL)\n    using Iterator = internal::SpanIterator<T>;\n\n    Iterator begin() const { return Iterator(data()); }\n    Iterator end() const   { return Iterator(data() + size()); }\n  #endif\n\n  // Returns a reference to the idx-th element of the sequence.\n  // The behavior is undefined if the idx is greater than or equal to size().\n  FLATBUFFERS_CONSTEXPR_CPP11 reference operator[](size_type idx) const {\n    return data()[idx];\n  }\n\n  FLATBUFFERS_CONSTEXPR_CPP11 span(const span &other) FLATBUFFERS_NOEXCEPT\n      : data_(other.data_), count_(other.count_) {}\n\n  FLATBUFFERS_CONSTEXPR_CPP14 span &operator=(const span &other)\n      FLATBUFFERS_NOEXCEPT {\n    data_ = other.data_;\n    count_ = other.count_;\n  }\n\n  // Limited implementation of\n  // `template <class It> constexpr std::span(It first, size_type count);`.\n  //\n  // Constructs a span that is a view over the range [first, first + count);\n  // the resulting span has: data() == first and size() == count.\n  // The behavior is undefined if [first, first + count) is not a valid range,\n  // or if (extent != flatbuffers::dynamic_extent && count != extent).\n  FLATBUFFERS_CONSTEXPR_CPP11\n  explicit span(pointer first, size_type count) FLATBUFFERS_NOEXCEPT\n    : data_ (Extent == dynamic_extent ? first : (Extent == count ? first : nullptr)),\n      count_(Extent == dynamic_extent ? count : (Extent == count ? Extent : 0)) {\n      // Make span empty if the count argument is incompatible with span<T,N>.\n  }\n\n  // Exclude this code if MSVC2010 is active. The MSVC2010 isn't C++11\n  // compliant, it doesn't support default template arguments for functions.\n  #if defined(FLATBUFFERS_SPAN_MINIMAL)\n  FLATBUFFERS_CONSTEXPR_CPP11 span() FLATBUFFERS_NOEXCEPT : data_(nullptr),\n                                                            count_(0) {\n    static_assert(extent == 0 || extent == dynamic_extent, \"invalid span\");\n  }\n\n  #else\n  // Constructs an empty span whose data() == nullptr and size() == 0.\n  // This overload only participates in overload resolution if\n  // extent == 0 || extent == flatbuffers::dynamic_extent.\n  // A dummy template argument N is need dependency for SFINAE.\n  template<std::size_t N = 0,\n    typename internal::is_span_convertible<element_type, Extent, element_type, (N - N)>::type = 0>\n  FLATBUFFERS_CONSTEXPR_CPP11 span() FLATBUFFERS_NOEXCEPT : data_(nullptr),\n                                                            count_(0) {\n    static_assert(extent == 0 || extent == dynamic_extent, \"invalid span\");\n  }\n\n  // Constructs a span that is a view over the array arr; the resulting span\n  // has size() == N and data() == std::data(arr). These overloads only\n  // participate in overload resolution if\n  // extent == std::dynamic_extent || N == extent is true and\n  // std::remove_pointer_t<decltype(std::data(arr))>(*)[]\n  // is convertible to element_type (*)[].\n  template<std::size_t N,\n    typename internal::is_span_convertible<element_type, Extent, element_type, N>::type = 0>\n  FLATBUFFERS_CONSTEXPR_CPP11 span(element_type (&arr)[N]) FLATBUFFERS_NOEXCEPT\n      : data_(arr), count_(N) {}\n\n  template<class U, std::size_t N,\n    typename internal::is_span_convertible<element_type, Extent, U, N>::type = 0>\n  FLATBUFFERS_CONSTEXPR_CPP11 span(std::array<U, N> &arr) FLATBUFFERS_NOEXCEPT\n     : data_(arr.data()), count_(N) {}\n\n  //template<class U, std::size_t N,\n  //  int = 0>\n  //FLATBUFFERS_CONSTEXPR_CPP11 span(std::array<U, N> &arr) FLATBUFFERS_NOEXCEPT\n  //   : data_(arr.data()), count_(N) {}\n\n  template<class U, std::size_t N,\n    typename internal::is_span_convertible<element_type, Extent, U, N>::type = 0>\n  FLATBUFFERS_CONSTEXPR_CPP11 span(const std::array<U, N> &arr) FLATBUFFERS_NOEXCEPT\n    : data_(arr.data()), count_(N) {}\n\n  // Converting constructor from another span s;\n  // the resulting span has size() == s.size() and data() == s.data().\n  // This overload only participates in overload resolution\n  // if extent == std::dynamic_extent || N == extent is true and U (*)[]\n  // is convertible to element_type (*)[].\n  template<class U, std::size_t N,\n    typename internal::is_span_convertible<element_type, Extent, U, N>::type = 0>\n  FLATBUFFERS_CONSTEXPR_CPP11 span(const flatbuffers::span<U, N> &s) FLATBUFFERS_NOEXCEPT\n      : span(s.data(), s.size()) {\n  }\n\n  #endif  // !defined(FLATBUFFERS_SPAN_MINIMAL)\n\n private:\n  // This is a naive implementation with 'count_' member even if (Extent != dynamic_extent).\n  pointer const data_;\n  size_type count_;\n};\n#endif  // defined(FLATBUFFERS_USE_STD_SPAN)\n\n#if !defined(FLATBUFFERS_SPAN_MINIMAL)\ntemplate<class ElementType, std::size_t Extent>\nFLATBUFFERS_CONSTEXPR_CPP11\nflatbuffers::span<ElementType, Extent> make_span(ElementType(&arr)[Extent]) FLATBUFFERS_NOEXCEPT {\n  return span<ElementType, Extent>(arr);\n}\n\ntemplate<class ElementType, std::size_t Extent>\nFLATBUFFERS_CONSTEXPR_CPP11\nflatbuffers::span<const ElementType, Extent> make_span(const ElementType(&arr)[Extent]) FLATBUFFERS_NOEXCEPT {\n  return span<const ElementType, Extent>(arr);\n}\n\ntemplate<class ElementType, std::size_t Extent>\nFLATBUFFERS_CONSTEXPR_CPP11\nflatbuffers::span<ElementType, Extent> make_span(std::array<ElementType, Extent> &arr) FLATBUFFERS_NOEXCEPT {\n  return span<ElementType, Extent>(arr);\n}\n\ntemplate<class ElementType, std::size_t Extent>\nFLATBUFFERS_CONSTEXPR_CPP11\nflatbuffers::span<const ElementType, Extent> make_span(const std::array<ElementType, Extent> &arr) FLATBUFFERS_NOEXCEPT {\n  return span<const ElementType, Extent>(arr);\n}\n\ntemplate<class ElementType, std::size_t Extent>\nFLATBUFFERS_CONSTEXPR_CPP11\nflatbuffers::span<ElementType, dynamic_extent> make_span(ElementType *first, std::size_t count) FLATBUFFERS_NOEXCEPT {\n  return span<ElementType, dynamic_extent>(first, count);\n}\n\ntemplate<class ElementType, std::size_t Extent>\nFLATBUFFERS_CONSTEXPR_CPP11\nflatbuffers::span<const ElementType, dynamic_extent> make_span(const ElementType *first, std::size_t count) FLATBUFFERS_NOEXCEPT {\n  return span<const ElementType, dynamic_extent>(first, count);\n}\n#endif // !defined(FLATBUFFERS_SPAN_MINIMAL)\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_STL_EMULATION_H_\n"
  },
  {
    "path": "include/flatbuffers/string.h",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_STRING_H_\n#define FLATBUFFERS_STRING_H_\n\n#include \"flatbuffers/base.h\"\n#include \"flatbuffers/vector.h\"\n\nnamespace flatbuffers {\n\nstruct String : public Vector<char> {\n  const char* c_str() const { return reinterpret_cast<const char*>(Data()); }\n  std::string str() const { return std::string(c_str(), size()); }\n\n  // clang-format off\n  #ifdef FLATBUFFERS_HAS_STRING_VIEW\n  flatbuffers::string_view string_view() const {\n    return flatbuffers::string_view(c_str(), size());\n  }\n\n  /* implicit */\n  operator flatbuffers::string_view() const {\n    return flatbuffers::string_view(c_str(), size());\n  }\n  #endif // FLATBUFFERS_HAS_STRING_VIEW\n  // clang-format on\n\n  bool operator<(const String& o) const {\n    return StringLessThan(this->data(), this->size(), o.data(), o.size());\n  }\n};\n\n// Convenience function to get std::string from a String returning an empty\n// string on null pointer.\nstatic inline std::string GetString(const String* str) {\n  return str ? str->str() : \"\";\n}\n\n// Convenience function to get char* from a String returning an empty string on\n// null pointer.\nstatic inline const char* GetCstring(const String* str) {\n  return str ? str->c_str() : \"\";\n}\n\n#ifdef FLATBUFFERS_HAS_STRING_VIEW\n// Convenience function to get string_view from a String returning an empty\n// string_view on null pointer.\nstatic inline flatbuffers::string_view GetStringView(const String* str) {\n  return str ? str->string_view() : flatbuffers::string_view();\n}\n#endif  // FLATBUFFERS_HAS_STRING_VIEW\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_STRING_H_\n"
  },
  {
    "path": "include/flatbuffers/struct.h",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_STRUCT_H_\n#define FLATBUFFERS_STRUCT_H_\n\n#include \"flatbuffers/base.h\"\n\nnamespace flatbuffers {\n\n// \"structs\" are flat structures that do not have an offset table, thus\n// always have all members present and do not support forwards/backwards\n// compatible extensions.\n\nclass Struct FLATBUFFERS_FINAL_CLASS {\n public:\n  template <typename T>\n  T GetField(uoffset_t o) const {\n    return ReadScalar<T>(&data_[o]);\n  }\n\n  template <typename T>\n  T GetStruct(uoffset_t o) const {\n    return reinterpret_cast<T>(&data_[o]);\n  }\n\n  const uint8_t* GetAddressOf(uoffset_t o) const { return &data_[o]; }\n  uint8_t* GetAddressOf(uoffset_t o) { return &data_[o]; }\n\n private:\n  // private constructor & copy constructor: you obtain instances of this\n  // class by pointing to existing data only\n  Struct();\n  Struct(const Struct&);\n  Struct& operator=(const Struct&);\n\n  uint8_t data_[1];\n};\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_STRUCT_H_\n"
  },
  {
    "path": "include/flatbuffers/table.h",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_TABLE_H_\n#define FLATBUFFERS_TABLE_H_\n\n#include \"flatbuffers/base.h\"\n#include \"flatbuffers/vector.h\"\n#include \"flatbuffers/verifier.h\"\n\nnamespace flatbuffers {\n\n// \"tables\" use an offset table (possibly shared) that allows fields to be\n// omitted and added at will, but uses an extra indirection to read.\nclass Table {\n public:\n  const uint8_t* GetVTable() const {\n    return data_ - ReadScalar<soffset_t>(data_);\n  }\n\n  // This gets the field offset for any of the functions below it, or 0\n  // if the field was not present.\n  voffset_t GetOptionalFieldOffset(voffset_t field) const {\n    // The vtable offset is always at the start.\n    auto vtable = GetVTable();\n    // The first element is the size of the vtable (fields + type id + itself).\n    auto vtsize = ReadScalar<voffset_t>(vtable);\n    // If the field we're accessing is outside the vtable, we're reading older\n    // data, so it's the same as if the offset was 0 (not present).\n    return field < vtsize ? ReadScalar<voffset_t>(vtable + field) : 0;\n  }\n\n  template <typename T>\n  T GetField(voffset_t field, T defaultval) const {\n    auto field_offset = GetOptionalFieldOffset(field);\n    return field_offset ? ReadScalar<T>(data_ + field_offset) : defaultval;\n  }\n\n  template <typename P, typename OffsetSize = uoffset_t>\n  P GetPointer(voffset_t field) {\n    auto field_offset = GetOptionalFieldOffset(field);\n    auto p = data_ + field_offset;\n    return field_offset ? reinterpret_cast<P>(p + ReadScalar<OffsetSize>(p))\n                        : nullptr;\n  }\n  template <typename P, typename OffsetSize = uoffset_t>\n  P GetPointer(voffset_t field) const {\n    return const_cast<Table*>(this)->GetPointer<P, OffsetSize>(field);\n  }\n\n  template <typename P>\n  P GetPointer64(voffset_t field) {\n    return GetPointer<P, uoffset64_t>(field);\n  }\n\n  template <typename P>\n  P GetPointer64(voffset_t field) const {\n    return GetPointer<P, uoffset64_t>(field);\n  }\n\n  template <typename P, typename SizeT = uoffset_t,\n            typename OffsetSize = uoffset_t>\n  const Vector<P, SizeT>* GetVectorPointerOrEmpty(voffset_t field) const {\n    auto* ptr = GetPointer<const Vector<P, SizeT>*, OffsetSize>(field);\n    return ptr ? ptr : EmptyVector<P, SizeT>();\n  }\n\n  template <typename P, typename SizeT = uoffset_t>\n  const Vector<P, SizeT>* GetVectorPointer64OrEmpty(voffset_t field) const {\n    return GetVectorPointerOrEmpty<P, SizeT, uoffset64_t>(field);\n  }\n\n  template <typename P, typename SizeT = uoffset_t,\n            typename OffsetSize = uoffset_t>\n  Vector<P, SizeT>* GetMutableVectorPointerOrEmpty(voffset_t field) {\n    auto* ptr = GetPointer<Vector<P, SizeT>*, OffsetSize>(field);\n    // This is a const_cast, but safe, since all mutable operations on an\n    // empty vector are NOPs.\n    return ptr ? ptr : const_cast<Vector<P, SizeT>*>(EmptyVector<P, SizeT>());\n  }\n\n  template <typename P, typename SizeT = uoffset_t>\n  Vector<P, SizeT>* GetMutableVectorPointer64OrEmpty(voffset_t field) {\n    return GetMutableVectorPointerOrEmpty<P, SizeT, uoffset64_t>(field);\n  }\n\n  template <typename P>\n  P GetStruct(voffset_t field) const {\n    auto field_offset = GetOptionalFieldOffset(field);\n    auto p = const_cast<uint8_t*>(data_ + field_offset);\n    return field_offset ? reinterpret_cast<P>(p) : nullptr;\n  }\n\n  template <typename Raw, typename Face>\n  flatbuffers::Optional<Face> GetOptional(voffset_t field) const {\n    auto field_offset = GetOptionalFieldOffset(field);\n    auto p = data_ + field_offset;\n    return field_offset ? Optional<Face>(static_cast<Face>(ReadScalar<Raw>(p)))\n                        : Optional<Face>();\n  }\n\n  template <typename T>\n  bool SetField(voffset_t field, T val, T def) {\n    auto field_offset = GetOptionalFieldOffset(field);\n    if (!field_offset) return IsTheSameAs(val, def);\n    WriteScalar(data_ + field_offset, val);\n    return true;\n  }\n  template <typename T>\n  bool SetField(voffset_t field, T val) {\n    auto field_offset = GetOptionalFieldOffset(field);\n    if (!field_offset) return false;\n    WriteScalar(data_ + field_offset, val);\n    return true;\n  }\n\n  bool SetPointer(voffset_t field, const uint8_t* val) {\n    auto field_offset = GetOptionalFieldOffset(field);\n    if (!field_offset) return false;\n    WriteScalar(data_ + field_offset,\n                static_cast<uoffset_t>(val - (data_ + field_offset)));\n    return true;\n  }\n\n  uint8_t* GetAddressOf(voffset_t field) {\n    auto field_offset = GetOptionalFieldOffset(field);\n    return field_offset ? data_ + field_offset : nullptr;\n  }\n  const uint8_t* GetAddressOf(voffset_t field) const {\n    return const_cast<Table*>(this)->GetAddressOf(field);\n  }\n\n  bool CheckField(voffset_t field) const {\n    return GetOptionalFieldOffset(field) != 0;\n  }\n\n  // Verify the vtable of this table.\n  // Call this once per table, followed by VerifyField once per field.\n  template <bool B>\n  bool VerifyTableStart(VerifierTemplate<B>& verifier) const {\n    return verifier.VerifyTableStart(data_);\n  }\n\n  // Verify a particular field.\n  template <typename T, bool B>\n  bool VerifyField(const VerifierTemplate<B>& verifier, voffset_t field,\n                   size_t align) const {\n    // Calling GetOptionalFieldOffset should be safe now thanks to\n    // VerifyTable().\n    auto field_offset = GetOptionalFieldOffset(field);\n    // Check the actual field.\n    return !field_offset ||\n           verifier.template VerifyField<T>(data_, field_offset, align);\n  }\n\n  // VerifyField for required fields.\n  template <typename T, bool B>\n  bool VerifyFieldRequired(const VerifierTemplate<B>& verifier, voffset_t field,\n                           size_t align) const {\n    auto field_offset = GetOptionalFieldOffset(field);\n    return verifier.Check(field_offset != 0) &&\n           verifier.template VerifyField<T>(data_, field_offset, align);\n  }\n\n  // Versions for offsets.\n  template <typename OffsetT = uoffset_t, bool B = false>\n  bool VerifyOffset(const VerifierTemplate<B>& verifier,\n                    voffset_t field) const {\n    auto field_offset = GetOptionalFieldOffset(field);\n    return !field_offset ||\n           verifier.template VerifyOffset<OffsetT>(data_, field_offset);\n  }\n\n  template <typename OffsetT = uoffset_t, bool B = false>\n  bool VerifyOffsetRequired(const VerifierTemplate<B>& verifier,\n                            voffset_t field) const {\n    auto field_offset = GetOptionalFieldOffset(field);\n    return verifier.Check(field_offset != 0) &&\n           verifier.template VerifyOffset<OffsetT>(data_, field_offset);\n  }\n\n  template <bool B>\n  bool VerifyOffset64(const VerifierTemplate<B>& verifier,\n                      voffset_t field) const {\n    return VerifyOffset<uoffset64_t>(verifier, field);\n  }\n\n  template <bool B>\n  bool VerifyOffset64Required(const VerifierTemplate<B>& verifier,\n                              voffset_t field) const {\n    return VerifyOffsetRequired<uoffset64_t>(verifier, field);\n  }\n\n  // Verify a string that may have a default value.\n  template <typename OffsetT = uoffset_t>\n  bool VerifyStringWithDefault(const Verifier& verifier,\n                               voffset_t field) const {\n    auto field_offset = GetOptionalFieldOffset(field);\n    return field_offset == 0 ||\n           verifier.VerifyString(GetPointer<const String*, OffsetT>(field));\n  }\n\n  // Verify a vector that has a default empty value.\n  template <typename P, typename SizeT = uoffset_t,\n            typename OffsetSize = uoffset_t>\n  bool VerifyVectorWithDefault(const Verifier& verifier,\n                               voffset_t field) const {\n    auto field_offset = GetOptionalFieldOffset(field);\n    return field_offset == 0 ||\n           verifier.VerifyVector(\n               GetPointer<const Vector<P, SizeT>*, OffsetSize>(field));\n  }\n\n  template <typename P, typename SizeT = uoffset_t>\n  bool VerifyVector64WithDefault(const Verifier& verifier,\n                                 voffset_t field) const {\n    return VerifyVectorWithDefault<P, SizeT, uoffset64_t>(verifier, field);\n  }\n\n protected:\n  template <typename T, typename SizeT = uoffset_t>\n  static const Vector<T, SizeT>* EmptyVector() {\n    static const SizeT empty_vector_length = 0;\n    return reinterpret_cast<const Vector<T, SizeT>*>(&empty_vector_length);\n  }\n\n private:\n  // private constructor & copy constructor: you obtain instances of this\n  // class by pointing to existing data only\n  Table();\n  Table(const Table& other);\n  Table& operator=(const Table&);\n\n  uint8_t data_[1];\n};\n\n// This specialization allows avoiding warnings like:\n// MSVC C4800: type: forcing value to bool 'true' or 'false'.\ntemplate <>\ninline flatbuffers::Optional<bool> Table::GetOptional<uint8_t, bool>(\n    voffset_t field) const {\n  auto field_offset = GetOptionalFieldOffset(field);\n  auto p = data_ + field_offset;\n  return field_offset ? Optional<bool>(ReadScalar<uint8_t>(p) != 0)\n                      : Optional<bool>();\n}\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_TABLE_H_\n"
  },
  {
    "path": "include/flatbuffers/util.h",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_UTIL_H_\n#define FLATBUFFERS_UTIL_H_\n\n#include <ctype.h>\n#include <errno.h>\n\n#include \"flatbuffers/base.h\"\n#include \"flatbuffers/stl_emulation.h\"\n\n#ifndef FLATBUFFERS_PREFER_PRINTF\n#include <iomanip>\n#include <sstream>\n#else  // FLATBUFFERS_PREFER_PRINTF\n#include <float.h>\n#include <stdio.h>\n#endif  // FLATBUFFERS_PREFER_PRINTF\n\n#include <cmath>\n#include <limits>\n#include <string>\n\nnamespace flatbuffers {\n\n// @locale-independent functions for ASCII characters set.\n\n// Fast checking that character lies in closed range: [a <= x <= b]\n// using one compare (conditional branch) operator.\ninline bool check_ascii_range(char x, char a, char b) {\n  FLATBUFFERS_ASSERT(a <= b);\n  // (Hacker's Delight): `a <= x <= b` <=> `(x-a) <={u} (b-a)`.\n  // The x, a, b will be promoted to int and subtracted without overflow.\n  return static_cast<unsigned int>(x - a) <= static_cast<unsigned int>(b - a);\n}\n\n// Case-insensitive isalpha\ninline bool is_alpha(char c) {\n  // ASCII only: alpha to upper case => reset bit 0x20 (~0x20 = 0xDF).\n  return check_ascii_range(c & 0xDF, 'a' & 0xDF, 'z' & 0xDF);\n}\n\n// Check for uppercase alpha\ninline bool is_alpha_upper(char c) { return check_ascii_range(c, 'A', 'Z'); }\n\n// Check (case-insensitive) that `c` is equal to alpha.\ninline bool is_alpha_char(char c, char alpha) {\n  FLATBUFFERS_ASSERT(is_alpha(alpha));\n  // ASCII only: alpha to upper case => reset bit 0x20 (~0x20 = 0xDF).\n  return ((c & 0xDF) == (alpha & 0xDF));\n}\n\n// https://en.cppreference.com/w/cpp/string/byte/isxdigit\n// isdigit and isxdigit are the only standard narrow character classification\n// functions that are not affected by the currently installed C locale. although\n// some implementations (e.g. Microsoft in 1252 codepage) may classify\n// additional single-byte characters as digits.\ninline bool is_digit(char c) { return check_ascii_range(c, '0', '9'); }\n\ninline bool is_xdigit(char c) {\n  // Replace by look-up table.\n  return is_digit(c) || check_ascii_range(c & 0xDF, 'a' & 0xDF, 'f' & 0xDF);\n}\n\n// Case-insensitive isalnum\ninline bool is_alnum(char c) { return is_alpha(c) || is_digit(c); }\n\ninline char CharToUpper(char c) {\n  return static_cast<char>(::toupper(static_cast<unsigned char>(c)));\n}\n\ninline char CharToLower(char c) {\n  return static_cast<char>(::tolower(static_cast<unsigned char>(c)));\n}\n\n// @end-locale-independent functions for ASCII character set\n\n#ifdef FLATBUFFERS_PREFER_PRINTF\ntemplate <typename T>\nsize_t IntToDigitCount(T t) {\n  size_t digit_count = 0;\n  // Count the sign for negative numbers\n  if (t < 0) digit_count++;\n  // Count a single 0 left of the dot for fractional numbers\n  if (-1 < t && t < 1) digit_count++;\n  // Count digits until fractional part\n  T eps = std::numeric_limits<T>::epsilon();\n  while (t <= (-1 + eps) || (1 - eps) <= t) {\n    t /= 10;\n    digit_count++;\n  }\n  return digit_count;\n}\n\ntemplate <typename T>\nsize_t NumToStringWidth(T t, int precision = 0) {\n  size_t string_width = IntToDigitCount(t);\n  // Count the dot for floating point numbers\n  if (precision) string_width += (precision + 1);\n  return string_width;\n}\n\ntemplate <typename T>\nstd::string NumToStringImplWrapper(T t, const char* fmt, int precision = 0) {\n  size_t string_width = NumToStringWidth(t, precision);\n  std::string s(string_width, 0x00);\n  // Allow snprintf to use std::string trailing null to detect buffer overflow\n  snprintf(const_cast<char*>(s.data()), (s.size() + 1), fmt, string_width, t);\n  return s;\n}\n#endif  // FLATBUFFERS_PREFER_PRINTF\n\n// Convert an integer or floating point value to a string.\n// In contrast to std::stringstream, \"char\" values are\n// converted to a string of digits, and we don't use scientific notation.\ntemplate <typename T>\nstd::string NumToString(T t) {\n  // clang-format off\n\n  #ifndef FLATBUFFERS_PREFER_PRINTF\n    std::stringstream ss;\n    ss << t;\n    return ss.str();\n  #else // FLATBUFFERS_PREFER_PRINTF\n    auto v = static_cast<long long>(t);\n    return NumToStringImplWrapper(v, \"%.*lld\");\n  #endif // FLATBUFFERS_PREFER_PRINTF\n  // clang-format on\n}\n// Avoid char types used as character data.\ntemplate <>\ninline std::string NumToString<signed char>(signed char t) {\n  return NumToString(static_cast<int>(t));\n}\ntemplate <>\ninline std::string NumToString<unsigned char>(unsigned char t) {\n  return NumToString(static_cast<int>(t));\n}\ntemplate <>\ninline std::string NumToString<char>(char t) {\n  return NumToString(static_cast<int>(t));\n}\n\n// Special versions for floats/doubles.\ntemplate <typename T>\nstd::string FloatToString(T t, int precision) {\n  // clang-format off\n\n  #ifndef FLATBUFFERS_PREFER_PRINTF\n    // to_string() prints different numbers of digits for floats depending on\n    // platform and isn't available on Android, so we use stringstream\n    std::stringstream ss;\n    // Use std::fixed to suppress scientific notation.\n    ss << std::fixed;\n    // Default precision is 6, we want that to be higher for doubles.\n    ss << std::setprecision(precision);\n    ss << t;\n    auto s = ss.str();\n  #else // FLATBUFFERS_PREFER_PRINTF\n    auto v = static_cast<double>(t);\n    auto s = NumToStringImplWrapper(v, \"%0.*f\", precision);\n  #endif // FLATBUFFERS_PREFER_PRINTF\n  // clang-format on\n  // Sadly, std::fixed turns \"1\" into \"1.00000\", so here we undo that.\n  auto p = s.find_last_not_of('0');\n  if (p != std::string::npos) {\n    // Strip trailing zeroes. If it is a whole number, keep one zero.\n    s.resize(p + (s[p] == '.' ? 2 : 1));\n  }\n  return s;\n}\n\ntemplate <>\ninline std::string NumToString<double>(double t) {\n  return FloatToString(t, 12);\n}\ntemplate <>\ninline std::string NumToString<float>(float t) {\n  return FloatToString(t, 6);\n}\n\n// Convert an integer value to a hexadecimal string.\n// The returned string length is always xdigits long, prefixed by 0 digits.\n// For example, IntToStringHex(0x23, 8) returns the string \"00000023\".\ninline std::string IntToStringHex(int i, int xdigits) {\n  FLATBUFFERS_ASSERT(i >= 0);\n  // clang-format off\n\n  #ifndef FLATBUFFERS_PREFER_PRINTF\n    std::stringstream ss;\n    ss << std::setw(xdigits) << std::setfill('0') << std::hex << std::uppercase\n       << i;\n    return ss.str();\n  #else // FLATBUFFERS_PREFER_PRINTF\n    return NumToStringImplWrapper(i, \"%.*X\", xdigits);\n  #endif // FLATBUFFERS_PREFER_PRINTF\n  // clang-format on\n}\n\n// clang-format off\n// Use locale independent functions {strtod_l, strtof_l, strtoll_l, strtoull_l}.\n#if defined(FLATBUFFERS_LOCALE_INDEPENDENT) && (FLATBUFFERS_LOCALE_INDEPENDENT > 0)\n  class ClassicLocale {\n    #ifdef _MSC_VER\n      typedef _locale_t locale_type;\n    #else\n      typedef locale_t locale_type;  // POSIX.1-2008 locale_t type\n    #endif\n    ClassicLocale();\n    ~ClassicLocale();\n    locale_type locale_;\n    static ClassicLocale instance_;\n  public:\n    static locale_type Get() { return instance_.locale_; }\n  };\n\n  #ifdef _MSC_VER\n    #define __strtoull_impl(s, pe, b) _strtoui64_l(s, pe, b, ClassicLocale::Get())\n    #define __strtoll_impl(s, pe, b) _strtoi64_l(s, pe, b, ClassicLocale::Get())\n    #define __strtod_impl(s, pe) _strtod_l(s, pe, ClassicLocale::Get())\n    #define __strtof_impl(s, pe) _strtof_l(s, pe, ClassicLocale::Get())\n  #else\n    #define __strtoull_impl(s, pe, b) strtoull_l(s, pe, b, ClassicLocale::Get())\n    #define __strtoll_impl(s, pe, b) strtoll_l(s, pe, b, ClassicLocale::Get())\n    #define __strtod_impl(s, pe) strtod_l(s, pe, ClassicLocale::Get())\n    #define __strtof_impl(s, pe) strtof_l(s, pe, ClassicLocale::Get())\n  #endif\n#else\n  #define __strtod_impl(s, pe) strtod(s, pe)\n  #define __strtof_impl(s, pe) static_cast<float>(strtod(s, pe))\n  #ifdef _MSC_VER\n    #define __strtoull_impl(s, pe, b) _strtoui64(s, pe, b)\n    #define __strtoll_impl(s, pe, b) _strtoi64(s, pe, b)\n  #else\n    #define __strtoull_impl(s, pe, b) strtoull(s, pe, b)\n    #define __strtoll_impl(s, pe, b) strtoll(s, pe, b)\n  #endif\n#endif\n\ninline void strtoval_impl(int64_t *val, const char *str, char **endptr,\n                                 int base) {\n    *val = __strtoll_impl(str, endptr, base);\n}\n\ninline void strtoval_impl(uint64_t *val, const char *str, char **endptr,\n                                 int base) {\n  *val = __strtoull_impl(str, endptr, base);\n}\n\ninline void strtoval_impl(double *val, const char *str, char **endptr) {\n  *val = __strtod_impl(str, endptr);\n}\n\n// UBSAN: double to float is safe if numeric_limits<float>::is_iec559 is true.\nFLATBUFFERS_SUPPRESS_UBSAN(\"float-cast-overflow\")\ninline void strtoval_impl(float *val, const char *str, char **endptr) {\n  *val = __strtof_impl(str, endptr);\n}\n#undef __strtoull_impl\n#undef __strtoll_impl\n#undef __strtod_impl\n#undef __strtof_impl\n// clang-format on\n\n// Adaptor for strtoull()/strtoll().\n// Flatbuffers accepts numbers with any count of leading zeros (-009 is -9),\n// while strtoll with base=0 interprets first leading zero as octal prefix.\n// In future, it is possible to add prefixed 0b0101.\n// 1) Checks errno code for overflow condition (out of range).\n// 2) If base <= 0, function try to detect base of number by prefix.\n//\n// Return value (like strtoull and strtoll, but reject partial result):\n// - If successful, an integer value corresponding to the str is returned.\n// - If full string conversion can't be performed, 0 is returned.\n// - If the converted value falls out of range of corresponding return type, a\n// range error occurs. In this case value MAX(T)/MIN(T) is returned.\ntemplate <typename T>\ninline bool StringToIntegerImpl(T* val, const char* const str,\n                                const int base = 0,\n                                const bool check_errno = true) {\n  // T is int64_t or uint64_T\n  FLATBUFFERS_ASSERT(str);\n  if (base <= 0) {\n    auto s = str;\n    while (*s && !is_digit(*s)) s++;\n    if (s[0] == '0' && is_alpha_char(s[1], 'X'))\n      return StringToIntegerImpl(val, str, 16, check_errno);\n    // if a prefix not match, try base=10\n    return StringToIntegerImpl(val, str, 10, check_errno);\n  } else {\n    if (check_errno) errno = 0;  // clear thread-local errno\n    auto endptr = str;\n    strtoval_impl(val, str, const_cast<char**>(&endptr), base);\n    if ((*endptr != '\\0') || (endptr == str)) {\n      *val = 0;      // erase partial result\n      return false;  // invalid string\n    }\n    // errno is out-of-range, return MAX/MIN\n    if (check_errno && errno) return false;\n    return true;\n  }\n}\n\ntemplate <typename T>\ninline bool StringToFloatImpl(T* val, const char* const str) {\n  // Type T must be either float or double.\n  FLATBUFFERS_ASSERT(str && val);\n  auto end = str;\n  strtoval_impl(val, str, const_cast<char**>(&end));\n  auto done = (end != str) && (*end == '\\0');\n  if (!done) *val = 0;  // erase partial result\n  if (done && std::isnan(*val)) {\n    *val = std::numeric_limits<T>::quiet_NaN();\n  }\n  return done;\n}\n\n// Convert a string to an instance of T.\n// Return value (matched with StringToInteger64Impl and strtod):\n// - If successful, a numeric value corresponding to the str is returned.\n// - If full string conversion can't be performed, 0 is returned.\n// - If the converted value falls out of range of corresponding return type, a\n// range error occurs. In this case value MAX(T)/MIN(T) is returned.\ntemplate <typename T>\ninline bool StringToNumber(const char* s, T* val) {\n  // Assert on `unsigned long` and `signed long` on LP64.\n  // If it is necessary, it could be solved with flatbuffers::enable_if<B,T>.\n  static_assert(sizeof(T) < sizeof(int64_t), \"unexpected type T\");\n  FLATBUFFERS_ASSERT(s && val);\n  int64_t i64;\n  // The errno check isn't needed, will return MAX/MIN on overflow.\n  if (StringToIntegerImpl(&i64, s, 0, false)) {\n    const int64_t max = (flatbuffers::numeric_limits<T>::max)();\n    const int64_t min = flatbuffers::numeric_limits<T>::lowest();\n    if (i64 > max) {\n      *val = static_cast<T>(max);\n      return false;\n    }\n    if (i64 < min) {\n      // For unsigned types return max to distinguish from\n      // \"no conversion can be performed\" when 0 is returned.\n      *val = static_cast<T>(flatbuffers::is_unsigned<T>::value ? max : min);\n      return false;\n    }\n    *val = static_cast<T>(i64);\n    return true;\n  }\n  *val = 0;\n  return false;\n}\n\ntemplate <>\ninline bool StringToNumber<int64_t>(const char* str, int64_t* val) {\n  return StringToIntegerImpl(val, str);\n}\n\ntemplate <>\ninline bool StringToNumber<uint64_t>(const char* str, uint64_t* val) {\n  if (!StringToIntegerImpl(val, str)) return false;\n  // The strtoull accepts negative numbers:\n  // If the minus sign was part of the input sequence, the numeric value\n  // calculated from the sequence of digits is negated as if by unary minus\n  // in the result type, which applies unsigned integer wraparound rules.\n  // Fix this behaviour (except -0).\n  if (*val) {\n    auto s = str;\n    while (*s && !is_digit(*s)) s++;\n    s = (s > str) ? (s - 1) : s;  // step back to one symbol\n    if (*s == '-') {\n      // For unsigned types return the max to distinguish from\n      // \"no conversion can be performed\".\n      *val = (flatbuffers::numeric_limits<uint64_t>::max)();\n      return false;\n    }\n  }\n  return true;\n}\n\ntemplate <>\ninline bool StringToNumber(const char* s, float* val) {\n  return StringToFloatImpl(val, s);\n}\n\ntemplate <>\ninline bool StringToNumber(const char* s, double* val) {\n  return StringToFloatImpl(val, s);\n}\n\ninline int64_t StringToInt(const char* s, int base = 10) {\n  int64_t val;\n  return StringToIntegerImpl(&val, s, base) ? val : 0;\n}\n\ninline uint64_t StringToUInt(const char* s, int base = 10) {\n  uint64_t val;\n  return StringToIntegerImpl(&val, s, base) ? val : 0;\n}\n\ninline bool StringIsFlatbufferNan(const std::string& s) {\n  return s == \"nan\" || s == \"+nan\" || s == \"-nan\";\n}\n\ninline bool StringIsFlatbufferPositiveInfinity(const std::string& s) {\n  return s == \"inf\" || s == \"+inf\" || s == \"infinity\" || s == \"+infinity\";\n}\n\ninline bool StringIsFlatbufferNegativeInfinity(const std::string& s) {\n  return s == \"-inf\" || s == \"-infinity\";\n}\n\ntypedef bool (*LoadFileFunction)(const char* filename, bool binary,\n                                 std::string* dest);\ntypedef bool (*FileExistsFunction)(const char* filename);\n\nLoadFileFunction SetLoadFileFunction(LoadFileFunction load_file_function);\n\nFileExistsFunction SetFileExistsFunction(\n    FileExistsFunction file_exists_function);\n\n// Check if file \"name\" exists.\nbool FileExists(const char* name);\n\n// Check if \"name\" exists and it is also a directory.\nbool DirExists(const char* name);\n\n// Load file \"name\" into \"buf\" returning true if successful\n// false otherwise.  If \"binary\" is false data is read\n// using ifstream's text mode, otherwise data is read with\n// no transcoding.\nbool LoadFile(const char* name, bool binary, std::string* buf);\n\n// Save data \"buf\" of length \"len\" bytes into a file\n// \"name\" returning true if successful, false otherwise.\n// If \"binary\" is false data is written using ifstream's\n// text mode, otherwise data is written with no\n// transcoding.\n// NOTE: this function is deprecated in favor of FileSaver class,\n// but left here for compatibility.\nbool SaveFile(const char* name, const char* buf, size_t len, bool binary);\n\n// Save data \"buf\" into file \"name\" returning true if\n// successful, false otherwise.  If \"binary\" is false\n// data is written using ifstream's text mode, otherwise\n// data is written with no transcoding.\n// NOTE: this function is deprecated in favor of FileSaver class,\n// but left here for compatibility.\ninline bool SaveFile(const char* name, const std::string& buf, bool binary) {\n  return SaveFile(name, buf.c_str(), buf.size(), binary);\n}\n\n// Functionality for minimalistic portable path handling.\n\n// The functions below behave correctly regardless of whether posix ('/') or\n// Windows ('/' or '\\\\') separators are used.\n\n// Any new separators inserted are always posix.\nFLATBUFFERS_CONSTEXPR char kPathSeparator = '/';\n\n// Returns the path with the extension, if any, removed.\nstd::string StripExtension(const std::string& filepath);\n\n// Returns the extension, if any.\nstd::string GetExtension(const std::string& filepath);\n\n// Return the last component of the path, after the last separator.\nstd::string StripPath(const std::string& filepath);\n\n// Strip the last component of the path + separator.\nstd::string StripFileName(const std::string& filepath);\n\nstd::string StripPrefix(const std::string& filepath,\n                        const std::string& prefix_to_remove);\n\n// Concatenates a path with a filename, regardless of whether the path\n// ends in a separator or not.\nstd::string ConCatPathFileName(const std::string& path,\n                               const std::string& filename);\n\n// Replaces any '\\\\' separators with '/'\nstd::string PosixPath(const char* path);\nstd::string PosixPath(const std::string& path);\n\n// This function ensure a directory exists, by recursively\n// creating dirs for any parts of the path that don't exist yet.\nvoid EnsureDirExists(const std::string& filepath);\n\n// Obtains the relative or absolute path.\nstd::string FilePath(const std::string& project, const std::string& filePath,\n                     bool absolute);\n\n// Obtains the absolute path from any other path.\n// Returns the input path if the absolute path couldn't be resolved.\nstd::string AbsolutePath(const std::string& filepath);\n\n// Returns files relative to the --project_root path, prefixed with `//`.\nstd::string RelativeToRootPath(const std::string& project,\n                               const std::string& filepath);\n\n// To and from UTF-8 unicode conversion functions\n\n// Convert a unicode code point into a UTF-8 representation by appending it\n// to a string. Returns the number of bytes generated.\ninline int ToUTF8(uint32_t ucc, std::string* out) {\n  FLATBUFFERS_ASSERT(!(ucc & 0x80000000));  // Top bit can't be set.\n  // 6 possible encodings: http://en.wikipedia.org/wiki/UTF-8\n  for (int i = 0; i < 6; i++) {\n    // Max bits this encoding can represent.\n    uint32_t max_bits = 6 + i * 5 + static_cast<int>(!i);\n    if (ucc < (1u << max_bits)) {  // does it fit?\n      // Remaining bits not encoded in the first byte, store 6 bits each\n      uint32_t remain_bits = i * 6;\n      // Store first byte:\n      (*out) += static_cast<char>((0xFE << (max_bits - remain_bits)) |\n                                  (ucc >> remain_bits));\n      // Store remaining bytes:\n      for (int j = i - 1; j >= 0; j--) {\n        (*out) += static_cast<char>(((ucc >> (j * 6)) & 0x3F) | 0x80);\n      }\n      return i + 1;  // Return the number of bytes added.\n    }\n  }\n  FLATBUFFERS_ASSERT(0);  // Impossible to arrive here.\n  return -1;\n}\n\n// Converts whatever prefix of the incoming string corresponds to a valid\n// UTF-8 sequence into a unicode code. The incoming pointer will have been\n// advanced past all bytes parsed.\n// returns -1 upon corrupt UTF-8 encoding (ignore the incoming pointer in\n// this case).\ninline int FromUTF8(const char** in) {\n  int len = 0;\n  // Count leading 1 bits.\n  for (int mask = 0x80; mask >= 0x04; mask >>= 1) {\n    if (**in & mask) {\n      len++;\n    } else {\n      break;\n    }\n  }\n  if ((static_cast<unsigned char>(**in) << len) & 0x80)\n    return -1;  // Bit after leading 1's must be 0.\n  if (!len) return *(*in)++;\n  // UTF-8 encoded values with a length are between 2 and 4 bytes.\n  if (len < 2 || len > 4) {\n    return -1;\n  }\n  // Grab initial bits of the code.\n  int ucc = *(*in)++ & ((1 << (7 - len)) - 1);\n  for (int i = 0; i < len - 1; i++) {\n    if ((**in & 0xC0) != 0x80) return -1;  // Upper bits must 1 0.\n    ucc <<= 6;\n    ucc |= *(*in)++ & 0x3F;  // Grab 6 more bits of the code.\n  }\n  // UTF-8 cannot encode values between 0xD800 and 0xDFFF (reserved for\n  // UTF-16 surrogate pairs).\n  if (ucc >= 0xD800 && ucc <= 0xDFFF) {\n    return -1;\n  }\n  // UTF-8 must represent code points in their shortest possible encoding.\n  switch (len) {\n    case 2:\n      // Two bytes of UTF-8 can represent code points from U+0080 to U+07FF.\n      if (ucc < 0x0080 || ucc > 0x07FF) {\n        return -1;\n      }\n      break;\n    case 3:\n      // Three bytes of UTF-8 can represent code points from U+0800 to U+FFFF.\n      if (ucc < 0x0800 || ucc > 0xFFFF) {\n        return -1;\n      }\n      break;\n    case 4:\n      // Four bytes of UTF-8 can represent code points from U+10000 to U+10FFFF.\n      if (ucc < 0x10000 || ucc > 0x10FFFF) {\n        return -1;\n      }\n      break;\n  }\n  return ucc;\n}\n\n#ifndef FLATBUFFERS_PREFER_PRINTF\n// Wraps a string to a maximum length, inserting new lines where necessary. Any\n// existing whitespace will be collapsed down to a single space. A prefix or\n// suffix can be provided, which will be inserted before or after a wrapped\n// line, respectively.\ninline std::string WordWrap(const std::string in, size_t max_length,\n                            const std::string wrapped_line_prefix,\n                            const std::string wrapped_line_suffix) {\n  std::istringstream in_stream(in);\n  std::string wrapped, line, word;\n\n  in_stream >> word;\n  line = word;\n\n  while (in_stream >> word) {\n    if ((line.length() + 1 + word.length() + wrapped_line_suffix.length()) <\n        max_length) {\n      line += \" \" + word;\n    } else {\n      wrapped += line + wrapped_line_suffix + \"\\n\";\n      line = wrapped_line_prefix + word;\n    }\n  }\n  wrapped += line;\n\n  return wrapped;\n}\n#endif  // !FLATBUFFERS_PREFER_PRINTF\n\ninline bool EscapeString(const char* s, size_t length, std::string* _text,\n                         bool allow_non_utf8, bool natural_utf8) {\n  std::string& text = *_text;\n  text += \"\\\"\";\n  for (uoffset_t i = 0; i < length; i++) {\n    char c = s[i];\n    switch (c) {\n      case '\\n':\n        text += \"\\\\n\";\n        break;\n      case '\\t':\n        text += \"\\\\t\";\n        break;\n      case '\\r':\n        text += \"\\\\r\";\n        break;\n      case '\\b':\n        text += \"\\\\b\";\n        break;\n      case '\\f':\n        text += \"\\\\f\";\n        break;\n      case '\\\"':\n        text += \"\\\\\\\"\";\n        break;\n      case '\\\\':\n        text += \"\\\\\\\\\";\n        break;\n      default:\n        if (c >= ' ' && c <= '~') {\n          text += c;\n        } else {\n          // Not printable ASCII data. Let's see if it's valid UTF-8 first:\n          const char* utf8 = s + i;\n          int ucc = FromUTF8(&utf8);\n          if (ucc < 0) {\n            if (allow_non_utf8) {\n              text += \"\\\\x\";\n              text += IntToStringHex(static_cast<uint8_t>(c), 2);\n            } else {\n              // There are two cases here:\n              //\n              // 1) We reached here by parsing an IDL file. In that case,\n              // we previously checked for non-UTF-8, so we shouldn't reach\n              // here.\n              //\n              // 2) We reached here by someone calling GenText()\n              // on a previously-serialized flatbuffer. The data might have\n              // non-UTF-8 Strings, or might be corrupt.\n              //\n              // In both cases, we have to give up and inform the caller\n              // they have no JSON.\n              return false;\n            }\n          } else {\n            if (natural_utf8) {\n              // utf8 points to past all utf-8 bytes parsed\n              text.append(s + i, static_cast<size_t>(utf8 - s - i));\n            } else if (ucc <= 0xFFFF) {\n              // Parses as Unicode within JSON's \\uXXXX range, so use that.\n              text += \"\\\\u\";\n              text += IntToStringHex(ucc, 4);\n            } else if (ucc <= 0x10FFFF) {\n              // Encode Unicode SMP values to a surrogate pair using two \\u\n              // escapes.\n              uint32_t base = ucc - 0x10000;\n              auto high_surrogate = (base >> 10) + 0xD800;\n              auto low_surrogate = (base & 0x03FF) + 0xDC00;\n              text += \"\\\\u\";\n              text += IntToStringHex(high_surrogate, 4);\n              text += \"\\\\u\";\n              text += IntToStringHex(low_surrogate, 4);\n            }\n            // Skip past characters recognized.\n            i = static_cast<uoffset_t>(utf8 - s - 1);\n          }\n        }\n        break;\n    }\n  }\n  text += \"\\\"\";\n  return true;\n}\n\ninline std::string BufferToHexText(const void* buffer, size_t buffer_size,\n                                   size_t max_length,\n                                   const std::string& wrapped_line_prefix,\n                                   const std::string& wrapped_line_suffix) {\n  std::string text = wrapped_line_prefix;\n  size_t start_offset = 0;\n  const char* s = reinterpret_cast<const char*>(buffer);\n  for (size_t i = 0; s && i < buffer_size; i++) {\n    // Last iteration or do we have more?\n    bool have_more = i + 1 < buffer_size;\n    text += \"0x\";\n    text += IntToStringHex(static_cast<uint8_t>(s[i]), 2);\n    if (have_more) {\n      text += ',';\n    }\n    // If we have more to process and we reached max_length\n    if (have_more &&\n        text.size() + wrapped_line_suffix.size() >= start_offset + max_length) {\n      text += wrapped_line_suffix;\n      text += '\\n';\n      start_offset = text.size();\n      text += wrapped_line_prefix;\n    }\n  }\n  text += wrapped_line_suffix;\n  return text;\n}\n\n// Remove paired quotes in a string: \"text\"|'text' -> text.\nstd::string RemoveStringQuotes(const std::string& s);\n\n// Change th global C-locale to locale with name <locale_name>.\n// Returns an actual locale name in <_value>, useful if locale_name is \"\" or\n// null.\nbool SetGlobalTestLocale(const char* locale_name,\n                         std::string* _value = nullptr);\n\n// Read (or test) a value of environment variable.\nbool ReadEnvironmentVariable(const char* var_name,\n                             std::string* _value = nullptr);\n\nenum class Case {\n  kUnknown = 0,\n  // TheQuickBrownFox\n  kUpperCamel = 1,\n  // theQuickBrownFox\n  kLowerCamel = 2,\n  // the_quick_brown_fox\n  kSnake = 3,\n  // THE_QUICK_BROWN_FOX\n  kScreamingSnake = 4,\n  // THEQUICKBROWNFOX\n  kAllUpper = 5,\n  // thequickbrownfox\n  kAllLower = 6,\n  // the-quick-brown-fox\n  kDasher = 7,\n  // THEQuiCKBr_ownFox (or whatever you want, we won't change it)\n  kKeep = 8,\n  // the_quick_brown_fox123 (as opposed to the_quick_brown_fox_123)\n  kSnake2 = 9,\n};\n\n// Convert the `input` string of case `input_case` to the specified\n// `output_case`.\nstd::string ConvertCase(const std::string& input, Case output_case,\n                        Case input_case = Case::kSnake);\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_UTIL_H_\n"
  },
  {
    "path": "include/flatbuffers/vector.h",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_VECTOR_H_\n#define FLATBUFFERS_VECTOR_H_\n\n#include \"flatbuffers/base.h\"\n#include \"flatbuffers/buffer.h\"\n#include \"flatbuffers/stl_emulation.h\"\n\nnamespace flatbuffers {\n\nstruct String;\n\n// An STL compatible iterator implementation for Vector below, effectively\n// calling Get() for every element.\ntemplate <typename T, typename IT, typename Data = uint8_t*,\n          typename SizeT = uoffset_t>\nstruct VectorIterator {\n  typedef std::random_access_iterator_tag iterator_category;\n  typedef IT value_type;\n  typedef ptrdiff_t difference_type;\n  typedef IT* pointer;\n  typedef IT& reference;\n\n  static const SizeT element_stride = IndirectHelper<T>::element_stride;\n\n  VectorIterator(Data data, SizeT i) : data_(data + element_stride * i) {}\n  VectorIterator(const VectorIterator& other) : data_(other.data_) {}\n  VectorIterator() : data_(nullptr) {}\n\n  VectorIterator& operator=(const VectorIterator& other) {\n    data_ = other.data_;\n    return *this;\n  }\n\n  VectorIterator& operator=(VectorIterator&& other) {\n    data_ = other.data_;\n    return *this;\n  }\n\n  bool operator==(const VectorIterator& other) const {\n    return data_ == other.data_;\n  }\n\n  bool operator!=(const VectorIterator& other) const {\n    return data_ != other.data_;\n  }\n\n  bool operator<(const VectorIterator& other) const {\n    return data_ < other.data_;\n  }\n\n  bool operator>(const VectorIterator& other) const {\n    return data_ > other.data_;\n  }\n\n  bool operator<=(const VectorIterator& other) const {\n    return !(data_ > other.data_);\n  }\n\n  bool operator>=(const VectorIterator& other) const {\n    return !(data_ < other.data_);\n  }\n\n  difference_type operator-(const VectorIterator& other) const {\n    return (data_ - other.data_) / element_stride;\n  }\n\n  // Note: return type is incompatible with the standard\n  // `reference operator*()`.\n  IT operator*() const { return IndirectHelper<T>::Read(data_, 0); }\n\n  // Note: return type is incompatible with the standard\n  // `pointer operator->()`.\n  IT operator->() const { return IndirectHelper<T>::Read(data_, 0); }\n\n  VectorIterator& operator++() {\n    data_ += element_stride;\n    return *this;\n  }\n\n  VectorIterator operator++(int) {\n    VectorIterator temp(data_, 0);\n    data_ += element_stride;\n    return temp;\n  }\n\n  VectorIterator operator+(const SizeT& offset) const {\n    return VectorIterator(data_ + offset * element_stride, 0);\n  }\n\n  VectorIterator& operator+=(const SizeT& offset) {\n    data_ += offset * element_stride;\n    return *this;\n  }\n\n  VectorIterator& operator--() {\n    data_ -= element_stride;\n    return *this;\n  }\n\n  VectorIterator operator--(int) {\n    VectorIterator temp(data_, 0);\n    data_ -= element_stride;\n    return temp;\n  }\n\n  VectorIterator operator-(const SizeT& offset) const {\n    return VectorIterator(data_ - offset * element_stride, 0);\n  }\n\n  VectorIterator& operator-=(const SizeT& offset) {\n    data_ -= offset * element_stride;\n    return *this;\n  }\n\n private:\n  Data data_;\n};\n\ntemplate <typename T, typename IT, typename SizeT = uoffset_t>\nusing VectorConstIterator = VectorIterator<T, IT, const uint8_t*, SizeT>;\n\ntemplate <typename Iterator>\nstruct VectorReverseIterator : public std::reverse_iterator<Iterator> {\n  explicit VectorReverseIterator(Iterator iter)\n      : std::reverse_iterator<Iterator>(iter) {}\n\n  // Note: return type is incompatible with the standard\n  // `reference operator*()`.\n  typename Iterator::value_type operator*() const {\n    auto tmp = std::reverse_iterator<Iterator>::current;\n    return *--tmp;\n  }\n\n  // Note: return type is incompatible with the standard\n  // `pointer operator->()`.\n  typename Iterator::value_type operator->() const {\n    auto tmp = std::reverse_iterator<Iterator>::current;\n    return *--tmp;\n  }\n};\n\n// This is used as a helper type for accessing vectors.\n// Vector::data() assumes the vector elements start after the length field.\ntemplate <typename T, typename SizeT = uoffset_t>\nclass Vector {\n public:\n  typedef VectorIterator<T, typename IndirectHelper<T>::mutable_return_type,\n                         uint8_t*, SizeT>\n      iterator;\n  typedef VectorConstIterator<T, typename IndirectHelper<T>::return_type, SizeT>\n      const_iterator;\n  typedef VectorReverseIterator<iterator> reverse_iterator;\n  typedef VectorReverseIterator<const_iterator> const_reverse_iterator;\n\n  typedef typename flatbuffers::bool_constant<flatbuffers::is_scalar<T>::value>\n      scalar_tag;\n\n  static FLATBUFFERS_CONSTEXPR bool is_span_observable =\n      scalar_tag::value && !std::is_pointer<T>::value &&\n      (FLATBUFFERS_LITTLEENDIAN || sizeof(T) == 1);\n\n  SizeT size() const { return EndianScalar(length_); }\n\n  // Returns true if the vector is empty.\n  //\n  // This just provides another standardized method that is expected of vectors.\n  bool empty() const { return size() == 0; }\n\n  // Deprecated: use size(). Here for backwards compatibility.\n  FLATBUFFERS_ATTRIBUTE([[deprecated(\"use size() instead\")]])\n  SizeT Length() const { return size(); }\n\n  typedef SizeT size_type;\n  typedef typename IndirectHelper<T>::return_type return_type;\n  typedef typename IndirectHelper<T>::mutable_return_type mutable_return_type;\n  typedef return_type value_type;\n\n  return_type Get(SizeT i) const {\n    FLATBUFFERS_ASSERT(i < size());\n    return IndirectHelper<T>::Read(Data(), i);\n  }\n\n  return_type operator[](SizeT i) const { return Get(i); }\n\n  // If this is a Vector of enums, T will be its storage type, not the enum\n  // type. This function makes it convenient to retrieve value with enum\n  // type E.\n  template <typename E>\n  E GetEnum(SizeT i) const {\n    return static_cast<E>(Get(i));\n  }\n\n  // If this a vector of unions, this does the cast for you. There's no check\n  // to make sure this is the right type!\n  template <typename U>\n  const U* GetAs(SizeT i) const {\n    return reinterpret_cast<const U*>(Get(i));\n  }\n\n  // If this a vector of unions, this does the cast for you. There's no check\n  // to make sure this is actually a string!\n  const String* GetAsString(SizeT i) const {\n    return reinterpret_cast<const String*>(Get(i));\n  }\n\n  const void* GetStructFromOffset(size_t o) const {\n    return reinterpret_cast<const void*>(Data() + o);\n  }\n\n  iterator begin() { return iterator(Data(), 0); }\n  const_iterator begin() const { return const_iterator(Data(), 0); }\n\n  iterator end() { return iterator(Data(), size()); }\n  const_iterator end() const { return const_iterator(Data(), size()); }\n\n  reverse_iterator rbegin() { return reverse_iterator(end()); }\n  const_reverse_iterator rbegin() const {\n    return const_reverse_iterator(end());\n  }\n\n  reverse_iterator rend() { return reverse_iterator(begin()); }\n  const_reverse_iterator rend() const {\n    return const_reverse_iterator(begin());\n  }\n\n  const_iterator cbegin() const { return begin(); }\n\n  const_iterator cend() const { return end(); }\n\n  const_reverse_iterator crbegin() const { return rbegin(); }\n\n  const_reverse_iterator crend() const { return rend(); }\n\n  // Change elements if you have a non-const pointer to this object.\n  // Scalars only. See reflection.h, and the documentation.\n  void Mutate(SizeT i, const T& val) {\n    FLATBUFFERS_ASSERT(i < size());\n    WriteScalar(data() + i, val);\n  }\n\n  // Change an element of a vector of tables (or strings).\n  // \"val\" points to the new table/string, as you can obtain from\n  // e.g. reflection::AddFlatBuffer().\n  void MutateOffset(SizeT i, const uint8_t* val) {\n    FLATBUFFERS_ASSERT(i < size());\n    static_assert(sizeof(T) == sizeof(SizeT), \"Unrelated types\");\n    WriteScalar(data() + i,\n                static_cast<SizeT>(val - (Data() + i * sizeof(SizeT))));\n  }\n\n  // Get a mutable pointer to tables/strings inside this vector.\n  mutable_return_type GetMutableObject(SizeT i) const {\n    FLATBUFFERS_ASSERT(i < size());\n    return const_cast<mutable_return_type>(IndirectHelper<T>::Read(Data(), i));\n  }\n\n  // The raw data in little endian format. Use with care.\n  const uint8_t* Data() const {\n    return reinterpret_cast<const uint8_t*>(&length_ + 1);\n  }\n\n  uint8_t* Data() { return reinterpret_cast<uint8_t*>(&length_ + 1); }\n\n  // Similarly, but typed, much like std::vector::data\n  const T* data() const { return reinterpret_cast<const T*>(Data()); }\n  T* data() { return reinterpret_cast<T*>(Data()); }\n\n  template <typename K>\n  return_type LookupByKey(K key) const {\n    void* search_result = std::bsearch(\n        &key, Data(), size(), IndirectHelper<T>::element_stride, KeyCompare<K>);\n\n    if (!search_result) {\n      return nullptr;  // Key not found.\n    }\n\n    const uint8_t* element = reinterpret_cast<const uint8_t*>(search_result);\n\n    return IndirectHelper<T>::Read(element, 0);\n  }\n\n  template <typename K>\n  mutable_return_type MutableLookupByKey(K key) {\n    return const_cast<mutable_return_type>(LookupByKey(key));\n  }\n\n protected:\n  // This class is only used to access pre-existing data. Don't ever\n  // try to construct these manually.\n  Vector();\n\n  SizeT length_;\n\n private:\n  // This class is a pointer. Copying will therefore create an invalid object.\n  // Private and unimplemented copy constructor.\n  Vector(const Vector&);\n  Vector& operator=(const Vector&);\n\n  template <typename K>\n  static int KeyCompare(const void* ap, const void* bp) {\n    const K* key = reinterpret_cast<const K*>(ap);\n    const uint8_t* data = reinterpret_cast<const uint8_t*>(bp);\n    auto table = IndirectHelper<T>::Read(data, 0);\n\n    // std::bsearch compares with the operands transposed, so we negate the\n    // result here.\n    return -table->KeyCompareWithValue(*key);\n  }\n};\n\ntemplate <typename T>\nusing Vector64 = Vector<T, uoffset64_t>;\n\ntemplate <class U>\nFLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<U> make_span(Vector<U>& vec)\n    FLATBUFFERS_NOEXCEPT {\n  static_assert(Vector<U>::is_span_observable,\n                \"wrong type U, only LE-scalar, or byte types are allowed\");\n  return span<U>(vec.data(), vec.size());\n}\n\ntemplate <class U>\nFLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<const U> make_span(\n    const Vector<U>& vec) FLATBUFFERS_NOEXCEPT {\n  static_assert(Vector<U>::is_span_observable,\n                \"wrong type U, only LE-scalar, or byte types are allowed\");\n  return span<const U>(vec.data(), vec.size());\n}\n\ntemplate <class U>\nFLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<uint8_t> make_bytes_span(\n    Vector<U>& vec) FLATBUFFERS_NOEXCEPT {\n  static_assert(Vector<U>::scalar_tag::value,\n                \"wrong type U, only LE-scalar, or byte types are allowed\");\n  return span<uint8_t>(vec.Data(), vec.size() * sizeof(U));\n}\n\ntemplate <class U>\nFLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<const uint8_t> make_bytes_span(\n    const Vector<U>& vec) FLATBUFFERS_NOEXCEPT {\n  static_assert(Vector<U>::scalar_tag::value,\n                \"wrong type U, only LE-scalar, or byte types are allowed\");\n  return span<const uint8_t>(vec.Data(), vec.size() * sizeof(U));\n}\n\n#if FLATBUFFERS_LITTLEENDIAN\n\ntemplate <class U>\nFLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<U> make_structs_span(\n    Vector<const U*>& vec) FLATBUFFERS_NOEXCEPT {\n  return span<U>(reinterpret_cast<U*>(vec.data()), vec.size());\n}\n\ntemplate <class U>\nFLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<const U> make_structs_span(\n    const Vector<const U*>& vec) FLATBUFFERS_NOEXCEPT {\n  return span<const U>(reinterpret_cast<const U*>(vec.data()), vec.size());\n}\n\n#endif\n\n// Convenient helper functions to get a span of any vector, regardless\n// of whether it is null or not (the field is not set).\ntemplate <class U>\nFLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<U> make_span(Vector<U>* ptr)\n    FLATBUFFERS_NOEXCEPT {\n  static_assert(Vector<U>::is_span_observable,\n                \"wrong type U, only LE-scalar, or byte types are allowed\");\n  return ptr ? make_span(*ptr) : span<U>();\n}\n\ntemplate <class U>\nFLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<const U> make_span(\n    const Vector<U>* ptr) FLATBUFFERS_NOEXCEPT {\n  static_assert(Vector<U>::is_span_observable,\n                \"wrong type U, only LE-scalar, or byte types are allowed\");\n  return ptr ? make_span(*ptr) : span<const U>();\n}\n\n#if FLATBUFFERS_LITTLEENDIAN\n\ntemplate <class U>\nFLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<U> make_structs_span(\n    Vector<const U*>* ptr) FLATBUFFERS_NOEXCEPT {\n  return ptr ? make_span(*ptr) : span<U>();\n}\n\ntemplate <class U>\nFLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<const U> make_structs_span(\n    const Vector<const U*>* ptr) FLATBUFFERS_NOEXCEPT {\n  return ptr ? make_span(*ptr) : span<const U>();\n}\n\n#endif\n\n// Represent a vector much like the template above, but in this case we\n// don't know what the element types are (used with reflection.h).\nclass VectorOfAny {\n public:\n  uoffset_t size() const { return EndianScalar(length_); }\n\n  const uint8_t* Data() const {\n    return reinterpret_cast<const uint8_t*>(&length_ + 1);\n  }\n  uint8_t* Data() { return reinterpret_cast<uint8_t*>(&length_ + 1); }\n\n protected:\n  VectorOfAny();\n\n  uoffset_t length_;\n\n private:\n  VectorOfAny(const VectorOfAny&);\n  VectorOfAny& operator=(const VectorOfAny&);\n};\n\ntemplate <typename T, typename U>\nVector<Offset<T>>* VectorCast(Vector<Offset<U>>* ptr) {\n  static_assert(std::is_base_of<T, U>::value, \"Unrelated types\");\n  return reinterpret_cast<Vector<Offset<T>>*>(ptr);\n}\n\ntemplate <typename T, typename U>\nconst Vector<Offset<T>>* VectorCast(const Vector<Offset<U>>* ptr) {\n  static_assert(std::is_base_of<T, U>::value, \"Unrelated types\");\n  return reinterpret_cast<const Vector<Offset<T>>*>(ptr);\n}\n\n// Convenient helper function to get the length of any vector, regardless\n// of whether it is null or not (the field is not set).\ntemplate <typename T>\nstatic inline size_t VectorLength(const Vector<T>* v) {\n  return v ? v->size() : 0;\n}\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_VERIFIER_H_\n"
  },
  {
    "path": "include/flatbuffers/vector_downward.h",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_VECTOR_DOWNWARD_H_\n#define FLATBUFFERS_VECTOR_DOWNWARD_H_\n\n#include <algorithm>\n#include <cstdint>\n\n#include \"flatbuffers/base.h\"\n#include \"flatbuffers/default_allocator.h\"\n#include \"flatbuffers/detached_buffer.h\"\n\nnamespace flatbuffers {\n\n// This is a minimal replication of std::vector<uint8_t> functionality,\n// except growing from higher to lower addresses. i.e. push_back() inserts data\n// in the lowest address in the vector.\n// Since this vector leaves the lower part unused, we support a \"scratch-pad\"\n// that can be stored there for temporary data, to share the allocated space.\n// Essentially, this supports 2 std::vectors in a single buffer.\ntemplate <typename SizeT = uoffset_t>\nclass vector_downward {\n public:\n  explicit vector_downward(size_t initial_size, Allocator* allocator,\n                           bool own_allocator, size_t buffer_minalign,\n                           const SizeT max_size = FLATBUFFERS_MAX_BUFFER_SIZE)\n      : allocator_(allocator),\n        own_allocator_(own_allocator),\n        initial_size_(initial_size),\n        max_size_(max_size),\n        buffer_minalign_(buffer_minalign),\n        reserved_(0),\n        size_(0),\n        buf_(nullptr),\n        cur_(nullptr),\n        scratch_(nullptr) {}\n\n  vector_downward(vector_downward&& other) noexcept\n      // clang-format on\n      : allocator_(other.allocator_),\n        own_allocator_(other.own_allocator_),\n        initial_size_(other.initial_size_),\n        max_size_(other.max_size_),\n        buffer_minalign_(other.buffer_minalign_),\n        reserved_(other.reserved_),\n        size_(other.size_),\n        buf_(other.buf_),\n        cur_(other.cur_),\n        scratch_(other.scratch_) {\n    // No change in other.allocator_\n    // No change in other.initial_size_\n    // No change in other.buffer_minalign_\n    other.own_allocator_ = false;\n    other.reserved_ = 0;\n    other.buf_ = nullptr;\n    other.cur_ = nullptr;\n    other.scratch_ = nullptr;\n  }\n\n  vector_downward& operator=(vector_downward&& other) noexcept {\n    // Move construct a temporary and swap idiom\n    vector_downward temp(std::move(other));\n    swap(temp);\n    return *this;\n  }\n\n  ~vector_downward() {\n    clear_buffer();\n    clear_allocator();\n  }\n\n  void reset() {\n    clear_buffer();\n    clear();\n  }\n\n  void clear() {\n    if (buf_) {\n      cur_ = buf_ + reserved_;\n    } else {\n      reserved_ = 0;\n      cur_ = nullptr;\n    }\n    size_ = 0;\n    clear_scratch();\n  }\n\n  void clear_scratch() { scratch_ = buf_; }\n\n  void clear_allocator() {\n    if (own_allocator_ && allocator_) {\n      delete allocator_;\n    }\n    allocator_ = nullptr;\n    own_allocator_ = false;\n  }\n\n  void clear_buffer() {\n    if (buf_) Deallocate(allocator_, buf_, reserved_);\n    buf_ = nullptr;\n  }\n\n  // Relinquish the pointer to the caller.\n  uint8_t* release_raw(size_t& allocated_bytes, size_t& offset) {\n    auto* buf = buf_;\n    allocated_bytes = reserved_;\n    offset = vector_downward::offset();\n\n    // release_raw only relinquishes the buffer ownership.\n    // Does not deallocate or reset the allocator. Destructor will do that.\n    buf_ = nullptr;\n    clear();\n    return buf;\n  }\n\n  // Relinquish the pointer to the caller.\n  DetachedBuffer release() {\n    // allocator ownership (if any) is transferred to DetachedBuffer.\n    DetachedBuffer fb(allocator_, own_allocator_, buf_, reserved_, cur_,\n                      size());\n    if (own_allocator_) {\n      allocator_ = nullptr;\n      own_allocator_ = false;\n    }\n    buf_ = nullptr;\n    clear();\n    return fb;\n  }\n\n  size_t ensure_space(size_t len) {\n    FLATBUFFERS_ASSERT(cur_ >= scratch_ && scratch_ >= buf_);\n    // If the length is larger than the unused part of the buffer, we need to\n    // grow.\n    if (len > unused_buffer_size()) {\n      reallocate(len);\n    }\n    FLATBUFFERS_ASSERT(size() < max_size_);\n    return len;\n  }\n\n  inline uint8_t* make_space(size_t len) {\n    if (len) {\n      ensure_space(len);\n      cur_ -= len;\n      size_ += static_cast<SizeT>(len);\n    }\n    return cur_;\n  }\n\n  // Returns nullptr if using the DefaultAllocator.\n  Allocator* get_custom_allocator() { return allocator_; }\n\n  // The current offset into the buffer.\n  size_t offset() const { return cur_ - buf_; }\n\n  // The total size of the vector (both the buffer and scratch parts).\n  inline SizeT size() const { return size_; }\n\n  // The size of the buffer part of the vector that is currently unused.\n  SizeT unused_buffer_size() const {\n    return static_cast<SizeT>(cur_ - scratch_);\n  }\n\n  // The size of the scratch part of the vector.\n  SizeT scratch_size() const { return static_cast<SizeT>(scratch_ - buf_); }\n\n  size_t capacity() const { return reserved_; }\n\n  uint8_t* data() const {\n    FLATBUFFERS_ASSERT(cur_);\n    return cur_;\n  }\n\n  uint8_t* scratch_data() const {\n    FLATBUFFERS_ASSERT(buf_);\n    return buf_;\n  }\n\n  uint8_t* scratch_end() const {\n    FLATBUFFERS_ASSERT(scratch_);\n    return scratch_;\n  }\n\n  uint8_t* data_at(size_t offset) const { return buf_ + reserved_ - offset; }\n\n  void push(const uint8_t* bytes, size_t num) {\n    if (num > 0) {\n      memcpy(make_space(num), bytes, num);\n    }\n  }\n\n  // Specialized version of push() that avoids memcpy call for small data.\n  template <typename T>\n  void push_small(const T& little_endian_t) {\n    make_space(sizeof(T));\n    *reinterpret_cast<T*>(cur_) = little_endian_t;\n  }\n\n  template <typename T>\n  void scratch_push_small(const T& t) {\n    ensure_space(sizeof(T));\n    *reinterpret_cast<T*>(scratch_) = t;\n    scratch_ += sizeof(T);\n  }\n\n  // fill() is most frequently called with small byte counts (<= 4),\n  // which is why we're using loops rather than calling memset.\n  void fill(size_t zero_pad_bytes) {\n    make_space(zero_pad_bytes);\n    for (size_t i = 0; i < zero_pad_bytes; i++) cur_[i] = 0;\n  }\n\n  // Version for when we know the size is larger.\n  // Precondition: zero_pad_bytes > 0\n  void fill_big(size_t zero_pad_bytes) {\n    memset(make_space(zero_pad_bytes), 0, zero_pad_bytes);\n  }\n\n  void pop(size_t bytes_to_remove) {\n    cur_ += bytes_to_remove;\n    size_ -= static_cast<SizeT>(bytes_to_remove);\n  }\n\n  void scratch_pop(size_t bytes_to_remove) { scratch_ -= bytes_to_remove; }\n\n  void swap(vector_downward& other) {\n    using std::swap;\n    swap(allocator_, other.allocator_);\n    swap(own_allocator_, other.own_allocator_);\n    swap(initial_size_, other.initial_size_);\n    swap(buffer_minalign_, other.buffer_minalign_);\n    swap(reserved_, other.reserved_);\n    swap(size_, other.size_);\n    swap(max_size_, other.max_size_);\n    swap(buf_, other.buf_);\n    swap(cur_, other.cur_);\n    swap(scratch_, other.scratch_);\n  }\n\n  void swap_allocator(vector_downward& other) {\n    using std::swap;\n    swap(allocator_, other.allocator_);\n    swap(own_allocator_, other.own_allocator_);\n  }\n\n private:\n  // You shouldn't really be copying instances of this class.\n  FLATBUFFERS_DELETE_FUNC(vector_downward(const vector_downward&));\n  FLATBUFFERS_DELETE_FUNC(vector_downward& operator=(const vector_downward&));\n\n  Allocator* allocator_;\n  bool own_allocator_;\n  size_t initial_size_;\n\n  // The maximum size the vector can be.\n  SizeT max_size_;\n  size_t buffer_minalign_;\n  size_t reserved_;\n  SizeT size_;\n  uint8_t* buf_;\n  uint8_t* cur_;  // Points at location between empty (below) and used (above).\n  uint8_t* scratch_;  // Points to the end of the scratchpad in use.\n\n  void reallocate(size_t len) {\n    auto old_reserved = reserved_;\n    auto old_size = size();\n    auto old_scratch_size = scratch_size();\n    reserved_ +=\n        (std::max)(len, old_reserved ? old_reserved / 2 : initial_size_);\n    reserved_ = (reserved_ + buffer_minalign_ - 1) & ~(buffer_minalign_ - 1);\n    if (buf_) {\n      buf_ = ReallocateDownward(allocator_, buf_, old_reserved, reserved_,\n                                old_size, old_scratch_size);\n    } else {\n      buf_ = Allocate(allocator_, reserved_);\n    }\n    cur_ = buf_ + reserved_ - old_size;\n    scratch_ = buf_ + old_scratch_size;\n  }\n};\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_VECTOR_DOWNWARD_H_\n"
  },
  {
    "path": "include/flatbuffers/verifier.h",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_VERIFIER_H_\n#define FLATBUFFERS_VERIFIER_H_\n\n#include \"flatbuffers/base.h\"\n#include \"flatbuffers/vector.h\"\n\nnamespace flatbuffers {\n\n// Helper class to verify the integrity of a FlatBuffer\ntemplate <bool TrackVerifierBufferSize>\nclass VerifierTemplate FLATBUFFERS_FINAL_CLASS {\n public:\n  struct Options {\n    // The maximum nesting of tables and vectors before we call it invalid.\n    uoffset_t max_depth = 64;\n    // The maximum number of tables we will verify before we call it invalid.\n    uoffset_t max_tables = 1000000;\n    // If true, verify all data is aligned.\n    bool check_alignment = true;\n    // If true, run verifier on nested flatbuffers\n    bool check_nested_flatbuffers = true;\n    // The maximum size of a buffer.\n    size_t max_size = FLATBUFFERS_MAX_BUFFER_SIZE;\n    // Use assertions to check for errors.\n    bool assert = false;\n  };\n\n  explicit VerifierTemplate(const uint8_t* const buf, const size_t buf_len,\n                            const Options& opts)\n      : buf_(buf), size_(buf_len), opts_(opts) {\n    FLATBUFFERS_ASSERT(size_ < opts.max_size);\n  }\n\n  // Deprecated API, please construct with VerifierTemplate::Options.\n  VerifierTemplate(const uint8_t* const buf, const size_t buf_len,\n                   const uoffset_t max_depth = 64,\n                   const uoffset_t max_tables = 1000000,\n                   const bool check_alignment = true)\n      : VerifierTemplate(buf, buf_len, [&] {\n          Options opts;\n          opts.max_depth = max_depth;\n          opts.max_tables = max_tables;\n          opts.check_alignment = check_alignment;\n          return opts;\n        }()) {}\n\n  // Central location where any verification failures register.\n  bool Check(const bool ok) const {\n    // clang-format off\n    #ifdef FLATBUFFERS_DEBUG_VERIFICATION_FAILURE\n      if (opts_.assert) { FLATBUFFERS_ASSERT(ok); }\n    #endif\n    // clang-format on\n    if (TrackVerifierBufferSize) {\n      if (!ok) {\n        upper_bound_ = 0;\n      }\n    }\n    return ok;\n  }\n\n  // Verify any range within the buffer.\n  bool Verify(const size_t elem, const size_t elem_len) const {\n    if (TrackVerifierBufferSize) {\n      auto upper_bound = elem + elem_len;\n      if (upper_bound_ < upper_bound) {\n        upper_bound_ = upper_bound;\n      }\n    }\n    return Check(elem_len < size_ && elem <= size_ - elem_len);\n  }\n\n  bool VerifyAlignment(const size_t elem, const size_t align) const {\n    return Check((elem & (align - 1)) == 0 || !opts_.check_alignment);\n  }\n\n  // Verify a range indicated by sizeof(T).\n  template <typename T>\n  bool Verify(const size_t elem) const {\n    return VerifyAlignment(elem, sizeof(T)) && Verify(elem, sizeof(T));\n  }\n\n  bool VerifyFromPointer(const uint8_t* const p, const size_t len) {\n    return Verify(static_cast<size_t>(p - buf_), len);\n  }\n\n  // Verify relative to a known-good base pointer.\n  bool VerifyFieldStruct(const uint8_t* const base, const voffset_t elem_off,\n                         const size_t elem_len, const size_t align) const {\n    const auto f = static_cast<size_t>(base - buf_) + elem_off;\n    return VerifyAlignment(f, align) && Verify(f, elem_len);\n  }\n\n  template <typename T>\n  bool VerifyField(const uint8_t* const base, const voffset_t elem_off,\n                   const size_t align) const {\n    const auto f = static_cast<size_t>(base - buf_) + elem_off;\n    return VerifyAlignment(f, align) && Verify(f, sizeof(T));\n  }\n\n  // Verify a pointer (may be NULL) of a table type.\n  template <typename T>\n  bool VerifyTable(const T* const table) {\n    return !table || table->Verify(*this);\n  }\n\n  // Verify a pointer (may be NULL) of any vector type.\n  template <int&..., typename T, typename LenT>\n  bool VerifyVector(const Vector<T, LenT>* const vec) const {\n    return !vec || VerifyVectorOrString<LenT>(\n                       reinterpret_cast<const uint8_t*>(vec), sizeof(T));\n  }\n\n  // Verify a pointer (may be NULL) of a vector to struct.\n  template <int&..., typename T, typename LenT>\n  bool VerifyVector(const Vector<const T*, LenT>* const vec) const {\n    return VerifyVector(reinterpret_cast<const Vector<T, LenT>*>(vec));\n  }\n\n  // Verify a pointer (may be NULL) to string.\n  bool VerifyString(const String* const str) const {\n    size_t end;\n    return !str || (VerifyVectorOrString<uoffset_t>(\n                        reinterpret_cast<const uint8_t*>(str), 1, &end) &&\n                    Verify(end, 1) &&           // Must have terminator\n                    Check(buf_[end] == '\\0'));  // Terminating byte must be 0.\n  }\n\n  // Common code between vectors and strings.\n  template <typename LenT = uoffset_t>\n  bool VerifyVectorOrString(const uint8_t* const vec, const size_t elem_size,\n                            size_t* const end = nullptr) const {\n    const auto vec_offset = static_cast<size_t>(vec - buf_);\n    // Check we can read the size field.\n    if (!Verify<LenT>(vec_offset)) return false;\n    // Check the whole array. If this is a string, the byte past the array must\n    // be 0.\n    const LenT size = ReadScalar<LenT>(vec);\n    const auto max_elems = opts_.max_size / elem_size;\n    if (!Check(size < max_elems))\n      return false;  // Protect against byte_size overflowing.\n    const auto byte_size = sizeof(LenT) + elem_size * size;\n    if (end) *end = vec_offset + byte_size;\n    return Verify(vec_offset, byte_size);\n  }\n\n  // Special case for string contents, after the above has been called.\n  bool VerifyVectorOfStrings(const Vector<Offset<String>>* const vec) const {\n    if (vec) {\n      for (uoffset_t i = 0; i < vec->size(); i++) {\n        if (!VerifyString(vec->Get(i))) return false;\n      }\n    }\n    return true;\n  }\n\n  // Special case for table contents, after the above has been called.\n  template <typename T>\n  bool VerifyVectorOfTables(const Vector<Offset<T>>* const vec) {\n    if (vec) {\n      for (uoffset_t i = 0; i < vec->size(); i++) {\n        if (!vec->Get(i)->Verify(*this)) return false;\n      }\n    }\n    return true;\n  }\n\n  FLATBUFFERS_SUPPRESS_UBSAN(\"unsigned-integer-overflow\")\n  bool VerifyTableStart(const uint8_t* const table) {\n    // Check the vtable offset.\n    const auto tableo = static_cast<size_t>(table - buf_);\n    if (!Verify<soffset_t>(tableo)) return false;\n    // This offset may be signed, but doing the subtraction unsigned always\n    // gives the result we want.\n    const auto vtableo =\n        tableo - static_cast<size_t>(ReadScalar<soffset_t>(table));\n    // Check the vtable size field, then check vtable fits in its entirety.\n    if (!(VerifyComplexity() && Verify<voffset_t>(vtableo) &&\n          VerifyAlignment(ReadScalar<voffset_t>(buf_ + vtableo),\n                          sizeof(voffset_t))))\n      return false;\n    const auto vsize = ReadScalar<voffset_t>(buf_ + vtableo);\n    return Check((vsize & 1) == 0) && Verify(vtableo, vsize);\n  }\n\n  template <typename T>\n  bool VerifyBufferFromStart(const char* const identifier, const size_t start) {\n    // Buffers have to be of some size to be valid. The reason it is a runtime\n    // check instead of static_assert, is that nested flatbuffers go through\n    // this call and their size is determined at runtime.\n    if (!Check(size_ >= FLATBUFFERS_MIN_BUFFER_SIZE)) return false;\n\n    // If an identifier is provided, check that we have a buffer\n    if (identifier && !Check((size_ >= 2 * sizeof(flatbuffers::uoffset_t) &&\n                              BufferHasIdentifier(buf_ + start, identifier)))) {\n      return false;\n    }\n\n    // Call T::Verify, which must be in the generated code for this type.\n    const auto o = VerifyOffset<uoffset_t>(start);\n    if (!Check(o != 0)) return false;\n    if (!(reinterpret_cast<const T*>(buf_ + start + o)->Verify(*this))) {\n      return false;\n    }\n    if (TrackVerifierBufferSize) {\n      if (GetComputedSize() == 0) return false;\n    }\n    return true;\n  }\n\n  template <typename T, int&..., typename SizeT>\n  bool VerifyNestedFlatBuffer(const Vector<uint8_t, SizeT>* const buf,\n                              const char* const identifier) {\n    // Caller opted out of this.\n    if (!opts_.check_nested_flatbuffers) return true;\n\n    // An empty buffer is OK as it indicates not present.\n    if (!buf) return true;\n\n    // If there is a nested buffer, it must be greater than the min size.\n    if (!Check(buf->size() >= FLATBUFFERS_MIN_BUFFER_SIZE)) return false;\n\n    VerifierTemplate<TrackVerifierBufferSize> nested_verifier(\n        buf->data(), buf->size(), opts_);\n    return nested_verifier.VerifyBuffer<T>(identifier);\n  }\n\n  // Verify this whole buffer, starting with root type T.\n  template <typename T>\n  bool VerifyBuffer() {\n    return VerifyBuffer<T>(nullptr);\n  }\n\n  template <typename T>\n  bool VerifyBuffer(const char* const identifier) {\n    return VerifyBufferFromStart<T>(identifier, 0);\n  }\n\n  template <typename T, typename SizeT = uoffset_t>\n  bool VerifySizePrefixedBuffer(const char* const identifier) {\n    return Verify<SizeT>(0U) &&\n           // Ensure the prefixed size is within the bounds of the provided\n           // length.\n           Check(ReadScalar<SizeT>(buf_) + sizeof(SizeT) <= size_) &&\n           VerifyBufferFromStart<T>(identifier, sizeof(SizeT));\n  }\n\n  template <typename OffsetT = uoffset_t, typename SOffsetT = soffset_t>\n  size_t VerifyOffset(const size_t start) const {\n    if (!Verify<OffsetT>(start)) return 0;\n    const auto o = ReadScalar<OffsetT>(buf_ + start);\n    // May not point to itself.\n    if (!Check(o != 0)) return 0;\n    // Can't wrap around larger than the max size.\n    if (!Check(static_cast<SOffsetT>(o) >= 0)) return 0;\n    // Must be inside the buffer to create a pointer from it (pointer outside\n    // buffer is UB).\n    if (!Verify(start + o, 1)) return 0;\n    return o;\n  }\n\n  template <typename OffsetT = uoffset_t>\n  size_t VerifyOffset(const uint8_t* const base, const voffset_t start) const {\n    return VerifyOffset<OffsetT>(static_cast<size_t>(base - buf_) + start);\n  }\n\n  // Called at the start of a table to increase counters measuring data\n  // structure depth and amount, and possibly bails out with false if limits set\n  // by the constructor have been hit. Needs to be balanced with EndTable().\n  bool VerifyComplexity() {\n    depth_++;\n    num_tables_++;\n    return Check(depth_ <= opts_.max_depth && num_tables_ <= opts_.max_tables);\n  }\n\n  // Called at the end of a table to pop the depth count.\n  bool EndTable() {\n    depth_--;\n    return true;\n  }\n\n  // Returns the message size in bytes.\n  //\n  // This should only be called after first calling VerifyBuffer or\n  // VerifySizePrefixedBuffer.\n  //\n  // This method should only be called for VerifierTemplate instances\n  // where the TrackVerifierBufferSize template parameter is true,\n  // i.e. for SizeVerifier.  For instances where TrackVerifierBufferSize\n  // is false, this fails at runtime or returns zero.\n  size_t GetComputedSize() const {\n    if (TrackVerifierBufferSize) {\n      uintptr_t size = upper_bound_;\n      // Align the size to uoffset_t\n      size = (size - 1 + sizeof(uoffset_t)) & ~(sizeof(uoffset_t) - 1);\n      return (size > size_) ? 0 : size;\n    }\n    // Must use SizeVerifier, or (deprecated) turn on\n    // FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE, for this to work.\n    (void)upper_bound_;\n    FLATBUFFERS_ASSERT(false);\n    return 0;\n  }\n\n  std::vector<uint8_t>* GetFlexReuseTracker() { return flex_reuse_tracker_; }\n\n  void SetFlexReuseTracker(std::vector<uint8_t>* const rt) {\n    flex_reuse_tracker_ = rt;\n  }\n\n private:\n  const uint8_t* buf_;\n  const size_t size_;\n  const Options opts_;\n\n  mutable size_t upper_bound_ = 0;\n\n  uoffset_t depth_ = 0;\n  uoffset_t num_tables_ = 0;\n  std::vector<uint8_t>* flex_reuse_tracker_ = nullptr;\n};\n\n// Specialization for 64-bit offsets.\ntemplate <>\ntemplate <>\ninline size_t VerifierTemplate<false>::VerifyOffset<uoffset64_t>(\n    const size_t start) const {\n  return VerifyOffset<uoffset64_t, soffset64_t>(start);\n}\ntemplate <>\ntemplate <>\ninline size_t VerifierTemplate<true>::VerifyOffset<uoffset64_t>(\n    const size_t start) const {\n  return VerifyOffset<uoffset64_t, soffset64_t>(start);\n}\n\n// Instance of VerifierTemplate that supports GetComputedSize().\nusing SizeVerifier = VerifierTemplate</*TrackVerifierBufferSize = */ true>;\n\n// The FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE build configuration macro is\n// deprecated, and should not be defined, since it is easy to misuse in ways\n// that result in ODR violations. Rather than using Verifier and defining\n// FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE, please use SizeVerifier instead.\n#ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE  // Deprecated, see above.\nusing Verifier = SizeVerifier;\n#else\n// Instance of VerifierTemplate that is slightly faster, but does not\n// support GetComputedSize().\nusing Verifier = VerifierTemplate</*TrackVerifierBufferSize = */ false>;\n#endif\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_VERIFIER_H_\n"
  },
  {
    "path": "java/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.google.flatbuffers</groupId>\n  <artifactId>flatbuffers-java</artifactId>\n  <version>25.12.19</version>\n  <packaging>bundle</packaging>\n  <name>FlatBuffers Java API</name>\n  <description>\n    Memory Efficient Serialization Library\n  </description>\n  <developers>\n    <developer>\n      <name>Wouter van Oortmerssen</name>\n    </developer>\n    <developer>\n      <name>Derek Bailey</name>\n      <email>dbaileychess@gmail.com</email>\n    </developer>\n  </developers>\n  <properties>\n    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n  </properties>\n  <url>https://github.com/google/flatbuffers</url>\n  <licenses>\n    <license>\n      <name>Apache License V2.0</name>\n      <url>https://raw.githubusercontent.com/google/flatbuffers/master/LICENSE</url>\n      <distribution>repo</distribution>\n    </license>\n  </licenses>\n  <scm>\n    <url>https://github.com/google/flatbuffers</url>\n    <connection>\n      scm:git:https://github.com/google/flatbuffers.git\n    </connection>\n    <tag>HEAD</tag>\n  </scm>\n  <dependencies>\n    <dependency>\n      <groupId>junit</groupId>\n      <artifactId>junit</artifactId>\n      <version>4.13.1</version>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.google.truth</groupId>\n      <artifactId>truth</artifactId>\n      <version>1.1.3</version>\n      <scope>test</scope>\n    </dependency>\n  </dependencies>\n  <distributionManagement>\n    <snapshotRepository>\n      <id>ossrh</id>\n      <url>https://oss.sonatype.org/content/repositories/snapshots</url>\n    </snapshotRepository>\n  </distributionManagement>\n  <build>\n    <plugins>\n      <plugin>\n        <artifactId>maven-surefire-plugin</artifactId>\n        <configuration>\n          <includes>\n            <include>**/*Test.java</include>\n          </includes>\n        </configuration>\n        <version>2.22.2</version>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-source-plugin</artifactId>\n        <version>3.2.1</version>\n        <executions>\n          <execution>\n            <id>attach-sources</id>\n            <goals>\n              <goal>jar</goal>\n            </goals>\n          </execution>\n        </executions>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-javadoc-plugin</artifactId>\n        <version>3.3.0</version>\n        <configuration>\n          <additionalparam>-Xdoclint:none</additionalparam>\n          <additionalOptions>-Xdoclint:none</additionalOptions>\n        </configuration>\n        <executions>\n          <execution>\n            <id>attach-javadocs</id>\n            <goals>\n              <goal>jar</goal>\n            </goals>\n          </execution>\n        </executions>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.felix</groupId>\n        <artifactId>maven-bundle-plugin</artifactId>\n        <version>5.1.2</version>\n        <extensions>true</extensions>\n      </plugin>\n      <plugin>\n        <groupId>org.sonatype.plugins</groupId>\n        <artifactId>nexus-staging-maven-plugin</artifactId>\n        <version>1.6.8</version>\n        <extensions>true</extensions>\n        <configuration>\n          <serverId>ossrh</serverId>\n          <nexusUrl>https://oss.sonatype.org/</nexusUrl>\n          <autoReleaseAfterClose>true</autoReleaseAfterClose>\n        </configuration>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-gpg-plugin</artifactId>\n        <version>3.0.1</version>\n        <executions>\n          <execution>\n            <id>sign-artifacts</id>\n            <phase>verify</phase>\n            <goals>\n              <goal>sign</goal>\n            </goals>\n            <configuration>\n              <gpgArguments>\n                <arg>--pinentry-mode</arg>\n                <arg>loopback</arg>\n              </gpgArguments>\n            </configuration>\n          </execution>\n        </executions>\n      </plugin>\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-release-plugin</artifactId>\n        <version>2.5.3</version>\n        <configuration>\n          <autoVersionSubmodules>true</autoVersionSubmodules>\n          <useReleaseProfile>false</useReleaseProfile>\n          <releaseProfiles>release</releaseProfiles>\n          <goals>deploy</goals>\n        </configuration>\n      </plugin>\n    </plugins>\n  </build>\n  <profiles>\n    <profile>\n      <id>jdk9</id>\n      <activation>\n        <jdk>[1.9,)</jdk>\n      </activation>\n      <build>\n        <plugins>\n          <plugin>\n            <artifactId>maven-compiler-plugin</artifactId>\n            <configuration>\n              <release>8</release>\n              <testExcludes>\n                <testExclude>MyGame/Example/MonsterStorageGrpc.java</testExclude>\n                <testExclude>MyGame/OtherNameSpace/TableBT.java</testExclude>\n              </testExcludes>\n            </configuration>\n            <version>3.8.1</version>\n          </plugin>\n        </plugins>\n      </build>\n    </profile>\n    <profile>\n      <id>jdk8</id>\n      <activation>\n        <jdk>1.8</jdk>\n      </activation>\n      <properties>\n        <maven.compiler.target>8</maven.compiler.target>\n        <maven.compiler.source>8</maven.compiler.source>\n      </properties>\n      <build>\n        <plugins>\n          <plugin>\n            <artifactId>maven-compiler-plugin</artifactId>\n            <configuration>\n              <testExcludes>\n                <testExclude>MyGame/Example/MonsterStorageGrpc.java</testExclude>\n                <testExclude>MyGame/OtherNameSpace/TableBT.java</testExclude>\n              </testExcludes>\n            </configuration>\n            <version>3.8.1</version>\n          </plugin>\n        </plugins>\n      </build>\n    </profile>\n  </profiles>\n</project>\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/ArrayReadWriteBuf.java",
    "content": "package com.google.flatbuffers;\n\nimport java.util.Arrays;\n\n/**\n * Implements {@code ReadBuf} using an array of bytes as a backing storage. Using array of bytes are\n * usually faster than {@code ByteBuffer}.\n *\n * <p>This class is not thread-safe, meaning that it must operate on a single thread. Operating from\n * multiple thread leads into a undefined behavior\n */\npublic class ArrayReadWriteBuf implements ReadWriteBuf {\n\n  private byte[] buffer;\n  private int writePos;\n\n  public ArrayReadWriteBuf() {\n    this(10);\n  }\n\n  public ArrayReadWriteBuf(int initialCapacity) {\n    this(new byte[initialCapacity]);\n  }\n\n  public ArrayReadWriteBuf(byte[] buffer) {\n    this.buffer = buffer;\n    this.writePos = 0;\n  }\n\n  public ArrayReadWriteBuf(byte[] buffer, int startPos) {\n    this.buffer = buffer;\n    this.writePos = startPos;\n  }\n\n  @Override\n  public void clear() {\n    this.writePos = 0;\n  }\n\n  @Override\n  public boolean getBoolean(int index) {\n    return buffer[index] != 0;\n  }\n\n  @Override\n  public byte get(int index) {\n    return buffer[index];\n  }\n\n  @Override\n  public short getShort(int index) {\n    return (short) ((buffer[index + 1] << 8) | (buffer[index] & 0xff));\n  }\n\n  @Override\n  public int getInt(int index) {\n    return (((buffer[index + 3]) << 24)\n        | ((buffer[index + 2] & 0xff) << 16)\n        | ((buffer[index + 1] & 0xff) << 8)\n        | ((buffer[index] & 0xff)));\n  }\n\n  @Override\n  public long getLong(int index) {\n    return ((((long) buffer[index++] & 0xff))\n        | (((long) buffer[index++] & 0xff) << 8)\n        | (((long) buffer[index++] & 0xff) << 16)\n        | (((long) buffer[index++] & 0xff) << 24)\n        | (((long) buffer[index++] & 0xff) << 32)\n        | (((long) buffer[index++] & 0xff) << 40)\n        | (((long) buffer[index++] & 0xff) << 48)\n        | (((long) buffer[index]) << 56));\n  }\n\n  @Override\n  public float getFloat(int index) {\n    return Float.intBitsToFloat(getInt(index));\n  }\n\n  @Override\n  public double getDouble(int index) {\n    return Double.longBitsToDouble(getLong(index));\n  }\n\n  @Override\n  public String getString(int start, int size) {\n    return Utf8Safe.decodeUtf8Array(buffer, start, size);\n  }\n\n  @Override\n  public byte[] data() {\n    return buffer;\n  }\n\n  @Override\n  public void putBoolean(boolean value) {\n    setBoolean(writePos, value);\n    writePos++;\n  }\n\n  @Override\n  public void put(byte[] value, int start, int length) {\n    set(writePos, value, start, length);\n    writePos += length;\n  }\n\n  @Override\n  public void put(byte value) {\n    set(writePos, value);\n    writePos++;\n  }\n\n  @Override\n  public void putShort(short value) {\n    setShort(writePos, value);\n    writePos += 2;\n  }\n\n  @Override\n  public void putInt(int value) {\n    setInt(writePos, value);\n    writePos += 4;\n  }\n\n  @Override\n  public void putLong(long value) {\n    setLong(writePos, value);\n    writePos += 8;\n  }\n\n  @Override\n  public void putFloat(float value) {\n    setFloat(writePos, value);\n    writePos += 4;\n  }\n\n  @Override\n  public void putDouble(double value) {\n    setDouble(writePos, value);\n    writePos += 8;\n  }\n\n  @Override\n  public void setBoolean(int index, boolean value) {\n    set(index, value ? (byte) 1 : (byte) 0);\n  }\n\n  @Override\n  public void set(int index, byte value) {\n    requestCapacity(index + 1);\n    buffer[index] = value;\n  }\n\n  @Override\n  public void set(int index, byte[] toCopy, int start, int length) {\n    requestCapacity(index + (length - start));\n    System.arraycopy(toCopy, start, buffer, index, length);\n  }\n\n  @Override\n  public void setShort(int index, short value) {\n    requestCapacity(index + 2);\n\n    buffer[index++] = (byte) ((value) & 0xff);\n    buffer[index] = (byte) ((value >> 8) & 0xff);\n  }\n\n  @Override\n  public void setInt(int index, int value) {\n    requestCapacity(index + 4);\n\n    buffer[index++] = (byte) ((value) & 0xff);\n    buffer[index++] = (byte) ((value >> 8) & 0xff);\n    buffer[index++] = (byte) ((value >> 16) & 0xff);\n    buffer[index] = (byte) ((value >> 24) & 0xff);\n  }\n\n  @Override\n  public void setLong(int index, long value) {\n    requestCapacity(index + 8);\n\n    int i = (int) value;\n    buffer[index++] = (byte) ((i) & 0xff);\n    buffer[index++] = (byte) ((i >> 8) & 0xff);\n    buffer[index++] = (byte) ((i >> 16) & 0xff);\n    buffer[index++] = (byte) ((i >> 24) & 0xff);\n    i = (int) (value >> 32);\n    buffer[index++] = (byte) ((i) & 0xff);\n    buffer[index++] = (byte) ((i >> 8) & 0xff);\n    buffer[index++] = (byte) ((i >> 16) & 0xff);\n    buffer[index] = (byte) ((i >> 24) & 0xff);\n  }\n\n  @Override\n  public void setFloat(int index, float value) {\n    requestCapacity(index + 4);\n\n    int iValue = Float.floatToRawIntBits(value);\n    buffer[index++] = (byte) ((iValue) & 0xff);\n    buffer[index++] = (byte) ((iValue >> 8) & 0xff);\n    buffer[index++] = (byte) ((iValue >> 16) & 0xff);\n    buffer[index] = (byte) ((iValue >> 24) & 0xff);\n  }\n\n  @Override\n  public void setDouble(int index, double value) {\n    requestCapacity(index + 8);\n\n    long lValue = Double.doubleToRawLongBits(value);\n    int i = (int) lValue;\n    buffer[index++] = (byte) ((i) & 0xff);\n    buffer[index++] = (byte) ((i >> 8) & 0xff);\n    buffer[index++] = (byte) ((i >> 16) & 0xff);\n    buffer[index++] = (byte) ((i >> 24) & 0xff);\n    i = (int) (lValue >> 32);\n    buffer[index++] = (byte) ((i) & 0xff);\n    buffer[index++] = (byte) ((i >> 8) & 0xff);\n    buffer[index++] = (byte) ((i >> 16) & 0xff);\n    buffer[index] = (byte) ((i >> 24) & 0xff);\n  }\n\n  @Override\n  public int limit() {\n    return writePos;\n  }\n\n  @Override\n  public int writePosition() {\n    return writePos;\n  }\n\n  @Override\n  public boolean requestCapacity(int capacity) {\n    if (capacity < 0) {\n      throw new IllegalArgumentException(\n          \"Capacity may not be negative (likely a previous int overflow)\");\n    }\n    if (buffer.length >= capacity) {\n      return true;\n    }\n    // implemented in the same growing fashion as ArrayList\n    int oldCapacity = buffer.length;\n    int newCapacity = oldCapacity + (oldCapacity >> 1);\n    if (newCapacity < capacity) { // Note: this also catches newCapacity int overflow\n      newCapacity = capacity;\n    }\n    buffer = Arrays.copyOf(buffer, newCapacity);\n    return true;\n  }\n}\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/BaseVector.java",
    "content": "/*\n * Copyright 2019 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.flatbuffers;\n\nimport java.nio.ByteBuffer;\n\n/// @cond FLATBUFFERS_INTERNAL\n\n/** All vector access objects derive from this class, and add their own accessors. */\npublic class BaseVector {\n  /** Used to hold the vector data position. */\n  private int vector;\n\n  /** Used to hold the vector size. */\n  private int length;\n\n  /** Used to hold the vector element size in table. */\n  private int element_size;\n\n  /** The underlying ByteBuffer to hold the data of the vector. */\n  protected ByteBuffer bb;\n\n  /**\n   * Get the start data of a vector.\n   *\n   * @return Returns the start of the vector data.\n   */\n  protected int __vector() {\n    return vector;\n  }\n\n  /**\n   * Gets the element position in vector's ByteBuffer.\n   *\n   * @param j An `int` index of element into a vector.\n   * @return Returns the position of the vector element in a ByteBuffer.\n   */\n  protected int __element(int j) {\n    return vector + j * element_size;\n  }\n\n  /**\n   * Re-init the internal state with an external buffer {@code ByteBuffer}, an offset within and\n   * element size.\n   *\n   * <p>This method exists primarily to allow recycling vector instances without risking memory\n   * leaks due to {@code ByteBuffer} references.\n   */\n  protected void __reset(int _vector, int _element_size, ByteBuffer _bb) {\n    bb = _bb;\n    if (bb != null) {\n      vector = _vector;\n      length = bb.getInt(_vector - Constants.SIZEOF_INT);\n      element_size = _element_size;\n    } else {\n      vector = 0;\n      length = 0;\n      element_size = 0;\n    }\n  }\n\n  /**\n   * Resets the internal state with a null {@code ByteBuffer} and a zero position.\n   *\n   * <p>This method exists primarily to allow recycling vector instances without risking memory\n   * leaks due to {@code ByteBuffer} references. The instance will be unusable until it is assigned\n   * again to a {@code ByteBuffer}.\n   */\n  public void reset() {\n    __reset(0, 0, null);\n  }\n\n  /**\n   * Get the length of a vector.\n   *\n   * @return Returns the length of the vector.\n   */\n  public int length() {\n    return length;\n  }\n}\n\n/// @endcond\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/BooleanVector.java",
    "content": "/*\n * Copyright 2019 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.flatbuffers;\n\nimport static com.google.flatbuffers.Constants.*;\n\nimport java.nio.ByteBuffer;\n\n/** Helper type for accessing vector of booleans. */\npublic final class BooleanVector extends BaseVector {\n  /**\n   * Assigns vector access object to vector data.\n   *\n   * @param _vector Start data of a vector.\n   * @param _bb Table's ByteBuffer.\n   * @return Returns current vector access object assigned to vector data whose offset is stored at\n   *     `vector`.\n   */\n  public BooleanVector __assign(int _vector, ByteBuffer _bb) {\n    __reset(_vector, Constants.SIZEOF_BYTE, _bb);\n    return this;\n  }\n\n  /**\n   * Reads the boolean at the given index.\n   *\n   * @param j The index from which the boolean will be read.\n   * @return the boolean value at the given index.\n   */\n  public boolean get(int j) {\n    return 0 != bb.get(__element(j));\n  }\n}\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/ByteBufferReadWriteBuf.java",
    "content": "package com.google.flatbuffers;\n\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\npublic class ByteBufferReadWriteBuf implements ReadWriteBuf {\n\n  private final ByteBuffer buffer;\n\n  public ByteBufferReadWriteBuf(ByteBuffer bb) {\n    this.buffer = bb;\n    this.buffer.order(ByteOrder.LITTLE_ENDIAN);\n  }\n\n  @Override\n  public void clear() {\n    buffer.clear();\n  }\n\n  @Override\n  public boolean getBoolean(int index) {\n    return get(index) != 0;\n  }\n\n  @Override\n  public byte get(int index) {\n    return buffer.get(index);\n  }\n\n  @Override\n  public short getShort(int index) {\n    return buffer.getShort(index);\n  }\n\n  @Override\n  public int getInt(int index) {\n    return buffer.getInt(index);\n  }\n\n  @Override\n  public long getLong(int index) {\n    return buffer.getLong(index);\n  }\n\n  @Override\n  public float getFloat(int index) {\n    return buffer.getFloat(index);\n  }\n\n  @Override\n  public double getDouble(int index) {\n    return buffer.getDouble(index);\n  }\n\n  @Override\n  public String getString(int start, int size) {\n    return Utf8Safe.decodeUtf8Buffer(buffer, start, size);\n  }\n\n  @Override\n  public byte[] data() {\n    return buffer.array();\n  }\n\n  @Override\n  public void putBoolean(boolean value) {\n    buffer.put(value ? (byte) 1 : (byte) 0);\n  }\n\n  @Override\n  public void put(byte[] value, int start, int length) {\n    buffer.put(value, start, length);\n  }\n\n  @Override\n  public void put(byte value) {\n    buffer.put(value);\n  }\n\n  @Override\n  public void putShort(short value) {\n    buffer.putShort(value);\n  }\n\n  @Override\n  public void putInt(int value) {\n    buffer.putInt(value);\n  }\n\n  @Override\n  public void putLong(long value) {\n    buffer.putLong(value);\n  }\n\n  @Override\n  public void putFloat(float value) {\n    buffer.putFloat(value);\n  }\n\n  @Override\n  public void putDouble(double value) {\n    buffer.putDouble(value);\n  }\n\n  @Override\n  public void setBoolean(int index, boolean value) {\n    set(index, value ? (byte) 1 : (byte) 0);\n  }\n\n  @Override\n  public void set(int index, byte value) {\n    requestCapacity(index + 1);\n    buffer.put(index, value);\n  }\n\n  @Override\n  public void set(int index, byte[] value, int start, int length) {\n    requestCapacity(index + (length - start));\n    int curPos = buffer.position();\n    buffer.position(index);\n    buffer.put(value, start, length);\n    buffer.position(curPos);\n  }\n\n  @Override\n  public void setShort(int index, short value) {\n    requestCapacity(index + 2);\n    buffer.putShort(index, value);\n  }\n\n  @Override\n  public void setInt(int index, int value) {\n    requestCapacity(index + 4);\n    buffer.putInt(index, value);\n  }\n\n  @Override\n  public void setLong(int index, long value) {\n    requestCapacity(index + 8);\n    buffer.putLong(index, value);\n  }\n\n  @Override\n  public void setFloat(int index, float value) {\n    requestCapacity(index + 4);\n    buffer.putFloat(index, value);\n  }\n\n  @Override\n  public void setDouble(int index, double value) {\n    requestCapacity(index + 8);\n    buffer.putDouble(index, value);\n  }\n\n  @Override\n  public int writePosition() {\n    return buffer.position();\n  }\n\n  @Override\n  public int limit() {\n    return buffer.limit();\n  }\n\n  @Override\n  public boolean requestCapacity(int capacity) {\n    return capacity <= buffer.limit();\n  }\n}\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/ByteBufferUtil.java",
    "content": "/*\n * Copyright 2017 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.flatbuffers;\n\nimport static com.google.flatbuffers.Constants.*;\n\nimport java.nio.ByteBuffer;\n\n/// @file\n/// @addtogroup flatbuffers_java_api\n/// @{\n\n/** Class that collects utility functions around `ByteBuffer`. */\npublic class ByteBufferUtil {\n\n  /**\n   * Extract the size prefix from a `ByteBuffer`.\n   *\n   * @param bb a size-prefixed buffer\n   * @return the size prefix\n   */\n  public static int getSizePrefix(ByteBuffer bb) {\n    return bb.getInt(bb.position());\n  }\n\n  /**\n   * Create a duplicate of a size-prefixed `ByteBuffer` that has its position advanced just past the\n   * size prefix.\n   *\n   * @param bb a size-prefixed buffer\n   * @return a new buffer on the same underlying data that has skipped the size prefix\n   */\n  public static ByteBuffer removeSizePrefix(ByteBuffer bb) {\n    ByteBuffer s = bb.duplicate();\n    s.position(s.position() + SIZE_PREFIX_LENGTH);\n    return s;\n  }\n}\n\n/// @}\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/ByteVector.java",
    "content": "/*\n * Copyright 2019 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.flatbuffers;\n\nimport static com.google.flatbuffers.Constants.*;\n\nimport java.nio.ByteBuffer;\n\n/** Helper type for accessing vector of signed or unsigned 8-bit values. */\npublic final class ByteVector extends BaseVector {\n  /**\n   * Assigns vector access object to vector data.\n   *\n   * @param vector Start data of a vector.\n   * @param bb Table's ByteBuffer.\n   * @return Returns current vector access object assigned to vector data whose offset is stored at\n   *     `vector`.\n   */\n  public ByteVector __assign(int vector, ByteBuffer bb) {\n    __reset(vector, Constants.SIZEOF_BYTE, bb);\n    return this;\n  }\n\n  /**\n   * Reads the byte at the given index.\n   *\n   * @param j The index from which the byte will be read.\n   * @return the 8-bit value at the given index.\n   */\n  public byte get(int j) {\n    return bb.get(__element(j));\n  }\n\n  /**\n   * Reads the byte at the given index, zero-extends it to type int, and returns the result, which\n   * is therefore in the range 0 through 255.\n   *\n   * @param j The index from which the byte will be read.\n   * @return the unsigned 8-bit at the given index.\n   */\n  public int getAsUnsigned(int j) {\n    return (int) get(j) & 0xFF;\n  }\n}\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/Constants.java",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.flatbuffers;\n\n/// @cond FLATBUFFERS_INTERNAL\n\n/** Class that holds shared constants */\npublic class Constants {\n  // Java doesn't seem to have these.\n  /** The number of bytes in an `byte`. */\n  static final int SIZEOF_BYTE = 1;\n\n  /** The number of bytes in a `short`. */\n  static final int SIZEOF_SHORT = 2;\n\n  /** The number of bytes in an `int`. */\n  static final int SIZEOF_INT = 4;\n\n  /** The number of bytes in an `float`. */\n  static final int SIZEOF_FLOAT = 4;\n\n  /** The number of bytes in an `long`. */\n  static final int SIZEOF_LONG = 8;\n\n  /** The number of bytes in an `double`. */\n  static final int SIZEOF_DOUBLE = 8;\n\n  /** The number of bytes in a file identifier. */\n  static final int FILE_IDENTIFIER_LENGTH = 4;\n\n  /** The number of bytes in a size prefix. */\n  public static final int SIZE_PREFIX_LENGTH = 4;\n\n  /**\n   * A version identifier to force a compile error if someone accidentally tries to build generated\n   * code with a runtime of two mismatched version. Versions need to always match, as the runtime\n   * and generated code are modified in sync. Changes to the Java implementation need to be sure to\n   * change the version here and in the code generator on every possible incompatible change\n   */\n  public static void FLATBUFFERS_25_12_19() {}\n}\n\n/// @endcond\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/DoubleVector.java",
    "content": "/*\n * Copyright 2019 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.flatbuffers;\n\nimport static com.google.flatbuffers.Constants.*;\n\nimport java.nio.ByteBuffer;\n\n/** Helper type for accessing vector of double values. */\npublic final class DoubleVector extends BaseVector {\n  /**\n   * Assigns vector access object to vector data.\n   *\n   * @param _vector Start data of a vector.\n   * @param _bb Table's ByteBuffer.\n   * @return Returns current vector access object assigned to vector data whose offset is stored at\n   *     `vector`.\n   */\n  public DoubleVector __assign(int _vector, ByteBuffer _bb) {\n    __reset(_vector, Constants.SIZEOF_DOUBLE, _bb);\n    return this;\n  }\n\n  /**\n   * Reads the double value at the given index.\n   *\n   * @param j The index from which the double value will be read.\n   * @return the double value at the given index.\n   */\n  public double get(int j) {\n    return bb.getDouble(__element(j));\n  }\n}\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/FlatBufferBuilder.java",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.flatbuffers;\n\nimport static com.google.flatbuffers.Constants.*;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.nio.*;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.Map;\n\n/// @file\n/// @addtogroup flatbuffers_java_api\n/// @{\n\n/**\n * Class that helps you build a FlatBuffer. See the section \"Use in Java/C#\" in the main FlatBuffers\n * documentation.\n */\npublic class FlatBufferBuilder {\n  /// @cond FLATBUFFERS_INTERNAL\n  ByteBuffer bb; // Where we construct the FlatBuffer.\n  int space; // Remaining space in the ByteBuffer.\n  int minalign = 1; // Minimum alignment encountered so far.\n  int[] vtable = null; // The vtable for the current table.\n  int vtable_in_use = 0; // The amount of fields we're actually using.\n  boolean nested = false; // Whether we are currently serializing a table.\n  boolean finished = false; // Whether the buffer is finished.\n  int object_start; // Starting offset of the current struct/table.\n  int[] vtables = new int[16]; // List of offsets of all vtables.\n  int num_vtables = 0; // Number of entries in `vtables` in use.\n  int vector_num_elems = 0; // For the current vector being built.\n  boolean force_defaults = false; // False omits default values from the serialized data.\n  ByteBufferFactory bb_factory; // Factory for allocating the internal buffer\n  final Utf8 utf8; // UTF-8 encoder to use\n  Map<String, Integer> string_pool; // map used to cache shared strings.\n\n  /// @endcond\n\n  /**\n   * Maximum size of buffer to allocate. If we're allocating arrays on the heap, the header size of\n   * the array counts towards its maximum size.\n   */\n  private static final int MAX_BUFFER_SIZE = Integer.MAX_VALUE - 8;\n\n  /** Default buffer size that is allocated if an initial size is not given, or is non positive. */\n  private static final int DEFAULT_BUFFER_SIZE = 1024;\n\n  /**\n   * Start with a buffer of size `initial_size`, then grow as required.\n   *\n   * @param initial_size The initial size of the internal buffer to use.\n   * @param bb_factory The factory to be used for allocating the internal buffer\n   */\n  public FlatBufferBuilder(int initial_size, ByteBufferFactory bb_factory) {\n    this(initial_size, bb_factory, null, Utf8.getDefault());\n  }\n\n  /**\n   * Start with a buffer of size `initial_size`, then grow as required.\n   *\n   * @param initial_size The initial size of the internal buffer to use.\n   * @param bb_factory The factory to be used for allocating the internal buffer\n   * @param existing_bb The byte buffer to reuse.\n   * @param utf8 The Utf8 codec\n   */\n  public FlatBufferBuilder(\n      int initial_size, ByteBufferFactory bb_factory, ByteBuffer existing_bb, Utf8 utf8) {\n    if (initial_size <= 0) {\n      initial_size = DEFAULT_BUFFER_SIZE;\n    }\n    this.bb_factory = bb_factory;\n    if (existing_bb != null) {\n      bb = existing_bb;\n      bb.clear();\n      bb.order(ByteOrder.LITTLE_ENDIAN);\n    } else {\n      bb = bb_factory.newByteBuffer(initial_size);\n    }\n    this.utf8 = utf8;\n    space = bb.capacity();\n  }\n\n  /**\n   * Start with a buffer of size `initial_size`, then grow as required.\n   *\n   * @param initial_size The initial size of the internal buffer to use.\n   */\n  public FlatBufferBuilder(int initial_size) {\n    this(initial_size, HeapByteBufferFactory.INSTANCE, null, Utf8.getDefault());\n  }\n\n  /** Start with a buffer of 1KiB, then grow as required. */\n  public FlatBufferBuilder() {\n    this(DEFAULT_BUFFER_SIZE);\n  }\n\n  /**\n   * Alternative constructor allowing reuse of {@link ByteBuffer}s. The builder can still grow the\n   * buffer as necessary. User classes should make sure to call {@link #dataBuffer()} to obtain the\n   * resulting encoded message.\n   *\n   * @param existing_bb The byte buffer to reuse.\n   * @param bb_factory The factory to be used for allocating a new internal buffer if the existing\n   *     buffer needs to grow\n   */\n  public FlatBufferBuilder(ByteBuffer existing_bb, ByteBufferFactory bb_factory) {\n    this(existing_bb.capacity(), bb_factory, existing_bb, Utf8.getDefault());\n  }\n\n  /**\n   * Alternative constructor allowing reuse of {@link ByteBuffer}s. The builder can still grow the\n   * buffer as necessary. User classes should make sure to call {@link #dataBuffer()} to obtain the\n   * resulting encoded message.\n   *\n   * @param existing_bb The byte buffer to reuse.\n   */\n  public FlatBufferBuilder(ByteBuffer existing_bb) {\n    this(existing_bb, new HeapByteBufferFactory());\n  }\n\n  /**\n   * Alternative initializer that allows reusing this object on an existing `ByteBuffer`. This\n   * method resets the builder's internal state, but keeps objects that have been allocated for\n   * temporary storage.\n   *\n   * @param existing_bb The byte buffer to reuse.\n   * @param bb_factory The factory to be used for allocating a new internal buffer if the existing\n   *     buffer needs to grow\n   * @return Returns `this`.\n   */\n  public FlatBufferBuilder init(ByteBuffer existing_bb, ByteBufferFactory bb_factory) {\n    this.bb_factory = bb_factory;\n    bb = existing_bb;\n    bb.clear();\n    bb.order(ByteOrder.LITTLE_ENDIAN);\n    minalign = 1;\n    space = bb.capacity();\n    vtable_in_use = 0;\n    nested = false;\n    finished = false;\n    object_start = 0;\n    num_vtables = 0;\n    vector_num_elems = 0;\n    if (string_pool != null) {\n      string_pool.clear();\n    }\n    return this;\n  }\n\n  /**\n   * An interface that provides a user of the FlatBufferBuilder class the ability to specify the\n   * method in which the internal buffer gets allocated. This allows for alternatives to the default\n   * behavior, which is to allocate memory for a new byte-array backed `ByteBuffer` array inside the\n   * JVM.\n   *\n   * <p>The FlatBufferBuilder class contains the HeapByteBufferFactory class to preserve the default\n   * behavior in the event that the user does not provide their own implementation of this\n   * interface.\n   */\n  public abstract static class ByteBufferFactory {\n    /**\n     * Create a `ByteBuffer` with a given capacity. The returned ByteBuf must have a\n     * ByteOrder.LITTLE_ENDIAN ByteOrder.\n     *\n     * @param capacity The size of the `ByteBuffer` to allocate.\n     * @return Returns the new `ByteBuffer` that was allocated.\n     */\n    public abstract ByteBuffer newByteBuffer(int capacity);\n\n    /**\n     * Release a ByteBuffer. Current {@link FlatBufferBuilder} released any reference to it, so it\n     * is safe to dispose the buffer or return it to a pool. It is not guaranteed that the buffer\n     * has been created with {@link #newByteBuffer(int) }.\n     *\n     * @param bb the buffer to release\n     */\n    public void releaseByteBuffer(ByteBuffer bb) {}\n  }\n\n  /**\n   * An implementation of the ByteBufferFactory interface that is used when one is not provided by\n   * the user.\n   *\n   * <p>Allocate memory for a new byte-array backed `ByteBuffer` array inside the JVM.\n   */\n  public static final class HeapByteBufferFactory extends ByteBufferFactory {\n\n    public static final HeapByteBufferFactory INSTANCE = new HeapByteBufferFactory();\n\n    @Override\n    public ByteBuffer newByteBuffer(int capacity) {\n      return ByteBuffer.allocate(capacity).order(ByteOrder.LITTLE_ENDIAN);\n    }\n  }\n\n  /**\n   * Helper function to test if a field is present in the table\n   *\n   * @param table Flatbuffer table\n   * @param offset virtual table offset\n   * @return true if the filed is present\n   */\n  public static boolean isFieldPresent(Table table, int offset) {\n    return table.__offset(offset) != 0;\n  }\n\n  /** Reset the FlatBufferBuilder by purging all data that it holds. */\n  public void clear() {\n    space = bb.capacity();\n    bb.clear();\n    minalign = 1;\n    while (vtable_in_use > 0) vtable[--vtable_in_use] = 0;\n    vtable_in_use = 0;\n    nested = false;\n    finished = false;\n    object_start = 0;\n    num_vtables = 0;\n    vector_num_elems = 0;\n    if (string_pool != null) {\n      string_pool.clear();\n    }\n  }\n\n  /**\n   * Doubles the size of the backing {@link ByteBuffer} and copies the old data towards the end of\n   * the new buffer (since we build the buffer backwards).\n   *\n   * @param bb The current buffer with the existing data.\n   * @param bb_factory The factory to be used for allocating the new internal buffer\n   * @return A new byte buffer with the old data copied copied to it. The data is located at the end\n   *     of the buffer.\n   */\n  static ByteBuffer growByteBuffer(ByteBuffer bb, ByteBufferFactory bb_factory) {\n    int old_buf_size = bb.capacity();\n\n    int new_buf_size;\n\n    if (old_buf_size == 0) {\n      new_buf_size = DEFAULT_BUFFER_SIZE;\n    } else {\n      if (old_buf_size == MAX_BUFFER_SIZE) { // Ensure we don't grow beyond what fits in an int.\n        throw new AssertionError(\"FlatBuffers: cannot grow buffer beyond 2 gigabytes.\");\n      }\n      new_buf_size = (old_buf_size & 0xC0000000) != 0 ? MAX_BUFFER_SIZE : old_buf_size << 1;\n    }\n\n    bb.position(0);\n    ByteBuffer nbb = bb_factory.newByteBuffer(new_buf_size);\n    new_buf_size = nbb.clear().capacity(); // Ensure the returned buffer is treated as empty\n    nbb.position(new_buf_size - old_buf_size);\n    nbb.put(bb);\n    return nbb;\n  }\n\n  /**\n   * Offset relative to the end of the buffer.\n   *\n   * @return Offset relative to the end of the buffer.\n   */\n  public int offset() {\n    return bb.capacity() - space;\n  }\n\n  /**\n   * Add zero valued bytes to prepare a new entry to be added.\n   *\n   * @param byte_size Number of bytes to add.\n   */\n  public void pad(int byte_size) {\n    for (int i = 0; i < byte_size; i++) bb.put(--space, (byte) 0);\n  }\n\n  /**\n   * Prepare to write an element of `size` after `additional_bytes` have been written, e.g. if you\n   * write a string, you need to align such the int length field is aligned to {@link\n   * com.google.flatbuffers.Constants#SIZEOF_INT}, and the string data follows it directly. If all\n   * you need to do is alignment, `additional_bytes` will be 0.\n   *\n   * @param size This is the of the new element to write.\n   * @param additional_bytes The padding size.\n   */\n  public void prep(int size, int additional_bytes) {\n    // Track the biggest thing we've ever aligned to.\n    if (size > minalign) minalign = size;\n    // Find the amount of alignment needed such that `size` is properly\n    // aligned after `additional_bytes`\n    int align_size = ((~(bb.capacity() - space + additional_bytes)) + 1) & (size - 1);\n    // Reallocate the buffer if needed.\n    while (space < align_size + size + additional_bytes) {\n      int old_buf_size = bb.capacity();\n      ByteBuffer old = bb;\n      bb = growByteBuffer(old, bb_factory);\n      if (old != bb) {\n        bb_factory.releaseByteBuffer(old);\n      }\n      space += bb.capacity() - old_buf_size;\n    }\n    pad(align_size);\n  }\n\n  /**\n   * Add a `boolean` to the buffer, backwards from the current location. Doesn't align nor check for\n   * space.\n   *\n   * @param x A `boolean` to put into the buffer.\n   */\n  public void putBoolean(boolean x) {\n    bb.put(space -= Constants.SIZEOF_BYTE, (byte) (x ? 1 : 0));\n  }\n\n  /**\n   * Add a `byte` to the buffer, backwards from the current location. Doesn't align nor check for\n   * space.\n   *\n   * @param x A `byte` to put into the buffer.\n   */\n  public void putByte(byte x) {\n    bb.put(space -= Constants.SIZEOF_BYTE, x);\n  }\n\n  /**\n   * Add a `short` to the buffer, backwards from the current location. Doesn't align nor check for\n   * space.\n   *\n   * @param x A `short` to put into the buffer.\n   */\n  public void putShort(short x) {\n    bb.putShort(space -= Constants.SIZEOF_SHORT, x);\n  }\n\n  /**\n   * Add an `int` to the buffer, backwards from the current location. Doesn't align nor check for\n   * space.\n   *\n   * @param x An `int` to put into the buffer.\n   */\n  public void putInt(int x) {\n    bb.putInt(space -= Constants.SIZEOF_INT, x);\n  }\n\n  /**\n   * Add a `long` to the buffer, backwards from the current location. Doesn't align nor check for\n   * space.\n   *\n   * @param x A `long` to put into the buffer.\n   */\n  public void putLong(long x) {\n    bb.putLong(space -= Constants.SIZEOF_LONG, x);\n  }\n\n  /**\n   * Add a `float` to the buffer, backwards from the current location. Doesn't align nor check for\n   * space.\n   *\n   * @param x A `float` to put into the buffer.\n   */\n  public void putFloat(float x) {\n    bb.putFloat(space -= Constants.SIZEOF_FLOAT, x);\n  }\n\n  /**\n   * Add a `double` to the buffer, backwards from the current location. Doesn't align nor check for\n   * space.\n   *\n   * @param x A `double` to put into the buffer.\n   */\n  public void putDouble(double x) {\n    bb.putDouble(space -= Constants.SIZEOF_DOUBLE, x);\n  }\n\n  /// @endcond\n\n  /**\n   * Add a `boolean` to the buffer, properly aligned, and grows the buffer (if necessary).\n   *\n   * @param x A `boolean` to put into the buffer.\n   */\n  public void addBoolean(boolean x) {\n    prep(Constants.SIZEOF_BYTE, 0);\n    putBoolean(x);\n  }\n\n  /**\n   * Add a `byte` to the buffer, properly aligned, and grows the buffer (if necessary).\n   *\n   * @param x A `byte` to put into the buffer.\n   */\n  public void addByte(byte x) {\n    prep(Constants.SIZEOF_BYTE, 0);\n    putByte(x);\n  }\n\n  /**\n   * Add a `short` to the buffer, properly aligned, and grows the buffer (if necessary).\n   *\n   * @param x A `short` to put into the buffer.\n   */\n  public void addShort(short x) {\n    prep(Constants.SIZEOF_SHORT, 0);\n    putShort(x);\n  }\n\n  /**\n   * Add an `int` to the buffer, properly aligned, and grows the buffer (if necessary).\n   *\n   * @param x An `int` to put into the buffer.\n   */\n  public void addInt(int x) {\n    prep(Constants.SIZEOF_INT, 0);\n    putInt(x);\n  }\n\n  /**\n   * Add a `long` to the buffer, properly aligned, and grows the buffer (if necessary).\n   *\n   * @param x A `long` to put into the buffer.\n   */\n  public void addLong(long x) {\n    prep(Constants.SIZEOF_LONG, 0);\n    putLong(x);\n  }\n\n  /**\n   * Add a `float` to the buffer, properly aligned, and grows the buffer (if necessary).\n   *\n   * @param x A `float` to put into the buffer.\n   */\n  public void addFloat(float x) {\n    prep(Constants.SIZEOF_FLOAT, 0);\n    putFloat(x);\n  }\n\n  /**\n   * Add a `double` to the buffer, properly aligned, and grows the buffer (if necessary).\n   *\n   * @param x A `double` to put into the buffer.\n   */\n  public void addDouble(double x) {\n    prep(Constants.SIZEOF_DOUBLE, 0);\n    putDouble(x);\n  }\n\n  /**\n   * Adds on offset, relative to where it will be written.\n   *\n   * @param off The offset to add.\n   */\n  public void addOffset(int off) {\n    prep(SIZEOF_INT, 0); // Ensure alignment is already done.\n    assert off <= offset();\n    off = offset() - off + SIZEOF_INT;\n    putInt(off);\n  }\n\n  /// @cond FLATBUFFERS_INTERNAL\n  /**\n   * Start a new array/vector of objects. Users usually will not call this directly. The\n   * `FlatBuffers` compiler will create a start/end method for vector types in generated code.\n   *\n   * <p>The expected sequence of calls is:\n   *\n   * <ol>\n   *   <li>Start the array using this method.\n   *   <li>Call {@link #addOffset(int)} `num_elems` number of times to set the offset of each\n   *       element in the array.\n   *   <li>Call {@link #endVector()} to retrieve the offset of the array.\n   * </ol>\n   *\n   * <p>For example, to create an array of strings, do:\n   *\n   * <pre>{@code\n   * // Need 10 strings\n   * FlatBufferBuilder builder = new FlatBufferBuilder(existingBuffer);\n   * int[] offsets = new int[10];\n   *\n   * for (int i = 0; i < 10; i++) {\n   *   offsets[i] = fbb.createString(\" \" + i);\n   * }\n   *\n   * // Have the strings in the buffer, but don't have a vector.\n   * // Add a vector that references the newly created strings:\n   * builder.startVector(4, offsets.length, 4);\n   *\n   * // Add each string to the newly created vector\n   * // The strings are added in reverse order since the buffer\n   * // is filled in back to front\n   * for (int i = offsets.length - 1; i >= 0; i--) {\n   *   builder.addOffset(offsets[i]);\n   * }\n   *\n   * // Finish off the vector\n   * int offsetOfTheVector = fbb.endVector();\n   * }</pre>\n   *\n   * @param elem_size The size of each element in the array.\n   * @param num_elems The number of elements in the array.\n   * @param alignment The alignment of the array.\n   */\n  public void startVector(int elem_size, int num_elems, int alignment) {\n    notNested();\n    vector_num_elems = num_elems;\n    prep(SIZEOF_INT, elem_size * num_elems);\n    prep(alignment, elem_size * num_elems); // Just in case alignment > int.\n    nested = true;\n  }\n\n  /**\n   * Finish off the creation of an array and all its elements. The array must be created with {@link\n   * #startVector(int, int, int)}.\n   *\n   * @return The offset at which the newly created array starts.\n   * @see #startVector(int, int, int)\n   */\n  public int endVector() {\n    if (!nested) throw new AssertionError(\"FlatBuffers: endVector called without startVector\");\n    nested = false;\n    putInt(vector_num_elems);\n    return offset();\n  }\n\n  /// @endcond\n\n  /**\n   * Create a new array/vector and return a ByteBuffer to be filled later. Call {@link #endVector}\n   * after this method to get an offset to the beginning of vector.\n   *\n   * @param elem_size the size of each element in bytes.\n   * @param num_elems number of elements in the vector.\n   * @param alignment byte alignment.\n   * @return ByteBuffer with position and limit set to the space allocated for the array.\n   */\n  public ByteBuffer createUnintializedVector(int elem_size, int num_elems, int alignment) {\n    int length = elem_size * num_elems;\n    startVector(elem_size, num_elems, alignment);\n\n    bb.position(space -= length);\n\n    // Slice and limit the copy vector to point to the 'array'\n    ByteBuffer copy = bb.slice().order(ByteOrder.LITTLE_ENDIAN);\n    copy.limit(length);\n    return copy;\n  }\n\n  /**\n   * Create a vector of tables.\n   *\n   * @param offsets Offsets of the tables.\n   * @return Returns offset of the vector.\n   */\n  public int createVectorOfTables(int[] offsets) {\n    notNested();\n    startVector(Constants.SIZEOF_INT, offsets.length, Constants.SIZEOF_INT);\n    for (int i = offsets.length - 1; i >= 0; i--) addOffset(offsets[i]);\n    return endVector();\n  }\n\n  /**\n   * Create a vector of sorted by the key tables.\n   *\n   * @param obj Instance of the table subclass.\n   * @param offsets Offsets of the tables.\n   * @return Returns offset of the sorted vector.\n   */\n  public <T extends Table> int createSortedVectorOfTables(T obj, int[] offsets) {\n    obj.sortTables(offsets, bb);\n    return createVectorOfTables(offsets);\n  }\n\n  /**\n   * Encode the String `s` in the buffer using UTF-8. If a String with this exact contents has\n   * already been serialized using this method, instead simply returns the offset of the existing\n   * String.\n   *\n   * <p>Usage of the method will incur into additional allocations, so it is advisable to use it\n   * only when it is known upfront that your message will have several repeated strings.\n   *\n   * @param s The String to encode.\n   * @return The offset in the buffer where the encoded String starts.\n   */\n  public int createSharedString(String s) {\n\n    if (string_pool == null) {\n      string_pool = new HashMap<>();\n      int offset = createString(s);\n      string_pool.put(s, offset);\n      return offset;\n    }\n\n    Integer offset = string_pool.get(s);\n\n    if (offset == null) {\n      offset = createString(s);\n      string_pool.put(s, offset);\n    }\n    return offset;\n  }\n\n  /**\n   * Encode the string `s` in the buffer using UTF-8. If {@code s} is already a {@link CharBuffer},\n   * this method is allocation free.\n   *\n   * @param s The string to encode.\n   * @return The offset in the buffer where the encoded string starts.\n   */\n  public int createString(CharSequence s) {\n    int length = utf8.encodedLength(s);\n    addByte((byte) 0);\n    startVector(1, length, 1);\n    bb.position(space -= length);\n    utf8.encodeUtf8(s, bb);\n    return endVector();\n  }\n\n  /**\n   * Create a string in the buffer from an already encoded UTF-8 string in a ByteBuffer.\n   *\n   * @param s An already encoded UTF-8 string as a `ByteBuffer`.\n   * @return The offset in the buffer where the encoded string starts.\n   */\n  public int createString(ByteBuffer s) {\n    int length = s.remaining();\n    addByte((byte) 0);\n    startVector(1, length, 1);\n    bb.position(space -= length);\n    bb.put(s);\n    return endVector();\n  }\n\n  /**\n   * Create a byte array in the buffer.\n   *\n   * @param arr A source array with data\n   * @return The offset in the buffer where the encoded array starts.\n   */\n  public int createByteVector(byte[] arr) {\n    int length = arr.length;\n    startVector(1, length, 1);\n    bb.position(space -= length);\n    bb.put(arr);\n    return endVector();\n  }\n\n  /**\n   * Create a byte array in the buffer.\n   *\n   * @param arr a source array with data.\n   * @param offset the offset in the source array to start copying from.\n   * @param length the number of bytes to copy from the source array.\n   * @return The offset in the buffer where the encoded array starts.\n   */\n  public int createByteVector(byte[] arr, int offset, int length) {\n    startVector(1, length, 1);\n    bb.position(space -= length);\n    bb.put(arr, offset, length);\n    return endVector();\n  }\n\n  /**\n   * Create a byte array in the buffer.\n   *\n   * <p>The source {@link ByteBuffer} position is advanced by {@link ByteBuffer#remaining()} places\n   * after this call.\n   *\n   * @param byteBuffer A source {@link ByteBuffer} with data.\n   * @return The offset in the buffer where the encoded array starts.\n   */\n  public int createByteVector(ByteBuffer byteBuffer) {\n    int length = byteBuffer.remaining();\n    startVector(1, length, 1);\n    bb.position(space -= length);\n    bb.put(byteBuffer);\n    return endVector();\n  }\n\n  /// @cond FLATBUFFERS_INTERNAL\n  /** Should not be accessing the final buffer before it is finished. */\n  public void finished() {\n    if (!finished)\n      throw new AssertionError(\n          \"FlatBuffers: you can only access the serialized buffer after it has been\"\n              + \" finished by FlatBufferBuilder.finish().\");\n  }\n\n  /**\n   * Should not be creating any other object, string or vector while an object is being constructed.\n   */\n  public void notNested() {\n    if (nested) throw new AssertionError(\"FlatBuffers: object serialization must not be nested.\");\n  }\n\n  /**\n   * Structures are always stored inline, they need to be created right where they're used. You'll\n   * get this assertion failure if you created it elsewhere.\n   *\n   * @param obj The offset of the created object.\n   */\n  public void Nested(int obj) {\n    if (obj != offset()) throw new AssertionError(\"FlatBuffers: struct must be serialized inline.\");\n  }\n\n  /**\n   * Start encoding a new object in the buffer. Users will not usually need to call this directly.\n   * The `FlatBuffers` compiler will generate helper methods that call this method internally.\n   *\n   * <p>For example, using the \"Monster\" code found on the \"landing page\". An object of type\n   * `Monster` can be created using the following code:\n   *\n   * <pre>{@code\n   * int testArrayOfString = Monster.createTestarrayofstringVector(fbb, new int[] {\n   *   fbb.createString(\"test1\"),\n   *   fbb.createString(\"test2\")\n   * });\n   *\n   * Monster.startMonster(fbb);\n   * Monster.addPos(fbb, Vec3.createVec3(fbb, 1.0f, 2.0f, 3.0f, 3.0,\n   *   Color.Green, (short)5, (byte)6));\n   * Monster.addHp(fbb, (short)80);\n   * Monster.addName(fbb, str);\n   * Monster.addInventory(fbb, inv);\n   * Monster.addTestType(fbb, (byte)Any.Monster);\n   * Monster.addTest(fbb, mon2);\n   * Monster.addTest4(fbb, test4);\n   * Monster.addTestarrayofstring(fbb, testArrayOfString);\n   * int mon = Monster.endMonster(fbb);\n   * }</pre>\n   *\n   * <p>Here:\n   *\n   * <ul>\n   *   <li>The call to `Monster#startMonster(FlatBufferBuilder)` will call this method with the\n   *       right number of fields set.\n   *   <li>`Monster#endMonster(FlatBufferBuilder)` will ensure {@link #endObject()} is called.\n   * </ul>\n   *\n   * <p>It's not recommended to call this method directly. If it's called manually, you must ensure\n   * to audit all calls to it whenever fields are added or removed from your schema. This is\n   * automatically done by the code generated by the `FlatBuffers` compiler.\n   *\n   * @param numfields The number of fields found in this object.\n   */\n  public void startTable(int numfields) {\n    notNested();\n    if (vtable == null || vtable.length < numfields) vtable = new int[numfields];\n    vtable_in_use = numfields;\n    Arrays.fill(vtable, 0, vtable_in_use, 0);\n    nested = true;\n    object_start = offset();\n  }\n\n  /**\n   * Add a `boolean` to a table at `o` into its vtable, with value `x` and default `d`.\n   *\n   * @param o The index into the vtable.\n   * @param x A `boolean` to put into the buffer, depending on how defaults are handled. If\n   *     `force_defaults` is `false`, compare `x` against the default value `d`. If `x` contains the\n   *     default value, it can be skipped.\n   * @param d A `boolean` default value to compare against when `force_defaults` is `false`.\n   */\n  public void addBoolean(int o, boolean x, boolean d) {\n    if (force_defaults || x != d) {\n      addBoolean(x);\n      slot(o);\n    }\n  }\n\n  /**\n   * Add a `byte` to a table at `o` into its vtable, with value `x` and default `d`.\n   *\n   * @param o The index into the vtable.\n   * @param x A `byte` to put into the buffer, depending on how defaults are handled. If\n   *     `force_defaults` is `false`, compare `x` against the default value `d`. If `x` contains the\n   *     default value, it can be skipped.\n   * @param d A `byte` default value to compare against when `force_defaults` is `false`.\n   */\n  public void addByte(int o, byte x, int d) {\n    if (force_defaults || x != d) {\n      addByte(x);\n      slot(o);\n    }\n  }\n\n  /**\n   * Add a `short` to a table at `o` into its vtable, with value `x` and default `d`.\n   *\n   * @param o The index into the vtable.\n   * @param x A `short` to put into the buffer, depending on how defaults are handled. If\n   *     `force_defaults` is `false`, compare `x` against the default value `d`. If `x` contains the\n   *     default value, it can be skipped.\n   * @param d A `short` default value to compare against when `force_defaults` is `false`.\n   */\n  public void addShort(int o, short x, int d) {\n    if (force_defaults || x != d) {\n      addShort(x);\n      slot(o);\n    }\n  }\n\n  /**\n   * Add an `int` to a table at `o` into its vtable, with value `x` and default `d`.\n   *\n   * @param o The index into the vtable.\n   * @param x An `int` to put into the buffer, depending on how defaults are handled. If\n   *     `force_defaults` is `false`, compare `x` against the default value `d`. If `x` contains the\n   *     default value, it can be skipped.\n   * @param d An `int` default value to compare against when `force_defaults` is `false`.\n   */\n  public void addInt(int o, int x, int d) {\n    if (force_defaults || x != d) {\n      addInt(x);\n      slot(o);\n    }\n  }\n\n  /**\n   * Add a `long` to a table at `o` into its vtable, with value `x` and default `d`.\n   *\n   * @param o The index into the vtable.\n   * @param x A `long` to put into the buffer, depending on how defaults are handled. If\n   *     `force_defaults` is `false`, compare `x` against the default value `d`. If `x` contains the\n   *     default value, it can be skipped.\n   * @param d A `long` default value to compare against when `force_defaults` is `false`.\n   */\n  public void addLong(int o, long x, long d) {\n    if (force_defaults || x != d) {\n      addLong(x);\n      slot(o);\n    }\n  }\n\n  /**\n   * Add a `float` to a table at `o` into its vtable, with value `x` and default `d`.\n   *\n   * @param o The index into the vtable.\n   * @param x A `float` to put into the buffer, depending on how defaults are handled. If\n   *     `force_defaults` is `false`, compare `x` against the default value `d`. If `x` contains the\n   *     default value, it can be skipped.\n   * @param d A `float` default value to compare against when `force_defaults` is `false`.\n   */\n  public void addFloat(int o, float x, double d) {\n    if (force_defaults || x != d) {\n      addFloat(x);\n      slot(o);\n    }\n  }\n\n  /**\n   * Add a `double` to a table at `o` into its vtable, with value `x` and default `d`.\n   *\n   * @param o The index into the vtable.\n   * @param x A `double` to put into the buffer, depending on how defaults are handled. If\n   *     `force_defaults` is `false`, compare `x` against the default value `d`. If `x` contains the\n   *     default value, it can be skipped.\n   * @param d A `double` default value to compare against when `force_defaults` is `false`.\n   */\n  public void addDouble(int o, double x, double d) {\n    if (force_defaults || x != d) {\n      addDouble(x);\n      slot(o);\n    }\n  }\n\n  /**\n   * Add an `offset` to a table at `o` into its vtable, with value `x` and default `d`.\n   *\n   * @param o The index into the vtable.\n   * @param x An `offset` to put into the buffer, depending on how defaults are handled. If\n   *     `force_defaults` is `false`, compare `x` against the default value `d`. If `x` contains the\n   *     default value, it can be skipped.\n   * @param d An `offset` default value to compare against when `force_defaults` is `false`.\n   */\n  public void addOffset(int o, int x, int d) {\n    if (force_defaults || x != d) {\n      addOffset(x);\n      slot(o);\n    }\n  }\n\n  /**\n   * Add a struct to the table. Structs are stored inline, so nothing additional is being added.\n   *\n   * @param voffset The index into the vtable.\n   * @param x The offset of the created struct.\n   * @param d The default value is always `0`.\n   */\n  public void addStruct(int voffset, int x, int d) {\n    if (x != d) {\n      Nested(x);\n      slot(voffset);\n    }\n  }\n\n  /**\n   * Set the current vtable at `voffset` to the current location in the buffer.\n   *\n   * @param voffset The index into the vtable to store the offset relative to the end of the buffer.\n   */\n  public void slot(int voffset) {\n    vtable[voffset] = offset();\n  }\n\n  /**\n   * Finish off writing the object that is under construction.\n   *\n   * @return The offset to the object inside {@link #dataBuffer()}.\n   * @see #startTable(int)\n   */\n  public int endTable() {\n    if (vtable == null || !nested)\n      throw new AssertionError(\"FlatBuffers: endTable called without startTable\");\n    addInt(0);\n    int vtableloc = offset();\n    // Write out the current vtable.\n    int i = vtable_in_use - 1;\n    // Trim trailing zeroes.\n    for (; i >= 0 && vtable[i] == 0; i--) {}\n    int trimmed_size = i + 1;\n    for (; i >= 0; i--) {\n      // Offset relative to the start of the table.\n      short off = (short) (vtable[i] != 0 ? vtableloc - vtable[i] : 0);\n      addShort(off);\n    }\n\n    final int standard_fields = 2; // The fields below:\n    addShort((short) (vtableloc - object_start));\n    addShort((short) ((trimmed_size + standard_fields) * SIZEOF_SHORT));\n\n    // Search for an existing vtable that matches the current one.\n    int existing_vtable = 0;\n    outer_loop:\n    for (i = 0; i < num_vtables; i++) {\n      int vt1 = bb.capacity() - vtables[i];\n      int vt2 = space;\n      short len = bb.getShort(vt1);\n      if (len == bb.getShort(vt2)) {\n        for (int j = SIZEOF_SHORT; j < len; j += SIZEOF_SHORT) {\n          if (bb.getShort(vt1 + j) != bb.getShort(vt2 + j)) {\n            continue outer_loop;\n          }\n        }\n        existing_vtable = vtables[i];\n        break outer_loop;\n      }\n    }\n\n    if (existing_vtable != 0) {\n      // Found a match:\n      // Remove the current vtable.\n      space = bb.capacity() - vtableloc;\n      // Point table to existing vtable.\n      bb.putInt(space, existing_vtable - vtableloc);\n    } else {\n      // No match:\n      // Add the location of the current vtable to the list of vtables.\n      if (num_vtables == vtables.length) vtables = Arrays.copyOf(vtables, num_vtables * 2);\n      vtables[num_vtables++] = offset();\n      // Point table to current vtable.\n      bb.putInt(bb.capacity() - vtableloc, offset() - vtableloc);\n    }\n\n    nested = false;\n    return vtableloc;\n  }\n\n  /**\n   * Checks that a required field has been set in a given table that has just been constructed.\n   *\n   * @param table The offset to the start of the table from the `ByteBuffer` capacity.\n   * @param field The offset to the field in the vtable.\n   */\n  public void required(int table, int field) {\n    int table_start = bb.capacity() - table;\n    int vtable_start = table_start - bb.getInt(table_start);\n    boolean ok = bb.getShort(vtable_start + field) != 0;\n    // If this fails, the caller will show what field needs to be set.\n    if (!ok) throw new AssertionError(\"FlatBuffers: field \" + field + \" must be set\");\n  }\n\n  /// @endcond\n\n  /**\n   * Finalize a buffer, pointing to the given `root_table`.\n   *\n   * @param root_table An offset to be added to the buffer.\n   * @param size_prefix Whether to prefix the size to the buffer.\n   */\n  protected void finish(int root_table, boolean size_prefix) {\n    prep(minalign, SIZEOF_INT + (size_prefix ? SIZEOF_INT : 0));\n    addOffset(root_table);\n    if (size_prefix) {\n      addInt(bb.capacity() - space);\n    }\n    bb.position(space);\n    finished = true;\n  }\n\n  /**\n   * Finalize a buffer, pointing to the given `root_table`.\n   *\n   * @param root_table An offset to be added to the buffer.\n   */\n  public void finish(int root_table) {\n    finish(root_table, false);\n  }\n\n  /**\n   * Finalize a buffer, pointing to the given `root_table`, with the size prefixed.\n   *\n   * @param root_table An offset to be added to the buffer.\n   */\n  public void finishSizePrefixed(int root_table) {\n    finish(root_table, true);\n  }\n\n  /**\n   * Finalize a buffer, pointing to the given `root_table`.\n   *\n   * @param root_table An offset to be added to the buffer.\n   * @param file_identifier A FlatBuffer file identifier to be added to the buffer before\n   *     `root_table`.\n   * @param size_prefix Whether to prefix the size to the buffer.\n   */\n  protected void finish(int root_table, String file_identifier, boolean size_prefix) {\n    prep(minalign, SIZEOF_INT + FILE_IDENTIFIER_LENGTH + (size_prefix ? SIZEOF_INT : 0));\n    if (file_identifier.length() != FILE_IDENTIFIER_LENGTH)\n      throw new AssertionError(\n          \"FlatBuffers: file identifier must be length \" + FILE_IDENTIFIER_LENGTH);\n    for (int i = FILE_IDENTIFIER_LENGTH - 1; i >= 0; i--) {\n      addByte((byte) file_identifier.charAt(i));\n    }\n    finish(root_table, size_prefix);\n  }\n\n  /**\n   * Finalize a buffer, pointing to the given `root_table`.\n   *\n   * @param root_table An offset to be added to the buffer.\n   * @param file_identifier A FlatBuffer file identifier to be added to the buffer before\n   *     `root_table`.\n   */\n  public void finish(int root_table, String file_identifier) {\n    finish(root_table, file_identifier, false);\n  }\n\n  /**\n   * Finalize a buffer, pointing to the given `root_table`, with the size prefixed.\n   *\n   * @param root_table An offset to be added to the buffer.\n   * @param file_identifier A FlatBuffer file identifier to be added to the buffer before\n   *     `root_table`.\n   */\n  public void finishSizePrefixed(int root_table, String file_identifier) {\n    finish(root_table, file_identifier, true);\n  }\n\n  /**\n   * In order to save space, fields that are set to their default value don't get serialized into\n   * the buffer. Forcing defaults provides a way to manually disable this optimization.\n   *\n   * @param forceDefaults When set to `true`, always serializes default values.\n   * @return Returns `this`.\n   */\n  public FlatBufferBuilder forceDefaults(boolean forceDefaults) {\n    this.force_defaults = forceDefaults;\n    return this;\n  }\n\n  /**\n   * Get the ByteBuffer representing the FlatBuffer. Only call this after you've called `finish()`.\n   * The actual data starts at the ByteBuffer's current position, not necessarily at `0`.\n   *\n   * @return The {@link ByteBuffer} representing the FlatBuffer\n   */\n  public ByteBuffer dataBuffer() {\n    finished();\n    return bb;\n  }\n\n  /**\n   * The FlatBuffer data doesn't start at offset 0 in the {@link ByteBuffer}, but now the {@code\n   * ByteBuffer}'s position is set to that location upon {@link #finish(int)}.\n   *\n   * @return The {@link ByteBuffer#position() position} the data starts in {@link #dataBuffer()}\n   * @deprecated This method should not be needed anymore, but is left here for the moment to\n   *     document this API change. It will be removed in the future.\n   */\n  @Deprecated\n  private int dataStart() {\n    finished();\n    return space;\n  }\n\n  /**\n   * A utility function to copy and return the ByteBuffer data from `start` to `start` + `length` as\n   * a `byte[]`.\n   *\n   * @param start Start copying at this offset.\n   * @param length How many bytes to copy.\n   * @return A range copy of the {@link #dataBuffer() data buffer}.\n   * @throws IndexOutOfBoundsException If the range of bytes is ouf of bound.\n   */\n  public byte[] sizedByteArray(int start, int length) {\n    finished();\n    byte[] array = new byte[length];\n    bb.position(start);\n    bb.get(array);\n    return array;\n  }\n\n  /**\n   * A utility function to copy and return the ByteBuffer data as a `byte[]`.\n   *\n   * @return A full copy of the {@link #dataBuffer() data buffer}.\n   */\n  public byte[] sizedByteArray() {\n    return sizedByteArray(space, bb.capacity() - space);\n  }\n\n  /**\n   * A utility function to return an InputStream to the ByteBuffer data\n   *\n   * @return An InputStream that starts at the beginning of the ByteBuffer data and can read to the\n   *     end of it.\n   */\n  public InputStream sizedInputStream() {\n    finished();\n    ByteBuffer duplicate = bb.duplicate();\n    duplicate.position(space);\n    duplicate.limit(bb.capacity());\n    return new ByteBufferBackedInputStream(duplicate);\n  }\n\n  /** A class that allows a user to create an InputStream from a ByteBuffer. */\n  static class ByteBufferBackedInputStream extends InputStream {\n\n    ByteBuffer buf;\n\n    public ByteBufferBackedInputStream(ByteBuffer buf) {\n      this.buf = buf;\n    }\n\n    public int read() throws IOException {\n      try {\n        return buf.get() & 0xFF;\n      } catch (BufferUnderflowException e) {\n        return -1;\n      }\n    }\n  }\n}\n\n/// @}\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/FlexBuffers.java",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.flatbuffers;\n\nimport static com.google.flatbuffers.FlexBuffers.Unsigned.byteToUnsignedInt;\nimport static com.google.flatbuffers.FlexBuffers.Unsigned.intToUnsignedLong;\nimport static com.google.flatbuffers.FlexBuffers.Unsigned.shortToUnsignedInt;\n\nimport java.nio.ByteBuffer;\n\n/// @file\n/// @addtogroup flatbuffers_java_api\n/// @{\n\n/**\n * This class can be used to parse FlexBuffer messages.\n *\n * <p>For generating FlexBuffer messages, use {@link FlexBuffersBuilder}.\n *\n * <p>Example of usage:\n *\n * <pre>\n * ReadBuf bb = ... // load message from file or network\n * FlexBuffers.Reference r = FlexBuffers.getRoot(bb); // Reads the root element\n * FlexBuffers.Map map = r.asMap(); // We assumed root object is a map\n * System.out.println(map.get(\"name\").asString()); // prints element with key \"name\"\n * </pre>\n */\npublic class FlexBuffers {\n\n  // These are used as the upper 6 bits of a type field to indicate the actual\n  // type.\n  /** Represent a null type */\n  public static final int FBT_NULL = 0;\n\n  /** Represent a signed integer type */\n  public static final int FBT_INT = 1;\n\n  /** Represent a unsigned type */\n  public static final int FBT_UINT = 2;\n\n  /** Represent a float type */\n  public static final int FBT_FLOAT = 3; // Types above stored inline, types below store an offset.\n\n  /** Represent a key to a map type */\n  public static final int FBT_KEY = 4;\n\n  /** Represent a string type */\n  public static final int FBT_STRING = 5;\n\n  /** Represent a indirect signed integer type */\n  public static final int FBT_INDIRECT_INT = 6;\n\n  /** Represent a indirect unsigned integer type */\n  public static final int FBT_INDIRECT_UINT = 7;\n\n  /** Represent a indirect float type */\n  public static final int FBT_INDIRECT_FLOAT = 8;\n\n  /** Represent a map type */\n  public static final int FBT_MAP = 9;\n\n  /** Represent a vector type */\n  public static final int FBT_VECTOR = 10; // Untyped.\n\n  /** Represent a vector of signed integers type */\n  public static final int FBT_VECTOR_INT = 11; // Typed any size  = stores no type table).\n\n  /** Represent a vector of unsigned integers type */\n  public static final int FBT_VECTOR_UINT = 12;\n\n  /** Represent a vector of floats type */\n  public static final int FBT_VECTOR_FLOAT = 13;\n\n  /** Represent a vector of keys type */\n  public static final int FBT_VECTOR_KEY = 14;\n\n  /** Represent a vector of strings type */\n  // DEPRECATED, use FBT_VECTOR or FBT_VECTOR_KEY instead.\n  // more info on thttps://github.com/google/flatbuffers/issues/5627.\n  public static final int FBT_VECTOR_STRING_DEPRECATED = 15;\n\n  /// @cond FLATBUFFERS_INTERNAL\n  public static final int FBT_VECTOR_INT2 = 16; // Typed tuple  = no type table; no size field).\n  public static final int FBT_VECTOR_UINT2 = 17;\n  public static final int FBT_VECTOR_FLOAT2 = 18;\n  public static final int FBT_VECTOR_INT3 = 19; // Typed triple  = no type table; no size field).\n  public static final int FBT_VECTOR_UINT3 = 20;\n  public static final int FBT_VECTOR_FLOAT3 = 21;\n  public static final int FBT_VECTOR_INT4 = 22; // Typed quad  = no type table; no size field).\n  public static final int FBT_VECTOR_UINT4 = 23;\n  public static final int FBT_VECTOR_FLOAT4 = 24;\n\n  /// @endcond FLATBUFFERS_INTERNAL\n\n  /** Represent a blob type */\n  public static final int FBT_BLOB = 25;\n\n  /** Represent a boolean type */\n  public static final int FBT_BOOL = 26;\n\n  /** Represent a vector of booleans type */\n  public static final int FBT_VECTOR_BOOL =\n      36; // To Allow the same type of conversion of type to vector type\n\n  private static final ReadBuf EMPTY_BB = new ArrayReadWriteBuf(new byte[] {0}, 1);\n\n  /**\n   * Checks where a type is a typed vector\n   *\n   * @param type type to be checked\n   * @return true if typed vector\n   */\n  static boolean isTypedVector(int type) {\n    return (type >= FBT_VECTOR_INT && type <= FBT_VECTOR_STRING_DEPRECATED)\n        || type == FBT_VECTOR_BOOL;\n  }\n\n  /**\n   * Check whether you can access type directly (no indirection) or not.\n   *\n   * @param type type to be checked\n   * @return true if inline type\n   */\n  static boolean isTypeInline(int type) {\n    return type <= FBT_FLOAT || type == FBT_BOOL;\n  }\n\n  static int toTypedVectorElementType(int original_type) {\n    return original_type - FBT_VECTOR_INT + FBT_INT;\n  }\n\n  /**\n   * Return a vector type our of a original element type\n   *\n   * @param type element type\n   * @param fixedLength size of element\n   * @return typed vector type\n   */\n  static int toTypedVector(int type, int fixedLength) {\n    assert (isTypedVectorElementType(type));\n    switch (fixedLength) {\n      case 0:\n        return type - FBT_INT + FBT_VECTOR_INT;\n      case 2:\n        return type - FBT_INT + FBT_VECTOR_INT2;\n      case 3:\n        return type - FBT_INT + FBT_VECTOR_INT3;\n      case 4:\n        return type - FBT_INT + FBT_VECTOR_INT4;\n      default:\n        assert (false);\n        return FBT_NULL;\n    }\n  }\n\n  static boolean isTypedVectorElementType(int type) {\n    return (type >= FBT_INT && type <= FBT_KEY) || type == FBT_BOOL;\n  }\n\n  // return position of the element that the offset is pointing to\n  private static int indirect(ReadBuf bb, int offset, int byteWidth) {\n    // we assume all offset fits on a int, since ReadBuf operates with that assumption\n    return (int) (offset - readUInt(bb, offset, byteWidth));\n  }\n\n  // read unsigned int with size byteWidth and return as a 64-bit integer\n  private static long readUInt(ReadBuf buff, int end, int byteWidth) {\n    switch (byteWidth) {\n      case 1:\n        return byteToUnsignedInt(buff.get(end));\n      case 2:\n        return shortToUnsignedInt(buff.getShort(end));\n      case 4:\n        return intToUnsignedLong(buff.getInt(end));\n      case 8:\n        return buff.getLong(\n            end); // We are passing signed long here. Losing information (user should know)\n      default:\n        return -1; // we should never reach here\n    }\n  }\n\n  // read signed int of size byteWidth and return as 32-bit int\n  private static int readInt(ReadBuf buff, int end, int byteWidth) {\n    return (int) readLong(buff, end, byteWidth);\n  }\n\n  // read signed int of size byteWidth and return as 64-bit int\n  private static long readLong(ReadBuf buff, int end, int byteWidth) {\n    switch (byteWidth) {\n      case 1:\n        return buff.get(end);\n      case 2:\n        return buff.getShort(end);\n      case 4:\n        return buff.getInt(end);\n      case 8:\n        return buff.getLong(end);\n      default:\n        return -1; // we should never reach here\n    }\n  }\n\n  private static double readDouble(ReadBuf buff, int end, int byteWidth) {\n    switch (byteWidth) {\n      case 4:\n        return buff.getFloat(end);\n      case 8:\n        return buff.getDouble(end);\n      default:\n        return -1; // we should never reach here\n    }\n  }\n\n  /**\n   * Reads a FlexBuffer message in ReadBuf and returns {@link Reference} to the root element.\n   *\n   * @param buffer ReadBuf containing FlexBuffer message\n   * @return {@link Reference} to the root object\n   */\n  @Deprecated\n  public static Reference getRoot(ByteBuffer buffer) {\n    return getRoot(\n        buffer.hasArray()\n            ? new ArrayReadWriteBuf(buffer.array(), buffer.limit())\n            : new ByteBufferReadWriteBuf(buffer));\n  }\n\n  /**\n   * Reads a FlexBuffer message in ReadBuf and returns {@link Reference} to the root element.\n   *\n   * @param buffer ReadBuf containing FlexBuffer message\n   * @return {@link Reference} to the root object\n   */\n  public static Reference getRoot(ReadBuf buffer) {\n    // See Finish() below for the serialization counterpart of this.\n    // The root ends at the end of the buffer, so we parse backwards from there.\n    int end = buffer.limit();\n    int byteWidth = buffer.get(--end);\n    int packetType = byteToUnsignedInt(buffer.get(--end));\n    end -= byteWidth; // The root data item.\n    return new Reference(buffer, end, byteWidth, packetType);\n  }\n\n  /** Represents an generic element in the buffer. */\n  public static class Reference {\n\n    private static final Reference NULL_REFERENCE = new Reference(EMPTY_BB, 0, 1, 0);\n    private ReadBuf bb;\n    private int end;\n    private int parentWidth;\n    private int byteWidth;\n    private int type;\n\n    Reference(ReadBuf bb, int end, int parentWidth, int packedType) {\n      this(bb, end, parentWidth, (1 << (packedType & 3)), packedType >> 2);\n    }\n\n    Reference(ReadBuf bb, int end, int parentWidth, int byteWidth, int type) {\n      this.bb = bb;\n      this.end = end;\n      this.parentWidth = parentWidth;\n      this.byteWidth = byteWidth;\n      this.type = type;\n    }\n\n    /**\n     * Return element type\n     *\n     * @return element type as integer\n     */\n    public int getType() {\n      return type;\n    }\n\n    /**\n     * Checks whether the element is null type\n     *\n     * @return true if null type\n     */\n    public boolean isNull() {\n      return type == FBT_NULL;\n    }\n\n    /**\n     * Checks whether the element is boolean type\n     *\n     * @return true if boolean type\n     */\n    public boolean isBoolean() {\n      return type == FBT_BOOL;\n    }\n\n    /**\n     * Checks whether the element type is numeric (signed/unsigned integers and floats)\n     *\n     * @return true if numeric type\n     */\n    public boolean isNumeric() {\n      return isIntOrUInt() || isFloat();\n    }\n\n    /**\n     * Checks whether the element type is signed or unsigned integers\n     *\n     * @return true if an integer type\n     */\n    public boolean isIntOrUInt() {\n      return isInt() || isUInt();\n    }\n\n    /**\n     * Checks whether the element type is float\n     *\n     * @return true if a float type\n     */\n    public boolean isFloat() {\n      return type == FBT_FLOAT || type == FBT_INDIRECT_FLOAT;\n    }\n\n    /**\n     * Checks whether the element type is signed integer\n     *\n     * @return true if a signed integer type\n     */\n    public boolean isInt() {\n      return type == FBT_INT || type == FBT_INDIRECT_INT;\n    }\n\n    /**\n     * Checks whether the element type is signed integer\n     *\n     * @return true if a signed integer type\n     */\n    public boolean isUInt() {\n      return type == FBT_UINT || type == FBT_INDIRECT_UINT;\n    }\n\n    /**\n     * Checks whether the element type is string\n     *\n     * @return true if a string type\n     */\n    public boolean isString() {\n      return type == FBT_STRING;\n    }\n\n    /**\n     * Checks whether the element type is key\n     *\n     * @return true if a key type\n     */\n    public boolean isKey() {\n      return type == FBT_KEY;\n    }\n\n    /**\n     * Checks whether the element type is vector\n     *\n     * @return true if a vector type\n     */\n    public boolean isVector() {\n      return type == FBT_VECTOR || type == FBT_MAP;\n    }\n\n    /**\n     * Checks whether the element type is typed vector\n     *\n     * @return true if a typed vector type\n     */\n    public boolean isTypedVector() {\n      return FlexBuffers.isTypedVector(type);\n    }\n\n    /**\n     * Checks whether the element type is a map\n     *\n     * @return true if a map type\n     */\n    public boolean isMap() {\n      return type == FBT_MAP;\n    }\n\n    /**\n     * Checks whether the element type is a blob\n     *\n     * @return true if a blob type\n     */\n    public boolean isBlob() {\n      return type == FBT_BLOB;\n    }\n\n    /**\n     * Returns element as 32-bit integer.\n     *\n     * <p>For vector element, it will return size of the vector\n     *\n     * <p>For String element, it will type to be parsed as integer\n     *\n     * <p>Unsigned elements will become negative\n     *\n     * <p>Float elements will be casted to integer\n     *\n     * @return 32-bit integer or 0 if fail to convert element to integer.\n     */\n    public int asInt() {\n      if (type == FBT_INT) {\n        // A fast path for the common case.\n        return readInt(bb, end, parentWidth);\n      } else\n        switch (type) {\n          case FBT_INDIRECT_INT:\n            return readInt(bb, indirect(bb, end, parentWidth), byteWidth);\n          case FBT_UINT:\n            return (int) readUInt(bb, end, parentWidth);\n          case FBT_INDIRECT_UINT:\n            return (int) readUInt(bb, indirect(bb, end, parentWidth), parentWidth);\n          case FBT_FLOAT:\n            return (int) readDouble(bb, end, parentWidth);\n          case FBT_INDIRECT_FLOAT:\n            return (int) readDouble(bb, indirect(bb, end, parentWidth), byteWidth);\n          case FBT_NULL:\n            return 0;\n          case FBT_STRING:\n            return Integer.parseInt(asString());\n          case FBT_VECTOR:\n            return asVector().size();\n          case FBT_BOOL:\n            return readInt(bb, end, parentWidth);\n          default:\n            // Convert other things to int.\n            return 0;\n        }\n    }\n\n    /**\n     * Returns element as unsigned 64-bit integer.\n     *\n     * <p>For vector element, it will return size of the vector\n     *\n     * <p>For String element, it will type to be parsed as integer\n     *\n     * <p>Negative signed elements will become unsigned counterpart\n     *\n     * <p>Float elements will be casted to integer\n     *\n     * @return 64-bit integer or 0 if fail to convert element to integer.\n     */\n    public long asUInt() {\n      if (type == FBT_UINT) {\n        // A fast path for the common case.\n        return readUInt(bb, end, parentWidth);\n      } else\n        switch (type) {\n          case FBT_INDIRECT_UINT:\n            return readUInt(bb, indirect(bb, end, parentWidth), byteWidth);\n          case FBT_INT:\n            return readLong(bb, end, parentWidth);\n          case FBT_INDIRECT_INT:\n            return readLong(bb, indirect(bb, end, parentWidth), byteWidth);\n          case FBT_FLOAT:\n            return (long) readDouble(bb, end, parentWidth);\n          case FBT_INDIRECT_FLOAT:\n            return (long) readDouble(bb, indirect(bb, end, parentWidth), parentWidth);\n          case FBT_NULL:\n            return 0;\n          case FBT_STRING:\n            return Long.parseLong(asString());\n          case FBT_VECTOR:\n            return asVector().size();\n          case FBT_BOOL:\n            return readInt(bb, end, parentWidth);\n          default:\n            // Convert other things to uint.\n            return 0;\n        }\n    }\n\n    /**\n     * Returns element as 64-bit integer.\n     *\n     * <p>For vector element, it will return size of the vector\n     *\n     * <p>For String element, it will type to be parsed as integer\n     *\n     * <p>Unsigned elements will become negative\n     *\n     * <p>Float elements will be casted to integer\n     *\n     * @return 64-bit integer or 0 if fail to convert element to long.\n     */\n    public long asLong() {\n      if (type == FBT_INT) {\n        // A fast path for the common case.\n        return readLong(bb, end, parentWidth);\n      } else\n        switch (type) {\n          case FBT_INDIRECT_INT:\n            return readLong(bb, indirect(bb, end, parentWidth), byteWidth);\n          case FBT_UINT:\n            return readUInt(bb, end, parentWidth);\n          case FBT_INDIRECT_UINT:\n            return readUInt(bb, indirect(bb, end, parentWidth), parentWidth);\n          case FBT_FLOAT:\n            return (long) readDouble(bb, end, parentWidth);\n          case FBT_INDIRECT_FLOAT:\n            return (long) readDouble(bb, indirect(bb, end, parentWidth), byteWidth);\n          case FBT_NULL:\n            return 0;\n          case FBT_STRING:\n            {\n              try {\n                return Long.parseLong(asString());\n              } catch (NumberFormatException nfe) {\n                return 0; // same as C++ implementation\n              }\n            }\n          case FBT_VECTOR:\n            return asVector().size();\n          case FBT_BOOL:\n            return readInt(bb, end, parentWidth);\n          default:\n            // Convert other things to int.\n            return 0;\n        }\n    }\n\n    /**\n     * Returns element as 64-bit integer.\n     *\n     * <p>For vector element, it will return size of the vector\n     *\n     * <p>For String element, it will type to be parsed as integer\n     *\n     * @return 64-bit integer or 0 if fail to convert element to long.\n     */\n    public double asFloat() {\n      if (type == FBT_FLOAT) {\n        // A fast path for the common case.\n        return readDouble(bb, end, parentWidth);\n      } else\n        switch (type) {\n          case FBT_INDIRECT_FLOAT:\n            return readDouble(bb, indirect(bb, end, parentWidth), byteWidth);\n          case FBT_INT:\n            return readInt(bb, end, parentWidth);\n          case FBT_UINT:\n          case FBT_BOOL:\n            return readUInt(bb, end, parentWidth);\n          case FBT_INDIRECT_INT:\n            return readInt(bb, indirect(bb, end, parentWidth), byteWidth);\n          case FBT_INDIRECT_UINT:\n            return readUInt(bb, indirect(bb, end, parentWidth), byteWidth);\n          case FBT_NULL:\n            return 0.0;\n          case FBT_STRING:\n            return Double.parseDouble(asString());\n          case FBT_VECTOR:\n            return asVector().size();\n          default:\n            // Convert strings and other things to float.\n            return 0;\n        }\n    }\n\n    /**\n     * Returns element as a {@link Key}\n     *\n     * @return key or {@link Key#empty()} if element is not a key\n     */\n    public Key asKey() {\n      if (isKey()) {\n        return new Key(bb, indirect(bb, end, parentWidth), byteWidth);\n      } else {\n        return Key.empty();\n      }\n    }\n\n    /**\n     * Returns element as a `String`\n     *\n     * @return element as `String` or empty `String` if fail\n     */\n    public String asString() {\n      if (isString()) {\n        int start = indirect(bb, end, parentWidth);\n        int size = (int) readUInt(bb, start - byteWidth, byteWidth);\n        return bb.getString(start, size);\n      } else if (isKey()) {\n        int start = indirect(bb, end, byteWidth);\n        for (int i = start; ; i++) {\n          if (bb.get(i) == 0) {\n            return bb.getString(start, i - start);\n          }\n        }\n      } else {\n        return \"\";\n      }\n    }\n\n    /**\n     * Returns element as a {@link Map}\n     *\n     * @return element as {@link Map} or empty {@link Map} if fail\n     */\n    public Map asMap() {\n      if (isMap()) {\n        return new Map(bb, indirect(bb, end, parentWidth), byteWidth);\n      } else {\n        return Map.empty();\n      }\n    }\n\n    /**\n     * Returns element as a {@link Vector}\n     *\n     * @return element as {@link Vector} or empty {@link Vector} if fail\n     */\n    public Vector asVector() {\n      if (isVector()) {\n        return new Vector(bb, indirect(bb, end, parentWidth), byteWidth);\n      } else if (type == FlexBuffers.FBT_VECTOR_STRING_DEPRECATED) {\n        // deprecated. Should be treated as key vector\n        return new TypedVector(bb, indirect(bb, end, parentWidth), byteWidth, FlexBuffers.FBT_KEY);\n      } else if (FlexBuffers.isTypedVector(type)) {\n        return new TypedVector(\n            bb,\n            indirect(bb, end, parentWidth),\n            byteWidth,\n            FlexBuffers.toTypedVectorElementType(type));\n      } else {\n        return Vector.empty();\n      }\n    }\n\n    /**\n     * Returns element as a {@link Blob}\n     *\n     * @return element as {@link Blob} or empty {@link Blob} if fail\n     */\n    public Blob asBlob() {\n      if (isBlob() || isString()) {\n        return new Blob(bb, indirect(bb, end, parentWidth), byteWidth);\n      } else {\n        return Blob.empty();\n      }\n    }\n\n    /**\n     * Returns element as a boolean\n     *\n     * <p>If element type is not boolean, it will be casted to integer and compared against 0\n     *\n     * @return element as boolean\n     */\n    public boolean asBoolean() {\n      if (isBoolean()) {\n        return bb.get(end) != 0;\n      }\n      return asUInt() != 0;\n    }\n\n    /**\n     * Returns text representation of the element (JSON)\n     *\n     * @return String containing text representation of the element\n     */\n    @Override\n    public String toString() {\n      return toString(new StringBuilder(128)).toString();\n    }\n\n    /** Appends a text(JSON) representation to a `StringBuilder` */\n    StringBuilder toString(StringBuilder sb) {\n      // TODO: Original C++ implementation escape strings.\n      // probably we should do it as well.\n      switch (type) {\n        case FBT_NULL:\n          return sb.append(\"null\");\n        case FBT_INT:\n        case FBT_INDIRECT_INT:\n          return sb.append(asLong());\n        case FBT_UINT:\n        case FBT_INDIRECT_UINT:\n          return sb.append(asUInt());\n        case FBT_INDIRECT_FLOAT:\n        case FBT_FLOAT:\n          return sb.append(asFloat());\n        case FBT_KEY:\n          return asKey().toString(sb.append('\"')).append('\"');\n        case FBT_STRING:\n          return sb.append('\"').append(asString()).append('\"');\n        case FBT_MAP:\n          return asMap().toString(sb);\n        case FBT_VECTOR:\n          return asVector().toString(sb);\n        case FBT_BLOB:\n          return asBlob().toString(sb);\n        case FBT_BOOL:\n          return sb.append(asBoolean());\n        case FBT_VECTOR_INT:\n        case FBT_VECTOR_UINT:\n        case FBT_VECTOR_FLOAT:\n        case FBT_VECTOR_KEY:\n        case FBT_VECTOR_STRING_DEPRECATED:\n        case FBT_VECTOR_BOOL:\n          return sb.append(asVector());\n        case FBT_VECTOR_INT2:\n        case FBT_VECTOR_UINT2:\n        case FBT_VECTOR_FLOAT2:\n        case FBT_VECTOR_INT3:\n        case FBT_VECTOR_UINT3:\n        case FBT_VECTOR_FLOAT3:\n        case FBT_VECTOR_INT4:\n        case FBT_VECTOR_UINT4:\n        case FBT_VECTOR_FLOAT4:\n          throw new FlexBufferException(\"not_implemented:\" + type);\n        default:\n          return sb;\n      }\n    }\n  }\n\n  /** Base class of all types below. Points into the data buffer and allows access to one type. */\n  private abstract static class Object {\n    ReadBuf bb;\n    int end;\n    int byteWidth;\n\n    Object(ReadBuf buff, int end, int byteWidth) {\n      this.bb = buff;\n      this.end = end;\n      this.byteWidth = byteWidth;\n    }\n\n    @Override\n    public String toString() {\n      return toString(new StringBuilder(128)).toString();\n    }\n\n    public abstract StringBuilder toString(StringBuilder sb);\n  }\n\n  // Stores size in `byte_width_` bytes before end position.\n  private abstract static class Sized extends Object {\n\n    protected final int size;\n\n    Sized(ReadBuf buff, int end, int byteWidth) {\n      super(buff, end, byteWidth);\n      size = (int) readUInt(bb, end - byteWidth, byteWidth);\n    }\n\n    public int size() {\n      return size;\n    }\n  }\n\n  /**\n   * Represents a array of bytes element in the buffer\n   *\n   * <p>It can be converted to `ReadBuf` using {@link data()}, copied into a byte[] using {@link\n   * getBytes()} or have individual bytes accessed individually using {@link get(int)}\n   */\n  public static class Blob extends Sized {\n    static final Blob EMPTY = new Blob(EMPTY_BB, 1, 1);\n\n    Blob(ReadBuf buff, int end, int byteWidth) {\n      super(buff, end, byteWidth);\n    }\n\n    /** Return an empty {@link Blob} */\n    public static Blob empty() {\n      return EMPTY;\n    }\n\n    /**\n     * Return {@link Blob} as `ReadBuf`\n     *\n     * @return blob as `ReadBuf`\n     */\n    public ByteBuffer data() {\n      ByteBuffer dup = ByteBuffer.wrap(bb.data());\n      dup.position(end);\n      dup.limit(end + size());\n      return dup.asReadOnlyBuffer().slice();\n    }\n\n    /**\n     * Copy blob into a byte[]\n     *\n     * @return blob as a byte[]\n     */\n    public byte[] getBytes() {\n      int size = size();\n      byte[] result = new byte[size];\n      for (int i = 0; i < size; i++) {\n        result[i] = bb.get(end + i);\n      }\n      return result;\n    }\n\n    /**\n     * Return individual byte at a given position\n     *\n     * @param pos position of the byte to be read\n     */\n    public byte get(int pos) {\n      assert pos >= 0 && pos <= size();\n      return bb.get(end + pos);\n    }\n\n    /** Returns a text(JSON) representation of the {@link Blob} */\n    @Override\n    public String toString() {\n      return bb.getString(end, size());\n    }\n\n    /** Append a text(JSON) representation of the {@link Blob} into a `StringBuilder` */\n    @Override\n    public StringBuilder toString(StringBuilder sb) {\n      sb.append('\"');\n      sb.append(bb.getString(end, size()));\n      return sb.append('\"');\n    }\n  }\n\n  /** Represents a key element in the buffer. Keys are used to reference objects in a {@link Map} */\n  public static class Key extends Object {\n\n    private static final Key EMPTY = new Key(EMPTY_BB, 0, 0);\n\n    Key(ReadBuf buff, int end, int byteWidth) {\n      super(buff, end, byteWidth);\n    }\n\n    /**\n     * Return an empty {@link Key}\n     *\n     * @return empty {@link Key}\n     */\n    public static Key empty() {\n      return Key.EMPTY;\n    }\n\n    /** Appends a text(JSON) representation to a `StringBuilder` */\n    @Override\n    public StringBuilder toString(StringBuilder sb) {\n      return sb.append(toString());\n    }\n\n    @Override\n    public String toString() {\n      int size;\n      for (int i = end; ; i++) {\n        if (bb.get(i) == 0) {\n          size = i - end;\n          break;\n        }\n      }\n      return bb.getString(end, size);\n    }\n\n    int compareTo(byte[] other) {\n      int ia = end;\n      int io = 0;\n      byte c1, c2;\n      do {\n        c1 = bb.get(ia);\n        c2 = other[io];\n        if (c1 == '\\0') return c1 - c2;\n        ia++;\n        io++;\n        if (io == other.length) {\n          // in our buffer we have an additional \\0 byte\n          // but this does not exist in regular Java strings, so we return now\n          int cmp = c1 - c2;\n          if (cmp != 0 || bb.get(ia) == '\\0') {\n            return cmp;\n          } else {\n            return 1;\n          }\n        }\n      } while (c1 == c2);\n      return c1 - c2;\n    }\n\n    /**\n     * Compare keys\n     *\n     * @param obj other key to compare\n     * @return true if keys are the same\n     */\n    @Override\n    public boolean equals(java.lang.Object obj) {\n      if (!(obj instanceof Key)) return false;\n\n      return ((Key) obj).end == end && ((Key) obj).byteWidth == byteWidth;\n    }\n\n    public int hashCode() {\n      return end ^ byteWidth;\n    }\n  }\n\n  /** Map object representing a set of key-value pairs. */\n  public static class Map extends Vector {\n    private static final Map EMPTY_MAP = new Map(EMPTY_BB, 1, 1);\n    // cache for converting UTF-8 codepoints into\n    // Java chars. Used to speed up String comparison\n    private final byte[] comparisonBuffer = new byte[4];\n\n    Map(ReadBuf bb, int end, int byteWidth) {\n      super(bb, end, byteWidth);\n    }\n\n    /**\n     * Returns an empty {@link Map}\n     *\n     * @return an empty {@link Map}\n     */\n    public static Map empty() {\n      return EMPTY_MAP;\n    }\n\n    /**\n     * @param key access key to element on map\n     * @return reference to value in map\n     */\n    public Reference get(String key) {\n      int index = binarySearch(key);\n      if (index >= 0 && index < size) {\n        return get(index);\n      }\n      return Reference.NULL_REFERENCE;\n    }\n\n    /**\n     * @param key access key to element on map. Keys are assumed to be encoded in UTF-8\n     * @return reference to value in map\n     */\n    public Reference get(byte[] key) {\n      int index = binarySearch(key);\n      if (index >= 0 && index < size) {\n        return get(index);\n      }\n      return Reference.NULL_REFERENCE;\n    }\n\n    /**\n     * Get a vector or keys in the map\n     *\n     * @return vector of keys\n     */\n    public KeyVector keys() {\n      final int num_prefixed_fields = 3;\n      int keysOffset = end - (byteWidth * num_prefixed_fields);\n      return new KeyVector(\n          new TypedVector(\n              bb,\n              indirect(bb, keysOffset, byteWidth),\n              readInt(bb, keysOffset + byteWidth, byteWidth),\n              FBT_KEY));\n    }\n\n    /**\n     * @return {@code Vector} of values from map\n     */\n    public Vector values() {\n      return new Vector(bb, end, byteWidth);\n    }\n\n    /**\n     * Writes text (json) representation of map in a {@code StringBuilder}.\n     *\n     * @param builder {@code StringBuilder} to be appended to\n     * @return Same {@code StringBuilder} with appended text\n     */\n    public StringBuilder toString(StringBuilder builder) {\n      builder.append(\"{ \");\n      KeyVector keys = keys();\n      int size = size();\n      Vector vals = values();\n      for (int i = 0; i < size; i++) {\n        builder.append('\"').append(keys.get(i).toString()).append(\"\\\" : \");\n        builder.append(vals.get(i).toString());\n        if (i != size - 1) builder.append(\", \");\n      }\n      builder.append(\" }\");\n      return builder;\n    }\n\n    // Performs a binary search on a key vector and return index of the key in key vector\n    private int binarySearch(CharSequence searchedKey) {\n      int low = 0;\n      int high = size - 1;\n      final int num_prefixed_fields = 3;\n      int keysOffset = end - (byteWidth * num_prefixed_fields);\n      int keysStart = indirect(bb, keysOffset, byteWidth);\n      int keyByteWidth = readInt(bb, keysOffset + byteWidth, byteWidth);\n      while (low <= high) {\n        int mid = (low + high) >>> 1;\n        int keyPos = indirect(bb, keysStart + mid * keyByteWidth, keyByteWidth);\n        int cmp = compareCharSequence(keyPos, searchedKey);\n        if (cmp < 0) low = mid + 1;\n        else if (cmp > 0) high = mid - 1;\n        else return mid; // key found\n      }\n      return -(low + 1); // key not found\n    }\n\n    private int binarySearch(byte[] searchedKey) {\n      int low = 0;\n      int high = size - 1;\n      final int num_prefixed_fields = 3;\n      int keysOffset = end - (byteWidth * num_prefixed_fields);\n      int keysStart = indirect(bb, keysOffset, byteWidth);\n      int keyByteWidth = readInt(bb, keysOffset + byteWidth, byteWidth);\n\n      while (low <= high) {\n        int mid = (low + high) >>> 1;\n        int keyPos = indirect(bb, keysStart + mid * keyByteWidth, keyByteWidth);\n        int cmp = compareBytes(bb, keyPos, searchedKey);\n        if (cmp < 0) low = mid + 1;\n        else if (cmp > 0) high = mid - 1;\n        else return mid; // key found\n      }\n      return -(low + 1); // key not found\n    }\n\n    // compares a byte[] against a FBT_KEY\n    private int compareBytes(ReadBuf bb, int start, byte[] other) {\n      int l1 = start;\n      int l2 = 0;\n      byte c1, c2;\n      do {\n        c1 = bb.get(l1);\n        c2 = other[l2];\n        if (c1 == '\\0') return c1 - c2;\n        l1++;\n        l2++;\n        if (l2 == other.length) {\n          // in our buffer we have an additional \\0 byte\n          // but this does not exist in regular Java strings, so we return now\n          int cmp = c1 - c2;\n          if (cmp != 0 || bb.get(l1) == '\\0') {\n            return cmp;\n          } else {\n            return 1;\n          }\n        }\n      } while (c1 == c2);\n      return c1 - c2;\n    }\n\n    // compares a CharSequence against a FBT_KEY\n    private int compareCharSequence(int start, CharSequence other) {\n      int bufferPos = start;\n      int otherPos = 0;\n      int limit = bb.limit();\n      int otherLimit = other.length();\n\n      // special loop for ASCII characters. Most of keys should be ASCII only, so this\n      // loop should be optimized for that.\n      // breaks if a multi-byte character is found\n      while (otherPos < otherLimit) {\n        char c2 = other.charAt(otherPos);\n\n        if (c2 >= 0x80) {\n          // not a single byte codepoint\n          break;\n        }\n\n        byte b = bb.get(bufferPos);\n\n        if (b == 0) {\n          return -c2;\n        } else if (b < 0) {\n          break;\n        } else if ((char) b != c2) {\n          return b - c2;\n        }\n        ++bufferPos;\n        ++otherPos;\n      }\n\n      while (bufferPos < limit) {\n\n        int sizeInBuff = Utf8.encodeUtf8CodePoint(other, otherPos, comparisonBuffer);\n\n        if (sizeInBuff == 0) {\n          // That means we finish with other and there are not more chars to\n          // compare. String in the buffer is bigger.\n          return bb.get(bufferPos);\n        }\n\n        for (int i = 0; i < sizeInBuff; i++) {\n          byte bufferByte = bb.get(bufferPos++);\n          byte otherByte = comparisonBuffer[i];\n          if (bufferByte == 0) {\n            // Our key is finished, so other is bigger\n            return -otherByte;\n          } else if (bufferByte != otherByte) {\n            return bufferByte - otherByte;\n          }\n        }\n\n        otherPos += sizeInBuff == 4 ? 2 : 1;\n      }\n      return 0;\n    }\n  }\n\n  /** Object that represents a set of elements in the buffer */\n  public static class Vector extends Sized {\n\n    private static final Vector EMPTY_VECTOR = new Vector(EMPTY_BB, 1, 1);\n\n    Vector(ReadBuf bb, int end, int byteWidth) {\n      super(bb, end, byteWidth);\n    }\n\n    /**\n     * Returns an empty {@link Map}\n     *\n     * @return an empty {@link Map}\n     */\n    public static Vector empty() {\n      return EMPTY_VECTOR;\n    }\n\n    /**\n     * Checks if the vector is empty\n     *\n     * @return true if vector is empty\n     */\n    public boolean isEmpty() {\n      return this == EMPTY_VECTOR;\n    }\n\n    /** Appends a text(JSON) representation to a `StringBuilder` */\n    @Override\n    public StringBuilder toString(StringBuilder sb) {\n      sb.append(\"[ \");\n      int size = size();\n      for (int i = 0; i < size; i++) {\n        get(i).toString(sb);\n        if (i != size - 1) {\n          sb.append(\", \");\n        }\n      }\n      sb.append(\" ]\");\n      return sb;\n    }\n\n    /**\n     * Get a element in a vector by index\n     *\n     * @param index position of the element\n     * @return {@code Reference} to the element\n     */\n    public Reference get(int index) {\n      long len = size();\n      if (index >= len) {\n        return Reference.NULL_REFERENCE;\n      }\n      int packedType = byteToUnsignedInt(bb.get((int) (end + (len * byteWidth) + index)));\n      int obj_end = end + index * byteWidth;\n      return new Reference(bb, obj_end, byteWidth, packedType);\n    }\n  }\n\n  /** Object that represents a set of elements with the same type */\n  public static class TypedVector extends Vector {\n\n    private static final TypedVector EMPTY_VECTOR = new TypedVector(EMPTY_BB, 1, 1, FBT_INT);\n\n    private final int elemType;\n\n    TypedVector(ReadBuf bb, int end, int byteWidth, int elemType) {\n      super(bb, end, byteWidth);\n      this.elemType = elemType;\n    }\n\n    public static TypedVector empty() {\n      return EMPTY_VECTOR;\n    }\n\n    /**\n     * Returns whether the vector is empty\n     *\n     * @return true if empty\n     */\n    public boolean isEmptyVector() {\n      return this == EMPTY_VECTOR;\n    }\n\n    /**\n     * Return element type for all elements in the vector\n     *\n     * @return element type\n     */\n    public int getElemType() {\n      return elemType;\n    }\n\n    /**\n     * Get reference to an object in the {@code Vector}\n     *\n     * @param pos position of the object in {@code Vector}\n     * @return reference to element\n     */\n    @Override\n    public Reference get(int pos) {\n      int len = size();\n      if (pos >= len) return Reference.NULL_REFERENCE;\n      int childPos = end + pos * byteWidth;\n      return new Reference(bb, childPos, byteWidth, 1, elemType);\n    }\n  }\n\n  /** Represent a vector of keys in a map */\n  public static class KeyVector {\n\n    private final TypedVector vec;\n\n    KeyVector(TypedVector vec) {\n      this.vec = vec;\n    }\n\n    /**\n     * Return key\n     *\n     * @param pos position of the key in key vector\n     * @return key\n     */\n    public Key get(int pos) {\n      int len = size();\n      if (pos >= len) return Key.EMPTY;\n      int childPos = vec.end + pos * vec.byteWidth;\n      return new Key(vec.bb, indirect(vec.bb, childPos, vec.byteWidth), 1);\n    }\n\n    /**\n     * Returns size of key vector\n     *\n     * @return size\n     */\n    public int size() {\n      return vec.size();\n    }\n\n    /** Returns a text(JSON) representation */\n    public String toString() {\n      StringBuilder b = new StringBuilder();\n      b.append('[');\n      for (int i = 0; i < vec.size(); i++) {\n        vec.get(i).toString(b);\n        if (i != vec.size() - 1) {\n          b.append(\", \");\n        }\n      }\n      return b.append(\"]\").toString();\n    }\n  }\n\n  public static class FlexBufferException extends RuntimeException {\n    FlexBufferException(String msg) {\n      super(msg);\n    }\n  }\n\n  static class Unsigned {\n\n    static int byteToUnsignedInt(byte x) {\n      return ((int) x) & 0xff;\n    }\n\n    static int shortToUnsignedInt(short x) {\n      return ((int) x) & 0xffff;\n    }\n\n    static long intToUnsignedLong(int x) {\n      return ((long) x) & 0xffffffffL;\n    }\n  }\n}\n/// @}\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/FlexBuffersBuilder.java",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.flatbuffers;\n\nimport static com.google.flatbuffers.FlexBuffers.*;\nimport static com.google.flatbuffers.FlexBuffers.Unsigned.byteToUnsignedInt;\nimport static com.google.flatbuffers.FlexBuffers.Unsigned.intToUnsignedLong;\nimport static com.google.flatbuffers.FlexBuffers.Unsigned.shortToUnsignedInt;\n\nimport java.math.BigInteger;\nimport java.nio.ByteBuffer;\nimport java.nio.charset.StandardCharsets;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.Comparator;\nimport java.util.HashMap;\n\n/// @file\n/// @addtogroup flatbuffers_java_api\n/// @{\n\n/**\n * Helper class that builds FlexBuffers\n *\n * <p>This class presents all necessary APIs to create FlexBuffers. A `ByteBuffer` will be used to\n * store the data. It can be created internally, or passed down in the constructor.\n *\n * <p>There are some limitations when compared to original implementation in C++. Most notably:\n *\n * <ul>\n *   <li>\n *       <p>No support for mutations (might change in the future).\n *   <li>\n *       <p>Buffer size limited to {@link Integer#MAX_VALUE}\n *   <li>\n *       <p>Since Java does not support unsigned type, all unsigned operations accepts an immediate\n *       higher representation of similar type.\n * </ul>\n */\npublic class FlexBuffersBuilder {\n\n  /** No keys or strings will be shared */\n  public static final int BUILDER_FLAG_NONE = 0;\n\n  /**\n   * Keys will be shared between elements. Identical keys will only be serialized once, thus\n   * possibly saving space. But serialization performance might be slower and consumes more memory.\n   */\n  public static final int BUILDER_FLAG_SHARE_KEYS = 1;\n\n  /**\n   * Strings will be shared between elements. Identical strings will only be serialized once, thus\n   * possibly saving space. But serialization performance might be slower and consumes more memory.\n   * This is ideal if you expect many repeated strings on the message.\n   */\n  public static final int BUILDER_FLAG_SHARE_STRINGS = 2;\n\n  /** Strings and keys will be shared between elements. */\n  public static final int BUILDER_FLAG_SHARE_KEYS_AND_STRINGS = 3;\n\n  /** Reserved for the future. */\n  public static final int BUILDER_FLAG_SHARE_KEY_VECTORS = 4;\n\n  /** Reserved for the future. */\n  public static final int BUILDER_FLAG_SHARE_ALL = 7;\n\n  /// @cond FLATBUFFERS_INTERNAL\n  private static final int WIDTH_8 = 0;\n  private static final int WIDTH_16 = 1;\n  private static final int WIDTH_32 = 2;\n  private static final int WIDTH_64 = 3;\n  private final ReadWriteBuf bb;\n  private final ArrayList<Value> stack = new ArrayList<>();\n  private final HashMap<String, Integer> keyPool = new HashMap<>();\n  private final HashMap<String, Integer> stringPool = new HashMap<>();\n  private final int flags;\n  private boolean finished = false;\n\n  // A lambda to sort map keys\n  private Comparator<Value> keyComparator =\n      new Comparator<Value>() {\n        @Override\n        public int compare(Value o1, Value o2) {\n          int ia = o1.key;\n          int io = o2.key;\n          byte c1, c2;\n          do {\n            c1 = bb.get(ia);\n            c2 = bb.get(io);\n            if (c1 == 0) return c1 - c2;\n            ia++;\n            io++;\n          } while (c1 == c2);\n          return c1 - c2;\n        }\n      };\n\n  /// @endcond\n\n  /**\n   * Constructs a newly allocated {@code FlexBuffersBuilder} with {@link #BUILDER_FLAG_SHARE_KEYS}\n   * set.\n   *\n   * @param bufSize size of buffer in bytes.\n   */\n  public FlexBuffersBuilder(int bufSize) {\n    this(new ArrayReadWriteBuf(bufSize), BUILDER_FLAG_SHARE_KEYS);\n  }\n\n  /**\n   * Constructs a newly allocated {@code FlexBuffersBuilder} with {@link #BUILDER_FLAG_SHARE_KEYS}\n   * set.\n   */\n  public FlexBuffersBuilder() {\n    this(256);\n  }\n\n  /**\n   * Constructs a newly allocated {@code FlexBuffersBuilder}.\n   *\n   * @param bb `ByteBuffer` that will hold the message\n   * @param flags Share flags\n   */\n  @Deprecated\n  public FlexBuffersBuilder(ByteBuffer bb, int flags) {\n    this(new ArrayReadWriteBuf(bb.array()), flags);\n  }\n\n  public FlexBuffersBuilder(ReadWriteBuf bb, int flags) {\n    this.bb = bb;\n    this.flags = flags;\n  }\n\n  /**\n   * Constructs a newly allocated {@code FlexBuffersBuilder}. By default same keys will be\n   * serialized only once\n   *\n   * @param bb `ByteBuffer` that will hold the message\n   */\n  public FlexBuffersBuilder(ByteBuffer bb) {\n    this(bb, BUILDER_FLAG_SHARE_KEYS);\n  }\n\n  /** Reset the FlexBuffersBuilder by purging all data that it holds. */\n  public void clear() {\n    bb.clear();\n    stack.clear();\n    keyPool.clear();\n    stringPool.clear();\n    finished = false;\n  }\n\n  /**\n   * Return `ByteBuffer` containing FlexBuffer message. {@code #finish()} must be called before\n   * calling this function otherwise an assert will trigger.\n   *\n   * @return `ByteBuffer` with finished message\n   */\n  public ReadWriteBuf getBuffer() {\n    assert (finished);\n    return bb;\n  }\n\n  /** Insert a null value into the buffer */\n  public void putNull() {\n    putNull(null);\n  }\n\n  /**\n   * Insert a null value into the buffer\n   *\n   * @param key key used to store element in map\n   */\n  public void putNull(String key) {\n    stack.add(Value.nullValue(putKey(key)));\n  }\n\n  /**\n   * Insert a single boolean into the buffer\n   *\n   * @param val true or false\n   */\n  public void putBoolean(boolean val) {\n    putBoolean(null, val);\n  }\n\n  /**\n   * Insert a single boolean into the buffer\n   *\n   * @param key key used to store element in map\n   * @param val true or false\n   */\n  public void putBoolean(String key, boolean val) {\n    stack.add(Value.bool(putKey(key), val));\n  }\n\n  private int putKey(String key) {\n    if (key == null) {\n      return -1;\n    }\n    int pos = bb.writePosition();\n    if ((flags & BUILDER_FLAG_SHARE_KEYS) != 0) {\n      Integer keyFromPool = keyPool.get(key);\n      if (keyFromPool == null) {\n        byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8);\n        bb.put(keyBytes, 0, keyBytes.length);\n        bb.put((byte) 0);\n        keyPool.put(key, pos);\n      } else {\n        pos = keyFromPool;\n      }\n    } else {\n      byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8);\n      bb.put(keyBytes, 0, keyBytes.length);\n      bb.put((byte) 0);\n      keyPool.put(key, pos);\n    }\n    return pos;\n  }\n\n  /**\n   * Adds a integer into the buff\n   *\n   * @param val integer\n   */\n  public void putInt(int val) {\n    putInt(null, val);\n  }\n\n  /**\n   * Adds a integer into the buff\n   *\n   * @param key key used to store element in map\n   * @param val integer\n   */\n  public void putInt(String key, int val) {\n    putInt(key, (long) val);\n  }\n\n  /**\n   * Adds a integer into the buff\n   *\n   * @param key key used to store element in map\n   * @param val 64-bit integer\n   */\n  public void putInt(String key, long val) {\n    int iKey = putKey(key);\n    if (Byte.MIN_VALUE <= val && val <= Byte.MAX_VALUE) {\n      stack.add(Value.int8(iKey, (int) val));\n    } else if (Short.MIN_VALUE <= val && val <= Short.MAX_VALUE) {\n      stack.add(Value.int16(iKey, (int) val));\n    } else if (Integer.MIN_VALUE <= val && val <= Integer.MAX_VALUE) {\n      stack.add(Value.int32(iKey, (int) val));\n    } else {\n      stack.add(Value.int64(iKey, val));\n    }\n  }\n\n  /**\n   * Adds a 64-bit integer into the buff\n   *\n   * @param value integer\n   */\n  public void putInt(long value) {\n    putInt(null, value);\n  }\n\n  /**\n   * Adds a unsigned integer into the buff.\n   *\n   * @param value integer representing unsigned value\n   */\n  public void putUInt(int value) {\n    putUInt(null, (long) value);\n  }\n\n  /**\n   * Adds a unsigned integer (stored in a signed 64-bit integer) into the buff.\n   *\n   * @param value integer representing unsigned value\n   */\n  public void putUInt(long value) {\n    putUInt(null, value);\n  }\n\n  /**\n   * Adds a 64-bit unsigned integer (stored as {@link BigInteger}) into the buff. Warning: This\n   * operation might be very slow.\n   *\n   * @param value integer representing unsigned value\n   */\n  public void putUInt64(BigInteger value) {\n    putUInt64(null, value.longValue());\n  }\n\n  private void putUInt64(String key, long value) {\n    stack.add(Value.uInt64(putKey(key), value));\n  }\n\n  private void putUInt(String key, long value) {\n    int iKey = putKey(key);\n    Value vVal;\n\n    int width = widthUInBits(value);\n\n    if (width == WIDTH_8) {\n      vVal = Value.uInt8(iKey, (int) value);\n    } else if (width == WIDTH_16) {\n      vVal = Value.uInt16(iKey, (int) value);\n    } else if (width == WIDTH_32) {\n      vVal = Value.uInt32(iKey, (int) value);\n    } else {\n      vVal = Value.uInt64(iKey, value);\n    }\n    stack.add(vVal);\n  }\n\n  /**\n   * Adds a 32-bit float into the buff.\n   *\n   * @param value float representing value\n   */\n  public void putFloat(float value) {\n    putFloat(null, value);\n  }\n\n  /**\n   * Adds a 32-bit float into the buff.\n   *\n   * @param key key used to store element in map\n   * @param value float representing value\n   */\n  public void putFloat(String key, float val) {\n    stack.add(Value.float32(putKey(key), val));\n  }\n\n  /**\n   * Adds a 64-bit float into the buff.\n   *\n   * @param value float representing value\n   */\n  public void putFloat(double value) {\n    putFloat(null, value);\n  }\n\n  /**\n   * Adds a 64-bit float into the buff.\n   *\n   * @param key key used to store element in map\n   * @param value float representing value\n   */\n  public void putFloat(String key, double val) {\n    stack.add(Value.float64(putKey(key), val));\n  }\n\n  /**\n   * Adds a String into the buffer\n   *\n   * @param value string\n   * @return start position of string in the buffer\n   */\n  public int putString(String value) {\n    return putString(null, value);\n  }\n\n  /**\n   * Adds a String into the buffer\n   *\n   * @param key key used to store element in map\n   * @param value string\n   * @return start position of string in the buffer\n   */\n  public int putString(String key, String val) {\n    int iKey = putKey(key);\n    if ((flags & FlexBuffersBuilder.BUILDER_FLAG_SHARE_STRINGS) != 0) {\n      Integer i = stringPool.get(val);\n      if (i == null) {\n        Value value = writeString(iKey, val);\n        stringPool.put(val, (int) value.iValue);\n        stack.add(value);\n        return (int) value.iValue;\n      } else {\n        int bitWidth = widthUInBits(val.length());\n        stack.add(Value.blob(iKey, i, FBT_STRING, bitWidth));\n        return i;\n      }\n    } else {\n      Value value = writeString(iKey, val);\n      stack.add(value);\n      return (int) value.iValue;\n    }\n  }\n\n  private Value writeString(int key, String s) {\n    return writeBlob(key, s.getBytes(StandardCharsets.UTF_8), FBT_STRING, true);\n  }\n\n  // in bits to fit a unsigned int\n  static int widthUInBits(long len) {\n    if (len <= byteToUnsignedInt((byte) 0xff)) return WIDTH_8;\n    if (len <= shortToUnsignedInt((short) 0xffff)) return WIDTH_16;\n    if (len <= intToUnsignedLong(0xffff_ffff)) return WIDTH_32;\n    return WIDTH_64;\n  }\n\n  private Value writeBlob(int key, byte[] blob, int type, boolean trailing) {\n    int bitWidth = widthUInBits(blob.length);\n    int byteWidth = align(bitWidth);\n    writeInt(blob.length, byteWidth);\n    int sloc = bb.writePosition();\n    bb.put(blob, 0, blob.length);\n    if (trailing) {\n      bb.put((byte) 0);\n    }\n    return Value.blob(key, sloc, type, bitWidth);\n  }\n\n  // Align to prepare for writing a scalar with a certain size.\n  private int align(int alignment) {\n    int byteWidth = 1 << alignment;\n    int padBytes = Value.paddingBytes(bb.writePosition(), byteWidth);\n    while (padBytes-- != 0) {\n      bb.put((byte) 0);\n    }\n    return byteWidth;\n  }\n\n  private void writeInt(long value, int byteWidth) {\n    switch (byteWidth) {\n      case 1:\n        bb.put((byte) value);\n        break;\n      case 2:\n        bb.putShort((short) value);\n        break;\n      case 4:\n        bb.putInt((int) value);\n        break;\n      case 8:\n        bb.putLong(value);\n        break;\n    }\n  }\n\n  /**\n   * Adds a byte array into the message\n   *\n   * @param value byte array\n   * @return position in buffer as the start of byte array\n   */\n  public int putBlob(byte[] value) {\n    return putBlob(null, value);\n  }\n\n  /**\n   * Adds a byte array into the message\n   *\n   * @param key key used to store element in map\n   * @param value byte array\n   * @return position in buffer as the start of byte array\n   */\n  public int putBlob(String key, byte[] val) {\n    int iKey = putKey(key);\n    Value value = writeBlob(iKey, val, FBT_BLOB, false);\n    stack.add(value);\n    return (int) value.iValue;\n  }\n\n  /**\n   * Start a new vector in the buffer.\n   *\n   * @return a reference indicating position of the vector in buffer. This reference must be passed\n   *     along when the vector is finished using endVector()\n   */\n  public int startVector() {\n    return stack.size();\n  }\n\n  /**\n   * Finishes a vector, but writing the information in the buffer\n   *\n   * @param key key used to store element in map\n   * @param start reference for beginning of the vector. Returned by {@link startVector()}\n   * @param typed boolean indicating whether vector is typed\n   * @param fixed boolean indicating whether vector is fixed\n   * @return Reference to the vector\n   */\n  public int endVector(String key, int start, boolean typed, boolean fixed) {\n    int iKey = putKey(key);\n    Value vec = createVector(iKey, start, stack.size() - start, typed, fixed, null);\n    // Remove temp elements and return vector.\n    while (stack.size() > start) {\n      stack.remove(stack.size() - 1);\n    }\n    stack.add(vec);\n    return (int) vec.iValue;\n  }\n\n  /**\n   * Finish writing the message into the buffer. After that no other element must be inserted into\n   * the buffer. Also, you must call this function before start using the FlexBuffer message\n   *\n   * @return `ByteBuffer` containing the FlexBuffer message\n   */\n  public ByteBuffer finish() {\n    // If you hit this assert, you likely have objects that were never included\n    // in a parent. You need to have exactly one root to finish a buffer.\n    // Check your Start/End calls are matched, and all objects are inside\n    // some other object.\n    assert (stack.size() == 1);\n    // Write root value.\n    int byteWidth = align(stack.get(0).elemWidth(bb.writePosition(), 0));\n    writeAny(stack.get(0), byteWidth);\n    // Write root type.\n    bb.put(stack.get(0).storedPackedType());\n    // Write root size. Normally determined by parent, but root has no parent :)\n    bb.put((byte) byteWidth);\n    this.finished = true;\n    return ByteBuffer.wrap(bb.data(), 0, bb.writePosition());\n  }\n\n  /*\n   * Create a vector based on the elements stored in the stack\n   *\n   * @param key    reference to its key\n   * @param start  element in the stack\n   * @param length size of the vector\n   * @param typed  whether is TypedVector or not\n   * @param fixed  whether is Fixed vector or not\n   * @param keys   Value representing key vector\n   * @return Value representing the created vector\n   */\n  private Value createVector(\n      int key, int start, int length, boolean typed, boolean fixed, Value keys) {\n    if (fixed & !typed)\n      throw new UnsupportedOperationException(\"Untyped fixed vector is not supported\");\n\n    // Figure out smallest bit width we can store this vector with.\n    int bitWidth = Math.max(WIDTH_8, widthUInBits(length));\n    int prefixElems = 1;\n    if (keys != null) {\n      // If this vector is part of a map, we will pre-fix an offset to the keys\n      // to this vector.\n      bitWidth = Math.max(bitWidth, keys.elemWidth(bb.writePosition(), 0));\n      prefixElems += 2;\n    }\n    int vectorType = FBT_KEY;\n    // Check bit widths and types for all elements.\n    for (int i = start; i < stack.size(); i++) {\n      int elemWidth = stack.get(i).elemWidth(bb.writePosition(), i + prefixElems);\n      bitWidth = Math.max(bitWidth, elemWidth);\n      if (typed) {\n        if (i == start) {\n          vectorType = stack.get(i).type;\n          if (!FlexBuffers.isTypedVectorElementType(vectorType)) {\n            throw new FlexBufferException(\"TypedVector does not support this element type\");\n          }\n        } else {\n          // If you get this assert, you are writing a typed vector with\n          // elements that are not all the same type.\n          assert (vectorType == stack.get(i).type);\n        }\n      }\n    }\n    // If you get this assert, your fixed types are not one of:\n    // Int / UInt / Float / Key.\n    assert (!fixed || FlexBuffers.isTypedVectorElementType(vectorType));\n\n    int byteWidth = align(bitWidth);\n    // Write vector. First the keys width/offset if available, and size.\n    if (keys != null) {\n      writeOffset(keys.iValue, byteWidth);\n      writeInt(1L << keys.minBitWidth, byteWidth);\n    }\n    if (!fixed) {\n      writeInt(length, byteWidth);\n    }\n    // Then the actual data.\n    int vloc = bb.writePosition();\n    for (int i = start; i < stack.size(); i++) {\n      writeAny(stack.get(i), byteWidth);\n    }\n    // Then the types.\n    if (!typed) {\n      for (int i = start; i < stack.size(); i++) {\n        bb.put(stack.get(i).storedPackedType(bitWidth));\n      }\n    }\n    return new Value(\n        key,\n        keys != null\n            ? FBT_MAP\n            : (typed ? FlexBuffers.toTypedVector(vectorType, fixed ? length : 0) : FBT_VECTOR),\n        bitWidth,\n        vloc);\n  }\n\n  private void writeOffset(long val, int byteWidth) {\n    int reloff = (int) (bb.writePosition() - val);\n    assert (byteWidth == 8 || reloff < 1L << (byteWidth * 8));\n    writeInt(reloff, byteWidth);\n  }\n\n  private void writeAny(final Value val, int byteWidth) {\n    switch (val.type) {\n      case FBT_NULL:\n      case FBT_BOOL:\n      case FBT_INT:\n      case FBT_UINT:\n        writeInt(val.iValue, byteWidth);\n        break;\n      case FBT_FLOAT:\n        writeDouble(val.dValue, byteWidth);\n        break;\n      default:\n        writeOffset(val.iValue, byteWidth);\n        break;\n    }\n  }\n\n  private void writeDouble(double val, int byteWidth) {\n    if (byteWidth == 4) {\n      bb.putFloat((float) val);\n    } else if (byteWidth == 8) {\n      bb.putDouble(val);\n    }\n  }\n\n  /**\n   * Start a new map in the buffer.\n   *\n   * @return a reference indicating position of the map in buffer. This reference must be passed\n   *     along when the map is finished using endMap()\n   */\n  public int startMap() {\n    return stack.size();\n  }\n\n  /**\n   * Finishes a map, but writing the information in the buffer\n   *\n   * @param key key used to store element in map\n   * @param start reference for beginning of the map. Returned by {@link startMap()}\n   * @return Reference to the map\n   */\n  public int endMap(String key, int start) {\n    int iKey = putKey(key);\n\n    Collections.sort(stack.subList(start, stack.size()), keyComparator);\n\n    Value keys = createKeyVector(start, stack.size() - start);\n    Value vec = createVector(iKey, start, stack.size() - start, false, false, keys);\n    // Remove temp elements and return map.\n    while (stack.size() > start) {\n      stack.remove(stack.size() - 1);\n    }\n    stack.add(vec);\n    return (int) vec.iValue;\n  }\n\n  private Value createKeyVector(int start, int length) {\n    // Figure out smallest bit width we can store this vector with.\n    int bitWidth = Math.max(WIDTH_8, widthUInBits(length));\n    int prefixElems = 1;\n    // Check bit widths and types for all elements.\n    for (int i = start; i < stack.size(); i++) {\n      int elemWidth =\n          Value.elemWidth(FBT_KEY, WIDTH_8, stack.get(i).key, bb.writePosition(), i + prefixElems);\n      bitWidth = Math.max(bitWidth, elemWidth);\n    }\n\n    int byteWidth = align(bitWidth);\n    // Write vector. First the keys width/offset if available, and size.\n    writeInt(length, byteWidth);\n    // Then the actual data.\n    int vloc = bb.writePosition();\n    for (int i = start; i < stack.size(); i++) {\n      int pos = stack.get(i).key;\n      assert (pos != -1);\n      writeOffset(stack.get(i).key, byteWidth);\n    }\n    // Then the types.\n    return new Value(-1, FlexBuffers.toTypedVector(FBT_KEY, 0), bitWidth, vloc);\n  }\n\n  private static class Value {\n    final int type;\n    // for scalars, represents scalar size in bytes\n    // for vectors, represents the size\n    // for string, length\n    final int minBitWidth;\n    // float value\n    final double dValue;\n    // integer value\n    long iValue;\n    // position of the key associated with this value in buffer\n    int key;\n\n    Value(int key, int type, int bitWidth, long iValue) {\n      this.key = key;\n      this.type = type;\n      this.minBitWidth = bitWidth;\n      this.iValue = iValue;\n      this.dValue = Double.MIN_VALUE;\n    }\n\n    Value(int key, int type, int bitWidth, double dValue) {\n      this.key = key;\n      this.type = type;\n      this.minBitWidth = bitWidth;\n      this.dValue = dValue;\n      this.iValue = Long.MIN_VALUE;\n    }\n\n    static Value nullValue(int key) {\n      return new Value(key, FBT_NULL, WIDTH_8, 0);\n    }\n\n    static Value bool(int key, boolean b) {\n      return new Value(key, FBT_BOOL, WIDTH_8, b ? 1 : 0);\n    }\n\n    static Value blob(int key, int position, int type, int bitWidth) {\n      return new Value(key, type, bitWidth, position);\n    }\n\n    static Value int8(int key, int value) {\n      return new Value(key, FBT_INT, WIDTH_8, value);\n    }\n\n    static Value int16(int key, int value) {\n      return new Value(key, FBT_INT, WIDTH_16, value);\n    }\n\n    static Value int32(int key, int value) {\n      return new Value(key, FBT_INT, WIDTH_32, value);\n    }\n\n    static Value int64(int key, long value) {\n      return new Value(key, FBT_INT, WIDTH_64, value);\n    }\n\n    static Value uInt8(int key, int value) {\n      return new Value(key, FBT_UINT, WIDTH_8, value);\n    }\n\n    static Value uInt16(int key, int value) {\n      return new Value(key, FBT_UINT, WIDTH_16, value);\n    }\n\n    static Value uInt32(int key, int value) {\n      return new Value(key, FBT_UINT, WIDTH_32, value);\n    }\n\n    static Value uInt64(int key, long value) {\n      return new Value(key, FBT_UINT, WIDTH_64, value);\n    }\n\n    static Value float32(int key, float value) {\n      return new Value(key, FBT_FLOAT, WIDTH_32, value);\n    }\n\n    static Value float64(int key, double value) {\n      return new Value(key, FBT_FLOAT, WIDTH_64, value);\n    }\n\n    private byte storedPackedType() {\n      return storedPackedType(WIDTH_8);\n    }\n\n    private byte storedPackedType(int parentBitWidth) {\n      return packedType(storedWidth(parentBitWidth), type);\n    }\n\n    private static byte packedType(int bitWidth, int type) {\n      return (byte) (bitWidth | (type << 2));\n    }\n\n    private int storedWidth(int parentBitWidth) {\n      if (FlexBuffers.isTypeInline(type)) {\n        return Math.max(minBitWidth, parentBitWidth);\n      } else {\n        return minBitWidth;\n      }\n    }\n\n    private int elemWidth(int bufSize, int elemIndex) {\n      return elemWidth(type, minBitWidth, iValue, bufSize, elemIndex);\n    }\n\n    private static int elemWidth(\n        int type, int minBitWidth, long iValue, int bufSize, int elemIndex) {\n      if (FlexBuffers.isTypeInline(type)) {\n        return minBitWidth;\n      } else {\n        // We have an absolute offset, but want to store a relative offset\n        // elem_index elements beyond the current buffer end. Since whether\n        // the relative offset fits in a certain byte_width depends on\n        // the size of the elements before it (and their alignment), we have\n        // to test for each size in turn.\n\n        // Original implementation checks for largest scalar\n        // which is long unsigned int\n        for (int byteWidth = 1; byteWidth <= 32; byteWidth *= 2) {\n          // Where are we going to write this offset?\n          int offsetLoc = bufSize + paddingBytes(bufSize, byteWidth) + (elemIndex * byteWidth);\n          // Compute relative offset.\n          long offset = offsetLoc - iValue;\n          // Does it fit?\n          int bitWidth = widthUInBits(offset);\n          if (((1L) << bitWidth) == byteWidth) return bitWidth;\n        }\n        assert (false); // Must match one of the sizes above.\n        return WIDTH_64;\n      }\n    }\n\n    private static int paddingBytes(int bufSize, int scalarSize) {\n      return ((~bufSize) + 1) & (scalarSize - 1);\n    }\n  }\n}\n\n/// @}\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/FloatVector.java",
    "content": "/*\n * Copyright 2019 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.flatbuffers;\n\nimport static com.google.flatbuffers.Constants.*;\n\nimport java.nio.ByteBuffer;\n\n/** Helper type for accessing vector of float values. */\npublic final class FloatVector extends BaseVector {\n  /**\n   * Assigns vector access object to vector data.\n   *\n   * @param _vector Start data of a vector.\n   * @param _bb Table's ByteBuffer.\n   * @return Returns current vector access object assigned to vector data whose offset is stored at\n   *     `vector`.\n   */\n  public FloatVector __assign(int _vector, ByteBuffer _bb) {\n    __reset(_vector, Constants.SIZEOF_FLOAT, _bb);\n    return this;\n  }\n\n  /**\n   * Reads the float value at the given index.\n   *\n   * @param j The index from which the float value will be read.\n   * @return the float value at the given index.\n   */\n  public float get(int j) {\n    return bb.getFloat(__element(j));\n  }\n}\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/IntVector.java",
    "content": "/*\n * Copyright 2019 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.flatbuffers;\n\nimport static com.google.flatbuffers.Constants.*;\n\nimport java.nio.ByteBuffer;\n\n/** Helper type for accessing vector of signed or unsigned 32-bit values. */\npublic final class IntVector extends BaseVector {\n  /**\n   * Assigns vector access object to vector data.\n   *\n   * @param _vector Start data of a vector.\n   * @param _bb Table's ByteBuffer.\n   * @return Returns current vector access object assigned to vector data whose offset is stored at\n   *     `vector`.\n   */\n  public IntVector __assign(int _vector, ByteBuffer _bb) {\n    __reset(_vector, Constants.SIZEOF_INT, _bb);\n    return this;\n  }\n\n  /**\n   * Reads the integer at the given index.\n   *\n   * @param j The index from which the integer will be read.\n   * @return the 32-bit value at the given index.\n   */\n  public int get(int j) {\n    return bb.getInt(__element(j));\n  }\n\n  /**\n   * Reads the integer at the given index, zero-extends it to type long, and returns the result,\n   * which is therefore in the range 0 through 4294967295.\n   *\n   * @param j The index from which the integer will be read.\n   * @return the unsigned 32-bit at the given index.\n   */\n  public long getAsUnsigned(int j) {\n    return (long) get(j) & 0xFFFFFFFFL;\n  }\n}\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/LongVector.java",
    "content": "/*\n * Copyright 2019 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.flatbuffers;\n\nimport static com.google.flatbuffers.Constants.*;\n\nimport java.nio.ByteBuffer;\n\n/** Helper type for accessing vector of long values. */\npublic final class LongVector extends BaseVector {\n  /**\n   * Assigns vector access object to vector data.\n   *\n   * @param _vector Start data of a vector.\n   * @param _bb Table's ByteBuffer.\n   * @return Returns current vector access object assigned to vector data whose offset is stored at\n   *     `vector`.\n   */\n  public LongVector __assign(int _vector, ByteBuffer _bb) {\n    __reset(_vector, Constants.SIZEOF_LONG, _bb);\n    return this;\n  }\n\n  /**\n   * Reads the long value at the given index.\n   *\n   * @param j The index from which the long value will be read.\n   * @return the signed 64-bit value at the given index.\n   */\n  public long get(int j) {\n    return bb.getLong(__element(j));\n  }\n}\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/ReadBuf.java",
    "content": "package com.google.flatbuffers;\n\n/** Represent a chunk of data, where FlexBuffers will read from. */\npublic interface ReadBuf {\n\n  /**\n   * Read boolean from data. Booleans as stored as single byte\n   *\n   * @param index position of the element in ReadBuf\n   * @return boolean element\n   */\n  boolean getBoolean(int index);\n\n  /**\n   * Read a byte from data.\n   *\n   * @param index position of the element in ReadBuf\n   * @return a byte\n   */\n  byte get(int index);\n\n  /**\n   * Read a short from data.\n   *\n   * @param index position of the element in ReadBuf\n   * @return a short\n   */\n  short getShort(int index);\n\n  /**\n   * Read a 32-bit int from data.\n   *\n   * @param index position of the element in ReadBuf\n   * @return an int\n   */\n  int getInt(int index);\n\n  /**\n   * Read a 64-bit long from data.\n   *\n   * @param index position of the element in ReadBuf\n   * @return a long\n   */\n  long getLong(int index);\n\n  /**\n   * Read a 32-bit float from data.\n   *\n   * @param index position of the element in ReadBuf\n   * @return a float\n   */\n  float getFloat(int index);\n\n  /**\n   * Read a 64-bit float from data.\n   *\n   * @param index position of the element in ReadBuf\n   * @return a double\n   */\n  double getDouble(int index);\n\n  /**\n   * Read an UTF-8 string from data.\n   *\n   * @param start initial element of the string\n   * @param size size of the string in bytes.\n   * @return a {@code String}\n   */\n  String getString(int start, int size);\n\n  /**\n   * Expose ReadBuf as an array of bytes. This method is meant to be as efficient as possible, so\n   * for a array-backed ReadBuf, it should return its own internal data. In case access to internal\n   * data is not possible, a copy of the data into an array of bytes might occur.\n   *\n   * @return ReadBuf as an array of bytes\n   */\n  byte[] data();\n\n  /**\n   * Defines the size of the message in the buffer. It also determines last position that buffer can\n   * be read. Last byte to be accessed is in position {@code limit() -1}.\n   *\n   * @return indicate last position\n   */\n  int limit();\n}\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/ReadWriteBuf.java",
    "content": "package com.google.flatbuffers;\n\n/**\n * Interface to represent a read-write buffer. This interface will be used to access and write\n * FlexBuffers message.\n */\npublic interface ReadWriteBuf extends ReadBuf {\n\n  /**\n   * Clears (resets) the buffer so that it can be reused. Write position will be set to the start.\n   */\n  void clear();\n\n  /**\n   * Put a boolean into the buffer at {@code writePosition()} . Booleans as stored as single byte.\n   * Write position will be incremented.\n   *\n   * @return boolean element\n   */\n  void putBoolean(boolean value);\n\n  /**\n   * Put an array of bytes into the buffer at {@code writePosition()}. Write position will be\n   * incremented.\n   *\n   * @param value the data to be copied\n   * @param start initial position on value to be copied\n   * @param length amount of bytes to be copied\n   */\n  void put(byte[] value, int start, int length);\n\n  /**\n   * Write a byte into the buffer at {@code writePosition()}. Write position will be incremented.\n   */\n  void put(byte value);\n\n  /**\n   * Write a 16-bit into in the buffer at {@code writePosition()}. Write position will be\n   * incremented.\n   */\n  void putShort(short value);\n\n  /**\n   * Write a 32-bit into in the buffer at {@code writePosition()}. Write position will be\n   * incremented.\n   */\n  void putInt(int value);\n\n  /**\n   * Write a 64-bit into in the buffer at {@code writePosition()}. Write position will be\n   * incremented.\n   */\n  void putLong(long value);\n\n  /**\n   * Write a 32-bit float into the buffer at {@code writePosition()}. Write position will be\n   * incremented.\n   */\n  void putFloat(float value);\n\n  /**\n   * Write a 64-bit float into the buffer at {@code writePosition()}. Write position will be\n   * incremented.\n   */\n  void putDouble(double value);\n\n  /**\n   * Write boolean into a given position on the buffer. Booleans as stored as single byte.\n   *\n   * @param index position of the element in buffer\n   */\n  void setBoolean(int index, boolean value);\n\n  /**\n   * Read a byte from data.\n   *\n   * @param index position of the element in the buffer\n   * @return a byte\n   */\n  void set(int index, byte value);\n\n  /**\n   * Write an array of bytes into the buffer.\n   *\n   * @param index initial position of the buffer to be written\n   * @param value the data to be copied\n   * @param start initial position on value to be copied\n   * @param length amount of bytes to be copied\n   */\n  void set(int index, byte[] value, int start, int length);\n\n  /**\n   * Read a short from data.\n   *\n   * @param index position of the element in ReadBuf\n   * @return a short\n   */\n  void setShort(int index, short value);\n\n  /**\n   * Read a 32-bit int from data.\n   *\n   * @param index position of the element in ReadBuf\n   * @return an int\n   */\n  void setInt(int index, int value);\n\n  /**\n   * Read a 64-bit long from data.\n   *\n   * @param index position of the element in ReadBuf\n   * @return a long\n   */\n  void setLong(int index, long value);\n\n  /**\n   * Read a 32-bit float from data.\n   *\n   * @param index position of the element in ReadBuf\n   * @return a float\n   */\n  void setFloat(int index, float value);\n\n  /**\n   * Read a 64-bit float from data.\n   *\n   * @param index position of the element in ReadBuf\n   * @return a double\n   */\n  void setDouble(int index, double value);\n\n  int writePosition();\n\n  /**\n   * Defines the size of the message in the buffer. It also determines last position that buffer can\n   * be read or write. Last byte to be accessed is in position {@code limit() -1}.\n   *\n   * @return indicate last position\n   */\n  int limit();\n\n  /**\n   * Request capacity of the buffer. In case buffer is already larger than the requested, this\n   * method will just return true. Otherwise It might try to resize the buffer.\n   *\n   * @return true if buffer is able to offer the requested capacity\n   */\n  boolean requestCapacity(int capacity);\n}\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/ShortVector.java",
    "content": "/*\n * Copyright 2019 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.flatbuffers;\n\nimport static com.google.flatbuffers.Constants.*;\n\nimport java.nio.ByteBuffer;\n\n/** Helper type for accessing vector of signed or unsigned 16-bit values. */\npublic final class ShortVector extends BaseVector {\n  /**\n   * Assigns vector access object to vector data.\n   *\n   * @param _vector Start data of a vector.\n   * @param _bb Table's ByteBuffer.\n   * @return Returns current vector access object assigned to vector data whose offset is stored at\n   *     `vector`.\n   */\n  public ShortVector __assign(int _vector, ByteBuffer _bb) {\n    __reset(_vector, Constants.SIZEOF_SHORT, _bb);\n    return this;\n  }\n\n  /**\n   * Reads the short value at the given index.\n   *\n   * @param j The index from which the short value will be read.\n   * @return the 16-bit value at the given index.\n   */\n  public short get(int j) {\n    return bb.getShort(__element(j));\n  }\n\n  /**\n   * Reads the short at the given index, zero-extends it to type int, and returns the result, which\n   * is therefore in the range 0 through 65535.\n   *\n   * @param j The index from which the short value will be read.\n   * @return the unsigned 16-bit at the given index.\n   */\n  public int getAsUnsigned(int j) {\n    return (int) get(j) & 0xFFFF;\n  }\n}\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/StringVector.java",
    "content": "/*\n * Copyright 2019 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.flatbuffers;\n\nimport static com.google.flatbuffers.Constants.*;\n\nimport java.nio.ByteBuffer;\n\n/** Helper type for accessing vector of String. */\npublic final class StringVector extends BaseVector {\n  private Utf8 utf8 = Utf8.getDefault();\n\n  /**\n   * Assigns vector access object to vector data.\n   *\n   * @param _vector Start data of a vector.\n   * @param _element_size Size of a vector element.\n   * @param _bb Table's ByteBuffer.\n   * @return Returns current vector access object assigned to vector data whose offset is stored at\n   *     `vector`.\n   */\n  public StringVector __assign(int _vector, int _element_size, ByteBuffer _bb) {\n    __reset(_vector, _element_size, _bb);\n    return this;\n  }\n\n  /**\n   * Reads the String at the given index.\n   *\n   * @param j The index from which the String value will be read.\n   * @return the String at the given index.\n   */\n  public String get(int j) {\n    return Table.__string(__element(j), bb, utf8);\n  }\n}\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/Struct.java",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.flatbuffers;\n\nimport java.nio.ByteBuffer;\n\n/// @cond FLATBUFFERS_INTERNAL\n\n/** All structs in the generated code derive from this class, and add their own accessors. */\npublic class Struct {\n  /** Used to hold the position of the `bb` buffer. */\n  protected int bb_pos;\n\n  /** The underlying ByteBuffer to hold the data of the Struct. */\n  protected ByteBuffer bb;\n\n  /**\n   * Re-init the internal state with an external buffer {@code ByteBuffer} and an offset within.\n   *\n   * <p>This method exists primarily to allow recycling Table instances without risking memory leaks\n   * due to {@code ByteBuffer} references.\n   */\n  protected void __reset(int _i, ByteBuffer _bb) {\n    bb = _bb;\n    if (bb != null) {\n      bb_pos = _i;\n    } else {\n      bb_pos = 0;\n    }\n  }\n\n  /**\n   * Resets internal state with a null {@code ByteBuffer} and a zero position.\n   *\n   * <p>This method exists primarily to allow recycling Struct instances without risking memory\n   * leaks due to {@code ByteBuffer} references. The instance will be unusable until it is assigned\n   * again to a {@code ByteBuffer}.\n   *\n   * @param struct the instance to reset to initial state\n   */\n  public void __reset() {\n    __reset(0, null);\n  }\n}\n\n/// @endcond\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/Table.java",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.flatbuffers;\n\nimport static com.google.flatbuffers.Constants.*;\n\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n/// @cond FLATBUFFERS_INTERNAL\n\n/** All tables in the generated code derive from this class, and add their own accessors. */\npublic class Table {\n  /** Used to hold the position of the `bb` buffer. */\n  protected int bb_pos;\n\n  /** The underlying ByteBuffer to hold the data of the Table. */\n  protected ByteBuffer bb;\n\n  /** Used to hold the vtable position. */\n  private int vtable_start;\n\n  /** Used to hold the vtable size. */\n  private int vtable_size;\n\n  Utf8 utf8 = Utf8.getDefault();\n\n  /**\n   * Get the underlying ByteBuffer.\n   *\n   * @return Returns the Table's ByteBuffer.\n   */\n  public ByteBuffer getByteBuffer() {\n    return bb;\n  }\n\n  /**\n   * Look up a field in the vtable.\n   *\n   * @param vtable_offset An `int` offset to the vtable in the Table's ByteBuffer.\n   * @return Returns an offset into the object, or `0` if the field is not present.\n   */\n  protected int __offset(int vtable_offset) {\n    return vtable_offset < vtable_size ? bb.getShort(vtable_start + vtable_offset) : 0;\n  }\n\n  protected static int __offset(int vtable_offset, int offset, ByteBuffer bb) {\n    int vtable = bb.capacity() - offset;\n    return bb.getShort(vtable + vtable_offset - bb.getInt(vtable)) + vtable;\n  }\n\n  /**\n   * Retrieve a relative offset.\n   *\n   * @param offset An `int` index into the Table's ByteBuffer containing the relative offset.\n   * @return Returns the relative offset stored at `offset`.\n   */\n  protected int __indirect(int offset) {\n    return offset + bb.getInt(offset);\n  }\n\n  /**\n   * Retrieve a relative offset.\n   *\n   * @param offset An `int` index into a ByteBuffer containing the relative offset.\n   * @param bb from which the relative offset will be retrieved.\n   * @return Returns the relative offset stored at `offset`.\n   */\n  protected static int __indirect(int offset, ByteBuffer bb) {\n    return offset + bb.getInt(offset);\n  }\n\n  /**\n   * Create a Java `String` from UTF-8 data stored inside the FlatBuffer.\n   *\n   * <p>This allocates a new string and converts to wide chars upon each access, which is not very\n   * efficient. Instead, each FlatBuffer string also comes with an accessor based on\n   * __vector_as_bytebuffer below, which is much more efficient, assuming your Java program can\n   * handle UTF-8 data directly.\n   *\n   * @param offset An `int` index into the Table's ByteBuffer.\n   * @return Returns a `String` from the data stored inside the FlatBuffer at `offset`.\n   */\n  protected String __string(int offset) {\n    return __string(offset, bb, utf8);\n  }\n\n  /**\n   * Create a Java `String` from UTF-8 data stored inside the FlatBuffer.\n   *\n   * <p>This allocates a new string and converts to wide chars upon each access, which is not very\n   * efficient. Instead, each FlatBuffer string also comes with an accessor based on\n   * __vector_as_bytebuffer below, which is much more efficient, assuming your Java program can\n   * handle UTF-8 data directly.\n   *\n   * @param offset An `int` index into the Table's ByteBuffer.\n   * @param bb Table ByteBuffer used to read a string at given offset.\n   * @param utf8 decoder that creates a Java `String` from UTF-8 characters.\n   * @return Returns a `String` from the data stored inside the FlatBuffer at `offset`.\n   */\n  protected static String __string(int offset, ByteBuffer bb, Utf8 utf8) {\n    offset += bb.getInt(offset);\n    int length = bb.getInt(offset);\n    return utf8.decodeUtf8(bb, offset + SIZEOF_INT, length);\n  }\n\n  /**\n   * Get the length of a vector.\n   *\n   * @param offset An `int` index into the Table's ByteBuffer.\n   * @return Returns the length of the vector whose offset is stored at `offset`.\n   */\n  protected int __vector_len(int offset) {\n    offset += bb_pos;\n    offset += bb.getInt(offset);\n    return bb.getInt(offset);\n  }\n\n  /**\n   * Get the start data of a vector.\n   *\n   * @param offset An `int` index into the Table's ByteBuffer.\n   * @return Returns the start of the vector data whose offset is stored at `offset`.\n   */\n  protected int __vector(int offset) {\n    offset += bb_pos;\n    return offset + bb.getInt(offset) + SIZEOF_INT; // data starts after the length\n  }\n\n  /**\n   * Get a whole vector as a ByteBuffer.\n   *\n   * <p>This is efficient, since it only allocates a new {@link ByteBuffer} object, but does not\n   * actually copy the data, it still refers to the same bytes as the original ByteBuffer. Also\n   * useful with nested FlatBuffers, etc.\n   *\n   * @param vector_offset The position of the vector in the byte buffer\n   * @param elem_size The size of each element in the array\n   * @return The {@link ByteBuffer} for the array\n   */\n  protected ByteBuffer __vector_as_bytebuffer(int vector_offset, int elem_size) {\n    int o = __offset(vector_offset);\n    if (o == 0) return null;\n    ByteBuffer bb = this.bb.duplicate().order(ByteOrder.LITTLE_ENDIAN);\n    int vectorstart = __vector(o);\n    bb.position(vectorstart);\n    bb.limit(vectorstart + __vector_len(o) * elem_size);\n    return bb;\n  }\n\n  /**\n   * Initialize vector as a ByteBuffer.\n   *\n   * <p>This is more efficient than using duplicate, since it doesn't copy the data nor allocattes a\n   * new {@link ByteBuffer}, creating no garbage to be collected.\n   *\n   * @param bb The {@link ByteBuffer} for the array\n   * @param vector_offset The position of the vector in the byte buffer\n   * @param elem_size The size of each element in the array\n   * @return The {@link ByteBuffer} for the array\n   */\n  protected ByteBuffer __vector_in_bytebuffer(ByteBuffer bb, int vector_offset, int elem_size) {\n    int o = this.__offset(vector_offset);\n    if (o == 0) return null;\n    int vectorstart = __vector(o);\n    bb.rewind();\n    bb.limit(vectorstart + __vector_len(o) * elem_size);\n    bb.position(vectorstart);\n    return bb;\n  }\n\n  /**\n   * Initialize any Table-derived type to point to the union at the given `offset`.\n   *\n   * @param t A `Table`-derived type that should point to the union at `offset`.\n   * @param offset An `int` index into the Table's ByteBuffer.\n   * @return Returns the Table that points to the union at `offset`.\n   */\n  protected Table __union(Table t, int offset) {\n    return __union(t, offset, bb);\n  }\n\n  /**\n   * Initialize any Table-derived type to point to the union at the given `offset`.\n   *\n   * @param t A `Table`-derived type that should point to the union at `offset`.\n   * @param offset An `int` index into the Table's ByteBuffer.\n   * @param bb Table ByteBuffer used to initialize the object Table-derived type.\n   * @return Returns the Table that points to the union at `offset`.\n   */\n  protected static Table __union(Table t, int offset, ByteBuffer bb) {\n    t.__reset(__indirect(offset, bb), bb);\n    return t;\n  }\n\n  /**\n   * Check if a {@link ByteBuffer} contains a file identifier.\n   *\n   * @param bb A {@code ByteBuffer} to check if it contains the identifier `ident`.\n   * @param ident A `String` identifier of the FlatBuffer file.\n   * @return True if the buffer contains the file identifier\n   */\n  protected static boolean __has_identifier(ByteBuffer bb, String ident) {\n    if (ident.length() != FILE_IDENTIFIER_LENGTH)\n      throw new AssertionError(\n          \"FlatBuffers: file identifier must be length \" + FILE_IDENTIFIER_LENGTH);\n    for (int i = 0; i < FILE_IDENTIFIER_LENGTH; i++) {\n      if (ident.charAt(i) != (char) bb.get(bb.position() + SIZEOF_INT + i)) return false;\n    }\n    return true;\n  }\n\n  /**\n   * Sort tables by the key.\n   *\n   * @param offsets An 'int' indexes of the tables into the bb.\n   * @param bb A {@code ByteBuffer} to get the tables.\n   */\n  protected void sortTables(int[] offsets, final ByteBuffer bb) {\n    Integer[] off = new Integer[offsets.length];\n    for (int i = 0; i < offsets.length; i++) off[i] = offsets[i];\n    java.util.Arrays.sort(\n        off,\n        new java.util.Comparator<Integer>() {\n          public int compare(Integer o1, Integer o2) {\n            return keysCompare(o1, o2, bb);\n          }\n        });\n    for (int i = 0; i < offsets.length; i++) offsets[i] = off[i];\n  }\n\n  /**\n   * Compare two tables by the key.\n   *\n   * @param o1 An 'Integer' index of the first key into the bb.\n   * @param o2 An 'Integer' index of the second key into the bb.\n   * @param bb A {@code ByteBuffer} to get the keys.\n   */\n  protected int keysCompare(Integer o1, Integer o2, ByteBuffer bb) {\n    return 0;\n  }\n\n  /**\n   * Compare two strings in the buffer.\n   *\n   * @param offset_1 An 'int' index of the first string into the bb.\n   * @param offset_2 An 'int' index of the second string into the bb.\n   * @param bb A {@code ByteBuffer} to get the strings.\n   */\n  protected static int compareStrings(int offset_1, int offset_2, ByteBuffer bb) {\n    offset_1 += bb.getInt(offset_1);\n    offset_2 += bb.getInt(offset_2);\n    int len_1 = bb.getInt(offset_1);\n    int len_2 = bb.getInt(offset_2);\n    int startPos_1 = offset_1 + SIZEOF_INT;\n    int startPos_2 = offset_2 + SIZEOF_INT;\n    int len = Math.min(len_1, len_2);\n    for (int i = 0; i < len; i++) {\n      if (bb.get(i + startPos_1) != bb.get(i + startPos_2))\n        return bb.get(i + startPos_1) - bb.get(i + startPos_2);\n    }\n    return len_1 - len_2;\n  }\n\n  /**\n   * Compare string from the buffer with the 'String' object.\n   *\n   * @param offset_1 An 'int' index of the first string into the bb.\n   * @param key Second string as a byte array.\n   * @param bb A {@code ByteBuffer} to get the first string.\n   */\n  protected static int compareStrings(int offset_1, byte[] key, ByteBuffer bb) {\n    offset_1 += bb.getInt(offset_1);\n    int len_1 = bb.getInt(offset_1);\n    int len_2 = key.length;\n    int startPos_1 = offset_1 + Constants.SIZEOF_INT;\n    int len = Math.min(len_1, len_2);\n    for (int i = 0; i < len; i++) {\n      if (bb.get(i + startPos_1) != key[i]) return bb.get(i + startPos_1) - key[i];\n    }\n    return len_1 - len_2;\n  }\n\n  /**\n   * Re-init the internal state with an external buffer {@code ByteBuffer} and an offset within.\n   *\n   * <p>This method exists primarily to allow recycling Table instances without risking memory leaks\n   * due to {@code ByteBuffer} references.\n   */\n  protected void __reset(int _i, ByteBuffer _bb) {\n    bb = _bb;\n    if (bb != null) {\n      bb_pos = _i;\n      vtable_start = bb_pos - bb.getInt(bb_pos);\n      vtable_size = bb.getShort(vtable_start);\n    } else {\n      bb_pos = 0;\n      vtable_start = 0;\n      vtable_size = 0;\n    }\n  }\n\n  /**\n   * Resets the internal state with a null {@code ByteBuffer} and a zero position.\n   *\n   * <p>This method exists primarily to allow recycling Table instances without risking memory leaks\n   * due to {@code ByteBuffer} references. The instance will be unusable until it is assigned again\n   * to a {@code ByteBuffer}.\n   */\n  public void __reset() {\n    __reset(0, null);\n  }\n}\n\n/// @endcond\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/UnionVector.java",
    "content": "/*\n * Copyright 2019 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.flatbuffers;\n\nimport static com.google.flatbuffers.Constants.*;\n\nimport java.nio.ByteBuffer;\n\n/** Helper type for accessing vector of unions. */\npublic final class UnionVector extends BaseVector {\n  /**\n   * Assigns vector access object to vector data.\n   *\n   * @param _vector Start data of a vector.\n   * @param _element_size Size of a vector element.\n   * @param _bb Table's ByteBuffer.\n   * @return Returns current vector access object assigned to vector data whose offset is stored at\n   *     `vector`.\n   */\n  public UnionVector __assign(int _vector, int _element_size, ByteBuffer _bb) {\n    __reset(_vector, _element_size, _bb);\n    return this;\n  }\n\n  /**\n   * Initialize any Table-derived type to point to the union at the given `index`.\n   *\n   * @param obj A `Table`-derived type that should point to the union at `index`.\n   * @param j An `int` index into the union vector.\n   * @return Returns the Table that points to the union at `index`.\n   */\n  public Table get(Table obj, int j) {\n    return Table.__union(obj, __element(j), bb);\n  }\n}\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/Utf8.java",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.flatbuffers;\n\nimport static java.lang.Character.MAX_SURROGATE;\nimport static java.lang.Character.MIN_HIGH_SURROGATE;\nimport static java.lang.Character.MIN_LOW_SURROGATE;\nimport static java.lang.Character.MIN_SUPPLEMENTARY_CODE_POINT;\nimport static java.lang.Character.MIN_SURROGATE;\nimport static java.lang.Character.isSurrogatePair;\nimport static java.lang.Character.toCodePoint;\n\nimport java.nio.ByteBuffer;\n\npublic abstract class Utf8 {\n\n  /**\n   * Returns the number of bytes in the UTF-8-encoded form of {@code sequence}. For a string, this\n   * method is equivalent to {@code string.getBytes(UTF_8).length}, but is more efficient in both\n   * time and space.\n   *\n   * @throws IllegalArgumentException if {@code sequence} contains ill-formed UTF-16 (unpaired\n   *     surrogates)\n   */\n  public abstract int encodedLength(CharSequence sequence);\n\n  /**\n   * Encodes the given characters to the target {@link ByteBuffer} using UTF-8 encoding.\n   *\n   * <p>Selects an optimal algorithm based on the type of {@link ByteBuffer} (i.e. heap or direct)\n   * and the capabilities of the platform.\n   *\n   * @param in the source string to be encoded\n   * @param out the target buffer to receive the encoded string.\n   */\n  public abstract void encodeUtf8(CharSequence in, ByteBuffer out);\n\n  /**\n   * Decodes the given UTF-8 portion of the {@link ByteBuffer} into a {@link String}.\n   *\n   * @throws IllegalArgumentException if the input is not valid UTF-8.\n   */\n  public abstract String decodeUtf8(ByteBuffer buffer, int offset, int length);\n\n  private static Utf8 DEFAULT;\n\n  /**\n   * Get the default UTF-8 processor.\n   *\n   * @return the default processor\n   */\n  public static Utf8 getDefault() {\n    if (DEFAULT == null) {\n      DEFAULT = new Utf8Safe();\n    }\n    return DEFAULT;\n  }\n\n  /**\n   * Set the default instance of the UTF-8 processor.\n   *\n   * @param instance the new instance to use\n   */\n  public static void setDefault(Utf8 instance) {\n    DEFAULT = instance;\n  }\n\n  /**\n   * Encode a Java's CharSequence UTF8 codepoint into a byte array.\n   *\n   * @param in CharSequence to be encoded\n   * @param start start position of the first char in the codepoint\n   * @param out byte array of 4 bytes to be filled\n   * @return return the amount of bytes occupied by the codepoint\n   */\n  public static int encodeUtf8CodePoint(CharSequence in, int start, byte[] out) {\n    // utf8 codepoint needs at least 4 bytes\n    assert out.length >= 4;\n\n    final int inLength = in.length();\n    if (start >= inLength) {\n      return 0;\n    }\n\n    char c = in.charAt(start);\n    if (c < 0x80) {\n      // One byte (0xxx xxxx)\n      out[0] = (byte) c;\n      return 1;\n    } else if (c < 0x800) {\n      // Two bytes (110x xxxx 10xx xxxx)\n      out[0] = (byte) (0xC0 | (c >>> 6));\n      out[1] = (byte) (0x80 | (0x3F & c));\n      return 2;\n    } else if (c < MIN_SURROGATE || MAX_SURROGATE < c) {\n      // Three bytes (1110 xxxx 10xx xxxx 10xx xxxx)\n      // Maximum single-char code point is 0xFFFF, 16 bits.\n      out[0] = (byte) (0xE0 | (c >>> 12));\n      out[1] = (byte) (0x80 | (0x3F & (c >>> 6)));\n      out[2] = (byte) (0x80 | (0x3F & c));\n      return 3;\n    } else {\n      // Four bytes (1111 xxxx 10xx xxxx 10xx xxxx 10xx xxxx)\n      // Minimum code point represented by a surrogate pair is 0x10000, 17 bits, four UTF-8\n      // bytes\n      final char low;\n      if (start + 1 == inLength || !isSurrogatePair(c, (low = in.charAt(start + 1)))) {\n        throw new UnpairedSurrogateException(start, inLength);\n      }\n      int codePoint = toCodePoint(c, low);\n      out[0] = (byte) ((0xF << 4) | (codePoint >>> 18));\n      out[1] = (byte) (0x80 | (0x3F & (codePoint >>> 12)));\n      out[2] = (byte) (0x80 | (0x3F & (codePoint >>> 6)));\n      out[3] = (byte) (0x80 | (0x3F & codePoint));\n      return 4;\n    }\n  }\n\n  /**\n   * Utility methods for decoding bytes into {@link String}. Callers are responsible for extracting\n   * bytes (possibly using Unsafe methods), and checking remaining bytes. All other UTF-8 validity\n   * checks and codepoint conversion happen in this class.\n   */\n  static class DecodeUtil {\n\n    /** Returns whether this is a single-byte codepoint (i.e., ASCII) with the form '0XXXXXXX'. */\n    static boolean isOneByte(byte b) {\n      return b >= 0;\n    }\n\n    /** Returns whether this is a two-byte codepoint with the form '10XXXXXX'. */\n    static boolean isTwoBytes(byte b) {\n      return b < (byte) 0xE0;\n    }\n\n    /** Returns whether this is a three-byte codepoint with the form '110XXXXX'. */\n    static boolean isThreeBytes(byte b) {\n      return b < (byte) 0xF0;\n    }\n\n    static void handleOneByte(byte byte1, char[] resultArr, int resultPos) {\n      resultArr[resultPos] = (char) byte1;\n    }\n\n    static void handleTwoBytes(byte byte1, byte byte2, char[] resultArr, int resultPos)\n        throws IllegalArgumentException {\n      // Simultaneously checks for illegal trailing-byte in leading position (<= '11000000') and\n      // overlong 2-byte, '11000001'.\n      if (byte1 < (byte) 0xC2) {\n        throw new IllegalArgumentException(\"Invalid UTF-8: Illegal leading byte in 2 bytes utf\");\n      }\n      if (isNotTrailingByte(byte2)) {\n        throw new IllegalArgumentException(\"Invalid UTF-8: Illegal trailing byte in 2 bytes utf\");\n      }\n      resultArr[resultPos] = (char) (((byte1 & 0x1F) << 6) | trailingByteValue(byte2));\n    }\n\n    static void handleThreeBytes(\n        byte byte1, byte byte2, byte byte3, char[] resultArr, int resultPos)\n        throws IllegalArgumentException {\n      if (isNotTrailingByte(byte2)\n          // overlong? 5 most significant bits must not all be zero\n          || (byte1 == (byte) 0xE0 && byte2 < (byte) 0xA0)\n          // check for illegal surrogate codepoints\n          || (byte1 == (byte) 0xED && byte2 >= (byte) 0xA0)\n          || isNotTrailingByte(byte3)) {\n        throw new IllegalArgumentException(\"Invalid UTF-8\");\n      }\n      resultArr[resultPos] =\n          (char)\n              (((byte1 & 0x0F) << 12) | (trailingByteValue(byte2) << 6) | trailingByteValue(byte3));\n    }\n\n    static void handleFourBytes(\n        byte byte1, byte byte2, byte byte3, byte byte4, char[] resultArr, int resultPos)\n        throws IllegalArgumentException {\n      if (isNotTrailingByte(byte2)\n          // Check that 1 <= plane <= 16.  Tricky optimized form of:\n          //   valid 4-byte leading byte?\n          // if (byte1 > (byte) 0xF4 ||\n          //   overlong? 4 most significant bits must not all be zero\n          //     byte1 == (byte) 0xF0 && byte2 < (byte) 0x90 ||\n          //   codepoint larger than the highest code point (U+10FFFF)?\n          //     byte1 == (byte) 0xF4 && byte2 > (byte) 0x8F)\n          || (((byte1 << 28) + (byte2 - (byte) 0x90)) >> 30) != 0\n          || isNotTrailingByte(byte3)\n          || isNotTrailingByte(byte4)) {\n        throw new IllegalArgumentException(\"Invalid UTF-8\");\n      }\n      int codepoint =\n          ((byte1 & 0x07) << 18)\n              | (trailingByteValue(byte2) << 12)\n              | (trailingByteValue(byte3) << 6)\n              | trailingByteValue(byte4);\n      resultArr[resultPos] = DecodeUtil.highSurrogate(codepoint);\n      resultArr[resultPos + 1] = DecodeUtil.lowSurrogate(codepoint);\n    }\n\n    /** Returns whether the byte is not a valid continuation of the form '10XXXXXX'. */\n    private static boolean isNotTrailingByte(byte b) {\n      return b > (byte) 0xBF;\n    }\n\n    /** Returns the actual value of the trailing byte (removes the prefix '10') for composition. */\n    private static int trailingByteValue(byte b) {\n      return b & 0x3F;\n    }\n\n    private static char highSurrogate(int codePoint) {\n      return (char)\n          ((MIN_HIGH_SURROGATE - (MIN_SUPPLEMENTARY_CODE_POINT >>> 10)) + (codePoint >>> 10));\n    }\n\n    private static char lowSurrogate(int codePoint) {\n      return (char) (MIN_LOW_SURROGATE + (codePoint & 0x3ff));\n    }\n  }\n\n  // These UTF-8 handling methods are copied from Guava's Utf8Unsafe class with a modification to\n  // throw\n  // a protocol buffer local exception. This exception is then caught in CodedOutputStream so it can\n  // fallback to more lenient behavior.\n  static class UnpairedSurrogateException extends IllegalArgumentException {\n    UnpairedSurrogateException(int index, int length) {\n      super(\"Unpaired surrogate at index \" + index + \" of \" + length);\n    }\n  }\n}\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/Utf8Old.java",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.flatbuffers;\n\nimport java.nio.ByteBuffer;\nimport java.nio.CharBuffer;\nimport java.nio.charset.CharacterCodingException;\nimport java.nio.charset.CharsetDecoder;\nimport java.nio.charset.CharsetEncoder;\nimport java.nio.charset.CoderResult;\nimport java.nio.charset.StandardCharsets;\n\n/**\n * This class implements the Utf8 API using the Java Utf8 encoder. Use Utf8.setDefault(new\n * Utf8Old()); to use it.\n */\npublic class Utf8Old extends Utf8 {\n\n  private static class Cache {\n    final CharsetEncoder encoder;\n    final CharsetDecoder decoder;\n    CharSequence lastInput = null;\n    ByteBuffer lastOutput = null;\n\n    Cache() {\n      encoder = StandardCharsets.UTF_8.newEncoder();\n      decoder = StandardCharsets.UTF_8.newDecoder();\n    }\n  }\n\n  // ThreadLocal.withInitial() is not used to make the following code compatible with Android API\n  // level 23.\n  private static final ThreadLocal<Cache> CACHE =\n      new ThreadLocal<Cache>() {\n        @Override\n        protected Cache initialValue() {\n          return new Cache();\n        }\n      };\n\n  // Play some games so that the old encoder doesn't pay twice for computing\n  // the length of the encoded string.\n\n  @Override\n  public int encodedLength(CharSequence in) {\n    final Cache cache = CACHE.get();\n    int estimated = (int) (in.length() * cache.encoder.maxBytesPerChar());\n    if (cache.lastOutput == null || cache.lastOutput.capacity() < estimated) {\n      cache.lastOutput = ByteBuffer.allocate(Math.max(128, estimated));\n    }\n    cache.lastOutput.clear();\n    cache.lastInput = in;\n    CharBuffer wrap = (in instanceof CharBuffer) ? (CharBuffer) in : CharBuffer.wrap(in);\n    CoderResult result = cache.encoder.encode(wrap, cache.lastOutput, true);\n    if (result.isError()) {\n      try {\n        result.throwException();\n      } catch (CharacterCodingException e) {\n        throw new IllegalArgumentException(\"bad character encoding\", e);\n      }\n    }\n    cache.lastOutput.flip();\n    return cache.lastOutput.remaining();\n  }\n\n  @Override\n  public void encodeUtf8(CharSequence in, ByteBuffer out) {\n    final Cache cache = CACHE.get();\n    if (cache.lastInput != in) {\n      // Update the lastOutput to match our input, although flatbuffer should\n      // never take this branch.\n      encodedLength(in);\n    }\n    out.put(cache.lastOutput);\n  }\n\n  @Override\n  public String decodeUtf8(ByteBuffer buffer, int offset, int length) {\n    CharsetDecoder decoder = CACHE.get().decoder;\n    decoder.reset();\n    buffer = buffer.duplicate();\n    buffer.position(offset);\n    buffer.limit(offset + length);\n    try {\n      CharBuffer result = decoder.decode(buffer);\n      return result.toString();\n    } catch (CharacterCodingException e) {\n      throw new IllegalArgumentException(\"Bad encoding\", e);\n    }\n  }\n}\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/Utf8Safe.java",
    "content": "package com.google.flatbuffers;\n\nimport static java.lang.Character.MAX_SURROGATE;\nimport static java.lang.Character.MIN_SUPPLEMENTARY_CODE_POINT;\nimport static java.lang.Character.MIN_SURROGATE;\nimport static java.lang.Character.isSurrogatePair;\nimport static java.lang.Character.toCodePoint;\n\nimport java.nio.ByteBuffer;\n\n/**\n * A set of low-level, high-performance static utility methods related to the UTF-8 character\n * encoding. This class has no dependencies outside of the core JDK libraries.\n *\n * <p>There are several variants of UTF-8. The one implemented by this class is the restricted\n * definition of UTF-8 introduced in Unicode 3.1, which mandates the rejection of \"overlong\" byte\n * sequences as well as rejection of 3-byte surrogate codepoint byte sequences. Note that the UTF-8\n * decoder included in Oracle's JDK has been modified to also reject \"overlong\" byte sequences, but\n * (as of 2011) still accepts 3-byte surrogate codepoint byte sequences.\n *\n * <p>The byte sequences considered valid by this class are exactly those that can be roundtrip\n * converted to Strings and back to bytes using the UTF-8 charset, without loss:\n *\n * <pre>{@code\n * Arrays.equals(bytes, new String(bytes, Internal.UTF_8).getBytes(Internal.UTF_8))\n * }</pre>\n *\n * <p>See the Unicode Standard,</br> Table 3-6. <em>UTF-8 Bit Distribution</em>,</br> Table 3-7.\n * <em>Well Formed UTF-8 Byte Sequences</em>.\n */\npublic final class Utf8Safe extends Utf8 {\n\n  /**\n   * Returns the number of bytes in the UTF-8-encoded form of {@code sequence}. For a string, this\n   * method is equivalent to {@code string.getBytes(UTF_8).length}, but is more efficient in both\n   * time and space.\n   *\n   * @throws IllegalArgumentException if {@code sequence} contains ill-formed UTF-16 (unpaired\n   *     surrogates)\n   */\n  private static int computeEncodedLength(CharSequence sequence) {\n    // Warning to maintainers: this implementation is highly optimized.\n    int utf16Length = sequence.length();\n    int utf8Length = utf16Length;\n    int i = 0;\n\n    // This loop optimizes for pure ASCII.\n    while (i < utf16Length && sequence.charAt(i) < 0x80) {\n      i++;\n    }\n\n    // This loop optimizes for chars less than 0x800.\n    for (; i < utf16Length; i++) {\n      char c = sequence.charAt(i);\n      if (c < 0x800) {\n        utf8Length += ((0x7f - c) >>> 31); // branch free!\n      } else {\n        utf8Length += encodedLengthGeneral(sequence, i);\n        break;\n      }\n    }\n\n    if (utf8Length < utf16Length) {\n      // Necessary and sufficient condition for overflow because of maximum 3x expansion\n      throw new IllegalArgumentException(\n          \"UTF-8 length does not fit in int: \" + (utf8Length + (1L << 32)));\n    }\n    return utf8Length;\n  }\n\n  private static int encodedLengthGeneral(CharSequence sequence, int start) {\n    int utf16Length = sequence.length();\n    int utf8Length = 0;\n    for (int i = start; i < utf16Length; i++) {\n      char c = sequence.charAt(i);\n      if (c < 0x800) {\n        utf8Length += (0x7f - c) >>> 31; // branch free!\n      } else {\n        utf8Length += 2;\n        // jdk7+: if (Character.isSurrogate(c)) {\n        if (Character.MIN_SURROGATE <= c && c <= Character.MAX_SURROGATE) {\n          // Check that we have a well-formed surrogate pair.\n          int cp = Character.codePointAt(sequence, i);\n          if (cp < MIN_SUPPLEMENTARY_CODE_POINT) {\n            throw new Utf8Safe.UnpairedSurrogateException(i, utf16Length);\n          }\n          i++;\n        }\n      }\n    }\n    return utf8Length;\n  }\n\n  public static String decodeUtf8Array(byte[] bytes, int index, int size) {\n    // Bitwise OR combines the sign bits so any negative value fails the check.\n    if ((index | size | bytes.length - index - size) < 0) {\n      throw new ArrayIndexOutOfBoundsException(\n          String.format(\"buffer length=%d, index=%d, size=%d\", bytes.length, index, size));\n    }\n\n    int offset = index;\n    final int limit = offset + size;\n\n    // The longest possible resulting String is the same as the number of input bytes, when it is\n    // all ASCII. For other cases, this over-allocates and we will truncate in the end.\n    char[] resultArr = new char[size];\n    int resultPos = 0;\n\n    // Optimize for 100% ASCII (Hotspot loves small simple top-level loops like this).\n    // This simple loop stops when we encounter a byte >= 0x80 (i.e. non-ASCII).\n    while (offset < limit) {\n      byte b = bytes[offset];\n      if (!DecodeUtil.isOneByte(b)) {\n        break;\n      }\n      offset++;\n      DecodeUtil.handleOneByte(b, resultArr, resultPos++);\n    }\n\n    while (offset < limit) {\n      byte byte1 = bytes[offset++];\n      if (DecodeUtil.isOneByte(byte1)) {\n        DecodeUtil.handleOneByte(byte1, resultArr, resultPos++);\n        // It's common for there to be multiple ASCII characters in a run mixed in, so add an\n        // extra optimized loop to take care of these runs.\n        while (offset < limit) {\n          byte b = bytes[offset];\n          if (!DecodeUtil.isOneByte(b)) {\n            break;\n          }\n          offset++;\n          DecodeUtil.handleOneByte(b, resultArr, resultPos++);\n        }\n      } else if (DecodeUtil.isTwoBytes(byte1)) {\n        if (offset >= limit) {\n          throw new IllegalArgumentException(\"Invalid UTF-8\");\n        }\n        DecodeUtil.handleTwoBytes(byte1, /* byte2 */ bytes[offset++], resultArr, resultPos++);\n      } else if (DecodeUtil.isThreeBytes(byte1)) {\n        if (offset >= limit - 1) {\n          throw new IllegalArgumentException(\"Invalid UTF-8\");\n        }\n        DecodeUtil.handleThreeBytes(\n            byte1,\n            /* byte2 */ bytes[offset++],\n            /* byte3 */ bytes[offset++],\n            resultArr,\n            resultPos++);\n      } else {\n        if (offset >= limit - 2) {\n          throw new IllegalArgumentException(\"Invalid UTF-8\");\n        }\n        DecodeUtil.handleFourBytes(\n            byte1,\n            /* byte2 */ bytes[offset++],\n            /* byte3 */ bytes[offset++],\n            /* byte4 */ bytes[offset++],\n            resultArr,\n            resultPos++);\n        // 4-byte case requires two chars.\n        resultPos++;\n      }\n    }\n\n    return new String(resultArr, 0, resultPos);\n  }\n\n  public static String decodeUtf8Buffer(ByteBuffer buffer, int offset, int length) {\n    // Bitwise OR combines the sign bits so any negative value fails the check.\n    if ((offset | length | buffer.limit() - offset - length) < 0) {\n      throw new ArrayIndexOutOfBoundsException(\n          String.format(\"buffer limit=%d, index=%d, limit=%d\", buffer.limit(), offset, length));\n    }\n\n    final int limit = offset + length;\n\n    // The longest possible resulting String is the same as the number of input bytes, when it is\n    // all ASCII. For other cases, this over-allocates and we will truncate in the end.\n    char[] resultArr = new char[length];\n    int resultPos = 0;\n\n    // Optimize for 100% ASCII (Hotspot loves small simple top-level loops like this).\n    // This simple loop stops when we encounter a byte >= 0x80 (i.e. non-ASCII).\n    while (offset < limit) {\n      byte b = buffer.get(offset);\n      if (!DecodeUtil.isOneByte(b)) {\n        break;\n      }\n      offset++;\n      DecodeUtil.handleOneByte(b, resultArr, resultPos++);\n    }\n\n    while (offset < limit) {\n      byte byte1 = buffer.get(offset++);\n      if (DecodeUtil.isOneByte(byte1)) {\n        DecodeUtil.handleOneByte(byte1, resultArr, resultPos++);\n        // It's common for there to be multiple ASCII characters in a run mixed in, so add an\n        // extra optimized loop to take care of these runs.\n        while (offset < limit) {\n          byte b = buffer.get(offset);\n          if (!DecodeUtil.isOneByte(b)) {\n            break;\n          }\n          offset++;\n          DecodeUtil.handleOneByte(b, resultArr, resultPos++);\n        }\n      } else if (DecodeUtil.isTwoBytes(byte1)) {\n        if (offset >= limit) {\n          throw new IllegalArgumentException(\"Invalid UTF-8\");\n        }\n        DecodeUtil.handleTwoBytes(byte1, /* byte2 */ buffer.get(offset++), resultArr, resultPos++);\n      } else if (DecodeUtil.isThreeBytes(byte1)) {\n        if (offset >= limit - 1) {\n          throw new IllegalArgumentException(\"Invalid UTF-8\");\n        }\n        DecodeUtil.handleThreeBytes(\n            byte1,\n            /* byte2 */ buffer.get(offset++),\n            /* byte3 */ buffer.get(offset++),\n            resultArr,\n            resultPos++);\n      } else {\n        if (offset >= limit - 2) {\n          throw new IllegalArgumentException(\"Invalid UTF-8\");\n        }\n        DecodeUtil.handleFourBytes(\n            byte1,\n            /* byte2 */ buffer.get(offset++),\n            /* byte3 */ buffer.get(offset++),\n            /* byte4 */ buffer.get(offset++),\n            resultArr,\n            resultPos++);\n        // 4-byte case requires two chars.\n        resultPos++;\n      }\n    }\n\n    return new String(resultArr, 0, resultPos);\n  }\n\n  @Override\n  public int encodedLength(CharSequence in) {\n    return computeEncodedLength(in);\n  }\n\n  /**\n   * Decodes the given UTF-8 portion of the {@link ByteBuffer} into a {@link String}.\n   *\n   * @throws IllegalArgumentException if the input is not valid UTF-8.\n   */\n  @Override\n  public String decodeUtf8(ByteBuffer buffer, int offset, int length)\n      throws IllegalArgumentException {\n    if (buffer.hasArray()) {\n      return decodeUtf8Array(buffer.array(), buffer.arrayOffset() + offset, length);\n    } else {\n      return decodeUtf8Buffer(buffer, offset, length);\n    }\n  }\n\n  private static void encodeUtf8Buffer(CharSequence in, ByteBuffer out) {\n    final int inLength = in.length();\n    int outIx = out.position();\n    int inIx = 0;\n\n    // Since ByteBuffer.putXXX() already checks boundaries for us, no need to explicitly check\n    // access. Assume the buffer is big enough and let it handle the out of bounds exception\n    // if it occurs.\n    try {\n      // Designed to take advantage of\n      // https://wikis.oracle.com/display/HotSpotInternals/RangeCheckElimination\n      for (char c; inIx < inLength && (c = in.charAt(inIx)) < 0x80; ++inIx) {\n        out.put(outIx + inIx, (byte) c);\n      }\n      if (inIx == inLength) {\n        // Successfully encoded the entire string.\n        out.position(outIx + inIx);\n        return;\n      }\n\n      outIx += inIx;\n      for (char c; inIx < inLength; ++inIx, ++outIx) {\n        c = in.charAt(inIx);\n        if (c < 0x80) {\n          // One byte (0xxx xxxx)\n          out.put(outIx, (byte) c);\n        } else if (c < 0x800) {\n          // Two bytes (110x xxxx 10xx xxxx)\n\n          // Benchmarks show put performs better than putShort here (for HotSpot).\n          out.put(outIx++, (byte) (0xC0 | (c >>> 6)));\n          out.put(outIx, (byte) (0x80 | (0x3F & c)));\n        } else if (c < MIN_SURROGATE || MAX_SURROGATE < c) {\n          // Three bytes (1110 xxxx 10xx xxxx 10xx xxxx)\n          // Maximum single-char code point is 0xFFFF, 16 bits.\n\n          // Benchmarks show put performs better than putShort here (for HotSpot).\n          out.put(outIx++, (byte) (0xE0 | (c >>> 12)));\n          out.put(outIx++, (byte) (0x80 | (0x3F & (c >>> 6))));\n          out.put(outIx, (byte) (0x80 | (0x3F & c)));\n        } else {\n          // Four bytes (1111 xxxx 10xx xxxx 10xx xxxx 10xx xxxx)\n\n          // Minimum code point represented by a surrogate pair is 0x10000, 17 bits, four UTF-8\n          // bytes\n          final char low;\n          if (inIx + 1 == inLength || !isSurrogatePair(c, (low = in.charAt(++inIx)))) {\n            throw new UnpairedSurrogateException(inIx, inLength);\n          }\n          // TODO(nathanmittler): Consider using putInt() to improve performance.\n          int codePoint = toCodePoint(c, low);\n          out.put(outIx++, (byte) ((0xF << 4) | (codePoint >>> 18)));\n          out.put(outIx++, (byte) (0x80 | (0x3F & (codePoint >>> 12))));\n          out.put(outIx++, (byte) (0x80 | (0x3F & (codePoint >>> 6))));\n          out.put(outIx, (byte) (0x80 | (0x3F & codePoint)));\n        }\n      }\n\n      // Successfully encoded the entire string.\n      out.position(outIx);\n    } catch (IndexOutOfBoundsException e) {\n      // TODO(nathanmittler): Consider making the API throw IndexOutOfBoundsException instead.\n\n      // If we failed in the outer ASCII loop, outIx will not have been updated. In this case,\n      // use inIx to determine the bad write index.\n      int badWriteIndex = out.position() + Math.max(inIx, outIx - out.position() + 1);\n      throw new ArrayIndexOutOfBoundsException(\n          \"Failed writing \" + in.charAt(inIx) + \" at index \" + badWriteIndex);\n    }\n  }\n\n  private static int encodeUtf8Array(CharSequence in, byte[] out, int offset, int length) {\n    int utf16Length = in.length();\n    int j = offset;\n    int i = 0;\n    int limit = offset + length;\n    // Designed to take advantage of\n    // https://wikis.oracle.com/display/HotSpotInternals/RangeCheckElimination\n    for (char c; i < utf16Length && i + j < limit && (c = in.charAt(i)) < 0x80; i++) {\n      out[j + i] = (byte) c;\n    }\n    if (i == utf16Length) {\n      return j + utf16Length;\n    }\n    j += i;\n    for (char c; i < utf16Length; i++) {\n      c = in.charAt(i);\n      if (c < 0x80 && j < limit) {\n        out[j++] = (byte) c;\n      } else if (c < 0x800 && j <= limit - 2) { // 11 bits, two UTF-8 bytes\n        out[j++] = (byte) ((0xF << 6) | (c >>> 6));\n        out[j++] = (byte) (0x80 | (0x3F & c));\n      } else if ((c < Character.MIN_SURROGATE || Character.MAX_SURROGATE < c) && j <= limit - 3) {\n        // Maximum single-char code point is 0xFFFF, 16 bits, three UTF-8 bytes\n        out[j++] = (byte) ((0xF << 5) | (c >>> 12));\n        out[j++] = (byte) (0x80 | (0x3F & (c >>> 6)));\n        out[j++] = (byte) (0x80 | (0x3F & c));\n      } else if (j <= limit - 4) {\n        // Minimum code point represented by a surrogate pair is 0x10000, 17 bits,\n        // four UTF-8 bytes\n        final char low;\n        if (i + 1 == in.length() || !Character.isSurrogatePair(c, (low = in.charAt(++i)))) {\n          throw new UnpairedSurrogateException((i - 1), utf16Length);\n        }\n        int codePoint = Character.toCodePoint(c, low);\n        out[j++] = (byte) ((0xF << 4) | (codePoint >>> 18));\n        out[j++] = (byte) (0x80 | (0x3F & (codePoint >>> 12)));\n        out[j++] = (byte) (0x80 | (0x3F & (codePoint >>> 6)));\n        out[j++] = (byte) (0x80 | (0x3F & codePoint));\n      } else {\n        // If we are surrogates and we're not a surrogate pair, always throw an\n        // UnpairedSurrogateException instead of an ArrayOutOfBoundsException.\n        if ((Character.MIN_SURROGATE <= c && c <= Character.MAX_SURROGATE)\n            && (i + 1 == in.length() || !Character.isSurrogatePair(c, in.charAt(i + 1)))) {\n          throw new UnpairedSurrogateException(i, utf16Length);\n        }\n        throw new ArrayIndexOutOfBoundsException(\"Failed writing \" + c + \" at index \" + j);\n      }\n    }\n    return j;\n  }\n\n  /**\n   * Encodes the given characters to the target {@link ByteBuffer} using UTF-8 encoding.\n   *\n   * <p>Selects an optimal algorithm based on the type of {@link ByteBuffer} (i.e. heap or direct)\n   * and the capabilities of the platform.\n   *\n   * @param in the source string to be encoded\n   * @param out the target buffer to receive the encoded string.\n   */\n  @Override\n  public void encodeUtf8(CharSequence in, ByteBuffer out) {\n    if (out.hasArray()) {\n      int start = out.arrayOffset();\n      int end = encodeUtf8Array(in, out.array(), start + out.position(), out.remaining());\n      out.position(end - start);\n    } else {\n      encodeUtf8Buffer(in, out);\n    }\n  }\n\n  // These UTF-8 handling methods are copied from Guava's Utf8Unsafe class with\n  // a modification to throw a local exception. This exception can be caught\n  // to fallback to more lenient behavior.\n  static class UnpairedSurrogateException extends IllegalArgumentException {\n    UnpairedSurrogateException(int index, int length) {\n      super(\"Unpaired surrogate at index \" + index + \" of \" + length);\n    }\n  }\n}\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/reflection/AdvancedFeatures.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage com.google.flatbuffers.reflection;\n\n/**\n * New schema language features that are not supported by old code generators.\n */\n@SuppressWarnings(\"unused\")\npublic final class AdvancedFeatures {\n  private AdvancedFeatures() { }\n  public static final long AdvancedArrayFeatures = 1L;\n  public static final long AdvancedUnionFeatures = 2L;\n  public static final long OptionalScalars = 4L;\n  public static final long DefaultVectorsAndStrings = 8L;\n}\n\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/reflection/BaseType.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage com.google.flatbuffers.reflection;\n\n@SuppressWarnings(\"unused\")\npublic final class BaseType {\n  private BaseType() { }\n  public static final byte None = 0;\n  public static final byte UType = 1;\n  public static final byte Bool = 2;\n  public static final byte Byte = 3;\n  public static final byte UByte = 4;\n  public static final byte Short = 5;\n  public static final byte UShort = 6;\n  public static final byte Int = 7;\n  public static final byte UInt = 8;\n  public static final byte Long = 9;\n  public static final byte ULong = 10;\n  public static final byte Float = 11;\n  public static final byte Double = 12;\n  public static final byte String = 13;\n  public static final byte Vector = 14;\n  public static final byte Obj = 15;\n  public static final byte Union = 16;\n  public static final byte Array = 17;\n  public static final byte Vector64 = 18;\n  public static final byte MaxBaseType = 19;\n\n  public static final String[] names = { \"None\", \"UType\", \"Bool\", \"Byte\", \"UByte\", \"Short\", \"UShort\", \"Int\", \"UInt\", \"Long\", \"ULong\", \"Float\", \"Double\", \"String\", \"Vector\", \"Obj\", \"Union\", \"Array\", \"Vector64\", \"MaxBaseType\", };\n\n  public static String name(int e) { return names[e]; }\n}\n\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/reflection/Enum.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage com.google.flatbuffers.reflection;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class Enum extends com.google.flatbuffers.Table {\n  public static void ValidateVersion() { Constants.FLATBUFFERS_25_12_19(); }\n  public static Enum getRootAsEnum(ByteBuffer _bb) { return getRootAsEnum(_bb, new Enum()); }\n  public static Enum getRootAsEnum(ByteBuffer _bb, Enum obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public Enum __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public String name() { int o = __offset(4); return o != 0 ? __string(o + bb_pos) : null; }\n  public ByteBuffer nameAsByteBuffer() { return __vector_as_bytebuffer(4, 1); }\n  public ByteBuffer nameInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 4, 1); }\n  public com.google.flatbuffers.reflection.EnumVal values(int j) { return values(new com.google.flatbuffers.reflection.EnumVal(), j); }\n  public com.google.flatbuffers.reflection.EnumVal values(com.google.flatbuffers.reflection.EnumVal obj, int j) { int o = __offset(6); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }\n  public int valuesLength() { int o = __offset(6); return o != 0 ? __vector_len(o) : 0; }\n  public com.google.flatbuffers.reflection.EnumVal valuesByKey(long key) { int o = __offset(6); return o != 0 ? com.google.flatbuffers.reflection.EnumVal.__lookup_by_key(null, __vector(o), key, bb) : null; }\n  public com.google.flatbuffers.reflection.EnumVal valuesByKey(com.google.flatbuffers.reflection.EnumVal obj, long key) { int o = __offset(6); return o != 0 ? com.google.flatbuffers.reflection.EnumVal.__lookup_by_key(obj, __vector(o), key, bb) : null; }\n  public com.google.flatbuffers.reflection.EnumVal.Vector valuesVector() { return valuesVector(new com.google.flatbuffers.reflection.EnumVal.Vector()); }\n  public com.google.flatbuffers.reflection.EnumVal.Vector valuesVector(com.google.flatbuffers.reflection.EnumVal.Vector obj) { int o = __offset(6); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n  public boolean isUnion() { int o = __offset(8); return o != 0 ? 0!=bb.get(o + bb_pos) : false; }\n  public com.google.flatbuffers.reflection.Type underlyingType() { return underlyingType(new com.google.flatbuffers.reflection.Type()); }\n  public com.google.flatbuffers.reflection.Type underlyingType(com.google.flatbuffers.reflection.Type obj) { int o = __offset(10); return o != 0 ? obj.__assign(__indirect(o + bb_pos), bb) : null; }\n  public com.google.flatbuffers.reflection.KeyValue attributes(int j) { return attributes(new com.google.flatbuffers.reflection.KeyValue(), j); }\n  public com.google.flatbuffers.reflection.KeyValue attributes(com.google.flatbuffers.reflection.KeyValue obj, int j) { int o = __offset(12); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }\n  public int attributesLength() { int o = __offset(12); return o != 0 ? __vector_len(o) : 0; }\n  public com.google.flatbuffers.reflection.KeyValue attributesByKey(String key) { int o = __offset(12); return o != 0 ? com.google.flatbuffers.reflection.KeyValue.__lookup_by_key(null, __vector(o), key, bb) : null; }\n  public com.google.flatbuffers.reflection.KeyValue attributesByKey(com.google.flatbuffers.reflection.KeyValue obj, String key) { int o = __offset(12); return o != 0 ? com.google.flatbuffers.reflection.KeyValue.__lookup_by_key(obj, __vector(o), key, bb) : null; }\n  public com.google.flatbuffers.reflection.KeyValue.Vector attributesVector() { return attributesVector(new com.google.flatbuffers.reflection.KeyValue.Vector()); }\n  public com.google.flatbuffers.reflection.KeyValue.Vector attributesVector(com.google.flatbuffers.reflection.KeyValue.Vector obj) { int o = __offset(12); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n  public String documentation(int j) { int o = __offset(14); return o != 0 ? __string(__vector(o) + j * 4) : null; }\n  public int documentationLength() { int o = __offset(14); return o != 0 ? __vector_len(o) : 0; }\n  public StringVector documentationVector() { return documentationVector(new StringVector()); }\n  public StringVector documentationVector(StringVector obj) { int o = __offset(14); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n  /**\n   * File that this Enum is declared in.\n   */\n  public String declarationFile() { int o = __offset(16); return o != 0 ? __string(o + bb_pos) : null; }\n  public ByteBuffer declarationFileAsByteBuffer() { return __vector_as_bytebuffer(16, 1); }\n  public ByteBuffer declarationFileInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 16, 1); }\n\n  public static int createEnum(FlatBufferBuilder builder,\n      int nameOffset,\n      int valuesOffset,\n      boolean isUnion,\n      int underlyingTypeOffset,\n      int attributesOffset,\n      int documentationOffset,\n      int declarationFileOffset) {\n    builder.startTable(7);\n    Enum.addDeclarationFile(builder, declarationFileOffset);\n    Enum.addDocumentation(builder, documentationOffset);\n    Enum.addAttributes(builder, attributesOffset);\n    Enum.addUnderlyingType(builder, underlyingTypeOffset);\n    Enum.addValues(builder, valuesOffset);\n    Enum.addName(builder, nameOffset);\n    Enum.addIsUnion(builder, isUnion);\n    return Enum.endEnum(builder);\n  }\n\n  public static void startEnum(FlatBufferBuilder builder) { builder.startTable(7); }\n  public static void addName(FlatBufferBuilder builder, int nameOffset) { builder.addOffset(nameOffset); builder.slot(0); }\n  public static void addValues(FlatBufferBuilder builder, int valuesOffset) { builder.addOffset(1, valuesOffset, 0); }\n  public static int createValuesVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }\n  public static void startValuesVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static void addIsUnion(FlatBufferBuilder builder, boolean isUnion) { builder.addBoolean(2, isUnion, false); }\n  public static void addUnderlyingType(FlatBufferBuilder builder, int underlyingTypeOffset) { builder.addOffset(3, underlyingTypeOffset, 0); }\n  public static void addAttributes(FlatBufferBuilder builder, int attributesOffset) { builder.addOffset(4, attributesOffset, 0); }\n  public static int createAttributesVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }\n  public static void startAttributesVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static void addDocumentation(FlatBufferBuilder builder, int documentationOffset) { builder.addOffset(5, documentationOffset, 0); }\n  public static int createDocumentationVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }\n  public static void startDocumentationVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static void addDeclarationFile(FlatBufferBuilder builder, int declarationFileOffset) { builder.addOffset(6, declarationFileOffset, 0); }\n  public static int endEnum(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    builder.required(o, 4);  // name\n    builder.required(o, 6);  // values\n    builder.required(o, 10);  // underlying_type\n    return o;\n  }\n\n  @Override\n  protected int keysCompare(Integer o1, Integer o2, ByteBuffer _bb) { return compareStrings(__offset(4, o1, _bb), __offset(4, o2, _bb), _bb); }\n\n  public static Enum __lookup_by_key(Enum obj, int vectorLocation, String key, ByteBuffer bb) {\n    byte[] byteKey = key.getBytes(java.nio.charset.StandardCharsets.UTF_8);\n    int span = bb.getInt(vectorLocation - 4);\n    int start = 0;\n    while (span != 0) {\n      int middle = span / 2;\n      int tableOffset = __indirect(vectorLocation + 4 * (start + middle), bb);\n      int comp = compareStrings(__offset(4, bb.capacity() - tableOffset, bb), byteKey, bb);\n      if (comp > 0) {\n        span = middle;\n      } else if (comp < 0) {\n        middle++;\n        start += middle;\n        span -= middle;\n      } else {\n        return (obj == null ? new Enum() : obj).__assign(tableOffset, bb);\n      }\n    }\n    return null;\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public Enum get(int j) { return get(new Enum(), j); }\n    public Enum get(Enum obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); }\n    public Enum getByKey(String key) {  return __lookup_by_key(null, __vector(), key, bb); }\n    public Enum getByKey(Enum obj, String key) {  return __lookup_by_key(obj, __vector(), key, bb); }\n  }\n}\n\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/reflection/EnumVal.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage com.google.flatbuffers.reflection;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class EnumVal extends com.google.flatbuffers.Table {\n  public static void ValidateVersion() { Constants.FLATBUFFERS_25_12_19(); }\n  public static EnumVal getRootAsEnumVal(ByteBuffer _bb) { return getRootAsEnumVal(_bb, new EnumVal()); }\n  public static EnumVal getRootAsEnumVal(ByteBuffer _bb, EnumVal obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public EnumVal __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public String name() { int o = __offset(4); return o != 0 ? __string(o + bb_pos) : null; }\n  public ByteBuffer nameAsByteBuffer() { return __vector_as_bytebuffer(4, 1); }\n  public ByteBuffer nameInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 4, 1); }\n  public long value() { int o = __offset(6); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }\n  public com.google.flatbuffers.reflection.Type unionType() { return unionType(new com.google.flatbuffers.reflection.Type()); }\n  public com.google.flatbuffers.reflection.Type unionType(com.google.flatbuffers.reflection.Type obj) { int o = __offset(10); return o != 0 ? obj.__assign(__indirect(o + bb_pos), bb) : null; }\n  public String documentation(int j) { int o = __offset(12); return o != 0 ? __string(__vector(o) + j * 4) : null; }\n  public int documentationLength() { int o = __offset(12); return o != 0 ? __vector_len(o) : 0; }\n  public StringVector documentationVector() { return documentationVector(new StringVector()); }\n  public StringVector documentationVector(StringVector obj) { int o = __offset(12); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n  public com.google.flatbuffers.reflection.KeyValue attributes(int j) { return attributes(new com.google.flatbuffers.reflection.KeyValue(), j); }\n  public com.google.flatbuffers.reflection.KeyValue attributes(com.google.flatbuffers.reflection.KeyValue obj, int j) { int o = __offset(14); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }\n  public int attributesLength() { int o = __offset(14); return o != 0 ? __vector_len(o) : 0; }\n  public com.google.flatbuffers.reflection.KeyValue attributesByKey(String key) { int o = __offset(14); return o != 0 ? com.google.flatbuffers.reflection.KeyValue.__lookup_by_key(null, __vector(o), key, bb) : null; }\n  public com.google.flatbuffers.reflection.KeyValue attributesByKey(com.google.flatbuffers.reflection.KeyValue obj, String key) { int o = __offset(14); return o != 0 ? com.google.flatbuffers.reflection.KeyValue.__lookup_by_key(obj, __vector(o), key, bb) : null; }\n  public com.google.flatbuffers.reflection.KeyValue.Vector attributesVector() { return attributesVector(new com.google.flatbuffers.reflection.KeyValue.Vector()); }\n  public com.google.flatbuffers.reflection.KeyValue.Vector attributesVector(com.google.flatbuffers.reflection.KeyValue.Vector obj) { int o = __offset(14); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n\n  public static int createEnumVal(FlatBufferBuilder builder,\n      int nameOffset,\n      long value,\n      int unionTypeOffset,\n      int documentationOffset,\n      int attributesOffset) {\n    builder.startTable(6);\n    EnumVal.addValue(builder, value);\n    EnumVal.addAttributes(builder, attributesOffset);\n    EnumVal.addDocumentation(builder, documentationOffset);\n    EnumVal.addUnionType(builder, unionTypeOffset);\n    EnumVal.addName(builder, nameOffset);\n    return EnumVal.endEnumVal(builder);\n  }\n\n  public static void startEnumVal(FlatBufferBuilder builder) { builder.startTable(6); }\n  public static void addName(FlatBufferBuilder builder, int nameOffset) { builder.addOffset(0, nameOffset, 0); }\n  public static void addValue(FlatBufferBuilder builder, long value) { builder.addLong(value); builder.slot(1); }\n  public static void addUnionType(FlatBufferBuilder builder, int unionTypeOffset) { builder.addOffset(3, unionTypeOffset, 0); }\n  public static void addDocumentation(FlatBufferBuilder builder, int documentationOffset) { builder.addOffset(4, documentationOffset, 0); }\n  public static int createDocumentationVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }\n  public static void startDocumentationVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static void addAttributes(FlatBufferBuilder builder, int attributesOffset) { builder.addOffset(5, attributesOffset, 0); }\n  public static int createAttributesVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }\n  public static void startAttributesVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static int endEnumVal(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    builder.required(o, 4);  // name\n    return o;\n  }\n\n  @Override\n  protected int keysCompare(Integer o1, Integer o2, ByteBuffer _bb) {\n    long val_1 = _bb.getLong(__offset(6, o1, _bb));\n    long val_2 = _bb.getLong(__offset(6, o2, _bb));\n    return val_1 > val_2 ? 1 : val_1 < val_2 ? -1 : 0;\n  }\n\n  public static EnumVal __lookup_by_key(EnumVal obj, int vectorLocation, long key, ByteBuffer bb) {\n    int span = bb.getInt(vectorLocation - 4);\n    int start = 0;\n    while (span != 0) {\n      int middle = span / 2;\n      int tableOffset = __indirect(vectorLocation + 4 * (start + middle), bb);\n      long val = bb.getLong(__offset(6, bb.capacity() - tableOffset, bb));\n      int comp = val > key ? 1 : val < key ? -1 : 0;\n      if (comp > 0) {\n        span = middle;\n      } else if (comp < 0) {\n        middle++;\n        start += middle;\n        span -= middle;\n      } else {\n        return (obj == null ? new EnumVal() : obj).__assign(tableOffset, bb);\n      }\n    }\n    return null;\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public EnumVal get(int j) { return get(new EnumVal(), j); }\n    public EnumVal get(EnumVal obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); }\n    public EnumVal getByKey(long key) {  return __lookup_by_key(null, __vector(), key, bb); }\n    public EnumVal getByKey(EnumVal obj, long key) {  return __lookup_by_key(obj, __vector(), key, bb); }\n  }\n}\n\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/reflection/Field.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage com.google.flatbuffers.reflection;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class Field extends com.google.flatbuffers.Table {\n  public static void ValidateVersion() { Constants.FLATBUFFERS_25_12_19(); }\n  public static Field getRootAsField(ByteBuffer _bb) { return getRootAsField(_bb, new Field()); }\n  public static Field getRootAsField(ByteBuffer _bb, Field obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public Field __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public String name() { int o = __offset(4); return o != 0 ? __string(o + bb_pos) : null; }\n  public ByteBuffer nameAsByteBuffer() { return __vector_as_bytebuffer(4, 1); }\n  public ByteBuffer nameInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 4, 1); }\n  public com.google.flatbuffers.reflection.Type type() { return type(new com.google.flatbuffers.reflection.Type()); }\n  public com.google.flatbuffers.reflection.Type type(com.google.flatbuffers.reflection.Type obj) { int o = __offset(6); return o != 0 ? obj.__assign(__indirect(o + bb_pos), bb) : null; }\n  public int id() { int o = __offset(8); return o != 0 ? bb.getShort(o + bb_pos) & 0xFFFF : 0; }\n  public int offset() { int o = __offset(10); return o != 0 ? bb.getShort(o + bb_pos) & 0xFFFF : 0; }\n  public long defaultInteger() { int o = __offset(12); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }\n  public double defaultReal() { int o = __offset(14); return o != 0 ? bb.getDouble(o + bb_pos) : 0.0; }\n  public boolean deprecated() { int o = __offset(16); return o != 0 ? 0!=bb.get(o + bb_pos) : false; }\n  public boolean required() { int o = __offset(18); return o != 0 ? 0!=bb.get(o + bb_pos) : false; }\n  public boolean key() { int o = __offset(20); return o != 0 ? 0!=bb.get(o + bb_pos) : false; }\n  public com.google.flatbuffers.reflection.KeyValue attributes(int j) { return attributes(new com.google.flatbuffers.reflection.KeyValue(), j); }\n  public com.google.flatbuffers.reflection.KeyValue attributes(com.google.flatbuffers.reflection.KeyValue obj, int j) { int o = __offset(22); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }\n  public int attributesLength() { int o = __offset(22); return o != 0 ? __vector_len(o) : 0; }\n  public com.google.flatbuffers.reflection.KeyValue attributesByKey(String key) { int o = __offset(22); return o != 0 ? com.google.flatbuffers.reflection.KeyValue.__lookup_by_key(null, __vector(o), key, bb) : null; }\n  public com.google.flatbuffers.reflection.KeyValue attributesByKey(com.google.flatbuffers.reflection.KeyValue obj, String key) { int o = __offset(22); return o != 0 ? com.google.flatbuffers.reflection.KeyValue.__lookup_by_key(obj, __vector(o), key, bb) : null; }\n  public com.google.flatbuffers.reflection.KeyValue.Vector attributesVector() { return attributesVector(new com.google.flatbuffers.reflection.KeyValue.Vector()); }\n  public com.google.flatbuffers.reflection.KeyValue.Vector attributesVector(com.google.flatbuffers.reflection.KeyValue.Vector obj) { int o = __offset(22); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n  public String documentation(int j) { int o = __offset(24); return o != 0 ? __string(__vector(o) + j * 4) : null; }\n  public int documentationLength() { int o = __offset(24); return o != 0 ? __vector_len(o) : 0; }\n  public StringVector documentationVector() { return documentationVector(new StringVector()); }\n  public StringVector documentationVector(StringVector obj) { int o = __offset(24); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n  public boolean optional() { int o = __offset(26); return o != 0 ? 0!=bb.get(o + bb_pos) : false; }\n  /**\n   * Number of padding octets to always add after this field. Structs only.\n   */\n  public int padding() { int o = __offset(28); return o != 0 ? bb.getShort(o + bb_pos) & 0xFFFF : 0; }\n  /**\n   * If the field uses 64-bit offsets.\n   */\n  public boolean offset64() { int o = __offset(30); return o != 0 ? 0!=bb.get(o + bb_pos) : false; }\n\n  public static int createField(FlatBufferBuilder builder,\n      int nameOffset,\n      int typeOffset,\n      int id,\n      int offset,\n      long defaultInteger,\n      double defaultReal,\n      boolean deprecated,\n      boolean required,\n      boolean key,\n      int attributesOffset,\n      int documentationOffset,\n      boolean optional,\n      int padding,\n      boolean offset64) {\n    builder.startTable(14);\n    Field.addDefaultReal(builder, defaultReal);\n    Field.addDefaultInteger(builder, defaultInteger);\n    Field.addDocumentation(builder, documentationOffset);\n    Field.addAttributes(builder, attributesOffset);\n    Field.addType(builder, typeOffset);\n    Field.addName(builder, nameOffset);\n    Field.addPadding(builder, padding);\n    Field.addOffset(builder, offset);\n    Field.addId(builder, id);\n    Field.addOffset64(builder, offset64);\n    Field.addOptional(builder, optional);\n    Field.addKey(builder, key);\n    Field.addRequired(builder, required);\n    Field.addDeprecated(builder, deprecated);\n    return Field.endField(builder);\n  }\n\n  public static void startField(FlatBufferBuilder builder) { builder.startTable(14); }\n  public static void addName(FlatBufferBuilder builder, int nameOffset) { builder.addOffset(nameOffset); builder.slot(0); }\n  public static void addType(FlatBufferBuilder builder, int typeOffset) { builder.addOffset(1, typeOffset, 0); }\n  public static void addId(FlatBufferBuilder builder, int id) { builder.addShort(2, (short) id, (short) 0); }\n  public static void addOffset(FlatBufferBuilder builder, int offset) { builder.addShort(3, (short) offset, (short) 0); }\n  public static void addDefaultInteger(FlatBufferBuilder builder, long defaultInteger) { builder.addLong(4, defaultInteger, 0L); }\n  public static void addDefaultReal(FlatBufferBuilder builder, double defaultReal) { builder.addDouble(5, defaultReal, 0.0); }\n  public static void addDeprecated(FlatBufferBuilder builder, boolean deprecated) { builder.addBoolean(6, deprecated, false); }\n  public static void addRequired(FlatBufferBuilder builder, boolean required) { builder.addBoolean(7, required, false); }\n  public static void addKey(FlatBufferBuilder builder, boolean key) { builder.addBoolean(8, key, false); }\n  public static void addAttributes(FlatBufferBuilder builder, int attributesOffset) { builder.addOffset(9, attributesOffset, 0); }\n  public static int createAttributesVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }\n  public static void startAttributesVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static void addDocumentation(FlatBufferBuilder builder, int documentationOffset) { builder.addOffset(10, documentationOffset, 0); }\n  public static int createDocumentationVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }\n  public static void startDocumentationVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static void addOptional(FlatBufferBuilder builder, boolean optional) { builder.addBoolean(11, optional, false); }\n  public static void addPadding(FlatBufferBuilder builder, int padding) { builder.addShort(12, (short) padding, (short) 0); }\n  public static void addOffset64(FlatBufferBuilder builder, boolean offset64) { builder.addBoolean(13, offset64, false); }\n  public static int endField(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    builder.required(o, 4);  // name\n    builder.required(o, 6);  // type\n    return o;\n  }\n\n  @Override\n  protected int keysCompare(Integer o1, Integer o2, ByteBuffer _bb) { return compareStrings(__offset(4, o1, _bb), __offset(4, o2, _bb), _bb); }\n\n  public static Field __lookup_by_key(Field obj, int vectorLocation, String key, ByteBuffer bb) {\n    byte[] byteKey = key.getBytes(java.nio.charset.StandardCharsets.UTF_8);\n    int span = bb.getInt(vectorLocation - 4);\n    int start = 0;\n    while (span != 0) {\n      int middle = span / 2;\n      int tableOffset = __indirect(vectorLocation + 4 * (start + middle), bb);\n      int comp = compareStrings(__offset(4, bb.capacity() - tableOffset, bb), byteKey, bb);\n      if (comp > 0) {\n        span = middle;\n      } else if (comp < 0) {\n        middle++;\n        start += middle;\n        span -= middle;\n      } else {\n        return (obj == null ? new Field() : obj).__assign(tableOffset, bb);\n      }\n    }\n    return null;\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public Field get(int j) { return get(new Field(), j); }\n    public Field get(Field obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); }\n    public Field getByKey(String key) {  return __lookup_by_key(null, __vector(), key, bb); }\n    public Field getByKey(Field obj, String key) {  return __lookup_by_key(obj, __vector(), key, bb); }\n  }\n}\n\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/reflection/KeyValue.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage com.google.flatbuffers.reflection;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class KeyValue extends com.google.flatbuffers.Table {\n  public static void ValidateVersion() { Constants.FLATBUFFERS_25_12_19(); }\n  public static KeyValue getRootAsKeyValue(ByteBuffer _bb) { return getRootAsKeyValue(_bb, new KeyValue()); }\n  public static KeyValue getRootAsKeyValue(ByteBuffer _bb, KeyValue obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public KeyValue __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public String key() { int o = __offset(4); return o != 0 ? __string(o + bb_pos) : null; }\n  public ByteBuffer keyAsByteBuffer() { return __vector_as_bytebuffer(4, 1); }\n  public ByteBuffer keyInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 4, 1); }\n  public String value() { int o = __offset(6); return o != 0 ? __string(o + bb_pos) : null; }\n  public ByteBuffer valueAsByteBuffer() { return __vector_as_bytebuffer(6, 1); }\n  public ByteBuffer valueInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 6, 1); }\n\n  public static int createKeyValue(FlatBufferBuilder builder,\n      int keyOffset,\n      int valueOffset) {\n    builder.startTable(2);\n    KeyValue.addValue(builder, valueOffset);\n    KeyValue.addKey(builder, keyOffset);\n    return KeyValue.endKeyValue(builder);\n  }\n\n  public static void startKeyValue(FlatBufferBuilder builder) { builder.startTable(2); }\n  public static void addKey(FlatBufferBuilder builder, int keyOffset) { builder.addOffset(keyOffset); builder.slot(0); }\n  public static void addValue(FlatBufferBuilder builder, int valueOffset) { builder.addOffset(1, valueOffset, 0); }\n  public static int endKeyValue(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    builder.required(o, 4);  // key\n    return o;\n  }\n\n  @Override\n  protected int keysCompare(Integer o1, Integer o2, ByteBuffer _bb) { return compareStrings(__offset(4, o1, _bb), __offset(4, o2, _bb), _bb); }\n\n  public static KeyValue __lookup_by_key(KeyValue obj, int vectorLocation, String key, ByteBuffer bb) {\n    byte[] byteKey = key.getBytes(java.nio.charset.StandardCharsets.UTF_8);\n    int span = bb.getInt(vectorLocation - 4);\n    int start = 0;\n    while (span != 0) {\n      int middle = span / 2;\n      int tableOffset = __indirect(vectorLocation + 4 * (start + middle), bb);\n      int comp = compareStrings(__offset(4, bb.capacity() - tableOffset, bb), byteKey, bb);\n      if (comp > 0) {\n        span = middle;\n      } else if (comp < 0) {\n        middle++;\n        start += middle;\n        span -= middle;\n      } else {\n        return (obj == null ? new KeyValue() : obj).__assign(tableOffset, bb);\n      }\n    }\n    return null;\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public KeyValue get(int j) { return get(new KeyValue(), j); }\n    public KeyValue get(KeyValue obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); }\n    public KeyValue getByKey(String key) {  return __lookup_by_key(null, __vector(), key, bb); }\n    public KeyValue getByKey(KeyValue obj, String key) {  return __lookup_by_key(obj, __vector(), key, bb); }\n  }\n}\n\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/reflection/Object.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage com.google.flatbuffers.reflection;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class Object extends com.google.flatbuffers.Table {\n  public static void ValidateVersion() { Constants.FLATBUFFERS_25_12_19(); }\n  public static Object getRootAsObject(ByteBuffer _bb) { return getRootAsObject(_bb, new Object()); }\n  public static Object getRootAsObject(ByteBuffer _bb, Object obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public Object __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public String name() { int o = __offset(4); return o != 0 ? __string(o + bb_pos) : null; }\n  public ByteBuffer nameAsByteBuffer() { return __vector_as_bytebuffer(4, 1); }\n  public ByteBuffer nameInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 4, 1); }\n  public com.google.flatbuffers.reflection.Field fields(int j) { return fields(new com.google.flatbuffers.reflection.Field(), j); }\n  public com.google.flatbuffers.reflection.Field fields(com.google.flatbuffers.reflection.Field obj, int j) { int o = __offset(6); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }\n  public int fieldsLength() { int o = __offset(6); return o != 0 ? __vector_len(o) : 0; }\n  public com.google.flatbuffers.reflection.Field fieldsByKey(String key) { int o = __offset(6); return o != 0 ? com.google.flatbuffers.reflection.Field.__lookup_by_key(null, __vector(o), key, bb) : null; }\n  public com.google.flatbuffers.reflection.Field fieldsByKey(com.google.flatbuffers.reflection.Field obj, String key) { int o = __offset(6); return o != 0 ? com.google.flatbuffers.reflection.Field.__lookup_by_key(obj, __vector(o), key, bb) : null; }\n  public com.google.flatbuffers.reflection.Field.Vector fieldsVector() { return fieldsVector(new com.google.flatbuffers.reflection.Field.Vector()); }\n  public com.google.flatbuffers.reflection.Field.Vector fieldsVector(com.google.flatbuffers.reflection.Field.Vector obj) { int o = __offset(6); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n  public boolean isStruct() { int o = __offset(8); return o != 0 ? 0!=bb.get(o + bb_pos) : false; }\n  public int minalign() { int o = __offset(10); return o != 0 ? bb.getInt(o + bb_pos) : 0; }\n  public int bytesize() { int o = __offset(12); return o != 0 ? bb.getInt(o + bb_pos) : 0; }\n  public com.google.flatbuffers.reflection.KeyValue attributes(int j) { return attributes(new com.google.flatbuffers.reflection.KeyValue(), j); }\n  public com.google.flatbuffers.reflection.KeyValue attributes(com.google.flatbuffers.reflection.KeyValue obj, int j) { int o = __offset(14); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }\n  public int attributesLength() { int o = __offset(14); return o != 0 ? __vector_len(o) : 0; }\n  public com.google.flatbuffers.reflection.KeyValue attributesByKey(String key) { int o = __offset(14); return o != 0 ? com.google.flatbuffers.reflection.KeyValue.__lookup_by_key(null, __vector(o), key, bb) : null; }\n  public com.google.flatbuffers.reflection.KeyValue attributesByKey(com.google.flatbuffers.reflection.KeyValue obj, String key) { int o = __offset(14); return o != 0 ? com.google.flatbuffers.reflection.KeyValue.__lookup_by_key(obj, __vector(o), key, bb) : null; }\n  public com.google.flatbuffers.reflection.KeyValue.Vector attributesVector() { return attributesVector(new com.google.flatbuffers.reflection.KeyValue.Vector()); }\n  public com.google.flatbuffers.reflection.KeyValue.Vector attributesVector(com.google.flatbuffers.reflection.KeyValue.Vector obj) { int o = __offset(14); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n  public String documentation(int j) { int o = __offset(16); return o != 0 ? __string(__vector(o) + j * 4) : null; }\n  public int documentationLength() { int o = __offset(16); return o != 0 ? __vector_len(o) : 0; }\n  public StringVector documentationVector() { return documentationVector(new StringVector()); }\n  public StringVector documentationVector(StringVector obj) { int o = __offset(16); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n  /**\n   * File that this Object is declared in.\n   */\n  public String declarationFile() { int o = __offset(18); return o != 0 ? __string(o + bb_pos) : null; }\n  public ByteBuffer declarationFileAsByteBuffer() { return __vector_as_bytebuffer(18, 1); }\n  public ByteBuffer declarationFileInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 18, 1); }\n\n  public static int createObject(FlatBufferBuilder builder,\n      int nameOffset,\n      int fieldsOffset,\n      boolean isStruct,\n      int minalign,\n      int bytesize,\n      int attributesOffset,\n      int documentationOffset,\n      int declarationFileOffset) {\n    builder.startTable(8);\n    Object.addDeclarationFile(builder, declarationFileOffset);\n    Object.addDocumentation(builder, documentationOffset);\n    Object.addAttributes(builder, attributesOffset);\n    Object.addBytesize(builder, bytesize);\n    Object.addMinalign(builder, minalign);\n    Object.addFields(builder, fieldsOffset);\n    Object.addName(builder, nameOffset);\n    Object.addIsStruct(builder, isStruct);\n    return Object.endObject(builder);\n  }\n\n  public static void startObject(FlatBufferBuilder builder) { builder.startTable(8); }\n  public static void addName(FlatBufferBuilder builder, int nameOffset) { builder.addOffset(nameOffset); builder.slot(0); }\n  public static void addFields(FlatBufferBuilder builder, int fieldsOffset) { builder.addOffset(1, fieldsOffset, 0); }\n  public static int createFieldsVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }\n  public static void startFieldsVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static void addIsStruct(FlatBufferBuilder builder, boolean isStruct) { builder.addBoolean(2, isStruct, false); }\n  public static void addMinalign(FlatBufferBuilder builder, int minalign) { builder.addInt(3, minalign, 0); }\n  public static void addBytesize(FlatBufferBuilder builder, int bytesize) { builder.addInt(4, bytesize, 0); }\n  public static void addAttributes(FlatBufferBuilder builder, int attributesOffset) { builder.addOffset(5, attributesOffset, 0); }\n  public static int createAttributesVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }\n  public static void startAttributesVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static void addDocumentation(FlatBufferBuilder builder, int documentationOffset) { builder.addOffset(6, documentationOffset, 0); }\n  public static int createDocumentationVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }\n  public static void startDocumentationVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static void addDeclarationFile(FlatBufferBuilder builder, int declarationFileOffset) { builder.addOffset(7, declarationFileOffset, 0); }\n  public static int endObject(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    builder.required(o, 4);  // name\n    builder.required(o, 6);  // fields\n    return o;\n  }\n\n  @Override\n  protected int keysCompare(Integer o1, Integer o2, ByteBuffer _bb) { return compareStrings(__offset(4, o1, _bb), __offset(4, o2, _bb), _bb); }\n\n  public static Object __lookup_by_key(Object obj, int vectorLocation, String key, ByteBuffer bb) {\n    byte[] byteKey = key.getBytes(java.nio.charset.StandardCharsets.UTF_8);\n    int span = bb.getInt(vectorLocation - 4);\n    int start = 0;\n    while (span != 0) {\n      int middle = span / 2;\n      int tableOffset = __indirect(vectorLocation + 4 * (start + middle), bb);\n      int comp = compareStrings(__offset(4, bb.capacity() - tableOffset, bb), byteKey, bb);\n      if (comp > 0) {\n        span = middle;\n      } else if (comp < 0) {\n        middle++;\n        start += middle;\n        span -= middle;\n      } else {\n        return (obj == null ? new Object() : obj).__assign(tableOffset, bb);\n      }\n    }\n    return null;\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public Object get(int j) { return get(new Object(), j); }\n    public Object get(Object obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); }\n    public Object getByKey(String key) {  return __lookup_by_key(null, __vector(), key, bb); }\n    public Object getByKey(Object obj, String key) {  return __lookup_by_key(obj, __vector(), key, bb); }\n  }\n}\n\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/reflection/RPCCall.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage com.google.flatbuffers.reflection;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class RPCCall extends com.google.flatbuffers.Table {\n  public static void ValidateVersion() { Constants.FLATBUFFERS_25_12_19(); }\n  public static RPCCall getRootAsRPCCall(ByteBuffer _bb) { return getRootAsRPCCall(_bb, new RPCCall()); }\n  public static RPCCall getRootAsRPCCall(ByteBuffer _bb, RPCCall obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public RPCCall __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public String name() { int o = __offset(4); return o != 0 ? __string(o + bb_pos) : null; }\n  public ByteBuffer nameAsByteBuffer() { return __vector_as_bytebuffer(4, 1); }\n  public ByteBuffer nameInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 4, 1); }\n  public com.google.flatbuffers.reflection.Object request() { return request(new com.google.flatbuffers.reflection.Object()); }\n  public com.google.flatbuffers.reflection.Object request(com.google.flatbuffers.reflection.Object obj) { int o = __offset(6); return o != 0 ? obj.__assign(__indirect(o + bb_pos), bb) : null; }\n  public com.google.flatbuffers.reflection.Object response() { return response(new com.google.flatbuffers.reflection.Object()); }\n  public com.google.flatbuffers.reflection.Object response(com.google.flatbuffers.reflection.Object obj) { int o = __offset(8); return o != 0 ? obj.__assign(__indirect(o + bb_pos), bb) : null; }\n  public com.google.flatbuffers.reflection.KeyValue attributes(int j) { return attributes(new com.google.flatbuffers.reflection.KeyValue(), j); }\n  public com.google.flatbuffers.reflection.KeyValue attributes(com.google.flatbuffers.reflection.KeyValue obj, int j) { int o = __offset(10); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }\n  public int attributesLength() { int o = __offset(10); return o != 0 ? __vector_len(o) : 0; }\n  public com.google.flatbuffers.reflection.KeyValue attributesByKey(String key) { int o = __offset(10); return o != 0 ? com.google.flatbuffers.reflection.KeyValue.__lookup_by_key(null, __vector(o), key, bb) : null; }\n  public com.google.flatbuffers.reflection.KeyValue attributesByKey(com.google.flatbuffers.reflection.KeyValue obj, String key) { int o = __offset(10); return o != 0 ? com.google.flatbuffers.reflection.KeyValue.__lookup_by_key(obj, __vector(o), key, bb) : null; }\n  public com.google.flatbuffers.reflection.KeyValue.Vector attributesVector() { return attributesVector(new com.google.flatbuffers.reflection.KeyValue.Vector()); }\n  public com.google.flatbuffers.reflection.KeyValue.Vector attributesVector(com.google.flatbuffers.reflection.KeyValue.Vector obj) { int o = __offset(10); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n  public String documentation(int j) { int o = __offset(12); return o != 0 ? __string(__vector(o) + j * 4) : null; }\n  public int documentationLength() { int o = __offset(12); return o != 0 ? __vector_len(o) : 0; }\n  public StringVector documentationVector() { return documentationVector(new StringVector()); }\n  public StringVector documentationVector(StringVector obj) { int o = __offset(12); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n\n  public static int createRPCCall(FlatBufferBuilder builder,\n      int nameOffset,\n      int requestOffset,\n      int responseOffset,\n      int attributesOffset,\n      int documentationOffset) {\n    builder.startTable(5);\n    RPCCall.addDocumentation(builder, documentationOffset);\n    RPCCall.addAttributes(builder, attributesOffset);\n    RPCCall.addResponse(builder, responseOffset);\n    RPCCall.addRequest(builder, requestOffset);\n    RPCCall.addName(builder, nameOffset);\n    return RPCCall.endRPCCall(builder);\n  }\n\n  public static void startRPCCall(FlatBufferBuilder builder) { builder.startTable(5); }\n  public static void addName(FlatBufferBuilder builder, int nameOffset) { builder.addOffset(nameOffset); builder.slot(0); }\n  public static void addRequest(FlatBufferBuilder builder, int requestOffset) { builder.addOffset(1, requestOffset, 0); }\n  public static void addResponse(FlatBufferBuilder builder, int responseOffset) { builder.addOffset(2, responseOffset, 0); }\n  public static void addAttributes(FlatBufferBuilder builder, int attributesOffset) { builder.addOffset(3, attributesOffset, 0); }\n  public static int createAttributesVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }\n  public static void startAttributesVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static void addDocumentation(FlatBufferBuilder builder, int documentationOffset) { builder.addOffset(4, documentationOffset, 0); }\n  public static int createDocumentationVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }\n  public static void startDocumentationVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static int endRPCCall(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    builder.required(o, 4);  // name\n    builder.required(o, 6);  // request\n    builder.required(o, 8);  // response\n    return o;\n  }\n\n  @Override\n  protected int keysCompare(Integer o1, Integer o2, ByteBuffer _bb) { return compareStrings(__offset(4, o1, _bb), __offset(4, o2, _bb), _bb); }\n\n  public static RPCCall __lookup_by_key(RPCCall obj, int vectorLocation, String key, ByteBuffer bb) {\n    byte[] byteKey = key.getBytes(java.nio.charset.StandardCharsets.UTF_8);\n    int span = bb.getInt(vectorLocation - 4);\n    int start = 0;\n    while (span != 0) {\n      int middle = span / 2;\n      int tableOffset = __indirect(vectorLocation + 4 * (start + middle), bb);\n      int comp = compareStrings(__offset(4, bb.capacity() - tableOffset, bb), byteKey, bb);\n      if (comp > 0) {\n        span = middle;\n      } else if (comp < 0) {\n        middle++;\n        start += middle;\n        span -= middle;\n      } else {\n        return (obj == null ? new RPCCall() : obj).__assign(tableOffset, bb);\n      }\n    }\n    return null;\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public RPCCall get(int j) { return get(new RPCCall(), j); }\n    public RPCCall get(RPCCall obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); }\n    public RPCCall getByKey(String key) {  return __lookup_by_key(null, __vector(), key, bb); }\n    public RPCCall getByKey(RPCCall obj, String key) {  return __lookup_by_key(obj, __vector(), key, bb); }\n  }\n}\n\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/reflection/Schema.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage com.google.flatbuffers.reflection;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class Schema extends com.google.flatbuffers.Table {\n  public static void ValidateVersion() { Constants.FLATBUFFERS_25_12_19(); }\n  public static Schema getRootAsSchema(ByteBuffer _bb) { return getRootAsSchema(_bb, new Schema()); }\n  public static Schema getRootAsSchema(ByteBuffer _bb, Schema obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }\n  public static boolean SchemaBufferHasIdentifier(ByteBuffer _bb) { return __has_identifier(_bb, \"BFBS\"); }\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public Schema __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public com.google.flatbuffers.reflection.Object objects(int j) { return objects(new com.google.flatbuffers.reflection.Object(), j); }\n  public com.google.flatbuffers.reflection.Object objects(com.google.flatbuffers.reflection.Object obj, int j) { int o = __offset(4); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }\n  public int objectsLength() { int o = __offset(4); return o != 0 ? __vector_len(o) : 0; }\n  public com.google.flatbuffers.reflection.Object objectsByKey(String key) { int o = __offset(4); return o != 0 ? com.google.flatbuffers.reflection.Object.__lookup_by_key(null, __vector(o), key, bb) : null; }\n  public com.google.flatbuffers.reflection.Object objectsByKey(com.google.flatbuffers.reflection.Object obj, String key) { int o = __offset(4); return o != 0 ? com.google.flatbuffers.reflection.Object.__lookup_by_key(obj, __vector(o), key, bb) : null; }\n  public com.google.flatbuffers.reflection.Object.Vector objectsVector() { return objectsVector(new com.google.flatbuffers.reflection.Object.Vector()); }\n  public com.google.flatbuffers.reflection.Object.Vector objectsVector(com.google.flatbuffers.reflection.Object.Vector obj) { int o = __offset(4); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n  public com.google.flatbuffers.reflection.Enum enums(int j) { return enums(new com.google.flatbuffers.reflection.Enum(), j); }\n  public com.google.flatbuffers.reflection.Enum enums(com.google.flatbuffers.reflection.Enum obj, int j) { int o = __offset(6); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }\n  public int enumsLength() { int o = __offset(6); return o != 0 ? __vector_len(o) : 0; }\n  public com.google.flatbuffers.reflection.Enum enumsByKey(String key) { int o = __offset(6); return o != 0 ? com.google.flatbuffers.reflection.Enum.__lookup_by_key(null, __vector(o), key, bb) : null; }\n  public com.google.flatbuffers.reflection.Enum enumsByKey(com.google.flatbuffers.reflection.Enum obj, String key) { int o = __offset(6); return o != 0 ? com.google.flatbuffers.reflection.Enum.__lookup_by_key(obj, __vector(o), key, bb) : null; }\n  public com.google.flatbuffers.reflection.Enum.Vector enumsVector() { return enumsVector(new com.google.flatbuffers.reflection.Enum.Vector()); }\n  public com.google.flatbuffers.reflection.Enum.Vector enumsVector(com.google.flatbuffers.reflection.Enum.Vector obj) { int o = __offset(6); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n  public String fileIdent() { int o = __offset(8); return o != 0 ? __string(o + bb_pos) : null; }\n  public ByteBuffer fileIdentAsByteBuffer() { return __vector_as_bytebuffer(8, 1); }\n  public ByteBuffer fileIdentInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 8, 1); }\n  public String fileExt() { int o = __offset(10); return o != 0 ? __string(o + bb_pos) : null; }\n  public ByteBuffer fileExtAsByteBuffer() { return __vector_as_bytebuffer(10, 1); }\n  public ByteBuffer fileExtInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 10, 1); }\n  public com.google.flatbuffers.reflection.Object rootTable() { return rootTable(new com.google.flatbuffers.reflection.Object()); }\n  public com.google.flatbuffers.reflection.Object rootTable(com.google.flatbuffers.reflection.Object obj) { int o = __offset(12); return o != 0 ? obj.__assign(__indirect(o + bb_pos), bb) : null; }\n  public com.google.flatbuffers.reflection.Service services(int j) { return services(new com.google.flatbuffers.reflection.Service(), j); }\n  public com.google.flatbuffers.reflection.Service services(com.google.flatbuffers.reflection.Service obj, int j) { int o = __offset(14); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }\n  public int servicesLength() { int o = __offset(14); return o != 0 ? __vector_len(o) : 0; }\n  public com.google.flatbuffers.reflection.Service servicesByKey(String key) { int o = __offset(14); return o != 0 ? com.google.flatbuffers.reflection.Service.__lookup_by_key(null, __vector(o), key, bb) : null; }\n  public com.google.flatbuffers.reflection.Service servicesByKey(com.google.flatbuffers.reflection.Service obj, String key) { int o = __offset(14); return o != 0 ? com.google.flatbuffers.reflection.Service.__lookup_by_key(obj, __vector(o), key, bb) : null; }\n  public com.google.flatbuffers.reflection.Service.Vector servicesVector() { return servicesVector(new com.google.flatbuffers.reflection.Service.Vector()); }\n  public com.google.flatbuffers.reflection.Service.Vector servicesVector(com.google.flatbuffers.reflection.Service.Vector obj) { int o = __offset(14); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n  public long advancedFeatures() { int o = __offset(16); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }\n  /**\n   * All the files used in this compilation. Files are relative to where\n   * flatc was invoked.\n   */\n  public com.google.flatbuffers.reflection.SchemaFile fbsFiles(int j) { return fbsFiles(new com.google.flatbuffers.reflection.SchemaFile(), j); }\n  public com.google.flatbuffers.reflection.SchemaFile fbsFiles(com.google.flatbuffers.reflection.SchemaFile obj, int j) { int o = __offset(18); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }\n  public int fbsFilesLength() { int o = __offset(18); return o != 0 ? __vector_len(o) : 0; }\n  public com.google.flatbuffers.reflection.SchemaFile fbsFilesByKey(String key) { int o = __offset(18); return o != 0 ? com.google.flatbuffers.reflection.SchemaFile.__lookup_by_key(null, __vector(o), key, bb) : null; }\n  public com.google.flatbuffers.reflection.SchemaFile fbsFilesByKey(com.google.flatbuffers.reflection.SchemaFile obj, String key) { int o = __offset(18); return o != 0 ? com.google.flatbuffers.reflection.SchemaFile.__lookup_by_key(obj, __vector(o), key, bb) : null; }\n  public com.google.flatbuffers.reflection.SchemaFile.Vector fbsFilesVector() { return fbsFilesVector(new com.google.flatbuffers.reflection.SchemaFile.Vector()); }\n  public com.google.flatbuffers.reflection.SchemaFile.Vector fbsFilesVector(com.google.flatbuffers.reflection.SchemaFile.Vector obj) { int o = __offset(18); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n\n  public static int createSchema(FlatBufferBuilder builder,\n      int objectsOffset,\n      int enumsOffset,\n      int fileIdentOffset,\n      int fileExtOffset,\n      int rootTableOffset,\n      int servicesOffset,\n      long advancedFeatures,\n      int fbsFilesOffset) {\n    builder.startTable(8);\n    Schema.addAdvancedFeatures(builder, advancedFeatures);\n    Schema.addFbsFiles(builder, fbsFilesOffset);\n    Schema.addServices(builder, servicesOffset);\n    Schema.addRootTable(builder, rootTableOffset);\n    Schema.addFileExt(builder, fileExtOffset);\n    Schema.addFileIdent(builder, fileIdentOffset);\n    Schema.addEnums(builder, enumsOffset);\n    Schema.addObjects(builder, objectsOffset);\n    return Schema.endSchema(builder);\n  }\n\n  public static void startSchema(FlatBufferBuilder builder) { builder.startTable(8); }\n  public static void addObjects(FlatBufferBuilder builder, int objectsOffset) { builder.addOffset(0, objectsOffset, 0); }\n  public static int createObjectsVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }\n  public static void startObjectsVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static void addEnums(FlatBufferBuilder builder, int enumsOffset) { builder.addOffset(1, enumsOffset, 0); }\n  public static int createEnumsVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }\n  public static void startEnumsVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static void addFileIdent(FlatBufferBuilder builder, int fileIdentOffset) { builder.addOffset(2, fileIdentOffset, 0); }\n  public static void addFileExt(FlatBufferBuilder builder, int fileExtOffset) { builder.addOffset(3, fileExtOffset, 0); }\n  public static void addRootTable(FlatBufferBuilder builder, int rootTableOffset) { builder.addOffset(4, rootTableOffset, 0); }\n  public static void addServices(FlatBufferBuilder builder, int servicesOffset) { builder.addOffset(5, servicesOffset, 0); }\n  public static int createServicesVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }\n  public static void startServicesVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static void addAdvancedFeatures(FlatBufferBuilder builder, long advancedFeatures) { builder.addLong(6, advancedFeatures, 0L); }\n  public static void addFbsFiles(FlatBufferBuilder builder, int fbsFilesOffset) { builder.addOffset(7, fbsFilesOffset, 0); }\n  public static int createFbsFilesVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }\n  public static void startFbsFilesVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static int endSchema(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    builder.required(o, 4);  // objects\n    builder.required(o, 6);  // enums\n    return o;\n  }\n  public static void finishSchemaBuffer(FlatBufferBuilder builder, int offset) { builder.finish(offset, \"BFBS\"); }\n  public static void finishSizePrefixedSchemaBuffer(FlatBufferBuilder builder, int offset) { builder.finishSizePrefixed(offset, \"BFBS\"); }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public Schema get(int j) { return get(new Schema(), j); }\n    public Schema get(Schema obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); }\n  }\n}\n\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/reflection/SchemaFile.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage com.google.flatbuffers.reflection;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n/**\n * File specific information.\n * Symbols declared within a file may be recovered by iterating over all\n * symbols and examining the `declaration_file` field.\n */\n@SuppressWarnings(\"unused\")\npublic final class SchemaFile extends com.google.flatbuffers.Table {\n  public static void ValidateVersion() { Constants.FLATBUFFERS_25_12_19(); }\n  public static SchemaFile getRootAsSchemaFile(ByteBuffer _bb) { return getRootAsSchemaFile(_bb, new SchemaFile()); }\n  public static SchemaFile getRootAsSchemaFile(ByteBuffer _bb, SchemaFile obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public SchemaFile __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  /**\n   * Filename, relative to project root.\n   */\n  public String filename() { int o = __offset(4); return o != 0 ? __string(o + bb_pos) : null; }\n  public ByteBuffer filenameAsByteBuffer() { return __vector_as_bytebuffer(4, 1); }\n  public ByteBuffer filenameInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 4, 1); }\n  /**\n   * Names of included files, relative to project root.\n   */\n  public String includedFilenames(int j) { int o = __offset(6); return o != 0 ? __string(__vector(o) + j * 4) : null; }\n  public int includedFilenamesLength() { int o = __offset(6); return o != 0 ? __vector_len(o) : 0; }\n  public StringVector includedFilenamesVector() { return includedFilenamesVector(new StringVector()); }\n  public StringVector includedFilenamesVector(StringVector obj) { int o = __offset(6); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n\n  public static int createSchemaFile(FlatBufferBuilder builder,\n      int filenameOffset,\n      int includedFilenamesOffset) {\n    builder.startTable(2);\n    SchemaFile.addIncludedFilenames(builder, includedFilenamesOffset);\n    SchemaFile.addFilename(builder, filenameOffset);\n    return SchemaFile.endSchemaFile(builder);\n  }\n\n  public static void startSchemaFile(FlatBufferBuilder builder) { builder.startTable(2); }\n  public static void addFilename(FlatBufferBuilder builder, int filenameOffset) { builder.addOffset(filenameOffset); builder.slot(0); }\n  public static void addIncludedFilenames(FlatBufferBuilder builder, int includedFilenamesOffset) { builder.addOffset(1, includedFilenamesOffset, 0); }\n  public static int createIncludedFilenamesVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }\n  public static void startIncludedFilenamesVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static int endSchemaFile(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    builder.required(o, 4);  // filename\n    return o;\n  }\n\n  @Override\n  protected int keysCompare(Integer o1, Integer o2, ByteBuffer _bb) { return compareStrings(__offset(4, o1, _bb), __offset(4, o2, _bb), _bb); }\n\n  public static SchemaFile __lookup_by_key(SchemaFile obj, int vectorLocation, String key, ByteBuffer bb) {\n    byte[] byteKey = key.getBytes(java.nio.charset.StandardCharsets.UTF_8);\n    int span = bb.getInt(vectorLocation - 4);\n    int start = 0;\n    while (span != 0) {\n      int middle = span / 2;\n      int tableOffset = __indirect(vectorLocation + 4 * (start + middle), bb);\n      int comp = compareStrings(__offset(4, bb.capacity() - tableOffset, bb), byteKey, bb);\n      if (comp > 0) {\n        span = middle;\n      } else if (comp < 0) {\n        middle++;\n        start += middle;\n        span -= middle;\n      } else {\n        return (obj == null ? new SchemaFile() : obj).__assign(tableOffset, bb);\n      }\n    }\n    return null;\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public SchemaFile get(int j) { return get(new SchemaFile(), j); }\n    public SchemaFile get(SchemaFile obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); }\n    public SchemaFile getByKey(String key) {  return __lookup_by_key(null, __vector(), key, bb); }\n    public SchemaFile getByKey(SchemaFile obj, String key) {  return __lookup_by_key(obj, __vector(), key, bb); }\n  }\n}\n\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/reflection/Service.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage com.google.flatbuffers.reflection;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class Service extends com.google.flatbuffers.Table {\n  public static void ValidateVersion() { Constants.FLATBUFFERS_25_12_19(); }\n  public static Service getRootAsService(ByteBuffer _bb) { return getRootAsService(_bb, new Service()); }\n  public static Service getRootAsService(ByteBuffer _bb, Service obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public Service __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public String name() { int o = __offset(4); return o != 0 ? __string(o + bb_pos) : null; }\n  public ByteBuffer nameAsByteBuffer() { return __vector_as_bytebuffer(4, 1); }\n  public ByteBuffer nameInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 4, 1); }\n  public com.google.flatbuffers.reflection.RPCCall calls(int j) { return calls(new com.google.flatbuffers.reflection.RPCCall(), j); }\n  public com.google.flatbuffers.reflection.RPCCall calls(com.google.flatbuffers.reflection.RPCCall obj, int j) { int o = __offset(6); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }\n  public int callsLength() { int o = __offset(6); return o != 0 ? __vector_len(o) : 0; }\n  public com.google.flatbuffers.reflection.RPCCall callsByKey(String key) { int o = __offset(6); return o != 0 ? com.google.flatbuffers.reflection.RPCCall.__lookup_by_key(null, __vector(o), key, bb) : null; }\n  public com.google.flatbuffers.reflection.RPCCall callsByKey(com.google.flatbuffers.reflection.RPCCall obj, String key) { int o = __offset(6); return o != 0 ? com.google.flatbuffers.reflection.RPCCall.__lookup_by_key(obj, __vector(o), key, bb) : null; }\n  public com.google.flatbuffers.reflection.RPCCall.Vector callsVector() { return callsVector(new com.google.flatbuffers.reflection.RPCCall.Vector()); }\n  public com.google.flatbuffers.reflection.RPCCall.Vector callsVector(com.google.flatbuffers.reflection.RPCCall.Vector obj) { int o = __offset(6); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n  public com.google.flatbuffers.reflection.KeyValue attributes(int j) { return attributes(new com.google.flatbuffers.reflection.KeyValue(), j); }\n  public com.google.flatbuffers.reflection.KeyValue attributes(com.google.flatbuffers.reflection.KeyValue obj, int j) { int o = __offset(8); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }\n  public int attributesLength() { int o = __offset(8); return o != 0 ? __vector_len(o) : 0; }\n  public com.google.flatbuffers.reflection.KeyValue attributesByKey(String key) { int o = __offset(8); return o != 0 ? com.google.flatbuffers.reflection.KeyValue.__lookup_by_key(null, __vector(o), key, bb) : null; }\n  public com.google.flatbuffers.reflection.KeyValue attributesByKey(com.google.flatbuffers.reflection.KeyValue obj, String key) { int o = __offset(8); return o != 0 ? com.google.flatbuffers.reflection.KeyValue.__lookup_by_key(obj, __vector(o), key, bb) : null; }\n  public com.google.flatbuffers.reflection.KeyValue.Vector attributesVector() { return attributesVector(new com.google.flatbuffers.reflection.KeyValue.Vector()); }\n  public com.google.flatbuffers.reflection.KeyValue.Vector attributesVector(com.google.flatbuffers.reflection.KeyValue.Vector obj) { int o = __offset(8); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n  public String documentation(int j) { int o = __offset(10); return o != 0 ? __string(__vector(o) + j * 4) : null; }\n  public int documentationLength() { int o = __offset(10); return o != 0 ? __vector_len(o) : 0; }\n  public StringVector documentationVector() { return documentationVector(new StringVector()); }\n  public StringVector documentationVector(StringVector obj) { int o = __offset(10); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n  /**\n   * File that this Service is declared in.\n   */\n  public String declarationFile() { int o = __offset(12); return o != 0 ? __string(o + bb_pos) : null; }\n  public ByteBuffer declarationFileAsByteBuffer() { return __vector_as_bytebuffer(12, 1); }\n  public ByteBuffer declarationFileInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 12, 1); }\n\n  public static int createService(FlatBufferBuilder builder,\n      int nameOffset,\n      int callsOffset,\n      int attributesOffset,\n      int documentationOffset,\n      int declarationFileOffset) {\n    builder.startTable(5);\n    Service.addDeclarationFile(builder, declarationFileOffset);\n    Service.addDocumentation(builder, documentationOffset);\n    Service.addAttributes(builder, attributesOffset);\n    Service.addCalls(builder, callsOffset);\n    Service.addName(builder, nameOffset);\n    return Service.endService(builder);\n  }\n\n  public static void startService(FlatBufferBuilder builder) { builder.startTable(5); }\n  public static void addName(FlatBufferBuilder builder, int nameOffset) { builder.addOffset(nameOffset); builder.slot(0); }\n  public static void addCalls(FlatBufferBuilder builder, int callsOffset) { builder.addOffset(1, callsOffset, 0); }\n  public static int createCallsVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }\n  public static void startCallsVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static void addAttributes(FlatBufferBuilder builder, int attributesOffset) { builder.addOffset(2, attributesOffset, 0); }\n  public static int createAttributesVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }\n  public static void startAttributesVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static void addDocumentation(FlatBufferBuilder builder, int documentationOffset) { builder.addOffset(3, documentationOffset, 0); }\n  public static int createDocumentationVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }\n  public static void startDocumentationVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static void addDeclarationFile(FlatBufferBuilder builder, int declarationFileOffset) { builder.addOffset(4, declarationFileOffset, 0); }\n  public static int endService(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    builder.required(o, 4);  // name\n    return o;\n  }\n\n  @Override\n  protected int keysCompare(Integer o1, Integer o2, ByteBuffer _bb) { return compareStrings(__offset(4, o1, _bb), __offset(4, o2, _bb), _bb); }\n\n  public static Service __lookup_by_key(Service obj, int vectorLocation, String key, ByteBuffer bb) {\n    byte[] byteKey = key.getBytes(java.nio.charset.StandardCharsets.UTF_8);\n    int span = bb.getInt(vectorLocation - 4);\n    int start = 0;\n    while (span != 0) {\n      int middle = span / 2;\n      int tableOffset = __indirect(vectorLocation + 4 * (start + middle), bb);\n      int comp = compareStrings(__offset(4, bb.capacity() - tableOffset, bb), byteKey, bb);\n      if (comp > 0) {\n        span = middle;\n      } else if (comp < 0) {\n        middle++;\n        start += middle;\n        span -= middle;\n      } else {\n        return (obj == null ? new Service() : obj).__assign(tableOffset, bb);\n      }\n    }\n    return null;\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public Service get(int j) { return get(new Service(), j); }\n    public Service get(Service obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); }\n    public Service getByKey(String key) {  return __lookup_by_key(null, __vector(), key, bb); }\n    public Service getByKey(Service obj, String key) {  return __lookup_by_key(obj, __vector(), key, bb); }\n  }\n}\n\n"
  },
  {
    "path": "java/src/main/java/com/google/flatbuffers/reflection/Type.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage com.google.flatbuffers.reflection;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class Type extends com.google.flatbuffers.Table {\n  public static void ValidateVersion() { Constants.FLATBUFFERS_25_12_19(); }\n  public static Type getRootAsType(ByteBuffer _bb) { return getRootAsType(_bb, new Type()); }\n  public static Type getRootAsType(ByteBuffer _bb, Type obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public Type __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public byte baseType() { int o = __offset(4); return o != 0 ? bb.get(o + bb_pos) : 0; }\n  public byte element() { int o = __offset(6); return o != 0 ? bb.get(o + bb_pos) : 0; }\n  public int index() { int o = __offset(8); return o != 0 ? bb.getInt(o + bb_pos) : -1; }\n  public int fixedLength() { int o = __offset(10); return o != 0 ? bb.getShort(o + bb_pos) & 0xFFFF : 0; }\n  /**\n   * The size (octets) of the `base_type` field.\n   */\n  public long baseSize() { int o = __offset(12); return o != 0 ? (long)bb.getInt(o + bb_pos) & 0xFFFFFFFFL : 4L; }\n  /**\n   * The size (octets) of the `element` field, if present.\n   */\n  public long elementSize() { int o = __offset(14); return o != 0 ? (long)bb.getInt(o + bb_pos) & 0xFFFFFFFFL : 0L; }\n\n  public static int createType(FlatBufferBuilder builder,\n      byte baseType,\n      byte element,\n      int index,\n      int fixedLength,\n      long baseSize,\n      long elementSize) {\n    builder.startTable(6);\n    Type.addElementSize(builder, elementSize);\n    Type.addBaseSize(builder, baseSize);\n    Type.addIndex(builder, index);\n    Type.addFixedLength(builder, fixedLength);\n    Type.addElement(builder, element);\n    Type.addBaseType(builder, baseType);\n    return Type.endType(builder);\n  }\n\n  public static void startType(FlatBufferBuilder builder) { builder.startTable(6); }\n  public static void addBaseType(FlatBufferBuilder builder, byte baseType) { builder.addByte(0, baseType, 0); }\n  public static void addElement(FlatBufferBuilder builder, byte element) { builder.addByte(1, element, 0); }\n  public static void addIndex(FlatBufferBuilder builder, int index) { builder.addInt(2, index, -1); }\n  public static void addFixedLength(FlatBufferBuilder builder, int fixedLength) { builder.addShort(3, (short) fixedLength, (short) 0); }\n  public static void addBaseSize(FlatBufferBuilder builder, long baseSize) { builder.addInt(4, (int) baseSize, (int) 4L); }\n  public static void addElementSize(FlatBufferBuilder builder, long elementSize) { builder.addInt(5, (int) elementSize, (int) 0L); }\n  public static int endType(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    return o;\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public Type get(int j) { return get(new Type(), j); }\n    public Type get(Type obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); }\n  }\n}\n\n"
  },
  {
    "path": "java/src/test/java/JavaTest.java",
    "content": "import static com.google.common.truth.Truth.assertThat;\nimport static com.google.flatbuffers.Constants.*;\n\nimport DictionaryLookup.*;\nimport MyGame.Example.*;\nimport NamespaceA.*;\nimport NamespaceA.NamespaceB.*;\nimport com.google.common.io.ByteStreams;\nimport com.google.flatbuffers.ArrayReadWriteBuf;\nimport com.google.flatbuffers.ByteBufferUtil;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FlexBuffers;\nimport com.google.flatbuffers.FlexBuffers.FlexBufferException;\nimport com.google.flatbuffers.FlexBuffers.KeyVector;\nimport com.google.flatbuffers.FlexBuffers.Reference;\nimport com.google.flatbuffers.FlexBuffers.Vector;\nimport com.google.flatbuffers.FlexBuffersBuilder;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.UnionVector;\nimport java.io.*;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\nimport java.nio.channels.FileChannel;\nimport java.nio.charset.StandardCharsets;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.Map;\nimport optional_scalars.OptionalByte;\nimport optional_scalars.ScalarStuff;\nimport org.junit.Rule;\nimport org.junit.rules.TemporaryFolder;\nimport org.junit.runner.RunWith;\nimport org.junit.runners.JUnit4;\n\n/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n@RunWith(JUnit4.class)\npublic class JavaTest {\n\n  @Rule public TemporaryFolder tempFolder = new TemporaryFolder();\n\n  @org.junit.Test\n  public void mainTest() throws IOException {\n    // First, let's test reading a FlatBuffer generated by C++ code:\n    // This file was generated from monsterdata_test.json\n    byte[] data =\n        ByteStreams.toByteArray(\n            JavaTest.class.getClassLoader().getResourceAsStream(\"monsterdata_test.mon\"));\n\n    // Now test it:\n    ByteBuffer bb = ByteBuffer.wrap(data);\n    TestBuffer(bb);\n    TestPackUnpack(bb);\n  }\n\n  @org.junit.Test\n  public void testFlatBufferBuilder() {\n    // We use an initial size of 1 to exercise the reallocation algorithm,\n    // normally a size larger than the typical FlatBuffer you generate would be\n    // better for performance.\n    FlatBufferBuilder fbb = new FlatBufferBuilder(1);\n    TestBuilderBasics(fbb, true);\n    TestBuilderBasics(fbb, false);\n    TestExtendedBuffer(fbb.dataBuffer().asReadOnlyBuffer());\n  }\n\n  @org.junit.Test\n  public void TestEnums() {\n    assertThat(Color.name(Color.Red)).isEqualTo(\"Red\");\n    assertThat(Color.name(Color.Blue)).isEqualTo(\"Blue\");\n    assertThat(Any.name(Any.NONE)).isEqualTo(\"NONE\");\n    assertThat(Any.name(Any.Monster)).isEqualTo(\"Monster\");\n  }\n\n  static void TestBuffer(ByteBuffer bb) {\n    assertThat(Monster.MonsterBufferHasIdentifier(bb)).isEqualTo(true);\n\n    Monster monster = Monster.getRootAsMonster(bb);\n\n    assertThat(monster.hp()).isEqualTo((short) 80);\n    // default\n    assertThat(monster.mana()).isEqualTo((short) 150);\n\n    assertThat(monster.name()).isEqualTo(\"MyMonster\");\n    // monster.friendly() // can't access, deprecated\n\n    Vec3 pos = monster.pos();\n    assertThat(pos.x()).isEqualTo(1.0f);\n    assertThat(pos.y()).isEqualTo(2.0f);\n    assertThat(pos.z()).isEqualTo(3.0f);\n    assertThat(pos.test1()).isEqualTo(3.0);\n    // issue: int != byte\n    assertThat(pos.test2()).isEqualTo((int) Color.Green);\n    Test t = pos.test3();\n    assertThat(t.a()).isEqualTo((short) 5);\n    assertThat(t.b()).isEqualTo((byte) 6);\n\n    assertThat(monster.testType()).isEqualTo((byte) Any.Monster);\n    Monster monster2 = new Monster();\n    assertThat(monster.test(monster2) != null).isTrue();\n    assertThat(monster2.name()).isEqualTo(\"Fred\");\n\n    assertThat(monster.inventoryLength()).isEqualTo(5);\n    int invsum = 0;\n    for (int i = 0; i < monster.inventoryLength(); i++) invsum += monster.inventory(i);\n    assertThat(invsum).isEqualTo(10);\n\n    // Method using a vector access object:\n    ByteVector inventoryVector = monster.inventoryVector();\n    assertThat(inventoryVector.length()).isEqualTo(5);\n    invsum = 0;\n    for (int i = 0; i < inventoryVector.length(); i++) invsum += inventoryVector.getAsUnsigned(i);\n    assertThat(invsum).isEqualTo(10);\n\n    // Alternative way of accessing a vector:\n    ByteBuffer ibb = monster.inventoryAsByteBuffer();\n    invsum = 0;\n    while (ibb.position() < ibb.limit()) invsum += ibb.get();\n    assertThat(invsum).isEqualTo(10);\n\n    Test test_0 = monster.test4(0);\n    Test test_1 = monster.test4(1);\n    assertThat(monster.test4Length()).isEqualTo(2);\n    assertThat(test_0.a() + test_0.b() + test_1.a() + test_1.b()).isEqualTo((Integer) 100);\n\n    Test.Vector test4Vector = monster.test4Vector();\n    test_0 = test4Vector.get(0);\n    test_1 = test4Vector.get(1);\n    assertThat(test4Vector.length()).isEqualTo(2);\n    assertThat(test_0.a() + test_0.b() + test_1.a() + test_1.b()).isEqualTo((Integer) 100);\n\n    assertThat(monster.testarrayofstringLength()).isEqualTo(2);\n    assertThat(monster.testarrayofstring(0)).isEqualTo(\"test1\");\n    assertThat(monster.testarrayofstring(1)).isEqualTo(\"test2\");\n\n    // Method using a vector access object:\n    StringVector testarrayofstringVector = monster.testarrayofstringVector();\n    assertThat(testarrayofstringVector.length()).isEqualTo(2);\n    assertThat(testarrayofstringVector.get(0)).isEqualTo(\"test1\");\n    assertThat(testarrayofstringVector.get(1)).isEqualTo(\"test2\");\n\n    assertThat(monster.testbool()).isEqualTo(true);\n  }\n\n  // this method checks additional fields not present in the binary buffer read from file\n  // these new tests are performed on top of the regular tests\n  static void TestExtendedBuffer(ByteBuffer bb) {\n    TestBuffer(bb);\n\n    Monster monster = Monster.getRootAsMonster(bb);\n\n    assertThat(monster.testhashu32Fnv1()).isEqualTo((Integer.MAX_VALUE + 1L));\n  }\n\n  @org.junit.Test\n  public void TestNamespaceNesting() {\n    // reference / manipulate these to verify compilation\n    FlatBufferBuilder fbb = new FlatBufferBuilder(1);\n\n    TableInNestedNS.startTableInNestedNS(fbb);\n    TableInNestedNS.addFoo(fbb, 1234);\n    int nestedTableOff = TableInNestedNS.endTableInNestedNS(fbb);\n\n    TableInFirstNS.startTableInFirstNS(fbb);\n    TableInFirstNS.addFooTable(fbb, nestedTableOff);\n    int off = TableInFirstNS.endTableInFirstNS(fbb);\n  }\n\n  @org.junit.Test\n  public void TestNestedFlatBuffer() {\n    final String nestedMonsterName = \"NestedMonsterName\";\n    final short nestedMonsterHp = 600;\n    final short nestedMonsterMana = 1024;\n\n    FlatBufferBuilder fbb1 = new FlatBufferBuilder(16);\n    int str1 = fbb1.createString(nestedMonsterName);\n    Monster.startMonster(fbb1);\n    Monster.addName(fbb1, str1);\n    Monster.addHp(fbb1, nestedMonsterHp);\n    Monster.addMana(fbb1, nestedMonsterMana);\n    int monster1 = Monster.endMonster(fbb1);\n    Monster.finishMonsterBuffer(fbb1, monster1);\n    byte[] fbb1Bytes = fbb1.sizedByteArray();\n    fbb1 = null;\n\n    FlatBufferBuilder fbb2 = new FlatBufferBuilder(16);\n    int str2 = fbb2.createString(\"My Monster\");\n    int nestedBuffer = Monster.createTestnestedflatbufferVector(fbb2, fbb1Bytes);\n    Monster.startMonster(fbb2);\n    Monster.addName(fbb2, str2);\n    Monster.addHp(fbb2, (short) 50);\n    Monster.addMana(fbb2, (short) 32);\n    Monster.addTestnestedflatbuffer(fbb2, nestedBuffer);\n    int monster = Monster.endMonster(fbb2);\n    Monster.finishMonsterBuffer(fbb2, monster);\n\n    // Now test the data extracted from the nested buffer\n    Monster mons = Monster.getRootAsMonster(fbb2.dataBuffer());\n    Monster nestedMonster = mons.testnestedflatbufferAsMonster();\n\n    assertThat(nestedMonsterMana).isEqualTo(nestedMonster.mana());\n    assertThat(nestedMonsterHp).isEqualTo(nestedMonster.hp());\n    assertThat(nestedMonsterName).isEqualTo(nestedMonster.name());\n  }\n\n  @org.junit.Test\n  public void TestCreateByteVector() {\n    FlatBufferBuilder fbb = new FlatBufferBuilder(16);\n    int str = fbb.createString(\"MyMonster\");\n    byte[] inventory = new byte[] {0, 1, 2, 3, 4};\n    int vec = fbb.createByteVector(inventory);\n    Monster.startMonster(fbb);\n    Monster.addInventory(fbb, vec);\n    Monster.addName(fbb, str);\n    int monster1 = Monster.endMonster(fbb);\n    Monster.finishMonsterBuffer(fbb, monster1);\n    Monster monsterObject = Monster.getRootAsMonster(fbb.dataBuffer());\n\n    assertThat((Integer) monsterObject.inventory(1)).isEqualTo((int) inventory[1]);\n    assertThat(monsterObject.inventoryLength()).isEqualTo(inventory.length);\n    ByteVector inventoryVector = monsterObject.inventoryVector();\n    assertThat(inventoryVector.getAsUnsigned(1)).isEqualTo((int) inventory[1]);\n    assertThat(inventoryVector.length()).isEqualTo(inventory.length);\n\n    assertThat(ByteBuffer.wrap(inventory)).isEqualTo(monsterObject.inventoryAsByteBuffer());\n  }\n\n  @org.junit.Test\n  public void TestCreateUninitializedVector() {\n    FlatBufferBuilder fbb = new FlatBufferBuilder(16);\n    int str = fbb.createString(\"MyMonster\");\n    byte[] inventory = new byte[] {0, 1, 2, 3, 4};\n    ByteBuffer bb = fbb.createUnintializedVector(1, inventory.length, 1);\n    for (byte i : inventory) {\n      bb.put(i);\n    }\n    int vec = fbb.endVector();\n    Monster.startMonster(fbb);\n    Monster.addInventory(fbb, vec);\n    Monster.addName(fbb, str);\n    int monster1 = Monster.endMonster(fbb);\n    Monster.finishMonsterBuffer(fbb, monster1);\n    Monster monsterObject = Monster.getRootAsMonster(fbb.dataBuffer());\n\n    assertThat((Integer) monsterObject.inventory(1)).isEqualTo((int) inventory[1]);\n    assertThat(monsterObject.inventoryLength()).isEqualTo(inventory.length);\n    ByteVector inventoryVector = monsterObject.inventoryVector();\n    assertThat(inventoryVector.getAsUnsigned(1)).isEqualTo((int) inventory[1]);\n    assertThat(inventoryVector.length()).isEqualTo(inventory.length);\n    assertThat(ByteBuffer.wrap(inventory)).isEqualTo(monsterObject.inventoryAsByteBuffer());\n  }\n\n  @org.junit.Test\n  public void TestByteBufferFactory() throws IOException {\n    File file = tempFolder.newFile(\"javatest.bin\");\n    final class MappedByteBufferFactory extends FlatBufferBuilder.ByteBufferFactory {\n      @Override\n      public ByteBuffer newByteBuffer(int capacity) {\n        ByteBuffer bb;\n        try {\n          RandomAccessFile f = new RandomAccessFile(file, \"rw\");\n          bb =\n              f.getChannel()\n                  .map(FileChannel.MapMode.READ_WRITE, 0, capacity)\n                  .order(ByteOrder.LITTLE_ENDIAN);\n          f.close();\n        } catch (Throwable e) {\n          System.out.println(\"FlatBuffers test: couldn't map ByteBuffer to a file\");\n          bb = null;\n        }\n        return bb;\n      }\n    }\n\n    FlatBufferBuilder fbb = new FlatBufferBuilder(1, new MappedByteBufferFactory());\n\n    TestBuilderBasics(fbb, false);\n  }\n\n  @org.junit.Test\n  public void TestSizedInputStream() {\n    // Test on default FlatBufferBuilder that uses HeapByteBuffer\n    FlatBufferBuilder fbb = new FlatBufferBuilder(1);\n\n    TestBuilderBasics(fbb, false);\n\n    InputStream in = fbb.sizedInputStream();\n    byte[] array = fbb.sizedByteArray();\n    int count = 0;\n    int currentVal = 0;\n\n    while (currentVal != -1 && count < array.length) {\n      try {\n        currentVal = in.read();\n      } catch (java.io.IOException e) {\n        System.out.println(\"FlatBuffers test: couldn't read from InputStream\");\n        return;\n      }\n      assertThat((byte) currentVal).isEqualTo(array[count]);\n      count++;\n    }\n    assertThat(count).isEqualTo(array.length);\n  }\n\n  void TestBuilderBasics(FlatBufferBuilder fbb, boolean sizePrefix) {\n    int[] names = {\n      fbb.createString(\"Frodo\"), fbb.createString(\"Barney\"), fbb.createString(\"Wilma\")\n    };\n    int[] off = new int[3];\n    Monster.startMonster(fbb);\n    Monster.addName(fbb, names[0]);\n    off[0] = Monster.endMonster(fbb);\n    Monster.startMonster(fbb);\n    Monster.addName(fbb, names[1]);\n    off[1] = Monster.endMonster(fbb);\n    Monster.startMonster(fbb);\n    Monster.addName(fbb, names[2]);\n    off[2] = Monster.endMonster(fbb);\n    int sortMons = fbb.createSortedVectorOfTables(new Monster(), off);\n\n    // We set up the same values as monsterdata.json:\n\n    int str = fbb.createString(\"MyMonster\");\n\n    int inv = Monster.createInventoryVector(fbb, new byte[] {0, 1, 2, 3, 4});\n\n    int fred = fbb.createString(\"Fred\");\n    Monster.startMonster(fbb);\n    Monster.addName(fbb, fred);\n    int mon2 = Monster.endMonster(fbb);\n\n    Monster.startTest4Vector(fbb, 2);\n    Test.createTest(fbb, (short) 10, (byte) 20);\n    Test.createTest(fbb, (short) 30, (byte) 40);\n    int test4 = fbb.endVector();\n\n    int testArrayOfString =\n        Monster.createTestarrayofstringVector(\n            fbb, new int[] {fbb.createString(\"test1\"), fbb.createString(\"test2\")});\n\n    Monster.startMonster(fbb);\n    Monster.addPos(\n        fbb, Vec3.createVec3(fbb, 1.0f, 2.0f, 3.0f, 3.0, Color.Green, (short) 5, (byte) 6));\n    Monster.addHp(fbb, (short) 80);\n    Monster.addName(fbb, str);\n    Monster.addInventory(fbb, inv);\n    Monster.addTestType(fbb, (byte) Any.Monster);\n    Monster.addTest(fbb, mon2);\n    Monster.addTest4(fbb, test4);\n    Monster.addTestarrayofstring(fbb, testArrayOfString);\n    Monster.addTestbool(fbb, true);\n    Monster.addTesthashu32Fnv1(fbb, Integer.MAX_VALUE + 1L);\n    Monster.addTestarrayoftables(fbb, sortMons);\n    int mon = Monster.endMonster(fbb);\n\n    if (sizePrefix) {\n      Monster.finishSizePrefixedMonsterBuffer(fbb, mon);\n    } else {\n      Monster.finishMonsterBuffer(fbb, mon);\n    }\n\n    // Write the result to a file for debugging purposes:\n    // Note that the binaries are not necessarily identical, since the JSON\n    // parser may serialize in a slightly different order than the above\n    // Java code. They are functionally equivalent though.\n\n    try {\n      String filename = \"monsterdata_java_wire\" + (sizePrefix ? \"_sp\" : \"\") + \".mon\";\n      FileChannel fc = new FileOutputStream(tempFolder.newFile(filename)).getChannel();\n      fc.write(fbb.dataBuffer().duplicate());\n      fc.close();\n    } catch (java.io.IOException e) {\n      System.out.println(\"FlatBuffers test: couldn't write file\");\n      return;\n    }\n\n    // Test it:\n    ByteBuffer dataBuffer = fbb.dataBuffer();\n    if (sizePrefix) {\n      assertThat(ByteBufferUtil.getSizePrefix(dataBuffer) + SIZE_PREFIX_LENGTH)\n          .isEqualTo(dataBuffer.remaining());\n      dataBuffer = ByteBufferUtil.removeSizePrefix(dataBuffer);\n    }\n    TestExtendedBuffer(dataBuffer);\n\n    // Make sure it also works with read only ByteBuffers. This is slower,\n    // since creating strings incurs an additional copy\n    // (see Table.__string).\n    TestExtendedBuffer(dataBuffer.asReadOnlyBuffer());\n\n    // Attempt to mutate Monster fields and check whether the buffer has been mutated properly\n    // revert to original values after testing\n    Monster monster = Monster.getRootAsMonster(dataBuffer);\n\n    // mana is optional and does not exist in the buffer so the mutation should fail\n    // the mana field should retain its default value\n    assertThat(monster.mutateMana((short) 10)).isFalse();\n    assertThat(monster.mana()).isEqualTo((short) 150);\n\n    // Accessing a vector of sorted by the key tables\n    assertThat(monster.testarrayoftables(0).name()).isEqualTo(\"Barney\");\n    assertThat(monster.testarrayoftables(1).name()).isEqualTo(\"Frodo\");\n    assertThat(monster.testarrayoftables(2).name()).isEqualTo(\"Wilma\");\n    Monster.Vector testarrayoftablesVector = monster.testarrayoftablesVector();\n    assertThat(testarrayoftablesVector.get(0).name()).isEqualTo(\"Barney\");\n    assertThat(testarrayoftablesVector.get(1).name()).isEqualTo(\"Frodo\");\n    assertThat(testarrayoftablesVector.get(2).name()).isEqualTo(\"Wilma\");\n\n    // Example of searching for a table by the key\n    assertThat(monster.testarrayoftablesByKey(\"Frodo\").name()).isEqualTo(\"Frodo\");\n    assertThat(monster.testarrayoftablesByKey(\"Barney\").name()).isEqualTo(\"Barney\");\n    assertThat(monster.testarrayoftablesByKey(\"Wilma\").name()).isEqualTo(\"Wilma\");\n    assertThat(testarrayoftablesVector.getByKey(\"Frodo\").name()).isEqualTo(\"Frodo\");\n    assertThat(testarrayoftablesVector.getByKey(\"Barney\").name()).isEqualTo(\"Barney\");\n    assertThat(testarrayoftablesVector.getByKey(\"Wilma\").name()).isEqualTo(\"Wilma\");\n\n    // testType is an existing field and mutating it should succeed\n    assertThat(monster.testType()).isEqualTo((byte) Any.Monster);\n\n    // mutate the inventory vector\n    assertThat(monster.mutateInventory(0, 1)).isTrue();\n    assertThat(monster.mutateInventory(1, 2)).isTrue();\n    assertThat(monster.mutateInventory(2, 3)).isTrue();\n    assertThat(monster.mutateInventory(3, 4)).isTrue();\n    assertThat(monster.mutateInventory(4, 5)).isTrue();\n\n    for (int i = 0; i < monster.inventoryLength(); i++) {\n      assertThat((Integer) monster.inventory(i)).isEqualTo(i + 1);\n    }\n    ByteVector inventoryVector = monster.inventoryVector();\n    for (int i = 0; i < inventoryVector.length(); i++) {\n      assertThat((int) inventoryVector.get(i)).isEqualTo(i + 1);\n    }\n\n    // reverse mutation\n    assertThat(monster.mutateInventory(0, 0)).isTrue();\n    assertThat(monster.mutateInventory(1, 1)).isTrue();\n    assertThat(monster.mutateInventory(2, 2)).isTrue();\n    assertThat(monster.mutateInventory(3, 3)).isTrue();\n    assertThat(monster.mutateInventory(4, 4)).isTrue();\n\n    // get a struct field and edit one of its fields\n    Vec3 pos = monster.pos();\n    assertThat(pos.x()).isEqualTo(1.0f);\n    pos.mutateX(55.0f);\n    assertThat(pos.x()).isEqualTo(55.0f);\n    pos.mutateX(1.0f);\n    assertThat(pos.x()).isEqualTo(1.0f);\n  }\n\n  @org.junit.Test\n  public void TestVectorOfUnions() {\n    final FlatBufferBuilder fbb = new FlatBufferBuilder();\n\n    final int swordAttackDamage = 1;\n\n    final int[] characterVector =\n        new int[] {\n          Attacker.createAttacker(fbb, swordAttackDamage),\n        };\n\n    final byte[] characterTypeVector =\n        new byte[] {\n          Character.MuLan,\n        };\n\n    Movie.finishMovieBuffer(\n        fbb,\n        Movie.createMovie(\n            fbb,\n            (byte) 0,\n            (byte) 0,\n            Movie.createCharactersTypeVector(fbb, characterTypeVector),\n            Movie.createCharactersVector(fbb, characterVector)));\n\n    final Movie movie = Movie.getRootAsMovie(fbb.dataBuffer());\n    ByteVector charactersTypeByteVector = movie.charactersTypeVector();\n    UnionVector charactersVector = movie.charactersVector();\n\n    assertThat(movie.charactersTypeLength()).isEqualTo(characterTypeVector.length);\n    assertThat(charactersTypeByteVector.length()).isEqualTo(characterTypeVector.length);\n    assertThat(movie.charactersLength()).isEqualTo(characterVector.length);\n    assertThat(charactersVector.length()).isEqualTo(characterVector.length);\n\n    assertThat((Byte) movie.charactersType(0)).isEqualTo(characterTypeVector[0]);\n    assertThat(charactersTypeByteVector.get(0)).isEqualTo(characterTypeVector[0]);\n\n    assertThat(((Attacker) movie.characters(new Attacker(), 0)).swordAttackDamage())\n        .isEqualTo(swordAttackDamage);\n  }\n\n  @org.junit.Test\n  public void TestFixedLengthArrays() {\n    FlatBufferBuilder builder = new FlatBufferBuilder(0);\n\n    float a;\n    int[] b = new int[15];\n    byte c;\n    int[][] d_a = new int[2][2];\n    byte[] d_b = new byte[2];\n    byte[][] d_c = new byte[2][2];\n    long[][] d_d = new long[2][2];\n    int e;\n    long[] f = new long[2];\n\n    a = 0.5f;\n    for (int i = 0; i < 15; i++) b[i] = i;\n    c = 1;\n    d_a[0][0] = 1;\n    d_a[0][1] = 2;\n    d_a[1][0] = 3;\n    d_a[1][1] = 4;\n    d_b[0] = TestEnum.B;\n    d_b[1] = TestEnum.C;\n    d_c[0][0] = TestEnum.A;\n    d_c[0][1] = TestEnum.B;\n    d_c[1][0] = TestEnum.C;\n    d_c[1][1] = TestEnum.B;\n    d_d[0][0] = -1;\n    d_d[0][1] = 1;\n    d_d[1][0] = -2;\n    d_d[1][1] = 2;\n    e = 2;\n    f[0] = -1;\n    f[1] = 1;\n\n    int arrayOffset = ArrayStruct.createArrayStruct(builder, a, b, c, d_a, d_b, d_c, d_d, e, f);\n\n    // Create a table with the ArrayStruct.\n    ArrayTable.startArrayTable(builder);\n    ArrayTable.addA(builder, arrayOffset);\n    int tableOffset = ArrayTable.endArrayTable(builder);\n\n    ArrayTable.finishArrayTableBuffer(builder, tableOffset);\n\n    ArrayTable table = ArrayTable.getRootAsArrayTable(builder.dataBuffer());\n    NestedStruct nested = new NestedStruct();\n\n    assertThat(table.a().a()).isEqualTo(0.5f);\n    for (int i = 0; i < 15; i++) assertThat(table.a().b(i)).isEqualTo(i);\n    assertThat(table.a().c()).isEqualTo((byte) 1);\n    assertThat(table.a().d(nested, 0).a(0)).isEqualTo(1);\n    assertThat(table.a().d(nested, 0).a(1)).isEqualTo(2);\n    assertThat(table.a().d(nested, 1).a(0)).isEqualTo(3);\n    assertThat(table.a().d(nested, 1).a(1)).isEqualTo(4);\n    assertThat(table.a().d(nested, 0).b()).isEqualTo(TestEnum.B);\n    assertThat(table.a().d(nested, 1).b()).isEqualTo(TestEnum.C);\n    assertThat(table.a().d(nested, 0).c(0)).isEqualTo(TestEnum.A);\n    assertThat(table.a().d(nested, 0).c(1)).isEqualTo(TestEnum.B);\n    assertThat(table.a().d(nested, 1).c(0)).isEqualTo(TestEnum.C);\n    assertThat(table.a().d(nested, 1).c(1)).isEqualTo(TestEnum.B);\n    assertThat(table.a().d(nested, 0).d(0)).isEqualTo((long) -1);\n    assertThat(table.a().d(nested, 0).d(1)).isEqualTo((long) 1);\n    assertThat(table.a().d(nested, 1).d(0)).isEqualTo((long) -2);\n    assertThat(table.a().d(nested, 1).d(1)).isEqualTo((long) 2);\n    assertThat(table.a().e()).isEqualTo(2);\n    assertThat(table.a().f(0)).isEqualTo((long) -1);\n    assertThat(table.a().f(1)).isEqualTo((long) 1);\n  }\n\n  @org.junit.Test\n  public void testFlexBuffersTest() {\n    FlexBuffersBuilder builder =\n        new FlexBuffersBuilder(\n            ByteBuffer.allocate(512), FlexBuffersBuilder.BUILDER_FLAG_SHARE_KEYS_AND_STRINGS);\n    testFlexBuffersTest(builder);\n    int bufferLimit1 = ((ArrayReadWriteBuf) builder.getBuffer()).limit();\n\n    // Repeat after clearing the builder to ensure the builder is reusable\n    builder.clear();\n    testFlexBuffersTest(builder);\n    int bufferLimit2 = ((ArrayReadWriteBuf) builder.getBuffer()).limit();\n    assertThat(bufferLimit1).isEqualTo(bufferLimit2);\n  }\n\n  public static void testFlexBuffersTest(FlexBuffersBuilder builder) {\n    // Write the equivalent of:\n    // { vec: [ -100, \"Fred\", 4.0, false ], bar: [ 1, 2, 3 ], bar3: [ 1, 2, 3 ],\n    // foo: 100, bool: true, mymap: { foo: \"Fred\" } }\n    // It's possible to do this without std::function support as well.\n    int map1 = builder.startMap();\n\n    int vec1 = builder.startVector();\n    builder.putInt(-100);\n    builder.putString(\"Fred\");\n    builder.putBlob(new byte[] {(byte) 77});\n    builder.putBoolean(false);\n    builder.putInt(Long.MAX_VALUE);\n\n    int map2 = builder.startMap();\n    builder.putInt(\"test\", 200);\n    builder.endMap(null, map2);\n\n    builder.putFloat(150.9);\n    builder.putFloat(150.9999998);\n    builder.endVector(\"vec\", vec1, false, false);\n\n    vec1 = builder.startVector();\n    builder.putInt(1);\n    builder.putInt(2);\n    builder.putInt(3);\n    builder.endVector(\"bar\", vec1, true, false);\n\n    vec1 = builder.startVector();\n    builder.putBoolean(true);\n    builder.putBoolean(false);\n    builder.putBoolean(true);\n    builder.putBoolean(false);\n    builder.endVector(\"bools\", vec1, true, false);\n\n    builder.putBoolean(\"bool\", true);\n    builder.putFloat(\"foo\", 100);\n\n    map2 = builder.startMap();\n    builder.putString(\"bar\", \"Fred\"); // Testing key and string reuse.\n    builder.putInt(\"int\", -120);\n    builder.putFloat(\"float\", -123.0f);\n    builder.putBlob(\"blob\", new byte[] {65, 67});\n    builder.endMap(\"mymap\", map2);\n\n    builder.endMap(null, map1);\n    builder.finish();\n\n    FlexBuffers.Map m = FlexBuffers.getRoot(builder.getBuffer()).asMap();\n\n    assertThat(m.size()).isEqualTo(6);\n\n    // test empty (an null)\n    // empty if fail\n    assertThat(m.get(\"no_key\").asString()).isEqualTo(\"\");\n    // empty if fail\n    assertThat(m.get(\"no_key\").asMap()).isEqualTo(FlexBuffers.Map.empty());\n    // empty if fail\n    assertThat(m.get(\"no_key\").asKey()).isEqualTo(FlexBuffers.Key.empty());\n    // empty if fail\n    assertThat(m.get(\"no_key\").asVector()).isEqualTo(Vector.empty());\n    // empty if fail\n    assertThat(m.get(\"no_key\").asBlob()).isEqualTo(FlexBuffers.Blob.empty());\n    assert (m.get(\"no_key\").asVector().isEmpty()); // empty if fail\n\n    // testing \"vec\" field\n    FlexBuffers.Vector vec = m.get(\"vec\").asVector();\n    assertThat(vec.size()).isEqualTo(8);\n    assertThat(vec.get(0).asLong()).isEqualTo((long) -100);\n    assertThat(vec.get(1).asString()).isEqualTo(\"Fred\");\n    assertThat(vec.get(2).isBlob()).isTrue();\n    assertThat(vec.get(2).asBlob().size()).isEqualTo(1);\n    assertThat(vec.get(2).asBlob().data().get(0)).isEqualTo((byte) 77);\n    // Check if type is a bool\n    assertThat(vec.get(3).isBoolean()).isTrue();\n    // Check if value is false\n    assertThat(vec.get(3).asBoolean()).isFalse();\n    assertThat(vec.get(4).asLong()).isEqualTo(Long.MAX_VALUE);\n    assertThat(vec.get(5).isMap()).isTrue();\n    assertThat(vec.get(5).asMap().get(\"test\").asInt()).isEqualTo(200);\n    assertThat(Float.compare((float) vec.get(6).asFloat(), 150.9f)).isEqualTo(0);\n    assertThat(Double.compare(vec.get(7).asFloat(), 150.9999998)).isEqualTo(0);\n    // conversion fail returns 0 as C++\n    assertThat((long) 0).isEqualTo((long) vec.get(1).asLong());\n\n    // bar vector\n    FlexBuffers.Vector tvec = m.get(\"bar\").asVector();\n    assertThat(tvec.size()).isEqualTo(3);\n    assertThat(tvec.get(0).asInt()).isEqualTo(1);\n    assertThat(tvec.get(1).asInt()).isEqualTo(2);\n    assertThat(tvec.get(2).asInt()).isEqualTo(3);\n    assertThat(((FlexBuffers.TypedVector) tvec).getElemType()).isEqualTo(FlexBuffers.FBT_INT);\n\n    // bools vector\n    FlexBuffers.Vector bvec = m.get(\"bools\").asVector();\n    assertThat(bvec.size()).isEqualTo(4);\n    assertThat(bvec.get(0).asBoolean()).isTrue();\n    assertThat(bvec.get(1).asBoolean()).isFalse();\n    assertThat(bvec.get(2).asBoolean()).isTrue();\n    assertThat(bvec.get(3).asBoolean()).isFalse();\n    assertThat(((FlexBuffers.TypedVector) bvec).getElemType()).isEqualTo(FlexBuffers.FBT_BOOL);\n\n    assertThat((float) m.get(\"foo\").asFloat()).isEqualTo((float) 100);\n    assertThat(m.get(\"unknown\").isNull()).isTrue();\n\n    // mymap vector\n    FlexBuffers.Map mymap = m.get(\"mymap\").asMap();\n    // These should be equal by pointer equality, since key and value are shared.\n    assertThat(mymap.keys().get(0)).isEqualTo(m.keys().get(0));\n    assertThat(mymap.keys().get(0).toString()).isEqualTo(\"bar\");\n    assertThat(mymap.values().get(0).asString()).isEqualTo(vec.get(1).asString());\n    assertThat(mymap.get(\"int\").asInt()).isEqualTo(-120);\n    assertThat((float) mymap.get(\"float\").asFloat()).isEqualTo(-123.0f);\n    assertThat(Arrays.equals(mymap.get(\"blob\").asBlob().getBytes(), new byte[] {65, 67}))\n        .isEqualTo(true);\n    assertThat(mymap.get(\"blob\").asBlob().toString()).isEqualTo(\"AC\");\n    assertThat(mymap.get(\"blob\").toString()).isEqualTo(\"\\\"AC\\\"\");\n  }\n\n  @org.junit.Test\n  public void testFlexBufferVectorStrings() {\n    FlexBuffersBuilder builder = new FlexBuffersBuilder(ByteBuffer.allocate(10000000));\n\n    int size = 3000;\n    StringBuilder sb = new StringBuilder();\n    for (int i = 0; i < size; i++) {\n      sb.append(\"a\");\n    }\n\n    String text = sb.toString();\n    assertThat(text.length()).isEqualTo(size);\n\n    int pos = builder.startVector();\n\n    for (int i = 0; i < size; i++) {\n      builder.putString(text);\n    }\n\n    try {\n      builder.endVector(null, pos, true, false);\n      // this should raise an exception as\n      // typed vector of string was deprecated\n      assert false;\n    } catch (FlexBufferException fb) {\n      // no op\n    }\n    // we finish the vector again as non-typed\n    builder.endVector(null, pos, false, false);\n\n    ByteBuffer b = builder.finish();\n    Vector v = FlexBuffers.getRoot(b).asVector();\n\n    assertThat(v.size()).isEqualTo(size);\n    for (int i = 0; i < size; i++) {\n      assertThat(v.get(i).asString().length()).isEqualTo(size);\n      assertThat(v.get(i).asString()).isEqualTo(text);\n    }\n  }\n\n  @org.junit.Test\n  public void testDeprecatedTypedVectorString() {\n    // tests whether we are able to support reading deprecated typed vector string\n    // data is equivalent to [ \"abc\", \"abc\", \"abc\", \"abc\"]\n    byte[] data =\n        new byte[] {\n          0x03, 0x61, 0x62, 0x63, 0x00, 0x03, 0x61, 0x62, 0x63, 0x00, 0x03, 0x61, 0x62, 0x63, 0x00,\n          0x03, 0x61, 0x62, 0x63, 0x00, 0x04, 0x14, 0x10, 0x0c, 0x08, 0x04, 0x3c, 0x01\n        };\n    Reference ref = FlexBuffers.getRoot(ByteBuffer.wrap(data));\n    assertThat(ref.getType()).isEqualTo(FlexBuffers.FBT_VECTOR_STRING_DEPRECATED);\n    assertThat(ref.isTypedVector()).isTrue();\n    Vector vec = ref.asVector();\n    for (int i = 0; i < vec.size(); i++) {\n      assertThat(\"abc\").isEqualTo(vec.get(i).asString());\n    }\n  }\n\n  @org.junit.Test\n  public void testSingleElementBoolean() {\n    FlexBuffersBuilder builder = new FlexBuffersBuilder(ByteBuffer.allocate(100));\n    builder.putBoolean(true);\n    ByteBuffer b = builder.finish();\n    assertThat(FlexBuffers.getRoot(b).asBoolean()).isTrue();\n  }\n\n  @org.junit.Test\n  public void testSingleElementByte() {\n    FlexBuffersBuilder builder = new FlexBuffersBuilder();\n    builder.putInt(10);\n    ByteBuffer b = builder.finish();\n    assertThat(10).isEqualTo(FlexBuffers.getRoot(b).asInt());\n  }\n\n  @org.junit.Test\n  public void testSingleElementShort() {\n    FlexBuffersBuilder builder = new FlexBuffersBuilder();\n    builder.putInt(Short.MAX_VALUE);\n    ByteBuffer b = builder.finish();\n    assertThat(Short.MAX_VALUE).isEqualTo((short) FlexBuffers.getRoot(b).asInt());\n  }\n\n  @org.junit.Test\n  public void testSingleElementInt() {\n    FlexBuffersBuilder builder = new FlexBuffersBuilder();\n    builder.putInt(Integer.MIN_VALUE);\n    ByteBuffer b = builder.finish();\n    assertThat(Integer.MIN_VALUE).isEqualTo(FlexBuffers.getRoot(b).asInt());\n  }\n\n  @org.junit.Test\n  public void testSingleElementLong() {\n    FlexBuffersBuilder builder = new FlexBuffersBuilder();\n    builder.putInt(Long.MAX_VALUE);\n    ByteBuffer b = builder.finish();\n    assertThat(Long.MAX_VALUE).isEqualTo(FlexBuffers.getRoot(b).asLong());\n  }\n\n  @org.junit.Test\n  public void testSingleElementFloat() {\n    FlexBuffersBuilder builder = new FlexBuffersBuilder();\n    builder.putFloat(Float.MAX_VALUE);\n    ByteBuffer b = builder.finish();\n    assertThat(Float.compare(Float.MAX_VALUE, (float) FlexBuffers.getRoot(b).asFloat()))\n        .isEqualTo(0);\n  }\n\n  @org.junit.Test\n  public void testSingleElementDouble() {\n    FlexBuffersBuilder builder = new FlexBuffersBuilder();\n    builder.putFloat(Double.MAX_VALUE);\n    ByteBuffer b = builder.finish();\n    assertThat(Double.compare(Double.MAX_VALUE, FlexBuffers.getRoot(b).asFloat())).isEqualTo(0);\n  }\n\n  @org.junit.Test\n  public void testSingleElementBigString() {\n    FlexBuffersBuilder builder = new FlexBuffersBuilder(ByteBuffer.allocate(10000));\n    StringBuilder sb = new StringBuilder();\n\n    for (int i = 0; i < 3000; i++) {\n      sb.append(\"a\");\n    }\n\n    builder.putString(sb.toString());\n    ByteBuffer b = builder.finish();\n\n    FlexBuffers.Reference r = FlexBuffers.getRoot(b);\n\n    assertThat(FlexBuffers.FBT_STRING).isEqualTo(r.getType());\n    assertThat(sb.toString()).isEqualTo(r.asString());\n  }\n\n  @org.junit.Test\n  public void testSingleElementSmallString() {\n    FlexBuffersBuilder builder = new FlexBuffersBuilder(ByteBuffer.allocate(10000));\n\n    builder.putString(\"aa\");\n    ByteBuffer b = builder.finish();\n    FlexBuffers.Reference r = FlexBuffers.getRoot(b);\n\n    assertThat(FlexBuffers.FBT_STRING).isEqualTo(r.getType());\n    assertThat(\"aa\").isEqualTo(r.asString());\n  }\n\n  @org.junit.Test\n  public void testSingleElementBlob() {\n    FlexBuffersBuilder builder = new FlexBuffersBuilder();\n    builder.putBlob(new byte[] {5, 124, 118, -1});\n    ByteBuffer b = builder.finish();\n    FlexBuffers.Reference r = FlexBuffers.getRoot(b);\n    byte[] result = r.asBlob().getBytes();\n    assertThat((byte) 5).isEqualTo(result[0]);\n    assertThat((byte) 124).isEqualTo(result[1]);\n    assertThat((byte) 118).isEqualTo(result[2]);\n    assertThat((byte) -1).isEqualTo(result[3]);\n  }\n\n  @org.junit.Test\n  public void testSingleElementLongBlob() {\n\n    // verifies blobs of up to 2^16 in length\n    for (int i = 2; i <= 1 << 16; i = i << 1) {\n      byte[] input = new byte[i - 1];\n      for (int index = 0; index < input.length; index++) {\n        input[index] = (byte) (index % 64);\n      }\n\n      FlexBuffersBuilder builder = new FlexBuffersBuilder();\n      builder.putBlob(input);\n      ByteBuffer b = builder.finish();\n      FlexBuffers.Reference r = FlexBuffers.getRoot(b);\n      byte[] result = r.asBlob().getBytes();\n\n      for (int index = 0; index < input.length; index++) {\n        assertThat((byte) (index % 64)).isEqualTo(result[index]);\n      }\n    }\n  }\n\n  @org.junit.Test\n  public void testSingleElementUByte() {\n    FlexBuffersBuilder builder = new FlexBuffersBuilder();\n    builder.putUInt(0xFF);\n    ByteBuffer b = builder.finish();\n    FlexBuffers.Reference r = FlexBuffers.getRoot(b);\n    assertThat(255).isEqualTo((int) r.asUInt());\n  }\n\n  @org.junit.Test\n  public void testSingleElementUShort() {\n    FlexBuffersBuilder builder = new FlexBuffersBuilder();\n    builder.putUInt(0xFFFF);\n    ByteBuffer b = builder.finish();\n    FlexBuffers.Reference r = FlexBuffers.getRoot(b);\n    assertThat(65535).isEqualTo((int) r.asUInt());\n  }\n\n  @org.junit.Test\n  public void testSingleElementUInt() {\n    FlexBuffersBuilder builder = new FlexBuffersBuilder();\n    builder.putUInt(0xFFFF_FFFFL);\n    ByteBuffer b = builder.finish();\n    FlexBuffers.Reference r = FlexBuffers.getRoot(b);\n    assertThat(4294967295L).isEqualTo(r.asUInt());\n  }\n\n  @org.junit.Test\n  public void testSingleFixedTypeVector() {\n\n    int[] ints = new int[] {5, 124, 118, -1};\n    float[] floats = new float[] {5.5f, 124.124f, 118.118f, -1.1f};\n    String[] strings = new String[] {\"This\", \"is\", \"a\", \"typed\", \"array\"};\n    boolean[] booleans = new boolean[] {false, true, true, false};\n\n    FlexBuffersBuilder builder =\n        new FlexBuffersBuilder(ByteBuffer.allocate(512), FlexBuffersBuilder.BUILDER_FLAG_NONE);\n\n    int mapPos = builder.startMap();\n\n    int vecPos = builder.startVector();\n    for (final int i : ints) {\n      builder.putInt(i);\n    }\n    builder.endVector(\"ints\", vecPos, true, false);\n\n    vecPos = builder.startVector();\n    for (final float i : floats) {\n      builder.putFloat(i);\n    }\n    builder.endVector(\"floats\", vecPos, true, false);\n\n    vecPos = builder.startVector();\n    for (final boolean i : booleans) {\n      builder.putBoolean(i);\n    }\n    builder.endVector(\"booleans\", vecPos, true, false);\n\n    builder.endMap(null, mapPos);\n\n    ByteBuffer b = builder.finish();\n    FlexBuffers.Reference r = FlexBuffers.getRoot(b);\n    assert (r.asMap().get(\"ints\").isTypedVector());\n    assert (r.asMap().get(\"floats\").isTypedVector());\n    assert (r.asMap().get(\"booleans\").isTypedVector());\n  }\n\n  @org.junit.Test\n  public void testSingleElementVector() {\n    FlexBuffersBuilder b = new FlexBuffersBuilder();\n\n    int vecPos = b.startVector();\n    b.putInt(99);\n    b.putString(\"wow\");\n    b.putNull();\n    int vecpos2 = b.startVector();\n    b.putInt(99);\n    b.putString(\"wow\");\n    b.putNull();\n    b.endVector(null, vecpos2, false, false);\n    b.endVector(null, vecPos, false, false);\n    b.finish();\n\n    FlexBuffers.Reference r = FlexBuffers.getRoot(b.getBuffer());\n    assertThat(FlexBuffers.FBT_VECTOR).isEqualTo(r.getType());\n    FlexBuffers.Vector vec = FlexBuffers.getRoot(b.getBuffer()).asVector();\n    assertThat(4).isEqualTo(vec.size());\n    assertThat(99).isEqualTo(vec.get(0).asInt());\n    assertThat(\"wow\").isEqualTo(vec.get(1).asString());\n    assertThat(true).isEqualTo(vec.get(2).isNull());\n    assertThat(\"[ 99, \\\"wow\\\", null ]\").isEqualTo(vec.get(3).toString());\n    assertThat(\"[ 99, \\\"wow\\\", null, [ 99, \\\"wow\\\", null ] ]\")\n        .isEqualTo(FlexBuffers.getRoot(b.getBuffer()).toString());\n  }\n\n  @org.junit.Test\n  public void testSingleElementMap() {\n    FlexBuffersBuilder b = new FlexBuffersBuilder();\n\n    int mapPost = b.startMap();\n    b.putInt(\"myInt\", 0x7fffffbbbfffffffL);\n    b.putString(\"myString\", \"wow\");\n    b.putString(\"myString2\", \"incredible\");\n    b.putNull(\"myNull\");\n    int start = b.startVector();\n    b.putInt(99);\n    b.putString(\"wow\");\n    b.endVector(\"myVec\", start, false, false);\n\n    b.putFloat(\"double\", 0x1.ffffbbbffffffP+1023);\n    b.endMap(null, mapPost);\n    b.finish();\n\n    FlexBuffers.Reference r = FlexBuffers.getRoot(b.getBuffer());\n    assertThat(FlexBuffers.FBT_MAP).isEqualTo(r.getType());\n    FlexBuffers.Map map = FlexBuffers.getRoot(b.getBuffer()).asMap();\n    assertThat(6).isEqualTo(map.size());\n    assertThat(0x7fffffbbbfffffffL).isEqualTo(map.get(\"myInt\").asLong());\n    assertThat(\"wow\").isEqualTo(map.get(\"myString\").asString());\n    assertThat(\"incredible\").isEqualTo(map.get(\"myString2\").asString());\n    assertThat(true).isEqualTo(map.get(\"myNull\").isNull());\n    assertThat(99).isEqualTo(map.get(\"myVec\").asVector().get(0).asInt());\n    assertThat(\"wow\").isEqualTo(map.get(\"myVec\").asVector().get(1).asString());\n    assertThat(Double.compare(0x1.ffffbbbffffffP+1023, map.get(\"double\").asFloat())).isEqualTo(0);\n    assertThat(\n            \"{ \\\"double\\\" : 1.7976894783391937E308, \\\"myInt\\\" : 9223371743723257855, \\\"myNull\\\" :\"\n                + \" null, \\\"myString\\\" : \\\"wow\\\", \\\"myString2\\\" : \\\"incredible\\\", \\\"myVec\\\" : [ 99,\"\n                + \" \\\"wow\\\" ] }\")\n        .isEqualTo(FlexBuffers.getRoot(b.getBuffer()).toString());\n  }\n\n  @org.junit.Test\n  public void testFlexBuferEmpty() {\n    FlexBuffers.Blob blob = FlexBuffers.Blob.empty();\n    FlexBuffers.Map ary = FlexBuffers.Map.empty();\n    FlexBuffers.Vector map = FlexBuffers.Vector.empty();\n    FlexBuffers.TypedVector typedAry = FlexBuffers.TypedVector.empty();\n    assertThat(blob.size()).isEqualTo(0);\n    assertThat(map.size()).isEqualTo(0);\n    assertThat(ary.size()).isEqualTo(0);\n    assertThat(typedAry.size()).isEqualTo(0);\n  }\n\n  @org.junit.Test\n  public void testHashMapToMap() {\n    int entriesCount = 12;\n\n    HashMap<String, String> source = new HashMap<>();\n    for (int i = 0; i < entriesCount; i++) {\n      source.put(\"foo_param_\" + i, \"foo_value_\" + i);\n    }\n\n    FlexBuffersBuilder builder = new FlexBuffersBuilder(1000);\n    int mapStart = builder.startMap();\n    for (Map.Entry<String, String> entry : source.entrySet()) {\n      builder.putString(entry.getKey(), entry.getValue());\n    }\n    builder.endMap(null, mapStart);\n    ByteBuffer bb = builder.finish();\n    bb.rewind();\n\n    FlexBuffers.Reference rootReference = FlexBuffers.getRoot(bb);\n\n    assertThat(rootReference.isMap()).isTrue();\n\n    FlexBuffers.Map flexMap = rootReference.asMap();\n\n    FlexBuffers.KeyVector keys = flexMap.keys();\n    FlexBuffers.Vector values = flexMap.values();\n\n    assertThat(entriesCount).isEqualTo(keys.size());\n    assertThat(entriesCount).isEqualTo(values.size());\n\n    HashMap<String, String> result = new HashMap<>();\n    for (int i = 0; i < keys.size(); i++) {\n      result.put(keys.get(i).toString(), values.get(i).asString());\n    }\n\n    assertThat(source).isEqualTo(result);\n  }\n\n  @org.junit.Test\n  public void testBuilderGrowth() {\n    FlexBuffersBuilder builder = new FlexBuffersBuilder();\n    String someString = \"This is a small string\";\n    builder.putString(someString);\n    ByteBuffer b = builder.finish();\n    assertThat(someString).isEqualTo(FlexBuffers.getRoot(b).asString());\n\n    FlexBuffersBuilder failBuilder = new FlexBuffersBuilder(ByteBuffer.allocate(1));\n    failBuilder.putString(someString);\n  }\n\n  @org.junit.Test\n  public void testFlexBuffersUtf8Map() {\n    FlexBuffersBuilder builder =\n        new FlexBuffersBuilder(\n            ByteBuffer.allocate(512), FlexBuffersBuilder.BUILDER_FLAG_SHARE_KEYS_AND_STRINGS);\n\n    String key0 = \"😨 face1\";\n    String key1 = \"😩 face2\";\n    String key2 = \"😨 face3\";\n    String key3 = \"trademark ®\";\n    String key4 = \"€ euro\";\n    String utf8keys[] = {\"😨 face1\", \"😩 face2\", \"😨 face3\", \"trademark ®\", \"€ euro\"};\n\n    int map = builder.startMap();\n\n    for (int i = 0; i < utf8keys.length; i++) {\n      builder.putString(utf8keys[i], utf8keys[i]); // Testing key and string reuse.\n    }\n    builder.endMap(null, map);\n    builder.finish();\n\n    FlexBuffers.Map m = FlexBuffers.getRoot(builder.getBuffer()).asMap();\n\n    assertThat(m.size()).isEqualTo(5);\n\n    KeyVector kv = m.keys();\n    for (int i = 0; i < utf8keys.length; i++) {\n      assertThat(kv.get(i).toString()).isEqualTo(m.get(i).asString());\n    }\n\n    assertThat(m.get(key0).asString()).isEqualTo(utf8keys[0]);\n    assertThat(m.get(key1).asString()).isEqualTo(utf8keys[1]);\n    assertThat(m.get(key2).asString()).isEqualTo(utf8keys[2]);\n    assertThat(m.get(key3).asString()).isEqualTo(utf8keys[3]);\n    assertThat(m.get(key4).asString()).isEqualTo(utf8keys[4]);\n  }\n\n  @org.junit.Test\n  public void testFlexBuffersMapLookup() {\n    FlexBuffersBuilder builder =\n        new FlexBuffersBuilder(\n            ByteBuffer.allocate(512), FlexBuffersBuilder.BUILDER_FLAG_SHARE_KEYS_AND_STRINGS);\n\n    String key0 = \"123\";\n    String key1 = \"1234\";\n    String key2 = \"12345\";\n    String[] keys = new String[] {key0, key1, key2};\n\n    int map = builder.startMap();\n\n    for (int i = 0; i < keys.length; i++) {\n      builder.putString(keys[i], keys[i]); // Testing key and string reuse.\n    }\n    builder.endMap(null, map);\n    builder.finish();\n\n    FlexBuffers.Map m = FlexBuffers.getRoot(builder.getBuffer()).asMap();\n    for (int i = 0; i < keys.length; i++) {\n      assertThat(m.get(keys[i]).asString()).isEqualTo(keys[i]);\n      assertThat(m.get(keys[i].getBytes(StandardCharsets.UTF_8)).asString()).isEqualTo(keys[i]);\n    }\n  }\n\n  @org.junit.Test\n  public void TestDictionaryLookup() {\n    FlatBufferBuilder fbb = new FlatBufferBuilder(16);\n    int lfIndex = LongFloatEntry.createLongFloatEntry(fbb, 0, 99);\n    int vectorEntriesIdx = LongFloatMap.createEntriesVector(fbb, new int[] {lfIndex});\n    int rootIdx = LongFloatMap.createLongFloatMap(fbb, vectorEntriesIdx);\n\n    LongFloatMap.finishLongFloatMapBuffer(fbb, rootIdx);\n    LongFloatMap map = LongFloatMap.getRootAsLongFloatMap(fbb.dataBuffer());\n    assertThat(map.entriesLength()).isEqualTo(1);\n\n    LongFloatEntry e = map.entries(0);\n    assertThat(e.key()).isEqualTo(0L);\n    assertThat(e.value()).isEqualTo(99.0f);\n\n    LongFloatEntry e2 = map.entriesByKey(0);\n    assertThat(e2.key()).isEqualTo(0L);\n    assertThat(e2.value()).isEqualTo(99.0f);\n  }\n\n  @org.junit.Test\n  public void TestVectorOfBytes() {\n    FlatBufferBuilder fbb = new FlatBufferBuilder(16);\n    int str = fbb.createString(\"ByteMonster\");\n    byte[] data = new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};\n    int offset = Monster.createInventoryVector(fbb, data);\n    Monster.startMonster(fbb);\n    Monster.addName(fbb, str);\n    Monster.addInventory(fbb, offset);\n    int monster1 = Monster.endMonster(fbb);\n    Monster.finishMonsterBuffer(fbb, monster1);\n    Monster monsterObject = Monster.getRootAsMonster(fbb.dataBuffer());\n\n    assertThat(monsterObject.inventoryLength()).isEqualTo(data.length);\n    assertThat((Integer) monsterObject.inventory(4)).isEqualTo((int) data[4]);\n    assertThat(ByteBuffer.wrap(data)).isEqualTo(monsterObject.inventoryAsByteBuffer());\n\n    fbb.clear();\n    ByteBuffer bb = ByteBuffer.wrap(data);\n    offset = fbb.createByteVector(bb);\n    str = fbb.createString(\"ByteMonster\");\n    Monster.startMonster(fbb);\n    Monster.addName(fbb, str);\n    Monster.addInventory(fbb, offset);\n    monster1 = Monster.endMonster(fbb);\n    Monster.finishMonsterBuffer(fbb, monster1);\n    Monster monsterObject2 = Monster.getRootAsMonster(fbb.dataBuffer());\n\n    assertThat(monsterObject2.inventoryLength()).isEqualTo(data.length);\n    for (int i = 0; i < data.length; i++) {\n      assertThat((Integer) monsterObject2.inventory(i)).isEqualTo((int) bb.get(i));\n    }\n\n    fbb.clear();\n    offset = fbb.createByteVector(data, 3, 4);\n    str = fbb.createString(\"ByteMonster\");\n    Monster.startMonster(fbb);\n    Monster.addName(fbb, str);\n    Monster.addInventory(fbb, offset);\n    monster1 = Monster.endMonster(fbb);\n    Monster.finishMonsterBuffer(fbb, monster1);\n    Monster monsterObject3 = Monster.getRootAsMonster(fbb.dataBuffer());\n\n    assertThat(monsterObject3.inventoryLength()).isEqualTo(4);\n    assertThat((Integer) monsterObject3.inventory(0)).isEqualTo((int) data[3]);\n\n    fbb.clear();\n    bb = ByteBuffer.wrap(data);\n    offset = Monster.createInventoryVector(fbb, bb);\n    str = fbb.createString(\"ByteMonster\");\n    Monster.startMonster(fbb);\n    Monster.addName(fbb, str);\n    Monster.addInventory(fbb, offset);\n    monster1 = Monster.endMonster(fbb);\n    Monster.finishMonsterBuffer(fbb, monster1);\n    Monster monsterObject4 = Monster.getRootAsMonster(fbb.dataBuffer());\n\n    assertThat(monsterObject4.inventoryLength()).isEqualTo(data.length);\n    assertThat((Integer) monsterObject4.inventory(8)).isEqualTo((int) 8);\n\n    fbb.clear();\n    byte[] largeData = new byte[1024];\n    offset = fbb.createByteVector(largeData);\n    str = fbb.createString(\"ByteMonster\");\n    Monster.startMonster(fbb);\n    Monster.addName(fbb, str);\n    Monster.addInventory(fbb, offset);\n    monster1 = Monster.endMonster(fbb);\n    Monster.finishMonsterBuffer(fbb, monster1);\n    Monster monsterObject5 = Monster.getRootAsMonster(fbb.dataBuffer());\n\n    assertThat(monsterObject5.inventoryLength()).isEqualTo(largeData.length);\n    assertThat((Integer) monsterObject5.inventory(25)).isEqualTo((int) largeData[25]);\n\n    fbb.clear();\n    bb = ByteBuffer.wrap(largeData);\n    bb.position(512);\n    ByteBuffer bb2 = bb.slice();\n    assertThat(bb2.arrayOffset()).isEqualTo(512);\n    offset = fbb.createByteVector(bb2);\n    str = fbb.createString(\"ByteMonster\");\n    Monster.startMonster(fbb);\n    Monster.addName(fbb, str);\n    Monster.addInventory(fbb, offset);\n    monster1 = Monster.endMonster(fbb);\n    Monster.finishMonsterBuffer(fbb, monster1);\n    Monster monsterObject6 = Monster.getRootAsMonster(fbb.dataBuffer());\n\n    assertThat(monsterObject6.inventoryLength()).isEqualTo(512);\n    assertThat((Integer) monsterObject6.inventory(0)).isEqualTo((int) largeData[512]);\n\n    fbb.clear();\n    bb = ByteBuffer.wrap(largeData);\n    bb.limit(256);\n    offset = fbb.createByteVector(bb);\n    str = fbb.createString(\"ByteMonster\");\n    Monster.startMonster(fbb);\n    Monster.addName(fbb, str);\n    Monster.addInventory(fbb, offset);\n    monster1 = Monster.endMonster(fbb);\n    Monster.finishMonsterBuffer(fbb, monster1);\n    Monster monsterObject7 = Monster.getRootAsMonster(fbb.dataBuffer());\n\n    assertThat(monsterObject7.inventoryLength()).isEqualTo(256);\n\n    fbb.clear();\n    bb = ByteBuffer.allocateDirect(2048);\n    offset = fbb.createByteVector(bb);\n    str = fbb.createString(\"ByteMonster\");\n    Monster.startMonster(fbb);\n    Monster.addName(fbb, str);\n    Monster.addInventory(fbb, offset);\n    monster1 = Monster.endMonster(fbb);\n    Monster.finishMonsterBuffer(fbb, monster1);\n    Monster monsterObject8 = Monster.getRootAsMonster(fbb.dataBuffer());\n\n    assertThat(monsterObject8.inventoryLength()).isEqualTo(2048);\n  }\n\n  @org.junit.Test\n  public void TestSharedStringPool() {\n    FlatBufferBuilder fb = new FlatBufferBuilder(1);\n    String testString = \"My string\";\n    int offset = fb.createSharedString(testString);\n    for (int i = 0; i < 10; i++) {\n      assertThat(offset).isEqualTo(fb.createSharedString(testString));\n    }\n  }\n\n  @org.junit.Test\n  public void TestScalarOptional() {\n    FlatBufferBuilder fbb = new FlatBufferBuilder(1);\n    ScalarStuff.startScalarStuff(fbb);\n    int pos = ScalarStuff.endScalarStuff(fbb);\n    fbb.finish(pos);\n\n    ScalarStuff scalarStuff = ScalarStuff.getRootAsScalarStuff(fbb.dataBuffer());\n    assertThat(scalarStuff.justI8()).isEqualTo((byte) 0);\n    assertThat(scalarStuff.maybeI8()).isEqualTo((byte) 0);\n    assertThat(scalarStuff.defaultI8()).isEqualTo((byte) 42);\n    assertThat(scalarStuff.justU8()).isEqualTo(0);\n    assertThat(scalarStuff.maybeU8()).isEqualTo(0);\n    assertThat(scalarStuff.defaultU8()).isEqualTo(42);\n    assertThat(scalarStuff.justI16()).isEqualTo((short) 0);\n    assertThat(scalarStuff.maybeI16()).isEqualTo((short) 0);\n    assertThat(scalarStuff.defaultI16()).isEqualTo((short) 42);\n    assertThat(scalarStuff.justU16()).isEqualTo(0);\n    assertThat(scalarStuff.maybeU16()).isEqualTo(0);\n    assertThat(scalarStuff.defaultU16()).isEqualTo(42);\n    assertThat(scalarStuff.justI32()).isEqualTo(0);\n    assertThat(scalarStuff.maybeI32()).isEqualTo(0);\n    assertThat(scalarStuff.defaultI32()).isEqualTo(42);\n    assertThat(scalarStuff.justU32()).isEqualTo(0L);\n    assertThat(scalarStuff.maybeU32()).isEqualTo(0L);\n    assertThat(scalarStuff.defaultU32()).isEqualTo(42L);\n    assertThat(scalarStuff.justI64()).isEqualTo(0L);\n    assertThat(scalarStuff.maybeI64()).isEqualTo(0L);\n    assertThat(scalarStuff.defaultI64()).isEqualTo(42L);\n    assertThat(scalarStuff.justU64()).isEqualTo(0L);\n    assertThat(scalarStuff.maybeU64()).isEqualTo(0L);\n    assertThat(scalarStuff.defaultU64()).isEqualTo(42L);\n    assertThat(scalarStuff.justF32()).isEqualTo(0.0f);\n    assertThat(scalarStuff.maybeF32()).isEqualTo(0f);\n    assertThat(scalarStuff.defaultF32()).isEqualTo(42.0f);\n    assertThat(scalarStuff.justF64()).isEqualTo(0.0);\n    assertThat(scalarStuff.maybeF64()).isEqualTo(0.0);\n    assertThat(scalarStuff.defaultF64()).isEqualTo(42.0);\n    assertThat(scalarStuff.justBool()).isFalse();\n    assertThat(scalarStuff.maybeBool()).isFalse();\n    assertThat(scalarStuff.defaultBool()).isTrue();\n    assertThat(scalarStuff.justEnum()).isEqualTo(OptionalByte.None);\n    assertThat(scalarStuff.maybeEnum()).isEqualTo(OptionalByte.None);\n    assertThat(scalarStuff.defaultEnum()).isEqualTo(OptionalByte.One);\n\n    assertThat(scalarStuff.hasMaybeI8()).isFalse();\n    assertThat(scalarStuff.hasMaybeI16()).isFalse();\n    assertThat(scalarStuff.hasMaybeI32()).isFalse();\n    assertThat(scalarStuff.hasMaybeI64()).isFalse();\n    assertThat(scalarStuff.hasMaybeU8()).isFalse();\n    assertThat(scalarStuff.hasMaybeU16()).isFalse();\n    assertThat(scalarStuff.hasMaybeU32()).isFalse();\n    assertThat(scalarStuff.hasMaybeU64()).isFalse();\n    assertThat(scalarStuff.hasMaybeF32()).isFalse();\n    assertThat(scalarStuff.hasMaybeF64()).isFalse();\n    assertThat(scalarStuff.hasMaybeBool()).isFalse();\n    assertThat(scalarStuff.hasMaybeEnum()).isFalse();\n\n    fbb.clear();\n\n    ScalarStuff.startScalarStuff(fbb);\n    ScalarStuff.addJustI8(fbb, (byte) 5);\n    ScalarStuff.addMaybeI8(fbb, (byte) 5);\n    ScalarStuff.addDefaultI8(fbb, (byte) 5);\n    ScalarStuff.addJustU8(fbb, 6);\n    ScalarStuff.addMaybeU8(fbb, 6);\n    ScalarStuff.addDefaultU8(fbb, 6);\n    ScalarStuff.addJustI16(fbb, (short) 7);\n    ScalarStuff.addMaybeI16(fbb, (short) 7);\n    ScalarStuff.addDefaultI16(fbb, (short) 7);\n    ScalarStuff.addJustU16(fbb, 8);\n    ScalarStuff.addMaybeU16(fbb, 8);\n    ScalarStuff.addDefaultU16(fbb, 8);\n    ScalarStuff.addJustI32(fbb, 9);\n    ScalarStuff.addMaybeI32(fbb, 9);\n    ScalarStuff.addDefaultI32(fbb, 9);\n    ScalarStuff.addJustU32(fbb, (long) 10);\n    ScalarStuff.addMaybeU32(fbb, (long) 10);\n    ScalarStuff.addDefaultU32(fbb, (long) 10);\n    ScalarStuff.addJustI64(fbb, 11L);\n    ScalarStuff.addMaybeI64(fbb, 11L);\n    ScalarStuff.addDefaultI64(fbb, 11L);\n    ScalarStuff.addJustU64(fbb, 12L);\n    ScalarStuff.addMaybeU64(fbb, 12L);\n    ScalarStuff.addDefaultU64(fbb, 12L);\n    ScalarStuff.addJustF32(fbb, 13.0f);\n    ScalarStuff.addMaybeF32(fbb, 13.0f);\n    ScalarStuff.addDefaultF32(fbb, 13.0f);\n    ScalarStuff.addJustF64(fbb, 14.0);\n    ScalarStuff.addMaybeF64(fbb, 14.0);\n    ScalarStuff.addDefaultF64(fbb, 14.0);\n    ScalarStuff.addJustBool(fbb, true);\n    ScalarStuff.addMaybeBool(fbb, true);\n    ScalarStuff.addDefaultBool(fbb, true);\n    ScalarStuff.addJustEnum(fbb, OptionalByte.Two);\n    ScalarStuff.addMaybeEnum(fbb, OptionalByte.Two);\n    ScalarStuff.addDefaultEnum(fbb, OptionalByte.Two);\n\n    pos = ScalarStuff.endScalarStuff(fbb);\n\n    fbb.finish(pos);\n\n    scalarStuff = ScalarStuff.getRootAsScalarStuff(fbb.dataBuffer());\n\n    assertThat(scalarStuff.justI8()).isEqualTo((byte) 5);\n    assertThat(scalarStuff.maybeI8()).isEqualTo((byte) 5);\n    assertThat(scalarStuff.defaultI8()).isEqualTo((byte) 5);\n    assertThat(scalarStuff.justU8()).isEqualTo(6);\n    assertThat(scalarStuff.maybeU8()).isEqualTo(6);\n    assertThat(scalarStuff.defaultU8()).isEqualTo(6);\n    assertThat(scalarStuff.justI16()).isEqualTo((short) 7);\n    assertThat(scalarStuff.maybeI16()).isEqualTo((short) 7);\n    assertThat(scalarStuff.defaultI16()).isEqualTo((short) 7);\n    assertThat(scalarStuff.justU16()).isEqualTo(8);\n    assertThat(scalarStuff.maybeU16()).isEqualTo(8);\n    assertThat(scalarStuff.defaultU16()).isEqualTo(8);\n    assertThat(scalarStuff.justI32()).isEqualTo(9);\n    assertThat(scalarStuff.maybeI32()).isEqualTo(9);\n    assertThat(scalarStuff.defaultI32()).isEqualTo(9);\n    assertThat(scalarStuff.justU32()).isEqualTo(10L);\n    assertThat(scalarStuff.maybeU32()).isEqualTo(10L);\n    assertThat(scalarStuff.defaultU32()).isEqualTo(10L);\n    assertThat(scalarStuff.justI64()).isEqualTo(11L);\n    assertThat(scalarStuff.maybeI64()).isEqualTo(11L);\n    assertThat(scalarStuff.defaultI64()).isEqualTo(11L);\n    assertThat(scalarStuff.justU64()).isEqualTo(12L);\n    assertThat(scalarStuff.maybeU64()).isEqualTo(12L);\n    assertThat(scalarStuff.defaultU64()).isEqualTo(12L);\n    assertThat(scalarStuff.justF32()).isEqualTo(13.0f);\n    assertThat(scalarStuff.maybeF32()).isEqualTo(13.0f);\n    assertThat(scalarStuff.defaultF32()).isEqualTo(13.0f);\n    assertThat(scalarStuff.justF64()).isEqualTo(14.0);\n    assertThat(scalarStuff.maybeF64()).isEqualTo(14.0);\n    assertThat(scalarStuff.defaultF64()).isEqualTo(14.0);\n    assertThat(scalarStuff.justBool()).isTrue();\n    assertThat(scalarStuff.maybeBool()).isTrue();\n    assertThat(scalarStuff.defaultBool()).isTrue();\n    assertThat(scalarStuff.justEnum()).isEqualTo(OptionalByte.Two);\n    assertThat(scalarStuff.maybeEnum()).isEqualTo(OptionalByte.Two);\n    assertThat(scalarStuff.defaultEnum()).isEqualTo(OptionalByte.Two);\n\n    assertThat(scalarStuff.hasMaybeI8()).isTrue();\n    assertThat(scalarStuff.hasMaybeI16()).isTrue();\n    assertThat(scalarStuff.hasMaybeI32()).isTrue();\n    assertThat(scalarStuff.hasMaybeI64()).isTrue();\n    assertThat(scalarStuff.hasMaybeU8()).isTrue();\n    assertThat(scalarStuff.hasMaybeU16()).isTrue();\n    assertThat(scalarStuff.hasMaybeU32()).isTrue();\n    assertThat(scalarStuff.hasMaybeU64()).isTrue();\n    assertThat(scalarStuff.hasMaybeF32()).isTrue();\n    assertThat(scalarStuff.hasMaybeF64()).isTrue();\n    assertThat(scalarStuff.hasMaybeBool()).isTrue();\n    assertThat(scalarStuff.hasMaybeEnum()).isTrue();\n  }\n\n  static void TestObject(MonsterT monster) {\n    assertThat(monster.getHp()).isEqualTo((short) 80);\n    // default\n    assertThat(monster.getMana()).isEqualTo((short) 150);\n\n    assertThat(monster.getName()).isEqualTo(\"MyMonster\");\n    assertThat(monster.getColor()).isEqualTo((Integer) Color.Blue);\n    // monster.friendly() // can't access, deprecated\n\n    Vec3T pos = monster.getPos();\n    assertThat(pos.getX()).isEqualTo(1.0f);\n    assertThat(pos.getY()).isEqualTo(2.0f);\n    assertThat(pos.getZ()).isEqualTo(3.0f);\n    assertThat(pos.getTest1()).isEqualTo(3.0);\n    // issue: int != byte\n    assertThat(pos.getTest2()).isEqualTo((int) Color.Green);\n    TestT t = pos.getTest3();\n    assertThat(t.getA()).isEqualTo((short) 5);\n    assertThat(t.getB()).isEqualTo((byte) 6);\n\n    assertThat(monster.getTest().getType()).isEqualTo((byte) Any.Monster);\n    MonsterT monster2 = (MonsterT) monster.getTest().getValue();\n    assertThat(monster2 != null).isTrue();\n    assertThat(monster2.getName()).isEqualTo(\"Fred\");\n\n    int[] inv = monster.getInventory();\n    assertThat(inv.length).isEqualTo(5);\n    int[] expInv = {0, 1, 2, 3, 4};\n    for (int i = 0; i < inv.length; i++) assertThat(expInv[i]).isEqualTo(inv[i]);\n\n    TestT[] test4 = monster.getTest4();\n    TestT test_0 = test4[0];\n    TestT test_1 = test4[1];\n    assertThat(test4.length).isEqualTo(2);\n    assertThat(test_0.getA()).isEqualTo((short) 10);\n    assertThat(test_0.getB()).isEqualTo((byte) 20);\n    assertThat(test_1.getA()).isEqualTo((short) 30);\n    assertThat(test_1.getB()).isEqualTo((byte) 40);\n\n    String[] testarrayofstring = monster.getTestarrayofstring();\n    assertThat(testarrayofstring.length).isEqualTo(2);\n    assertThat(testarrayofstring[0]).isEqualTo(\"test1\");\n    assertThat(testarrayofstring[1]).isEqualTo(\"test2\");\n\n    MonsterT[] testarrayoftables = monster.getTestarrayoftables();\n    assertThat(testarrayoftables.length).isEqualTo(0);\n\n    MonsterT enemy = monster.getEnemy();\n    assertThat(enemy != null).isTrue();\n    assertThat(enemy.getName()).isEqualTo(\"Fred\");\n\n    int[] testnestedflatbuffer = monster.getTestnestedflatbuffer();\n    assertThat(testnestedflatbuffer.length).isEqualTo(0);\n\n    assertThat(monster.getTestempty() == null).isTrue();\n\n    assertThat(monster.getTestbool()).isTrue();\n\n    boolean[] testarrayofbools = monster.getTestarrayofbools();\n    assertThat(testarrayofbools.length).isEqualTo(3);\n    assertThat(testarrayofbools[0]).isTrue();\n    assertThat(testarrayofbools[1]).isFalse();\n    assertThat(testarrayofbools[2]).isTrue();\n\n    assertThat(monster.getTestf()).isEqualTo(3.14159f);\n    assertThat(monster.getTestf2()).isEqualTo(3.0f);\n    assertThat(monster.getTestf3()).isEqualTo(0.0f);\n    assertThat(monster.getTestf3()).isEqualTo(0.0f);\n\n    AbilityT[] testarrayofsortedstruct = monster.getTestarrayofsortedstruct();\n    assertThat(testarrayofsortedstruct.length).isEqualTo(3);\n    assertThat(testarrayofsortedstruct[0].getId()).isEqualTo((long) 0);\n    assertThat(testarrayofsortedstruct[1].getId()).isEqualTo((long) 1);\n    assertThat(testarrayofsortedstruct[2].getId()).isEqualTo((long) 5);\n    assertThat(testarrayofsortedstruct[0].getDistance()).isEqualTo((long) 45);\n    assertThat(testarrayofsortedstruct[1].getDistance()).isEqualTo((long) 21);\n    assertThat(testarrayofsortedstruct[2].getDistance()).isEqualTo((long) 12);\n\n    int[] flex = monster.getFlex();\n    assertThat(flex.length).isEqualTo(0);\n\n    long[] vectorOfLongs = monster.getVectorOfLongs();\n    assertThat(vectorOfLongs.length).isEqualTo(5);\n    long l = 1;\n    for (int i = 0; i < vectorOfLongs.length; i++) {\n      assertThat(vectorOfLongs[i]).isEqualTo(l);\n      l *= 100;\n    }\n\n    double[] vectorOfDoubles = monster.getVectorOfDoubles();\n    assertThat(vectorOfDoubles.length).isEqualTo(3);\n    assertThat(vectorOfDoubles[0]).isEqualTo(-1.7976931348623157E308);\n    assertThat(vectorOfDoubles[1]).isEqualTo(0.0);\n    assertThat(vectorOfDoubles[2]).isEqualTo(1.7976931348623157E308);\n\n    assertThat(monster.getParentNamespaceTest() == null).isTrue();\n    ReferrableT[] vectorOfReferrables = monster.getVectorOfReferrables();\n    assertThat(vectorOfReferrables.length).isEqualTo(0);\n\n    assertThat(monster.getSignedEnum()).isEqualTo((byte) -1);\n  }\n\n  static void TestPackUnpack(ByteBuffer bb) {\n    Monster m = Monster.getRootAsMonster(bb);\n    MonsterT mObject = m.unpack();\n    TestObject(mObject);\n    FlatBufferBuilder fbb = new FlatBufferBuilder();\n    int monster = Monster.pack(fbb, mObject);\n    Monster.finishMonsterBuffer(fbb, monster);\n    TestBuffer(fbb.dataBuffer());\n\n    byte[] bytes = mObject.serializeToBinary();\n    MonsterT newMonsterT = MonsterT.deserializeFromBinary(bytes);\n    TestObject(newMonsterT);\n  }\n}\n"
  },
  {
    "path": "js/README.md",
    "content": "This folder is intentionally empty and will contain transpiled js modules in Common JS format after compiling with tsc.\n"
  },
  {
    "path": "kotlin/benchmark/build.gradle.kts",
    "content": "import groovy.xml.XmlParser\n\nplugins {\n  kotlin(\"multiplatform\")\n  id(\"org.jetbrains.kotlinx.benchmark\")\n  id(\"io.morethan.jmhreport\")\n  id(\"de.undercouch.download\")\n}\n\ngroup = \"com.google.flatbuffers.jmh\"\n\nversion = \"2.0.0-SNAPSHOT\"\n\n// Reads latest version from Java's runtime pom.xml,\n// so we can use it for benchmarking against Kotlin's\n// runtime\nfun readJavaFlatBufferVersion(): String {\n  val pom = XmlParser().parse(File(\"../java/pom.xml\"))\n  val versionTag =\n    pom.children().find {\n      val node = it as groovy.util.Node\n      node.name().toString().contains(\"version\")\n    } as groovy.util.Node\n  return versionTag.value().toString()\n}\n\n// This plugin generates a static html page with the aggregation\n// of all benchmarks ran. very useful visualization tool.\njmhReport {\n  val baseFolder = project.file(\"build/reports/benchmarks/main\").absolutePath\n  val lastFolder = project.file(baseFolder).list()?.sortedArray()?.lastOrNull() ?: \"\"\n  jmhResultPath = \"$baseFolder/$lastFolder/jvm.json\"\n  jmhReportOutput = \"$baseFolder/$lastFolder\"\n}\n\n// For now we benchmark on JVM only\nbenchmark {\n  configurations {\n    this.getByName(\"main\") {\n      iterations = 5\n      iterationTime = 300\n      iterationTimeUnit = \"ms\"\n      // uncomment for benchmarking JSON op only\n      include(\".*FlatbufferBenchmark.*\")\n    }\n  }\n  targets { register(\"jvm\") }\n}\n\nkotlin {\n  jvm {\n    compilations {\n      val main by getting {}\n      // custom benchmark compilation\n      val benchmarks by\n        compilations.creating {\n          defaultSourceSet {\n            dependencies {\n              // Compile against the main compilation's compile classpath and outputs:\n              implementation(main.compileDependencyFiles + main.output.classesDirs)\n            }\n          }\n        }\n    }\n  }\n\n  sourceSets {\n    val jvmMain by getting {\n      dependencies {\n        implementation(kotlin(\"stdlib-common\"))\n        implementation(project(\":flatbuffers-kotlin\"))\n        implementation(libs.kotlinx.benchmark.runtime)\n        // json serializers\n        implementation(libs.moshi.kotlin)\n        implementation(libs.gson)\n      }\n      kotlin.srcDir(\"src/jvmMain/generated/kotlin/\")\n      kotlin.srcDir(\"src/jvmMain/generated/java/\")\n      kotlin.srcDir(\"../../java/src/main/java\")\n    }\n  }\n}\n\n// This task download all JSON files used for benchmarking\ntasks.register<de.undercouch.gradle.tasks.download.Download>(\"downloadMultipleFiles\") {\n  // We are downloading json benchmark samples from serdes-rs project.\n  // see: https://github.com/serde-rs/json-benchmark/blob/master/data\n  val baseUrl = \"https://github.com/serde-rs/json-benchmark/raw/master/data/\"\n  src(listOf(\"$baseUrl/canada.json\", \"$baseUrl/twitter.json\", \"$baseUrl/citm_catalog.json\"))\n  dest(File(\"${project.projectDir.absolutePath}/src/jvmMain/resources\"))\n  overwrite(false)\n}\n\nabstract class GenerateFBTestClasses : DefaultTask() {\n  @get:InputFiles abstract val inputFiles: ConfigurableFileCollection\n\n  @get:Input abstract val includeFolder: Property<String>\n\n  @get:Input abstract val outputFolder: Property<String>\n\n  @get:Input abstract val variants: ListProperty<String>\n\n  @Inject\n  protected open fun getExecActionFactory(): org.gradle.process.internal.ExecActionFactory? {\n    throw UnsupportedOperationException()\n  }\n\n  init {\n    includeFolder.set(\"\")\n  }\n\n  @TaskAction\n  fun compile() {\n    val execAction = getExecActionFactory()!!.newExecAction()\n    val sources = inputFiles.asPath.split(\":\")\n    val langs = variants.get().map { \"--$it\" }\n    val args = mutableListOf(\"flatc\", \"-o\", outputFolder.get(), *langs.toTypedArray())\n    if (includeFolder.get().isNotEmpty()) {\n      args.add(\"-I\")\n      args.add(includeFolder.get())\n    }\n    args.addAll(sources)\n    println(args)\n    execAction.commandLine = args\n    print(execAction.execute())\n  }\n}\n\n// Use the default greeting\ntasks.register<GenerateFBTestClasses>(\"generateFBTestClassesKt\") {\n  inputFiles.setFrom(\"$projectDir/monster_test_kotlin.fbs\")\n  includeFolder.set(\"$rootDir/../tests/include_test\")\n  outputFolder.set(\"${projectDir}/src/jvmMain/generated/kotlin/\")\n  variants.addAll(\"kotlin-kmp\")\n}\n\ntasks.register<GenerateFBTestClasses>(\"generateFBTestClassesJava\") {\n  inputFiles.setFrom(\"$projectDir/monster_test_java.fbs\")\n  includeFolder.set(\"$rootDir/../tests/include_test\")\n  outputFolder.set(\"${projectDir}/src/jvmMain/generated/java/\")\n  variants.addAll(\"kotlin\")\n}\n\nproject.tasks.forEach {\n  if (it.name.contains(\"compileKotlin\")) {\n    it.dependsOn(\"generateFBTestClassesKt\")\n    it.dependsOn(\"generateFBTestClassesJava\")\n  }\n}\n"
  },
  {
    "path": "kotlin/benchmark/monster_test_java.fbs",
    "content": "// Example IDL file for our monster's schema.\n\nnamespace jmonster;\n\nenum JColor:byte { Red = 0, Green, Blue = 2 }\n\nunion JEquipment { JWeapon } // Optionally add more tables.\n\nstruct JVec3 {\n  x:float;\n  y:float;\n  z:float;\n}\n\ntable JMonster {\n  pos:JVec3;\n  mana:short = 150;\n  hp:short = 100;\n  name:string;\n  friendly:bool = false (deprecated);\n  inventory:[ubyte];\n  color:JColor = Blue;\n  weapons:[JWeapon];\n  equipped:JEquipment;\n  path:[JVec3];\n}\n\ntable JWeapon {\n  name:string;\n  damage:short;\n}\n\ntable JAllMonsters {\n   monsters: [JMonster];\n}\n\nroot_type JAllMonsters;\n"
  },
  {
    "path": "kotlin/benchmark/monster_test_kotlin.fbs",
    "content": "// Example IDL file for our monster's schema.\n\nnamespace monster;\n\nenum Color:byte { Red = 0, Green, Blue = 2 }\n\nunion Equipment { Weapon } // Optionally add more tables.\n\nstruct Vec3 {\n  x:float;\n  y:float;\n  z:float;\n}\n\ntable Monster {\n  pos:Vec3;\n  mana:short = 150;\n  hp:short = 100;\n  name:string;\n  friendly:bool = false (deprecated);\n  inventory:[ubyte];\n  color:Color = Blue;\n  weapons:[Weapon];\n  equipped:Equipment;\n  path:[Vec3];\n}\n\ntable Weapon {\n  name:string;\n  damage:short;\n}\n\ntable AllMonsters {\n   monsters: [Monster];\n}\n\nroot_type AllMonsters;\n"
  },
  {
    "path": "kotlin/benchmark/src/jvmMain/kotlin/com/google/flatbuffers/kotlin/benchmark/FlatbufferBenchmark.kt",
    "content": "@file:OptIn(ExperimentalUnsignedTypes::class)\n\npackage com.google.flatbuffers.kotlin.benchmark\n\nimport com.google.flatbuffers.kotlin.FlatBufferBuilder\nimport java.util.concurrent.TimeUnit\nimport jmonster.JAllMonsters\nimport jmonster.JColor\nimport jmonster.JMonster\nimport jmonster.JVec3\nimport monster.AllMonsters\nimport monster.AllMonsters.Companion.createAllMonsters\nimport monster.AllMonsters.Companion.createMonstersVector\nimport monster.Monster\nimport monster.Monster.Companion.createInventoryVector\nimport monster.MonsterOffsetArray\nimport monster.Vec3\nimport org.openjdk.jmh.annotations.*\nimport org.openjdk.jmh.infra.Blackhole\n\n@State(Scope.Benchmark)\n@BenchmarkMode(Mode.AverageTime)\n@OutputTimeUnit(TimeUnit.NANOSECONDS)\n@Measurement(iterations = 20, time = 1, timeUnit = TimeUnit.NANOSECONDS)\nopen class FlatbufferBenchmark {\n\n  val repetition = 1000000\n  val fbKotlin = FlatBufferBuilder(1024 * repetition)\n  val fbDeserializationKotlin = FlatBufferBuilder(1024 * repetition)\n  val fbJava = com.google.flatbuffers.FlatBufferBuilder(1024 * repetition)\n  val fbDeserializationJava = com.google.flatbuffers.FlatBufferBuilder(1024 * repetition)\n\n  init {\n    populateMosterKotlin(fbDeserializationKotlin)\n    populateMosterJava(fbDeserializationJava)\n  }\n\n  @OptIn(ExperimentalUnsignedTypes::class)\n  private fun populateMosterKotlin(fb: FlatBufferBuilder) {\n    fb.clear()\n    val monsterName = fb.createString(\"MonsterName\")\n    val items = ubyteArrayOf(0u, 1u, 2u, 3u, 4u)\n    val inv = createInventoryVector(fb, items)\n    val monsterOffsets: MonsterOffsetArray =\n      MonsterOffsetArray(repetition) {\n        Monster.startMonster(fb)\n        Monster.addName(fb, monsterName)\n        Monster.addPos(fb, Vec3.createVec3(fb, 1.0f, 2.0f, 3.0f))\n        Monster.addHp(fb, 80)\n        Monster.addMana(fb, 150)\n        Monster.addInventory(fb, inv)\n        Monster.addColor(fb, monster.Color.Red)\n        Monster.endMonster(fb)\n      }\n    val monsters = createMonstersVector(fb, monsterOffsets)\n    val allMonsters = createAllMonsters(fb, monsters)\n    fb.finish(allMonsters)\n  }\n\n  @OptIn(ExperimentalUnsignedTypes::class)\n  private fun populateMosterJava(fb: com.google.flatbuffers.FlatBufferBuilder) {\n    fb.clear()\n    val monsterName = fb.createString(\"MonsterName\")\n    val inv = JMonster.createInventoryVector(fb, ubyteArrayOf(0u, 1u, 2u, 3u, 4u))\n    val monsters =\n      JAllMonsters.createMonstersVector(\n        fb,\n        IntArray(repetition) {\n          JMonster.startJMonster(fb)\n          JMonster.addName(fb, monsterName)\n          JMonster.addPos(fb, JVec3.createJVec3(fb, 1.0f, 2.0f, 3.0f))\n          JMonster.addHp(fb, 80)\n          JMonster.addMana(fb, 150)\n          JMonster.addInventory(fb, inv)\n          JMonster.addColor(fb, JColor.Red)\n          JMonster.endJMonster(fb)\n        },\n      )\n    val allMonsters = JAllMonsters.createJAllMonsters(fb, monsters)\n    fb.finish(allMonsters)\n  }\n\n  @Benchmark\n  fun monstersSerializationKotlin() {\n    populateMosterKotlin(fbKotlin)\n  }\n\n  @OptIn(ExperimentalUnsignedTypes::class)\n  @Benchmark\n  fun monstersDeserializationKotlin(hole: Blackhole) {\n    val monstersRef = AllMonsters.asRoot(fbDeserializationKotlin.dataBuffer())\n\n    for (i in 0 until monstersRef.monstersLength) {\n      val monster = monstersRef.monsters(i)!!\n      val pos = monster.pos!!\n      hole.consume(monster.name)\n      hole.consume(pos.x)\n      hole.consume(pos.y)\n      hole.consume(pos.z)\n      hole.consume(monster.hp)\n      hole.consume(monster.mana)\n      hole.consume(monster.color)\n      hole.consume(monster.inventory(0).toByte())\n      hole.consume(monster.inventory(1))\n      hole.consume(monster.inventory(2))\n      hole.consume(monster.inventory(3))\n    }\n  }\n\n  @Benchmark\n  fun monstersSerializationJava() {\n    populateMosterJava(fbJava)\n  }\n\n  @Benchmark\n  fun monstersDeserializationJava(hole: Blackhole) {\n    val monstersRef = JAllMonsters.getRootAsJAllMonsters(fbDeserializationJava.dataBuffer())\n\n    for (i in 0 until monstersRef.monstersLength) {\n      val monster = monstersRef.monsters(i)!!\n      val pos = monster.pos!!\n      hole.consume(monster.name)\n      hole.consume(pos.x)\n      hole.consume(pos.y)\n      hole.consume(pos.z)\n      hole.consume(monster.hp)\n      hole.consume(monster.mana)\n      hole.consume(monster.color)\n      hole.consume(monster.inventory(0))\n      hole.consume(monster.inventory(1))\n      hole.consume(monster.inventory(2))\n      hole.consume(monster.inventory(3))\n    }\n  }\n}\n"
  },
  {
    "path": "kotlin/benchmark/src/jvmMain/kotlin/com/google/flatbuffers/kotlin/benchmark/FlexBuffersBenchmark.kt",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n@file:OptIn(ExperimentalUnsignedTypes::class)\n\npackage com.google.flatbuffers.kotlin.benchmark\n\nimport com.google.flatbuffers.ArrayReadWriteBuf\nimport com.google.flatbuffers.FlexBuffers\nimport com.google.flatbuffers.FlexBuffersBuilder.BUILDER_FLAG_SHARE_ALL\nimport com.google.flatbuffers.kotlin.FlexBuffersBuilder\nimport com.google.flatbuffers.kotlin.getRoot\nimport java.util.concurrent.TimeUnit\nimport kotlinx.benchmark.Blackhole\nimport org.openjdk.jmh.annotations.Benchmark\nimport org.openjdk.jmh.annotations.BenchmarkMode\nimport org.openjdk.jmh.annotations.Measurement\nimport org.openjdk.jmh.annotations.Mode\nimport org.openjdk.jmh.annotations.OutputTimeUnit\nimport org.openjdk.jmh.annotations.Scope\nimport org.openjdk.jmh.annotations.Setup\nimport org.openjdk.jmh.annotations.State\n\n@State(Scope.Benchmark)\n@BenchmarkMode(Mode.AverageTime)\n@OutputTimeUnit(TimeUnit.NANOSECONDS)\n@Measurement(iterations = 20, time = 1, timeUnit = TimeUnit.NANOSECONDS)\nopen class FlexBuffersBenchmark {\n\n  var initialCapacity = 1024\n  var value: Double = 0.0\n  val stringKey = Array(500) { \"Ḧ̵̘́ȩ̵̐myFairlyBigKey$it\" }\n  val stringValue = Array(500) { \"Ḧ̵̘́ȩ̵̐myFairlyBigValue$it\" }\n  val bigIntArray = IntArray(5000) { it }\n\n  @Setup\n  fun setUp() {\n    value = 3.0\n  }\n\n  @Benchmark\n  open fun mapKotlin(blackhole: Blackhole) {\n    val kBuilder = FlexBuffersBuilder(initialCapacity, FlexBuffersBuilder.SHARE_KEYS_AND_STRINGS)\n    kBuilder.putMap {\n      this[\"hello\"] = \"world\"\n      this[\"int\"] = 10\n      this[\"float\"] = 12.3\n      this[\"intarray\"] = bigIntArray\n      this.putMap(\"myMap\") { this[\"cool\"] = \"beans\" }\n    }\n    val ref = getRoot(kBuilder.finish())\n    val map = ref.toMap()\n    blackhole.consume(map.size)\n    blackhole.consume(map[\"hello\"].toString())\n    blackhole.consume(map[\"int\"].toInt())\n    blackhole.consume(map[\"float\"].toDouble())\n    blackhole.consume(map[\"intarray\"].toIntArray())\n    blackhole.consume(ref[\"myMap\"][\"cool\"].toString())\n    blackhole.consume(ref[\"invalid_key\"].isNull)\n  }\n\n  @Benchmark\n  open fun mapJava(blackhole: Blackhole) {\n    val jBuilder =\n      com.google.flatbuffers.FlexBuffersBuilder(\n        ArrayReadWriteBuf(initialCapacity),\n        BUILDER_FLAG_SHARE_ALL,\n      )\n    val startMap = jBuilder.startMap()\n    jBuilder.putString(\"hello\", \"world\")\n    jBuilder.putInt(\"int\", 10)\n    jBuilder.putFloat(\"float\", 12.3)\n\n    val startVec = jBuilder.startVector()\n    bigIntArray.forEach { jBuilder.putInt(it) }\n    jBuilder.endVector(\"intarray\", startVec, true, false)\n\n    val startInnerMap = jBuilder.startMap()\n    jBuilder.putString(\"cool\", \"beans\")\n    jBuilder.endMap(\"myMap\", startInnerMap)\n\n    jBuilder.endMap(null, startMap)\n    val ref = FlexBuffers.getRoot(jBuilder.finish())\n    val map = ref.asMap()\n    blackhole.consume(map.size())\n    blackhole.consume(map.get(\"hello\").toString())\n    blackhole.consume(map.get(\"int\").asInt())\n    blackhole.consume(map.get(\"float\").asFloat())\n    val vec = map.get(\"intarray\").asVector()\n    blackhole.consume(IntArray(vec.size()) { vec.get(it).asInt() })\n\n    blackhole.consume(ref.asMap()[\"myMap\"].asMap()[\"cool\"].toString())\n    blackhole.consume(ref.asMap()[\"invalid_key\"].isNull)\n  }\n\n  @Benchmark\n  open fun intArrayKotlin(blackhole: Blackhole) {\n    val kBuilder = FlexBuffersBuilder(initialCapacity, FlexBuffersBuilder.SHARE_KEYS_AND_STRINGS)\n    kBuilder.put(bigIntArray)\n    val root = getRoot(kBuilder.finish())\n    blackhole.consume(root.toIntArray())\n  }\n\n  @Benchmark\n  open fun intArrayJava(blackhole: Blackhole) {\n    val jBuilder =\n      com.google.flatbuffers.FlexBuffersBuilder(\n        ArrayReadWriteBuf(initialCapacity),\n        BUILDER_FLAG_SHARE_ALL,\n      )\n    val v = jBuilder.startVector()\n    bigIntArray.forEach { jBuilder.putInt(it) }\n    jBuilder.endVector(null, v, true, false)\n    jBuilder.finish()\n    val root = FlexBuffers.getRoot(jBuilder.buffer)\n    val vec = root.asVector()\n    blackhole.consume(IntArray(vec.size()) { vec[it].asInt() })\n  }\n\n  @Benchmark\n  open fun stringArrayKotlin(blackhole: Blackhole) {\n    val kBuilder = FlexBuffersBuilder(initialCapacity, FlexBuffersBuilder.SHARE_KEYS_AND_STRINGS)\n    kBuilder.putVector { stringValue.forEach { kBuilder.put(it) } }\n    kBuilder.finish()\n    val root = getRoot(kBuilder.buffer)\n    val vec = root.toVector()\n    blackhole.consume(Array(vec.size) { vec[it].toString() })\n  }\n\n  @Benchmark\n  open fun stringArrayJava(blackhole: Blackhole) {\n    val jBuilder =\n      com.google.flatbuffers.FlexBuffersBuilder(\n        ArrayReadWriteBuf(initialCapacity),\n        BUILDER_FLAG_SHARE_ALL,\n      )\n    val v = jBuilder.startVector()\n    stringValue.forEach { jBuilder.putString(it) }\n    jBuilder.endVector(null, v, false, false)\n    jBuilder.finish()\n    val root = FlexBuffers.getRoot(jBuilder.buffer)\n    val vec = root.asVector()\n    blackhole.consume(Array(vec.size()) { vec[it].toString() })\n  }\n\n  @Benchmark\n  open fun stringMapKotlin(blackhole: Blackhole) {\n    val kBuilder = FlexBuffersBuilder(initialCapacity, FlexBuffersBuilder.SHARE_KEYS_AND_STRINGS)\n    val pos = kBuilder.startMap()\n    for (i in stringKey.indices) {\n      kBuilder[stringKey[i]] = stringValue[i]\n    }\n    kBuilder.endMap(pos)\n    val ref = getRoot(kBuilder.finish())\n    val map = ref.toMap()\n    val keys = map.keys\n\n    for (key in keys) {\n      blackhole.consume(map[key.toString()].toString())\n    }\n  }\n\n  @Benchmark\n  open fun stringMapBytIndexKotlin(blackhole: Blackhole) {\n    val kBuilder = FlexBuffersBuilder(initialCapacity, FlexBuffersBuilder.SHARE_KEYS_AND_STRINGS)\n    val pos = kBuilder.startMap()\n    for (i in stringKey.indices) {\n      kBuilder[stringKey[i]] = stringValue[i]\n    }\n    kBuilder.endMap(pos)\n    val ref = getRoot(kBuilder.finish())\n    val map = ref.toMap()\n    for (index in 0 until map.size) {\n      blackhole.consume(map[index].toString())\n    }\n  }\n\n  @Benchmark\n  open fun stringMapJava(blackhole: Blackhole) {\n    val jBuilder =\n      com.google.flatbuffers.FlexBuffersBuilder(\n        ArrayReadWriteBuf(initialCapacity),\n        BUILDER_FLAG_SHARE_ALL,\n      )\n    val v = jBuilder.startMap()\n    for (i in stringKey.indices) {\n      jBuilder.putString(stringKey[i], stringValue[i])\n    }\n    jBuilder.endMap(null, v)\n    val ref = FlexBuffers.getRoot(jBuilder.finish())\n    val map = ref.asMap()\n    val keyVec = map.keys()\n    for (i in 0 until keyVec.size()) {\n      val s = keyVec[i].toString()\n      blackhole.consume(map[s].toString())\n    }\n  }\n}\n"
  },
  {
    "path": "kotlin/benchmark/src/jvmMain/kotlin/com/google/flatbuffers/kotlin/benchmark/JsonBenchmark.kt",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.google.flatbuffers.kotlin.benchmark\n\nimport com.google.flatbuffers.kotlin.ArrayReadBuffer\nimport com.google.flatbuffers.kotlin.JSONParser\nimport com.google.flatbuffers.kotlin.Reference\nimport com.google.flatbuffers.kotlin.toJson\nimport com.google.gson.Gson\nimport com.google.gson.JsonObject\nimport com.google.gson.JsonParser\nimport com.squareup.moshi.Moshi\nimport com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory\nimport java.io.ByteArrayInputStream\nimport java.io.InputStreamReader\nimport java.util.concurrent.TimeUnit\nimport kotlinx.benchmark.Blackhole\nimport okio.Buffer\nimport org.openjdk.jmh.annotations.Benchmark\nimport org.openjdk.jmh.annotations.BenchmarkMode\nimport org.openjdk.jmh.annotations.Measurement\nimport org.openjdk.jmh.annotations.Mode\nimport org.openjdk.jmh.annotations.OutputTimeUnit\nimport org.openjdk.jmh.annotations.Scope\nimport org.openjdk.jmh.annotations.State\n\n@State(Scope.Benchmark)\n@BenchmarkMode(Mode.AverageTime)\n@OutputTimeUnit(TimeUnit.MICROSECONDS)\n@Measurement(iterations = 100, time = 1, timeUnit = TimeUnit.MICROSECONDS)\nopen class JsonBenchmark {\n\n  final val moshi = Moshi.Builder().addLast(KotlinJsonAdapterFactory()).build()\n  final val moshiAdapter = moshi.adapter(Map::class.java)\n\n  final val gson = Gson()\n  final val gsonParser = JsonParser()\n\n  val fbParser = JSONParser()\n\n  final val classLoader = this.javaClass.classLoader\n  final val twitterData = classLoader.getResourceAsStream(\"twitter.json\")!!.readBytes()\n  final val canadaData = classLoader.getResourceAsStream(\"canada.json\")!!.readBytes()\n  final val citmData = classLoader.getResourceAsStream(\"citm_catalog.json\")!!.readBytes()\n\n  val fbCitmRef = JSONParser().parse(ArrayReadBuffer(citmData))\n  val moshiCitmRef = moshi.adapter(Map::class.java).fromJson(citmData.decodeToString())\n  val gsonCitmRef = gsonParser.parse(citmData.decodeToString())\n\n  fun readFlexBuffers(data: ByteArray): Reference = fbParser.parse(ArrayReadBuffer(data))\n\n  fun readMoshi(data: ByteArray): Map<*, *>? {\n    val buffer = Buffer().write(data)\n    return moshiAdapter.fromJson(buffer)\n  }\n\n  fun readGson(data: ByteArray): JsonObject {\n    val parser = JsonParser()\n    val jsonReader = InputStreamReader(ByteArrayInputStream(data))\n    return parser.parse(jsonReader).asJsonObject\n  }\n\n  // TWITTER\n  @Benchmark\n  open fun readTwitterFlexBuffers(hole: Blackhole? = null) =\n    hole?.consume(readFlexBuffers(twitterData))\n\n  @Benchmark open fun readTwitterMoshi(hole: Blackhole?) = hole?.consume(readMoshi(twitterData))\n\n  @Benchmark open fun readTwitterGson(hole: Blackhole?) = hole?.consume(readGson(twitterData))\n\n  @Benchmark\n  open fun roundTripTwitterFlexBuffers(hole: Blackhole? = null) =\n    hole?.consume(readFlexBuffers(twitterData).toJson())\n\n  @Benchmark\n  open fun roundTripTwitterMoshi(hole: Blackhole?) =\n    hole?.consume(moshiAdapter.toJson(readMoshi(twitterData)))\n\n  @Benchmark\n  open fun roundTripTwitterGson(hole: Blackhole?) =\n    hole?.consume(gson.toJson(readGson(twitterData)))\n\n  // CITM\n  @Benchmark\n  open fun readCITMFlexBuffers(hole: Blackhole? = null) = hole?.consume(readFlexBuffers(citmData))\n\n  @Benchmark\n  open fun readCITMMoshi(hole: Blackhole?) = hole?.consume(moshiAdapter.toJson(readMoshi(citmData)))\n\n  @Benchmark\n  open fun readCITMGson(hole: Blackhole?) = hole?.consume(gson.toJson(readGson(citmData)))\n\n  @Benchmark\n  open fun roundTripCITMFlexBuffers(hole: Blackhole? = null) =\n    hole?.consume(readFlexBuffers(citmData).toJson())\n\n  @Benchmark\n  open fun roundTripCITMMoshi(hole: Blackhole?) =\n    hole?.consume(moshiAdapter.toJson(readMoshi(citmData)))\n\n  @Benchmark\n  open fun roundTripCITMGson(hole: Blackhole?) = hole?.consume(gson.toJson(readGson(citmData)))\n\n  @Benchmark\n  open fun writeCITMFlexBuffers(hole: Blackhole? = null) = hole?.consume(fbCitmRef.toJson())\n\n  @Benchmark\n  open fun writeCITMMoshi(hole: Blackhole?) = hole?.consume(moshiAdapter.toJson(moshiCitmRef))\n\n  @Benchmark open fun writeCITMGson(hole: Blackhole?) = hole?.consume(gson.toJson(gsonCitmRef))\n\n  // CANADA\n  @Benchmark\n  open fun readCanadaFlexBuffers(hole: Blackhole? = null) =\n    hole?.consume(readFlexBuffers(canadaData))\n\n  @Benchmark open fun readCanadaMoshi(hole: Blackhole?) = hole?.consume(readMoshi(canadaData))\n\n  @Benchmark open fun readCanadaGson(hole: Blackhole?) = hole?.consume(readGson(canadaData))\n}\n"
  },
  {
    "path": "kotlin/benchmark/src/jvmMain/kotlin/com/google/flatbuffers/kotlin/benchmark/UTF8Benchmark.kt",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.google.flatbuffers.kotlin.benchmark\n\nimport com.google.flatbuffers.kotlin.ArrayReadWriteBuffer\nimport com.google.flatbuffers.kotlin.Key\nimport com.google.flatbuffers.kotlin.Utf8\nimport java.nio.ByteBuffer\nimport java.util.concurrent.TimeUnit\nimport kotlin.random.Random\nimport kotlinx.benchmark.Blackhole\nimport org.openjdk.jmh.annotations.Benchmark\nimport org.openjdk.jmh.annotations.BenchmarkMode\nimport org.openjdk.jmh.annotations.Measurement\nimport org.openjdk.jmh.annotations.Mode\nimport org.openjdk.jmh.annotations.OutputTimeUnit\nimport org.openjdk.jmh.annotations.Scope\nimport org.openjdk.jmh.annotations.Setup\nimport org.openjdk.jmh.annotations.State\n\n@State(Scope.Benchmark)\n@BenchmarkMode(Mode.AverageTime)\n@OutputTimeUnit(TimeUnit.MICROSECONDS)\n@Measurement(iterations = 100, time = 1, timeUnit = TimeUnit.MICROSECONDS)\nopen class UTF8Benchmark {\n\n  private val sampleSize = 5000\n  private val stringSize = 25\n  private var sampleSmallUtf8 = (0..sampleSize).map { populateUTF8(stringSize) }.toList()\n  private var sampleSmallUtf8Decoded = sampleSmallUtf8.map { it.encodeToByteArray() }.toList()\n  private var sampleSmallAscii = (0..sampleSize).map { populateAscii(stringSize) }.toList()\n  private var sampleSmallAsciiDecoded = sampleSmallAscii.map { it.encodeToByteArray() }.toList()\n\n  @Setup fun setUp() {}\n\n  @Benchmark\n  fun encodeUtf8KotlinStandard(blackhole: Blackhole) {\n    for (i in sampleSmallUtf8) {\n      blackhole.consume(i.encodeToByteArray())\n    }\n  }\n\n  @Benchmark\n  fun encodeUtf8KotlinFlatbuffers(blackhole: Blackhole) {\n    for (i in sampleSmallUtf8) {\n      val byteArray = ByteArray((i.length * 4))\n      blackhole.consume(Utf8.encodeUtf8Array(i, byteArray, 0, byteArray.size))\n    }\n  }\n\n  @Benchmark\n  fun encodeUtf8JavaFlatbuffers(blackhole: Blackhole) {\n    val javaUtf8 = com.google.flatbuffers.Utf8.getDefault()\n    for (i in sampleSmallUtf8) {\n      val byteBuffer = ByteBuffer.wrap(ByteArray(i.length * 4))\n      blackhole.consume(javaUtf8.encodeUtf8(i, byteBuffer))\n    }\n  }\n\n  @Benchmark\n  fun decodeUtf8KotlinStandard(blackhole: Blackhole) {\n    for (ary in sampleSmallUtf8Decoded) {\n      blackhole.consume(ary.decodeToString())\n    }\n  }\n\n  @Benchmark\n  fun decodeUtf8KotlinFlatbuffers(blackhole: Blackhole) {\n    for (ary in sampleSmallUtf8Decoded) {\n      blackhole.consume(Utf8.decodeUtf8Array(ary, 0, ary.size))\n    }\n  }\n\n  @Benchmark\n  fun decodeUtf8JavaFlatbuffers(blackhole: Blackhole) {\n    val javaUtf8 = com.google.flatbuffers.Utf8.getDefault()\n    for (ary in sampleSmallUtf8Decoded) {\n      val byteBuffer = ByteBuffer.wrap(ary)\n      blackhole.consume(javaUtf8.decodeUtf8(byteBuffer, 0, ary.size))\n    }\n  }\n\n  // ASCII TESTS\n\n  @Benchmark\n  fun encodeAsciiKotlinStandard(blackhole: Blackhole) {\n    for (i in sampleSmallAscii) {\n      blackhole.consume(i.encodeToByteArray())\n    }\n  }\n\n  @Benchmark\n  fun encodeAsciiKotlinFlatbuffers(blackhole: Blackhole) {\n    for (i in sampleSmallAscii) {\n      val byteArray = ByteArray(i.length) // Utf8.encodedLength(i))\n      blackhole.consume(Utf8.encodeUtf8Array(i, byteArray, 0, byteArray.size))\n    }\n  }\n\n  @Benchmark\n  fun encodeAsciiJavaFlatbuffers(blackhole: Blackhole) {\n    val javaUtf8 = com.google.flatbuffers.Utf8.getDefault()\n    for (i in sampleSmallAscii) {\n      val byteBuffer = ByteBuffer.wrap(ByteArray(i.length))\n      blackhole.consume(javaUtf8.encodeUtf8(i, byteBuffer))\n    }\n  }\n\n  @Benchmark\n  fun decodeAsciiKotlinStandard(blackhole: Blackhole) {\n\n    for (ary in sampleSmallAsciiDecoded) {\n      String(ary)\n      blackhole.consume(ary.decodeToString())\n    }\n  }\n\n  @Benchmark\n  fun decodeAsciiKotlinFlatbuffers(blackhole: Blackhole) {\n    for (ary in sampleSmallAsciiDecoded) {\n      blackhole.consume(Utf8.decodeUtf8Array(ary, 0, ary.size))\n    }\n  }\n\n  @Benchmark\n  fun decodeAsciiJavaFlatbuffers(blackhole: Blackhole) {\n    val javaUtf8 = com.google.flatbuffers.Utf8.getDefault()\n    for (ary in sampleSmallAsciiDecoded) {\n      val byteBuffer = ByteBuffer.wrap(ary)\n      blackhole.consume(javaUtf8.decodeUtf8(byteBuffer, 0, ary.size))\n    }\n  }\n\n  @Benchmark\n  fun readAllCharsString(blackhole: Blackhole) {\n    for (ary in sampleSmallAsciiDecoded) {\n      val key = Utf8.decodeUtf8Array(ary, 0, ary.size)\n      for (i in key.indices) {\n        blackhole.consume(key[i])\n      }\n    }\n  }\n\n  @Benchmark\n  fun readAllCharsCharSequence(blackhole: Blackhole) {\n    for (ary in sampleSmallAsciiDecoded) {\n      val key = Key(ArrayReadWriteBuffer(ary), 0, ary.size)\n      for (i in 0 until key.sizeInChars) {\n        blackhole.consume(key[i])\n      }\n    }\n  }\n\n  fun populateAscii(size: Int): String {\n    val data = ByteArray(size)\n    for (i in data.indices) {\n      data[i] = Random.nextInt(0, 127).toByte()\n    }\n\n    return String(data, 0, data.size)\n  }\n\n  // generate a string having at least length N\n  // can exceed by up to 3 chars, returns the actual length\n  fun populateUTF8(size: Int): String {\n    val data = ByteArray(size + 3)\n    var i = 0\n    while (i < size) {\n      val w = Random.nextInt() and 0xFF\n      when {\n        w < 0x80 -> data[i++] = 0x20\n        // w;\n        w < 0xE0 -> {\n          data[i++] = (0xC2 + Random.nextInt() % (0xDF - 0xC2 + 1)).toByte()\n          data[i++] = (0x80 + Random.nextInt() % (0xBF - 0x80 + 1)).toByte()\n        }\n        w == 0xE0 -> {\n          data[i++] = w.toByte()\n          data[i++] = (0xA0 + Random.nextInt() % (0xBF - 0xA0 + 1)).toByte()\n          data[i++] = (0x80 + Random.nextInt() % (0xBF - 0x80 + 1)).toByte()\n        }\n        w <= 0xEC -> {\n          data[i++] = w.toByte()\n          data[i++] = (0x80 + Random.nextInt() % (0xBF - 0x80 + 1)).toByte()\n          data[i++] = (0x80 + Random.nextInt() % (0xBF - 0x80 + 1)).toByte()\n        }\n        w == 0xED -> {\n          data[i++] = w.toByte()\n          data[i++] = (0x80 + Random.nextInt() % (0x9F - 0x80 + 1)).toByte()\n          data[i++] = (0x80 + Random.nextInt() % (0xBF - 0x80 + 1)).toByte()\n        }\n        w <= 0xEF -> {\n          data[i++] = w.toByte()\n          data[i++] = (0x80 + Random.nextInt() % (0xBF - 0x80 + 1)).toByte()\n          data[i++] = (0x80 + Random.nextInt() % (0xBF - 0x80 + 1)).toByte()\n        }\n        w < 0xF0 -> {\n          data[i++] = (0xF1 + Random.nextInt() % (0xF3 - 0xF1 + 1)).toByte()\n          data[i++] = (0x80 + Random.nextInt() % (0xBF - 0x80 + 1)).toByte()\n          data[i++] = (0x80 + Random.nextInt() % (0xBF - 0x80 + 1)).toByte()\n          data[i++] = (0x80 + Random.nextInt() % (0xBF - 0x80 + 1)).toByte()\n        }\n        w == 0xF0 -> {\n          data[i++] = w.toByte()\n          data[i++] = (0x90 + Random.nextInt() % (0xBF - 0x90 + 1)).toByte()\n          data[i++] = (0x80 + Random.nextInt() % (0xBF - 0x80 + 1)).toByte()\n          data[i++] = (0x80 + Random.nextInt() % (0xBF - 0x80 + 1)).toByte()\n        }\n        w <= 0xF3 -> {\n          data[i++] = (0xF1 + Random.nextInt() % (0xF3 - 0xF1 + 1)).toByte()\n          data[i++] = (0x80 + Random.nextInt() % (0xBF - 0x80 + 1)).toByte()\n          data[i++] = (0x80 + Random.nextInt() % (0xBF - 0x80 + 1)).toByte()\n          data[i++] = (0x80 + Random.nextInt() % (0xBF - 0x80 + 1)).toByte()\n        }\n        w == 0xF4 -> {\n          data[i++] = w.toByte()\n          data[i++] = (0x80 + Random.nextInt() % (0x8F - 0x80 + 1)).toByte()\n          data[i++] = (0x80 + Random.nextInt() % (0xBF - 0x80 + 1)).toByte()\n          data[i++] = (0x80 + Random.nextInt() % (0xBF - 0x80 + 1)).toByte()\n        }\n      }\n    }\n    return String(data, 0, i)\n  }\n}\n"
  },
  {
    "path": "kotlin/build.gradle.kts",
    "content": "import java.nio.charset.StandardCharsets\nimport org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions\nimport org.jetbrains.kotlin.gradle.tasks.KotlinCompile\n\nbuildscript {\n  repositories {\n    gradlePluginPortal()\n    google()\n    mavenCentral()\n  }\n  dependencies {\n    classpath(libs.plugin.kotlin.gradle)\n    classpath(libs.plugin.kotlinx.benchmark)\n    classpath(libs.plugin.jmhreport)\n    classpath(libs.plugin.download)\n  }\n}\n\nallprojects {\n  repositories {\n    google()\n    mavenCentral()\n  }\n}\n\ntasks.withType<org.jetbrains.kotlin.gradle.dsl.KotlinCompile<KotlinCommonOptions>>().configureEach {\n  kotlinOptions {\n    freeCompilerArgs +=\n      \"-progressive\" // https://kotlinlang.org/docs/whatsnew13.html#progressive-mode\n  }\n}\n\ntasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile>().configureEach {\n  kotlinOptions {\n    jvmTarget = JavaVersion.VERSION_1_8.toString()\n    freeCompilerArgs += \"-Xjvm-default=all\"\n  }\n}\n\ntasks.withType<JavaCompile> {\n  options.encoding = StandardCharsets.UTF_8.toString()\n  sourceCompatibility = JavaVersion.VERSION_1_8.toString()\n  targetCompatibility = JavaVersion.VERSION_1_8.toString()\n}\n"
  },
  {
    "path": "kotlin/convention-plugins/build.gradle.kts",
    "content": "plugins { `kotlin-dsl` }\n\nrepositories { gradlePluginPortal() }\n"
  },
  {
    "path": "kotlin/convention-plugins/src/main/kotlin/convention.publication.gradle.kts",
    "content": "import java.util.*\nimport org.gradle.api.publish.maven.MavenPublication\nimport org.gradle.api.tasks.bundling.Jar\nimport org.gradle.kotlin.dsl.`maven-publish`\nimport org.gradle.kotlin.dsl.signing\n\nplugins {\n  `maven-publish`\n  signing\n}\n\n// Stub secrets to let the project sync and build without the publication values set up\next[\"signing.keyId\"] = null\n\next[\"signing.password\"] = null\n\next[\"signing.secretKeyRingFile\"] = null\n\next[\"ossrhUsername\"] = null\n\next[\"ossrhPassword\"] = null\n\n// Grabbing secrets from local.properties file or from environment variables, which could be used on\n// CI\nval secretPropsFile = project.rootProject.file(\"local.properties\")\n\nif (secretPropsFile.exists()) {\n  secretPropsFile\n    .reader()\n    .use { Properties().apply { load(it) } }\n    .onEach { (name, value) -> ext[name.toString()] = value }\n} else {\n  ext[\"signing.keyId\"] = System.getenv(\"OSSRH_USERNAME\")\n  ext[\"signing.password\"] = System.getenv(\"OSSRH_PASSWORD\")\n  ext[\"signing.secretKeyRingFile\"] = System.getenv(\"INPUT_GPG_PRIVATE_KEY\")\n  ext[\"ossrhUsername\"] = System.getenv(\"OSSRH_USERNAME\")\n  ext[\"ossrhPassword\"] = System.getenv(\"OSSRH_PASSWORD\")\n}\n\nval javadocJar by tasks.registering(Jar::class) { archiveClassifier.set(\"javadoc\") }\n\nfun getExtraString(name: String) = ext[name]?.toString()\n\npublishing {\n  // Configure maven central repository\n  repositories {\n    maven {\n      name = \"sonatype\"\n      setUrl(\"https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/\")\n      credentials {\n        username = getExtraString(\"ossrhUsername\")\n        password = getExtraString(\"ossrhPassword\")\n      }\n    }\n  }\n\n  // Configure all publications\n  publications.withType<MavenPublication> {\n    // Stub javadoc.jar artifact\n    artifact(javadocJar.get())\n\n    // Provide artifacts information requited by Maven Central\n    pom {\n      name.set(\"Flatbuffers Kotlin\")\n      description.set(\"Memory Efficient Serialization Library\")\n      url.set(\"https://github.com/google/flatbuffers\")\n\n      licenses {\n        license {\n          name.set(\"Apache License V2.0\")\n          url.set(\"https://raw.githubusercontent.com/google/flatbuffers/master/LICENSE\")\n        }\n      }\n      developers {\n        developer {\n          id.set(\"https://github.com/paulovap\")\n          name.set(\"Paulo Pinheiro\")\n          email.set(\"paulovictor.pinheiro@gmail.com\")\n        }\n        developer {\n          id.set(\"https://github.com/dbaileychess\")\n          name.set(\"Derek Bailey\")\n          email.set(\"dbaileychess@gmail.com\")\n        }\n      }\n      scm { url.set(\"https://github.com/google/flatbuffers\") }\n    }\n  }\n}\n\n// Signing artifacts. Signing.* extra properties values will be used\nsigning { sign(publishing.publications) }\n"
  },
  {
    "path": "kotlin/flatbuffers-kotlin/build.gradle.kts",
    "content": "plugins {\n  kotlin(\"multiplatform\")\n  id(\"convention.publication\")\n}\n\nval libName = \"Flatbuffers\"\n\ngroup = \"com.google.flatbuffers.kotlin\"\n\nversion = \"2.0.0-SNAPSHOT\"\n\nkotlin {\n  explicitApi()\n  jvm()\n  js(IR) {\n    browser { testTask { enabled = false } }\n    binaries.executable()\n  }\n  macosX64()\n  macosArm64()\n  iosArm64()\n  iosSimulatorArm64()\n\n  sourceSets {\n    val commonMain by getting { dependencies { implementation(kotlin(\"stdlib-common\")) } }\n\n    val commonTest by getting {\n      dependencies { implementation(kotlin(\"test\")) }\n\n      kotlin.srcDir(\"src/commonTest/generated/kotlin/\")\n    }\n    val jvmTest by getting {\n      dependencies {\n        implementation(kotlin(\"test-junit\"))\n        implementation(\"com.google.flatbuffers:flatbuffers-java:2.0.3\")\n      }\n    }\n    val jvmMain by getting {}\n\n    val macosX64Main by getting\n    val macosArm64Main by getting\n    val iosArm64Main by getting\n    val iosSimulatorArm64Main by getting\n\n    val nativeMain by creating {\n      // this sourceSet will hold common cold for all iOS targets\n      dependsOn(commonMain)\n      macosArm64Main.dependsOn(this)\n      macosX64Main.dependsOn(this)\n      iosArm64Main.dependsOn(this)\n      iosSimulatorArm64Main.dependsOn(this)\n    }\n\n    all { languageSettings.optIn(\"kotlin.ExperimentalUnsignedTypes\") }\n  }\n}\n\n// Fixes JS issue: https://youtrack.jetbrains.com/issue/KT-49109\nrootProject.plugins.withType<org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin> {\n  rootProject.the<org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension>().nodeVersion =\n    \"16.0.0\"\n}\n\n// Use the default greeting\ntasks.register<GenerateFBTestClasses>(\"generateFBTestClassesKt\") {\n  inputFiles.setFrom(\n    \"$rootDir/../tests/monster_test.fbs\",\n    \"$rootDir/../tests/dictionary_lookup.fbs\",\n    // @todo Seems like nesting code generation is broken for all generators.\n    // disabling test for now.\n    //    \"$rootDir/../tests/namespace_test/namespace_test1.fbs\",\n    //    \"$rootDir/../tests/namespace_test/namespace_test2.fbs\",\n    \"$rootDir/../tests/union_vector/union_vector.fbs\",\n    \"$rootDir/../tests/optional_scalars.fbs\",\n  )\n  includeFolder.set(\"$rootDir/../tests/include_test\")\n  outputFolder.set(\"${projectDir}/src/commonTest/generated/kotlin/\")\n  variant.set(\"kotlin-kmp\")\n}\n\nproject.tasks.forEach {\n  if (it.name.contains(\"compileKotlin\")) it.dependsOn(\"generateFBTestClassesKt\")\n}\n\nfun String.intProperty() = findProperty(this).toString().toInt()\n\nabstract class GenerateFBTestClasses : DefaultTask() {\n  @get:InputFiles abstract val inputFiles: ConfigurableFileCollection\n\n  @get:Input abstract val includeFolder: Property<String>\n\n  @get:Input abstract val outputFolder: Property<String>\n\n  @get:Input abstract val variant: Property<String>\n\n  @Inject\n  protected open fun getExecActionFactory(): org.gradle.process.internal.ExecActionFactory? {\n    throw UnsupportedOperationException()\n  }\n\n  init {\n    includeFolder.set(\"\")\n  }\n\n  @TaskAction\n  fun compile() {\n    val execAction = getExecActionFactory()!!.newExecAction()\n    val sources = inputFiles.asPath.split(\":\")\n    val args = mutableListOf(\"flatc\", \"-o\", outputFolder.get(), \"--${variant.get()}\")\n    if (includeFolder.get().isNotEmpty()) {\n      args.add(\"-I\")\n      args.add(includeFolder.get())\n    }\n    args.addAll(sources)\n    println(args)\n    execAction.commandLine = args\n    print(execAction.execute())\n  }\n}\n"
  },
  {
    "path": "kotlin/flatbuffers-kotlin/src/commonMain/kotlin/com/google/flatbuffers/kotlin/Buffers.kt",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.google.flatbuffers.kotlin\n\nimport kotlin.math.max\nimport kotlin.math.min\n\n/** Represent a chunk of data, where FlexBuffers will be read from. */\npublic interface ReadBuffer {\n\n  /**\n   * Scan through the buffer for first byte matching value.\n   *\n   * @param value to be match\n   * @param start inclusive initial position to start searching\n   * @param end exclusive final position of the search\n   * @return position of a match or -1\n   */\n  public fun findFirst(value: Byte, start: Int, end: Int = limit): Int\n\n  /**\n   * Read boolean from the buffer. Booleans as stored as a single byte\n   *\n   * @param index position of the element in [ReadBuffer]\n   * @return [Boolean] element\n   */\n  public fun getBoolean(index: Int): Boolean\n\n  /**\n   * Read a [Byte] from the buffer.\n   *\n   * @param index position of the element in [ReadBuffer]\n   * @return a byte\n   */\n  public operator fun get(index: Int): Byte\n\n  /**\n   * Read a [UByte] from the buffer.\n   *\n   * @param index position of the element in [ReadBuffer]\n   * @return a [UByte]\n   */\n  public fun getUByte(index: Int): UByte\n\n  /**\n   * Read a [Short] from the buffer.\n   *\n   * @param index position of the element in [ReadBuffer]\n   * @return a [Short]\n   */\n  public fun getShort(index: Int): Short\n\n  /**\n   * Read a [UShort] from the buffer.\n   *\n   * @param index position of the element in [ReadBuffer]\n   * @return a [UShort]\n   */\n  public fun getUShort(index: Int): UShort\n\n  /**\n   * Read a [Int] from the buffer.\n   *\n   * @param index position of the element in [ReadBuffer]\n   * @return an [Int]\n   */\n  public fun getInt(index: Int): Int\n\n  /**\n   * Read a [UInt] from the buffer.\n   *\n   * @param index position of the element in [ReadBuffer]\n   * @return an [UInt]\n   */\n  public fun getUInt(index: Int): UInt\n\n  /**\n   * Read a [Long] from the buffer.\n   *\n   * @param index position of the element in [ReadBuffer]\n   * @return a [Long]\n   */\n  public fun getLong(index: Int): Long\n\n  /**\n   * Read a [ULong] from the buffer.\n   *\n   * @param index position of the element in [ReadBuffer]\n   * @return a [ULong]\n   */\n  public fun getULong(index: Int): ULong\n\n  /**\n   * Read a 32-bit float from the buffer.\n   *\n   * @param index position of the element in [ReadBuffer]\n   * @return a float\n   */\n  public fun getFloat(index: Int): Float\n\n  /**\n   * Read a 64-bit float from the buffer.\n   *\n   * @param index position of the element in [ReadBuffer]\n   * @return a double\n   */\n  public fun getDouble(index: Int): Double\n\n  /**\n   * Read a UTF-8 string from the buffer.\n   *\n   * @param start initial element of the string\n   * @param size size of the string in bytes.\n   * @return a `String`\n   */\n  public fun getString(start: Int = 0, size: Int = limit): String\n\n  /**\n   * Read a ByteArray from the buffer.\n   *\n   * @param start position from the [ReadBuffer] to be read\n   * @param length maximum number of bytes to be written in the buffer\n   */\n  public fun getBytes(array: ByteArray, start: Int, length: Int = array.size)\n\n  /**\n   * Expose [ReadBuffer] as an array of bytes. This method is meant to be as efficient as possible,\n   * so for an array-backed [ReadBuffer], it should return its own internal data. In case access to\n   * internal data is not possible, a copy of the data into an array of bytes might occur.\n   *\n   * @return [ReadBuffer] as an array of bytes\n   */\n  public fun data(): ByteArray\n\n  /**\n   * Creates a new [ReadBuffer] point to a region of the current buffer, starting at [start] with\n   * size [size].\n   *\n   * @param start starting position of the [ReadBuffer]\n   * @param size in bytes of the [ReadBuffer]\n   * @return [ReadBuffer] slice.\n   */\n  public fun slice(start: Int, size: Int): ReadBuffer\n\n  /**\n   * Defines the size of the message in the buffer. It also determines last position that buffer can\n   * be read. Last byte to be accessed is in position `limit() -1`.\n   *\n   * @return indicate last position\n   */\n  public val limit: Int\n}\n\n/**\n * Interface to represent a read-write buffers. This interface will be used to access and write\n * FlexBuffer messages.\n */\npublic interface ReadWriteBuffer : ReadBuffer {\n  /**\n   * Clears (resets) the buffer so that it can be reused. Write position will be set to the start.\n   */\n  public fun clear()\n\n  /**\n   * Request capacity of the buffer relative to [writePosition]. In case buffer is already larger\n   * than the requested, this method will just return true. Otherwise, It might try to resize the\n   * buffer. In case of being unable to allocate enough memory, an exception will be thrown.\n   *\n   * @param additional capacity in bytes to be added on top of [writePosition]\n   * @param copyAtEnd copy current data at the end of new underlying buffer\n   * @return new capacity in bytes\n   */\n  public fun requestAdditionalCapacity(additional: Int, copyAtEnd: Boolean = false): Int =\n    requestCapacity(writePosition + additional, copyAtEnd)\n\n  /**\n   * Request capacity of the buffer in absolute values. In case buffer is already larger than the\n   * requested the method is a no-op. Otherwise, It might try to resize the buffer. In case of being\n   * unable to allocate enough memory, an exception will be thrown.\n   *\n   * @param capacity new capacity\n   * @param copyAtEnd copy current data at the end of new underlying buffer\n   * @return new capacity in bytes\n   */\n  public fun requestCapacity(capacity: Int, copyAtEnd: Boolean = false): Int\n\n  /**\n   * Put a [Boolean] into the buffer at [writePosition] . Booleans as stored as single byte. Write\n   * position will be incremented.\n   *\n   * @return [Boolean] element\n   */\n  public fun put(value: Boolean)\n\n  /**\n   * Put an array of bytes into the buffer at [writePosition]. Write position will be incremented.\n   *\n   * @param value the data to be copied\n   * @param start initial position on value to be copied\n   * @param length amount of bytes to be copied\n   */\n  public fun put(value: ByteArray, start: Int = 0, length: Int = value.size)\n\n  /**\n   * Put an array of bytes into the buffer at [writePosition]. Write position will be incremented.\n   *\n   * @param value [ReadBuffer] the data to be copied\n   * @param start initial position on value to be copied\n   * @param length amount of bytes to be copied\n   */\n  public fun put(value: ReadBuffer, start: Int = 0, length: Int = value.limit - start)\n\n  /** Write a [Byte] into the buffer at [writePosition]. Write position will be incremented. */\n  public fun put(value: Byte)\n\n  /** Write a [UByte] into the buffer at [writePosition]. Write position will be incremented. */\n  public fun put(value: UByte)\n\n  /** Write a [Short] into in the buffer at [writePosition]. Write position will be incremented. */\n  public fun put(value: Short)\n\n  /** Write a [UShort] into in the buffer at [writePosition]. Write position will be incremented. */\n  public fun put(value: UShort)\n\n  /** Write a [Int] in the buffer at [writePosition]. Write position will be incremented. */\n  public fun put(value: Int)\n\n  /** Write a [UInt] into in the buffer at [writePosition]. Write position will be incremented. */\n  public fun put(value: UInt)\n\n  /** Write a [Long] into in the buffer at [writePosition]. Write position will be incremented. */\n  public fun put(value: Long)\n\n  /** Write a [ULong] into in the buffer at [writePosition]. Write position will be incremented. */\n  public fun put(value: ULong)\n\n  /**\n   * Write a 32-bit [Float] into the buffer at [writePosition]. Write position will be incremented.\n   */\n  public fun put(value: Float)\n\n  /**\n   * Write a 64-bit [Double] into the buffer at [writePosition]. Write position will be incremented.\n   */\n  public fun put(value: Double)\n\n  /**\n   * Write a [String] encoded as UTF-8 into the buffer at [writePosition]. Write position will be\n   * incremented.\n   *\n   * @return size in bytes of the encoded string\n   */\n  public fun put(value: CharSequence, encodedLength: Int = -1): Int\n\n  /**\n   * Write an array of bytes into the buffer.\n   *\n   * @param dstIndex initial position where [src] will be copied into.\n   * @param src the data to be copied.\n   * @param srcStart initial position on [src] that will be copied.\n   * @param srcLength amount of bytes to be copied\n   */\n  public fun set(dstIndex: Int, src: ByteArray, srcStart: Int = 0, srcLength: Int = src.size)\n\n  /**\n   * Write an array of bytes into the buffer.\n   *\n   * @param dstIndex initial position where [src] will be copied into.\n   * @param src the data to be copied.\n   * @param srcStart initial position on [src] that will be copied.\n   * @param srcLength amount of bytes to be copied\n   */\n  public operator fun set(dstIndex: Int, src: ReadBuffer, srcStart: Int = 0, srcLength: Int)\n\n  /**\n   * Write [Boolean] into a given position [index] on the buffer. Booleans as stored as single byte.\n   *\n   * @param index position of the element in buffer\n   */\n  public operator fun set(index: Int, value: Boolean)\n\n  /**\n   * Write [Byte] into a given position [index] on the buffer.\n   *\n   * @param index position of the element in the buffer\n   */\n  public operator fun set(index: Int, value: Byte)\n\n  /**\n   * Write [UByte] into a given position [index] on the buffer.\n   *\n   * @param index position of the element in the buffer\n   */\n  public operator fun set(index: Int, value: UByte)\n\n  /**\n   * Short\n   *\n   * @param index position of the element in [ReadBuffer]\n   */\n  public fun set(index: Int, value: Short)\n\n  /**\n   * Write [UShort] into a given position [index] on the buffer.\n   *\n   * @param index position of the element in [ReadBuffer]\n   */\n  public fun set(index: Int, value: UShort)\n\n  /**\n   * Write [Int] into a given position [index] on the buffer.\n   *\n   * @param index position of the element in [ReadBuffer]\n   */\n  public fun set(index: Int, value: Int)\n\n  /**\n   * Write [UInt] into a given position [index] on the buffer.\n   *\n   * @param index position of the element in [ReadBuffer]\n   */\n  public fun set(index: Int, value: UInt)\n\n  /**\n   * Write [Long] into a given position [index] on the buffer.\n   *\n   * @param index position of the element in [ReadBuffer]\n   */\n  public fun set(index: Int, value: Long)\n\n  /**\n   * Write [ULong] into a given position [index] on the buffer.\n   *\n   * @param index position of the element in [ReadBuffer]\n   */\n  public fun set(index: Int, value: ULong)\n\n  /**\n   * Write [Float] into a given position [index] on the buffer.\n   *\n   * @param index position of the element in [ReadBuffer]\n   */\n  public fun set(index: Int, value: Float)\n\n  /**\n   * Write [Double] into a given position [index] on the buffer.\n   *\n   * @param index position of the element in [ReadBuffer]\n   */\n  public fun set(index: Int, value: Double)\n\n  public fun fill(value: Byte, start: Int, end: Int)\n\n  /**\n   * Current position of the buffer to be written. It will be automatically updated on [put]\n   * operations.\n   */\n  public var writePosition: Int\n\n  /**\n   * Creates a new [ReadWriteBuffer] point to a region of the current buffer, starting at [offset]\n   * with size [size].\n   *\n   * @param offset starting position of the [ReadWriteBuffer]\n   * @param size in bytes of the [ReadWriteBuffer]\n   * @return [ReadWriteBuffer] slice.\n   */\n  public fun writeSlice(offset: Int, size: Int): ReadWriteBuffer\n\n  /**\n   * Special operation where we increase the backed buffer size to [capacity] and shift all already\n   * written data to the end of the buffer.\n   *\n   * This function is mostly used when creating a Flatbuffer message, as data is written from the\n   * end of the buffer towards index 0.\n   *\n   * @param capacity required in bytes\n   * @return new capacity in bytes\n   */\n  public fun moveWrittenDataToEnd(capacity: Int): Int\n\n  /** Maximum size in bytes that the backed buffer supports. */\n  public val capacity: Int\n\n  /**\n   * Defines last relative position of the backed buffer that can be written. Any addition to the\n   * buffer that goes beyond will throw an exception instead of regrow the buffer (default\n   * behavior).\n   */\n  public val writeLimit: Int\n}\n\npublic open class ArrayReadBuffer(\n  protected var buffer: ByteArray,\n  // offsets writePosition against backed buffer e.g. offset = 1, writePosition = 1\n  // will write first byte at position 2 of the backed buffer\n  internal val offset: Int = 0,\n  override val limit: Int = buffer.size - offset,\n) : ReadBuffer {\n\n  override fun findFirst(value: Byte, start: Int, end: Int): Int {\n    val e = min(end, limit)\n    val s = max(0, this.offset + start)\n    for (i in s until e) if (buffer[i] == value) return i\n    return -1\n  }\n\n  override fun getBoolean(index: Int): Boolean = buffer[offset + index] != 0.toByte()\n\n  override operator fun get(index: Int): Byte = buffer[offset + index]\n\n  override fun getUByte(index: Int): UByte = buffer.getUByte(offset + index)\n\n  override fun getShort(index: Int): Short = buffer.getShort(offset + index)\n\n  override fun getUShort(index: Int): UShort = buffer.getUShort(offset + index)\n\n  override fun getInt(index: Int): Int = buffer.getInt(offset + index)\n\n  override fun getUInt(index: Int): UInt = buffer.getUInt(offset + index)\n\n  override fun getLong(index: Int): Long = buffer.getLong(offset + index)\n\n  override fun getULong(index: Int): ULong = buffer.getULong(offset + index)\n\n  override fun getFloat(index: Int): Float = buffer.getFloat(offset + index)\n\n  override fun getDouble(index: Int): Double = buffer.getDouble(offset + index)\n\n  override fun getString(start: Int, size: Int): String =\n    buffer.decodeToString(this.offset + start, this.offset + start + size)\n\n  override fun getBytes(array: ByteArray, start: Int, length: Int) {\n    val end = min(this.offset + start + length, buffer.size)\n    var j = 0\n    for (i in this.offset + start until end) {\n      array[j++] = buffer[i]\n    }\n  }\n\n  override fun data(): ByteArray = buffer\n\n  override fun slice(start: Int, size: Int): ReadBuffer =\n    ArrayReadBuffer(buffer, this.offset + start, size)\n}\n\n/**\n * Implements `[ReadWriteBuffer]` using [ByteArray] as backing buffer. Using array of bytes are\n * usually faster than `ByteBuffer`.\n *\n * This class is not thread-safe, meaning that it must operate on a single thread. Operating from\n * multiple thread leads into an undefined behavior\n *\n * All operations assume Little Endian byte order.\n */\npublic class ArrayReadWriteBuffer(\n  buffer: ByteArray,\n  offset: Int = 0,\n  // Defines last position of the backed buffer that can be written.\n  // Any addition to the buffer that goes beyond will throw an exception\n  // instead of regrow the buffer (default behavior).\n  public override val writeLimit: Int = -1,\n  override var writePosition: Int = offset,\n) : ArrayReadBuffer(buffer, offset, writePosition), ReadWriteBuffer {\n\n  public constructor(initialCapacity: Int = 10) : this(ByteArray(initialCapacity))\n\n  override val limit: Int\n    get() = writePosition\n\n  override fun clear(): Unit = run { writePosition = 0 }\n\n  override fun put(value: Boolean) {\n    set(writePosition, value)\n    writePosition++\n  }\n\n  override fun put(value: ByteArray, start: Int, length: Int) {\n    set(writePosition, value, start, length)\n    writePosition += length\n  }\n\n  override fun put(value: ReadBuffer, start: Int, length: Int) {\n    set(writePosition, value, start, length)\n    writePosition += length\n  }\n\n  override fun put(value: Byte) {\n    set(writePosition, value)\n    writePosition++\n  }\n\n  override fun put(value: UByte) {\n    set(writePosition, value)\n    writePosition++\n  }\n\n  override fun put(value: Short) {\n    set(writePosition, value)\n    writePosition += 2\n  }\n\n  override fun put(value: UShort) {\n    set(writePosition, value)\n    writePosition += 2\n  }\n\n  override fun put(value: Int) {\n    set(writePosition, value)\n    writePosition += 4\n  }\n\n  override fun put(value: UInt) {\n    set(writePosition, value)\n    writePosition += 4\n  }\n\n  override fun put(value: Long) {\n    set(writePosition, value)\n    writePosition += 8\n  }\n\n  override fun put(value: ULong) {\n    set(writePosition, value)\n    writePosition += 8\n  }\n\n  override fun put(value: Float) {\n    set(writePosition, value)\n    writePosition += 4\n  }\n\n  override fun put(value: Double) {\n    set(writePosition, value)\n    writePosition += 8\n  }\n\n  override fun put(value: CharSequence, encodedLength: Int): Int {\n    val length = if (encodedLength != -1) encodedLength else Utf8.encodedLength(value)\n    writePosition = buffer.setCharSequence(writePosition, value)\n    return length\n  }\n\n  override fun set(index: Int, value: Boolean) {\n    buffer[index] = if (value) 1.toByte() else 0.toByte()\n  }\n\n  override fun set(dstIndex: Int, src: ByteArray, srcStart: Int, srcLength: Int) {\n    src.copyInto(buffer, dstIndex, srcStart, srcStart + srcLength)\n  }\n\n  override operator fun set(dstIndex: Int, src: ReadBuffer, srcStart: Int, srcLength: Int) {\n    when (src) {\n      is ArrayReadBuffer -> {\n        src\n          .data()\n          .copyInto(buffer, dstIndex, src.offset + srcStart, src.offset + srcStart + srcLength)\n      }\n      else -> {\n        for (i in 0 until srcLength) {\n          buffer[dstIndex + i] = src[srcStart + i]\n        }\n      }\n    }\n  }\n\n  override operator fun set(index: Int, value: Byte) {\n    buffer[index] = value\n  }\n\n  override operator fun set(index: Int, value: UByte) {\n    buffer.setUByte(index, value)\n  }\n\n  override operator fun set(index: Int, value: Short) {\n    buffer.setShort(index, value)\n  }\n\n  override operator fun set(index: Int, value: UShort) {\n    buffer.setUShort(index, value)\n  }\n\n  override operator fun set(index: Int, value: Int) {\n    buffer.setInt(index, value)\n  }\n\n  override operator fun set(index: Int, value: UInt) {\n    buffer.setUInt(index, value)\n  }\n\n  override operator fun set(index: Int, value: Long) {\n    buffer.setLong(index, value)\n  }\n\n  override operator fun set(index: Int, value: ULong) {\n    buffer.setULong(index, value)\n  }\n\n  override operator fun set(index: Int, value: Float) {\n    buffer.setFloat(index, value)\n  }\n\n  override operator fun set(index: Int, value: Double) {\n    buffer.setDouble(index, value)\n  }\n\n  override fun fill(value: Byte, start: Int, end: Int) {\n    buffer.fill(value, start, end)\n  }\n\n  /**\n   * Request capacity of the buffer. In case buffer is already larger than the requested, it is a\n   * no-op. Otherwise, It might try to resize the buffer. In case of being unable to allocate enough\n   * memory, an exception will be thrown.\n   *\n   * @param capacity new capacity\n   * @param copyAtEnd copy current data at the end of new underlying buffer\n   */\n  override fun requestCapacity(capacity: Int, copyAtEnd: Boolean): Int {\n    if (capacity < 0) error(\"Capacity may not be negative (likely a previous int overflow)\")\n\n    if (buffer.size >= capacity) return buffer.size\n\n    if (writeLimit > 0 && writeLimit + offset >= buffer.size)\n      error(\n        \"Buffer in writeLimit mode. In writeLimit mode\" +\n          \" the buffer does not grow automatically and any write beyond writeLimit will throw exception. \" +\n          \"(writeLimit: $writeLimit, newCapacity: $capacity\"\n      )\n    // implemented in the same growing fashion as ArrayList\n    val oldCapacity = buffer.size\n    if (oldCapacity == Int.MAX_VALUE - 8) { // Ensure we don't grow beyond what fits in an int.\n      error(\"FlatBuffers: cannot grow buffer beyond 2 gigabytes.\")\n    }\n    // (old_buf_size & 0xC0000000) != 0 ? MAX_BUFFER_SIZE : old_buf_size << 1;\n    var newCapacity = 8\n    while (newCapacity < capacity) { // Note: this also catches newCapacity int overflow\n      newCapacity = if (newCapacity and -0x40000000 != 0) Int.MAX_VALUE - 8 else newCapacity shl 1\n    }\n    val newBuffer = ByteArray(newCapacity)\n\n    buffer.copyInto(newBuffer, if (copyAtEnd) newBuffer.size - buffer.size else 0)\n    buffer = newBuffer\n    return newCapacity\n  }\n\n  override fun writeSlice(offset: Int, size: Int): ReadWriteBuffer {\n    return ArrayReadWriteBuffer(this.buffer, offset = offset, writeLimit = size)\n  }\n\n  override fun moveWrittenDataToEnd(capacity: Int): Int = requestCapacity(capacity, true)\n\n  override val capacity: Int\n    get() = buffer.size\n}\n\npublic val emptyBuffer: ReadWriteBuffer = ArrayReadWriteBuffer(ByteArray(1))\n"
  },
  {
    "path": "kotlin/flatbuffers-kotlin/src/commonMain/kotlin/com/google/flatbuffers/kotlin/ByteArray.kt",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n@file:Suppress(\"NOTHING_TO_INLINE\")\n\npackage com.google.flatbuffers.kotlin\n\nimport kotlin.experimental.and\n\ninternal fun ByteArray.getString(index: Int, size: Int): String =\n  Utf8.decodeUtf8Array(this, index, size)\n\ninternal fun ByteArray.setCharSequence(index: Int, value: CharSequence): Int =\n  Utf8.encodeUtf8Array(value, this, index, this.size - index)\n\n// List of functions that needs to be implemented on all platforms.\ninternal expect inline fun ByteArray.getUByte(index: Int): UByte\n\ninternal expect inline fun ByteArray.getShort(index: Int): Short\n\ninternal expect inline fun ByteArray.getUShort(index: Int): UShort\n\ninternal expect inline fun ByteArray.getInt(index: Int): Int\n\ninternal expect inline fun ByteArray.getUInt(index: Int): UInt\n\ninternal expect inline fun ByteArray.getLong(index: Int): Long\n\ninternal expect inline fun ByteArray.getULong(index: Int): ULong\n\ninternal expect inline fun ByteArray.getFloat(index: Int): Float\n\ninternal expect inline fun ByteArray.getDouble(index: Int): Double\n\ninternal expect inline fun ByteArray.setUByte(index: Int, value: UByte)\n\npublic expect inline fun ByteArray.setShort(index: Int, value: Short)\n\ninternal expect inline fun ByteArray.setUShort(index: Int, value: UShort)\n\ninternal expect inline fun ByteArray.setInt(index: Int, value: Int)\n\ninternal expect inline fun ByteArray.setUInt(index: Int, value: UInt)\n\ninternal expect inline fun ByteArray.setLong(index: Int, value: Long)\n\ninternal expect inline fun ByteArray.setULong(index: Int, value: ULong)\n\ninternal expect inline fun ByteArray.setFloat(index: Int, value: Float)\n\ninternal expect inline fun ByteArray.setDouble(index: Int, value: Double)\n\n/** This implementation uses Little Endian order. */\npublic object ByteArrayOps {\n  public inline fun getUByte(ary: ByteArray, index: Int): UByte = ary[index].toUByte()\n\n  public inline fun getShort(ary: ByteArray, index: Int): Short {\n    return (ary[index + 1].toInt() shl 8 or (ary[index].toInt() and 0xff)).toShort()\n  }\n\n  public inline fun getUShort(ary: ByteArray, index: Int): UShort = getShort(ary, index).toUShort()\n\n  public inline fun getInt(ary: ByteArray, index: Int): Int {\n    return ((ary[index + 3].toInt() shl 24) or\n      ((ary[index + 2].toInt() and 0xff) shl 16) or\n      ((ary[index + 1].toInt() and 0xff) shl 8) or\n      ((ary[index].toInt() and 0xff)))\n  }\n\n  public inline fun getUInt(ary: ByteArray, index: Int): UInt = getInt(ary, index).toUInt()\n\n  public inline fun getLong(ary: ByteArray, index: Int): Long {\n    var idx = index\n    return ary[idx++].toLong() and\n      0xff or\n      (ary[idx++].toLong() and 0xff shl 8) or\n      (ary[idx++].toLong() and 0xff shl 16) or\n      (ary[idx++].toLong() and 0xff shl 24) or\n      (ary[idx++].toLong() and 0xff shl 32) or\n      (ary[idx++].toLong() and 0xff shl 40) or\n      (ary[idx++].toLong() and 0xff shl 48) or\n      (ary[idx].toLong() shl 56)\n  }\n\n  public inline fun getULong(ary: ByteArray, index: Int): ULong = getLong(ary, index).toULong()\n\n  public inline fun setUByte(ary: ByteArray, index: Int, value: UByte) {\n    ary[index] = value.toByte()\n  }\n\n  public inline fun setShort(ary: ByteArray, index: Int, value: Short) {\n    var idx = index\n    ary[idx++] = (value and 0xff).toByte()\n    ary[idx] = (value.toInt() shr 8 and 0xff).toByte()\n  }\n\n  public inline fun setUShort(ary: ByteArray, index: Int, value: UShort): Unit =\n    setShort(ary, index, value.toShort())\n\n  public inline fun setInt(ary: ByteArray, index: Int, value: Int) {\n    var idx = index\n    ary[idx++] = (value and 0xff).toByte()\n    ary[idx++] = (value shr 8 and 0xff).toByte()\n    ary[idx++] = (value shr 16 and 0xff).toByte()\n    ary[idx] = (value shr 24 and 0xff).toByte()\n  }\n\n  public inline fun setUInt(ary: ByteArray, index: Int, value: UInt): Unit =\n    setInt(ary, index, value.toInt())\n\n  public inline fun setLong(ary: ByteArray, index: Int, value: Long) {\n    var i = value.toInt()\n    setInt(ary, index, i)\n    i = (value shr 32).toInt()\n    setInt(ary, index + 4, i)\n  }\n\n  public inline fun setULong(ary: ByteArray, index: Int, value: ULong): Unit =\n    setLong(ary, index, value.toLong())\n\n  public inline fun setFloat(ary: ByteArray, index: Int, value: Float) {\n    setInt(ary, index, value.toRawBits())\n  }\n\n  public inline fun setDouble(ary: ByteArray, index: Int, value: Double) {\n    setLong(ary, index, value.toRawBits())\n  }\n\n  public inline fun getFloat(ary: ByteArray, index: Int): Float = Float.fromBits(getInt(ary, index))\n\n  public inline fun getDouble(ary: ByteArray, index: Int): Double =\n    Double.fromBits(getLong(ary, index))\n}\n"
  },
  {
    "path": "kotlin/flatbuffers-kotlin/src/commonMain/kotlin/com/google/flatbuffers/kotlin/FlatBufferBuilder.kt",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.google.flatbuffers.kotlin\n\nimport kotlin.jvm.JvmOverloads\n\n/**\n * Class that helps you build a FlatBuffer. See the section \"Use in Kotlin\" in the main FlatBuffers\n * documentation.\n */\npublic class FlatBufferBuilder\n@JvmOverloads\nconstructor(\n  private val initialSize: Int = 1024,\n  private var buffer: ReadWriteBuffer = ArrayReadWriteBuffer(initialSize),\n) {\n  // Remaining space in the ByteBuffer.\n  private var space: Int = buffer.capacity\n\n  // Minimum alignment encountered so far.\n  private var minalign: Int = 1\n\n  // The vtable for the current table.\n  private var vtable: IntArray = IntArray(16)\n\n  // The amount of fields we're actually using.\n  private var vtableInUse: Int = 0\n\n  // Whether we are currently serializing a table.\n  private var nested: Boolean = false\n\n  // Whether the buffer is finished.\n  private var finished: Boolean = false\n\n  // Starting offset of the current struct/table.\n  private var objectStart: Int = 0\n\n  // List of offsets of all vtables.\n  private var vtables = IntArray(16)\n\n  // Number of entries in `vtables` in use.\n  private var numVtables = 0\n\n  // For the current vector being built.\n  private var vectorNumElems = 0\n\n  // False omits default values from the serialized data.\n  private var forceDefaults = false\n\n  // map used to cache shared strings.\n  private var stringPool: MutableMap<CharSequence, Offset<String>>? = null\n\n  /** Reset the FlatBufferBuilder by purging all data that it holds. */\n  public fun clear() {\n    space = buffer.capacity\n    buffer.clear()\n    minalign = 1\n    vtable.fill(0, 0, vtableInUse)\n    vtableInUse = 0\n    nested = false\n    finished = false\n    objectStart = 0\n    numVtables = 0\n    vectorNumElems = 0\n    stringPool?.clear()\n  }\n\n  /**\n   * Offset relative to the end of the buffer.\n   *\n   * @return Offset relative to the end of the buffer.\n   */\n  public fun offset(): Int = buffer.capacity - space\n\n  /**\n   * Add zero valued bytes to prepare a new entry to be added.\n   *\n   * @param byteSize Number of bytes to add.\n   */\n  public fun pad(byteSize: Int) {\n    for (i in 0 until byteSize) buffer[--space] = 0.toByte()\n  }\n\n  /**\n   * Prepare to write an element of `size` after `additional_bytes` have been written, e.g. if you\n   * write a string, you need to align such the int length field is aligned to\n   * [com.google.flatbuffers.Int.SIZE_BYTES], and the string data follows it directly. If all you\n   * need to do is alignment, `additional_bytes` will be 0.\n   *\n   * @param size This is the of the new element to write.\n   * @param additionalBytes The padding size.\n   */\n  public fun prep(size: Int, additionalBytes: Int) {\n    // Track the biggest thing we've ever aligned to.\n    if (size > minalign) minalign = size\n    // Find the amount of alignment needed such that `size` is properly\n    // aligned after `additional_bytes`\n\n    val alignSize: Int = ((buffer.capacity - space + additionalBytes).inv() + 1).and(size - 1)\n    // Reallocate the buffer if needed.\n    while (space < alignSize + size + additionalBytes) {\n      val oldBufSize: Int = buffer.capacity\n      val newBufSize = buffer.moveWrittenDataToEnd(oldBufSize + alignSize + size + additionalBytes)\n      space += newBufSize - oldBufSize\n    }\n    if (alignSize > 0) {\n      pad(alignSize)\n    }\n  }\n\n  /**\n   * Add a `boolean` to the buffer, backwards from the current location. Doesn't align nor check for\n   * space.\n   *\n   * @param x A `boolean` to put into the buffer.\n   */\n  public fun put(x: Boolean) {\n    space -= Byte.SIZE_BYTES\n    buffer[space] = (if (x) 1 else 0).toByte()\n  }\n\n  /**\n   * Add a [UByte] to the buffer, backwards from the current location. Doesn't align nor check for\n   * space.\n   *\n   * @param x A [UByte] to put into the buffer.\n   */\n  public fun put(x: UByte): Unit = put(x.toByte())\n\n  /**\n   * Add a [Byte] to the buffer, backwards from the current location. Doesn't align nor check for\n   * space.\n   *\n   * @param x A [Byte] to put into the buffer.\n   */\n  public fun put(x: Byte) {\n    space -= Byte.SIZE_BYTES\n    buffer[space] = x\n  }\n\n  /**\n   * Add a [UShort] to the buffer, backwards from the current location. Doesn't align nor check for\n   * space.\n   *\n   * @param x A [UShort] to put into the buffer.\n   */\n  public fun put(x: UShort): Unit = put(x.toShort())\n\n  /**\n   * Add a [Short] to the buffer, backwards from the current location. Doesn't align nor check for\n   * space.\n   *\n   * @param x A [Short] to put into the buffer.\n   */\n  public fun put(x: Short) {\n    space -= Short.SIZE_BYTES\n    buffer.set(space, x)\n  }\n\n  /**\n   * Add an [UInt] to the buffer, backwards from the current location. Doesn't align nor check for\n   * space.\n   *\n   * @param x An [UInt] to put into the buffer.\n   */\n  public fun put(x: UInt): Unit = put(x.toInt())\n\n  /**\n   * Add an [Int] to the buffer, backwards from the current location. Doesn't align nor check for\n   * space.\n   *\n   * @param x An [Int] to put into the buffer.\n   */\n  public fun put(x: Int) {\n    space -= Int.SIZE_BYTES\n    buffer.set(space, x)\n  }\n\n  /**\n   * Add a [ULong] to the buffer, backwards from the current location. Doesn't align nor check for\n   * space.\n   *\n   * @param x A [ULong] to put into the buffer.\n   */\n  public fun put(x: ULong): Unit = put(x.toLong())\n\n  /**\n   * Add a [Long] to the buffer, backwards from the current location. Doesn't align nor check for\n   * space.\n   *\n   * @param x A [Long] to put into the buffer.\n   */\n  public fun put(x: Long) {\n    space -= Long.SIZE_BYTES\n    buffer.set(space, x)\n  }\n\n  /**\n   * Add a [Float] to the buffer, backwards from the current location. Doesn't align nor check for\n   * space.\n   *\n   * @param x A [Float] to put into the buffer.\n   */\n  public fun put(x: Float) {\n    space -= Float.SIZE_BYTES\n    buffer.set(space, x)\n  }\n\n  /**\n   * Add a [Double] to the buffer, backwards from the current location. Doesn't align nor check for\n   * space.\n   *\n   * @param x A [Double] to put into the buffer.\n   */\n  public fun put(x: Double) {\n    space -= Double.SIZE_BYTES\n    buffer.set(space, x)\n  }\n\n  /**\n   * Add a [Boolean] to the buffer, properly aligned, and grows the buffer (if necessary).\n   *\n   * @param x A [Boolean] to put into the buffer.\n   */\n  public fun add(x: Boolean) {\n    prep(Byte.SIZE_BYTES, 0)\n    put(x)\n  }\n\n  /**\n   * Add a [UByte] to the buffer, properly aligned, and grows the buffer (if necessary).\n   *\n   * @param x A [UByte] to put into the buffer.\n   */\n  public fun add(x: UByte): Unit = add(x.toByte())\n\n  /**\n   * Add a [Byte] to the buffer, properly aligned, and grows the buffer (if necessary).\n   *\n   * @param x A [Byte] to put into the buffer.\n   */\n  public fun add(x: Byte) {\n    prep(Byte.SIZE_BYTES, 0)\n    put(x)\n  }\n\n  /**\n   * Add a [UShort] to the buffer, properly aligned, and grows the buffer (if necessary).\n   *\n   * @param x A [UShort] to put into the buffer.\n   */\n  public fun add(x: UShort): Unit = add(x.toShort())\n\n  /**\n   * Add a [Short] to the buffer, properly aligned, and grows the buffer (if necessary).\n   *\n   * @param x A [Short] to put into the buffer.\n   */\n  public fun add(x: Short) {\n    prep(Short.SIZE_BYTES, 0)\n    put(x)\n  }\n\n  /**\n   * Add an [Unit] to the buffer, properly aligned, and grows the buffer (if necessary).\n   *\n   * @param x An [Unit] to put into the buffer.\n   */\n  public fun add(x: UInt): Unit = add(x.toInt())\n\n  /**\n   * Add an [Int] to the buffer, properly aligned, and grows the buffer (if necessary).\n   *\n   * @param x An [Int] to put into the buffer.\n   */\n  public fun add(x: Int) {\n    prep(Int.SIZE_BYTES, 0)\n    put(x)\n  }\n\n  /**\n   * Add a [ULong] to the buffer, properly aligned, and grows the buffer (if necessary).\n   *\n   * @param x A [ULong] to put into the buffer.\n   */\n  public fun add(x: ULong): Unit = add(x.toLong())\n\n  /**\n   * Add a `long` to the buffer, properly aligned, and grows the buffer (if necessary).\n   *\n   * @param x A `long` to put into the buffer.\n   */\n  public fun add(x: Long) {\n    prep(Long.SIZE_BYTES, 0)\n    put(x)\n  }\n\n  /**\n   * Add a [Float] to the buffer, properly aligned, and grows the buffer (if necessary).\n   *\n   * @param x A [Float] to put into the buffer.\n   */\n  public fun add(x: Float) {\n    prep(Float.SIZE_BYTES, 0)\n    put(x)\n  }\n\n  /**\n   * Add a [Double] to the buffer, properly aligned, and grows the buffer (if necessary).\n   *\n   * @param x A [Double] to put into the buffer.\n   */\n  public fun add(x: Double) {\n    prep(Double.SIZE_BYTES, 0)\n    put(x)\n  }\n\n  /**\n   * Adds on offset, relative to where it will be written.\n   *\n   * @param off The offset to add.\n   */\n  public fun add(off: Offset<*>): Unit = addOffset(off.value)\n\n  public fun add(off: VectorOffset<*>): Unit = addOffset(off.value)\n\n  private fun addOffset(off: Int) {\n    prep(Int.SIZE_BYTES, 0) // Ensure alignment is already done.\n    put(buffer.capacity - space - off + Int.SIZE_BYTES)\n  }\n\n  /**\n   * Start a new array/vector of objects. Users usually will not call this directly. The\n   * `FlatBuffers` compiler will create a start/end method for vector types in generated code.\n   *\n   * The expected sequence of calls is:\n   * 1. Start the array using this method.\n   * 1. Call [.addOffset] `num_elems` number of times to set the offset of each element in the\n   *    array.\n   * 1. Call [.endVector] to retrieve the offset of the array.\n   *\n   * For example, to create an array of strings, do:\n   * <pre>`// Need 10 strings\n   * FlatBufferBuilder builder = new FlatBufferBuilder(existingBuffer);\n   * int[] offsets = new int[10];\n   *\n   * for (int i = 0; i < 10; i++) {\n   * offsets[i] = fbb.createString(\" \" + i);\n   * }\n   *\n   * // Have the strings in the buffer, but don't have a vector.\n   * // Add a vector that references the newly created strings:\n   * builder.startVector(4, offsets.length, 4);\n   *\n   * // Add each string to the newly created vector\n   * // The strings are added in reverse order since the buffer\n   * // is filled in back to front\n   * for (int i = offsets.length - 1; i >= 0; i--) {\n   * builder.addOffset(offsets[i]);\n   * }\n   *\n   * // Finish off the vector\n   * int offsetOfTheVector = fbb.endVector();\n   * `</pre> *\n   *\n   * @param elemSize The size of each element in the array.\n   * @param numElems The number of elements in the array.\n   * @param alignment The alignment of the array.\n   */\n  public fun startVector(elemSize: Int, numElems: Int, alignment: Int) {\n    notNested()\n    vectorNumElems = numElems\n    prep(Int.SIZE_BYTES, elemSize * numElems)\n    prep(alignment, elemSize * numElems) // Just in case alignment > int.\n    nested = true\n  }\n\n  public fun startString(numElems: Int): Unit = startVector(1, numElems, 1)\n\n  /**\n   * Finish off the creation of an array and all its elements. The array must be created with\n   * [.startVector].\n   *\n   * @return The offset at which the newly created array starts.\n   * @see .startVector\n   */\n  public fun <T> endVector(): VectorOffset<T> {\n    if (!nested) throw AssertionError(\"FlatBuffers: endVector called without startVector\")\n    nested = false\n    put(vectorNumElems)\n    return VectorOffset(offset())\n  }\n\n  public fun endString(): Offset<String> {\n    if (!nested) throw AssertionError(\"FlatBuffers: endString called without startString\")\n    nested = false\n    put(vectorNumElems)\n    return Offset(offset())\n  }\n\n  private fun endVector(): Int {\n    if (!nested) throw AssertionError(\"FlatBuffers: endVector called without startVector\")\n    nested = false\n    put(vectorNumElems)\n    return offset()\n  }\n\n  /**\n   * Create a new array/vector and return a ByteBuffer to be filled later. Call [endVector] after\n   * this method to get an offset to the beginning of vector.\n   *\n   * @param elemSize the size of each element in bytes.\n   * @param numElems number of elements in the vector.\n   * @param alignment byte alignment.\n   * @return ByteBuffer with position and limit set to the space allocated for the array.\n   */\n  public fun createUnintializedVector(\n    elemSize: Int,\n    numElems: Int,\n    alignment: Int,\n  ): ReadWriteBuffer {\n    val length = elemSize * numElems\n    startVector(elemSize, numElems, alignment)\n    space -= length\n    buffer.writePosition = space\n    return buffer.writeSlice(buffer.writePosition, length)\n  }\n\n  /**\n   * Create a vector of tables.\n   *\n   * @param offsets Offsets of the tables.\n   * @return Returns offset of the vector.\n   */\n  public fun <T> createVectorOfTables(offsets: Array<Offset<T>>): VectorOffset<T> {\n    notNested()\n    startVector(Int.SIZE_BYTES, offsets.size, Int.SIZE_BYTES)\n    for (i in offsets.indices.reversed()) add(offsets[i])\n    return VectorOffset(endVector())\n  }\n\n  /**\n   * Create a vector of sorted by the key tables.\n   *\n   * @param obj Instance of the table subclass.\n   * @param offsets Offsets of the tables.\n   * @return Returns offset of the sorted vector.\n   */\n  public fun <T : Table> createSortedVectorOfTables(\n    obj: T,\n    offsets: Array<Offset<T>>,\n  ): VectorOffset<T> {\n    obj.sortTables(offsets, buffer)\n    return createVectorOfTables(offsets)\n  }\n\n  /**\n   * Encode the String `s` in the buffer using UTF-8. If a String with this exact contents has\n   * already been serialized using this method, instead simply returns the offset of the existing\n   * String.\n   *\n   * Usage of the method will incur into additional allocations, so it is advisable to use it only\n   * when it is known upfront that your message will have several repeated strings.\n   *\n   * @param s The String to encode.\n   * @return The offset in the buffer where the encoded String starts.\n   */\n  public fun createSharedString(s: CharSequence): Offset<String> {\n    if (stringPool == null) {\n      stringPool = HashMap()\n      val offset = createString(s)\n      stringPool!![s] = offset\n      return offset\n    }\n    var offset = stringPool!![s]\n    if (offset == null) {\n      offset = createString(s)\n      stringPool?.put(s, offset)\n    }\n    return offset\n  }\n\n  /**\n   * Encode the [CharSequence] `s` in the buffer using UTF-8.\n   *\n   * @param s The [CharSequence] to encode.\n   * @return The offset in the buffer where the encoded string starts.\n   */\n  public fun createString(s: CharSequence): Offset<String> {\n    val length: Int = Utf8.encodedLength(s)\n    add(0.toByte())\n    startString(length)\n    space -= length\n    buffer.writePosition = space\n    buffer.put(s, length)\n    return endString()\n  }\n\n  /**\n   * Create a string in the buffer from an already encoded UTF-8 string in a ByteBuffer.\n   *\n   * @param s An already encoded UTF-8 string as a `ByteBuffer`.\n   * @return The offset in the buffer where the encoded string starts.\n   */\n  public fun createString(s: ReadBuffer): Offset<String> {\n    val length: Int = s.limit\n    add(0.toByte())\n    startVector(1, length, 1)\n    space -= length\n    buffer.writePosition = space\n    buffer.put(s)\n    return endString()\n  }\n\n  /**\n   * Create a byte array in the buffer.\n   *\n   * @param arr A source array with data\n   * @return The offset in the buffer where the encoded array starts.\n   */\n  public fun createByteVector(arr: ByteArray): VectorOffset<Byte> {\n    val length = arr.size\n    startVector(1, length, 1)\n    space -= length\n    buffer.writePosition = space\n    buffer.put(arr)\n    return VectorOffset(endVector())\n  }\n\n  /**\n   * Create a byte array in the buffer.\n   *\n   * @param arr a source array with data.\n   * @param offset the offset in the source array to start copying from.\n   * @param length the number of bytes to copy from the source array.\n   * @return The offset in the buffer where the encoded array starts.\n   */\n  public fun createByteVector(arr: ByteArray, offset: Int, length: Int): VectorOffset<Byte> {\n    startVector(1, length, 1)\n    space -= length\n    buffer.writePosition = space\n    buffer.put(arr, offset, length)\n    return VectorOffset(endVector())\n  }\n\n  /**\n   * Create a byte array in the buffer.\n   *\n   * The source [ReadBuffer] position is advanced until [ReadBuffer.limit] after this call.\n   *\n   * @param data A source [ReadBuffer] with data.\n   * @return The offset in the buffer where the encoded array starts.\n   */\n  public fun createByteVector(\n    data: ReadBuffer,\n    from: Int = 0,\n    until: Int = data.limit,\n  ): VectorOffset<Byte> {\n    val length: Int = until - from\n    startVector(1, length, 1)\n    space -= length\n    buffer.writePosition = space\n    buffer.put(data, from, until)\n    return VectorOffset(endVector())\n  }\n\n  /** Should not be accessing the final buffer before it is finished. */\n  public fun finished() {\n    if (!finished)\n      throw AssertionError(\n        \"FlatBuffers: you can only access the serialized buffer after it has been\" +\n          \" finished by FlatBufferBuilder.finish().\"\n      )\n  }\n\n  /**\n   * Should not be creating any other object, string or vector while an object is being constructed.\n   */\n  public fun notNested() {\n    if (nested) throw AssertionError(\"FlatBuffers: object serialization must not be nested.\")\n  }\n\n  /**\n   * Structures are always stored inline, they need to be created right where they're used. You'll\n   * get this assertion failure if you created it elsewhere.\n   *\n   * @param obj The offset of the created object.\n   */\n  public fun nested(obj: Int) {\n    if (obj != offset()) throw AssertionError(\"FlatBuffers: struct must be serialized inline.\")\n  }\n\n  /**\n   * Start encoding a new object in the buffer. Users will not usually need to call this directly.\n   * The `FlatBuffers` compiler will generate helper methods that call this method internally.\n   *\n   * For example, using the \"Monster\" code found on the \"landing page\". An object of type `Monster`\n   * can be created using the following code:\n   * <pre>`int testArrayOfString = Monster.createTestarrayofstringVector(fbb, new int[] {\n   * fbb.createString(\"test1\"),\n   * fbb.createString(\"test2\")\n   * });\n   *\n   * Monster.startMonster(fbb);\n   * Monster.addPos(fbb, Vec3.createVec3(fbb, 1.0f, 2.0f, 3.0f, 3.0,\n   * Color.Green, (short)5, (byte)6));\n   * Monster.addHp(fbb, (short)80);\n   * Monster.addName(fbb, str);\n   * Monster.addInventory(fbb, inv);\n   * Monster.addTestType(fbb, (byte)Any.Monster);\n   * Monster.addTest(fbb, mon2);\n   * Monster.addTest4(fbb, test4);\n   * Monster.addTestarrayofstring(fbb, testArrayOfString);\n   * int mon = Monster.endMonster(fbb);\n   * `</pre> *\n   *\n   * Here:\n   * * The call to `Monster#startMonster(FlatBufferBuilder)` will call this method with the right\n   *   number of fields set.\n   * * `Monster#endMonster(FlatBufferBuilder)` will ensure [.endObject] is called.\n   *\n   * It's not recommended to call this method directly. If it's called manually, you must ensure to\n   * audit all calls to it whenever fields are added or removed from your schema. This is\n   * automatically done by the code generated by the `FlatBuffers` compiler.\n   *\n   * @param numFields The number of fields found in this object.\n   */\n  public fun startTable(numFields: Int) {\n    notNested()\n    if (vtable.size < numFields) {\n      vtable = IntArray(numFields)\n    }\n    vtableInUse = numFields\n    for (i in 0 until vtableInUse) vtable[i] = 0\n    nested = true\n    objectStart = offset()\n  }\n\n  /**\n   * Add a [Boolean] to a table at `o` into its vtable, with value `x` and default `d`. If\n   * `force_defaults` is `false`, compare `x` against the default value `d`. If `x` contains the\n   * default value, it can be skipped.\n   */\n  public fun add(o: Int, x: Boolean, d: Boolean?) {\n    if (forceDefaults || x != d) {\n      add(x)\n      slot(o)\n    }\n  }\n\n  // unboxed specialization\n  public fun add(o: Int, x: Boolean, d: Boolean) {\n    if (forceDefaults || x != d) {\n      add(x)\n      slot(o)\n    }\n  }\n\n  /**\n   * Add a [UByte] to a table at `o` into its vtable, with value `x` and default `d`. If\n   * `force_defaults` is `false`, compare `x` against the default value `d`. If `x` contains the\n   * default value, it can be skipped.\n   */\n  public fun add(o: Int, x: UByte, d: UByte?): Unit = add(o, x.toByte(), d?.toByte())\n\n  // unboxed specialization\n  public fun add(o: Int, x: UByte, d: UByte): Unit = add(o, x.toByte(), d.toByte())\n\n  /**\n   * Add a [Byte] to a table at `o` into its vtable, with value `x` and default `d`. If\n   * `force_defaults` is `false`, compare `x` against the default value `d`. If `x` contains the\n   * default value, it can be skipped.\n   */\n  public fun add(o: Int, x: Byte, d: Byte?) {\n    if (forceDefaults || x != d) {\n      add(x)\n      slot(o)\n    }\n  }\n\n  // unboxed specialization\n  public fun add(o: Int, x: Byte, d: Byte) {\n    if (forceDefaults || x != d) {\n      add(x)\n      slot(o)\n    }\n  }\n\n  /**\n   * Add a [UShort] to a table at `o` into its vtable, with value `x` and default `d`. If\n   * `force_defaults` is `false`, compare `x` against the default value `d`. If `x` contains the\n   * default value, it can be skipped.\n   */\n  public fun add(o: Int, x: UShort, d: UShort?): Unit = add(o, x.toShort(), d?.toShort())\n\n  // unboxed specialization\n  public fun add(o: Int, x: UShort, d: UShort): Unit = add(o, x.toShort(), d.toShort())\n\n  /**\n   * Add a [Short] to a table at `o` into its vtable, with value `x` and default `d`. If\n   * `force_defaults` is `false`, compare `x` against the default value `d`. If `x` contains the\n   * default value, it can be skipped.\n   */\n  public fun add(o: Int, x: Short, d: Short?) {\n    if (forceDefaults || x != d) {\n      add(x)\n      slot(o)\n    }\n  }\n\n  // unboxed specialization\n  public fun add(o: Int, x: Short, d: Short) {\n    if (forceDefaults || x != d) {\n      add(x)\n      slot(o)\n    }\n  }\n\n  /**\n   * Add a [UInt] to a table at `o` into its vtable, with value `x` and default `d`. If\n   * `force_defaults` is `false`, compare `x` against the default value `d`. If `x` contains the\n   * default value, it can be skipped.\n   */\n  public fun add(o: Int, x: UInt, d: UInt?): Unit = add(o, x.toInt(), d?.toInt())\n\n  // unboxed specialization\n  public fun add(o: Int, x: UInt, d: UInt): Unit = add(o, x.toInt(), d.toInt())\n\n  /**\n   * Add a [Int] to a table at `o` into its vtable, with value `x` and default `d`. If\n   * `force_defaults` is `false`, compare `x` against the default value `d`. If `x` contains the\n   * default value, it can be skipped.\n   */\n  public fun add(o: Int, x: Int, d: Int?) {\n    if (forceDefaults || x != d) {\n      add(x)\n      slot(o)\n    }\n  }\n\n  // unboxed specialization\n  public fun add(o: Int, x: Int, d: Int) {\n    if (forceDefaults || x != d) {\n      add(x)\n      slot(o)\n    }\n  }\n\n  /**\n   * Add a [ULong] to a table at `o` into its vtable, with value `x` and default `d`. If\n   * `force_defaults` is `false`, compare `x` against the default value `d`. If `x` contains the\n   * default value, it can be skipped.\n   */\n  public fun add(o: Int, x: ULong, d: ULong?): Unit = add(o, x.toLong(), d?.toLong())\n\n  // unboxed specialization\n  public fun add(o: Int, x: ULong, d: ULong): Unit = add(o, x.toLong(), d.toLong())\n\n  /**\n   * Add a [Long] to a table at `o` into its vtable, with value `x` and default `d`. If\n   * `force_defaults` is `false`, compare `x` against the default value `d`. If `x` contains the\n   * default value, it can be skipped.\n   */\n  public fun add(o: Int, x: Long, d: Long?) {\n    if (forceDefaults || x != d) {\n      add(x)\n      slot(o)\n    }\n  }\n\n  // unboxed specialization\n  public fun add(o: Int, x: Long, d: Long) {\n    if (forceDefaults || x != d) {\n      add(x)\n      slot(o)\n    }\n  }\n\n  /**\n   * Add a [Float] to a table at `o` into its vtable, with value `x` and default `d`. If\n   * `force_defaults` is `false`, compare `x` against the default value `d`. If `x` contains the\n   * default value, it can be skipped.\n   */\n  public fun add(o: Int, x: Float, d: Float?) {\n    if (forceDefaults || x != d) {\n      add(x)\n      slot(o)\n    }\n  }\n\n  // unboxed specialization\n  public fun add(o: Int, x: Float, d: Float) {\n    if (forceDefaults || x != d) {\n      add(x)\n      slot(o)\n    }\n  }\n\n  /**\n   * Add a [Double] to a table at `o` into its vtable, with value `x` and default `d`. If\n   * `force_defaults` is `false`, compare `x` against the default value `d`. If `x` contains the\n   * default value, it can be skipped.\n   */\n  public fun add(o: Int, x: Double, d: Double?) {\n    if (forceDefaults || x != d) {\n      add(x)\n      slot(o)\n    }\n  }\n\n  // unboxed specialization\n  public fun add(o: Int, x: Double, d: Double) {\n    if (forceDefaults || x != d) {\n      add(x)\n      slot(o)\n    }\n  }\n\n  /**\n   * Add an `offset` to a table at `o` into its vtable, with value `x` and default `d`.\n   *\n   * @param o The index into the vtable.\n   * @param x An `offset` to put into the buffer, depending on how defaults are handled. If\n   *   `force_defaults` is `false`, compare `x` against the default value `d`. If `x` contains the\n   *   default value, it can be skipped.\n   * @param d An `offset` default value to compare against when `force_defaults` is `false`.\n   */\n  public fun add(o: Int, x: Offset<*>, d: Int) {\n    if (forceDefaults || x.value != d) {\n      add(x)\n      slot(o)\n    }\n  }\n\n  public fun add(o: Int, x: VectorOffset<*>, d: Int) {\n    if (forceDefaults || x.value != d) {\n      add(x)\n      slot(o)\n    }\n  }\n\n  /**\n   * Add a struct to the table. Structs are stored inline, so nothing additional is being added.\n   *\n   * @param vOffset The index into the vtable.\n   * @param x The offset of the created struct.\n   * @param d The default value is always `0`.\n   */\n  public fun addStruct(vOffset: Int, x: Offset<*>, d: Offset<*>?): Unit =\n    addStruct(vOffset, x.value, d?.value)\n\n  // unboxed specialization\n  public fun addStruct(vOffset: Int, x: Offset<*>, d: Offset<*>): Unit =\n    addStruct(vOffset, x.value, d.value)\n\n  public fun addStruct(vOffset: Int, x: Int, d: Int?) {\n    if (x != d) {\n      nested(x)\n      slot(vOffset)\n    }\n  }\n\n  // unboxed specialization\n  public fun addStruct(vOffset: Int, x: Int, d: Int) {\n    if (x != d) {\n      nested(x)\n      slot(vOffset)\n    }\n  }\n\n  /**\n   * Set the current vtable at `voffset` to the current location in the buffer.\n   *\n   * @param vOffset The index into the vtable to store the offset relative to the end of the buffer.\n   */\n  public fun slot(vOffset: Int) {\n    vtable[vOffset] = offset()\n  }\n\n  /**\n   * Finish off writing the object that is under construction.\n   *\n   * @return The offset to the object inside [.dataBuffer].\n   * @see .startTable\n   */\n  public fun <T> endTable(): Offset<T> {\n    if (!nested) throw AssertionError(\"FlatBuffers: endTable called without startTable\")\n\n    val vtable = this.vtable\n\n    add(0)\n    val vtableloc = offset()\n    // Write out the current vtable.\n    var i: Int = vtableInUse - 1\n    // Trim trailing zeroes.\n    while (i >= 0 && vtable[i] == 0) {\n      i--\n    }\n    val trimmedSize = i + 1\n    while (i >= 0) {\n      // Offset relative to the start of the table.\n      add((if (vtable[i] != 0) vtableloc - vtable[i] else 0).toShort())\n      i--\n    }\n\n    add((vtableloc - objectStart).toShort())\n    add(((trimmedSize + 2) * Short.SIZE_BYTES).toShort())\n\n    // Search for an existing vtable that matches the current one.\n    var existingVtable = 0\n    i = 0\n    outer_loop@ while (i < numVtables) {\n      val vt1: Int = buffer.capacity - vtables[i]\n      val vt2 = space\n      val len: Short = buffer.getShort(vt1)\n      if (len == buffer.getShort(vt2)) {\n        var j: Int = Short.SIZE_BYTES\n        while (j < len) {\n          if (buffer.getShort(vt1 + j) != buffer.getShort(vt2 + j)) {\n            i++\n            continue@outer_loop\n          }\n          j += Short.SIZE_BYTES\n        }\n        existingVtable = vtables[i]\n        break@outer_loop\n      }\n      i++\n    }\n    if (existingVtable != 0) {\n      // Found a match:\n      // Remove the current vtable.\n      space = buffer.capacity - vtableloc\n      // Point table to existing vtable.\n      buffer.set(space, existingVtable - vtableloc)\n    } else {\n      // No match:\n      // Add the location of the current vtable to the list of vtables.\n      if (numVtables == vtables.size) vtables = vtables.copyOf(numVtables * 2)\n      vtables[numVtables++] = offset()\n      // Point table to current vtable.\n      buffer.set(buffer.capacity - vtableloc, offset() - vtableloc)\n    }\n    nested = false\n    return Offset(vtableloc)\n  }\n\n  /**\n   * Checks that a required field has been set in a given table that has just been constructed.\n   *\n   * @param table The offset to the start of the table from the `ByteBuffer` capacity.\n   * @param field The offset to the field in the vtable.\n   */\n  public fun required(table: Offset<*>, field: Int, fileName: String? = null) {\n    val tableStart: Int = buffer.capacity - table\n    val vtableStart: Int = tableStart - buffer.getInt(tableStart)\n    val ok = buffer.getShort(vtableStart + field).toInt() != 0\n    // If this fails, the caller will show what field needs to be set.\n    if (!ok) throw AssertionError(\"FlatBuffers: field ${fileName ?: field} must be set\")\n  }\n\n  /**\n   * Finalize a buffer, pointing to the given `root_table`.\n   *\n   * @param rootTable An offset to be added to the buffer.\n   * @param sizePrefix Whether to prefix the size to the buffer.\n   */\n  protected fun finish(rootTable: Offset<*>, sizePrefix: Boolean) {\n    prep(minalign, Int.SIZE_BYTES + if (sizePrefix) Int.SIZE_BYTES else 0)\n    add(rootTable)\n    if (sizePrefix) {\n      add(buffer.capacity - space)\n    }\n    buffer.writePosition = space\n    finished = true\n  }\n\n  /**\n   * Finalize a buffer, pointing to the given `root_table`.\n   *\n   * @param rootTable An offset to be added to the buffer.\n   */\n  public fun finish(rootTable: Offset<*>) {\n    finish(rootTable, false)\n  }\n\n  /**\n   * Finalize a buffer, pointing to the given `root_table`, with the size prefixed.\n   *\n   * @param rootTable An offset to be added to the buffer.\n   */\n  public fun finishSizePrefixed(rootTable: Offset<*>) {\n    finish(rootTable, true)\n  }\n\n  /**\n   * Finalize a buffer, pointing to the given `root_table`.\n   *\n   * @param rootTable An offset to be added to the buffer.\n   * @param fileIdentifier A FlatBuffer file identifier to be added to the buffer before\n   *   `root_table`.\n   * @param sizePrefix Whether to prefix the size to the buffer.\n   */\n  protected fun finish(rootTable: Offset<*>, fileIdentifier: String, sizePrefix: Boolean) {\n    val identifierSize = 4\n    prep(minalign, Int.SIZE_BYTES + identifierSize + if (sizePrefix) Int.SIZE_BYTES else 0)\n    if (fileIdentifier.length != identifierSize)\n      throw AssertionError(\"FlatBuffers: file identifier must be length \" + identifierSize)\n    for (i in identifierSize - 1 downTo 0) {\n      add(fileIdentifier[i].code.toByte())\n    }\n    finish(rootTable, sizePrefix)\n  }\n\n  /**\n   * Finalize a buffer, pointing to the given `root_table`.\n   *\n   * @param rootTable An offset to be added to the buffer.\n   * @param fileIdentifier A FlatBuffer file identifier to be added to the buffer before\n   *   `root_table`.\n   */\n  public fun finish(rootTable: Offset<*>, fileIdentifier: String) {\n    finish(rootTable, fileIdentifier, false)\n  }\n\n  /**\n   * Finalize a buffer, pointing to the given `root_table`, with the size prefixed.\n   *\n   * @param rootTable An offset to be added to the buffer.\n   * @param fileIdentifier A FlatBuffer file identifier to be added to the buffer before\n   *   `root_table`.\n   */\n  public fun finishSizePrefixed(rootTable: Offset<*>, fileIdentifier: String) {\n    finish(rootTable, fileIdentifier, true)\n  }\n\n  /**\n   * In order to save space, fields that are set to their default value don't get serialized into\n   * the buffer. Forcing defaults provides a way to manually disable this optimization.\n   *\n   * @param forceDefaults When set to `true`, always serializes default values.\n   * @return Returns `this`.\n   */\n  public fun forceDefaults(forceDefaults: Boolean): FlatBufferBuilder {\n    this.forceDefaults = forceDefaults\n    return this\n  }\n\n  /**\n   * Get the ByteBuffer representing the FlatBuffer. Only call this after you've called `finish()`.\n   * The actual data starts at the ByteBuffer's current position, not necessarily at `0`.\n   *\n   * @return The [ReadBuffer] representing the FlatBuffer\n   */\n  public fun dataBuffer(): ReadWriteBuffer {\n    finished()\n    return buffer\n  }\n\n  /**\n   * A utility function to copy and return the ByteBuffer data as a `byte[]`.\n   *\n   * @return A full copy of the [data buffer][.dataBuffer].\n   */\n  public fun sizedByteArray(start: Int = space, length: Int = buffer.capacity - space): ByteArray {\n    finished()\n    val array = ByteArray(length)\n    buffer.getBytes(array, start)\n    return array\n  }\n\n  /**\n   * Helper function to test if a field is present in the table\n   *\n   * @param offset virtual table offset\n   * @return true if the filed is present\n   */\n  public fun Table.isFieldPresent(offset: Int): Boolean = this.offset(offset) != 0\n}\n\npublic fun Double.sign(): Double =\n  when {\n    this.isNaN() -> Double.NaN\n    this > 0 -> 1.0\n    this < 0 -> -1.0\n    else -> this\n  }\n\npublic fun Float.sign(): Float =\n  when {\n    this.isNaN() -> Float.NaN\n    this > 0 -> 1.0f\n    this < 0 -> -1.0f\n    else -> this\n  }\n\npublic fun Int.sign(): Int =\n  when {\n    this > 0 -> 1\n    this < 0 -> -1\n    else -> this\n  }\n"
  },
  {
    "path": "kotlin/flatbuffers-kotlin/src/commonMain/kotlin/com/google/flatbuffers/kotlin/Flatbuffers.kt",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.google.flatbuffers.kotlin\n\nimport kotlin.jvm.JvmInline\nimport kotlin.math.min\n\n// For now a typealias to guarantee type safety.\npublic typealias UnionOffset = Offset<Any>\n\npublic typealias UnionOffsetArray = OffsetArray<Any>\n\npublic typealias StringOffsetArray = OffsetArray<String>\n\npublic inline fun UnionOffsetArray(\n  size: Int,\n  crossinline call: (Int) -> Offset<Any>,\n): UnionOffsetArray = UnionOffsetArray(IntArray(size) { call(it).value })\n\npublic inline fun StringOffsetArray(\n  size: Int,\n  crossinline call: (Int) -> Offset<String>,\n): StringOffsetArray = StringOffsetArray(IntArray(size) { call(it).value })\n\n/** Represents a \"pointer\" to a pointer types (table, string, struct) within the buffer */\n@JvmInline\npublic value class Offset<T>(public val value: Int) {\n  public fun toUnion(): UnionOffset = UnionOffset(value)\n}\n\n/** Represents an array of offsets. Used to avoid boxing offset types. */\n@JvmInline\npublic value class OffsetArray<T>(public val value: IntArray) {\n  public inline val size: Int\n    get() = value.size\n\n  public inline operator fun get(index: Int): Offset<T> = Offset(value[index])\n}\n\npublic inline fun <T> OffsetArray(size: Int, crossinline call: (Int) -> Offset<T>): OffsetArray<T> {\n  return OffsetArray(IntArray(size) { call(it).value })\n}\n\n/** Represents a \"pointer\" to a vector type with elements T */\n@JvmInline public value class VectorOffset<T>(public val value: Int)\n\npublic fun <T> Int.toOffset(): Offset<T> = Offset(this)\n\npublic operator fun <T> Offset<T>.minus(other: Int): Offset<T> = Offset(this.value - other)\n\npublic operator fun <T> Int.minus(other: Offset<T>): Int {\n  return this - other.value\n}\n\n/** All tables in the generated code derive from this class, and add their own accessors. */\npublic open class Table {\n\n  /** Used to hold the position of the `bb` buffer. */\n  public var bufferPos: Int = 0\n\n  /** The underlying ReadWriteBuffer to hold the data of the Table. */\n  public var bb: ReadWriteBuffer = emptyBuffer\n\n  /** Used to hold the vtable position. */\n  public var vtableStart: Int = 0\n\n  /** Used to hold the vtable size. */\n  public var vtableSize: Int = 0\n\n  protected inline fun <reified T> Int.invalid(default: T, crossinline valid: (Int) -> T): T =\n    if (this != 0) valid(this) else default\n\n  protected inline fun <reified T> lookupField(\n    i: Int,\n    default: T,\n    crossinline found: (Int) -> T,\n  ): T = offset(i).invalid(default) { found(it) }\n\n  /**\n   * Look up a field in the vtable.\n   *\n   * @param vtableOffset An `int` offset to the vtable in the Table's ReadWriteBuffer.\n   * @return Returns an offset into the object, or `0` if the field is not present.\n   */\n  public fun offset(vtableOffset: Int): Int =\n    if (vtableOffset < vtableSize) bb.getShort(vtableStart + vtableOffset).toInt() else 0\n\n  /**\n   * Retrieve a relative offset.\n   *\n   * @param offset An `int` index into the Table's ReadWriteBuffer containing the relative offset.\n   * @return Returns the relative offset stored at `offset`.\n   */\n  public fun indirect(offset: Int): Int = offset + bb.getInt(offset)\n\n  /**\n   * Create a Java `String` from UTF-8 data stored inside the FlatBuffer.\n   *\n   * This allocates a new string and converts to wide chars upon each access, which is not very\n   * efficient. Instead, each FlatBuffer string also comes with an accessor based on\n   * __vector_as_ReadWriteBuffer below, which is much more efficient, assuming your Java program can\n   * handle UTF-8 data directly.\n   *\n   * @param offset An `int` index into the Table's ReadWriteBuffer.\n   * @return Returns a `String` from the data stored inside the FlatBuffer at `offset`.\n   */\n  public fun string(offset: Int): String = string(offset, bb)\n\n  /**\n   * Get the length of a vector.\n   *\n   * @param offset An `int` index into the Table's ReadWriteBuffer.\n   * @return Returns the length of the vector whose offset is stored at `offset`.\n   */\n  public fun vectorLength(offset: Int): Int {\n    var newOffset = offset\n    newOffset += bufferPos\n    newOffset += bb.getInt(newOffset)\n    return bb.getInt(newOffset)\n  }\n\n  /**\n   * Get the start data of a vector.\n   *\n   * @param offset An `int` index into the Table's ReadWriteBuffer.\n   * @return Returns the start of the vector data whose offset is stored at `offset`.\n   */\n  public fun vector(offset: Int): Int {\n    var newOffset = offset\n    newOffset += bufferPos\n    return newOffset + bb.getInt(newOffset) + Int.SIZE_BYTES // data starts after the length\n  }\n\n  /**\n   * Initialize vector as a ReadWriteBuffer.\n   *\n   * This is more efficient than using duplicate, since it doesn't copy the data nor allocates a new\n   * [ReadBuffer], creating no garbage to be collected.\n   *\n   * @param buffer The [ReadBuffer] for the array\n   * @param vectorOffset The position of the vector in the byte buffer\n   * @param elemSize The size of each element in the array\n   * @return The [ReadBuffer] for the array\n   */\n  public fun vectorAsBuffer(buffer: ReadWriteBuffer, vectorOffset: Int, elemSize: Int): ReadBuffer {\n    val o = offset(vectorOffset)\n    if (o == 0) return emptyBuffer\n    val vectorStart = vector(o)\n    return buffer.slice(vectorStart, vectorLength(o) * elemSize)\n  }\n\n  /**\n   * Initialize any Table-derived type to point to the union at the given `offset`.\n   *\n   * @param t A `Table`-derived type that should point to the union at `offset`.\n   * @param offset An `int` index into the Table's ReadWriteBuffer.\n   * @return Returns the Table that points to the union at `offset`.\n   */\n  public fun union(t: Table, offset: Int): Table = union(t, offset, bb)\n\n  /**\n   * Sort tables by the key.\n   *\n   * @param offsets An 'int' indexes of the tables into the bb.\n   * @param bb A `ReadWriteBuffer` to get the tables.\n   */\n  public fun <T> sortTables(offsets: Array<Offset<T>>, bb: ReadWriteBuffer) {\n    val off = offsets.sortedWith { o1, o2 -> keysCompare(o1, o2, bb) }\n    for (i in offsets.indices) offsets[i] = off[i]\n  }\n\n  /**\n   * Compare two tables by the key.\n   *\n   * @param o1 An 'Integer' index of the first key into the bb.\n   * @param o2 An 'Integer' index of the second key into the bb.\n   * @param buffer A `ReadWriteBuffer` to get the keys.\n   */\n  public open fun keysCompare(o1: Offset<*>, o2: Offset<*>, buffer: ReadWriteBuffer): Int = 0\n\n  /**\n   * Re-init the internal state with an external buffer `ReadWriteBuffer` and an offset within.\n   *\n   * This method exists primarily to allow recycling Table instances without risking memory leaks\n   * due to `ReadWriteBuffer` references.\n   */\n  public inline fun <reified T : Table> reset(i: Int, reuseBuffer: ReadWriteBuffer): T {\n    bb = reuseBuffer\n    if (bb != emptyBuffer) {\n      bufferPos = i\n      vtableStart = bufferPos - bb.getInt(bufferPos)\n      vtableSize = bb.getShort(vtableStart).toInt()\n    } else {\n      bufferPos = 0\n      vtableStart = 0\n      vtableSize = 0\n    }\n    return this as T\n  }\n\n  /**\n   * Resets the internal state with a null `ReadWriteBuffer` and a zero position.\n   *\n   * This method exists primarily to allow recycling Table instances without risking memory leaks\n   * due to `ReadWriteBuffer` references. The instance will be unusable until it is assigned again\n   * to a `ReadWriteBuffer`.\n   */\n  public inline fun <reified T : Table> reset(): T = reset(0, emptyBuffer)\n\n  public companion object {\n\n    public fun offset(vtableOffset: Int, offset: Offset<*>, bb: ReadWriteBuffer): Int {\n      val vtable: Int = bb.capacity - offset.value\n      return bb.getShort(vtable + vtableOffset - bb.getInt(vtable)) + vtable\n    }\n\n    /**\n     * Retrieve a relative offset.\n     *\n     * @param offset An `int` index into a ReadWriteBuffer containing the relative offset.\n     * @param bb from which the relative offset will be retrieved.\n     * @return Returns the relative offset stored at `offset`.\n     */\n    public fun indirect(offset: Int, bb: ReadWriteBuffer): Int {\n      return offset + bb.getInt(offset)\n    }\n\n    /**\n     * Create a Java `String` from UTF-8 data stored inside the FlatBuffer.\n     *\n     * This allocates a new string and converts to wide chars upon each access, which is not very\n     * efficient. Instead, each FlatBuffer string also comes with an accessor based on\n     * __vector_as_ReadWriteBuffer below, which is much more efficient, assuming your Java program\n     * can handle UTF-8 data directly.\n     *\n     * @param offset An `int` index into the Table's ReadWriteBuffer.\n     * @param bb Table ReadWriteBuffer used to read a string at given offset.\n     * @return Returns a `String` from the data stored inside the FlatBuffer at `offset`.\n     */\n    public fun string(offset: Int, bb: ReadWriteBuffer): String {\n      var newOffset = offset\n      newOffset += bb.getInt(newOffset)\n      val length: Int = bb.getInt(newOffset)\n      return bb.getString(newOffset + Int.SIZE_BYTES, length)\n    }\n\n    /**\n     * Initialize any Table-derived type to point to the union at the given `offset`.\n     *\n     * @param t A `Table`-derived type that should point to the union at `offset`.\n     * @param offset An `int` index into the Table's ReadWriteBuffer.\n     * @param bb Table ReadWriteBuffer used to initialize the object Table-derived type.\n     * @return Returns the Table that points to the union at `offset`.\n     */\n    public fun union(t: Table, offset: Int, bb: ReadWriteBuffer): Table =\n      t.reset(indirect(offset, bb), bb)\n\n    /**\n     * Check if a [ReadWriteBuffer] contains a file identifier.\n     *\n     * @param bb A `ReadWriteBuffer` to check if it contains the identifier `ident`.\n     * @param ident A `String` identifier of the FlatBuffer file.\n     * @return True if the buffer contains the file identifier\n     */\n    public fun hasIdentifier(bb: ReadWriteBuffer?, ident: String): Boolean {\n      val identifierLength = 4\n      if (ident.length != identifierLength)\n        throw AssertionError(\"FlatBuffers: file identifier must be length $identifierLength\")\n      for (i in 0 until identifierLength) {\n        if (ident[i].code.toByte() != bb!![bb.limit + Int.SIZE_BYTES + i]) return false\n      }\n      return true\n    }\n\n    /**\n     * Compare two strings in the buffer.\n     *\n     * @param offsetA An 'int' index of the first string into the bb.\n     * @param offsetB An 'int' index of the second string into the bb.\n     * @param bb A `ReadWriteBuffer` to get the strings.\n     */\n    public fun compareStrings(offsetA: Int, offsetB: Int, bb: ReadWriteBuffer): Int {\n      var offset1 = offsetA\n      var offset2 = offsetB\n      offset1 += bb.getInt(offset1)\n      offset2 += bb.getInt(offset2)\n      val len1: Int = bb.getInt(offset1)\n      val len2: Int = bb.getInt(offset2)\n      val startPos1: Int = offset1 + Int.SIZE_BYTES\n      val startPos2: Int = offset2 + Int.SIZE_BYTES\n      val len: Int = min(len1, len2)\n      for (i in 0 until len) {\n        if (bb[i + startPos1] != bb[i + startPos2]) {\n          return bb[i + startPos1] - bb[i + startPos2]\n        }\n      }\n      return len1 - len2\n    }\n\n    /**\n     * Compare string from the buffer with the 'String' object.\n     *\n     * @param offset An 'int' index of the first string into the bb.\n     * @param key Second string as a byte array.\n     * @param bb A `ReadWriteBuffer` to get the first string.\n     */\n    public fun compareStrings(offset: Int, key: ByteArray, bb: ReadWriteBuffer): Int {\n      var offset1 = offset\n      offset1 += bb.getInt(offset1)\n      val len1: Int = bb.getInt(offset1)\n      val len2 = key.size\n      val startPos: Int = offset1 + Int.SIZE_BYTES\n      val len: Int = min(len1, len2)\n      for (i in 0 until len) {\n        if (bb[i + startPos] != key[i]) return bb[i + startPos] - key[i]\n      }\n      return len1 - len2\n    }\n  }\n}\n\n/** All structs in the generated code derive from this class, and add their own accessors. */\npublic open class Struct {\n  /** Used to hold the position of the `bb` buffer. */\n  protected var bufferPos: Int = 0\n\n  /** The underlying ByteBuffer to hold the data of the Struct. */\n  protected var bb: ReadWriteBuffer = emptyBuffer\n\n  /**\n   * Re-init the internal state with an external buffer `ByteBuffer` and an offset within.\n   *\n   * This method exists primarily to allow recycling Table instances without risking memory leaks\n   * due to `ByteBuffer` references.\n   */\n  protected inline fun <reified T : Struct> reset(i: Int, reuseBuffer: ReadWriteBuffer): T {\n    bb = reuseBuffer\n    bufferPos = if (bb != emptyBuffer) i else 0\n    return this as T\n  }\n\n  /**\n   * Resets internal state with a null `ByteBuffer` and a zero position.\n   *\n   * This method exists primarily to allow recycling Struct instances without risking memory leaks\n   * due to `ByteBuffer` references. The instance will be unusable until it is assigned again to a\n   * `ByteBuffer`.\n   */\n  private inline fun <reified T : Struct> reset(): T = reset(0, emptyBuffer)\n}\n\npublic inline val <T> T.value: T\n  get() = this\n\npublic const val VERSION_2_0_8: Int = 1\n"
  },
  {
    "path": "kotlin/flatbuffers-kotlin/src/commonMain/kotlin/com/google/flatbuffers/kotlin/FlexBuffers.kt",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n@file:Suppress(\"NOTHING_TO_INLINE\")\n@file:JvmName(\"FlexBuffers\")\n\npackage com.google.flatbuffers.kotlin\n\nimport kotlin.jvm.JvmName\n\n/**\n * Reads a FlexBuffer message in ReadBuf and returns [Reference] to the root element.\n *\n * @param buffer ReadBuf containing FlexBuffer message\n * @return [Reference] to the root object\n */\npublic fun getRoot(buffer: ReadBuffer): Reference {\n  var end: Int = buffer.limit\n  val byteWidth = buffer[--end].toInt()\n  val packetType = buffer[--end].toInt()\n  end -= byteWidth // The root data item.\n  return Reference(buffer, end, ByteWidth(byteWidth), packetType)\n}\n\n/**\n * Represents an generic element in the buffer. It can be specialized into scalar types, using for\n * example, [Reference.toInt], or casted into Flexbuffer object types, like [Reference.toMap] or\n * [Reference.toBlob].\n */\n@Suppress(\"NOTHING_TO_INLINE\")\npublic class Reference\ninternal constructor(\n  internal val buffer: ReadBuffer,\n  internal val end: Int,\n  internal val parentWidth: ByteWidth,\n  internal val byteWidth: ByteWidth,\n  public val type: FlexBufferType,\n) {\n\n  internal constructor(\n    bb: ReadBuffer,\n    end: Int,\n    parentWidth: ByteWidth,\n    packedType: Int,\n  ) : this(\n    bb,\n    end,\n    parentWidth,\n    ByteWidth(1 shl (packedType and 3)),\n    FlexBufferType((packedType shr 2)),\n  )\n\n  /**\n   * Checks whether the element is null type\n   *\n   * @return true if null type\n   */\n  public val isNull: Boolean\n    get() = type == T_NULL\n\n  /**\n   * Checks whether the element is boolean type\n   *\n   * @return true if boolean type\n   */\n  public val isBoolean: Boolean\n    get() = type == T_BOOL\n\n  /**\n   * Checks whether the element type is numeric (signed/unsigned integers and floats)\n   *\n   * @return true if numeric type\n   */\n  public val isNumeric: Boolean\n    get() = isIntOrUInt || isFloat\n\n  /**\n   * Checks whether the element type is signed or unsigned integers\n   *\n   * @return true if an integer type\n   */\n  public val isIntOrUInt: Boolean\n    get() = isInt || isUInt\n\n  /**\n   * Checks whether the element type is float\n   *\n   * @return true if a float type\n   */\n  public val isFloat: Boolean\n    get() = type == T_FLOAT || type == T_INDIRECT_FLOAT\n\n  /**\n   * Checks whether the element type is signed integer\n   *\n   * @return true if a signed integer type\n   */\n  public val isInt: Boolean\n    get() = type == T_INT || type == T_INDIRECT_INT\n\n  /**\n   * Checks whether the element type is signed integer\n   *\n   * @return true if a signed integer type\n   */\n  public val isUInt: Boolean\n    get() = type == T_UINT || type == T_INDIRECT_UINT\n\n  /**\n   * Checks whether the element type is string\n   *\n   * @return true if a string type\n   */\n  public val isString: Boolean\n    get() = type == T_STRING\n\n  /**\n   * Checks whether the element type is key\n   *\n   * @return true if a key type\n   */\n  public val isKey: Boolean\n    get() = type == T_KEY\n\n  /**\n   * Checks whether the element type is vector or a map. [TypedVector] are considered different\n   * types and will return false.\n   *\n   * @return true if a vector type\n   */\n  public val isVector: Boolean\n    get() = type == T_VECTOR || type == T_MAP\n\n  /**\n   * Checks whether the element type is typed vector\n   *\n   * @return true if a typed vector type\n   */\n  public val isTypedVector: Boolean\n    get() = type.isTypedVector()\n\n  /**\n   * Checks whether the element type is a map\n   *\n   * @return true if a map type\n   */\n  public val isMap: Boolean\n    get() = type == T_MAP\n\n  /**\n   * Checks whether the element type is a blob\n   *\n   * @return true if a blob type\n   */\n  public val isBlob: Boolean\n    get() = type == T_BLOB\n\n  /** Assumes [Reference] as a [Vector] and returns a [Reference] at index [index]. */\n  public operator fun get(index: Int): Reference = toVector()[index]\n\n  /** Assumes [Reference] as a [Map] and returns a [Reference] for the value at key [key]. */\n  public operator fun get(key: String): Reference = toMap()[key]\n\n  /**\n   * Returns element as a [Boolean]. If element type is not boolean, it will be casted to integer\n   * and compared against 0\n   *\n   * @return element as [Boolean]\n   */\n  public fun toBoolean(): Boolean = if (isBoolean) buffer.getBoolean(end) else toUInt() != 0u\n\n  /**\n   * Returns element as [Byte]. For vector types, it will return size of the vector. For String\n   * type, it will be parsed as integer. Unsigned elements will become signed (with possible\n   * overflow). Float elements will be casted to [Byte].\n   *\n   * @return [Byte] or 0 if fail to convert element to integer.\n   */\n  public fun toByte(): Byte = toULong().toByte()\n\n  /**\n   * Returns element as [Short]. For vector types, it will return size of the vector. For String\n   * type, it will type to be parsed as integer. Unsigned elements will become signed (with possible\n   * overflow). Float elements will be casted to [Short]\n   *\n   * @return [Short] or 0 if fail to convert element to integer.\n   */\n  public fun toShort(): Short = toULong().toShort()\n\n  /**\n   * Returns element as [Int]. For vector types, it will return size of the vector. For String type,\n   * it will type to be parsed as integer. Unsigned elements will become signed (with possible\n   * overflow). Float elements will be casted to [Int]\n   *\n   * @return [Int] or 0 if fail to convert element to integer.\n   */\n  public fun toInt(): Int = toULong().toInt()\n\n  /**\n   * Returns element as [Long]. For vector types, it will return size of the vector For String type,\n   * it will type to be parsed as integer Unsigned elements will become negative Float elements will\n   * be casted to integer\n   *\n   * @return [Long] integer or 0 if fail to convert element to long.\n   */\n  public fun toLong(): Long = toULong().toLong()\n\n  /**\n   * Returns element as [UByte]. For vector types, it will return size of the vector. For String\n   * type, it will type to be parsed as integer. Negative elements will become unsigned counterpart.\n   * Float elements will be casted to [UByte]\n   *\n   * @return [UByte] or 0 if fail to convert element to integer.\n   */\n  public fun toUByte(): UByte = toULong().toUByte()\n\n  /**\n   * Returns element as [UShort]. For vector types, it will return size of the vector. For String\n   * type, it will type to be parsed as integer. Negative elements will become unsigned counterpart.\n   * Float elements will be casted to [UShort]\n   *\n   * @return [UShort] or 0 if fail to convert element to integer.\n   */\n  public fun toUShort(): UShort = toULong().toUShort()\n\n  /**\n   * Returns element as [UInt]. For vector types, it will return size of the vector. For String\n   * type, it will type to be parsed as integer. Negative elements will become unsigned counterpart.\n   * Float elements will be casted to [UInt]\n   *\n   * @return [UInt] or 0 if fail to convert element to integer.\n   */\n  public fun toUInt(): UInt = toULong().toUInt()\n\n  /**\n   * Returns element as [ULong] integer. For vector types, it will return size of the vector For\n   * String type, it will type to be parsed as integer Negative elements will become unsigned\n   * counterpart. Float elements will be casted to integer\n   *\n   * @return [ULong] integer or 0 if fail to convert element to long.\n   */\n  public fun toULong(): ULong = resolve { pos: Int, width: ByteWidth ->\n    when (type) {\n      T_INDIRECT_INT,\n      T_INDIRECT_UINT,\n      T_INT,\n      T_BOOL,\n      T_UINT -> buffer.readULong(pos, width)\n      T_FLOAT,\n      T_INDIRECT_FLOAT -> buffer.readFloat(pos, width).toULong()\n      T_STRING -> toString().toULong()\n      T_VECTOR -> toVector().size.toULong()\n      else -> 0UL\n    }\n  }\n\n  /**\n   * Returns element as [Float]. For vector types, it will return size of the vector For String\n   * type, it will type to be parsed as [Float] Float elements will be casted to integer\n   *\n   * @return [Float] integer or 0 if fail to convert element to long.\n   */\n  public fun toFloat(): Float = resolve { pos: Int, width: ByteWidth ->\n    when (type) {\n      T_INDIRECT_FLOAT,\n      T_FLOAT -> buffer.readFloat(pos, width).toFloat()\n      T_INT -> buffer.readInt(end, parentWidth).toFloat()\n      T_UINT,\n      T_BOOL -> buffer.readUInt(end, parentWidth).toFloat()\n      T_INDIRECT_INT -> buffer.readInt(pos, width).toFloat()\n      T_INDIRECT_UINT -> buffer.readUInt(pos, width).toFloat()\n      T_NULL -> 0.0f\n      T_STRING -> toString().toFloat()\n      T_VECTOR -> toVector().size.toFloat()\n      else -> 0f\n    }\n  }\n\n  /**\n   * Returns element as [Double]. For vector types, it will return size of the vector For String\n   * type, it will type to be parsed as [Double]\n   *\n   * @return [Float] integer or 0 if fail to convert element to long.\n   */\n  public fun toDouble(): Double = resolve { pos: Int, width: ByteWidth ->\n    when (type) {\n      T_INDIRECT_FLOAT,\n      T_FLOAT -> buffer.readFloat(pos, width)\n      T_INT -> buffer.readInt(pos, width).toDouble()\n      T_UINT,\n      T_BOOL -> buffer.readUInt(pos, width).toDouble()\n      T_INDIRECT_INT -> buffer.readInt(pos, width).toDouble()\n      T_INDIRECT_UINT -> buffer.readUInt(pos, width).toDouble()\n      T_NULL -> 0.0\n      T_STRING -> toString().toDouble()\n      T_VECTOR -> toVector().size.toDouble()\n      else -> 0.0\n    }\n  }\n\n  /** Returns element as [Key] or invalid key. */\n  public fun toKey(): Key =\n    when (type) {\n      T_KEY -> Key(buffer, buffer.indirect(end, parentWidth))\n      else -> nullKey()\n    }\n\n  /**\n   * Returns element as a [String]\n   *\n   * @return element as [String] or empty [String] if fail\n   */\n  override fun toString(): String =\n    when (type) {\n      T_STRING -> {\n        val start = buffer.indirect(end, parentWidth)\n        val size = buffer.readULong(start - byteWidth, byteWidth).toInt()\n        buffer.getString(start, size)\n      }\n      T_KEY -> buffer.getKeyString(buffer.indirect(end, parentWidth))\n      T_MAP -> \"{ ${toMap().entries.joinToString(\", \") { \"${it.key}: ${it.value}\"}} }\"\n      T_VECTOR,\n      T_VECTOR_BOOL,\n      T_VECTOR_FLOAT,\n      T_VECTOR_INT,\n      T_VECTOR_UINT,\n      T_VECTOR_KEY,\n      T_VECTOR_STRING_DEPRECATED -> \"[ ${toVector().joinToString(\", \") { it.toString() }} ]\"\n      T_INT -> toLong().toString()\n      T_UINT -> toULong().toString()\n      T_FLOAT -> toDouble().toString()\n      else -> \"${type.typeToString()}(end=$end)\"\n    }\n\n  /**\n   * Returns element as a [ByteArray], converting scalar types when possible.\n   *\n   * @return element as [ByteArray] or empty [ByteArray] if fail.\n   */\n  public fun toByteArray(): ByteArray {\n    val vec =\n      TypedVector(type.toElementTypedVector(), buffer, buffer.indirect(end, parentWidth), byteWidth)\n    return when (type) {\n      T_VECTOR_INT -> ByteArray(vec.size) { vec.getInt(it).toByte() }\n      T_VECTOR_UINT -> ByteArray(vec.size) { vec.getUInt(it).toByte() }\n      T_VECTOR -> ByteArray(vec.size) { vec[it].toByte() }\n      T_VECTOR_FLOAT -> ByteArray(vec.size) { vec.getFloat(it).toInt().toByte() }\n      else -> ByteArray(0)\n    }\n  }\n\n  /**\n   * Returns element as a [ByteArray], converting scalar types when possible.\n   *\n   * @return element as [ByteArray] or empty [ByteArray] if fail.\n   */\n  public fun toShortArray(): ShortArray {\n    val vec =\n      TypedVector(type.toElementTypedVector(), buffer, buffer.indirect(end, parentWidth), byteWidth)\n    return when (type) {\n      T_VECTOR_INT -> ShortArray(vec.size) { vec.getInt(it).toShort() }\n      T_VECTOR_UINT -> ShortArray(vec.size) { vec.getUInt(it).toShort() }\n      T_VECTOR -> ShortArray(vec.size) { vec[it].toShort() }\n      T_VECTOR_FLOAT -> ShortArray(vec.size) { vec.getFloat(it).toInt().toShort() }\n      else -> ShortArray(0)\n    }\n  }\n\n  /**\n   * Returns element as a [IntArray], converting scalar types when possible.\n   *\n   * @return element as [IntArray] or empty [IntArray] if fail.\n   */\n  public fun toIntArray(): IntArray {\n    val vec =\n      TypedVector(type.toElementTypedVector(), buffer, buffer.indirect(end, parentWidth), byteWidth)\n    return when (type) {\n      T_VECTOR_INT -> IntArray(vec.size) { vec.getInt(it).toInt() }\n      T_VECTOR_UINT -> IntArray(vec.size) { vec.getUInt(it).toInt() }\n      T_VECTOR -> IntArray(vec.size) { vec[it].toInt() }\n      T_VECTOR_FLOAT -> IntArray(vec.size) { vec.getFloat(it).toInt() }\n      else -> IntArray(0)\n    }\n  }\n\n  /**\n   * Returns element as a [LongArray], converting scalar types when possible.\n   *\n   * @return element as [LongArray] or empty [LongArray] if fail.\n   */\n  public fun toLongArray(): LongArray {\n    val vec =\n      TypedVector(type.toElementTypedVector(), buffer, buffer.indirect(end, parentWidth), byteWidth)\n    return when (type) {\n      T_VECTOR_INT -> LongArray(vec.size) { vec.getInt(it) }\n      T_VECTOR_UINT -> LongArray(vec.size) { vec.getInt(it) }\n      T_VECTOR -> LongArray(vec.size) { vec[it].toLong() }\n      T_VECTOR_FLOAT -> LongArray(vec.size) { vec.getFloat(it).toLong() }\n      else -> LongArray(0)\n    }\n  }\n\n  /**\n   * Returns element as a [UByteArray], converting scalar types when possible.\n   *\n   * @return element as [UByteArray] or empty [UByteArray] if fail.\n   */\n  public fun toUByteArray(): UByteArray {\n    val vec =\n      TypedVector(type.toElementTypedVector(), buffer, buffer.indirect(end, parentWidth), byteWidth)\n    return when (type) {\n      T_VECTOR_INT -> UByteArray(vec.size) { vec.getInt(it).toUByte() }\n      T_VECTOR_UINT -> UByteArray(vec.size) { vec.getUInt(it).toUByte() }\n      T_VECTOR -> UByteArray(vec.size) { vec[it].toUByte() }\n      T_VECTOR_FLOAT -> UByteArray(vec.size) { vec.getFloat(it).toInt().toUByte() }\n      else -> UByteArray(0)\n    }\n  }\n\n  /**\n   * Returns element as a [UIntArray], converting scalar types when possible.\n   *\n   * @return element as [UIntArray] or empty [UIntArray] if fail.\n   */\n  public fun toUShortArray(): UShortArray {\n    val vec =\n      TypedVector(type.toElementTypedVector(), buffer, buffer.indirect(end, parentWidth), byteWidth)\n    return when (type) {\n      T_VECTOR_INT -> UShortArray(vec.size) { vec.getInt(it).toUShort() }\n      T_VECTOR_UINT -> UShortArray(vec.size) { vec.getUInt(it).toUShort() }\n      T_VECTOR -> UShortArray(vec.size) { vec[it].toUShort() }\n      T_VECTOR_FLOAT -> UShortArray(vec.size) { vec.getFloat(it).toUInt().toUShort() }\n      else -> UShortArray(0)\n    }\n  }\n\n  /**\n   * Returns element as a [UIntArray], converting scalar types when possible.\n   *\n   * @return element as [UIntArray] or empty [UIntArray] if fail.\n   */\n  public fun toUIntArray(): UIntArray {\n    val vec =\n      TypedVector(type.toElementTypedVector(), buffer, buffer.indirect(end, parentWidth), byteWidth)\n    return when (type) {\n      T_VECTOR_INT -> UIntArray(vec.size) { vec.getInt(it).toUInt() }\n      T_VECTOR_UINT -> UIntArray(vec.size) { vec.getUInt(it).toUInt() }\n      T_VECTOR -> UIntArray(vec.size) { vec[it].toUInt() }\n      T_VECTOR_FLOAT -> UIntArray(vec.size) { vec.getFloat(it).toUInt() }\n      else -> UIntArray(0)\n    }\n  }\n\n  /**\n   * Returns element as a [ULongArray], converting scalar types when possible.\n   *\n   * @return element as [ULongArray] or empty [ULongArray] if fail.\n   */\n  public fun toULongArray(): ULongArray {\n    val vec =\n      TypedVector(type.toElementTypedVector(), buffer, buffer.indirect(end, parentWidth), byteWidth)\n    return when (type) {\n      T_VECTOR_INT -> ULongArray(vec.size) { vec.getUInt(it) }\n      T_VECTOR_UINT -> ULongArray(vec.size) { vec.getUInt(it) }\n      T_VECTOR -> ULongArray(vec.size) { vec[it].toULong() }\n      T_VECTOR_FLOAT -> ULongArray(vec.size) { vec.getFloat(it).toULong() }\n      else -> ULongArray(0)\n    }\n  }\n\n  /**\n   * Returns element as a [FloatArray], converting scalar types when possible.\n   *\n   * @return element as [FloatArray] or empty [FloatArray] if fail.\n   */\n  public fun toFloatArray(): FloatArray {\n    val vec =\n      TypedVector(type.toElementTypedVector(), buffer, buffer.indirect(end, parentWidth), byteWidth)\n    return when (type) {\n      T_VECTOR_FLOAT -> FloatArray(vec.size) { vec.getFloat(it).toFloat() }\n      T_VECTOR_INT -> FloatArray(vec.size) { vec.getInt(it).toFloat() }\n      T_VECTOR_UINT -> FloatArray(vec.size) { vec.getUInt(it).toFloat() }\n      T_VECTOR -> FloatArray(vec.size) { vec[it].toFloat() }\n      else -> FloatArray(0)\n    }\n  }\n\n  /**\n   * Returns element as a [DoubleArray], converting scalar types when possible.\n   *\n   * @return element as [DoubleArray] or empty [DoubleArray] if fail.\n   */\n  public fun toDoubleArray(): DoubleArray {\n    val vec =\n      TypedVector(type.toElementTypedVector(), buffer, buffer.indirect(end, parentWidth), byteWidth)\n    return when (type) {\n      T_VECTOR_FLOAT -> DoubleArray(vec.size) { vec[it].toDouble() }\n      T_VECTOR_INT -> DoubleArray(vec.size) { vec[it].toDouble() }\n      T_VECTOR_UINT -> DoubleArray(vec.size) { vec[it].toDouble() }\n      T_VECTOR -> DoubleArray(vec.size) { vec[it].toDouble() }\n      else -> DoubleArray(0)\n    }\n  }\n\n  /**\n   * Returns element as a [Vector]\n   *\n   * @return element as [Vector] or empty [Vector] if fail\n   */\n  public fun toVector(): Vector {\n    return when {\n      isVector -> Vector(buffer, buffer.indirect(end, parentWidth), byteWidth)\n      isTypedVector ->\n        TypedVector(\n          type.toElementTypedVector(),\n          buffer,\n          buffer.indirect(end, parentWidth),\n          byteWidth,\n        )\n      else -> emptyVector()\n    }\n  }\n\n  /**\n   * Returns element as a [Blob]\n   *\n   * @return element as [Blob] or empty [Blob] if fail\n   */\n  public fun toBlob(): Blob {\n    return when (type) {\n      T_BLOB,\n      T_STRING -> Blob(buffer, buffer.indirect(end, parentWidth), byteWidth)\n      else -> emptyBlob()\n    }\n  }\n\n  /**\n   * Returns element as a [Map].\n   *\n   * @return element as [Map] or empty [Map] if fail\n   */\n  public fun toMap(): Map =\n    when (type) {\n      T_MAP -> Map(buffer, buffer.indirect(end, parentWidth), byteWidth)\n      else -> emptyMap()\n    }\n\n  private inline fun <T> resolve(crossinline block: (pos: Int, width: ByteWidth) -> T): T {\n    return if (type.isIndirectScalar()) {\n      block(buffer.indirect(end, byteWidth), byteWidth)\n    } else {\n      block(end, parentWidth)\n    }\n  }\n\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (other == null || this::class != other::class) return false\n    other as Reference\n    if (\n      buffer != other.buffer ||\n        end != other.end ||\n        parentWidth != other.parentWidth ||\n        byteWidth != other.byteWidth ||\n        type != other.type\n    )\n      return false\n    return true\n  }\n\n  override fun hashCode(): Int {\n    var result = buffer.hashCode()\n    result = 31 * result + end\n    result = 31 * result + parentWidth.value\n    result = 31 * result + byteWidth.value\n    result = 31 * result + type.hashCode()\n    return result\n  }\n}\n\n/**\n * Represents any element that has a size property to it, like: [Map], [Vector] and [TypedVector].\n */\npublic open class Sized\ninternal constructor(\n  public val buffer: ReadBuffer,\n  public val end: Int,\n  public val byteWidth: ByteWidth,\n) {\n  public open val size: Int = buffer.readSize(end, byteWidth)\n}\n\n/** Represent an array of bytes in the buffer. */\npublic open class Blob internal constructor(buffer: ReadBuffer, end: Int, byteWidth: ByteWidth) :\n  Sized(buffer, end, byteWidth) {\n  /**\n   * Return [Blob] as [ReadBuffer]\n   *\n   * @return blob as [ReadBuffer]\n   */\n  public fun data(): ReadBuffer = buffer.slice(end, size)\n\n  /**\n   * Copy [Blob] into a [ByteArray]\n   *\n   * @return A [ByteArray] containing the blob data.\n   */\n  public fun toByteArray(): ByteArray {\n    val result = ByteArray(size)\n    for (i in 0 until size) {\n      result[i] = buffer[end + i]\n    }\n    return result\n  }\n\n  /**\n   * Return individual byte at a given position\n   *\n   * @param pos position of the byte to be read\n   */\n  public operator fun get(pos: Int): Byte {\n    if (pos !in 0..size) error(\"$pos index out of bounds. Should be in range 0..$size\")\n    return buffer[end + pos]\n  }\n\n  override fun toString(): String = buffer.getString(end, size)\n}\n\n/** [Vector] represents an array of elements in the buffer. The element can be of any type. */\npublic open class Vector internal constructor(buffer: ReadBuffer, end: Int, byteWidth: ByteWidth) :\n  Collection<Reference>, Sized(buffer, end, byteWidth) {\n\n  /**\n   * Returns a [Reference] from the [Vector] at position [index]. Returns a null reference\n   *\n   * @param index position in the vector.\n   * @return [Reference] for a key or a null [Reference] if not found.\n   */\n  public open operator fun get(index: Int): Reference {\n    if (index >= size) return nullReference()\n    val packedType = buffer[(end + size * byteWidth.value + index)].toInt()\n    val objEnd = end + index * byteWidth\n    return Reference(buffer, objEnd, byteWidth, packedType)\n  }\n\n  // overrides from Collection<Reference>\n\n  override fun contains(element: Reference): Boolean = find { it == element } != null\n\n  override fun containsAll(elements: Collection<Reference>): Boolean {\n    elements.forEach { if (!contains(it)) return false }\n    return true\n  }\n\n  override fun isEmpty(): Boolean = size == 0\n\n  override fun iterator(): Iterator<Reference> =\n    object : Iterator<Reference> {\n      var position = 0\n\n      override fun hasNext(): Boolean = position != size\n\n      override fun next(): Reference = get(position++)\n    }\n}\n\n/** [TypedVector] represents an array of scalar elements of the same type in the buffer. */\npublic open class TypedVector(\n  private val elementType: FlexBufferType,\n  buffer: ReadBuffer,\n  end: Int,\n  byteWidth: ByteWidth,\n) : Vector(buffer, end, byteWidth) {\n\n  /**\n   * Returns a [Reference] from the [TypedVector] at position [index]. Returns a null reference\n   *\n   * @param index position in the vector.\n   * @return [Reference] for a key or a null [Reference] if not found.\n   */\n  override operator fun get(index: Int): Reference {\n    if (index >= size) return nullReference()\n    val childPos: Int = end + index * byteWidth\n    return Reference(buffer, childPos, byteWidth, ByteWidth(1), elementType)\n  }\n\n  private inline fun <T> resolveAt(index: Int, crossinline block: (Int, ByteWidth) -> T): T {\n    val childPos: Int = end + index * byteWidth\n    return block(childPos, byteWidth)\n  }\n\n  internal fun getBoolean(index: Int): Boolean =\n    resolveAt(index) { pos: Int, _: ByteWidth -> buffer.getBoolean(pos) }\n\n  internal fun getInt(index: Int): Long =\n    resolveAt(index) { pos: Int, width: ByteWidth -> buffer.readLong(pos, width) }\n\n  internal fun getUInt(index: Int): ULong =\n    resolveAt(index) { pos: Int, width: ByteWidth -> buffer.readULong(pos, width) }\n\n  internal fun getFloat(index: Int): Double =\n    resolveAt(index) { pos: Int, width: ByteWidth -> buffer.readFloat(pos, width) }\n}\n\n/** Represents a key element in the buffer. Keys are used to reference objects in a [Map] */\npublic data class Key(\n  public val buffer: ReadBuffer,\n  public val start: Int,\n  public val end: Int = buffer.findFirst(ZeroByte, start),\n) {\n\n  val sizeInBytes: Int = end - start\n\n  private val codePoint = CharArray(2)\n\n  val sizeInChars: Int\n    get() {\n      var count = 0\n      var i = start\n      while (i < end) {\n        val size = codePointSizeInBytes(i)\n        i += size\n        count += if (size == 4) 2 else 1\n      }\n      return count\n    }\n\n  public operator fun get(index: Int): Char {\n    var count = 0\n    var i = start\n    var size = 0\n    // we loop over the bytes to find the right position for the \"char\" at index i\n    while (i < end && count < index) {\n      size = codePointSizeInBytes(i)\n      i += size\n      // 4 bytes utf8 are 2 chars wide, the rest is on char.\n      count += if (size == 4) 2 else 1\n    }\n    return when {\n      count == index -> {\n        Utf8.decodeUtf8CodePoint(buffer, i, codePoint)\n        codePoint[0]\n      }\n      count == index + 1 && size == 4 -> {\n        Utf8.decodeUtf8CodePoint(buffer, i - size, codePoint)\n        codePoint[1]\n      }\n      else -> error(\"Invalid count=$count, index=$index\")\n    }\n  }\n\n  private inline fun codePointSizeInBytes(pos: Int): Int {\n    val b = buffer[pos]\n    return when {\n      Utf8.isOneByte(b) -> 1\n      Utf8.isTwoBytes(b) -> 2\n      Utf8.isThreeBytes(b) -> 3\n      else -> 4\n    }\n  }\n\n  override fun toString(): String =\n    if (sizeInBytes > 0) buffer.getString(start, sizeInBytes) else \"\"\n\n  /** Checks whether Key is invalid or not. */\n  public fun isInvalid(): Boolean = sizeInBytes <= 0\n}\n\n/** A Map class that provide support to access Key-Value data from Flexbuffers. */\npublic class Map internal constructor(buffer: ReadBuffer, end: Int, byteWidth: ByteWidth) :\n  Sized(buffer, end, byteWidth), kotlin.collections.Map<Key, Reference> {\n\n  // used for accessing the key vector elements\n  private var keyVectorEnd: Int\n  private var keyVectorByteWidth: ByteWidth\n\n  init {\n    val keysOffset = end - (3 * byteWidth) // 3 is number of prefixed fields\n    keyVectorEnd = buffer.indirect(keysOffset, byteWidth)\n    keyVectorByteWidth = ByteWidth(buffer.readInt(keysOffset + byteWidth, byteWidth))\n  }\n\n  /**\n   * Returns a [Reference] from the [Map] at position [index]. Returns a null reference\n   *\n   * @param index position in the map\n   * @return [Reference] for a key or a null [Reference] if not found.\n   */\n  public operator fun get(index: Int): Reference {\n    if (index >= size) return nullReference()\n    val packedPos = end + size * byteWidth + index\n    val packedType = buffer[packedPos].toInt()\n    val objEnd = end + index * byteWidth\n    return Reference(buffer, objEnd, byteWidth, packedType)\n  }\n\n  /**\n   * Returns a [Reference] from the [Map] for a given [String] [key].\n   *\n   * @param key access key to element on map\n   * @return [Reference] for a key or a null [Reference] if not found.\n   */\n  public operator fun get(key: String): Reference {\n    val index: Int = binarySearch(key)\n    return if (index in 0 until size) {\n      get(index)\n    } else nullReference()\n  }\n\n  /**\n   * Returns a [Reference] from the [Map] for a given [Key] [key].\n   *\n   * @param key access key to element on map\n   * @return [Reference] for a key or a null [Reference] if not found.\n   */\n  override operator fun get(key: Key): Reference {\n    val index = binarySearch(key)\n    return if (index in 0 until size) {\n      get(index)\n    } else nullReference()\n  }\n\n  /**\n   * Checks whether the map contains a [key].\n   *\n   * @param key [String]\n   * @return true if key is found in the map, otherwise false.\n   */\n  public operator fun contains(key: String): Boolean = binarySearch(key) >= 0\n\n  /**\n   * Returns a [Key] for a given position [index] in the [Map].\n   *\n   * @param index of the key in the map\n   * @return a Key for the given index. Out of bounds indexes returns invalid keys.\n   */\n  public fun keyAt(index: Int): Key {\n    val childPos: Int = keyVectorEnd + index * keyVectorByteWidth\n    return Key(buffer, buffer.indirect(childPos, keyVectorByteWidth))\n  }\n\n  /**\n   * Returns a [Key] as [String] for a given position [index] in the [Map].\n   *\n   * @param index of the key in the map\n   * @return a Key for the given index. Out of bounds indexes returns empty string.\n   */\n  public fun keyAsString(index: Int): String {\n    val childPos: Int = keyVectorEnd + index * keyVectorByteWidth\n    val start = buffer.indirect(childPos, keyVectorByteWidth)\n    val end = buffer.findFirst(ZeroByte, start)\n    return if (end > start) buffer.getString(start, end - start) else \"\"\n  }\n\n  // Overrides from kotlin.collections.Map<Key, Reference>\n\n  public data class Entry(override val key: Key, override val value: Reference) :\n    kotlin.collections.Map.Entry<Key, Reference>\n\n  override val entries: Set<kotlin.collections.Map.Entry<Key, Reference>>\n    get() = keys.map { Entry(it, get(it.toString())) }.toSet()\n\n  override val keys: Set<Key>\n    get() {\n      val set = LinkedHashSet<Key>(size)\n      for (i in 0 until size) {\n        val key = keyAt(i)\n        set.add(key)\n      }\n      return set\n    }\n\n  /**\n   * Returns a [Vector] for accessing all values in the [Map].\n   *\n   * @return [Vector] of values.\n   */\n  override val values: Collection<Reference>\n    get() = Vector(buffer, end, byteWidth)\n\n  override fun containsKey(key: Key): Boolean {\n    for (i in 0 until size) {\n      if (key == keyAt(i)) return true\n    }\n    return false\n  }\n\n  override fun containsValue(value: Reference): Boolean = values.contains(value)\n\n  override fun isEmpty(): Boolean = size == 0\n\n  // Performs a binary search on a key vector and return index of the key in key vector\n  private fun binarySearch(searchedKey: String) = binarySearch {\n    compareCharSequence(it, searchedKey)\n  }\n\n  // Performs a binary search on a key vector and return index of the key in key vector\n  private fun binarySearch(key: Key): Int = binarySearch { compareKeys(it, key.start) }\n\n  private inline fun binarySearch(crossinline comparisonBlock: (Int) -> Int): Int {\n    var low = 0\n    var high = size - 1\n    while (low <= high) {\n      val mid = low + high ushr 1\n      val keyPos: Int = buffer.indirect(keyVectorEnd + mid * keyVectorByteWidth, keyVectorByteWidth)\n      val cmp: Int = comparisonBlock(keyPos)\n      if (cmp < 0) low = mid + 1 else if (cmp > 0) high = mid - 1 else return mid // key found\n    }\n    return -(low + 1) // key not found\n  }\n\n  // compares a CharSequence against a T_KEY\n  private fun compareKeys(start: Int, other: Int): Int {\n    var bufferPos = start\n    var otherPos = other\n    val limit: Int = buffer.limit\n    var c1: Byte = ZeroByte\n    var c2: Byte = ZeroByte\n    while (otherPos < limit) {\n      c1 = buffer[bufferPos++]\n      c2 = buffer[otherPos++]\n      when {\n        c1 == ZeroByte -> return c1 - c2\n        c1 != c2 -> return c1 - c2\n      }\n    }\n    return c1 - c2\n  }\n\n  // compares a CharSequence against a [CharSequence]\n  private fun compareCharSequence(start: Int, other: CharSequence): Int {\n    var bufferPos = start\n    var otherPos = 0\n    val limit: Int = buffer.limit\n    val otherLimit = other.length\n    // special loop for ASCII characters. Most of keys should be ASCII only, so this\n    // loop should be optimized for that.\n    // breaks if a multi-byte character is found\n    while (otherPos < otherLimit) {\n      val c2 = other[otherPos]\n      // not a single byte codepoint\n      if (c2.code >= 0x80) {\n        break\n      }\n      val b: Byte = buffer[bufferPos]\n      when {\n        b == ZeroByte -> return -c2.code\n        b < 0 -> break\n        b != c2.code.toByte() -> return b - c2.code.toByte()\n      }\n      ++bufferPos\n      ++otherPos\n    }\n    if (bufferPos < limit) return 0\n\n    val comparisonBuffer = ByteArray(4)\n    while (bufferPos < limit) {\n      val sizeInBuff = Utf8.encodeUtf8CodePoint(other, otherPos, comparisonBuffer)\n      if (sizeInBuff == 0) {\n        return buffer[bufferPos].toInt()\n      }\n      for (i in 0 until sizeInBuff) {\n        val bufferByte: Byte = buffer[bufferPos++]\n        val otherByte: Byte = comparisonBuffer[i]\n        when {\n          bufferByte == ZeroByte -> return -otherByte\n          bufferByte != otherByte -> return bufferByte - otherByte\n        }\n      }\n      otherPos += if (sizeInBuff == 4) 2 else 1\n    }\n    return 0\n  }\n}\n"
  },
  {
    "path": "kotlin/flatbuffers-kotlin/src/commonMain/kotlin/com/google/flatbuffers/kotlin/FlexBuffersBuilder.kt",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n@file:Suppress(\"NOTHING_TO_INLINE\")\n\npackage com.google.flatbuffers.kotlin\n\n@ExperimentalUnsignedTypes\npublic class FlexBuffersBuilder(\n  public val buffer: ReadWriteBuffer,\n  private val shareFlag: Int = SHARE_KEYS,\n) {\n\n  public constructor(\n    initialCapacity: Int = 1024,\n    shareFlag: Int = SHARE_KEYS,\n  ) : this(ArrayReadWriteBuffer(initialCapacity), shareFlag)\n\n  private val stringValuePool: HashMap<String, Value> = HashMap()\n  private val stringKeyPool: HashMap<String, Int> = HashMap()\n  private val stack: MutableList<Value> = mutableListOf()\n  private var finished: Boolean = false\n\n  /**\n   * Reset the FlexBuffersBuilder by purging all data that it holds. Buffer might keep its capacity\n   * after a reset.\n   */\n  public fun clear() {\n    buffer.clear()\n    stringValuePool.clear()\n    stringKeyPool.clear()\n    stack.clear()\n    finished = false\n  }\n\n  /**\n   * Finish writing the message into the buffer. After that no other element must be inserted into\n   * the buffer. Also, you must call this function before start using the FlexBuffer message\n   *\n   * @return [ReadBuffer] containing the FlexBuffer message\n   */\n  public fun finish(): ReadBuffer {\n    // If you hit this, you likely have objects that were never included\n    // in a parent. You need to have exactly one root to finish a buffer.\n    // Check your Start/End calls are matched, and all objects are inside\n    // some other object.\n    if (stack.size != 1) error(\"There is must be only on object as root. Current ${stack.size}.\")\n    // Write root value.\n    val byteWidth = align(stack[0].elemWidth(buffer.writePosition, 0))\n    buffer.requestAdditionalCapacity(byteWidth.value + 2)\n    writeAny(stack[0], byteWidth)\n    // Write root type.\n    buffer.put(stack[0].storedPackedType())\n    // Write root size. Normally determined by parent, but root has no parent :)\n    buffer.put(byteWidth.value.toByte())\n    this.finished = true\n    return buffer // TODO: make a read-only shallow copy\n  }\n\n  /**\n   * Insert a single [Boolean] into the buffer\n   *\n   * @param value true or false\n   */\n  public fun put(value: Boolean): Unit = run { this[null] = value }\n\n  /**\n   * Insert a null reference into the buffer. A key must be present if element is inserted into a\n   * map.\n   */\n  public fun putNull(key: String? = null): Unit = run {\n    stack.add(Value(T_NULL, putKey(key), W_8, 0UL))\n  }\n\n  /**\n   * Insert a single [Boolean] into the buffer. A key must be present if element is inserted into a\n   * map.\n   */\n  public operator fun set(key: String? = null, value: Boolean): Unit = run {\n    stack.add(Value(T_BOOL, putKey(key), W_8, if (value) 1UL else 0UL))\n  }\n\n  /** Insert a single [Byte] into the buffer */\n  public fun put(value: Byte): Unit = set(null, value.toLong())\n\n  /**\n   * Insert a single [Byte] into the buffer. A key must be present if element is inserted into a\n   * map.\n   */\n  public operator fun set(key: String? = null, value: Byte): Unit = set(key, value.toLong())\n\n  /** Insert a single [Short] into the buffer. */\n  public fun put(value: Short): Unit = set(null, value.toLong())\n\n  /**\n   * Insert a single [Short] into the buffer. A key must be present if element is inserted into a\n   * map.\n   */\n  public inline operator fun set(key: String? = null, value: Short): Unit = set(key, value.toLong())\n\n  /** Insert a single [Int] into the buffer. */\n  public fun put(value: Int): Unit = set(null, value.toLong())\n\n  /**\n   * Insert a single [Int] into the buffer. A key must be present if element is inserted into a map.\n   */\n  public inline operator fun set(key: String? = null, value: Int): Unit = set(key, value.toLong())\n\n  /** Insert a single [Long] into the buffer. */\n  public fun put(value: Long): Unit = set(null, value)\n\n  /**\n   * Insert a single [Long] into the buffer. A key must be present if element is inserted into a\n   * map.\n   */\n  public operator fun set(key: String? = null, value: Long): Unit = run {\n    stack.add(Value(T_INT, putKey(key), value.toULong().widthInUBits(), value.toULong()))\n  }\n\n  /** Insert a single [UByte] into the buffer */\n  public fun put(value: UByte): Unit = set(null, value.toULong())\n\n  /**\n   * Insert a single [UByte] into the buffer. A key must be present if element is inserted into a\n   * map.\n   */\n  public inline operator fun set(key: String? = null, value: UByte): Unit =\n    set(key, value.toULong())\n\n  /** Insert a single [UShort] into the buffer. */\n  public fun put(value: UShort): Unit = set(null, value.toULong())\n\n  /**\n   * Insert a single [UShort] into the buffer. A key must be present if element is inserted into a\n   * map.\n   */\n  private inline operator fun set(key: String? = null, value: UShort): Unit =\n    set(key, value.toULong())\n\n  /** Insert a single [UInt] into the buffer. */\n  public fun put(value: UInt): Unit = set(null, value.toULong())\n\n  /**\n   * Insert a single [UInt] into the buffer. A key must be present if element is inserted into a\n   * map.\n   */\n  private inline operator fun set(key: String? = null, value: UInt): Unit =\n    set(key, value.toULong())\n\n  /** Insert a single [ULong] into the buffer. */\n  public fun put(value: ULong): Unit = set(null, value)\n\n  /**\n   * Insert a single [ULong] into the buffer. A key must be present if element is inserted into a\n   * map.\n   */\n  public operator fun set(key: String? = null, value: ULong): Unit = run {\n    stack.add(Value(T_UINT, putKey(key), value.widthInUBits(), value))\n  }\n\n  /** Insert a single [Float] into the buffer. */\n  public fun put(value: Float): Unit = run { this[null] = value }\n\n  /**\n   * Insert a single [Float] into the buffer. A key must be present if element is inserted into a\n   * map.\n   */\n  public operator fun set(key: String? = null, value: Float): Unit = run {\n    stack.add(Value(T_FLOAT, putKey(key), W_32, dValue = value.toDouble()))\n  }\n\n  /** Insert a single [Double] into the buffer. */\n  public fun put(value: Double): Unit = run { this[null] = value }\n\n  /**\n   * Insert a single [Double] into the buffer. A key must be present if element is inserted into a\n   * map.\n   */\n  public operator fun set(key: String? = null, value: Double): Unit = run {\n    stack.add(Value(T_FLOAT, putKey(key), W_64, dValue = value))\n  }\n\n  /** Insert a single [String] into the buffer. */\n  public fun put(value: String): Int = set(null, value)\n\n  /**\n   * Insert a single [String] into the buffer. A key must be present if element is inserted into a\n   * map.\n   */\n  public operator fun set(key: String? = null, value: String): Int {\n    val iKey = putKey(key)\n    val holder =\n      if (shareFlag and SHARE_STRINGS != 0) {\n        stringValuePool\n          .getOrPut(value) { writeString(iKey, value).also { stringValuePool[value] = it } }\n          .copy(key = iKey)\n      } else {\n        writeString(iKey, value)\n      }\n    stack.add(holder)\n    return holder.iValue.toInt()\n  }\n\n  /**\n   * Adds a [ByteArray] into the message as a [Blob].\n   *\n   * @param value byte array\n   * @return position in buffer as the start of byte array\n   */\n  public fun put(value: ByteArray): Int = set(null, value)\n\n  /**\n   * Adds a [ByteArray] into the message as a [Blob]. A key must be present if element is inserted\n   * into a map.\n   *\n   * @param value byte array\n   * @return position in buffer as the start of byte array\n   */\n  public operator fun set(key: String? = null, value: ByteArray): Int {\n    val element = writeBlob(putKey(key), value, T_BLOB, false)\n    stack.add(element)\n    return element.iValue.toInt()\n  }\n\n  /**\n   * Adds a [IntArray] into the message as a typed vector of fixed size.\n   *\n   * @param value [IntArray]\n   * @return position in buffer as the start of byte array\n   */\n  public fun put(value: IntArray): Int = set(null, value)\n\n  /**\n   * Adds a [IntArray] into the message as a typed vector of fixed size. A key must be present if\n   * element is inserted into a map.\n   *\n   * @param value [IntArray]\n   * @return position in buffer as the start of byte array\n   */\n  public operator fun set(key: String? = null, value: IntArray): Int =\n    setTypedVector(key, value.size, T_VECTOR_INT, value.widthInUBits()) { writeIntArray(value, it) }\n\n  /**\n   * Adds a [ShortArray] into the message as a typed vector of fixed size.\n   *\n   * @param value [ShortArray]\n   * @return position in buffer as the start of byte array\n   */\n  public fun put(value: ShortArray): Int = set(null, value)\n\n  /**\n   * Adds a [ShortArray] into the message as a typed vector of fixed size. A key must be present if\n   * element is inserted into a map.\n   *\n   * @param value [ShortArray]\n   * @return position in buffer as the start of byte array\n   */\n  public operator fun set(key: String? = null, value: ShortArray): Int =\n    setTypedVector(key, value.size, T_VECTOR_INT, value.widthInUBits()) { writeIntArray(value, it) }\n\n  /**\n   * Adds a [LongArray] into the message as a typed vector of fixed size.\n   *\n   * @param value [LongArray]\n   * @return position in buffer as the start of byte array\n   */\n  public fun put(value: LongArray): Int = set(null, value)\n\n  /**\n   * Adds a [LongArray] into the message as a typed vector of fixed size. A key must be present if\n   * element is inserted into a map.\n   *\n   * @param value [LongArray]\n   * @return position in buffer as the start of byte array\n   */\n  public operator fun set(key: String? = null, value: LongArray): Int =\n    setTypedVector(key, value.size, T_VECTOR_INT, value.widthInUBits()) { writeIntArray(value, it) }\n\n  /**\n   * Adds a [FloatArray] into the message as a typed vector of fixed size.\n   *\n   * @param value [FloatArray]\n   * @return position in buffer as the start of byte array\n   */\n  public fun put(value: FloatArray): Int = set(null, value)\n\n  /**\n   * Adds a [FloatArray] into the message as a typed vector of fixed size. A key must be present if\n   * element is inserted into a map.\n   *\n   * @param value [FloatArray]\n   * @return position in buffer as the start of byte array\n   */\n  public operator fun set(key: String? = null, value: FloatArray): Int =\n    setTypedVector(key, value.size, T_VECTOR_FLOAT, W_32) { writeFloatArray(value) }\n\n  /**\n   * Adds a [DoubleArray] into the message as a typed vector of fixed size.\n   *\n   * @param value [DoubleArray]\n   * @return position in buffer as the start of byte array\n   */\n  public fun put(value: DoubleArray): Int = set(null, value)\n\n  /**\n   * Adds a [DoubleArray] into the message as a typed vector of fixed size. A key must be present if\n   * element is inserted into a map.\n   *\n   * @param value [DoubleArray]\n   * @return position in buffer as the start of byte array\n   */\n  public operator fun set(key: String? = null, value: DoubleArray): Int =\n    setTypedVector(key, value.size, T_VECTOR_FLOAT, W_64) { writeFloatArray(value) }\n\n  /**\n   * Adds a [UByteArray] into the message as a typed vector of fixed size.\n   *\n   * @param value [UByteArray]\n   * @return position in buffer as the start of byte array\n   */\n  public fun put(value: UByteArray): Int = set(null, value)\n\n  /**\n   * Adds a [UByteArray] into the message as a typed vector of fixed size. A key must be present if\n   * element is inserted into a map.\n   *\n   * @param value [UByteArray]\n   * @return position in buffer as the start of byte array\n   */\n  public operator fun set(key: String? = null, value: UByteArray): Int =\n    setTypedVec(key) { value.forEach { put(it) } }\n\n  /**\n   * Adds a [UShortArray] into the message as a typed vector of fixed size.\n   *\n   * @param value [UShortArray]\n   * @return position in buffer as the start of byte array\n   */\n  public fun put(value: UShortArray): Int = set(null, value)\n\n  /**\n   * Adds a [UShortArray] into the message as a typed vector of fixed size. A key must be present if\n   * element is inserted into a map.\n   *\n   * @param value [UShortArray]\n   * @return position in buffer as the start of byte array\n   */\n  public operator fun set(key: String? = null, value: UShortArray): Int =\n    setTypedVec(key) { value.forEach { put(it) } }\n\n  /**\n   * Adds a [UIntArray] into the message as a typed vector of fixed size.\n   *\n   * @param value [UIntArray]\n   * @return position in buffer as the start of byte array\n   */\n  public fun put(value: UIntArray): Int = set(null, value)\n\n  /**\n   * Adds a [UIntArray] into the message as a typed vector of fixed size. A key must be present if\n   * element is inserted into a map.\n   *\n   * @param value [UIntArray]\n   * @return position in buffer as the start of byte array\n   */\n  public fun set(key: String? = null, value: UIntArray): Int =\n    setTypedVec(key) { value.forEach { put(it) } }\n\n  /**\n   * Adds a [ULongArray] into the message as a typed vector of fixed size.\n   *\n   * @param value [ULongArray]\n   * @return position in buffer as the start of byte array\n   */\n  public fun put(value: ULongArray): Int = set(null, value)\n\n  /**\n   * Adds a [ULongArray] into the message as a typed vector of fixed size. A key must be present if\n   * element is inserted into a map.\n   *\n   * @param value [ULongArray]\n   * @return position in buffer as the start of byte array\n   */\n  public operator fun set(key: String? = null, value: ULongArray): Int =\n    setTypedVec(key) { value.forEach { put(it) } }\n\n  /**\n   * Creates a new vector will all elements inserted in [block].\n   *\n   * @param block where elements will be inserted\n   * @return position in buffer as the start of byte array\n   */\n  public inline fun putVector(crossinline block: FlexBuffersBuilder.() -> Unit): Int {\n    val pos = startVector()\n    this.block()\n    return endVector(pos)\n  }\n\n  /**\n   * Creates a new typed vector will all elements inserted in [block].\n   *\n   * @param block where elements will be inserted\n   * @return position in buffer as the start of byte array\n   */\n  public inline fun putTypedVector(crossinline block: FlexBuffersBuilder.() -> Unit): Int {\n    val pos = startVector()\n    this.block()\n    return endTypedVector(pos)\n  }\n\n  /** Helper function to return position for starting a new vector. */\n  public fun startVector(): Int = stack.size\n\n  /**\n   * Finishes a vector element. The initial position of the vector must be passed\n   *\n   * @param position position at the start of the vector\n   */\n  public fun endVector(position: Int): Int = endVector(null, position)\n\n  /**\n   * Finishes a vector element. The initial position of the vector must be passed\n   *\n   * @param position position at the start of the vector\n   */\n  public fun endVector(key: String? = null, position: Int): Int =\n    endAnyVector(position) { createVector(putKey(key), position, stack.size - position) }\n\n  /**\n   * Finishes a typed vector element. The initial position of the vector must be passed\n   *\n   * @param position position at the start of the vector\n   */\n  public fun endTypedVector(position: Int): Int = endTypedVector(position, null)\n\n  /** Helper function to return position for starting a new vector. */\n  public fun startMap(): Int = stack.size\n\n  /**\n   * Creates a new map will all elements inserted in [block].\n   *\n   * @param block where elements will be inserted\n   * @return position in buffer as the start of byte array\n   */\n  public inline fun putMap(\n    key: String? = null,\n    crossinline block: FlexBuffersBuilder.() -> Unit,\n  ): Int {\n    val pos = startMap()\n    this.block()\n    return endMap(pos, key)\n  }\n\n  /**\n   * Finishes a map, but writing the information in the buffer\n   *\n   * @param key key used to store element in map\n   * @return Reference to the map\n   */\n  public fun endMap(start: Int, key: String? = null): Int {\n    stack.subList(start, stack.size).sortWith(keyComparator)\n    val length = stack.size - start\n    val keys = createKeyVector(start, length)\n    val vec = putMap(putKey(key), start, length, keys)\n    // Remove temp elements and return map.\n    while (stack.size > start) {\n      stack.removeAt(stack.size - 1)\n    }\n    stack.add(vec)\n    return vec.iValue.toInt()\n  }\n\n  private inline fun setTypedVector(\n    key: String? = null,\n    length: Int,\n    vecType: FlexBufferType,\n    bitWidth: BitWidth,\n    crossinline writeBlock: (ByteWidth) -> Unit,\n  ): Int {\n    val keyPos = putKey(key)\n    val byteWidth = align(bitWidth)\n    // Write vector. First the keys width/offset if available, and size.\n    // write the size\n    writeInt(length, byteWidth)\n\n    // Then the actual data.\n    val vloc: Int = buffer.writePosition\n    writeBlock(byteWidth)\n    stack.add(Value(vecType, keyPos, bitWidth, vloc.toULong()))\n    return vloc\n  }\n\n  private inline fun setTypedVec(\n    key: String? = null,\n    crossinline block: FlexBuffersBuilder.() -> Unit,\n  ): Int {\n    val pos = startVector()\n    this.block()\n    return endTypedVector(pos, key)\n  }\n\n  public fun endTypedVector(position: Int, key: String? = null): Int =\n    endAnyVector(position) { createTypedVector(putKey(key), position, stack.size - position) }\n\n  private inline fun endAnyVector(start: Int, crossinline creationBlock: () -> Value): Int {\n    val vec = creationBlock()\n    // Remove temp elements and return vector.\n    while (stack.size > start) {\n      stack.removeLast()\n    }\n    stack.add(vec)\n    return vec.iValue.toInt()\n  }\n\n  private inline fun putKey(key: String? = null): Int {\n    if (key == null) return -1\n    return if ((shareFlag and SHARE_KEYS) != 0) {\n      stringKeyPool.getOrPut(key) {\n        val pos: Int = buffer.writePosition\n        val encodedKeySize = Utf8.encodedLength(key)\n        buffer.requestAdditionalCapacity(encodedKeySize + 1)\n        buffer.put(key, encodedKeySize)\n        buffer.put(ZeroByte)\n        pos\n      }\n    } else {\n      val pos: Int = buffer.writePosition\n      val encodedKeySize = Utf8.encodedLength(key)\n      buffer.requestAdditionalCapacity(encodedKeySize + 1)\n      buffer.put(key, encodedKeySize)\n      buffer.put(ZeroByte)\n      pos\n    }\n  }\n\n  private fun writeAny(toWrite: Value, byteWidth: ByteWidth) =\n    when (toWrite.type) {\n      T_NULL,\n      T_BOOL,\n      T_INT,\n      T_UINT -> writeInt(toWrite.iValue, byteWidth)\n      T_FLOAT -> writeDouble(toWrite.dValue, byteWidth)\n      else -> writeOffset(toWrite.iValue.toInt(), byteWidth)\n    }\n\n  private fun writeString(key: Int, s: String): Value {\n    val encodedSize = Utf8.encodedLength(s)\n    val bitWidth = encodedSize.toULong().widthInUBits()\n    val byteWidth = align(bitWidth)\n\n    writeInt(encodedSize, byteWidth)\n\n    buffer.requestAdditionalCapacity(encodedSize + 1)\n    val sloc: Int = buffer.writePosition\n    if (encodedSize > 0) buffer.put(s, encodedSize)\n    buffer.put(ZeroByte)\n    return Value(T_STRING, key, bitWidth, sloc.toULong())\n  }\n\n  private fun writeDouble(toWrite: Double, byteWidth: ByteWidth) {\n    buffer.requestAdditionalCapacity(byteWidth.value)\n    when (byteWidth.value) {\n      4 -> buffer.put(toWrite.toFloat())\n      8 -> buffer.put(toWrite)\n      else -> Unit\n    }\n  }\n\n  private fun writeOffset(toWrite: Int, byteWidth: ByteWidth) {\n    buffer.requestAdditionalCapacity(byteWidth.value)\n    val relativeOffset = (buffer.writePosition - toWrite)\n    if (byteWidth.value != 8 && relativeOffset >= 1L shl byteWidth.value * 8)\n      error(\"invalid offset $relativeOffset, writer pos ${buffer.writePosition}\")\n    writeInt(relativeOffset, byteWidth)\n  }\n\n  private inline fun writeBlob(\n    key: Int,\n    blob: ByteArray,\n    type: FlexBufferType,\n    trailing: Boolean,\n  ): Value {\n    val bitWidth = blob.size.toULong().widthInUBits()\n    val byteWidth = align(bitWidth)\n\n    writeInt(blob.size, byteWidth)\n\n    val sloc: Int = buffer.writePosition\n    buffer.requestAdditionalCapacity(blob.size + trailing.compareTo(false))\n    buffer.put(blob, 0, blob.size)\n    if (trailing) {\n      buffer.put(ZeroByte)\n    }\n    return Value(type, key, bitWidth, sloc.toULong())\n  }\n\n  private fun writeIntArray(value: IntArray, byteWidth: ByteWidth) =\n    writeIntegerArray(0, value.size, byteWidth) { value[it].toULong() }\n\n  private fun writeIntArray(value: ShortArray, byteWidth: ByteWidth) =\n    writeIntegerArray(0, value.size, byteWidth) { value[it].toULong() }\n\n  private fun writeIntArray(value: LongArray, byteWidth: ByteWidth) =\n    writeIntegerArray(0, value.size, byteWidth) { value[it].toULong() }\n\n  private fun writeFloatArray(value: FloatArray) {\n    buffer.requestAdditionalCapacity(Float.SIZE_BYTES * value.size)\n    value.forEach { buffer.put(it) }\n  }\n\n  private fun writeFloatArray(value: DoubleArray) {\n    buffer.requestAdditionalCapacity(Double.SIZE_BYTES * value.size)\n    value.forEach { buffer.put(it) }\n  }\n\n  private inline fun writeIntegerArray(\n    start: Int,\n    size: Int,\n    byteWidth: ByteWidth,\n    crossinline valueBlock: (Int) -> ULong,\n  ) {\n    buffer.requestAdditionalCapacity(size * byteWidth.value)\n    return when (byteWidth.value) {\n      1 ->\n        for (i in start until start + size) {\n          buffer.put(valueBlock(i).toUByte())\n        }\n      2 ->\n        for (i in start until start + size) {\n          buffer.put(valueBlock(i).toUShort())\n        }\n      4 ->\n        for (i in start until start + size) {\n          buffer.put(valueBlock(i).toUInt())\n        }\n      8 ->\n        for (i in start until start + size) {\n          buffer.put(valueBlock(i))\n        }\n      else -> Unit\n    }\n  }\n\n  private fun writeInt(value: Int, byteWidth: ByteWidth) {\n    buffer.requestAdditionalCapacity(byteWidth.value)\n    when (byteWidth.value) {\n      1 -> buffer.put(value.toUByte())\n      2 -> buffer.put(value.toUShort())\n      4 -> buffer.put(value.toUInt())\n      8 -> buffer.put(value.toULong())\n      else -> Unit\n    }\n  }\n\n  private fun writeInt(value: ULong, byteWidth: ByteWidth) {\n    buffer.requestAdditionalCapacity(byteWidth.value)\n    when (byteWidth.value) {\n      1 -> buffer.put(value.toUByte())\n      2 -> buffer.put(value.toUShort())\n      4 -> buffer.put(value.toUInt())\n      8 -> buffer.put(value)\n      else -> Unit\n    }\n  }\n\n  // Align to prepare for writing a scalar with a certain size.\n  // returns the amounts of bytes needed to be written.\n  private fun align(alignment: BitWidth): ByteWidth {\n    val byteWidth = 1 shl alignment.value\n    var padBytes = paddingBytes(buffer.writePosition, byteWidth)\n    buffer.requestCapacity(buffer.capacity + padBytes)\n    while (padBytes-- != 0) {\n      buffer.put(ZeroByte)\n    }\n    return ByteWidth(byteWidth)\n  }\n\n  private fun calculateKeyVectorBitWidth(start: Int, length: Int): BitWidth {\n    val bitWidth = length.toULong().widthInUBits()\n    var width = bitWidth\n    val prefixElems = 1\n    // Check bit widths and types for all elements.\n    for (i in start until stack.size) {\n      val elemWidth =\n        elemWidth(T_KEY, W_8, stack[i].key.toLong(), buffer.writePosition, i + prefixElems)\n      width = width.max(elemWidth)\n    }\n    return width\n  }\n\n  private fun createKeyVector(start: Int, length: Int): Value {\n    // Figure out smallest bit width we can store this vector with.\n    val bitWidth = calculateKeyVectorBitWidth(start, length)\n    val byteWidth = align(bitWidth)\n    // Write vector. First the keys width/offset if available, and size.\n    writeInt(length, byteWidth)\n    // Then the actual data.\n    val vloc = buffer.writePosition.toULong()\n    for (i in start until stack.size) {\n      val pos = stack[i].key\n      if (pos == -1) error(\"invalid position $pos for key\")\n      writeOffset(stack[i].key, byteWidth)\n    }\n    // Then the types.\n    return Value(T_VECTOR_KEY, -1, bitWidth, vloc)\n  }\n\n  private inline fun createVector(key: Int, start: Int, length: Int, keys: Value? = null): Value {\n    return createAnyVector(key, start, length, T_VECTOR, keys) {\n      // add types since we are not creating a typed vector.\n      buffer.requestAdditionalCapacity(stack.size)\n      for (i in start until stack.size) {\n        buffer.put(stack[i].storedPackedType(it))\n      }\n    }\n  }\n\n  private fun putMap(key: Int, start: Int, length: Int, keys: Value? = null): Value {\n    return createAnyVector(key, start, length, T_MAP, keys) {\n      // add types since we are not creating a typed vector.\n      buffer.requestAdditionalCapacity(stack.size)\n      for (i in start until stack.size) {\n        buffer.put(stack[i].storedPackedType(it))\n      }\n    }\n  }\n\n  private inline fun createTypedVector(\n    key: Int,\n    start: Int,\n    length: Int,\n    keys: Value? = null,\n  ): Value {\n    // We assume the callers of this method guarantees all elements are of the same type.\n    val elementType: FlexBufferType = stack[start].type\n    for (i in start + 1 until length) {\n      if (elementType != stack[i].type)\n        error(\"TypedVector does not support array of different element types\")\n    }\n    if (!elementType.isTypedVectorElementType())\n      error(\"TypedVector does not support this element type\")\n    return createAnyVector(key, start, length, elementType.toTypedVector(), keys)\n  }\n\n  private inline fun createAnyVector(\n    key: Int,\n    start: Int,\n    length: Int,\n    type: FlexBufferType,\n    keys: Value? = null,\n    crossinline typeBlock: (BitWidth) -> Unit = {},\n  ): Value {\n    // Figure out the smallest bit width we can store this vector with.\n    var bitWidth = W_8.max(length.toULong().widthInUBits())\n    var prefixElems = 1\n    if (keys != null) {\n      // If this vector is part of a map, we will pre-fix an offset to the keys\n      // to this vector.\n      bitWidth = bitWidth.max(keys.elemWidth(buffer.writePosition, 0))\n      prefixElems += 2\n    }\n    // Check bit widths and types for all elements.\n    for (i in start until stack.size) {\n      val elemWidth = stack[i].elemWidth(buffer.writePosition, i + prefixElems)\n      bitWidth = bitWidth.max(elemWidth)\n    }\n    val byteWidth = align(bitWidth)\n    // Write vector. First the keys width/offset if available, and size.\n    if (keys != null) {\n      writeOffset(keys.iValue.toInt(), byteWidth)\n      writeInt(1 shl keys.minBitWidth.value, byteWidth)\n    }\n    // write the size\n    writeInt(length, byteWidth)\n\n    // Then the actual data.\n    val vloc: Int = buffer.writePosition\n    for (i in start until stack.size) {\n      writeAny(stack[i], byteWidth)\n    }\n\n    // Optionally you can introduce the types for non-typed vector\n    typeBlock(bitWidth)\n    return Value(type, key, bitWidth, vloc.toULong())\n  }\n\n  // A lambda to sort map keys\n  internal val keyComparator =\n    object : Comparator<Value> {\n      override fun compare(a: Value, b: Value): Int {\n        var ia: Int = a.key\n        var io: Int = b.key\n        var c1: Byte\n        var c2: Byte\n        do {\n          c1 = buffer[ia]\n          c2 = buffer[io]\n          if (c1.toInt() == 0) return c1 - c2\n          ia++\n          io++\n        } while (c1 == c2)\n        return c1 - c2\n      }\n    }\n\n  public companion object {\n    /** No keys or strings will be shared */\n    public const val SHARE_NONE: Int = 0\n\n    /**\n     * Keys will be shared between elements. Identical keys will only be serialized once, thus\n     * possibly saving space. But serialization performance might be slower and consumes more\n     * memory.\n     */\n    public const val SHARE_KEYS: Int = 1\n\n    /**\n     * Strings will be shared between elements. Identical strings will only be serialized once, thus\n     * possibly saving space. But serialization performance might be slower and consumes more\n     * memory. This is ideal if you expect many repeated strings on the message.\n     */\n    public const val SHARE_STRINGS: Int = 2\n\n    /** Strings and keys will be shared between elements. */\n    public const val SHARE_KEYS_AND_STRINGS: Int = 3\n  }\n}\n"
  },
  {
    "path": "kotlin/flatbuffers-kotlin/src/commonMain/kotlin/com/google/flatbuffers/kotlin/FlexBuffersInternals.kt",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n@file:Suppress(\"NOTHING_TO_INLINE\")\n\npackage com.google.flatbuffers.kotlin\n\nimport kotlin.jvm.JvmInline\n\n@JvmInline\npublic value class BitWidth(public val value: Int) {\n  public inline fun max(other: BitWidth): BitWidth = if (this.value >= other.value) this else other\n}\n\n@JvmInline public value class ByteWidth(public val value: Int)\n\n@JvmInline\npublic value class FlexBufferType(public val value: Int) {\n  public operator fun minus(other: FlexBufferType): FlexBufferType =\n    FlexBufferType(this.value - other.value)\n\n  public operator fun plus(other: FlexBufferType): FlexBufferType =\n    FlexBufferType(this.value + other.value)\n\n  public operator fun compareTo(other: FlexBufferType): Int = this.value - other.value\n}\n\ninternal operator fun Int.times(width: ByteWidth): Int = this * width.value\n\ninternal operator fun Int.minus(width: ByteWidth): Int = this - width.value\n\ninternal operator fun Int.plus(width: ByteWidth): Int = this + width.value\n\ninternal operator fun Int.minus(type: FlexBufferType): Int = this - type.value\n\n// Returns a Key string from the buffer starting at index [start]. Key Strings are stored as\n// C-Strings, ending with '\\0'. If zero byte not found returns empty string.\ninternal inline fun ReadBuffer.getKeyString(start: Int): String {\n  val i = findFirst(0.toByte(), start)\n  return if (i >= 0) getString(start, i - start) else \"\"\n}\n\n// read unsigned int with size byteWidth and return as a 64-bit integer\ninternal inline fun ReadBuffer.readULong(end: Int, byteWidth: ByteWidth): ULong {\n  return when (byteWidth.value) {\n    1 -> this.getUByte(end).toULong()\n    2 -> this.getUShort(end).toULong()\n    4 -> this.getUInt(end).toULong()\n    8 -> this.getULong(end)\n    else -> error(\"invalid byte width $byteWidth for scalar unsigned integer\")\n  }\n}\n\ninternal inline fun ReadBuffer.readFloat(end: Int, byteWidth: ByteWidth): Double {\n  return when (byteWidth.value) {\n    4 -> this.getFloat(end).toDouble()\n    8 -> this.getDouble(end)\n    else ->\n      error(\"invalid byte width $byteWidth for floating point scalar\") // we should never reach here\n  }\n}\n\n// return position on the [ReadBuffer] of the element that the offset is pointing to\n// we assume all offset fits on a int, since ReadBuffer operates with that assumption\ninternal inline fun ReadBuffer.indirect(offset: Int, byteWidth: ByteWidth): Int =\n  offset - readInt(offset, byteWidth)\n\n// returns the size of an array-like element from [ReadBuffer].\ninternal inline fun ReadBuffer.readSize(end: Int, byteWidth: ByteWidth) =\n  readInt(end - byteWidth, byteWidth)\n\ninternal inline fun ReadBuffer.readUInt(end: Int, byteWidth: ByteWidth): UInt =\n  readULong(end, byteWidth).toUInt()\n\ninternal inline fun ReadBuffer.readInt(end: Int, byteWidth: ByteWidth): Int =\n  readULong(end, byteWidth).toInt()\n\ninternal inline fun ReadBuffer.readLong(end: Int, byteWidth: ByteWidth): Long =\n  readULong(end, byteWidth).toLong()\n\ninternal fun IntArray.widthInUBits(): BitWidth =\n  arrayWidthInUBits(this.size) { this[it].toULong().widthInUBits() }\n\ninternal fun ShortArray.widthInUBits(): BitWidth =\n  arrayWidthInUBits(this.size) { this[it].toULong().widthInUBits() }\n\ninternal fun LongArray.widthInUBits(): BitWidth =\n  arrayWidthInUBits(this.size) { this[it].toULong().widthInUBits() }\n\nprivate inline fun arrayWidthInUBits(\n  size: Int,\n  crossinline elemWidthBlock: (Int) -> BitWidth,\n): BitWidth {\n  // Figure out smallest bit width we can store this vector with.\n  var bitWidth = W_8.max(size.toULong().widthInUBits())\n  // Check bit widths and types for all elements.\n  for (i in 0 until size) {\n    // since we know its inline types we can just assume elmentWidth to be the value width in bits.\n    bitWidth = bitWidth.max(elemWidthBlock(i))\n  }\n  return bitWidth\n}\n\ninternal fun ULong.widthInUBits(): BitWidth =\n  when {\n    this <= MAX_UBYTE_ULONG -> W_8\n    this <= UShort.MAX_VALUE -> W_16\n    this <= UInt.MAX_VALUE -> W_32\n    else -> W_64\n  }\n\n// returns the number of bytes needed for padding the scalar of size scalarSize.\ninternal inline fun paddingBytes(bufSize: Int, scalarSize: Int): Int =\n  bufSize.inv() + 1 and scalarSize - 1\n\ninternal inline fun FlexBufferType.isInline(): Boolean =\n  this.value <= T_FLOAT.value || this == T_BOOL\n\ninternal fun FlexBufferType.isScalar(): Boolean =\n  when (this) {\n    T_INT,\n    T_UINT,\n    T_FLOAT,\n    T_BOOL -> true\n    else -> false\n  }\n\ninternal fun FlexBufferType.isIndirectScalar(): Boolean =\n  when (this) {\n    T_INDIRECT_INT,\n    T_INDIRECT_UINT,\n    T_INDIRECT_FLOAT -> true\n    else -> false\n  }\n\ninternal fun FlexBufferType.isTypedVector(): Boolean =\n  this >= T_VECTOR_INT && this <= T_VECTOR_STRING_DEPRECATED || this == T_VECTOR_BOOL\n\ninternal fun FlexBufferType.isTypedVectorElementType(): Boolean =\n  (this.value in T_INT.value..T_KEY.value) || this == T_BOOL\n\n// returns the typed vector of a given scalar type.\ninternal fun FlexBufferType.toTypedVector(): FlexBufferType = (this - T_INT) + T_VECTOR_INT\n\n// returns the element type of given typed vector.\ninternal fun FlexBufferType.toElementTypedVector(): FlexBufferType = this - T_VECTOR_INT + T_INT\n\n// Holds information about the elements inserted on the buffer.\ninternal data class Value(\n  var type: FlexBufferType = T_INT,\n  var key: Int = -1,\n  var minBitWidth: BitWidth = W_8,\n  var iValue: ULong = 0UL, // integer value\n  var dValue: Double = 0.0, // TODO(paulovap): maybe we can keep floating type on iValue as well.\n) { // float value\n\n  inline fun storedPackedType(parentBitWidth: BitWidth = W_8): Byte =\n    packedType(storedWidth(parentBitWidth), type)\n\n  private inline fun packedType(bitWidth: BitWidth, type: FlexBufferType): Byte =\n    (bitWidth.value or (type.value shl 2)).toByte()\n\n  private inline fun storedWidth(parentBitWidth: BitWidth): BitWidth =\n    if (type.isInline()) minBitWidth.max(parentBitWidth) else minBitWidth\n\n  fun elemWidth(bufSize: Int, elemIndex: Int): BitWidth =\n    elemWidth(type, minBitWidth, iValue.toLong(), bufSize, elemIndex)\n}\n\ninternal fun elemWidth(\n  type: FlexBufferType,\n  minBitWidth: BitWidth,\n  iValue: Long,\n  bufSize: Int,\n  elemIndex: Int,\n): BitWidth {\n  if (type.isInline()) return minBitWidth\n\n  // We have an absolute offset, but want to store a relative offset\n  // elem_index elements beyond the current buffer end. Since whether\n  // the relative offset fits in a certain byte_width depends on\n  // the size of the elements before it (and their alignment), we have\n  // to test for each size in turn.\n  // Original implementation checks for largest scalar\n  // which is long unsigned int\n  var byteWidth = 1\n  while (byteWidth <= 32) {\n    // Where are we going to write this offset?\n    val offsetLoc: Int = bufSize + paddingBytes(bufSize, byteWidth) + elemIndex * byteWidth\n    // Compute relative offset.\n    val offset: Int = offsetLoc - iValue.toInt()\n    // Does it fit?\n    val bitWidth = offset.toULong().widthInUBits()\n    if (1 shl bitWidth.value == byteWidth) return bitWidth\n    byteWidth *= 2\n  }\n  return W_64\n}\n\n// For debugging purposes, convert type to a human-readable string.\ninternal fun FlexBufferType.typeToString(): String =\n  when (this) {\n    T_NULL -> \"Null\"\n    T_INT -> \"Int\"\n    T_UINT -> \"UInt\"\n    T_FLOAT -> \"Float\"\n    T_KEY -> \"Key\"\n    T_STRING -> \"String\"\n    T_INDIRECT_INT -> \"IndirectInt\"\n    T_INDIRECT_UINT -> \"IndirectUInt\"\n    T_INDIRECT_FLOAT -> \"IndirectFloat\"\n    T_MAP -> \"Map\"\n    T_VECTOR -> \"Vector\"\n    T_VECTOR_INT -> \"IntVector\"\n    T_VECTOR_UINT -> \"UIntVector\"\n    T_VECTOR_FLOAT -> \"FloatVector\"\n    T_VECTOR_KEY -> \"KeyVector\"\n    T_VECTOR_STRING_DEPRECATED -> \"StringVectorDeprecated\"\n    T_VECTOR_INT2 -> \"Int2Vector\"\n    T_VECTOR_UINT2 -> \"UInt2Vector\"\n    T_VECTOR_FLOAT2 -> \"Float2Vector\"\n    T_VECTOR_INT3 -> \"Int3Vector\"\n    T_VECTOR_UINT3 -> \"UInt3Vector\"\n    T_VECTOR_FLOAT3 -> \"Float3Vector\"\n    T_VECTOR_INT4 -> \"Int4Vector\"\n    T_VECTOR_UINT4 -> \"UInt4Vector\"\n    T_VECTOR_FLOAT4 -> \"Float4Vector\"\n    T_BLOB -> \"BlobVector\"\n    T_BOOL -> \"BoolVector\"\n    T_VECTOR_BOOL -> \"BoolVector\"\n    else -> \"UnknownType\"\n  }\n\n// Few repeated values used in hot path is cached here\ninternal fun emptyBlob() = Blob(emptyBuffer, 1, ByteWidth(1))\n\ninternal fun emptyVector() = Vector(emptyBuffer, 1, ByteWidth(1))\n\ninternal fun emptyMap() = Map(ArrayReadWriteBuffer(3), 3, ByteWidth(1))\n\ninternal fun nullReference() = Reference(emptyBuffer, 1, ByteWidth(0), T_NULL.value)\n\ninternal fun nullKey() = Key(emptyBuffer, 1)\n\ninternal const val ZeroByte = 0.toByte()\ninternal const val MAX_UBYTE_ULONG = 255UL\ninternal const val MAX_UBYTE = 255\ninternal const val MAX_USHORT = 65535\n\n// value bit width possible sizes\ninternal val W_8 = BitWidth(0)\ninternal val W_16 = BitWidth(1)\ninternal val W_32 = BitWidth(2)\ninternal val W_64 = BitWidth(3)\n\n// These are used as the upper 6 bits of a type field to indicate the actual type.\ninternal val T_INVALID = FlexBufferType(-1)\ninternal val T_NULL = FlexBufferType(0)\ninternal val T_INT = FlexBufferType(1)\ninternal val T_UINT = FlexBufferType(2)\ninternal val T_FLOAT =\n  FlexBufferType(3) // Types above stored inline, types below are stored in an offset.\ninternal val T_KEY = FlexBufferType(4)\ninternal val T_STRING = FlexBufferType(5)\ninternal val T_INDIRECT_INT = FlexBufferType(6)\ninternal val T_INDIRECT_UINT = FlexBufferType(7)\ninternal val T_INDIRECT_FLOAT = FlexBufferType(8)\ninternal val T_MAP = FlexBufferType(9)\ninternal val T_VECTOR = FlexBufferType(10) // Untyped.\ninternal val T_VECTOR_INT = FlexBufferType(11) // Typed any size  = stores no type table).\ninternal val T_VECTOR_UINT = FlexBufferType(12)\ninternal val T_VECTOR_FLOAT = FlexBufferType(13)\ninternal val T_VECTOR_KEY = FlexBufferType(14)\n// DEPRECATED, use FBT_VECTOR or FBT_VECTOR_KEY instead.\n// more info on https://github.com/google/flatbuffers/issues/5627.\ninternal val T_VECTOR_STRING_DEPRECATED = FlexBufferType(15)\ninternal val T_VECTOR_INT2 = FlexBufferType(16) // Typed tuple  = no type table; no size field).\ninternal val T_VECTOR_UINT2 = FlexBufferType(17)\ninternal val T_VECTOR_FLOAT2 = FlexBufferType(18)\ninternal val T_VECTOR_INT3 = FlexBufferType(19) // Typed triple  = no type table; no size field).\ninternal val T_VECTOR_UINT3 = FlexBufferType(20)\ninternal val T_VECTOR_FLOAT3 = FlexBufferType(21)\ninternal val T_VECTOR_INT4 = FlexBufferType(22) // Typed quad  = no type table; no size field).\ninternal val T_VECTOR_UINT4 = FlexBufferType(23)\ninternal val T_VECTOR_FLOAT4 = FlexBufferType(24)\ninternal val T_BLOB = FlexBufferType(25)\ninternal val T_BOOL = FlexBufferType(26)\ninternal val T_VECTOR_BOOL =\n  FlexBufferType(36) // To Allow the same type of conversion of type to vector type\n"
  },
  {
    "path": "kotlin/flatbuffers-kotlin/src/commonMain/kotlin/com/google/flatbuffers/kotlin/Utf8.kt",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n@file:Suppress(\"NOTHING_TO_INLINE\")\n\npackage com.google.flatbuffers.kotlin\n\npublic object Utf8 {\n  /**\n   * Returns the number of bytes in the UTF-8-encoded form of `sequence`. For a string, this method\n   * is equivalent to `string.getBytes(UTF_8).length`, but is more efficient in both time and space.\n   *\n   * @throws IllegalArgumentException if `sequence` contains ill-formed UTF-16 (unpaired surrogates)\n   */\n  private fun computeEncodedLength(sequence: CharSequence): Int {\n    // Warning to maintainers: this implementation is highly optimized.\n    val utf16Length = sequence.length\n    var utf8Length = utf16Length\n    var i = 0\n\n    // This loop optimizes for pure ASCII.\n    while (i < utf16Length && sequence[i].code < 0x80) {\n      i++\n    }\n\n    // This loop optimizes for chars less than 0x800.\n    while (i < utf16Length) {\n      val c = sequence[i]\n      if (c.code < 0x800) {\n        utf8Length += 0x7f - c.code ushr 31 // branch free!\n      } else {\n        utf8Length += encodedLengthGeneral(sequence, i)\n        break\n      }\n      i++\n    }\n    if (utf8Length < utf16Length) {\n      // Necessary and sufficient condition for overflow because of maximum 3x expansion\n      error(\"UTF-8 length does not fit in int: ${(utf8Length + (1L shl 32))}\")\n    }\n    return utf8Length\n  }\n\n  private fun encodedLengthGeneral(sequence: CharSequence, start: Int): Int {\n    val utf16Length = sequence.length\n    var utf8Length = 0\n    var i = start\n    while (i < utf16Length) {\n      val c = sequence[i]\n      if (c.code < 0x800) {\n        utf8Length += 0x7f - c.code ushr 31 // branch free!\n      } else {\n        utf8Length += 2\n        if (c.isSurrogate()) {\n          // Check that we have a well-formed surrogate pair.\n          val cp: Int = codePointAt(sequence, i)\n          if (cp < MIN_SUPPLEMENTARY_CODE_POINT) {\n            errorSurrogate(i, utf16Length)\n          }\n          i++\n        }\n      }\n      i++\n    }\n    return utf8Length\n  }\n\n  /**\n   * Returns the number of bytes in the UTF-8-encoded form of `sequence`. For a string, this method\n   * is equivalent to `string.getBytes(UTF_8).length`, but is more efficient in both time and space.\n   *\n   * @throws IllegalArgumentException if `sequence` contains ill-formed UTF-16 (unpaired surrogates)\n   */\n  public fun encodedLength(sequence: CharSequence): Int = computeEncodedLength(sequence)\n\n  /** Returns whether this is a single-byte codepoint (i.e., ASCII) with the form '0XXXXXXX'. */\n  public inline fun isOneByte(b: Byte): Boolean = b >= 0\n\n  /** Returns whether this is a two-byte codepoint with the form 110xxxxx 0xC0..0xDF. */\n  public inline fun isTwoBytes(b: Byte): Boolean = b < 0xE0.toByte()\n\n  /** Returns whether this is a three-byte codepoint with the form 1110xxxx 0xE0..0xEF. */\n  public inline fun isThreeBytes(b: Byte): Boolean = b < 0xF0.toByte()\n\n  /** Returns whether this is a four-byte codepoint with the form 11110xxx 0xF0..0xF4. */\n  public inline fun isFourByte(b: Byte): Boolean = b < 0xF8.toByte()\n\n  public fun handleOneByte(byte1: Byte, resultArr: CharArray, resultPos: Int) {\n    resultArr[resultPos] = byte1.toInt().toChar()\n  }\n\n  public fun handleTwoBytes(byte1: Byte, byte2: Byte, resultArr: CharArray, resultPos: Int) {\n    // Simultaneously checks for illegal trailing-byte in leading position (<= '11000000') and\n    // overlong 2-byte, '11000001'.\n    if (byte1 < 0xC2.toByte()) {\n      error(\"Invalid UTF-8: Illegal leading byte in 2 bytes utf\")\n    }\n    if (isNotTrailingByte(byte2)) {\n      error(\"Invalid UTF-8: Illegal trailing byte in 2 bytes utf\")\n    }\n    resultArr[resultPos] = (byte1.toInt() and 0x1F shl 6 or trailingByteValue(byte2)).toChar()\n  }\n\n  public fun handleThreeBytes(\n    byte1: Byte,\n    byte2: Byte,\n    byte3: Byte,\n    resultArr: CharArray,\n    resultPos: Int,\n  ) {\n    if (\n      isNotTrailingByte(byte2) || // overlong? 5 most significant bits must not all be zero\n        byte1 == 0xE0.toByte() && byte2 < 0xA0.toByte() || // check for illegal surrogate codepoints\n        byte1 == 0xED.toByte() && byte2 >= 0xA0.toByte() ||\n        isNotTrailingByte(byte3)\n    ) {\n      error(\"Invalid UTF-8\")\n    }\n    resultArr[resultPos] =\n      (byte1.toInt() and\n          0x0F shl\n          12 or\n          (trailingByteValue(byte2) shl 6) or\n          trailingByteValue(byte3))\n        .toChar()\n  }\n\n  public fun handleFourBytes(\n    byte1: Byte,\n    byte2: Byte,\n    byte3: Byte,\n    byte4: Byte,\n    resultArr: CharArray,\n    resultPos: Int,\n  ) {\n    if (\n      isNotTrailingByte(byte2) || // Check that 1 <= plane <= 16.  Tricky optimized form of:\n        //   valid 4-byte leading byte?\n        // if (byte1 > (byte) 0xF4 ||\n        //   overlong? 4 most significant bits must not all be zero\n        //     byte1 == (byte) 0xF0 && byte2 < (byte) 0x90 ||\n        //   codepoint larger than the highest code point (U+10FFFF)?\n        //     byte1 == (byte) 0xF4 && byte2 > (byte) 0x8F)\n        (byte1.toInt() shl 28) + (byte2 - 0x90.toByte()) shr 30 != 0 ||\n        isNotTrailingByte(byte3) ||\n        isNotTrailingByte(byte4)\n    ) {\n      error(\"Invalid UTF-8\")\n    }\n    val codepoint: Int =\n      (byte1.toInt() and\n        0x07 shl\n        18 or\n        (trailingByteValue(byte2) shl 12) or\n        (trailingByteValue(byte3) shl 6) or\n        trailingByteValue(byte4))\n    resultArr[resultPos] = highSurrogate(codepoint)\n    resultArr[resultPos + 1] = lowSurrogate(codepoint)\n  }\n\n  /** Returns whether the byte is not a valid continuation of the form '10XXXXXX'. */\n  private fun isNotTrailingByte(b: Byte): Boolean = b > 0xBF.toByte()\n\n  /** Returns the actual value of the trailing byte (removes the prefix '10') for composition. */\n  private fun trailingByteValue(b: Byte): Int = b.toInt() and 0x3F\n\n  private fun highSurrogate(codePoint: Int): Char =\n    (Char.MIN_HIGH_SURROGATE - (MIN_SUPPLEMENTARY_CODE_POINT ushr 10) + (codePoint ushr 10))\n\n  private fun lowSurrogate(codePoint: Int): Char = (Char.MIN_LOW_SURROGATE + (codePoint and 0x3ff))\n\n  /**\n   * Encode a [CharSequence] UTF8 codepoint into a byte array.\n   *\n   * @param `in` CharSequence to be encoded\n   * @param start start position of the first char in the codepoint\n   * @param out byte array of 4 bytes to be filled\n   * @return return the amount of bytes occupied by the codepoint\n   */\n  public fun encodeUtf8CodePoint(input: CharSequence, start: Int, out: ByteArray): Int {\n    // utf8 codepoint needs at least 4 bytes\n    val inLength = input.length\n    if (start >= inLength) {\n      return 0\n    }\n    val c = input[start]\n    return if (c.code < 0x80) {\n      // One byte (0xxx xxxx)\n      out[0] = c.code.toByte()\n      1\n    } else if (c.code < 0x800) {\n      // Two bytes (110x xxxx 10xx xxxx)\n      out[0] = (0xC0 or (c.code ushr 6)).toByte()\n      out[1] = (0x80 or (0x3F and c.code)).toByte()\n      2\n    } else if (c < Char.MIN_SURROGATE || Char.MAX_SURROGATE < c) {\n      // Three bytes (1110 xxxx 10xx xxxx 10xx xxxx)\n      // Maximum single-char code point is 0xFFFF, 16 bits.\n      out[0] = (0xE0 or (c.code ushr 12)).toByte()\n      out[1] = (0x80 or (0x3F and (c.code ushr 6))).toByte()\n      out[2] = (0x80 or (0x3F and c.code)).toByte()\n      3\n    } else {\n      // Four bytes (1111 xxxx 10xx xxxx 10xx xxxx 10xx xxxx)\n      // Minimum code point represented by a surrogate pair is 0x10000, 17 bits, four UTF-8\n      // bytes\n      val low: Char = input[start + 1]\n      if (start + 1 == inLength || !(c.isHighSurrogate() and low.isLowSurrogate())) {\n        errorSurrogate(start, inLength)\n      }\n      val codePoint: Int = toCodePoint(c, low)\n      out[0] = (0xF shl 4 or (codePoint ushr 18)).toByte()\n      out[1] = (0x80 or (0x3F and (codePoint ushr 12))).toByte()\n      out[2] = (0x80 or (0x3F and (codePoint ushr 6))).toByte()\n      out[3] = (0x80 or (0x3F and codePoint)).toByte()\n      4\n    }\n  }\n\n  // Decodes a code point starting at index into out. Out parameter\n  // should have at least 2 chars.\n  public fun decodeUtf8CodePoint(bytes: ReadBuffer, index: Int, out: CharArray) {\n    // Bitwise OR combines the sign bits so any negative value fails the check.\n    val b1 = bytes[index]\n    when {\n      isOneByte(b1) -> handleOneByte(b1, out, 0)\n      isTwoBytes(b1) -> handleTwoBytes(b1, bytes[index + 1], out, 0)\n      isThreeBytes(b1) -> handleThreeBytes(b1, bytes[index + 1], bytes[index + 2], out, 0)\n      else -> handleFourBytes(b1, bytes[index + 1], bytes[index + 2], bytes[index + 3], out, 0)\n    }\n  }\n\n  public fun decodeUtf8Array(bytes: ByteArray, index: Int = 0, size: Int = bytes.size): String {\n    // Bitwise OR combines the sign bits so any negative value fails the check.\n    if (index or size or bytes.size - index - size < 0) {\n      error(\"buffer length=${bytes.size}, index=$index, size=$size\")\n    }\n    var offset = index\n    val limit = offset + size\n\n    // The longest possible resulting String is the same as the number of input bytes, when it is\n    // all ASCII. For other cases, this over-allocates and we will truncate in the end.\n    val resultArr = CharArray(size)\n    var resultPos = 0\n\n    // Optimize for 100% ASCII (Hotspot loves small simple top-level loops like this).\n    // This simple loop stops when we encounter a byte >= 0x80 (i.e. non-ASCII).\n    while (offset < limit) {\n      val b = bytes[offset]\n      if (!isOneByte(b)) {\n        break\n      }\n      offset++\n      handleOneByte(b, resultArr, resultPos++)\n    }\n    while (offset < limit) {\n      val byte1 = bytes[offset++]\n      if (isOneByte(byte1)) {\n        handleOneByte(byte1, resultArr, resultPos++)\n        // It's common for there to be multiple ASCII characters in a run mixed in, so add an\n        // extra optimized loop to take care of these runs.\n        while (offset < limit) {\n          val b = bytes[offset]\n          if (!isOneByte(b)) {\n            break\n          }\n          offset++\n          handleOneByte(b, resultArr, resultPos++)\n        }\n      } else if (isTwoBytes(byte1)) {\n        if (offset >= limit) {\n          error(\"Invalid UTF-8\")\n        }\n        handleTwoBytes(byte1, /* byte2 */ bytes[offset++], resultArr, resultPos++)\n      } else if (isThreeBytes(byte1)) {\n        if (offset >= limit - 1) {\n          error(\"Invalid UTF-8\")\n        }\n        handleThreeBytes(\n          byte1, /* byte2 */\n          bytes[offset++], /* byte3 */\n          bytes[offset++],\n          resultArr,\n          resultPos++,\n        )\n      } else {\n        if (offset >= limit - 2) {\n          error(\"Invalid UTF-8\")\n        }\n        handleFourBytes(\n          byte1, /* byte2 */\n          bytes[offset++], /* byte3 */\n          bytes[offset++], /* byte4 */\n          bytes[offset++],\n          resultArr,\n          resultPos++,\n        )\n        // 4-byte case requires two chars.\n        resultPos++\n      }\n    }\n    return resultArr.concatToString(0, resultPos)\n  }\n\n  public fun encodeUtf8Array(\n    input: CharSequence,\n    out: ByteArray,\n    offset: Int = 0,\n    length: Int = out.size - offset,\n  ): Int {\n    val utf16Length = input.length\n    var j = offset\n    var i = 0\n    val limit = offset + length\n    // Designed to take advantage of\n    // https://wikis.oracle.com/display/HotSpotInternals/RangeCheckElimination\n\n    if (utf16Length == 0) return 0\n    var cc: Char = input[i]\n    while (i < utf16Length && i + j < limit && input[i].also { cc = it }.code < 0x80) {\n      out[j + i] = cc.code.toByte()\n      i++\n    }\n    if (i == utf16Length) {\n      return j + utf16Length\n    }\n    j += i\n    var c: Char\n    while (i < utf16Length) {\n      c = input[i]\n      if (c.code < 0x80 && j < limit) {\n        out[j++] = c.code.toByte()\n      } else if (c.code < 0x800 && j <= limit - 2) { // 11 bits, two UTF-8 bytes\n        out[j++] = (0xF shl 6 or (c.code ushr 6)).toByte()\n        out[j++] = (0x80 or (0x3F and c.code)).toByte()\n      } else if ((c < Char.MIN_SURROGATE || Char.MAX_SURROGATE < c) && j <= limit - 3) {\n        // Maximum single-char code point is 0xFFFF, 16 bits, three UTF-8 bytes\n        out[j++] = (0xF shl 5 or (c.code ushr 12)).toByte()\n        out[j++] = (0x80 or (0x3F and (c.code ushr 6))).toByte()\n        out[j++] = (0x80 or (0x3F and c.code)).toByte()\n      } else if (j <= limit - 4) {\n        // Minimum code point represented by a surrogate pair is 0x10000, 17 bits,\n        // four UTF-8 bytes\n        var low: Char = Char.MIN_VALUE\n        if (i + 1 == input.length || !isSurrogatePair(c, input[++i].also { low = it })) {\n          errorSurrogate(i - 1, utf16Length)\n        }\n        val codePoint: Int = toCodePoint(c, low)\n        out[j++] = (0xF shl 4 or (codePoint ushr 18)).toByte()\n        out[j++] = (0x80 or (0x3F and (codePoint ushr 12))).toByte()\n        out[j++] = (0x80 or (0x3F and (codePoint ushr 6))).toByte()\n        out[j++] = (0x80 or (0x3F and codePoint)).toByte()\n      } else {\n        // If we are surrogates and we're not a surrogate pair, always throw an\n        // UnpairedSurrogateException instead of an ArrayOutOfBoundsException.\n        if (\n          Char.MIN_SURROGATE <= c &&\n            c <= Char.MAX_SURROGATE &&\n            (i + 1 == input.length || !isSurrogatePair(c, input[i + 1]))\n        ) {\n          errorSurrogate(i, utf16Length)\n        }\n        error(\"Failed writing character ${c.code.toShort().toString(radix = 16)} at index $j\")\n      }\n      i++\n    }\n    return j\n  }\n\n  public fun codePointAt(seq: CharSequence, position: Int): Int {\n    var index = position\n    val c1 = seq[index]\n    if (c1.isHighSurrogate() && ++index < seq.length) {\n      val c2 = seq[index]\n      if (c2.isLowSurrogate()) {\n        return toCodePoint(c1, c2)\n      }\n    }\n    return c1.code\n  }\n\n  private fun isSurrogatePair(high: Char, low: Char) =\n    high.isHighSurrogate() and low.isLowSurrogate()\n\n  private fun toCodePoint(high: Char, low: Char): Int =\n    (high.code shl 10) +\n      low.code +\n      (MIN_SUPPLEMENTARY_CODE_POINT -\n        (Char.MIN_HIGH_SURROGATE.code shl 10) -\n        Char.MIN_LOW_SURROGATE.code)\n\n  private fun errorSurrogate(i: Int, utf16Length: Int): Unit =\n    error(\"Unpaired surrogate at index $i of $utf16Length length\")\n\n  // The minimum value of Unicode supplementary code point, constant `U+10000`.\n  private const val MIN_SUPPLEMENTARY_CODE_POINT = 0x010000\n}\n"
  },
  {
    "path": "kotlin/flatbuffers-kotlin/src/commonMain/kotlin/com/google/flatbuffers/kotlin/json.kt",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n@file:Suppress(\"NOTHING_TO_INLINE\")\n\npackage com.google.flatbuffers.kotlin\n\nimport com.google.flatbuffers.kotlin.FlexBuffersBuilder.Companion.SHARE_KEYS_AND_STRINGS\nimport kotlin.experimental.and\nimport kotlin.jvm.JvmInline\nimport kotlin.math.pow\n\n/** Returns a minified version of this FlexBuffer as a JSON. */\npublic fun Reference.toJson(): String =\n  ArrayReadWriteBuffer(1024).let {\n    toJson(it)\n    val data = it.data() // it.getString(0, it.writePosition)\n    return data.decodeToString(0, it.writePosition)\n  }\n\n/**\n * Returns a minified version of this FlexBuffer as a JSON.\n *\n * @param out [ReadWriteBuffer] the JSON will be written.\n */\npublic fun Reference.toJson(out: ReadWriteBuffer) {\n  when (type) {\n    T_STRING -> {\n      val start = buffer.indirect(end, parentWidth)\n      val size = buffer.readULong(start - byteWidth, byteWidth).toInt()\n      out.jsonEscape(buffer, start, size)\n    }\n    T_KEY -> {\n      val start = buffer.indirect(end, parentWidth)\n      val end = buffer.findFirst(0.toByte(), start)\n      out.jsonEscape(buffer, start, end - start)\n    }\n    T_BLOB -> {\n      val blob = toBlob()\n      out.jsonEscape(out, blob.end, blob.size)\n    }\n    T_INT -> out.put(toLong().toString())\n    T_UINT -> out.put(toULong().toString())\n    T_FLOAT -> out.put(toDouble().toString())\n    T_NULL -> out.put(\"null\")\n    T_BOOL -> out.put(toBoolean().toString())\n    T_MAP -> toMap().toJson(out)\n    T_VECTOR,\n    T_VECTOR_BOOL,\n    T_VECTOR_FLOAT,\n    T_VECTOR_INT,\n    T_VECTOR_UINT,\n    T_VECTOR_KEY,\n    T_VECTOR_STRING_DEPRECATED -> toVector().toJson(out)\n    else -> error(\"Unable to convert type ${type.typeToString()} to JSON\")\n  }\n}\n\n/** Returns a minified version of this FlexBuffer as a JSON. */\npublic fun Map.toJson(): String =\n  ArrayReadWriteBuffer(1024).let {\n    toJson(it)\n    it.toString()\n  }\n\n/**\n * Returns a minified version of this FlexBuffer as a JSON.\n *\n * @param out [ReadWriteBuffer] the JSON will be written.\n */\npublic fun Map.toJson(out: ReadWriteBuffer) {\n  out.put('{'.code.toByte())\n  // key values pairs\n  for (i in 0 until size) {\n    val key = keyAt(i)\n    out.jsonEscape(buffer, key.start, key.sizeInBytes)\n    out.put(':'.code.toByte())\n    get(i).toJson(out)\n    if (i != size - 1) {\n      out.put(','.code.toByte())\n    }\n  }\n  // close bracket\n  out.put('}'.code.toByte())\n}\n\n/** Returns a minified version of this FlexBuffer as a JSON. */\npublic fun Vector.toJson(): String =\n  ArrayReadWriteBuffer(1024).let {\n    toJson(it)\n    it.toString()\n  }\n\n/**\n * Returns a minified version of this FlexBuffer as a JSON.\n *\n * @param out that the JSON is being concatenated.\n */\npublic fun Vector.toJson(out: ReadWriteBuffer) {\n  out.put('['.code.toByte())\n  for (i in indices) {\n    get(i).toJson(out)\n    if (i != size - 1) {\n      out.put(','.code.toByte())\n    }\n  }\n  out.put(']'.code.toByte())\n}\n\n/**\n * JSONParser class is used to parse a JSON as FlexBuffers. Calling [JSONParser.parse] fiils\n * [output] and returns a [Reference] ready to be used.\n */\n@ExperimentalUnsignedTypes\npublic class JSONParser(\n  public var output: FlexBuffersBuilder = FlexBuffersBuilder(1024, SHARE_KEYS_AND_STRINGS)\n) {\n  private var readPos = 0\n  private var scopes = ScopeStack()\n\n  /** Parse a json as [String] and returns a [Reference] to a FlexBuffer. */\n  public fun parse(data: String): Reference = parse(ArrayReadBuffer(data.encodeToByteArray()))\n\n  /** Parse a json as [ByteArray] and returns a [Reference] to a FlexBuffer. */\n  public fun parse(data: ByteArray): Reference = parse(ArrayReadBuffer(data))\n\n  /** Parse a json as [ReadBuffer] and returns a [Reference] to a FlexBuffer. */\n  public fun parse(data: ReadBuffer): Reference {\n    reset()\n    parseValue(data, nextToken(data), null)\n    if (readPos < data.limit) {\n      val tok = skipWhitespace(data)\n      if (tok != CHAR_EOF) {\n        makeError(data, \"Extraneous charaters after parse has finished\", tok)\n      }\n    }\n    output.finish()\n    return getRoot(output.buffer)\n  }\n\n  private fun parseValue(data: ReadBuffer, token: Token, key: String? = null): FlexBufferType {\n    return when (token) {\n      TOK_BEGIN_OBJECT -> parseObject(data, key)\n      TOK_BEGIN_ARRAY -> parseArray(data, key)\n      TOK_TRUE -> T_BOOL.also { output[key] = true }\n      TOK_FALSE -> T_BOOL.also { output[key] = false }\n      TOK_NULL -> T_NULL.also { output.putNull(key) }\n      TOK_BEGIN_QUOTE -> parseString(data, key)\n      TOK_NUMBER -> parseNumber(data, data.data(), key)\n      else -> makeError(data, \"Unexpected Character while parsing\", 'x'.code.toByte())\n    }\n  }\n\n  private fun parseObject(data: ReadBuffer, key: String? = null): FlexBufferType {\n    this.scopes.push(SCOPE_OBJ_EMPTY)\n\n    val fPos = output.startMap()\n    val limit = data.limit\n    while (readPos <= limit) {\n      when (val tok = nextToken(data)) {\n        TOK_END_OBJECT -> {\n          this.scopes.pop()\n          output.endMap(fPos, key)\n          return T_MAP\n        }\n        TOK_BEGIN_QUOTE -> {\n          val childKey = readString(data)\n          parseValue(data, nextToken(data), childKey)\n        }\n        else -> makeError(data, \"Expecting start of object key\", tok)\n      }\n    }\n    makeError(data, \"Unable to parse the object\", \"x\".toByte())\n  }\n\n  private fun parseArray(data: ReadBuffer, key: String? = null): FlexBufferType {\n    this.scopes.push(SCOPE_ARRAY_EMPTY)\n    val fPos = output.startVector()\n    var elementType = T_INVALID\n    var multiType = false\n    val limit = data.limit\n\n    while (readPos <= limit) {\n      when (val tok = nextToken(data)) {\n        TOK_END_ARRAY -> {\n          this.scopes.pop()\n          return if (!multiType && elementType.isScalar()) {\n            output.endTypedVector(fPos, key)\n            elementType.toElementTypedVector()\n          } else {\n            output.endVector(key, fPos)\n            T_VECTOR\n          }\n        }\n\n        else -> {\n          val newType = parseValue(data, tok, null)\n\n          if (elementType == T_INVALID) {\n            elementType = newType\n          } else if (newType != elementType) {\n            multiType = true\n          }\n        }\n      }\n    }\n    makeError(data, \"Unable to parse the array\")\n  }\n\n  private fun parseNumber(data: ReadBuffer, array: ByteArray, key: String?): FlexBufferType {\n    val ary = array\n    var cursor = readPos\n    var c = data[readPos++]\n    var useDouble = false\n    val limit = ary.size\n    var sign = 1\n    var double: Double\n    var long = 0L\n    var digits = 0\n\n    if (c == CHAR_MINUS) {\n      cursor++\n      checkEOF(data, cursor)\n      c = ary[cursor]\n      sign = -1\n    }\n\n    // peek first byte\n    when (c) {\n      CHAR_0 -> {\n        cursor++\n        if (cursor != limit) {\n          c = ary[cursor]\n        }\n      }\n      !in CHAR_0..CHAR_9 -> makeError(data, \"Invalid Number\", c)\n      else -> {\n        do {\n          val digit = c - CHAR_0\n          // double = 10.0 * double + digit\n          long = 10 * long + digit\n          digits++\n          cursor++\n          if (cursor == limit) break\n          c = ary[cursor]\n        } while (c in CHAR_0..CHAR_9)\n      }\n    }\n\n    var exponent = 0\n    // If we find '.' we need to convert to double\n    if (c == CHAR_DOT) {\n      useDouble = true\n      checkEOF(data, cursor)\n      c = ary[++cursor]\n      if (c < CHAR_0 || c > CHAR_9) {\n        makeError(data, \"Invalid Number\", c)\n      }\n      do {\n        // double = double * 10 + (tok - CHAR_0)\n        long = 10 * long + (c - CHAR_0)\n        digits++\n        --exponent\n        cursor++\n        if (cursor == limit) break\n        c = ary[cursor]\n      } while (c in CHAR_0..CHAR_9)\n    }\n\n    // If we find 'e' we need to convert to double\n    if (c == CHAR_e || c == CHAR_E) {\n      useDouble = true\n      ++cursor\n      checkEOF(data, cursor)\n      c = ary[cursor]\n      var negativeExponent = false\n      if (c == CHAR_MINUS) {\n        ++cursor\n        checkEOF(data, cursor)\n        negativeExponent = true\n        c = ary[cursor]\n      } else if (c == CHAR_PLUS) {\n        ++cursor\n        checkEOF(data, cursor)\n        c = ary[cursor]\n      }\n      if (c < CHAR_0 || c > CHAR_9) {\n        makeError(data, \"Missing exponent\", c)\n      }\n      var exp = 0\n      do {\n        val digit = c - CHAR_0\n        exp = 10 * exp + digit\n        ++cursor\n        if (cursor == limit) break\n        c = ary[cursor]\n      } while (c in CHAR_0..CHAR_9)\n\n      exponent += if (negativeExponent) -exp else exp\n    }\n\n    if (digits > 17 || exponent < -19 || exponent > 19) {\n      // if the float number is not simple enough\n      // we use language's Double parsing, which is slower but\n      // produce more expected results for extreme numbers.\n      val firstPos = readPos - 1\n      val str = data.getString(firstPos, cursor - firstPos)\n      if (useDouble) {\n        double = str.toDouble()\n        output[key] = double\n      } else {\n        long = str.toLong()\n        output[key] = long\n      }\n    } else {\n      // this happens on single numbers outside any object\n      // or array\n      if (useDouble || exponent != 0) {\n        double = if (long == 0L) 0.0 else long.toDouble() * 10.0.pow(exponent)\n        double *= sign\n        output[key] = double\n      } else {\n        long *= sign\n        output[key] = long\n      }\n    }\n    readPos = cursor\n    return if (useDouble) T_FLOAT else T_INT\n  }\n\n  private fun parseString(data: ReadBuffer, key: String?): FlexBufferType {\n    output[key] = readString(data)\n    return T_STRING\n  }\n\n  private fun readString(data: ReadBuffer): String {\n    val limit = data.limit\n    if (data is ArrayReadBuffer) {\n      val ary = data.data()\n      // enables range check elimination\n      return readString(data, limit) { ary[it] }\n    }\n    return readString(data, limit) { data[it] }\n  }\n\n  private inline fun readString(\n    data: ReadBuffer,\n    limit: Int,\n    crossinline fetch: (Int) -> Byte,\n  ): String {\n    var cursorPos = readPos\n    var foundEscape = false\n    var currentChar: Byte = 0\n    // we loop over every 4 bytes until find any non-plain char\n    while (limit - cursorPos >= 4) {\n      currentChar = fetch(cursorPos)\n      if (!isPlainStringChar(currentChar)) {\n        foundEscape = true\n        break\n      }\n      currentChar = fetch(cursorPos + 1)\n      if (!isPlainStringChar(currentChar)) {\n        cursorPos += 1\n        foundEscape = true\n        break\n      }\n      currentChar = fetch(cursorPos + 2)\n      if (!isPlainStringChar(currentChar)) {\n        cursorPos += 2\n        foundEscape = true\n        break\n      }\n      currentChar = fetch(cursorPos + 3)\n      if (!isPlainStringChar(currentChar)) {\n        cursorPos += 3\n        foundEscape = true\n        break\n      }\n      cursorPos += 4\n    }\n    if (!foundEscape) {\n      // if non-plain string char is not found we loop over\n      // the remaining bytes\n      while (true) {\n        if (cursorPos >= limit) {\n          error(\"Unexpected end of string\")\n        }\n        currentChar = fetch(cursorPos)\n        if (!isPlainStringChar(currentChar)) {\n          break\n        }\n        ++cursorPos\n      }\n    }\n    if (currentChar == CHAR_DOUBLE_QUOTE) {\n      val str = data.getString(readPos, cursorPos - readPos)\n      readPos = cursorPos + 1\n      return str\n    }\n    if (currentChar in 0..0x1f) {\n      error(\"Illegal Codepoint\")\n    } else {\n      // backslash or >0x7f\n      return readStringSlow(data, currentChar, cursorPos)\n    }\n  }\n\n  private fun readStringSlow(data: ReadBuffer, first: Byte, lastPos: Int): String {\n    var cursorPos = lastPos\n\n    var endOfString = lastPos\n    while (true) {\n      val pos = data.findFirst(CHAR_DOUBLE_QUOTE, endOfString)\n      when {\n        pos == -1 -> makeError(data, \"Unexpected EOF, missing end of string '\\\"'\", first)\n        data[pos - 1] == CHAR_BACKSLASH && data[pos - 2] != CHAR_BACKSLASH -> {\n          // here we are checking for double quotes preceded by backslash. eg \\\"\n          // we have to look past pos -2 to make sure that the backlash is not\n          // part of a previous escape, eg \"\\\\\"\n          endOfString = pos + 1\n        }\n        else -> {\n          endOfString = pos\n          break\n        }\n      }\n    }\n    // copy everything before the escape\n    val builder = StringBuilder(data.getString(readPos, lastPos - readPos))\n    while (true) {\n      when (val pos = data.findFirst(CHAR_BACKSLASH, cursorPos, endOfString)) {\n        -1 -> {\n          val doubleQuotePos = data.findFirst(CHAR_DOUBLE_QUOTE, cursorPos)\n          if (doubleQuotePos == -1) makeError(data, \"Reached EOF before enclosing string\", first)\n          val rest = data.getString(cursorPos, doubleQuotePos - cursorPos)\n          builder.append(rest)\n          readPos = doubleQuotePos + 1\n          return builder.toString()\n        }\n\n        else -> {\n          // we write everything up to \\\n          builder.append(data.getString(cursorPos, pos - cursorPos))\n          val c = data[pos + 1]\n          builder.append(readEscapedChar(data, c, pos))\n          cursorPos = pos + if (c == CHAR_u) 6 else 2\n        }\n      }\n    }\n  }\n\n  private inline fun isPlainStringChar(c: Byte): Boolean {\n    val flags = parseFlags\n    // return c in 0x20..0x7f && c != 0x22.toByte() && c != 0x5c.toByte()\n    return (flags[c.toInt() and 0xFF] and 1) != 0.toByte()\n  }\n\n  private inline fun isWhitespace(c: Byte): Boolean {\n    val flags = parseFlags\n    // return c == '\\r'.toByte() || c == '\\n'.toByte() || c == '\\t'.toByte() || c == ' '.toByte()\n    return (flags[c.toInt() and 0xFF] and 2) != 0.toByte()\n  }\n\n  private fun reset() {\n    readPos = 0\n    output.clear()\n    scopes.reset()\n  }\n\n  private fun nextToken(data: ReadBuffer): Token {\n    val scope = this.scopes.last\n\n    when (scope) {\n      SCOPE_ARRAY_EMPTY -> this.scopes.last = SCOPE_ARRAY_FILLED\n      SCOPE_ARRAY_FILLED -> {\n        when (val c = skipWhitespace(data)) {\n          CHAR_CLOSE_ARRAY -> return TOK_END_ARRAY\n          CHAR_COMMA -> Unit\n          else -> makeError(data, \"Unfinished Array\", c)\n        }\n      }\n      SCOPE_OBJ_EMPTY,\n      SCOPE_OBJ_FILLED -> {\n        this.scopes.last = SCOPE_OBJ_KEY\n        // Look for a comma before the next element.\n        if (scope == SCOPE_OBJ_FILLED) {\n          when (val c = skipWhitespace(data)) {\n            CHAR_CLOSE_OBJECT -> return TOK_END_OBJECT\n            CHAR_COMMA -> Unit\n            else -> makeError(data, \"Unfinished Object\", c)\n          }\n        }\n        return when (val c = skipWhitespace(data)) {\n          CHAR_DOUBLE_QUOTE -> TOK_BEGIN_QUOTE\n          CHAR_CLOSE_OBJECT ->\n            if (scope != SCOPE_OBJ_FILLED) {\n              TOK_END_OBJECT\n            } else {\n              makeError(data, \"Expected Key\", c)\n            }\n          else -> {\n            makeError(data, \"Expected Key/Value\", c)\n          }\n        }\n      }\n      SCOPE_OBJ_KEY -> {\n        this.scopes.last = SCOPE_OBJ_FILLED\n        when (val c = skipWhitespace(data)) {\n          CHAR_COLON -> Unit\n          else -> makeError(data, \"Expect ${CHAR_COLON.print()}\", c)\n        }\n      }\n      SCOPE_DOC_EMPTY -> this.scopes.last = SCOPE_DOC_FILLED\n      SCOPE_DOC_FILLED -> {\n        val c = skipWhitespace(data)\n        if (c != CHAR_EOF) makeError(data, \"Root object already finished\", c)\n        return TOK_EOF\n      }\n    }\n\n    val c = skipWhitespace(data)\n    when (c) {\n      CHAR_CLOSE_ARRAY -> if (scope == SCOPE_ARRAY_EMPTY) return TOK_END_ARRAY\n      CHAR_COLON -> makeError(data, \"Unexpected character\", c)\n      CHAR_DOUBLE_QUOTE -> return TOK_BEGIN_QUOTE\n      CHAR_OPEN_ARRAY -> return TOK_BEGIN_ARRAY\n      CHAR_OPEN_OBJECT -> return TOK_BEGIN_OBJECT\n      CHAR_t -> {\n        checkEOF(data, readPos + 2)\n        // 0x65757274 is equivalent to ['t', 'r', 'u', 'e' ] as a 4 byte Int\n        if (data.getInt(readPos - 1) != 0x65757274) {\n          makeError(data, \"Expecting keyword \\\"true\\\"\", c)\n        }\n        readPos += 3\n        return TOK_TRUE\n      }\n      CHAR_n -> {\n        checkEOF(data, readPos + 2)\n        // 0x6c6c756e  is equivalent to ['n', 'u', 'l', 'l' ] as a 4 byte Int\n        if (data.getInt(readPos - 1) != 0x6c6c756e) {\n          makeError(data, \"Expecting keyword \\\"null\\\"\", c)\n        }\n        readPos += 3\n        return TOK_NULL\n      }\n      CHAR_f -> {\n        checkEOF(data, readPos + 3)\n        // 0x65736c61 is equivalent to ['a', 'l', 's', 'e' ] as a 4 byte Int\n        if (data.getInt(readPos) != 0x65736c61) {\n          makeError(data, \"Expecting keyword \\\"false\\\"\", c)\n        }\n        readPos += 4\n        return TOK_FALSE\n      }\n      CHAR_0,\n      CHAR_1,\n      CHAR_2,\n      CHAR_3,\n      CHAR_4,\n      CHAR_5,\n      CHAR_6,\n      CHAR_7,\n      CHAR_8,\n      CHAR_9,\n      CHAR_MINUS ->\n        return TOK_NUMBER.also {\n          readPos-- // rewind one position so we don't lose first digit\n        }\n    }\n    makeError(data, \"Expecting element\", c)\n  }\n\n  // keeps increasing [readPos] until finds a non-whitespace byte\n  private inline fun skipWhitespace(data: ReadBuffer): Byte {\n    val limit = data.limit\n    if (data is ArrayReadBuffer) {\n      // enables range check elimination\n      val ary = data.data()\n      return skipWhitespace(limit) { ary[it] }\n    }\n    return skipWhitespace(limit) { data[it] }\n  }\n\n  private inline fun skipWhitespace(limit: Int, crossinline fetch: (Int) -> Byte): Byte {\n    var pos = readPos\n    while (pos < limit) {\n      val d = fetch(pos++)\n      if (!isWhitespace(d)) {\n        readPos = pos\n        return d\n      }\n    }\n    readPos = limit\n    return CHAR_EOF\n  }\n\n  // byte1 is expected to be first char before `\\`\n  private fun readEscapedChar(data: ReadBuffer, byte1: Byte, cursorPos: Int): Char {\n    return when (byte1) {\n      CHAR_u -> {\n        checkEOF(data, cursorPos + 1 + 4)\n        var result: Char = 0.toChar()\n        var i = cursorPos + 2 // cursorPos is on '\\\\', cursorPos + 1 is 'u'\n        val end = i + 4\n        while (i < end) {\n          val part: Byte = data[i]\n          result = (result.code shl 4).toChar()\n          result +=\n            when (part) {\n              in CHAR_0..CHAR_9 -> part - CHAR_0\n              in CHAR_a..CHAR_f -> part - CHAR_a + 10\n              in CHAR_A..CHAR_F -> part - CHAR_A + 10\n              else -> makeError(data, \"Invalid utf8 escaped character\", -1)\n            }\n          i++\n        }\n        result\n      }\n      CHAR_b -> '\\b'\n      CHAR_t -> '\\t'\n      CHAR_r -> '\\r'\n      CHAR_n -> '\\n'\n      CHAR_f -> 12.toChar() // '\\f'\n      CHAR_DOUBLE_QUOTE,\n      CHAR_BACKSLASH,\n      CHAR_FORWARDSLASH -> byte1.toInt().toChar()\n      else -> makeError(data, \"Invalid escape sequence.\", byte1)\n    }\n  }\n\n  private fun Byte.print(): String =\n    when (this) {\n      in 0x21..0x7E -> \"'${this.toInt().toChar()}'\" // visible ascii chars\n      CHAR_EOF -> \"EOF\"\n      else -> \"'0x${this.toString(16)}'\"\n    }\n\n  private inline fun makeError(data: ReadBuffer, msg: String, tok: Byte? = null): Nothing {\n    val (line, column) = calculateErrorPosition(data, readPos)\n    if (tok != null) {\n      error(\"Error At ($line, $column): $msg, got ${tok.print()}\")\n    } else {\n      error(\"Error At ($line, $column): $msg\")\n    }\n  }\n\n  private inline fun makeError(data: ReadBuffer, msg: String, tok: Token): Nothing {\n    val (line, column) = calculateErrorPosition(data, readPos)\n    error(\"Error At ($line, $column): $msg, got ${tok.print()}\")\n  }\n\n  private inline fun checkEOF(data: ReadBuffer, pos: Int) {\n    if (pos >= data.limit) makeError(data, \"Unexpected end of file\", -1)\n  }\n\n  private fun calculateErrorPosition(data: ReadBuffer, endPos: Int): Pair<Int, Int> {\n    var line = 1\n    var column = 1\n    var current = 0\n    while (current < endPos - 1) {\n      if (data[current++] == CHAR_NEWLINE) {\n        ++line\n        column = 1\n      } else {\n        ++column\n      }\n    }\n    return Pair(line, column)\n  }\n}\n\ninternal inline fun Int.toPaddedHex(): String = \"\\\\u${this.toString(16).padStart(4, '0')}\"\n\nprivate inline fun ReadWriteBuffer.jsonEscape(data: ReadBuffer, start: Int, size: Int) {\n  val replacements = JSON_ESCAPE_CHARS\n  put(CHAR_DOUBLE_QUOTE)\n  var last = start\n  val length: Int = size\n  val ary = data.data()\n  for (i in start until start + length) {\n    val c = ary[i].toUByte()\n    var replacement: ByteArray?\n    if (c.toInt() < 128) {\n      replacement = replacements[c.toInt()]\n      if (replacement == null) {\n        continue\n      }\n    } else {\n      continue\n    }\n    if (last < i) {\n      put(ary, last, i - last)\n    }\n    put(replacement, 0, replacement.size)\n    last = i + 1\n  }\n  if (last < (last + length)) {\n    put(ary, last, (start + length) - last)\n  }\n  put(CHAR_DOUBLE_QUOTE)\n}\n\n// Following escape strategy defined in RFC7159.\nprivate val JSON_ESCAPE_CHARS: Array<ByteArray?> =\n  arrayOfNulls<ByteArray>(128).apply {\n    this['\\n'.code] = \"\\\\n\".encodeToByteArray()\n    this['\\t'.code] = \"\\\\t\".encodeToByteArray()\n    this['\\r'.code] = \"\\\\r\".encodeToByteArray()\n    this['\\b'.code] = \"\\\\b\".encodeToByteArray()\n    this[0x0c] = \"\\\\f\".encodeToByteArray()\n    this['\"'.code] = \"\\\\\\\"\".encodeToByteArray()\n    this['\\\\'.code] = \"\\\\\\\\\".encodeToByteArray()\n    for (i in 0..0x1f) {\n      this[i] = \"\\\\u${i.toPaddedHex()}\".encodeToByteArray()\n    }\n  }\n\n// Scope is used to the define current space that the scanner is operating.\n@JvmInline private value class Scope(val id: Int)\n\nprivate val SCOPE_DOC_EMPTY = Scope(0)\nprivate val SCOPE_DOC_FILLED = Scope(1)\nprivate val SCOPE_OBJ_EMPTY = Scope(2)\nprivate val SCOPE_OBJ_KEY = Scope(3)\nprivate val SCOPE_OBJ_FILLED = Scope(4)\nprivate val SCOPE_ARRAY_EMPTY = Scope(5)\nprivate val SCOPE_ARRAY_FILLED = Scope(6)\n\n// Keeps the stack state of the scopes being scanned. Currently defined to have a\n// max stack size of 22, as per tests cases defined in http://json.org/JSON_checker/\nprivate class ScopeStack(\n  private val ary: IntArray = IntArray(22) { SCOPE_DOC_EMPTY.id },\n  var lastPos: Int = 0,\n) {\n  var last: Scope\n    get() = Scope(ary[lastPos])\n    set(x) {\n      ary[lastPos] = x.id\n    }\n\n  fun reset() {\n    lastPos = 0\n    ary[0] = SCOPE_DOC_EMPTY.id\n  }\n\n  fun pop(): Scope {\n    // println(\"Popping: ${last.print()}\")\n    return Scope(ary[lastPos--])\n  }\n\n  fun push(scope: Scope): Scope {\n    if (lastPos == ary.size - 1)\n      error(\"Too much nesting reached. Max nesting is ${ary.size} levels\")\n    // println(\"PUSHING : ${scope.print()}\")\n    ary[++lastPos] = scope.id\n    return scope\n  }\n}\n\n@JvmInline\nprivate value class Token(val id: Int) {\n  fun print(): String =\n    when (this) {\n      TOK_EOF -> \"TOK_EOF\"\n      TOK_NONE -> \"TOK_NONE\"\n      TOK_BEGIN_OBJECT -> \"TOK_BEGIN_OBJECT\"\n      TOK_END_OBJECT -> \"TOK_END_OBJECT\"\n      TOK_BEGIN_ARRAY -> \"TOK_BEGIN_ARRAY\"\n      TOK_END_ARRAY -> \"TOK_END_ARRAY\"\n      TOK_NUMBER -> \"TOK_NUMBER\"\n      TOK_TRUE -> \"TOK_TRUE\"\n      TOK_FALSE -> \"TOK_FALSE\"\n      TOK_NULL -> \"TOK_NULL\"\n      TOK_BEGIN_QUOTE -> \"TOK_BEGIN_QUOTE\"\n      else -> this.toString()\n    }\n}\n\nprivate val TOK_EOF = Token(-1)\nprivate val TOK_NONE = Token(0)\nprivate val TOK_BEGIN_OBJECT = Token(1)\nprivate val TOK_END_OBJECT = Token(2)\nprivate val TOK_BEGIN_ARRAY = Token(3)\nprivate val TOK_END_ARRAY = Token(4)\nprivate val TOK_NUMBER = Token(5)\nprivate val TOK_TRUE = Token(6)\nprivate val TOK_FALSE = Token(7)\nprivate val TOK_NULL = Token(8)\nprivate val TOK_BEGIN_QUOTE = Token(9)\n\nprivate const val CHAR_NEWLINE = '\\n'.code.toByte()\nprivate const val CHAR_OPEN_OBJECT = '{'.code.toByte()\nprivate const val CHAR_COLON = ':'.code.toByte()\nprivate const val CHAR_CLOSE_OBJECT = '}'.code.toByte()\nprivate const val CHAR_OPEN_ARRAY = '['.code.toByte()\nprivate const val CHAR_CLOSE_ARRAY = ']'.code.toByte()\nprivate const val CHAR_DOUBLE_QUOTE = '\"'.code.toByte()\nprivate const val CHAR_BACKSLASH = '\\\\'.code.toByte()\nprivate const val CHAR_FORWARDSLASH = '/'.code.toByte()\nprivate const val CHAR_f = 'f'.code.toByte()\nprivate const val CHAR_a = 'a'.code.toByte()\nprivate const val CHAR_r = 'r'.code.toByte()\nprivate const val CHAR_t = 't'.code.toByte()\nprivate const val CHAR_n = 'n'.code.toByte()\nprivate const val CHAR_b = 'b'.code.toByte()\nprivate const val CHAR_e = 'e'.code.toByte()\nprivate const val CHAR_E = 'E'.code.toByte()\nprivate const val CHAR_u = 'u'.code.toByte()\nprivate const val CHAR_A = 'A'.code.toByte()\nprivate const val CHAR_F = 'F'.code.toByte()\nprivate const val CHAR_EOF = (-1).toByte()\nprivate const val CHAR_COMMA = ','.code.toByte()\nprivate const val CHAR_0 = '0'.code.toByte()\nprivate const val CHAR_1 = '1'.code.toByte()\nprivate const val CHAR_2 = '2'.code.toByte()\nprivate const val CHAR_3 = '3'.code.toByte()\nprivate const val CHAR_4 = '4'.code.toByte()\nprivate const val CHAR_5 = '5'.code.toByte()\nprivate const val CHAR_6 = '6'.code.toByte()\nprivate const val CHAR_7 = '7'.code.toByte()\nprivate const val CHAR_8 = '8'.code.toByte()\nprivate const val CHAR_9 = '9'.code.toByte()\nprivate const val CHAR_MINUS = '-'.code.toByte()\nprivate const val CHAR_PLUS = '+'.code.toByte()\nprivate const val CHAR_DOT = '.'.code.toByte()\n\n// This template utilizes the One Definition Rule to create global arrays in a\n// header. As seen in:\n// https://github.com/chadaustin/sajson/blob/master/include/sajson.h\n// bit 0 (1) - set if: plain ASCII string character\n// bit 1 (2) - set if: whitespace\n// bit 4 (0x10) - set if: 0-9 e E .\nprivate val parseFlags =\n  byteArrayOf(\n    // 0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    2,\n    2,\n    0,\n    0,\n    2,\n    0,\n    0, // 0\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0, // 1\n    3,\n    1,\n    0,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    0x11,\n    1, // 2\n    0x11,\n    0x11,\n    0x11,\n    0x11,\n    0x11,\n    0x11,\n    0x11,\n    0x11,\n    0x11,\n    0x11,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1, // 3\n    1,\n    1,\n    1,\n    1,\n    1,\n    0x11,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1, // 4\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    0,\n    1,\n    1,\n    1, // 5\n    1,\n    1,\n    1,\n    1,\n    1,\n    0x11,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1, // 6\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1, // 7\n\n    // 128-255\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n  )\n"
  },
  {
    "path": "kotlin/flatbuffers-kotlin/src/commonTest/kotlin/com/google/flatbuffers/kotlin/Asserts.kt",
    "content": "package com.google.flatbuffers.kotlin\n\nimport kotlin.test.assertTrue\n\nfun <T> assertArrayEquals(expected: Array<out T>, actual: Array<out T>) =\n  assertTrue(expected contentEquals actual, arrayFailMessage(expected, actual))\n\nfun assertArrayEquals(expected: IntArray, actual: IntArray) =\n  assertTrue(expected contentEquals actual, arrayFailMessage(expected, actual))\n\nfun assertArrayEquals(expected: ShortArray, actual: ShortArray) =\n  assertTrue(expected contentEquals actual, arrayFailMessage(expected, actual))\n\nfun assertArrayEquals(expected: LongArray, actual: LongArray) =\n  assertTrue(expected contentEquals actual, arrayFailMessage(expected, actual))\n\nfun assertArrayEquals(expected: ByteArray, actual: ByteArray) =\n  assertTrue(expected contentEquals actual, arrayFailMessage(expected, actual))\n\nfun assertArrayEquals(expected: DoubleArray, actual: DoubleArray) =\n  assertTrue(expected contentEquals actual, arrayFailMessage(expected, actual))\n\nfun assertArrayEquals(expected: FloatArray, actual: FloatArray) =\n  assertTrue(expected contentEquals actual, arrayFailMessage(expected, actual))\n\nfun <T> arrayFailMessage(expected: Array<out T>, actual: Array<out T>): String =\n  failMessage(expected.contentToString(), actual.contentToString())\n\nfun arrayFailMessage(expected: IntArray, actual: IntArray): String =\n  failMessage(expected.contentToString(), actual.contentToString())\n\nfun arrayFailMessage(expected: ShortArray, actual: ShortArray): String =\n  failMessage(expected.contentToString(), actual.contentToString())\n\nfun arrayFailMessage(expected: LongArray, actual: LongArray): String =\n  failMessage(expected.contentToString(), actual.contentToString())\n\nfun failMessage(expected: String, actual: String): String = \"Expected: $expected\\nActual: $actual\"\n\nfun arrayFailMessage(expected: FloatArray, actual: FloatArray): String {\n  return \"Expected: ${expected.contentToString()}\\nActual: ${actual.contentToString()}\"\n}\n\nfun arrayFailMessage(expected: DoubleArray, actual: DoubleArray): String {\n  return \"Expected: ${expected.contentToString()}\\nActual: ${actual.contentToString()}\"\n}\n\nfun arrayFailMessage(expected: BooleanArray, actual: BooleanArray): String {\n  return \"Expected: ${expected.contentToString()}\\nActual: ${actual.contentToString()}\"\n}\n\nfun arrayFailMessage(expected: ByteArray, actual: ByteArray): String {\n  return \"Expected: ${expected.contentToString()}\\nActual: ${actual.contentToString()}\"\n}\n"
  },
  {
    "path": "kotlin/flatbuffers-kotlin/src/commonTest/kotlin/com/google/flatbuffers/kotlin/BuffersTest.kt",
    "content": "package com.google.flatbuffers.kotlin\n\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertFailsWith\n\nclass BuffersTest {\n\n  @Test\n  fun readBufferStringTest() {\n    val text = \"Hello world!\"\n    val bytes = text.encodeToByteArray()\n    val fullRead = ArrayReadBuffer(bytes)\n    val helloRead = ArrayReadBuffer(bytes, limit = 5)\n    val worldRead = fullRead.slice(6, 6)\n\n    assertEquals(bytes.size, fullRead.limit)\n    assertEquals(text, fullRead.getString(0, fullRead.limit))\n    assertEquals(\"Hello\", helloRead.getString(0, helloRead.limit))\n    assertEquals(\"world!\", worldRead.getString())\n    assertEquals(fullRead.getString(0, 5), helloRead.getString(0, helloRead.limit))\n    assertEquals(fullRead.getString(6, 6), worldRead.getString(0, worldRead.limit))\n\n    for (i in 0 until helloRead.limit) {\n      assertEquals(fullRead[i], helloRead[i])\n    }\n    for (i in 0 until worldRead.limit) {\n      assertEquals(fullRead[6 + i], worldRead[i])\n    }\n  }\n\n  @Test\n  fun readWriteBufferPrimitivesTest() {\n    val text = \"Hello world!\"\n    val bytes = text.encodeToByteArray()\n    val wt = ArrayReadWriteBuffer(bytes)\n    wt.requestCapacity(4096)\n    wt.put(\"Tests\")\n    val str1 = wt.writePosition\n    assertEquals(\"Tests world!\", wt.getString(0, bytes.size))\n    assertEquals(\"Tests\", wt.getString(0, str1))\n    wt.put(Int.MAX_VALUE)\n    assertEquals(Int.MAX_VALUE, wt.getInt(str1))\n\n    val pos = wt.writePosition\n    wt.put(Double.NEGATIVE_INFINITY)\n    assertEquals(Double.NEGATIVE_INFINITY, wt.getDouble(pos))\n\n    val jap = \" are really すごい!\".encodeToByteArray()\n    wt.writePosition = str1\n    wt.put(jap)\n    assertEquals(\"Tests are really すごい!\", wt.getString())\n  }\n\n  @Test\n  fun readWriteBufferGrowthTest() {\n    val a = ArrayReadWriteBuffer(1)\n    assertEquals(1, a.capacity)\n    a.put(0.toByte())\n    assertEquals(1, a.capacity)\n    assertFailsWith(IndexOutOfBoundsException::class) { a.put(0xFF.toShort()) }\n    a.requestCapacity(8)\n    a.writePosition = 0\n    a.put(0xFF.toShort())\n    assertEquals(8, a.capacity)\n    assertEquals(0xFF, a.getShort(0))\n\n    a.requestCapacity(8 + 12)\n    a.put(ByteArray(12) { it.toByte() })\n\n    // we grow as power or two, so 20 jumps to 32\n    assertEquals(32, a.capacity)\n    a.requestCapacity(513, false)\n    assertEquals(1024, a.capacity)\n    a.requestCapacity(234, false)\n    assertEquals(1024, a.capacity)\n  }\n}\n"
  },
  {
    "path": "kotlin/flatbuffers-kotlin/src/commonTest/kotlin/com/google/flatbuffers/kotlin/ByteArrayTest.kt",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.google.flatbuffers.kotlin\n\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\nclass ByteArrayTest {\n\n  @Test\n  fun testByte() {\n    val testSet =\n      arrayOf(\n        67.toByte() to byteArrayOf(67),\n        Byte.MIN_VALUE to byteArrayOf(-128),\n        Byte.MAX_VALUE to byteArrayOf(127),\n        0.toByte() to byteArrayOf(0),\n      )\n    val data = ByteArray(1)\n    testSet.forEach {\n      data[0] = it.first\n      assertArrayEquals(data, it.second)\n      assertEquals(it.first, data[0])\n    }\n  }\n\n  @Test\n  fun testShort() {\n    val testSet =\n      arrayOf(\n        6712.toShort() to byteArrayOf(56, 26),\n        Short.MIN_VALUE to byteArrayOf(0, -128),\n        Short.MAX_VALUE to byteArrayOf(-1, 127),\n        0.toShort() to byteArrayOf(0, 0),\n      )\n\n    val data = ByteArray(Short.SIZE_BYTES)\n    testSet.forEach {\n      data.setShort(0, it.first)\n      assertArrayEquals(data, it.second)\n      assertEquals(it.first, data.getShort(0))\n    }\n  }\n\n  @Test\n  fun testInt() {\n    val testSet =\n      arrayOf(\n        33333500 to byteArrayOf(-4, -96, -4, 1),\n        Int.MIN_VALUE to byteArrayOf(0, 0, 0, -128),\n        Int.MAX_VALUE to byteArrayOf(-1, -1, -1, 127),\n        0 to byteArrayOf(0, 0, 0, 0),\n      )\n    val data = ByteArray(Int.SIZE_BYTES)\n    testSet.forEach {\n      data.setInt(0, it.first)\n      assertArrayEquals(data, it.second)\n      assertEquals(it.first, data.getInt(0))\n    }\n  }\n\n  @Test\n  fun testLong() {\n    val testSet =\n      arrayOf(\n        1234567123122890123L to byteArrayOf(-117, -91, 29, -23, 65, 16, 34, 17),\n        -1L to byteArrayOf(-1, -1, -1, -1, -1, -1, -1, -1),\n        Long.MIN_VALUE to byteArrayOf(0, 0, 0, 0, 0, 0, 0, -128),\n        Long.MAX_VALUE to byteArrayOf(-1, -1, -1, -1, -1, -1, -1, 127),\n        0L to byteArrayOf(0, 0, 0, 0, 0, 0, 0, 0),\n      )\n    val data = ByteArray(Long.SIZE_BYTES)\n    testSet.forEach {\n      data.setLong(0, it.first)\n      assertArrayEquals(data, it.second)\n      assertEquals(it.first, data.getLong(0))\n    }\n  }\n\n  @Test\n  fun testULong() {\n    val testSet =\n      arrayOf(\n        1234567123122890123UL to byteArrayOf(-117, -91, 29, -23, 65, 16, 34, 17),\n        ULong.MIN_VALUE to byteArrayOf(0, 0, 0, 0, 0, 0, 0, 0),\n        (-1L).toULong() to byteArrayOf(-1, -1, -1, -1, -1, -1, -1, -1),\n        0UL to byteArrayOf(0, 0, 0, 0, 0, 0, 0, 0),\n      )\n    val data = ByteArray(ULong.SIZE_BYTES)\n    testSet.forEach {\n      data.setULong(0, it.first)\n      assertArrayEquals(it.second, data)\n      assertEquals(it.first, data.getULong(0))\n    }\n  }\n\n  @Test\n  fun testFloat() {\n    val testSet =\n      arrayOf(\n        3545.56337f to byteArrayOf(4, -103, 93, 69),\n        Float.MIN_VALUE to byteArrayOf(1, 0, 0, 0),\n        Float.MAX_VALUE to byteArrayOf(-1, -1, 127, 127),\n        0f to byteArrayOf(0, 0, 0, 0),\n      )\n    val data = ByteArray(Float.SIZE_BYTES)\n    testSet.forEach {\n      data.setFloat(0, it.first)\n      assertArrayEquals(data, it.second)\n    }\n  }\n\n  @Test\n  fun testDouble() {\n    val testSet =\n      arrayOf(\n        123456.523423423412 to byteArrayOf(88, 61, -15, 95, 8, 36, -2, 64),\n        Double.MIN_VALUE to byteArrayOf(1, 0, 0, 0, 0, 0, 0, 0),\n        Double.MAX_VALUE to byteArrayOf(-1, -1, -1, -1, -1, -1, -17, 127),\n        0.0 to byteArrayOf(0, 0, 0, 0, 0, 0, 0, 0),\n      )\n    val data = ByteArray(Long.SIZE_BYTES)\n    testSet.forEach {\n      data.setDouble(0, it.first)\n      assertArrayEquals(data, it.second)\n      assertEquals(it.first, data.getDouble(0))\n    }\n  }\n\n  @Test\n  fun testString() {\n    val testSet = \"∮ E⋅da = Q\"\n    val encoded = testSet.encodeToByteArray()\n    val data = ByteArray(encoded.size)\n    data.setCharSequence(0, testSet)\n    assertArrayEquals(encoded, data)\n    assertEquals(testSet, data.getString(0, encoded.size))\n  }\n}\n"
  },
  {
    "path": "kotlin/flatbuffers-kotlin/src/commonTest/kotlin/com/google/flatbuffers/kotlin/FlatBufferBuilderTest.kt",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n@file:Suppress(\"UNCHECKED_CAST\")\n\npackage com.google.flatbuffers.kotlin\n\nimport Attacker\nimport CharacterEArray\nimport Movie\nimport dictionaryLookup.LongFloatEntry\nimport dictionaryLookup.LongFloatEntryOffsetArray\nimport dictionaryLookup.LongFloatMap\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport myGame.example.*\nimport myGame.example.Test.Companion.createTest\nimport optionalScalars.OptionalByte\nimport optionalScalars.ScalarStuff\n\n@ExperimentalUnsignedTypes\nclass FlatBufferBuilderTest {\n\n  @Test\n  fun testSingleTable() {\n    val fbb = FlatBufferBuilder()\n    val name = fbb.createString(\"Frodo\")\n    val invValues = ubyteArrayOf(10u, 11u, 12u, 13u, 14u)\n    val inv = Monster.createInventoryVector(fbb, invValues)\n    Monster.startMonster(fbb)\n    Monster.addPos(\n      fbb,\n      Vec3.createVec3(fbb, 1.0f, 2.0f, 3.0f, 3.0, Color.Green, 5.toShort(), 6.toByte()),\n    )\n    Monster.addHp(fbb, 80.toShort())\n    Monster.addName(fbb, name)\n    Monster.addMana(fbb, 150)\n    Monster.addInventory(fbb, inv)\n    Monster.addTestType(fbb, AnyE.Monster)\n    Monster.addTestbool(fbb, true)\n    Monster.addTesthashu32Fnv1(fbb, (Int.MAX_VALUE + 1L).toUInt())\n    val root = Monster.endMonster(fbb)\n    fbb.finish(root)\n\n    val monster = Monster.asRoot(fbb.dataBuffer())\n    assertEquals(monster.name, \"Frodo\")\n    assertEquals(monster.mana, 150.toShort())\n    assertEquals(monster.hp, 80)\n\n    val pos = monster.pos!!\n    assertEquals(monster.inventory(0), invValues[0])\n    assertEquals(monster.inventory(1), invValues[1])\n    assertEquals(monster.inventory(2), invValues[2])\n    assertEquals(monster.inventory(3), invValues[3])\n    assertEquals(pos.x, 1.0f)\n    assertEquals(pos.y, 2.0f)\n    assertEquals(pos.z, 3.0f)\n    assertEquals(pos.test1, 3.0)\n    assertEquals(pos.test2, Color.Green)\n    assertEquals(pos.test3!!.a, 5.toShort())\n    assertEquals(pos.test3!!.b, 6.toByte())\n\n    val inventoryBuffer = monster.inventoryAsBuffer()\n    assertEquals(invValues.size, inventoryBuffer.limit)\n    for (i in invValues.indices) {\n      assertEquals(invValues[i], inventoryBuffer.getUByte(i))\n    }\n  }\n\n  @Test\n  fun testSortedVector() {\n    val fbb = FlatBufferBuilder()\n    val names =\n      arrayOf(fbb.createString(\"Frodo\"), fbb.createString(\"Barney\"), fbb.createString(\"Wilma\"))\n    val monsters =\n      MonsterOffsetArray(3) {\n        Monster.startMonster(fbb)\n        Monster.addName(fbb, names[it])\n        Monster.endMonster(fbb)\n      }\n    val ary = Monster.createTestarrayoftablesVector(fbb, monsters)\n    Monster.startMonster(fbb)\n    Monster.addName(fbb, names[0])\n    Monster.addTestarrayoftables(fbb, ary)\n    val root = Monster.endMonster(fbb)\n    fbb.finish(root)\n    val a = Monster.asRoot(fbb.dataBuffer())\n    assertEquals(a.name, \"Frodo\")\n    assertEquals(a.testarrayoftablesLength, 3)\n    val monster0 = a.testarrayoftables(0)!!\n    val monster1 = a.testarrayoftables(1)!!\n    val monster2 = a.testarrayoftables(2)!!\n    assertEquals(monster0.name, \"Frodo\")\n    assertEquals(monster1.name, \"Barney\")\n    assertEquals(monster2.name, \"Wilma\")\n\n    // test AsBuffer feature\n\n  }\n\n  @Test\n  fun testCreateBufferVector() {\n    val fbb = FlatBufferBuilder(16)\n    val str = fbb.createString(\"MyMonster\")\n    val inventory = ubyteArrayOf(0u, 1u, 2u, 3u, 4u, 5u, 6u, 88u, 99u, 122u, 1u)\n    val vec = Monster.createInventoryVector(fbb, inventory)\n    Monster.startMonster(fbb)\n    Monster.addInventory(fbb, vec)\n    Monster.addName(fbb, str)\n    val monster1 = Monster.endMonster(fbb)\n    Monster.finishMonsterBuffer(fbb, monster1)\n    val monsterObject: Monster = Monster.asRoot(fbb.dataBuffer())\n    val iBuffer = monsterObject.inventoryAsBuffer()\n\n    assertEquals(monsterObject.inventoryLength, inventory.size)\n    assertEquals(iBuffer.limit, inventory.size)\n\n    for (i in inventory.indices) {\n      assertEquals(inventory[i], monsterObject.inventory(i))\n      assertEquals(inventory[i], iBuffer.getUByte(i))\n    }\n  }\n\n  @Test\n  fun testCreateUninitializedVector() {\n    val fbb = FlatBufferBuilder(16)\n    val str = fbb.createString(\"MyMonster\")\n    val inventory = byteArrayOf(10, 11, 12, 13, 14)\n    val uninitializedBuffer = fbb.createUnintializedVector(1, inventory.size, 1)\n    for (i in inventory) {\n      uninitializedBuffer.put(i)\n    }\n    val vec = fbb.endVector<UByte>()\n    Monster.startMonster(fbb)\n    Monster.addInventory(fbb, vec)\n    Monster.addName(fbb, str)\n    val monster1 = Monster.endMonster(fbb)\n    Monster.finishMonsterBuffer(fbb, monster1)\n    val monsterObject: Monster = Monster.asRoot(fbb.dataBuffer())\n    assertEquals(inventory[1].toUByte(), monsterObject.inventory(1))\n    assertEquals(inventory.size, monsterObject.inventoryLength)\n    val inventoryBuffer = monsterObject.inventoryAsBuffer()\n    assertEquals(inventory[1].toInt().toUByte(), inventoryBuffer.getUByte(1))\n    assertEquals(inventory.size, inventoryBuffer.limit)\n  }\n\n  @Test\n  fun testBuilderBasics() {\n    val fbb = FlatBufferBuilder()\n    val names =\n      arrayOf(fbb.createString(\"Frodo\"), fbb.createString(\"Barney\"), fbb.createString(\"Wilma\"))\n    val off = Array<Offset<Monster>>(3) { Offset(0) }\n    Monster.startMonster(fbb)\n    Monster.addName(fbb, names[0])\n    off[0] = Monster.endMonster(fbb)\n    Monster.startMonster(fbb)\n    Monster.addName(fbb, names[1])\n    off[1] = Monster.endMonster(fbb)\n    Monster.startMonster(fbb)\n    Monster.addName(fbb, names[2])\n    off[2] = Monster.endMonster(fbb)\n    val sortMons = fbb.createSortedVectorOfTables(Monster(), off)\n\n    // We set up the same values as monsterdata.json:\n\n    val inv = Monster.createInventoryVector(fbb, byteArrayOf(0, 1, 2, 3, 4).toUByteArray())\n\n    val fred = fbb.createString(\"Fred\")\n    Monster.startMonster(fbb)\n    Monster.addName(fbb, fred)\n    val mon2 = Monster.endMonster(fbb)\n\n    Monster.startTest4Vector(fbb, 2)\n    createTest(fbb, 10.toShort(), 20.toByte())\n    createTest(fbb, 30.toShort(), 40.toByte())\n    val test4 = fbb.endVector<myGame.example.Test>()\n\n    val strings = StringOffsetArray(2) { fbb.createString(\"test$it\") }\n    val testArrayOfString = Monster.createTestarrayofstringVector(fbb, strings)\n\n    Monster.startMonster(fbb)\n    Monster.addName(fbb, names[0])\n    Monster.addPos(\n      fbb,\n      Vec3.createVec3(fbb, 1.0f, 2.0f, 3.0f, 3.0, Color.Green, 5.toShort(), 6.toByte()),\n    )\n    Monster.addHp(fbb, 80)\n    Monster.addMana(fbb, 150)\n    Monster.addInventory(fbb, inv)\n    Monster.addTestType(fbb, AnyE.Monster)\n    Monster.addTest(fbb, mon2.toUnion())\n    Monster.addTest4(fbb, test4)\n    Monster.addTestarrayofstring(fbb, testArrayOfString)\n    Monster.addTestbool(fbb, true)\n    Monster.addTesthashu32Fnv1(fbb, (Int.MAX_VALUE + 1L).toUInt())\n    Monster.addTestarrayoftables(fbb, sortMons)\n    val mon = Monster.endMonster(fbb)\n    Monster.finishMonsterBuffer(fbb, mon)\n    // Attempt to mutate Monster fields and check whether the buffer has been mutated properly\n    // revert to original values after testing\n    val monster = Monster.asRoot(fbb.dataBuffer())\n\n    // mana is optional and does not exist in the buffer so the mutation should fail\n    // the mana field should retain its default value\n    assertEquals(monster.mana, 150.toShort())\n    assertEquals(monster.hp, 80)\n\n    // Accessing a vector of sorted by the key tables\n    assertEquals(monster.testarrayoftables(0)!!.name, \"Barney\")\n    assertEquals(monster.testarrayoftables(1)!!.name, \"Frodo\")\n    assertEquals(monster.testarrayoftables(2)!!.name, \"Wilma\")\n\n    // Example of searching for a table by the key\n    assertEquals(monster.testarrayoftablesByKey(\"Frodo\")!!.name, \"Frodo\")\n    assertEquals(monster.testarrayoftablesByKey(\"Barney\")!!.name, \"Barney\")\n    assertEquals(monster.testarrayoftablesByKey(\"Wilma\")!!.name, \"Wilma\")\n\n    for (i in 0 until monster.inventoryLength) {\n      assertEquals(monster.inventory(i), (i).toUByte())\n    }\n\n    // get a struct field and edit one of its fields\n    val pos2 = monster.pos!!\n    assertEquals(pos2.x, 1.0f)\n    assertEquals(pos2.test2, Color.Green)\n  }\n\n  @Test\n  fun testVectorOfUnions() {\n    val fbb = FlatBufferBuilder()\n    val swordAttackDamage = 1\n    val attacker = Attacker.createAttacker(fbb, swordAttackDamage).toUnion()\n    val attackers = UnionOffsetArray(1) { attacker }\n    val characters = CharacterEArray(1)\n    characters[0] = CharacterE.MuLan.value\n\n    Movie.finishMovieBuffer(\n      fbb,\n      Movie.createMovie(\n        fbb,\n        CharacterE.MuLan,\n        attacker,\n        Movie.createCharactersTypeVector(fbb, characters),\n        Movie.createCharactersVector(fbb, attackers),\n      ),\n    )\n\n    val movie: Movie = Movie.asRoot(fbb.dataBuffer())\n\n    assertEquals(movie.charactersTypeLength, 1)\n    assertEquals(movie.charactersLength, 1)\n\n    assertEquals(movie.charactersType(0), CharacterE.MuLan)\n    assertEquals((movie.characters(Attacker(), 0) as Attacker).swordAttackDamage, swordAttackDamage)\n  }\n\n  @Test\n  fun TestVectorOfBytes() {\n    val fbb = FlatBufferBuilder(16)\n    var str = fbb.createString(\"ByteMonster\")\n    val data = ubyteArrayOf(0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u)\n    var offset = Monster.createInventoryVector(fbb, data)\n    Monster.startMonster(fbb)\n    Monster.addName(fbb, str)\n    Monster.addInventory(fbb, offset)\n    var monster1 = Monster.endMonster(fbb)\n    Monster.finishMonsterBuffer(fbb, monster1)\n\n    val monsterObject = Monster.asRoot(fbb.dataBuffer())\n    assertEquals(\"ByteMonster\", monsterObject.name)\n    assertEquals(data.size, monsterObject.inventoryLength)\n    assertEquals(monsterObject.inventory(4), data[4])\n    offset = fbb.createByteVector(data.toByteArray()) as VectorOffset<UByte> // TODO: fix me\n    str = fbb.createString(\"ByteMonster\")\n    Monster.startMonster(fbb)\n    Monster.addName(fbb, str)\n    Monster.addInventory(fbb, offset)\n    monster1 = Monster.endMonster(fbb)\n    Monster.finishMonsterBuffer(fbb, monster1)\n\n    val monsterObject2 = Monster.asRoot(fbb.dataBuffer())\n    assertEquals(monsterObject2.inventoryLength, data.size)\n    for (i in data.indices) {\n      assertEquals(monsterObject2.inventory(i), data[i])\n    }\n    fbb.clear()\n    offset = fbb.createByteVector(data.toByteArray(), 3, 4) as VectorOffset<UByte>\n    str = fbb.createString(\"ByteMonster\")\n    Monster.startMonster(fbb)\n    Monster.addName(fbb, str)\n    Monster.addInventory(fbb, offset)\n    monster1 = Monster.endMonster(fbb)\n    Monster.finishMonsterBuffer(fbb, monster1)\n\n    val monsterObject3 = Monster.asRoot(fbb.dataBuffer())\n    assertEquals(monsterObject3.inventoryLength, 4)\n    assertEquals(monsterObject3.inventory(0), data[3])\n    fbb.clear()\n    offset = Monster.createInventoryVector(fbb, data)\n    str = fbb.createString(\"ByteMonster\")\n    Monster.startMonster(fbb)\n    Monster.addName(fbb, str)\n    Monster.addInventory(fbb, offset)\n    monster1 = Monster.endMonster(fbb)\n    Monster.finishMonsterBuffer(fbb, monster1)\n\n    val monsterObject4 = Monster.asRoot(fbb.dataBuffer())\n    assertEquals(monsterObject4.inventoryLength, data.size)\n    assertEquals(monsterObject4.inventory(8), 8u)\n    fbb.clear()\n\n    val largeData = ByteArray(1024)\n    offset = fbb.createByteVector(largeData) as VectorOffset<UByte> // TODO: fix me\n    str = fbb.createString(\"ByteMonster\")\n    Monster.startMonster(fbb)\n    Monster.addName(fbb, str)\n    Monster.addInventory(fbb, offset)\n    monster1 = Monster.endMonster(fbb)\n    Monster.finishMonsterBuffer(fbb, monster1)\n\n    val monsterObject5 = Monster.asRoot(fbb.dataBuffer())\n    assertEquals(monsterObject5.inventoryLength, largeData.size)\n    assertEquals(monsterObject5.inventory(25), largeData[25].toUByte())\n    fbb.clear()\n\n    var bb = ArrayReadBuffer(largeData, 512)\n    offset = fbb.createByteVector(bb) as VectorOffset<UByte> // TODO: fix me\n    str = fbb.createString(\"ByteMonster\")\n    Monster.startMonster(fbb)\n    Monster.addName(fbb, str)\n    Monster.addInventory(fbb, offset)\n    monster1 = Monster.endMonster(fbb)\n    Monster.finishMonsterBuffer(fbb, monster1)\n    val monsterObject6 = Monster.asRoot(fbb.dataBuffer())\n    assertEquals(monsterObject6.inventoryLength, 512)\n    assertEquals(monsterObject6.inventory(0), largeData[0].toUByte())\n    fbb.clear()\n\n    bb = ArrayReadBuffer(largeData, largeData.size - 216)\n    val stringBuffer = ArrayReadBuffer(\"AlreadyBufferedString\".encodeToByteArray())\n    offset = fbb.createByteVector(bb) as VectorOffset<UByte> // TODO: fix me\n    str = fbb.createString(stringBuffer)\n    Monster.startMonster(fbb)\n    Monster.addName(fbb, str)\n    Monster.addInventory(fbb, offset)\n    monster1 = Monster.endMonster(fbb)\n    Monster.finishMonsterBuffer(fbb, monster1)\n\n    val monsterObject7 = Monster.asRoot(fbb.dataBuffer())\n    assertEquals(monsterObject7.inventoryLength, 216)\n    assertEquals(\"AlreadyBufferedString\", monsterObject7.name)\n  }\n\n  @Test\n  fun testEnums() {\n    assertEquals(Color.name(Color.Red), \"Red\")\n    assertEquals(Color.name(Color.Blue), \"Blue\")\n    assertEquals(AnyE.name(AnyE.None), \"NONE\")\n    assertEquals(AnyE.name(AnyE.Monster), \"Monster\")\n  }\n\n  @Test\n  fun testSharedStringPool() {\n    val fb = FlatBufferBuilder(1)\n    val testString = \"My string\"\n    val offset = fb.createSharedString(testString)\n    for (i in 0..9) {\n      assertEquals(offset, fb.createSharedString(testString))\n    }\n  }\n\n  @Test\n  fun testScalarOptional() {\n    val fbb = FlatBufferBuilder(1)\n    ScalarStuff.startScalarStuff(fbb)\n    var pos = ScalarStuff.endScalarStuff(fbb)\n    fbb.finish(pos)\n    var scalarStuff: ScalarStuff = ScalarStuff.asRoot(fbb.dataBuffer())\n    assertEquals(scalarStuff.justI8, 0.toByte())\n    assertEquals(scalarStuff.maybeI8, null)\n    assertEquals(scalarStuff.defaultI8, 42.toByte())\n    assertEquals(scalarStuff.justU8, 0u)\n    assertEquals(scalarStuff.maybeU8, null)\n    assertEquals(scalarStuff.defaultU8, 42u)\n    assertEquals(scalarStuff.justI16, 0.toShort())\n    assertEquals(scalarStuff.maybeI16, null)\n    assertEquals(scalarStuff.defaultI16, 42.toShort())\n    assertEquals(scalarStuff.justU16, 0u)\n    assertEquals(scalarStuff.maybeU16, null)\n    assertEquals(scalarStuff.defaultU16, 42u)\n    assertEquals(scalarStuff.justI32, 0)\n    assertEquals(scalarStuff.maybeI32, null)\n    assertEquals(scalarStuff.defaultI32, 42)\n    assertEquals(scalarStuff.justU32, 0u)\n    assertEquals(scalarStuff.maybeU32, null)\n    assertEquals(scalarStuff.defaultU32, 42u)\n    assertEquals(scalarStuff.justI64, 0L)\n    assertEquals(scalarStuff.maybeI64, null)\n    assertEquals(scalarStuff.defaultI64, 42L)\n    assertEquals(scalarStuff.justU64, 0UL)\n    assertEquals(scalarStuff.maybeU64, null)\n    assertEquals(scalarStuff.defaultU64, 42UL)\n    assertEquals(scalarStuff.justF32, 0.0f)\n    assertEquals(scalarStuff.maybeF32, null)\n    assertEquals(scalarStuff.defaultF32, 42.0f)\n    assertEquals(scalarStuff.justF64, 0.0)\n    assertEquals(scalarStuff.maybeF64, null)\n    assertEquals(scalarStuff.defaultF64, 42.0)\n    assertEquals(scalarStuff.justBool, false)\n    assertEquals(scalarStuff.maybeBool, null)\n    assertEquals(scalarStuff.defaultBool, true)\n    assertEquals(scalarStuff.justEnum, OptionalByte.None)\n    assertEquals(scalarStuff.maybeEnum, null)\n    assertEquals(scalarStuff.defaultEnum, OptionalByte.One)\n    fbb.clear()\n    ScalarStuff.startScalarStuff(fbb)\n    ScalarStuff.addJustI8(fbb, 5.toByte())\n    ScalarStuff.addMaybeI8(fbb, 5.toByte())\n    ScalarStuff.addDefaultI8(fbb, 5.toByte())\n    ScalarStuff.addJustU8(fbb, 6u)\n    ScalarStuff.addMaybeU8(fbb, 6u)\n    ScalarStuff.addDefaultU8(fbb, 6u)\n    ScalarStuff.addJustI16(fbb, 7.toShort())\n    ScalarStuff.addMaybeI16(fbb, 7.toShort())\n    ScalarStuff.addDefaultI16(fbb, 7.toShort())\n    ScalarStuff.addJustU16(fbb, 8u)\n    ScalarStuff.addMaybeU16(fbb, 8u)\n    ScalarStuff.addDefaultU16(fbb, 8u)\n    ScalarStuff.addJustI32(fbb, 9)\n    ScalarStuff.addMaybeI32(fbb, 9)\n    ScalarStuff.addDefaultI32(fbb, 9)\n    ScalarStuff.addJustU32(fbb, 10u)\n    ScalarStuff.addMaybeU32(fbb, 10u)\n    ScalarStuff.addDefaultU32(fbb, 10u)\n    ScalarStuff.addJustI64(fbb, 11L)\n    ScalarStuff.addMaybeI64(fbb, 11L)\n    ScalarStuff.addDefaultI64(fbb, 11L)\n    ScalarStuff.addJustU64(fbb, 12UL)\n    ScalarStuff.addMaybeU64(fbb, 12UL)\n    ScalarStuff.addDefaultU64(fbb, 12UL)\n    ScalarStuff.addJustF32(fbb, 13.0f)\n    ScalarStuff.addMaybeF32(fbb, 13.0f)\n    ScalarStuff.addDefaultF32(fbb, 13.0f)\n    ScalarStuff.addJustF64(fbb, 14.0)\n    ScalarStuff.addMaybeF64(fbb, 14.0)\n    ScalarStuff.addDefaultF64(fbb, 14.0)\n    ScalarStuff.addJustBool(fbb, true)\n    ScalarStuff.addMaybeBool(fbb, true)\n    ScalarStuff.addDefaultBool(fbb, true)\n    ScalarStuff.addJustEnum(fbb, OptionalByte.Two)\n    ScalarStuff.addMaybeEnum(fbb, OptionalByte.Two)\n    ScalarStuff.addDefaultEnum(fbb, OptionalByte.Two)\n    pos = ScalarStuff.endScalarStuff(fbb)\n    fbb.finish(pos)\n    scalarStuff = ScalarStuff.asRoot(fbb.dataBuffer())\n    assertEquals(scalarStuff.justI8, 5.toByte())\n    assertEquals(scalarStuff.maybeI8, 5.toByte())\n    assertEquals(scalarStuff.defaultI8, 5.toByte())\n    assertEquals(scalarStuff.justU8, 6u)\n    assertEquals(scalarStuff.maybeU8, 6u)\n    assertEquals(scalarStuff.defaultU8, 6u)\n    assertEquals(scalarStuff.justI16, 7.toShort())\n    assertEquals(scalarStuff.maybeI16, 7.toShort())\n    assertEquals(scalarStuff.defaultI16, 7.toShort())\n    assertEquals(scalarStuff.justU16, 8u)\n    assertEquals(scalarStuff.maybeU16, 8u)\n    assertEquals(scalarStuff.defaultU16, 8u)\n    assertEquals(scalarStuff.justI32, 9)\n    assertEquals(scalarStuff.maybeI32, 9)\n    assertEquals(scalarStuff.defaultI32, 9)\n    assertEquals(scalarStuff.justU32, 10u)\n    assertEquals(scalarStuff.maybeU32, 10u)\n    assertEquals(scalarStuff.defaultU32, 10u)\n    assertEquals(scalarStuff.justI64, 11L)\n    assertEquals(scalarStuff.maybeI64, 11L)\n    assertEquals(scalarStuff.defaultI64, 11L)\n    assertEquals(scalarStuff.justU64, 12UL)\n    assertEquals(scalarStuff.maybeU64, 12UL)\n    assertEquals(scalarStuff.defaultU64, 12UL)\n    assertEquals(scalarStuff.justF32, 13.0f)\n    assertEquals(scalarStuff.maybeF32, 13.0f)\n    assertEquals(scalarStuff.defaultF32, 13.0f)\n    assertEquals(scalarStuff.justF64, 14.0)\n    assertEquals(scalarStuff.maybeF64, 14.0)\n    assertEquals(scalarStuff.defaultF64, 14.0)\n    assertEquals(scalarStuff.justBool, true)\n    assertEquals(scalarStuff.maybeBool, true)\n    assertEquals(scalarStuff.defaultBool, true)\n    assertEquals(scalarStuff.justEnum, OptionalByte.Two)\n    assertEquals(scalarStuff.maybeEnum, OptionalByte.Two)\n    assertEquals(scalarStuff.defaultEnum, OptionalByte.Two)\n  }\n\n  // @todo Seems like nesting code generation is broken for all generators.\n  // disabling test for now.\n  //  @Test\n  //  fun testNamespaceNesting() {\n  //    // reference / manipulate these to verify compilation\n  //    val fbb = FlatBufferBuilder(1)\n  //    TableInNestedNS.startTableInNestedNS(fbb)\n  //    TableInNestedNS.addFoo(fbb, 1234)\n  //    val nestedTableOff = TableInNestedNS.endTableInNestedNs(fbb)\n  //    TableInFirstNS.startTableInFirstNS(fbb)\n  //    TableInFirstNS.addFooTable(fbb, nestedTableOff)\n  //    TableInFirstNS.endTableInFirstNs(fbb)\n  //  }\n\n  @Test\n  fun testNestedFlatBuffer() {\n    val nestedMonsterName = \"NestedMonsterName\"\n    val nestedMonsterHp: Short = 600\n    val nestedMonsterMana: Short = 1024\n    val fbb1 = FlatBufferBuilder(16)\n    val str1 = fbb1.createString(nestedMonsterName)\n    Monster.startMonster(fbb1)\n    Monster.addName(fbb1, str1)\n    Monster.addHp(fbb1, nestedMonsterHp)\n    Monster.addMana(fbb1, nestedMonsterMana)\n    val monster1 = Monster.endMonster(fbb1)\n    Monster.finishMonsterBuffer(fbb1, monster1)\n    val fbb1Bytes: ByteArray = fbb1.sizedByteArray()\n    val fbb2 = FlatBufferBuilder(16)\n    val str2 = fbb2.createString(\"My Monster\")\n    val nestedBuffer = Monster.createTestnestedflatbufferVector(fbb2, fbb1Bytes.toUByteArray())\n    Monster.startMonster(fbb2)\n    Monster.addName(fbb2, str2)\n    Monster.addHp(fbb2, 50.toShort())\n    Monster.addMana(fbb2, 32.toShort())\n    Monster.addTestnestedflatbuffer(fbb2, nestedBuffer)\n    val monster = Monster.endMonster(fbb2)\n    Monster.finishMonsterBuffer(fbb2, monster)\n\n    // Now test the data extracted from the nested buffer\n    val mons = Monster.asRoot(fbb2.dataBuffer())\n    val nestedMonster = mons.testnestedflatbufferAsMonster\n    assertEquals(nestedMonsterMana, nestedMonster!!.mana)\n    assertEquals(nestedMonsterHp, nestedMonster.hp)\n    assertEquals(nestedMonsterName, nestedMonster.name)\n  }\n\n  @Test\n  fun testDictionaryLookup() {\n    val fbb = FlatBufferBuilder(16)\n    val lfIndex = LongFloatEntry.createLongFloatEntry(fbb, 0, 99.0f)\n    val vectorEntriesIdx =\n      LongFloatMap.createEntriesVector(fbb, LongFloatEntryOffsetArray(1) { lfIndex })\n    val rootIdx = LongFloatMap.createLongFloatMap(fbb, vectorEntriesIdx)\n    LongFloatMap.finishLongFloatMapBuffer(fbb, rootIdx)\n    val map: LongFloatMap = LongFloatMap.asRoot(fbb.dataBuffer())\n\n    assertEquals(1, map.entriesLength)\n\n    val e: LongFloatEntry = map.entries(0)!!\n    assertEquals(0L, e.key)\n    assertEquals(99.0f, e.value)\n    val e2: LongFloatEntry = map.entriesByKey(0)!!\n    assertEquals(0L, e2.key)\n    assertEquals(99.0f, e2.value)\n  }\n}\n"
  },
  {
    "path": "kotlin/flatbuffers-kotlin/src/commonTest/kotlin/com/google/flatbuffers/kotlin/FlexBuffersTest.kt",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.google.flatbuffers.kotlin\n\nimport com.google.flatbuffers.kotlin.FlexBuffersBuilder.Companion.SHARE_NONE\nimport kotlin.random.Random\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\nclass FlexBuffersTest {\n\n  @Test\n  fun testWriteInt() {\n    val values =\n      listOf(\n        Byte.MAX_VALUE.toLong() to 3,\n        Short.MAX_VALUE.toLong() to 4,\n        Int.MAX_VALUE.toLong() to 6,\n        Long.MAX_VALUE to 10,\n      )\n    val builder = FlexBuffersBuilder()\n    values.forEach {\n      builder.clear()\n      builder.put(it.first)\n      val data = builder.finish()\n      val ref = getRoot(data)\n      // although we put a long, it is shrink to a byte\n      assertEquals(it.second, data.limit)\n      assertEquals(it.first, ref.toLong())\n    }\n  }\n\n  @Test\n  fun testWriteUInt() {\n    val values =\n      listOf(\n        UByte.MAX_VALUE.toULong() to 3,\n        UShort.MAX_VALUE.toULong() to 4,\n        UInt.MAX_VALUE.toULong() to 6,\n        ULong.MAX_VALUE to 10,\n      )\n    val builder = FlexBuffersBuilder()\n    values.forEach {\n      builder.clear()\n      builder.put(it.first)\n      val data = builder.finish()\n      val ref = getRoot(data)\n      // although we put a long, it is shrink to a byte\n      assertEquals(it.second, data.limit)\n      assertEquals(it.first, ref.toULong())\n    }\n  }\n\n  @Test\n  fun testWriteString() {\n    val text = \"Ḧ̵̘́ȩ̵̐l̶̿͜l̶͚͝o̷̦̚ ̷̫̊w̴̤͊ö̸̞́r̴͎̾l̷͚̐d̶̰̍\"\n    val builder = FlexBuffersBuilder()\n    builder.put(text)\n    val data = builder.finish()\n    val ref = getRoot(data)\n    assertEquals(text, ref.toString())\n  }\n\n  @Test\n  fun testInt8Array() {\n    val ary = intArrayOf(1, 2, 3, 4)\n    val builder = FlexBuffersBuilder()\n    builder.put(intArrayOf(1, 2, 3, 4))\n    val data = builder.finish()\n    val ref = getRoot(data)\n    // although we put a long, it is shrink to a byte\n    assertEquals(8, data.limit)\n    assertArrayEquals(ary, ref.toIntArray())\n  }\n\n  @Test\n  fun testShortArray() {\n    val builder = FlexBuffersBuilder(ArrayReadWriteBuffer(20))\n    val numbers = ShortArray(10) { it.toShort() }\n    builder.put(numbers)\n    val data = builder.finish()\n    val ref = getRoot(data)\n    assertArrayEquals(numbers, ref.toShortArray())\n  }\n\n  @Test\n  fun testHugeArray() {\n    val builder = FlexBuffersBuilder()\n    val numbers = IntArray(1024) { it }\n    builder.put(numbers)\n    val data = builder.finish()\n    val ref = getRoot(data)\n    assertArrayEquals(numbers, ref.toIntArray())\n  }\n\n  @Test\n  fun testFloatArray() {\n    val builder = FlexBuffersBuilder()\n    val numbers = FloatArray(1024) { it * 0.05f }\n    builder.put(numbers)\n    val data = builder.finish()\n    val ref = getRoot(data)\n    assertArrayEquals(numbers, ref.toFloatArray())\n  }\n\n  @Test\n  fun testDoubleArray() {\n    val builder = FlexBuffersBuilder()\n    val numbers = DoubleArray(1024) { it * 0.0005 }\n    builder.put(numbers)\n    val data = builder.finish()\n    val ref = getRoot(data)\n    assertArrayEquals(numbers, ref.toDoubleArray())\n  }\n\n  @Test\n  fun testLongArray() {\n    val ary: LongArray =\n      longArrayOf(0, Short.MIN_VALUE.toLong(), Int.MAX_VALUE.toLong(), Long.MAX_VALUE)\n    val builder = FlexBuffersBuilder()\n    builder.put(ary)\n    val data = builder.finish()\n    val ref = getRoot(data)\n    // although we put a long, it is shrink to a byte\n    assertArrayEquals(ary, ref.toLongArray())\n  }\n\n  @Test\n  fun testStringArray() {\n    val ary = Array(5) { \"Hello world number: $it\" }\n    val builder = FlexBuffersBuilder(ArrayReadWriteBuffer(20), SHARE_NONE)\n    builder.putVector { ary.forEach { put(it) } }\n    val data = builder.finish()\n    val vec = getRoot(data).toVector()\n    // although we put a long, it is shrink to a byte\n    assertEquals(5, vec.size)\n    val stringAry = vec.map { it.toString() }.toTypedArray()\n    // although we put a long, it is shrink to a byte\n    assertArrayEquals(ary, stringAry)\n  }\n\n  @Test\n  fun testBlobArray() {\n    val ary = ByteArray(1000) { Random.nextInt().toByte() }\n    val builder = FlexBuffersBuilder()\n    builder.put(ary)\n    val data = builder.finish()\n    val blob = getRoot(data).toBlob()\n    // although we put a long, it is shrink to a byte\n    assertArrayEquals(ary, blob.toByteArray())\n    for (i in 0 until blob.size) {\n      assertEquals(ary[i], blob[i])\n    }\n  }\n\n  @Test\n  fun testArrays() {\n    val builder = FlexBuffersBuilder()\n    val ary: Array<String> = Array(5) { \"Hello world number: $it\" }\n    val numbers = IntArray(10) { it }\n    val doubles = DoubleArray(10) { it * 0.35 }\n\n    // add 3 level array of arrays in the following way\n    // [ [ \"..\", ...] [ \"..\", ..., [ \"..\", ...] ] ]\n    val vec = builder.startVector()\n\n    // [0, 1, 2, 3 ,4 ,5 ,6 ,7 ,8, 9]\n    val vec1 = builder.startVector()\n    numbers.forEach { builder.put(it) }\n    builder.endTypedVector(vec1)\n\n    // [0, 2, 4, 6 , 8, 10, 12, 14, 16, 18]\n    builder.putTypedVector { doubles.forEach { put(it) } }\n\n    // nested array\n    // [ \"He..\", \"He..\", \"He..\", \"He..\", \"He..\", [ \"He..\", \"He..\", \"He..\", \"He..\", \"He..\" ] ]\n    val vec3 = builder.startVector()\n    ary.forEach { builder.put(it) }\n    builder.putVector { ary.forEach { put(\"inner: $it\") } }\n    builder.endVector(vec3)\n\n    builder.endVector(vec)\n\n    val data = builder.finish()\n    val ref = getRoot(data)\n    val vecRef = getRoot(data).toVector()\n    // although we put a long, it is shrink to a byte\n    assertEquals(3, vecRef.size)\n\n    assertArrayEquals(numbers, vecRef[0].toVector().map { it.toInt() }.toIntArray())\n    assertArrayEquals(doubles, ref[1].toDoubleArray())\n    assertEquals(\"Hello world number: 4\", vecRef[2][4].toString())\n    assertEquals(\"inner: Hello world number: 4\", vecRef[2][5][4].toString())\n    assertEquals(\"inner: Hello world number: 4\", ref[2][5][4].toString())\n  }\n\n  @Test\n  fun testMap() {\n    val builder = FlexBuffersBuilder(shareFlag = FlexBuffersBuilder.SHARE_KEYS_AND_STRINGS)\n    builder.putVector {\n      put(10)\n      putMap {\n        this[\"chello\"] = \"world\"\n        this[\"aint\"] = 10\n        this[\"bfloat\"] = 12.3\n      }\n      put(\"aString\")\n    }\n\n    val ref = getRoot(builder.finish())\n    val map = ref.toVector()\n    assertEquals(3, map.size)\n    assertEquals(10, map[0].toInt())\n    assertEquals(\"aString\", map[2].toString())\n    assertEquals(\"world\", map[1][\"chello\"].toString())\n    assertEquals(10, map[1][\"aint\"].toInt())\n    assertEquals(12.3, map[1][\"bfloat\"].toDouble())\n  }\n\n  @Test\n  fun testMultiMap() {\n    val builder = FlexBuffersBuilder(shareFlag = FlexBuffersBuilder.SHARE_KEYS_AND_STRINGS)\n    builder.putMap {\n      this[\"hello\"] = \"world\"\n      this[\"int\"] = 10\n      this[\"float\"] = 12.3\n      this[\"intarray\"] = intArrayOf(1, 2, 3, 4, 5)\n      this.putMap(\"myMap\") { this[\"cool\"] = \"beans\" }\n    }\n\n    val ref = getRoot(builder.finish())\n    val map = ref.toMap()\n    assertEquals(5, map.size)\n    assertEquals(\"world\", map[\"hello\"].toString())\n    assertEquals(10, map[\"int\"].toInt())\n    assertEquals(12.3, map[\"float\"].toDouble())\n    assertArrayEquals(intArrayOf(1, 2, 3, 4, 5), map[\"intarray\"].toIntArray())\n    assertEquals(\"beans\", ref[\"myMap\"][\"cool\"].toString())\n    assertEquals(true, \"myMap\" in map)\n    assertEquals(true, \"cool\" in map[\"myMap\"].toMap())\n\n    // testing null values\n    assertEquals(true, ref[\"invalid_key\"].isNull)\n\n    val keys = map.keys.toTypedArray()\n    arrayOf(\"hello\", \"int\", \"float\", \"intarray\", \"myMap\").sortedArray().forEachIndexed {\n      i: Int,\n      it: String ->\n      assertEquals(it, keys[i].toString())\n    }\n  }\n\n  @Test\n  fun testBigStringMap() {\n    val builder = FlexBuffersBuilder(shareFlag = FlexBuffersBuilder.SHARE_KEYS_AND_STRINGS)\n\n    val stringKey = Array(10000) { \"Ḧ̵̘́ȩ̵̐myFairlyBigKey$it\" }\n    val stringValue = Array(10000) { \"Ḧ̵̘́ȩ̵̐myFairlyBigValue$it\" }\n    val hashMap = mutableMapOf<String, String>()\n    val pos = builder.startMap()\n    for (i in stringKey.indices) {\n      builder[stringKey[i]] = stringValue[i]\n      hashMap[stringKey[i]] = stringValue[i]\n    }\n    builder.endMap(pos)\n    val ref = getRoot(builder.finish())\n    val map = ref.toMap()\n    val sortedKeys = stringKey.sortedArray()\n    val size = map.size\n    for (i in 0 until size) {\n      assertEquals(sortedKeys[i], map.keyAsString(i))\n      assertEquals(sortedKeys[i], map.keyAt(i).toString())\n      assertEquals(hashMap[sortedKeys[i]], map[map.keyAt(i)].toString())\n    }\n  }\n\n  @Test\n  fun testKeysAccess() {\n    for (i in 1 until 1000) {\n      val utf8String = \"ሰማይ አይታረስ ንጉሥ አይከሰስ።$i\"\n      val bytes = ByteArray(Utf8.encodedLength(utf8String))\n      val pos = Utf8.encodeUtf8Array(utf8String, bytes)\n      val key = Key(ArrayReadWriteBuffer(bytes), 0, pos)\n      assertEquals(utf8String.length, key.sizeInChars)\n      for (j in utf8String.indices) {\n        assertEquals(utf8String[j], key[j])\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "kotlin/flatbuffers-kotlin/src/commonTest/kotlin/com/google/flatbuffers/kotlin/JSONTest.kt",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.google.flatbuffers.kotlin\n\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertTrue\n\nclass JSONTest {\n\n  @Test\n  fun parse2Test() {\n    val dataStr =\n      \"\"\"\n        { \"myKey\" : [1, \"yay\"] }\n      \"\"\"\n        .trimIndent()\n    val data = dataStr.encodeToByteArray()\n    val buffer = ArrayReadWriteBuffer(data, writePosition = data.size)\n    val parser = JSONParser()\n    val root = parser.parse(buffer)\n    println(root.toJson())\n  }\n\n  @Test\n  fun parseSample() {\n    val dataStr =\n      \"\"\"\n      {\n        \"ary\" : [1, 2, 3],\n        \"boolean_false\": false,\n\"boolean_true\": true, \"double\": 1.2E33,\n        \"hello\":\"world\"\n   ,\"interesting\": \"value\",\n\n \"null_value\":  null,\n\n\n  \"object\" : {\n    \"field1\": \"hello\"\n  }\n }\n    \"\"\"\n    val data = dataStr.encodeToByteArray()\n    val root = JSONParser().parse(ArrayReadWriteBuffer(data, writePosition = data.size))\n    println(root.toJson())\n    val map = root.toMap()\n\n    assertEquals(8, map.size)\n    assertEquals(\"world\", map[\"hello\"].toString())\n    assertEquals(\"value\", map[\"interesting\"].toString())\n    assertEquals(12e32, map[\"double\"].toDouble())\n    assertArrayEquals(intArrayOf(1, 2, 3), map[\"ary\"].toIntArray())\n    assertEquals(true, map[\"boolean_true\"].toBoolean())\n    assertEquals(false, map[\"boolean_false\"].toBoolean())\n    assertEquals(true, map[\"null_value\"].isNull)\n    assertEquals(\"hello\", map[\"object\"][\"field1\"].toString())\n\n    val obj = map[\"object\"]\n    assertEquals(true, obj.isMap)\n    assertEquals(\"{\\\"field1\\\":\\\"hello\\\"}\", obj.toJson())\n    // TODO: Kotlin Double.toString() produce different strings dependending on the platform, so on\n    // JVM\n    // is 1.2E33, while on js is 1.2e+33. For now we are disabling this test.\n    //\n    // val minified = data.filterNot { it == ' '.toByte() || it == '\\n'.toByte()\n    // }.toByteArray().decodeToString()\n    // assertEquals(minified, root.toJson())\n  }\n\n  @Test\n  fun testDoubles() {\n    val values =\n      arrayOf(\n        \"-0.0\",\n        \"1.0\",\n        \"1.7976931348613157\",\n        \"0.0\",\n        \"-0.5\",\n        \"3.141592653589793\",\n        \"2.718281828459045E-3\",\n        \"2.2250738585072014E-308\",\n        \"4.9E-15\",\n      )\n    val parser = JSONParser()\n    assertEquals(-0.0, parser.parse(values[0]).toDouble())\n    assertEquals(1.0, parser.parse(values[1]).toDouble())\n    assertEquals(1.7976931348613157, parser.parse(values[2]).toDouble())\n    assertEquals(0.0, parser.parse(values[3]).toDouble())\n    assertEquals(-0.5, parser.parse(values[4]).toDouble())\n    assertEquals(3.141592653589793, parser.parse(values[5]).toDouble())\n    assertEquals(2.718281828459045e-3, parser.parse(values[6]).toDouble())\n    assertEquals(2.2250738585072014E-308, parser.parse(values[7]).toDouble())\n    assertEquals(4.9E-15, parser.parse(values[8]).toDouble())\n  }\n\n  @Test\n  fun testInts() {\n    val values =\n      arrayOf(\n        \"-0\",\n        \"0\",\n        \"-1\",\n        \"${Int.MAX_VALUE}\",\n        \"${Int.MIN_VALUE}\",\n        \"${Long.MAX_VALUE}\",\n        \"${Long.MIN_VALUE}\",\n      )\n    val parser = JSONParser()\n\n    assertEquals(parser.parse(values[0]).toInt(), 0)\n    assertEquals(parser.parse(values[1]).toInt(), 0)\n    assertEquals(parser.parse(values[2]).toInt(), -1)\n    assertEquals(parser.parse(values[3]).toInt(), Int.MAX_VALUE)\n    assertEquals(parser.parse(values[4]).toInt(), Int.MIN_VALUE)\n    assertEquals(parser.parse(values[5]).toLong(), Long.MAX_VALUE)\n    assertEquals(parser.parse(values[6]).toLong(), Long.MIN_VALUE)\n  }\n\n  @Test\n  fun testBooleansAndNull() {\n    val values = arrayOf(\"true\", \"false\", \"null\")\n    val parser = JSONParser()\n\n    assertEquals(true, parser.parse(values[0]).toBoolean())\n    assertEquals(false, parser.parse(values[1]).toBoolean())\n    assertEquals(true, parser.parse(values[2]).isNull)\n  }\n\n  @Test\n  fun testStrings() {\n    val values =\n      arrayOf(\n        \"\\\"\\\"\",\n        \"\\\"a\\\"\",\n        \"\\\"hello world\\\"\",\n        \"\\\"\\\\\\\"\\\\\\\\\\\\/\\\\b\\\\f\\\\n\\\\r\\\\t cool\\\"\",\n        \"\\\"\\\\u0000\\\"\",\n        \"\\\"\\\\u0021\\\"\",\n        \"\\\"hell\\\\u24AC\\\\n\\\\ro wor \\\\u0021 ld\\\"\",\n        \"\\\"\\\\/_\\\\\\\\_\\\\\\\"_\\\\uCAFE\\\\uBABE\\\\uAB98\\\\uFCDE\\\\ubcda\\\\uef4A\\\\b\\\\n\\\\r\\\\t`1~!@#\\$%^&*()_+-=[]{}|;:',./<>?\\\"\",\n      )\n    val parser = JSONParser()\n\n    // empty\n    var ref = parser.parse(values[0])\n    assertEquals(true, ref.isString)\n    assertEquals(\"\", ref.toString())\n    // a\n    ref = parser.parse(values[1])\n    assertEquals(true, ref.isString)\n    assertEquals(\"a\", ref.toString())\n    // hello world\n    ref = parser.parse(values[2])\n    assertEquals(true, ref.isString)\n    assertEquals(\"hello world\", ref.toString())\n    // \"\\\\\\\"\\\\\\\\\\\\/\\\\b\\\\f\\\\n\\\\r\\\\t\\\"\"\n    ref = parser.parse(values[3])\n    assertEquals(true, ref.isString)\n    assertEquals(\"\\\"\\\\/\\b${12.toChar()}\\n\\r\\t cool\", ref.toString())\n    // 0\n    ref = parser.parse(values[4])\n    assertEquals(true, ref.isString)\n    assertEquals(0.toChar().toString(), ref.toString())\n    // u0021\n    ref = parser.parse(values[5])\n    assertEquals(true, ref.isString)\n    assertEquals(0x21.toChar().toString(), ref.toString())\n    // \"\\\"hell\\\\u24AC\\\\n\\\\ro wor \\\\u0021 ld\\\"\",\n    ref = parser.parse(values[6])\n    assertEquals(true, ref.isString)\n    assertEquals(\"hell${0x24AC.toChar()}\\n\\ro wor ${0x21.toChar()} ld\", ref.toString())\n\n    ref = parser.parse(values[7])\n    println(ref.toJson())\n    assertEquals(true, ref.isString)\n    assertEquals(\"/_\\\\_\\\"_쫾몾ꮘﳞ볚\\b\\n\\r\\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?\", ref.toString())\n  }\n\n  @Test\n  fun testUnicode() {\n    // took from test/unicode_test.json\n    val data =\n      \"\"\"\n        {\n          \"name\": \"unicode_test\",\n          \"testarrayofstring\": [\n            \"Цлїςσδε\",\n            \"ﾌﾑｱﾑｶﾓｹﾓ\",\n            \"フムヤムカモケモ\",\n            \"㊀㊁㊂㊃㊄\",\n            \"☳☶☲\",\n            \"𡇙𝌆\"\n          ],\n          \"testarrayoftables\": [\n            {\n              \"name\": \"Цлїςσδε\"\n            },\n            {\n              \"name\": \"☳☶☲\"\n            },\n            {\n              \"name\": \"フムヤムカモケモ\"\n            },\n            {\n              \"name\": \"㊀㊁㊂㊃㊄\"\n            },\n            {\n              \"name\": \"ﾌﾑｱﾑｶﾓｹﾓ\"\n            },\n            {\n              \"name\": \"𡇙𝌆\"\n            }\n          ]\n        }\n      \"\"\"\n        .trimIndent()\n    val parser = JSONParser()\n    val ref = parser.parse(data)\n\n    // name\n    assertEquals(3, ref.toMap().size)\n    assertEquals(\"unicode_test\", ref[\"name\"].toString())\n    // testarrayofstring\n    assertEquals(6, ref[\"testarrayofstring\"].toVector().size)\n    assertEquals(\"Цлїςσδε\", ref[\"testarrayofstring\"][0].toString())\n    assertEquals(\"ﾌﾑｱﾑｶﾓｹﾓ\", ref[\"testarrayofstring\"][1].toString())\n    assertEquals(\"フムヤムカモケモ\", ref[\"testarrayofstring\"][2].toString())\n    assertEquals(\"㊀㊁㊂㊃㊄\", ref[\"testarrayofstring\"][3].toString())\n    assertEquals(\"☳☶☲\", ref[\"testarrayofstring\"][4].toString())\n    assertEquals(\"𡇙𝌆\", ref[\"testarrayofstring\"][5].toString())\n    // testarrayoftables\n    assertEquals(6, ref[\"testarrayoftables\"].toVector().size)\n    assertEquals(\"Цлїςσδε\", ref[\"testarrayoftables\"][0][\"name\"].toString())\n    assertEquals(\"☳☶☲\", ref[\"testarrayoftables\"][1][\"name\"].toString())\n    assertEquals(\"フムヤムカモケモ\", ref[\"testarrayoftables\"][2][\"name\"].toString())\n    assertEquals(\"㊀㊁㊂㊃㊄\", ref[\"testarrayoftables\"][3][\"name\"].toString())\n    assertEquals(\"ﾌﾑｱﾑｶﾓｹﾓ\", ref[\"testarrayoftables\"][4][\"name\"].toString())\n    assertEquals(\"𡇙𝌆\", ref[\"testarrayoftables\"][5][\"name\"].toString())\n  }\n\n  @Test\n  fun testArrays() {\n    val values =\n      arrayOf(\n        \"[]\",\n        \"[1]\",\n        \"[0,1, 2,3  , 4 ]\",\n        \"[1.0, 2.2250738585072014E-308,  4.9E-320]\",\n        \"[1.0, 2,  \\\"hello world\\\"]   \",\n        \"[ 1.1, 2, [ \\\"hello\\\" ] ]\",\n        \"[[[1]]]\",\n      )\n    val parser = JSONParser()\n\n    // empty\n    var ref = parser.parse(values[0])\n    assertEquals(true, ref.isVector)\n    assertEquals(0, parser.parse(values[0]).toVector().size)\n    // single\n    ref = parser.parse(values[1])\n    assertEquals(true, ref.isTypedVector)\n    assertEquals(1, ref[0].toInt())\n    // ints\n    ref = parser.parse(values[2])\n    assertEquals(true, ref.isTypedVector)\n    assertEquals(T_VECTOR_INT, ref.type)\n    assertEquals(5, ref.toVector().size)\n    for (i in 0..4) {\n      assertEquals(i, ref[i].toInt())\n    }\n    // floats\n    ref = parser.parse(values[3])\n    assertEquals(true, ref.isTypedVector)\n    assertEquals(T_VECTOR_FLOAT, ref.type)\n    assertEquals(3, ref.toVector().size)\n    assertEquals(1.0, ref[0].toDouble())\n    assertEquals(2.2250738585072014E-308, ref[1].toDouble())\n    assertEquals(4.9E-320, ref[2].toDouble())\n    // mixed\n    ref = parser.parse(values[4])\n    assertEquals(false, ref.isTypedVector)\n    assertEquals(T_VECTOR, ref.type)\n    assertEquals(1.0, ref[0].toDouble())\n    assertEquals(2, ref[1].toInt())\n    assertEquals(\"hello world\", ref[2].toString())\n    // nester array\n    ref = parser.parse(values[5])\n    assertEquals(false, ref.isTypedVector)\n    assertEquals(T_VECTOR, ref.type)\n    assertEquals(1.1, ref[0].toDouble())\n    assertEquals(2, ref[1].toInt())\n    assertEquals(\"hello\", ref[2][0].toString())\n  }\n\n  /**\n   * Several test cases provided by json.org For more details, see: http://json.org/JSON_checker/,\n   * with only one exception. Single strings are considered accepted, whereas on the test suit is\n   * should fail.\n   */\n  @Test\n  fun testParseMustFail() {\n    val failList =\n      listOf(\n        \"[\\\"Unclosed array\\\"\",\n        \"{unquoted_key: \\\"keys must be quoted\\\"}\",\n        \"[\\\"extra comma\\\",]\",\n        \"[\\\"double extra comma\\\",,]\",\n        \"[   , \\\"<-- missing value\\\"]\",\n        \"[\\\"Comma after the close\\\"],\",\n        \"[\\\"Extra close\\\"]]\",\n        \"{\\\"Extra comma\\\": true,}\",\n        \"{\\\"Extra value after close\\\": true} \\\"misplaced quoted value\\\"\",\n        \"{\\\"Illegal expression\\\": 1 + 2}\",\n        \"{\\\"Illegal invocation\\\": alert()}\",\n        \"{\\\"Numbers cannot have leading zeroes\\\": 013}\",\n        \"{\\\"Numbers cannot be hex\\\": 0x14}\",\n        \"[\\\"Illegal backslash escape: \\\\x15\\\"]\",\n        \"[\\\\naked]\",\n        \"[\\\"Illegal backslash escape: \\\\017\\\"]\",\n        \"[[[[[[[[[[[[[[[[[[[[[[[\\\"Too deep\\\"]]]]]]]]]]]]]]]]]]]]]]]\",\n        \"{\\\"Missing colon\\\" null}\",\n        \"{\\\"Double colon\\\":: null}\",\n        \"{\\\"Comma instead of colon\\\", null}\",\n        \"[\\\"Colon instead of comma\\\": false]\",\n        \"[\\\"Bad value\\\", truth]\",\n        \"['single quote']\",\n        \"[\\\"\\ttab\\tcharacter\\tin\\tstring\\t\\\"]\",\n        \"[\\\"tab\\\\   character\\\\   in\\\\  string\\\\  \\\"]\",\n        \"[\\\"line\\nbreak\\\"]\",\n        \"[\\\"line\\\\\\nbreak\\\"]\",\n        \"[0e]\",\n        \"[0e+]\",\n        \"[0e+-1]\",\n        \"{\\\"Comma instead if closing brace\\\": true,\",\n        \"[\\\"mismatch\\\"}\",\n      )\n    for (data in failList) {\n      try {\n        JSONParser().parse(ArrayReadBuffer(data.encodeToByteArray()))\n        assertTrue(false, \"SHOULD NOT PASS: $data\")\n      } catch (e: IllegalStateException) {\n        println(\"FAIL $e\")\n      }\n    }\n  }\n\n  @Test\n  fun testParseMustPass() {\n    val passList =\n      listOf(\n        \"[\\n\" +\n          \"    \\\"JSON Test Pattern pass1\\\",\\n\" +\n          \"    {\\\"object with 1 member\\\":[\\\"array with 1 element\\\"]},\\n\" +\n          \"    {},\\n\" +\n          \"    [],\\n\" +\n          \"    -42,\\n\" +\n          \"    true,\\n\" +\n          \"    false,\\n\" +\n          \"    null,\\n\" +\n          \"    {\\n\" +\n          \"        \\\"integer\\\": 1234567890,\\n\" +\n          \"        \\\"real\\\": -9876.543210,\\n\" +\n          \"        \\\"e\\\": 0.123456789e-12,\\n\" +\n          \"        \\\"E\\\": 1.234567890E+34,\\n\" +\n          \"        \\\"\\\":  23456789012E66,\\n\" +\n          \"        \\\"zero\\\": 0,\\n\" +\n          \"        \\\"one\\\": 1,\\n\" +\n          \"        \\\"space\\\": \\\" \\\",\\n\" +\n          \"        \\\"quote\\\": \\\"\\\\\\\"\\\",\\n\" +\n          \"        \\\"backslash\\\": \\\"\\\\\\\\\\\",\\n\" +\n          \"        \\\"controls\\\": \\\"\\\\b\\\\f\\\\n\\\\r\\\\t\\\",\\n\" +\n          \"        \\\"slash\\\": \\\"/ & \\\\/\\\",\\n\" +\n          \"        \\\"alpha\\\": \\\"abcdefghijklmnopqrstuvwyz\\\",\\n\" +\n          \"        \\\"ALPHA\\\": \\\"ABCDEFGHIJKLMNOPQRSTUVWYZ\\\",\\n\" +\n          \"        \\\"digit\\\": \\\"0123456789\\\",\\n\" +\n          \"        \\\"0123456789\\\": \\\"digit\\\",\\n\" +\n          \"        \\\"special\\\": \\\"`1~!@#\\$%^&*()_+-={':[,]}|;.</>?\\\",\\n\" +\n          \"        \\\"hex\\\": \\\"\\\\u0123\\\\u4567\\\\u89AB\\\\uCDEF\\\\uabcd\\\\uef4A\\\",\\n\" +\n          \"        \\\"true\\\": true,\\n\" +\n          \"        \\\"false\\\": false,\\n\" +\n          \"        \\\"null\\\": null,\\n\" +\n          \"        \\\"array\\\":[  ],\\n\" +\n          \"        \\\"object\\\":{  },\\n\" +\n          \"        \\\"address\\\": \\\"50 St. James Street\\\",\\n\" +\n          \"        \\\"url\\\": \\\"http://www.JSON.org/\\\",\\n\" +\n          \"        \\\"comment\\\": \\\"// /* <!-- --\\\",\\n\" +\n          \"        \\\"# -- --> */\\\": \\\" \\\",\\n\" +\n          \"        \\\" s p a c e d \\\" :[1,2 , 3\\n\" +\n          \"\\n\" +\n          \",\\n\" +\n          \"\\n\" +\n          \"4 , 5        ,          6           ,7        ],\\\"compact\\\":[1,2,3,4,5,6,7],\\n\" +\n          \"        \\\"jsontext\\\": \\\"{\\\\\\\"object with 1 member\\\\\\\":[\\\\\\\"array with 1 element\\\\\\\"]}\\\",\\n\" +\n          \"        \\\"quotes\\\": \\\"&#34; \\\\u0022 %22 0x22 034 &#x22;\\\",\\n\" +\n          \"        \\\"\\\\/\\\\\\\\\\\\\\\"\\\\uCAFE\\\\uBABE\\\\uAB98\\\\uFCDE\\\\ubcda\\\\uef4A\\\\b\\\\f\\\\n\\\\r\\\\t`1~!@#\\$%^&*()_+-=[]{}|;:',./<>?\\\"\\n\" +\n          \": \\\"A key can be any string\\\"\\n\" +\n          \"    },\\n\" +\n          \"    0.5 ,98.6\\n\" +\n          \",\\n\" +\n          \"99.44\\n\" +\n          \",\\n\" +\n          \"\\n\" +\n          \"1066,\\n\" +\n          \"1e1,\\n\" +\n          \"0.1e1,\\n\" +\n          \"1e-1,\\n\" +\n          \"1e00,2e+00,2e-00\\n\" +\n          \",\\\"rosebud\\\"]\",\n        \"{\\n\" +\n          \"    \\\"JSON Test Pattern pass3\\\": {\\n\" +\n          \"        \\\"The outermost value\\\": \\\"must be an object or array.\\\",\\n\" +\n          \"        \\\"In this test\\\": \\\"It is an object.\\\"\\n\" +\n          \"    }\\n\" +\n          \"}\",\n        \"[[[[[[[[[[[[[[[[[[[\\\"Not too deep\\\"]]]]]]]]]]]]]]]]]]]\",\n      )\n    for (data in passList) {\n      JSONParser().parse(ArrayReadBuffer(data.encodeToByteArray()))\n    }\n  }\n}\n"
  },
  {
    "path": "kotlin/flatbuffers-kotlin/src/jsMain/kotlin/com/google/flatbuffers/kotlin/ByteArray.kt",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n@file:Suppress(\"NOTHING_TO_INLINE\")\n\npackage com.google.flatbuffers.kotlin\n\n/** This implementation uses Little Endian order. */\npublic actual inline fun ByteArray.getUByte(index: Int): UByte = ByteArrayOps.getUByte(this, index)\n\npublic actual inline fun ByteArray.getShort(index: Int): Short = ByteArrayOps.getShort(this, index)\n\npublic actual inline fun ByteArray.getUShort(index: Int): UShort =\n  ByteArrayOps.getUShort(this, index)\n\npublic actual inline fun ByteArray.getInt(index: Int): Int = ByteArrayOps.getInt(this, index)\n\npublic actual inline fun ByteArray.getUInt(index: Int): UInt = ByteArrayOps.getUInt(this, index)\n\npublic actual inline fun ByteArray.getLong(index: Int): Long = ByteArrayOps.getLong(this, index)\n\npublic actual inline fun ByteArray.getULong(index: Int): ULong = ByteArrayOps.getULong(this, index)\n\npublic actual inline fun ByteArray.getFloat(index: Int): Float = ByteArrayOps.getFloat(this, index)\n\npublic actual inline fun ByteArray.getDouble(index: Int): Double =\n  ByteArrayOps.getDouble(this, index)\n\npublic actual inline fun ByteArray.setUByte(index: Int, value: UByte): Unit =\n  ByteArrayOps.setUByte(this, index, value)\n\npublic actual inline fun ByteArray.setShort(index: Int, value: Short): Unit =\n  ByteArrayOps.setShort(this, index, value)\n\npublic actual inline fun ByteArray.setUShort(index: Int, value: UShort): Unit =\n  ByteArrayOps.setUShort(this, index, value)\n\npublic actual inline fun ByteArray.setInt(index: Int, value: Int): Unit =\n  ByteArrayOps.setInt(this, index, value)\n\npublic actual inline fun ByteArray.setUInt(index: Int, value: UInt): Unit =\n  ByteArrayOps.setUInt(this, index, value)\n\npublic actual inline fun ByteArray.setLong(index: Int, value: Long): Unit =\n  ByteArrayOps.setLong(this, index, value)\n\npublic actual inline fun ByteArray.setULong(index: Int, value: ULong): Unit =\n  ByteArrayOps.setULong(this, index, value)\n\npublic actual inline fun ByteArray.setFloat(index: Int, value: Float): Unit =\n  ByteArrayOps.setFloat(this, index, value)\n\npublic actual inline fun ByteArray.setDouble(index: Int, value: Double): Unit =\n  ByteArrayOps.setDouble(this, index, value)\n"
  },
  {
    "path": "kotlin/flatbuffers-kotlin/src/jvmMain/kotlin/com/google/flatbuffers/kotlin/ByteArray.kt",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n@file:JvmName(\"JVMByteArray\")\n@file:Suppress(\"NOTHING_TO_INLINE\")\n\npackage com.google.flatbuffers.kotlin\n\n/** This implementation uses Little Endian order. */\npublic actual inline fun ByteArray.getUByte(index: Int): UByte = ByteArrayOps.getUByte(this, index)\n\npublic actual inline fun ByteArray.getShort(index: Int): Short = ByteArrayOps.getShort(this, index)\n\npublic actual inline fun ByteArray.getUShort(index: Int): UShort =\n  ByteArrayOps.getUShort(this, index)\n\npublic actual inline fun ByteArray.getInt(index: Int): Int = ByteArrayOps.getInt(this, index)\n\npublic actual inline fun ByteArray.getUInt(index: Int): UInt = ByteArrayOps.getUInt(this, index)\n\npublic actual inline fun ByteArray.getLong(index: Int): Long = ByteArrayOps.getLong(this, index)\n\npublic actual inline fun ByteArray.getULong(index: Int): ULong = ByteArrayOps.getULong(this, index)\n\npublic actual inline fun ByteArray.getFloat(index: Int): Float = ByteArrayOps.getFloat(this, index)\n\npublic actual inline fun ByteArray.getDouble(index: Int): Double =\n  ByteArrayOps.getDouble(this, index)\n\npublic actual inline fun ByteArray.setUByte(index: Int, value: UByte): Unit =\n  ByteArrayOps.setUByte(this, index, value)\n\npublic actual inline fun ByteArray.setShort(index: Int, value: Short): Unit =\n  ByteArrayOps.setShort(this, index, value)\n\npublic actual inline fun ByteArray.setUShort(index: Int, value: UShort): Unit =\n  ByteArrayOps.setUShort(this, index, value)\n\npublic actual inline fun ByteArray.setInt(index: Int, value: Int): Unit =\n  ByteArrayOps.setInt(this, index, value)\n\npublic actual inline fun ByteArray.setUInt(index: Int, value: UInt): Unit =\n  ByteArrayOps.setUInt(this, index, value)\n\npublic actual inline fun ByteArray.setLong(index: Int, value: Long): Unit =\n  ByteArrayOps.setLong(this, index, value)\n\npublic actual inline fun ByteArray.setULong(index: Int, value: ULong): Unit =\n  ByteArrayOps.setULong(this, index, value)\n\npublic actual inline fun ByteArray.setFloat(index: Int, value: Float): Unit =\n  ByteArrayOps.setFloat(this, index, value)\n\npublic actual inline fun ByteArray.setDouble(index: Int, value: Double): Unit =\n  ByteArrayOps.setDouble(this, index, value)\n"
  },
  {
    "path": "kotlin/flatbuffers-kotlin/src/jvmTest/kotlin/com/google/flatbuffers/kotlin/Utf8Test.kt",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.google.flatbuffers.kotlin\n\nimport kotlin.test.assertEquals\nimport org.junit.Test\n\nclass Utf8Test {\n\n  @Test\n  fun testUtf8EncodingDecoding() {\n    val classLoader = this.javaClass.classLoader\n    val utf8Lines =\n      String(classLoader.getResourceAsStream(\"utf8_sample.txt\")!!.readBytes()).split(\"\\n\").filter {\n        it.trim().isNotEmpty()\n      }\n\n    val utf8Bytes =\n      utf8Lines.map { s -> ByteArray(Utf8.encodedLength(s)).also { Utf8.encodeUtf8Array(s, it) } }\n    utf8Bytes.indices.forEach {\n      assertArrayEquals(utf8Lines[it].encodeToByteArray(), utf8Bytes[it])\n      assertEquals(utf8Lines[it], Utf8.decodeUtf8Array(utf8Bytes[it]))\n    }\n  }\n}\n"
  },
  {
    "path": "kotlin/flatbuffers-kotlin/src/jvmTest/resources/utf8_sample.txt",
    "content": "Markus Kuhn <http://www.cl.cam.ac.uk/~mgk25/> - 2015-08-28 - CC BY 4.0\nUTF-8 encoded sample plain-text file\n‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾\nMarkus Kuhn [ˈmaʳkʊs kuːn] <mkuhn@acm.org> — 1999-08-20\n\nThe ASCII compatible UTF-8 encoding of ISO 10646 and Unicode\nplain-text files is defined in RFC 2279 and in ISO 10646-1 Annex R.\n\n\nUsing Unicode/UTF-8, you can write in emails and source code things such as\n\nMathematics and Sciences:\n\n  ∮ E⋅da = Q,  n → ∞, ∑ f(i) = ∏ g(i), ∀x∈ℝ: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β),\n\n  ℕ ⊆ ℕ₀ ⊂ ℤ ⊂ ℚ ⊂ ℝ ⊂ ℂ, ⊥ < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (A ⇔ B),\n\n  2H₂ + O₂ ⇌ 2H₂O, R = 4.7 kΩ, ⌀ 200 mm\n\nLinguistics and dictionaries:\n\n  ði ıntəˈnæʃənəl fəˈnɛtık əsoʊsiˈeıʃn\n  Y [ˈʏpsilɔn], Yen [jɛn], Yoga [ˈjoːgɑ]\n\nAPL:\n\n  ((V⍳V)=⍳⍴V)/V←,V    ⌷←⍳→⍴∆∇⊃‾⍎⍕⌈\n\nNicer typography in plain text files:\n\n  ╔══════════════════════════════════════════╗\n  ║                                          ║\n  ║   • ‘single’ and “double” quotes         ║\n  ║                                          ║\n  ║   • Curly apostrophes: “We’ve been here” ║\n  ║                                          ║\n  ║   • Latin-1 apostrophe and accents: '´`  ║\n  ║                                          ║\n  ║   • ‚deutsche‘ „Anführungszeichen“       ║\n  ║                                          ║\n  ║   • †, ‡, ‰, •, 3–4, —, −5/+5, ™, …      ║\n  ║                                          ║\n  ║   • ASCII safety test: 1lI|, 0OD, 8B     ║\n  ║                      ╭─────────╮         ║\n  ║   • the euro symbol: │ 14.95 € │         ║\n  ║                      ╰─────────╯         ║\n  ╚══════════════════════════════════════════╝\n\nGreek (in Polytonic):\n\n  The Greek anthem:\n\n  Σὲ γνωρίζω ἀπὸ τὴν κόψη\n  τοῦ σπαθιοῦ τὴν τρομερή,\n  σὲ γνωρίζω ἀπὸ τὴν ὄψη\n  ποὺ μὲ βία μετράει τὴ γῆ.\n\n  ᾿Απ᾿ τὰ κόκκαλα βγαλμένη\n  τῶν ῾Ελλήνων τὰ ἱερά\n  καὶ σὰν πρῶτα ἀνδρειωμένη\n  χαῖρε, ὦ χαῖρε, ᾿Ελευθεριά!\n\n  From a speech of Demosthenes in the 4th century BC:\n\n  Οὐχὶ ταὐτὰ παρίσταταί μοι γιγνώσκειν, ὦ ἄνδρες ᾿Αθηναῖοι,\n  ὅταν τ᾿ εἰς τὰ πράγματα ἀποβλέψω καὶ ὅταν πρὸς τοὺς\n  λόγους οὓς ἀκούω· τοὺς μὲν γὰρ λόγους περὶ τοῦ\n  τιμωρήσασθαι Φίλιππον ὁρῶ γιγνομένους, τὰ δὲ πράγματ᾿\n  εἰς τοῦτο προήκοντα,  ὥσθ᾿ ὅπως μὴ πεισόμεθ᾿ αὐτοὶ\n  πρότερον κακῶς σκέψασθαι δέον. οὐδέν οὖν ἄλλο μοι δοκοῦσιν\n  οἱ τὰ τοιαῦτα λέγοντες ἢ τὴν ὑπόθεσιν, περὶ ἧς βουλεύεσθαι,\n  οὐχὶ τὴν οὖσαν παριστάντες ὑμῖν ἁμαρτάνειν. ἐγὼ δέ, ὅτι μέν\n  ποτ᾿ ἐξῆν τῇ πόλει καὶ τὰ αὑτῆς ἔχειν ἀσφαλῶς καὶ Φίλιππον\n  τιμωρήσασθαι, καὶ μάλ᾿ ἀκριβῶς οἶδα· ἐπ᾿ ἐμοῦ γάρ, οὐ πάλαι\n  γέγονεν ταῦτ᾿ ἀμφότερα· νῦν μέντοι πέπεισμαι τοῦθ᾿ ἱκανὸν\n  προλαβεῖν ἡμῖν εἶναι τὴν πρώτην, ὅπως τοὺς συμμάχους\n  σώσομεν. ἐὰν γὰρ τοῦτο βεβαίως ὑπάρξῃ, τότε καὶ περὶ τοῦ\n  τίνα τιμωρήσεταί τις καὶ ὃν τρόπον ἐξέσται σκοπεῖν· πρὶν δὲ\n  τὴν ἀρχὴν ὀρθῶς ὑποθέσθαι, μάταιον ἡγοῦμαι περὶ τῆς\n  τελευτῆς ὁντινοῦν ποιεῖσθαι λόγον.\n\n  Δημοσθένους, Γ´ ᾿Ολυνθιακὸς\n\nGeorgian:\n\n  From a Unicode conference invitation:\n\n  გთხოვთ ახლავე გაიაროთ რეგისტრაცია Unicode-ის მეათე საერთაშორისო\n  კონფერენციაზე დასასწრებად, რომელიც გაიმართება 10-12 მარტს,\n  ქ. მაინცში, გერმანიაში. კონფერენცია შეჰკრებს ერთად მსოფლიოს\n  ექსპერტებს ისეთ დარგებში როგორიცაა ინტერნეტი და Unicode-ი,\n  ინტერნაციონალიზაცია და ლოკალიზაცია, Unicode-ის გამოყენება\n  ოპერაციულ სისტემებსა, და გამოყენებით პროგრამებში, შრიფტებში,\n  ტექსტების დამუშავებასა და მრავალენოვან კომპიუტერულ სისტემებში.\n\nRussian:\n\n  From a Unicode conference invitation:\n\n  Зарегистрируйтесь сейчас на Десятую Международную Конференцию по\n  Unicode, которая состоится 10-12 марта 1997 года в Майнце в Германии.\n  Конференция соберет широкий круг экспертов по  вопросам глобального\n  Интернета и Unicode, локализации и интернационализации, воплощению и\n  применению Unicode в различных операционных системах и программных\n  приложениях, шрифтах, верстке и многоязычных компьютерных системах.\n\nThai (UCS Level 2):\n\n  Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese\n  classic 'San Gua'):\n\n  [----------------------------|------------------------]\n    ๏ แผ่นดินฮั่นเสื่อมโทรมแสนสังเวช  พระปกเกศกองบู๊กู้ขึ้นใหม่\n  สิบสองกษัตริย์ก่อนหน้าแลถัดไป       สององค์ไซร้โง่เขลาเบาปัญญา\n    ทรงนับถือขันทีเป็นที่พึ่ง           บ้านเมืองจึงวิปริตเป็นนักหนา\n  โฮจิ๋นเรียกทัพทั่วหัวเมืองมา         หมายจะฆ่ามดชั่วตัวสำคัญ\n    เหมือนขับไสไล่เสือจากเคหา      รับหมาป่าเข้ามาเลยอาสัญ\n  ฝ่ายอ้องอุ้นยุแยกให้แตกกัน          ใช้สาวนั้นเป็นชนวนชื่นชวนใจ\n    พลันลิฉุยกุยกีกลับก่อเหตุ          ช่างอาเพศจริงหนาฟ้าร้องไห้\n  ต้องรบราฆ่าฟันจนบรรลัย           ฤๅหาใครค้ำชูกู้บรรลังก์ ฯ\n\n  (The above is a two-column text. If combining characters are handled\n  correctly, the lines of the second column should be aligned with the\n  | character above.)\n\nEthiopian:\n\n  Proverbs in the Amharic language:\n\n  ሰማይ አይታረስ ንጉሥ አይከሰስ።\n  ብላ ካለኝ እንደአባቴ በቆመጠኝ።\n  ጌጥ ያለቤቱ ቁምጥና ነው።\n  ደሀ በሕልሙ ቅቤ ባይጠጣ ንጣት በገደለው።\n  የአፍ ወለምታ በቅቤ አይታሽም።\n  አይጥ በበላ ዳዋ ተመታ።\n  ሲተረጉሙ ይደረግሙ።\n  ቀስ በቀስ፥ ዕንቁላል በእግሩ ይሄዳል።\n  ድር ቢያብር አንበሳ ያስር።\n  ሰው እንደቤቱ እንጅ እንደ ጉረቤቱ አይተዳደርም።\n  እግዜር የከፈተውን ጉሮሮ ሳይዘጋው አይድርም።\n  የጎረቤት ሌባ፥ ቢያዩት ይስቅ ባያዩት ያጠልቅ።\n  ሥራ ከመፍታት ልጄን ላፋታት።\n  ዓባይ ማደሪያ የለው፥ ግንድ ይዞ ይዞራል።\n  የእስላም አገሩ መካ የአሞራ አገሩ ዋርካ።\n  ተንጋሎ ቢተፉ ተመልሶ ባፉ።\n  ወዳጅህ ማር ቢሆን ጨርስህ አትላሰው።\n  እግርህን በፍራሽህ ልክ ዘርጋ።\n\nRunes:\n\n  ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛏ ᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ ᚹᛁᚦ ᚦᚪ ᚹᛖᛥᚫ\n\n  (Old English, which transcribed into Latin reads 'He cwaeth that he\n  bude thaem lande northweardum with tha Westsae.' and means 'He said\n  that he lived in the northern land near the Western Sea.')\n\nBraille:\n\n  ⡌⠁⠧⠑ ⠼⠁⠒  ⡍⠜⠇⠑⠹⠰⠎ ⡣⠕⠌\n\n  ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠙⠑⠁⠙⠒ ⠞⠕ ⠃⠑⠛⠔ ⠺⠊⠹⠲ ⡹⠻⠑ ⠊⠎ ⠝⠕ ⠙⠳⠃⠞\n  ⠱⠁⠞⠑⠧⠻ ⠁⠃⠳⠞ ⠹⠁⠞⠲ ⡹⠑ ⠗⠑⠛⠊⠌⠻ ⠕⠋ ⠙⠊⠎ ⠃⠥⠗⠊⠁⠇ ⠺⠁⠎\n  ⠎⠊⠛⠝⠫ ⠃⠹ ⠹⠑ ⠊⠇⠻⠛⠹⠍⠁⠝⠂ ⠹⠑ ⠊⠇⠻⠅⠂ ⠹⠑ ⠥⠝⠙⠻⠞⠁⠅⠻⠂\n  ⠁⠝⠙ ⠹⠑ ⠡⠊⠑⠋ ⠍⠳⠗⠝⠻⠲ ⡎⠊⠗⠕⠕⠛⠑ ⠎⠊⠛⠝⠫ ⠊⠞⠲ ⡁⠝⠙\n  ⡎⠊⠗⠕⠕⠛⠑⠰⠎ ⠝⠁⠍⠑ ⠺⠁⠎ ⠛⠕⠕⠙ ⠥⠏⠕⠝ ⠰⡡⠁⠝⠛⠑⠂ ⠋⠕⠗ ⠁⠝⠹⠹⠔⠛ ⠙⠑\n  ⠡⠕⠎⠑ ⠞⠕ ⠏⠥⠞ ⠙⠊⠎ ⠙⠁⠝⠙ ⠞⠕⠲\n\n  ⡕⠇⠙ ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠁⠎ ⠙⠑⠁⠙ ⠁⠎ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲\n\n  ⡍⠔⠙⠖ ⡊ ⠙⠕⠝⠰⠞ ⠍⠑⠁⠝ ⠞⠕ ⠎⠁⠹ ⠹⠁⠞ ⡊ ⠅⠝⠪⠂ ⠕⠋ ⠍⠹\n  ⠪⠝ ⠅⠝⠪⠇⠫⠛⠑⠂ ⠱⠁⠞ ⠹⠻⠑ ⠊⠎ ⠏⠜⠞⠊⠊⠥⠇⠜⠇⠹ ⠙⠑⠁⠙ ⠁⠃⠳⠞\n  ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲ ⡊ ⠍⠊⠣⠞ ⠙⠁⠧⠑ ⠃⠑⠲ ⠔⠊⠇⠔⠫⠂ ⠍⠹⠎⠑⠇⠋⠂ ⠞⠕\n  ⠗⠑⠛⠜⠙ ⠁ ⠊⠕⠋⠋⠔⠤⠝⠁⠊⠇ ⠁⠎ ⠹⠑ ⠙⠑⠁⠙⠑⠌ ⠏⠊⠑⠊⠑ ⠕⠋ ⠊⠗⠕⠝⠍⠕⠝⠛⠻⠹\n  ⠔ ⠹⠑ ⠞⠗⠁⠙⠑⠲ ⡃⠥⠞ ⠹⠑ ⠺⠊⠎⠙⠕⠍ ⠕⠋ ⠳⠗ ⠁⠝⠊⠑⠌⠕⠗⠎\n  ⠊⠎ ⠔ ⠹⠑ ⠎⠊⠍⠊⠇⠑⠆ ⠁⠝⠙ ⠍⠹ ⠥⠝⠙⠁⠇⠇⠪⠫ ⠙⠁⠝⠙⠎\n  ⠩⠁⠇⠇ ⠝⠕⠞ ⠙⠊⠌⠥⠗⠃ ⠊⠞⠂ ⠕⠗ ⠹⠑ ⡊⠳⠝⠞⠗⠹⠰⠎ ⠙⠕⠝⠑ ⠋⠕⠗⠲ ⡹⠳\n  ⠺⠊⠇⠇ ⠹⠻⠑⠋⠕⠗⠑ ⠏⠻⠍⠊⠞ ⠍⠑ ⠞⠕ ⠗⠑⠏⠑⠁⠞⠂ ⠑⠍⠏⠙⠁⠞⠊⠊⠁⠇⠇⠹⠂ ⠹⠁⠞\n  ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠁⠎ ⠙⠑⠁⠙ ⠁⠎ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲\n\n  (The first couple of paragraphs of \"A Christmas Carol\" by Dickens)\n\nCompact font selection example text:\n\n  ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789\n  abcdefghijklmnopqrstuvwxyz £©µÀÆÖÞßéöÿ\n  –—‘“”„†•…‰™œŠŸž€ ΑΒΓΔΩαβγδω АБВГДабвгд\n  ∀∂∈ℝ∧∪≡∞ ↑↗↨↻⇣ ┐┼╔╘░►☺♀ ﬁ�⑀₂ἠḂӥẄɐː⍎אԱა\n\nGreetings in various languages:\n\n  Hello world, Καλημέρα κόσμε, コンニチハ\n\nBox drawing alignment tests:                                          █\n                                                                      ▉\n  ╔══╦══╗  ┌──┬──┐  ╭──┬──╮  ╭──┬──╮  ┏━━┳━━┓  ┎┒┏┑   ╷  ╻ ┏┯┓ ┌┰┐    ▊ ╱╲╱╲╳╳╳\n  ║┌─╨─┐║  │╔═╧═╗│  │╒═╪═╕│  │╓─╁─╖│  ┃┌─╂─┐┃  ┗╃╄┙  ╶┼╴╺╋╸┠┼┨ ┝╋┥    ▋ ╲╱╲╱╳╳╳\n  ║│╲ ╱│║  │║   ║│  ││ │ ││  │║ ┃ ║│  ┃│ ╿ │┃  ┍╅╆┓   ╵  ╹ ┗┷┛ └┸┘    ▌ ╱╲╱╲╳╳╳\n  ╠╡ ╳ ╞╣  ├╢   ╟┤  ├┼─┼─┼┤  ├╫─╂─╫┤  ┣┿╾┼╼┿┫  ┕┛┖┚     ┌┄┄┐ ╎ ┏┅┅┓ ┋ ▍ ╲╱╲╱╳╳╳\n  ║│╱ ╲│║  │║   ║│  ││ │ ││  │║ ┃ ║│  ┃│ ╽ │┃  ░░▒▒▓▓██ ┊  ┆ ╎ ╏  ┇ ┋ ▎\n  ║└─╥─┘║  │╚═╤═╝│  │╘═╪═╛│  │╙─╀─╜│  ┃└─╂─┘┃  ░░▒▒▓▓██ ┊  ┆ ╎ ╏  ┇ ┋ ▏\n  ╚══╩══╝  └──┴──┘  ╰──┴──╯  ╰──┴──╯  ┗━━┻━━┛           └╌╌┘ ╎ ┗╍╍┛ ┋  ▁▂▃▄▅▆▇█\n"
  },
  {
    "path": "kotlin/flatbuffers-kotlin/src/nativeMain/kotlin/com/google/flatbuffers/kotlin/ByteArray.kt",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n@file:Suppress(\"NOTHING_TO_INLINE\")\n@file:OptIn(ExperimentalNativeApi::class)\n\npackage com.google.flatbuffers.kotlin\n\nimport kotlin.experimental.ExperimentalNativeApi\n\n/**\n * This implementation assumes that of native macOSX64 the byte order of the implementation is\n * Little Endian.\n */\npublic actual inline fun ByteArray.getUByte(index: Int): UByte = getUByteAt(index)\n\npublic actual inline fun ByteArray.getShort(index: Int): Short = getShortAt(index)\n\npublic actual inline fun ByteArray.getUShort(index: Int): UShort = getUShortAt(index)\n\npublic actual inline fun ByteArray.getInt(index: Int): Int = getIntAt(index)\n\npublic actual inline fun ByteArray.getUInt(index: Int): UInt = getUIntAt(index)\n\npublic actual inline fun ByteArray.getLong(index: Int): Long = getLongAt(index)\n\npublic actual inline fun ByteArray.getULong(index: Int): ULong = getULongAt(index)\n\npublic actual inline fun ByteArray.setUByte(index: Int, value: UByte): Unit =\n  setUByteAt(index, value)\n\npublic actual inline fun ByteArray.setShort(index: Int, value: Short): Unit =\n  setShortAt(index, value)\n\npublic actual inline fun ByteArray.setUShort(index: Int, value: UShort): Unit =\n  setUShortAt(index, value)\n\npublic actual inline fun ByteArray.setInt(index: Int, value: Int): Unit = setIntAt(index, value)\n\npublic actual inline fun ByteArray.setUInt(index: Int, value: UInt): Unit = setUIntAt(index, value)\n\npublic actual inline fun ByteArray.setLong(index: Int, value: Long): Unit = setLongAt(index, value)\n\npublic actual inline fun ByteArray.setULong(index: Int, value: ULong): Unit =\n  setULongAt(index, value)\n\npublic actual inline fun ByteArray.setFloat(index: Int, value: Float): Unit =\n  setFloatAt(index, value)\n\npublic actual inline fun ByteArray.setDouble(index: Int, value: Double): Unit =\n  setDoubleAt(index, value)\n\npublic actual inline fun ByteArray.getFloat(index: Int): Float = Float.fromBits(getIntAt(index))\n\npublic actual inline fun ByteArray.getDouble(index: Int): Double = Double.fromBits(getLongAt(index))\n"
  },
  {
    "path": "kotlin/gradle/libs.versions.toml",
    "content": "[versions]\n# Version 1.9.10 fix\n# https://youtrack.jetbrains.com/issue/KT-60230/Native-unknown-options-iossimulatorversionmin-sdkversion-with-Xcode-15-beta-3\nkotlin = \"1.9.10\"\nplugin-kotlin = \"1.9.10\"\nplugin-gver = \"0.42.0\"\nkotlinx-benchmark = \"0.4.8\"\njunit = \"4.12\"\ngson = \"2.8.9\"\nmoshi-kotlin = \"1.11.0\"\n\n[libraries]\nkotlin-compiler = { module = \"org.jetbrains.kotlin:kotlin-compiler\", version.ref = \"kotlin\" }\nmoshi-kotlin = { module = \"com.squareup.moshi:moshi-kotlin\", version.ref = \"moshi-kotlin\" }\ngson = { module = \"com.google.code.gson:gson\", version.ref = \"gson\" }\nkotlinx-benchmark-runtime = { module = \"org.jetbrains.kotlinx:kotlinx-benchmark-runtime\", version.ref = \"kotlinx-benchmark\" }\n\njunit = { module=\"junit:junit\", version.ref=\"junit\"}\nkotlin-allopen = { module = \"org.jetbrains.kotlin:kotlin-allopen\", version.ref = \"kotlin\"}\n\nplugin-kotlin-gradle = { module = \"org.jetbrains.kotlin:kotlin-gradle-plugin\", version.ref = \"kotlin\" }\nplugin-kotlinx-benchmark = { module=\"org.jetbrains.kotlinx:kotlinx-benchmark-plugin\", version.ref=\"kotlinx-benchmark\"}\nplugin-jmhreport = { module = \"gradle.plugin.io.morethan.jmhreport:gradle-jmh-report\", version=\"0.9.0\" }\nplugin-download = { module = \"de.undercouch:gradle-download-task\", version = \"5.3.0\"}\n\n\n\n"
  },
  {
    "path": "kotlin/gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.0.1-bin.zip\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "kotlin/gradle.properties",
    "content": "#Gradle\ngroup = \"com.google.flatbuffers\"\nversion = \"2.0.0-SNAPSHOT\"\n\norg.gradle.parallel=true\norg.gradle.caching=true\n\n#Kotlin\nkotlin.code.style=official\n\n#MPP\nkotlin.js.compiler=ir\nkotlin.native.ignoreDisabledTargets=true\nkotlin.mpp.stability.nowarn=true\nkotlin.incremental.multiplatform=true\nkotlin.native.binary.memoryModel=experimental\n\nkotlin.native.distribution.type=prebuilt\n\norg.gradle.jvmargs=\"-XX:+HeapDumpOnOutOfMemoryError\"\n"
  },
  {
    "path": "kotlin/gradlew",
    "content": "#!/bin/sh\n\n#\n# Copyright © 2015-2021 the original authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##############################################################################\n#\n#   Gradle start up script for POSIX generated by Gradle.\n#\n#   Important for running:\n#\n#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is\n#       noncompliant, but you have some other compliant shell such as ksh or\n#       bash, then to run this script, type that shell name before the whole\n#       command line, like:\n#\n#           ksh Gradle\n#\n#       Busybox and similar reduced shells will NOT work, because this script\n#       requires all of these POSIX shell features:\n#         * functions;\n#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,\n#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;\n#         * compound commands having a testable exit status, especially «case»;\n#         * various built-in commands including «command», «set», and «ulimit».\n#\n#   Important for patching:\n#\n#   (2) This script targets any POSIX shell, so it avoids extensions provided\n#       by Bash, Ksh, etc; in particular arrays are avoided.\n#\n#       The \"traditional\" practice of packing multiple parameters into a\n#       space-separated string is a well documented source of bugs and security\n#       problems, so this is (mostly) avoided, by progressively accumulating\n#       options in \"$@\", and eventually passing that to Java.\n#\n#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,\n#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;\n#       see the in-line comments for details.\n#\n#       There are tweaks for specific operating systems such as AIX, CygWin,\n#       Darwin, MinGW, and NonStop.\n#\n#   (3) This script is generated from the Groovy template\n#       https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt\n#       within the Gradle project.\n#\n#       You can find Gradle at https://github.com/gradle/gradle/.\n#\n##############################################################################\n\n# Attempt to set APP_HOME\n\n# Resolve links: $0 may be a link\napp_path=$0\n\n# Need this for daisy-chained symlinks.\nwhile\n    APP_HOME=${app_path%\"${app_path##*/}\"}  # leaves a trailing /; empty if no leading path\n    [ -h \"$app_path\" ]\ndo\n    ls=$( ls -ld \"$app_path\" )\n    link=${ls#*' -> '}\n    case $link in             #(\n      /*)   app_path=$link ;; #(\n      *)    app_path=$APP_HOME$link ;;\n    esac\ndone\n\nAPP_HOME=$( cd \"${APP_HOME:-./}\" && pwd -P ) || exit\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=${0##*/}\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=maximum\n\nwarn () {\n    echo \"$*\"\n} >&2\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n} >&2\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"$( uname )\" in                #(\n  CYGWIN* )         cygwin=true  ;; #(\n  Darwin* )         darwin=true  ;; #(\n  MSYS* | MINGW* )  msys=true    ;; #(\n  NONSTOP* )        nonstop=true ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=$JAVA_HOME/jre/sh/java\n    else\n        JAVACMD=$JAVA_HOME/bin/java\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=java\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif ! \"$cygwin\" && ! \"$darwin\" && ! \"$nonstop\" ; then\n    case $MAX_FD in #(\n      max*)\n        MAX_FD=$( ulimit -H -n ) ||\n            warn \"Could not query maximum file descriptor limit\"\n    esac\n    case $MAX_FD in  #(\n      '' | soft) :;; #(\n      *)\n        ulimit -n \"$MAX_FD\" ||\n            warn \"Could not set maximum file descriptor limit to $MAX_FD\"\n    esac\nfi\n\n# Collect all arguments for the java command, stacking in reverse order:\n#   * args from the command line\n#   * the main class name\n#   * -classpath\n#   * -D...appname settings\n#   * --module-path (only if needed)\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif \"$cygwin\" || \"$msys\" ; then\n    APP_HOME=$( cygpath --path --mixed \"$APP_HOME\" )\n    CLASSPATH=$( cygpath --path --mixed \"$CLASSPATH\" )\n\n    JAVACMD=$( cygpath --unix \"$JAVACMD\" )\n\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    for arg do\n        if\n            case $arg in                                #(\n              -*)   false ;;                            # don't mess with options #(\n              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath\n                    [ -e \"$t\" ] ;;                      #(\n              *)    false ;;\n            esac\n        then\n            arg=$( cygpath --path --ignore --mixed \"$arg\" )\n        fi\n        # Roll the args list around exactly as many times as the number of\n        # args, so each arg winds up back in the position where it started, but\n        # possibly modified.\n        #\n        # NB: a `for` loop captures its iteration list before it begins, so\n        # changing the positional parameters here affects neither the number of\n        # iterations, nor the values presented in `arg`.\n        shift                   # remove old arg\n        set -- \"$@\" \"$arg\"      # push replacement arg\n    done\nfi\n\n# Collect all arguments for the java command;\n#   * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of\n#     shell script including quotes and variable substitutions, so put them in\n#     double quotes to make sure that they get re-expanded; and\n#   * put everything else in single quotes, so that it's not re-expanded.\n\nset -- \\\n        \"-Dorg.gradle.appname=$APP_BASE_NAME\" \\\n        -classpath \"$CLASSPATH\" \\\n        org.gradle.wrapper.GradleWrapperMain \\\n        \"$@\"\n\n# Use \"xargs\" to parse quoted args.\n#\n# With -n1 it outputs one arg per line, with the quotes and backslashes removed.\n#\n# In Bash we could simply go:\n#\n#   readarray ARGS < <( xargs -n1 <<<\"$var\" ) &&\n#   set -- \"${ARGS[@]}\" \"$@\"\n#\n# but POSIX shell has neither arrays nor command substitution, so instead we\n# post-process each arg (as a line of input to sed) to backslash-escape any\n# character that might be a shell metacharacter, then use eval to reverse\n# that process (while maintaining the separation between arguments), and wrap\n# the whole thing up as a single \"set\" statement.\n#\n# This will of course break if any of these variables contains a newline or\n# an unmatched quote.\n#\n\neval \"set -- $(\n        printf '%s\\n' \"$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\" |\n        xargs -n1 |\n        sed ' s~[^-[:alnum:]+,./:=@_]~\\\\&~g; ' |\n        tr '\\n' ' '\n    )\" '\"$@\"'\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "kotlin/gradlew.bat",
    "content": "@rem\n@rem Copyright 2015 the original author or authors.\n@rem\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\n@rem you may not use this file except in compliance with the License.\n@rem You may obtain a copy of the License at\n@rem\n@rem      https://www.apache.org/licenses/LICENSE-2.0\n@rem\n@rem Unless required by applicable law or agreed to in writing, software\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n@rem See the License for the specific language governing permissions and\n@rem limitations under the License.\n@rem\n\n@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto execute\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto execute\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %*\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "kotlin/settings.gradle.kts",
    "content": "rootProject.name = \"flatbuffers-kotlin\"\n\nincludeBuild(\"convention-plugins\")\n\ninclude(\"flatbuffers-kotlin\")\n\ninclude(\"benchmark\")\n"
  },
  {
    "path": "kotlin/spotless/spotless.kt",
    "content": "/*\n * Copyright $YEAR Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"
  },
  {
    "path": "library.json",
    "content": "{\n    \"_comment\": \"This file is used by PlatformIO to get the information it needs to use FlatBuffers as a dependency for a project.\",\n    \"name\": \"flatbuffers\",\n    \"version\": \"25.12.19\",\n    \"description\": \"FlatBuffers is a cross platform serialization library architected for maximum memory efficiency\",\n    \"keywords\": \"FlatBuffers, serialization\",\n    \"repository\": {\n      \"type\": \"git\",\n      \"url\": \"https://github.com/google/flatbuffers\"\n    },\n    \"authors\": [\n      {\n        \"name\": \"The FlatBuffers project\",\n        \"maintainer\": true\n      }\n    ],\n    \"license\": \"Apache-2.0\",\n    \"frameworks\": \"*\",\n    \"platforms\": \"*\",\n    \"build\": {\n      \"includeDir\": \"include\",\n      \"srcFilter\": \"-<*>\"\n    }\n}\n\n\n"
  },
  {
    "path": "lobster/flatbuffers.lobster",
    "content": "// Copyright 2018 Google Inc. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport std\n\nnamespace flatbuffers\n\nclass handle:\n    buf_:string\n    pos_:int\n\n// More strongly typed than a naked int, at no cost.\nstruct offset:\n    o:int\n\nenum sizeof:\n    sz_8 = 1\n    sz_16 = 2\n    sz_32 = 4\n    sz_64 = 8\n    sz_voffset = 2\n    sz_uoffset = 4\n    sz_soffset = 4\n    sz_metadata_fields = 2\n\nclass builder:\n    buf = \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\"\n    current_vtable:[int] = []\n    head = 0\n    minalign = 1\n    object_end = 0\n    vtables:[int] = []\n    nested = false\n    finished = false\n\n    // Optionally call this right after creating the builder for a larger initial buffer.\n    def Initial(initial_size:int):\n        buf = \"\\x00\".repeat_string(initial_size)\n\n    def Start():\n        // Get the start of useful data in the underlying byte buffer.\n        return buf.length - head\n\n    def Offset():\n        // Offset relative to the end of the buffer.\n        return offset { head }\n\n    // Returns a copy of the part of the buffer containing only the finished FlatBuffer\n    def SizedCopy():\n        assert finished\n        return buf.substring(Start(), -1)\n\n    def StartNesting():\n        assert not nested\n        nested = true\n\n    def EndNesting():\n        assert nested\n        nested = false\n\n    def StartObject(numfields):\n        StartNesting()\n        current_vtable = map(numfields): 0\n        object_end = head\n        minalign = 1\n\n    def EndObject():\n        EndNesting()\n        // Prepend a zero scalar to the object. Later in this function we'll\n        // write an offset here that points to the object's vtable:\n        PrependInt32(0)\n        let object_offset = head\n        // Write out new vtable speculatively.\n        let vtable_size = (current_vtable.length + sz_metadata_fields) * sz_voffset\n        while current_vtable.length:\n            let o = current_vtable.pop()\n            PrependVOffsetT(if o: object_offset - o else: 0)\n        // The two metadata fields are written last.\n        // First, store the object bytesize:\n        PrependVOffsetT(object_offset - object_end)\n        // Second, store the vtable bytesize:\n        PrependVOffsetT(vtable_size)\n        // Search backwards through existing vtables, because similar vtables\n        // are likely to have been recently appended. See\n        // BenchmarkVtableDeduplication for a case in which this heuristic\n        // saves about 30% of the time used in writing objects with duplicate\n        // tables.\n        def find_existing_table():\n            reverse(vtables) vt2_offset:\n                // Find the other vtable:\n                let vt2_start = buf.length - vt2_offset\n                let vt2_len = buf.read_int16_le(vt2_start)\n                // Compare the other vtable to the one under consideration.\n                // If they are equal, return the offset:\n                if vtable_size == vt2_len and\n                    not compare_substring(buf, Start(), buf, vt2_start, vtable_size):\n                        return vt2_offset\n            return 0\n        let existing_vtable = find_existing_table()\n        if existing_vtable:\n            // Found a duplicate vtable, remove the one we wrote.\n            head = object_offset\n            // Write the offset to the found vtable in the\n            // already-allocated offset at the beginning of this object:\n            buf.write_int32_le(Start(), existing_vtable - object_offset)\n        else:\n            // Did not find a vtable, so keep the one we wrote.\n            // Next, write the offset to the new vtable in the\n            // already-allocated offset at the beginning of this object:\n            buf.write_int32_le(buf.length - object_offset, head - object_offset)\n            // Finally, store this vtable in memory for future\n            // deduplication:\n            vtables.push(head)\n        return offset { object_offset }\n\n    def Pad(n):\n        for(n):\n            buf, head = buf.write_int8_le_back(head, 0)\n\n    def Prep(size, additional_bytes):\n        // Track the biggest thing we've ever aligned to.\n        if size > minalign:\n            minalign = size\n        // Find the amount of alignment needed such that `size` is properly\n        // aligned after `additionalBytes`:\n        let align_size = ((~(head + additional_bytes)) + 1) & (size - 1)\n        Pad(align_size)\n\n    def PrependUOffsetTRelative(off:offset):\n        // Prepends an unsigned offset into vector data, relative to where it will be written.\n        Prep(sz_uoffset, 0)\n        assert off.o <= head\n        PlaceUOffsetT(head - off.o + sz_uoffset)\n\n    def StartVector(elem_size, num_elems, alignment):\n        // Initializes bookkeeping for writing a new vector.\n        StartNesting()\n        Prep(sz_32, elem_size * num_elems)\n        Prep(alignment, elem_size * num_elems)  // In case alignment > int.\n        return Offset()\n\n    def EndVector(vector_num_elems):\n        EndNesting()\n        // we already made space for this, so write without PrependUint32\n        PlaceUOffsetT(vector_num_elems)\n        return Offset()\n\n    def CreateString(s:string):\n        // writes a null-terminated byte string.\n        StartNesting()\n        Prep(sz_32, s.length + 1)\n        buf, head = buf.write_substring_back(head, s, true)\n        return EndVector(s.length)\n\n    def CreateByteVector(s:string):\n        // writes a non-null-terminated byte string.\n        StartNesting()\n        Prep(sz_32, s.length)\n        buf, head = buf.write_substring_back(head, s, false)\n        return EndVector(s.length)\n\n    def Slot(slotnum):\n        assert nested\n        while current_vtable.length <= slotnum: current_vtable.push(0)\n        current_vtable[slotnum] = head\n\n    def __Finish(root_table:offset, size_prefix:int, file_identifier:string?):\n        // Finish finalizes a buffer, pointing to the given root_table\n        assert not finished\n        assert not nested\n        var prep_size = sz_32\n        if file_identifier:\n            prep_size += sz_32\n        if size_prefix:\n            prep_size += sz_32\n        Prep(minalign, prep_size)\n        if file_identifier:\n            assert file_identifier.length == 4\n            buf, head = buf.write_substring_back(head, file_identifier, false)\n        PrependUOffsetTRelative(root_table)\n        if size_prefix:\n            PrependInt32(head)\n        finished = true\n        return Start()\n\n    def Finish(root_table:offset, file_identifier:string? = nil):\n        return __Finish(root_table, false, file_identifier)\n\n    def FinishSizePrefixed(root_table:offset, file_identifier:string? = nil):\n        return __Finish(root_table, true, file_identifier)\n\n    def PrependBool(x):\n        buf, head = buf.write_int8_le_back(head, x)\n\n    def PrependByte(x):\n        buf, head = buf.write_int8_le_back(head, x)\n\n    def PrependUint8(x):\n        buf, head = buf.write_int8_le_back(head, x)\n\n    def PrependUint16(x):\n        Prep(sz_16, 0)\n        buf, head = buf.write_int16_le_back(head, x)\n\n    def PrependUint32(x):\n        Prep(sz_32, 0)\n        buf, head = buf.write_int32_le_back(head, x)\n\n    def PrependUint64(x):\n        Prep(sz_64, 0)\n        buf, head = buf.write_int64_le_back(head, x)\n\n    def PrependInt8(x):\n        buf, head = buf.write_int8_le_back(head, x)\n\n    def PrependInt16(x):\n        Prep(sz_16, 0)\n        buf, head = buf.write_int16_le_back(head, x)\n\n    def PrependInt32(x):\n        Prep(sz_32, 0)\n        buf, head = buf.write_int32_le_back(head, x)\n\n    def PrependInt64(x):\n        Prep(sz_64, 0)\n        buf, head = buf.write_int64_le_back(head, x)\n\n    def PrependFloat32(x):\n        Prep(sz_32, 0)\n        buf, head = buf.write_float32_le_back(head, x)\n\n    def PrependFloat64(x):\n        Prep(sz_64, 0)\n        buf, head = buf.write_float64_le_back(head, x)\n\n    def PrependVOffsetT(x):\n        Prep(sz_voffset, 0)\n        buf, head = buf.write_int16_le_back(head, x)\n\n    def PlaceVOffsetT(x):\n        buf, head = buf.write_int16_le_back(head, x)\n\n    def PlaceSOffsetT(x):\n        buf, head = buf.write_int32_le_back(head, x)\n\n    def PlaceUOffsetT(x):\n        buf, head = buf.write_int32_le_back(head, x)\n\n    def PrependSlot(o:int, x, d, f):\n        if x != d:\n            f(x)\n            Slot(o)\n\n    def PrependSlot(o:int, x, f):\n        f(x)\n        Slot(o)\n\n    def PrependBoolSlot(o, x, d): PrependSlot(o, x, d): PrependBool(_)\n    def PrependByteSlot(o, x, d): PrependSlot(o, x, d): PrependByte(_)\n    def PrependUint8Slot(o, x, d): PrependSlot(o, x, d): PrependUint8(_)\n    def PrependUint16Slot(o, x, d): PrependSlot(o, x, d): PrependUint16(_)\n    def PrependUint32Slot(o, x, d): PrependSlot(o, x, d): PrependUint32(_)\n    def PrependUint64Slot(o, x, d): PrependSlot(o, x, d): PrependUint64(_)\n    def PrependInt8Slot(o, x, d): PrependSlot(o, x, d): PrependInt8(_)\n    def PrependInt16Slot(o, x, d): PrependSlot(o, x, d): PrependInt16(_)\n    def PrependInt32Slot(o, x, d): PrependSlot(o, x, d): PrependInt32(_)\n    def PrependInt64Slot(o, x, d): PrependSlot(o, x, d): PrependInt64(_)\n    def PrependFloat32Slot(o, x, d): PrependSlot(o, x, d): PrependFloat32(_)\n    def PrependFloat64Slot(o, x, d): PrependSlot(o, x, d): PrependFloat64(_)\n\n    def PrependBoolSlot(o, x): PrependSlot(o, x): PrependBool(_)\n    def PrependByteSlot(o, x): PrependSlot(o, x): PrependByte(_)\n    def PrependUint8Slot(o, x): PrependSlot(o, x): PrependUint8(_)\n    def PrependUint16Slot(o, x): PrependSlot(o, x): PrependUint16(_)\n    def PrependUint32Slot(o, x): PrependSlot(o, x): PrependUint32(_)\n    def PrependUint64Slot(o, x): PrependSlot(o, x): PrependUint64(_)\n    def PrependInt8Slot(o, x): PrependSlot(o, x): PrependInt8(_)\n    def PrependInt16Slot(o, x): PrependSlot(o, x): PrependInt16(_)\n    def PrependInt32Slot(o, x): PrependSlot(o, x): PrependInt32(_)\n    def PrependInt64Slot(o, x): PrependSlot(o, x): PrependInt64(_)\n    def PrependFloat32Slot(o, x): PrependSlot(o, x): PrependFloat32(_)\n    def PrependFloat64Slot(o, x): PrependSlot(o, x): PrependFloat64(_)\n\n    def PrependUOffsetTRelativeSlot(o:int, x:offset):\n        if x.o:\n            PrependUOffsetTRelative(x)\n            Slot(o)\n\n    def PrependStructSlot(v:int, x:offset):\n        if x.o:\n            // Structs are always stored inline, so need to be created right\n            // where they are used. You'll get this error if you created it\n            // elsewhere.\n            assert x.o == head\n            Slot(v)\n\ndef has_identifier(buf:string, file_identifier:string):\n    assert file_identifier.length == 4\n    return buf.length >= 8 and buf.substring(4, 4) == file_identifier\n\n\n"
  },
  {
    "path": "lua/flatbuffers/binaryarray.lua",
    "content": "local compat = require(\"flatbuffers.compat\")\n-- locals for slightly faster access\nlocal string_pack = compat.string_pack\nlocal string_unpack = compat.string_unpack\n\n\nlocal m = {} -- the module table\n\nlocal mt = {} -- the module metatable\n\n-- given a binary array, set a metamethod to return its length\n-- (e.g., #binaryArray, calls this)\nfunction mt:__len()\n    return self.size\nend\n\n-- Create a new binary array of an initial size\nfunction m.New(sizeOrString)\n    -- the array storage itself\n    local o = {}\n    \n    if type(sizeOrString) == \"string\" then\n        o.str = sizeOrString\n        o.size = #sizeOrString\n    elseif type(sizeOrString) == \"number\" then\n        o.data = {}\n        o.size = sizeOrString\n    else\n        error(\"Expect a integer size value or string to construct a binary array\")\n    end\n    -- set the inheritance\n    setmetatable(o, {__index = mt, __len = mt.__len})\n    return o\nend\n\n-- Get a slice of the binary array from start to end position\nfunction mt:Slice(startPos, endPos)\n    startPos = startPos or 0\n    endPos = endPos or self.size\n    local d = self.data\n    if d then\n        -- if the self.data is defined, we are building the buffer\n        -- in a Lua table\n        \n        -- new table to store the slice components\n        local b = {}\n        \n        -- starting with the startPos, put all\n        -- values into the new table to be concat later\n        -- updated the startPos based on the size of the\n        -- value\n        while startPos < endPos do\n            local v = d[startPos]\n            if not v or v == \"\" then\n                v = '/0'\n            end\n            table.insert(b, v)\n            startPos = startPos + #v\n        end\n\n        -- combine the table of strings into one string\n        -- this is faster than doing a bunch of concats by themselves\n        return table.concat(b)\n    else\n        -- n.b start/endPos are 0-based incoming, so need to convert\n        --     correctly. in python a slice includes start -> end - 1\n        return self.str:sub(startPos+1, endPos)\n    end\nend\n\n-- Grow the binary array to a new size, placing the exisiting data\n-- at then end of the new array\nfunction mt:Grow(newsize)\n    -- the new table to store the data\n    local newT = {}\n    \n    -- the offset to be applied to existing entries\n    local offset = newsize - self.size\n    \n    -- loop over all the current entries and\n    -- add them to the new table at the correct\n    -- offset location\n    local d = self.data\n    for i,data in pairs(d) do\n        newT[i + offset] = data\n    end\n    \n    -- update this storage with the new table and size\n    self.data = newT\n    self.size = newsize\nend\n\n-- memorization for padding strings\nlocal pads = {}\n\n-- pad the binary with n \\0 bytes at the starting position\nfunction mt:Pad(n, startPos)\n    -- use memorization to avoid creating a bunch of strings\n    -- all the time\n    local s = pads[n]\n    if not s then\n        s = string.rep('\\0', n)\n        pads[n] = s\n    end\n    \n    -- store the padding string at the start position in the\n    -- Lua table\n    self.data[startPos] = s\nend\n\n-- Sets the binary array value at the specified position\nfunction mt:Set(value, position)\n    self.data[position] = value\nend\n\n-- Pack the data into a binary representation\nfunction m.Pack(fmt, ...)\n    return string_pack(fmt, ...)\nend\n\n-- Unpack the data from a binary representation in\n-- a Lua value\nfunction m.Unpack(fmt, s, pos)\n    return string_unpack(fmt, s.str, pos + 1)\nend\n\n-- Return the binary array module\nreturn m"
  },
  {
    "path": "lua/flatbuffers/builder.lua",
    "content": "local N = require(\"flatbuffers.numTypes\")\nlocal ba = require(\"flatbuffers.binaryarray\")\nlocal compat = require(\"flatbuffers.compat\")\nlocal string_unpack = compat.string_unpack\n\nlocal m = {}\n\nlocal mt = {}\n\n-- get locals for faster access\nlocal VOffsetT  = N.VOffsetT\nlocal UOffsetT  = N.UOffsetT\nlocal SOffsetT  = N.SOffsetT\nlocal Bool      = N.Bool\nlocal Uint8     = N.Uint8\nlocal Uint16    = N.Uint16\nlocal Uint32    = N.Uint32\nlocal Uint64    = N.Uint64\nlocal Int8      = N.Int8\nlocal Int16     = N.Int16\nlocal Int32     = N.Int32\nlocal Int64     = N.Int64\nlocal Float32   = N.Float32\nlocal Float64   = N.Float64\n\nlocal MAX_BUFFER_SIZE = 0x80000000 -- 2 GB\nlocal VtableMetadataFields = 2\n\nlocal getAlignSize = compat.GetAlignSize\n\nlocal function vtableEqual(a, objectStart, b)\n    UOffsetT:EnforceNumber(objectStart)\n    if (#a * 2) ~= #b then\n        return false\n    end\n\n    for i, elem in ipairs(a) do\n        local x = string_unpack(VOffsetT.packFmt, b, 1 + (i - 1) * 2)\n        if x ~= 0 or elem ~= 0 then\n            local y = objectStart - elem\n            if x ~= y then\n                return false\n            end\n        end\n    end\n    return true\nend\n\nfunction m.New(initialSize)\n    assert(0 <= initialSize and initialSize < MAX_BUFFER_SIZE)\n    local o =\n    {\n        finished = false,\n        bytes = ba.New(initialSize),\n        nested = false,\n        head = initialSize,\n        minalign = 1,\n        vtables = {}\n    }\n    setmetatable(o, {__index = mt})\n    return o\nend\n\n-- Clears the builder and resets the state. It does not actually clear the backing binary array, it just reuses it as\n-- needed. This is a performant way to use the builder for multiple constructions without the overhead of multiple\n-- builder allocations.\nfunction mt:Clear()\n    self.finished = false\n    self.nested = false\n    self.minalign = 1\n    self.currentVTable = nil\n    self.objectEnd = nil\n    self.head = self.bytes.size -- place the head at the end of the binary array\n\n    -- clear vtables instead of making a new table\n    local vtable = self.vtables\n    local vtableCount = #vtable\n    for i=1,vtableCount do vtable[i] = nil end\nend\n\nfunction mt:Output(full)\n    assert(self.finished, \"Builder Not Finished\")\n    if full then\n        return self.bytes:Slice()\n    else\n        return self.bytes:Slice(self.head)\n    end\nend\n\nfunction mt:StartObject(numFields)\n    assert(not self.nested)\n\n    local vtable = {}\n\n    for _=1,numFields do\n        table.insert(vtable, 0)\n    end\n\n    self.currentVTable = vtable\n    self.objectEnd = self:Offset()\n    self.nested = true\nend\n\nfunction mt:WriteVtable()\n    self:PrependSOffsetTRelative(0)\n    local objectOffset = self:Offset()\n\n    local exisitingVTable\n    local i = #self.vtables\n    while i >= 1 do\n        if self.vtables[i] == 0 then\n            table.remove(self.vtables,i)\n        end\n        i = i - 1\n    end\n\n    i = #self.vtables\n    while i >= 1 do\n\n        local vt2Offset = self.vtables[i]\n        local vt2Start = self.bytes.size - vt2Offset\n        local vt2lenstr = self.bytes:Slice(vt2Start, vt2Start+1)\n        local vt2Len = string_unpack(VOffsetT.packFmt, vt2lenstr, 1)\n\n        local metadata = VtableMetadataFields * 2\n        local vt2End = vt2Start + vt2Len\n        local vt2 = self.bytes:Slice(vt2Start+metadata,vt2End)\n\n        if vtableEqual(self.currentVTable, objectOffset, vt2) then\n            exisitingVTable = vt2Offset\n            break\n        end\n\n        i = i - 1\n    end\n\n    if not exisitingVTable then\n        i = #self.currentVTable\n        while i >= 1 do\n            local off = 0\n            local a = self.currentVTable[i]\n            if a and a ~= 0 then\n                off = objectOffset - a\n            end\n            self:PrependVOffsetT(off)\n\n            i = i - 1\n        end\n\n        local objectSize = objectOffset - self.objectEnd\n        self:PrependVOffsetT(objectSize)\n\n        local vBytes = #self.currentVTable + VtableMetadataFields\n        vBytes = vBytes * 2\n        self:PrependVOffsetT(vBytes)\n\n        local objectStart = self.bytes.size - objectOffset\n        self.bytes:Set(SOffsetT:Pack(self:Offset() - objectOffset),objectStart)\n\n        table.insert(self.vtables, self:Offset())\n    else\n        local objectStart = self.bytes.size - objectOffset\n        self.head = objectStart\n        self.bytes:Set(SOffsetT:Pack(exisitingVTable - objectOffset),self.head)\n    end\n\n    self.currentVTable = nil\n    return objectOffset\nend\n\nfunction mt:EndObject()\n    assert(self.nested)\n    self.nested = false\n    return self:WriteVtable()\nend\n\nlocal function growByteBuffer(self, desiredSize)\n    local s = self.bytes.size\n    assert(s < MAX_BUFFER_SIZE, \"Flat Buffers cannot grow buffer beyond 2 gigabytes\")\n    local newsize = s\n    repeat\n        newsize = math.min(newsize * 2, MAX_BUFFER_SIZE)\n        if newsize == 0 then newsize = 1 end\n    until newsize > desiredSize\n\n    self.bytes:Grow(newsize)\nend\n\nfunction mt:Head()\n    return self.head\nend\n\nfunction mt:Offset()\n   return self.bytes.size - self.head\nend\n\nfunction mt:Pad(n)\n    if n > 0 then\n        -- pads are 8-bit, so skip the bytewidth lookup\n        local h = self.head - n  -- UInt8\n        self.head = h\n        self.bytes:Pad(n, h)\n    end\nend\n\nfunction mt:Prep(size, additionalBytes)\n    if size > self.minalign then\n        self.minalign = size\n    end\n\n    local h = self.head\n\n    local k = self.bytes.size - h + additionalBytes\n    local alignsize = getAlignSize(k, size)\n\n    local desiredSize = alignsize + size + additionalBytes\n\n    while self.head < desiredSize do\n        local oldBufSize = self.bytes.size\n        growByteBuffer(self, desiredSize)\n        local updatedHead = self.head + self.bytes.size - oldBufSize\n        self.head = updatedHead\n    end\n\n    self:Pad(alignsize)\nend\n\nfunction mt:PrependSOffsetTRelative(off)\n    self:Prep(4, 0)\n    assert(off <= self:Offset(), \"Offset arithmetic error\")\n    local off2 = self:Offset() - off + 4\n    self:Place(off2, SOffsetT)\nend\n\nfunction mt:PrependUOffsetTRelative(off)\n    self:Prep(4, 0)\n    local soffset = self:Offset()\n    if off <= soffset then\n        local off2 = soffset - off + 4\n        self:Place(off2, UOffsetT)\n    else\n        error(\"Offset arithmetic error\")\n    end\nend\n\nfunction mt:StartVector(elemSize, numElements, alignment)\n    assert(not self.nested)\n    self.nested = true\n    local elementSize = elemSize * numElements\n    self:Prep(4, elementSize) -- Uint32 length\n    self:Prep(alignment, elementSize)\n    return self:Offset()\nend\n\nfunction mt:EndVector(vectorNumElements)\n    assert(self.nested)\n    self.nested = false\n    self:Place(vectorNumElements, UOffsetT)\n    return self:Offset()\nend\n\nfunction mt:CreateString(s)\n    assert(not self.nested)\n    self.nested = true\n\n    assert(type(s) == \"string\")\n\n    self:Prep(4, #s + 1)\n    self:Place(0, Uint8)\n\n    local l = #s\n    self.head = self.head - l\n\n    self.bytes:Set(s, self.head, self.head + l)\n\n    return self:EndVector(l)\nend\n\nfunction mt:CreateByteVector(x)\n    assert(not self.nested)\n    self.nested = true\n\n    local l = #x\n    self:Prep(4, l)\n\n    self.head = self.head - l\n\n    self.bytes:Set(x, self.head, self.head + l)\n\n    return self:EndVector(l)\nend\n\nfunction mt:Slot(slotnum)\n    assert(self.nested)\n    -- n.b. slot number is 0-based\n    self.currentVTable[slotnum + 1] = self:Offset()\nend\n\nlocal function finish(self, rootTable, sizePrefix, fileIdentifier)\n    UOffsetT:EnforceNumber(rootTable)\n    local hasFid = fileIdentifier ~= nil\n    if hasFid then\n        assert(#fileIdentifier == 4, \"File identifier must be exactly 4 bytes\")\n    end\n\n    local fid_byte_count = (hasFid and 4 or 0)\n\n    -- alignment:\n    -- root offset (4)\n    -- optional file id (4)\n    -- optional size prefix (4)\n    self:Prep(\n        self.minalign,\n        (sizePrefix and 4 or 0) +\n        4 +\n        fid_byte_count\n    )\n\n    -- root offset (points past file identifier if present)\n    self:PrependUOffsetTRelative(rootTable + fid_byte_count)\n\n    -- file identifier\n    if hasFid then\n        for i = 4, 1, -1 do\n            self:PrependByte(string.byte(fileIdentifier, i))\n        end\n    end\n\n    -- size prefix\n    if sizePrefix then\n        local size = self.bytes.size - self.head\n        Int32:EnforceNumber(size)\n        self:PrependInt32(size)\n    end\n\n    self.finished = true\n    return self.head\nend\n\n\nfunction mt:Finish(rootTable)\n    return finish(self, rootTable, false, nil)\nend\n\nfunction mt:FinishSizePrefixed(rootTable)\n    return finish(self, rootTable, true, nil)\nend\n\nfunction mt:FinishWithIdentifier(rootTable, fileIdentifier)\n    return finish(self, rootTable, false, fileIdentifier)\nend\n\nfunction mt:FinishSizePrefixedWithIdentifier(rootTable, fileIdentifier)\n    return finish(self, rootTable, true, fileIdentifier)\nend\n\nfunction mt:Prepend(flags, off)\n    self:Prep(flags.bytewidth, 0)\n    self:Place(off, flags)\nend\n\nfunction mt:PrependSlot(flags, o, x, d)\n    flags:EnforceNumbers(x,d)\n--    flags:EnforceNumber(x)\n--    flags:EnforceNumber(d)\n    if x ~= d then\n        self:Prepend(flags, x)\n        self:Slot(o)\n    end\nend\n\nfunction mt:PrependBoolSlot(...)    self:PrependSlot(Bool, ...) end\nfunction mt:PrependByteSlot(...)    self:PrependSlot(Uint8, ...) end\nfunction mt:PrependUint8Slot(...)   self:PrependSlot(Uint8, ...) end\nfunction mt:PrependUint16Slot(...)  self:PrependSlot(Uint16, ...) end\nfunction mt:PrependUint32Slot(...)  self:PrependSlot(Uint32, ...) end\nfunction mt:PrependUint64Slot(...)  self:PrependSlot(Uint64, ...) end\nfunction mt:PrependInt8Slot(...)    self:PrependSlot(Int8, ...) end\nfunction mt:PrependInt16Slot(...)   self:PrependSlot(Int16, ...) end\nfunction mt:PrependInt32Slot(...)   self:PrependSlot(Int32, ...) end\nfunction mt:PrependInt64Slot(...)   self:PrependSlot(Int64, ...) end\nfunction mt:PrependFloat32Slot(...) self:PrependSlot(Float32, ...) end\nfunction mt:PrependFloat64Slot(...) self:PrependSlot(Float64, ...) end\n\nfunction mt:PrependUOffsetTRelativeSlot(o,x,d)\n    if x~=d then\n        self:PrependUOffsetTRelative(x)\n        self:Slot(o)\n    end\nend\n\nfunction mt:PrependStructSlot(v,x,d)\n    UOffsetT:EnforceNumber(d)\n    if x~=d then\n        UOffsetT:EnforceNumber(x)\n        assert(x == self:Offset(), \"Tried to write a Struct at an Offset that is different from the current Offset of the Builder.\")\n        self:Slot(v)\n    end\nend\n\nfunction mt:PrependBool(x)      self:Prepend(Bool, x) end\nfunction mt:PrependByte(x)      self:Prepend(Uint8, x) end\nfunction mt:PrependUint8(x)     self:Prepend(Uint8, x) end\nfunction mt:PrependUint16(x)    self:Prepend(Uint16, x) end\nfunction mt:PrependUint32(x)    self:Prepend(Uint32, x) end\nfunction mt:PrependUint64(x)    self:Prepend(Uint64, x) end\nfunction mt:PrependInt8(x)      self:Prepend(Int8, x) end\nfunction mt:PrependInt16(x)     self:Prepend(Int16, x) end\nfunction mt:PrependInt32(x)     self:Prepend(Int32, x) end\nfunction mt:PrependInt64(x)     self:Prepend(Int64, x) end\nfunction mt:PrependFloat32(x)   self:Prepend(Float32, x) end\nfunction mt:PrependFloat64(x)   self:Prepend(Float64, x) end\nfunction mt:PrependVOffsetT(x)  self:Prepend(VOffsetT, x) end\n\nfunction mt:Place(x, flags)\n    local d = flags:EnforceNumberAndPack(x)\n    local h = self.head - flags.bytewidth\n    self.head = h\n    self.bytes:Set(d, h)\nend\n\nreturn m\n"
  },
  {
    "path": "lua/flatbuffers/compat.lua",
    "content": "local compats = {\n    [\"Lua 5.1\"] = function()  \n        -- Check if Lua JIT is installed first\n        local ok = pcall(require, \"jit\")\n        if not ok then\n            return require(\"flatbuffers.compat_5_1\")\n        else\n            return require(\"flatbuffers.compat_luajit\")\n        end\n    end,\n    [\"Lua 5.2\"] = function() return require(\"flatbuffers.compat_5_1\") end,\n    [\"Lua 5.3\"] = function() return require(\"flatbuffers.compat_5_3\") end,\n    [\"Lua 5.4\"] = function() return require(\"flatbuffers.compat_5_3\") end,\n}\nreturn assert(compats[_VERSION], \"Unsupported Lua Version: \".._VERSION)()"
  },
  {
    "path": "lua/flatbuffers/compat_5_1.lua",
    "content": "local m = {}\nlocal ok, bit = pcall(require, \"bit32\")\nassert(ok, \"The Bit32 library must be installed\")\nassert(pcall(require, \"compat53\"), \"The Compat 5.3 library must be installed\")\n\nm.GetAlignSize = function(k, size)\n    return bit.band(bit.bnot(k) + 1,(size - 1))\nend\n\nif not table.unpack then\n    table.unpack = unpack\nend\n\nif not table.pack then\n    table.pack = pack\nend\n\nm.string_pack = string.pack\nm.string_unpack = string.unpack\n\nreturn m\n"
  },
  {
    "path": "lua/flatbuffers/compat_5_3.lua",
    "content": "-- We need to put it into a separate file to avoid syntax error like `unexpected symbol near '~'`\nlocal m = {}\n\n\nm.GetAlignSize = function(k, size)\n    return ((~k) + 1) & (size - 1)\nend\n\n\nm.string_pack = string.pack\nm.string_unpack = string.unpack\n\n\nreturn m\n"
  },
  {
    "path": "lua/flatbuffers/compat_luajit.lua",
    "content": "local bit = require(\"bit\")\nlocal ffi = require(\"ffi\")\nlocal band = bit.band\nlocal bnot = bit.bnot\n\n\nlocal m = {}\nlocal Uint8Bound = 256 -- bound is the max uintN + 1\nlocal Uint16Bound = 65536\nlocal Uint32Bound = 4294967296\n\nif not table.unpack then\n    table.unpack = unpack\nend\n\nif not table.pack then\n    table.pack = pack\nend\n\nm.GetAlignSize = function(k, size)\n    return band((bnot(k) + 1), (size - 1))\nend\n\n\nlocal function pack_I1(n)\n    return string.char(n)\nend\nlocal function pack_i1(n)\n    if n < 0 then\n        n = Uint8Bound + n\n    end\n    return pack_I1(n)\nend\n\nlocal function unpack_I1(n, pos)\n    return string.byte(n, pos)\nend\nlocal function unpack_i1(n, pos)\n    local res = unpack_I1(n, pos)\n    if res >= Uint8Bound / 2 then\n        return res - Uint8Bound\n    end\n    return res\nend\n\nlocal b2 = ffi.new(\"unsigned char[2]\")\nlocal function pack_I2(n)\n    for i = 0, 1 do\n        b2[i] = bit.band(n, 255)\n        n = bit.rshift(n, 8)\n    end\n    return ffi.string(b2, 2)\nend\nlocal function pack_i2(n)\n    if n < 0 then\n        n = Uint16Bound + n\n    end\n    return pack_I2(n)\nend\n\nlocal function unpack_I2(n, pos)\n    local a, b = string.byte(n, pos, pos + 1)\n    return b * Uint8Bound + a\nend\nlocal function unpack_i2(n, pos)\n    local res = unpack_I2(n, pos)\n    if res >= Uint16Bound / 2 then\n        return res - Uint16Bound\n    end\n    return res\nend\n\nlocal b4 = ffi.new(\"unsigned char[4]\")\nlocal function pack_I4(n)\n    for i = 0, 3 do\n        b4[i] = bit.band(n, 255)\n        n = bit.rshift(n, 8)\n    end\n    return ffi.string(b4, 4)\nend\nlocal function pack_i4(n)\n    if n < 0 then\n        n = Uint32Bound + n\n    end\n    return pack_I4(n)\nend\n\nlocal function unpack_I4(n, pos)\n    local a, b, c, d = string.byte(n, pos, pos + 3)\n    return Uint8Bound * (Uint8Bound * ((Uint8Bound * d) + c) + b) + a\nend\nlocal function unpack_i4(n, pos)\n    local res = unpack_I4(n, pos)\n    if res >= Uint32Bound / 2 then\n        return res - Uint32Bound\n    end\n    return res\nend\n\nlocal b8 = ffi.new(\"unsigned char[8]\")\nlocal function pack_I8(n)\n    n = ffi.cast(\"unsigned long long\", n)\n    local hi = math.floor(tonumber(n / Uint32Bound))\n    local li = n % Uint32Bound\n    for i = 0, 3 do\n        b8[i] = bit.band(li, 255)\n        li = bit.rshift(li, 8)\n    end\n    for i = 4, 7 do\n        b8[i] = bit.band(hi, 255)\n        hi = bit.rshift(hi, 8)\n    end\n    return ffi.string(b8, 8)\nend\nlocal function pack_i8(n)\n    n = ffi.cast(\"signed long long\", n)\n    return pack_I8(n)\nend\n\nlocal function unpack_I8(n, pos)\n    local a, b, c, d = string.byte(n, pos, pos + 3)\n    local li = Uint8Bound * (Uint8Bound * ((Uint8Bound * d) + c) + b) + a\n    local a, b, c, d = string.byte(n, pos + 4, pos + 7)\n    local hi = Uint8Bound * (Uint8Bound * ((Uint8Bound * d) + c) + b) + a\n    return ffi.cast(\"unsigned long long\", hi) * Uint32Bound + li\nend\nlocal function unpack_i8(n, pos)\n    local res = unpack_I8(n, pos)\n    return ffi.cast(\"signed long long\", res)\nend\n\nlocal bf = ffi.new(\"float[1]\")\nlocal function pack_f(n)\n    bf[0] = n\n    return ffi.string(bf, 4)\nend\n\nlocal function unpack_f(n, pos)\n    ffi.copy(bf, ffi.cast(\"char *\", n) + pos - 1, 4)\n    return tonumber(bf[0])\nend\n\nlocal bd = ffi.new(\"double[1]\")\nlocal function pack_d(n)\n    bd[0] = n\n    return ffi.string(bd, 8)\nend\n\nlocal function unpack_d(n, pos)\n    ffi.copy(bd, ffi.cast(\"char *\", n) + pos - 1, 8)\n    return tonumber(bd[0])\nend\n\n\nm.string_pack = function(fmt, i, ...)\n    if fmt == \"<I1\" then\n        return pack_I1(i)\n    elseif fmt == \"<I2\" then\n        return pack_I2(i)\n    elseif fmt == \"<I4\" then\n        return pack_I4(i)\n    elseif fmt == \"<I8\" then\n        return pack_I8(i)\n    elseif fmt == \"<i1\" then\n        return pack_i1(i)\n    elseif fmt == \"<i2\" then\n        return pack_i2(i)\n    elseif fmt == \"<i4\" then\n        return pack_i4(i)\n    elseif fmt == \"<i8\" then\n        return pack_i8(i)\n    elseif fmt == \"<f\" then\n        return pack_f(i)\n    elseif fmt == \"<d\" then\n        return pack_d(i)\n    else\n        error(string.format(\"FIXME: support fmt %s\", fmt))\n    end\nend\n\n\nm.string_unpack = function(fmt, s, pos)\n    if not pos then\n        pos = 1\n    end\n\n    if fmt == \"<I1\" then\n        return unpack_I1(s, pos)\n    elseif fmt == \"<I2\" then\n        return unpack_I2(s, pos)\n    elseif fmt == \"<I4\" then\n        return unpack_I4(s, pos)\n    elseif fmt == \"<I8\" then\n        return unpack_I8(s, pos)\n    elseif fmt == \"<i1\" then\n        return unpack_i1(s, pos)\n    elseif fmt == \"<i2\" then\n        return unpack_i2(s, pos)\n    elseif fmt == \"<i4\" then\n        return unpack_i4(s, pos)\n    elseif fmt == \"<i8\" then\n        return unpack_i8(s, pos)\n    elseif fmt == \"<f\" then\n        return unpack_f(s, pos)\n    elseif fmt == \"<d\" then\n        return unpack_d(s, pos)\n    else\n        error(string.format(\"FIXME: support fmt %s\", fmt))\n    end\nend\n\n\nreturn m\n"
  },
  {
    "path": "lua/flatbuffers/numTypes.lua",
    "content": "local m = {}\n\nlocal ba = require(\"flatbuffers.binaryarray\")\n\nlocal bpack = ba.Pack\nlocal bunpack = ba.Unpack\n\nlocal type_mt =  {}\n\nfunction type_mt:Pack(value)\n    return bpack(self.packFmt, value)\nend\n\nfunction type_mt:Unpack(buf, pos)    \n    return bunpack(self.packFmt, buf, pos)\nend\n\nfunction type_mt:ValidNumber(n)\n    if not self.min_value and not self.max_value then return true end\n    return self.min_value <= n and n <= self.max_value\nend\n\nfunction type_mt:EnforceNumber(n)\n    -- duplicate code since the overhead of function calls \n    -- for such a popular method is time consuming\n    if not self.min_value and not self.max_value then \n        return \n    end\n    \n    if self.min_value <= n and n <= self.max_value then \n        return\n    end    \n    \n    error(\"Number is not in the valid range\") \nend\n\nfunction type_mt:EnforceNumbers(a,b)\n   -- duplicate code since the overhead of function calls\n    -- for such a popular method is time consuming\n    if not self.min_value and not self.max_value then\n        return\n    end\n\n    if self.min_value <= a and a <= self.max_value and self.min_value <= b and b <= self.max_value then\n        return\n    end\n\n    error(\"Number is not in the valid range\")\nend\n\nfunction type_mt:EnforceNumberAndPack(n)\n    return bpack(self.packFmt, n)    \nend\n\nfunction type_mt:ConvertType(n, otherType)\n    assert(self.bytewidth == otherType.bytewidth, \"Cannot convert between types of different widths\")\n    if self == otherType then\n        return n\n    end\n    return otherType:Unpack(self:Pack(n))\nend\n\nlocal bool_mt =\n{\n    bytewidth = 1,\n    min_value = false,\n    max_value = true,\n    lua_type = type(true),\n    name = \"bool\",\n    packFmt = \"<I1\",\n    Pack = function(self, value) return value and \"1\" or \"0\" end,\n    Unpack = function(self, buf, pos) return buf[pos] == \"1\" end,\n    ValidNumber = function(self, n) return true end, -- anything is a valid boolean in Lua\n    EnforceNumber = function(self, n) end, -- anything is a valid boolean in Lua\n    EnforceNumbers = function(self, a, b) end, -- anything is a valid boolean in Lua\n    EnforceNumberAndPack = function(self, n) return self:Pack(n) end,\n}\n\nlocal uint8_mt = \n{\n    bytewidth = 1,\n    min_value = 0,\n    max_value = 2^8-1,\n    lua_type = type(1),\n    name = \"uint8\",\n    packFmt = \"<I1\"\n}\n\nlocal uint16_mt = \n{\n    bytewidth = 2,\n    min_value = 0,\n    max_value = 2^16-1,\n    lua_type = type(1),\n    name = \"uint16\",\n    packFmt = \"<I2\"\n}\n\nlocal uint32_mt = \n{\n    bytewidth = 4,\n    min_value = 0,\n    max_value = 2^32-1,\n    lua_type = type(1),\n    name = \"uint32\",\n    packFmt = \"<I4\"\n}\n\nlocal uint64_mt = \n{\n    bytewidth = 8,\n    min_value = 0,\n    max_value = 2^64-1,\n    lua_type = type(1),\n    name = \"uint64\",\n    packFmt = \"<I8\"\n}\n\nlocal int8_mt = \n{\n    bytewidth = 1,\n    min_value = -2^7,\n    max_value = 2^7-1,\n    lua_type = type(1),\n    name = \"int8\",\n    packFmt = \"<i1\"\n}\n\nlocal int16_mt = \n{\n    bytewidth = 2,\n    min_value = -2^15,\n    max_value = 2^15-1,\n    lua_type = type(1),\n    name = \"int16\",\n    packFmt = \"<i2\"\n}\n\nlocal int32_mt = \n{\n    bytewidth = 4,\n    min_value = -2^31,\n    max_value = 2^31-1,\n    lua_type = type(1),\n    name = \"int32\",\n    packFmt = \"<i4\"\n}\n\nlocal int64_mt = \n{\n    bytewidth = 8,\n    min_value = -2^63,\n    max_value = 2^63-1,\n    lua_type = type(1),\n    name = \"int64\",\n    packFmt = \"<i8\"\n}\n\nlocal float32_mt = \n{\n    bytewidth = 4,\n    min_value = nil,\n    max_value = nil,\n    lua_type = type(1.0),\n    name = \"float32\",\n    packFmt = \"<f\"\n}\n\nlocal float64_mt = \n{\n    bytewidth = 8,\n    min_value = nil,\n    max_value = nil,\n    lua_type = type(1.0),\n    name = \"float64\",\n    packFmt = \"<d\"\n}\n\n-- register the base class\nsetmetatable(bool_mt, {__index = type_mt})\nsetmetatable(uint8_mt, {__index = type_mt})\nsetmetatable(uint16_mt, {__index = type_mt})\nsetmetatable(uint32_mt, {__index = type_mt})\nsetmetatable(uint64_mt, {__index = type_mt})\nsetmetatable(int8_mt, {__index = type_mt})\nsetmetatable(int16_mt, {__index = type_mt})\nsetmetatable(int32_mt, {__index = type_mt})\nsetmetatable(int64_mt, {__index = type_mt})\nsetmetatable(float32_mt, {__index = type_mt})\nsetmetatable(float64_mt, {__index = type_mt})\n\n\nm.Uint8     = uint8_mt\nm.Uint16    = uint16_mt\nm.Uint32    = uint32_mt\nm.Uint64    = uint64_mt\nm.Int8      = int8_mt\nm.Int16     = int16_mt\nm.Int32     = int32_mt\nm.Int64     = int64_mt\nm.Float32   = float32_mt\nm.Float64   = float64_mt\n\nm.UOffsetT  = uint32_mt\nm.VOffsetT  = uint16_mt\nm.SOffsetT  = int32_mt\n\nlocal GenerateTypes = function(listOfTypes)\n    for _,t in pairs(listOfTypes) do\n        t.Pack = function(self, value) return bpack(self.packFmt, value) end\n        t.Unpack = function(self, buf, pos) return bunpack(self.packFmt, buf, pos) end\n    end\nend\n\nGenerateTypes(m)\n\n-- explicitly execute after GenerateTypes call, as we don't want to define a Pack/Unpack function for it.\nm.Bool      = bool_mt\nreturn m\n"
  },
  {
    "path": "lua/flatbuffers/view.lua",
    "content": "local compat = require(\"flatbuffers.compat\")\nlocal string_unpack = compat.string_unpack\n\n\nlocal m = {}\nlocal mt = {}\n\nlocal mt_name = \"flatbuffers.view.mt\"\n\nlocal N = require(\"flatbuffers.numTypes\")\nlocal binaryarray = require(\"flatbuffers.binaryarray\")\n\nlocal function enforceOffset(off)\n    if off < 0 or off > 42949672951 then\n        error(\"Offset is not valid\")\n    end\nend\n\nlocal function unPackUoffset(bytes, off)\n    return string_unpack(\"<I4\", bytes.str, off + 1)\nend\n\nlocal function unPackVoffset(bytes, off)\n    return string_unpack(\"<I2\", bytes.str, off + 1)\nend\n\nfunction m.New(buf, pos)\n    enforceOffset(pos)\n    -- need to convert from a string buffer into\n    -- a binary array\n\n    local o = {\n        bytes = type(buf) == \"string\" and binaryarray.New(buf) or buf,\n        pos = pos,\n    }\n    setmetatable(o, {__index = mt, __metatable = mt_name})\n    return o\nend\n\nfunction mt:Offset(vtableOffset)\n    local vtable = self.vtable\n    if not vtable then\n        vtable = self.pos - self:Get(N.SOffsetT, self.pos)\n        self.vtable = vtable\n        self.vtableEnd = self:Get(N.VOffsetT, vtable)\n    end\n    if vtableOffset < self.vtableEnd then\n        return unPackVoffset(self.bytes, vtable + vtableOffset)\n    end\n    return 0\nend\n\nfunction mt:Indirect(off)\n    enforceOffset(off)\n    return off + unPackUoffset(self.bytes, off)\nend\n\nfunction mt:String(off)\n    enforceOffset(off)\n    off = off + unPackUoffset(self.bytes, off)\n    local start = off + 4\n    local length = unPackUoffset(self.bytes, off)\n    return self.bytes:Slice(start, start+length)\nend\n\nfunction mt:VectorLen(off)\n    enforceOffset(off)\n    off = off + self.pos\n    off = off + unPackUoffset(self.bytes, off)\n    return unPackUoffset(self.bytes, off)\nend\n\nfunction mt:Vector(off)\n    enforceOffset(off)\n    off = off + self.pos\n    return off + self:Get(N.UOffsetT, off) + 4\nend\n\nfunction mt:VectorAsString(off, start, stop)\n    local o = self:Offset(off)\n    if o ~= 0 then\n        start = start or 1\n        stop = stop or self:VectorLen(o)\n        local a = self:Vector(o) + start - 1\n        return self.bytes:Slice(a, a + stop - start + 1)\n    end\n    return nil\nend\n\nfunction mt:Union(t2, off)\n    assert(getmetatable(t2) == mt_name)\n    enforceOffset(off)\n    off = off + self.pos\n    t2.pos = off + self:Get(N.UOffsetT, off)\n    t2.bytes = self.bytes\nend\n\nfunction mt:Get(flags, off)\n    enforceOffset(off)\n    return flags:Unpack(self.bytes, off)\nend\n\nfunction mt:GetSlot(slot, d, validatorFlags)\n    N.VOffsetT:EnforceNumber(slot)\n    if validatorFlags then\n        validatorFlags:EnforceNumber(d)\n    end\n    local off = self:Offset(slot)\n    if off == 0 then\n        return d\n    end\n    return self:Get(validatorFlags, self.pos + off)\nend\n\nfunction mt:GetVOffsetTSlot(slot, d)\n    N.VOffsetT:EnforceNumbers(slot, d)\n    local off = self:Offset(slot)\n    if off == 0 then\n        return d\n    end\n    return off\nend\n\nreturn m"
  },
  {
    "path": "lua/flatbuffers.lua",
    "content": "local m = {}\n\nm.Builder = require(\"flatbuffers.builder\").New\nm.N = require(\"flatbuffers.numTypes\")\nm.view = require(\"flatbuffers.view\")\nm.binaryArray = require(\"flatbuffers.binaryarray\")\n\nreturn m"
  },
  {
    "path": "mjs/README.md",
    "content": "This folder is intentionally empty and will contain transpiled js modules in ES modules format after compiling with tsc.\n"
  },
  {
    "path": "net/FlatBuffers/ByteBuffer.cs",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// There are three conditional compilation symbols that have an impact on performance/features of this ByteBuffer implementation.\n//\n//      UNSAFE_BYTEBUFFER\n//          This will use unsafe code to manipulate the underlying byte array. This\n//          can yield a reasonable performance increase.\n//\n//      BYTEBUFFER_NO_BOUNDS_CHECK\n//          This will disable the bounds check asserts to the byte array. This can\n//          yield a small performance gain in normal code.\n//\n//      ENABLE_SPAN_T\n//          This will enable reading and writing blocks of memory with a Span<T> instead of just\n//          T[].  You can also enable writing directly to shared memory or other types of memory\n//          by providing a custom implementation of ByteBufferAllocator.\n//          ENABLE_SPAN_T also requires UNSAFE_BYTEBUFFER to be defined, or .NET\n//          Standard 2.1.\n//\n// Using UNSAFE_BYTEBUFFER and BYTEBUFFER_NO_BOUNDS_CHECK together can yield a\n// performance gain of ~15% for some operations, however doing so is potentially\n// dangerous. Do so at your own risk!\n//\n\nusing System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\nusing System.Text;\n\n#if ENABLE_SPAN_T && UNSAFE_BYTEBUFFER\nusing System.Buffers.Binary;\n#else\nusing System.IO;\n#endif\n\n#if ENABLE_SPAN_T && !UNSAFE_BYTEBUFFER\n#warning ENABLE_SPAN_T requires UNSAFE_BYTEBUFFER to also be defined\n#endif\n\nnamespace Google.FlatBuffers\n{\n    public abstract class ByteBufferAllocator\n    {\n#if ENABLE_SPAN_T && UNSAFE_BYTEBUFFER\n        public abstract Span<byte> Span { get; }\n        public abstract ReadOnlySpan<byte> ReadOnlySpan { get; }\n        public abstract Memory<byte> Memory { get; }\n        public abstract ReadOnlyMemory<byte> ReadOnlyMemory { get; }\n\n#else\n        public byte[] Buffer\n        {\n            get;\n            protected set;\n        }\n#endif\n\n        public int Length\n        {\n            get;\n            protected set;\n        }\n\n        public abstract void GrowFront(int newSize);\n    }\n\n    public sealed class ByteArrayAllocator : ByteBufferAllocator\n    {\n        private byte[] _buffer;\n\n        public ByteArrayAllocator(byte[] buffer)\n        {\n            _buffer = buffer;\n            InitBuffer();\n        }\n\n        public override void GrowFront(int newSize)\n        {\n            if ((Length & 0xC0000000) != 0)\n                throw new Exception(\n                    \"ByteBuffer: cannot grow buffer beyond 2 gigabytes.\");\n\n            if (newSize < Length)\n                throw new Exception(\"ByteBuffer: cannot truncate buffer.\");\n\n            byte[] newBuffer = new byte[newSize];\n            System.Buffer.BlockCopy(_buffer, 0, newBuffer, newSize - Length, Length);\n            _buffer = newBuffer;\n            InitBuffer();\n        }\n\n#if ENABLE_SPAN_T && UNSAFE_BYTEBUFFER\n        public override Span<byte> Span => _buffer;\n        public override ReadOnlySpan<byte> ReadOnlySpan => _buffer;\n        public override Memory<byte> Memory => _buffer;\n        public override ReadOnlyMemory<byte> ReadOnlyMemory => _buffer;\n#endif\n\n        private void InitBuffer()\n        {\n            Length = _buffer.Length;\n#if !ENABLE_SPAN_T\n            Buffer = _buffer;\n#endif\n        }\n    }\n\n    /// <summary>\n    /// Class to mimic Java's ByteBuffer which is used heavily in Flatbuffers.\n    /// </summary>\n    public class ByteBuffer\n    {\n        private ByteBufferAllocator _buffer;\n        private int _pos;  // Must track start of the buffer.\n\n        public ByteBuffer(ByteBufferAllocator allocator, int position)\n        {\n            _buffer = allocator;\n            _pos = position;\n        }\n\n        public ByteBuffer(int size) : this(new byte[size]) { }\n\n        public ByteBuffer(byte[] buffer) : this(buffer, 0) { }\n\n        public ByteBuffer(byte[] buffer, int pos)\n        {\n            _buffer = new ByteArrayAllocator(buffer);\n            _pos = pos;\n        }\n\n        public int Position\n        {\n            get { return _pos; }\n            set { _pos = value; }\n        }\n\n        public int Length { get { return _buffer.Length; } }\n\n        public void Reset()\n        {\n            _pos = 0;\n        }\n\n        // Create a new ByteBuffer on the same underlying data.\n        // The new ByteBuffer's position will be same as this buffer's.\n        public ByteBuffer Duplicate()\n        {\n            return new ByteBuffer(_buffer, Position);\n        }\n\n        // Increases the size of the ByteBuffer, and copies the old data towards\n        // the end of the new buffer.\n        public void GrowFront(int newSize)\n        {\n            _buffer.GrowFront(newSize);\n        }\n\n        public byte[] ToArray(int pos, int len)\n        {\n            return ToArray<byte>(pos, len);\n        }\n\n        /// <summary>\n        /// A lookup of type sizes. Used instead of Marshal.SizeOf() which has additional\n        /// overhead, but also is compatible with generic functions for simplified code.\n        /// </summary>\n        private static Dictionary<Type, int> genericSizes = new Dictionary<Type, int>()\n        {\n            { typeof(bool),     sizeof(bool) },\n            { typeof(float),    sizeof(float) },\n            { typeof(double),   sizeof(double) },\n            { typeof(sbyte),    sizeof(sbyte) },\n            { typeof(byte),     sizeof(byte) },\n            { typeof(short),    sizeof(short) },\n            { typeof(ushort),   sizeof(ushort) },\n            { typeof(int),      sizeof(int) },\n            { typeof(uint),     sizeof(uint) },\n            { typeof(ulong),    sizeof(ulong) },\n            { typeof(long),     sizeof(long) },\n        };\n\n        /// <summary>\n        /// Get the wire-size (in bytes) of a type supported by flatbuffers.\n        /// </summary>\n        /// <param name=\"t\">The type to get the wire size of</param>\n        /// <returns></returns>\n        public static int SizeOf<T>()\n        {\n            return genericSizes[typeof(T)];\n        }\n\n        /// <summary>\n        /// Checks if the Type provided is supported as scalar value\n        /// </summary>\n        /// <typeparam name=\"T\">The Type to check</typeparam>\n        /// <returns>True if the type is a scalar type that is supported, falsed otherwise</returns>\n        public static bool IsSupportedType<T>()\n        {\n            return genericSizes.ContainsKey(typeof(T));\n        }\n\n        /// <summary>\n        /// Get the wire-size (in bytes) of an typed array\n        /// </summary>\n        /// <typeparam name=\"T\">The type of the array</typeparam>\n        /// <param name=\"x\">The array to get the size of</param>\n        /// <returns>The number of bytes the array takes on wire</returns>\n        public static int ArraySize<T>(T[] x)\n        {\n            return SizeOf<T>() * x.Length;\n        }\n\n        /// <summary>\n        /// Get the wire-size (in bytes) of an typed array segment, taking only the\n        /// range specified by <paramref name=\"x\"/> into account.\n        /// </summary>\n        /// <typeparam name=\"T\">The type of the array</typeparam>\n        /// <param name=\"x\">The array segment to get the size of</param>\n        /// <returns>The number of bytes the array segment takes on wire</returns>\n        public static int ArraySize<T>(ArraySegment<T> x)\n        {\n            return SizeOf<T>() * x.Count;\n        }\n\n#if ENABLE_SPAN_T && UNSAFE_BYTEBUFFER\n        public static int ArraySize<T>(Span<T> x)\n        {\n            return SizeOf<T>() * x.Length;\n        }\n#endif\n\n        // Get a portion of the buffer casted into an array of type T, given\n        // the buffer position (in bytes) and length (in bytes).\n        public T[] ToArray<T>(int posInBytes, int lenInBytes)\n            where T : struct\n        {\n            AssertOffsetAndLength(posInBytes, lenInBytes);\n#if ENABLE_SPAN_T && UNSAFE_BYTEBUFFER\n            return MemoryMarshal.Cast<byte, T>(_buffer.ReadOnlySpan.Slice(posInBytes, lenInBytes)).ToArray();\n#else\n            var lenInTs = ConvertBytesToTs<T>(lenInBytes);\n            var arrayOfTs = new T[lenInTs];\n            Buffer.BlockCopy(_buffer.Buffer, posInBytes, arrayOfTs, 0, lenInBytes);\n            return arrayOfTs;\n#endif\n        }\n\n   \t\t\tpublic T[] ToArrayPadded<T>(int posInBytes, int lenInBytes, int padLeftInBytes, int padRightInBytes)\n            where T : struct\n        {\n            AssertOffsetAndLength(posInBytes, lenInBytes);\n            var padLeftInTs = ConvertBytesToTs<T>(padLeftInBytes);\n            var lenInTs = ConvertBytesToTs<T>(lenInBytes);\n            var padRightInTs = ConvertBytesToTs<T>(padRightInBytes);\n            var sizeInTs = padLeftInTs + lenInTs + padRightInTs;\n            var arrayOfTs = new T[sizeInTs];\n#if ENABLE_SPAN_T && UNSAFE_BYTEBUFFER\n            MemoryMarshal.Cast<byte, T>(_buffer.ReadOnlySpan.Slice(posInBytes, lenInBytes)).CopyTo(arrayOfTs.AsSpan().Slice(padLeftInTs));\n#else\n            Buffer.BlockCopy(_buffer.Buffer, posInBytes, arrayOfTs, padLeftInBytes, lenInBytes);\n#endif\n            return arrayOfTs;\n        }\n\n        public byte[] ToSizedArrayPadded(int padLeft, int padRight)\n        {\n            return ToArrayPadded<byte>(Position, Length - Position, padLeft, padRight);\n        }\n\n        public byte[] ToSizedArray()\n        {\n            return ToArray<byte>(Position, Length - Position);\n        }\n\n        public byte[] ToFullArray()\n        {\n            return ToArray<byte>(0, Length);\n        }\n\n#if ENABLE_SPAN_T && UNSAFE_BYTEBUFFER\n        public ReadOnlySpan<byte> ToSizedReadOnlySpan()\n        {\n            return _buffer.ReadOnlySpan.Slice(Position, Length - Position);\n        }\n\n        public ReadOnlyMemory<byte> ToReadOnlyMemory(int pos, int len)\n        {\n            return _buffer.ReadOnlyMemory.Slice(pos, len);\n        }\n\n        public Memory<byte> ToMemory(int pos, int len)\n        {\n            return _buffer.Memory.Slice(pos, len);\n        }\n\n        public Span<byte> ToSpan(int pos, int len)\n        {\n            return _buffer.Span.Slice(pos, len);\n        }\n\n        public ReadOnlySpan<byte> ToReadOnlySpan(int pos, int len)\n        {\n            return _buffer.ReadOnlySpan.Slice(pos, len);\n        }\n#else\n        public ArraySegment<byte> ToArraySegment(int pos, int len)\n        {\n            return new ArraySegment<byte>(_buffer.Buffer, pos, len);\n        }\n\n        public MemoryStream ToMemoryStream(int pos, int len)\n        {\n            return new MemoryStream(_buffer.Buffer, pos, len);\n        }\n#endif\n\n#if !UNSAFE_BYTEBUFFER\n        // A conversion union where all the members are overlapping. This allows to reinterpret the bytes of one type\n        // as another, without additional copies.\n        [StructLayout(LayoutKind.Explicit)]\n        struct ConversionUnion\n        {\n          [FieldOffset(0)] public int intValue;\n          [FieldOffset(0)] public float floatValue;\n        }\n#endif // !UNSAFE_BYTEBUFFER\n\n        // Helper functions for the unsafe version.\n        static public ushort ReverseBytes(ushort input)\n        {\n            return (ushort)(((input & 0x00FFU) << 8) |\n                            ((input & 0xFF00U) >> 8));\n        }\n        static public uint ReverseBytes(uint input)\n        {\n            return ((input & 0x000000FFU) << 24) |\n                   ((input & 0x0000FF00U) <<  8) |\n                   ((input & 0x00FF0000U) >>  8) |\n                   ((input & 0xFF000000U) >> 24);\n        }\n        static public ulong ReverseBytes(ulong input)\n        {\n            return (((input & 0x00000000000000FFUL) << 56) |\n                    ((input & 0x000000000000FF00UL) << 40) |\n                    ((input & 0x0000000000FF0000UL) << 24) |\n                    ((input & 0x00000000FF000000UL) <<  8) |\n                    ((input & 0x000000FF00000000UL) >>  8) |\n                    ((input & 0x0000FF0000000000UL) >> 24) |\n                    ((input & 0x00FF000000000000UL) >> 40) |\n                    ((input & 0xFF00000000000000UL) >> 56));\n        }\n\n#if !UNSAFE_BYTEBUFFER && !ENABLE_SPAN_T\n        // Helper functions for the safe (but slower) version.\n        protected void WriteLittleEndian(int offset, int count, ulong data)\n        {\n            if (BitConverter.IsLittleEndian)\n            {\n                for (int i = 0; i < count; i++)\n                {\n                    _buffer.Buffer[offset + i] = (byte)(data >> i * 8);\n                }\n            }\n            else\n            {\n                for (int i = 0; i < count; i++)\n                {\n                    _buffer.Buffer[offset + count - 1 - i] = (byte)(data >> i * 8);\n                }\n            }\n        }\n\n        protected ulong ReadLittleEndian(int offset, int count)\n        {\n            AssertOffsetAndLength(offset, count);\n            ulong r = 0;\n            if (BitConverter.IsLittleEndian)\n            {\n                for (int i = 0; i < count; i++)\n                {\n                    r |= (ulong)_buffer.Buffer[offset + i] << i * 8;\n                }\n            }\n            else\n            {\n                for (int i = 0; i < count; i++)\n                {\n                    r |= (ulong)_buffer.Buffer[offset + count - 1 - i] << i * 8;\n                }\n            }\n            return r;\n        }\n#elif ENABLE_SPAN_T\n        protected void WriteLittleEndian(int offset, int count, ulong data)\n        {\n            Span<byte> span = _buffer.Span.Slice(offset, count);\n            if (BitConverter.IsLittleEndian)\n            {\n                for (int i = 0; i < count; i++)\n                {\n                    span[i] = (byte)(data >> i * 8);\n                }\n            }\n            else\n            {\n                for (int i = 0; i < count; i++)\n                {\n                    span[count - 1 - i] = (byte)(data >> i * 8);\n                }\n            }\n        }\n\n        protected ulong ReadLittleEndian(int offset, int count)\n        {\n            AssertOffsetAndLength(offset, count);\n            ReadOnlySpan<byte> span = _buffer.ReadOnlySpan.Slice(offset, count);\n            ulong r = 0;\n            if (BitConverter.IsLittleEndian)\n            {\n                for (int i = 0; i < count; i++)\n                {\n                    r |= (ulong)span[i] << i * 8;\n                }\n            }\n            else\n            {\n                for (int i = 0; i < count; i++)\n                {\n                    r |= (ulong)span[count - 1 - i] << i * 8;\n                }\n            }\n            return r;\n        }\n#endif\n\n        private void AssertOffsetAndLength(int offset, int length)\n        {\n#if !BYTEBUFFER_NO_BOUNDS_CHECK\n            if (offset < 0 ||\n                offset > _buffer.Length - length)\n                throw new ArgumentOutOfRangeException();\n#endif\n        }\n\n        public static int ConvertTsToBytes<T>(int valueInTs)\n            where T : struct\n        {\n            var sizeOfT = SizeOf<T>();\n            var valueInBytes = valueInTs * sizeOfT;\n            return valueInBytes;\n        }\n\n        public static int ConvertBytesToTs<T>(int valueInBytes)\n            where T : struct\n        {\n            var sizeOfT = SizeOf<T>();\n            var valueInTs = valueInBytes / sizeOfT;\n#if !BYTEBUFFER_NO_BOUNDS_CHECK\n            if (valueInTs * sizeOfT != valueInBytes)\n            {\n                throw new ArgumentException($\"{valueInBytes} must be a multiple of SizeOf<{typeof(T).Name}>()={sizeOfT}\");\n            }\n#endif\n            return valueInTs;\n        }\n\n#if ENABLE_SPAN_T && UNSAFE_BYTEBUFFER\n\n    public void PutSbyte(int offset, sbyte value)\n        {\n            AssertOffsetAndLength(offset, sizeof(sbyte));\n            _buffer.Span[offset] = (byte)value;\n        }\n\n        public void PutByte(int offset, byte value)\n        {\n            AssertOffsetAndLength(offset, sizeof(byte));\n            _buffer.Span[offset] = value;\n        }\n\n        public void PutByte(int offset, byte value, int count)\n        {\n            AssertOffsetAndLength(offset, sizeof(byte) * count);\n            Span<byte> span = _buffer.Span.Slice(offset, count);\n            span.Fill(value);\n        }\n#else\n        public void PutSbyte(int offset, sbyte value)\n        {\n            AssertOffsetAndLength(offset, sizeof(sbyte));\n            _buffer.Buffer[offset] = (byte)value;\n        }\n\n        public void PutByte(int offset, byte value)\n        {\n            AssertOffsetAndLength(offset, sizeof(byte));\n            _buffer.Buffer[offset] = value;\n        }\n\n        public void PutByte(int offset, byte value, int count)\n        {\n            AssertOffsetAndLength(offset, sizeof(byte) * count);\n            for (var i = 0; i < count; ++i)\n                _buffer.Buffer[offset + i] = value;\n        }\n#endif\n\n        // this method exists in order to conform with Java ByteBuffer standards\n        public void Put(int offset, byte value)\n        {\n            PutByte(offset, value);\n        }\n\n#if ENABLE_SPAN_T && UNSAFE_BYTEBUFFER\n        public unsafe void PutStringUTF8(int offset, string value)\n        {\n            AssertOffsetAndLength(offset, value.Length);\n            fixed (char* s = value)\n            {\n                fixed (byte* buffer = &MemoryMarshal.GetReference(_buffer.Span))\n                {\n                    Encoding.UTF8.GetBytes(s, value.Length, buffer + offset, Length - offset);\n                }\n            }\n        }\n#elif ENABLE_SPAN_T\n        public void PutStringUTF8(int offset, string value)\n        {\n            AssertOffsetAndLength(offset, value.Length);\n            Encoding.UTF8.GetBytes(value.AsSpan().Slice(0, value.Length),\n                _buffer.Span.Slice(offset));\n        }\n#else\n        public void PutStringUTF8(int offset, string value)\n        {\n            AssertOffsetAndLength(offset, value.Length);\n            Encoding.UTF8.GetBytes(value, 0, value.Length,\n                _buffer.Buffer, offset);\n        }\n#endif\n\n#if UNSAFE_BYTEBUFFER\n        // Unsafe but more efficient versions of Put*.\n        public void PutShort(int offset, short value)\n        {\n            PutUshort(offset, (ushort)value);\n        }\n\n        public unsafe void PutUshort(int offset, ushort value)\n        {\n            AssertOffsetAndLength(offset, sizeof(ushort));\n#if ENABLE_SPAN_T // && UNSAFE_BYTEBUFFER\n            Span<byte> span = _buffer.Span.Slice(offset);\n            BinaryPrimitives.WriteUInt16LittleEndian(span, value);\n#else\n            fixed (byte* ptr = _buffer.Buffer)\n            {\n                *(ushort*)(ptr + offset) = BitConverter.IsLittleEndian\n                    ? value\n                    : ReverseBytes(value);\n            }\n#endif\n        }\n\n        public void PutInt(int offset, int value)\n        {\n            PutUint(offset, (uint)value);\n        }\n\n        public unsafe void PutUint(int offset, uint value)\n        {\n            AssertOffsetAndLength(offset, sizeof(uint));\n#if ENABLE_SPAN_T // && UNSAFE_BYTEBUFFER\n            Span<byte> span = _buffer.Span.Slice(offset);\n            BinaryPrimitives.WriteUInt32LittleEndian(span, value);\n#else\n            fixed (byte* ptr = _buffer.Buffer)\n            {\n                *(uint*)(ptr + offset) = BitConverter.IsLittleEndian\n                    ? value\n                    : ReverseBytes(value);\n            }\n#endif\n        }\n\n        public unsafe void PutLong(int offset, long value)\n        {\n            PutUlong(offset, (ulong)value);\n        }\n\n        public unsafe void PutUlong(int offset, ulong value)\n        {\n            AssertOffsetAndLength(offset, sizeof(ulong));\n#if ENABLE_SPAN_T // && UNSAFE_BYTEBUFFER\n            Span<byte> span = _buffer.Span.Slice(offset);\n            BinaryPrimitives.WriteUInt64LittleEndian(span, value);\n#else\n            fixed (byte* ptr = _buffer.Buffer)\n            {\n                *(ulong*)(ptr + offset) = BitConverter.IsLittleEndian\n                    ? value\n                    : ReverseBytes(value);\n            }\n#endif\n        }\n\n        public unsafe void PutFloat(int offset, float value)\n        {\n            AssertOffsetAndLength(offset, sizeof(float));\n#if ENABLE_SPAN_T // && UNSAFE_BYTEBUFFER\n            fixed (byte* ptr = &MemoryMarshal.GetReference(_buffer.Span))\n#else\n            fixed (byte* ptr = _buffer.Buffer)\n#endif\n            {\n                if (BitConverter.IsLittleEndian)\n                {\n                    *(float*)(ptr + offset) = value;\n                }\n                else\n                {\n                    *(uint*)(ptr + offset) = ReverseBytes(*(uint*)(&value));\n                }\n            }\n        }\n\n        public unsafe void PutDouble(int offset, double value)\n        {\n            AssertOffsetAndLength(offset, sizeof(double));\n#if ENABLE_SPAN_T // && UNSAFE_BYTEBUFFER\n            fixed (byte* ptr = &MemoryMarshal.GetReference(_buffer.Span))\n#else\n            fixed (byte* ptr = _buffer.Buffer)\n#endif\n            {\n                if (BitConverter.IsLittleEndian)\n                {\n                    *(double*)(ptr + offset) = value;\n                }\n                else\n                {\n                    *(ulong*)(ptr + offset) = ReverseBytes(*(ulong*)(&value));\n                }\n            }\n        }\n#else // !UNSAFE_BYTEBUFFER\n        // Slower versions of Put* for when unsafe code is not allowed.\n        public void PutShort(int offset, short value)\n        {\n            AssertOffsetAndLength(offset, sizeof(short));\n            WriteLittleEndian(offset, sizeof(short), (ulong)value);\n        }\n\n        public void PutUshort(int offset, ushort value)\n        {\n            AssertOffsetAndLength(offset, sizeof(ushort));\n            WriteLittleEndian(offset, sizeof(ushort), (ulong)value);\n        }\n\n        public void PutInt(int offset, int value)\n        {\n            AssertOffsetAndLength(offset, sizeof(int));\n            WriteLittleEndian(offset, sizeof(int), (ulong)value);\n        }\n\n        public void PutUint(int offset, uint value)\n        {\n            AssertOffsetAndLength(offset, sizeof(uint));\n            WriteLittleEndian(offset, sizeof(uint), (ulong)value);\n        }\n\n        public void PutLong(int offset, long value)\n        {\n            AssertOffsetAndLength(offset, sizeof(long));\n            WriteLittleEndian(offset, sizeof(long), (ulong)value);\n        }\n\n        public void PutUlong(int offset, ulong value)\n        {\n            AssertOffsetAndLength(offset, sizeof(ulong));\n            WriteLittleEndian(offset, sizeof(ulong), value);\n        }\n\n        public void PutFloat(int offset, float value)\n        {\n            AssertOffsetAndLength(offset, sizeof(float));\n            // TODO(derekbailey): use BitConvert.SingleToInt32Bits() whenever flatbuffers upgrades to a .NET version\n            // that contains it.\n            ConversionUnion union;\n            union.intValue = 0;\n            union.floatValue = value;\n            WriteLittleEndian(offset, sizeof(float), (ulong)union.intValue);\n        }\n\n        public void PutDouble(int offset, double value)\n        {\n            AssertOffsetAndLength(offset, sizeof(double));\n            WriteLittleEndian(offset, sizeof(double), (ulong)BitConverter.DoubleToInt64Bits(value));\n        }\n\n#endif // UNSAFE_BYTEBUFFER\n\n#if ENABLE_SPAN_T && UNSAFE_BYTEBUFFER\n        public sbyte GetSbyte(int index)\n        {\n            AssertOffsetAndLength(index, sizeof(sbyte));\n            return (sbyte)_buffer.ReadOnlySpan[index];\n        }\n\n        public byte Get(int index)\n        {\n            AssertOffsetAndLength(index, sizeof(byte));\n            return _buffer.ReadOnlySpan[index];\n        }\n#else\n        public sbyte GetSbyte(int index)\n        {\n            AssertOffsetAndLength(index, sizeof(sbyte));\n            return (sbyte)_buffer.Buffer[index];\n        }\n\n        public byte Get(int index)\n        {\n            AssertOffsetAndLength(index, sizeof(byte));\n            return _buffer.Buffer[index];\n        }\n#endif\n\n#if ENABLE_SPAN_T && UNSAFE_BYTEBUFFER\n        public unsafe string GetStringUTF8(int startPos, int len)\n        {\n            AssertOffsetAndLength(startPos, len);\n            fixed (byte* buffer = &MemoryMarshal.GetReference(_buffer.ReadOnlySpan.Slice(startPos)))\n            {\n                return Encoding.UTF8.GetString(buffer, len);\n            }\n        }\n#elif ENABLE_SPAN_T\n        public string GetStringUTF8(int startPos, int len)\n        {\n            return Encoding.UTF8.GetString(_buffer.Span.Slice(startPos, len));\n        }\n#else\n        public string GetStringUTF8(int startPos, int len)\n        {\n            return Encoding.UTF8.GetString(_buffer.Buffer, startPos, len);\n        }\n#endif\n\n#if UNSAFE_BYTEBUFFER\n        // Unsafe but more efficient versions of Get*.\n        public short GetShort(int offset)\n        {\n            return (short)GetUshort(offset);\n        }\n\n        public unsafe ushort GetUshort(int offset)\n        {\n            AssertOffsetAndLength(offset, sizeof(ushort));\n#if ENABLE_SPAN_T // && UNSAFE_BYTEBUFFER\n            ReadOnlySpan<byte> span = _buffer.ReadOnlySpan.Slice(offset);\n            return BinaryPrimitives.ReadUInt16LittleEndian(span);\n#else\n            fixed (byte* ptr = _buffer.Buffer)\n            {\n                return BitConverter.IsLittleEndian\n                    ? *(ushort*)(ptr + offset)\n                    : ReverseBytes(*(ushort*)(ptr + offset));\n            }\n#endif\n        }\n\n        public int GetInt(int offset)\n        {\n            return (int)GetUint(offset);\n        }\n\n        public unsafe uint GetUint(int offset)\n        {\n            AssertOffsetAndLength(offset, sizeof(uint));\n#if ENABLE_SPAN_T // && UNSAFE_BYTEBUFFER\n            ReadOnlySpan<byte> span = _buffer.ReadOnlySpan.Slice(offset);\n            return BinaryPrimitives.ReadUInt32LittleEndian(span);\n#else\n            fixed (byte* ptr = _buffer.Buffer)\n            {\n                return BitConverter.IsLittleEndian\n                    ? *(uint*)(ptr + offset)\n                    : ReverseBytes(*(uint*)(ptr + offset));\n            }\n#endif\n        }\n\n        public long GetLong(int offset)\n        {\n            return (long)GetUlong(offset);\n        }\n\n        public unsafe ulong GetUlong(int offset)\n        {\n            AssertOffsetAndLength(offset, sizeof(ulong));\n#if ENABLE_SPAN_T // && UNSAFE_BYTEBUFFER\n            ReadOnlySpan<byte> span = _buffer.ReadOnlySpan.Slice(offset);\n            return BinaryPrimitives.ReadUInt64LittleEndian(span);\n#else\n            fixed (byte* ptr = _buffer.Buffer)\n            {\n                return BitConverter.IsLittleEndian\n                    ? *(ulong*)(ptr + offset)\n                    : ReverseBytes(*(ulong*)(ptr + offset));\n            }\n#endif\n        }\n\n        public unsafe float GetFloat(int offset)\n        {\n            AssertOffsetAndLength(offset, sizeof(float));\n#if ENABLE_SPAN_T // && UNSAFE_BYTEBUFFER\n            fixed (byte* ptr = &MemoryMarshal.GetReference(_buffer.ReadOnlySpan))\n#else\n            fixed (byte* ptr = _buffer.Buffer)\n#endif\n            {\n                if (BitConverter.IsLittleEndian)\n                {\n                    return *(float*)(ptr + offset);\n                }\n                else\n                {\n                    uint uvalue = ReverseBytes(*(uint*)(ptr + offset));\n                    return *(float*)(&uvalue);\n                }\n            }\n        }\n\n        public unsafe double GetDouble(int offset)\n        {\n            AssertOffsetAndLength(offset, sizeof(double));\n#if ENABLE_SPAN_T // && UNSAFE_BYTEBUFFER\n            fixed (byte* ptr = &MemoryMarshal.GetReference(_buffer.ReadOnlySpan))\n#else\n            fixed (byte* ptr = _buffer.Buffer)\n#endif\n            {\n                if (BitConverter.IsLittleEndian)\n                {\n                    return *(double*)(ptr + offset);\n                }\n                else\n                {\n                    ulong uvalue = ReverseBytes(*(ulong*)(ptr + offset));\n                    return *(double*)(&uvalue);\n                }\n            }\n        }\n#else // !UNSAFE_BYTEBUFFER\n        // Slower versions of Get* for when unsafe code is not allowed.\n        public short GetShort(int index)\n        {\n            return (short)ReadLittleEndian(index, sizeof(short));\n        }\n\n        public ushort GetUshort(int index)\n        {\n            return (ushort)ReadLittleEndian(index, sizeof(ushort));\n        }\n\n        public int GetInt(int index)\n        {\n            return (int)ReadLittleEndian(index, sizeof(int));\n        }\n\n        public uint GetUint(int index)\n        {\n            return (uint)ReadLittleEndian(index, sizeof(uint));\n        }\n\n        public long GetLong(int index)\n        {\n            return (long)ReadLittleEndian(index, sizeof(long));\n        }\n\n        public ulong GetUlong(int index)\n        {\n            return ReadLittleEndian(index, sizeof(ulong));\n        }\n\n        public float GetFloat(int index)\n        {\n            // TODO(derekbailey): use BitConvert.Int32BitsToSingle() whenever flatbuffers upgrades to a .NET version\n            // that contains it.\n            ConversionUnion union;\n            union.floatValue = 0;\n            union.intValue = (int)ReadLittleEndian(index, sizeof(float));\n            return union.floatValue;\n        }\n\n        public double GetDouble(int index)\n        {\n            return BitConverter.Int64BitsToDouble((long)ReadLittleEndian(index, sizeof(double)));\n        }\n#endif // UNSAFE_BYTEBUFFER\n\n        /// <summary>\n        /// Copies an array of type T into this buffer, ending at the given\n        /// offset into this buffer. The starting offset is calculated based on the length\n        /// of the array and is the value returned.\n        /// </summary>\n        /// <typeparam name=\"T\">The type of the input data (must be a struct)</typeparam>\n        /// <param name=\"offset\">The offset into this buffer where the copy will end</param>\n        /// <param name=\"x\">The array to copy data from</param>\n        /// <returns>The 'start' location of this buffer now, after the copy completed</returns>\n        public int Put<T>(int offset, T[] x)\n            where T : struct\n        {\n            if (x == null)\n            {\n                throw new ArgumentNullException(\"Cannot put a null array\");\n            }\n\n            return Put(offset, new ArraySegment<T>(x));\n        }\n\n        /// <summary>\n        /// Copies an array segment of type T into this buffer, ending at the\n        /// given offset into this buffer. The starting offset is calculated\n        /// based on the count of the array segment and is the value returned.\n        /// </summary>\n        /// <typeparam name=\"T\">The type of the input data (must be a struct)\n        /// </typeparam>\n        /// <param name=\"offset\">The offset into this buffer where the copy\n        /// will end</param>\n        /// <param name=\"x\">The array segment to copy data from</param>\n        /// <returns>The 'start' location of this buffer now, after the copy\n        /// completed</returns>\n        public int Put<T>(int offset, ArraySegment<T> x)\n            where T : struct\n        {\n            if (x.Equals(default(ArraySegment<T>)))\n            {\n                throw new ArgumentNullException(\"Cannot put a uninitialized array segment\");\n            }\n\n            if (x.Count == 0)\n            {\n                throw new ArgumentException(\"Cannot put an empty array\");\n            }\n\n            if (!IsSupportedType<T>())\n            {\n                throw new ArgumentException(\"Cannot put an array of type \"\n                    + typeof(T) + \" into this buffer\");\n            }\n\n            if (BitConverter.IsLittleEndian)\n            {\n                int numBytes = ByteBuffer.ArraySize(x);\n                offset -= numBytes;\n                AssertOffsetAndLength(offset, numBytes);\n                // if we are LE, just do a block copy\n#if ENABLE_SPAN_T && UNSAFE_BYTEBUFFER\n                MemoryMarshal.Cast<T, byte>(x).CopyTo(_buffer.Span.Slice(offset, numBytes));\n#else\n                var srcOffset = ByteBuffer.SizeOf<T>() * x.Offset;\n                Buffer.BlockCopy(x.Array, srcOffset, _buffer.Buffer, offset, numBytes);\n#endif\n            }\n            else\n            {\n                throw new NotImplementedException(\"Big Endian Support not implemented yet \" +\n                    \"for putting typed arrays\");\n                // if we are BE, we have to swap each element by itself\n                //for(int i = x.Length - 1; i >= 0; i--)\n                //{\n                //  todo: low priority, but need to genericize the Put<T>() functions\n                //}\n            }\n            return offset;\n        }\n\n        /// <summary>\n        /// Copies an array segment of type T into this buffer, ending at the\n        /// given offset into this buffer. The starting offset is calculated\n        /// based on the count of the array segment and is the value returned.\n        /// </summary>\n        /// <typeparam name=\"T\">The type of the input data (must be a struct)\n        /// </typeparam>\n        /// <param name=\"offset\">The offset into this buffer where the copy\n        /// will end</param>\n        /// <param name=\"ptr\">The pointer to copy data from</param>\n        /// <param name=\"sizeInBytes\">The number of bytes to copy</param>\n        /// <returns>The 'start' location of this buffer now, after the copy\n        /// completed</returns>\n        public int Put<T>(int offset, IntPtr ptr, int sizeInBytes)\n            where T : struct\n        {\n            if (ptr == IntPtr.Zero)\n            {\n                throw new ArgumentNullException(\"Cannot add a null pointer\");\n            }\n\n            if(sizeInBytes <= 0)\n            {\n                throw new ArgumentException(\"Cannot put an empty array\");\n            }\n\n            if (!IsSupportedType<T>())\n            {\n                throw new ArgumentException(\"Cannot put an array of type \"\n                    + typeof(T) + \" into this buffer\");\n            }\n\n            if (BitConverter.IsLittleEndian)\n            {\n                offset -= sizeInBytes;\n                AssertOffsetAndLength(offset, sizeInBytes);\n                // if we are LE, just do a block copy\n#if ENABLE_SPAN_T && UNSAFE_BYTEBUFFER\n                unsafe\n                {\n                    var span = new Span<byte>(ptr.ToPointer(), sizeInBytes);\n                    span.CopyTo(_buffer.Span.Slice(offset, sizeInBytes));\n                }\n#else\n                Marshal.Copy(ptr, _buffer.Buffer, offset, sizeInBytes);\n#endif\n            }\n            else\n            {\n                throw new NotImplementedException(\"Big Endian Support not implemented yet \" +\n                    \"for putting typed arrays\");\n                // if we are BE, we have to swap each element by itself\n                //for(int i = x.Length - 1; i >= 0; i--)\n                //{\n                //  todo: low priority, but need to genericize the Put<T>() functions\n                //}\n            }\n            return offset;\n        }\n\n#if ENABLE_SPAN_T && UNSAFE_BYTEBUFFER\n        public int Put<T>(int offset, Span<T> x)\n            where T : struct\n        {\n            if (x.Length == 0)\n            {\n                throw new ArgumentException(\"Cannot put an empty array\");\n            }\n\n            if (!IsSupportedType<T>())\n            {\n                throw new ArgumentException(\"Cannot put an array of type \"\n                    + typeof(T) + \" into this buffer\");\n            }\n\n            if (BitConverter.IsLittleEndian)\n            {\n                int numBytes = ByteBuffer.ArraySize(x);\n                offset -= numBytes;\n                AssertOffsetAndLength(offset, numBytes);\n                // if we are LE, just do a block copy\n                MemoryMarshal.Cast<T, byte>(x).CopyTo(_buffer.Span.Slice(offset, numBytes));\n            }\n            else\n            {\n                throw new NotImplementedException(\"Big Endian Support not implemented yet \" +\n                    \"for putting typed arrays\");\n                // if we are BE, we have to swap each element by itself\n                //for(int i = x.Length - 1; i >= 0; i--)\n                //{\n                //  todo: low priority, but need to genericize the Put<T>() functions\n                //}\n            }\n            return offset;\n        }\n#endif\n    }\n}\n"
  },
  {
    "path": "net/FlatBuffers/ByteBufferUtil.cs",
    "content": "/*\n * Copyright 2017 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nusing System;\n\nnamespace Google.FlatBuffers\n{\n\t/// <summary>\n\t/// Class that collects utility functions around `ByteBuffer`.\n\t/// </summary>\n\tpublic class ByteBufferUtil\n\t{\n\t\t// Extract the size prefix from a `ByteBuffer`.\n\t\tpublic static int GetSizePrefix(ByteBuffer bb) {\n\t\t\treturn bb.GetInt(bb.Position);\n\t\t}\n\n\t\t// Create a duplicate of a size-prefixed `ByteBuffer` that has its position\n\t\t// advanced just past the size prefix.\n\t\tpublic static ByteBuffer RemoveSizePrefix(ByteBuffer bb) {\n\t\t\tByteBuffer s = bb.Duplicate();\n\t\t\ts.Position += FlatBufferConstants.SizePrefixLength;\n\t\t\treturn s;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "net/FlatBuffers/FlatBufferBuilder.cs",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\n/// @file\n/// @addtogroup flatbuffers_csharp_api\n/// @{\n\nnamespace Google.FlatBuffers\n{\n    /// <summary>\n    /// Responsible for building up and accessing a FlatBuffer formatted byte\n    /// array (via ByteBuffer).\n    /// </summary>\n    public class FlatBufferBuilder\n    {\n        private int _space;\n        private ByteBuffer _bb;\n        private int _minAlign = 1;\n\n        // The vtable for the current table (if _vtableSize >= 0)\n        private int[] _vtable = new int[16];\n        // The size of the vtable. -1 indicates no vtable\n        private int _vtableSize = -1;\n        // Starting offset of the current struct/table.\n        private int _objectStart;\n        // List of offsets of all vtables.\n        private int[] _vtables = new int[16];\n        // Number of entries in `vtables` in use.\n        private int _numVtables = 0;\n        // For the current vector being built.\n        private int _vectorNumElems = 0;\n\n        // For CreateSharedString\n        private Dictionary<string, StringOffset> _sharedStringMap = null;\n\n        /// <summary>\n        /// Create a FlatBufferBuilder with a given initial size.\n        /// </summary>\n        /// <param name=\"initialSize\">\n        /// The initial size to use for the internal buffer.\n        /// </param>\n        public FlatBufferBuilder(int initialSize)\n        {\n            if (initialSize <= 0)\n                throw new ArgumentOutOfRangeException(\"initialSize\",\n                    initialSize, \"Must be greater than zero\");\n            _space = initialSize;\n            _bb = new ByteBuffer(initialSize);\n        }\n\n        /// <summary>\n        /// Create a FlatBufferBuilder backed by the passed in ByteBuffer\n        /// </summary>\n        /// <param name=\"buffer\">The ByteBuffer to write to</param>\n        public FlatBufferBuilder(ByteBuffer buffer)\n        {\n            _bb = buffer;\n            _space = buffer.Length;\n            buffer.Reset();\n        }\n\n        /// <summary>\n        /// Reset the FlatBufferBuilder by purging all data that it holds.\n        /// </summary>\n        public void Clear()\n        {\n            _space = _bb.Length;\n            _bb.Reset();\n            _minAlign = 1;\n            while (_vtableSize > 0) _vtable[--_vtableSize] = 0;\n            _vtableSize = -1;\n            _objectStart = 0;\n            _numVtables = 0;\n            _vectorNumElems = 0;\n            if (_sharedStringMap != null)\n            {\n                _sharedStringMap.Clear();\n            }\n        }\n\n        /// <summary>\n        /// Gets and sets a Boolean to disable the optimization when serializing\n        /// default values to a Table.\n        ///\n        /// In order to save space, fields that are set to their default value\n        /// don't get serialized into the buffer.\n        /// </summary>\n        public bool ForceDefaults { get; set; }\n\n        /// @cond FLATBUFFERS_INTERNAL\n\n        public int Offset { get { return _bb.Length - _space; } }\n\n        public void Pad(int size)\n        {\n             _bb.PutByte(_space -= size, 0, size);\n        }\n\n        // Doubles the size of the ByteBuffer, and copies the old data towards\n        // the end of the new buffer (since we build the buffer backwards).\n        void GrowBuffer()\n        {\n            _bb.GrowFront(_bb.Length << 1);\n        }\n\n        // Prepare to write an element of `size` after `additional_bytes`\n        // have been written, e.g. if you write a string, you need to align\n        // such the int length field is aligned to SIZEOF_INT, and the string\n        // data follows it directly.\n        // If all you need to do is align, `additional_bytes` will be 0.\n        public void Prep(int size, int additionalBytes)\n        {\n            // Track the biggest thing we've ever aligned to.\n            if (size > _minAlign)\n                _minAlign = size;\n            // Find the amount of alignment needed such that `size` is properly\n            // aligned after `additional_bytes`\n            var alignSize =\n                ((~((int)_bb.Length - _space + additionalBytes)) + 1) &\n                (size - 1);\n            // Reallocate the buffer if needed.\n            while (_space < alignSize + size + additionalBytes)\n            {\n                var oldBufSize = (int)_bb.Length;\n                GrowBuffer();\n                _space += (int)_bb.Length - oldBufSize;\n\n            }\n            if (alignSize > 0)\n                Pad(alignSize);\n        }\n\n        public void PutBool(bool x)\n        {\n          _bb.PutByte(_space -= sizeof(byte), (byte)(x ? 1 : 0));\n        }\n\n        public void PutSbyte(sbyte x)\n        {\n          _bb.PutSbyte(_space -= sizeof(sbyte), x);\n        }\n\n        public void PutByte(byte x)\n        {\n            _bb.PutByte(_space -= sizeof(byte), x);\n        }\n\n        public void PutShort(short x)\n        {\n            _bb.PutShort(_space -= sizeof(short), x);\n        }\n\n        public void PutUshort(ushort x)\n        {\n          _bb.PutUshort(_space -= sizeof(ushort), x);\n        }\n\n        public void PutInt(int x)\n        {\n            _bb.PutInt(_space -= sizeof(int), x);\n        }\n\n        public void PutUint(uint x)\n        {\n          _bb.PutUint(_space -= sizeof(uint), x);\n        }\n\n        public void PutLong(long x)\n        {\n            _bb.PutLong(_space -= sizeof(long), x);\n        }\n\n        public void PutUlong(ulong x)\n        {\n          _bb.PutUlong(_space -= sizeof(ulong), x);\n        }\n\n        public void PutFloat(float x)\n        {\n            _bb.PutFloat(_space -= sizeof(float), x);\n        }\n\n        /// <summary>\n        /// Puts an array of type T into this builder at the\n        /// current offset\n        /// </summary>\n        /// <typeparam name=\"T\">The type of the input data </typeparam>\n        /// <param name=\"x\">The array to copy data from</param>\n        public void Put<T>(T[] x)\n            where T : struct\n        {\n            _space = _bb.Put(_space, x);\n        }\n\n        /// <summary>\n        /// Puts an array of type T into this builder at the\n        /// current offset\n        /// </summary>\n        /// <typeparam name=\"T\">The type of the input data </typeparam>\n        /// <param name=\"x\">The array segment to copy data from</param>\n        public void Put<T>(ArraySegment<T> x)\n            where T : struct\n        {\n            _space = _bb.Put(_space, x);\n        }\n\n        /// <summary>\n        /// Puts data of type T into this builder at the\n        /// current offset\n        /// </summary>\n        /// <typeparam name=\"T\">The type of the input data </typeparam>\n        /// <param name=\"ptr\">The pointer to copy data from</param>\n        /// <param name=\"sizeInBytes\">The length of the data in bytes</param>\n        public void Put<T>(IntPtr ptr, int sizeInBytes)\n            where T : struct\n        {\n            _space = _bb.Put<T>(_space, ptr, sizeInBytes);\n        }\n\n#if ENABLE_SPAN_T && UNSAFE_BYTEBUFFER\n        /// <summary>\n        /// Puts a span of type T into this builder at the\n        /// current offset\n        /// </summary>\n        /// <typeparam name=\"T\">The type of the input data </typeparam>\n        /// <param name=\"x\">The span to copy data from</param>\n        public void Put<T>(Span<T> x)\n            where T : struct\n        {\n            _space = _bb.Put(_space, x);\n        }\n#endif\n\n        public void PutDouble(double x)\n        {\n            _bb.PutDouble(_space -= sizeof(double), x);\n        }\n        /// @endcond\n\n        /// <summary>\n        /// Add a `bool` to the buffer (aligns the data and grows if necessary).\n        /// </summary>\n        /// <param name=\"x\">The `bool` to add to the buffer.</param>\n        public void AddBool(bool x) { Prep(sizeof(byte), 0); PutBool(x); }\n\n        /// <summary>\n        /// Add a `sbyte` to the buffer (aligns the data and grows if necessary).\n        /// </summary>\n        /// <param name=\"x\">The `sbyte` to add to the buffer.</param>\n        public void AddSbyte(sbyte x) { Prep(sizeof(sbyte), 0); PutSbyte(x); }\n\n        /// <summary>\n        /// Add a `byte` to the buffer (aligns the data and grows if necessary).\n        /// </summary>\n        /// <param name=\"x\">The `byte` to add to the buffer.</param>\n        public void AddByte(byte x) { Prep(sizeof(byte), 0); PutByte(x); }\n\n        /// <summary>\n        /// Add a `short` to the buffer (aligns the data and grows if necessary).\n        /// </summary>\n        /// <param name=\"x\">The `short` to add to the buffer.</param>\n        public void AddShort(short x) { Prep(sizeof(short), 0); PutShort(x); }\n\n        /// <summary>\n        /// Add an `ushort` to the buffer (aligns the data and grows if necessary).\n        /// </summary>\n        /// <param name=\"x\">The `ushort` to add to the buffer.</param>\n        public void AddUshort(ushort x) { Prep(sizeof(ushort), 0); PutUshort(x); }\n\n        /// <summary>\n        /// Add an `int` to the buffer (aligns the data and grows if necessary).\n        /// </summary>\n        /// <param name=\"x\">The `int` to add to the buffer.</param>\n        public void AddInt(int x) { Prep(sizeof(int), 0); PutInt(x); }\n\n        /// <summary>\n        /// Add an `uint` to the buffer (aligns the data and grows if necessary).\n        /// </summary>\n        /// <param name=\"x\">The `uint` to add to the buffer.</param>\n        public void AddUint(uint x) { Prep(sizeof(uint), 0); PutUint(x); }\n\n        /// <summary>\n        /// Add a `long` to the buffer (aligns the data and grows if necessary).\n        /// </summary>\n        /// <param name=\"x\">The `long` to add to the buffer.</param>\n        public void AddLong(long x) { Prep(sizeof(long), 0); PutLong(x); }\n\n        /// <summary>\n        /// Add an `ulong` to the buffer (aligns the data and grows if necessary).\n        /// </summary>\n        /// <param name=\"x\">The `ulong` to add to the buffer.</param>\n        public void AddUlong(ulong x) { Prep(sizeof(ulong), 0); PutUlong(x); }\n\n        /// <summary>\n        /// Add a `float` to the buffer (aligns the data and grows if necessary).\n        /// </summary>\n        /// <param name=\"x\">The `float` to add to the buffer.</param>\n        public void AddFloat(float x) { Prep(sizeof(float), 0); PutFloat(x); }\n\n        /// <summary>\n        /// Add an array of type T to the buffer (aligns the data and grows if necessary).\n        /// </summary>\n        /// <typeparam name=\"T\">The type of the input data</typeparam>\n        /// <param name=\"x\">The array to copy data from</param>\n        public void Add<T>(T[] x)\n            where T : struct\n        {\n            Add(new ArraySegment<T>(x));\n        }\n\n        /// <summary>\n        /// Add an array of type T to the buffer (aligns the data and grows if necessary).\n        /// </summary>\n        /// <typeparam name=\"T\">The type of the input data</typeparam>\n        /// <param name=\"x\">The array segment to copy data from</param>\n        public void Add<T>(ArraySegment<T> x)\n            where T : struct\n        {\n            if (x == null)\n            {\n                throw new ArgumentNullException(\"Cannot add a null array\");\n            }\n\n            if( x.Count == 0)\n            {\n                // don't do anything if the array is empty\n                return;\n            }\n\n            if(!ByteBuffer.IsSupportedType<T>())\n            {\n                throw new ArgumentException(\"Cannot add this Type array to the builder\");\n            }\n\n            int size = ByteBuffer.SizeOf<T>();\n            // Need to prep on size (for data alignment) and then we pass the\n            // rest of the length (minus 1) as additional bytes\n            Prep(size, size * (x.Count - 1));\n            Put(x);\n        }\n\n        /// <summary>\n        /// Adds the data of type T pointed to by the given pointer to the buffer (aligns the data and grows if necessary).\n        /// </summary>\n        /// <typeparam name=\"T\">The type of the input data</typeparam>\n        /// <param name=\"ptr\">The pointer to copy data from</param>\n        /// <param name=\"sizeInBytes\">The data size in bytes</param>\n        public void Add<T>(IntPtr ptr, int sizeInBytes)\n            where T : struct\n        {\n            if(sizeInBytes == 0)\n            {\n                // don't do anything if the array is empty\n                return;\n            }\n\n            if (ptr == IntPtr.Zero)\n            {\n                throw new ArgumentNullException(\"Cannot add a null pointer\");\n            }\n\n            if(sizeInBytes < 0)\n            {\n                throw new ArgumentOutOfRangeException(\"sizeInBytes\", \"sizeInBytes cannot be negative\");\n            }\n\n            if(!ByteBuffer.IsSupportedType<T>())\n            {\n                throw new ArgumentException(\"Cannot add this Type array to the builder\");\n            }\n\n            int size = ByteBuffer.SizeOf<T>();\n            if((sizeInBytes % size) != 0)\n            {\n                throw new ArgumentException(\"The given size in bytes \" + sizeInBytes + \" doesn't match the element size of T ( \" + size + \")\", \"sizeInBytes\");\n            }\n\n            // Need to prep on size (for data alignment) and then we pass the\n            // rest of the length (minus 1) as additional bytes\n            Prep(size, sizeInBytes - size);\n            Put<T>(ptr, sizeInBytes);\n        }\n\n#if ENABLE_SPAN_T && UNSAFE_BYTEBUFFER\n        /// <summary>\n        /// Add a span of type T to the buffer (aligns the data and grows if necessary).\n        /// </summary>\n        /// <typeparam name=\"T\">The type of the input data</typeparam>\n        /// <param name=\"x\">The span to copy data from</param>\n        public void Add<T>(Span<T> x)\n            where T : struct\n        {\n            if (!ByteBuffer.IsSupportedType<T>())\n            {\n                throw new ArgumentException(\"Cannot add this Type array to the builder\");\n            }\n\n            int size = ByteBuffer.SizeOf<T>();\n            // Need to prep on size (for data alignment) and then we pass the\n            // rest of the length (minus 1) as additional bytes\n            Prep(size, size * (x.Length - 1));\n            Put(x);\n        }\n#endif\n\n        /// <summary>\n        /// Add a `double` to the buffer (aligns the data and grows if necessary).\n        /// </summary>\n        /// <param name=\"x\">The `double` to add to the buffer.</param>\n        public void AddDouble(double x) { Prep(sizeof(double), 0);\n                                          PutDouble(x); }\n\n        /// <summary>\n        /// Adds an offset, relative to where it will be written.\n        /// </summary>\n        /// <param name=\"off\">The offset to add to the buffer.</param>\n        public void AddOffset(int off)\n        {\n            Prep(sizeof(int), 0);  // Ensure alignment is already done.\n            if (off > Offset)\n                throw new ArgumentException();\n\n            off = Offset - off + sizeof(int);\n            PutInt(off);\n        }\n\n        /// @cond FLATBUFFERS_INTERNAL\n        public void StartVector(int elemSize, int count, int alignment)\n        {\n            NotNested();\n            _vectorNumElems = count;\n            Prep(sizeof(int), elemSize * count);\n            Prep(alignment, elemSize * count); // Just in case alignment > int.\n        }\n        /// @endcond\n\n        /// <summary>\n        /// Writes data necessary to finish a vector construction.\n        /// </summary>\n        public VectorOffset EndVector()\n        {\n            PutInt(_vectorNumElems);\n            return new VectorOffset(Offset);\n        }\n\n        /// <summary>\n        /// Creates a vector of tables.\n        /// </summary>\n        /// <param name=\"offsets\">Offsets of the tables.</param>\n        public VectorOffset CreateVectorOfTables<T>(Offset<T>[] offsets) where T : struct\n        {\n            NotNested();\n            StartVector(sizeof(int), offsets.Length, sizeof(int));\n            for (int i = offsets.Length - 1; i >= 0; i--) AddOffset(offsets[i].Value);\n            return EndVector();\n        }\n\n        /// @cond FLATBUFFERS_INTENRAL\n        public void Nested(int obj)\n        {\n            // Structs are always stored inline, so need to be created right\n            // where they are used. You'll get this assert if you created it\n            // elsewhere.\n            if (obj != Offset)\n                throw new Exception(\n                    \"FlatBuffers: struct must be serialized inline.\");\n        }\n\n        public void NotNested()\n        {\n            // You should not be creating any other objects or strings/vectors\n            // while an object is being constructed\n            if (_vtableSize >= 0)\n                throw new Exception(\n                    \"FlatBuffers: object serialization must not be nested.\");\n        }\n\n        public void StartTable(int numfields)\n        {\n            if (numfields < 0)\n                throw new ArgumentOutOfRangeException(\"Flatbuffers: invalid numfields\");\n\n            NotNested();\n\n            if (_vtable.Length < numfields)\n                _vtable = new int[numfields];\n\n            _vtableSize = numfields;\n            _objectStart = Offset;\n        }\n\n\n        // Set the current vtable at `voffset` to the current location in the\n        // buffer.\n        public void Slot(int voffset)\n        {\n            if (voffset >= _vtableSize)\n                throw new IndexOutOfRangeException(\"Flatbuffers: invalid voffset\");\n\n            _vtable[voffset] = Offset;\n        }\n\n        /// <summary>\n        /// Adds a Boolean to the Table at index `o` in its vtable using the value `x` and default `d`\n        /// </summary>\n        /// <param name=\"o\">The index into the vtable</param>\n        /// <param name=\"x\">The value to put into the buffer. If the value is equal to the default\n        /// and <see cref=\"ForceDefaults\"/> is false, the value will be skipped.</param>\n        /// <param name=\"d\">The default value to compare the value against</param>\n        public void AddBool(int o, bool x, bool d) { if (ForceDefaults || x != d) { AddBool(x); Slot(o); } }\n\n        /// <summary>\n        /// Adds a Boolean to the Table at index `o` in its vtable using the nullable value `x`\n        /// </summary>\n        /// <param name=\"o\">The index into the vtable</param>\n        /// <param name=\"x\">The nullable boolean value to put into the buffer. If it doesn't have a value\n        /// it will skip writing to the buffer.</param>\n        public void AddBool(int o, bool? x) { if (x.HasValue) { AddBool(x.Value); Slot(o); } }\n\n\n        /// <summary>\n        /// Adds a SByte to the Table at index `o` in its vtable using the value `x` and default `d`\n        /// </summary>\n        /// <param name=\"o\">The index into the vtable</param>\n        /// <param name=\"x\">The value to put into the buffer. If the value is equal to the default\n        /// and <see cref=\"ForceDefaults\"/> is false, the value will be skipped.</param>\n        /// <param name=\"d\">The default value to compare the value against</param>\n        public void AddSbyte(int o, sbyte x, sbyte d) { if (ForceDefaults || x != d) { AddSbyte(x); Slot(o); } }\n\n        /// <summary>\n        /// Adds a SByte to the Table at index `o` in its vtable using the nullable value `x`\n        /// </summary>\n        /// <param name=\"o\">The index into the vtable</param>\n        /// <param name=\"x\">The nullable sbyte value to put into the buffer. If it doesn't have a value\n        /// it will skip writing to the buffer.</param>\n        public void AddSbyte(int o, sbyte? x) { if (x.HasValue) { AddSbyte(x.Value); Slot(o); } }\n\n        /// <summary>\n        /// Adds a Byte to the Table at index `o` in its vtable using the value `x` and default `d`\n        /// </summary>\n        /// <param name=\"o\">The index into the vtable</param>\n        /// <param name=\"x\">The value to put into the buffer. If the value is equal to the default\n        /// and <see cref=\"ForceDefaults\"/> is false, the value will be skipped.</param>\n        /// <param name=\"d\">The default value to compare the value against</param>\n        public void AddByte(int o, byte x, byte d) { if (ForceDefaults || x != d) { AddByte(x); Slot(o); } }\n\n        /// <summary>\n        /// Adds a Byte to the Table at index `o` in its vtable using the nullable value `x`\n        /// </summary>\n        /// <param name=\"o\">The index into the vtable</param>\n        /// <param name=\"x\">The nullable byte value to put into the buffer. If it doesn't have a value\n        /// it will skip writing to the buffer.</param>\n        public void AddByte(int o, byte? x) { if (x.HasValue) { AddByte(x.Value); Slot(o); } }\n\n        /// <summary>\n        /// Adds a Int16 to the Table at index `o` in its vtable using the value `x` and default `d`\n        /// </summary>\n        /// <param name=\"o\">The index into the vtable</param>\n        /// <param name=\"x\">The value to put into the buffer. If the value is equal to the default\n        /// and <see cref=\"ForceDefaults\"/> is false, the value will be skipped.</param>\n        /// <param name=\"d\">The default value to compare the value against</param>\n        public void AddShort(int o, short x, int d) { if (ForceDefaults || x != d) { AddShort(x); Slot(o); } }\n\n        /// <summary>\n        /// Adds a Int16 to the Table at index `o` in its vtable using the nullable value `x`\n        /// </summary>\n        /// <param name=\"o\">The index into the vtable</param>\n        /// <param name=\"x\">The nullable int16 value to put into the buffer. If it doesn't have a value\n        /// it will skip writing to the buffer.</param>\n        public void AddShort(int o, short? x) { if (x.HasValue) { AddShort(x.Value); Slot(o); } }\n\n        /// <summary>\n        /// Adds a UInt16 to the Table at index `o` in its vtable using the value `x` and default `d`\n        /// </summary>\n        /// <param name=\"o\">The index into the vtable</param>\n        /// <param name=\"x\">The value to put into the buffer. If the value is equal to the default\n        /// and <see cref=\"ForceDefaults\"/> is false, the value will be skipped.</param>\n        /// <param name=\"d\">The default value to compare the value against</param>\n        public void AddUshort(int o, ushort x, ushort d) { if (ForceDefaults || x != d) { AddUshort(x); Slot(o); } }\n\n        /// <summary>\n        /// Adds a Uint16 to the Table at index `o` in its vtable using the nullable value `x`\n        /// </summary>\n        /// <param name=\"o\">The index into the vtable</param>\n        /// <param name=\"x\">The nullable uint16 value to put into the buffer. If it doesn't have a value\n        /// it will skip writing to the buffer.</param>\n        public void AddUshort(int o, ushort? x) { if (x.HasValue) { AddUshort(x.Value); Slot(o); } }\n\n        /// <summary>\n        /// Adds an Int32 to the Table at index `o` in its vtable using the value `x` and default `d`\n        /// </summary>\n        /// <param name=\"o\">The index into the vtable</param>\n        /// <param name=\"x\">The value to put into the buffer. If the value is equal to the default\n        /// and <see cref=\"ForceDefaults\"/> is false, the value will be skipped.</param>\n        /// <param name=\"d\">The default value to compare the value against</param>\n        public void AddInt(int o, int x, int d) { if (ForceDefaults || x != d) { AddInt(x); Slot(o); } }\n\n        /// <summary>\n        /// Adds a Int32 to the Table at index `o` in its vtable using the nullable value `x`\n        /// </summary>\n        /// <param name=\"o\">The index into the vtable</param>\n        /// <param name=\"x\">The nullable int32 value to put into the buffer. If it doesn't have a value\n        /// it will skip writing to the buffer.</param>\n        public void AddInt(int o, int? x) { if (x.HasValue) { AddInt(x.Value); Slot(o); } }\n\n        /// <summary>\n        /// Adds a UInt32 to the Table at index `o` in its vtable using the value `x` and default `d`\n        /// </summary>\n        /// <param name=\"o\">The index into the vtable</param>\n        /// <param name=\"x\">The value to put into the buffer. If the value is equal to the default\n        /// and <see cref=\"ForceDefaults\"/> is false, the value will be skipped.</param>\n        /// <param name=\"d\">The default value to compare the value against</param>\n        public void AddUint(int o, uint x, uint d) { if (ForceDefaults || x != d) { AddUint(x); Slot(o); } }\n\n        /// <summary>\n        /// Adds a UInt32 to the Table at index `o` in its vtable using the nullable value `x`\n        /// </summary>\n        /// <param name=\"o\">The index into the vtable</param>\n        /// <param name=\"x\">The nullable uint32 value to put into the buffer. If it doesn't have a value\n        /// it will skip writing to the buffer.</param>\n        public void AddUint(int o, uint? x) { if (x.HasValue) { AddUint(x.Value); Slot(o); } }\n\n        /// <summary>\n        /// Adds an Int64 to the Table at index `o` in its vtable using the value `x` and default `d`\n        /// </summary>\n        /// <param name=\"o\">The index into the vtable</param>\n        /// <param name=\"x\">The value to put into the buffer. If the value is equal to the default\n        /// and <see cref=\"ForceDefaults\"/> is false, the value will be skipped.</param>\n        /// <param name=\"d\">The default value to compare the value against</param>\n        public void AddLong(int o, long x, long d) { if (ForceDefaults || x != d) { AddLong(x); Slot(o); } }\n\n        /// <summary>\n        /// Adds a Int64 to the Table at index `o` in its vtable using the nullable value `x`\n        /// </summary>\n        /// <param name=\"o\">The index into the vtable</param>\n        /// <param name=\"x\">The nullable int64 value to put into the buffer. If it doesn't have a value\n        /// it will skip writing to the buffer.</param>\n        public void AddLong(int o, long? x) { if (x.HasValue) { AddLong(x.Value); Slot(o); } }\n\n        /// <summary>\n        /// Adds a UInt64 to the Table at index `o` in its vtable using the value `x` and default `d`\n        /// </summary>\n        /// <param name=\"o\">The index into the vtable</param>\n        /// <param name=\"x\">The value to put into the buffer. If the value is equal to the default\n        /// and <see cref=\"ForceDefaults\"/> is false, the value will be skipped.</param>\n        /// <param name=\"d\">The default value to compare the value against</param>\n        public void AddUlong(int o, ulong x, ulong d) { if (ForceDefaults || x != d) { AddUlong(x); Slot(o); } }\n\n        /// <summary>\n        /// Adds a UInt64 to the Table at index `o` in its vtable using the nullable value `x`\n        /// </summary>\n        /// <param name=\"o\">The index into the vtable</param>\n        /// <param name=\"x\">The nullable int64 value to put into the buffer. If it doesn't have a value\n        /// it will skip writing to the buffer.</param>\n        public void AddUlong(int o, ulong? x) { if (x.HasValue) { AddUlong(x.Value); Slot(o); } }\n\n        /// <summary>\n        /// Adds a Single to the Table at index `o` in its vtable using the value `x` and default `d`\n        /// </summary>\n        /// <param name=\"o\">The index into the vtable</param>\n        /// <param name=\"x\">The value to put into the buffer. If the value is equal to the default\n        /// and <see cref=\"ForceDefaults\"/> is false, the value will be skipped.</param>\n        /// <param name=\"d\">The default value to compare the value against</param>\n        public void AddFloat(int o, float x, double d) { if (ForceDefaults || x != d) { AddFloat(x); Slot(o); } }\n\n        /// <summary>\n        /// Adds a Single to the Table at index `o` in its vtable using the nullable value `x`\n        /// </summary>\n        /// <param name=\"o\">The index into the vtable</param>\n        /// <param name=\"x\">The nullable single value to put into the buffer. If it doesn't have a value\n        /// it will skip writing to the buffer.</param>\n        public void AddFloat(int o, float? x) { if (x.HasValue) { AddFloat(x.Value); Slot(o); } }\n\n        /// <summary>\n        /// Adds a Double to the Table at index `o` in its vtable using the value `x` and default `d`\n        /// </summary>\n        /// <param name=\"o\">The index into the vtable</param>\n        /// <param name=\"x\">The value to put into the buffer. If the value is equal to the default\n        /// and <see cref=\"ForceDefaults\"/> is false, the value will be skipped.</param>\n        /// <param name=\"d\">The default value to compare the value against</param>\n        public void AddDouble(int o, double x, double d) { if (ForceDefaults || x != d) { AddDouble(x); Slot(o); } }\n\n        /// <summary>\n        /// Adds a Double to the Table at index `o` in its vtable using the nullable value `x`\n        /// </summary>\n        /// <param name=\"o\">The index into the vtable</param>\n        /// <param name=\"x\">The nullable double value to put into the buffer. If it doesn't have a value\n        /// it will skip writing to the buffer.</param>\n        public void AddDouble(int o, double? x) { if (x.HasValue) { AddDouble(x.Value); Slot(o); } }\n\n        /// <summary>\n        /// Adds a buffer offset to the Table at index `o` in its vtable using the value `x` and default `d`\n        /// </summary>\n        /// <param name=\"o\">The index into the vtable</param>\n        /// <param name=\"x\">The value to put into the buffer. If the value is equal to the default\n        /// the value will be skipped.</param>\n        /// <param name=\"d\">The default value to compare the value against</param>\n        public void AddOffset(int o, int x, int d) { if (x != d) { AddOffset(x); Slot(o); } }\n        /// @endcond\n\n        /// <summary>\n        /// Encode the string `s` in the buffer using UTF-8.\n        /// </summary>\n        /// <param name=\"s\">The string to encode.</param>\n        /// <returns>\n        /// The offset in the buffer where the encoded string starts.\n        /// </returns>\n        public StringOffset CreateString(string s)\n        {\n            if (s == null)\n            {\n                return new StringOffset(0);\n            }\n            NotNested();\n            AddByte(0);\n            var utf8StringLen = Encoding.UTF8.GetByteCount(s);\n            StartVector(1, utf8StringLen, 1);\n            _bb.PutStringUTF8(_space -= utf8StringLen, s);\n            return new StringOffset(EndVector().Value);\n        }\n\n\n#if ENABLE_SPAN_T && UNSAFE_BYTEBUFFER\n        /// <summary>\n        /// Creates a string in the buffer from a Span containing\n        /// a UTF8 string.\n        /// </summary>\n        /// <param name=\"chars\">the UTF8 string to add to the buffer</param>\n        /// <returns>\n        /// The offset in the buffer where the encoded string starts.\n        /// </returns>\n        public StringOffset CreateUTF8String(Span<byte> chars)\n        {\n            NotNested();\n            AddByte(0);\n            var utf8StringLen = chars.Length;\n            StartVector(1, utf8StringLen, 1);\n            _space = _bb.Put(_space, chars);\n            return new StringOffset(EndVector().Value);\n        }\n#endif\n\n        /// <summary>\n        /// Store a string in the buffer, which can contain any binary data.\n        /// If a string with this exact contents has already been serialized before,\n        /// instead simply returns the offset of the existing string.\n        /// </summary>\n        /// <param name=\"s\">The string to encode.</param>\n        /// <returns>\n        /// The offset in the buffer where the encoded string starts.\n        /// </returns>\n        public StringOffset CreateSharedString(string s)\n        {\n            if (s == null)\n            {\n              return new StringOffset(0);\n            }\n\n            if (_sharedStringMap == null)\n            {\n                _sharedStringMap = new Dictionary<string, StringOffset>();\n            }\n\n            if (_sharedStringMap.ContainsKey(s))\n            {\n                return _sharedStringMap[s];\n            }\n\n            var stringOffset = CreateString(s);\n            _sharedStringMap.Add(s, stringOffset);\n            return stringOffset;\n        }\n\n        /// @cond FLATBUFFERS_INTERNAL\n        // Structs are stored inline, so nothing additional is being added.\n        // `d` is always 0.\n        public void AddStruct(int voffset, int x, int d)\n        {\n            if (x != d)\n            {\n                Nested(x);\n                Slot(voffset);\n            }\n        }\n\n        public int EndTable()\n        {\n            if (_vtableSize < 0)\n                throw new InvalidOperationException(\n                  \"Flatbuffers: calling EndTable without a StartTable\");\n\n            AddInt((int)0);\n            var vtableloc = Offset;\n            // Write out the current vtable.\n            int i = _vtableSize - 1;\n            // Trim trailing zeroes.\n            for (; i >= 0 && _vtable[i] == 0; i--) {}\n            int trimmedSize = i + 1;\n            for (; i >= 0 ; i--) {\n                // Offset relative to the start of the table.\n                short off = (short)(_vtable[i] != 0\n                                        ? vtableloc - _vtable[i]\n                                        : 0);\n                AddShort(off);\n\n                // clear out written entry\n                _vtable[i] = 0;\n            }\n\n            const int standardFields = 2; // The fields below:\n            AddShort((short)(vtableloc - _objectStart));\n            AddShort((short)((trimmedSize + standardFields) *\n                             sizeof(short)));\n\n            // Search for an existing vtable that matches the current one.\n            int existingVtable = 0;\n            for (i = 0; i < _numVtables; i++) {\n                int vt1 = _bb.Length - _vtables[i];\n                int vt2 = _space;\n                short len = _bb.GetShort(vt1);\n                if (len == _bb.GetShort(vt2)) {\n                    for (int j = sizeof(short); j < len; j += sizeof(short)) {\n                        if (_bb.GetShort(vt1 + j) != _bb.GetShort(vt2 + j)) {\n                            goto endLoop;\n                        }\n                    }\n                    existingVtable = _vtables[i];\n                    break;\n                }\n\n                endLoop: { }\n            }\n\n            if (existingVtable != 0) {\n                // Found a match:\n                // Remove the current vtable.\n                _space = _bb.Length - vtableloc;\n                // Point table to existing vtable.\n                _bb.PutInt(_space, existingVtable - vtableloc);\n            } else {\n                // No match:\n                // Add the location of the current vtable to the list of\n                // vtables.\n                if (_numVtables == _vtables.Length)\n                {\n                    // Arrays.CopyOf(vtables num_vtables * 2);\n                    var newvtables = new int[ _numVtables * 2];\n                    Array.Copy(_vtables, newvtables, _vtables.Length);\n\n                    _vtables = newvtables;\n                };\n                _vtables[_numVtables++] = Offset;\n                // Point table to current vtable.\n                _bb.PutInt(_bb.Length - vtableloc, Offset - vtableloc);\n            }\n\n            _vtableSize = -1;\n            return vtableloc;\n        }\n\n        // This checks a required field has been set in a given table that has\n        // just been constructed.\n        public void Required(int table, int field)\n        {\n          int table_start = _bb.Length - table;\n          int vtable_start = table_start - _bb.GetInt(table_start);\n          bool ok = _bb.GetShort(vtable_start + field) != 0;\n          // If this fails, the caller will show what field needs to be set.\n          if (!ok)\n            throw new InvalidOperationException(\"FlatBuffers: field \" + field +\n                                                \" must be set\");\n        }\n        /// @endcond\n\n        /// <summary>\n        /// Finalize a buffer, pointing to the given `root_table`.\n        /// </summary>\n        /// <param name=\"rootTable\">\n        /// An offset to be added to the buffer.\n        /// </param>\n        /// <param name=\"sizePrefix\">\n        /// Whether to prefix the size to the buffer.\n        /// </param>\n        protected void Finish(int rootTable, bool sizePrefix)\n        {\n            Prep(_minAlign, sizeof(int) + (sizePrefix ? sizeof(int) : 0));\n            AddOffset(rootTable);\n            if (sizePrefix) {\n                AddInt(_bb.Length - _space);\n            }\n            _bb.Position = _space;\n        }\n\n        /// <summary>\n        /// Finalize a buffer, pointing to the given `root_table`.\n        /// </summary>\n        /// <param name=\"rootTable\">\n        /// An offset to be added to the buffer.\n        /// </param>\n        public void Finish(int rootTable)\n        {\n            Finish(rootTable, false);\n        }\n\n        /// <summary>\n        /// Finalize a buffer, pointing to the given `root_table`, with the size prefixed.\n        /// </summary>\n        /// <param name=\"rootTable\">\n        /// An offset to be added to the buffer.\n        /// </param>\n        public void FinishSizePrefixed(int rootTable)\n        {\n            Finish(rootTable, true);\n        }\n\n        /// <summary>\n        /// Get the ByteBuffer representing the FlatBuffer.\n        /// </summary>\n        /// <remarks>\n        /// This is typically only called after you call `Finish()`.\n        /// The actual data starts at the ByteBuffer's current position,\n        /// not necessarily at `0`.\n        /// </remarks>\n        /// <returns>\n        /// Returns the ByteBuffer for this FlatBuffer.\n        /// </returns>\n        public ByteBuffer DataBuffer { get { return _bb; } }\n\n        /// <summary>\n        /// A utility function to copy and return the ByteBuffer data as a\n        /// `byte[]`.\n        /// </summary>\n        /// <returns>\n        /// A full copy of the FlatBuffer data.\n        /// </returns>\n        public byte[] SizedByteArray()\n        {\n            return _bb.ToSizedArray();\n        }\n\n#if ENABLE_SPAN_T && UNSAFE_BYTEBUFFER\n        /// <summary>\n        /// A utility function return the ByteBuffer data as a\n        /// `ReadOnlySpan<byte>`.\n        /// </summary>\n        /// <returns>\n        /// A `ReadOnlySpan<byte>` that references the internal \n        /// ByteBuffer data.\n        /// </returns>\n        public ReadOnlySpan<byte> SizedReadOnlySpan()\n        {\n            return _bb.ToSizedReadOnlySpan();\n        }\n#endif\n\n        /// <summary>\n        /// Finalize a buffer, pointing to the given `rootTable`.\n        /// </summary>\n        /// <param name=\"rootTable\">\n        /// An offset to be added to the buffer.\n        /// </param>\n        /// <param name=\"fileIdentifier\">\n        /// A FlatBuffer file identifier to be added to the buffer before\n        /// `root_table`.\n        /// </param>\n        /// <param name=\"sizePrefix\">\n        /// Whether to prefix the size to the buffer.\n        /// </param>\n        protected void Finish(int rootTable, string fileIdentifier, bool sizePrefix)\n        {\n            Prep(_minAlign, sizeof(int) + (sizePrefix ? sizeof(int) : 0) +\n                            FlatBufferConstants.FileIdentifierLength);\n            if (fileIdentifier.Length !=\n                FlatBufferConstants.FileIdentifierLength)\n                throw new ArgumentException(\n                    \"FlatBuffers: file identifier must be length \" +\n                    FlatBufferConstants.FileIdentifierLength,\n                    \"fileIdentifier\");\n            for (int i = FlatBufferConstants.FileIdentifierLength - 1; i >= 0;\n                 i--)\n            {\n               AddByte((byte)fileIdentifier[i]);\n            }\n            Finish(rootTable, sizePrefix);\n        }\n\n        /// <summary>\n        /// Finalize a buffer, pointing to the given `rootTable`.\n        /// </summary>\n        /// <param name=\"rootTable\">\n        /// An offset to be added to the buffer.\n        /// </param>\n        /// <param name=\"fileIdentifier\">\n        /// A FlatBuffer file identifier to be added to the buffer before\n        /// `root_table`.\n        /// </param>\n        public void Finish(int rootTable, string fileIdentifier)\n        {\n            Finish(rootTable, fileIdentifier, false);\n        }\n\n        /// <summary>\n        /// Finalize a buffer, pointing to the given `rootTable`, with the size prefixed.\n        /// </summary>\n        /// <param name=\"rootTable\">\n        /// An offset to be added to the buffer.\n        /// </param>\n        /// <param name=\"fileIdentifier\">\n        /// A FlatBuffer file identifier to be added to the buffer before\n        /// `root_table`.\n        /// </param>\n        public void FinishSizePrefixed(int rootTable, string fileIdentifier)\n        {\n            Finish(rootTable, fileIdentifier, true);\n        }\n    }\n}\n\n/// @}\n"
  },
  {
    "path": "net/FlatBuffers/FlatBufferConstants.cs",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace Google.FlatBuffers\n{\n    public static class FlatBufferConstants\n    {\n        public const int FileIdentifierLength = 4;\n        public const int SizePrefixLength = 4;\n        /** A version identifier to force a compile error if someone\n        accidentally tries to build generated code with a runtime of\n        two mismatched version. Versions need to always match, as\n        the runtime and generated code are modified in sync.\n        Changes to the C# implementation need to be sure to change\n        the version here and in the code generator on every possible\n        incompatible change */\n        public static void FLATBUFFERS_25_12_19() {}\n    }\n}\n"
  },
  {
    "path": "net/FlatBuffers/FlatBufferVerify.cs",
    "content": "﻿/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nusing System;\nusing System.Reflection;using System.Collections.Generic;\nusing System.IO;\n\nnamespace Google.FlatBuffers\n{\n\n  /// <summary>\n  /// The Class of the Verifier Options\n  /// </summary>\n  public class Options\n  {\n    public const int DEFAULT_MAX_DEPTH = 64;\n    public const int DEFAULT_MAX_TABLES = 1000000;\n\n    private int max_depth = 0;\n    private int max_tables = 0;\n    private bool string_end_check = false;\n    private bool alignment_check = false;\n\n    public Options()\n    {\n      max_depth = DEFAULT_MAX_DEPTH;\n      max_tables = DEFAULT_MAX_TABLES;\n      string_end_check = true;\n      alignment_check = true;\n    }\n\n    public Options(int maxDepth, int maxTables, bool stringEndCheck, bool alignmentCheck)\n    {\n      max_depth = maxDepth;\n      max_tables = maxTables;\n      string_end_check = stringEndCheck;\n      alignment_check = alignmentCheck;\n    }\n    /// <summary> Maximum depth of nested tables allowed in a valid flatbuffer. </summary>\n    public int maxDepth\n    {\n      get { return max_depth; }\n      set { max_depth = value; }\n    }\n    /// <summary> Maximum number of tables allowed in a valid flatbuffer. </summary>\n    public int maxTables\n    {\n      get { return max_tables; }\n      set { max_tables = value; }\n    }\n    /// <summary> Check that string contains its null terminator </summary>\n    public bool stringEndCheck\n    {\n      get { return string_end_check; }\n      set { string_end_check = value; }\n    }\n    /// <summary> Check alignment of elements </summary>\n    public bool alignmentCheck\n    {\n      get { return alignment_check; }\n      set { alignment_check = value; }\n    }\n  }\n\n  public struct checkElementStruct\n  {\n    public bool elementValid;\n    public uint elementOffset;\n  }\n\n  public delegate bool VerifyTableAction(Verifier verifier, uint tablePos);\n  public delegate bool VerifyUnionAction(Verifier verifier, byte typeId, uint tablePos);\n\n  /// <summary>\n  /// The Main Class of the FlatBuffer Verifier\n  /// </summary>\n  public class Verifier\n  {\n    private ByteBuffer verifier_buffer = null;\n    private Options verifier_options = null;\n    private int depth_cnt = 0;\n    private int num_tables_cnt = 0;\n\n    public const int SIZE_BYTE = 1;\n    public const int SIZE_INT = 4;\n    public const int SIZE_U_OFFSET = 4;\n    public const int SIZE_S_OFFSET = 4;\n    public const int SIZE_V_OFFSET = 2;\n    public const int SIZE_PREFIX_LENGTH = FlatBufferConstants.SizePrefixLength;         // default size = 4\n    public const int FLATBUFFERS_MAX_BUFFER_SIZE = System.Int32.MaxValue;               // default size = 2147483647\n    public const int FILE_IDENTIFIER_LENGTH = FlatBufferConstants.FileIdentifierLength; // default size = 4\n\n    /// <summary> The Base Constructor of the Verifier object </summary>\n    public Verifier()\n    {\n      // Verifier buffer\n      verifier_buffer = null;\n      // Verifier settings \n      verifier_options = null;\n      // Depth counter\n      depth_cnt = 0;\n      // Tables counter\n      num_tables_cnt = 0;\n    }\n\n    /// <summary> The Constructor of the Verifier object with input parameters: ByteBuffer and/or Options </summary>\n    /// <param name=\"buf\"> Input flat byte buffer defined as ByteBuffer type</param>\n    /// <param name=\"options\"> Options object with settings for the coniguration the Verifier </param>\n    public Verifier(ByteBuffer buf, Options options = null)\n    {\n      verifier_buffer = buf;\n      verifier_options = options ?? new Options();\n      depth_cnt = 0;\n      num_tables_cnt = 0;\n    }\n\n    /// <summary> Bytes Buffer for Verify</summary>\n    public ByteBuffer Buf\n    {\n      get { return verifier_buffer; }\n      set { verifier_buffer = value; }\n    }\n    /// <summary> Options of the Verifier </summary>\n    public Options options\n    {\n      get { return verifier_options; }\n      set { verifier_options = value; }\n    }\n    /// <summary> Counter of tables depth in a tested flatbuffer  </summary>\n    public int depth\n    {\n      get { return depth_cnt; }\n      set { depth_cnt = value; }\n    }\n    /// <summary> Counter of tables in a tested flatbuffer </summary>\n    public int numTables\n    {\n      get { return num_tables_cnt; }\n      set { num_tables_cnt = value; }\n    }\n\n\n    /// <summary> Method set maximum tables depth of valid structure</summary>\n    /// <param name=\"value\"> Specify Value of the maximum depth of the structure</param>\n    public Verifier SetMaxDepth(int value)\n    {\n      verifier_options.maxDepth = value;\n      return this;\n    }\n    /// <summary> Specify maximum number of tables in structure </summary>\n    /// <param name=\"value\"> Specify Value of the maximum number of the tables in the structure</param>\n    public Verifier SetMaxTables(int value)\n    {\n      verifier_options.maxTables = value;\n      return this;\n    }\n    /// <summary> Enable/disable buffer content alignment check </summary>\n    /// <param name=\"value\"> Value of the State for buffer content alignment check (Enable = true) </param>\n    public Verifier SetAlignmentCheck(bool value)\n    {\n      verifier_options.alignmentCheck = value;\n      return this;\n    }\n    /// <summary> Enable/disable checking of string termination '0' character </summary>\n    /// <param name=\"value\"> Value of the option for string termination '0' character check (Enable = true)</param>\n    public Verifier SetStringCheck(bool value)\n    {\n      verifier_options.stringEndCheck = value;\n      return this;\n    }\n\n    /// <summary> Check if there is identifier in buffer </summary>\n    /// <param name=\"buf\"> Input flat byte buffer defined as ByteBuffer type </param>\n    /// <param name=\"startPos\">Start position of data in the Byte Buffer</param>\n    /// <param name=\"identifier\"> Identifier for the Byte Buffer</param>\n    /// <returns> Return True when the Byte Buffer Identifier is present</returns>\n    private bool BufferHasIdentifier(ByteBuffer buf, uint startPos, string identifier)\n    {\n      if (identifier.Length != FILE_IDENTIFIER_LENGTH)\n      {\n        throw new ArgumentException(\"FlatBuffers: file identifier must be length\" + Convert.ToString(FILE_IDENTIFIER_LENGTH));\n      }\n      for (int i = 0; i < FILE_IDENTIFIER_LENGTH; i++)\n      {\n        if ((sbyte)identifier[i] != verifier_buffer.GetSbyte(Convert.ToInt32(SIZE_S_OFFSET + i + startPos)))\n        {\n          return false;\n        }\n      }\n\n      return true;\n    }\n\n    /// <summary> Get UOffsetT from buffer at given position - it must be verified before read </summary>\n    /// <param name=\"buf\"> Input flat byte buffer defined as ByteBuffer type </param>\n    /// <param name=\"pos\"> Position of data in the Byte Buffer</param>\n    /// <returns> Return the UOffset Value (Unsigned Integer type - 4 bytes) in pos </returns>\n    private uint ReadUOffsetT(ByteBuffer buf, uint pos)\n    {\n      return buf.GetUint(Convert.ToInt32(pos));\n    }\n    /// <summary> Get SOffsetT from buffer at given position - it must be verified before read </summary>\n    /// <param name=\"buf\"> Input flat byte buffer defined as ByteBuffer type </param>\n    /// <param name=\"pos\"> Position of data in the Byte Buffer</param>\n    /// <returns> Return the SOffset Value (Signed Integer type - 4 bytes) in pos </returns>\n    private int ReadSOffsetT(ByteBuffer buf, int pos)\n    {\n      return buf.GetInt(pos);\n    }\n    /// <summary> Get VOffsetT from buffer at given position - it must be verified before read </summary>\n    /// <param name=\"buf\"> Input flat byte buffer defined as ByteBuffer type </param>\n    /// <param name=\"pos\"> Position of data in the Byte Buffer</param>\n    /// <returns> Return the VOffset Value (Short type - 2 bytes) in pos </returns>\n    private short ReadVOffsetT(ByteBuffer buf, int pos)\n    {\n      return buf.GetShort(pos);\n    }\n\n    /// <summary> Get table data area relative offset from vtable. Result is relative to table start\n    ///           Fields which are deprecated are ignored by checking against the vtable's length. </summary>\n    /// <param name=\"pos\"> Position of data in the Byte Buffer </param>\n    /// <param name=\"vtableOffset\"> offset of value in the Table</param>\n    /// <returns> Return the relative VOffset Value (Short type - 2 bytes) in calculated offset </returns>\n    private short GetVRelOffset(int pos, short vtableOffset)\n    {\n      short VOffset = 0;\n      // Used try/catch because pos typa as int 32bit\n      try\n      {\n        // First, get vtable offset\n        short vtable = Convert.ToInt16(pos - ReadSOffsetT(verifier_buffer, pos));\n        // Check that offset points to vtable area (is smaller than vtable size)\n        if (vtableOffset < ReadVOffsetT(verifier_buffer, vtable))\n        {\n          // Now, we can read offset value - TODO check this value against size of table data\n          VOffset = ReadVOffsetT(verifier_buffer, vtable + vtableOffset);\n        }\n        else\n        {\n          VOffset = 0;\n        }\n      }\n      catch (Exception e)\n      {\n        Console.WriteLine(\"Exception: {0}\", e);\n        return VOffset;\n      }\n      return VOffset;\n\n    }\n    /// <summary> Get table data area absolute offset from vtable. Result is the absolute buffer offset.\n    /// The result value offset cannot be '0' (pointing to itself) so after validation this method returnes '0'\n    /// value as a marker for missing optional entry </summary>\n    /// <param name=\"tablePos\"> Table Position value in the Byte Buffer </param>\n    /// <param name=\"vtableOffset\"> offset value in the Table</param>\n    /// <returns> Return the absolute UOffset Value </returns>\n    private uint GetVOffset(uint tablePos, short vtableOffset)\n    {\n      uint UOffset = 0;\n      // First, get vtable relative offset\n      short relPos = GetVRelOffset(Convert.ToInt32(tablePos), vtableOffset);\n      if (relPos != 0)\n      {\n        // Calculate offset based on table postion\n        UOffset = Convert.ToUInt32(tablePos + relPos);\n      }\n      else\n      {\n        UOffset = 0;\n      }\n      return UOffset;\n    }\n\n    /// <summary> Check flatbuffer complexity (tables depth, elements counter and so on) </summary>\n    /// <returns> If complexity is too high function returns false as verification error </returns>\n    private bool CheckComplexity()\n    {\n      return ((depth <= options.maxDepth) && (numTables <= options.maxTables));\n    }\n\n    /// <summary> Check alignment of element. </summary>\n    /// <returns> Return True when alignment of the element is correct</returns>\n    private bool CheckAlignment(uint element, ulong align)\n    {\n      return (((element & (align - 1)) == 0) || (!options.alignmentCheck));\n    }\n\n    /// <summary> Check if element is valid in buffer area. </summary> \n    /// <param name=\"pos\"> Value defines the offset/position to element</param>\n    /// <param name=\"elementSize\"> Size of element</param>\n    /// <returns> Return True when Element is correct </returns>\n    private bool CheckElement(uint pos, ulong elementSize)\n    {\n      return ((elementSize < Convert.ToUInt64(verifier_buffer.Length)) && (pos <= (Convert.ToUInt32(verifier_buffer.Length) - elementSize)));\n    }\n    /// <summary> Check if element is a valid scalar. </summary>\n    /// <param name=\"pos\"> Value defines the offset to scalar</param>\n    /// <param name=\"elementSize\"> Size of element</param>\n    /// <returns> Return True when Scalar Element is correct </returns>\n    private bool CheckScalar(uint pos, ulong elementSize)\n    {\n      return ((CheckAlignment(pos, elementSize)) && (CheckElement(pos, elementSize)));\n    }\n    /// <summary> Check offset. It is a scalar with size of UOffsetT. </summary>\n    private bool CheckOffset(uint offset)\n    {\n      return (CheckScalar(offset, SIZE_U_OFFSET));\n    }\n\n    private checkElementStruct CheckVectorOrString(uint pos, ulong elementSize)\n    {\n      var result = new checkElementStruct\n      {\n        elementValid = false,\n        elementOffset = 0\n      };\n\n      uint vectorPos = pos;\n      // Check we can read the vector/string size field (it is of uoffset size)\n      if (!CheckScalar(vectorPos, SIZE_U_OFFSET))\n      {\n        // result.elementValid = false; result.elementOffset = 0;\n        return result;\n      }\n      // Check the whole array. If this is a string, the byte past the array\n      // must be 0.\n      uint size = ReadUOffsetT(verifier_buffer, vectorPos);\n      ulong max_elements = (FLATBUFFERS_MAX_BUFFER_SIZE / elementSize);\n      if (size >= max_elements)\n      {\n        // Protect against byte_size overflowing. \n        // result.elementValid = false; result.elementOffset = 0;\n        return result;\n      }\n\n      uint bytes_size = SIZE_U_OFFSET + (Convert.ToUInt32(elementSize) * size);\n      uint buffer_end_pos = vectorPos + bytes_size;\n      result.elementValid = CheckElement(vectorPos, bytes_size);\n      result.elementOffset = buffer_end_pos;\n      return (result);\n    }\n\n    /// <summary>Verify a string at given position.</summary>\n    private bool CheckString(uint pos)\n    {\n      var result = CheckVectorOrString(pos, SIZE_BYTE);\n      if (options.stringEndCheck)\n      {\n        result.elementValid = result.elementValid && CheckScalar(result.elementOffset, 1); // Must have terminator\n        result.elementValid = result.elementValid && (verifier_buffer.GetSbyte(Convert.ToInt32(result.elementOffset)) == 0); // Terminating byte must be 0.\n      }\n      return result.elementValid;\n    }\n\n    /// <summary> Verify the vector of elements of given size </summary>\n    private bool CheckVector(uint pos, ulong elementSize)\n    {\n      var result = CheckVectorOrString(pos, elementSize);\n      return result.elementValid;\n    }\n    /// <summary> Verify table content using structure dependent generated function </summary>\n    private bool CheckTable(uint tablePos, VerifyTableAction verifyAction)\n    {\n      return verifyAction(this, tablePos);\n    }\n\n    /// <summary> String check wrapper function to be used in vector of strings check </summary>\n    private bool CheckStringFunc(Verifier verifier, uint pos)\n    {\n      return verifier.CheckString(pos);\n    }\n\n    /// <summary> Check vector of objects. Use generated object verification function </summary>\n    private bool CheckVectorOfObjects(uint pos, VerifyTableAction verifyAction)\n    {\n      if (!CheckVector(pos, SIZE_U_OFFSET))\n      {\n        return false;\n      }\n      uint size = ReadUOffsetT(verifier_buffer, pos);\n      // Vector data starts just after vector size/length\n      uint vecStart = pos + SIZE_U_OFFSET;\n      uint vecOff = 0;\n      // Iterate offsets and verify referenced objects\n      for (uint i = 0; i < size; i++)\n      {\n        vecOff = vecStart + (i * SIZE_U_OFFSET);\n        if (!CheckIndirectOffset(vecOff))\n        {\n          return false;\n        }\n        uint objOffset = GetIndirectOffset(vecOff);\n        if (!verifyAction(this, objOffset))\n        {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /// <summary> Check if the offset referenced by offsetPos is the valid offset pointing to buffer</summary>\n    //  offsetPos - offset to offset data\n    private bool CheckIndirectOffset(uint pos)\n    {\n      // Check the input offset is valid\n      if(!CheckScalar(pos, SIZE_U_OFFSET))\n      {\n        return false;\n      }\n      // Get indirect offset\n      uint offset = ReadUOffsetT(verifier_buffer, pos);\n      // May not point to itself neither wrap around  (buffers are max 2GB)\n      if ((offset == 0) || (offset >= FLATBUFFERS_MAX_BUFFER_SIZE))\n      {\n        return false;\n      }\n      // Must be inside the buffer\n      return CheckElement(pos + offset, 1);\n    }\n\n    /// <summary> Check flatbuffer content using generated object verification function </summary>\n    private bool CheckBufferFromStart(string identifier, uint startPos, VerifyTableAction verifyAction)\n    {\n      if ((identifier != null) &&\n          (identifier.Length == 0) &&\n          ((verifier_buffer.Length < (SIZE_U_OFFSET + FILE_IDENTIFIER_LENGTH)) || (!BufferHasIdentifier(verifier_buffer, startPos, identifier))))\n      {\n        return false;\n      }\n      if(!CheckIndirectOffset(startPos))\n      {\n        return false;\n      }\n      uint offset = GetIndirectOffset(startPos);\n      return CheckTable(offset, verifyAction); //  && GetComputedSize()\n    }\n\n    /// <summary> Get indirect offset. It is an offset referenced by offset Pos </summary>\n    private uint GetIndirectOffset(uint pos)\n    {\n      // Get indirect offset referenced by offsetPos\n      uint offset = pos + ReadUOffsetT(verifier_buffer, pos);\n      return offset;\n    }\n\n    /// <summary> Verify beginning of table </summary>\n    /// <param name=\"tablePos\"> Position in the Table </param>\n    /// <returns> Return True when the verification of the beginning of the table is passed</returns> \n    // (this method is used internally by generated verification functions)\n    public bool VerifyTableStart(uint tablePos)\n    {\n      // Starting new table verification increases complexity of structure\n      depth_cnt++;\n      num_tables_cnt++;\n\n      if (!CheckScalar(tablePos, SIZE_S_OFFSET))\n      {\n        return false;\n      }\n      uint vtable = (uint)(tablePos - ReadSOffsetT(verifier_buffer, Convert.ToInt32(tablePos)));\n      return ((CheckComplexity()) && (CheckScalar(vtable, SIZE_V_OFFSET)) && (CheckAlignment(Convert.ToUInt32(ReadVOffsetT(verifier_buffer, Convert.ToInt32(vtable))), SIZE_V_OFFSET)) && (CheckElement(vtable, Convert.ToUInt64(ReadVOffsetT(verifier_buffer, Convert.ToInt32(vtable))))));\n    }\n\n    /// <summary> Verify end of table. In practice, this function does not check buffer but handles\n    /// verification statistics update </summary>\n    // (this method is used internally by generated verification functions)\n    public bool VerifyTableEnd(uint tablePos)\n    {\n      depth--;\n      return true;\n    }\n\n    /// <summary> Verifiy static/inlined data area field </summary>\n    /// <param name=\"tablePos\"> Position in the Table</param>\n    /// <param name=\"offsetId\"> Offset to the static/inlined data element </param>\n    /// <param name=\"elementSize\"> Size of the element </param>\n    /// <param name=\"align\"> Alignment bool value </param>\n    /// <param name=\"required\"> Required Value when the offset == 0 </param>\n    /// <returns>Return True when the verification of the static/inlined data element is passed</returns>\n    // (this method is used internally by generated verification functions)\n    public bool VerifyField(uint tablePos, short offsetId, ulong elementSize, ulong align, bool required)\n    {\n      uint offset = GetVOffset(tablePos, offsetId);\n      if (offset != 0)\n      {\n        return ((CheckAlignment(offset, align)) && (CheckElement(offset, elementSize)));\n      }\n      return !required; // it is OK if field is not required\n    }\n\n    /// <summary> Verify string </summary> \n    /// <param name=\"tablePos\"> Position in the Table</param>\n    /// <param name=\"vOffset\"> Offset to the String element </param>\n    /// <param name=\"required\"> Required Value when the offset == 0 </param>\n    /// <returns>Return True when the verification of the String is passed</returns>\n    // (this method is used internally by generated verification functions)\n    public bool VerifyString(uint tablePos, short vOffset, bool required)\n    {\n      var offset = GetVOffset(tablePos, vOffset);\n      if (offset == 0)\n      {\n        return !required;\n      }\n      if (!CheckIndirectOffset(offset))\n      {\n        return false;\n      }\n      var strOffset = GetIndirectOffset(offset);\n      return CheckString(strOffset);\n    }\n\n    /// <summary> Verify vector of fixed size structures and scalars </summary>\n    /// <param name=\"tablePos\"> Position in the Table</param>\n    /// <param name=\"vOffset\"> Offset to the Vector of Data </param>\n    /// <param name=\"elementSize\"> Size of the element</param>\n    /// <param name=\"required\"> Required Value when the offset == 0 </param>\n    /// <returns>Return True when the verification of the Vector of Data passed</returns>\n    // (this method is used internally by generated verification functions)\n    public bool VerifyVectorOfData(uint tablePos, short vOffset, ulong elementSize, bool required)\n    {\n      var offset = GetVOffset(tablePos, vOffset);\n      if (offset == 0)\n      {\n        return !required;\n      }\n      if (!CheckIndirectOffset(offset))\n      {\n        return false;\n      }\n      var vecOffset = GetIndirectOffset(offset);\n      return  CheckVector(vecOffset, elementSize);\n    }\n\n    /// <summary> Verify array of strings </summary>\n    /// <param name=\"tablePos\"> Position in the Table</param>\n    /// <param name=\"offsetId\"> Offset to the Vector of String </param>\n    /// <param name=\"required\"> Required Value when the offset == 0 </param>\n    /// <returns>Return True when the verification of the Vector of String passed</returns>\n    // (this method is used internally by generated verification functions)\n    public bool VerifyVectorOfStrings(uint tablePos, short offsetId, bool required)\n    {\n      var offset = GetVOffset(tablePos, offsetId);\n      if (offset == 0)\n      {\n        return !required;\n      }\n      if (!CheckIndirectOffset(offset))\n      {\n        return false;\n      }\n      var vecOffset = GetIndirectOffset(offset);\n      return CheckVectorOfObjects(vecOffset, CheckStringFunc); \n    }\n\n    /// <summary> Verify vector of tables (objects). Tables are verified using generated verifyObjFunc </summary>\n    /// <param name=\"tablePos\"> Position in the Table</param>\n    /// <param name=\"offsetId\"> Offset to the Vector of Table </param>\n    /// <param name=\"verifyAction\"> Method used to the verification Table </param>\n    /// <param name=\"required\"> Required Value when the offset == 0 </param>\n    /// <returns>Return True when the verification of the Vector of Table passed</returns>\n    // (this method is used internally by generated verification functions)\n    public bool VerifyVectorOfTables(uint tablePos, short offsetId, VerifyTableAction verifyAction, bool required)\n    {\n      var offset = GetVOffset(tablePos, offsetId);\n      if (offset == 0)\n      {\n        return !required;\n      }\n      if (!CheckIndirectOffset(offset))\n      {\n        return false;\n      }\n      var vecOffset = GetIndirectOffset(offset);\n      return CheckVectorOfObjects(vecOffset, verifyAction);\n    }\n\n    /// <summary> Verify table object using generated verification function. </summary>\n    /// <param name=\"tablePos\"> Position in the Table</param>\n    /// <param name=\"offsetId\"> Offset to the Table </param>\n    /// <param name=\"verifyAction\"> Method used to the verification Table </param>\n    /// <param name=\"required\"> Required Value when the offset == 0 </param>\n    /// <returns>Return True when the verification of the Table passed</returns>\n    // (this method is used internally by generated verification functions)\n    public bool VerifyTable(uint tablePos, short offsetId, VerifyTableAction verifyAction, bool required)\n    {\n      var offset = GetVOffset(tablePos, offsetId);\n      if (offset == 0)\n      {\n        return !required;\n      }\n      if (!CheckIndirectOffset(offset))\n      {\n        return false;\n      }\n      var tabOffset = GetIndirectOffset(offset);\n      return CheckTable(tabOffset, verifyAction);\n    }\n\n    /// <summary> Verify nested buffer object. When verifyObjFunc is provided, it is used to verify object structure. </summary>\n    /// <param name=\"tablePos\"> Position in the Table </param>\n    /// <param name=\"offsetId\"> Offset to the Table </param>\n    /// <param name=\"verifyAction\">  Method used to the verification Table </param>\n    /// <param name=\"required\"> Required Value when the offset == 0  </param>\n    // (this method is used internally by generated verification functions)\n    public bool VerifyNestedBuffer(uint tablePos, short offsetId, VerifyTableAction verifyAction, bool required)\n    {\n      var offset = GetVOffset(tablePos, offsetId);\n      if (offset == 0)\n      {\n        return !required;\n      }\n      uint vecOffset = GetIndirectOffset(offset);\n      if (!CheckVector(vecOffset, SIZE_BYTE))\n      {\n        return false;\n      }\n      if (verifyAction != null)\n      {\n        var vecLength = ReadUOffsetT(verifier_buffer, vecOffset);\n        // Buffer begins after vector length\n        var vecStart = vecOffset + SIZE_U_OFFSET;\n        // Create and Copy nested buffer bytes from part of Verify Buffer\n        var nestedByteBuffer = new ByteBuffer(verifier_buffer.ToArray(Convert.ToInt32(vecStart), Convert.ToInt32(vecLength)));\n        var nestedVerifyier = new Verifier(nestedByteBuffer, options);\n        // There is no internal identifier - use empty one\n        if (!nestedVerifyier.CheckBufferFromStart(\"\", 0, verifyAction))\n        {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /// <summary> Verifiy static/inlined data area at absolute offset </summary>\n    /// <param name=\"pos\"> Position of static/inlined data area in the Byte Buffer</param>\n    /// <param name=\"elementSize\"> Size of the union data</param>\n    /// <param name=\"align\"> Alignment bool value </param>\n    /// <returns>Return True when the verification of the Union Data is passed</returns>\n    // (this method is used internally by generated verification functions)\n    public bool VerifyUnionData(uint pos, ulong elementSize, ulong align)\n    {\n      bool result = ((CheckAlignment(pos, align)) && (CheckElement(pos, elementSize)));\n      return result;\n    }\n\n    /// <summary> Verify string referenced by absolute offset value </summary>\n    /// <param name=\"pos\"> Position of Union String in the Byte Buffer</param>\n    /// <returns>Return True when the verification of the Union String is passed</returns> \n    // (this method is used internally by generated verification functions)\n    public bool VerifyUnionString(uint pos)\n    {\n      bool result = CheckString(pos);\n      return result;\n    }\n\n    /// <summary> Method verifies union object using generated verification function </summary>\n    /// <param name=\"tablePos\"> Position in the Table</param>\n    /// <param name=\"typeIdVOffset\"> Offset in the Table</param>\n    /// <param name=\"valueVOffset\"> Offset to Element</param>\n    /// <param name=\"verifyAction\"> Verification Method used for Union</param>\n    /// <param name=\"required\"> Required Value when the offset == 0 </param>\n    // (this method is used internally by generated verification functions)\n    public bool VerifyUnion(uint tablePos, short typeIdVOffset, short valueVOffset, VerifyUnionAction verifyAction, bool required)\n    {\n      // Check the union type index\n      var offset = GetVOffset(tablePos, typeIdVOffset);\n      if (offset == 0)\n      {\n        return !required;\n      }\n      if (!((CheckAlignment(offset, SIZE_BYTE)) && (CheckElement(offset, SIZE_BYTE))))\n      {\n        return false;\n      }\n      // Take type id\n      var typeId = verifier_buffer.Get(Convert.ToInt32(offset));\n      // Check union data\n      offset = GetVOffset(tablePos, valueVOffset);\n      if (offset == 0)\n      {\n        // When value data is not present, allow union verification function to deal with illegal offset\n        return verifyAction(this, typeId, Convert.ToUInt32(verifier_buffer.Length));\n      }\n      if (!CheckIndirectOffset(offset))\n      {\n        return false;\n      }\n      // Take value offset and validate union structure\n      uint unionOffset = GetIndirectOffset(offset);\n      return verifyAction(this, typeId, unionOffset);\n    }\n\n    /// <summary> Verify vector of unions (objects). Unions are verified using generated verifyObjFunc </summary>\n    /// <param name=\"tablePos\"> Position of the Table</param>\n    /// <param name=\"typeOffsetId\"> Offset in the Table (Union type id)</param>\n    /// <param name=\"offsetId\"> Offset to vector of Data Stucture offset</param>\n    /// <param name=\"verifyAction\"> Verification Method used for Union</param>\n    /// <param name=\"required\"> Required Value when the offset == 0 </param>\n    /// <returns>Return True when the verification of the Vector of Unions passed</returns>\n    // (this method is used internally by generated verification functions)\n    public bool VerifyVectorOfUnion(uint tablePos, short typeOffsetId, short offsetId, VerifyUnionAction verifyAction, bool required)\n    {\n      // type id offset must be valid\n      var offset = GetVOffset(tablePos, typeOffsetId);\n      if (offset == 0)\n      {\n        return !required;\n      }\n      if (!CheckIndirectOffset(offset))\n      {\n        return false;\n      }\n      // Get type id table absolute offset\n      var typeIdVectorOffset = GetIndirectOffset(offset);\n      // values offset must be valid\n      offset = GetVOffset(tablePos, offsetId);\n      if (!CheckIndirectOffset(offset))\n      {\n        return false;\n      }\n      var valueVectorOffset = GetIndirectOffset(offset);\n      // validate referenced vectors\n      if(!CheckVector(typeIdVectorOffset, SIZE_BYTE) ||\n         !CheckVector(valueVectorOffset, SIZE_U_OFFSET))\n      {\n        return false;\n      }\n      // Both vectors should have the same length\n      var typeIdVectorLength = ReadUOffsetT(verifier_buffer, typeIdVectorOffset);\n      var valueVectorLength = ReadUOffsetT(verifier_buffer, valueVectorOffset);\n      if (typeIdVectorLength != valueVectorLength)\n      {\n        return false;\n      }\n      // Verify each union from vectors\n      var typeIdStart = typeIdVectorOffset + SIZE_U_OFFSET;\n      var valueStart = valueVectorOffset + SIZE_U_OFFSET;\n      for (uint i = 0; i < typeIdVectorLength; i++)\n      {\n        // Get type id\n        byte typeId = verifier_buffer.Get(Convert.ToInt32(typeIdStart + i * SIZE_U_OFFSET));\n        // get offset to vector item\n        uint off = valueStart + i * SIZE_U_OFFSET;\n        // Check the vector item has a proper offset\n        if (!CheckIndirectOffset(off))\n        {\n          return false;\n        }\n        uint valueOffset = GetIndirectOffset(off);\n        // Verify object\n        if (!verifyAction(this, typeId, valueOffset))\n        {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    // Method verifies flatbuffer data using generated Table verification function.\n    // The data buffer is already provided when creating [Verifier] object (see [NewVerifier])\n    //\n    //   - identifier - the expected identifier of buffer data.\n    //     When empty identifier is provided the identifier validation is skipped.\n    //   - sizePrefixed - this flag should be true when buffer is prefixed with content size\n    //   - verifyObjFunc - function to be used for verification. This function is generated by compiler and included in each table definition file with name \"<Tablename>Verify\"\n    //\n    // Example:\n    //\n    //  /* Verify Monster table. Ignore buffer name and assume buffer does not contain data length prefix */\n    //  isValid = verifier.verifyBuffer(bb, false, MonsterVerify)\n    //\n    //  /* Verify Monster table. Buffer name is 'MONS' and contains data length prefix */\n    //  isValid = verifier.verifyBuffer(\"MONS\", true, MonsterVerify)\n    /// <summary> Method verifies flatbuffer data using generated Table verification function </summary>\n    /// \n    /// <param name=\"identifier\"> The expected identifier of buffer data</param>\n    /// <param name=\"sizePrefixed\"> Flag should be true when buffer is prefixed with content size</param>\n    /// <param name=\"verifyAction\"> Function to be used for verification. This function is generated by compiler and included in each table definition file</param>\n    /// <returns> Return True when verification of FlatBuffer passed</returns>\n    /// <example>\n    /// Example 1. Verify Monster table. Ignore buffer name and assume buffer does not contain data length prefix \n    /// <code>  isValid = verifier.VerifyBuffer(bb, false, MonsterVerify)</code>\n    /// Example 2. Verify Monster table. Buffer name is 'MONS' and contains data length prefix \n    /// <code>  isValid = verifier.VerifyBuffer(\"MONS\", true, MonsterVerify)</code>\n    /// </example>\n    public bool VerifyBuffer(string identifier, bool sizePrefixed, VerifyTableAction verifyAction)\n    {\n      // Reset counters - starting verification from beginning\n      depth = 0;\n      numTables = 0;\n\n      var start = (uint)(verifier_buffer.Position);\n      if (sizePrefixed) \n      {\n        start = (uint)(verifier_buffer.Position) + SIZE_PREFIX_LENGTH;\n        if(!CheckScalar((uint)(verifier_buffer.Position), SIZE_PREFIX_LENGTH))\n        {\n          return false;\n        }\n        uint size = ReadUOffsetT(verifier_buffer, (uint)(verifier_buffer.Position));\n        if (size != ((uint)(verifier_buffer.Length) - start))\n        {\n          return false;\n        }\n      } \n      return CheckBufferFromStart(identifier, start, verifyAction);\n    }\n  }\n\n}\n"
  },
  {
    "path": "net/FlatBuffers/Google.FlatBuffers.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\" ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n\n  <PropertyGroup>\n    <TargetFrameworks>netstandard2.0;netstandard2.1;net6.0;net8.0</TargetFrameworks>\n    <Description>A cross-platform memory efficient serialization library</Description>\n    <PackageVersion>25.12.19</PackageVersion>\n    <Authors>Google LLC</Authors>\n    <PackageProjectUrl>https://github.com/google/flatbuffers</PackageProjectUrl>\n    <RepositoryUrl>https://github.com/google/flatbuffers</RepositoryUrl>\n    <PublishRepositoryUrl>true</PublishRepositoryUrl>\n    <PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>\n    <PackageIcon>flatbuffers.png</PackageIcon>\n    <PackageTags>Google;FlatBuffers;Serialization;Buffer;Binary;zero copy</PackageTags>\n    <Copyright>Copyright 2022 Google LLC</Copyright>\n    <IncludeSymbols>true</IncludeSymbols>\n    <SymbolPackageFormat>snupkg</SymbolPackageFormat>\n    <SignAssembly>true</SignAssembly>\n    <AssemblyOriginatorKeyFile>flatbuffers.snk</AssemblyOriginatorKeyFile>\n    <DelaySign>false</DelaySign>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(UNSAFE_BYTEBUFFER)' == 'true'\">\n    <DefineConstants>$(DefineConstants);UNSAFE_BYTEBUFFER</DefineConstants>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(BYTEBUFFER_NO_BOUNDS_CHECK)' == 'true'\">\n    <DefineConstants>$(DefineConstants);BYTEBUFFER_NO_BOUNDS_CHECK</DefineConstants>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(ENABLE_SPAN_T)' == 'true'\">\n    <DefineConstants>$(DefineConstants);ENABLE_SPAN_T</DefineConstants>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.SourceLink.GitHub\" Version=\"8.0.0\" PrivateAssets=\"all\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <None Include=\"flatbuffers.png\" Pack=\"true\" PackagePath=\"\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "net/FlatBuffers/IFlatbufferObject.cs",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nnamespace Google.FlatBuffers\n{\n    /// <summary>\n    /// This is the base for both structs and tables.\n    /// </summary>\n    public interface IFlatbufferObject\n    {\n        void __init(int _i, ByteBuffer _bb);\n\n        ByteBuffer ByteBuffer { get; }\n    }\n}\n"
  },
  {
    "path": "net/FlatBuffers/Offset.cs",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nnamespace Google.FlatBuffers\n{\n    /// <summary>\n    /// Offset class for typesafe assignments.\n    /// </summary>\n    public struct Offset<T> where T : struct\n    {\n        public int Value;\n        public Offset(int value)\n        {\n            Value = value;\n        }\n    }\n\n    public struct StringOffset\n    {\n        public int Value;\n        public StringOffset(int value)\n        {\n            Value = value;\n        }\n    }\n\n    public struct VectorOffset\n    {\n        public int Value;\n        public VectorOffset(int value)\n        {\n            Value = value;\n        }\n    }\n}\n"
  },
  {
    "path": "net/FlatBuffers/Struct.cs",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nnamespace Google.FlatBuffers\n{\n    /// <summary>\n    /// All structs in the generated code derive from this class, and add their own accessors.\n    /// </summary>\n    public struct Struct\n    {\n        public int bb_pos { get; private set; }\n        public ByteBuffer bb { get; private set; }\n\n        // Re-init the internal state with an external buffer {@code ByteBuffer} and an offset within.\n        public Struct(int _i, ByteBuffer _bb) : this()\n        {\n            bb = _bb;\n            bb_pos = _i;\n        }\n    }\n}\n"
  },
  {
    "path": "net/FlatBuffers/Table.cs",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nusing System;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nnamespace Google.FlatBuffers\n{\n    /// <summary>\n    /// All tables in the generated code derive from this struct, and add their own accessors.\n    /// </summary>\n    public struct Table\n    {\n        public int bb_pos { get; private set; }\n        public ByteBuffer bb { get; private set; }\n\n        public ByteBuffer ByteBuffer { get { return bb; } }\n\n        // Re-init the internal state with an external buffer {@code ByteBuffer} and an offset within.\n        public Table(int _i, ByteBuffer _bb) : this()\n        {\n            bb = _bb;\n            bb_pos = _i;\n        }\n\n        // Look up a field in the vtable, return an offset into the object, or 0 if the field is not\n        // present.\n        public int __offset(int vtableOffset)\n        {\n            int vtable = bb_pos - bb.GetInt(bb_pos);\n            return vtableOffset < bb.GetShort(vtable) ? (int)bb.GetShort(vtable + vtableOffset) : 0;\n        }\n\n        public static int __offset(int vtableOffset, int offset, ByteBuffer bb)\n        {\n            int vtable = bb.Length - offset;\n            return (int)bb.GetShort(vtable + vtableOffset - bb.GetInt(vtable)) + vtable;\n        }\n\n        // Retrieve the relative offset stored at \"offset\"\n        public int __indirect(int offset)\n        {\n            return offset + bb.GetInt(offset);\n        }\n\n        public static int __indirect(int offset, ByteBuffer bb)\n        {\n            return offset + bb.GetInt(offset);\n        }\n\n        // Create a .NET String from UTF-8 data stored inside the flatbuffer.\n        public string __string(int offset)\n        {\n            offset += bb.GetInt(offset);\n            var len = bb.GetInt(offset);\n            var startPos = offset + sizeof(int);\n            return bb.GetStringUTF8(startPos, len);\n        }\n\n        // Get the length of a vector whose offset is stored at \"offset\" in this object.\n        public int __vector_len(int offset)\n        {\n            offset += bb_pos;\n            offset += bb.GetInt(offset);\n            return bb.GetInt(offset);\n        }\n\n        // Get the start of data of a vector whose offset is stored at \"offset\" in this object.\n        public int __vector(int offset)\n        {\n            offset += bb_pos;\n            return offset + bb.GetInt(offset) + sizeof(int);  // data starts after the length\n        }\n\n#if ENABLE_SPAN_T && UNSAFE_BYTEBUFFER\n        // Get the data of a vector whoses offset is stored at \"offset\" in this object as an\n        // Spant&lt;byte&gt;. If the vector is not present in the ByteBuffer,\n        // then an empty span will be returned.\n        public Span<T> __vector_as_span<T>(int offset, int elementSize) where T : struct\n        {\n            if (!BitConverter.IsLittleEndian)\n            {\n               throw new NotSupportedException(\"Getting typed span on a Big Endian \" +\n                                               \"system is not support\");\n            }\n\n            var o = this.__offset(offset);\n            if (0 == o)\n            {\n                return new Span<T>();\n            }\n\n            var pos = this.__vector(o);\n            var len = this.__vector_len(o);\n            return MemoryMarshal.Cast<byte, T>(bb.ToSpan(pos, len * elementSize));\n        }\n#else\n        // Get the data of a vector whoses offset is stored at \"offset\" in this object as an\n        // ArraySegment&lt;byte&gt;. If the vector is not present in the ByteBuffer,\n        // then a null value will be returned.\n        public ArraySegment<byte>? __vector_as_arraysegment(int offset)\n        {\n            var o = this.__offset(offset);\n            if (0 == o)\n            {\n                return null;\n            }\n\n            var pos = this.__vector(o);\n            var len = this.__vector_len(o);\n            return bb.ToArraySegment(pos, len);\n        }\n#endif\n\n        // Get the data of a vector whoses offset is stored at \"offset\" in this object as an\n        // T[]. If the vector is not present in the ByteBuffer, then a null value will be\n        // returned.\n        public T[] __vector_as_array<T>(int offset)\n            where T : struct\n        {\n            if(!BitConverter.IsLittleEndian)\n            {\n                throw new NotSupportedException(\"Getting typed arrays on a Big Endian \" +\n                    \"system is not support\");\n            }\n\n            var o = this.__offset(offset);\n            if (0 == o)\n            {\n                return null;\n            }\n\n            var pos = this.__vector(o);\n            var len = this.__vector_len(o);\n            return bb.ToArray<T>(pos, len * ByteBuffer.SizeOf<T>());\n        }\n\n        // Initialize any Table-derived type to point to the union at the given offset.\n        public T __union<T>(int offset) where T : struct, IFlatbufferObject\n        {\n            T t = new T();\n            t.__init(__indirect(offset), bb);\n            return t;\n        }\n\n        public static bool __has_identifier(ByteBuffer bb, string ident)\n        {\n            if (ident.Length != FlatBufferConstants.FileIdentifierLength)\n                throw new ArgumentException(\"FlatBuffers: file identifier must be length \" + FlatBufferConstants.FileIdentifierLength, \"ident\");\n\n            for (var i = 0; i < FlatBufferConstants.FileIdentifierLength; i++)\n            {\n                if (ident[i] != (char)bb.Get(bb.Position + sizeof(int) + i)) return false;\n            }\n\n            return true;\n        }\n\n        // Compare strings in the ByteBuffer.\n        public static int CompareStrings(int offset_1, int offset_2, ByteBuffer bb)\n        {\n            offset_1 += bb.GetInt(offset_1);\n            offset_2 += bb.GetInt(offset_2);\n            var len_1 = bb.GetInt(offset_1);\n            var len_2 = bb.GetInt(offset_2);\n            var startPos_1 = offset_1 + sizeof(int);\n            var startPos_2 = offset_2 + sizeof(int);\n\n#if ENABLE_SPAN_T && UNSAFE_BYTEBUFFER\n            var span_1 = bb.ToReadOnlySpan(startPos_1, len_1);\n            var span_2 = bb.ToReadOnlySpan(startPos_2, len_2);\n            return span_1.SequenceCompareTo(span_2);\n#else\n            var len = Math.Min(len_1, len_2);\n            for(int i = 0; i < len; i++) {\n                byte b1 = bb.Get(i + startPos_1);\n                byte b2 = bb.Get(i + startPos_2);\n                if (b1 != b2)\n                    return b1 - b2;\n            }\n            return len_1 - len_2;\n#endif\n        }\n\n        // Compare string from the ByteBuffer with the string object\n        public static int CompareStrings(int offset_1, byte[] key, ByteBuffer bb)\n        {\n            offset_1 += bb.GetInt(offset_1);\n            var len_1 = bb.GetInt(offset_1);\n            var len_2 = key.Length;\n            var startPos_1 = offset_1 + sizeof(int);\n#if ENABLE_SPAN_T && UNSAFE_BYTEBUFFER\n            ReadOnlySpan<byte> span = bb.ToReadOnlySpan(startPos_1, len_1);\n            ReadOnlySpan<byte> keySpan = key;\n            return span.SequenceCompareTo(keySpan);\n#else\n            var len = Math.Min(len_1, len_2);\n            for (int i = 0; i < len; i++) {\n                byte b = bb.Get(i + startPos_1);\n                if (b != key[i])\n                    return b - key[i];\n            }\n            return len_1 - len_2;\n#endif\n        }\n    }\n}\n"
  },
  {
    "path": "nim/flatbuffers/flatbuffers.nim",
    "content": "import\n   src/[\n      builder,\n      struct,\n      table\n   ]\nexport flatbuffers.builder, flatbuffers.table, flatbuffers.struct\n"
  },
  {
    "path": "nim/flatbuffers/src/builder.nim",
    "content": "import math\nimport table\n\n\nconst MAX_BUFFER_SIZE* = 2^31\n\n\ntype Builder* = ref object of RootObj\n   bytes*: seq[byte]\n   minalign*: int\n   current_vtable*: seq[uoffset]\n   objectEnd*: uoffset\n   vtables*: seq[uoffset] #?\n   head*: uoffset\n   nested*: bool\n   finished*: bool\n   vectorNumElems*: uoffset\n\nusing this: var Builder\n\nfunc newBuilder*(size: int): Builder =\n   result = new Builder\n   result.bytes.setLen(size)\n   result.minalign = 1\n   result.head = size.uoffset\n   result.nested = false\n   result.finished = false\n   result.vectorNumElems = 0\n\nproc FinishedBytes*(this): seq[byte] =\n   if not this.finished:\n      quit(\"Builder not finished, Incorrect use of FinishedBytes(): must call 'Finish' first.\")\n   result = this.bytes[this.head..^1]\n\nproc Output*(this): seq[byte] =\n   if not this.finished:\n      quit(\"Builder not finished, Incorrect use of Output(): must call 'Finish' first.\")\n\n   result = this.bytes[this.head..^1]\n\nfunc Offset*(this): uoffset =\n   result = this.bytes.len.uoffset - this.head\n\nproc StartObject*(this; numfields: int) =\n   if this.nested:\n      quit(\"builder is nested\")\n\n   this.current_vtable.setLen(numfields)\n   for i in this.current_vtable.mitems():\n      i = 0\n   this.objectEnd = this.Offset()\n   this.nested = true\n\nproc GrowByteBuffer*(this) =\n   if this.bytes.len == MAX_BUFFER_SIZE:\n      quit(\"flatbuffers: cannot grow buffer beyond 2 gigabytes\")\n   let oldLen = this.bytes.len\n   var newLen = min(this.bytes.len * 2, MAX_BUFFER_SIZE)\n   if newLen == 0:\n      newLen = 1\n   this.bytes.setLen(newLen)\n   var j = this.bytes.len - 1\n   while j >= 0:\n      if j >= newLen - oldLen:\n         this.bytes[j] = this.bytes[j - (newLen - oldLen)]\n      else:\n         this.bytes[j] = 0\n      dec(j)\n\nproc Place*[T](this; x: T) =\n   this.head -= uoffset x.sizeof\n   WriteVal(this.bytes, this.head, x)\n\nfunc Pad*(this; n: int) =\n   for i in 0..<n:\n      this.Place(0.byte)\n\nproc Prep*(this; size: int; additionalBytes: int) =\n   if size > this.minalign:\n      this.minalign = size\n   var alignsize = (not (this.bytes.len - this.head.int + additionalBytes)) + 1\n   alignsize = alignsize and (size - 1)\n\n   while this.head.int < alignsize + size + additionalBytes:\n      let oldbufSize = this.bytes.len\n      this.GrowByteBuffer()\n      this.head = (this.head.int + this.bytes.len - oldbufSize).uoffset\n   this.Pad(alignsize)\n\nproc PrependOffsetRelative*[T: Offsets](this; off: T) =\n   when T is voffset:\n      this.Prep(T.sizeof, 0)\n      if not off.uoffset <= this.Offset:\n         quit(\"flatbuffers: Offset arithmetic error.\")\n      this.Place(off)\n   else:\n      this.Prep(T.sizeof, 0)\n      if not off.uoffset <= this.Offset:\n         quit(\"flatbuffers: Offset arithmetic error.\")\n      let off2: T = this.Offset.T - off + sizeof(T).T\n      this.Place(off2)\n\n\nproc Prepend*[T](this; x: T) =\n   this.Prep(x.sizeof, 0)\n   this.Place(x)\n\nproc Slot*(this; slotnum: int) =\n   this.current_vtable[slotnum] = this.Offset\n\nproc PrependSlot*[T](this; o: int; x, d: T) =\n   if x != d:\n      when T is uoffset or T is soffset or T is voffset:\n         this.PrependOffsetRelative(x)\n      else:\n         this.Prepend(x)\n      this.Slot(o)\n\nproc AssertStuctInline(this; obj: uoffset) =\n   if obj != this.Offset:\n      quit(\"flatbuffers: Tried to write a Struct at an Offset that is different from the current Offset of the Builder.\")\n\nproc PrependStructSlot*(this; o: int; x: uoffset; d: uoffset) =\n   if x != d:\n      this.AssertStuctInline(x)\n      this.Slot(o)\n\nproc Add*[T](this; n: T) =\n   this.Prep(T.sizeof, 0)\n   WriteVal(this.bytes, this.head, n)\n\nproc VtableEqual*(a: seq[uoffset]; objectStart: uoffset; b: seq[byte]): bool =\n   if a.len * voffset.sizeof != b.len:\n      return false\n\n   var i = 0\n   while i < a.len:\n      var seq = b[i * voffset.sizeof..<(i + 1) * voffset.sizeof]\n      let x = GetVal[voffset](addr seq)\n\n      if x == 0 and a[i] == 0:\n         inc i\n         continue\n\n      let y = objectStart.soffset - a[i].soffset\n      if x.soffset != y:\n         return false\n      inc i\n   return true\n\nproc WriteVtable*(this): uoffset =\n   this.PrependOffsetRelative(0.soffset)\n\n   let objectOffset = this.Offset\n   var existingVtable = uoffset 0\n\n   var i = this.current_vtable.len - 1\n   while i >= 0 and this.current_vtable[i] == 0: dec i\n\n   this.current_vtable = this.current_vtable[0..i]\n   for i in countdown(this.vtables.len - 1, 0):\n      let\n         vt2Offset: uoffset = this.vtables[i]\n         vt2Start: int = this.bytes.len - int vt2Offset\n\n      var seq = this.bytes[vt2Start..<this.bytes.len]\n      let\n         vt2Len = GetVal[voffset](addr seq)\n         metadata = 2 * voffset.sizeof # VtableMetadataFields * SizeVOffsetT\n         vt2End = vt2Start + vt2Len.int\n         vt2 = this.bytes[this.bytes.len - vt2Offset.int + metadata..<vt2End]\n\n      if VtableEqual(this.current_vtable, objectOffset, vt2):\n         existingVtable = vt2Offset\n         break\n\n   if existingVtable == 0:\n      for i in countdown(this.current_vtable.len - 1, 0):\n         var off: uoffset\n         if this.current_vtable[i] != 0:\n            off = objectOffset - this.current_vtable[i]\n\n         this.PrependOffsetRelative(off.voffset)\n\n      let objectSize = objectOffset - this.objectEnd\n      this.PrependOffsetRelative(objectSize.voffset)\n\n      let vBytes = (this.current_vtable.len + 2) * voffset.sizeof\n      this.PrependOffsetRelative(vBytes.voffset)\n\n      let objectStart: uoffset = (this.bytes.len.uoffset - objectOffset)\n      WriteVal(this.bytes, objectStart, (this.Offset - objectOffset).soffset)\n      this.vtables.add this.Offset\n   else:\n      let objectStart: uoffset = this.bytes.len.uoffset - objectOffset\n      this.head = objectStart\n      WriteVal(this.bytes, this.head,\n         (existingVtable.soffset - objectOffset.soffset))\n\n      this.current_vtable = @[]\n   result = objectOffset\n\nproc EndObject*(this): uoffset =\n   if not this.nested:\n      quit(\"builder is not nested\")\n   result = this.WriteVtable()\n   this.nested = false\n\nproc End*(this: var Builder): uoffset =\n   result = this.EndObject()\n\nproc StartVector*(this; elemSize: int; numElems: uoffset;\n      alignment: int) =\n   if this.nested:\n      quit(\"builder is nested\")\n   this.nested = true\n   this.vectorNumElems = numElems\n   this.Prep(sizeof(uint32), elemSize * numElems.int)\n   this.Prep(alignment, elemSize * numElems.int)\n\nproc EndVector*(this): uoffset =\n   if not this.nested:\n      quit(\"builder is not nested\")\n   this.nested = false\n   this.Place(this.vectorNumElems)\n   this.vectorNumElems = 0\n   result = this.Offset\n\nproc getChars*(str: seq[byte]): string =\n   var bytes = str\n   result = GetVal[string](addr bytes)\n\nproc getBytes*(str: string | cstring): seq[byte] =\n   for chr in str:\n      result.add byte chr\n   result.add byte 0\n\nproc Create*[T](this; s: T): uoffset = # Both CreateString and CreateByteVector functionality\n   if this.nested:\n      quit(\"builder is nested\")\n   this.nested = true\n   when T is cstring or T is string:\n      let x = s.getBytes()\n      let l = x.len.uoffset\n      this.vectorNumElems = l-1\n   else:\n      let x = s\n      let l = x.len.uoffset\n      this.vectorNumElems = l\n   this.Prep(uoffset.sizeof, l.int * byte.sizeof)\n   this.head -= l\n   this.bytes[this.head..<this.head+l] = x\n   result = this.EndVector()\n\nproc Finish*(this; rootTable: uoffset) =\n   if this.nested:\n      quit(\"builder is nested\")\n   this.nested = true\n\n   this.Prep(this.minalign, uoffset.sizeof)\n   this.PrependOffsetRelative(rootTable)\n   this.finished = true\n"
  },
  {
    "path": "nim/flatbuffers/src/endian.nim",
    "content": "template swapEndian*(outp, inp: pointer, size: int) =\n   var i = cast[cstring](inp)\n   var o = cast[cstring](outp)\n   for x in 0..<size:\n      o[x] = i[(0..<size).len - x - 1]\n\nwhen system.cpuEndian == bigEndian:\n   func littleEndianX*(outp, inp: pointer, size: int) {.inline.} = swapEndian(outp, inp, size)\n   func bigEndianX*(outp, inp: pointer, size: int) {.inline.} = copyMem(outp, inp, size)\nelse:\n   func littleEndianX*(outp, inp: pointer, size: int) {.inline.} = copyMem(outp, inp, size)\n   func bigEndianX*(outp, inp: pointer, size: int) {.inline.} = swapEndian(outp, inp, size)\n"
  },
  {
    "path": "nim/flatbuffers/src/struct.nim",
    "content": "import table\n\n\ntype FlatObj* {.inheritable.} = object\n   tab*: Vtable\n\nfunc Table*(this: var FlatObj): Vtable = this.tab\n\nfunc Init*(this: var FlatObj; buf: seq[byte]; i: uoffset) =\n   this.tab.Bytes = buf\n   this.tab.Pos = i\n\n# Cant define it in table.nim since it needs FlatObj and Init\nfunc GetUnion*[T: FlatObj](this: var Vtable; off: uoffset): T =\n   result.Init(this.Bytes, this.Indirect(off))\n\nfunc GetRootAs*(result: var FlatObj; buf: seq[byte]; offset: uoffset) =\n   var\n      vtable = Vtable(Bytes: buf[offset..^1], Pos: offset)\n      n = Get[uoffset](vtable, offset)\n   result.Init(buf, n+offset)\n\nfunc GetRootAs*(result: var FlatObj; buf: string; offset: uoffset) =\n   result.GetRootAs(cast[seq[byte]](buf), offset)\n"
  },
  {
    "path": "nim/flatbuffers/src/table.nim",
    "content": "import endian\n\n\ntype\n   uoffset* = uint32 ## offset in to the buffer\n   soffset* = int32 ## offset from start of table, to a vtable\n   voffset* = uint16 ## offset from start of table to value\n\ntype Offsets* = uoffset | soffset | voffset\n\ntype Vtable* = object\n   Bytes*: seq[byte]\n   Pos*: uoffset\n\n\nusing this: Vtable\n\n\nfunc GetVal*[T](b: ptr seq[byte]): T {.inline.} =\n   when T is float64:\n      result = cast[T](GetVal[uint64](b))\n   elif T is float32:\n      result = cast[T](GetVal[uint32](b))\n   elif T is string:\n      result = cast[T](b[])\n   else:\n      if b[].len < T.sizeof:\n         b[].setLen T.sizeof\n      result = cast[ptr T](unsafeAddr b[][0])[]\n\n\ntemplate Get*[T](this; off: uoffset): T =\n   var seq = this.Bytes[off..^1]\n   GetVal[T](addr seq)\n\ntemplate Get*[T](this; off: soffset): T =\n   var seq = this.Bytes[off..^1]\n   GetVal[T](addr seq)\n\ntemplate Get*[T](this; off: voffset): T =\n   var seq = this.Bytes[off..^1]\n   GetVal[T](addr seq)\n\nfunc WriteVal*[T: not SomeFloat](b: var openArray[byte]; off: uoffset;\n      n: T) {.inline.} =\n   when sizeof(T) == 8:\n      littleEndianX(addr b[off], unsafeAddr n, T.sizeof)\n   elif sizeof(T) == 4:\n      littleEndianX(addr b[off], unsafeAddr n, T.sizeof)\n   elif sizeof(T) == 2:\n      littleEndianX(addr b[off], unsafeAddr n, T.sizeof)\n   elif sizeof(T) == 1:\n      b[off] = n.uint8\n   else:\n      discard\n      #littleEndianX(addr b[off], unsafeAddr n, T.sizeof)\n      #{.error:\"shouldnt appear\".}\n\nfunc WriteVal*[T: not SomeFloat](b: var seq[byte]; off: uoffset;\n      n: T) {.inline.} =\n   when sizeof(T) == 8:\n      littleEndianX(addr b[off], unsafeAddr n, T.sizeof)\n   elif sizeof(T) == 4:\n      littleEndianX(addr b[off], unsafeAddr n, T.sizeof)\n   elif sizeof(T) == 2:\n      littleEndianX(addr b[off], unsafeAddr n, T.sizeof)\n   elif sizeof(T) == 1:\n      b[off] = n.uint8\n   else:\n      discard\n      #littleEndianX(addr b[off], unsafeAddr n, T.sizeof)\n      #{.error:\"shouldnt appear\".}\n\nfunc WriteVal*[T: SomeFloat](b: var openArray[byte]; off: uoffset;\n      n: T) {.inline.} =\n   when T is float64:\n      WriteVal(b, off, cast[uint64](n))\n   elif T is float32:\n      WriteVal(b, off, cast[uint32](n))\n\nfunc WriteVal*[T: SomeFloat](b: var seq[byte]; off: uoffset; n: T) {.inline.} =\n   when T is float64:\n      WriteVal(b, off, cast[uint64](n))\n   elif T is float32:\n      WriteVal(b, off, cast[uint32](n))\n\nfunc Offset*(this; off: voffset): voffset =\n   let vtable = (this.Pos - this.Get[:uoffset](this.Pos)).voffset\n   let vtableEnd = this.Get[:voffset](vtable)\n   if off < vtableEnd:\n      return this.Get[:voffset](vtable + off)\n   return 0\n\n\nfunc Indirect*(this; off: uoffset): uoffset =\n   result = off + this.Get[:uoffset](off)\n\nfunc VectorLen*(this; off: uoffset): int =\n   var newoff: uoffset = off + this.Pos\n   newoff += this.Get[:uoffset](newoff)\n   return this.Get[:uoffset](newoff).int\n\nfunc Vector*(this; off: uoffset): uoffset =\n   let newoff: uoffset = off + this.Pos\n   var x: uoffset = newoff + this.Get[:uoffset](newoff)\n   x += (uoffset.sizeof).uoffset\n   result = x\n\nfunc Union*(this; off: uoffset): Vtable =\n   let newoff: uoffset = off + this.Pos\n   result.Pos = newoff + this.Get[:uoffset](newoff)\n   result.Bytes = this.Bytes\n\nfunc GetSlot*[T](this; slot: voffset; d: T): T =\n   let off = this.Offset(slot)\n   if off == 0:\n      return d\n   return this.Get[T](this.Pos + off)\n\nfunc GetOffsetSlot*[T: Offsets](this; slot: voffset; d: T): T =\n   let off = this.Offset(slot)\n   if off == 0:\n      return d\n   return off\n\nfunc ByteVector*(this; off: uoffset): seq[byte] =\n   let\n      newoff: uoffset = off + this.Get[:uoffset](off)\n      start = newoff + (uoffset.sizeof).uoffset\n   var newseq = this.Bytes[newoff..^1]\n   let\n      length = GetVal[uoffset](addr newseq)\n   result = this.Bytes[start..<start+length]\n\nfunc String*(this; off: uoffset): string =\n   var byte_seq = this.ByteVector(off)\n   result = GetVal[string](addr byte_seq)\n\nusing this: var Vtable\n\nproc Mutate*[T](this; off: uoffset; n: T): bool =\n   WriteVal(this.Bytes, off, n)\n   return true\n\nfunc MutateSlot*[T](this; slot: voffset; n: T): bool =\n   let off: voffset = this.Offset(slot)\n   if off != 0:\n      return this.Mutate(this.Pos + off.uoffset, n)\n   return false\n"
  },
  {
    "path": "nim/flatbuffers.nimble",
    "content": "version     = \"2.0.8\"\nauthor      = \"flatbuffers\"\ndescription = \"Flatbuffers\"\nlicense     = \"Apache 2.0\"\nsrcDir      = \"flatbuffers\"\n\nrequires \"nim >= 1.4.0\"\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"flatbuffers\",\n  \"version\": \"25.12.19\",\n  \"description\": \"Memory Efficient Serialization Library\",\n  \"files\": [\n    \"js/**/*.js\",\n    \"js/**/*.d.ts\",\n    \"mjs/**/*.js\",\n    \"mjs/**/*.d.ts\",\n    \"ts/**/*.ts\"\n  ],\n  \"main\": \"js/flatbuffers.js\",\n  \"module\": \"mjs/flatbuffers.js\",\n  \"directories\": {\n    \"doc\": \"docs\",\n    \"test\": \"tests\"\n  },\n  \"scripts\": {\n    \"test\": \"npm run compile && cd tests/ts && python3 ./TypeScriptTest.py\",\n    \"lint\": \"eslint ts\",\n    \"compile\": \"tsc && tsc -p tsconfig.mjs.json && esbuild js/flatbuffers.js --minify --global-name=flatbuffers --bundle --outfile=js/flatbuffers.min.js\",\n    \"prepublishOnly\": \"npm install --only=dev && npm run compile\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/google/flatbuffers.git\"\n  },\n  \"keywords\": [\n    \"flatbuffers\"\n  ],\n  \"author\": \"The FlatBuffers project\",\n  \"license\": \"Apache-2.0\",\n  \"bugs\": {\n    \"url\": \"https://github.com/google/flatbuffers/issues\"\n  },\n  \"homepage\": \"https://google.github.io/flatbuffers/\",\n  \"devDependencies\": {\n    \"@eslint/js\": \"^9.29.0\",\n    \"@types/node\": \"^24.0.3\",\n    \"@typescript-eslint/eslint-plugin\": \"^8.34.1\",\n    \"@typescript-eslint/parser\": \"^8.34.1\",\n    \"esbuild\": \"^0.25.5\",\n    \"eslint\": \"^9.29.0\",\n    \"typescript\": \"5.8.3\",\n    \"typescript-eslint\": \"^8.34.1\"\n  },\n  \"pnpm\": {\n    \"onlyBuiltDependencies\": [],\n    \"ignoredBuiltDependencies\": [\n      \"esbuild\"\n    ]\n  }\n}\n"
  },
  {
    "path": "php/ByteBuffer.php",
    "content": "<?php\n/*\n * Copyright 2015 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nnamespace Google\\FlatBuffers;\n\nclass ByteBuffer\n{\n    /**\n     * @var string $_buffer;\n     */\n    public $_buffer;\n\n    /**\n     * @var int $_pos;\n     */\n    private $_pos;\n\n    /**\n     * @var bool $_is_little_endian\n     */\n    private static $_is_little_endian = null;\n\n    public static function wrap($bytes)\n    {\n        $bb = new ByteBuffer(0);\n        $bb->_buffer = $bytes;\n\n        return $bb;\n    }\n\n    /**\n     * @param $size\n     */\n    public function __construct($size)\n    {\n        $this->_buffer = str_repeat(\"\\0\", $size);\n    }\n\n    /**\n     * @return int\n     */\n    public function capacity()\n    {\n        return strlen($this->_buffer);\n    }\n\n    /**\n     * @return int\n     */\n    public function getPosition()\n    {\n        return $this->_pos;\n    }\n\n    /**\n     * @param $pos\n     */\n    public function setPosition($pos)\n    {\n        $this->_pos = $pos;\n    }\n\n    /**\n     *\n     */\n    public function reset()\n    {\n        $this->_pos = 0;\n    }\n\n    /**\n     * @return int\n     */\n    public function length()\n    {\n        return strlen($this->_buffer);\n    }\n\n    /**\n     * @return string\n     */\n    public function data()\n    {\n        return substr($this->_buffer, $this->_pos);\n    }\n\n    /**\n     * @return bool\n     */\n    public static function isLittleEndian()\n    {\n        if (ByteBuffer::$_is_little_endian === null) {\n            ByteBuffer::$_is_little_endian = unpack('S', \"\\x01\\x00\")[1] === 1;\n        }\n\n        return ByteBuffer::$_is_little_endian;\n    }\n\n    /**\n     * write little endian value to the buffer.\n     *\n     * @param $offset\n     * @param $count byte length\n     * @param $data actual values\n     */\n    public function writeLittleEndian($offset, $count, $data)\n    {\n        if (ByteBuffer::isLittleEndian()) {\n            for ($i = 0; $i < $count; $i++) {\n                $this->_buffer[$offset + $i] = chr($data >> $i * 8);\n            }\n        } else {\n            for ($i = 0; $i < $count; $i++) {\n                $this->_buffer[$offset + $count - 1 - $i] = chr($data >> $i * 8);\n            }\n        }\n    }\n\n    /**\n     * read little endian value from the buffer\n     *\n     * @param $offset\n     * @param $count acutal size\n     * @return int\n     */\n    public function readLittleEndian($offset, $count, $force_bigendian = false)\n    {\n        $this->assertOffsetAndLength($offset, $count);\n        $r = 0;\n\n        if (ByteBuffer::isLittleEndian() && $force_bigendian == false) {\n            for ($i = 0; $i < $count; $i++) {\n                $r |= ord($this->_buffer[$offset + $i]) << $i * 8;\n            }\n        } else {\n            for ($i = 0; $i < $count; $i++) {\n                $r |= ord($this->_buffer[$offset + $count -1 - $i]) << $i * 8;\n            }\n        }\n\n        return $r;\n    }\n\n    /**\n     * @param $offset\n     * @param $length\n     */\n    public function assertOffsetAndLength($offset, $length)\n    {\n        if ($offset < 0 ||\n            $offset >= strlen($this->_buffer) ||\n            $offset + $length > strlen($this->_buffer)) {\n            throw new \\OutOfRangeException(sprintf(\"offset: %d, length: %d, buffer; %d\", $offset, $length, strlen($this->_buffer)));\n        }\n    }\n\n    /**\n     * @param $offset\n     * @param $value\n     * @return mixed\n     */\n    public function putSbyte($offset, $value)\n    {\n        self::validateValue(-128, 127, $value, \"sbyte\");\n\n        $length = strlen($value);\n        $this->assertOffsetAndLength($offset, $length);\n        return $this->_buffer[$offset] = $value;\n    }\n\n    /**\n     * @param $offset\n     * @param $value\n     * @return mixed\n     */\n    public function putByte($offset, $value)\n    {\n        self::validateValue(0, 255, $value, \"byte\");\n\n        $length = strlen($value);\n        $this->assertOffsetAndLength($offset, $length);\n        return $this->_buffer[$offset] = $value;\n    }\n\n    /**\n     * @param $offset\n     * @param $value\n     */\n    public function put($offset, $value)\n    {\n        $length = strlen($value);\n        $this->assertOffsetAndLength($offset, $length);\n        for ($i = 0; $i < $length; $i++) {\n            $this->_buffer[$offset + $i] = $value[$i];\n        }\n    }\n\n    /**\n     * @param $offset\n     * @param $value\n     */\n    public function putShort($offset, $value)\n    {\n        self::validateValue(-32768, 32767, $value, \"short\");\n\n        $this->assertOffsetAndLength($offset, 2);\n        $this->writeLittleEndian($offset, 2, $value);\n    }\n\n    /**\n     * @param $offset\n     * @param $value\n     */\n    public function putUshort($offset, $value)\n    {\n        self::validateValue(0, 65535, $value, \"short\");\n\n        $this->assertOffsetAndLength($offset, 2);\n        $this->writeLittleEndian($offset, 2, $value);\n    }\n\n    /**\n     * @param $offset\n     * @param $value\n     */\n    public function putInt($offset, $value)\n    {\n        // 2147483647 = (1 << 31) -1 = Maximum signed 32-bit int\n        // -2147483648 = -1 << 31 = Minimum signed 32-bit int\n        self::validateValue(-2147483648, 2147483647, $value, \"int\");\n\n        $this->assertOffsetAndLength($offset, 4);\n        $this->writeLittleEndian($offset, 4, $value);\n    }\n\n    /**\n     * @param $offset\n     * @param $value\n     */\n    public function putUint($offset, $value)\n    {\n        // NOTE: We can't put big integer value. this is PHP limitation.\n        // 4294967295 = (1 << 32) -1 = Maximum unsigned 32-bin int\n        self::validateValue(0, 4294967295, $value, \"uint\",  \" php has big numbers limitation. check your PHP_INT_MAX\");\n\n        $this->assertOffsetAndLength($offset, 4);\n        $this->writeLittleEndian($offset, 4, $value);\n    }\n\n    /**\n     * @param $offset\n     * @param $value\n     */\n    public function putLong($offset, $value)\n    {\n        // NOTE: We can't put big integer value. this is PHP limitation.\n        self::validateValue(~PHP_INT_MAX, PHP_INT_MAX, $value, \"long\",  \" php has big numbers limitation. check your PHP_INT_MAX\");\n\n        $this->assertOffsetAndLength($offset, 8);\n        $this->writeLittleEndian($offset, 8, $value);\n    }\n\n    /**\n     * @param $offset\n     * @param $value\n     */\n    public function putUlong($offset, $value)\n    {\n        // NOTE: We can't put big integer value. this is PHP limitation.\n        self::validateValue(0, PHP_INT_MAX, $value, \"long\", \" php has big numbers limitation. check your PHP_INT_MAX\");\n\n        $this->assertOffsetAndLength($offset, 8);\n        $this->writeLittleEndian($offset, 8, $value);\n    }\n\n    /**\n     * @param $offset\n     * @param $value\n     */\n    public function putFloat($offset, $value)\n    {\n        $this->assertOffsetAndLength($offset, 4);\n\n        $floathelper = pack(\"f\", $value);\n        $v = unpack(\"V\", $floathelper);\n        $this->writeLittleEndian($offset, 4, $v[1]);\n    }\n\n    /**\n     * @param $offset\n     * @param $value\n     */\n    public function putDouble($offset, $value)\n    {\n        $this->assertOffsetAndLength($offset, 8);\n\n        $floathelper = pack(\"d\", $value);\n        $v = unpack(\"V*\", $floathelper);\n\n        $this->writeLittleEndian($offset, 4, $v[1]);\n        $this->writeLittleEndian($offset + 4, 4, $v[2]);\n    }\n\n    /**\n     * @param $index\n     * @return mixed\n     */\n    public function getByte($index)\n    {\n        return ord($this->_buffer[$index]);\n    }\n\n    /**\n     * @param $index\n     * @return mixed\n     */\n    public function getSbyte($index)\n    {\n        $v = unpack(\"c\", $this->_buffer[$index]);\n        return $v[1];\n    }\n\n    /**\n     * @param $buffer\n     */\n    public function getX(&$buffer)\n    {\n        for ($i = $this->_pos, $j = 0; $j < strlen($buffer); $i++, $j++) {\n            $buffer[$j] = $this->_buffer[$i];\n        }\n    }\n\n    /**\n     * @param $index\n     * @return mixed\n     */\n    public function get($index)\n    {\n        $this->assertOffsetAndLength($index, 1);\n        return $this->_buffer[$index];\n    }\n\n\n    /**\n     * @param $index\n     * @return mixed\n     */\n    public function getBool($index)\n    {\n        return (bool)ord($this->_buffer[$index]);\n    }\n\n    /**\n     * @param $index\n     * @return int\n     */\n    public function getShort($index)\n    {\n        $result = $this->readLittleEndian($index, 2);\n\n        $sign = $index + (ByteBuffer::isLittleEndian() ? 1 : 0);\n        $issigned = isset($this->_buffer[$sign]) && ord($this->_buffer[$sign]) & 0x80;\n\n        // 65536 = 1 << 16 = Maximum unsigned 16-bit int\n        return $issigned ? $result - 65536 : $result;\n    }\n\n    /**\n     * @param $index\n     * @return int\n     */\n    public function getUShort($index)\n    {\n        return $this->readLittleEndian($index, 2);\n    }\n\n    /**\n     * @param $index\n     * @return int\n     */\n    public function getInt($index)\n    {\n        $result = $this->readLittleEndian($index, 4);\n\n        $sign = $index + (ByteBuffer::isLittleEndian() ? 3 : 0);\n        $issigned = isset($this->_buffer[$sign]) && ord($this->_buffer[$sign]) & 0x80;\n\n        if (PHP_INT_SIZE > 4) {\n            // 4294967296 = 1 << 32 = Maximum unsigned 32-bit int\n            return $issigned ? $result - 4294967296 : $result;\n        } else {\n            // 32bit / Windows treated number as signed integer.\n            return $result;\n        }\n    }\n\n    /**\n     * @param $index\n     * @return int\n     */\n    public function getUint($index)\n    {\n        return $this->readLittleEndian($index, 4);\n    }\n\n    /**\n     * @param $index\n     * @return int\n     */\n    public function getLong($index)\n    {\n        return $this->readLittleEndian($index, 8);\n    }\n\n    /**\n     * @param $index\n     * @return int\n     */\n    public function getUlong($index)\n    {\n        return $this->readLittleEndian($index, 8);\n    }\n\n    /**\n     * @param $index\n     * @return mixed\n     */\n    public function getFloat($index)\n    {\n        $i = $this->readLittleEndian($index, 4);\n\n        return self::convertHelper(self::__FLOAT, $i);\n    }\n\n    /**\n     * @param $index\n     * @return float\n     */\n    public function getDouble($index)\n    {\n        $i = $this->readLittleEndian($index, 4);\n        $i2 = $this->readLittleEndian($index + 4, 4);\n\n        return self::convertHelper(self::__DOUBLE, $i, $i2);\n    }\n\n    const __SHORT = 1;\n    const __INT = 2;\n    const __LONG = 3;\n    const __FLOAT = 4;\n    const __DOUBLE = 5;\n    private static function convertHelper($type, $value, $value2 = null) {\n        // readLittleEndian construct unsigned integer value from bytes. we have to encode this value to\n        // correct bytes, and decode as expected types with `unpack` function.\n        // then it returns correct type value.\n        // see also: http://php.net/manual/en/function.pack.php\n\n        switch ($type) {\n            case self::__FLOAT:\n                $inthelper = pack(\"V\", $value);\n                $v = unpack(\"f\", $inthelper);\n                return $v[1];\n                break;\n            case self::__DOUBLE:\n                $inthelper = pack(\"VV\", $value, $value2);\n                $v = unpack(\"d\", $inthelper);\n                return $v[1];\n                break;\n            default:\n                throw new \\Exception(sprintf(\"unexpected type %d specified\", $type));\n        }\n    }\n\n    private static function validateValue($min, $max, $value, $type, $additional_notes = \"\") {\n        if (\n          !(\n            ($type === \"byte\" && $min <= ord($value) && ord($value) <= $max) ||\n            ($min <= $value && $value <= $max)\n          )\n        ) {\n            throw new \\InvalidArgumentException(sprintf(\"bad number %s for type %s.%s\", $value, $type, $additional_notes));\n        }\n    }\n}\n"
  },
  {
    "path": "php/Constants.php",
    "content": "<?php\n/*\n * Copyright 2015 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nnamespace Google\\FlatBuffers;\n\nclass Constants\n{\n    const SIZEOF_SHORT = 2;\n    const SIZEOF_INT = 4;\n    const FILE_IDENTIFIER_LENGTH = 4;\n}\n"
  },
  {
    "path": "php/FlatbufferBuilder.php",
    "content": "<?php\n/*\n * Copyright 2015 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/// @file\n/// @addtogroup flatbuffers_php_api\n/// @{\n\nnamespace Google\\FlatBuffers;\n\nfinal class FlatbufferBuilder\n{\n    /**\n     * Internal ByteBuffer for the FlatBuffer data.\n     * @var ByteBuffer $bb\n     */\n    public $bb;\n\n    /// @cond FLATBUFFERS_INTERNAL\n    /**\n     * @var int $space\n     */\n    protected $space;\n\n    /**\n     * @var int $minalign\n     */\n    protected $minalign = 1;\n\n    /**\n     * @var array $vtable\n     */\n    protected $vtable;\n\n    /**\n     * @var int $vtable_in_use\n     */\n    protected $vtable_in_use = 0;\n\n    /**\n     * @var bool $nested\n     */\n    protected $nested = false;\n\n    /**\n     * @var int $object_start\n     */\n    protected $object_start;\n\n    /**\n     * @var array $vtables\n     */\n    protected $vtables = array();\n\n    /**\n     * @var int $num_vtables\n     */\n    protected $num_vtables = 0;\n\n    /**\n     * @var int $vector_num_elems\n     */\n    protected $vector_num_elems = 0;\n\n    /**\n     * @var bool $force_defaults\n     */\n    protected $force_defaults = false;\n    /// @endcond\n\n    /**\n     * Create a FlatBufferBuilder with a given initial size.\n     *\n     * @param $initial_size initial byte buffer size.\n     */\n    public function __construct($initial_size)\n    {\n        if ($initial_size <= 0) {\n            $initial_size = 1;\n        }\n        $this->space = $initial_size;\n        $this->bb = $this->newByteBuffer($initial_size);\n    }\n\n    /// @cond FLATBUFFERS_INTERNAL\n    /**\n     * create new bytebuffer\n     *\n     * @param $size\n     * @return ByteBuffer\n     */\n    private function newByteBuffer($size)\n    {\n        return new ByteBuffer($size);\n    }\n\n    /**\n     * Returns the current ByteBuffer offset.\n     *\n     * @return int\n     */\n    public function offset()\n    {\n        return $this->bb->capacity() - $this->space;\n    }\n\n    /**\n     * padding buffer\n     *\n     * @param $byte_size\n     */\n    public function pad($byte_size)\n    {\n        for ($i = 0; $i < $byte_size; $i++) {\n            $this->bb->putByte(--$this->space, \"\\0\");\n        }\n    }\n\n    /**\n     * prepare bytebuffer\n     *\n     * @param $size\n     * @param $additional_bytes\n     * @throws \\Exception\n     */\n    public function prep($size, $additional_bytes)\n    {\n        if ($size > $this->minalign) {\n            $this->minalign = $size;\n        }\n\n        $align_size = ((~($this->bb->capacity() - $this->space + $additional_bytes)) + 1) & ($size - 1);\n        while ($this->space < $align_size + $size  + $additional_bytes) {\n            $old_buf_size = $this->bb->capacity();\n            $this->bb = $this->growByteBuffer($this->bb);\n            $this->space += $this->bb->capacity() - $old_buf_size;\n        }\n\n        $this->pad($align_size);\n    }\n\n    /**\n     * @param ByteBuffer $bb\n     * @return ByteBuffer\n     * @throws \\Exception\n     */\n    private static function growByteBuffer(ByteBuffer $bb)\n    {\n        $old_buf_size = $bb->capacity();\n        if (($old_buf_size & 0xC0000000) != 0) {\n            throw new \\Exception(\"FlatBuffers: cannot grow buffer beyond 2 gigabytes\");\n        }\n        $new_buf_size = $old_buf_size << 1;\n\n        $bb->setPosition(0);\n        $nbb = new ByteBuffer($new_buf_size);\n\n        $nbb->setPosition($new_buf_size - $old_buf_size);\n\n        // TODO(chobie): is this little bit faster?\n        //$nbb->_buffer = substr_replace($nbb->_buffer, $bb->_buffer, $new_buf_size - $old_buf_size, strlen($bb->_buffer));\n        for ($i = $new_buf_size - $old_buf_size, $j = 0; $j < strlen($bb->_buffer); $i++, $j++) {\n            $nbb->_buffer[$i] = $bb->_buffer[$j];\n        }\n\n        return $nbb;\n    }\n\n    /**\n     * @param $x\n     */\n    public function putBool($x)\n    {\n        $this->bb->put($this->space -= 1, chr((int)(bool)($x)));\n    }\n\n    /**\n     * @param $x\n     */\n    public function putByte($x)\n    {\n        $this->bb->put($this->space -= 1, chr($x));\n    }\n\n    /**\n     * @param $x\n     */\n    public function putSbyte($x)\n    {\n        $this->bb->put($this->space -= 1, chr($x));\n    }\n\n    /**\n     * @param $x\n     */\n    public function putShort($x)\n    {\n        $this->bb->putShort($this->space -= 2, $x);\n    }\n\n    /**\n     * @param $x\n     */\n    public function putUshort($x)\n    {\n        $this->bb->putUshort($this->space -= 2, $x);\n    }\n\n    /**\n     * @param $x\n     */\n    public function putInt($x)\n    {\n        $this->bb->putInt($this->space -= 4, $x);\n    }\n\n    /**\n     * @param $x\n     */\n    public function putUint($x)\n    {\n        if ($x > PHP_INT_MAX) {\n            throw new \\InvalidArgumentException(\"your platform can't handle uint correctly. use 64bit machine.\");\n        }\n\n        $this->bb->putUint($this->space -= 4, $x);\n    }\n\n    /**\n     * @param $x\n     */\n    public function putLong($x)\n    {\n        if ($x > PHP_INT_MAX) {\n            throw new \\InvalidArgumentException(\"Your platform can't handle long correctly. Use a 64bit machine.\");\n        }\n\n        $this->bb->putLong($this->space -= 8, $x);\n    }\n\n    /**\n     * @param $x\n     */\n    public function putUlong($x)\n    {\n        if ($x > PHP_INT_MAX) {\n            throw new \\InvalidArgumentException(\"Your platform can't handle ulong correctly. This is a php limitation. Please wait for the extension release.\");\n        }\n\n        $this->bb->putUlong($this->space -= 8, $x);\n    }\n\n    /**\n     * @param $x\n     */\n    public function putFloat($x)\n    {\n        $this->bb->putFloat($this->space -= 4, $x);\n    }\n\n    /**\n     * @param $x\n     */\n    public function putDouble($x)\n    {\n        $this->bb->putDouble($this->space -= 8, $x);\n    }\n\n    /**\n     * @param $off\n     */\n    public function putOffset($off)\n    {\n        $new_off = $this->offset() - $off + Constants::SIZEOF_INT;\n        $this->putInt($new_off);\n    }\n    /// @endcond\n\n    /**\n     * Add a `bool` to the buffer, properly aligned, and grows the buffer (if necessary).\n     * @param $x The `bool` to add to the buffer.\n     */\n    public function addBool($x)\n    {\n        $this->prep(1, 0);\n        $this->putBool($x);\n    }\n\n    /**\n     * Add a `byte` to the buffer, properly aligned, and grows the buffer (if necessary).\n     * @param $x The `byte` to add to the buffer.\n     */\n    public function addByte($x)\n    {\n        $this->prep(1, 0);\n        $this->putByte($x);\n    }\n\n    /**\n     * Add a `signed byte` to the buffer, properly aligned, and grows the buffer (if necessary).\n     * @param $x The `signed byte` to add to the buffer.\n     */\n    public function addSbyte($x)\n    {\n        $this->prep(1, 0);\n        $this->putSbyte($x);\n    }\n\n    /**\n     * Add a `short` to the buffer, properly aligned, and grows the buffer (if necessary).\n     * @param $x The `short` to add to the buffer.\n     */\n    public function addShort($x)\n    {\n        $this->prep(2, 0);\n        $this->putShort($x);\n    }\n\n    /**\n     * Add an `unsigned short` to the buffer, properly aligned, and grows the buffer (if necessary).\n     * @param $x The `unsigned short` to add to the buffer.\n     */\n    public function addUshort($x)\n    {\n        $this->prep(2, 0);\n        $this->putUshort($x);\n    }\n\n    /**\n     * Add an `int` to the buffer, properly aligned, and grows the buffer (if necessary).\n     * @param $x The `int` to add to the buffer.\n     */\n    public function addInt($x)\n    {\n        $this->prep(4, 0);\n        $this->putInt($x);\n    }\n\n    /**\n     * Add an `unsigned int` to the buffer, properly aligned, and grows the buffer (if necessary).\n     * @param $x The `unsigned int` to add to the buffer.\n     */\n    public function addUint($x)\n    {\n        $this->prep(4, 0);\n        $this->putUint($x);\n    }\n\n    /**\n     * Add a `long` to the buffer, properly aligned, and grows the buffer (if necessary).\n     * @param $x The `long` to add to the buffer.\n     */\n    public function addLong($x)\n    {\n        $this->prep(8, 0);\n        $this->putLong($x);\n    }\n\n    /**\n     * Add an `unsigned long` to the buffer, properly aligned, and grows the buffer (if necessary).\n     * @param $x The `unsigned long` to add to the buffer.\n     */\n    public function addUlong($x)\n    {\n        $this->prep(8, 0);\n        $this->putUlong($x);\n    }\n\n    /**\n     * Add a `float` to the buffer, properly aligned, and grows the buffer (if necessary).\n     * @param $x The `float` to add to the buffer.\n     */\n    public function addFloat($x)\n    {\n        $this->prep(4, 0);\n        $this->putFloat($x);\n    }\n\n    /**\n     * Add a `double` to the buffer, properly aligned, and grows the buffer (if necessary).\n     * @param $x The `double` to add to the buffer.\n     */\n    public function addDouble($x)\n    {\n        $this->prep(8, 0);\n        $this->putDouble($x);\n    }\n\n    /// @cond FLATBUFFERS_INTERNAL\n    /**\n     * @param $o\n     * @param $x\n     * @param $d\n     */\n    public function addBoolX($o, $x, $d)\n    {\n        if ($this->force_defaults || $x != $d) {\n            $this->addBool($x);\n            $this->slot($o);\n        }\n    }\n\n    /**\n     * @param $o\n     * @param $x\n     * @param $d\n     */\n    public function addByteX($o, $x, $d)\n    {\n        if ($this->force_defaults || $x != $d) {\n            $this->addByte($x);\n            $this->slot($o);\n        }\n    }\n\n    /**\n     * @param $o\n     * @param $x\n     * @param $d\n     */\n    public function addSbyteX($o, $x, $d)\n    {\n        if ($this->force_defaults || $x != $d) {\n            $this->addSbyte($x);\n            $this->slot($o);\n        }\n    }\n\n    /**\n     * @param $o\n     * @param $x\n     * @param $d\n     */\n    public function addShortX($o, $x, $d)\n    {\n        if ($this->force_defaults || $x != $d) {\n            $this->addShort($x);\n            $this->slot($o);\n        }\n    }\n\n    /**\n     * @param $o\n     * @param $x\n     * @param $d\n     */\n    public function addUshortX($o, $x, $d)\n    {\n        if ($this->force_defaults || $x != $d) {\n            $this->addUshort($x);\n            $this->slot($o);\n        }\n    }\n\n    /**\n     * @param $o\n     * @param $x\n     * @param $d\n     */\n    public function addIntX($o, $x, $d)\n    {\n        if ($this->force_defaults || $x != $d) {\n            $this->addInt($x);\n            $this->slot($o);\n        }\n    }\n\n    /**\n     * @param $o\n     * @param $x\n     * @param $d\n     */\n    public function addUintX($o, $x, $d)\n    {\n        if ($this->force_defaults || $x != $d) {\n            $this->addUint($x);\n            $this->slot($o);\n        }\n    }\n\n    /**\n     * @param $o\n     * @param $x\n     * @param $d\n     */\n    public function addLongX($o, $x, $d)\n    {\n        if ($this->force_defaults || $x != $d) {\n            $this->addLong($x);\n            $this->slot($o);\n        }\n    }\n\n    /**\n     * @param $o\n     * @param $x\n     * @param $d\n     */\n    public function addUlongX($o, $x, $d)\n    {\n        if ($this->force_defaults || $x != $d) {\n            $this->addUlong($x);\n            $this->slot($o);\n        }\n    }\n\n\n    /**\n     * @param $o\n     * @param $x\n     * @param $d\n     */\n    public function addFloatX($o, $x, $d)\n    {\n        if ($this->force_defaults || $x != $d) {\n            $this->addFloat($x);\n            $this->slot($o);\n        }\n    }\n\n    /**\n     * @param $o\n     * @param $x\n     * @param $d\n     */\n    public function addDoubleX($o, $x, $d)\n    {\n        if ($this->force_defaults || $x != $d) {\n            $this->addDouble($x);\n            $this->slot($o);\n        }\n    }\n\n    /**\n     * @param $o\n     * @param $x\n     * @param $d\n     * @throws \\Exception\n     */\n    public function addOffsetX($o, $x, $d)\n    {\n        if ($this->force_defaults || $x != $d) {\n            $this->addOffset($x);\n            $this->slot($o);\n        }\n    }\n    /// @endcond\n\n    /**\n     * Adds on offset, relative to where it will be written.\n     * @param $off The offset to add to the buffer.\n     * @throws \\Exception Throws an exception if `$off` is greater than the underlying ByteBuffer's\n     * offest.\n     */\n    public function addOffset($off)\n    {\n        $this->prep(Constants::SIZEOF_INT, 0); // Ensure alignment is already done\n        if ($off > $this->offset()) {\n            throw new \\Exception(\"\");\n        }\n        $this->putOffset($off);\n    }\n\n    /// @cond FLATBUFFERS_INTERNAL\n    /**\n     * @param $elem_size\n     * @param $num_elems\n     * @param $alignment\n     * @throws \\Exception\n     */\n    public function startVector($elem_size, $num_elems, $alignment)\n    {\n        $this->notNested();\n        $this->vector_num_elems = $num_elems;\n        $this->prep(Constants::SIZEOF_INT, $elem_size * $num_elems);\n        $this->prep($alignment, $elem_size * $num_elems); // Just in case alignemnt > int;\n    }\n\n    /**\n     * @return int\n     */\n    public function endVector()\n    {\n        $this->putUint($this->vector_num_elems);\n        return $this->offset();\n    }\n\n    protected function is_utf8($bytes)\n    {\n        if (function_exists('mb_detect_encoding')) {\n            return (bool) mb_detect_encoding($bytes, 'UTF-8', true);\n        }\n\n        $len = strlen($bytes);\n        if ($len < 1) {\n            /* NOTE: always return 1 when passed string is null */\n            return true;\n        }\n\n        for ($j = 0, $i = 0; $i < $len; $i++) {\n            // check ACII\n            if ($bytes[$j] == \"\\x09\" ||\n                $bytes[$j] == \"\\x0A\" ||\n                $bytes[$j] == \"\\x0D\" ||\n                ($bytes[$j] >= \"\\x20\" && $bytes[$j] <= \"\\x7E\")) {\n                $j++;\n                continue;\n            }\n\n            /* non-overlong 2-byte */\n            if ((($i+1) <= $len) &&\n                ($bytes[$j] >= \"\\xC2\" && $bytes[$j] <= \"\\xDF\" &&\n                    ($bytes[$j+1] >= \"\\x80\" && $bytes[$j+1] <= \"\\xBF\"))) {\n                $j += 2;\n                $i++;\n                continue;\n            }\n\n            /* excluding overlongs */\n            if ((($i + 2) <= $len) &&\n                $bytes[$j] == \"\\xE0\" &&\n                ($bytes[$j+1] >= \"\\xA0\" && $bytes[$j+1] <= \"\\xBF\" &&\n                    ($bytes[$j+2] >= \"\\x80\" && $bytes[$j+2] <= \"\\xBF\"))) {\n                $bytes += 3;\n                $i +=2;\n                continue;\n            }\n\n            /* straight 3-byte */\n            if ((($i+2) <= $len) &&\n                (($bytes[$j] >= \"\\xE1\" && $bytes[$j] <= \"\\xEC\") ||\n                    $bytes[$j] == \"\\xEE\" ||\n                    $bytes[$j] = \"\\xEF\") &&\n                ($bytes[$j+1] >= \"\\x80\" && $bytes[$j+1] <= \"\\xBF\") &&\n                ($bytes[$j+2] >= \"\\x80\" && $bytes[$j+2] <= \"\\xBF\")) {\n                $j += 3;\n                $i += 2;\n                continue;\n            }\n\n            /* excluding surrogates */\n            if ((($i+2) <= $len) &&\n                $bytes[$j] == \"\\xED\" &&\n                ($bytes[$j+1] >= \"\\x80\" && $bytes[$j+1] <= \"\\x9f\" &&\n                    ($bytes[$j+2] >= \"\\x80\" && $bytes[$j+2] <= \"\\xBF\"))) {\n                $j += 3;\n                $i += 2;\n                continue;\n            }\n\n            /* planes 1-3 */\n            if ((($i + 3) <= $len) &&\n                $bytes[$j] == \"\\xF0\" &&\n                ($bytes[$j+1] >= \"\\x90\" && $bytes[$j+1] <= \"\\xBF\") &&\n                ($bytes[$j+2] >= \"\\x80\" && $bytes[$j+2] <= \"\\xBF\") &&\n                ($bytes[$j+3] >= \"\\x80\" && $bytes[$j+3] <= \"\\xBF\")) {\n                $j += 4;\n                $i += 3;\n                continue;\n            }\n\n\n            /* planes 4-15 */\n            if ((($i+3) <= $len) &&\n                $bytes[$j] >= \"\\xF1\" && $bytes[$j] <= \"\\xF3\" &&\n                $bytes[$j+1] >= \"\\x80\" && $bytes[$j+1] <= \"\\xBF\" &&\n                $bytes[$j+2] >= \"\\x80\" && $bytes[$j+2] <= \"\\xBF\" &&\n                $bytes[$j+3] >= \"\\x80\" && $bytes[$j+3] <= \"\\xBF\"\n            ) {\n                $j += 4;\n                $i += 3;\n                continue;\n            }\n\n            /* plane 16 */\n            if ((($i+3) <= $len) &&\n                $bytes[$j] == \"\\xF4\" &&\n                ($bytes[$j+1] >= \"\\x80\" && $bytes[$j+1] <= \"\\x8F\") &&\n                ($bytes[$j+2] >= \"\\x80\" && $bytes[$j+2] <= \"\\xBF\") &&\n                ($bytes[$j+3] >= \"\\x80\" && $bytes[$j+3] <= \"\\xBF\")\n            ) {\n                $bytes += 4;\n                $i += 3;\n                continue;\n            }\n\n\n            return false;\n        }\n\n        return true;\n    }\n    /// @endcond\n\n    /**\n     * Encode the string `$s` in the buffer using UTF-8.\n     * @param string $s The string to encode.\n     * @return int The offset in the buffer where the encoded string starts.\n     * @throws InvalidArgumentException Thrown if the input string `$s` is not\n     *     UTF-8.\n     */\n    public function createString($s)\n    {\n        if (!$this->is_utf8($s)) {\n            throw new \\InvalidArgumentException(\"string must be utf-8 encoded value.\");\n        }\n\n        $this->notNested();\n        $this->addByte(0); // null terminated\n        $this->startVector(1, strlen($s), 1);\n        $this->space -= strlen($s);\n        for ($i =  $this->space, $j = 0 ; $j < strlen($s) ; $i++, $j++) {\n            $this->bb->_buffer[$i] = $s[$j];\n        }\n        return $this->endVector();\n    }\n\n    /// @cond FLATBUFFERS_INTERNAL\n    /**\n     * @throws \\Exception\n     */\n    public function notNested()\n    {\n        if ($this->nested) {\n            throw new \\Exception(\"FlatBuffers; object serialization must not be nested\");\n        }\n    }\n\n    /**\n     * @param $obj\n     * @throws \\Exception\n     */\n    public function nested($obj)\n    {\n        if ($obj != $this->offset()) {\n            throw new \\Exception(\"FlatBuffers: struct must be serialized inline\");\n        }\n    }\n\n    /**\n     * @param $numfields\n     * @throws \\Exception\n     */\n    public function startObject($numfields)\n    {\n        $this->notNested();\n        if ($this->vtable == null || count($this->vtable) < $numfields) {\n            $this->vtable = array();\n        }\n\n        $this->vtable_in_use = $numfields;\n        for ($i = 0; $i < $numfields; $i++) {\n            $this->vtable[$i] = 0;\n        }\n\n        $this->nested = true;\n        $this->object_start = $this->offset();\n    }\n\n    /**\n     * @param $voffset\n     * @param $x\n     * @param $d\n     * @throws \\Exception\n     */\n    public function addStructX($voffset, $x, $d)\n    {\n        if ($x != $d) {\n            $this->nested($x);\n            $this->slot($voffset);\n        }\n    }\n\n    /**\n     * @param $voffset\n     * @param $x\n     * @param $d\n     * @throws \\Exception\n     */\n    public function addStruct($voffset, $x, $d)\n    {\n        if ($x != $d) {\n            $this->nested($x);\n            $this->slot($voffset);\n        }\n    }\n\n    /**\n     * @param $voffset\n     */\n    public function slot($voffset)\n    {\n        $this->vtable[$voffset] = $this->offset();\n    }\n\n    /**\n     * @return int\n     * @throws \\Exception\n     */\n    public function endObject()\n    {\n        if ($this->vtable == null || !$this->nested) {\n            throw new \\Exception(\"FlatBuffers: endObject called without startObject\");\n        }\n\n        $this->addInt(0);\n        $vtableloc = $this->offset();\n\n        $i = $this->vtable_in_use -1;\n        // Trim trailing zeroes.\n        for (; $i >= 0 && $this->vtable[$i] == 0; $i--) {}\n        $trimmed_size = $i + 1;\n        for (; $i >= 0; $i--) {\n            $off = ($this->vtable[$i] != 0) ? $vtableloc - $this->vtable[$i] : 0;\n            $this->addShort($off);\n        }\n\n        $standard_fields = 2; // the fields below\n        $this->addShort($vtableloc - $this->object_start);\n        $this->addShort(($trimmed_size + $standard_fields) * Constants::SIZEOF_SHORT);\n\n        // search for an existing vtable that matches the current one.\n        $existing_vtable = 0;\n\n        for ($i = 0; $i < $this->num_vtables; $i++) {\n            $vt1 = $this->bb->capacity() - $this->vtables[$i];\n            $vt2 = $this->space;\n\n            $len = $this->bb->getShort($vt1);\n\n            if ($len == $this->bb->getShort($vt2)) {\n                for ($j = Constants::SIZEOF_SHORT; $j < $len; $j += Constants::SIZEOF_SHORT) {\n                    if ($this->bb->getShort($vt1 + $j) != $this->bb->getShort($vt2 + $j)) {\n                        continue 2;\n                    }\n                }\n                $existing_vtable = $this->vtables[$i];\n                break;\n            }\n        }\n\n        if ($existing_vtable != 0) {\n            // Found a match:\n            // Remove the current vtable\n            $this->space = $this->bb->capacity() - $vtableloc;\n            $this->bb->putInt($this->space, $existing_vtable - $vtableloc);\n        } else {\n            // No Match:\n            // Add the location of the current vtable to the list of vtables\n            if ($this->num_vtables == count($this->vtables)) {\n                $vtables = $this->vtables;\n                $this->vtables = array();\n                // copy of\n                for ($i = 0; $i < count($vtables) * 2; $i++) {\n                    $this->vtables[$i] = ($i < count($vtables)) ? $vtables[$i] : 0;\n                }\n            }\n            $this->vtables[$this->num_vtables++] = $this->offset();\n            $this->bb->putInt($this->bb->capacity() - $vtableloc, $this->offset() - $vtableloc);\n        }\n\n        $this->nested = false;\n        $this->vtable = null;\n        return $vtableloc;\n    }\n\n    /**\n     * @param $table\n     * @param $field\n     * @throws \\Exception\n     */\n    public function required($table, $field)\n    {\n        $table_start = $this->bb->capacity() - $table;\n        $vtable_start = $table_start - $this->bb->getInt($table_start);\n        $ok = $this->bb->getShort($vtable_start + $field) != 0;\n\n        if (!$ok) {\n            throw new \\Exception(\"FlatBuffers: field \"  . $field  .  \" must be set\");\n        }\n    }\n    /// @endcond\n\n    /**\n     * Finalize a buffer, pointing to the given `$root_table`.\n     * @param $root_table An offest to be added to the buffer.\n     * @param $file_identifier A FlatBuffer file identifier to be added to the\n     *     buffer before `$root_table`. This defaults to `null`.\n     * @throws InvalidArgumentException Thrown if an invalid `$identifier` is\n     *     given, where its length is not equal to\n     *    `Constants::FILE_IDENTIFIER_LENGTH`.\n     */\n    public function finish($root_table, $identifier = null)\n    {\n        if ($identifier == null) {\n            $this->prep($this->minalign, Constants::SIZEOF_INT);\n            $this->addOffset($root_table);\n            $this->bb->setPosition($this->space);\n        } else {\n            $this->prep($this->minalign, Constants::SIZEOF_INT + Constants::FILE_IDENTIFIER_LENGTH);\n            if (strlen($identifier) != Constants::FILE_IDENTIFIER_LENGTH) {\n                throw new \\InvalidArgumentException(\n                    sprintf(\"FlatBuffers: file identifier must be length %d\",\n                        Constants::FILE_IDENTIFIER_LENGTH));\n            }\n\n            for ($i = Constants::FILE_IDENTIFIER_LENGTH - 1; $i >= 0;\n                  $i--) {\n                $this->addByte(ord($identifier[$i]));\n            }\n            $this->finish($root_table);\n        }\n    }\n\n    /**\n     * In order to save space, fields that are set to their default value don't\n     * get serialized into the buffer.\n     * @param bool $forceDefaults When set to `true`, always serializes default\n     *     values.\n     */\n    public function forceDefaults($forceDefaults)\n    {\n        $this->force_defaults = $forceDefaults;\n    }\n\n    /**\n     * Get the ByteBuffer representing the FlatBuffer.\n     * @return ByteBuffer The ByteBuffer containing the FlatBuffer data.\n     */\n    public function dataBuffer()\n    {\n        return $this->bb;\n    }\n\n    /// @cond FLATBUFFERS_INTERNAL\n    /**\n     * @return int\n     */\n    public function dataStart()\n    {\n        return $this->space;\n    }\n    /// @endcond\n\n    /**\n     * Utility function to copy and return the FlatBuffer data from the\n     * underlying ByteBuffer.\n     * @return string A string (representing a byte[]) that contains a copy\n     * of the FlatBuffer data.\n     */\n    public function sizedByteArray()\n    {\n        $start = $this->space;\n        $length = $this->bb->capacity() - $this->space;\n\n        $result = str_repeat(\"\\0\", $length);\n        $this->bb->setPosition($start);\n        $this->bb->getX($result);\n\n        return $result;\n    }\n}\n\n/// @}\n"
  },
  {
    "path": "php/Struct.php",
    "content": "<?php\n/*\n * Copyright 2015 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nnamespace Google\\FlatBuffers;\n\nabstract class Struct\n{\n    /**\n     * @var int $bb_pos\n     */\n    protected $bb_pos;\n\n    /**\n     * @var ByteBuffer $bb\n     */\n    protected $bb;\n\n    public function setByteBufferPos($pos)\n    {\n        $this->bb_pos = $pos;\n    }\n\n    public function setByteBuffer($bb)\n    {\n        $this->bb = $bb;\n    }\n}\n"
  },
  {
    "path": "php/Table.php",
    "content": "<?php\n/*\n * Copyright 2015 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nnamespace Google\\FlatBuffers;\n\nabstract class Table\n{\n    /**\n     * @var int $bb_pos\n     */\n    protected $bb_pos;\n    /**\n     * @var ByteBuffer $bb\n     */\n    protected $bb;\n\n    public function __construct()\n    {\n    }\n\n    public function setByteBufferPos($pos)\n    {\n        $this->bb_pos = $pos;\n    }\n\n    public function setByteBuffer($bb)\n    {\n        $this->bb = $bb;\n    }\n\n    /**\n     * returns actual vtable offset\n     *\n     * @param $vtable_offset\n     * @return int offset > 0 means exist value. 0 means not exist\n     */\n    protected function __offset($vtable_offset)\n    {\n        $vtable = $this->bb_pos - $this->bb->getInt($this->bb_pos);\n        return $vtable_offset < $this->bb->getShort($vtable) ? $this->bb->getShort($vtable + $vtable_offset) : 0;\n    }\n\n    /**\n     * @param $offset\n     * @return mixed\n     */\n    protected function __indirect($offset)\n    {\n        return $offset + $this->bb->getInt($offset);\n    }\n\n    /**\n     * fetch utf8 encoded string.\n     *\n     * @param $offset\n     * @return string\n     */\n    protected function __string($offset)\n    {\n        $offset += $this->bb->getInt($offset);\n        $len = $this->bb->getInt($offset);\n        $startPos = $offset + Constants::SIZEOF_INT;\n        return substr($this->bb->_buffer, $startPos, $len);\n    }\n\n    /**\n     * @param $offset\n     * @return int\n     */\n    protected function __vector_len($offset)\n    {\n        $offset += $this->bb_pos;\n        $offset += $this->bb->getInt($offset);\n        return $this->bb->getInt($offset);\n    }\n\n    /**\n     * @param $offset\n     * @return int\n     */\n    protected function __vector($offset)\n    {\n        $offset += $this->bb_pos;\n        // data starts after the length\n        return $offset + $this->bb->getInt($offset) + Constants::SIZEOF_INT;\n    }\n\n    protected function __vector_as_bytes($vector_offset, $elem_size=1)\n    {\n        $o = $this->__offset($vector_offset);\n        if ($o == 0) {\n            return null;\n        }\n\n        return substr($this->bb->_buffer, $this->__vector($o), $this->__vector_len($o) * $elem_size);\n    }\n\n    /**\n     * @param Table $table\n     * @param int $offset\n     * @return Table\n     */\n    protected function __union($table, $offset)\n    {\n        $offset += $this->bb_pos;\n        $table->setByteBufferPos($offset + $this->bb->getInt($offset));\n        $table->setByteBuffer($this->bb);\n        return $table;\n    }\n\n    /**\n     * @param ByteBuffer $bb\n     * @param string $ident\n     * @return bool\n     * @throws \\ArgumentException\n     */\n    protected static function __has_identifier($bb, $ident)\n    {\n        if (strlen($ident) != Constants::FILE_IDENTIFIER_LENGTH) {\n            throw new \\ArgumentException(\"FlatBuffers: file identifier must be length \"  . Constants::FILE_IDENTIFIER_LENGTH);\n        }\n\n        for ($i = 0; $i < 4; $i++) {\n            if ($ident[$i] != $bb->get($bb->getPosition() + Constants::SIZEOF_INT + $i)) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "python/.gitignore",
    "content": "/dist/\n/*.egg-info/\n\n# this file is duplicated by the build step\nLICENSE"
  },
  {
    "path": "python/__init__.py",
    "content": ""
  },
  {
    "path": "python/flatbuffers/__init__.py",
    "content": "# Copyright 2014 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nfrom . import util\nfrom ._version import __version__\nfrom .builder import Builder\nfrom .compat import range_func as compat_range\nfrom .table import Table\n"
  },
  {
    "path": "python/flatbuffers/_version.py",
    "content": "# Copyright 2019 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Placeholder, to be updated during the release process\n# by the setup.py\n__version__ = \"25.12.19\"\n"
  },
  {
    "path": "python/flatbuffers/builder.py",
    "content": "# Copyright 2014 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nimport warnings\n\nfrom . import compat\nfrom . import encode\nfrom . import number_types as N\nfrom . import packer\nfrom .compat import memoryview_type\nfrom .compat import NumpyRequiredForThisFeature, import_numpy\nfrom .compat import range_func\nfrom .number_types import (SOffsetTFlags, UOffsetTFlags, VOffsetTFlags)\n\nnp = import_numpy()\n## @file\n## @addtogroup flatbuffers_python_api\n## @{\n\n\n## @cond FLATBUFFERS_INTERNAL\nclass OffsetArithmeticError(RuntimeError):\n  \"\"\"Error caused by an Offset arithmetic error.\n\n  Probably caused by bad writing of fields. This is considered an unreachable\n  situation in normal circumstances.\n  \"\"\"\n\n  pass\n\n\nclass IsNotNestedError(RuntimeError):\n  \"\"\"Error caused by using a Builder to write Object data when not inside\n\n  an Object.\n  \"\"\"\n\n  pass\n\n\nclass IsNestedError(RuntimeError):\n  \"\"\"Error caused by using a Builder to begin an Object when an Object is\n\n  already being built.\n  \"\"\"\n\n  pass\n\n\nclass StructIsNotInlineError(RuntimeError):\n  \"\"\"Error caused by using a Builder to write a Struct at a location that\n\n  is not the current Offset.\n  \"\"\"\n\n  pass\n\n\nclass BuilderSizeError(RuntimeError):\n  \"\"\"Error caused by causing a Builder to exceed the hardcoded limit of 2\n\n  gigabytes.\n  \"\"\"\n\n  pass\n\n\nclass BuilderNotFinishedError(RuntimeError):\n  \"\"\"Error caused by not calling `Finish` before calling `Output`.\"\"\"\n\n  pass\n\n\nclass EndVectorLengthMismatched(RuntimeError):\n  \"\"\"The number of elements passed to EndVector does not match the number\n\n  specified in StartVector.\n  \"\"\"\n\n  pass\n\n\n# VtableMetadataFields is the count of metadata fields in each vtable.\nVtableMetadataFields = 2\n## @endcond\n\n\nclass Builder(object):\n  \"\"\"A Builder is used to construct one or more FlatBuffers.\n\n  Typically, Builder objects will be used from code generated by the `flatc`\n  compiler.\n\n  A Builder constructs byte buffers in a last-first manner for simplicity and\n  performance during reading.\n\n  Internally, a Builder is a state machine for creating FlatBuffer objects.\n\n  It holds the following internal state:\n      - Bytes: an array of bytes.\n      - current_vtable: a list of integers.\n      - vtables: a hash of vtable entries.\n\n  Attributes:\n    Bytes: The internal `bytearray` for the Builder.\n    finished: A boolean determining if the Builder has been finalized.\n  \"\"\"\n\n  ## @cond FLATBUFFERS_INTENRAL\n  __slots__ = (\n      \"Bytes\",\n      \"current_vtable\",\n      \"head\",\n      \"minalign\",\n      \"objectEnd\",\n      \"vtables\",\n      \"nested\",\n      \"forceDefaults\",\n      \"finished\",\n      \"vectorNumElems\",\n      \"sharedStrings\",\n  )\n\n  \"\"\"Maximum buffer size constant, in bytes.\n\n    Builder will never allow it's buffer grow over this size.\n    Currently equals 2Gb.\n    \"\"\"\n  MAX_BUFFER_SIZE = 2**31\n  ## @endcond\n\n  def __init__(self, initialSize=1024):\n    \"\"\"Initializes a Builder of size `initial_size`.\n\n    The internal buffer is grown as needed.\n    \"\"\"\n\n    if not (0 <= initialSize <= Builder.MAX_BUFFER_SIZE):\n      msg = \"flatbuffers: Cannot create Builder larger than 2 gigabytes.\"\n      raise BuilderSizeError(msg)\n\n    self.Bytes = bytearray(initialSize)\n    ## @cond FLATBUFFERS_INTERNAL\n    self.current_vtable = None\n    self.head = UOffsetTFlags.py_type(initialSize)\n    self.minalign = 1\n    self.objectEnd = None\n    self.vtables = {}\n    self.nested = False\n    self.forceDefaults = False\n    self.sharedStrings = None\n    ## @endcond\n    self.finished = False\n\n  def Clear(self):\n    ## @cond FLATBUFFERS_INTERNAL\n    self.current_vtable = None\n    self.head = len(self.Bytes)\n    self.minalign = 1\n    self.objectEnd = None\n    self.vtables = {}\n    self.nested = False\n    self.forceDefaults = False\n    self.sharedStrings = None\n    self.vectorNumElems = None\n    ## @endcond\n    self.finished = False\n\n  def Output(self):\n    \"\"\"Return the portion of the buffer that has been used for writing data.\n\n    This is the typical way to access the FlatBuffer data inside the\n    builder. If you try to access `Builder.Bytes` directly, you would need\n    to manually index it with `Head()`, since the buffer is constructed\n    backwards.\n\n    It raises BuilderNotFinishedError if the buffer has not been finished\n    with `Finish`.\n    \"\"\"\n\n    if not self.finished:\n      raise BuilderNotFinishedError()\n\n    return self.Bytes[self.head :]\n\n  ## @cond FLATBUFFERS_INTERNAL\n  def StartObject(self, numfields):\n    \"\"\"StartObject initializes bookkeeping for writing a new object.\"\"\"\n\n    self.assertNotNested()\n\n    # use 32-bit offsets so that arithmetic doesn't overflow.\n    self.current_vtable = [0] * numfields\n    self.objectEnd = self.Offset()\n    self.nested = True\n\n  def WriteVtable(self):\n    \"\"\"WriteVtable serializes the vtable for the current object, if needed.\n\n    Before writing out the vtable, this checks pre-existing vtables for\n    equality to this one. If an equal vtable is found, point the object to\n    the existing vtable and return.\n\n    Because vtable values are sensitive to alignment of object data, not\n    all logically-equal vtables will be deduplicated.\n\n    A vtable has the following format:\n      <VOffsetT: size of the vtable in bytes, including this value>\n      <VOffsetT: size of the object in bytes, including the vtable offset>\n      <VOffsetT: offset for a field> * N, where N is the number of fields\n                 in the schema for this type. Includes deprecated fields.\n    Thus, a vtable is made of 2 + N elements, each VOffsetT bytes wide.\n\n    An object has the following format:\n      <SOffsetT: offset to this object's vtable (may be negative)>\n      <byte: data>+\n    \"\"\"\n\n    # Prepend a zero scalar to the object. Later in this function we'll\n    # write an offset here that points to the object's vtable:\n    self.PrependSOffsetTRelative(0)\n\n    objectOffset = self.Offset()\n\n    vtKey = []\n    trim = True\n    for elem in reversed(self.current_vtable):\n      if elem == 0:\n        if trim:\n          continue\n      else:\n        elem = objectOffset - elem\n        trim = False\n\n      vtKey.append(elem)\n\n    objectSize = UOffsetTFlags.py_type(objectOffset - self.objectEnd)\n    vtKey.append(objectSize)\n    vtKey = tuple(vtKey)\n    # calculate the size of the object\n    vt2Offset = self.vtables.get(vtKey)\n    if vt2Offset is None:\n      # Did not find a vtable, so write this one to the buffer.\n\n      # Write out the current vtable in reverse , because\n      # serialization occurs in last-first order:\n      i = len(self.current_vtable) - 1\n      trailing = 0\n      trim = True\n      while i >= 0:\n        off = 0\n        elem = self.current_vtable[i]\n        i -= 1\n\n        if elem == 0:\n          if trim:\n            trailing += 1\n            continue\n        else:\n          # Forward reference to field;\n          # use 32bit number to ensure no overflow:\n          off = objectOffset - elem\n          trim = False\n\n        self.PrependVOffsetT(off)\n\n      # The two metadata fields are written last.\n\n      # First, store the object bytesize:\n      self.PrependVOffsetT(VOffsetTFlags.py_type(objectSize))\n\n      # Second, store the vtable bytesize:\n      vBytes = len(self.current_vtable) - trailing + VtableMetadataFields\n      vBytes *= N.VOffsetTFlags.bytewidth\n      self.PrependVOffsetT(VOffsetTFlags.py_type(vBytes))\n\n      # Next, write the offset to the new vtable in the\n      # already-allocated SOffsetT at the beginning of this object:\n      objectStart = SOffsetTFlags.py_type(len(self.Bytes) - objectOffset)\n      encode.Write(\n          packer.soffset,\n          self.Bytes,\n          objectStart,\n          SOffsetTFlags.py_type(self.Offset() - objectOffset),\n      )\n\n      # Finally, store this vtable in memory for future\n      # deduplication:\n      self.vtables[vtKey] = self.Offset()\n    else:\n      # Found a duplicate vtable.\n      objectStart = SOffsetTFlags.py_type(len(self.Bytes) - objectOffset)\n      self.head = UOffsetTFlags.py_type(objectStart)\n\n      # Write the offset to the found vtable in the\n      # already-allocated SOffsetT at the beginning of this object:\n      encode.Write(\n          packer.soffset,\n          self.Bytes,\n          self.Head(),\n          SOffsetTFlags.py_type(vt2Offset - objectOffset),\n      )\n\n    self.current_vtable = None\n    return objectOffset\n\n  def EndObject(self):\n    \"\"\"EndObject writes data necessary to finish object construction.\"\"\"\n    self.assertNested()\n    self.nested = False\n    return self.WriteVtable()\n\n  def GrowByteBuffer(self):\n    \"\"\"Doubles the size of the byteslice, and copies the old data towards\n\n    the end of the new buffer (since we build the buffer backwards).\n    \"\"\"\n    if len(self.Bytes) == Builder.MAX_BUFFER_SIZE:\n      msg = \"flatbuffers: cannot grow buffer beyond 2 gigabytes\"\n      raise BuilderSizeError(msg)\n\n    newSize = min(len(self.Bytes) * 2, Builder.MAX_BUFFER_SIZE)\n    if newSize == 0:\n      newSize = 1\n    bytes2 = bytearray(newSize)\n    bytes2[newSize - len(self.Bytes) :] = self.Bytes\n    self.Bytes = bytes2\n\n  ## @endcond\n\n  def Head(self):\n    \"\"\"Get the start of useful data in the underlying byte buffer.\n\n    Note: unlike other functions, this value is interpreted as from the\n    left.\n    \"\"\"\n    ## @cond FLATBUFFERS_INTERNAL\n    return self.head\n    ## @endcond\n\n  ## @cond FLATBUFFERS_INTERNAL\n  def Offset(self):\n    \"\"\"Offset relative to the end of the buffer.\"\"\"\n    return len(self.Bytes) - self.head\n\n  def Pad(self, n):\n    \"\"\"Pad places zeros at the current offset.\"\"\"\n    if n <= 0:\n      return\n    new_head = self.head - n\n    self.Bytes[new_head : self.head] = b\"\\x00\" * n\n    self.head = new_head\n\n  def Prep(self, size, additionalBytes):\n    \"\"\"Prep prepares to write an element of `size` after `additional_bytes`\n\n    have been written, e.g. if you write a string, you need to align\n    such the int length field is aligned to SizeInt32, and the string\n    data follows it directly.\n    If all you need to do is align, `additionalBytes` will be 0.\n    \"\"\"\n\n    # Track the biggest thing we've ever aligned to.\n    if size > self.minalign:\n      self.minalign = size\n\n    # Find the amount of alignment needed such that `size` is properly\n    # aligned after `additionalBytes`:\n    head = self.head\n    buf_len = len(self.Bytes)\n    alignSize = (~(buf_len - head + additionalBytes)) + 1\n    alignSize &= size - 1\n\n    # Reallocate the buffer if needed:\n    needed = alignSize + size + additionalBytes\n    while head < needed:\n      oldBufSize = buf_len\n      self.GrowByteBuffer()\n      buf_len = len(self.Bytes)\n      head += buf_len - oldBufSize\n    self.head = head\n    self.Pad(alignSize)\n\n  def PrependSOffsetTRelative(self, off):\n    \"\"\"PrependSOffsetTRelative prepends an SOffsetT, relative to where it\n\n    will be written.\n    \"\"\"\n\n    # Ensure alignment is already done:\n    self.Prep(N.SOffsetTFlags.bytewidth, 0)\n    if not (off <= self.Offset()):\n      msg = \"flatbuffers: Offset arithmetic error.\"\n      raise OffsetArithmeticError(msg)\n    off2 = self.Offset() - off + N.SOffsetTFlags.bytewidth\n    self.PlaceSOffsetT(off2)\n\n  ## @endcond\n\n  def PrependUOffsetTRelative(self, off):\n    \"\"\"Prepends an unsigned offset into vector data, relative to where it\n\n    will be written.\n    \"\"\"\n\n    # Ensure alignment is already done:\n    self.Prep(N.UOffsetTFlags.bytewidth, 0)\n    if not (off <= self.Offset()):\n      msg = \"flatbuffers: Offset arithmetic error.\"\n      raise OffsetArithmeticError(msg)\n    off2 = self.Offset() - off + N.UOffsetTFlags.bytewidth\n    self.PlaceUOffsetT(off2)\n\n  def StartVector(self, elemSize, numElems, alignment):\n    \"\"\"StartVector initializes bookkeeping for writing a new vector.\n\n    A vector has the following format:\n      - <UOffsetT: number of elements in this vector>\n      - <T: data>+, where T is the type of elements of this vector.\n    \"\"\"\n\n    self.assertNotNested()\n    self.nested = True\n    self.vectorNumElems = numElems\n    self.Prep(N.Uint32Flags.bytewidth, elemSize * numElems)\n    self.Prep(alignment, elemSize * numElems)  # In case alignment > int.\n    return self.Offset()\n\n  def EndVector(self, numElems=None):\n    \"\"\"EndVector writes data necessary to finish vector construction.\"\"\"\n\n    self.assertNested()\n    ## @cond FLATBUFFERS_INTERNAL\n    self.nested = False\n    ## @endcond\n\n    if numElems:\n      warnings.warn(\"numElems is deprecated.\", DeprecationWarning, stacklevel=2)\n      if numElems != self.vectorNumElems:\n        raise EndVectorLengthMismatched()\n\n    # we already made space for this, so write without PrependUint32\n    self.PlaceUOffsetT(self.vectorNumElems)\n    self.vectorNumElems = None\n    return self.Offset()\n\n  def CreateSharedString(self, s, encoding=\"utf-8\", errors=\"strict\"):\n    \"\"\"CreateSharedString checks if the string is already written to the buffer\n\n    before calling CreateString.\n    \"\"\"\n\n    if not self.sharedStrings:\n      self.sharedStrings = {}\n    elif s in self.sharedStrings:\n      return self.sharedStrings[s]\n\n    off = self.CreateString(s, encoding, errors)\n    self.sharedStrings[s] = off\n\n    return off\n\n  def CreateString(self, s, encoding=\"utf-8\", errors=\"strict\"):\n    \"\"\"CreateString writes a null-terminated byte string as a vector.\"\"\"\n\n    self.assertNotNested()\n    ## @cond FLATBUFFERS_INTERNAL\n    self.nested = True\n    ## @endcond\n\n    if isinstance(s, compat.string_types):\n      x = s.encode(encoding, errors)\n    elif isinstance(s, compat.binary_types):\n      x = s\n    else:\n      raise TypeError(\"non-string passed to CreateString\")\n\n    payload_len = len(x)\n    self.Prep(N.UOffsetTFlags.bytewidth, (payload_len + 1) * N.Uint8Flags.bytewidth)\n    self.Place(0, N.Uint8Flags)\n\n    new_head = self.head - payload_len\n    self.head = new_head\n    self.Bytes[new_head : new_head + payload_len] = x\n\n    self.vectorNumElems = payload_len\n    return self.EndVector()\n\n  def CreateByteVector(self, x):\n    \"\"\"CreateString writes a byte vector.\"\"\"\n\n    self.assertNotNested()\n    ## @cond FLATBUFFERS_INTERNAL\n    self.nested = True\n    ## @endcond\n\n    if not isinstance(x, compat.binary_types):\n      raise TypeError(\"non-byte vector passed to CreateByteVector\")\n\n    data_len = len(x)\n    self.Prep(N.UOffsetTFlags.bytewidth, data_len * N.Uint8Flags.bytewidth)\n    new_head = self.head - data_len\n    self.head = new_head\n    self.Bytes[new_head : new_head + data_len] = x\n\n    self.vectorNumElems = data_len\n    return self.EndVector()\n\n  def CreateNumpyVector(self, x):\n    \"\"\"CreateNumpyVector writes a numpy array into the buffer.\"\"\"\n\n    if np is None:\n      # Numpy is required for this feature\n      raise NumpyRequiredForThisFeature(\"Numpy was not found.\")\n\n    if not isinstance(x, np.ndarray):\n      raise TypeError(\"non-numpy-ndarray passed to CreateNumpyVector\")\n\n    if x.dtype.kind not in [\"b\", \"i\", \"u\", \"f\"]:\n      raise TypeError(\"numpy-ndarray holds elements of unsupported datatype\")\n\n    if x.ndim > 1:\n      raise TypeError(\"multidimensional-ndarray passed to CreateNumpyVector\")\n\n    self.StartVector(x.itemsize, x.size, x.dtype.alignment)\n\n    # Ensure little endian byte ordering\n    if x.dtype.str[0] == \"<\":\n      x_lend = x\n    else:\n      x_lend = x.byteswap(inplace=False)\n\n    # tobytes ensures c_contiguous ordering\n    payload = x_lend.tobytes(order=\"C\")\n\n    # Calculate total length\n    payload_len = len(payload)\n    new_head = self.head - payload_len\n    self.head = new_head\n    self.Bytes[new_head : new_head + payload_len] = payload\n\n    self.vectorNumElems = x.size\n    return self.EndVector()\n\n  def CreateVectorOfTables(self, offsets):\n    \"\"\"CreateVectorOfTables writes a vector of offsets such as tables or strings.\n\n    Args:\n      offsets: Iterable of offsets returned from previous builder operations.\n               Each element should be an integer compatible with UOffsetT.\n    \"\"\"\n\n    offsets = list(offsets)\n    self.StartVector(N.UOffsetTFlags.bytewidth, len(offsets),\n                     N.UOffsetTFlags.bytewidth)\n    for off in reversed(offsets):\n      self.PrependUOffsetTRelative(off)\n    return self.EndVector()\n\n  ## @cond FLATBUFFERS_INTERNAL\n  def assertNested(self):\n    \"\"\"Check that we are in the process of building an object.\"\"\"\n\n    if not self.nested:\n      raise IsNotNestedError()\n\n  def assertNotNested(self):\n    \"\"\"Check that no other objects are being built while making this object.\n\n    If not, raise an exception.\n    \"\"\"\n\n    if self.nested:\n      raise IsNestedError()\n\n  def assertStructIsInline(self, obj):\n    \"\"\"Structs are always stored inline, so need to be created right\n\n    where they are used. You'll get this error if you created it\n    elsewhere.\n    \"\"\"\n\n    N.enforce_number(obj, N.UOffsetTFlags)\n    if obj != self.Offset():\n      msg = (\n          \"flatbuffers: Tried to write a Struct at an Offset that \"\n          \"is different from the current Offset of the Builder.\"\n      )\n      raise StructIsNotInlineError(msg)\n\n  def Slot(self, slotnum):\n    \"\"\"Slot sets the vtable key `voffset` to the current location in the\n\n    buffer.\n    \"\"\"\n    self.assertNested()\n    self.current_vtable[slotnum] = self.Offset()\n\n  ## @endcond\n\n  def __Finish(self, rootTable, sizePrefix, file_identifier=None):\n    \"\"\"Finish finalizes a buffer, pointing to the given `rootTable`.\"\"\"\n    N.enforce_number(rootTable, N.UOffsetTFlags)\n\n    prepSize = N.UOffsetTFlags.bytewidth\n    if file_identifier is not None:\n      prepSize += N.Int32Flags.bytewidth\n    if sizePrefix:\n      prepSize += N.Int32Flags.bytewidth\n    self.Prep(self.minalign, prepSize)\n\n    if file_identifier is not None:\n      self.Prep(N.UOffsetTFlags.bytewidth, encode.FILE_IDENTIFIER_LENGTH)\n\n      # Convert bytes object file_identifier to an array of 4 8-bit integers,\n      # and use big-endian to enforce size compliance.\n      # https://docs.python.org/2/library/struct.html#format-characters\n      file_identifier = N.struct.unpack(\">BBBB\", file_identifier)\n      for i in range(encode.FILE_IDENTIFIER_LENGTH - 1, -1, -1):\n        # Place the bytes of the file_identifer in reverse order:\n        self.Place(file_identifier[i], N.Uint8Flags)\n\n    self.PrependUOffsetTRelative(rootTable)\n    if sizePrefix:\n      size = len(self.Bytes) - self.head\n      N.enforce_number(size, N.Int32Flags)\n      self.PrependInt32(size)\n    self.finished = True\n    return self.head\n\n  def Finish(self, rootTable, file_identifier=None):\n    \"\"\"Finish finalizes a buffer, pointing to the given `rootTable`.\"\"\"\n    return self.__Finish(rootTable, False, file_identifier=file_identifier)\n\n  def FinishSizePrefixed(self, rootTable, file_identifier=None):\n    \"\"\"Finish finalizes a buffer, pointing to the given `rootTable`,\n\n    with the size prefixed.\n    \"\"\"\n    return self.__Finish(rootTable, True, file_identifier=file_identifier)\n\n  ## @cond FLATBUFFERS_INTERNAL\n  def Prepend(self, flags, off):\n    self.Prep(flags.bytewidth, 0)\n    self.Place(off, flags)\n\n  def PrependSlot(self, flags, o, x, d):\n    if x is not None:\n      N.enforce_number(x, flags)\n    if d is not None:\n      N.enforce_number(d, flags)\n    if x != d or (self.forceDefaults and d is not None):\n      self.Prepend(flags, x)\n      self.Slot(o)\n\n  def PrependBoolSlot(self, *args):\n    self.PrependSlot(N.BoolFlags, *args)\n\n  def PrependByteSlot(self, *args):\n    self.PrependSlot(N.Uint8Flags, *args)\n\n  def PrependUint8Slot(self, *args):\n    self.PrependSlot(N.Uint8Flags, *args)\n\n  def PrependUint16Slot(self, *args):\n    self.PrependSlot(N.Uint16Flags, *args)\n\n  def PrependUint32Slot(self, *args):\n    self.PrependSlot(N.Uint32Flags, *args)\n\n  def PrependUint64Slot(self, *args):\n    self.PrependSlot(N.Uint64Flags, *args)\n\n  def PrependInt8Slot(self, *args):\n    self.PrependSlot(N.Int8Flags, *args)\n\n  def PrependInt16Slot(self, *args):\n    self.PrependSlot(N.Int16Flags, *args)\n\n  def PrependInt32Slot(self, *args):\n    self.PrependSlot(N.Int32Flags, *args)\n\n  def PrependInt64Slot(self, *args):\n    self.PrependSlot(N.Int64Flags, *args)\n\n  def PrependFloat32Slot(self, *args):\n    self.PrependSlot(N.Float32Flags, *args)\n\n  def PrependFloat64Slot(self, *args):\n    self.PrependSlot(N.Float64Flags, *args)\n\n  def PrependUOffsetTRelativeSlot(self, o, x, d):\n    \"\"\"PrependUOffsetTRelativeSlot prepends an UOffsetT onto the object at\n\n    vtable slot `o`. If value `x` equals default `d`, then the slot will\n    be set to zero and no other data will be written.\n    \"\"\"\n\n    if x != d or self.forceDefaults:\n      self.PrependUOffsetTRelative(x)\n      self.Slot(o)\n\n  def PrependStructSlot(self, v, x, d):\n    \"\"\"PrependStructSlot prepends a struct onto the object at vtable slot `o`.\n\n    Structs are stored inline, so nothing additional is being added. In\n    generated code, `d` is always 0.\n    \"\"\"\n\n    N.enforce_number(d, N.UOffsetTFlags)\n    if x != d:\n      self.assertStructIsInline(x)\n      self.Slot(v)\n\n  ## @endcond\n\n  def PrependBool(self, x):\n    \"\"\"Prepend a `bool` to the Builder buffer.\n\n    Note: aligns and checks for space.\n    \"\"\"\n    self.Prepend(N.BoolFlags, x)\n\n  def PrependByte(self, x):\n    \"\"\"Prepend a `byte` to the Builder buffer.\n\n    Note: aligns and checks for space.\n    \"\"\"\n    self.Prepend(N.Uint8Flags, x)\n\n  def PrependUint8(self, x):\n    \"\"\"Prepend an `uint8` to the Builder buffer.\n\n    Note: aligns and checks for space.\n    \"\"\"\n    self.Prepend(N.Uint8Flags, x)\n\n  def PrependUint16(self, x):\n    \"\"\"Prepend an `uint16` to the Builder buffer.\n\n    Note: aligns and checks for space.\n    \"\"\"\n    self.Prepend(N.Uint16Flags, x)\n\n  def PrependUint32(self, x):\n    \"\"\"Prepend an `uint32` to the Builder buffer.\n\n    Note: aligns and checks for space.\n    \"\"\"\n    self.Prepend(N.Uint32Flags, x)\n\n  def PrependUint64(self, x):\n    \"\"\"Prepend an `uint64` to the Builder buffer.\n\n    Note: aligns and checks for space.\n    \"\"\"\n    self.Prepend(N.Uint64Flags, x)\n\n  def PrependInt8(self, x):\n    \"\"\"Prepend an `int8` to the Builder buffer.\n\n    Note: aligns and checks for space.\n    \"\"\"\n    self.Prepend(N.Int8Flags, x)\n\n  def PrependInt16(self, x):\n    \"\"\"Prepend an `int16` to the Builder buffer.\n\n    Note: aligns and checks for space.\n    \"\"\"\n    self.Prepend(N.Int16Flags, x)\n\n  def PrependInt32(self, x):\n    \"\"\"Prepend an `int32` to the Builder buffer.\n\n    Note: aligns and checks for space.\n    \"\"\"\n    self.Prepend(N.Int32Flags, x)\n\n  def PrependInt64(self, x):\n    \"\"\"Prepend an `int64` to the Builder buffer.\n\n    Note: aligns and checks for space.\n    \"\"\"\n    self.Prepend(N.Int64Flags, x)\n\n  def PrependFloat32(self, x):\n    \"\"\"Prepend a `float32` to the Builder buffer.\n\n    Note: aligns and checks for space.\n    \"\"\"\n    self.Prepend(N.Float32Flags, x)\n\n  def PrependFloat64(self, x):\n    \"\"\"Prepend a `float64` to the Builder buffer.\n\n    Note: aligns and checks for space.\n    \"\"\"\n    self.Prepend(N.Float64Flags, x)\n\n  def ForceDefaults(self, forceDefaults):\n    \"\"\"In order to save space, fields that are set to their default value\n\n    don't get serialized into the buffer. Forcing defaults provides a\n    way to manually disable this optimization. When set to `True`, will\n    always serialize default values.\n    \"\"\"\n    self.forceDefaults = forceDefaults\n\n  ##############################################################\n\n  ## @cond FLATBUFFERS_INTERNAL\n  def PrependVOffsetT(self, x):\n    self.Prepend(N.VOffsetTFlags, x)\n\n  def Place(self, x, flags):\n    \"\"\"Place prepends a value specified by `flags` to the Builder,\n\n    without checking for available space.\n    \"\"\"\n\n    N.enforce_number(x, flags)\n    new_head = self.head - flags.bytewidth\n    self.head = new_head\n    encode.Write(flags.packer_type, self.Bytes, new_head, x)\n\n  def PlaceVOffsetT(self, x):\n    \"\"\"PlaceVOffsetT prepends a VOffsetT to the Builder, without checking\n\n    for space.\n    \"\"\"\n    N.enforce_number(x, N.VOffsetTFlags)\n    new_head = self.head - N.VOffsetTFlags.bytewidth\n    self.head = new_head\n    encode.Write(packer.voffset, self.Bytes, new_head, x)\n\n  def PlaceSOffsetT(self, x):\n    \"\"\"PlaceSOffsetT prepends a SOffsetT to the Builder, without checking\n\n    for space.\n    \"\"\"\n    N.enforce_number(x, N.SOffsetTFlags)\n    new_head = self.head - N.SOffsetTFlags.bytewidth\n    self.head = new_head\n    encode.Write(packer.soffset, self.Bytes, new_head, x)\n\n  def PlaceUOffsetT(self, x):\n    \"\"\"PlaceUOffsetT prepends a UOffsetT to the Builder, without checking\n\n    for space.\n    \"\"\"\n    N.enforce_number(x, N.UOffsetTFlags)\n    new_head = self.head - N.UOffsetTFlags.bytewidth\n    self.head = new_head\n    encode.Write(packer.uoffset, self.Bytes, new_head, x)\n\n  ## @endcond\n\n## @}\n"
  },
  {
    "path": "python/flatbuffers/compat.py",
    "content": "# Copyright 2016 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n\"\"\"A tiny version of `six` to help with backwards compability.\n\nAlso includes compatibility helpers for numpy.\n\"\"\"\n\nimport sys\n\nPY2 = sys.version_info[0] == 2\nPY26 = sys.version_info[0:2] == (2, 6)\nPY27 = sys.version_info[0:2] == (2, 7)\nPY275 = sys.version_info[0:3] >= (2, 7, 5)\nPY3 = sys.version_info[0] == 3\nPY34 = sys.version_info[0:2] >= (3, 4)\n\nif PY3:\n  import importlib.machinery\n\n  string_types = (str,)\n  binary_types = (bytes, bytearray)\n  range_func = range\n  memoryview_type = memoryview\n  struct_bool_decl = \"?\"\nelse:\n  import imp\n\n  string_types = (unicode,)\n  if PY26 or PY27:\n    binary_types = (str, bytearray)\n  else:\n    binary_types = (str,)\n  range_func = xrange\n  if PY26 or (PY27 and not PY275):\n    memoryview_type = buffer\n    struct_bool_decl = \"<b\"\n  else:\n    memoryview_type = memoryview\n    struct_bool_decl = \"?\"\n\n# Helper functions to facilitate making numpy optional instead of required\n\n\ndef import_numpy():\n  \"\"\"Returns the numpy module if it exists on the system,\n\n  otherwise returns None.\n  \"\"\"\n  if PY3:\n    numpy_exists = importlib.machinery.PathFinder.find_spec(\"numpy\") is not None\n  else:\n    try:\n      imp.find_module(\"numpy\")\n      numpy_exists = True\n    except ImportError:\n      numpy_exists = False\n\n  if numpy_exists:\n    # We do this outside of try/except block in case numpy exists\n    # but is not installed correctly. We do not want to catch an\n    # incorrect installation which would manifest as an\n    # ImportError.\n    import numpy as np\n  else:\n    np = None\n\n  return np\n\n\nclass NumpyRequiredForThisFeature(RuntimeError):\n  \"\"\"Error raised when user tries to use a feature that\n\n  requires numpy without having numpy installed.\n  \"\"\"\n\n  pass\n\n\n# NOTE: Future Jython support may require code here (look at `six`).\n"
  },
  {
    "path": "python/flatbuffers/encode.py",
    "content": "# Copyright 2014 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nfrom . import number_types as N\nfrom . import packer\nfrom .compat import memoryview_type\nfrom .compat import NumpyRequiredForThisFeature, import_numpy\n\nnp = import_numpy()\n\nFILE_IDENTIFIER_LENGTH = 4\n\n\ndef Get(packer_type, buf, head):\n  \"\"\"Get decodes a value at buf[head] using `packer_type`.\"\"\"\n  return packer_type.unpack_from(memoryview_type(buf), head)[0]\n\n\ndef GetVectorAsNumpy(numpy_type, buf, count, offset):\n  \"\"\"GetVecAsNumpy decodes values starting at buf[head] as\n\n  `numpy_type`, where `numpy_type` is a numpy dtype.\n  \"\"\"\n  if np is not None:\n    # TODO: could set .flags.writeable = False to make users jump through\n    #       hoops before modifying...\n    return np.frombuffer(buf, dtype=numpy_type, count=count, offset=offset)\n  else:\n    raise NumpyRequiredForThisFeature('Numpy was not found.')\n\n\ndef Write(packer_type, buf, head, n):\n  \"\"\"Write encodes `n` at buf[head] using `packer_type`.\"\"\"\n  packer_type.pack_into(buf, head, n)\n"
  },
  {
    "path": "python/flatbuffers/flexbuffers.py",
    "content": "# Lint as: python3\n# Copyright 2020 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\"\"\"Implementation of FlexBuffers binary format.\n\nFor more info check https://google.github.io/flatbuffers/flexbuffers.html and\ncorresponding C++ implementation at\nhttps://github.com/google/flatbuffers/blob/master/include/flatbuffers/flexbuffers.h\n\"\"\"\n\n# pylint: disable=invalid-name\n# TODO(dkovalev): Add type hints everywhere, so tools like pytypes could work.\n\nimport array\nimport contextlib\nimport enum\nimport struct\n\n__all__ = ('Type', 'Builder', 'GetRoot', 'Dumps', 'Loads')\n\n\nclass BitWidth(enum.IntEnum):\n  \"\"\"Supported bit widths of value types.\n\n  These are used in the lower 2 bits of a type field to determine the size of\n  the elements (and or size field) of the item pointed to (e.g. vector).\n  \"\"\"\n\n  W8 = 0  # 2^0 = 1 byte\n  W16 = 1  # 2^1 = 2 bytes\n  W32 = 2  # 2^2 = 4 bytes\n  W64 = 3  # 2^3 = 8 bytes\n\n  @staticmethod\n  def U(value):\n    \"\"\"Returns the minimum `BitWidth` to encode unsigned integer value.\"\"\"\n    assert value >= 0\n\n    if value < (1 << 8):\n      return BitWidth.W8\n    elif value < (1 << 16):\n      return BitWidth.W16\n    elif value < (1 << 32):\n      return BitWidth.W32\n    elif value < (1 << 64):\n      return BitWidth.W64\n    else:\n      raise ValueError('value is too big to encode: %s' % value)\n\n  @staticmethod\n  def I(value):\n    \"\"\"Returns the minimum `BitWidth` to encode signed integer value.\"\"\"\n    # -2^(n-1) <=     value < 2^(n-1)\n    # -2^n     <= 2 * value < 2^n\n    # 2 * value < 2^n, when value >= 0 or 2 * (-value) <= 2^n, when value < 0\n    # 2 * value < 2^n, when value >= 0 or 2 * (-value) - 1 < 2^n, when value < 0\n    #\n    # if value >= 0:\n    #   return BitWidth.U(2 * value)\n    # else:\n    #   return BitWidth.U(2 * (-value) - 1)  # ~x = -x - 1\n    value *= 2\n    return BitWidth.U(value if value >= 0 else ~value)\n\n  @staticmethod\n  def F(value):\n    \"\"\"Returns the `BitWidth` to encode floating point value.\"\"\"\n    if struct.unpack('<f', struct.pack('<f', value))[0] == value:\n      return BitWidth.W32\n    return BitWidth.W64\n\n  @staticmethod\n  def B(byte_width):\n    return {1: BitWidth.W8, 2: BitWidth.W16, 4: BitWidth.W32, 8: BitWidth.W64}[\n        byte_width\n    ]\n\n\nI = {1: 'b', 2: 'h', 4: 'i', 8: 'q'}  # Integer formats\nU = {1: 'B', 2: 'H', 4: 'I', 8: 'Q'}  # Unsigned integer formats\nF = {4: 'f', 8: 'd'}  # Floating point formats\n\n\ndef _Unpack(fmt, buf):\n  return struct.unpack('<%s' % fmt[len(buf)], buf)[0]\n\n\ndef _UnpackVector(fmt, buf, length):\n  byte_width = len(buf) // length\n  return struct.unpack('<%d%s' % (length, fmt[byte_width]), buf)\n\n\ndef _Pack(fmt, value, byte_width):\n  return struct.pack('<%s' % fmt[byte_width], value)\n\n\ndef _PackVector(fmt, values, byte_width):\n  return struct.pack('<%d%s' % (len(values), fmt[byte_width]), *values)\n\n\ndef _Mutate(fmt, buf, value, byte_width, value_bit_width):\n  if (1 << value_bit_width) <= byte_width:\n    buf[:byte_width] = _Pack(fmt, value, byte_width)\n    return True\n  return False\n\n\n# Computes how many bytes you'd have to pad to be able to write an\n# \"scalar_size\" scalar if the buffer had grown to \"buf_size\",\n# \"scalar_size\" is a power of two.\ndef _PaddingBytes(buf_size, scalar_size):\n  # ((buf_size + (scalar_size - 1)) // scalar_size) * scalar_size - buf_size\n  return -buf_size & (scalar_size - 1)\n\n\ndef _ShiftSlice(s, offset, length):\n  start = offset + (0 if s.start is None else s.start)\n  stop = offset + (length if s.stop is None else s.stop)\n  return slice(start, stop, s.step)\n\n\n# https://en.cppreference.com/w/cpp/algorithm/lower_bound\ndef _LowerBound(values, value, pred):\n  \"\"\"Implementation of C++ std::lower_bound() algorithm.\"\"\"\n  first, last = 0, len(values)\n  count = last - first\n  while count > 0:\n    i = first\n    step = count // 2\n    i += step\n    if pred(values[i], value):\n      i += 1\n      first = i\n      count -= step + 1\n    else:\n      count = step\n  return first\n\n\n# https://en.cppreference.com/w/cpp/algorithm/binary_search\ndef _BinarySearch(values, value, pred=lambda x, y: x < y):\n  \"\"\"Implementation of C++ std::binary_search() algorithm.\"\"\"\n  index = _LowerBound(values, value, pred)\n  if index != len(values) and not pred(value, values[index]):\n    return index\n  return -1\n\n\nclass Type(enum.IntEnum):\n  \"\"\"Supported types of encoded data.\n\n  These are used as the upper 6 bits of a type field to indicate the actual\n  type.\n  \"\"\"\n\n  NULL = 0\n  INT = 1\n  UINT = 2\n  FLOAT = 3\n  # Types above stored inline, types below store an offset.\n  KEY = 4\n  STRING = 5\n  INDIRECT_INT = 6\n  INDIRECT_UINT = 7\n  INDIRECT_FLOAT = 8\n  MAP = 9\n  VECTOR = 10  # Untyped.\n\n  VECTOR_INT = 11  # Typed any size (stores no type table).\n  VECTOR_UINT = 12\n  VECTOR_FLOAT = 13\n  VECTOR_KEY = 14\n  # DEPRECATED, use VECTOR or VECTOR_KEY instead.\n  # Read test.cpp/FlexBuffersDeprecatedTest() for details on why.\n  VECTOR_STRING_DEPRECATED = 15\n\n  VECTOR_INT2 = 16  # Typed tuple (no type table, no size field).\n  VECTOR_UINT2 = 17\n  VECTOR_FLOAT2 = 18\n  VECTOR_INT3 = 19  # Typed triple (no type table, no size field).\n  VECTOR_UINT3 = 20\n  VECTOR_FLOAT3 = 21\n  VECTOR_INT4 = 22  # Typed quad (no type table, no size field).\n  VECTOR_UINT4 = 23\n  VECTOR_FLOAT4 = 24\n\n  BLOB = 25\n  BOOL = 26\n  VECTOR_BOOL = 36  # To do the same type of conversion of type to vector type\n\n  @staticmethod\n  def Pack(type_, bit_width):\n    return (int(type_) << 2) | bit_width\n\n  @staticmethod\n  def Unpack(packed_type):\n    return 1 << (packed_type & 0b11), Type(packed_type >> 2)\n\n  @staticmethod\n  def IsInline(type_):\n    return type_ <= Type.FLOAT or type_ == Type.BOOL\n\n  @staticmethod\n  def IsTypedVector(type_):\n    return (\n        Type.VECTOR_INT <= type_ <= Type.VECTOR_STRING_DEPRECATED\n        or type_ == Type.VECTOR_BOOL\n    )\n\n  @staticmethod\n  def IsTypedVectorElementType(type_):\n    return Type.INT <= type_ <= Type.STRING or type_ == Type.BOOL\n\n  @staticmethod\n  def ToTypedVectorElementType(type_):\n    if not Type.IsTypedVector(type_):\n      raise ValueError('must be typed vector type')\n\n    return Type(type_ - Type.VECTOR_INT + Type.INT)\n\n  @staticmethod\n  def IsFixedTypedVector(type_):\n    return Type.VECTOR_INT2 <= type_ <= Type.VECTOR_FLOAT4\n\n  @staticmethod\n  def IsFixedTypedVectorElementType(type_):\n    return Type.INT <= type_ <= Type.FLOAT\n\n  @staticmethod\n  def ToFixedTypedVectorElementType(type_):\n    if not Type.IsFixedTypedVector(type_):\n      raise ValueError('must be fixed typed vector type')\n\n    # 3 types each, starting from length 2.\n    fixed_type = type_ - Type.VECTOR_INT2\n    return Type(fixed_type % 3 + Type.INT), fixed_type // 3 + 2\n\n  @staticmethod\n  def ToTypedVector(element_type, fixed_len=0):\n    \"\"\"Converts element type to corresponding vector type.\n\n    Args:\n      element_type: vector element type\n      fixed_len: number of elements: 0 for typed vector; 2, 3, or 4 for fixed\n        typed vector.\n\n    Returns:\n      Typed vector type or fixed typed vector type.\n    \"\"\"\n    if fixed_len == 0:\n      if not Type.IsTypedVectorElementType(element_type):\n        raise ValueError('must be typed vector element type')\n    else:\n      if not Type.IsFixedTypedVectorElementType(element_type):\n        raise ValueError('must be fixed typed vector element type')\n\n    offset = element_type - Type.INT\n    if fixed_len == 0:\n      return Type(offset + Type.VECTOR_INT)  # TypedVector\n    elif fixed_len == 2:\n      return Type(offset + Type.VECTOR_INT2)  # FixedTypedVector\n    elif fixed_len == 3:\n      return Type(offset + Type.VECTOR_INT3)  # FixedTypedVector\n    elif fixed_len == 4:\n      return Type(offset + Type.VECTOR_INT4)  # FixedTypedVector\n    else:\n      raise ValueError('unsupported fixed_len: %s' % fixed_len)\n\n\nclass Buf:\n  \"\"\"Class to access underlying buffer object starting from the given offset.\"\"\"\n\n  def __init__(self, buf, offset):\n    self._buf = buf\n    self._offset = offset if offset >= 0 else len(buf) + offset\n    self._length = len(buf) - self._offset\n\n  def __getitem__(self, key):\n    if isinstance(key, slice):\n      return self._buf[_ShiftSlice(key, self._offset, self._length)]\n    elif isinstance(key, int):\n      return self._buf[self._offset + key]\n    else:\n      raise TypeError('invalid key type')\n\n  def __setitem__(self, key, value):\n    if isinstance(key, slice):\n      self._buf[_ShiftSlice(key, self._offset, self._length)] = value\n    elif isinstance(key, int):\n      self._buf[self._offset + key] = key\n    else:\n      raise TypeError('invalid key type')\n\n  def __repr__(self):\n    return 'buf[%d:]' % self._offset\n\n  def Find(self, sub):\n    \"\"\"Returns the lowest index where the sub subsequence is found.\"\"\"\n    return self._buf[self._offset :].find(sub)\n\n  def Slice(self, offset):\n    \"\"\"Returns new `Buf` which starts from the given offset.\"\"\"\n    return Buf(self._buf, self._offset + offset)\n\n  def Indirect(self, offset, byte_width):\n    \"\"\"Return new `Buf` based on the encoded offset (indirect encoding).\"\"\"\n    return self.Slice(offset - _Unpack(U, self[offset : offset + byte_width]))\n\n\nclass Object:\n  \"\"\"Base class for all non-trivial data accessors.\"\"\"\n\n  __slots__ = '_buf', '_byte_width'\n\n  def __init__(self, buf, byte_width):\n    self._buf = buf\n    self._byte_width = byte_width\n\n  @property\n  def ByteWidth(self):\n    return self._byte_width\n\n\nclass Sized(Object):\n  \"\"\"Base class for all data accessors which need to read encoded size.\"\"\"\n\n  __slots__ = ('_size',)\n\n  def __init__(self, buf, byte_width, size=0):\n    super().__init__(buf, byte_width)\n    if size == 0:\n      self._size = _Unpack(U, self.SizeBytes)\n    else:\n      self._size = size\n\n  @property\n  def SizeBytes(self):\n    return self._buf[-self._byte_width : 0]\n\n  def __len__(self):\n    return self._size\n\n\nclass Blob(Sized):\n  \"\"\"Data accessor for the encoded blob bytes.\"\"\"\n\n  __slots__ = ()\n\n  @property\n  def Bytes(self):\n    return self._buf[0 : len(self)]\n\n  def __repr__(self):\n    return 'Blob(%s, size=%d)' % (self._buf, len(self))\n\n\nclass String(Sized):\n  \"\"\"Data accessor for the encoded string bytes.\"\"\"\n\n  __slots__ = ()\n\n  @property\n  def Bytes(self):\n    return self._buf[0 : len(self)]\n\n  def Mutate(self, value):\n    \"\"\"Mutates underlying string bytes in place.\n\n    Args:\n      value: New string to replace the existing one. New string must have less\n        or equal UTF-8-encoded bytes than the existing one to successfully\n        mutate underlying byte buffer.\n\n    Returns:\n      Whether the value was mutated or not.\n    \"\"\"\n    encoded = value.encode('utf-8')\n    n = len(encoded)\n    if n <= len(self):\n      self._buf[-self._byte_width : 0] = _Pack(U, n, self._byte_width)\n      self._buf[0:n] = encoded\n      self._buf[n : len(self)] = bytearray(len(self) - n)\n      return True\n    return False\n\n  def __str__(self):\n    return self.Bytes.decode('utf-8')\n\n  def __repr__(self):\n    return 'String(%s, size=%d)' % (self._buf, len(self))\n\n\nclass Key(Object):\n  \"\"\"Data accessor for the encoded key bytes.\"\"\"\n\n  __slots__ = ()\n\n  def __init__(self, buf, byte_width):\n    assert byte_width == 1\n    super().__init__(buf, byte_width)\n\n  @property\n  def Bytes(self):\n    return self._buf[0 : len(self)]\n\n  def __len__(self):\n    return self._buf.Find(0)\n\n  def __str__(self):\n    return self.Bytes.decode('ascii')\n\n  def __repr__(self):\n    return 'Key(%s, size=%d)' % (self._buf, len(self))\n\n\nclass Vector(Sized):\n  \"\"\"Data accessor for the encoded vector bytes.\"\"\"\n\n  __slots__ = ()\n\n  def __getitem__(self, index):\n    if index < 0 or index >= len(self):\n      raise IndexError(\n          'vector index %s is out of [0, %d) range' % (index, len(self))\n      )\n\n    packed_type = self._buf[len(self) * self._byte_width + index]\n    buf = self._buf.Slice(index * self._byte_width)\n    return Ref.PackedType(buf, self._byte_width, packed_type)\n\n  @property\n  def Value(self):\n    \"\"\"Returns the underlying encoded data as a list object.\"\"\"\n    return [e.Value for e in self]\n\n  def __repr__(self):\n    return 'Vector(%s, byte_width=%d, size=%d)' % (\n        self._buf,\n        self._byte_width,\n        self._size,\n    )\n\n\nclass TypedVector(Sized):\n  \"\"\"Data accessor for the encoded typed vector or fixed typed vector bytes.\"\"\"\n\n  __slots__ = '_element_type', '_size'\n\n  def __init__(self, buf, byte_width, element_type, size=0):\n    super().__init__(buf, byte_width, size)\n\n    if element_type == Type.STRING:\n      # These can't be accessed as strings, since we don't know the bit-width\n      # of the size field, see the declaration of\n      # FBT_VECTOR_STRING_DEPRECATED above for details.\n      # We change the type here to be keys, which are a subtype of strings,\n      # and will ignore the size field. This will truncate strings with\n      # embedded nulls.\n      element_type = Type.KEY\n\n    self._element_type = element_type\n\n  @property\n  def Bytes(self):\n    return self._buf[: self._byte_width * len(self)]\n\n  @property\n  def ElementType(self):\n    return self._element_type\n\n  def __getitem__(self, index):\n    if index < 0 or index >= len(self):\n      raise IndexError(\n          'vector index %s is out of [0, %d) range' % (index, len(self))\n      )\n\n    buf = self._buf.Slice(index * self._byte_width)\n    return Ref(buf, self._byte_width, 1, self._element_type)\n\n  @property\n  def Value(self):\n    \"\"\"Returns underlying data as list object.\"\"\"\n    if not self:\n      return []\n\n    if self._element_type is Type.BOOL:\n      return [bool(e) for e in _UnpackVector(U, self.Bytes, len(self))]\n    elif self._element_type is Type.INT:\n      return list(_UnpackVector(I, self.Bytes, len(self)))\n    elif self._element_type is Type.UINT:\n      return list(_UnpackVector(U, self.Bytes, len(self)))\n    elif self._element_type is Type.FLOAT:\n      return list(_UnpackVector(F, self.Bytes, len(self)))\n    elif self._element_type is Type.KEY:\n      return [e.AsKey for e in self]\n    elif self._element_type is Type.STRING:\n      return [e.AsString for e in self]\n    else:\n      raise TypeError('unsupported element_type: %s' % self._element_type)\n\n  def __repr__(self):\n    return 'TypedVector(%s, byte_width=%d, element_type=%s, size=%d)' % (\n        self._buf,\n        self._byte_width,\n        self._element_type,\n        self._size,\n    )\n\n\nclass Map(Vector):\n  \"\"\"Data accessor for the encoded map bytes.\"\"\"\n\n  @staticmethod\n  def CompareKeys(a, b):\n    if isinstance(a, Ref):\n      a = a.AsKeyBytes\n    if isinstance(b, Ref):\n      b = b.AsKeyBytes\n    return a < b\n\n  def __getitem__(self, key):\n    if isinstance(key, int):\n      return super().__getitem__(key)\n\n    index = _BinarySearch(self.Keys, key.encode('ascii'), self.CompareKeys)\n    if index != -1:\n      return super().__getitem__(index)\n\n    raise KeyError(key)\n\n  @property\n  def Keys(self):\n    byte_width = _Unpack(\n        U, self._buf[-2 * self._byte_width : -self._byte_width]\n    )\n    buf = self._buf.Indirect(-3 * self._byte_width, self._byte_width)\n    return TypedVector(buf, byte_width, Type.KEY)\n\n  @property\n  def Values(self):\n    return Vector(self._buf, self._byte_width)\n\n  @property\n  def Value(self):\n    return {k.Value: v.Value for k, v in zip(self.Keys, self.Values)}\n\n  def __repr__(self):\n    return 'Map(%s, size=%d)' % (self._buf, len(self))\n\n\nclass Ref:\n  \"\"\"Data accessor for the encoded data bytes.\"\"\"\n\n  __slots__ = '_buf', '_parent_width', '_byte_width', '_type'\n\n  @staticmethod\n  def PackedType(buf, parent_width, packed_type):\n    byte_width, type_ = Type.Unpack(packed_type)\n    return Ref(buf, parent_width, byte_width, type_)\n\n  def __init__(self, buf, parent_width, byte_width, type_):\n    self._buf = buf\n    self._parent_width = parent_width\n    self._byte_width = byte_width\n    self._type = type_\n\n  def __repr__(self):\n    return 'Ref(%s, parent_width=%d, byte_width=%d, type_=%s)' % (\n        self._buf,\n        self._parent_width,\n        self._byte_width,\n        self._type,\n    )\n\n  @property\n  def _Bytes(self):\n    return self._buf[: self._parent_width]\n\n  def _ConvertError(self, target_type):\n    raise TypeError('cannot convert %s to %s' % (self._type, target_type))\n\n  def _Indirect(self):\n    return self._buf.Indirect(0, self._parent_width)\n\n  @property\n  def IsNull(self):\n    return self._type is Type.NULL\n\n  @property\n  def IsBool(self):\n    return self._type is Type.BOOL\n\n  @property\n  def AsBool(self):\n    if self._type is Type.BOOL:\n      return bool(_Unpack(U, self._Bytes))\n    else:\n      return self.AsInt != 0\n\n  def MutateBool(self, value):\n    \"\"\"Mutates underlying boolean value bytes in place.\n\n    Args:\n      value: New boolean value.\n\n    Returns:\n      Whether the value was mutated or not.\n    \"\"\"\n    return self.IsBool and _Mutate(\n        U, self._buf, value, self._parent_width, BitWidth.W8\n    )\n\n  @property\n  def IsNumeric(self):\n    return self.IsInt or self.IsFloat\n\n  @property\n  def IsInt(self):\n    return self._type in (\n        Type.INT,\n        Type.INDIRECT_INT,\n        Type.UINT,\n        Type.INDIRECT_UINT,\n    )\n\n  @property\n  def AsInt(self):\n    \"\"\"Returns current reference as integer value.\"\"\"\n    if self.IsNull:\n      return 0\n    elif self.IsBool:\n      return int(self.AsBool)\n    elif self._type is Type.INT:\n      return _Unpack(I, self._Bytes)\n    elif self._type is Type.INDIRECT_INT:\n      return _Unpack(I, self._Indirect()[: self._byte_width])\n    if self._type is Type.UINT:\n      return _Unpack(U, self._Bytes)\n    elif self._type is Type.INDIRECT_UINT:\n      return _Unpack(U, self._Indirect()[: self._byte_width])\n    elif self.IsString:\n      return len(self.AsString)\n    elif self.IsKey:\n      return len(self.AsKey)\n    elif self.IsBlob:\n      return len(self.AsBlob)\n    elif self.IsVector:\n      return len(self.AsVector)\n    elif self.IsTypedVector:\n      return len(self.AsTypedVector)\n    elif self.IsFixedTypedVector:\n      return len(self.AsFixedTypedVector)\n    else:\n      raise self._ConvertError(Type.INT)\n\n  def MutateInt(self, value):\n    \"\"\"Mutates underlying integer value bytes in place.\n\n    Args:\n      value: New integer value. It must fit to the byte size of the existing\n        encoded value.\n\n    Returns:\n      Whether the value was mutated or not.\n    \"\"\"\n    if self._type is Type.INT:\n      return _Mutate(I, self._buf, value, self._parent_width, BitWidth.I(value))\n    elif self._type is Type.INDIRECT_INT:\n      return _Mutate(\n          I, self._Indirect(), value, self._byte_width, BitWidth.I(value)\n      )\n    elif self._type is Type.UINT:\n      return _Mutate(U, self._buf, value, self._parent_width, BitWidth.U(value))\n    elif self._type is Type.INDIRECT_UINT:\n      return _Mutate(\n          U, self._Indirect(), value, self._byte_width, BitWidth.U(value)\n      )\n    else:\n      return False\n\n  @property\n  def IsFloat(self):\n    return self._type in (Type.FLOAT, Type.INDIRECT_FLOAT)\n\n  @property\n  def AsFloat(self):\n    \"\"\"Returns current reference as floating point value.\"\"\"\n    if self.IsNull:\n      return 0.0\n    elif self.IsBool:\n      return float(self.AsBool)\n    elif self.IsInt:\n      return float(self.AsInt)\n    elif self._type is Type.FLOAT:\n      return _Unpack(F, self._Bytes)\n    elif self._type is Type.INDIRECT_FLOAT:\n      return _Unpack(F, self._Indirect()[: self._byte_width])\n    elif self.IsString:\n      return float(self.AsString)\n    elif self.IsVector:\n      return float(len(self.AsVector))\n    elif self.IsTypedVector():\n      return float(len(self.AsTypedVector))\n    elif self.IsFixedTypedVector():\n      return float(len(self.FixedTypedVector))\n    else:\n      raise self._ConvertError(Type.FLOAT)\n\n  def MutateFloat(self, value):\n    \"\"\"Mutates underlying floating point value bytes in place.\n\n    Args:\n      value: New float value. It must fit to the byte size of the existing\n        encoded value.\n\n    Returns:\n      Whether the value was mutated or not.\n    \"\"\"\n    if self._type is Type.FLOAT:\n      return _Mutate(\n          F,\n          self._buf,\n          value,\n          self._parent_width,\n          BitWidth.B(self._parent_width),\n      )\n    elif self._type is Type.INDIRECT_FLOAT:\n      return _Mutate(\n          F,\n          self._Indirect(),\n          value,\n          self._byte_width,\n          BitWidth.B(self._byte_width),\n      )\n    else:\n      return False\n\n  @property\n  def IsKey(self):\n    return self._type is Type.KEY\n\n  @property\n  def AsKeyBytes(self):\n    if self.IsKey:\n      return Key(self._Indirect(), self._byte_width).Bytes\n    else:\n      raise self._ConvertError(Type.KEY)\n\n  @property\n  def AsKey(self):\n    if self.IsKey:\n      return str(Key(self._Indirect(), self._byte_width))\n    else:\n      raise self._ConvertError(Type.KEY)\n\n  @property\n  def IsString(self):\n    return self._type is Type.STRING\n\n  @property\n  def AsStringBytes(self):\n    if self.IsString:\n      return String(self._Indirect(), self._byte_width).Bytes\n    elif self.IsKey:\n      return self.AsKeyBytes\n    else:\n      raise self._ConvertError(Type.STRING)\n\n  @property\n  def AsString(self):\n    if self.IsString:\n      return str(String(self._Indirect(), self._byte_width))\n    elif self.IsKey:\n      return self.AsKey\n    else:\n      raise self._ConvertError(Type.STRING)\n\n  def MutateString(self, value):\n    return String(self._Indirect(), self._byte_width).Mutate(value)\n\n  @property\n  def IsBlob(self):\n    return self._type is Type.BLOB\n\n  @property\n  def AsBlob(self):\n    if self.IsBlob:\n      return Blob(self._Indirect(), self._byte_width).Bytes\n    else:\n      raise self._ConvertError(Type.BLOB)\n\n  @property\n  def IsAnyVector(self):\n    return self.IsVector or self.IsTypedVector or self.IsFixedTypedVector()\n\n  @property\n  def IsVector(self):\n    return self._type in (Type.VECTOR, Type.MAP)\n\n  @property\n  def AsVector(self):\n    if self.IsVector:\n      return Vector(self._Indirect(), self._byte_width)\n    else:\n      raise self._ConvertError(Type.VECTOR)\n\n  @property\n  def IsTypedVector(self):\n    return Type.IsTypedVector(self._type)\n\n  @property\n  def AsTypedVector(self):\n    if self.IsTypedVector:\n      return TypedVector(\n          self._Indirect(),\n          self._byte_width,\n          Type.ToTypedVectorElementType(self._type),\n      )\n    else:\n      raise self._ConvertError('TYPED_VECTOR')\n\n  @property\n  def IsFixedTypedVector(self):\n    return Type.IsFixedTypedVector(self._type)\n\n  @property\n  def AsFixedTypedVector(self):\n    if self.IsFixedTypedVector:\n      element_type, size = Type.ToFixedTypedVectorElementType(self._type)\n      return TypedVector(self._Indirect(), self._byte_width, element_type, size)\n    else:\n      raise self._ConvertError('FIXED_TYPED_VECTOR')\n\n  @property\n  def IsMap(self):\n    return self._type is Type.MAP\n\n  @property\n  def AsMap(self):\n    if self.IsMap:\n      return Map(self._Indirect(), self._byte_width)\n    else:\n      raise self._ConvertError(Type.MAP)\n\n  @property\n  def Value(self):\n    \"\"\"Converts current reference to value of corresponding type.\n\n    This is equivalent to calling `AsInt` for integer values, `AsFloat` for\n    floating point values, etc.\n\n    Returns:\n      Value of corresponding type.\n    \"\"\"\n    if self.IsNull:\n      return None\n    elif self.IsBool:\n      return self.AsBool\n    elif self.IsInt:\n      return self.AsInt\n    elif self.IsFloat:\n      return self.AsFloat\n    elif self.IsString:\n      return self.AsString\n    elif self.IsKey:\n      return self.AsKey\n    elif self.IsBlob:\n      return self.AsBlob\n    elif self.IsMap:\n      return self.AsMap.Value\n    elif self.IsVector:\n      return self.AsVector.Value\n    elif self.IsTypedVector:\n      return self.AsTypedVector.Value\n    elif self.IsFixedTypedVector:\n      return self.AsFixedTypedVector.Value\n    else:\n      raise TypeError('cannot convert %r to value' % self)\n\n\ndef _IsIterable(obj):\n  try:\n    iter(obj)\n    return True\n  except TypeError:\n    return False\n\n\nclass Value:\n  \"\"\"Class to represent given value during the encoding process.\"\"\"\n\n  @staticmethod\n  def Null():\n    return Value(0, Type.NULL, BitWidth.W8)\n\n  @staticmethod\n  def Bool(value):\n    return Value(value, Type.BOOL, BitWidth.W8)\n\n  @staticmethod\n  def Int(value, bit_width):\n    return Value(value, Type.INT, bit_width)\n\n  @staticmethod\n  def UInt(value, bit_width):\n    return Value(value, Type.UINT, bit_width)\n\n  @staticmethod\n  def Float(value, bit_width):\n    return Value(value, Type.FLOAT, bit_width)\n\n  @staticmethod\n  def Key(offset):\n    return Value(offset, Type.KEY, BitWidth.W8)\n\n  def __init__(self, value, type_, min_bit_width):\n    self._value = value\n    self._type = type_\n\n    # For scalars: of itself, for vector: of its elements, for string: length.\n    self._min_bit_width = min_bit_width\n\n  @property\n  def Value(self):\n    return self._value\n\n  @property\n  def Type(self):\n    return self._type\n\n  @property\n  def MinBitWidth(self):\n    return self._min_bit_width\n\n  def StoredPackedType(self, parent_bit_width=BitWidth.W8):\n    return Type.Pack(self._type, self.StoredWidth(parent_bit_width))\n\n  # We have an absolute offset, but want to store a relative offset\n  # elem_index elements beyond the current buffer end. Since whether\n  # the relative offset fits in a certain byte_width depends on\n  # the size of the elements before it (and their alignment), we have\n  # to test for each size in turn.\n  def ElemWidth(self, buf_size, elem_index=0):\n    if Type.IsInline(self._type):\n      return self._min_bit_width\n    for byte_width in 1, 2, 4, 8:\n      offset_loc = (\n          buf_size\n          + _PaddingBytes(buf_size, byte_width)\n          + elem_index * byte_width\n      )\n      bit_width = BitWidth.U(offset_loc - self._value)\n      if byte_width == (1 << bit_width):\n        return bit_width\n    raise ValueError('relative offset is too big')\n\n  def StoredWidth(self, parent_bit_width=BitWidth.W8):\n    if Type.IsInline(self._type):\n      return max(self._min_bit_width, parent_bit_width)\n    return self._min_bit_width\n\n  def __repr__(self):\n    return 'Value(%s, %s, %s)' % (self._value, self._type, self._min_bit_width)\n\n  def __str__(self):\n    return str(self._value)\n\n\ndef InMap(func):\n  def wrapper(self, *args, **kwargs):\n    if isinstance(args[0], str):\n      self.Key(args[0])\n      func(self, *args[1:], **kwargs)\n    else:\n      func(self, *args, **kwargs)\n\n  return wrapper\n\n\ndef InMapForString(func):\n  def wrapper(self, *args):\n    if len(args) == 1:\n      func(self, args[0])\n    elif len(args) == 2:\n      self.Key(args[0])\n      func(self, args[1])\n    else:\n      raise ValueError('invalid number of arguments')\n\n  return wrapper\n\n\nclass Pool:\n  \"\"\"Collection of (data, offset) pairs sorted by data for quick access.\"\"\"\n\n  def __init__(self):\n    self._pool = []  # sorted list of (data, offset) tuples\n\n  def FindOrInsert(self, data, offset):\n    do = data, offset\n    index = _BinarySearch(self._pool, do, lambda a, b: a[0] < b[0])\n    if index != -1:\n      _, offset = self._pool[index]\n      return offset\n    self._pool.insert(index, do)\n    return None\n\n  def Clear(self):\n    self._pool = []\n\n  @property\n  def Elements(self):\n    return [data for data, _ in self._pool]\n\n\nclass Builder:\n  \"\"\"Helper class to encode structural data into flexbuffers format.\"\"\"\n\n  def __init__(\n      self,\n      share_strings=False,\n      share_keys=True,\n      force_min_bit_width=BitWidth.W8,\n  ):\n    self._share_strings = share_strings\n    self._share_keys = share_keys\n    self._force_min_bit_width = force_min_bit_width\n\n    self._string_pool = Pool()\n    self._key_pool = Pool()\n\n    self._finished = False\n    self._buf = bytearray()\n    self._stack = []\n\n  def __len__(self):\n    return len(self._buf)\n\n  @property\n  def StringPool(self):\n    return self._string_pool\n\n  @property\n  def KeyPool(self):\n    return self._key_pool\n\n  def Clear(self):\n    self._string_pool.Clear()\n    self._key_pool.Clear()\n    self._finished = False\n    self._buf = bytearray()\n    self._stack = []\n\n  def Finish(self):\n    \"\"\"Finishes encoding process and returns underlying buffer.\"\"\"\n    if self._finished:\n      raise RuntimeError('builder has been already finished')\n\n    # If you hit this exception, you likely have objects that were never\n    # included in a parent. You need to have exactly one root to finish a\n    # buffer. Check your Start/End calls are matched, and all objects are inside\n    # some other object.\n    if len(self._stack) != 1:\n      raise RuntimeError('internal stack size must be one')\n\n    value = self._stack[0]\n    byte_width = self._Align(value.ElemWidth(len(self._buf)))\n    self._WriteAny(value, byte_width=byte_width)  # Root value\n    self._Write(U, value.StoredPackedType(), byte_width=1)  # Root type\n    self._Write(U, byte_width, byte_width=1)  # Root size\n\n    self.finished = True\n    return self._buf\n\n  def _ReadKey(self, offset):\n    key = self._buf[offset:]\n    return key[: key.find(0)]\n\n  def _Align(self, alignment):\n    byte_width = 1 << alignment\n    self._buf.extend(b'\\x00' * _PaddingBytes(len(self._buf), byte_width))\n    return byte_width\n\n  def _Write(self, fmt, value, byte_width):\n    self._buf.extend(_Pack(fmt, value, byte_width))\n\n  def _WriteVector(self, fmt, values, byte_width):\n    self._buf.extend(_PackVector(fmt, values, byte_width))\n\n  def _WriteOffset(self, offset, byte_width):\n    relative_offset = len(self._buf) - offset\n    assert byte_width == 8 or relative_offset < (1 << (8 * byte_width))\n    self._Write(U, relative_offset, byte_width)\n\n  def _WriteAny(self, value, byte_width):\n    fmt = {\n        Type.NULL: U,\n        Type.BOOL: U,\n        Type.INT: I,\n        Type.UINT: U,\n        Type.FLOAT: F,\n    }.get(value.Type)\n    if fmt:\n      self._Write(fmt, value.Value, byte_width)\n    else:\n      self._WriteOffset(value.Value, byte_width)\n\n  def _WriteBlob(self, data, append_zero, type_):\n    bit_width = BitWidth.U(len(data))\n    byte_width = self._Align(bit_width)\n    self._Write(U, len(data), byte_width)\n    loc = len(self._buf)\n    self._buf.extend(data)\n    if append_zero:\n      self._buf.append(0)\n    self._stack.append(Value(loc, type_, bit_width))\n    return loc\n\n  def _WriteScalarVector(self, element_type, byte_width, elements, fixed):\n    \"\"\"Writes scalar vector elements to the underlying buffer.\"\"\"\n    bit_width = BitWidth.B(byte_width)\n    # If you get this exception, you're trying to write a vector with a size\n    # field that is bigger than the scalars you're trying to write (e.g. a\n    # byte vector > 255 elements). For such types, write a \"blob\" instead.\n    if BitWidth.U(len(elements)) > bit_width:\n      raise ValueError('too many elements for the given byte_width')\n\n    self._Align(bit_width)\n    if not fixed:\n      self._Write(U, len(elements), byte_width)\n\n    loc = len(self._buf)\n\n    fmt = {Type.INT: I, Type.UINT: U, Type.FLOAT: F}.get(element_type)\n    if not fmt:\n      raise TypeError('unsupported element_type')\n    self._WriteVector(fmt, elements, byte_width)\n\n    type_ = Type.ToTypedVector(element_type, len(elements) if fixed else 0)\n    self._stack.append(Value(loc, type_, bit_width))\n    return loc\n\n  def _CreateVector(self, elements, typed, fixed, keys=None):\n    \"\"\"Writes vector elements to the underlying buffer.\"\"\"\n    length = len(elements)\n\n    if fixed and not typed:\n      raise ValueError('fixed vector must be typed')\n\n    # Figure out smallest bit width we can store this vector with.\n    bit_width = max(self._force_min_bit_width, BitWidth.U(length))\n    prefix_elems = 1  # Vector size\n    if keys:\n      bit_width = max(bit_width, keys.ElemWidth(len(self._buf)))\n      prefix_elems += 2  # Offset to the keys vector and its byte width.\n\n    vector_type = Type.KEY\n    # Check bit widths and types for all elements.\n    for i, e in enumerate(elements):\n      bit_width = max(bit_width, e.ElemWidth(len(self._buf), prefix_elems + i))\n\n      if typed:\n        if i == 0:\n          vector_type = e.Type\n        else:\n          if vector_type != e.Type:\n            raise RuntimeError('typed vector elements must be of the same type')\n\n    if fixed and not Type.IsFixedTypedVectorElementType(vector_type):\n      raise RuntimeError('must be fixed typed vector element type')\n\n    byte_width = self._Align(bit_width)\n    # Write vector. First the keys width/offset if available, and size.\n    if keys:\n      self._WriteOffset(keys.Value, byte_width)\n      self._Write(U, 1 << keys.MinBitWidth, byte_width)\n\n    if not fixed:\n      self._Write(U, length, byte_width)\n\n    # Then the actual data.\n    loc = len(self._buf)\n    for e in elements:\n      self._WriteAny(e, byte_width)\n\n    # Then the types.\n    if not typed:\n      for e in elements:\n        self._buf.append(e.StoredPackedType(bit_width))\n\n    if keys:\n      type_ = Type.MAP\n    else:\n      if typed:\n        type_ = Type.ToTypedVector(vector_type, length if fixed else 0)\n      else:\n        type_ = Type.VECTOR\n\n    return Value(loc, type_, bit_width)\n\n  def _PushIndirect(self, value, type_, bit_width):\n    byte_width = self._Align(bit_width)\n    loc = len(self._buf)\n    fmt = {Type.INDIRECT_INT: I, Type.INDIRECT_UINT: U, Type.INDIRECT_FLOAT: F}[\n        type_\n    ]\n    self._Write(fmt, value, byte_width)\n    self._stack.append(Value(loc, type_, bit_width))\n\n  @InMapForString\n  def String(self, value):\n    \"\"\"Encodes string value.\"\"\"\n    reset_to = len(self._buf)\n    encoded = value.encode('utf-8')\n    loc = self._WriteBlob(encoded, append_zero=True, type_=Type.STRING)\n    if self._share_strings:\n      prev_loc = self._string_pool.FindOrInsert(encoded, loc)\n      if prev_loc is not None:\n        del self._buf[reset_to:]\n        self._stack[-1]._value = loc = prev_loc  # pylint: disable=protected-access\n\n    return loc\n\n  @InMap\n  def Blob(self, value):\n    \"\"\"Encodes binary blob value.\n\n    Args:\n      value: A byte/bytearray value to encode\n\n    Returns:\n      Offset of the encoded value in underlying the byte buffer.\n    \"\"\"\n    return self._WriteBlob(value, append_zero=False, type_=Type.BLOB)\n\n  def Key(self, value):\n    \"\"\"Encodes key value.\n\n    Args:\n      value: A byte/bytearray/str value to encode. Byte object must not contain\n        zero bytes. String object must be convertible to ASCII.\n\n    Returns:\n      Offset of the encoded value in the underlying byte buffer.\n    \"\"\"\n    if isinstance(value, (bytes, bytearray)):\n      encoded = value\n    else:\n      encoded = value.encode('ascii')\n\n    if 0 in encoded:\n      raise ValueError('key contains zero byte')\n\n    loc = len(self._buf)\n    self._buf.extend(encoded)\n    self._buf.append(0)\n    if self._share_keys:\n      prev_loc = self._key_pool.FindOrInsert(encoded, loc)\n      if prev_loc is not None:\n        del self._buf[loc:]\n        loc = prev_loc\n\n    self._stack.append(Value.Key(loc))\n    return loc\n\n  def Null(self, key=None):\n    \"\"\"Encodes None value.\"\"\"\n    if key:\n      self.Key(key)\n    self._stack.append(Value.Null())\n\n  @InMap\n  def Bool(self, value):\n    \"\"\"Encodes boolean value.\n\n    Args:\n      value: A boolean value.\n    \"\"\"\n    self._stack.append(Value.Bool(value))\n\n  @InMap\n  def Int(self, value, byte_width=0):\n    \"\"\"Encodes signed integer value.\n\n    Args:\n      value: A signed integer value.\n      byte_width: Number of bytes to use: 1, 2, 4, or 8.\n    \"\"\"\n    bit_width = BitWidth.I(value) if byte_width == 0 else BitWidth.B(byte_width)\n    self._stack.append(Value.Int(value, bit_width))\n\n  @InMap\n  def IndirectInt(self, value, byte_width=0):\n    \"\"\"Encodes signed integer value indirectly.\n\n    Args:\n      value: A signed integer value.\n      byte_width: Number of bytes to use: 1, 2, 4, or 8.\n    \"\"\"\n    bit_width = BitWidth.I(value) if byte_width == 0 else BitWidth.B(byte_width)\n    self._PushIndirect(value, Type.INDIRECT_INT, bit_width)\n\n  @InMap\n  def UInt(self, value, byte_width=0):\n    \"\"\"Encodes unsigned integer value.\n\n    Args:\n      value: An unsigned integer value.\n      byte_width: Number of bytes to use: 1, 2, 4, or 8.\n    \"\"\"\n    bit_width = BitWidth.U(value) if byte_width == 0 else BitWidth.B(byte_width)\n    self._stack.append(Value.UInt(value, bit_width))\n\n  @InMap\n  def IndirectUInt(self, value, byte_width=0):\n    \"\"\"Encodes unsigned integer value indirectly.\n\n    Args:\n      value: An unsigned integer value.\n      byte_width: Number of bytes to use: 1, 2, 4, or 8.\n    \"\"\"\n    bit_width = BitWidth.U(value) if byte_width == 0 else BitWidth.B(byte_width)\n    self._PushIndirect(value, Type.INDIRECT_UINT, bit_width)\n\n  @InMap\n  def Float(self, value, byte_width=0):\n    \"\"\"Encodes floating point value.\n\n    Args:\n      value: A floating point value.\n      byte_width: Number of bytes to use: 4 or 8.\n    \"\"\"\n    bit_width = BitWidth.F(value) if byte_width == 0 else BitWidth.B(byte_width)\n    self._stack.append(Value.Float(value, bit_width))\n\n  @InMap\n  def IndirectFloat(self, value, byte_width=0):\n    \"\"\"Encodes floating point value indirectly.\n\n    Args:\n      value: A floating point value.\n      byte_width: Number of bytes to use: 4 or 8.\n    \"\"\"\n    bit_width = BitWidth.F(value) if byte_width == 0 else BitWidth.B(byte_width)\n    self._PushIndirect(value, Type.INDIRECT_FLOAT, bit_width)\n\n  def _StartVector(self):\n    \"\"\"Starts vector construction.\"\"\"\n    return len(self._stack)\n\n  def _EndVector(self, start, typed, fixed):\n    \"\"\"Finishes vector construction by encodung its elements.\"\"\"\n    vec = self._CreateVector(self._stack[start:], typed, fixed)\n    del self._stack[start:]\n    self._stack.append(vec)\n    return vec.Value\n\n  @contextlib.contextmanager\n  def Vector(self, key=None):\n    if key:\n      self.Key(key)\n\n    try:\n      start = self._StartVector()\n      yield self\n    finally:\n      self._EndVector(start, typed=False, fixed=False)\n\n  @InMap\n  def VectorFromElements(self, elements):\n    \"\"\"Encodes sequence of any elements as a vector.\n\n    Args:\n      elements: sequence of elements, they may have different types.\n    \"\"\"\n    with self.Vector():\n      for e in elements:\n        self.Add(e)\n\n  @contextlib.contextmanager\n  def TypedVector(self, key=None):\n    if key:\n      self.Key(key)\n\n    try:\n      start = self._StartVector()\n      yield self\n    finally:\n      self._EndVector(start, typed=True, fixed=False)\n\n  @InMap\n  def TypedVectorFromElements(self, elements, element_type=None):\n    \"\"\"Encodes sequence of elements of the same type as typed vector.\n\n    Args:\n      elements: Sequence of elements, they must be of the same type.\n      element_type: Suggested element type. Setting it to None means determining\n        correct value automatically based on the given elements.\n    \"\"\"\n    if isinstance(elements, array.array):\n      if elements.typecode == 'f':\n        self._WriteScalarVector(Type.FLOAT, 4, elements, fixed=False)\n      elif elements.typecode == 'd':\n        self._WriteScalarVector(Type.FLOAT, 8, elements, fixed=False)\n      elif elements.typecode in ('b', 'h', 'i', 'l', 'q'):\n        self._WriteScalarVector(\n            Type.INT, elements.itemsize, elements, fixed=False\n        )\n      elif elements.typecode in ('B', 'H', 'I', 'L', 'Q'):\n        self._WriteScalarVector(\n            Type.UINT, elements.itemsize, elements, fixed=False\n        )\n      else:\n        raise ValueError('unsupported array typecode: %s' % elements.typecode)\n    else:\n      add = self.Add if element_type is None else self.Adder(element_type)\n      with self.TypedVector():\n        for e in elements:\n          add(e)\n\n  @InMap\n  def FixedTypedVectorFromElements(\n      self, elements, element_type=None, byte_width=0\n  ):\n    \"\"\"Encodes sequence of elements of the same type as fixed typed vector.\n\n    Args:\n      elements: Sequence of elements, they must be of the same type. Allowed\n        types are `Type.INT`, `Type.UINT`, `Type.FLOAT`. Allowed number of\n        elements are 2, 3, or 4.\n      element_type: Suggested element type. Setting it to None means determining\n        correct value automatically based on the given elements.\n      byte_width: Number of bytes to use per element. For `Type.INT` and\n        `Type.UINT`: 1, 2, 4, or 8. For `Type.FLOAT`: 4 or 8. Setting it to 0\n        means determining correct value automatically based on the given\n        elements.\n    \"\"\"\n    if not 2 <= len(elements) <= 4:\n      raise ValueError('only 2, 3, or 4 elements are supported')\n\n    types = {type(e) for e in elements}\n    if len(types) != 1:\n      raise TypeError('all elements must be of the same type')\n\n    (type_,) = types\n\n    if element_type is None:\n      element_type = {int: Type.INT, float: Type.FLOAT}.get(type_)\n      if not element_type:\n        raise TypeError('unsupported element_type: %s' % type_)\n\n    if byte_width == 0:\n      width = {\n          Type.UINT: BitWidth.U,\n          Type.INT: BitWidth.I,\n          Type.FLOAT: BitWidth.F,\n      }[element_type]\n      byte_width = 1 << max(width(e) for e in elements)\n\n    self._WriteScalarVector(element_type, byte_width, elements, fixed=True)\n\n  def _StartMap(self):\n    \"\"\"Starts map construction.\"\"\"\n    return len(self._stack)\n\n  def _EndMap(self, start):\n    \"\"\"Finishes map construction by encodung its elements.\"\"\"\n    # Interleaved keys and values on the stack.\n    stack = self._stack[start:]\n\n    if len(stack) % 2 != 0:\n      raise RuntimeError('must be even number of keys and values')\n\n    for key in stack[::2]:\n      if key.Type is not Type.KEY:\n        raise RuntimeError('all map keys must be of %s type' % Type.KEY)\n\n    pairs = zip(stack[::2], stack[1::2])  # [(key, value), ...]\n    pairs = sorted(pairs, key=lambda pair: self._ReadKey(pair[0].Value))\n\n    del self._stack[start:]\n    for pair in pairs:\n      self._stack.extend(pair)\n\n    keys = self._CreateVector(self._stack[start::2], typed=True, fixed=False)\n    values = self._CreateVector(\n        self._stack[start + 1 :: 2], typed=False, fixed=False, keys=keys\n    )\n\n    del self._stack[start:]\n    self._stack.append(values)\n    return values.Value\n\n  @contextlib.contextmanager\n  def Map(self, key=None):\n    if key:\n      self.Key(key)\n\n    try:\n      start = self._StartMap()\n      yield self\n    finally:\n      self._EndMap(start)\n\n  def MapFromElements(self, elements):\n    start = self._StartMap()\n    for k, v in elements.items():\n      self.Key(k)\n      self.Add(v)\n    self._EndMap(start)\n\n  def Adder(self, type_):\n    return {\n        Type.BOOL: self.Bool,\n        Type.INT: self.Int,\n        Type.INDIRECT_INT: self.IndirectInt,\n        Type.UINT: self.UInt,\n        Type.INDIRECT_UINT: self.IndirectUInt,\n        Type.FLOAT: self.Float,\n        Type.INDIRECT_FLOAT: self.IndirectFloat,\n        Type.KEY: self.Key,\n        Type.BLOB: self.Blob,\n        Type.STRING: self.String,\n    }[type_]\n\n  @InMapForString\n  def Add(self, value):\n    \"\"\"Encodes value of any supported type.\"\"\"\n    if value is None:\n      self.Null()\n    elif isinstance(value, bool):\n      self.Bool(value)\n    elif isinstance(value, int):\n      self.Int(value)\n    elif isinstance(value, float):\n      self.Float(value)\n    elif isinstance(value, str):\n      self.String(value)\n    elif isinstance(value, (bytes, bytearray)):\n      self.Blob(value)\n    elif isinstance(value, dict):\n      with self.Map():\n        for k, v in value.items():\n          self.Key(k)\n          self.Add(v)\n    elif isinstance(value, array.array):\n      self.TypedVectorFromElements(value)\n    elif _IsIterable(value):\n      self.VectorFromElements(value)\n    else:\n      raise TypeError('unsupported python type: %s' % type(value))\n\n  @property\n  def LastValue(self):\n    return self._stack[-1]\n\n  @InMap\n  def ReuseValue(self, value):\n    self._stack.append(value)\n\n\ndef GetRoot(buf):\n  \"\"\"Returns root `Ref` object for the given buffer.\"\"\"\n  if len(buf) < 3:\n    raise ValueError('buffer is too small')\n  byte_width = buf[-1]\n  return Ref.PackedType(\n      Buf(buf, -(2 + byte_width)), byte_width, packed_type=buf[-2]\n  )\n\n\ndef Dumps(obj):\n  \"\"\"Returns bytearray with the encoded python object.\"\"\"\n  fbb = Builder()\n  fbb.Add(obj)\n  return fbb.Finish()\n\n\ndef Loads(buf):\n  \"\"\"Returns python object decoded from the buffer.\"\"\"\n  return GetRoot(buf).Value\n"
  },
  {
    "path": "python/flatbuffers/number_types.py",
    "content": "# Copyright 2014 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nimport collections\nimport struct\n\nfrom . import packer\nfrom .compat import NumpyRequiredForThisFeature, import_numpy\n\nnp = import_numpy()\n\n# For reference, see:\n# https://docs.python.org/2/library/ctypes.html#ctypes-fundamental-data-types-2\n\n# These classes could be collections.namedtuple instances, but those are new\n# in 2.6 and we want to work towards 2.5 compatability.\n\n\nclass BoolFlags(object):\n  bytewidth = 1\n  min_val = False\n  max_val = True\n  py_type = bool\n  name = \"bool\"\n  packer_type = packer.boolean\n\n\nclass Uint8Flags(object):\n  bytewidth = 1\n  min_val = 0\n  max_val = (2**8) - 1\n  py_type = int\n  name = \"uint8\"\n  packer_type = packer.uint8\n\n\nclass Uint16Flags(object):\n  bytewidth = 2\n  min_val = 0\n  max_val = (2**16) - 1\n  py_type = int\n  name = \"uint16\"\n  packer_type = packer.uint16\n\n\nclass Uint32Flags(object):\n  bytewidth = 4\n  min_val = 0\n  max_val = (2**32) - 1\n  py_type = int\n  name = \"uint32\"\n  packer_type = packer.uint32\n\n\nclass Uint64Flags(object):\n  bytewidth = 8\n  min_val = 0\n  max_val = (2**64) - 1\n  py_type = int\n  name = \"uint64\"\n  packer_type = packer.uint64\n\n\nclass Int8Flags(object):\n  bytewidth = 1\n  min_val = -(2**7)\n  max_val = (2**7) - 1\n  py_type = int\n  name = \"int8\"\n  packer_type = packer.int8\n\n\nclass Int16Flags(object):\n  bytewidth = 2\n  min_val = -(2**15)\n  max_val = (2**15) - 1\n  py_type = int\n  name = \"int16\"\n  packer_type = packer.int16\n\n\nclass Int32Flags(object):\n  bytewidth = 4\n  min_val = -(2**31)\n  max_val = (2**31) - 1\n  py_type = int\n  name = \"int32\"\n  packer_type = packer.int32\n\n\nclass Int64Flags(object):\n  bytewidth = 8\n  min_val = -(2**63)\n  max_val = (2**63) - 1\n  py_type = int\n  name = \"int64\"\n  packer_type = packer.int64\n\n\nclass Float32Flags(object):\n  bytewidth = 4\n  min_val = None\n  max_val = None\n  py_type = float\n  name = \"float32\"\n  packer_type = packer.float32\n\n\nclass Float64Flags(object):\n  bytewidth = 8\n  min_val = None\n  max_val = None\n  py_type = float\n  name = \"float64\"\n  packer_type = packer.float64\n\n\nclass SOffsetTFlags(Int32Flags):\n  pass\n\n\nclass UOffsetTFlags(Uint32Flags):\n  pass\n\n\nclass VOffsetTFlags(Uint16Flags):\n  pass\n\n\ndef valid_number(n, flags):\n  if flags.min_val is None and flags.max_val is None:\n    return True\n  return flags.min_val <= n <= flags.max_val\n\n\ndef enforce_number(n, flags):\n  if flags.min_val is None and flags.max_val is None:\n    return\n  if not flags.min_val <= n <= flags.max_val:\n    raise TypeError(\"bad number %s for type %s\" % (str(n), flags.name))\n\n\ndef float32_to_uint32(n):\n  packed = struct.pack(\"<1f\", n)\n  (converted,) = struct.unpack(\"<1L\", packed)\n  return converted\n\n\ndef uint32_to_float32(n):\n  packed = struct.pack(\"<1L\", n)\n  (unpacked,) = struct.unpack(\"<1f\", packed)\n  return unpacked\n\n\ndef float64_to_uint64(n):\n  packed = struct.pack(\"<1d\", n)\n  (converted,) = struct.unpack(\"<1Q\", packed)\n  return converted\n\n\ndef uint64_to_float64(n):\n  packed = struct.pack(\"<1Q\", n)\n  (unpacked,) = struct.unpack(\"<1d\", packed)\n  return unpacked\n\n\ndef to_numpy_type(number_type):\n  if np is not None:\n    return np.dtype(number_type.name).newbyteorder(\"<\")\n  else:\n    raise NumpyRequiredForThisFeature(\"Numpy was not found.\")\n"
  },
  {
    "path": "python/flatbuffers/packer.py",
    "content": "# Copyright 2016 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n\"\"\"Provide pre-compiled struct packers for encoding and decoding.\n\nSee: https://docs.python.org/2/library/struct.html#format-characters\n\"\"\"\n\nimport struct\nfrom . import compat\n\n\nboolean = struct.Struct(compat.struct_bool_decl)\n\nuint8 = struct.Struct(\"<B\")\nuint16 = struct.Struct(\"<H\")\nuint32 = struct.Struct(\"<I\")\nuint64 = struct.Struct(\"<Q\")\n\nint8 = struct.Struct(\"<b\")\nint16 = struct.Struct(\"<h\")\nint32 = struct.Struct(\"<i\")\nint64 = struct.Struct(\"<q\")\n\nfloat32 = struct.Struct(\"<f\")\nfloat64 = struct.Struct(\"<d\")\n\nuoffset = uint32\nsoffset = int32\nvoffset = uint16\n"
  },
  {
    "path": "python/flatbuffers/reflection/AdvancedFeatures.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: reflection\n\n# New schema language features that are not supported by old code generators.\nclass AdvancedFeatures(object):\n    AdvancedArrayFeatures = 1\n    AdvancedUnionFeatures = 2\n    OptionalScalars = 4\n    DefaultVectorsAndStrings = 8\n"
  },
  {
    "path": "python/flatbuffers/reflection/BaseType.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: reflection\n\nclass BaseType(object):\n    None_ = 0\n    UType = 1\n    Bool = 2\n    Byte = 3\n    UByte = 4\n    Short = 5\n    UShort = 6\n    Int = 7\n    UInt = 8\n    Long = 9\n    ULong = 10\n    Float = 11\n    Double = 12\n    String = 13\n    Vector = 14\n    Obj = 15\n    Union = 16\n    Array = 17\n    Vector64 = 18\n    MaxBaseType = 19\n"
  },
  {
    "path": "python/flatbuffers/reflection/Enum.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: reflection\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\nclass Enum(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = Enum()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsEnum(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    @classmethod\n    def EnumBufferHasIdentifier(cls, buf, offset, size_prefixed=False):\n        return flatbuffers.util.BufferHasIdentifier(buf, offset, b\"\\x42\\x46\\x42\\x53\", size_prefixed=size_prefixed)\n\n    # Enum\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # Enum\n    def Name(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.String(o + self._tab.Pos)\n        return None\n\n    # Enum\n    def Values(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        if o != 0:\n            x = self._tab.Vector(o)\n            x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4\n            x = self._tab.Indirect(x)\n            from reflection.EnumVal import EnumVal\n            obj = EnumVal()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Enum\n    def ValuesLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Enum\n    def ValuesIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        return o == 0\n\n    # Enum\n    def IsUnion(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))\n        if o != 0:\n            return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos))\n        return False\n\n    # Enum\n    def UnderlyingType(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10))\n        if o != 0:\n            x = self._tab.Indirect(o + self._tab.Pos)\n            from reflection.Type import Type\n            obj = Type()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Enum\n    def Attributes(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))\n        if o != 0:\n            x = self._tab.Vector(o)\n            x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4\n            x = self._tab.Indirect(x)\n            from reflection.KeyValue import KeyValue\n            obj = KeyValue()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Enum\n    def AttributesLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Enum\n    def AttributesIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))\n        return o == 0\n\n    # Enum\n    def Documentation(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.String(a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4))\n        return \"\"\n\n    # Enum\n    def DocumentationLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Enum\n    def DocumentationIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))\n        return o == 0\n\n    # File that this Enum is declared in.\n    # Enum\n    def DeclarationFile(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16))\n        if o != 0:\n            return self._tab.String(o + self._tab.Pos)\n        return None\n\ndef EnumStart(builder):\n    builder.StartObject(7)\n\ndef Start(builder):\n    EnumStart(builder)\n\ndef EnumAddName(builder, name):\n    builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(name), 0)\n\ndef AddName(builder, name):\n    EnumAddName(builder, name)\n\ndef EnumAddValues(builder, values):\n    builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(values), 0)\n\ndef AddValues(builder, values):\n    EnumAddValues(builder, values)\n\ndef EnumStartValuesVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef StartValuesVector(builder, numElems):\n    return EnumStartValuesVector(builder, numElems)\n\ndef EnumCreateValuesVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef CreateValuesVector(builder, data):\n    return EnumCreateValuesVector(builder, data)\n\ndef EnumAddIsUnion(builder, isUnion):\n    builder.PrependBoolSlot(2, isUnion, 0)\n\ndef AddIsUnion(builder, isUnion):\n    EnumAddIsUnion(builder, isUnion)\n\ndef EnumAddUnderlyingType(builder, underlyingType):\n    builder.PrependUOffsetTRelativeSlot(3, flatbuffers.number_types.UOffsetTFlags.py_type(underlyingType), 0)\n\ndef AddUnderlyingType(builder, underlyingType):\n    EnumAddUnderlyingType(builder, underlyingType)\n\ndef EnumAddAttributes(builder, attributes):\n    builder.PrependUOffsetTRelativeSlot(4, flatbuffers.number_types.UOffsetTFlags.py_type(attributes), 0)\n\ndef AddAttributes(builder, attributes):\n    EnumAddAttributes(builder, attributes)\n\ndef EnumStartAttributesVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef StartAttributesVector(builder, numElems):\n    return EnumStartAttributesVector(builder, numElems)\n\ndef EnumCreateAttributesVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef CreateAttributesVector(builder, data):\n    return EnumCreateAttributesVector(builder, data)\n\ndef EnumAddDocumentation(builder, documentation):\n    builder.PrependUOffsetTRelativeSlot(5, flatbuffers.number_types.UOffsetTFlags.py_type(documentation), 0)\n\ndef AddDocumentation(builder, documentation):\n    EnumAddDocumentation(builder, documentation)\n\ndef EnumStartDocumentationVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef StartDocumentationVector(builder, numElems):\n    return EnumStartDocumentationVector(builder, numElems)\n\ndef EnumCreateDocumentationVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef CreateDocumentationVector(builder, data):\n    return EnumCreateDocumentationVector(builder, data)\n\ndef EnumAddDeclarationFile(builder, declarationFile):\n    builder.PrependUOffsetTRelativeSlot(6, flatbuffers.number_types.UOffsetTFlags.py_type(declarationFile), 0)\n\ndef AddDeclarationFile(builder, declarationFile):\n    EnumAddDeclarationFile(builder, declarationFile)\n\ndef EnumEnd(builder):\n    return builder.EndObject()\n\ndef End(builder):\n    return EnumEnd(builder)\n"
  },
  {
    "path": "python/flatbuffers/reflection/EnumVal.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: reflection\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\nclass EnumVal(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = EnumVal()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsEnumVal(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    @classmethod\n    def EnumValBufferHasIdentifier(cls, buf, offset, size_prefixed=False):\n        return flatbuffers.util.BufferHasIdentifier(buf, offset, b\"\\x42\\x46\\x42\\x53\", size_prefixed=size_prefixed)\n\n    # EnumVal\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # EnumVal\n    def Name(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.String(o + self._tab.Pos)\n        return None\n\n    # EnumVal\n    def Value(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int64Flags, o + self._tab.Pos)\n        return 0\n\n    # EnumVal\n    def UnionType(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10))\n        if o != 0:\n            x = self._tab.Indirect(o + self._tab.Pos)\n            from reflection.Type import Type\n            obj = Type()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # EnumVal\n    def Documentation(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.String(a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4))\n        return \"\"\n\n    # EnumVal\n    def DocumentationLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # EnumVal\n    def DocumentationIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))\n        return o == 0\n\n    # EnumVal\n    def Attributes(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))\n        if o != 0:\n            x = self._tab.Vector(o)\n            x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4\n            x = self._tab.Indirect(x)\n            from reflection.KeyValue import KeyValue\n            obj = KeyValue()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # EnumVal\n    def AttributesLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # EnumVal\n    def AttributesIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))\n        return o == 0\n\ndef EnumValStart(builder):\n    builder.StartObject(6)\n\ndef Start(builder):\n    EnumValStart(builder)\n\ndef EnumValAddName(builder, name):\n    builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(name), 0)\n\ndef AddName(builder, name):\n    EnumValAddName(builder, name)\n\ndef EnumValAddValue(builder, value):\n    builder.PrependInt64Slot(1, value, 0)\n\ndef AddValue(builder, value):\n    EnumValAddValue(builder, value)\n\ndef EnumValAddUnionType(builder, unionType):\n    builder.PrependUOffsetTRelativeSlot(3, flatbuffers.number_types.UOffsetTFlags.py_type(unionType), 0)\n\ndef AddUnionType(builder, unionType):\n    EnumValAddUnionType(builder, unionType)\n\ndef EnumValAddDocumentation(builder, documentation):\n    builder.PrependUOffsetTRelativeSlot(4, flatbuffers.number_types.UOffsetTFlags.py_type(documentation), 0)\n\ndef AddDocumentation(builder, documentation):\n    EnumValAddDocumentation(builder, documentation)\n\ndef EnumValStartDocumentationVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef StartDocumentationVector(builder, numElems):\n    return EnumValStartDocumentationVector(builder, numElems)\n\ndef EnumValCreateDocumentationVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef CreateDocumentationVector(builder, data):\n    return EnumValCreateDocumentationVector(builder, data)\n\ndef EnumValAddAttributes(builder, attributes):\n    builder.PrependUOffsetTRelativeSlot(5, flatbuffers.number_types.UOffsetTFlags.py_type(attributes), 0)\n\ndef AddAttributes(builder, attributes):\n    EnumValAddAttributes(builder, attributes)\n\ndef EnumValStartAttributesVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef StartAttributesVector(builder, numElems):\n    return EnumValStartAttributesVector(builder, numElems)\n\ndef EnumValCreateAttributesVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef CreateAttributesVector(builder, data):\n    return EnumValCreateAttributesVector(builder, data)\n\ndef EnumValEnd(builder):\n    return builder.EndObject()\n\ndef End(builder):\n    return EnumValEnd(builder)\n"
  },
  {
    "path": "python/flatbuffers/reflection/Field.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: reflection\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\nclass Field(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = Field()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsField(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    @classmethod\n    def FieldBufferHasIdentifier(cls, buf, offset, size_prefixed=False):\n        return flatbuffers.util.BufferHasIdentifier(buf, offset, b\"\\x42\\x46\\x42\\x53\", size_prefixed=size_prefixed)\n\n    # Field\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # Field\n    def Name(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.String(o + self._tab.Pos)\n        return None\n\n    # Field\n    def Type(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        if o != 0:\n            x = self._tab.Indirect(o + self._tab.Pos)\n            from reflection.Type import Type\n            obj = Type()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Field\n    def Id(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint16Flags, o + self._tab.Pos)\n        return 0\n\n    # Field\n    def Offset(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint16Flags, o + self._tab.Pos)\n        return 0\n\n    # Field\n    def DefaultInteger(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int64Flags, o + self._tab.Pos)\n        return 0\n\n    # Field\n    def DefaultReal(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float64Flags, o + self._tab.Pos)\n        return 0.0\n\n    # Field\n    def Deprecated(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16))\n        if o != 0:\n            return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos))\n        return False\n\n    # Field\n    def Required(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(18))\n        if o != 0:\n            return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos))\n        return False\n\n    # Field\n    def Key(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(20))\n        if o != 0:\n            return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos))\n        return False\n\n    # Field\n    def Attributes(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(22))\n        if o != 0:\n            x = self._tab.Vector(o)\n            x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4\n            x = self._tab.Indirect(x)\n            from reflection.KeyValue import KeyValue\n            obj = KeyValue()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Field\n    def AttributesLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(22))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Field\n    def AttributesIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(22))\n        return o == 0\n\n    # Field\n    def Documentation(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(24))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.String(a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4))\n        return \"\"\n\n    # Field\n    def DocumentationLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(24))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Field\n    def DocumentationIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(24))\n        return o == 0\n\n    # Field\n    def Optional(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(26))\n        if o != 0:\n            return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos))\n        return False\n\n    # Number of padding octets to always add after this field. Structs only.\n    # Field\n    def Padding(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(28))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint16Flags, o + self._tab.Pos)\n        return 0\n\n    # If the field uses 64-bit offsets.\n    # Field\n    def Offset64(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(30))\n        if o != 0:\n            return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos))\n        return False\n\ndef FieldStart(builder):\n    builder.StartObject(14)\n\ndef Start(builder):\n    FieldStart(builder)\n\ndef FieldAddName(builder, name):\n    builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(name), 0)\n\ndef AddName(builder, name):\n    FieldAddName(builder, name)\n\ndef FieldAddType(builder, type):\n    builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(type), 0)\n\ndef AddType(builder, type):\n    FieldAddType(builder, type)\n\ndef FieldAddId(builder, id):\n    builder.PrependUint16Slot(2, id, 0)\n\ndef AddId(builder, id):\n    FieldAddId(builder, id)\n\ndef FieldAddOffset(builder, offset):\n    builder.PrependUint16Slot(3, offset, 0)\n\ndef AddOffset(builder, offset):\n    FieldAddOffset(builder, offset)\n\ndef FieldAddDefaultInteger(builder, defaultInteger):\n    builder.PrependInt64Slot(4, defaultInteger, 0)\n\ndef AddDefaultInteger(builder, defaultInteger):\n    FieldAddDefaultInteger(builder, defaultInteger)\n\ndef FieldAddDefaultReal(builder, defaultReal):\n    builder.PrependFloat64Slot(5, defaultReal, 0.0)\n\ndef AddDefaultReal(builder, defaultReal):\n    FieldAddDefaultReal(builder, defaultReal)\n\ndef FieldAddDeprecated(builder, deprecated):\n    builder.PrependBoolSlot(6, deprecated, 0)\n\ndef AddDeprecated(builder, deprecated):\n    FieldAddDeprecated(builder, deprecated)\n\ndef FieldAddRequired(builder, required):\n    builder.PrependBoolSlot(7, required, 0)\n\ndef AddRequired(builder, required):\n    FieldAddRequired(builder, required)\n\ndef FieldAddKey(builder, key):\n    builder.PrependBoolSlot(8, key, 0)\n\ndef AddKey(builder, key):\n    FieldAddKey(builder, key)\n\ndef FieldAddAttributes(builder, attributes):\n    builder.PrependUOffsetTRelativeSlot(9, flatbuffers.number_types.UOffsetTFlags.py_type(attributes), 0)\n\ndef AddAttributes(builder, attributes):\n    FieldAddAttributes(builder, attributes)\n\ndef FieldStartAttributesVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef StartAttributesVector(builder, numElems):\n    return FieldStartAttributesVector(builder, numElems)\n\ndef FieldCreateAttributesVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef CreateAttributesVector(builder, data):\n    return FieldCreateAttributesVector(builder, data)\n\ndef FieldAddDocumentation(builder, documentation):\n    builder.PrependUOffsetTRelativeSlot(10, flatbuffers.number_types.UOffsetTFlags.py_type(documentation), 0)\n\ndef AddDocumentation(builder, documentation):\n    FieldAddDocumentation(builder, documentation)\n\ndef FieldStartDocumentationVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef StartDocumentationVector(builder, numElems):\n    return FieldStartDocumentationVector(builder, numElems)\n\ndef FieldCreateDocumentationVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef CreateDocumentationVector(builder, data):\n    return FieldCreateDocumentationVector(builder, data)\n\ndef FieldAddOptional(builder, optional):\n    builder.PrependBoolSlot(11, optional, 0)\n\ndef AddOptional(builder, optional):\n    FieldAddOptional(builder, optional)\n\ndef FieldAddPadding(builder, padding):\n    builder.PrependUint16Slot(12, padding, 0)\n\ndef AddPadding(builder, padding):\n    FieldAddPadding(builder, padding)\n\ndef FieldAddOffset64(builder, offset64):\n    builder.PrependBoolSlot(13, offset64, 0)\n\ndef AddOffset64(builder, offset64):\n    FieldAddOffset64(builder, offset64)\n\ndef FieldEnd(builder):\n    return builder.EndObject()\n\ndef End(builder):\n    return FieldEnd(builder)\n"
  },
  {
    "path": "python/flatbuffers/reflection/KeyValue.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: reflection\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\nclass KeyValue(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = KeyValue()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsKeyValue(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    @classmethod\n    def KeyValueBufferHasIdentifier(cls, buf, offset, size_prefixed=False):\n        return flatbuffers.util.BufferHasIdentifier(buf, offset, b\"\\x42\\x46\\x42\\x53\", size_prefixed=size_prefixed)\n\n    # KeyValue\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # KeyValue\n    def Key(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.String(o + self._tab.Pos)\n        return None\n\n    # KeyValue\n    def Value(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        if o != 0:\n            return self._tab.String(o + self._tab.Pos)\n        return None\n\ndef KeyValueStart(builder):\n    builder.StartObject(2)\n\ndef Start(builder):\n    KeyValueStart(builder)\n\ndef KeyValueAddKey(builder, key):\n    builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(key), 0)\n\ndef AddKey(builder, key):\n    KeyValueAddKey(builder, key)\n\ndef KeyValueAddValue(builder, value):\n    builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(value), 0)\n\ndef AddValue(builder, value):\n    KeyValueAddValue(builder, value)\n\ndef KeyValueEnd(builder):\n    return builder.EndObject()\n\ndef End(builder):\n    return KeyValueEnd(builder)\n"
  },
  {
    "path": "python/flatbuffers/reflection/Object.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: reflection\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\nclass Object(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = Object()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsObject(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    @classmethod\n    def ObjectBufferHasIdentifier(cls, buf, offset, size_prefixed=False):\n        return flatbuffers.util.BufferHasIdentifier(buf, offset, b\"\\x42\\x46\\x42\\x53\", size_prefixed=size_prefixed)\n\n    # Object\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # Object\n    def Name(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.String(o + self._tab.Pos)\n        return None\n\n    # Object\n    def Fields(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        if o != 0:\n            x = self._tab.Vector(o)\n            x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4\n            x = self._tab.Indirect(x)\n            from reflection.Field import Field\n            obj = Field()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Object\n    def FieldsLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Object\n    def FieldsIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        return o == 0\n\n    # Object\n    def IsStruct(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))\n        if o != 0:\n            return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos))\n        return False\n\n    # Object\n    def Minalign(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos)\n        return 0\n\n    # Object\n    def Bytesize(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos)\n        return 0\n\n    # Object\n    def Attributes(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))\n        if o != 0:\n            x = self._tab.Vector(o)\n            x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4\n            x = self._tab.Indirect(x)\n            from reflection.KeyValue import KeyValue\n            obj = KeyValue()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Object\n    def AttributesLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Object\n    def AttributesIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))\n        return o == 0\n\n    # Object\n    def Documentation(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.String(a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4))\n        return \"\"\n\n    # Object\n    def DocumentationLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Object\n    def DocumentationIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16))\n        return o == 0\n\n    # File that this Object is declared in.\n    # Object\n    def DeclarationFile(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(18))\n        if o != 0:\n            return self._tab.String(o + self._tab.Pos)\n        return None\n\ndef ObjectStart(builder):\n    builder.StartObject(8)\n\ndef Start(builder):\n    ObjectStart(builder)\n\ndef ObjectAddName(builder, name):\n    builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(name), 0)\n\ndef AddName(builder, name):\n    ObjectAddName(builder, name)\n\ndef ObjectAddFields(builder, fields):\n    builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(fields), 0)\n\ndef AddFields(builder, fields):\n    ObjectAddFields(builder, fields)\n\ndef ObjectStartFieldsVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef StartFieldsVector(builder, numElems):\n    return ObjectStartFieldsVector(builder, numElems)\n\ndef ObjectCreateFieldsVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef CreateFieldsVector(builder, data):\n    return ObjectCreateFieldsVector(builder, data)\n\ndef ObjectAddIsStruct(builder, isStruct):\n    builder.PrependBoolSlot(2, isStruct, 0)\n\ndef AddIsStruct(builder, isStruct):\n    ObjectAddIsStruct(builder, isStruct)\n\ndef ObjectAddMinalign(builder, minalign):\n    builder.PrependInt32Slot(3, minalign, 0)\n\ndef AddMinalign(builder, minalign):\n    ObjectAddMinalign(builder, minalign)\n\ndef ObjectAddBytesize(builder, bytesize):\n    builder.PrependInt32Slot(4, bytesize, 0)\n\ndef AddBytesize(builder, bytesize):\n    ObjectAddBytesize(builder, bytesize)\n\ndef ObjectAddAttributes(builder, attributes):\n    builder.PrependUOffsetTRelativeSlot(5, flatbuffers.number_types.UOffsetTFlags.py_type(attributes), 0)\n\ndef AddAttributes(builder, attributes):\n    ObjectAddAttributes(builder, attributes)\n\ndef ObjectStartAttributesVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef StartAttributesVector(builder, numElems):\n    return ObjectStartAttributesVector(builder, numElems)\n\ndef ObjectCreateAttributesVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef CreateAttributesVector(builder, data):\n    return ObjectCreateAttributesVector(builder, data)\n\ndef ObjectAddDocumentation(builder, documentation):\n    builder.PrependUOffsetTRelativeSlot(6, flatbuffers.number_types.UOffsetTFlags.py_type(documentation), 0)\n\ndef AddDocumentation(builder, documentation):\n    ObjectAddDocumentation(builder, documentation)\n\ndef ObjectStartDocumentationVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef StartDocumentationVector(builder, numElems):\n    return ObjectStartDocumentationVector(builder, numElems)\n\ndef ObjectCreateDocumentationVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef CreateDocumentationVector(builder, data):\n    return ObjectCreateDocumentationVector(builder, data)\n\ndef ObjectAddDeclarationFile(builder, declarationFile):\n    builder.PrependUOffsetTRelativeSlot(7, flatbuffers.number_types.UOffsetTFlags.py_type(declarationFile), 0)\n\ndef AddDeclarationFile(builder, declarationFile):\n    ObjectAddDeclarationFile(builder, declarationFile)\n\ndef ObjectEnd(builder):\n    return builder.EndObject()\n\ndef End(builder):\n    return ObjectEnd(builder)\n"
  },
  {
    "path": "python/flatbuffers/reflection/RPCCall.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: reflection\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\nclass RPCCall(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = RPCCall()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsRPCCall(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    @classmethod\n    def RPCCallBufferHasIdentifier(cls, buf, offset, size_prefixed=False):\n        return flatbuffers.util.BufferHasIdentifier(buf, offset, b\"\\x42\\x46\\x42\\x53\", size_prefixed=size_prefixed)\n\n    # RPCCall\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # RPCCall\n    def Name(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.String(o + self._tab.Pos)\n        return None\n\n    # RPCCall\n    def Request(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        if o != 0:\n            x = self._tab.Indirect(o + self._tab.Pos)\n            from reflection.Object import Object\n            obj = Object()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # RPCCall\n    def Response(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))\n        if o != 0:\n            x = self._tab.Indirect(o + self._tab.Pos)\n            from reflection.Object import Object\n            obj = Object()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # RPCCall\n    def Attributes(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10))\n        if o != 0:\n            x = self._tab.Vector(o)\n            x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4\n            x = self._tab.Indirect(x)\n            from reflection.KeyValue import KeyValue\n            obj = KeyValue()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # RPCCall\n    def AttributesLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # RPCCall\n    def AttributesIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10))\n        return o == 0\n\n    # RPCCall\n    def Documentation(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.String(a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4))\n        return \"\"\n\n    # RPCCall\n    def DocumentationLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # RPCCall\n    def DocumentationIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))\n        return o == 0\n\ndef RPCCallStart(builder):\n    builder.StartObject(5)\n\ndef Start(builder):\n    RPCCallStart(builder)\n\ndef RPCCallAddName(builder, name):\n    builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(name), 0)\n\ndef AddName(builder, name):\n    RPCCallAddName(builder, name)\n\ndef RPCCallAddRequest(builder, request):\n    builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(request), 0)\n\ndef AddRequest(builder, request):\n    RPCCallAddRequest(builder, request)\n\ndef RPCCallAddResponse(builder, response):\n    builder.PrependUOffsetTRelativeSlot(2, flatbuffers.number_types.UOffsetTFlags.py_type(response), 0)\n\ndef AddResponse(builder, response):\n    RPCCallAddResponse(builder, response)\n\ndef RPCCallAddAttributes(builder, attributes):\n    builder.PrependUOffsetTRelativeSlot(3, flatbuffers.number_types.UOffsetTFlags.py_type(attributes), 0)\n\ndef AddAttributes(builder, attributes):\n    RPCCallAddAttributes(builder, attributes)\n\ndef RPCCallStartAttributesVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef StartAttributesVector(builder, numElems):\n    return RPCCallStartAttributesVector(builder, numElems)\n\ndef RPCCallCreateAttributesVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef CreateAttributesVector(builder, data):\n    return RPCCallCreateAttributesVector(builder, data)\n\ndef RPCCallAddDocumentation(builder, documentation):\n    builder.PrependUOffsetTRelativeSlot(4, flatbuffers.number_types.UOffsetTFlags.py_type(documentation), 0)\n\ndef AddDocumentation(builder, documentation):\n    RPCCallAddDocumentation(builder, documentation)\n\ndef RPCCallStartDocumentationVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef StartDocumentationVector(builder, numElems):\n    return RPCCallStartDocumentationVector(builder, numElems)\n\ndef RPCCallCreateDocumentationVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef CreateDocumentationVector(builder, data):\n    return RPCCallCreateDocumentationVector(builder, data)\n\ndef RPCCallEnd(builder):\n    return builder.EndObject()\n\ndef End(builder):\n    return RPCCallEnd(builder)\n"
  },
  {
    "path": "python/flatbuffers/reflection/Schema.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: reflection\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\nclass Schema(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = Schema()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsSchema(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    @classmethod\n    def SchemaBufferHasIdentifier(cls, buf, offset, size_prefixed=False):\n        return flatbuffers.util.BufferHasIdentifier(buf, offset, b\"\\x42\\x46\\x42\\x53\", size_prefixed=size_prefixed)\n\n    # Schema\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # Schema\n    def Objects(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            x = self._tab.Vector(o)\n            x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4\n            x = self._tab.Indirect(x)\n            from reflection.Object import Object\n            obj = Object()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Schema\n    def ObjectsLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Schema\n    def ObjectsIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        return o == 0\n\n    # Schema\n    def Enums(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        if o != 0:\n            x = self._tab.Vector(o)\n            x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4\n            x = self._tab.Indirect(x)\n            from reflection.Enum import Enum\n            obj = Enum()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Schema\n    def EnumsLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Schema\n    def EnumsIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        return o == 0\n\n    # Schema\n    def FileIdent(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))\n        if o != 0:\n            return self._tab.String(o + self._tab.Pos)\n        return None\n\n    # Schema\n    def FileExt(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10))\n        if o != 0:\n            return self._tab.String(o + self._tab.Pos)\n        return None\n\n    # Schema\n    def RootTable(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))\n        if o != 0:\n            x = self._tab.Indirect(o + self._tab.Pos)\n            from reflection.Object import Object\n            obj = Object()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Schema\n    def Services(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))\n        if o != 0:\n            x = self._tab.Vector(o)\n            x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4\n            x = self._tab.Indirect(x)\n            from reflection.Service import Service\n            obj = Service()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Schema\n    def ServicesLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Schema\n    def ServicesIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))\n        return o == 0\n\n    # Schema\n    def AdvancedFeatures(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos)\n        return 0\n\n    # All the files used in this compilation. Files are relative to where\n    # flatc was invoked.\n    # Schema\n    def FbsFiles(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(18))\n        if o != 0:\n            x = self._tab.Vector(o)\n            x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4\n            x = self._tab.Indirect(x)\n            from reflection.SchemaFile import SchemaFile\n            obj = SchemaFile()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Schema\n    def FbsFilesLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(18))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Schema\n    def FbsFilesIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(18))\n        return o == 0\n\ndef SchemaStart(builder):\n    builder.StartObject(8)\n\ndef Start(builder):\n    SchemaStart(builder)\n\ndef SchemaAddObjects(builder, objects):\n    builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(objects), 0)\n\ndef AddObjects(builder, objects):\n    SchemaAddObjects(builder, objects)\n\ndef SchemaStartObjectsVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef StartObjectsVector(builder, numElems):\n    return SchemaStartObjectsVector(builder, numElems)\n\ndef SchemaCreateObjectsVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef CreateObjectsVector(builder, data):\n    return SchemaCreateObjectsVector(builder, data)\n\ndef SchemaAddEnums(builder, enums):\n    builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(enums), 0)\n\ndef AddEnums(builder, enums):\n    SchemaAddEnums(builder, enums)\n\ndef SchemaStartEnumsVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef StartEnumsVector(builder, numElems):\n    return SchemaStartEnumsVector(builder, numElems)\n\ndef SchemaCreateEnumsVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef CreateEnumsVector(builder, data):\n    return SchemaCreateEnumsVector(builder, data)\n\ndef SchemaAddFileIdent(builder, fileIdent):\n    builder.PrependUOffsetTRelativeSlot(2, flatbuffers.number_types.UOffsetTFlags.py_type(fileIdent), 0)\n\ndef AddFileIdent(builder, fileIdent):\n    SchemaAddFileIdent(builder, fileIdent)\n\ndef SchemaAddFileExt(builder, fileExt):\n    builder.PrependUOffsetTRelativeSlot(3, flatbuffers.number_types.UOffsetTFlags.py_type(fileExt), 0)\n\ndef AddFileExt(builder, fileExt):\n    SchemaAddFileExt(builder, fileExt)\n\ndef SchemaAddRootTable(builder, rootTable):\n    builder.PrependUOffsetTRelativeSlot(4, flatbuffers.number_types.UOffsetTFlags.py_type(rootTable), 0)\n\ndef AddRootTable(builder, rootTable):\n    SchemaAddRootTable(builder, rootTable)\n\ndef SchemaAddServices(builder, services):\n    builder.PrependUOffsetTRelativeSlot(5, flatbuffers.number_types.UOffsetTFlags.py_type(services), 0)\n\ndef AddServices(builder, services):\n    SchemaAddServices(builder, services)\n\ndef SchemaStartServicesVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef StartServicesVector(builder, numElems):\n    return SchemaStartServicesVector(builder, numElems)\n\ndef SchemaCreateServicesVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef CreateServicesVector(builder, data):\n    return SchemaCreateServicesVector(builder, data)\n\ndef SchemaAddAdvancedFeatures(builder, advancedFeatures):\n    builder.PrependUint64Slot(6, advancedFeatures, 0)\n\ndef AddAdvancedFeatures(builder, advancedFeatures):\n    SchemaAddAdvancedFeatures(builder, advancedFeatures)\n\ndef SchemaAddFbsFiles(builder, fbsFiles):\n    builder.PrependUOffsetTRelativeSlot(7, flatbuffers.number_types.UOffsetTFlags.py_type(fbsFiles), 0)\n\ndef AddFbsFiles(builder, fbsFiles):\n    SchemaAddFbsFiles(builder, fbsFiles)\n\ndef SchemaStartFbsFilesVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef StartFbsFilesVector(builder, numElems):\n    return SchemaStartFbsFilesVector(builder, numElems)\n\ndef SchemaCreateFbsFilesVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef CreateFbsFilesVector(builder, data):\n    return SchemaCreateFbsFilesVector(builder, data)\n\ndef SchemaEnd(builder):\n    return builder.EndObject()\n\ndef End(builder):\n    return SchemaEnd(builder)\n"
  },
  {
    "path": "python/flatbuffers/reflection/SchemaFile.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: reflection\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\n# File specific information.\n# Symbols declared within a file may be recovered by iterating over all\n# symbols and examining the `declaration_file` field.\nclass SchemaFile(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = SchemaFile()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsSchemaFile(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    @classmethod\n    def SchemaFileBufferHasIdentifier(cls, buf, offset, size_prefixed=False):\n        return flatbuffers.util.BufferHasIdentifier(buf, offset, b\"\\x42\\x46\\x42\\x53\", size_prefixed=size_prefixed)\n\n    # SchemaFile\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # Filename, relative to project root.\n    # SchemaFile\n    def Filename(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.String(o + self._tab.Pos)\n        return None\n\n    # Names of included files, relative to project root.\n    # SchemaFile\n    def IncludedFilenames(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.String(a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4))\n        return \"\"\n\n    # SchemaFile\n    def IncludedFilenamesLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # SchemaFile\n    def IncludedFilenamesIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        return o == 0\n\ndef SchemaFileStart(builder):\n    builder.StartObject(2)\n\ndef Start(builder):\n    SchemaFileStart(builder)\n\ndef SchemaFileAddFilename(builder, filename):\n    builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(filename), 0)\n\ndef AddFilename(builder, filename):\n    SchemaFileAddFilename(builder, filename)\n\ndef SchemaFileAddIncludedFilenames(builder, includedFilenames):\n    builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(includedFilenames), 0)\n\ndef AddIncludedFilenames(builder, includedFilenames):\n    SchemaFileAddIncludedFilenames(builder, includedFilenames)\n\ndef SchemaFileStartIncludedFilenamesVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef StartIncludedFilenamesVector(builder, numElems):\n    return SchemaFileStartIncludedFilenamesVector(builder, numElems)\n\ndef SchemaFileCreateIncludedFilenamesVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef CreateIncludedFilenamesVector(builder, data):\n    return SchemaFileCreateIncludedFilenamesVector(builder, data)\n\ndef SchemaFileEnd(builder):\n    return builder.EndObject()\n\ndef End(builder):\n    return SchemaFileEnd(builder)\n"
  },
  {
    "path": "python/flatbuffers/reflection/Service.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: reflection\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\nclass Service(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = Service()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsService(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    @classmethod\n    def ServiceBufferHasIdentifier(cls, buf, offset, size_prefixed=False):\n        return flatbuffers.util.BufferHasIdentifier(buf, offset, b\"\\x42\\x46\\x42\\x53\", size_prefixed=size_prefixed)\n\n    # Service\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # Service\n    def Name(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.String(o + self._tab.Pos)\n        return None\n\n    # Service\n    def Calls(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        if o != 0:\n            x = self._tab.Vector(o)\n            x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4\n            x = self._tab.Indirect(x)\n            from reflection.RPCCall import RPCCall\n            obj = RPCCall()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Service\n    def CallsLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Service\n    def CallsIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        return o == 0\n\n    # Service\n    def Attributes(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))\n        if o != 0:\n            x = self._tab.Vector(o)\n            x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4\n            x = self._tab.Indirect(x)\n            from reflection.KeyValue import KeyValue\n            obj = KeyValue()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Service\n    def AttributesLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Service\n    def AttributesIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))\n        return o == 0\n\n    # Service\n    def Documentation(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.String(a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4))\n        return \"\"\n\n    # Service\n    def DocumentationLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Service\n    def DocumentationIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10))\n        return o == 0\n\n    # File that this Service is declared in.\n    # Service\n    def DeclarationFile(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))\n        if o != 0:\n            return self._tab.String(o + self._tab.Pos)\n        return None\n\ndef ServiceStart(builder):\n    builder.StartObject(5)\n\ndef Start(builder):\n    ServiceStart(builder)\n\ndef ServiceAddName(builder, name):\n    builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(name), 0)\n\ndef AddName(builder, name):\n    ServiceAddName(builder, name)\n\ndef ServiceAddCalls(builder, calls):\n    builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(calls), 0)\n\ndef AddCalls(builder, calls):\n    ServiceAddCalls(builder, calls)\n\ndef ServiceStartCallsVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef StartCallsVector(builder, numElems):\n    return ServiceStartCallsVector(builder, numElems)\n\ndef ServiceCreateCallsVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef CreateCallsVector(builder, data):\n    return ServiceCreateCallsVector(builder, data)\n\ndef ServiceAddAttributes(builder, attributes):\n    builder.PrependUOffsetTRelativeSlot(2, flatbuffers.number_types.UOffsetTFlags.py_type(attributes), 0)\n\ndef AddAttributes(builder, attributes):\n    ServiceAddAttributes(builder, attributes)\n\ndef ServiceStartAttributesVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef StartAttributesVector(builder, numElems):\n    return ServiceStartAttributesVector(builder, numElems)\n\ndef ServiceCreateAttributesVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef CreateAttributesVector(builder, data):\n    return ServiceCreateAttributesVector(builder, data)\n\ndef ServiceAddDocumentation(builder, documentation):\n    builder.PrependUOffsetTRelativeSlot(3, flatbuffers.number_types.UOffsetTFlags.py_type(documentation), 0)\n\ndef AddDocumentation(builder, documentation):\n    ServiceAddDocumentation(builder, documentation)\n\ndef ServiceStartDocumentationVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef StartDocumentationVector(builder, numElems):\n    return ServiceStartDocumentationVector(builder, numElems)\n\ndef ServiceCreateDocumentationVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef CreateDocumentationVector(builder, data):\n    return ServiceCreateDocumentationVector(builder, data)\n\ndef ServiceAddDeclarationFile(builder, declarationFile):\n    builder.PrependUOffsetTRelativeSlot(4, flatbuffers.number_types.UOffsetTFlags.py_type(declarationFile), 0)\n\ndef AddDeclarationFile(builder, declarationFile):\n    ServiceAddDeclarationFile(builder, declarationFile)\n\ndef ServiceEnd(builder):\n    return builder.EndObject()\n\ndef End(builder):\n    return ServiceEnd(builder)\n"
  },
  {
    "path": "python/flatbuffers/reflection/Type.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: reflection\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\nclass Type(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = Type()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsType(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    @classmethod\n    def TypeBufferHasIdentifier(cls, buf, offset, size_prefixed=False):\n        return flatbuffers.util.BufferHasIdentifier(buf, offset, b\"\\x42\\x46\\x42\\x53\", size_prefixed=size_prefixed)\n\n    # Type\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # Type\n    def BaseType(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos)\n        return 0\n\n    # Type\n    def Element(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos)\n        return 0\n\n    # Type\n    def Index(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos)\n        return -1\n\n    # Type\n    def FixedLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint16Flags, o + self._tab.Pos)\n        return 0\n\n    # The size (octets) of the `base_type` field.\n    # Type\n    def BaseSize(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint32Flags, o + self._tab.Pos)\n        return 4\n\n    # The size (octets) of the `element` field, if present.\n    # Type\n    def ElementSize(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint32Flags, o + self._tab.Pos)\n        return 0\n\ndef TypeStart(builder):\n    builder.StartObject(6)\n\ndef Start(builder):\n    TypeStart(builder)\n\ndef TypeAddBaseType(builder, baseType):\n    builder.PrependInt8Slot(0, baseType, 0)\n\ndef AddBaseType(builder, baseType):\n    TypeAddBaseType(builder, baseType)\n\ndef TypeAddElement(builder, element):\n    builder.PrependInt8Slot(1, element, 0)\n\ndef AddElement(builder, element):\n    TypeAddElement(builder, element)\n\ndef TypeAddIndex(builder, index):\n    builder.PrependInt32Slot(2, index, -1)\n\ndef AddIndex(builder, index):\n    TypeAddIndex(builder, index)\n\ndef TypeAddFixedLength(builder, fixedLength):\n    builder.PrependUint16Slot(3, fixedLength, 0)\n\ndef AddFixedLength(builder, fixedLength):\n    TypeAddFixedLength(builder, fixedLength)\n\ndef TypeAddBaseSize(builder, baseSize):\n    builder.PrependUint32Slot(4, baseSize, 4)\n\ndef AddBaseSize(builder, baseSize):\n    TypeAddBaseSize(builder, baseSize)\n\ndef TypeAddElementSize(builder, elementSize):\n    builder.PrependUint32Slot(5, elementSize, 0)\n\ndef AddElementSize(builder, elementSize):\n    TypeAddElementSize(builder, elementSize)\n\ndef TypeEnd(builder):\n    return builder.EndObject()\n\ndef End(builder):\n    return TypeEnd(builder)\n"
  },
  {
    "path": "python/flatbuffers/reflection/__init__.py",
    "content": ""
  },
  {
    "path": "python/flatbuffers/table.py",
    "content": "# Copyright 2014 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nfrom . import encode\nfrom . import number_types as N\n\n\nclass Table(object):\n  \"\"\"Table wraps a byte slice and provides read access to its data.\n\n  The variable `Pos` indicates the root of the FlatBuffers object therein.\n  \"\"\"\n\n  __slots__ = (\"Bytes\", \"Pos\")\n\n  def __init__(self, buf, pos):\n    N.enforce_number(pos, N.UOffsetTFlags)\n\n    self.Bytes = buf\n    self.Pos = pos\n\n  def Offset(self, vtableOffset):\n    \"\"\"Offset provides access into the Table's vtable.\n\n    Deprecated fields are ignored by checking the vtable's length.\n    \"\"\"\n\n    vtable = self.Pos - self.Get(N.SOffsetTFlags, self.Pos)\n    vtableEnd = self.Get(N.VOffsetTFlags, vtable)\n    if vtableOffset < vtableEnd:\n      return self.Get(N.VOffsetTFlags, vtable + vtableOffset)\n    return 0\n\n  def Indirect(self, off):\n    \"\"\"Indirect retrieves the relative offset stored at `offset`.\"\"\"\n    N.enforce_number(off, N.UOffsetTFlags)\n    return off + encode.Get(N.UOffsetTFlags.packer_type, self.Bytes, off)\n\n  def String(self, off):\n    \"\"\"String gets a string from data stored inside the flatbuffer.\"\"\"\n    N.enforce_number(off, N.UOffsetTFlags)\n    off += encode.Get(N.UOffsetTFlags.packer_type, self.Bytes, off)\n    start = off + N.UOffsetTFlags.bytewidth\n    length = encode.Get(N.UOffsetTFlags.packer_type, self.Bytes, off)\n    return bytes(self.Bytes[start : start + length])\n\n  def VectorLen(self, off):\n    \"\"\"VectorLen retrieves the length of the vector whose offset is stored\n\n    at \"off\" in this object.\n    \"\"\"\n    N.enforce_number(off, N.UOffsetTFlags)\n\n    off += self.Pos\n    off += encode.Get(N.UOffsetTFlags.packer_type, self.Bytes, off)\n    ret = encode.Get(N.UOffsetTFlags.packer_type, self.Bytes, off)\n    return ret\n\n  def Vector(self, off):\n    \"\"\"Vector retrieves the start of data of the vector whose offset is\n\n    stored at \"off\" in this object.\n    \"\"\"\n    N.enforce_number(off, N.UOffsetTFlags)\n\n    off += self.Pos\n    x = off + self.Get(N.UOffsetTFlags, off)\n    # data starts after metadata containing the vector length\n    x += N.UOffsetTFlags.bytewidth\n    return x\n\n  def Union(self, t2, off):\n    \"\"\"Union initializes any Table-derived type to point to the union at\n\n    the given offset.\n    \"\"\"\n    assert type(t2) is Table\n    N.enforce_number(off, N.UOffsetTFlags)\n\n    off += self.Pos\n    t2.Pos = off + self.Get(N.UOffsetTFlags, off)\n    t2.Bytes = self.Bytes\n\n  def Get(self, flags, off):\n    \"\"\"Get retrieves a value of the type specified by `flags`  at the\n\n    given offset.\n    \"\"\"\n    N.enforce_number(off, N.UOffsetTFlags)\n    return flags.py_type(encode.Get(flags.packer_type, self.Bytes, off))\n\n  def GetSlot(self, slot, d, validator_flags):\n    N.enforce_number(slot, N.VOffsetTFlags)\n    if validator_flags is not None:\n      N.enforce_number(d, validator_flags)\n    off = self.Offset(slot)\n    if off == 0:\n      return d\n    return self.Get(validator_flags, self.Pos + off)\n\n  def GetVectorAsNumpy(self, flags, off):\n    \"\"\"GetVectorAsNumpy returns the vector that starts at `Vector(off)`\n\n    as a numpy array with the type specified by `flags`. The array is\n    a `view` into Bytes, so modifying the returned array will\n    modify Bytes in place.\n    \"\"\"\n    offset = self.Vector(off)\n    length = self.VectorLen(off)  # TODO: length accounts for bytewidth, right?\n    numpy_dtype = N.to_numpy_type(flags)\n    return encode.GetVectorAsNumpy(numpy_dtype, self.Bytes, length, offset)\n\n  def GetArrayAsNumpy(self, flags, off, length):\n    \"\"\"GetArrayAsNumpy returns the array with fixed width that starts at `Vector(offset)`\n\n    with length `length` as a numpy array with the type specified by `flags`.\n    The\n    array is a `view` into Bytes so modifying the returned will modify Bytes in\n    place.\n    \"\"\"\n    numpy_dtype = N.to_numpy_type(flags)\n    return encode.GetVectorAsNumpy(numpy_dtype, self.Bytes, length, off)\n\n  def GetVOffsetTSlot(self, slot, d):\n    \"\"\"GetVOffsetTSlot retrieves the VOffsetT that the given vtable location\n\n    points to. If the vtable value is zero, the default value `d`\n    will be returned.\n    \"\"\"\n\n    N.enforce_number(slot, N.VOffsetTFlags)\n    N.enforce_number(d, N.VOffsetTFlags)\n\n    off = self.Offset(slot)\n    if off == 0:\n      return d\n    return off\n"
  },
  {
    "path": "python/flatbuffers/util.py",
    "content": "# Copyright 2017 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nfrom . import encode\nfrom . import number_types\nfrom . import packer\n\n\ndef GetSizePrefix(buf, offset):\n  \"\"\"Extract the size prefix from a buffer.\"\"\"\n  return encode.Get(packer.int32, buf, offset)\n\n\ndef GetBufferIdentifier(buf, offset, size_prefixed=False):\n  \"\"\"Extract the file_identifier from a buffer\"\"\"\n  if size_prefixed:\n    # increase offset by size of UOffsetTFlags\n    offset += number_types.UOffsetTFlags.bytewidth\n  # increase offset by size of root table pointer\n  offset += number_types.UOffsetTFlags.bytewidth\n  # end of FILE_IDENTIFIER\n  end = offset + encode.FILE_IDENTIFIER_LENGTH\n  return buf[offset:end]\n\n\ndef BufferHasIdentifier(buf, offset, file_identifier, size_prefixed=False):\n  got = GetBufferIdentifier(buf, offset, size_prefixed=size_prefixed)\n  return got == file_identifier\n\n\ndef RemoveSizePrefix(buf, offset):\n  \"\"\"Create a slice of a size-prefixed buffer that has\n\n  its position advanced just past the size prefix.\n  \"\"\"\n  return buf, offset + number_types.Int32Flags.bytewidth\n"
  },
  {
    "path": "python/py.typed",
    "content": ""
  },
  {
    "path": "python/setup.cfg",
    "content": "[metadata]\nlicense_files = LICENSE\n"
  },
  {
    "path": "python/setup.py",
    "content": "# Copyright 2016 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nfrom setuptools import setup\n\nsetup(\n    name='flatbuffers',\n    version='25.12.19',\n    license='Apache 2.0',\n    author='Derek Bailey',\n    author_email='derekbailey@google.com',\n    url='https://google.github.io/flatbuffers/',\n    long_description=(\n        'Python runtime library for use with the '\n        '`Flatbuffers <https://google.github.io/flatbuffers/>`_ '\n        'serialization format.'\n    ),\n    packages=['flatbuffers'],\n    include_package_data=True,\n    requires=[],\n    description='The FlatBuffers serialization format for Python',\n    classifiers=[\n        'Intended Audience :: Developers',\n        'Operating System :: OS Independent',\n        'Programming Language :: Python',\n        'Programming Language :: Python :: 3',\n        'Topic :: Software Development :: Libraries :: Python Modules',\n    ],\n    project_urls={\n        'Documentation': 'https://google.github.io/flatbuffers/',\n        'Source': 'https://github.com/google/flatbuffers',\n    },\n)\n"
  },
  {
    "path": "reflection/BUILD.bazel",
    "content": "filegroup(\n    name = \"distribution\",\n    srcs = [\n        \"BUILD.bazel\",\n        \"reflection.fbs\",\n    ],\n    visibility = [\"//visibility:public\"],\n)\n\n# flatbuffer_ts_library() only supports .fbs file but not filegroups\nexports_files(\n    srcs = [\"reflection.fbs\"],\n    visibility = [\"//reflection/ts:__pkg__\"],\n)\n\nfilegroup(\n    name = \"reflection_fbs_schema\",\n    srcs = [\"reflection.fbs\"],\n    visibility = [\"//visibility:public\"],\n)\n"
  },
  {
    "path": "reflection/reflection.fbs",
    "content": "// This schema defines objects that represent a parsed schema, like\n// the binary version of a .fbs file.\n// This could be used to operate on unknown FlatBuffers at runtime.\n// It can even ... represent itself (!)\n\nnamespace reflection;\n\n// These must correspond to the enum in idl.h.\nenum BaseType : byte {\n    None,\n    UType,\n    Bool,\n    Byte,\n    UByte,\n    Short,\n    UShort,\n    Int,\n    UInt,\n    Long,\n    ULong,\n    Float,\n    Double,\n    String,\n    Vector,\n    Obj,     // Used for tables & structs.\n    Union,\n    Array,\n    Vector64,\n\n    // Add any new type above this value.\n    MaxBaseType\n}\n\ntable Type {\n    base_type:BaseType;\n    element:BaseType = None;  // Only if base_type == Vector\n                              // or base_type == Array.\n    index:int = -1;  // If base_type == Object, index into \"objects\" below.\n                     // If base_type == Union, UnionType, or integral derived\n                     // from an enum, index into \"enums\" below.\n                     // If base_type == Vector && element == Union or UnionType.\n    fixed_length:uint16 = 0;  // Only if base_type == Array.\n    /// The size (octets) of the `base_type` field.\n    base_size:uint = 4; // 4 Is a common size due to offsets being that size.\n    /// The size (octets) of the `element` field, if present.\n    element_size:uint = 0;\n}\n\ntable KeyValue {\n    key:string (required, key);\n    value:string;\n}\n\ntable EnumVal {\n    name:string (required);\n    value:long (key);\n    object:Object (deprecated);\n    union_type:Type;\n    documentation:[string];\n    attributes:[KeyValue];\n}\n\ntable Enum {\n    name:string (required, key);\n    values:[EnumVal] (required);  // In order of their values.\n    is_union:bool = false;\n    underlying_type:Type (required);\n    attributes:[KeyValue];\n    documentation:[string];\n    /// File that this Enum is declared in.\n    declaration_file: string;\n}\n\ntable Field {\n    name:string (required, key);\n    type:Type (required);\n    id:ushort;\n    offset:ushort;  // Offset into the vtable for tables, or into the struct.\n    default_integer:long = 0;\n    default_real:double = 0.0;\n    deprecated:bool = false;\n    required:bool = false;\n    key:bool = false;\n    attributes:[KeyValue];\n    documentation:[string];\n    optional:bool = false;\n    /// Number of padding octets to always add after this field. Structs only.\n    padding:uint16 = 0; \n    /// If the field uses 64-bit offsets.\n    offset64:bool = false;\n}\n\ntable Object {  // Used for both tables and structs.\n    name:string (required, key);\n    fields:[Field] (required);  // Sorted.\n    is_struct:bool = false;\n    minalign:int;\n    bytesize:int;  // For structs.\n    attributes:[KeyValue];\n    documentation:[string];\n    /// File that this Object is declared in.\n    declaration_file: string;\n}\n\ntable RPCCall {\n    name:string (required, key);\n    request:Object (required);      // must be a table (not a struct)\n    response:Object (required);     // must be a table (not a struct)\n    attributes:[KeyValue];\n    documentation:[string];\n}\n\ntable Service {\n    name:string (required, key);\n    calls:[RPCCall];\n    attributes:[KeyValue];\n    documentation:[string];\n    /// File that this Service is declared in.\n    declaration_file: string;\n}\n\n/// New schema language features that are not supported by old code generators.\nenum AdvancedFeatures : ulong (bit_flags) {\n    AdvancedArrayFeatures,\n    AdvancedUnionFeatures,\n    OptionalScalars,\n    DefaultVectorsAndStrings,\n}\n\n/// File specific information.\n/// Symbols declared within a file may be recovered by iterating over all\n/// symbols and examining the `declaration_file` field.\ntable SchemaFile {\n  /// Filename, relative to project root.\n  filename:string (required, key);\n  /// Names of included files, relative to project root.\n  included_filenames:[string];\n}\n\ntable Schema {\n    objects:[Object] (required);    // Sorted.\n    enums:[Enum] (required);        // Sorted.\n    file_ident:string;\n    file_ext:string;\n    root_table:Object;\n    services:[Service];             // Sorted.\n    advanced_features:AdvancedFeatures;\n    /// All the files used in this compilation. Files are relative to where\n    /// flatc was invoked.\n    fbs_files:[SchemaFile];         // Sorted.\n}\n\nroot_type Schema;\n\nfile_identifier \"BFBS\";\nfile_extension \"bfbs\";\n"
  },
  {
    "path": "reflection/ts/BUILD.bazel",
    "content": "load(\"//:typescript.bzl\", \"flatbuffer_ts_library\")\n\nflatbuffer_ts_library(\n    name = \"reflection_ts_fbs\",\n    srcs = [\"//reflection:reflection.fbs\"],\n    gen_reflections = True,\n    visibility = [\"//visibility:public\"],\n)\n"
  },
  {
    "path": "rust/flatbuffers/Cargo.toml",
    "content": "[package]\nname = \"flatbuffers\"\nversion = \"25.12.19\"\nedition = \"2018\"\nauthors = [\"Robert Winslow <hello@rwinslow.com>\", \"FlatBuffers Maintainers\"]\nlicense = \"Apache-2.0\"\ndescription = \"Official FlatBuffers Rust runtime library.\"\nhomepage = \"https://google.github.io/flatbuffers/\"\nrepository = \"https://github.com/google/flatbuffers\"\nkeywords = [\"flatbuffers\", \"serialization\", \"zero-copy\"]\ncategories = [\"encoding\", \"data-structures\", \"memory-management\"]\nrust-version = \"1.51\"\n\n[features]\ndefault = [\"std\"]\nstd = []\nserialize = [\"serde\"]\n\n[dependencies]\nbitflags = \"2.8.0\"\nserde = { version = \"1.0\", optional = true }\n\n[build-dependencies]\nrustc_version = \"0.4.0\"\n"
  },
  {
    "path": "rust/flatbuffers/README.md",
    "content": "# Flatbuffers\n\nFlatBuffers is a cross platform serialization library architected for maximum\nmemory efficiency. It allows you to directly access serialized data without\nparsing/unpacking it first, while still having great forwards/backwards\ncompatibility. It was originally created at Google for game development and\nother performance-critical applications.\n\n## See our\n* [Tutorial](https://google.github.io/flatbuffers/flatbuffers_guide_tutorial.html)\n* [Landing Page](https://google.github.io/flatbuffers/)\n* [Rust sample binary](https://github.com/google/flatbuffers/blob/master/samples/sample_binary.rs)\n* [Schema**less** format, Flexbuffers](https://crates.io/crates/flexbuffers)\n* [Github](https://github.com/google/flatbuffers)\n\n"
  },
  {
    "path": "rust/flatbuffers/build.rs",
    "content": "use rustc_version::{Channel, version_meta};\n\nfn main() {\n    let version_meta = version_meta().unwrap();\n\n    // To use nightly features we declare this and then we can use\n    // #[cfg(nightly)]\n    // for nightly only features\n    println!(\"cargo:rustc-check-cfg=cfg(nightly)\");\n    if version_meta.channel == Channel::Nightly {\n        println!(\"cargo:rustc-cfg=nightly\")\n    }\n}\n"
  },
  {
    "path": "rust/flatbuffers/src/array.rs",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nuse crate::follow::Follow;\nuse crate::vector::VectorIter;\nuse crate::EndianScalar;\nuse core::fmt::{Debug, Formatter, Result};\nuse core::marker::PhantomData;\nuse core::mem::size_of;\n\n#[derive(Copy, Clone)]\npub struct Array<'a, T: 'a, const N: usize>(&'a [u8], PhantomData<T>);\n\nimpl<'a, T: 'a, const N: usize> Debug for Array<'a, T, N>\nwhere\n    T: 'a + Follow<'a>,\n    <T as Follow<'a>>::Inner: Debug,\n{\n    fn fmt(&self, f: &mut Formatter) -> Result {\n        f.debug_list().entries(self.iter()).finish()\n    }\n}\n\n#[allow(clippy::len_without_is_empty)]\n#[allow(clippy::from_over_into)] // TODO(caspern): Go from From to Into.\nimpl<'a, T: 'a, const N: usize> Array<'a, T, N> {\n    /// # Safety\n    ///\n    /// buf must be a contiguous array of `T`\n    ///\n    /// # Panics\n    ///\n    /// Panics if `buf.len()` is not `size_of::<T>() * N`\n    #[inline(always)]\n    pub unsafe fn new(buf: &'a [u8]) -> Self {\n        assert_eq!(size_of::<T>() * N, buf.len());\n\n        Array(buf, PhantomData)\n    }\n\n    #[inline(always)]\n    pub const fn len(&self) -> usize {\n        N\n    }\n    pub fn as_ptr(&self) -> *const u8 {\n        self.0.as_ptr()\n    }\n}\n\nimpl<'a, T: Follow<'a> + 'a, const N: usize> Array<'a, T, N> {\n    #[inline(always)]\n    pub fn get(&self, idx: usize) -> T::Inner {\n        assert!(idx < N);\n        let sz = size_of::<T>();\n        // Safety:\n        // self.0 was valid for length `N` on construction and have verified `idx < N`\n        unsafe { T::follow(self.0, sz * idx) }\n    }\n\n    #[inline(always)]\n    pub fn iter(&self) -> VectorIter<'a, T> {\n        // Safety:\n        // self.0 was valid for length N on construction\n        unsafe { VectorIter::from_slice(self.0, self.len()) }\n    }\n}\n\nimpl<'a, T: Follow<'a> + Debug, const N: usize> From<Array<'a, T, N>> for [T::Inner; N] {\n    fn from(array: Array<'a, T, N>) -> Self {\n        array_init(|i| array.get(i))\n    }\n}\n\n/// Implement Follow for all possible Arrays that have Follow-able elements.\nimpl<'a, T: Follow<'a> + 'a, const N: usize> Follow<'a> for Array<'a, T, N> {\n    type Inner = Array<'a, T, N>;\n    #[inline(always)]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Array::new(&buf[loc..loc + N * size_of::<T>()])\n    }\n}\n\n/// Place an array of EndianScalar into the provided mutable byte slice. Performs\n/// endian conversion, if necessary.\n/// # Safety\n/// Caller must ensure `s.len() >= size_of::<[T; N]>()`\npub unsafe fn emplace_scalar_array<T: EndianScalar, const N: usize>(\n    buf: &mut [u8],\n    loc: usize,\n    src: &[T; N],\n) {\n    let mut buf_ptr = buf[loc..].as_mut_ptr();\n    for item in src.iter() {\n        let item_le = item.to_little_endian();\n        core::ptr::copy_nonoverlapping(\n            &item_le as *const T::Scalar as *const u8,\n            buf_ptr,\n            size_of::<T::Scalar>(),\n        );\n        buf_ptr = buf_ptr.add(size_of::<T::Scalar>());\n    }\n}\n\nimpl<'a, T: Follow<'a> + 'a, const N: usize> IntoIterator for Array<'a, T, N> {\n    type Item = T::Inner;\n    type IntoIter = VectorIter<'a, T>;\n    #[inline]\n    fn into_iter(self) -> Self::IntoIter {\n        self.iter()\n    }\n}\n\n#[inline]\npub fn array_init<F, T, const N: usize>(mut initializer: F) -> [T; N]\nwhere\n    F: FnMut(usize) -> T,\n{\n    let mut array: core::mem::MaybeUninit<[T; N]> = core::mem::MaybeUninit::uninit();\n    let mut ptr_i = array.as_mut_ptr() as *mut T;\n\n    // Safety:\n    // array is aligned by T, and has length N\n    unsafe {\n        for i in 0..N {\n            let value_i = initializer(i);\n            ptr_i.write(value_i);\n            ptr_i = ptr_i.add(1);\n        }\n        array.assume_init()\n    }\n}\n\n#[cfg(feature = \"serialize\")]\nimpl<'a, T: 'a, const N: usize> serde::ser::Serialize for Array<'a, T, N>\nwhere\n    T: 'a + Follow<'a>,\n    <T as Follow<'a>>::Inner: serde::ser::Serialize,\n{\n    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>\n    where\n        S: serde::ser::Serializer,\n    {\n        use serde::ser::SerializeSeq;\n        let mut seq = serializer.serialize_seq(Some(self.len()))?;\n        for element in self.iter() {\n            seq.serialize_element(&element)?;\n        }\n        seq.end()\n    }\n}\n"
  },
  {
    "path": "rust/flatbuffers/src/builder.rs",
    "content": "/*\n * Copyright 2018 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#[cfg(not(feature = \"std\"))]\nuse alloc::{vec, vec::Vec};\nuse core::cmp::max;\nuse core::convert::Infallible;\nuse core::fmt::{Debug, Display};\nuse core::iter::{DoubleEndedIterator, ExactSizeIterator};\nuse core::marker::PhantomData;\nuse core::ops::{Add, AddAssign, Deref, DerefMut, Index, IndexMut, Sub, SubAssign};\nuse core::ptr::write_bytes;\n\n#[cfg(feature = \"std\")]\nuse std::collections::HashMap;\n\nuse crate::endian_scalar::emplace_scalar;\nuse crate::primitives::*;\nuse crate::push::{Push, PushAlignment};\nuse crate::read_scalar;\nuse crate::table::Table;\nuse crate::vector::Vector;\nuse crate::vtable::{field_index_to_field_offset, VTable};\nuse crate::vtable_writer::VTableWriter;\n\n/// Trait to implement custom allocation strategies for [`FlatBufferBuilder`].\n///\n/// An implementation can be used with [`FlatBufferBuilder::new_in`], enabling a custom allocation\n/// strategy for the [`FlatBufferBuilder`].\n///\n/// # Safety\n///\n/// The implementation of the allocator must match the defined behavior as described by the\n/// comments.\npub unsafe trait Allocator: DerefMut<Target = [u8]> {\n    /// A type describing allocation failures\n    type Error: Display + Debug;\n    /// Grows the buffer, with the old contents being moved to the end.\n    ///\n    /// NOTE: While not unsound, an implementation that doesn't grow the\n    /// internal buffer will get stuck in an infinite loop.\n    fn grow_downwards(&mut self) -> Result<(), Self::Error>;\n\n    /// Returns the size of the internal buffer in bytes.\n    fn len(&self) -> usize;\n}\n\n/// Default [`FlatBufferBuilder`] allocator backed by a [`Vec<u8>`].\n#[derive(Default)]\npub struct DefaultAllocator(Vec<u8>);\n\nimpl DefaultAllocator {\n    /// Builds the allocator from an existing buffer.\n    pub fn from_vec(buffer: Vec<u8>) -> Self {\n        Self(buffer)\n    }\n}\n\nimpl Deref for DefaultAllocator {\n    type Target = [u8];\n\n    fn deref(&self) -> &Self::Target {\n        &self.0\n    }\n}\n\nimpl DerefMut for DefaultAllocator {\n    fn deref_mut(&mut self) -> &mut Self::Target {\n        &mut self.0\n    }\n}\n\n// SAFETY: The methods are implemented as described by the documentation.\nunsafe impl Allocator for DefaultAllocator {\n    type Error = Infallible;\n    fn grow_downwards(&mut self) -> Result<(), Self::Error> {\n        let old_len = self.0.len();\n        let new_len = max(1, old_len * 2);\n\n        self.0.resize(new_len, 0);\n\n        if new_len == 1 {\n            return Ok(());\n        }\n\n        // calculate the midpoint, and safely copy the old end data to the new\n        // end position:\n        let middle = new_len / 2;\n        {\n            let (left, right) = &mut self.0[..].split_at_mut(middle);\n            right.copy_from_slice(left);\n        }\n        // finally, zero out the old end data.\n        {\n            let ptr = self.0[..middle].as_mut_ptr();\n            // Safety:\n            // ptr is byte aligned and of length middle\n            unsafe {\n                write_bytes(ptr, 0, middle);\n            }\n        }\n        Ok(())\n    }\n\n    fn len(&self) -> usize {\n        self.0.len()\n    }\n}\n\n#[derive(Clone, Copy, Debug, Eq, PartialEq)]\nstruct FieldLoc {\n    off: UOffsetT,\n    id: VOffsetT,\n}\n\n/// FlatBufferBuilder builds a FlatBuffer through manipulating its internal\n/// state. It has an owned `Vec<u8>` that grows as needed (up to the hardcoded\n/// limit of 2GiB, which is set by the FlatBuffers format).\n#[derive(Clone, Debug, Eq, PartialEq)]\npub struct FlatBufferBuilder<'fbb, A: Allocator = DefaultAllocator> {\n    allocator: A,\n    head: ReverseIndex,\n\n    field_locs: Vec<FieldLoc>,\n    written_vtable_revpos: Vec<UOffsetT>,\n\n    nested: bool,\n    finished: bool,\n\n    min_align: usize,\n    force_defaults: bool,\n    #[cfg(feature = \"std\")]\n    strings_pool: HashMap<String, WIPOffset<&'fbb str>>,\n    #[cfg(not(feature = \"std\"))]\n    strings_pool: Vec<WIPOffset<&'fbb str>>,\n\n    _phantom: PhantomData<&'fbb ()>,\n}\n\nimpl<'fbb> FlatBufferBuilder<'fbb, DefaultAllocator> {\n    /// Create a FlatBufferBuilder that is ready for writing.\n    pub fn new() -> Self {\n        Self::with_capacity(0)\n    }\n    #[deprecated(note = \"replaced with `with_capacity`\", since = \"0.8.5\")]\n    pub fn new_with_capacity(size: usize) -> Self {\n        Self::with_capacity(size)\n    }\n    /// Create a FlatBufferBuilder that is ready for writing, with a\n    /// ready-to-use capacity of the provided size.\n    ///\n    /// The maximum valid value is `FLATBUFFERS_MAX_BUFFER_SIZE`.\n    pub fn with_capacity(size: usize) -> Self {\n        Self::from_vec(vec![0; size])\n    }\n    /// Create a FlatBufferBuilder that is ready for writing, with a\n    /// ready-to-use capacity of the provided size and preallocated internal vecs.\n    ///\n    /// The maximum valid value for `size` is `FLATBUFFERS_MAX_BUFFER_SIZE`.\n    ///\n    /// # Arguments\n    ///\n    /// * `size` - The initial capacity of the backing buffer in bytes.\n    /// * `field_locs_capacity` - Preallocated capacity for the field locations vec.\n    /// * `written_vtable_revpos_capacity` - Preallocated capacity for the written vtable reverse positions vec.\n    /// * `strings_pool_capacity` - Preallocated capacity for the shared strings pool vec.\n    pub fn with_internal_capacity(\n        size: usize,\n        field_locs_capacity: usize,\n        written_vtable_revpos_capacity: usize,\n        strings_pool_capacity: usize,\n    ) -> Self {\n        Self::from_vec_with_internal_capacity(\n            vec![0; size],\n            field_locs_capacity,\n            written_vtable_revpos_capacity,\n            strings_pool_capacity,\n        )\n    }\n    /// Create a FlatBufferBuilder that is ready for writing, reusing\n    /// an existing vector and preallocated internal vecs.\n    ///\n    /// # Arguments\n    ///\n    /// * `buffer` - An existing `Vec<u8>` to reuse as the backing buffer.\n    /// * `field_locs_capacity` - Preallocated capacity for the field locations vec.\n    /// * `written_vtable_revpos_capacity` - Preallocated capacity for the written vtable reverse positions vec.\n    /// * `strings_pool_capacity` - Preallocated capacity for the shared strings pool vec.\n    pub fn from_vec_with_internal_capacity(\n        buffer: Vec<u8>,\n        field_locs_capacity: usize,\n        written_vtable_revpos_capacity: usize,\n        strings_pool_capacity: usize,\n    ) -> Self {\n        // we need to check the size here because we create the backing buffer\n        // directly, bypassing the typical way of using grow_allocator:\n        assert!(\n            buffer.len() <= FLATBUFFERS_MAX_BUFFER_SIZE,\n            \"cannot initialize buffer bigger than 2 gigabytes\"\n        );\n        let allocator = DefaultAllocator::from_vec(buffer);\n        Self::new_in_with_internal_capacity(\n            allocator,\n            field_locs_capacity,\n            written_vtable_revpos_capacity,\n            strings_pool_capacity,\n        )\n    }\n\n    /// Create a FlatBufferBuilder that is ready for writing, reusing\n    /// an existing vector.\n    pub fn from_vec(buffer: Vec<u8>) -> Self {\n        // we need to check the size here because we create the backing buffer\n        // directly, bypassing the typical way of using grow_allocator:\n        assert!(\n            buffer.len() <= FLATBUFFERS_MAX_BUFFER_SIZE,\n            \"cannot initialize buffer bigger than 2 gigabytes\"\n        );\n        let allocator = DefaultAllocator::from_vec(buffer);\n        Self::new_in(allocator)\n    }\n\n    /// Destroy the FlatBufferBuilder, returning its internal byte vector\n    /// and the index into it that represents the start of valid data.\n    pub fn collapse(self) -> (Vec<u8>, usize) {\n        let index = self.head.to_forward_index(&self.allocator);\n        (self.allocator.0, index)\n    }\n}\n\nimpl<'fbb, A: Allocator> FlatBufferBuilder<'fbb, A> {\n    /// Create a [`FlatBufferBuilder`] that is ready for writing with a custom [`Allocator`].\n    pub fn new_in(allocator: A) -> Self {\n        let head = ReverseIndex::end();\n        FlatBufferBuilder {\n            allocator,\n            head,\n\n            field_locs: Vec::new(),\n            written_vtable_revpos: Vec::new(),\n\n            nested: false,\n            finished: false,\n\n            min_align: 0,\n            force_defaults: false,\n            #[cfg(feature = \"std\")]\n            strings_pool: HashMap::new(),\n            #[cfg(not(feature = \"std\"))]\n            strings_pool: Vec::new(),\n\n            _phantom: PhantomData,\n        }\n    }\n\n    /// Create a [`FlatBufferBuilder`] that is ready for writing with a custom [`Allocator`]\n    /// and preallocated internal vecs.\n    ///\n    /// # Arguments\n    ///\n    /// * `allocator` - A custom [`Allocator`] to use as the backing buffer.\n    /// * `field_locs_capacity` - Preallocated capacity for the field locations vec.\n    /// * `written_vtable_revpos_capacity` - Preallocated capacity for the written vtable reverse positions vec.\n    /// * `strings_pool_capacity` - Preallocated capacity for the shared strings pool vec.\n    pub fn new_in_with_internal_capacity(\n        allocator: A,\n        field_locs_capacity: usize,\n        written_vtable_revpos_capacity: usize,\n        strings_pool_capacity: usize,\n    ) -> Self {\n        let head = ReverseIndex::end();\n        FlatBufferBuilder {\n            allocator,\n            head,\n\n            field_locs: Vec::with_capacity(field_locs_capacity),\n            written_vtable_revpos: Vec::with_capacity(written_vtable_revpos_capacity),\n\n            nested: false,\n            finished: false,\n\n            min_align: 0,\n            force_defaults: false,\n            #[cfg(feature = \"std\")]\n            strings_pool: HashMap::with_capacity(strings_pool_capacity),\n            #[cfg(not(feature = \"std\"))]\n            strings_pool: Vec::with_capacity(strings_pool_capacity),\n\n            _phantom: PhantomData,\n        }\n    }\n\n    /// Destroy the [`FlatBufferBuilder`], returning its [`Allocator`] and the index\n    /// into it that represents the start of valid data.\n    pub fn collapse_in(self) -> (A, usize) {\n        let index = self.head.to_forward_index(&self.allocator);\n        (self.allocator, index)\n    }\n\n    /// Reset the FlatBufferBuilder internal state. Use this method after a\n    /// call to a `finish` function in order to re-use a FlatBufferBuilder.\n    ///\n    /// This function is the only way to reset the `finished` state and start\n    /// again.\n    ///\n    /// If you are using a FlatBufferBuilder repeatedly, make sure to use this\n    /// function, because it re-uses the FlatBufferBuilder's existing\n    /// heap-allocated `Vec<u8>` internal buffer. This offers significant speed\n    /// improvements as compared to creating a new FlatBufferBuilder for every\n    /// new object.\n    pub fn reset(&mut self) {\n        // memset only the part of the buffer that could be dirty:\n        self.allocator[self.head.range_to_end()]\n            .iter_mut()\n            .for_each(|x| *x = 0);\n\n        self.head = ReverseIndex::end();\n        self.written_vtable_revpos.clear();\n\n        self.nested = false;\n        self.finished = false;\n\n        self.min_align = 0;\n        self.strings_pool.clear();\n    }\n\n    /// Push a Push'able value onto the front of the in-progress data.\n    ///\n    /// This function uses traits to provide a unified API for writing\n    /// scalars, tables, vectors, and WIPOffsets.\n    #[inline]\n    pub fn push<P: Push>(&mut self, x: P) -> WIPOffset<P::Output> {\n        let sz = P::size();\n        self.align(sz, P::alignment());\n        self.make_space(sz);\n        {\n            let (dst, rest) = self.allocator[self.head.range_to_end()].split_at_mut(sz);\n            // Safety:\n            // Called make_space above\n            unsafe { x.push(dst, rest.len()) };\n        }\n        WIPOffset::new(self.used_space() as UOffsetT)\n    }\n\n    /// Push a Push'able value onto the front of the in-progress data, and\n    /// store a reference to it in the in-progress vtable. If the value matches\n    /// the default, then this is a no-op.\n    #[inline]\n    pub fn push_slot<X: Push + PartialEq>(&mut self, slotoff: VOffsetT, x: X, default: X) {\n        self.assert_nested(\"push_slot\");\n        if x != default || self.force_defaults {\n            self.push_slot_always(slotoff, x);\n        }\n    }\n\n    /// Push a Push'able value onto the front of the in-progress data, and\n    /// store a reference to it in the in-progress vtable.\n    #[inline]\n    pub fn push_slot_always<X: Push>(&mut self, slotoff: VOffsetT, x: X) {\n        self.assert_nested(\"push_slot_always\");\n        let off = self.push(x);\n        self.track_field(slotoff, off.value());\n    }\n\n    /// Retrieve the number of vtables that have been serialized into the\n    /// FlatBuffer. This is primarily used to check vtable deduplication.\n    #[inline]\n    pub fn num_written_vtables(&self) -> usize {\n        self.written_vtable_revpos.len()\n    }\n\n    /// Start a Table write.\n    ///\n    /// Asserts that the builder is not in a nested state.\n    ///\n    /// Users probably want to use `push_slot` to add values after calling this.\n    #[inline]\n    pub fn start_table(&mut self) -> WIPOffset<TableUnfinishedWIPOffset> {\n        self.assert_not_nested(\n            \"start_table can not be called when a table or vector is under construction\",\n        );\n        self.nested = true;\n\n        WIPOffset::new(self.used_space() as UOffsetT)\n    }\n\n    /// End a Table write.\n    ///\n    /// Asserts that the builder is in a nested state.\n    #[inline]\n    pub fn end_table(\n        &mut self,\n        off: WIPOffset<TableUnfinishedWIPOffset>,\n    ) -> WIPOffset<TableFinishedWIPOffset> {\n        self.assert_nested(\"end_table\");\n\n        let o = self.write_vtable(off);\n\n        self.nested = false;\n        self.field_locs.clear();\n\n        WIPOffset::new(o.value())\n    }\n\n    /// Start a Vector write.\n    ///\n    /// Asserts that the builder is not in a nested state.\n    ///\n    /// Most users will prefer to call `create_vector`.\n    /// Speed optimizing users who choose to create vectors manually using this\n    /// function will want to use `push` to add values.\n    #[inline]\n    pub fn start_vector<T: Push>(&mut self, num_items: usize) {\n        self.assert_not_nested(\n            \"start_vector can not be called when a table or vector is under construction\",\n        );\n        self.nested = true;\n        self.align(num_items * T::size(), T::alignment().max_of(SIZE_UOFFSET));\n    }\n\n    /// End a Vector write.\n    ///\n    /// Note that the `num_elems` parameter is the number of written items, not\n    /// the byte count.\n    ///\n    /// Asserts that the builder is in a nested state.\n    #[inline]\n    pub fn end_vector<T: Push>(&mut self, num_elems: usize) -> WIPOffset<Vector<'fbb, T>> {\n        self.assert_nested(\"end_vector\");\n        self.nested = false;\n        let o = self.push::<UOffsetT>(num_elems as UOffsetT);\n        WIPOffset::new(o.value())\n    }\n\n    /// Create a utf8 string, and de-duplicate if already created.\n    ///\n    /// Uses a HashMap to track previously written strings, providing O(1)\n    /// amortized lookup and insertion.\n    #[cfg(feature = \"std\")]\n    #[inline]\n    pub fn create_shared_string<'a: 'b, 'b>(&'a mut self, s: &'b str) -> WIPOffset<&'fbb str> {\n        self.assert_not_nested(\n            \"create_shared_string can not be called when a table or vector is under construction\",\n        );\n\n        if let Some(&offset) = self.strings_pool.get(s) {\n            return offset;\n        }\n\n        let address = WIPOffset::new(self.create_byte_string(s.as_bytes()).value());\n        self.strings_pool.insert(s.to_owned(), address);\n        address\n    }\n\n    /// Create a utf8 string, and de-duplicate if already created.\n    ///\n    /// Uses a sorted Vec with binary search to track previously written\n    /// strings when in `no_std` mode.\n    #[cfg(not(feature = \"std\"))]\n    #[inline]\n    pub fn create_shared_string<'a: 'b, 'b>(&'a mut self, s: &'b str) -> WIPOffset<&'fbb str> {\n        self.assert_not_nested(\n            \"create_shared_string can not be called when a table or vector is under construction\",\n        );\n\n        // Saves a ref to allocator since rust doesnt like us refrencing it\n        // in the binary_search_by code.\n        let buf = &self.allocator;\n\n        let found = self.strings_pool.binary_search_by(|offset| {\n            let ptr = offset.value() as usize;\n            let str_memory = &buf[buf.len() - ptr..];\n            let size = u32::from_le_bytes([\n                str_memory[0],\n                str_memory[1],\n                str_memory[2],\n                str_memory[3],\n            ]) as usize;\n            let stored = &str_memory[4..4 + size];\n            stored.cmp(s.as_bytes())\n        });\n\n        match found {\n            Ok(index) => self.strings_pool[index],\n            Err(index) => {\n                let address = WIPOffset::new(self.create_byte_string(s.as_bytes()).value());\n                self.strings_pool.insert(index, address);\n                address\n            }\n        }\n    }\n\n    /// Create a utf8 string.\n    ///\n    /// The wire format represents this as a zero-terminated byte vector.\n    #[inline]\n    pub fn create_string<'a: 'b, 'b>(&'a mut self, s: &'b str) -> WIPOffset<&'fbb str> {\n        self.assert_not_nested(\n            \"create_string can not be called when a table or vector is under construction\",\n        );\n        WIPOffset::new(self.create_byte_string(s.as_bytes()).value())\n    }\n\n    /// Create a zero-terminated byte vector.\n    #[inline]\n    pub fn create_byte_string(&mut self, data: &[u8]) -> WIPOffset<&'fbb [u8]> {\n        self.assert_not_nested(\n            \"create_byte_string can not be called when a table or vector is under construction\",\n        );\n        self.align(data.len() + 1, PushAlignment::new(SIZE_UOFFSET));\n        self.push(0u8);\n        self.push_bytes_unprefixed(data);\n        self.push(data.len() as UOffsetT);\n        WIPOffset::new(self.used_space() as UOffsetT)\n    }\n\n    /// Create a vector of Push-able objects.\n    ///\n    /// Speed-sensitive users may wish to reduce memory usage by creating the\n    /// vector manually: use `start_vector`, `push`, and `end_vector`.\n    #[inline]\n    pub fn create_vector<'a: 'b, 'b, T: Push + 'b>(\n        &'a mut self,\n        items: &'b [T],\n    ) -> WIPOffset<Vector<'fbb, T::Output>> {\n        let elem_size = T::size();\n        let slice_size = items.len() * elem_size;\n        self.align(slice_size, T::alignment().max_of(SIZE_UOFFSET));\n        self.ensure_capacity(slice_size + UOffsetT::size());\n\n        self.head -= slice_size;\n        let mut written_len = self.head.distance_to_end();\n\n        let buf = &mut self.allocator[self.head.range_to(self.head + slice_size)];\n        for (item, out) in items.iter().zip(buf.chunks_exact_mut(elem_size)) {\n            written_len -= elem_size;\n\n            // Safety:\n            // Called ensure_capacity and aligned to T above\n            unsafe { item.push(out, written_len) };\n        }\n\n        WIPOffset::new(self.push::<UOffsetT>(items.len() as UOffsetT).value())\n    }\n\n    /// Create a vector of Push-able objects.\n    ///\n    /// Speed-sensitive users may wish to reduce memory usage by creating the\n    /// vector manually: use `start_vector`, `push`, and `end_vector`.\n    #[inline]\n    pub fn create_vector_from_iter<T: Push>(\n        &mut self,\n        items: impl ExactSizeIterator<Item = T> + DoubleEndedIterator,\n    ) -> WIPOffset<Vector<'fbb, T::Output>> {\n        let elem_size = T::size();\n        self.align(items.len() * elem_size, T::alignment().max_of(SIZE_UOFFSET));\n        let mut actual = 0;\n        for item in items.rev() {\n            self.push(item);\n            actual += 1;\n        }\n        WIPOffset::new(self.push::<UOffsetT>(actual).value())\n    }\n\n    /// Set whether default values are stored.\n    ///\n    /// In order to save space, fields that are set to their default value\n    /// aren't stored in the buffer. Setting `force_defaults` to `true`\n    /// disables this optimization.\n    ///\n    /// By default, `force_defaults` is `false`.\n    #[inline]\n    pub fn force_defaults(&mut self, force_defaults: bool) {\n        self.force_defaults = force_defaults;\n    }\n\n    /// Get the byte slice for the data that has been written, regardless of\n    /// whether it has been finished.\n    #[inline]\n    pub fn unfinished_data(&self) -> &[u8] {\n        &self.allocator[self.head.range_to_end()]\n    }\n    /// Get the byte slice for the data that has been written after a call to\n    /// one of the `finish` functions.\n    /// # Panics\n    /// Panics if the buffer is not finished.\n    #[inline]\n    pub fn finished_data(&self) -> &[u8] {\n        self.assert_finished(\"finished_bytes cannot be called when the buffer is not yet finished\");\n        &self.allocator[self.head.range_to_end()]\n    }\n    /// Returns a mutable view of a finished buffer and location of where the flatbuffer starts.\n    /// Note that modifying the flatbuffer data may corrupt it.\n    /// # Panics\n    /// Panics if the flatbuffer is not finished.\n    #[inline]\n    pub fn mut_finished_buffer(&mut self) -> (&mut [u8], usize) {\n        let index = self.head.to_forward_index(&self.allocator);\n        (&mut self.allocator[..], index)\n    }\n    /// Assert that a field is present in the just-finished Table.\n    ///\n    /// This is somewhat low-level and is mostly used by the generated code.\n    #[inline]\n    pub fn required(\n        &self,\n        tab_revloc: WIPOffset<TableFinishedWIPOffset>,\n        slot_byte_loc: VOffsetT,\n        assert_msg_name: &'static str,\n    ) {\n        let idx = self.used_space() - tab_revloc.value() as usize;\n\n        // Safety:\n        // The value of TableFinishedWIPOffset is the offset from the end of the allocator\n        // to an SOffsetT pointing to a valid VTable\n        //\n        // `self.allocator.len() = self.used_space() + self.head`\n        // `self.allocator.len() - tab_revloc = self.used_space() - tab_revloc + self.head`\n        // `self.allocator.len() - tab_revloc = idx + self.head`\n        let tab = unsafe { Table::new(&self.allocator[self.head.range_to_end()], idx) };\n        let o = tab.vtable().get(slot_byte_loc) as usize;\n        assert!(o != 0, \"missing required field {}\", assert_msg_name);\n    }\n\n    /// Finalize the FlatBuffer by: aligning it, pushing an optional file\n    /// identifier on to it, pushing a size prefix on to it, and marking the\n    /// internal state of the FlatBufferBuilder as `finished`. Afterwards,\n    /// users can call `finished_data` to get the resulting data.\n    #[inline]\n    pub fn finish_size_prefixed<T>(&mut self, root: WIPOffset<T>, file_identifier: Option<&str>) {\n        self.finish_with_opts(root, file_identifier, true);\n    }\n\n    /// Finalize the FlatBuffer by: aligning it, pushing an optional file\n    /// identifier on to it, and marking the internal state of the\n    /// FlatBufferBuilder as `finished`. Afterwards, users can call\n    /// `finished_data` to get the resulting data.\n    #[inline]\n    pub fn finish<T>(&mut self, root: WIPOffset<T>, file_identifier: Option<&str>) {\n        self.finish_with_opts(root, file_identifier, false);\n    }\n\n    /// Finalize the FlatBuffer by: aligning it and marking the internal state\n    /// of the FlatBufferBuilder as `finished`. Afterwards, users can call\n    /// `finished_data` to get the resulting data.\n    #[inline]\n    pub fn finish_minimal<T>(&mut self, root: WIPOffset<T>) {\n        self.finish_with_opts(root, None, false);\n    }\n\n    #[inline]\n    fn used_space(&self) -> usize {\n        self.head.distance_to_end()\n    }\n\n    #[inline]\n    fn track_field(&mut self, slot_off: VOffsetT, off: UOffsetT) {\n        let fl = FieldLoc { id: slot_off, off };\n        self.field_locs.push(fl);\n    }\n\n    /// Write the VTable, if it is new.\n    fn write_vtable(\n        &mut self,\n        table_tail_revloc: WIPOffset<TableUnfinishedWIPOffset>,\n    ) -> WIPOffset<VTableWIPOffset> {\n        self.assert_nested(\"write_vtable\");\n\n        // Write the vtable offset, which is the start of any Table.\n        // We fill its value later.\n        let object_revloc_to_vtable: WIPOffset<VTableWIPOffset> =\n            WIPOffset::new(self.push::<UOffsetT>(0xF0F0_F0F0).value());\n\n        // Layout of the data this function will create when a new vtable is\n        // needed.\n        // --------------------------------------------------------------------\n        // vtable starts here\n        // | x, x -- vtable len (bytes) [u16]\n        // | x, x -- object inline len (bytes) [u16]\n        // | x, x -- zero, or num bytes from start of object to field #0   [u16]\n        // | ...\n        // | x, x -- zero, or num bytes from start of object to field #n-1 [u16]\n        // vtable ends here\n        // table starts here\n        // | x, x, x, x -- offset (negative direction) to the vtable [i32]\n        // |               aka \"vtableoffset\"\n        // | -- table inline data begins here, we don't touch it --\n        // table ends here -- aka \"table_start\"\n        // --------------------------------------------------------------------\n        //\n        // Layout of the data this function will create when we re-use an\n        // existing vtable.\n        //\n        // We always serialize this particular vtable, then compare it to the\n        // other vtables we know about to see if there is a duplicate. If there\n        // is, then we erase the serialized vtable we just made.\n        // We serialize it first so that we are able to do byte-by-byte\n        // comparisons with already-serialized vtables. This 1) saves\n        // bookkeeping space (we only keep revlocs to existing vtables), 2)\n        // allows us to convert to little-endian once, then do\n        // fast memcmp comparisons, and 3) by ensuring we are comparing real\n        // serialized vtables, we can be more assured that we are doing the\n        // comparisons correctly.\n        //\n        // --------------------------------------------------------------------\n        // table starts here\n        // | x, x, x, x -- offset (negative direction) to an existing vtable [i32]\n        // |               aka \"vtableoffset\"\n        // | -- table inline data begins here, we don't touch it --\n        // table starts here: aka \"table_start\"\n        // --------------------------------------------------------------------\n\n        // fill the WIP vtable with zeros:\n        let vtable_byte_len = get_vtable_byte_len(&self.field_locs);\n        self.make_space(vtable_byte_len);\n\n        // compute the length of the table (not vtable!) in bytes:\n        let table_object_size = object_revloc_to_vtable.value() - table_tail_revloc.value();\n        debug_assert!(table_object_size < 0x10000); // vTable use 16bit offsets.\n\n        // Write the VTable (we may delete it afterwards, if it is a duplicate):\n        let vt_start_pos = self.head;\n        let vt_end_pos = self.head + vtable_byte_len;\n        // Zero out the vtable space - make_space only reserves but doesn't initialize\n        self.allocator[vt_start_pos.range_to(vt_end_pos)].fill(0);\n        {\n            // write the vtable header:\n            let vtfw =\n                &mut VTableWriter::init(&mut self.allocator[vt_start_pos.range_to(vt_end_pos)]);\n            vtfw.write_vtable_byte_length(vtable_byte_len as VOffsetT);\n            vtfw.write_object_inline_size(table_object_size as VOffsetT);\n\n            // serialize every FieldLoc to the vtable:\n            for &fl in self.field_locs.iter() {\n                let pos: VOffsetT = (object_revloc_to_vtable.value() - fl.off) as VOffsetT;\n                vtfw.write_field_offset(fl.id, pos);\n            }\n        }\n        let new_vt_bytes = &self.allocator[vt_start_pos.range_to(vt_end_pos)];\n        let found = self.written_vtable_revpos.binary_search_by(|old_vtable_revpos: &UOffsetT| {\n            let old_vtable_pos = self.allocator.len() - *old_vtable_revpos as usize;\n            // Safety:\n            // Already written vtables are valid by construction\n            let old_vtable = unsafe { VTable::init(&self.allocator, old_vtable_pos) };\n            new_vt_bytes.cmp(old_vtable.as_bytes())\n        });\n        let final_vtable_revpos = match found {\n            Ok(i) => {\n                // The new vtable is a duplicate so clear it.\n                VTableWriter::init(&mut self.allocator[vt_start_pos.range_to(vt_end_pos)]).clear();\n                self.head += vtable_byte_len;\n                self.written_vtable_revpos[i]\n            }\n            Err(i) => {\n                // This is a new vtable. Add it to the cache.\n                let new_vt_revpos = self.used_space() as UOffsetT;\n                self.written_vtable_revpos.insert(i, new_vt_revpos);\n                new_vt_revpos\n            }\n        };\n        // Write signed offset from table to its vtable.\n        let table_pos = self.allocator.len() - object_revloc_to_vtable.value() as usize;\n        if cfg!(debug_assertions) {\n            // Safety:\n            // Verified slice length\n            let tmp_soffset_to_vt = unsafe {\n                read_scalar::<UOffsetT>(&self.allocator[table_pos..table_pos + SIZE_UOFFSET])\n            };\n            assert_eq!(tmp_soffset_to_vt, 0xF0F0_F0F0);\n        }\n\n        let buf = &mut self.allocator[table_pos..table_pos + SIZE_SOFFSET];\n        // Safety:\n        // Verified length of buf above\n        unsafe {\n            emplace_scalar::<SOffsetT>(\n                buf,\n                final_vtable_revpos as SOffsetT - object_revloc_to_vtable.value() as SOffsetT,\n            );\n        }\n\n        self.field_locs.clear();\n\n        object_revloc_to_vtable\n    }\n\n    // Only call this when you know it is safe to double the size of the buffer.\n    #[inline]\n    fn grow_allocator(&mut self) {\n        let starting_active_size = self.used_space();\n        self.allocator.grow_downwards().expect(\"Flatbuffer allocation failure\");\n\n        let ending_active_size = self.used_space();\n        debug_assert_eq!(starting_active_size, ending_active_size);\n    }\n\n    // with or without a size prefix changes how we load the data, so finish*\n    // functions are split along those lines.\n    fn finish_with_opts<T>(\n        &mut self,\n        root: WIPOffset<T>,\n        file_identifier: Option<&str>,\n        size_prefixed: bool,\n    ) {\n        self.assert_not_finished(\"buffer cannot be finished when it is already finished\");\n        self.assert_not_nested(\n            \"buffer cannot be finished when a table or vector is under construction\",\n        );\n        self.written_vtable_revpos.clear();\n\n        let to_align = {\n            // for the root offset:\n            let a = SIZE_UOFFSET;\n            // for the size prefix:\n            let b = if size_prefixed { SIZE_UOFFSET } else { 0 };\n            // for the file identifier (a string that is not zero-terminated):\n            let c = if file_identifier.is_some() { FILE_IDENTIFIER_LENGTH } else { 0 };\n            a + b + c\n        };\n\n        {\n            let ma = PushAlignment::new(self.min_align);\n            self.align(to_align, ma);\n        }\n\n        if let Some(ident) = file_identifier {\n            debug_assert_eq!(ident.len(), FILE_IDENTIFIER_LENGTH);\n            self.push_bytes_unprefixed(ident.as_bytes());\n        }\n\n        self.push(root);\n\n        if size_prefixed {\n            let sz = self.used_space() as UOffsetT;\n            self.push::<UOffsetT>(sz);\n        }\n        self.finished = true;\n    }\n\n    #[inline]\n    fn align(&mut self, len: usize, alignment: PushAlignment) {\n        self.track_min_align(alignment.value());\n        let s = self.used_space() as usize;\n        self.make_space(padding_bytes(s + len, alignment.value()));\n    }\n\n    #[inline]\n    fn track_min_align(&mut self, alignment: usize) {\n        self.min_align = max(self.min_align, alignment);\n    }\n\n    #[inline]\n    fn push_bytes_unprefixed(&mut self, x: &[u8]) -> UOffsetT {\n        let n = self.make_space(x.len());\n        self.allocator[n.range_to(n + x.len())].copy_from_slice(x);\n\n        n.to_forward_index(&self.allocator) as UOffsetT\n    }\n\n    #[inline]\n    fn make_space(&mut self, want: usize) -> ReverseIndex {\n        self.ensure_capacity(want);\n        self.head -= want;\n        self.head\n    }\n\n    #[inline]\n    fn ensure_capacity(&mut self, want: usize) -> usize {\n        if self.unused_ready_space() >= want {\n            return want;\n        }\n        assert!(want <= FLATBUFFERS_MAX_BUFFER_SIZE, \"cannot grow buffer beyond 2 gigabytes\");\n\n        while self.unused_ready_space() < want {\n            self.grow_allocator();\n        }\n        want\n    }\n    #[inline]\n    fn unused_ready_space(&self) -> usize {\n        self.allocator.len() - self.head.distance_to_end()\n    }\n    #[inline]\n    fn assert_nested(&self, fn_name: &'static str) {\n        // we don't assert that self.field_locs.len() >0 because the vtable\n        // could be empty (e.g. for empty tables, or for all-default values).\n        debug_assert!(\n            self.nested,\n            \"incorrect FlatBufferBuilder usage: {} must be called while in a nested state\",\n            fn_name\n        );\n    }\n    #[inline]\n    fn assert_not_nested(&self, msg: &'static str) {\n        debug_assert!(!self.nested, \"{}\", msg);\n    }\n    #[inline]\n    fn assert_finished(&self, msg: &'static str) {\n        debug_assert!(self.finished, \"{}\", msg);\n    }\n    #[inline]\n    fn assert_not_finished(&self, msg: &'static str) {\n        debug_assert!(!self.finished, \"{}\", msg);\n    }\n}\n\n/// Compute the length of the vtable needed to represent the provided FieldLocs.\n/// If there are no FieldLocs, then provide the minimum number of bytes\n/// required: enough to write the VTable header.\n#[inline]\nfn get_vtable_byte_len(field_locs: &[FieldLoc]) -> usize {\n    let max_voffset = field_locs.iter().map(|fl| fl.id).max();\n    match max_voffset {\n        None => field_index_to_field_offset(0) as usize,\n        Some(mv) => mv as usize + SIZE_VOFFSET,\n    }\n}\n\n#[inline]\nfn padding_bytes(buf_size: usize, scalar_size: usize) -> usize {\n    // ((!buf_size) + 1) & (scalar_size - 1)\n    (!buf_size).wrapping_add(1) & (scalar_size.wrapping_sub(1))\n}\n\nimpl<'fbb> Default for FlatBufferBuilder<'fbb> {\n    fn default() -> Self {\n        Self::with_capacity(0)\n    }\n}\n\n/// An index that indexes from the reverse of a slice.\n///\n/// Note that while the internal representation is an index\n/// from the end of a buffer, operations like `Add` and `Sub`\n/// behave like a regular index:\n///\n/// # Examples\n///\n/// ```ignore\n/// let buf = [0, 1, 2, 3, 4, 5];\n/// let idx = ReverseIndex::end() - 2;\n/// assert_eq!(&buf[idx.range_to_end()], &[4, 5]);\n/// assert_eq!(idx.to_forward_index(&buf), 4);\n/// ```\n#[derive(Clone, Copy, Debug, Eq, PartialEq)]\nstruct ReverseIndex(usize);\n\nimpl ReverseIndex {\n    /// Returns an index set to the end.\n    ///\n    /// Note: Indexing this will result in an out of bounds error.\n    pub fn end() -> Self {\n        Self(0)\n    }\n\n    /// Returns a struct equivalent to the range `self..`\n    pub fn range_to_end(self) -> ReverseIndexRange {\n        ReverseIndexRange(self, ReverseIndex::end())\n    }\n\n    /// Returns a struct equivalent to the range `self..end`\n    pub fn range_to(self, end: ReverseIndex) -> ReverseIndexRange {\n        ReverseIndexRange(self, end)\n    }\n\n    /// Transforms this reverse index into a regular index for the given buffer.\n    pub fn to_forward_index<T>(self, buf: &[T]) -> usize {\n        buf.len() - self.0\n    }\n\n    /// Returns the number of elements until the end of the range.\n    pub fn distance_to_end(&self) -> usize {\n        self.0\n    }\n}\n\nimpl Sub<usize> for ReverseIndex {\n    type Output = Self;\n\n    fn sub(self, rhs: usize) -> Self::Output {\n        Self(self.0 + rhs)\n    }\n}\n\nimpl SubAssign<usize> for ReverseIndex {\n    fn sub_assign(&mut self, rhs: usize) {\n        *self = *self - rhs;\n    }\n}\n\nimpl Add<usize> for ReverseIndex {\n    type Output = Self;\n\n    fn add(self, rhs: usize) -> Self::Output {\n        Self(self.0 - rhs)\n    }\n}\n\nimpl AddAssign<usize> for ReverseIndex {\n    fn add_assign(&mut self, rhs: usize) {\n        *self = *self + rhs;\n    }\n}\nimpl<T> Index<ReverseIndex> for [T] {\n    type Output = T;\n\n    fn index(&self, index: ReverseIndex) -> &Self::Output {\n        let index = index.to_forward_index(self);\n        &self[index]\n    }\n}\n\nimpl<T> IndexMut<ReverseIndex> for [T] {\n    fn index_mut(&mut self, index: ReverseIndex) -> &mut Self::Output {\n        let index = index.to_forward_index(self);\n        &mut self[index]\n    }\n}\n\n#[derive(Clone, Copy, Debug, Eq, PartialEq)]\nstruct ReverseIndexRange(ReverseIndex, ReverseIndex);\n\nimpl<T> Index<ReverseIndexRange> for [T] {\n    type Output = [T];\n\n    fn index(&self, index: ReverseIndexRange) -> &Self::Output {\n        let start = index.0.to_forward_index(self);\n        let end = index.1.to_forward_index(self);\n        &self[start..end]\n    }\n}\n\nimpl<T> IndexMut<ReverseIndexRange> for [T] {\n    fn index_mut(&mut self, index: ReverseIndexRange) -> &mut Self::Output {\n        let start = index.0.to_forward_index(self);\n        let end = index.1.to_forward_index(self);\n        &mut self[start..end]\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use core::sync::atomic::{AtomicUsize, Ordering};\n    use std::alloc::{GlobalAlloc, Layout, System};\n\n    static ALLOC_COUNT: AtomicUsize = AtomicUsize::new(0);\n\n    struct CountingAllocator;\n\n    unsafe impl GlobalAlloc for CountingAllocator {\n        unsafe fn alloc(&self, layout: Layout) -> *mut u8 {\n            ALLOC_COUNT.fetch_add(1, Ordering::Relaxed);\n            unsafe { System.alloc(layout) }\n        }\n        unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {\n            unsafe { System.dealloc(ptr, layout) }\n        }\n    }\n\n    #[global_allocator]\n    static GLOBAL: CountingAllocator = CountingAllocator;\n\n    fn reset_alloc_count() {\n        ALLOC_COUNT.store(0, Ordering::Relaxed);\n    }\n\n    fn alloc_count() -> usize {\n        ALLOC_COUNT.load(Ordering::Relaxed)\n    }\n\n    #[test]\n    fn reverse_index_test() {\n        let buf = [0, 1, 2, 3, 4, 5];\n        let idx = ReverseIndex::end() - 2;\n        assert_eq!(&buf[idx.range_to_end()], &[4, 5]);\n        assert_eq!(&buf[idx.range_to(idx + 1)], &[4]);\n        assert_eq!(idx.to_forward_index(&buf), 4);\n    }\n\n    #[test]\n    fn with_internal_capacity_preallocates_vecs() {\n        let mut builder = FlatBufferBuilder::with_internal_capacity(64, 8, 16, 32);\n\n        assert!(builder.allocator.len() >= 64);\n        assert!(builder.field_locs.capacity() >= 8);\n        assert!(builder.written_vtable_revpos.capacity() >= 16);\n        assert!(builder.strings_pool.capacity() >= 32);\n\n        assert!(builder.field_locs.is_empty());\n        assert!(builder.written_vtable_revpos.is_empty());\n        assert!(builder.strings_pool.is_empty());\n\n        // Reset the allocation counter after builder construction\n        reset_alloc_count();\n\n        // Add a shared string and verify it lands in the pool\n        let s1 = builder.create_shared_string(\"hello\");\n        assert_eq!(builder.strings_pool.len(), 1);\n\n        // Adding the same string again should reuse the pooled entry\n        let s2 = builder.create_shared_string(\"hello\");\n        assert_eq!(builder.strings_pool.len(), 1);\n        assert_eq!(s1.value(), s2.value());\n\n        // A different string should add a new entry\n        let _s3 = builder.create_shared_string(\"world\");\n        assert_eq!(builder.strings_pool.len(), 2);\n\n        // With sufficient preallocated capacity, no additional allocations\n        // should have occurred for the internal vecs during the operations above\n        let allocs = alloc_count();\n        assert_eq!(\n            allocs, 0,\n            \"expected 0 allocations after builder construction, got {}\",\n            allocs\n        );\n    }\n}\n"
  },
  {
    "path": "rust/flatbuffers/src/endian_scalar.rs",
    "content": "/*\n * Copyright 2018 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#![allow(clippy::wrong_self_convention)]\n\nuse core::mem::size_of;\n\nmod private {\n    /// Types that are trivially transmutable are those where any combination of bits\n    /// represents a valid value of that type\n    ///\n    /// For example integral types are TriviallyTransmutable as all bit patterns are valid,\n    /// however, `bool` is not trivially transmutable as only `0` and `1` are valid\n    pub trait TriviallyTransmutable {}\n\n    impl TriviallyTransmutable for i8 {}\n    impl TriviallyTransmutable for i16 {}\n    impl TriviallyTransmutable for i32 {}\n    impl TriviallyTransmutable for i64 {}\n    impl TriviallyTransmutable for u8 {}\n    impl TriviallyTransmutable for u16 {}\n    impl TriviallyTransmutable for u32 {}\n    impl TriviallyTransmutable for u64 {}\n}\n\n/// Trait for values that must be stored in little-endian byte order, but\n/// might be represented in memory as big-endian. Every type that implements\n/// EndianScalar is a valid FlatBuffers scalar value.\n///\n/// The Rust stdlib does not provide a trait to represent scalars, so this trait\n/// serves that purpose, too.\n///\n/// Note that we do not use the num-traits crate for this, because it provides\n/// \"too much\". For example, num-traits provides i128 support, but that is an\n/// invalid FlatBuffers type.\npub trait EndianScalar: Sized + PartialEq + Copy + Clone {\n    type Scalar: private::TriviallyTransmutable;\n\n    fn to_little_endian(self) -> Self::Scalar;\n\n    fn from_little_endian(v: Self::Scalar) -> Self;\n}\n\n/// Macro for implementing an endian conversion using the stdlib `to_le` and\n/// `from_le` functions. This is used for integer types. It is not used for\n/// floats, because the `to_le` and `from_le` are not implemented for them in\n/// the stdlib.\nmacro_rules! impl_endian_scalar {\n    ($ty:ident) => {\n        impl EndianScalar for $ty {\n            type Scalar = Self;\n\n            #[inline]\n            fn to_little_endian(self) -> Self::Scalar {\n                Self::to_le(self)\n            }\n            #[inline]\n            fn from_little_endian(v: Self::Scalar) -> Self {\n                Self::from_le(v)\n            }\n        }\n    };\n}\n\nimpl_endian_scalar!(u8);\nimpl_endian_scalar!(i8);\nimpl_endian_scalar!(u16);\nimpl_endian_scalar!(u32);\nimpl_endian_scalar!(u64);\nimpl_endian_scalar!(i16);\nimpl_endian_scalar!(i32);\nimpl_endian_scalar!(i64);\n\nimpl EndianScalar for bool {\n    type Scalar = u8;\n\n    fn to_little_endian(self) -> Self::Scalar {\n        self as u8\n    }\n\n    fn from_little_endian(v: Self::Scalar) -> Self {\n        v != 0\n    }\n}\n\nimpl EndianScalar for f32 {\n    type Scalar = u32;\n    /// Convert f32 from host endian-ness to little-endian.\n    #[inline]\n    fn to_little_endian(self) -> u32 {\n        // Floats and Ints have the same endianness on all supported platforms.\n        // <https://doc.rust-lang.org/std/primitive.f32.html#method.from_bits>\n        self.to_bits().to_le()\n    }\n    /// Convert f32 from little-endian to host endian-ness.\n    #[inline]\n    fn from_little_endian(v: u32) -> Self {\n        // Floats and Ints have the same endianness on all supported platforms.\n        // <https://doc.rust-lang.org/std/primitive.f32.html#method.from_bits>\n        f32::from_bits(u32::from_le(v))\n    }\n}\n\nimpl EndianScalar for f64 {\n    type Scalar = u64;\n\n    /// Convert f64 from host endian-ness to little-endian.\n    #[inline]\n    fn to_little_endian(self) -> u64 {\n        // Floats and Ints have the same endianness on all supported platforms.\n        // <https://doc.rust-lang.org/std/primitive.f64.html#method.from_bits>\n        self.to_bits().to_le()\n    }\n    /// Convert f64 from little-endian to host endian-ness.\n    #[inline]\n    fn from_little_endian(v: u64) -> Self {\n        // Floats and Ints have the same endianness on all supported platforms.\n        // <https://doc.rust-lang.org/std/primitive.f64.html#method.from_bits>\n        f64::from_bits(u64::from_le(v))\n    }\n}\n\n/// Place an EndianScalar into the provided mutable byte slice. Performs\n/// endian conversion, if necessary.\n/// # Safety\n/// Caller must ensure `s.len() >= size_of::<T>()`\n#[inline]\npub unsafe fn emplace_scalar<T: EndianScalar>(s: &mut [u8], x: T) {\n    let size = size_of::<T::Scalar>();\n    debug_assert!(\n        s.len() >= size,\n        \"insufficient capacity for emplace_scalar, needed {} got {}\",\n        size,\n        s.len()\n    );\n\n    let x_le = x.to_little_endian();\n    core::ptr::copy_nonoverlapping(\n        &x_le as *const T::Scalar as *const u8,\n        s.as_mut_ptr() as *mut u8,\n        size,\n    );\n}\n\n/// Read an EndianScalar from the provided byte slice at the specified location.\n/// Performs endian conversion, if necessary.\n/// # Safety\n/// Caller must ensure `s.len() >= loc + size_of::<T>()`.\n#[inline]\npub unsafe fn read_scalar_at<T: EndianScalar>(s: &[u8], loc: usize) -> T {\n    read_scalar(&s[loc..])\n}\n\n/// Read an EndianScalar from the provided byte slice. Performs endian\n/// conversion, if necessary.\n/// # Safety\n/// Caller must ensure `s.len() > size_of::<T>()`.\n#[inline]\npub unsafe fn read_scalar<T: EndianScalar>(s: &[u8]) -> T {\n    let size = size_of::<T::Scalar>();\n    debug_assert!(\n        s.len() >= size,\n        \"insufficient capacity for emplace_scalar, needed {} got {}\",\n        size,\n        s.len()\n    );\n\n    let mut mem = core::mem::MaybeUninit::<T::Scalar>::uninit();\n    // Since [u8] has alignment 1, we copy it into T which may have higher alignment.\n    core::ptr::copy_nonoverlapping(s.as_ptr(), mem.as_mut_ptr() as *mut u8, size);\n    T::from_little_endian(mem.assume_init())\n}\n"
  },
  {
    "path": "rust/flatbuffers/src/follow.rs",
    "content": "/*\n * Copyright 2018 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nuse core::marker::PhantomData;\n\n/// Follow is a trait that allows us to access FlatBuffers in a declarative,\n/// type safe, and fast way. They compile down to almost no code (after\n/// optimizations). Conceptually, Follow lifts the offset-based access\n/// patterns of FlatBuffers data into the type system. This trait is used\n/// pervasively at read time, to access tables, vtables, vectors, strings, and\n/// all other data. At this time, Follow is not utilized much on the write\n/// path.\n///\n/// Writing a new Follow implementation primarily involves deciding whether\n/// you want to return data (of the type Self::Inner) or do you want to\n/// continue traversing the FlatBuffer.\npub trait Follow<'buf> {\n    type Inner;\n    /// # Safety\n    ///\n    /// `buf[loc..]` must contain a valid value of `Self` and anything it\n    /// transitively refers to by offset must also be valid\n    unsafe fn follow(buf: &'buf [u8], loc: usize) -> Self::Inner;\n}\n\n/// FollowStart wraps a Follow impl in a struct type. This can make certain\n/// programming patterns more ergonomic.\n#[derive(Debug, Default)]\npub struct FollowStart<T>(PhantomData<T>);\nimpl<'a, T: Follow<'a> + 'a> FollowStart<T> {\n    #[inline]\n    pub fn new() -> Self {\n        Self(PhantomData)\n    }\n\n    /// # Safety\n    ///\n    /// `buf[loc..]` must contain a valid value of `T`\n    #[inline]\n    pub unsafe fn self_follow(&'a self, buf: &'a [u8], loc: usize) -> T::Inner {\n        T::follow(buf, loc)\n    }\n}\nimpl<'a, T: Follow<'a>> Follow<'a> for FollowStart<T> {\n    type Inner = T::Inner;\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        T::follow(buf, loc)\n    }\n}\n"
  },
  {
    "path": "rust/flatbuffers/src/get_root.rs",
    "content": "/*\n * Copyright 2020 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nuse crate::{\n    Follow, ForwardsUOffset, InvalidFlatbuffer, SkipSizePrefix, Verifiable, Verifier,\n    VerifierOptions,\n};\n\n/// Gets the root of the Flatbuffer, verifying it first with default options.\n/// Note that verification is an experimental feature and may not be maximally performant or\n/// catch every error (though that is the goal). See the `_unchecked` variants for previous\n/// behavior.\npub fn root<'buf, T>(data: &'buf [u8]) -> Result<T::Inner, InvalidFlatbuffer>\nwhere\n    T: 'buf + Follow<'buf> + Verifiable,\n{\n    let opts = VerifierOptions::default();\n    root_with_opts::<T>(&opts, data)\n}\n\n#[inline]\n/// Gets the root of the Flatbuffer, verifying it first with given options.\n/// Note that verification is an experimental feature and may not be maximally performant or\n/// catch every error (though that is the goal). See the `_unchecked` variants for previous\n/// behavior.\npub fn root_with_opts<'opts, 'buf, T>(\n    opts: &'opts VerifierOptions,\n    data: &'buf [u8],\n) -> Result<T::Inner, InvalidFlatbuffer>\nwhere\n    T: 'buf + Follow<'buf> + Verifiable,\n{\n    let mut v = Verifier::new(opts, data);\n    <ForwardsUOffset<T>>::run_verifier(&mut v, 0)?;\n    // Safety:\n    // Run verifier above\n    Ok(unsafe { root_unchecked::<T>(data) })\n}\n\n#[inline]\n/// Gets the root of a size prefixed Flatbuffer, verifying it first with default options.\n/// Note that verification is an experimental feature and may not be maximally performant or\n/// catch every error (though that is the goal). See the `_unchecked` variants for previous\n/// behavior.\npub fn size_prefixed_root<'buf, T>(data: &'buf [u8]) -> Result<T::Inner, InvalidFlatbuffer>\nwhere\n    T: 'buf + Follow<'buf> + Verifiable,\n{\n    let opts = VerifierOptions::default();\n    size_prefixed_root_with_opts::<T>(&opts, data)\n}\n\n#[inline]\n/// Gets the root of a size prefixed Flatbuffer, verifying it first with given options.\n/// Note that verification is an experimental feature and may not be maximally performant or\n/// catch every error (though that is the goal). See the `_unchecked` variants for previous\n/// behavior.\npub fn size_prefixed_root_with_opts<'opts, 'buf, T>(\n    opts: &'opts VerifierOptions,\n    data: &'buf [u8],\n) -> Result<T::Inner, InvalidFlatbuffer>\nwhere\n    T: 'buf + Follow<'buf> + Verifiable,\n{\n    let mut v = Verifier::new(opts, data);\n    <SkipSizePrefix<ForwardsUOffset<T>>>::run_verifier(&mut v, 0)?;\n    // Safety:\n    // Run verifier above\n    Ok(unsafe { size_prefixed_root_unchecked::<T>(data) })\n}\n\n#[inline]\n/// Gets root for a trusted Flatbuffer.\n/// # Safety\n/// Flatbuffers accessors do not perform validation checks before accessing. Unlike the other\n/// `root` functions, this does not validate the flatbuffer before returning the accessor. Users\n/// must trust `data` contains a valid flatbuffer (e.g. b/c it was built by your software). Reading\n/// unchecked buffers may cause panics or even UB.\npub unsafe fn root_unchecked<'buf, T>(data: &'buf [u8]) -> T::Inner\nwhere\n    T: Follow<'buf> + 'buf,\n{\n    <ForwardsUOffset<T>>::follow(data, 0)\n}\n\n#[inline]\n/// Gets root for a trusted, size prefixed, Flatbuffer.\n/// # Safety\n/// Flatbuffers accessors do not perform validation checks before accessing. Unlike the other\n/// `root` functions, this does not validate the flatbuffer before returning the accessor. Users\n/// must trust `data` contains a valid flatbuffer (e.g. b/c it was built by your software). Reading\n/// unchecked buffers may cause panics or even UB.\npub unsafe fn size_prefixed_root_unchecked<'buf, T>(data: &'buf [u8]) -> T::Inner\nwhere\n    T: Follow<'buf> + 'buf,\n{\n    <SkipSizePrefix<ForwardsUOffset<T>>>::follow(data, 0)\n}\n"
  },
  {
    "path": "rust/flatbuffers/src/lib.rs",
    "content": "/*\n * Copyright 2018 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//! # FlatBuffers\n//!\n//! A library for memory-efficient serialization of data.\n//!\n//! This crate provides runtime support for the FlatBuffers format in the Rust programming language.\n//! To use this crate, first generate code with the `flatc` compiler, as described here: <https://google.github.io/flatbuffers/>\n//! Then, include that code into your project.\n//! Finally, add this crate to your `Cargo.toml`.\n//!\n//! At this time, Rust support is experimental, and APIs may change between minor versions.\n//!\n//! At this time, to generate Rust code, you will need the latest `master` version of `flatc`, available from here: <https://github.com/google/flatbuffers>\n//! (On OSX, you can install FlatBuffers from `HEAD` with the Homebrew package manager.)\n\n#![cfg_attr(not(feature = \"std\"), no_std)]\n#![cfg_attr(all(nightly, not(feature = \"std\")), feature(error_in_core))]\n#![cfg_attr(nightly, feature(trusted_len))]\n\n#[cfg(not(feature = \"std\"))]\nextern crate alloc;\n\nmod array;\nmod builder;\nmod endian_scalar;\nmod follow;\nmod get_root;\nmod primitives;\nmod push;\nmod table;\nmod vector;\nmod verifier;\nmod vtable;\nmod vtable_writer;\n\npub use crate::array::{array_init, emplace_scalar_array, Array};\npub use crate::builder::{Allocator, DefaultAllocator, FlatBufferBuilder};\npub use crate::endian_scalar::{emplace_scalar, read_scalar, read_scalar_at, EndianScalar};\npub use crate::follow::{Follow, FollowStart};\npub use crate::primitives::*;\npub use crate::push::{Push, PushAlignment};\npub use crate::table::{buffer_has_identifier, Table};\npub use crate::vector::{follow_cast_ref, Vector, VectorIter};\npub use crate::verifier::{\n    ErrorTraceDetail, InvalidFlatbuffer, SimpleToVerifyInSlice, TableVerifier, Verifiable,\n    Verifier, VerifierOptions,\n};\npub use crate::vtable::field_index_to_field_offset;\npub use bitflags;\npub use get_root::*;\n\n// TODO(rw): Split fill ops in builder into fill_small, fill_big like in C++.\n"
  },
  {
    "path": "rust/flatbuffers/src/primitives.rs",
    "content": "/*\n * Copyright 2018 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nuse core::marker::PhantomData;\nuse core::mem::size_of;\nuse core::ops::Deref;\n\nuse crate::endian_scalar::{emplace_scalar, read_scalar, read_scalar_at};\nuse crate::follow::Follow;\nuse crate::push::Push;\n\npub const FLATBUFFERS_MAX_BUFFER_SIZE: usize = (1u64 << 31) as usize;\n\npub const FILE_IDENTIFIER_LENGTH: usize = 4;\n\npub const VTABLE_METADATA_FIELDS: usize = 2;\n\npub const SIZE_U8: usize = size_of::<u8>();\npub const SIZE_I8: usize = size_of::<i8>();\n\npub const SIZE_U16: usize = size_of::<u16>();\npub const SIZE_I16: usize = size_of::<i16>();\n\npub const SIZE_U32: usize = size_of::<u32>();\npub const SIZE_I32: usize = size_of::<i32>();\n\npub const SIZE_U64: usize = size_of::<u64>();\npub const SIZE_I64: usize = size_of::<i64>();\n\npub const SIZE_F32: usize = size_of::<f32>();\npub const SIZE_F64: usize = size_of::<f64>();\n\npub const SIZE_SOFFSET: usize = SIZE_I32;\npub const SIZE_UOFFSET: usize = SIZE_U32;\npub const SIZE_VOFFSET: usize = SIZE_I16;\n\npub const SIZE_SIZEPREFIX: usize = SIZE_UOFFSET;\n\n/// SOffsetT is a relative pointer from tables to their vtables.\npub type SOffsetT = i32;\n\n/// UOffsetT is used represent both for relative pointers and lengths of vectors.\npub type UOffsetT = u32;\n\n/// VOffsetT is a relative pointer in vtables to point from tables to field data.\npub type VOffsetT = u16;\n\n/// TableFinishedWIPOffset marks a WIPOffset as being for a finished table.\n#[derive(Clone, Copy)]\npub struct TableFinishedWIPOffset {}\n\n/// TableUnfinishedWIPOffset marks a WIPOffset as being for an unfinished table.\n#[derive(Clone, Copy)]\npub struct TableUnfinishedWIPOffset {}\n\n/// UnionWIPOffset marks a WIPOffset as being for a union value.\n#[derive(Clone, Copy)]\npub struct UnionWIPOffset {}\n\n/// VTableWIPOffset marks a WIPOffset as being for a vtable.\n#[derive(Clone, Copy)]\npub struct VTableWIPOffset {}\n\n/// WIPOffset contains an UOffsetT with a special meaning: it is the location of\n/// data relative to the *end* of an in-progress FlatBuffer. The\n/// FlatBufferBuilder uses this to track the location of objects in an absolute\n/// way. The impl of Push converts a WIPOffset into a ForwardsUOffset.\n#[derive(Debug)]\npub struct WIPOffset<T>(UOffsetT, PhantomData<T>);\n\n// We cannot use derive for these two impls, as the derived impls would only\n// implement `Copy` and `Clone` for `T: Copy` and `T: Clone` respectively.\n// However `WIPOffset<T>` can always be copied, no matter that `T` you\n// have.\nimpl<T> Copy for WIPOffset<T> {}\nimpl<T> Clone for WIPOffset<T> {\n    #[inline(always)]\n    fn clone(&self) -> Self {\n        *self\n    }\n}\n\nimpl<T> Eq for WIPOffset<T> {}\n\nimpl<T> PartialEq for WIPOffset<T> {\n    fn eq(&self, o: &WIPOffset<T>) -> bool {\n        self.value() == o.value()\n    }\n}\n\nimpl<T> Deref for WIPOffset<T> {\n    type Target = UOffsetT;\n    #[inline]\n    fn deref(&self) -> &UOffsetT {\n        &self.0\n    }\n}\nimpl<'a, T: 'a> WIPOffset<T> {\n    /// Create a new WIPOffset.\n    #[inline]\n    pub fn new(o: UOffsetT) -> WIPOffset<T> {\n        WIPOffset(o, PhantomData)\n    }\n\n    /// Return a wrapped value that brings its meaning as a union WIPOffset\n    /// into the type system.\n    #[inline(always)]\n    pub fn as_union_value(self) -> WIPOffset<UnionWIPOffset> {\n        WIPOffset::new(self.0)\n    }\n    /// Get the underlying value.\n    #[inline(always)]\n    pub fn value(self) -> UOffsetT {\n        self.0\n    }\n}\n\nimpl<T> Push for WIPOffset<T> {\n    type Output = ForwardsUOffset<T>;\n\n    #[inline(always)]\n    unsafe fn push(&self, dst: &mut [u8], written_len: usize) {\n        let n = (SIZE_UOFFSET + written_len - self.value() as usize) as UOffsetT;\n        emplace_scalar::<UOffsetT>(dst, n);\n    }\n}\n\nimpl<T> Push for ForwardsUOffset<T> {\n    type Output = Self;\n\n    #[inline(always)]\n    unsafe fn push(&self, dst: &mut [u8], written_len: usize) {\n        self.value().push(dst, written_len);\n    }\n}\n\n/// ForwardsUOffset is used by Follow to traverse a FlatBuffer: the pointer\n/// is incremented by the value contained in this type.\n#[derive(Debug)]\npub struct ForwardsUOffset<T>(UOffsetT, PhantomData<T>);\n\n// We cannot use derive for these two impls, as the derived impls would only\n// implement `Copy` and `Clone` for `T: Copy` and `T: Clone` respectively.\n// However `ForwardsUOffset<T>` can always be copied, no matter that `T` you\n// have.\nimpl<T> Copy for ForwardsUOffset<T> {}\nimpl<T> Clone for ForwardsUOffset<T> {\n    #[inline(always)]\n    fn clone(&self) -> Self {\n        *self\n    }\n}\n\nimpl<T> ForwardsUOffset<T> {\n    #[inline(always)]\n    pub fn value(self) -> UOffsetT {\n        self.0\n    }\n}\n\nimpl<'a, T: Follow<'a>> Follow<'a> for ForwardsUOffset<T> {\n    type Inner = T::Inner;\n    #[inline(always)]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let slice = &buf[loc..loc + SIZE_UOFFSET];\n        let off = read_scalar::<u32>(slice) as usize;\n        T::follow(buf, loc + off)\n    }\n}\n\n/// ForwardsVOffset is used by Follow to traverse a FlatBuffer: the pointer\n/// is incremented by the value contained in this type.\n#[derive(Debug)]\npub struct ForwardsVOffset<T>(VOffsetT, PhantomData<T>);\nimpl<T> ForwardsVOffset<T> {\n    #[inline(always)]\n    pub fn value(&self) -> VOffsetT {\n        self.0\n    }\n}\n\nimpl<'a, T: Follow<'a>> Follow<'a> for ForwardsVOffset<T> {\n    type Inner = T::Inner;\n    #[inline(always)]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let slice = &buf[loc..loc + SIZE_VOFFSET];\n        let off = read_scalar::<VOffsetT>(slice) as usize;\n        T::follow(buf, loc + off)\n    }\n}\n\nimpl<T> Push for ForwardsVOffset<T> {\n    type Output = Self;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], written_len: usize) {\n        self.value().push(dst, written_len);\n    }\n}\n\n/// ForwardsSOffset is used by Follow to traverse a FlatBuffer: the pointer\n/// is incremented by the *negative* of the value contained in this type.\n#[derive(Debug)]\npub struct BackwardsSOffset<T>(SOffsetT, PhantomData<T>);\nimpl<T> BackwardsSOffset<T> {\n    #[inline(always)]\n    pub fn value(&self) -> SOffsetT {\n        self.0\n    }\n}\n\nimpl<'a, T: Follow<'a>> Follow<'a> for BackwardsSOffset<T> {\n    type Inner = T::Inner;\n    #[inline(always)]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let slice = &buf[loc..loc + SIZE_SOFFSET];\n        let off = read_scalar::<SOffsetT>(slice);\n        T::follow(buf, (loc as SOffsetT - off) as usize)\n    }\n}\n\nimpl<T> Push for BackwardsSOffset<T> {\n    type Output = Self;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], written_len: usize) {\n        self.value().push(dst, written_len);\n    }\n}\n\n/// SkipSizePrefix is used by Follow to traverse a FlatBuffer: the pointer is\n/// incremented by a fixed constant in order to skip over the size prefix value.\npub struct SkipSizePrefix<T>(PhantomData<T>);\nimpl<'a, T: Follow<'a> + 'a> Follow<'a> for SkipSizePrefix<T> {\n    type Inner = T::Inner;\n    #[inline(always)]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        T::follow(buf, loc + SIZE_SIZEPREFIX)\n    }\n}\n\n/// SkipRootOffset is used by Follow to traverse a FlatBuffer: the pointer is\n/// incremented by a fixed constant in order to skip over the root offset value.\npub struct SkipRootOffset<T>(PhantomData<T>);\nimpl<'a, T: Follow<'a> + 'a> Follow<'a> for SkipRootOffset<T> {\n    type Inner = T::Inner;\n    #[inline(always)]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        T::follow(buf, loc + SIZE_UOFFSET)\n    }\n}\n\n/// FileIdentifier is used by Follow to traverse a FlatBuffer: the pointer is\n/// dereferenced into a byte slice, whose bytes are the file identifer value.\npub struct FileIdentifier;\nimpl<'a> Follow<'a> for FileIdentifier {\n    type Inner = &'a [u8];\n    #[inline(always)]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        &buf[loc..loc + FILE_IDENTIFIER_LENGTH]\n    }\n}\n\n/// SkipFileIdentifier is used by Follow to traverse a FlatBuffer: the pointer\n/// is incremented by a fixed constant in order to skip over the file\n/// identifier value.\npub struct SkipFileIdentifier<T>(PhantomData<T>);\nimpl<'a, T: Follow<'a> + 'a> Follow<'a> for SkipFileIdentifier<T> {\n    type Inner = T::Inner;\n    #[inline(always)]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        T::follow(buf, loc + FILE_IDENTIFIER_LENGTH)\n    }\n}\n\nimpl<'a> Follow<'a> for bool {\n    type Inner = bool;\n    #[inline(always)]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        read_scalar_at::<u8>(buf, loc) != 0\n    }\n}\n\n/// Follow trait impls for primitive types.\n///\n/// Ideally, these would be implemented as a single impl using trait bounds on\n/// EndianScalar, but implementing Follow that way causes a conflict with\n/// other impls.\nmacro_rules! impl_follow_for_endian_scalar {\n    ($ty:ident) => {\n        impl<'a> Follow<'a> for $ty {\n            type Inner = $ty;\n            #[inline(always)]\n            unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n                read_scalar_at::<$ty>(buf, loc)\n            }\n        }\n    };\n}\n\nimpl_follow_for_endian_scalar!(u8);\nimpl_follow_for_endian_scalar!(u16);\nimpl_follow_for_endian_scalar!(u32);\nimpl_follow_for_endian_scalar!(u64);\nimpl_follow_for_endian_scalar!(i8);\nimpl_follow_for_endian_scalar!(i16);\nimpl_follow_for_endian_scalar!(i32);\nimpl_follow_for_endian_scalar!(i64);\nimpl_follow_for_endian_scalar!(f32);\nimpl_follow_for_endian_scalar!(f64);\n"
  },
  {
    "path": "rust/flatbuffers/src/push.rs",
    "content": "/*\n * Copyright 2018 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nuse core::cmp::max;\nuse core::mem::{align_of, size_of};\n\nuse crate::endian_scalar::emplace_scalar;\n\n/// Trait to abstract over functionality needed to write values (either owned\n/// or referenced). Used in FlatBufferBuilder and implemented for generated\n/// types.\npub trait Push: Sized {\n    type Output;\n\n    /// # Safety\n    ///\n    /// dst is aligned to [`Self::alignment`] and has length greater than or equal to [`Self::size`]\n    unsafe fn push(&self, dst: &mut [u8], written_len: usize);\n    #[inline]\n    fn size() -> usize {\n        size_of::<Self::Output>()\n    }\n    #[inline]\n    fn alignment() -> PushAlignment {\n        PushAlignment::new(align_of::<Self::Output>())\n    }\n}\n\nimpl<'a, T: Push> Push for &'a T {\n    type Output = T::Output;\n\n    unsafe fn push(&self, dst: &mut [u8], written_len: usize) {\n        T::push(self, dst, written_len)\n    }\n\n    fn size() -> usize {\n        T::size()\n    }\n\n    fn alignment() -> PushAlignment {\n        T::alignment()\n    }\n}\n\n/// Ensure Push alignment calculations are typesafe (because this helps reduce\n/// implementation issues when using FlatBufferBuilder::align).\npub struct PushAlignment(usize);\nimpl PushAlignment {\n    #[inline]\n    pub fn new(x: usize) -> Self {\n        PushAlignment(x)\n    }\n    #[inline]\n    pub fn value(&self) -> usize {\n        self.0\n    }\n    #[inline]\n    pub fn max_of(&self, o: usize) -> Self {\n        PushAlignment::new(max(self.0, o))\n    }\n}\n\n/// Macro to implement Push for EndianScalar types.\nmacro_rules! impl_push_for_endian_scalar {\n    ($ty:ident) => {\n        impl Push for $ty {\n            type Output = $ty;\n\n            #[inline]\n            unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n                emplace_scalar::<$ty>(dst, *self);\n            }\n        }\n    };\n}\n\nimpl_push_for_endian_scalar!(bool);\nimpl_push_for_endian_scalar!(u8);\nimpl_push_for_endian_scalar!(i8);\nimpl_push_for_endian_scalar!(u16);\nimpl_push_for_endian_scalar!(i16);\nimpl_push_for_endian_scalar!(u32);\nimpl_push_for_endian_scalar!(i32);\nimpl_push_for_endian_scalar!(u64);\nimpl_push_for_endian_scalar!(i64);\nimpl_push_for_endian_scalar!(f32);\nimpl_push_for_endian_scalar!(f64);\n"
  },
  {
    "path": "rust/flatbuffers/src/table.rs",
    "content": "/*\n * Copyright 2018 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nuse crate::follow::Follow;\nuse crate::primitives::*;\nuse crate::vtable::VTable;\n\n#[derive(Clone, Copy, Debug, PartialEq, Eq)]\npub struct Table<'a> {\n    buf: &'a [u8],\n    loc: usize,\n}\n\nimpl<'a> Table<'a> {\n    #[inline]\n    pub fn buf(&self) -> &'a [u8] {\n        self.buf\n    }\n\n    #[inline]\n    pub fn loc(&self) -> usize {\n        self.loc\n    }\n\n    /// # Safety\n    ///\n    /// `buf` must contain a `soffset_t` at `loc`, which points to a valid vtable\n    #[inline]\n    pub unsafe fn new(buf: &'a [u8], loc: usize) -> Self {\n        Table { buf, loc }\n    }\n\n    #[inline]\n    pub fn vtable(&self) -> VTable<'a> {\n        // Safety:\n        // Table::new is created with a valid buf and location\n        unsafe { <BackwardsSOffset<VTable<'a>>>::follow(self.buf, self.loc) }\n    }\n\n    /// Retrieves the value at the provided `slot_byte_loc` returning `default`\n    /// if no value present\n    ///\n    /// # Safety\n    ///\n    /// The value of the corresponding slot must have type T\n    #[inline]\n    pub unsafe fn get<T: Follow<'a> + 'a>(\n        &self,\n        slot_byte_loc: VOffsetT,\n        default: Option<T::Inner>,\n    ) -> Option<T::Inner> {\n        let o = self.vtable().get(slot_byte_loc) as usize;\n        if o == 0 {\n            return default;\n        }\n        Some(<T>::follow(self.buf, self.loc + o))\n    }\n}\n\nimpl<'a> Follow<'a> for Table<'a> {\n    type Inner = Table<'a>;\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Table { buf, loc }\n    }\n}\n\n/// Returns true if data contains a prefix of `ident`\n#[inline]\npub fn buffer_has_identifier(data: &[u8], ident: &str, size_prefixed: bool) -> bool {\n    assert_eq!(ident.len(), FILE_IDENTIFIER_LENGTH);\n\n    let got = if size_prefixed {\n        assert!(data.len() >= SIZE_SIZEPREFIX + SIZE_UOFFSET + FILE_IDENTIFIER_LENGTH);\n        // Safety:\n        // Verified data has sufficient bytes\n        unsafe { <SkipSizePrefix<SkipRootOffset<FileIdentifier>>>::follow(data, 0) }\n    } else {\n        assert!(data.len() >= SIZE_UOFFSET + FILE_IDENTIFIER_LENGTH);\n        // Safety:\n        // Verified data has sufficient bytes\n        unsafe { <SkipRootOffset<FileIdentifier>>::follow(data, 0) }\n    };\n\n    ident.as_bytes() == got\n}\n"
  },
  {
    "path": "rust/flatbuffers/src/vector.rs",
    "content": "/*\n * Copyright 2018 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nuse core::cmp::Ordering;\nuse core::fmt::{Debug, Formatter, Result};\nuse core::iter::{DoubleEndedIterator, ExactSizeIterator, FusedIterator};\n#[cfg(nightly)]\nuse core::iter::TrustedLen;\nuse core::marker::PhantomData;\nuse core::mem::{align_of, size_of};\nuse core::str::from_utf8_unchecked;\n\nuse crate::endian_scalar::read_scalar_at;\nuse crate::follow::Follow;\nuse crate::primitives::*;\n\npub struct Vector<'a, T: 'a>(&'a [u8], usize, PhantomData<T>);\n\nimpl<'a, T: 'a> Default for Vector<'a, T> {\n    fn default() -> Self {\n        // Static, length 0 vector.\n        // Note that derived default causes UB due to issues in read_scalar_at /facepalm.\n        Self(&[0; core::mem::size_of::<UOffsetT>()], 0, Default::default())\n    }\n}\n\nimpl<'a, T> Debug for Vector<'a, T>\nwhere\n    T: 'a + Follow<'a>,\n    <T as Follow<'a>>::Inner: Debug,\n{\n    fn fmt(&self, f: &mut Formatter) -> Result {\n        f.debug_list().entries(self.iter()).finish()\n    }\n}\n\n// We cannot use derive for these two impls, as it would only implement Copy\n// and Clone for `T: Copy` and `T: Clone` respectively. However `Vector<'a, T>`\n// can always be copied, no matter that `T` you have.\nimpl<'a, T> Copy for Vector<'a, T> {}\n\nimpl<'a, T> Clone for Vector<'a, T> {\n    fn clone(&self) -> Self {\n        *self\n    }\n}\n\nimpl<'a, T: 'a> Vector<'a, T> {\n    /// # Safety\n    ///\n    /// `buf` contains a valid vector at `loc` consisting of\n    ///\n    /// - UOffsetT element count\n    /// - Consecutive list of `T` elements\n    #[inline(always)]\n    pub unsafe fn new(buf: &'a [u8], loc: usize) -> Self {\n        Vector(buf, loc, PhantomData)\n    }\n\n    #[inline(always)]\n    pub fn len(&self) -> usize {\n        // Safety:\n        // Valid vector at time of construction starting with UOffsetT element count\n        unsafe { read_scalar_at::<UOffsetT>(self.0, self.1) as usize }\n    }\n\n    #[inline(always)]\n    pub fn is_empty(&self) -> bool {\n        self.len() == 0\n    }\n\n    #[inline(always)]\n    pub fn bytes(&self) -> &'a [u8] {\n        let sz = size_of::<T>();\n        let len = self.len();\n        &self.0[self.1 + SIZE_UOFFSET..self.1 + SIZE_UOFFSET + sz * len]\n    }\n}\n\nimpl<'a, T: Follow<'a> + 'a> Vector<'a, T> {\n    #[inline(always)]\n    pub fn get(&self, idx: usize) -> T::Inner {\n        assert!(idx < self.len());\n        let sz = size_of::<T>();\n        debug_assert!(sz > 0);\n        // Safety:\n        // Valid vector at time of construction, verified that idx < element count\n        unsafe { T::follow(self.0, self.1 as usize + SIZE_UOFFSET + sz * idx) }\n    }\n\n    #[inline(always)]\n    pub fn lookup_by_key<K: Ord>(\n        &self,\n        key: K,\n        f: fn(&<T as Follow<'a>>::Inner, &K) -> Ordering,\n    ) -> Option<T::Inner> {\n        self.lookup_index_by_key(key, f).map(|idx| self.get(idx))\n    }\n\n    /// Binary search by key, returning the index of the matching element.\n    ///\n    /// This is similar to `lookup_by_key`, but returns the index of the found\n    /// element rather than the element itself. This is useful when you need\n    /// to reference elements by their position in the vector.\n    #[inline(always)]\n    pub fn lookup_index_by_key<K: Ord>(\n        &self,\n        key: K,\n        f: fn(&<T as Follow<'a>>::Inner, &K) -> Ordering,\n    ) -> Option<usize> {\n        if self.is_empty() {\n            return None;\n        }\n\n        let mut left: usize = 0;\n        let mut right = self.len() - 1;\n\n        while left <= right {\n            let mid = (left + right) / 2;\n            let value = self.get(mid);\n            match f(&value, &key) {\n                Ordering::Equal => return Some(mid),\n                Ordering::Less => left = mid + 1,\n                Ordering::Greater => {\n                    if mid == 0 {\n                        return None;\n                    }\n                    right = mid - 1;\n                }\n            }\n        }\n\n        None\n    }\n\n    #[inline(always)]\n    pub fn iter(&self) -> VectorIter<'a, T> {\n        VectorIter::from_vector(*self)\n    }\n}\n\n/// # Safety\n///\n/// `buf` must contain a value of T at `loc` and have alignment of 1\npub unsafe fn follow_cast_ref<'a, T: Sized + 'a>(buf: &'a [u8], loc: usize) -> &'a T {\n    assert_eq!(align_of::<T>(), 1);\n    let sz = size_of::<T>();\n    let buf = &buf[loc..loc + sz];\n    let ptr = buf.as_ptr() as *const T;\n    // SAFETY\n    // buf contains a value at loc of type T and T has no alignment requirements\n    &*ptr\n}\n\nimpl<'a> Follow<'a> for &'a str {\n    type Inner = &'a str;\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let len = read_scalar_at::<UOffsetT>(buf, loc) as usize;\n        let slice = &buf[loc + SIZE_UOFFSET..loc + SIZE_UOFFSET + len];\n        from_utf8_unchecked(slice)\n    }\n}\n\nimpl<'a> Follow<'a> for &'a [u8] {\n    type Inner = &'a [u8];\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let len = read_scalar_at::<UOffsetT>(buf, loc) as usize;\n        &buf[loc + SIZE_UOFFSET..loc + SIZE_UOFFSET + len]\n    }\n}\n\n/// Implement Follow for all possible Vectors that have Follow-able elements.\nimpl<'a, T: Follow<'a> + 'a> Follow<'a> for Vector<'a, T> {\n    type Inner = Vector<'a, T>;\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Vector::new(buf, loc)\n    }\n}\n\n/// An iterator over a `Vector`.\n#[derive(Debug)]\npub struct VectorIter<'a, T: 'a> {\n    buf: &'a [u8],\n    loc: usize,\n    remaining: usize,\n    phantom: PhantomData<T>,\n}\n\nimpl<'a, T: 'a> VectorIter<'a, T> {\n    #[inline]\n    pub fn from_vector(inner: Vector<'a, T>) -> Self {\n        VectorIter {\n            buf: inner.0,\n            // inner.1 is the location of the data for the vector.\n            // The first SIZE_UOFFSET bytes is the length. We skip\n            // that to get to the actual vector content.\n            loc: inner.1 + SIZE_UOFFSET,\n            remaining: inner.len(),\n            phantom: PhantomData,\n        }\n    }\n\n    /// Creates a new `VectorIter` from the provided slice\n    ///\n    /// # Safety\n    ///\n    /// buf must contain a contiguous sequence of `items_num` values of `T`\n    ///\n    #[inline]\n    pub unsafe fn from_slice(buf: &'a [u8], items_num: usize) -> Self {\n        VectorIter { buf, loc: 0, remaining: items_num, phantom: PhantomData }\n    }\n}\n\nimpl<'a, T: Follow<'a> + 'a> Clone for VectorIter<'a, T> {\n    #[inline]\n    fn clone(&self) -> Self {\n        VectorIter {\n            buf: self.buf,\n            loc: self.loc,\n            remaining: self.remaining,\n            phantom: self.phantom,\n        }\n    }\n}\n\nimpl<'a, T: Follow<'a> + 'a> Iterator for VectorIter<'a, T> {\n    type Item = T::Inner;\n\n    #[inline]\n    fn next(&mut self) -> Option<T::Inner> {\n        let sz = size_of::<T>();\n        debug_assert!(sz > 0);\n\n        if self.remaining == 0 {\n            None\n        } else {\n            // Safety:\n            // VectorIter can only be created from a contiguous sequence of `items_num`\n            // And remaining is initialized to `items_num`\n            let result = unsafe { T::follow(self.buf, self.loc) };\n            self.loc += sz;\n            self.remaining -= 1;\n            Some(result)\n        }\n    }\n\n    #[inline]\n    fn nth(&mut self, n: usize) -> Option<T::Inner> {\n        let sz = size_of::<T>();\n        debug_assert!(sz > 0);\n\n        self.remaining = self.remaining.saturating_sub(n);\n\n        // Note that this might overflow, but that is okay because\n        // in that case self.remaining will have been set to zero.\n        self.loc = self.loc.wrapping_add(sz * n);\n\n        self.next()\n    }\n\n    #[inline]\n    fn size_hint(&self) -> (usize, Option<usize>) {\n        (self.remaining, Some(self.remaining))\n    }\n}\n\nimpl<'a, T: Follow<'a> + 'a> DoubleEndedIterator for VectorIter<'a, T> {\n    #[inline]\n    fn next_back(&mut self) -> Option<T::Inner> {\n        let sz = size_of::<T>();\n        debug_assert!(sz > 0);\n\n        if self.remaining == 0 {\n            None\n        } else {\n            self.remaining -= 1;\n            // Safety:\n            // VectorIter can only be created from a contiguous sequence of `items_num`\n            // And remaining is initialized to `items_num`\n            Some(unsafe { T::follow(self.buf, self.loc + sz * self.remaining) })\n        }\n    }\n\n    #[inline]\n    fn nth_back(&mut self, n: usize) -> Option<T::Inner> {\n        self.remaining = self.remaining.saturating_sub(n);\n        self.next_back()\n    }\n}\n\nimpl<'a, T: 'a + Follow<'a>> ExactSizeIterator for VectorIter<'a, T> {\n    #[inline]\n    fn len(&self) -> usize {\n        self.remaining\n    }\n}\n\n#[cfg(nightly)]\nunsafe impl<'a, T: Follow<'a> + 'a> TrustedLen for VectorIter<'a, T> {}\n\nimpl<'a, T: 'a + Follow<'a>> FusedIterator for VectorIter<'a, T> {}\n\nimpl<'a, T: Follow<'a> + 'a> IntoIterator for Vector<'a, T> {\n    type Item = T::Inner;\n    type IntoIter = VectorIter<'a, T>;\n    #[inline]\n    fn into_iter(self) -> Self::IntoIter {\n        self.iter()\n    }\n}\n\nimpl<'a, 'b, T: Follow<'a> + 'a> IntoIterator for &'b Vector<'a, T> {\n    type Item = T::Inner;\n    type IntoIter = VectorIter<'a, T>;\n    fn into_iter(self) -> Self::IntoIter {\n        self.iter()\n    }\n}\n\n#[cfg(feature = \"serialize\")]\nimpl<'a, T> serde::ser::Serialize for Vector<'a, T>\nwhere\n    T: 'a + Follow<'a>,\n    <T as Follow<'a>>::Inner: serde::ser::Serialize,\n{\n    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>\n    where\n        S: serde::ser::Serializer,\n    {\n        use serde::ser::SerializeSeq;\n        let mut seq = serializer.serialize_seq(Some(self.len()))?;\n        for element in self {\n            seq.serialize_element(&element)?;\n        }\n        seq.end()\n    }\n}\n"
  },
  {
    "path": "rust/flatbuffers/src/verifier.rs",
    "content": "use crate::follow::Follow;\nuse crate::{ForwardsUOffset, SOffsetT, SkipSizePrefix, UOffsetT, VOffsetT, Vector, SIZE_UOFFSET};\n#[cfg(not(feature = \"std\"))]\nuse alloc::vec::Vec;\nuse core::ops::Range;\nuse core::option::Option;\n\n#[cfg(not(feature = \"std\"))]\nuse alloc::borrow::Cow;\n#[cfg(feature = \"std\")]\nuse std::borrow::Cow;\n\n#[cfg(all(nightly, not(feature = \"std\")))]\nuse core::error::Error;\n#[cfg(feature = \"std\")]\nuse std::error::Error;\n\n/// Traces the location of data errors. Not populated for Dos detecting errors.\n/// Useful for MissingRequiredField and Utf8Error in particular, though\n/// the other errors should not be producible by correct flatbuffers implementations.\n#[derive(Clone, Debug, PartialEq, Eq)]\npub enum ErrorTraceDetail {\n    VectorElement { index: usize, position: usize },\n    TableField { field_name: Cow<'static, str>, position: usize },\n    UnionVariant { variant: Cow<'static, str>, position: usize },\n}\n\n#[derive(PartialEq, Eq, Default, Debug, Clone)]\npub struct ErrorTrace(Vec<ErrorTraceDetail>);\n\nimpl core::convert::AsRef<[ErrorTraceDetail]> for ErrorTrace {\n    #[inline]\n    fn as_ref(&self) -> &[ErrorTraceDetail] {\n        &self.0\n    }\n}\n\n/// Describes how a flatuffer is invalid and, for data errors, roughly where. No extra tracing\n/// information is given for DoS detecting errors since it will probably be a lot.\n#[derive(Clone, Debug, PartialEq, Eq)]\npub enum InvalidFlatbuffer {\n    MissingRequiredField {\n        required: Cow<'static, str>,\n        error_trace: ErrorTrace,\n    },\n    InconsistentUnion {\n        field: Cow<'static, str>,\n        field_type: Cow<'static, str>,\n        error_trace: ErrorTrace,\n    },\n    Utf8Error {\n        error: core::str::Utf8Error,\n        range: Range<usize>,\n        error_trace: ErrorTrace,\n    },\n    MissingNullTerminator {\n        range: Range<usize>,\n        error_trace: ErrorTrace,\n    },\n    Unaligned {\n        position: usize,\n        unaligned_type: Cow<'static, str>,\n        error_trace: ErrorTrace,\n    },\n    RangeOutOfBounds {\n        range: Range<usize>,\n        error_trace: ErrorTrace,\n    },\n    SignedOffsetOutOfBounds {\n        soffset: SOffsetT,\n        position: usize,\n        error_trace: ErrorTrace,\n    },\n    // Dos detecting errors. These do not get error traces since it will probably be very large.\n    TooManyTables,\n    ApparentSizeTooLarge,\n    DepthLimitReached,\n}\n\n#[cfg(any(nightly, feature = \"std\"))]\nimpl Error for InvalidFlatbuffer {\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\n        if let InvalidFlatbuffer::Utf8Error { error: source, .. } = self {\n            Some(source)\n        } else {\n            None\n        }\n    }\n}\n\nimpl core::fmt::Display for InvalidFlatbuffer {\n    fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {\n        match self {\n            InvalidFlatbuffer::MissingRequiredField { required, error_trace } => {\n                writeln!(f, \"Missing required field `{}`.\\n{}\", required, error_trace)?;\n            }\n            InvalidFlatbuffer::InconsistentUnion { field, field_type, error_trace } => {\n                writeln!(\n                    f,\n                    \"Exactly one of union discriminant (`{}`) and value (`{}`) are present.\\n{}\",\n                    field_type, field, error_trace\n                )?;\n            }\n            InvalidFlatbuffer::Utf8Error { error, range, error_trace } => {\n                writeln!(f, \"Utf8 error for string in {:?}: {}\\n{}\", range, error, error_trace)?;\n            }\n            InvalidFlatbuffer::MissingNullTerminator { range, error_trace } => {\n                writeln!(\n                    f,\n                    \"String in range [{}, {}) is missing its null terminator.\\n{}\",\n                    range.start, range.end, error_trace\n                )?;\n            }\n            InvalidFlatbuffer::Unaligned { position, unaligned_type, error_trace } => {\n                writeln!(\n                    f,\n                    \"Type `{}` at position {} is unaligned.\\n{}\",\n                    unaligned_type, position, error_trace\n                )?;\n            }\n            InvalidFlatbuffer::RangeOutOfBounds { range, error_trace } => {\n                writeln!(\n                    f,\n                    \"Range [{}, {}) is out of bounds.\\n{}\",\n                    range.start, range.end, error_trace\n                )?;\n            }\n            InvalidFlatbuffer::SignedOffsetOutOfBounds { soffset, position, error_trace } => {\n                writeln!(\n                    f,\n                    \"Signed offset at position {} has value {} which points out of bounds.\\n{}\",\n                    position, soffset, error_trace\n                )?;\n            }\n            InvalidFlatbuffer::TooManyTables {} => {\n                writeln!(f, \"Too many tables.\")?;\n            }\n            InvalidFlatbuffer::ApparentSizeTooLarge {} => {\n                writeln!(f, \"Apparent size too large.\")?;\n            }\n            InvalidFlatbuffer::DepthLimitReached {} => {\n                writeln!(f, \"Nested table depth limit reached.\")?;\n            }\n        }\n        Ok(())\n    }\n}\n\nimpl core::fmt::Display for ErrorTrace {\n    fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {\n        use ErrorTraceDetail::*;\n        for e in self.0.iter() {\n            match e {\n                VectorElement { index, position } => {\n                    writeln!(\n                        f,\n                        \"\\twhile verifying vector element {:?} at position {:?}\",\n                        index, position\n                    )?;\n                }\n                TableField { field_name, position } => {\n                    writeln!(\n                        f,\n                        \"\\twhile verifying table field `{}` at position {:?}\",\n                        field_name, position\n                    )?;\n                }\n                UnionVariant { variant, position } => {\n                    writeln!(\n                        f,\n                        \"\\t while verifying union variant `{}` at position {:?}\",\n                        variant, position\n                    )?;\n                }\n            }\n        }\n        Ok(())\n    }\n}\n\npub type Result<T> = core::result::Result<T, InvalidFlatbuffer>;\n\nimpl InvalidFlatbuffer {\n    fn new_range_oob<T>(start: usize, end: usize) -> Result<T> {\n        Err(Self::RangeOutOfBounds { range: Range { start, end }, error_trace: Default::default() })\n    }\n    pub fn new_inconsistent_union<T>(\n        field: impl Into<Cow<'static, str>>,\n        field_type: impl Into<Cow<'static, str>>,\n    ) -> Result<T> {\n        Err(Self::InconsistentUnion {\n            field: field.into(),\n            field_type: field_type.into(),\n            error_trace: Default::default(),\n        })\n    }\n    pub fn new_missing_required<T>(required: impl Into<Cow<'static, str>>) -> Result<T> {\n        Err(Self::MissingRequiredField {\n            required: required.into(),\n            error_trace: Default::default(),\n        })\n    }\n}\n\n/// Records the path to the verifier detail if the error is a data error and not a DoS error.\nfn append_trace<T>(mut res: Result<T>, d: ErrorTraceDetail) -> Result<T> {\n    if let Err(e) = res.as_mut() {\n        use InvalidFlatbuffer::*;\n        if let MissingRequiredField { error_trace, .. }\n        | Unaligned { error_trace, .. }\n        | RangeOutOfBounds { error_trace, .. }\n        | InconsistentUnion { error_trace, .. }\n        | Utf8Error { error_trace, .. }\n        | MissingNullTerminator { error_trace, .. }\n        | SignedOffsetOutOfBounds { error_trace, .. } = e\n        {\n            error_trace.0.push(d)\n        }\n    }\n    res\n}\n\n/// Adds a TableField trace detail if `res` is a data error.\nfn trace_field<T>(res: Result<T>, field_name: Cow<'static, str>, position: usize) -> Result<T> {\n    append_trace(res, ErrorTraceDetail::TableField { field_name, position })\n}\n\n/// Adds a TableField trace detail if `res` is a data error.\nfn trace_elem<T>(res: Result<T>, index: usize, position: usize) -> Result<T> {\n    append_trace(res, ErrorTraceDetail::VectorElement { index, position })\n}\n\n#[derive(Debug, Clone, PartialEq, Eq)]\npub struct VerifierOptions {\n    /// Maximum depth of nested tables allowed in a valid flatbuffer.\n    pub max_depth: usize,\n    /// Maximum number of tables allowed in a valid flatbuffer.\n    pub max_tables: usize,\n    /// Maximum \"apparent\" size of the message if the Flatbuffer object DAG is expanded into a\n    /// tree.\n    pub max_apparent_size: usize,\n    /// Ignore errors where a string is missing its null terminator.\n    /// This is mostly a problem if the message will be sent to a client using old c-strings.\n    pub ignore_missing_null_terminator: bool,\n    // probably want an option to ignore utf8 errors since strings come from c++\n    // options to error un-recognized enums and unions? possible footgun.\n    // Ignore nested flatbuffers, etc?\n}\n\nimpl Default for VerifierOptions {\n    fn default() -> Self {\n        Self {\n            max_depth: 64,\n            max_tables: 1_000_000,\n            // size_ might do something different.\n            max_apparent_size: 1 << 31,\n            ignore_missing_null_terminator: false,\n        }\n    }\n}\n\n/// Carries the verification state. Should not be reused between tables.\n#[derive(Debug)]\npub struct Verifier<'opts, 'buf> {\n    buffer: &'buf [u8],\n    opts: &'opts VerifierOptions,\n    depth: usize,\n    num_tables: usize,\n    apparent_size: usize,\n}\n\nimpl<'opts, 'buf> Verifier<'opts, 'buf> {\n    pub fn new(opts: &'opts VerifierOptions, buffer: &'buf [u8]) -> Self {\n        Self { opts, buffer, depth: 0, num_tables: 0, apparent_size: 0 }\n    }\n    /// Resets verifier internal state.\n    #[inline]\n    pub fn reset(&mut self) {\n        self.depth = 0;\n        self.num_tables = 0;\n        self.num_tables = 0;\n    }\n    /// Checks `pos` is aligned to T's alignment. This does not mean `buffer[pos]` is aligned w.r.t\n    /// memory since `buffer: &[u8]` has alignment 1.\n    ///\n    /// ### WARNING\n    ///\n    /// This does not work for flatbuffers-structs as they have alignment 1 according to\n    /// `core::mem::align_of` but are meant to have higher alignment within a Flatbuffer w.r.t.\n    /// `buffer[0]`. TODO(caspern).\n    ///\n    /// Note this does not impact soundness as this crate does not assume alignment of structs\n    #[inline]\n    pub fn is_aligned<T>(&self, pos: usize) -> Result<()> {\n        if pos % core::mem::align_of::<T>() == 0 {\n            Ok(())\n        } else {\n            Err(InvalidFlatbuffer::Unaligned {\n                unaligned_type: Cow::Borrowed(core::any::type_name::<T>()),\n                position: pos,\n                error_trace: Default::default(),\n            })\n        }\n    }\n    #[inline]\n    pub fn range_in_buffer(&mut self, pos: usize, size: usize) -> Result<()> {\n        let end = pos.saturating_add(size);\n        if end > self.buffer.len() {\n            return InvalidFlatbuffer::new_range_oob(pos, end);\n        }\n        self.apparent_size += size;\n        if self.apparent_size > self.opts.max_apparent_size {\n            return Err(InvalidFlatbuffer::ApparentSizeTooLarge);\n        }\n        Ok(())\n    }\n    /// Check that there really is a T in there.\n    #[inline]\n    pub fn in_buffer<T>(&mut self, pos: usize) -> Result<()> {\n        self.is_aligned::<T>(pos)?;\n        self.range_in_buffer(pos, core::mem::size_of::<T>())\n    }\n    #[inline]\n    pub fn get_u8(&mut self, pos: usize) -> Result<u8> {\n        self.in_buffer::<u8>(pos)?;\n        Ok(u8::from_le_bytes([self.buffer[pos]]))\n    }\n    #[inline]\n    fn get_u16(&mut self, pos: usize) -> Result<u16> {\n        self.in_buffer::<u16>(pos)?;\n        Ok(u16::from_le_bytes([self.buffer[pos], self.buffer[pos + 1]]))\n    }\n    #[inline]\n    pub fn get_uoffset(&mut self, pos: usize) -> Result<UOffsetT> {\n        self.in_buffer::<u32>(pos)?;\n        Ok(u32::from_le_bytes([\n            self.buffer[pos],\n            self.buffer[pos + 1],\n            self.buffer[pos + 2],\n            self.buffer[pos + 3],\n        ]))\n    }\n    #[inline]\n    fn deref_soffset(&mut self, pos: usize) -> Result<usize> {\n        self.in_buffer::<SOffsetT>(pos)?;\n        let offset = SOffsetT::from_le_bytes([\n            self.buffer[pos],\n            self.buffer[pos + 1],\n            self.buffer[pos + 2],\n            self.buffer[pos + 3],\n        ]);\n\n        // signed offsets are subtracted.\n        let derefed = if offset > 0 {\n            pos.checked_sub(offset.unsigned_abs() as usize)\n        } else {\n            pos.checked_add(offset.unsigned_abs() as usize)\n        };\n        if let Some(x) = derefed {\n            if x < self.buffer.len() {\n                return Ok(x);\n            }\n        }\n        Err(InvalidFlatbuffer::SignedOffsetOutOfBounds {\n            soffset: offset,\n            position: pos,\n            error_trace: Default::default(),\n        })\n    }\n    #[inline]\n    pub fn visit_table<'ver>(\n        &'ver mut self,\n        table_pos: usize,\n    ) -> Result<TableVerifier<'ver, 'opts, 'buf>> {\n        let vtable_pos = self.deref_soffset(table_pos)?;\n        let vtable_len = self.get_u16(vtable_pos)? as usize;\n        self.is_aligned::<VOffsetT>(vtable_pos.saturating_add(vtable_len))?; // i.e. vtable_len is even.\n        self.range_in_buffer(vtable_pos, vtable_len)?;\n        // Check bounds.\n        self.num_tables += 1;\n        if self.num_tables > self.opts.max_tables {\n            return Err(InvalidFlatbuffer::TooManyTables);\n        }\n        self.depth += 1;\n        if self.depth > self.opts.max_depth {\n            return Err(InvalidFlatbuffer::DepthLimitReached);\n        }\n        Ok(TableVerifier { pos: table_pos, vtable: vtable_pos, vtable_len, verifier: self })\n    }\n\n    /// Runs the union variant's type's verifier assuming the variant is at the given position,\n    /// tracing the error.\n    pub fn verify_union_variant<T: Verifiable>(\n        &mut self,\n        variant: impl Into<Cow<'static, str>>,\n        position: usize,\n    ) -> Result<()> {\n        let res = T::run_verifier(self, position);\n        append_trace(res, ErrorTraceDetail::UnionVariant { variant: variant.into(), position })\n    }\n}\n\n// Cache table metadata in usize so we don't have to cast types or jump around so much.\n// We will visit every field anyway.\npub struct TableVerifier<'ver, 'opts, 'buf> {\n    // Absolute position of table in buffer\n    pos: usize,\n    // Absolute position of vtable in buffer.\n    vtable: usize,\n    // Length of vtable.\n    vtable_len: usize,\n    // Verifier struct which holds the surrounding state and options.\n    verifier: &'ver mut Verifier<'opts, 'buf>,\n}\n\nimpl<'ver, 'opts, 'buf> TableVerifier<'ver, 'opts, 'buf> {\n    pub fn deref(&mut self, field: VOffsetT) -> Result<Option<usize>> {\n        let field = field as usize;\n        if field < self.vtable_len {\n            let field_offset = self.verifier.get_u16(self.vtable.saturating_add(field))?;\n            if field_offset > 0 {\n                // Field is present.\n                let field_pos = self.pos.saturating_add(field_offset as usize);\n                return Ok(Some(field_pos));\n            }\n        }\n        Ok(None)\n    }\n\n    #[inline]\n    pub fn verifier(&mut self) -> &mut Verifier<'opts, 'buf> {\n        self.verifier\n    }\n\n    #[inline]\n    pub fn visit_field<T: Verifiable>(\n        mut self,\n        field_name: impl Into<Cow<'static, str>>,\n        field: VOffsetT,\n        required: bool,\n    ) -> Result<Self> {\n        if let Some(field_pos) = self.deref(field)? {\n            trace_field(T::run_verifier(self.verifier, field_pos), field_name.into(), field_pos)?;\n            return Ok(self);\n        }\n        if required {\n            InvalidFlatbuffer::new_missing_required(field_name.into())\n        } else {\n            Ok(self)\n        }\n    }\n    #[inline]\n    /// Union verification is complicated. The schemas passes this function the metadata of the\n    /// union's key (discriminant) and value fields, and a callback. The function verifies and\n    /// reads the key, then invokes the callback to perform data-dependent verification.\n    pub fn visit_union<Key, UnionVerifier>(\n        mut self,\n        key_field_name: impl Into<Cow<'static, str>>,\n        key_field_voff: VOffsetT,\n        val_field_name: impl Into<Cow<'static, str>>,\n        val_field_voff: VOffsetT,\n        required: bool,\n        verify_union: UnionVerifier,\n    ) -> Result<Self>\n    where\n        Key: Follow<'buf> + Verifiable,\n        UnionVerifier:\n            (core::ops::FnOnce(<Key as Follow<'buf>>::Inner, &mut Verifier, usize) -> Result<()>),\n        // NOTE: <Key as Follow<'buf>>::Inner == Key\n    {\n        // TODO(caspern): how to trace vtable errors?\n        let val_pos = self.deref(val_field_voff)?;\n        let key_pos = self.deref(key_field_voff)?;\n        match (key_pos, val_pos) {\n            (None, None) => {\n                if required {\n                    InvalidFlatbuffer::new_missing_required(val_field_name.into())\n                } else {\n                    Ok(self)\n                }\n            }\n            (Some(k), Some(v)) => {\n                trace_field(Key::run_verifier(self.verifier, k), key_field_name.into(), k)?;\n                // Safety:\n                // Run verifier on `k` above\n                let discriminant = unsafe { Key::follow(self.verifier.buffer, k) };\n                trace_field(\n                    verify_union(discriminant, self.verifier, v),\n                    val_field_name.into(),\n                    v,\n                )?;\n                Ok(self)\n            }\n            _ => InvalidFlatbuffer::new_inconsistent_union(\n                key_field_name.into(),\n                val_field_name.into(),\n            ),\n        }\n    }\n    pub fn finish(self) -> &'ver mut Verifier<'opts, 'buf> {\n        self.verifier.depth -= 1;\n        self.verifier\n    }\n}\n\n// Needs to be implemented for Tables and maybe structs.\n// Unions need some special treatment.\npub trait Verifiable {\n    /// Runs the verifier for this type, assuming its at position `pos` in the verifier's buffer.\n    /// Should not need to be called directly.\n    fn run_verifier(v: &mut Verifier, pos: usize) -> Result<()>;\n}\n\n// Verify the uoffset and then pass verifier to the type being pointed to.\nimpl<T: Verifiable> Verifiable for ForwardsUOffset<T> {\n    #[inline]\n    fn run_verifier(v: &mut Verifier, pos: usize) -> Result<()> {\n        let offset = v.get_uoffset(pos)? as usize;\n        let next_pos = offset.saturating_add(pos);\n        T::run_verifier(v, next_pos)\n    }\n}\n\n/// Checks and returns the range containing the flatbuffers vector.\nfn verify_vector_range<T>(v: &mut Verifier, pos: usize) -> Result<core::ops::Range<usize>> {\n    let len = v.get_uoffset(pos)? as usize;\n    let start = pos.saturating_add(SIZE_UOFFSET);\n    v.is_aligned::<T>(start)?;\n    let size = len.saturating_mul(core::mem::size_of::<T>());\n    let end = start.saturating_add(size);\n    v.range_in_buffer(start, size)?;\n    Ok(core::ops::Range { start, end })\n}\n\npub trait SimpleToVerifyInSlice {}\n\nimpl SimpleToVerifyInSlice for bool {}\n\nimpl SimpleToVerifyInSlice for i8 {}\n\nimpl SimpleToVerifyInSlice for u8 {}\n\nimpl SimpleToVerifyInSlice for i16 {}\n\nimpl SimpleToVerifyInSlice for u16 {}\n\nimpl SimpleToVerifyInSlice for i32 {}\n\nimpl SimpleToVerifyInSlice for u32 {}\n\nimpl SimpleToVerifyInSlice for f32 {}\n\nimpl SimpleToVerifyInSlice for i64 {}\n\nimpl SimpleToVerifyInSlice for u64 {}\n\nimpl SimpleToVerifyInSlice for f64 {}\n\nimpl<T: SimpleToVerifyInSlice> Verifiable for Vector<'_, T> {\n    fn run_verifier(v: &mut Verifier, pos: usize) -> Result<()> {\n        verify_vector_range::<T>(v, pos)?;\n        Ok(())\n    }\n}\n\nimpl<T: Verifiable> Verifiable for SkipSizePrefix<T> {\n    #[inline]\n    fn run_verifier(v: &mut Verifier, pos: usize) -> Result<()> {\n        T::run_verifier(v, pos.saturating_add(crate::SIZE_SIZEPREFIX))\n    }\n}\n\nimpl<T: Verifiable> Verifiable for Vector<'_, ForwardsUOffset<T>> {\n    #[inline]\n    fn run_verifier(v: &mut Verifier, pos: usize) -> Result<()> {\n        let range = verify_vector_range::<ForwardsUOffset<T>>(v, pos)?;\n        let size = core::mem::size_of::<ForwardsUOffset<T>>();\n        for (i, element_pos) in range.step_by(size).enumerate() {\n            trace_elem(<ForwardsUOffset<T>>::run_verifier(v, element_pos), i, element_pos)?;\n        }\n        Ok(())\n    }\n}\n\nimpl<'a> Verifiable for &'a str {\n    #[inline]\n    fn run_verifier(v: &mut Verifier, pos: usize) -> Result<()> {\n        let range = verify_vector_range::<u8>(v, pos)?;\n        let has_null_terminator = v.buffer.get(range.end).map(|&b| b == 0).unwrap_or(false);\n        let s = core::str::from_utf8(&v.buffer[range.clone()]);\n        if let Err(error) = s {\n            return Err(InvalidFlatbuffer::Utf8Error {\n                error,\n                range,\n                error_trace: Default::default(),\n            });\n        }\n        if !v.opts.ignore_missing_null_terminator && !has_null_terminator {\n            return Err(InvalidFlatbuffer::MissingNullTerminator {\n                range,\n                error_trace: Default::default(),\n            });\n        }\n        Ok(())\n    }\n}\n\n// Verify VectorOfTables, Unions, Arrays, Structs...\nmacro_rules! impl_verifiable_for {\n    ($T: ty) => {\n        impl Verifiable for $T {\n            #[inline]\n            fn run_verifier<'opts, 'buf>(v: &mut Verifier<'opts, 'buf>, pos: usize) -> Result<()> {\n                v.in_buffer::<$T>(pos)\n            }\n        }\n    };\n}\nimpl_verifiable_for!(bool);\nimpl_verifiable_for!(u8);\nimpl_verifiable_for!(i8);\nimpl_verifiable_for!(u16);\nimpl_verifiable_for!(i16);\nimpl_verifiable_for!(u32);\nimpl_verifiable_for!(i32);\nimpl_verifiable_for!(f32);\nimpl_verifiable_for!(u64);\nimpl_verifiable_for!(i64);\nimpl_verifiable_for!(f64);\n"
  },
  {
    "path": "rust/flatbuffers/src/vtable.rs",
    "content": "/*\n * Copyright 2018 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nuse crate::endian_scalar::read_scalar_at;\nuse crate::follow::Follow;\nuse crate::primitives::*;\n\n/// VTable encapsulates read-only usage of a vtable. It is only to be used\n/// by generated code.\n#[derive(Debug)]\npub struct VTable<'a> {\n    buf: &'a [u8],\n    loc: usize,\n}\n\nimpl<'a> PartialEq for VTable<'a> {\n    fn eq(&self, other: &VTable) -> bool {\n        self.as_bytes().eq(other.as_bytes())\n    }\n}\n\nimpl<'a> VTable<'a> {\n    /// SAFETY\n    /// `buf` must contain a valid vtable at `loc`\n    ///\n    /// This consists of a number of `VOffsetT`\n    /// - size of vtable in bytes including size element\n    /// - size of object in bytes including the vtable offset\n    /// - n fields where n is the number of fields in the table's schema when the code was compiled\n    pub unsafe fn init(buf: &'a [u8], loc: usize) -> Self {\n        VTable { buf, loc }\n    }\n\n    pub fn num_fields(&self) -> usize {\n        (self.num_bytes() / SIZE_VOFFSET) - 2\n    }\n\n    pub fn num_bytes(&self) -> usize {\n        // Safety:\n        // Valid VTable at time of construction\n        unsafe { read_scalar_at::<VOffsetT>(self.buf, self.loc) as usize }\n    }\n\n    pub fn object_inline_num_bytes(&self) -> usize {\n        // Safety:\n        // Valid VTable at time of construction\n        let n = unsafe { read_scalar_at::<VOffsetT>(self.buf, self.loc + SIZE_VOFFSET) };\n        n as usize\n    }\n\n    pub fn get_field(&self, idx: usize) -> VOffsetT {\n        // TODO(rw): distinguish between None and 0?\n        if idx > self.num_fields() {\n            return 0;\n        }\n\n        // Safety:\n        // Valid VTable at time of construction\n        unsafe {\n            read_scalar_at::<VOffsetT>(\n                self.buf,\n                self.loc + SIZE_VOFFSET + SIZE_VOFFSET + SIZE_VOFFSET * idx,\n            )\n        }\n    }\n\n    pub fn get(&self, byte_loc: VOffsetT) -> VOffsetT {\n        // TODO(rw): distinguish between None and 0?\n        if byte_loc as usize + 2 > self.num_bytes() {\n            return 0;\n        }\n        // Safety:\n        // byte_loc is within bounds of vtable, which was valid at time of construction\n        unsafe { read_scalar_at::<VOffsetT>(self.buf, self.loc + byte_loc as usize) }\n    }\n\n    pub fn as_bytes(&self) -> &[u8] {\n        let len = self.num_bytes();\n        &self.buf[self.loc..self.loc + len]\n    }\n}\n\n#[allow(dead_code)]\npub fn field_index_to_field_offset(field_id: VOffsetT) -> VOffsetT {\n    // Should correspond to what end_table() below builds up.\n    let fixed_fields = 2; // Vtable size and Object Size.\n    ((field_id + fixed_fields) * (SIZE_VOFFSET as VOffsetT)) as VOffsetT\n}\n\n#[allow(dead_code)]\npub fn field_offset_to_field_index(field_o: VOffsetT) -> VOffsetT {\n    debug_assert!(field_o >= 2);\n    let fixed_fields = 2; // VTable size and Object Size.\n    (field_o / (SIZE_VOFFSET as VOffsetT)) - fixed_fields\n}\n\nimpl<'a> Follow<'a> for VTable<'a> {\n    type Inner = VTable<'a>;\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        VTable::init(buf, loc)\n    }\n}\n"
  },
  {
    "path": "rust/flatbuffers/src/vtable_writer.rs",
    "content": "/*\n * Copyright 2018 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nuse core::ptr::write_bytes;\n\nuse crate::endian_scalar::emplace_scalar;\nuse crate::primitives::*;\n\n/// VTableWriter compartmentalizes actions needed to create a vtable.\n#[derive(Debug)]\npub struct VTableWriter<'a> {\n    buf: &'a mut [u8],\n}\n\nimpl<'a> VTableWriter<'a> {\n    #[inline(always)]\n    pub fn init(buf: &'a mut [u8]) -> Self {\n        VTableWriter { buf }\n    }\n\n    /// Writes the vtable length (in bytes) into the vtable.\n    ///\n    /// Note that callers already need to have computed this to initialize\n    /// a VTableWriter.\n    ///\n    /// In debug mode, asserts that the length of the underlying data is equal\n    /// to the provided value.\n    #[inline(always)]\n    pub fn write_vtable_byte_length(&mut self, n: VOffsetT) {\n        let buf = &mut self.buf[..SIZE_VOFFSET];\n        // Safety:\n        // Validated range above\n        unsafe {\n            emplace_scalar::<VOffsetT>(buf, n);\n        }\n        debug_assert_eq!(n as usize, self.buf.len());\n    }\n\n    /// Writes an object length (in bytes) into the vtable.\n    #[inline(always)]\n    pub fn write_object_inline_size(&mut self, n: VOffsetT) {\n        let buf = &mut self.buf[SIZE_VOFFSET..2 * SIZE_VOFFSET];\n        // Safety:\n        // Validated range above\n        unsafe {\n            emplace_scalar::<VOffsetT>(buf, n);\n        }\n    }\n\n    /// Writes an object field offset into the vtable.\n    ///\n    /// Note that this expects field offsets (which are like pointers), not\n    /// field ids (which are like array indices).\n    #[inline(always)]\n    pub fn write_field_offset(&mut self, vtable_offset: VOffsetT, object_data_offset: VOffsetT) {\n        let idx = vtable_offset as usize;\n        let buf = &mut self.buf[idx..idx + SIZE_VOFFSET];\n        // Safety:\n        // Validated range above\n        unsafe {\n            emplace_scalar::<VOffsetT>(buf, object_data_offset);\n        }\n    }\n\n    /// Clears all data in this VTableWriter. Used to cleanly undo a\n    /// vtable write.\n    #[inline(always)]\n    pub fn clear(&mut self) {\n        // This is the closest thing to memset in Rust right now.\n        let len = self.buf.len();\n        let p = self.buf.as_mut_ptr() as *mut u8;\n\n        // Safety:\n        // p is byte aligned and of length `len`\n        unsafe {\n            write_bytes(p, 0, len);\n        }\n    }\n}\n"
  },
  {
    "path": "rust/flexbuffers/.gitignore",
    "content": "/target\n**/*.rs.bk\nCargo.lock\n"
  },
  {
    "path": "rust/flexbuffers/Cargo.toml",
    "content": "[package]\nname = \"flexbuffers\"\nversion = \"25.12.19\"\nauthors = [\"Casper Neo <cneo@google.com>\", \"FlatBuffers Maintainers\"]\nedition = \"2018\"\nlicense = \"Apache-2.0\"\ndescription = \"Official FlexBuffers Rust runtime library.\"\nhomepage = \"https://google.github.io/flatbuffers/flexbuffers\"\nrepository = \"https://github.com/google/flatbuffers\"\nkeywords = [\"flatbuffers\", \"flexbuffers\", \"serialization\", \"zero-copy\"]\ncategories = [\"encoding\", \"data-structures\", \"memory-management\"]\n\n[features]\n# Sets serde::Serializer::is_human_readable() to true.\n# The default was changed from true to false in version \"0.2.1\".\n# You basically never need this to be true unless writing data for old binaries.\nserialize_human_readable = []\n# Sets serde::Deserializer::is_human_readable() to true.\n# The default was changed from true to false in version \"0.2.1\".\n# You basically never need this to be true unless reading data from old binaries.\ndeserialize_human_readable = []\n\n[dependencies]\nserde = \"1.0.119\"\nserde_derive = \"1.0.119\"\nbyteorder = \"1.4.2\"\nnum_enum = \"0.5.1\"\nbitflags = \"1.2.1\"\n"
  },
  {
    "path": "rust/flexbuffers/README.md",
    "content": "# Flexbuffers\n\n[Flexbuffers](https://google.github.io/flatbuffers/flexbuffers.html) is a\nschema-less binary format developed at Google. FlexBuffers can be accessed\nwithout parsing, copying, or allocation. This is a huge win for efficiency,\nmemory friendly-ness, and allows for unique use cases such as mmap-ing large\namounts of free-form data.\n\nFlexBuffers' design and implementation allows for a very compact encoding,\nwith automatic sizing of containers to their smallest possible representation\n(8/16/32/64 bits). Many values and offsets can be encoded in just 8 bits.\n\nFlexBuffers supports [Serde](https://serde.rs/) for automatically serializing\nRust data structures into its binary format.\n\n## See Examples for Usage:\n* [Example](https://github.com/google/flatbuffers/blob/master/samples/sample_flexbuffers.rs)\n* [Serde Example](https://github.com/google/flatbuffers/blob/master/samples/sample_flexbuffers_serde.rs)\n* [Documentation](https://docs.rs/flexbuffers)\n\nFlexbuffers is the schema-less cousin of\n[Flatbuffers](https://google.github.io/flatbuffers/).\n"
  },
  {
    "path": "rust/flexbuffers/src/bitwidth.rs",
    "content": "// Copyright 2019 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nuse crate::bitwidth::BitWidth::*;\nuse std::slice::Iter;\n\n/// Represents the size of Flexbuffers data.\n///\n/// Flexbuffers automatically compresses numbers to the smallest possible width\n/// (`250u64` is stored as `250u8`).\n#[derive(\n    Debug,\n    Clone,\n    Copy,\n    PartialEq,\n    Eq,\n    PartialOrd,\n    Serialize,\n    Deserialize,\n    Ord,\n    num_enum::TryFromPrimitive,\n)]\n#[repr(u8)]\npub enum BitWidth {\n    W8 = 0,\n    W16 = 1,\n    W32 = 2,\n    W64 = 3,\n}\nimpl BitWidth {\n    pub(crate) fn iter() -> Iter<'static, Self> {\n        [W8, W16, W32, W64].iter()\n    }\n    pub fn n_bytes(self) -> usize {\n        1 << self as usize\n    }\n    pub fn from_nbytes(n: impl std::convert::Into<usize>) -> Option<Self> {\n        match n.into() {\n            1 => Some(W8),\n            2 => Some(W16),\n            4 => Some(W32),\n            8 => Some(W64),\n            _ => None,\n        }\n    }\n}\n\nimpl Default for BitWidth {\n    fn default() -> Self {\n        W8\n    }\n}\n\n// TODO(cneo): Overloading with `from` is probably not the most readable idea in hindsight.\nmacro_rules! impl_bitwidth_from {\n    ($from: ident, $w64: ident, $w32: ident, $w16: ident, $w8: ident) => {\n        impl From<$from> for BitWidth {\n            fn from(x: $from) -> BitWidth {\n                let x = x as $w64;\n                if x >= $w8::min_value() as $w64 && x <= $w8::max_value() as $w64 {\n                    return W8;\n                }\n                if x >= $w16::min_value() as $w64 && x <= $w16::max_value() as $w64 {\n                    return W16;\n                }\n                if x >= $w32::min_value() as $w64 && x <= $w32::max_value() as $w64 {\n                    return W32;\n                }\n                W64\n            }\n        }\n    };\n}\nimpl_bitwidth_from!(u64, u64, u32, u16, u8);\nimpl_bitwidth_from!(usize, u64, u32, u16, u8);\nimpl_bitwidth_from!(i64, i64, i32, i16, i8);\n\n#[allow(clippy::float_cmp)]\nimpl From<f64> for BitWidth {\n    fn from(x: f64) -> BitWidth {\n        if x != x as f32 as f64 {\n            W64\n        } else {\n            W32\n        }\n    }\n}\nimpl From<f32> for BitWidth {\n    fn from(_: f32) -> BitWidth {\n        W32\n    }\n}\n\n/// Zero pad `v` until `T` will be byte aligned when pushed.\npub fn align(buffer: &mut Vec<u8>, width: BitWidth) {\n    let bytes = 1 << width as u8;\n    let alignment = (bytes - buffer.len() % bytes) % bytes;\n    // Profiling reveals the loop is faster than Vec::resize.\n    for _ in 0..alignment as usize {\n        buffer.push(0);\n    }\n}\n"
  },
  {
    "path": "rust/flexbuffers/src/buffer.rs",
    "content": "use std::ops::{Deref, Range};\n\n/// The underlying buffer that is used by a flexbuffer Reader.\n///\n/// This allows for custom buffer implementations as long as they can be viewed as a &[u8].\npub trait Buffer: Deref<Target = [u8]> + Sized {\n    // The `BufferString` allows for a buffer to return a custom string which will have the\n    // lifetime of the underlying buffer. A simple `std::str::from_utf8` wouldn't work since that\n    // returns a &str, which is then owned by the callee (cannot be returned from a function).\n    //\n    // Example: During deserialization a `BufferString` is returned, allowing the deserializer\n    // to \"borrow\" the given str - b/c there is a \"lifetime\" guarantee, so to speak, from the\n    // underlying buffer.\n    /// A BufferString which will live at least as long as the Buffer itself.\n    ///\n    /// Deref's to UTF-8 `str`, and only generated from the `buffer_str` function Result.\n    type BufferString: Deref<Target = str> + Sized + serde::ser::Serialize;\n\n    /// This method returns an instance of type Self. This allows for lifetimes to be tracked\n    /// in cases of deserialization.\n    ///\n    /// It also lets custom buffers manage reference counts.\n    ///\n    /// Returns None if:\n    /// - range start is greater than end\n    /// - range end is out of bounds\n    ///\n    /// This operation should be fast -> O(1), ideally with no heap allocations.\n    fn slice(&self, range: Range<usize>) -> Option<Self>;\n\n    /// Creates a shallow copy of the given buffer, similar to `slice`.\n    ///\n    /// This operation should be fast -> O(1), ideally with no heap allocations.\n    #[inline]\n    fn shallow_copy(&self) -> Self {\n        self.slice(0..self.len()).unwrap()\n    }\n\n    /// Creates an empty instance of a `Buffer`. This is different than `Default` b/c it\n    /// guarantees that the buffer instance will have length zero.\n    ///\n    /// Most impls shold be able to implement this via `Default`.\n    fn empty() -> Self;\n\n    /// Based off of the `empty` function, allows override for optimization purposes.\n    #[inline]\n    fn empty_str() -> Self::BufferString {\n        Self::empty().buffer_str().unwrap()\n    }\n\n    /// Attempts to convert the given buffer to a custom string type.\n    ///\n    /// This should fail if the type does not have valid UTF-8 bytes, and must be zero copy.\n    fn buffer_str(&self) -> Result<Self::BufferString, std::str::Utf8Error>;\n}\n\nimpl<'de> Buffer for &'de [u8] {\n    type BufferString = &'de str;\n\n    #[inline]\n    fn slice(&self, range: Range<usize>) -> Option<Self> {\n        self.get(range)\n    }\n\n    #[inline]\n    fn empty() -> Self {\n        &[]\n    }\n\n    /// Based off of the `empty` function, allows override for optimization purposes.\n    #[inline]\n    fn empty_str() -> Self::BufferString {\n        \"\"\n    }\n\n    #[inline]\n    fn buffer_str(&self) -> Result<Self::BufferString, std::str::Utf8Error> {\n        std::str::from_utf8(self)\n    }\n}\n"
  },
  {
    "path": "rust/flexbuffers/src/builder/map.rs",
    "content": "// Copyright 2019 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nuse super::{Builder, Pushable, Value, VectorBuilder};\n\n/// Builds a Flexbuffer map, returned by a [Builder](struct.Builder.html).\n///\n/// ## Side effect when dropped:\n/// When this is dropped, or `end_map` is called, the map is\n/// commited to the buffer. If this map is the root of the flexbuffer, then the\n/// root is written and the flexbuffer is complete.\n/// ## Panics:\n/// -  Duplicate keys will result in a panic in both debug and release mode.\n/// -  Keys with internal nulls results in a panic in debug mode and result in silent truncaction\n///    in release mode.\npub struct MapBuilder<'a> {\n    pub(super) builder: &'a mut Builder,\n    // If the root is this map then start == None. Otherwise start is the\n    // number of values in the 'values stack' before adding this map.\n    pub(super) start: Option<usize>,\n}\nimpl<'a> MapBuilder<'a> {\n    /// Push `p` onto this map with key `key`.\n    /// This will panic (in debug mode) if `key` contains internal nulls.\n    #[inline]\n    pub fn push<P: Pushable>(&mut self, key: &str, p: P) {\n        self.builder.push_key(key);\n        self.builder.push(p);\n    }\n    /// Starts a nested vector that will be pushed onto this map\n    /// with key `key` when it is dropped.\n    ///\n    /// This will panic (in debug mode) if `key` contains internal nulls.\n    #[inline]\n    pub fn start_vector(&mut self, key: &str) -> VectorBuilder<'_> {\n        // Push the key that refers to this nested vector.\n        self.builder.push_key(key);\n        // Nested vector.\n        let start = Some(self.builder.values.len());\n        VectorBuilder { builder: self.builder, start }\n    }\n    /// Starts a nested map which that will be pushed onto this map\n    /// with key `key` when it is dropped.\n    ///\n    /// This will panic (in debug mode) if `key` contains internal nulls.\n    #[inline]\n    pub fn start_map(&mut self, key: &str) -> MapBuilder<'_> {\n        // Push the key that refers to this nested vector.\n        self.builder.push_key(key);\n        // Nested map.\n        let start = Some(self.builder.values.len());\n        MapBuilder { builder: self.builder, start }\n    }\n    /// `end_map` sorts the map by key and writes it to the buffer. This happens anyway\n    /// when the map builder is dropped.\n    #[inline]\n    pub fn end_map(self) {}\n}\nimpl<'a> Drop for MapBuilder<'a> {\n    #[inline]\n    fn drop(&mut self) {\n        self.builder.end_map_or_vector(true, self.start);\n    }\n}\n\n// Read known keys / strings as iterators over bytes -- skipping utf8 validation and strlen.\npub(super) fn get_key(buffer: &[u8], address: usize) -> impl Iterator<Item = &u8> {\n    buffer[address..].iter().take_while(|&&b| b != b'\\0')\n}\n\n// `values` is assumed to be of the format [key1, value1, ..., keyN, valueN].\n// The keys refer to cstrings in `buffer`. When this function returns,\n// `values` is sorted in place by key.\npub(super) fn sort_map_by_keys(values: &mut [Value], buffer: &[u8]) {\n    debug_assert_eq!(values.len() % 2, 0);\n    debug_assert!(values.iter().step_by(2).all(Value::is_key));\n    let raw_pairs = values.as_mut_ptr() as *mut [Value; 2];\n    let pairs_len = values.len() / 2;\n    // Unsafe code needed to treat the slice as key-value pairs when sorting in place. This is\n    // preferred over custom sorting or adding another dependency. By construction, this part\n    // of the values stack must be alternating (key, value) pairs. The public API must not be\n    // able to trigger the above debug_assets that protect this unsafe usage.\n    let pairs: &mut [[Value; 2]] = unsafe { std::slice::from_raw_parts_mut(raw_pairs, pairs_len) };\n    #[rustfmt::skip]\n    pairs.sort_unstable_by(|[key1, _], [key2, _]| {\n        if let Value::Key(a1) = *key1 {\n            if let Value::Key(a2) = *key2 {\n                let s1 = get_key(buffer, a1);\n                let s2 = get_key(buffer, a2);\n                let ord = s1.cmp(s2);\n                if ord == std::cmp::Ordering::Equal {\n                    let dup: String = get_key(buffer, a1).map(|&b| b as char).collect();\n                    panic!(\"Duplicated key in map {:?}\", dup);\n                }\n                return ord;\n            }\n        }\n        unreachable!();\n    });\n}\n"
  },
  {
    "path": "rust/flexbuffers/src/builder/mod.rs",
    "content": "// Copyright 2019 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nuse crate::bitwidth::{align, BitWidth};\nmod value;\nuse crate::FlexBufferType;\nuse std::cmp::max;\nuse value::{find_vector_type, store_value, Value};\nmod map;\nmod push;\nmod ser;\nmod vector;\nuse map::sort_map_by_keys;\npub use map::MapBuilder;\npub use push::Pushable;\npub use ser::{Error, FlexbufferSerializer};\npub use vector::VectorBuilder;\n\nmacro_rules! push_slice {\n    ($push_name: ident, $scalar: ty, $Val: ident, $new_vec: ident) => {\n        fn $push_name<T, S>(&mut self, xs: S)\n        where\n            T: Into<$scalar> + Copy,\n            S: AsRef<[T]>,\n        {\n            let mut value = Value::$new_vec(xs.as_ref().len());\n            let mut width =\n                xs.as_ref().iter().map(|x| BitWidth::from((*x).into())).max().unwrap_or_default();\n            if !value.is_fixed_length_vector() {\n                let length = Value::UInt(xs.as_ref().len() as u64);\n                width = std::cmp::max(width, length.width_or_child_width());\n                align(&mut self.buffer, width);\n                store_value(&mut self.buffer, length, width);\n            } else {\n                align(&mut self.buffer, width);\n            }\n            let address = self.buffer.len();\n            for &x in xs.as_ref().iter() {\n                store_value(&mut self.buffer, Value::$Val(x.into()), width);\n            }\n            value.set_address_or_panic(address);\n            value.set_child_width_or_panic(width);\n            self.values.push(value);\n        }\n    };\n}\nmacro_rules! push_indirect {\n    ($push_name: ident, $scalar: ty, $Direct: ident, $Indirect: ident) => {\n        fn $push_name<T: Into<$scalar>>(&mut self, x: T) {\n            let x = Value::$Direct(x.into());\n            let child_width = x.width_or_child_width();\n            let address = self.buffer.len();\n            store_value(&mut self.buffer, x, child_width);\n            self.values.push(Value::Reference {\n                address,\n                child_width,\n                fxb_type: FlexBufferType::$Indirect,\n            });\n        }\n    };\n}\n\nbitflags! {\n    /// Options for sharing data within a flexbuffer.\n    ///\n    /// These increase serialization time but decrease the size of the resulting buffer. By\n    /// default, `SHARE_KEYS`. You may wish to turn on `SHARE_STRINGS` if you know your data has\n    /// many duplicate strings or `SHARE_KEY_VECTORS` if your data has many maps with identical\n    /// keys.\n    ///\n    /// ## Not Yet Implemented\n    /// - `SHARE_STRINGS`\n    /// - `SHARE_KEY_VECTORS`\n    pub struct BuilderOptions: u8 {\n        const SHARE_NONE = 0;\n        const SHARE_KEYS = 1;\n        const SHARE_STRINGS = 2;\n        const SHARE_KEYS_AND_STRINGS = 3;\n        const SHARE_KEY_VECTORS = 4;\n        const SHARE_ALL = 7;\n    }\n}\nimpl Default for BuilderOptions {\n    fn default() -> Self {\n        Self::SHARE_KEYS\n    }\n}\n\n#[derive(Debug, Clone, Copy)]\n// Address of a Key inside of the buffer.\nstruct CachedKey(usize);\n\n/// **Use this struct to build a Flexbuffer.**\n///\n/// Flexbuffers may only have a single root value, which may be constructed\n/// with  one of the following functions.\n/// * `build_singleton` will push 1 value to the buffer and serialize it as the root.\n/// * `start_vector` returns a `VectorBuilder`, into which many (potentially\n/// heterogenous) values can be pushed. The vector itself is the root and is serialized\n/// when the `VectorBuilder` is dropped (or `end` is called).\n/// * `start_map` returns a `MapBuilder`, which is similar to a `VectorBuilder` except\n/// every value must be pushed with an associated key. The map is serialized when the\n/// `MapBuilder` is dropped (or `end` is called).\n///\n/// These functions reset and overwrite the Builder which means, while there are no\n/// active `MapBuilder` or `VectorBuilder`, the internal buffer is empty or contains a\n/// finished Flexbuffer. The internal buffer is accessed with `view`.\n#[derive(Debug, Clone)]\npub struct Builder {\n    buffer: Vec<u8>,\n    values: Vec<Value>,\n    key_pool: Option<Vec<CachedKey>>,\n}\nimpl Default for Builder {\n    fn default() -> Self {\n        let opts = Default::default();\n        Builder::new(opts)\n    }\n}\n\nimpl<'a> Builder {\n    pub fn new(opts: BuilderOptions) -> Self {\n        let key_pool = if opts.contains(BuilderOptions::SHARE_KEYS) { Some(vec![]) } else { None };\n        Builder { key_pool, values: Vec::new(), buffer: Vec::new() }\n    }\n    /// Shows the internal flexbuffer. It will either be empty or populated with the most\n    /// recently built flexbuffer.\n    pub fn view(&self) -> &[u8] {\n        &self.buffer\n    }\n    /// Returns the internal buffer, replacing it with a new vector. The returned buffer will\n    /// either be empty or populated with the most recently built flexbuffer.\n    pub fn take_buffer(&mut self) -> Vec<u8> {\n        let mut b = Vec::new();\n        std::mem::swap(&mut self.buffer, &mut b);\n        b\n    }\n    /// Resets the internal state. Automatically called before building a new flexbuffer.\n    pub fn reset(&mut self) {\n        self.buffer.clear();\n        self.values.clear();\n        if let Some(pool) = self.key_pool.as_mut() {\n            pool.clear();\n        }\n    }\n    fn push_key(&mut self, key: &str) {\n        debug_assert!(key.bytes().all(|b| b != b'\\0'), \"Keys must not have internal nulls.\");\n        // Search key pool if there is one.\n        let found = self.key_pool.as_ref().map(|pool| {\n            pool.binary_search_by(|&CachedKey(addr)| {\n                let old_key = map::get_key(&self.buffer, addr);\n                old_key.cloned().cmp(key.bytes())\n            })\n        });\n        let address = if let Some(Ok(idx)) = found {\n            // Found key in key pool.\n            self.key_pool.as_ref().unwrap()[idx].0\n        } else {\n            // Key not in pool (or no pool).\n            let address = self.buffer.len();\n            self.buffer.extend_from_slice(key.as_bytes());\n            self.buffer.push(b'\\0');\n            address\n        };\n        if let Some(Err(idx)) = found {\n            // Insert into key pool.\n            let pool = self.key_pool.as_mut().unwrap();\n            pool.insert(idx, CachedKey(address));\n        }\n        self.values.push(Value::Key(address));\n    }\n    fn push_uint<T: Into<u64>>(&mut self, x: T) {\n        self.values.push(Value::UInt(x.into()));\n    }\n    fn push_int<T: Into<i64>>(&mut self, x: T) {\n        self.values.push(Value::Int(x.into()));\n    }\n    fn push_float<T: Into<f64>>(&mut self, x: T) {\n        self.values.push(Value::Float(x.into()));\n    }\n    fn push_null(&mut self) {\n        self.values.push(Value::Null);\n    }\n    fn push_bool(&mut self, x: bool) {\n        self.values.push(Value::Bool(x));\n    }\n    fn store_blob(&mut self, xs: &[u8]) -> Value {\n        let length = Value::UInt(xs.len() as u64);\n        let width = length.width_or_child_width();\n        align(&mut self.buffer, width);\n        store_value(&mut self.buffer, length, width);\n        let address = self.buffer.len();\n        self.buffer.extend_from_slice(xs);\n        Value::Reference { fxb_type: FlexBufferType::Blob, address, child_width: width }\n    }\n    fn push_str(&mut self, x: &str) {\n        let mut string = self.store_blob(x.as_bytes());\n        self.buffer.push(b'\\0');\n        string.set_fxb_type_or_panic(FlexBufferType::String);\n        self.values.push(string);\n    }\n    fn push_blob(&mut self, x: &[u8]) {\n        let blob = self.store_blob(x);\n        self.values.push(blob);\n    }\n    fn push_bools(&mut self, xs: &[bool]) {\n        let length = Value::UInt(xs.len() as u64);\n        let width = length.width_or_child_width();\n        align(&mut self.buffer, width);\n        store_value(&mut self.buffer, length, width);\n        let address = self.buffer.len();\n        for &b in xs.iter() {\n            self.buffer.push(b as u8);\n            self.buffer.resize(self.buffer.len() + width as usize, 0);\n        }\n        self.values.push(Value::Reference {\n            fxb_type: FlexBufferType::VectorBool,\n            address,\n            child_width: width,\n        });\n    }\n\n    push_slice!(push_uints, u64, UInt, new_uint_vector);\n    push_slice!(push_ints, i64, Int, new_int_vector);\n    push_slice!(push_floats, f64, Float, new_float_vector);\n    push_indirect!(push_indirect_int, i64, Int, IndirectInt);\n    push_indirect!(push_indirect_uint, u64, UInt, IndirectUInt);\n    push_indirect!(push_indirect_float, f64, Float, IndirectFloat);\n\n    /// Resets the builder and starts a new flexbuffer with a vector at the root.\n    /// The exact Flexbuffer vector type is dynamically inferred.\n    pub fn start_vector(&'a mut self) -> VectorBuilder<'a> {\n        self.reset();\n        VectorBuilder { builder: self, start: None }\n    }\n    /// Resets the builder and builds a new flexbuffer with a map at the root.\n    pub fn start_map(&'a mut self) -> MapBuilder<'a> {\n        self.reset();\n        MapBuilder { builder: self, start: None }\n    }\n    /// Resets the builder and builds a new flexbuffer with the pushed value at the root.\n    pub fn build_singleton<P: Pushable>(&mut self, p: P) {\n        self.reset();\n        p.push_to_builder(self);\n        let root = self.values.pop().unwrap();\n        store_root(&mut self.buffer, root);\n    }\n    fn push<P: Pushable>(&mut self, p: P) {\n        p.push_to_builder(self);\n    }\n    /// Stores the values past `previous_end` as a map or vector depending on `is_map`.\n    /// If `previous_end` is None then this was a root map / vector and the last value\n    /// is stored as the root.\n    fn end_map_or_vector(&mut self, is_map: bool, previous_end: Option<usize>) {\n        let split = previous_end.unwrap_or(0);\n        let value = if is_map {\n            let key_vals = &mut self.values[split..];\n            sort_map_by_keys(key_vals, &self.buffer);\n            let key_vector = store_vector(&mut self.buffer, key_vals, StoreOption::MapKeys);\n            store_vector(&mut self.buffer, key_vals, StoreOption::Map(key_vector))\n        } else {\n            store_vector(&mut self.buffer, &self.values[split..], StoreOption::Vector)\n        };\n        self.values.truncate(split);\n        if previous_end.is_some() {\n            self.values.push(value);\n        } else {\n            store_root(&mut self.buffer, value);\n        }\n    }\n}\n\n/// Builds a Flexbuffer with the single pushed value as the root.\npub fn singleton<P: Pushable>(p: P) -> Vec<u8> {\n    let mut b = Builder::default();\n    b.build_singleton(p);\n    let Builder { buffer, .. } = b;\n    buffer\n}\n\n/// Stores the root value, root type and root width.\n/// This should be called to finish the Flexbuffer.\nfn store_root(buffer: &mut Vec<u8>, root: Value) {\n    let root_width = root.width_in_vector(buffer.len(), 0);\n    align(buffer, root_width);\n    store_value(buffer, root, root_width);\n    buffer.push(root.packed_type(root_width));\n    buffer.push(root_width.n_bytes() as u8);\n}\n\npub enum StoreOption {\n    Vector,\n    Map(Value),\n    MapKeys,\n}\n/// Writes a Flexbuffer Vector or Map.\n/// StoreOption::Map(Keys) must be a Value::Key or this will panic.\n// #[inline(always)]\npub fn store_vector(buffer: &mut Vec<u8>, values: &[Value], opt: StoreOption) -> Value {\n    let (skip, stride) = match opt {\n        StoreOption::Vector => (0, 1),\n        StoreOption::MapKeys => (0, 2),\n        StoreOption::Map(_) => (1, 2),\n    };\n    let iter_values = || values.iter().skip(skip).step_by(stride);\n\n    // Figure out vector type and how long is the prefix.\n    let mut result = if let StoreOption::Map(_) = opt {\n        Value::new_map()\n    } else {\n        find_vector_type(iter_values())\n    };\n    let length_slot = if !result.is_fixed_length_vector() {\n        let length = iter_values().count();\n        Some(Value::UInt(length as u64))\n    } else {\n        None\n    };\n    // Measure required width and align to it.\n    let mut width = BitWidth::W8;\n    if let StoreOption::Map(keys) = opt {\n        width = max(width, keys.width_in_vector(buffer.len(), 0))\n    }\n    if let Some(l) = length_slot {\n        width = max(width, l.width_or_child_width());\n    }\n    let prefix_length = result.prefix_length();\n    for (i, &val) in iter_values().enumerate() {\n        width = max(width, val.width_in_vector(buffer.len(), i + prefix_length));\n    }\n    align(buffer, width);\n    #[allow(deprecated)]\n    {\n        debug_assert_ne!(\n            result.fxb_type(),\n            FlexBufferType::VectorString,\n            \"VectorString is deprecated and cannot be written.\\\n             (https://github.com/google/flatbuffers/issues/5627)\"\n        );\n    }\n    // Write Prefix.\n    if let StoreOption::Map(keys) = opt {\n        let key_width = Value::UInt(keys.width_or_child_width().n_bytes() as u64);\n        store_value(buffer, keys, width);\n        store_value(buffer, key_width, width);\n    }\n    if let Some(len) = length_slot {\n        store_value(buffer, len, width);\n    }\n    // Write data.\n    let address = buffer.len();\n    for &v in iter_values() {\n        store_value(buffer, v, width);\n    }\n    // Write types\n    if result.is_typed_vector_or_map() {\n        for v in iter_values() {\n            buffer.push(v.packed_type(width));\n        }\n    }\n    // Return Value representing this Vector.\n    result.set_address_or_panic(address);\n    result.set_child_width_or_panic(width);\n    result\n}\n"
  },
  {
    "path": "rust/flexbuffers/src/builder/push.rs",
    "content": "// Copyright 2019 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nuse crate::builder::Builder;\nuse crate::private::Sealed;\nuse crate::{Blob, Buffer, IndirectFloat, IndirectInt, IndirectUInt};\n\nimpl<B: Buffer> Sealed for Blob<B> {}\nimpl Sealed for () {}\n\n// TODO: String interning\n// TODO: Pushable for Map types?\n\n/// Types that implement the Pushable trait can be written into a Flexbuffer.\n///\n/// All Rust's standard numbers, `u8, u16, u32, u64, i8, i16, i32, i64, f32, f64`,\n/// can all be pushed. They are  `FlexBufferType::{UInt, Int, Float}`.\n/// Flexbuffers chooses the smallest width that can represent the given number.\n/// Strings can pe pushed, they become `FlexBufferType::String` and are stored\n/// with both a length and null terminator.\n///\n/// * For convenience and speed push typed vectors using rust arrays and slices.\n/// Doing so will immediately serialize the data, skipping the `Builder`'s\n/// internal cache.\n///\n/// * Pushable cannot not be implemented by any downstream crates.\npub trait Pushable: Sealed + Sized {\n    fn push_to_builder(self, _: &mut Builder) {}\n}\n\nimpl Pushable for () {\n    fn push_to_builder(self, builder: &mut Builder) {\n        builder.push_null();\n    }\n}\n\nimpl<B: Buffer> Pushable for Blob<B> {\n    fn push_to_builder(self, builder: &mut Builder) {\n        builder.push_blob(&self.0);\n    }\n}\n\nmacro_rules! forward_to_builder {\n    ($T: ty, $method: ident) => {\n        impl Sealed for $T {}\n        impl Pushable for $T {\n            fn push_to_builder(self, builder: &mut Builder) {\n                builder.$method(self);\n            }\n        }\n    };\n    ($T: ty, $method: ident, $asT: ty) => {\n        impl Sealed for $T {}\n        impl Pushable for $T {\n            fn push_to_builder(self, builder: &mut Builder) {\n                builder.$method(self as $asT);\n            }\n        }\n    };\n}\nforward_to_builder!(&str, push_str);\nforward_to_builder!(bool, push_bool);\nforward_to_builder!(u8, push_uint);\nforward_to_builder!(u16, push_uint);\nforward_to_builder!(u32, push_uint);\nforward_to_builder!(u64, push_uint);\nforward_to_builder!(i8, push_int);\nforward_to_builder!(i16, push_int);\nforward_to_builder!(i32, push_int);\nforward_to_builder!(i64, push_int);\nforward_to_builder!(f32, push_float);\nforward_to_builder!(f64, push_float);\nforward_to_builder!(&[u8], push_uints);\nforward_to_builder!(&[u16], push_uints);\nforward_to_builder!(&[u32], push_uints);\nforward_to_builder!(&[u64], push_uints);\nforward_to_builder!(&[i8], push_ints);\nforward_to_builder!(&[i16], push_ints);\nforward_to_builder!(&[i32], push_ints);\nforward_to_builder!(&[i64], push_ints);\nforward_to_builder!(&[f32], push_floats);\nforward_to_builder!(&[f64], push_floats);\nforward_to_builder!(&[bool], push_bools);\nforward_to_builder!(&Vec<u8>, push_uints);\nforward_to_builder!(&Vec<u16>, push_uints);\nforward_to_builder!(&Vec<u32>, push_uints);\nforward_to_builder!(&Vec<u64>, push_uints);\nforward_to_builder!(&Vec<i8>, push_ints);\nforward_to_builder!(&Vec<i16>, push_ints);\nforward_to_builder!(&Vec<i32>, push_ints);\nforward_to_builder!(&Vec<i64>, push_ints);\nforward_to_builder!(&Vec<f32>, push_floats);\nforward_to_builder!(&Vec<f64>, push_floats);\nforward_to_builder!(&Vec<bool>, push_bools);\n\nmacro_rules! impl_indirects {\n    ($Indirect: ident, $method: ident) => {\n        impl Sealed for $Indirect {}\n        impl Pushable for $Indirect {\n            fn push_to_builder(self, builder: &mut Builder) {\n                builder.$method(self.0);\n            }\n        }\n    };\n}\nimpl_indirects!(IndirectInt, push_indirect_int);\nimpl_indirects!(IndirectUInt, push_indirect_uint);\nimpl_indirects!(IndirectFloat, push_indirect_float);\n\nmacro_rules! impl_arrays {\n    ($num: expr) => {\n        forward_to_builder!(&[u8; $num], push_uints, &[u8]);\n        forward_to_builder!(&[u16; $num], push_uints, &[u16]);\n        forward_to_builder!(&[u32; $num], push_uints, &[u32]);\n        forward_to_builder!(&[u64; $num], push_uints, &[u64]);\n        forward_to_builder!(&[i8; $num], push_ints, &[i8]);\n        forward_to_builder!(&[i16; $num], push_ints, &[i16]);\n        forward_to_builder!(&[i32; $num], push_ints, &[i32]);\n        forward_to_builder!(&[i64; $num], push_ints, &[i64]);\n        forward_to_builder!(&[f32; $num], push_floats, &[f32]);\n        forward_to_builder!(&[f64; $num], push_floats, &[f64]);\n        forward_to_builder!(&[bool; $num], push_bools, &[bool]);\n    };\n}\nimpl_arrays!(0);\nimpl_arrays!(1);\nimpl_arrays!(2);\nimpl_arrays!(3);\nimpl_arrays!(4);\nimpl_arrays!(5);\nimpl_arrays!(6);\n// impl_arrays!(7);\n// impl_arrays!(8);\n// impl_arrays!(9);\n// impl_arrays!(10);\n// impl_arrays!(11);\n// impl_arrays!(12);\n// impl_arrays!(13);\n// impl_arrays!(14);\n// impl_arrays!(15);\n// impl_arrays!(16);\n// impl_arrays!(17);\n// impl_arrays!(18);\n// impl_arrays!(19);\n// impl_arrays!(20);\n// impl_arrays!(21);\n// impl_arrays!(22);\n// impl_arrays!(23);\n// impl_arrays!(24);\n// impl_arrays!(25);\n// impl_arrays!(26);\n// impl_arrays!(27);\n// impl_arrays!(28);\n// impl_arrays!(29);\n// impl_arrays!(30);\n// impl_arrays!(31);\n// impl_arrays!(32);\n"
  },
  {
    "path": "rust/flexbuffers/src/builder/ser.rs",
    "content": "// Copyright 2019 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nuse crate::Builder;\nuse serde::ser;\nuse serde::ser::*;\nuse std::fmt::Display;\n\n// This struct internally tracks the nested vectors representing\n// nested structs and such.\n// TODO: Add an option field names in a map.\n/// Flexbuffer Serializer. This should be used to serialize structs.\n#[derive(Debug, Default)]\npub struct FlexbufferSerializer {\n    builder: Builder,\n    nesting: Vec<Option<usize>>,\n}\nimpl FlexbufferSerializer {\n    pub fn new() -> Self {\n        Self::default()\n    }\n    pub fn view(&self) -> &[u8] {\n        self.builder.view()\n    }\n    pub fn take_buffer(&mut self) -> Vec<u8> {\n        self.builder.take_buffer()\n    }\n    pub fn reset(&mut self) {\n        self.builder.reset();\n        self.nesting.clear();\n    }\n    fn finish_if_not_nested(&mut self) -> Result<(), Error> {\n        if self.nesting.is_empty() {\n            assert_eq!(self.builder.values.len(), 1);\n            let root = self.builder.values.pop().unwrap();\n            super::store_root(&mut self.builder.buffer, root);\n        }\n        Ok(())\n    }\n    fn start_vector(&mut self) {\n        let previous_end =\n            if self.nesting.is_empty() { None } else { Some(self.builder.values.len()) };\n        self.nesting.push(previous_end);\n    }\n    fn start_map(&mut self) {\n        let previous_end =\n            if self.nesting.is_empty() { None } else { Some(self.builder.values.len()) };\n        self.nesting.push(previous_end);\n    }\n    fn end_vector(&mut self) -> Result<(), Error> {\n        let previous_end = self.nesting.pop().unwrap();\n        self.builder.end_map_or_vector(false, previous_end);\n        Ok(())\n    }\n    fn end_map(&mut self) -> Result<(), Error> {\n        let previous_end = self.nesting.pop().unwrap();\n        self.builder.end_map_or_vector(true, previous_end);\n        Ok(())\n    }\n}\n\n#[derive(Debug)]\n/// Errors that may happen with Serde.\npub enum Error {\n    /// Only `str` and `String` can be serialized as keys in serde maps.\n    KeyMustBeString,\n    Serde(String),\n}\n\nimpl std::fmt::Display for Error {\n    fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {\n        write!(f, \"{:?}\", self)\n    }\n}\nimpl std::error::Error for Error {}\nimpl ser::Error for Error {\n    fn custom<T>(msg: T) -> Self\n    where\n        T: Display,\n    {\n        Self::Serde(format!(\"{}\", msg))\n    }\n}\nimpl ser::SerializeSeq for &mut FlexbufferSerializer {\n    type Ok = ();\n    type Error = Error;\n    fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>\n    where\n        T: Serialize,\n    {\n        value.serialize(&mut **self)\n    }\n    fn end(self) -> Result<Self::Ok, Self::Error> {\n        self.end_vector()\n    }\n}\n// This is unlike a flexbuffers map which requires CString like keys.\n// Its implemented as alternating keys and values (hopefully).\nimpl ser::SerializeMap for &mut FlexbufferSerializer {\n    type Ok = ();\n    type Error = Error;\n    fn serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), Self::Error>\n    where\n        T: Serialize,\n    {\n        key.serialize(MapKeySerializer(self))\n    }\n    fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>\n    where\n        T: Serialize,\n    {\n        value.serialize(&mut **self)\n    }\n    fn end(self) -> Result<Self::Ok, Self::Error> {\n        self.end_map()\n    }\n}\nimpl ser::SerializeTuple for &mut FlexbufferSerializer {\n    type Ok = ();\n    type Error = Error;\n    fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>\n    where\n        T: Serialize,\n    {\n        value.serialize(&mut **self)\n    }\n    fn end(self) -> Result<Self::Ok, Self::Error> {\n        self.end_vector()\n    }\n}\nimpl ser::SerializeTupleStruct for &mut FlexbufferSerializer {\n    type Ok = ();\n    type Error = Error;\n    fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>\n    where\n        T: Serialize,\n    {\n        value.serialize(&mut **self)\n    }\n    fn end(self) -> Result<Self::Ok, Self::Error> {\n        self.end_vector()\n    }\n}\nimpl ser::SerializeStruct for &mut FlexbufferSerializer {\n    type Ok = ();\n    type Error = Error;\n    fn serialize_field<T: ?Sized>(\n        &mut self,\n        key: &'static str,\n        value: &T,\n    ) -> Result<(), Self::Error>\n    where\n        T: Serialize,\n    {\n        self.builder.push_key(key);\n        value.serialize(&mut **self)\n    }\n    fn end(self) -> Result<Self::Ok, Self::Error> {\n        self.end_map()\n    }\n}\nimpl ser::SerializeTupleVariant for &mut FlexbufferSerializer {\n    type Ok = ();\n    type Error = Error;\n    fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>\n    where\n        T: Serialize,\n    {\n        value.serialize(&mut **self)\n    }\n    fn end(self) -> Result<Self::Ok, Self::Error> {\n        self.end_vector()?;\n        self.end_map()\n    }\n}\nimpl ser::SerializeStructVariant for &mut FlexbufferSerializer {\n    type Ok = ();\n    type Error = Error;\n    fn serialize_field<T: ?Sized>(\n        &mut self,\n        key: &'static str,\n        value: &T,\n    ) -> Result<(), Self::Error>\n    where\n        T: Serialize,\n    {\n        self.builder.push_key(key);\n        value.serialize(&mut **self)\n    }\n    fn end(self) -> Result<Self::Ok, Self::Error> {\n        self.end_map()?;\n        self.end_map()\n    }\n    // TODO: skip field?\n}\n\nimpl<'a> ser::Serializer for &'a mut FlexbufferSerializer {\n    type SerializeSeq = &'a mut FlexbufferSerializer;\n    type SerializeTuple = &'a mut FlexbufferSerializer;\n    type SerializeTupleStruct = &'a mut FlexbufferSerializer;\n    type SerializeTupleVariant = &'a mut FlexbufferSerializer;\n    type SerializeMap = &'a mut FlexbufferSerializer;\n    type SerializeStruct = &'a mut FlexbufferSerializer;\n    type SerializeStructVariant = &'a mut FlexbufferSerializer;\n    type Ok = ();\n    type Error = Error;\n    fn is_human_readable(&self) -> bool {\n        cfg!(feature = \"serialize_human_readable\")\n    }\n    fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {\n        self.builder.push(v);\n        self.finish_if_not_nested()\n    }\n    fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {\n        self.builder.push(v);\n        self.finish_if_not_nested()\n    }\n    fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {\n        self.builder.push(v);\n        self.finish_if_not_nested()\n    }\n    fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {\n        self.builder.push(v);\n        self.finish_if_not_nested()\n    }\n    fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {\n        self.builder.push(v);\n        self.finish_if_not_nested()\n    }\n    fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {\n        self.builder.push(v);\n        self.finish_if_not_nested()\n    }\n    fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {\n        self.builder.push(v);\n        self.finish_if_not_nested()\n    }\n    fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {\n        self.builder.push(v);\n        self.finish_if_not_nested()\n    }\n    fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {\n        self.builder.push(v);\n        self.finish_if_not_nested()\n    }\n    fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {\n        self.builder.push(v);\n        self.finish_if_not_nested()\n    }\n    fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {\n        self.builder.push(v);\n        self.finish_if_not_nested()\n    }\n    fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {\n        self.builder.push(v as u8);\n        self.finish_if_not_nested()\n    }\n    fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {\n        self.builder.push(v);\n        self.finish_if_not_nested()\n    }\n    fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {\n        self.builder.push(crate::Blob(v));\n        self.finish_if_not_nested()\n    }\n    fn serialize_none(self) -> Result<Self::Ok, Self::Error> {\n        self.builder.push(());\n        self.finish_if_not_nested()\n    }\n    fn serialize_some<T: ?Sized>(self, t: &T) -> Result<Self::Ok, Self::Error>\n    where\n        T: Serialize,\n    {\n        t.serialize(self)\n    }\n    fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {\n        self.builder.push(());\n        self.finish_if_not_nested()\n    }\n    fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {\n        self.builder.push(());\n        self.finish_if_not_nested()\n    }\n    fn serialize_unit_variant(\n        self,\n        _name: &'static str,\n        _variant_index: u32,\n        variant: &'static str,\n    ) -> Result<Self::Ok, Self::Error> {\n        self.builder.push(variant);\n        self.finish_if_not_nested()\n    }\n    fn serialize_newtype_struct<T: ?Sized>(\n        self,\n        _name: &'static str,\n        value: &T,\n    ) -> Result<Self::Ok, Self::Error>\n    where\n        T: Serialize,\n    {\n        value.serialize(self)\n    }\n    fn serialize_newtype_variant<T: ?Sized>(\n        self,\n        _name: &'static str,\n        _variant_index: u32,\n        variant: &'static str,\n        value: &T,\n    ) -> Result<Self::Ok, Self::Error>\n    where\n        T: Serialize,\n    {\n        self.start_map();\n        self.builder.push_key(variant);\n        value.serialize(&mut *self)?;\n        self.end_map()\n    }\n    fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {\n        self.start_vector();\n        Ok(self)\n    }\n    fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> {\n        self.start_vector();\n        Ok(self)\n    }\n    fn serialize_tuple_struct(\n        self,\n        _name: &'static str,\n        _len: usize,\n    ) -> Result<Self::SerializeTupleStruct, Self::Error> {\n        self.start_map();\n        Ok(self)\n    }\n    fn serialize_tuple_variant(\n        self,\n        _name: &'static str,\n        _variant_index: u32,\n        variant: &'static str,\n        _len: usize,\n    ) -> Result<Self::SerializeTupleVariant, Self::Error> {\n        self.start_map();\n        self.builder.push_key(variant);\n        self.start_vector();\n        Ok(self)\n    }\n    fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {\n        self.start_map();\n        Ok(self)\n    }\n    fn serialize_struct(\n        self,\n        _name: &'static str,\n        _len: usize,\n    ) -> Result<Self::SerializeStruct, Self::Error> {\n        self.start_map();\n        Ok(self)\n    }\n    fn serialize_struct_variant(\n        self,\n        _name: &'static str,\n        _variant_index: u32,\n        variant: &'static str,\n        _len: usize,\n    ) -> Result<Self::SerializeStructVariant, Self::Error> {\n        self.start_map();\n        self.builder.push_key(variant);\n        self.start_map();\n        Ok(self)\n    }\n}\n\nfn key_must_be_a_string<T>() -> Result<T, Error> {\n    Err(Error::KeyMustBeString)\n}\nstruct MapKeySerializer<'a>(&'a mut FlexbufferSerializer);\nimpl<'a> Serializer for MapKeySerializer<'a> {\n    type Ok = ();\n    type Error = Error;\n    #[inline]\n    fn serialize_str(self, value: &str) -> Result<(), Error> {\n        self.0.builder.push_key(value);\n        Ok(())\n    }\n    #[inline]\n    fn serialize_unit_variant(\n        self,\n        _name: &'static str,\n        _variant_index: u32,\n        variant: &'static str,\n    ) -> Result<(), Error> {\n        self.0.builder.push_key(variant);\n        Ok(())\n    }\n    #[inline]\n    fn serialize_newtype_struct<T: ?Sized>(\n        self,\n        _name: &'static str,\n        value: &T,\n    ) -> Result<(), Error>\n    where\n        T: Serialize,\n    {\n        value.serialize(self)\n    }\n    type SerializeSeq = Impossible<(), Error>;\n    type SerializeTuple = Impossible<(), Error>;\n    type SerializeTupleStruct = Impossible<(), Error>;\n    type SerializeTupleVariant = Impossible<(), Error>;\n    type SerializeMap = Impossible<(), Error>;\n    type SerializeStruct = Impossible<(), Error>;\n    type SerializeStructVariant = Impossible<(), Error>;\n\n    fn is_human_readable(&self) -> bool {\n        self.0.is_human_readable()\n    }\n    fn serialize_bool(self, _value: bool) -> Result<(), Error> {\n        key_must_be_a_string()\n    }\n    fn serialize_i8(self, _value: i8) -> Result<(), Error> {\n        key_must_be_a_string()\n    }\n    fn serialize_i16(self, _value: i16) -> Result<(), Error> {\n        key_must_be_a_string()\n    }\n    fn serialize_i32(self, _value: i32) -> Result<(), Error> {\n        key_must_be_a_string()\n    }\n    fn serialize_i64(self, _value: i64) -> Result<(), Error> {\n        key_must_be_a_string()\n    }\n    fn serialize_u8(self, _value: u8) -> Result<(), Error> {\n        key_must_be_a_string()\n    }\n    fn serialize_u16(self, _value: u16) -> Result<(), Error> {\n        key_must_be_a_string()\n    }\n    fn serialize_u32(self, _value: u32) -> Result<(), Error> {\n        key_must_be_a_string()\n    }\n    fn serialize_u64(self, _value: u64) -> Result<(), Error> {\n        key_must_be_a_string()\n    }\n    fn serialize_f32(self, _value: f32) -> Result<(), Error> {\n        key_must_be_a_string()\n    }\n    fn serialize_f64(self, _value: f64) -> Result<(), Error> {\n        key_must_be_a_string()\n    }\n    fn serialize_char(self, _value: char) -> Result<(), Error> {\n        key_must_be_a_string()\n    }\n    fn serialize_bytes(self, _value: &[u8]) -> Result<(), Error> {\n        key_must_be_a_string()\n    }\n    fn serialize_unit(self) -> Result<(), Error> {\n        key_must_be_a_string()\n    }\n    fn serialize_unit_struct(self, _name: &'static str) -> Result<(), Error> {\n        key_must_be_a_string()\n    }\n    fn serialize_newtype_variant<T: ?Sized>(\n        self,\n        _name: &'static str,\n        _variant_index: u32,\n        _variant: &'static str,\n        _value: &T,\n    ) -> Result<(), Error>\n    where\n        T: Serialize,\n    {\n        key_must_be_a_string()\n    }\n    fn serialize_none(self) -> Result<(), Error> {\n        key_must_be_a_string()\n    }\n    fn serialize_some<T: ?Sized>(self, _value: &T) -> Result<(), Error>\n    where\n        T: Serialize,\n    {\n        key_must_be_a_string()\n    }\n    fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Error> {\n        key_must_be_a_string()\n    }\n    fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Error> {\n        key_must_be_a_string()\n    }\n    fn serialize_tuple_struct(\n        self,\n        _name: &'static str,\n        _len: usize,\n    ) -> Result<Self::SerializeTupleStruct, Error> {\n        key_must_be_a_string()\n    }\n    fn serialize_tuple_variant(\n        self,\n        _name: &'static str,\n        _variant_index: u32,\n        _variant: &'static str,\n        _len: usize,\n    ) -> Result<Self::SerializeTupleVariant, Error> {\n        key_must_be_a_string()\n    }\n    fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Error> {\n        key_must_be_a_string()\n    }\n    fn serialize_struct(\n        self,\n        _name: &'static str,\n        _len: usize,\n    ) -> Result<Self::SerializeStruct, Error> {\n        key_must_be_a_string()\n    }\n    fn serialize_struct_variant(\n        self,\n        _name: &'static str,\n        _variant_index: u32,\n        _variant: &'static str,\n        _len: usize,\n    ) -> Result<Self::SerializeStructVariant, Error> {\n        key_must_be_a_string()\n    }\n}\n"
  },
  {
    "path": "rust/flexbuffers/src/builder/value.rs",
    "content": "// Copyright 2019 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nuse byteorder::{LittleEndian, WriteBytesExt};\n\nuse crate::bitwidth::BitWidth;\nuse crate::bitwidth::BitWidth::*;\nuse crate::flexbuffer_type::FlexBufferType;\nuse crate::flexbuffer_type::FlexBufferType::*;\n\n/// Internal representation of FlexBuffer Types and Data before writing.\n/// These get placed on the builder's stack and are eventually commited.\n#[derive(Debug, Clone, Copy, PartialEq)]\npub enum Value {\n    // Inline types\n    Null,\n    Int(i64),\n    UInt(u64),\n    Float(f64),\n    Bool(bool),\n    /// Null termintated, c_string. Only used with `Map`s.\n    Key(usize),\n    /// The other ~20 or so types.\n    Reference {\n        address: usize,\n        child_width: BitWidth,\n        fxb_type: FlexBufferType,\n    },\n}\n\nmacro_rules! new_typed_vector {\n    ($name: ident, $v2: ident, $v3: ident, $v4: ident, $vn: ident) => {\n        /// Returns a typed vector, fixed length if possible.\n        /// Address and child width are zero initialized and must be set.\n        pub fn $name(n: usize) -> Value {\n            let address = 0;\n            let child_width = W8;\n            match n {\n                2 => Value::Reference { address, child_width, fxb_type: $v2 },\n                3 => Value::Reference { address, child_width, fxb_type: $v3 },\n                4 => Value::Reference { address, child_width, fxb_type: $v4 },\n                _ => Value::Reference { address, child_width, fxb_type: $vn },\n            }\n        }\n    };\n}\n\nimpl Value {\n    pub fn new_vector() -> Self {\n        Value::Reference { address: 0, child_width: W8, fxb_type: Vector }\n    }\n    pub fn new_map() -> Self {\n        Value::Reference { address: 0, child_width: W8, fxb_type: Map }\n    }\n    new_typed_vector!(new_int_vector, VectorInt2, VectorInt3, VectorInt4, VectorInt);\n    new_typed_vector!(new_uint_vector, VectorUInt2, VectorUInt3, VectorUInt4, VectorUInt);\n    new_typed_vector!(new_float_vector, VectorFloat2, VectorFloat3, VectorFloat4, VectorFloat);\n    pub fn fxb_type(&self) -> FlexBufferType {\n        match *self {\n            Value::Null => Null,\n            Value::Int(_) => Int,\n            Value::UInt(_) => UInt,\n            Value::Float(_) => Float,\n            Value::Bool(_) => Bool,\n            Value::Key(_) => Key,\n            Value::Reference { fxb_type, .. } => fxb_type,\n        }\n    }\n    pub fn is_fixed_length_vector(&self) -> bool {\n        self.fxb_type().is_fixed_length_vector()\n    }\n    pub fn is_inline(&self) -> bool {\n        self.fxb_type().is_inline()\n    }\n    pub fn is_reference(&self) -> bool {\n        !self.is_inline()\n    }\n    pub fn is_key(&self) -> bool {\n        if let Value::Key(_) = self {\n            true\n        } else {\n            false\n        }\n    }\n    pub fn is_typed_vector_or_map(&self) -> bool {\n        if let Value::Reference { fxb_type, .. } = self {\n            fxb_type.is_heterogenous()\n        } else {\n            false\n        }\n    }\n    pub fn prefix_length(&self) -> usize {\n        if self.is_fixed_length_vector() || self.is_inline() {\n            return 0;\n        }\n        if let Value::Reference { fxb_type, .. } = self {\n            if *fxb_type == Map {\n                return 3;\n            }\n        }\n        1\n    }\n    pub fn set_fxb_type_or_panic(&mut self, new_type: FlexBufferType) {\n        if let Value::Reference { fxb_type, .. } = self {\n            *fxb_type = new_type;\n        } else {\n            panic!(\"`set_fxb_type_or_panic` called on {:?}\", self)\n        }\n    }\n    pub fn set_child_width_or_panic(&mut self, new_width: BitWidth) {\n        if let Value::Reference { child_width, .. } = self {\n            *child_width = new_width;\n        } else {\n            panic!(\"`set_child_width_or_panic` called on {:?}\", self);\n        }\n    }\n    pub fn get_address(&self) -> Option<usize> {\n        if let Value::Reference { address, .. } | Value::Key(address) = self {\n            Some(*address)\n        } else {\n            None\n        }\n    }\n    pub fn set_address_or_panic(&mut self, new_address: usize) {\n        if let Value::Reference { address, .. } | Value::Key(address) = self {\n            *address = new_address;\n        } else {\n            panic!(\"`set_address_or_panic` called on {:?}\", self);\n        }\n    }\n    /// For inline types - the width of the value to be stored.\n    /// For reference types, the width of the referred.\n    /// Note Key types always refer to 8 bit data.\n    pub fn width_or_child_width(&self) -> BitWidth {\n        match *self {\n            Value::Int(x) => x.into(),\n            Value::UInt(x) => x.into(),\n            Value::Float(x) => x.into(),\n            Value::Key(_) | Value::Bool(_) | Value::Null => W8,\n            Value::Reference { child_width, .. } => child_width,\n        }\n    }\n    pub fn relative_address(self, written_at: usize) -> Option<Value> {\n        self.get_address().map(|address| {\n            let offset = written_at\n                .checked_sub(address)\n                .expect(\"Error: References may only refer backwards in buffer.\");\n            Value::UInt(offset as u64)\n        })\n    }\n    /// Computes the minimum required width of `value` when stored in a vector\n    /// starting at `vector_start` at index `idx` (this index includes the prefix).\n    /// `Value::Reference{..}` variants require location information because\n    /// offsets are relative.\n    pub fn width_in_vector(self, vector_start: usize, idx: usize) -> BitWidth {\n        match self {\n            Value::Bool(_) => W8,\n            Value::Null => W8,\n            Value::Int(x) => x.into(),\n            Value::UInt(x) => x.into(),\n            Value::Float(x) => x.into(),\n            _ => {\n                debug_assert!(self.is_reference());\n                for &width in BitWidth::iter() {\n                    let bytes = width as usize + 1;\n                    let alignment = (bytes - vector_start % bytes) % bytes;\n                    let written_at = vector_start + alignment + idx * bytes;\n                    // This match must always succeed.\n                    if let Some(Value::UInt(offset)) = self.relative_address(written_at) {\n                        if BitWidth::from(offset) == width {\n                            return width;\n                        }\n                    }\n                }\n                unreachable!()\n            }\n        }\n    }\n    pub fn packed_type(self, parent_width: BitWidth) -> u8 {\n        let width = if self.is_inline() {\n            std::cmp::max(parent_width, self.width_or_child_width())\n        } else {\n            self.width_or_child_width()\n        };\n        (self.fxb_type() as u8) << 2 | width as u8\n    }\n}\n\npub fn find_vector_type<'a, T>(mut values: T) -> Value\nwhere\n    T: std::iter::Iterator<Item = &'a Value>,\n{\n    let first = values.next();\n    if first.is_none() {\n        return Value::new_vector();\n    }\n    let mut len = 1;\n    let init = first.unwrap().fxb_type();\n    for v in values {\n        if v.fxb_type() != init {\n            return Value::new_vector();\n        }\n        len += 1;\n    }\n    let vector_type = match init {\n        Bool => VectorBool,\n        UInt => return Value::new_uint_vector(len),\n        Int => return Value::new_int_vector(len),\n        Float => return Value::new_float_vector(len),\n        Key => VectorKey,\n        // Note that VectorString is deprecated for writing\n        _ => return Value::new_vector(),\n    };\n    Value::Reference { address: 0, child_width: W8, fxb_type: vector_type }\n}\n\n#[inline]\npub fn store_value(buffer: &mut Vec<u8>, mut value: Value, width: BitWidth) {\n    // Remap to number types.\n    use Value::*;\n    if let Some(offset) = value.relative_address(buffer.len()) {\n        value = offset;\n    } else {\n        value = match value {\n            Bool(x) => UInt(x.into()),\n            Null => UInt(0), // Should this be 0 bytes?\n            _ => value,\n        }\n    }\n    let write_result = match (value, width) {\n        (UInt(x), W8) => buffer.write_u8(x as u8),\n        (UInt(x), W16) => buffer.write_u16::<LittleEndian>(x as u16),\n        (UInt(x), W32) => buffer.write_u32::<LittleEndian>(x as u32),\n        (UInt(x), W64) => buffer.write_u64::<LittleEndian>(x),\n        (Int(x), W8) => buffer.write_i8(x as i8),\n        (Int(x), W16) => buffer.write_i16::<LittleEndian>(x as i16),\n        (Int(x), W32) => buffer.write_i32::<LittleEndian>(x as i32),\n        (Int(x), W64) => buffer.write_i64::<LittleEndian>(x),\n        (Float(x), W32) => buffer.write_f32::<LittleEndian>(x as f32),\n        (Float(x), W64) => buffer.write_f64::<LittleEndian>(x),\n        (Float(_), _) => unreachable!(\"Error: Flatbuffers does not support 8 and 16 bit floats.\"),\n        _ => unreachable!(\"Variant not considered: {:?}\", value),\n    };\n    write_result.unwrap_or_else(|err| {\n        panic!(\"Error writing value {:?} with width {:?}: {:?}\", value, width, err)\n    });\n}\n"
  },
  {
    "path": "rust/flexbuffers/src/builder/vector.rs",
    "content": "// Copyright 2019 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nuse super::{Builder, MapBuilder, Pushable};\n\n/// Builds a Flexbuffer vector, returned by a [Builder](struct.Builder.html).\n///\n/// ## Side effect when dropped:\n/// When this is dropped, or `end_vector` is called, the vector is\n/// commited to the buffer. If this vector is the root of the flexbuffer, then the\n/// root is written and the flexbuffer is complete. The FlexBufferType of this vector\n/// is determined by the pushed values when this is dropped. The most compact vector type is\n/// automatically chosen.\npub struct VectorBuilder<'a> {\n    pub(crate) builder: &'a mut Builder,\n    // If the root is this vector then start == None. Otherwise start is the\n    // number of values in the 'values stack' before adding this vector.\n    pub(crate) start: Option<usize>,\n}\nimpl<'a> VectorBuilder<'a> {\n    /// Pushes `p` onto the vector.\n    #[inline]\n    pub fn push<P: Pushable>(&mut self, p: P) {\n        self.builder.push(p);\n    }\n    /// Starts a nested vector that will be pushed onto this vector when it is dropped.\n    #[inline]\n    pub fn start_vector(&mut self) -> VectorBuilder<'_> {\n        let start = Some(self.builder.values.len());\n        VectorBuilder { builder: self.builder, start }\n    }\n    /// Starts a nested map that will be pushed onto this vector when it is dropped.\n    #[inline]\n    pub fn start_map(&mut self) -> MapBuilder<'_> {\n        let start = Some(self.builder.values.len());\n        MapBuilder { builder: self.builder, start }\n    }\n    /// `end_vector` determines the type of the vector and writes it to the buffer.\n    /// This will happen automatically if the VectorBuilder is dropped.\n    #[inline]\n    pub fn end_vector(self) {}\n}\nimpl<'a> Drop for VectorBuilder<'a> {\n    #[inline]\n    fn drop(&mut self) {\n        self.builder.end_map_or_vector(false, self.start);\n    }\n}\n"
  },
  {
    "path": "rust/flexbuffers/src/flexbuffer_type.rs",
    "content": "// Copyright 2019 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n#![allow(deprecated)]\n/// Represents all the valid types in a flexbuffer.\n///\n/// Flexbuffers supports\n/// heterogenous maps, heterogenous vectors, typed vectors, and fixed length\n/// typed vectors for some lengths and types. Rust types are converted into\n/// Flexbuffers via the [Pushable](trait.Pushable.html) trait.\n///\n/// For exact details see the [internals document](\n/// https://google.github.io/flatbuffers/flatbuffers_internals.html)\n///\n/// ### Notes:\n/// * In the binary format, Each element of a `Map` or (heterogenous) `Vector`\n/// is stored with a byte describing its FlexBufferType and BitWidth.\n///\n/// * Typed vectors do not store this extra type information and fixed length\n/// typed vectors do not store length. Whether a vector is stored as a typed\n/// vector or fixed length typed vector is determined dymaically from the\n/// given data.\n///\n/// * Indirect numbers are stored as an offset instead of inline. Using\n/// indirect numbers instead of their inline counterparts in maps and typed\n/// vectors can reduce the minimum element width and therefore bytes used.\n\n#[repr(u8)]\n#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize, num_enum::TryFromPrimitive)]\npub enum FlexBufferType {\n    /// Nulls are represented with `()` in Rust.\n    Null = 0,\n    /// Variable width signed integer: `i8, i16, i32, i64`\n    Int = 1,\n    /// Variable width unsigned integer: `u8, u16, u32, u64`\n    UInt = 2,\n    /// Variable width floating point: `f32, f64`\n    Float = 3,\n    Bool = 26,\n    /// Null termintated, utf8 string. Typically used with `Map`s.\n    Key = 4,\n    /// Stored with a unsigned integer length, then UTF-8 bytes, and an extra null terminator that\n    /// is not counted with the length.\n    String = 5,\n    /// An Int, stored by offset rather than inline. Indirect types can keep the bitwidth of a\n    /// vector or map small when the inline value would have increased the bitwidth.\n    IndirectInt = 6,\n    /// A UInt, stored by offset rather than inline. Indirect types can keep the bitwidth of a\n    /// vector or map small when the inline value would have increased the bitwidth.\n    IndirectUInt = 7,\n    /// A Float, stored by offset rather than inline. Indirect types can keep the bitwidth of a\n    /// vector or map small when the inline value would have increased the bitwidth.\n    IndirectFloat = 8,\n    /// Maps are like Vectors except elements are associated with, and sorted by, keys.\n    Map = 9,\n    /// Heterogenous Vector (stored with a type table).\n    Vector = 10,\n    /// Homogenous Vector of Ints.\n    VectorInt = 11,\n    /// Homogenous Vector of UInts.\n    VectorUInt = 12,\n    /// Homogenous Vector of Floats.\n    VectorFloat = 13,\n    /// Homogenous Vector of Keys.\n    VectorKey = 14,\n    /// Homogenous Vector of Strings.\n    #[deprecated(\n        note = \"Please use Vector or VectorKey instead. See https://github.com/google/flatbuffers/issues/5627\"\n    )]\n    VectorString = 15,\n    /// Since the elements of a vector use the same `BitWidth` as the length,\n    /// Blob is more efficient for >255 element boolean vectors.\n    VectorBool = 36,\n    /// Homogenous vector of two Ints\n    VectorInt2 = 16,\n    /// Homogenous vector of two UInts\n    VectorUInt2 = 17,\n    /// Homogenous vector of two Floats\n    VectorFloat2 = 18,\n    /// Homogenous vector of three Ints\n    VectorInt3 = 19,\n    /// Homogenous vector of three UInts\n    VectorUInt3 = 20,\n    /// Homogenous vector of three Floats\n    VectorFloat3 = 21,\n    /// Homogenous vector of four Ints\n    VectorInt4 = 22,\n    /// Homogenous vector of four UInts\n    VectorUInt4 = 23,\n    /// Homogenous vector of four Floats\n    VectorFloat4 = 24,\n    /// An array of bytes. Stored with a variable width length.\n    Blob = 25,\n}\nuse FlexBufferType::*;\n\nimpl Default for FlexBufferType {\n    fn default() -> Self {\n        Null\n    }\n}\n\nmacro_rules! is_ty {\n    ($is_T: ident, $FTy: ident) => {\n        #[inline(always)]\n        pub fn $is_T(self) -> bool {\n            self == $FTy\n        }\n    };\n}\n\nimpl FlexBufferType {\n    /// Returns true for flexbuffer types that are stored inline.\n    pub fn is_inline(self) -> bool {\n        match self {\n            Null | Int | UInt | Float | Bool => true,\n            _ => false,\n        }\n    }\n    /// Returns true for flexbuffer types that are stored by offset.\n    pub fn is_reference(self) -> bool {\n        !self.is_inline()\n    }\n    /// Returns true if called on a map, vector, typed vector, or fixed length typed vector.\n    pub fn is_vector(self) -> bool {\n        let d = self as u8;\n        (9..25).contains(&d) || self == VectorBool\n    }\n    /// True iff the binary format stores the length.\n    /// This applies to Blob, String, Maps, and Vectors of variable length.\n    pub fn has_length_slot(self) -> bool {\n        !self.is_fixed_length_vector() && self.is_vector() || self == String || self == Blob\n    }\n    /// Returns true if called on a fixed length typed vector.\n    pub fn is_fixed_length_vector(self) -> bool {\n        self.fixed_length_vector_length().is_some()\n    }\n    /// If called on a fixed type vector, returns the type of the elements.\n    pub fn typed_vector_type(self) -> Option<FlexBufferType> {\n        match self {\n            VectorInt | VectorInt2 | VectorInt3 | VectorInt4 => Some(Int),\n            VectorUInt | VectorUInt2 | VectorUInt3 | VectorUInt4 => Some(UInt),\n            VectorFloat | VectorFloat2 | VectorFloat3 | VectorFloat4 => Some(Float),\n            VectorKey => Some(Key),\n            // Treat them as keys because we do not know width of length slot.\n            // see deprecation link.\n            VectorString => Some(Key),\n            VectorBool => Some(Bool),\n            _ => None,\n        }\n    }\n    /// Return the length of the fixed length vector or None.\n    pub fn fixed_length_vector_length(self) -> Option<usize> {\n        match self {\n            VectorInt2 | VectorUInt2 | VectorFloat2 => Some(2),\n            VectorInt3 | VectorUInt3 | VectorFloat3 => Some(3),\n            VectorInt4 | VectorUInt4 | VectorFloat4 => Some(4),\n            _ => None,\n        }\n    }\n    /// Returns true if self is a Map or Vector. Typed vectors are not heterogenous.\n    pub fn is_heterogenous(self) -> bool {\n        self == Map || self == Vector\n    }\n    /// If `self` is an indirect scalar, remap it to the scalar. Otherwise do nothing.\n    pub fn to_direct(self) -> Option<Self> {\n        match self {\n            IndirectInt => Some(Int),\n            IndirectUInt => Some(UInt),\n            IndirectFloat => Some(Float),\n            _ => None,\n        }\n    }\n    // returns true if and only if the flexbuffer type is `Null`.\n    is_ty!(is_null, Null);\n    // returns true if and only if the flexbuffer type is `Int`.\n    is_ty!(is_int, Int);\n    // returns true if and only if the flexbuffer type is `UInt`.\n    is_ty!(is_uint, UInt);\n    // returns true if and only if the flexbuffer type is `Float`.\n    is_ty!(is_float, Float);\n    // returns true if and only if the flexbuffer type is `Bool`.\n    is_ty!(is_bool, Bool);\n    // returns true if and only if the flexbuffer type is `Key`.\n    is_ty!(is_key, Key);\n    // returns true if and only if the flexbuffer type is `String`.\n    is_ty!(is_string, String);\n    // returns true if and only if the flexbuffer type is `IndirectInt`.\n    is_ty!(is_indirect_int, IndirectInt);\n    // returns true if and only if the flexbuffer type is `IndirectUInt`.\n    is_ty!(is_indirect_uint, IndirectUInt);\n    // returns true if and only if the flexbuffer type is `IndirectFloat`.\n    is_ty!(is_indirect_float, IndirectFloat);\n    // returns true if and only if the flexbuffer type is `Map`.\n    is_ty!(is_map, Map);\n    // returns true if and only if the flexbuffer type is `Vector`.\n    is_ty!(is_heterogenous_vector, Vector);\n    // returns true if and only if the flexbuffer type is `VectorInt`.\n    is_ty!(is_vector_int, VectorInt);\n    // returns true if and only if the flexbuffer type is `VectorUInt`.\n    is_ty!(is_vector_uint, VectorUInt);\n    // returns true if and only if the flexbuffer type is `VectorFloat`.\n    is_ty!(is_vector_float, VectorFloat);\n    // returns true if and only if the flexbuffer type is `VectorKey`.\n    is_ty!(is_vector_key, VectorKey);\n    // returns true if and only if the flexbuffer type is `VectorString`.\n    is_ty!(is_vector_string, VectorString);\n    // returns true if and only if the flexbuffer type is `VectorBool`.\n    is_ty!(is_vector_bool, VectorBool);\n    // returns true if and only if the flexbuffer type is `VectorInt2`.\n    is_ty!(is_vector_int2, VectorInt2);\n    // returns true if and only if the flexbuffer type is `VectorUInt2`.\n    is_ty!(is_vector_uint2, VectorUInt2);\n    // returns true if and only if the flexbuffer type is `VectorFloat2`.\n    is_ty!(is_vector_float2, VectorFloat2);\n    // returns true if and only if the flexbuffer type is `VectorInt3`.\n    is_ty!(is_vector_int3, VectorInt3);\n    // returns true if and only if the flexbuffer type is `VectorUInt3`.\n    is_ty!(is_vector_uint3, VectorUInt3);\n    // returns true if and only if the flexbuffer type is `VectorFloat3`.\n    is_ty!(is_vector_float3, VectorFloat3);\n    // returns true if and only if the flexbuffer type is `VectorInt4`.\n    is_ty!(is_vector_int4, VectorInt4);\n    // returns true if and only if the flexbuffer type is `VectorUInt4`.\n    is_ty!(is_vector_uint4, VectorUInt4);\n    // returns true if and only if the flexbuffer type is `VectorFloat4`.\n    is_ty!(is_vector_float4, VectorFloat4);\n    // returns true if and only if the flexbuffer type is `Blob`.\n    is_ty!(is_blob, Blob);\n}\n"
  },
  {
    "path": "rust/flexbuffers/src/lib.rs",
    "content": "// Copyright 2019 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n//! Flexbuffers is a high performance schemaless binary data format designed at Google.\n//! It is complementary to the schema-ed format [Flatbuffers](http://docs.rs/flatbuffers/).\n//! See [Flexbuffer Internals](https://google.github.io/flatbuffers/flatbuffers_internals.html)\n//! for details on the binary format.\n//!\n//! See the examples for usage:\n//! * [Example](https://github.com/google/flatbuffers/blob/master/samples/sample_flexbuffers.rs)\n//! * [Serde Example](https://github.com/google/flatbuffers/blob/master/samples/sample_flexbuffers_serde.rs)\n//!\n//! This rust implementation is in progress and, until the 1.0 release, breaking API changes may\n//! happen between minor versions.\n// TODO(cneo): serde stuff are behind a default-on feature flag\n//             Reader to Json is behind a default-off feature flag\n//             Serializable structs are Pushable\n//             Serde with maps - field names and type names.\n\n// Until flat/flexbuffers is on Rust v1.42, we cannot use the previously unstable matches! macro.\n#![allow(unknown_lints)]\n#![allow(clippy::match_like_matches_macro)]\n\n#[macro_use]\nextern crate bitflags;\nextern crate byteorder;\n#[macro_use]\nextern crate serde_derive;\nextern crate num_enum;\nextern crate serde;\n\nmod bitwidth;\nmod buffer;\nmod builder;\nmod flexbuffer_type;\nmod reader;\n\npub use bitwidth::BitWidth;\npub use buffer::Buffer;\npub use builder::Error as SerializationError;\npub use builder::{\n    singleton, Builder, BuilderOptions, FlexbufferSerializer, MapBuilder, Pushable, VectorBuilder,\n};\npub use flexbuffer_type::FlexBufferType;\npub use reader::Error as ReaderError;\npub use reader::{DeserializationError, MapReader, Reader, ReaderIterator, VectorReader};\nuse serde::{Deserialize, Serialize};\n\nmod private {\n    pub trait Sealed {}\n}\n\n/// Serialize as a flexbuffer into a vector.\npub fn to_vec<T: Serialize>(x: T) -> Result<Vec<u8>, SerializationError> {\n    let mut s = FlexbufferSerializer::new();\n    x.serialize(&mut s)?;\n    Ok(s.take_buffer())\n}\n\n/// Deserialize a type from a flexbuffer.\npub fn from_slice<'de, T: Deserialize<'de>>(buf: &'de [u8]) -> Result<T, DeserializationError> {\n    let r = Reader::get_root(buf)?;\n    T::deserialize(r)\n}\n\n/// Deserialize a type from a flexbuffer.\npub fn from_buffer<'de, T: Deserialize<'de>, B: Buffer>(\n    buf: &'de B,\n) -> Result<T, DeserializationError> {\n    let r = Reader::get_root(buf as &'de [u8])?;\n    T::deserialize(r)\n}\n\n/// This struct, when pushed will be serialized as a `FlexBufferType::Blob`.\n///\n/// A `Blob` is a variable width `length` followed by that many bytes of data.\n#[derive(Debug, PartialEq, Eq)]\npub struct Blob<B>(pub B);\n\nimpl<B: Buffer> Clone for Blob<B> {\n    fn clone(&self) -> Self {\n        Blob(self.0.shallow_copy())\n    }\n}\n\n/// This struct, when pushed, will be serialized as a `FlexBufferType::IndirectUInt`.\n///\n/// It is an unsigned integer stored by reference in the flexbuffer. This can reduce the\n/// size of vectors and maps containing the `IndirectUInt`.\n#[derive(Debug, Copy, Clone, PartialEq, Eq)]\npub struct IndirectUInt(pub u64);\n\n/// This struct, when pushed, will be serialized as a `FlexBufferType::IndirectInt`.\n///\n/// It is a signed integer stored by reference in the flexbuffer. This can reduce the\n/// size of vectors and maps containing the `IndirectInt`.\n#[derive(Debug, Copy, Clone, PartialEq, Eq)]\npub struct IndirectInt(pub i64);\n\n/// This struct, when pushed, will be serialized as a `FlexBufferType::IndirectFloat`.\n///\n/// It is a floating point stored by reference in the flexbuffer. This can reduce the\n/// size of vectors and maps containing the `IndirectFloat`.\n#[derive(Debug, Copy, Clone, PartialEq)]\npub struct IndirectFloat(pub f64);\n"
  },
  {
    "path": "rust/flexbuffers/src/reader/de.rs",
    "content": "// Copyright 2019 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nuse super::Error;\nuse crate::{FlexBufferType, Reader, ReaderIterator};\nuse serde::de::{\n    DeserializeSeed, Deserializer, EnumAccess, IntoDeserializer, MapAccess, SeqAccess,\n    VariantAccess, Visitor,\n};\n\n/// Errors that may happen when deserializing a flexbuffer with serde.\n#[derive(Debug, Clone, PartialEq, Eq)]\npub enum DeserializationError {\n    Reader(Error),\n    Serde(String),\n}\n\nimpl std::error::Error for DeserializationError {}\nimpl std::fmt::Display for DeserializationError {\n    fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {\n        match self {\n            Self::Reader(r) => write!(f, \"Flexbuffer Read Error: {:?}\", r),\n            Self::Serde(s) => write!(f, \"Serde Error: {}\", s),\n        }\n    }\n}\n\nimpl serde::de::Error for DeserializationError {\n    fn custom<T>(msg: T) -> Self\n    where\n        T: std::fmt::Display,\n    {\n        Self::Serde(format!(\"{}\", msg))\n    }\n}\n\nimpl std::convert::From<super::Error> for DeserializationError {\n    fn from(e: super::Error) -> Self {\n        Self::Reader(e)\n    }\n}\n\nimpl<'de> SeqAccess<'de> for ReaderIterator<&'de [u8]> {\n    type Error = DeserializationError;\n\n    fn next_element_seed<T>(\n        &mut self,\n        seed: T,\n    ) -> Result<Option<<T as DeserializeSeed<'de>>::Value>, Self::Error>\n    where\n        T: DeserializeSeed<'de>,\n    {\n        if let Some(elem) = self.next() {\n            seed.deserialize(elem).map(Some)\n        } else {\n            Ok(None)\n        }\n    }\n\n    fn size_hint(&self) -> Option<usize> {\n        Some(self.len())\n    }\n}\n\nstruct EnumReader<'de> {\n    variant: &'de str,\n    value: Option<Reader<&'de [u8]>>,\n}\n\nimpl<'de> EnumAccess<'de> for EnumReader<'de> {\n    type Error = DeserializationError;\n    type Variant = Reader<&'de [u8]>;\n\n    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>\n    where\n        V: DeserializeSeed<'de>,\n    {\n        seed.deserialize(self.variant.into_deserializer())\n            .map(|v| (v, self.value.unwrap_or_default()))\n    }\n}\n\nstruct MapAccessor<'de> {\n    keys: ReaderIterator<&'de [u8]>,\n    vals: ReaderIterator<&'de [u8]>,\n}\n\nimpl<'de> MapAccess<'de> for MapAccessor<'de> {\n    type Error = DeserializationError;\n\n    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>\n    where\n        K: DeserializeSeed<'de>,\n    {\n        if let Some(k) = self.keys.next() {\n            seed.deserialize(k).map(Some)\n        } else {\n            Ok(None)\n        }\n    }\n\n    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>\n    where\n        V: DeserializeSeed<'de>,\n    {\n        let val = self.vals.next().ok_or(Error::IndexOutOfBounds)?;\n        seed.deserialize(val)\n    }\n}\n\nimpl<'de> VariantAccess<'de> for Reader<&'de [u8]> {\n    type Error = DeserializationError;\n\n    fn unit_variant(self) -> Result<(), Self::Error> {\n        Ok(())\n    }\n\n    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>\n    where\n        T: DeserializeSeed<'de>,\n    {\n        seed.deserialize(self)\n    }\n\n    // Tuple variants have an internally tagged representation. They are vectors where Index 0 is\n    // the discriminant and index N is field N-1.\n    fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>,\n    {\n        visitor.visit_seq(self.as_vector().iter())\n    }\n\n    // Struct variants have an internally tagged representation. They are vectors where Index 0 is\n    // the discriminant and index N is field N-1.\n    fn struct_variant<V>(\n        self,\n        _fields: &'static [&'static str],\n        visitor: V,\n    ) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>,\n    {\n        let m = self.get_map()?;\n        visitor.visit_map(MapAccessor { keys: m.keys_vector().iter(), vals: m.iter_values() })\n    }\n}\n\nimpl<'de> Deserializer<'de> for Reader<&'de [u8]> {\n    type Error = DeserializationError;\n    fn is_human_readable(&self) -> bool {\n        cfg!(feature = \"deserialize_human_readable\")\n    }\n\n    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>,\n    {\n        use crate::BitWidth::*;\n        use crate::FlexBufferType::*;\n        match (self.flexbuffer_type(), self.bitwidth()) {\n            (Bool, _) => visitor.visit_bool(self.as_bool()),\n            (UInt, W8) => visitor.visit_u8(self.as_u8()),\n            (UInt, W16) => visitor.visit_u16(self.as_u16()),\n            (UInt, W32) => visitor.visit_u32(self.as_u32()),\n            (UInt, W64) => visitor.visit_u64(self.as_u64()),\n            (Int, W8) => visitor.visit_i8(self.as_i8()),\n            (Int, W16) => visitor.visit_i16(self.as_i16()),\n            (Int, W32) => visitor.visit_i32(self.as_i32()),\n            (Int, W64) => visitor.visit_i64(self.as_i64()),\n            (Float, W32) => visitor.visit_f32(self.as_f32()),\n            (Float, W64) => visitor.visit_f64(self.as_f64()),\n            (Float, _) => Err(Error::InvalidPackedType.into()), // f8 and f16 are not supported.\n            (Null, _) => visitor.visit_unit(),\n            (String, _) | (Key, _) => visitor.visit_borrowed_str(self.as_str()),\n            (Blob, _) => visitor.visit_borrowed_bytes(self.get_blob()?.0),\n            (Map, _) => {\n                let m = self.get_map()?;\n                visitor\n                    .visit_map(MapAccessor { keys: m.keys_vector().iter(), vals: m.iter_values() })\n            }\n            (ty, _) if ty.is_vector() => visitor.visit_seq(self.as_vector().iter()),\n            (ty, bw) => unreachable!(\"TODO deserialize_any {:?} {:?}.\", ty, bw),\n        }\n    }\n\n    serde::forward_to_deserialize_any! {\n        bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 str unit unit_struct bytes\n        ignored_any map identifier struct tuple tuple_struct seq string\n    }\n\n    fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>,\n    {\n        visitor.visit_char(self.as_u8() as char)\n    }\n\n    fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>,\n    {\n        visitor.visit_byte_buf(self.get_blob()?.0.to_vec())\n    }\n\n    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>,\n    {\n        if self.flexbuffer_type() == FlexBufferType::Null {\n            visitor.visit_none()\n        } else {\n            visitor.visit_some(self)\n        }\n    }\n\n    fn deserialize_newtype_struct<V>(\n        self,\n        _name: &'static str,\n        visitor: V,\n    ) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>,\n    {\n        visitor.visit_newtype_struct(self)\n    }\n\n    fn deserialize_enum<V>(\n        self,\n        _name: &'static str,\n        _variants: &'static [&'static str],\n        visitor: V,\n    ) -> Result<V::Value, Self::Error>\n    where\n        V: Visitor<'de>,\n    {\n        let (variant, value) = match self.fxb_type {\n            FlexBufferType::String => (self.as_str(), None),\n            FlexBufferType::Map => {\n                let m = self.get_map()?;\n                let variant = m.keys_vector().idx(0).get_key()?;\n                let value = Some(m.idx(0));\n                (variant, value)\n            }\n            _ => {\n                return Err(Error::UnexpectedFlexbufferType {\n                    expected: FlexBufferType::Map,\n                    actual: self.fxb_type,\n                }\n                .into());\n            }\n        };\n        visitor.visit_enum(EnumReader { variant, value })\n    }\n}\n"
  },
  {
    "path": "rust/flexbuffers/src/reader/iter.rs",
    "content": "// Copyright 2019 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nuse crate::{Buffer, Reader, VectorReader};\nuse std::iter::{DoubleEndedIterator, ExactSizeIterator, FusedIterator, Iterator};\n\n/// Iterates over a flexbuffer vector, typed vector, or map. Yields [Readers](struct.Reader.html).\n///\n/// If any error occurs, the Reader is defaulted to a Null flexbuffer Reader.\npub struct ReaderIterator<B> {\n    pub(super) reader: VectorReader<B>,\n    pub(super) front: usize,\n    end: usize,\n}\n\nimpl<B: Buffer> ReaderIterator<B> {\n    pub(super) fn new(reader: VectorReader<B>) -> Self {\n        let end = reader.len();\n        ReaderIterator { reader, front: 0, end }\n    }\n}\n\nimpl<B: Buffer> Iterator for ReaderIterator<B> {\n    type Item = Reader<B>;\n    fn next(&mut self) -> Option<Self::Item> {\n        if self.front < self.end {\n            let r = self.reader.idx(self.front);\n            self.front += 1;\n            Some(r)\n        } else {\n            None\n        }\n    }\n    fn size_hint(&self) -> (usize, Option<usize>) {\n        let remaining = self.end - self.front;\n        (remaining, Some(remaining))\n    }\n}\n\nimpl<B: Buffer> DoubleEndedIterator for ReaderIterator<B> {\n    fn next_back(&mut self) -> Option<Self::Item> {\n        if self.front < self.end {\n            self.end -= 1;\n            Some(self.reader.idx(self.end))\n        } else {\n            None\n        }\n    }\n}\n\nimpl<B: Buffer> ExactSizeIterator for ReaderIterator<B> {}\nimpl<B: Buffer> FusedIterator for ReaderIterator<B> {}\n"
  },
  {
    "path": "rust/flexbuffers/src/reader/map.rs",
    "content": "// Copyright 2019 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nuse super::{deref_offset, unpack_type, Error, Reader, ReaderIterator, VectorReader};\nuse crate::BitWidth;\nuse crate::Buffer;\nuse std::cmp::Ordering;\nuse std::iter::{DoubleEndedIterator, ExactSizeIterator, FusedIterator, Iterator};\n\n/// Allows indexing on a flexbuffer map.\n///\n/// MapReaders may be indexed with strings or usizes. `index` returns a result type,\n/// which may indicate failure due to a missing key or bad data, `idx` returns an Null Reader in\n/// cases of error.\npub struct MapReader<B> {\n    pub(super) buffer: B,\n    pub(super) values_address: usize,\n    pub(super) keys_address: usize,\n    pub(super) values_width: BitWidth,\n    pub(super) keys_width: BitWidth,\n    pub(super) length: usize,\n}\n\nimpl<B: Buffer> Clone for MapReader<B> {\n    fn clone(&self) -> Self {\n        MapReader { buffer: self.buffer.shallow_copy(), ..*self }\n    }\n}\n\nimpl<B: Buffer> Default for MapReader<B> {\n    fn default() -> Self {\n        MapReader {\n            buffer: B::empty(),\n            values_address: usize::default(),\n            keys_address: usize::default(),\n            values_width: BitWidth::default(),\n            keys_width: BitWidth::default(),\n            length: usize::default(),\n        }\n    }\n}\n\n// manual implementation of Debug because buffer slice can't be automatically displayed\nimpl<B: Buffer> std::fmt::Debug for MapReader<B> {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        // skips buffer field\n        f.debug_struct(\"MapReader\")\n            .field(\"values_address\", &self.values_address)\n            .field(\"keys_address\", &self.keys_address)\n            .field(\"values_width\", &self.values_width)\n            .field(\"keys_width\", &self.keys_width)\n            .field(\"length\", &self.length)\n            .finish()\n    }\n}\n\nimpl<B: Buffer> MapReader<B> {\n    /// Returns the number of key/value pairs are in the map.\n    pub fn len(&self) -> usize {\n        self.length\n    }\n\n    /// Returns true if the map has zero key/value pairs.\n    pub fn is_empty(&self) -> bool {\n        self.length == 0\n    }\n\n    // Using &CStr will eagerly compute the length of the key. &str needs length info AND utf8\n    // validation. This version is faster than both.\n    fn lazy_strcmp(&self, key_addr: usize, key: &str) -> Ordering {\n        // TODO: Can we know this won't OOB and panic?\n        let k = self.buffer[key_addr..].iter().take_while(|&&b| b != b'\\0');\n        k.cmp(key.as_bytes().iter())\n    }\n\n    /// Returns the index of a given key in the map.\n    pub fn index_key(&self, key: &str) -> Option<usize> {\n        let (mut low, mut high) = (0, self.length);\n        while low < high {\n            let i = (low + high) / 2;\n            let key_offset_address = self.keys_address + i * self.keys_width.n_bytes();\n            let key_address =\n                deref_offset(&self.buffer, key_offset_address, self.keys_width).ok()?;\n            match self.lazy_strcmp(key_address, key) {\n                Ordering::Equal => return Some(i),\n                Ordering::Less => low = if i == low { i + 1 } else { i },\n                Ordering::Greater => high = i,\n            }\n        }\n        None\n    }\n\n    /// Index into a map with a key or usize.\n    pub fn index<I: MapReaderIndexer>(&self, i: I) -> Result<Reader<B>, Error> {\n        i.index_map_reader(self)\n    }\n\n    /// Index into a map with a key or usize. If any errors occur a Null reader is returned.\n    pub fn idx<I: MapReaderIndexer>(&self, i: I) -> Reader<B> {\n        i.index_map_reader(self).unwrap_or_default()\n    }\n\n    fn usize_index(&self, i: usize) -> Result<Reader<B>, Error> {\n        if i >= self.length {\n            return Err(Error::IndexOutOfBounds);\n        }\n        let data_address = self.values_address + self.values_width.n_bytes() * i;\n        let type_address = self.values_address + self.values_width.n_bytes() * self.length + i;\n        let (fxb_type, width) = self\n            .buffer\n            .get(type_address)\n            .ok_or(Error::FlexbufferOutOfBounds)\n            .and_then(|&b| unpack_type(b))?;\n        Reader::new(self.buffer.shallow_copy(), data_address, fxb_type, width, self.values_width)\n    }\n\n    fn key_index(&self, k: &str) -> Result<Reader<B>, Error> {\n        let i = self.index_key(k).ok_or(Error::KeyNotFound)?;\n        self.usize_index(i)\n    }\n\n    /// Iterate over the values of the map.\n    pub fn iter_values(&self) -> ReaderIterator<B> {\n        ReaderIterator::new(VectorReader {\n            reader: Reader {\n                buffer: self.buffer.shallow_copy(),\n                fxb_type: crate::FlexBufferType::Map,\n                width: self.values_width,\n                address: self.values_address,\n            },\n            length: self.length,\n        })\n    }\n\n    /// Iterate over the keys of the map.\n    pub fn iter_keys(\n        &self,\n    ) -> impl Iterator<Item = B::BufferString> + DoubleEndedIterator + ExactSizeIterator + FusedIterator\n    {\n        self.keys_vector().iter().map(|k| k.as_str())\n    }\n\n    pub fn keys_vector(&self) -> VectorReader<B> {\n        VectorReader {\n            reader: Reader {\n                buffer: self.buffer.shallow_copy(),\n                fxb_type: crate::FlexBufferType::VectorKey,\n                width: self.keys_width,\n                address: self.keys_address,\n            },\n            length: self.length,\n        }\n    }\n}\n\npub trait MapReaderIndexer {\n    fn index_map_reader<B: Buffer>(self, r: &MapReader<B>) -> Result<Reader<B>, Error>;\n}\n\nimpl MapReaderIndexer for usize {\n    #[inline]\n    fn index_map_reader<B: Buffer>(self, r: &MapReader<B>) -> Result<Reader<B>, Error> {\n        r.usize_index(self)\n    }\n}\n\nimpl MapReaderIndexer for &str {\n    #[inline]\n    fn index_map_reader<B: Buffer>(self, r: &MapReader<B>) -> Result<Reader<B>, Error> {\n        r.key_index(self)\n    }\n}\n"
  },
  {
    "path": "rust/flexbuffers/src/reader/mod.rs",
    "content": "// Copyright 2019 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nuse crate::bitwidth::BitWidth;\nuse crate::flexbuffer_type::FlexBufferType;\nuse crate::{Blob, Buffer};\nuse std::convert::{TryFrom, TryInto};\nuse std::fmt;\nuse std::ops::Rem;\nuse std::str::FromStr;\nmod de;\nmod iter;\nmod map;\nmod serialize;\nmod vector;\npub use de::DeserializationError;\npub use iter::ReaderIterator;\npub use map::MapReader;\npub use vector::VectorReader;\n\n/// All the possible errors when reading a flexbuffer.\n#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]\npub enum Error {\n    /// One of the following data errors occured:\n    ///\n    /// *    The read flexbuffer had an offset that pointed outside the flexbuffer.\n    /// *    The 'negative indicies' where length and map keys are stored were out of bounds\n    /// *    The buffer was too small to contain a flexbuffer root.\n    FlexbufferOutOfBounds,\n    /// Failed to parse a valid FlexbufferType and Bitwidth from a type byte.\n    InvalidPackedType,\n    /// Flexbuffer type of the read data does not match function used.\n    UnexpectedFlexbufferType {\n        expected: FlexBufferType,\n        actual: FlexBufferType,\n    },\n    /// BitWidth type of the read data does not match function used.\n    UnexpectedBitWidth {\n        expected: BitWidth,\n        actual: BitWidth,\n    },\n    /// Read a flexbuffer offset or length that overflowed usize.\n    ReadUsizeOverflowed,\n    /// Tried to index a type that's not one of the Flexbuffer vector types.\n    CannotIndexAsVector,\n    /// Tried to index a Flexbuffer vector or map out of bounds.\n    IndexOutOfBounds,\n    /// A Map was indexed with a key that it did not contain.\n    KeyNotFound,\n    /// Failed to parse a Utf8 string.\n    /// The Option will be `None` if and only if this Error was deserialized.\n    // NOTE: std::str::Utf8Error does not implement Serialize, Deserialize, nor Default. We tell\n    // serde to skip the field and default to None. We prefer to have the boxed error so it can be\n    // used with std::error::Error::source, though another (worse) option could be to drop that\n    // information.\n    Utf8Error(#[serde(skip)] Option<Box<std::str::Utf8Error>>),\n    /// get_slice failed because the given data buffer is misaligned.\n    AlignmentError,\n    InvalidRootWidth,\n    InvalidMapKeysVectorWidth,\n}\nimpl std::convert::From<std::str::Utf8Error> for Error {\n    fn from(e: std::str::Utf8Error) -> Self {\n        Self::Utf8Error(Some(Box::new(e)))\n    }\n}\nimpl fmt::Display for Error {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self {\n            Self::UnexpectedBitWidth { expected, actual } => write!(\n                f,\n                \"Error reading flexbuffer: Expected bitwidth: {:?}, found bitwidth: {:?}\",\n                expected, actual\n            ),\n            Self::UnexpectedFlexbufferType { expected, actual } => write!(\n                f,\n                \"Error reading flexbuffer: Expected type: {:?}, found type: {:?}\",\n                expected, actual\n            ),\n            _ => write!(f, \"Error reading flexbuffer: {:?}\", self),\n        }\n    }\n}\nimpl std::error::Error for Error {\n    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {\n        if let Self::Utf8Error(Some(e)) = self {\n            Some(e)\n        } else {\n            None\n        }\n    }\n}\n\npub trait ReadLE: crate::private::Sealed + std::marker::Sized {\n    const VECTOR_TYPE: FlexBufferType;\n    const WIDTH: BitWidth;\n}\nmacro_rules! rle {\n    ($T: ty, $VECTOR_TYPE: ident, $WIDTH: ident) => {\n        impl ReadLE for $T {\n            const VECTOR_TYPE: FlexBufferType = FlexBufferType::$VECTOR_TYPE;\n            const WIDTH: BitWidth = BitWidth::$WIDTH;\n        }\n    };\n}\nrle!(u8, VectorUInt, W8);\nrle!(u16, VectorUInt, W16);\nrle!(u32, VectorUInt, W32);\nrle!(u64, VectorUInt, W64);\nrle!(i8, VectorInt, W8);\nrle!(i16, VectorInt, W16);\nrle!(i32, VectorInt, W32);\nrle!(i64, VectorInt, W64);\nrle!(f32, VectorFloat, W32);\nrle!(f64, VectorFloat, W64);\n\nmacro_rules! as_default {\n    ($as: ident, $get: ident, $T: ty) => {\n        pub fn $as(&self) -> $T {\n            self.$get().unwrap_or_default()\n        }\n    };\n}\n\n/// `Reader`s allow access to data stored in a Flexbuffer.\n///\n/// Each reader represents a single address in the buffer so data is read lazily. Start a reader\n/// by calling `get_root` on your flexbuffer `&[u8]`.\n///\n/// - The `get_T` methods return a `Result<T, Error>`. They return an OK value if and only if the\n/// flexbuffer type matches `T`. This is analogous to the behavior of Rust's json library, though\n/// with Result instead of Option.\n/// - The `as_T` methods will try their best to return to a value of type `T`\n/// (by casting or even parsing a string if necessary) but ultimately returns `T::default` if it\n/// fails. This behavior is analogous to that of flexbuffers C++.\npub struct Reader<B> {\n    fxb_type: FlexBufferType,\n    width: BitWidth,\n    address: usize,\n    buffer: B,\n}\n\nimpl<B: Buffer> Clone for Reader<B> {\n    fn clone(&self) -> Self {\n        Reader {\n            fxb_type: self.fxb_type,\n            width: self.width,\n            address: self.address,\n            buffer: self.buffer.shallow_copy(),\n        }\n    }\n}\n\nimpl<B: Buffer> Default for Reader<B> {\n    fn default() -> Self {\n        Reader {\n            fxb_type: FlexBufferType::default(),\n            width: BitWidth::default(),\n            address: usize::default(),\n            buffer: B::empty(),\n        }\n    }\n}\n\n// manual implementation of Debug because buffer slice can't be automatically displayed\nimpl<B> std::fmt::Debug for Reader<B> {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        // skips buffer field\n        f.debug_struct(\"Reader\")\n            .field(\"fxb_type\", &self.fxb_type)\n            .field(\"width\", &self.width)\n            .field(\"address\", &self.address)\n            .finish()\n    }\n}\n\nmacro_rules! try_cast_fn {\n    ($name: ident, $full_width: ident, $Ty: ident) => {\n        pub fn $name(&self) -> $Ty {\n            self.$full_width().try_into().unwrap_or_default()\n        }\n    };\n}\n\nfn safe_sub(a: usize, b: usize) -> Result<usize, Error> {\n    a.checked_sub(b).ok_or(Error::FlexbufferOutOfBounds)\n}\n\nfn deref_offset(buffer: &[u8], address: usize, width: BitWidth) -> Result<usize, Error> {\n    let off = read_usize(buffer, address, width);\n    safe_sub(address, off)\n}\n\nimpl<B: Buffer> Reader<B> {\n    fn new(\n        buffer: B,\n        mut address: usize,\n        mut fxb_type: FlexBufferType,\n        width: BitWidth,\n        parent_width: BitWidth,\n    ) -> Result<Self, Error> {\n        if fxb_type.is_reference() {\n            address = deref_offset(&buffer, address, parent_width)?;\n            // Indirects were dereferenced.\n            if let Some(t) = fxb_type.to_direct() {\n                fxb_type = t;\n            }\n        }\n        Ok(Reader { address, fxb_type, width, buffer })\n    }\n\n    /// Parses the flexbuffer from the given buffer. Assumes the flexbuffer root is the last byte\n    /// of the buffer.\n    pub fn get_root(buffer: B) -> Result<Self, Error> {\n        let end = buffer.len();\n        if end < 3 {\n            return Err(Error::FlexbufferOutOfBounds);\n        }\n        // Last byte is the root width.\n        let root_width = BitWidth::from_nbytes(buffer[end - 1]).ok_or(Error::InvalidRootWidth)?;\n        // Second last byte is root type.\n        let (fxb_type, width) = unpack_type(buffer[end - 2])?;\n        // Location of root data. (BitWidth bits before root type)\n        let address = safe_sub(end - 2, root_width.n_bytes())?;\n        Self::new(buffer, address, fxb_type, width, root_width)\n    }\n\n    /// Convenience function to get the underlying buffer. By using `shallow_copy`, this preserves\n    /// the lifetime that the underlying buffer has.\n    pub fn buffer(&self) -> B {\n        self.buffer.shallow_copy()\n    }\n\n    /// Returns the FlexBufferType of this Reader.\n    pub fn flexbuffer_type(&self) -> FlexBufferType {\n        self.fxb_type\n    }\n\n    /// Returns the bitwidth of this Reader.\n    pub fn bitwidth(&self) -> BitWidth {\n        self.width\n    }\n\n    /// Returns the length of the Flexbuffer. If the type has no length, or if an error occurs,\n    /// 0 is returned.\n    pub fn length(&self) -> usize {\n        if let Some(len) = self.fxb_type.fixed_length_vector_length() {\n            len\n        } else if self.fxb_type.has_length_slot() && self.address >= self.width.n_bytes() {\n            read_usize(&self.buffer, self.address - self.width.n_bytes(), self.width)\n        } else {\n            0\n        }\n    }\n    /// Returns true if the flexbuffer is aligned to 8 bytes. This guarantees, for valid\n    /// flexbuffers, that the data is correctly aligned in memory and slices can be read directly\n    /// e.g. with `get_f64s` or `get_i16s`.\n    #[inline]\n    pub fn is_aligned(&self) -> bool {\n        (self.buffer.as_ptr() as usize).rem(8) == 0\n    }\n\n    as_default!(as_vector, get_vector, VectorReader<B>);\n    as_default!(as_map, get_map, MapReader<B>);\n\n    fn expect_type(&self, ty: FlexBufferType) -> Result<(), Error> {\n        if self.fxb_type == ty {\n            Ok(())\n        } else {\n            Err(Error::UnexpectedFlexbufferType { expected: ty, actual: self.fxb_type })\n        }\n    }\n    fn expect_bw(&self, bw: BitWidth) -> Result<(), Error> {\n        if self.width == bw {\n            Ok(())\n        } else {\n            Err(Error::UnexpectedBitWidth { expected: bw, actual: self.width })\n        }\n    }\n\n    /// Directly reads a slice of type `T` where `T` is one of `u8,u16,u32,u64,i8,i16,i32,i64,f32,f64`.\n    /// Returns Err if the type, bitwidth, or memory alignment does not match. Since the bitwidth is\n    /// dynamic, its better to use a VectorReader unless you know your data and performance is critical.\n    #[cfg(target_endian = \"little\")]\n    #[deprecated(\n        since = \"0.3.0\",\n        note = \"This function is unsafe - if this functionality is needed use `Reader::buffer::align_to`\"\n    )]\n    pub fn get_slice<T: ReadLE>(&self) -> Result<&[T], Error> {\n        if self.flexbuffer_type().typed_vector_type() != T::VECTOR_TYPE.typed_vector_type() {\n            self.expect_type(T::VECTOR_TYPE)?;\n        }\n        if self.bitwidth().n_bytes() != std::mem::size_of::<T>() {\n            self.expect_bw(T::WIDTH)?;\n        }\n        let end = self.address + self.length() * std::mem::size_of::<T>();\n        let slice: &[u8] =\n            self.buffer.get(self.address..end).ok_or(Error::FlexbufferOutOfBounds)?;\n\n        // `align_to` is required because the point of this function is to directly hand back a\n        // slice of scalars. This can fail because Rust's default allocator is not 16byte aligned\n        // (though in practice this only happens for small buffers).\n        let (pre, mid, suf) = unsafe { slice.align_to::<T>() };\n        if pre.is_empty() && suf.is_empty() {\n            Ok(mid)\n        } else {\n            Err(Error::AlignmentError)\n        }\n    }\n\n    /// Returns the value of the reader if it is a boolean.\n    /// Otherwise Returns error.\n    pub fn get_bool(&self) -> Result<bool, Error> {\n        self.expect_type(FlexBufferType::Bool)?;\n        Ok(self.buffer[self.address..self.address + self.width.n_bytes()].iter().any(|&b| b != 0))\n    }\n\n    /// Gets the length of the key if this type is a key.\n    ///\n    /// Otherwise, returns an error.\n    #[inline]\n    fn get_key_len(&self) -> Result<usize, Error> {\n        self.expect_type(FlexBufferType::Key)?;\n        let (length, _) = self.buffer[self.address..]\n            .iter()\n            .enumerate()\n            .find(|(_, &b)| b == b'\\0')\n            .unwrap_or((0, &0));\n        Ok(length)\n    }\n\n    /// Retrieves the string value up until the first `\\0` character.\n    pub fn get_key(&self) -> Result<B::BufferString, Error> {\n        let bytes = self\n            .buffer\n            .slice(self.address..self.address + self.get_key_len()?)\n            .ok_or(Error::IndexOutOfBounds)?;\n        Ok(bytes.buffer_str()?)\n    }\n\n    pub fn get_blob(&self) -> Result<Blob<B>, Error> {\n        self.expect_type(FlexBufferType::Blob)?;\n        Ok(Blob(\n            self.buffer\n                .slice(self.address..self.address + self.length())\n                .ok_or(Error::IndexOutOfBounds)?,\n        ))\n    }\n\n    pub fn as_blob(&self) -> Blob<B> {\n        self.get_blob().unwrap_or_else(|_| Blob(B::empty()))\n    }\n\n    /// Retrieves str pointer, errors if invalid UTF-8, or the provided index\n    /// is out of bounds.\n    pub fn get_str(&self) -> Result<B::BufferString, Error> {\n        self.expect_type(FlexBufferType::String)?;\n        let bytes = self.buffer.slice(self.address..self.address + self.length());\n        Ok(bytes.ok_or(Error::ReadUsizeOverflowed)?.buffer_str()?)\n    }\n\n    fn get_map_info(&self) -> Result<(usize, BitWidth), Error> {\n        self.expect_type(FlexBufferType::Map)?;\n        if 3 * self.width.n_bytes() >= self.address {\n            return Err(Error::FlexbufferOutOfBounds);\n        }\n        let keys_offset_address = self.address - 3 * self.width.n_bytes();\n        let keys_width = {\n            let kw_addr = self.address - 2 * self.width.n_bytes();\n            let kw = read_usize(&self.buffer, kw_addr, self.width);\n            BitWidth::from_nbytes(kw).ok_or(Error::InvalidMapKeysVectorWidth)\n        }?;\n        Ok((keys_offset_address, keys_width))\n    }\n\n    pub fn get_map(&self) -> Result<MapReader<B>, Error> {\n        let (keys_offset_address, keys_width) = self.get_map_info()?;\n        let keys_address = deref_offset(&self.buffer, keys_offset_address, self.width)?;\n        // TODO(cneo): Check that vectors length equals keys length.\n        Ok(MapReader {\n            buffer: self.buffer.shallow_copy(),\n            values_address: self.address,\n            values_width: self.width,\n            keys_address,\n            keys_width,\n            length: self.length(),\n        })\n    }\n\n    /// Tries to read a FlexBufferType::UInt. Returns Err if the type is not a UInt or if the\n    /// address is out of bounds.\n    pub fn get_u64(&self) -> Result<u64, Error> {\n        self.expect_type(FlexBufferType::UInt)?;\n        let cursor = self.buffer.get(self.address..self.address + self.width.n_bytes());\n        match self.width {\n            BitWidth::W8 => cursor.map(|s| s[0] as u8).map(Into::into),\n            BitWidth::W16 => {\n                cursor.and_then(|s| s.try_into().ok()).map(<u16>::from_le_bytes).map(Into::into)\n            }\n            BitWidth::W32 => {\n                cursor.and_then(|s| s.try_into().ok()).map(<u32>::from_le_bytes).map(Into::into)\n            }\n            BitWidth::W64 => cursor.and_then(|s| s.try_into().ok()).map(<u64>::from_le_bytes),\n        }\n        .ok_or(Error::FlexbufferOutOfBounds)\n    }\n    /// Tries to read a FlexBufferType::Int. Returns Err if the type is not a UInt or if the\n    /// address is out of bounds.\n    pub fn get_i64(&self) -> Result<i64, Error> {\n        self.expect_type(FlexBufferType::Int)?;\n        let cursor = self.buffer.get(self.address..self.address + self.width.n_bytes());\n        match self.width {\n            BitWidth::W8 => cursor.map(|s| s[0] as i8).map(Into::into),\n            BitWidth::W16 => {\n                cursor.and_then(|s| s.try_into().ok()).map(<i16>::from_le_bytes).map(Into::into)\n            }\n            BitWidth::W32 => {\n                cursor.and_then(|s| s.try_into().ok()).map(<i32>::from_le_bytes).map(Into::into)\n            }\n            BitWidth::W64 => cursor.and_then(|s| s.try_into().ok()).map(<i64>::from_le_bytes),\n        }\n        .ok_or(Error::FlexbufferOutOfBounds)\n    }\n    /// Tries to read a FlexBufferType::Float. Returns Err if the type is not a UInt, if the\n    /// address is out of bounds, or if its a f16 or f8 (not currently supported).\n    pub fn get_f64(&self) -> Result<f64, Error> {\n        self.expect_type(FlexBufferType::Float)?;\n        let cursor = self.buffer.get(self.address..self.address + self.width.n_bytes());\n        match self.width {\n            BitWidth::W8 | BitWidth::W16 => return Err(Error::InvalidPackedType),\n            BitWidth::W32 => {\n                cursor.and_then(|s| s.try_into().ok()).map(f32_from_le_bytes).map(Into::into)\n            }\n            BitWidth::W64 => cursor.and_then(|s| s.try_into().ok()).map(f64_from_le_bytes),\n        }\n        .ok_or(Error::FlexbufferOutOfBounds)\n    }\n    pub fn as_bool(&self) -> bool {\n        use FlexBufferType::*;\n        match self.fxb_type {\n            Bool => self.get_bool().unwrap_or_default(),\n            UInt => self.as_u64() != 0,\n            Int => self.as_i64() != 0,\n            Float => self.as_f64().abs() > std::f64::EPSILON,\n            String | Key => !self.as_str().is_empty(),\n            Null => false,\n            Blob => self.length() != 0,\n            ty if ty.is_vector() => self.length() != 0,\n            _ => unreachable!(),\n        }\n    }\n    /// Returns a u64, casting if necessary. For Maps and Vectors, their length is\n    /// returned. If anything fails, 0 is returned.\n    pub fn as_u64(&self) -> u64 {\n        match self.fxb_type {\n            FlexBufferType::UInt => self.get_u64().unwrap_or_default(),\n            FlexBufferType::Int => {\n                self.get_i64().unwrap_or_default().try_into().unwrap_or_default()\n            }\n            FlexBufferType::Float => self.get_f64().unwrap_or_default() as u64,\n            FlexBufferType::String => {\n                if let Ok(s) = self.get_str() {\n                    if let Ok(f) = u64::from_str(&s) {\n                        return f;\n                    }\n                }\n                0\n            }\n            _ if self.fxb_type.is_vector() => self.length() as u64,\n            _ => 0,\n        }\n    }\n    try_cast_fn!(as_u32, as_u64, u32);\n    try_cast_fn!(as_u16, as_u64, u16);\n    try_cast_fn!(as_u8, as_u64, u8);\n\n    /// Returns an i64, casting if necessary. For Maps and Vectors, their length is\n    /// returned. If anything fails, 0 is returned.\n    pub fn as_i64(&self) -> i64 {\n        match self.fxb_type {\n            FlexBufferType::Int => self.get_i64().unwrap_or_default(),\n            FlexBufferType::UInt => {\n                self.get_u64().unwrap_or_default().try_into().unwrap_or_default()\n            }\n            FlexBufferType::Float => self.get_f64().unwrap_or_default() as i64,\n            FlexBufferType::String => {\n                if let Ok(s) = self.get_str() {\n                    if let Ok(f) = i64::from_str(&s) {\n                        return f;\n                    }\n                }\n                0\n            }\n            _ if self.fxb_type.is_vector() => self.length() as i64,\n            _ => 0,\n        }\n    }\n    try_cast_fn!(as_i32, as_i64, i32);\n    try_cast_fn!(as_i16, as_i64, i16);\n    try_cast_fn!(as_i8, as_i64, i8);\n\n    /// Returns an f64, casting if necessary. For Maps and Vectors, their length is\n    /// returned. If anything fails, 0 is returned.\n    pub fn as_f64(&self) -> f64 {\n        match self.fxb_type {\n            FlexBufferType::Int => self.get_i64().unwrap_or_default() as f64,\n            FlexBufferType::UInt => self.get_u64().unwrap_or_default() as f64,\n            FlexBufferType::Float => self.get_f64().unwrap_or_default(),\n            FlexBufferType::String => {\n                if let Ok(s) = self.get_str() {\n                    if let Ok(f) = f64::from_str(&s) {\n                        return f;\n                    }\n                }\n                0.0\n            }\n            _ if self.fxb_type.is_vector() => self.length() as f64,\n            _ => 0.0,\n        }\n    }\n    pub fn as_f32(&self) -> f32 {\n        self.as_f64() as f32\n    }\n\n    /// Returns empty string if you're not trying to read a string.\n    pub fn as_str(&self) -> B::BufferString {\n        match self.fxb_type {\n            FlexBufferType::String => self.get_str().unwrap_or_else(|_| B::empty_str()),\n            FlexBufferType::Key => self.get_key().unwrap_or_else(|_| B::empty_str()),\n            _ => B::empty_str(),\n        }\n    }\n\n    pub fn get_vector(&self) -> Result<VectorReader<B>, Error> {\n        if !self.fxb_type.is_vector() {\n            self.expect_type(FlexBufferType::Vector)?;\n        };\n        Ok(VectorReader { reader: self.clone(), length: self.length() })\n    }\n}\n\nimpl<B: Buffer> fmt::Display for Reader<B> {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        use FlexBufferType::*;\n        match self.flexbuffer_type() {\n            Null => write!(f, \"null\"),\n            UInt => write!(f, \"{}\", self.as_u64()),\n            Int => write!(f, \"{}\", self.as_i64()),\n            Float => write!(f, \"{}\", self.as_f64()),\n            Key | String => write!(f, \"{:?}\", &self.as_str() as &str),\n            Bool => write!(f, \"{}\", self.as_bool()),\n            Blob => write!(f, \"blob\"),\n            Map => {\n                write!(f, \"{{\")?;\n                let m = self.as_map();\n                let mut pairs = m.iter_keys().zip(m.iter_values());\n                if let Some((k, v)) = pairs.next() {\n                    write!(f, \"{:?}: {}\", &k as &str, v)?;\n                    for (k, v) in pairs {\n                        write!(f, \", {:?}: {}\", &k as &str, v)?;\n                    }\n                }\n                write!(f, \"}}\")\n            }\n            t if t.is_vector() => {\n                write!(f, \"[\")?;\n                let mut elems = self.as_vector().iter();\n                if let Some(first) = elems.next() {\n                    write!(f, \"{}\", first)?;\n                    for e in elems {\n                        write!(f, \", {}\", e)?;\n                    }\n                }\n                write!(f, \"]\")\n            }\n            _ => unreachable!(\"Display not implemented for {:?}\", self),\n        }\n    }\n}\n\n// TODO(cneo): Use <f..>::from_le_bytes when we move past rustc 1.39.\nfn f32_from_le_bytes(bytes: [u8; 4]) -> f32 {\n    let bits = <u32>::from_le_bytes(bytes);\n    <f32>::from_bits(bits)\n}\n\nfn f64_from_le_bytes(bytes: [u8; 8]) -> f64 {\n    let bits = <u64>::from_le_bytes(bytes);\n    <f64>::from_bits(bits)\n}\n\nfn read_usize(buffer: &[u8], address: usize, width: BitWidth) -> usize {\n    let cursor = &buffer[address..];\n    match width {\n        BitWidth::W8 => cursor[0] as usize,\n        BitWidth::W16 => cursor\n            .get(0..2)\n            .and_then(|s| s.try_into().ok())\n            .map(<u16>::from_le_bytes)\n            .unwrap_or_default() as usize,\n        BitWidth::W32 => cursor\n            .get(0..4)\n            .and_then(|s| s.try_into().ok())\n            .map(<u32>::from_le_bytes)\n            .unwrap_or_default() as usize,\n        BitWidth::W64 => cursor\n            .get(0..8)\n            .and_then(|s| s.try_into().ok())\n            .map(<u64>::from_le_bytes)\n            .unwrap_or_default() as usize,\n    }\n}\n\nfn unpack_type(ty: u8) -> Result<(FlexBufferType, BitWidth), Error> {\n    let w = BitWidth::try_from(ty & 3u8).map_err(|_| Error::InvalidPackedType)?;\n    let t = FlexBufferType::try_from(ty >> 2).map_err(|_| Error::InvalidPackedType)?;\n    Ok((t, w))\n}\n"
  },
  {
    "path": "rust/flexbuffers/src/reader/serialize.rs",
    "content": "// Copyright 2021 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nuse crate::reader::Reader;\nuse crate::Buffer;\nuse crate::{BitWidth::*, FlexBufferType::*};\nuse serde::ser;\nuse serde::ser::{SerializeMap, SerializeSeq};\n\nimpl<B: Buffer> ser::Serialize for &Reader<B> {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: ser::Serializer,\n    {\n        #[allow(deprecated)]\n        match (self.flexbuffer_type(), self.bitwidth()) {\n            (Null, _) => serializer.serialize_unit(),\n            (Int, W8) | (IndirectInt, W8) => serializer.serialize_i8(self.as_i8()),\n            (Int, W16) | (IndirectInt, W16) => serializer.serialize_i16(self.as_i16()),\n            (Int, W32) | (IndirectInt, W32) => serializer.serialize_i32(self.as_i32()),\n            (Int, W64) | (IndirectInt, W64) => serializer.serialize_i64(self.as_i64()),\n            (UInt, W8) | (IndirectUInt, W8) => serializer.serialize_u8(self.as_u8()),\n            (UInt, W16) | (IndirectUInt, W16) => serializer.serialize_u16(self.as_u16()),\n            (UInt, W32) | (IndirectUInt, W32) => serializer.serialize_u32(self.as_u32()),\n            (UInt, W64) | (IndirectUInt, W64) => serializer.serialize_u64(self.as_u64()),\n            (Float, W32) | (IndirectFloat, W32) => serializer.serialize_f32(self.as_f32()),\n            (Float, _) | (IndirectFloat, _) => serializer.serialize_f64(self.as_f64()),\n            (Bool, _) => serializer.serialize_bool(self.as_bool()),\n            (Key, _) | (String, _) => serializer.serialize_str(&self.as_str()),\n            (Map, _) => {\n                let m = self.as_map();\n                let mut map_serializer = serializer.serialize_map(Some(m.len()))?;\n                for (k, v) in m.iter_keys().zip(m.iter_values()) {\n                    map_serializer.serialize_key(&&k)?;\n                    map_serializer.serialize_value(&&v)?;\n                }\n                map_serializer.end()\n            }\n            (Vector, _)\n            | (VectorInt, _)\n            | (VectorUInt, _)\n            | (VectorFloat, _)\n            | (VectorKey, _)\n            | (VectorString, _)\n            | (VectorBool, _)\n            | (VectorInt2, _)\n            | (VectorUInt2, _)\n            | (VectorFloat2, _)\n            | (VectorInt3, _)\n            | (VectorUInt3, _)\n            | (VectorFloat3, _)\n            | (VectorInt4, _)\n            | (VectorUInt4, _)\n            | (VectorFloat4, _) => {\n                let v = self.as_vector();\n                let mut seq_serializer = serializer.serialize_seq(Some(v.len()))?;\n                for x in v.iter() {\n                    seq_serializer.serialize_element(&&x)?;\n                }\n                seq_serializer.end()\n            }\n            (Blob, _) => serializer.serialize_bytes(&self.as_blob().0),\n        }\n    }\n}\n"
  },
  {
    "path": "rust/flexbuffers/src/reader/vector.rs",
    "content": "// Copyright 2019 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nuse super::{unpack_type, Error, Reader, ReaderIterator};\nuse crate::{BitWidth, Buffer, FlexBufferType};\n\n/// Allows indexing on any flexbuffer vector type, (heterogenous vector, typed vector, or fixed\n/// length typed vector).\n///\n/// VectorReaders may be indexed with usize, `index` returns a result type\n/// which may indicate failure due to indexing out of bounds or bad data. `idx` returns a\n/// Null Reader in the event of any failure.\npub struct VectorReader<B> {\n    pub(super) reader: Reader<B>,\n    // Cache the length because read_usize can be slow.\n    pub(super) length: usize,\n}\n\nimpl<B: Buffer> Clone for VectorReader<B> {\n    fn clone(&self) -> Self {\n        VectorReader { reader: self.reader.clone(), ..*self }\n    }\n}\n\nimpl<B: Buffer> Default for VectorReader<B> {\n    fn default() -> Self {\n        VectorReader { reader: Reader::default(), length: usize::default() }\n    }\n}\n\nimpl<B: Buffer> VectorReader<B> {\n    /// Returns the number of elements in the vector.\n    pub fn len(&self) -> usize {\n        self.length\n    }\n    /// Returns true if there are 0 elements in the vector.\n    pub fn is_empty(&self) -> bool {\n        self.length == 0\n    }\n    fn get_elem_type(&self, i: usize) -> Result<(FlexBufferType, BitWidth), Error> {\n        if let Some(ty) = self.reader.fxb_type.typed_vector_type() {\n            Ok((ty, self.reader.width))\n        } else {\n            let types_addr = self.reader.address + self.length * self.reader.width.n_bytes();\n            self.reader\n                .buffer\n                .get(types_addr + i)\n                .ok_or(Error::FlexbufferOutOfBounds)\n                .and_then(|&t| unpack_type(t))\n        }\n    }\n    /// Index into a flexbuffer vector. Any errors are defaulted to Null Readers.\n    pub fn idx(&self, i: usize) -> Reader<B> {\n        self.index(i).unwrap_or_default()\n    }\n    /// Index into a flexbuffer.\n    pub fn index(&self, i: usize) -> Result<Reader<B>, Error> {\n        if i >= self.length {\n            return Err(Error::IndexOutOfBounds);\n        }\n        let (fxb_type, bw) = self.get_elem_type(i)?;\n        let data_address = self.reader.address + self.reader.width.n_bytes() * i;\n        Reader::new(\n            self.reader.buffer.shallow_copy(),\n            data_address,\n            fxb_type,\n            bw,\n            self.reader.width,\n        )\n    }\n\n    pub fn iter(&self) -> ReaderIterator<B> {\n        ReaderIterator::new(self.clone())\n    }\n}\n"
  },
  {
    "path": "rust/reflection/.gitignore",
    "content": "/target\nCargo.lock\n"
  },
  {
    "path": "rust/reflection/Cargo.toml",
    "content": "[package]\nname = \"flatbuffers-reflection\"\nversion = \"0.1.0\"\nedition = \"2021\"\n\n[dependencies]\nflatbuffers = { path = \"../flatbuffers\"}\nnum-traits = \"0.2.19\"\nanyhow = \"1.0.75\"\nthiserror = \"1.0\"\n"
  },
  {
    "path": "rust/reflection/src/lib.rs",
    "content": "/*\n * Copyright 2018 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nmod reflection_generated;\nmod reflection_verifier;\nmod safe_buffer;\nmod r#struct;\npub use crate::r#struct::Struct;\npub use crate::reflection_generated::reflection;\npub use crate::safe_buffer::SafeBuffer;\n\nuse flatbuffers::{\n    emplace_scalar, read_scalar, EndianScalar, Follow, ForwardsUOffset, InvalidFlatbuffer,\n    SOffsetT, Table, UOffsetT, VOffsetT, Vector, SIZE_SOFFSET, SIZE_UOFFSET,\n};\nuse reflection_generated::reflection::{BaseType, Field, Object, Schema};\n\nuse core::mem::size_of;\nuse num_traits::float::Float;\nuse num_traits::int::PrimInt;\nuse num_traits::FromPrimitive;\nuse thiserror::Error;\n\n#[derive(Error, Debug, PartialEq)]\npub enum FlatbufferError {\n    #[error(transparent)]\n    VerificationError(#[from] flatbuffers::InvalidFlatbuffer),\n    #[error(\"Failed to convert between data type {0} and field type {1}\")]\n    FieldTypeMismatch(String, String),\n    #[error(\"Set field value not supported for non-populated or non-scalar fields\")]\n    SetValueNotSupported,\n    #[error(transparent)]\n    ParseFloatError(#[from] std::num::ParseFloatError),\n    #[error(transparent)]\n    TryFromIntError(#[from] std::num::TryFromIntError),\n    #[error(\"Couldn't set string because cache vector is polluted\")]\n    SetStringPolluted,\n    #[error(\"Invalid schema: Polluted buffer or the schema doesn't match the buffer.\")]\n    InvalidSchema,\n    #[error(\"Type not supported: {0}\")]\n    TypeNotSupported(String),\n    #[error(\"No type or invalid type found in union enum\")]\n    InvalidUnionEnum,\n    #[error(\"Table or Struct doesn't belong to the buffer\")]\n    InvalidTableOrStruct,\n    #[error(\"Field not found in the table schema\")]\n    FieldNotFound,\n}\n\npub type FlatbufferResult<T, E = FlatbufferError> = core::result::Result<T, E>;\n\n/// Gets the root table from a trusted Flatbuffer.\n///\n/// # Safety\n///\n/// Flatbuffers accessors do not perform validation checks before accessing. Users\n/// must trust [data] contains a valid flatbuffer. Reading unchecked buffers may cause panics or even UB.\npub unsafe fn get_any_root(data: &[u8]) -> Table {\n    <ForwardsUOffset<Table>>::follow(data, 0)\n}\n\n/// Gets an integer table field given its exact type. Returns default integer value if the field is not set. Returns [None] if no default value is found. Returns error if the type size doesn't match.\n///\n/// # Safety\n///\n/// The value of the corresponding slot must have type T\npub unsafe fn get_field_integer<T: for<'a> Follow<'a, Inner = T> + PrimInt + FromPrimitive>(\n    table: &Table,\n    field: &Field,\n) -> FlatbufferResult<Option<T>> {\n    if size_of::<T>() != get_type_size(field.type_().base_type()) {\n        return Err(FlatbufferError::FieldTypeMismatch(\n            std::any::type_name::<T>().to_string(),\n            field.type_().base_type().variant_name().unwrap_or_default().to_string(),\n        ));\n    }\n\n    let default = T::from_i64(field.default_integer());\n    Ok(table.get::<T>(field.offset(), default))\n}\n\n/// Gets a floating point table field given its exact type. Returns default float value if the field is not set. Returns [None] if no default value is found. Returns error if the type doesn't match.\n///\n/// # Safety\n///\n/// The value of the corresponding slot must have type T\npub unsafe fn get_field_float<T: for<'a> Follow<'a, Inner = T> + Float>(\n    table: &Table,\n    field: &Field,\n) -> FlatbufferResult<Option<T>> {\n    if size_of::<T>() != get_type_size(field.type_().base_type()) {\n        return Err(FlatbufferError::FieldTypeMismatch(\n            std::any::type_name::<T>().to_string(),\n            field.type_().base_type().variant_name().unwrap_or_default().to_string(),\n        ));\n    }\n\n    let default = T::from(field.default_real());\n    Ok(table.get::<T>(field.offset(), default))\n}\n\n/// Gets a String table field given its exact type. Returns empty string if the field is not set. Returns [None] if no default value is found. Returns error if the type size doesn't match.\n///\n/// # Safety\n///\n/// The value of the corresponding slot must have type String\npub unsafe fn get_field_string<'a>(\n    table: &Table<'a>,\n    field: &Field,\n) -> FlatbufferResult<Option<&'a str>> {\n    if field.type_().base_type() != BaseType::String {\n        return Err(FlatbufferError::FieldTypeMismatch(\n            String::from(\"String\"),\n            field.type_().base_type().variant_name().unwrap_or_default().to_string(),\n        ));\n    }\n\n    Ok(table.get::<ForwardsUOffset<&'a str>>(field.offset(), Some(\"\")))\n}\n\n/// Gets a [Struct] table field given its exact type. Returns [None] if the field is not set. Returns error if the type doesn't match.\n///\n/// # Safety\n///\n/// The value of the corresponding slot must have type Struct\npub unsafe fn get_field_struct<'a>(\n    table: &Table<'a>,\n    field: &Field,\n) -> FlatbufferResult<Option<Struct<'a>>> {\n    // TODO inherited from C++: This does NOT check if the field is a table or struct, but we'd need\n    // access to the schema to check the is_struct flag.\n    if field.type_().base_type() != BaseType::Obj {\n        return Err(FlatbufferError::FieldTypeMismatch(\n            String::from(\"Obj\"),\n            field.type_().base_type().variant_name().unwrap_or_default().to_string(),\n        ));\n    }\n\n    Ok(table.get::<Struct>(field.offset(), None))\n}\n\n/// Gets a Vector table field given its exact type. Returns empty vector if the field is not set. Returns error if the type doesn't match.\n///\n/// # Safety\n///\n/// The value of the corresponding slot must have type Vector\npub unsafe fn get_field_vector<'a, T: Follow<'a, Inner = T>>(\n    table: &Table<'a>,\n    field: &Field,\n) -> FlatbufferResult<Option<Vector<'a, T>>> {\n    if field.type_().base_type() != BaseType::Vector\n        || core::mem::size_of::<T>() != get_type_size(field.type_().element())\n    {\n        return Err(FlatbufferError::FieldTypeMismatch(\n            std::any::type_name::<T>().to_string(),\n            field.type_().base_type().variant_name().unwrap_or_default().to_string(),\n        ));\n    }\n\n    Ok(table.get::<ForwardsUOffset<Vector<'a, T>>>(field.offset(), Some(Vector::<T>::default())))\n}\n\n/// Gets a Table table field given its exact type. Returns [None] if the field is not set. Returns error if the type doesn't match.\n///\n/// # Safety\n///\n/// The value of the corresponding slot must have type Table\npub unsafe fn get_field_table<'a>(\n    table: &Table<'a>,\n    field: &Field,\n) -> FlatbufferResult<Option<Table<'a>>> {\n    if field.type_().base_type() != BaseType::Obj {\n        return Err(FlatbufferError::FieldTypeMismatch(\n            String::from(\"Obj\"),\n            field.type_().base_type().variant_name().unwrap_or_default().to_string(),\n        ));\n    }\n\n    Ok(table.get::<ForwardsUOffset<Table<'a>>>(field.offset(), None))\n}\n\n/// Returns the value of any table field as a 64-bit int, regardless of what type it is. Returns default integer if the field is not set or error if the value cannot be parsed as integer.\n/// [num_traits](https://docs.rs/num-traits/latest/num_traits/cast/trait.NumCast.html) is used for number casting.\n///\n/// # Safety\n///\n/// [table] must contain recursively valid offsets that match the [field].\npub unsafe fn get_any_field_integer(table: &Table, field: &Field) -> FlatbufferResult<i64> {\n    if let Some(field_loc) = get_field_loc(table, field) {\n        get_any_value_integer(field.type_().base_type(), table.buf(), field_loc)\n    } else {\n        Ok(field.default_integer())\n    }\n}\n\n/// Returns the value of any table field as a 64-bit floating point, regardless of what type it is. Returns default float if the field is not set or error if the value cannot be parsed as float.\n///\n/// # Safety\n///\n/// [table] must contain recursively valid offsets that match the [field].\npub unsafe fn get_any_field_float(table: &Table, field: &Field) -> FlatbufferResult<f64> {\n    if let Some(field_loc) = get_field_loc(table, field) {\n        get_any_value_float(field.type_().base_type(), table.buf(), field_loc)\n    } else {\n        Ok(field.default_real())\n    }\n}\n\n/// Returns the value of any table field as a string, regardless of what type it is. Returns empty string if the field is not set.\n///\n/// # Safety\n///\n/// [table] must contain recursively valid offsets that match the [field].\npub unsafe fn get_any_field_string(table: &Table, field: &Field, schema: &Schema) -> String {\n    if let Some(field_loc) = get_field_loc(table, field) {\n        get_any_value_string(\n            field.type_().base_type(),\n            table.buf(),\n            field_loc,\n            schema,\n            field.type_().index() as usize,\n        )\n    } else {\n        String::from(\"\")\n    }\n}\n\n/// Gets a [Struct] struct field given its exact type. Returns error if the type doesn't match.\n///\n/// # Safety\n///\n/// The value of the corresponding slot must have type Struct.\npub unsafe fn get_field_struct_in_struct<'a>(\n    st: &Struct<'a>,\n    field: &Field,\n) -> FlatbufferResult<Struct<'a>> {\n    // TODO inherited from C++: This does NOT check if the field is a table or struct, but we'd need\n    // access to the schema to check the is_struct flag.\n    if field.type_().base_type() != BaseType::Obj {\n        return Err(FlatbufferError::FieldTypeMismatch(\n            String::from(\"Obj\"),\n            field.type_().base_type().variant_name().unwrap_or_default().to_string(),\n        ));\n    }\n\n    Ok(st.get::<Struct>(field.offset() as usize))\n}\n\n/// Returns the value of any struct field as a 64-bit int, regardless of what type it is. Returns error if the value cannot be parsed as integer.\n///\n/// # Safety\n///\n/// [st] must contain valid offsets that match the [field].\npub unsafe fn get_any_field_integer_in_struct(st: &Struct, field: &Field) -> FlatbufferResult<i64> {\n    let field_loc = st.loc() + field.offset() as usize;\n\n    get_any_value_integer(field.type_().base_type(), st.buf(), field_loc)\n}\n\n/// Returns the value of any struct field as a 64-bit floating point, regardless of what type it is. Returns error if the value cannot be parsed as float.\n///\n/// # Safety\n///\n/// [st] must contain valid offsets that match the [field].\npub unsafe fn get_any_field_float_in_struct(st: &Struct, field: &Field) -> FlatbufferResult<f64> {\n    let field_loc = st.loc() + field.offset() as usize;\n\n    get_any_value_float(field.type_().base_type(), st.buf(), field_loc)\n}\n\n/// Returns the value of any struct field as a string, regardless of what type it is.\n///\n/// # Safety\n///\n/// [st] must contain valid offsets that match the [field].\npub unsafe fn get_any_field_string_in_struct(\n    st: &Struct,\n    field: &Field,\n    schema: &Schema,\n) -> String {\n    let field_loc = st.loc() + field.offset() as usize;\n\n    get_any_value_string(\n        field.type_().base_type(),\n        st.buf(),\n        field_loc,\n        schema,\n        field.type_().index() as usize,\n    )\n}\n\n/// Sets any table field with the value of a 64-bit integer. Returns error if the field is not originally set or is with non-scalar value or the provided value cannot be cast into the field type.\n///\n/// # Safety\n///\n/// [buf] must contain a valid root table and valid offset to it.\npub unsafe fn set_any_field_integer(\n    buf: &mut [u8],\n    table_loc: usize,\n    field: &Field,\n    v: i64,\n) -> FlatbufferResult<()> {\n    let field_type = field.type_().base_type();\n    let table = Table::follow(buf, table_loc);\n\n    let Some(field_loc) = get_field_loc(&table, field) else {\n        return Err(FlatbufferError::SetValueNotSupported);\n    };\n\n    if !is_scalar(field_type) {\n        return Err(FlatbufferError::SetValueNotSupported);\n    }\n\n    set_any_value_integer(field_type, buf, field_loc, v)\n}\n\n/// Sets any table field with the value of a 64-bit floating point. Returns error if the field is not originally set or is with non-scalar value or the provided value cannot be cast into the field type.\n///\n/// # Safety\n///\n/// [buf] must contain a valid root table and valid offset to it.\npub unsafe fn set_any_field_float(\n    buf: &mut [u8],\n    table_loc: usize,\n    field: &Field,\n    v: f64,\n) -> FlatbufferResult<()> {\n    let field_type = field.type_().base_type();\n    let table = Table::follow(buf, table_loc);\n\n    let Some(field_loc) = get_field_loc(&table, field) else {\n        return Err(FlatbufferError::SetValueNotSupported);\n    };\n\n    if !is_scalar(field_type) {\n        return Err(FlatbufferError::SetValueNotSupported);\n    }\n\n    set_any_value_float(field_type, buf, field_loc, v)\n}\n\n/// Sets any table field with the value of a string. Returns error if the field is not originally set or is with non-scalar value or the provided value cannot be parsed as the field type.\n///\n/// # Safety\n///\n/// [buf] must contain a valid root table and valid offset to it.\npub unsafe fn set_any_field_string(\n    buf: &mut [u8],\n    table_loc: usize,\n    field: &Field,\n    v: &str,\n) -> FlatbufferResult<()> {\n    let field_type = field.type_().base_type();\n    let table = Table::follow(buf, table_loc);\n\n    let Some(field_loc) = get_field_loc(&table, field) else {\n        return Err(FlatbufferError::SetValueNotSupported);\n    };\n\n    if !is_scalar(field_type) {\n        return Err(FlatbufferError::SetValueNotSupported);\n    }\n\n    set_any_value_float(field_type, buf, field_loc, v.parse::<f64>()?)\n}\n\n/// Sets any scalar field given its exact type. Returns error if the field is not originally set or is with non-scalar value.\n///\n/// # Safety\n///\n/// [buf] must contain a valid root table and valid offset to it.\npub unsafe fn set_field<T: EndianScalar>(\n    buf: &mut [u8],\n    table_loc: usize,\n    field: &Field,\n    v: T,\n) -> FlatbufferResult<()> {\n    let field_type = field.type_().base_type();\n    let table = Table::follow(buf, table_loc);\n\n    if !is_scalar(field_type) {\n        return Err(FlatbufferError::SetValueNotSupported);\n    }\n\n    if core::mem::size_of::<T>() != get_type_size(field_type) {\n        return Err(FlatbufferError::FieldTypeMismatch(\n            std::any::type_name::<T>().to_string(),\n            field_type.variant_name().unwrap_or_default().to_string(),\n        ));\n    }\n\n    let Some(field_loc) = get_field_loc(&table, field) else {\n        return Err(FlatbufferError::SetValueNotSupported);\n    };\n\n    if buf.len() < field_loc.saturating_add(get_type_size(field_type)) {\n        return Err(FlatbufferError::VerificationError(InvalidFlatbuffer::RangeOutOfBounds {\n            range: core::ops::Range {\n                start: field_loc,\n                end: field_loc.saturating_add(get_type_size(field_type)),\n            },\n            error_trace: Default::default(),\n        }));\n    }\n\n    // SAFETY: the buffer range was verified above.\n    unsafe { Ok(emplace_scalar::<T>(&mut buf[field_loc..], v)) }\n}\n\n/// Sets a string field to a new value. Returns error if the field is not originally set or is not of string type in which cases the [buf] stays intact. Returns error if the [buf] fails to be updated.\n///\n/// # Safety\n///\n/// [buf] must contain a valid root table and valid offset to it and conform to the [schema].\npub unsafe fn set_string(\n    buf: &mut Vec<u8>,\n    table_loc: usize,\n    field: &Field,\n    v: &str,\n    schema: &Schema,\n) -> FlatbufferResult<()> {\n    if v.is_empty() {\n        return Ok(());\n    }\n\n    let field_type = field.type_().base_type();\n    if field_type != BaseType::String {\n        return Err(FlatbufferError::FieldTypeMismatch(\n            String::from(\"String\"),\n            field_type.variant_name().unwrap_or_default().to_string(),\n        ));\n    }\n\n    let table = Table::follow(buf, table_loc);\n\n    let Some(field_loc) = get_field_loc(&table, field) else {\n        return Err(FlatbufferError::SetValueNotSupported);\n    };\n\n    if buf.len() < field_loc + get_type_size(field_type) {\n        return Err(FlatbufferError::VerificationError(InvalidFlatbuffer::RangeOutOfBounds {\n            range: core::ops::Range {\n                start: field_loc,\n                end: field_loc.saturating_add(get_type_size(field_type)),\n            },\n            error_trace: Default::default(),\n        }));\n    }\n\n    // SAFETY: the buffer range was verified above.\n    let string_loc = unsafe { deref_uoffset(buf, field_loc)? };\n    if buf.len() < string_loc.saturating_add(SIZE_UOFFSET) {\n        return Err(FlatbufferError::VerificationError(InvalidFlatbuffer::RangeOutOfBounds {\n            range: core::ops::Range {\n                start: string_loc,\n                end: string_loc.saturating_add(SIZE_UOFFSET),\n            },\n            error_trace: Default::default(),\n        }));\n    }\n\n    // SAFETY: the buffer range was verified above.\n    let len_old = unsafe { read_uoffset(buf, string_loc) };\n    if buf.len() < string_loc.saturating_add(SIZE_UOFFSET).saturating_add(len_old.try_into()?) {\n        return Err(FlatbufferError::VerificationError(InvalidFlatbuffer::RangeOutOfBounds {\n            range: core::ops::Range {\n                start: string_loc,\n                end: string_loc.saturating_add(SIZE_UOFFSET).saturating_add(len_old.try_into()?),\n            },\n            error_trace: Default::default(),\n        }));\n    }\n\n    let len_new = v.len();\n    let delta = len_new as isize - len_old as isize;\n    let mut bytes_to_insert = v.as_bytes().to_vec();\n\n    if delta != 0 {\n        // Rounds the delta up to the nearest multiple of the maximum int size to keep the types after the insersion point aligned.\n        // stdint crate defines intmax_t as an alias for c_long; use it directly to avoid extra\n        // dependency.\n        let mask = (size_of::<core::ffi::c_long>() - 1) as isize;\n        let offset = (delta + mask) & !mask;\n        let mut visited_vec = vec![false; buf.len()];\n\n        if offset != 0 {\n            update_offset(\n                buf,\n                table_loc,\n                &mut visited_vec,\n                &schema.root_table().unwrap(),\n                schema,\n                string_loc,\n                offset,\n            )?;\n\n            // Sets the new length.\n            emplace_scalar::<SOffsetT>(\n                &mut buf[string_loc..string_loc + SIZE_UOFFSET],\n                len_new.try_into()?,\n            );\n        }\n\n        // Pads the bytes vector with 0 if `offset` doesn't equal `delta`.\n        bytes_to_insert.resize(bytes_to_insert.len() + (offset - delta) as usize, 0);\n    }\n\n    // Replaces the data.\n    buf.splice(\n        string_loc + SIZE_SOFFSET..string_loc + SIZE_UOFFSET + usize::try_from(len_old)?,\n        bytes_to_insert,\n    );\n    Ok(())\n}\n\n/// Returns the size of a scalar type in the `BaseType` enum. In the case of structs, returns the size of their offset (`UOffsetT`) in the buffer.\nfn get_type_size(base_type: BaseType) -> usize {\n    match base_type {\n        BaseType::UType | BaseType::Bool | BaseType::Byte | BaseType::UByte => 1,\n        BaseType::Short | BaseType::UShort => 2,\n        BaseType::Int\n        | BaseType::UInt\n        | BaseType::Float\n        | BaseType::String\n        | BaseType::Vector\n        | BaseType::Obj\n        | BaseType::Union => 4,\n        BaseType::Long | BaseType::ULong | BaseType::Double | BaseType::Vector64 => 8,\n        _ => 0,\n    }\n}\n\n/// Returns the absolute field location in the buffer and [None] if the field is not populated.\n///\n/// # Safety\n///\n/// [table] must contain a valid vtable.\nunsafe fn get_field_loc(table: &Table, field: &Field) -> Option<usize> {\n    let field_offset = table.vtable().get(field.offset()) as usize;\n    if field_offset == 0 {\n        return None;\n    }\n\n    Some(table.loc() + field_offset)\n}\n\n/// Reads value as a 64-bit int from the provided byte slice at the specified location. Returns error if the value cannot be parsed as integer.\n///\n/// # Safety\n///\n/// Caller must ensure `buf.len() >= loc + size_of::<T>()` at all the access layers.\nunsafe fn get_any_value_integer(\n    base_type: BaseType,\n    buf: &[u8],\n    loc: usize,\n) -> FlatbufferResult<i64> {\n    match base_type {\n        BaseType::UType | BaseType::UByte => i64::from_u8(u8::follow(buf, loc)),\n        BaseType::Bool => bool::follow(buf, loc).try_into().ok(),\n        BaseType::Byte => i64::from_i8(i8::follow(buf, loc)),\n        BaseType::Short => i64::from_i16(i16::follow(buf, loc)),\n        BaseType::UShort => i64::from_u16(u16::follow(buf, loc)),\n        BaseType::Int => i64::from_i32(i32::follow(buf, loc)),\n        BaseType::UInt => i64::from_u32(u32::follow(buf, loc)),\n        BaseType::Long => Some(i64::follow(buf, loc)),\n        BaseType::ULong => i64::from_u64(u64::follow(buf, loc)),\n        BaseType::Float => i64::from_f32(f32::follow(buf, loc)),\n        BaseType::Double => i64::from_f64(f64::follow(buf, loc)),\n        BaseType::String => ForwardsUOffset::<&str>::follow(buf, loc).parse::<i64>().ok(),\n        _ => None, // Tables & vectors do not make sense.\n    }\n    .ok_or(FlatbufferError::FieldTypeMismatch(\n        String::from(\"i64\"),\n        base_type.variant_name().unwrap_or_default().to_string(),\n    ))\n}\n\n/// Reads value as a 64-bit floating point from the provided byte slice at the specified location. Returns error if the value cannot be parsed as float.\n///\n/// # Safety\n///\n/// Caller must ensure `buf.len() >= loc + size_of::<T>()` at all the access layers.\nunsafe fn get_any_value_float(\n    base_type: BaseType,\n    buf: &[u8],\n    loc: usize,\n) -> FlatbufferResult<f64> {\n    match base_type {\n        BaseType::UType | BaseType::UByte => f64::from_u8(u8::follow(buf, loc)),\n        BaseType::Bool => bool::follow(buf, loc).try_into().ok(),\n        BaseType::Byte => f64::from_i8(i8::follow(buf, loc)),\n        BaseType::Short => f64::from_i16(i16::follow(buf, loc)),\n        BaseType::UShort => f64::from_u16(u16::follow(buf, loc)),\n        BaseType::Int => f64::from_i32(i32::follow(buf, loc)),\n        BaseType::UInt => f64::from_u32(u32::follow(buf, loc)),\n        BaseType::Long => f64::from_i64(i64::follow(buf, loc)),\n        BaseType::ULong => f64::from_u64(u64::follow(buf, loc)),\n        BaseType::Float => f64::from_f32(f32::follow(buf, loc)),\n        BaseType::Double => Some(f64::follow(buf, loc)),\n        BaseType::String => ForwardsUOffset::<&str>::follow(buf, loc).parse::<f64>().ok(),\n        _ => None,\n    }\n    .ok_or(FlatbufferError::FieldTypeMismatch(\n        String::from(\"f64\"),\n        base_type.variant_name().unwrap_or_default().to_string(),\n    ))\n}\n\n/// Reads value as a string from the provided byte slice at the specified location.\n///\n/// # Safety\n///\n/// Caller must ensure `buf.len() >= loc + size_of::<T>()` at all the access layers.\nunsafe fn get_any_value_string(\n    base_type: BaseType,\n    buf: &[u8],\n    loc: usize,\n    schema: &Schema,\n    type_index: usize,\n) -> String {\n    match base_type {\n        BaseType::Float | BaseType::Double => {\n            get_any_value_float(base_type, buf, loc).unwrap_or_default().to_string()\n        }\n        BaseType::String => {\n            String::from_utf8_lossy(ForwardsUOffset::<&[u8]>::follow(buf, loc)).to_string()\n        }\n        BaseType::Obj => {\n            // Converts the table to a string. This is mostly for debugging purposes,\n            // and does NOT promise to be JSON compliant.\n            // Also prefixes the type.\n            let object: Object = schema.objects().get(type_index);\n            let mut s = object.name().to_string();\n            s += \" { \";\n            if object.is_struct() {\n                let st: Struct<'_> = Struct::follow(buf, loc);\n                for field in object.fields() {\n                    let field_value = get_any_field_string_in_struct(&st, &field, schema);\n                    s += field.name();\n                    s += \": \";\n                    s += field_value.as_str();\n                    s += \", \";\n                }\n            } else {\n                let table = ForwardsUOffset::<Table>::follow(buf, loc);\n                for field in object.fields() {\n                    if table.vtable().get(field.offset()) == 0 {\n                        continue;\n                    }\n                    let mut field_value = get_any_field_string(&table, &field, schema);\n                    if field.type_().base_type() == BaseType::String {\n                        // Escape the string\n                        field_value = format!(\"{:?}\", field_value.as_str());\n                    }\n                    s += field.name();\n                    s += \": \";\n                    s += field_value.as_str();\n                    s += \", \";\n                }\n            }\n            s + \"}\"\n        }\n        BaseType::Vector => String::from(\"[(elements)]\"), // TODO inherited from C++: implement this as well.\n        BaseType::Union => String::from(\"(union)\"), // TODO inherited from C++: implement this as well.\n        _ => get_any_value_integer(base_type, buf, loc).unwrap_or_default().to_string(),\n    }\n}\n\n/// Sets any scalar value with a 64-bit integer. Returns error if the value is not successfully replaced.\nfn set_any_value_integer(\n    base_type: BaseType,\n    buf: &mut [u8],\n    field_loc: usize,\n    v: i64,\n) -> FlatbufferResult<()> {\n    if buf.len() < get_type_size(base_type) {\n        return Err(FlatbufferError::VerificationError(InvalidFlatbuffer::RangeOutOfBounds {\n            range: core::ops::Range {\n                start: field_loc,\n                end: field_loc.saturating_add(get_type_size(base_type)),\n            },\n            error_trace: Default::default(),\n        }));\n    }\n    let buf = &mut buf[field_loc..];\n    let type_name = base_type.variant_name().unwrap_or_default().to_string();\n\n    macro_rules! try_emplace {\n        ($ty:ty, $value:expr) => {\n            if let Ok(v) = TryInto::<$ty>::try_into($value) {\n                // SAFETY: buffer size is verified at the beginning of this function.\n                unsafe { Ok(emplace_scalar::<$ty>(buf, v)) }\n            } else {\n                Err(FlatbufferError::FieldTypeMismatch(String::from(\"i64\"), type_name))\n            }\n        };\n    }\n\n    match base_type {\n        BaseType::UType | BaseType::UByte => {\n            try_emplace!(u8, v)\n        }\n        BaseType::Bool => {\n            // SAFETY: buffer size is verified at the beginning of this function.\n            unsafe { Ok(emplace_scalar::<bool>(buf, v != 0)) }\n        }\n        BaseType::Byte => {\n            try_emplace!(i8, v)\n        }\n        BaseType::Short => {\n            try_emplace!(i16, v)\n        }\n        BaseType::UShort => {\n            try_emplace!(u16, v)\n        }\n        BaseType::Int => {\n            try_emplace!(i32, v)\n        }\n        BaseType::UInt => {\n            try_emplace!(u32, v)\n        }\n        BaseType::Long => {\n            // SAFETY: buffer size is verified at the beginning of this function.\n            unsafe { Ok(emplace_scalar::<i64>(buf, v)) }\n        }\n        BaseType::ULong => {\n            try_emplace!(u64, v)\n        }\n        BaseType::Float => {\n            if let Some(value) = f32::from_i64(v) {\n                // SAFETY: buffer size is verified at the beginning of this function.\n                unsafe { Ok(emplace_scalar::<f32>(buf, value)) }\n            } else {\n                Err(FlatbufferError::FieldTypeMismatch(String::from(\"i64\"), type_name))\n            }\n        }\n        BaseType::Double => {\n            if let Some(value) = f64::from_i64(v) {\n                // SAFETY: buffer size is verified at the beginning of this function.\n                unsafe { Ok(emplace_scalar::<f64>(buf, value)) }\n            } else {\n                Err(FlatbufferError::FieldTypeMismatch(String::from(\"i64\"), type_name))\n            }\n        }\n        _ => Err(FlatbufferError::SetValueNotSupported),\n    }\n}\n\n/// Sets any scalar value with a 64-bit floating point. Returns error if the value is not successfully replaced.\nfn set_any_value_float(\n    base_type: BaseType,\n    buf: &mut [u8],\n    field_loc: usize,\n    v: f64,\n) -> FlatbufferResult<()> {\n    if buf.len() < get_type_size(base_type) {\n        return Err(FlatbufferError::VerificationError(InvalidFlatbuffer::RangeOutOfBounds {\n            range: core::ops::Range {\n                start: field_loc,\n                end: field_loc.saturating_add(get_type_size(base_type)),\n            },\n            error_trace: Default::default(),\n        }));\n    }\n    let buf = &mut buf[field_loc..];\n    let type_name = base_type.variant_name().unwrap_or_default().to_string();\n\n    match base_type {\n        BaseType::UType | BaseType::UByte => {\n            if let Some(value) = u8::from_f64(v) {\n                // SAFETY: buffer size is verified at the beginning of this function.\n                unsafe {\n                    return Ok(emplace_scalar::<u8>(buf, value));\n                }\n            }\n        }\n        BaseType::Bool => {\n            // SAFETY: buffer size is verified at the beginning of this function.\n            unsafe {\n                return Ok(emplace_scalar::<bool>(buf, v != 0f64));\n            }\n        }\n        BaseType::Byte => {\n            if let Some(value) = i8::from_f64(v) {\n                // SAFETY: buffer size is verified at the beginning of this function.\n                unsafe {\n                    return Ok(emplace_scalar::<i8>(buf, value));\n                }\n            }\n        }\n        BaseType::Short => {\n            if let Some(value) = i16::from_f64(v) {\n                // SAFETY: buffer size is verified at the beginning of this function.\n                unsafe {\n                    return Ok(emplace_scalar::<i16>(buf, value));\n                }\n            }\n        }\n        BaseType::UShort => {\n            if let Some(value) = u16::from_f64(v) {\n                // SAFETY: buffer size is verified at the beginning of this function.\n                unsafe {\n                    return Ok(emplace_scalar::<u16>(buf, value));\n                }\n            }\n        }\n        BaseType::Int => {\n            if let Some(value) = i32::from_f64(v) {\n                // SAFETY: buffer size is verified at the beginning of this function.\n                unsafe {\n                    return Ok(emplace_scalar::<i32>(buf, value));\n                }\n            }\n        }\n        BaseType::UInt => {\n            if let Some(value) = u32::from_f64(v) {\n                // SAFETY: buffer size is verified at the beginning of this function.\n                unsafe {\n                    return Ok(emplace_scalar::<u32>(buf, value));\n                }\n            }\n        }\n        BaseType::Long => {\n            if let Some(value) = i64::from_f64(v) {\n                // SAFETY: buffer size is verified at the beginning of this function.\n                unsafe {\n                    return Ok(emplace_scalar::<i64>(buf, value));\n                }\n            }\n        }\n        BaseType::ULong => {\n            if let Some(value) = u64::from_f64(v) {\n                // SAFETY: buffer size is verified at the beginning of this function.\n                unsafe {\n                    return Ok(emplace_scalar::<u64>(buf, value));\n                }\n            }\n        }\n        BaseType::Float => {\n            if let Some(value) = f32::from_f64(v) {\n                // Value converted to inf if overflow occurs\n                if value != f32::INFINITY {\n                    // SAFETY: buffer size is verified at the beginning of this function.\n                    unsafe {\n                        return Ok(emplace_scalar::<f32>(buf, value));\n                    }\n                }\n            }\n        }\n        BaseType::Double => {\n            // SAFETY: buffer size is verified at the beginning of this function.\n            unsafe {\n                return Ok(emplace_scalar::<f64>(buf, v));\n            }\n        }\n        _ => return Err(FlatbufferError::SetValueNotSupported),\n    }\n    return Err(FlatbufferError::FieldTypeMismatch(String::from(\"f64\"), type_name));\n}\n\nfn is_scalar(base_type: BaseType) -> bool {\n    return base_type <= BaseType::Double;\n}\n\n/// Iterates through the buffer and updates all the relative offsets affected by the insertion.\n///\n/// # Safety\n///\n/// Caller must ensure [buf] contains valid data that conforms to [schema].\nunsafe fn update_offset(\n    buf: &mut [u8],\n    table_loc: usize,\n    updated: &mut [bool],\n    object: &Object,\n    schema: &Schema,\n    insertion_loc: usize,\n    offset: isize,\n) -> FlatbufferResult<()> {\n    if updated.len() != buf.len() {\n        return Err(FlatbufferError::SetStringPolluted);\n    }\n\n    if updated[table_loc] {\n        return Ok(());\n    }\n\n    let slice = &mut buf[table_loc..table_loc + SIZE_SOFFSET];\n    let vtable_offset = isize::try_from(read_scalar::<SOffsetT>(slice))?;\n    let vtable_loc = (isize::try_from(table_loc)? - vtable_offset).try_into()?;\n\n    if insertion_loc <= table_loc {\n        // Checks if insertion point is between the table and a vtable that\n        // precedes it.\n        if (vtable_loc..table_loc).contains(&insertion_loc) {\n            emplace_scalar::<SOffsetT>(slice, (vtable_offset + offset).try_into()?);\n            updated[table_loc] = true;\n        }\n\n        // Early out: since all fields inside the table must point forwards in\n        // memory, if the insertion point is before the table we can stop here.\n        return Ok(());\n    }\n\n    for field in object.fields() {\n        let field_type = field.type_().base_type();\n        if is_scalar(field_type) {\n            continue;\n        }\n\n        let field_offset = VOffsetT::follow(buf, vtable_loc.saturating_add(field.offset().into()));\n        if field_offset == 0 {\n            continue;\n        }\n\n        let field_loc = table_loc + usize::from(field_offset);\n        if updated[field_loc] {\n            continue;\n        }\n\n        if field_type == BaseType::Obj\n            && schema.objects().get(field.type_().index().try_into()?).is_struct()\n        {\n            continue;\n        }\n\n        // Updates the relative offset from table to actual data if needed\n        let slice = &mut buf[field_loc..field_loc + SIZE_UOFFSET];\n        let field_value_offset = read_scalar::<UOffsetT>(slice);\n        let field_value_loc = field_loc.saturating_add(field_value_offset.try_into()?);\n        if (field_loc..field_value_loc).contains(&insertion_loc) {\n            emplace_scalar::<UOffsetT>(\n                slice,\n                (isize::try_from(field_value_offset)? + offset).try_into()?,\n            );\n            updated[field_loc] = true;\n        }\n\n        match field_type {\n            BaseType::Obj => {\n                let field_obj = schema.objects().get(field.type_().index().try_into()?);\n                update_offset(\n                    buf,\n                    field_value_loc,\n                    updated,\n                    &field_obj,\n                    schema,\n                    insertion_loc,\n                    offset,\n                )?;\n            }\n            BaseType::Vector => {\n                let elem_type = field.type_().element();\n                if elem_type != BaseType::Obj || elem_type != BaseType::String {\n                    continue;\n                }\n                if elem_type == BaseType::Obj\n                    && schema.objects().get(field.type_().index().try_into()?).is_struct()\n                {\n                    continue;\n                }\n                let vec_size = usize::try_from(read_uoffset(buf, field_value_loc))?;\n                for index in 0..vec_size {\n                    let elem_loc = field_value_loc + SIZE_UOFFSET + index * SIZE_UOFFSET;\n                    if updated[elem_loc] {\n                        continue;\n                    }\n                    let slice = &mut buf[elem_loc..elem_loc + SIZE_UOFFSET];\n                    let elem_value_offset = read_scalar::<UOffsetT>(slice);\n                    let elem_value_loc = elem_loc.saturating_add(elem_value_offset.try_into()?);\n                    if (elem_loc..elem_value_loc).contains(&insertion_loc) {\n                        emplace_scalar::<UOffsetT>(\n                            slice,\n                            (isize::try_from(elem_value_offset)? + offset).try_into()?,\n                        );\n                        updated[elem_loc] = true;\n                    }\n\n                    if elem_type == BaseType::Obj {\n                        let elem_obj = schema.objects().get(field.type_().index().try_into()?);\n                        update_offset(\n                            buf,\n                            elem_value_loc,\n                            updated,\n                            &elem_obj,\n                            schema,\n                            insertion_loc,\n                            offset,\n                        )?;\n                    }\n                }\n            }\n            BaseType::Union => {\n                let union_enum = schema.enums().get(field.type_().index().try_into()?);\n                let union_type = object\n                    .fields()\n                    .lookup_by_key(field.name().to_string() + \"_type\", |field, key| {\n                        field.key_compare_with_value(key)\n                    })\n                    .unwrap();\n                let union_type_loc = vtable_loc.saturating_add(union_type.offset().into());\n                let union_type_offset = VOffsetT::follow(buf, union_type_loc);\n                let union_type_value =\n                    u8::follow(buf, table_loc.saturating_add(union_type_offset.into()));\n                let union_enum_value = union_enum\n                    .values()\n                    .lookup_by_key(union_type_value.into(), |value, key| {\n                        value.key_compare_with_value(*key)\n                    })\n                    .unwrap();\n                let union_object = schema\n                    .objects()\n                    .get(union_enum_value.union_type().unwrap().index().try_into()?);\n                update_offset(\n                    buf,\n                    field_value_loc,\n                    updated,\n                    &union_object,\n                    schema,\n                    insertion_loc,\n                    offset,\n                )?;\n            }\n            _ => (),\n        }\n    }\n\n    // Checks if the vtable offset points beyond the insertion point.\n    if (table_loc..vtable_loc).contains(&insertion_loc) {\n        let slice = &mut buf[table_loc..table_loc + SIZE_SOFFSET];\n        emplace_scalar::<SOffsetT>(slice, (vtable_offset - offset).try_into()?);\n        updated[table_loc] = true;\n    }\n    Ok(())\n}\n\n/// Returns the absolute location of the data (e.g. string) in the buffer when the field contains relative offset (`UOffsetT`) to the data.\n///\n/// # Safety\n///\n/// The value of the corresponding slot must have type `UOffsetT`.\nunsafe fn deref_uoffset(buf: &[u8], field_loc: usize) -> FlatbufferResult<usize> {\n    Ok(field_loc.saturating_add(read_uoffset(buf, field_loc).try_into()?))\n}\n\n/// Reads the value of `UOffsetT` at the give location.\n///\n/// # Safety\n///\n/// The value of the corresponding slot must have type `UOffsetT`.\nunsafe fn read_uoffset(buf: &[u8], loc: usize) -> UOffsetT {\n    let slice = &buf[loc..loc + SIZE_UOFFSET];\n    read_scalar::<UOffsetT>(slice)\n}\n"
  },
  {
    "path": "rust/reflection/src/reflection_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n// @generated\n\nuse core::cmp::Ordering;\nuse core::mem;\n\nextern crate flatbuffers;\nuse self::flatbuffers::{EndianScalar, Follow};\n\n#[allow(unused_imports, dead_code)]\npub mod reflection {\n\n    use core::cmp::Ordering;\n    use core::mem;\n\n    extern crate flatbuffers;\n    use self::flatbuffers::{EndianScalar, Follow};\n\n    #[deprecated(\n        since = \"2.0.0\",\n        note = \"Use associated constants instead. This will no longer be generated in 2021.\"\n    )]\n    pub const ENUM_MIN_BASE_TYPE: i8 = 0;\n    #[deprecated(\n        since = \"2.0.0\",\n        note = \"Use associated constants instead. This will no longer be generated in 2021.\"\n    )]\n    pub const ENUM_MAX_BASE_TYPE: i8 = 19;\n    #[deprecated(\n        since = \"2.0.0\",\n        note = \"Use associated constants instead. This will no longer be generated in 2021.\"\n    )]\n    #[allow(non_camel_case_types)]\n    pub const ENUM_VALUES_BASE_TYPE: [BaseType; 20] = [\n        BaseType::None,\n        BaseType::UType,\n        BaseType::Bool,\n        BaseType::Byte,\n        BaseType::UByte,\n        BaseType::Short,\n        BaseType::UShort,\n        BaseType::Int,\n        BaseType::UInt,\n        BaseType::Long,\n        BaseType::ULong,\n        BaseType::Float,\n        BaseType::Double,\n        BaseType::String,\n        BaseType::Vector,\n        BaseType::Obj,\n        BaseType::Union,\n        BaseType::Array,\n        BaseType::Vector64,\n        BaseType::MaxBaseType,\n    ];\n\n    #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n    #[repr(transparent)]\n    pub struct BaseType(pub i8);\n    #[allow(non_upper_case_globals)]\n    impl BaseType {\n        pub const None: Self = Self(0);\n        pub const UType: Self = Self(1);\n        pub const Bool: Self = Self(2);\n        pub const Byte: Self = Self(3);\n        pub const UByte: Self = Self(4);\n        pub const Short: Self = Self(5);\n        pub const UShort: Self = Self(6);\n        pub const Int: Self = Self(7);\n        pub const UInt: Self = Self(8);\n        pub const Long: Self = Self(9);\n        pub const ULong: Self = Self(10);\n        pub const Float: Self = Self(11);\n        pub const Double: Self = Self(12);\n        pub const String: Self = Self(13);\n        pub const Vector: Self = Self(14);\n        pub const Obj: Self = Self(15);\n        pub const Union: Self = Self(16);\n        pub const Array: Self = Self(17);\n        pub const Vector64: Self = Self(18);\n        pub const MaxBaseType: Self = Self(19);\n\n        pub const ENUM_MIN: i8 = 0;\n        pub const ENUM_MAX: i8 = 19;\n        pub const ENUM_VALUES: &'static [Self] = &[\n            Self::None,\n            Self::UType,\n            Self::Bool,\n            Self::Byte,\n            Self::UByte,\n            Self::Short,\n            Self::UShort,\n            Self::Int,\n            Self::UInt,\n            Self::Long,\n            Self::ULong,\n            Self::Float,\n            Self::Double,\n            Self::String,\n            Self::Vector,\n            Self::Obj,\n            Self::Union,\n            Self::Array,\n            Self::Vector64,\n            Self::MaxBaseType,\n        ];\n        /// Returns the variant's name or \"\" if unknown.\n        pub fn variant_name(self) -> Option<&'static str> {\n            match self {\n                Self::None => Some(\"None\"),\n                Self::UType => Some(\"UType\"),\n                Self::Bool => Some(\"Bool\"),\n                Self::Byte => Some(\"Byte\"),\n                Self::UByte => Some(\"UByte\"),\n                Self::Short => Some(\"Short\"),\n                Self::UShort => Some(\"UShort\"),\n                Self::Int => Some(\"Int\"),\n                Self::UInt => Some(\"UInt\"),\n                Self::Long => Some(\"Long\"),\n                Self::ULong => Some(\"ULong\"),\n                Self::Float => Some(\"Float\"),\n                Self::Double => Some(\"Double\"),\n                Self::String => Some(\"String\"),\n                Self::Vector => Some(\"Vector\"),\n                Self::Obj => Some(\"Obj\"),\n                Self::Union => Some(\"Union\"),\n                Self::Array => Some(\"Array\"),\n                Self::Vector64 => Some(\"Vector64\"),\n                Self::MaxBaseType => Some(\"MaxBaseType\"),\n                _ => None,\n            }\n        }\n    }\n    impl core::fmt::Debug for BaseType {\n        fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {\n            if let Some(name) = self.variant_name() {\n                f.write_str(name)\n            } else {\n                f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n            }\n        }\n    }\n    impl<'a> flatbuffers::Follow<'a> for BaseType {\n        type Inner = Self;\n        #[inline]\n        unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n            let b = flatbuffers::read_scalar_at::<i8>(buf, loc);\n            Self(b)\n        }\n    }\n\n    impl flatbuffers::Push for BaseType {\n        type Output = BaseType;\n        #[inline]\n        unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n            flatbuffers::emplace_scalar::<i8>(dst, self.0);\n        }\n    }\n\n    impl flatbuffers::EndianScalar for BaseType {\n        type Scalar = i8;\n        #[inline]\n        fn to_little_endian(self) -> i8 {\n            self.0.to_le()\n        }\n        #[inline]\n        #[allow(clippy::wrong_self_convention)]\n        fn from_little_endian(v: i8) -> Self {\n            let b = i8::from_le(v);\n            Self(b)\n        }\n    }\n\n    impl<'a> flatbuffers::Verifiable for BaseType {\n        #[inline]\n        fn run_verifier(\n            v: &mut flatbuffers::Verifier,\n            pos: usize,\n        ) -> Result<(), flatbuffers::InvalidFlatbuffer> {\n            use self::flatbuffers::Verifiable;\n            i8::run_verifier(v, pos)\n        }\n    }\n\n    impl flatbuffers::SimpleToVerifyInSlice for BaseType {}\n    #[allow(non_upper_case_globals)]\n    mod bitflags_advanced_features {\n        flatbuffers::bitflags::bitflags! {\n          /// New schema language features that are not supported by old code generators.\n          #[derive(Default, Debug, Clone, Copy, PartialEq)]\n          pub struct AdvancedFeatures: u64 {\n            const AdvancedArrayFeatures = 1;\n            const AdvancedUnionFeatures = 2;\n            const OptionalScalars = 4;\n            const DefaultVectorsAndStrings = 8;\n          }\n        }\n    }\n    pub use self::bitflags_advanced_features::AdvancedFeatures;\n\n    impl<'a> flatbuffers::Follow<'a> for AdvancedFeatures {\n        type Inner = Self;\n        #[inline]\n        unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n            let b = flatbuffers::read_scalar_at::<u64>(buf, loc);\n            Self::from_bits_retain(b)\n        }\n    }\n\n    impl flatbuffers::Push for AdvancedFeatures {\n        type Output = AdvancedFeatures;\n        #[inline]\n        unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n            flatbuffers::emplace_scalar::<u64>(dst, self.bits());\n        }\n    }\n\n    impl flatbuffers::EndianScalar for AdvancedFeatures {\n        type Scalar = u64;\n        #[inline]\n        fn to_little_endian(self) -> u64 {\n            self.bits().to_le()\n        }\n        #[inline]\n        #[allow(clippy::wrong_self_convention)]\n        fn from_little_endian(v: u64) -> Self {\n            let b = u64::from_le(v);\n            Self::from_bits_retain(b)\n        }\n    }\n\n    impl<'a> flatbuffers::Verifiable for AdvancedFeatures {\n        #[inline]\n        fn run_verifier(\n            v: &mut flatbuffers::Verifier,\n            pos: usize,\n        ) -> Result<(), flatbuffers::InvalidFlatbuffer> {\n            use self::flatbuffers::Verifiable;\n            u64::run_verifier(v, pos)\n        }\n    }\n\n    impl flatbuffers::SimpleToVerifyInSlice for AdvancedFeatures {}\n    pub enum TypeOffset {}\n    #[derive(Copy, Clone, PartialEq)]\n\n    pub struct Type<'a> {\n        pub _tab: flatbuffers::Table<'a>,\n    }\n\n    impl<'a> flatbuffers::Follow<'a> for Type<'a> {\n        type Inner = Type<'a>;\n        #[inline]\n        unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n            Self { _tab: flatbuffers::Table::new(buf, loc) }\n        }\n    }\n\n    impl<'a> Type<'a> {\n        pub const VT_BASE_TYPE: flatbuffers::VOffsetT = 4;\n        pub const VT_ELEMENT: flatbuffers::VOffsetT = 6;\n        pub const VT_INDEX: flatbuffers::VOffsetT = 8;\n        pub const VT_FIXED_LENGTH: flatbuffers::VOffsetT = 10;\n        pub const VT_BASE_SIZE: flatbuffers::VOffsetT = 12;\n        pub const VT_ELEMENT_SIZE: flatbuffers::VOffsetT = 14;\n\n        #[inline]\n        pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self {\n            Type { _tab: table }\n        }\n        #[allow(unused_mut)]\n        pub fn create<\n            'bldr: 'args,\n            'args: 'mut_bldr,\n            'mut_bldr,\n            A: flatbuffers::Allocator + 'bldr,\n        >(\n            _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>,\n            args: &'args TypeArgs,\n        ) -> flatbuffers::WIPOffset<Type<'bldr>> {\n            let mut builder = TypeBuilder::new(_fbb);\n            builder.add_element_size(args.element_size);\n            builder.add_base_size(args.base_size);\n            builder.add_index(args.index);\n            builder.add_fixed_length(args.fixed_length);\n            builder.add_element(args.element);\n            builder.add_base_type(args.base_type);\n            builder.finish()\n        }\n\n        #[inline]\n        pub fn base_type(&self) -> BaseType {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe { self._tab.get::<BaseType>(Type::VT_BASE_TYPE, Some(BaseType::None)).unwrap() }\n        }\n        #[inline]\n        pub fn element(&self) -> BaseType {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe { self._tab.get::<BaseType>(Type::VT_ELEMENT, Some(BaseType::None)).unwrap() }\n        }\n        #[inline]\n        pub fn index(&self) -> i32 {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe { self._tab.get::<i32>(Type::VT_INDEX, Some(-1)).unwrap() }\n        }\n        #[inline]\n        pub fn fixed_length(&self) -> u16 {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe { self._tab.get::<u16>(Type::VT_FIXED_LENGTH, Some(0)).unwrap() }\n        }\n        /// The size (octets) of the `base_type` field.\n        #[inline]\n        pub fn base_size(&self) -> u32 {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe { self._tab.get::<u32>(Type::VT_BASE_SIZE, Some(4)).unwrap() }\n        }\n        /// The size (octets) of the `element` field, if present.\n        #[inline]\n        pub fn element_size(&self) -> u32 {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe { self._tab.get::<u32>(Type::VT_ELEMENT_SIZE, Some(0)).unwrap() }\n        }\n    }\n\n    impl flatbuffers::Verifiable for Type<'_> {\n        #[inline]\n        fn run_verifier(\n            v: &mut flatbuffers::Verifier,\n            pos: usize,\n        ) -> Result<(), flatbuffers::InvalidFlatbuffer> {\n            use self::flatbuffers::Verifiable;\n            v.visit_table(pos)?\n                .visit_field::<BaseType>(\"base_type\", Self::VT_BASE_TYPE, false)?\n                .visit_field::<BaseType>(\"element\", Self::VT_ELEMENT, false)?\n                .visit_field::<i32>(\"index\", Self::VT_INDEX, false)?\n                .visit_field::<u16>(\"fixed_length\", Self::VT_FIXED_LENGTH, false)?\n                .visit_field::<u32>(\"base_size\", Self::VT_BASE_SIZE, false)?\n                .visit_field::<u32>(\"element_size\", Self::VT_ELEMENT_SIZE, false)?\n                .finish();\n            Ok(())\n        }\n    }\n    pub struct TypeArgs {\n        pub base_type: BaseType,\n        pub element: BaseType,\n        pub index: i32,\n        pub fixed_length: u16,\n        pub base_size: u32,\n        pub element_size: u32,\n    }\n    impl<'a> Default for TypeArgs {\n        #[inline]\n        fn default() -> Self {\n            TypeArgs {\n                base_type: BaseType::None,\n                element: BaseType::None,\n                index: -1,\n                fixed_length: 0,\n                base_size: 4,\n                element_size: 0,\n            }\n        }\n    }\n\n    pub struct TypeBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> {\n        fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,\n        start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>,\n    }\n    impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> TypeBuilder<'a, 'b, A> {\n        #[inline]\n        pub fn add_base_type(&mut self, base_type: BaseType) {\n            self.fbb_.push_slot::<BaseType>(Type::VT_BASE_TYPE, base_type, BaseType::None);\n        }\n        #[inline]\n        pub fn add_element(&mut self, element: BaseType) {\n            self.fbb_.push_slot::<BaseType>(Type::VT_ELEMENT, element, BaseType::None);\n        }\n        #[inline]\n        pub fn add_index(&mut self, index: i32) {\n            self.fbb_.push_slot::<i32>(Type::VT_INDEX, index, -1);\n        }\n        #[inline]\n        pub fn add_fixed_length(&mut self, fixed_length: u16) {\n            self.fbb_.push_slot::<u16>(Type::VT_FIXED_LENGTH, fixed_length, 0);\n        }\n        #[inline]\n        pub fn add_base_size(&mut self, base_size: u32) {\n            self.fbb_.push_slot::<u32>(Type::VT_BASE_SIZE, base_size, 4);\n        }\n        #[inline]\n        pub fn add_element_size(&mut self, element_size: u32) {\n            self.fbb_.push_slot::<u32>(Type::VT_ELEMENT_SIZE, element_size, 0);\n        }\n        #[inline]\n        pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> TypeBuilder<'a, 'b, A> {\n            let start = _fbb.start_table();\n            TypeBuilder { fbb_: _fbb, start_: start }\n        }\n        #[inline]\n        pub fn finish(self) -> flatbuffers::WIPOffset<Type<'a>> {\n            let o = self.fbb_.end_table(self.start_);\n            flatbuffers::WIPOffset::new(o.value())\n        }\n    }\n\n    impl core::fmt::Debug for Type<'_> {\n        fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {\n            let mut ds = f.debug_struct(\"Type\");\n            ds.field(\"base_type\", &self.base_type());\n            ds.field(\"element\", &self.element());\n            ds.field(\"index\", &self.index());\n            ds.field(\"fixed_length\", &self.fixed_length());\n            ds.field(\"base_size\", &self.base_size());\n            ds.field(\"element_size\", &self.element_size());\n            ds.finish()\n        }\n    }\n    pub enum KeyValueOffset {}\n    #[derive(Copy, Clone, PartialEq)]\n\n    pub struct KeyValue<'a> {\n        pub _tab: flatbuffers::Table<'a>,\n    }\n\n    impl<'a> flatbuffers::Follow<'a> for KeyValue<'a> {\n        type Inner = KeyValue<'a>;\n        #[inline]\n        unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n            Self { _tab: flatbuffers::Table::new(buf, loc) }\n        }\n    }\n\n    impl<'a> KeyValue<'a> {\n        pub const VT_KEY: flatbuffers::VOffsetT = 4;\n        pub const VT_VALUE: flatbuffers::VOffsetT = 6;\n\n        #[inline]\n        pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self {\n            KeyValue { _tab: table }\n        }\n        #[allow(unused_mut)]\n        pub fn create<\n            'bldr: 'args,\n            'args: 'mut_bldr,\n            'mut_bldr,\n            A: flatbuffers::Allocator + 'bldr,\n        >(\n            _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>,\n            args: &'args KeyValueArgs<'args>,\n        ) -> flatbuffers::WIPOffset<KeyValue<'bldr>> {\n            let mut builder = KeyValueBuilder::new(_fbb);\n            if let Some(x) = args.value {\n                builder.add_value(x);\n            }\n            if let Some(x) = args.key {\n                builder.add_key(x);\n            }\n            builder.finish()\n        }\n\n        #[inline]\n        pub fn key(&self) -> &'a str {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab.get::<flatbuffers::ForwardsUOffset<&str>>(KeyValue::VT_KEY, None).unwrap()\n            }\n        }\n        #[inline]\n        pub fn key_compare_less_than(&self, o: &KeyValue) -> bool {\n            self.key() < o.key()\n        }\n\n        #[inline]\n        pub fn key_compare_with_value(&self, val: &str) -> ::core::cmp::Ordering {\n            let key = self.key();\n            key.cmp(val)\n        }\n        #[inline]\n        pub fn value(&self) -> Option<&'a str> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe { self._tab.get::<flatbuffers::ForwardsUOffset<&str>>(KeyValue::VT_VALUE, None) }\n        }\n    }\n\n    impl flatbuffers::Verifiable for KeyValue<'_> {\n        #[inline]\n        fn run_verifier(\n            v: &mut flatbuffers::Verifier,\n            pos: usize,\n        ) -> Result<(), flatbuffers::InvalidFlatbuffer> {\n            use self::flatbuffers::Verifiable;\n            v.visit_table(pos)?\n                .visit_field::<flatbuffers::ForwardsUOffset<&str>>(\"key\", Self::VT_KEY, true)?\n                .visit_field::<flatbuffers::ForwardsUOffset<&str>>(\"value\", Self::VT_VALUE, false)?\n                .finish();\n            Ok(())\n        }\n    }\n    pub struct KeyValueArgs<'a> {\n        pub key: Option<flatbuffers::WIPOffset<&'a str>>,\n        pub value: Option<flatbuffers::WIPOffset<&'a str>>,\n    }\n    impl<'a> Default for KeyValueArgs<'a> {\n        #[inline]\n        fn default() -> Self {\n            KeyValueArgs {\n                key: None, // required field\n                value: None,\n            }\n        }\n    }\n\n    pub struct KeyValueBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> {\n        fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,\n        start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>,\n    }\n    impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> KeyValueBuilder<'a, 'b, A> {\n        #[inline]\n        pub fn add_key(&mut self, key: flatbuffers::WIPOffset<&'b str>) {\n            self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(KeyValue::VT_KEY, key);\n        }\n        #[inline]\n        pub fn add_value(&mut self, value: flatbuffers::WIPOffset<&'b str>) {\n            self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(KeyValue::VT_VALUE, value);\n        }\n        #[inline]\n        pub fn new(\n            _fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,\n        ) -> KeyValueBuilder<'a, 'b, A> {\n            let start = _fbb.start_table();\n            KeyValueBuilder { fbb_: _fbb, start_: start }\n        }\n        #[inline]\n        pub fn finish(self) -> flatbuffers::WIPOffset<KeyValue<'a>> {\n            let o = self.fbb_.end_table(self.start_);\n            self.fbb_.required(o, KeyValue::VT_KEY, \"key\");\n            flatbuffers::WIPOffset::new(o.value())\n        }\n    }\n\n    impl core::fmt::Debug for KeyValue<'_> {\n        fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {\n            let mut ds = f.debug_struct(\"KeyValue\");\n            ds.field(\"key\", &self.key());\n            ds.field(\"value\", &self.value());\n            ds.finish()\n        }\n    }\n    pub enum EnumValOffset {}\n    #[derive(Copy, Clone, PartialEq)]\n\n    pub struct EnumVal<'a> {\n        pub _tab: flatbuffers::Table<'a>,\n    }\n\n    impl<'a> flatbuffers::Follow<'a> for EnumVal<'a> {\n        type Inner = EnumVal<'a>;\n        #[inline]\n        unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n            Self { _tab: flatbuffers::Table::new(buf, loc) }\n        }\n    }\n\n    impl<'a> EnumVal<'a> {\n        pub const VT_NAME: flatbuffers::VOffsetT = 4;\n        pub const VT_VALUE: flatbuffers::VOffsetT = 6;\n        pub const VT_UNION_TYPE: flatbuffers::VOffsetT = 10;\n        pub const VT_DOCUMENTATION: flatbuffers::VOffsetT = 12;\n        pub const VT_ATTRIBUTES: flatbuffers::VOffsetT = 14;\n\n        #[inline]\n        pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self {\n            EnumVal { _tab: table }\n        }\n        #[allow(unused_mut)]\n        pub fn create<\n            'bldr: 'args,\n            'args: 'mut_bldr,\n            'mut_bldr,\n            A: flatbuffers::Allocator + 'bldr,\n        >(\n            _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>,\n            args: &'args EnumValArgs<'args>,\n        ) -> flatbuffers::WIPOffset<EnumVal<'bldr>> {\n            let mut builder = EnumValBuilder::new(_fbb);\n            builder.add_value(args.value);\n            if let Some(x) = args.attributes {\n                builder.add_attributes(x);\n            }\n            if let Some(x) = args.documentation {\n                builder.add_documentation(x);\n            }\n            if let Some(x) = args.union_type {\n                builder.add_union_type(x);\n            }\n            if let Some(x) = args.name {\n                builder.add_name(x);\n            }\n            builder.finish()\n        }\n\n        #[inline]\n        pub fn name(&self) -> &'a str {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab.get::<flatbuffers::ForwardsUOffset<&str>>(EnumVal::VT_NAME, None).unwrap()\n            }\n        }\n        #[inline]\n        pub fn value(&self) -> i64 {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe { self._tab.get::<i64>(EnumVal::VT_VALUE, Some(0)).unwrap() }\n        }\n        #[inline]\n        pub fn key_compare_less_than(&self, o: &EnumVal) -> bool {\n            self.value() < o.value()\n        }\n\n        #[inline]\n        pub fn key_compare_with_value(&self, val: i64) -> ::core::cmp::Ordering {\n            let key = self.value();\n            key.cmp(&val)\n        }\n        #[inline]\n        pub fn union_type(&self) -> Option<Type<'a>> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab.get::<flatbuffers::ForwardsUOffset<Type>>(EnumVal::VT_UNION_TYPE, None)\n            }\n        }\n        #[inline]\n        pub fn documentation(\n            &self,\n        ) -> Option<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab.get::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>,\n                >>(EnumVal::VT_DOCUMENTATION, None)\n            }\n        }\n        #[inline]\n        pub fn attributes(\n            &self,\n        ) -> Option<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<KeyValue<'a>>>> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab.get::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<KeyValue>>,\n                >>(EnumVal::VT_ATTRIBUTES, None)\n            }\n        }\n    }\n\n    impl flatbuffers::Verifiable for EnumVal<'_> {\n        #[inline]\n        fn run_verifier(\n            v: &mut flatbuffers::Verifier,\n            pos: usize,\n        ) -> Result<(), flatbuffers::InvalidFlatbuffer> {\n            use self::flatbuffers::Verifiable;\n            v.visit_table(pos)?\n                .visit_field::<flatbuffers::ForwardsUOffset<&str>>(\"name\", Self::VT_NAME, true)?\n                .visit_field::<i64>(\"value\", Self::VT_VALUE, false)?\n                .visit_field::<flatbuffers::ForwardsUOffset<Type>>(\n                    \"union_type\",\n                    Self::VT_UNION_TYPE,\n                    false,\n                )?\n                .visit_field::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'_, flatbuffers::ForwardsUOffset<&'_ str>>,\n                >>(\"documentation\", Self::VT_DOCUMENTATION, false)?\n                .visit_field::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'_, flatbuffers::ForwardsUOffset<KeyValue>>,\n                >>(\"attributes\", Self::VT_ATTRIBUTES, false)?\n                .finish();\n            Ok(())\n        }\n    }\n    pub struct EnumValArgs<'a> {\n        pub name: Option<flatbuffers::WIPOffset<&'a str>>,\n        pub value: i64,\n        pub union_type: Option<flatbuffers::WIPOffset<Type<'a>>>,\n        pub documentation: Option<\n            flatbuffers::WIPOffset<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>>,\n        >,\n        pub attributes: Option<\n            flatbuffers::WIPOffset<\n                flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<KeyValue<'a>>>,\n            >,\n        >,\n    }\n    impl<'a> Default for EnumValArgs<'a> {\n        #[inline]\n        fn default() -> Self {\n            EnumValArgs {\n                name: None, // required field\n                value: 0,\n                union_type: None,\n                documentation: None,\n                attributes: None,\n            }\n        }\n    }\n\n    pub struct EnumValBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> {\n        fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,\n        start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>,\n    }\n    impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> EnumValBuilder<'a, 'b, A> {\n        #[inline]\n        pub fn add_name(&mut self, name: flatbuffers::WIPOffset<&'b str>) {\n            self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(EnumVal::VT_NAME, name);\n        }\n        #[inline]\n        pub fn add_value(&mut self, value: i64) {\n            self.fbb_.push_slot::<i64>(EnumVal::VT_VALUE, value, 0);\n        }\n        #[inline]\n        pub fn add_union_type(&mut self, union_type: flatbuffers::WIPOffset<Type<'b>>) {\n            self.fbb_.push_slot_always::<flatbuffers::WIPOffset<Type>>(\n                EnumVal::VT_UNION_TYPE,\n                union_type,\n            );\n        }\n        #[inline]\n        pub fn add_documentation(\n            &mut self,\n            documentation: flatbuffers::WIPOffset<\n                flatbuffers::Vector<'b, flatbuffers::ForwardsUOffset<&'b str>>,\n            >,\n        ) {\n            self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(\n                EnumVal::VT_DOCUMENTATION,\n                documentation,\n            );\n        }\n        #[inline]\n        pub fn add_attributes(\n            &mut self,\n            attributes: flatbuffers::WIPOffset<\n                flatbuffers::Vector<'b, flatbuffers::ForwardsUOffset<KeyValue<'b>>>,\n            >,\n        ) {\n            self.fbb_\n                .push_slot_always::<flatbuffers::WIPOffset<_>>(EnumVal::VT_ATTRIBUTES, attributes);\n        }\n        #[inline]\n        pub fn new(\n            _fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,\n        ) -> EnumValBuilder<'a, 'b, A> {\n            let start = _fbb.start_table();\n            EnumValBuilder { fbb_: _fbb, start_: start }\n        }\n        #[inline]\n        pub fn finish(self) -> flatbuffers::WIPOffset<EnumVal<'a>> {\n            let o = self.fbb_.end_table(self.start_);\n            self.fbb_.required(o, EnumVal::VT_NAME, \"name\");\n            flatbuffers::WIPOffset::new(o.value())\n        }\n    }\n\n    impl core::fmt::Debug for EnumVal<'_> {\n        fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {\n            let mut ds = f.debug_struct(\"EnumVal\");\n            ds.field(\"name\", &self.name());\n            ds.field(\"value\", &self.value());\n            ds.field(\"union_type\", &self.union_type());\n            ds.field(\"documentation\", &self.documentation());\n            ds.field(\"attributes\", &self.attributes());\n            ds.finish()\n        }\n    }\n    pub enum EnumOffset {}\n    #[derive(Copy, Clone, PartialEq)]\n\n    pub struct Enum<'a> {\n        pub _tab: flatbuffers::Table<'a>,\n    }\n\n    impl<'a> flatbuffers::Follow<'a> for Enum<'a> {\n        type Inner = Enum<'a>;\n        #[inline]\n        unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n            Self { _tab: flatbuffers::Table::new(buf, loc) }\n        }\n    }\n\n    impl<'a> Enum<'a> {\n        pub const VT_NAME: flatbuffers::VOffsetT = 4;\n        pub const VT_VALUES: flatbuffers::VOffsetT = 6;\n        pub const VT_IS_UNION: flatbuffers::VOffsetT = 8;\n        pub const VT_UNDERLYING_TYPE: flatbuffers::VOffsetT = 10;\n        pub const VT_ATTRIBUTES: flatbuffers::VOffsetT = 12;\n        pub const VT_DOCUMENTATION: flatbuffers::VOffsetT = 14;\n        pub const VT_DECLARATION_FILE: flatbuffers::VOffsetT = 16;\n\n        #[inline]\n        pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self {\n            Enum { _tab: table }\n        }\n        #[allow(unused_mut)]\n        pub fn create<\n            'bldr: 'args,\n            'args: 'mut_bldr,\n            'mut_bldr,\n            A: flatbuffers::Allocator + 'bldr,\n        >(\n            _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>,\n            args: &'args EnumArgs<'args>,\n        ) -> flatbuffers::WIPOffset<Enum<'bldr>> {\n            let mut builder = EnumBuilder::new(_fbb);\n            if let Some(x) = args.declaration_file {\n                builder.add_declaration_file(x);\n            }\n            if let Some(x) = args.documentation {\n                builder.add_documentation(x);\n            }\n            if let Some(x) = args.attributes {\n                builder.add_attributes(x);\n            }\n            if let Some(x) = args.underlying_type {\n                builder.add_underlying_type(x);\n            }\n            if let Some(x) = args.values {\n                builder.add_values(x);\n            }\n            if let Some(x) = args.name {\n                builder.add_name(x);\n            }\n            builder.add_is_union(args.is_union);\n            builder.finish()\n        }\n\n        #[inline]\n        pub fn name(&self) -> &'a str {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab.get::<flatbuffers::ForwardsUOffset<&str>>(Enum::VT_NAME, None).unwrap()\n            }\n        }\n        #[inline]\n        pub fn key_compare_less_than(&self, o: &Enum) -> bool {\n            self.name() < o.name()\n        }\n\n        #[inline]\n        pub fn key_compare_with_value(&self, val: &str) -> ::core::cmp::Ordering {\n            let key = self.name();\n            key.cmp(val)\n        }\n        #[inline]\n        pub fn values(&self) -> flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<EnumVal<'a>>> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab\n                    .get::<flatbuffers::ForwardsUOffset<\n                        flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<EnumVal>>,\n                    >>(Enum::VT_VALUES, None)\n                    .unwrap()\n            }\n        }\n        #[inline]\n        pub fn is_union(&self) -> bool {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe { self._tab.get::<bool>(Enum::VT_IS_UNION, Some(false)).unwrap() }\n        }\n        #[inline]\n        pub fn underlying_type(&self) -> Type<'a> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab\n                    .get::<flatbuffers::ForwardsUOffset<Type>>(Enum::VT_UNDERLYING_TYPE, None)\n                    .unwrap()\n            }\n        }\n        #[inline]\n        pub fn attributes(\n            &self,\n        ) -> Option<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<KeyValue<'a>>>> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab.get::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<KeyValue>>,\n                >>(Enum::VT_ATTRIBUTES, None)\n            }\n        }\n        #[inline]\n        pub fn documentation(\n            &self,\n        ) -> Option<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab.get::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>,\n                >>(Enum::VT_DOCUMENTATION, None)\n            }\n        }\n        /// File that this Enum is declared in.\n        #[inline]\n        pub fn declaration_file(&self) -> Option<&'a str> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab.get::<flatbuffers::ForwardsUOffset<&str>>(Enum::VT_DECLARATION_FILE, None)\n            }\n        }\n    }\n\n    impl flatbuffers::Verifiable for Enum<'_> {\n        #[inline]\n        fn run_verifier(\n            v: &mut flatbuffers::Verifier,\n            pos: usize,\n        ) -> Result<(), flatbuffers::InvalidFlatbuffer> {\n            use self::flatbuffers::Verifiable;\n            v.visit_table(pos)?\n                .visit_field::<flatbuffers::ForwardsUOffset<&str>>(\"name\", Self::VT_NAME, true)?\n                .visit_field::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'_, flatbuffers::ForwardsUOffset<EnumVal>>,\n                >>(\"values\", Self::VT_VALUES, true)?\n                .visit_field::<bool>(\"is_union\", Self::VT_IS_UNION, false)?\n                .visit_field::<flatbuffers::ForwardsUOffset<Type>>(\n                    \"underlying_type\",\n                    Self::VT_UNDERLYING_TYPE,\n                    true,\n                )?\n                .visit_field::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'_, flatbuffers::ForwardsUOffset<KeyValue>>,\n                >>(\"attributes\", Self::VT_ATTRIBUTES, false)?\n                .visit_field::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'_, flatbuffers::ForwardsUOffset<&'_ str>>,\n                >>(\"documentation\", Self::VT_DOCUMENTATION, false)?\n                .visit_field::<flatbuffers::ForwardsUOffset<&str>>(\n                    \"declaration_file\",\n                    Self::VT_DECLARATION_FILE,\n                    false,\n                )?\n                .finish();\n            Ok(())\n        }\n    }\n    pub struct EnumArgs<'a> {\n        pub name: Option<flatbuffers::WIPOffset<&'a str>>,\n        pub values: Option<\n            flatbuffers::WIPOffset<\n                flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<EnumVal<'a>>>,\n            >,\n        >,\n        pub is_union: bool,\n        pub underlying_type: Option<flatbuffers::WIPOffset<Type<'a>>>,\n        pub attributes: Option<\n            flatbuffers::WIPOffset<\n                flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<KeyValue<'a>>>,\n            >,\n        >,\n        pub documentation: Option<\n            flatbuffers::WIPOffset<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>>,\n        >,\n        pub declaration_file: Option<flatbuffers::WIPOffset<&'a str>>,\n    }\n    impl<'a> Default for EnumArgs<'a> {\n        #[inline]\n        fn default() -> Self {\n            EnumArgs {\n                name: None,   // required field\n                values: None, // required field\n                is_union: false,\n                underlying_type: None, // required field\n                attributes: None,\n                documentation: None,\n                declaration_file: None,\n            }\n        }\n    }\n\n    pub struct EnumBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> {\n        fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,\n        start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>,\n    }\n    impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> EnumBuilder<'a, 'b, A> {\n        #[inline]\n        pub fn add_name(&mut self, name: flatbuffers::WIPOffset<&'b str>) {\n            self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Enum::VT_NAME, name);\n        }\n        #[inline]\n        pub fn add_values(\n            &mut self,\n            values: flatbuffers::WIPOffset<\n                flatbuffers::Vector<'b, flatbuffers::ForwardsUOffset<EnumVal<'b>>>,\n            >,\n        ) {\n            self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Enum::VT_VALUES, values);\n        }\n        #[inline]\n        pub fn add_is_union(&mut self, is_union: bool) {\n            self.fbb_.push_slot::<bool>(Enum::VT_IS_UNION, is_union, false);\n        }\n        #[inline]\n        pub fn add_underlying_type(&mut self, underlying_type: flatbuffers::WIPOffset<Type<'b>>) {\n            self.fbb_.push_slot_always::<flatbuffers::WIPOffset<Type>>(\n                Enum::VT_UNDERLYING_TYPE,\n                underlying_type,\n            );\n        }\n        #[inline]\n        pub fn add_attributes(\n            &mut self,\n            attributes: flatbuffers::WIPOffset<\n                flatbuffers::Vector<'b, flatbuffers::ForwardsUOffset<KeyValue<'b>>>,\n            >,\n        ) {\n            self.fbb_\n                .push_slot_always::<flatbuffers::WIPOffset<_>>(Enum::VT_ATTRIBUTES, attributes);\n        }\n        #[inline]\n        pub fn add_documentation(\n            &mut self,\n            documentation: flatbuffers::WIPOffset<\n                flatbuffers::Vector<'b, flatbuffers::ForwardsUOffset<&'b str>>,\n            >,\n        ) {\n            self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(\n                Enum::VT_DOCUMENTATION,\n                documentation,\n            );\n        }\n        #[inline]\n        pub fn add_declaration_file(&mut self, declaration_file: flatbuffers::WIPOffset<&'b str>) {\n            self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(\n                Enum::VT_DECLARATION_FILE,\n                declaration_file,\n            );\n        }\n        #[inline]\n        pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> EnumBuilder<'a, 'b, A> {\n            let start = _fbb.start_table();\n            EnumBuilder { fbb_: _fbb, start_: start }\n        }\n        #[inline]\n        pub fn finish(self) -> flatbuffers::WIPOffset<Enum<'a>> {\n            let o = self.fbb_.end_table(self.start_);\n            self.fbb_.required(o, Enum::VT_NAME, \"name\");\n            self.fbb_.required(o, Enum::VT_VALUES, \"values\");\n            self.fbb_.required(o, Enum::VT_UNDERLYING_TYPE, \"underlying_type\");\n            flatbuffers::WIPOffset::new(o.value())\n        }\n    }\n\n    impl core::fmt::Debug for Enum<'_> {\n        fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {\n            let mut ds = f.debug_struct(\"Enum\");\n            ds.field(\"name\", &self.name());\n            ds.field(\"values\", &self.values());\n            ds.field(\"is_union\", &self.is_union());\n            ds.field(\"underlying_type\", &self.underlying_type());\n            ds.field(\"attributes\", &self.attributes());\n            ds.field(\"documentation\", &self.documentation());\n            ds.field(\"declaration_file\", &self.declaration_file());\n            ds.finish()\n        }\n    }\n    pub enum FieldOffset {}\n    #[derive(Copy, Clone, PartialEq)]\n\n    pub struct Field<'a> {\n        pub _tab: flatbuffers::Table<'a>,\n    }\n\n    impl<'a> flatbuffers::Follow<'a> for Field<'a> {\n        type Inner = Field<'a>;\n        #[inline]\n        unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n            Self { _tab: flatbuffers::Table::new(buf, loc) }\n        }\n    }\n\n    impl<'a> Field<'a> {\n        pub const VT_NAME: flatbuffers::VOffsetT = 4;\n        pub const VT_TYPE_: flatbuffers::VOffsetT = 6;\n        pub const VT_ID: flatbuffers::VOffsetT = 8;\n        pub const VT_OFFSET: flatbuffers::VOffsetT = 10;\n        pub const VT_DEFAULT_INTEGER: flatbuffers::VOffsetT = 12;\n        pub const VT_DEFAULT_REAL: flatbuffers::VOffsetT = 14;\n        pub const VT_DEPRECATED: flatbuffers::VOffsetT = 16;\n        pub const VT_REQUIRED: flatbuffers::VOffsetT = 18;\n        pub const VT_KEY: flatbuffers::VOffsetT = 20;\n        pub const VT_ATTRIBUTES: flatbuffers::VOffsetT = 22;\n        pub const VT_DOCUMENTATION: flatbuffers::VOffsetT = 24;\n        pub const VT_OPTIONAL: flatbuffers::VOffsetT = 26;\n        pub const VT_PADDING: flatbuffers::VOffsetT = 28;\n        pub const VT_OFFSET64: flatbuffers::VOffsetT = 30;\n\n        #[inline]\n        pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self {\n            Field { _tab: table }\n        }\n        #[allow(unused_mut)]\n        pub fn create<\n            'bldr: 'args,\n            'args: 'mut_bldr,\n            'mut_bldr,\n            A: flatbuffers::Allocator + 'bldr,\n        >(\n            _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>,\n            args: &'args FieldArgs<'args>,\n        ) -> flatbuffers::WIPOffset<Field<'bldr>> {\n            let mut builder = FieldBuilder::new(_fbb);\n            builder.add_default_real(args.default_real);\n            builder.add_default_integer(args.default_integer);\n            if let Some(x) = args.documentation {\n                builder.add_documentation(x);\n            }\n            if let Some(x) = args.attributes {\n                builder.add_attributes(x);\n            }\n            if let Some(x) = args.type_ {\n                builder.add_type_(x);\n            }\n            if let Some(x) = args.name {\n                builder.add_name(x);\n            }\n            builder.add_padding(args.padding);\n            builder.add_offset(args.offset);\n            builder.add_id(args.id);\n            builder.add_offset64(args.offset64);\n            builder.add_optional(args.optional);\n            builder.add_key(args.key);\n            builder.add_required(args.required);\n            builder.add_deprecated(args.deprecated);\n            builder.finish()\n        }\n\n        #[inline]\n        pub fn name(&self) -> &'a str {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab.get::<flatbuffers::ForwardsUOffset<&str>>(Field::VT_NAME, None).unwrap()\n            }\n        }\n        #[inline]\n        pub fn key_compare_less_than(&self, o: &Field) -> bool {\n            self.name() < o.name()\n        }\n\n        #[inline]\n        pub fn key_compare_with_value(&self, val: &str) -> ::core::cmp::Ordering {\n            let key = self.name();\n            key.cmp(val)\n        }\n        #[inline]\n        pub fn type_(&self) -> Type<'a> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab.get::<flatbuffers::ForwardsUOffset<Type>>(Field::VT_TYPE_, None).unwrap()\n            }\n        }\n        #[inline]\n        pub fn id(&self) -> u16 {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe { self._tab.get::<u16>(Field::VT_ID, Some(0)).unwrap() }\n        }\n        #[inline]\n        pub fn offset(&self) -> u16 {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe { self._tab.get::<u16>(Field::VT_OFFSET, Some(0)).unwrap() }\n        }\n        #[inline]\n        pub fn default_integer(&self) -> i64 {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe { self._tab.get::<i64>(Field::VT_DEFAULT_INTEGER, Some(0)).unwrap() }\n        }\n        #[inline]\n        pub fn default_real(&self) -> f64 {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe { self._tab.get::<f64>(Field::VT_DEFAULT_REAL, Some(0.0)).unwrap() }\n        }\n        #[inline]\n        pub fn deprecated(&self) -> bool {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe { self._tab.get::<bool>(Field::VT_DEPRECATED, Some(false)).unwrap() }\n        }\n        #[inline]\n        pub fn required(&self) -> bool {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe { self._tab.get::<bool>(Field::VT_REQUIRED, Some(false)).unwrap() }\n        }\n        #[inline]\n        pub fn key(&self) -> bool {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe { self._tab.get::<bool>(Field::VT_KEY, Some(false)).unwrap() }\n        }\n        #[inline]\n        pub fn attributes(\n            &self,\n        ) -> Option<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<KeyValue<'a>>>> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab.get::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<KeyValue>>,\n                >>(Field::VT_ATTRIBUTES, None)\n            }\n        }\n        #[inline]\n        pub fn documentation(\n            &self,\n        ) -> Option<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab.get::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>,\n                >>(Field::VT_DOCUMENTATION, None)\n            }\n        }\n        #[inline]\n        pub fn optional(&self) -> bool {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe { self._tab.get::<bool>(Field::VT_OPTIONAL, Some(false)).unwrap() }\n        }\n        /// Number of padding octets to always add after this field. Structs only.\n        #[inline]\n        pub fn padding(&self) -> u16 {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe { self._tab.get::<u16>(Field::VT_PADDING, Some(0)).unwrap() }\n        }\n        /// If the field uses 64-bit offsets.\n        #[inline]\n        pub fn offset64(&self) -> bool {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe { self._tab.get::<bool>(Field::VT_OFFSET64, Some(false)).unwrap() }\n        }\n    }\n\n    impl flatbuffers::Verifiable for Field<'_> {\n        #[inline]\n        fn run_verifier(\n            v: &mut flatbuffers::Verifier,\n            pos: usize,\n        ) -> Result<(), flatbuffers::InvalidFlatbuffer> {\n            use self::flatbuffers::Verifiable;\n            v.visit_table(pos)?\n                .visit_field::<flatbuffers::ForwardsUOffset<&str>>(\"name\", Self::VT_NAME, true)?\n                .visit_field::<flatbuffers::ForwardsUOffset<Type>>(\"type_\", Self::VT_TYPE_, true)?\n                .visit_field::<u16>(\"id\", Self::VT_ID, false)?\n                .visit_field::<u16>(\"offset\", Self::VT_OFFSET, false)?\n                .visit_field::<i64>(\"default_integer\", Self::VT_DEFAULT_INTEGER, false)?\n                .visit_field::<f64>(\"default_real\", Self::VT_DEFAULT_REAL, false)?\n                .visit_field::<bool>(\"deprecated\", Self::VT_DEPRECATED, false)?\n                .visit_field::<bool>(\"required\", Self::VT_REQUIRED, false)?\n                .visit_field::<bool>(\"key\", Self::VT_KEY, false)?\n                .visit_field::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'_, flatbuffers::ForwardsUOffset<KeyValue>>,\n                >>(\"attributes\", Self::VT_ATTRIBUTES, false)?\n                .visit_field::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'_, flatbuffers::ForwardsUOffset<&'_ str>>,\n                >>(\"documentation\", Self::VT_DOCUMENTATION, false)?\n                .visit_field::<bool>(\"optional\", Self::VT_OPTIONAL, false)?\n                .visit_field::<u16>(\"padding\", Self::VT_PADDING, false)?\n                .visit_field::<bool>(\"offset64\", Self::VT_OFFSET64, false)?\n                .finish();\n            Ok(())\n        }\n    }\n    pub struct FieldArgs<'a> {\n        pub name: Option<flatbuffers::WIPOffset<&'a str>>,\n        pub type_: Option<flatbuffers::WIPOffset<Type<'a>>>,\n        pub id: u16,\n        pub offset: u16,\n        pub default_integer: i64,\n        pub default_real: f64,\n        pub deprecated: bool,\n        pub required: bool,\n        pub key: bool,\n        pub attributes: Option<\n            flatbuffers::WIPOffset<\n                flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<KeyValue<'a>>>,\n            >,\n        >,\n        pub documentation: Option<\n            flatbuffers::WIPOffset<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>>,\n        >,\n        pub optional: bool,\n        pub padding: u16,\n        pub offset64: bool,\n    }\n    impl<'a> Default for FieldArgs<'a> {\n        #[inline]\n        fn default() -> Self {\n            FieldArgs {\n                name: None,  // required field\n                type_: None, // required field\n                id: 0,\n                offset: 0,\n                default_integer: 0,\n                default_real: 0.0,\n                deprecated: false,\n                required: false,\n                key: false,\n                attributes: None,\n                documentation: None,\n                optional: false,\n                padding: 0,\n                offset64: false,\n            }\n        }\n    }\n\n    pub struct FieldBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> {\n        fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,\n        start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>,\n    }\n    impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> FieldBuilder<'a, 'b, A> {\n        #[inline]\n        pub fn add_name(&mut self, name: flatbuffers::WIPOffset<&'b str>) {\n            self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Field::VT_NAME, name);\n        }\n        #[inline]\n        pub fn add_type_(&mut self, type_: flatbuffers::WIPOffset<Type<'b>>) {\n            self.fbb_.push_slot_always::<flatbuffers::WIPOffset<Type>>(Field::VT_TYPE_, type_);\n        }\n        #[inline]\n        pub fn add_id(&mut self, id: u16) {\n            self.fbb_.push_slot::<u16>(Field::VT_ID, id, 0);\n        }\n        #[inline]\n        pub fn add_offset(&mut self, offset: u16) {\n            self.fbb_.push_slot::<u16>(Field::VT_OFFSET, offset, 0);\n        }\n        #[inline]\n        pub fn add_default_integer(&mut self, default_integer: i64) {\n            self.fbb_.push_slot::<i64>(Field::VT_DEFAULT_INTEGER, default_integer, 0);\n        }\n        #[inline]\n        pub fn add_default_real(&mut self, default_real: f64) {\n            self.fbb_.push_slot::<f64>(Field::VT_DEFAULT_REAL, default_real, 0.0);\n        }\n        #[inline]\n        pub fn add_deprecated(&mut self, deprecated: bool) {\n            self.fbb_.push_slot::<bool>(Field::VT_DEPRECATED, deprecated, false);\n        }\n        #[inline]\n        pub fn add_required(&mut self, required: bool) {\n            self.fbb_.push_slot::<bool>(Field::VT_REQUIRED, required, false);\n        }\n        #[inline]\n        pub fn add_key(&mut self, key: bool) {\n            self.fbb_.push_slot::<bool>(Field::VT_KEY, key, false);\n        }\n        #[inline]\n        pub fn add_attributes(\n            &mut self,\n            attributes: flatbuffers::WIPOffset<\n                flatbuffers::Vector<'b, flatbuffers::ForwardsUOffset<KeyValue<'b>>>,\n            >,\n        ) {\n            self.fbb_\n                .push_slot_always::<flatbuffers::WIPOffset<_>>(Field::VT_ATTRIBUTES, attributes);\n        }\n        #[inline]\n        pub fn add_documentation(\n            &mut self,\n            documentation: flatbuffers::WIPOffset<\n                flatbuffers::Vector<'b, flatbuffers::ForwardsUOffset<&'b str>>,\n            >,\n        ) {\n            self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(\n                Field::VT_DOCUMENTATION,\n                documentation,\n            );\n        }\n        #[inline]\n        pub fn add_optional(&mut self, optional: bool) {\n            self.fbb_.push_slot::<bool>(Field::VT_OPTIONAL, optional, false);\n        }\n        #[inline]\n        pub fn add_padding(&mut self, padding: u16) {\n            self.fbb_.push_slot::<u16>(Field::VT_PADDING, padding, 0);\n        }\n        #[inline]\n        pub fn add_offset64(&mut self, offset64: bool) {\n            self.fbb_.push_slot::<bool>(Field::VT_OFFSET64, offset64, false);\n        }\n        #[inline]\n        pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> FieldBuilder<'a, 'b, A> {\n            let start = _fbb.start_table();\n            FieldBuilder { fbb_: _fbb, start_: start }\n        }\n        #[inline]\n        pub fn finish(self) -> flatbuffers::WIPOffset<Field<'a>> {\n            let o = self.fbb_.end_table(self.start_);\n            self.fbb_.required(o, Field::VT_NAME, \"name\");\n            self.fbb_.required(o, Field::VT_TYPE_, \"type_\");\n            flatbuffers::WIPOffset::new(o.value())\n        }\n    }\n\n    impl core::fmt::Debug for Field<'_> {\n        fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {\n            let mut ds = f.debug_struct(\"Field\");\n            ds.field(\"name\", &self.name());\n            ds.field(\"type_\", &self.type_());\n            ds.field(\"id\", &self.id());\n            ds.field(\"offset\", &self.offset());\n            ds.field(\"default_integer\", &self.default_integer());\n            ds.field(\"default_real\", &self.default_real());\n            ds.field(\"deprecated\", &self.deprecated());\n            ds.field(\"required\", &self.required());\n            ds.field(\"key\", &self.key());\n            ds.field(\"attributes\", &self.attributes());\n            ds.field(\"documentation\", &self.documentation());\n            ds.field(\"optional\", &self.optional());\n            ds.field(\"padding\", &self.padding());\n            ds.field(\"offset64\", &self.offset64());\n            ds.finish()\n        }\n    }\n    pub enum ObjectOffset {}\n    #[derive(Copy, Clone, PartialEq)]\n\n    pub struct Object<'a> {\n        pub _tab: flatbuffers::Table<'a>,\n    }\n\n    impl<'a> flatbuffers::Follow<'a> for Object<'a> {\n        type Inner = Object<'a>;\n        #[inline]\n        unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n            Self { _tab: flatbuffers::Table::new(buf, loc) }\n        }\n    }\n\n    impl<'a> Object<'a> {\n        pub const VT_NAME: flatbuffers::VOffsetT = 4;\n        pub const VT_FIELDS: flatbuffers::VOffsetT = 6;\n        pub const VT_IS_STRUCT: flatbuffers::VOffsetT = 8;\n        pub const VT_MINALIGN: flatbuffers::VOffsetT = 10;\n        pub const VT_BYTESIZE: flatbuffers::VOffsetT = 12;\n        pub const VT_ATTRIBUTES: flatbuffers::VOffsetT = 14;\n        pub const VT_DOCUMENTATION: flatbuffers::VOffsetT = 16;\n        pub const VT_DECLARATION_FILE: flatbuffers::VOffsetT = 18;\n\n        #[inline]\n        pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self {\n            Object { _tab: table }\n        }\n        #[allow(unused_mut)]\n        pub fn create<\n            'bldr: 'args,\n            'args: 'mut_bldr,\n            'mut_bldr,\n            A: flatbuffers::Allocator + 'bldr,\n        >(\n            _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>,\n            args: &'args ObjectArgs<'args>,\n        ) -> flatbuffers::WIPOffset<Object<'bldr>> {\n            let mut builder = ObjectBuilder::new(_fbb);\n            if let Some(x) = args.declaration_file {\n                builder.add_declaration_file(x);\n            }\n            if let Some(x) = args.documentation {\n                builder.add_documentation(x);\n            }\n            if let Some(x) = args.attributes {\n                builder.add_attributes(x);\n            }\n            builder.add_bytesize(args.bytesize);\n            builder.add_minalign(args.minalign);\n            if let Some(x) = args.fields {\n                builder.add_fields(x);\n            }\n            if let Some(x) = args.name {\n                builder.add_name(x);\n            }\n            builder.add_is_struct(args.is_struct);\n            builder.finish()\n        }\n\n        #[inline]\n        pub fn name(&self) -> &'a str {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab.get::<flatbuffers::ForwardsUOffset<&str>>(Object::VT_NAME, None).unwrap()\n            }\n        }\n        #[inline]\n        pub fn key_compare_less_than(&self, o: &Object) -> bool {\n            self.name() < o.name()\n        }\n\n        #[inline]\n        pub fn key_compare_with_value(&self, val: &str) -> ::core::cmp::Ordering {\n            let key = self.name();\n            key.cmp(val)\n        }\n        #[inline]\n        pub fn fields(&self) -> flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<Field<'a>>> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab\n                    .get::<flatbuffers::ForwardsUOffset<\n                        flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<Field>>,\n                    >>(Object::VT_FIELDS, None)\n                    .unwrap()\n            }\n        }\n        #[inline]\n        pub fn is_struct(&self) -> bool {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe { self._tab.get::<bool>(Object::VT_IS_STRUCT, Some(false)).unwrap() }\n        }\n        #[inline]\n        pub fn minalign(&self) -> i32 {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe { self._tab.get::<i32>(Object::VT_MINALIGN, Some(0)).unwrap() }\n        }\n        #[inline]\n        pub fn bytesize(&self) -> i32 {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe { self._tab.get::<i32>(Object::VT_BYTESIZE, Some(0)).unwrap() }\n        }\n        #[inline]\n        pub fn attributes(\n            &self,\n        ) -> Option<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<KeyValue<'a>>>> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab.get::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<KeyValue>>,\n                >>(Object::VT_ATTRIBUTES, None)\n            }\n        }\n        #[inline]\n        pub fn documentation(\n            &self,\n        ) -> Option<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab.get::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>,\n                >>(Object::VT_DOCUMENTATION, None)\n            }\n        }\n        /// File that this Object is declared in.\n        #[inline]\n        pub fn declaration_file(&self) -> Option<&'a str> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab\n                    .get::<flatbuffers::ForwardsUOffset<&str>>(Object::VT_DECLARATION_FILE, None)\n            }\n        }\n    }\n\n    impl flatbuffers::Verifiable for Object<'_> {\n        #[inline]\n        fn run_verifier(\n            v: &mut flatbuffers::Verifier,\n            pos: usize,\n        ) -> Result<(), flatbuffers::InvalidFlatbuffer> {\n            use self::flatbuffers::Verifiable;\n            v.visit_table(pos)?\n                .visit_field::<flatbuffers::ForwardsUOffset<&str>>(\"name\", Self::VT_NAME, true)?\n                .visit_field::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'_, flatbuffers::ForwardsUOffset<Field>>,\n                >>(\"fields\", Self::VT_FIELDS, true)?\n                .visit_field::<bool>(\"is_struct\", Self::VT_IS_STRUCT, false)?\n                .visit_field::<i32>(\"minalign\", Self::VT_MINALIGN, false)?\n                .visit_field::<i32>(\"bytesize\", Self::VT_BYTESIZE, false)?\n                .visit_field::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'_, flatbuffers::ForwardsUOffset<KeyValue>>,\n                >>(\"attributes\", Self::VT_ATTRIBUTES, false)?\n                .visit_field::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'_, flatbuffers::ForwardsUOffset<&'_ str>>,\n                >>(\"documentation\", Self::VT_DOCUMENTATION, false)?\n                .visit_field::<flatbuffers::ForwardsUOffset<&str>>(\n                    \"declaration_file\",\n                    Self::VT_DECLARATION_FILE,\n                    false,\n                )?\n                .finish();\n            Ok(())\n        }\n    }\n    pub struct ObjectArgs<'a> {\n        pub name: Option<flatbuffers::WIPOffset<&'a str>>,\n        pub fields: Option<\n            flatbuffers::WIPOffset<\n                flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<Field<'a>>>,\n            >,\n        >,\n        pub is_struct: bool,\n        pub minalign: i32,\n        pub bytesize: i32,\n        pub attributes: Option<\n            flatbuffers::WIPOffset<\n                flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<KeyValue<'a>>>,\n            >,\n        >,\n        pub documentation: Option<\n            flatbuffers::WIPOffset<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>>,\n        >,\n        pub declaration_file: Option<flatbuffers::WIPOffset<&'a str>>,\n    }\n    impl<'a> Default for ObjectArgs<'a> {\n        #[inline]\n        fn default() -> Self {\n            ObjectArgs {\n                name: None,   // required field\n                fields: None, // required field\n                is_struct: false,\n                minalign: 0,\n                bytesize: 0,\n                attributes: None,\n                documentation: None,\n                declaration_file: None,\n            }\n        }\n    }\n\n    pub struct ObjectBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> {\n        fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,\n        start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>,\n    }\n    impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> ObjectBuilder<'a, 'b, A> {\n        #[inline]\n        pub fn add_name(&mut self, name: flatbuffers::WIPOffset<&'b str>) {\n            self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Object::VT_NAME, name);\n        }\n        #[inline]\n        pub fn add_fields(\n            &mut self,\n            fields: flatbuffers::WIPOffset<\n                flatbuffers::Vector<'b, flatbuffers::ForwardsUOffset<Field<'b>>>,\n            >,\n        ) {\n            self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Object::VT_FIELDS, fields);\n        }\n        #[inline]\n        pub fn add_is_struct(&mut self, is_struct: bool) {\n            self.fbb_.push_slot::<bool>(Object::VT_IS_STRUCT, is_struct, false);\n        }\n        #[inline]\n        pub fn add_minalign(&mut self, minalign: i32) {\n            self.fbb_.push_slot::<i32>(Object::VT_MINALIGN, minalign, 0);\n        }\n        #[inline]\n        pub fn add_bytesize(&mut self, bytesize: i32) {\n            self.fbb_.push_slot::<i32>(Object::VT_BYTESIZE, bytesize, 0);\n        }\n        #[inline]\n        pub fn add_attributes(\n            &mut self,\n            attributes: flatbuffers::WIPOffset<\n                flatbuffers::Vector<'b, flatbuffers::ForwardsUOffset<KeyValue<'b>>>,\n            >,\n        ) {\n            self.fbb_\n                .push_slot_always::<flatbuffers::WIPOffset<_>>(Object::VT_ATTRIBUTES, attributes);\n        }\n        #[inline]\n        pub fn add_documentation(\n            &mut self,\n            documentation: flatbuffers::WIPOffset<\n                flatbuffers::Vector<'b, flatbuffers::ForwardsUOffset<&'b str>>,\n            >,\n        ) {\n            self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(\n                Object::VT_DOCUMENTATION,\n                documentation,\n            );\n        }\n        #[inline]\n        pub fn add_declaration_file(&mut self, declaration_file: flatbuffers::WIPOffset<&'b str>) {\n            self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(\n                Object::VT_DECLARATION_FILE,\n                declaration_file,\n            );\n        }\n        #[inline]\n        pub fn new(\n            _fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,\n        ) -> ObjectBuilder<'a, 'b, A> {\n            let start = _fbb.start_table();\n            ObjectBuilder { fbb_: _fbb, start_: start }\n        }\n        #[inline]\n        pub fn finish(self) -> flatbuffers::WIPOffset<Object<'a>> {\n            let o = self.fbb_.end_table(self.start_);\n            self.fbb_.required(o, Object::VT_NAME, \"name\");\n            self.fbb_.required(o, Object::VT_FIELDS, \"fields\");\n            flatbuffers::WIPOffset::new(o.value())\n        }\n    }\n\n    impl core::fmt::Debug for Object<'_> {\n        fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {\n            let mut ds = f.debug_struct(\"Object\");\n            ds.field(\"name\", &self.name());\n            ds.field(\"fields\", &self.fields());\n            ds.field(\"is_struct\", &self.is_struct());\n            ds.field(\"minalign\", &self.minalign());\n            ds.field(\"bytesize\", &self.bytesize());\n            ds.field(\"attributes\", &self.attributes());\n            ds.field(\"documentation\", &self.documentation());\n            ds.field(\"declaration_file\", &self.declaration_file());\n            ds.finish()\n        }\n    }\n    pub enum RPCCallOffset {}\n    #[derive(Copy, Clone, PartialEq)]\n\n    pub struct RPCCall<'a> {\n        pub _tab: flatbuffers::Table<'a>,\n    }\n\n    impl<'a> flatbuffers::Follow<'a> for RPCCall<'a> {\n        type Inner = RPCCall<'a>;\n        #[inline]\n        unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n            Self { _tab: flatbuffers::Table::new(buf, loc) }\n        }\n    }\n\n    impl<'a> RPCCall<'a> {\n        pub const VT_NAME: flatbuffers::VOffsetT = 4;\n        pub const VT_REQUEST: flatbuffers::VOffsetT = 6;\n        pub const VT_RESPONSE: flatbuffers::VOffsetT = 8;\n        pub const VT_ATTRIBUTES: flatbuffers::VOffsetT = 10;\n        pub const VT_DOCUMENTATION: flatbuffers::VOffsetT = 12;\n\n        #[inline]\n        pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self {\n            RPCCall { _tab: table }\n        }\n        #[allow(unused_mut)]\n        pub fn create<\n            'bldr: 'args,\n            'args: 'mut_bldr,\n            'mut_bldr,\n            A: flatbuffers::Allocator + 'bldr,\n        >(\n            _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>,\n            args: &'args RPCCallArgs<'args>,\n        ) -> flatbuffers::WIPOffset<RPCCall<'bldr>> {\n            let mut builder = RPCCallBuilder::new(_fbb);\n            if let Some(x) = args.documentation {\n                builder.add_documentation(x);\n            }\n            if let Some(x) = args.attributes {\n                builder.add_attributes(x);\n            }\n            if let Some(x) = args.response {\n                builder.add_response(x);\n            }\n            if let Some(x) = args.request {\n                builder.add_request(x);\n            }\n            if let Some(x) = args.name {\n                builder.add_name(x);\n            }\n            builder.finish()\n        }\n\n        #[inline]\n        pub fn name(&self) -> &'a str {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab.get::<flatbuffers::ForwardsUOffset<&str>>(RPCCall::VT_NAME, None).unwrap()\n            }\n        }\n        #[inline]\n        pub fn key_compare_less_than(&self, o: &RPCCall) -> bool {\n            self.name() < o.name()\n        }\n\n        #[inline]\n        pub fn key_compare_with_value(&self, val: &str) -> ::core::cmp::Ordering {\n            let key = self.name();\n            key.cmp(val)\n        }\n        #[inline]\n        pub fn request(&self) -> Object<'a> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab\n                    .get::<flatbuffers::ForwardsUOffset<Object>>(RPCCall::VT_REQUEST, None)\n                    .unwrap()\n            }\n        }\n        #[inline]\n        pub fn response(&self) -> Object<'a> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab\n                    .get::<flatbuffers::ForwardsUOffset<Object>>(RPCCall::VT_RESPONSE, None)\n                    .unwrap()\n            }\n        }\n        #[inline]\n        pub fn attributes(\n            &self,\n        ) -> Option<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<KeyValue<'a>>>> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab.get::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<KeyValue>>,\n                >>(RPCCall::VT_ATTRIBUTES, None)\n            }\n        }\n        #[inline]\n        pub fn documentation(\n            &self,\n        ) -> Option<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab.get::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>,\n                >>(RPCCall::VT_DOCUMENTATION, None)\n            }\n        }\n    }\n\n    impl flatbuffers::Verifiable for RPCCall<'_> {\n        #[inline]\n        fn run_verifier(\n            v: &mut flatbuffers::Verifier,\n            pos: usize,\n        ) -> Result<(), flatbuffers::InvalidFlatbuffer> {\n            use self::flatbuffers::Verifiable;\n            v.visit_table(pos)?\n                .visit_field::<flatbuffers::ForwardsUOffset<&str>>(\"name\", Self::VT_NAME, true)?\n                .visit_field::<flatbuffers::ForwardsUOffset<Object>>(\n                    \"request\",\n                    Self::VT_REQUEST,\n                    true,\n                )?\n                .visit_field::<flatbuffers::ForwardsUOffset<Object>>(\n                    \"response\",\n                    Self::VT_RESPONSE,\n                    true,\n                )?\n                .visit_field::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'_, flatbuffers::ForwardsUOffset<KeyValue>>,\n                >>(\"attributes\", Self::VT_ATTRIBUTES, false)?\n                .visit_field::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'_, flatbuffers::ForwardsUOffset<&'_ str>>,\n                >>(\"documentation\", Self::VT_DOCUMENTATION, false)?\n                .finish();\n            Ok(())\n        }\n    }\n    pub struct RPCCallArgs<'a> {\n        pub name: Option<flatbuffers::WIPOffset<&'a str>>,\n        pub request: Option<flatbuffers::WIPOffset<Object<'a>>>,\n        pub response: Option<flatbuffers::WIPOffset<Object<'a>>>,\n        pub attributes: Option<\n            flatbuffers::WIPOffset<\n                flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<KeyValue<'a>>>,\n            >,\n        >,\n        pub documentation: Option<\n            flatbuffers::WIPOffset<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>>,\n        >,\n    }\n    impl<'a> Default for RPCCallArgs<'a> {\n        #[inline]\n        fn default() -> Self {\n            RPCCallArgs {\n                name: None,     // required field\n                request: None,  // required field\n                response: None, // required field\n                attributes: None,\n                documentation: None,\n            }\n        }\n    }\n\n    pub struct RPCCallBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> {\n        fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,\n        start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>,\n    }\n    impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> RPCCallBuilder<'a, 'b, A> {\n        #[inline]\n        pub fn add_name(&mut self, name: flatbuffers::WIPOffset<&'b str>) {\n            self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(RPCCall::VT_NAME, name);\n        }\n        #[inline]\n        pub fn add_request(&mut self, request: flatbuffers::WIPOffset<Object<'b>>) {\n            self.fbb_\n                .push_slot_always::<flatbuffers::WIPOffset<Object>>(RPCCall::VT_REQUEST, request);\n        }\n        #[inline]\n        pub fn add_response(&mut self, response: flatbuffers::WIPOffset<Object<'b>>) {\n            self.fbb_\n                .push_slot_always::<flatbuffers::WIPOffset<Object>>(RPCCall::VT_RESPONSE, response);\n        }\n        #[inline]\n        pub fn add_attributes(\n            &mut self,\n            attributes: flatbuffers::WIPOffset<\n                flatbuffers::Vector<'b, flatbuffers::ForwardsUOffset<KeyValue<'b>>>,\n            >,\n        ) {\n            self.fbb_\n                .push_slot_always::<flatbuffers::WIPOffset<_>>(RPCCall::VT_ATTRIBUTES, attributes);\n        }\n        #[inline]\n        pub fn add_documentation(\n            &mut self,\n            documentation: flatbuffers::WIPOffset<\n                flatbuffers::Vector<'b, flatbuffers::ForwardsUOffset<&'b str>>,\n            >,\n        ) {\n            self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(\n                RPCCall::VT_DOCUMENTATION,\n                documentation,\n            );\n        }\n        #[inline]\n        pub fn new(\n            _fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,\n        ) -> RPCCallBuilder<'a, 'b, A> {\n            let start = _fbb.start_table();\n            RPCCallBuilder { fbb_: _fbb, start_: start }\n        }\n        #[inline]\n        pub fn finish(self) -> flatbuffers::WIPOffset<RPCCall<'a>> {\n            let o = self.fbb_.end_table(self.start_);\n            self.fbb_.required(o, RPCCall::VT_NAME, \"name\");\n            self.fbb_.required(o, RPCCall::VT_REQUEST, \"request\");\n            self.fbb_.required(o, RPCCall::VT_RESPONSE, \"response\");\n            flatbuffers::WIPOffset::new(o.value())\n        }\n    }\n\n    impl core::fmt::Debug for RPCCall<'_> {\n        fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {\n            let mut ds = f.debug_struct(\"RPCCall\");\n            ds.field(\"name\", &self.name());\n            ds.field(\"request\", &self.request());\n            ds.field(\"response\", &self.response());\n            ds.field(\"attributes\", &self.attributes());\n            ds.field(\"documentation\", &self.documentation());\n            ds.finish()\n        }\n    }\n    pub enum ServiceOffset {}\n    #[derive(Copy, Clone, PartialEq)]\n\n    pub struct Service<'a> {\n        pub _tab: flatbuffers::Table<'a>,\n    }\n\n    impl<'a> flatbuffers::Follow<'a> for Service<'a> {\n        type Inner = Service<'a>;\n        #[inline]\n        unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n            Self { _tab: flatbuffers::Table::new(buf, loc) }\n        }\n    }\n\n    impl<'a> Service<'a> {\n        pub const VT_NAME: flatbuffers::VOffsetT = 4;\n        pub const VT_CALLS: flatbuffers::VOffsetT = 6;\n        pub const VT_ATTRIBUTES: flatbuffers::VOffsetT = 8;\n        pub const VT_DOCUMENTATION: flatbuffers::VOffsetT = 10;\n        pub const VT_DECLARATION_FILE: flatbuffers::VOffsetT = 12;\n\n        #[inline]\n        pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self {\n            Service { _tab: table }\n        }\n        #[allow(unused_mut)]\n        pub fn create<\n            'bldr: 'args,\n            'args: 'mut_bldr,\n            'mut_bldr,\n            A: flatbuffers::Allocator + 'bldr,\n        >(\n            _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>,\n            args: &'args ServiceArgs<'args>,\n        ) -> flatbuffers::WIPOffset<Service<'bldr>> {\n            let mut builder = ServiceBuilder::new(_fbb);\n            if let Some(x) = args.declaration_file {\n                builder.add_declaration_file(x);\n            }\n            if let Some(x) = args.documentation {\n                builder.add_documentation(x);\n            }\n            if let Some(x) = args.attributes {\n                builder.add_attributes(x);\n            }\n            if let Some(x) = args.calls {\n                builder.add_calls(x);\n            }\n            if let Some(x) = args.name {\n                builder.add_name(x);\n            }\n            builder.finish()\n        }\n\n        #[inline]\n        pub fn name(&self) -> &'a str {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab.get::<flatbuffers::ForwardsUOffset<&str>>(Service::VT_NAME, None).unwrap()\n            }\n        }\n        #[inline]\n        pub fn key_compare_less_than(&self, o: &Service) -> bool {\n            self.name() < o.name()\n        }\n\n        #[inline]\n        pub fn key_compare_with_value(&self, val: &str) -> ::core::cmp::Ordering {\n            let key = self.name();\n            key.cmp(val)\n        }\n        #[inline]\n        pub fn calls(\n            &self,\n        ) -> Option<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<RPCCall<'a>>>> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab.get::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<RPCCall>>,\n                >>(Service::VT_CALLS, None)\n            }\n        }\n        #[inline]\n        pub fn attributes(\n            &self,\n        ) -> Option<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<KeyValue<'a>>>> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab.get::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<KeyValue>>,\n                >>(Service::VT_ATTRIBUTES, None)\n            }\n        }\n        #[inline]\n        pub fn documentation(\n            &self,\n        ) -> Option<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab.get::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>,\n                >>(Service::VT_DOCUMENTATION, None)\n            }\n        }\n        /// File that this Service is declared in.\n        #[inline]\n        pub fn declaration_file(&self) -> Option<&'a str> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab\n                    .get::<flatbuffers::ForwardsUOffset<&str>>(Service::VT_DECLARATION_FILE, None)\n            }\n        }\n    }\n\n    impl flatbuffers::Verifiable for Service<'_> {\n        #[inline]\n        fn run_verifier(\n            v: &mut flatbuffers::Verifier,\n            pos: usize,\n        ) -> Result<(), flatbuffers::InvalidFlatbuffer> {\n            use self::flatbuffers::Verifiable;\n            v.visit_table(pos)?\n                .visit_field::<flatbuffers::ForwardsUOffset<&str>>(\"name\", Self::VT_NAME, true)?\n                .visit_field::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'_, flatbuffers::ForwardsUOffset<RPCCall>>,\n                >>(\"calls\", Self::VT_CALLS, false)?\n                .visit_field::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'_, flatbuffers::ForwardsUOffset<KeyValue>>,\n                >>(\"attributes\", Self::VT_ATTRIBUTES, false)?\n                .visit_field::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'_, flatbuffers::ForwardsUOffset<&'_ str>>,\n                >>(\"documentation\", Self::VT_DOCUMENTATION, false)?\n                .visit_field::<flatbuffers::ForwardsUOffset<&str>>(\n                    \"declaration_file\",\n                    Self::VT_DECLARATION_FILE,\n                    false,\n                )?\n                .finish();\n            Ok(())\n        }\n    }\n    pub struct ServiceArgs<'a> {\n        pub name: Option<flatbuffers::WIPOffset<&'a str>>,\n        pub calls: Option<\n            flatbuffers::WIPOffset<\n                flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<RPCCall<'a>>>,\n            >,\n        >,\n        pub attributes: Option<\n            flatbuffers::WIPOffset<\n                flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<KeyValue<'a>>>,\n            >,\n        >,\n        pub documentation: Option<\n            flatbuffers::WIPOffset<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>>,\n        >,\n        pub declaration_file: Option<flatbuffers::WIPOffset<&'a str>>,\n    }\n    impl<'a> Default for ServiceArgs<'a> {\n        #[inline]\n        fn default() -> Self {\n            ServiceArgs {\n                name: None, // required field\n                calls: None,\n                attributes: None,\n                documentation: None,\n                declaration_file: None,\n            }\n        }\n    }\n\n    pub struct ServiceBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> {\n        fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,\n        start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>,\n    }\n    impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> ServiceBuilder<'a, 'b, A> {\n        #[inline]\n        pub fn add_name(&mut self, name: flatbuffers::WIPOffset<&'b str>) {\n            self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Service::VT_NAME, name);\n        }\n        #[inline]\n        pub fn add_calls(\n            &mut self,\n            calls: flatbuffers::WIPOffset<\n                flatbuffers::Vector<'b, flatbuffers::ForwardsUOffset<RPCCall<'b>>>,\n            >,\n        ) {\n            self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Service::VT_CALLS, calls);\n        }\n        #[inline]\n        pub fn add_attributes(\n            &mut self,\n            attributes: flatbuffers::WIPOffset<\n                flatbuffers::Vector<'b, flatbuffers::ForwardsUOffset<KeyValue<'b>>>,\n            >,\n        ) {\n            self.fbb_\n                .push_slot_always::<flatbuffers::WIPOffset<_>>(Service::VT_ATTRIBUTES, attributes);\n        }\n        #[inline]\n        pub fn add_documentation(\n            &mut self,\n            documentation: flatbuffers::WIPOffset<\n                flatbuffers::Vector<'b, flatbuffers::ForwardsUOffset<&'b str>>,\n            >,\n        ) {\n            self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(\n                Service::VT_DOCUMENTATION,\n                documentation,\n            );\n        }\n        #[inline]\n        pub fn add_declaration_file(&mut self, declaration_file: flatbuffers::WIPOffset<&'b str>) {\n            self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(\n                Service::VT_DECLARATION_FILE,\n                declaration_file,\n            );\n        }\n        #[inline]\n        pub fn new(\n            _fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,\n        ) -> ServiceBuilder<'a, 'b, A> {\n            let start = _fbb.start_table();\n            ServiceBuilder { fbb_: _fbb, start_: start }\n        }\n        #[inline]\n        pub fn finish(self) -> flatbuffers::WIPOffset<Service<'a>> {\n            let o = self.fbb_.end_table(self.start_);\n            self.fbb_.required(o, Service::VT_NAME, \"name\");\n            flatbuffers::WIPOffset::new(o.value())\n        }\n    }\n\n    impl core::fmt::Debug for Service<'_> {\n        fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {\n            let mut ds = f.debug_struct(\"Service\");\n            ds.field(\"name\", &self.name());\n            ds.field(\"calls\", &self.calls());\n            ds.field(\"attributes\", &self.attributes());\n            ds.field(\"documentation\", &self.documentation());\n            ds.field(\"declaration_file\", &self.declaration_file());\n            ds.finish()\n        }\n    }\n    pub enum SchemaFileOffset {}\n    #[derive(Copy, Clone, PartialEq)]\n\n    /// File specific information.\n    /// Symbols declared within a file may be recovered by iterating over all\n    /// symbols and examining the `declaration_file` field.\n    pub struct SchemaFile<'a> {\n        pub _tab: flatbuffers::Table<'a>,\n    }\n\n    impl<'a> flatbuffers::Follow<'a> for SchemaFile<'a> {\n        type Inner = SchemaFile<'a>;\n        #[inline]\n        unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n            Self { _tab: flatbuffers::Table::new(buf, loc) }\n        }\n    }\n\n    impl<'a> SchemaFile<'a> {\n        pub const VT_FILENAME: flatbuffers::VOffsetT = 4;\n        pub const VT_INCLUDED_FILENAMES: flatbuffers::VOffsetT = 6;\n\n        #[inline]\n        pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self {\n            SchemaFile { _tab: table }\n        }\n        #[allow(unused_mut)]\n        pub fn create<\n            'bldr: 'args,\n            'args: 'mut_bldr,\n            'mut_bldr,\n            A: flatbuffers::Allocator + 'bldr,\n        >(\n            _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>,\n            args: &'args SchemaFileArgs<'args>,\n        ) -> flatbuffers::WIPOffset<SchemaFile<'bldr>> {\n            let mut builder = SchemaFileBuilder::new(_fbb);\n            if let Some(x) = args.included_filenames {\n                builder.add_included_filenames(x);\n            }\n            if let Some(x) = args.filename {\n                builder.add_filename(x);\n            }\n            builder.finish()\n        }\n\n        /// Filename, relative to project root.\n        #[inline]\n        pub fn filename(&self) -> &'a str {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab\n                    .get::<flatbuffers::ForwardsUOffset<&str>>(SchemaFile::VT_FILENAME, None)\n                    .unwrap()\n            }\n        }\n        #[inline]\n        pub fn key_compare_less_than(&self, o: &SchemaFile) -> bool {\n            self.filename() < o.filename()\n        }\n\n        #[inline]\n        pub fn key_compare_with_value(&self, val: &str) -> ::core::cmp::Ordering {\n            let key = self.filename();\n            key.cmp(val)\n        }\n        /// Names of included files, relative to project root.\n        #[inline]\n        pub fn included_filenames(\n            &self,\n        ) -> Option<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab.get::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>,\n                >>(SchemaFile::VT_INCLUDED_FILENAMES, None)\n            }\n        }\n    }\n\n    impl flatbuffers::Verifiable for SchemaFile<'_> {\n        #[inline]\n        fn run_verifier(\n            v: &mut flatbuffers::Verifier,\n            pos: usize,\n        ) -> Result<(), flatbuffers::InvalidFlatbuffer> {\n            use self::flatbuffers::Verifiable;\n            v.visit_table(pos)?\n                .visit_field::<flatbuffers::ForwardsUOffset<&str>>(\n                    \"filename\",\n                    Self::VT_FILENAME,\n                    true,\n                )?\n                .visit_field::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'_, flatbuffers::ForwardsUOffset<&'_ str>>,\n                >>(\"included_filenames\", Self::VT_INCLUDED_FILENAMES, false)?\n                .finish();\n            Ok(())\n        }\n    }\n    pub struct SchemaFileArgs<'a> {\n        pub filename: Option<flatbuffers::WIPOffset<&'a str>>,\n        pub included_filenames: Option<\n            flatbuffers::WIPOffset<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>>,\n        >,\n    }\n    impl<'a> Default for SchemaFileArgs<'a> {\n        #[inline]\n        fn default() -> Self {\n            SchemaFileArgs {\n                filename: None, // required field\n                included_filenames: None,\n            }\n        }\n    }\n\n    pub struct SchemaFileBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> {\n        fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,\n        start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>,\n    }\n    impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> SchemaFileBuilder<'a, 'b, A> {\n        #[inline]\n        pub fn add_filename(&mut self, filename: flatbuffers::WIPOffset<&'b str>) {\n            self.fbb_\n                .push_slot_always::<flatbuffers::WIPOffset<_>>(SchemaFile::VT_FILENAME, filename);\n        }\n        #[inline]\n        pub fn add_included_filenames(\n            &mut self,\n            included_filenames: flatbuffers::WIPOffset<\n                flatbuffers::Vector<'b, flatbuffers::ForwardsUOffset<&'b str>>,\n            >,\n        ) {\n            self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(\n                SchemaFile::VT_INCLUDED_FILENAMES,\n                included_filenames,\n            );\n        }\n        #[inline]\n        pub fn new(\n            _fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,\n        ) -> SchemaFileBuilder<'a, 'b, A> {\n            let start = _fbb.start_table();\n            SchemaFileBuilder { fbb_: _fbb, start_: start }\n        }\n        #[inline]\n        pub fn finish(self) -> flatbuffers::WIPOffset<SchemaFile<'a>> {\n            let o = self.fbb_.end_table(self.start_);\n            self.fbb_.required(o, SchemaFile::VT_FILENAME, \"filename\");\n            flatbuffers::WIPOffset::new(o.value())\n        }\n    }\n\n    impl core::fmt::Debug for SchemaFile<'_> {\n        fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {\n            let mut ds = f.debug_struct(\"SchemaFile\");\n            ds.field(\"filename\", &self.filename());\n            ds.field(\"included_filenames\", &self.included_filenames());\n            ds.finish()\n        }\n    }\n    pub enum SchemaOffset {}\n    #[derive(Copy, Clone, PartialEq)]\n\n    pub struct Schema<'a> {\n        pub _tab: flatbuffers::Table<'a>,\n    }\n\n    impl<'a> flatbuffers::Follow<'a> for Schema<'a> {\n        type Inner = Schema<'a>;\n        #[inline]\n        unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n            Self { _tab: flatbuffers::Table::new(buf, loc) }\n        }\n    }\n\n    impl<'a> Schema<'a> {\n        pub const VT_OBJECTS: flatbuffers::VOffsetT = 4;\n        pub const VT_ENUMS: flatbuffers::VOffsetT = 6;\n        pub const VT_FILE_IDENT: flatbuffers::VOffsetT = 8;\n        pub const VT_FILE_EXT: flatbuffers::VOffsetT = 10;\n        pub const VT_ROOT_TABLE: flatbuffers::VOffsetT = 12;\n        pub const VT_SERVICES: flatbuffers::VOffsetT = 14;\n        pub const VT_ADVANCED_FEATURES: flatbuffers::VOffsetT = 16;\n        pub const VT_FBS_FILES: flatbuffers::VOffsetT = 18;\n\n        #[inline]\n        pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self {\n            Schema { _tab: table }\n        }\n        #[allow(unused_mut)]\n        pub fn create<\n            'bldr: 'args,\n            'args: 'mut_bldr,\n            'mut_bldr,\n            A: flatbuffers::Allocator + 'bldr,\n        >(\n            _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>,\n            args: &'args SchemaArgs<'args>,\n        ) -> flatbuffers::WIPOffset<Schema<'bldr>> {\n            let mut builder = SchemaBuilder::new(_fbb);\n            builder.add_advanced_features(args.advanced_features);\n            if let Some(x) = args.fbs_files {\n                builder.add_fbs_files(x);\n            }\n            if let Some(x) = args.services {\n                builder.add_services(x);\n            }\n            if let Some(x) = args.root_table {\n                builder.add_root_table(x);\n            }\n            if let Some(x) = args.file_ext {\n                builder.add_file_ext(x);\n            }\n            if let Some(x) = args.file_ident {\n                builder.add_file_ident(x);\n            }\n            if let Some(x) = args.enums {\n                builder.add_enums(x);\n            }\n            if let Some(x) = args.objects {\n                builder.add_objects(x);\n            }\n            builder.finish()\n        }\n\n        #[inline]\n        pub fn objects(&self) -> flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<Object<'a>>> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab\n                    .get::<flatbuffers::ForwardsUOffset<\n                        flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<Object>>,\n                    >>(Schema::VT_OBJECTS, None)\n                    .unwrap()\n            }\n        }\n        #[inline]\n        pub fn enums(&self) -> flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<Enum<'a>>> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab\n                    .get::<flatbuffers::ForwardsUOffset<\n                        flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<Enum>>,\n                    >>(Schema::VT_ENUMS, None)\n                    .unwrap()\n            }\n        }\n        #[inline]\n        pub fn file_ident(&self) -> Option<&'a str> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab.get::<flatbuffers::ForwardsUOffset<&str>>(Schema::VT_FILE_IDENT, None)\n            }\n        }\n        #[inline]\n        pub fn file_ext(&self) -> Option<&'a str> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab.get::<flatbuffers::ForwardsUOffset<&str>>(Schema::VT_FILE_EXT, None)\n            }\n        }\n        #[inline]\n        pub fn root_table(&self) -> Option<Object<'a>> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab.get::<flatbuffers::ForwardsUOffset<Object>>(Schema::VT_ROOT_TABLE, None)\n            }\n        }\n        #[inline]\n        pub fn services(\n            &self,\n        ) -> Option<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<Service<'a>>>> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab.get::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<Service>>,\n                >>(Schema::VT_SERVICES, None)\n            }\n        }\n        #[inline]\n        pub fn advanced_features(&self) -> AdvancedFeatures {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab\n                    .get::<AdvancedFeatures>(Schema::VT_ADVANCED_FEATURES, Some(Default::default()))\n                    .unwrap()\n            }\n        }\n        /// All the files used in this compilation. Files are relative to where\n        /// flatc was invoked.\n        #[inline]\n        pub fn fbs_files(\n            &self,\n        ) -> Option<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<SchemaFile<'a>>>> {\n            // Safety:\n            // Created from valid Table for this object\n            // which contains a valid value in this slot\n            unsafe {\n                self._tab.get::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<SchemaFile>>,\n                >>(Schema::VT_FBS_FILES, None)\n            }\n        }\n    }\n\n    impl flatbuffers::Verifiable for Schema<'_> {\n        #[inline]\n        fn run_verifier(\n            v: &mut flatbuffers::Verifier,\n            pos: usize,\n        ) -> Result<(), flatbuffers::InvalidFlatbuffer> {\n            use self::flatbuffers::Verifiable;\n            v.visit_table(pos)?\n                .visit_field::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'_, flatbuffers::ForwardsUOffset<Object>>,\n                >>(\"objects\", Self::VT_OBJECTS, true)?\n                .visit_field::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'_, flatbuffers::ForwardsUOffset<Enum>>,\n                >>(\"enums\", Self::VT_ENUMS, true)?\n                .visit_field::<flatbuffers::ForwardsUOffset<&str>>(\n                    \"file_ident\",\n                    Self::VT_FILE_IDENT,\n                    false,\n                )?\n                .visit_field::<flatbuffers::ForwardsUOffset<&str>>(\n                    \"file_ext\",\n                    Self::VT_FILE_EXT,\n                    false,\n                )?\n                .visit_field::<flatbuffers::ForwardsUOffset<Object>>(\n                    \"root_table\",\n                    Self::VT_ROOT_TABLE,\n                    false,\n                )?\n                .visit_field::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'_, flatbuffers::ForwardsUOffset<Service>>,\n                >>(\"services\", Self::VT_SERVICES, false)?\n                .visit_field::<AdvancedFeatures>(\n                    \"advanced_features\",\n                    Self::VT_ADVANCED_FEATURES,\n                    false,\n                )?\n                .visit_field::<flatbuffers::ForwardsUOffset<\n                    flatbuffers::Vector<'_, flatbuffers::ForwardsUOffset<SchemaFile>>,\n                >>(\"fbs_files\", Self::VT_FBS_FILES, false)?\n                .finish();\n            Ok(())\n        }\n    }\n    pub struct SchemaArgs<'a> {\n        pub objects: Option<\n            flatbuffers::WIPOffset<\n                flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<Object<'a>>>,\n            >,\n        >,\n        pub enums: Option<\n            flatbuffers::WIPOffset<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<Enum<'a>>>>,\n        >,\n        pub file_ident: Option<flatbuffers::WIPOffset<&'a str>>,\n        pub file_ext: Option<flatbuffers::WIPOffset<&'a str>>,\n        pub root_table: Option<flatbuffers::WIPOffset<Object<'a>>>,\n        pub services: Option<\n            flatbuffers::WIPOffset<\n                flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<Service<'a>>>,\n            >,\n        >,\n        pub advanced_features: AdvancedFeatures,\n        pub fbs_files: Option<\n            flatbuffers::WIPOffset<\n                flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<SchemaFile<'a>>>,\n            >,\n        >,\n    }\n    impl<'a> Default for SchemaArgs<'a> {\n        #[inline]\n        fn default() -> Self {\n            SchemaArgs {\n                objects: None, // required field\n                enums: None,   // required field\n                file_ident: None,\n                file_ext: None,\n                root_table: None,\n                services: None,\n                advanced_features: Default::default(),\n                fbs_files: None,\n            }\n        }\n    }\n\n    pub struct SchemaBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> {\n        fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,\n        start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>,\n    }\n    impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> SchemaBuilder<'a, 'b, A> {\n        #[inline]\n        pub fn add_objects(\n            &mut self,\n            objects: flatbuffers::WIPOffset<\n                flatbuffers::Vector<'b, flatbuffers::ForwardsUOffset<Object<'b>>>,\n            >,\n        ) {\n            self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Schema::VT_OBJECTS, objects);\n        }\n        #[inline]\n        pub fn add_enums(\n            &mut self,\n            enums: flatbuffers::WIPOffset<\n                flatbuffers::Vector<'b, flatbuffers::ForwardsUOffset<Enum<'b>>>,\n            >,\n        ) {\n            self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Schema::VT_ENUMS, enums);\n        }\n        #[inline]\n        pub fn add_file_ident(&mut self, file_ident: flatbuffers::WIPOffset<&'b str>) {\n            self.fbb_\n                .push_slot_always::<flatbuffers::WIPOffset<_>>(Schema::VT_FILE_IDENT, file_ident);\n        }\n        #[inline]\n        pub fn add_file_ext(&mut self, file_ext: flatbuffers::WIPOffset<&'b str>) {\n            self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Schema::VT_FILE_EXT, file_ext);\n        }\n        #[inline]\n        pub fn add_root_table(&mut self, root_table: flatbuffers::WIPOffset<Object<'b>>) {\n            self.fbb_.push_slot_always::<flatbuffers::WIPOffset<Object>>(\n                Schema::VT_ROOT_TABLE,\n                root_table,\n            );\n        }\n        #[inline]\n        pub fn add_services(\n            &mut self,\n            services: flatbuffers::WIPOffset<\n                flatbuffers::Vector<'b, flatbuffers::ForwardsUOffset<Service<'b>>>,\n            >,\n        ) {\n            self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Schema::VT_SERVICES, services);\n        }\n        #[inline]\n        pub fn add_advanced_features(&mut self, advanced_features: AdvancedFeatures) {\n            self.fbb_.push_slot::<AdvancedFeatures>(\n                Schema::VT_ADVANCED_FEATURES,\n                advanced_features,\n                Default::default(),\n            );\n        }\n        #[inline]\n        pub fn add_fbs_files(\n            &mut self,\n            fbs_files: flatbuffers::WIPOffset<\n                flatbuffers::Vector<'b, flatbuffers::ForwardsUOffset<SchemaFile<'b>>>,\n            >,\n        ) {\n            self.fbb_\n                .push_slot_always::<flatbuffers::WIPOffset<_>>(Schema::VT_FBS_FILES, fbs_files);\n        }\n        #[inline]\n        pub fn new(\n            _fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,\n        ) -> SchemaBuilder<'a, 'b, A> {\n            let start = _fbb.start_table();\n            SchemaBuilder { fbb_: _fbb, start_: start }\n        }\n        #[inline]\n        pub fn finish(self) -> flatbuffers::WIPOffset<Schema<'a>> {\n            let o = self.fbb_.end_table(self.start_);\n            self.fbb_.required(o, Schema::VT_OBJECTS, \"objects\");\n            self.fbb_.required(o, Schema::VT_ENUMS, \"enums\");\n            flatbuffers::WIPOffset::new(o.value())\n        }\n    }\n\n    impl core::fmt::Debug for Schema<'_> {\n        fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {\n            let mut ds = f.debug_struct(\"Schema\");\n            ds.field(\"objects\", &self.objects());\n            ds.field(\"enums\", &self.enums());\n            ds.field(\"file_ident\", &self.file_ident());\n            ds.field(\"file_ext\", &self.file_ext());\n            ds.field(\"root_table\", &self.root_table());\n            ds.field(\"services\", &self.services());\n            ds.field(\"advanced_features\", &self.advanced_features());\n            ds.field(\"fbs_files\", &self.fbs_files());\n            ds.finish()\n        }\n    }\n    #[inline]\n    /// Verifies that a buffer of bytes contains a `Schema`\n    /// and returns it.\n    /// Note that verification is still experimental and may not\n    /// catch every error, or be maximally performant. For the\n    /// previous, unchecked, behavior use\n    /// `root_as_schema_unchecked`.\n    pub fn root_as_schema(buf: &[u8]) -> Result<Schema, flatbuffers::InvalidFlatbuffer> {\n        flatbuffers::root::<Schema>(buf)\n    }\n    #[inline]\n    /// Verifies that a buffer of bytes contains a size prefixed\n    /// `Schema` and returns it.\n    /// Note that verification is still experimental and may not\n    /// catch every error, or be maximally performant. For the\n    /// previous, unchecked, behavior use\n    /// `size_prefixed_root_as_schema_unchecked`.\n    pub fn size_prefixed_root_as_schema(\n        buf: &[u8],\n    ) -> Result<Schema, flatbuffers::InvalidFlatbuffer> {\n        flatbuffers::size_prefixed_root::<Schema>(buf)\n    }\n    #[inline]\n    /// Verifies, with the given options, that a buffer of bytes\n    /// contains a `Schema` and returns it.\n    /// Note that verification is still experimental and may not\n    /// catch every error, or be maximally performant. For the\n    /// previous, unchecked, behavior use\n    /// `root_as_schema_unchecked`.\n    pub fn root_as_schema_with_opts<'b, 'o>(\n        opts: &'o flatbuffers::VerifierOptions,\n        buf: &'b [u8],\n    ) -> Result<Schema<'b>, flatbuffers::InvalidFlatbuffer> {\n        flatbuffers::root_with_opts::<Schema<'b>>(opts, buf)\n    }\n    #[inline]\n    /// Verifies, with the given verifier options, that a buffer of\n    /// bytes contains a size prefixed `Schema` and returns\n    /// it. Note that verification is still experimental and may not\n    /// catch every error, or be maximally performant. For the\n    /// previous, unchecked, behavior use\n    /// `root_as_schema_unchecked`.\n    pub fn size_prefixed_root_as_schema_with_opts<'b, 'o>(\n        opts: &'o flatbuffers::VerifierOptions,\n        buf: &'b [u8],\n    ) -> Result<Schema<'b>, flatbuffers::InvalidFlatbuffer> {\n        flatbuffers::size_prefixed_root_with_opts::<Schema<'b>>(opts, buf)\n    }\n    #[inline]\n    /// Assumes, without verification, that a buffer of bytes contains a Schema and returns it.\n    /// # Safety\n    /// Callers must trust the given bytes do indeed contain a valid `Schema`.\n    pub unsafe fn root_as_schema_unchecked(buf: &[u8]) -> Schema {\n        flatbuffers::root_unchecked::<Schema>(buf)\n    }\n    #[inline]\n    /// Assumes, without verification, that a buffer of bytes contains a size prefixed Schema and returns it.\n    /// # Safety\n    /// Callers must trust the given bytes do indeed contain a valid size prefixed `Schema`.\n    pub unsafe fn size_prefixed_root_as_schema_unchecked(buf: &[u8]) -> Schema {\n        flatbuffers::size_prefixed_root_unchecked::<Schema>(buf)\n    }\n    pub const SCHEMA_IDENTIFIER: &str = \"BFBS\";\n\n    #[inline]\n    pub fn schema_buffer_has_identifier(buf: &[u8]) -> bool {\n        flatbuffers::buffer_has_identifier(buf, SCHEMA_IDENTIFIER, false)\n    }\n\n    #[inline]\n    pub fn schema_size_prefixed_buffer_has_identifier(buf: &[u8]) -> bool {\n        flatbuffers::buffer_has_identifier(buf, SCHEMA_IDENTIFIER, true)\n    }\n\n    pub const SCHEMA_EXTENSION: &str = \"bfbs\";\n\n    #[inline]\n    pub fn finish_schema_buffer<'a, 'b, A: flatbuffers::Allocator + 'a>(\n        fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,\n        root: flatbuffers::WIPOffset<Schema<'a>>,\n    ) {\n        fbb.finish(root, Some(SCHEMA_IDENTIFIER));\n    }\n\n    #[inline]\n    pub fn finish_size_prefixed_schema_buffer<'a, 'b, A: flatbuffers::Allocator + 'a>(\n        fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,\n        root: flatbuffers::WIPOffset<Schema<'a>>,\n    ) {\n        fbb.finish_size_prefixed(root, Some(SCHEMA_IDENTIFIER));\n    }\n} // pub mod reflection\n"
  },
  {
    "path": "rust/reflection/src/reflection_verifier.rs",
    "content": "/*\n * Copyright 2018 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nuse crate::reflection_generated::reflection::{BaseType, Field, Object, Schema};\nuse crate::{FlatbufferError, FlatbufferResult};\nuse flatbuffers::{\n    ForwardsUOffset, InvalidFlatbuffer, TableVerifier, UOffsetT, Vector, Verifiable, Verifier,\n    VerifierOptions, SIZE_UOFFSET, SIZE_VOFFSET,\n};\nuse std::collections::HashMap;\n\n/// Verifies a buffer against its schema with custom verification options.\npub fn verify_with_options(\n    buffer: &[u8],\n    schema: &Schema,\n    opts: &VerifierOptions,\n    buf_loc_to_obj_idx: &mut HashMap<usize, i32>,\n) -> FlatbufferResult<()> {\n    let mut verifier = Verifier::new(opts, buffer);\n    if let Some(table_object) = schema.root_table() {\n        if let core::result::Result::Ok(table_pos) = verifier.get_uoffset(0) {\n            // Inserts -1 as object index for root table\n            buf_loc_to_obj_idx.insert(table_pos.try_into()?, -1);\n            let mut verified = vec![false; buffer.len()];\n            return verify_table(\n                &mut verifier,\n                &table_object,\n                table_pos.try_into()?,\n                schema,\n                &mut verified,\n                buf_loc_to_obj_idx,\n            );\n        }\n    }\n    Err(FlatbufferError::InvalidSchema)\n}\n\nfn verify_table(\n    verifier: &mut Verifier,\n    table_object: &Object,\n    table_pos: usize,\n    schema: &Schema,\n    verified: &mut [bool],\n    buf_loc_to_obj_idx: &mut HashMap<usize, i32>,\n) -> FlatbufferResult<()> {\n    if table_pos < verified.len() && verified[table_pos] {\n        return Ok(());\n    }\n\n    let mut table_verifier = verifier.visit_table(table_pos)?;\n\n    for field in &table_object.fields() {\n        let field_name = field.name().to_owned();\n        table_verifier = match field.type_().base_type() {\n            BaseType::UType | BaseType::UByte => {\n                table_verifier.visit_field::<u8>(field_name, field.offset(), field.required())?\n            }\n            BaseType::Bool => {\n                table_verifier.visit_field::<bool>(field_name, field.offset(), field.required())?\n            }\n            BaseType::Byte => {\n                table_verifier.visit_field::<i8>(field_name, field.offset(), field.required())?\n            }\n            BaseType::Short => {\n                table_verifier.visit_field::<i16>(field_name, field.offset(), field.required())?\n            }\n            BaseType::UShort => {\n                table_verifier.visit_field::<u16>(field_name, field.offset(), field.required())?\n            }\n            BaseType::Int => {\n                table_verifier.visit_field::<i32>(field_name, field.offset(), field.required())?\n            }\n            BaseType::UInt => {\n                table_verifier.visit_field::<u32>(field_name, field.offset(), field.required())?\n            }\n            BaseType::Long => {\n                table_verifier.visit_field::<i64>(field_name, field.offset(), field.required())?\n            }\n            BaseType::ULong => {\n                table_verifier.visit_field::<u64>(field_name, field.offset(), field.required())?\n            }\n            BaseType::Float => {\n                table_verifier.visit_field::<f32>(field_name, field.offset(), field.required())?\n            }\n            BaseType::Double => {\n                table_verifier.visit_field::<f64>(field_name, field.offset(), field.required())?\n            }\n            BaseType::String => table_verifier.visit_field::<ForwardsUOffset<&str>>(\n                field_name,\n                field.offset(),\n                field.required(),\n            )?,\n            BaseType::Vector => {\n                verify_vector(table_verifier, &field, schema, verified, buf_loc_to_obj_idx)?\n            }\n            BaseType::Obj => {\n                if let Some(field_pos) = table_verifier.deref(field.offset())? {\n                    let object_index = field.type_().index();\n                    let child_obj = schema.objects().get(object_index.try_into()?);\n                    if child_obj.is_struct() {\n                        buf_loc_to_obj_idx.insert(field_pos, object_index);\n                        verify_struct(\n                            table_verifier.verifier(),\n                            &child_obj,\n                            field_pos,\n                            schema,\n                            buf_loc_to_obj_idx,\n                        )?\n                    } else {\n                        let field_value = table_verifier.verifier().get_uoffset(field_pos)?;\n                        let table_pos = field_pos.saturating_add(field_value.try_into()?);\n                        buf_loc_to_obj_idx.insert(table_pos, object_index);\n                        verify_table(\n                            table_verifier.verifier(),\n                            &child_obj,\n                            table_pos,\n                            schema,\n                            verified,\n                            buf_loc_to_obj_idx,\n                        )?;\n                    }\n                } else if field.required() {\n                    return InvalidFlatbuffer::new_missing_required(field.name().to_string())?;\n                }\n                table_verifier\n            }\n            BaseType::Union => {\n                if let Some(field_pos) = table_verifier.deref(field.offset())? {\n                    let field_value = table_verifier.verifier().get_uoffset(field_pos)?;\n                    verify_union(\n                        table_verifier,\n                        &field,\n                        field_pos.saturating_add(field_value.try_into()?),\n                        schema,\n                        verified,\n                        buf_loc_to_obj_idx,\n                    )?\n                } else if field.required() {\n                    return InvalidFlatbuffer::new_missing_required(field.name().to_string())?;\n                } else {\n                    table_verifier\n                }\n            }\n            _ => {\n                return Err(FlatbufferError::TypeNotSupported(\n                    field.type_().base_type().variant_name().unwrap_or_default().to_string(),\n                ));\n            }\n        };\n    }\n\n    table_verifier.finish();\n    verified[table_pos] = true;\n    Ok(())\n}\n\nfn verify_struct(\n    verifier: &mut Verifier,\n    struct_object: &Object,\n    struct_pos: usize,\n    schema: &Schema,\n    buf_loc_to_obj_idx: &mut HashMap<usize, i32>,\n) -> FlatbufferResult<()> {\n    verifier.range_in_buffer(struct_pos, struct_object.bytesize().try_into()?)?;\n    for field in &struct_object.fields() {\n        if field.type_().base_type() == BaseType::Obj {\n            let obj_idx = field.type_().index();\n            let child_obj = schema.objects().get(obj_idx.try_into()?);\n            if child_obj.is_struct() {\n                let field_pos = struct_pos.saturating_add(field.offset().into());\n                buf_loc_to_obj_idx.insert(field_pos, obj_idx);\n                verify_struct(verifier, &child_obj, field_pos, schema, buf_loc_to_obj_idx)?;\n            }\n        }\n    }\n    Ok(())\n}\n\nfn verify_vector<'a, 'b, 'c>(\n    mut table_verifier: TableVerifier<'a, 'b, 'c>,\n    field: &Field,\n    schema: &Schema,\n    verified: &mut [bool],\n    buf_loc_to_obj_idx: &mut HashMap<usize, i32>,\n) -> FlatbufferResult<TableVerifier<'a, 'b, 'c>> {\n    let field_name = field.name().to_owned();\n    match field.type_().element() {\n        BaseType::UType | BaseType::UByte => table_verifier\n            .visit_field::<ForwardsUOffset<Vector<u8>>>(\n                field_name,\n                field.offset(),\n                field.required(),\n            )\n            .map_err(FlatbufferError::VerificationError),\n        BaseType::Bool => table_verifier\n            .visit_field::<ForwardsUOffset<Vector<bool>>>(\n                field_name,\n                field.offset(),\n                field.required(),\n            )\n            .map_err(FlatbufferError::VerificationError),\n        BaseType::Byte => table_verifier\n            .visit_field::<ForwardsUOffset<Vector<i8>>>(\n                field_name,\n                field.offset(),\n                field.required(),\n            )\n            .map_err(FlatbufferError::VerificationError),\n        BaseType::Short => table_verifier\n            .visit_field::<ForwardsUOffset<Vector<i16>>>(\n                field_name,\n                field.offset(),\n                field.required(),\n            )\n            .map_err(FlatbufferError::VerificationError),\n        BaseType::UShort => table_verifier\n            .visit_field::<ForwardsUOffset<Vector<u16>>>(\n                field_name,\n                field.offset(),\n                field.required(),\n            )\n            .map_err(FlatbufferError::VerificationError),\n        BaseType::Int => table_verifier\n            .visit_field::<ForwardsUOffset<Vector<i32>>>(\n                field_name,\n                field.offset(),\n                field.required(),\n            )\n            .map_err(FlatbufferError::VerificationError),\n        BaseType::UInt => table_verifier\n            .visit_field::<ForwardsUOffset<Vector<u32>>>(\n                field_name,\n                field.offset(),\n                field.required(),\n            )\n            .map_err(FlatbufferError::VerificationError),\n        BaseType::Long => table_verifier\n            .visit_field::<ForwardsUOffset<Vector<i64>>>(\n                field_name,\n                field.offset(),\n                field.required(),\n            )\n            .map_err(FlatbufferError::VerificationError),\n        BaseType::ULong => table_verifier\n            .visit_field::<ForwardsUOffset<Vector<u64>>>(\n                field_name,\n                field.offset(),\n                field.required(),\n            )\n            .map_err(FlatbufferError::VerificationError),\n        BaseType::Float => table_verifier\n            .visit_field::<ForwardsUOffset<Vector<f32>>>(\n                field_name,\n                field.offset(),\n                field.required(),\n            )\n            .map_err(FlatbufferError::VerificationError),\n        BaseType::Double => table_verifier\n            .visit_field::<ForwardsUOffset<Vector<f64>>>(\n                field_name,\n                field.offset(),\n                field.required(),\n            )\n            .map_err(FlatbufferError::VerificationError),\n        BaseType::String => table_verifier\n            .visit_field::<ForwardsUOffset<Vector<ForwardsUOffset<&str>>>>(\n                field_name,\n                field.offset(),\n                field.required(),\n            )\n            .map_err(FlatbufferError::VerificationError),\n        BaseType::Obj => {\n            if let Some(field_pos) = table_verifier.deref(field.offset())? {\n                let verifier = table_verifier.verifier();\n                let vector_offset = verifier.get_uoffset(field_pos)?;\n                let vector_pos = field_pos.saturating_add(vector_offset.try_into()?);\n                let vector_len = verifier.get_uoffset(vector_pos)?;\n                let vector_start = vector_pos.saturating_add(SIZE_UOFFSET);\n                let child_obj_idx = field.type_().index();\n                let child_obj = schema.objects().get(child_obj_idx.try_into()?);\n                if child_obj.is_struct() {\n                    let vector_size = vector_len.saturating_mul(child_obj.bytesize().try_into()?);\n                    verifier.range_in_buffer(vector_start, vector_size.try_into()?)?;\n                    let vector_range = core::ops::Range {\n                        start: vector_start,\n                        end: vector_start.saturating_add(vector_size.try_into()?),\n                    };\n                    for struct_pos in vector_range.step_by(child_obj.bytesize().try_into()?) {\n                        buf_loc_to_obj_idx.insert(struct_pos, child_obj_idx);\n                        verify_struct(\n                            verifier,\n                            &child_obj,\n                            struct_pos,\n                            schema,\n                            buf_loc_to_obj_idx,\n                        )?;\n                    }\n                } else {\n                    verifier.is_aligned::<UOffsetT>(vector_start)?;\n                    let vector_size = vector_len.saturating_mul(SIZE_UOFFSET.try_into()?);\n                    verifier.range_in_buffer(vector_start, vector_size.try_into()?)?;\n                    let vector_range = core::ops::Range {\n                        start: vector_start,\n                        end: vector_start.saturating_add(vector_size.try_into()?),\n                    };\n                    for element_pos in vector_range.step_by(SIZE_UOFFSET) {\n                        let table_pos = element_pos\n                            .saturating_add(verifier.get_uoffset(element_pos)?.try_into()?);\n                        buf_loc_to_obj_idx.insert(table_pos, child_obj_idx);\n                        verify_table(\n                            verifier,\n                            &child_obj,\n                            table_pos,\n                            schema,\n                            verified,\n                            buf_loc_to_obj_idx,\n                        )?;\n                    }\n                }\n            } else if field.required() {\n                return InvalidFlatbuffer::new_missing_required(field.name().to_string())?;\n            }\n            Ok(table_verifier)\n        }\n        _ => {\n            return Err(FlatbufferError::TypeNotSupported(\n                field.type_().base_type().variant_name().unwrap_or_default().to_string(),\n            ))\n        }\n    }\n}\n\nfn verify_union<'a, 'b, 'c>(\n    mut table_verifier: TableVerifier<'a, 'b, 'c>,\n    field: &Field,\n    union_pos: usize,\n    schema: &Schema,\n    verified: &mut [bool],\n    buf_loc_to_obj_idx: &mut HashMap<usize, i32>,\n) -> FlatbufferResult<TableVerifier<'a, 'b, 'c>> {\n    let union_enum = schema.enums().get(field.type_().index().try_into()?);\n    if union_enum.values().is_empty() {\n        return Err(FlatbufferError::InvalidUnionEnum);\n    }\n\n    let enum_offset = field.offset() - u16::try_from(SIZE_VOFFSET)?;\n    if let Some(enum_pos) = table_verifier.deref(enum_offset)? {\n        let enum_value = table_verifier.verifier().get_u8(enum_pos)?;\n        let enum_type = union_enum\n            .values()\n            .get(enum_value.into())\n            .union_type()\n            .ok_or(FlatbufferError::InvalidUnionEnum)?;\n\n        match enum_type.base_type() {\n            BaseType::String => <&str>::run_verifier(table_verifier.verifier(), union_pos)?,\n            BaseType::Obj => {\n                let child_obj = schema.objects().get(enum_type.index().try_into()?);\n                buf_loc_to_obj_idx.insert(union_pos, enum_type.index());\n                if child_obj.is_struct() {\n                    verify_struct(\n                        table_verifier.verifier(),\n                        &child_obj,\n                        union_pos,\n                        schema,\n                        buf_loc_to_obj_idx,\n                    )?\n                } else {\n                    verify_table(\n                        table_verifier.verifier(),\n                        &child_obj,\n                        union_pos,\n                        schema,\n                        verified,\n                        buf_loc_to_obj_idx,\n                    )?;\n                }\n            }\n            _ => {\n                return Err(FlatbufferError::TypeNotSupported(\n                    enum_type.base_type().variant_name().unwrap_or_default().to_string(),\n                ))\n            }\n        }\n    } else {\n        return InvalidFlatbuffer::new_inconsistent_union(\n            format!(\"{}_type\", field.name()),\n            field.name().to_string(),\n        )?;\n    }\n\n    verified[union_pos] = true;\n    Ok(table_verifier)\n}\n"
  },
  {
    "path": "rust/reflection/src/safe_buffer.rs",
    "content": "/*\n * Copyright 2025 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nuse crate::r#struct::Struct;\nuse crate::reflection_generated::reflection::{Field, Schema};\nuse crate::reflection_verifier::verify_with_options;\nuse crate::{\n    get_any_field_float, get_any_field_float_in_struct, get_any_field_integer,\n    get_any_field_integer_in_struct, get_any_field_string, get_any_field_string_in_struct,\n    get_any_root, get_field_float, get_field_integer, get_field_string, get_field_struct,\n    get_field_struct_in_struct, get_field_table, get_field_vector, FlatbufferError,\n    FlatbufferResult, ForwardsUOffset,\n};\nuse flatbuffers::{Follow, Table, Vector, VerifierOptions};\nuse num_traits::float::Float;\nuse num_traits::int::PrimInt;\nuse num_traits::FromPrimitive;\nuse std::collections::HashMap;\n\n#[derive(Debug)]\npub struct SafeBuffer<'a> {\n    buf: &'a [u8],\n    schema: &'a Schema<'a>,\n    buf_loc_to_obj_idx: HashMap<usize, i32>,\n}\n\nimpl<'a> SafeBuffer<'a> {\n    pub fn new(buf: &'a [u8], schema: &'a Schema) -> FlatbufferResult<Self> {\n        Self::new_with_options(buf, schema, &VerifierOptions::default())\n    }\n\n    pub fn new_with_options(\n        buf: &'a [u8],\n        schema: &'a Schema,\n        opts: &VerifierOptions,\n    ) -> FlatbufferResult<Self> {\n        let mut buf_loc_to_obj_idx = HashMap::new();\n        verify_with_options(&buf, schema, opts, &mut buf_loc_to_obj_idx)?;\n        Ok(SafeBuffer { buf, schema, buf_loc_to_obj_idx })\n    }\n\n    /// Gets the root table in the buffer.\n    pub fn get_root(&self) -> SafeTable {\n        // SAFETY: the buffer was verified during construction.\n        let table = unsafe { get_any_root(self.buf) };\n\n        SafeTable { safe_buf: self, loc: table.loc() }\n    }\n\n    fn find_field_by_name(\n        &self,\n        buf_loc: usize,\n        field_name: &str,\n    ) -> FlatbufferResult<Option<Field>> {\n        Ok(self\n            .get_all_fields(buf_loc)?\n            .lookup_by_key(field_name, |field: &Field<'_>, key| field.key_compare_with_value(key)))\n    }\n\n    fn get_all_fields(&self, buf_loc: usize) -> FlatbufferResult<Vector<ForwardsUOffset<Field>>> {\n        if let Some(&obj_idx) = self.buf_loc_to_obj_idx.get(&buf_loc) {\n            let obj = if obj_idx == -1 {\n                self.schema.root_table().unwrap()\n            } else {\n                self.schema.objects().get(obj_idx.try_into()?)\n            };\n            Ok(obj.fields())\n        } else {\n            Err(FlatbufferError::InvalidTableOrStruct)\n        }\n    }\n}\n\n#[derive(Debug)]\npub struct SafeTable<'a> {\n    safe_buf: &'a SafeBuffer<'a>,\n    loc: usize,\n}\n\nimpl<'a> SafeTable<'a> {\n    /// Gets an integer table field given its exact type. Returns default integer value if the field is not set. Returns [None] if no default value is found. Returns error if\n    /// the table doesn't match the buffer or\n    /// the [field_name] doesn't match the table or\n    /// the field type doesn't match.\n    pub fn get_field_integer<T: for<'b> Follow<'b, Inner = T> + PrimInt + FromPrimitive>(\n        &self,\n        field_name: &str,\n    ) -> FlatbufferResult<Option<T>> {\n        if let Some(field) = self.safe_buf.find_field_by_name(self.loc, field_name)? {\n            // SAFETY: the buffer was verified during construction.\n            unsafe { get_field_integer::<T>(&Table::new(&self.safe_buf.buf, self.loc), &field) }\n        } else {\n            Err(FlatbufferError::FieldNotFound)\n        }\n    }\n\n    /// Gets a floating point table field given its exact type. Returns default float value if the field is not set. Returns [None] if no default value is found. Returns error if\n    /// the table doesn't match the buffer or\n    /// the [field_name] doesn't match the table or\n    /// the field type doesn't match.\n    pub fn get_field_float<T: for<'b> Follow<'b, Inner = T> + Float>(\n        &self,\n        field_name: &str,\n    ) -> FlatbufferResult<Option<T>> {\n        if let Some(field) = self.safe_buf.find_field_by_name(self.loc, field_name)? {\n            // SAFETY: the buffer was verified during construction.\n            unsafe { get_field_float::<T>(&Table::new(&self.safe_buf.buf, self.loc), &field) }\n        } else {\n            Err(FlatbufferError::FieldNotFound)\n        }\n    }\n\n    /// Gets a String table field given its exact type. Returns empty string if the field is not set. Returns [None] if no default value is found. Returns error if\n    /// the table doesn't match the buffer or\n    /// the [field_name] doesn't match the table or\n    /// the field type doesn't match.\n    pub fn get_field_string(&self, field_name: &str) -> FlatbufferResult<Option<&str>> {\n        if let Some(field) = self.safe_buf.find_field_by_name(self.loc, field_name)? {\n            // SAFETY: the buffer was verified during construction.\n            unsafe { get_field_string(&Table::new(&self.safe_buf.buf, self.loc), &field) }\n        } else {\n            Err(FlatbufferError::FieldNotFound)\n        }\n    }\n\n    /// Gets a [SafeStruct] table field given its exact type. Returns [None] if the field is not set. Returns error if\n    /// the table doesn't match the buffer or\n    /// the [field_name] doesn't match the table or\n    /// the field type doesn't match.\n    pub fn get_field_struct(&self, field_name: &str) -> FlatbufferResult<Option<SafeStruct<'a>>> {\n        if let Some(field) = self.safe_buf.find_field_by_name(self.loc, field_name)? {\n            // SAFETY: the buffer was verified during construction.\n            let optional_st =\n                unsafe { get_field_struct(&Table::new(&self.safe_buf.buf, self.loc), &field)? };\n            Ok(optional_st.map(|st| SafeStruct { safe_buf: self.safe_buf, loc: st.loc() }))\n        } else {\n            Err(FlatbufferError::FieldNotFound)\n        }\n    }\n\n    /// Gets a Vector table field given its exact type. Returns empty vector if the field is not set. Returns error if\n    /// the table doesn't match the buffer or\n    /// the [field_name] doesn't match the table or\n    /// the field type doesn't match.\n    pub fn get_field_vector<T: Follow<'a, Inner = T>>(\n        &self,\n        field_name: &str,\n    ) -> FlatbufferResult<Option<Vector<'a, T>>> {\n        if let Some(field) = self.safe_buf.find_field_by_name(self.loc, field_name)? {\n            // SAFETY: the buffer was verified during construction.\n            unsafe { get_field_vector(&Table::new(&self.safe_buf.buf, self.loc), &field) }\n        } else {\n            Err(FlatbufferError::FieldNotFound)\n        }\n    }\n\n    /// Gets a [SafeTable] table field given its exact type. Returns [None] if the field is not set. Returns error if\n    /// the table doesn't match the buffer or\n    /// the [field_name] doesn't match the table or\n    /// the field type doesn't match.\n    pub fn get_field_table(&self, field_name: &str) -> FlatbufferResult<Option<SafeTable<'a>>> {\n        if let Some(field) = self.safe_buf.find_field_by_name(self.loc, field_name)? {\n            // SAFETY: the buffer was verified during construction.\n            let optional_table =\n                unsafe { get_field_table(&Table::new(&self.safe_buf.buf, self.loc), &field)? };\n            Ok(optional_table.map(|t| SafeTable { safe_buf: self.safe_buf, loc: t.loc() }))\n        } else {\n            Err(FlatbufferError::FieldNotFound)\n        }\n    }\n\n    /// Returns the value of any table field as a 64-bit int, regardless of what type it is. Returns default integer if the field is not set or error if\n    /// the value cannot be parsed as integer or\n    /// the table doesn't match the buffer or\n    /// the [field_name] doesn't match the table.\n    /// [num_traits](https://docs.rs/num-traits/latest/num_traits/cast/trait.NumCast.html) is used for number casting.\n    pub fn get_any_field_integer(&self, field_name: &str) -> FlatbufferResult<i64> {\n        if let Some(field) = self.safe_buf.find_field_by_name(self.loc, field_name)? {\n            // SAFETY: the buffer was verified during construction.\n            unsafe { get_any_field_integer(&Table::new(&self.safe_buf.buf, self.loc), &field) }\n        } else {\n            Err(FlatbufferError::FieldNotFound)\n        }\n    }\n\n    /// Returns the value of any table field as a 64-bit floating point, regardless of what type it is. Returns default float if the field is not set or error if\n    /// the value cannot be parsed as float or\n    /// the table doesn't match the buffer or\n    /// the [field_name] doesn't match the table.\n    pub fn get_any_field_float(&self, field_name: &str) -> FlatbufferResult<f64> {\n        if let Some(field) = self.safe_buf.find_field_by_name(self.loc, field_name)? {\n            // SAFETY: the buffer was verified during construction.\n            unsafe { get_any_field_float(&Table::new(&self.safe_buf.buf, self.loc), &field) }\n        } else {\n            Err(FlatbufferError::FieldNotFound)\n        }\n    }\n\n    /// Returns the string representation of any table field value (e.g. integer 123 is returned as \"123\"), regardless of what type it is. Returns empty string if the field is not set. Returns error if\n    /// the table doesn't match the buffer or\n    /// the [field_name] doesn't match the table.\n    pub fn get_any_field_string(&self, field_name: &str) -> FlatbufferResult<String> {\n        if let Some(field) = self.safe_buf.find_field_by_name(self.loc, field_name)? {\n            // SAFETY: the buffer was verified during construction.\n            unsafe {\n                Ok(get_any_field_string(\n                    &Table::new(&self.safe_buf.buf, self.loc),\n                    &field,\n                    self.safe_buf.schema,\n                ))\n            }\n        } else {\n            Err(FlatbufferError::FieldNotFound)\n        }\n    }\n}\n\n#[derive(Debug)]\npub struct SafeStruct<'a> {\n    safe_buf: &'a SafeBuffer<'a>,\n    loc: usize,\n}\n\nimpl<'a> SafeStruct<'a> {\n    /// Gets a [SafeStruct] struct field given its exact type. Returns error if\n    /// the struct doesn't match the buffer or\n    /// the [field_name] doesn't match the struct or\n    /// the field type doesn't match.\n    pub fn get_field_struct(&self, field_name: &str) -> FlatbufferResult<SafeStruct<'a>> {\n        if let Some(field) = self.safe_buf.find_field_by_name(self.loc, field_name)? {\n            // SAFETY: the buffer was verified during construction.\n            let st = unsafe {\n                get_field_struct_in_struct(&Struct::new(&self.safe_buf.buf, self.loc), &field)?\n            };\n            Ok(SafeStruct { safe_buf: self.safe_buf, loc: st.loc() })\n        } else {\n            Err(FlatbufferError::FieldNotFound)\n        }\n    }\n\n    /// Returns the value of any struct field as a 64-bit int, regardless of what type it is. Returns error if\n    /// the struct doesn't match the buffer or\n    /// the [field_name] doesn't match the struct or\n    /// the value cannot be parsed as integer.\n    pub fn get_any_field_integer(&self, field_name: &str) -> FlatbufferResult<i64> {\n        if let Some(field) = self.safe_buf.find_field_by_name(self.loc, field_name)? {\n            // SAFETY: the buffer was verified during construction.\n            unsafe {\n                get_any_field_integer_in_struct(&Struct::new(&self.safe_buf.buf, self.loc), &field)\n            }\n        } else {\n            Err(FlatbufferError::FieldNotFound)\n        }\n    }\n\n    /// Returns the value of any struct field as a 64-bit floating point, regardless of what type it is. Returns error if\n    /// the struct doesn't match the buffer or\n    /// the [field_name] doesn't match the struct or\n    /// the value cannot be parsed as float.\n    pub fn get_any_field_float(&self, field_name: &str) -> FlatbufferResult<f64> {\n        if let Some(field) = self.safe_buf.find_field_by_name(self.loc, field_name)? {\n            // SAFETY: the buffer was verified during construction.\n            unsafe {\n                get_any_field_float_in_struct(&Struct::new(&self.safe_buf.buf, self.loc), &field)\n            }\n        } else {\n            Err(FlatbufferError::FieldNotFound)\n        }\n    }\n\n    /// Returns the string representation of any struct field value (e.g. integer 123 is returned as \"123\"), regardless of what type it is. Returns error if\n    /// the struct doesn't match the buffer or\n    /// the [field_name] doesn't match the struct.\n    pub fn get_any_field_string(&self, field_name: &str) -> FlatbufferResult<String> {\n        if let Some(field) = self.safe_buf.find_field_by_name(self.loc, field_name)? {\n            // SAFETY: the buffer was verified during construction.\n            unsafe {\n                Ok(get_any_field_string_in_struct(\n                    &Struct::new(&self.safe_buf.buf, self.loc),\n                    &field,\n                    self.safe_buf.schema,\n                ))\n            }\n        } else {\n            Err(FlatbufferError::FieldNotFound)\n        }\n    }\n}\n"
  },
  {
    "path": "rust/reflection/src/struct.rs",
    "content": "/*\n * Copyright 2018 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nuse flatbuffers::Follow;\n\n#[derive(Clone, Copy, Debug, PartialEq, Eq)]\npub struct Struct<'a> {\n    buf: &'a [u8],\n    loc: usize,\n}\n\nimpl<'a> Struct<'a> {\n    #[inline]\n    pub fn buf(&self) -> &'a [u8] {\n        self.buf\n    }\n\n    #[inline]\n    pub fn loc(&self) -> usize {\n        self.loc\n    }\n\n    /// # Safety\n    ///\n    /// [buf] must contain a valid struct at [loc]\n    #[inline]\n    pub unsafe fn new(buf: &'a [u8], loc: usize) -> Self {\n        Struct { buf, loc }\n    }\n\n    /// Retrieves the value at the provided [byte_loc]. No field in [Struct] is optional.\n    ///\n    /// # Safety\n    ///\n    /// The value of the corresponding slot must have type T\n    #[inline]\n    pub unsafe fn get<T: Follow<'a> + 'a>(&self, byte_loc: usize) -> T::Inner {\n        <T>::follow(self.buf, self.loc + byte_loc)\n    }\n}\n\nimpl<'a> Follow<'a> for Struct<'a> {\n    type Inner = Struct<'a>;\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Struct { buf, loc }\n    }\n}\n"
  },
  {
    "path": "samples/SampleBinary.cs",
    "content": "/*\n * Copyright 2015 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// To run, use the `csharp_sample.sh` script.\n\nusing System;\nusing Google.FlatBuffers;\nusing MyGame.Sample;\n\nclass SampleBinary\n{\n  // Example how to use FlatBuffers to create and read binary buffers.\n  static void Main()\n  {\n    var builder = new FlatBufferBuilder(1);\n\n    // Create some weapons for our Monster ('Sword' and 'Axe').\n    var weapon1Name = builder.CreateString(\"Sword\");\n    var weapon1Damage = 3;\n    var weapon2Name = builder.CreateString(\"Axe\");\n    var weapon2Damage = 5;\n\n    // Use the `CreateWeapon()` helper function to create the weapons, since we set every field.\n    var weaps = new Offset<Weapon>[2];\n    weaps[0] = Weapon.CreateWeapon(builder, weapon1Name, (short)weapon1Damage);\n    weaps[1] = Weapon.CreateWeapon(builder, weapon2Name, (short)weapon2Damage);\n\n    // Serialize the FlatBuffer data.\n    var name = builder.CreateString(\"Orc\");\n    var treasure =  new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};\n    var inv = Monster.CreateInventoryVector(builder, treasure);\n    var weapons = Monster.CreateWeaponsVector(builder, weaps);\n    var pos = Vec3.CreateVec3(builder, 1.0f, 2.0f, 3.0f);\n\n    Monster.StartMonster(builder);\n    Monster.AddPos(builder, pos);\n    Monster.AddHp(builder, (short)300);\n    Monster.AddName(builder, name);\n    Monster.AddInventory(builder, inv);\n    Monster.AddColor(builder, Color.Red);\n    Monster.AddWeapons(builder, weapons);\n    Monster.AddEquippedType(builder, Equipment.Weapon);\n    Monster.AddEquipped(builder, weaps[1].Value);\n    var orc = Monster.EndMonster(builder);\n\n    builder.Finish(orc.Value); // You could also call `Monster.FinishMonsterBuffer(builder, orc);`.\n\n    // We now have a FlatBuffer that we could store on disk or send over a network.\n\n    // ...Code to store to disk or send over a network goes here...\n\n    // Instead, we are going to access it right away, as if we just received it.\n\n    var buf = builder.DataBuffer;\n\n    // Get access to the root:\n    var monster = Monster.GetRootAsMonster(buf);\n\n    // For C#, unlike other languages, most values (except for vectors and unions) are available as\n    // properties instead of accessor methods.\n\n    // Note: We did not set the `Mana` field explicitly, so we get back the default value.\n    Assert(monster.Mana == 150, \"monster.Mana\", Convert.ToString(monster.Mana),\n           Convert.ToString(150));\n    Assert(monster.Hp == 300, \"monster.Hp\", Convert.ToString(monster.Hp), Convert.ToString(30));\n    Assert(monster.Name.Equals(\"Orc\", StringComparison.Ordinal), \"monster.Name\", monster.Name,\n           \"Orc\");\n    Assert(monster.Color == Color.Red, \"monster.Color\", Convert.ToString(monster.Color),\n           Convert.ToString(Color.Red));\n\n    var vec = monster.Pos.Value;\n    Assert(vec.X == 1.0f, \"vec.X\",\n           Convert.ToString(vec.X), Convert.ToString(1.0f));\n    Assert(vec.Y == 2.0f, \"vec.Y\",\n           Convert.ToString(vec.Y), Convert.ToString(2.0f));\n    Assert(vec.Z == 3.0f, \"vec.Z\",\n           Convert.ToString(vec.Z), Convert.ToString(3.0f));\n\n    // Get and test the `Inventory` FlatBuffer `vector`.\n    for (int i = 0; i < monster.InventoryLength; i++)\n    {\n      Assert(monster.Inventory(i) == i, \"monster.Inventory\",\n             Convert.ToString(monster.Inventory(i)), Convert.ToString(i));\n    }\n\n    // Get and test the `Weapons` FlatBuffer `vector` of `table`s.\n    var expectedWeaponNames = new string[] {\"Sword\", \"Axe\"};\n    var expectedWeaponDamages = new short[] {3, 5};\n    for (int i = 0; i < monster.WeaponsLength; i++)\n    {\n      Assert(monster.Weapons(i).Value.Name.Equals(expectedWeaponNames[i], StringComparison.Ordinal),\n             \"monster.Weapons\", monster.Weapons(i).Value.Name, expectedWeaponNames[i]);\n      Assert(monster.Weapons(i).Value.Damage == expectedWeaponDamages[i], \"monster.GetWeapons\",\n             Convert.ToString(monster.Weapons(i).Value.Damage),\n             Convert.ToString(expectedWeaponDamages[i]));\n    }\n\n    // Get and test the `Equipped` FlatBuffer `union`.\n    Assert(monster.EquippedType == Equipment.Weapon, \"monster.EquippedType\",\n           Convert.ToString(monster.EquippedType), Convert.ToString(Equipment.Weapon));\n    var equipped = monster.Equipped<Weapon>().Value;\n    Assert(equipped.Name.Equals(\"Axe\", StringComparison.Ordinal), \"equipped.Name\", equipped.Name,\n           \"Axe\");\n    Assert(equipped.Damage == 5, \"equipped.Damage\", Convert.ToString(equipped.Damage),\n           Convert.ToString(5));\n\n    Console.WriteLine(\"The FlatBuffer was successfully created and verified!\");\n  }\n\n  // A helper function to handle assertions.\n  static void Assert(bool assertPassed, string codeExecuted, string actualValue,\n                     string expectedValue)\n  {\n    if (assertPassed == false)\n    {\n      Console.WriteLine(\"Assert failed! \" + codeExecuted + \" (\" + actualValue +\n          \") was not equal to \" + expectedValue + \".\");\n      System.Environment.Exit(1);\n    }\n  }\n}\n"
  },
  {
    "path": "samples/SampleBinary.java",
    "content": "/*\n * Copyright 2015 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Run this file with the `java_sample.sh` script.\n\nimport MyGame.Sample.Color;\nimport MyGame.Sample.Equipment;\nimport MyGame.Sample.Monster;\nimport MyGame.Sample.Vec3;\nimport MyGame.Sample.Weapon;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport java.nio.ByteBuffer;\n\nclass SampleBinary {\n  // Example how to use FlatBuffers to create and read binary buffers.\n  public static void main(String[] args) {\n    FlatBufferBuilder builder = new FlatBufferBuilder(0);\n\n    // Create some weapons for our Monster ('Sword' and 'Axe').\n    int weaponOneName = builder.createString(\"Sword\");\n    short weaponOneDamage = 3;\n    int weaponTwoName = builder.createString(\"Axe\");\n    short weaponTwoDamage = 5;\n\n    // Use the `createWeapon()` helper function to create the weapons, since we set every field.\n    int[] weaps = new int[2];\n    weaps[0] = Weapon.createWeapon(builder, weaponOneName, weaponOneDamage);\n    weaps[1] = Weapon.createWeapon(builder, weaponTwoName, weaponTwoDamage);\n\n    // Serialize the FlatBuffer data.\n    int name = builder.createString(\"Orc\");\n    byte[] treasure = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};\n    int inv = Monster.createInventoryVector(builder, treasure);\n    int weapons = Monster.createWeaponsVector(builder, weaps);\n    int pos = Vec3.createVec3(builder, 1.0f, 2.0f, 3.0f);\n\n    Monster.startMonster(builder);\n    Monster.addPos(builder, pos);\n    Monster.addName(builder, name);\n    Monster.addColor(builder, Color.Red);\n    Monster.addHp(builder, (short) 300);\n    Monster.addInventory(builder, inv);\n    Monster.addWeapons(builder, weapons);\n    Monster.addEquippedType(builder, Equipment.Weapon);\n    Monster.addEquipped(builder, weaps[1]);\n    int orc = Monster.endMonster(builder);\n\n    builder.finish(orc); // You could also call `Monster.finishMonsterBuffer(builder, orc);`.\n\n    // We now have a FlatBuffer that can be stored on disk or sent over a network.\n\n    // ...Code to store to disk or send over a network goes here...\n\n    // Instead, we are going to access it right away, as if we just received it.\n\n    ByteBuffer buf = builder.dataBuffer();\n\n    // Get access to the root:\n    Monster monster = Monster.getRootAsMonster(buf);\n\n    // Note: We did not set the `mana` field explicitly, so we get back the default value.\n    assert monster.mana() == (short) 150;\n    assert monster.hp() == (short) 300;\n    assert monster.name().equals(\"Orc\");\n    assert monster.color() == Color.Red;\n    assert monster.pos().x() == 1.0f;\n    assert monster.pos().y() == 2.0f;\n    assert monster.pos().z() == 3.0f;\n\n    // Get and test the `inventory` FlatBuffer `vector`.\n    for (int i = 0; i < monster.inventoryLength(); i++) {\n      assert monster.inventory(i) == (byte) i;\n    }\n\n    // Get and test the `weapons` FlatBuffer `vector` of `table`s.\n    String[] expectedWeaponNames = {\"Sword\", \"Axe\"};\n    int[] expectedWeaponDamages = {3, 5};\n    for (int i = 0; i < monster.weaponsLength(); i++) {\n      assert monster.weapons(i).name().equals(expectedWeaponNames[i]);\n      assert monster.weapons(i).damage() == expectedWeaponDamages[i];\n    }\n\n    Weapon.Vector weaponsVector = monster.weaponsVector();\n    for (int i = 0; i < weaponsVector.length(); i++) {\n      assert weaponsVector.get(i).name().equals(expectedWeaponNames[i]);\n      assert weaponsVector.get(i).damage() == expectedWeaponDamages[i];\n    }\n\n    // Get and test the `equipped` FlatBuffer `union`.\n    assert monster.equippedType() == Equipment.Weapon;\n    Weapon equipped = (Weapon) monster.equipped(new Weapon());\n    assert equipped.name().equals(\"Axe\");\n    assert equipped.damage() == 5;\n\n    System.out.println(\"The FlatBuffer was successfully created and verified!\");\n  }\n}\n"
  },
  {
    "path": "samples/SampleBinary.kt",
    "content": "/*\n * Copyright 2015 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Run this file with the `java_sample.sh` script.\n\nimport MyGame.Sample.Color\nimport MyGame.Sample.Equipment\nimport MyGame.Sample.Monster\nimport MyGame.Sample.Vec3\nimport MyGame.Sample.Weapon\nimport com.google.flatbuffers.FlatBufferBuilder\n\n@kotlin.ExperimentalUnsignedTypes\nclass SampleBinary {\n\n  companion object {\n    // Example how to use FlatBuffers to create and read binary buffers.\n    @JvmStatic\n    fun main(args: Array<String>) {\n      val builder = FlatBufferBuilder(0)\n\n      // Create some weapons for our Monster ('Sword' and 'Axe').\n      val weaponOneName = builder.createString(\"Sword\")\n      val weaponOneDamage: Short = 3\n      val weaponTwoName = builder.createString(\"Axe\")\n      val weaponTwoDamage: Short = 5\n\n      // Use the `createWeapon()` helper function to create the weapons, since we set every field.\n      val weaps = IntArray(2)\n      weaps[0] = Weapon.createWeapon(builder, weaponOneName, weaponOneDamage)\n      weaps[1] = Weapon.createWeapon(builder, weaponTwoName, weaponTwoDamage)\n\n      // Serialize the FlatBuffer data.\n      val name = builder.createString(\"Orc\")\n      val treasure = byteArrayOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9).asUByteArray()\n      val inv = Monster.createInventoryVector(builder, treasure)\n      val weapons = Monster.createWeaponsVector(builder, weaps)\n      val pos = Vec3.createVec3(builder, 1.0f, 2.0f, 3.0f)\n\n      Monster.startMonster(builder)\n      Monster.addPos(builder, pos)\n      Monster.addName(builder, name)\n      Monster.addColor(builder, Color.Red)\n      Monster.addHp(builder, 300.toShort())\n      Monster.addInventory(builder, inv)\n      Monster.addWeapons(builder, weapons)\n      Monster.addEquippedType(builder, Equipment.Weapon)\n      Monster.addEquipped(builder, weaps[1])\n      val orc = Monster.endMonster(builder)\n\n      builder.finish(orc) // You could also call `Monster.finishMonsterBuffer(builder, orc);`.\n\n      // We now have a FlatBuffer that can be stored on disk or sent over a network.\n\n      // ...Code to store to disk or send over a network goes here...\n\n      // Instead, we are going to access it right away, as if we just received it.\n\n      val buf = builder.dataBuffer()\n\n      // Get access to the root:\n      val monster = Monster.getRootAsMonster(buf)\n\n      // Note: We did not set the `mana` field explicitly, so we get back the default value.\n      assert(monster.mana == 150.toShort())\n      assert(monster.hp == 300.toShort())\n      assert(monster.name.equals(\"Orc\"))\n      assert(monster.color == Color.Red)\n      assert(monster.pos!!.x == 1.0f)\n      assert(monster.pos!!.y == 2.0f)\n      assert(monster.pos!!.z == 3.0f)\n\n      // Get and test the `inventory` FlatBuffer `vector`.\n      for (i in 0 until monster.inventoryLength) {\n        assert(monster.inventory(i) == i.toUByte())\n      }\n\n      // Get and test the `weapons` FlatBuffer `vector` of `table`s.\n      val expectedWeaponNames = arrayOf(\"Sword\", \"Axe\")\n      val expectedWeaponDamages = intArrayOf(3, 5)\n      for (i in 0 until monster.weaponsLength) {\n        assert(monster.weapons(i)!!.name.equals(expectedWeaponNames[i]))\n        assert(monster.weapons(i)!!.damage.toInt() == expectedWeaponDamages[i])\n      }\n\n      // Get and test the `equipped` FlatBuffer `union`.\n      assert(monster.equippedType == Equipment.Weapon)\n      val equipped = monster.equipped(Weapon()) as Weapon?\n      assert(equipped!!.name.equals(\"Axe\"))\n      assert(equipped.damage == 5.toShort())\n\n      println(\"The FlatBuffer was successfully created and verified!\")\n    }\n  }\n}\n"
  },
  {
    "path": "samples/SampleBinary.php",
    "content": "<?php\n/*\n * Copyright 2015 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// To run, use the `php_sample.sh` script.\n\n// It is recommended that you use PSR autoload when using FlatBuffers.\nfunction __autoload($class_name) {\n  $class = substr($class_name, strrpos($class_name, \"\\\\\") + 1);\n  $root_dir = join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)))); // `flatbuffers` root.\n  $paths = array(join(DIRECTORY_SEPARATOR, array($root_dir, \"php\")),\n                 join(DIRECTORY_SEPARATOR, array($root_dir, \"samples\", \"MyGame\", \"Sample\")));\n  foreach ($paths as $path) {\n    $file = join(DIRECTORY_SEPARATOR, array($path, $class . \".php\"));\n    if (file_exists($file)) {\n      require($file);\n      break;\n    }\n  }\n}\n\n// Example how to use FlatBuffers to create and read binary buffers.\nfunction main() {\n  $builder = new Google\\FlatBuffers\\FlatbufferBuilder(0);\n\n  // Create some weapons for our Monster using the `createWeapon()` helper function.\n  $weapon_one = $builder->createString(\"Sword\");\n  $sword = \\MyGame\\Sample\\Weapon::CreateWeapon($builder, $weapon_one, 3);\n  $weapon_two = $builder->createString(\"Axe\");\n  $axe = \\MyGame\\Sample\\Weapon::CreateWeapon($builder, $weapon_two, 5);\n\n  // Serialize the FlatBuffer data.\n  $name = $builder->createString(\"Orc\");\n\n  $treasure = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);\n  $inv = \\MyGame\\Sample\\Monster::CreateInventoryVector($builder, $treasure);\n\n  $weaps = array($sword, $axe);\n  $weapons = \\MyGame\\Sample\\Monster::CreateWeaponsVector($builder, $weaps);\n\n  $pos = \\MyGame\\Sample\\Vec3::CreateVec3($builder, 1.0, 2.0, 3.0);\n\n  \\MyGame\\Sample\\Monster::StartMonster($builder);\n  \\MyGame\\Sample\\Monster::AddPos($builder, $pos);\n  \\MyGame\\Sample\\Monster::AddHp($builder, 300);\n  \\MyGame\\Sample\\Monster::AddName($builder, $name);\n  \\MyGame\\Sample\\Monster::AddInventory($builder, $inv);\n  \\MyGame\\Sample\\Monster::AddColor($builder, \\MyGame\\Sample\\Color::Red);\n  \\MyGame\\Sample\\Monster::AddWeapons($builder, $weapons);\n  \\MyGame\\Sample\\Monster::AddEquippedType($builder, \\MyGame\\Sample\\Equipment::Weapon);\n  \\MyGame\\Sample\\Monster::AddEquipped($builder, $weaps[1]);\n  $orc = \\MyGame\\Sample\\Monster::EndMonster($builder);\n\n  $builder->finish($orc); // You may also call `\\MyGame\\Sample\\Monster::FinishMonsterBuffer($builder, $orc);`.\n\n  // We now have a FlatBuffer that can be stored on disk or sent over a network.\n\n  // ...Code to store to disk or send over a network goes here...\n\n  // Instead, we are going to access it right away, as if we just received it.\n\n  $buf = $builder->dataBuffer();\n\n  // Get access to the root:\n  $monster = \\MyGame\\Sample\\Monster::GetRootAsMonster($buf);\n\n  $success = true; // Tracks if an assert occurred.\n\n  // Note: We did not set the `mana` field explicitly, so we get back the default value.\n  $success &= assert($monster->getMana() == 150);\n  $success &= assert($monster->getHp() == 300);\n  $success &= assert($monster->getName() == \"Orc\");\n  $success &= assert($monster->getColor() == \\MyGame\\Sample\\Color::Red);\n  $success &= assert($monster->getPos()->getX() == 1.0);\n  $success &= assert($monster->getPos()->getY() == 2.0);\n  $success &= assert($monster->getPos()->getZ() == 3.0);\n\n  // Get and test the `inventory` FlatBuffer `vector`.\n  for ($i = 0; $i < $monster->getInventoryLength(); $i++) {\n    $success &= assert($monster->getInventory($i) == $i);\n  }\n\n  // Get and test the `weapons` FlatBuffer `vector` of `table`s.\n  $expected_weapon_names = array(\"Sword\", \"Axe\");\n  $expected_weapon_damages = array(3, 5);\n  for ($i = 0; $i < $monster->getWeaponsLength(); $i++) {\n    $success &= assert($monster->getWeapons($i)->getName() == $expected_weapon_names[$i]);\n    $success &= assert($monster->getWeapons($i)->getDamage() == $expected_weapon_damages[$i]);\n  }\n\n  // Get and test the `equipped` FlatBuffer `union`.\n  $success &= assert($monster->getEquippedType() == \\MyGame\\Sample\\Equipment::Weapon);\n  $success &= assert($monster->getEquipped(new \\MyGame\\Sample\\Weapon())->getName() == \"Axe\");\n  $success &= assert($monster->getEquipped(new \\MyGame\\Sample\\Weapon())->getDamage() == 5);\n\n  if ($success) {\n    print(\"The FlatBuffer was successfully created and verified!\\n\");\n  }\n}\n\nmain();\n?>\n"
  },
  {
    "path": "samples/csharp_sample.sh",
    "content": "#!/bin/bash\n#\n# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n# Note: This script runs on Mac and Linux. It requires `mono` to be installed\n# and `flatc` to be built (using `cmake` in the root directory).\n\nsampledir=$(cd $(dirname $BASH_SOURCE) && pwd)\nrootidr=$(cd $sampledir/.. && pwd)\ncurrentdir=$(pwd)\n\nif [[ \"$sampledir\" != \"$currentdir\" ]]; then\n  echo Error: This script must be run from inside the $sampledir directory.\n  echo You executed it from the $currentdir directory.\n  exit 1\nfi\n\n# Run `flatc`. Note: This requires you to compile using `cmake` from the\n# root `/flatbuffers` directory.\nif [ -e ../flatc ]; then\n  ../flatc --csharp --gen-mutable monster.fbs\nelif [ -e ../Debug/flatc ]; then\n  ../Debug/flatc --csharp --gen-mutable monster.fbs\nelse\n  echo 'flatc' could not be found. Make sure to build FlatBuffers from the \\\n       $rootdir directory.\n  exit 1\nfi\n\necho Compiling and running the C# sample.\n\n# Compile and execute the sample.\nmcs SampleBinary.cs MyGame/Sample/*.cs ../net/FlatBuffers/*.cs\nmono SampleBinary.exe\n\n# Cleanup temporary files.\nrm SampleBinary.exe\nrm -rf MyGame/\n"
  },
  {
    "path": "samples/dart_sample.sh",
    "content": "#!/bin/bash\nset -euo\n#\n# Copyright 2018 Dan Field. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n# Note: This script runs on Mac and Linux. It requires `Node.js` to be installed\n# and `flatc` to be built (using `cmake` in the root directory).\n\nsampledir=$(cd $(dirname $BASH_SOURCE) && pwd)\nrootdir=$(cd $sampledir/.. && pwd)\ncurrentdir=$(pwd)\n\nif [[ \"$sampledir\" != \"$currentdir\" ]]; then\n  echo Error: This script must be run from inside the $sampledir directory.\n  echo You executed it from the $currentdir directory.\n  exit 1\nfi\n\n# Run `flatc`. Note: This requires you to compile using `cmake` from the\n# root `/flatbuffers` directory.\nif [ -e ../flatc ]; then\n  ../flatc --dart -o ../dart/example/ monster.fbs\nelif [ -e ../Debug/flatc ]; then\n  ../Debug/flatc --dart -o ../dart/example/ monster.fbs\nelse\n  echo 'flatc' could not be found. Make sure to build FlatBuffers from the \\\n       $rootdir directory.\n  exit 1\nfi\n\necho Running the Dart sample.\n\n# Execute the sample.\ndart ../dart/example/example.dart\n\n# Copy the source schema so it is distributed when published to pub.dev\ncp monster.fbs ../dart/example/"
  },
  {
    "path": "samples/go.mod",
    "content": "module github.com/google/flatbuffers/samples\n\ngo 1.20\n\nreplace github.com/google/flatbuffers/go => ./go_gen\n\nrequire github.com/google/flatbuffers/go v0.0.0-00010101000000-000000000000\n"
  },
  {
    "path": "samples/go_sample.sh",
    "content": "#!/bin/bash\n#\n# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n# Note: This script runs on Mac and Linux. It requires `go` to be installed\n# and 'flatc' to be built (using `cmake` in the root directory).\n\nsampledir=$(cd $(dirname $BASH_SOURCE) && pwd)\nrootdir=$(cd $sampledir/.. && pwd)\ncurrentdir=$(pwd)\n\nif [[ \"$sampledir\" != \"$currentdir\" ]]; then\n  echo Error: This script must be run from inside the $sampledir directory.\n  echo You executed it from the $currentdir directory.\n  exit 1\nfi\n\n# Run `flatc`. Note: This requires you to compile using `cmake` from the\n# root `/flatbuffers` directory.\nif [ -e ../flatc ]; then\n  ../flatc --go monster.fbs\nelif [ -e ../Debug/flatc ]; then\n  ../Debug/flatc --go monster.fbs\nelse\n  echo 'flatc' could not be found. Make sure to build FlatBuffers from the \\\n       $rootdir directory.\n exit 1\nfi\n\necho Compiling and running the Go sample.\n\n# Workaround for https://github.com/google/flatbuffers/issues/7780:\n# go mod replace requires a go.mod file in the target directory,\n# but there currently isn't one in the ../go directory.\n# So we copy the ../go directory to go_gen and manually create go_gen/go.mod\nmkdir -p ${sampledir}/go_gen\ncp ${sampledir}/../go/* ${sampledir}/go_gen\n( cd ${sampledir}/go_gen && go mod init github.com/google/flatbuffers/go )\n\n# Compile and execute the sample.\ngo build -o go_sample sample_binary.go\n./go_sample\n\n# Clean up the temporary files.\nrm -rf ${sampledir}/go_gen/\nrm go_sample\n"
  },
  {
    "path": "samples/java_sample.sh",
    "content": "#!/bin/bash\n#\n# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n# Note: This script runs on Mac and Linux. It requires `java` to be installed\n# and `flatc` to be built (using `cmake` in the root directory).\n\nsampledir=$(cd $(dirname $BASH_SOURCE) && pwd)\nrootdir=$(cd $sampledir/.. && pwd)\ncurrentdir=$(pwd)\n\nif [[ \"$sampledir\" != \"$currentdir\" ]]; then\n  echo Error: This script must be run from inside the $sampledir directory.\n  echo You executed it from the $currentdir directory.\n  exit 1\nfi\n\n# Run `flatc`. Note: This requires you to compile using `cmake` from the\n# root `/flatbuffers` directory.\nif [ -e ../flatc ]; then\n  ../flatc --java --gen-mutable monster.fbs\nelif [ -e ../Debug/flatc ]; then\n  ../Debug/flatc --java --gen-mutable monster.fbs\nelse\n  echo 'flatc' could not be found. Make sure to build FlatBuffers from the \\\n       $rootdir directory.\n  exit 1\nfi\n\necho Compiling and running the Java sample.\n\n# Compile and execute the sample.\njavac -classpath ${sampledir}/../java:${sampledir} SampleBinary.java\njava -classpath ${sampledir}/../java:${sampledir} SampleBinary\n\n# Cleanup temporary files.\nrm -rf MyGame/\nrm ${sampledir}/../java/com/google/flatbuffers/*.class\nrm *.class\n"
  },
  {
    "path": "samples/javascript_sample.sh",
    "content": "#!/bin/bash\n#\n# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n# Note: This script runs on Mac and Linux. It requires `Node.js` to be installed\n# and `flatc` to be built (using `cmake` in the root directory).\n\nsampledir=$(cd $(dirname $BASH_SOURCE) && pwd)\nrootdir=$(cd $sampledir/.. && pwd)\ncurrentdir=$(pwd)\n\nif [[ \"$sampledir\" != \"$currentdir\" ]]; then\n  echo Error: This script must be run from inside the $sampledir directory.\n  echo You executed it from the $currentdir directory.\n  exit 1\nfi\n\n# Run `flatc`. Note: This requires you to compile using `cmake` from the\n# root `/flatbuffers` directory.\nif [ -e ../flatc ]; then\n  ../flatc --js monster.fbs\nelif [ -e ../Debug/flatc ]; then\n  ../Debug/flatc --js monster.fbs\nelse\n  echo 'flatc' could not be found. Make sure to build FlatBuffers from the \\\n       $rootdir directory.\n  exit 1\nfi\n\necho Running the JavaScript sample.\n\n# Execute the sample.\nnode samplebinary.js\n\n# Cleanup temporary files.\nrm monster_generated.js\n"
  },
  {
    "path": "samples/kotlin_sample.sh",
    "content": "#!/bin/bash\n#\n# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n# Note: This script runs on Mac and Linux. It requires `kotlin` to be installed\n# and `flatc` to be built (using `cmake` in the root directory).\n\nsampledir=$(cd $(dirname $BASH_SOURCE) && pwd)\nrootdir=$(cd $sampledir/.. && pwd)\ncurrentdir=$(pwd)\n\nif [[ \"$sampledir\" != \"$currentdir\" ]]; then\n  echo Error: This script must be run from inside the $sampledir directory.\n  echo You executed it from the $currentdir directory.\n  exit 1\nfi\n\n# Run `flatc`. Note: This requires you to compile using `cmake` from the\n# root `/flatbuffers` directory.\nif [ -e ../flatc ]; then\n  echo \"compiling now\"\n  ../flatc --kotlin --gen-mutable monster.fbs\nelif [ -e ../Debug/flatc ]; then\n  ../Debug/flatc --kotlin --gen-mutable monster.fbs\nelse\n  echo 'flatc' could not be found. Make sure to build FlatBuffers from the \\\n       $rootdir directory.\n  exit 1\nfi\n\necho Compiling and running the Kotlin sample\n\nall_kt_files=`find $sampledir -name \"*.kt\" -print`\n# Run test\nmkdir -v \"${sampledir}/kotlin\"\necho Compiling Java Runtime\njavac ${rootdir}/java/com/google/flatbuffers/*.java -d ${sampledir}/kotlin\necho Compiling Kotlin source\nkotlinc -classpath ${sampledir}/../java:${sampledir}/kotlin $all_kt_files SampleBinary.kt -include-runtime -d ${sampledir}/kotlin\n# Make jar\necho Making jar\njar cvf ${sampledir}/kotlin/kotlin_sample.jar -C ${sampledir}/kotlin . > /dev/null\necho Running test\nkotlin -cp ${sampledir}/kotlin/kotlin_sample.jar SampleBinary\n\n# Cleanup temporary files.\nrm -rf MyGame/\n# rm -rf ${sampledir}/kotlin\n"
  },
  {
    "path": "samples/lua/MyGame/Sample/Color.lua",
    "content": "-- automatically generated by the FlatBuffers compiler, do not modify\n\n-- namespace: Sample\n\nlocal Color = {\n    Red = 0,\n    Green = 1,\n    Blue = 2,\n}\n\nreturn Color -- return the module"
  },
  {
    "path": "samples/lua/MyGame/Sample/Equipment.lua",
    "content": "-- automatically generated by the FlatBuffers compiler, do not modify\n\n-- namespace: Sample\n\nlocal Equipment = {\n    NONE = 0,\n    Weapon = 1,\n}\n\nreturn Equipment -- return the module"
  },
  {
    "path": "samples/lua/MyGame/Sample/Monster.lua",
    "content": "-- automatically generated by the FlatBuffers compiler, do not modify\n\n-- namespace: Sample\n\nlocal flatbuffers = require('flatbuffers')\n\nlocal Monster = {} -- the module\nlocal Monster_mt = {} -- the class metatable\n\nfunction Monster.New()\n    local o = {}\n    setmetatable(o, {__index = Monster_mt})\n    return o\nend\nfunction Monster.GetRootAsMonster(buf, offset)\n    local n = flatbuffers.N.UOffsetT:Unpack(buf, offset)\n    local o = Monster.New()\n    o:Init(buf, n + offset)\n    return o\nend\nfunction Monster_mt:Init(buf, pos)\n    self.view = flatbuffers.view.New(buf, pos)\nend\nfunction Monster_mt:Pos()\n    local o = self.view:Offset(4)\n    if o ~= 0 then\n        local x = o + self.view.pos\n        local obj = require('MyGame.Sample.Vec3').New()\n        obj:Init(self.view.bytes, x)\n        return obj\n    end\nend\nfunction Monster_mt:Mana()\n    local o = self.view:Offset(6)\n    if o ~= 0 then\n        return self.view:Get(flatbuffers.N.Int16, o + self.view.pos)\n    end\n    return 150\nend\nfunction Monster_mt:Hp()\n    local o = self.view:Offset(8)\n    if o ~= 0 then\n        return self.view:Get(flatbuffers.N.Int16, o + self.view.pos)\n    end\n    return 100\nend\nfunction Monster_mt:Name()\n    local o = self.view:Offset(10)\n    if o ~= 0 then\n        return self.view:String(o + self.view.pos)\n    end\nend\nfunction Monster_mt:Inventory(j)\n    local o = self.view:Offset(14)\n    if o ~= 0 then\n        local a = self.view:Vector(o)\n        return self.view:Get(flatbuffers.N.Uint8, a + ((j-1) * 1))\n    end\n    return 0\nend\nfunction Monster_mt:InventoryLength()\n    local o = self.view:Offset(14)\n    if o ~= 0 then\n        return self.view:VectorLen(o)\n    end\n    return 0\nend\nfunction Monster_mt:Color()\n    local o = self.view:Offset(16)\n    if o ~= 0 then\n        return self.view:Get(flatbuffers.N.Int8, o + self.view.pos)\n    end\n    return 2\nend\nfunction Monster_mt:Weapons(j)\n    local o = self.view:Offset(18)\n    if o ~= 0 then\n        local x = self.view:Vector(o)\n        x = x + ((j-1) * 4)\n        x = self.view:Indirect(x)\n        local obj = require('MyGame.Sample.Weapon').New()\n        obj:Init(self.view.bytes, x)\n        return obj\n    end\nend\nfunction Monster_mt:WeaponsLength()\n    local o = self.view:Offset(18)\n    if o ~= 0 then\n        return self.view:VectorLen(o)\n    end\n    return 0\nend\nfunction Monster_mt:EquippedType()\n    local o = self.view:Offset(20)\n    if o ~= 0 then\n        return self.view:Get(flatbuffers.N.Uint8, o + self.view.pos)\n    end\n    return 0\nend\nfunction Monster_mt:Equipped()\n    local o = self.view:Offset(22)\n    if o ~= 0 then\n        local obj = flatbuffers.view.New(require('flatbuffers.binaryarray').New(0), 0)\n        self.view:Union(obj, o)\n        return obj\n    end\nend\nfunction Monster.Start(builder) builder:StartObject(10) end\nfunction Monster.AddPos(builder, pos) builder:PrependStructSlot(0, pos, 0) end\nfunction Monster.AddMana(builder, mana) builder:PrependInt16Slot(1, mana, 150) end\nfunction Monster.AddHp(builder, hp) builder:PrependInt16Slot(2, hp, 100) end\nfunction Monster.AddName(builder, name) builder:PrependUOffsetTRelativeSlot(3, name, 0) end\nfunction Monster.AddInventory(builder, inventory) builder:PrependUOffsetTRelativeSlot(5, inventory, 0) end\nfunction Monster.StartInventoryVector(builder, numElems) return builder:StartVector(1, numElems, 1) end\nfunction Monster.AddColor(builder, color) builder:PrependInt8Slot(6, color, 2) end\nfunction Monster.AddWeapons(builder, weapons) builder:PrependUOffsetTRelativeSlot(7, weapons, 0) end\nfunction Monster.StartWeaponsVector(builder, numElems) return builder:StartVector(4, numElems, 4) end\nfunction Monster.AddEquippedType(builder, equippedType) builder:PrependUint8Slot(8, equippedType, 0) end\nfunction Monster.AddEquipped(builder, equipped) builder:PrependUOffsetTRelativeSlot(9, equipped, 0) end\nfunction Monster.End(builder) return builder:EndObject() end\n\nreturn Monster -- return the module"
  },
  {
    "path": "samples/lua/MyGame/Sample/Vec3.lua",
    "content": "-- automatically generated by the FlatBuffers compiler, do not modify\n\n-- namespace: Sample\n\nlocal flatbuffers = require('flatbuffers')\n\nlocal Vec3 = {} -- the module\nlocal Vec3_mt = {} -- the class metatable\n\nfunction Vec3.New()\n    local o = {}\n    setmetatable(o, {__index = Vec3_mt})\n    return o\nend\nfunction Vec3_mt:Init(buf, pos)\n    self.view = flatbuffers.view.New(buf, pos)\nend\nfunction Vec3_mt:X()\n    return self.view:Get(flatbuffers.N.Float32, self.view.pos + 0)\nend\nfunction Vec3_mt:Y()\n    return self.view:Get(flatbuffers.N.Float32, self.view.pos + 4)\nend\nfunction Vec3_mt:Z()\n    return self.view:Get(flatbuffers.N.Float32, self.view.pos + 8)\nend\nfunction Vec3.CreateVec3(builder, x, y, z)\n    builder:Prep(4, 12)\n    builder:PrependFloat32(z)\n    builder:PrependFloat32(y)\n    builder:PrependFloat32(x)\n    return builder:Offset()\nend\n\nreturn Vec3 -- return the module"
  },
  {
    "path": "samples/lua/MyGame/Sample/Weapon.lua",
    "content": "-- automatically generated by the FlatBuffers compiler, do not modify\n\n-- namespace: Sample\n\nlocal flatbuffers = require('flatbuffers')\n\nlocal Weapon = {} -- the module\nlocal Weapon_mt = {} -- the class metatable\n\nfunction Weapon.New()\n    local o = {}\n    setmetatable(o, {__index = Weapon_mt})\n    return o\nend\nfunction Weapon.GetRootAsWeapon(buf, offset)\n    local n = flatbuffers.N.UOffsetT:Unpack(buf, offset)\n    local o = Weapon.New()\n    o:Init(buf, n + offset)\n    return o\nend\nfunction Weapon_mt:Init(buf, pos)\n    self.view = flatbuffers.view.New(buf, pos)\nend\nfunction Weapon_mt:Name()\n    local o = self.view:Offset(4)\n    if o ~= 0 then\n        return self.view:String(o + self.view.pos)\n    end\nend\nfunction Weapon_mt:Damage()\n    local o = self.view:Offset(6)\n    if o ~= 0 then\n        return self.view:Get(flatbuffers.N.Int16, o + self.view.pos)\n    end\n    return 0\nend\nfunction Weapon.Start(builder) builder:StartObject(2) end\nfunction Weapon.AddName(builder, name) builder:PrependUOffsetTRelativeSlot(0, name, 0) end\nfunction Weapon.AddDamage(builder, damage) builder:PrependInt16Slot(1, damage, 0) end\nfunction Weapon.End(builder) return builder:EndObject() end\n\nreturn Weapon -- return the module"
  },
  {
    "path": "samples/monster.fbs",
    "content": "// Example IDL file for our monster's schema.\n\nnamespace MyGame.Sample;\n\nenum Color:byte { Red = 0, Green, Blue = 2 }\n\nunion Equipment { Weapon } // Optionally add more tables.\n\nstruct Vec3 {\n  x:float;\n  y:float;\n  z:float;\n}\n\ntable Monster {\n  pos:Vec3;\n  mana:short = 150;\n  hp:short = 100;\n  name:string;\n  friendly:bool = false (deprecated);\n  inventory:[ubyte];\n  color:Color = Blue;\n  weapons:[Weapon];\n  equipped:Equipment;\n  path:[Vec3];\n}\n\ntable Weapon {\n  name:string;\n  damage:short;\n}\n\nroot_type Monster;\n"
  },
  {
    "path": "samples/monster_generated.h",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n\n#ifndef FLATBUFFERS_GENERATED_MONSTER_MYGAME_SAMPLE_H_\n#define FLATBUFFERS_GENERATED_MONSTER_MYGAME_SAMPLE_H_\n\n#include \"flatbuffers/flatbuffers.h\"\n\n// Ensure the included flatbuffers.h is the same version as when this file was\n// generated, otherwise it may not be compatible.\nstatic_assert(FLATBUFFERS_VERSION_MAJOR == 25 &&\n              FLATBUFFERS_VERSION_MINOR == 12 &&\n              FLATBUFFERS_VERSION_REVISION == 19,\n             \"Non-compatible flatbuffers version included\");\n\nnamespace MyGame {\nnamespace Sample {\n\nstruct Vec3;\n\nstruct Monster;\nstruct MonsterBuilder;\nstruct MonsterT;\n\nstruct Weapon;\nstruct WeaponBuilder;\nstruct WeaponT;\n\nbool operator==(const Vec3 &lhs, const Vec3 &rhs);\nbool operator!=(const Vec3 &lhs, const Vec3 &rhs);\nbool operator==(const MonsterT &lhs, const MonsterT &rhs);\nbool operator!=(const MonsterT &lhs, const MonsterT &rhs);\nbool operator==(const WeaponT &lhs, const WeaponT &rhs);\nbool operator!=(const WeaponT &lhs, const WeaponT &rhs);\n\ninline const ::flatbuffers::TypeTable *Vec3TypeTable();\n\ninline const ::flatbuffers::TypeTable *MonsterTypeTable();\n\ninline const ::flatbuffers::TypeTable *WeaponTypeTable();\n\nenum Color : int8_t {\n  Color_Red = 0,\n  Color_Green = 1,\n  Color_Blue = 2,\n  Color_MIN = Color_Red,\n  Color_MAX = Color_Blue\n};\n\ninline const Color (&EnumValuesColor())[3] {\n  static const Color values[] = {\n    Color_Red,\n    Color_Green,\n    Color_Blue\n  };\n  return values;\n}\n\ninline const char * const *EnumNamesColor() {\n  static const char * const names[4] = {\n    \"Red\",\n    \"Green\",\n    \"Blue\",\n    nullptr\n  };\n  return names;\n}\n\ninline const char *EnumNameColor(Color e) {\n  if (::flatbuffers::IsOutRange(e, Color_Red, Color_Blue)) return \"\";\n  const size_t index = static_cast<size_t>(e);\n  return EnumNamesColor()[index];\n}\n\nenum Equipment : uint8_t {\n  Equipment_NONE = 0,\n  Equipment_Weapon = 1,\n  Equipment_MIN = Equipment_NONE,\n  Equipment_MAX = Equipment_Weapon\n};\n\ninline const Equipment (&EnumValuesEquipment())[2] {\n  static const Equipment values[] = {\n    Equipment_NONE,\n    Equipment_Weapon\n  };\n  return values;\n}\n\ninline const char * const *EnumNamesEquipment() {\n  static const char * const names[3] = {\n    \"NONE\",\n    \"Weapon\",\n    nullptr\n  };\n  return names;\n}\n\ninline const char *EnumNameEquipment(Equipment e) {\n  if (::flatbuffers::IsOutRange(e, Equipment_NONE, Equipment_Weapon)) return \"\";\n  const size_t index = static_cast<size_t>(e);\n  return EnumNamesEquipment()[index];\n}\n\ntemplate<typename T> struct EquipmentTraits {\n  static const Equipment enum_value = Equipment_NONE;\n};\n\ntemplate<> struct EquipmentTraits<MyGame::Sample::Weapon> {\n  static const Equipment enum_value = Equipment_Weapon;\n};\n\ntemplate<typename T> struct EquipmentUnionTraits {\n  static const Equipment enum_value = Equipment_NONE;\n};\n\ntemplate<> struct EquipmentUnionTraits<MyGame::Sample::WeaponT> {\n  static const Equipment enum_value = Equipment_Weapon;\n};\n\nstruct EquipmentUnion {\n  Equipment type;\n  void *value;\n\n  EquipmentUnion() : type(Equipment_NONE), value(nullptr) {}\n  EquipmentUnion(EquipmentUnion&& u) FLATBUFFERS_NOEXCEPT :\n    type(Equipment_NONE), value(nullptr)\n    { std::swap(type, u.type); std::swap(value, u.value); }\n  EquipmentUnion(const EquipmentUnion &);\n  EquipmentUnion &operator=(const EquipmentUnion &u)\n    { EquipmentUnion t(u); std::swap(type, t.type); std::swap(value, t.value); return *this; }\n  EquipmentUnion &operator=(EquipmentUnion &&u) FLATBUFFERS_NOEXCEPT\n    { std::swap(type, u.type); std::swap(value, u.value); return *this; }\n  ~EquipmentUnion() { Reset(); }\n\n  void Reset();\n\n  template <typename T>\n  void Set(T&& val) {\n    typedef typename std::remove_reference<T>::type RT;\n    Reset();\n    type = EquipmentUnionTraits<RT>::enum_value;\n    if (type != Equipment_NONE) {\n      value = new RT(std::forward<T>(val));\n    }\n  }\n\n  static void *UnPack(const void *obj, Equipment type, const ::flatbuffers::resolver_function_t *resolver);\n  ::flatbuffers::Offset<void> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr) const;\n\n  MyGame::Sample::WeaponT *AsWeapon() {\n    return type == Equipment_Weapon ?\n      reinterpret_cast<MyGame::Sample::WeaponT *>(value) : nullptr;\n  }\n  const MyGame::Sample::WeaponT *AsWeapon() const {\n    return type == Equipment_Weapon ?\n      reinterpret_cast<const MyGame::Sample::WeaponT *>(value) : nullptr;\n  }\n};\n\n\ninline bool operator==(const EquipmentUnion &lhs, const EquipmentUnion &rhs) {\n  if (lhs.type != rhs.type) return false;\n  switch (lhs.type) {\n    case Equipment_NONE: {\n      return true;\n    }\n    case Equipment_Weapon: {\n      return *(reinterpret_cast<const MyGame::Sample::WeaponT *>(lhs.value)) ==\n             *(reinterpret_cast<const MyGame::Sample::WeaponT *>(rhs.value));\n    }\n    default: {\n      return false;\n    }\n  }\n}\n\ninline bool operator!=(const EquipmentUnion &lhs, const EquipmentUnion &rhs) {\n    return !(lhs == rhs);\n}\n\ntemplate <bool B = false>\nbool VerifyEquipment(::flatbuffers::VerifierTemplate<B> &verifier, const void *obj, Equipment type);\ntemplate <bool B = false>\nbool VerifyEquipmentVector(::flatbuffers::VerifierTemplate<B> &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types);\n\nFLATBUFFERS_MANUALLY_ALIGNED_STRUCT(4) Vec3 FLATBUFFERS_FINAL_CLASS {\n private:\n  float x_;\n  float y_;\n  float z_;\n\n public:\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return Vec3TypeTable();\n  }\n  Vec3()\n      : x_(0),\n        y_(0),\n        z_(0) {\n  }\n  Vec3(float _x, float _y, float _z)\n      : x_(::flatbuffers::EndianScalar(_x)),\n        y_(::flatbuffers::EndianScalar(_y)),\n        z_(::flatbuffers::EndianScalar(_z)) {\n  }\n  float x() const {\n    return ::flatbuffers::EndianScalar(x_);\n  }\n  void mutate_x(float _x) {\n    ::flatbuffers::WriteScalar(&x_, _x);\n  }\n  float y() const {\n    return ::flatbuffers::EndianScalar(y_);\n  }\n  void mutate_y(float _y) {\n    ::flatbuffers::WriteScalar(&y_, _y);\n  }\n  float z() const {\n    return ::flatbuffers::EndianScalar(z_);\n  }\n  void mutate_z(float _z) {\n    ::flatbuffers::WriteScalar(&z_, _z);\n  }\n};\nFLATBUFFERS_STRUCT_END(Vec3, 12);\n\ninline bool operator==(const Vec3 &lhs, const Vec3 &rhs) {\n  return\n      (lhs.x() == rhs.x()) &&\n      (lhs.y() == rhs.y()) &&\n      (lhs.z() == rhs.z());\n}\n\ninline bool operator!=(const Vec3 &lhs, const Vec3 &rhs) {\n    return !(lhs == rhs);\n}\n\ntemplate <typename H>\ninline H AbslHashValue(H h, const Vec3 &obj) {\n  return H::combine(std::move(h), obj.x(), obj.y(), obj.z());\n}\n\nstruct MonsterT : public ::flatbuffers::NativeTable {\n  typedef Monster TableType;\n  std::unique_ptr<MyGame::Sample::Vec3> pos{};\n  int16_t mana = 150;\n  int16_t hp = 100;\n  std::string name{};\n  std::vector<uint8_t> inventory{};\n  MyGame::Sample::Color color = MyGame::Sample::Color_Blue;\n  std::vector<std::unique_ptr<MyGame::Sample::WeaponT>> weapons{};\n  MyGame::Sample::EquipmentUnion equipped{};\n  std::vector<MyGame::Sample::Vec3> path{};\n  MonsterT() = default;\n  MonsterT(const MonsterT &o);\n  MonsterT(MonsterT&&) FLATBUFFERS_NOEXCEPT = default;\n  MonsterT &operator=(MonsterT o) FLATBUFFERS_NOEXCEPT;\n};\n\nstruct Monster FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef MonsterT NativeTableType;\n  typedef MonsterBuilder Builder;\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return MonsterTypeTable();\n  }\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_POS = 4,\n    VT_MANA = 6,\n    VT_HP = 8,\n    VT_NAME = 10,\n    VT_INVENTORY = 14,\n    VT_COLOR = 16,\n    VT_WEAPONS = 18,\n    VT_EQUIPPED_TYPE = 20,\n    VT_EQUIPPED = 22,\n    VT_PATH = 24\n  };\n  const MyGame::Sample::Vec3 *pos() const {\n    return GetStruct<const MyGame::Sample::Vec3 *>(VT_POS);\n  }\n  MyGame::Sample::Vec3 *mutable_pos() {\n    return GetStruct<MyGame::Sample::Vec3 *>(VT_POS);\n  }\n  int16_t mana() const {\n    return GetField<int16_t>(VT_MANA, 150);\n  }\n  bool mutate_mana(int16_t _mana = 150) {\n    return SetField<int16_t>(VT_MANA, _mana, 150);\n  }\n  int16_t hp() const {\n    return GetField<int16_t>(VT_HP, 100);\n  }\n  bool mutate_hp(int16_t _hp = 100) {\n    return SetField<int16_t>(VT_HP, _hp, 100);\n  }\n  const ::flatbuffers::String *name() const {\n    return GetPointer<const ::flatbuffers::String *>(VT_NAME);\n  }\n  ::flatbuffers::String *mutable_name() {\n    return GetPointer<::flatbuffers::String *>(VT_NAME);\n  }\n  const ::flatbuffers::Vector<uint8_t> *inventory() const {\n    return GetPointer<const ::flatbuffers::Vector<uint8_t> *>(VT_INVENTORY);\n  }\n  ::flatbuffers::Vector<uint8_t> *mutable_inventory() {\n    return GetPointer<::flatbuffers::Vector<uint8_t> *>(VT_INVENTORY);\n  }\n  MyGame::Sample::Color color() const {\n    return static_cast<MyGame::Sample::Color>(GetField<int8_t>(VT_COLOR, 2));\n  }\n  bool mutate_color(MyGame::Sample::Color _color = static_cast<MyGame::Sample::Color>(2)) {\n    return SetField<int8_t>(VT_COLOR, static_cast<int8_t>(_color), 2);\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Sample::Weapon>> *weapons() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Sample::Weapon>> *>(VT_WEAPONS);\n  }\n  ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Sample::Weapon>> *mutable_weapons() {\n    return GetPointer<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Sample::Weapon>> *>(VT_WEAPONS);\n  }\n  MyGame::Sample::Equipment equipped_type() const {\n    return static_cast<MyGame::Sample::Equipment>(GetField<uint8_t>(VT_EQUIPPED_TYPE, 0));\n  }\n  const void *equipped() const {\n    return GetPointer<const void *>(VT_EQUIPPED);\n  }\n  template<typename T> const T *equipped_as() const;\n  const MyGame::Sample::Weapon *equipped_as_Weapon() const {\n    return equipped_type() == MyGame::Sample::Equipment_Weapon ? static_cast<const MyGame::Sample::Weapon *>(equipped()) : nullptr;\n  }\n  template<typename T> T *mutable_equipped_as();\n  MyGame::Sample::Weapon *mutable_equipped_as_Weapon() {\n    return equipped_type() == MyGame::Sample::Equipment_Weapon ? static_cast<MyGame::Sample::Weapon *>(mutable_equipped()) : nullptr;\n  }\n  void *mutable_equipped() {\n    return GetPointer<void *>(VT_EQUIPPED);\n  }\n  const ::flatbuffers::Vector<const MyGame::Sample::Vec3 *> *path() const {\n    return GetPointer<const ::flatbuffers::Vector<const MyGame::Sample::Vec3 *> *>(VT_PATH);\n  }\n  ::flatbuffers::Vector<const MyGame::Sample::Vec3 *> *mutable_path() {\n    return GetPointer<::flatbuffers::Vector<const MyGame::Sample::Vec3 *> *>(VT_PATH);\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyField<MyGame::Sample::Vec3>(verifier, VT_POS, 4) &&\n           VerifyField<int16_t>(verifier, VT_MANA, 2) &&\n           VerifyField<int16_t>(verifier, VT_HP, 2) &&\n           VerifyOffset(verifier, VT_NAME) &&\n           verifier.VerifyString(name()) &&\n           VerifyOffset(verifier, VT_INVENTORY) &&\n           verifier.VerifyVector(inventory()) &&\n           VerifyField<int8_t>(verifier, VT_COLOR, 1) &&\n           VerifyOffset(verifier, VT_WEAPONS) &&\n           verifier.VerifyVector(weapons()) &&\n           verifier.VerifyVectorOfTables(weapons()) &&\n           VerifyField<uint8_t>(verifier, VT_EQUIPPED_TYPE, 1) &&\n           VerifyOffset(verifier, VT_EQUIPPED) &&\n           VerifyEquipment(verifier, equipped(), equipped_type()) &&\n           VerifyOffset(verifier, VT_PATH) &&\n           verifier.VerifyVector(path()) &&\n           verifier.EndTable();\n  }\n  MonsterT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  void UnPackTo(MonsterT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  static ::flatbuffers::Offset<Monster> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n};\n\ntemplate<> inline const MyGame::Sample::Weapon *Monster::equipped_as<MyGame::Sample::Weapon>() const {\n  return equipped_as_Weapon();\n}\n\ntemplate<> inline MyGame::Sample::Weapon *Monster::mutable_equipped_as<MyGame::Sample::Weapon>() {\n  return mutable_equipped_as_Weapon();\n}\n\nstruct MonsterBuilder {\n  typedef Monster Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_pos(const MyGame::Sample::Vec3 *pos) {\n    fbb_.AddStruct(Monster::VT_POS, pos);\n  }\n  void add_mana(int16_t mana) {\n    fbb_.AddElement<int16_t>(Monster::VT_MANA, mana, 150);\n  }\n  void add_hp(int16_t hp) {\n    fbb_.AddElement<int16_t>(Monster::VT_HP, hp, 100);\n  }\n  void add_name(::flatbuffers::Offset<::flatbuffers::String> name) {\n    fbb_.AddOffset(Monster::VT_NAME, name);\n  }\n  void add_inventory(::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> inventory) {\n    fbb_.AddOffset(Monster::VT_INVENTORY, inventory);\n  }\n  void add_color(MyGame::Sample::Color color) {\n    fbb_.AddElement<int8_t>(Monster::VT_COLOR, static_cast<int8_t>(color), 2);\n  }\n  void add_weapons(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Sample::Weapon>>> weapons) {\n    fbb_.AddOffset(Monster::VT_WEAPONS, weapons);\n  }\n  void add_equipped_type(MyGame::Sample::Equipment equipped_type) {\n    fbb_.AddElement<uint8_t>(Monster::VT_EQUIPPED_TYPE, static_cast<uint8_t>(equipped_type), 0);\n  }\n  void add_equipped(::flatbuffers::Offset<void> equipped) {\n    fbb_.AddOffset(Monster::VT_EQUIPPED, equipped);\n  }\n  void add_path(::flatbuffers::Offset<::flatbuffers::Vector<const MyGame::Sample::Vec3 *>> path) {\n    fbb_.AddOffset(Monster::VT_PATH, path);\n  }\n  explicit MonsterBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<Monster> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<Monster>(end);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<Monster> CreateMonster(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    const MyGame::Sample::Vec3 *pos = nullptr,\n    int16_t mana = 150,\n    int16_t hp = 100,\n    ::flatbuffers::Offset<::flatbuffers::String> name = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> inventory = 0,\n    MyGame::Sample::Color color = MyGame::Sample::Color_Blue,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Sample::Weapon>>> weapons = 0,\n    MyGame::Sample::Equipment equipped_type = MyGame::Sample::Equipment_NONE,\n    ::flatbuffers::Offset<void> equipped = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<const MyGame::Sample::Vec3 *>> path = 0) {\n  MonsterBuilder builder_(_fbb);\n  builder_.add_path(path);\n  builder_.add_equipped(equipped);\n  builder_.add_weapons(weapons);\n  builder_.add_inventory(inventory);\n  builder_.add_name(name);\n  builder_.add_pos(pos);\n  builder_.add_hp(hp);\n  builder_.add_mana(mana);\n  builder_.add_equipped_type(equipped_type);\n  builder_.add_color(color);\n  return builder_.Finish();\n}\n\ninline ::flatbuffers::Offset<Monster> CreateMonsterDirect(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    const MyGame::Sample::Vec3 *pos = nullptr,\n    int16_t mana = 150,\n    int16_t hp = 100,\n    const char *name = nullptr,\n    const std::vector<uint8_t> *inventory = nullptr,\n    MyGame::Sample::Color color = MyGame::Sample::Color_Blue,\n    const std::vector<::flatbuffers::Offset<MyGame::Sample::Weapon>> *weapons = nullptr,\n    MyGame::Sample::Equipment equipped_type = MyGame::Sample::Equipment_NONE,\n    ::flatbuffers::Offset<void> equipped = 0,\n    const std::vector<MyGame::Sample::Vec3> *path = nullptr) {\n  auto name__ = name ? _fbb.CreateString(name) : 0;\n  auto inventory__ = inventory ? _fbb.CreateVector<uint8_t>(*inventory) : 0;\n  auto weapons__ = weapons ? _fbb.CreateVector<::flatbuffers::Offset<MyGame::Sample::Weapon>>(*weapons) : 0;\n  auto path__ = path ? _fbb.CreateVectorOfStructs<MyGame::Sample::Vec3>(*path) : 0;\n  return MyGame::Sample::CreateMonster(\n      _fbb,\n      pos,\n      mana,\n      hp,\n      name__,\n      inventory__,\n      color,\n      weapons__,\n      equipped_type,\n      equipped,\n      path__);\n}\n\n::flatbuffers::Offset<Monster> CreateMonster(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n\nstruct WeaponT : public ::flatbuffers::NativeTable {\n  typedef Weapon TableType;\n  std::string name{};\n  int16_t damage = 0;\n};\n\nstruct Weapon FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef WeaponT NativeTableType;\n  typedef WeaponBuilder Builder;\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return WeaponTypeTable();\n  }\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_NAME = 4,\n    VT_DAMAGE = 6\n  };\n  const ::flatbuffers::String *name() const {\n    return GetPointer<const ::flatbuffers::String *>(VT_NAME);\n  }\n  ::flatbuffers::String *mutable_name() {\n    return GetPointer<::flatbuffers::String *>(VT_NAME);\n  }\n  int16_t damage() const {\n    return GetField<int16_t>(VT_DAMAGE, 0);\n  }\n  bool mutate_damage(int16_t _damage = 0) {\n    return SetField<int16_t>(VT_DAMAGE, _damage, 0);\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyOffset(verifier, VT_NAME) &&\n           verifier.VerifyString(name()) &&\n           VerifyField<int16_t>(verifier, VT_DAMAGE, 2) &&\n           verifier.EndTable();\n  }\n  WeaponT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  void UnPackTo(WeaponT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  static ::flatbuffers::Offset<Weapon> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const WeaponT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n};\n\nstruct WeaponBuilder {\n  typedef Weapon Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_name(::flatbuffers::Offset<::flatbuffers::String> name) {\n    fbb_.AddOffset(Weapon::VT_NAME, name);\n  }\n  void add_damage(int16_t damage) {\n    fbb_.AddElement<int16_t>(Weapon::VT_DAMAGE, damage, 0);\n  }\n  explicit WeaponBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<Weapon> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<Weapon>(end);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<Weapon> CreateWeapon(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    ::flatbuffers::Offset<::flatbuffers::String> name = 0,\n    int16_t damage = 0) {\n  WeaponBuilder builder_(_fbb);\n  builder_.add_name(name);\n  builder_.add_damage(damage);\n  return builder_.Finish();\n}\n\ninline ::flatbuffers::Offset<Weapon> CreateWeaponDirect(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    const char *name = nullptr,\n    int16_t damage = 0) {\n  auto name__ = name ? _fbb.CreateString(name) : 0;\n  return MyGame::Sample::CreateWeapon(\n      _fbb,\n      name__,\n      damage);\n}\n\n::flatbuffers::Offset<Weapon> CreateWeapon(::flatbuffers::FlatBufferBuilder &_fbb, const WeaponT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n\n\ninline bool operator==(const MonsterT &lhs, const MonsterT &rhs) {\n  return\n      ((lhs.pos == rhs.pos) || (lhs.pos && rhs.pos && *lhs.pos == *rhs.pos)) &&\n      (lhs.mana == rhs.mana) &&\n      (lhs.hp == rhs.hp) &&\n      (lhs.name == rhs.name) &&\n      (lhs.inventory == rhs.inventory) &&\n      (lhs.color == rhs.color) &&\n      (lhs.weapons.size() == rhs.weapons.size() && std::equal(lhs.weapons.cbegin(), lhs.weapons.cend(), rhs.weapons.cbegin(), [](std::unique_ptr<MyGame::Sample::WeaponT> const &a, std::unique_ptr<MyGame::Sample::WeaponT> const &b) { return (a == b) || (a && b && *a == *b); })) &&\n      (lhs.equipped == rhs.equipped) &&\n      (lhs.path == rhs.path);\n}\n\ninline bool operator!=(const MonsterT &lhs, const MonsterT &rhs) {\n    return !(lhs == rhs);\n}\n\n\ninline MonsterT::MonsterT(const MonsterT &o)\n      : pos((o.pos) ? new MyGame::Sample::Vec3(*o.pos) : nullptr),\n        mana(o.mana),\n        hp(o.hp),\n        name(o.name),\n        inventory(o.inventory),\n        color(o.color),\n        equipped(o.equipped),\n        path(o.path) {\n  weapons.reserve(o.weapons.size());\n  for (const auto &weapons_ : o.weapons) { weapons.emplace_back((weapons_) ? new MyGame::Sample::WeaponT(*weapons_) : nullptr); }\n}\n\ninline MonsterT &MonsterT::operator=(MonsterT o) FLATBUFFERS_NOEXCEPT {\n  std::swap(pos, o.pos);\n  std::swap(mana, o.mana);\n  std::swap(hp, o.hp);\n  std::swap(name, o.name);\n  std::swap(inventory, o.inventory);\n  std::swap(color, o.color);\n  std::swap(weapons, o.weapons);\n  std::swap(equipped, o.equipped);\n  std::swap(path, o.path);\n  return *this;\n}\n\ninline MonsterT *Monster::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {\n  auto _o = std::unique_ptr<MonsterT>(new MonsterT());\n  UnPackTo(_o.get(), _resolver);\n  return _o.release();\n}\n\ninline void Monster::UnPackTo(MonsterT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {\n  (void)_o;\n  (void)_resolver;\n  { auto _e = pos(); if (_e) _o->pos = std::unique_ptr<MyGame::Sample::Vec3>(new MyGame::Sample::Vec3(*_e)); }\n  { auto _e = mana(); _o->mana = _e; }\n  { auto _e = hp(); _o->hp = _e; }\n  { auto _e = name(); if (_e) _o->name = _e->str(); }\n  { auto _e = inventory(); if (_e) { _o->inventory.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->inventory.begin()); } }\n  { auto _e = color(); _o->color = _e; }\n  { auto _e = weapons(); if (_e) { _o->weapons.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { if(_o->weapons[_i]) { _e->Get(_i)->UnPackTo(_o->weapons[_i].get(), _resolver); } else { _o->weapons[_i] = std::unique_ptr<MyGame::Sample::WeaponT>(_e->Get(_i)->UnPack(_resolver)); } } } else { _o->weapons.resize(0); } }\n  { auto _e = equipped_type(); _o->equipped.type = _e; }\n  { auto _e = equipped(); if (_e) _o->equipped.value = MyGame::Sample::EquipmentUnion::UnPack(_e, equipped_type(), _resolver); }\n  { auto _e = path(); if (_e) { _o->path.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->path[_i] = *_e->Get(_i); } } else { _o->path.resize(0); } }\n}\n\ninline ::flatbuffers::Offset<Monster> CreateMonster(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  return Monster::Pack(_fbb, _o, _rehasher);\n}\n\ninline ::flatbuffers::Offset<Monster> Monster::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  (void)_rehasher;\n  (void)_o;\n  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const MonsterT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;\n  auto _pos = _o->pos ? _o->pos.get() : nullptr;\n  auto _mana = _o->mana;\n  auto _hp = _o->hp;\n  auto _name = _o->name.empty() ? 0 : _fbb.CreateString(_o->name);\n  auto _inventory = _o->inventory.size() ? _fbb.CreateVector(_o->inventory) : 0;\n  auto _color = _o->color;\n  auto _weapons = _o->weapons.size() ? _fbb.CreateVector<::flatbuffers::Offset<MyGame::Sample::Weapon>> (_o->weapons.size(), [](size_t i, _VectorArgs *__va) { return MyGame::Sample::CreateWeapon(*__va->__fbb, __va->__o->weapons[i].get(), __va->__rehasher); }, &_va ) : 0;\n  auto _equipped_type = _o->equipped.type;\n  auto _equipped = _o->equipped.Pack(_fbb);\n  auto _path = _o->path.size() ? _fbb.CreateVectorOfStructs(_o->path) : 0;\n  return MyGame::Sample::CreateMonster(\n      _fbb,\n      _pos,\n      _mana,\n      _hp,\n      _name,\n      _inventory,\n      _color,\n      _weapons,\n      _equipped_type,\n      _equipped,\n      _path);\n}\n\n\ninline bool operator==(const WeaponT &lhs, const WeaponT &rhs) {\n  return\n      (lhs.name == rhs.name) &&\n      (lhs.damage == rhs.damage);\n}\n\ninline bool operator!=(const WeaponT &lhs, const WeaponT &rhs) {\n    return !(lhs == rhs);\n}\n\n\ninline WeaponT *Weapon::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {\n  auto _o = std::unique_ptr<WeaponT>(new WeaponT());\n  UnPackTo(_o.get(), _resolver);\n  return _o.release();\n}\n\ninline void Weapon::UnPackTo(WeaponT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {\n  (void)_o;\n  (void)_resolver;\n  { auto _e = name(); if (_e) _o->name = _e->str(); }\n  { auto _e = damage(); _o->damage = _e; }\n}\n\ninline ::flatbuffers::Offset<Weapon> CreateWeapon(::flatbuffers::FlatBufferBuilder &_fbb, const WeaponT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  return Weapon::Pack(_fbb, _o, _rehasher);\n}\n\ninline ::flatbuffers::Offset<Weapon> Weapon::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const WeaponT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  (void)_rehasher;\n  (void)_o;\n  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const WeaponT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;\n  auto _name = _o->name.empty() ? 0 : _fbb.CreateString(_o->name);\n  auto _damage = _o->damage;\n  return MyGame::Sample::CreateWeapon(\n      _fbb,\n      _name,\n      _damage);\n}\n\ntemplate <bool B>\ninline bool VerifyEquipment(::flatbuffers::VerifierTemplate<B> &verifier, const void *obj, Equipment type) {\n  switch (type) {\n    case Equipment_NONE: {\n      return true;\n    }\n    case Equipment_Weapon: {\n      auto ptr = reinterpret_cast<const MyGame::Sample::Weapon *>(obj);\n      return verifier.VerifyTable(ptr);\n    }\n    default: return true;\n  }\n}\n\ntemplate <bool B>\ninline bool VerifyEquipmentVector(::flatbuffers::VerifierTemplate<B> &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types) {\n  if (!values || !types) return !values && !types;\n  if (values->size() != types->size()) return false;\n  for (::flatbuffers::uoffset_t i = 0; i < values->size(); ++i) {\n    if (!VerifyEquipment(\n        verifier,  values->Get(i), types->GetEnum<Equipment>(i))) {\n      return false;\n    }\n  }\n  return true;\n}\n\ninline void *EquipmentUnion::UnPack(const void *obj, Equipment type, const ::flatbuffers::resolver_function_t *resolver) {\n  (void)resolver;\n  switch (type) {\n    case Equipment_Weapon: {\n      auto ptr = reinterpret_cast<const MyGame::Sample::Weapon *>(obj);\n      return ptr->UnPack(resolver);\n    }\n    default: return nullptr;\n  }\n}\n\ninline ::flatbuffers::Offset<void> EquipmentUnion::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ::flatbuffers::rehasher_function_t *_rehasher) const {\n  (void)_rehasher;\n  switch (type) {\n    case Equipment_Weapon: {\n      auto ptr = reinterpret_cast<const MyGame::Sample::WeaponT *>(value);\n      return CreateWeapon(_fbb, ptr, _rehasher).Union();\n    }\n    default: return 0;\n  }\n}\n\ninline EquipmentUnion::EquipmentUnion(const EquipmentUnion &u) : type(u.type), value(nullptr) {\n  switch (type) {\n    case Equipment_Weapon: {\n      value = new MyGame::Sample::WeaponT(*reinterpret_cast<MyGame::Sample::WeaponT *>(u.value));\n      break;\n    }\n    default:\n      break;\n  }\n}\n\ninline void EquipmentUnion::Reset() {\n  switch (type) {\n    case Equipment_Weapon: {\n      auto ptr = reinterpret_cast<MyGame::Sample::WeaponT *>(value);\n      delete ptr;\n      break;\n    }\n    default: break;\n  }\n  value = nullptr;\n  type = Equipment_NONE;\n}\n\ninline const ::flatbuffers::TypeTable *ColorTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_CHAR, 0, 0 },\n    { ::flatbuffers::ET_CHAR, 0, 0 },\n    { ::flatbuffers::ET_CHAR, 0, 0 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Sample::ColorTypeTable\n  };\n  static const char * const names[] = {\n    \"Red\",\n    \"Green\",\n    \"Blue\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_ENUM, 3, type_codes, type_refs, nullptr, nullptr, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *EquipmentTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_SEQUENCE, 0, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 0 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Sample::WeaponTypeTable\n  };\n  static const char * const names[] = {\n    \"NONE\",\n    \"Weapon\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_UNION, 2, type_codes, type_refs, nullptr, nullptr, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *Vec3TypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 }\n  };\n  static const int64_t values[] = { 0, 4, 8, 12 };\n  static const char * const names[] = {\n    \"x\",\n    \"y\",\n    \"z\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_STRUCT, 3, type_codes, nullptr, nullptr, values, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *MonsterTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_SEQUENCE, 0, 0 },\n    { ::flatbuffers::ET_SHORT, 0, -1 },\n    { ::flatbuffers::ET_SHORT, 0, -1 },\n    { ::flatbuffers::ET_STRING, 0, -1 },\n    { ::flatbuffers::ET_BOOL, 0, -1 },\n    { ::flatbuffers::ET_UCHAR, 1, -1 },\n    { ::flatbuffers::ET_CHAR, 0, 1 },\n    { ::flatbuffers::ET_SEQUENCE, 1, 2 },\n    { ::flatbuffers::ET_UTYPE, 0, 3 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 3 },\n    { ::flatbuffers::ET_SEQUENCE, 1, 0 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Sample::Vec3TypeTable,\n    MyGame::Sample::ColorTypeTable,\n    MyGame::Sample::WeaponTypeTable,\n    MyGame::Sample::EquipmentTypeTable\n  };\n  static const char * const names[] = {\n    \"pos\",\n    \"mana\",\n    \"hp\",\n    \"name\",\n    \"friendly\",\n    \"inventory\",\n    \"color\",\n    \"weapons\",\n    \"equipped_type\",\n    \"equipped\",\n    \"path\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_TABLE, 11, type_codes, type_refs, nullptr, nullptr, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *WeaponTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_STRING, 0, -1 },\n    { ::flatbuffers::ET_SHORT, 0, -1 }\n  };\n  static const char * const names[] = {\n    \"name\",\n    \"damage\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_TABLE, 2, type_codes, nullptr, nullptr, nullptr, names\n  };\n  return &tt;\n}\n\ninline const MyGame::Sample::Monster *GetMonster(const void *buf) {\n  return ::flatbuffers::GetRoot<MyGame::Sample::Monster>(buf);\n}\n\ninline const MyGame::Sample::Monster *GetSizePrefixedMonster(const void *buf) {\n  return ::flatbuffers::GetSizePrefixedRoot<MyGame::Sample::Monster>(buf);\n}\n\ninline Monster *GetMutableMonster(void *buf) {\n  return ::flatbuffers::GetMutableRoot<Monster>(buf);\n}\n\ninline MyGame::Sample::Monster *GetMutableSizePrefixedMonster(void *buf) {\n  return ::flatbuffers::GetMutableSizePrefixedRoot<MyGame::Sample::Monster>(buf);\n}\n\ntemplate <bool B = false>\ninline bool VerifyMonsterBuffer(\n    ::flatbuffers::VerifierTemplate<B> &verifier) {\n  return verifier.template VerifyBuffer<MyGame::Sample::Monster>(nullptr);\n}\n\ntemplate <bool B = false>\ninline bool VerifySizePrefixedMonsterBuffer(\n    ::flatbuffers::VerifierTemplate<B> &verifier) {\n  return verifier.template VerifySizePrefixedBuffer<MyGame::Sample::Monster>(nullptr);\n}\n\ninline void FinishMonsterBuffer(\n    ::flatbuffers::FlatBufferBuilder &fbb,\n    ::flatbuffers::Offset<MyGame::Sample::Monster> root) {\n  fbb.Finish(root);\n}\n\ninline void FinishSizePrefixedMonsterBuffer(\n    ::flatbuffers::FlatBufferBuilder &fbb,\n    ::flatbuffers::Offset<MyGame::Sample::Monster> root) {\n  fbb.FinishSizePrefixed(root);\n}\n\ninline std::unique_ptr<MyGame::Sample::MonsterT> UnPackMonster(\n    const void *buf,\n    const ::flatbuffers::resolver_function_t *res = nullptr) {\n  return std::unique_ptr<MyGame::Sample::MonsterT>(GetMonster(buf)->UnPack(res));\n}\n\ninline std::unique_ptr<MyGame::Sample::MonsterT> UnPackSizePrefixedMonster(\n    const void *buf,\n    const ::flatbuffers::resolver_function_t *res = nullptr) {\n  return std::unique_ptr<MyGame::Sample::MonsterT>(GetSizePrefixedMonster(buf)->UnPack(res));\n}\n\n}  // namespace Sample\n}  // namespace MyGame\n\n#endif  // FLATBUFFERS_GENERATED_MONSTER_MYGAME_SAMPLE_H_\n"
  },
  {
    "path": "samples/monster_generated.lobster",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\nimport flatbuffers\n\nnamespace MyGame.Sample\n\nenum Color:\n    Color_Red = 0\n    Color_Green = 1\n    Color_Blue = 2\n\nenum Equipment:\n    Equipment_NONE = 0\n    Equipment_Weapon = 1\n\nclass Vec3\n\nclass Monster\n\nclass Weapon\n\nclass Vec3 : flatbuffers.handle\n    def x() -> float:\n        return buf_.read_float32_le(pos_ + 0)\n    def y() -> float:\n        return buf_.read_float32_le(pos_ + 4)\n    def z() -> float:\n        return buf_.read_float32_le(pos_ + 8)\n\ndef CreateVec3(b_:flatbuffers.builder, x:float, y:float, z:float):\n    b_.Prep(4, 12)\n    b_.PrependFloat32(z)\n    b_.PrependFloat32(y)\n    b_.PrependFloat32(x)\n    return b_.Offset()\n\nclass Monster : flatbuffers.handle\n    def pos() -> MyGame.Sample.Vec3?:\n        let o = flatbuffers.field_struct(buf_, pos_, 4)\n        return if o: MyGame.Sample.Vec3 { buf_, o } else: nil\n    def mana() -> int:\n        return flatbuffers.field_int16(buf_, pos_, 6, 150)\n    def hp() -> int:\n        return flatbuffers.field_int16(buf_, pos_, 8, 100)\n    def name() -> string:\n        return flatbuffers.field_string(buf_, pos_, 10)\n    def inventory(i:int) -> int:\n        return read_uint8_le(buf_, buf_.flatbuffers.field_vector(pos_, 14) + i * 1)\n    def inventory_length() -> int:\n        return flatbuffers.field_vector_len(buf_, pos_, 14)\n    def color() -> Color:\n        return Color(flatbuffers.field_int8(buf_, pos_, 16, 2))\n    def weapons(i:int) -> MyGame.Sample.Weapon:\n        return MyGame.Sample.Weapon { buf_, flatbuffers.indirect(buf_, flatbuffers.field_vector(buf_, pos_, 18) + i * 4) }\n    def weapons_length() -> int:\n        return flatbuffers.field_vector_len(buf_, pos_, 18)\n    def equipped_type() -> Equipment:\n        return Equipment(flatbuffers.field_uint8(buf_, pos_, 20, 0))\n    def equipped_as_Weapon():\n        return MyGame.Sample.Weapon { buf_, flatbuffers.field_table(buf_, pos_, 22) }\n    def path(i:int) -> MyGame.Sample.Vec3:\n        return MyGame.Sample.Vec3 { buf_, flatbuffers.field_vector(buf_, pos_, 24) + i * 12 }\n    def path_length() -> int:\n        return flatbuffers.field_vector_len(buf_, pos_, 24)\n\ndef GetRootAsMonster(buf:string): return Monster { buf, flatbuffers.indirect(buf, 0) }\n\nstruct MonsterBuilder:\n    b_:flatbuffers.builder\n    def start():\n        b_.StartObject(11)\n        return this\n    def add_pos(pos:flatbuffers.offset):\n        b_.PrependStructSlot(0, pos)\n        return this\n    def add_mana(mana:int):\n        b_.PrependInt16Slot(1, mana, 150)\n        return this\n    def add_hp(hp:int):\n        b_.PrependInt16Slot(2, hp, 100)\n        return this\n    def add_name(name:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(3, name)\n        return this\n    def add_inventory(inventory:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(5, inventory)\n        return this\n    def add_color(color:Color):\n        b_.PrependInt8Slot(6, color, 2)\n        return this\n    def add_weapons(weapons:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(7, weapons)\n        return this\n    def add_equipped_type(equipped_type:Equipment):\n        b_.PrependUint8Slot(8, equipped_type, 0)\n        return this\n    def add_equipped(equipped:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(9, equipped)\n        return this\n    def add_path(path:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(10, path)\n        return this\n    def end():\n        return b_.EndObject()\n\ndef MonsterStartInventoryVector(b_:flatbuffers.builder, n_:int):\n    b_.StartVector(1, n_, 1)\ndef MonsterCreateInventoryVector(b_:flatbuffers.builder, v_:[int]):\n    b_.StartVector(1, v_.length, 1)\n    reverse(v_) e_: b_.PrependUint8(e_)\n    return b_.EndVector(v_.length)\n\ndef MonsterStartWeaponsVector(b_:flatbuffers.builder, n_:int):\n    b_.StartVector(4, n_, 4)\ndef MonsterCreateWeaponsVector(b_:flatbuffers.builder, v_:[flatbuffers.offset]):\n    b_.StartVector(4, v_.length, 4)\n    reverse(v_) e_: b_.PrependUOffsetTRelative(e_)\n    return b_.EndVector(v_.length)\n\ndef MonsterStartPathVector(b_:flatbuffers.builder, n_:int):\n    b_.StartVector(12, n_, 4)\n\nclass Weapon : flatbuffers.handle\n    def name() -> string:\n        return flatbuffers.field_string(buf_, pos_, 4)\n    def damage() -> int:\n        return flatbuffers.field_int16(buf_, pos_, 6, 0)\n\ndef GetRootAsWeapon(buf:string): return Weapon { buf, flatbuffers.indirect(buf, 0) }\n\nstruct WeaponBuilder:\n    b_:flatbuffers.builder\n    def start():\n        b_.StartObject(2)\n        return this\n    def add_name(name:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(0, name)\n        return this\n    def add_damage(damage:int):\n        b_.PrependInt16Slot(1, damage, 0)\n        return this\n    def end():\n        return b_.EndObject()\n\n"
  },
  {
    "path": "samples/monster_generated.swift",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// swiftlint:disable all\n// swiftformat:disable all\n\n#if canImport(Common)\nimport Common\n#endif\n\nimport FlatBuffers\n\npublic enum MyGame_Sample_Color: Int8, FlatbuffersVectorInitializable, Enum, Verifiable {\n  public typealias T = Int8\n  public static var byteSize: Int { return MemoryLayout<Int8>.size }\n  public var value: Int8 { return self.rawValue }\n  case red = 0\n  case green = 1\n  case blue = 2\n\n  public static var max: MyGame_Sample_Color { return .blue }\n  public static var min: MyGame_Sample_Color { return .red }\n}\n\nextension MyGame_Sample_Color: Encodable {\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.singleValueContainer()\n    switch self {\n    case .red: try container.encode(\"Red\")\n    case .green: try container.encode(\"Green\")\n    case .blue: try container.encode(\"Blue\")\n    }\n  }\n}\n\npublic enum MyGame_Sample_Equipment: UInt8, FlatbuffersVectorInitializable, UnionEnum {\n  public typealias T = UInt8\n\n  public init?(value: T) {\n    self.init(rawValue: value)\n  }\n\n  public static var byteSize: Int { return MemoryLayout<UInt8>.size }\n  public var value: UInt8 { return self.rawValue }\n  case none_ = 0\n  case weapon = 1\n\n  public static var max: MyGame_Sample_Equipment { return .weapon }\n  public static var min: MyGame_Sample_Equipment { return .none_ }\n}\n\nextension MyGame_Sample_Equipment: Encodable {\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.singleValueContainer()\n    switch self {\n    case .none_: try container.encode(\"NONE\")\n    case .weapon: try container.encode(\"Weapon\")\n    }\n  }\n}\n\npublic struct MyGame_Sample_EquipmentUnion {\n  public var type: MyGame_Sample_Equipment\n  public var value: NativeObject?\n  public init(_ v: NativeObject?, type: MyGame_Sample_Equipment) {\n    self.type = type\n    self.value = v\n  }\n  public func pack(builder: inout FlatBufferBuilder) -> Offset {\n    switch type {\n    case .weapon:\n      var __obj = value as? MyGame_Sample_WeaponT\n      return MyGame_Sample_Weapon.pack(&builder, obj: &__obj)\n    default: return Offset()\n    }\n  }\n}\npublic struct MyGame_Sample_Vec3: NativeStruct, FlatbuffersVectorInitializable, Verifiable, FlatbuffersInitializable, NativeObject {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n\n  private var _x: Float32\n  private var _y: Float32\n  private var _z: Float32\n\n  public init(_ bb: ByteBuffer, o: Int32) {\n    self = bb.read(def: Self.self, position: Int(o))\n  }\n\n  public init(x: Float32, y: Float32, z: Float32) {\n    _x = x\n    _y = y\n    _z = z\n  }\n\n  public init() {\n    _x = 0.0\n    _y = 0.0\n    _z = 0.0\n  }\n\n  public init(_ _t: borrowing MyGame_Sample_Vec3_Mutable) {\n    _x = _t.x\n    _y = _t.y\n    _z = _t.z\n  }\n\n  public var x: Float32 { _x }\n  public var y: Float32 { _y }\n  public var z: Float32 { _z }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    try verifier.inBuffer(position: position, of: MyGame_Sample_Vec3.self)\n  }\n}\n\nextension MyGame_Sample_Vec3: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case x = \"x\"\n    case y = \"y\"\n    case z = \"z\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    if x != 0.0 {\n      try container.encodeIfPresent(x, forKey: .x)\n    }\n    if y != 0.0 {\n      try container.encodeIfPresent(y, forKey: .y)\n    }\n    if z != 0.0 {\n      try container.encodeIfPresent(z, forKey: .z)\n    }\n  }\n}\n\npublic struct MyGame_Sample_Vec3_Mutable: FlatBufferStruct, FlatbuffersVectorInitializable {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Struct\n\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }\n\n  public var x: Float32 { return _accessor.readBuffer(of: Float32.self, at: 0) }\n  @discardableResult public func mutate(x: Float32) -> Bool { return _accessor.mutate(x, index: 0) }\n  public var y: Float32 { return _accessor.readBuffer(of: Float32.self, at: 4) }\n  @discardableResult public func mutate(y: Float32) -> Bool { return _accessor.mutate(y, index: 4) }\n  public var z: Float32 { return _accessor.readBuffer(of: Float32.self, at: 8) }\n  @discardableResult public func mutate(z: Float32) -> Bool { return _accessor.mutate(z, index: 8) }\n\n  public func unpack() -> MyGame_Sample_Vec3 {\n    return MyGame_Sample_Vec3(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Sample_Vec3?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Sample_Vec3) -> Offset {\n    return builder.create(struct: obj)\n  }\n}\n\npublic struct MyGame_Sample_Monster: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable, ObjectAPIPacker {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private struct VT {\n    static let pos: VOffset = 4\n    static let mana: VOffset = 6\n    static let hp: VOffset = 8\n    static let name: VOffset = 10\n    static let inventory: VOffset = 14\n    static let color: VOffset = 16\n    static let weapons: VOffset = 18\n    static let equippedType: VOffset = 20\n    static let equipped: VOffset = 22\n    static let path: VOffset = 24\n  }\n\n  public var pos: MyGame_Sample_Vec3? { let o = _accessor.offset(VT.pos); return o == 0 ? nil : _accessor.readBuffer(of: MyGame_Sample_Vec3.self, at: o) }\n  public var mutablePos: MyGame_Sample_Vec3_Mutable? { let o = _accessor.offset(VT.pos); return o == 0 ? nil : MyGame_Sample_Vec3_Mutable(_accessor.bb, o: o + _accessor.position) }\n  public var mana: Int16 { let o = _accessor.offset(VT.mana); return o == 0 ? 150 : _accessor.readBuffer(of: Int16.self, at: o) }\n  @discardableResult public func mutate(mana: Int16) -> Bool {let o = _accessor.offset(VT.mana);  return _accessor.mutate(mana, index: o) }\n  public var hp: Int16 { let o = _accessor.offset(VT.hp); return o == 0 ? 100 : _accessor.readBuffer(of: Int16.self, at: o) }\n  @discardableResult public func mutate(hp: Int16) -> Bool {let o = _accessor.offset(VT.hp);  return _accessor.mutate(hp, index: o) }\n  public var name: String? { let o = _accessor.offset(VT.name); return o == 0 ? nil : _accessor.string(at: o) }\n  public var nameSegmentArray: [UInt8]? { return _accessor.getVector(at: VT.name) }\n  public var inventory: FlatbufferVector<UInt8> { return _accessor.vector(at: VT.inventory, byteSize: 1) }\n  public func mutate(inventory: UInt8, at index: Int32) -> Bool { let o = _accessor.offset(VT.inventory); return _accessor.directMutate(inventory, index: _accessor.vector(at: o) + index * 1) }\n  public func withUnsafePointerToInventory<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.inventory, body: body) }\n  public var color: MyGame_Sample_Color { let o = _accessor.offset(VT.color); return o == 0 ? .blue : MyGame_Sample_Color(rawValue: _accessor.readBuffer(of: Int8.self, at: o)) ?? .blue }\n  @discardableResult public func mutate(color: MyGame_Sample_Color) -> Bool {let o = _accessor.offset(VT.color);  return _accessor.mutate(color.rawValue, index: o) }\n  public var weapons: FlatbufferVector<MyGame_Sample_Weapon> { return _accessor.vector(at: VT.weapons, byteSize: 4) }\n  public var equippedType: MyGame_Sample_Equipment { let o = _accessor.offset(VT.equippedType); return o == 0 ? .none_ : MyGame_Sample_Equipment(rawValue: _accessor.readBuffer(of: UInt8.self, at: o)) ?? .none_ }\n  public func equipped<T: FlatbuffersInitializable>(type: T.Type) -> T? { let o = _accessor.offset(VT.equipped); return o == 0 ? nil : _accessor.union(o) }\n  public var path: FlatbufferVector<MyGame_Sample_Vec3> { return _accessor.vector(at: VT.path, byteSize: 12) }\n  public var mutablePath: FlatbufferVector<MyGame_Sample_Vec3_Mutable> { return _accessor.vector(at: VT.path, byteSize: 12) }\n  public func withUnsafePointerToPath<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.path, body: body) }\n  public static func startMonster(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 11) }\n  public static func add(pos: MyGame_Sample_Vec3?, _ fbb: inout FlatBufferBuilder) { guard let pos = pos else { return }; fbb.create(struct: pos, position: VT.pos) }\n  public static func add(mana: Int16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: mana, def: 150, at: VT.mana) }\n  public static func add(hp: Int16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: hp, def: 100, at: VT.hp) }\n  public static func add(name: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: name, at: VT.name) }\n  public static func addVectorOf(inventory: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: inventory, at: VT.inventory) }\n  public static func add(color: MyGame_Sample_Color, _ fbb: inout FlatBufferBuilder) { fbb.add(element: color.rawValue, def: 2, at: VT.color) }\n  public static func addVectorOf(weapons: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: weapons, at: VT.weapons) }\n  public static func add(equippedType: MyGame_Sample_Equipment, _ fbb: inout FlatBufferBuilder) { fbb.add(element: equippedType.rawValue, def: 0, at: VT.equippedType) }\n  public static func add(equipped: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: equipped, at: VT.equipped) }\n  public static func addVectorOf(path: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: path, at: VT.path) }\n  public static func startVectorOfPath(_ size: Int, in builder: inout FlatBufferBuilder) {\n    builder.startVector(size * MemoryLayout<MyGame_Sample_Vec3>.size, elementSize: MemoryLayout<MyGame_Sample_Vec3>.alignment)\n  }\n  public static func endMonster(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n  public static func createMonster(\n    _ fbb: inout FlatBufferBuilder,\n    pos: MyGame_Sample_Vec3? = nil,\n    mana: Int16 = 150,\n    hp: Int16 = 100,\n    nameOffset name: Offset = Offset(),\n    inventoryVectorOffset inventory: Offset = Offset(),\n    color: MyGame_Sample_Color = .blue,\n    weaponsVectorOffset weapons: Offset = Offset(),\n    equippedType: MyGame_Sample_Equipment = .none_,\n    equippedOffset equipped: Offset = Offset(),\n    pathVectorOffset path: Offset = Offset()\n  ) -> Offset {\n    let __start = MyGame_Sample_Monster.startMonster(&fbb)\n    MyGame_Sample_Monster.add(pos: pos, &fbb)\n    MyGame_Sample_Monster.add(mana: mana, &fbb)\n    MyGame_Sample_Monster.add(hp: hp, &fbb)\n    MyGame_Sample_Monster.add(name: name, &fbb)\n    MyGame_Sample_Monster.addVectorOf(inventory: inventory, &fbb)\n    MyGame_Sample_Monster.add(color: color, &fbb)\n    MyGame_Sample_Monster.addVectorOf(weapons: weapons, &fbb)\n    MyGame_Sample_Monster.add(equippedType: equippedType, &fbb)\n    MyGame_Sample_Monster.add(equipped: equipped, &fbb)\n    MyGame_Sample_Monster.addVectorOf(path: path, &fbb)\n    return MyGame_Sample_Monster.endMonster(&fbb, start: __start)\n  }\n\n  public func unpack() -> MyGame_Sample_MonsterT {\n    return MyGame_Sample_MonsterT(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Sample_MonsterT?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Sample_MonsterT) -> Offset {\n    let __name: Offset\n    if let s = obj.name {\n      __name = builder.create(string: s)\n    } else {\n      __name = Offset()\n    }\n\n    let __inventory = builder.createVector(obj.inventory)\n    var __weapons__: [Offset] = []\n    for var i in obj.weapons {\n      __weapons__.append(MyGame_Sample_Weapon.pack(&builder, obj: &i))\n    }\n    let __weapons = builder.createVector(ofOffsets: __weapons__)\n    let __equipped = obj.equipped?.pack(builder: &builder) ?? Offset()\n    MyGame_Sample_Monster.startVectorOfPath(obj.path.count, in: &builder)\n    for val in obj.path {\n      builder.create(struct: val)\n    }\n    let __path = builder.endVector(len: obj.path.count)\n    let __root = MyGame_Sample_Monster.startMonster(&builder)\n    MyGame_Sample_Monster.add(pos: obj.pos, &builder)\n    MyGame_Sample_Monster.add(mana: obj.mana, &builder)\n    MyGame_Sample_Monster.add(hp: obj.hp, &builder)\n    MyGame_Sample_Monster.add(name: __name, &builder)\n    MyGame_Sample_Monster.addVectorOf(inventory: __inventory, &builder)\n    MyGame_Sample_Monster.add(color: obj.color, &builder)\n    MyGame_Sample_Monster.addVectorOf(weapons: __weapons, &builder)\n    if let o = obj.equipped?.type {\n      MyGame_Sample_Monster.add(equippedType: o, &builder)\n      MyGame_Sample_Monster.add(equipped: __equipped, &builder)\n    }\n\n    MyGame_Sample_Monster.addVectorOf(path: __path, &builder)\n    return MyGame_Sample_Monster.endMonster(&builder, start: __root)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    try _v.visit(field: VT.pos, fieldName: \"pos\", required: false, type: MyGame_Sample_Vec3.self)\n    try _v.visit(field: VT.mana, fieldName: \"mana\", required: false, type: Int16.self)\n    try _v.visit(field: VT.hp, fieldName: \"hp\", required: false, type: Int16.self)\n    try _v.visit(field: VT.name, fieldName: \"name\", required: false, type: ForwardOffset<String>.self)\n    try _v.visit(field: VT.inventory, fieldName: \"inventory\", required: false, type: ForwardOffset<Vector<UInt8, UInt8>>.self)\n    try _v.visit(field: VT.color, fieldName: \"color\", required: false, type: MyGame_Sample_Color.self)\n    try _v.visit(field: VT.weapons, fieldName: \"weapons\", required: false, type: ForwardOffset<Vector<ForwardOffset<MyGame_Sample_Weapon>, MyGame_Sample_Weapon>>.self)\n    try _v.visit(unionKey: VT.equippedType, unionField: VT.equipped, unionKeyName: \"equippedType\", fieldName: \"equipped\", required: false, completion: { (verifier, key: MyGame_Sample_Equipment, pos) in\n      switch key {\n      case .none_:\n        break // NOTE - SWIFT doesnt support none\n      case .weapon:\n        try ForwardOffset<MyGame_Sample_Weapon>.verify(&verifier, at: pos, of: MyGame_Sample_Weapon.self)\n      }\n    })\n    try _v.visit(field: VT.path, fieldName: \"path\", required: false, type: ForwardOffset<Vector<MyGame_Sample_Vec3, MyGame_Sample_Vec3>>.self)\n    _v.finish()\n  }\n}\n\nextension MyGame_Sample_Monster: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case pos = \"pos\"\n    case mana = \"mana\"\n    case hp = \"hp\"\n    case name = \"name\"\n    case inventory = \"inventory\"\n    case color = \"color\"\n    case weapons = \"weapons\"\n    case equippedType = \"equipped_type\"\n    case equipped = \"equipped\"\n    case path = \"path\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    try container.encodeIfPresent(pos, forKey: .pos)\n    if mana != 150 {\n      try container.encodeIfPresent(mana, forKey: .mana)\n    }\n    if hp != 100 {\n      try container.encodeIfPresent(hp, forKey: .hp)\n    }\n    try container.encodeIfPresent(name, forKey: .name)\n    try container.encodeIfPresent(inventory, forKey: .inventory)\n    if color != .blue {\n      try container.encodeIfPresent(color, forKey: .color)\n    }\n    try container.encodeIfPresent(weapons, forKey: .weapons)\n    if equippedType != .none_ {\n      try container.encodeIfPresent(equippedType, forKey: .equippedType)\n    }\n    switch equippedType {\n    case .weapon:\n      let _v = equipped(type: MyGame_Sample_Weapon.self)\n      try container.encodeIfPresent(_v, forKey: .equipped)\n    default: break;\n    }\n    try container.encodeIfPresent(path, forKey: .path)\n  }\n}\n\npublic class MyGame_Sample_MonsterT: NativeObject {\n\n  public var pos: MyGame_Sample_Vec3?\n  public var mana: Int16\n  public var hp: Int16\n  public var name: String?\n  public var inventory: [UInt8]\n  public var color: MyGame_Sample_Color\n  public var weapons: [MyGame_Sample_WeaponT?]\n  public var equipped: MyGame_Sample_EquipmentUnion?\n  public var path: [MyGame_Sample_Vec3]\n\n  public init(_ _t: borrowing MyGame_Sample_Monster) {\n    pos = _t.pos\n    mana = _t.mana\n    hp = _t.hp\n    name = _t.name\n    inventory = []\n    inventory.append(contentsOf: _t.inventory)\n    color = _t.color\n    weapons = []\n    for val in _t.weapons{\n        weapons.append(val.unpack())\n    }\n    switch _t.equippedType {\n    case .weapon:\n      let _v = _t.equipped(type: MyGame_Sample_Weapon.self)\n      equipped = MyGame_Sample_EquipmentUnion(_v?.unpack(), type: .weapon)\n    default: break\n    }\n    path = []\n    path.append(contentsOf: _t.path)\n  }\n\n  public init() {\n    pos = MyGame_Sample_Vec3()\n    mana = 150\n    hp = 100\n    inventory = []\n    color = .blue\n    weapons = []\n    path = []\n  }\n\n  public func serialize() -> ByteBuffer { return serialize(type: MyGame_Sample_Monster.self) }\n\n}\npublic struct MyGame_Sample_Weapon: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable, ObjectAPIPacker {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private struct VT {\n    static let name: VOffset = 4\n    static let damage: VOffset = 6\n  }\n\n  public var name: String? { let o = _accessor.offset(VT.name); return o == 0 ? nil : _accessor.string(at: o) }\n  public var nameSegmentArray: [UInt8]? { return _accessor.getVector(at: VT.name) }\n  public var damage: Int16 { let o = _accessor.offset(VT.damage); return o == 0 ? 0 : _accessor.readBuffer(of: Int16.self, at: o) }\n  @discardableResult public func mutate(damage: Int16) -> Bool {let o = _accessor.offset(VT.damage);  return _accessor.mutate(damage, index: o) }\n  public static func startWeapon(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 2) }\n  public static func add(name: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: name, at: VT.name) }\n  public static func add(damage: Int16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: damage, def: 0, at: VT.damage) }\n  public static func endWeapon(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n  public static func createWeapon(\n    _ fbb: inout FlatBufferBuilder,\n    nameOffset name: Offset = Offset(),\n    damage: Int16 = 0\n  ) -> Offset {\n    let __start = MyGame_Sample_Weapon.startWeapon(&fbb)\n    MyGame_Sample_Weapon.add(name: name, &fbb)\n    MyGame_Sample_Weapon.add(damage: damage, &fbb)\n    return MyGame_Sample_Weapon.endWeapon(&fbb, start: __start)\n  }\n\n  public func unpack() -> MyGame_Sample_WeaponT {\n    return MyGame_Sample_WeaponT(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Sample_WeaponT?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Sample_WeaponT) -> Offset {\n    let __name: Offset\n    if let s = obj.name {\n      __name = builder.create(string: s)\n    } else {\n      __name = Offset()\n    }\n\n    let __root = MyGame_Sample_Weapon.startWeapon(&builder)\n    MyGame_Sample_Weapon.add(name: __name, &builder)\n    MyGame_Sample_Weapon.add(damage: obj.damage, &builder)\n    return MyGame_Sample_Weapon.endWeapon(&builder, start: __root)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    try _v.visit(field: VT.name, fieldName: \"name\", required: false, type: ForwardOffset<String>.self)\n    try _v.visit(field: VT.damage, fieldName: \"damage\", required: false, type: Int16.self)\n    _v.finish()\n  }\n}\n\nextension MyGame_Sample_Weapon: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case name = \"name\"\n    case damage = \"damage\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    try container.encodeIfPresent(name, forKey: .name)\n    if damage != 0 {\n      try container.encodeIfPresent(damage, forKey: .damage)\n    }\n  }\n}\n\npublic class MyGame_Sample_WeaponT: NativeObject {\n\n  public var name: String?\n  public var damage: Int16\n\n  public init(_ _t: borrowing MyGame_Sample_Weapon) {\n    name = _t.name\n    damage = _t.damage\n  }\n\n  public init() {\n    damage = 0\n  }\n\n  public func serialize() -> ByteBuffer { return serialize(type: MyGame_Sample_Weapon.self) }\n\n}\n"
  },
  {
    "path": "samples/monsterdata.json",
    "content": "{\n  \"pos\": {\n    \"x\": 1.0,\n    \"y\": 2.0,\n    \"z\": 3.0\n  },\n  \"hp\": 300,\n  \"name\": \"Orc\",\n  \"weapons\": [\n    {\n      \"name\": \"axe\",\n      \"damage\": 100\n    },\n    {\n      \"name\": \"bow\",\n      \"damage\": 90\n    }\n  ],\n  \"equipped_type\": \"Weapon\",\n  \"equipped\": {\n    \"name\": \"bow\",\n    \"damage\": 90\n  }\n}\n"
  },
  {
    "path": "samples/php_sample.sh",
    "content": "#!/bin/bash\n#\n# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n# Note: This script runs on Mac and Linux. It requires `php` to be installed\n# and `flatc` to be built (using `cmake` in the root directory).\n\nsampledir=$(cd $(dirname $BASH_SOURCE) && pwd)\nrootdir=$(cd $sampledir/.. && pwd)\ncurrentdir=$(pwd)\n\nif [[ \"$sampledir\" != \"$currentdir\" ]]; then\n  echo Error: This script must be run from inside the $sampledir directory.\n  echo You executed it from the $currentdir directory.\n  exit 1\nfi\n\n# Run `flatc`. Note: This requires you to compile using `cmake` from the\n# root `/flatbuffers` directory.\nif [ -e ../flatc ]; then\n  ../flatc --php monster.fbs\nelif [ -e ../Debug/flatc ]; then\n  ../Debug/flatc --php monster.fbs\nelse\n  echo 'flatc' could not be found. Make sure to build FlatBuffers from the \\\n        $rootdir directory.\n  exit 1\nfi\n\necho Running the PHP sample.\n\n# Execute the sample.\nphp SampleBinary.php\n\n# Clean up temporary files.\nrm -rf MyGame/\n"
  },
  {
    "path": "samples/python_sample.sh",
    "content": "#!/bin/bash\n#\n# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n# Note: This script runs on Mac and Linux. It requires `python` to be installed\n# and `flatc` to be built (using `cmake` in the root directory).\n\nsampledir=$(cd $(dirname $BASH_SOURCE) && pwd)\nrootdir=$(cd $sampledir/.. && pwd)\ncurrentdir=$(pwd)\n\nif [[ \"$sampledir\" != \"$currentdir\" ]]; then\n  echo Error: This script must be run from inside the $sampledir directory.\n  echo You executed it from the $currentdir directory.\n  exit 1\nfi\n\n# Run `flatc`. Note: This requires you to compile using `cmake` from the\n# root `/flatbuffers` directory.\nif [ -e ../flatc ]; then\n  ../flatc --python monster.fbs\nelif [ -e ../Debug/flatc ]; then\n  ../Debug/flatc --python monster.fbs\nelse\n  echo 'flatc' could not be found. Make sure to build FlatBuffers from the \\\n       $rootdir directory.\n  exit 1\nfi\n\necho Running the Python sample.\n\n# Execute the sample.\npython sample_binary.py\n\n# Clean up the temporary files.\nrm -rf MyGame\n"
  },
  {
    "path": "samples/rust_generated/mod.rs",
    "content": "// Automatically generated by the Flatbuffers compiler. Do not modify.\n// @generated\npub mod my_game {\n    use super::*;\n    pub mod sample {\n        use super::*;\n        mod color_generated;\n        pub use self::color_generated::*;\n        mod equipment_generated;\n        pub use self::equipment_generated::*;\n        mod vec_3_generated;\n        pub use self::vec_3_generated::*;\n        mod monster_generated;\n        pub use self::monster_generated::*;\n        mod weapon_generated;\n        pub use self::weapon_generated::*;\n    } // sample\n} // my_game\n"
  },
  {
    "path": "samples/rust_generated/my_game/sample/color_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MIN_COLOR: i8 = 0;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MAX_COLOR: i8 = 2;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n#[allow(non_camel_case_types)]\npub const ENUM_VALUES_COLOR: [Color; 3] = [\n    Color::Red,\n    Color::Green,\n    Color::Blue,\n];\n\n#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n#[repr(transparent)]\npub struct Color(pub i8);\n\n#[allow(non_upper_case_globals)]\nimpl Color {\n    pub const Red: Self = Self(0);\n    pub const Green: Self = Self(1);\n    pub const Blue: Self = Self(2);\n\n    pub const ENUM_MIN: i8 = 0;\n    pub const ENUM_MAX: i8 = 2;\n    pub const ENUM_VALUES: &'static [Self] = &[\n        Self::Red,\n        Self::Green,\n        Self::Blue,\n    ];\n\n    /// Returns the variant's name or \"\" if unknown.\n    pub fn variant_name(self) -> Option<&'static str> {\n        match self {\n            Self::Red => Some(\"Red\"),\n            Self::Green => Some(\"Green\"),\n            Self::Blue => Some(\"Blue\"),\n            _ => None,\n        }\n    }\n}\n\nimpl ::core::fmt::Debug for Color {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        if let Some(name) = self.variant_name() {\n            f.write_str(name)\n        } else {\n            f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n        }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Color {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<i8>(buf, loc) };\n        Self(b)\n    }\n}\n\nimpl ::flatbuffers::Push for Color {\n    type Output = Color;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<i8>(dst, self.0) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for Color {\n    type Scalar = i8;\n\n    #[inline]\n    fn to_little_endian(self) -> i8 {\n        self.0.to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: i8) -> Self {\n        let b = i8::from_le(v);\n        Self(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for Color {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        i8::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for Color {}\n"
  },
  {
    "path": "samples/rust_generated/my_game/sample/equipment_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MIN_EQUIPMENT: u8 = 0;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MAX_EQUIPMENT: u8 = 1;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n#[allow(non_camel_case_types)]\npub const ENUM_VALUES_EQUIPMENT: [Equipment; 2] = [\n    Equipment::NONE,\n    Equipment::Weapon,\n];\n\n#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n#[repr(transparent)]\npub struct Equipment(pub u8);\n\n#[allow(non_upper_case_globals)]\nimpl Equipment {\n    pub const NONE: Self = Self(0);\n    pub const Weapon: Self = Self(1);\n\n    pub const ENUM_MIN: u8 = 0;\n    pub const ENUM_MAX: u8 = 1;\n    pub const ENUM_VALUES: &'static [Self] = &[\n        Self::NONE,\n        Self::Weapon,\n    ];\n\n    /// Returns the variant's name or \"\" if unknown.\n    pub fn variant_name(self) -> Option<&'static str> {\n        match self {\n            Self::NONE => Some(\"NONE\"),\n            Self::Weapon => Some(\"Weapon\"),\n            _ => None,\n        }\n    }\n}\n\nimpl ::core::fmt::Debug for Equipment {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        if let Some(name) = self.variant_name() {\n            f.write_str(name)\n        } else {\n            f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n        }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Equipment {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<u8>(buf, loc) };\n        Self(b)\n    }\n}\n\nimpl ::flatbuffers::Push for Equipment {\n    type Output = Equipment;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<u8>(dst, self.0) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for Equipment {\n    type Scalar = u8;\n\n    #[inline]\n    fn to_little_endian(self) -> u8 {\n        self.0.to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: u8) -> Self {\n        let b = u8::from_le(v);\n        Self(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for Equipment {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        u8::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for Equipment {}\n\npub struct EquipmentUnionTableOffset {}\n\n#[allow(clippy::upper_case_acronyms)]\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub enum EquipmentT {\n    NONE,\n    Weapon(alloc::boxed::Box<WeaponT>),\n}\n\nimpl Default for EquipmentT {\n    fn default() -> Self {\n        Self::NONE\n    }\n}\n\nimpl EquipmentT {\n    pub fn equipment_type(&self) -> Equipment {\n        match self {\n            Self::NONE => Equipment::NONE,\n            Self::Weapon(_) => Equipment::Weapon,\n        }\n    }\n\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(&self, fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>) -> Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>> {\n        match self {\n            Self::NONE => None,\n            Self::Weapon(v) => Some(v.pack(fbb).as_union_value()),\n        }\n    }\n\n    /// If the union variant matches, return the owned WeaponT, setting the union to NONE.\n    pub fn take_weapon(&mut self) -> Option<alloc::boxed::Box<WeaponT>> {\n        if let Self::Weapon(_) = self {\n            let v = ::core::mem::replace(self, Self::NONE);\n            if let Self::Weapon(w) = v {\n                Some(w)\n            } else {\n                unreachable!()\n            }\n        } else {\n            None\n        }\n    }\n\n    /// If the union variant matches, return a reference to the WeaponT.\n    pub fn as_weapon(&self) -> Option<&WeaponT> {\n        if let Self::Weapon(v) = self { Some(v.as_ref()) } else { None }\n    }\n\n    /// If the union variant matches, return a mutable reference to the WeaponT.\n    pub fn as_weapon_mut(&mut self) -> Option<&mut WeaponT> {\n        if let Self::Weapon(v) = self { Some(v.as_mut()) } else { None }\n    }\n}\n\n"
  },
  {
    "path": "samples/rust_generated/my_game/sample/monster_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum MonsterOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct Monster<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Monster<'a> {\n    type Inner = Monster<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> Monster<'a> {\n    pub const VT_POS: ::flatbuffers::VOffsetT = 4;\n    pub const VT_MANA: ::flatbuffers::VOffsetT = 6;\n    pub const VT_HP: ::flatbuffers::VOffsetT = 8;\n    pub const VT_NAME: ::flatbuffers::VOffsetT = 10;\n    pub const VT_INVENTORY: ::flatbuffers::VOffsetT = 14;\n    pub const VT_COLOR: ::flatbuffers::VOffsetT = 16;\n    pub const VT_WEAPONS: ::flatbuffers::VOffsetT = 18;\n    pub const VT_EQUIPPED_TYPE: ::flatbuffers::VOffsetT = 20;\n    pub const VT_EQUIPPED: ::flatbuffers::VOffsetT = 22;\n    pub const VT_PATH: ::flatbuffers::VOffsetT = 24;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.Sample.Monster\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        Monster { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args MonsterArgs<'args>\n    ) -> ::flatbuffers::WIPOffset<Monster<'bldr>> {\n        let mut builder = MonsterBuilder::new(_fbb);\n        if let Some(x) = args.path { builder.add_path(x); }\n        if let Some(x) = args.equipped { builder.add_equipped(x); }\n        if let Some(x) = args.weapons { builder.add_weapons(x); }\n        if let Some(x) = args.inventory { builder.add_inventory(x); }\n        if let Some(x) = args.name { builder.add_name(x); }\n        if let Some(x) = args.pos { builder.add_pos(x); }\n        builder.add_hp(args.hp);\n        builder.add_mana(args.mana);\n        builder.add_equipped_type(args.equipped_type);\n        builder.add_color(args.color);\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> MonsterT {\n        let pos = self.pos().map(|x| {\n            x.unpack()\n        });\n        let mana = self.mana();\n        let hp = self.hp();\n        let name = self.name().map(|x| {\n            alloc::string::ToString::to_string(x)\n        });\n        let inventory = self.inventory().map(|x| {\n            x.into_iter().collect()\n        });\n        let color = self.color();\n        let weapons = self.weapons().map(|x| {\n            x.iter().map(|t| t.unpack()).collect()\n        });\n        let equipped = match self.equipped_type() {\n            Equipment::NONE => EquipmentT::NONE,\n            Equipment::Weapon => EquipmentT::Weapon(alloc::boxed::Box::new(\n                self.equipped_as_weapon()\n                    .expect(\"Invalid union table, expected `Equipment::Weapon`.\")\n                    .unpack()\n            )),\n            _ => EquipmentT::NONE,\n        };\n        let path = self.path().map(|x| {\n            x.iter().map(|t| t.unpack()).collect()\n        });\n        MonsterT {\n            pos,\n            mana,\n            hp,\n            name,\n            inventory,\n            color,\n            weapons,\n            equipped,\n            path,\n        }\n    }\n\n    #[inline]\n    pub fn pos(&self) -> Option<&'a Vec3> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<Vec3>(Monster::VT_POS, None)}\n    }\n\n    #[inline]\n    pub fn mana(&self) -> i16 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i16>(Monster::VT_MANA, Some(150)).unwrap()}\n    }\n\n    #[inline]\n    pub fn hp(&self) -> i16 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i16>(Monster::VT_HP, Some(100)).unwrap()}\n    }\n\n    #[inline]\n    pub fn name(&self) -> Option<&'a str> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<&str>>(Monster::VT_NAME, None)}\n    }\n\n    #[inline]\n    pub fn inventory(&self) -> Option<::flatbuffers::Vector<'a, u8>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, u8>>>(Monster::VT_INVENTORY, None)}\n    }\n\n    #[inline]\n    pub fn color(&self) -> Color {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<Color>(Monster::VT_COLOR, Some(Color::Blue)).unwrap()}\n    }\n\n    #[inline]\n    pub fn weapons(&self) -> Option<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Weapon<'a>>>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Weapon>>>>(Monster::VT_WEAPONS, None)}\n    }\n\n    #[inline]\n    pub fn equipped_type(&self) -> Equipment {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<Equipment>(Monster::VT_EQUIPPED_TYPE, Some(Equipment::NONE)).unwrap()}\n    }\n\n    #[inline]\n    pub fn equipped(&self) -> Option<::flatbuffers::Table<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Table<'a>>>(Monster::VT_EQUIPPED, None)}\n    }\n\n    #[inline]\n    pub fn path(&self) -> Option<::flatbuffers::Vector<'a, Vec3>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, Vec3>>>(Monster::VT_PATH, None)}\n    }\n\n    #[inline]\n    #[allow(non_snake_case)]\n    pub fn equipped_as_weapon(&self) -> Option<Weapon<'a>> {\n        if self.equipped_type() == Equipment::Weapon {\n            self.equipped().map(|t| {\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid union in this slot\n                unsafe { Weapon::init_from_table(t) }\n            })\n        } else {\n            None\n        }\n    }\n}\n\nimpl ::flatbuffers::Verifiable for Monster<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<Vec3>(\"pos\", Self::VT_POS, false)?\n            .visit_field::<i16>(\"mana\", Self::VT_MANA, false)?\n            .visit_field::<i16>(\"hp\", Self::VT_HP, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<&str>>(\"name\", Self::VT_NAME, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, u8>>>(\"inventory\", Self::VT_INVENTORY, false)?\n            .visit_field::<Color>(\"color\", Self::VT_COLOR, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, ::flatbuffers::ForwardsUOffset<Weapon>>>>(\"weapons\", Self::VT_WEAPONS, false)?\n            .visit_union::<Equipment, _>(\"equipped_type\", Self::VT_EQUIPPED_TYPE, \"equipped\", Self::VT_EQUIPPED, false, |key, v, pos| {\n                match key {\n                    Equipment::Weapon => v.verify_union_variant::<::flatbuffers::ForwardsUOffset<Weapon>>(\"Equipment::Weapon\", pos),\n                    _ => Ok(()),\n                }\n            })?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, Vec3>>>(\"path\", Self::VT_PATH, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct MonsterArgs<'a> {\n    pub pos: Option<&'a Vec3>,\n    pub mana: i16,\n    pub hp: i16,\n    pub name: Option<::flatbuffers::WIPOffset<&'a str>>,\n    pub inventory: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, u8>>>,\n    pub color: Color,\n    pub weapons: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Weapon<'a>>>>>,\n    pub equipped_type: Equipment,\n    pub equipped: Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>>,\n    pub path: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, Vec3>>>,\n}\n\nimpl<'a> Default for MonsterArgs<'a> {\n    #[inline]\n    fn default() -> Self {\n        MonsterArgs {\n            pos: None,\n            mana: 150,\n            hp: 100,\n            name: None,\n            inventory: None,\n            color: Color::Blue,\n            weapons: None,\n            equipped_type: Equipment::NONE,\n            equipped: None,\n            path: None,\n        }\n    }\n}\n\npub struct MonsterBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> MonsterBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_pos(&mut self, pos: &Vec3) {\n        self.fbb_.push_slot_always::<&Vec3>(Monster::VT_POS, pos);\n    }\n\n    #[inline]\n    pub fn add_mana(&mut self, mana: i16) {\n        self.fbb_.push_slot::<i16>(Monster::VT_MANA, mana, 150);\n    }\n\n    #[inline]\n    pub fn add_hp(&mut self, hp: i16) {\n        self.fbb_.push_slot::<i16>(Monster::VT_HP, hp, 100);\n    }\n\n    #[inline]\n    pub fn add_name(&mut self, name: ::flatbuffers::WIPOffset<&'b  str>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_NAME, name);\n    }\n\n    #[inline]\n    pub fn add_inventory(&mut self, inventory: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , u8>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_INVENTORY, inventory);\n    }\n\n    #[inline]\n    pub fn add_color(&mut self, color: Color) {\n        self.fbb_.push_slot::<Color>(Monster::VT_COLOR, color, Color::Blue);\n    }\n\n    #[inline]\n    pub fn add_weapons(&mut self, weapons: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , ::flatbuffers::ForwardsUOffset<Weapon<'b >>>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_WEAPONS, weapons);\n    }\n\n    #[inline]\n    pub fn add_equipped_type(&mut self, equipped_type: Equipment) {\n        self.fbb_.push_slot::<Equipment>(Monster::VT_EQUIPPED_TYPE, equipped_type, Equipment::NONE);\n    }\n\n    #[inline]\n    pub fn add_equipped(&mut self, equipped: ::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_EQUIPPED, equipped);\n    }\n\n    #[inline]\n    pub fn add_path(&mut self, path: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , Vec3>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_PATH, path);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> MonsterBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        MonsterBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<Monster<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for Monster<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"Monster\");\n        ds.field(\"pos\", &self.pos());\n        ds.field(\"mana\", &self.mana());\n        ds.field(\"hp\", &self.hp());\n        ds.field(\"name\", &self.name());\n        ds.field(\"inventory\", &self.inventory());\n        ds.field(\"color\", &self.color());\n        ds.field(\"weapons\", &self.weapons());\n        ds.field(\"equipped_type\", &self.equipped_type());\n        match self.equipped_type() {\n            Equipment::Weapon => {\n                if let Some(x) = self.equipped_as_weapon() {\n                    ds.field(\"equipped\", &x)\n                } else {\n                    ds.field(\"equipped\", &\"InvalidFlatbuffer: Union discriminant does not match value.\")\n                }\n            },\n            _ => {\n                let x: Option<()> = None;\n                ds.field(\"equipped\", &x)\n            },\n        };\n        ds.field(\"path\", &self.path());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct MonsterT {\n    pub pos: Option<Vec3T>,\n    pub mana: i16,\n    pub hp: i16,\n    pub name: Option<alloc::string::String>,\n    pub inventory: Option<alloc::vec::Vec<u8>>,\n    pub color: Color,\n    pub weapons: Option<alloc::vec::Vec<WeaponT>>,\n    pub equipped: EquipmentT,\n    pub path: Option<alloc::vec::Vec<Vec3T>>,\n}\n\nimpl Default for MonsterT {\n    fn default() -> Self {\n        Self {\n            pos: None,\n            mana: 150,\n            hp: 100,\n            name: None,\n            inventory: None,\n            color: Color::Blue,\n            weapons: None,\n            equipped: EquipmentT::NONE,\n            path: None,\n        }\n    }\n}\n\nimpl MonsterT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<Monster<'b>> {\n        let pos_tmp = self.pos.as_ref().map(|x| x.pack());\n        let pos = pos_tmp.as_ref();\n        let mana = self.mana;\n        let hp = self.hp;\n        let name = self.name.as_ref().map(|x|{\n            _fbb.create_string(x)\n        });\n        let inventory = self.inventory.as_ref().map(|x|{\n            _fbb.create_vector(x)\n        });\n        let color = self.color;\n        let weapons = self.weapons.as_ref().map(|x|{\n            let w: alloc::vec::Vec<_> = x.iter().map(|t| t.pack(_fbb)).collect();_fbb.create_vector(&w)\n        });\n        let equipped_type = self.equipped.equipment_type();\n        let equipped = self.equipped.pack(_fbb);\n        let path = self.path.as_ref().map(|x|{\n            let w: alloc::vec::Vec<_> = x.iter().map(|t| t.pack()).collect();_fbb.create_vector(&w)\n        });\n        Monster::create(_fbb, &MonsterArgs{\n            pos,\n            mana,\n            hp,\n            name,\n            inventory,\n            color,\n            weapons,\n            equipped_type,\n            equipped,\n            path,\n        })\n    }\n}\n\n/// Verifies that a buffer of bytes contains a `Monster`\n/// and returns it.\n/// Note that verification is still experimental and may not\n/// catch every error, or be maximally performant. For the\n/// previous, unchecked, behavior use\n/// `root_as_monster_unchecked`.\n#[inline]\npub fn root_as_monster(buf: &[u8]) -> Result<Monster<'_>, ::flatbuffers::InvalidFlatbuffer> {\n    ::flatbuffers::root::<Monster>(buf)\n}\n\n/// Verifies that a buffer of bytes contains a size prefixed\n/// `Monster` and returns it.\n/// Note that verification is still experimental and may not\n/// catch every error, or be maximally performant. For the\n/// previous, unchecked, behavior use\n/// `size_prefixed_root_as_monster_unchecked`.\n#[inline]\npub fn size_prefixed_root_as_monster(buf: &[u8]) -> Result<Monster<'_>, ::flatbuffers::InvalidFlatbuffer> {\n    ::flatbuffers::size_prefixed_root::<Monster>(buf)\n}\n\n/// Verifies, with the given options, that a buffer of bytes\n/// contains a `Monster` and returns it.\n/// Note that verification is still experimental and may not\n/// catch every error, or be maximally performant. For the\n/// previous, unchecked, behavior use\n/// `root_as_monster_unchecked`.\n#[inline]\npub fn root_as_monster_with_opts<'b, 'o>(\n    opts: &'o ::flatbuffers::VerifierOptions,\n    buf: &'b [u8],\n) -> Result<Monster<'b>, ::flatbuffers::InvalidFlatbuffer> {\n    ::flatbuffers::root_with_opts::<Monster<'b>>(opts, buf)\n}\n\n/// Verifies, with the given verifier options, that a buffer of\n/// bytes contains a size prefixed `Monster` and returns\n/// it. Note that verification is still experimental and may not\n/// catch every error, or be maximally performant. For the\n/// previous, unchecked, behavior use\n/// `root_as_monster_unchecked`.\n#[inline]\npub fn size_prefixed_root_as_monster_with_opts<'b, 'o>(\n    opts: &'o ::flatbuffers::VerifierOptions,\n    buf: &'b [u8],\n) -> Result<Monster<'b>, ::flatbuffers::InvalidFlatbuffer> {\n    ::flatbuffers::size_prefixed_root_with_opts::<Monster<'b>>(opts, buf)\n}\n\n/// Assumes, without verification, that a buffer of bytes contains a Monster and returns it.\n/// # Safety\n/// Callers must trust the given bytes do indeed contain a valid `Monster`.\n#[inline]\npub unsafe fn root_as_monster_unchecked(buf: &[u8]) -> Monster<'_> {\n    unsafe { ::flatbuffers::root_unchecked::<Monster>(buf) }\n}\n\n/// Assumes, without verification, that a buffer of bytes contains a size prefixed Monster and returns it.\n/// # Safety\n/// Callers must trust the given bytes do indeed contain a valid size prefixed `Monster`.\n#[inline]\npub unsafe fn size_prefixed_root_as_monster_unchecked(buf: &[u8]) -> Monster<'_> {\n    unsafe { ::flatbuffers::size_prefixed_root_unchecked::<Monster>(buf) }\n}\n\n#[inline]\npub fn finish_monster_buffer<'a, 'b, A: ::flatbuffers::Allocator + 'a>(\n    fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    root: ::flatbuffers::WIPOffset<Monster<'a>>\n) {\n    fbb.finish(root, None);\n}\n\n#[inline]\npub fn finish_size_prefixed_monster_buffer<'a, 'b, A: ::flatbuffers::Allocator + 'a>(\n    fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    root: ::flatbuffers::WIPOffset<Monster<'a>>\n) {\n    fbb.finish_size_prefixed(root, None);\n}\n"
  },
  {
    "path": "samples/rust_generated/my_game/sample/vec_3_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n// struct Vec3, aligned to 4\n#[repr(transparent)]\n#[derive(Clone, Copy, PartialEq)]\npub struct Vec3(pub [u8; 12]);\n\nimpl Default for Vec3 {\n    fn default() -> Self {\n        Self([0; 12])\n    }\n}\n\nimpl ::core::fmt::Debug for Vec3 {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        f.debug_struct(\"Vec3\")\n            .field(\"x\", &self.x())\n            .field(\"y\", &self.y())\n            .field(\"z\", &self.z())\n            .finish()\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for Vec3 {}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Vec3 {\n    type Inner = &'a Vec3;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { <&'a Vec3>::follow(buf, loc) }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for &'a Vec3 {\n    type Inner = &'a Vec3;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { ::flatbuffers::follow_cast_ref::<Vec3>(buf, loc) }\n    }\n}\n\nimpl<'b> ::flatbuffers::Push for Vec3 {\n    type Output = Vec3;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        let src = unsafe { ::core::slice::from_raw_parts(self as *const Vec3 as *const u8, <Self as ::flatbuffers::Push>::size()) };\n        dst.copy_from_slice(src);\n    }\n\n    #[inline]\n    fn alignment() -> ::flatbuffers::PushAlignment {\n        ::flatbuffers::PushAlignment::new(4)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for Vec3 {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.in_buffer::<Self>(pos)\n    }\n}\n\nimpl<'a> Vec3 {\n    #[allow(clippy::too_many_arguments)]\n    pub fn new(\n        x: f32,\n        y: f32,\n        z: f32,\n    ) -> Self {\n        let mut s = Self([0; 12]);\n        s.set_x(x);\n        s.set_y(y);\n        s.set_z(z);\n        s\n    }\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.Sample.Vec3\"\n    }\n\n    pub fn x(&self) -> f32 {\n        let mut mem = ::core::mem::MaybeUninit::<<f32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[0..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_x(&mut self, x: f32) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[0..].as_mut_ptr(),\n                ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn y(&self) -> f32 {\n        let mut mem = ::core::mem::MaybeUninit::<<f32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[4..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_y(&mut self, x: f32) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[4..].as_mut_ptr(),\n                ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn z(&self) -> f32 {\n        let mut mem = ::core::mem::MaybeUninit::<<f32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[8..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_z(&mut self, x: f32) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[8..].as_mut_ptr(),\n                ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn unpack(&self) -> Vec3T {\n        Vec3T {\n            x: self.x(),\n            y: self.y(),\n            z: self.z(),\n        }\n    }\n}\n\n#[derive(Debug, Clone, PartialEq)]\npub struct Vec3T {\n    pub x: f32,\n    pub y: f32,\n    pub z: f32,\n}\nimpl Default for Vec3T {\n    fn default() -> Self {\n        Self {\n            x: 0.0,\n            y: 0.0,\n            z: 0.0,\n        }\n    }\n}\n\nimpl Vec3T {\n    pub fn pack(&self) -> Vec3 {\n        Vec3::new(\n            self.x,\n            self.y,\n            self.z,\n        )\n    }\n}\n"
  },
  {
    "path": "samples/rust_generated/my_game/sample/weapon_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum WeaponOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct Weapon<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Weapon<'a> {\n    type Inner = Weapon<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> Weapon<'a> {\n    pub const VT_NAME: ::flatbuffers::VOffsetT = 4;\n    pub const VT_DAMAGE: ::flatbuffers::VOffsetT = 6;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.Sample.Weapon\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        Weapon { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args WeaponArgs<'args>\n    ) -> ::flatbuffers::WIPOffset<Weapon<'bldr>> {\n        let mut builder = WeaponBuilder::new(_fbb);\n        if let Some(x) = args.name { builder.add_name(x); }\n        builder.add_damage(args.damage);\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> WeaponT {\n        let name = self.name().map(|x| {\n            alloc::string::ToString::to_string(x)\n        });\n        let damage = self.damage();\n        WeaponT {\n            name,\n            damage,\n        }\n    }\n\n    #[inline]\n    pub fn name(&self) -> Option<&'a str> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<&str>>(Weapon::VT_NAME, None)}\n    }\n\n    #[inline]\n    pub fn damage(&self) -> i16 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i16>(Weapon::VT_DAMAGE, Some(0)).unwrap()}\n    }\n}\n\nimpl ::flatbuffers::Verifiable for Weapon<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<&str>>(\"name\", Self::VT_NAME, false)?\n            .visit_field::<i16>(\"damage\", Self::VT_DAMAGE, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct WeaponArgs<'a> {\n    pub name: Option<::flatbuffers::WIPOffset<&'a str>>,\n    pub damage: i16,\n}\n\nimpl<'a> Default for WeaponArgs<'a> {\n    #[inline]\n    fn default() -> Self {\n        WeaponArgs {\n            name: None,\n            damage: 0,\n        }\n    }\n}\n\npub struct WeaponBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> WeaponBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_name(&mut self, name: ::flatbuffers::WIPOffset<&'b  str>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Weapon::VT_NAME, name);\n    }\n\n    #[inline]\n    pub fn add_damage(&mut self, damage: i16) {\n        self.fbb_.push_slot::<i16>(Weapon::VT_DAMAGE, damage, 0);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> WeaponBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        WeaponBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<Weapon<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for Weapon<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"Weapon\");\n        ds.field(\"name\", &self.name());\n        ds.field(\"damage\", &self.damage());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct WeaponT {\n    pub name: Option<alloc::string::String>,\n    pub damage: i16,\n}\n\nimpl Default for WeaponT {\n    fn default() -> Self {\n        Self {\n            name: None,\n            damage: 0,\n        }\n    }\n}\n\nimpl WeaponT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<Weapon<'b>> {\n        let name = self.name.as_ref().map(|x|{\n            _fbb.create_string(x)\n        });\n        let damage = self.damage;\n        Weapon::create(_fbb, &WeaponArgs{\n            name,\n            damage,\n        })\n    }\n}\n"
  },
  {
    "path": "samples/sample_bfbs.cpp",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"flatbuffers/idl.h\"\n#include \"flatbuffers/util.h\"\n#include \"monster_generated.h\"  // Already includes \"flatbuffers/flatbuffers.h\".\n\nusing namespace MyGame::Sample;\n\n// This is an example of parsing text straight into a buffer and then\n// generating flatbuffer (JSON) text from the buffer.\nint main(int /*argc*/, const char* /*argv*/[]) {\n  // load FlatBuffer schema (.fbs) and JSON from disk\n  std::string schema_file;\n  std::string json_file;\n  std::string bfbs_file;\n  bool ok =\n      flatbuffers::LoadFile(\"tests/monster_test.fbs\", false, &schema_file) &&\n      flatbuffers::LoadFile(\"tests/monsterdata_test.golden\", false,\n                            &json_file) &&\n      flatbuffers::LoadFile(\"tests/monster_test.bfbs\", true, &bfbs_file);\n  if (!ok) {\n    printf(\"couldn't load files!\\n\");\n    return 1;\n  }\n\n  const char* include_directories[] = {\"samples\", \"tests\", \"tests/include_test\",\n                                       nullptr};\n  // parse fbs schema\n  flatbuffers::Parser parser1;\n  ok = parser1.Parse(schema_file.c_str(), include_directories);\n  assert(ok);\n\n  // inizialize parser by deserializing bfbs schema\n  flatbuffers::Parser parser2;\n  ok = parser2.Deserialize(reinterpret_cast<const uint8_t*>(bfbs_file.c_str()),\n                           bfbs_file.length());\n  assert(ok);\n\n  // parse json in parser from fbs and bfbs\n  ok = parser1.Parse(json_file.c_str(), include_directories);\n  assert(ok);\n  ok = parser2.Parse(json_file.c_str(), include_directories);\n  assert(ok);\n\n  // to ensure it is correct, we now generate text back from the binary,\n  // and compare the two:\n  std::string jsongen1;\n  if (GenText(parser1, parser1.builder_.GetBufferPointer(), &jsongen1)) {\n    printf(\"Couldn't serialize parsed data to JSON!\\n\");\n    return 1;\n  }\n\n  std::string jsongen2;\n  if (GenText(parser2, parser2.builder_.GetBufferPointer(), &jsongen2)) {\n    printf(\"Couldn't serialize parsed data to JSON!\\n\");\n    return 1;\n  }\n\n  if (jsongen1 != jsongen2) {\n    printf(\"%s----------------\\n%s\", jsongen1.c_str(), jsongen2.c_str());\n  }\n\n  printf(\"The FlatBuffer has been parsed from JSON successfully.\\n\");\n}\n"
  },
  {
    "path": "samples/sample_binary.cpp",
    "content": "/*\n * Copyright 2015 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"monster_generated.h\"  // Already includes \"flatbuffers/flatbuffers.h\".\n\nusing namespace MyGame::Sample;\n\n// Example how to use FlatBuffers to create and read binary buffers.\n\nint main(int /*argc*/, const char* /*argv*/[]) {\n  // Build up a serialized buffer algorithmically:\n  flatbuffers::FlatBufferBuilder builder;\n\n  // First, lets serialize some weapons for the Monster: A 'sword' and an 'axe'.\n  auto weapon_one_name = builder.CreateString(\"Sword\");\n  short weapon_one_damage = 3;\n\n  auto weapon_two_name = builder.CreateString(\"Axe\");\n  short weapon_two_damage = 5;\n\n  // Use the `CreateWeapon` shortcut to create Weapons with all fields set.\n  auto sword = CreateWeapon(builder, weapon_one_name, weapon_one_damage);\n  auto axe = CreateWeapon(builder, weapon_two_name, weapon_two_damage);\n\n  // Create a FlatBuffer's `vector` from the `std::vector`.\n  std::vector<flatbuffers::Offset<Weapon>> weapons_vector;\n  weapons_vector.push_back(sword);\n  weapons_vector.push_back(axe);\n  auto weapons = builder.CreateVector(weapons_vector);\n\n  // Second, serialize the rest of the objects needed by the Monster.\n  auto position = Vec3(1.0f, 2.0f, 3.0f);\n\n  auto name = builder.CreateString(\"MyMonster\");\n\n  unsigned char inv_data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};\n  auto inventory = builder.CreateVector(inv_data, 10);\n\n  // Shortcut for creating monster with all fields set:\n  auto orc = CreateMonster(builder, &position, 150, 80, name, inventory,\n                           Color_Red, weapons, Equipment_Weapon, axe.Union());\n\n  builder.Finish(orc);  // Serialize the root of the object.\n\n  // We now have a FlatBuffer we can store on disk or send over a network.\n\n  // ** file/network code goes here :) **\n  // access builder.GetBufferPointer() for builder.GetSize() bytes\n\n  // Instead, we're going to access it right away (as if we just received it).\n\n  // Get access to the root:\n  auto monster = GetMonster(builder.GetBufferPointer());\n\n  // Get and test some scalar types from the FlatBuffer.\n  assert(monster->hp() == 80);\n  assert(monster->mana() == 150);  // default\n  assert(monster->name()->str() == \"MyMonster\");\n\n  // Get and test a field of the FlatBuffer's `struct`.\n  auto pos = monster->pos();\n  assert(pos);\n  assert(pos->z() == 3.0f);\n  (void)pos;\n\n  // Get a test an element from the `inventory` FlatBuffer's `vector`.\n  auto inv = monster->inventory();\n  assert(inv);\n  assert(inv->Get(9) == 9);\n  (void)inv;\n\n  // Get and test the `weapons` FlatBuffers's `vector`.\n  std::string expected_weapon_names[] = {\"Sword\", \"Axe\"};\n  short expected_weapon_damages[] = {3, 5};\n  auto weps = monster->weapons();\n  for (unsigned int i = 0; i < weps->size(); i++) {\n    assert(weps->Get(i)->name()->str() == expected_weapon_names[i]);\n    assert(weps->Get(i)->damage() == expected_weapon_damages[i]);\n  }\n  (void)expected_weapon_names;\n  (void)expected_weapon_damages;\n\n  // Get and test the `Equipment` union (`equipped` field).\n  assert(monster->equipped_type() == Equipment_Weapon);\n  auto equipped = static_cast<const Weapon*>(monster->equipped());\n  assert(equipped->name()->str() == \"Axe\");\n  assert(equipped->damage() == 5);\n  (void)equipped;\n\n  printf(\"The FlatBuffer was successfully created and verified!\\n\");\n}\n"
  },
  {
    "path": "samples/sample_binary.go",
    "content": "/*\n * Copyright 2015 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// To run, use the `go_sample.sh` script.\n\npackage main\n\nimport (\n\t\"fmt\"\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n\tsample \"github.com/google/flatbuffers/samples/MyGame/Sample\"\n\t\"strconv\"\n)\n\n// Example how to use Flatbuffers to create and read binary buffers.\nfunc main() {\n\tbuilder := flatbuffers.NewBuilder(0)\n\n\t// Create some weapons for our Monster (\"Sword\" and \"Axe\").\n\tweaponOne := builder.CreateString(\"Sword\")\n\tweaponTwo := builder.CreateString(\"Axe\")\n\n\tsample.WeaponStart(builder)\n\tsample.WeaponAddName(builder, weaponOne)\n\tsample.WeaponAddDamage(builder, 3)\n\tsword := sample.WeaponEnd(builder)\n\n\tsample.WeaponStart(builder)\n\tsample.WeaponAddName(builder, weaponTwo)\n\tsample.WeaponAddDamage(builder, 5)\n\taxe := sample.WeaponEnd(builder)\n\n\t// Serialize the FlatBuffer data.\n\tname := builder.CreateString(\"Orc\")\n\n\tsample.MonsterStartInventoryVector(builder, 10)\n\t// Note: Since we prepend the bytes, this loop iterates in reverse.\n\tfor i := 9; i >= 0; i-- {\n\t\tbuilder.PrependByte(byte(i))\n\t}\n\tinv := builder.EndVector(10)\n\n\tsample.MonsterStartWeaponsVector(builder, 2)\n\t// Note: Since we prepend the weapons, prepend in reverse order.\n\tbuilder.PrependUOffsetT(axe)\n\tbuilder.PrependUOffsetT(sword)\n\tweapons := builder.EndVector(2)\n\n\tpos := sample.CreateVec3(builder, 1.0, 2.0, 3.0)\n\n\tsample.MonsterStart(builder)\n\tsample.MonsterAddPos(builder, pos)\n\tsample.MonsterAddHp(builder, 300)\n\tsample.MonsterAddName(builder, name)\n\tsample.MonsterAddInventory(builder, inv)\n\tsample.MonsterAddColor(builder, sample.ColorRed)\n\tsample.MonsterAddWeapons(builder, weapons)\n\tsample.MonsterAddEquippedType(builder, sample.EquipmentWeapon)\n\tsample.MonsterAddEquipped(builder, axe)\n\torc := sample.MonsterEnd(builder)\n\n\tbuilder.Finish(orc)\n\n\t// We now have a FlatBuffer that we could store on disk or send over a network.\n\n\t// ...Saving to file or sending over a network code goes here...\n\n\t// Instead, we are going to access this buffer right away (as if we just received it).\n\n\tbuf := builder.FinishedBytes()\n\n\t// Note: We use `0` for the offset here, since we got the data using the\n\t// `builder.FinishedBytes()` method. This simulates the data you would store/receive in your\n\t// FlatBuffer. If you wanted to read from the `builder.Bytes` directly, you would need to\n\t// pass in the offset of `builder.Head()`, as the builder actually constructs the buffer\n\t// backwards.\n\tmonster := sample.GetRootAsMonster(buf, 0)\n\n\t// Note: We did not set the `mana` field explicitly, so we get the\n\t// default value.\n\tassert(monster.Mana() == 150, \"`monster.Mana()`\", strconv.Itoa(int(monster.Mana())), \"150\")\n\tassert(monster.Hp() == 300, \"`monster.Hp()`\", strconv.Itoa(int(monster.Hp())), \"300\")\n\tassert(string(monster.Name()) == \"Orc\", \"`string(monster.Name())`\", string(monster.Name()),\n\t\t\"\\\"Orc\\\"\")\n\tassert(monster.Color() == sample.ColorRed, \"`monster.Color()`\",\n\t\tstrconv.Itoa(int(monster.Color())), strconv.Itoa(int(sample.ColorRed)))\n\n\t// Note: Whenever you access a new object, like in `Pos()`, a new temporary accessor object\n\t// gets created. If your code is very performance sensitive, you can pass in a pointer to an\n\t// existing `Vec3` instead of `nil`. This allows you to reuse it across many calls to reduce\n\t// the amount of object allocation/garbage collection.\n\tassert(monster.Pos(nil).X() == 1.0, \"`monster.Pos(nil).X()`\",\n\t\tstrconv.FormatFloat(float64(monster.Pos(nil).X()), 'f', 1, 32), \"1.0\")\n\tassert(monster.Pos(nil).Y() == 2.0, \"`monster.Pos(nil).Y()`\",\n\t\tstrconv.FormatFloat(float64(monster.Pos(nil).Y()), 'f', 1, 32), \"2.0\")\n\tassert(monster.Pos(nil).Z() == 3.0, \"`monster.Pos(nil).Z()`\",\n\t\tstrconv.FormatFloat(float64(monster.Pos(nil).Z()), 'f', 1, 32), \"3.0\")\n\n\t// For vectors, like `Inventory`, they have a method suffixed with 'Length' that can be used\n\t// to query the length of the vector. You can index the vector by passing an index value\n\t// into the accessor.\n\tfor i := 0; i < monster.InventoryLength(); i++ {\n\t\tassert(monster.Inventory(i) == byte(i), \"`monster.Inventory(i)`\",\n\t\t\tstrconv.Itoa(int(monster.Inventory(i))), strconv.Itoa(int(byte(i))))\n\t}\n\n\texpectedWeaponNames := []string{\"Sword\", \"Axe\"}\n\texpectedWeaponDamages := []int{3, 5}\n\tweapon := new(sample.Weapon) // We need a `sample.Weapon` to pass into `monster.Weapons()`\n\t// to capture the output of that function.\n\tfor i := 0; i < monster.WeaponsLength(); i++ {\n\t\tif monster.Weapons(weapon, i) {\n\t\t\tassert(string(weapon.Name()) == expectedWeaponNames[i], \"`weapon.Name()`\",\n\t\t\t\tstring(weapon.Name()), expectedWeaponNames[i])\n\t\t\tassert(int(weapon.Damage()) == expectedWeaponDamages[i],\n\t\t\t\t\"`weapon.Damage()`\", strconv.Itoa(int(weapon.Damage())),\n\t\t\t\tstrconv.Itoa(expectedWeaponDamages[i]))\n\t\t}\n\t}\n\n\t// For FlatBuffer `union`s, you can get the type of the union, as well as the union\n\t// data itself.\n\tassert(monster.EquippedType() == sample.EquipmentWeapon, \"`monster.EquippedType()`\",\n\t\tstrconv.Itoa(int(monster.EquippedType())), strconv.Itoa(int(sample.EquipmentWeapon)))\n\n\tunionTable := new(flatbuffers.Table)\n\tif monster.Equipped(unionTable) {\n\t\t// An example of how you can appropriately convert the table depending on the\n\t\t// FlatBuffer `union` type. You could add `else if` and `else` clauses to handle\n\t\t// other FlatBuffer `union` types for this field. (Similarly, this could be\n\t\t// done in a switch statement.)\n\t\tif monster.EquippedType() == sample.EquipmentWeapon {\n\t\t\tunionWeapon := new(sample.Weapon)\n\t\t\tunionWeapon.Init(unionTable.Bytes, unionTable.Pos)\n\n\t\t\tassert(string(unionWeapon.Name()) == \"Axe\", \"`unionWeapon.Name()`\",\n\t\t\t\tstring(unionWeapon.Name()), \"Axe\")\n\t\t\tassert(int(unionWeapon.Damage()) == 5, \"`unionWeapon.Damage()`\",\n\t\t\t\tstrconv.Itoa(int(unionWeapon.Damage())), strconv.Itoa(5))\n\t\t}\n\t}\n\n\tfmt.Printf(\"The FlatBuffer was successfully created and verified!\\n\")\n}\n\n// A helper function to print out if an assertion failed.\nfunc assert(assertPassed bool, codeExecuted string, actualValue string, expectedValue string) {\n\tif assertPassed == false {\n\t\tpanic(\"Assert failed! \" + codeExecuted + \" (\" + actualValue +\n\t\t\t\") was not equal to \" + expectedValue + \".\")\n\t}\n}\n"
  },
  {
    "path": "samples/sample_binary.lobster",
    "content": "// Copyright 2018 Google Inc. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport from \"../lobster/\"\nimport monster_generated\n\n// Example of how to use FlatBuffers to create and read binary buffers.\n\n// Create a builder.\nlet b = flatbuffers_builder {}\n\n// Create some weapons for our monster.\nlet weapon_names = [ \"Sword\", \"Axe\" ]\nlet weapon_damages = [ 3, 5 ]\n\nlet weapon_offsets = map(weapon_names) name, i:\n    let ns = b.CreateString(name)\n    MyGame_Sample_WeaponBuilder { b }\n        .start()\n        .add_name(ns)\n        .add_damage(weapon_damages[i])\n        .end()\n\nlet weapons = b.MyGame_Sample_MonsterCreateWeaponsVector(weapon_offsets)\n\n// Name of the monster.\nlet name = b.CreateString(\"Orc\")\n\n// Inventory.\nlet inv = b.MyGame_Sample_MonsterCreateInventoryVector(map(10): _)\n\n// Now pack it all together in our root monster object.\nlet orc = MyGame_Sample_MonsterBuilder { b }\n    .start()\n    .add_pos(b.MyGame_Sample_CreateVec3(1.0, 2.0, 3.0))\n    .add_hp(300)\n    .add_name(name)\n    .add_inventory(inv)\n    .add_color(MyGame_Sample_Color_Red)\n    .add_weapons(weapons)\n    .add_equipped_type(MyGame_Sample_Equipment_Weapon)\n    .add_equipped(weapon_offsets[1])\n    .end()\n\n// Finish the buffer!\nb.Finish(orc, \"MONS\")\n\n// We now have a FlatBuffer that we could store on disk or send over a network.\n\nlet buf = b.SizedCopy()\n\n// ...Saving to file or sending over a network code goes here...\n\n// Instead, we are going to access this buffer right away (as if we just\n// received it).\n\n// Get the root object accessor.\nlet monster = MyGame_Sample_GetRootAsMonster(buf)\n\n// Note: We did not set the `mana` field explicitly, so we get a default value.\nassert monster.mana == 150\nassert monster.hp == 300\nassert monster.name == \"Orc\"\nassert monster.color == MyGame_Sample_Color_Red\nlet pos = monster.pos\nassert pos\nassert pos.x == 1.0\nassert pos.y == 2.0\nassert pos.z == 3.0\n\n// Get and test the `inventory` FlatBuffer vector.\nfor(monster.inventory_length) e, i:\n  assert monster.inventory(i) == e\n\n// Get and test the `weapons` FlatBuffer vector of tables.\nfor(monster.weapons_length) i:\n  assert monster.weapons(i).name == weapon_names[i]\n  assert monster.weapons(i).damage == weapon_damages[i]\n\n// Get and test the `equipped` FlatBuffer union.\nassert monster.equipped_type() == MyGame_Sample_Equipment_Weapon\n\n// Now that we know the union value is a weapon, we can safely call as_Weapon:\nlet union_weapon = monster.equipped_as_Weapon\n\nassert union_weapon.name == \"Axe\"\nassert union_weapon.damage == 5\n\nprint \"The FlatBuffer was successfully created and verified!\"\n"
  },
  {
    "path": "samples/sample_binary.lua",
    "content": "-- need to update the Lua path to point to the local flatbuffers implementation\npackage.path = string.format(\"../lua/?.lua;%s\",package.path)\npackage.path = string.format(\"./lua/?.lua;%s\",package.path)\n\n-- require the library\nlocal flatbuffers = require(\"flatbuffers\")\n\nlocal binaryArray = flatbuffers.binaryArray-- for hex dump utility\n\n-- require the files generated from the schema\nlocal weapon = require(\"MyGame.Sample.Weapon\")\nlocal monster = require(\"MyGame.Sample.Monster\")\nlocal vec3 = require(\"MyGame.Sample.Vec3\")\nlocal color = require(\"MyGame.Sample.Color\")\nlocal equipment = require(\"MyGame.Sample.Equipment\")\n\n-- get access to the builder, providing an array of size 1024\nlocal builder = flatbuffers.Builder(1024)\n\nlocal weaponOne = builder:CreateString(\"Sword\")\nlocal weaponTwo = builder:CreateString(\"Axe\")\n\n-- Create the first 'Weapon'\nweapon.Start(builder)\nweapon.AddName(builder, weaponOne)\nweapon.AddDamage(builder, 3)\nlocal sword = weapon.End(builder)\n\n-- Create the second 'Weapon'\nweapon.Start(builder)\nweapon.AddName(builder, weaponTwo)\nweapon.AddDamage(builder, 5)\nlocal axe = weapon.End(builder)\n\n-- Serialize a name for our mosnter, called 'orc'\nlocal name = builder:CreateString(\"Orc\")\n\n-- Create a `vector` representing the inventory of the Orc. Each number\n-- could correspond to an item that can be claimed after he is slain.\n-- Note: Since we prepend the bytes, this loop iterates in reverse.\nmonster.StartInventoryVector(builder, 10)\nfor i=10,1,-1 do\n    builder:PrependByte(i)\nend\nlocal inv = builder:EndVector(10)\n\n-- Create a FlatBuffer vector and prepend the weapons.\n-- Note: Since we prepend the data, prepend them in reverse order.\nmonster.StartWeaponsVector(builder, 2)\nbuilder:PrependUOffsetTRelative(axe)\nbuilder:PrependUOffsetTRelative(sword)\nlocal weapons = builder:EndVector(2)\n\n-- Create our monster by using Start() andEnd()\nmonster.Start(builder)\nmonster.AddPos(builder, vec3.CreateVec3(builder, 1.0, 2.0, 3.0))\nmonster.AddHp(builder, 300)\nmonster.AddName(builder, name)\nmonster.AddInventory(builder, inv)\nmonster.AddColor(builder, color.Red)\nmonster.AddWeapons(builder, weapons)\nmonster.AddEquippedType(builder, equipment.Weapon)\nmonster.AddEquipped(builder, axe)\nlocal orc = monster.End(builder)\n\n-- Call 'Finish()' to instruct the builder that this monster is complete.\nbuilder:Finish(orc)\n\n-- Get the flatbuffer as a string containing the binary data\nlocal bufAsString = builder:Output()\n\n-- Convert the string representation into binary array Lua structure\nlocal buf = flatbuffers.binaryArray.New(bufAsString)\n\n-- Get an accessor to the root object insert the buffer\nlocal mon = monster.GetRootAsMonster(buf, 0)\n\nassert(mon:Mana() == 150)\nassert(mon:Hp() == 300)\nassert(mon:Name() == \"Orc\")\nassert(mon:Color() == color.Red)\nassert(mon:Pos():X() == 1.0)\nassert(mon:Pos():Y() == 2.0)\nassert(mon:Pos():Z() == 3.0)\n\nfor i=1,mon:InventoryLength() do\n    assert(mon:Inventory(i) == i)\nend\n\nlocal expected = { \n    {w = 'Sword', d = 3}, \n    {w = 'Axe', d = 5}\n}\n\nfor i=1,mon:WeaponsLength() do\n   assert(mon:Weapons(i):Name() == expected[i].w)\n   assert(mon:Weapons(i):Damage() == expected[i].d)\nend\n\nassert(mon:EquippedType() == equipment.Weapon)\n\nlocal unionWeapon = weapon.New()\nunionWeapon:Init(mon:Equipped().bytes,mon:Equipped().pos)\nassert(unionWeapon:Name() == \"Axe\")\nassert(unionWeapon:Damage() == 5)\n\nprint(\"The Lua FlatBuffer example was successfully created and verified!\")"
  },
  {
    "path": "samples/sample_binary.py",
    "content": "#!/usr/bin/python\n# Copyright 2015 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# To run this file, use `python_sample.sh`.\n\n# Append paths to the `flatbuffers` and `MyGame` modules. This is necessary\n# to facilitate executing this script in the `samples` folder, and to root\n# folder (where it gets placed when using `cmake`).\nimport os\nimport sys\n\nsys.path.append(os.path.join(os.path.dirname(__file__), '../python'))\n\nimport flatbuffers\nimport MyGame.Sample.Color\nimport MyGame.Sample.Equipment\nimport MyGame.Sample.Monster\nimport MyGame.Sample.Vec3\nimport MyGame.Sample.Weapon\n\n# Example of how to use FlatBuffers to create and read binary buffers.\n\n\ndef main():\n  builder = flatbuffers.Builder(0)\n\n  # Create some weapons for our Monster ('Sword' and 'Axe').\n  weapon_one = builder.CreateString('Sword')\n  weapon_two = builder.CreateString('Axe')\n\n  MyGame.Sample.Weapon.WeaponStart(builder)\n  MyGame.Sample.Weapon.WeaponAddName(builder, weapon_one)\n  MyGame.Sample.Weapon.WeaponAddDamage(builder, 3)\n  sword = MyGame.Sample.Weapon.WeaponEnd(builder)\n\n  MyGame.Sample.Weapon.WeaponStart(builder)\n  MyGame.Sample.Weapon.WeaponAddName(builder, weapon_two)\n  MyGame.Sample.Weapon.WeaponAddDamage(builder, 5)\n  axe = MyGame.Sample.Weapon.WeaponEnd(builder)\n\n  # Serialize the FlatBuffer data.\n  name = builder.CreateString('Orc')\n\n  MyGame.Sample.Monster.MonsterStartInventoryVector(builder, 10)\n  # Note: Since we prepend the bytes, this loop iterates in reverse order.\n  for i in reversed(range(0, 10)):\n    builder.PrependByte(i)\n  inv = builder.EndVector()\n\n  MyGame.Sample.Monster.MonsterStartWeaponsVector(builder, 2)\n  # Note: Since we prepend the data, prepend the weapons in reverse order.\n  builder.PrependUOffsetTRelative(axe)\n  builder.PrependUOffsetTRelative(sword)\n  weapons = builder.EndVector()\n\n  pos = MyGame.Sample.Vec3.CreateVec3(builder, 1.0, 2.0, 3.0)\n\n  MyGame.Sample.Monster.MonsterStart(builder)\n  MyGame.Sample.Monster.MonsterAddPos(builder, pos)\n  MyGame.Sample.Monster.MonsterAddHp(builder, 300)\n  MyGame.Sample.Monster.MonsterAddName(builder, name)\n  MyGame.Sample.Monster.MonsterAddInventory(builder, inv)\n  MyGame.Sample.Monster.MonsterAddColor(\n      builder, MyGame.Sample.Color.Color().Red\n  )\n  MyGame.Sample.Monster.MonsterAddWeapons(builder, weapons)\n  MyGame.Sample.Monster.MonsterAddEquippedType(\n      builder, MyGame.Sample.Equipment.Equipment().Weapon\n  )\n  MyGame.Sample.Monster.MonsterAddEquipped(builder, axe)\n  orc = MyGame.Sample.Monster.MonsterEnd(builder)\n\n  builder.Finish(orc)\n\n  # We now have a FlatBuffer that we could store on disk or send over a network.\n\n  # ...Saving to file or sending over a network code goes here...\n\n  # Instead, we are going to access this buffer right away (as if we just\n  # received it).\n\n  buf = builder.Output()\n\n  # Note: We use `0` for the offset here, since we got the data using the\n  # `builder.Output()` method. This simulates the data you would store/receive\n  # in your FlatBuffer. If you wanted to read from the `builder.Bytes` directly,\n  # you would need to pass in the offset of `builder.Head()`, as the builder\n  # actually constructs the buffer backwards.\n  monster = MyGame.Sample.Monster.Monster.GetRootAsMonster(buf, 0)\n\n  # Note: We did not set the `Mana` field explicitly, so we get a default value.\n  assert monster.Mana() == 150\n  assert monster.Hp() == 300\n  assert monster.Name() == b'Orc'\n  assert monster.Color() == MyGame.Sample.Color.Color().Red\n  assert monster.Pos().X() == 1.0\n  assert monster.Pos().Y() == 2.0\n  assert monster.Pos().Z() == 3.0\n\n  # Get and test the `inventory` FlatBuffer `vector`.\n  for i in range(monster.InventoryLength()):\n    assert monster.Inventory(i) == i\n\n  # Get and test the `weapons` FlatBuffer `vector` of `table`s.\n  expected_weapon_names = [b'Sword', b'Axe']\n  expected_weapon_damages = [3, 5]\n  for i in range(monster.WeaponsLength()):\n    assert monster.Weapons(i).Name() == expected_weapon_names[i]\n    assert monster.Weapons(i).Damage() == expected_weapon_damages[i]\n\n  # Get and test the `equipped` FlatBuffer `union`.\n  assert monster.EquippedType() == MyGame.Sample.Equipment.Equipment().Weapon\n\n  # An example of how you can appropriately convert the table depending on the\n  # FlatBuffer `union` type. You could add `elif` and `else` clauses to handle\n  # the other FlatBuffer `union` types for this field.\n  if monster.EquippedType() == MyGame.Sample.Equipment.Equipment().Weapon:\n    # `monster.Equipped()` returns a `flatbuffers.Table`, which can be used\n    # to initialize a `MyGame.Sample.Weapon.Weapon()`, in this case.\n    union_weapon = MyGame.Sample.Weapon.Weapon()\n    union_weapon.Init(monster.Equipped().Bytes, monster.Equipped().Pos)\n\n    assert union_weapon.Name() == b'Axe'\n    assert union_weapon.Damage() == 5\n\n  print('The FlatBuffer was successfully created and verified!')\n\n\nif __name__ == '__main__':\n  main()\n"
  },
  {
    "path": "samples/sample_binary.rs",
    "content": "/*\n * Copyright 2018 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// import the flatbuffers runtime library\nextern crate flatbuffers;\n\n// import the generated code\n#[allow(dead_code, unused_imports)]\n#[allow(clippy::all)]\nmod rust_generated;\npub use rust_generated::my_game::sample::{\n    Color, Equipment, Monster, MonsterArgs, Vec3, Weapon, WeaponArgs,\n};\n\n// Example how to use FlatBuffers to create and read binary buffers.\n#[allow(clippy::float_cmp)]\nfn main() {\n    // Build up a serialized buffer algorithmically.\n    // Initialize it with a capacity of 1024 bytes.\n    let mut builder = flatbuffers::FlatBufferBuilder::with_capacity(1024);\n\n    // Serialize some weapons for the Monster: A 'sword' and an 'axe'.\n    let weapon_one_name = builder.create_string(\"Sword\");\n    let weapon_two_name = builder.create_string(\"Axe\");\n\n    // Use the `Weapon::create` shortcut to create Weapons with named field\n    // arguments.\n    let sword =\n        Weapon::create(&mut builder, &WeaponArgs { name: Some(weapon_one_name), damage: 3 });\n    let axe = Weapon::create(&mut builder, &WeaponArgs { name: Some(weapon_two_name), damage: 5 });\n\n    // Name of the Monster.\n    let name = builder.create_string(\"Orc\");\n\n    // Inventory.\n    let inventory = builder.create_vector(&[0u8, 1, 2, 3, 4, 5, 6, 7, 8, 9]);\n\n    // Create a FlatBuffer `vector` that contains offsets to the sword and axe\n    // we created above.\n    let weapons = builder.create_vector(&[sword, axe]);\n\n    // Create the path vector of Vec3 objects:\n    //let x = Vec3::new(1.0, 2.0, 3.0);\n    //let y = Vec3::new(4.0, 5.0, 6.0);\n    //let path = builder.create_vector(&[x, y]);\n\n    // Note that, for convenience, it is also valid to create a vector of\n    // references to structs, like this:\n    // let path = builder.create_vector(&[&x, &y]);\n\n    // Create the monster using the `Monster::create` helper function. This\n    // function accepts a `MonsterArgs` struct, which supplies all of the data\n    // needed to build a `Monster`. To supply empty/default fields, just use the\n    // Rust built-in `Default::default()` function, as demonstrated below.\n    let orc = Monster::create(\n        &mut builder,\n        &MonsterArgs {\n            pos: Some(&Vec3::new(1.0f32, 2.0f32, 3.0f32)),\n            mana: 150,\n            hp: 80,\n            name: Some(name),\n            inventory: Some(inventory),\n            color: Color::Red,\n            weapons: Some(weapons),\n            equipped_type: Equipment::Weapon,\n            equipped: Some(axe.as_union_value()),\n            //path: Some(path),\n            ..Default::default()\n        },\n    );\n\n    // Serialize the root of the object, without providing a file identifier.\n    builder.finish(orc, None);\n\n    // We now have a FlatBuffer we can store on disk or send over a network.\n\n    // ** file/network code goes here :) **\n\n    // Instead, we're going to access it right away (as if we just received it).\n    // This must be called after `finish()`.\n    let buf = builder.finished_data(); // Of type `&[u8]`\n\n    // Get access to the root:\n    let monster = flatbuffers::root::<Monster>(buf).unwrap();\n\n    // Get and test some scalar types from the FlatBuffer.\n    let hp = monster.hp();\n    let mana = monster.mana();\n    let name = monster.name();\n\n    assert_eq!(hp, 80);\n    assert_eq!(mana, 150); // default\n    assert_eq!(name, Some(\"Orc\"));\n\n    // Get and test a field of the FlatBuffer's `struct`.\n    assert!(monster.pos().is_some());\n    let pos = monster.pos().unwrap();\n    let x = pos.x();\n    let y = pos.y();\n    let z = pos.z();\n    assert_eq!(x, 1.0f32);\n    assert_eq!(y, 2.0f32);\n    assert_eq!(z, 3.0f32);\n\n    // Get an element from the `inventory` FlatBuffer's `vector`.\n    assert!(monster.inventory().is_some());\n    let inv = monster.inventory().unwrap();\n    let third_item = inv.get(2);\n    assert_eq!(third_item, 2);\n\n    // Get and test the `weapons` FlatBuffers's `vector`.\n    assert!(monster.weapons().is_some());\n    let weps = monster.weapons().unwrap();\n    //let weps_len = weps.len();\n    let wep2 = weps.get(1);\n    let second_weapon_name = wep2.name();\n    let second_weapon_damage = wep2.damage();\n    assert_eq!(second_weapon_name, Some(\"Axe\"));\n    assert_eq!(second_weapon_damage, 5);\n\n    // Get and test the `Equipment` union (`equipped` field).\n    assert_eq!(monster.equipped_type(), Equipment::Weapon);\n    let equipped = monster.equipped_as_weapon().unwrap();\n    let weapon_name = equipped.name();\n    let weapon_damage = equipped.damage();\n    assert_eq!(weapon_name, Some(\"Axe\"));\n    assert_eq!(weapon_damage, 5);\n\n    // Get and test the `path` FlatBuffers's `vector`.\n    //assert_eq!(monster.path().unwrap().len(), 2);\n    //assert_eq!(monster.path().unwrap()[0].x(), 1.0);\n    //assert_eq!(monster.path().unwrap()[1].x(), 4.0);\n\n    println!(\"The FlatBuffer was successfully created and accessed!\");\n    dbg!(monster);\n}\n\n#[cfg(test)]\n#[test]\nfn test_main() {\n    main()\n}\n"
  },
  {
    "path": "samples/sample_binary.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport FlatBuffers\n\ntypealias Monster = MyGame_Sample_Monster\ntypealias Weapon = MyGame_Sample_Weapon\ntypealias Color = MyGame_Sample_Color\ntypealias Vec3 = MyGame_Sample_Vec3\n\nfunc main() {\n  let expectedDMG: [Int16] = [3, 5]\n  let expectedNames = [\"Sword\", \"Axe\"]\n\n  var builder = FlatBufferBuilder(initialSize: 1024)\n  let weapon1Name = builder.create(string: expectedNames[0])\n  let weapon2Name = builder.create(string: expectedNames[1])\n\n  let weapon1Start = Weapon.startWeapon(&builder)\n  Weapon.add(name: weapon1Name, &builder)\n  Weapon.add(damage: expectedDMG[0], &builder)\n  let sword = Weapon.endWeapon(&builder, start: weapon1Start)\n  let weapon2Start = Weapon.startWeapon(&builder)\n  Weapon.add(name: weapon2Name, &builder)\n  Weapon.add(damage: expectedDMG[1], &builder)\n  let axe = Weapon.endWeapon(&builder, start: weapon2Start)\n\n  let name = builder.create(string: \"Orc\")\n  let inventory: [Byte] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n  let inventoryOffset = builder.createVector(inventory)\n\n  let weaponsOffset = builder.createVector(ofOffsets: [sword, axe])\n\n  let orc = Monster.createMonster(\n    &builder,\n    pos: MyGame_Sample_Vec3(x: 1, y: 2, z: 3),\n    hp: 300,\n    nameOffset: name,\n    inventoryVectorOffset: inventoryOffset,\n    color: .red,\n    weaponsVectorOffset: weaponsOffset,\n    equippedType: .weapon,\n    equippedOffset: axe)\n  builder.finish(offset: orc)\n\n  var buf = ByteBuffer(bytes: builder.sizedByteArray)\n  let monster: Monster = try! getCheckedRoot(byteBuffer: &buffer)\n\n  assert(monster.mana == 150)\n  assert(monster.hp == 300)\n  assert(monster.name == \"Orc\")\n  assert(monster.color == MyGame.Sample.Color.red)\n  assert(monster.pos != nil)\n  assert(monster.mutablePos != nil)\n  for i in 0..<monster.inventoryCount {\n    assert(i == monster.inventory(at: i))\n  }\n\n  for i in 0..<monster.weaponsCount {\n    let weap = monster.weapons(at: i)\n    let index = Int(i)\n    assert(weap?.damage == expectedDMG[index])\n    assert(weap?.name == expectedNames[index])\n  }\n  assert(monster.equippedType == .weapon)\n  let equipped = monster.equipped(type: Weapon.self)\n  assert(equipped?.name == \"Axe\")\n  assert(equipped?.damage == 5)\n  print(\"Monster Object is Verified\")\n}\n"
  },
  {
    "path": "samples/sample_flexbuffers.rs",
    "content": "// Copyright 2019 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nextern crate flexbuffers;\n\nuse flexbuffers::{BitWidth, Builder, Reader, ReaderError};\n\n// In this Example we're creating a monster that corresponds to the following JSON:\n// {\n//     \"coins\": [5, 10, 25, 25, 25, 100],\n//     \"color\": [255, 0, 0, 255],\n//     \"enraged\": true,\n//     \"hp\": 80,\n//     \"mana\": 200,\n//     \"position\": [0, 0, 0],\n//     \"velocity\": [1, 0, 0],\n//     \"weapons\": [\n//         \"fist\",\n//         {\"damage\": 15, \"name\": \"great axe\"},\n//         {\"damage\": 5, \"name\": \"hammer\"}]\n// }\n#[allow(clippy::float_cmp)]\nfn main() {\n    // Create a new Flexbuffer builder.\n    let mut builder = Builder::default();\n\n    // The root of the builder can be a singleton, map or vector.\n    // Our monster will be represented with a map.\n    let mut monster = builder.start_map();\n\n    // Use `push` to add elements to a vector or map. Note that it up to the programmer to ensure\n    // duplicate keys are avoided and the key has no null bytes.\n    monster.push(\"hp\", 80);\n    monster.push(\"mana\", 200);\n    monster.push(\"enraged\", true);\n\n    // Let's give our monster some weapons. Use `start_vector` to store a vector.\n    let mut weapons = monster.start_vector(\"weapons\");\n\n    // The first weapon is a fist which has no damage so we'll store it as a string.\n    // Strings in Flexbuffers are utf8 encoded and are distinct from map Keys which are c strings.\n    weapons.push(\"fist\");\n\n    // The monster also has an axe. We'll store it as a map to make it more interesting.\n    let mut axe = weapons.start_map();\n    axe.push(\"name\", \"great axe\");\n    axe.push(\"damage\", 15);\n    // We're done adding to the axe.\n    axe.end_map();\n\n    // The monster also has a hammer.\n    {\n        let mut hammer = weapons.start_map();\n        hammer.push(\"name\", \"hammer\");\n        hammer.push(\"damage\", 5);\n        // Instead of calling `hammer.end_map()`, we can just drop the `hammer` for the same effect.\n        // Vectors and maps are completed and serialized when their builders are dropped.\n    }\n\n    // We're done adding weapons.\n    weapons.end_vector();\n\n    // Give the monster some money. Flexbuffers has typed vectors which are smaller than\n    // heterogenous vectors. Elements of typed vectors can be pushed one at a time, as above, or\n    // they can be passed as a slice. This will be stored as a `FlexBufferType::VectorInt`.\n    monster.push(\"coins\", &[5, 10, 25, 25, 25, 100]);\n\n    // Flexbuffer has special types for fixed-length-typed-vectors (if the length is 3 or 4 and the\n    // type is int, uint, or float). They're even more compact than typed vectors.\n    // The monster's position and Velocity will be stored as `FlexbufferType::VectorFloat3`.\n    monster.push(\"position\", &[0.0; 3]);\n    monster.push(\"velocity\", &[1.0, 0.0, 0.0]);\n\n    // Give the monster bright red skin. In rust, numbers are assumed integers until proven\n    // otherwise. We annotate u8 to tell flexbuffers to store it as a FlexbufferType::VectorUInt4.\n    monster.push(\"color\", &[255, 0, 0, 255u8]);\n\n    // End the map at the root of the builder. This finishes the Flexbuffer.\n    monster.end_map();\n\n    // Now the buffer is free to be reused. Let's see the final buffer.\n    let data = builder.view();\n    println!(\"The monster was serialized in {:?} bytes.\", data.len());\n\n    // Let's read and verify the data.\n    let root = Reader::get_root(data).unwrap();\n    println!(\"The monster: {}\", root);\n\n    let read_monster = root.as_map();\n\n    // What attributes does this monster have?\n    let attrs: Vec<_> = read_monster.iter_keys().collect();\n    assert_eq!(\n        attrs,\n        vec![\"coins\", \"color\", \"enraged\", \"hp\", \"mana\", \"position\", \"velocity\", \"weapons\"]\n    );\n\n    // index into a vector or map with the `idx` method.\n    let read_hp = read_monster.idx(\"hp\");\n    let read_mana = read_monster.idx(\"mana\");\n    // If `idx` fails it will return a Null flexbuffer Reader\n\n    // Use `as_T` to cast the data to your desired type.\n    assert_eq!(read_hp.as_u8(), 80);\n    assert_eq!(read_hp.as_f32(), 80.0);\n    // If it fails it will return T::default().\n    assert_eq!(read_hp.as_str(), \"\"); // Its not a string.\n    assert_eq!(read_mana.as_i8(), 0); // 200 is not representable in i8.\n    assert!(read_mana.as_vector().is_empty()); // Its not a vector.\n    assert_eq!(read_monster.idx(\"foo\").as_i32(), 0); // `foo` is not a monster attribute.\n\n    // To examine how your data is stored, check the flexbuffer type and bitwidth.\n    assert!(read_hp.flexbuffer_type().is_int());\n    assert!(read_mana.flexbuffer_type().is_int());\n    // Note that mana=200 is bigger than the maximum i8 so everything in the top layer of the\n    // monster map is stored in 16 bits.\n    assert_eq!(read_hp.bitwidth(), BitWidth::W16);\n    assert_eq!(read_monster.idx(\"mana\").bitwidth(), BitWidth::W16);\n\n    // Use get_T functions if you want to ensure the flexbuffer type matches what you expect.\n    assert_eq!(read_hp.get_i64(), Ok(80));\n    assert!(read_hp.get_u64().is_err());\n    assert!(read_hp.get_vector().is_err());\n\n    // Analogously, the `index` method is the safe version of `idx`.\n    assert!(read_monster.index(\"hp\").is_ok());\n    assert_eq!(read_monster.index(\"foo\").unwrap_err(), ReaderError::KeyNotFound);\n\n    // Maps can also be indexed by usize. They're stored by key so `coins` are the first element.\n    let monster_coins = read_monster.idx(0);\n    // Maps and Vectors can be iterated over.\n    assert!(monster_coins\n        .as_vector()\n        .iter()\n        .map(|r| r.as_u8())\n        .eq(vec![5, 10, 25, 25, 25, 100].into_iter()));\n\n    // Build the answer to life the universe and everything. Reusing a builder resets it. The\n    // reused internals won't need to reallocate leading to a potential 2x speedup.\n    builder.build_singleton(42);\n\n    // The monster is now no more.\n    assert_eq!(builder.view().len(), 3); // Bytes.\n\n    let the_answer = Reader::get_root(builder.view()).unwrap();\n    assert_eq!(the_answer.as_i32(), 42);\n}\n\n#[test]\nfn test_main() {\n    main()\n}\n"
  },
  {
    "path": "samples/sample_flexbuffers_serde.rs",
    "content": "// Copyright 2019 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nextern crate flexbuffers;\nextern crate serde;\n#[macro_use]\nextern crate serde_derive;\nuse serde::{Deserialize, Serialize};\n\n#[derive(Debug, PartialEq, Serialize, Deserialize)]\nenum Weapon {\n    Fist,\n    Equipment { name: String, damage: i32 },\n}\n\n#[derive(Debug, PartialEq, Serialize, Deserialize)]\nstruct Color(u8, u8, u8, u8);\n\n#[derive(Debug, PartialEq, Serialize, Deserialize)]\nstruct Monster {\n    hp: u32,\n    mana: i32,\n    enraged: bool,\n    weapons: Vec<Weapon>,\n    color: Color,\n    position: [f64; 3],\n    velocity: [f64; 3],\n    coins: Vec<u32>,\n}\n\nfn main() {\n    let monster = Monster {\n        hp: 80,\n        mana: 200,\n        enraged: true,\n        color: Color(255, 255, 255, 255),\n        position: [0.0; 3],\n        velocity: [1.0, 0.0, 0.0],\n        weapons: vec![\n            Weapon::Fist,\n            Weapon::Equipment { name: \"great axe\".to_string(), damage: 15 },\n            Weapon::Equipment { name: \"hammer\".to_string(), damage: 5 },\n        ],\n        coins: vec![5, 10, 25, 25, 25, 100],\n    };\n    let mut s = flexbuffers::FlexbufferSerializer::new();\n    monster.serialize(&mut s).unwrap();\n\n    let r = flexbuffers::Reader::get_root(s.view()).unwrap();\n\n    // Serialization is similar to JSON. Field names are stored in the buffer but are reused\n    // between all maps and structs.\n    println!(\"Monster stored in {:?} bytes.\", s.view().len());\n    println!(\"{}\", r);\n\n    let monster2 = Monster::deserialize(r).unwrap();\n\n    assert_eq!(monster, monster2);\n}\n\n#[test]\nfn test_main() {\n    main()\n}\n"
  },
  {
    "path": "samples/sample_text.cpp",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"flatbuffers/idl.h\"\n#include \"flatbuffers/util.h\"\n#include \"monster_generated.h\"  // Already includes \"flatbuffers/flatbuffers.h\".\n\nusing namespace MyGame::Sample;\n\n// This is an example of parsing text straight into a buffer and then\n// generating flatbuffer (JSON) text from the buffer.\nint main(int /*argc*/, const char* /*argv*/[]) {\n  // load FlatBuffer schema (.fbs) and JSON from disk\n  std::string schemafile;\n  std::string jsonfile;\n  bool ok = flatbuffers::LoadFile(\"samples/monster.fbs\", false, &schemafile) &&\n            flatbuffers::LoadFile(\"samples/monsterdata.json\", false, &jsonfile);\n  if (!ok) {\n    printf(\"couldn't load files!\\n\");\n    return 1;\n  }\n\n  // parse schema first, so we can use it to parse the data after\n  flatbuffers::Parser parser;\n  const char* include_directories[] = {\"samples\", nullptr};\n  ok = parser.Parse(schemafile.c_str(), include_directories) &&\n       parser.Parse(jsonfile.c_str(), include_directories);\n  assert(ok);\n\n  // here, parser.builder_ contains a binary buffer that is the parsed data.\n\n  // to ensure it is correct, we now generate text back from the binary,\n  // and compare the two:\n  std::string jsongen;\n  if (GenText(parser, parser.builder_.GetBufferPointer(), &jsongen)) {\n    printf(\"Couldn't serialize parsed data to JSON!\\n\");\n    return 1;\n  }\n\n  if (jsongen != jsonfile) {\n    printf(\"%s----------------\\n%s\", jsongen.c_str(), jsonfile.c_str());\n  }\n\n  printf(\"The FlatBuffer has been parsed from JSON successfully.\\n\");\n}\n"
  },
  {
    "path": "samples/sample_text.lobster",
    "content": "// Copyright 2018 Google Inc. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport from \"../lobster/\"\nimport monster_generated\n\n// Example how to interop with JSON.\n\n// Test loading some JSON, converting it to a binary FlatBuffer and back again.\n\n// First read the schema and JSON data.\nlet schema = read_file(\"monster.fbs\", true)\nlet json = read_file(\"monsterdata.json\", true)\nassert schema and json\n\n// Parse JSON  to binary:\nlet fb, err1 = flatbuffers_json_to_binary(schema, json, [])\nassert not err1\n\n// Access one field in it, just to check:\nlet monster = MyGame_Sample_GetRootAsMonster(fb)\nassert monster.name == \"Orc\"\n\n// Convert binary back to JSON:\nlet json2, err2 = flatbuffers_binary_to_json(schema, fb, [])\nassert not err2\n\n// The generated JSON should be exactly equal to the original!\nassert json == json2\n\n// Print what we've been converting for good measure:\nprint json\n"
  },
  {
    "path": "scripts/check-grpc-generated-code.py",
    "content": "#!/usr/bin/env python3\n#\n# Copyright 2022 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nfrom pathlib import Path\nimport subprocess\nimport sys\nimport generate_grpc_examples\n\n# Get the path where this script is located so we can invoke the script from\n# any directory and have the paths work correctly.\nscript_path = Path(__file__).parent.resolve()\n\n# Get the root path as an absolute path, so all derived paths are absolute.\nroot_path = script_path.parent.absolute()\n\nprint(\"Generating GRPC code...\")\ngenerate_grpc_examples.GenerateGRPCExamples()\n\nresult = subprocess.run(\n    [\"git\", \"diff\", \"--quiet\", \"--ignore-cr-at-eol\"], cwd=root_path\n)\n\nif result.returncode != 0:\n  print(\n      \"\\n\"\n      \"ERROR: ********************************************************\\n\"\n      \"ERROR: * The following differences were found after running   *\\n\"\n      \"ERROR: * the script/generate_grpc_examples.py script. Maybe   *\\n\"\n      \"ERROR: * you forgot to run it after making changes in a       *\\n\"\n      \"ERROR: * generator or schema?                                 *\\n\"\n      \"ERROR: ********************************************************\\n\"\n  )\n  subprocess.run([\"git\", \"diff\", \"--binary\", \"--exit-code\"], cwd=root_path)\n  sys.exit(result.returncode)\n"
  },
  {
    "path": "scripts/check_generate_code.py",
    "content": "#!/usr/bin/env python3\n#\n# Copyright 2021 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nfrom pathlib import Path\nimport platform\nimport subprocess\nimport sys\n\n# Get the path where this script is located so we can invoke the script from\n# any directory and have the paths work correctly.\nscript_path = Path(__file__).parent.resolve()\n\n# Get the root path as an absolute path, so all derived paths are absolute.\nroot_path = script_path.parent.absolute()\n\nresult = subprocess.run(\n    [\"git\", \"diff\", \"--quiet\", \"--ignore-cr-at-eol\"], cwd=root_path\n)\n\nif result.returncode != 0:\n  print(\n      \"\\n\"\n      \"ERROR: **********************************************************\\n\"\n      \"ERROR: * The following differences were found after building.   *\\n\"\n      \"ERROR: * Perhaps there is a difference in the flags for the.    *\\n\"\n      \"ERROR: * CMakeLists.txt vs the scripts/generate_code.py script? *\\n\"\n      \"ERROR: **********************************************************\\n\"\n  )\n  subprocess.run([\"git\", \"diff\", \"--binary\", \"--exit-code\"], cwd=root_path)\n  sys.exit(result.returncode)\n\n# Rung the generate_code.py script, forwarding arguments\ngen_cmd = [\"scripts/generate_code.py\"] + sys.argv[1:]\nif platform.system() == \"Windows\":\n  gen_cmd = [\"py\"] + gen_cmd\nsubprocess.run(gen_cmd, cwd=root_path)\n\nresult = subprocess.run(\n    [\"git\", \"diff\", \"--quiet\", \"--ignore-cr-at-eol\"], cwd=root_path\n)\n\nif result.returncode != 0:\n  print(\n      \"\\n\"\n      \"ERROR: *********************************************************\\n\"\n      \"ERROR: * The following differences were found after running    *\\n\"\n      \"ERROR: * the scripts/generate_code.py script. Maybe you forgot *\\n\"\n      \"ERROR: * to run it after making changes in a generator?        *\\n\"\n      \"ERROR: *********************************************************\\n\"\n  )\n  subprocess.run([\"git\", \"diff\", \"--binary\", \"--exit-code\"], cwd=root_path)\n  sys.exit(result.returncode)\n\nsys.exit(0)\n"
  },
  {
    "path": "scripts/clang-format-all.sh",
    "content": "# Running it twice corrects some bugs in clang-format.\nfor run in {1..2}\ndo\n  clang-format -i include/flatbuffers/* src/*.cpp tests/*.cpp samples/*.cpp grpc/src/compiler/schema_interface.h grpc/tests/*.cpp\ndone\ngit checkout include/flatbuffers/reflection_generated.h\n"
  },
  {
    "path": "scripts/clang-format-git.sh",
    "content": "# Running it twice corrects some bugs in clang-format.\nfor run in {1..2}\ndo\n  git clang-format HEAD^ -- include/flatbuffers/* src/*.cpp tests/*.cpp samples/*.cpp grpc/src/compiler/schema_interface.h grpc/tests/*.cpp -f\ndone\ngit checkout include/flatbuffers/reflection_generated.h\n"
  },
  {
    "path": "scripts/clang-tidy-git.sh",
    "content": "run-clang-tidy -fix -extra-arg=-std=c++11 -extra-arg=-Wno-unknown-warning-option `git diff --name-only origin/HEAD`\n"
  },
  {
    "path": "scripts/generate_code.py",
    "content": "#!/usr/bin/env python3\n#\n# Copyright 2021 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nimport filecmp\nimport glob\nfrom pathlib import Path\nimport shutil\nimport subprocess\nimport generate_grpc_examples\nfrom util import args, flatc, flatc_path, root_path, tests_path\n\n# Specify the other paths that will be referenced\nswift_code_gen = Path(root_path, \"tests/swift/fuzzer/CodeGenerationTests\")\nts_code_gen = Path(root_path, \"tests/ts\")\nsamples_path = Path(root_path, \"samples\")\nreflection_path = Path(root_path, \"reflection\")\n\n\n# Generate the code for flatbuffers reflection schema\ndef flatc_reflection(options, location, target):\n  full_options = [\"--no-prefix\"] + options\n  temp_dir = \".tmp\"\n  flatc(\n      full_options,\n      prefix=temp_dir,\n      schema=\"reflection.fbs\",\n      cwd=reflection_path,\n  )\n  new_reflection_path = Path(reflection_path, temp_dir, target)\n  original_reflection_path = Path(root_path, location, target)\n  if not filecmp.cmp(str(new_reflection_path), str(original_reflection_path)):\n    shutil.rmtree(str(original_reflection_path), ignore_errors=True)\n    shutil.move(str(new_reflection_path), str(original_reflection_path))\n  shutil.rmtree(str(Path(reflection_path, temp_dir)))\n\n\ndef flatc_annotate(schema, file, include=None, cwd=tests_path):\n  cmd = [str(flatc_path)]\n  if include:\n    cmd += [\"-I\"] + [include]\n  cmd += [\"--annotate\", schema, file]\n  result = subprocess.run(cmd, cwd=str(cwd), check=True)\n\n\n# Glob a pattern relative to file path\ndef glob(path, pattern):\n  return [str(p) for p in path.glob(pattern)]\n\n\n# flatc options that are shared\nBASE_OPTS = [\"--reflect-names\", \"--gen-mutable\", \"--gen-object-api\"]\nNO_INCL_OPTS = BASE_OPTS + [\"--no-includes\"]\n\n# Language specific options\nCS_OPTS = [\"--csharp\", \"--cs-gen-json-serializer\"]\nCPP_OPTS = [\n    \"--cpp\",\n    \"--gen-compare\",\n    \"--gen-absl-hash\",\n] + ([\"--cpp-std\", \"c++0x\"] if args.cpp_0x else [])\n\nCPP_17_OPTS = NO_INCL_OPTS + [\n    \"--cpp\",\n    \"--cpp-std\",\n    \"c++17\",\n    \"--cpp-static-reflection\",\n    \"--gen-object-api\",\n]\nRUST_OPTS = BASE_OPTS + [\n    \"--rust\",\n    \"--gen-all\",\n    \"--gen-name-strings\",\n    \"--rust-module-root-file\",\n]\nRUST_STANDALONE_OPTS = BASE_OPTS + [\n    \"--rust\",\n    \"--gen-all\",\n    \"--gen-name-strings\",\n]\nRUST_SERIALIZE_OPTS = BASE_OPTS + [\n    \"--rust\",\n    \"--gen-all\",\n    \"--gen-name-strings\",\n    \"--rust-serialize\",\n    \"--rust-module-root-file\",\n]\nTS_OPTS = [\"--ts\", \"--gen-name-strings\"]\nLOBSTER_OPTS = [\"--lobster\"]\nSWIFT_OPTS = [\"--swift\", \"--gen-json-emit\", \"--bfbs-filenames\", str(tests_path)]\nSWIFT_OPTS_CODE_GEN = [\n    \"--swift\",\n    \"--gen-json-emit\",\n    \"--bfbs-filenames\",\n    str(swift_code_gen),\n]\nJAVA_OPTS = [\"--java\"]\nKOTLIN_OPTS = [\"--kotlin\"]\nPHP_OPTS = [\"--php\"]\nDART_OPTS = [\"--dart\"]\nPYTHON_OPTS = [\"--python\", \"--python-typing\", \"--python-decode-obj-api-strings\"]\nBINARY_OPTS = [\"-b\", \"--schema\", \"--bfbs-comments\", \"--bfbs-builtins\"]\nPROTO_OPTS = [\"--proto\"]\n\n# Basic Usage\n\nflatc(\n    NO_INCL_OPTS\n    + CPP_OPTS\n    + CS_OPTS\n    + [\n        \"--binary\",\n        \"--java\",\n        \"--kotlin\",\n        \"--dart\",\n        \"--go\",\n        \"--lobster\",\n        \"--php\",\n    ],\n    schema=\"monster_test.fbs\",\n    include=\"include_test\",\n    data=\"monsterdata_test.json\",\n)\n\nflatc(\n    NO_INCL_OPTS + DART_OPTS,\n    schema=\"include_test/include_test1.fbs\",\n    include=\"include_test/sub\",\n)\n\nflatc(\n    NO_INCL_OPTS + DART_OPTS,\n    schema=\"include_test/sub/include_test2.fbs\",\n    include=\"include_test\",\n)\n\nflatc(\n    NO_INCL_OPTS + TS_OPTS,\n    cwd=ts_code_gen,\n    schema=\"../monster_test.fbs\",\n    include=\"../include_test\",\n    data=\"../monsterdata_test.json\",\n)\n\nflatc(\n    [\"--lua\", \"--bfbs-filenames\", str(tests_path)],\n    schema=\"monster_test.fbs\",\n    include=\"include_test\",\n)\n\n\"\"\"NOTE: The C++ gRPC golden is generated with the callback API enabled so that\nthe repository goldens exercise the callback client & server code paths.\nIf you need the legacy (non-callback) variant for comparison, invoke flatc\nmanually without --grpc-callback-api; we intentionally do not keep both to\nminimize golden churn.\"\"\"\nflatc(\n    NO_INCL_OPTS + CPP_OPTS + [\"--grpc\", \"--grpc-callback-api\"],\n    schema=\"monster_test.fbs\",\n    include=\"include_test\",\n    data=\"monsterdata_test.json\",\n)\n\n# Also generate a suffix variant exercising the callback API to keep prior\n# *_generated naming convention in sync with new callback additions.\nflatc(\n    NO_INCL_OPTS\n    + CPP_OPTS\n    + [\"--grpc\", \"--grpc-callback-api\", \"--filename-suffix\", \"_generated\"],\n    schema=\"monster_test.fbs\",\n    include=\"include_test\",\n)\n\nflatc(\n    RUST_OPTS,\n    schema=\"monster_test.fbs\",\n    include=\"include_test\",\n    prefix=\"monster_test\",\n    data=\"monsterdata_test.json\",\n)\n\nflatc(\n    RUST_SERIALIZE_OPTS,\n    schema=\"monster_test.fbs\",\n    include=\"include_test\",\n    prefix=\"monster_test_serialize\",\n    data=\"monsterdata_test.json\",\n)\n\nflatc(\n    options=BASE_OPTS + [\"--python\"],\n    schema=\"monster_test.fbs\",\n    include=\"include_test\",\n    data=\"monsterdata_test.json\",\n)\n\nflatc(\n    options=BASE_OPTS + [\"--python\", \"--gen-onefile\"],\n    schema=\"monster_test.fbs\",\n    include=\"include_test\",\n    data=\"monsterdata_test.json\",\n)\n\nflatc(\n    PROTO_OPTS,\n    schema=\"prototest/test.proto\",\n)\n\n# For Rust we currently generate two independent schemas, with namespace_test2\n# duplicating the types in namespace_test1\nflatc(\n    RUST_OPTS + CS_OPTS,\n    prefix=\"namespace_test\",\n    schema=[\n        \"namespace_test/namespace_test1.fbs\",\n        \"namespace_test/namespace_test2.fbs\",\n    ],\n)\n\nflatc(\n    [\n        \"--cpp\",\n        \"--reflect-names\",\n        \"--no-includes\",\n        \"--gen-mutable\",\n        \"--gen-object-api\",\n        \"--gen-compare\",\n        \"--gen-name-strings\",\n    ],\n    prefix=\"namespace_test\",\n    schema=[\n        \"namespace_test/namespace_test1.fbs\",\n        \"namespace_test/namespace_test2.fbs\",\n    ],\n)\n\nflatc(\n    BASE_OPTS + CPP_OPTS + [\"--cpp-ptr-type\", \"naked\"],\n    prefix=\"vector_table_naked_ptr\",\n    schema=\"vector_table_naked_ptr.fbs\",\n)\n\nflatc(\n    BASE_OPTS + CPP_OPTS + CS_OPTS + JAVA_OPTS + KOTLIN_OPTS + PHP_OPTS,\n    prefix=\"union_vector\",\n    schema=\"union_vector/union_vector.fbs\",\n)\n\nflatc(\n    BASE_OPTS + TS_OPTS,\n    cwd=ts_code_gen,\n    prefix=\"union_vector\",\n    schema=\"../union_vector/union_vector.fbs\",\n)\n\nflatc(\n    BASE_OPTS + TS_OPTS + [\"--gen-name-strings\", \"--gen-mutable\"],\n    cwd=ts_code_gen,\n    include=\"../include_test\",\n    schema=\"../monster_test.fbs\",\n)\n\nflatc(\n    BASE_OPTS + TS_OPTS + [\"-b\"],\n    cwd=ts_code_gen,\n    include=\"../include_test\",\n    schema=\"../monster_test.fbs\",\n    data=\"../unicode_test.json\",\n)\n\nflatc(\n    BASE_OPTS + TS_OPTS + [\"--gen-name-strings\"],\n    cwd=ts_code_gen,\n    prefix=\"union_vector\",\n    schema=\"../union_vector/union_vector.fbs\",\n)\n\nflatc(\n    RUST_OPTS,\n    prefix=\"include_test1\",\n    include=\"include_test\",\n    schema=\"include_test/include_test1.fbs\",\n)\n\nflatc(\n    RUST_STANDALONE_OPTS,\n    include=\"include_test\",\n    schema=\"include_test/include_test1.fbs\",\n)\n\nflatc(\n    RUST_OPTS,\n    prefix=\"include_test2\",\n    include=\"include_test\",\n    schema=\"include_test/sub/include_test2.fbs\",\n)\n\nflatc(\n    RUST_STANDALONE_OPTS,\n    include=\"include_test\",\n    schema=\"include_test/sub/include_test2.fbs\",\n)\n\nflatc(\n    BINARY_OPTS + [\"--bfbs-filenames\", str(tests_path)],\n    include=\"include_test\",\n    schema=\"monster_test.fbs\",\n)\n\n# Generate the annotated binary of the monster_test binary schema.\nflatc_annotate(\n    schema=\"../reflection/reflection.fbs\",\n    file=\"monster_test.bfbs\",\n    include=\"include_test\",\n)\n\nflatc_annotate(\n    schema=\"monster_test.fbs\",\n    file=\"monsterdata_test.mon\",\n    include=\"include_test\",\n)\n\nflatc(\n    CPP_OPTS\n    + NO_INCL_OPTS\n    + [\n        \"--bfbs-comments\",\n        \"--bfbs-builtins\",\n        \"--bfbs-gen-embed\",\n        \"--bfbs-filenames\",\n        str(tests_path),\n    ],\n    include=\"include_test\",\n    schema=\"monster_test.fbs\",\n)\n\nflatc(\n    BINARY_OPTS + [\"--bfbs-filenames\", str(tests_path)],\n    include=\"include_test\",\n    schema=\"arrays_test.fbs\",\n)\n\nflatc(\n    [\"--jsonschema\", \"--schema\"],\n    include=\"include_test\",\n    schema=\"monster_test.fbs\",\n)\n\nif not args.skip_monster_extra:\n  flatc(\n      CPP_OPTS + CS_OPTS + NO_INCL_OPTS + JAVA_OPTS + KOTLIN_OPTS + PYTHON_OPTS,\n      schema=\"monster_extra.fbs\",\n      data=\"monsterdata_extra.json\",\n  )\n\n  flatc(\n      DART_OPTS + [\"--gen-object-api\"],\n      schema=\"monster_extra.fbs\",\n  )\n\nflatc(\n    CPP_OPTS\n    + CS_OPTS\n    + NO_INCL_OPTS\n    + JAVA_OPTS\n    + [\"--jsonschema\", \"--scoped-enums\"],\n    schema=\"arrays_test.fbs\",\n)\n\nflatc(\n    [\"--cpp\", \"--gen-compare\", \"--gen-mutable\", \"--gen-object-api\", \"--reflect-names\"],\n    schema=\"native_type_test.fbs\",\n)\n\nflatc(\n    [\n        \"--cpp\",\n        \"--gen-mutable\",\n        \"--gen-compare\",\n        \"--gen-object-api\",\n        \"--reflect-names\",\n    ],\n    schema=\"native_inline_table_test.fbs\",\n)\n\nflatc(\n    [\"--cpp\", \"--gen-compare\", \"--gen-mutable\", \"--gen-object-api\", \"--reflect-names\"],\n    schema=\"cross_namespace_pack_test.fbs\",\n)\n\nflatc(\n    RUST_OPTS,\n    prefix=\"arrays_test\",\n    schema=\"arrays_test.fbs\",\n)\n\nflatc(\n    RUST_OPTS,\n    prefix=\"rust_namer_test\",\n    schema=\"rust_namer_test.fbs\",\n)\n\nflatc(\n    BASE_OPTS + PYTHON_OPTS,\n    schema=\"arrays_test.fbs\",\n)\n\n\nflatc(\n    BASE_OPTS + PYTHON_OPTS,\n    schema=\"nested_union_test.fbs\",\n)\n\nflatc(\n    [\"--python\", \"--gen-object-api\"],\n    schema=\"union_name_test.fbs\",\n)\n\nflatc(\n    NO_INCL_OPTS + CPP_OPTS,\n    schema=\"default_vectors_strings_test.fbs\",\n)\n\n# Optional Scalars\noptional_scalars_schema = \"optional_scalars.fbs\"\nflatc([\"--java\", \"--kotlin\", \"--lobster\"], schema=optional_scalars_schema)\nflatc(TS_OPTS, cwd=ts_code_gen, schema=\"../optional_scalars.fbs\")\n\nflatc(\n    [\"--csharp\", \"--python\", \"--gen-object-api\"], schema=optional_scalars_schema\n)\n\nflatc(RUST_OPTS, prefix=\"optional_scalars\", schema=optional_scalars_schema)\n\nflatc(NO_INCL_OPTS + CPP_OPTS, schema=optional_scalars_schema)\n\n# Type / field collsion\ntype_field_collsion_schema = \"type_field_collsion.fbs\"\n\nflatc([\"--csharp\", \"--gen-object-api\"], schema=type_field_collsion_schema)\n\n# Union / value collision\nflatc(\n    CS_OPTS + [\"--gen-object-api\", \"--gen-onefile\"],\n    prefix=\"union_value_collsion\",\n    schema=\"union_value_collision.fbs\",\n)\n\n# Generate string/vector default code for tests\nflatc(RUST_OPTS, prefix=\"more_defaults\", schema=\"more_defaults.fbs\")\n\n# Generate the schema evolution tests\nflatc(\n    CPP_OPTS + [\"--scoped-enums\"],\n    prefix=\"evolution_test\",\n    schema=glob(tests_path, \"evolution_test/evolution_v*.fbs\"),\n)\n\n# Generate the keywords tests\nflatc(BASE_OPTS + CS_OPTS, schema=\"keyword_test.fbs\")\nflatc(RUST_OPTS, prefix=\"keyword_test\", schema=\"keyword_test.fbs\")\nflatc(\n    BASE_OPTS + CS_OPTS + [\"--cs-global-alias\", \"--gen-onefile\"],\n    prefix=\"nested_namespace_test\",\n    schema=glob(tests_path, \"nested_namespace_test/nested_namespace_test*.fbs\"),\n)\nflatc(BASE_OPTS + DART_OPTS, prefix=\"../dart/test/\", schema=\"keyword_test.fbs\")\n\n# Field key lookup with default value test\ndictionary_lookup_schema = \"dictionary_lookup.fbs\"\nflatc([\"--java\", \"--kotlin\"], schema=dictionary_lookup_schema)\n\n# Swift Tests\nswift_prefix = \"swift/Tests/Flatbuffers\"\nflatc(\n    SWIFT_OPTS + BASE_OPTS + [\"--grpc\"],\n    schema=\"monster_test.fbs\",\n    include=\"include_test\",\n    prefix=swift_prefix,\n)\n\nflatc(\n    SWIFT_OPTS + BASE_OPTS,\n    schema=\"arrays_test.fbs\",\n    prefix=swift_prefix,\n)\n\nflatc(\n    SWIFT_OPTS + BASE_OPTS,\n    schema=\"union_vector/union_vector.fbs\",\n    prefix=swift_prefix,\n)\nflatc(SWIFT_OPTS, schema=\"optional_scalars.fbs\", prefix=swift_prefix)\nflatc(SWIFT_OPTS, schema=\"vector_has_test.fbs\", prefix=swift_prefix)\nflatc(SWIFT_OPTS, schema=\"nan_inf_test.fbs\", prefix=swift_prefix)\nflatc(\n    SWIFT_OPTS + [\"--gen-object-api\"],\n    schema=\"more_defaults.fbs\",\n    prefix=swift_prefix,\n)\nflatc(\n    SWIFT_OPTS + BASE_OPTS,\n    schema=\"MutatingBool.fbs\",\n    prefix=swift_prefix,\n)\n\nflatc(\n    SWIFT_OPTS_CODE_GEN + BASE_OPTS + [\"--grpc\", \"--swift-implementation-only\"],\n    schema=\"test_import.fbs\",\n    cwd=swift_code_gen,\n)\n\nflatc(\n    SWIFT_OPTS_CODE_GEN + NO_INCL_OPTS + [\"--grpc\"],\n    schema=\"test_no_include.fbs\",\n    cwd=swift_code_gen,\n)\n\nflatc(\n    SWIFT_OPTS_CODE_GEN + BASE_OPTS,\n    schema=\"empty_vtable.fbs\",\n    cwd=swift_code_gen,\n    prefix=\"../../Tests/Flatbuffers/\",\n)\n\n# Swift Wasm Tests\nswift_Wasm_prefix = \"swift/Wasm.tests/Tests/FlatBuffers.Test.Swift.WasmTests\"\nflatc(\n    SWIFT_OPTS + BASE_OPTS,\n    schema=\"monster_test.fbs\",\n    include=\"include_test\",\n    prefix=swift_Wasm_prefix,\n)\n\n# Nim Tests\nNIM_OPTS = BASE_OPTS + [\"--nim\"]\nflatc(NIM_OPTS, schema=\"monster_test.fbs\", include=\"include_test\")\nflatc(NIM_OPTS, schema=\"optional_scalars.fbs\")\nflatc(NIM_OPTS, schema=\"more_defaults.fbs\")\nflatc(NIM_OPTS, schema=\"MutatingBool.fbs\")\n\n# --filename-suffix and --filename-ext tests\nflatc(\n    CPP_OPTS + NO_INCL_OPTS + [\"--grpc\", \"--filename-ext\", \"hpp\"],\n    include=\"include_test\",\n    prefix=\"monster_test_suffix/ext_only\",\n    schema=\"monster_test.fbs\",\n)\nflatc(\n    CPP_OPTS + NO_INCL_OPTS + [\"--grpc\", \"--filename-suffix\", \"_suffix\"],\n    include=\"include_test\",\n    prefix=\"monster_test_suffix/filesuffix_only\",\n    schema=\"monster_test.fbs\",\n)\nflatc(\n    CPP_OPTS\n    + NO_INCL_OPTS\n    + [\"--grpc\", \"--filename-suffix\", \"_suffix\", \"--filename-ext\", \"hpp\"],\n    include=\"include_test\",\n    prefix=\"monster_test_suffix\",\n    schema=\"monster_test.fbs\",\n)\n\n# Flag c++17 requires Clang6, GCC7, MSVC2017 (_MSC_VER >= 1914) or higher.\ncpp_17_prefix = \"cpp17/generated_cpp17\"\nflatc(\n    CPP_17_OPTS,\n    schema=\"monster_test.fbs\",\n    include=\"include_test\",\n    prefix=cpp_17_prefix,\n)\nflatc(\n    CPP_17_OPTS,\n    schema=\"optional_scalars.fbs\",\n    prefix=cpp_17_prefix,\n)\nflatc(\n    CPP_17_OPTS,\n    schema=\"union_vector/union_vector.fbs\",\n    prefix=cpp_17_prefix,\n)\n\n# Private annotations\nannotations_test_schema = \"private_annotation_test.fbs\"\n\nflatc(\n    RUST_OPTS + [\"--no-leak-private-annotation\", \"--gen-object-api\"],\n    prefix=\"private_annotation_test\",\n    schema=annotations_test_schema,\n)\n\n# Sample files\nsamples_schema = \"monster.fbs\"\nflatc(\n    BASE_OPTS + CPP_OPTS + LOBSTER_OPTS + SWIFT_OPTS,\n    schema=samples_schema,\n    cwd=samples_path,\n)\nflatc(\n    RUST_OPTS, prefix=\"rust_generated\", schema=samples_schema, cwd=samples_path\n)\nflatc(\n    BINARY_OPTS + [\"--bfbs-filenames\", str(samples_path)],\n    schema=samples_schema,\n    cwd=samples_path,\n)\n\n# Reflection\n\n# Skip generating the reflection if told too, as we run this script after\n# building flatc which uses the reflection_generated.h itself.\nif not args.skip_gen_reflection:\n  # C++ Reflection\n  flatc_reflection(\n      [\"-c\", \"--cpp-std\", \"c++0x\"],\n      \"include/flatbuffers\",\n      \"reflection_generated.h\",\n  )\n\n# Python Reflection\nflatc_reflection([\"-p\"], \"python/flatbuffers\", \"reflection\")\n\n# Java Reflection\nflatc_reflection(\n    [\"-j\", \"--java-package-prefix\", \"com.google.flatbuffers\"],\n    \"java/src/main/java\",\n    \"com/google/flatbuffers/reflection\",\n)\n\n# Annotation\n\n\ndef flatc_annotate(schema, include=None, data=None, cwd=tests_path):\n  cmd = [str(flatc_path)]\n  if include:\n    cmd += [\"-I\"] + [include]\n  cmd += [\"--annotate\", schema]\n  if data:\n    cmd += [data] if isinstance(data, str) else data\n  subprocess.run(cmd, cwd=str(cwd), check=True)\n\n\nflatc_annotate(\n    schema=\"monster_test.fbs\",\n    include=\"include_test\",\n    data=\"monsterdata_test.mon\",\n)\n\n# Run the generate_grpc_examples script\ngenerate_grpc_examples.GenerateGRPCExamples()\n"
  },
  {
    "path": "scripts/generate_grpc_examples.py",
    "content": "#!/usr/bin/env python3\n#\n# Copyright 2022 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nfrom pathlib import Path\nfrom util import flatc, root_path\n\ngrpc_examples_path = Path(root_path, \"grpc/examples\")\n\ngreeter_schema = str(Path(grpc_examples_path, \"greeter.fbs\"))\n\nCOMMON_ARGS = [\n    \"--grpc\",\n    \"--bfbs-filenames\",\n    str(grpc_examples_path),\n]\n\n\ndef GenerateGRPCExamples():\n\n  flatc(\n      COMMON_ARGS\n      + [\n          \"--go\",\n      ],\n      schema=greeter_schema,\n      cwd=Path(grpc_examples_path, \"go/greeter\"),\n  )\n\n  flatc(\n      COMMON_ARGS\n      + [\n          \"--python\",\n      ],\n      schema=greeter_schema,\n      cwd=Path(grpc_examples_path, \"python/greeter\"),\n  )\n\n  flatc(\n      COMMON_ARGS\n      + [\n          \"--swift\",\n          \"--gen-json-emit\",\n      ],\n      schema=greeter_schema,\n      cwd=Path(grpc_examples_path, \"swift/Greeter/Sources/Model\"),\n  )\n\n  flatc(\n      COMMON_ARGS\n      + [\n          \"--ts\",\n      ],\n      schema=greeter_schema,\n      cwd=Path(grpc_examples_path, \"ts/greeter/src\"),\n  )\n\n\nif __name__ == \"__main__\":\n  GenerateGRPCExamples()\n"
  },
  {
    "path": "scripts/release.sh",
    "content": "#!/usr/bin/bash\n\n# Steps to do a release:\n#\n# 1. Make sure the repo builds and ./flatttests passes first, so that any\n#    version changes are localized.\n# 2. Run this script which should update all the version strings in the\n#    appropriate places.\n# 3. `make clean`\n# 4. `make -j flatc`\n# 5. Make sure the version is part of flatc: `./flatc --version`\n# 6. `scripts/generated_code.py`\n# 7. `goldens/generated_code.py`\n# 8. `make -j`\n# 9. Make sure the tests pass: `./flattests`\n# 10. Do a search for the old version string in the code base. It should only\n#     appear in the changelog.\n# 11. Update the CHANGELOG.md\n# 12. Make the git commit with the message: \"FlatBuffers Version X.X.X\"\n# 13. Tag the commit with `git -tag -a -m \"FlatBuffers Version X.X.X` vX.X.X\n# 14. Push the tag `git push origin vX.X.X`\n# 15. Make a release from the tag at https://github.com/google/flatbuffers/tags\n\n# Requires the xmlstarlet command.\n#   Install via: apt install xmlstarlet\nif ! command -v xmlstarlet 2>&1 >/dev/null\nthen\n    echo \"xmlstarlet could not be found\"\n    exit 1\nfi\n\n# Read the date as in the Pacific TZ, with no leading padding\nread year month day <<<$(date --date=\"TZ=\\\"US/Pacific\\\"\" +'%-y %-m %-d')\n\nversion=\"$year.$month.$day\"\nversion_underscore=\"$year\\_$month\\_$day\"\n\necho \"Setting Flatbuffers Version to: $version\"\n\necho \"Updating include/flatbuffers/base.h...\"\nsed -i \\\n  -e \"s/\\(#define FLATBUFFERS_VERSION_MAJOR \\).*/\\1$year/\" \\\n  -e \"s/\\(#define FLATBUFFERS_VERSION_MINOR \\).*/\\1$month/\" \\\n  -e \"s/\\(#define FLATBUFFERS_VERSION_REVISION \\).*/\\1$day/\" \\\n  include/flatbuffers/base.h\n\necho \"Updating CMake\\Version.cmake...\"\nsed -i \\\n  -e \"s/\\(set(VERSION_MAJOR \\).*/\\1$year)/\" \\\n  -e \"s/\\(set(VERSION_MINOR \\).*/\\1$month)/\" \\\n  -e \"s/\\(set(VERSION_PATCH \\).*/\\1$day)/\" \\\n  CMake/Version.cmake\n\necho \"Updating include/flatbuffers/reflection_generated.h...\"\necho \"Updating tests/evolution_test/evolution_v1_generated.h...\"\necho \"Updating tests/evolution_test/evolution_v1_generated.h...\"\nsed -i \\\n  -e \"s/\\(FLATBUFFERS_VERSION_MAJOR == \\)[0-9]*\\(.*\\)/\\1$year\\2/\" \\\n  -e \"s/\\(FLATBUFFERS_VERSION_MINOR == \\)[0-9]*\\(.*\\)/\\1$month\\2/\" \\\n  -e \"s/\\(FLATBUFFERS_VERSION_REVISION == \\)[0-9]*\\(.*\\)/\\1$day\\2/\" \\\n  include/flatbuffers/reflection_generated.h \\\n  tests/evolution_test/evolution_v1_generated.h \\\n  tests/evolution_test/evolution_v2_generated.h \\\n  tests/*_generated.h \\\n  tests/**/*_generated.h\n\necho \"Updating java/pom.xml...\"\nxmlstarlet edit --inplace -N s=http://maven.apache.org/POM/4.0.0 \\\n  --update '//s:project/s:version' --value $version \\\n  java/pom.xml\n\necho \"Updating package.json...\"\nsed -i \\\n  -e \"s/\\(\\\"version\\\": \\).*/\\1\\\"$version\\\",/\" \\\n  package.json\n\necho \"Updating library.json...\"\nsed -i \\\n  -e \"s/\\(\\\"version\\\": \\).*/\\1\\\"$version\\\",/\" \\\n  library.json\n\necho \"Updating net/FlatBuffers/Google.FlatBuffers.csproj...\"\nsed -i \\\n  -e \"s/\\(<PackageVersion>\\).*\\(<\\/PackageVersion>\\)/\\1$version\\2/\" \\\n  net/FlatBuffers/Google.FlatBuffers.csproj\n\necho \"Updating dart/pubspec.yaml...\"\nsed -i \\\n  -e \"s/\\(version: \\).*/\\1$version/\" \\\n  dart/pubspec.yaml\n\necho \"Updating python/flatbuffers/_version.py...\"\nsed -i \\\n  -e \"s/\\(__version__ = \\).*/\\1\\\"$version\\\"/\" \\\n  python/flatbuffers/_version.py\n\necho \"Updating python/setup.py...\"\nsed -i \\\n  -e \"s/\\(version='\\).*/\\1$version',/\" \\\n  python/setup.py\n\necho \"Updating rust/flatbuffers/Cargo.toml...\"\nsed -i \\\n  \"s/^version = \\\".*\\\"$/version = \\\"$version\\\"/g\" \\\n  rust/flatbuffers/Cargo.toml\n\necho \"Updating rust/flexbuffers/Cargo.toml...\"\nsed -i \\\n  \"s/^version = \\\".*\\\"$/version = \\\"$version\\\"/g\" \\\n  rust/flexbuffers/Cargo.toml\n\necho \"Updating FlatBuffers.podspec...\"\nsed -i \\\n  -e \"s/\\(s.version\\s*= \\).*/\\1'$version'/\" \\\n  FlatBuffers.podspec\n\necho \"Updating FlatBuffersVersion_X_X_X() version check....\"\ngrep -rl 'FlatBuffersVersion_' *  --exclude=release.sh | xargs -i@ \\\n  sed -i \\\n    -e \"s/\\(FlatBuffersVersion_\\).*()/\\1$version_underscore()/g\" \\\n    @\n\necho \"Updating FLATBUFFERS_X_X_X() version check....\"\ngrep -rl 'FLATBUFFERS_\\d*' *  --exclude=release.sh | xargs -i@ \\\n  sed -i \\\n    -e \"s/\\(FLATBUFFERS_\\)[0-9]\\{2\\}.*()/\\1$version_underscore()/g\" \\\n    @\n  \necho \"Updating MODULES.bazel...\"\nsed -i \\\n  \"3s/version = \\\".*\\\"/version = \\\"$version\\\"/\" \\\n  MODULE.bazel\n"
  },
  {
    "path": "scripts/util.py",
    "content": "# Copyright 2022 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nimport argparse\nfrom pathlib import Path\nimport platform\nimport subprocess\n\nparser = argparse.ArgumentParser()\nparser.add_argument(\n    \"--flatc\",\n    help=\"path of the Flat C compiler relative to the root directory\",\n)\nparser.add_argument(\"--cpp-0x\", action=\"store_true\", help=\"use --cpp-std c++ox\")\nparser.add_argument(\n    \"--skip-monster-extra\",\n    action=\"store_true\",\n    help=\"skip generating tests involving monster_extra.fbs\",\n)\nparser.add_argument(\n    \"--skip-gen-reflection\",\n    action=\"store_true\",\n    help=\"skip generating the reflection.fbs files\",\n)\nargs = parser.parse_args()\n\n# Get the path where this script is located so we can invoke the script from\n# any directory and have the paths work correctly.\nscript_path = Path(__file__).parent.resolve()\n\n# Get the root path as an absolute path, so all derived paths are absolute.\nroot_path = script_path.parent.absolute()\ntests_path = Path(root_path, \"tests\")\n\n# Get the location of the flatc executable, reading from the first command line\n# argument or defaulting to default names.\nflatc_exe = Path(\n    (\"flatc\" if not platform.system() == \"Windows\" else \"flatc.exe\")\n    if not args.flatc\n    else args.flatc\n)\n\n# Find and assert flatc compiler is present.\nif root_path in flatc_exe.parents:\n  flatc_exe = flatc_exe.relative_to(root_path)\nflatc_path = Path(root_path, flatc_exe)\nassert flatc_path.exists(), \"Cannot find the flatc compiler \" + str(flatc_path)\n\n\n# Execute the flatc compiler with the specified parameters\ndef flatc(\n    options, schema, prefix=None, include=None, data=None, cwd=tests_path\n):\n  cmd = [str(flatc_path)] + options\n  if prefix:\n    cmd += [\"-o\"] + [prefix]\n  if include:\n    cmd += [\"-I\"] + [include]\n  cmd += [schema] if isinstance(schema, str) else schema\n  if data:\n    cmd += [data] if isinstance(data, str) else data\n  result = subprocess.run(cmd, cwd=str(cwd), check=True)\n"
  },
  {
    "path": "snap/snapcraft.yaml",
    "content": "name: flatbuffers\nbase: core18\nadopt-info: flatc\nsummary: FlatBuffers compiler\ndescription: |\n  FlatBuffers compiler\n\n  NOTE: This snap also ships the necessary header files required to compile\n  projects using flatbuffers, however, for the compilation to work, you have\n  to manually add the following path in your project's configuration:\n\n  /snap/flatbuffers/current/include\n\n  If you need to use flatbuffers headers from a location other than the above\n  path, it is recommended to not use this snap as that could cause a mismatch.\n\ngrade: stable\nconfinement: strict\n\nparts:\n  flatc:\n    plugin: cmake\n    source: .\n    configflags:\n      - -GUnix Makefiles\n      - -DCMAKE_BUILD_TYPE=Release\n    build-packages:\n      - g++\n      - git\n    override-pull: |\n      snapcraftctl pull\n      tag=$(git describe --tags --abbrev=0)\n      count=$(git rev-list $tag.. --count)\n      if [ \"$count\" = 0 ];\n      then\n        version=$tag\n      else\n        hash=$(git rev-parse --short HEAD)\n        version=$tag+git$count.$hash\n      fi\n      snapcraftctl set-version $version\n\n\napps:\n  flatc:\n    command: bin/flatc\n    plugs:\n      - home\n      - removable-media\n"
  },
  {
    "path": "src/BUILD.bazel",
    "content": "# @unused\nload(\"@rules_cc//cc:defs.bzl\", \"cc_binary\", \"cc_library\")\n\npackage(\n    default_visibility = [\"//visibility:private\"],\n)\n\nfilegroup(\n    name = \"distribution\",\n    srcs = [\n        \"BUILD.bazel\",\n    ] + glob([\n        \"*.cpp\",\n        \"*.h\",\n    ]),\n    visibility = [\"//visibility:public\"],\n)\n\ncc_library(\n    name = \"code_generators\",\n    srcs = [\"code_generators.cpp\"],\n    hdrs = [\n        \"//:public_headers\",\n    ],\n    strip_include_prefix = \"/include\",\n    visibility = [\"//:__subpackages__\"],\n)\n\ncc_library(\n    name = \"generate_fbs\",\n    srcs = [\"idl_gen_fbs.cpp\"],\n    hdrs = [\"idl_gen_fbs.h\"],\n    strip_include_prefix = \"/src\",\n    visibility = [\"//:__subpackages__\"],\n    deps = [\":code_generators\"],\n)\n\n# Public flatc library to compile flatbuffer files at runtime.\ncc_library(\n    name = \"flatbuffers\",\n    srcs = [\n        \"idl_gen_text.cpp\",\n        \"idl_gen_text.h\",\n        \"idl_parser.cpp\",\n        \"reflection.cpp\",\n        \"util.cpp\",\n    ],\n    hdrs = [\n        \"//:public_headers\",\n    ],\n    linkopts = select({\n        # TODO: Bazel uses `clang` instead of `clang++` to link\n        # C++ code on BSD. Temporarily adding these linker flags while\n        # we wait for Bazel to resolve\n        # https://github.com/bazelbuild/bazel/issues/12023.\n        \"//:platform_freebsd\": [\"-lm\"],\n        \"//:platform_openbsd\": [\"-lm\"],\n        \"//conditions:default\": [],\n    }),\n    strip_include_prefix = \"/include\",\n    visibility = [\"//:__subpackages__\"],\n    deps = [\n        \":code_generators\",\n        \":generate_fbs\",\n    ],\n)\n\n# Public flatc compiler library.\ncc_library(\n    name = \"flatc_library\",\n    srcs = [\n        \"annotated_binary_text_gen.cpp\",\n        \"annotated_binary_text_gen.h\",\n        \"bfbs_gen.h\",\n        \"bfbs_gen_lua.cpp\",\n        \"bfbs_gen_lua.h\",\n        \"bfbs_gen_nim.cpp\",\n        \"bfbs_gen_nim.h\",\n        \"bfbs_namer.h\",\n        \"binary_annotator.cpp\",\n        \"binary_annotator.h\",\n        \"flatc.cpp\",\n        \"namer.h\",\n    ],\n    hdrs = [\n        \"//:flatc_headers\",\n    ],\n    strip_include_prefix = \"/include\",\n    visibility = [\"//:__pkg__\"],\n    deps = [\n        \":flatbuffers\",\n        \"//include/codegen:namer\",\n    ],\n)\n\n# Public flatc compiler.\ncc_library(\n    name = \"flatc\",\n    srcs = [\n        \"bfbs_gen.h\",\n        \"bfbs_gen_lua.cpp\",\n        \"bfbs_gen_lua.h\",\n        \"bfbs_gen_nim.cpp\",\n        \"bfbs_gen_nim.h\",\n        \"bfbs_namer.h\",\n        \"file_manager.cpp\",\n        \"file_name_manager.cpp\",\n        \"flatc_main.cpp\",\n        \"idl_gen_binary.cpp\",\n        \"idl_gen_binary.h\",\n        \"idl_gen_cpp.cpp\",\n        \"idl_gen_cpp.h\",\n        \"idl_gen_csharp.cpp\",\n        \"idl_gen_csharp.h\",\n        \"idl_gen_dart.cpp\",\n        \"idl_gen_dart.h\",\n        \"idl_gen_go.cpp\",\n        \"idl_gen_go.h\",\n        \"idl_gen_grpc.cpp\",\n        \"idl_gen_java.cpp\",\n        \"idl_gen_java.h\",\n        \"idl_gen_json_schema.cpp\",\n        \"idl_gen_json_schema.h\",\n        \"idl_gen_kotlin.cpp\",\n        \"idl_gen_kotlin.h\",\n        \"idl_gen_kotlin_kmp.cpp\",\n        \"idl_gen_lobster.cpp\",\n        \"idl_gen_lobster.h\",\n        \"idl_gen_php.cpp\",\n        \"idl_gen_php.h\",\n        \"idl_gen_python.cpp\",\n        \"idl_gen_python.h\",\n        \"idl_gen_rust.cpp\",\n        \"idl_gen_rust.h\",\n        \"idl_gen_swift.cpp\",\n        \"idl_gen_swift.h\",\n        \"idl_gen_text.cpp\",\n        \"idl_gen_text.h\",\n        \"idl_gen_ts.cpp\",\n        \"idl_gen_ts.h\",\n        \"idl_namer.h\",\n        \"namer.h\",\n        \"util.cpp\",\n    ],\n    hdrs = [\n        \"//:flatc_headers\",\n    ],\n    strip_include_prefix = \"/include\",\n    visibility = [\"//:__pkg__\"],\n    deps = [\n        \":flatc_library\",\n        \"//grpc/src/compiler:cpp_generator\",\n        \"//grpc/src/compiler:go_generator\",\n        \"//grpc/src/compiler:java_generator\",\n        \"//grpc/src/compiler:python_generator\",\n        \"//grpc/src/compiler:swift_generator\",\n        \"//grpc/src/compiler:ts_generator\",\n        \"//include/codegen:namer\",\n        \"//include/codegen:python\",\n    ],\n)\n"
  },
  {
    "path": "src/annotated_binary_text_gen.cpp",
    "content": "#include \"annotated_binary_text_gen.h\"\n\n#include <algorithm>\n#include <cstdint>\n#include <fstream>\n#include <ostream>\n#include <sstream>\n#include <string>\n\n#include \"binary_annotator.h\"\n#include \"flatbuffers/base.h\"\n#include \"flatbuffers/util.h\"\n\nnamespace flatbuffers {\nnamespace {\n\nstruct OutputConfig {\n  size_t largest_type_string = 10;\n\n  size_t largest_value_string = 20;\n\n  size_t max_bytes_per_line = 8;\n\n  size_t offset_max_char = 4;\n\n  char delimiter = '|';\n\n  bool include_vector_contents = true;\n};\n\nstatic std::string ToString(const BinarySectionType type) {\n  switch (type) {\n    case BinarySectionType::Header:\n      return \"header\";\n    case BinarySectionType::Table:\n      return \"table\";\n    case BinarySectionType::RootTable:\n      return \"root_table\";\n    case BinarySectionType::VTable:\n      return \"vtable\";\n    case BinarySectionType::Struct:\n      return \"struct\";\n    case BinarySectionType::String:\n      return \"string\";\n    case BinarySectionType::Vector:\n      return \"vector\";\n    case BinarySectionType::Vector64:\n      return \"vector64\";\n    case BinarySectionType::Unknown:\n      return \"unknown\";\n    case BinarySectionType::Union:\n      return \"union\";\n    case BinarySectionType::Padding:\n      return \"padding\";\n    default:\n      return \"todo\";\n  }\n}\n\nstatic bool IsOffset(const BinaryRegionType type) {\n  return type == BinaryRegionType::UOffset ||\n         type == BinaryRegionType::SOffset ||\n         type == BinaryRegionType::UOffset64;\n}\n\ntemplate <typename T>\nstd::string ToString(T value) {\n  if (std::is_floating_point<T>::value) {\n    std::stringstream ss;\n    ss << value;\n    return ss.str();\n  } else {\n    return std::to_string(value);\n  }\n}\n\ntemplate <typename T>\nstd::string ToValueString(const BinaryRegion& region, const uint8_t* binary) {\n  std::string s;\n  s += \"0x\";\n  const T val = ReadScalar<T>(binary + region.offset);\n  const uint64_t start_index = region.offset + region.length - 1;\n  for (uint64_t i = 0; i < region.length; ++i) {\n    s += ToHex(binary[start_index - i]);\n  }\n  s += \" (\";\n  s += ToString(val);\n  s += \")\";\n  return s;\n}\n\ntemplate <>\nstd::string ToValueString<std::string>(const BinaryRegion& region,\n                                       const uint8_t* binary) {\n  return std::string(reinterpret_cast<const char*>(binary + region.offset),\n                     static_cast<size_t>(region.array_length));\n}\n\nstatic std::string ToValueString(const BinaryRegion& region,\n                                 const uint8_t* binary,\n                                 const OutputConfig& output_config) {\n  std::string s;\n\n  if (region.array_length) {\n    if (region.type == BinaryRegionType::Uint8 ||\n        region.type == BinaryRegionType::Unknown) {\n      // Interpret each value as a ASCII to aid debugging\n      for (uint64_t i = 0; i < region.array_length; ++i) {\n        const uint8_t c = *(binary + region.offset + i);\n        s += isprint(c) ? static_cast<char>(c & 0x7F) : '.';\n      }\n      return s;\n    } else if (region.type == BinaryRegionType::Char) {\n      // string value\n      return ToValueString<std::string>(region, binary);\n    }\n  }\n\n  switch (region.type) {\n    case BinaryRegionType::Uint32:\n      return ToValueString<uint32_t>(region, binary);\n    case BinaryRegionType::Int32:\n      return ToValueString<int32_t>(region, binary);\n    case BinaryRegionType::Uint16:\n      return ToValueString<uint16_t>(region, binary);\n    case BinaryRegionType::Int16:\n      return ToValueString<int16_t>(region, binary);\n    case BinaryRegionType::Bool:\n      return ToValueString<bool>(region, binary);\n    case BinaryRegionType::Uint8:\n      return ToValueString<uint8_t>(region, binary);\n    case BinaryRegionType::Char:\n      return ToValueString<char>(region, binary);\n    case BinaryRegionType::Byte:\n    case BinaryRegionType::Int8:\n      return ToValueString<int8_t>(region, binary);\n    case BinaryRegionType::Int64:\n      return ToValueString<int64_t>(region, binary);\n    case BinaryRegionType::Uint64:\n      return ToValueString<uint64_t>(region, binary);\n    case BinaryRegionType::Double:\n      return ToValueString<double>(region, binary);\n    case BinaryRegionType::Float:\n      return ToValueString<float>(region, binary);\n    case BinaryRegionType::UType:\n      return ToValueString<uint8_t>(region, binary);\n\n    // Handle Offsets separately, incase they add additional details.\n    case BinaryRegionType::UOffset64:\n      s += ToValueString<uint64_t>(region, binary);\n      break;\n    case BinaryRegionType::UOffset:\n      s += ToValueString<uint32_t>(region, binary);\n      break;\n    case BinaryRegionType::SOffset:\n      s += ToValueString<int32_t>(region, binary);\n      break;\n    case BinaryRegionType::VOffset:\n      s += ToValueString<uint16_t>(region, binary);\n      break;\n\n    default:\n      break;\n  }\n  // If this is an offset type, include the calculated offset location in the\n  // value.\n  // TODO(dbaileychess): It might be nicer to put this in the comment field.\n  if (IsOffset(region.type)) {\n    s += \" Loc: 0x\";\n    s += ToHex(region.points_to_offset, output_config.offset_max_char);\n  }\n  return s;\n}\n\nstruct DocContinuation {\n  // The start column where the value text first starts\n  size_t value_start_column = 0;\n\n  // The remaining part of the doc to print.\n  std::string value;\n};\n\nstatic std::string GenerateTypeString(const BinaryRegion& region) {\n  return ToString(region.type) +\n         ((region.array_length)\n              ? \"[\" + std::to_string(region.array_length) + \"]\"\n              : \"\");\n}\n\nstatic std::string GenerateComment(const BinaryRegionComment& comment,\n                                   const BinarySection&) {\n  std::string s;\n  switch (comment.type) {\n    case BinaryRegionCommentType::Unknown:\n      s = \"unknown\";\n      break;\n    case BinaryRegionCommentType::SizePrefix:\n      s = \"size prefix\";\n      break;\n    case BinaryRegionCommentType::RootTableOffset:\n      s = \"offset to root table `\" + comment.name + \"`\";\n      break;\n    // TODO(dbaileychess): make this lowercase to follow the convention.\n    case BinaryRegionCommentType::FileIdentifier:\n      s = \"File Identifier\";\n      break;\n    case BinaryRegionCommentType::Padding:\n      s = \"padding\";\n      break;\n    case BinaryRegionCommentType::VTableSize:\n      s = \"size of this vtable\";\n      break;\n    case BinaryRegionCommentType::VTableRefferingTableLength:\n      s = \"size of referring table\";\n      break;\n    case BinaryRegionCommentType::VTableFieldOffset:\n      s = \"offset to field `\" + comment.name;\n      break;\n    case BinaryRegionCommentType::VTableUnknownFieldOffset:\n      s = \"offset to unknown field (id: \" + std::to_string(comment.index) + \")\";\n      break;\n\n    case BinaryRegionCommentType::TableVTableOffset:\n      s = \"offset to vtable\";\n      break;\n    case BinaryRegionCommentType::TableField:\n      s = \"table field `\" + comment.name;\n      break;\n    case BinaryRegionCommentType::TableUnknownField:\n      s = \"unknown field\";\n      break;\n    case BinaryRegionCommentType::TableOffsetField:\n      s = \"offset to field `\" + comment.name + \"`\";\n      break;\n    case BinaryRegionCommentType::StructField:\n      s = \"struct field `\" + comment.name + \"`\";\n      break;\n    case BinaryRegionCommentType::ArrayField:\n      s = \"array field `\" + comment.name + \"`[\" +\n          std::to_string(comment.index) + \"]\";\n      break;\n    case BinaryRegionCommentType::StringLength:\n      s = \"length of string\";\n      break;\n    case BinaryRegionCommentType::StringValue:\n      s = \"string literal\";\n      break;\n    case BinaryRegionCommentType::StringTerminator:\n      s = \"string terminator\";\n      break;\n    case BinaryRegionCommentType::VectorLength:\n      s = \"length of vector (# items)\";\n      break;\n    case BinaryRegionCommentType::VectorValue:\n      s = \"value[\" + std::to_string(comment.index) + \"]\";\n      break;\n    case BinaryRegionCommentType::VectorTableValue:\n      s = \"offset to table[\" + std::to_string(comment.index) + \"]\";\n      break;\n    case BinaryRegionCommentType::VectorStringValue:\n      s = \"offset to string[\" + std::to_string(comment.index) + \"]\";\n      break;\n    case BinaryRegionCommentType::VectorUnionValue:\n      s = \"offset to union[\" + std::to_string(comment.index) + \"]\";\n      break;\n\n    default:\n      break;\n  }\n  if (!comment.default_value.empty()) {\n    s += \" \" + comment.default_value;\n  }\n\n  switch (comment.status) {\n    case BinaryRegionStatus::OK:\n      break;  // no-op\n    case BinaryRegionStatus::WARN:\n      s = \"WARN: \" + s;\n      break;\n    case BinaryRegionStatus::WARN_NO_REFERENCES:\n      s = \"WARN: nothing refers to this section.\";\n      break;\n    case BinaryRegionStatus::WARN_CORRUPTED_PADDING:\n      s = \"WARN: could be corrupted padding region.\";\n      break;\n    case BinaryRegionStatus::WARN_PADDING_LENGTH:\n      s = \"WARN: padding is longer than expected.\";\n      break;\n    case BinaryRegionStatus::ERROR:\n      s = \"ERROR: \" + s;\n      break;\n    case BinaryRegionStatus::ERROR_OFFSET_OUT_OF_BINARY:\n      s = \"ERROR: \" + s + \". Invalid offset, points outside the binary.\";\n      break;\n    case BinaryRegionStatus::ERROR_INCOMPLETE_BINARY:\n      s = \"ERROR: \" + s + \". Incomplete binary, expected to read \" +\n          comment.status_message + \" bytes.\";\n      break;\n    case BinaryRegionStatus::ERROR_LENGTH_TOO_LONG:\n      s = \"ERROR: \" + s + \". Longer than the binary.\";\n      break;\n    case BinaryRegionStatus::ERROR_LENGTH_TOO_SHORT:\n      s = \"ERROR: \" + s + \". Shorter than the minimum length: \";\n      break;\n    case BinaryRegionStatus::ERROR_REQUIRED_FIELD_NOT_PRESENT:\n      s = \"ERROR: \" + s + \". Required field is not present.\";\n      break;\n    case BinaryRegionStatus::ERROR_INVALID_UNION_TYPE:\n      s = \"ERROR: \" + s + \". Invalid union type value.\";\n      break;\n    case BinaryRegionStatus::ERROR_CYCLE_DETECTED:\n      s = \"ERROR: \" + s + \". Invalid offset, cycle detected.\";\n      break;\n  }\n\n  return s;\n}\n\nstatic void GenerateDocumentation(std::ostream& os, const BinaryRegion& region,\n                                  const BinarySection& section,\n                                  const uint8_t* binary,\n                                  DocContinuation& continuation,\n                                  const OutputConfig& output_config) {\n  // Check if there is a doc continuation that should be prioritized.\n  if (continuation.value_start_column) {\n    os << std::string(continuation.value_start_column - 2, ' ');\n    os << output_config.delimiter << \" \";\n\n    os << continuation.value.substr(0, output_config.max_bytes_per_line);\n    continuation.value = continuation.value.substr(\n        std::min(output_config.max_bytes_per_line, continuation.value.size()));\n    return;\n  }\n\n  size_t size_of = 0;\n  {\n    std::stringstream ss;\n    ss << std::setw(static_cast<int>(output_config.largest_type_string))\n       << std::left;\n    ss << GenerateTypeString(region);\n    os << ss.str();\n    size_of = ss.str().size();\n  }\n  os << \" \" << output_config.delimiter << \" \";\n  if (region.array_length) {\n    // Record where the value is first being outputted.\n    continuation.value_start_column = 3 + size_of;\n\n    // Get the full-length value, which we will chunk below.\n    const std::string value = ToValueString(region, binary, output_config);\n\n    std::stringstream ss;\n    ss << std::setw(static_cast<int>(output_config.largest_value_string))\n       << std::left;\n    ss << value.substr(0, output_config.max_bytes_per_line);\n    os << ss.str();\n\n    continuation.value =\n        value.substr(std::min(output_config.max_bytes_per_line, value.size()));\n  } else {\n    std::stringstream ss;\n    ss << std::setw(static_cast<int>(output_config.largest_value_string))\n       << std::left;\n    ss << ToValueString(region, binary, output_config);\n    os << ss.str();\n  }\n\n  os << \" \" << output_config.delimiter << \" \";\n  os << GenerateComment(region.comment, section);\n}\n\nstatic void GenerateRegion(std::ostream& os, const BinaryRegion& region,\n                           const BinarySection& section, const uint8_t* binary,\n                           const OutputConfig& output_config) {\n  bool doc_generated = false;\n  DocContinuation doc_continuation;\n  for (uint64_t i = 0; i < region.length; ++i) {\n    if ((i % output_config.max_bytes_per_line) == 0) {\n      // Start a new line of output\n      os << std::endl;\n      os << \"  +0x\" << ToHex(region.offset + i, output_config.offset_max_char);\n      os << \" \" << output_config.delimiter;\n    }\n\n    // Add each byte\n    os << \" \" << ToHex(binary[region.offset + i]);\n\n    // Check for end of line or end of region conditions.\n    if (((i + 1) % output_config.max_bytes_per_line == 0) ||\n        i + 1 == region.length) {\n      if (i + 1 == region.length) {\n        // We are out of bytes but haven't the kMaxBytesPerLine, so we need to\n        // zero those out to align everything globally.\n        for (uint64_t j = i + 1; (j % output_config.max_bytes_per_line) != 0;\n             ++j) {\n          os << \"   \";\n        }\n      }\n      os << \" \" << output_config.delimiter;\n      // This is the end of the first line or its the last byte of the region,\n      // generate the end-of-line documentation.\n      if (!doc_generated) {\n        os << \" \";\n        GenerateDocumentation(os, region, section, binary, doc_continuation,\n                              output_config);\n\n        // If we have a value in the doc continuation, that means the doc is\n        // being printed on multiple lines.\n        doc_generated = doc_continuation.value.empty();\n      }\n    }\n  }\n}\n\nstatic void GenerateSection(std::ostream& os, const BinarySection& section,\n                            const uint8_t* binary,\n                            const OutputConfig& output_config) {\n  os << std::endl;\n  os << ToString(section.type);\n  if (!section.name.empty()) {\n    os << \" (\" + section.name + \")\";\n  }\n  os << \":\";\n\n  // As a space saving measure, skip generating every vector element, just put\n  // the first and last elements in the output. Skip the whole thing if there\n  // are only three or fewer elements, as it doesn't save space.\n  if ((section.type == BinarySectionType::Vector ||\n       section.type == BinarySectionType::Vector64) &&\n      !output_config.include_vector_contents && section.regions.size() > 4) {\n    // Generate the length region which should be first.\n    GenerateRegion(os, section.regions[0], section, binary, output_config);\n\n    // Generate the first element.\n    GenerateRegion(os, section.regions[1], section, binary, output_config);\n\n    // Indicate that we omitted elements.\n    os << std::endl\n       << \"  <\" << section.regions.size() - 3 << \" regions omitted>\";\n\n    // Generate the last element.\n    GenerateRegion(os, section.regions.back(), section, binary, output_config);\n    os << std::endl;\n    return;\n  }\n\n  for (const BinaryRegion& region : section.regions) {\n    GenerateRegion(os, region, section, binary, output_config);\n  }\n  os << std::endl;\n}\n}  // namespace\n\nbool AnnotatedBinaryTextGenerator::Generate(\n    const std::string& filename, const std::string& schema_filename,\n    const std::string& output_filename) {\n  OutputConfig output_config;\n  output_config.max_bytes_per_line = options_.max_bytes_per_line;\n  output_config.include_vector_contents = options_.include_vector_contents;\n\n  // Given the length of the binary, we can calculate the maximum number of\n  // characters to display in the offset hex: (i.e. 2 would lead to 0XFF being\n  // the max output).\n  output_config.offset_max_char =\n      binary_length_ > 0xFFFFFF\n          ? 8\n          : (binary_length_ > 0xFFFF ? 6 : (binary_length_ > 0xFF ? 4 : 2));\n\n  // Find the largest type string of all the regions in this file, so we can\n  // align the output nicely.\n  output_config.largest_type_string = 0;\n  for (const auto& section : annotations_) {\n    for (const auto& region : section.second.regions) {\n      std::string s = GenerateTypeString(region);\n      if (s.size() > output_config.largest_type_string) {\n        output_config.largest_type_string = s.size();\n      }\n\n      // Don't consider array regions, as they will be split to multiple lines.\n      if (!region.array_length) {\n        s = ToValueString(region, binary_, output_config);\n        if (s.size() > output_config.largest_value_string) {\n          output_config.largest_value_string = s.size();\n        }\n      }\n    }\n  }\n\n  std::string out = output_filename;\n  if (out.empty()) {\n    // Modify the output filename.\n    out = StripExtension(filename);\n    out += options_.output_postfix;\n    out +=\n        \".\" + (options_.output_extension.empty() ? GetExtension(filename)\n                                                 : options_.output_extension);\n  }\n\n  std::ofstream ofs(out.c_str());\n\n  ofs << \"// Annotated Flatbuffer Binary\" << std::endl;\n  ofs << \"//\" << std::endl;\n  if (!schema_filename.empty()) {\n    ofs << \"// Schema file: \" << schema_filename << std::endl;\n  }\n  ofs << \"// Binary file: \" << filename << std::endl;\n\n  // Generate each of the binary sections\n  for (const auto& section : annotations_) {\n    GenerateSection(ofs, section.second, binary_, output_config);\n  }\n\n  ofs.close();\n  return true;\n}\n\n}  // namespace flatbuffers\n"
  },
  {
    "path": "src/annotated_binary_text_gen.h",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_ANNOTATED_BINARY_TEXT_GEN_H_\n#define FLATBUFFERS_ANNOTATED_BINARY_TEXT_GEN_H_\n\n#include <map>\n#include <memory>\n#include <string>\n\n#include \"binary_annotator.h\"\n\nnamespace flatbuffers {\n\nclass AnnotatedBinaryTextGenerator {\n public:\n  struct Options {\n    // The maximum number of raw bytes to print per line in the output. 8 is a\n    // good default due to the largest type (double) being 8 bytes long.\n    size_t max_bytes_per_line = 8;\n\n    // The output file postfix, appended between the filename and the extension.\n    // Example binary1.bin -> binary1_annotated.bin\n    std::string output_postfix = \"\";\n\n    // The output file extension, replacing any extension given. If empty, don't\n    // change the provided extension. AFB = Annotated Flatbuffer Binary\n    //\n    // Example: binary1.bin -> binary1.afb\n    std::string output_extension = \"afb\";\n\n    // Controls.\n    bool include_vector_contents = true;\n  };\n\n  explicit AnnotatedBinaryTextGenerator(\n      const Options& options, std::map<uint64_t, BinarySection> annotations,\n      const uint8_t* const binary, const int64_t binary_length)\n      : annotations_(std::move(annotations)),\n        binary_(binary),\n        binary_length_(binary_length),\n        options_(options) {}\n\n  // Generate the annotated binary for the given `filename`. Returns true if the\n  // annotated binary was successfully saved.\n  bool Generate(const std::string& filename, const std::string& schema_filename,\n                const std::string& output_filename = \"\");\n\n private:\n  const std::map<uint64_t, BinarySection> annotations_;\n\n  // The binary data itself.\n  const uint8_t* binary_;\n  const int64_t binary_length_;\n\n  // Output configuration\n  const Options options_;\n};\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_ANNOTATED_BINARY_TEXT_GEN_H_\n"
  },
  {
    "path": "src/bfbs_gen.h",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_BFBS_GEN_H_\n#define FLATBUFFERS_BFBS_GEN_H_\n\n#include <cstdint>\n\n#include \"flatbuffers/code_generator.h\"\n#include \"flatbuffers/reflection_generated.h\"\n\nnamespace flatbuffers {\n\nnamespace {\n\nstatic void ForAllEnums(\n    const flatbuffers::Vector<flatbuffers::Offset<reflection::Enum>>* enums,\n    std::function<void(const reflection::Enum*)> func) {\n  for (auto it = enums->cbegin(); it != enums->cend(); ++it) {\n    func(*it);\n  }\n}\n\nstatic void ForAllObjects(\n    const flatbuffers::Vector<flatbuffers::Offset<reflection::Object>>* objects,\n    std::function<void(const reflection::Object*)> func) {\n  for (auto it = objects->cbegin(); it != objects->cend(); ++it) {\n    func(*it);\n  }\n}\n\nstatic void ForAllEnumValues(\n    const reflection::Enum* enum_def,\n    std::function<void(const reflection::EnumVal*)> func) {\n  for (auto it = enum_def->values()->cbegin(); it != enum_def->values()->cend();\n       ++it) {\n    func(*it);\n  }\n}\n\nstatic void ForAllDocumentation(\n    const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>*\n        documentation,\n    std::function<void(const flatbuffers::String*)> func) {\n  if (!documentation) {\n    return;\n  }\n  for (auto it = documentation->cbegin(); it != documentation->cend(); ++it) {\n    func(*it);\n  }\n}\n\n// Maps the field index into object->fields() to the field's ID (the ith element\n// in the return vector).\nstatic std::vector<uint32_t> FieldIdToIndex(const reflection::Object* object) {\n  std::vector<uint32_t> field_index_by_id;\n  field_index_by_id.resize(object->fields()->size());\n\n  // Create the mapping of field ID to the index into the vector.\n  for (uint32_t i = 0; i < object->fields()->size(); ++i) {\n    auto field = object->fields()->Get(i);\n    field_index_by_id[field->id()] = i;\n  }\n\n  return field_index_by_id;\n}\n\nstatic bool IsStructOrTable(const reflection::BaseType base_type) {\n  return base_type == reflection::Obj;\n}\n\nstatic bool IsFloatingPoint(const reflection::BaseType base_type) {\n  return base_type == reflection::Float || base_type == reflection::Double;\n}\n\nstatic bool IsBool(const reflection::BaseType base_type) {\n  return base_type == reflection::Bool;\n}\n\nstatic bool IsSingleByte(const reflection::BaseType base_type) {\n  return base_type >= reflection::UType && base_type <= reflection::UByte;\n}\n\nstatic bool IsVector(const reflection::BaseType base_type) {\n  return base_type == reflection::Vector;\n}\n\n}  // namespace\n\n// A concrete base Flatbuffer Generator that specific language generators can\n// derive from.\nclass BaseBfbsGenerator : public CodeGenerator {\n public:\n  virtual ~BaseBfbsGenerator() {}\n  BaseBfbsGenerator() : schema_(nullptr) {}\n\n  virtual Status GenerateFromSchema(const reflection::Schema* schema,\n                                    const CodeGenOptions& options) = 0;\n\n  virtual uint64_t SupportedAdvancedFeatures() const = 0;\n\n  // Override of the Generator::GenerateCode method that does the initial\n  // deserialization and verification steps.\n  Status GenerateCode(const uint8_t* buffer, int64_t length,\n                      const CodeGenOptions& options) FLATBUFFERS_OVERRIDE {\n    flatbuffers::Verifier verifier(buffer, static_cast<size_t>(length));\n    if (!reflection::VerifySchemaBuffer(verifier)) {\n      return FAILED_VERIFICATION;\n    }\n\n    // Store the root schema since there are cases where leaf nodes refer to\n    // things in the root schema (e.g., indexing the objects).\n    schema_ = reflection::GetSchema(buffer);\n\n    const uint64_t advance_features = schema_->advanced_features();\n    if (advance_features > SupportedAdvancedFeatures()) {\n      return FAILED_VERIFICATION;\n    }\n\n    Status status = GenerateFromSchema(schema_, options);\n    schema_ = nullptr;\n    return status;\n  }\n\n protected:\n  // GetObject returns the underlying object struct of the given type\n  // if element_type is true and GetObject is a list of objects then\n  // GetObject will correctly return the object struct of the vector's elements\n  const reflection::Object* GetObject(const reflection::Type* type,\n                                      bool element_type = false) const {\n    const reflection::BaseType base_type =\n        element_type ? type->element() : type->base_type();\n    if (type->index() >= 0 && IsStructOrTable(base_type)) {\n      return GetObjectByIndex(type->index());\n    }\n    return nullptr;\n  }\n\n  // GetEnum returns the underlying enum struct of the given type\n  // if element_type is true and GetEnum is a list of enums then\n  // GetEnum will correctly return the enum struct of the vector's elements\n  const reflection::Enum* GetEnum(const reflection::Type* type,\n                                  bool element_type = false) const {\n    const reflection::BaseType base_type =\n        element_type ? type->element() : type->base_type();\n    // TODO(derekbailey): it would be better to have a explicit list of allowed\n    // base types, instead of negating Obj types.\n    if (type->index() >= 0 && !IsStructOrTable(base_type)) {\n      return GetEnumByIndex(type->index());\n    }\n    return nullptr;\n  }\n\n  // Used to get a object that is reference by index. (e.g.\n  // reflection::Type::index). Returns nullptr if no object is available.\n  const reflection::Object* GetObjectByIndex(int32_t index) const {\n    if (!schema_ || index < 0 ||\n        index >= static_cast<int32_t>(schema_->objects()->size())) {\n      return nullptr;\n    }\n    return schema_->objects()->Get(index);\n  }\n\n  // Used to get a enum that is reference by index. (e.g.\n  // reflection::Type::index). Returns nullptr if no enum is available.\n  const reflection::Enum* GetEnumByIndex(int32_t index) const {\n    if (!schema_ || index < 0 ||\n        index >= static_cast<int32_t>(schema_->enums()->size())) {\n      return nullptr;\n    }\n    return schema_->enums()->Get(index);\n  }\n\n  void ForAllFields(const reflection::Object* object, bool reverse,\n                    std::function<void(const reflection::Field*)> func) const {\n    const std::vector<uint32_t> field_to_id_map = FieldIdToIndex(object);\n    for (size_t i = 0; i < field_to_id_map.size(); ++i) {\n      func(object->fields()->Get(\n          field_to_id_map[reverse ? field_to_id_map.size() - (i + 1) : i]));\n    }\n  }\n\n  bool IsTable(const reflection::Type* type, bool use_element = false) const {\n    return !IsStruct(type, use_element);\n  }\n\n  bool IsStruct(const reflection::Type* type, bool use_element = false) const {\n    const reflection::BaseType base_type =\n        use_element ? type->element() : type->base_type();\n    return IsStructOrTable(base_type) &&\n           GetObjectByIndex(type->index())->is_struct();\n  }\n\n  const reflection::Schema* schema_;\n};\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_BFBS_GEN_H_\n"
  },
  {
    "path": "src/bfbs_gen_lua.cpp",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"bfbs_gen_lua.h\"\n\n#include <cstdint>\n#include <map>\n#include <memory>\n#include <string>\n#include <unordered_set>\n#include <vector>\n\n// Ensure no includes to flatc internals. bfbs_gen.h and generator.h are OK.\n#include \"bfbs_gen.h\"\n#include \"bfbs_namer.h\"\n\n// The intermediate representation schema.\n#include \"flatbuffers/code_generator.h\"\n#include \"flatbuffers/reflection.h\"\n#include \"flatbuffers/reflection_generated.h\"\n\nnamespace flatbuffers {\nnamespace {\n\n// To reduce typing\nnamespace r = ::reflection;\n\nstd::set<std::string> LuaKeywords() {\n  return {\"and\",   \"break\", \"do\",       \"else\", \"elseif\", \"end\",\n          \"false\", \"for\",   \"function\", \"goto\", \"if\",     \"in\",\n          \"local\", \"nil\",   \"not\",      \"or\",   \"repeat\", \"return\",\n          \"then\",  \"true\",  \"until\",    \"while\"};\n}\n\nNamer::Config LuaDefaultConfig() {\n  return {/*types=*/Case::kUpperCamel,\n          /*constants=*/Case::kUnknown,\n          /*methods=*/Case::kUpperCamel,\n          /*functions=*/Case::kUpperCamel,\n          /*fields=*/Case::kUpperCamel,\n          /*variables=*/Case::kLowerCamel,\n          /*variants=*/Case::kKeep,\n          /*enum_variant_seperator=*/\"\",\n          /*escape_keywords=*/Namer::Config::Escape::AfterConvertingCase,\n          /*namespaces=*/Case::kKeep,\n          /*namespace_seperator=*/\"__\",\n          /*object_prefix=*/\"\",\n          /*object_suffix=*/\"\",\n          /*keyword_prefix=*/\"\",\n          /*keyword_suffix=*/\"_\",\n          /*keywords_casing=*/Namer::Config::KeywordsCasing::CaseSensitive,\n          /*filenames=*/Case::kKeep,\n          /*directories=*/Case::kKeep,\n          /*output_path=*/\"\",\n          /*filename_suffix=*/\"\",\n          /*filename_extension=*/\".lua\"};\n}\n\nclass LuaBfbsGenerator : public BaseBfbsGenerator {\n public:\n  explicit LuaBfbsGenerator(const std::string& flatc_version)\n      : BaseBfbsGenerator(),\n        keywords_(),\n        requires_(),\n        current_obj_(nullptr),\n        current_enum_(nullptr),\n        flatc_version_(flatc_version),\n        namer_(LuaDefaultConfig(), LuaKeywords()) {}\n\n  Status GenerateFromSchema(const r::Schema* schema,\n                            const CodeGenOptions& options)\n      FLATBUFFERS_OVERRIDE {\n    options_ = options;\n    if (!GenerateEnums(schema->enums())) {\n      return ERROR;\n    }\n    if (!GenerateObjects(schema->objects(), schema->root_table())) {\n      return ERROR;\n    }\n    return OK;\n  }\n\n  using BaseBfbsGenerator::GenerateCode;\n\n  Status GenerateCode(const Parser&, const std::string&,\n                      const std::string&) override {\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateMakeRule(const Parser& parser, const std::string& path,\n                          const std::string& filename,\n                          std::string& output) override {\n    (void)parser;\n    (void)path;\n    (void)filename;\n    (void)output;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateGrpcCode(const Parser& parser, const std::string& path,\n                          const std::string& filename) override {\n    (void)parser;\n    (void)path;\n    (void)filename;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateRootFile(const Parser& parser,\n                          const std::string& path) override {\n    (void)parser;\n    (void)path;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  bool IsSchemaOnly() const override { return true; }\n\n  bool SupportsBfbsGeneration() const override { return true; }\n\n  bool SupportsRootFileGeneration() const override { return false; }\n\n  IDLOptions::Language Language() const override { return IDLOptions::kLua; }\n\n  std::string LanguageName() const override { return \"Lua\"; }\n\n  uint64_t SupportedAdvancedFeatures() const FLATBUFFERS_OVERRIDE {\n    return 0xF;\n  }\n\n protected:\n  bool GenerateEnums(\n      const flatbuffers::Vector<flatbuffers::Offset<r::Enum>>* enums) {\n    ForAllEnums(enums, [&](const r::Enum* enum_def) {\n      std::string code;\n\n      StartCodeBlock(enum_def);\n\n      std::string ns;\n      const std::string enum_name =\n          namer_.Type(namer_.Denamespace(enum_def, ns));\n\n      GenerateDocumentation(enum_def->documentation(), \"\", code);\n      code += \"local \" + enum_name + \" = {\\n\";\n\n      ForAllEnumValues(enum_def, [&](const reflection::EnumVal* enum_val) {\n        GenerateDocumentation(enum_val->documentation(), \"  \", code);\n        code += \"  \" + namer_.Variant(enum_val->name()->str()) + \" = \" +\n                NumToString(enum_val->value()) + \",\\n\";\n      });\n      code += \"}\\n\";\n      code += \"\\n\";\n\n      EmitCodeBlock(code, enum_name, ns, enum_def->declaration_file()->str());\n    });\n    return true;\n  }\n\n  bool GenerateObjects(\n      const flatbuffers::Vector<flatbuffers::Offset<r::Object>>* objects,\n      const r::Object* root_object) {\n    ForAllObjects(objects, [&](const r::Object* object) {\n      std::string code;\n\n      StartCodeBlock(object);\n\n      // Register the main flatbuffers module.\n      RegisterRequires(\"flatbuffers\", \"flatbuffers\");\n\n      std::string ns;\n      const std::string object_name =\n          namer_.Type(namer_.Denamespace(object, ns));\n\n      GenerateDocumentation(object->documentation(), \"\", code);\n\n      code += \"local \" + object_name + \" = {}\\n\";\n      code += \"local mt = {}\\n\";\n      code += \"\\n\";\n      code += \"function \" + object_name + \".New()\\n\";\n      code += \"  local o = {}\\n\";\n      code += \"  setmetatable(o, {__index = mt})\\n\";\n      code += \"  return o\\n\";\n      code += \"end\\n\";\n      code += \"\\n\";\n\n      if (object == root_object) {\n        // emit file identifier if present\n        const auto ident = schema_->file_ident();\n        if (ident && ident->size() == 4) {\n          code += \"local FileIdentifier = \\\"\" + ident->str() + \"\\\"\\n\";\n          code += \"\\n\";\n        }\n\n        code += \"function \" + object_name + \".GetRootAs\" + object_name +\n                \"(buf, offset)\\n\";\n        code += \"  if type(buf) == \\\"string\\\" then\\n\";\n        code += \"    buf = flatbuffers.binaryArray.New(buf)\\n\";\n        code += \"  end\\n\";\n        code += \"\\n\";\n        code += \"  local n = flatbuffers.N.UOffsetT:Unpack(buf, offset)\\n\";\n        code += \"  local o = \" + object_name + \".New()\\n\";\n        code += \"  o:Init(buf, n + offset)\\n\";\n        code += \"  return o\\n\";\n        code += \"end\\n\";\n        code += \"\\n\";\n      }\n\n      // Generates a init method that receives a pre-existing accessor object,\n      // so that objects can be reused.\n\n      code += \"function mt:Init(buf, pos)\\n\";\n      code += \"  self.view = flatbuffers.view.New(buf, pos)\\n\";\n      code += \"end\\n\";\n      code += \"\\n\";\n\n      // Create all the field accessors.\n      ForAllFields(object, /*reverse=*/false, [&](const r::Field* field) {\n        // Skip writing deprecated fields altogether.\n        if (field->deprecated()) {\n          return;\n        }\n\n        const std::string field_name = namer_.Field(*field);\n        const r::BaseType base_type = field->type()->base_type();\n\n        // Generate some fixed strings so we don't repeat outselves later.\n        const std::string getter_signature =\n            \"function mt:\" + field_name + \"()\\n\";\n        const std::string offset_prefix = \"local o = self.view:Offset(\" +\n                                          NumToString(field->offset()) + \")\\n\";\n        const std::string offset_prefix_2 = \"if o ~= 0 then\\n\";\n\n        GenerateDocumentation(field->documentation(), \"\", code);\n\n        if (IsScalar(base_type)) {\n          code += getter_signature;\n\n          if (object->is_struct()) {\n            // TODO(derekbailey): it would be nice to modify the view:Get to\n            // just pass in the offset and not have to add it its own\n            // self.view.pos.\n            code += \"  return \" + GenerateGetter(field->type()) +\n                    \"self.view.pos + \" + NumToString(field->offset()) + \")\\n\";\n          } else {\n            // Table accessors\n            code += \"  \" + offset_prefix;\n            code += \"  \" + offset_prefix_2;\n\n            std::string getter =\n                GenerateGetter(field->type()) + \"self.view.pos + o)\";\n            if (IsBool(base_type)) {\n              getter = \"(\" + getter + \" ~=0)\";\n            }\n            code += \"    return \" + getter + \"\\n\";\n            code += \"  end\\n\";\n            code += \"  return \" + DefaultValue(field) + \"\\n\";\n          }\n          code += \"end\\n\";\n          code += \"\\n\";\n        } else {\n          switch (base_type) {\n            case r::String: {\n              code += getter_signature;\n              code += \"  \" + offset_prefix;\n              code += \"  \" + offset_prefix_2;\n              code += \"    return \" + GenerateGetter(field->type()) +\n                      \"self.view.pos + o)\\n\";\n              code += \"  end\\n\";\n              code += \"end\\n\";\n              code += \"\\n\";\n              break;\n            }\n            case r::Obj: {\n              if (object->is_struct()) {\n                code += \"function mt:\" + field_name + \"(obj)\\n\";\n                code += \"  obj:Init(self.view.bytes, self.view.pos + \" +\n                        NumToString(field->offset()) + \")\\n\";\n                code += \"  return obj\\n\";\n                code += \"end\\n\";\n                code += \"\\n\";\n              } else {\n                code += getter_signature;\n                code += \"  \" + offset_prefix;\n                code += \"  \" + offset_prefix_2;\n\n                const r::Object* field_object = GetObject(field->type());\n                if (!field_object) {\n                  // TODO(derekbailey): this is an error condition. we\n                  // should report it better.\n                  return;\n                }\n                code += \"    local x = \" +\n                        std::string(\n                            field_object->is_struct()\n                                ? \"self.view.pos + o\\n\"\n                                : \"self.view:Indirect(self.view.pos + o)\\n\");\n                const std::string require_name = RegisterRequires(field);\n                code += \"    local obj = \" + require_name + \".New()\\n\";\n                code += \"    obj:Init(self.view.bytes, x)\\n\";\n                code += \"    return obj\\n\";\n                code += \"  end\\n\";\n                code += \"end\\n\";\n                code += \"\\n\";\n              }\n              break;\n            }\n            case r::Union: {\n              code += getter_signature;\n              code += \"  \" + offset_prefix;\n              code += \"  \" + offset_prefix_2;\n              code +=\n                  \"   local obj = \"\n                  \"flatbuffers.view.New(flatbuffers.binaryArray.New(\"\n                  \"0), 0)\\n\";\n              code += \"    \" + GenerateGetter(field->type()) + \"obj, o)\\n\";\n              code += \"    return obj\\n\";\n              code += \"  end\\n\";\n              code += \"end\\n\";\n              code += \"\\n\";\n              break;\n            }\n            case r::Array:\n            case r::Vector: {\n              const r::BaseType vector_base_type = field->type()->element();\n              int32_t element_size = field->type()->element_size();\n              code += \"function mt:\" + field_name + \"(j)\\n\";\n              code += \"  \" + offset_prefix;\n              code += \"  \" + offset_prefix_2;\n\n              if (IsStructOrTable(vector_base_type)) {\n                code += \"    local x = self.view:Vector(o)\\n\";\n                code +=\n                    \"    x = x + ((j-1) * \" + NumToString(element_size) + \")\\n\";\n                if (IsTable(field->type(), /*use_element=*/true)) {\n                  code += \"    x = self.view:Indirect(x)\\n\";\n                } else {\n                  // Vector of structs are inline, so we need to query the\n                  // size of the struct.\n                  const reflection::Object* obj =\n                      GetObjectByIndex(field->type()->index());\n                  element_size = obj->bytesize();\n                }\n\n                // Include the referenced type, thus we need to make sure\n                // we set `use_element` to true.\n                const std::string require_name =\n                    RegisterRequires(field, /*use_element=*/true);\n                code += \"    local obj = \" + require_name + \".New()\\n\";\n                code += \"    obj:Init(self.view.bytes, x)\\n\";\n                code += \"    return obj\\n\";\n              } else {\n                code += \"    local a = self.view:Vector(o)\\n\";\n                code += \"    return \" + GenerateGetter(field->type()) +\n                        \"a + ((j-1) * \" + NumToString(element_size) + \"))\\n\";\n              }\n              code += \"  end\\n\";\n              // Only generate a default value for those types that are\n              // supported.\n              if (!IsStructOrTable(vector_base_type)) {\n                code +=\n                    \"  return \" +\n                    std::string(vector_base_type == r::String ? \"''\\n\" : \"0\\n\");\n              }\n              code += \"end\\n\";\n              code += \"\\n\";\n\n              // If the vector is composed of single byte values, we\n              // generate a helper function to get it as a byte string in\n              // Lua.\n              if (IsSingleByte(vector_base_type)) {\n                code += \"function mt:\" + field_name + \"AsString(start, stop)\\n\";\n                code += \"  return self.view:VectorAsString(\" +\n                        NumToString(field->offset()) + \", start, stop)\\n\";\n                code += \"end\\n\";\n                code += \"\\n\";\n              }\n\n              // We also make a new accessor to query just the length of the\n              // vector.\n              code += \"function mt:\" + field_name + \"Length()\\n\";\n              code += \"  \" + offset_prefix;\n              code += \"  \" + offset_prefix_2;\n              code += \"    return self.view:VectorLen(o)\\n\";\n              code += \"  end\\n\";\n              code += \"  return 0\\n\";\n              code += \"end\\n\";\n              code += \"\\n\";\n              break;\n            }\n            default: {\n              return;\n            }\n          }\n        }\n        return;\n      });\n\n      // Create all the builders\n      if (object->is_struct()) {\n        code += \"function \" + object_name + \".Create\" + object_name +\n                \"(builder\" + GenerateStructBuilderArgs(object) + \")\\n\";\n        code += AppendStructBuilderBody(object);\n        code += \"  return builder:Offset()\\n\";\n        code += \"end\\n\";\n        code += \"\\n\";\n      } else {\n        // Table builders\n        code += \"function \" + object_name + \".Start(builder)\\n\";\n        code += \"  builder:StartObject(\" +\n                NumToString(object->fields()->size()) + \")\\n\";\n        code += \"end\\n\";\n        code += \"\\n\";\n\n        ForAllFields(object, /*reverse=*/false, [&](const r::Field* field) {\n          if (field->deprecated()) {\n            return;\n          }\n\n          const std::string field_name = namer_.Field(*field);\n          const std::string variable_name = namer_.Variable(*field);\n\n          code += \"function \" + object_name + \".Add\" + field_name +\n                  \"(builder, \" + variable_name + \")\\n\";\n          code += \"  builder:Prepend\" + GenerateMethod(field) + \"Slot(\" +\n                  NumToString(field->id()) + \", \" + variable_name + \", \" +\n                  DefaultValue(field) + \")\\n\";\n          code += \"end\\n\";\n          code += \"\\n\";\n\n          if (IsVector(field->type()->base_type())) {\n            code += \"function \" + object_name + \".Start\" + field_name +\n                    \"Vector(builder, numElems)\\n\";\n\n            const int32_t element_size = field->type()->element_size();\n            int32_t alignment = 0;\n            if (IsStruct(field->type(), /*use_element=*/true)) {\n              alignment = GetObjectByIndex(field->type()->index())->minalign();\n            } else {\n              alignment = element_size;\n            }\n\n            code += \"  return builder:StartVector(\" +\n                    NumToString(element_size) + \", numElems, \" +\n                    NumToString(alignment) + \")\\n\";\n            code += \"end\\n\";\n            code += \"\\n\";\n          }\n        });\n\n        code += \"function \" + object_name + \".End(builder)\\n\";\n        code += \"  return builder:EndObject()\\n\";\n        code += \"end\\n\";\n        code += \"\\n\";\n\n        if (object == root_object) {\n          code += \"function \" + object_name + \".Finish\" + object_name +\n                  \"Buffer(builder, offset)\\n\";\n          // emit file identifier if present\n          const auto ident = schema_->file_ident();\n          if (ident && ident->size() == 4) {\n            code += \"  builder:FinishWithIdentifier(offset, FileIdentifier)\\n\";\n          } else {\n            code += \"  builder:Finish(offset)\\n\";\n          }\n          code += \"end\\n\";\n          code += \"\\n\";\n\n          // size prefixed option\n          code += \"function \" + object_name + \".FinishSizePrefixed\" +\n                  object_name + \"Buffer(builder, offset)\\n\";\n          // emit file identifier if present\n          if (ident && ident->size() == 4) {\n            code +=\n                \"  builder:FinishSizePrefixedWithIdentifier(offset, \"\n                \"FileIdentifier)\\n\";\n          } else {\n            code += \"  builder:FinishSizePrefixed(offset)\\n\";\n          }\n          code += \"end\\n\";\n          code += \"\\n\";\n        }\n      }\n\n      EmitCodeBlock(code, object_name, ns, object->declaration_file()->str());\n    });\n    return true;\n  }\n\n private:\n  void GenerateDocumentation(\n      const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>*\n          documentation,\n      std::string indent, std::string& code) const {\n    flatbuffers::ForAllDocumentation(\n        documentation, [&](const flatbuffers::String* str) {\n          code += indent + \"--\" + str->str() + \"\\n\";\n        });\n  }\n\n  std::string GenerateStructBuilderArgs(const r::Object* object,\n                                        std::string prefix = \"\") const {\n    std::string signature;\n    ForAllFields(object, /*reverse=*/false, [&](const r::Field* field) {\n      if (IsStructOrTable(field->type()->base_type())) {\n        const r::Object* field_object = GetObject(field->type());\n        signature += GenerateStructBuilderArgs(\n            field_object, prefix + namer_.Variable(*field) + \"_\");\n      } else {\n        signature += \", \" + prefix + namer_.Variable(*field);\n      }\n    });\n    return signature;\n  }\n\n  std::string AppendStructBuilderBody(const r::Object* object,\n                                      std::string prefix = \"\") const {\n    std::string code;\n    code += \"  builder:Prep(\" + NumToString(object->minalign()) + \", \" +\n            NumToString(object->bytesize()) + \")\\n\";\n\n    // We need to reverse the order we iterate over, since we build the\n    // buffer backwards.\n    ForAllFields(object, /*reverse=*/true, [&](const r::Field* field) {\n      const int32_t num_padding_bytes = field->padding();\n      if (num_padding_bytes) {\n        code += \"  builder:Pad(\" + NumToString(num_padding_bytes) + \")\\n\";\n      }\n      if (IsStructOrTable(field->type()->base_type())) {\n        const r::Object* field_object = GetObject(field->type());\n        code += AppendStructBuilderBody(field_object,\n                                        prefix + namer_.Variable(*field) + \"_\");\n      } else {\n        code += \"  builder:Prepend\" + GenerateMethod(field) + \"(\" + prefix +\n                namer_.Variable(*field) + \")\\n\";\n      }\n    });\n\n    return code;\n  }\n\n  std::string GenerateMethod(const r::Field* field) const {\n    const r::BaseType base_type = field->type()->base_type();\n    if (IsScalar(base_type)) {\n      return namer_.Type(GenerateType(base_type));\n    }\n    if (IsStructOrTable(base_type)) {\n      return \"Struct\";\n    }\n    return \"UOffsetTRelative\";\n  }\n\n  std::string GenerateGetter(const r::Type* type,\n                             bool element_type = false) const {\n    switch (element_type ? type->element() : type->base_type()) {\n      case r::String:\n        return \"self.view:String(\";\n      case r::Union:\n        return \"self.view:Union(\";\n      case r::Vector:\n        return GenerateGetter(type, true);\n      default:\n        return \"self.view:Get(flatbuffers.N.\" +\n               namer_.Type(GenerateType(type, element_type)) + \", \";\n    }\n  }\n\n  std::string GenerateType(const r::Type* type,\n                           bool element_type = false) const {\n    const r::BaseType base_type =\n        element_type ? type->element() : type->base_type();\n    if (IsScalar(base_type)) {\n      return GenerateType(base_type);\n    }\n    switch (base_type) {\n      case r::String:\n        return \"string\";\n      case r::Vector:\n        return GenerateGetter(type, true);\n      case r::Obj:\n        return namer_.Type(namer_.Denamespace(GetObject(type)));\n\n      default:\n        return \"*flatbuffers.Table\";\n    }\n  }\n\n  std::string GenerateType(const r::BaseType base_type) const {\n    // Need to override the default naming to match the Lua runtime libraries.\n    // TODO(derekbailey): make overloads in the runtime libraries to avoid this.\n    switch (base_type) {\n      case r::None:\n        return \"uint8\";\n      case r::UType:\n        return \"uint8\";\n      case r::Byte:\n        return \"int8\";\n      case r::UByte:\n        return \"uint8\";\n      case r::Short:\n        return \"int16\";\n      case r::UShort:\n        return \"uint16\";\n      case r::Int:\n        return \"int32\";\n      case r::UInt:\n        return \"uint32\";\n      case r::Long:\n        return \"int64\";\n      case r::ULong:\n        return \"uint64\";\n      case r::Float:\n        return \"Float32\";\n      case r::Double:\n        return \"Float64\";\n      default:\n        return r::EnumNameBaseType(base_type);\n    }\n  }\n\n  std::string DefaultValue(const r::Field* field) const {\n    const r::BaseType base_type = field->type()->base_type();\n    if (IsFloatingPoint(base_type)) {\n      return NumToString(field->default_real());\n    }\n    if (IsBool(base_type)) {\n      return field->default_integer() ? \"true\" : \"false\";\n    }\n    if (IsScalar(base_type)) {\n      return NumToString((field->default_integer()));\n    }\n    // represents offsets\n    return \"0\";\n  }\n\n  void StartCodeBlock(const reflection::Enum* enum_def) {\n    current_enum_ = enum_def;\n    current_obj_ = nullptr;\n    requires_.clear();\n  }\n\n  void StartCodeBlock(const reflection::Object* object) {\n    current_obj_ = object;\n    current_enum_ = nullptr;\n    requires_.clear();\n  }\n\n  std::string RegisterRequires(const r::Field* field,\n                               bool use_element = false) {\n    std::string type_name;\n\n    const r::BaseType type =\n        use_element ? field->type()->element() : field->type()->base_type();\n\n    if (IsStructOrTable(type)) {\n      const r::Object* object = GetObjectByIndex(field->type()->index());\n      if (object == current_obj_) {\n        return namer_.Denamespace(object);\n      }\n      type_name = object->name()->str();\n    } else {\n      const r::Enum* enum_def = GetEnumByIndex(field->type()->index());\n      if (enum_def == current_enum_) {\n        return namer_.Denamespace(enum_def);\n      }\n      type_name = enum_def->name()->str();\n    }\n\n    // Prefix with double __ to avoid name clashing, since these are defined\n    // at the top of the file and have lexical scoping. Replace '.' with '_'\n    // so it can be a legal identifier.\n    std::string name = \"__\" + type_name;\n    std::replace(name.begin(), name.end(), '.', '_');\n\n    return RegisterRequires(name, type_name);\n  }\n\n  std::string RegisterRequires(const std::string& local_name,\n                               const std::string& requires_name) {\n    requires_[local_name] = requires_name;\n    return local_name;\n  }\n\n  void EmitCodeBlock(const std::string& code_block, const std::string& name,\n                     const std::string& ns,\n                     const std::string& declaring_file) const {\n    const std::string full_qualified_name = ns.empty() ? name : ns + \".\" + name;\n\n    std::string code = \"--[[ \" + full_qualified_name + \"\\n\\n\";\n    code +=\n        \"  Automatically generated by the FlatBuffers compiler, do not \"\n        \"modify.\\n\";\n    code += \"  Or modify. I'm a message, not a cop.\\n\";\n    code += \"\\n\";\n    code += \"  flatc version: \" + flatc_version_ + \"\\n\";\n    code += \"\\n\";\n    code += \"  Declared by  : \" + declaring_file + \"\\n\";\n\n    const r::Object* root_table = schema_->root_table();\n    if (root_table) {\n      const std::string root_type = root_table->name()->str();\n      const std::string root_file = root_table->declaration_file()->str();\n\n      code += \"  Rooting type : \" + root_type + \" (\" + root_file + \")\\n\";\n    }\n\n    code += \"\\n--]]\\n\\n\";\n\n    if (!requires_.empty()) {\n      for (auto it = requires_.cbegin(); it != requires_.cend(); ++it) {\n        code += \"local \" + it->first + \" = require('\" + it->second + \"')\\n\";\n      }\n      code += \"\\n\";\n    }\n\n    code += code_block;\n    code += \"return \" + name;\n\n    // Namespaces are '.' deliminted, so replace it with the path separator.\n    std::string path = ns;\n\n    if (ns.empty()) {\n      path = \".\";\n    } else {\n      std::replace(path.begin(), path.end(), '.', '/');\n    }\n\n    // TODO(derekbailey): figure out a save file without depending on util.h\n    EnsureDirExists(path);\n    const std::string file_name =\n        options_.output_path + path + \"/\" + namer_.File(name);\n    options_.file_saver->SaveFile(file_name.c_str(), code, false);\n  }\n\n  std::unordered_set<std::string> keywords_;\n  std::map<std::string, std::string> requires_;\n  CodeGenOptions options_;\n\n  const r::Object* current_obj_;\n  const r::Enum* current_enum_;\n  const std::string flatc_version_;\n  const BfbsNamer namer_;\n};\n}  // namespace\n\nstd::unique_ptr<CodeGenerator> NewLuaBfbsGenerator(\n    const std::string& flatc_version) {\n  return std::unique_ptr<LuaBfbsGenerator>(new LuaBfbsGenerator(flatc_version));\n}\n\n}  // namespace flatbuffers\n"
  },
  {
    "path": "src/bfbs_gen_lua.h",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_BFBS_GEN_LUA_H_\n#define FLATBUFFERS_BFBS_GEN_LUA_H_\n\n#include <memory>\n#include <string>\n\n#include \"flatbuffers/code_generator.h\"\n\nnamespace flatbuffers {\n\n// Constructs a new Lua Code generator.\nstd::unique_ptr<CodeGenerator> NewLuaBfbsGenerator(\n    const std::string& flatc_version);\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_BFBS_GEN_LUA_H_\n"
  },
  {
    "path": "src/bfbs_gen_nim.cpp",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"bfbs_gen_nim.h\"\n\n#include <cstdint>\n#include <map>\n#include <memory>\n#include <string>\n#include <unordered_set>\n#include <vector>\n\n// Ensure no includes to flatc internals. bfbs_gen.h and generator.h are OK.\n#include \"bfbs_gen.h\"\n#include \"bfbs_namer.h\"\n\n// The intermediate representation schema.\n#include \"flatbuffers/code_generator.h\"\n#include \"flatbuffers/reflection.h\"\n#include \"flatbuffers/reflection_generated.h\"\n\nnamespace flatbuffers {\nnamespace {\n\n// To reduce typing\nnamespace r = ::reflection;\n\nstd::set<std::string> NimKeywords() {\n  return {\n      \"addr\",      \"and\",     \"as\",        \"asm\",      \"bind\",   \"block\",\n      \"break\",     \"case\",    \"cast\",      \"concept\",  \"const\",  \"continue\",\n      \"converter\", \"defer\",   \"discard\",   \"distinct\", \"div\",    \"do\",\n      \"elif\",      \"else\",    \"end\",       \"enum\",     \"except\", \"export\",\n      \"finally\",   \"for\",     \"from\",      \"func\",     \"if\",     \"import\",\n      \"in\",        \"include\", \"interface\", \"is\",       \"isnot\",  \"iterator\",\n      \"let\",       \"macro\",   \"method\",    \"mixin\",    \"mod\",    \"nil\",\n      \"not\",       \"notin\",   \"object\",    \"of\",       \"or\",     \"out\",\n      \"proc\",      \"ptr\",     \"raise\",     \"ref\",      \"return\", \"shl\",\n      \"shr\",       \"static\",  \"template\",  \"try\",      \"tuple\",  \"type\",\n      \"using\",     \"var\",     \"when\",      \"while\",    \"xor\",    \"yield\",\n  };\n}\n\nNamer::Config NimDefaultConfig() {\n  return {/*types=*/Case::kUpperCamel,\n          /*constants=*/Case::kUpperCamel,\n          /*methods=*/Case::kLowerCamel,\n          /*functions=*/Case::kUpperCamel,\n          /*fields=*/Case::kLowerCamel,\n          /*variable=*/Case::kLowerCamel,\n          /*variants=*/Case::kUpperCamel,\n          /*enum_variant_seperator=*/\".\",\n          /*escape_keywords=*/Namer::Config::Escape::AfterConvertingCase,\n          /*namespaces=*/Case::kKeep,\n          /*namespace_seperator=*/\"/\",\n          /*object_prefix=*/\"\",\n          /*object_suffix=*/\"T\",\n          /*keyword_prefix=*/\"\",\n          /*keyword_suffix=*/\"_\",\n          /*keywords_casing=*/Namer::Config::KeywordsCasing::CaseSensitive,\n          /*filenames=*/Case::kKeep,\n          /*directories=*/Case::kKeep,\n          /*output_path=*/\"\",\n          /*filename_suffix=*/\"\",\n          /*filename_extension=*/\".nim\"};\n}\n\nconst std::string Export = \"*\";\nconst std::set<std::string> builtin_types = {\n    \"uint8\",   \"uint8\",  \"bool\",   \"int8\",  \"uint8\",   \"int16\",\n    \"uint16\",  \"int32\",  \"uint32\", \"int64\", \"uint64\",  \"float32\",\n    \"float64\", \"string\", \"int\",    \"uint\",  \"uoffset\", \"Builder\"};\n\nclass NimBfbsGenerator : public BaseBfbsGenerator {\n public:\n  explicit NimBfbsGenerator(const std::string& flatc_version)\n      : BaseBfbsGenerator(),\n        keywords_(),\n        imports_(),\n        current_obj_(nullptr),\n        current_enum_(nullptr),\n        flatc_version_(flatc_version),\n        namer_(NimDefaultConfig(), NimKeywords()) {}\n\n  Status GenerateFromSchema(const r::Schema* schema,\n                            const CodeGenOptions& options)\n      FLATBUFFERS_OVERRIDE {\n    options_ = options;\n    ForAllEnums(schema->enums(), [&](const r::Enum* enum_def) {\n      StartCodeBlock(enum_def);\n      GenerateEnum(enum_def);\n    });\n    ForAllObjects(schema->objects(), [&](const r::Object* object) {\n      StartCodeBlock(object);\n      GenerateObject(object);\n    });\n    return OK;\n  }\n\n  using BaseBfbsGenerator::GenerateCode;\n\n  Status GenerateCode(const Parser& parser, const std::string& path,\n                      const std::string& filename) override {\n    (void)parser;\n    (void)path;\n    (void)filename;\n    return NOT_IMPLEMENTED;\n  }\n\n  Status GenerateMakeRule(const Parser& parser, const std::string& path,\n                          const std::string& filename,\n                          std::string& output) override {\n    (void)parser;\n    (void)path;\n    (void)filename;\n    (void)output;\n    return NOT_IMPLEMENTED;\n  }\n\n  Status GenerateGrpcCode(const Parser& parser, const std::string& path,\n                          const std::string& filename) override {\n    (void)parser;\n    (void)path;\n    (void)filename;\n    return NOT_IMPLEMENTED;\n  }\n\n  Status GenerateRootFile(const Parser& parser,\n                          const std::string& path) override {\n    (void)parser;\n    (void)path;\n    return NOT_IMPLEMENTED;\n  }\n\n  bool IsSchemaOnly() const override { return true; }\n\n  bool SupportsBfbsGeneration() const override { return true; }\n\n  bool SupportsRootFileGeneration() const override { return false; }\n\n  IDLOptions::Language Language() const override { return IDLOptions::kNim; }\n\n  std::string LanguageName() const override { return \"Nim\"; }\n\n  uint64_t SupportedAdvancedFeatures() const FLATBUFFERS_OVERRIDE {\n    return r::AdvancedArrayFeatures | r::AdvancedUnionFeatures |\n           r::OptionalScalars | r::DefaultVectorsAndStrings;\n  }\n\n protected:\n  void GenerateEnum(const r::Enum* enum_def) {\n    std::string code;\n\n    std::string ns;\n    const std::string enum_name = namer_.Type(namer_.Denamespace(enum_def, ns));\n    const std::string enum_type =\n        GenerateTypeBasic(enum_def->underlying_type());\n\n    GenerateDocumentation(enum_def->documentation(), \"\", code);\n    code += \"type \" + enum_name + Export + \"{.pure.} = enum\\n\";\n\n    ForAllEnumValues(enum_def, [&](const reflection::EnumVal* enum_val) {\n      GenerateDocumentation(enum_val->documentation(), \"  \", code);\n      code += \"  \" + namer_.Variant(enum_val->name()->str()) + \" = \" +\n              NumToString(enum_val->value()) + \".\" + enum_type + \",\\n\";\n    });\n\n    EmitCodeBlock(code, enum_name, ns, enum_def->declaration_file()->str());\n  }\n\n  void GenerateObject(const r::Object* object) {\n    // Register the main flatbuffers module.\n    RegisterImports(\"flatbuffers\", \"\");\n    std::string code;\n\n    std::string ns;\n    const std::string object_name = namer_.Type(namer_.Denamespace(object, ns));\n\n    GenerateDocumentation(object->documentation(), \"\", code);\n    code += \"type \" + object_name + \"* = object of FlatObj\\n\";\n\n    // Create all the field accessors.\n    ForAllFields(object, /*reverse=*/false, [&](const r::Field* field) {\n      // Skip writing deprecated fields altogether.\n      if (field->deprecated()) {\n        return;\n      }\n\n      const std::string field_name = namer_.Field(*field);\n      const r::BaseType base_type = field->type()->base_type();\n      std::string field_type = GenerateType(field->type());\n\n      if (field->optional() && !object->is_struct()) {\n        RegisterImports(\"std/options\", \"\");\n        field_type = \"Option[\" + field_type + \"]\";\n      }\n\n      const std::string offset_prefix =\n          \"let o = self.tab.Offset(\" + NumToString(field->offset()) + \")\\n\";\n      const std::string offset_prefix_2 = \"if o != 0:\\n\";\n\n      if (IsScalar(base_type) || base_type == r::String ||\n          base_type == r::Obj || base_type == r::Union) {\n        GenerateDocumentation(field->documentation(), \"\", code);\n\n        std::string getter_signature = \"func \" + namer_.Method(field_name) +\n                                       \"*(self: \" + object_name +\n                                       \"): \" + field_type + \" =\\n\";\n        std::string getter_code;\n        std::string setter_signature =\n            \"func `\" + namer_.Method(field_name + \"=\") + \"`*(self: var \" +\n            object_name + \", n: \" + field_type + \"): bool =\\n\";\n        std::string setter_code;\n\n        if (base_type == r::Obj || base_type == r::Union ||\n            field->type()->index() >= 0) {\n          RegisterImports(object, field);\n        }\n\n        if (object->is_struct()) {\n          std::string field_getter =\n              GenerateGetter(field->type(), NumToString(field->offset()));\n          getter_code += \"  return \" + field_getter + \"\\n\";\n\n          if (IsScalar(base_type)) {\n            setter_code += \"  return self.tab.Mutate(self.tab.Pos + \" +\n                           NumToString(field->offset()) + \", n)\\n\";\n          }\n        } else {\n          // Table accessors\n          getter_code += \"  \" + offset_prefix;\n          getter_code += \"  \" + offset_prefix_2;\n          std::string field_getter = GenerateGetter(field->type(), \"o\");\n          if (field->optional()) {\n            field_getter = \"some(\" + field_getter + \")\";\n          }\n          getter_code += \"    return \" + field_getter + \"\\n\";\n          if (!field->optional()) {\n            getter_code += \"  return \" + DefaultValue(field) + \"\\n\";\n          }\n\n          if (IsScalar(base_type)) {\n            setter_code += \"  return self.tab.MutateSlot(\" +\n                           NumToString(field->offset()) + \", n)\\n\";\n          }\n        }\n        code += getter_signature + getter_code;\n        if (IsScalar(base_type)) {\n          code += setter_signature + setter_code;\n        }\n      } else if (base_type == r::Array || base_type == r::Vector) {\n        const r::BaseType vector_base_type = field->type()->element();\n        uint32_t element_size = field->type()->element_size();\n\n        if (vector_base_type == r::Obj || vector_base_type == r::Union ||\n            field->type()->index() >= 0) {\n          RegisterImports(object, field, true);\n        }\n\n        // Get vector length:\n        code += \"func \" + namer_.Method(field_name + \"Length\") +\n                \"*(self: \" + object_name + \"): int = \\n\";\n        code += \"  \" + offset_prefix;\n        code += \"  \" + offset_prefix_2;\n        code += \"    return self.tab.VectorLen(o)\\n\";\n\n        // Get single vector field:\n        code += \"func \" + namer_.Method(field_name) + \"*(self: \" + object_name +\n                \", j: int): \" + GenerateType(field->type(), true) + \" = \\n\";\n        code += \"  \" + offset_prefix;\n        code += \"  \" + offset_prefix_2;\n        code += \"    var x = self.tab.Vector(o)\\n\";\n        code +=\n            \"    x += j.uoffset * \" + NumToString(element_size) + \".uoffset\\n\";\n        code += \"    return \" + GenerateGetter(field->type(), \"x\", true) + \"\\n\";\n\n        // Get entire vector:\n        code += \"func \" + namer_.Method(field_name) + \"*(self: \" + object_name +\n                \"): \" + GenerateType(field->type()) + \" = \\n\";\n        code += \"  let len = self.\" + field_name + \"Length\\n\";\n        code += \"  for i in countup(0, len - 1):\\n\";\n        code += \"    result.add(self.\" + field_name + \"(i))\\n\";\n\n        (void)IsSingleByte(vector_base_type);  // unnused function warning\n      }\n    });\n\n    // Create all the builders\n    if (object->is_struct()) {\n      code += \"proc \" + namer_.Function(object_name + \"Create\") +\n              \"*(self: var Builder\";\n      code += GenerateStructBuilderArgs(object);\n      code += \"): uoffset =\\n\";\n      code += AppendStructBuilderBody(object);\n      code += \"  return self.Offset()\\n\";\n    } else {\n      // Table builders\n      code += \"proc \" + namer_.Function(object_name + \"Start\") +\n              \"*(builder: var Builder) =\\n\";\n      code += \"  builder.StartObject(\" + NumToString(object->fields()->size()) +\n              \")\\n\";\n\n      ForAllFields(object, /*reverse=*/false, [&](const r::Field* field) {\n        if (field->deprecated()) {\n          return;\n        }\n\n        const std::string field_name = namer_.Field(*field);\n        const std::string variable_name = namer_.Variable(*field);\n        const std::string variable_type = GenerateTypeBasic(field->type());\n\n        code += \"proc \" + namer_.Function(object_name + \"Add\" + field_name) +\n                \"*(builder: var Builder, \" + variable_name + \": \" +\n                variable_type + \") =\\n\";\n        code += \"  builder.Prepend\" + GenerateMethod(field) + \"Slot(\" +\n                NumToString(field->id()) + \", \" + variable_name + \", default(\" +\n                variable_type + \"))\\n\";\n\n        if (IsVector(field->type()->base_type())) {\n          code += \"proc \" +\n                  namer_.Function(object_name + \"Start\" + field_name) +\n                  \"Vector*(builder: var Builder, numElems: uoffset) =\\n\";\n\n          const int32_t element_size = field->type()->element_size();\n          int32_t alignment = element_size;\n          if (IsStruct(field->type(), /*use_element=*/true)) {\n            alignment = GetObjectByIndex(field->type()->index())->minalign();\n          }\n\n          code += \"  builder.StartVector(\" + NumToString(element_size) +\n                  \", numElems, \" + NumToString(alignment) + \")\\n\";\n        }\n      });\n\n      code += \"proc \" + namer_.Function(object_name + \"End\") +\n              \"*(builder: var Builder): uoffset =\\n\";\n      code += \"  return builder.EndObject()\\n\";\n    }\n    EmitCodeBlock(code, object_name, ns, object->declaration_file()->str());\n  }\n\n private:\n  void GenerateDocumentation(\n      const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>*\n          documentation,\n      std::string indent, std::string& code) const {\n    flatbuffers::ForAllDocumentation(\n        documentation, [&](const flatbuffers::String* str) {\n          code += indent + \"# \" + str->str() + \"\\n\";\n        });\n  }\n\n  std::string GenerateStructBuilderArgs(const r::Object* object,\n                                        std::string prefix = \"\") const {\n    std::string signature;\n    ForAllFields(object, /*reverse=*/false, [&](const r::Field* field) {\n      if (IsStructOrTable(field->type()->base_type())) {\n        const r::Object* field_object = GetObject(field->type());\n        signature += GenerateStructBuilderArgs(\n            field_object, prefix + namer_.Variable(*field) + \"_\");\n      } else {\n        signature += \", \" + prefix + namer_.Variable(*field) + \": \" +\n                     GenerateType(field->type());\n      }\n    });\n    return signature;\n  }\n\n  std::string AppendStructBuilderBody(const r::Object* object,\n                                      std::string prefix = \"\") const {\n    std::string code;\n    code += \"  self.Prep(\" + NumToString(object->minalign()) + \", \" +\n            NumToString(object->bytesize()) + \")\\n\";\n\n    // We need to reverse the order we iterate over, since we build the\n    // buffer backwards.\n    ForAllFields(object, /*reverse=*/true, [&](const r::Field* field) {\n      const int32_t num_padding_bytes = field->padding();\n      if (num_padding_bytes) {\n        code += \"  self.Pad(\" + NumToString(num_padding_bytes) + \")\\n\";\n      }\n      if (IsStructOrTable(field->type()->base_type())) {\n        const r::Object* field_object = GetObject(field->type());\n        code += AppendStructBuilderBody(field_object,\n                                        prefix + namer_.Variable(*field) + \"_\");\n      } else {\n        code += \"  self.Prepend(\" + prefix + namer_.Variable(*field) + \")\\n\";\n      }\n    });\n\n    return code;\n  }\n\n  std::string GenerateMethod(const r::Field* field) const {\n    const r::BaseType base_type = field->type()->base_type();\n    if (IsStructOrTable(base_type)) {\n      return \"Struct\";\n    }\n    return \"\";\n  }\n\n  std::string GenerateGetter(const r::Type* type, const std::string& offsetval,\n                             bool element_type = false) const {\n    const r::BaseType base_type =\n        element_type ? type->element() : type->base_type();\n    std::string offset = offsetval;\n    if (!element_type) {\n      offset = \"self.tab.Pos + \" + offset;\n    }\n    switch (base_type) {\n      case r::String:\n        return \"self.tab.String(\" + offset + \")\";\n      case r::Union:\n        return \"self.tab.Union(\" + offsetval + \")\";\n      case r::Obj: {\n        return GenerateType(type, element_type) +\n               \"(tab: Vtable(Bytes: self.tab.Bytes, Pos: \" + offset + \"))\";\n      }\n      case r::Vector:\n        return GenerateGetter(type, offsetval, true);\n      default:\n        const r::Enum* type_enum = GetEnum(type, element_type);\n        if (type_enum != nullptr) {\n          return GenerateType(type, element_type) + \"(\" + \"Get[\" +\n                 GenerateType(base_type) + \"](self.tab, \" + offset + \")\" + \")\";\n        } else {\n          return \"Get[\" + GenerateType(base_type) + \"](self.tab, \" + offset +\n                 \")\";\n        }\n    }\n  }\n\n  std::string Denamespace(const std::string& s, std::string& importns,\n                          std::string& ns) const {\n    if (builtin_types.find(s) != builtin_types.end()) {\n      return s;\n    }\n    std::string type = namer_.Type(namer_.Denamespace(s, ns));\n    importns = ns.empty() ? type : ns + \".\" + type;\n    std::replace(importns.begin(), importns.end(), '.', '_');\n    return type;\n  }\n\n  std::string Denamespace(const std::string& s, std::string& importns) const {\n    std::string ns;\n    return Denamespace(s, importns, ns);\n  }\n\n  std::string Denamespace(const std::string& s) const {\n    std::string importns;\n    return Denamespace(s, importns);\n  }\n\n  std::string GenerateType(const r::Type* type, bool element_type = false,\n                           bool enum_inner = false) const {\n    const r::BaseType base_type =\n        element_type ? type->element() : type->base_type();\n    if (IsScalar(base_type) && !enum_inner) {\n      const r::Enum* type_enum = GetEnum(type, element_type);\n      if (type_enum != nullptr) {\n        std::string importns;\n        std::string type_name = Denamespace(type_enum->name()->str(), importns);\n        return importns + \".\" + type_name;\n      }\n    }\n    if (IsScalar(base_type)) {\n      return Denamespace(GenerateType(base_type));\n    }\n    switch (base_type) {\n      case r::String:\n        return \"string\";\n      case r::Vector: {\n        return \"seq[\" + GenerateType(type, true) + \"]\";\n      }\n      case r::Union:\n        return \"Vtable\";\n      case r::Obj: {\n        const r::Object* type_obj = GetObject(type, element_type);\n        std::string importns;\n        std::string type_name = Denamespace(type_obj->name()->str(), importns);\n        if (type_obj == current_obj_) {\n          return type_name;\n        } else {\n          return importns + \".\" + type_name;\n        }\n      }\n      default:\n        return \"uoffset\";\n    }\n  }\n\n  std::string GenerateTypeBasic(const r::Type* type,\n                                bool element_type = false) const {\n    const r::BaseType base_type =\n        element_type ? type->element() : type->base_type();\n    if (IsScalar(base_type)) {\n      return GenerateType(base_type);\n    } else {\n      return \"uoffset\";\n    }\n  }\n\n  std::string GenerateType(const r::BaseType base_type) const {\n    switch (base_type) {\n      case r::None:\n        return \"uint8\";\n      case r::UType:\n        return \"uint8\";\n      case r::Bool:\n        return \"bool\";\n      case r::Byte:\n        return \"int8\";\n      case r::UByte:\n        return \"uint8\";\n      case r::Short:\n        return \"int16\";\n      case r::UShort:\n        return \"uint16\";\n      case r::Int:\n        return \"int32\";\n      case r::UInt:\n        return \"uint32\";\n      case r::Long:\n        return \"int64\";\n      case r::ULong:\n        return \"uint64\";\n      case r::Float:\n        return \"float32\";\n      case r::Double:\n        return \"float64\";\n      case r::String:\n        return \"string\";\n      default:\n        return r::EnumNameBaseType(base_type);\n    }\n  }\n\n  std::string DefaultValue(const r::Field* field) const {\n    const r::BaseType base_type = field->type()->base_type();\n    if (IsFloatingPoint(base_type)) {\n      if (field->default_real() != field->default_real()) {\n        return \"NaN\";\n      } else if (field->default_real() ==\n                 std::numeric_limits<double>::infinity()) {\n        return \"Inf\";\n      } else if (field->default_real() ==\n                 -std::numeric_limits<double>::infinity()) {\n        return \"-Inf\";\n      }\n      return NumToString(field->default_real());\n    }\n    if (IsBool(base_type)) {\n      return field->default_integer() ? \"true\" : \"false\";\n    }\n    if (IsScalar(base_type)) {\n      const r::Enum* type_enum = GetEnum(field->type());\n      if (type_enum != nullptr) {\n        return \"type(result)(\" + NumToString((field->default_integer())) + \")\";\n      }\n      return NumToString((field->default_integer()));\n    }\n    if (base_type == r::String) {\n      return \"\\\"\\\"\";\n    }\n    // represents offsets\n    return \"0\";\n  }\n\n  void StartCodeBlock(const reflection::Enum* enum_def) {\n    current_enum_ = enum_def;\n    current_obj_ = nullptr;\n    imports_.clear();\n  }\n\n  void StartCodeBlock(const reflection::Object* object) {\n    current_enum_ = nullptr;\n    current_obj_ = object;\n    imports_.clear();\n  }\n\n  std::vector<std::string> StringSplit(const std::string orig_str,\n                                       const std::string token) {\n    std::vector<std::string> result;\n    std::string str = orig_str;\n    while (str.size()) {\n      size_t index = str.find(token);\n      if (index != std::string::npos) {\n        result.push_back(str.substr(0, index));\n        str = str.substr(index + token.size());\n        if (str.size() == 0) result.push_back(str);\n      } else {\n        result.push_back(str);\n        str = \"\";\n      }\n    }\n    return result;\n  }\n\n  std::string GetRelativePathFromNamespace(const std::string& relative_to,\n                                           const std::string& str2) {\n    std::vector<std::string> relative_to_vec = StringSplit(relative_to, \".\");\n    std::vector<std::string> str2_vec = StringSplit(str2, \".\");\n    while (relative_to_vec.size() > 0 && str2_vec.size() > 0) {\n      if (relative_to_vec[0] == str2_vec[0]) {\n        relative_to_vec.erase(relative_to_vec.begin());\n        str2_vec.erase(str2_vec.begin());\n      } else {\n        break;\n      }\n    }\n    relative_to_vec.pop_back();\n    for (size_t i = 0; i < relative_to_vec.size(); ++i) {\n      str2_vec.insert(str2_vec.begin(), std::string(\"..\"));\n    }\n\n    std::string new_path;\n    for (size_t i = 0; i < str2_vec.size(); ++i) {\n      new_path += str2_vec[i];\n      if (i != str2_vec.size() - 1) {\n        new_path += \"/\";\n      }\n    }\n    return new_path;\n  }\n\n  void RegisterImports(const r::Object* object, const r::Field* field,\n                       bool use_element = false) {\n    std::string importns;\n    std::string type_name;\n\n    const r::BaseType type =\n        use_element ? field->type()->element() : field->type()->base_type();\n\n    if (IsStructOrTable(type)) {\n      const r::Object* object_def = GetObjectByIndex(field->type()->index());\n      if (object_def == current_obj_) {\n        return;\n      }\n      std::string ns;\n      type_name = Denamespace(object_def->name()->str(), importns, ns);\n      type_name = ns.empty() ? type_name : ns + \".\" + type_name;\n    } else {\n      const r::Enum* enum_def = GetEnumByIndex(field->type()->index());\n      if (enum_def == current_enum_) {\n        return;\n      }\n      std::string ns;\n      type_name = Denamespace(enum_def->name()->str(), importns, ns);\n      type_name = ns.empty() ? type_name : ns + \".\" + type_name;\n    }\n\n    std::string import_path =\n        GetRelativePathFromNamespace(object->name()->str(), type_name);\n    std::replace(type_name.begin(), type_name.end(), '.', '_');\n    RegisterImports(import_path, importns);\n  }\n\n  void RegisterImports(const std::string& local_name,\n                       const std::string& imports_name) {\n    imports_[local_name] = imports_name;\n  }\n\n  void EmitCodeBlock(const std::string& code_block, const std::string& name,\n                     const std::string& ns, const std::string& declaring_file) {\n    const std::string full_qualified_name = ns.empty() ? name : ns + \".\" + name;\n\n    std::string code = \"#[ \" + full_qualified_name + \"\\n\";\n    code +=\n        \"  Automatically generated by the FlatBuffers compiler, do not \"\n        \"modify.\\n\";\n    code += \"  Or modify. I'm a message, not a cop.\\n\";\n    code += \"\\n\";\n    code += \"  flatc version: \" + flatc_version_ + \"\\n\";\n    code += \"\\n\";\n    code += \"  Declared by  : \" + declaring_file + \"\\n\";\n    if (schema_->root_table() != nullptr) {\n      const std::string root_type = schema_->root_table()->name()->str();\n      const std::string root_file =\n          schema_->root_table()->declaration_file()->str();\n      code += \"  Rooting type : \" + root_type + \" (\" + root_file + \")\\n\";\n    }\n    code += \"]#\\n\\n\";\n\n    if (!imports_.empty()) {\n      for (auto it = imports_.cbegin(); it != imports_.cend(); ++it) {\n        if (it->second.empty()) {\n          code += \"import \" + it->first + \"\\n\";\n        } else {\n          code += \"import \" + it->first + \" as \" + it->second + \"\\n\";\n        }\n      }\n      code += \"\\n\";\n    }\n    code += code_block;\n\n    // Namespaces are '.' deliminted, so replace it with the path separator.\n    std::string path = ns;\n\n    if (ns.empty()) {\n      path = \".\";\n    } else {\n      std::replace(path.begin(), path.end(), '.', '/');\n    }\n\n    // TODO(derekbailey): figure out a save file without depending on util.h\n    EnsureDirExists(path);\n    const std::string file_name =\n        options_.output_path + path + \"/\" + namer_.File(name);\n    options_.file_saver->SaveFile(file_name.c_str(), code, false);\n  }\n\n  std::unordered_set<std::string> keywords_;\n  std::map<std::string, std::string> imports_;\n  CodeGenOptions options_;\n\n  const r::Object* current_obj_;\n  const r::Enum* current_enum_;\n  const std::string flatc_version_;\n  const BfbsNamer namer_;\n};\n}  // namespace\n\nstd::unique_ptr<CodeGenerator> NewNimBfbsGenerator(\n    const std::string& flatc_version) {\n  return std::unique_ptr<NimBfbsGenerator>(new NimBfbsGenerator(flatc_version));\n}\n\n}  // namespace flatbuffers\n"
  },
  {
    "path": "src/bfbs_gen_nim.h",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_BFBS_GEN_NIM_H_\n#define FLATBUFFERS_BFBS_GEN_NIM_H_\n\n#include <memory>\n#include <string>\n\n#include \"flatbuffers/code_generator.h\"\n\nnamespace flatbuffers {\n\n// Constructs a new Nim Code generator.\nstd::unique_ptr<CodeGenerator> NewNimBfbsGenerator(\n    const std::string& flatc_version);\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_BFBS_GEN_NIM_H_\n"
  },
  {
    "path": "src/bfbs_namer.h",
    "content": "#ifndef FLATBUFFERS_BFBS_NAMER\n#define FLATBUFFERS_BFBS_NAMER\n\n#include \"flatbuffers/reflection.h\"\n#include \"namer.h\"\n\nnamespace flatbuffers {\n\n// Provides Namer capabilities to types defined in the flatbuffers reflection.\nclass BfbsNamer : public Namer {\n public:\n  explicit BfbsNamer(Config config, std::set<std::string> keywords)\n      : Namer(config, std::move(keywords)) {}\n\n  using Namer::Constant;\n  using Namer::Denamespace;\n  using Namer::Directories;\n  using Namer::Field;\n  using Namer::File;\n  using Namer::Function;\n  using Namer::Method;\n  using Namer::Namespace;\n  using Namer::NamespacedType;\n  using Namer::ObjectType;\n  using Namer::Type;\n  using Namer::Variable;\n  using Namer::Variant;\n\n  template <typename T>\n  std::string Denamespace(T t, std::string& namespace_prefix,\n                          const char delimiter = '.') const {\n    return Namer::Denamespace(t->name()->c_str(), namespace_prefix, delimiter);\n  }\n\n  template <typename T>\n  std::string Denamespace(T t, const char delimiter = '.') const {\n    return Namer::Denamespace(t->name()->c_str(), delimiter);\n  }\n\n  virtual std::string Field(const ::reflection::Field& f) const {\n    return Field(f.name()->str());\n  }\n\n  virtual std::string Variable(const ::reflection::Field& f) const {\n    return Variable(f.name()->str());\n  }\n};\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_BFBS_NAMER\n"
  },
  {
    "path": "src/binary_annotator.cpp",
    "content": "#include \"binary_annotator.h\"\n\n#include <algorithm>\n#include <cstdint>\n#include <iostream>\n#include <limits>\n#include <string>\n#include <vector>\n\n#include \"flatbuffers/base.h\"\n#include \"flatbuffers/reflection.h\"\n#include \"flatbuffers/util.h\"\n#include \"flatbuffers/verifier.h\"\n\nnamespace flatbuffers {\nnamespace {\n\nstatic bool BinaryRegionSort(const BinaryRegion& a, const BinaryRegion& b) {\n  return a.offset < b.offset;\n}\n\nstatic void SetError(BinaryRegionComment& comment, BinaryRegionStatus status,\n                     std::string message = \"\") {\n  comment.status = status;\n  comment.status_message = message;\n}\n\nstatic BinaryRegion MakeBinaryRegion(\n    const uint64_t offset = 0, const uint64_t length = 0,\n    const BinaryRegionType type = BinaryRegionType::Unknown,\n    const uint64_t array_length = 0, const uint64_t points_to_offset = 0,\n    BinaryRegionComment comment = {}) {\n  BinaryRegion region;\n  region.offset = offset;\n  region.length = length;\n  region.type = type;\n  region.array_length = array_length;\n  region.points_to_offset = points_to_offset;\n  region.comment = std::move(comment);\n  return region;\n}\n\nstatic BinarySection MakeBinarySection(const std::string& name,\n                                       const BinarySectionType type,\n                                       std::vector<BinaryRegion> regions) {\n  BinarySection section;\n  section.name = name;\n  section.type = type;\n  section.regions = std::move(regions);\n  return section;\n}\n\nstatic BinarySection MakeSingleRegionBinarySection(const std::string& name,\n                                                   const BinarySectionType type,\n                                                   const BinaryRegion& region) {\n  std::vector<BinaryRegion> regions;\n  regions.push_back(region);\n  return MakeBinarySection(name, type, std::move(regions));\n}\n\nstatic bool IsNonZeroRegion(const uint64_t offset, const uint64_t length,\n                            const uint8_t* const binary) {\n  for (uint64_t i = offset; i < offset + length; ++i) {\n    if (binary[i] != 0) {\n      return true;\n    }\n  }\n  return false;\n}\n\nstatic bool IsPrintableRegion(const uint64_t offset, const uint64_t length,\n                              const uint8_t* const binary) {\n  for (uint64_t i = offset; i < offset + length; ++i) {\n    if (!isprint(binary[i])) {\n      return false;\n    }\n  }\n  return true;\n}\n\nstatic BinarySection GenerateMissingSection(const uint64_t offset,\n                                            const uint64_t length,\n                                            const uint8_t* const binary) {\n  std::vector<BinaryRegion> regions;\n\n  // Check if the region is all zeros or not, as that can tell us if it is\n  // padding or not.\n  if (IsNonZeroRegion(offset, length, binary)) {\n    // Some of the padding bytes are non-zero, so this might be an unknown\n    // section of the binary.\n    // TODO(dbaileychess): We could be a bit smarter with different sized\n    // alignments. For now, the 8 byte check encompasses all the smaller\n    // alignments.\n    BinaryRegionComment comment;\n    comment.type = BinaryRegionCommentType::Unknown;\n    if (length >= 8) {\n      SetError(comment, BinaryRegionStatus::WARN_NO_REFERENCES);\n    } else {\n      SetError(comment, BinaryRegionStatus::WARN_CORRUPTED_PADDING);\n    }\n\n    regions.push_back(MakeBinaryRegion(offset, length * sizeof(uint8_t),\n                                       BinaryRegionType::Unknown, length, 0,\n                                       comment));\n\n    return MakeBinarySection(\"no known references\", BinarySectionType::Unknown,\n                             std::move(regions));\n  }\n\n  BinaryRegionComment comment;\n  comment.type = BinaryRegionCommentType::Padding;\n  if (length >= 8) {\n    SetError(comment, BinaryRegionStatus::WARN_PADDING_LENGTH);\n  }\n\n  // This region is most likely padding.\n  regions.push_back(MakeBinaryRegion(offset, length * sizeof(uint8_t),\n                                     BinaryRegionType::Uint8, length, 0,\n                                     comment));\n\n  return MakeBinarySection(\"\", BinarySectionType::Padding, std::move(regions));\n}\n\n}  // namespace\n\nstd::map<uint64_t, BinarySection> BinaryAnnotator::Annotate() {\n  if (bfbs_ != nullptr && bfbs_length_ != 0) {\n    flatbuffers::Verifier verifier(bfbs_, static_cast<size_t>(bfbs_length_));\n    if (!reflection::VerifySchemaBuffer(verifier)) {\n      return {};\n    }\n  }\n\n  // The binary is too short to read as a flatbuffers.\n  if (binary_length_ < FLATBUFFERS_MIN_BUFFER_SIZE) {\n    return {};\n  }\n\n  // Make sure we start with a clean slate.\n  vtables_.clear();\n  sections_.clear();\n\n  // First parse the header region which always start at offset 0.\n  // The returned offset will point to the root_table location.\n  const uint64_t root_table_offset = BuildHeader(0);\n\n  if (IsValidOffset(root_table_offset)) {\n    // Build the root table, and all else will be referenced from it.\n    BuildTable(root_table_offset, BinarySectionType::RootTable, RootTable());\n  }\n\n  // Now that all the sections are built, make sure the binary sections are\n  // contiguous.\n  FixMissingRegions();\n\n  // Then scan the area between BinarySections insert padding sections that are\n  // implied.\n  FixMissingSections();\n\n  return sections_;\n}\n\nuint64_t BinaryAnnotator::BuildHeader(const uint64_t header_offset) {\n  uint64_t offset = header_offset;\n  std::vector<BinaryRegion> regions;\n\n  // If this binary is a size prefixed one, attempt to parse the size.\n  if (is_size_prefixed_) {\n    BinaryRegionComment prefix_length_comment;\n    prefix_length_comment.type = BinaryRegionCommentType::SizePrefix;\n\n    bool has_prefix_value = false;\n    const auto prefix_length = ReadScalar<uoffset64_t>(offset);\n    if (*prefix_length <= binary_length_) {\n      regions.push_back(MakeBinaryRegion(offset, sizeof(uoffset64_t),\n                                         BinaryRegionType::Uint64, 0, 0,\n                                         prefix_length_comment));\n      offset += sizeof(uoffset64_t);\n      has_prefix_value = true;\n    }\n\n    if (!has_prefix_value) {\n      const auto prefix_length = ReadScalar<uoffset_t>(offset);\n      if (*prefix_length <= binary_length_) {\n        regions.push_back(MakeBinaryRegion(offset, sizeof(uoffset_t),\n                                           BinaryRegionType::Uint32, 0, 0,\n                                           prefix_length_comment));\n        offset += sizeof(uoffset_t);\n        has_prefix_value = true;\n      }\n    }\n\n    if (!has_prefix_value) {\n      SetError(prefix_length_comment, BinaryRegionStatus::ERROR);\n    }\n  }\n\n  const auto root_table_offset = ReadScalar<uint32_t>(offset);\n\n  if (!root_table_offset.has_value()) {\n    // This shouldn't occur, since we validate the min size of the buffer\n    // before. But for completion sake, we shouldn't read passed the binary end.\n    return std::numeric_limits<uint64_t>::max();\n  }\n\n  const auto root_table_loc = offset + *root_table_offset;\n\n  BinaryRegionComment root_offset_comment;\n  root_offset_comment.type = BinaryRegionCommentType::RootTableOffset;\n  root_offset_comment.name = RootTable()->name()->str();\n\n  if (!IsValidOffset(root_table_loc)) {\n    SetError(root_offset_comment,\n             BinaryRegionStatus::ERROR_OFFSET_OUT_OF_BINARY);\n  }\n\n  regions.push_back(MakeBinaryRegion(offset, sizeof(uint32_t),\n                                     BinaryRegionType::UOffset, 0,\n                                     root_table_loc, root_offset_comment));\n  offset += sizeof(uint32_t);\n\n  if (IsValidRead(offset, flatbuffers::kFileIdentifierLength) &&\n      IsPrintableRegion(offset, flatbuffers::kFileIdentifierLength, binary_)) {\n    BinaryRegionComment comment;\n    comment.type = BinaryRegionCommentType::FileIdentifier;\n    // Check if the file identifier region has non-zero data, and assume its\n    // the file identifier. Otherwise, it will get filled in with padding\n    // later.\n    regions.push_back(MakeBinaryRegion(\n        offset, flatbuffers::kFileIdentifierLength * sizeof(uint8_t),\n        BinaryRegionType::Char, flatbuffers::kFileIdentifierLength, 0,\n        comment));\n  }\n\n  AddSection(header_offset, MakeBinarySection(\"\", BinarySectionType::Header,\n                                              std::move(regions)));\n\n  return root_table_loc;\n}\n\nBinaryAnnotator::VTable* BinaryAnnotator::GetOrBuildVTable(\n    const uint64_t vtable_offset, const reflection::Object* const table,\n    const uint64_t offset_of_referring_table) {\n  // Get a list of vtables (if any) already defined at this offset.\n  std::list<VTable>& vtables = vtables_[vtable_offset];\n\n  // See if this vtable for the table type has been generated before.\n  for (VTable& vtable : vtables) {\n    if (vtable.referring_table == table) {\n      return &vtable;\n    }\n  }\n\n  // If we are trying to make a new vtable and it is already encompassed by\n  // another binary section, something is corrupted.\n  if (vtables.empty() && ContainsSection(vtable_offset)) {\n    return nullptr;\n  }\n\n  const std::string referring_table_name = table->name()->str();\n\n  BinaryRegionComment vtable_size_comment;\n  vtable_size_comment.type = BinaryRegionCommentType::VTableSize;\n\n  const auto vtable_length = ReadScalar<uint16_t>(vtable_offset);\n  if (!vtable_length.has_value()) {\n    const uint64_t remaining = RemainingBytes(vtable_offset);\n\n    SetError(vtable_size_comment, BinaryRegionStatus::ERROR_INCOMPLETE_BINARY,\n             \"2\");\n\n    AddSection(vtable_offset,\n               MakeSingleRegionBinarySection(\n                   referring_table_name, BinarySectionType::VTable,\n                   MakeBinaryRegion(vtable_offset, remaining,\n                                    BinaryRegionType::Unknown, remaining, 0,\n                                    vtable_size_comment)));\n    return nullptr;\n  }\n\n  // Vtables start with the size of the vtable\n  const uint16_t vtable_size = vtable_length.value();\n\n  if (!IsValidOffset(vtable_offset + vtable_size - 1)) {\n    SetError(vtable_size_comment, BinaryRegionStatus::ERROR_LENGTH_TOO_LONG);\n    // The vtable_size points to off the end of the binary.\n    AddSection(vtable_offset,\n               MakeSingleRegionBinarySection(\n                   referring_table_name, BinarySectionType::VTable,\n                   MakeBinaryRegion(vtable_offset, sizeof(uint16_t),\n                                    BinaryRegionType::Uint16, 0, 0,\n                                    vtable_size_comment)));\n\n    return nullptr;\n  } else if (vtable_size < 2 * sizeof(uint16_t)) {\n    SetError(vtable_size_comment, BinaryRegionStatus::ERROR_LENGTH_TOO_SHORT,\n             \"4\");\n    // The size includes itself and the table size which are both uint16_t.\n    AddSection(vtable_offset,\n               MakeSingleRegionBinarySection(\n                   referring_table_name, BinarySectionType::VTable,\n                   MakeBinaryRegion(vtable_offset, sizeof(uint16_t),\n                                    BinaryRegionType::Uint16, 0, 0,\n                                    vtable_size_comment)));\n    return nullptr;\n  }\n\n  std::vector<BinaryRegion> regions;\n\n  regions.push_back(MakeBinaryRegion(vtable_offset, sizeof(uint16_t),\n                                     BinaryRegionType::Uint16, 0, 0,\n                                     vtable_size_comment));\n  uint64_t offset = vtable_offset + sizeof(uint16_t);\n\n  BinaryRegionComment ref_table_len_comment;\n  ref_table_len_comment.type =\n      BinaryRegionCommentType::VTableRefferingTableLength;\n\n  // Ensure we can read the next uint16_t field, which is the size of the\n  // referring table.\n  const auto table_length = ReadScalar<uint16_t>(offset);\n\n  if (!table_length.has_value()) {\n    const uint64_t remaining = RemainingBytes(offset);\n    SetError(ref_table_len_comment, BinaryRegionStatus::ERROR_INCOMPLETE_BINARY,\n             \"2\");\n\n    AddSection(offset, MakeSingleRegionBinarySection(\n                           referring_table_name, BinarySectionType::VTable,\n                           MakeBinaryRegion(\n                               offset, remaining, BinaryRegionType::Unknown,\n                               remaining, 0, ref_table_len_comment)));\n    return nullptr;\n  }\n\n  // Then they have the size of the table they reference.\n  const uint16_t table_size = table_length.value();\n\n  if (!IsValidOffset(offset_of_referring_table + table_size - 1)) {\n    SetError(ref_table_len_comment, BinaryRegionStatus::ERROR_LENGTH_TOO_LONG);\n  } else if (table_size < 4) {\n    SetError(ref_table_len_comment, BinaryRegionStatus::ERROR_LENGTH_TOO_SHORT,\n             \"4\");\n  }\n\n  regions.push_back(MakeBinaryRegion(offset, sizeof(uint16_t),\n                                     BinaryRegionType::Uint16, 0, 0,\n                                     ref_table_len_comment));\n  offset += sizeof(uint16_t);\n\n  const uint64_t offset_start = offset;\n\n  // A mapping between field (and its id) to the relative offset (uint16_t) from\n  // the start of the table.\n  std::map<uint16_t, VTable::Entry> fields;\n\n  // Counter for determining if the binary has more vtable entries than the\n  // schema provided. This can occur if the binary was created at a newer schema\n  // version and is being processed with an older one.\n  uint16_t fields_processed = 0;\n\n  // Loop over all the fields.\n  ForAllFields(table, /*reverse=*/false, [&](const reflection::Field* field) {\n    const uint64_t field_offset = offset_start + field->id() * sizeof(uint16_t);\n\n    if (field_offset >= vtable_offset + vtable_size) {\n      // This field_offset is too large for this vtable, so it must come from a\n      // newer schema than the binary was create with or the binary writer did\n      // not write it. For either case, it is safe to ignore.\n\n      // TODO(dbaileychess): We could show which fields are not set an their\n      // default values if we want. We just need a way to make it obvious that\n      // it isn't part of the buffer.\n      return;\n    }\n\n    BinaryRegionComment field_comment;\n    field_comment.type = BinaryRegionCommentType::VTableFieldOffset;\n    field_comment.name = std::string(field->name()->c_str()) +\n                         \"` (id: \" + std::to_string(field->id()) + \")\";\n\n    const auto offset_from_table = ReadScalar<uint16_t>(field_offset);\n\n    if (!offset_from_table.has_value()) {\n      const uint64_t remaining = RemainingBytes(field_offset);\n\n      SetError(field_comment, BinaryRegionStatus::ERROR_INCOMPLETE_BINARY, \"2\");\n      regions.push_back(MakeBinaryRegion(field_offset, remaining,\n                                         BinaryRegionType::Unknown, remaining,\n                                         0, field_comment));\n\n      return;\n    }\n\n    if (!IsValidOffset(offset_of_referring_table + offset_from_table.value() -\n                       1)) {\n      SetError(field_comment, BinaryRegionStatus::ERROR_OFFSET_OUT_OF_BINARY);\n      regions.push_back(MakeBinaryRegion(field_offset, sizeof(uint16_t),\n                                         BinaryRegionType::VOffset, 0, 0,\n                                         field_comment));\n      return;\n    }\n\n    VTable::Entry entry;\n    entry.field = field;\n    entry.offset_from_table = offset_from_table.value();\n    fields.insert(std::make_pair(field->id(), entry));\n\n    std::string default_label;\n    if (offset_from_table.value() == 0) {\n      // Not present, so could be default or be optional.\n      if (field->required()) {\n        SetError(field_comment,\n                 BinaryRegionStatus::ERROR_REQUIRED_FIELD_NOT_PRESENT);\n        // If this is a required field, make it known this is an error.\n        regions.push_back(MakeBinaryRegion(field_offset, sizeof(uint16_t),\n                                           BinaryRegionType::VOffset, 0, 0,\n                                           field_comment));\n        return;\n      } else {\n        // Its an optional field, so get the default value and interpret and\n        // provided an annotation for it.\n        if (IsScalar(field->type()->base_type())) {\n          default_label += \"<defaults to \";\n          default_label += IsFloat(field->type()->base_type())\n                               ? std::to_string(field->default_real())\n                               : std::to_string(field->default_integer());\n          default_label += \"> (\";\n        } else {\n          default_label += \"<null> (\";\n        }\n        default_label +=\n            reflection::EnumNameBaseType(field->type()->base_type());\n        default_label += \")\";\n      }\n    }\n    field_comment.default_value = default_label;\n\n    regions.push_back(MakeBinaryRegion(field_offset, sizeof(uint16_t),\n                                       BinaryRegionType::VOffset, 0, 0,\n                                       field_comment));\n\n    fields_processed++;\n  });\n\n  // Check if we covered all the expectant fields. If not, we need to add them\n  // as unknown fields.\n  uint16_t expectant_vtable_fields =\n      (vtable_size - sizeof(uint16_t) - sizeof(uint16_t)) / sizeof(uint16_t);\n\n  // Prevent a bad binary from declaring a really large vtable_size, that we can\n  // not independently verify.\n  expectant_vtable_fields = std::min(\n      static_cast<uint16_t>(fields_processed * 3), expectant_vtable_fields);\n\n  for (uint16_t id = fields_processed; id < expectant_vtable_fields; ++id) {\n    const uint64_t field_offset = offset_start + id * sizeof(uint16_t);\n\n    const auto offset_from_table = ReadScalar<uint16_t>(field_offset);\n\n    BinaryRegionComment field_comment;\n    field_comment.type = BinaryRegionCommentType::VTableUnknownFieldOffset;\n    field_comment.index = id;\n\n    if (!offset_from_table.has_value()) {\n      const uint64_t remaining = RemainingBytes(field_offset);\n      SetError(field_comment, BinaryRegionStatus::ERROR_INCOMPLETE_BINARY, \"2\");\n      regions.push_back(MakeBinaryRegion(field_offset, remaining,\n                                         BinaryRegionType::Unknown, remaining,\n                                         0, field_comment));\n      continue;\n    }\n\n    VTable::Entry entry;\n    entry.field = nullptr;  // No field to reference.\n    entry.offset_from_table = offset_from_table.value();\n    fields.insert(std::make_pair(id, entry));\n\n    regions.push_back(MakeBinaryRegion(field_offset, sizeof(uint16_t),\n                                       BinaryRegionType::VOffset, 0, 0,\n                                       field_comment));\n  }\n\n  // If we have never added this vtable before record the Binary section.\n  if (vtables.empty()) {\n    sections_[vtable_offset] = MakeBinarySection(\n        referring_table_name, BinarySectionType::VTable, std::move(regions));\n  } else {\n    // Add the current table name to the name of the section.\n    sections_[vtable_offset].name += \", \" + referring_table_name;\n  }\n\n  VTable vtable;\n  vtable.referring_table = table;\n  vtable.fields = std::move(fields);\n  vtable.table_size = table_size;\n  vtable.vtable_size = vtable_size;\n\n  // Add this vtable to the collection of vtables at this offset.\n  vtables.push_back(std::move(vtable));\n\n  // Return the vtable we just added.\n  return &vtables.back();\n}\n\nvoid BinaryAnnotator::BuildTable(const uint64_t table_offset,\n                                 const BinarySectionType type,\n                                 const reflection::Object* const table) {\n  if (ContainsSection(table_offset)) {\n    return;\n  }\n\n  BinaryRegionComment vtable_offset_comment;\n  vtable_offset_comment.type = BinaryRegionCommentType::TableVTableOffset;\n\n  const auto vtable_soffset = ReadScalar<int32_t>(table_offset);\n\n  if (!vtable_soffset.has_value()) {\n    const uint64_t remaining = RemainingBytes(table_offset);\n    SetError(vtable_offset_comment, BinaryRegionStatus::ERROR_INCOMPLETE_BINARY,\n             \"4\");\n\n    AddSection(\n        table_offset,\n        MakeSingleRegionBinarySection(\n            table->name()->str(), type,\n            MakeBinaryRegion(table_offset, remaining, BinaryRegionType::Unknown,\n                             remaining, 0, vtable_offset_comment)));\n\n    // If there aren't enough bytes left to read the vtable offset, there is\n    // nothing we can do.\n    return;\n  }\n\n  // Tables start with the vtable\n  const uint64_t vtable_offset = table_offset - vtable_soffset.value();\n\n  if (!IsValidOffset(vtable_offset)) {\n    SetError(vtable_offset_comment,\n             BinaryRegionStatus::ERROR_OFFSET_OUT_OF_BINARY);\n\n    AddSection(table_offset,\n               MakeSingleRegionBinarySection(\n                   table->name()->str(), type,\n                   MakeBinaryRegion(table_offset, sizeof(int32_t),\n                                    BinaryRegionType::SOffset, 0, vtable_offset,\n                                    vtable_offset_comment)));\n\n    // There isn't much to do with an invalid vtable offset, as we won't be able\n    // to intepret the rest of the table fields.\n    return;\n  }\n\n  std::vector<BinaryRegion> regions;\n  regions.push_back(MakeBinaryRegion(table_offset, sizeof(int32_t),\n                                     BinaryRegionType::SOffset, 0,\n                                     vtable_offset, vtable_offset_comment));\n\n  // Parse the vtable first so we know what the rest of the fields in the table\n  // are.\n  const VTable* const vtable =\n      GetOrBuildVTable(vtable_offset, table, table_offset);\n\n  if (vtable == nullptr) {\n    // There is no valid vtable for this table, so we cannot process the rest of\n    // the table entries.\n    return;\n  }\n\n  // This is the size and length of this table.\n  const uint16_t table_size = vtable->table_size;\n  uint64_t table_end_offset = table_offset + table_size;\n\n  if (!IsValidOffset(table_end_offset - 1)) {\n    // We already validated the table size in BuildVTable, but we have to make\n    // sure we don't use a bad value here.\n    table_end_offset = binary_length_;\n  }\n\n  // We need to iterate over the vtable fields by their offset in the binary,\n  // not by their IDs. So copy them over to another vector that we can sort on\n  // the offset_from_table property.\n  std::vector<VTable::Entry> fields;\n  for (const auto& vtable_field : vtable->fields) {\n    fields.push_back(vtable_field.second);\n  }\n\n  std::stable_sort(fields.begin(), fields.end(),\n                   [](const VTable::Entry& a, const VTable::Entry& b) {\n                     return a.offset_from_table < b.offset_from_table;\n                   });\n\n  // Iterate over all the fields by order of their offset.\n  for (size_t i = 0; i < fields.size(); ++i) {\n    const reflection::Field* field = fields[i].field;\n    const uint16_t offset_from_table = fields[i].offset_from_table;\n\n    if (offset_from_table == 0) {\n      // Skip non-present fields.\n      continue;\n    }\n\n    // The field offsets are relative to the start of the table.\n    const uint64_t field_offset = table_offset + offset_from_table;\n\n    if (!IsValidOffset(field_offset)) {\n      // The field offset is larger than the binary, nothing we can do.\n      continue;\n    }\n\n    // We have a vtable entry for a non-existant field, that means its a binary\n    // generated by a newer schema than we are currently processing.\n    if (field == nullptr) {\n      // Calculate the length of this unknown field.\n      const uint64_t unknown_field_length =\n          // Check if there is another unknown field after this one.\n          ((i + 1 < fields.size())\n               ? table_offset + fields[i + 1].offset_from_table\n               // Otherwise use the known end of the table.\n               : table_end_offset) -\n          field_offset;\n\n      if (unknown_field_length == 0) {\n        continue;\n      }\n\n      std::string hint;\n\n      if (unknown_field_length == 4) {\n        const auto relative_offset = ReadScalar<uint32_t>(field_offset);\n        if (relative_offset.has_value()) {\n          // The field is 4 in length, so it could be an offset? Provide a hint.\n          hint += \"<possibly an offset? Check Loc: +0x\";\n          hint += ToHex(field_offset + relative_offset.value());\n          hint += \">\";\n        }\n      }\n\n      BinaryRegionComment unknown_field_comment;\n      unknown_field_comment.type = BinaryRegionCommentType::TableUnknownField;\n\n      if (!IsValidRead(field_offset, unknown_field_length)) {\n        const uint64_t remaining = RemainingBytes(field_offset);\n\n        SetError(unknown_field_comment,\n                 BinaryRegionStatus::ERROR_INCOMPLETE_BINARY,\n                 std::to_string(unknown_field_length));\n\n        regions.push_back(MakeBinaryRegion(field_offset, remaining,\n                                           BinaryRegionType::Unknown, remaining,\n                                           0, unknown_field_comment));\n        continue;\n      }\n\n      unknown_field_comment.default_value = hint;\n\n      regions.push_back(MakeBinaryRegion(\n          field_offset, unknown_field_length, BinaryRegionType::Unknown,\n          unknown_field_length, 0, unknown_field_comment));\n      continue;\n    }\n\n    if (IsScalar(field->type()->base_type())) {\n      // These are the raw values store in the table.\n      const uint64_t type_size = GetTypeSize(field->type()->base_type());\n      const BinaryRegionType region_type =\n          GetRegionType(field->type()->base_type());\n\n      BinaryRegionComment scalar_field_comment;\n      scalar_field_comment.type = BinaryRegionCommentType::TableField;\n      scalar_field_comment.name =\n          std::string(field->name()->c_str()) + \"` (\" +\n          reflection::EnumNameBaseType(field->type()->base_type()) + \")\";\n\n      if (!IsValidRead(field_offset, type_size)) {\n        const uint64_t remaining = RemainingBytes(field_offset);\n        SetError(scalar_field_comment,\n                 BinaryRegionStatus::ERROR_INCOMPLETE_BINARY,\n                 std::to_string(type_size));\n\n        regions.push_back(MakeBinaryRegion(field_offset, remaining,\n                                           BinaryRegionType::Unknown, remaining,\n                                           0, scalar_field_comment));\n        continue;\n      }\n\n      if (IsUnionType(field)) {\n        // This is a type for a union. Validate the value\n        const auto enum_value = ReadScalar<uint8_t>(field_offset);\n\n        // This should always have a value, due to the IsValidRead check above.\n        if (!IsValidUnionValue(field, enum_value.value())) {\n          SetError(scalar_field_comment,\n                   BinaryRegionStatus::ERROR_INVALID_UNION_TYPE);\n\n          regions.push_back(MakeBinaryRegion(field_offset, type_size,\n                                             region_type, 0, 0,\n                                             scalar_field_comment));\n          continue;\n        }\n      }\n\n      regions.push_back(MakeBinaryRegion(field_offset, type_size, region_type,\n                                         0, 0, scalar_field_comment));\n      continue;\n    }\n\n    // Read the offset\n    uint64_t offset = 0;\n    uint64_t length = sizeof(uint32_t);\n    BinaryRegionType region_type = BinaryRegionType::UOffset;\n\n    if (field->offset64()) {\n      length = sizeof(uint64_t);\n      region_type = BinaryRegionType::UOffset64;\n      offset = ReadScalar<uint64_t>(field_offset).value_or(0);\n    } else {\n      offset = ReadScalar<uint32_t>(field_offset).value_or(0);\n    }\n    // const auto offset_from_field = ReadScalar<uint32_t>(field_offset);\n    uint64_t offset_of_next_item = 0;\n    BinaryRegionComment offset_field_comment;\n    offset_field_comment.type = BinaryRegionCommentType::TableOffsetField;\n    offset_field_comment.name = field->name()->c_str();\n    const std::string offset_prefix =\n        \"offset to field `\" + std::string(field->name()->c_str()) + \"`\";\n\n    // Validate any field that isn't inline (i.e., non-structs).\n    if (!IsInlineField(field)) {\n      if (offset == 0) {\n        const uint64_t remaining = RemainingBytes(field_offset);\n\n        SetError(offset_field_comment,\n                 BinaryRegionStatus::ERROR_INCOMPLETE_BINARY, \"4\");\n\n        regions.push_back(MakeBinaryRegion(field_offset, remaining,\n                                           BinaryRegionType::Unknown, remaining,\n                                           0, offset_field_comment));\n        continue;\n      }\n\n      offset_of_next_item = field_offset + offset;\n\n      if (!IsValidOffset(offset_of_next_item)) {\n        SetError(offset_field_comment,\n                 BinaryRegionStatus::ERROR_OFFSET_OUT_OF_BINARY);\n        regions.push_back(MakeBinaryRegion(field_offset, length, region_type, 0,\n                                           offset_of_next_item,\n                                           offset_field_comment));\n        continue;\n      }\n    }\n\n    switch (field->type()->base_type()) {\n      case reflection::BaseType::Obj: {\n        const reflection::Object* next_object =\n            schema_->objects()->Get(field->type()->index());\n\n        if (next_object->is_struct()) {\n          // Structs are stored inline.\n          BuildStruct(field_offset, regions, field->name()->c_str(),\n                      next_object);\n        } else {\n          offset_field_comment.default_value = \"(table)\";\n\n          regions.push_back(MakeBinaryRegion(field_offset, length, region_type,\n                                             0, offset_of_next_item,\n                                             offset_field_comment));\n\n          BuildTable(offset_of_next_item, BinarySectionType::Table,\n                     next_object);\n        }\n      } break;\n\n      case reflection::BaseType::String: {\n        offset_field_comment.default_value = \"(string)\";\n        regions.push_back(MakeBinaryRegion(field_offset, length, region_type, 0,\n                                           offset_of_next_item,\n                                           offset_field_comment));\n        BuildString(offset_of_next_item, table, field);\n      } break;\n\n      case reflection::BaseType::Vector: {\n        offset_field_comment.default_value = \"(vector)\";\n        regions.push_back(MakeBinaryRegion(field_offset, length, region_type, 0,\n                                           offset_of_next_item,\n                                           offset_field_comment));\n        BuildVector(offset_of_next_item, table, field, table_offset,\n                    vtable->fields);\n      } break;\n      case reflection::BaseType::Vector64: {\n        offset_field_comment.default_value = \"(vector64)\";\n        regions.push_back(MakeBinaryRegion(field_offset, length, region_type, 0,\n                                           offset_of_next_item,\n                                           offset_field_comment));\n        BuildVector(offset_of_next_item, table, field, table_offset,\n                    vtable->fields);\n      } break;\n\n      case reflection::BaseType::Union: {\n        const uint64_t union_offset = offset_of_next_item;\n\n        // The union type field is always one less than the union itself.\n        const uint16_t union_type_id = field->id() - 1;\n\n        auto vtable_field = vtable->fields.find(union_type_id);\n        if (vtable_field == vtable->fields.end()) {\n          // TODO(dbaileychess): need to capture this error condition.\n          break;\n        }\n        offset_field_comment.default_value = \"(union)\";\n\n        const uint64_t type_offset =\n            table_offset + vtable_field->second.offset_from_table;\n\n        const auto realized_type = ReadScalar<uint8_t>(type_offset);\n        if (!realized_type.has_value()) {\n          const uint64_t remaining = RemainingBytes(type_offset);\n          SetError(offset_field_comment,\n                   BinaryRegionStatus::ERROR_INCOMPLETE_BINARY, \"1\");\n          regions.push_back(MakeBinaryRegion(\n              type_offset, remaining, BinaryRegionType::Unknown, remaining, 0,\n              offset_field_comment));\n          continue;\n        }\n\n        if (!IsValidUnionValue(field, realized_type.value())) {\n          // We already export an error in the union type field, so just skip\n          // building the union itself and it will default to an unreference\n          // Binary section.\n          continue;\n        }\n\n        const std::string enum_type =\n            BuildUnion(union_offset, realized_type.value(), field);\n\n        offset_field_comment.default_value =\n            \"(union of type `\" + enum_type + \"`)\";\n\n        regions.push_back(MakeBinaryRegion(field_offset, length, region_type, 0,\n                                           union_offset, offset_field_comment));\n\n      } break;\n\n      default:\n        break;\n    }\n  }\n\n  // Handle the case where there is padding after the last known binary\n  // region. Calculate where we left off towards the expected end of the\n  // table.\n  const uint64_t i = regions.back().offset + regions.back().length + 1;\n\n  if (i < table_end_offset) {\n    const uint64_t pad_bytes = table_end_offset - i + 1;\n\n    BinaryRegionComment padding_comment;\n    padding_comment.type = BinaryRegionCommentType::Padding;\n\n    regions.push_back(MakeBinaryRegion(i - 1, pad_bytes * sizeof(uint8_t),\n                                       BinaryRegionType::Uint8, pad_bytes, 0,\n                                       padding_comment));\n  }\n\n  AddSection(table_offset,\n             MakeBinarySection(table->name()->str(), type, std::move(regions)));\n}\n\nuint64_t BinaryAnnotator::BuildStruct(const uint64_t struct_offset,\n                                      std::vector<BinaryRegion>& regions,\n                                      const std::string referring_field_name,\n                                      const reflection::Object* const object) {\n  if (!object->is_struct()) {\n    return struct_offset;\n  }\n  uint64_t offset = struct_offset;\n\n  // Loop over all the fields in increasing order\n  ForAllFields(object, /*reverse=*/false, [&](const reflection::Field* field) {\n    if (IsScalar(field->type()->base_type())) {\n      // Structure Field value\n      const uint64_t type_size = GetTypeSize(field->type()->base_type());\n      const BinaryRegionType region_type =\n          GetRegionType(field->type()->base_type());\n\n      BinaryRegionComment comment;\n      comment.type = BinaryRegionCommentType::StructField;\n      comment.name = referring_field_name + \".\" + field->name()->str();\n      comment.default_value = \"of '\" + object->name()->str() + \"' (\" +\n                              std::string(reflection::EnumNameBaseType(\n                                  field->type()->base_type())) +\n                              \")\";\n\n      if (!IsValidRead(offset, type_size)) {\n        const uint64_t remaining = RemainingBytes(offset);\n        SetError(comment, BinaryRegionStatus::ERROR_INCOMPLETE_BINARY,\n                 std::to_string(type_size));\n        regions.push_back(MakeBinaryRegion(offset, remaining,\n                                           BinaryRegionType::Unknown, remaining,\n                                           0, comment));\n\n        // TODO(dbaileychess): Should I bail out here? This sets offset to the\n        // end of the binary. So all other reads in the loop should fail.\n        offset += remaining;\n        return;\n      }\n\n      regions.push_back(\n          MakeBinaryRegion(offset, type_size, region_type, 0, 0, comment));\n      offset += type_size;\n    } else if (field->type()->base_type() == reflection::BaseType::Obj) {\n      // Structs are stored inline, even when nested.\n      offset = BuildStruct(offset, regions,\n                           referring_field_name + \".\" + field->name()->str(),\n                           schema_->objects()->Get(field->type()->index()));\n    } else if (field->type()->base_type() == reflection::BaseType::Array) {\n      const bool is_scalar = IsScalar(field->type()->element());\n      const uint64_t type_size = GetTypeSize(field->type()->element());\n      const BinaryRegionType region_type =\n          GetRegionType(field->type()->element());\n\n      // Arrays are just repeated structures.\n      for (uint16_t i = 0; i < field->type()->fixed_length(); ++i) {\n        if (is_scalar) {\n          BinaryRegionComment array_comment;\n          array_comment.type = BinaryRegionCommentType::ArrayField;\n          array_comment.name =\n              referring_field_name + \".\" + field->name()->str();\n          array_comment.index = i;\n          array_comment.default_value =\n              \"of '\" + object->name()->str() + \"' (\" +\n              std::string(\n                  reflection::EnumNameBaseType(field->type()->element())) +\n              \")\";\n\n          if (!IsValidRead(offset, type_size)) {\n            const uint64_t remaining = RemainingBytes(offset);\n\n            SetError(array_comment, BinaryRegionStatus::ERROR_INCOMPLETE_BINARY,\n                     std::to_string(type_size));\n\n            regions.push_back(MakeBinaryRegion(offset, remaining,\n                                               BinaryRegionType::Unknown,\n                                               remaining, 0, array_comment));\n\n            // TODO(dbaileychess): Should I bail out here? This sets offset to\n            // the end of the binary. So all other reads in the loop should\n            // fail.\n            offset += remaining;\n            break;\n          }\n\n          regions.push_back(MakeBinaryRegion(offset, type_size, region_type, 0,\n                                             0, array_comment));\n\n          offset += type_size;\n        } else {\n          // Array of Structs.\n          //\n          // TODO(dbaileychess): This works, but the comments on the fields lose\n          // some context. Need to figure a way how to plumb the nested arrays\n          // comments together that isn't too confusing.\n          offset =\n              BuildStruct(offset, regions,\n                          referring_field_name + \".\" + field->name()->str(),\n                          schema_->objects()->Get(field->type()->index()));\n        }\n      }\n    }\n\n    // Insert any padding after this field.\n    const uint16_t padding = field->padding();\n    if (padding > 0 && IsValidOffset(offset + padding)) {\n      BinaryRegionComment padding_comment;\n      padding_comment.type = BinaryRegionCommentType::Padding;\n\n      regions.push_back(MakeBinaryRegion(offset, padding,\n                                         BinaryRegionType::Uint8, padding, 0,\n                                         padding_comment));\n      offset += padding;\n    }\n  });\n\n  return offset;\n}\n\nvoid BinaryAnnotator::BuildString(const uint64_t string_offset,\n                                  const reflection::Object* const table,\n                                  const reflection::Field* const field) {\n  // Check if we have already generated this string section, and this is a\n  // shared string instance.\n  if (ContainsSection(string_offset)) {\n    return;\n  }\n\n  std::vector<BinaryRegion> regions;\n  const auto string_length = ReadScalar<uint32_t>(string_offset);\n\n  BinaryRegionComment string_length_comment;\n  string_length_comment.type = BinaryRegionCommentType::StringLength;\n\n  if (!string_length.has_value()) {\n    const uint64_t remaining = RemainingBytes(string_offset);\n\n    SetError(string_length_comment, BinaryRegionStatus::ERROR_INCOMPLETE_BINARY,\n             \"4\");\n\n    regions.push_back(MakeBinaryRegion(string_offset, remaining,\n                                       BinaryRegionType::Unknown, remaining, 0,\n                                       string_length_comment));\n\n  } else {\n    const uint32_t string_size = string_length.value();\n    const uint64_t string_end =\n        string_offset + sizeof(uint32_t) + string_size + sizeof(char);\n\n    if (!IsValidOffset(string_end - 1)) {\n      SetError(string_length_comment,\n               BinaryRegionStatus::ERROR_LENGTH_TOO_LONG);\n\n      regions.push_back(MakeBinaryRegion(string_offset, sizeof(uint32_t),\n                                         BinaryRegionType::Uint32, 0, 0,\n                                         string_length_comment));\n    } else {\n      regions.push_back(MakeBinaryRegion(string_offset, sizeof(uint32_t),\n                                         BinaryRegionType::Uint32, 0, 0,\n                                         string_length_comment));\n\n      BinaryRegionComment string_comment;\n      string_comment.type = BinaryRegionCommentType::StringValue;\n\n      regions.push_back(MakeBinaryRegion(string_offset + sizeof(uint32_t),\n                                         string_size, BinaryRegionType::Char,\n                                         string_size, 0, string_comment));\n\n      BinaryRegionComment string_terminator_comment;\n      string_terminator_comment.type =\n          BinaryRegionCommentType::StringTerminator;\n\n      regions.push_back(MakeBinaryRegion(\n          string_offset + sizeof(uint32_t) + string_size, sizeof(char),\n          BinaryRegionType::Char, 0, 0, string_terminator_comment));\n    }\n  }\n\n  AddSection(string_offset,\n             MakeBinarySection(std::string(table->name()->c_str()) + \".\" +\n                                   field->name()->c_str(),\n                               BinarySectionType::String, std::move(regions)));\n}\n\nvoid BinaryAnnotator::BuildVector(\n    const uint64_t vector_offset, const reflection::Object* const table,\n    const reflection::Field* const field, const uint64_t parent_table_offset,\n    const std::map<uint16_t, VTable::Entry> vtable_fields) {\n  if (ContainsSection(vector_offset)) {\n    return;\n  }\n\n  BinaryRegionComment vector_length_comment;\n  vector_length_comment.type = BinaryRegionCommentType::VectorLength;\n\n  const bool is_64_bit_vector =\n      field->type()->base_type() == reflection::BaseType::Vector64;\n\n  flatbuffers::Optional<uint64_t> vector_length;\n  uint32_t vector_length_size_type = 0;\n  BinaryRegionType region_type = BinaryRegionType::Uint32;\n  BinarySectionType section_type = BinarySectionType::Vector;\n\n  if (is_64_bit_vector) {\n    auto v = ReadScalar<uint64_t>(vector_offset);\n    if (v.has_value()) {\n      vector_length = v.value();\n    }\n    vector_length_size_type = sizeof(uint64_t);\n    region_type = BinaryRegionType::Uint64;\n    section_type = BinarySectionType::Vector64;\n  } else {\n    auto v = ReadScalar<uint32_t>(vector_offset);\n    if (v.has_value()) {\n      vector_length = v.value();\n    }\n    vector_length_size_type = sizeof(uint32_t);\n    region_type = BinaryRegionType::Uint32;\n    section_type = BinarySectionType::Vector;\n  }\n\n  if (!vector_length.has_value()) {\n    const uint64_t remaining = RemainingBytes(vector_offset);\n    SetError(vector_length_comment, BinaryRegionStatus::ERROR_INCOMPLETE_BINARY,\n             \"4\");\n\n    AddSection(\n        vector_offset,\n        MakeSingleRegionBinarySection(\n            std::string(table->name()->c_str()) + \".\" + field->name()->c_str(),\n            BinarySectionType::Vector,\n            MakeBinaryRegion(vector_offset, remaining,\n                             BinaryRegionType::Unknown, remaining, 0,\n                             vector_length_comment)));\n    return;\n  }\n\n  // Validate there are enough bytes left in the binary to process all the\n  // items.\n  const uint64_t last_item_offset =\n      vector_offset + vector_length_size_type +\n      vector_length.value() * GetElementSize(field);\n\n  if (!IsValidOffset(last_item_offset - 1)) {\n    SetError(vector_length_comment, BinaryRegionStatus::ERROR_LENGTH_TOO_LONG);\n    AddSection(\n        vector_offset,\n        MakeSingleRegionBinarySection(\n            std::string(table->name()->c_str()) + \".\" + field->name()->c_str(),\n            BinarySectionType::Vector,\n            MakeBinaryRegion(vector_offset, vector_length_size_type,\n                             region_type, 0, 0, vector_length_comment)));\n\n    return;\n  }\n\n  std::vector<BinaryRegion> regions;\n\n  regions.push_back(MakeBinaryRegion(vector_offset, vector_length_size_type,\n                                     region_type, 0, 0, vector_length_comment));\n  // Consume the vector length offset.\n  uint64_t offset = vector_offset + vector_length_size_type;\n\n  switch (field->type()->element()) {\n    case reflection::BaseType::Obj: {\n      const reflection::Object* object =\n          schema_->objects()->Get(field->type()->index());\n\n      if (object->is_struct()) {\n        // Vector of structs\n        for (size_t i = 0; i < vector_length.value(); ++i) {\n          // Structs are inline to the vector.\n          const uint64_t next_offset =\n              BuildStruct(offset, regions, \"[\" + NumToString(i) + \"]\", object);\n          if (next_offset == offset) {\n            break;\n          }\n          offset = next_offset;\n        }\n      } else {\n        // Vector of objects\n        for (size_t i = 0; i < vector_length.value(); ++i) {\n          BinaryRegionComment vector_object_comment;\n          vector_object_comment.type =\n              BinaryRegionCommentType::VectorTableValue;\n          vector_object_comment.index = i;\n\n          const auto table_relative_offset = ReadScalar<uint32_t>(offset);\n          if (!table_relative_offset.has_value()) {\n            const uint64_t remaining = RemainingBytes(offset);\n            SetError(vector_object_comment,\n                     BinaryRegionStatus::ERROR_INCOMPLETE_BINARY, \"4\");\n\n            regions.push_back(\n                MakeBinaryRegion(offset, remaining, BinaryRegionType::Unknown,\n                                 remaining, 0, vector_object_comment));\n            break;\n          }\n\n          // The table offset is relative from the offset location itself.\n          const uint64_t table_offset = offset + table_relative_offset.value();\n\n          if (!IsValidOffset(table_offset)) {\n            SetError(vector_object_comment,\n                     BinaryRegionStatus::ERROR_OFFSET_OUT_OF_BINARY);\n            regions.push_back(MakeBinaryRegion(\n                offset, sizeof(uint32_t), BinaryRegionType::UOffset, 0,\n                table_offset, vector_object_comment));\n\n            offset += sizeof(uint32_t);\n            continue;\n          }\n\n          if (table_offset == parent_table_offset) {\n            SetError(vector_object_comment,\n                     BinaryRegionStatus::ERROR_CYCLE_DETECTED);\n            // A cycle detected where a table vector field is pointing to\n            // itself. This should only happen in corrupted files.\n            regions.push_back(MakeBinaryRegion(\n                offset, sizeof(uint32_t), BinaryRegionType::UOffset, 0,\n                table_offset, vector_object_comment));\n\n            offset += sizeof(uint32_t);\n            continue;\n          }\n\n          regions.push_back(MakeBinaryRegion(\n              offset, sizeof(uint32_t), BinaryRegionType::UOffset, 0,\n              table_offset, vector_object_comment));\n\n          // Consume the offset to the table.\n          offset += sizeof(uint32_t);\n\n          BuildTable(table_offset, BinarySectionType::Table, object);\n        }\n      }\n    } break;\n    case reflection::BaseType::String: {\n      // Vector of strings\n      for (size_t i = 0; i < vector_length.value(); ++i) {\n        BinaryRegionComment vector_object_comment;\n        vector_object_comment.type = BinaryRegionCommentType::VectorStringValue;\n        vector_object_comment.index = i;\n\n        const auto string_relative_offset = ReadScalar<uint32_t>(offset);\n        if (!string_relative_offset.has_value()) {\n          const uint64_t remaining = RemainingBytes(offset);\n\n          SetError(vector_object_comment,\n                   BinaryRegionStatus::ERROR_INCOMPLETE_BINARY, \"4\");\n\n          regions.push_back(\n              MakeBinaryRegion(offset, remaining, BinaryRegionType::Unknown,\n                               remaining, 0, vector_object_comment));\n          break;\n        }\n\n        // The string offset is relative from the offset location itself.\n        const uint64_t string_offset = offset + string_relative_offset.value();\n\n        if (!IsValidOffset(string_offset)) {\n          SetError(vector_object_comment,\n                   BinaryRegionStatus::ERROR_OFFSET_OUT_OF_BINARY);\n          regions.push_back(MakeBinaryRegion(\n              offset, sizeof(uint32_t), BinaryRegionType::UOffset, 0,\n              string_offset, vector_object_comment));\n\n          offset += sizeof(uint32_t);\n          continue;\n        }\n\n        regions.push_back(MakeBinaryRegion(\n            offset, sizeof(uint32_t), BinaryRegionType::UOffset, 0,\n            string_offset, vector_object_comment));\n\n        BuildString(string_offset, table, field);\n\n        offset += sizeof(uint32_t);\n      }\n    } break;\n    case reflection::BaseType::Union: {\n      // Vector of unions\n      // Unions have both their realized type (uint8_t for now) that are\n      // stored separately. These are stored in the field->index() - 1\n      // location.\n      const uint16_t union_type_vector_id = field->id() - 1;\n\n      auto vtable_entry = vtable_fields.find(union_type_vector_id);\n      if (vtable_entry == vtable_fields.end()) {\n        // TODO(dbaileychess): need to capture this error condition.\n        break;\n      }\n\n      const uint64_t union_type_vector_field_offset =\n          parent_table_offset + vtable_entry->second.offset_from_table;\n\n      const auto union_type_vector_field_relative_offset =\n          ReadScalar<uint16_t>(union_type_vector_field_offset);\n\n      if (!union_type_vector_field_relative_offset.has_value()) {\n        const uint64_t remaining = RemainingBytes(offset);\n        BinaryRegionComment vector_union_comment;\n        vector_union_comment.type = BinaryRegionCommentType::VectorUnionValue;\n        SetError(vector_union_comment,\n                 BinaryRegionStatus::ERROR_INCOMPLETE_BINARY, \"2\");\n\n        regions.push_back(MakeBinaryRegion(offset, remaining,\n                                           BinaryRegionType::Unknown, remaining,\n                                           0, vector_union_comment));\n\n        break;\n      }\n\n      // Get the offset to the first type (the + sizeof(uint32_t) is to skip\n      // over the vector length which we already know). Validation happens\n      // within the loop below.\n      const uint64_t union_type_vector_data_offset =\n          union_type_vector_field_offset +\n          union_type_vector_field_relative_offset.value() + sizeof(uint32_t);\n\n      for (size_t i = 0; i < vector_length.value(); ++i) {\n        BinaryRegionComment comment;\n        comment.type = BinaryRegionCommentType::VectorUnionValue;\n        comment.index = i;\n\n        const auto union_relative_offset = ReadScalar<uint32_t>(offset);\n        if (!union_relative_offset.has_value()) {\n          const uint64_t remaining = RemainingBytes(offset);\n\n          SetError(comment, BinaryRegionStatus::ERROR_INCOMPLETE_BINARY, \"4\");\n\n          regions.push_back(MakeBinaryRegion(offset, remaining,\n                                             BinaryRegionType::Unknown,\n                                             remaining, 0, comment));\n\n          break;\n        }\n\n        // The union offset is relative from the offset location itself.\n        const uint64_t union_offset = offset + union_relative_offset.value();\n\n        if (!IsValidOffset(union_offset)) {\n          SetError(comment, BinaryRegionStatus::ERROR_OFFSET_OUT_OF_BINARY);\n\n          regions.push_back(MakeBinaryRegion(offset, sizeof(uint32_t),\n                                             BinaryRegionType::UOffset, 0,\n                                             union_offset, comment));\n          continue;\n        }\n\n        const auto realized_type =\n            ReadScalar<uint8_t>(union_type_vector_data_offset + i);\n\n        if (!realized_type.has_value()) {\n          SetError(comment, BinaryRegionStatus::ERROR_INCOMPLETE_BINARY, \"1\");\n          regions.push_back(MakeBinaryRegion(\n              offset, 0, BinaryRegionType::Unknown, 0, 0, comment));\n          continue;\n        }\n\n        if (!IsValidUnionValue(vtable_entry->second.field->type()->index(),\n                               realized_type.value())) {\n          // We already export an error in the union type field, so just skip\n          // building the union itself and it will default to an unreference\n          // Binary section.\n          offset += sizeof(uint32_t);\n          continue;\n        }\n\n        const std::string enum_type =\n            BuildUnion(union_offset, realized_type.value(), field);\n\n        comment.default_value = \"(`\" + enum_type + \"`)\";\n        regions.push_back(MakeBinaryRegion(offset, sizeof(uint32_t),\n                                           BinaryRegionType::UOffset, 0,\n                                           union_offset, comment));\n\n        offset += sizeof(uint32_t);\n      }\n    } break;\n    default: {\n      if (IsScalar(field->type()->element())) {\n        const BinaryRegionType binary_region_type =\n            GetRegionType(field->type()->element());\n\n        const uint64_t type_size = GetTypeSize(field->type()->element());\n\n        // TODO(dbaileychess): It might be nicer to user the\n        // BinaryRegion.array_length field to indicate this.\n        for (size_t i = 0; i < vector_length.value(); ++i) {\n          BinaryRegionComment vector_scalar_comment;\n          vector_scalar_comment.type = BinaryRegionCommentType::VectorValue;\n          vector_scalar_comment.index = i;\n\n          if (!IsValidRead(offset, type_size)) {\n            const uint64_t remaining = RemainingBytes(offset);\n\n            SetError(vector_scalar_comment,\n                     BinaryRegionStatus::ERROR_INCOMPLETE_BINARY,\n                     std::to_string(type_size));\n\n            regions.push_back(\n                MakeBinaryRegion(offset, remaining, BinaryRegionType::Unknown,\n                                 remaining, 0, vector_scalar_comment));\n            break;\n          }\n\n          if (IsUnionType(field->type()->element())) {\n            // This is a type for a union. Validate the value\n            const auto enum_value = ReadScalar<uint8_t>(offset);\n\n            // This should always have a value, due to the IsValidRead check\n            // above.\n            if (!IsValidUnionValue(field->type()->index(),\n                                   enum_value.value())) {\n              SetError(vector_scalar_comment,\n                       BinaryRegionStatus::ERROR_INVALID_UNION_TYPE);\n              regions.push_back(MakeBinaryRegion(offset, type_size,\n                                                 binary_region_type, 0, 0,\n                                                 vector_scalar_comment));\n              offset += type_size;\n              continue;\n            }\n          }\n\n          regions.push_back(MakeBinaryRegion(offset, type_size,\n                                             binary_region_type, 0, 0,\n                                             vector_scalar_comment));\n          offset += type_size;\n        }\n      }\n    } break;\n  }\n  AddSection(vector_offset,\n             MakeBinarySection(std::string(table->name()->c_str()) + \".\" +\n                                   field->name()->c_str(),\n                               section_type, std::move(regions)));\n}\n\nstd::string BinaryAnnotator::BuildUnion(const uint64_t union_offset,\n                                        const uint8_t realized_type,\n                                        const reflection::Field* const field) {\n  const reflection::Enum* next_enum =\n      schema_->enums()->Get(field->type()->index());\n\n  const reflection::EnumVal* enum_val = next_enum->values()->Get(realized_type);\n\n  if (ContainsSection(union_offset)) {\n    return enum_val->name()->c_str();\n  }\n\n  const reflection::Type* union_type = enum_val->union_type();\n\n  if (union_type->base_type() == reflection::BaseType::Obj) {\n    const reflection::Object* object =\n        schema_->objects()->Get(union_type->index());\n\n    if (object->is_struct()) {\n      // Union of vectors point to a new Binary section\n      std::vector<BinaryRegion> regions;\n\n      BuildStruct(union_offset, regions, field->name()->c_str(), object);\n\n      AddSection(\n          union_offset,\n          MakeBinarySection(std::string(object->name()->c_str()) + \".\" +\n                                field->name()->c_str(),\n                            BinarySectionType::Union, std::move(regions)));\n    } else {\n      BuildTable(union_offset, BinarySectionType::Table, object);\n    }\n  }\n  // TODO(dbaileychess): handle the other union types.\n\n  return enum_val->name()->c_str();\n}\n\nvoid BinaryAnnotator::FixMissingRegions() {\n  std::vector<BinaryRegion> regions_to_insert;\n  for (auto& current_section : sections_) {\n    BinarySection& section = current_section.second;\n    if (section.regions.empty()) {\n      // TODO(dbaileychess): is this possible?\n      continue;\n    }\n\n    uint64_t offset = section.regions[0].offset + section.regions[0].length;\n    for (size_t i = 1; i < section.regions.size(); ++i) {\n      BinaryRegion& region = section.regions[i];\n\n      const uint64_t next_offset = region.offset;\n      if (!IsValidOffset(next_offset)) {\n        // TODO(dbaileychess): figure out how we get into this situation.\n        continue;\n      }\n\n      if (offset < next_offset) {\n        const uint64_t padding_bytes = next_offset - offset;\n\n        BinaryRegionComment comment;\n        comment.type = BinaryRegionCommentType::Padding;\n\n        if (IsNonZeroRegion(offset, padding_bytes, binary_)) {\n          SetError(comment, BinaryRegionStatus::WARN_NO_REFERENCES);\n          regions_to_insert.push_back(\n              MakeBinaryRegion(offset, padding_bytes, BinaryRegionType::Unknown,\n                               padding_bytes, 0, comment));\n        } else {\n          regions_to_insert.push_back(\n              MakeBinaryRegion(offset, padding_bytes, BinaryRegionType::Uint8,\n                               padding_bytes, 0, comment));\n        }\n      }\n      offset = next_offset + region.length;\n    }\n\n    if (!regions_to_insert.empty()) {\n      section.regions.insert(section.regions.end(), regions_to_insert.begin(),\n                             regions_to_insert.end());\n      std::stable_sort(section.regions.begin(), section.regions.end(),\n                       BinaryRegionSort);\n      regions_to_insert.clear();\n    }\n  }\n}\n\nvoid BinaryAnnotator::FixMissingSections() {\n  uint64_t offset = 0;\n\n  std::vector<BinarySection> sections_to_insert;\n\n  for (auto& current_section : sections_) {\n    BinarySection& section = current_section.second;\n    const uint64_t section_start_offset = current_section.first;\n    const uint64_t section_end_offset =\n        section.regions.back().offset + section.regions.back().length;\n\n    if (offset < section_start_offset) {\n      // We are at an offset that is less then the current section.\n      const uint64_t pad_bytes = section_start_offset - offset + 1;\n\n      sections_to_insert.push_back(\n          GenerateMissingSection(offset - 1, pad_bytes, binary_));\n    }\n    offset = section_end_offset + 1;\n  }\n\n  // Handle the case where there are still bytes left in the binary that are\n  // unaccounted for.\n  if (offset < binary_length_) {\n    const uint64_t pad_bytes = binary_length_ - offset + 1;\n    sections_to_insert.push_back(\n        GenerateMissingSection(offset - 1, pad_bytes, binary_));\n  }\n\n  for (const BinarySection& section_to_insert : sections_to_insert) {\n    AddSection(section_to_insert.regions[0].offset, section_to_insert);\n  }\n}\n\nbool BinaryAnnotator::ContainsSection(const uint64_t offset) {\n  auto it = sections_.lower_bound(offset);\n  // If the section is found, check that it is exactly equal its offset.\n  if (it != sections_.end() && it->first == offset) {\n    return true;\n  }\n\n  // If this was the first section, there are no other previous sections to\n  // check.\n  if (it == sections_.begin()) {\n    return false;\n  }\n\n  // Go back one section.\n  --it;\n\n  // And check that if the offset is covered by the section.\n  return offset >= it->first && offset < it->second.regions.back().offset +\n                                             it->second.regions.back().length;\n}\n\nconst reflection::Object* BinaryAnnotator::RootTable() const {\n  if (!root_table_.empty()) {\n    return schema_->objects()->LookupByKey(root_table_);\n  }\n  return schema_->root_table();\n}\n\n}  // namespace flatbuffers\n"
  },
  {
    "path": "src/binary_annotator.h",
    "content": "/*\n * Copyright 2021 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_BINARY_ANNOTATOR_H_\n#define FLATBUFFERS_BINARY_ANNOTATOR_H_\n\n#include <cstddef>\n#include <cstdint>\n#include <iomanip>\n#include <ios>\n#include <list>\n#include <map>\n#include <sstream>\n#include <string>\n#include <utility>\n#include <vector>\n\n#include \"flatbuffers/base.h\"\n#include \"flatbuffers/reflection.h\"\n#include \"flatbuffers/reflection_generated.h\"\n#include \"flatbuffers/stl_emulation.h\"\n\nnamespace flatbuffers {\n\nenum class BinaryRegionType {\n  Unknown = 0,\n  UOffset = 1,\n  SOffset = 2,\n  VOffset = 3,\n  Bool = 4,\n  Byte = 5,\n  Char = 6,\n  Uint8 = 7,\n  Int8 = 8,\n  Uint16 = 9,\n  Int16 = 10,\n  Uint32 = 11,\n  Int32 = 12,\n  Uint64 = 13,\n  Int64 = 14,\n  Float = 15,\n  Double = 16,\n  UType = 17,\n  UOffset64 = 18,\n};\n\ntemplate <typename T>\nstatic inline std::string ToHex(T i, size_t width = sizeof(T)) {\n  std::stringstream stream;\n  stream << std::hex << std::uppercase << std::setfill('0')\n         << std::setw(static_cast<int>(width)) << i;\n  return stream.str();\n}\n\n// Specialized version for uint8_t that don't work well with std::hex.\nstatic inline std::string ToHex(uint8_t i) {\n  return ToHex<int>(static_cast<int>(i), 2);\n}\n\nenum class BinaryRegionStatus {\n  OK = 0,\n  WARN = 100,\n  WARN_NO_REFERENCES,\n  WARN_CORRUPTED_PADDING,\n  WARN_PADDING_LENGTH,\n  ERROR = 200,\n  // An offset is pointing outside the binary bounds.\n  ERROR_OFFSET_OUT_OF_BINARY,\n  // Expecting to read N bytes but not enough remain in the binary.\n  ERROR_INCOMPLETE_BINARY,\n  // When a length of a vtable/vector is longer than possible.\n  ERROR_LENGTH_TOO_LONG,\n  // When a length of a vtable/vector is shorter than possible.\n  ERROR_LENGTH_TOO_SHORT,\n  // A field mark required is not present in the vtable.\n  ERROR_REQUIRED_FIELD_NOT_PRESENT,\n  // A realized union type is not within the enum bounds.\n  ERROR_INVALID_UNION_TYPE,\n  // Occurs when there is a cycle in offsets.\n  ERROR_CYCLE_DETECTED,\n};\n\nenum class BinaryRegionCommentType {\n  Unknown = 0,\n  SizePrefix,\n  // The offset to the root table.\n  RootTableOffset,\n  // The optional 4-char file identifier.\n  FileIdentifier,\n  // Generic 0-filled padding\n  Padding,\n  // The size of the vtable.\n  VTableSize,\n  // The size of the referring table.\n  VTableRefferingTableLength,\n  // Offsets to vtable fields.\n  VTableFieldOffset,\n  // Offsets to unknown vtable fields.\n  VTableUnknownFieldOffset,\n  // The vtable offset of a table.\n  TableVTableOffset,\n  // A \"inline\" table field value.\n  TableField,\n  // A table field that is unknown.\n  TableUnknownField,\n  // A table field value that points to another section.\n  TableOffsetField,\n  // A struct field value.\n  StructField,\n  // A array field value.\n  ArrayField,\n  // The length of the string.\n  StringLength,\n  // The string contents.\n  StringValue,\n  // The explicit string terminator.\n  StringTerminator,\n  // The length of the vector (# of items).\n  VectorLength,\n  // A \"inline\" value of a vector.\n  VectorValue,\n  // A vector value that points to another section.\n  VectorTableValue,\n  VectorStringValue,\n  VectorUnionValue,\n};\n\nstruct BinaryRegionComment {\n  BinaryRegionStatus status = BinaryRegionStatus::OK;\n\n  // If status is non OK, this may be filled in with additional details.\n  std::string status_message;\n\n  BinaryRegionCommentType type = BinaryRegionCommentType::Unknown;\n\n  std::string name;\n\n  std::string default_value;\n\n  size_t index = 0;\n};\n\nstruct BinaryRegion {\n  // Offset into the binary where this region begins.\n  uint64_t offset = 0;\n\n  // The length of this region in bytes.\n  uint64_t length = 0;\n\n  // The underlying datatype of this region\n  BinaryRegionType type = BinaryRegionType::Unknown;\n\n  // If `type` is an array/vector, this is the number of those types this region\n  // encompasses.\n  uint64_t array_length = 0;\n\n  // If the is an offset to some other region, this is what it points to. The\n  // offset is relative to overall binary, not to this region.\n  uint64_t points_to_offset = 0;\n\n  // The comment on the region.\n  BinaryRegionComment comment;\n};\n\nenum class BinarySectionType {\n  Unknown = 0,\n  Header = 1,\n  Table = 2,\n  RootTable = 3,\n  VTable = 4,\n  Struct = 5,\n  String = 6,\n  Vector = 7,\n  Union = 8,\n  Padding = 9,\n  Vector64 = 10,\n};\n\n// A section of the binary that is grouped together in some logical manner, and\n// often is pointed too by some other offset BinaryRegion. Sections include\n// `tables`, `vtables`, `strings`, `vectors`, etc..\nstruct BinarySection {\n  // User-specified name of the section, if applicable.\n  std::string name;\n\n  // The type of this section.\n  BinarySectionType type = BinarySectionType::Unknown;\n\n  // The binary regions that make up this section, in order of their offsets.\n  std::vector<BinaryRegion> regions;\n};\n\ninline static BinaryRegionType GetRegionType(reflection::BaseType base_type) {\n  switch (base_type) {\n    case reflection::UType:\n      return BinaryRegionType::UType;\n    case reflection::Bool:\n      return BinaryRegionType::Uint8;\n    case reflection::Byte:\n      return BinaryRegionType::Uint8;\n    case reflection::UByte:\n      return BinaryRegionType::Uint8;\n    case reflection::Short:\n      return BinaryRegionType::Int16;\n    case reflection::UShort:\n      return BinaryRegionType::Uint16;\n    case reflection::Int:\n      return BinaryRegionType::Uint32;\n    case reflection::UInt:\n      return BinaryRegionType::Uint32;\n    case reflection::Long:\n      return BinaryRegionType::Int64;\n    case reflection::ULong:\n      return BinaryRegionType::Uint64;\n    case reflection::Float:\n      return BinaryRegionType::Float;\n    case reflection::Double:\n      return BinaryRegionType::Double;\n    default:\n      return BinaryRegionType::Unknown;\n  }\n}\n\ninline static std::string ToString(const BinaryRegionType type) {\n  switch (type) {\n    case BinaryRegionType::UOffset:\n      return \"UOffset32\";\n    case BinaryRegionType::UOffset64:\n      return \"UOffset64\";\n    case BinaryRegionType::SOffset:\n      return \"SOffset32\";\n    case BinaryRegionType::VOffset:\n      return \"VOffset16\";\n    case BinaryRegionType::Bool:\n      return \"bool\";\n    case BinaryRegionType::Char:\n      return \"char\";\n    case BinaryRegionType::Byte:\n      return \"int8_t\";\n    case BinaryRegionType::Uint8:\n      return \"uint8_t\";\n    case BinaryRegionType::Uint16:\n      return \"uint16_t\";\n    case BinaryRegionType::Uint32:\n      return \"uint32_t\";\n    case BinaryRegionType::Uint64:\n      return \"uint64_t\";\n    case BinaryRegionType::Int8:\n      return \"int8_t\";\n    case BinaryRegionType::Int16:\n      return \"int16_t\";\n    case BinaryRegionType::Int32:\n      return \"int32_t\";\n    case BinaryRegionType::Int64:\n      return \"int64_t\";\n    case BinaryRegionType::Double:\n      return \"double\";\n    case BinaryRegionType::Float:\n      return \"float\";\n    case BinaryRegionType::UType:\n      return \"UType8\";\n    case BinaryRegionType::Unknown:\n      return \"?uint8_t\";\n    default:\n      return \"todo\";\n  }\n}\n\nclass BinaryAnnotator {\n public:\n  explicit BinaryAnnotator(const uint8_t* const bfbs,\n                           const uint64_t bfbs_length,\n                           const uint8_t* const binary,\n                           const uint64_t binary_length,\n                           const bool is_size_prefixed)\n      : bfbs_(bfbs),\n        bfbs_length_(bfbs_length),\n        schema_(reflection::GetSchema(bfbs)),\n        root_table_(\"\"),\n        binary_(binary),\n        binary_length_(binary_length),\n        is_size_prefixed_(is_size_prefixed) {}\n\n  BinaryAnnotator(const reflection::Schema* schema,\n                  const std::string& root_table, const uint8_t* binary,\n                  uint64_t binary_length, bool is_size_prefixed)\n      : bfbs_(nullptr),\n        bfbs_length_(0),\n        schema_(schema),\n        root_table_(root_table),\n        binary_(binary),\n        binary_length_(binary_length),\n        is_size_prefixed_(is_size_prefixed) {}\n\n  std::map<uint64_t, BinarySection> Annotate();\n\n private:\n  struct VTable {\n    struct Entry {\n      const reflection::Field* field = nullptr;\n      uint16_t offset_from_table = 0;\n    };\n\n    const reflection::Object* referring_table = nullptr;\n\n    // Field ID -> {field def, offset from table}\n    std::map<uint16_t, Entry> fields;\n\n    uint16_t vtable_size = 0;\n    uint16_t table_size = 0;\n  };\n\n  uint64_t BuildHeader(uint64_t offset);\n\n  // VTables can be shared across instances or even across objects. This\n  // attempts to get an existing vtable given the offset and table type,\n  // otherwise it will built the vtable, memorize it, and return the built\n  // VTable. Returns nullptr if building the VTable fails.\n  VTable* GetOrBuildVTable(uint64_t offset, const reflection::Object* table,\n                           uint64_t offset_of_referring_table);\n\n  void BuildTable(uint64_t offset, const BinarySectionType type,\n                  const reflection::Object* table);\n\n  uint64_t BuildStruct(uint64_t offset, std::vector<BinaryRegion>& regions,\n                       const std::string referring_field_name,\n                       const reflection::Object* structure);\n\n  void BuildString(uint64_t offset, const reflection::Object* table,\n                   const reflection::Field* field);\n\n  void BuildVector(uint64_t offset, const reflection::Object* table,\n                   const reflection::Field* field, uint64_t parent_table_offset,\n                   const std::map<uint16_t, VTable::Entry> vtable_fields);\n\n  std::string BuildUnion(uint64_t offset, uint8_t realized_type,\n                         const reflection::Field* field);\n\n  void FixMissingRegions();\n  void FixMissingSections();\n\n  inline bool IsValidOffset(const uint64_t offset) const {\n    return offset < binary_length_;\n  }\n\n  // Determines if performing a GetScalar request for `T` at `offset` would read\n  // passed the end of the binary.\n  template <typename T>\n  inline bool IsValidRead(const uint64_t offset) const {\n    return IsValidRead(offset, sizeof(T));\n  }\n\n  inline bool IsValidRead(const uint64_t offset, const uint64_t length) const {\n    return length < binary_length_ && IsValidOffset(offset + length - 1);\n  }\n\n  // Calculate the number of bytes remaining from the given offset. If offset is\n  // > binary_length, 0 is returned.\n  uint64_t RemainingBytes(const uint64_t offset) const {\n    return IsValidOffset(offset) ? binary_length_ - offset : 0;\n  }\n\n  template <typename T>\n  flatbuffers::Optional<T> ReadScalar(const uint64_t offset) const {\n    if (!IsValidRead<T>(offset)) {\n      return flatbuffers::nullopt;\n    }\n\n    return flatbuffers::ReadScalar<T>(binary_ + offset);\n  }\n\n  // Adds the provided `section` keyed by the `offset` it occurs at. If a\n  // section is already added at that offset, it doesn't replace the existing\n  // one.\n  void AddSection(const uint64_t offset, const BinarySection& section) {\n    sections_.insert(std::make_pair(offset, section));\n  }\n\n  bool IsInlineField(const reflection::Field* const field) {\n    if (field->type()->base_type() == reflection::BaseType::Obj) {\n      return schema_->objects()->Get(field->type()->index())->is_struct();\n    }\n    return IsScalar(field->type()->base_type());\n  }\n\n  bool IsUnionType(const reflection::BaseType type) {\n    return (type == reflection::BaseType::UType ||\n            type == reflection::BaseType::Union);\n  }\n\n  bool IsUnionType(const reflection::Field* const field) {\n    return IsUnionType(field->type()->base_type()) &&\n           field->type()->index() >= 0;\n  }\n\n  bool IsValidUnionValue(const reflection::Field* const field,\n                         const uint8_t value) {\n    return IsUnionType(field) &&\n           IsValidUnionValue(field->type()->index(), value);\n  }\n\n  bool IsValidUnionValue(const uint32_t enum_id, const uint8_t value) {\n    if (enum_id >= schema_->enums()->size()) {\n      return false;\n    }\n\n    const reflection::Enum* enum_def = schema_->enums()->Get(enum_id);\n\n    if (enum_def == nullptr) {\n      return false;\n    }\n\n    return value < enum_def->values()->size();\n  }\n\n  uint64_t GetElementSize(const reflection::Field* const field) {\n    if (IsScalar(field->type()->element())) {\n      return GetTypeSize(field->type()->element());\n    }\n\n    switch (field->type()->element()) {\n      case reflection::BaseType::Obj: {\n        auto obj = schema_->objects()->Get(field->type()->index());\n        return obj->is_struct() ? obj->bytesize() : sizeof(uint32_t);\n      }\n      default:\n        return sizeof(uint32_t);\n    }\n  }\n\n  bool ContainsSection(const uint64_t offset);\n\n  const reflection::Object* RootTable() const;\n\n  // The schema for the binary file\n  const uint8_t* bfbs_;\n  const uint64_t bfbs_length_;\n  const reflection::Schema* schema_;\n  const std::string root_table_;\n\n  // The binary data itself.\n  const uint8_t* binary_;\n  const uint64_t binary_length_;\n  const bool is_size_prefixed_;\n\n  // Map of binary offset to vtables, to dedupe vtables.\n  std::map<uint64_t, std::list<VTable>> vtables_;\n\n  // The annotated binary sections, index by their absolute offset.\n  std::map<uint64_t, BinarySection> sections_;\n};\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_BINARY_ANNOTATOR_H_\n"
  },
  {
    "path": "src/code_generators.cpp",
    "content": "/*\n * Copyright 2016 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"flatbuffers/code_generators.h\"\n\n#include <assert.h>\n\n#include <cmath>\n\n#include \"flatbuffers/base.h\"\n#include \"flatbuffers/util.h\"\n\n#if defined(_MSC_VER)\n#pragma warning(push)\n#pragma warning(disable : 4127)  // C4127: conditional expression is constant\n#endif\n\nnamespace flatbuffers {\n\nstd::string JavaCSharpMakeRule(const bool java, const Parser& parser,\n                               const std::string& path,\n                               const std::string& file_name) {\n  const std::string file_extension = java ? \".java\" : \".cs\";\n  std::string make_rule;\n\n  for (auto it = parser.enums_.vec.begin(); it != parser.enums_.vec.end();\n       ++it) {\n    auto& enum_def = **it;\n    if (!make_rule.empty()) make_rule += \" \";\n    std::string directory =\n        BaseGenerator::NamespaceDir(parser, path, *enum_def.defined_namespace);\n    make_rule += directory + enum_def.name + file_extension;\n  }\n\n  for (auto it = parser.structs_.vec.begin(); it != parser.structs_.vec.end();\n       ++it) {\n    auto& struct_def = **it;\n    if (!make_rule.empty()) make_rule += \" \";\n    std::string directory = BaseGenerator::NamespaceDir(\n        parser, path, *struct_def.defined_namespace);\n    make_rule += directory + struct_def.name + file_extension;\n  }\n\n  make_rule += \": \";\n  auto included_files = parser.GetIncludedFilesRecursive(file_name);\n  for (auto it = included_files.begin(); it != included_files.end(); ++it) {\n    make_rule += \" \" + *it;\n  }\n  return make_rule;\n}\n\nvoid CodeWriter::operator+=(std::string text) {\n  if (!ignore_ident_ && !text.empty()) AppendIdent(stream_);\n\n  while (true) {\n    auto begin = text.find(\"{{\");\n    if (begin == std::string::npos) {\n      break;\n    }\n\n    auto end = text.find(\"}}\");\n    if (end == std::string::npos || end < begin) {\n      break;\n    }\n\n    // Write all the text before the first {{ into the stream.\n    stream_.write(text.c_str(), begin);\n\n    // The key is between the {{ and }}.\n    const std::string key = text.substr(begin + 2, end - begin - 2);\n\n    // Find the value associated with the key.  If it exists, write the\n    // value into the stream, otherwise write the key itself into the stream.\n    auto iter = value_map_.find(key);\n    if (iter != value_map_.end()) {\n      const std::string& value = iter->second;\n      stream_ << value;\n    } else {\n      FLATBUFFERS_ASSERT(false && \"could not find key\");\n      stream_ << key;\n    }\n\n    // Update the text to everything after the }}.\n    text = text.substr(end + 2);\n  }\n  if (!text.empty() && text.back() == '\\\\') {\n    text.pop_back();\n    ignore_ident_ = true;\n    stream_ << text;\n  } else {\n    ignore_ident_ = false;\n    stream_ << text << std::endl;\n  }\n}\n\nvoid CodeWriter::AppendIdent(std::stringstream& stream) {\n  int lvl = cur_ident_lvl_;\n  while (lvl--) {\n    stream.write(pad_.c_str(), static_cast<std::streamsize>(pad_.size()));\n  }\n}\n\nconst char* BaseGenerator::FlatBuffersGeneratedWarning() {\n  return \"automatically generated by the FlatBuffers compiler,\"\n         \" do not modify\";\n}\n\nstd::string BaseGenerator::NamespaceDir(const Parser& parser,\n                                        const std::string& path,\n                                        const Namespace& ns,\n                                        const bool dasherize) {\n  EnsureDirExists(path);\n  if (parser.opts.one_file) return path;\n  std::string namespace_dir = path;  // Either empty or ends in separator.\n  auto& namespaces = ns.components;\n  for (auto it = namespaces.begin(); it != namespaces.end(); ++it) {\n    namespace_dir +=\n        !dasherize ? *it : ConvertCase(*it, Case::kDasher, Case::kUpperCamel);\n    namespace_dir += kPathSeparator;\n    EnsureDirExists(namespace_dir);\n  }\n  return namespace_dir;\n}\n\nstd::string BaseGenerator::NamespaceDir(const Namespace& ns,\n                                        const bool dasherize) const {\n  return BaseGenerator::NamespaceDir(parser_, path_, ns, dasherize);\n}\n\nstd::string BaseGenerator::FullNamespace(const char* separator,\n                                         const Namespace& ns) {\n  std::string namespace_name;\n  auto& namespaces = ns.components;\n  for (auto it = namespaces.begin(); it != namespaces.end(); ++it) {\n    if (namespace_name.length()) namespace_name += separator;\n    namespace_name += *it;\n  }\n  return namespace_name;\n}\n\nstd::string BaseGenerator::LastNamespacePart(const Namespace& ns) {\n  if (!ns.components.empty())\n    return ns.components.back();\n  else\n    return std::string(\"\");\n}\n\n// Ensure that a type is prefixed with its namespace.\nstd::string BaseGenerator::WrapInNameSpace(const Namespace* ns,\n                                           const std::string& name) const {\n  std::string qualified_name = qualifying_start_;\n  for (auto it = ns->components.begin(); it != ns->components.end(); ++it)\n    qualified_name += *it + qualifying_separator_;\n  return qualified_name + name;\n}\n\nstd::string BaseGenerator::WrapInNameSpace(const Definition& def,\n                                           const std::string& suffix) const {\n  return WrapInNameSpace(def.defined_namespace, def.name + suffix);\n}\n\nstd::string BaseGenerator::GetNameSpace(const Definition& def) const {\n  const Namespace* ns = def.defined_namespace;\n  if (CurrentNameSpace() == ns) return \"\";\n  std::string qualified_name = qualifying_start_;\n  for (auto it = ns->components.begin(); it != ns->components.end(); ++it) {\n    qualified_name += *it;\n    if ((it + 1) != ns->components.end()) {\n      qualified_name += qualifying_separator_;\n    }\n  }\n\n  return qualified_name;\n}\n\nstd::string BaseGenerator::GeneratedFileName(const std::string& path,\n                                             const std::string& file_name,\n                                             const IDLOptions& options) const {\n  return path + file_name + options.filename_suffix + \".\" +\n         (options.filename_extension.empty() ? default_extension_\n                                             : options.filename_extension);\n}\n\n// Generate a documentation comment, if available.\nvoid GenComment(const std::vector<std::string>& dc, std::string* code_ptr,\n                const CommentConfig* config, const char* prefix) {\n  if (dc.begin() == dc.end()) {\n    // Don't output empty comment blocks with 0 lines of comment content.\n    return;\n  }\n\n  std::string& code = *code_ptr;\n  if (config != nullptr && config->first_line != nullptr) {\n    code += std::string(prefix) + std::string(config->first_line) + \"\\n\";\n  }\n  std::string line_prefix =\n      std::string(prefix) +\n      ((config != nullptr && config->content_line_prefix != nullptr)\n           ? config->content_line_prefix\n           : \"///\");\n  for (auto it = dc.begin(); it != dc.end(); ++it) {\n    code += line_prefix + *it + \"\\n\";\n  }\n  if (config != nullptr && config->last_line != nullptr) {\n    code += std::string(prefix) + std::string(config->last_line) + \"\\n\";\n  }\n}\n\ntemplate <typename T>\nstd::string FloatConstantGenerator::GenFloatConstantImpl(\n    const FieldDef& field) const {\n  const auto& constant = field.value.constant;\n  T v;\n  auto done = StringToNumber(constant.c_str(), &v);\n  FLATBUFFERS_ASSERT(done);\n  if (done) {\n#if (!defined(_MSC_VER) || (_MSC_VER >= 1800))\n    if (std::isnan(v)) return NaN(v);\n    if (std::isinf(v)) return Inf(v);\n#endif\n    return Value(v, constant);\n  }\n  return \"#\";  // compile time error\n}\n\nstd::string FloatConstantGenerator::GenFloatConstant(\n    const FieldDef& field) const {\n  switch (field.value.type.base_type) {\n    case BASE_TYPE_FLOAT:\n      return GenFloatConstantImpl<float>(field);\n    case BASE_TYPE_DOUBLE:\n      return GenFloatConstantImpl<double>(field);\n    default: {\n      FLATBUFFERS_ASSERT(false);\n      return \"INVALID_BASE_TYPE\";\n    }\n  };\n}\n\nTypedFloatConstantGenerator::TypedFloatConstantGenerator(\n    const char* double_prefix, const char* single_prefix,\n    const char* nan_number, const char* pos_inf_number,\n    const char* neg_inf_number)\n    : double_prefix_(double_prefix),\n      single_prefix_(single_prefix),\n      nan_number_(nan_number),\n      pos_inf_number_(pos_inf_number),\n      neg_inf_number_(neg_inf_number) {}\n\nstd::string TypedFloatConstantGenerator::MakeNaN(\n    const std::string& prefix) const {\n  return prefix + nan_number_;\n}\nstd::string TypedFloatConstantGenerator::MakeInf(\n    bool neg, const std::string& prefix) const {\n  if (neg)\n    return !neg_inf_number_.empty() ? (prefix + neg_inf_number_)\n                                    : (\"-\" + prefix + pos_inf_number_);\n  else\n    return prefix + pos_inf_number_;\n}\n\nstd::string TypedFloatConstantGenerator::Value(double v,\n                                               const std::string& src) const {\n  (void)v;\n  return src;\n}\n\nstd::string TypedFloatConstantGenerator::Inf(double v) const {\n  return MakeInf(v < 0, double_prefix_);\n}\n\nstd::string TypedFloatConstantGenerator::NaN(double v) const {\n  (void)v;\n  return MakeNaN(double_prefix_);\n}\n\nstd::string TypedFloatConstantGenerator::Value(float v,\n                                               const std::string& src) const {\n  (void)v;\n  return src + \"f\";\n}\n\nstd::string TypedFloatConstantGenerator::Inf(float v) const {\n  return MakeInf(v < 0, single_prefix_);\n}\n\nstd::string TypedFloatConstantGenerator::NaN(float v) const {\n  (void)v;\n  return MakeNaN(single_prefix_);\n}\n\nSimpleFloatConstantGenerator::SimpleFloatConstantGenerator(\n    const char* nan_number, const char* pos_inf_number,\n    const char* neg_inf_number)\n    : nan_number_(nan_number),\n      pos_inf_number_(pos_inf_number),\n      neg_inf_number_(neg_inf_number) {}\n\nstd::string SimpleFloatConstantGenerator::Value(double v,\n                                                const std::string& src) const {\n  (void)v;\n  return src;\n}\n\nstd::string SimpleFloatConstantGenerator::Inf(double v) const {\n  return (v < 0) ? neg_inf_number_ : pos_inf_number_;\n}\n\nstd::string SimpleFloatConstantGenerator::NaN(double v) const {\n  (void)v;\n  return nan_number_;\n}\n\nstd::string SimpleFloatConstantGenerator::Value(float v,\n                                                const std::string& src) const {\n  return this->Value(static_cast<double>(v), src);\n}\n\nstd::string SimpleFloatConstantGenerator::Inf(float v) const {\n  return this->Inf(static_cast<double>(v));\n}\n\nstd::string SimpleFloatConstantGenerator::NaN(float v) const {\n  return this->NaN(static_cast<double>(v));\n}\n\n}  // namespace flatbuffers\n\n#if defined(_MSC_VER)\n#pragma warning(pop)\n#endif\n"
  },
  {
    "path": "src/file_manager.cpp",
    "content": "/*\n * Copyright 2023 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"flatbuffers/file_manager.h\"\n\n#include <fstream>\n#include <set>\n#include <string>\n\nnamespace flatbuffers {\n\nbool RealFileSaver::SaveFile(const char* name, const char* buf, size_t len,\n                             bool binary) {\n  std::ofstream ofs(name, binary ? std::ofstream::binary : std::ofstream::out);\n  if (!ofs.is_open()) return false;\n  ofs.write(buf, len);\n  return !ofs.bad();\n}\n\n}  // namespace flatbuffers\n"
  },
  {
    "path": "src/file_name_manager.cpp",
    "content": "/*\n * Copyright 2023 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include <iostream>\n#include <tuple>\n\n#include \"flatbuffers/file_manager.h\"\n\nnamespace flatbuffers {\n\nbool FileNameSaver::SaveFile(const char* name, const char* buf, size_t len,\n                             bool binary) {\n  (void)buf;\n  (void)len;\n  (void)binary;\n\n  std::ignore = file_names_.insert(name);\n\n  // we want to simulate always successful save\n  return true;\n}\n\nvoid FileNameSaver::Finish() {\n  for (const auto& file_name : file_names_) {\n    // Just print the file names to standard output.\n    // No actual file is created.\n    std::cout << file_name << \"\\n\";\n  }\n}\n\n}  // namespace flatbuffers\n"
  },
  {
    "path": "src/flatc.cpp",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"flatbuffers/flatc.h\"\n\n#include <algorithm>\n#include <limits>\n#include <list>\n#include <memory>\n#include <sstream>\n#include <string>\n\n#include \"annotated_binary_text_gen.h\"\n#include \"binary_annotator.h\"\n#include \"flatbuffers/code_generator.h\"\n#include \"flatbuffers/idl.h\"\n#include \"flatbuffers/util.h\"\n\nnamespace flatbuffers {\n\nstatic const char* FLATC_VERSION() { return FLATBUFFERS_VERSION(); }\n\nvoid FlatCompiler::ParseFile(\n    flatbuffers::Parser& parser, const std::string& filename,\n    const std::string& contents,\n    const std::vector<const char*>& include_directories) const {\n  auto local_include_directory = flatbuffers::StripFileName(filename);\n\n  std::vector<const char*> inc_directories;\n  inc_directories.insert(inc_directories.end(), include_directories.begin(),\n                         include_directories.end());\n  inc_directories.push_back(local_include_directory.c_str());\n  inc_directories.push_back(nullptr);\n\n  if (!parser.Parse(contents.c_str(), &inc_directories[0], filename.c_str())) {\n    Error(parser.error_, false, false);\n  }\n  if (!parser.error_.empty()) {\n    Warn(parser.error_, false);\n  }\n}\n\nvoid FlatCompiler::LoadBinarySchema(flatbuffers::Parser& parser,\n                                    const std::string& filename,\n                                    const std::string& contents) {\n  if (!parser.Deserialize(reinterpret_cast<const uint8_t*>(contents.c_str()),\n                          contents.size())) {\n    Error(\"failed to load binary schema: \" + filename, false, false);\n  }\n}\n\nvoid FlatCompiler::Warn(const std::string& warn, bool show_exe_name) const {\n  params_.warn_fn(this, warn, show_exe_name);\n}\n\nvoid FlatCompiler::Error(const std::string& err, bool usage,\n                         bool show_exe_name) const {\n  params_.error_fn(this, err, usage, show_exe_name);\n}\n\nconst static FlatCOption flatc_options[] = {\n    {\"o\", \"\", \"PATH\", \"Prefix PATH to all generated files.\"},\n    {\"I\", \"\", \"PATH\", \"Search for includes in the specified path.\"},\n    {\"M\", \"\", \"\", \"Print make rules for generated files.\"},\n    {\"\", \"version\", \"\", \"Print the version number of flatc and exit.\"},\n    {\"h\", \"help\", \"\", \"Prints this help text and exit.\"},\n    {\"\", \"strict-json\", \"\",\n     \"Strict JSON: field names must be / will be quoted, no trailing commas in \"\n     \"tables/vectors.\"},\n    {\"\", \"allow-non-utf8\", \"\",\n     \"Pass non-UTF-8 input through parser and emit nonstandard \\\\x escapes in \"\n     \"JSON. (Default is to raise parse error on non-UTF-8 input.)\"},\n    {\"\", \"natural-utf8\", \"\",\n     \"Output strings with UTF-8 as human-readable strings. By default, UTF-8 \"\n     \"characters are printed as \\\\uXXXX escapes.\"},\n    {\"\", \"defaults-json\", \"\",\n     \"Output fields whose value is the default when writing JSON\"},\n    {\"\", \"unknown-json\", \"\",\n     \"Allow fields in JSON that are not defined in the schema. These fields \"\n     \"will be discarded when generating binaries.\"},\n    {\"\", \"no-prefix\", \"\",\n     \"Don't prefix enum values with the enum type in C++.\"},\n    {\"\", \"scoped-enums\", \"\",\n     \"Use C++11 style scoped and strongly typed enums. Also implies \"\n     \"--no-prefix.\"},\n    {\"\", \"no-emit-min-max-enum-values\", \"\",\n     \"Disable generation of MIN and MAX enumerated values for scoped enums \"\n     \"and prefixed enums.\"},\n    {\"\", \"swift-implementation-only\", \"\",\n     \"Adds a @_implementationOnly to swift imports\"},\n    {\"\", \"gen-includes\", \"\",\n     \"(deprecated), this is the default behavior. If the original behavior is \"\n     \"required (no include statements) use --no-includes.\"},\n    {\"\", \"no-includes\", \"\",\n     \"Don't generate include statements for included schemas the generated \"\n     \"file depends on (C++, Python, Proto-to-Fbs).\"},\n    {\"\", \"gen-mutable\", \"\",\n     \"Generate accessors that can mutate buffers in-place.\"},\n    {\"\", \"gen-onefile\", \"\",\n     \"Generate a single output file for C#, Go, Java, Kotlin and Python. \"\n     \"Implies --no-include.\"},\n    {\"\", \"gen-name-strings\", \"\",\n     \"Generate type name functions for C++ and Rust.\"},\n    {\"\", \"gen-object-api\", \"\", \"Generate an additional object-based API.\"},\n    {\"\", \"gen-compare\", \"\", \"Generate operator== for object-based API types.\"},\n    {\"\", \"gen-nullable\", \"\",\n     \"Add Clang _Nullable for C++ pointer. or @Nullable for Java\"},\n    {\"\", \"java-package-prefix\", \"\",\n     \"Add a prefix to the generated package name for Java.\"},\n    {\"\", \"java-checkerframework\", \"\", \"Add @Pure for Java.\"},\n    {\"\", \"gen-generated\", \"\", \"Add @Generated annotation for Java.\"},\n    {\"\", \"gen-jvmstatic\", \"\",\n     \"Add @JvmStatic annotation for Kotlin methods in companion object for \"\n     \"interop from Java to Kotlin.\"},\n    {\"\", \"gen-all\", \"\",\n     \"Generate not just code for the current schema files, but for all files \"\n     \"it \"\n     \"includes as well. If the language uses a single file for output (by \"\n     \"default the case for C++ and JS), all code will end up in this one \"\n     \"file.\"},\n    {\"\", \"gen-json-emit\", \"\",\n     \"Generates encoding code which emits Flatbuffers into JSON\"},\n    {\"\", \"cpp-include\", \"\", \"Adds an #include in generated file.\"},\n    {\"\", \"cpp-ptr-type\", \"T\",\n     \"Set object API pointer type (default std::unique_ptr).\"},\n    {\"\", \"cpp-str-type\", \"T\",\n     \"Set object API string type (default std::string). T::c_str(), \"\n     \"T::length() \"\n     \"and T::empty() must be supported. The custom type also needs to be \"\n     \"constructible from std::string (see the --cpp-str-flex-ctor option to \"\n     \"change this behavior)\"},\n    {\"\", \"cpp-str-flex-ctor\", \"\",\n     \"Don't construct custom string types by passing std::string from \"\n     \"Flatbuffers, but (char* + length).\"},\n    {\"\", \"cpp-field-case-style\", \"STYLE\",\n     \"Generate C++ fields using selected case style. Supported STYLE values: * \"\n     \"'unchanged' - leave unchanged (default) * 'upper' - schema snake_case \"\n     \"emits UpperCamel; * 'lower' - schema snake_case emits lowerCamel.\"},\n    {\"\", \"cpp-std\", \"CPP_STD\",\n     \"Generate a C++ code using features of selected C++ standard. Supported \"\n     \"CPP_STD values: * 'c++0x' - generate code compatible with old compilers; \"\n     \"'c++11' - use C++11 code generator (default); * 'c++17' - use C++17 \"\n     \"features in generated code (experimental).\"},\n    {\"\", \"cpp-static-reflection\", \"\",\n     \"When using C++17, generate extra code to provide compile-time (static) \"\n     \"reflection of Flatbuffers types. Requires --cpp-std to be \\\"c++17\\\" or \"\n     \"higher.\"},\n    {\"\", \"object-prefix\", \"PREFIX\",\n     \"Customize class prefix for C++ object-based API.\"},\n    {\"\", \"object-suffix\", \"SUFFIX\",\n     \"Customize class suffix for C++ object-based API. Default Value is \"\n     \"\\\"T\\\".\"},\n    {\"\", \"go-namespace\", \"\", \"Generate the overriding namespace in Golang.\"},\n    {\"\", \"go-import\", \"IMPORT\",\n     \"Generate the overriding import for flatbuffers in Golang (default is \"\n     \"\\\"github.com/google/flatbuffers/go\\\").\"},\n    {\"\", \"go-module-name\", \"\",\n     \"Prefix local import paths of generated go code with the module name\"},\n    {\"\", \"raw-binary\", \"\",\n     \"Allow binaries without file_identifier to be read. This may crash flatc \"\n     \"given a mismatched schema.\"},\n    {\"\", \"size-prefixed\", \"\", \"Input binaries are size prefixed buffers.\"},\n    {\"\", \"proto-namespace-suffix\", \"SUFFIX\",\n     \"Add this namespace to any flatbuffers generated from protobufs.\"},\n    {\"\", \"oneof-union\", \"\", \"Translate .proto oneofs to flatbuffer unions.\"},\n    {\"\", \"keep-proto-id\", \"\", \"Keep protobuf field ids in generated fbs file.\"},\n    {\"\", \"proto-id-gap\", \"\",\n     \"Action that should be taken when a gap between protobuf ids found. \"\n     \"Supported values: * \"\n     \"'nop' - do not care about gap * 'warn' - A warning message will be shown \"\n     \"about the gap in protobuf ids\"\n     \"(default) \"\n     \"* 'error' - An error message will be shown and the fbs generation will \"\n     \"be \"\n     \"interrupted.\"},\n    {\"\", \"grpc\", \"\", \"Generate GRPC interfaces for the specified languages.\"},\n    {\"\", \"schema\", \"\", \"Serialize schemas instead of JSON (use with -b).\"},\n    {\"\", \"bfbs-filenames\", \"PATH\",\n     \"Sets the root path where reflection filenames in reflection.fbs are \"\n     \"relative to. The 'root' is denoted with  `//`. E.g. if PATH=/a/b/c \"\n     \"then /a/d/e.fbs will be serialized as //../d/e.fbs. (PATH defaults to \"\n     \"the \"\n     \"directory of the first provided schema file.\"},\n    {\"\", \"bfbs-absolute-paths\", \"\",\n     \"Uses absolute paths instead of relative paths in the BFBS output.\"},\n    {\"\", \"bfbs-comments\", \"\", \"Add doc comments to the binary schema files.\"},\n    {\"\", \"bfbs-builtins\", \"\",\n     \"Add builtin attributes to the binary schema files.\"},\n    {\"\", \"bfbs-gen-embed\", \"\",\n     \"Generate code to embed the bfbs schema to the source.\"},\n    {\"\", \"conform\", \"FILE\",\n     \"Specify a schema the following schemas should be an evolution of. Gives \"\n     \"errors if not.\"},\n    {\"\", \"conform-includes\", \"PATH\",\n     \"Include path for the schema given with --conform PATH\"},\n    {\"\", \"filename-suffix\", \"SUFFIX\",\n     \"The suffix appended to the generated file names (Default is \"\n     \"'_generated').\"},\n    {\"\", \"filename-ext\", \"EXT\",\n     \"The extension appended to the generated file names. Default is \"\n     \"language-specific (e.g., '.h' for C++)\"},\n    {\"\", \"include-prefix\", \"PATH\",\n     \"Prefix this PATH to any generated include statements.\"},\n    {\"\", \"keep-prefix\", \"\",\n     \"Keep original prefix of schema include statement.\"},\n    {\"\", \"reflect-types\", \"\",\n     \"Add minimal type reflection to code generation.\"},\n    {\"\", \"reflect-names\", \"\", \"Add minimal type/name reflection.\"},\n    {\"\", \"rust-serialize\", \"\",\n     \"Implement serde::Serialize on generated Rust types.\"},\n    {\"\", \"rust-module-root-file\", \"\",\n     \"Generate rust code in individual files with a module root file.\"},\n    {\"\", \"root-type\", \"T\", \"Select or override the default root_type.\"},\n    {\"\", \"require-explicit-ids\", \"\",\n     \"When parsing schemas, require explicit ids (id: x).\"},\n    {\"\", \"force-defaults\", \"\",\n     \"Emit default values in binary output from JSON\"},\n    {\"\", \"force-empty\", \"\",\n     \"When serializing from object API representation, force strings and \"\n     \"vectors to empty rather than null.\"},\n    {\"\", \"force-empty-vectors\", \"\",\n     \"When serializing from object API representation, force vectors to empty \"\n     \"rather than null.\"},\n    {\"\", \"flexbuffers\", \"\",\n     \"Used with \\\"binary\\\" and \\\"json\\\" options, it generates data using \"\n     \"schema-less FlexBuffers.\"},\n    {\"\", \"no-warnings\", \"\", \"Inhibit all warnings messages.\"},\n    {\"\", \"warnings-as-errors\", \"\", \"Treat all warnings as errors.\"},\n    {\"\", \"cs-global-alias\", \"\",\n     \"Prepend \\\"global::\\\" to all user generated csharp classes and \"\n     \"structs.\"},\n    {\"\", \"cs-gen-json-serializer\", \"\",\n     \"Allows (de)serialization of JSON text in the Object API. (requires \"\n     \"--gen-object-api).\"},\n    {\"\", \"json-nested-bytes\", \"\",\n     \"Allow a nested_flatbuffer field to be parsed as a vector of bytes \"\n     \"in JSON, which is unsafe unless checked by a verifier afterwards.\"},\n    {\"\", \"ts-flat-files\", \"\", \"(deprecated) Alias for --gen-all.\"},\n    {\"\", \"ts-entry-points\", \"\", \"(deprecated) Alias for --gen-all.\"},\n    {\"\", \"annotate-sparse-vectors\", \"\", \"Don't annotate every vector element.\"},\n    {\"\", \"annotate\", \"SCHEMA\",\n     \"Annotate the provided BINARY_FILE with the specified SCHEMA file.\"},\n    {\"\", \"no-leak-private-annotation\", \"\",\n     \"Prevents multiple type of annotations within a Fbs SCHEMA file. \"\n     \"Currently this is required to generate private types in Rust\"},\n    {\"\", \"python-no-type-prefix-suffix\", \"\",\n     \"Skip emission of Python functions that are prefixed with typenames\"},\n    {\"\", \"python-typing\", \"\", \"Generate Python type annotations\"},\n    {\"\", \"python-version\", \"\", \"Generate code for the given Python version.\"},\n    {\"\", \"python-decode-obj-api-strings\", \"\",\n     \"Decode bytes to strings for the Python Object API\"},\n    {\"\", \"python-gen-numpy\", \"\", \"Whether to generate numpy helpers.\"},\n    {\"\", \"ts-omit-entrypoint\", \"\",\n     \"Omit emission of namespace entrypoint file\"},\n    {\"\", \"ts-undefined-for-optionals\", \"\",\n     \"Whether to generate undefined values instead of null values for missing \"\n     \"optional keys\"},\n    {\"\", \"file-names-only\", \"\",\n     \"Print out generated file names without writing to the files\"},\n    {\"\", \"grpc-filename-suffix\", \"SUFFIX\",\n     \"The suffix for the generated file names (Default is '.fb').\"},\n    {\"\", \"grpc-additional-header\", \"\",\n     \"Additional headers to prepend to the generated files.\"},\n    {\"\", \"grpc-use-system-headers\", \"\",\n     \"Use <> for headers included from the generated code.\"},\n    {\"\", \"grpc-search-path\", \"PATH\", \"Prefix to any gRPC includes.\"},\n    {\"\", \"grpc-python-typed-handlers\", \"\",\n     \"The handlers will use the generated classes rather than raw bytes.\"},\n    {\"\", \"grpc-callback-api\", \"\",\n     \"Generate gRPC code using the callback (reactor) API instead of legacy \"\n     \"sync/async.\"},\n};\n\nauto cmp = [](FlatCOption a, FlatCOption b) { return a.long_opt < b.long_opt; };\nstatic std::set<FlatCOption, decltype(cmp)> language_options(cmp);\n\nstatic void AppendTextWrappedString(std::stringstream& ss, std::string& text,\n                                    size_t max_col, size_t start_col) {\n  size_t max_line_length = max_col - start_col;\n\n  if (text.length() > max_line_length) {\n    size_t ideal_break_location = text.rfind(' ', max_line_length);\n    size_t length = std::min(max_line_length, ideal_break_location);\n    ss << text.substr(0, length) << \"\\n\";\n    ss << std::string(start_col, ' ');\n    std::string rest_of_description = text.substr(\n        ((ideal_break_location < max_line_length || text.at(length) == ' ')\n             ? length + 1\n             : length));\n    AppendTextWrappedString(ss, rest_of_description, max_col, start_col);\n  } else {\n    ss << text;\n  }\n}\n\nstatic void AppendOption(std::stringstream& ss, const FlatCOption& option,\n                         size_t max_col, size_t min_col_for_description) {\n  size_t chars = 2;\n  ss << \"  \";\n  if (!option.short_opt.empty()) {\n    chars += 2 + option.short_opt.length();\n    ss << \"-\" << option.short_opt;\n    if (!option.long_opt.empty()) {\n      chars++;\n      ss << \",\";\n    }\n    ss << \" \";\n  }\n  if (!option.long_opt.empty()) {\n    chars += 3 + option.long_opt.length();\n    ss << \"--\" << option.long_opt << \" \";\n  }\n  if (!option.parameter.empty()) {\n    chars += 1 + option.parameter.length();\n    ss << option.parameter << \" \";\n  }\n  size_t start_of_description = chars;\n  if (start_of_description > min_col_for_description) {\n    ss << \"\\n\";\n    start_of_description = min_col_for_description;\n    ss << std::string(start_of_description, ' ');\n  } else {\n    while (start_of_description < min_col_for_description) {\n      ss << \" \";\n      start_of_description++;\n    }\n  }\n  if (!option.description.empty()) {\n    std::string description = option.description;\n    AppendTextWrappedString(ss, description, max_col, start_of_description);\n  }\n  ss << \"\\n\";\n}\n\nstatic void AppendShortOption(std::stringstream& ss,\n                              const FlatCOption& option) {\n  if (!option.short_opt.empty()) {\n    ss << \"-\" << option.short_opt;\n    if (!option.long_opt.empty()) {\n      ss << \"|\";\n    }\n  }\n  if (!option.long_opt.empty()) {\n    ss << \"--\" << option.long_opt;\n  }\n}\n\nstd::string FlatCompiler::GetShortUsageString(\n    const std::string& program_name) const {\n  std::stringstream ss;\n  ss << \"Usage: \" << program_name << \" [\";\n\n  for (const FlatCOption& option : language_options) {\n    AppendShortOption(ss, option);\n    ss << \", \";\n  }\n\n  for (const FlatCOption& option : flatc_options) {\n    AppendShortOption(ss, option);\n    ss << \", \";\n  }\n\n  ss.seekp(-2, ss.cur);\n  ss << \"]... FILE... [-- BINARY_FILE...]\";\n  std::string help = ss.str();\n  std::stringstream ss_textwrap;\n  AppendTextWrappedString(ss_textwrap, help, 80, 0);\n  return ss_textwrap.str();\n}\n\nstd::string FlatCompiler::GetUsageString(\n    const std::string& program_name) const {\n  std::stringstream ss;\n  ss << \"Usage: \" << program_name\n     << \" [OPTION]... FILE... [-- BINARY_FILE...]\\n\";\n\n  for (const FlatCOption& option : language_options) {\n    AppendOption(ss, option, 80, 25);\n  }\n  ss << \"\\n\";\n\n  for (const FlatCOption& option : flatc_options) {\n    AppendOption(ss, option, 80, 25);\n  }\n  ss << \"\\n\";\n\n  std::string files_description =\n      \"FILEs may be schemas (must end in .fbs), binary schemas (must end in \"\n      \".bfbs) or JSON files (conforming to preceding schema). BINARY_FILEs \"\n      \"after the -- must be binary flatbuffer format files. Output files are \"\n      \"named using the base file name of the input, and written to the current \"\n      \"directory or the path given by -o. example: \" +\n      program_name + \" -c -b schema1.fbs schema2.fbs data.json\";\n  AppendTextWrappedString(ss, files_description, 80, 0);\n  ss << \"\\n\";\n  return ss.str();\n}\n\nvoid FlatCompiler::AnnotateBinaries(const uint8_t* binary_schema,\n                                    const uint64_t binary_schema_size,\n                                    const FlatCOptions& options) {\n  const std::string& schema_filename = options.annotate_schema;\n\n  for (const std::string& filename : options.filenames) {\n    std::string binary_contents;\n    if (!flatbuffers::LoadFile(filename.c_str(), true, &binary_contents)) {\n      Warn(\"unable to load binary file: \" + filename);\n      continue;\n    }\n\n    const uint8_t* binary =\n        reinterpret_cast<const uint8_t*>(binary_contents.c_str());\n    const size_t binary_size = binary_contents.size();\n    const bool is_size_prefixed = options.opts.size_prefixed;\n\n    flatbuffers::BinaryAnnotator binary_annotator(\n        binary_schema, binary_schema_size, binary, binary_size,\n        is_size_prefixed);\n\n    auto annotations = binary_annotator.Annotate();\n\n    flatbuffers::AnnotatedBinaryTextGenerator::Options text_gen_opts;\n    text_gen_opts.include_vector_contents =\n        options.annotate_include_vector_contents;\n\n    // TODO(dbaileychess): Right now we just support a single text-based\n    // output of the annotated binary schema, which we generate here. We\n    // could output the raw annotations instead and have third-party tools\n    // use them to generate their own output.\n    flatbuffers::AnnotatedBinaryTextGenerator text_generator(\n        text_gen_opts, annotations, binary, binary_size);\n\n    text_generator.Generate(filename, schema_filename);\n  }\n}\n\nFlatCOptions FlatCompiler::ParseFromCommandLineArguments(int argc,\n                                                         const char** argv) {\n  if (argc <= 1) {\n    Error(\"Need to provide at least one argument.\");\n  }\n\n  FlatCOptions options;\n\n  options.program_name = std::string(argv[0]);\n\n  IDLOptions& opts = options.opts;\n\n  for (int argi = 1; argi < argc; argi++) {\n    std::string arg = argv[argi];\n    if (arg[0] == '-') {\n      if (options.filenames.size() && arg[1] != '-')\n        Error(\"invalid option location: \" + arg, true);\n      if (arg == \"-o\") {\n        if (++argi >= argc) Error(\"missing path following: \" + arg, true);\n        options.output_path = flatbuffers::ConCatPathFileName(\n            flatbuffers::PosixPath(argv[argi]), \"\");\n      } else if (arg == \"-I\") {\n        if (++argi >= argc) Error(\"missing path following: \" + arg, true);\n        options.include_directories_storage.push_back(\n            flatbuffers::PosixPath(argv[argi]));\n        options.include_directories.push_back(\n            options.include_directories_storage.back().c_str());\n      } else if (arg == \"--bfbs-filenames\") {\n        if (++argi > argc) Error(\"missing path following: \" + arg, true);\n        opts.project_root = argv[argi];\n        if (!DirExists(opts.project_root.c_str()))\n          Error(arg + \" is not a directory: \" + opts.project_root);\n      } else if (arg == \"--conform\") {\n        if (++argi >= argc) Error(\"missing path following: \" + arg, true);\n        options.conform_to_schema = flatbuffers::PosixPath(argv[argi]);\n      } else if (arg == \"--conform-includes\") {\n        if (++argi >= argc) Error(\"missing path following: \" + arg, true);\n        options.include_directories_storage.push_back(\n            flatbuffers::PosixPath(argv[argi]));\n        options.conform_include_directories.push_back(\n            options.include_directories_storage.back().c_str());\n      } else if (arg == \"--include-prefix\") {\n        if (++argi >= argc) Error(\"missing path following: \" + arg, true);\n        opts.include_prefix = flatbuffers::ConCatPathFileName(\n            flatbuffers::PosixPath(argv[argi]), \"\");\n      } else if (arg == \"--keep-prefix\") {\n        opts.keep_prefix = true;\n      } else if (arg == \"--strict-json\") {\n        opts.strict_json = true;\n      } else if (arg == \"--allow-non-utf8\") {\n        opts.allow_non_utf8 = true;\n      } else if (arg == \"--natural-utf8\") {\n        opts.natural_utf8 = true;\n      } else if (arg == \"--go-namespace\") {\n        if (++argi >= argc) Error(\"missing golang namespace\" + arg, true);\n        opts.go_namespace = argv[argi];\n      } else if (arg == \"--go-import\") {\n        if (++argi >= argc) Error(\"missing golang import\" + arg, true);\n        opts.go_import = argv[argi];\n      } else if (arg == \"--go-module-name\") {\n        if (++argi >= argc) Error(\"missing golang module name\" + arg, true);\n        opts.go_module_name = argv[argi];\n      } else if (arg == \"--defaults-json\") {\n        opts.output_default_scalars_in_json = true;\n      } else if (arg == \"--unknown-json\") {\n        opts.skip_unexpected_fields_in_json = true;\n      } else if (arg == \"--no-prefix\") {\n        opts.prefixed_enums = false;\n      } else if (arg == \"--cpp-minify-enums\") {\n        opts.cpp_minify_enums = true;\n      } else if (arg == \"--scoped-enums\") {\n        opts.prefixed_enums = false;\n        opts.scoped_enums = true;\n      } else if (arg == \"--no-emit-min-max-enum-values\") {\n        opts.emit_min_max_enum_values = false;\n      } else if (arg == \"--no-union-value-namespacing\") {\n        opts.union_value_namespacing = false;\n      } else if (arg == \"--gen-mutable\") {\n        opts.mutable_buffer = true;\n      } else if (arg == \"--gen-name-strings\") {\n        opts.generate_name_strings = true;\n      } else if (arg == \"--gen-object-api\") {\n        opts.generate_object_based_api = true;\n      } else if (arg == \"--gen-compare\") {\n        opts.gen_compare = true;\n      } else if (arg == \"--gen-absl-hash\") {\n        opts.gen_absl_hash = true;\n      } else if (arg == \"--cpp-include\") {\n        if (++argi >= argc) Error(\"missing include following: \" + arg, true);\n        opts.cpp_includes.push_back(argv[argi]);\n      } else if (arg == \"--cpp-ptr-type\") {\n        if (++argi >= argc) Error(\"missing type following: \" + arg, true);\n        opts.cpp_object_api_pointer_type = argv[argi];\n      } else if (arg == \"--cpp-str-type\") {\n        if (++argi >= argc) Error(\"missing type following: \" + arg, true);\n        opts.cpp_object_api_string_type = argv[argi];\n      } else if (arg == \"--cpp-str-flex-ctor\") {\n        opts.cpp_object_api_string_flexible_constructor = true;\n      } else if (arg == \"--no-cpp-direct-copy\") {\n        opts.cpp_direct_copy = false;\n      } else if (arg == \"--cpp-field-case-style\") {\n        if (++argi >= argc) Error(\"missing case style following: \" + arg, true);\n        if (!strcmp(argv[argi], \"unchanged\"))\n          opts.cpp_object_api_field_case_style =\n              IDLOptions::CaseStyle_Unchanged;\n        else if (!strcmp(argv[argi], \"upper\"))\n          opts.cpp_object_api_field_case_style = IDLOptions::CaseStyle_Upper;\n        else if (!strcmp(argv[argi], \"lower\"))\n          opts.cpp_object_api_field_case_style = IDLOptions::CaseStyle_Lower;\n        else\n          Error(\"unknown case style: \" + std::string(argv[argi]), true);\n      } else if (arg == \"--gen-nullable\") {\n        opts.gen_nullable = true;\n      } else if (arg == \"--java-package-prefix\") {\n        if (++argi >= argc) Error(\"missing prefix following: \" + arg, true);\n        opts.java_package_prefix = argv[argi];\n      } else if (arg == \"--java-checkerframework\") {\n        opts.java_checkerframework = true;\n      } else if (arg == \"--gen-generated\") {\n        opts.gen_generated = true;\n      } else if (arg == \"--swift-implementation-only\") {\n        opts.swift_implementation_only = true;\n      } else if (arg == \"--gen-json-emit\") {\n        opts.gen_json_coders = true;\n      } else if (arg == \"--object-prefix\") {\n        if (++argi >= argc) Error(\"missing prefix following: \" + arg, true);\n        opts.object_prefix = argv[argi];\n      } else if (arg == \"--object-suffix\") {\n        if (++argi >= argc) Error(\"missing suffix following: \" + arg, true);\n        opts.object_suffix = argv[argi];\n      } else if (arg == \"--gen-all\") {\n        opts.generate_all = true;\n        opts.include_dependence_headers = false;\n      } else if (arg == \"--gen-includes\") {\n        // Deprecated, remove this option some time in the future.\n        Warn(\"warning: --gen-includes is deprecated (it is now default)\\n\");\n      } else if (arg == \"--no-includes\") {\n        opts.include_dependence_headers = false;\n      } else if (arg == \"--gen-onefile\") {\n        opts.one_file = true;\n        opts.include_dependence_headers = false;\n      } else if (arg == \"--raw-binary\") {\n        options.raw_binary = true;\n      } else if (arg == \"--size-prefixed\") {\n        opts.size_prefixed = true;\n      } else if (arg == \"--\") {  // Separator between text and binary inputs.\n        options.binary_files_from = options.filenames.size();\n      } else if (arg == \"--proto-namespace-suffix\") {\n        if (++argi >= argc) Error(\"missing namespace suffix\" + arg, true);\n        opts.proto_namespace_suffix = argv[argi];\n      } else if (arg == \"--oneof-union\") {\n        opts.proto_oneof_union = true;\n      } else if (arg == \"--keep-proto-id\") {\n        opts.keep_proto_id = true;\n      } else if (arg == \"--proto-id-gap\") {\n        if (++argi >= argc) Error(\"missing case style following: \" + arg, true);\n        if (!strcmp(argv[argi], \"nop\"))\n          opts.proto_id_gap_action = IDLOptions::ProtoIdGapAction::NO_OP;\n        else if (!strcmp(argv[argi], \"warn\"))\n          opts.proto_id_gap_action = IDLOptions::ProtoIdGapAction::WARNING;\n        else if (!strcmp(argv[argi], \"error\"))\n          opts.proto_id_gap_action = IDLOptions::ProtoIdGapAction::ERROR;\n        else\n          Error(\"unknown case style: \" + std::string(argv[argi]), true);\n      } else if (arg == \"--schema\") {\n        options.schema_binary = true;\n      } else if (arg == \"-M\") {\n        options.print_make_rules = true;\n      } else if (arg == \"--version\") {\n        printf(\"flatc version %s\\n\", FLATC_VERSION());\n        exit(0);\n      } else if (arg == \"--help\" || arg == \"-h\") {\n        printf(\"%s\\n\", GetUsageString(options.program_name).c_str());\n        exit(0);\n      } else if (arg == \"--grpc\") {\n        options.grpc_enabled = true;\n      } else if (arg == \"--bfbs-comments\") {\n        opts.binary_schema_comments = true;\n      } else if (arg == \"--bfbs-builtins\") {\n        opts.binary_schema_builtins = true;\n      } else if (arg == \"--bfbs-gen-embed\") {\n        opts.binary_schema_gen_embed = true;\n      } else if (arg == \"--bfbs-absolute-paths\") {\n        opts.binary_schema_absolute_paths = true;\n      } else if (arg == \"--reflect-types\") {\n        opts.mini_reflect = IDLOptions::kTypes;\n      } else if (arg == \"--reflect-names\") {\n        opts.mini_reflect = IDLOptions::kTypesAndNames;\n      } else if (arg == \"--rust-serialize\") {\n        opts.rust_serialize = true;\n      } else if (arg == \"--rust-module-root-file\") {\n        opts.rust_module_root_file = true;\n      } else if (arg == \"--require-explicit-ids\") {\n        opts.require_explicit_ids = true;\n      } else if (arg == \"--root-type\") {\n        if (++argi >= argc) Error(\"missing type following: \" + arg, true);\n        opts.root_type = argv[argi];\n      } else if (arg == \"--filename-suffix\") {\n        if (++argi >= argc) Error(\"missing filename suffix: \" + arg, true);\n        opts.filename_suffix = argv[argi];\n      } else if (arg == \"--filename-ext\") {\n        if (++argi >= argc) Error(\"missing filename extension: \" + arg, true);\n        opts.filename_extension = argv[argi];\n      } else if (arg == \"--force-defaults\") {\n        opts.force_defaults = true;\n      } else if (arg == \"--force-empty\") {\n        opts.set_empty_strings_to_null = false;\n        opts.set_empty_vectors_to_null = false;\n      } else if (arg == \"--force-empty-vectors\") {\n        opts.set_empty_vectors_to_null = false;\n      } else if (arg == \"--java-primitive-has-method\") {\n        opts.java_primitive_has_method = true;\n      } else if (arg == \"--cs-gen-json-serializer\") {\n        opts.cs_gen_json_serializer = true;\n      } else if (arg == \"--flexbuffers\") {\n        opts.use_flexbuffers = true;\n      } else if (arg == \"--gen-jvmstatic\") {\n        opts.gen_jvmstatic = true;\n      } else if (arg == \"--no-warnings\") {\n        opts.no_warnings = true;\n      } else if (arg == \"--warnings-as-errors\") {\n        opts.warnings_as_errors = true;\n      } else if (arg == \"--cpp-std\") {\n        if (++argi >= argc)\n          Error(\"missing C++ standard specification\" + arg, true);\n        opts.cpp_std = argv[argi];\n      } else if (arg.rfind(\"--cpp-std=\", 0) == 0) {\n        opts.cpp_std = arg.substr(std::string(\"--cpp-std=\").size());\n      } else if (arg == \"--cpp-static-reflection\") {\n        opts.cpp_static_reflection = true;\n      } else if (arg == \"--cs-global-alias\") {\n        opts.cs_global_alias = true;\n      } else if (arg == \"--json-nested-bytes\") {\n        opts.json_nested_legacy_flatbuffers = true;\n      } else if (arg == \"--ts-flat-files\") {\n        // deprecated -- just enables generate_all\n        Warn(\"--ts-flat-files is deprecated; use --gen-all instead.\\n\");\n        opts.generate_all = true;\n      } else if (arg == \"--ts-entry-points\") {\n        // deprecated -- just enables generate_all\n        Warn(\"--ts-entry-points is deprecated; use --gen-all instead.\\n\");\n        opts.generate_all = true;\n      } else if (arg == \"--ts-no-import-ext\") {\n        opts.ts_no_import_ext = true;\n      } else if (arg == \"--no-leak-private-annotation\") {\n        opts.no_leak_private_annotations = true;\n      } else if (arg == \"--python-no-type-prefix-suffix\") {\n        opts.python_no_type_prefix_suffix = true;\n      } else if (arg == \"--python-typing\") {\n        opts.python_typing = true;\n      } else if (arg.rfind(\"--python-version=\", 0) == 0) {\n        opts.python_version =\n            arg.substr(std::string(\"--python-version=\").size());\n      } else if (arg == \"--python-version\") {\n        if (++argi >= argc) Error(\"missing value following: \" + arg, true);\n        opts.python_version = argv[argi];\n      } else if (arg == \"--python-decode-obj-api-strings\") {\n        opts.python_decode_obj_api_strings = true;\n      } else if (arg == \"--python-gen-numpy\" ||\n                 arg == \"--python-gen-numpy=true\") {\n        opts.python_gen_numpy = true;\n      } else if (arg == \"--no-python-gen-numpy\" ||\n                 arg == \"--python-gen-numpy=false\") {\n        opts.python_gen_numpy = false;\n      } else if (arg == \"--ts-omit-entrypoint\") {\n        opts.ts_omit_entrypoint = true;\n      } else if (arg == \"--ts-undefined-for-optionals\") {\n        opts.ts_undefined_for_optionals = true;\n      } else if (arg == \"--annotate-sparse-vectors\") {\n        options.annotate_include_vector_contents = false;\n      } else if (arg == \"--annotate\") {\n        if (++argi >= argc) Error(\"missing path following: \" + arg, true);\n        options.annotate_schema = flatbuffers::PosixPath(argv[argi]);\n      } else if (arg == \"--file-names-only\") {\n        options.file_names_only = true;\n      } else if (arg == \"--grpc-filename-suffix\") {\n        if (++argi >= argc) Error(\"missing gRPC filename suffix: \" + arg, true);\n        opts.grpc_filename_suffix = argv[argi];\n      } else if (arg.rfind(\"--grpc-filename-suffix=\", 0) == 0) {\n        opts.grpc_filename_suffix =\n            arg.substr(std::string(\"--grpc-filename-suffix=\").size());\n      } else if (arg == \"--grpc-additional-header\") {\n        if (++argi >= argc) Error(\"missing include following: \" + arg, true);\n        opts.grpc_additional_headers.push_back(argv[argi]);\n      } else if (arg.rfind(\"--grpc-additional-header=\", 0) == 0) {\n        opts.grpc_additional_headers.push_back(\n            arg.substr(std::string(\"--grpc-additional-header=\").size()));\n      } else if (arg == \"--grpc-search-path\") {\n        if (++argi >= argc) Error(\"missing gRPC search path: \" + arg, true);\n        opts.grpc_search_path = argv[argi];\n      } else if (arg.rfind(\"--grpc-search-path=\", 0) == 0) {\n        opts.grpc_search_path =\n            arg.substr(std::string(\"--grpc-search-path=\").size());\n      } else if (arg == \"--grpc-use-system-headers\" ||\n                 arg == \"--grpc-use-system-headers=true\") {\n        opts.grpc_use_system_headers = true;\n      } else if (arg == \"--no-grpc-use-system-headers\" ||\n                 arg == \"--grpc-use-system-headers=false\") {\n        opts.grpc_use_system_headers = false;\n      } else if (arg == \"--grpc-python-typed-handlers\" ||\n                 arg == \"--grpc-python-typed-handlers=true\") {\n        opts.grpc_python_typed_handlers = true;\n      } else if (arg == \"--no-grpc-python-typed-handlers\" ||\n                 arg == \"--grpc-python-typed-handlers=false\") {\n        opts.grpc_python_typed_handlers = false;\n      } else if (arg == \"--grpc-callback-api\" ||\n                 arg == \"--grpc-callback-api=true\") {\n        opts.grpc_callback_api = true;\n      } else if (arg == \"--no-grpc-callback-api\" ||\n                 arg == \"--grpc-callback-api=false\") {\n        opts.grpc_callback_api = false;\n      } else {\n        if (arg == \"--proto\") {\n          opts.proto_mode = true;\n        }\n\n        auto code_generator_it = code_generators_.find(arg);\n        if (code_generator_it == code_generators_.end()) {\n          Error(\"unknown commandline argument: \" + arg, true);\n          return options;\n        }\n\n        std::shared_ptr<CodeGenerator> code_generator =\n            code_generator_it->second;\n\n        // TODO(derekbailey): remove in favor of just checking if\n        // generators.empty().\n        options.any_generator = true;\n        opts.lang_to_generate |= code_generator->Language();\n\n        auto is_binary_schema = code_generator->SupportsBfbsGeneration();\n        opts.binary_schema_comments = is_binary_schema;\n        options.requires_bfbs = is_binary_schema;\n        options.generators.push_back(std::move(code_generator));\n      }\n    } else {\n      options.filenames.push_back(flatbuffers::PosixPath(argv[argi]));\n    }\n  }\n\n  ValidateOptions(options);\n\n  return options;\n}\n\nvoid FlatCompiler::ValidateOptions(const FlatCOptions& options) {\n  const IDLOptions& opts = options.opts;\n\n  if (!options.filenames.size()) Error(\"missing input files\", false, true);\n\n  if (opts.proto_mode && options.any_generator) {\n    Warn(\"cannot generate code directly from .proto files\", true);\n  } else if (!options.any_generator && options.conform_to_schema.empty() &&\n             options.annotate_schema.empty()) {\n    Error(\"no options: specify at least one generator.\", true);\n  }\n\n  if (opts.cs_gen_json_serializer && !opts.generate_object_based_api) {\n    Error(\n        \"--cs-gen-json-serializer requires --gen-object-api to be set as \"\n        \"well.\");\n  }\n}\n\nflatbuffers::Parser FlatCompiler::GetConformParser(\n    const FlatCOptions& options) {\n  flatbuffers::Parser conform_parser;\n\n  // conform parser should check advanced options,\n  // so, it have to have knowledge about languages:\n  conform_parser.opts.lang_to_generate = options.opts.lang_to_generate;\n\n  if (!options.conform_to_schema.empty()) {\n    std::string contents;\n    if (!flatbuffers::LoadFile(options.conform_to_schema.c_str(), true,\n                               &contents)) {\n      Error(\"unable to load schema: \" + options.conform_to_schema);\n    }\n\n    if (flatbuffers::GetExtension(options.conform_to_schema) ==\n        reflection::SchemaExtension()) {\n      LoadBinarySchema(conform_parser, options.conform_to_schema, contents);\n    } else {\n      ParseFile(conform_parser, options.conform_to_schema, contents,\n                options.conform_include_directories);\n    }\n  }\n  return conform_parser;\n}\n\nstd::unique_ptr<Parser> FlatCompiler::GenerateCode(const FlatCOptions& options,\n                                                   Parser& conform_parser) {\n  std::unique_ptr<Parser> parser =\n      std::unique_ptr<Parser>(new Parser(options.opts));\n\n  for (auto file_it = options.filenames.begin();\n       file_it != options.filenames.end(); ++file_it) {\n    IDLOptions opts = options.opts;\n\n    auto& filename = *file_it;\n    std::string contents;\n    if (!flatbuffers::LoadFile(filename.c_str(), true, &contents))\n      Error(\"unable to load file: \" + filename);\n\n    bool is_binary = static_cast<size_t>(file_it - options.filenames.begin()) >=\n                     options.binary_files_from;\n    auto ext = flatbuffers::GetExtension(filename);\n    const bool is_schema = ext == \"fbs\" || ext == \"proto\";\n    if (is_schema && opts.project_root.empty()) {\n      opts.project_root = StripFileName(filename);\n    }\n    const bool is_binary_schema = ext == reflection::SchemaExtension();\n    if (is_binary) {\n      parser->builder_.Clear();\n      parser->builder_.PushFlatBuffer(\n          reinterpret_cast<const uint8_t*>(contents.c_str()),\n          contents.length());\n      if (!options.raw_binary) {\n        // Generally reading binaries that do not correspond to the schema\n        // will crash, and sadly there's no way around that when the binary\n        // does not contain a file identifier.\n        // We'd expect that typically any binary used as a file would have\n        // such an identifier, so by default we require them to match.\n        if (!parser->file_identifier_.length()) {\n          Error(\"current schema has no file_identifier: cannot test if \\\"\" +\n                filename +\n                \"\\\" matches the schema, use --raw-binary to read this file\"\n                \" anyway.\");\n        } else if (!flatbuffers::BufferHasIdentifier(\n                       contents.c_str(), parser->file_identifier_.c_str(),\n                       opts.size_prefixed)) {\n          Error(\"binary \\\"\" + filename +\n                \"\\\" does not have expected file_identifier \\\"\" +\n                parser->file_identifier_ +\n                \"\\\", use --raw-binary to read this file anyway.\");\n        }\n      }\n    } else {\n      // Check if file contains 0 bytes.\n      if (!opts.use_flexbuffers && !is_binary_schema &&\n          contents.length() != strlen(contents.c_str())) {\n        Error(\"input file appears to be binary: \" + filename, true);\n      }\n      if (is_schema || is_binary_schema) {\n        // If we're processing multiple schemas, make sure to start each\n        // one from scratch. If it depends on previous schemas it must do\n        // so explicitly using an include.\n        parser.reset(new Parser(opts));\n      }\n      // Try to parse the file contents (binary schema/flexbuffer/textual\n      // schema)\n      if (is_binary_schema) {\n        LoadBinarySchema(*parser, filename, contents);\n      } else if (opts.use_flexbuffers) {\n        if (opts.lang_to_generate == IDLOptions::kJson) {\n          auto data = reinterpret_cast<const uint8_t*>(contents.c_str());\n          auto size = contents.size();\n          std::vector<uint8_t> reuse_tracker;\n          if (!flexbuffers::VerifyBuffer(data, size, &reuse_tracker))\n            Error(\"flexbuffers file failed to verify: \" + filename, false);\n          parser->flex_root_ = flexbuffers::GetRoot(data, size);\n        } else {\n          parser->flex_builder_.Clear();\n          ParseFile(*parser, filename, contents, options.include_directories);\n        }\n      } else {\n        ParseFile(*parser, filename, contents, options.include_directories);\n        if (!is_schema && !parser->builder_.GetSize()) {\n          // If a file doesn't end in .fbs, it must be json/binary. Ensure we\n          // didn't just parse a schema with a different extension.\n          Error(\"input file is neither json nor a .fbs (schema) file: \" +\n                    filename,\n                true);\n        }\n      }\n      if ((is_schema || is_binary_schema) &&\n          !options.conform_to_schema.empty()) {\n        auto err = parser->ConformTo(conform_parser);\n        if (!err.empty()) Error(\"schemas don\\'t conform: \" + err, false);\n      }\n      if (parser->HasCircularStructDependency()) {\n        Error(\"schema has circular struct dependencies: \" + filename, false);\n      }\n      if (options.schema_binary || opts.binary_schema_gen_embed) {\n        parser->Serialize();\n      }\n      if (options.schema_binary) {\n        parser->file_extension_ = reflection::SchemaExtension();\n      }\n    }\n    std::string filebase =\n        flatbuffers::StripPath(flatbuffers::StripExtension(filename));\n\n    // If one of the generators uses bfbs, serialize the parser and get\n    // the serialized buffer and length.\n    const uint8_t* bfbs_buffer = nullptr;\n    int64_t bfbs_length = 0;\n    if (options.requires_bfbs) {\n      parser->Serialize();\n      bfbs_buffer = parser->builder_.GetBufferPointer();\n      bfbs_length = parser->builder_.GetSize();\n    }\n\n    for (const std::shared_ptr<CodeGenerator>& code_generator :\n         options.generators) {\n      if (options.print_make_rules) {\n        std::string make_rule;\n        const CodeGenerator::Status status = code_generator->GenerateMakeRule(\n            *parser, options.output_path, filename, make_rule);\n        if (status == CodeGenerator::Status::OK && !make_rule.empty()) {\n          printf(\"%s\\n\",\n                 flatbuffers::WordWrap(make_rule, 80, \" \", \" \\\\\").c_str());\n        } else {\n          Error(\"Cannot generate make rule for \" +\n                code_generator->LanguageName());\n        }\n      } else {\n        flatbuffers::EnsureDirExists(options.output_path);\n\n        // Prefer bfbs generators if present.\n        if (code_generator->SupportsBfbsGeneration()) {\n          CodeGenOptions code_gen_options;\n          code_gen_options.output_path = options.output_path;\n          code_gen_options.file_saver = options.opts.file_saver;\n\n          const CodeGenerator::Status status = code_generator->GenerateCode(\n              bfbs_buffer, bfbs_length, code_gen_options);\n          if (status != CodeGenerator::Status::OK) {\n            Error(\"Unable to generate \" + code_generator->LanguageName() +\n                  \" for \" + filebase + code_generator->status_detail +\n                  \" using bfbs generator.\");\n          }\n        } else {\n          if ((!code_generator->IsSchemaOnly() ||\n               (is_schema || is_binary_schema)) &&\n              code_generator->GenerateCode(*parser, options.output_path,\n                                           filebase) !=\n                  CodeGenerator::Status::OK) {\n            Error(\"Unable to generate \" + code_generator->LanguageName() +\n                  \" for \" + filebase + code_generator->status_detail);\n          }\n        }\n      }\n\n      if (options.grpc_enabled) {\n        const CodeGenerator::Status status = code_generator->GenerateGrpcCode(\n            *parser, options.output_path, filebase);\n\n        if (status == CodeGenerator::Status::NOT_IMPLEMENTED) {\n          Warn(\"GRPC interface generator not implemented for \" +\n               code_generator->LanguageName());\n        } else if (status == CodeGenerator::Status::ERROR) {\n          Error(\"Unable to generate GRPC interface for \" +\n                code_generator->LanguageName());\n        }\n      }\n    }\n\n    if (!opts.root_type.empty()) {\n      if (!parser->SetRootType(opts.root_type.c_str()))\n        Error(\"unknown root type: \" + opts.root_type);\n      else if (parser->root_struct_def_->fixed)\n        Error(\"root type must be a table\");\n    }\n\n    // We do not want to generate code for the definitions in this file\n    // in any files coming up next.\n    parser->MarkGenerated();\n  }\n\n  return parser;\n}\n\nint FlatCompiler::Compile(const FlatCOptions& options) {\n  // TODO(derekbailey): change to std::optional<Parser>\n  Parser conform_parser = GetConformParser(options);\n\n  // TODO(derekbailey): split to own method.\n  if (!options.annotate_schema.empty()) {\n    const std::string ext = flatbuffers::GetExtension(options.annotate_schema);\n    if (!(ext == reflection::SchemaExtension() || ext == \"fbs\")) {\n      Error(\"Expected a `.bfbs` or `.fbs` schema, got: \" +\n            options.annotate_schema);\n    }\n\n    const bool is_binary_schema = ext == reflection::SchemaExtension();\n\n    std::string schema_contents;\n    if (!flatbuffers::LoadFile(options.annotate_schema.c_str(),\n                               /*binary=*/is_binary_schema, &schema_contents)) {\n      Error(\"unable to load schema: \" + options.annotate_schema);\n    }\n\n    const uint8_t* binary_schema = nullptr;\n    uint64_t binary_schema_size = 0;\n\n    IDLOptions binary_opts;\n    binary_opts.lang_to_generate |= flatbuffers::IDLOptions::kBinary;\n    Parser parser(binary_opts);\n\n    if (is_binary_schema) {\n      binary_schema = reinterpret_cast<const uint8_t*>(schema_contents.c_str());\n      binary_schema_size = schema_contents.size();\n    } else {\n      // If we need to generate the .bfbs file from the provided schema file\n      // (.fbs)\n      ParseFile(parser, options.annotate_schema, schema_contents,\n                options.include_directories);\n      parser.Serialize();\n\n      binary_schema = parser.builder_.GetBufferPointer();\n      binary_schema_size = parser.builder_.GetSize();\n    }\n\n    if (binary_schema == nullptr || !binary_schema_size) {\n      Error(\"could not parse a value binary schema from: \" +\n            options.annotate_schema);\n    }\n\n    // Annotate the provided files with the binary_schema.\n    AnnotateBinaries(binary_schema, binary_schema_size, options);\n\n    // We don't support doing anything else after annotating a binary.\n    return 0;\n  }\n\n  if (options.generators.empty() && options.conform_to_schema.empty()) {\n    Error(\"No generator registered\");\n    return -1;\n  }\n\n  std::unique_ptr<Parser> parser = GenerateCode(options, conform_parser);\n\n  for (const auto& code_generator : options.generators) {\n    if (code_generator->SupportsRootFileGeneration()) {\n      code_generator->GenerateRootFile(*parser, options.output_path);\n    }\n  }\n\n  return 0;\n}\n\nbool FlatCompiler::RegisterCodeGenerator(\n    const FlatCOption& option, std::shared_ptr<CodeGenerator> code_generator) {\n  if (!option.short_opt.empty() &&\n      code_generators_.find(\"-\" + option.short_opt) != code_generators_.end()) {\n    Error(\"multiple generators registered under: -\" + option.short_opt, false,\n          false);\n    return false;\n  }\n\n  if (!option.short_opt.empty()) {\n    code_generators_[\"-\" + option.short_opt] = code_generator;\n  }\n\n  if (!option.long_opt.empty() &&\n      code_generators_.find(\"--\" + option.long_opt) != code_generators_.end()) {\n    Error(\"multiple generators registered under: --\" + option.long_opt, false,\n          false);\n    return false;\n  }\n\n  if (!option.long_opt.empty()) {\n    code_generators_[\"--\" + option.long_opt] = code_generator;\n  }\n\n  language_options.insert(option);\n\n  return true;\n}\n\n}  // namespace flatbuffers\n"
  },
  {
    "path": "src/flatc_main.cpp",
    "content": "/*\n * Copyright 2017 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include <cstdio>\n#include <memory>\n\n#include \"bfbs_gen_lua.h\"\n#include \"bfbs_gen_nim.h\"\n#include \"flatbuffers/base.h\"\n#include \"flatbuffers/code_generator.h\"\n#include \"flatbuffers/flatc.h\"\n#include \"flatbuffers/util.h\"\n#include \"idl_gen_binary.h\"\n#include \"idl_gen_cpp.h\"\n#include \"idl_gen_csharp.h\"\n#include \"idl_gen_dart.h\"\n#include \"idl_gen_fbs.h\"\n#include \"idl_gen_go.h\"\n#include \"idl_gen_java.h\"\n#include \"idl_gen_json_schema.h\"\n#include \"idl_gen_kotlin.h\"\n#include \"idl_gen_lobster.h\"\n#include \"idl_gen_php.h\"\n#include \"idl_gen_python.h\"\n#include \"idl_gen_rust.h\"\n#include \"idl_gen_swift.h\"\n#include \"idl_gen_text.h\"\n#include \"idl_gen_ts.h\"\n\nstatic const char* g_program_name = nullptr;\n\nstatic void Warn(const flatbuffers::FlatCompiler* flatc,\n                 const std::string& warn, bool show_exe_name) {\n  (void)flatc;\n  if (show_exe_name) {\n    printf(\"%s: \", g_program_name);\n  }\n  fprintf(stderr, \"\\nwarning:\\n  %s\\n\\n\", warn.c_str());\n}\n\nstatic void Error(const flatbuffers::FlatCompiler* flatc,\n                  const std::string& err, bool usage, bool show_exe_name) {\n  if (show_exe_name) {\n    printf(\"%s: \", g_program_name);\n  }\n  if (usage && flatc) {\n    fprintf(stderr, \"%s\\n\", flatc->GetShortUsageString(g_program_name).c_str());\n  }\n  fprintf(stderr, \"\\nerror:\\n  %s\\n\\n\", err.c_str());\n  exit(1);\n}\n\nnamespace flatbuffers {\nvoid LogCompilerWarn(const std::string& warn) {\n  Warn(static_cast<const flatbuffers::FlatCompiler*>(nullptr), warn, true);\n}\nvoid LogCompilerError(const std::string& err) {\n  Error(static_cast<const flatbuffers::FlatCompiler*>(nullptr), err, false,\n        true);\n}\n}  // namespace flatbuffers\n\nint main(int argc, const char* argv[]) {\n  const std::string flatbuffers_version(flatbuffers::FLATBUFFERS_VERSION());\n\n  g_program_name = argv[0];\n\n  flatbuffers::FlatCompiler::InitParams params;\n  params.warn_fn = Warn;\n  params.error_fn = Error;\n\n  flatbuffers::FlatCompiler flatc(params);\n\n  flatc.RegisterCodeGenerator(\n      flatbuffers::FlatCOption{\n          \"b\", \"binary\", \"\",\n          \"Generate wire format binaries for any data definitions\"},\n      flatbuffers::NewBinaryCodeGenerator());\n\n  flatc.RegisterCodeGenerator(\n      flatbuffers::FlatCOption{\"c\", \"cpp\", \"\",\n                               \"Generate C++ headers for tables/structs\"},\n      flatbuffers::NewCppCodeGenerator());\n\n  flatc.RegisterCodeGenerator(\n      flatbuffers::FlatCOption{\"n\", \"csharp\", \"\",\n                               \"Generate C# classes for tables/structs\"},\n      flatbuffers::NewCSharpCodeGenerator());\n\n  flatc.RegisterCodeGenerator(\n      flatbuffers::FlatCOption{\"d\", \"dart\", \"\",\n                               \"Generate Dart classes for tables/structs\"},\n      flatbuffers::NewDartCodeGenerator());\n\n  flatc.RegisterCodeGenerator(\n      flatbuffers::FlatCOption{\"\", \"proto\", \"\",\n                               \"Input is a .proto, translate to .fbs\"},\n      flatbuffers::NewFBSCodeGenerator());\n\n  flatc.RegisterCodeGenerator(\n      flatbuffers::FlatCOption{\"g\", \"go\", \"\",\n                               \"Generate Go files for tables/structs\"},\n      flatbuffers::NewGoCodeGenerator());\n\n  flatc.RegisterCodeGenerator(\n      flatbuffers::FlatCOption{\"j\", \"java\", \"\",\n                               \"Generate Java classes for tables/structs\"},\n      flatbuffers::NewJavaCodeGenerator());\n\n  flatc.RegisterCodeGenerator(\n      flatbuffers::FlatCOption{\"\", \"jsonschema\", \"\", \"Generate Json schema\"},\n      flatbuffers::NewJsonSchemaCodeGenerator());\n\n  flatc.RegisterCodeGenerator(\n      flatbuffers::FlatCOption{\"\", \"kotlin\", \"\",\n                               \"Generate Kotlin classes for tables/structs\"},\n      flatbuffers::NewKotlinCodeGenerator());\n\n  flatc.RegisterCodeGenerator(\n      flatbuffers::FlatCOption{\n          \"\", \"kotlin-kmp\", \"\",\n          \"Generate Kotlin multiplatform classes for tables/structs\"},\n      flatbuffers::NewKotlinKMPCodeGenerator());\n\n  flatc.RegisterCodeGenerator(\n      flatbuffers::FlatCOption{\"\", \"lobster\", \"\",\n                               \"Generate Lobster files for tables/structs\"},\n      flatbuffers::NewLobsterCodeGenerator());\n\n  flatc.RegisterCodeGenerator(\n      flatbuffers::FlatCOption{\"l\", \"lua\", \"\",\n                               \"Generate Lua files for tables/structs\"},\n      flatbuffers::NewLuaBfbsGenerator(flatbuffers_version));\n\n  flatc.RegisterCodeGenerator(\n      flatbuffers::FlatCOption{\"\", \"nim\", \"\",\n                               \"Generate Nim files for tables/structs\"},\n      flatbuffers::NewNimBfbsGenerator(flatbuffers_version));\n\n  flatc.RegisterCodeGenerator(\n      flatbuffers::FlatCOption{\"p\", \"python\", \"\",\n                               \"Generate Python files for tables/structs\"},\n      flatbuffers::NewPythonCodeGenerator());\n\n  flatc.RegisterCodeGenerator(\n      flatbuffers::FlatCOption{\"\", \"php\", \"\",\n                               \"Generate PHP files for tables/structs\"},\n      flatbuffers::NewPhpCodeGenerator());\n\n  flatc.RegisterCodeGenerator(\n      flatbuffers::FlatCOption{\"r\", \"rust\", \"\",\n                               \"Generate Rust files for tables/structs\"},\n      flatbuffers::NewRustCodeGenerator());\n\n  flatc.RegisterCodeGenerator(\n      flatbuffers::FlatCOption{\"t\", \"json\", \"\",\n                               \"Generate text output for any data definitions\"},\n      flatbuffers::NewTextCodeGenerator());\n\n  flatc.RegisterCodeGenerator(\n      flatbuffers::FlatCOption{\"\", \"swift\", \"\",\n                               \"Generate Swift files for tables/structs\"},\n      flatbuffers::NewSwiftCodeGenerator());\n\n  flatc.RegisterCodeGenerator(\n      flatbuffers::FlatCOption{\"T\", \"ts\", \"\",\n                               \"Generate TypeScript code for tables/structs\"},\n      flatbuffers::NewTsCodeGenerator());\n\n  // Create the FlatC options by parsing the command line arguments.\n  flatbuffers::FlatCOptions options =\n      flatc.ParseFromCommandLineArguments(argc, argv);\n\n  // this exists here to ensure file_saver outlives the compilation process\n  std::unique_ptr<flatbuffers::FileSaver> file_saver;\n  if (options.file_names_only) {\n    file_saver.reset(new flatbuffers::FileNameSaver{});\n  } else {\n    file_saver.reset(new flatbuffers::RealFileSaver{});\n  }\n\n  options.opts.file_saver = file_saver.get();\n  FLATBUFFERS_ASSERT(options.opts.file_saver);\n\n  // Compile with the extracted FlatC options.\n  int success = flatc.Compile(options);\n\n  // print file names if file-names-only option is set\n  options.opts.file_saver->Finish();\n\n  return success;\n}\n"
  },
  {
    "path": "src/flathash.cpp",
    "content": "/*\n * Copyright 2015 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include <stdio.h>\n\n#include <iostream>\n#include <sstream>\n#include <string>\n\n#include \"flatbuffers/hash.h\"\n\nenum OutputFormat { kDecimal, kHexadecimal, kHexadecimal0x };\n\nint main(int argc, char* argv[]) {\n  const char* name = argv[0];\n  if (argc <= 1) {\n    printf(\"%s HASH [OPTION]... [--] STRING...\\n\", name);\n    printf(\"Available hashing algorithms:\\n\");\n    printf(\"  16 bit:\\n\");\n    size_t size = sizeof(flatbuffers::kHashFunctions16) /\n                  sizeof(flatbuffers::kHashFunctions16[0]);\n    for (size_t i = 0; i < size; ++i) {\n      printf(\"    * %s\\n\", flatbuffers::kHashFunctions16[i].name);\n    }\n    printf(\"  32 bit:\\n\");\n    size = sizeof(flatbuffers::kHashFunctions32) /\n           sizeof(flatbuffers::kHashFunctions32[0]);\n    for (size_t i = 0; i < size; ++i) {\n      printf(\"    * %s\\n\", flatbuffers::kHashFunctions32[i].name);\n    }\n    printf(\"  64 bit:\\n\");\n    size = sizeof(flatbuffers::kHashFunctions64) /\n           sizeof(flatbuffers::kHashFunctions64[0]);\n    for (size_t i = 0; i < size; ++i) {\n      printf(\"    * %s\\n\", flatbuffers::kHashFunctions64[i].name);\n    }\n    printf(\n        \"  -d         Output hash in decimal.\\n\"\n        \"  -x         Output hash in hexadecimal.\\n\"\n        \"  -0x        Output hash in hexadecimal and prefix with 0x.\\n\"\n        \"  -c         Append the string to the output in a c-style comment.\\n\");\n    return 1;\n  }\n\n  const char* hash_algorithm = argv[1];\n\n  flatbuffers::NamedHashFunction<uint16_t>::HashFunction hash_function16 =\n      flatbuffers::FindHashFunction16(hash_algorithm);\n  flatbuffers::NamedHashFunction<uint32_t>::HashFunction hash_function32 =\n      flatbuffers::FindHashFunction32(hash_algorithm);\n  flatbuffers::NamedHashFunction<uint64_t>::HashFunction hash_function64 =\n      flatbuffers::FindHashFunction64(hash_algorithm);\n\n  if (!hash_function16 && !hash_function32 && !hash_function64) {\n    printf(\"\\\"%s\\\" is not a known hash algorithm.\\n\", hash_algorithm);\n    return 1;\n  }\n\n  OutputFormat output_format = kHexadecimal;\n  bool annotate = false;\n  bool escape_dash = false;\n  for (int i = 2; i < argc; i++) {\n    const char* arg = argv[i];\n    if (!escape_dash && arg[0] == '-') {\n      std::string opt = arg;\n      if (opt == \"-d\")\n        output_format = kDecimal;\n      else if (opt == \"-x\")\n        output_format = kHexadecimal;\n      else if (opt == \"-0x\")\n        output_format = kHexadecimal0x;\n      else if (opt == \"-c\")\n        annotate = true;\n      else if (opt == \"--\")\n        escape_dash = true;\n      else\n        printf(\"Unrecognized argument: \\\"%s\\\"\\n\", arg);\n    } else {\n      std::stringstream ss;\n      if (output_format == kDecimal) {\n        ss << std::dec;\n      } else if (output_format == kHexadecimal) {\n        ss << std::hex;\n      } else if (output_format == kHexadecimal0x) {\n        ss << std::hex;\n        ss << \"0x\";\n      }\n      if (hash_function16)\n        ss << hash_function16(arg);\n      else if (hash_function32)\n        ss << hash_function32(arg);\n      else if (hash_function64)\n        ss << hash_function64(arg);\n\n      if (annotate) ss << \" /* \\\"\" << arg << \"\\\" */\";\n\n      ss << \"\\n\";\n\n      std::cout << ss.str();\n    }\n  }\n  return 0;\n}\n"
  },
  {
    "path": "src/idl_gen_binary.cpp",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// independent from idl_parser, since this code is not needed for most clients\n\n#include \"idl_gen_binary.h\"\n\n#include <limits>\n#include <memory>\n#include <string>\n#include <unordered_set>\n\n#include \"flatbuffers/base.h\"\n#include \"flatbuffers/code_generators.h\"\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/flatc.h\"\n#include \"flatbuffers/idl.h\"\n#include \"flatbuffers/util.h\"\n\nnamespace flatbuffers {\nnamespace {\n\nstatic std::string BinaryFileName(const Parser& parser, const std::string& path,\n                                  const std::string& file_name) {\n  auto ext = parser.file_extension_.length() ? parser.file_extension_ : \"bin\";\n  return path + file_name + \".\" + ext;\n}\n\nstatic bool GenerateBinary(const Parser& parser, const std::string& path,\n                           const std::string& file_name) {\n  if (parser.opts.use_flexbuffers) {\n    auto data_vec = parser.flex_builder_.GetBuffer();\n    auto data_ptr = reinterpret_cast<char*>(data(data_vec));\n    return !parser.flex_builder_.GetSize() ||\n           parser.opts.file_saver->SaveFile(\n               BinaryFileName(parser, path, file_name).c_str(), data_ptr,\n               parser.flex_builder_.GetSize(), true);\n  }\n  return !parser.builder_.GetSize() ||\n         parser.opts.file_saver->SaveFile(\n             BinaryFileName(parser, path, file_name).c_str(),\n             reinterpret_cast<char*>(parser.builder_.GetBufferPointer()),\n             parser.builder_.GetSize(), true);\n}\n\nstatic std::string BinaryMakeRule(const Parser& parser, const std::string& path,\n                                  const std::string& file_name) {\n  if (!parser.builder_.GetSize()) return \"\";\n  std::string filebase =\n      flatbuffers::StripPath(flatbuffers::StripExtension(file_name));\n  std::string make_rule =\n      BinaryFileName(parser, path, filebase) + \": \" + file_name;\n  auto included_files =\n      parser.GetIncludedFilesRecursive(parser.root_struct_def_->file);\n  for (auto it = included_files.begin(); it != included_files.end(); ++it) {\n    make_rule += \" \" + *it;\n  }\n  return make_rule;\n}\n\nclass BinaryCodeGenerator : public CodeGenerator {\n public:\n  Status GenerateCode(const Parser& parser, const std::string& path,\n                      const std::string& filename) override {\n    if (!GenerateBinary(parser, path, filename)) {\n      return Status::ERROR;\n    }\n    return Status::OK;\n  }\n\n  // Generate code from the provided `buffer` of given `length`. The buffer is a\n  // serialized reflection.fbs.\n  Status GenerateCode(const uint8_t*, int64_t, const CodeGenOptions&) override {\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateMakeRule(const Parser& parser, const std::string& path,\n                          const std::string& filename,\n                          std::string& output) override {\n    output = BinaryMakeRule(parser, path, filename);\n    return Status::OK;\n  }\n\n  Status GenerateGrpcCode(const Parser& parser, const std::string& path,\n                          const std::string& filename) override {\n    (void)parser;\n    (void)path;\n    (void)filename;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateRootFile(const Parser& parser,\n                          const std::string& path) override {\n    (void)parser;\n    (void)path;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  bool IsSchemaOnly() const override { return false; }\n\n  bool SupportsBfbsGeneration() const override { return false; }\n\n  bool SupportsRootFileGeneration() const override { return false; }\n\n  IDLOptions::Language Language() const override { return IDLOptions::kBinary; }\n\n  std::string LanguageName() const override { return \"binary\"; }\n};\n\n}  // namespace\n\nstd::unique_ptr<CodeGenerator> NewBinaryCodeGenerator() {\n  return std::unique_ptr<BinaryCodeGenerator>(new BinaryCodeGenerator());\n}\n\n}  // namespace flatbuffers\n"
  },
  {
    "path": "src/idl_gen_binary.h",
    "content": "/*\n * Copyright 2023 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_IDL_GEN_BINARY_H_\n#define FLATBUFFERS_IDL_GEN_BINARY_H_\n\n#include <memory>\n#include <string>\n\n#include \"flatbuffers/code_generator.h\"\n\nnamespace flatbuffers {\n\n// Constructs a new Binary code generator.\nstd::unique_ptr<CodeGenerator> NewBinaryCodeGenerator();\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_IDL_GEN_BINARY_H_\n"
  },
  {
    "path": "src/idl_gen_cpp.cpp",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// independent from idl_parser, since this code is not needed for most clients\n\n#include \"idl_gen_cpp.h\"\n\n#include <limits>\n#include <memory>\n#include <string>\n#include <unordered_set>\n#include <utility>\n\n#include \"flatbuffers/base.h\"\n#include \"flatbuffers/code_generators.h\"\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/flatc.h\"\n#include \"flatbuffers/idl.h\"\n#include \"flatbuffers/util.h\"\n\nnamespace flatbuffers {\n\n// Make numerical literal with type-suffix.\n// This function is only needed for C++! Other languages do not need it.\nstatic inline std::string NumToStringCpp(std::string val, BaseType type) {\n  // Avoid issues with -2147483648, -9223372036854775808.\n  switch (type) {\n    case BASE_TYPE_INT:\n      return (val != \"-2147483648\") ? val : (\"(-2147483647 - 1)\");\n    case BASE_TYPE_ULONG:\n      return (val == \"0\") ? val : (val + \"ULL\");\n    case BASE_TYPE_LONG:\n      if (val == \"-9223372036854775808\")\n        return \"(-9223372036854775807LL - 1LL)\";\n      else\n        return (val == \"0\") ? val : (val + \"LL\");\n    default:\n      return val;\n  }\n}\n\nstatic std::string GenIncludeGuard(const std::string& file_name,\n                                   const Namespace& name_space,\n                                   const std::string& postfix = \"\") {\n  // Generate include guard.\n  std::string guard = file_name;\n  // Remove any non-alpha-numeric characters that may appear in a filename.\n  struct IsAlnum {\n    bool operator()(char c) const { return !is_alnum(c); }\n  };\n  guard.erase(std::remove_if(guard.begin(), guard.end(), IsAlnum()),\n              guard.end());\n  guard = \"FLATBUFFERS_GENERATED_\" + guard;\n  guard += \"_\";\n  // For further uniqueness, also add the namespace.\n  for (const std::string& component : name_space.components) {\n    guard += component + \"_\";\n  }\n  // Anything extra to add to the guard?\n  if (!postfix.empty()) {\n    guard += postfix + \"_\";\n  }\n  guard += \"H_\";\n  std::transform(guard.begin(), guard.end(), guard.begin(), CharToUpper);\n  return guard;\n}\n\nstatic bool IsVectorOfPointers(const FieldDef& field) {\n  const auto& type = field.value.type;\n  const auto& vector_type = type.VectorType();\n  return IsVector(type) && vector_type.base_type == BASE_TYPE_STRUCT &&\n         !vector_type.struct_def->fixed && !field.native_inline;\n}\n\nstatic bool IsPointer(const FieldDef& field) {\n  return field.value.type.base_type == BASE_TYPE_STRUCT &&\n         !IsStruct(field.value.type);\n}\n\nnamespace cpp {\n\nenum CppStandard { CPP_STD_X0 = 0, CPP_STD_11, CPP_STD_17 };\n\n// Define a style of 'struct' constructor if it has 'Array' fields.\nenum GenArrayArgMode {\n  kArrayArgModeNone,        // don't generate initialization args\n  kArrayArgModeSpanStatic,  // generate ::flatbuffers::span<T,N>\n};\n\n// Extension of IDLOptions for cpp-generator.\nstruct IDLOptionsCpp : public IDLOptions {\n  // All fields start with 'g_' prefix to distinguish from the base IDLOptions.\n  CppStandard g_cpp_std;    // Base version of C++ standard.\n  bool g_only_fixed_enums;  // Generate underlaying type for all enums.\n\n  IDLOptionsCpp(const IDLOptions& opts)\n      : IDLOptions(opts), g_cpp_std(CPP_STD_11), g_only_fixed_enums(true) {}\n};\n\n// Iterates over all the fields of the object first by Offset type (Offset64\n// before Offset32) and then by definition order.\nstatic void ForAllFieldsOrderedByOffset(\n    const StructDef& object, std::function<void(const FieldDef* field)> func) {\n  // Loop over all the fields and call the func on all offset64 fields.\n  for (const FieldDef* field_def : object.fields.vec) {\n    if (field_def->offset64) {\n      func(field_def);\n    }\n  }\n  // Loop over all the fields a second time and call the func on all offset\n  // fields.\n  for (const FieldDef* field_def : object.fields.vec) {\n    if (!field_def->offset64) {\n      func(field_def);\n    }\n  }\n}\n\nclass CppGenerator : public BaseGenerator {\n public:\n  CppGenerator(const Parser& parser, const std::string& path,\n               const std::string& file_name, IDLOptionsCpp opts)\n      : BaseGenerator(parser, path, file_name, \"\", \"::\", \"h\"),\n        cur_name_space_(nullptr),\n        opts_(opts),\n        float_const_gen_(\"std::numeric_limits<double>::\",\n                         \"std::numeric_limits<float>::\", \"quiet_NaN()\",\n                         \"infinity()\") {\n    static const char* const keywords[] = {\n        \"alignas\",\n        \"alignof\",\n        \"and\",\n        \"and_eq\",\n        \"asm\",\n        \"atomic_cancel\",\n        \"atomic_commit\",\n        \"atomic_noexcept\",\n        \"auto\",\n        \"bitand\",\n        \"bitor\",\n        \"bool\",\n        \"break\",\n        \"case\",\n        \"catch\",\n        \"char\",\n        \"char16_t\",\n        \"char32_t\",\n        \"class\",\n        \"compl\",\n        \"concept\",\n        \"const\",\n        \"constexpr\",\n        \"const_cast\",\n        \"continue\",\n        \"co_await\",\n        \"co_return\",\n        \"co_yield\",\n        \"decltype\",\n        \"default\",\n        \"delete\",\n        \"do\",\n        \"double\",\n        \"dynamic_cast\",\n        \"else\",\n        \"enum\",\n        \"explicit\",\n        \"export\",\n        \"extern\",\n        \"false\",\n        \"float\",\n        \"for\",\n        \"friend\",\n        \"goto\",\n        \"if\",\n        \"import\",\n        \"inline\",\n        \"int\",\n        \"long\",\n        \"module\",\n        \"mutable\",\n        \"namespace\",\n        \"new\",\n        \"noexcept\",\n        \"not\",\n        \"not_eq\",\n        \"nullptr\",\n        \"operator\",\n        \"or\",\n        \"or_eq\",\n        \"private\",\n        \"protected\",\n        \"public\",\n        \"register\",\n        \"reinterpret_cast\",\n        \"requires\",\n        \"return\",\n        \"short\",\n        \"signed\",\n        \"sizeof\",\n        \"static\",\n        \"static_assert\",\n        \"static_cast\",\n        \"struct\",\n        \"switch\",\n        \"synchronized\",\n        \"template\",\n        \"this\",\n        \"thread_local\",\n        \"throw\",\n        \"true\",\n        \"try\",\n        \"typedef\",\n        \"typeid\",\n        \"typename\",\n        \"union\",\n        \"unsigned\",\n        \"using\",\n        \"virtual\",\n        \"void\",\n        \"volatile\",\n        \"wchar_t\",\n        \"while\",\n        \"xor\",\n        \"xor_eq\",\n        nullptr,\n    };\n    for (auto kw = keywords; *kw; kw++) keywords_.insert(*kw);\n  }\n\n  // Adds code to check that the included flatbuffers.h is of the same version\n  // as the generated code. This check currently looks for exact version match,\n  // as we would guarantee that they are compatible, but in theory a newer\n  // version of flatbuffers.h should work with a old code gen if we do proper\n  // backwards support.\n  void GenFlatbuffersVersionCheck() {\n    code_ +=\n        \"// Ensure the included flatbuffers.h is the same version as when this \"\n        \"file was\";\n    code_ += \"// generated, otherwise it may not be compatible.\";\n    code_ += \"static_assert(FLATBUFFERS_VERSION_MAJOR == \" +\n             std::to_string(FLATBUFFERS_VERSION_MAJOR) + \" &&\";\n    code_ += \"              FLATBUFFERS_VERSION_MINOR == \" +\n             std::to_string(FLATBUFFERS_VERSION_MINOR) + \" &&\";\n    code_ += \"              FLATBUFFERS_VERSION_REVISION == \" +\n             std::to_string(FLATBUFFERS_VERSION_REVISION) + \",\";\n    code_ += \"             \\\"Non-compatible flatbuffers version included\\\");\";\n  }\n\n  void GenIncludeDependencies() {\n    if (opts_.generate_object_based_api) {\n      for (const std::string& native_included_file :\n           parser_.native_included_files_) {\n        code_ += \"#include \\\"\" + native_included_file + \"\\\"\";\n      }\n    }\n\n    // Get the directly included file of the file being parsed.\n    std::vector<IncludedFile> included_files(parser_.GetIncludedFiles());\n\n    // We are safe to sort them alphabetically, since there shouldn't be any\n    // interdependence between them.\n    std::stable_sort(included_files.begin(), included_files.end());\n\n    for (const IncludedFile& included_file : included_files) {\n      // Get the name of the included file as defined by the schema, and strip\n      // the .fbs extension.\n      const std::string name_without_ext =\n          StripExtension(included_file.schema_name);\n\n      // If we are told to keep the prefix of the included schema, leave it\n      // unchanged, otherwise strip the leading path off so just the \"basename\"\n      // of the include is retained.\n      const std::string basename =\n          opts_.keep_prefix ? name_without_ext : StripPath(name_without_ext);\n\n      code_ += \"#include \\\"\" +\n               GeneratedFileName(opts_.include_prefix, basename, opts_) + \"\\\"\";\n    }\n\n    if (!parser_.native_included_files_.empty() || !included_files.empty()) {\n      code_ += \"\";\n    }\n  }\n\n  void MarkIf64BitBuilderIsNeeded() {\n    if (needs_64_bit_builder_) {\n      return;\n    }\n    for (auto t : parser_.structs_.vec) {\n      if (t == nullptr) continue;\n      for (auto f : t->fields.vec) {\n        if (f == nullptr) continue;\n        if (f->offset64) {\n          needs_64_bit_builder_ = true;\n          break;\n        }\n      }\n    }\n  }\n\n  std::string GetBuilder() {\n    return std::string(\"::flatbuffers::FlatBufferBuilder\") +\n           (needs_64_bit_builder_ ? \"64\" : \"\");\n  }\n\n  void GenExtraIncludes() {\n    for (const std::string& cpp_include : opts_.cpp_includes) {\n      code_ += \"#include \\\"\" + cpp_include + \"\\\"\";\n    }\n    if (!opts_.cpp_includes.empty()) {\n      code_ += \"\";\n    }\n  }\n\n  void GenEmbeddedIncludes() {\n    if (parser_.opts.binary_schema_gen_embed && parser_.root_struct_def_) {\n      const std::string file_path =\n          GeneratedFileName(opts_.include_prefix, file_name_ + \"_bfbs\", opts_);\n      code_ += \"// For access to the binary schema that produced this file.\";\n      code_ += \"#include \\\"\" + file_path + \"\\\"\";\n      code_ += \"\";\n    }\n  }\n\n  std::string EscapeKeyword(const std::string& name) const {\n    return keywords_.find(name) == keywords_.end() ? name : name + \"_\";\n  }\n\n  std::string Name(const FieldDef& field) const {\n    // the union type field suffix is immutable.\n    static size_t union_suffix_len = strlen(UnionTypeFieldSuffix());\n    const bool is_union_type = field.value.type.base_type == BASE_TYPE_UTYPE;\n    // early return if no case transformation required\n    if (opts_.cpp_object_api_field_case_style ==\n        IDLOptions::CaseStyle_Unchanged)\n      return EscapeKeyword(field.name);\n    std::string name = field.name;\n    // do not change the case style of the union type field suffix\n    if (is_union_type) {\n      FLATBUFFERS_ASSERT(name.length() > union_suffix_len);\n      name.erase(name.length() - union_suffix_len, union_suffix_len);\n    }\n    if (opts_.cpp_object_api_field_case_style == IDLOptions::CaseStyle_Upper)\n      name = ConvertCase(name, Case::kUpperCamel);\n    else if (opts_.cpp_object_api_field_case_style ==\n             IDLOptions::CaseStyle_Lower)\n      name = ConvertCase(name, Case::kLowerCamel);\n    // restore the union field type suffix\n    if (is_union_type) name.append(UnionTypeFieldSuffix(), union_suffix_len);\n    return EscapeKeyword(name);\n  }\n\n  std::string Name(const Definition& def) const {\n    return EscapeKeyword(def.name);\n  }\n\n  std::string Name(const EnumVal& ev) const { return EscapeKeyword(ev.name); }\n\n  bool generate_bfbs_embed() {\n    code_.Clear();\n    code_ += \"// \" + std::string(FlatBuffersGeneratedWarning()) + \"\\n\\n\";\n\n    // If we don't have a root struct definition,\n    if (!parser_.root_struct_def_) {\n      // put a comment in the output why there is no code generated.\n      code_ += \"// Binary schema not generated, no root struct found\";\n    } else {\n      auto& struct_def = *parser_.root_struct_def_;\n      const auto include_guard =\n          GenIncludeGuard(file_name_, *struct_def.defined_namespace, \"bfbs\");\n\n      code_ += \"#ifndef \" + include_guard;\n      code_ += \"#define \" + include_guard;\n      code_ += \"\";\n      if (parser_.opts.gen_nullable) {\n        code_ += \"#pragma clang system_header\\n\\n\";\n      }\n\n      code_ += \"#include <cstddef>\";\n      code_ += \"#include <cstdint>\";\n\n      SetNameSpace(struct_def.defined_namespace);\n      auto name = Name(struct_def);\n      code_.SetValue(\"STRUCT_NAME\", name);\n\n      // Create code to return the binary schema data.\n      auto binary_schema_hex_text =\n          BufferToHexText(parser_.builder_.GetBufferPointer(),\n                          parser_.builder_.GetSize(), 105, \"      \", \"\");\n\n      code_ += \"struct {{STRUCT_NAME}}BinarySchema {\";\n      code_ += \"  static const uint8_t *data() {\";\n      code_ += \"    // Buffer containing the binary schema.\";\n      code_ += \"    static const uint8_t bfbsData[\" +\n               NumToString(parser_.builder_.GetSize()) + \"] = {\";\n      code_ += binary_schema_hex_text;\n      code_ += \"    };\";\n      code_ += \"    return bfbsData;\";\n      code_ += \"  }\";\n      code_ += \"  static size_t size() {\";\n      code_ += \"    return \" + NumToString(parser_.builder_.GetSize()) + \";\";\n      code_ += \"  }\";\n      code_ += \"  const uint8_t *begin() {\";\n      code_ += \"    return data();\";\n      code_ += \"  }\";\n      code_ += \"  const uint8_t *end() {\";\n      code_ += \"    return data() + size();\";\n      code_ += \"  }\";\n      code_ += \"};\";\n      code_ += \"\";\n\n      if (cur_name_space_) SetNameSpace(nullptr);\n\n      // Close the include guard.\n      code_ += \"#endif  // \" + include_guard;\n    }\n\n    // We are just adding \"_bfbs\" to the generated filename.\n    const auto file_path =\n        GeneratedFileName(path_, file_name_ + \"_bfbs\", opts_);\n    const auto final_code = code_.ToString();\n\n    return parser_.opts.file_saver->SaveFile(file_path.c_str(), final_code,\n                                             false);\n  }\n\n  // Iterate through all definitions we haven't generate code for (enums,\n  // structs, and tables) and output them to a single file.\n  bool generate() {\n    // Check if we require a 64-bit flatbuffer builder.\n    MarkIf64BitBuilderIsNeeded();\n\n    code_.Clear();\n    code_ += \"// \" + std::string(FlatBuffersGeneratedWarning()) + \"\\n\\n\";\n\n    const auto include_guard =\n        GenIncludeGuard(file_name_, *parser_.current_namespace_);\n    code_ += \"#ifndef \" + include_guard;\n    code_ += \"#define \" + include_guard;\n    code_ += \"\";\n\n    if (opts_.gen_nullable) {\n      code_ += \"#pragma clang system_header\\n\\n\";\n    }\n\n    code_ += \"#include \\\"flatbuffers/flatbuffers.h\\\"\";\n    if (parser_.uses_flexbuffers_) {\n      code_ += \"#include \\\"flatbuffers/flexbuffers.h\\\"\";\n      code_ += \"#include \\\"flatbuffers/flex_flat_util.h\\\"\";\n    }\n    code_ += \"\";\n    GenFlatbuffersVersionCheck();\n    code_ += \"\";\n\n    if (opts_.include_dependence_headers) {\n      GenIncludeDependencies();\n    }\n    GenExtraIncludes();\n    GenEmbeddedIncludes();\n\n    FLATBUFFERS_ASSERT(!cur_name_space_);\n\n    // Generate forward declarations for all structs/tables, since they may\n    // have circular references.\n    for (const auto& struct_def : parser_.structs_.vec) {\n      if (!struct_def->generated) {\n        SetNameSpace(struct_def->defined_namespace);\n        code_ += \"struct \" + Name(*struct_def) + \";\";\n        if (!struct_def->fixed) {\n          code_ += \"struct \" + Name(*struct_def) + \"Builder;\";\n        }\n        if (opts_.generate_object_based_api) {\n          auto nativeName = NativeName(Name(*struct_def), struct_def, opts_);\n\n          // Check that nativeName doesn't collide the name of another struct.\n          for (const auto& other_struct_def : parser_.structs_.vec) {\n            if (other_struct_def == struct_def ||\n                other_struct_def->defined_namespace !=\n                    struct_def->defined_namespace) {\n              continue;\n            }\n\n            auto other_name = Name(*other_struct_def);\n            if (nativeName == other_name) {\n              LogCompilerError(\"Generated Object API type for \" +\n                               Name(*struct_def) + \" collides with \" +\n                               other_name);\n              FLATBUFFERS_ASSERT(true);\n            }\n          }\n\n          // Don't declare a new object API struct type if the table is a\n          // native type.\n          const auto native_type = struct_def->attributes.Lookup(\"native_type\");\n          if (!struct_def->fixed && !native_type) {\n            code_ += \"struct \" + nativeName + \";\";\n          }\n        }\n        code_ += \"\";\n      }\n    }\n\n    // Generate forward declarations for all equal operators\n    if (opts_.generate_object_based_api && opts_.gen_compare) {\n      for (const auto& struct_def : parser_.structs_.vec) {\n        const auto native_type = struct_def->attributes.Lookup(\"native_type\");\n        if (!struct_def->generated && !native_type) {\n          SetNameSpace(struct_def->defined_namespace);\n          auto nativeName = NativeName(Name(*struct_def), struct_def, opts_);\n          code_ += \"bool operator==(const \" + nativeName + \" &lhs, const \" +\n                   nativeName + \" &rhs);\";\n          code_ += \"bool operator!=(const \" + nativeName + \" &lhs, const \" +\n                   nativeName + \" &rhs);\";\n        }\n      }\n      code_ += \"\";\n    }\n\n    // Generate preablmle code for mini reflection.\n    if (opts_.mini_reflect != IDLOptions::kNone) {\n      // To break cyclic dependencies, first pre-declare all tables/structs.\n      for (const auto& struct_def : parser_.structs_.vec) {\n        if (!struct_def->generated) {\n          SetNameSpace(struct_def->defined_namespace);\n          GenMiniReflectPre(struct_def);\n        }\n      }\n    }\n\n    // Generate code for all the enum declarations.\n    for (const auto& enum_def : parser_.enums_.vec) {\n      if (!enum_def->generated) {\n        SetNameSpace(enum_def->defined_namespace);\n        GenEnum(*enum_def);\n      }\n    }\n\n    // Generate code for all structs, then all tables.\n    for (const auto& struct_def : parser_.structs_.vec) {\n      if (struct_def->fixed && !struct_def->generated) {\n        SetNameSpace(struct_def->defined_namespace);\n        GenStruct(*struct_def);\n      }\n    }\n    for (const auto& struct_def : parser_.structs_.vec) {\n      if (!struct_def->fixed && !struct_def->generated) {\n        SetNameSpace(struct_def->defined_namespace);\n        GenTable(*struct_def);\n      }\n    }\n    for (const auto& struct_def : parser_.structs_.vec) {\n      if (!struct_def->fixed && !struct_def->generated) {\n        SetNameSpace(struct_def->defined_namespace);\n        GenTablePost(*struct_def);\n      }\n    }\n\n    // Generate code for union verifiers.\n    for (const auto& enum_def : parser_.enums_.vec) {\n      if (enum_def->is_union && !enum_def->generated) {\n        SetNameSpace(enum_def->defined_namespace);\n        GenUnionPost(*enum_def);\n      }\n    }\n\n    // Generate code for mini reflection.\n    if (opts_.mini_reflect != IDLOptions::kNone) {\n      // Then the unions/enums that may refer to them.\n      for (const auto& enum_def : parser_.enums_.vec) {\n        if (!enum_def->generated) {\n          SetNameSpace(enum_def->defined_namespace);\n          GenMiniReflect(nullptr, enum_def);\n        }\n      }\n      // Then the full tables/structs.\n      for (const auto& struct_def : parser_.structs_.vec) {\n        if (!struct_def->generated) {\n          SetNameSpace(struct_def->defined_namespace);\n          GenMiniReflect(struct_def, nullptr);\n        }\n      }\n    }\n\n    // Generate convenient global helper functions:\n    if (parser_.root_struct_def_) {\n      auto& struct_def = *parser_.root_struct_def_;\n      SetNameSpace(struct_def.defined_namespace);\n      auto name = Name(struct_def);\n      auto qualified_name = cur_name_space_->GetFullyQualifiedName(name);\n      auto cpp_name = TranslateNameSpace(qualified_name);\n\n      code_.SetValue(\"STRUCT_NAME\", name);\n      code_.SetValue(\"CPP_NAME\", cpp_name);\n      code_.SetValue(\"NULLABLE_EXT\", NullableExtension());\n      code_.SetValue(\n          \"SIZE_T\", needs_64_bit_builder_ ? \",::flatbuffers::uoffset64_t\" : \"\");\n\n      // The root datatype accessor:\n      code_ += \"inline \\\\\";\n      code_ +=\n          \"const {{CPP_NAME}} *{{NULLABLE_EXT}}Get{{STRUCT_NAME}}(const void \"\n          \"*buf) {\";\n      code_ += \"  return ::flatbuffers::GetRoot<{{CPP_NAME}}>(buf);\";\n      code_ += \"}\";\n      code_ += \"\";\n\n      code_ += \"inline \\\\\";\n      code_ +=\n          \"const {{CPP_NAME}} \"\n          \"*{{NULLABLE_EXT}}GetSizePrefixed{{STRUCT_NAME}}(const void \"\n          \"*buf) {\";\n      code_ +=\n          \"  return \"\n          \"::flatbuffers::GetSizePrefixedRoot<{{CPP_NAME}}{{SIZE_T}}>(buf);\";\n      code_ += \"}\";\n      code_ += \"\";\n\n      if (opts_.mutable_buffer) {\n        code_ += \"inline \\\\\";\n        code_ += \"{{STRUCT_NAME}} *GetMutable{{STRUCT_NAME}}(void *buf) {\";\n        code_ +=\n            \"  return ::flatbuffers::GetMutableRoot<{{STRUCT_NAME}}>(buf);\";\n        code_ += \"}\";\n        code_ += \"\";\n\n        code_ += \"inline \\\\\";\n        code_ +=\n            \"{{CPP_NAME}} \"\n            \"*{{NULLABLE_EXT}}GetMutableSizePrefixed{{STRUCT_NAME}}(void \"\n            \"*buf) {\";\n        code_ +=\n            \"  return \"\n            \"::flatbuffers::GetMutableSizePrefixedRoot<{{CPP_NAME}}{{SIZE_T}}>(\"\n            \"buf);\";\n        code_ += \"}\";\n        code_ += \"\";\n      }\n\n      if (parser_.file_identifier_.length()) {\n        // Return the identifier\n        code_ += \"inline const char *{{STRUCT_NAME}}Identifier() {\";\n        code_ += \"  return \\\"\" + parser_.file_identifier_ + \"\\\";\";\n        code_ += \"}\";\n        code_ += \"\";\n\n        // Check if a buffer has the identifier.\n        code_ += \"inline \\\\\";\n        code_ += \"bool {{STRUCT_NAME}}BufferHasIdentifier(const void *buf) {\";\n        code_ += \"  return ::flatbuffers::BufferHasIdentifier(\";\n        code_ += \"      buf, {{STRUCT_NAME}}Identifier());\";\n        code_ += \"}\";\n        code_ += \"\";\n\n        // Check if a size-prefixed buffer has the identifier.\n        code_ += \"inline \\\\\";\n        code_ +=\n            \"bool SizePrefixed{{STRUCT_NAME}}BufferHasIdentifier(const void \"\n            \"*buf) {\";\n        code_ += \"  return ::flatbuffers::BufferHasIdentifier(\";\n        code_ += \"      buf, {{STRUCT_NAME}}Identifier(), true);\";\n        code_ += \"}\";\n        code_ += \"\";\n      }\n\n      // The root verifier.\n      if (parser_.file_identifier_.length()) {\n        code_.SetValue(\"ID\", name + \"Identifier()\");\n      } else {\n        code_.SetValue(\"ID\", \"nullptr\");\n      }\n\n      code_ += \"template <bool B = false>\";\n      code_ += \"inline bool Verify{{STRUCT_NAME}}Buffer(\";\n      code_ += \"    ::flatbuffers::VerifierTemplate<B> &verifier) {\";\n      code_ += \"  return verifier.template VerifyBuffer<{{CPP_NAME}}>({{ID}});\";\n      code_ += \"}\";\n      code_ += \"\";\n\n      code_ += \"template <bool B = false>\";\n      code_ += \"inline bool VerifySizePrefixed{{STRUCT_NAME}}Buffer(\";\n      code_ += \"    ::flatbuffers::VerifierTemplate<B> &verifier) {\";\n      code_ +=\n          \"  return \"\n          \"verifier.template \"\n          \"VerifySizePrefixedBuffer<{{CPP_NAME}}{{SIZE_T}}>({{ID}});\";\n      code_ += \"}\";\n      code_ += \"\";\n\n      if (parser_.file_extension_.length()) {\n        // Return the extension\n        code_ += \"inline const char *{{STRUCT_NAME}}Extension() {\";\n        code_ += \"  return \\\"\" + parser_.file_extension_ + \"\\\";\";\n        code_ += \"}\";\n        code_ += \"\";\n      }\n\n      // Finish a buffer with a given root object:\n      code_ += \"inline void Finish{{STRUCT_NAME}}Buffer(\";\n      code_ += \"    \" + GetBuilder() + \" &fbb,\";\n      code_ += \"    ::flatbuffers::Offset<{{CPP_NAME}}> root) {\";\n      if (parser_.file_identifier_.length())\n        code_ += \"  fbb.Finish(root, {{STRUCT_NAME}}Identifier());\";\n      else\n        code_ += \"  fbb.Finish(root);\";\n      code_ += \"}\";\n      code_ += \"\";\n\n      code_ += \"inline void FinishSizePrefixed{{STRUCT_NAME}}Buffer(\";\n      code_ += \"    \" + GetBuilder() + \" &fbb,\";\n      code_ += \"    ::flatbuffers::Offset<{{CPP_NAME}}> root) {\";\n      if (parser_.file_identifier_.length())\n        code_ += \"  fbb.FinishSizePrefixed(root, {{STRUCT_NAME}}Identifier());\";\n      else\n        code_ += \"  fbb.FinishSizePrefixed(root);\";\n      code_ += \"}\";\n      code_ += \"\";\n\n      if (opts_.generate_object_based_api) {\n        // A convenient root unpack function.\n        auto native_name = WrapNativeNameInNameSpace(struct_def, opts_);\n        code_.SetValue(\"UNPACK_RETURN\",\n                       GenTypeNativePtr(native_name, nullptr, false));\n        code_.SetValue(\"UNPACK_TYPE\",\n                       GenTypeNativePtr(native_name, nullptr, true));\n\n        code_ += \"inline {{UNPACK_RETURN}} UnPack{{STRUCT_NAME}}(\";\n        code_ += \"    const void *buf,\";\n        code_ +=\n            \"    const ::flatbuffers::resolver_function_t *res = nullptr) {\";\n        code_ += \"  return {{UNPACK_TYPE}}\\\\\";\n        code_ += \"(Get{{STRUCT_NAME}}(buf)->UnPack(res));\";\n        code_ += \"}\";\n        code_ += \"\";\n\n        code_ += \"inline {{UNPACK_RETURN}} UnPackSizePrefixed{{STRUCT_NAME}}(\";\n        code_ += \"    const void *buf,\";\n        code_ +=\n            \"    const ::flatbuffers::resolver_function_t *res = nullptr) {\";\n        code_ += \"  return {{UNPACK_TYPE}}\\\\\";\n        code_ += \"(GetSizePrefixed{{STRUCT_NAME}}(buf)->UnPack(res));\";\n        code_ += \"}\";\n        code_ += \"\";\n      }\n    }\n\n    if (cur_name_space_) SetNameSpace(nullptr);\n\n    // Close the include guard.\n    code_ += \"#endif  // \" + include_guard;\n\n    const auto file_path = GeneratedFileName(path_, file_name_, opts_);\n    const auto final_code = code_.ToString();\n\n    // Save the file and optionally generate the binary schema code.\n    return parser_.opts.file_saver->SaveFile(\n        file_path.c_str(), final_code,\n        (!parser_.opts.binary_schema_gen_embed || generate_bfbs_embed()));\n  }\n\n private:\n  CodeWriter code_;\n\n  std::unordered_set<std::string> keywords_;\n\n  // This tracks the current namespace so we can insert namespace declarations.\n  const Namespace* cur_name_space_;\n\n  const IDLOptionsCpp opts_;\n  const TypedFloatConstantGenerator float_const_gen_;\n  bool needs_64_bit_builder_ = false;\n\n  const Namespace* CurrentNameSpace() const { return cur_name_space_; }\n\n  // Translates a qualified name in flatbuffer text format to the same name in\n  // the equivalent C++ namespace.\n  static std::string TranslateNameSpace(const std::string& qualified_name) {\n    std::string cpp_qualified_name = qualified_name;\n    size_t start_pos = 0;\n    while ((start_pos = cpp_qualified_name.find('.', start_pos)) !=\n           std::string::npos) {\n      cpp_qualified_name.replace(start_pos, 1, \"::\");\n    }\n    return cpp_qualified_name;\n  }\n\n  bool TypeHasKey(const Type& type) {\n    if (type.base_type != BASE_TYPE_STRUCT) {\n      return false;\n    }\n    for (auto& field : type.struct_def->fields.vec) {\n      if (field->key) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  bool VectorElementUserFacing(const Type& type) const {\n    return (opts_.scoped_enums && IsEnum(type)) ||\n           (opts_.g_cpp_std >= cpp::CPP_STD_17 && opts_.g_only_fixed_enums &&\n            IsEnum(type));\n  }\n\n  void GenComment(const std::vector<std::string>& dc, const char* prefix = \"\") {\n    std::string text;\n    ::flatbuffers::GenComment(dc, &text, nullptr, prefix);\n    code_ += text + \"\\\\\";\n  }\n\n  // Return a C++ type from the table in idl.h\n  std::string GenTypeBasic(const Type& type, bool user_facing_type) const {\n    if (user_facing_type) {\n      if (type.enum_def) return WrapInNameSpace(*type.enum_def);\n      if (type.base_type == BASE_TYPE_BOOL) return \"bool\";\n    }\n    // Get real underlying type for union type\n    auto base_type = type.base_type;\n    if (type.base_type == BASE_TYPE_UTYPE && type.enum_def != nullptr) {\n      base_type = type.enum_def->underlying_type.base_type;\n    }\n    return StringOf(base_type);\n  }\n\n  // Return a C++ pointer type, specialized to the actual struct/table types,\n  // and vector element types.\n  std::string GenTypePointer(const Type& type) const {\n    switch (type.base_type) {\n      case BASE_TYPE_STRING: {\n        return \"::flatbuffers::String\";\n      }\n      case BASE_TYPE_VECTOR64:\n      case BASE_TYPE_VECTOR: {\n        const auto type_name = GenTypeWire(\n            type.VectorType(), \"\", VectorElementUserFacing(type.VectorType()));\n        return \"::flatbuffers::Vector\" +\n               std::string((type.base_type == BASE_TYPE_VECTOR64) ? \"64<\"\n                                                                  : \"<\") +\n               type_name + \">\";\n      }\n      case BASE_TYPE_STRUCT: {\n        return WrapInNameSpace(*type.struct_def);\n      }\n      case BASE_TYPE_UNION:\n        // fall through\n      default: {\n        return \"void\";\n      }\n    }\n  }\n\n  // Return a C++ type for any type (scalar/pointer) specifically for\n  // building a flatbuffer.\n  std::string GenTypeWire(const Type& type, const char* postfix,\n                          bool user_facing_type,\n                          bool _64_bit_offset = false) const {\n    if (IsScalar(type.base_type)) {\n      return GenTypeBasic(type, user_facing_type) + postfix;\n    } else if (IsStruct(type)) {\n      return \"const \" + GenTypePointer(type) + \" *\";\n    } else {\n      return \"::flatbuffers::Offset\" + std::string(_64_bit_offset ? \"64\" : \"\") +\n             \"<\" + GenTypePointer(type) + \">\" + postfix;\n    }\n  }\n\n  // Return a C++ type for any type (scalar/pointer) that reflects its\n  // serialized size.\n  std::string GenTypeSize(const Type& type) const {\n    if (IsScalar(type.base_type)) {\n      return GenTypeBasic(type, false);\n    } else if (IsStruct(type)) {\n      return GenTypePointer(type);\n    } else {\n      return \"::flatbuffers::uoffset_t\";\n    }\n  }\n\n  std::string NullableExtension() {\n    return opts_.gen_nullable ? \" _Nullable \" : \"\";\n  }\n\n  static std::string NativeName(const std::string& name, const StructDef* sd,\n                                const IDLOptions& opts) {\n    // If the table is a native_type, return the native_type name.\n    const auto native_type = sd->attributes.Lookup(\"native_type\");\n    if (native_type && !sd->fixed) {\n      return native_type->constant;\n    }\n\n    return sd && !sd->fixed ? opts.object_prefix + name + opts.object_suffix\n                            : name;\n  }\n\n  std::string WrapNativeNameInNameSpace(const StructDef& struct_def,\n                                        const IDLOptions& opts) {\n    // If the table is a native_type, return the native_type name.\n    const auto native_type = struct_def.attributes.Lookup(\"native_type\");\n    if (native_type && !struct_def.fixed) {\n      return native_type->constant;\n    }\n    return WrapInNameSpace(struct_def.defined_namespace,\n                           NativeName(Name(struct_def), &struct_def, opts));\n  }\n\n  const std::string& PtrType(const FieldDef* field) {\n    auto attr = field ? field->attributes.Lookup(\"cpp_ptr_type\") : nullptr;\n    return attr ? attr->constant : opts_.cpp_object_api_pointer_type;\n  }\n\n  const std::string NativeString(const FieldDef* field) {\n    auto attr = field ? field->attributes.Lookup(\"cpp_str_type\") : nullptr;\n    auto& ret = attr ? attr->constant : opts_.cpp_object_api_string_type;\n    if (ret.empty()) {\n      return \"std::string\";\n    }\n    return ret;\n  }\n\n  bool FlexibleStringConstructor(const FieldDef* field) {\n    auto attr = field != nullptr &&\n                (field->attributes.Lookup(\"cpp_str_flex_ctor\") != nullptr);\n    auto ret = attr ? attr : opts_.cpp_object_api_string_flexible_constructor;\n    return ret && NativeString(field) !=\n                      \"std::string\";  // Only for custom string types.\n  }\n\n  std::string GenTypeNativePtr(const std::string& type, const FieldDef* field,\n                               bool is_constructor) {\n    auto& ptr_type = PtrType(field);\n    if (ptr_type != \"naked\") {\n      return (ptr_type != \"default_ptr_type\"\n                  ? ptr_type\n                  : opts_.cpp_object_api_pointer_type) +\n             \"<\" + type + \">\";\n    } else if (is_constructor) {\n      return \"\";\n    } else {\n      return type + \" *\";\n    }\n  }\n\n  std::string GenPtrGet(const FieldDef& field) {\n    auto cpp_ptr_type_get = field.attributes.Lookup(\"cpp_ptr_type_get\");\n    if (cpp_ptr_type_get) return cpp_ptr_type_get->constant;\n    auto& ptr_type = PtrType(&field);\n    return ptr_type == \"naked\" ? \"\" : \".get()\";\n  }\n\n  std::string GenOptionalNull() { return \"::flatbuffers::nullopt\"; }\n\n  std::string GenOptionalDecl(const Type& type) {\n    return \"::flatbuffers::Optional<\" + GenTypeBasic(type, true) + \">\";\n  }\n\n  std::string GenTypeNative(const Type& type, bool invector,\n                            const FieldDef& field, bool forcopy = false) {\n    switch (type.base_type) {\n      case BASE_TYPE_STRING: {\n        return NativeString(&field);\n      }\n      case BASE_TYPE_VECTOR64:\n      case BASE_TYPE_VECTOR: {\n        const auto type_name = GenTypeNative(type.VectorType(), true, field);\n        if (type.struct_def &&\n            type.struct_def->attributes.Lookup(\"native_custom_alloc\")) {\n          auto native_custom_alloc =\n              type.struct_def->attributes.Lookup(\"native_custom_alloc\");\n          return \"std::vector<\" + type_name + \",\" +\n                 native_custom_alloc->constant + \"<\" + type_name + \">>\";\n        } else {\n          return \"std::vector<\" + type_name + \">\";\n        }\n      }\n      case BASE_TYPE_STRUCT: {\n        auto type_name = WrapInNameSpace(*type.struct_def);\n        if (IsStruct(type)) {\n          auto native_type = type.struct_def->attributes.Lookup(\"native_type\");\n          if (native_type) {\n            type_name = native_type->constant;\n          }\n          if (invector || field.native_inline || forcopy) {\n            return type_name;\n          } else {\n            return GenTypeNativePtr(type_name, &field, false);\n          }\n        } else {\n          const auto nn = WrapNativeNameInNameSpace(*type.struct_def, opts_);\n          return (forcopy || field.native_inline)\n                     ? nn\n                     : GenTypeNativePtr(nn, &field, false);\n        }\n      }\n      case BASE_TYPE_UNION: {\n        auto type_name = WrapInNameSpace(*type.enum_def);\n        return type_name + \"Union\";\n      }\n      default: {\n        return field.IsScalarOptional() ? GenOptionalDecl(type)\n                                        : GenTypeBasic(type, true);\n      }\n    }\n  }\n\n  // Return a C++ type for any type (scalar/pointer) specifically for\n  // using a flatbuffer.\n  std::string GenTypeGet(const Type& type, const char* afterbasic,\n                         const char* beforeptr, const char* afterptr,\n                         bool user_facing_type) {\n    if (IsScalar(type.base_type)) {\n      return GenTypeBasic(type, user_facing_type) + afterbasic;\n    } else if (IsArray(type)) {\n      auto element_type = type.VectorType();\n      // Check if enum arrays are used in C++ without specifying --scoped-enums\n      if (IsEnum(element_type) && !opts_.g_only_fixed_enums) {\n        LogCompilerError(\n            \"--scoped-enums must be enabled to use enum arrays in C++\");\n        FLATBUFFERS_ASSERT(true);\n      }\n      return beforeptr +\n             (IsScalar(element_type.base_type)\n                  ? GenTypeBasic(element_type, user_facing_type)\n                  : GenTypePointer(element_type)) +\n             afterptr;\n    } else {\n      return beforeptr + GenTypePointer(type) + afterptr;\n    }\n  }\n\n  std::string GenTypeSpan(const Type& type, bool immutable, size_t extent) {\n    // Generate \"::flatbuffers::span<const U, extent>\".\n    FLATBUFFERS_ASSERT(IsSeries(type) && \"unexpected type\");\n    auto element_type = type.VectorType();\n    std::string text = \"::flatbuffers::span<\";\n    text += immutable ? \"const \" : \"\";\n    if (IsScalar(element_type.base_type)) {\n      text += GenTypeBasic(element_type, IsEnum(element_type));\n    } else {\n      switch (element_type.base_type) {\n        case BASE_TYPE_STRING: {\n          text += \"char\";\n          break;\n        }\n        case BASE_TYPE_STRUCT: {\n          FLATBUFFERS_ASSERT(type.struct_def);\n          text += WrapInNameSpace(*type.struct_def);\n          break;\n        }\n        default:\n          FLATBUFFERS_ASSERT(false && \"unexpected element's type\");\n          break;\n      }\n    }\n    if (extent != dynamic_extent) {\n      text += \", \";\n      text += NumToString(extent);\n    }\n    text += \"> \";\n    return text;\n  }\n\n  std::string GenEnumValDecl(const EnumDef& enum_def,\n                             const std::string& enum_val) const {\n    return opts_.prefixed_enums ? Name(enum_def) + \"_\" + enum_val : enum_val;\n  }\n\n  std::string GetEnumValUse(const EnumDef& enum_def,\n                            const EnumVal& enum_val) const {\n    if (opts_.scoped_enums) {\n      return Name(enum_def) + \"::\" + Name(enum_val);\n    } else if (opts_.prefixed_enums) {\n      return Name(enum_def) + \"_\" + Name(enum_val);\n    } else {\n      return Name(enum_val);\n    }\n  }\n\n  std::string StripUnionType(const std::string& name) {\n    return name.substr(0, name.size() - strlen(UnionTypeFieldSuffix()));\n  }\n\n  std::string GetUnionElement(const EnumVal& ev, bool native_type,\n                              const IDLOptions& opts) {\n    if (ev.union_type.base_type == BASE_TYPE_STRUCT) {\n      std::string name = ev.union_type.struct_def->name;\n      if (native_type) {\n        name = NativeName(std::move(name), ev.union_type.struct_def, opts);\n      }\n      return WrapInNameSpace(ev.union_type.struct_def->defined_namespace, name);\n    } else if (IsString(ev.union_type)) {\n      return native_type ? \"std::string\" : \"::flatbuffers::String\";\n    } else {\n      FLATBUFFERS_ASSERT(false);\n      return Name(ev);\n    }\n  }\n\n  // For the initial declaration, we specify the template parameters,\n  // including template default arguments.\n  std::string UnionVerifyTemplateDecl() { return \"template <bool B = false>\"; }\n\n  // For the subsequent definition, we must not redeclare the template default\n  // arguments.\n  std::string UnionVerifyTemplateDef() { return \"template <bool B>\"; }\n\n  // Should be used in conjunction with\n  // UnionVerifyTemplateDecl()/UnionVerifyTemplateDef().\n  std::string UnionVerifySignature(const EnumDef& enum_def) {\n    return \"bool Verify\" + Name(enum_def) +\n           \"(::flatbuffers::VerifierTemplate<B> &verifier, \" +\n           \"const void *obj, \" + Name(enum_def) + \" type)\";\n  }\n\n  // Should be used in conjunction with\n  // UnionVerifyTemplateDecl()/UnionVerifyTemplateDef().\n  std::string UnionVectorVerifySignature(const EnumDef& enum_def) {\n    const std::string name = Name(enum_def);\n    const std::string& type =\n        opts_.scoped_enums ? name\n                           : GenTypeBasic(enum_def.underlying_type, false);\n    return \"bool Verify\" + name + \"Vector\" +\n           \"(::flatbuffers::VerifierTemplate<B> &verifier, \" +\n           \"const ::flatbuffers::Vector<::flatbuffers::Offset<void>> \"\n           \"*values, \" +\n           \"const ::flatbuffers::Vector<\" + type + \"> *types)\";\n  }\n\n  std::string UnionUnPackSignature(const EnumDef& enum_def, bool inclass) {\n    return (inclass ? \"static \" : \"\") + std::string(\"void *\") +\n           (inclass ? \"\" : Name(enum_def) + \"Union::\") +\n           \"UnPack(const void *obj, \" + Name(enum_def) +\n           \" type, const ::flatbuffers::resolver_function_t *resolver)\";\n  }\n\n  std::string UnionPackSignature(const EnumDef& enum_def, bool inclass) {\n    return \"::flatbuffers::Offset<void> \" +\n           (inclass ? \"\" : Name(enum_def) + \"Union::\") + \"Pack(\" +\n           GetBuilder() + \" &_fbb, \" +\n           \"const ::flatbuffers::rehasher_function_t *_rehasher\" +\n           (inclass ? \" = nullptr\" : \"\") + \") const\";\n  }\n\n  std::string TableCreateSignature(const StructDef& struct_def, bool predecl,\n                                   const IDLOptions& opts) {\n    return \"::flatbuffers::Offset<\" + Name(struct_def) + \"> Create\" +\n           Name(struct_def) + \"(\" + GetBuilder() + \" &_fbb, const \" +\n           NativeName(Name(struct_def), &struct_def, opts) +\n           \" *_o, const ::flatbuffers::rehasher_function_t *_rehasher\" +\n           (predecl ? \" = nullptr\" : \"\") + \")\";\n  }\n\n  std::string TablePackSignature(const StructDef& struct_def, bool inclass,\n                                 const IDLOptions& opts) {\n    return std::string(inclass ? \"static \" : \"\") + \"::flatbuffers::Offset<\" +\n           Name(struct_def) + \"> \" + (inclass ? \"\" : Name(struct_def) + \"::\") +\n           \"Pack(\" + GetBuilder() + \" &_fbb, \" + \"const \" +\n           NativeName(Name(struct_def), &struct_def, opts) + \"* _o, \" +\n           \"const ::flatbuffers::rehasher_function_t *_rehasher\" +\n           (inclass ? \" = nullptr\" : \"\") + \")\";\n  }\n\n  std::string TableUnPackSignature(const StructDef& struct_def, bool inclass,\n                                   const IDLOptions& opts) {\n    return NativeName(Name(struct_def), &struct_def, opts) + \" *\" +\n           (inclass ? \"\" : Name(struct_def) + \"::\") +\n           \"UnPack(const ::flatbuffers::resolver_function_t *_resolver\" +\n           (inclass ? \" = nullptr\" : \"\") + \") const\";\n  }\n\n  std::string TableUnPackToSignature(const StructDef& struct_def, bool inclass,\n                                     const IDLOptions& opts) {\n    return \"void \" + (inclass ? \"\" : Name(struct_def) + \"::\") + \"UnPackTo(\" +\n           NativeName(Name(struct_def), &struct_def, opts) + \" *\" +\n           \"_o, const ::flatbuffers::resolver_function_t *_resolver\" +\n           (inclass ? \" = nullptr\" : \"\") + \") const\";\n  }\n\n  void GenMiniReflectPre(const StructDef* struct_def) {\n    code_.SetValue(\"NAME\", struct_def->name);\n    code_ += \"inline const ::flatbuffers::TypeTable *{{NAME}}TypeTable();\";\n    code_ += \"\";\n  }\n\n  void GenMiniReflect(const StructDef* struct_def, const EnumDef* enum_def) {\n    code_.SetValue(\"NAME\", struct_def ? struct_def->name : enum_def->name);\n    code_.SetValue(\"SEQ_TYPE\",\n                   struct_def ? (struct_def->fixed ? \"ST_STRUCT\" : \"ST_TABLE\")\n                              : (enum_def->is_union ? \"ST_UNION\" : \"ST_ENUM\"));\n    auto num_fields =\n        struct_def ? struct_def->fields.vec.size() : enum_def->size();\n    code_.SetValue(\"NUM_FIELDS\", NumToString(num_fields));\n    std::vector<std::string> names;\n    std::vector<Type> types;\n\n    if (struct_def) {\n      for (const auto& field : struct_def->fields.vec) {\n        names.push_back(Name(*field));\n        types.push_back(field->value.type);\n      }\n    } else {\n      for (auto it = enum_def->Vals().begin(); it != enum_def->Vals().end();\n           ++it) {\n        const auto& ev = **it;\n        names.push_back(Name(ev));\n        types.push_back(enum_def->is_union ? ev.union_type\n                                           : Type(enum_def->underlying_type));\n      }\n    }\n    std::string ts;\n    std::vector<std::string> type_refs;\n    std::vector<uint16_t> array_sizes;\n    for (auto& type : types) {\n      if (!ts.empty()) ts += \",\\n    \";\n      auto is_vector = IsVector(type);\n      auto is_array = IsArray(type);\n      auto bt = is_vector || is_array ? type.element : type.base_type;\n      auto et = IsScalar(bt) || bt == BASE_TYPE_STRING\n                    ? bt - BASE_TYPE_UTYPE + ET_UTYPE\n                    : ET_SEQUENCE;\n      int ref_idx = -1;\n      std::string ref_name = type.struct_def ? WrapInNameSpace(*type.struct_def)\n                             : type.enum_def ? WrapInNameSpace(*type.enum_def)\n                                             : \"\";\n      if (!ref_name.empty()) {\n        auto rit = type_refs.begin();\n        for (; rit != type_refs.end(); ++rit) {\n          if (*rit == ref_name) {\n            ref_idx = static_cast<int>(rit - type_refs.begin());\n            break;\n          }\n        }\n        if (rit == type_refs.end()) {\n          ref_idx = static_cast<int>(type_refs.size());\n          type_refs.push_back(ref_name);\n        }\n      }\n      if (is_array) {\n        array_sizes.push_back(type.fixed_length);\n      }\n      ts += \"{ ::flatbuffers::\" + std::string(ElementaryTypeNames()[et]) +\n            \", \" + NumToString(is_vector || is_array) + \", \" +\n            NumToString(ref_idx) + \" }\";\n    }\n    std::string rs;\n    for (auto& type_ref : type_refs) {\n      if (!rs.empty()) rs += \",\\n    \";\n      rs += type_ref + \"TypeTable\";\n    }\n    std::string as;\n    for (auto& array_size : array_sizes) {\n      as += NumToString(array_size);\n      as += \", \";\n    }\n    std::string ns;\n    for (auto& name : names) {\n      if (!ns.empty()) ns += \",\\n    \";\n      ns += \"\\\"\" + name + \"\\\"\";\n    }\n    std::string vs;\n    const auto consecutive_enum_from_zero =\n        enum_def && enum_def->MinValue()->IsZero() &&\n        ((enum_def->size() - 1) == enum_def->Distance());\n    if (enum_def && !consecutive_enum_from_zero) {\n      for (auto it = enum_def->Vals().begin(); it != enum_def->Vals().end();\n           ++it) {\n        const auto& ev = **it;\n        if (!vs.empty()) vs += \", \";\n        vs += NumToStringCpp(enum_def->ToString(ev),\n                             enum_def->underlying_type.base_type);\n      }\n    } else if (struct_def && struct_def->fixed) {\n      for (const auto field : struct_def->fields.vec) {\n        vs += NumToString(field->value.offset);\n        vs += \", \";\n      }\n      vs += NumToString(struct_def->bytesize);\n    }\n    code_.SetValue(\"TYPES\", ts);\n    code_.SetValue(\"REFS\", rs);\n    code_.SetValue(\"ARRAYSIZES\", as);\n    code_.SetValue(\"NAMES\", ns);\n    code_.SetValue(\"VALUES\", vs);\n    code_ += \"inline const ::flatbuffers::TypeTable *{{NAME}}TypeTable() {\";\n    if (num_fields) {\n      code_ += \"  static const ::flatbuffers::TypeCode type_codes[] = {\";\n      code_ += \"    {{TYPES}}\";\n      code_ += \"  };\";\n    }\n    if (!type_refs.empty()) {\n      code_ += \"  static const ::flatbuffers::TypeFunction type_refs[] = {\";\n      code_ += \"    {{REFS}}\";\n      code_ += \"  };\";\n    }\n    if (!as.empty()) {\n      code_ += \"  static const int16_t array_sizes[] = { {{ARRAYSIZES}} };\";\n    }\n    if (!vs.empty()) {\n      // Problem with uint64_t values greater than 9223372036854775807ULL.\n      code_ += \"  static const int64_t values[] = { {{VALUES}} };\";\n    }\n    auto has_names =\n        num_fields && opts_.mini_reflect == IDLOptions::kTypesAndNames;\n    if (has_names) {\n      code_ += \"  static const char * const names[] = {\";\n      code_ += \"    {{NAMES}}\";\n      code_ += \"  };\";\n    }\n    code_ += \"  static const ::flatbuffers::TypeTable tt = {\";\n    code_ += std::string(\"    ::flatbuffers::{{SEQ_TYPE}}, {{NUM_FIELDS}}, \") +\n             (num_fields ? \"type_codes, \" : \"nullptr, \") +\n             (!type_refs.empty() ? \"type_refs, \" : \"nullptr, \") +\n             (!as.empty() ? \"array_sizes, \" : \"nullptr, \") +\n             (!vs.empty() ? \"values, \" : \"nullptr, \") +\n             (has_names ? \"names\" : \"nullptr\");\n    code_ += \"  };\";\n    code_ += \"  return &tt;\";\n    code_ += \"}\";\n    code_ += \"\";\n  }\n\n  // Generate an enum declaration,\n  // an enum string lookup table,\n  // and an enum array of values\n\n  void GenEnum(const EnumDef& enum_def) {\n    code_.SetValue(\"ENUM_NAME\", Name(enum_def));\n    code_.SetValue(\"BASE_TYPE\", GenTypeBasic(enum_def.underlying_type, false));\n\n    GenComment(enum_def.doc_comment);\n    code_ +=\n        (opts_.scoped_enums ? \"enum class \" : \"enum \") + Name(enum_def) + \"\\\\\";\n    if (opts_.g_only_fixed_enums) {\n      code_ += \" : {{BASE_TYPE}}\\\\\";\n    }\n    code_ += \" {\";\n\n    code_.SetValue(\"SEP\", \",\");\n    auto add_sep = false;\n    for (const auto ev : enum_def.Vals()) {\n      if (add_sep) code_ += \"{{SEP}}\";\n      GenComment(ev->doc_comment, \"  \");\n      code_.SetValue(\"KEY\", GenEnumValDecl(enum_def, Name(*ev)));\n      code_.SetValue(\"VALUE\",\n                     NumToStringCpp(enum_def.ToString(*ev),\n                                    enum_def.underlying_type.base_type));\n      code_ += \"  {{KEY}} = {{VALUE}}\\\\\";\n      add_sep = true;\n    }\n    if (opts_.cpp_minify_enums) {\n      code_ += \"\";\n      code_ += \"};\";\n      return;\n    }\n    const EnumVal* minv = enum_def.MinValue();\n    const EnumVal* maxv = enum_def.MaxValue();\n\n    if (opts_.scoped_enums || opts_.prefixed_enums) {\n      FLATBUFFERS_ASSERT(minv && maxv);\n\n      code_.SetValue(\"SEP\", \",\\n\");\n\n      // MIN & MAX are useless for bit_flags\n      if (enum_def.attributes.Lookup(\"bit_flags\")) {\n        code_.SetValue(\"KEY\", GenEnumValDecl(enum_def, \"NONE\"));\n        code_.SetValue(\"VALUE\", \"0\");\n        code_ += \"{{SEP}}  {{KEY}} = {{VALUE}}\\\\\";\n\n        code_.SetValue(\"KEY\", GenEnumValDecl(enum_def, \"ANY\"));\n        code_.SetValue(\"VALUE\",\n                       NumToStringCpp(enum_def.AllFlags(),\n                                      enum_def.underlying_type.base_type));\n        code_ += \"{{SEP}}  {{KEY}} = {{VALUE}}\\\\\";\n      } else if (opts_.emit_min_max_enum_values) {\n        code_.SetValue(\"KEY\", GenEnumValDecl(enum_def, \"MIN\"));\n        code_.SetValue(\"VALUE\", GenEnumValDecl(enum_def, Name(*minv)));\n        code_ += \"{{SEP}}  {{KEY}} = {{VALUE}}\\\\\";\n\n        code_.SetValue(\"KEY\", GenEnumValDecl(enum_def, \"MAX\"));\n        code_.SetValue(\"VALUE\", GenEnumValDecl(enum_def, Name(*maxv)));\n        code_ += \"{{SEP}}  {{KEY}} = {{VALUE}}\\\\\";\n      }\n    }\n    code_ += \"\";\n    code_ += \"};\";\n\n    if (opts_.scoped_enums && enum_def.attributes.Lookup(\"bit_flags\")) {\n      code_ +=\n          \"FLATBUFFERS_DEFINE_BITMASK_OPERATORS({{ENUM_NAME}}, {{BASE_TYPE}})\";\n    }\n    code_ += \"\";\n    GenEnumArray(enum_def);\n    GenEnumStringTable(enum_def);\n\n    // Generate type traits for unions to map from a type to union enum value.\n    if (enum_def.is_union && !enum_def.uses_multiple_type_instances) {\n      for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end();\n           ++it) {\n        const auto& ev = **it;\n\n        if (it == enum_def.Vals().begin()) {\n          code_ += \"template<typename T> struct {{ENUM_NAME}}Traits {\";\n        } else {\n          auto name = GetUnionElement(ev, false, opts_);\n          code_ += \"template<> struct {{ENUM_NAME}}Traits<\" + name + \"> {\";\n        }\n\n        auto value = GetEnumValUse(enum_def, ev);\n        code_ += \"  static const {{ENUM_NAME}} enum_value = \" + value + \";\";\n        code_ += \"};\";\n        code_ += \"\";\n      }\n    }\n\n    GenEnumObjectBasedAPI(enum_def);\n\n    if (enum_def.is_union) {\n      code_ += UnionVerifyTemplateDecl();\n      code_ += UnionVerifySignature(enum_def) + \";\";\n      code_ += UnionVerifyTemplateDecl();\n      code_ += UnionVectorVerifySignature(enum_def) + \";\";\n      code_ += \"\";\n    }\n  }\n\n  // Generate a union type and a trait type for it.\n  void GenEnumObjectBasedAPI(const EnumDef& enum_def) {\n    if (!(opts_.generate_object_based_api && enum_def.is_union)) {\n      return;\n    }\n    code_.SetValue(\"NAME\", Name(enum_def));\n    FLATBUFFERS_ASSERT(enum_def.Lookup(\"NONE\"));\n    code_.SetValue(\"NONE\", GetEnumValUse(enum_def, *enum_def.Lookup(\"NONE\")));\n\n    if (!enum_def.uses_multiple_type_instances) {\n      for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end();\n           ++it) {\n        const auto& ev = **it;\n\n        if (it == enum_def.Vals().begin()) {\n          code_ += \"template<typename T> struct {{NAME}}UnionTraits {\";\n        } else {\n          auto name = GetUnionElement(ev, true, opts_);\n          code_ += \"template<> struct {{NAME}}UnionTraits<\" + name + \"> {\";\n        }\n\n        auto value = GetEnumValUse(enum_def, ev);\n        code_ += \"  static const {{ENUM_NAME}} enum_value = \" + value + \";\";\n        code_ += \"};\";\n        code_ += \"\";\n      }\n    }\n\n    code_ += \"struct {{NAME}}Union {\";\n    code_ += \"  {{NAME}} type;\";\n    code_ += \"  void *value;\";\n    code_ += \"\";\n    code_ += \"  {{NAME}}Union() : type({{NONE}}), value(nullptr) {}\";\n    code_ += \"  {{NAME}}Union({{NAME}}Union&& u) FLATBUFFERS_NOEXCEPT :\";\n    code_ += \"    type({{NONE}}), value(nullptr)\";\n    code_ += \"    { std::swap(type, u.type); std::swap(value, u.value); }\";\n    code_ += \"  {{NAME}}Union(const {{NAME}}Union &);\";\n    code_ += \"  {{NAME}}Union &operator=(const {{NAME}}Union &u)\";\n    code_ +=\n        \"    { {{NAME}}Union t(u); std::swap(type, t.type); std::swap(value, \"\n        \"t.value); return *this; }\";\n    code_ +=\n        \"  {{NAME}}Union &operator=({{NAME}}Union &&u) FLATBUFFERS_NOEXCEPT\";\n    code_ +=\n        \"    { std::swap(type, u.type); std::swap(value, u.value); return \"\n        \"*this; }\";\n    code_ += \"  ~{{NAME}}Union() { Reset(); }\";\n    code_ += \"\";\n    code_ += \"  void Reset();\";\n    code_ += \"\";\n    if (!enum_def.uses_multiple_type_instances) {\n      code_ += \"  template <typename T>\";\n      code_ += \"  void Set(T&& val) {\";\n      code_ += \"    typedef typename std::remove_reference<T>::type RT;\";\n      code_ += \"    Reset();\";\n      code_ += \"    type = {{NAME}}UnionTraits<RT>::enum_value;\";\n      code_ += \"    if (type != {{NONE}}) {\";\n      code_ += \"      value = new RT(std::forward<T>(val));\";\n      code_ += \"    }\";\n      code_ += \"  }\";\n      code_ += \"\";\n    }\n    code_ += \"  \" + UnionUnPackSignature(enum_def, true) + \";\";\n    code_ += \"  \" + UnionPackSignature(enum_def, true) + \";\";\n    code_ += \"\";\n\n    for (const auto ev : enum_def.Vals()) {\n      if (ev->IsZero()) {\n        continue;\n      }\n\n      const auto native_type = GetUnionElement(*ev, true, opts_);\n      code_.SetValue(\"NATIVE_TYPE\", native_type);\n      code_.SetValue(\"NATIVE_NAME\", Name(*ev));\n      code_.SetValue(\"NATIVE_ID\", GetEnumValUse(enum_def, *ev));\n\n      code_ += \"  {{NATIVE_TYPE}} *As{{NATIVE_NAME}}() {\";\n      code_ += \"    return type == {{NATIVE_ID}} ?\";\n      code_ += \"      reinterpret_cast<{{NATIVE_TYPE}} *>(value) : nullptr;\";\n      code_ += \"  }\";\n\n      code_ += \"  const {{NATIVE_TYPE}} *As{{NATIVE_NAME}}() const {\";\n      code_ += \"    return type == {{NATIVE_ID}} ?\";\n      code_ +=\n          \"      reinterpret_cast<const {{NATIVE_TYPE}} *>(value) : nullptr;\";\n      code_ += \"  }\";\n    }\n    code_ += \"};\";\n    code_ += \"\";\n\n    GenEnumEquals(enum_def);\n  }\n\n  void GenEnumEquals(const EnumDef& enum_def) {\n    if (opts_.gen_compare) {\n      code_ += \"\";\n      code_ +=\n          \"inline bool operator==(const {{NAME}}Union &lhs, const \"\n          \"{{NAME}}Union &rhs) {\";\n      code_ += \"  if (lhs.type != rhs.type) return false;\";\n      code_ += \"  switch (lhs.type) {\";\n\n      for (const auto& ev : enum_def.Vals()) {\n        code_.SetValue(\"NATIVE_ID\", GetEnumValUse(enum_def, *ev));\n        if (ev->IsNonZero()) {\n          const auto native_type = GetUnionElement(*ev, true, opts_);\n          code_.SetValue(\"NATIVE_TYPE\", native_type);\n          code_ += \"    case {{NATIVE_ID}}: {\";\n          code_ +=\n              \"      return *(reinterpret_cast<const {{NATIVE_TYPE}} \"\n              \"*>(lhs.value)) ==\";\n          code_ +=\n              \"             *(reinterpret_cast<const {{NATIVE_TYPE}} \"\n              \"*>(rhs.value));\";\n          code_ += \"    }\";\n        } else {\n          code_ += \"    case {{NATIVE_ID}}: {\";\n          code_ += \"      return true;\";  // \"NONE\" enum value.\n          code_ += \"    }\";\n        }\n      }\n      code_ += \"    default: {\";\n      code_ += \"      return false;\";\n      code_ += \"    }\";\n      code_ += \"  }\";\n      code_ += \"}\";\n\n      code_ += \"\";\n      code_ +=\n          \"inline bool operator!=(const {{NAME}}Union &lhs, const \"\n          \"{{NAME}}Union &rhs) {\";\n      code_ += \"    return !(lhs == rhs);\";\n      code_ += \"}\";\n      code_ += \"\";\n    }\n  }\n\n  // Generate an array of all enumeration values\n  void GenEnumArray(const EnumDef& enum_def) {\n    auto num_fields = NumToString(enum_def.size());\n    code_ += \"inline const {{ENUM_NAME}} (&EnumValues{{ENUM_NAME}}())[\" +\n             num_fields + \"] {\";\n    code_ += \"  static const {{ENUM_NAME}} values[] = {\";\n    for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {\n      const auto& ev = **it;\n      auto value = GetEnumValUse(enum_def, ev);\n      auto suffix = *it != enum_def.Vals().back() ? \",\" : \"\";\n      code_ += \"    \" + value + suffix;\n    }\n    code_ += \"  };\";\n    code_ += \"  return values;\";\n    code_ += \"}\";\n    code_ += \"\";\n  }\n\n  // Generate a string table for enum values.\n  // Problem is, if values are very sparse that could generate huge tables.\n  // Ideally in that case we generate a map lookup instead, but for the moment\n  // we simply don't output a table at all.\n  void GenEnumStringTable(const EnumDef& enum_def) {\n    auto range = enum_def.Distance();\n    // Average distance between values above which we consider a table\n    // \"too sparse\". Change at will.\n    static const uint64_t kMaxSparseness = 5;\n    if (range / static_cast<uint64_t>(enum_def.size()) < kMaxSparseness) {\n      code_ += \"inline const char * const *EnumNames{{ENUM_NAME}}() {\";\n      code_ += \"  static const char * const names[\" +\n               NumToString(range + 1 + 1) + \"] = {\";\n\n      auto val = enum_def.Vals().front();\n      for (const auto& enum_value : enum_def.Vals()) {\n        for (auto k = enum_def.Distance(val, enum_value); k > 1; --k) {\n          code_ += \"    \\\"\\\",\";\n        }\n        val = enum_value;\n        code_ += \"    \\\"\" + Name(*enum_value) + \"\\\",\";\n      }\n      code_ += \"    nullptr\";\n      code_ += \"  };\";\n\n      code_ += \"  return names;\";\n      code_ += \"}\";\n      code_ += \"\";\n\n      code_ += \"inline const char *EnumName{{ENUM_NAME}}({{ENUM_NAME}} e) {\";\n\n      code_ += \"  if (::flatbuffers::IsOutRange(e, \" +\n               GetEnumValUse(enum_def, *enum_def.MinValue()) + \", \" +\n               GetEnumValUse(enum_def, *enum_def.MaxValue()) +\n               \")) return \\\"\\\";\";\n\n      code_ += \"  const size_t index = static_cast<size_t>(e)\\\\\";\n      if (enum_def.MinValue()->IsNonZero()) {\n        auto vals = GetEnumValUse(enum_def, *enum_def.MinValue());\n        code_ += \" - static_cast<size_t>(\" + vals + \")\\\\\";\n      }\n      code_ += \";\";\n\n      code_ += \"  return EnumNames{{ENUM_NAME}}()[index];\";\n      code_ += \"}\";\n      code_ += \"\";\n    } else {\n      code_ += \"inline const char *EnumName{{ENUM_NAME}}({{ENUM_NAME}} e) {\";\n      code_ += \"  switch (e) {\";\n      for (const auto& ev : enum_def.Vals()) {\n        code_ += \"    case \" + GetEnumValUse(enum_def, *ev) + \": return \\\"\" +\n                 Name(*ev) + \"\\\";\";\n      }\n      code_ += \"    default: return \\\"\\\";\";\n      code_ += \"  }\";\n      code_ += \"}\";\n      code_ += \"\";\n    }\n  }\n\n  void GenUnionPost(const EnumDef& enum_def) {\n    // Generate a verifier function for this union that can be called by the\n    // table verifier functions. It uses a switch case to select a specific\n    // verifier function to call, this should be safe even if the union type\n    // has been corrupted, since the verifiers will simply fail when called\n    // on the wrong type.\n    code_.SetValue(\"ENUM_NAME\", Name(enum_def));\n\n    code_ += UnionVerifyTemplateDef();\n    code_ += \"inline \" + UnionVerifySignature(enum_def) + \" {\";\n    code_ += \"  switch (type) {\";\n    for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {\n      const auto& ev = **it;\n      code_.SetValue(\"LABEL\", GetEnumValUse(enum_def, ev));\n\n      if (ev.IsNonZero()) {\n        code_.SetValue(\"TYPE\", GetUnionElement(ev, false, opts_));\n        code_ += \"    case {{LABEL}}: {\";\n        auto getptr =\n            \"      auto ptr = reinterpret_cast<const {{TYPE}} *>(obj);\";\n        if (ev.union_type.base_type == BASE_TYPE_STRUCT) {\n          if (ev.union_type.struct_def->fixed) {\n            code_.SetValue(\"ALIGN\",\n                           NumToString(ev.union_type.struct_def->minalign));\n            code_ +=\n                \"      return verifier.template VerifyField<{{TYPE}}>(\"\n                \"static_cast<const uint8_t *>(obj), 0, {{ALIGN}});\";\n          } else {\n            code_ += getptr;\n            code_ += \"      return verifier.VerifyTable(ptr);\";\n          }\n        } else if (IsString(ev.union_type)) {\n          code_ += getptr;\n          code_ += \"      return verifier.VerifyString(ptr);\";\n        } else {\n          FLATBUFFERS_ASSERT(false);\n        }\n        code_ += \"    }\";\n      } else {\n        code_ += \"    case {{LABEL}}: {\";\n        code_ += \"      return true;\";  // \"NONE\" enum value.\n        code_ += \"    }\";\n      }\n    }\n    code_ += \"    default: return true;\";  // unknown values are OK.\n    code_ += \"  }\";\n    code_ += \"}\";\n    code_ += \"\";\n\n    code_ += UnionVerifyTemplateDef();\n    code_ += \"inline \" + UnionVectorVerifySignature(enum_def) + \" {\";\n    code_ += \"  if (!values || !types) return !values && !types;\";\n    code_ += \"  if (values->size() != types->size()) return false;\";\n    code_ +=\n        \"  for (::flatbuffers::uoffset_t i = 0; i < values->size(); ++i) {\";\n    code_ += \"    if (!Verify\" + Name(enum_def) + \"(\";\n    code_ += \"        verifier,  values->Get(i), types->GetEnum<\" +\n             Name(enum_def) + \">(i))) {\";\n    code_ += \"      return false;\";\n    code_ += \"    }\";\n    code_ += \"  }\";\n    code_ += \"  return true;\";\n    code_ += \"}\";\n    code_ += \"\";\n\n    if (opts_.generate_object_based_api) {\n      // Generate union Unpack() and Pack() functions.\n      code_ += \"inline \" + UnionUnPackSignature(enum_def, false) + \" {\";\n      code_ += \"  (void)resolver;\";\n      code_ += \"  switch (type) {\";\n      for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end();\n           ++it) {\n        const auto& ev = **it;\n        if (ev.IsZero()) {\n          continue;\n        }\n\n        code_.SetValue(\"LABEL\", GetEnumValUse(enum_def, ev));\n        code_.SetValue(\"TYPE\", GetUnionElement(ev, false, opts_));\n        code_ += \"    case {{LABEL}}: {\";\n        code_ += \"      auto ptr = reinterpret_cast<const {{TYPE}} *>(obj);\";\n        if (ev.union_type.base_type == BASE_TYPE_STRUCT) {\n          if (ev.union_type.struct_def->fixed) {\n            code_ += \"      return new \" +\n                     WrapInNameSpace(*ev.union_type.struct_def) + \"(*ptr);\";\n          } else {\n            code_ += \"      return ptr->UnPack(resolver);\";\n          }\n        } else if (IsString(ev.union_type)) {\n          code_ += \"      return new std::string(ptr->c_str(), ptr->size());\";\n        } else {\n          FLATBUFFERS_ASSERT(false);\n        }\n        code_ += \"    }\";\n      }\n      code_ += \"    default: return nullptr;\";\n      code_ += \"  }\";\n      code_ += \"}\";\n      code_ += \"\";\n\n      code_ += \"inline \" + UnionPackSignature(enum_def, false) + \" {\";\n      code_ += \"  (void)_rehasher;\";\n      code_ += \"  switch (type) {\";\n      for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end();\n           ++it) {\n        auto& ev = **it;\n        if (ev.IsZero()) {\n          continue;\n        }\n\n        code_.SetValue(\"LABEL\", GetEnumValUse(enum_def, ev));\n        code_.SetValue(\"TYPE\", GetUnionElement(ev, true, opts_));\n        code_ += \"    case {{LABEL}}: {\";\n        code_ += \"      auto ptr = reinterpret_cast<const {{TYPE}} *>(value);\";\n        if (ev.union_type.base_type == BASE_TYPE_STRUCT) {\n          if (ev.union_type.struct_def->fixed) {\n            code_ += \"      return _fbb.CreateStruct(*ptr).Union();\";\n          } else {\n            code_.SetValue(\"NAME\", ev.union_type.struct_def->name);\n            code_ +=\n                \"      return Create{{NAME}}(_fbb, ptr, _rehasher).Union();\";\n          }\n        } else if (IsString(ev.union_type)) {\n          code_ += \"      return _fbb.CreateString(*ptr).Union();\";\n        } else {\n          FLATBUFFERS_ASSERT(false);\n        }\n        code_ += \"    }\";\n      }\n      code_ += \"    default: return 0;\";\n      code_ += \"  }\";\n      code_ += \"}\";\n      code_ += \"\";\n\n      // Union copy constructor\n      code_ +=\n          \"inline {{ENUM_NAME}}Union::{{ENUM_NAME}}Union(const \"\n          \"{{ENUM_NAME}}Union &u) : type(u.type), value(nullptr) {\";\n      code_ += \"  switch (type) {\";\n      for (const auto& ev : enum_def.Vals()) {\n        if (ev->IsZero()) {\n          continue;\n        }\n        code_.SetValue(\"LABEL\", GetEnumValUse(enum_def, *ev));\n        code_.SetValue(\"TYPE\", GetUnionElement(*ev, true, opts_));\n        code_ += \"    case {{LABEL}}: {\";\n        bool copyable = true;\n        if (opts_.g_cpp_std < cpp::CPP_STD_11 &&\n            ev->union_type.base_type == BASE_TYPE_STRUCT &&\n            !ev->union_type.struct_def->fixed) {\n          // Don't generate code to copy if table is not copyable.\n          // TODO(wvo): make tables copyable instead.\n          for (const auto& field : ev->union_type.struct_def->fields.vec) {\n            if (!field->deprecated && field->value.type.struct_def &&\n                !field->native_inline) {\n              copyable = false;\n              break;\n            }\n          }\n        }\n        if (copyable) {\n          code_ +=\n              \"      value = new {{TYPE}}(*reinterpret_cast<{{TYPE}} *>\"\n              \"(u.value));\";\n        } else {\n          code_ +=\n              \"      FLATBUFFERS_ASSERT(false);  // {{TYPE}} not copyable.\";\n        }\n        code_ += \"      break;\";\n        code_ += \"    }\";\n      }\n      code_ += \"    default:\";\n      code_ += \"      break;\";\n      code_ += \"  }\";\n      code_ += \"}\";\n      code_ += \"\";\n\n      // Union Reset() function.\n      FLATBUFFERS_ASSERT(enum_def.Lookup(\"NONE\"));\n      code_.SetValue(\"NONE\", GetEnumValUse(enum_def, *enum_def.Lookup(\"NONE\")));\n\n      code_ += \"inline void {{ENUM_NAME}}Union::Reset() {\";\n      code_ += \"  switch (type) {\";\n      for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end();\n           ++it) {\n        const auto& ev = **it;\n        if (ev.IsZero()) {\n          continue;\n        }\n        code_.SetValue(\"LABEL\", GetEnumValUse(enum_def, ev));\n        code_.SetValue(\"TYPE\", GetUnionElement(ev, true, opts_));\n        code_ += \"    case {{LABEL}}: {\";\n        code_ += \"      auto ptr = reinterpret_cast<{{TYPE}} *>(value);\";\n        code_ += \"      delete ptr;\";\n        code_ += \"      break;\";\n        code_ += \"    }\";\n      }\n      code_ += \"    default: break;\";\n      code_ += \"  }\";\n      code_ += \"  value = nullptr;\";\n      code_ += \"  type = {{NONE}};\";\n      code_ += \"}\";\n      code_ += \"\";\n    }\n  }\n\n  // Generates a value with optionally a cast applied if the field has a\n  // different underlying type from its interface type (currently only the\n  // case for enums. \"from\" specify the direction, true meaning from the\n  // underlying type to the interface type.\n  std::string GenUnderlyingCast(const FieldDef& field, bool from,\n                                const std::string& val) {\n    if (from && field.value.type.base_type == BASE_TYPE_BOOL) {\n      return val + \" != 0\";\n    } else if ((field.value.type.enum_def &&\n                IsScalar(field.value.type.base_type)) ||\n               field.value.type.base_type == BASE_TYPE_BOOL) {\n      return \"static_cast<\" + GenTypeBasic(field.value.type, from) + \">(\" +\n             val + \")\";\n    } else {\n      return val;\n    }\n  }\n\n  std::string GenFieldOffsetName(const FieldDef& field) {\n    std::string uname = Name(field);\n    std::transform(uname.begin(), uname.end(), uname.begin(), CharToUpper);\n    return \"VT_\" + uname;\n  }\n\n  void GenFullyQualifiedNameGetter(const StructDef& struct_def,\n                                   const std::string& name) {\n    if (!opts_.generate_name_strings) {\n      return;\n    }\n    auto fullname = struct_def.defined_namespace->GetFullyQualifiedName(name);\n    code_.SetValue(\"NAME\", fullname);\n    code_.SetValue(\"CONSTEXPR\", \"FLATBUFFERS_CONSTEXPR_CPP11\");\n    code_ += \"  static {{CONSTEXPR}} const char *GetFullyQualifiedName() {\";\n    code_ += \"    return \\\"{{NAME}}\\\";\";\n    code_ += \"  }\";\n  }\n\n  std::string GenDefaultConstant(const FieldDef& field) {\n    if (IsFloat(field.value.type.base_type))\n      return float_const_gen_.GenFloatConstant(field);\n    else\n      return NumToStringCpp(field.value.constant, field.value.type.base_type);\n  }\n\n  std::string GetDefaultScalarValue(const FieldDef& field, bool is_ctor) {\n    const auto& type = field.value.type;\n    if (field.IsScalarOptional()) {\n      return GenOptionalNull();\n    } else if (type.enum_def && IsScalar(type.base_type)) {\n      auto ev = type.enum_def->FindByValue(field.value.constant);\n      if (ev) {\n        return WrapInNameSpace(type.enum_def->defined_namespace,\n                               GetEnumValUse(*type.enum_def, *ev));\n      } else {\n        return GenUnderlyingCast(\n            field, true, NumToStringCpp(field.value.constant, type.base_type));\n      }\n    } else if (type.base_type == BASE_TYPE_BOOL) {\n      return field.value.constant == \"0\" ? \"false\" : \"true\";\n    } else if (field.attributes.Lookup(\"cpp_type\")) {\n      if (is_ctor) {\n        if (PtrType(&field) == \"naked\") {\n          return \"nullptr\";\n        } else {\n          return \"\";\n        }\n      } else {\n        return \"0\";\n      }\n    } else if (IsVector(type) && field.value.constant == \"[]\") {\n      return \"0\";\n    } else if (IsString(type) && field.value.constant != \"0\") {\n      return \"0\";\n    } else if (IsStruct(type) && (field.value.constant == \"0\")) {\n      return \"nullptr\";\n    } else {\n      return GenDefaultConstant(field);\n    }\n  }\n\n  void GenParam(const FieldDef& field, bool direct, const char* prefix) {\n    code_.SetValue(\"PRE\", prefix);\n    code_.SetValue(\"PARAM_NAME\", Name(field));\n    if (direct && IsString(field.value.type)) {\n      code_.SetValue(\"PARAM_TYPE\", \"const char *\");\n      code_.SetValue(\"PARAM_VALUE\", \"nullptr\");\n    } else if (direct && IsVector(field.value.type)) {\n      const auto vtype = field.value.type.VectorType();\n      std::string type;\n      if (IsStruct(vtype)) {\n        type = WrapInNameSpace(*vtype.struct_def);\n      } else {\n        type = GenTypeWire(vtype, \"\", VectorElementUserFacing(vtype),\n                           field.offset64);\n      }\n      if (TypeHasKey(vtype)) {\n        code_.SetValue(\"PARAM_TYPE\", \"std::vector<\" + type + \"> *\");\n      } else {\n        code_.SetValue(\"PARAM_TYPE\", \"const std::vector<\" + type + \"> *\");\n      }\n      code_.SetValue(\"PARAM_VALUE\", \"nullptr\");\n    } else {\n      const auto& type = field.value.type;\n      code_.SetValue(\"PARAM_VALUE\", GetDefaultScalarValue(field, false));\n      if (field.IsScalarOptional())\n        code_.SetValue(\"PARAM_TYPE\", GenOptionalDecl(type) + \" \");\n      else\n        code_.SetValue(\"PARAM_TYPE\",\n                       GenTypeWire(type, \" \", true, field.offset64));\n    }\n    code_ += \"{{PRE}}{{PARAM_TYPE}}{{PARAM_NAME}} = {{PARAM_VALUE}}\\\\\";\n  }\n\n  // Generate a member, including a default value for scalars and raw pointers.\n  void GenMember(const FieldDef& field) {\n    if (!field.deprecated &&  // Deprecated fields won't be accessible.\n        field.value.type.base_type != BASE_TYPE_UTYPE &&\n        (!IsVector(field.value.type) ||\n         field.value.type.element != BASE_TYPE_UTYPE)) {\n      auto type = GenTypeNative(field.value.type, false, field);\n      auto cpp_type = field.attributes.Lookup(\"cpp_type\");\n      const std::string& full_type =\n          (cpp_type\n               ? (IsVector(field.value.type)\n                      ? \"std::vector<\" +\n                            GenTypeNativePtr(cpp_type->constant, &field,\n                                             false) +\n                            \"> \"\n                      : GenTypeNativePtr(cpp_type->constant, &field, false))\n               : type + \" \");\n      // Generate default member initializers for >= C++11.\n      std::string field_di;\n      if (opts_.g_cpp_std >= cpp::CPP_STD_11) {\n        field_di = \"{}\";\n        auto native_default = field.attributes.Lookup(\"native_default\");\n        // Scalar types get parsed defaults, raw pointers get nullptrs.\n        if (IsScalar(field.value.type.base_type)) {\n          field_di =\n              \" = \" + (native_default ? std::string(native_default->constant)\n                                      : GetDefaultScalarValue(field, true));\n        } else if (field.value.type.base_type == BASE_TYPE_STRUCT) {\n          if (IsStruct(field.value.type) && native_default) {\n            field_di = \" = \" + native_default->constant;\n          }\n        }\n      }\n      code_.SetValue(\"FIELD_TYPE\", full_type);\n      code_.SetValue(\"FIELD_NAME\", Name(field));\n      code_.SetValue(\"FIELD_DI\", field_di);\n      code_ += \"  {{FIELD_TYPE}}{{FIELD_NAME}}{{FIELD_DI}};\";\n    }\n  }\n\n  // Returns true if `struct_def` needs a copy constructor and assignment\n  // operator because it has one or more table members, struct members with a\n  // custom cpp_type and non-naked pointer type, or vector members of those.\n  bool NeedsCopyCtorAssignOp(const StructDef& struct_def) {\n    for (const auto& field : struct_def.fields.vec) {\n      const auto& type = field->value.type;\n      if (field->deprecated) continue;\n      if (type.base_type == BASE_TYPE_STRUCT) {\n        const auto cpp_type = field->attributes.Lookup(\"cpp_type\");\n        const auto cpp_ptr_type = field->attributes.Lookup(\"cpp_ptr_type\");\n        const bool is_ptr = !(IsStruct(type) && field->native_inline) ||\n                            (cpp_type && cpp_ptr_type->constant != \"naked\");\n        if (is_ptr) {\n          return true;\n        }\n      } else if (IsVector(type)) {\n        const auto vec_type = type.VectorType();\n        if (vec_type.base_type == BASE_TYPE_UTYPE) continue;\n        const auto cpp_type = field->attributes.Lookup(\"cpp_type\");\n        const auto cpp_ptr_type = field->attributes.Lookup(\"cpp_ptr_type\");\n        const bool is_ptr = IsVectorOfPointers(*field) ||\n                            (cpp_type && cpp_ptr_type->constant != \"naked\");\n        if (is_ptr) {\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n\n  // Generate the default constructor for this struct. Properly initialize all\n  // scalar members with default values.\n  void GenDefaultConstructor(const StructDef& struct_def) {\n    code_.SetValue(\"NATIVE_NAME\",\n                   NativeName(Name(struct_def), &struct_def, opts_));\n    // In >= C++11, default member initializers are generated. To allow for\n    // aggregate initialization, do not emit a default constructor at all, with\n    // the exception of types that need a copy/move ctors and assignment\n    // operators.\n    if (opts_.g_cpp_std >= cpp::CPP_STD_11) {\n      if (NeedsCopyCtorAssignOp(struct_def)) {\n        code_ += \"  {{NATIVE_NAME}}() = default;\";\n      }\n      return;\n    }\n    std::string initializer_list;\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      const auto& field = **it;\n      if (!field.deprecated &&  // Deprecated fields won't be accessible.\n          field.value.type.base_type != BASE_TYPE_UTYPE) {\n        auto cpp_type = field.attributes.Lookup(\"cpp_type\");\n        auto native_default = field.attributes.Lookup(\"native_default\");\n        // Scalar types get parsed defaults, raw pointers get nullptrs.\n        if (IsScalar(field.value.type.base_type)) {\n          if (!initializer_list.empty()) {\n            initializer_list += \",\\n        \";\n          }\n          initializer_list += Name(field);\n          initializer_list +=\n              \"(\" +\n              (native_default ? std::string(native_default->constant)\n                              : GetDefaultScalarValue(field, true)) +\n              \")\";\n        } else if (field.value.type.base_type == BASE_TYPE_STRUCT) {\n          if (IsStruct(field.value.type)) {\n            if (native_default) {\n              if (!initializer_list.empty()) {\n                initializer_list += \",\\n        \";\n              }\n              initializer_list +=\n                  Name(field) + \"(\" + native_default->constant + \")\";\n            }\n          }\n        } else if (cpp_type && !IsVector(field.value.type)) {\n          if (!initializer_list.empty()) {\n            initializer_list += \",\\n        \";\n          }\n          initializer_list += Name(field) + \"(0)\";\n        }\n      }\n    }\n    if (!initializer_list.empty()) {\n      initializer_list = \"\\n      : \" + initializer_list;\n    }\n\n    code_.SetValue(\"INIT_LIST\", initializer_list);\n\n    code_ += \"  {{NATIVE_NAME}}(){{INIT_LIST}} {\";\n    code_ += \"  }\";\n  }\n\n  // Generate the >= C++11 copy/move constructor and assignment operator\n  // declarations if required. Tables that are default-copyable do not get\n  // user-provided copy/move constructors and assignment operators so they\n  // remain aggregates.\n  void GenCopyMoveCtorAndAssigOpDecls(const StructDef& struct_def) {\n    if (opts_.g_cpp_std < cpp::CPP_STD_11) return;\n    if (!NeedsCopyCtorAssignOp(struct_def)) return;\n    code_.SetValue(\"NATIVE_NAME\",\n                   NativeName(Name(struct_def), &struct_def, opts_));\n    code_ += \"  {{NATIVE_NAME}}(const {{NATIVE_NAME}} &o);\";\n    code_ +=\n        \"  {{NATIVE_NAME}}({{NATIVE_NAME}}&&) FLATBUFFERS_NOEXCEPT = \"\n        \"default;\";\n    code_ +=\n        \"  {{NATIVE_NAME}} &operator=({{NATIVE_NAME}} o) FLATBUFFERS_NOEXCEPT;\";\n  }\n\n  // Generate the >= C++11 copy constructor and assignment operator definitions.\n  void GenCopyCtorAssignOpDefs(const StructDef& struct_def) {\n    if (opts_.g_cpp_std < cpp::CPP_STD_11) return;\n    if (!NeedsCopyCtorAssignOp(struct_def)) return;\n    std::string initializer_list;\n    std::string vector_copies;\n    std::string swaps;\n    for (const auto& field : struct_def.fields.vec) {\n      const auto& type = field->value.type;\n      if (field->deprecated || type.base_type == BASE_TYPE_UTYPE) continue;\n      if (type.base_type == BASE_TYPE_STRUCT) {\n        if (!initializer_list.empty()) {\n          initializer_list += \",\\n        \";\n        }\n        const auto cpp_type = field->attributes.Lookup(\"cpp_type\");\n        const auto cpp_ptr_type = field->attributes.Lookup(\"cpp_ptr_type\");\n        const std::string& type_name =\n            (cpp_type) ? cpp_type->constant\n                       : GenTypeNative(type, /*invector*/ false, *field,\n                                       /*forcopy*/ true);\n        const bool is_ptr = !(IsStruct(type) && field->native_inline) ||\n                            (cpp_type && cpp_ptr_type->constant != \"naked\");\n        CodeWriter cw;\n        cw.SetValue(\"FIELD\", Name(*field));\n        cw.SetValue(\"TYPE\", type_name);\n        if (is_ptr) {\n          cw +=\n              \"{{FIELD}}((o.{{FIELD}}) ? new {{TYPE}}(*o.{{FIELD}}) : \"\n              \"nullptr)\\\\\";\n          initializer_list += cw.ToString();\n        } else {\n          cw += \"{{FIELD}}(o.{{FIELD}})\\\\\";\n          initializer_list += cw.ToString();\n        }\n      } else if (IsVector(type)) {\n        const auto vec_type = type.VectorType();\n        if (vec_type.base_type == BASE_TYPE_UTYPE) continue;\n        const auto cpp_type = field->attributes.Lookup(\"cpp_type\");\n        const auto cpp_ptr_type = field->attributes.Lookup(\"cpp_ptr_type\");\n        const std::string& type_name =\n            (cpp_type) ? cpp_type->constant\n                       : GenTypeNative(vec_type, /*invector*/ true, *field,\n                                       /*forcopy*/ true);\n        const bool is_ptr = IsVectorOfPointers(*field) ||\n                            (cpp_type && cpp_ptr_type->constant != \"naked\");\n        CodeWriter cw(\"  \");\n        cw.SetValue(\"FIELD\", Name(*field));\n        cw.SetValue(\"TYPE\", type_name);\n        if (is_ptr) {\n          // Use emplace_back to construct the potentially-smart pointer element\n          // from a raw pointer to a new-allocated copy.\n          cw.IncrementIdentLevel();\n          cw += \"{{FIELD}}.reserve(o.{{FIELD}}.size());\";\n          cw +=\n              \"for (const auto &{{FIELD}}_ : o.{{FIELD}}) { \"\n              \"{{FIELD}}.emplace_back(({{FIELD}}_) ? new {{TYPE}}(*{{FIELD}}_) \"\n              \": nullptr); }\";\n          vector_copies += cw.ToString();\n        } else {\n          // For non-pointer elements, use std::vector's copy constructor in the\n          // initializer list. This will yield better performance than an insert\n          // range loop for trivially-copyable element types.\n          if (!initializer_list.empty()) {\n            initializer_list += \",\\n        \";\n          }\n          cw += \"{{FIELD}}(o.{{FIELD}})\\\\\";\n          initializer_list += cw.ToString();\n        }\n      } else {\n        if (!initializer_list.empty()) {\n          initializer_list += \",\\n        \";\n        }\n        CodeWriter cw;\n        cw.SetValue(\"FIELD\", Name(*field));\n        cw += \"{{FIELD}}(o.{{FIELD}})\\\\\";\n        initializer_list += cw.ToString();\n      }\n      {\n        if (!swaps.empty()) {\n          swaps += \"\\n  \";\n        }\n        CodeWriter cw;\n        cw.SetValue(\"FIELD\", Name(*field));\n        cw += \"std::swap({{FIELD}}, o.{{FIELD}});\\\\\";\n        swaps += cw.ToString();\n      }\n    }\n    if (!initializer_list.empty()) {\n      initializer_list = \"\\n      : \" + initializer_list;\n    }\n    if (!swaps.empty()) {\n      swaps = \"  \" + swaps;\n    }\n\n    code_.SetValue(\"NATIVE_NAME\",\n                   NativeName(Name(struct_def), &struct_def, opts_));\n    code_.SetValue(\"INIT_LIST\", initializer_list);\n    code_.SetValue(\"VEC_COPY\", vector_copies);\n    code_.SetValue(\"SWAPS\", swaps);\n\n    code_ +=\n        \"inline {{NATIVE_NAME}}::{{NATIVE_NAME}}(const {{NATIVE_NAME}} &o)\"\n        \"{{INIT_LIST}} {\";\n    code_ += \"{{VEC_COPY}}}\\n\";\n    code_ +=\n        \"inline {{NATIVE_NAME}} &{{NATIVE_NAME}}::operator=\"\n        \"({{NATIVE_NAME}} o) FLATBUFFERS_NOEXCEPT {\";\n    code_ += \"{{SWAPS}}\";\n    code_ += \"  return *this;\\n}\\n\";\n  }\n\n  void GenCompareOperator(const StructDef& struct_def,\n                          const std::string& accessSuffix = \"\") {\n    // Do not generate compare operators for native types.\n    const auto native_type = struct_def.attributes.Lookup(\"native_type\");\n    if (native_type) {\n      return;\n    }\n\n    std::string compare_op;\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      const auto& field = **it;\n      const auto accessor = Name(field) + accessSuffix;\n      const auto lhs_accessor = \"lhs.\" + accessor;\n      const auto rhs_accessor = \"rhs.\" + accessor;\n      if (!field.deprecated &&  // Deprecated fields won't be accessible.\n          field.value.type.base_type != BASE_TYPE_UTYPE &&\n          (!IsVector(field.value.type) ||\n           field.value.type.element != BASE_TYPE_UTYPE)) {\n        if (!compare_op.empty()) {\n          compare_op += \" &&\\n      \";\n        }\n        if (struct_def.fixed || field.native_inline ||\n            field.value.type.base_type != BASE_TYPE_STRUCT) {\n          // If the field is a vector of tables, the table need to be compared\n          // by value, instead of by the default unique_ptr == operator which\n          // compares by address.\n          if (IsVectorOfPointers(field)) {\n            const auto type =\n                GenTypeNative(field.value.type.VectorType(), true, field);\n            const auto equal_length =\n                lhs_accessor + \".size() == \" + rhs_accessor + \".size()\";\n            const auto elements_equal =\n                \"std::equal(\" + lhs_accessor + \".cbegin(), \" + lhs_accessor +\n                \".cend(), \" + rhs_accessor + \".cbegin(), [](\" + type +\n                \" const &a, \" + type +\n                \" const &b) { return (a == b) || (a && b && *a == *b); })\";\n\n            compare_op += \"(\" + equal_length + \" && \" + elements_equal + \")\";\n          } else if (field.value.type.base_type == BASE_TYPE_ARRAY) {\n            compare_op += \"(*\" + lhs_accessor + \" == *\" + rhs_accessor + \")\";\n          } else {\n            compare_op += \"(\" + lhs_accessor + \" == \" + rhs_accessor + \")\";\n          }\n        } else {\n          // Deep compare of std::unique_ptr. Null is not equal to empty.\n          std::string both_null =\n              \"(\" + lhs_accessor + \" == \" + rhs_accessor + \")\";\n          std::string not_null_and_equal = \"(lhs.\" + accessor + \" && rhs.\" +\n                                           accessor + \" && *lhs.\" + accessor +\n                                           \" == *rhs.\" + accessor + \")\";\n          compare_op += \"(\" + both_null + \" || \" + not_null_and_equal + \")\";\n        }\n      }\n    }\n\n    std::string cmp_lhs;\n    std::string cmp_rhs;\n    if (compare_op.empty()) {\n      cmp_lhs = \"\";\n      cmp_rhs = \"\";\n      compare_op = \"  return true;\";\n    } else {\n      cmp_lhs = \"lhs\";\n      cmp_rhs = \"rhs\";\n      compare_op = \"  return\\n      \" + compare_op + \";\";\n    }\n\n    code_.SetValue(\"CMP_OP\", compare_op);\n    code_.SetValue(\"CMP_LHS\", cmp_lhs);\n    code_.SetValue(\"CMP_RHS\", cmp_rhs);\n    code_ += \"\";\n    code_ +=\n        \"inline bool operator==(const {{NATIVE_NAME}} &{{CMP_LHS}}, const \"\n        \"{{NATIVE_NAME}} &{{CMP_RHS}}) {\";\n    code_ += \"{{CMP_OP}}\";\n    code_ += \"}\";\n\n    code_ += \"\";\n    code_ +=\n        \"inline bool operator!=(const {{NATIVE_NAME}} &lhs, const \"\n        \"{{NATIVE_NAME}} &rhs) {\";\n    code_ += \"    return !(lhs == rhs);\";\n    code_ += \"}\";\n    code_ += \"\";\n  }\n\n  void GenAbslHashValue(const StructDef& struct_def) {\n    code_ += \"template <typename H>\";\n    code_ += \"inline H AbslHashValue(H h, const {{NATIVE_NAME}} &obj) {\";\n    std::string combine_args;\n    for (const auto& field : struct_def.fields.vec) {\n      if (field->deprecated) {\n        continue;\n      }\n      if (IsArray(field->value.type)) {\n        const auto field_accessor = \"obj.\" + Name(*field) + \"()\";\n        const auto& element_type = field->value.type.VectorType();\n        if (IsStruct(element_type)) {\n          code_ += \"  for (const auto* element : *\" + field_accessor + \") {\";\n          code_ += \"    h = H::combine(std::move(h), *element);\";\n          code_ += \"  }\";\n        } else {\n          code_ += \"  for (auto element : *\" + field_accessor + \") {\";\n          code_ += \"    h = H::combine(std::move(h), element);\";\n          code_ += \"  }\";\n        }\n      } else {\n        combine_args += \", obj.\" + Name(*field) + \"()\";\n      }\n    }\n    code_ += \"  return H::combine(std::move(h)\" + combine_args + \");\";\n    code_ += \"}\";\n  }\n\n  void GenOperatorNewDelete(const StructDef& struct_def) {\n    if (auto native_custom_alloc =\n            struct_def.attributes.Lookup(\"native_custom_alloc\")) {\n      code_ += \"  inline void *operator new (std::size_t count) {\";\n      code_ += \"    return \" + native_custom_alloc->constant +\n               \"<{{NATIVE_NAME}}>().allocate(count / sizeof({{NATIVE_NAME}}));\";\n      code_ += \"  }\";\n      code_ += \"  inline void operator delete (void *ptr) {\";\n      code_ += \"    return \" + native_custom_alloc->constant +\n               \"<{{NATIVE_NAME}}>().deallocate(static_cast<{{NATIVE_NAME}}*>(\"\n               \"ptr),1);\";\n      code_ += \"  }\";\n    }\n  }\n\n  void GenNativeTable(const StructDef& struct_def) {\n    const auto native_name = NativeName(Name(struct_def), &struct_def, opts_);\n    code_.SetValue(\"STRUCT_NAME\", Name(struct_def));\n    code_.SetValue(\"NATIVE_NAME\", native_name);\n\n    // Generate a C++ object that can hold an unpacked version of this table.\n    code_ += \"struct {{NATIVE_NAME}} : public ::flatbuffers::NativeTable {\";\n    code_ += \"  typedef {{STRUCT_NAME}} TableType;\";\n    GenFullyQualifiedNameGetter(struct_def, native_name);\n    for (const auto field : struct_def.fields.vec) {\n      GenMember(*field);\n    }\n    GenOperatorNewDelete(struct_def);\n    GenDefaultConstructor(struct_def);\n    GenCopyMoveCtorAndAssigOpDecls(struct_def);\n    code_ += \"};\";\n    code_ += \"\";\n  }\n\n  // Adds a typedef to the binary schema type so one could get the bfbs based\n  // on the type at runtime.\n  void GenBinarySchemaTypeDef(const StructDef* struct_def) {\n    if (struct_def && opts_.binary_schema_gen_embed) {\n      code_ += \"  typedef \" + WrapInNameSpace(*struct_def) +\n               \"BinarySchema BinarySchema;\";\n    }\n  }\n\n  void GenNativeTablePost(const StructDef& struct_def) {\n    if (opts_.gen_compare) {\n      const auto native_name = NativeName(Name(struct_def), &struct_def, opts_);\n      code_.SetValue(\"STRUCT_NAME\", Name(struct_def));\n      code_.SetValue(\"NATIVE_NAME\", native_name);\n      GenCompareOperator(struct_def);\n      code_ += \"\";\n    }\n  }\n\n  // Generate the code to call the appropriate Verify function(s) for a field.\n  void GenVerifyCall(const FieldDef& field, const char* prefix) {\n    code_.SetValue(\"PRE\", prefix);\n    code_.SetValue(\"NAME\", Name(field));\n    code_.SetValue(\"REQUIRED\", field.IsRequired() ? \"Required\" : \"\");\n    code_.SetValue(\"SIZE\", GenTypeSize(field.value.type));\n    code_.SetValue(\"OFFSET\", GenFieldOffsetName(field));\n    if (IsScalar(field.value.type.base_type) || IsStruct(field.value.type)) {\n      code_.SetValue(\"ALIGN\", NumToString(InlineAlignment(field.value.type)));\n      code_ +=\n          \"{{PRE}}VerifyField{{REQUIRED}}<{{SIZE}}>(verifier, \"\n          \"{{OFFSET}}, {{ALIGN}})\\\\\";\n    } else {\n      code_.SetValue(\"OFFSET_SIZE\", field.offset64 ? \"64\" : \"\");\n      code_ +=\n          \"{{PRE}}VerifyOffset{{OFFSET_SIZE}}{{REQUIRED}}(verifier, \"\n          \"{{OFFSET}})\\\\\";\n    }\n\n    switch (field.value.type.base_type) {\n      case BASE_TYPE_UNION: {\n        code_.SetValue(\"ENUM_NAME\", field.value.type.enum_def->name);\n        code_.SetValue(\"SUFFIX\", UnionTypeFieldSuffix());\n        code_ +=\n            \"{{PRE}}Verify{{ENUM_NAME}}(verifier, {{NAME}}(), \"\n            \"{{NAME}}{{SUFFIX}}())\\\\\";\n        break;\n      }\n      case BASE_TYPE_STRUCT: {\n        if (!field.value.type.struct_def->fixed) {\n          code_ += \"{{PRE}}verifier.VerifyTable({{NAME}}())\\\\\";\n        }\n        break;\n      }\n      case BASE_TYPE_STRING: {\n        if (field.value.constant != \"0\") {\n          if (field.offset64) {\n            code_ +=\n                \"{{PRE}}VerifyStringWithDefault<::flatbuffers::uoffset64_t>(\"\n                \"verifier, \"\n                \"{{OFFSET}})\\\\\";\n          } else {\n            code_ += \"{{PRE}}VerifyStringWithDefault(verifier, {{OFFSET}})\\\\\";\n          }\n        } else {\n          code_ += \"{{PRE}}verifier.VerifyString({{NAME}}())\\\\\";\n        }\n        break;\n      }\n      case BASE_TYPE_VECTOR64:\n      case BASE_TYPE_VECTOR: {\n        if (field.value.constant == \"[]\") {\n          const auto& vec_type = field.value.type.VectorType();\n          const std::string vtype_wire = GenTypeWire(\n              vec_type, \"\", VectorElementUserFacing(vec_type), field.offset64);\n          std::string verify_call;\n          if (field.offset64) {\n            verify_call = \"{{PRE}}VerifyVector64WithDefault<\" + vtype_wire;\n          } else {\n            verify_call = \"{{PRE}}VerifyVectorWithDefault<\" + vtype_wire;\n          }\n          if (field.value.type.base_type == BASE_TYPE_VECTOR64) {\n            verify_call += \", ::flatbuffers::uoffset64_t\";\n          }\n          verify_call += \">(verifier, {{OFFSET}})\\\\\";\n          code_ += verify_call;\n        } else {\n          code_ += \"{{PRE}}verifier.VerifyVector({{NAME}}())\\\\\";\n        }\n\n        switch (field.value.type.element) {\n          case BASE_TYPE_STRING: {\n            code_ += \"{{PRE}}verifier.VerifyVectorOfStrings({{NAME}}())\\\\\";\n            break;\n          }\n          case BASE_TYPE_STRUCT: {\n            if (!field.value.type.struct_def->fixed) {\n              code_ += \"{{PRE}}verifier.VerifyVectorOfTables({{NAME}}())\\\\\";\n            }\n            break;\n          }\n          case BASE_TYPE_UNION: {\n            code_.SetValue(\"ENUM_NAME\", field.value.type.enum_def->name);\n            code_ +=\n                \"{{PRE}}Verify{{ENUM_NAME}}Vector(verifier, {{NAME}}(), \"\n                \"{{NAME}}_type())\\\\\";\n            break;\n          }\n          default:\n            break;\n        }\n\n        auto nfn = GetNestedFlatBufferName(field);\n        if (!nfn.empty()) {\n          code_.SetValue(\"CPP_NAME\", nfn);\n          // FIXME: file_identifier.\n          code_ +=\n              \"{{PRE}}verifier.template VerifyNestedFlatBuffer<{{CPP_NAME}}>\"\n              \"({{NAME}}(), nullptr)\\\\\";\n        } else if (field.flexbuffer) {\n          code_ +=\n              \"{{PRE}}flexbuffers::VerifyNestedFlexBuffer\"\n              \"({{NAME}}(), verifier)\\\\\";\n        }\n        break;\n      }\n      default: {\n        break;\n      }\n    }\n  }\n\n  void GenComparatorForStruct(const StructDef& struct_def, size_t space_size,\n                              const std::string lhs_struct_literal,\n                              const std::string rhs_struct_literal) {\n    code_.SetValue(\"LHS_PREFIX\", lhs_struct_literal);\n    code_.SetValue(\"RHS_PREFIX\", rhs_struct_literal);\n    std::string space(space_size, ' ');\n    for (const auto& curr_field : struct_def.fields.vec) {\n      const auto curr_field_name = Name(*curr_field);\n      code_.SetValue(\"CURR_FIELD_NAME\", curr_field_name);\n      code_.SetValue(\"LHS\", lhs_struct_literal + \"_\" + curr_field_name);\n      code_.SetValue(\"RHS\", rhs_struct_literal + \"_\" + curr_field_name);\n      const bool is_scalar = IsScalar(curr_field->value.type.base_type);\n      const bool is_array = IsArray(curr_field->value.type);\n      const bool is_struct = IsStruct(curr_field->value.type);\n\n      // If encouter a key field, call KeyCompareWithValue to compare this\n      // field.\n      if (curr_field->key) {\n        code_ += space +\n                 \"const auto {{RHS}} = {{RHS_PREFIX}}.{{CURR_FIELD_NAME}}();\";\n        code_ += space +\n                 \"const auto {{CURR_FIELD_NAME}}_compare_result = \"\n                 \"{{LHS_PREFIX}}.KeyCompareWithValue({{RHS}});\";\n\n        code_ += space + \"if ({{CURR_FIELD_NAME}}_compare_result != 0)\";\n        code_ += space + \"  return {{CURR_FIELD_NAME}}_compare_result;\";\n        continue;\n      }\n\n      code_ +=\n          space + \"const auto {{LHS}} = {{LHS_PREFIX}}.{{CURR_FIELD_NAME}}();\";\n      code_ +=\n          space + \"const auto {{RHS}} = {{RHS_PREFIX}}.{{CURR_FIELD_NAME}}();\";\n      if (is_scalar) {\n        code_ += space + \"if ({{LHS}} != {{RHS}})\";\n        code_ += space +\n                 \"  return static_cast<int>({{LHS}} > {{RHS}}) - \"\n                 \"static_cast<int>({{LHS}} < {{RHS}});\";\n      } else if (is_array) {\n        const auto& elem_type = curr_field->value.type.VectorType();\n        code_ +=\n            space +\n            \"for (::flatbuffers::uoffset_t i = 0; i < {{LHS}}->size(); i++) {\";\n        code_ += space + \"  const auto {{LHS}}_elem = {{LHS}}->Get(i);\";\n        code_ += space + \"  const auto {{RHS}}_elem = {{RHS}}->Get(i);\";\n        if (IsScalar(elem_type.base_type)) {\n          code_ += space + \"  if ({{LHS}}_elem != {{RHS}}_elem)\";\n          code_ += space +\n                   \"    return static_cast<int>({{LHS}}_elem > {{RHS}}_elem) - \"\n                   \"static_cast<int>({{LHS}}_elem < {{RHS}}_elem);\";\n          code_ += space + \"}\";\n\n        } else if (IsStruct(elem_type)) {\n          if (curr_field->key) {\n            code_ += space +\n                     \"const auto {{CURR_FIELD_NAME}}_compare_result = \"\n                     \"{{LHS_PREFIX}}.KeyCompareWithValue({{RHS}});\";\n            code_ += space + \"if ({{CURR_FIELD_NAME}}_compare_result != 0)\";\n            code_ += space + \"  return {{CURR_FIELD_NAME}}_compare_result;\";\n            continue;\n          }\n          GenComparatorForStruct(\n              *curr_field->value.type.struct_def, space_size + 2,\n              code_.GetValue(\"LHS\") + \"_elem\", code_.GetValue(\"RHS\") + \"_elem\");\n\n          code_ += space + \"}\";\n        }\n\n      } else if (is_struct) {\n        GenComparatorForStruct(*curr_field->value.type.struct_def, space_size,\n                               code_.GetValue(\"LHS\"), code_.GetValue(\"RHS\"));\n      }\n    }\n  }\n\n  // Generate CompareWithValue method for a key field.\n  void GenKeyFieldMethods(const FieldDef& field) {\n    FLATBUFFERS_ASSERT(field.key);\n    const bool is_string = IsString(field.value.type);\n    const bool is_array = IsArray(field.value.type);\n    const bool is_struct = IsStruct(field.value.type);\n    // Generate KeyCompareLessThan function\n    code_ +=\n        \"  bool KeyCompareLessThan(const {{STRUCT_NAME}} * const o) const {\";\n    if (is_string) {\n      // use operator< of ::flatbuffers::String\n      code_ += \"    return *{{FIELD_NAME}}() < *o->{{FIELD_NAME}}();\";\n    } else if (is_array || is_struct) {\n      code_ += \"    return KeyCompareWithValue(o->{{FIELD_NAME}}()) < 0;\";\n    } else {\n      code_ += \"    return {{FIELD_NAME}}() < o->{{FIELD_NAME}}();\";\n    }\n    code_ += \"  }\";\n\n    // Generate KeyCompareWithValue function\n    if (is_string) {\n      // Compares key against a null-terminated char array.\n      code_ += \"  int KeyCompareWithValue(const char *_{{FIELD_NAME}}) const {\";\n      code_ += \"    return strcmp({{FIELD_NAME}}()->c_str(), _{{FIELD_NAME}});\";\n      code_ += \"  }\";\n      // Compares key against any string-like object (e.g. std::string_view or\n      // std::string) that implements operator< comparison with const char*.\n      code_ += \"  template<typename StringType>\";\n      code_ +=\n          \"  int KeyCompareWithValue(const StringType& _{{FIELD_NAME}}) const \"\n          \"{\";\n      code_ +=\n          \"    if ({{FIELD_NAME}}()->c_str() < _{{FIELD_NAME}}) return -1;\";\n      code_ += \"    if (_{{FIELD_NAME}} < {{FIELD_NAME}}()->c_str()) return 1;\";\n      code_ += \"    return 0;\";\n    } else if (is_array) {\n      const auto& elem_type = field.value.type.VectorType();\n      std::string input_type = \"::flatbuffers::Array<\" +\n                               GenTypeGet(elem_type, \"\", \"\", \"\", false) + \", \" +\n                               NumToString(elem_type.fixed_length) + \">\";\n      code_.SetValue(\"INPUT_TYPE\", input_type);\n      code_ +=\n          \"  int KeyCompareWithValue(const {{INPUT_TYPE}} *_{{FIELD_NAME}}\"\n          \") const {\";\n      code_ +=\n          \"    const {{INPUT_TYPE}} *curr_{{FIELD_NAME}} = {{FIELD_NAME}}();\";\n      code_ +=\n          \"    for (::flatbuffers::uoffset_t i = 0; i < \"\n          \"curr_{{FIELD_NAME}}->size(); i++) {\";\n\n      if (IsScalar(elem_type.base_type)) {\n        code_ += \"      const auto lhs = curr_{{FIELD_NAME}}->Get(i);\";\n        code_ += \"      const auto rhs = _{{FIELD_NAME}}->Get(i);\";\n        code_ += \"      if (lhs != rhs)\";\n        code_ +=\n            \"        return static_cast<int>(lhs > rhs)\"\n            \" - static_cast<int>(lhs < rhs);\";\n      } else if (IsStruct(elem_type)) {\n        code_ +=\n            \"      const auto &lhs_{{FIELD_NAME}} = \"\n            \"*(curr_{{FIELD_NAME}}->Get(i));\";\n        code_ +=\n            \"      const auto &rhs_{{FIELD_NAME}} = \"\n            \"*(_{{FIELD_NAME}}->Get(i));\";\n        GenComparatorForStruct(*elem_type.struct_def, 6,\n                               \"lhs_\" + code_.GetValue(\"FIELD_NAME\"),\n                               \"rhs_\" + code_.GetValue(\"FIELD_NAME\"));\n      }\n      code_ += \"    }\";\n      code_ += \"    return 0;\";\n    } else if (is_struct) {\n      const auto* struct_def = field.value.type.struct_def;\n      code_.SetValue(\"INPUT_TYPE\",\n                     GenTypeGet(field.value.type, \"\", \"\", \"\", false));\n      code_ +=\n          \"  int KeyCompareWithValue(const {{INPUT_TYPE}} &_{{FIELD_NAME}}) \"\n          \"const {\";\n      code_ += \"    const auto &lhs_{{FIELD_NAME}} = {{FIELD_NAME}}();\";\n      code_ += \"    const auto &rhs_{{FIELD_NAME}} = _{{FIELD_NAME}};\";\n      GenComparatorForStruct(*struct_def, 4,\n                             \"lhs_\" + code_.GetValue(\"FIELD_NAME\"),\n                             \"rhs_\" + code_.GetValue(\"FIELD_NAME\"));\n      code_ += \"    return 0;\";\n\n    } else {\n      FLATBUFFERS_ASSERT(IsScalar(field.value.type.base_type));\n      auto type = GenTypeBasic(field.value.type, false);\n      if (opts_.scoped_enums && field.value.type.enum_def &&\n          IsScalar(field.value.type.base_type)) {\n        type = GenTypeGet(field.value.type, \" \", \"const \", \" *\", true);\n      }\n      // Returns {field<val: -1, field==val: 0, field>val: +1}.\n      code_.SetValue(\"KEY_TYPE\", type);\n      code_ +=\n          \"  int KeyCompareWithValue({{KEY_TYPE}} _{{FIELD_NAME}}) const {\";\n      code_ +=\n          \"    return static_cast<int>({{FIELD_NAME}}() > _{{FIELD_NAME}}) - \"\n          \"static_cast<int>({{FIELD_NAME}}() < _{{FIELD_NAME}});\";\n    }\n    code_ += \"  }\";\n  }\n\n  void GenTableUnionAsGetters(const FieldDef& field, bool is_mutable) {\n    const auto& type = field.value.type;\n    auto u = type.enum_def;\n\n    code_.SetValue(\"MUTABLE_EXT\", is_mutable ? \"\" : \" const\");\n    code_.SetValue(\"MUTABLE\", is_mutable ? \"mutable_\" : \"\");\n\n    if (!type.enum_def->uses_multiple_type_instances)\n      code_ +=\n          \"  template<typename T>\"\n          \"{{MUTABLE_EXT}} T *{{MUTABLE}}{{NULLABLE_EXT}}{{FIELD_NAME}}_as()\"\n          \"{{MUTABLE_EXT}};\";\n\n    for (auto u_it = u->Vals().begin(); u_it != u->Vals().end(); ++u_it) {\n      auto& ev = **u_it;\n      if (ev.union_type.base_type == BASE_TYPE_NONE) {\n        continue;\n      }\n      auto full_struct_name = GetUnionElement(ev, false, opts_);\n\n      // @TODO: Mby make this decisions more universal? How?\n      code_.SetValue(\"U_GET_TYPE\",\n                     EscapeKeyword(Name(field) + UnionTypeFieldSuffix()));\n      code_.SetValue(\"U_ELEMENT_TYPE\", WrapInNameSpace(u->defined_namespace,\n                                                       GetEnumValUse(*u, ev)));\n      code_.SetValue(\"U_FIELD_TYPE\",\n                     (is_mutable ? \"\" : \"const \") + full_struct_name + \" *\");\n      code_.SetValue(\"U_FIELD_NAME\", Name(field) + \"_as_\" + Name(ev));\n      code_.SetValue(\"U_NULLABLE\", NullableExtension());\n\n      // `const Type *union_name_asType() const` accessor.\n      // and `Type *mutable_union_name_asType()` accessor.\n      code_ +=\n          \"  {{U_FIELD_TYPE}}{{U_NULLABLE}}{{MUTABLE}}{{U_FIELD_NAME}}()\"\n          \"{{MUTABLE_EXT}} {\";\n      code_ +=\n          \"    return {{U_GET_TYPE}}() == {{U_ELEMENT_TYPE}} ? \"\n          \"static_cast<{{U_FIELD_TYPE}}>({{MUTABLE}}{{FIELD_NAME}}()) \"\n          \": nullptr;\";\n      code_ += \"  }\";\n    }\n  }\n\n  void GenTableFieldGetter(const FieldDef& field) {\n    const auto& type = field.value.type;\n    const auto offset_str = GenFieldOffsetName(field);\n\n    GenComment(field.doc_comment, \"  \");\n    // Call a different accessor for pointers, that indirects.\n    if (!field.IsScalarOptional()) {\n      const bool is_scalar = IsScalar(type.base_type);\n      std::string accessor;\n      std::string offset_size = \"\";\n      if (is_scalar) {\n        accessor = \"GetField<\";\n      } else if (IsStruct(type)) {\n        accessor = \"GetStruct<\";\n      } else {\n        if (field.offset64) {\n          accessor = \"GetPointer64<\";\n        } else {\n          accessor = \"GetPointer<\";\n        }\n      }\n      auto offset_type = GenTypeGet(type, \"\", \"const \", \" *\", false);\n      auto call = accessor + offset_type + \">(\" + offset_str;\n      // Default value as second arg for non-pointer types.\n      if (is_scalar) {\n        call += \", \" + GenDefaultConstant(field);\n      }\n      call += \")\";\n\n      std::string afterptr = \" *\" + NullableExtension();\n      code_.SetValue(\"FIELD_TYPE\",\n                     GenTypeGet(type, \" \", \"const \", afterptr.c_str(), true));\n      code_.SetValue(\"FIELD_VALUE\", GenUnderlyingCast(field, true, call));\n      code_.SetValue(\"NULLABLE_EXT\", NullableExtension());\n      code_ += \"  {{FIELD_TYPE}}{{FIELD_NAME}}() const {\";\n      if (IsVector(type) && field.value.constant == \"[]\") {\n        const auto& vec_type = type.VectorType();\n        const std::string vtype_wire = GenTypeWire(\n            vec_type, \"\", VectorElementUserFacing(vec_type), field.offset64);\n        std::string get_call;\n        if (field.offset64) {\n          get_call = \"    return GetVectorPointer64OrEmpty<\" + vtype_wire;\n        } else {\n          get_call = \"    return GetVectorPointerOrEmpty<\" + vtype_wire;\n        }\n        if (type.base_type == BASE_TYPE_VECTOR64) {\n          get_call += \", ::flatbuffers::uoffset64_t\";\n        }\n        get_call += \">(\" + offset_str + \");\";\n        code_ += get_call;\n      } else if (IsString(type) && field.value.constant != \"0\") {\n        std::string escaped;\n        flatbuffers::EscapeString(field.value.constant.c_str(),\n                                  field.value.constant.length(), &escaped,\n                                  true, false);\n        code_ += \"    auto* ptr = {{FIELD_VALUE}};\";\n        code_ += \"    if (ptr) return ptr;\";\n        code_ += \"    static const struct { uint32_t len; const char s[\" +\n                 NumToString(field.value.constant.length() + 1) +\n                 \"]; } bfbs_string = { \" +\n                 NumToString(field.value.constant.length()) + \", \" +\n                 escaped + \" };\";\n        code_ +=\n            \"    return reinterpret_cast<const ::flatbuffers::String \"\n            \" *>(&bfbs_string);\";\n      } else {\n        code_ += \"    return {{FIELD_VALUE}};\";\n      }\n      code_ += \"  }\";\n    } else {\n      auto wire_type = GenTypeBasic(type, false);\n      auto face_type = GenTypeBasic(type, true);\n      auto opt_value = \"GetOptional<\" + wire_type + \", \" + face_type + \">(\" +\n                       offset_str + \")\";\n      code_.SetValue(\"FIELD_TYPE\", GenOptionalDecl(type));\n      code_ += \"  {{FIELD_TYPE}} {{FIELD_NAME}}() const {\";\n      code_ += \"    return \" + opt_value + \";\";\n      code_ += \"  }\";\n    }\n\n    if (type.base_type == BASE_TYPE_UNION) {\n      GenTableUnionAsGetters(field, false);\n    }\n  }\n\n  void GenTableFieldType(const FieldDef& field) {\n    const auto& type = field.value.type;\n    const auto offset_str = GenFieldOffsetName(field);\n    if (!field.IsScalarOptional()) {\n      std::string afterptr = \" *\" + NullableExtension();\n      code_.SetValue(\"FIELD_TYPE\",\n                     GenTypeGet(type, \"\", \"const \", afterptr.c_str(), true));\n      code_ += \"    {{FIELD_TYPE}}\\\\\";\n    } else {\n      code_.SetValue(\"FIELD_TYPE\", GenOptionalDecl(type));\n      code_ += \"    {{FIELD_TYPE}}\\\\\";\n    }\n  }\n\n  void GenStructFieldType(const FieldDef& field) {\n    const auto is_array = IsArray(field.value.type);\n    std::string field_type =\n        GenTypeGet(field.value.type, \"\", is_array ? \"\" : \"const \",\n                   is_array ? \"\" : \" &\", true);\n    code_.SetValue(\"FIELD_TYPE\", field_type);\n    code_ += \"    {{FIELD_TYPE}}\\\\\";\n  }\n\n  void GenFieldTypeHelper(const StructDef& struct_def) {\n    if (struct_def.fields.vec.empty()) {\n      return;\n    }\n    code_ += \"  template<size_t Index>\";\n    code_ += \"  using FieldType = \\\\\";\n    code_ += \"decltype(std::declval<type>().get_field<Index>());\";\n  }\n\n  void GenIndexBasedFieldGetter(const StructDef& struct_def) {\n    if (struct_def.fields.vec.empty()) {\n      return;\n    }\n    code_ += \"  template<size_t Index>\";\n    code_ += \"  auto get_field() const {\";\n\n    size_t index = 0;\n    bool need_else = false;\n    // Generate one index-based getter for each field.\n    for (const auto& field : struct_def.fields.vec) {\n      if (field->deprecated) {\n        // Deprecated fields won't be accessible.\n        continue;\n      }\n      code_.SetValue(\"FIELD_NAME\", Name(*field));\n      code_.SetValue(\"FIELD_INDEX\",\n                     std::to_string(static_cast<long long>(index++)));\n      if (need_else) {\n        code_ += \"    else \\\\\";\n      } else {\n        code_ += \"         \\\\\";\n      }\n      need_else = true;\n      code_ += \"if constexpr (Index == {{FIELD_INDEX}}) \\\\\";\n      code_ += \"return {{FIELD_NAME}}();\";\n    }\n    code_ += \"    else static_assert(Index != -1, \\\"Invalid Field Index\\\");\";\n    code_ += \"  }\";\n  }\n\n  // Sample for Vec3:\n  //\n  //   static constexpr std::array<const char *, 3> field_names = {\n  //     \"x\",\n  //     \"y\",\n  //     \"z\"\n  //   };\n  //\n  void GenFieldNames(const StructDef& struct_def) {\n    code_ += \"  static constexpr std::array<\\\\\";\n    code_ += \"const char *, fields_number> field_names = {\\\\\";\n    if (struct_def.fields.vec.empty()) {\n      code_ += \"};\";\n      return;\n    }\n    code_ += \"\";\n    // Generate the field_names elements.\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      const auto& field = **it;\n      if (field.deprecated) {\n        // Deprecated fields won't be accessible.\n        continue;\n      }\n      code_.SetValue(\"FIELD_NAME\", Name(field));\n      code_ += R\"(    \"{{FIELD_NAME}}\"\\)\";\n      if (it + 1 != struct_def.fields.vec.end()) {\n        code_ += \",\";\n      }\n    }\n    code_ += \"\\n  };\";\n  }\n\n  void GenFieldsNumber(const StructDef& struct_def) {\n    const auto non_deprecated_field_count = std::count_if(\n        struct_def.fields.vec.begin(), struct_def.fields.vec.end(),\n        [](const FieldDef* field) { return !field->deprecated; });\n    code_.SetValue(\n        \"FIELD_COUNT\",\n        std::to_string(static_cast<long long>(non_deprecated_field_count)));\n    code_ += \"  static constexpr size_t fields_number = {{FIELD_COUNT}};\";\n  }\n\n  void GenTraitsStruct(const StructDef& struct_def) {\n    code_.SetValue(\n        \"FULLY_QUALIFIED_NAME\",\n        struct_def.defined_namespace->GetFullyQualifiedName(Name(struct_def)));\n    code_ += \"struct {{STRUCT_NAME}}::Traits {\";\n    code_ += \"  using type = {{STRUCT_NAME}};\";\n    if (!struct_def.fixed) {\n      // We have a table and not a struct.\n      code_ += \"  static auto constexpr Create = Create{{STRUCT_NAME}};\";\n    }\n    if (opts_.cpp_static_reflection) {\n      code_ += \"  static constexpr auto name = \\\"{{STRUCT_NAME}}\\\";\";\n      code_ +=\n          \"  static constexpr auto fully_qualified_name = \"\n          \"\\\"{{FULLY_QUALIFIED_NAME}}\\\";\";\n      GenFieldsNumber(struct_def);\n      GenFieldNames(struct_def);\n      GenFieldTypeHelper(struct_def);\n    }\n    code_ += \"};\";\n    code_ += \"\";\n  }\n\n  void GenTableFieldSetter(const FieldDef& field) {\n    const auto& type = field.value.type;\n    const bool is_scalar = IsScalar(type.base_type);\n    if (is_scalar && IsUnion(type))\n      return;  // changing of a union's type is forbidden\n\n    auto offset_str = GenFieldOffsetName(field);\n    if (is_scalar) {\n      const auto wire_type = GenTypeWire(type, \"\", false, field.offset64);\n      code_.SetValue(\"SET_FN\", \"SetField<\" + wire_type + \">\");\n      code_.SetValue(\"OFFSET_NAME\", offset_str);\n      code_.SetValue(\"FIELD_TYPE\", GenTypeBasic(type, true));\n      code_.SetValue(\"FIELD_VALUE\",\n                     GenUnderlyingCast(field, false, \"_\" + Name(field)));\n\n      code_ += \"  bool mutate_{{FIELD_NAME}}({{FIELD_TYPE}} _{{FIELD_NAME}}\\\\\";\n      if (!field.IsScalarOptional()) {\n        code_.SetValue(\"DEFAULT_VALUE\", GenDefaultConstant(field));\n        code_.SetValue(\n            \"INTERFACE_DEFAULT_VALUE\",\n            GenUnderlyingCast(field, true, GenDefaultConstant(field)));\n\n        // GenUnderlyingCast for a bool field generates 0 != 0\n        // So the type has to be checked and the appropriate default chosen\n        if (IsBool(field.value.type.base_type)) {\n          code_ += \" = {{DEFAULT_VALUE}}) {\";\n        } else {\n          code_ += \" = {{INTERFACE_DEFAULT_VALUE}}) {\";\n        }\n        code_ +=\n            \"    return {{SET_FN}}({{OFFSET_NAME}}, {{FIELD_VALUE}}, \"\n            \"{{DEFAULT_VALUE}});\";\n      } else {\n        code_ += \") {\";\n        code_ += \"    return {{SET_FN}}({{OFFSET_NAME}}, {{FIELD_VALUE}});\";\n      }\n      code_ += \"  }\";\n    } else {\n      auto postptr = \" *\" + NullableExtension();\n      auto wire_type = GenTypeGet(type, \" \", \"\", postptr.c_str(), true);\n      code_.SetValue(\"FIELD_TYPE\", wire_type);\n\n      // mutable union accessors\n      if (type.base_type == BASE_TYPE_UNION) {\n        GenTableUnionAsGetters(field, true);\n      }\n\n      if (IsVector(type) && field.value.constant == \"[]\") {\n        const auto& vec_type = type.VectorType();\n        const std::string vtype_wire = GenTypeWire(\n            vec_type, \"\", VectorElementUserFacing(vec_type), field.offset64);\n        code_ += \"  {{FIELD_TYPE}}mutable_{{FIELD_NAME}}() {\";\n        std::string get_call;\n        if (field.offset64) {\n          get_call =\n              \"    return GetMutableVectorPointer64OrEmpty<\" + vtype_wire;\n        } else {\n          get_call = \"    return GetMutableVectorPointerOrEmpty<\" + vtype_wire;\n        }\n        if (type.base_type == BASE_TYPE_VECTOR64) {\n          get_call += \", ::flatbuffers::uoffset64_t\";\n        }\n        get_call += \">(\" + offset_str + \");\";\n        code_ += get_call;\n        code_ += \"  }\";\n      } else {\n        const std::string accessor = [&]() {\n          if (IsStruct(type)) {\n            return \"GetStruct<\";\n          }\n          if (field.offset64) {\n            return \"GetPointer64<\";\n          }\n          return \"GetPointer<\";\n        }();\n        auto underlying = accessor + wire_type + \">(\" + offset_str + \")\";\n        code_.SetValue(\"FIELD_VALUE\",\n                       GenUnderlyingCast(field, true, underlying));\n        code_ += \"  {{FIELD_TYPE}}mutable_{{FIELD_NAME}}() {\";\n        code_ += \"    return {{FIELD_VALUE}};\";\n        code_ += \"  }\";\n      }\n    }\n  }\n\n  std::string GetNestedFlatBufferName(const FieldDef& field) {\n    auto nested = field.attributes.Lookup(\"nested_flatbuffer\");\n    if (!nested) return \"\";\n    std::string qualified_name = nested->constant;\n    auto nested_root = parser_.LookupStruct(nested->constant);\n    if (nested_root == nullptr) {\n      qualified_name =\n          parser_.current_namespace_->GetFullyQualifiedName(nested->constant);\n      nested_root = parser_.LookupStruct(qualified_name);\n    }\n    FLATBUFFERS_ASSERT(nested_root);  // Guaranteed to exist by parser.\n    (void)nested_root;\n    return TranslateNameSpace(qualified_name);\n  }\n\n  // Generate an accessor struct, builder structs & function for a table.\n  void GenTable(const StructDef& struct_def) {\n    // Don't generate an object API struct for the table if it is a native type.\n    const auto native_type = struct_def.attributes.Lookup(\"native_type\");\n    if (opts_.generate_object_based_api && !native_type) {\n      GenNativeTable(struct_def);\n    }\n\n    // Generate an accessor struct, with methods of the form:\n    // type name() const { return GetField<type>(offset, defaultval); }\n    GenComment(struct_def.doc_comment);\n\n    const auto native_name = NativeName(Name(struct_def), &struct_def, opts_);\n    code_.SetValue(\"NATIVE_NAME\", native_name);\n    code_.SetValue(\"STRUCT_NAME\", Name(struct_def));\n    code_ +=\n        \"struct {{STRUCT_NAME}} FLATBUFFERS_FINAL_CLASS\"\n        \" : private ::flatbuffers::Table {\";\n    if (opts_.generate_object_based_api) {\n      code_ += \"  typedef {{NATIVE_NAME}} NativeTableType;\";\n    }\n    code_ += \"  typedef {{STRUCT_NAME}}Builder Builder;\";\n    GenBinarySchemaTypeDef(parser_.root_struct_def_);\n\n    if (opts_.g_cpp_std >= cpp::CPP_STD_17) {\n      code_ += \"  struct Traits;\";\n    }\n    if (opts_.mini_reflect != IDLOptions::kNone) {\n      code_ +=\n          \"  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\";\n      code_ += \"    return {{STRUCT_NAME}}TypeTable();\";\n      code_ += \"  }\";\n    }\n\n    GenFullyQualifiedNameGetter(struct_def, Name(struct_def));\n\n    // Generate field id constants.\n    if (!struct_def.fields.vec.empty()) {\n      // We need to add a trailing comma to all elements except the last one as\n      // older versions of gcc complain about this.\n      code_.SetValue(\"SEP\", \"\");\n      code_ +=\n          \"  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\";\n      for (const auto& field : struct_def.fields.vec) {\n        if (field->deprecated) {\n          // Deprecated fields won't be accessible.\n          continue;\n        }\n\n        code_.SetValue(\"OFFSET_NAME\", GenFieldOffsetName(*field));\n        code_.SetValue(\"OFFSET_VALUE\", NumToString(field->value.offset));\n        code_ += \"{{SEP}}    {{OFFSET_NAME}} = {{OFFSET_VALUE}}\\\\\";\n        code_.SetValue(\"SEP\", \",\\n\");\n      }\n      code_ += \"\";\n      code_ += \"  };\";\n    }\n\n    // Generate the accessors.\n    for (const auto& field : struct_def.fields.vec) {\n      if (field->deprecated) {\n        // Deprecated fields won't be accessible.\n        continue;\n      }\n\n      code_.SetValue(\"FIELD_NAME\", Name(*field));\n      GenTableFieldGetter(*field);\n      if (opts_.mutable_buffer) {\n        GenTableFieldSetter(*field);\n      }\n\n      auto nfn = GetNestedFlatBufferName(*field);\n      if (!nfn.empty()) {\n        code_.SetValue(\"CPP_NAME\", nfn);\n        code_ += \"  const {{CPP_NAME}} *{{FIELD_NAME}}_nested_root() const {\";\n        code_ += \"    const auto _f = {{FIELD_NAME}}();\";\n        code_ +=\n            \"    return _f ? ::flatbuffers::GetRoot<{{CPP_NAME}}>(_f->Data())\";\n        code_ += \"              : nullptr;\";\n        code_ += \"  }\";\n      }\n\n      if (field->flexbuffer) {\n        code_ +=\n            \"  flexbuffers::Reference {{FIELD_NAME}}_flexbuffer_root()\"\n            \" const {\";\n        // Both Data() and size() are const-methods, therefore call order\n        // doesn't matter.\n        code_ += \"    const auto _f = {{FIELD_NAME}}();\";\n        code_ += \"    return _f ? flexbuffers::GetRoot(_f->Data(), _f->size())\";\n        code_ += \"              : flexbuffers::Reference();\";\n        code_ += \"  }\";\n      }\n\n      // Generate a comparison function for this field if it is a key.\n      if (field->key) {\n        GenKeyFieldMethods(*field);\n      }\n    }\n\n    if (opts_.cpp_static_reflection) {\n      GenIndexBasedFieldGetter(struct_def);\n    }\n\n    // Generate a verifier function that can check a buffer from an untrusted\n    // source will never cause reads outside the buffer.\n    code_ += \"  template <bool B = false>\";\n    code_ +=\n        \"  bool Verify(::flatbuffers::VerifierTemplate<B> \"\n        \"&verifier) const {\";\n    code_ += \"    return VerifyTableStart(verifier)\\\\\";\n    for (const auto& field : struct_def.fields.vec) {\n      if (field->deprecated) {\n        continue;\n      }\n      GenVerifyCall(*field, \" &&\\n           \");\n    }\n\n    code_ += \" &&\\n           verifier.EndTable();\";\n    code_ += \"  }\";\n\n    if (opts_.generate_object_based_api) {\n      // Generate the UnPack() pre declaration.\n      code_ += \"  \" + TableUnPackSignature(struct_def, true, opts_) + \";\";\n      code_ += \"  \" + TableUnPackToSignature(struct_def, true, opts_) + \";\";\n      code_ += \"  \" + TablePackSignature(struct_def, true, opts_) + \";\";\n    }\n\n    code_ += \"};\";  // End of table.\n    code_ += \"\";\n\n    // Explicit specializations for union accessors\n    for (const auto& field : struct_def.fields.vec) {\n      if (field->deprecated || field->value.type.base_type != BASE_TYPE_UNION) {\n        continue;\n      }\n\n      auto u = field->value.type.enum_def;\n      if (u->uses_multiple_type_instances) continue;\n\n      code_.SetValue(\"FIELD_NAME\", Name(*field));\n\n      for (auto u_it = u->Vals().begin(); u_it != u->Vals().end(); ++u_it) {\n        auto& ev = **u_it;\n        if (ev.union_type.base_type == BASE_TYPE_NONE) {\n          continue;\n        }\n\n        auto full_struct_name = GetUnionElement(ev, false, opts_);\n\n        code_.SetValue(\n            \"U_ELEMENT_TYPE\",\n            WrapInNameSpace(u->defined_namespace, GetEnumValUse(*u, ev)));\n        code_.SetValue(\"U_FIELD_TYPE\", \"const \" + full_struct_name + \" *\");\n        code_.SetValue(\"U_ELEMENT_NAME\", full_struct_name);\n        code_.SetValue(\"U_FIELD_NAME\", Name(*field) + \"_as_\" + Name(ev));\n\n        // `template<> const T *union_name_as<T>() const` accessor.\n        // and `template<> T *mutable_union_name_as<T>()` accessor.\n        code_ +=\n            \"template<> \"\n            \"inline {{U_FIELD_TYPE}}{{STRUCT_NAME}}::{{FIELD_NAME}}_as\"\n            \"<{{U_ELEMENT_NAME}}>() const {\";\n        code_ += \"  return {{U_FIELD_NAME}}();\";\n        code_ += \"}\";\n        code_ += \"\";\n\n        if (opts_.mutable_buffer) {\n          code_.SetValue(\"U_FIELD_TYPE\", full_struct_name + \" *\");\n          code_.SetValue(\"U_FIELD_NAME\",\n                         \"mutable_\" + Name(*field) + \"_as_\" + Name(ev));\n          code_ +=\n              \"template<> \"\n              \"inline {{U_FIELD_TYPE}}\"\n              \"{{STRUCT_NAME}}::mutable_{{FIELD_NAME}}_as\"\n              \"<{{U_ELEMENT_NAME}}>() {\";\n          code_ += \"  return {{U_FIELD_NAME}}();\";\n          code_ += \"}\";\n          code_ += \"\";\n        }\n      }\n    }\n\n    GenBuilders(struct_def);\n\n    if (opts_.generate_object_based_api) {\n      // Generate a pre-declaration for a CreateX method that works with an\n      // unpacked C++ object.\n      code_ += TableCreateSignature(struct_def, true, opts_) + \";\";\n      code_ += \"\";\n    }\n  }\n\n  // Generate code to force vector alignment. Return empty string for vector\n  // that doesn't need alignment code.\n  std::string GenVectorForceAlign(const FieldDef& field,\n                                  const std::string& field_size) {\n    FLATBUFFERS_ASSERT(IsVector(field.value.type));\n    // Get the value of the force_align attribute.\n    const auto* force_align = field.attributes.Lookup(\"force_align\");\n    const int align = force_align ? atoi(force_align->constant.c_str()) : 1;\n    // Generate code to do force_align for the vector.\n    if (align > 1) {\n      const auto vtype = field.value.type.VectorType();\n      const std::string& type =\n          IsStruct(vtype) ? WrapInNameSpace(*vtype.struct_def)\n                          : GenTypeWire(vtype, \"\", false, field.offset64);\n      return std::string(\"_fbb.ForceVectorAlignment\") +\n             (field.offset64 ? \"64\" : \"\") + \"(\" + field_size + \", sizeof(\" +\n             type + \"), \" + std::to_string(static_cast<long long>(align)) +\n             \");\";\n    }\n    return \"\";\n  }\n\n  void GenBuilders(const StructDef& struct_def) {\n    code_.SetValue(\"STRUCT_NAME\", Name(struct_def));\n\n    // Generate a builder struct:\n    code_ += \"struct {{STRUCT_NAME}}Builder {\";\n    code_ += \"  typedef {{STRUCT_NAME}} Table;\";\n    code_ += \"  \" + GetBuilder() + \" &fbb_;\";\n    code_ += \"  ::flatbuffers::uoffset_t start_;\";\n\n    bool has_string_or_vector_fields = false;\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      const auto& field = **it;\n      if (field.deprecated) continue;\n      const bool is_scalar = IsScalar(field.value.type.base_type);\n      const bool is_default_scalar = is_scalar && !field.IsScalarOptional();\n      const bool is_string = IsString(field.value.type);\n      const bool is_vector = IsVector(field.value.type);\n      if (is_string || is_vector) {\n        has_string_or_vector_fields = true;\n      }\n\n      std::string offset = GenFieldOffsetName(field);\n      std::string name = GenUnderlyingCast(field, false, Name(field));\n      std::string value = is_default_scalar ? GenDefaultConstant(field) : \"\";\n\n      // Generate accessor functions of the form:\n      // void add_name(type name) {\n      //   fbb_.AddElement<type>(offset, name, default);\n      // }\n      code_.SetValue(\"FIELD_NAME\", Name(field));\n      code_.SetValue(\"FIELD_TYPE\",\n                     GenTypeWire(field.value.type, \" \", true, field.offset64));\n      code_.SetValue(\"ADD_OFFSET\", Name(struct_def) + \"::\" + offset);\n      code_.SetValue(\"ADD_NAME\", name);\n      code_.SetValue(\"ADD_VALUE\", value);\n      if (is_scalar) {\n        const auto type =\n            GenTypeWire(field.value.type, \"\", false, field.offset64);\n        code_.SetValue(\"ADD_FN\", \"AddElement<\" + type + \">\");\n      } else if (IsStruct(field.value.type)) {\n        code_.SetValue(\"ADD_FN\", \"AddStruct\");\n      } else {\n        code_.SetValue(\"ADD_FN\", \"AddOffset\");\n      }\n\n      code_ += \"  void add_{{FIELD_NAME}}({{FIELD_TYPE}}{{FIELD_NAME}}) {\";\n      code_ += \"    fbb_.{{ADD_FN}}(\\\\\";\n      if (is_default_scalar) {\n        code_ += \"{{ADD_OFFSET}}, {{ADD_NAME}}, {{ADD_VALUE}});\";\n      } else {\n        code_ += \"{{ADD_OFFSET}}, {{ADD_NAME}});\";\n      }\n      code_ += \"  }\";\n    }\n\n    // Builder constructor\n    code_ += \"  explicit {{STRUCT_NAME}}Builder(\" + GetBuilder() +\n             \" \"\n             \"&_fbb)\";\n    code_ += \"        : fbb_(_fbb) {\";\n    code_ += \"    start_ = fbb_.StartTable();\";\n    code_ += \"  }\";\n\n    // Finish() function.\n    code_ += \"  ::flatbuffers::Offset<{{STRUCT_NAME}}> Finish() {\";\n    code_ += \"    const auto end = fbb_.EndTable(start_);\";\n    code_ += \"    auto o = ::flatbuffers::Offset<{{STRUCT_NAME}}>(end);\";\n\n    for (const auto& field : struct_def.fields.vec) {\n      if (!field->deprecated && field->IsRequired()) {\n        code_.SetValue(\"FIELD_NAME\", Name(*field));\n        code_.SetValue(\"OFFSET_NAME\", GenFieldOffsetName(*field));\n        code_ += \"    fbb_.Required(o, {{STRUCT_NAME}}::{{OFFSET_NAME}});\";\n      }\n    }\n    code_ += \"    return o;\";\n    code_ += \"  }\";\n    code_ += \"};\";\n    code_ += \"\";\n\n    // Generate a convenient CreateX function that uses the above builder\n    // to create a table in one go.\n    code_ +=\n        \"inline ::flatbuffers::Offset<{{STRUCT_NAME}}> \"\n        \"Create{{STRUCT_NAME}}(\";\n    code_ += \"    \" + GetBuilder() + \" &_fbb\\\\\";\n    for (const auto& field : struct_def.fields.vec) {\n      if (!field->deprecated) {\n        GenParam(*field, false, \",\\n    \");\n      }\n    }\n    code_ += \") {\";\n\n    code_ += \"  {{STRUCT_NAME}}Builder builder_(_fbb);\";\n    for (size_t size = struct_def.sortbysize ? sizeof(largest_scalar_t) : 1;\n         size; size /= 2) {\n      for (auto it = struct_def.fields.vec.rbegin();\n           it != struct_def.fields.vec.rend(); ++it) {\n        const auto& field = **it;\n        if (!field.deprecated && (!struct_def.sortbysize ||\n                                  size == SizeOf(field.value.type.base_type))) {\n          code_.SetValue(\"FIELD_NAME\", Name(field));\n          if (field.IsScalarOptional()) {\n            code_ +=\n                \"  if({{FIELD_NAME}}) { \"\n                \"builder_.add_{{FIELD_NAME}}(*{{FIELD_NAME}}); }\";\n          } else {\n            code_ += \"  builder_.add_{{FIELD_NAME}}({{FIELD_NAME}});\";\n          }\n        }\n      }\n    }\n    code_ += \"  return builder_.Finish();\";\n    code_ += \"}\";\n    code_ += \"\";\n\n    // Definition for type traits for this table type. This allows querying var-\n    // ious compile-time traits of the table.\n    if (opts_.g_cpp_std >= cpp::CPP_STD_17) {\n      GenTraitsStruct(struct_def);\n    }\n\n    // Generate a CreateXDirect function with vector types as parameters\n    if (opts_.cpp_direct_copy && has_string_or_vector_fields) {\n      code_ +=\n          \"inline ::flatbuffers::Offset<{{STRUCT_NAME}}> \"\n          \"Create{{STRUCT_NAME}}Direct(\";\n      code_ += \"    \" + GetBuilder() + \" &_fbb\\\\\";\n      for (const auto& field : struct_def.fields.vec) {\n        if (!field->deprecated) {\n          GenParam(*field, true, \",\\n    \");\n        }\n      }\n      // Need to call \"Create\" with the struct namespace.\n      const auto qualified_create_name =\n          struct_def.defined_namespace->GetFullyQualifiedName(\"Create\");\n      code_.SetValue(\"CREATE_NAME\", TranslateNameSpace(qualified_create_name));\n      code_ += \") {\";\n      // Offset64 bit fields need to be added to the buffer first, so here we\n      // loop over the fields in order of their offset size, followed by their\n      // definition order. Otherwise the emitted code might add a Offset\n      // followed by an Offset64 which would trigger an assertion.\n\n      // TODO(derekbailey): maybe optimize for the case where there is no\n      // 64offsets in the whole schema?\n      ForAllFieldsOrderedByOffset(struct_def, [&](const FieldDef* field) {\n        if (field->deprecated) {\n          return;\n        }\n        code_.SetValue(\"FIELD_NAME\", Name(*field));\n        if (IsString(field->value.type)) {\n          if (!field->shared) {\n            code_.SetValue(\n                \"CREATE_STRING\",\n                \"CreateString\" + std::string(field->offset64\n                                                 ? \"<::flatbuffers::Offset64>\"\n                                                 : \"\"));\n          } else {\n            code_.SetValue(\"CREATE_STRING\", \"CreateSharedString\");\n          }\n          if (field->value.constant != \"0\") {\n            std::string escaped;\n            flatbuffers::EscapeString(field->value.constant.c_str(),\n                                      field->value.constant.length(), &escaped,\n                                      true, false);\n            code_ +=\n                \"  auto {{FIELD_NAME}}__ = {{FIELD_NAME}} ? \"\n                \"_fbb.{{CREATE_STRING}}({{FIELD_NAME}}) : \"\n                \"_fbb.{{CREATE_STRING}}(\" +\n                escaped + \");\";\n          } else {\n            code_ +=\n                \"  auto {{FIELD_NAME}}__ = {{FIELD_NAME}} ? \"\n                \"_fbb.{{CREATE_STRING}}({{FIELD_NAME}}) : 0;\";\n          }\n        } else if (IsVector(field->value.type)) {\n          const std::string force_align_code =\n              GenVectorForceAlign(*field, Name(*field) + \"->size()\");\n          if (!force_align_code.empty()) {\n            code_ += \"  if ({{FIELD_NAME}}) { \" + force_align_code + \" }\";\n          }\n          code_ += \"  auto {{FIELD_NAME}}__ = {{FIELD_NAME}} ? \\\\\";\n          const auto vtype = field->value.type.VectorType();\n          const auto has_key = TypeHasKey(vtype);\n          if (IsStruct(vtype)) {\n            const std::string type = WrapInNameSpace(*vtype.struct_def);\n            if (has_key) {\n              code_ += \"_fbb.CreateVectorOfSortedStructs<\" + type + \">\\\\\";\n            } else {\n              // If the field uses 64-bit addressing, create a 64-bit vector.\n              if (field->value.type.base_type == BASE_TYPE_VECTOR64) {\n                code_ += \"_fbb.CreateVectorOfStructs64\\\\\";\n              } else {\n                code_ += \"_fbb.CreateVectorOfStructs\\\\\";\n                if (field->offset64) {\n                  // This is normal 32-bit vector, with 64-bit addressing.\n                  code_ += \"64<::flatbuffers::Vector>\\\\\";\n                } else {\n                  code_ += \"<\" + type + \">\\\\\";\n                }\n              }\n            }\n          } else if (has_key) {\n            const auto type = WrapInNameSpace(*vtype.struct_def);\n            code_ += \"_fbb.CreateVectorOfSortedTables<\" + type + \">\\\\\";\n          } else {\n            const auto type = GenTypeWire(\n                vtype, \"\", VectorElementUserFacing(vtype), field->offset64);\n\n            if (field->value.type.base_type == BASE_TYPE_VECTOR64) {\n              code_ += \"_fbb.CreateVector64\\\\\";\n            } else {\n              // If the field uses 64-bit addressing, create a 64-bit vector.\n              code_.SetValue(\"64OFFSET\", field->offset64 ? \"64\" : \"\");\n              code_.SetValue(\"TYPE\",\n                             field->offset64 ? \"::flatbuffers::Vector\" : type);\n\n              code_ += \"_fbb.CreateVector{{64OFFSET}}<{{TYPE}}>\\\\\";\n            }\n          }\n          code_ += has_key ? \"({{FIELD_NAME}}) : 0;\" : \"(*{{FIELD_NAME}}) : 0;\";\n        }\n      });\n      code_ += \"  return {{CREATE_NAME}}{{STRUCT_NAME}}(\";\n      code_ += \"      _fbb\\\\\";\n      for (const auto& field : struct_def.fields.vec) {\n        if (field->deprecated) {\n          continue;\n        }\n        code_.SetValue(\"FIELD_NAME\", Name(*field));\n        code_ += \",\\n      {{FIELD_NAME}}\\\\\";\n        if (IsString(field->value.type) || IsVector(field->value.type)) {\n          code_ += \"__\\\\\";\n        }\n      }\n      code_ += \");\";\n      code_ += \"}\";\n      code_ += \"\";\n    }\n  }\n\n  std::string GenUnionUnpackVal(const FieldDef& afield,\n                                const char* vec_elem_access,\n                                const char* vec_type_access) {\n    auto type_name = WrapInNameSpace(*afield.value.type.enum_def);\n    return type_name + \"Union::UnPack(\" + \"_e\" + vec_elem_access + \", \" +\n           EscapeKeyword(Name(afield) + UnionTypeFieldSuffix()) + \"()\" +\n           vec_type_access + \", _resolver)\";\n  }\n\n  std::string GenUnpackVal(const Type& type, const std::string& val,\n                           bool invector, const FieldDef& afield) {\n    switch (type.base_type) {\n      case BASE_TYPE_STRING: {\n        if (FlexibleStringConstructor(&afield)) {\n          return NativeString(&afield) + \"(\" + val + \"->c_str(), \" + val +\n                 \"->size())\";\n        } else {\n          return val + \"->str()\";\n        }\n      }\n      case BASE_TYPE_STRUCT: {\n        if (IsStruct(type)) {\n          const auto& struct_attrs = type.struct_def->attributes;\n          const auto native_type = struct_attrs.Lookup(\"native_type\");\n          if (native_type) {\n            std::string unpack_call = \"::flatbuffers::UnPack\";\n            const auto pack_name = struct_attrs.Lookup(\"native_type_pack_name\");\n            if (pack_name) {\n              unpack_call += pack_name->constant;\n            }\n            unpack_call += \"(*\" + val + \")\";\n            if (invector || afield.native_inline) {\n              return unpack_call;\n            } else {\n              const auto name = native_type->constant;\n              const auto ptype = GenTypeNativePtr(name, &afield, true);\n              return ptype + \"(new \" + name + \"(\" + unpack_call + \"))\";\n            }\n          } else if (invector || afield.native_inline) {\n            return \"*\" + val;\n          } else {\n            const auto name = WrapInNameSpace(*type.struct_def);\n            const auto ptype = GenTypeNativePtr(name, &afield, true);\n            return ptype + \"(new \" + name + \"(*\" + val + \"))\";\n          }\n        } else {\n          std::string ptype = afield.native_inline ? \"*\" : \"\";\n          ptype += GenTypeNativePtr(\n              WrapNativeNameInNameSpace(*type.struct_def, opts_), &afield,\n              true);\n          return ptype + \"(\" + val + \"->UnPack(_resolver))\";\n        }\n      }\n      case BASE_TYPE_UNION: {\n        return GenUnionUnpackVal(\n            afield, invector ? \"->Get(_i)\" : \"\",\n            invector ? (\"->GetEnum<\" + type.enum_def->name + \">(_i)\").c_str()\n                     : \"\");\n      }\n      default: {\n        return val;\n        break;\n      }\n    }\n  }\n\n  std::string GenUnpackFieldStatement(const FieldDef& field,\n                                      const FieldDef* union_field) {\n    std::string code;\n    switch (field.value.type.base_type) {\n      case BASE_TYPE_VECTOR64:\n      case BASE_TYPE_VECTOR: {\n        auto name = Name(field);\n        if (field.value.type.element == BASE_TYPE_UTYPE) {\n          name = StripUnionType(Name(field));\n        }\n        const std::string vector_field = \"_o->\" + name;\n        code += \"{ \" + vector_field + \".resize(_e->size()); \";\n        if (!field.value.type.enum_def && !IsBool(field.value.type.element) &&\n            IsOneByte(field.value.type.element)) {\n          // For vectors of bytes, std::copy is used to improve performance.\n          // This doesn't work for:\n          //  - enum types because they have to be explicitly static_cast.\n          //  - vectors of bool, since they are a template specialization.\n          //  - multiple-byte types due to endianness.\n          code +=\n              \"std::copy(_e->begin(), _e->end(), _o->\" + name + \".begin()); }\";\n        } else {\n          std::string indexing;\n          if (field.value.type.enum_def) {\n            indexing += \"static_cast<\" +\n                        WrapInNameSpace(*field.value.type.enum_def) + \">(\";\n          }\n          indexing += \"_e->Get(_i)\";\n          if (field.value.type.enum_def) {\n            indexing += \")\";\n          }\n          if (field.value.type.element == BASE_TYPE_BOOL) {\n            indexing += \" != 0\";\n          }\n          // Generate code that pushes data from _e to _o in the form:\n          //   for (uoffset_t i = 0; i < _e->size(); ++i) {\n          //     _o->field.push_back(_e->Get(_i));\n          //   }\n          auto access =\n              field.value.type.element == BASE_TYPE_UTYPE\n                  ? \".type\"\n                  : (field.value.type.element == BASE_TYPE_UNION ? \".value\"\n                                                                 : \"\");\n          if (field.value.type.base_type == BASE_TYPE_VECTOR64) {\n            code += \"for (::flatbuffers::uoffset64_t _i = 0;\";\n          } else {\n            code += \"for (::flatbuffers::uoffset_t _i = 0;\";\n          }\n          code += \" _i < _e->size(); _i++) { \";\n          auto cpp_type = field.attributes.Lookup(\"cpp_type\");\n          if (cpp_type) {\n            // Generate code that resolves the cpp pointer type, of the form:\n            //  if (resolver)\n            //    (*resolver)(&_o->field, (hash_value_t)(_e));\n            //  else\n            //    _o->field = nullptr;\n            code += \"/*vector resolver, \" + PtrType(&field) + \"*/ \";\n            code += \"if (_resolver) \";\n            code += \"(*_resolver)\";\n            code += \"(reinterpret_cast<void **>(&_o->\" + name + \"[_i]\" +\n                    access + \"), \";\n            code +=\n                \"static_cast<::flatbuffers::hash_value_t>(\" + indexing + \"));\";\n            if (PtrType(&field) == \"naked\") {\n              code += \" else \";\n              code += \"_o->\" + name + \"[_i]\" + access + \" = nullptr; \";\n            } else {\n              // code += \" else \";\n              // code += \"_o->\" + name + \"[_i]\" + access + \" = \" +\n              // GenTypeNativePtr(cpp_type->constant, &field, true) + \"();\";\n              code += \"/* else do nothing */\";\n            }\n          } else {\n            const bool is_pointer = IsVectorOfPointers(field);\n            if (is_pointer) {\n              code += \"if(_o->\" + name + \"[_i]\" + \") { \";\n              code += indexing + \"->UnPackTo(_o->\" + name + \"[_i]\" +\n                      GenPtrGet(field) + \", _resolver);\";\n              code += \" } else { \";\n            }\n            code += \"_o->\" + name + \"[_i]\" + access + \" = \";\n            code += GenUnpackVal(field.value.type.VectorType(), indexing, true,\n                                 field);\n            code += \"; \";\n            if (is_pointer) {\n              code += \"} \";\n            }\n          }\n          code += \"} } else { \" + vector_field + \".resize(0); }\";\n        }\n        break;\n      }\n      case BASE_TYPE_UTYPE: {\n        FLATBUFFERS_ASSERT(union_field->value.type.base_type ==\n                           BASE_TYPE_UNION);\n        // Generate code that sets the union type, of the form:\n        //   _o->field.type = _e;\n        code += \"_o->\" + Name(*union_field) + \".type = _e;\";\n        break;\n      }\n      case BASE_TYPE_UNION: {\n        // Generate code that sets the union value, of the form:\n        //   _o->field.value = Union::Unpack(_e, field_type(), resolver);\n        code += \"_o->\" + Name(field) + \".value = \";\n        code += GenUnionUnpackVal(field, \"\", \"\");\n        code += \";\";\n        break;\n      }\n      default: {\n        auto cpp_type = field.attributes.Lookup(\"cpp_type\");\n        if (cpp_type) {\n          // Generate code that resolves the cpp pointer type, of the form:\n          //  if (resolver)\n          //    (*resolver)(&_o->field, (hash_value_t)(_e));\n          //  else\n          //    _o->field = nullptr;\n          code += \"/*scalar resolver, \" + PtrType(&field) + \"*/ \";\n          code += \"if (_resolver) \";\n          code += \"(*_resolver)\";\n          code += \"(reinterpret_cast<void **>(&_o->\" + Name(field) + \"), \";\n          code += \"static_cast<::flatbuffers::hash_value_t>(_e));\";\n          if (PtrType(&field) == \"naked\") {\n            code += \" else \";\n            code += \"_o->\" + Name(field) + \" = nullptr;\";\n          } else {\n            // code += \" else \";\n            // code += \"_o->\" + Name(field) + \" = \" +\n            // GenTypeNativePtr(cpp_type->constant, &field, true) + \"();\";\n            code += \"/* else do nothing */;\";\n          }\n        } else {\n          // Generate code for assigning the value, of the form:\n          //  _o->field = value;\n          const bool is_pointer = IsPointer(field);\n\n          const std::string out_field = \"_o->\" + Name(field);\n\n          if (is_pointer) {\n            code += \"{ if(\" + out_field + \") { \";\n            code += \"_e->UnPackTo(\" + out_field + GenPtrGet(field) +\n                    \", _resolver);\";\n            code += \" } else { \";\n          }\n          code += out_field + \" = \";\n          code += GenUnpackVal(field.value.type, \"_e\", false, field) + \";\";\n          if (is_pointer) {\n            code += \" } } else if (\" + out_field + \") { \" + out_field +\n                    \".reset(); }\";\n          }\n        }\n        break;\n      }\n    }\n    return code;\n  }\n\n  std::string GenCreateParam(const FieldDef& field) {\n    std::string value = \"_o->\";\n    if (field.value.type.base_type == BASE_TYPE_UTYPE) {\n      value += StripUnionType(Name(field));\n      value += \".type\";\n    } else {\n      value += Name(field);\n    }\n    if (!IsVector(field.value.type) && field.attributes.Lookup(\"cpp_type\")) {\n      auto type = GenTypeBasic(field.value.type, false);\n      value =\n          \"_rehasher ? \"\n          \"static_cast<\" +\n          type + \">((*_rehasher)(\" + value + GenPtrGet(field) + \")) : 0\";\n    }\n\n    std::string code;\n    switch (field.value.type.base_type) {\n      // String fields are of the form:\n      //   _fbb.CreateString(_o->field)\n      // or\n      //   _fbb.CreateSharedString(_o->field)\n      case BASE_TYPE_STRING: {\n        if (!field.shared) {\n          code +=\n              \"_fbb.CreateString\" +\n              std::string(field.offset64 ? \"<::flatbuffers::Offset64>\" : \"\") +\n              \"(\";\n        } else {\n          code += \"_fbb.CreateSharedString(\";\n        }\n        code += value;\n        code.push_back(')');\n\n        // For optional fields, check to see if there actually is any data\n        // in _o->field before attempting to access it. If there isn't,\n        // depending on set_empty_strings_to_null either set it to 0 or an empty\n        // string.\n        if (!field.IsRequired()) {\n          auto empty_value = opts_.set_empty_strings_to_null\n                                 ? \"0\"\n                                 : \"_fbb.CreateSharedString(\\\"\\\")\";\n          code = value + \".empty() ? \" + empty_value + \" : \" + code;\n        }\n        break;\n      }\n        // Vector fields come in several flavours, of the forms:\n        //   _fbb.CreateVector(_o->field);\n        //   _fbb.CreateVector((const utype*)_o->field.data(),\n        //   _o->field.size()); _fbb.CreateVectorOfStrings(_o->field)\n        //   _fbb.CreateVectorOfStructs(_o->field)\n        //   _fbb.CreateVector<Offset<T>>(_o->field.size() [&](size_t i) {\n        //     return CreateT(_fbb, _o->Get(i), rehasher);\n        //   });\n      case BASE_TYPE_VECTOR64:\n      case BASE_TYPE_VECTOR: {\n        auto vector_type = field.value.type.VectorType();\n        switch (vector_type.base_type) {\n          case BASE_TYPE_STRING: {\n            if (NativeString(&field) == \"std::string\") {\n              code += \"_fbb.CreateVectorOfStrings(\" + value + \")\";\n            } else {\n              // Use by-function serialization to emulate\n              // CreateVectorOfStrings(); this works also with non-std strings.\n              code +=\n                  \"_fbb.CreateVector<::flatbuffers::Offset<::flatbuffers::\"\n                  \"String>>\"\n                  \" \";\n              code += \"(\" + value + \".size(), \";\n              code += \"[](size_t i, _VectorArgs *__va) { \";\n              code +=\n                  \"return __va->__fbb->CreateString(__va->_\" + value + \"[i]);\";\n              code += \" }, &_va )\";\n            }\n            break;\n          }\n          case BASE_TYPE_STRUCT: {\n            if (IsStruct(vector_type)) {\n              const auto& struct_attrs =\n                  field.value.type.struct_def->attributes;\n              const auto native_type = struct_attrs.Lookup(\"native_type\");\n              if (native_type) {\n                code += \"_fbb.CreateVectorOfNativeStructs<\";\n                code += WrapInNameSpace(*vector_type.struct_def) + \", \" +\n                        native_type->constant + \">\";\n                code += \"(\" + value;\n                const auto pack_name =\n                    struct_attrs.Lookup(\"native_type_pack_name\");\n                if (pack_name) {\n                  code += \", ::flatbuffers::Pack\" + pack_name->constant;\n                }\n                code += \")\";\n              } else {\n                // If the field uses 64-bit addressing, create a 64-bit vector.\n                if (field.value.type.base_type == BASE_TYPE_VECTOR64) {\n                  code += \"_fbb.CreateVectorOfStructs64\";\n                } else {\n                  code += \"_fbb.CreateVectorOfStructs\";\n                  if (field.offset64) {\n                    // This is normal 32-bit vector, with 64-bit addressing.\n                    code += \"64<::flatbuffers::Vector>\";\n                  }\n                }\n                code += \"(\" + value + \")\";\n              }\n            } else {\n              code += \"_fbb.CreateVector<::flatbuffers::Offset<\";\n              code += WrapInNameSpace(*vector_type.struct_def) + \">> \";\n              code += \"(\" + value + \".size(), \";\n              code += \"[](size_t i, _VectorArgs *__va) { \";\n              code += \"return \" +\n                      WrapInNameSpace(vector_type.struct_def->defined_namespace,\n                                      \"Create\" + vector_type.struct_def->name);\n              code += \"(*__va->__fbb, \";\n              if (field.native_inline) {\n                code += \"&(__va->_\" + value + \"[i])\";\n              } else {\n                code += \"__va->_\" + value + \"[i]\" + GenPtrGet(field);\n              }\n              code += \", __va->__rehasher); }, &_va )\";\n            }\n            break;\n          }\n          case BASE_TYPE_BOOL: {\n            code += \"_fbb.CreateVector(\" + value + \")\";\n            break;\n          }\n          case BASE_TYPE_UNION: {\n            code +=\n                \"_fbb.CreateVector<::flatbuffers::\"\n                \"Offset<void>>(\" +\n                value +\n                \".size(), [](size_t i, _VectorArgs *__va) { \"\n                \"return __va->_\" +\n                value + \"[i].Pack(*__va->__fbb, __va->__rehasher); }, &_va)\";\n            break;\n          }\n          case BASE_TYPE_UTYPE: {\n            value = StripUnionType(value);\n            auto underlying_type = GenTypeBasic(vector_type, false);\n            const std::string& type = opts_.scoped_enums\n                                          ? Name(*field.value.type.enum_def)\n                                          : underlying_type;\n            auto enum_value = \"__va->_\" + value + \"[i].type\";\n            if (!opts_.scoped_enums)\n              enum_value =\n                  \"static_cast<\" + underlying_type + \">(\" + enum_value + \")\";\n\n            code += \"_fbb.CreateVector<\" + type + \">(\" + value +\n                    \".size(), [](size_t i, _VectorArgs *__va) { return \" +\n                    enum_value + \"; }, &_va)\";\n            break;\n          }\n          default: {\n            if (field.value.type.enum_def &&\n                !VectorElementUserFacing(vector_type)) {\n              // For enumerations, we need to get access to the array data for\n              // the underlying storage type (eg. uint8_t).\n              const auto basetype = GenTypeBasic(\n                  field.value.type.enum_def->underlying_type, false);\n              code += \"_fbb.CreateVectorScalarCast<\" + basetype +\n                      \">(::flatbuffers::data(\" + value + \"), \" + value +\n                      \".size())\";\n            } else if (field.attributes.Lookup(\"cpp_type\")) {\n              auto type = GenTypeBasic(vector_type, false);\n              code += \"_fbb.CreateVector<\" + type + \">(\" + value + \".size(), \";\n              code += \"[](size_t i, _VectorArgs *__va) { \";\n              code += \"return __va->__rehasher ? \";\n              code += \"static_cast<\" + type + \">((*__va->__rehasher)\";\n              code += \"(__va->_\" + value + \"[i]\" + GenPtrGet(field) + \")) : 0\";\n              code += \"; }, &_va )\";\n            } else {\n              // If the field uses 64-bit addressing, create a 64-bit vector.\n              if (field.value.type.base_type == BASE_TYPE_VECTOR64) {\n                code += \"_fbb.CreateVector64(\" + value + \")\";\n              } else {\n                code += \"_fbb.CreateVector\";\n                if (field.offset64) {\n                  // This is normal 32-bit vector, with 64-bit addressing.\n                  code += \"64<::flatbuffers::Vector>\";\n                }\n                code += \"(\" + value + \")\";\n              }\n            }\n            break;\n          }\n        }\n\n        // If set_empty_vectors_to_null option is enabled, for optional fields,\n        // check to see if there actually is any data in _o->field before\n        // attempting to access it.\n        if (field.attributes.Lookup(\"nested_flatbuffer\") ||\n            (opts_.set_empty_vectors_to_null && !field.IsRequired())) {\n          code = value + \".size() ? \" + code + \" : 0\";\n        }\n        break;\n      }\n      case BASE_TYPE_UNION: {\n        // _o->field.Pack(_fbb);\n        code += value + \".Pack(_fbb)\";\n        break;\n      }\n      case BASE_TYPE_STRUCT: {\n        if (IsStruct(field.value.type)) {\n          const auto& struct_attribs = field.value.type.struct_def->attributes;\n          const auto native_type = struct_attribs.Lookup(\"native_type\");\n          if (native_type && field.native_inline) {\n            code += \"::flatbuffers::Pack\";\n            const auto pack_name =\n                struct_attribs.Lookup(\"native_type_pack_name\");\n            if (pack_name) {\n              code += pack_name->constant;\n            }\n            code += \"(\" + value + \")\";\n          } else if (native_type && !field.native_inline) {\n            code += WrapInNameSpace(*field.value.type.struct_def) + \"{};\";\n            code += \" if (_o->\" + Name(field) + \") _\" + Name(field) +\n                    \" = ::flatbuffers::Pack(*_o->\" + Name(field) + \")\";\n          } else if (field.native_inline) {\n            code += \"&\" + value;\n          } else {\n            code += value + \" ? \" + value + GenPtrGet(field) + \" : nullptr\";\n          }\n        } else {\n          // _o->field ? CreateT(_fbb, _o->field.get(), _rehasher);\n          const auto& nested_struct = *field.value.type.struct_def;\n          code += value + \" ? \" +\n                  WrapInNameSpace(nested_struct.defined_namespace,\n                                  \"Create\" + nested_struct.name);\n          code += \"(_fbb, \" + value;\n          if (!field.native_inline) code += GenPtrGet(field);\n          code += \", _rehasher) : 0\";\n        }\n        break;\n      }\n      default: {\n        code += value;\n        break;\n      }\n    }\n    return code;\n  }\n\n  // Generate code for tables that needs to come after the regular definition.\n  void GenTablePost(const StructDef& struct_def) {\n    // Don't generate an object API struct for the table if it is a native type.\n    const auto native_type = struct_def.attributes.Lookup(\"native_type\");\n    if (opts_.generate_object_based_api && !native_type) {\n      GenNativeTablePost(struct_def);\n    }\n\n    code_.SetValue(\"STRUCT_NAME\", Name(struct_def));\n    code_.SetValue(\"NATIVE_NAME\",\n                   NativeName(Name(struct_def), &struct_def, opts_));\n\n    if (opts_.generate_object_based_api) {\n      // Generate the >= C++11 copy ctor and assignment operator definitions.\n      if (!native_type) {\n        GenCopyCtorAssignOpDefs(struct_def);\n      }\n\n      // Generate the X::UnPack() method.\n      code_ +=\n          \"inline \" + TableUnPackSignature(struct_def, false, opts_) + \" {\";\n\n      if (opts_.g_cpp_std == cpp::CPP_STD_X0) {\n        auto native_name = WrapNativeNameInNameSpace(struct_def, parser_.opts);\n        code_.SetValue(\"POINTER_TYPE\",\n                       GenTypeNativePtr(native_name, nullptr, false));\n        code_ +=\n            \"  {{POINTER_TYPE}} _o = {{POINTER_TYPE}}(new {{NATIVE_NAME}}());\";\n      } else if (opts_.g_cpp_std == cpp::CPP_STD_11) {\n        code_ +=\n            \"  auto _o = std::unique_ptr<{{NATIVE_NAME}}>(new \"\n            \"{{NATIVE_NAME}}());\";\n      } else {\n        code_ += \"  auto _o = std::make_unique<{{NATIVE_NAME}}>();\";\n      }\n      code_ += \"  UnPackTo(_o.get(), _resolver);\";\n      code_ += \"  return _o.release();\";\n      code_ += \"}\";\n      code_ += \"\";\n\n      // Generate an Unpack method for the C++ object if that table does not\n      // have a native type.\n      if (!native_type) {\n        code_ +=\n            \"inline \" + TableUnPackToSignature(struct_def, false, opts_) + \" {\";\n        code_ += \"  (void)_o;\";\n        code_ += \"  (void)_resolver;\";\n\n        for (auto it = struct_def.fields.vec.begin();\n             it != struct_def.fields.vec.end(); ++it) {\n          const auto& field = **it;\n          if (field.deprecated) {\n            continue;\n          }\n\n          // Assign a value from |this| to |_o|.   Values from |this| are stored\n          // in a variable |_e| by calling this->field_type().  The value is\n          // then assigned to |_o| using the GenUnpackFieldStatement.\n          const bool is_union = field.value.type.base_type == BASE_TYPE_UTYPE;\n          const auto statement =\n              GenUnpackFieldStatement(field, is_union ? *(it + 1) : nullptr);\n\n          code_.SetValue(\"FIELD_NAME\", Name(field));\n          auto prefix = \"  { auto _e = {{FIELD_NAME}}(); \";\n          auto check = IsScalar(field.value.type.base_type) ? \"\" : \"if (_e) \";\n          auto postfix = \" }\";\n          code_ += std::string(prefix) + check + statement + postfix;\n        }\n        code_ += \"}\";\n        code_ += \"\";\n      }\n\n      // Generate the global CreateX function that simply calls the\n      // X::Pack member function.\n      code_ +=\n          \"inline \" + TableCreateSignature(struct_def, false, opts_) + \" {\";\n      code_ += \"  return {{STRUCT_NAME}}::Pack(_fbb, _o, _rehasher);\";\n      code_ += \"}\";\n      code_ += \"\";\n\n      if (!native_type) {\n        // Generate a Pack method that works with an unpacked C++ object if it\n        // does not have a native type.\n        code_ +=\n            \"inline \" + TablePackSignature(struct_def, false, opts_) + \" {\";\n        code_ += \"  (void)_rehasher;\";\n        code_ += \"  (void)_o;\";\n\n        code_ +=\n            \"  struct _VectorArgs \"\n            \"{ \" +\n            GetBuilder() +\n            \" *__fbb; \"\n            \"const \" +\n            NativeName(Name(struct_def), &struct_def, opts_) +\n            \"* __o; \"\n            \"const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { \"\n            \"&_fbb, _o, _rehasher}; (void)_va;\";\n\n        for (auto it = struct_def.fields.vec.begin();\n             it != struct_def.fields.vec.end(); ++it) {\n          auto& field = **it;\n          if (field.deprecated) {\n            continue;\n          }\n          if (IsVector(field.value.type)) {\n            const std::string force_align_code =\n                GenVectorForceAlign(field, \"_o->\" + Name(field) + \".size()\");\n            if (!force_align_code.empty()) {\n              code_ += \"  \" + force_align_code;\n            }\n          }\n          code_ +=\n              \"  auto _\" + Name(field) + \" = \" + GenCreateParam(field) + \";\";\n        }\n        // Need to call \"Create\" with the struct namespace.\n        const auto qualified_create_name =\n            struct_def.defined_namespace->GetFullyQualifiedName(\"Create\");\n        code_.SetValue(\"CREATE_NAME\",\n                       TranslateNameSpace(qualified_create_name));\n\n        code_ += \"  return {{CREATE_NAME}}{{STRUCT_NAME}}(\";\n        code_ += \"      _fbb\\\\\";\n        for (const auto& field : struct_def.fields.vec) {\n          if (field->deprecated) {\n            continue;\n          }\n\n          bool pass_by_address = false;\n          bool check_ptr = false;\n          if (field->value.type.base_type == BASE_TYPE_STRUCT) {\n            if (IsStruct(field->value.type)) {\n              auto native_type =\n                  field->value.type.struct_def->attributes.Lookup(\n                      \"native_type\");\n              auto native_inline = field->attributes.Lookup(\"native_inline\");\n              if (native_type) {\n                pass_by_address = true;\n              }\n              if (native_type && !native_inline) {\n                check_ptr = true;\n              }\n            }\n          }\n\n          // Call the CreateX function using values from |_o|.\n          if (pass_by_address && check_ptr) {\n            code_ += \",\\n      _o->\" + Name(*field) + \" ? &_\" + Name(*field) +\n                     \" : nullptr\\\\\";\n          } else if (pass_by_address) {\n            code_ += \",\\n      &_\" + Name(*field) + \"\\\\\";\n          } else {\n            code_ += \",\\n      _\" + Name(*field) + \"\\\\\";\n          }\n        }\n        code_ += \");\";\n        code_ += \"}\";\n        code_ += \"\";\n      }\n    }\n  }\n\n  static void GenPadding(\n      const FieldDef& field, std::string* code_ptr, int* id,\n      const std::function<void(int bits, std::string* code_ptr, int* id)>& f) {\n    if (field.padding) {\n      for (int i = 0; i < 4; i++) {\n        if (static_cast<int>(field.padding) & (1 << i)) {\n          f((1 << i) * 8, code_ptr, id);\n        }\n      }\n      FLATBUFFERS_ASSERT(!(field.padding & ~0xF));\n    }\n  }\n\n  static void PaddingDefinition(int bits, std::string* code_ptr, int* id) {\n    *code_ptr += \"  int\" + NumToString(bits) + \"_t padding\" +\n                 NumToString((*id)++) + \"__;\";\n  }\n\n  static void PaddingInitializer(int bits, std::string* code_ptr, int* id) {\n    (void)bits;\n    if (!code_ptr->empty()) *code_ptr += \",\\n        \";\n    *code_ptr += \"padding\" + NumToString((*id)++) + \"__(0)\";\n  }\n\n  static void PaddingNoop(int bits, std::string* code_ptr, int* id) {\n    (void)bits;\n    if (!code_ptr->empty()) *code_ptr += '\\n';\n    *code_ptr += \"    (void)padding\" + NumToString((*id)++) + \"__;\";\n  }\n\n  void GenStructDefaultConstructor(const StructDef& struct_def) {\n    std::string init_list;\n    std::string body;\n    bool first_in_init_list = true;\n    int padding_initializer_id = 0;\n    int padding_body_id = 0;\n    for (const auto& field : struct_def.fields.vec) {\n      const auto field_name = Name(*field) + \"_\";\n\n      if (first_in_init_list) {\n        first_in_init_list = false;\n      } else {\n        init_list += \",\";\n        init_list += \"\\n        \";\n      }\n\n      init_list += field_name;\n      if (IsStruct(field->value.type) || IsArray(field->value.type)) {\n        // this is either default initialization of struct\n        // or\n        // implicit initialization of array\n        // for each object in array it:\n        // * sets it as zeros for POD types (integral, floating point, etc)\n        // * calls default constructor for classes/structs\n        init_list += \"()\";\n      } else {\n        init_list += \"(0)\";\n      }\n      if (field->padding) {\n        GenPadding(*field, &init_list, &padding_initializer_id,\n                   PaddingInitializer);\n        GenPadding(*field, &body, &padding_body_id, PaddingNoop);\n      }\n    }\n\n    if (init_list.empty()) {\n      code_ += \"  {{STRUCT_NAME}}()\";\n      code_ += \"  {}\";\n    } else {\n      code_.SetValue(\"INIT_LIST\", init_list);\n      code_ += \"  {{STRUCT_NAME}}()\";\n      code_ += \"      : {{INIT_LIST}} {\";\n      if (!body.empty()) {\n        code_ += body;\n      }\n      code_ += \"  }\";\n    }\n  }\n\n  void GenStructConstructor(const StructDef& struct_def,\n                            GenArrayArgMode array_mode) {\n    std::string arg_list;\n    std::string init_list;\n    int padding_id = 0;\n    auto first = struct_def.fields.vec.begin();\n    // skip arrays if generate ctor without array assignment\n    const auto init_arrays = (array_mode != kArrayArgModeNone);\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      const auto& field = **it;\n      const auto& type = field.value.type;\n      const auto is_array = IsArray(type);\n      const auto arg_name = \"_\" + Name(field);\n      if (!is_array || init_arrays) {\n        if (it != first && !arg_list.empty()) {\n          arg_list += \", \";\n        }\n        arg_list += !is_array ? GenTypeGet(type, \" \", \"const \", \" &\", true)\n                              : GenTypeSpan(type, true, type.fixed_length);\n        arg_list += arg_name;\n      }\n      // skip an array with initialization from span\n      if (false == (is_array && init_arrays)) {\n        if (it != first && !init_list.empty()) {\n          init_list += \",\\n        \";\n        }\n        init_list += Name(field) + \"_\";\n        if (IsScalar(type.base_type)) {\n          auto scalar_type = GenUnderlyingCast(field, false, arg_name);\n          init_list += \"(::flatbuffers::EndianScalar(\" + scalar_type + \"))\";\n        } else {\n          FLATBUFFERS_ASSERT((is_array && !init_arrays) || IsStruct(type));\n          if (!is_array)\n            init_list += \"(\" + arg_name + \")\";\n          else\n            init_list += \"()\";\n        }\n      }\n      if (field.padding)\n        GenPadding(field, &init_list, &padding_id, PaddingInitializer);\n    }\n\n    if (!arg_list.empty()) {\n      code_.SetValue(\"ARG_LIST\", arg_list);\n      code_.SetValue(\"INIT_LIST\", init_list);\n      if (!init_list.empty()) {\n        code_ += \"  {{STRUCT_NAME}}({{ARG_LIST}})\";\n        code_ += \"      : {{INIT_LIST}} {\";\n      } else {\n        code_ += \"  {{STRUCT_NAME}}({{ARG_LIST}}) {\";\n      }\n      padding_id = 0;\n      for (const auto& field : struct_def.fields.vec) {\n        const auto& type = field->value.type;\n        if (IsArray(type) && init_arrays) {\n          const auto& element_type = type.VectorType();\n          const auto is_enum = IsEnum(element_type);\n          FLATBUFFERS_ASSERT(\n              (IsScalar(element_type.base_type) || IsStruct(element_type)) &&\n              \"invalid declaration\");\n          const auto face_type = GenTypeGet(type, \" \", \"\", \"\", is_enum);\n          std::string get_array =\n              is_enum ? \"CastToArrayOfEnum<\" + face_type + \">\" : \"CastToArray\";\n          const auto field_name = Name(*field) + \"_\";\n          const auto arg_name = \"_\" + Name(*field);\n          code_ += \"    ::flatbuffers::\" + get_array + \"(\" + field_name +\n                   \").CopyFromSpan(\" + arg_name + \");\";\n        }\n        if (field->padding) {\n          std::string padding;\n          GenPadding(*field, &padding, &padding_id, PaddingNoop);\n          code_ += padding;\n        }\n      }\n      code_ += \"  }\";\n    }\n  }\n\n  void GenArrayAccessor(const Type& type, bool mutable_accessor) {\n    FLATBUFFERS_ASSERT(IsArray(type));\n    const auto is_enum = IsEnum(type.VectorType());\n    // The Array<bool,N> is a tricky case, like std::vector<bool>.\n    // It requires a specialization of Array class.\n    // Generate Array<uint8_t> for Array<bool>.\n    const auto face_type = GenTypeGet(type, \" \", \"\", \"\", is_enum);\n    std::string ret_type = \"::flatbuffers::Array<\" + face_type + \", \" +\n                           NumToString(type.fixed_length) + \">\";\n    if (mutable_accessor)\n      code_ += \"  \" + ret_type + \" *mutable_{{FIELD_NAME}}() {\";\n    else\n      code_ += \"  const \" + ret_type + \" *{{FIELD_NAME}}() const {\";\n\n    std::string get_array =\n        is_enum ? \"CastToArrayOfEnum<\" + face_type + \">\" : \"CastToArray\";\n    code_ += \"    return &::flatbuffers::\" + get_array + \"({{FIELD_VALUE}});\";\n    code_ += \"  }\";\n  }\n\n  // Generate an accessor struct with constructor for a flatbuffers struct.\n  void GenStruct(const StructDef& struct_def) {\n    // Generate an accessor struct, with private variables of the form:\n    // type name_;\n    // Generates manual padding and alignment.\n    // Variables are private because they contain little endian data on all\n    // platforms.\n    GenComment(struct_def.doc_comment);\n    code_.SetValue(\"ALIGN\", NumToString(struct_def.minalign));\n    code_.SetValue(\"STRUCT_NAME\", Name(struct_def));\n\n    code_ +=\n        \"FLATBUFFERS_MANUALLY_ALIGNED_STRUCT({{ALIGN}}) \"\n        \"{{STRUCT_NAME}} FLATBUFFERS_FINAL_CLASS {\";\n    code_ += \" private:\";\n\n    int padding_id = 0;\n    for (const auto& field : struct_def.fields.vec) {\n      const auto& field_type = field->value.type;\n      code_.SetValue(\"FIELD_TYPE\", GenTypeGet(field_type, \" \", \"\", \" \", false));\n      code_.SetValue(\"FIELD_NAME\", Name(*field));\n      code_.SetValue(\"ARRAY\",\n                     IsArray(field_type)\n                         ? \"[\" + NumToString(field_type.fixed_length) + \"]\"\n                         : \"\");\n      code_ += (\"  {{FIELD_TYPE}}{{FIELD_NAME}}_{{ARRAY}};\");\n\n      if (field->padding) {\n        std::string padding;\n        GenPadding(*field, &padding, &padding_id, PaddingDefinition);\n        code_ += padding;\n      }\n    }\n\n    // Generate GetFullyQualifiedName\n    code_ += \"\";\n    code_ += \" public:\";\n\n    if (opts_.g_cpp_std >= cpp::CPP_STD_17) {\n      code_ += \"  struct Traits;\";\n    }\n\n    // Make TypeTable accessible via the generated struct.\n    if (opts_.mini_reflect != IDLOptions::kNone) {\n      code_ +=\n          \"  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\";\n      code_ += \"    return {{STRUCT_NAME}}TypeTable();\";\n      code_ += \"  }\";\n    }\n\n    GenFullyQualifiedNameGetter(struct_def, Name(struct_def));\n\n    // Generate a default constructor.\n    GenStructDefaultConstructor(struct_def);\n\n    // Generate a constructor that takes all fields as arguments,\n    // excluding arrays.\n    GenStructConstructor(struct_def, kArrayArgModeNone);\n\n    auto arrays_num = std::count_if(\n        struct_def.fields.vec.begin(), struct_def.fields.vec.end(),\n        [](const FieldDef* fd) { return IsArray(fd->value.type); });\n    if (arrays_num > 0) {\n      GenStructConstructor(struct_def, kArrayArgModeSpanStatic);\n    }\n\n    // Generate accessor methods of the form:\n    // type name() const { return ::flatbuffers::EndianScalar(name_); }\n    for (const auto& field : struct_def.fields.vec) {\n      const auto& type = field->value.type;\n      const auto is_scalar = IsScalar(type.base_type);\n      const auto is_array = IsArray(type);\n\n      const auto field_type = GenTypeGet(type, \" \", is_array ? \"\" : \"const \",\n                                         is_array ? \"\" : \" &\", true);\n      auto member = Name(*field) + \"_\";\n      const std::string& value =\n          is_scalar ? \"::flatbuffers::EndianScalar(\" + member + \")\" : member;\n\n      code_.SetValue(\"FIELD_NAME\", Name(*field));\n      code_.SetValue(\"FIELD_TYPE\", field_type);\n      code_.SetValue(\"FIELD_VALUE\", GenUnderlyingCast(*field, true, value));\n\n      GenComment(field->doc_comment, \"  \");\n\n      // Generate a const accessor function.\n      if (is_array) {\n        GenArrayAccessor(type, false);\n      } else {\n        code_ += \"  {{FIELD_TYPE}}{{FIELD_NAME}}() const {\";\n        code_ += \"    return {{FIELD_VALUE}};\";\n        code_ += \"  }\";\n      }\n\n      // Generate a mutable accessor function.\n      if (opts_.mutable_buffer) {\n        auto mut_field_type =\n            GenTypeGet(type, \" \", \"\", is_array ? \"\" : \" &\", true);\n        code_.SetValue(\"FIELD_TYPE\", mut_field_type);\n        if (is_scalar) {\n          code_.SetValue(\"ARG\", GenTypeBasic(type, true));\n          code_.SetValue(\"FIELD_VALUE\",\n                         GenUnderlyingCast(*field, false, \"_\" + Name(*field)));\n\n          code_ += \"  void mutate_{{FIELD_NAME}}({{ARG}} _{{FIELD_NAME}}) {\";\n          code_ +=\n              \"    ::flatbuffers::WriteScalar(&{{FIELD_NAME}}_, \"\n              \"{{FIELD_VALUE}});\";\n          code_ += \"  }\";\n        } else if (is_array) {\n          GenArrayAccessor(type, true);\n        } else {\n          code_ += \"  {{FIELD_TYPE}}mutable_{{FIELD_NAME}}() {\";\n          code_ += \"    return {{FIELD_VALUE}};\";\n          code_ += \"  }\";\n        }\n      }\n\n      // Generate a comparison function for this field if it is a key.\n      if (field->key) {\n        GenKeyFieldMethods(*field);\n      }\n    }\n    code_.SetValue(\"NATIVE_NAME\", Name(struct_def));\n    GenOperatorNewDelete(struct_def);\n\n    if (opts_.cpp_static_reflection) {\n      GenIndexBasedFieldGetter(struct_def);\n    }\n\n    code_ += \"};\";\n\n    code_.SetValue(\"STRUCT_BYTE_SIZE\", NumToString(struct_def.bytesize));\n    code_ += \"FLATBUFFERS_STRUCT_END({{STRUCT_NAME}}, {{STRUCT_BYTE_SIZE}});\";\n    if (opts_.gen_compare) {\n      GenCompareOperator(struct_def, \"()\");\n    }\n    if (opts_.gen_absl_hash) {\n      GenAbslHashValue(struct_def);\n    }\n    code_ += \"\";\n\n    // Definition for type traits for this table type. This allows querying var-\n    // ious compile-time traits of the table.\n    if (opts_.g_cpp_std >= cpp::CPP_STD_17) {\n      GenTraitsStruct(struct_def);\n    }\n  }\n\n  // Set up the correct namespace. Only open a namespace if the existing one is\n  // different (closing/opening only what is necessary).\n  //\n  // The file must start and end with an empty (or null) namespace so that\n  // namespaces are properly opened and closed.\n  void SetNameSpace(const Namespace* ns) {\n    if (cur_name_space_ == ns) {\n      return;\n    }\n\n    // Compute the size of the longest common namespace prefix.\n    // If cur_name_space is A::B::C::D and ns is A::B::E::F::G,\n    // the common prefix is A::B:: and we have old_size = 4, new_size = 5\n    // and common_prefix_size = 2\n    size_t old_size = cur_name_space_ ? cur_name_space_->components.size() : 0;\n    size_t new_size = ns ? ns->components.size() : 0;\n\n    size_t common_prefix_size = 0;\n    while (common_prefix_size < old_size && common_prefix_size < new_size &&\n           ns->components[common_prefix_size] ==\n               cur_name_space_->components[common_prefix_size]) {\n      common_prefix_size++;\n    }\n\n    // Close cur_name_space in reverse order to reach the common prefix.\n    // In the previous example, D then C are closed.\n    for (size_t j = old_size; j > common_prefix_size; --j) {\n      code_ += \"}  // namespace \" + cur_name_space_->components[j - 1];\n    }\n    if (old_size != common_prefix_size) {\n      code_ += \"\";\n    }\n\n    // open namespace parts to reach the ns namespace\n    // in the previous example, E, then F, then G are opened\n    for (auto j = common_prefix_size; j != new_size; ++j) {\n      code_ += \"namespace \" + ns->components[j] + \" {\";\n    }\n    if (new_size != common_prefix_size) {\n      code_ += \"\";\n    }\n\n    cur_name_space_ = ns;\n  }\n};\n\n}  // namespace cpp\n\nstatic bool GenerateCPP(const Parser& parser, const std::string& path,\n                        const std::string& file_name) {\n  cpp::IDLOptionsCpp opts(parser.opts);\n  // The '--cpp_std' argument could be extended (like ASAN):\n  // Example: \"flatc --cpp_std c++17:option1:option2\".\n  std::string cpp_std = !opts.cpp_std.empty() ? opts.cpp_std : \"C++11\";\n  std::transform(cpp_std.begin(), cpp_std.end(), cpp_std.begin(), CharToUpper);\n  if (cpp_std == \"C++0X\") {\n    opts.g_cpp_std = cpp::CPP_STD_X0;\n    opts.g_only_fixed_enums = false;\n  } else if (cpp_std == \"C++11\") {\n    // Use the standard C++11 code generator.\n    opts.g_cpp_std = cpp::CPP_STD_11;\n    opts.g_only_fixed_enums = true;\n  } else if (cpp_std == \"C++17\") {\n    opts.g_cpp_std = cpp::CPP_STD_17;\n    // With c++17 generate strong enums only.\n    opts.scoped_enums = true;\n    // By default, prefixed_enums==true, reset it.\n    opts.prefixed_enums = false;\n  } else {\n    LogCompilerError(\"Unknown value of the '--cpp-std' switch: \" +\n                     opts.cpp_std);\n    return false;\n  }\n  // The opts.scoped_enums has priority.\n  opts.g_only_fixed_enums |= opts.scoped_enums;\n\n  if (opts.cpp_static_reflection && opts.g_cpp_std < cpp::CPP_STD_17) {\n    LogCompilerError(\n        \"--cpp-static-reflection requires using --cpp-std at \\\"C++17\\\" or \"\n        \"higher.\");\n    return false;\n  }\n\n  cpp::CppGenerator generator(parser, path, file_name, opts);\n  return generator.generate();\n}\n\nstatic std::string CPPMakeRule(const Parser& parser, const std::string& path,\n                               const std::string& file_name) {\n  const auto filebase = StripPath(StripExtension(file_name));\n  cpp::CppGenerator geneartor(parser, path, file_name, parser.opts);\n  const auto included_files = parser.GetIncludedFilesRecursive(file_name);\n  std::string make_rule =\n      geneartor.GeneratedFileName(path, filebase, parser.opts) + \": \";\n  for (const std::string& included_file : included_files) {\n    make_rule += \" \" + included_file;\n  }\n  return make_rule;\n}\n\nnamespace {\n\nclass CppCodeGenerator : public CodeGenerator {\n public:\n  Status GenerateCode(const Parser& parser, const std::string& path,\n                      const std::string& filename) override {\n    if (!GenerateCPP(parser, path, filename)) {\n      return Status::ERROR;\n    }\n    return Status::OK;\n  }\n\n  // Generate code from the provided `buffer` of given `length`. The buffer is a\n  // serialized reflection.fbs.\n  Status GenerateCode(const uint8_t*, int64_t, const CodeGenOptions&) override {\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateMakeRule(const Parser& parser, const std::string& path,\n                          const std::string& filename,\n                          std::string& output) override {\n    output = CPPMakeRule(parser, path, filename);\n    return Status::OK;\n  }\n\n  Status GenerateGrpcCode(const Parser& parser, const std::string& path,\n                          const std::string& filename) override {\n    if (!GenerateCppGRPC(parser, path, filename)) {\n      return Status::ERROR;\n    }\n    return Status::OK;\n  }\n\n  Status GenerateRootFile(const Parser& parser,\n                          const std::string& path) override {\n    (void)parser;\n    (void)path;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  bool IsSchemaOnly() const override { return true; }\n\n  bool SupportsBfbsGeneration() const override { return false; }\n\n  bool SupportsRootFileGeneration() const override { return false; }\n\n  IDLOptions::Language Language() const override { return IDLOptions::kCpp; }\n\n  std::string LanguageName() const override { return \"C++\"; }\n};\n\n}  // namespace\n\nstd::unique_ptr<CodeGenerator> NewCppCodeGenerator() {\n  return std::unique_ptr<CppCodeGenerator>(new CppCodeGenerator());\n}\n\n}  // namespace flatbuffers\n"
  },
  {
    "path": "src/idl_gen_cpp.h",
    "content": "/*\n * Copyright 2023 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_IDL_GEN_CPP_H_\n#define FLATBUFFERS_IDL_GEN_CPP_H_\n\n#include \"flatbuffers/code_generator.h\"\n\nnamespace flatbuffers {\n\n// Constructs a new Cpp code generator.\nstd::unique_ptr<CodeGenerator> NewCppCodeGenerator();\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_IDL_GEN_CPP_H_\n"
  },
  {
    "path": "src/idl_gen_csharp.cpp",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// independent from idl_parser, since this code is not needed for most clients\n\n#include \"idl_gen_csharp.h\"\n\n#include <unordered_set>\n\n#include \"flatbuffers/code_generators.h\"\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/idl.h\"\n#include \"flatbuffers/util.h\"\n\nnamespace flatbuffers {\n\nstatic TypedFloatConstantGenerator CSharpFloatGen(\"Double.\", \"Single.\", \"NaN\",\n                                                  \"PositiveInfinity\",\n                                                  \"NegativeInfinity\");\nstatic CommentConfig comment_config = {\n    nullptr,\n    \"///\",\n    nullptr,\n};\n\nnamespace csharp {\nclass CSharpGenerator : public BaseGenerator {\n  struct FieldArrayLength {\n    std::string name;\n    int length;\n  };\n\n public:\n  CSharpGenerator(const Parser& parser, const std::string& path,\n                  const std::string& file_name)\n      : BaseGenerator(parser, path, file_name,\n                      parser.opts.cs_global_alias ? \"global::\" : \"\", \".\", \"cs\"),\n        cur_name_space_(nullptr) {\n    // clang-format off\n\n    // List of keywords retrieved from here:\n    // https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/\n\n    // One per line to ease comparisons to that list are easier\n\n    static const char *const keywords[] = {\n      \"abstract\",\n      \"as\",\n      \"base\",\n      \"bool\",\n      \"break\",\n      \"byte\",\n      \"case\",\n      \"catch\",\n      \"char\",\n      \"checked\",\n      \"class\",\n      \"const\",\n      \"continue\",\n      \"decimal\",\n      \"default\",\n      \"delegate\",\n      \"do\",\n      \"double\",\n      \"else\",\n      \"enum\",\n      \"event\",\n      \"explicit\",\n      \"extern\",\n      \"false\",\n      \"finally\",\n      \"fixed\",\n      \"float\",\n      \"for\",\n      \"foreach\",\n      \"goto\",\n      \"if\",\n      \"implicit\",\n      \"in\",\n      \"int\",\n      \"interface\",\n      \"internal\",\n      \"is\",\n      \"lock\",\n      \"long\",\n      \"namespace\",\n      \"new\",\n      \"null\",\n      \"object\",\n      \"operator\",\n      \"out\",\n      \"override\",\n      \"params\",\n      \"private\",\n      \"protected\",\n      \"public\",\n      \"readonly\",\n      \"ref\",\n      \"return\",\n      \"sbyte\",\n      \"sealed\",\n      \"short\",\n      \"sizeof\",\n      \"stackalloc\",\n      \"static\",\n      \"string\",\n      \"struct\",\n      \"switch\",\n      \"this\",\n      \"throw\",\n      \"true\",\n      \"try\",\n      \"typeof\",\n      \"uint\",\n      \"ulong\",\n      \"unchecked\",\n      \"unsafe\",\n      \"ushort\",\n      \"using\",\n      \"virtual\",\n      \"void\",\n      \"volatile\",\n      \"while\",\n      nullptr,\n        // clang-format on\n    };\n\n    for (auto kw = keywords; *kw; kw++) keywords_.insert(*kw);\n  }\n\n  CSharpGenerator& operator=(const CSharpGenerator&);\n\n  bool generate() {\n    std::string one_file_code;\n    cur_name_space_ = parser_.current_namespace_;\n\n    for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end();\n         ++it) {\n      std::string enumcode;\n      auto& enum_def = **it;\n      if (!parser_.opts.one_file) cur_name_space_ = enum_def.defined_namespace;\n      GenEnum(enum_def, &enumcode, parser_.opts);\n      if (parser_.opts.one_file) {\n        one_file_code += enumcode;\n      } else {\n        if (!SaveType(enum_def.name, *enum_def.defined_namespace, enumcode,\n                      false, parser_.opts))\n          return false;\n      }\n    }\n\n    for (auto it = parser_.structs_.vec.begin();\n         it != parser_.structs_.vec.end(); ++it) {\n      std::string declcode;\n      auto& struct_def = **it;\n      if (!parser_.opts.one_file)\n        cur_name_space_ = struct_def.defined_namespace;\n      GenStruct(struct_def, &declcode, parser_.opts);\n      GenStructVerifier(struct_def, &declcode);\n      if (parser_.opts.one_file) {\n        one_file_code += declcode;\n      } else {\n        if (!SaveType(struct_def.name, *struct_def.defined_namespace, declcode,\n                      true, parser_.opts))\n          return false;\n      }\n    }\n\n    if (parser_.opts.one_file) {\n      return SaveType(file_name_, *parser_.current_namespace_, one_file_code,\n                      true, parser_.opts);\n    }\n    return true;\n  }\n\n private:\n  std::unordered_set<std::string> keywords_;\n\n  std::string EscapeKeyword(const std::string& name) const {\n    return keywords_.find(name) == keywords_.end() ? name : \"@\" + name;\n  }\n\n  std::string Name(const FieldDef& field) const {\n    std::string name = ConvertCase(field.name, Case::kUpperCamel);\n    return EscapeKeyword(name);\n  }\n\n  std::string Name(const Definition& def) const {\n    return EscapeKeyword(def.name);\n  }\n\n  std::string NamespacedName(const Definition& def) const {\n    return WrapInNameSpace(def.defined_namespace, Name(def));\n  }\n\n  std::string Name(const EnumVal& ev) const { return EscapeKeyword(ev.name); }\n\n  // Save out the generated code for a single class while adding\n  // declaration boilerplate.\n  bool SaveType(const std::string& defname, const Namespace& ns,\n                const std::string& classcode, bool needs_includes,\n                const IDLOptions& options) const {\n    if (!classcode.length()) return true;\n\n    std::string code =\n        \"// <auto-generated>\\n\"\n        \"//  \" +\n        std::string(FlatBuffersGeneratedWarning()) +\n        \"\\n\"\n        \"// </auto-generated>\\n\\n\";\n\n    std::string namespace_name = FullNamespace(\".\", ns);\n    if (!namespace_name.empty()) {\n      code += \"namespace \" + namespace_name + \"\\n{\\n\\n\";\n    }\n    if (needs_includes) {\n      code += \"using global::System;\\n\";\n      code += \"using global::System.Collections.Generic;\\n\";\n      code += \"using global::Google.FlatBuffers;\\n\\n\";\n    }\n    code += classcode;\n    if (!namespace_name.empty()) {\n      code += \"\\n}\\n\";\n    }\n    auto filename = NamespaceDir(ns) + defname;\n    if (options.one_file) {\n      filename += options.filename_suffix;\n    }\n    filename +=\n        options.filename_extension.empty() ? \".cs\" : options.filename_extension;\n    return options.file_saver->SaveFile(filename.c_str(), code, false);\n  }\n\n  const Namespace* CurrentNameSpace() const { return cur_name_space_; }\n\n  std::string GenTypeBasic(const Type& type, bool enableLangOverrides) const {\n    // clang-format off\n    static const char * const csharp_typename[] = {\n      #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, JTYPE, GTYPE, NTYPE, ...) \\\n        #NTYPE,\n        FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)\n      #undef FLATBUFFERS_TD\n    };\n    // clang-format on\n\n    if (enableLangOverrides) {\n      if (IsEnum(type)) return NamespacedName(*type.enum_def);\n      if (type.base_type == BASE_TYPE_STRUCT) {\n        return \"Offset<\" + NamespacedName(*type.struct_def) + \">\";\n      }\n    }\n\n    return csharp_typename[type.base_type];\n  }\n\n  inline std::string GenTypeBasic(const Type& type) const {\n    return GenTypeBasic(type, true);\n  }\n\n  std::string GenTypePointer(const Type& type) const {\n    switch (type.base_type) {\n      case BASE_TYPE_STRING:\n        return \"string\";\n      case BASE_TYPE_VECTOR:\n        return GenTypeGet(type.VectorType());\n      case BASE_TYPE_STRUCT:\n        return NamespacedName(*type.struct_def);\n      case BASE_TYPE_UNION:\n        return \"TTable\";\n      default:\n        return \"Table\";\n    }\n  }\n\n  std::string GenTypeGet(const Type& type) const {\n    return IsScalar(type.base_type)\n               ? GenTypeBasic(type)\n               : (IsArray(type) ? GenTypeGet(type.VectorType())\n                                : GenTypePointer(type));\n  }\n\n  std::string GenOffsetType(const StructDef& struct_def) const {\n    return \"Offset<\" + NamespacedName(struct_def) + \">\";\n  }\n\n  std::string GenOffsetConstruct(const StructDef& struct_def,\n                                 const std::string& variable_name) const {\n    return \"new Offset<\" + NamespacedName(struct_def) + \">(\" + variable_name +\n           \")\";\n  }\n\n  // Casts necessary to correctly read serialized data\n  std::string DestinationCast(const Type& type) const {\n    if (IsSeries(type)) {\n      return DestinationCast(type.VectorType());\n    } else {\n      if (IsEnum(type)) return \"(\" + NamespacedName(*type.enum_def) + \")\";\n    }\n    return \"\";\n  }\n\n  // Cast statements for mutator method parameters.\n  // In Java, parameters representing unsigned numbers need to be cast down to\n  // their respective type. For example, a long holding an unsigned int value\n  // would be cast down to int before being put onto the buffer. In C#, one cast\n  // directly cast an Enum to its underlying type, which is essential before\n  // putting it onto the buffer.\n  std::string SourceCast(const Type& type,\n                         const bool isOptional = false) const {\n    if (IsSeries(type)) {\n      return SourceCast(type.VectorType());\n    } else {\n      if (IsEnum(type))\n        return \"(\" + GenTypeBasic(type, false) + (isOptional ? \"?\" : \"\") + \")\";\n    }\n    return \"\";\n  }\n\n  std::string SourceCastBasic(const Type& type, const bool isOptional) const {\n    return IsScalar(type.base_type) ? SourceCast(type, isOptional) : \"\";\n  }\n\n  std::string GenEnumDefaultValue(const FieldDef& field) const {\n    auto& value = field.value;\n    FLATBUFFERS_ASSERT(value.type.enum_def);\n    auto& enum_def = *value.type.enum_def;\n    auto enum_val = enum_def.FindByValue(value.constant);\n    return enum_val ? (NamespacedName(enum_def) + \".\" + Name(*enum_val))\n                    : value.constant;\n  }\n\n  std::string GenDefaultValue(const FieldDef& field,\n                              bool enableLangOverrides) const {\n    // If it is an optional scalar field, the default is null\n    if (field.IsScalarOptional()) {\n      return \"null\";\n    }\n\n    auto& value = field.value;\n    if (enableLangOverrides) {\n      // handles both enum case and vector of enum case\n      if (value.type.enum_def != nullptr &&\n          value.type.base_type != BASE_TYPE_UNION) {\n        return GenEnumDefaultValue(field);\n      }\n    }\n\n    auto longSuffix = \"\";\n    switch (value.type.base_type) {\n      case BASE_TYPE_BOOL:\n        return value.constant == \"0\" ? \"false\" : \"true\";\n      case BASE_TYPE_ULONG:\n        return value.constant;\n      case BASE_TYPE_UINT:\n      case BASE_TYPE_LONG:\n        return value.constant + longSuffix;\n      default:\n        if (IsFloat(value.type.base_type))\n          return CSharpFloatGen.GenFloatConstant(field);\n        else\n          return value.constant;\n    }\n  }\n\n  std::string GenDefaultValue(const FieldDef& field) const {\n    return GenDefaultValue(field, true);\n  }\n\n  std::string GenDefaultValueBasic(const FieldDef& field,\n                                   bool enableLangOverrides) const {\n    auto& value = field.value;\n    if (!IsScalar(value.type.base_type)) {\n      if (enableLangOverrides) {\n        switch (value.type.base_type) {\n          case BASE_TYPE_STRING:\n            return \"default(StringOffset)\";\n          case BASE_TYPE_STRUCT:\n            return \"default(Offset<\" + NamespacedName(*value.type.struct_def) +\n                   \">)\";\n          case BASE_TYPE_VECTOR:\n            return \"default(VectorOffset)\";\n          default:\n            break;\n        }\n      }\n      return \"0\";\n    }\n    return GenDefaultValue(field, enableLangOverrides);\n  }\n\n  std::string GenDefaultValueBasic(const FieldDef& field) const {\n    return GenDefaultValueBasic(field, true);\n  }\n\n  void GenEnum(EnumDef& enum_def, std::string* code_ptr,\n               const IDLOptions& opts) const {\n    std::string& code = *code_ptr;\n    if (enum_def.generated) return;\n\n    // Generate enum definitions of the form:\n    // public static (final) int name = value;\n    // In Java, we use ints rather than the Enum feature, because we want them\n    // to map directly to how they're used in C/C++ and file formats.\n    // That, and Java Enums are expensive, and not universally liked.\n    GenComment(enum_def.doc_comment, code_ptr, &comment_config);\n\n    if (opts.cs_gen_json_serializer && opts.generate_object_based_api) {\n      code +=\n          \"[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.\"\n          \"StringEnumConverter))]\\n\";\n    }\n    // In C# this indicates enumeration values can be treated as bit flags.\n    if (enum_def.attributes.Lookup(\"bit_flags\")) {\n      code += \"[System.FlagsAttribute]\\n\";\n    }\n    if (enum_def.attributes.Lookup(\"private\")) {\n      code += \"internal \";\n    } else {\n      code += \"public \";\n    }\n    code += \"enum \" + Name(enum_def);\n    code += \" : \" + GenTypeBasic(enum_def.underlying_type, false);\n    code += \"\\n{\\n\";\n    for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {\n      auto& ev = **it;\n      GenComment(ev.doc_comment, code_ptr, &comment_config, \"  \");\n      code += \"  \";\n      code += Name(ev) + \" = \";\n      code += enum_def.ToString(ev);\n      code += \",\\n\";\n    }\n    // Close the class\n    code += \"};\\n\\n\";\n\n    if (opts.generate_object_based_api) {\n      GenEnum_ObjectAPI(enum_def, code_ptr, opts);\n    }\n\n    if (enum_def.is_union) {\n      code += GenUnionVerify(enum_def.underlying_type);\n    }\n  }\n\n  bool HasUnionStringValue(const EnumDef& enum_def) const {\n    if (!enum_def.is_union) return false;\n    for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {\n      auto& val = **it;\n      if (IsString(val.union_type)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  // Returns the function name that is able to read a value of the given type.\n  std::string GenGetter(const Type& type) const {\n    switch (type.base_type) {\n      case BASE_TYPE_STRING:\n        return \"__p.__string\";\n      case BASE_TYPE_STRUCT:\n        return \"__p.__struct\";\n      case BASE_TYPE_UNION:\n        return \"__p.__union\";\n      case BASE_TYPE_VECTOR:\n        return GenGetter(type.VectorType());\n      case BASE_TYPE_ARRAY:\n        return GenGetter(type.VectorType());\n      default: {\n        std::string getter = \"__p.bb.Get\";\n        if (type.base_type == BASE_TYPE_BOOL) {\n          getter = \"0!=\" + getter;\n        } else if (GenTypeBasic(type, false) != \"byte\") {\n          getter += ConvertCase(GenTypeBasic(type, false), Case::kUpperCamel);\n        }\n        return getter;\n      }\n    }\n  }\n\n  std::string GetObjectConstructor(flatbuffers::StructDef& struct_def,\n                                   const std::string& data_buffer,\n                                   const std::string& offset) const {\n    // Use the generated type directly, to properly handle default values that\n    // might not be written to the buffer.\n    return \"new \" + Name(struct_def) + \"().__assign(\" + offset + \", \" +\n           data_buffer + \")\";\n  }\n\n  // Returns the function name that is able to read a value of the given type.\n  std::string GenGetterForLookupByKey(flatbuffers::StructDef& struct_def,\n                                      flatbuffers::FieldDef* key_field,\n                                      const std::string& data_buffer,\n                                      const std::string& offset) const {\n    // Use the generated type directly, to properly handle default values that\n    // might not be written to the buffer.\n    auto name = Name(*key_field);\n    if (name == struct_def.name) {\n      name += \"_\";\n    }\n    return GetObjectConstructor(struct_def, data_buffer, offset) + \".\" + name;\n  }\n\n  // Direct mutation is only allowed for scalar fields.\n  // Hence a setter method will only be generated for such fields.\n  std::string GenSetter(const Type& type) const {\n    if (IsScalar(type.base_type)) {\n      std::string setter = \"__p.bb.Put\";\n      if (GenTypeBasic(type, false) != \"byte\" &&\n          type.base_type != BASE_TYPE_BOOL) {\n        setter += ConvertCase(GenTypeBasic(type, false), Case::kUpperCamel);\n      }\n      return setter;\n    } else {\n      return \"\";\n    }\n  }\n\n  // Returns the method name for use with add/put calls.\n  std::string GenMethod(const Type& type) const {\n    return IsScalar(type.base_type)\n               ? ConvertCase(GenTypeBasic(type, false), Case::kUpperCamel)\n               : (IsStruct(type) ? \"Struct\" : \"Offset\");\n  }\n\n  // Recursively generate arguments for a constructor, to deal with nested\n  // structs.\n  void GenStructArgs(const StructDef& struct_def, std::string* code_ptr,\n                     const char* nameprefix, size_t array_count = 0) const {\n    std::string& code = *code_ptr;\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      const auto& field_type = field.value.type;\n      const auto array_field = IsArray(field_type);\n      const auto& type = array_field ? field_type.VectorType() : field_type;\n      const auto array_cnt = array_field ? (array_count + 1) : array_count;\n      if (IsStruct(type)) {\n        // Generate arguments for a struct inside a struct. To ensure names\n        // don't clash, and to make it obvious these arguments are constructing\n        // a nested struct, prefix the name with the field name.\n        GenStructArgs(*field_type.struct_def, code_ptr,\n                      (nameprefix + (EscapeKeyword(field.name) + \"_\")).c_str(),\n                      array_cnt);\n      } else {\n        code += \", \";\n        code += GenTypeBasic(type);\n        if (field.IsScalarOptional()) {\n          code += \"?\";\n        }\n        if (array_cnt > 0) {\n          code += \"[\";\n          for (size_t i = 1; i < array_cnt; i++) code += \",\";\n          code += \"]\";\n        }\n        code += \" \";\n        code += nameprefix;\n        code += Name(field);\n      }\n    }\n  }\n\n  // Recusively generate struct construction statements of the form:\n  // builder.putType(name);\n  // and insert manual padding.\n  void GenStructBody(const StructDef& struct_def, std::string* code_ptr,\n                     const char* nameprefix, size_t index = 0,\n                     bool in_array = false) const {\n    std::string& code = *code_ptr;\n    std::string indent((index + 1) * 2, ' ');\n    code += indent + \"  builder.Prep(\";\n    code += NumToString(struct_def.minalign) + \", \";\n    code += NumToString(struct_def.bytesize) + \");\\n\";\n    for (auto it = struct_def.fields.vec.rbegin();\n         it != struct_def.fields.vec.rend(); ++it) {\n      auto& field = **it;\n      const auto& field_type = field.value.type;\n      if (field.padding) {\n        code += indent + \"  builder.Pad(\";\n        code += NumToString(field.padding) + \");\\n\";\n      }\n      if (IsStruct(field_type)) {\n        GenStructBody(*field_type.struct_def, code_ptr,\n                      (nameprefix + (field.name + \"_\")).c_str(), index,\n                      in_array);\n      } else {\n        const auto& type =\n            IsArray(field_type) ? field_type.VectorType() : field_type;\n        const auto index_var = \"_idx\" + NumToString(index);\n        if (IsArray(field_type)) {\n          code += indent + \"  for (int \" + index_var + \" = \";\n          code += NumToString(field_type.fixed_length);\n          code += \"; \" + index_var + \" > 0; \" + index_var + \"--) {\\n\";\n          in_array = true;\n        }\n        if (IsStruct(type)) {\n          GenStructBody(*field_type.struct_def, code_ptr,\n                        (nameprefix + (field.name + \"_\")).c_str(), index + 1,\n                        in_array);\n        } else {\n          code += IsArray(field_type) ? \"  \" : \"\";\n          code += indent + \"  builder.Put\";\n          code += GenMethod(type) + \"(\";\n          code += SourceCast(type);\n          auto argname = nameprefix + Name(field);\n          code += argname;\n          size_t array_cnt = index + (IsArray(field_type) ? 1 : 0);\n          if (array_cnt > 0) {\n            code += \"[\";\n            for (size_t i = 0; in_array && i < array_cnt; i++) {\n              code += \"_idx\" + NumToString(i) + \"-1\";\n              if (i != (array_cnt - 1)) code += \",\";\n            }\n            code += \"]\";\n          }\n          code += \");\\n\";\n        }\n        if (IsArray(field_type)) {\n          code += indent + \"  }\\n\";\n        }\n      }\n    }\n  }\n  std::string GenOffsetGetter(flatbuffers::FieldDef* key_field,\n                              const char* num = nullptr) const {\n    std::string key_offset =\n        \"Table.__offset(\" + NumToString(key_field->value.offset) + \", \";\n    if (num) {\n      key_offset += num;\n      key_offset += \".Value, builder.DataBuffer)\";\n    } else {\n      key_offset += \"bb.Length\";\n      key_offset += \" - tableOffset, bb)\";\n    }\n    return key_offset;\n  }\n\n  std::string GenKeyGetter(flatbuffers::StructDef& struct_def,\n                           flatbuffers::FieldDef* key_field) const {\n    // Get the getter for the key of the struct.\n    if (IsString(key_field->value.type)) {\n      return \"string.CompareOrdinal(\" +\n             GenGetterForLookupByKey(struct_def, key_field,\n                                     \"builder.DataBuffer\",\n                                     \"builder.DataBuffer.Length - o1.Value\") +\n             \", \" +\n             GenGetterForLookupByKey(struct_def, key_field,\n                                     \"builder.DataBuffer\",\n                                     \"builder.DataBuffer.Length - o2.Value\") +\n             \")\";\n    } else {\n      return GenGetterForLookupByKey(struct_def, key_field,\n                                     \"builder.DataBuffer\",\n                                     \"builder.DataBuffer.Length - o1.Value\") +\n             \".CompareTo(\" +\n             GenGetterForLookupByKey(struct_def, key_field,\n                                     \"builder.DataBuffer\",\n                                     \"builder.DataBuffer.Length - o2.Value\") +\n             \")\";\n    }\n  }\n\n  // Get the value of a table verification function start\n  void GetStartOfTableVerifier(const StructDef& struct_def,\n                               std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code += \"\\n\";\n    code += \"static public class \" + struct_def.name + \"Verify\\n\";\n    code += \"{\\n\";\n    code += \"  static public bool Verify\";\n    code += \"(Google.FlatBuffers.Verifier verifier, uint tablePos)\\n\";\n    code += \"  {\\n\";\n    code += \"    return verifier.VerifyTableStart(tablePos)\\n\";\n  }\n\n  // Get the value of a table verification function end\n  void GetEndOfTableVerifier(std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code += \"      && verifier.VerifyTableEnd(tablePos);\\n\";\n    code += \"  }\\n\";\n    code += \"}\\n\";\n  }\n\n  std::string GetNestedFlatBufferName(const FieldDef& field) {\n    std::string name;\n    if (field.nested_flatbuffer) {\n      name = NamespacedName(*field.nested_flatbuffer);\n    } else {\n      name = \"\";\n    }\n    return name;\n  }\n\n  // Generate the code to call the appropriate Verify function(s) for a field.\n  void GenVerifyCall(CodeWriter& code_, const FieldDef& field,\n                     const char* prefix) {\n    code_.SetValue(\"PRE\", prefix);\n    code_.SetValue(\"NAME\", ConvertCase(field.name, Case::kUpperCamel));\n    code_.SetValue(\"REQUIRED\", field.IsRequired() ? \"Required\" : \"\");\n    code_.SetValue(\"REQUIRED_FLAG\", field.IsRequired() ? \"true\" : \"false\");\n    code_.SetValue(\"TYPE\", GenTypeGet(field.value.type));\n    code_.SetValue(\"INLINESIZE\", NumToString(InlineSize(field.value.type)));\n    code_.SetValue(\"OFFSET\", NumToString(field.value.offset));\n\n    if (IsScalar(field.value.type.base_type) || IsStruct(field.value.type)) {\n      code_.SetValue(\"ALIGN\", NumToString(InlineAlignment(field.value.type)));\n      code_ +=\n          \"{{PRE}}      && verifier.VerifyField(tablePos, \"\n          \"{{OFFSET}} /*{{NAME}}*/, {{INLINESIZE}} /*{{TYPE}}*/, {{ALIGN}}, \"\n          \"{{REQUIRED_FLAG}})\";\n    } else {\n      // TODO - probably code below should go to this 'else' - code_ +=\n      // \"{{PRE}}VerifyOffset{{REQUIRED}}(verifier, {{OFFSET}})\\\\\";\n    }\n\n    switch (field.value.type.base_type) {\n      case BASE_TYPE_UNION: {\n        auto union_name = NamespacedName(*field.value.type.enum_def);\n        code_.SetValue(\"ENUM_NAME1\", field.value.type.enum_def->name);\n        code_.SetValue(\"ENUM_NAME\", union_name);\n        code_.SetValue(\"SUFFIX\", UnionTypeFieldSuffix());\n        // Caution: This construction assumes, that UNION type id element has\n        // been created just before union data and its offset precedes union.\n        // Such assumption is common in flatbuffer implementation\n        code_.SetValue(\"TYPE_ID_OFFSET\",\n                       NumToString(field.value.offset - sizeof(voffset_t)));\n        code_ +=\n            \"{{PRE}}      && verifier.VerifyUnion(tablePos, \"\n            \"{{TYPE_ID_OFFSET}}, \"\n            \"{{OFFSET}} /*{{NAME}}*/, {{ENUM_NAME}}Verify.Verify, \"\n            \"{{REQUIRED_FLAG}})\";\n        break;\n      }\n      case BASE_TYPE_STRUCT: {\n        if (!field.value.type.struct_def->fixed) {\n          code_ +=\n              \"{{PRE}}      && verifier.VerifyTable(tablePos, \"\n              \"{{OFFSET}} /*{{NAME}}*/, {{TYPE}}Verify.Verify, \"\n              \"{{REQUIRED_FLAG}})\";\n        }\n        break;\n      }\n      case BASE_TYPE_STRING: {\n        code_ +=\n            \"{{PRE}}      && verifier.VerifyString(tablePos, \"\n            \"{{OFFSET}} /*{{NAME}}*/, {{REQUIRED_FLAG}})\";\n        break;\n      }\n      case BASE_TYPE_VECTOR: {\n        switch (field.value.type.element) {\n          case BASE_TYPE_STRING: {\n            code_ +=\n                \"{{PRE}}      && verifier.VerifyVectorOfStrings(tablePos, \"\n                \"{{OFFSET}} /*{{NAME}}*/, {{REQUIRED_FLAG}})\";\n            break;\n          }\n          case BASE_TYPE_STRUCT: {\n            if (!field.value.type.struct_def->fixed) {\n              code_ +=\n                  \"{{PRE}}      && verifier.VerifyVectorOfTables(tablePos, \"\n                  \"{{OFFSET}} /*{{NAME}}*/, {{TYPE}}Verify.Verify, \"\n                  \"{{REQUIRED_FLAG}})\";\n            } else {\n              code_.SetValue(\n                  \"VECTOR_ELEM_INLINESIZE\",\n                  NumToString(InlineSize(field.value.type.VectorType())));\n              code_ +=\n                  \"{{PRE}}      && \"\n                  \"verifier.VerifyVectorOfData(tablePos, \"\n                  \"{{OFFSET}} /*{{NAME}}*/, {{VECTOR_ELEM_INLINESIZE}} \"\n                  \"/*{{TYPE}}*/, {{REQUIRED_FLAG}})\";\n            }\n            break;\n          }\n          case BASE_TYPE_UNION: {\n            // Vectors of unions are not yet supported for go\n            break;\n          }\n          default:\n            // Generate verifier for vector of data.\n            // It may be either nested flatbuffer of just vector of bytes\n            auto nfn = GetNestedFlatBufferName(field);\n            if (!nfn.empty()) {\n              code_.SetValue(\"CPP_NAME\", nfn);\n              // FIXME: file_identifier.\n              code_ +=\n                  \"{{PRE}}      && verifier.VerifyNestedBuffer(tablePos, \"\n                  \"{{OFFSET}} /*{{NAME}}*/, {{CPP_NAME}}Verify.Verify, \"\n                  \"{{REQUIRED_FLAG}})\";\n            } else if (field.flexbuffer) {\n              code_ +=\n                  \"{{PRE}}      && verifier.VerifyNestedBuffer(tablePos, \"\n                  \"{{OFFSET}} /*{{NAME}}*/, null, {{REQUIRED_FLAG}})\";\n            } else {\n              code_.SetValue(\n                  \"VECTOR_ELEM_INLINESIZE\",\n                  NumToString(InlineSize(field.value.type.VectorType())));\n              code_ +=\n                  \"{{PRE}}      && verifier.VerifyVectorOfData(tablePos, \"\n                  \"{{OFFSET}} /*{{NAME}}*/, {{VECTOR_ELEM_INLINESIZE}} \"\n                  \"/*{{TYPE}}*/, {{REQUIRED_FLAG}})\";\n            }\n            break;\n        }\n\n        break;\n      }\n      default: {\n        break;\n      }\n    }\n  }\n\n  // Generate table constructors, conditioned on its members' types.\n  void GenTableVerifier(const StructDef& struct_def, std::string* code_ptr) {\n    CodeWriter code_;\n\n    GetStartOfTableVerifier(struct_def, code_ptr);\n\n    // Generate struct fields accessors\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (field.deprecated) continue;\n\n      GenVerifyCall(code_, field, \"\");\n    }\n\n    *code_ptr += code_.ToString();\n\n    GetEndOfTableVerifier(code_ptr);\n  }\n\n  // Generate struct or table methods.\n  void GenStructVerifier(const StructDef& struct_def, std::string* code_ptr) {\n    if (struct_def.generated) return;\n\n    // cur_name_space_ = struct_def.defined_namespace;\n\n    // Generate verifiers\n    if (struct_def.fixed) {\n      // Fixed size structures do not require table members\n      // verification - instead structure size is verified using VerifyField\n    } else {\n      // Create table verification function\n      GenTableVerifier(struct_def, code_ptr);\n    }\n  }\n\n  void GenStruct(StructDef& struct_def, std::string* code_ptr,\n                 const IDLOptions& opts) const {\n    if (struct_def.generated) return;\n    std::string& code = *code_ptr;\n\n    // Generate a struct accessor class, with methods of the form:\n    // public type name() { return bb.getType(i + offset); }\n    // or for tables of the form:\n    // public type name() {\n    //   int o = __offset(offset); return o != 0 ? bb.getType(o + i) : default;\n    // }\n    GenComment(struct_def.doc_comment, code_ptr, &comment_config);\n    if (struct_def.attributes.Lookup(\"private\")) {\n      code += \"internal \";\n    } else {\n      code += \"public \";\n    }\n    if (struct_def.attributes.Lookup(\"csharp_partial\")) {\n      // generate a partial class for this C# struct/table\n      code += \"partial \";\n    }\n    code += \"struct \" + struct_def.name;\n    code += \" : IFlatbufferObject\";\n    code += \"\\n{\\n\";\n    code += \"  private \";\n    code += struct_def.fixed ? \"Struct\" : \"Table\";\n    code += \" __p;\\n\";\n\n    code += \"  public ByteBuffer ByteBuffer { get { return __p.bb; } }\\n\";\n\n    if (!struct_def.fixed) {\n      // Generate version check method.\n      // Force compile time error if not using the same version runtime.\n      code += \"  public static void ValidateVersion() {\";\n      code += \" FlatBufferConstants.\";\n      code += \"FLATBUFFERS_25_12_19(); \";\n      code += \"}\\n\";\n\n      // Generate a special accessor for the table that when used as the root\n      // of a FlatBuffer\n      std::string method_name = \"GetRootAs\" + struct_def.name;\n      std::string method_signature =\n          \"  public static \" + struct_def.name + \" \" + method_name;\n\n      // create convenience method that doesn't require an existing object\n      code += method_signature + \"(ByteBuffer _bb) \";\n      code += \"{ return \" + method_name + \"(_bb, new \" + struct_def.name +\n              \"()); }\\n\";\n\n      // create method that allows object reuse\n      code +=\n          method_signature + \"(ByteBuffer _bb, \" + struct_def.name + \" obj) { \";\n      code += \"return (obj.__assign(_bb.GetInt(_bb.Position\";\n      code += \") + _bb.Position\";\n      code += \", _bb)); }\\n\";\n      if (parser_.root_struct_def_ == &struct_def) {\n        if (parser_.file_identifier_.length()) {\n          // Check if a buffer has the identifier.\n          code += \"  public static \";\n          code += \"bool \" + struct_def.name;\n          code += \"BufferHasIdentifier(ByteBuffer _bb) { return \";\n          code += \"Table.__has_identifier(_bb, \\\"\";\n          code += parser_.file_identifier_;\n          code += \"\\\"); }\\n\";\n        }\n\n        // Generate the Verify method that checks if a ByteBuffer is save to\n        // access\n        code += \"  public static \";\n        code += \"bool Verify\" + struct_def.name + \"(ByteBuffer _bb) {\";\n        code += \"Google.FlatBuffers.Verifier verifier = new \";\n        code += \"Google.FlatBuffers.Verifier(_bb); \";\n        code += \"return verifier.VerifyBuffer(\\\"\";\n        code += parser_.file_identifier_;\n        code += \"\\\", false, \" + struct_def.name + \"Verify.Verify);\";\n        code += \" }\\n\";\n      }\n    }\n\n    // Generate the __init method that sets the field in a pre-existing\n    // accessor object. This is to allow object reuse.\n    code += \"  public void __init(int _i, ByteBuffer _bb) \";\n    code += \"{ \";\n    code += \"__p = new \";\n    code += struct_def.fixed ? \"Struct\" : \"Table\";\n    code += \"(_i, _bb); \";\n    code += \"}\\n\";\n    code +=\n        \"  public \" + struct_def.name + \" __assign(int _i, ByteBuffer _bb) \";\n    code += \"{ __init(_i, _bb); return this; }\\n\\n\";\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (field.deprecated) continue;\n      GenComment(field.doc_comment, code_ptr, &comment_config, \"  \");\n      std::string type_name = GenTypeGet(field.value.type);\n      std::string type_name_dest = GenTypeGet(field.value.type);\n      std::string conditional_cast = \"\";\n      std::string optional = \"\";\n      if (!struct_def.fixed &&\n          (field.value.type.base_type == BASE_TYPE_STRUCT ||\n           field.value.type.base_type == BASE_TYPE_UNION ||\n           (IsVector(field.value.type) &&\n            (field.value.type.element == BASE_TYPE_STRUCT ||\n             field.value.type.element == BASE_TYPE_UNION)))) {\n        optional = \"?\";\n        conditional_cast = \"(\" + type_name_dest + optional + \")\";\n      }\n      if (field.IsScalarOptional()) {\n        optional = \"?\";\n      }\n      std::string dest_mask = \"\";\n      std::string dest_cast = DestinationCast(field.value.type);\n      std::string src_cast = SourceCast(field.value.type);\n      std::string field_name_camel = Name(field);\n      if (field_name_camel == struct_def.name) {\n        field_name_camel += \"_\";\n      }\n      std::string method_start =\n          \"  public \" + type_name_dest + optional + \" \" + field_name_camel;\n      std::string obj = \"(new \" + type_name + \"())\";\n\n      // Most field accessors need to retrieve and test the field offset first,\n      // this is the prefix code for that:\n      auto offset_prefix =\n          IsArray(field.value.type)\n              ? \" { return \"\n              : (\" { int o = __p.__offset(\" + NumToString(field.value.offset) +\n                 \"); return o != 0 ? \");\n      // Generate the accessors that don't do object reuse.\n      if (field.value.type.base_type == BASE_TYPE_STRUCT) {\n      } else if (IsVector(field.value.type) &&\n                 field.value.type.element == BASE_TYPE_STRUCT) {\n      } else if (field.value.type.base_type == BASE_TYPE_UNION ||\n                 (IsVector(field.value.type) &&\n                  field.value.type.VectorType().base_type == BASE_TYPE_UNION)) {\n        method_start += \"<TTable>\";\n        type_name = type_name_dest;\n      }\n      std::string getter = dest_cast + GenGetter(field.value.type);\n      code += method_start;\n      std::string default_cast = \"\";\n      // only create default casts for c# scalars or vectors of scalars\n      if ((IsScalar(field.value.type.base_type) ||\n           (IsVector(field.value.type) &&\n            IsScalar(field.value.type.element)))) {\n        // For scalars, default value will be returned by GetDefaultValue().\n        // If the scalar is an enum, GetDefaultValue() returns an actual c# enum\n        // that doesn't need to be casted. However, default values for enum\n        // elements of vectors are integer literals (\"0\") and are still casted\n        // for clarity.\n        // If the scalar is optional and enum, we still need the cast.\n        if ((field.value.type.enum_def == nullptr ||\n             IsVector(field.value.type)) ||\n            (IsEnum(field.value.type) && field.IsScalarOptional())) {\n          default_cast = \"(\" + type_name_dest + optional + \")\";\n        }\n      }\n      std::string member_suffix = \"; \";\n      if (IsScalar(field.value.type.base_type)) {\n        code += \" { get\";\n        member_suffix += \"} \";\n        if (struct_def.fixed) {\n          code += \" { return \" + getter;\n          code += \"(__p.bb_pos + \";\n          code += NumToString(field.value.offset) + \")\";\n          code += dest_mask;\n        } else {\n          code += offset_prefix + getter;\n          code += \"(o + __p.bb_pos)\" + dest_mask;\n          code += \" : \" + default_cast;\n          code += GenDefaultValue(field);\n        }\n      } else {\n        switch (field.value.type.base_type) {\n          case BASE_TYPE_STRUCT:\n            code += \" { get\";\n            member_suffix += \"} \";\n            if (struct_def.fixed) {\n              code += \" { return \" + obj + \".__assign(\" + \"__p.\";\n              code += \"bb_pos + \" + NumToString(field.value.offset) + \", \";\n              code += \"__p.bb)\";\n            } else {\n              code += offset_prefix + conditional_cast;\n              code += obj + \".__assign(\";\n              code += field.value.type.struct_def->fixed\n                          ? \"o + __p.bb_pos\"\n                          : \"__p.__indirect(o + __p.bb_pos)\";\n              code += \", __p.bb) : null\";\n            }\n            break;\n          case BASE_TYPE_STRING:\n            code += \" { get\";\n            member_suffix += \"} \";\n            code += offset_prefix + getter + \"(o + \" + \"__p.\";\n            code += \"bb_pos) : null\";\n            break;\n          case BASE_TYPE_ARRAY:\n            FLATBUFFERS_FALLTHROUGH();  // fall thru\n          case BASE_TYPE_VECTOR: {\n            auto vectortype = field.value.type.VectorType();\n            if (vectortype.base_type == BASE_TYPE_UNION) {\n              conditional_cast = \"(TTable?)\";\n              getter += \"<TTable>\";\n            }\n            code += \"(\";\n            if (vectortype.base_type == BASE_TYPE_STRUCT) {\n              getter = obj + \".__assign\";\n            } else if (vectortype.base_type == BASE_TYPE_UNION) {\n            }\n            code += \"int j)\";\n            const auto body = offset_prefix + conditional_cast + getter + \"(\";\n            if (vectortype.base_type == BASE_TYPE_UNION) {\n              code += \" where TTable : struct, IFlatbufferObject\" + body;\n            } else {\n              code += body;\n            }\n            std::string index = \"__p.\";\n            if (IsArray(field.value.type)) {\n              index += \"bb_pos + \" + NumToString(field.value.offset) + \" + \";\n            } else {\n              index += \"__vector(o) + \";\n            }\n            index += \"j * \" + NumToString(InlineSize(vectortype));\n            if (vectortype.base_type == BASE_TYPE_STRUCT) {\n              code += vectortype.struct_def->fixed\n                          ? index\n                          : \"__p.__indirect(\" + index + \")\";\n              code += \", __p.bb\";\n            } else {\n              code += index;\n            }\n            code += \")\" + dest_mask;\n            if (!IsArray(field.value.type)) {\n              code += \" : \";\n              code +=\n                  field.value.type.element == BASE_TYPE_BOOL\n                      ? \"false\"\n                      : (IsScalar(field.value.type.element) ? default_cast + \"0\"\n                                                            : \"null\");\n            }\n            if (vectortype.base_type == BASE_TYPE_UNION &&\n                HasUnionStringValue(*vectortype.enum_def)) {\n              code += member_suffix;\n              code += \"}\\n\";\n              code += \"  public string \" + Name(field) + \"AsString(int j)\";\n              code += offset_prefix + GenGetter(Type(BASE_TYPE_STRING));\n              code += \"(\" + index + \") : null\";\n            }\n            break;\n          }\n          case BASE_TYPE_UNION:\n            code += \"() where TTable : struct, IFlatbufferObject\";\n            code += offset_prefix + \"(TTable?)\" + getter;\n            code += \"<TTable>(o + __p.bb_pos) : null\";\n            if (HasUnionStringValue(*field.value.type.enum_def)) {\n              code += member_suffix;\n              code += \"}\\n\";\n              code += \"  public string \" + Name(field) + \"AsString()\";\n              code += offset_prefix + GenGetter(Type(BASE_TYPE_STRING));\n              code += \"(o + __p.bb_pos) : null\";\n            }\n            // As<> accesors for Unions\n            // Loop through all the possible union types and generate an As\n            // accessor that casts to the correct type.\n            for (auto uit = field.value.type.enum_def->Vals().begin();\n                 uit != field.value.type.enum_def->Vals().end(); ++uit) {\n              auto val = *uit;\n              if (val->union_type.base_type == BASE_TYPE_NONE) {\n                continue;\n              }\n              auto union_field_type_name = GenTypeGet(val->union_type);\n              code += member_suffix + \"}\\n\";\n              if (val->union_type.base_type == BASE_TYPE_STRUCT &&\n                  val->union_type.struct_def->attributes.Lookup(\"private\")) {\n                code += \"  internal \";\n              } else {\n                code += \"  public \";\n              }\n              code += union_field_type_name + \" \";\n              code += field_name_camel + \"As\" + val->name + \"() { return \";\n              code += field_name_camel;\n              if (IsString(val->union_type)) {\n                code += \"AsString()\";\n              } else {\n                code += \"<\" + union_field_type_name + \">().Value\";\n              }\n            }\n            break;\n          default:\n            FLATBUFFERS_ASSERT(0);\n        }\n      }\n      code += member_suffix;\n      code += \"}\\n\";\n      if (IsVector(field.value.type)) {\n        auto camel_name = Name(field);\n        if (camel_name == struct_def.name) {\n          camel_name += \"_\";\n        }\n        code += \"  public int \" + camel_name;\n        code += \"Length\";\n        code += \" { get\";\n        code += offset_prefix;\n        code += \"__p.__vector_len(o) : 0; \";\n        code += \"} \";\n        code += \"}\\n\";\n        // See if we should generate a by-key accessor.\n        if (field.value.type.element == BASE_TYPE_STRUCT &&\n            !field.value.type.struct_def->fixed) {\n          auto& sd = *field.value.type.struct_def;\n          auto& fields = sd.fields.vec;\n          for (auto kit = fields.begin(); kit != fields.end(); ++kit) {\n            auto& key_field = **kit;\n            if (key_field.key) {\n              auto qualified_name = NamespacedName(sd);\n              code += \"  public \" + qualified_name + \"? \";\n              code += Name(field) + \"ByKey(\";\n              code += GenTypeGet(key_field.value.type) + \" key)\";\n              code += offset_prefix;\n              code += qualified_name + \".__lookup_by_key(\";\n              code += \"__p.__vector(o), key, \";\n              code += \"__p.bb) : null; \";\n              code += \"}\\n\";\n              break;\n            }\n          }\n        }\n      }\n      // Generate a ByteBuffer accessor for strings & vectors of scalars.\n      if ((IsVector(field.value.type) &&\n           IsScalar(field.value.type.VectorType().base_type)) ||\n          IsString(field.value.type)) {\n        code += \"#if ENABLE_SPAN_T\\n\";\n        code += \"  public Span<\" + GenTypeBasic(field.value.type.VectorType()) +\n                \"> Get\";\n        code += Name(field);\n        code += \"Bytes() { return \";\n        code += \"__p.__vector_as_span<\" +\n                GenTypeBasic(field.value.type.VectorType()) + \">(\";\n        code += NumToString(field.value.offset);\n        code +=\n            \", \" + NumToString(SizeOf(field.value.type.VectorType().base_type));\n        code += \"); }\\n\";\n        code += \"#else\\n\";\n        code += \"  public ArraySegment<byte>? Get\";\n        code += Name(field);\n        code += \"Bytes() { return \";\n        code += \"__p.__vector_as_arraysegment(\";\n        code += NumToString(field.value.offset);\n        code += \"); }\\n\";\n        code += \"#endif\\n\";\n\n        // For direct blockcopying the data into a typed array\n        code += \"  public \";\n        code += GenTypeBasic(field.value.type.VectorType());\n        code += \"[] Get\";\n        code += Name(field);\n        code += \"Array() { \";\n        if (IsEnum(field.value.type.VectorType())) {\n          // Since __vector_as_array does not work for enum types,\n          // fill array using an explicit loop.\n          code += \"int o = __p.__offset(\";\n          code += NumToString(field.value.offset);\n          code += \"); if (o == 0) return null; int p = \";\n          code += \"__p.__vector(o); int l = \";\n          code += \"__p.__vector_len(o); \";\n          code += GenTypeBasic(field.value.type.VectorType());\n          code += \"[] a = new \";\n          code += GenTypeBasic(field.value.type.VectorType());\n          code += \"[l]; for (int i = 0; i < l; i++) { a[i] = \" + getter;\n          code += \"(p + i * \";\n          code += NumToString(InlineSize(field.value.type.VectorType()));\n          code += \"); } return a;\";\n        } else {\n          code += \"return \";\n          code += \"__p.__vector_as_array<\";\n          code += GenTypeBasic(field.value.type.VectorType());\n          code += \">(\";\n          code += NumToString(field.value.offset);\n          code += \");\";\n        }\n        code += \" }\\n\";\n      }\n      \n      // Generate Length property and ByteBuffer accessor for arrays in structs.\n      if (IsArray(field.value.type) && struct_def.fixed &&\n          IsScalar(field.value.type.VectorType().base_type)) {\n        auto camel_name = Name(field);\n        if (camel_name == struct_def.name) { camel_name += \"_\"; }\n        \n        // Generate Length constant\n        code += \"  public const int \" + camel_name;\n        code += \"Length = \";\n        code += NumToString(field.value.type.fixed_length);\n        code += \";\\n\";\n        \n        // Generate GetBytes methods for scalar arrays (similar to vector pattern)\n        code += \"#if ENABLE_SPAN_T\\n\";\n        code += \"  public Span<\" + GenTypeBasic(field.value.type.VectorType()) +\n                \"> Get\";\n        code += camel_name;\n        code += \"Bytes() { return \";\n        \n        // For byte arrays, we can return the span directly\n        if (field.value.type.VectorType().base_type == BASE_TYPE_UCHAR) {\n          code += \"__p.bb.ToSpan(__p.bb_pos + \";\n          code += NumToString(field.value.offset);\n          code += \", \";\n          code += NumToString(field.value.type.fixed_length *\n                             SizeOf(field.value.type.VectorType().base_type));\n          code += \")\";\n        } else {\n          // For other types, we need to cast the byte span\n          code += \"System.Runtime.InteropServices.MemoryMarshal.Cast<byte, \" +\n                  GenTypeBasic(field.value.type.VectorType()) + \">(__p.bb.ToSpan(__p.bb_pos + \";\n          code += NumToString(field.value.offset);\n          code += \", \";\n          code += NumToString(field.value.type.fixed_length *\n                             SizeOf(field.value.type.VectorType().base_type));\n          code += \"))\";\n        }\n        code += \"; }\\n\";\n        code += \"#else\\n\";\n        code += \"  public ArraySegment<byte>? Get\";\n        code += camel_name;\n        code += \"Bytes() { return \";\n        code += \"__p.bb.ToArraySegment(__p.bb_pos + \";\n        code += NumToString(field.value.offset);\n        code += \", \";\n        code += NumToString(field.value.type.fixed_length *\n                           SizeOf(field.value.type.VectorType().base_type));\n        code += \");}\\n\";\n        code += \"#endif\\n\";\n      }\n      \n      // generate object accessors if is nested_flatbuffer\n      if (field.nested_flatbuffer) {\n        auto nested_type_name = NamespacedName(*field.nested_flatbuffer);\n        auto nested_method_name =\n            Name(field) + \"As\" + field.nested_flatbuffer->name;\n        auto get_nested_method_name = nested_method_name;\n        get_nested_method_name = \"Get\" + nested_method_name;\n        conditional_cast = \"(\" + nested_type_name + \"?)\";\n        obj = \"(new \" + nested_type_name + \"())\";\n        code += \"  public \" + nested_type_name + \"? \";\n        code += get_nested_method_name + \"(\";\n        code += \") { int o = __p.__offset(\";\n        code += NumToString(field.value.offset) + \"); \";\n        code += \"return o != 0 ? \" + conditional_cast + obj + \".__assign(\";\n        code += \"__p.\";\n        code += \"__indirect(__p.__vector(o)), \";\n        code += \"__p.bb) : null; }\\n\";\n      }\n      // Generate mutators for scalar fields or vectors of scalars.\n      if (parser_.opts.mutable_buffer) {\n        auto is_series = (IsSeries(field.value.type));\n        const auto& underlying_type =\n            is_series ? field.value.type.VectorType() : field.value.type;\n        // Boolean parameters have to be explicitly converted to byte\n        // representation.\n        auto setter_parameter =\n            underlying_type.base_type == BASE_TYPE_BOOL\n                ? \"(byte)(\" + EscapeKeyword(field.name) + \" ? 1 : 0)\"\n                : EscapeKeyword(field.name);\n        auto mutator_prefix = \"Mutate\";\n        // A vector mutator also needs the index of the vector element it should\n        // mutate.\n        auto mutator_params = (is_series ? \"(int j, \" : \"(\") +\n                              GenTypeGet(underlying_type) + \" \" +\n                              EscapeKeyword(field.name) + \") { \";\n        auto setter_index =\n            is_series\n                ? \"__p.\" +\n                      (IsArray(field.value.type)\n                           ? \"bb_pos + \" + NumToString(field.value.offset)\n                           : \"__vector(o)\") +\n                      +\" + j * \" + NumToString(InlineSize(underlying_type))\n                : (struct_def.fixed\n                       ? \"__p.bb_pos + \" + NumToString(field.value.offset)\n                       : \"o + __p.bb_pos\");\n        if (IsScalar(underlying_type.base_type) && !IsUnion(field.value.type)) {\n          code += \"  public \";\n          code += struct_def.fixed ? \"void \" : \"bool \";\n          code += mutator_prefix + Name(field);\n          code += mutator_params;\n          if (struct_def.fixed) {\n            code += GenSetter(underlying_type) + \"(\" + setter_index + \", \";\n            code += src_cast + setter_parameter + \"); }\\n\";\n          } else {\n            code += \"int o = __p.__offset(\";\n            code += NumToString(field.value.offset) + \");\";\n            code += \" if (o != 0) { \" + GenSetter(underlying_type);\n            code += \"(\" + setter_index + \", \" + src_cast + setter_parameter +\n                    \"); return true; } else { return false; } }\\n\";\n          }\n        }\n      }\n      if (parser_.opts.java_primitive_has_method &&\n          IsScalar(field.value.type.base_type) && !struct_def.fixed) {\n        auto vt_offset_constant =\n            \"  public static final int VT_\" +\n            ConvertCase(field.name, Case::kScreamingSnake) + \" = \" +\n            NumToString(field.value.offset) + \";\";\n\n        code += vt_offset_constant;\n        code += \"\\n\";\n      }\n    }\n    code += \"\\n\";\n    auto struct_has_create = false;\n    std::set<flatbuffers::FieldDef*> field_has_create_set;\n    flatbuffers::FieldDef* key_field = nullptr;\n    if (struct_def.fixed) {\n      struct_has_create = true;\n      // create a struct constructor function\n      code += \"  public static \" + GenOffsetType(struct_def) + \" \";\n      code += \"Create\";\n      code += struct_def.name + \"(FlatBufferBuilder builder\";\n      GenStructArgs(struct_def, code_ptr, \"\");\n      code += \") {\\n\";\n      GenStructBody(struct_def, code_ptr, \"\");\n      code += \"    return \";\n      code += GenOffsetConstruct(struct_def, \"builder.Offset\");\n      code += \";\\n  }\\n\";\n    } else {\n      // Generate a method that creates a table in one go. This is only possible\n      // when the table has no struct fields, since those have to be created\n      // inline, and there's no way to do so in Java.\n      bool has_no_struct_fields = true;\n      int num_fields = 0;\n      for (auto it = struct_def.fields.vec.begin();\n           it != struct_def.fields.vec.end(); ++it) {\n        auto& field = **it;\n        if (field.deprecated) continue;\n        if (IsStruct(field.value.type)) {\n          has_no_struct_fields = false;\n        } else {\n          num_fields++;\n        }\n      }\n      // JVM specifications restrict default constructor params to be < 255.\n      // Longs and doubles take up 2 units, so we set the limit to be < 127.\n      if ((has_no_struct_fields || opts.generate_object_based_api) &&\n          num_fields && num_fields < 127) {\n        struct_has_create = true;\n        // Generate a table constructor of the form:\n        // public static int createName(FlatBufferBuilder builder, args...)\n        code += \"  public static \" + GenOffsetType(struct_def) + \" \";\n        code += \"Create\" + struct_def.name;\n        code += \"(FlatBufferBuilder builder\";\n        for (auto it = struct_def.fields.vec.begin();\n             it != struct_def.fields.vec.end(); ++it) {\n          auto& field = **it;\n          if (field.deprecated) continue;\n          code += \",\\n      \";\n          if (IsStruct(field.value.type) && opts.generate_object_based_api) {\n            code += WrapInNameSpace(\n                field.value.type.struct_def->defined_namespace,\n                GenTypeName_ObjectAPI(field.value.type.struct_def->name, opts));\n            code += \" \";\n            code += EscapeKeyword(field.name);\n            code += \" = null\";\n          } else {\n            code += GenTypeBasic(field.value.type);\n            if (field.IsScalarOptional()) {\n              code += \"?\";\n            }\n            code += \" \";\n            code += EscapeKeyword(field.name);\n            if (!IsScalar(field.value.type.base_type)) code += \"Offset\";\n\n            code += \" = \";\n            code += GenDefaultValueBasic(field);\n          }\n        }\n        code += \") {\\n    builder.\";\n        code += \"StartTable(\";\n        code += NumToString(struct_def.fields.vec.size()) + \");\\n\";\n        for (size_t size = struct_def.sortbysize ? sizeof(largest_scalar_t) : 1;\n             size; size /= 2) {\n          for (auto it = struct_def.fields.vec.rbegin();\n               it != struct_def.fields.vec.rend(); ++it) {\n            auto& field = **it;\n            if (!field.deprecated &&\n                (!struct_def.sortbysize ||\n                 size == SizeOf(field.value.type.base_type))) {\n              code += \"    \" + struct_def.name + \".\";\n              code += \"Add\";\n              code += Name(field) + \"(builder, \";\n              if (IsStruct(field.value.type) &&\n                  opts.generate_object_based_api) {\n                code += GenTypePointer(field.value.type) + \".Pack(builder, \" +\n                        EscapeKeyword(field.name) + \")\";\n              } else {\n                code += EscapeKeyword(field.name);\n                if (!IsScalar(field.value.type.base_type)) code += \"Offset\";\n              }\n\n              code += \");\\n\";\n            }\n          }\n        }\n        code += \"    return \" + struct_def.name + \".\";\n        code += \"End\" + struct_def.name;\n        code += \"(builder);\\n  }\\n\\n\";\n      }\n      // Generate a set of static methods that allow table construction,\n      // of the form:\n      // public static void addName(FlatBufferBuilder builder, short name)\n      // { builder.addShort(id, name, default); }\n      // Unlike the Create function, these always work.\n      code += \"  public static void Start\";\n      code += struct_def.name;\n      code += \"(FlatBufferBuilder builder) { builder.\";\n      code += \"StartTable(\";\n      code += NumToString(struct_def.fields.vec.size()) + \"); }\\n\";\n      for (auto it = struct_def.fields.vec.begin();\n           it != struct_def.fields.vec.end(); ++it) {\n        auto& field = **it;\n        if (field.deprecated) continue;\n        if (field.key) key_field = &field;\n        code += \"  public static void Add\";\n        code += Name(field);\n        code += \"(FlatBufferBuilder builder, \";\n        code += GenTypeBasic(field.value.type);\n        auto argname = ConvertCase(field.name, Case::kLowerCamel);\n        if (!IsScalar(field.value.type.base_type)) argname += \"Offset\";\n        if (field.IsScalarOptional()) {\n          code += \"?\";\n        }\n        code += \" \" + EscapeKeyword(argname) + \") { builder.Add\";\n        code += GenMethod(field.value.type) + \"(\";\n        code += NumToString(it - struct_def.fields.vec.begin()) + \", \";\n        code += SourceCastBasic(field.value.type, field.IsScalarOptional());\n        code += EscapeKeyword(argname);\n        if (!IsScalar(field.value.type.base_type) &&\n            field.value.type.base_type != BASE_TYPE_UNION) {\n          code += \".Value\";\n        }\n        if (!field.IsScalarOptional()) {\n          // When the scalar is optional, use the builder method that doesn't\n          // supply a default value. Otherwise, we to continue to use the\n          // default value method.\n          code += \", \";\n          code += GenDefaultValue(field, false);\n        }\n        code += \"); }\\n\";\n        if (IsVector(field.value.type)) {\n          auto vector_type = field.value.type.VectorType();\n          auto alignment = InlineAlignment(vector_type);\n          auto elem_size = InlineSize(vector_type);\n          if (!IsStruct(vector_type)) {\n            field_has_create_set.insert(&field);\n            code += \"  public static VectorOffset \";\n            code += \"Create\";\n            code += Name(field);\n            code += \"Vector(FlatBufferBuilder builder, \";\n            code += GenTypeBasic(vector_type) + \"[] data) \";\n            code += \"{ builder.StartVector(\";\n            code += NumToString(elem_size);\n            code += \", data.Length, \";\n            code += NumToString(alignment);\n            code += \"); for (int i = data.\";\n            code += \"Length - 1; i >= 0; i--) builder.\";\n            code += \"Add\";\n            code += GenMethod(vector_type);\n            code += \"(\";\n            // At the moment there is no support of the type Vector with\n            // optional enum, e.g. if we have enum type SomeEnum there is no way\n            // to define `SomeEmum?[] enums` in FlatBuffer schema, so isOptional\n            // = false\n            code += SourceCastBasic(vector_type, false);\n            code += \"data[i]\";\n            if (vector_type.base_type == BASE_TYPE_STRUCT ||\n                IsString(vector_type))\n              code += \".Value\";\n            code += \"); return \";\n            code += \"builder.EndVector(); }\\n\";\n\n            // add Create...VectorBlock() overloads for T[], ArraySegment<T> and\n            // IntPtr\n            code += \"  public static VectorOffset \";\n            code += \"Create\";\n            code += Name(field);\n            code += \"VectorBlock(FlatBufferBuilder builder, \";\n            code += GenTypeBasic(vector_type) + \"[] data) \";\n            code += \"{ builder.StartVector(\";\n            code += NumToString(elem_size);\n            code += \", data.Length, \";\n            code += NumToString(alignment);\n            code += \"); builder.Add(data); return builder.EndVector(); }\\n\";\n\n            code += \"  public static VectorOffset \";\n            code += \"Create\";\n            code += Name(field);\n            code += \"VectorBlock(FlatBufferBuilder builder, \";\n            code += \"ArraySegment<\" + GenTypeBasic(vector_type) + \"> data) \";\n            code += \"{ builder.StartVector(\";\n            code += NumToString(elem_size);\n            code += \", data.Count, \";\n            code += NumToString(alignment);\n            code += \"); builder.Add(data); return builder.EndVector(); }\\n\";\n\n            code += \"  public static VectorOffset \";\n            code += \"Create\";\n            code += Name(field);\n            code += \"VectorBlock(FlatBufferBuilder builder, \";\n            code += \"IntPtr dataPtr, int sizeInBytes) \";\n            code += \"{ builder.StartVector(1, sizeInBytes, 1); \";\n            code += \"builder.Add<\" + GenTypeBasic(vector_type) +\n                    \">(dataPtr, sizeInBytes); return builder.EndVector(); }\\n\";\n          }\n          // Generate a method to start a vector, data to be added manually\n          // after.\n          code += \"  public static void Start\";\n          code += Name(field);\n          code += \"Vector(FlatBufferBuilder builder, int numElems) \";\n          code += \"{ builder.StartVector(\";\n          code += NumToString(elem_size);\n          code += \", numElems, \" + NumToString(alignment);\n          code += \"); }\\n\";\n        }\n      }\n      code += \"  public static \" + GenOffsetType(struct_def) + \" \";\n      code += \"End\" + struct_def.name;\n      code += \"(FlatBufferBuilder builder) {\\n    int o = builder.\";\n      code += \"EndTable();\\n\";\n      for (auto it = struct_def.fields.vec.begin();\n           it != struct_def.fields.vec.end(); ++it) {\n        auto& field = **it;\n        if (!field.deprecated && field.IsRequired()) {\n          code += \"    builder.Required(o, \";\n          code += NumToString(field.value.offset);\n          code += \");  // \" + field.name + \"\\n\";\n        }\n      }\n      code += \"    return \" + GenOffsetConstruct(struct_def, \"o\") + \";\\n  }\\n\";\n      if (parser_.root_struct_def_ == &struct_def) {\n        std::string size_prefix[] = {\"\", \"SizePrefixed\"};\n        for (int i = 0; i < 2; ++i) {\n          code += \"  public static void \";\n          code += \"Finish\" + size_prefix[i] + struct_def.name;\n          code +=\n              \"Buffer(FlatBufferBuilder builder, \" + GenOffsetType(struct_def);\n          code += \" offset) {\";\n          code += \" builder.Finish\" + size_prefix[i] + \"(offset\";\n          code += \".Value\";\n\n          if (parser_.file_identifier_.length())\n            code += \", \\\"\" + parser_.file_identifier_ + \"\\\"\";\n          code += \"); }\\n\";\n        }\n      }\n    }\n    // Only generate key compare function for table,\n    // because `key_field` is not set for struct\n    if (struct_def.has_key && !struct_def.fixed) {\n      FLATBUFFERS_ASSERT(key_field);\n      auto name = Name(*key_field);\n      if (name == struct_def.name) {\n        name += \"_\";\n      }\n      code += \"\\n  public static VectorOffset \";\n      code += \"CreateSortedVectorOf\" + struct_def.name;\n      code += \"(FlatBufferBuilder builder, \";\n      code += \"Offset<\" + struct_def.name + \">\";\n      code += \"[] offsets) {\\n\";\n      code += \"    Array.Sort(offsets,\\n\";\n      code += \"      (Offset<\" + struct_def.name + \"> o1, Offset<\" +\n              struct_def.name + \"> o2) =>\\n\";\n      code += \"        \" + GenKeyGetter(struct_def, key_field);\n      code += \");\\n\";\n      code += \"    return builder.CreateVectorOfTables(offsets);\\n  }\\n\";\n\n      code += \"\\n  public static \" + struct_def.name + \"?\";\n      code += \" __lookup_by_key(\";\n      code += \"int vectorLocation, \";\n      code += GenTypeGet(key_field->value.type);\n      code += \" key, ByteBuffer bb) {\\n\";\n      code +=\n          \"    \" + struct_def.name + \" obj_ = new \" + struct_def.name + \"();\\n\";\n      code += \"    int span = \";\n      code += \"bb.GetInt(vectorLocation - 4);\\n\";\n      code += \"    int start = 0;\\n\";\n      code += \"    while (span != 0) {\\n\";\n      code += \"      int middle = span / 2;\\n\";\n      code +=\n          \"      int tableOffset = Table.__indirect(vectorLocation + 4 * \"\n          \"(start + middle), bb);\\n\";\n\n      code += \"      obj_.__assign(tableOffset, bb);\\n\";\n      if (IsString(key_field->value.type)) {\n        code +=\n            \"      int comp = string.CompareOrdinal(obj_.\" + name + \", key);\\n\";\n      } else {\n        code += \"      int comp = obj_.\" + name + \".CompareTo(key);\\n\";\n      }\n      code += \"      if (comp > 0) {\\n\";\n      code += \"        span = middle;\\n\";\n      code += \"      } else if (comp < 0) {\\n\";\n      code += \"        middle++;\\n\";\n      code += \"        start += middle;\\n\";\n      code += \"        span -= middle;\\n\";\n      code += \"      } else {\\n\";\n      code += \"        return obj_;\\n\";\n      code += \"      }\\n    }\\n\";\n      code += \"    return null;\\n\";\n      code += \"  }\\n\";\n    }\n\n    if (opts.generate_object_based_api) {\n      GenPackUnPack_ObjectAPI(struct_def, code_ptr, opts, struct_has_create,\n                              field_has_create_set);\n    }\n    code += \"}\\n\\n\";\n\n    if (opts.generate_object_based_api) {\n      GenStruct_ObjectAPI(struct_def, code_ptr, opts);\n    }\n  }\n\n  void GenVectorAccessObject(StructDef& struct_def,\n                             std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    // Generate a vector of structs accessor class.\n    code += \"\\n\";\n    code += \"  \";\n    if (!struct_def.attributes.Lookup(\"private\")) code += \"public \";\n    code += \"static struct Vector : BaseVector\\n{\\n\";\n\n    // Generate the __assign method that sets the field in a pre-existing\n    // accessor object. This is to allow object reuse.\n    std::string method_indent = \"    \";\n    code += method_indent + \"public Vector \";\n    code += \"__assign(int _vector, int _element_size, ByteBuffer _bb) { \";\n    code += \"__reset(_vector, _element_size, _bb); return this; }\\n\\n\";\n\n    auto type_name = struct_def.name;\n    auto method_start = method_indent + \"public \" + type_name + \" Get\";\n    // Generate the accessors that don't do object reuse.\n    code += method_start + \"(int j) { return Get\";\n    code += \"(new \" + type_name + \"(), j); }\\n\";\n    code += method_start + \"(\" + type_name + \" obj, int j) { \";\n    code += \" return obj.__assign(\";\n    code += struct_def.fixed ? \"__p.__element(j)\"\n                             : \"__p.__indirect(__p.__element(j), bb)\";\n    code += \", __p.bb); }\\n\";\n    // See if we should generate a by-key accessor.\n    if (!struct_def.fixed) {\n      auto& fields = struct_def.fields.vec;\n      for (auto kit = fields.begin(); kit != fields.end(); ++kit) {\n        auto& key_field = **kit;\n        if (key_field.key) {\n          auto nullable_annotation =\n              parser_.opts.gen_nullable ? \"@Nullable \" : \"\";\n          code += method_indent + nullable_annotation;\n          code += \"public \" + type_name + \"? \";\n          code += \"GetByKey(\";\n          code += GenTypeGet(key_field.value.type) + \" key) { \";\n          code += \" return __lookup_by_key(null, \";\n          code += \"__p.__vector(), key, \";\n          code += \"__p.bb); \";\n          code += \"}\\n\";\n          code += method_indent + nullable_annotation;\n          code += \"public \" + type_name + \"?\" + \" \";\n          code += \"GetByKey(\";\n          code += type_name + \"? obj, \";\n          code += GenTypeGet(key_field.value.type) + \" key) { \";\n          code += \" return __lookup_by_key(obj, \";\n          code += \"__p.__vector(), key, \";\n          code += \"__p.bb); \";\n          code += \"}\\n\";\n          break;\n        }\n      }\n    }\n    code += \"  }\\n\";\n  }\n\n  std::string GenUnionVerify(const Type& union_type) const {\n    if (union_type.enum_def) {\n      const auto& enum_def = *union_type.enum_def;\n\n      auto ret = \"\\n\\nstatic public class \" + enum_def.name + \"Verify\\n\";\n      ret += \"{\\n\";\n      ret +=\n          \"  static public bool Verify(Google.FlatBuffers.Verifier verifier, \"\n          \"byte typeId, uint tablePos)\\n\";\n      ret += \"  {\\n\";\n      ret += \"    bool result = true;\\n\";\n\n      const auto union_enum_loop = [&]() {\n        ret += \"    switch((\" + enum_def.name + \")typeId)\\n\";\n        ret += \"    {\\n\";\n\n        for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end();\n             ++it) {\n          const auto& ev = **it;\n          if (ev.IsZero()) {\n            continue;\n          }\n\n          ret += \"      case \" + Name(enum_def) + \".\" + Name(ev) + \":\\n\";\n\n          if (IsString(ev.union_type)) {\n            ret += \"       result = verifier.VerifyUnionString(tablePos);\\n\";\n            ret += \"        break;\";\n          } else if (ev.union_type.base_type == BASE_TYPE_STRUCT) {\n            if (!ev.union_type.struct_def->fixed) {\n              auto type = GenTypeGet(ev.union_type);\n              ret += \"        result = \" + type +\n                     \"Verify.Verify(verifier, tablePos);\\n\";\n            } else {\n              ret += \"        result = verifier.VerifyUnionData(tablePos, \" +\n                     NumToString(InlineSize(ev.union_type)) + \", \" +\n                     NumToString(InlineAlignment(ev.union_type)) + \");\\n\";\n              ;\n            }\n            ret += \"        break;\";\n          } else {\n            FLATBUFFERS_ASSERT(false);\n          }\n          ret += \"\\n\";\n        }\n\n        ret += \"      default: result = true;\\n\";\n        ret += \"        break;\\n\";\n        ret += \"    }\\n\";\n        ret += \"    return result;\\n\";\n      };\n\n      union_enum_loop();\n      ret += \"  }\\n\";\n      ret += \"}\\n\";\n      ret += \"\\n\";\n\n      return ret;\n    }\n    FLATBUFFERS_ASSERT(0);\n    return \"\";\n  }\n\n  void GenEnum_ObjectAPI(EnumDef& enum_def, std::string* code_ptr,\n                         const IDLOptions& opts) const {\n    auto& code = *code_ptr;\n    if (enum_def.generated) return;\n    if (!enum_def.is_union) return;\n    if (enum_def.attributes.Lookup(\"private\")) {\n      code += \"internal \";\n    } else {\n      code += \"public \";\n    }\n    auto union_name = enum_def.name + \"Union\";\n    auto class_member = std::string(\"Value\");\n    if (class_member == enum_def.name) {\n      class_member += \"_\";\n    };\n    code += \"class \" + union_name + \" {\\n\";\n    // Type\n    code += \"  public \" + enum_def.name + \" Type { get; set; }\\n\";\n    // Value\n    code += \"  public object \" + class_member + \" { get; set; }\\n\";\n    code += \"\\n\";\n    // Constructor\n    code += \"  public \" + union_name + \"() {\\n\";\n    code += \"    this.Type = \" + enum_def.name + \".\" +\n            enum_def.Vals()[0]->name + \";\\n\";\n    code += \"    this.\" + class_member + \" = null;\\n\";\n    code += \"  }\\n\\n\";\n    // As<T>\n    code += \"  public T As<T>() where T : class { return this.\" + class_member +\n            \" as T; }\\n\";\n    // As, From\n    for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {\n      auto& ev = **it;\n      if (ev.union_type.base_type == BASE_TYPE_NONE) continue;\n      auto type_name = GenTypeGet_ObjectAPI(ev.union_type, opts);\n      std::string accessibility =\n          (ev.union_type.base_type == BASE_TYPE_STRUCT &&\n           ev.union_type.struct_def->attributes.Lookup(\"private\"))\n              ? \"internal\"\n              : \"public\";\n      // As\n      code += \"  \" + accessibility + \" \" + type_name + \" As\" + ev.name +\n              \"() { return this.As<\" + type_name + \">(); }\\n\";\n      // From\n      auto lower_ev_name = ev.name;\n      std::transform(lower_ev_name.begin(), lower_ev_name.end(),\n                     lower_ev_name.begin(), CharToLower);\n      code += \"  \" + accessibility + \" static \" + union_name + \" From\" +\n              ev.name + \"(\" + type_name + \" _\" + lower_ev_name +\n              \") { return new \" + union_name + \"{ Type = \" + Name(enum_def) +\n              \".\" + Name(ev) + \", \" + class_member + \" = _\" + lower_ev_name +\n              \" }; }\\n\";\n    }\n    code += \"\\n\";\n    // Pack()\n    code +=\n        \"  public static int Pack(Google.FlatBuffers.FlatBufferBuilder \"\n        \"builder, \" +\n        union_name + \" _o) {\\n\";\n    code += \"    switch (_o.Type) {\\n\";\n    for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {\n      auto& ev = **it;\n      if (ev.union_type.base_type == BASE_TYPE_NONE) {\n        code += \"      default: return 0;\\n\";\n      } else {\n        code += \"      case \" + Name(enum_def) + \".\" + Name(ev) + \": return \";\n        if (IsString(ev.union_type)) {\n          code += \"builder.CreateString(_o.As\" + ev.name + \"()).Value;\\n\";\n        } else {\n          code += GenTypeGet(ev.union_type) + \".Pack(builder, _o.As\" + ev.name +\n                  \"()).Value;\\n\";\n        }\n      }\n    }\n    code += \"    }\\n\";\n    code += \"  }\\n\";\n    code += \"}\\n\\n\";\n\n    // JsonConverter\n    if (opts.cs_gen_json_serializer) {\n      if (enum_def.attributes.Lookup(\"private\")) {\n        code += \"internal \";\n      } else {\n        code += \"public \";\n      }\n      code += \"class \" + union_name +\n              \"_JsonConverter : Newtonsoft.Json.JsonConverter {\\n\";\n      code += \"  public override bool CanConvert(System.Type objectType) {\\n\";\n      code += \"    return objectType == typeof(\" + union_name +\n              \") || objectType == typeof(System.Collections.Generic.List<\" +\n              union_name + \">);\\n\";\n      code += \"  }\\n\";\n      code +=\n          \"  public override void WriteJson(Newtonsoft.Json.JsonWriter writer, \"\n          \"object value, \"\n          \"Newtonsoft.Json.JsonSerializer serializer) {\\n\";\n      code += \"    var _olist = value as System.Collections.Generic.List<\" +\n              union_name + \">;\\n\";\n      code += \"    if (_olist != null) {\\n\";\n      code += \"      writer.WriteStartArray();\\n\";\n      code +=\n          \"      foreach (var _o in _olist) { this.WriteJson(writer, _o, \"\n          \"serializer); }\\n\";\n      code += \"      writer.WriteEndArray();\\n\";\n      code += \"    } else {\\n\";\n      code += \"      this.WriteJson(writer, value as \" + union_name +\n              \", serializer);\\n\";\n      code += \"    }\\n\";\n      code += \"  }\\n\";\n      code += \"  public void WriteJson(Newtonsoft.Json.JsonWriter writer, \" +\n              union_name +\n              \" _o, \"\n              \"Newtonsoft.Json.JsonSerializer serializer) {\\n\";\n      code += \"    if (_o == null) return;\\n\";\n      code += \"    serializer.Serialize(writer, _o.\" + class_member + \");\\n\";\n      code += \"  }\\n\";\n      code +=\n          \"  public override object ReadJson(Newtonsoft.Json.JsonReader \"\n          \"reader, \"\n          \"System.Type objectType, \"\n          \"object existingValue, Newtonsoft.Json.JsonSerializer serializer) \"\n          \"{\\n\";\n      code +=\n          \"    var _olist = existingValue as System.Collections.Generic.List<\" +\n          union_name + \">;\\n\";\n      code += \"    if (_olist != null) {\\n\";\n      code += \"      for (var _j = 0; _j < _olist.Count; ++_j) {\\n\";\n      code += \"        reader.Read();\\n\";\n      code +=\n          \"        _olist[_j] = this.ReadJson(reader, _olist[_j], \"\n          \"serializer);\\n\";\n      code += \"      }\\n\";\n      code += \"      reader.Read();\\n\";\n      code += \"      return _olist;\\n\";\n      code += \"    } else {\\n\";\n      code += \"      return this.ReadJson(reader, existingValue as \" +\n              union_name + \", serializer);\\n\";\n      code += \"    }\\n\";\n      code += \"  }\\n\";\n      code += \"  public \" + union_name +\n              \" ReadJson(Newtonsoft.Json.JsonReader reader, \" + union_name +\n              \" _o, Newtonsoft.Json.JsonSerializer serializer) {\\n\";\n      code += \"    if (_o == null) return null;\\n\";\n      code += \"    switch (_o.Type) {\\n\";\n      for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end();\n           ++it) {\n        auto& ev = **it;\n        if (ev.union_type.base_type == BASE_TYPE_NONE) {\n          code += \"      default: break;\\n\";\n        } else {\n          auto type_name = GenTypeGet_ObjectAPI(ev.union_type, opts);\n          code += \"      case \" + Name(enum_def) + \".\" + Name(ev) + \": _o.\" +\n                  class_member + \" = serializer.Deserialize<\" + type_name +\n                  \">(reader); break;\\n\";\n        }\n      }\n      code += \"    }\\n\";\n      code += \"    return _o;\\n\";\n      code += \"  }\\n\";\n      code += \"}\\n\\n\";\n    }\n  }\n\n  std::string GenTypeName_ObjectAPI(const std::string& name,\n                                    const IDLOptions& opts) const {\n    return opts.object_prefix + name + opts.object_suffix;\n  }\n\n  void GenUnionUnPack_ObjectAPI(const EnumDef& enum_def, std::string* code_ptr,\n                                const std::string& camel_name,\n                                const std::string& camel_name_short,\n                                bool is_vector) const {\n    auto& code = *code_ptr;\n    std::string varialbe_name = \"_o.\" + camel_name;\n    std::string class_member = \"Value\";\n    if (class_member == enum_def.name) class_member += \"_\";\n    std::string type_suffix = \"\";\n    std::string func_suffix = \"()\";\n    std::string indent = \"    \";\n    if (is_vector) {\n      varialbe_name = \"_o_\" + camel_name;\n      type_suffix = \"(_j)\";\n      func_suffix = \"(_j)\";\n      indent = \"      \";\n    }\n    if (is_vector) {\n      code += indent + \"var \" + varialbe_name + \" = new \";\n    } else {\n      code += indent + varialbe_name + \" = new \";\n    }\n    code += NamespacedName(enum_def) + \"Union();\\n\";\n    code += indent + varialbe_name + \".Type = this.\" + camel_name_short +\n            \"Type\" + type_suffix + \";\\n\";\n    code += indent + \"switch (this.\" + camel_name_short + \"Type\" + type_suffix +\n            \") {\\n\";\n    for (auto eit = enum_def.Vals().begin(); eit != enum_def.Vals().end();\n         ++eit) {\n      auto& ev = **eit;\n      if (ev.union_type.base_type == BASE_TYPE_NONE) {\n        code += indent + \"  default: break;\\n\";\n      } else {\n        code += indent + \"  case \" + NamespacedName(enum_def) + \".\" + ev.name +\n                \":\\n\";\n        code += indent + \"    \" + varialbe_name + \".\" + class_member +\n                \" = this.\" + camel_name;\n        if (IsString(ev.union_type)) {\n          code += \"AsString\" + func_suffix + \";\\n\";\n        } else {\n          code += \"<\" + GenTypeGet(ev.union_type) + \">\" + func_suffix;\n          code += \".HasValue ? this.\" + camel_name;\n          code += \"<\" + GenTypeGet(ev.union_type) + \">\" + func_suffix +\n                  \".Value.UnPack() : null;\\n\";\n        }\n        code += indent + \"    break;\\n\";\n      }\n    }\n    code += indent + \"}\\n\";\n    if (is_vector) {\n      code += indent + \"_o.\" + camel_name + \".Add(\" + varialbe_name + \");\\n\";\n    }\n  }\n\n  void GenPackUnPack_ObjectAPI(\n      StructDef& struct_def, std::string* code_ptr, const IDLOptions& opts,\n      bool struct_has_create,\n      const std::set<FieldDef*>& field_has_create) const {\n    auto& code = *code_ptr;\n    auto struct_name = GenTypeName_ObjectAPI(struct_def.name, opts);\n    // UnPack()\n    code += \"  public \" + struct_name + \" UnPack() {\\n\";\n    code += \"    var _o = new \" + struct_name + \"();\\n\";\n    code += \"    this.UnPackTo(_o);\\n\";\n    code += \"    return _o;\\n\";\n    code += \"  }\\n\";\n    // UnPackTo()\n    code += \"  public void UnPackTo(\" + struct_name + \" _o) {\\n\";\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (field.deprecated) continue;\n      auto camel_name = Name(field);\n      if (camel_name == struct_def.name) {\n        camel_name += \"_\";\n      }\n      auto camel_name_short = Name(field);\n      auto start = \"    _o.\" + camel_name + \" = \";\n      switch (field.value.type.base_type) {\n        case BASE_TYPE_STRUCT: {\n          auto fixed = struct_def.fixed && field.value.type.struct_def->fixed;\n          if (fixed) {\n            code += start + \"this.\" + camel_name + \".UnPack();\\n\";\n          } else {\n            code += start + \"this.\" + camel_name + \".HasValue ? this.\" +\n                    camel_name + \".Value.UnPack() : null;\\n\";\n          }\n          break;\n        }\n        case BASE_TYPE_ARRAY: {\n          auto type_name = GenTypeGet_ObjectAPI(field.value.type, opts);\n          auto length_str = NumToString(field.value.type.fixed_length);\n          auto unpack_method = field.value.type.struct_def == nullptr ? \"\"\n                               : field.value.type.struct_def->fixed\n                                   ? \".UnPack()\"\n                                   : \"?.UnPack()\";\n          code += start + \"new \" + type_name.substr(0, type_name.length() - 1) +\n                  length_str + \"];\\n\";\n          code += \"    for (var _j = 0; _j < \" + length_str + \"; ++_j) { _o.\" +\n                  camel_name + \"[_j] = this.\" + camel_name + \"(_j)\" +\n                  unpack_method + \"; }\\n\";\n          break;\n        }\n        case BASE_TYPE_VECTOR:\n          if (field.value.type.element == BASE_TYPE_UNION) {\n            code += start + \"new \" +\n                    GenTypeGet_ObjectAPI(field.value.type, opts) + \"();\\n\";\n            code += \"    for (var _j = 0; _j < this.\" + camel_name +\n                    \"Length; ++_j) {\\n\";\n            GenUnionUnPack_ObjectAPI(*field.value.type.enum_def, code_ptr,\n                                     camel_name, camel_name_short, true);\n            code += \"    }\\n\";\n          } else if (field.value.type.element != BASE_TYPE_UTYPE) {\n            auto fixed = field.value.type.struct_def == nullptr;\n            code += start + \"new \" +\n                    GenTypeGet_ObjectAPI(field.value.type, opts) + \"();\\n\";\n            code += \"    for (var _j = 0; _j < this.\" + camel_name +\n                    \"Length; ++_j) {\";\n            code += \"_o.\" + camel_name + \".Add(\";\n            if (fixed) {\n              code += \"this.\" + camel_name + \"(_j)\";\n            } else {\n              code += \"this.\" + camel_name + \"(_j).HasValue ? this.\" +\n                      camel_name + \"(_j).Value.UnPack() : null\";\n            }\n            code += \");}\\n\";\n          }\n          break;\n        case BASE_TYPE_UTYPE:\n          break;\n        case BASE_TYPE_UNION: {\n          GenUnionUnPack_ObjectAPI(*field.value.type.enum_def, code_ptr,\n                                   camel_name, camel_name_short, false);\n          break;\n        }\n        default: {\n          code += start + \"this.\" + camel_name + \";\\n\";\n          break;\n        }\n      }\n    }\n    code += \"  }\\n\";\n    // Pack()\n    code += \"  public static \" + GenOffsetType(struct_def) +\n            \" Pack(FlatBufferBuilder builder, \" + struct_name + \" _o) {\\n\";\n    code += \"    if (_o == null) return default(\" + GenOffsetType(struct_def) +\n            \");\\n\";\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (field.deprecated) continue;\n      auto camel_name = Name(field);\n      if (camel_name == struct_def.name) {\n        camel_name += \"_\";\n      }\n      auto camel_name_short = Name(field);\n      // pre\n      switch (field.value.type.base_type) {\n        case BASE_TYPE_STRUCT: {\n          if (!field.value.type.struct_def->fixed) {\n            code += \"    var _\" + field.name + \" = _o.\" + camel_name +\n                    \" == null ? default(\" +\n                    GenOffsetType(*field.value.type.struct_def) +\n                    \") : \" + GenTypeGet(field.value.type) +\n                    \".Pack(builder, _o.\" + camel_name + \");\\n\";\n          } else if (struct_def.fixed && struct_has_create) {\n            std::vector<FieldArrayLength> array_lengths;\n            FieldArrayLength tmp_array_length = {\n                field.name,\n                field.value.type.fixed_length,\n            };\n            array_lengths.push_back(tmp_array_length);\n            GenStructPackDecl_ObjectAPI(*field.value.type.struct_def, code_ptr,\n                                        array_lengths);\n          }\n          break;\n        }\n        case BASE_TYPE_STRING: {\n          std::string create_string =\n              field.shared ? \"CreateSharedString\" : \"CreateString\";\n          code += \"    var _\" + field.name + \" = _o.\" + camel_name +\n                  \" == null ? default(StringOffset) : \"\n                  \"builder.\" +\n                  create_string + \"(_o.\" + camel_name + \");\\n\";\n          break;\n        }\n        case BASE_TYPE_VECTOR: {\n          if (field_has_create.find(&field) != field_has_create.end()) {\n            auto property_name = camel_name;\n            auto gen_for_loop = true;\n            std::string array_name = \"__\" + field.name;\n            std::string array_type = \"\";\n            std::string to_array = \"\";\n            switch (field.value.type.element) {\n              case BASE_TYPE_STRING: {\n                std::string create_string =\n                    field.shared ? \"CreateSharedString\" : \"CreateString\";\n                array_type = \"StringOffset\";\n                to_array += \"builder.\" + create_string + \"(_o.\" +\n                            property_name + \"[_j])\";\n                break;\n              }\n              case BASE_TYPE_STRUCT:\n                array_type = \"Offset<\" + GenTypeGet(field.value.type) + \">\";\n                to_array = GenTypeGet(field.value.type) + \".Pack(builder, _o.\" +\n                           property_name + \"[_j])\";\n                break;\n              case BASE_TYPE_UTYPE:\n                property_name = camel_name.substr(0, camel_name.size() - 4);\n                array_type = NamespacedName(*field.value.type.enum_def);\n                to_array = \"_o.\" + property_name + \"[_j].Type\";\n                break;\n              case BASE_TYPE_UNION:\n                array_type = \"int\";\n                to_array = NamespacedName(*field.value.type.enum_def) +\n                           \"Union.Pack(builder,  _o.\" + property_name + \"[_j])\";\n                break;\n              default:\n                gen_for_loop = false;\n                break;\n            }\n            code += \"    var _\" + field.name + \" = default(VectorOffset);\\n\";\n            code += \"    if (_o.\" + property_name + \" != null) {\\n\";\n            if (gen_for_loop) {\n              code += \"      var \" + array_name + \" = new \" + array_type +\n                      \"[_o.\" + property_name + \".Count];\\n\";\n              code += \"      for (var _j = 0; _j < \" + array_name +\n                      \".Length; ++_j) { \";\n              code += array_name + \"[_j] = \" + to_array + \"; }\\n\";\n            } else {\n              code += \"      var \" + array_name + \" = _o.\" + property_name +\n                      \".ToArray();\\n\";\n            }\n            code += \"      _\" + field.name + \" = Create\" + camel_name_short +\n                    \"Vector(builder, \" + array_name + \");\\n\";\n            code += \"    }\\n\";\n          } else {\n            auto pack_method =\n                field.value.type.struct_def == nullptr\n                    ? \"builder.Add\" + GenMethod(field.value.type.VectorType()) +\n                          \"(_o.\" + camel_name + \"[_j]);\"\n                    : GenTypeGet(field.value.type) + \".Pack(builder, _o.\" +\n                          camel_name + \"[_j]);\";\n            code += \"    var _\" + field.name + \" = default(VectorOffset);\\n\";\n            code += \"    if (_o.\" + camel_name + \" != null) {\\n\";\n            code += \"      Start\" + camel_name_short + \"Vector(builder, _o.\" +\n                    camel_name + \".Count);\\n\";\n            code += \"      for (var _j = _o.\" + camel_name +\n                    \".Count - 1; _j >= 0; --_j) { \" + pack_method + \" }\\n\";\n            code += \"      _\" + field.name + \" = builder.EndVector();\\n\";\n            code += \"    }\\n\";\n          }\n          break;\n        }\n        case BASE_TYPE_ARRAY: {\n          if (field.value.type.struct_def != nullptr) {\n            std::vector<FieldArrayLength> array_lengths;\n            FieldArrayLength tmp_array_length = {\n                field.name,\n                field.value.type.fixed_length,\n            };\n            array_lengths.push_back(tmp_array_length);\n            GenStructPackDecl_ObjectAPI(*field.value.type.struct_def, code_ptr,\n                                        array_lengths);\n          } else {\n            code += \"    var _\" + field.name + \" = _o.\" + camel_name + \";\\n\";\n          }\n          break;\n        }\n        case BASE_TYPE_UNION: {\n          code += \"    var _\" + field.name + \"_type = _o.\" + camel_name +\n                  \" == null ? \" + NamespacedName(*field.value.type.enum_def) +\n                  \".NONE : \" + \"_o.\" + camel_name + \".Type;\\n\";\n          code +=\n              \"    var _\" + field.name + \" = _o.\" + camel_name +\n              \" == null ? 0 : \" + GenTypeGet_ObjectAPI(field.value.type, opts) +\n              \".Pack(builder, _o.\" + camel_name + \");\\n\";\n          break;\n        }\n        default:\n          break;\n      }\n    }\n    if (struct_has_create) {\n      // Create\n      code += \"    return Create\" + struct_def.name + \"(\\n\";\n      code += \"      builder\";\n      for (auto it = struct_def.fields.vec.begin();\n           it != struct_def.fields.vec.end(); ++it) {\n        auto& field = **it;\n        if (field.deprecated) continue;\n        auto camel_name = Name(field);\n        if (camel_name == struct_def.name) {\n          camel_name += \"_\";\n        }\n        switch (field.value.type.base_type) {\n          case BASE_TYPE_STRUCT: {\n            if (struct_def.fixed) {\n              GenStructPackCall_ObjectAPI(*field.value.type.struct_def,\n                                          code_ptr,\n                                          \"      _\" + field.name + \"_\");\n            } else {\n              code += \",\\n\";\n              if (field.value.type.struct_def->fixed) {\n                if (opts.generate_object_based_api)\n                  code += \"      _o.\" + camel_name;\n                else\n                  code += \"      \" + GenTypeGet(field.value.type) +\n                          \".Pack(builder, _o.\" + camel_name + \")\";\n              } else {\n                code += \"      _\" + field.name;\n              }\n            }\n            break;\n          }\n          case BASE_TYPE_ARRAY: {\n            if (field.value.type.struct_def != nullptr) {\n              GenStructPackCall_ObjectAPI(*field.value.type.struct_def,\n                                          code_ptr,\n                                          \"      _\" + field.name + \"_\");\n            } else {\n              code += \",\\n\";\n              code += \"      _\" + field.name;\n            }\n            break;\n          }\n          case BASE_TYPE_UNION:\n            FLATBUFFERS_FALLTHROUGH();  // fall thru\n          case BASE_TYPE_UTYPE:\n            FLATBUFFERS_FALLTHROUGH();  // fall thru\n          case BASE_TYPE_STRING:\n            FLATBUFFERS_FALLTHROUGH();  // fall thru\n          case BASE_TYPE_VECTOR: {\n            code += \",\\n\";\n            code += \"      _\" + field.name;\n            break;\n          }\n          default:  // scalar\n            code += \",\\n\";\n            code += \"      _o.\" + camel_name;\n            break;\n        }\n      }\n      code += \");\\n\";\n    } else {\n      // Start, End\n      code += \"    Start\" + struct_def.name + \"(builder);\\n\";\n      for (auto it = struct_def.fields.vec.begin();\n           it != struct_def.fields.vec.end(); ++it) {\n        auto& field = **it;\n        if (field.deprecated) continue;\n        auto camel_name = Name(field);\n        switch (field.value.type.base_type) {\n          case BASE_TYPE_STRUCT: {\n            if (field.value.type.struct_def->fixed) {\n              code += \"    Add\" + camel_name + \"(builder, \" +\n                      GenTypeGet(field.value.type) + \".Pack(builder, _o.\" +\n                      camel_name + \"));\\n\";\n            } else {\n              code +=\n                  \"    Add\" + camel_name + \"(builder, _\" + field.name + \");\\n\";\n            }\n            break;\n          }\n          case BASE_TYPE_STRING:\n            FLATBUFFERS_FALLTHROUGH();  // fall thru\n          case BASE_TYPE_ARRAY:\n            FLATBUFFERS_FALLTHROUGH();  // fall thru\n          case BASE_TYPE_VECTOR: {\n            code +=\n                \"    Add\" + camel_name + \"(builder, _\" + field.name + \");\\n\";\n            break;\n          }\n          case BASE_TYPE_UTYPE:\n            break;\n          case BASE_TYPE_UNION: {\n            code += \"    Add\" + camel_name + \"Type(builder, _\" + field.name +\n                    \"_type);\\n\";\n            code +=\n                \"    Add\" + camel_name + \"(builder, _\" + field.name + \");\\n\";\n            break;\n          }\n          // scalar\n          default: {\n            code +=\n                \"    Add\" + camel_name + \"(builder, _o.\" + camel_name + \");\\n\";\n            break;\n          }\n        }\n      }\n      code += \"    return End\" + struct_def.name + \"(builder);\\n\";\n    }\n    code += \"  }\\n\";\n  }\n\n  void GenStructPackDecl_ObjectAPI(\n      const StructDef& struct_def, std::string* code_ptr,\n      std::vector<FieldArrayLength>& array_lengths) const {\n    auto& code = *code_ptr;\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      auto is_array = IsArray(field.value.type);\n      const auto& field_type =\n          is_array ? field.value.type.VectorType() : field.value.type;\n      FieldArrayLength tmp_array_length = {\n          field.name,\n          field_type.fixed_length,\n      };\n      array_lengths.push_back(tmp_array_length);\n      if (field_type.struct_def != nullptr) {\n        GenStructPackDecl_ObjectAPI(*field_type.struct_def, code_ptr,\n                                    array_lengths);\n      } else {\n        std::vector<FieldArrayLength> array_only_lengths;\n        for (size_t i = 0; i < array_lengths.size(); ++i) {\n          if (array_lengths[i].length > 0) {\n            array_only_lengths.push_back(array_lengths[i]);\n          }\n        }\n        std::string name;\n        for (size_t i = 0; i < array_lengths.size(); ++i) {\n          name += \"_\" + array_lengths[i].name;\n        }\n        code += \"    var \" + name + \" = \";\n        if (array_only_lengths.size() > 0) {\n          code += \"new \" + GenTypeBasic(field_type) + \"[\";\n          for (size_t i = 0; i < array_only_lengths.size(); ++i) {\n            if (i != 0) {\n              code += \",\";\n            }\n            code += NumToString(array_only_lengths[i].length);\n          }\n          code += \"];\\n\";\n          code += \"    \";\n          // initialize array\n          for (size_t i = 0; i < array_only_lengths.size(); ++i) {\n            auto idx = \"idx\" + NumToString(i);\n            code += \"for (var \" + idx + \" = 0; \" + idx + \" < \" +\n                    NumToString(array_only_lengths[i].length) + \"; ++\" + idx +\n                    \") {\";\n          }\n          for (size_t i = 0; i < array_only_lengths.size(); ++i) {\n            auto idx = \"idx\" + NumToString(i);\n            if (i == 0) {\n              code += name + \"[\" + idx;\n            } else {\n              code += \",\" + idx;\n            }\n          }\n          code += \"] = _o\";\n          for (size_t i = 0, j = 0; i < array_lengths.size(); ++i) {\n            code += \".\" + ConvertCase(array_lengths[i].name, Case::kUpperCamel);\n            if (array_lengths[i].length <= 0) continue;\n            code += \"[idx\" + NumToString(j++) + \"]\";\n          }\n          code += \";\";\n          for (size_t i = 0; i < array_only_lengths.size(); ++i) {\n            code += \"}\";\n          }\n        } else {\n          code += \"_o\";\n          for (size_t i = 0; i < array_lengths.size(); ++i) {\n            code += \".\" + ConvertCase(array_lengths[i].name, Case::kUpperCamel);\n          }\n          code += \";\";\n        }\n        code += \"\\n\";\n      }\n      array_lengths.pop_back();\n    }\n  }\n\n  void GenStructPackCall_ObjectAPI(const StructDef& struct_def,\n                                   std::string* code_ptr,\n                                   std::string prefix) const {\n    auto& code = *code_ptr;\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      const auto& field_type = field.value.type;\n      if (field_type.struct_def != nullptr) {\n        GenStructPackCall_ObjectAPI(*field_type.struct_def, code_ptr,\n                                    prefix + field.name + \"_\");\n      } else {\n        code += \",\\n\";\n        code += prefix + field.name;\n      }\n    }\n  }\n\n  std::string GenTypeGet_ObjectAPI(flatbuffers::Type type,\n                                   const IDLOptions& opts) const {\n    auto type_name = GenTypeGet(type);\n    // Replace to ObjectBaseAPI Type Name\n    switch (type.base_type) {\n      case BASE_TYPE_STRUCT:\n        FLATBUFFERS_FALLTHROUGH();  // fall thru\n      case BASE_TYPE_ARRAY:\n        FLATBUFFERS_FALLTHROUGH();  // fall thru\n      case BASE_TYPE_VECTOR: {\n        if (type.struct_def != nullptr) {\n          auto type_name_length = type.struct_def->name.length();\n          auto new_type_name =\n              GenTypeName_ObjectAPI(type.struct_def->name, opts);\n          type_name.replace(type_name.length() - type_name_length,\n                            type_name_length, new_type_name);\n        } else if (type.element == BASE_TYPE_UNION) {\n          type_name = NamespacedName(*type.enum_def) + \"Union\";\n        }\n        break;\n      }\n\n      case BASE_TYPE_UNION: {\n        type_name = NamespacedName(*type.enum_def) + \"Union\";\n        break;\n      }\n      default:\n        break;\n    }\n\n    switch (type.base_type) {\n      case BASE_TYPE_ARRAY: {\n        type_name = type_name + \"[]\";\n        break;\n      }\n      case BASE_TYPE_VECTOR: {\n        type_name = \"List<\" + type_name + \">\";\n        break;\n      }\n      default:\n        break;\n    }\n    return type_name;\n  }\n\n  void GenStruct_ObjectAPI(StructDef& struct_def, std::string* code_ptr,\n                           const IDLOptions& opts) const {\n    auto& code = *code_ptr;\n    if (struct_def.attributes.Lookup(\"private\")) {\n      code += \"internal \";\n    } else {\n      code += \"public \";\n    }\n    if (struct_def.attributes.Lookup(\"csharp_partial\")) {\n      // generate a partial class for this C# struct/table\n      code += \"partial \";\n    }\n    auto class_name = GenTypeName_ObjectAPI(struct_def.name, opts);\n    code += \"class \" + class_name;\n    code += \"\\n{\\n\";\n    // Generate Properties\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (field.deprecated) continue;\n      if (field.value.type.base_type == BASE_TYPE_UTYPE) continue;\n      if (field.value.type.element == BASE_TYPE_UTYPE) continue;\n      auto type_name = GenTypeGet_ObjectAPI(field.value.type, opts);\n      if (field.IsScalarOptional()) type_name += \"?\";\n      auto camel_name = Name(field);\n      if (camel_name == struct_def.name) {\n        camel_name += \"_\";\n      }\n      if (opts.cs_gen_json_serializer) {\n        if (IsUnion(field.value.type)) {\n          auto utype_name = NamespacedName(*field.value.type.enum_def);\n          code +=\n              \"  [Newtonsoft.Json.JsonProperty(\\\"\" + field.name + \"_type\\\")]\\n\";\n          if (IsVector(field.value.type)) {\n            code += \"  private \" + utype_name + \"[] \" + camel_name + \"Type {\\n\";\n            code += \"    get {\\n\";\n            code += \"      if (this.\" + camel_name + \" == null) return null;\\n\";\n            code += \"      var _o = new \" + utype_name + \"[this.\" + camel_name +\n                    \".Count];\\n\";\n            code +=\n                \"      for (var _j = 0; _j < _o.Length; ++_j) { _o[_j] = \"\n                \"this.\" +\n                camel_name + \"[_j].Type; }\\n\";\n            code += \"      return _o;\\n\";\n            code += \"    }\\n\";\n            code += \"    set {\\n\";\n            code += \"      this.\" + camel_name + \" = new List<\" + utype_name +\n                    \"Union>();\\n\";\n            code += \"      for (var _j = 0; _j < value.Length; ++_j) {\\n\";\n            code += \"        var _o = new \" + utype_name + \"Union();\\n\";\n            code += \"        _o.Type = value[_j];\\n\";\n            code += \"        this.\" + camel_name + \".Add(_o);\\n\";\n            code += \"      }\\n\";\n            code += \"    }\\n\";\n            code += \"  }\\n\";\n          } else {\n            code += \"  private \" + utype_name + \" \" + camel_name + \"Type {\\n\";\n            code += \"    get {\\n\";\n            code += \"      return this.\" + camel_name + \" != null ? this.\" +\n                    camel_name + \".Type : \" + utype_name + \".NONE;\\n\";\n            code += \"    }\\n\";\n            code += \"    set {\\n\";\n            code += \"      this.\" + camel_name + \" = new \" + utype_name +\n                    \"Union();\\n\";\n            code += \"      this.\" + camel_name + \".Type = value;\\n\";\n            code += \"    }\\n\";\n            code += \"  }\\n\";\n          }\n        }\n        code += \"  [Newtonsoft.Json.JsonProperty(\\\"\" + field.name + \"\\\")]\\n\";\n        if (IsUnion(field.value.type)) {\n          auto union_name =\n              (IsVector(field.value.type))\n                  ? GenTypeGet_ObjectAPI(field.value.type.VectorType(), opts)\n                  : type_name;\n          code += \"  [Newtonsoft.Json.JsonConverter(typeof(\" + union_name +\n                  \"_JsonConverter))]\\n\";\n        }\n        if (field.attributes.Lookup(\"hash\")) {\n          code += \"  [Newtonsoft.Json.JsonIgnore()]\\n\";\n        }\n      }\n      code += \"  public \" + type_name + \" \" + camel_name + \" { get; set; }\\n\";\n    }\n    // Generate Constructor\n    code += \"\\n\";\n    code += \"  public \" + class_name + \"() {\\n\";\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (field.deprecated) continue;\n      if (field.value.type.base_type == BASE_TYPE_UTYPE) continue;\n      if (field.value.type.element == BASE_TYPE_UTYPE) continue;\n      auto camel_name = Name(field);\n      if (camel_name == struct_def.name) {\n        camel_name += \"_\";\n      }\n      code += \"    this.\" + camel_name + \" = \";\n      auto type_name = GenTypeGet_ObjectAPI(field.value.type, opts);\n      if (IsScalar(field.value.type.base_type)) {\n        code += GenDefaultValue(field) + \";\\n\";\n      } else {\n        switch (field.value.type.base_type) {\n          case BASE_TYPE_STRUCT: {\n            if (IsStruct(field.value.type)) {\n              code += \"new \" + type_name + \"();\\n\";\n            } else {\n              code += \"null;\\n\";\n            }\n            break;\n          }\n          case BASE_TYPE_ARRAY: {\n            code += \"new \" + type_name.substr(0, type_name.length() - 1) +\n                    NumToString(field.value.type.fixed_length) + \"];\\n\";\n            break;\n          }\n          default: {\n            code += \"null;\\n\";\n            break;\n          }\n        }\n      }\n    }\n    code += \"  }\\n\";\n    // Generate Serialization\n    if (opts.cs_gen_json_serializer &&\n        parser_.root_struct_def_ == &struct_def) {\n      code += \"\\n\";\n      code += \"  public static \" + class_name +\n              \" DeserializeFromJson(string jsonText) {\\n\";\n      code += \"    return Newtonsoft.Json.JsonConvert.DeserializeObject<\" +\n              class_name + \">(jsonText);\\n\";\n      code += \"  }\\n\";\n      code += \"  public string SerializeToJson() {\\n\";\n      code +=\n          \"    return Newtonsoft.Json.JsonConvert.SerializeObject(this, \"\n          \"Newtonsoft.Json.Formatting.Indented);\\n\";\n      code += \"  }\\n\";\n    }\n    if (parser_.root_struct_def_ == &struct_def) {\n      code += \"  public static \" + class_name +\n              \" DeserializeFromBinary(byte[] fbBuffer) {\\n\";\n      code += \"    return \" + struct_def.name + \".GetRootAs\" + struct_def.name +\n              \"(new ByteBuffer(fbBuffer)).UnPack();\\n\";\n      code += \"  }\\n\";\n      code += \"  public byte[] SerializeToBinary() {\\n\";\n      code += \"    var fbb = new FlatBufferBuilder(0x10000);\\n\";\n      code += \"    \" + struct_def.name + \".Finish\" + struct_def.name +\n              \"Buffer(fbb, \" + struct_def.name + \".Pack(fbb, this));\\n\";\n      code += \"    return fbb.DataBuffer.ToSizedArray();\\n\";\n      code += \"  }\\n\";\n    }\n    code += \"}\\n\\n\";\n  }\n\n  // This tracks the current namespace used to determine if a type need to be\n  // prefixed by its namespace\n  const Namespace* cur_name_space_;\n};\n}  // namespace csharp\n\nstatic bool GenerateCSharp(const Parser& parser, const std::string& path,\n                           const std::string& file_name) {\n  csharp::CSharpGenerator generator(parser, path, file_name);\n  return generator.generate();\n}\n\nnamespace {\n\nclass CSharpCodeGenerator : public CodeGenerator {\n public:\n  Status GenerateCode(const Parser& parser, const std::string& path,\n                      const std::string& filename) override {\n    if (!GenerateCSharp(parser, path, filename)) {\n      return Status::ERROR;\n    }\n    return Status::OK;\n  }\n\n  Status GenerateCode(const uint8_t*, int64_t, const CodeGenOptions&) override {\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateMakeRule(const Parser& parser, const std::string& path,\n                          const std::string& filename,\n                          std::string& output) override {\n    output = JavaCSharpMakeRule(false, parser, path, filename);\n    return Status::OK;\n  }\n\n  Status GenerateGrpcCode(const Parser& parser, const std::string& path,\n                          const std::string& filename) override {\n    (void)parser;\n    (void)path;\n    (void)filename;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateRootFile(const Parser& parser,\n                          const std::string& path) override {\n    (void)parser;\n    (void)path;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  bool IsSchemaOnly() const override { return true; }\n\n  bool SupportsBfbsGeneration() const override { return false; }\n\n  bool SupportsRootFileGeneration() const override { return false; }\n\n  IDLOptions::Language Language() const override { return IDLOptions::kCSharp; }\n\n  std::string LanguageName() const override { return \"CSharp\"; }\n};\n}  // namespace\n\nstd::unique_ptr<CodeGenerator> NewCSharpCodeGenerator() {\n  return std::unique_ptr<CSharpCodeGenerator>(new CSharpCodeGenerator());\n}\n\n}  // namespace flatbuffers\n"
  },
  {
    "path": "src/idl_gen_csharp.h",
    "content": "/*\n * Copyright 2023 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_IDL_GEN_CSHARP_H_\n#define FLATBUFFERS_IDL_GEN_CSHARP_H_\n\n#include \"flatbuffers/code_generator.h\"\n\nnamespace flatbuffers {\n\n// Constructs a new CSharp code generator.\nstd::unique_ptr<CodeGenerator> NewCSharpCodeGenerator();\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_IDL_GEN_CSHARP_H_\n"
  },
  {
    "path": "src/idl_gen_dart.cpp",
    "content": "/*\n * Copyright 2018 Dan Field\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// independent from idl_parser, since this code is not needed for most clients\n#include \"idl_gen_dart.h\"\n\n#include <cassert>\n#include <cmath>\n\n#include \"flatbuffers/code_generators.h\"\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/idl.h\"\n#include \"flatbuffers/util.h\"\n#include \"idl_namer.h\"\n\nnamespace flatbuffers {\n\nnamespace dart {\n\nnamespace {\n\nstatic Namer::Config DartDefaultConfig() {\n  return {/*types=*/Case::kUpperCamel,\n          /*constants=*/Case::kScreamingSnake,\n          /*methods=*/Case::kLowerCamel,\n          /*functions=*/Case::kUnknown,  // unused.\n          /*fields=*/Case::kLowerCamel,\n          /*variables=*/Case::kLowerCamel,\n          /*variants=*/Case::kKeep,\n          /*enum_variant_seperator=*/\".\",\n          /*escape_keywords=*/Namer::Config::Escape::AfterConvertingCase,\n          /*namespaces=*/Case::kSnake2,\n          /*namespace_seperator=*/\".\",\n          /*object_prefix=*/\"\",\n          /*object_suffix=*/\"T\",\n          /*keyword_prefix=*/\"$\",\n          /*keyword_suffix=*/\"\",\n          /*keywords_casing=*/Namer::Config::KeywordsCasing::CaseSensitive,\n          /*filenames=*/Case::kKeep,\n          /*directories=*/Case::kKeep,\n          /*output_path=*/\"\",\n          /*filename_suffix=*/\"_generated\",\n          /*filename_extension=*/\".dart\"};\n}\n\nstatic std::set<std::string> DartKeywords() {\n  // see https://www.dartlang.org/guides/language/language-tour#keywords\n  // yield*, async*, and sync* shouldn't be proble\n  return {\n      \"abstract\",  \"else\",       \"import\",    \"show\",    \"as\",\n      \"enum\",      \"in\",         \"static\",    \"assert\",  \"export\",\n      \"interface\", \"super\",      \"async\",     \"extends\", \"is\",\n      \"switch\",    \"await\",      \"extension\", \"late\",    \"sync\",\n      \"break\",     \"external\",   \"library\",   \"this\",    \"case\",\n      \"factory\",   \"mixin\",      \"throw\",     \"catch\",   \"false\",\n      \"new\",       \"true\",       \"class\",     \"final\",   \"null\",\n      \"try\",       \"const\",      \"finally\",   \"on\",      \"typedef\",\n      \"continue\",  \"for\",        \"operator\",  \"var\",     \"covariant\",\n      \"Function\",  \"part\",       \"void\",      \"default\", \"get\",\n      \"required\",  \"while\",      \"deferred\",  \"hide\",    \"rethrow\",\n      \"with\",      \"do\",         \"if\",        \"return\",  \"yield\",\n      \"dynamic\",   \"implements\", \"set\",\n  };\n}\n}  // namespace\n\nconst std::string _kFb = \"fb\";\n\n// Iterate through all definitions we haven't generate code for (enums, structs,\n// and tables) and output them to a single file.\nclass DartGenerator : public BaseGenerator {\n public:\n  typedef std::map<std::string, std::string> namespace_code_map;\n\n  DartGenerator(const Parser& parser, const std::string& path,\n                const std::string& file_name)\n      : BaseGenerator(parser, path, file_name, \"\", \".\", \"dart\"),\n        namer_(WithFlagOptions(DartDefaultConfig(), parser.opts, path),\n               DartKeywords()) {}\n\n  template <typename T>\n  void import_generator(const std::string& current_namespace,\n                        const std::vector<T*>& definitions,\n                        const std::string& included,\n                        std::set<std::string>& imports) {\n    for (const auto& item : definitions) {\n      if (item->file == included) {\n        std::string component = namer_.Namespace(*item->defined_namespace);\n        std::string filebase =\n            flatbuffers::StripPath(flatbuffers::StripExtension(item->file));\n        std::string filename =\n            namer_.File(filebase + (component.empty() ? \"\" : \"_\" + component));\n\n        std::string rename_namespace =\n            component == current_namespace ? \"\" : component;\n        imports.emplace(\n            \"import './\" + filename + \"'\" +\n            (rename_namespace.empty()\n                 ? \";\\n\"\n                 : \" as \" + ImportAliasName(rename_namespace) + \";\\n\"));\n      }\n    }\n  }\n\n  // Iterate through all definitions we haven't generate code for (enums,\n  // structs, and tables) and output them to a single file.\n  bool generate() {\n    std::string code;\n    namespace_code_map namespace_code;\n    GenerateEnums(namespace_code);\n    GenerateStructs(namespace_code);\n\n    for (auto kv = namespace_code.begin(); kv != namespace_code.end(); ++kv) {\n      code.clear();\n      code = code + \"// \" + FlatBuffersGeneratedWarning() + \"\\n\";\n      code = code +\n             \"// ignore_for_file: unused_import, unused_field, unused_element, \"\n             \"unused_local_variable, constant_identifier_names\\n\\n\";\n\n      if (!kv->first.empty()) {\n        code += \"library \" + kv->first + \";\\n\\n\";\n      }\n\n      code += \"import 'dart:typed_data' show Uint8List;\\n\";\n      code += \"import 'package:flat_buffers/flat_buffers.dart' as \" + _kFb +\n              \";\\n\\n\";\n\n      for (auto kv2 = namespace_code.begin(); kv2 != namespace_code.end();\n           ++kv2) {\n        if (kv2->first != kv->first) {\n          code += \"import './\" + Filename(kv2->first, /*path=*/false) +\n                  \"' as \" + ImportAliasName(kv2->first) + \";\\n\";\n        }\n      }\n\n      code += \"\\n\";\n      std::set<std::string> imports;\n      for (const auto& included_file : parser_.GetIncludedFiles()) {\n        if (included_file.filename == parser_.file_being_parsed_) continue;\n\n        import_generator(kv->first, parser_.structs_.vec,\n                         included_file.filename, imports);\n        import_generator(kv->first, parser_.enums_.vec, included_file.filename,\n                         imports);\n      }\n\n      for (const auto& import_code : imports) {\n        code += import_code;\n      }\n\n      code += \"\\n\";\n      code += kv->second;\n\n      if (!parser_.opts.file_saver->SaveFile(Filename(kv->first).c_str(), code,\n                                             false)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  std::string Filename(const std::string& suffix, bool path = true) const {\n    return (path ? path_ : \"\") +\n           namer_.File(file_name_ + (suffix.empty() ? \"\" : \"_\" + suffix));\n  }\n\n private:\n  static std::string ImportAliasName(const std::string& ns) {\n    std::string ret;\n    ret.assign(ns);\n    size_t pos = ret.find('.');\n    while (pos != std::string::npos) {\n      ret.replace(pos, 1, \"_\");\n      pos = ret.find('.', pos + 1);\n    }\n\n    return ret;\n  }\n\n  void GenerateEnums(namespace_code_map& namespace_code) {\n    for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end();\n         ++it) {\n      auto& enum_def = **it;\n      GenEnum(enum_def, namespace_code);\n    }\n  }\n\n  void GenerateStructs(namespace_code_map& namespace_code) {\n    for (auto it = parser_.structs_.vec.begin();\n         it != parser_.structs_.vec.end(); ++it) {\n      auto& struct_def = **it;\n      GenStruct(struct_def, namespace_code);\n    }\n  }\n\n  // Generate a documentation comment, if available.\n  static void GenDocComment(const std::vector<std::string>& dc,\n                            const char* indent, std::string& code) {\n    for (auto it = dc.begin(); it != dc.end(); ++it) {\n      if (indent) code += indent;\n      code += \"/// \" + *it + \"\\n\";\n    }\n  }\n\n  // Generate an enum declaration and an enum string lookup table.\n  void GenEnum(EnumDef& enum_def, namespace_code_map& namespace_code) {\n    if (enum_def.generated) return;\n    std::string& code =\n        namespace_code[namer_.Namespace(*enum_def.defined_namespace)];\n    GenDocComment(enum_def.doc_comment, \"\", code);\n\n    const std::string enum_type =\n        namer_.Type(enum_def) + (enum_def.is_union ? \"TypeId\" : \"\");\n    const bool is_bit_flags =\n        enum_def.attributes.Lookup(\"bit_flags\") != nullptr;\n\n    // The flatbuffer schema language allows bit flag enums to potentially have\n    // a default value of zero, even if it's not a valid enum value...\n    const bool auto_default = is_bit_flags && !enum_def.FindByValue(\"0\");\n\n    code += \"enum \" + enum_type + \" {\\n\";\n    for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {\n      auto& ev = **it;\n      const auto enum_var = namer_.Variant(ev);\n      if (it != enum_def.Vals().begin()) code += \",\\n\";\n      code += \"  \" + enum_var + \"(\" + enum_def.ToString(ev) + \")\";\n    }\n    if (auto_default) {\n      code += \",\\n  _default(0)\";\n    }\n    code += \";\\n\\n\";\n\n    code += \"  final int value;\\n\";\n    code += \"  const \" + enum_type + \"(this.value);\\n\\n\";\n    code += \"  factory \" + enum_type + \".fromValue(int value) {\\n\";\n    code += \"    switch (value) {\\n\";\n    for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {\n      auto& ev = **it;\n      const auto enum_var = namer_.Variant(ev);\n      code += \"      case \" + enum_def.ToString(ev) + \":\";\n      code += \" return \" + enum_type + \".\" + enum_var + \";\\n\";\n    }\n    if (auto_default) {\n      code += \"      case 0: return \" + enum_type + \"._default;\\n\";\n    }\n    code += \"      default: throw StateError(\";\n    code += \"'Invalid value $value for bit flag enum');\\n\";\n    code += \"    }\\n\";\n    code += \"  }\\n\\n\";\n\n    code += \"  static \" + enum_type + \"? _createOrNull(int? value) =>\\n\";\n    code +=\n        \"      value == null ? null : \" + enum_type + \".fromValue(value);\\n\\n\";\n\n    // This is meaningless for bit_flags, however, note that unlike \"regular\"\n    // dart enums this enum can still have holes.\n    if (!is_bit_flags) {\n      code += \"  static const int minValue = \" +\n              enum_def.ToString(*enum_def.MinValue()) + \";\\n\";\n      code += \"  static const int maxValue = \" +\n              enum_def.ToString(*enum_def.MaxValue()) + \";\\n\";\n    }\n\n    code += \"  static const \" + _kFb + \".Reader<\" + enum_type + \"> reader = _\" +\n            enum_type + \"Reader();\\n\";\n    code += \"}\\n\\n\";\n\n    GenEnumReader(enum_def, enum_type, code);\n  }\n\n  void GenEnumReader(EnumDef& enum_def, const std::string& enum_type,\n                     std::string& code) {\n    code += \"class _\" + enum_type + \"Reader extends \" + _kFb + \".Reader<\" +\n            enum_type + \"> {\\n\";\n    code += \"  const _\" + enum_type + \"Reader();\\n\\n\";\n    code += \"  @override\\n\";\n    code += \"  int get size => \" + EnumSize(enum_def.underlying_type) + \";\\n\\n\";\n    code += \"  @override\\n\";\n    code += \"  \" + enum_type + \" read(\" + _kFb +\n            \".BufferContext bc, int offset) =>\\n\";\n    code += \"      \" + enum_type + \".fromValue(const \" + _kFb + \".\" +\n            GenType(enum_def.underlying_type) + \"Reader().read(bc, offset));\\n\";\n    code += \"}\\n\\n\";\n  }\n\n  std::string GenType(const Type& type) {\n    switch (type.base_type) {\n      case BASE_TYPE_BOOL:\n        return \"Bool\";\n      case BASE_TYPE_CHAR:\n        return \"Int8\";\n      case BASE_TYPE_UTYPE:\n      case BASE_TYPE_UCHAR:\n        return \"Uint8\";\n      case BASE_TYPE_SHORT:\n        return \"Int16\";\n      case BASE_TYPE_USHORT:\n        return \"Uint16\";\n      case BASE_TYPE_INT:\n        return \"Int32\";\n      case BASE_TYPE_UINT:\n        return \"Uint32\";\n      case BASE_TYPE_LONG:\n        return \"Int64\";\n      case BASE_TYPE_ULONG:\n        return \"Uint64\";\n      case BASE_TYPE_FLOAT:\n        return \"Float32\";\n      case BASE_TYPE_DOUBLE:\n        return \"Float64\";\n      case BASE_TYPE_STRING:\n        return \"String\";\n      case BASE_TYPE_VECTOR:\n        return GenType(type.VectorType());\n      case BASE_TYPE_STRUCT:\n        return namer_.Type(*type.struct_def);\n      case BASE_TYPE_UNION:\n        return namer_.Type(*type.enum_def) + \"TypeId\";\n      default:\n        return \"Table\";\n    }\n  }\n\n  static std::string EnumSize(const Type& type) {\n    switch (type.base_type) {\n      case BASE_TYPE_BOOL:\n      case BASE_TYPE_CHAR:\n      case BASE_TYPE_UTYPE:\n      case BASE_TYPE_UCHAR:\n        return \"1\";\n      case BASE_TYPE_SHORT:\n      case BASE_TYPE_USHORT:\n        return \"2\";\n      case BASE_TYPE_INT:\n      case BASE_TYPE_UINT:\n      case BASE_TYPE_FLOAT:\n        return \"4\";\n      case BASE_TYPE_LONG:\n      case BASE_TYPE_ULONG:\n      case BASE_TYPE_DOUBLE:\n        return \"8\";\n      default:\n        return \"1\";\n    }\n  }\n\n  std::string GenReaderTypeName(const Type& type, Namespace* current_namespace,\n                                const FieldDef& def,\n                                bool parent_is_vector = false, bool lazy = true,\n                                bool constConstruct = true) {\n    std::string prefix = (constConstruct ? \"const \" : \"\") + _kFb;\n    if (type.base_type == BASE_TYPE_BOOL) {\n      return prefix + \".BoolReader()\";\n    } else if (IsVector(type)) {\n      if (!type.VectorType().enum_def) {\n        if (type.VectorType().base_type == BASE_TYPE_CHAR) {\n          return prefix + \".Int8ListReader(\" + (lazy ? \")\" : \"lazy: false)\");\n        }\n        if (type.VectorType().base_type == BASE_TYPE_UCHAR) {\n          return prefix + \".Uint8ListReader(\" + (lazy ? \")\" : \"lazy: false)\");\n        }\n      }\n      return prefix + \".ListReader<\" +\n             GenDartTypeName(type.VectorType(), current_namespace, def) + \">(\" +\n             GenReaderTypeName(type.VectorType(), current_namespace, def, true,\n                               true, false) +\n             (lazy ? \")\" : \", lazy: false)\");\n    } else if (IsString(type)) {\n      return prefix + \".StringReader()\";\n    }\n    if (IsScalar(type.base_type)) {\n      if (type.enum_def && parent_is_vector) {\n        return GenDartTypeName(type, current_namespace, def) + \".reader\";\n      }\n      return prefix + \".\" + GenType(type) + \"Reader()\";\n    } else {\n      return GenDartTypeName(type, current_namespace, def) + \".reader\";\n    }\n  }\n\n  std::string GenDartTypeName(const Type& type, Namespace* current_namespace,\n                              const FieldDef& def,\n                              std::string struct_type_suffix = \"\") {\n    if (type.enum_def) {\n      if (type.enum_def->is_union && type.base_type != BASE_TYPE_UNION) {\n        return namer_.Type(*type.enum_def) + \"TypeId\";\n      } else if (type.enum_def->is_union) {\n        return \"dynamic\";\n      } else if (type.base_type != BASE_TYPE_VECTOR) {\n        const std::string cur_namespace = namer_.Namespace(*current_namespace);\n        std::string enum_namespace =\n            namer_.Namespace(*type.enum_def->defined_namespace);\n        std::string typeName = namer_.Type(*type.enum_def);\n        if (enum_namespace != \"\" && enum_namespace != cur_namespace) {\n          typeName = enum_namespace + \".\" + typeName;\n        }\n        return typeName;\n      }\n    }\n\n    switch (type.base_type) {\n      case BASE_TYPE_BOOL:\n        return \"bool\";\n      case BASE_TYPE_LONG:\n      case BASE_TYPE_ULONG:\n      case BASE_TYPE_INT:\n      case BASE_TYPE_UINT:\n      case BASE_TYPE_SHORT:\n      case BASE_TYPE_USHORT:\n      case BASE_TYPE_CHAR:\n      case BASE_TYPE_UCHAR:\n        return \"int\";\n      case BASE_TYPE_FLOAT:\n      case BASE_TYPE_DOUBLE:\n        return \"double\";\n      case BASE_TYPE_STRING:\n        return \"String\";\n      case BASE_TYPE_STRUCT:\n        return MaybeWrapNamespace(\n            namer_.Type(*type.struct_def) + struct_type_suffix,\n            current_namespace, def);\n      case BASE_TYPE_VECTOR:\n        return \"List<\" +\n               GenDartTypeName(type.VectorType(), current_namespace, def,\n                               struct_type_suffix) +\n               \">\";\n      default:\n        assert(0);\n        return \"dynamic\";\n    }\n  }\n\n  std::string GenDartTypeName(const Type& type, Namespace* current_namespace,\n                              const FieldDef& def, bool nullable,\n                              std::string struct_type_suffix) {\n    std::string typeName =\n        GenDartTypeName(type, current_namespace, def, struct_type_suffix);\n    if (nullable && typeName != \"dynamic\") typeName += \"?\";\n    return typeName;\n  }\n\n  std::string MaybeWrapNamespace(const std::string& type_name,\n                                 Namespace* current_ns,\n                                 const FieldDef& field) const {\n    const std::string current_namespace = namer_.Namespace(*current_ns);\n    const std::string field_namespace =\n        field.value.type.struct_def\n            ? namer_.Namespace(*field.value.type.struct_def->defined_namespace)\n        : field.value.type.enum_def\n            ? namer_.Namespace(*field.value.type.enum_def->defined_namespace)\n            : \"\";\n\n    if (field_namespace != \"\" && field_namespace != current_namespace) {\n      return ImportAliasName(field_namespace) + \".\" + type_name;\n    } else {\n      return type_name;\n    }\n  }\n\n  // Generate an accessor struct with constructor for a flatbuffers struct.\n  void GenStruct(const StructDef& struct_def,\n                 namespace_code_map& namespace_code) {\n    if (struct_def.generated) return;\n\n    std::string& code =\n        namespace_code[namer_.Namespace(*struct_def.defined_namespace)];\n\n    const auto& struct_type = namer_.Type(struct_def);\n\n    // Emit constructor\n\n    GenDocComment(struct_def.doc_comment, \"\", code);\n\n    auto reader_name = \"_\" + struct_type + \"Reader\";\n    auto builder_name = struct_type + \"Builder\";\n    auto object_builder_name = struct_type + \"ObjectBuilder\";\n\n    std::string reader_code, builder_code;\n\n    code += \"class \" + struct_type + \" {\\n\";\n\n    code += \"  \" + struct_type + \"._(this._bc, this._bcOffset);\\n\";\n    if (!struct_def.fixed) {\n      code += \"  factory \" + struct_type + \"(List<int> bytes) {\\n\";\n      code +=\n          \"    final rootRef = \" + _kFb + \".BufferContext.fromBytes(bytes);\\n\";\n      code += \"    return reader.read(rootRef, 0);\\n\";\n      code += \"  }\\n\";\n    }\n\n    code += \"\\n\";\n    code += \"  static const \" + _kFb + \".Reader<\" + struct_type +\n            \"> reader = \" + reader_name + \"();\\n\\n\";\n\n    code += \"  final \" + _kFb + \".BufferContext _bc;\\n\";\n    code += \"  final int _bcOffset;\\n\\n\";\n\n    std::vector<std::pair<int, FieldDef*>> non_deprecated_fields;\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      FieldDef& field = **it;\n      if (field.deprecated) continue;\n      auto offset = static_cast<int>(it - struct_def.fields.vec.begin());\n      non_deprecated_fields.push_back(std::make_pair(offset, &field));\n    }\n\n    GenImplementationGetters(struct_def, non_deprecated_fields, code);\n\n    if (parser_.opts.generate_object_based_api) {\n      code +=\n          \"\\n\" + GenStructObjectAPIUnpack(struct_def, non_deprecated_fields);\n\n      code += \"\\n  static int pack(fb.Builder fbBuilder, \" +\n              namer_.ObjectType(struct_def) + \"? object) {\\n\";\n      code += \"    if (object == null) return 0;\\n\";\n      code += \"    return object.pack(fbBuilder);\\n\";\n      code += \"  }\\n\";\n    }\n\n    code += \"}\\n\\n\";\n\n    if (parser_.opts.generate_object_based_api) {\n      code += GenStructObjectAPI(struct_def, non_deprecated_fields);\n    }\n\n    GenReader(struct_def, reader_name, reader_code);\n    GenBuilder(struct_def, non_deprecated_fields, builder_name, builder_code);\n    GenObjectBuilder(struct_def, non_deprecated_fields, object_builder_name,\n                     builder_code);\n\n    code += reader_code;\n    code += builder_code;\n  }\n\n  // Generate an accessor struct with constructor for a flatbuffers struct.\n  std::string GenStructObjectAPI(\n      const StructDef& struct_def,\n      const std::vector<std::pair<int, FieldDef*>>& non_deprecated_fields) {\n    std::string code;\n    GenDocComment(struct_def.doc_comment, \"\", code);\n\n    std::string object_type = namer_.ObjectType(struct_def);\n    code += \"class \" + object_type + \" implements \" + _kFb + \".Packable {\\n\";\n\n    std::string constructor_args;\n    for (auto it = non_deprecated_fields.begin();\n         it != non_deprecated_fields.end(); ++it) {\n      const FieldDef& field = *it->second;\n\n      const std::string field_name = namer_.Field(field);\n      const std::string defaultValue = getDefaultValue(field.value);\n      const std::string type_name =\n          GenDartTypeName(field.value.type, struct_def.defined_namespace, field,\n                          defaultValue.empty() && !struct_def.fixed, \"T\");\n\n      GenDocComment(field.doc_comment, \"  \", code);\n      code += \"  \" + type_name + \" \" + field_name + \";\\n\";\n\n      if (!constructor_args.empty()) constructor_args += \",\\n\";\n      constructor_args += \"      \";\n      constructor_args += (struct_def.fixed ? \"required \" : \"\");\n      constructor_args += \"this.\" + field_name;\n      if (!struct_def.fixed && !defaultValue.empty()) {\n        if (IsEnum(field.value.type)) {\n          auto& enum_def = *field.value.type.enum_def;\n          if (auto val = enum_def.FindByValue(defaultValue)) {\n            constructor_args += \" = \" + namer_.EnumVariant(enum_def, *val);\n          } else {\n            constructor_args += \" = \" + namer_.Type(enum_def) + \"._default\";\n          }\n        } else {\n          constructor_args += \" = \" + defaultValue;\n        }\n      }\n    }\n\n    if (!constructor_args.empty()) {\n      code += \"\\n  \" + object_type + \"({\\n\" + constructor_args + \"});\\n\\n\";\n    }\n\n    code += GenStructObjectAPIPack(struct_def, non_deprecated_fields);\n    code += \"\\n\";\n    code += GenToString(object_type, non_deprecated_fields);\n\n    code += \"}\\n\\n\";\n    return code;\n  }\n\n  // Generate function `StructNameT unpack()`\n  std::string GenStructObjectAPIUnpack(\n      const StructDef& struct_def,\n      const std::vector<std::pair<int, FieldDef*>>& non_deprecated_fields) {\n    std::string constructor_args;\n    for (auto it = non_deprecated_fields.begin();\n         it != non_deprecated_fields.end(); ++it) {\n      const FieldDef& field = *it->second;\n\n      const std::string field_name = namer_.Field(field);\n      if (!constructor_args.empty()) constructor_args += \",\\n\";\n      constructor_args += \"      \" + field_name + \": \";\n\n      const Type& type = field.value.type;\n      std::string defaultValue = getDefaultValue(field.value);\n      bool isNullable = defaultValue.empty() && !struct_def.fixed;\n      std::string nullableValueAccessOperator = isNullable ? \"?\" : \"\";\n      if (type.base_type == BASE_TYPE_STRUCT ||\n          type.base_type == BASE_TYPE_UNION) {\n        constructor_args +=\n            field_name + nullableValueAccessOperator + \".unpack()\";\n      } else if (type.base_type == BASE_TYPE_VECTOR) {\n        constructor_args += field_name + nullableValueAccessOperator;\n        if (type.VectorType().base_type == BASE_TYPE_STRUCT) {\n          constructor_args += \".map((e) => e.unpack())\";\n        }\n        constructor_args += \".toList()\";\n      } else {\n        constructor_args += field_name;\n      }\n    }\n\n    const std::string object_type = namer_.ObjectType(struct_def);\n    std::string code = \"  \" + object_type + \" unpack() => \" + object_type + \"(\";\n    if (!constructor_args.empty()) code += \"\\n\" + constructor_args;\n    code += \");\\n\";\n    return code;\n  }\n\n  // Generate function `StructNameT pack()`\n  std::string GenStructObjectAPIPack(\n      const StructDef& struct_def,\n      const std::vector<std::pair<int, FieldDef*>>& non_deprecated_fields) {\n    std::string code;\n\n    code += \"  @override\\n\";\n    code += \"  int pack(fb.Builder fbBuilder) {\\n\";\n    code += GenObjectBuilderImplementation(struct_def, non_deprecated_fields,\n                                           false, true);\n    code += \"  }\\n\";\n    return code;\n  }\n\n  std::string NamespaceAliasFromUnionType(Namespace* root_namespace,\n                                          const Type& type) {\n    const std::vector<std::string> qualified_name_parts =\n        type.struct_def->defined_namespace->components;\n    if (std::equal(root_namespace->components.begin(),\n                   root_namespace->components.end(),\n                   qualified_name_parts.begin())) {\n      return namer_.Type(*type.struct_def);\n    }\n\n    std::string ns;\n\n    for (auto it = qualified_name_parts.begin();\n         it != qualified_name_parts.end(); ++it) {\n      auto& part = *it;\n\n      for (size_t i = 0; i < part.length(); i++) {\n        if (i && !isdigit(part[i]) && part[i] == CharToUpper(part[i])) {\n          ns += \"_\";\n          ns += CharToLower(part[i]);\n        } else {\n          ns += CharToLower(part[i]);\n        }\n      }\n      if (it != qualified_name_parts.end() - 1) {\n        ns += \"_\";\n      }\n    }\n\n    return ns + \".\" + namer_.Type(*type.struct_def);\n  }\n\n  void GenImplementationGetters(\n      const StructDef& struct_def,\n      const std::vector<std::pair<int, FieldDef*>>& non_deprecated_fields,\n      std::string& code) {\n    for (auto it = non_deprecated_fields.begin();\n         it != non_deprecated_fields.end(); ++it) {\n      const FieldDef& field = *it->second;\n\n      const std::string field_name = namer_.Field(field);\n      const std::string defaultValue = getDefaultValue(field.value);\n      const bool isNullable = defaultValue.empty() && !struct_def.fixed;\n      const std::string type_name =\n          GenDartTypeName(field.value.type, struct_def.defined_namespace, field,\n                          isNullable, \"\");\n\n      GenDocComment(field.doc_comment, \"  \", code);\n\n      code += \"  \" + type_name + \" get \" + field_name;\n      if (field.value.type.base_type == BASE_TYPE_UNION) {\n        code += \" {\\n\";\n        code += \"    switch (\" + field_name + \"Type?.value) {\\n\";\n        const auto& enum_def = *field.value.type.enum_def;\n        for (auto en_it = enum_def.Vals().begin() + 1;\n             en_it != enum_def.Vals().end(); ++en_it) {\n          const auto& ev = **en_it;\n          const auto enum_name = NamespaceAliasFromUnionType(\n              enum_def.defined_namespace, ev.union_type);\n          code += \"      case \" + enum_def.ToString(ev) + \": return \" +\n                  enum_name + \".reader.vTableGetNullable(_bc, _bcOffset, \" +\n                  NumToString(field.value.offset) + \");\\n\";\n        }\n        code += \"      default: return null;\\n\";\n        code += \"    }\\n\";\n        code += \"  }\\n\";\n      } else {\n        code += \" => \";\n        if (field.value.type.enum_def &&\n            field.value.type.base_type != BASE_TYPE_VECTOR) {\n          code += GenDartTypeName(field.value.type,\n                                  struct_def.defined_namespace, field) +\n                  (isNullable ? \"._createOrNull(\" : \".fromValue(\");\n        }\n\n        code += GenReaderTypeName(field.value.type,\n                                  struct_def.defined_namespace, field);\n        if (struct_def.fixed) {\n          code +=\n              \".read(_bc, _bcOffset + \" + NumToString(field.value.offset) + \")\";\n        } else {\n          code += \".vTableGet\";\n          std::string offset = NumToString(field.value.offset);\n          if (isNullable) {\n            code += \"Nullable(_bc, _bcOffset, \" + offset + \")\";\n          } else {\n            code += \"(_bc, _bcOffset, \" + offset + \", \" + defaultValue + \")\";\n          }\n        }\n        if (field.value.type.enum_def &&\n            field.value.type.base_type != BASE_TYPE_VECTOR) {\n          code += \")\";\n        }\n        code += \";\\n\";\n      }\n    }\n\n    code += \"\\n\";\n    code += GenToString(namer_.Type(struct_def), non_deprecated_fields);\n  }\n\n  std::string GenToString(\n      const std::string& object_name,\n      const std::vector<std::pair<int, FieldDef*>>& non_deprecated_fields) {\n    std::string code;\n    code += \"  @override\\n\";\n    code += \"  String toString() {\\n\";\n    code += \"    return '\" + object_name + \"{\";\n    for (auto it = non_deprecated_fields.begin();\n         it != non_deprecated_fields.end(); ++it) {\n      const std::string field = namer_.Field(*it->second);\n      // We need to escape the fact that some fields have $ in the name which is\n      // also used in symbol/string substitution.\n      std::string escaped_field;\n      for (size_t i = 0; i < field.size(); i++) {\n        if (field[i] == '$') escaped_field.push_back('\\\\');\n        escaped_field.push_back(field[i]);\n      }\n      code += escaped_field + \": ${\" + field + \"}\";\n      if (it != non_deprecated_fields.end() - 1) {\n        code += \", \";\n      }\n    }\n    code += \"}';\\n\";\n    code += \"  }\\n\";\n    return code;\n  }\n\n  std::string getDefaultValue(const Value& value) const {\n    if (!value.constant.empty() && value.constant != \"0\") {\n      if (IsBool(value.type.base_type)) {\n        return \"true\";\n      }\n      if (IsScalar(value.type.base_type)) {\n        if (StringIsFlatbufferNan(value.constant)) {\n          return \"double.nan\";\n        } else if (StringIsFlatbufferPositiveInfinity(value.constant)) {\n          return \"double.infinity\";\n        } else if (StringIsFlatbufferNegativeInfinity(value.constant)) {\n          return \"double.negativeInfinity\";\n        }\n      }\n      return value.constant;\n    } else if (IsBool(value.type.base_type)) {\n      return \"false\";\n    } else if (IsScalar(value.type.base_type) && !IsUnion(value.type)) {\n      return \"0\";\n    } else {\n      return \"\";\n    }\n  }\n\n  void GenReader(const StructDef& struct_def, const std::string& reader_name,\n                 std::string& code) {\n    const auto struct_type = namer_.Type(struct_def);\n\n    code += \"class \" + reader_name + \" extends \" + _kFb;\n    if (struct_def.fixed) {\n      code += \".StructReader<\";\n    } else {\n      code += \".TableReader<\";\n    }\n    code += struct_type + \"> {\\n\";\n    code += \"  const \" + reader_name + \"();\\n\\n\";\n\n    if (struct_def.fixed) {\n      code += \"  @override\\n\";\n      code += \"  int get size => \" + NumToString(struct_def.bytesize) + \";\\n\\n\";\n    }\n    code += \"  @override\\n\";\n    code += \"  \" + struct_type +\n            \" createObject(fb.BufferContext bc, int offset) => \\n    \" +\n            struct_type + \"._(bc, offset);\\n\";\n    code += \"}\\n\\n\";\n  }\n\n  void GenBuilder(\n      const StructDef& struct_def,\n      const std::vector<std::pair<int, FieldDef*>>& non_deprecated_fields,\n      const std::string& builder_name, std::string& code) {\n    if (non_deprecated_fields.size() == 0) {\n      return;\n    }\n\n    code += \"class \" + builder_name + \" {\\n\";\n    code += \"  \" + builder_name + \"(this.fbBuilder);\\n\\n\";\n    code += \"  final \" + _kFb + \".Builder fbBuilder;\\n\\n\";\n\n    if (struct_def.fixed) {\n      StructBuilderBody(struct_def, non_deprecated_fields, code);\n    } else {\n      TableBuilderBody(struct_def, non_deprecated_fields, code);\n    }\n\n    code += \"}\\n\\n\";\n  }\n\n  void StructBuilderBody(\n      const StructDef& struct_def,\n      const std::vector<std::pair<int, FieldDef*>>& non_deprecated_fields,\n      std::string& code) {\n    code += \"  int finish(\";\n    for (auto it = non_deprecated_fields.begin();\n         it != non_deprecated_fields.end(); ++it) {\n      const FieldDef& field = *it->second;\n      const std::string field_name = namer_.Field(field);\n\n      if (IsStruct(field.value.type)) {\n        code += \"fb.StructBuilder\";\n      } else {\n        code += GenDartTypeName(field.value.type, struct_def.defined_namespace,\n                                field);\n      }\n      code += \" \" + field_name;\n      if (it != non_deprecated_fields.end() - 1) {\n        code += \", \";\n      }\n    }\n    code += \") {\\n\";\n\n    for (auto it = non_deprecated_fields.rbegin();\n         it != non_deprecated_fields.rend(); ++it) {\n      const FieldDef& field = *it->second;\n      const std::string field_name = namer_.Field(field);\n\n      if (field.padding) {\n        code += \"    fbBuilder.pad(\" + NumToString(field.padding) + \");\\n\";\n      }\n\n      if (IsStruct(field.value.type)) {\n        code += \"    \" + field_name + \"();\\n\";\n      } else {\n        code += \"    fbBuilder.put\" + GenType(field.value.type) + \"(\";\n        code += field_name;\n        if (field.value.type.enum_def) {\n          code += \".value\";\n        }\n        code += \");\\n\";\n      }\n    }\n    code += \"    return fbBuilder.offset;\\n\";\n    code += \"  }\\n\\n\";\n  }\n\n  void TableBuilderBody(\n      const StructDef& struct_def,\n      const std::vector<std::pair<int, FieldDef*>>& non_deprecated_fields,\n      std::string& code) {\n    code += \"  void begin() {\\n\";\n    code += \"    fbBuilder.startTable(\" +\n            NumToString(struct_def.fields.vec.size()) + \");\\n\";\n    code += \"  }\\n\\n\";\n\n    for (auto it = non_deprecated_fields.begin();\n         it != non_deprecated_fields.end(); ++it) {\n      const auto& field = *it->second;\n      const auto offset = it->first;\n      const std::string add_field = namer_.Method(\"add\", field);\n      const std::string field_var = namer_.Variable(field);\n\n      if (IsScalar(field.value.type.base_type)) {\n        code += \"  int \" + add_field + \"(\";\n        code += GenDartTypeName(field.value.type, struct_def.defined_namespace,\n                                field);\n        code += \"? \" + field_var + \") {\\n\";\n        code += \"    fbBuilder.add\" + GenType(field.value.type) + \"(\" +\n                NumToString(offset) + \", \";\n        code += field_var;\n        if (field.value.type.enum_def) {\n          code += \"?.value\";\n        }\n        code += \");\\n\";\n      } else if (IsStruct(field.value.type)) {\n        code += \"  int \" + add_field + \"(int offset) {\\n\";\n        code +=\n            \"    fbBuilder.addStruct(\" + NumToString(offset) + \", offset);\\n\";\n      } else {\n        code += \"  int \" + add_field + \"Offset(int? offset) {\\n\";\n        code +=\n            \"    fbBuilder.addOffset(\" + NumToString(offset) + \", offset);\\n\";\n      }\n      code += \"    return fbBuilder.offset;\\n\";\n      code += \"  }\\n\";\n    }\n\n    code += \"\\n\";\n    code += \"  int finish() {\\n\";\n    code += \"    return fbBuilder.endTable();\\n\";\n    code += \"  }\\n\";\n  }\n\n  void GenObjectBuilder(\n      const StructDef& struct_def,\n      const std::vector<std::pair<int, FieldDef*>>& non_deprecated_fields,\n      const std::string& builder_name, std::string& code) {\n    code += \"class \" + builder_name + \" extends \" + _kFb + \".ObjectBuilder {\\n\";\n    for (auto it = non_deprecated_fields.begin();\n         it != non_deprecated_fields.end(); ++it) {\n      const FieldDef& field = *it->second;\n\n      code += \"  final \" +\n              GenDartTypeName(field.value.type, struct_def.defined_namespace,\n                              field, !struct_def.fixed, \"ObjectBuilder\") +\n              \" _\" + namer_.Variable(field) + \";\\n\";\n    }\n    code += \"\\n\";\n    code += \"  \" + builder_name + \"(\";\n\n    if (non_deprecated_fields.size() != 0) {\n      code += \"{\\n\";\n      for (auto it = non_deprecated_fields.begin();\n           it != non_deprecated_fields.end(); ++it) {\n        const FieldDef& field = *it->second;\n\n        code += \"    \";\n        code += (struct_def.fixed ? \"required \" : \"\") +\n                GenDartTypeName(field.value.type, struct_def.defined_namespace,\n                                field, !struct_def.fixed, \"ObjectBuilder\") +\n                \" \" + namer_.Variable(field) + \",\\n\";\n      }\n      code += \"  })\\n\";\n      code += \"      : \";\n      for (auto it = non_deprecated_fields.begin();\n           it != non_deprecated_fields.end(); ++it) {\n        const FieldDef& field = *it->second;\n\n        code += \"_\" + namer_.Variable(field) + \" = \" + namer_.Variable(field);\n        if (it == non_deprecated_fields.end() - 1) {\n          code += \";\\n\\n\";\n        } else {\n          code += \",\\n        \";\n        }\n      }\n    } else {\n      code += \");\\n\\n\";\n    }\n\n    code += \"  /// Finish building, and store into the [fbBuilder].\\n\";\n    code += \"  @override\\n\";\n    code += \"  int finish(\" + _kFb + \".Builder fbBuilder) {\\n\";\n    code += GenObjectBuilderImplementation(struct_def, non_deprecated_fields);\n    code += \"  }\\n\\n\";\n\n    code += \"  /// Convenience method to serialize to byte list.\\n\";\n    code += \"  @override\\n\";\n    code += \"  Uint8List toBytes([String? fileIdentifier]) {\\n\";\n    code += \"    final fbBuilder = \" + _kFb +\n            \".Builder(deduplicateTables: false);\\n\";\n    code += \"    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\\n\";\n    code += \"    return fbBuilder.buffer;\\n\";\n    code += \"  }\\n\";\n    code += \"}\\n\";\n  }\n\n  std::string GenObjectBuilderImplementation(\n      const StructDef& struct_def,\n      const std::vector<std::pair<int, FieldDef*>>& non_deprecated_fields,\n      bool prependUnderscore = true, bool pack = false) {\n    std::string code;\n    for (auto it = non_deprecated_fields.begin();\n         it != non_deprecated_fields.end(); ++it) {\n      const FieldDef& field = *it->second;\n\n      if (IsScalar(field.value.type.base_type) || IsStruct(field.value.type))\n        continue;\n\n      std::string offset_name = namer_.Variable(field) + \"Offset\";\n      std::string field_name =\n          (prependUnderscore ? \"_\" : \"\") + namer_.Variable(field);\n      // custom handling for fixed-sized struct in pack()\n      if (pack && IsVector(field.value.type) &&\n          field.value.type.VectorType().base_type == BASE_TYPE_STRUCT &&\n          field.value.type.struct_def->fixed) {\n        code += \"    int? \" + offset_name + \";\\n\";\n        code += \"    if (\" + field_name + \" != null) {\\n\";\n        code += \"      for (var e in \" + field_name +\n                \"!.reversed) { e.pack(fbBuilder); }\\n\";\n        code += \"      \" + namer_.Variable(field) +\n                \"Offset = fbBuilder.endStructVector(\" + field_name +\n                \"!.length);\\n\";\n        code += \"    }\\n\";\n        continue;\n      }\n\n      code += \"    final int? \" + offset_name;\n      if (IsVector(field.value.type)) {\n        code += \" = \" + field_name + \" == null ? null\\n\";\n        code += \"        : fbBuilder.writeList\";\n        switch (field.value.type.VectorType().base_type) {\n          case BASE_TYPE_STRING:\n            code +=\n                \"(\" + field_name + \"!.map(fbBuilder.writeString).toList());\\n\";\n            break;\n          case BASE_TYPE_STRUCT:\n            if (field.value.type.struct_def->fixed) {\n              code += \"OfStructs(\" + field_name + \"!);\\n\";\n            } else {\n              code += \"(\" + field_name + \"!.map((b) => b.\" +\n                      (pack ? \"pack\" : \"getOrCreateOffset\") +\n                      \"(fbBuilder)).toList());\\n\";\n            }\n            break;\n          default:\n            code +=\n                GenType(field.value.type.VectorType()) + \"(\" + field_name + \"!\";\n            if (field.value.type.enum_def) {\n              code += \".map((f) => f.value).toList()\";\n            }\n            code += \");\\n\";\n        }\n      } else if (IsString(field.value.type)) {\n        code += \" = \" + field_name + \" == null ? null\\n\";\n        code += \"        : fbBuilder.writeString(\" + field_name + \"!);\\n\";\n      } else {\n        code += \" = \" + field_name + \"?.\" +\n                (pack ? \"pack\" : \"getOrCreateOffset\") + \"(fbBuilder);\\n\";\n      }\n    }\n\n    if (struct_def.fixed) {\n      code += StructObjectBuilderBody(non_deprecated_fields, prependUnderscore,\n                                      pack);\n    } else {\n      code += TableObjectBuilderBody(struct_def, non_deprecated_fields,\n                                     prependUnderscore, pack);\n    }\n    return code;\n  }\n\n  std::string StructObjectBuilderBody(\n      const std::vector<std::pair<int, FieldDef*>>& non_deprecated_fields,\n      bool prependUnderscore = true, bool pack = false) {\n    std::string code;\n\n    for (auto it = non_deprecated_fields.rbegin();\n         it != non_deprecated_fields.rend(); ++it) {\n      const FieldDef& field = *it->second;\n      const std::string field_name = namer_.Field(field);\n\n      if (field.padding) {\n        code += \"    fbBuilder.pad(\" + NumToString(field.padding) + \");\\n\";\n      }\n\n      if (IsStruct(field.value.type)) {\n        code += \"    \";\n        if (prependUnderscore) {\n          code += \"_\";\n        }\n        code += field_name + (pack ? \".pack\" : \".finish\") + \"(fbBuilder);\\n\";\n      } else {\n        code += \"    fbBuilder.put\" + GenType(field.value.type) + \"(\";\n        if (prependUnderscore) {\n          code += \"_\";\n        }\n        code += field_name;\n        if (field.value.type.enum_def) {\n          code += \".value\";\n        }\n        code += \");\\n\";\n      }\n    }\n\n    code += \"    return fbBuilder.offset;\\n\";\n    return code;\n  }\n\n  std::string TableObjectBuilderBody(\n      const StructDef& struct_def,\n      const std::vector<std::pair<int, FieldDef*>>& non_deprecated_fields,\n      bool prependUnderscore = true, bool pack = false) {\n    std::string code;\n    code += \"    fbBuilder.startTable(\" +\n            NumToString(struct_def.fields.vec.size()) + \");\\n\";\n\n    for (auto it = non_deprecated_fields.begin();\n         it != non_deprecated_fields.end(); ++it) {\n      const FieldDef& field = *it->second;\n      auto offset = it->first;\n\n      std::string field_var =\n          (prependUnderscore ? \"_\" : \"\") + namer_.Variable(field);\n\n      if (IsScalar(field.value.type.base_type)) {\n        code += \"    fbBuilder.add\" + GenType(field.value.type) + \"(\" +\n                NumToString(offset) + \", \" + field_var;\n        if (field.value.type.enum_def) {\n          bool isNullable = getDefaultValue(field.value).empty();\n          code += (isNullable || !pack) ? \"?.value\" : \".value\";\n        }\n        code += \");\\n\";\n      } else if (IsStruct(field.value.type)) {\n        code += \"    if (\" + field_var + \" != null) {\\n\";\n        code += \"      fbBuilder.addStruct(\" + NumToString(offset) + \", \" +\n                field_var + (pack ? \"!.pack\" : \"!.finish\") + \"(fbBuilder));\\n\";\n        code += \"    }\\n\";\n      } else {\n        code += \"    fbBuilder.addOffset(\" + NumToString(offset) + \", \" +\n                namer_.Variable(field) + \"Offset);\\n\";\n      }\n    }\n    code += \"    return fbBuilder.endTable();\\n\";\n    return code;\n  }\n\n  const IdlNamer namer_;\n};\n}  // namespace dart\n\nstatic bool GenerateDart(const Parser& parser, const std::string& path,\n                         const std::string& file_name) {\n  dart::DartGenerator generator(parser, path, file_name);\n  return generator.generate();\n}\n\nstatic std::string DartMakeRule(const Parser& parser, const std::string& path,\n                                const std::string& file_name) {\n  auto filebase =\n      flatbuffers::StripPath(flatbuffers::StripExtension(file_name));\n  dart::DartGenerator generator(parser, path, file_name);\n  auto make_rule = generator.Filename(\"\") + \": \";\n\n  auto included_files = parser.GetIncludedFilesRecursive(file_name);\n  for (auto it = included_files.begin(); it != included_files.end(); ++it) {\n    make_rule += \" \" + *it;\n  }\n  return make_rule;\n}\n\nnamespace {\n\nclass DartCodeGenerator : public CodeGenerator {\n public:\n  Status GenerateCode(const Parser& parser, const std::string& path,\n                      const std::string& filename) override {\n    if (!GenerateDart(parser, path, filename)) {\n      return Status::ERROR;\n    }\n    return Status::OK;\n  }\n\n  Status GenerateCode(const uint8_t*, int64_t, const CodeGenOptions&) override {\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateMakeRule(const Parser& parser, const std::string& path,\n                          const std::string& filename,\n                          std::string& output) override {\n    output = DartMakeRule(parser, path, filename);\n    return Status::OK;\n  }\n\n  Status GenerateGrpcCode(const Parser& parser, const std::string& path,\n                          const std::string& filename) override {\n    (void)parser;\n    (void)path;\n    (void)filename;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateRootFile(const Parser& parser,\n                          const std::string& path) override {\n    (void)parser;\n    (void)path;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  bool IsSchemaOnly() const override { return true; }\n\n  bool SupportsBfbsGeneration() const override { return false; }\n\n  bool SupportsRootFileGeneration() const override { return false; }\n\n  IDLOptions::Language Language() const override { return IDLOptions::kDart; }\n\n  std::string LanguageName() const override { return \"Dart\"; }\n};\n}  // namespace\n\nstd::unique_ptr<CodeGenerator> NewDartCodeGenerator() {\n  return std::unique_ptr<DartCodeGenerator>(new DartCodeGenerator());\n}\n\n}  // namespace flatbuffers\n"
  },
  {
    "path": "src/idl_gen_dart.h",
    "content": "/*\n * Copyright 2023 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_IDL_GEN_DART_H_\n#define FLATBUFFERS_IDL_GEN_DART_H_\n\n#include \"flatbuffers/code_generator.h\"\n\nnamespace flatbuffers {\n\n// Constructs a new Dart code generator.\nstd::unique_ptr<CodeGenerator> NewDartCodeGenerator();\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_IDL_GEN_DART_H_\n"
  },
  {
    "path": "src/idl_gen_fbs.cpp",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// independent from idl_parser, since this code is not needed for most clients\n#include \"idl_gen_fbs.h\"\n\n#include <unordered_map>\n#include <utility>\n#include <vector>\n\n#include \"flatbuffers/code_generator.h\"\n#include \"flatbuffers/code_generators.h\"\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/idl.h\"\n#include \"flatbuffers/util.h\"\n\nnamespace flatbuffers {\nnamespace {\n\nstatic std::string GenType(const Type& type, bool underlying = false) {\n  switch (type.base_type) {\n    case BASE_TYPE_STRUCT:\n      return type.struct_def->defined_namespace->GetFullyQualifiedName(\n          type.struct_def->name);\n    case BASE_TYPE_VECTOR:\n      return \"[\" + GenType(type.VectorType()) + \"]\";\n    default:\n      if (type.enum_def && !underlying) {\n        return type.enum_def->defined_namespace->GetFullyQualifiedName(\n            type.enum_def->name);\n      } else {\n        return TypeName(type.base_type);\n      }\n  }\n}\n\nstatic bool HasFieldWithId(const std::vector<FieldDef*>& fields) {\n  static const std::string ID = \"id\";\n\n  for (const auto* field : fields) {\n    const auto* id_attribute = field->attributes.Lookup(ID);\n    if (id_attribute != nullptr && !id_attribute->constant.empty()) {\n      return true;\n    }\n  }\n  return false;\n}\n\nstatic bool HasNonPositiveFieldId(const std::vector<FieldDef*>& fields) {\n  static const std::string ID = \"id\";\n\n  for (const auto* field : fields) {\n    const auto* id_attribute = field->attributes.Lookup(ID);\n    if (id_attribute != nullptr && !id_attribute->constant.empty()) {\n      voffset_t proto_id = 0;\n      bool done = StringToNumber(id_attribute->constant.c_str(), &proto_id);\n      if (!done) {\n        return true;\n      }\n    }\n  }\n  return false;\n}\n\nstatic bool HasFieldIdFromReservedIds(\n    const std::vector<FieldDef*>& fields,\n    const std::vector<voffset_t>& reserved_ids) {\n  static const std::string ID = \"id\";\n\n  for (const auto* field : fields) {\n    const auto* id_attribute = field->attributes.Lookup(ID);\n    if (id_attribute != nullptr && !id_attribute->constant.empty()) {\n      voffset_t proto_id = 0;\n      bool done = StringToNumber(id_attribute->constant.c_str(), &proto_id);\n      if (!done) {\n        return true;\n      }\n      auto id_it =\n          std::find(std::begin(reserved_ids), std::end(reserved_ids), proto_id);\n      if (id_it != reserved_ids.end()) {\n        return true;\n      }\n    }\n  }\n  return false;\n}\n\nstatic std::vector<voffset_t> ExtractProtobufIds(\n    const std::vector<FieldDef*>& fields) {\n  static const std::string ID = \"id\";\n  std::vector<voffset_t> used_proto_ids;\n  for (const auto* field : fields) {\n    const auto* id_attribute = field->attributes.Lookup(ID);\n    if (id_attribute != nullptr && !id_attribute->constant.empty()) {\n      voffset_t proto_id = 0;\n      bool done = StringToNumber(id_attribute->constant.c_str(), &proto_id);\n      if (done) {\n        used_proto_ids.push_back(proto_id);\n      }\n    }\n  }\n\n  return used_proto_ids;\n}\n\nstatic bool HasTwiceUsedId(const std::vector<FieldDef*>& fields) {\n  std::vector<voffset_t> used_proto_ids = ExtractProtobufIds(fields);\n  std::sort(std::begin(used_proto_ids), std::end(used_proto_ids));\n  for (auto it = std::next(std::begin(used_proto_ids));\n       it != std::end(used_proto_ids); it++) {\n    if (*it == *std::prev(it)) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nstatic bool HasGapInProtoId(const std::vector<FieldDef*>& fields) {\n  std::vector<voffset_t> used_proto_ids = ExtractProtobufIds(fields);\n  std::sort(std::begin(used_proto_ids), std::end(used_proto_ids));\n  for (auto it = std::next(std::begin(used_proto_ids));\n       it != std::end(used_proto_ids); it++) {\n    if (*it != *std::prev(it) + 1) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nstatic bool ProtobufIdSanityCheck(const StructDef& struct_def,\n                                  IDLOptions::ProtoIdGapAction gap_action,\n                                  bool no_log = false) {\n  const auto& fields = struct_def.fields.vec;\n  if (HasNonPositiveFieldId(fields)) {\n    // TODO: Use LogCompilerWarn\n    if (!no_log) {\n      fprintf(stderr, \"Field id in struct %s has a non positive number value\\n\",\n              struct_def.name.c_str());\n    }\n    return false;\n  }\n\n  if (HasTwiceUsedId(fields)) {\n    // TODO: Use LogCompilerWarn\n    if (!no_log) {\n      fprintf(stderr, \"Fields in struct %s have used an id twice\\n\",\n              struct_def.name.c_str());\n    }\n    return false;\n  }\n\n  if (HasFieldIdFromReservedIds(fields, struct_def.reserved_ids)) {\n    // TODO: Use LogCompilerWarn\n    if (!no_log) {\n      fprintf(stderr, \"Fields in struct %s use id from reserved ids\\n\",\n              struct_def.name.c_str());\n    }\n    return false;\n  }\n\n  if (gap_action != IDLOptions::ProtoIdGapAction::NO_OP) {\n    if (HasGapInProtoId(fields)) {\n      // TODO: Use LogCompilerWarn\n      if (!no_log) {\n        fprintf(stderr, \"Fields in struct %s have gap between ids\\n\",\n                struct_def.name.c_str());\n      }\n      if (gap_action == IDLOptions::ProtoIdGapAction::ERROR) {\n        return false;\n      }\n    }\n  }\n\n  return true;\n}\n\nstruct ProtobufToFbsIdMap {\n  using FieldName = std::string;\n  using FieldID = voffset_t;\n  using FieldNameToIdMap = std::unordered_map<FieldName, FieldID>;\n\n  FieldNameToIdMap field_to_id;\n  bool successful = false;\n};\n\nstatic ProtobufToFbsIdMap MapProtoIdsToFieldsId(\n    const StructDef& struct_def, IDLOptions::ProtoIdGapAction gap_action,\n    bool no_log) {\n  const auto& fields = struct_def.fields.vec;\n\n  if (!HasFieldWithId(fields)) {\n    ProtobufToFbsIdMap result;\n    result.successful = true;\n    return result;\n  }\n\n  if (!ProtobufIdSanityCheck(struct_def, gap_action, no_log)) {\n    return {};\n  }\n\n  static constexpr int UNION_ID = -1;\n  using ProtoIdFieldNamePair = std::pair<int, std::string>;\n  std::vector<ProtoIdFieldNamePair> proto_ids;\n\n  for (const auto* field : fields) {\n    const auto* id_attribute = field->attributes.Lookup(\"id\");\n    if (id_attribute != nullptr) {\n      // When we have union but do not use union flag to keep them\n      if (id_attribute->constant.empty() &&\n          field->value.type.base_type == BASE_TYPE_UNION) {\n        proto_ids.emplace_back(UNION_ID, field->name);\n      } else {\n        voffset_t proto_id = 0;\n        StringToNumber(id_attribute->constant.c_str(), &proto_id);\n        proto_ids.emplace_back(proto_id, field->name);\n      }\n    } else {\n      // TODO: Use LogCompilerWarn\n      if (!no_log) {\n        fprintf(stderr, \"Fields id in struct %s is missing\\n\",\n                struct_def.name.c_str());\n      }\n      return {};\n    }\n  }\n\n  std::sort(\n      std::begin(proto_ids), std::end(proto_ids),\n      [](const ProtoIdFieldNamePair& rhs, const ProtoIdFieldNamePair& lhs) {\n        return rhs.first < lhs.first;\n      });\n  struct ProtobufToFbsIdMap proto_to_fbs;\n\n  voffset_t id = 0;\n  for (const auto& element : proto_ids) {\n    if (element.first == UNION_ID) {\n      id++;\n    }\n    proto_to_fbs.field_to_id.emplace(element.second, id++);\n  }\n  proto_to_fbs.successful = true;\n  return proto_to_fbs;\n}\n\nstatic void GenNameSpace(const Namespace& name_space, std::string* _schema,\n                         const Namespace** last_namespace) {\n  if (*last_namespace == &name_space) return;\n  *last_namespace = &name_space;\n  auto& schema = *_schema;\n  schema += \"namespace \";\n  for (auto it = name_space.components.begin();\n       it != name_space.components.end(); ++it) {\n    if (it != name_space.components.begin()) schema += \".\";\n    schema += *it;\n  }\n  schema += \";\\n\\n\";\n}\n\n// Generate a flatbuffer schema from the Parser's internal representation.\nstatic std::string GenerateFBS(const Parser& parser,\n                               const std::string& file_name,\n                               bool no_log = false) {\n  // Proto namespaces may clash with table names, escape the ones that were\n  // generated from a table:\n  for (auto it = parser.namespaces_.begin(); it != parser.namespaces_.end();\n       ++it) {\n    auto& ns = **it;\n    for (size_t i = 0; i < ns.from_table; i++) {\n      ns.components[ns.components.size() - 1 - i] += \"_\";\n    }\n\n    if (parser.opts.proto_mode && !parser.opts.proto_namespace_suffix.empty()) {\n      // Since we know that all these namespaces come from a .proto, and all are\n      // being converted, we can simply apply this suffix to all of them.\n      ns.components.insert(ns.components.end() - ns.from_table,\n                           parser.opts.proto_namespace_suffix);\n    }\n  }\n\n  std::string schema;\n  schema += \"// Generated from \" + file_name + \".proto\\n\\n\";\n  if (parser.opts.include_dependence_headers) {\n    // clang-format off\n    int num_includes = 0;\n    for (auto it = parser.included_files_.begin();\n         it != parser.included_files_.end(); ++it) {\n      if (it->second.empty()) {\n        continue;\n}\n      std::string basename;\n      if(parser.opts.keep_prefix) {\n        basename = flatbuffers::StripExtension(it->second);\n      } else {\n        basename = flatbuffers::StripPath(\n                flatbuffers::StripExtension(it->second));\n      }\n      schema += \"include \\\"\" + basename + \".fbs\\\";\\n\";\n      num_includes++;\n    }\n    if (num_includes) schema += \"\\n\";\n    // clang-format on\n  }\n\n  // Generate code for all the enum declarations.\n  const Namespace* last_namespace = nullptr;\n  for (auto enum_def_it = parser.enums_.vec.begin();\n       enum_def_it != parser.enums_.vec.end(); ++enum_def_it) {\n    EnumDef& enum_def = **enum_def_it;\n    if (parser.opts.include_dependence_headers && enum_def.generated) {\n      continue;\n    }\n    GenNameSpace(*enum_def.defined_namespace, &schema, &last_namespace);\n    GenComment(enum_def.doc_comment, &schema, nullptr);\n    if (enum_def.is_union) {\n      schema += \"union \" + enum_def.name;\n    } else {\n      schema += \"enum \" + enum_def.name + \" : \";\n    }\n\n    schema += GenType(enum_def.underlying_type, true) + \" {\\n\";\n\n    for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {\n      auto& ev = **it;\n      GenComment(ev.doc_comment, &schema, nullptr, \"  \");\n      if (enum_def.is_union) {\n        schema += \"  \" + GenType(ev.union_type) + \",\\n\";\n      } else {\n        schema += \"  \" + ev.name + \" = \" + enum_def.ToString(ev) + \",\\n\";\n      }\n    }\n    schema += \"}\\n\\n\";\n  }\n  // Generate code for all structs/tables.\n  for (auto it = parser.structs_.vec.begin(); it != parser.structs_.vec.end();\n       ++it) {\n    StructDef& struct_def = **it;\n    const auto proto_fbs_ids = MapProtoIdsToFieldsId(\n        struct_def, parser.opts.proto_id_gap_action, no_log);\n    if (!proto_fbs_ids.successful) {\n      return {};\n    }\n\n    if (parser.opts.include_dependence_headers && struct_def.generated) {\n      continue;\n    }\n\n    GenNameSpace(*struct_def.defined_namespace, &schema, &last_namespace);\n    GenComment(struct_def.doc_comment, &schema, nullptr);\n    schema += \"table \" + struct_def.name + \" {\\n\";\n    for (auto field_it = struct_def.fields.vec.begin();\n         field_it != struct_def.fields.vec.end(); ++field_it) {\n      auto& field = **field_it;\n      if (field.value.type.base_type != BASE_TYPE_UTYPE) {\n        GenComment(field.doc_comment, &schema, nullptr, \"  \");\n        schema += \"  \" + field.name + \":\" + GenType(field.value.type);\n        if (field.value.constant != \"0\") {\n          if (IsString(field.value.type)) {\n            std::string escaped;\n            flatbuffers::EscapeString(field.value.constant.c_str(),\n                                      field.value.constant.length(), &escaped,\n                                      true, false);\n            schema += \" = \" + escaped;\n          } else {\n            schema += \" = \" + field.value.constant;\n          }\n        }\n        std::vector<std::string> attributes;\n        if (field.IsRequired()) attributes.push_back(\"required\");\n        if (field.key) attributes.push_back(\"key\");\n\n        if (parser.opts.keep_proto_id) {\n          auto it = proto_fbs_ids.field_to_id.find(field.name);\n          if (it != proto_fbs_ids.field_to_id.end()) {\n            attributes.push_back(\"id: \" + NumToString(it->second));\n          }  // If not found it means we do not have any ids\n        }\n\n        if (!attributes.empty()) {\n          schema += \" (\";\n          for (const auto& attribute : attributes) {\n            schema += attribute + \",\";\n          }\n          schema.pop_back();\n          schema += \")\";\n        }\n\n        schema += \";\\n\";\n      }\n    }\n    schema += \"}\\n\\n\";\n  }\n  return schema;\n}\n\nstatic bool GenerateFBS(const Parser& parser, const std::string& path,\n                        const std::string& file_name, bool no_log = false) {\n  const std::string fbs = GenerateFBS(parser, file_name, no_log);\n  if (fbs.empty()) {\n    return false;\n  }\n  // TODO: Use LogCompilerWarn\n  if (!no_log) {\n    fprintf(stderr,\n            \"When you use --proto, that you should check for conformity \"\n            \"yourself, using the existing --conform\");\n  }\n  return parser.opts.file_saver->SaveFile((path + file_name + \".fbs\").c_str(),\n                                          fbs, false);\n}\n\nclass FBSCodeGenerator : public CodeGenerator {\n public:\n  explicit FBSCodeGenerator(const bool no_log) : no_log_(no_log) {}\n\n  Status GenerateCode(const Parser& parser, const std::string& path,\n                      const std::string& filename) override {\n    if (!GenerateFBS(parser, path, filename, no_log_)) {\n      return Status::ERROR;\n    }\n    return Status::OK;\n  }\n\n  Status GenerateCodeString(const Parser& parser, const std::string& filename,\n                            std::string& output) override {\n    output = GenerateFBS(parser, filename, no_log_);\n    return Status::OK;\n  }\n\n  // Generate code from the provided `buffer` of given `length`. The buffer is a\n  // serialized reflection.fbs.\n  Status GenerateCode(const uint8_t*, int64_t, const CodeGenOptions&) override {\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateMakeRule(const Parser& parser, const std::string& path,\n                          const std::string& filename,\n                          std::string& output) override {\n    (void)parser;\n    (void)path;\n    (void)filename;\n    (void)output;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateGrpcCode(const Parser& parser, const std::string& path,\n                          const std::string& filename) override {\n    (void)parser;\n    (void)path;\n    (void)filename;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateRootFile(const Parser& parser,\n                          const std::string& path) override {\n    (void)parser;\n    (void)path;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  bool IsSchemaOnly() const override { return false; }\n\n  bool SupportsBfbsGeneration() const override { return false; }\n\n  bool SupportsRootFileGeneration() const override { return false; }\n\n  IDLOptions::Language Language() const override { return IDLOptions::kProto; }\n\n  std::string LanguageName() const override { return \"proto\"; }\n\n protected:\n  const bool no_log_;\n};\n\n}  // namespace\n\nstd::unique_ptr<CodeGenerator> NewFBSCodeGenerator(const bool no_log) {\n  return std::unique_ptr<FBSCodeGenerator>(new FBSCodeGenerator(no_log));\n}\n\n}  // namespace flatbuffers\n"
  },
  {
    "path": "src/idl_gen_fbs.h",
    "content": "/*\n * Copyright 2023 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_IDL_GEN_FBS_H_\n#define FLATBUFFERS_IDL_GEN_FBS_H_\n\n#include \"flatbuffers/code_generator.h\"\n\nnamespace flatbuffers {\n\nstd::unique_ptr<CodeGenerator> NewFBSCodeGenerator(bool no_log = false);\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_IDL_GEN_FBS_H_\n"
  },
  {
    "path": "src/idl_gen_go.cpp",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// independent from idl_parser, since this code is not needed for most clients\n\n#include \"idl_gen_go.h\"\n\n#include <algorithm>\n#include <cmath>\n#include <sstream>\n#include <string>\n\n#include \"flatbuffers/base.h\"\n#include \"flatbuffers/code_generators.h\"\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/idl.h\"\n#include \"flatbuffers/util.h\"\n#include \"idl_namer.h\"\n\n#ifdef _WIN32\n#include <direct.h>\n#define PATH_SEPARATOR \"\\\\\"\n#define mkdir(n, m) _mkdir(n)\n#else\n#include <sys/stat.h>\n#define PATH_SEPARATOR \"/\"\n#endif\n\nnamespace flatbuffers {\n\nnamespace go {\n\nnamespace {\n\n// see https://golang.org/ref/spec#Keywords\nstatic std::set<std::string> GoKeywords() {\n  return {\n      \"break\",    \"default\",     \"func\",   \"interface\", \"select\",\n      \"case\",     \"defer\",       \"go\",     \"map\",       \"struct\",\n      \"chan\",     \"else\",        \"goto\",   \"package\",   \"switch\",\n      \"const\",    \"fallthrough\", \"if\",     \"range\",     \"type\",\n      \"continue\", \"for\",         \"import\", \"return\",    \"var\",\n  };\n}\n\nstatic Namer::Config GoDefaultConfig() {\n  // Note that the functions with user defined types in the name use\n  // upper camel case for all but the user defined type itself, which is keep\n  // cased. Despite being a function, we interpret it as a Type.\n  return {/*types=*/Case::kKeep,\n          /*constants=*/Case::kUnknown,\n          /*methods=*/Case::kUpperCamel,\n          /*functions=*/Case::kUpperCamel,\n          /*fields=*/Case::kUpperCamel,\n          /*variables=*/Case::kLowerCamel,\n          /*variants=*/Case::kKeep,\n          /*enum_variant_seperator=*/\"\",  // I.e. Concatenate.\n          /*escape_keywords=*/Namer::Config::Escape::AfterConvertingCase,\n          /*namespaces=*/Case::kKeep,\n          /*namespace_seperator=*/\"__\",\n          /*object_prefix=*/\"\",\n          /*object_suffix=*/\"T\",\n          /*keyword_prefix=*/\"\",\n          /*keyword_suffix=*/\"_\",\n          /*keywords_casing=*/Namer::Config::KeywordsCasing::CaseSensitive,\n          /*filenames=*/Case::kKeep,\n          /*directories=*/Case::kKeep,\n          /*output_path=*/\"\",\n          /*filename_suffix=*/\"\",\n          /*filename_extension=*/\".go\"};\n}\n\n}  // namespace\n\nclass GoGenerator : public BaseGenerator {\n public:\n  GoGenerator(const Parser& parser, const std::string& path,\n              const std::string& file_name, const std::string& go_namespace)\n      : BaseGenerator(parser, path, file_name, \"\" /* not used*/,\n                      \"\" /* not used */, \"go\"),\n        cur_name_space_(nullptr),\n        namer_(WithFlagOptions(GoDefaultConfig(), parser.opts, path),\n               GoKeywords()) {\n    std::istringstream iss(go_namespace);\n    std::string component;\n    while (std::getline(iss, component, '.')) {\n      go_namespace_.components.push_back(component);\n    }\n  }\n\n  bool generate() {\n    std::string one_file_code;\n\n    if (!generateEnums(&one_file_code)) return false;\n    if (!generateStructs(&one_file_code)) return false;\n\n    if (parser_.opts.one_file) {\n      std::string code = \"\";\n      const bool is_enum = !parser_.enums_.vec.empty();\n      BeginFile(LastNamespacePart(go_namespace_), true, is_enum, &code);\n      code += one_file_code;\n      const std::string filename =\n          GeneratedFileName(path_, file_name_, parser_.opts);\n      return parser_.opts.file_saver->SaveFile(filename.c_str(), code, false);\n    }\n\n    return true;\n  }\n\n private:\n  bool generateEnums(std::string* one_file_code) {\n    bool needs_imports = false;\n    for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end();\n         ++it) {\n      if (!parser_.opts.one_file) {\n        needs_imports = false;\n        ResetImports();\n      }\n      auto& enum_def = **it;\n      std::string enumcode;\n      GenEnum(enum_def, &enumcode);\n      if (enum_def.is_union && parser_.opts.generate_object_based_api) {\n        GenNativeUnionCreator(enum_def, &enumcode);\n        needs_imports = true;\n      }\n      if (parser_.opts.one_file) {\n        *one_file_code += enumcode;\n      } else {\n        if (!SaveType(enum_def, enumcode, needs_imports, true)) return false;\n      }\n    }\n    return true;\n  }\n\n  void GenNativeUnionCreator(const EnumDef& enum_def, std::string* code_ptr) {\n    if (enum_def.generated) return;\n\n    GenNativeUnion(enum_def, code_ptr);\n    GenNativeUnionPack(enum_def, code_ptr);\n    GenNativeUnionUnPack(enum_def, code_ptr);\n  }\n\n  bool generateStructs(std::string* one_file_code) {\n    for (auto it = parser_.structs_.vec.begin();\n         it != parser_.structs_.vec.end(); ++it) {\n      if (!parser_.opts.one_file) {\n        ResetImports();\n      }\n      std::string declcode;\n      auto& struct_def = **it;\n      GenStruct(struct_def, &declcode);\n      if (parser_.opts.one_file) {\n        *one_file_code += declcode;\n      } else {\n        if (!SaveType(struct_def, declcode, true, false)) return false;\n      }\n    }\n    return true;\n  }\n\n  Namespace go_namespace_;\n  Namespace* cur_name_space_;\n  const IdlNamer namer_;\n\n  struct NamespacePtrLess {\n    bool operator()(const Definition* a, const Definition* b) const {\n      return *a->defined_namespace < *b->defined_namespace;\n    }\n  };\n  std::set<const Definition*, NamespacePtrLess> tracked_imported_namespaces_;\n  bool needs_math_import_ = false;\n  bool needs_bytes_import_ = false;\n\n  // Most field accessors need to retrieve and test the field offset first,\n  // this is the prefix code for that.\n  std::string OffsetPrefix(const FieldDef& field) {\n    return \"{\\n\\to := flatbuffers.UOffsetT(rcv._tab.Offset(\" +\n           NumToString(field.value.offset) + \"))\\n\\tif o != 0 {\\n\";\n  }\n\n  // Begin a class declaration.\n  void BeginClass(const StructDef& struct_def, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n\n    code += \"type \" + namer_.Type(struct_def) + \" struct {\\n\\t\";\n\n    // _ is reserved in flatbuffers field names, so no chance of name\n    // conflict:\n    code += \"_tab \";\n    code += struct_def.fixed ? \"flatbuffers.Struct\" : \"flatbuffers.Table\";\n    code += \"\\n}\\n\\n\";\n  }\n\n  // Construct the name of the type for this enum.\n  std::string GetEnumTypeName(const EnumDef& enum_def) {\n    return WrapInNameSpaceAndTrack(&enum_def, namer_.Type(enum_def));\n  }\n\n  // Create a type for the enum values.\n  void GenEnumType(const EnumDef& enum_def, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code += \"type \" + GetEnumTypeName(enum_def) + \" \";\n    code += GenTypeBasic(enum_def.underlying_type) + \"\\n\\n\";\n  }\n\n  // Begin enum code with a class declaration.\n  void BeginEnum(std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code += \"const (\\n\";\n  }\n\n  // A single enum member.\n  void EnumMember(const EnumDef& enum_def, const EnumVal& ev,\n                  size_t max_name_length, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code += \"\\t\";\n    code += namer_.EnumVariant(enum_def, ev);\n    code += \" \";\n    code += std::string(max_name_length - ev.name.length(), ' ');\n    code += GetEnumTypeName(enum_def);\n    code += \" = \";\n    code += enum_def.ToString(ev) + \"\\n\";\n  }\n\n  // End enum code.\n  void EndEnum(std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code += \")\\n\\n\";\n  }\n\n  // Begin enum name map.\n  void BeginEnumNames(const EnumDef& enum_def, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code += \"var EnumNames\";\n    code += enum_def.name;\n    code += \" = map[\" + GetEnumTypeName(enum_def) + \"]string{\\n\";\n  }\n\n  // A single enum name member.\n  void EnumNameMember(const EnumDef& enum_def, const EnumVal& ev,\n                      size_t max_name_length, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code += \"\\t\";\n    code += namer_.EnumVariant(enum_def, ev);\n    code += \": \";\n    code += std::string(max_name_length - ev.name.length(), ' ');\n    code += \"\\\"\";\n    code += ev.name;\n    code += \"\\\",\\n\";\n  }\n\n  // End enum name map.\n  void EndEnumNames(std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code += \"}\\n\\n\";\n  }\n\n  // Generate String() method on enum type.\n  void EnumStringer(const EnumDef& enum_def, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    const std::string enum_type = namer_.Type(enum_def);\n    code += \"func (v \" + enum_type + \") String() string {\\n\";\n    code += \"\\tif s, ok := EnumNames\" + enum_type + \"[v]; ok {\\n\";\n    code += \"\\t\\treturn s\\n\";\n    code += \"\\t}\\n\";\n    code += \"\\treturn \\\"\" + enum_def.name;\n    code += \"(\\\" + strconv.FormatInt(int64(v), 10) + \\\")\\\"\\n\";\n    code += \"}\\n\\n\";\n  }\n\n  // Begin enum value map.\n  void BeginEnumValues(const EnumDef& enum_def, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code += \"var EnumValues\";\n    code += namer_.Type(enum_def);\n    code += \" = map[string]\" + GetEnumTypeName(enum_def) + \"{\\n\";\n  }\n\n  // A single enum value member.\n  void EnumValueMember(const EnumDef& enum_def, const EnumVal& ev,\n                       size_t max_name_length, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code += \"\\t\\\"\";\n    code += ev.name;\n    code += \"\\\": \";\n    code += std::string(max_name_length - ev.name.length(), ' ');\n    code += namer_.EnumVariant(enum_def, ev);\n    code += \",\\n\";\n  }\n\n  // End enum value map.\n  void EndEnumValues(std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code += \"}\\n\\n\";\n  }\n\n  // Initialize a new struct or table from existing data.\n  void NewRootTypeFromBuffer(const StructDef& struct_def,\n                             std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    const std::string size_prefix[] = {\"\", \"SizePrefixed\"};\n    const std::string struct_type = namer_.Type(struct_def);\n\n    bool has_file_identifier = (parser_.root_struct_def_ == &struct_def) &&\n                               parser_.file_identifier_.length();\n\n    if (has_file_identifier) {\n      code += \"const \" + struct_type + \"Identifier = \\\"\" +\n              parser_.file_identifier_ + \"\\\"\\n\\n\";\n    }\n\n    for (int i = 0; i < 2; i++) {\n      code += \"func Get\" + size_prefix[i] + \"RootAs\" + struct_type;\n      code += \"(buf []byte, offset flatbuffers.UOffsetT) \";\n      code += \"*\" + struct_type + \"\";\n      code += \" {\\n\";\n      if (i == 0) {\n        code += \"\\tn := flatbuffers.GetUOffsetT(buf[offset:])\\n\";\n      } else {\n        code +=\n            \"\\tn := \"\n            \"flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])\\n\";\n      }\n      code += \"\\tx := &\" + struct_type + \"{}\\n\";\n      if (i == 0) {\n        code += \"\\tx.Init(buf, n+offset)\\n\";\n      } else {\n        code += \"\\tx.Init(buf, n+offset+flatbuffers.SizeUint32)\\n\";\n      }\n      code += \"\\treturn x\\n\";\n      code += \"}\\n\\n\";\n\n      code += \"func Finish\" + size_prefix[i] + struct_type +\n              \"Buffer(builder *flatbuffers.Builder, offset \"\n              \"flatbuffers.UOffsetT) {\\n\";\n      if (has_file_identifier) {\n        code += \"\\tidentifierBytes := []byte(\" + struct_type + \"Identifier)\\n\";\n        code += \"\\tbuilder.Finish\" + size_prefix[i] +\n                \"WithFileIdentifier(offset, identifierBytes)\\n\";\n      } else {\n        code += \"\\tbuilder.Finish\" + size_prefix[i] + \"(offset)\\n\";\n      }\n      code += \"}\\n\\n\";\n\n      if (has_file_identifier) {\n        code += \"func \" + size_prefix[i] + struct_type +\n                \"BufferHasIdentifier(buf []byte) bool {\\n\";\n        code += \"\\treturn flatbuffers.\" + size_prefix[i] +\n                \"BufferHasIdentifier(buf, \" + struct_type + \"Identifier)\\n\";\n        code += \"}\\n\\n\";\n      }\n    }\n  }\n\n  // Initialize an existing object with other data, to avoid an allocation.\n  void InitializeExisting(const StructDef& struct_def, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n\n    GenReceiver(struct_def, code_ptr);\n    code += \" Init(buf []byte, i flatbuffers.UOffsetT) \";\n    code += \"{\\n\";\n    code += \"\\trcv._tab.Bytes = buf\\n\";\n    code += \"\\trcv._tab.Pos = i\\n\";\n    code += \"}\\n\\n\";\n  }\n\n  // Implement the table accessor\n  void GenTableAccessor(const StructDef& struct_def, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n\n    GenReceiver(struct_def, code_ptr);\n    code += \" Table() flatbuffers.Table \";\n    code += \"{\\n\";\n\n    if (struct_def.fixed) {\n      code += \"\\treturn rcv._tab.Table\\n\";\n    } else {\n      code += \"\\treturn rcv._tab\\n\";\n    }\n    code += \"}\\n\\n\";\n  }\n\n  // Get the length of a vector.\n  void GetVectorLen(const StructDef& struct_def, const FieldDef& field,\n                    std::string* code_ptr) {\n    std::string& code = *code_ptr;\n\n    GenReceiver(struct_def, code_ptr);\n    code += \" \" + namer_.Function(field) + \"Length(\";\n    code += \") int \" + OffsetPrefix(field);\n    code += \"\\t\\treturn rcv._tab.VectorLen(o)\\n\\t}\\n\";\n    code += \"\\treturn 0\\n}\\n\\n\";\n  }\n\n  // Get a [ubyte] vector as a byte slice.\n  void GetUByteSlice(const StructDef& struct_def, const FieldDef& field,\n                     std::string* code_ptr) {\n    std::string& code = *code_ptr;\n\n    GenReceiver(struct_def, code_ptr);\n    code += \" \" + namer_.Function(field) + \"Bytes(\";\n    code += \") []byte \" + OffsetPrefix(field);\n    code += \"\\t\\treturn rcv._tab.ByteVector(o + rcv._tab.Pos)\\n\\t}\\n\";\n    code += \"\\treturn nil\\n}\\n\\n\";\n  }\n\n  // Get the value of a struct's scalar.\n  void GetScalarFieldOfStruct(const StructDef& struct_def,\n                              const FieldDef& field, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    std::string getter = GenGetter(field.value.type);\n    GenReceiver(struct_def, code_ptr);\n    code += \" \" + namer_.Function(field);\n    code += \"() \" + TypeName(field) + \" {\\n\";\n    code += \"\\treturn \" +\n            CastToEnum(field.value.type,\n                       getter + \"(rcv._tab.Pos + flatbuffers.UOffsetT(\" +\n                           NumToString(field.value.offset) + \"))\");\n    code += \"\\n}\\n\";\n  }\n\n  // Get the value of a table's scalar.\n  void GetScalarFieldOfTable(const StructDef& struct_def, const FieldDef& field,\n                             std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    std::string getter = GenGetter(field.value.type);\n    GenReceiver(struct_def, code_ptr);\n    code += \" \" + namer_.Function(field);\n    code += \"() \" + TypeName(field) + \" \";\n    code += OffsetPrefix(field);\n    if (field.IsScalarOptional()) {\n      code += \"\\t\\tv := \";\n    } else {\n      code += \"\\t\\treturn \";\n    }\n    code += CastToEnum(field.value.type, getter + \"(o + rcv._tab.Pos)\");\n    if (field.IsScalarOptional()) {\n      code += \"\\n\\t\\treturn &v\";\n    }\n    code += \"\\n\\t}\\n\";\n    code += \"\\treturn \" + GenConstant(field) + \"\\n\";\n    code += \"}\\n\\n\";\n  }\n\n  // Get a struct by initializing an existing struct.\n  // Specific to Struct.\n  void GetStructFieldOfStruct(const StructDef& struct_def,\n                              const FieldDef& field, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    GenReceiver(struct_def, code_ptr);\n    code += \" \" + namer_.Function(field);\n    code += \"(obj *\" + TypeName(field);\n    code += \") *\" + TypeName(field);\n    code += \" {\\n\";\n    code += \"\\tif obj == nil {\\n\";\n    code += \"\\t\\tobj = new(\" + TypeName(field) + \")\\n\";\n    code += \"\\t}\\n\";\n    code += \"\\tobj.Init(rcv._tab.Bytes, rcv._tab.Pos+\";\n    code += NumToString(field.value.offset) + \")\";\n    code += \"\\n\\treturn obj\\n\";\n    code += \"}\\n\";\n  }\n\n  // Get a struct by initializing an existing struct.\n  // Specific to Table.\n  void GetStructFieldOfTable(const StructDef& struct_def, const FieldDef& field,\n                             std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    GenReceiver(struct_def, code_ptr);\n    code += \" \" + namer_.Function(field);\n    code += \"(obj *\";\n    code += TypeName(field);\n    code += \") *\" + TypeName(field) + \" \" + OffsetPrefix(field);\n    if (field.value.type.struct_def->fixed) {\n      code += \"\\t\\tx := o + rcv._tab.Pos\\n\";\n    } else {\n      code += \"\\t\\tx := rcv._tab.Indirect(o + rcv._tab.Pos)\\n\";\n    }\n    code += \"\\t\\tif obj == nil {\\n\";\n    code += \"\\t\\t\\tobj = new(\" + TypeName(field) + \")\\n\";\n    code += \"\\t\\t}\\n\";\n    code += \"\\t\\tobj.Init(rcv._tab.Bytes, x)\\n\";\n    code += \"\\t\\treturn obj\\n\\t}\\n\\treturn nil\\n\";\n    code += \"}\\n\\n\";\n  }\n\n  // Get the value of a string.\n  void GetStringField(const StructDef& struct_def, const FieldDef& field,\n                      std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    GenReceiver(struct_def, code_ptr);\n    code += \" \" + namer_.Function(field);\n    code += \"() \" + TypeName(field) + \" \";\n    code += OffsetPrefix(field) + \"\\t\\treturn \" + GenGetter(field.value.type);\n    code += \"(o + rcv._tab.Pos)\\n\\t}\\n\\treturn nil\\n\";\n    code += \"}\\n\\n\";\n  }\n\n  // Get the value of a union from an object.\n  void GetUnionField(const StructDef& struct_def, const FieldDef& field,\n                     std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    GenReceiver(struct_def, code_ptr);\n    code += \" \" + namer_.Function(field) + \"(\";\n    code += \"obj \" + GenTypePointer(field.value.type) + \") bool \";\n    code += OffsetPrefix(field);\n    code += \"\\t\\t\" + GenGetter(field.value.type);\n    code += \"(obj, o)\\n\\t\\treturn true\\n\\t}\\n\";\n    code += \"\\treturn false\\n\";\n    code += \"}\\n\\n\";\n  }\n\n  // Get the value of a vector's struct member.\n  void GetMemberOfVectorOfStruct(const StructDef& struct_def,\n                                 const FieldDef& field, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    auto vectortype = field.value.type.VectorType();\n\n    GenReceiver(struct_def, code_ptr);\n    code += \" \" + namer_.Function(field);\n    code += \"(obj *\" + TypeName(field);\n    code += \", j int) bool \" + OffsetPrefix(field);\n    code += \"\\t\\tx := rcv._tab.Vector(o)\\n\";\n    code += \"\\t\\tx += flatbuffers.UOffsetT(j) * \";\n    code += NumToString(InlineSize(vectortype)) + \"\\n\";\n    if (!(vectortype.struct_def->fixed)) {\n      code += \"\\t\\tx = rcv._tab.Indirect(x)\\n\";\n    }\n    code += \"\\t\\tobj.Init(rcv._tab.Bytes, x)\\n\";\n    code += \"\\t\\treturn true\\n\\t}\\n\";\n    code += \"\\treturn false\\n\";\n    code += \"}\\n\\n\";\n  }\n\n  void GetMemberOfVectorOfStructByKey(const StructDef& struct_def,\n                                      const FieldDef& field,\n                                      std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    auto vectortype = field.value.type.VectorType();\n    FLATBUFFERS_ASSERT(vectortype.struct_def->has_key);\n\n    auto& vector_struct_fields = vectortype.struct_def->fields.vec;\n    auto kit =\n        std::find_if(vector_struct_fields.begin(), vector_struct_fields.end(),\n                     [&](FieldDef* vector_struct_field) {\n                       return vector_struct_field->key;\n                     });\n\n    auto& key_field = **kit;\n    FLATBUFFERS_ASSERT(key_field.key);\n\n    GenReceiver(struct_def, code_ptr);\n    code += \" \" + namer_.Field(field) + \"ByKey\";\n    code += \"(obj *\" + TypeName(field);\n    code += \", key \" + NativeType(key_field.value.type) + \") bool \" +\n            OffsetPrefix(field);\n    code += \"\\t\\tx := rcv._tab.Vector(o)\\n\";\n    code += \"\\t\\treturn \";\n    code += \"obj.LookupByKey(key, x, rcv._tab.Bytes)\\n\";\n    code += \"\\t}\\n\";\n    code += \"\\treturn false\\n\";\n    code += \"}\\n\\n\";\n  }\n\n  // Get the value of a vector's non-struct member.\n  void GetMemberOfVectorOfNonStruct(const StructDef& struct_def,\n                                    const FieldDef& field,\n                                    std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    auto vectortype = field.value.type.VectorType();\n\n    GenReceiver(struct_def, code_ptr);\n    code += \" \" + namer_.Function(field);\n    code += \"(j int) \" + TypeName(field) + \" \";\n    code += OffsetPrefix(field);\n    code += \"\\t\\ta := rcv._tab.Vector(o)\\n\";\n    code += \"\\t\\treturn \" +\n            CastToEnum(field.value.type,\n                       GenGetter(field.value.type) +\n                           \"(a + flatbuffers.UOffsetT(j*\" +\n                           NumToString(InlineSize(vectortype)) + \"))\");\n    code += \"\\n\\t}\\n\";\n    if (IsString(vectortype)) {\n      code += \"\\treturn nil\\n\";\n    } else if (vectortype.base_type == BASE_TYPE_BOOL) {\n      code += \"\\treturn false\\n\";\n    } else {\n      code += \"\\treturn 0\\n\";\n    }\n    code += \"}\\n\\n\";\n  }\n\n  // Begin the creator function signature.\n  void BeginBuilderArgs(const StructDef& struct_def, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n\n    if (code.substr(code.length() - 2) != \"\\n\\n\") {\n      // a previous mutate has not put an extra new line\n      code += \"\\n\";\n    }\n    code += \"func Create\" + struct_def.name;\n    code += \"(builder *flatbuffers.Builder\";\n  }\n\n  // Recursively generate arguments for a constructor, to deal with nested\n  // structs.\n  void StructBuilderArgs(const StructDef& struct_def, const char* nameprefix,\n                         std::string* code_ptr) {\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (IsStruct(field.value.type)) {\n        // Generate arguments for a struct inside a struct. To ensure names\n        // don't clash, and to make it obvious these arguments are constructing\n        // a nested struct, prefix the name with the field name.\n        StructBuilderArgs(*field.value.type.struct_def,\n                          (nameprefix + (field.name + \"_\")).c_str(), code_ptr);\n      } else {\n        std::string& code = *code_ptr;\n        code += std::string(\", \") + nameprefix;\n        code += namer_.Variable(field);\n        code += \" \" + TypeName(field);\n      }\n    }\n  }\n\n  // End the creator function signature.\n  void EndBuilderArgs(std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code += \") flatbuffers.UOffsetT {\\n\";\n  }\n\n  // Recursively generate struct construction statements and instert manual\n  // padding.\n  void StructBuilderBody(const StructDef& struct_def, const char* nameprefix,\n                         std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code += \"\\tbuilder.Prep(\" + NumToString(struct_def.minalign) + \", \";\n    code += NumToString(struct_def.bytesize) + \")\\n\";\n    for (auto it = struct_def.fields.vec.rbegin();\n         it != struct_def.fields.vec.rend(); ++it) {\n      auto& field = **it;\n      if (field.padding)\n        code += \"\\tbuilder.Pad(\" + NumToString(field.padding) + \")\\n\";\n      if (IsStruct(field.value.type)) {\n        StructBuilderBody(*field.value.type.struct_def,\n                          (nameprefix + (field.name + \"_\")).c_str(), code_ptr);\n      } else {\n        code += \"\\tbuilder.Prepend\" + GenMethod(field) + \"(\";\n        code += CastToBaseType(field.value.type,\n                               nameprefix + namer_.Variable(field)) +\n                \")\\n\";\n      }\n    }\n  }\n\n  void EndBuilderBody(std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code += \"\\treturn builder.Offset()\\n\";\n    code += \"}\\n\";\n  }\n\n  // Get the value of a table's starting offset.\n  void GetStartOfTable(const StructDef& struct_def, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code += \"func \" + namer_.Type(struct_def) + \"Start\";\n    code += \"(builder *flatbuffers.Builder) {\\n\";\n    code += \"\\tbuilder.StartObject(\";\n    code += NumToString(struct_def.fields.vec.size());\n    code += \")\\n}\\n\";\n  }\n\n  // Set the value of a table's field.\n  void BuildFieldOfTable(const StructDef& struct_def, const FieldDef& field,\n                         const size_t offset, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    const std::string field_var = namer_.Variable(field);\n    code += \"func \" + namer_.Type(struct_def) + \"Add\" + namer_.Function(field);\n    code += \"(builder *flatbuffers.Builder, \";\n    code += field_var + \" \";\n    if (!IsScalar(field.value.type.base_type) && (!struct_def.fixed)) {\n      code += \"flatbuffers.UOffsetT\";\n    } else {\n      code += GenTypeGet(field.value.type);\n    }\n    code += \") {\\n\\t\";\n    code += \"builder.Prepend\";\n    code += GenMethod(field);\n    if (field.IsScalarOptional()) {\n      code += \"(\";\n    } else {\n      code += \"Slot(\" + NumToString(offset) + \", \";\n    }\n    if (!IsScalar(field.value.type.base_type) && (!struct_def.fixed)) {\n      code += \"flatbuffers.UOffsetT\";\n      code += \"(\" + field_var + \")\";\n    } else {\n      code += CastToBaseType(field.value.type, field_var);\n    }\n    if (field.IsScalarOptional()) {\n      code += \")\\n\";\n      code += \"\\tbuilder.Slot(\" + NumToString(offset);\n    } else {\n      code += \", \" + GenConstant(field);\n    }\n    code += \")\\n\";\n    code += \"}\\n\";\n  }\n\n  // Set the value of one of the members of a table's vector.\n  void BuildVectorOfTable(const StructDef& struct_def, const FieldDef& field,\n                          std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code += \"func \" + namer_.Type(struct_def) + \"Start\";\n    code += namer_.Function(field);\n    code += \"Vector(builder *flatbuffers.Builder, numElems int) \";\n    code += \"flatbuffers.UOffsetT {\\n\\treturn builder.StartVector(\";\n    auto vector_type = field.value.type.VectorType();\n    auto alignment = InlineAlignment(vector_type);\n    auto elem_size = InlineSize(vector_type);\n    code += NumToString(elem_size);\n    code += \", numElems, \" + NumToString(alignment);\n    code += \")\\n}\\n\";\n  }\n\n  // Get the offset of the end of a table.\n  void GetEndOffsetOnTable(const StructDef& struct_def, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code += \"func \" + namer_.Type(struct_def) + \"End\";\n    code += \"(builder *flatbuffers.Builder) flatbuffers.UOffsetT \";\n    code += \"{\\n\\treturn builder.EndObject()\\n}\\n\";\n  }\n\n  // Generate the receiver for function signatures.\n  void GenReceiver(const StructDef& struct_def, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code += \"func (rcv *\" + namer_.Type(struct_def) + \")\";\n  }\n\n  // Generate a struct field getter, conditioned on its child type(s).\n  void GenStructAccessor(const StructDef& struct_def, const FieldDef& field,\n                         std::string* code_ptr) {\n    GenComment(field.doc_comment, code_ptr, nullptr, \"\");\n    if (IsScalar(field.value.type.base_type)) {\n      if (struct_def.fixed) {\n        GetScalarFieldOfStruct(struct_def, field, code_ptr);\n      } else {\n        GetScalarFieldOfTable(struct_def, field, code_ptr);\n      }\n    } else {\n      switch (field.value.type.base_type) {\n        case BASE_TYPE_STRUCT:\n          if (struct_def.fixed) {\n            GetStructFieldOfStruct(struct_def, field, code_ptr);\n          } else {\n            GetStructFieldOfTable(struct_def, field, code_ptr);\n          }\n          break;\n        case BASE_TYPE_STRING:\n          GetStringField(struct_def, field, code_ptr);\n          break;\n        case BASE_TYPE_VECTOR: {\n          auto vectortype = field.value.type.VectorType();\n          if (vectortype.base_type == BASE_TYPE_STRUCT) {\n            GetMemberOfVectorOfStruct(struct_def, field, code_ptr);\n            // TODO(michaeltle): Support querying fixed struct by key.\n            // Currently, we only support keyed tables.\n            if (!vectortype.struct_def->fixed &&\n                vectortype.struct_def->has_key) {\n              GetMemberOfVectorOfStructByKey(struct_def, field, code_ptr);\n            }\n          } else {\n            GetMemberOfVectorOfNonStruct(struct_def, field, code_ptr);\n          }\n          break;\n        }\n        case BASE_TYPE_UNION:\n          GetUnionField(struct_def, field, code_ptr);\n          break;\n        default:\n          FLATBUFFERS_ASSERT(0);\n      }\n    }\n    if (IsVector(field.value.type)) {\n      GetVectorLen(struct_def, field, code_ptr);\n      if (field.value.type.element == BASE_TYPE_UCHAR) {\n        GetUByteSlice(struct_def, field, code_ptr);\n      }\n    }\n  }\n\n  // Mutate the value of a struct's scalar.\n  void MutateScalarFieldOfStruct(const StructDef& struct_def,\n                                 const FieldDef& field, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    std::string setter =\n        \"rcv._tab.Mutate\" + namer_.Method(GenTypeBasic(field.value.type));\n    GenReceiver(struct_def, code_ptr);\n    code += \" Mutate\" + namer_.Function(field);\n    code +=\n        \"(n \" + GenTypeGet(field.value.type) + \") bool {\\n\\treturn \" + setter;\n    code += \"(rcv._tab.Pos+flatbuffers.UOffsetT(\";\n    code += NumToString(field.value.offset) + \"), \";\n    code += CastToBaseType(field.value.type, \"n\") + \")\\n}\\n\\n\";\n  }\n\n  // Mutate the value of a table's scalar.\n  void MutateScalarFieldOfTable(const StructDef& struct_def,\n                                const FieldDef& field, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    std::string setter = \"rcv._tab.Mutate\" +\n                         namer_.Method(GenTypeBasic(field.value.type)) + \"Slot\";\n    GenReceiver(struct_def, code_ptr);\n    code += \" Mutate\" + namer_.Function(field);\n    code += \"(n \" + GenTypeGet(field.value.type) + \") bool {\\n\\treturn \";\n    code += setter + \"(\" + NumToString(field.value.offset) + \", \";\n    code += CastToBaseType(field.value.type, \"n\") + \")\\n\";\n    code += \"}\\n\\n\";\n  }\n\n  // Mutate an element of a vector of scalars.\n  void MutateElementOfVectorOfNonStruct(const StructDef& struct_def,\n                                        const FieldDef& field,\n                                        std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    auto vectortype = field.value.type.VectorType();\n    std::string setter =\n        \"rcv._tab.Mutate\" + namer_.Method(GenTypeBasic(vectortype));\n    GenReceiver(struct_def, code_ptr);\n    code += \" Mutate\" + namer_.Function(field);\n    code += \"(j int, n \" + TypeName(field) + \") bool \";\n    code += OffsetPrefix(field);\n    code += \"\\t\\ta := rcv._tab.Vector(o)\\n\";\n    code += \"\\t\\treturn \" + setter + \"(\";\n    code += \"a+flatbuffers.UOffsetT(j*\";\n    code += NumToString(InlineSize(vectortype)) + \"), \";\n    code += CastToBaseType(vectortype, \"n\") + \")\\n\";\n    code += \"\\t}\\n\";\n    code += \"\\treturn false\\n\";\n    code += \"}\\n\\n\";\n  }\n\n  // Generate a struct field setter, conditioned on its child type(s).\n  void GenStructMutator(const StructDef& struct_def, const FieldDef& field,\n                        std::string* code_ptr) {\n    GenComment(field.doc_comment, code_ptr, nullptr, \"\");\n    if (IsScalar(field.value.type.base_type)) {\n      if (struct_def.fixed) {\n        MutateScalarFieldOfStruct(struct_def, field, code_ptr);\n      } else {\n        MutateScalarFieldOfTable(struct_def, field, code_ptr);\n      }\n    } else if (IsVector(field.value.type)) {\n      if (IsScalar(field.value.type.element)) {\n        MutateElementOfVectorOfNonStruct(struct_def, field, code_ptr);\n      }\n    }\n  }\n\n  // Generate table constructors, conditioned on its members' types.\n  void GenTableBuilders(const StructDef& struct_def, std::string* code_ptr) {\n    GetStartOfTable(struct_def, code_ptr);\n\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (field.deprecated) continue;\n\n      auto offset = it - struct_def.fields.vec.begin();\n      BuildFieldOfTable(struct_def, field, offset, code_ptr);\n      if (IsVector(field.value.type)) {\n        BuildVectorOfTable(struct_def, field, code_ptr);\n      }\n    }\n\n    GetEndOffsetOnTable(struct_def, code_ptr);\n  }\n\n  // Generate struct or table methods.\n  void GenStruct(const StructDef& struct_def, std::string* code_ptr) {\n    if (struct_def.generated) return;\n\n    cur_name_space_ = struct_def.defined_namespace;\n\n    GenComment(struct_def.doc_comment, code_ptr, nullptr);\n    if (parser_.opts.generate_object_based_api) {\n      GenNativeStruct(struct_def, code_ptr);\n    }\n    BeginClass(struct_def, code_ptr);\n    if (!struct_def.fixed) {\n      // Generate a special accessor for the table that has been declared as\n      // the root type.\n      NewRootTypeFromBuffer(struct_def, code_ptr);\n    }\n    // Generate the Init method that sets the field in a pre-existing\n    // accessor object. This is to allow object reuse.\n    InitializeExisting(struct_def, code_ptr);\n    // Generate _tab accessor\n    GenTableAccessor(struct_def, code_ptr);\n\n    // Generate struct fields accessors\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (field.deprecated) continue;\n\n      GenStructAccessor(struct_def, field, code_ptr);\n      GenStructMutator(struct_def, field, code_ptr);\n      // TODO(michaeltle): Support querying fixed struct by key. Currently,\n      // we only support keyed tables.\n      if (!struct_def.fixed && field.key) {\n        GenKeyCompare(struct_def, field, code_ptr);\n        GenLookupByKey(struct_def, field, code_ptr);\n      }\n    }\n\n    // Generate builders\n    if (struct_def.fixed) {\n      // create a struct constructor function\n      GenStructBuilder(struct_def, code_ptr);\n    } else {\n      // Create a set of functions that allow table construction.\n      GenTableBuilders(struct_def, code_ptr);\n    }\n  }\n\n  void GenKeyCompare(const StructDef& struct_def, const FieldDef& field,\n                     std::string* code_ptr) {\n    FLATBUFFERS_ASSERT(struct_def.has_key);\n    FLATBUFFERS_ASSERT(field.key);\n    std::string& code = *code_ptr;\n\n    code += \"func \" + namer_.Type(struct_def) + \"KeyCompare(\";\n    code += \"o1, o2 flatbuffers.UOffsetT, buf []byte) bool {\\n\";\n    code += \"\\tobj1 := &\" + namer_.Type(struct_def) + \"{}\\n\";\n    code += \"\\tobj2 := &\" + namer_.Type(struct_def) + \"{}\\n\";\n    code += \"\\tobj1.Init(buf, flatbuffers.UOffsetT(len(buf))-o1)\\n\";\n    code += \"\\tobj2.Init(buf, flatbuffers.UOffsetT(len(buf))-o2)\\n\";\n    if (IsString(field.value.type)) {\n      code += \"\\treturn string(obj1.\" + namer_.Function(field.name) + \"()) < \";\n      code += \"string(obj2.\" + namer_.Function(field.name) + \"())\\n\";\n    } else {\n      code += \"\\treturn obj1.\" + namer_.Function(field.name) + \"() < \";\n      code += \"obj2.\" + namer_.Function(field.name) + \"()\\n\";\n    }\n    code += \"}\\n\\n\";\n  }\n\n  void GenLookupByKey(const StructDef& struct_def, const FieldDef& field,\n                      std::string* code_ptr) {\n    FLATBUFFERS_ASSERT(struct_def.has_key);\n    FLATBUFFERS_ASSERT(field.key);\n    std::string& code = *code_ptr;\n\n    GenReceiver(struct_def, code_ptr);\n    code += \" LookupByKey(\";\n    code += \"key \" + NativeType(field.value.type) + \", \";\n    code += \"vectorLocation flatbuffers.UOffsetT, \";\n    code += \"buf []byte) bool {\\n\";\n    code += \"\\tspan := flatbuffers.GetUOffsetT(buf[vectorLocation-4:])\\n\";\n    code += \"\\tstart := flatbuffers.UOffsetT(0)\\n\";\n    if (IsString(field.value.type)) {\n      code += \"\\tbKey := []byte(key)\\n\";\n    }\n    code += \"\\tfor span != 0 {\\n\";\n    code += \"\\t\\tmiddle := span / 2\\n\";\n    code += \"\\t\\ttableOffset := flatbuffers.GetIndirectOffset(buf, \";\n    code += \"vectorLocation+4*(start+middle))\\n\";\n\n    code += \"\\t\\tobj := &\" + namer_.Type(struct_def) + \"{}\\n\";\n    code += \"\\t\\tobj.Init(buf, tableOffset)\\n\";\n\n    if (IsString(field.value.type)) {\n      needs_bytes_import_ = true;\n      code +=\n          \"\\t\\tcomp := bytes.Compare(obj.\" + namer_.Function(field.name) + \"()\";\n      code += \", bKey)\\n\";\n    } else {\n      code += \"\\t\\tval := obj.\" + namer_.Function(field.name) + \"()\\n\";\n      code += \"\\t\\tcomp := 0\\n\";\n      code += \"\\t\\tif val > key {\\n\";\n      code += \"\\t\\t\\tcomp = 1\\n\";\n      code += \"\\t\\t} else if val < key {\\n\";\n      code += \"\\t\\t\\tcomp = -1\\n\";\n      code += \"\\t\\t}\\n\";\n    }\n    code += \"\\t\\tif comp > 0 {\\n\";\n    code += \"\\t\\t\\tspan = middle\\n\";\n    code += \"\\t\\t} else if comp < 0 {\\n\";\n    code += \"\\t\\t\\tmiddle += 1\\n\";\n    code += \"\\t\\t\\tstart += middle\\n\";\n    code += \"\\t\\t\\tspan -= middle\\n\";\n    code += \"\\t\\t} else {\\n\";\n    code += \"\\t\\t\\trcv.Init(buf, tableOffset)\\n\";\n    code += \"\\t\\t\\treturn true\\n\";\n    code += \"\\t\\t}\\n\";\n    code += \"\\t}\\n\";\n    code += \"\\treturn false\\n\";\n    code += \"}\\n\\n\";\n  }\n\n  void GenNativeStruct(const StructDef& struct_def, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n\n    code += \"type \" + NativeName(struct_def) + \" struct {\\n\";\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      const FieldDef& field = **it;\n      if (field.deprecated) continue;\n      if (IsScalar(field.value.type.base_type) &&\n          field.value.type.enum_def != nullptr &&\n          field.value.type.enum_def->is_union)\n        continue;\n      code += \"\\t\" + namer_.Field(field) + \" \";\n      if (field.IsScalarOptional()) {\n        code += \"*\";\n      }\n      code += NativeType(field.value.type) + \" `json:\\\"\" + field.name + \"\\\"`\" +\n              \"\\n\";\n    }\n    code += \"}\\n\\n\";\n\n    if (!struct_def.fixed) {\n      GenNativeTablePack(struct_def, code_ptr);\n      GenNativeTableUnPack(struct_def, code_ptr);\n    } else {\n      GenNativeStructPack(struct_def, code_ptr);\n      GenNativeStructUnPack(struct_def, code_ptr);\n    }\n  }\n\n  void GenNativeUnion(const EnumDef& enum_def, std::string* code_ptr) {\n    if (enum_def.generated) return;\n\n    std::string& code = *code_ptr;\n    code += \"type \" + NativeName(enum_def) + \" struct {\\n\";\n    code += \"\\tType \" + namer_.Type(enum_def) + \"\\n\";\n    code += \"\\tValue interface{}\\n\";\n    code += \"}\\n\\n\";\n  }\n\n  void GenNativeUnionPack(const EnumDef& enum_def, std::string* code_ptr) {\n    if (enum_def.generated) return;\n\n    std::string& code = *code_ptr;\n    code += \"func (t *\" + NativeName(enum_def) +\n            \") Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\\n\";\n    code += \"\\tif t == nil {\\n\\t\\treturn 0\\n\\t}\\n\";\n\n    code += \"\\tswitch t.Type {\\n\";\n    for (auto it2 = enum_def.Vals().begin(); it2 != enum_def.Vals().end();\n         ++it2) {\n      const EnumVal& ev = **it2;\n      if (ev.IsZero()) continue;\n      code += \"\\tcase \" + namer_.EnumVariant(enum_def, ev) + \":\\n\";\n      code += \"\\t\\treturn t.Value.(\" + NativeType(ev.union_type) +\n              \").Pack(builder)\\n\";\n    }\n    code += \"\\t}\\n\";\n    code += \"\\treturn 0\\n\";\n    code += \"}\\n\\n\";\n  }\n\n  void GenNativeUnionUnPack(const EnumDef& enum_def, std::string* code_ptr) {\n    if (enum_def.generated) return;\n\n    std::string& code = *code_ptr;\n\n    code += \"func (rcv \" + namer_.Type(enum_def) +\n            \") UnPack(table flatbuffers.Table) *\" + NativeName(enum_def) +\n            \" {\\n\";\n    code += \"\\tswitch rcv {\\n\";\n\n    for (auto it2 = enum_def.Vals().begin(); it2 != enum_def.Vals().end();\n         ++it2) {\n      const EnumVal& ev = **it2;\n      if (ev.IsZero()) continue;\n      code += \"\\tcase \" + namer_.EnumVariant(enum_def, ev) + \":\\n\";\n      code += \"\\t\\tvar x \" +\n              WrapInNameSpaceAndTrack(ev.union_type.struct_def,\n                                      ev.union_type.struct_def->name) +\n              \"\\n\";\n      code += \"\\t\\tx.Init(table.Bytes, table.Pos)\\n\";\n\n      code += \"\\t\\treturn &\" +\n              WrapInNameSpaceAndTrack(&enum_def, NativeName(enum_def)) +\n              \"{Type: \" + namer_.EnumVariant(enum_def, ev) +\n              \", Value: x.UnPack()}\\n\";\n    }\n    code += \"\\t}\\n\";\n    code += \"\\treturn nil\\n\";\n    code += \"}\\n\\n\";\n  }\n\n  void GenNativeTablePack(const StructDef& struct_def, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    const std::string struct_type = namer_.Type(struct_def);\n\n    code += \"func (t *\" + NativeName(struct_def) +\n            \") Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\\n\";\n    code += \"\\tif t == nil {\\n\\t\\treturn 0\\n\\t}\\n\";\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      const FieldDef& field = **it;\n      if (field.deprecated) continue;\n      if (IsScalar(field.value.type.base_type)) continue;\n\n      const std::string field_field = namer_.Field(field);\n      const std::string field_var = namer_.Variable(field);\n      const std::string offset = field_var + \"Offset\";\n\n      if (IsString(field.value.type)) {\n        if (!field.IsRequired()) {\n          code += \"\\t\" + offset + \" := flatbuffers.UOffsetT(0)\\n\";\n          code += \"\\tif t.\" + field_field + \" != \\\"\\\" {\\n\";\n          code += \"\\t\\t\" + offset + \" = builder.CreateString(t.\" + field_field +\n                  \")\\n\";\n          code += \"\\t}\\n\";\n        } else {\n          code += \"\\t\" + offset + \" := builder.CreateString(t.\" + field_field +\n                  \")\\n\";\n        }\n      } else if (IsVector(field.value.type) &&\n                 field.value.type.element == BASE_TYPE_UCHAR &&\n                 field.value.type.enum_def == nullptr) {\n        code += \"\\t\" + offset + \" := flatbuffers.UOffsetT(0)\\n\";\n        code += \"\\tif t.\" + field_field + \" != nil {\\n\";\n        code += \"\\t\\t\" + offset + \" = builder.CreateByteString(t.\" +\n                field_field + \")\\n\";\n        code += \"\\t}\\n\";\n      } else if (IsVector(field.value.type)) {\n        code += \"\\t\" + offset + \" := flatbuffers.UOffsetT(0)\\n\";\n        code += \"\\tif t.\" + field_field + \" != nil {\\n\";\n        std::string length = field_var + \"Length\";\n        std::string offsets = field_var + \"Offsets\";\n        code += \"\\t\\t\" + length + \" := len(t.\" + field_field + \")\\n\";\n        if (field.value.type.element == BASE_TYPE_STRING) {\n          code += \"\\t\\t\" + offsets + \" := make([]flatbuffers.UOffsetT, \" +\n                  length + \")\\n\";\n          code += \"\\t\\tfor j := 0; j < \" + length + \"; j++ {\\n\";\n          code += \"\\t\\t\\t\" + offsets + \"[j] = builder.CreateString(t.\" +\n                  field_field + \"[j])\\n\";\n          code += \"\\t\\t}\\n\";\n        } else if (field.value.type.element == BASE_TYPE_STRUCT &&\n                   !field.value.type.struct_def->fixed) {\n          code += \"\\t\\t\" + offsets + \" := make([]flatbuffers.UOffsetT, \" +\n                  length + \")\\n\";\n          code += \"\\t\\tfor j := 0; j < \" + length + \"; j++ {\\n\";\n          code += \"\\t\\t\\t\" + offsets + \"[j] = t.\" + field_field +\n                  \"[j].Pack(builder)\\n\";\n          code += \"\\t\\t}\\n\";\n        }\n        code += \"\\t\\t\" + struct_type + \"Start\" + namer_.Function(field) +\n                \"Vector(builder, \" + length + \")\\n\";\n        code += \"\\t\\tfor j := \" + length + \" - 1; j >= 0; j-- {\\n\";\n        if (IsScalar(field.value.type.element)) {\n          code += \"\\t\\t\\tbuilder.Prepend\" +\n                  namer_.Method(GenTypeBasic(field.value.type.VectorType())) +\n                  \"(\" +\n                  CastToBaseType(field.value.type.VectorType(),\n                                 \"t.\" + field_field + \"[j]\") +\n                  \")\\n\";\n        } else if (field.value.type.element == BASE_TYPE_STRUCT &&\n                   field.value.type.struct_def->fixed) {\n          code += \"\\t\\t\\tt.\" + field_field + \"[j].Pack(builder)\\n\";\n        } else {\n          code += \"\\t\\t\\tbuilder.PrependUOffsetT(\" + offsets + \"[j])\\n\";\n        }\n        code += \"\\t\\t}\\n\";\n        code += \"\\t\\t\" + offset + \" = builder.EndVector(\" + length + \")\\n\";\n        code += \"\\t}\\n\";\n      } else if (field.value.type.base_type == BASE_TYPE_STRUCT) {\n        if (field.value.type.struct_def->fixed) continue;\n        code += \"\\t\" + offset + \" := t.\" + field_field + \".Pack(builder)\\n\";\n      } else if (field.value.type.base_type == BASE_TYPE_UNION) {\n        code += \"\\t\" + offset + \" := t.\" + field_field + \".Pack(builder)\\n\\n\";\n      } else {\n        FLATBUFFERS_ASSERT(0);\n      }\n    }\n    code += \"\\t\" + struct_type + \"Start(builder)\\n\";\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      const FieldDef& field = **it;\n      if (field.deprecated) continue;\n      const std::string field_field = namer_.Field(field);\n      const std::string field_fn = namer_.Function(field);\n      const std::string offset = namer_.Variable(field) + \"Offset\";\n\n      if (IsScalar(field.value.type.base_type)) {\n        std::string prefix;\n        if (field.IsScalarOptional()) {\n          code += \"\\tif t.\" + field_field + \" != nil {\\n\\t\";\n          prefix = \"*\";\n        }\n        if (field.value.type.enum_def == nullptr ||\n            !field.value.type.enum_def->is_union) {\n          code += \"\\t\" + struct_type + \"Add\" + field_fn + \"(builder, \" +\n                  prefix + \"t.\" + field_field + \")\\n\";\n        }\n        if (field.IsScalarOptional()) {\n          code += \"\\t}\\n\";\n        }\n      } else {\n        if (field.value.type.base_type == BASE_TYPE_STRUCT &&\n            field.value.type.struct_def->fixed) {\n          code += \"\\t\" + offset + \" := t.\" + field_field + \".Pack(builder)\\n\";\n        } else if (field.value.type.enum_def != nullptr &&\n                   field.value.type.enum_def->is_union) {\n          code += \"\\tif t.\" + field_field + \" != nil {\\n\";\n          code += \"\\t\\t\" + struct_type + \"Add\" +\n                  namer_.Method(field.name + UnionTypeFieldSuffix()) +\n                  \"(builder, t.\" + field_field + \".Type)\\n\";\n          code += \"\\t}\\n\";\n        }\n        code += \"\\t\" + struct_type + \"Add\" + field_fn + \"(builder, \" + offset +\n                \")\\n\";\n      }\n    }\n    code += \"\\treturn \" + struct_type + \"End(builder)\\n\";\n    code += \"}\\n\\n\";\n  }\n\n  void GenNativeTableUnPack(const StructDef& struct_def,\n                            std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    const std::string struct_type = namer_.Type(struct_def);\n\n    code += \"func (rcv *\" + struct_type + \") UnPackTo(t *\" +\n            NativeName(struct_def) + \") {\\n\";\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      const FieldDef& field = **it;\n      if (field.deprecated) continue;\n      const std::string field_field = namer_.Field(field);\n      const std::string field_var = namer_.Variable(field);\n      const std::string length = field_var + \"Length\";\n      if (IsScalar(field.value.type.base_type)) {\n        if (field.value.type.enum_def != nullptr &&\n            field.value.type.enum_def->is_union)\n          continue;\n        code += \"\\tt.\" + field_field + \" = rcv.\" + field_field + \"()\\n\";\n      } else if (IsString(field.value.type)) {\n        code += \"\\tt.\" + field_field + \" = string(rcv.\" + field_field + \"())\\n\";\n      } else if (IsVector(field.value.type) &&\n                 field.value.type.element == BASE_TYPE_UCHAR &&\n                 field.value.type.enum_def == nullptr) {\n        code += \"\\tt.\" + field_field + \" = rcv.\" + field_field + \"Bytes()\\n\";\n      } else if (IsVector(field.value.type)) {\n        code += \"\\t\" + length + \" := rcv.\" + field_field + \"Length()\\n\";\n        code += \"\\tt.\" + field_field + \" = make(\" +\n                NativeType(field.value.type) + \", \" + length + \")\\n\";\n        code += \"\\tfor j := 0; j < \" + length + \"; j++ {\\n\";\n        if (field.value.type.element == BASE_TYPE_STRUCT) {\n          code += \"\\t\\tx := \" +\n                  WrapInNameSpaceAndTrack(field.value.type.struct_def,\n                                          field.value.type.struct_def->name) +\n                  \"{}\\n\";\n          code += \"\\t\\trcv.\" + field_field + \"(&x, j)\\n\";\n        }\n        code += \"\\t\\tt.\" + field_field + \"[j] = \";\n        if (IsScalar(field.value.type.element)) {\n          code += \"rcv.\" + field_field + \"(j)\";\n        } else if (field.value.type.element == BASE_TYPE_STRING) {\n          code += \"string(rcv.\" + field_field + \"(j))\";\n        } else if (field.value.type.element == BASE_TYPE_STRUCT) {\n          code += \"x.UnPack()\";\n        } else {\n          // TODO(iceboy): Support vector of unions.\n          FLATBUFFERS_ASSERT(0);\n        }\n        code += \"\\n\";\n        code += \"\\t}\\n\";\n      } else if (field.value.type.base_type == BASE_TYPE_STRUCT) {\n        code +=\n            \"\\tt.\" + field_field + \" = rcv.\" + field_field + \"(nil).UnPack()\\n\";\n      } else if (field.value.type.base_type == BASE_TYPE_UNION) {\n        const std::string field_table = field_var + \"Table\";\n        code += \"\\t\" + field_table + \" := flatbuffers.Table{}\\n\";\n        code +=\n            \"\\tif rcv.\" + namer_.Method(field) + \"(&\" + field_table + \") {\\n\";\n        code += \"\\t\\tt.\" + field_field + \" = rcv.\" +\n                namer_.Method(field.name + UnionTypeFieldSuffix()) +\n                \"().UnPack(\" + field_table + \")\\n\";\n        code += \"\\t}\\n\";\n      } else {\n        FLATBUFFERS_ASSERT(0);\n      }\n    }\n    code += \"}\\n\\n\";\n\n    code += \"func (rcv *\" + struct_type + \") UnPack() *\" +\n            NativeName(struct_def) + \" {\\n\";\n    code += \"\\tif rcv == nil {\\n\\t\\treturn nil\\n\\t}\\n\";\n    code += \"\\tt := &\" + NativeName(struct_def) + \"{}\\n\";\n    code += \"\\trcv.UnPackTo(t)\\n\";\n    code += \"\\treturn t\\n\";\n    code += \"}\\n\\n\";\n  }\n\n  void GenNativeStructPack(const StructDef& struct_def, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n\n    code += \"func (t *\" + NativeName(struct_def) +\n            \") Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\\n\";\n    code += \"\\tif t == nil {\\n\\t\\treturn 0\\n\\t}\\n\";\n    code += \"\\treturn Create\" + namer_.Type(struct_def) + \"(builder\";\n    StructPackArgs(struct_def, \"\", code_ptr);\n    code += \")\\n\";\n    code += \"}\\n\";\n  }\n\n  void StructPackArgs(const StructDef& struct_def, const char* nameprefix,\n                      std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      const FieldDef& field = **it;\n      if (field.value.type.base_type == BASE_TYPE_STRUCT) {\n        StructPackArgs(*field.value.type.struct_def,\n                       (nameprefix + namer_.Field(field) + \".\").c_str(),\n                       code_ptr);\n      } else {\n        code += std::string(\", t.\") + nameprefix + namer_.Field(field);\n      }\n    }\n  }\n\n  void GenNativeStructUnPack(const StructDef& struct_def,\n                             std::string* code_ptr) {\n    std::string& code = *code_ptr;\n\n    code += \"func (rcv *\" + namer_.Type(struct_def) + \") UnPackTo(t *\" +\n            NativeName(struct_def) + \") {\\n\";\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      const FieldDef& field = **it;\n      if (field.value.type.base_type == BASE_TYPE_STRUCT) {\n        code += \"\\tt.\" + namer_.Field(field) + \" = rcv.\" +\n                namer_.Method(field) + \"(nil).UnPack()\\n\";\n      } else {\n        code += \"\\tt.\" + namer_.Field(field) + \" = rcv.\" +\n                namer_.Method(field) + \"()\\n\";\n      }\n    }\n    code += \"}\\n\\n\";\n\n    code += \"func (rcv *\" + namer_.Type(struct_def) + \") UnPack() *\" +\n            NativeName(struct_def) + \" {\\n\";\n    code += \"\\tif rcv == nil {\\n\\t\\treturn nil\\n\\t}\\n\";\n    code += \"\\tt := &\" + NativeName(struct_def) + \"{}\\n\";\n    code += \"\\trcv.UnPackTo(t)\\n\";\n    code += \"\\treturn t\\n\";\n    code += \"}\\n\\n\";\n  }\n\n  // Generate enum declarations.\n  void GenEnum(const EnumDef& enum_def, std::string* code_ptr) {\n    if (enum_def.generated) return;\n\n    auto max_name_length = MaxNameLength(enum_def);\n    cur_name_space_ = enum_def.defined_namespace;\n\n    GenComment(enum_def.doc_comment, code_ptr, nullptr);\n    GenEnumType(enum_def, code_ptr);\n    BeginEnum(code_ptr);\n    for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {\n      const EnumVal& ev = **it;\n      GenComment(ev.doc_comment, code_ptr, nullptr, \"\\t\");\n      EnumMember(enum_def, ev, max_name_length, code_ptr);\n    }\n    EndEnum(code_ptr);\n\n    BeginEnumNames(enum_def, code_ptr);\n    for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {\n      const EnumVal& ev = **it;\n      EnumNameMember(enum_def, ev, max_name_length, code_ptr);\n    }\n    EndEnumNames(code_ptr);\n\n    BeginEnumValues(enum_def, code_ptr);\n    for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {\n      auto& ev = **it;\n      EnumValueMember(enum_def, ev, max_name_length, code_ptr);\n    }\n    EndEnumValues(code_ptr);\n\n    EnumStringer(enum_def, code_ptr);\n  }\n\n  // Returns the function name that is able to read a value of the given type.\n  std::string GenGetter(const Type& type) {\n    switch (type.base_type) {\n      case BASE_TYPE_STRING:\n        return \"rcv._tab.ByteVector\";\n      case BASE_TYPE_UNION:\n        return \"rcv._tab.Union\";\n      case BASE_TYPE_VECTOR:\n        return GenGetter(type.VectorType());\n      default:\n        return \"rcv._tab.Get\" + namer_.Function(GenTypeBasic(type));\n    }\n  }\n\n  // Returns the method name for use with add/put calls.\n  std::string GenMethod(const FieldDef& field) {\n    return IsScalar(field.value.type.base_type)\n               ? namer_.Method(GenTypeBasic(field.value.type))\n               : (IsStruct(field.value.type) ? \"Struct\" : \"UOffsetT\");\n  }\n\n  std::string GenTypeBasic(const Type& type) {\n    // clang-format off\n    static const char *ctypename[] = {\n      #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, JTYPE, GTYPE, ...) \\\n        #GTYPE,\n        FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)\n      #undef FLATBUFFERS_TD\n    };\n    // clang-format on\n    return ctypename[type.base_type];\n  }\n\n  std::string GenTypePointer(const Type& type) {\n    switch (type.base_type) {\n      case BASE_TYPE_STRING:\n        return \"[]byte\";\n      case BASE_TYPE_VECTOR:\n        return GenTypeGet(type.VectorType());\n      case BASE_TYPE_STRUCT:\n        return WrapInNameSpaceAndTrack(type.struct_def, type.struct_def->name);\n      case BASE_TYPE_UNION:\n        // fall through\n      default:\n        return \"*flatbuffers.Table\";\n    }\n  }\n\n  std::string GenTypeGet(const Type& type) {\n    if (type.enum_def != nullptr) {\n      return GetEnumTypeName(*type.enum_def);\n    }\n    return IsScalar(type.base_type) ? GenTypeBasic(type) : GenTypePointer(type);\n  }\n\n  std::string TypeName(const FieldDef& field) {\n    std::string prefix;\n    if (field.IsScalarOptional()) {\n      prefix = \"*\";\n    }\n    return prefix + GenTypeGet(field.value.type);\n  }\n\n  // If type is an enum, returns value with a cast to the enum type, otherwise\n  // returns value as-is.\n  std::string CastToEnum(const Type& type, std::string value) {\n    if (type.enum_def == nullptr) {\n      return value;\n    } else {\n      return GenTypeGet(type) + \"(\" + value + \")\";\n    }\n  }\n\n  // If type is an enum, returns value with a cast to the enum base type,\n  // otherwise returns value as-is.\n  std::string CastToBaseType(const Type& type, std::string value) {\n    if (type.enum_def == nullptr) {\n      return value;\n    } else {\n      return GenTypeBasic(type) + \"(\" + value + \")\";\n    }\n  }\n\n  std::string GenConstant(const FieldDef& field) {\n    if (field.IsScalarOptional()) {\n      return \"nil\";\n    }\n    switch (field.value.type.base_type) {\n      case BASE_TYPE_BOOL:\n        return field.value.constant == \"0\" ? \"false\" : \"true\";\n      case BASE_TYPE_FLOAT:\n      case BASE_TYPE_DOUBLE: {\n        const std::string float_type =\n            field.value.type.base_type == BASE_TYPE_FLOAT ? \"float32\"\n                                                          : \"float64\";\n        if (StringIsFlatbufferNan(field.value.constant)) {\n          needs_math_import_ = true;\n          return float_type + \"(math.NaN())\";\n        } else if (StringIsFlatbufferPositiveInfinity(field.value.constant)) {\n          needs_math_import_ = true;\n          return float_type + \"(math.Inf(1))\";\n        } else if (StringIsFlatbufferNegativeInfinity(field.value.constant)) {\n          needs_math_import_ = true;\n          return float_type + \"(math.Inf(-1))\";\n        }\n        return field.value.constant;\n      }\n      default:\n        return field.value.constant;\n    }\n  }\n\n  std::string NativeName(const StructDef& struct_def) const {\n    return namer_.ObjectType(struct_def);\n  }\n\n  std::string NativeName(const EnumDef& enum_def) const {\n    return namer_.ObjectType(enum_def);\n  }\n\n  std::string NativeType(const Type& type) {\n    if (IsScalar(type.base_type)) {\n      if (type.enum_def == nullptr) {\n        return GenTypeBasic(type);\n      } else {\n        return GetEnumTypeName(*type.enum_def);\n      }\n    } else if (IsString(type)) {\n      return \"string\";\n    } else if (IsVector(type)) {\n      return \"[]\" + NativeType(type.VectorType());\n    } else if (type.base_type == BASE_TYPE_STRUCT) {\n      return \"*\" + WrapInNameSpaceAndTrack(type.struct_def,\n                                           NativeName(*type.struct_def));\n    } else if (type.base_type == BASE_TYPE_UNION) {\n      return \"*\" +\n             WrapInNameSpaceAndTrack(type.enum_def, NativeName(*type.enum_def));\n    }\n    FLATBUFFERS_ASSERT(0);\n    return std::string();\n  }\n\n  // Create a struct with a builder and the struct's arguments.\n  void GenStructBuilder(const StructDef& struct_def, std::string* code_ptr) {\n    BeginBuilderArgs(struct_def, code_ptr);\n    StructBuilderArgs(struct_def, \"\", code_ptr);\n    EndBuilderArgs(code_ptr);\n\n    StructBuilderBody(struct_def, \"\", code_ptr);\n    EndBuilderBody(code_ptr);\n  }\n\n  // Begin by declaring namespace and imports.\n  void BeginFile(const std::string& name_space_name, const bool needs_imports,\n                 const bool is_enum, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code = code +\n           \"// Code generated by the FlatBuffers compiler. DO NOT EDIT.\\n\\n\";\n    code += \"package \" + name_space_name + \"\\n\\n\";\n    if (needs_imports) {\n      code += \"import (\\n\";\n      // standard imports, in alphabetical order for go fmt\n      if (needs_bytes_import_) code += \"\\t\\\"bytes\\\"\\n\";\n      if (!parser_.opts.go_import.empty()) {\n        code += \"\\tflatbuffers \\\"\" + parser_.opts.go_import + \"\\\"\\n\";\n      } else {\n        code += \"\\tflatbuffers \\\"github.com/google/flatbuffers/go\\\"\\n\";\n      }\n      // math is needed to support non-finite scalar default values.\n      if (needs_math_import_) {\n        code += \"\\t\\\"math\\\"\\n\";\n      }\n      if (is_enum) {\n        code += \"\\t\\\"strconv\\\"\\n\";\n      }\n\n      if (tracked_imported_namespaces_.size() > 0) {\n        code += \"\\n\";\n        for (auto it = tracked_imported_namespaces_.begin();\n             it != tracked_imported_namespaces_.end(); ++it) {\n          if ((*it)->defined_namespace->components.empty()) {\n            code += \"\\t\" + (*it)->name + \" \\\"\" + (*it)->name + \"\\\"\\n\";\n          } else {\n            code += \"\\t\" + NamespaceImportName((*it)->defined_namespace) +\n                    \" \\\"\" + NamespaceImportPath((*it)->defined_namespace) +\n                    \"\\\"\\n\";\n          }\n        }\n      }\n      code += \")\\n\\n\";\n    } else {\n      if (is_enum) {\n        code += \"import \\\"strconv\\\"\\n\\n\";\n      }\n      if (needs_math_import_) {\n        // math is needed to support non-finite scalar default values.\n        code += \"import \\\"math\\\"\\n\\n\";\n      }\n    }\n  }\n\n  // Resets the needed imports before generating a new file.\n  void ResetImports() {\n    tracked_imported_namespaces_.clear();\n    needs_bytes_import_ = false;\n    needs_math_import_ = false;\n  }\n\n  // Save out the generated code for a Go Table type.\n  bool SaveType(const Definition& def, const std::string& classcode,\n                const bool needs_imports, const bool is_enum) {\n    if (!classcode.length()) return true;\n\n    Namespace& ns = go_namespace_.components.empty() ? *def.defined_namespace\n                                                     : go_namespace_;\n    std::string code = \"\";\n    BeginFile(ns.components.empty() ? def.name : LastNamespacePart(ns),\n              needs_imports, is_enum, &code);\n    code += classcode;\n    // Strip extra newlines at end of file to make it gofmt-clean.\n    while (code.length() > 2 && code.substr(code.length() - 2) == \"\\n\\n\") {\n      code.pop_back();\n    }\n    std::string directory = namer_.Directories(ns);\n    std::string file = namer_.File(def, SkipFile::Suffix);\n    EnsureDirExists(directory);\n    std::string filename = directory + file;\n    return parser_.opts.file_saver->SaveFile(filename.c_str(), code, false);\n  }\n\n  // Create the full name of the imported namespace (format: A__B__C).\n  std::string NamespaceImportName(const Namespace* ns) const {\n    return namer_.Namespace(*ns);\n  }\n\n  // Create the full path for the imported namespace (format: A/B/C).\n  std::string NamespaceImportPath(const Namespace* ns) const {\n    std::string path =\n        namer_.Directories(*ns, SkipDir::OutputPathAndTrailingPathSeparator);\n    if (!parser_.opts.go_module_name.empty()) {\n      path = parser_.opts.go_module_name + \"/\" + path;\n    }\n    return path;\n  }\n\n  // Ensure that a type is prefixed with its go package import name if it is\n  // used outside of its namespace.\n  std::string WrapInNameSpaceAndTrack(const Definition* def,\n                                      const std::string& name) {\n    if (CurrentNameSpace() == def->defined_namespace) return name;\n    tracked_imported_namespaces_.insert(def);\n    if (def->defined_namespace->components.empty())\n      return def->name + \".\" + name;\n    else\n      return NamespaceImportName(def->defined_namespace) + \".\" + name;\n  }\n\n  const Namespace* CurrentNameSpace() const { return cur_name_space_; }\n\n  static size_t MaxNameLength(const EnumDef& enum_def) {\n    size_t max = 0;\n    for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {\n      max = std::max((*it)->name.length(), max);\n    }\n    return max;\n  }\n};\n}  // namespace go\n\nstatic bool GenerateGo(const Parser& parser, const std::string& path,\n                       const std::string& file_name) {\n  go::GoGenerator generator(parser, path, file_name, parser.opts.go_namespace);\n  return generator.generate();\n}\n\nnamespace {\n\nclass GoCodeGenerator : public CodeGenerator {\n public:\n  Status GenerateCode(const Parser& parser, const std::string& path,\n                      const std::string& filename) override {\n    if (!GenerateGo(parser, path, filename)) {\n      return Status::ERROR;\n    }\n    return Status::OK;\n  }\n\n  Status GenerateCode(const uint8_t*, int64_t, const CodeGenOptions&) override {\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateMakeRule(const Parser& parser, const std::string& path,\n                          const std::string& filename,\n                          std::string& output) override {\n    (void)parser;\n    (void)path;\n    (void)filename;\n    (void)output;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateGrpcCode(const Parser& parser, const std::string& path,\n                          const std::string& filename) override {\n    if (!GenerateGoGRPC(parser, path, filename)) {\n      return Status::ERROR;\n    }\n    return Status::OK;\n  }\n\n  Status GenerateRootFile(const Parser& parser,\n                          const std::string& path) override {\n    (void)parser;\n    (void)path;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  bool IsSchemaOnly() const override { return true; }\n\n  bool SupportsBfbsGeneration() const override { return false; }\n\n  bool SupportsRootFileGeneration() const override { return false; }\n\n  IDLOptions::Language Language() const override { return IDLOptions::kGo; }\n\n  std::string LanguageName() const override { return \"Go\"; }\n};\n}  // namespace\n\nstd::unique_ptr<CodeGenerator> NewGoCodeGenerator() {\n  return std::unique_ptr<GoCodeGenerator>(new GoCodeGenerator());\n}\n\n}  // namespace flatbuffers\n"
  },
  {
    "path": "src/idl_gen_go.h",
    "content": "/*\n * Copyright 2023 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_IDL_GEN_GO_H_\n#define FLATBUFFERS_IDL_GEN_GO_H_\n\n#include \"flatbuffers/code_generator.h\"\n\nnamespace flatbuffers {\n\n// Constructs a new Go code generator.\nstd::unique_ptr<CodeGenerator> NewGoCodeGenerator();\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_IDL_GEN_GO_H_\n"
  },
  {
    "path": "src/idl_gen_grpc.cpp",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// independent from idl_parser, since this code is not needed for most clients\n\n#include <cstdio>\n\n#include \"flatbuffers/code_generators.h\"\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/idl.h\"\n#include \"flatbuffers/util.h\"\n#include \"src/compiler/cpp_generator.h\"\n#include \"src/compiler/go_generator.h\"\n#include \"src/compiler/java_generator.h\"\n#include \"src/compiler/python_generator.h\"\n#include \"src/compiler/swift_generator.h\"\n#include \"src/compiler/ts_generator.h\"\n\n#if defined(_MSC_VER)\n#pragma warning(push)\n#pragma warning(disable : 4512)  // C4512: 'class' : assignment operator could\n// not be generated\n#endif\n\nnamespace flatbuffers {\n\nclass FlatBufMethod : public grpc_generator::Method {\n public:\n  enum Streaming { kNone, kClient, kServer, kBiDi };\n\n  FlatBufMethod(const RPCCall* method) : method_(method) {\n    streaming_ = kNone;\n    auto val = method_->attributes.Lookup(\"streaming\");\n    if (val) {\n      if (val->constant == \"client\") streaming_ = kClient;\n      if (val->constant == \"server\") streaming_ = kServer;\n      if (val->constant == \"bidi\") streaming_ = kBiDi;\n    }\n  }\n\n  grpc::string GetLeadingComments(const grpc::string) const { return \"\"; }\n\n  grpc::string GetTrailingComments(const grpc::string) const { return \"\"; }\n\n  std::vector<grpc::string> GetAllComments() const {\n    return method_->doc_comment;\n  }\n\n  std::string name() const { return method_->name; }\n\n  // TODO: This method need to incorporate namespace for C++ side. Other\n  // language bindings simply don't use this method.\n  std::string GRPCType(const StructDef& sd) const {\n    return \"flatbuffers::grpc::Message<\" + sd.name + \">\";\n  }\n\n  std::vector<std::string> get_input_namespace_parts() const {\n    return (*method_->request).defined_namespace->components;\n  }\n\n  std::string get_input_type_name() const { return (*method_->request).name; }\n\n  std::vector<std::string> get_output_namespace_parts() const {\n    return (*method_->response).defined_namespace->components;\n  }\n\n  std::string get_output_type_name() const { return (*method_->response).name; }\n\n  bool get_module_and_message_path_input(grpc::string* /*str*/,\n                                         grpc::string /*generator_file_name*/,\n                                         bool /*generate_in_pb2_grpc*/,\n                                         grpc::string /*import_prefix*/) const {\n    return true;\n  }\n\n  bool get_module_and_message_path_output(\n      grpc::string* /*str*/, grpc::string /*generator_file_name*/,\n      bool /*generate_in_pb2_grpc*/, grpc::string /*import_prefix*/) const {\n    return true;\n  }\n\n  std::string get_fb_builder() const { return \"builder\"; }\n\n  std::string input_type_name() const { return GRPCType(*method_->request); }\n\n  std::string output_type_name() const { return GRPCType(*method_->response); }\n\n  bool NoStreaming() const { return streaming_ == kNone; }\n\n  bool ClientStreaming() const { return streaming_ == kClient; }\n\n  bool ServerStreaming() const { return streaming_ == kServer; }\n\n  bool BidiStreaming() const { return streaming_ == kBiDi; }\n\n private:\n  const RPCCall* method_;\n  Streaming streaming_;\n};\n\nclass FlatBufService : public grpc_generator::Service {\n public:\n  FlatBufService(const ServiceDef* service) : service_(service) {}\n\n  grpc::string GetLeadingComments(const grpc::string) const { return \"\"; }\n\n  grpc::string GetTrailingComments(const grpc::string) const { return \"\"; }\n\n  std::vector<grpc::string> GetAllComments() const {\n    return service_->doc_comment;\n  }\n\n  std::vector<grpc::string> namespace_parts() const {\n    return service_->defined_namespace->components;\n  }\n\n  std::string name() const { return service_->name; }\n  bool is_internal() const {\n    return service_->Definition::attributes.Lookup(\"private\") ? true : false;\n  }\n\n  int method_count() const {\n    return static_cast<int>(service_->calls.vec.size());\n  }\n\n  std::unique_ptr<const grpc_generator::Method> method(int i) const {\n    return std::unique_ptr<const grpc_generator::Method>(\n        new FlatBufMethod(service_->calls.vec[i]));\n  }\n\n private:\n  const ServiceDef* service_;\n};\n\nclass FlatBufPrinter : public grpc_generator::Printer {\n public:\n  FlatBufPrinter(std::string* str, const char indentation_type)\n      : str_(str),\n        escape_char_('$'),\n        indent_(0),\n        indentation_size_(2),\n        indentation_type_(indentation_type) {}\n\n  void Print(const std::map<std::string, std::string>& vars,\n             const char* string_template) {\n    std::string s = string_template;\n    // Replace any occurrences of strings in \"vars\" that are surrounded\n    // by the escape character by what they're mapped to.\n    size_t pos;\n    while ((pos = s.find(escape_char_)) != std::string::npos) {\n      // Found an escape char, must also find the closing one.\n      size_t pos2 = s.find(escape_char_, pos + 1);\n      // If placeholder not closed, ignore.\n      if (pos2 == std::string::npos) break;\n      auto it = vars.find(s.substr(pos + 1, pos2 - pos - 1));\n      // If unknown placeholder, ignore.\n      if (it == vars.end()) break;\n      // Subtitute placeholder.\n      s.replace(pos, pos2 - pos + 1, it->second);\n    }\n    Print(s.c_str());\n  }\n\n  void Print(const char* s) {\n    if (s == nullptr || *s == '\\0') {\n      return;\n    }\n    // Add this string, but for each part separated by \\n, add indentation.\n    for (;;) {\n      // Current indentation.\n      str_->insert(str_->end(), indent_ * indentation_size_, indentation_type_);\n      // See if this contains more than one line.\n      const char* lf = strchr(s, '\\n');\n      if (lf) {\n        (*str_) += std::string(s, lf + 1);\n        s = lf + 1;\n        if (!*s) break;  // Only continue if there's more lines.\n      } else {\n        (*str_) += s;\n        break;\n      }\n    }\n  }\n\n  void SetIndentationSize(const size_t size) {\n    FLATBUFFERS_ASSERT(str_->empty());\n    indentation_size_ = size;\n  }\n\n  void Indent() { indent_++; }\n\n  void Outdent() {\n    FLATBUFFERS_ASSERT(indent_ > 0);\n    indent_--;\n  }\n\n private:\n  std::string* str_;\n  char escape_char_;\n  size_t indent_;\n  size_t indentation_size_;\n  char indentation_type_;\n};\n\nclass FlatBufFile : public grpc_generator::File {\n public:\n  enum Language {\n    kLanguageGo,\n    kLanguageCpp,\n    kLanguageJava,\n    kLanguagePython,\n    kLanguageSwift,\n    kLanguageTS\n  };\n\n  FlatBufFile(const Parser& parser, const std::string& file_name,\n              Language language)\n      : parser_(parser), file_name_(file_name), language_(language) {}\n\n  FlatBufFile& operator=(const FlatBufFile&);\n\n  grpc::string GetLeadingComments(const grpc::string) const { return \"\"; }\n\n  grpc::string GetTrailingComments(const grpc::string) const { return \"\"; }\n\n  std::vector<grpc::string> GetAllComments() const {\n    return std::vector<grpc::string>();\n  }\n\n  std::string filename() const { return file_name_; }\n\n  std::string filename_without_ext() const {\n    return StripExtension(file_name_);\n  }\n\n  std::string package() const {\n    return parser_.current_namespace_->GetFullyQualifiedName(\"\");\n  }\n\n  std::vector<std::string> package_parts() const {\n    return parser_.current_namespace_->components;\n  }\n\n  std::string additional_headers() const {\n    switch (language_) {\n      case kLanguageCpp: {\n        if (!parser_.opts.grpc_additional_headers.empty()) {\n          std::string result = \"\";\n          for (const std::string& header :\n               parser_.opts.grpc_additional_headers) {\n            if (!result.empty()) result += \"\\n\";\n            result += \"#include \\\"\" + header + \"\\\"\";\n          }\n          return result;\n        }\n        return \"#include \\\"flatbuffers/grpc.h\\\"\\n\";\n      }\n      case kLanguageGo: {\n        return \"import \\\"github.com/google/flatbuffers/go\\\"\";\n      }\n      case kLanguageJava: {\n        return \"import com.google.flatbuffers.grpc.FlatbuffersUtils;\";\n      }\n      case kLanguagePython: {\n        return \"\";\n      }\n      case kLanguageSwift: {\n        return \"\";\n      }\n      case kLanguageTS: {\n        return \"\";\n      }\n    }\n    return \"\";\n  }\n\n  int service_count() const {\n    return static_cast<int>(parser_.services_.vec.size());\n  }\n\n  std::unique_ptr<const grpc_generator::Service> service(int i) const {\n    return std::unique_ptr<const grpc_generator::Service>(\n        new FlatBufService(parser_.services_.vec[i]));\n  }\n\n  std::unique_ptr<grpc_generator::Printer> CreatePrinter(\n      std::string* str, const char indentation_type = ' ') const {\n    return std::unique_ptr<grpc_generator::Printer>(\n        new FlatBufPrinter(str, indentation_type));\n  }\n\n private:\n  const Parser& parser_;\n  const std::string& file_name_;\n  const Language language_;\n};\n\nclass GoGRPCGenerator : public flatbuffers::BaseGenerator {\n public:\n  GoGRPCGenerator(const Parser& parser, const std::string& path,\n                  const std::string& file_name)\n      : BaseGenerator(parser, path, file_name, \"\", \"\" /*Unused*/, \"go\"),\n        parser_(parser),\n        path_(path),\n        file_name_(file_name) {}\n\n  bool generate() {\n    FlatBufFile file(parser_, file_name_, FlatBufFile::kLanguageGo);\n    grpc_go_generator::Parameters p;\n    p.custom_method_io_type = \"flatbuffers.Builder\";\n    for (int i = 0; i < file.service_count(); i++) {\n      auto service = file.service(i);\n      const Definition* def = parser_.services_.vec[i];\n      p.package_name = LastNamespacePart(*(def->defined_namespace));\n      p.service_prefix =\n          def->defined_namespace->GetFullyQualifiedName(\"\");  // file.package();\n      std::string output =\n          grpc_go_generator::GenerateServiceSource(&file, service.get(), &p);\n      std::string filename =\n          NamespaceDir(*def->defined_namespace) + def->name + \"_grpc.go\";\n      if (!parser_.opts.file_saver->SaveFile(filename.c_str(), output, false))\n        return false;\n    }\n    return true;\n  }\n\n protected:\n  const Parser& parser_;\n  const std::string &path_, &file_name_;\n};\n\nbool GenerateGoGRPC(const Parser& parser, const std::string& path,\n                    const std::string& file_name) {\n  int nservices = 0;\n  for (auto it = parser.services_.vec.begin(); it != parser.services_.vec.end();\n       ++it) {\n    if (!(*it)->generated) nservices++;\n  }\n  if (!nservices) return true;\n  return GoGRPCGenerator(parser, path, file_name).generate();\n}\n\nbool GenerateCppGRPC(const Parser& parser, const std::string& path,\n                     const std::string& file_name) {\n  const auto& opts = parser.opts;\n  int nservices = 0;\n  for (auto it = parser.services_.vec.begin(); it != parser.services_.vec.end();\n       ++it) {\n    if (!(*it)->generated) nservices++;\n  }\n  if (!nservices) return true;\n\n  std::string suffix = \"\";\n  suffix += opts.filename_suffix.empty() ? \"_generated\" : opts.filename_suffix;\n  suffix += \".\";\n  suffix += opts.filename_extension.empty() ? \"h\" : opts.filename_extension;\n\n  grpc_cpp_generator::Parameters generator_parameters;\n  // TODO(wvo): make the other parameters in this struct configurable.\n  generator_parameters.use_system_headers = opts.grpc_use_system_headers;\n  generator_parameters.message_header_extension = suffix;\n  generator_parameters.service_header_extension =\n      \".grpc\" + opts.grpc_filename_suffix + \".h\";\n  generator_parameters.grpc_search_path = opts.grpc_search_path;\n  generator_parameters.generate_callback_api = opts.grpc_callback_api;\n  std::string filename = flatbuffers::StripExtension(parser.file_being_parsed_);\n  if (!opts.keep_prefix) {\n    filename = flatbuffers::StripPath(filename);\n  }\n  FlatBufFile fbfile(parser, filename, FlatBufFile::kLanguageCpp);\n\n  std::string header_code =\n      grpc_cpp_generator::GetHeaderPrologue(&fbfile, generator_parameters) +\n      grpc_cpp_generator::GetHeaderIncludes(&fbfile, generator_parameters) +\n      grpc_cpp_generator::GetHeaderServices(&fbfile, generator_parameters) +\n      grpc_cpp_generator::GetHeaderEpilogue(&fbfile, generator_parameters);\n\n  std::string source_code =\n      grpc_cpp_generator::GetSourcePrologue(&fbfile, generator_parameters) +\n      grpc_cpp_generator::GetSourceIncludes(&fbfile, generator_parameters) +\n      grpc_cpp_generator::GetSourceServices(&fbfile, generator_parameters) +\n      grpc_cpp_generator::GetSourceEpilogue(&fbfile, generator_parameters);\n\n  return parser.opts.file_saver->SaveFile(\n             (path + file_name + \".grpc\" + opts.grpc_filename_suffix + \".h\")\n                 .c_str(),\n             header_code, false) &&\n         parser.opts.file_saver->SaveFile(\n             (path + file_name + \".grpc\" + opts.grpc_filename_suffix + \".cc\")\n                 .c_str(),\n             source_code, false);\n}\n\nclass JavaGRPCGenerator : public flatbuffers::BaseGenerator {\n public:\n  JavaGRPCGenerator(const Parser& parser, const std::string& path,\n                    const std::string& file_name)\n      : BaseGenerator(parser, path, file_name, \"\", \".\" /*separator*/, \"java\") {}\n\n  bool generate() {\n    FlatBufFile file(parser_, file_name_, FlatBufFile::kLanguageJava);\n    grpc_java_generator::Parameters p;\n    for (int i = 0; i < file.service_count(); i++) {\n      auto service = file.service(i);\n      const Definition* def = parser_.services_.vec[i];\n      p.package_name =\n          def->defined_namespace->GetFullyQualifiedName(\"\");  // file.package();\n      std::string output =\n          grpc_java_generator::GenerateServiceSource(&file, service.get(), &p);\n      std::string filename =\n          NamespaceDir(*def->defined_namespace) + def->name + \"Grpc.java\";\n      if (!parser_.opts.file_saver->SaveFile(filename.c_str(), output, false))\n        return false;\n    }\n    return true;\n  }\n};\n\nbool GenerateJavaGRPC(const Parser& parser, const std::string& path,\n                      const std::string& file_name) {\n  int nservices = 0;\n  for (auto it = parser.services_.vec.begin(); it != parser.services_.vec.end();\n       ++it) {\n    if (!(*it)->generated) nservices++;\n  }\n  if (!nservices) return true;\n  return JavaGRPCGenerator(parser, path, file_name).generate();\n}\n\nbool GeneratePythonGRPC(const Parser& parser, const std::string& path,\n                        const std::string& /*file_name*/) {\n  int nservices = 0;\n  for (auto it = parser.services_.vec.begin(); it != parser.services_.vec.end();\n       ++it) {\n    if (!(*it)->generated) nservices++;\n  }\n  if (!nservices) return true;\n\n  flatbuffers::python::Version version{parser.opts.python_version};\n  if (!version.IsValid()) return false;\n\n  if (!flatbuffers::python::grpc::Generate(parser, path, version)) {\n    return false;\n  }\n  if (parser.opts.python_typing) {\n    return flatbuffers::python::grpc::GenerateStub(parser, path, version);\n  }\n  return true;\n}\n\nclass SwiftGRPCGenerator : public flatbuffers::BaseGenerator {\n private:\n  CodeWriter code_;\n\n public:\n  SwiftGRPCGenerator(const Parser& parser, const std::string& path,\n                     const std::string& filename)\n      : BaseGenerator(parser, path, filename, \"\", \"\" /*Unused*/, \"swift\") {}\n\n  bool generate() {\n    code_.Clear();\n    code_ += \"// Generated GRPC code for FlatBuffers swift!\";\n    code_ += grpc_swift_generator::GenerateHeader();\n    FlatBufFile file(parser_, file_name_, FlatBufFile::kLanguageSwift);\n    for (int i = 0; i < file.service_count(); i++) {\n      auto service = file.service(i);\n      code_ += grpc_swift_generator::Generate(&file, service.get());\n    }\n    const auto final_code = code_.ToString();\n    const auto filename = GeneratedFileName(path_, file_name_);\n    return parser_.opts.file_saver->SaveFile(filename.c_str(), final_code,\n                                             false);\n  }\n\n  static std::string GeneratedFileName(const std::string& path,\n                                       const std::string& file_name) {\n    return path + file_name + \".grpc.swift\";\n  }\n};\n\nbool GenerateSwiftGRPC(const Parser& parser, const std::string& path,\n                       const std::string& file_name) {\n  int nservices = 0;\n  for (auto it = parser.services_.vec.begin(); it != parser.services_.vec.end();\n       ++it) {\n    if (!(*it)->generated) nservices++;\n  }\n  if (!nservices) return true;\n  return SwiftGRPCGenerator(parser, path, file_name).generate();\n}\n\nclass TSGRPCGenerator : public flatbuffers::BaseGenerator {\n private:\n  CodeWriter code_;\n\n public:\n  TSGRPCGenerator(const Parser& parser, const std::string& path,\n                  const std::string& filename)\n      : BaseGenerator(parser, path, filename, \"\", \"\" /*Unused*/, \"ts\") {}\n\n  bool generate() {\n    code_.Clear();\n    FlatBufFile file(parser_, file_name_, FlatBufFile::kLanguageTS);\n\n    for (int i = 0; i < file.service_count(); i++) {\n      auto service = file.service(i);\n      code_ += grpc_ts_generator::Generate(&file, service.get(), file_name_);\n      const auto ts_name = GeneratedFileName(path_, file_name_);\n      if (!parser_.opts.file_saver->SaveFile(ts_name.c_str(), code_.ToString(),\n                                             false))\n        return false;\n\n      code_.Clear();\n      code_ += grpc_ts_generator::GenerateInterface(&file, service.get(),\n                                                    file_name_);\n      const auto ts_interface_name = GeneratedFileName(path_, file_name_, true);\n      if (!parser_.opts.file_saver->SaveFile(ts_interface_name.c_str(),\n                                             code_.ToString(), false))\n        return false;\n    }\n    return true;\n  }\n\n  static std::string GeneratedFileName(const std::string& path,\n                                       const std::string& file_name,\n                                       const bool is_interface = false) {\n    if (is_interface) return path + file_name + \"_grpc.d.ts\";\n    return path + file_name + \"_grpc.js\";\n  }\n};\n\nbool GenerateTSGRPC(const Parser& parser, const std::string& path,\n                    const std::string& file_name) {\n  int nservices = 0;\n  for (auto it = parser.services_.vec.begin(); it != parser.services_.vec.end();\n       ++it) {\n    if (!(*it)->generated) nservices++;\n  }\n  if (!nservices) return true;\n  return TSGRPCGenerator(parser, path, file_name).generate();\n}\n\n}  // namespace flatbuffers\n\n#if defined(_MSC_VER)\n#pragma warning(pop)\n#endif\n"
  },
  {
    "path": "src/idl_gen_java.cpp",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// independent from idl_parser, since this code is not needed for most clients\n\n#include \"idl_gen_java.h\"\n\n#include \"flatbuffers/code_generators.h\"\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/idl.h\"\n#include \"flatbuffers/util.h\"\n#include \"idl_namer.h\"\n\nnamespace flatbuffers {\nnamespace java {\n\nnamespace {\n\nstatic Namer::Config JavaDefaultConfig() {\n  return {\n      /*types=*/Case::kKeep,\n      /*constants=*/Case::kScreamingSnake,\n      /*methods=*/Case::kLowerCamel,\n      /*functions=*/Case::kLowerCamel,\n      /*fields=*/Case::kLowerCamel,\n      /*variables=*/Case::kLowerCamel,\n      /*variants=*/Case::kKeep,\n      /*enum_variant_seperator=*/\".\",\n      /*escape_keywords=*/Namer::Config::Escape::AfterConvertingCase,\n      /*namespaces=*/Case::kKeep,\n      /*namespace_seperator=*/\".\",\n      /*object_prefix=*/\"\",\n      /*object_suffix=*/\"T\",\n      /*keyword_prefix=*/\"\",\n      /*keyword_suffix=*/\"_\",\n      /*keywords_casing=*/Namer::Config::KeywordsCasing::CaseSensitive,\n      /*filenames=*/Case::kKeep,\n      /*directories=*/Case::kKeep,\n      /*output_path=*/\"\",\n      /*filename_suffix=*/\"_generated\",\n      /*filename_extension=*/\".java\",\n  };\n}\n\nstatic std::set<std::string> JavaKeywords() {\n  return {\n      \"abstract\",   \"assert\",    \"boolean\",      \"break\",      \"byte\",\n      \"case\",       \"catch\",     \"char\",         \"class\",      \"const\",\n      \"continue\",   \"default\",   \"do\",           \"double\",     \"else\",\n      \"enum\",       \"extends\",   \"final\",        \"finally\",    \"float\",\n      \"for\",        \"goto\",      \"if\",           \"implements\", \"import\",\n      \"instanceof\", \"int\",       \"interface\",    \"long\",       \"native\",\n      \"new\",        \"notify\",    \"package\",      \"private\",    \"protected\",\n      \"public\",     \"return\",    \"short\",        \"static\",     \"strictfp\",\n      \"super\",      \"switch\",    \"synchronized\", \"this\",       \"throw\",\n      \"throws\",     \"transient\", \"try\",          \"void\",       \"volatile\",\n      \"while\",\n  };\n}\n\nstatic const TypedFloatConstantGenerator JavaFloatGen(\"Double.\", \"Float.\",\n                                                      \"NaN\",\n                                                      \"POSITIVE_INFINITY\",\n                                                      \"NEGATIVE_INFINITY\");\n\nstatic const CommentConfig comment_config = {\n    \"/**\",\n    \" *\",\n    \" */\",\n};\n\n}  // namespace\n\nclass JavaGenerator : public BaseGenerator {\n  struct FieldArrayLength {\n    std::string name;\n    int length;\n  };\n\n public:\n  JavaGenerator(const Parser& parser, const std::string& path,\n                const std::string& file_name, const std::string& package_prefix)\n      : BaseGenerator(parser, path, file_name, \"\", \".\", \"java\"),\n        cur_name_space_(nullptr),\n        namer_(WithFlagOptions(JavaDefaultConfig(), parser.opts, path),\n               JavaKeywords()) {\n    if (!package_prefix.empty()) {\n      std::istringstream iss(package_prefix);\n      std::string component;\n      while (std::getline(iss, component, '.')) {\n        package_prefix_ns_.components.push_back(component);\n      }\n      package_prefix_ = package_prefix_ns_.GetFullyQualifiedName(\"\") + \".\";\n    }\n  }\n\n  JavaGenerator& operator=(const JavaGenerator&);\n  bool generate() {\n    std::string one_file_code;\n    cur_name_space_ = parser_.current_namespace_;\n\n    for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end();\n         ++it) {\n      std::string enumcode;\n      auto& enum_def = **it;\n      if (!parser_.opts.one_file) cur_name_space_ = enum_def.defined_namespace;\n      GenEnum(enum_def, enumcode);\n      if (parser_.opts.one_file) {\n        one_file_code += enumcode;\n      } else {\n        if (!SaveType(enum_def.name, *enum_def.defined_namespace, enumcode,\n                      /* needs_includes= */ false))\n          return false;\n      }\n\n      if (parser_.opts.generate_object_based_api && enum_def.is_union) {\n        enumcode = \"\";\n        GenEnum_ObjectAPI(enum_def, enumcode);\n        auto class_name = namer_.Type(enum_def) + \"Union\";\n        if (parser_.opts.one_file) {\n          one_file_code += enumcode;\n        } else {\n          if (!SaveType(class_name, *enum_def.defined_namespace, enumcode,\n                        /* needs_includes= */ false))\n            return false;\n        }\n      }\n    }\n\n    for (auto it = parser_.structs_.vec.begin();\n         it != parser_.structs_.vec.end(); ++it) {\n      std::string declcode;\n      auto& struct_def = **it;\n      if (!parser_.opts.one_file)\n        cur_name_space_ = struct_def.defined_namespace;\n      GenStruct(struct_def, declcode, parser_.opts);\n      if (parser_.opts.one_file) {\n        one_file_code += declcode;\n      } else {\n        if (!SaveType(struct_def.name, *struct_def.defined_namespace, declcode,\n                      /* needs_includes= */ true))\n          return false;\n      }\n\n      if (parser_.opts.generate_object_based_api) {\n        declcode = \"\";\n        GenStruct_ObjectAPI(struct_def, declcode);\n        auto class_name = namer_.ObjectType(struct_def);\n        if (parser_.opts.one_file) {\n          one_file_code += declcode;\n        } else {\n          if (!SaveType(class_name, *struct_def.defined_namespace, declcode,\n                        /* needs_includes= */ true))\n            return false;\n        }\n      }\n    }\n\n    if (parser_.opts.one_file) {\n      return SaveType(file_name_, *parser_.current_namespace_, one_file_code,\n                      /* needs_includes= */ true);\n    }\n    return true;\n  }\n\n  // Save out the generated code for a single class while adding\n  // declaration boilerplate.\n  bool SaveType(const std::string& defname, const Namespace& ns,\n                const std::string& classcode, bool needs_includes) const {\n    if (!classcode.length()) return true;\n\n    std::string code;\n    code = \"// \" + std::string(FlatBuffersGeneratedWarning()) + \"\\n\\n\";\n\n    Namespace combined_ns = package_prefix_ns_;\n    std::copy(ns.components.begin(), ns.components.end(),\n              std::back_inserter(combined_ns.components));\n\n    const std::string namespace_name = FullNamespace(\".\", combined_ns);\n    if (!namespace_name.empty()) {\n      code += \"package \" + namespace_name + \";\";\n      code += \"\\n\\n\";\n    }\n    if (needs_includes) {\n      code +=\n          \"import com.google.flatbuffers.BaseVector;\\n\"\n          \"import com.google.flatbuffers.BooleanVector;\\n\"\n          \"import com.google.flatbuffers.ByteVector;\\n\"\n          \"import com.google.flatbuffers.Constants;\\n\"\n          \"import com.google.flatbuffers.DoubleVector;\\n\"\n          \"import com.google.flatbuffers.FlatBufferBuilder;\\n\"\n          \"import com.google.flatbuffers.FloatVector;\\n\"\n          \"import com.google.flatbuffers.IntVector;\\n\"\n          \"import com.google.flatbuffers.LongVector;\\n\"\n          \"import com.google.flatbuffers.ShortVector;\\n\"\n          \"import com.google.flatbuffers.StringVector;\\n\"\n          \"import com.google.flatbuffers.Struct;\\n\"\n          \"import com.google.flatbuffers.UnionVector;\\n\"\n          \"import java.nio.ByteBuffer;\\n\"\n          \"import java.nio.ByteOrder;\\n\";\n      if (parser_.opts.gen_nullable) {\n        code += \"\\nimport javax.annotation.Nullable;\\n\";\n      }\n      if (parser_.opts.java_checkerframework) {\n        code += \"\\nimport org.checkerframework.dataflow.qual.Pure;\\n\";\n      }\n      code += \"\\n\";\n    }\n\n    code += classcode;\n    if (!namespace_name.empty()) code += \"\";\n    const std::string dirs = namer_.Directories(combined_ns);\n    EnsureDirExists(dirs);\n    const std::string filename =\n        dirs + namer_.File(defname, /*skips=*/SkipFile::Suffix);\n    return parser_.opts.file_saver->SaveFile(filename.c_str(), code, false);\n  }\n\n  const Namespace* CurrentNameSpace() const { return cur_name_space_; }\n\n  std::string GenNullableAnnotation(const Type& t) const {\n    return parser_.opts.gen_nullable &&\n                   !IsScalar(DestinationType(t, true).base_type) &&\n                   t.base_type != BASE_TYPE_VECTOR\n               ? \" @Nullable \"\n               : \"\";\n  }\n\n  std::string GenPureAnnotation(const Type& t) const {\n    return parser_.opts.java_checkerframework &&\n                   !IsScalar(DestinationType(t, true).base_type)\n               ? \" @Pure \"\n               : \"\";\n  }\n\n  std::string GenTypeBasic(const Type& type) const {\n    // clang-format off\n    static const char * const java_typename[] = {\n      #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, JTYPE, ...) \\\n        #JTYPE,\n        FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)\n      #undef FLATBUFFERS_TD\n    };\n    // clang-format on\n    return java_typename[type.base_type];\n  }\n\n  std::string GenTypePointer(const Type& type) const {\n    switch (type.base_type) {\n      case BASE_TYPE_STRING:\n        return \"String\";\n      case BASE_TYPE_VECTOR:\n        return GenTypeGet(type.VectorType());\n      case BASE_TYPE_STRUCT:\n        return Prefixed(namer_.NamespacedType(*type.struct_def));\n      case BASE_TYPE_UNION:\n        FLATBUFFERS_FALLTHROUGH();  // else fall thru\n      default:\n        return \"com.google.flatbuffers.Table\";\n    }\n  }\n\n  std::string GenTypeGet(const Type& type) const {\n    return IsScalar(type.base_type)\n               ? GenTypeBasic(type)\n               : (IsArray(type) ? GenTypeGet(type.VectorType())\n                                : GenTypePointer(type));\n  }\n\n  // Find the destination type the user wants to receive the value in (e.g.\n  // one size higher signed types for unsigned serialized values in Java).\n  Type DestinationType(const Type& type, bool vectorelem) const {\n    switch (type.base_type) {\n      // We use int for both uchar/ushort, since that generally means less\n      // casting than using short for uchar.\n      case BASE_TYPE_UCHAR:\n        return Type(BASE_TYPE_INT);\n      case BASE_TYPE_USHORT:\n        return Type(BASE_TYPE_INT);\n      case BASE_TYPE_UINT:\n        return Type(BASE_TYPE_LONG);\n      case BASE_TYPE_ARRAY:\n      case BASE_TYPE_VECTOR:\n        if (vectorelem) return DestinationType(type.VectorType(), vectorelem);\n        FLATBUFFERS_FALLTHROUGH();  // else fall thru\n      default:\n        return type;\n    }\n  }\n\n  std::string GenOffsetType() const { return \"int\"; }\n\n  std::string GenOffsetConstruct(const std::string& variable_name) const {\n    return variable_name;\n  }\n\n  std::string GenVectorOffsetType() const { return \"int\"; }\n\n  // Generate destination type name\n  std::string GenTypeNameDest(const Type& type) const {\n    return GenTypeGet(DestinationType(type, true));\n  }\n\n  // Mask to turn serialized value into destination type value.\n  std::string DestinationMask(const Type& type, bool vectorelem) const {\n    switch (type.base_type) {\n      case BASE_TYPE_UCHAR:\n        return \" & 0xFF\";\n      case BASE_TYPE_USHORT:\n        return \" & 0xFFFF\";\n      case BASE_TYPE_UINT:\n        return \" & 0xFFFFFFFFL\";\n      case BASE_TYPE_VECTOR:\n        if (vectorelem) return DestinationMask(type.VectorType(), vectorelem);\n        FLATBUFFERS_FALLTHROUGH();  // else fall thru\n      default:\n        return \"\";\n    }\n  }\n\n  // Casts necessary to correctly read serialized data\n  std::string DestinationCast(const Type& type) const {\n    if (IsSeries(type)) {\n      return DestinationCast(type.VectorType());\n    } else {\n      // Cast necessary to correctly read serialized unsigned values.\n      if (type.base_type == BASE_TYPE_UINT) return \"(long)\";\n    }\n    return \"\";\n  }\n\n  // Cast statements for mutator method parameters.\n  // In Java, parameters representing unsigned numbers need to be cast down to\n  // their respective type. For example, a long holding an unsigned int value\n  // would be cast down to int before being put onto the buffer.\n  std::string SourceCast(const Type& type, bool castFromDest) const {\n    if (IsSeries(type)) {\n      return SourceCast(type.VectorType(), castFromDest);\n    } else {\n      if (castFromDest) {\n        if (type.base_type == BASE_TYPE_UINT)\n          return \"(int) \";\n        else if (type.base_type == BASE_TYPE_USHORT)\n          return \"(short) \";\n        else if (type.base_type == BASE_TYPE_UCHAR)\n          return \"(byte) \";\n      }\n    }\n    return \"\";\n  }\n\n  std::string SourceCast(const Type& type) const {\n    return SourceCast(type, true);\n  }\n\n  std::string SourceCastBasic(const Type& type, bool castFromDest) const {\n    return IsScalar(type.base_type) ? SourceCast(type, castFromDest) : \"\";\n  }\n\n  std::string SourceCastBasic(const Type& type) const {\n    return SourceCastBasic(type, true);\n  }\n\n  std::string GenEnumDefaultValue(const FieldDef& field) const {\n    auto& value = field.value;\n    FLATBUFFERS_ASSERT(value.type.enum_def);\n    auto& enum_def = *value.type.enum_def;\n    auto enum_val = enum_def.FindByValue(value.constant);\n    return enum_val\n               ? Prefixed(namer_.NamespacedEnumVariant(enum_def, *enum_val))\n               : value.constant;\n  }\n\n  std::string GenDefaultValue(const FieldDef& field) const {\n    auto& value = field.value;\n    auto constant = field.IsScalarOptional() ? \"0\" : value.constant;\n    auto longSuffix = \"L\";\n    switch (value.type.base_type) {\n      case BASE_TYPE_BOOL:\n        return constant == \"0\" ? \"false\" : \"true\";\n      case BASE_TYPE_ULONG: {\n        // Converts the ulong into its bits signed equivalent\n        uint64_t defaultValue = StringToUInt(constant.c_str());\n        return NumToString(static_cast<int64_t>(defaultValue)) + longSuffix;\n      }\n      case BASE_TYPE_UINT:\n      case BASE_TYPE_LONG:\n        return constant + longSuffix;\n      default:\n        if (IsFloat(value.type.base_type)) {\n          if (field.IsScalarOptional()) {\n            return value.type.base_type == BASE_TYPE_DOUBLE ? \"0.0\" : \"0f\";\n          }\n          return JavaFloatGen.GenFloatConstant(field);\n        } else {\n          return constant;\n        }\n    }\n  }\n\n  std::string GenDefaultValueBasic(const FieldDef& field) const {\n    auto& value = field.value;\n    if (!IsScalar(value.type.base_type)) {\n      return \"0\";\n    }\n    return GenDefaultValue(field);\n  }\n\n  void GenEnum(EnumDef& enum_def, std::string& code) const {\n    if (enum_def.generated) return;\n\n    // Generate enum definitions of the form:\n    // public static (final) int name = value;\n    // In Java, we use ints rather than the Enum feature, because we want them\n    // to map directly to how they're used in C/C++ and file formats.\n    // That, and Java Enums are expensive, and not universally liked.\n    GenComment(enum_def.doc_comment, &code, &comment_config);\n\n    code += \"@SuppressWarnings(\\\"unused\\\")\\n\";\n    if (enum_def.attributes.Lookup(\"private\")) {\n      // For Java, we leave the enum unmarked to indicate package-private\n    } else {\n      code += \"public \";\n    }\n    code += \"final class \" + namer_.Type(enum_def);\n    code += \" {\\n\";\n    code += \"  private \" + namer_.Type(enum_def) + \"() { }\\n\";\n    for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {\n      auto& ev = **it;\n      GenComment(ev.doc_comment, &code, &comment_config, \"  \");\n      code += \"  public static final \";\n      code += GenTypeBasic(DestinationType(enum_def.underlying_type, false));\n      code += \" \";\n      code += namer_.Variant(ev) + \" = \";\n      code += enum_def.ToString(ev);\n      if (enum_def.underlying_type.base_type == BASE_TYPE_UINT ||\n          enum_def.underlying_type.base_type == BASE_TYPE_LONG ||\n          enum_def.underlying_type.base_type == BASE_TYPE_ULONG) {\n        code += \"L\";\n      }\n      code += \";\\n\";\n    }\n\n    // Generate a string table for enum values.\n    // Problem is, if values are very sparse that could generate really big\n    // tables. Ideally in that case we generate a map lookup instead, but for\n    // the moment we simply don't output a table at all.\n    auto range = enum_def.Distance();\n    // Average distance between values above which we consider a table\n    // \"too sparse\". Change at will.\n    static const uint64_t kMaxSparseness = 5;\n    if (range / static_cast<uint64_t>(enum_def.size()) < kMaxSparseness &&\n        GenTypeBasic(DestinationType(enum_def.underlying_type, false)) !=\n            \"long\") {\n      code += \"\\n  public static final String\";\n      code += \"[] names = { \";\n      const EnumVal* prev = enum_def.Vals().front();\n      for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end();\n           ++it) {\n        const EnumVal& ev = **it;\n        for (auto k = enum_def.Distance(prev, &ev); k > 1; --k)\n          code += \"\\\"\\\", \";\n        prev = &ev;\n        code += \"\\\"\" + namer_.Variant(ev) + \"\\\", \";\n      }\n      code += \"};\\n\\n\";\n      code += \"  public static \";\n      code += \"String\";\n      code += \" name\";\n      code += \"(int e) { return names[e\";\n      if (enum_def.MinValue()->IsNonZero())\n        code += \" - \" + namer_.Variant(enum_def.MinValue()->name);\n      code += \"]; }\\n\";\n    }\n\n    // Close the class\n    code += \"}\\n\\n\";\n  }\n\n  // Returns the function name that is able to read a value of the given type.\n  std::string GenGetter(const Type& type) const {\n    switch (type.base_type) {\n      case BASE_TYPE_STRING:\n        return \"__string\";\n      case BASE_TYPE_STRUCT:\n        return \"__struct\";\n      case BASE_TYPE_UNION:\n        return \"__union\";\n      case BASE_TYPE_VECTOR:\n        return GenGetter(type.VectorType());\n      case BASE_TYPE_ARRAY:\n        return GenGetter(type.VectorType());\n      default: {\n        std::string getter = \"bb.get\";\n        if (type.base_type == BASE_TYPE_BOOL) {\n          getter = \"0!=\" + getter;\n        } else if (GenTypeBasic(type) != \"byte\") {\n          getter += ConvertCase(GenTypeBasic(type), Case::kUpperCamel);\n        }\n        return getter;\n      }\n    }\n  }\n\n  // Returns the function name that is able to read a value of the given type.\n  std::string GenGetterForLookupByKey(flatbuffers::FieldDef* key_field,\n                                      const std::string& data_buffer,\n                                      const char* num = nullptr) const {\n    auto type = key_field->value.type;\n    auto dest_mask = DestinationMask(type, true);\n    auto dest_cast = DestinationCast(type);\n    auto getter = data_buffer + \".get\";\n    if (GenTypeBasic(type) != \"byte\") {\n      getter += ConvertCase(GenTypeBasic(type), Case::kUpperCamel);\n    }\n    getter = dest_cast + getter + \"(\" + GenOffsetGetter(key_field, num) + \")\" +\n             dest_mask;\n    return getter;\n  }\n\n  // Direct mutation is only allowed for scalar fields.\n  // Hence a setter method will only be generated for such fields.\n  std::string GenSetter(const Type& type) const {\n    if (IsScalar(type.base_type)) {\n      std::string setter = \"bb.put\";\n      if (GenTypeBasic(type) != \"byte\" && type.base_type != BASE_TYPE_BOOL) {\n        setter += ConvertCase(GenTypeBasic(type), Case::kUpperCamel);\n      }\n      return setter;\n    } else {\n      return \"\";\n    }\n  }\n\n  // Returns the method name for use with add/put calls.\n  std::string GenMethod(const Type& type) const {\n    return IsScalar(type.base_type)\n               ? ConvertCase(GenTypeBasic(type), Case::kUpperCamel)\n               : (IsStruct(type) ? \"Struct\" : \"Offset\");\n  }\n\n  // Recursively generate arguments for a constructor, to deal with nested\n  // structs.\n  void GenStructArgs(const StructDef& struct_def, std::string& code,\n                     const char* nameprefix, size_t array_count = 0) const {\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      const auto& field_type = field.value.type;\n      const auto array_field = IsArray(field_type);\n      const auto& type = array_field ? field_type.VectorType()\n                                     : DestinationType(field_type, false);\n      const auto array_cnt = array_field ? (array_count + 1) : array_count;\n      if (IsStruct(type)) {\n        // Generate arguments for a struct inside a struct. To ensure names\n        // don't clash, and to make it obvious these arguments are constructing\n        // a nested struct, prefix the name with the field name.\n        GenStructArgs(*field_type.struct_def, code,\n                      (nameprefix + (field.name + \"_\")).c_str(), array_cnt);\n      } else {\n        code += \", \";\n        code += GenTypeNameDest(field.value.type);\n        for (size_t i = 0; i < array_cnt; i++) code += \"[]\";\n        code += \" \";\n        code += nameprefix;\n        code += namer_.Field(field);\n      }\n    }\n  }\n\n  // Recusively generate struct construction statements of the form:\n  // builder.putType(name);\n  // and insert manual padding.\n  void GenStructBody(const StructDef& struct_def, std::string& code,\n                     const char* nameprefix, size_t index = 0,\n                     bool in_array = false) const {\n    std::string indent((index + 1) * 2, ' ');\n    code += indent + \"  builder.prep(\";\n    code += NumToString(struct_def.minalign) + \", \";\n    code += NumToString(struct_def.bytesize) + \");\\n\";\n    for (auto it = struct_def.fields.vec.rbegin();\n         it != struct_def.fields.vec.rend(); ++it) {\n      auto& field = **it;\n      const auto& field_type = field.value.type;\n      if (field.padding) {\n        code += indent + \"  builder.pad(\";\n        code += NumToString(field.padding) + \");\\n\";\n      }\n      if (IsStruct(field_type)) {\n        GenStructBody(*field_type.struct_def, code,\n                      (nameprefix + (field.name + \"_\")).c_str(), index,\n                      in_array);\n      } else {\n        const auto& type =\n            IsArray(field_type) ? field_type.VectorType() : field_type;\n        const auto index_var = \"_idx\" + NumToString(index);\n        if (IsArray(field_type)) {\n          code += indent + \"  for (int \" + index_var + \" = \";\n          code += NumToString(field_type.fixed_length);\n          code += \"; \" + index_var + \" > 0; \" + index_var + \"--) {\\n\";\n          in_array = true;\n        }\n        if (IsStruct(type)) {\n          GenStructBody(*field_type.struct_def, code,\n                        (nameprefix + (field.name + \"_\")).c_str(), index + 1,\n                        in_array);\n        } else {\n          code += IsArray(field_type) ? \"  \" : \"\";\n          code += indent + \"  builder.put\";\n          code += GenMethod(type) + \"(\";\n          code += SourceCast(type);\n          auto argname = nameprefix + namer_.Variable(field);\n          code += argname;\n          size_t array_cnt = index + (IsArray(field_type) ? 1 : 0);\n          for (size_t i = 0; in_array && i < array_cnt; i++) {\n            code += \"[_idx\" + NumToString(i) + \"-1]\";\n          }\n          code += \");\\n\";\n        }\n        if (IsArray(field_type)) {\n          code += indent + \"  }\\n\";\n        }\n      }\n    }\n  }\n\n  std::string GenOffsetGetter(flatbuffers::FieldDef* key_field,\n                              const char* num = nullptr) const {\n    std::string key_offset = \"\";\n    key_offset += \"__offset(\" + NumToString(key_field->value.offset) + \", \";\n    if (num) {\n      key_offset += num;\n      key_offset += \", _bb)\";\n    } else {\n      key_offset += \"bb.capacity()\";\n      key_offset += \" - tableOffset, bb)\";\n    }\n    return key_offset;\n  }\n\n  std::string GenLookupKeyGetter(flatbuffers::FieldDef* key_field) const {\n    std::string key_getter = \"      \";\n    key_getter += \"int tableOffset = \";\n    key_getter += \"__indirect(vectorLocation + 4 * (start + middle)\";\n    key_getter += \", bb);\\n      \";\n    if (IsString(key_field->value.type)) {\n      key_getter += \"int comp = \";\n      key_getter += \"compareStrings(\";\n      key_getter += GenOffsetGetter(key_field);\n      key_getter += \", byteKey, bb);\\n\";\n    } else {\n      auto get_val = GenGetterForLookupByKey(key_field, \"bb\");\n      key_getter += GenTypeNameDest(key_field->value.type) + \" val = \";\n      key_getter += get_val + \";\\n\";\n      key_getter += \"      int comp = val > key ? 1 : val < key ? -1 : 0;\\n\";\n    }\n    return key_getter;\n  }\n\n  std::string GenKeyGetter(flatbuffers::FieldDef* key_field) const {\n    std::string key_getter = \"\";\n    auto data_buffer = \"_bb\";\n    if (IsString(key_field->value.type)) {\n      key_getter += \" return \";\n      key_getter += \"\";\n      key_getter += \"compareStrings(\";\n      key_getter += GenOffsetGetter(key_field, \"o1\") + \", \";\n      key_getter += GenOffsetGetter(key_field, \"o2\") + \", \" + data_buffer + \")\";\n      key_getter += \";\";\n    } else {\n      auto field_getter = GenGetterForLookupByKey(key_field, data_buffer, \"o1\");\n      key_getter +=\n          \"\\n    \" + GenTypeNameDest(key_field->value.type) + \" val_1 = \";\n      key_getter +=\n          field_getter + \";\\n    \" + GenTypeNameDest(key_field->value.type);\n      key_getter += \" val_2 = \";\n      field_getter = GenGetterForLookupByKey(key_field, data_buffer, \"o2\");\n      key_getter += field_getter + \";\\n\";\n      key_getter += \"    return val_1 > val_2 ? 1 : val_1 < val_2 ? -1 : 0;\\n \";\n    }\n    return key_getter;\n  }\n\n  void GenStruct(StructDef& struct_def, std::string& code,\n                 const IDLOptions& opts) const {\n    if (struct_def.generated) return;\n\n    // Generate a struct accessor class, with methods of the form:\n    // public type name() { return bb.getType(i + offset); }\n    // or for tables of the form:\n    // public type name() {\n    //   int o = __offset(offset); return o != 0 ? bb.getType(o + i) : default;\n    // }\n    GenComment(struct_def.doc_comment, &code, &comment_config);\n\n    if (parser_.opts.gen_generated) {\n      code += \"@javax.annotation.Generated(value=\\\"flatc\\\")\\n\";\n    }\n    code += \"@SuppressWarnings(\\\"unused\\\")\\n\";\n    if (struct_def.attributes.Lookup(\"private\")) {\n      // For Java, we leave the struct unmarked to indicate package-private\n    } else {\n      code += \"public \";\n    }\n    const auto struct_class = namer_.Type(struct_def);\n    code += \"final class \" + struct_class;\n    code += \" extends \";\n    code += struct_def.fixed ? \"Struct\" : \"com.google.flatbuffers.Table\";\n    code += \" {\\n\";\n\n    if (!struct_def.fixed) {\n      // Generate version check method.\n      // Force compile time error if not using the same version runtime.\n      code += \"  public static void ValidateVersion() {\";\n      code += \" Constants.\";\n      code += \"FLATBUFFERS_25_12_19(); \";\n      code += \"}\\n\";\n\n      // Generate a special accessor for the table that when used as the root\n      // of a FlatBuffer\n      const std::string method_name =\n          namer_.LegacyJavaMethod2(\"getRootAs\", struct_def, \"\");\n      const std::string method_signature =\n          \"  public static \" + struct_class + \" \" + method_name;\n\n      // create convenience method that doesn't require an existing object\n      code += method_signature + \"(ByteBuffer _bb) \";\n      code +=\n          \"{ return \" + method_name + \"(_bb, new \" + struct_class + \"()); }\\n\";\n\n      // create method that allows object reuse\n      code +=\n          method_signature + \"(ByteBuffer _bb, \" + struct_class + \" obj) { \";\n      code += \"_bb.order(ByteOrder.LITTLE_ENDIAN); \";\n      code += \"return (obj.__assign(_bb.getInt(_bb.\";\n      code += \"position()\";\n      code += \") + _bb.\";\n      code += \"position()\";\n      code += \", _bb)); }\\n\";\n      if (parser_.root_struct_def_ == &struct_def) {\n        if (parser_.file_identifier_.length()) {\n          // Check if a buffer has the identifier.\n          code += \"  public static \";\n          code += \"boolean \" +\n                  namer_.LegacyJavaMethod2(\n                      \"\", struct_def, \"BufferHasIdentifier(ByteBuffer _bb)\") +\n                  \" { return \";\n          code += \"__has_identifier(_bb, \\\"\";\n          code += parser_.file_identifier_;\n          code += \"\\\"); }\\n\";\n        }\n      }\n    }\n    // Generate the __init method that sets the field in a pre-existing\n    // accessor object. This is to allow object reuse.\n    code += \"  public void __init(int _i, ByteBuffer _bb) \";\n    code += \"{ \";\n    code += \"__reset(_i, _bb); \";\n    code += \"}\\n\";\n    code += \"  public \" + struct_class + \" __assign(int _i, ByteBuffer _bb) \";\n    code += \"{ __init(_i, _bb); return this; }\\n\\n\";\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (field.deprecated) continue;\n      GenComment(field.doc_comment, &code, &comment_config, \"  \");\n      const std::string type_name = GenTypeGet(field.value.type);\n      const std::string type_name_dest = GenTypeNameDest(field.value.type);\n      const std::string dest_mask = DestinationMask(field.value.type, true);\n      const std::string dest_cast = DestinationCast(field.value.type);\n      const std::string src_cast = SourceCast(field.value.type);\n      const std::string method_start =\n          \"  public \" +\n          (field.IsRequired() ? \"\" : GenNullableAnnotation(field.value.type)) +\n          GenPureAnnotation(field.value.type) + type_name_dest + \" \" +\n          namer_.Field(field);\n      const std::string obj = \"obj\";\n\n      // Most field accessors need to retrieve and test the field offset first,\n      // this is the prefix code for that:\n      auto offset_prefix =\n          IsArray(field.value.type)\n              ? \" { return \"\n              : (\" { int o = __offset(\" + NumToString(field.value.offset) +\n                 \"); return o != 0 ? \");\n      // Generate the accessors that don't do object reuse.\n      if (field.value.type.base_type == BASE_TYPE_STRUCT) {\n        // Calls the accessor that takes an accessor object with a new object.\n        code += method_start + \"() { return \";\n        code += namer_.Field(field);\n        code += \"(new \";\n        code += type_name + \"()); }\\n\";\n      } else if (IsSeries(field.value.type) &&\n                 field.value.type.element == BASE_TYPE_STRUCT) {\n        // Accessors for vectors of structs also take accessor objects, this\n        // generates a variant without that argument.\n        code += method_start + \"(int j) { return \";\n        code += namer_.Field(field);\n        code += \"(new \" + type_name + \"(), j); }\\n\";\n      }\n\n      if (field.IsScalarOptional()) {\n        code += GenOptionalScalarCheck(field);\n      }\n      std::string getter = dest_cast + GenGetter(field.value.type);\n      code += method_start;\n      std::string member_suffix = \"; \";\n      if (IsScalar(field.value.type.base_type)) {\n        code += \"()\";\n        member_suffix += \"\";\n        if (struct_def.fixed) {\n          code += \" { return \" + getter;\n          code += \"(bb_pos + \";\n          code += NumToString(field.value.offset) + \")\";\n          code += dest_mask;\n        } else {\n          code += offset_prefix + getter;\n          code += \"(o + bb_pos)\" + dest_mask;\n          code += \" : \";\n          code += GenDefaultValue(field);\n        }\n      } else {\n        switch (field.value.type.base_type) {\n          case BASE_TYPE_STRUCT:\n            code += \"(\" + type_name + \" obj)\";\n            if (struct_def.fixed) {\n              code += \" { return \" + obj + \".__assign(\";\n              code += \"bb_pos + \" + NumToString(field.value.offset) + \", \";\n              code += \"bb)\";\n            } else {\n              code += offset_prefix;\n              code += obj + \".__assign(\";\n              code += field.value.type.struct_def->fixed\n                          ? \"o + bb_pos\"\n                          : \"__indirect(o + bb_pos)\";\n              code += \", bb) : null\";\n            }\n            break;\n          case BASE_TYPE_STRING:\n            code += \"()\";\n            member_suffix += \"\";\n            code += offset_prefix + getter + \"(o + \";\n            code += \"bb_pos) : null\";\n            break;\n          case BASE_TYPE_ARRAY:\n            FLATBUFFERS_FALLTHROUGH();  // fall thru\n          case BASE_TYPE_VECTOR: {\n            auto vectortype = field.value.type.VectorType();\n            code += \"(\";\n            if (vectortype.base_type == BASE_TYPE_STRUCT) {\n              code += type_name + \" obj, \";\n              getter = obj + \".__assign\";\n            } else if (vectortype.base_type == BASE_TYPE_UNION) {\n              code += type_name + \" obj, \";\n            }\n            code += \"int j)\";\n            const auto body = offset_prefix + getter + \"(\";\n            if (vectortype.base_type == BASE_TYPE_UNION) {\n              code += body + \"obj, \";\n            } else {\n              code += body;\n            }\n            std::string index;\n            if (IsArray(field.value.type)) {\n              index += \"bb_pos + \" + NumToString(field.value.offset) + \" + \";\n            } else {\n              index += \"__vector(o) + \";\n            }\n            index += \"j * \" + NumToString(InlineSize(vectortype));\n            if (vectortype.base_type == BASE_TYPE_STRUCT) {\n              code += vectortype.struct_def->fixed\n                          ? index\n                          : \"__indirect(\" + index + \")\";\n              code += \", bb\";\n            } else {\n              code += index;\n            }\n            code += \")\" + dest_mask;\n            if (!IsArray(field.value.type)) {\n              code += \" : \";\n              code += field.value.type.element == BASE_TYPE_BOOL\n                          ? \"false\"\n                          : (IsScalar(field.value.type.element) ? \"0\" : \"null\");\n            }\n\n            break;\n          }\n          case BASE_TYPE_UNION:\n            code += \"(\" + type_name + \" obj)\" + offset_prefix + getter;\n            code += \"(obj, o + bb_pos) : null\";\n            break;\n          default:\n            FLATBUFFERS_ASSERT(0);\n        }\n      }\n      code += member_suffix;\n      code += \"}\\n\";\n      if (IsVector(field.value.type)) {\n        code += \"  public int \" + namer_.Field(field);\n        code += \"Length\";\n        code += \"()\";\n        code += offset_prefix;\n        code += \"__vector_len(o) : 0; \";\n        code += \"\";\n        code += \"}\\n\";\n        // See if we should generate a by-key accessor.\n        if (field.value.type.element == BASE_TYPE_STRUCT &&\n            !field.value.type.struct_def->fixed) {\n          auto& sd = *field.value.type.struct_def;\n          auto& fields = sd.fields.vec;\n          for (auto kit = fields.begin(); kit != fields.end(); ++kit) {\n            auto& key_field = **kit;\n            if (key_field.key) {\n              auto qualified_name = Prefixed(namer_.NamespacedType(sd));\n              code += \"  public \" + qualified_name + \" \";\n              code += namer_.Method(field) + \"ByKey(\";\n              code += GenTypeNameDest(key_field.value.type) + \" key)\";\n              code += offset_prefix;\n              code += qualified_name + \".__lookup_by_key(\";\n              code += \"null, \";\n              code += \"__vector(o), key, \";\n              code += \"bb) : null; \";\n              code += \"}\\n\";\n              code += \"  public \" + qualified_name + \" \";\n              code += namer_.Method(field) + \"ByKey(\";\n              code += qualified_name + \" obj, \";\n              code += GenTypeNameDest(key_field.value.type) + \" key)\";\n              code += offset_prefix;\n              code += qualified_name + \".__lookup_by_key(obj, \";\n              code += \"__vector(o), key, \";\n              code += \"bb) : null; \";\n              code += \"}\\n\";\n              break;\n            }\n          }\n        }\n      }\n      // Generate the accessors for vector of structs with vector access object\n      if (IsVector(field.value.type)) {\n        std::string vector_type_name;\n        const auto& element_base_type = field.value.type.VectorType().base_type;\n        if (IsScalar(element_base_type)) {\n          vector_type_name =\n              ConvertCase(type_name, Case::kUpperCamel) + \"Vector\";\n        } else if (element_base_type == BASE_TYPE_STRING) {\n          vector_type_name = \"StringVector\";\n        } else if (element_base_type == BASE_TYPE_UNION) {\n          vector_type_name = \"UnionVector\";\n        } else {\n          vector_type_name = type_name + \".Vector\";\n        }\n        auto vector_method_start = GenNullableAnnotation(field.value.type) +\n                                   \"  public \" + vector_type_name + \" \" +\n                                   namer_.Field(field, \"vector\");\n        code += vector_method_start + \"() { return \";\n        code += namer_.Field(field, \"vector\");\n        code += \"(new \" + vector_type_name + \"()); }\\n\";\n        code += vector_method_start + \"(\" + vector_type_name + \" obj)\";\n        code += offset_prefix + obj + \".__assign(\";\n        code += \"__vector(o), \";\n        if (!IsScalar(element_base_type)) {\n          auto vectortype = field.value.type.VectorType();\n          code += NumToString(InlineSize(vectortype)) + \", \";\n        }\n        code += \"bb) : null\" + member_suffix + \"}\\n\";\n      }\n      // Generate a ByteBuffer accessor for strings & vectors of scalars.\n      if ((IsVector(field.value.type) &&\n           IsScalar(field.value.type.VectorType().base_type)) ||\n          IsString(field.value.type)) {\n        code += \"  public ByteBuffer \";\n        code += namer_.Field(field);\n        code += \"AsByteBuffer() { return \";\n        code += \"__vector_as_bytebuffer(\";\n        code += NumToString(field.value.offset) + \", \";\n        code += NumToString(IsString(field.value.type)\n                                ? 1\n                                : InlineSize(field.value.type.VectorType()));\n        code += \"); }\\n\";\n        code += \"  public ByteBuffer \";\n        code += namer_.Field(field);\n        code += \"InByteBuffer(ByteBuffer _bb) { return \";\n        code += \"__vector_in_bytebuffer(_bb, \";\n        code += NumToString(field.value.offset) + \", \";\n        code += NumToString(IsString(field.value.type)\n                                ? 1\n                                : InlineSize(field.value.type.VectorType()));\n        code += \"); }\\n\";\n      }\n      // generate object accessors if is nested_flatbuffer\n      if (field.nested_flatbuffer) {\n        auto nested_type_name =\n            Prefixed(namer_.NamespacedType(*field.nested_flatbuffer));\n        auto nested_method_name =\n            namer_.Field(field) + \"As\" + field.nested_flatbuffer->name;\n        auto get_nested_method_name = nested_method_name;\n        code += \"  public \" + nested_type_name + \" \";\n        code += nested_method_name + \"() { return \";\n        code +=\n            get_nested_method_name + \"(new \" + nested_type_name + \"()); }\\n\";\n        code += \"  public \" + nested_type_name + \" \";\n        code += get_nested_method_name + \"(\";\n        code += nested_type_name + \" obj\";\n        code += \") { int o = __offset(\";\n        code += NumToString(field.value.offset) + \"); \";\n        code += \"return o != 0 ? \" + obj + \".__assign(\";\n        code += \"\";\n        code += \"__indirect(__vector(o)), \";\n        code += \"bb) : null; }\\n\";\n      }\n      // Generate mutators for scalar fields or vectors of scalars.\n      if (parser_.opts.mutable_buffer) {\n        auto is_series = (IsSeries(field.value.type));\n        const auto& underlying_type =\n            is_series ? field.value.type.VectorType() : field.value.type;\n        // Boolean parameters have to be explicitly converted to byte\n        // representation.\n        auto setter_parameter = underlying_type.base_type == BASE_TYPE_BOOL\n                                    ? \"(byte)(\" + field.name + \" ? 1 : 0)\"\n                                    : field.name;\n        // A vector mutator also needs the index of the vector element it should\n        // mutate.\n        auto mutator_params = (is_series ? \"(int j, \" : \"(\") +\n                              GenTypeNameDest(underlying_type) + \" \" +\n                              field.name + \") { \";\n        auto setter_index =\n            is_series\n                ? (IsArray(field.value.type)\n                       ? \"bb_pos + \" + NumToString(field.value.offset)\n                       : \"__vector(o)\") +\n                      +\" + j * \" + NumToString(InlineSize(underlying_type))\n                : (struct_def.fixed\n                       ? \"bb_pos + \" + NumToString(field.value.offset)\n                       : \"o + bb_pos\");\n        if (IsScalar(underlying_type.base_type) && !IsUnion(field.value.type)) {\n          code += \"  public \";\n          code += struct_def.fixed ? \"void \" : \"boolean \";\n          code += namer_.Method(\"mutate\", field);\n          code += mutator_params;\n          if (struct_def.fixed) {\n            code += GenSetter(underlying_type) + \"(\" + setter_index + \", \";\n            code += src_cast + setter_parameter + \"); }\\n\";\n          } else {\n            code += \"int o = __offset(\";\n            code += NumToString(field.value.offset) + \");\";\n            code += \" if (o != 0) { \" + GenSetter(underlying_type);\n            code += \"(\" + setter_index + \", \" + src_cast + setter_parameter +\n                    \"); return true; } else { return false; } }\\n\";\n          }\n        }\n      }\n      if (parser_.opts.java_primitive_has_method &&\n          IsScalar(field.value.type.base_type) && !struct_def.fixed) {\n        auto vt_offset_constant = \"  public static final int VT_\" +\n                                  namer_.Constant(field) + \" = \" +\n                                  NumToString(field.value.offset) + \";\";\n\n        code += vt_offset_constant;\n        code += \"\\n\";\n      }\n    }\n    code += \"\\n\";\n    auto struct_has_create = false;\n    std::set<flatbuffers::FieldDef*> field_has_create_set;\n    flatbuffers::FieldDef* key_field = nullptr;\n    if (struct_def.fixed) {\n      struct_has_create = true;\n      // create a struct constructor function\n      code += \"  public static \" + GenOffsetType() + \" \";\n      code += \"create\";\n      code += struct_class + \"(FlatBufferBuilder builder\";\n      GenStructArgs(struct_def, code, \"\");\n      code += \") {\\n\";\n      GenStructBody(struct_def, code, \"\");\n      code += \"    return \";\n      code += GenOffsetConstruct(\"builder.\" + std::string(\"offset()\"));\n      code += \";\\n  }\\n\";\n    } else {\n      // Generate a method that creates a table in one go. This is only possible\n      // when the table has no struct fields, since those have to be created\n      // inline, and there's no way to do so in Java.\n      bool has_no_struct_fields = true;\n      int num_fields = 0;\n      for (auto it = struct_def.fields.vec.begin();\n           it != struct_def.fields.vec.end(); ++it) {\n        auto& field = **it;\n        if (field.deprecated) continue;\n        if (IsStruct(field.value.type)) {\n          has_no_struct_fields = false;\n        } else {\n          num_fields++;\n        }\n      }\n      // JVM specifications restrict default constructor params to be < 255.\n      // Longs and doubles take up 2 units, so we set the limit to be < 127.\n      if (has_no_struct_fields && num_fields && num_fields < 127) {\n        struct_has_create = true;\n        // Generate a table constructor of the form:\n        // public static int createName(FlatBufferBuilder builder, args...)\n        code += \"  public static \" + GenOffsetType() + \" \";\n        code += namer_.LegacyJavaMethod2(\"create\", struct_def, \"\");\n        code += \"(FlatBufferBuilder builder\";\n        for (auto it = struct_def.fields.vec.begin();\n             it != struct_def.fields.vec.end(); ++it) {\n          auto& field = **it;\n          auto field_name = namer_.Field(field);\n          if (field.deprecated) continue;\n          code += \",\\n      \";\n          code += GenTypeBasic(DestinationType(field.value.type, false));\n          code += \" \";\n          code += field_name;\n          if (!IsScalar(field.value.type.base_type)) code += \"Offset\";\n        }\n        code += \") {\\n    builder.\";\n        code += \"startTable(\";\n        code += NumToString(struct_def.fields.vec.size()) + \");\\n\";\n        for (size_t size = struct_def.sortbysize ? sizeof(largest_scalar_t) : 1;\n             size; size /= 2) {\n          for (auto it = struct_def.fields.vec.rbegin();\n               it != struct_def.fields.vec.rend(); ++it) {\n            auto& field = **it;\n            auto field_name = namer_.Field(field);\n            if (!field.deprecated &&\n                (!struct_def.sortbysize ||\n                 size == SizeOf(field.value.type.base_type))) {\n              code += \"    \" + struct_class + \".\";\n              code += namer_.Method(\"add\", field) + \"(builder, \" + field_name;\n              if (!IsScalar(field.value.type.base_type)) code += \"Offset\";\n              code += \");\\n\";\n            }\n          }\n        }\n        code += \"    return \" + struct_class + \".\";\n        code += namer_.LegacyJavaMethod2(\"end\", struct_def, \"\");\n        code += \"(builder);\\n  }\\n\\n\";\n      }\n      // Generate a set of static methods that allow table construction,\n      // of the form:\n      // public static void addName(FlatBufferBuilder builder, short name)\n      // { builder.addShort(id, name, default); }\n      // Unlike the Create function, these always work.\n      code += \"  public static void start\";\n      code += struct_class;\n      code += \"(FlatBufferBuilder builder) { builder.\";\n      code += \"startTable(\";\n      code += NumToString(struct_def.fields.vec.size()) + \"); }\\n\";\n      for (auto it = struct_def.fields.vec.begin();\n           it != struct_def.fields.vec.end(); ++it) {\n        auto& field = **it;\n        if (field.deprecated) continue;\n\n        code += \"  public static void \" + namer_.Method(\"add\", field);\n        code += \"(FlatBufferBuilder builder, \";\n        code += GenTypeBasic(DestinationType(field.value.type, false));\n        auto argname = namer_.Field(field);\n        if (!IsScalar(field.value.type.base_type)) argname += \"Offset\";\n        code += \" \" + argname + \") { builder.add\";\n        code += GenMethod(field.value.type) + \"(\";\n\n        if (field.key) {\n          // field has key attribute, so always need to exist\n          // even if its value is equal to default.\n          // Generated code will bypass default checking\n          // resulting in { builder.addShort(name); slot(id); }\n          key_field = &field;\n          code += SourceCastBasic(field.value.type);\n          code += argname;\n          code += \"); builder.slot(\" +\n                  NumToString(it - struct_def.fields.vec.begin()) + \"); }\\n\";\n        } else {\n          code += NumToString(it - struct_def.fields.vec.begin()) + \", \";\n          code += SourceCastBasic(field.value.type);\n          code += argname;\n          code += \", \";\n          code += SourceCastBasic(field.value.type);\n          code += GenDefaultValue(field);\n          code += \"); }\\n\";\n        }\n        if (IsVector(field.value.type)) {\n          auto vector_type = field.value.type.VectorType();\n          auto alignment = InlineAlignment(vector_type);\n          auto elem_size = InlineSize(vector_type);\n          if (!IsStruct(vector_type)) {\n            field_has_create_set.insert(&field);\n            // generate a method to create a vector from a java array.\n            if ((vector_type.base_type == BASE_TYPE_CHAR ||\n                 vector_type.base_type == BASE_TYPE_UCHAR)) {\n              // Handle byte[] and ByteBuffers separately for Java\n              code += \"  public static \" + GenVectorOffsetType() + \" \";\n              code += namer_.Method(\"create\", field);\n              code += \"Vector(FlatBufferBuilder builder, byte[] data) \";\n              code += \"{ return builder.createByteVector(data); }\\n\";\n\n              code += \"  public static \" + GenVectorOffsetType() + \" \";\n              code += namer_.Method(\"create\", field);\n              code += \"Vector(FlatBufferBuilder builder, ByteBuffer data) \";\n              code += \"{ return builder.createByteVector(data); }\\n\";\n            } else {\n              code += \"  public static \" + GenVectorOffsetType() + \" \";\n              code += namer_.Method(\"create\", field);\n              code += \"Vector(FlatBufferBuilder builder, \";\n              code += GenTypeBasic(DestinationType(vector_type, false)) +\n                      \"[] data) \";\n              code += \"{ builder.startVector(\";\n              code += NumToString(elem_size);\n              code += \", data.length, \";\n              code += NumToString(alignment);\n              code += \"); for (int i = data.\";\n              code += \"length - 1; i >= 0; i--) builder.\";\n              code += \"add\";\n              code += GenMethod(vector_type);\n              code += \"(\";\n              code += SourceCastBasic(vector_type);\n              code += \"data[i]\";\n              code += \"); return \";\n              code += \"builder.endVector(); }\\n\";\n            }\n          }\n          // Generate a method to start a vector, data to be added manually\n          // after.\n          code += \"  public static void \" + namer_.Method(\"start\", field);\n          code += \"Vector(FlatBufferBuilder builder, int numElems) \";\n          code += \"{ builder.startVector(\";\n          code += NumToString(elem_size);\n          code += \", numElems, \" + NumToString(alignment);\n          code += \"); }\\n\";\n        }\n      }\n      code += \"  public static \" + GenOffsetType() + \" \";\n      code += namer_.LegacyJavaMethod2(\"end\", struct_def, \"\");\n      code += \"(FlatBufferBuilder builder) {\\n    int o = builder.\";\n      code += \"endTable();\\n\";\n      for (auto it = struct_def.fields.vec.begin();\n           it != struct_def.fields.vec.end(); ++it) {\n        auto& field = **it;\n        if (!field.deprecated && field.IsRequired()) {\n          code += \"    builder.required(o, \";\n          code += NumToString(field.value.offset);\n          code += \");  // \" + field.name + \"\\n\";\n        }\n      }\n      code += \"    return \" + GenOffsetConstruct(\"o\") + \";\\n  }\\n\";\n      if (parser_.root_struct_def_ == &struct_def) {\n        std::string size_prefix[] = {\"\", \"SizePrefixed\"};\n        for (int i = 0; i < 2; ++i) {\n          code += \"  public static void \";\n          code += namer_.LegacyJavaMethod2(\"finish\" + size_prefix[i],\n                                           struct_def, \"Buffer\");\n          code += \"(FlatBufferBuilder builder, \" + GenOffsetType();\n          code += \" offset) {\";\n          code += \" builder.finish\" + size_prefix[i] + \"(offset\";\n\n          if (parser_.file_identifier_.length())\n            code += \", \\\"\" + parser_.file_identifier_ + \"\\\"\";\n          code += \"); }\\n\";\n        }\n      }\n    }\n    // Only generate key compare function for table,\n    // because `key_field` is not set for struct\n    if (struct_def.has_key && !struct_def.fixed) {\n      FLATBUFFERS_ASSERT(key_field);\n      code += \"\\n  @Override\\n  protected int keysCompare(\";\n      code += \"Integer o1, Integer o2, ByteBuffer _bb) {\";\n      code += GenKeyGetter(key_field);\n      code += \" }\\n\";\n\n      code += \"\\n  public static \" + struct_class;\n      code += \" __lookup_by_key(\";\n      code += struct_class + \" obj, \";\n      code += \"int vectorLocation, \";\n      code += GenTypeNameDest(key_field->value.type);\n      code += \" key, ByteBuffer bb) {\\n\";\n      if (IsString(key_field->value.type)) {\n        code += \"    byte[] byteKey = \";\n        code += \"key.getBytes(java.nio.charset.StandardCharsets.UTF_8);\\n\";\n      }\n      code += \"    int span = \";\n      code += \"bb.getInt(vectorLocation - 4);\\n\";\n      code += \"    int start = 0;\\n\";\n      code += \"    while (span != 0) {\\n\";\n      code += \"      int middle = span / 2;\\n\";\n      code += GenLookupKeyGetter(key_field);\n      code += \"      if (comp > 0) {\\n\";\n      code += \"        span = middle;\\n\";\n      code += \"      } else if (comp < 0) {\\n\";\n      code += \"        middle++;\\n\";\n      code += \"        start += middle;\\n\";\n      code += \"        span -= middle;\\n\";\n      code += \"      } else {\\n\";\n      code += \"        return \";\n      code += \"(obj == null ? new \" + struct_class + \"() : obj)\";\n      code += \".__assign(tableOffset, bb);\\n\";\n      code += \"      }\\n    }\\n\";\n      code += \"    return null;\\n\";\n      code += \"  }\\n\";\n    }\n    GenVectorAccessObject(struct_def, code);\n    if (opts.generate_object_based_api) {\n      GenPackUnPack_ObjectAPI(struct_def, code, opts, struct_has_create,\n                              field_has_create_set);\n    }\n    code += \"}\\n\\n\";\n  }\n\n  std::string GenOptionalScalarCheck(FieldDef& field) const {\n    if (!field.IsScalarOptional()) return \"\";\n    return \"  public boolean \" + namer_.Method(\"has\", field) +\n           \"() { return 0 != __offset(\" + NumToString(field.value.offset) +\n           \"); }\\n\";\n  }\n\n  void GenVectorAccessObject(StructDef& struct_def, std::string& code) const {\n    // Generate a vector of structs accessor class.\n    code += \"\\n\";\n    code += \"  \";\n    if (!struct_def.attributes.Lookup(\"private\")) code += \"public \";\n    code += \"static \";\n    code += \"final \";\n    code += \"class Vector extends \";\n    code += \"BaseVector {\\n\";\n\n    // Generate the __assign method that sets the field in a pre-existing\n    // accessor object. This is to allow object reuse.\n    std::string method_indent = \"    \";\n    code += method_indent + \"public Vector \";\n    code += \"__assign(int _vector, int _element_size, ByteBuffer _bb) { \";\n    code += \"__reset(_vector, _element_size, _bb); return this; }\\n\\n\";\n\n    auto type_name = namer_.Type(struct_def);\n    auto method_start = method_indent + \"public \" + type_name + \" get\";\n    // Generate the accessors that don't do object reuse.\n    code += method_start + \"(int j) { return get\";\n    code += \"(new \" + type_name + \"(), j); }\\n\";\n    code += method_start + \"(\" + type_name + \" obj, int j) { \";\n    code += \" return obj.__assign(\";\n    std::string index = \"__element(j)\";\n    code += struct_def.fixed ? index : \"__indirect(\" + index + \", bb)\";\n    code += \", bb); }\\n\";\n    // See if we should generate a by-key accessor.\n    if (!struct_def.fixed) {\n      auto& fields = struct_def.fields.vec;\n      for (auto kit = fields.begin(); kit != fields.end(); ++kit) {\n        auto& key_field = **kit;\n        if (key_field.key) {\n          auto nullable_annotation =\n              parser_.opts.gen_nullable ? \"@Nullable \" : \"\";\n          code += method_indent + nullable_annotation;\n          code += \"public \" + type_name + \" \";\n          code += \"getByKey(\";\n          code += GenTypeNameDest(key_field.value.type) + \" key) { \";\n          code += \" return __lookup_by_key(null, \";\n          code += \"__vector(), key, \";\n          code += \"bb); \";\n          code += \"}\\n\";\n          code += method_indent + nullable_annotation;\n          code += \"public \" + type_name + \" \";\n          code += \"getByKey(\";\n          code += type_name + \" obj, \";\n          code += GenTypeNameDest(key_field.value.type) + \" key) { \";\n          code += \" return __lookup_by_key(obj, \";\n          code += \"__vector(), key, \";\n          code += \"bb); \";\n          code += \"}\\n\";\n          break;\n        }\n      }\n    }\n    code += \"  }\\n\";\n  }\n\n  void GenEnum_ObjectAPI(EnumDef& enum_def, std::string& code) const {\n    if (enum_def.generated) return;\n    code += \"import com.google.flatbuffers.FlatBufferBuilder;\\n\\n\";\n\n    if (!enum_def.attributes.Lookup(\"private\")) {\n      code += \"public \";\n    }\n    auto union_name = namer_.Type(enum_def) + \"Union\";\n    auto union_type =\n        GenTypeBasic(DestinationType(enum_def.underlying_type, false));\n    code += \"class \" + union_name + \" {\\n\";\n    // Type\n    code += \"  private \" + union_type + \" type;\\n\";\n    // Value\n    code += \"  private Object value;\\n\";\n    code += \"\\n\";\n    // getters and setters\n    code += \"  public \" + union_type + \" getType() { return type; }\\n\\n\";\n    code += \"  public void setType(\" + union_type +\n            \" type) { this.type = type; }\\n\\n\";\n    code += \"  public Object getValue() { return value; }\\n\\n\";\n    code += \"  public void setValue(Object value) { this.value = value; }\\n\\n\";\n    // Constructor\n    code += \"  public \" + union_name + \"() {\\n\";\n    code +=\n        \"    this.type = \" + namer_.EnumVariant(enum_def, *enum_def.Vals()[0]) +\n        \";\\n\";\n    code += \"    this.value = null;\\n\";\n    code += \"  }\\n\\n\";\n    // As\n    for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {\n      auto& ev = **it;\n      if (ev.union_type.base_type == BASE_TYPE_NONE) continue;\n      auto type_name = GenTypeGet_ObjectAPI(ev.union_type, false, true);\n      if (ev.union_type.base_type == BASE_TYPE_STRUCT &&\n          ev.union_type.struct_def->attributes.Lookup(\"private\")) {\n        code += \"  \";\n      } else {\n        code += \"  public \";\n      }\n      code += type_name + \" as\" + ev.name + \"() { return (\" + type_name +\n              \") value; }\\n\";\n    }\n    code += \"\\n\";\n    // pack()\n    code += \"  public static int pack(FlatBufferBuilder builder, \" +\n            union_name + \" _o) {\\n\";\n    code += \"    switch (_o.type) {\\n\";\n    for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {\n      auto& ev = **it;\n      if (ev.union_type.base_type == BASE_TYPE_NONE) {\n        continue;\n      } else {\n        code += \"      case \" + namer_.EnumVariant(enum_def, ev) + \": return \";\n        if (IsString(ev.union_type)) {\n          code += \"builder.createString(_o.as\" + ev.name + \"());\\n\";\n        } else {\n          code += GenTypeGet(ev.union_type) + \".pack(builder, _o.as\" + ev.name +\n                  \"());\\n\";\n        }\n      }\n    }\n    code += \"      default: return 0;\\n\";\n    code += \"    }\\n\";\n    code += \"  }\\n\";\n    code += \"}\\n\\n\";\n  }\n\n  void GenUnionUnPack_ObjectAPI(const EnumDef& enum_def, std::string& code,\n                                const std::string& type_name,\n                                const std::string& field_name,\n                                bool is_vector) const {\n    const std::string variable_type =\n        is_vector ? type_name.substr(0, type_name.length() - 2) : type_name;\n    const std::string variable_name =\n        \"_\" + namer_.Variable(\"o\", field_name) + (is_vector ? \"Element\" : \"\");\n    const std::string type_params = is_vector ? \"_j\" : \"\";\n    const std::string value_params = is_vector ? \", _j\" : \"\";\n    const std::string indent = (is_vector ? \"      \" : \"    \");\n\n    code += indent + variable_type + \" \" + variable_name + \" = new \" +\n            variable_type + \"();\\n\";\n    code += indent +\n            GenTypeBasic(DestinationType(enum_def.underlying_type, false)) +\n            \" \" + variable_name + \"Type = \" + field_name + \"Type(\" +\n            type_params + \");\\n\";\n    code += indent + variable_name + \".setType(\" + variable_name + \"Type);\\n\";\n    code +=\n        indent + \"com.google.flatbuffers.Table \" + variable_name + \"Value;\\n\";\n    code += indent + \"switch (\" + variable_name + \"Type) {\\n\";\n    for (auto eit = enum_def.Vals().begin(); eit != enum_def.Vals().end();\n         ++eit) {\n      auto& ev = **eit;\n      if (ev.union_type.base_type == BASE_TYPE_NONE) {\n        continue;\n      } else {\n        if (ev.union_type.base_type == BASE_TYPE_STRING ||\n            (ev.union_type.base_type == BASE_TYPE_STRUCT &&\n             ev.union_type.struct_def->fixed)) {\n          continue;  // This branch is due to bad implemantation of Unions in\n                     // Java which doesn't handle non Table types. Should be\n                     // deleted when issue #6561 is fixed.\n        }\n        code += indent + \"  case \" +\n                Prefixed(namer_.NamespacedEnumVariant(enum_def, ev)) + \":\\n\";\n        auto actual_type = GenTypeGet(ev.union_type);\n        code += indent + \"    \" + variable_name + \"Value = \" + field_name +\n                \"(new \" + actual_type + \"()\" + value_params + \");\\n\";\n        code += indent + \"    \" + variable_name + \".setValue(\" + variable_name +\n                \"Value != null ? ((\" + actual_type + \") \" + variable_name +\n                \"Value).unpack() : null);\\n\";\n        code += indent + \"    break;\\n\";\n      }\n    }\n    code += indent + \"  default: break;\\n\";\n    code += indent + \"}\\n\";\n    if (is_vector) {\n      code += indent + \"_\" + namer_.Variable(\"o\", field_name) +\n              \"[_j] = \" + variable_name + \";\\n\";\n    }\n  }\n\n  void GenPackUnPack_ObjectAPI(\n      StructDef& struct_def, std::string& code, const IDLOptions& opts,\n      bool struct_has_create,\n      const std::set<FieldDef*>& field_has_create) const {\n    auto struct_name = namer_.ObjectType(struct_def);\n    // unpack()\n    code += \"  public \" + struct_name + \" unpack() {\\n\";\n    code += \"    \" + struct_name + \" _o = new \" + struct_name + \"();\\n\";\n    code += \"    unpackTo(_o);\\n\";\n    code += \"    return _o;\\n\";\n    code += \"  }\\n\";\n    // unpackTo()\n    code += \"  public void unpackTo(\" + struct_name + \" _o) {\\n\";\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      const auto& field = **it;\n      if (field.deprecated) continue;\n      if (field.value.type.base_type == BASE_TYPE_UTYPE) continue;\n      if (field.value.type.element == BASE_TYPE_UTYPE) continue;\n      const auto accessor = namer_.Method(field);\n      const auto variable = \"_\" + namer_.Variable(\"o\", field);\n      const auto get_field = namer_.Method(\"get\", field);\n      const auto set_field = namer_.Method(\"set\", field);\n\n      auto type_name = GenTypeGet_ObjectAPI(field.value.type, false, true);\n      if (field.IsScalarOptional())\n        type_name = ConvertPrimitiveTypeToObjectWrapper_ObjectAPI(type_name);\n      auto start = \"    \" + type_name + \" \" + variable + \" = \";\n      auto call_setter = true;\n      switch (field.value.type.base_type) {\n        case BASE_TYPE_STRUCT: {\n          auto fixed = struct_def.fixed && field.value.type.struct_def->fixed;\n          if (fixed) {\n            code +=\n                \"    \" + accessor + \"().unpackTo(_o.\" + get_field + \"());\\n\";\n          } else {\n            code += \"    if (\" + accessor + \"() != null) \";\n            if (field.value.type.struct_def->fixed) {\n              code += accessor + \"().unpackTo(_o.\" + get_field + \"());\\n\";\n            } else {\n              code += \"_o.\" + set_field + \"(\" + accessor + \"().unpack());\\n\";\n            }\n            code += \"    else _o.\" + set_field + \"(null);\\n\";\n          }\n          call_setter = false;\n          break;\n        }\n        case BASE_TYPE_ARRAY: {\n          auto length_str = NumToString(field.value.type.fixed_length);\n          auto unpack_method =\n              field.value.type.struct_def == nullptr ? \"\" : \".unpack()\";\n          code += start + \"_o.\" + get_field + \"();\\n\";\n          code += \"    for (int _j = 0; _j < \" + length_str + \"; ++_j) { \" +\n                  variable + \"[_j] = \" + accessor + \"(_j)\" + unpack_method +\n                  \"; }\\n\";\n          call_setter = false;\n          break;\n        }\n        case BASE_TYPE_VECTOR:\n          if (field.value.type.element == BASE_TYPE_UNION) {\n            code += start + \"new \" +\n                    GenConcreteTypeGet_ObjectAPI(field.value.type)\n                        .substr(0, type_name.length() - 1) +\n                    accessor + \"Length()];\\n\";\n            code +=\n                \"    for (int _j = 0; _j < \" + accessor + \"Length(); ++_j) {\\n\";\n            GenUnionUnPack_ObjectAPI(*field.value.type.enum_def, code,\n                                     type_name, accessor, true);\n            code += \"    }\\n\";\n          } else if (field.value.type.element != BASE_TYPE_UTYPE) {\n            auto fixed = field.value.type.struct_def == nullptr;\n            const auto length_accessor = namer_.Method(field, \"length\");\n            code += start + \"new \" +\n                    GenConcreteTypeGet_ObjectAPI(field.value.type)\n                        .substr(0, type_name.length() - 1) +\n                    length_accessor + \"()];\\n\";\n            code +=\n                \"    for (int _j = 0; _j < \" + length_accessor + \"(); ++_j) {\";\n            code += variable + \"[_j] = \";\n            if (fixed) {\n              code += accessor + \"(_j)\";\n            } else {\n              code += \"(\" + accessor + \"(_j) != null ? \" + accessor +\n                      \"(_j).unpack() : null)\";\n            }\n            code += \";}\\n\";\n          }\n          break;\n        case BASE_TYPE_UTYPE:\n          break;\n        case BASE_TYPE_UNION: {\n          GenUnionUnPack_ObjectAPI(*field.value.type.enum_def, code, type_name,\n                                   accessor, false);\n          break;\n        }\n        default: {\n          if (field.IsScalarOptional()) {\n            code += start + namer_.Method(\"has\", field) + \"() ? \" + accessor +\n                    \"() : null;\\n\";\n          } else {\n            code += start + accessor + \"();\\n\";\n          }\n          break;\n        }\n      }\n      if (call_setter) {\n        code += \"    _o.\" + set_field + \"(\" + variable + \");\\n\";\n      }\n    }\n    code += \"  }\\n\";\n    // pack()\n    code += \"  public static \" + GenOffsetType() +\n            \" pack(FlatBufferBuilder builder, \" + struct_name + \" _o) {\\n\";\n    code += \"    if (_o == null) return 0;\\n\";\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (field.deprecated) continue;\n      const auto field_name = namer_.Field(field);\n      const auto variable = \"_\" + namer_.Variable(\"o\", field);\n      const auto get_field = namer_.Method(\"get\", field);\n      // pre\n      switch (field.value.type.base_type) {\n        case BASE_TYPE_STRUCT: {\n          if (!field.value.type.struct_def->fixed) {\n            code += \"    \" + GenOffsetType() + \" _\" + namer_.Variable(field) +\n                    \" = _o.\" + get_field +\n                    \"() == null ? 0 : \" + GenTypeGet(field.value.type) +\n                    \".pack(builder, _o.\" + get_field + \"());\\n\";\n          } else if (struct_def.fixed && struct_has_create) {\n            std::vector<FieldArrayLength> array_lengths;\n            FieldArrayLength tmp_array_length = {\n                field.name,\n                field.value.type.fixed_length,\n            };\n            array_lengths.push_back(tmp_array_length);\n            GenStructPackDecl_ObjectAPI(*field.value.type.struct_def,\n                                        array_lengths, code);\n          }\n          break;\n        }\n        case BASE_TYPE_STRING: {\n          code += \"    int _\" + field_name + \" = _o.\" + get_field +\n                  \"() == null ? 0 : \"\n                  \"builder.createString(_o.\" +\n                  get_field + \"());\\n\";\n          break;\n        }\n        case BASE_TYPE_VECTOR: {\n          if (field_has_create.find(&field) != field_has_create.end()) {\n            auto property_name = field_name;\n            auto gen_for_loop = true;\n            std::string array_name = \"__\" + field_name;\n            std::string array_type = \"\";\n            std::string element_type = \"\";\n            std::string to_array = \"\";\n            switch (field.value.type.element) {\n              case BASE_TYPE_STRING: {\n                array_type = \"int\";\n                element_type = \"String\";\n                to_array = \"builder.createString(_e)\";\n                break;\n              }\n              case BASE_TYPE_STRUCT:\n                array_type = \"int\";\n                element_type =\n                    GenTypeGet_ObjectAPI(field.value.type, true, true);\n                ;\n                to_array = GenTypeGet(field.value.type) + \".pack(builder, _e)\";\n                break;\n              case BASE_TYPE_UTYPE:\n                property_name = field_name.substr(0, field_name.size() - 4);\n                array_type = GenTypeBasic(DestinationType(\n                    field.value.type.enum_def->underlying_type, false));\n                element_type = field.value.type.enum_def->name + \"Union\";\n                to_array = \"_o.\" + namer_.Method(\"get\", property_name) +\n                           \"()[_j].getType()\";\n                break;\n              case BASE_TYPE_UNION:\n                array_type = \"int\";\n                element_type = Prefixed(namer_.NamespacedType(\n                                   *field.value.type.enum_def)) +\n                               \"Union\";\n                to_array = element_type + \".pack(builder,  _o.\" +\n                           namer_.Method(\"get\", property_name) + \"()[_j])\";\n                break;\n              case BASE_TYPE_UCHAR:  // TODO this branch of the switch is due to\n                                     // inconsistent behavior in unsigned byte.\n                                     // Read further at Issue #6574.\n                array_type = \"byte\";\n                element_type = \"int\";\n                to_array = \"(byte) _e\";\n                break;\n              default:\n                gen_for_loop = false;\n                array_name = \"_o.\" + namer_.Method(\"get\", property_name) + \"()\";\n                array_type = GenTypeNameDest(field.value.type);\n                element_type = array_type;\n                to_array = \"_e\";\n                break;\n            }\n            code += \"    int _\" + field_name + \" = 0;\\n\";\n            code += \"    if (_o.\" + namer_.Method(\"get\", property_name) +\n                    \"() != null) {\\n\";\n            if (gen_for_loop) {\n              code += \"      \" + array_type + \"[] \" + array_name + \" = new \" +\n                      array_type + \"[_o.\" +\n                      namer_.Method(\"get\", property_name) + \"().length];\\n\";\n              code += \"      int _j = 0;\\n\";\n              code += \"      for (\" + element_type + \" _e : _o.\" +\n                      namer_.Method(\"get\", property_name) + \"()) { \";\n              code += array_name + \"[_j] = \" + to_array + \"; _j++;}\\n\";\n            }\n            code += \"      _\" + field_name + \" = \" +\n                    namer_.Method(\"create\", field) + \"Vector(builder, \" +\n                    array_name + \");\\n\";\n            code += \"    }\\n\";\n          } else {\n            auto type_name = GenTypeGet(field.value.type);\n            auto element_type_name =\n                GenTypeGet_ObjectAPI(field.value.type, true, true);\n            auto pack_method =\n                field.value.type.struct_def == nullptr\n                    ? \"builder.add\" + GenMethod(field.value.type.VectorType()) +\n                          \"(\" + variable + \"[_j]);\"\n                    : \"_unused_offset = \" + type_name + \".pack(builder, \" +\n                          variable + \"[_j]);\";\n            code += \"    int _\" + field_name + \" = 0;\\n\";\n            code += \"    \" + element_type_name + \"[] \" + variable + \" = _o.\" +\n                    get_field + \"();\\n\";\n            code += \"    if (\" + variable + \" != null) {\\n\";\n            if (field.value.type.struct_def != nullptr) {\n              code += \"      int _unused_offset = 0;\\n\";\n            }\n            code += \"      \" + namer_.Method(\"start\", field) +\n                    \"Vector(builder, \" + variable + \".length);\\n\";\n            code += \"      for (int _j = \" + variable +\n                    \".length - 1; _j >=0; _j--) { \";\n            code += pack_method + \"}\\n\";\n            code += \"      _\" + field_name + \" = builder.endVector();\\n\";\n            code += \"    }\\n\";\n          }\n          break;\n        }\n        case BASE_TYPE_ARRAY: {\n          if (field.value.type.struct_def != nullptr) {\n            std::vector<FieldArrayLength> array_lengths;\n            FieldArrayLength tmp_array_length = {\n                field.name,\n                field.value.type.fixed_length,\n            };\n            array_lengths.push_back(tmp_array_length);\n            GenStructPackDecl_ObjectAPI(*field.value.type.struct_def,\n                                        array_lengths, code);\n          } else {\n            code += \"    \" +\n                    GenTypeGet_ObjectAPI(field.value.type, false, true) + \" _\" +\n                    field_name + \" = _o.\" + get_field + \"();\\n\";\n          }\n          break;\n        }\n        case BASE_TYPE_UNION: {\n          code += \"    \" +\n                  GenTypeBasic(DestinationType(\n                      field.value.type.enum_def->underlying_type, false)) +\n                  \" _\" + field_name + \"Type = _o.\" + get_field +\n                  \"() == null ? \" +\n                  Prefixed(namer_.NamespacedType(*field.value.type.enum_def)) +\n                  \".NONE : \" + \"_o.\" + get_field + \"().getType();\\n\";\n          code += \"    \" + GenOffsetType() + \" _\" + field_name + \" = _o.\" +\n                  get_field + \"() == null ? 0 : \" +\n                  Prefixed(namer_.NamespacedType(*field.value.type.enum_def)) +\n                  \"Union.pack(builder, _o.\" + get_field + \"());\\n\";\n          break;\n        }\n        default:\n          break;\n      }\n    }\n    if (struct_has_create) {\n      // Create\n      code += \"    return \" +\n              namer_.LegacyJavaMethod2(\"create\", struct_def, \"\") + \"(\\n\";\n      code += \"      builder\";\n      for (auto it = struct_def.fields.vec.begin();\n           it != struct_def.fields.vec.end(); ++it) {\n        auto& field = **it;\n        if (field.deprecated) continue;\n        const auto field_name = namer_.Field(field);\n        const auto get_field = namer_.Method(\"get\", field);\n        switch (field.value.type.base_type) {\n          case BASE_TYPE_STRUCT: {\n            if (struct_def.fixed) {\n              GenStructPackCall_ObjectAPI(*field.value.type.struct_def, code,\n                                          \"      _\" + field_name + \"_\");\n            } else {\n              code += \",\\n\";\n              if (field.value.type.struct_def->fixed) {\n                if (opts.generate_object_based_api)\n                  code += \"      _o.\" + field_name;\n                else\n                  // Seems like unreachable code\n                  code += \"      \" + GenTypeGet(field.value.type) +\n                          \".Pack(builder, _o.\" + field_name + \")\";\n              } else {\n                code += \"      _\" + field_name;\n              }\n            }\n            break;\n          }\n          case BASE_TYPE_ARRAY: {\n            if (field.value.type.struct_def != nullptr) {\n              GenStructPackCall_ObjectAPI(*field.value.type.struct_def, code,\n                                          \"      _\" + field_name + \"_\");\n            } else {\n              code += \",\\n\";\n              code += \"      _\" + field_name;\n            }\n            break;\n          }\n          case BASE_TYPE_UNION:\n            FLATBUFFERS_FALLTHROUGH();  // fall thru\n          case BASE_TYPE_UTYPE:\n            FLATBUFFERS_FALLTHROUGH();  // fall thru\n          case BASE_TYPE_STRING:\n            FLATBUFFERS_FALLTHROUGH();  // fall thru\n          case BASE_TYPE_VECTOR: {\n            code += \",\\n\";\n            code += \"      _\" + field_name;\n            break;\n          }\n          default:  // scalar\n            code += \",\\n\";\n            code += \"      _o.\" + get_field + \"()\";\n            break;\n        }\n      }\n      code += \");\\n\";\n    } else {\n      // Start, End\n      code += \"    \" + namer_.LegacyJavaMethod2(\"start\", struct_def, \"\") +\n              \"(builder);\\n\";\n      for (auto it = struct_def.fields.vec.begin();\n           it != struct_def.fields.vec.end(); ++it) {\n        auto& field = **it;\n        if (field.deprecated) continue;\n        const auto arg = \"_\" + namer_.Variable(field);\n        const auto get_field = namer_.Method(\"get\", field);\n        const auto add_field = namer_.Method(\"add\", field);\n\n        switch (field.value.type.base_type) {\n          case BASE_TYPE_STRUCT: {\n            if (field.value.type.struct_def->fixed) {\n              code += \"    \" + add_field + \"(builder, \" +\n                      GenTypeGet(field.value.type) + \".pack(builder, _o.\" +\n                      get_field + \"()));\\n\";\n            } else {\n              code += \"    \" + add_field + \"(builder, \" + arg + \");\\n\";\n            }\n            break;\n          }\n          case BASE_TYPE_STRING:\n            FLATBUFFERS_FALLTHROUGH();  // fall thru\n          case BASE_TYPE_ARRAY:\n            FLATBUFFERS_FALLTHROUGH();  // fall thru\n          case BASE_TYPE_VECTOR: {\n            code += \"    \" + add_field + \"(builder, \" + arg + \");\\n\";\n            break;\n          }\n          case BASE_TYPE_UTYPE:\n            break;\n          case BASE_TYPE_UNION: {\n            code += \"    \" + add_field + \"Type(builder, \" + arg + \"Type);\\n\";\n            code += \"    \" + add_field + \"(builder, \" + arg + \");\\n\";\n            break;\n          }\n          // scalar\n          default: {\n            if (field.IsScalarOptional()) {\n              code += \"    if (_o.\" + get_field + \"() != null) { \" + add_field +\n                      \"(builder, _o.\" + get_field + \"()); }\\n\";\n            } else {\n              code +=\n                  \"    \" + add_field + \"(builder, _o.\" + get_field + \"());\\n\";\n            }\n            break;\n          }\n        }\n      }\n      code += \"    return \" + namer_.LegacyJavaMethod2(\"end\", struct_def, \"\") +\n              \"(builder);\\n\";\n    }\n    code += \"  }\\n\";\n  }\n\n  void GenStructPackDecl_ObjectAPI(const StructDef& struct_def,\n                                   std::vector<FieldArrayLength>& array_lengths,\n                                   std::string& code) const {\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      const FieldDef& field = **it;\n      const bool is_array = IsArray(field.value.type);\n      const Type& field_type =\n          is_array ? field.value.type.VectorType() : field.value.type;\n      FieldArrayLength tmp_array_length = {\n          field.name,\n          field_type.fixed_length,\n      };\n      array_lengths.push_back(tmp_array_length);\n      if (field_type.struct_def != nullptr) {\n        GenStructPackDecl_ObjectAPI(*field_type.struct_def, array_lengths,\n                                    code);\n      } else {\n        std::vector<FieldArrayLength> array_only_lengths;\n        for (size_t i = 0; i < array_lengths.size(); ++i) {\n          if (array_lengths[i].length > 0) {\n            array_only_lengths.push_back(array_lengths[i]);\n          }\n        }\n        std::string name;\n        for (size_t i = 0; i < array_lengths.size(); ++i) {\n          name += \"_\" + namer_.Variable(array_lengths[i].name);\n        }\n        code += \"    \" + GenTypeBasic(field_type);\n        if (array_only_lengths.size() > 0) {\n          for (size_t i = 0; i < array_only_lengths.size(); ++i) {\n            code += \"[]\";\n          }\n          code += \" \" + name + \" = \";\n          code += \"new \" + GenTypeBasic(field_type) + \"[\";\n          for (size_t i = 0; i < array_only_lengths.size(); ++i) {\n            if (i != 0) {\n              code += \"][\";\n            }\n            code += NumToString(array_only_lengths[i].length);\n          }\n          code += \"];\\n\";\n          code += \"    \";\n          // initialize array\n          for (size_t i = 0; i < array_only_lengths.size(); ++i) {\n            auto idx = \"idx\" + NumToString(i);\n            code += \"for (int \" + idx + \" = 0; \" + idx + \" < \" +\n                    NumToString(array_only_lengths[i].length) + \"; ++\" + idx +\n                    \") {\";\n          }\n          for (size_t i = 0; i < array_only_lengths.size(); ++i) {\n            auto idx = \"idx\" + NumToString(i);\n            if (i == 0) {\n              code += name + \"[\" + idx;\n            } else {\n              code += \"][\" + idx;\n            }\n          }\n          code += \"] = _o\";\n          for (size_t i = 0, j = 0; i < array_lengths.size(); ++i) {\n            code += \".\" + namer_.Method(\"get\", array_lengths[i].name) + \"()\";\n            if (array_lengths[i].length <= 0) continue;\n            code += \"[idx\" + NumToString(j++) + \"]\";\n          }\n          code += \";\";\n          for (size_t i = 0; i < array_only_lengths.size(); ++i) {\n            code += \"}\";\n          }\n        } else {\n          code += \" \" + name + \" = \";\n          code += SourceCast(field_type);\n          code += \"_o\";\n          for (size_t i = 0; i < array_lengths.size(); ++i) {\n            code += \".\" + namer_.Method(\"get\", array_lengths[i].name) + \"()\";\n          }\n          code += \";\";\n        }\n        code += \"\\n\";\n      }\n      array_lengths.pop_back();\n    }\n  }\n\n  void GenStructPackCall_ObjectAPI(const StructDef& struct_def,\n                                   std::string& code,\n                                   std::string prefix) const {\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      const auto& field_type = field.value.type;\n      if (field_type.struct_def != nullptr) {\n        GenStructPackCall_ObjectAPI(*field_type.struct_def, code,\n                                    prefix + namer_.Field(field) + \"_\");\n      } else {\n        code += \",\\n\";\n        code += prefix + namer_.Field(field);\n      }\n    }\n  }\n\n  std::string ConvertPrimitiveTypeToObjectWrapper_ObjectAPI(\n      const std::string& type_name) const {\n    if (type_name == \"boolean\")\n      return \"Boolean\";\n    else if (type_name == \"byte\")\n      return \"Byte\";\n    else if (type_name == \"char\")\n      return \"Character\";\n    else if (type_name == \"short\")\n      return \"Short\";\n    else if (type_name == \"int\")\n      return \"Integer\";\n    else if (type_name == \"long\")\n      return \"Long\";\n    else if (type_name == \"float\")\n      return \"Float\";\n    else if (type_name == \"double\")\n      return \"Double\";\n    return type_name;\n  }\n\n  std::string GenTypeGet_ObjectAPI(const flatbuffers::Type& type,\n                                   bool vectorelem,\n                                   bool wrap_in_namespace) const {\n    auto type_name = GenTypeNameDest(type);\n    // Replace to ObjectBaseAPI Type Name\n    switch (type.base_type) {\n      case BASE_TYPE_STRUCT:\n        FLATBUFFERS_FALLTHROUGH();  // fall thru\n      case BASE_TYPE_ARRAY:\n        FLATBUFFERS_FALLTHROUGH();  // fall thru\n      case BASE_TYPE_VECTOR: {\n        if (type.struct_def != nullptr) {\n          auto type_name_length = type.struct_def->name.length();\n          auto new_type_name = namer_.ObjectType(*type.struct_def);\n          type_name.replace(type_name.length() - type_name_length,\n                            type_name_length, new_type_name);\n        } else if (type.element == BASE_TYPE_UNION) {\n          if (wrap_in_namespace) {\n            type_name =\n                Prefixed(namer_.NamespacedType(*type.enum_def)) + \"Union\";\n          } else {\n            type_name = namer_.Type(*type.enum_def) + \"Union\";\n          }\n        }\n        break;\n      }\n\n      case BASE_TYPE_UNION: {\n        if (wrap_in_namespace) {\n          type_name = Prefixed(namer_.NamespacedType(*type.enum_def)) + \"Union\";\n        } else {\n          type_name = namer_.Type(*type.enum_def) + \"Union\";\n        }\n        break;\n      }\n      default:\n        break;\n    }\n    if (vectorelem) {\n      return type_name;\n    }\n    switch (type.base_type) {\n      case BASE_TYPE_ARRAY:\n        FLATBUFFERS_FALLTHROUGH();  // fall thru\n      case BASE_TYPE_VECTOR: {\n        type_name = type_name + \"[]\";\n        break;\n      }\n      default:\n        break;\n    }\n    return type_name;\n  }\n\n  std::string GenConcreteTypeGet_ObjectAPI(\n      const flatbuffers::Type& type) const {\n    auto type_name = GenTypeNameDest(type);\n    // Replace to ObjectBaseAPI Type Name\n    switch (type.base_type) {\n      case BASE_TYPE_STRUCT:\n        FLATBUFFERS_FALLTHROUGH();  // fall thru\n      case BASE_TYPE_ARRAY:\n        FLATBUFFERS_FALLTHROUGH();  // fall thru\n      case BASE_TYPE_VECTOR: {\n        if (type.struct_def != nullptr) {\n          auto type_name_length = type.struct_def->name.length();\n          auto new_type_name = namer_.ObjectType(*type.struct_def);\n          type_name.replace(type_name.length() - type_name_length,\n                            type_name_length, new_type_name);\n        } else if (type.element == BASE_TYPE_UNION) {\n          type_name = Prefixed(namer_.NamespacedType(*type.enum_def)) + \"Union\";\n        }\n        break;\n      }\n\n      case BASE_TYPE_UNION: {\n        type_name = Prefixed(namer_.NamespacedType(*type.enum_def)) + \"Union\";\n        break;\n      }\n      default:\n        break;\n    }\n\n    switch (type.base_type) {\n      case BASE_TYPE_ARRAY:\n        FLATBUFFERS_FALLTHROUGH();  // fall thru\n      case BASE_TYPE_VECTOR: {\n        type_name = type_name + \"[]\";\n        break;\n      }\n      default:\n        break;\n    }\n    return type_name;\n  }\n\n  void GenStruct_ObjectAPI(const StructDef& struct_def,\n                           std::string& code) const {\n    if (struct_def.generated) return;\n    if (struct_def.attributes.Lookup(\"private\")) {\n      // For Java, we leave the enum unmarked to indicate package-private\n    } else {\n      code += \"public \";\n    }\n\n    const auto class_name = namer_.ObjectType(struct_def);\n    code += \"class \" + class_name;\n    code += \" {\\n\";\n    // Generate Properties\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      const auto& field = **it;\n      if (field.deprecated) continue;\n      if (field.value.type.base_type == BASE_TYPE_UTYPE) continue;\n      if (field.value.type.element == BASE_TYPE_UTYPE) continue;\n      auto type_name = GenTypeGet_ObjectAPI(field.value.type, false, true);\n      if (field.IsScalarOptional())\n        type_name = ConvertPrimitiveTypeToObjectWrapper_ObjectAPI(type_name);\n      const auto field_name = namer_.Field(field);\n      code += \"  private \" + type_name + \" \" + field_name + \";\\n\";\n    }\n    // Generate Java getters and setters\n    code += \"\\n\";\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      const auto& field = **it;\n      if (field.deprecated) continue;\n      if (field.value.type.base_type == BASE_TYPE_UTYPE) continue;\n      if (field.value.type.element == BASE_TYPE_UTYPE) continue;\n      const auto field_name = namer_.Field(field);\n      const auto get_field = namer_.Method(\"get\", field);\n      auto type_name = GenTypeGet_ObjectAPI(field.value.type, false, true);\n      if (field.IsScalarOptional())\n        type_name = ConvertPrimitiveTypeToObjectWrapper_ObjectAPI(type_name);\n\n      code += \"  public \" + type_name + \" \" + get_field + \"() { return \" +\n              field_name + \"; }\\n\\n\";\n      std::string array_validation = \"\";\n      if (field.value.type.base_type == BASE_TYPE_ARRAY) {\n        array_validation =\n            \"if (\" + field_name + \" != null && \" + field_name +\n            \".length == \" + NumToString(field.value.type.fixed_length) + \") \";\n      }\n      code += \"  public void \" + namer_.Method(\"set\", field) + \"(\" + type_name +\n              \" \" + field_name + \") { \" + array_validation + \"this.\" +\n              field_name + \" = \" + field_name + \"; }\\n\\n\";\n    }\n    // Generate Constructor\n    code += \"\\n\";\n    code += \"  public \" + class_name + \"() {\\n\";\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      const auto& field = **it;\n      if (field.deprecated) continue;\n      if (field.value.type.base_type == BASE_TYPE_UTYPE) continue;\n      if (field.value.type.element == BASE_TYPE_UTYPE) continue;\n      const auto get_field = namer_.Method(\"get\", field);\n\n      code += \"    this.\" + namer_.Field(field) + \" = \";\n      const auto type_name =\n          GenTypeGet_ObjectAPI(field.value.type, false, true);\n      if (IsScalar(field.value.type.base_type)) {\n        if (field.IsScalarOptional()) {\n          code += \"null;\\n\";\n        } else {\n          code += GenDefaultValue(field) + \";\\n\";\n        }\n      } else {\n        switch (field.value.type.base_type) {\n          case BASE_TYPE_STRUCT: {\n            if (IsStruct(field.value.type)) {\n              code += \"new \" + type_name + \"();\\n\";\n            } else {\n              code += \"null;\\n\";\n            }\n            break;\n          }\n          case BASE_TYPE_ARRAY: {\n            code += \"new \" + type_name.substr(0, type_name.length() - 1) +\n                    NumToString(field.value.type.fixed_length) + \"];\\n\";\n            break;\n          }\n          default: {\n            code += \"null;\\n\";\n            break;\n          }\n        }\n      }\n    }\n    code += \"  }\\n\";\n    if (parser_.root_struct_def_ == &struct_def) {\n      const std::string struct_type = namer_.Type(struct_def);\n      code += \"  public static \" + class_name +\n              \" deserializeFromBinary(byte[] fbBuffer) {\\n\";\n      code += \"    return \" + struct_type + \".\" +\n              namer_.LegacyJavaMethod2(\"getRootAs\", struct_def, \"\") +\n              \"(ByteBuffer.wrap(fbBuffer)).unpack();\\n\";\n      code += \"  }\\n\";\n      code += \"  public byte[] serializeToBinary() {\\n\";\n      code += \"    FlatBufferBuilder fbb = new FlatBufferBuilder();\\n\";\n      code += \"    \" + struct_type + \".\" +\n              namer_.LegacyJavaMethod2(\"finish\", struct_def, \"Buffer\") +\n              \"(fbb, \" + struct_type + \".pack(fbb, this));\\n\";\n      code += \"    return fbb.sizedByteArray();\\n\";\n      code += \"  }\\n\";\n    }\n    code += \"}\\n\\n\";\n  }\n\n  // This tracks the current namespace used to determine if a type need to be\n  // prefixed by its namespace\n  const Namespace* cur_name_space_;\n  const IdlNamer namer_;\n\n private:\n  std::string Prefixed(const std::string& str) const {\n    return package_prefix_ + str;\n  }\n\n  std::string package_prefix_;\n  Namespace package_prefix_ns_;\n};\n}  // namespace java\n\nstatic bool GenerateJava(const Parser& parser, const std::string& path,\n                         const std::string& file_name) {\n  java::JavaGenerator generator(parser, path, file_name,\n                                parser.opts.java_package_prefix);\n  return generator.generate();\n}\n\nnamespace {\n\nclass JavaCodeGenerator : public CodeGenerator {\n public:\n  Status GenerateCode(const Parser& parser, const std::string& path,\n                      const std::string& filename) override {\n    if (!GenerateJava(parser, path, filename)) {\n      return Status::ERROR;\n    }\n    return Status::OK;\n  }\n\n  Status GenerateCode(const uint8_t*, int64_t, const CodeGenOptions&) override {\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateMakeRule(const Parser& parser, const std::string& path,\n                          const std::string& filename,\n                          std::string& output) override {\n    output = JavaCSharpMakeRule(true, parser, path, filename);\n    return Status::OK;\n  }\n\n  Status GenerateGrpcCode(const Parser& parser, const std::string& path,\n                          const std::string& filename) override {\n    if (!GenerateJavaGRPC(parser, path, filename)) {\n      return Status::ERROR;\n    }\n    return Status::OK;\n  }\n\n  Status GenerateRootFile(const Parser& parser,\n                          const std::string& path) override {\n    (void)parser;\n    (void)path;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  bool IsSchemaOnly() const override { return true; }\n\n  bool SupportsBfbsGeneration() const override { return false; }\n\n  bool SupportsRootFileGeneration() const override { return false; }\n\n  IDLOptions::Language Language() const override { return IDLOptions::kJava; }\n\n  std::string LanguageName() const override { return \"Java\"; }\n};\n}  // namespace\n\nstd::unique_ptr<CodeGenerator> NewJavaCodeGenerator() {\n  return std::unique_ptr<JavaCodeGenerator>(new JavaCodeGenerator());\n}\n\n}  // namespace flatbuffers\n"
  },
  {
    "path": "src/idl_gen_java.h",
    "content": "/*\n * Copyright 2023 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_IDL_GEN_JAVA_H_\n#define FLATBUFFERS_IDL_GEN_JAVA_H_\n\n#include \"flatbuffers/code_generator.h\"\n\nnamespace flatbuffers {\n\n// Constructs a new Java code generator.\nstd::unique_ptr<CodeGenerator> NewJavaCodeGenerator();\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_IDL_GEN_JAVA_H_\n"
  },
  {
    "path": "src/idl_gen_json_schema.cpp",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"idl_gen_json_schema.h\"\n\n#include <algorithm>\n#include <iostream>\n#include <limits>\n\n#include \"flatbuffers/code_generators.h\"\n#include \"flatbuffers/idl.h\"\n#include \"flatbuffers/util.h\"\n\nnamespace flatbuffers {\n\nnamespace jsons {\n\nnamespace {\n\ntemplate <class T>\nstatic std::string GenFullName(const T* enum_def) {\n  std::string full_name;\n  const auto& name_spaces = enum_def->defined_namespace->components;\n  for (auto ns = name_spaces.cbegin(); ns != name_spaces.cend(); ++ns) {\n    full_name.append(*ns + \"_\");\n  }\n  full_name.append(enum_def->name);\n  return full_name;\n}\n\ntemplate <class T>\nstatic std::string GenTypeRef(const T* enum_def) {\n  return \"\\\"$ref\\\" : \\\"#/definitions/\" + GenFullName(enum_def) + \"\\\"\";\n}\n\nstatic std::string GenType(const std::string& name) {\n  return \"\\\"type\\\" : \\\"\" + name + \"\\\"\";\n}\n\nstatic std::string GenType(BaseType type) {\n  switch (type) {\n    case BASE_TYPE_BOOL:\n      return \"\\\"type\\\" : \\\"boolean\\\"\";\n    case BASE_TYPE_CHAR:\n      return \"\\\"type\\\" : \\\"integer\\\", \\\"minimum\\\" : \" +\n             NumToString(std::numeric_limits<int8_t>::min()) +\n             \", \\\"maximum\\\" : \" +\n             NumToString(std::numeric_limits<int8_t>::max());\n    case BASE_TYPE_UCHAR:\n      return \"\\\"type\\\" : \\\"integer\\\", \\\"minimum\\\" : 0, \\\"maximum\\\" :\" +\n             NumToString(std::numeric_limits<uint8_t>::max());\n    case BASE_TYPE_SHORT:\n      return \"\\\"type\\\" : \\\"integer\\\", \\\"minimum\\\" : \" +\n             NumToString(std::numeric_limits<int16_t>::min()) +\n             \", \\\"maximum\\\" : \" +\n             NumToString(std::numeric_limits<int16_t>::max());\n    case BASE_TYPE_USHORT:\n      return \"\\\"type\\\" : \\\"integer\\\", \\\"minimum\\\" : 0, \\\"maximum\\\" : \" +\n             NumToString(std::numeric_limits<uint16_t>::max());\n    case BASE_TYPE_INT:\n      return \"\\\"type\\\" : \\\"integer\\\", \\\"minimum\\\" : \" +\n             NumToString(std::numeric_limits<int32_t>::min()) +\n             \", \\\"maximum\\\" : \" +\n             NumToString(std::numeric_limits<int32_t>::max());\n    case BASE_TYPE_UINT:\n      return \"\\\"type\\\" : \\\"integer\\\", \\\"minimum\\\" : 0, \\\"maximum\\\" : \" +\n             NumToString(std::numeric_limits<uint32_t>::max());\n    case BASE_TYPE_LONG:\n      return \"\\\"type\\\" : \\\"integer\\\", \\\"minimum\\\" : \" +\n             NumToString(std::numeric_limits<int64_t>::min()) +\n             \", \\\"maximum\\\" : \" +\n             NumToString(std::numeric_limits<int64_t>::max());\n    case BASE_TYPE_ULONG:\n      return \"\\\"type\\\" : \\\"integer\\\", \\\"minimum\\\" : 0, \\\"maximum\\\" : \" +\n             NumToString(std::numeric_limits<uint64_t>::max());\n    case BASE_TYPE_FLOAT:\n    case BASE_TYPE_DOUBLE:\n      return \"\\\"type\\\" : \\\"number\\\"\";\n    case BASE_TYPE_STRING:\n      return \"\\\"type\\\" : \\\"string\\\"\";\n    default:\n      return \"\";\n  }\n}\n\nstatic std::string GenBaseType(const Type& type) {\n  if (type.struct_def != nullptr) {\n    return GenTypeRef(type.struct_def);\n  }\n  if (type.enum_def != nullptr) {\n    return GenTypeRef(type.enum_def);\n  }\n  return GenType(type.base_type);\n}\n\nstatic std::string GenArrayType(const Type& type) {\n  std::string element_type;\n  if (type.struct_def != nullptr) {\n    element_type = GenTypeRef(type.struct_def);\n  } else if (type.enum_def != nullptr) {\n    element_type = GenTypeRef(type.enum_def);\n  } else {\n    element_type = GenType(type.element);\n  }\n\n  return \"\\\"type\\\" : \\\"array\\\", \\\"items\\\" : {\" + element_type + \"}\";\n}\n\nstatic std::string GenType(const Type& type) {\n  switch (type.base_type) {\n    case BASE_TYPE_ARRAY:\n      FLATBUFFERS_FALLTHROUGH();  // fall thru\n    case BASE_TYPE_VECTOR: {\n      return GenArrayType(type);\n    }\n    case BASE_TYPE_STRUCT: {\n      return GenTypeRef(type.struct_def);\n    }\n    case BASE_TYPE_UNION: {\n      std::string union_type_string(\"\\\"anyOf\\\": [\");\n      const auto& union_types = type.enum_def->Vals();\n      for (auto ut = union_types.cbegin(); ut < union_types.cend(); ++ut) {\n        const auto& union_type = *ut;\n        if (union_type->union_type.base_type == BASE_TYPE_NONE) {\n          continue;\n        }\n        if (union_type->union_type.base_type == BASE_TYPE_STRUCT) {\n          union_type_string.append(\n              \"{ \" + GenTypeRef(union_type->union_type.struct_def) + \" }\");\n        }\n        if (union_type != *type.enum_def->Vals().rbegin()) {\n          union_type_string.append(\",\");\n        }\n      }\n      union_type_string.append(\"]\");\n      return union_type_string;\n    }\n    case BASE_TYPE_UTYPE:\n      return GenTypeRef(type.enum_def);\n    default: {\n      return GenBaseType(type);\n    }\n  }\n}\n\n}  // namespace\n\nclass JsonSchemaGenerator : public BaseGenerator {\n private:\n  std::string code_;\n\n public:\n  JsonSchemaGenerator(const Parser& parser, const std::string& path,\n                      const std::string& file_name)\n      : BaseGenerator(parser, path, file_name, \"\", \"\", \"json\") {}\n\n  explicit JsonSchemaGenerator(const BaseGenerator& base_generator)\n      : BaseGenerator(base_generator) {}\n\n  std::string GeneratedFileName(const std::string& path,\n                                const std::string& file_name,\n                                const IDLOptions& options /* unused */) const {\n    (void)options;\n    return path + file_name + \".schema.json\";\n  }\n\n  // If indentation is less than 0, that indicates we don't want any newlines\n  // either.\n  std::string NewLine() const {\n    return parser_.opts.indent_step >= 0 ? \"\\n\" : \"\";\n  }\n\n  std::string Indent(int indent) const {\n    const auto num_spaces = indent * std::max(parser_.opts.indent_step, 0);\n    return std::string(num_spaces, ' ');\n  }\n\n  std::string PrepareDescription(\n      const std::vector<std::string>& comment_lines) {\n    std::string comment;\n    for (auto line_iterator = comment_lines.cbegin();\n         line_iterator != comment_lines.cend(); ++line_iterator) {\n      const auto& comment_line = *line_iterator;\n\n      // remove leading and trailing spaces from comment line\n      const auto start = std::find_if(comment_line.begin(), comment_line.end(),\n                                      [](char c) { return !isspace(c); });\n      const auto end =\n          std::find_if(comment_line.rbegin(), comment_line.rend(), [](char c) {\n            return !isspace(c);\n          }).base();\n      if (start < end) {\n        comment.append(start, end);\n      } else {\n        comment.append(comment_line);\n      }\n\n      if (line_iterator + 1 != comment_lines.cend()) comment.append(\"\\n\");\n    }\n    if (!comment.empty()) {\n      std::string description;\n      if (EscapeString(comment.c_str(), comment.length(), &description, true,\n                       true)) {\n        return description;\n      }\n      return \"\";\n    }\n    return \"\";\n  }\n\n  bool generate() {\n    code_ = \"\";\n    if (parser_.root_struct_def_ == nullptr) {\n      std::cerr << \"Error: Binary schema not generated, no root struct found\\n\";\n      return false;\n    }\n    code_ += \"{\" + NewLine();\n    code_ += Indent(1) +\n             \"\\\"$schema\\\": \\\"https://json-schema.org/draft/2019-09/schema\\\",\" +\n             NewLine();\n    code_ += Indent(1) + \"\\\"definitions\\\": {\" + NewLine();\n    for (auto e = parser_.enums_.vec.cbegin(); e != parser_.enums_.vec.cend();\n         ++e) {\n      code_ += Indent(2) + \"\\\"\" + GenFullName(*e) + \"\\\" : {\" + NewLine();\n      code_ += Indent(3) + GenType(\"string\") + \",\" + NewLine();\n      auto enumdef(Indent(3) + \"\\\"enum\\\": [\");\n      for (auto enum_value = (*e)->Vals().begin();\n           enum_value != (*e)->Vals().end(); ++enum_value) {\n        enumdef.append(\"\\\"\" + (*enum_value)->name + \"\\\"\");\n        if (*enum_value != (*e)->Vals().back()) {\n          enumdef.append(\", \");\n        }\n      }\n      enumdef.append(\"]\");\n      code_ += enumdef + NewLine();\n      code_ += Indent(2) + \"},\" + NewLine();  // close type\n    }\n    for (auto s = parser_.structs_.vec.cbegin();\n         s != parser_.structs_.vec.cend(); ++s) {\n      const auto& structure = *s;\n      code_ += Indent(2) + \"\\\"\" + GenFullName(structure) + \"\\\" : {\" + NewLine();\n      code_ += Indent(3) + GenType(\"object\") + \",\" + NewLine();\n      const auto& comment_lines = structure->doc_comment;\n      auto comment = PrepareDescription(comment_lines);\n      if (comment != \"\") {\n        code_ += Indent(3) + \"\\\"description\\\" : \" + comment + \",\" + NewLine();\n      }\n\n      code_ += Indent(3) + \"\\\"properties\\\" : {\" + NewLine();\n\n      const auto& properties = structure->fields.vec;\n      for (auto prop = properties.cbegin(); prop != properties.cend(); ++prop) {\n        const auto& property = *prop;\n        std::string arrayInfo = \"\";\n        if (IsArray(property->value.type)) {\n          arrayInfo = \",\" + NewLine() + Indent(8) + \"\\\"minItems\\\": \" +\n                      NumToString(property->value.type.fixed_length) + \",\" +\n                      NewLine() + Indent(8) + \"\\\"maxItems\\\": \" +\n                      NumToString(property->value.type.fixed_length);\n        }\n        std::string deprecated_info = \"\";\n        if (property->deprecated) {\n          deprecated_info =\n              \",\" + NewLine() + Indent(8) + \"\\\"deprecated\\\" : true\";\n        }\n        std::string typeLine = Indent(4) + \"\\\"\" + property->name + \"\\\"\";\n        typeLine += \" : {\" + NewLine() + Indent(8);\n        typeLine += GenType(property->value.type);\n        typeLine += arrayInfo;\n        typeLine += deprecated_info;\n        auto description = PrepareDescription(property->doc_comment);\n        if (description != \"\") {\n          typeLine +=\n              \",\" + NewLine() + Indent(8) + \"\\\"description\\\" : \" + description;\n        }\n\n        typeLine += NewLine() + Indent(7) + \"}\";\n        if (property != properties.back()) {\n          typeLine.append(\",\");\n        }\n        code_ += typeLine + NewLine();\n      }\n      code_ += Indent(3) + \"},\" + NewLine();  // close properties\n\n      std::vector<FieldDef*> requiredProperties;\n      std::copy_if(properties.begin(), properties.end(),\n                   back_inserter(requiredProperties),\n                   [](FieldDef const* prop) { return prop->IsRequired(); });\n      if (!requiredProperties.empty()) {\n        auto required_string(Indent(3) + \"\\\"required\\\" : [\");\n        for (auto req_prop = requiredProperties.cbegin();\n             req_prop != requiredProperties.cend(); ++req_prop) {\n          required_string.append(\"\\\"\" + (*req_prop)->name + \"\\\"\");\n          if (*req_prop != requiredProperties.back()) {\n            required_string.append(\", \");\n          }\n        }\n        required_string.append(\"],\");\n        code_ += required_string + NewLine();\n      }\n      code_ += Indent(3) + \"\\\"additionalProperties\\\" : false\" + NewLine();\n      auto closeType(Indent(2) + \"}\");\n      if (*s != parser_.structs_.vec.back()) {\n        closeType.append(\",\");\n      }\n      code_ += closeType + NewLine();  // close type\n    }\n    code_ += Indent(1) + \"},\" + NewLine();  // close definitions\n\n    // mark root type\n    code_ += Indent(1) + \"\\\"$ref\\\" : \\\"#/definitions/\" +\n             GenFullName(parser_.root_struct_def_) + \"\\\"\" + NewLine();\n\n    code_ += \"}\" + NewLine();  // close schema root\n    return true;\n  }\n\n  bool save() const {\n    const auto file_path = GeneratedFileName(path_, file_name_, parser_.opts);\n    return parser_.opts.file_saver->SaveFile(file_path.c_str(), code_, false);\n  }\n\n  const std::string getJson() { return code_; }\n};\n}  // namespace jsons\n\nstatic bool GenerateJsonSchema(const Parser& parser, const std::string& path,\n                               const std::string& file_name) {\n  jsons::JsonSchemaGenerator generator(parser, path, file_name);\n  if (!generator.generate()) {\n    return false;\n  }\n  return generator.save();\n}\n\nnamespace {\n\nclass JsonSchemaCodeGenerator : public CodeGenerator {\n public:\n  Status GenerateCode(const Parser& parser, const std::string& path,\n                      const std::string& filename) override {\n    if (!GenerateJsonSchema(parser, path, filename)) {\n      return Status::ERROR;\n    }\n    return Status::OK;\n  }\n\n  Status GenerateCode(const uint8_t*, int64_t, const CodeGenOptions&) override {\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateMakeRule(const Parser& parser, const std::string& path,\n                          const std::string& filename,\n                          std::string& output) override {\n    (void)parser;\n    (void)path;\n    (void)filename;\n    (void)output;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateGrpcCode(const Parser& parser, const std::string& path,\n                          const std::string& filename) override {\n    (void)parser;\n    (void)path;\n    (void)filename;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateRootFile(const Parser& parser,\n                          const std::string& path) override {\n    (void)parser;\n    (void)path;\n    return Status::NOT_IMPLEMENTED;\n  }\n  bool IsSchemaOnly() const override { return true; }\n\n  bool SupportsBfbsGeneration() const override { return false; }\n\n  bool SupportsRootFileGeneration() const override { return false; }\n\n  IDLOptions::Language Language() const override {\n    return IDLOptions::kJsonSchema;\n  }\n\n  std::string LanguageName() const override { return \"JsonSchema\"; }\n};\n}  // namespace\n\nstd::unique_ptr<CodeGenerator> NewJsonSchemaCodeGenerator() {\n  return std::unique_ptr<JsonSchemaCodeGenerator>(\n      new JsonSchemaCodeGenerator());\n}\n}  // namespace flatbuffers\n"
  },
  {
    "path": "src/idl_gen_json_schema.h",
    "content": "/*\n * Copyright 2023 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_IDL_GEN_JSON_SCHEMA_H_\n#define FLATBUFFERS_IDL_GEN_JSON_SCHEMA_H_\n\n#include <memory>\n#include <string>\n\n#include \"flatbuffers/code_generator.h\"\n\nnamespace flatbuffers {\n\n// Constructs a new JsonSchema Code generator.\nstd::unique_ptr<CodeGenerator> NewJsonSchemaCodeGenerator();\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_IDL_GEN_JSON_SCHEMA_H_\n"
  },
  {
    "path": "src/idl_gen_kotlin.cpp",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// independent from idl_parser, since this code is not needed for most clients\n\n#include \"idl_gen_kotlin.h\"\n\n#include <functional>\n#include <unordered_set>\n\n#include \"flatbuffers/code_generators.h\"\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/idl.h\"\n#include \"flatbuffers/util.h\"\n#include \"idl_namer.h\"\n\nnamespace flatbuffers {\n\nnamespace kotlin {\n\nnamespace {\n\ntypedef std::map<std::string, std::pair<std::string, std::string> > FbbParamMap;\nstatic TypedFloatConstantGenerator KotlinFloatGen(\"Double.\", \"Float.\", \"NaN\",\n                                                  \"POSITIVE_INFINITY\",\n                                                  \"NEGATIVE_INFINITY\");\n\nstatic const CommentConfig comment_config = {\"/**\", \" *\", \" */\"};\nstatic const std::string ident_pad = \"    \";\nstatic std::set<std::string> KotlinKeywords() {\n  return {\"package\",  \"as\",     \"typealias\", \"class\",  \"this\",   \"super\",\n          \"val\",      \"var\",    \"fun\",       \"for\",    \"null\",   \"true\",\n          \"false\",    \"is\",     \"in\",        \"throw\",  \"return\", \"break\",\n          \"continue\", \"object\", \"if\",        \"try\",    \"else\",   \"while\",\n          \"do\",       \"when\",   \"interface\", \"typeof\", \"Any\",    \"Character\"};\n}\n\nstatic Namer::Config KotlinDefaultConfig() {\n  return {/*types=*/Case::kKeep,\n          /*constants=*/Case::kKeep,\n          /*methods=*/Case::kLowerCamel,\n          /*functions=*/Case::kKeep,\n          /*fields=*/Case::kLowerCamel,\n          /*variables=*/Case::kLowerCamel,\n          /*variants=*/Case::kKeep,\n          /*enum_variant_seperator=*/\"\",  // I.e. Concatenate.\n          /*escape_keywords=*/Namer::Config::Escape::BeforeConvertingCase,\n          /*namespaces=*/Case::kKeep,\n          /*namespace_seperator=*/\"__\",\n          /*object_prefix=*/\"\",\n          /*object_suffix=*/\"T\",\n          /*keyword_prefix=*/\"\",\n          /*keyword_suffix=*/\"_\",\n          /*keywords_casing=*/Namer::Config::KeywordsCasing::CaseSensitive,\n          /*filenames=*/Case::kKeep,\n          /*directories=*/Case::kKeep,\n          /*output_path=*/\"\",\n          /*filename_suffix=*/\"\",\n          /*filename_extension=*/\".kt\"};\n}\n}  // namespace\n\nclass KotlinGenerator : public BaseGenerator {\n public:\n  KotlinGenerator(const Parser& parser, const std::string& path,\n                  const std::string& file_name)\n      : BaseGenerator(parser, path, file_name, \"\", \".\", \"kt\"),\n        namer_(WithFlagOptions(KotlinDefaultConfig(), parser.opts, path),\n               KotlinKeywords()) {}\n\n  KotlinGenerator& operator=(const KotlinGenerator&);\n  bool generate() FLATBUFFERS_OVERRIDE {\n    std::string one_file_code;\n\n    for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end();\n         ++it) {\n      CodeWriter enumWriter(ident_pad);\n      auto& enum_def = **it;\n      GenEnum(enum_def, enumWriter);\n      if (parser_.opts.one_file) {\n        one_file_code += enumWriter.ToString();\n      } else {\n        if (!SaveType(enum_def.name, *enum_def.defined_namespace,\n                      enumWriter.ToString(), false))\n          return false;\n      }\n    }\n\n    for (auto it = parser_.structs_.vec.begin();\n         it != parser_.structs_.vec.end(); ++it) {\n      CodeWriter structWriter(ident_pad);\n      auto& struct_def = **it;\n      GenStruct(struct_def, structWriter, parser_.opts);\n      if (parser_.opts.one_file) {\n        one_file_code += structWriter.ToString();\n      } else {\n        if (!SaveType(struct_def.name, *struct_def.defined_namespace,\n                      structWriter.ToString(), true))\n          return false;\n      }\n    }\n\n    if (parser_.opts.one_file) {\n      return SaveType(file_name_, *parser_.current_namespace_, one_file_code,\n                      true);\n    }\n    return true;\n  }\n\n  // Save out the generated code for a single class while adding\n  // declaration boilerplate.\n  bool SaveType(const std::string& defname, const Namespace& ns,\n                const std::string& classcode, bool needs_includes) const {\n    if (!classcode.length()) return true;\n\n    std::string code =\n        \"// \" + std::string(FlatBuffersGeneratedWarning()) + \"\\n\\n\";\n\n    std::string namespace_name = FullNamespace(\".\", ns);\n    if (!namespace_name.empty()) {\n      code += \"package \" + namespace_name;\n      code += \"\\n\\n\";\n    }\n    if (needs_includes) {\n      code +=\n          \"import com.google.flatbuffers.BaseVector\\n\"\n          \"import com.google.flatbuffers.BooleanVector\\n\"\n          \"import com.google.flatbuffers.ByteVector\\n\"\n          \"import com.google.flatbuffers.Constants\\n\"\n          \"import com.google.flatbuffers.DoubleVector\\n\"\n          \"import com.google.flatbuffers.FlatBufferBuilder\\n\"\n          \"import com.google.flatbuffers.FloatVector\\n\"\n          \"import com.google.flatbuffers.LongVector\\n\"\n          \"import com.google.flatbuffers.StringVector\\n\"\n          \"import com.google.flatbuffers.Struct\\n\"\n          \"import com.google.flatbuffers.Table\\n\"\n          \"import com.google.flatbuffers.UnionVector\\n\"\n          \"import java.nio.ByteBuffer\\n\"\n          \"import java.nio.ByteOrder\\n\"\n          \"import kotlin.math.sign\\n\\n\";\n    }\n    code += classcode;\n    const std::string dirs = namer_.Directories(ns);\n    EnsureDirExists(dirs);\n    const std::string filename =\n        dirs + namer_.File(defname, /*skips=*/SkipFile::Suffix);\n    return parser_.opts.file_saver->SaveFile(filename.c_str(), code, false);\n  }\n\n  static bool IsEnum(const Type& type) {\n    return type.enum_def != nullptr && IsInteger(type.base_type);\n  }\n\n  static std::string GenTypeBasic(const BaseType& type) {\n    // clang-format off\n    static const char * const kotlin_typename[] = {\n      #define FLATBUFFERS_TD(ENUM, IDLTYPE, \\\n              CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, RTYPE, KTYPE, ...) \\\n        #KTYPE,\n        FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)\n      #undef FLATBUFFERS_TD\n    };\n    // clang-format on\n    return kotlin_typename[type];\n  }\n\n  std::string GenTypePointer(const Type& type) const {\n    switch (type.base_type) {\n      case BASE_TYPE_STRING:\n        return \"String\";\n      case BASE_TYPE_VECTOR:\n        return GenTypeGet(type.VectorType());\n      case BASE_TYPE_STRUCT:\n        return WrapInNameSpace(*type.struct_def);\n      default:\n        return \"Table\";\n    }\n  }\n\n  // with the addition of optional scalar types,\n  // we are adding the nullable '?' operator to return type of a field.\n  std::string GetterReturnType(const FieldDef& field) const {\n    auto base_type = field.value.type.base_type;\n\n    auto r_type = GenTypeGet(field.value.type);\n    if (field.IsScalarOptional() ||\n        // string, structs and unions\n        (!field.IsRequired() &&\n         (base_type == BASE_TYPE_STRING || base_type == BASE_TYPE_STRUCT ||\n          base_type == BASE_TYPE_UNION)) ||\n        // vector of anything not scalar\n        (base_type == BASE_TYPE_VECTOR && !field.IsRequired() &&\n         !IsScalar(field.value.type.VectorType().base_type))) {\n      r_type += \"?\";\n    }\n    return r_type;\n  }\n\n  std::string GenTypeGet(const Type& type) const {\n    return IsScalar(type.base_type) ? GenTypeBasic(type.base_type)\n                                    : GenTypePointer(type);\n  }\n\n  std::string GenEnumDefaultValue(const FieldDef& field) const {\n    auto& value = field.value;\n    FLATBUFFERS_ASSERT(value.type.enum_def);\n    auto& enum_def = *value.type.enum_def;\n    auto enum_val = enum_def.FindByValue(value.constant);\n    return enum_val ? (WrapInNameSpace(enum_def) + \".\" + enum_val->name)\n                    : value.constant;\n  }\n\n  // Generate default values to compare against a default value when\n  // `force_defaults` is `false`.\n  // Main differences are:\n  // - Floats are upcasted to doubles\n  // - Unsigned are casted to signed\n  std::string GenFBBDefaultValue(const FieldDef& field) const {\n    if (field.IsScalarOptional()) {\n      // although default value is null, java API forces us to present a real\n      // default value for scalars, while adding a field to the buffer. This is\n      // not a problem because the default can be representing just by not\n      // calling builder.addMyField()\n      switch (field.value.type.base_type) {\n        case BASE_TYPE_DOUBLE:\n        case BASE_TYPE_FLOAT:\n          return \"0.0\";\n        case BASE_TYPE_BOOL:\n          return \"false\";\n        default:\n          return \"0\";\n      }\n    }\n    auto out = GenDefaultValue(field, true);\n    // All FlatBufferBuilder default floating point values are doubles\n    if (field.value.type.base_type == BASE_TYPE_FLOAT) {\n      if (out.find(\"Float\") != std::string::npos) {\n        out.replace(0, 5, \"Double\");\n      }\n    }\n    // Guarantee all values are doubles\n    if (out.back() == 'f') out.pop_back();\n    return out;\n  }\n\n  // FlatBufferBuilder only store signed types, so this function\n  // returns a cast for unsigned values\n  std::string GenFBBValueCast(const FieldDef& field) const {\n    if (IsUnsigned(field.value.type.base_type)) {\n      return CastToSigned(field.value.type);\n    }\n    return \"\";\n  }\n\n  std::string GenDefaultValue(const FieldDef& field,\n                              bool force_signed = false) const {\n    auto& value = field.value;\n    auto base_type = field.value.type.base_type;\n\n    if (field.IsScalarOptional()) {\n      return \"null\";\n    }\n    if (IsFloat(base_type)) {\n      auto val = KotlinFloatGen.GenFloatConstant(field);\n      if (base_type == BASE_TYPE_DOUBLE && val.back() == 'f') {\n        val.pop_back();\n      }\n      return val;\n    }\n\n    if (base_type == BASE_TYPE_BOOL) {\n      return value.constant == \"0\" ? \"false\" : \"true\";\n    }\n\n    std::string suffix = \"\";\n\n    if (base_type == BASE_TYPE_LONG || !force_signed) {\n      suffix = LiteralSuffix(base_type);\n    }\n    return value.constant + suffix;\n  }\n\n  void GenEnum(EnumDef& enum_def, CodeWriter& writer) const {\n    if (enum_def.generated) return;\n\n    GenerateComment(enum_def.doc_comment, writer, &comment_config);\n\n    writer += \"@Suppress(\\\"unused\\\")\";\n    writer += \"class \" + namer_.Type(enum_def) + \" private constructor() {\";\n    writer.IncrementIdentLevel();\n\n    GenerateCompanionObject(writer, [&]() {\n      // Write all properties\n      auto vals = enum_def.Vals();\n      for (auto it = vals.begin(); it != vals.end(); ++it) {\n        auto& ev = **it;\n        auto field_type = GenTypeBasic(enum_def.underlying_type.base_type);\n        auto val = enum_def.ToString(ev);\n        auto suffix = LiteralSuffix(enum_def.underlying_type.base_type);\n        writer.SetValue(\"name\", namer_.Variant(ev.name));\n        writer.SetValue(\"type\", field_type);\n        writer.SetValue(\"val\", val + suffix);\n        GenerateComment(ev.doc_comment, writer, &comment_config);\n        writer += \"const val {{name}}: {{type}} = {{val}}\";\n      }\n\n      // Generate a generate string table for enum values.\n      // Problem is, if values are very sparse that could generate really\n      // big tables. Ideally in that case we generate a map lookup\n      // instead, but for the moment we simply don't output a table at all.\n      auto range = enum_def.Distance();\n      // Average distance between values above which we consider a table\n      // \"too sparse\". Change at will.\n      static const uint64_t kMaxSparseness = 5;\n      bool generate_names =\n          range / static_cast<uint64_t>(enum_def.size()) < kMaxSparseness &&\n          parser_.opts.mini_reflect == IDLOptions::kTypesAndNames;\n      if (generate_names) {\n        GeneratePropertyOneLine(writer, \"names\", \"Array<String>\", [&]() {\n          writer += \"arrayOf(\\\\\";\n          auto val = enum_def.Vals().front();\n          for (auto it = vals.begin(); it != vals.end(); ++it) {\n            auto ev = *it;\n            for (auto k = enum_def.Distance(val, ev); k > 1; --k)\n              writer += \"\\\"\\\", \\\\\";\n            val = ev;\n            writer += \"\\\"\" + (*it)->name + \"\\\"\\\\\";\n            if (it + 1 != vals.end()) {\n              writer += \", \\\\\";\n            }\n          }\n          writer += \")\";\n        });\n        GenerateFunOneLine(\n            writer, \"name\", \"e: Int\", \"String\",\n            [&]() {\n              writer += \"names[e\\\\\";\n              if (enum_def.MinValue()->IsNonZero())\n                writer += \" - \" + enum_def.MinValue()->name + \".toInt()\\\\\";\n              writer += \"]\";\n            },\n            parser_.opts.gen_jvmstatic);\n      }\n    });\n    writer.DecrementIdentLevel();\n    writer += \"}\";\n  }\n\n  // Returns the function name that is able to read a value of the given type.\n  std::string ByteBufferGetter(const Type& type,\n                               std::string bb_var_name) const {\n    switch (type.base_type) {\n      case BASE_TYPE_STRING:\n        return \"__string\";\n      case BASE_TYPE_STRUCT:\n        return \"__struct\";\n      case BASE_TYPE_UNION:\n        return \"__union\";\n      case BASE_TYPE_VECTOR:\n        return ByteBufferGetter(type.VectorType(), bb_var_name);\n      case BASE_TYPE_INT:\n      case BASE_TYPE_UINT:\n        return bb_var_name + \".getInt\";\n      case BASE_TYPE_SHORT:\n      case BASE_TYPE_USHORT:\n        return bb_var_name + \".getShort\";\n      case BASE_TYPE_ULONG:\n      case BASE_TYPE_LONG:\n        return bb_var_name + \".getLong\";\n      case BASE_TYPE_FLOAT:\n        return bb_var_name + \".getFloat\";\n      case BASE_TYPE_DOUBLE:\n        return bb_var_name + \".getDouble\";\n      case BASE_TYPE_CHAR:\n      case BASE_TYPE_UCHAR:\n      case BASE_TYPE_NONE:\n      case BASE_TYPE_UTYPE:\n        return bb_var_name + \".get\";\n      case BASE_TYPE_BOOL:\n        return \"0.toByte() != \" + bb_var_name + \".get\";\n      default:\n        return bb_var_name + \".\" +\n               namer_.Method(\"get\", GenTypeBasic(type.base_type));\n    }\n  }\n\n  std::string ByteBufferSetter(const Type& type) const {\n    if (IsScalar(type.base_type)) {\n      switch (type.base_type) {\n        case BASE_TYPE_INT:\n        case BASE_TYPE_UINT:\n          return \"bb.putInt\";\n        case BASE_TYPE_SHORT:\n        case BASE_TYPE_USHORT:\n          return \"bb.putShort\";\n        case BASE_TYPE_ULONG:\n        case BASE_TYPE_LONG:\n          return \"bb.putLong\";\n        case BASE_TYPE_FLOAT:\n          return \"bb.putFloat\";\n        case BASE_TYPE_DOUBLE:\n          return \"bb.putDouble\";\n        case BASE_TYPE_CHAR:\n        case BASE_TYPE_UCHAR:\n        case BASE_TYPE_BOOL:\n        case BASE_TYPE_NONE:\n        case BASE_TYPE_UTYPE:\n          return \"bb.put\";\n        default:\n          return \"bb.\" + namer_.Method(\"put\", GenTypeBasic(type.base_type));\n      }\n    }\n    return \"\";\n  }\n\n  // Returns the function name that is able to read a value of the given type.\n  std::string GenLookupByKey(flatbuffers::FieldDef* key_field,\n                             const std::string& bb_var_name,\n                             const char* num = nullptr) const {\n    auto type = key_field->value.type;\n    return ByteBufferGetter(type, bb_var_name) + \"(\" +\n           GenOffsetGetter(key_field, num) + \")\";\n  }\n\n  // Returns the method name for use with add/put calls.\n  static std::string GenMethod(const Type& type) {\n    return IsScalar(type.base_type) ? ToSignedType(type)\n                                    : (IsStruct(type) ? \"Struct\" : \"Offset\");\n  }\n\n  // Recursively generate arguments for a constructor, to deal with nested\n  // structs.\n  void GenStructArgs(const StructDef& struct_def, CodeWriter& writer,\n                     const char* nameprefix) const {\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (IsStruct(field.value.type)) {\n        // Generate arguments for a struct inside a struct. To ensure\n        // names don't clash, and to make it obvious these arguments are\n        // constructing a nested struct, prefix the name with the field\n        // name.\n        GenStructArgs(*field.value.type.struct_def, writer,\n                      (nameprefix + (field.name + \"_\")).c_str());\n      } else {\n        writer += std::string(\", \") + nameprefix + \"\\\\\";\n        writer += namer_.Field(field) + \": \\\\\";\n        writer += GenTypeBasic(field.value.type.base_type) + \"\\\\\";\n      }\n    }\n  }\n\n  // Recusively generate struct construction statements of the form:\n  // builder.putType(name);\n  // and insert manual padding.\n  void GenStructBody(const StructDef& struct_def, CodeWriter& writer,\n                     const char* nameprefix) const {\n    writer.SetValue(\"align\", NumToString(struct_def.minalign));\n    writer.SetValue(\"size\", NumToString(struct_def.bytesize));\n    writer += \"builder.prep({{align}}, {{size}})\";\n    auto fields_vec = struct_def.fields.vec;\n    for (auto it = fields_vec.rbegin(); it != fields_vec.rend(); ++it) {\n      auto& field = **it;\n\n      if (field.padding) {\n        writer.SetValue(\"pad\", NumToString(field.padding));\n        writer += \"builder.pad({{pad}})\";\n      }\n      if (IsStruct(field.value.type)) {\n        GenStructBody(*field.value.type.struct_def, writer,\n                      (nameprefix + (namer_.Variable(field) + \"_\")).c_str());\n      } else {\n        writer.SetValue(\"type\", GenMethod(field.value.type));\n        writer.SetValue(\"argname\", nameprefix + namer_.Variable(field));\n        writer.SetValue(\"cast\", CastToSigned(field.value.type));\n        writer += \"builder.put{{type}}({{argname}}{{cast}})\";\n      }\n    }\n  }\n\n  std::string GenByteBufferLength(const char* bb_name) const {\n    std::string bb_len = bb_name;\n    bb_len += \".capacity()\";\n    return bb_len;\n  }\n\n  std::string GenOffsetGetter(flatbuffers::FieldDef* key_field,\n                              const char* num = nullptr) const {\n    std::string key_offset =\n        \"__offset(\" + NumToString(key_field->value.offset) + \", \";\n    if (num) {\n      key_offset += num;\n      key_offset += \", _bb)\";\n    } else {\n      key_offset += GenByteBufferLength(\"bb\");\n      key_offset += \" - tableOffset, bb)\";\n    }\n    return key_offset;\n  }\n\n  void GenStruct(StructDef& struct_def, CodeWriter& writer,\n                 IDLOptions options) const {\n    if (struct_def.generated) return;\n\n    GenerateComment(struct_def.doc_comment, writer, &comment_config);\n    auto fixed = struct_def.fixed;\n\n    writer.SetValue(\"struct_name\", namer_.Type(struct_def));\n    writer.SetValue(\"superclass\", fixed ? \"Struct\" : \"Table\");\n\n    writer += \"@Suppress(\\\"unused\\\")\";\n    writer += \"class {{struct_name}} : {{superclass}}() {\\n\";\n\n    writer.IncrementIdentLevel();\n\n    {\n      // Generate the __init() method that sets the field in a pre-existing\n      // accessor object. This is to allow object reuse.\n      GenerateFun(writer, \"__init\", \"_i: Int, _bb: ByteBuffer\", \"\",\n                  [&]() { writer += \"__reset(_i, _bb)\"; });\n\n      // Generate assign method\n      GenerateFun(writer, \"__assign\", \"_i: Int, _bb: ByteBuffer\",\n                  namer_.Type(struct_def), [&]() {\n                    writer += \"__init(_i, _bb)\";\n                    writer += \"return this\";\n                  });\n\n      // Generate all getters\n      GenerateStructGetters(struct_def, writer);\n\n      // Generate Static Fields\n      GenerateCompanionObject(writer, [&]() {\n        if (!struct_def.fixed) {\n          FieldDef* key_field = nullptr;\n\n          // Generate version check method.\n          // Force compile time error if not using the same version\n          // runtime.\n          GenerateFunOneLine(\n              writer, \"validateVersion\", \"\", \"\",\n              [&]() { writer += \"Constants.FLATBUFFERS_25_12_19()\"; },\n              options.gen_jvmstatic);\n\n          GenerateGetRootAsAccessors(namer_.Type(struct_def), writer, options);\n          GenerateBufferHasIdentifier(struct_def, writer, options);\n          GenerateTableCreator(struct_def, writer, options);\n\n          GenerateStartStructMethod(struct_def, writer, options);\n\n          // Static Add for fields\n          auto fields = struct_def.fields.vec;\n          int field_pos = -1;\n          for (auto it = fields.begin(); it != fields.end(); ++it) {\n            auto& field = **it;\n            field_pos++;\n            if (field.deprecated) continue;\n            if (field.key) key_field = &field;\n            GenerateAddField(NumToString(field_pos), field, writer, options);\n\n            if (IsVector(field.value.type)) {\n              auto vector_type = field.value.type.VectorType();\n              if (!IsStruct(vector_type)) {\n                GenerateCreateVectorField(field, writer, options);\n              }\n              GenerateStartVectorField(field, writer, options);\n            }\n          }\n\n          GenerateEndStructMethod(struct_def, writer, options);\n          auto file_identifier = parser_.file_identifier_;\n          if (parser_.root_struct_def_ == &struct_def) {\n            GenerateFinishStructBuffer(struct_def, file_identifier, writer,\n                                       options);\n            GenerateFinishSizePrefixed(struct_def, file_identifier, writer,\n                                       options);\n          }\n\n          if (struct_def.has_key) {\n            GenerateLookupByKey(key_field, struct_def, writer, options);\n          }\n        } else {\n          GenerateStaticConstructor(struct_def, writer, options);\n        }\n      });\n    }\n\n    // class closing\n    writer.DecrementIdentLevel();\n    writer += \"}\";\n  }\n\n  // TODO: move key_field to reference instead of pointer\n  void GenerateLookupByKey(FieldDef* key_field, StructDef& struct_def,\n                           CodeWriter& writer, const IDLOptions options) const {\n    std::stringstream params;\n    params << \"obj: \" << namer_.Type(struct_def) << \"?\"\n           << \", \";\n    params << \"vectorLocation: Int, \";\n    params << \"key: \" << GenTypeGet(key_field->value.type) << \", \";\n    params << \"bb: ByteBuffer\";\n\n    auto statements = [&]() {\n      auto base_type = key_field->value.type.base_type;\n      writer.SetValue(\"struct_name\", namer_.Type(struct_def));\n      if (base_type == BASE_TYPE_STRING) {\n        writer +=\n            \"val byteKey = key.\"\n            \"toByteArray(java.nio.charset.StandardCharsets.UTF_8)\";\n      }\n      writer += \"var span = bb.getInt(vectorLocation - 4)\";\n      writer += \"var start = 0\";\n      writer += \"while (span != 0) {\";\n      writer.IncrementIdentLevel();\n      writer += \"var middle = span / 2\";\n      writer +=\n          \"val tableOffset = __indirect(vector\"\n          \"Location + 4 * (start + middle), bb)\";\n      if (IsString(key_field->value.type)) {\n        writer += \"val comp = compareStrings(\\\\\";\n        writer += GenOffsetGetter(key_field) + \"\\\\\";\n        writer += \", byteKey, bb)\";\n      } else {\n        auto cast = CastToUsigned(key_field->value.type);\n        auto get_val = GenLookupByKey(key_field, \"bb\");\n        writer += \"val value = \" + get_val + cast;\n        writer += \"val comp = value.compareTo(key)\";\n      }\n      writer += \"when {\";\n      writer.IncrementIdentLevel();\n      writer += \"comp > 0 -> span = middle\";\n      writer += \"comp < 0 -> {\";\n      writer.IncrementIdentLevel();\n      writer += \"middle++\";\n      writer += \"start += middle\";\n      writer += \"span -= middle\";\n      writer.DecrementIdentLevel();\n      writer += \"}\";  // end comp < 0\n      writer += \"else -> {\";\n      writer.IncrementIdentLevel();\n      writer += \"return (obj ?: {{struct_name}}()).__assign(tableOffset, bb)\";\n      writer.DecrementIdentLevel();\n      writer += \"}\";  // end else\n      writer.DecrementIdentLevel();\n      writer += \"}\";  // end when\n      writer.DecrementIdentLevel();\n      writer += \"}\";  // end while\n      writer += \"return null\";\n    };\n    GenerateFun(writer, \"__lookup_by_key\", params.str(),\n                namer_.Type(struct_def) + \"?\", statements,\n                options.gen_jvmstatic);\n  }\n\n  void GenerateFinishSizePrefixed(StructDef& struct_def,\n                                  const std::string& identifier,\n                                  CodeWriter& writer,\n                                  const IDLOptions options) const {\n    auto id = identifier.length() > 0 ? \", \\\"\" + identifier + \"\\\"\" : \"\";\n    auto params = \"builder: FlatBufferBuilder, offset: Int\";\n    auto method_name =\n        namer_.LegacyJavaMethod2(\"finishSizePrefixed\", struct_def, \"Buffer\");\n    GenerateFunOneLine(\n        writer, method_name, params, \"\",\n        [&]() { writer += \"builder.finishSizePrefixed(offset\" + id + \")\"; },\n        options.gen_jvmstatic);\n  }\n  void GenerateFinishStructBuffer(StructDef& struct_def,\n                                  const std::string& identifier,\n                                  CodeWriter& writer,\n                                  const IDLOptions options) const {\n    auto id = identifier.length() > 0 ? \", \\\"\" + identifier + \"\\\"\" : \"\";\n    auto params = \"builder: FlatBufferBuilder, offset: Int\";\n    auto method_name =\n        namer_.LegacyKotlinMethod(\"finish\", struct_def, \"Buffer\");\n    GenerateFunOneLine(\n        writer, method_name, params, \"\",\n        [&]() { writer += \"builder.finish(offset\" + id + \")\"; },\n        options.gen_jvmstatic);\n  }\n\n  void GenerateEndStructMethod(StructDef& struct_def, CodeWriter& writer,\n                               const IDLOptions options) const {\n    // Generate end{{TableName}}(builder: FlatBufferBuilder) method\n    auto name = namer_.LegacyJavaMethod2(\"end\", struct_def, \"\");\n    auto params = \"builder: FlatBufferBuilder\";\n    auto returns = \"Int\";\n    auto field_vec = struct_def.fields.vec;\n\n    GenerateFun(\n        writer, name, params, returns,\n        [&]() {\n          writer += \"val o = builder.endTable()\";\n          writer.IncrementIdentLevel();\n          for (auto it = field_vec.begin(); it != field_vec.end(); ++it) {\n            auto& field = **it;\n            if (field.deprecated || !field.IsRequired()) {\n              continue;\n            }\n            writer.SetValue(\"offset\", NumToString(field.value.offset));\n            writer += \"builder.required(o, {{offset}})\";\n          }\n          writer.DecrementIdentLevel();\n          writer += \"return o\";\n        },\n        options.gen_jvmstatic);\n  }\n\n  // Generate a method to create a vector from a Kotlin array.\n  void GenerateCreateVectorField(FieldDef& field, CodeWriter& writer,\n                                 const IDLOptions options) const {\n    auto vector_type = field.value.type.VectorType();\n    auto method_name = namer_.Method(\"create\", field, \"vector\");\n    auto params = \"builder: FlatBufferBuilder, data: \" +\n                  GenTypeBasic(vector_type.base_type) + \"Array\";\n    writer.SetValue(\"size\", NumToString(InlineSize(vector_type)));\n    writer.SetValue(\"align\", NumToString(InlineAlignment(vector_type)));\n    writer.SetValue(\"root\", GenMethod(vector_type));\n    writer.SetValue(\"cast\", CastToSigned(vector_type));\n\n    if (IsUnsigned(vector_type.base_type)) {\n      writer += \"@kotlin.ExperimentalUnsignedTypes\";\n    }\n    GenerateFun(\n        writer, method_name, params, \"Int\",\n        [&]() {\n          writer += \"builder.startVector({{size}}, data.size, {{align}})\";\n          writer += \"for (i in data.size - 1 downTo 0) {\";\n          writer.IncrementIdentLevel();\n          writer += \"builder.add{{root}}(data[i]{{cast}})\";\n          writer.DecrementIdentLevel();\n          writer += \"}\";\n          writer += \"return builder.endVector()\";\n        },\n        options.gen_jvmstatic);\n  }\n\n  void GenerateStartVectorField(FieldDef& field, CodeWriter& writer,\n                                const IDLOptions options) const {\n    // Generate a method to start a vector, data to be added manually\n    // after.\n    auto vector_type = field.value.type.VectorType();\n    auto params = \"builder: FlatBufferBuilder, numElems: Int\";\n    writer.SetValue(\"size\", NumToString(InlineSize(vector_type)));\n    writer.SetValue(\"align\", NumToString(InlineAlignment(vector_type)));\n\n    GenerateFunOneLine(\n        writer, namer_.Method(\"start\", field, \"Vector\"), params, \"\",\n        [&]() {\n          writer += \"builder.startVector({{size}}, numElems, {{align}})\";\n        },\n        options.gen_jvmstatic);\n  }\n\n  void GenerateAddField(std::string field_pos, FieldDef& field,\n                        CodeWriter& writer, const IDLOptions options) const {\n    auto field_type = GenTypeBasic(field.value.type.base_type);\n    auto secondArg = namer_.Variable(field.name) + \": \" + field_type;\n\n    auto content = [&]() {\n      auto method = GenMethod(field.value.type);\n      writer.SetValue(\"field_name\", namer_.Field(field));\n      writer.SetValue(\"method_name\", method);\n      writer.SetValue(\"pos\", field_pos);\n      writer.SetValue(\"default\", GenFBBDefaultValue(field));\n      writer.SetValue(\"cast\", GenFBBValueCast(field));\n      if (field.key) {\n        // field has key attribute, so always need to exist\n        // even if its value is equal to default.\n        // Generated code will bypass default checking\n        // resulting in { builder.addShort(name); slot(id); }\n        writer += \"builder.add{{method_name}}({{field_name}}{{cast}})\";\n        writer += \"builder.slot({{pos}})\";\n      } else {\n        writer += \"builder.add{{method_name}}({{pos}}, \\\\\";\n        writer += \"{{field_name}}{{cast}}, {{default}})\";\n      }\n    };\n    auto signature = namer_.LegacyKotlinMethod(\"add\", field, \"\");\n    auto params = \"builder: FlatBufferBuilder, \" + secondArg;\n    if (field.key) {\n      GenerateFun(writer, signature, params, \"\", content,\n                  options.gen_jvmstatic);\n    } else {\n      GenerateFunOneLine(writer, signature, params, \"\", content,\n                         options.gen_jvmstatic);\n    }\n  }\n\n  static std::string ToSignedType(const Type& type) {\n    switch (type.base_type) {\n      case BASE_TYPE_UINT:\n        return GenTypeBasic(BASE_TYPE_INT);\n      case BASE_TYPE_ULONG:\n        return GenTypeBasic(BASE_TYPE_LONG);\n      case BASE_TYPE_UCHAR:\n      case BASE_TYPE_NONE:\n      case BASE_TYPE_UTYPE:\n        return GenTypeBasic(BASE_TYPE_CHAR);\n      case BASE_TYPE_USHORT:\n        return GenTypeBasic(BASE_TYPE_SHORT);\n      case BASE_TYPE_VECTOR:\n        return ToSignedType(type.VectorType());\n      default:\n        return GenTypeBasic(type.base_type);\n    }\n  }\n\n  static std::string FlexBufferBuilderCast(const std::string& method,\n                                           FieldDef& field, bool isFirst) {\n    auto field_type = GenTypeBasic(field.value.type.base_type);\n    std::string to_type;\n    if (method == \"Boolean\")\n      to_type = \"Boolean\";\n    else if (method == \"Long\")\n      to_type = \"Long\";\n    else if (method == \"Int\" || method == \"Offset\" || method == \"Struct\")\n      to_type = \"Int\";\n    else if (method == \"Byte\" || method.empty())\n      to_type = isFirst ? \"Byte\" : \"Int\";\n    else if (method == \"Short\")\n      to_type = isFirst ? \"Short\" : \"Int\";\n    else if (method == \"Double\")\n      to_type = \"Double\";\n    else if (method == \"Float\")\n      to_type = isFirst ? \"Float\" : \"Double\";\n    else if (method == \"UByte\")\n\n      if (field_type != to_type) return \".to\" + to_type + \"()\";\n    return \"\";\n  }\n\n  // fun startMonster(builder: FlatBufferBuilder) = builder.startTable(11)\n  void GenerateStartStructMethod(StructDef& struct_def, CodeWriter& code,\n                                 const IDLOptions options) const {\n    GenerateFunOneLine(\n        code, namer_.LegacyJavaMethod2(\"start\", struct_def, \"\"),\n        \"builder: FlatBufferBuilder\", \"\",\n        [&]() {\n          code += \"builder.startTable(\" +\n                  NumToString(struct_def.fields.vec.size()) + \")\";\n        },\n        options.gen_jvmstatic);\n  }\n\n  void GenerateTableCreator(StructDef& struct_def, CodeWriter& writer,\n                            const IDLOptions options) const {\n    // Generate a method that creates a table in one go. This is only possible\n    // when the table has no struct fields, since those have to be created\n    // inline, and there's no way to do so in Java.\n    bool has_no_struct_fields = true;\n    int num_fields = 0;\n    auto fields_vec = struct_def.fields.vec;\n\n    for (auto it = fields_vec.begin(); it != fields_vec.end(); ++it) {\n      auto& field = **it;\n      if (field.deprecated) continue;\n      if (IsStruct(field.value.type)) {\n        has_no_struct_fields = false;\n      } else {\n        num_fields++;\n      }\n    }\n    // JVM specifications restrict default constructor params to be < 255.\n    // Longs and doubles take up 2 units, so we set the limit to be < 127.\n    if (has_no_struct_fields && num_fields && num_fields < 127) {\n      // Generate a table constructor of the form:\n      // public static int createName(FlatBufferBuilder builder, args...)\n\n      auto name = namer_.LegacyJavaMethod2(\"create\", struct_def, \"\");\n      std::stringstream params;\n      params << \"builder: FlatBufferBuilder\";\n      for (auto it = fields_vec.begin(); it != fields_vec.end(); ++it) {\n        auto& field = **it;\n        if (field.deprecated) continue;\n        params << \", \" << namer_.Variable(field);\n        if (!IsScalar(field.value.type.base_type)) {\n          params << \"Offset: \";\n        } else {\n          params << \": \";\n        }\n        auto optional = field.IsScalarOptional() ? \"?\" : \"\";\n        params << GenTypeBasic(field.value.type.base_type) << optional;\n      }\n\n      GenerateFun(\n          writer, name, params.str(), \"Int\",\n          [&]() {\n            writer.SetValue(\"vec_size\", NumToString(fields_vec.size()));\n\n            writer += \"builder.startTable({{vec_size}})\";\n\n            auto sortbysize = struct_def.sortbysize;\n            auto largest = sortbysize ? sizeof(largest_scalar_t) : 1;\n            for (size_t size = largest; size; size /= 2) {\n              for (auto it = fields_vec.rbegin(); it != fields_vec.rend();\n                   ++it) {\n                auto& field = **it;\n                auto base_type_size = SizeOf(field.value.type.base_type);\n                if (!field.deprecated &&\n                    (!sortbysize || size == base_type_size)) {\n                  writer.SetValue(\"field_name\", namer_.Field(field));\n\n                  // we wrap on null check for scalar optionals\n                  writer += field.IsScalarOptional()\n                                ? \"{{field_name}}?.run { \\\\\"\n                                : \"\\\\\";\n\n                  writer += namer_.LegacyKotlinMethod(\"add\", field, \"\") +\n                            \"(builder, {{field_name}}\\\\\";\n                  if (!IsScalar(field.value.type.base_type)) {\n                    writer += \"Offset\\\\\";\n                  }\n                  // we wrap on null check for scalar optionals\n                  writer += field.IsScalarOptional() ? \") }\" : \")\";\n                }\n              }\n            }\n            writer += \"return end{{struct_name}}(builder)\";\n          },\n          options.gen_jvmstatic);\n    }\n  }\n  void GenerateBufferHasIdentifier(StructDef& struct_def, CodeWriter& writer,\n                                   IDLOptions options) const {\n    auto file_identifier = parser_.file_identifier_;\n    // Check if a buffer has the identifier.\n    if (parser_.root_struct_def_ != &struct_def || !file_identifier.length())\n      return;\n    auto name = namer_.Function(struct_def);\n    GenerateFunOneLine(\n        writer, name + \"BufferHasIdentifier\", \"_bb: ByteBuffer\", \"Boolean\",\n        [&]() {\n          writer += \"__has_identifier(_bb, \\\"\" + file_identifier + \"\\\")\";\n        },\n        options.gen_jvmstatic);\n  }\n\n  void GenerateStructGetters(StructDef& struct_def, CodeWriter& writer) const {\n    auto fields_vec = struct_def.fields.vec;\n    FieldDef* key_field = nullptr;\n    for (auto it = fields_vec.begin(); it != fields_vec.end(); ++it) {\n      auto& field = **it;\n      if (field.deprecated) continue;\n      if (field.key) key_field = &field;\n\n      GenerateComment(field.doc_comment, writer, &comment_config);\n\n      auto field_name = namer_.Field(field);\n      auto field_type = GenTypeGet(field.value.type);\n      auto field_default_value = GenDefaultValue(field);\n      auto return_type = GetterReturnType(field);\n      auto bbgetter = ByteBufferGetter(field.value.type, \"bb\");\n      auto ucast = CastToUsigned(field);\n      auto offset_val = NumToString(field.value.offset);\n      auto offset_prefix =\n          \"val o = __offset(\" + offset_val + \"); return o != 0 ? \";\n      auto value_base_type = field.value.type.base_type;\n      // Most field accessors need to retrieve and test the field offset\n      // first, this is the offset value for that:\n      writer.SetValue(\"offset\", NumToString(field.value.offset));\n      writer.SetValue(\"return_type\", return_type);\n      writer.SetValue(\"field_type\", field_type);\n      writer.SetValue(\"field_name\", field_name);\n      writer.SetValue(\"field_default\", field_default_value);\n      writer.SetValue(\"bbgetter\", bbgetter);\n      writer.SetValue(\"ucast\", ucast);\n\n      // Generate the accessors that don't do object reuse.\n      if (value_base_type == BASE_TYPE_STRUCT) {\n        // Calls the accessor that takes an accessor object with a\n        // new object.\n        // val pos\n        //     get() = pos(Vec3())\n        GenerateGetterOneLine(writer, field_name, return_type, [&]() {\n          writer += \"{{field_name}}({{field_type}}())\";\n        });\n      } else if (value_base_type == BASE_TYPE_VECTOR &&\n                 field.value.type.element == BASE_TYPE_STRUCT) {\n        // Accessors for vectors of structs also take accessor objects,\n        // this generates a variant without that argument.\n        // ex: fun weapons(j: Int) = weapons(Weapon(), j)\n        GenerateFunOneLine(writer, field_name, \"j: Int\", return_type, [&]() {\n          writer += \"{{field_name}}({{field_type}}(), j)\";\n        });\n      }\n\n      if (IsScalar(value_base_type)) {\n        if (struct_def.fixed) {\n          GenerateGetterOneLine(writer, field_name, return_type, [&]() {\n            writer += \"{{bbgetter}}(bb_pos + {{offset}}){{ucast}}\";\n          });\n        } else {\n          GenerateGetter(writer, field_name, return_type, [&]() {\n            writer += \"val o = __offset({{offset}})\";\n            writer +=\n                \"return if(o != 0) {{bbgetter}}\"\n                \"(o + bb_pos){{ucast}} else \"\n                \"{{field_default}}\";\n          });\n        }\n      } else {\n        switch (value_base_type) {\n          case BASE_TYPE_STRUCT:\n            if (struct_def.fixed) {\n              // create getter with object reuse\n              // ex:\n              // fun pos(obj: Vec3) : Vec3? = obj.__assign(bb_pos + 4, bb)\n              // ? adds nullability annotation\n              GenerateFunOneLine(\n                  writer, field_name, \"obj: \" + field_type, return_type,\n                  [&]() { writer += \"obj.__assign(bb_pos + {{offset}}, bb)\"; });\n            } else {\n              // create getter with object reuse\n              // ex:\n              //  fun pos(obj: Vec3) : Vec3? {\n              //      val o = __offset(4)\n              //      return if(o != 0) {\n              //          obj.__assign(o + bb_pos, bb)\n              //      else {\n              //          null\n              //      }\n              //  }\n              // ? adds nullability annotation\n              GenerateFun(\n                  writer, field_name, \"obj: \" + field_type, return_type, [&]() {\n                    auto fixed = field.value.type.struct_def->fixed;\n\n                    writer.SetValue(\"seek\", Indirect(\"o + bb_pos\", fixed));\n                    OffsetWrapper(\n                        writer, offset_val,\n                        [&]() { writer += \"obj.__assign({{seek}}, bb)\"; },\n                        [&]() {\n                          if (field.IsRequired()) {\n                            writer +=\n                                \"throw AssertionError(\\\"No value for \"\n                                \"(required) field {{field_name}}\\\")\";\n                          } else {\n                            writer += \"null\";\n                          }\n                        });\n                  });\n            }\n            break;\n          case BASE_TYPE_STRING:\n            // create string getter\n            // e.g.\n            // val Name : String?\n            //     get() = {\n            //         val o = __offset(10)\n            //          return if (o != 0) {\n            //              __string(o + bb_pos)\n            //          } else {\n            //              null\n            //          }\n            //     }\n            // ? adds nullability annotation\n            GenerateGetter(writer, field_name, return_type, [&]() {\n              writer += \"val o = __offset({{offset}})\";\n              writer += \"return if (o != 0) {\";\n              writer.IncrementIdentLevel();\n              writer += \"__string(o + bb_pos)\";\n              writer.DecrementIdentLevel();\n              writer += \"} else {\";\n              writer.IncrementIdentLevel();\n              if (field.IsRequired()) {\n                writer +=\n                    \"throw AssertionError(\\\"No value for (required) field \"\n                    \"{{field_name}}\\\")\";\n              } else {\n                writer += \"null\";\n              }\n              writer.DecrementIdentLevel();\n              writer += \"}\";\n            });\n            break;\n          case BASE_TYPE_VECTOR: {\n            // e.g.\n            // fun inventory(j: Int) : UByte {\n            //     val o = __offset(14)\n            //     return if (o != 0) {\n            //         bb.get(__vector(o) + j * 1).toUByte()\n            //     } else {\n            //        0\n            //     }\n            // }\n\n            auto vectortype = field.value.type.VectorType();\n            std::string params = \"j: Int\";\n\n            if (vectortype.base_type == BASE_TYPE_STRUCT ||\n                vectortype.base_type == BASE_TYPE_UNION) {\n              params = \"obj: \" + field_type + \", j: Int\";\n            }\n\n            GenerateFun(writer, field_name, params, return_type, [&]() {\n              auto inline_size = NumToString(InlineSize(vectortype));\n              auto index = \"__vector(o) + j * \" + inline_size;\n              auto not_found =\n                  field.IsRequired()\n                      ? \"throw IndexOutOfBoundsException(\\\"Index out of range: \"\n                        \"$j, vector {{field_name}} is empty\\\")\"\n                      : NotFoundReturn(field.value.type.element);\n              auto found = \"\";\n              writer.SetValue(\"index\", index);\n              switch (vectortype.base_type) {\n                case BASE_TYPE_STRUCT: {\n                  bool fixed = vectortype.struct_def->fixed;\n                  writer.SetValue(\"index\", Indirect(index, fixed));\n                  found = \"obj.__assign({{index}}, bb)\";\n                  break;\n                }\n                case BASE_TYPE_UNION:\n                  found = \"{{bbgetter}}(obj, {{index}}){{ucast}}\";\n                  break;\n                default:\n                  found = \"{{bbgetter}}({{index}}){{ucast}}\";\n              }\n              OffsetWrapper(\n                  writer, offset_val, [&]() { writer += found; },\n                  [&]() { writer += not_found; });\n            });\n            break;\n          }\n          case BASE_TYPE_UNION:\n            GenerateFun(\n                writer, field_name, \"obj: \" + field_type, return_type, [&]() {\n                  writer += OffsetWrapperOneLine(\n                      offset_val, bbgetter + \"(obj, o + bb_pos)\", \"null\");\n                });\n            break;\n          default:\n            FLATBUFFERS_ASSERT(0);\n        }\n      }\n\n      if (value_base_type == BASE_TYPE_VECTOR) {\n        // Generate Lenght functions for vectors\n        GenerateGetter(writer, field_name + \"Length\", \"Int\", [&]() {\n          writer += OffsetWrapperOneLine(offset_val, \"__vector_len(o)\", \"0\");\n        });\n\n        // See if we should generate a by-key accessor.\n        if (field.value.type.element == BASE_TYPE_STRUCT &&\n            !field.value.type.struct_def->fixed) {\n          auto& sd = *field.value.type.struct_def;\n          auto& fields = sd.fields.vec;\n          for (auto kit = fields.begin(); kit != fields.end(); ++kit) {\n            auto& kfield = **kit;\n            if (kfield.key) {\n              auto qualified_name = WrapInNameSpace(sd);\n              auto name = namer_.Method(field, \"ByKey\");\n              auto params = \"key: \" + GenTypeGet(kfield.value.type);\n              auto rtype = qualified_name + \"?\";\n              GenerateFun(writer, name, params, rtype, [&]() {\n                OffsetWrapper(\n                    writer, offset_val,\n                    [&]() {\n                      writer += qualified_name +\n                                \".__lookup_by_key(null, __vector(o), key, bb)\";\n                    },\n                    [&]() { writer += \"null\"; });\n              });\n\n              auto param2 = \"obj: \" + qualified_name +\n                            \", key: \" + GenTypeGet(kfield.value.type);\n              GenerateFun(writer, name, param2, rtype, [&]() {\n                OffsetWrapper(\n                    writer, offset_val,\n                    [&]() {\n                      writer += qualified_name +\n                                \".__lookup_by_key(obj, __vector(o), key, bb)\";\n                    },\n                    [&]() { writer += \"null\"; });\n              });\n\n              break;\n            }\n          }\n        }\n      }\n\n      if ((value_base_type == BASE_TYPE_VECTOR &&\n           IsScalar(field.value.type.VectorType().base_type)) ||\n          value_base_type == BASE_TYPE_STRING) {\n        auto end_idx =\n            NumToString(value_base_type == BASE_TYPE_STRING\n                            ? 1\n                            : InlineSize(field.value.type.VectorType()));\n        // Generate a ByteBuffer accessor for strings & vectors of scalars.\n        // e.g.\n        // val inventoryByteBuffer: ByteBuffer?\n        //     get =  __vector_as_bytebuffer(14, 1)\n\n        auto buffer_type = field.IsRequired() ? \"ByteBuffer\" : \"ByteBuffer?\";\n        GenerateGetterOneLine(\n            writer, field_name + \"AsByteBuffer\", buffer_type, [&]() {\n              writer.SetValue(\"end\", end_idx);\n              writer += \"__vector_as_bytebuffer({{offset}}, {{end}})\";\n            });\n\n        // Generate a ByteBuffer accessor for strings & vectors of scalars.\n        // e.g.\n        // fun inventoryInByteBuffer(_bb: Bytebuffer):\n        //     ByteBuffer? = __vector_as_bytebuffer(_bb, 14, 1)\n        GenerateFunOneLine(\n            writer, field_name + \"InByteBuffer\", \"_bb: ByteBuffer\", buffer_type,\n            [&]() {\n              writer.SetValue(\"end\", end_idx);\n              writer += \"__vector_in_bytebuffer(_bb, {{offset}}, {{end}})\";\n            });\n      }\n\n      // generate object accessors if is nested_flatbuffer\n      // fun testnestedflatbufferAsMonster() : Monster?\n      //{ return testnestedflatbufferAsMonster(new Monster()); }\n\n      if (field.nested_flatbuffer) {\n        auto nested_type_name = WrapInNameSpace(*field.nested_flatbuffer);\n        auto nested_method_name =\n            field_name + \"As\" + field.nested_flatbuffer->name;\n\n        GenerateGetterOneLine(\n            writer, nested_method_name, nested_type_name + \"?\", [&]() {\n              writer += nested_method_name + \"(\" + nested_type_name + \"())\";\n            });\n\n        GenerateFun(writer, nested_method_name, \"obj: \" + nested_type_name,\n                    nested_type_name + \"?\", [&]() {\n                      OffsetWrapper(\n                          writer, offset_val,\n                          [&]() {\n                            writer +=\n                                \"obj.__assign(__indirect(__vector(o)), bb)\";\n                          },\n                          [&]() { writer += \"null\"; });\n                    });\n      }\n\n      // Generate mutators for scalar fields or vectors of scalars.\n      if (parser_.opts.mutable_buffer) {\n        auto value_type = field.value.type;\n        auto underlying_type = value_base_type == BASE_TYPE_VECTOR\n                                   ? value_type.VectorType()\n                                   : value_type;\n        auto name = namer_.LegacyKotlinMethod(\"mutate\", field, \"\");\n        auto size = NumToString(InlineSize(underlying_type));\n        auto params = namer_.Field(field) + \": \" + GenTypeGet(underlying_type);\n        // A vector mutator also needs the index of the vector element it should\n        // mutate.\n        if (value_base_type == BASE_TYPE_VECTOR) params.insert(0, \"j: Int, \");\n\n        // Boolean parameters have to be explicitly converted to byte\n        // representation.\n        auto setter_parameter =\n            underlying_type.base_type == BASE_TYPE_BOOL\n                ? \"(if(\" + namer_.Field(field) + \") 1 else 0).toByte()\"\n                : namer_.Field(field);\n\n        auto setter_index =\n            value_base_type == BASE_TYPE_VECTOR\n                ? \"__vector(o) + j * \" + size\n                : (struct_def.fixed ? \"bb_pos + \" + offset_val : \"o + bb_pos\");\n        if (IsScalar(value_base_type) ||\n            (value_base_type == BASE_TYPE_VECTOR &&\n             IsScalar(value_type.VectorType().base_type))) {\n          auto statements = [&]() {\n            writer.SetValue(\"bbsetter\", ByteBufferSetter(underlying_type));\n            writer.SetValue(\"index\", setter_index);\n            writer.SetValue(\"params\", setter_parameter);\n            writer.SetValue(\"cast\", CastToSigned(field));\n            if (struct_def.fixed) {\n              writer += \"{{bbsetter}}({{index}}, {{params}}{{cast}})\";\n            } else {\n              OffsetWrapper(\n                  writer, offset_val,\n                  [&]() {\n                    writer += \"{{bbsetter}}({{index}}, {{params}}{{cast}})\";\n                    writer += \"true\";\n                  },\n                  [&]() { writer += \"false\"; });\n            }\n          };\n\n          if (struct_def.fixed) {\n            GenerateFunOneLine(writer, name, params, \"ByteBuffer\", statements);\n          } else {\n            GenerateFun(writer, name, params, \"Boolean\", statements);\n          }\n        }\n      }\n    }\n    if (struct_def.has_key && !struct_def.fixed) {\n      // Key Comparison method\n      GenerateOverrideFun(\n          writer, \"keysCompare\", \"o1: Int, o2: Int, _bb: ByteBuffer\", \"Int\",\n          [&]() {\n            if (IsString(key_field->value.type)) {\n              writer.SetValue(\"offset\", NumToString(key_field->value.offset));\n              writer +=\n                  \" return compareStrings(__offset({{offset}}, o1, \"\n                  \"_bb), __offset({{offset}}, o2, _bb), _bb)\";\n\n            } else {\n              auto getter1 = GenLookupByKey(key_field, \"_bb\", \"o1\");\n              auto getter2 = GenLookupByKey(key_field, \"_bb\", \"o2\");\n              writer += \"val val_1 = \" + getter1;\n              writer += \"val val_2 = \" + getter2;\n              writer += \"return (val_1 - val_2).sign\";\n            }\n          });\n    }\n  }\n\n  static std::string CastToUsigned(const FieldDef& field) {\n    return CastToUsigned(field.value.type);\n  }\n\n  static std::string CastToUsigned(const Type type) {\n    switch (type.base_type) {\n      case BASE_TYPE_UINT:\n        return \".toUInt()\";\n      case BASE_TYPE_UCHAR:\n      case BASE_TYPE_UTYPE:\n        return \".toUByte()\";\n      case BASE_TYPE_USHORT:\n        return \".toUShort()\";\n      case BASE_TYPE_ULONG:\n        return \".toULong()\";\n      case BASE_TYPE_VECTOR:\n        return CastToUsigned(type.VectorType());\n      default:\n        return \"\";\n    }\n  }\n\n  static std::string CastToSigned(const FieldDef& field) {\n    return CastToSigned(field.value.type);\n  }\n\n  static std::string CastToSigned(const Type type) {\n    switch (type.base_type) {\n      case BASE_TYPE_UINT:\n        return \".toInt()\";\n      case BASE_TYPE_UCHAR:\n      case BASE_TYPE_UTYPE:\n        return \".toByte()\";\n      case BASE_TYPE_USHORT:\n        return \".toShort()\";\n      case BASE_TYPE_ULONG:\n        return \".toLong()\";\n      case BASE_TYPE_VECTOR:\n        return CastToSigned(type.VectorType());\n      default:\n        return \"\";\n    }\n  }\n\n  static std::string LiteralSuffix(const BaseType type) {\n    switch (type) {\n      case BASE_TYPE_UINT:\n      case BASE_TYPE_UCHAR:\n      case BASE_TYPE_UTYPE:\n      case BASE_TYPE_USHORT:\n        return \"u\";\n      case BASE_TYPE_ULONG:\n        return \"UL\";\n      case BASE_TYPE_LONG:\n        return \"L\";\n      default:\n        return \"\";\n    }\n  }\n\n  void GenerateCompanionObject(CodeWriter& code,\n                               const std::function<void()>& callback) const {\n    code += \"companion object {\";\n    code.IncrementIdentLevel();\n    callback();\n    code.DecrementIdentLevel();\n    code += \"}\";\n  }\n\n  // Generate a documentation comment, if available.\n  void GenerateComment(const std::vector<std::string>& dc, CodeWriter& writer,\n                       const CommentConfig* config) const {\n    if (dc.begin() == dc.end()) {\n      // Don't output empty comment blocks with 0 lines of comment content.\n      return;\n    }\n\n    if (config != nullptr && config->first_line != nullptr) {\n      writer += std::string(config->first_line);\n    }\n    std::string line_prefix =\n        ((config != nullptr && config->content_line_prefix != nullptr)\n             ? config->content_line_prefix\n             : \"///\");\n    for (auto it = dc.begin(); it != dc.end(); ++it) {\n      writer += line_prefix + *it;\n    }\n    if (config != nullptr && config->last_line != nullptr) {\n      writer += std::string(config->last_line);\n    }\n  }\n\n  void GenerateGetRootAsAccessors(const std::string& struct_name,\n                                  CodeWriter& writer,\n                                  IDLOptions options) const {\n    // Generate a special accessor for the table that when used as the root\n    // ex: fun getRootAsMonster(_bb: ByteBuffer): Monster {...}\n    writer.SetValue(\"gr_name\", struct_name);\n    writer.SetValue(\"gr_method\", \"getRootAs\" + struct_name);\n\n    // create convenience method that doesn't require an existing object\n    GenerateJvmStaticAnnotation(writer, options.gen_jvmstatic);\n    writer += \"fun {{gr_method}}(_bb: ByteBuffer): {{gr_name}} = \\\\\";\n    writer += \"{{gr_method}}(_bb, {{gr_name}}())\";\n\n    // create method that allows object reuse\n    // ex: fun Monster getRootAsMonster(_bb: ByteBuffer, obj: Monster) {...}\n    GenerateJvmStaticAnnotation(writer, options.gen_jvmstatic);\n    writer +=\n        \"fun {{gr_method}}\"\n        \"(_bb: ByteBuffer, obj: {{gr_name}}): {{gr_name}} {\";\n    writer.IncrementIdentLevel();\n    writer += \"_bb.order(ByteOrder.LITTLE_ENDIAN)\";\n    writer +=\n        \"return (obj.__assign(_bb.getInt(_bb.position())\"\n        \" + _bb.position(), _bb))\";\n    writer.DecrementIdentLevel();\n    writer += \"}\";\n  }\n\n  void GenerateStaticConstructor(const StructDef& struct_def, CodeWriter& code,\n                                 const IDLOptions options) const {\n    // create a struct constructor function\n    auto params = StructConstructorParams(struct_def);\n    GenerateFun(\n        code, namer_.LegacyJavaMethod2(\"create\", struct_def, \"\"), params, \"Int\",\n        [&]() {\n          GenStructBody(struct_def, code, \"\");\n          code += \"return builder.offset()\";\n        },\n        options.gen_jvmstatic);\n  }\n\n  std::string StructConstructorParams(const StructDef& struct_def,\n                                      const std::string& prefix = \"\") const {\n    // builder: FlatBufferBuilder\n    std::stringstream out;\n    auto field_vec = struct_def.fields.vec;\n    if (prefix.empty()) {\n      out << \"builder: FlatBufferBuilder\";\n    }\n    for (auto it = field_vec.begin(); it != field_vec.end(); ++it) {\n      auto& field = **it;\n      if (IsStruct(field.value.type)) {\n        // Generate arguments for a struct inside a struct. To ensure\n        // names don't clash, and to make it obvious these arguments are\n        // constructing a nested struct, prefix the name with the field\n        // name.\n        out << StructConstructorParams(*field.value.type.struct_def,\n                                       prefix + (namer_.Variable(field) + \"_\"));\n      } else {\n        out << \", \" << prefix << namer_.Variable(field) << \": \"\n            << GenTypeBasic(field.value.type.base_type);\n      }\n    }\n    return out.str();\n  }\n\n  static void GeneratePropertyOneLine(CodeWriter& writer,\n                                      const std::string& name,\n                                      const std::string& type,\n                                      const std::function<void()>& body) {\n    // Generates Kotlin getter for properties\n    // e.g.:\n    // val prop: Mytype = x\n    writer.SetValue(\"_name\", name);\n    writer.SetValue(\"_type\", type);\n    writer += \"val {{_name}} : {{_type}} = \\\\\";\n    body();\n  }\n  static void GenerateGetterOneLine(CodeWriter& writer, const std::string& name,\n                                    const std::string& type,\n                                    const std::function<void()>& body) {\n    // Generates Kotlin getter for properties\n    // e.g.:\n    // val prop: Mytype get() = x\n    writer.SetValue(\"_name\", name);\n    writer.SetValue(\"_type\", type);\n    writer += \"val {{_name}} : {{_type}} get() = \\\\\";\n    body();\n  }\n\n  static void GenerateGetter(CodeWriter& writer, const std::string& name,\n                             const std::string& type,\n                             const std::function<void()>& body) {\n    // Generates Kotlin getter for properties\n    // e.g.:\n    // val prop: Mytype\n    //     get() = {\n    //       return x\n    //     }\n    writer.SetValue(\"name\", name);\n    writer.SetValue(\"type\", type);\n    writer += \"val {{name}} : {{type}}\";\n    writer.IncrementIdentLevel();\n    writer += \"get() {\";\n    writer.IncrementIdentLevel();\n    body();\n    writer.DecrementIdentLevel();\n    writer += \"}\";\n    writer.DecrementIdentLevel();\n  }\n\n  static void GenerateFun(CodeWriter& writer, const std::string& name,\n                          const std::string& params,\n                          const std::string& returnType,\n                          const std::function<void()>& body,\n                          bool gen_jvmstatic = false) {\n    // Generates Kotlin function\n    // e.g.:\n    // fun path(j: Int): Vec3 {\n    //     return path(Vec3(), j)\n    // }\n    auto noreturn = returnType.empty();\n    writer.SetValue(\"name\", name);\n    writer.SetValue(\"params\", params);\n    writer.SetValue(\"return_type\", noreturn ? \"\" : \": \" + returnType);\n    GenerateJvmStaticAnnotation(writer, gen_jvmstatic);\n    writer += \"fun {{name}}({{params}}) {{return_type}} {\";\n    writer.IncrementIdentLevel();\n    body();\n    writer.DecrementIdentLevel();\n    writer += \"}\";\n  }\n\n  static void GenerateFunOneLine(CodeWriter& writer, const std::string& name,\n                                 const std::string& params,\n                                 const std::string& returnType,\n                                 const std::function<void()>& body,\n                                 bool gen_jvmstatic = false) {\n    // Generates Kotlin function\n    // e.g.:\n    // fun path(j: Int): Vec3 = return path(Vec3(), j)\n    writer.SetValue(\"name\", name);\n    writer.SetValue(\"params\", params);\n    writer.SetValue(\"return_type_p\",\n                    returnType.empty() ? \"\" : \" : \" + returnType);\n    GenerateJvmStaticAnnotation(writer, gen_jvmstatic);\n    writer += \"fun {{name}}({{params}}){{return_type_p}} = \\\\\";\n    body();\n  }\n\n  static void GenerateOverrideFun(CodeWriter& writer, const std::string& name,\n                                  const std::string& params,\n                                  const std::string& returnType,\n                                  const std::function<void()>& body) {\n    // Generates Kotlin function\n    // e.g.:\n    // override fun path(j: Int): Vec3 = return path(Vec3(), j)\n    writer += \"override \\\\\";\n    GenerateFun(writer, name, params, returnType, body);\n  }\n\n  static void GenerateOverrideFunOneLine(CodeWriter& writer,\n                                         const std::string& name,\n                                         const std::string& params,\n                                         const std::string& returnType,\n                                         const std::string& statement) {\n    // Generates Kotlin function\n    // e.g.:\n    // override fun path(j: Int): Vec3 = return path(Vec3(), j)\n    writer.SetValue(\"name\", name);\n    writer.SetValue(\"params\", params);\n    writer.SetValue(\"return_type\",\n                    returnType.empty() ? \"\" : \" : \" + returnType);\n    writer += \"override fun {{name}}({{params}}){{return_type}} = \\\\\";\n    writer += statement;\n  }\n\n  static std::string OffsetWrapperOneLine(const std::string& offset,\n                                          const std::string& found,\n                                          const std::string& not_found) {\n    return \"val o = __offset(\" + offset + \"); return if (o != 0) \" + found +\n           \" else \" + not_found;\n  }\n\n  static void OffsetWrapper(CodeWriter& code, const std::string& offset,\n                            const std::function<void()>& found,\n                            const std::function<void()>& not_found) {\n    code += \"val o = __offset(\" + offset + \")\";\n    code += \"return if (o != 0) {\";\n    code.IncrementIdentLevel();\n    found();\n    code.DecrementIdentLevel();\n    code += \"} else {\";\n    code.IncrementIdentLevel();\n    not_found();\n    code.DecrementIdentLevel();\n    code += \"}\";\n  }\n\n  static std::string Indirect(const std::string& index, bool fixed) {\n    // We apply __indirect() and struct is not fixed.\n    if (!fixed) return \"__indirect(\" + index + \")\";\n    return index;\n  }\n\n  static std::string NotFoundReturn(BaseType el) {\n    switch (el) {\n      case BASE_TYPE_FLOAT:\n        return \"0.0f\";\n      case BASE_TYPE_DOUBLE:\n        return \"0.0\";\n      case BASE_TYPE_BOOL:\n        return \"false\";\n      case BASE_TYPE_LONG:\n      case BASE_TYPE_INT:\n      case BASE_TYPE_CHAR:\n      case BASE_TYPE_SHORT:\n        return \"0\";\n      case BASE_TYPE_UINT:\n      case BASE_TYPE_UCHAR:\n      case BASE_TYPE_USHORT:\n      case BASE_TYPE_UTYPE:\n        return \"0u\";\n      case BASE_TYPE_ULONG:\n        return \"0uL\";\n      default:\n        return \"null\";\n    }\n  }\n\n  // Prepend @JvmStatic to methods in companion object.\n  static void GenerateJvmStaticAnnotation(CodeWriter& code,\n                                          bool gen_jvmstatic) {\n    if (gen_jvmstatic) {\n      code += \"@JvmStatic\";\n    }\n  }\n\n  const IdlNamer namer_;\n};\n}  // namespace kotlin\n\nstatic bool GenerateKotlin(const Parser& parser, const std::string& path,\n                           const std::string& file_name) {\n  kotlin::KotlinGenerator generator(parser, path, file_name);\n  return generator.generate();\n}\n\nnamespace {\n\nclass KotlinCodeGenerator : public CodeGenerator {\n public:\n  Status GenerateCode(const Parser& parser, const std::string& path,\n                      const std::string& filename) override {\n    if (!GenerateKotlin(parser, path, filename)) {\n      return Status::ERROR;\n    }\n    return Status::OK;\n  }\n\n  Status GenerateCode(const uint8_t*, int64_t, const CodeGenOptions&) override {\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateMakeRule(const Parser& parser, const std::string& path,\n                          const std::string& filename,\n                          std::string& output) override {\n    (void)parser;\n    (void)path;\n    (void)filename;\n    (void)output;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateGrpcCode(const Parser& parser, const std::string& path,\n                          const std::string& filename) override {\n    (void)parser;\n    (void)path;\n    (void)filename;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateRootFile(const Parser& parser,\n                          const std::string& path) override {\n    (void)parser;\n    (void)path;\n    return Status::NOT_IMPLEMENTED;\n  }\n  bool IsSchemaOnly() const override { return true; }\n\n  bool SupportsBfbsGeneration() const override { return false; }\n\n  bool SupportsRootFileGeneration() const override { return false; }\n\n  IDLOptions::Language Language() const override { return IDLOptions::kKotlin; }\n\n  std::string LanguageName() const override { return \"Kotlin\"; }\n};\n}  // namespace\n\nstd::unique_ptr<CodeGenerator> NewKotlinCodeGenerator() {\n  return std::unique_ptr<KotlinCodeGenerator>(new KotlinCodeGenerator());\n}\n\n}  // namespace flatbuffers\n"
  },
  {
    "path": "src/idl_gen_kotlin.h",
    "content": "/*\n * Copyright 2023 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_IDL_GEN_KOTLIN_H_\n#define FLATBUFFERS_IDL_GEN_KOTLIN_H_\n\n#include \"flatbuffers/code_generator.h\"\n\nnamespace flatbuffers {\n\n// Constructs a new Kotlin code generator.\nstd::unique_ptr<CodeGenerator> NewKotlinCodeGenerator();\n\n// Constructs a new Kotlin code generator.\nstd::unique_ptr<CodeGenerator> NewKotlinKMPCodeGenerator();\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_IDL_GEN_KOTLIN_H_\n"
  },
  {
    "path": "src/idl_gen_kotlin_kmp.cpp",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// independent from idl_parser, since this code is not needed for most clients\n\n#include <functional>\n#include <unordered_set>\n\n#include \"flatbuffers/code_generators.h\"\n#include \"flatbuffers/idl.h\"\n#include \"flatbuffers/util.h\"\n#include \"idl_gen_kotlin.h\"\n#include \"idl_namer.h\"\n\nnamespace flatbuffers {\n\nnamespace kotlin {\n\nnamespace {\n\ntypedef std::map<std::string, std::pair<std::string, std::string> > FbbParamMap;\nstatic TypedFloatConstantGenerator KotlinFloatGen(\"Double.\", \"Float.\", \"NaN\",\n                                                  \"POSITIVE_INFINITY\",\n                                                  \"NEGATIVE_INFINITY\");\n\nstatic const CommentConfig comment_config = {\"/**\", \" *\", \" */\"};\nstatic const std::string ident_pad = \"    \";\nstatic std::set<std::string> KotlinKeywords() {\n  return {\"package\",  \"as\",     \"typealias\", \"class\",  \"this\",   \"super\",\n          \"val\",      \"var\",    \"fun\",       \"for\",    \"null\",   \"true\",\n          \"false\",    \"is\",     \"in\",        \"throw\",  \"return\", \"break\",\n          \"continue\", \"object\", \"if\",        \"try\",    \"else\",   \"while\",\n          \"do\",       \"when\",   \"interface\", \"typeof\", \"Any\",    \"Character\"};\n}\n\nstatic Namer::Config KotlinDefaultConfig() {\n  return {/*types=*/Case::kKeep,\n          /*constants=*/Case::kUpperCamel,\n          /*methods=*/Case::kLowerCamel,\n          /*functions=*/Case::kKeep,\n          /*fields=*/Case::kLowerCamel,\n          /*variables=*/Case::kLowerCamel,\n          /*variants=*/Case::kUpperCamel,\n          /*enum_variant_seperator=*/\"\",  // I.e. Concatenate.\n          /*escape_keywords=*/Namer::Config::Escape::AfterConvertingCase,\n          /*namespaces=*/Case::kLowerCamel,\n          /*namespace_seperator=*/\".\",\n          /*object_prefix=*/\"\",\n          /*object_suffix=*/\"T\",\n          /*keyword_prefix=*/\"\",\n          /*keyword_suffix=*/\"E\",\n          /*keywords_casing=*/Namer::Config::KeywordsCasing::CaseSensitive,\n          /*filenames=*/Case::kUpperCamel,\n          /*directories=*/Case::kLowerCamel,\n          /*output_path=*/\"\",\n          /*filename_suffix=*/\"\",\n          /*filename_extension=*/\".kt\"};\n}\n}  // namespace\n\nclass KotlinKMPGenerator : public BaseGenerator {\n public:\n  KotlinKMPGenerator(const Parser& parser, const std::string& path,\n                     const std::string& file_name)\n      : BaseGenerator(parser, path, file_name, \"\", \".\", \"kt\"),\n        namer_(WithFlagOptions(KotlinDefaultConfig(), parser.opts, path),\n               KotlinKeywords()) {}\n\n  KotlinKMPGenerator& operator=(const KotlinKMPGenerator&);\n  bool generate() FLATBUFFERS_OVERRIDE {\n    std::string one_file_code;\n\n    for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end();\n         ++it) {\n      CodeWriter enumWriter(ident_pad);\n      auto& enum_def = **it;\n\n      GenEnum(enum_def, enumWriter);\n      enumWriter += \"\";\n      GenEnumOffsetAlias(enum_def, enumWriter);\n\n      if (parser_.opts.one_file) {\n        one_file_code += enumWriter.ToString();\n      } else {\n        if (!SaveType(namer_.EscapeKeyword(enum_def.name),\n                      *enum_def.defined_namespace, enumWriter.ToString(), true))\n          return false;\n      }\n    }\n\n    for (auto it = parser_.structs_.vec.begin();\n         it != parser_.structs_.vec.end(); ++it) {\n      CodeWriter structWriter(ident_pad);\n      auto& struct_def = **it;\n\n      GenStruct(struct_def, structWriter, parser_.opts);\n      structWriter += \"\";\n      GenStructOffsetAlias(struct_def, structWriter);\n\n      if (parser_.opts.one_file) {\n        one_file_code += structWriter.ToString();\n      } else {\n        if (!SaveType(namer_.EscapeKeyword(struct_def.name),\n                      *struct_def.defined_namespace, structWriter.ToString(),\n                      true))\n          return false;\n      }\n    }\n\n    if (parser_.opts.one_file) {\n      return SaveType(file_name_, *parser_.current_namespace_, one_file_code,\n                      true);\n    }\n    return true;\n  }\n\n  std::string TypeInNameSpace(const Namespace* ns,\n                              const std::string& name = \"\") const {\n    auto qualified = namer_.Namespace(*ns);\n    return qualified.empty() ? name : qualified + qualifying_separator_ + name;\n  }\n\n  std::string TypeInNameSpace(const Definition& def,\n                              const std::string& suffix = \"\") const {\n    return TypeInNameSpace(def.defined_namespace, def.name + suffix);\n  }\n\n  // Save out the generated code for a single class while adding\n  // declaration boilerplate.\n  bool SaveType(const std::string& defname, const Namespace& ns,\n                const std::string& classcode, bool needs_includes) const {\n    if (!classcode.length()) return true;\n\n    std::string code =\n        \"// \" + std::string(FlatBuffersGeneratedWarning()) + \"\\n\\n\";\n    auto qualified = ns.GetFullyQualifiedName(\"\");\n    std::string namespace_name = namer_.Namespace(ns);\n    if (!namespace_name.empty()) {\n      code += \"package \" + namespace_name;\n      code += \"\\n\\n\";\n    }\n    if (needs_includes) {\n      code += \"import com.google.flatbuffers.kotlin.*\\n\";\n    }\n    code += \"import kotlin.jvm.JvmInline\\n\";\n    code += classcode;\n    const std::string dirs =\n        namer_.Directories(ns, SkipDir::None, Case::kUnknown);\n    EnsureDirExists(dirs);\n    const std::string filename =\n        dirs + namer_.File(defname, /*skips=*/SkipFile::Suffix);\n    return parser_.opts.file_saver->SaveFile(filename.c_str(), code, false);\n  }\n\n  static bool IsEnum(const Type& type) {\n    return type.enum_def != nullptr && IsInteger(type.base_type);\n  }\n\n  std::string GenerateKotlinPrimiteArray(const Type& type) const {\n    if (IsScalar(type.base_type) && !IsEnum(type)) {\n      return GenType(type);\n    }\n\n    if (IsEnum(type) || type.base_type == BASE_TYPE_UTYPE) {\n      return TypeInNameSpace(type.enum_def->defined_namespace,\n                             namer_.Type(*type.enum_def));\n    }\n    switch (type.base_type) {\n      case BASE_TYPE_STRUCT:\n        return \"Offset<\" + TypeInNameSpace(*type.struct_def) + \">\";\n      case BASE_TYPE_UNION:\n        return \"UnionOffset\";\n      case BASE_TYPE_STRING:\n        return \"Offset<String>\";\n      case BASE_TYPE_UTYPE:\n        return \"Offset<UByte>\";\n      default:\n        return \"Offset<\" + GenTypeBasic(type.element) + \">\";\n    }\n  }\n\n  std::string GenerateKotlinOffsetArray(const Type& type) const {\n    if (IsScalar(type.base_type) && !IsEnum(type)) {\n      return GenType(type) + \"Array\";\n    }\n\n    if (IsEnum(type) || type.base_type == BASE_TYPE_UTYPE) {\n      return TypeInNameSpace(type.enum_def->defined_namespace,\n                             namer_.Type(*type.enum_def) + \"Array\");\n    }\n    switch (type.base_type) {\n      case BASE_TYPE_STRUCT:\n        return TypeInNameSpace(*type.struct_def) + \"OffsetArray\";\n      case BASE_TYPE_UNION:\n        return \"UnionOffsetArray\";\n      case BASE_TYPE_STRING:\n        return \"StringOffsetArray\";\n      case BASE_TYPE_UTYPE:\n        return \"UByteArray\";\n      default:\n        return GenTypeBasic(type.element) + \"OffsetArray\";\n    }\n  }\n\n  std::string GenTypeBasic(const BaseType& type) const {\n    switch (type) {\n      case BASE_TYPE_NONE:\n      case BASE_TYPE_UTYPE:\n        return \"UByte\";\n      case BASE_TYPE_BOOL:\n        return \"Boolean\";\n      case BASE_TYPE_CHAR:\n        return \"Byte\";\n      case BASE_TYPE_UCHAR:\n        return \"UByte\";\n      case BASE_TYPE_SHORT:\n        return \"Short\";\n      case BASE_TYPE_USHORT:\n        return \"UShort\";\n      case BASE_TYPE_INT:\n        return \"Int\";\n      case BASE_TYPE_UINT:\n        return \"UInt\";\n      case BASE_TYPE_LONG:\n        return \"Long\";\n      case BASE_TYPE_ULONG:\n        return \"ULong\";\n      case BASE_TYPE_FLOAT:\n        return \"Float\";\n      case BASE_TYPE_DOUBLE:\n        return \"Double\";\n      case BASE_TYPE_STRING:\n      case BASE_TYPE_STRUCT:\n        return \"Offset\";\n      case BASE_TYPE_UNION:\n        return \"UnionOffset\";\n      case BASE_TYPE_VECTOR:\n      case BASE_TYPE_ARRAY:\n        return \"VectorOffset\";\n      // VECTOR64 not supported\n      case BASE_TYPE_VECTOR64:\n        FLATBUFFERS_ASSERT(0);\n    }\n    return \"Int\";\n  }\n\n  std::string GenType(const Type& type) const {\n    auto base_type = GenTypeBasic(type.base_type);\n\n    if (IsEnum(type) || type.base_type == BASE_TYPE_UTYPE) {\n      return TypeInNameSpace(type.enum_def->defined_namespace,\n                             namer_.Type(*type.enum_def));\n    }\n    switch (type.base_type) {\n      case BASE_TYPE_ARRAY:\n      case BASE_TYPE_VECTOR: {\n        switch (type.element) {\n          case BASE_TYPE_STRUCT:\n            return base_type + \"<\" + TypeInNameSpace(*type.struct_def) + \">\";\n          case BASE_TYPE_UNION:\n            return base_type + \"<\" + GenTypeBasic(type.element) + \">\";\n          case BASE_TYPE_STRING:\n            return base_type + \"<String>\";\n          case BASE_TYPE_UTYPE:\n            return base_type + \"<UByte>\";\n          default:\n            return base_type + \"<\" + GenTypeBasic(type.element) + \">\";\n        }\n      }\n      case BASE_TYPE_STRUCT:\n        return base_type + \"<\" + TypeInNameSpace(*type.struct_def) + \">\";\n      case BASE_TYPE_STRING:\n        return base_type + \"<String>\";\n      case BASE_TYPE_UNION:\n        return base_type;\n      default:\n        return base_type;\n    }\n    // clang-format on\n  }\n\n  std::string GenTypePointer(const Type& type) const {\n    switch (type.base_type) {\n      case BASE_TYPE_STRING:\n        return \"String\";\n      case BASE_TYPE_VECTOR:\n        return GenTypeGet(type.VectorType());\n      case BASE_TYPE_STRUCT:\n        return TypeInNameSpace(*type.struct_def);\n      default:\n        return \"Table\";\n    }\n  }\n\n  // with the addition of optional scalar types,\n  // we are adding the nullable '?' operator to return type of a field.\n  std::string GetterReturnType(const FieldDef& field) const {\n    auto base_type = field.value.type.base_type;\n\n    auto r_type = GenTypeGet(field.value.type);\n    if (field.IsScalarOptional() ||\n        // string, structs and unions\n        (base_type == BASE_TYPE_STRING || base_type == BASE_TYPE_STRUCT ||\n         base_type == BASE_TYPE_UNION) ||\n        // vector of anything not scalar\n        (base_type == BASE_TYPE_VECTOR &&\n         !IsScalar(field.value.type.VectorType().base_type))) {\n      r_type += \"?\";\n    }\n    return r_type;\n  }\n\n  std::string GenTypeGet(const Type& type) const {\n    return IsScalar(type.base_type) ? GenType(type) : GenTypePointer(type);\n  }\n\n  std::string GenEnumDefaultValue(const FieldDef& field) const {\n    auto& value = field.value;\n    FLATBUFFERS_ASSERT(value.type.enum_def);\n    auto& enum_def = *value.type.enum_def;\n    auto enum_val = enum_def.FindByValue(value.constant);\n    return enum_val ? (TypeInNameSpace(enum_def) + \".\" + enum_val->name)\n                    : value.constant;\n  }\n\n  // differently from GenDefaultValue, the default values are meant\n  // to be inserted in the buffer as the object is building.\n  std::string GenDefaultBufferValue(const FieldDef& field) const {\n    auto& value = field.value;\n    auto base_type = value.type.base_type;\n    auto field_name = field.name;\n    std::string suffix = IsScalar(base_type) ? LiteralSuffix(value.type) : \"\";\n    if (field.IsScalarOptional()) {\n      return \"null\";\n    }\n    if (IsFloat(base_type)) {\n      auto val = KotlinFloatGen.GenFloatConstant(field);\n      if (base_type == BASE_TYPE_DOUBLE && val.back() == 'f') {\n        val.pop_back();\n      }\n      return val;\n    }\n\n    if (base_type == BASE_TYPE_BOOL) {\n      return value.constant == \"0\" ? \"false\" : \"true\";\n    }\n\n    if (IsEnum(field.value.type)) {\n      return value.constant + suffix;\n    } else if ((IsVector(field.value.type) &&\n                field.value.type.element == BASE_TYPE_UTYPE) ||\n               (IsVector(field.value.type) &&\n                field.value.type.VectorType().base_type == BASE_TYPE_UNION)) {\n      return value.constant;\n    } else {\n      return value.constant + suffix;\n    }\n  }\n\n  std::string GenDefaultValue(const FieldDef& field) const {\n    auto& value = field.value;\n    auto base_type = value.type.base_type;\n    auto field_name = field.name;\n    std::string suffix = LiteralSuffix(value.type);\n    if (field.IsScalarOptional()) {\n      return \"null\";\n    }\n    if (IsFloat(base_type)) {\n      auto val = KotlinFloatGen.GenFloatConstant(field);\n      if (base_type == BASE_TYPE_DOUBLE && val.back() == 'f') {\n        val.pop_back();\n      }\n      return val;\n    }\n\n    if (base_type == BASE_TYPE_BOOL) {\n      return value.constant == \"0\" ? \"false\" : \"true\";\n    }\n\n    if (IsEnum(field.value.type) ||\n        (IsVector(field.value.type) && IsEnum(field.value.type.VectorType()))) {\n      return WrapEnumValue(field.value.type, value.constant + suffix);\n    }\n\n    if (IsVector(field.value.type) &&\n        (field.value.type.VectorType().base_type == BASE_TYPE_UNION ||\n         field.value.type.VectorType().base_type == BASE_TYPE_STRUCT ||\n         field.value.type.VectorType().base_type == BASE_TYPE_STRING)) {\n      return \"null\";\n    }\n    if (IsVector(field.value.type)) {\n      switch (field.value.type.element) {\n        case BASE_TYPE_UTYPE:\n          return namer_.Type(*field.value.type.enum_def) + \"(\" +\n                 value.constant + suffix + \")\";\n        case BASE_TYPE_UNION:\n        case BASE_TYPE_STRUCT:\n        case BASE_TYPE_STRING:\n          return \"null\";\n        case BASE_TYPE_BOOL:\n          return value.constant == \"0\" ? \"false\" : \"true\";\n        case BASE_TYPE_FLOAT:\n          return value.constant + \"f\";\n        case BASE_TYPE_DOUBLE: {\n          return value.constant + \".toDouble()\";\n        }\n        default:\n          return value.constant + suffix;\n      }\n    }\n    return value.constant + suffix;\n  }\n\n  void GenEnum(EnumDef& enum_def, CodeWriter& writer) const {\n    if (enum_def.generated) return;\n\n    GenerateComment(enum_def.doc_comment, writer, &comment_config);\n    auto enum_type = namer_.Type(enum_def);\n    auto field_type = GenTypeBasic(enum_def.underlying_type.base_type);\n    writer += \"@Suppress(\\\"unused\\\")\";\n    writer += \"@JvmInline\";\n    writer += \"value class \" + enum_type + \" (val value: \" + field_type + \") {\";\n    writer.IncrementIdentLevel();\n\n    GenerateCompanionObject(writer, [&]() {\n      // Write all properties\n      auto vals = enum_def.Vals();\n\n      for (auto it = vals.begin(); it != vals.end(); ++it) {\n        auto& ev = **it;\n        auto val = enum_def.ToString(ev);\n        auto suffix = LiteralSuffix(enum_def.underlying_type);\n        writer.SetValue(\"name\", namer_.Variant(ev));\n        writer.SetValue(\"type\", enum_type);\n        writer.SetValue(\"val\", val + suffix);\n        GenerateComment(ev.doc_comment, writer, &comment_config);\n        writer += \"val {{name}} = {{type}}({{val}})\";\n      }\n\n      // Generate a generate string table for enum values.\n      // Problem is, if values are very sparse that could generate really\n      // big tables. Ideally in that case we generate a map lookup\n      // instead, but for the moment we simply don't output a table at all.\n      auto range = enum_def.Distance();\n      // Average distance between values above which we consider a table\n      // \"too sparse\". Change at will.\n      static const uint64_t kMaxSparseness = 5;\n      if (range / static_cast<uint64_t>(enum_def.size()) < kMaxSparseness) {\n        GeneratePropertyOneLine(writer, \"names\", \"Array<String>\", [&]() {\n          writer += \"arrayOf(\\\\\";\n          auto val = enum_def.Vals().front();\n          for (auto it = vals.begin(); it != vals.end(); ++it) {\n            auto ev = *it;\n            for (auto k = enum_def.Distance(val, ev); k > 1; --k)\n              writer += \"\\\"\\\", \\\\\";\n            val = ev;\n            writer += \"\\\"\" + (*it)->name + \"\\\"\\\\\";\n            if (it + 1 != vals.end()) {\n              writer += \", \\\\\";\n            }\n          }\n          writer += \")\";\n        });\n        std::string e_param = \"e: \" + enum_type;\n        GenerateFunOneLine(\n            writer, \"name\", e_param, \"String\",\n            [&]() {\n              writer += \"names[e.value.toInt()\\\\\";\n              if (enum_def.MinValue()->IsNonZero())\n                writer += \" - \" + namer_.Variant(*enum_def.MinValue()) +\n                          \".value.toInt()\\\\\";\n              writer += \"]\";\n            },\n            parser_.opts.gen_jvmstatic);\n      }\n    });\n    writer.DecrementIdentLevel();\n    writer += \"}\";\n  }\n\n  // Returns the function name that is able to read a value of the given type.\n  std::string ByteBufferGetter(const Type& type,\n                               std::string bb_var_name) const {\n    switch (type.base_type) {\n      case BASE_TYPE_STRING:\n        return \"string\";\n      case BASE_TYPE_STRUCT:\n        return \"__struct\";\n      case BASE_TYPE_UNION:\n        return \"union\";\n      case BASE_TYPE_VECTOR:\n        return ByteBufferGetter(type.VectorType(), bb_var_name);\n      case BASE_TYPE_INT:\n        return bb_var_name + \".getInt\";\n      case BASE_TYPE_UINT:\n        return bb_var_name + \".getUInt\";\n      case BASE_TYPE_SHORT:\n        return bb_var_name + \".getShort\";\n      case BASE_TYPE_USHORT:\n        return bb_var_name + \".getUShort\";\n      case BASE_TYPE_ULONG:\n        return bb_var_name + \".getULong\";\n      case BASE_TYPE_LONG:\n        return bb_var_name + \".getLong\";\n      case BASE_TYPE_FLOAT:\n        return bb_var_name + \".getFloat\";\n      case BASE_TYPE_DOUBLE:\n        return bb_var_name + \".getDouble\";\n      case BASE_TYPE_UTYPE:\n      case BASE_TYPE_UCHAR:\n        return bb_var_name + \".getUByte\";\n      case BASE_TYPE_CHAR:\n      case BASE_TYPE_NONE:\n        return bb_var_name + \".get\";\n      case BASE_TYPE_BOOL:\n        return \"0.toByte() != \" + bb_var_name + \".get\";\n      default:\n        return bb_var_name + \".\" + namer_.Method(\"get\", GenType(type));\n    }\n  }\n\n  // Returns the function name that is able to read a value of the given type.\n  std::string GenLookupByKey(flatbuffers::FieldDef* key_field,\n                             const std::string& bb_var_name,\n                             const char* num = nullptr) const {\n    auto type = key_field->value.type;\n    return ByteBufferGetter(type, bb_var_name) + \"(\" +\n           GenOffsetGetter(key_field, num) + \")\";\n  }\n\n  // Returns the method name for use with add/put calls.\n  static std::string GenMethod(const Type& type) {\n    return IsStruct(type) ? \"Struct\" : \"\";\n  }\n\n  // Recursively generate arguments for a constructor, to deal with nested\n  // structs.\n  void GenStructArgs(const StructDef& struct_def, CodeWriter& writer,\n                     const char* nameprefix) const {\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (IsStruct(field.value.type)) {\n        // Generate arguments for a struct inside a struct. To ensure\n        // names don't clash, and to make it obvious these arguments are\n        // constructing a nested struct, prefix the name with the field\n        // name.\n        GenStructArgs(*field.value.type.struct_def, writer,\n                      (nameprefix + (field.name + \"_\")).c_str());\n      } else {\n        writer += std::string(\", \") + nameprefix + \"\\\\\";\n        writer += namer_.Field(field) + \": \\\\\";\n        writer += GenType(field.value.type) + \"\\\\\";\n      }\n    }\n  }\n\n  // Recusively generate struct construction statements of the form:\n  // builder.putType(name);\n  // and insert manual padding.\n  void GenStructBody(const StructDef& struct_def, CodeWriter& writer,\n                     const char* nameprefix) const {\n    writer.SetValue(\"align\", NumToString(struct_def.minalign));\n    writer.SetValue(\"size\", NumToString(struct_def.bytesize));\n    writer += \"builder.prep({{align}}, {{size}})\";\n    auto fields_vec = struct_def.fields.vec;\n    for (auto it = fields_vec.rbegin(); it != fields_vec.rend(); ++it) {\n      auto& field = **it;\n\n      if (field.padding) {\n        writer.SetValue(\"pad\", NumToString(field.padding));\n        writer += \"builder.pad({{pad}})\";\n      }\n      if (IsStruct(field.value.type)) {\n        GenStructBody(*field.value.type.struct_def, writer,\n                      (nameprefix + (field.name + \"_\")).c_str());\n      } else {\n        auto suffix = IsEnum(field.value.type) ? \".value\" : \"\";\n        writer.SetValue(\"type\", GenMethod(field.value.type));\n        writer.SetValue(\"argname\",\n                        nameprefix + namer_.Variable(field) + suffix);\n        writer += \"builder.put{{type}}({{argname}})\";\n      }\n    }\n  }\n\n  std::string GenOffsetGetter(flatbuffers::FieldDef* key_field,\n                              const char* num = nullptr) const {\n    std::string key_offset =\n        \"offset(\" + NumToString(key_field->value.offset) + \", \";\n    if (num) {\n      key_offset += num;\n      key_offset += \", buffer)\";\n    } else {\n      key_offset += \"(bb.capacity - tableOffset).toOffset<Int>(), bb)\";\n    }\n    return key_offset;\n  }\n\n  bool StructHasUnsignedField(StructDef& struct_def) {\n    auto vec = struct_def.fields.vec;\n    for (auto it = vec.begin(); it != vec.end(); ++it) {\n      auto& field = **it;\n      if (IsUnsigned(field.value.type.base_type)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  // This method generate alias types for offset arrays. We need it\n  // to avoid unboxing/boxing of offsets when put into an array.\n  // e.g:\n  // Array<Offset<Monster>> generates boxing.\n  // So we creates a new type to avoid it:\n  // typealias MonterOffsetArray = IntArray\n  void GenStructOffsetAlias(StructDef& struct_def, CodeWriter& writer) const {\n    if (struct_def.generated) return;\n    auto name = namer_.Type(struct_def);\n    // This assumes offset as Ints always.\n    writer += \"typealias \" + name + \"OffsetArray = OffsetArray<\" + name + \">\";\n\n    // public inline fun <T> MonsterOffsetArray(size: Int, crossinline call:\n    // (Int) -> Offset<T>): OffsetArray<T> {\n    //  return OffsetArray(IntArray(size) { call(it).value })\n    // }\n    writer += \"\";\n    writer += \"inline fun \" + name +\n              \"OffsetArray(size: Int, crossinline call: (Int) -> Offset<\" +\n              name + \">): \" + name + \"OffsetArray =\";\n    writer.IncrementIdentLevel();\n    writer += name + \"OffsetArray(IntArray(size) { call(it).value })\";\n  }\n\n  // This method generate alias types for offset arrays. We need it\n  // to avoid unboxing/boxing of offsets when put into an array.\n  // e.g:\n  // Array<Offset<Monster>> generates boxing.\n  // So we creates a new type to avoid it:\n  // typealias MonterOffsetArray = IntArray\n  void GenEnumOffsetAlias(EnumDef& enum_def, CodeWriter& writer) const {\n    if (enum_def.generated) return;\n    // This assumes offset as Ints always.\n    writer += \"typealias \" + namer_.Type(enum_def) +\n              \"Array = \" + GenTypeBasic(enum_def.underlying_type.base_type) +\n              \"Array\";\n  }\n\n  void GenStruct(StructDef& struct_def, CodeWriter& writer,\n                 IDLOptions options) const {\n    if (struct_def.generated) return;\n\n    GenerateComment(struct_def.doc_comment, writer, &comment_config);\n    auto fixed = struct_def.fixed;\n\n    writer.SetValue(\"struct_name\", namer_.Type(struct_def));\n    writer.SetValue(\"superclass\", fixed ? \"Struct\" : \"Table\");\n\n    writer += \"@Suppress(\\\"unused\\\")\";\n    writer += \"class {{struct_name}} : {{superclass}}() {\\n\";\n\n    writer.IncrementIdentLevel();\n\n    {\n      auto esc_type = namer_.EscapeKeyword(struct_def.name);\n      // Generate the init() method that sets the field in a pre-existing\n      // accessor object. This is to allow object reuse.\n      GenerateFunOneLine(writer, \"init\", \"i: Int, buffer: ReadWriteBuffer\",\n                         esc_type, [&]() { writer += \"reset(i, buffer)\"; });\n      writer += \"\";  // line break\n\n      // Generate all getters\n      GenerateStructGetters(struct_def, writer);\n\n      // Generate Static Fields\n      GenerateCompanionObject(writer, [&]() {\n        if (!struct_def.fixed) {\n          FieldDef* key_field = nullptr;\n\n          // Generate version check method.\n          // Force compile time error if not using the same version\n          // runtime.\n          GenerateFunOneLine(\n              writer, \"validateVersion\", \"\", \"\",\n              [&]() { writer += \"VERSION_2_0_8\"; }, options.gen_jvmstatic);\n\n          writer += \"\";\n          GenerateGetRootAsAccessors(namer_.Type(struct_def), writer, options);\n\n          writer += \"\";\n          GenerateBufferHasIdentifier(struct_def, writer, options);\n\n          writer += \"\";\n          GenerateTableCreator(struct_def, writer, options);\n\n          GenerateStartStructMethod(struct_def, writer, options);\n\n          // Static Add for fields\n          auto fields = struct_def.fields.vec;\n          int field_pos = -1;\n          for (auto it = fields.begin(); it != fields.end(); ++it) {\n            auto& field = **it;\n            field_pos++;\n            if (field.deprecated) continue;\n            if (field.key) key_field = &field;\n            writer += \"\";\n            GenerateAddField(NumToString(field_pos), field, writer, options);\n            if (IsVector(field.value.type)) {\n              auto vector_type = field.value.type.VectorType();\n              if (!IsStruct(vector_type)) {\n                writer += \"\";\n                GenerateCreateVectorField(field, writer, options);\n              }\n              writer += \"\";\n              GenerateStartVectorField(field, writer, options);\n            }\n          }\n\n          writer += \"\";\n          GenerateEndStructMethod(struct_def, writer, options);\n          auto file_identifier = parser_.file_identifier_;\n          if (parser_.root_struct_def_ == &struct_def) {\n            writer += \"\";\n            GenerateFinishStructBuffer(struct_def, file_identifier, writer,\n                                       options);\n            writer += \"\";\n            GenerateFinishSizePrefixed(struct_def, file_identifier, writer,\n                                       options);\n          }\n\n          if (struct_def.has_key) {\n            writer += \"\";\n            GenerateLookupByKey(key_field, struct_def, writer, options);\n          }\n        } else {\n          writer += \"\";\n          GenerateStaticConstructor(struct_def, writer, options);\n        }\n      });\n    }\n\n    // class closing\n    writer.DecrementIdentLevel();\n    writer += \"}\";\n  }\n\n  // TODO: move key_field to reference instead of pointer\n  void GenerateLookupByKey(FieldDef* key_field, StructDef& struct_def,\n                           CodeWriter& writer, const IDLOptions options) const {\n    std::stringstream params;\n    params << \"obj: \" << namer_.Type(struct_def) << \"?\"\n           << \", \";\n    params << \"vectorLocation: Int, \";\n    params << \"key: \" << GenTypeGet(key_field->value.type) << \", \";\n    params << \"bb: ReadWriteBuffer\";\n\n    auto statements = [&]() {\n      auto base_type = key_field->value.type.base_type;\n      writer.SetValue(\"struct_name\", namer_.Type(struct_def));\n      if (base_type == BASE_TYPE_STRING) {\n        writer += \"val byteKey = key.encodeToByteArray()\";\n      }\n      writer += \"var span = bb.getInt(vectorLocation - 4)\";\n      writer += \"var start = 0\";\n      writer += \"while (span != 0) {\";\n      writer.IncrementIdentLevel();\n      writer += \"var middle = span / 2\";\n      writer +=\n          \"val tableOffset = indirect(vector\"\n          \"Location + 4 * (start + middle), bb)\";\n      if (IsString(key_field->value.type)) {\n        writer += \"val comp = compareStrings(\\\\\";\n        writer += GenOffsetGetter(key_field) + \"\\\\\";\n        writer += \", byteKey, bb)\";\n      } else {\n        auto get_val = GenLookupByKey(key_field, \"bb\");\n        writer += \"val value = \" + get_val;\n        writer += \"val comp = value.compareTo(key)\";\n      }\n      writer += \"when {\";\n      writer.IncrementIdentLevel();\n      writer += \"comp > 0 -> span = middle\";\n      writer += \"comp < 0 -> {\";\n      writer.IncrementIdentLevel();\n      writer += \"middle++\";\n      writer += \"start += middle\";\n      writer += \"span -= middle\";\n      writer.DecrementIdentLevel();\n      writer += \"}\";  // end comp < 0\n      writer += \"else -> {\";\n      writer.IncrementIdentLevel();\n      writer += \"return (obj ?: {{struct_name}}()).init(tableOffset, bb)\";\n      writer.DecrementIdentLevel();\n      writer += \"}\";  // end else\n      writer.DecrementIdentLevel();\n      writer += \"}\";  // end when\n      writer.DecrementIdentLevel();\n      writer += \"}\";  // end while\n      writer += \"return null\";\n    };\n    GenerateFun(writer, \"lookupByKey\", params.str(),\n                namer_.Type(struct_def) + \"?\", statements,\n                options.gen_jvmstatic);\n  }\n\n  void GenerateFinishSizePrefixed(StructDef& struct_def,\n                                  const std::string& identifier,\n                                  CodeWriter& writer,\n                                  const IDLOptions options) const {\n    auto id = identifier.length() > 0 ? \", \\\"\" + identifier + \"\\\"\" : \"\";\n    auto gen_type = \"Offset<\" + namer_.Type(struct_def.name) + \">\";\n    auto params = \"builder: FlatBufferBuilder, offset: \" + gen_type;\n    auto method_name =\n        namer_.LegacyJavaMethod2(\"finishSizePrefixed\", struct_def, \"Buffer\");\n    GenerateFunOneLine(\n        writer, method_name, params, \"\",\n        [&]() { writer += \"builder.finishSizePrefixed(offset\" + id + \")\"; },\n        options.gen_jvmstatic);\n  }\n  void GenerateFinishStructBuffer(StructDef& struct_def,\n                                  const std::string& identifier,\n                                  CodeWriter& writer,\n                                  const IDLOptions options) const {\n    auto id = identifier.length() > 0 ? \", \\\"\" + identifier + \"\\\"\" : \"\";\n    auto gen_type = \"Offset<\" + namer_.Type(struct_def.name) + \">\";\n    auto params = \"builder: FlatBufferBuilder, offset: \" + gen_type;\n    auto method_name =\n        namer_.LegacyKotlinMethod(\"finish\", struct_def, \"Buffer\");\n    GenerateFunOneLine(\n        writer, method_name, params, \"\",\n        [&]() { writer += \"builder.finish(offset\" + id + \")\"; },\n        options.gen_jvmstatic);\n  }\n\n  void GenerateEndStructMethod(StructDef& struct_def, CodeWriter& writer,\n                               const IDLOptions options) const {\n    // Generate end{{TableName}}(builder: FlatBufferBuilder) method\n    auto name = namer_.Method(\"end\", struct_def.name);\n    auto params = \"builder: FlatBufferBuilder\";\n    auto returns = \"Offset<\" + namer_.Type(struct_def) + '>';\n    auto field_vec = struct_def.fields.vec;\n\n    GenerateFun(\n        writer, name, params, returns,\n        [&]() {\n          writer += \"val o: \" + returns + \" = builder.endTable()\";\n          writer.IncrementIdentLevel();\n          for (auto it = field_vec.begin(); it != field_vec.end(); ++it) {\n            auto& field = **it;\n            if (field.deprecated || !field.IsRequired()) {\n              continue;\n            }\n            writer.SetValue(\"offset\", NumToString(field.value.offset));\n            writer.SetValue(\"field_name\", field.name);\n            writer += \"builder.required(o, {{offset}}, \\\"{{field_name}}\\\")\";\n          }\n          writer.DecrementIdentLevel();\n          writer += \"return o\";\n        },\n        options.gen_jvmstatic);\n  }\n\n  // Generate a method to create a vector from a Kotlin array.\n  void GenerateCreateVectorField(FieldDef& field, CodeWriter& writer,\n                                 const IDLOptions options) const {\n    auto vector_type = field.value.type.VectorType();\n    auto method_name = namer_.Method(\"create\", field, \"vector\");\n    auto array_param = GenerateKotlinOffsetArray(vector_type);\n    auto params = \"builder: FlatBufferBuilder, vector:\" + array_param;\n    auto return_type = GenType(field.value.type);\n    writer.SetValue(\"size\", NumToString(InlineSize(vector_type)));\n    writer.SetValue(\"align\", NumToString(InlineAlignment(vector_type)));\n    writer.SetValue(\"root\", GenMethod(vector_type));\n\n    GenerateFun(\n        writer, method_name, params, return_type,\n        [&]() {\n          writer += \"builder.startVector({{size}}, vector.size, {{align}})\";\n          writer += \"for (i in vector.size - 1 downTo 0) {\";\n          writer.IncrementIdentLevel();\n          writer += \"builder.add{{root}}(vector[i])\";\n          writer.DecrementIdentLevel();\n          writer += \"}\";\n          writer += \"return builder.endVector()\";\n        },\n        options.gen_jvmstatic);\n  }\n\n  void GenerateStartVectorField(FieldDef& field, CodeWriter& writer,\n                                const IDLOptions options) const {\n    // Generate a method to start a vector, data to be added manually\n    // after.\n    auto vector_type = field.value.type.VectorType();\n    auto params = \"builder: FlatBufferBuilder, numElems: Int\";\n    writer.SetValue(\"size\", NumToString(InlineSize(vector_type)));\n    writer.SetValue(\"align\", NumToString(InlineAlignment(vector_type)));\n\n    GenerateFunOneLine(\n        writer, namer_.Method(\"start\", field, \"Vector\"), params, \"\",\n        [&]() {\n          writer += \"builder.startVector({{size}}, numElems, {{align}})\";\n        },\n        options.gen_jvmstatic);\n  }\n\n  void GenerateAddField(std::string field_pos, FieldDef& field,\n                        CodeWriter& writer, const IDLOptions options) const {\n    auto field_type = GenType(field.value.type);\n    auto secondArg = namer_.Variable(field.name) + \": \" + field_type;\n\n    auto content = [&]() {\n      auto method = GenMethod(field.value.type);\n      auto default_value = GenDefaultBufferValue(field);\n      auto field_param = namer_.Field(field);\n      if (IsEnum(field.value.type) || IsStruct(field.value.type)) {\n        field_param += \".value\";\n      }\n\n      writer.SetValue(\"field_name\", namer_.Field(field));\n      writer.SetValue(\"field_param\", field_param);\n      writer.SetValue(\"method_name\", method);\n      writer.SetValue(\"pos\", field_pos);\n      writer.SetValue(\"default\", default_value);\n\n      if (field.key) {\n        // field has key attribute, so always need to exist\n        // even if its value is equal to default.\n        // Generated code will bypass default checking\n        // resulting in { builder.addShort(name); slot(id); }\n        writer += \"builder.add{{method_name}}({{field_name}})\";\n        writer += \"builder.slot({{pos}})\";\n      } else {\n        writer += \"builder.add{{method_name}}({{pos}}, \\\\\";\n        writer += \"{{field_param}}, {{default}})\";\n      }\n    };\n    auto signature = namer_.LegacyKotlinMethod(\"add\", field, \"\");\n    auto params = \"builder: FlatBufferBuilder, \" + secondArg;\n    if (field.key) {\n      GenerateFun(writer, signature, params, \"\", content,\n                  options.gen_jvmstatic);\n    } else {\n      GenerateFunOneLine(writer, signature, params, \"\", content,\n                         options.gen_jvmstatic);\n    }\n  }\n\n  // fun startMonster(builder: FlatBufferBuilder) = builder.startTable(11)\n  void GenerateStartStructMethod(StructDef& struct_def, CodeWriter& code,\n                                 const IDLOptions options) const {\n    GenerateFunOneLine(\n        code, namer_.LegacyJavaMethod2(\"start\", struct_def, \"\"),\n        \"builder: FlatBufferBuilder\", \"\",\n        [&]() {\n          code += \"builder.startTable(\" +\n                  NumToString(struct_def.fields.vec.size()) + \")\";\n        },\n        options.gen_jvmstatic);\n  }\n\n  void GenerateTableCreator(StructDef& struct_def, CodeWriter& writer,\n                            const IDLOptions options) const {\n    // Generate a method that creates a table in one go. This is only possible\n    // when the table has no struct fields, since those have to be created\n    // inline, and there's no way to do so in Java.\n    bool has_no_struct_fields = true;\n    int num_fields = 0;\n    auto fields_vec = struct_def.fields.vec;\n\n    for (auto it = fields_vec.begin(); it != fields_vec.end(); ++it) {\n      auto& field = **it;\n      if (field.deprecated) continue;\n      if (IsStruct(field.value.type)) {\n        has_no_struct_fields = false;\n      } else {\n        num_fields++;\n      }\n    }\n    // JVM specifications restrict default constructor params to be < 255.\n    // Longs and doubles take up 2 units, so we set the limit to be < 127.\n    if (has_no_struct_fields && num_fields && num_fields < 127) {\n      // Generate a table constructor of the form:\n      // public static int createName(FlatBufferBuilder builder, args...)\n\n      auto name = namer_.LegacyJavaMethod2(\"create\", struct_def, \"\");\n      std::stringstream params;\n      params << \"builder: FlatBufferBuilder\";\n      for (auto it = fields_vec.begin(); it != fields_vec.end(); ++it) {\n        auto& field = **it;\n        if (field.deprecated) continue;\n        params << \", \" << namer_.Variable(field);\n        if (!IsScalar(field.value.type.base_type)) {\n          params << \"Offset: \";\n        } else {\n          params << \": \";\n        }\n        auto optional = field.IsScalarOptional() ? \"?\" : \"\";\n        params << GenType(field.value.type) << optional;\n      }\n\n      GenerateFun(\n          writer, name, params.str(), \"Offset<\" + namer_.Type(struct_def) + '>',\n          [&]() {\n            writer.SetValue(\"vec_size\", NumToString(fields_vec.size()));\n            writer.SetValue(\"end_method\",\n                            namer_.Method(\"end\", struct_def.name));\n            writer += \"builder.startTable({{vec_size}})\";\n\n            auto sortbysize = struct_def.sortbysize;\n            auto largest = sortbysize ? sizeof(largest_scalar_t) : 1;\n            for (size_t size = largest; size; size /= 2) {\n              for (auto it = fields_vec.rbegin(); it != fields_vec.rend();\n                   ++it) {\n                auto& field = **it;\n                auto base_type_size = SizeOf(field.value.type.base_type);\n                if (!field.deprecated &&\n                    (!sortbysize || size == base_type_size)) {\n                  writer.SetValue(\"field_name\", namer_.Field(field));\n\n                  // we wrap on null check for scalar optionals\n                  writer += field.IsScalarOptional()\n                                ? \"{{field_name}}?.run { \\\\\"\n                                : \"\\\\\";\n\n                  writer += namer_.LegacyKotlinMethod(\"add\", field, \"\") +\n                            \"(builder, {{field_name}}\\\\\";\n                  if (!IsScalar(field.value.type.base_type)) {\n                    writer += \"Offset\\\\\";\n                  }\n                  // we wrap on null check for scalar optionals\n                  writer += field.IsScalarOptional() ? \") }\" : \")\";\n                }\n              }\n            }\n            writer += \"return {{end_method}}(builder)\";\n          },\n          options.gen_jvmstatic);\n    }\n  }\n  void GenerateBufferHasIdentifier(StructDef& struct_def, CodeWriter& writer,\n                                   IDLOptions options) const {\n    auto file_identifier = parser_.file_identifier_;\n    // Check if a buffer has the identifier.\n    if (parser_.root_struct_def_ != &struct_def || !file_identifier.length())\n      return;\n    auto name = namer_.Function(struct_def);\n    GenerateFunOneLine(\n        writer, name + \"BufferHasIdentifier\", \"buffer: ReadWriteBuffer\",\n        \"Boolean\",\n        [&]() {\n          writer += \"hasIdentifier(buffer, \\\"\" + file_identifier + \"\\\")\";\n        },\n        options.gen_jvmstatic);\n  }\n\n  void GenerateStructGetters(StructDef& struct_def, CodeWriter& writer) const {\n    auto fields_vec = struct_def.fields.vec;\n    FieldDef* key_field = nullptr;\n    for (auto it = fields_vec.begin(); it != fields_vec.end(); ++it) {\n      auto& field = **it;\n      if (field.deprecated) continue;\n      if (field.key) key_field = &field;\n\n      GenerateComment(field.doc_comment, writer, &comment_config);\n\n      auto field_name = namer_.Field(field);\n      auto field_type = GenTypeGet(field.value.type);\n      auto field_default_value = GenDefaultValue(field);\n      auto return_type = GetterReturnType(field);\n      auto bbgetter = ByteBufferGetter(field.value.type, \"bb\");\n      auto offset_val = NumToString(field.value.offset);\n      auto offset_prefix =\n          \"val o = offset(\" + offset_val + \"); return o != 0 ? \";\n      auto value_base_type = field.value.type.base_type;\n      // Most field accessors need to retrieve and test the field offset\n      // first, this is the offset value for that:\n      writer.SetValue(\"offset\", NumToString(field.value.offset));\n      writer.SetValue(\"return_type\", return_type);\n      writer.SetValue(\"field_type\", field_type);\n      writer.SetValue(\"field_name\", field_name);\n      writer.SetValue(\"field_default\", field_default_value);\n      writer.SetValue(\"bbgetter\", bbgetter);\n      // Generate the accessors that don't do object reuse.\n      if (value_base_type == BASE_TYPE_STRUCT) {\n        // Calls the accessor that takes an accessor object with a\n        // new object.\n        // val pos\n        //     get() = pos(Vec3())\n        GenerateGetterOneLine(writer, field_name, return_type, [&]() {\n          writer += \"{{field_name}}({{field_type}}())\";\n        });\n      } else if (value_base_type == BASE_TYPE_VECTOR &&\n                 field.value.type.element == BASE_TYPE_STRUCT) {\n        // Accessors for vectors of structs also take accessor objects,\n        // this generates a variant without that argument.\n        // ex: fun weapons(j: Int) = weapons(Weapon(), j)\n        GenerateFunOneLine(writer, field_name, \"j: Int\", return_type, [&]() {\n          writer += \"{{field_name}}({{field_type}}(), j)\";\n        });\n      }\n\n      if (IsScalar(value_base_type)) {\n        if (struct_def.fixed) {\n          GenerateGetterOneLine(writer, field_name, return_type, [&]() {\n            std::string found = \"{{bbgetter}}(bufferPos + {{offset}})\";\n            writer += WrapEnumValue(field.value.type, found);\n          });\n        } else {\n          GenerateGetterOneLine(writer, field_name, return_type, [&]() {\n            std::string found = \"{{bbgetter}}(it + bufferPos)\";\n            writer += LookupFieldOneLine(offset_val,\n                                         WrapEnumValue(field.value.type, found),\n                                         \"{{field_default}}\");\n          });\n        }\n      } else {\n        switch (value_base_type) {\n          case BASE_TYPE_STRUCT:\n            if (struct_def.fixed) {\n              // create getter with object reuse\n              // ex:\n              // fun pos(obj: Vec3) : Vec3? = obj.init(bufferPos + 4, bb)\n              // ? adds nullability annotation\n              GenerateFunOneLine(\n                  writer, field_name, \"obj: \" + field_type, return_type,\n                  [&]() { writer += \"obj.init(bufferPos + {{offset}}, bb)\"; });\n            } else {\n              // create getter with object reuse\n              // ex:\n              //  fun pos(obj: Vec3) : Vec3? {\n              //      val o = offset(4)\n              //      return if(o != 0) {\n              //          obj.init(o + bufferPos, bb)\n              //      else {\n              //          null\n              //      }\n              //  }\n              // ? adds nullability annotation\n              GenerateFunOneLine(\n                  writer, field_name, \"obj: \" + field_type, return_type, [&]() {\n                    auto fixed = field.value.type.struct_def->fixed;\n\n                    writer.SetValue(\"seek\", Indirect(\"it + bufferPos\", fixed));\n                    writer += LookupFieldOneLine(\n                        offset_val, \"obj.init({{seek}}, bb)\", \"null\");\n                  });\n            }\n            break;\n          case BASE_TYPE_STRING:\n            // create string getter\n            // e.g.\n            // val Name : String?\n            //     get() = {\n            //         val o = offset(10)\n            //         return if (o != 0) string(o + bufferPos) else null\n            //     }\n            // ? adds nullability annotation\n            GenerateGetterOneLine(writer, field_name, return_type, [&]() {\n              writer += LookupFieldOneLine(offset_val, \"string(it + bufferPos)\",\n                                           \"null\");\n            });\n            break;\n          case BASE_TYPE_VECTOR: {\n            // e.g.\n            // fun inventory(j: Int) : UByte {\n            //     val o = offset(14)\n            //     return if (o != 0) {\n            //         bb.get(vector(it) + j * 1).toUByte()\n            //     } else {\n            //        0\n            //     }\n            // }\n\n            auto vectortype = field.value.type.VectorType();\n            std::string params = \"j: Int\";\n\n            if (vectortype.base_type == BASE_TYPE_STRUCT ||\n                vectortype.base_type == BASE_TYPE_UNION) {\n              params = \"obj: \" + field_type + \", j: Int\";\n            }\n\n            GenerateFunOneLine(writer, field_name, params, return_type, [&]() {\n              auto inline_size = NumToString(InlineSize(vectortype));\n              auto index = \"vector(it) + j * \" + inline_size;\n              std::string found = \"\";\n              writer.SetValue(\"index\", index);\n\n              if (IsEnum(vectortype)) {\n                found = \"{{field_type}}({{bbgetter}}({{index}}))\";\n              } else {\n                switch (vectortype.base_type) {\n                  case BASE_TYPE_STRUCT: {\n                    bool fixed = vectortype.struct_def->fixed;\n                    writer.SetValue(\"index\", Indirect(index, fixed));\n                    found = \"obj.init({{index}}, bb)\";\n                    break;\n                  }\n                  case BASE_TYPE_UNION:\n                    found = \"{{bbgetter}}(obj, {{index}})\";\n                    break;\n                  case BASE_TYPE_UTYPE:\n                    found = \"{{field_type}}({{bbgetter}}({{index}}))\";\n                    break;\n                  default:\n                    found = \"{{bbgetter}}({{index}})\";\n                }\n              }\n              writer +=\n                  LookupFieldOneLine(offset_val, found, \"{{field_default}}\");\n            });\n            break;\n          }\n          case BASE_TYPE_UNION:\n            GenerateFunOneLine(\n                writer, field_name, \"obj: \" + field_type, return_type, [&]() {\n                  writer += LookupFieldOneLine(\n                      offset_val, bbgetter + \"(obj, it + bufferPos)\", \"null\");\n                });\n            break;\n          default:\n            FLATBUFFERS_ASSERT(0);\n        }\n      }\n\n      if (value_base_type == BASE_TYPE_VECTOR) {\n        // Generate Lenght functions for vectors\n        GenerateGetterOneLine(writer, field_name + \"Length\", \"Int\", [&]() {\n          writer += LookupFieldOneLine(offset_val, \"vectorLength(it)\", \"0\");\n        });\n\n        // See if we should generate a by-key accessor.\n        if (field.value.type.element == BASE_TYPE_STRUCT &&\n            !field.value.type.struct_def->fixed) {\n          auto& sd = *field.value.type.struct_def;\n          auto& fields = sd.fields.vec;\n          for (auto kit = fields.begin(); kit != fields.end(); ++kit) {\n            auto& kfield = **kit;\n            if (kfield.key) {\n              auto qualified_name = TypeInNameSpace(sd);\n              auto name = namer_.Method(field, \"ByKey\");\n              auto params = \"key: \" + GenTypeGet(kfield.value.type);\n              auto rtype = qualified_name + \"?\";\n              GenerateFunOneLine(writer, name, params, rtype, [&]() {\n                writer += LookupFieldOneLine(\n                    offset_val,\n                    qualified_name + \".lookupByKey(null, vector(it), key, bb)\",\n                    \"null\");\n              });\n\n              auto param2 = \"obj: \" + qualified_name +\n                            \", key: \" + GenTypeGet(kfield.value.type);\n              GenerateFunOneLine(writer, name, param2, rtype, [&]() {\n                writer += LookupFieldOneLine(\n                    offset_val,\n                    qualified_name + \".lookupByKey(obj, vector(it), key, bb)\",\n                    \"null\");\n              });\n\n              break;\n            }\n          }\n        }\n      }\n\n      if ((value_base_type == BASE_TYPE_VECTOR &&\n           IsScalar(field.value.type.VectorType().base_type)) ||\n          value_base_type == BASE_TYPE_STRING) {\n        auto end_idx =\n            NumToString(value_base_type == BASE_TYPE_STRING\n                            ? 1\n                            : InlineSize(field.value.type.VectorType()));\n\n        // Generate a ByteBuffer accessor for strings & vectors of scalars.\n        // e.g.\n        // fun inventoryInByteBuffer(buffer: Bytebuffer):\n        //     ByteBuffer = vectorAsBuffer(buffer, 14, 1)\n        GenerateFunOneLine(\n            writer, field_name + \"AsBuffer\", \"\", \"ReadBuffer\", [&]() {\n              writer.SetValue(\"end\", end_idx);\n              writer += \"vectorAsBuffer(bb, {{offset}}, {{end}})\";\n            });\n      }\n\n      // generate object accessors if is nested_flatbuffer\n      // fun testnestedflatbufferAsMonster() : Monster?\n      //{ return testnestedflatbufferAsMonster(new Monster()); }\n\n      if (field.nested_flatbuffer) {\n        auto nested_type_name = TypeInNameSpace(*field.nested_flatbuffer);\n        auto nested_method_name =\n            field_name + \"As\" + field.nested_flatbuffer->name;\n\n        GenerateGetterOneLine(\n            writer, nested_method_name, nested_type_name + \"?\", [&]() {\n              writer += nested_method_name + \"(\" + nested_type_name + \"())\";\n            });\n\n        GenerateFunOneLine(\n            writer, nested_method_name, \"obj: \" + nested_type_name,\n            nested_type_name + \"?\", [&]() {\n              writer += LookupFieldOneLine(\n                  offset_val, \"obj.init(indirect(vector(it)), bb)\", \"null\");\n            });\n      }\n\n      writer += \"\";  // Initial line break between fields\n    }\n    if (struct_def.has_key && !struct_def.fixed) {\n      // Key Comparison method\n      GenerateOverrideFun(\n          writer, \"keysCompare\",\n          \"o1: Offset<*>, o2: Offset<*>, buffer: ReadWriteBuffer\", \"Int\",\n          [&]() {\n            if (IsString(key_field->value.type)) {\n              writer.SetValue(\"offset\", NumToString(key_field->value.offset));\n              writer +=\n                  \" return compareStrings(offset({{offset}}, o1, \"\n                  \"buffer), offset({{offset}}, o2, buffer), buffer)\";\n\n            } else {\n              auto getter1 = GenLookupByKey(key_field, \"buffer\", \"o1\");\n              auto getter2 = GenLookupByKey(key_field, \"buffer\", \"o2\");\n              writer += \"val a = \" + getter1;\n              writer += \"val b = \" + getter2;\n              writer += \"return (a - b).toInt().sign()\";\n            }\n          });\n    }\n  }\n\n  static std::string LiteralSuffix(const Type& type) {\n    auto base = IsVector(type) ? type.element : type.base_type;\n    switch (base) {\n      case BASE_TYPE_UINT:\n      case BASE_TYPE_UCHAR:\n      case BASE_TYPE_UTYPE:\n      case BASE_TYPE_USHORT:\n        return \"u\";\n      case BASE_TYPE_ULONG:\n        return \"UL\";\n      case BASE_TYPE_LONG:\n        return \"L\";\n      default:\n        return \"\";\n    }\n  }\n\n  std::string WrapEnumValue(const Type& type, const std::string value) const {\n    if (IsEnum(type)) {\n      return GenType(type) + \"(\" + value + \")\";\n    }\n    if (IsVector(type) && IsEnum(type.VectorType())) {\n      return GenType(type.VectorType()) + \"(\" + value + \")\";\n    }\n    return value;\n  }\n\n  void GenerateCompanionObject(CodeWriter& code,\n                               const std::function<void()>& callback) const {\n    code += \"companion object {\";\n    code.IncrementIdentLevel();\n    callback();\n    code.DecrementIdentLevel();\n    code += \"}\";\n  }\n\n  // Generate a documentation comment, if available.\n  void GenerateComment(const std::vector<std::string>& dc, CodeWriter& writer,\n                       const CommentConfig* config) const {\n    if (dc.begin() == dc.end()) {\n      // Don't output empty comment blocks with 0 lines of comment content.\n      return;\n    }\n\n    if (config != nullptr && config->first_line != nullptr) {\n      writer += std::string(config->first_line);\n    }\n    std::string line_prefix =\n        ((config != nullptr && config->content_line_prefix != nullptr)\n             ? config->content_line_prefix\n             : \"///\");\n    for (auto it = dc.begin(); it != dc.end(); ++it) {\n      writer += line_prefix + *it;\n    }\n    if (config != nullptr && config->last_line != nullptr) {\n      writer += std::string(config->last_line);\n    }\n  }\n\n  void GenerateGetRootAsAccessors(const std::string& struct_name,\n                                  CodeWriter& writer,\n                                  IDLOptions options) const {\n    // Generate a special accessor for the table that when used as the root\n    // ex: fun getRootAsMonster(buffer: ByteBuffer): Monster {...}\n    writer.SetValue(\"gr_name\", struct_name);\n\n    // create convenience method that doesn't require an existing object\n    GenerateJvmStaticAnnotation(writer, options.gen_jvmstatic);\n    GenerateFunOneLine(writer, \"asRoot\", \"buffer: ReadWriteBuffer\", struct_name,\n                       [&]() { writer += \"asRoot(buffer, {{gr_name}}())\"; });\n\n    // create method that allows object reuse\n    // ex: fun Monster getRootAsMonster(buffer: ByteBuffer, obj: Monster) {...}\n    GenerateJvmStaticAnnotation(writer, options.gen_jvmstatic);\n    GenerateFunOneLine(\n        writer, \"asRoot\", \"buffer: ReadWriteBuffer, obj: {{gr_name}}\",\n        struct_name, [&]() {\n          writer +=\n              \"obj.init(buffer.getInt(buffer.limit) + buffer.limit, buffer)\";\n        });\n  }\n\n  void GenerateStaticConstructor(const StructDef& struct_def, CodeWriter& code,\n                                 const IDLOptions options) const {\n    // create a struct constructor function\n    auto params = StructConstructorParams(struct_def);\n    GenerateFun(\n        code, namer_.LegacyJavaMethod2(\"create\", struct_def, \"\"), params,\n        \"Offset<\" + namer_.Type(struct_def) + '>',\n        [&]() {\n          GenStructBody(struct_def, code, \"\");\n          code += \"return Offset(builder.offset())\";\n        },\n        options.gen_jvmstatic);\n  }\n\n  std::string StructConstructorParams(const StructDef& struct_def,\n                                      const std::string& prefix = \"\") const {\n    // builder: FlatBufferBuilder\n    std::stringstream out;\n    auto field_vec = struct_def.fields.vec;\n    if (prefix.empty()) {\n      out << \"builder: FlatBufferBuilder\";\n    }\n    for (auto it = field_vec.begin(); it != field_vec.end(); ++it) {\n      auto& field = **it;\n      if (IsStruct(field.value.type)) {\n        // Generate arguments for a struct inside a struct. To ensure\n        // names don't clash, and to make it obvious these arguments are\n        // constructing a nested struct, prefix the name with the field\n        // name.\n        out << StructConstructorParams(*field.value.type.struct_def,\n                                       prefix + (namer_.Variable(field) + \"_\"));\n      } else {\n        out << \", \" << prefix << namer_.Variable(field) << \": \"\n            << GenType(field.value.type);\n      }\n    }\n    return out.str();\n  }\n\n  static void GenerateVarGetterSetterOneLine(CodeWriter& writer,\n                                             const std::string& name,\n                                             const std::string& type,\n                                             const std::string& getter,\n                                             const std::string& setter) {\n    // Generates Kotlin getter for properties\n    // e.g.:\n    // val prop: Mytype\n    //     get() = {\n    //       return x\n    //     }\n    writer.SetValue(\"name\", name);\n    writer.SetValue(\"type\", type);\n    writer += \"var {{name}} : {{type}}\";\n    writer.IncrementIdentLevel();\n    writer += \"get() = \" + getter;\n    writer += \"set(value) = \" + setter;\n    writer.DecrementIdentLevel();\n  }\n\n  static void GeneratePropertyOneLine(CodeWriter& writer,\n                                      const std::string& name,\n                                      const std::string& type,\n                                      const std::function<void()>& body) {\n    // Generates Kotlin getter for properties\n    // e.g.:\n    // val prop: Mytype = x\n    writer.SetValue(\"_name\", name);\n    writer.SetValue(\"_type\", type);\n    writer += \"val {{_name}} : {{_type}} = \\\\\";\n    body();\n  }\n  static void GenerateGetterOneLine(CodeWriter& writer, const std::string& name,\n                                    const std::string& type,\n                                    const std::function<void()>& body) {\n    // Generates Kotlin getter for properties\n    // e.g.:\n    // val prop: Mytype get() = x\n    writer.SetValue(\"_name\", name);\n    writer.SetValue(\"_type\", type);\n    writer += \"val {{_name}} : {{_type}} get() = \\\\\";\n    body();\n  }\n\n  static void GenerateGetter(CodeWriter& writer, const std::string& name,\n                             const std::string& type,\n                             const std::function<void()>& body) {\n    // Generates Kotlin getter for properties\n    // e.g.:\n    // val prop: Mytype\n    //     get() = {\n    //       return x\n    //     }\n    writer.SetValue(\"name\", name);\n    writer.SetValue(\"type\", type);\n    writer += \"val {{name}} : {{type}}\";\n    writer.IncrementIdentLevel();\n    writer += \"get() {\";\n    writer.IncrementIdentLevel();\n    body();\n    writer.DecrementIdentLevel();\n    writer += \"}\";\n    writer.DecrementIdentLevel();\n  }\n\n  static void GenerateFun(CodeWriter& writer, const std::string& name,\n                          const std::string& params,\n                          const std::string& returnType,\n                          const std::function<void()>& body,\n                          bool gen_jvmstatic = false) {\n    // Generates Kotlin function\n    // e.g.:\n    // fun path(j: Int): Vec3 {\n    //     return path(Vec3(), j)\n    // }\n    auto noreturn = returnType.empty();\n    writer.SetValue(\"name\", name);\n    writer.SetValue(\"params\", params);\n    writer.SetValue(\"return_type\", noreturn ? \"\" : \": \" + returnType);\n    GenerateJvmStaticAnnotation(writer, gen_jvmstatic);\n    writer += \"fun {{name}}({{params}}) {{return_type}} {\";\n    writer.IncrementIdentLevel();\n    body();\n    writer.DecrementIdentLevel();\n    writer += \"}\";\n  }\n\n  static void GenerateFunOneLine(CodeWriter& writer, const std::string& name,\n                                 const std::string& params,\n                                 const std::string& returnType,\n                                 const std::function<void()>& body,\n                                 bool gen_jvmstatic = false) {\n    // Generates Kotlin function\n    // e.g.:\n    // fun path(j: Int): Vec3 = return path(Vec3(), j)\n    auto ret = returnType.empty() ? \"\" : \" : \" + returnType;\n    GenerateJvmStaticAnnotation(writer, gen_jvmstatic);\n    writer += \"fun \" + name + \"(\" + params + \")\" + ret + \" = \\\\\";\n    body();\n  }\n\n  static void GenerateOverrideFun(CodeWriter& writer, const std::string& name,\n                                  const std::string& params,\n                                  const std::string& returnType,\n                                  const std::function<void()>& body) {\n    // Generates Kotlin function\n    // e.g.:\n    // override fun path(j: Int): Vec3 = return path(Vec3(), j)\n    writer += \"override \\\\\";\n    GenerateFun(writer, name, params, returnType, body);\n  }\n\n  static void GenerateOverrideFunOneLine(CodeWriter& writer,\n                                         const std::string& name,\n                                         const std::string& params,\n                                         const std::string& returnType,\n                                         const std::string& statement) {\n    // Generates Kotlin function\n    // e.g.:\n    // override fun path(j: Int): Vec3 = return path(Vec3(), j)\n    writer.SetValue(\"name\", name);\n    writer.SetValue(\"params\", params);\n    writer.SetValue(\"return_type\",\n                    returnType.empty() ? \"\" : \" : \" + returnType);\n    writer += \"override fun {{name}}({{params}}){{return_type}} = \\\\\";\n    writer += statement;\n  }\n\n  static std::string LookupFieldOneLine(const std::string& offset,\n                                        const std::string& found,\n                                        const std::string& not_found) {\n    return \"lookupField(\" + offset + \", \" + not_found + \" ) { \" + found + \" }\";\n  }\n\n  static std::string Indirect(const std::string& index, bool fixed) {\n    // We apply indirect() and struct is not fixed.\n    if (!fixed) return \"indirect(\" + index + \")\";\n    return index;\n  }\n\n  static std::string NotFoundReturn(BaseType el) {\n    switch (el) {\n      case BASE_TYPE_FLOAT:\n        return \"0.0f\";\n      case BASE_TYPE_DOUBLE:\n        return \"0.0\";\n      case BASE_TYPE_BOOL:\n        return \"false\";\n      case BASE_TYPE_LONG:\n      case BASE_TYPE_INT:\n      case BASE_TYPE_CHAR:\n      case BASE_TYPE_SHORT:\n        return \"0\";\n      case BASE_TYPE_UINT:\n      case BASE_TYPE_UCHAR:\n      case BASE_TYPE_USHORT:\n      case BASE_TYPE_UTYPE:\n        return \"0u\";\n      case BASE_TYPE_ULONG:\n        return \"0uL\";\n      default:\n        return \"null\";\n    }\n  }\n\n  // Prepend @JvmStatic to methods in companion object.\n  static void GenerateJvmStaticAnnotation(CodeWriter& code,\n                                          bool gen_jvmstatic) {\n    if (gen_jvmstatic) {\n      code += \"@JvmStatic\";\n    }\n  }\n\n  const IdlNamer namer_;\n};\n}  // namespace kotlin\n\nstatic bool GenerateKotlinKMP(const Parser& parser, const std::string& path,\n                              const std::string& file_name) {\n  kotlin::KotlinKMPGenerator generator(parser, path, file_name);\n  return generator.generate();\n}\n\nnamespace {\n\nclass KotlinKMPCodeGenerator : public CodeGenerator {\n public:\n  Status GenerateCode(const Parser& parser, const std::string& path,\n                      const std::string& filename) override {\n    if (!GenerateKotlinKMP(parser, path, filename)) {\n      return Status::ERROR;\n    }\n    return Status::OK;\n  }\n\n  Status GenerateCode(const uint8_t*, int64_t, const CodeGenOptions&) override {\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateMakeRule(const Parser& parser, const std::string& path,\n                          const std::string& filename,\n                          std::string& output) override {\n    (void)parser;\n    (void)path;\n    (void)filename;\n    (void)output;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateGrpcCode(const Parser& parser, const std::string& path,\n                          const std::string& filename) override {\n    (void)parser;\n    (void)path;\n    (void)filename;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateRootFile(const Parser& parser,\n                          const std::string& path) override {\n    (void)parser;\n    (void)path;\n    return Status::NOT_IMPLEMENTED;\n  }\n  bool IsSchemaOnly() const override { return true; }\n\n  bool SupportsBfbsGeneration() const override { return false; }\n\n  bool SupportsRootFileGeneration() const override { return false; }\n\n  IDLOptions::Language Language() const override {\n    return IDLOptions::kKotlinKmp;\n  }\n\n  std::string LanguageName() const override { return \"Kotlin\"; }\n};\n}  // namespace\n\nstd::unique_ptr<CodeGenerator> NewKotlinKMPCodeGenerator() {\n  return std::unique_ptr<KotlinKMPCodeGenerator>(new KotlinKMPCodeGenerator());\n}\n\n}  // namespace flatbuffers\n"
  },
  {
    "path": "src/idl_gen_lobster.cpp",
    "content": "/*\n * Copyright 2018 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"idl_gen_lobster.h\"\n\n#include <string>\n#include <unordered_set>\n\n#include \"flatbuffers/code_generators.h\"\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/idl.h\"\n#include \"flatbuffers/util.h\"\n\nnamespace flatbuffers {\nnamespace lobster {\n\nclass LobsterGenerator : public BaseGenerator {\n public:\n  LobsterGenerator(const Parser& parser, const std::string& path,\n                   const std::string& file_name)\n      : BaseGenerator(parser, path, file_name, \"\" /* not used */, \".\",\n                      \"lobster\") {\n    static const char* const keywords[] = {\n        \"nil\",    \"true\",    \"false\",     \"return\",  \"struct\",    \"class\",\n        \"import\", \"int\",     \"float\",     \"string\",  \"any\",       \"def\",\n        \"is\",     \"from\",    \"program\",   \"private\", \"coroutine\", \"resource\",\n        \"enum\",   \"typeof\",  \"var\",       \"let\",     \"pakfile\",   \"switch\",\n        \"case\",   \"default\", \"namespace\", \"not\",     \"and\",       \"or\",\n        \"bool\",\n    };\n    keywords_.insert(std::begin(keywords), std::end(keywords));\n  }\n\n  std::string EscapeKeyword(const std::string& name) const {\n    return keywords_.find(name) == keywords_.end() ? name : name + \"_\";\n  }\n\n  std::string NormalizedName(const Definition& definition) const {\n    return EscapeKeyword(definition.name);\n  }\n\n  std::string NormalizedName(const EnumVal& ev) const {\n    return EscapeKeyword(ev.name);\n  }\n\n  std::string NamespacedName(const Definition& def) {\n    return WrapInNameSpace(def.defined_namespace, NormalizedName(def));\n  }\n\n  std::string GenTypeName(const Type& type) {\n    auto bits = NumToString(SizeOf(type.base_type) * 8);\n    if (IsInteger(type.base_type)) {\n      if (IsUnsigned(type.base_type))\n        return \"uint\" + bits;\n      else\n        return \"int\" + bits;\n    }\n    if (IsFloat(type.base_type)) return \"float\" + bits;\n    if (IsString(type)) return \"string\";\n    if (type.base_type == BASE_TYPE_STRUCT) return \"table\";\n    return \"none\";\n  }\n\n  std::string LobsterType(const Type& type) {\n    if (IsFloat(type.base_type)) return \"float\";\n    if (IsBool(type.base_type)) return \"bool\";\n    if (IsScalar(type.base_type) && type.enum_def)\n      return NormalizedName(*type.enum_def);\n    if (!IsScalar(type.base_type)) return \"flatbuffers.offset\";\n    if (IsString(type)) return \"string\";\n    return \"int\";\n  }\n\n  // Returns the method name for use with add/put calls.\n  std::string GenMethod(const Type& type) {\n    return IsScalar(type.base_type)\n               ? ConvertCase(GenTypeBasic(type), Case::kUpperCamel)\n               : (IsStruct(type) ? \"Struct\" : \"UOffsetTRelative\");\n  }\n\n  // This uses Python names for now..\n  std::string GenTypeBasic(const Type& type) {\n    // clang-format off\n    static const char *ctypename[] = {\n      #define FLATBUFFERS_TD(ENUM, IDLTYPE, \\\n              CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, ...) \\\n        #PTYPE,\n        FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)\n      #undef FLATBUFFERS_TD\n    };\n    // clang-format on\n    return ctypename[type.base_type];\n  }\n\n  // Generate a struct field, conditioned on its child type(s).\n  void GenStructAccessor(const StructDef& struct_def, const FieldDef& field,\n                         std::string* code_ptr) {\n    GenComment(field.doc_comment, code_ptr, nullptr, \"    \");\n    std::string& code = *code_ptr;\n    auto offsets = NumToString(field.value.offset);\n    auto def = \"    def \" + NormalizedName(field);\n    if (IsScalar(field.value.type.base_type)) {\n      std::string acc;\n      if (struct_def.fixed) {\n        acc = \"buf_.read_\" + GenTypeName(field.value.type) + \"_le(pos_ + \" +\n              offsets + \")\";\n\n      } else {\n        auto defval = field.IsOptional()\n                          ? (IsFloat(field.value.type.base_type) ? \"0.0\" : \"0\")\n                          : field.value.constant;\n        acc = \"flatbuffers.field_\" + GenTypeName(field.value.type) +\n              \"(buf_, pos_, \" + offsets + \", \" + defval + \")\";\n        if (IsBool(field.value.type.base_type)) acc = \"bool(\" + acc + \")\";\n      }\n      if (field.value.type.enum_def)\n        acc = NormalizedName(*field.value.type.enum_def) + \"(\" + acc + \")\";\n      if (field.IsOptional()) {\n        acc += \", flatbuffers.field_present(buf_, pos_, \" + offsets + \")\";\n        code += def + \"() -> \" + LobsterType(field.value.type) +\n                \", bool:\\n        return \" + acc + \"\\n\";\n      } else {\n        code += def + \"() -> \" + LobsterType(field.value.type) +\n                \":\\n        return \" + acc + \"\\n\";\n      }\n      return;\n    }\n    switch (field.value.type.base_type) {\n      case BASE_TYPE_STRUCT: {\n        auto name = NamespacedName(*field.value.type.struct_def);\n        if (struct_def.fixed) {\n          code += def + \"() -> \" + name + \":\\n        \";\n          code += \"return \" + name + \"{ buf_, pos_ + \" + offsets + \" }\\n\";\n        } else {\n          code += def + \"() -> \" + name;\n          if (!field.IsRequired()) code += \"?\";\n          code += \":\\n        \";\n          code += std::string(\"let o = flatbuffers.field_\") +\n                  (field.value.type.struct_def->fixed ? \"struct\" : \"table\") +\n                  \"(buf_, pos_, \" + offsets + \")\\n        return \";\n          if (field.IsRequired()) {\n            code += name + \" { buf_, assert o }\\n\";\n          } else {\n            code += \"if o: \" + name + \" { buf_, o } else: nil\\n\";\n          }\n        }\n        break;\n      }\n      case BASE_TYPE_STRING:\n        code += def +\n                \"() -> string:\\n        return \"\n                \"flatbuffers.field_string(buf_, pos_, \" +\n                offsets + \")\\n\";\n        break;\n      case BASE_TYPE_VECTOR: {\n        auto vectortype = field.value.type.VectorType();\n        if (vectortype.base_type == BASE_TYPE_STRUCT) {\n          auto start = \"flatbuffers.field_vector(buf_, pos_, \" + offsets +\n                       \") + i * \" + NumToString(InlineSize(vectortype));\n          if (!(vectortype.struct_def->fixed)) {\n            start = \"flatbuffers.indirect(buf_, \" + start + \")\";\n          }\n          code += def + \"(i:int) -> \" +\n                  NamespacedName(*field.value.type.struct_def) +\n                  \":\\n        return \";\n          code += NamespacedName(*field.value.type.struct_def) + \" { buf_, \" +\n                  start + \" }\\n\";\n        } else {\n          if (IsString(vectortype)) {\n            code += def + \"(i:int) -> string:\\n        return \";\n            code += \"flatbuffers.string\";\n          } else {\n            code += def + \"(i:int) -> \" + LobsterType(vectortype) +\n                    \":\\n        return \";\n            code += \"read_\" + GenTypeName(vectortype) + \"_le\";\n          }\n          code += \"(buf_, buf_.flatbuffers.field_vector(pos_, \" + offsets +\n                  \") + i * \" + NumToString(InlineSize(vectortype)) + \")\\n\";\n        }\n        break;\n      }\n      case BASE_TYPE_UNION: {\n        for (auto it = field.value.type.enum_def->Vals().begin();\n             it != field.value.type.enum_def->Vals().end(); ++it) {\n          auto& ev = **it;\n          if (ev.IsNonZero()) {\n            code += def + \"_as_\" + ev.name + \"():\\n        return \" +\n                    NamespacedName(*ev.union_type.struct_def) +\n                    \" { buf_, flatbuffers.field_table(buf_, pos_, \" + offsets +\n                    \") }\\n\";\n          }\n        }\n        break;\n      }\n      default:\n        FLATBUFFERS_ASSERT(0);\n    }\n    if (IsVector(field.value.type)) {\n      code += def +\n              \"_length() -> int:\\n        return \"\n              \"flatbuffers.field_vector_len(buf_, pos_, \" +\n              offsets + \")\\n\";\n    }\n  }\n\n  // Generate table constructors, conditioned on its members' types.\n  void GenTableBuilders(const StructDef& struct_def, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code += \"struct \" + NormalizedName(struct_def) +\n            \"Builder:\\n    b_:flatbuffers.builder\\n\";\n    code += \"    def start():\\n        b_.StartObject(\" +\n            NumToString(struct_def.fields.vec.size()) +\n            \")\\n        return this\\n\";\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (field.deprecated) continue;\n      auto offset = it - struct_def.fields.vec.begin();\n      code += \"    def add_\" + NormalizedName(field) + \"(\" +\n              NormalizedName(field) + \":\" + LobsterType(field.value.type) +\n              \"):\\n        b_.Prepend\" + GenMethod(field.value.type) + \"Slot(\" +\n              NumToString(offset) + \", \" + NormalizedName(field);\n      if (IsScalar(field.value.type.base_type) && !field.IsOptional())\n        code += \", \" + field.value.constant;\n      code += \")\\n        return this\\n\";\n    }\n    code += \"    def end():\\n        return b_.EndObject()\\n\\n\";\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (field.deprecated) continue;\n      if (IsVector(field.value.type)) {\n        code += \"def \" + NormalizedName(struct_def) + \"Start\" +\n                ConvertCase(NormalizedName(field), Case::kUpperCamel) +\n                \"Vector(b_:flatbuffers.builder, n_:int):\\n    b_.StartVector(\";\n        auto vector_type = field.value.type.VectorType();\n        auto alignment = InlineAlignment(vector_type);\n        auto elem_size = InlineSize(vector_type);\n        code +=\n            NumToString(elem_size) + \", n_, \" + NumToString(alignment) + \")\\n\";\n        if (vector_type.base_type != BASE_TYPE_STRUCT ||\n            !vector_type.struct_def->fixed) {\n          code += \"def \" + NormalizedName(struct_def) + \"Create\" +\n                  ConvertCase(NormalizedName(field), Case::kUpperCamel) +\n                  \"Vector(b_:flatbuffers.builder, v_:[\" +\n                  LobsterType(vector_type) + \"]):\\n    b_.StartVector(\" +\n                  NumToString(elem_size) + \", v_.length, \" +\n                  NumToString(alignment) + \")\\n    reverse(v_) e_: b_.Prepend\" +\n                  GenMethod(vector_type) +\n                  \"(e_)\\n    return b_.EndVector(v_.length)\\n\";\n        }\n        code += \"\\n\";\n      }\n    }\n  }\n\n  void GenStructPreDecl(const StructDef& struct_def, std::string* code_ptr) {\n    if (struct_def.generated) return;\n    std::string& code = *code_ptr;\n    CheckNameSpace(struct_def, &code);\n    code += \"class \" + NormalizedName(struct_def) + \"\\n\\n\";\n  }\n\n  // Generate struct or table methods.\n  void GenStruct(const StructDef& struct_def, std::string* code_ptr) {\n    if (struct_def.generated) return;\n    std::string& code = *code_ptr;\n    CheckNameSpace(struct_def, &code);\n    GenComment(struct_def.doc_comment, code_ptr, nullptr, \"\");\n    code += \"class \" + NormalizedName(struct_def) + \" : flatbuffers.handle\\n\";\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (field.deprecated) continue;\n      GenStructAccessor(struct_def, field, code_ptr);\n    }\n    code += \"\\n\";\n    if (!struct_def.fixed) {\n      // Generate a special accessor for the table that has been declared as\n      // the root type.\n      code += \"def GetRootAs\" + NormalizedName(struct_def) +\n              \"(buf:string): return \" + NormalizedName(struct_def) +\n              \" { buf, flatbuffers.indirect(buf, 0) }\\n\\n\";\n    }\n    if (struct_def.fixed) {\n      // create a struct constructor function\n      GenStructBuilder(struct_def, code_ptr);\n    } else {\n      // Create a set of functions that allow table construction.\n      GenTableBuilders(struct_def, code_ptr);\n    }\n  }\n\n  // Generate enum declarations.\n  void GenEnum(const EnumDef& enum_def, std::string* code_ptr) {\n    if (enum_def.generated) return;\n    std::string& code = *code_ptr;\n    CheckNameSpace(enum_def, &code);\n    GenComment(enum_def.doc_comment, code_ptr, nullptr, \"\");\n    code += \"enum \" + NormalizedName(enum_def) + \":\\n\";\n    for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {\n      auto& ev = **it;\n      GenComment(ev.doc_comment, code_ptr, nullptr, \"    \");\n      code += \"    \" + enum_def.name + \"_\" + NormalizedName(ev) + \" = \" +\n              enum_def.ToString(ev) + \"\\n\";\n    }\n    code += \"\\n\";\n  }\n\n  // Recursively generate arguments for a constructor, to deal with nested\n  // structs.\n  void StructBuilderArgs(const StructDef& struct_def, const char* nameprefix,\n                         std::string* code_ptr) {\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (IsStruct(field.value.type)) {\n        // Generate arguments for a struct inside a struct. To ensure names\n        // don't clash, and to make it obvious these arguments are constructing\n        // a nested struct, prefix the name with the field name.\n        StructBuilderArgs(*field.value.type.struct_def,\n                          (nameprefix + (NormalizedName(field) + \"_\")).c_str(),\n                          code_ptr);\n      } else {\n        std::string& code = *code_ptr;\n        code += \", \" + (nameprefix + NormalizedName(field)) + \":\" +\n                LobsterType(field.value.type);\n      }\n    }\n  }\n\n  // Recursively generate struct construction statements and instert manual\n  // padding.\n  void StructBuilderBody(const StructDef& struct_def, const char* nameprefix,\n                         std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code += \"    b_.Prep(\" + NumToString(struct_def.minalign) + \", \" +\n            NumToString(struct_def.bytesize) + \")\\n\";\n    for (auto it = struct_def.fields.vec.rbegin();\n         it != struct_def.fields.vec.rend(); ++it) {\n      auto& field = **it;\n      if (field.padding)\n        code += \"    b_.Pad(\" + NumToString(field.padding) + \")\\n\";\n      if (IsStruct(field.value.type)) {\n        StructBuilderBody(*field.value.type.struct_def,\n                          (nameprefix + (NormalizedName(field) + \"_\")).c_str(),\n                          code_ptr);\n      } else {\n        code += \"    b_.Prepend\" + GenMethod(field.value.type) + \"(\" +\n                nameprefix + NormalizedName(field) + \")\\n\";\n      }\n    }\n  }\n\n  // Create a struct with a builder and the struct's arguments.\n  void GenStructBuilder(const StructDef& struct_def, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code +=\n        \"def Create\" + NormalizedName(struct_def) + \"(b_:flatbuffers.builder\";\n    StructBuilderArgs(struct_def, \"\", code_ptr);\n    code += \"):\\n\";\n    StructBuilderBody(struct_def, \"\", code_ptr);\n    code += \"    return b_.Offset()\\n\\n\";\n  }\n\n  void CheckNameSpace(const Definition& def, std::string* code_ptr) {\n    auto ns = GetNameSpace(def);\n    if (ns == current_namespace_) return;\n    current_namespace_ = ns;\n    std::string& code = *code_ptr;\n    code += \"namespace \" + ns + \"\\n\\n\";\n  }\n\n  bool generate() {\n    std::string code;\n    code += std::string(\"// \") + FlatBuffersGeneratedWarning() +\n            \"\\nimport flatbuffers\\n\\n\";\n    for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end();\n         ++it) {\n      auto& enum_def = **it;\n      GenEnum(enum_def, &code);\n    }\n    for (auto it = parser_.structs_.vec.begin();\n         it != parser_.structs_.vec.end(); ++it) {\n      auto& struct_def = **it;\n      GenStructPreDecl(struct_def, &code);\n    }\n    for (auto it = parser_.structs_.vec.begin();\n         it != parser_.structs_.vec.end(); ++it) {\n      auto& struct_def = **it;\n      GenStruct(struct_def, &code);\n    }\n    return parser_.opts.file_saver->SaveFile(\n        GeneratedFileName(path_, file_name_, parser_.opts).c_str(), code,\n        false);\n  }\n\n private:\n  std::unordered_set<std::string> keywords_;\n  std::string current_namespace_;\n};\n\n}  // namespace lobster\n\nstatic bool GenerateLobster(const Parser& parser, const std::string& path,\n                            const std::string& file_name) {\n  lobster::LobsterGenerator generator(parser, path, file_name);\n  return generator.generate();\n}\n\nnamespace {\n\nclass LobsterCodeGenerator : public CodeGenerator {\n public:\n  Status GenerateCode(const Parser& parser, const std::string& path,\n                      const std::string& filename) override {\n    if (!GenerateLobster(parser, path, filename)) {\n      return Status::ERROR;\n    }\n    return Status::OK;\n  }\n\n  Status GenerateCode(const uint8_t*, int64_t, const CodeGenOptions&) override {\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateMakeRule(const Parser& parser, const std::string& path,\n                          const std::string& filename,\n                          std::string& output) override {\n    (void)parser;\n    (void)path;\n    (void)filename;\n    (void)output;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateGrpcCode(const Parser& parser, const std::string& path,\n                          const std::string& filename) override {\n    (void)parser;\n    (void)path;\n    (void)filename;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateRootFile(const Parser& parser,\n                          const std::string& path) override {\n    (void)parser;\n    (void)path;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  bool IsSchemaOnly() const override { return true; }\n\n  bool SupportsBfbsGeneration() const override { return false; }\n\n  bool SupportsRootFileGeneration() const override { return false; }\n\n  IDLOptions::Language Language() const override {\n    return IDLOptions::kLobster;\n  }\n\n  std::string LanguageName() const override { return \"Lobster\"; }\n};\n}  // namespace\n\nstd::unique_ptr<CodeGenerator> NewLobsterCodeGenerator() {\n  return std::unique_ptr<LobsterCodeGenerator>(new LobsterCodeGenerator());\n}\n\n}  // namespace flatbuffers\n"
  },
  {
    "path": "src/idl_gen_lobster.h",
    "content": "/*\n * Copyright 2023 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_IDL_GEN_LOBSTER_H_\n#define FLATBUFFERS_IDL_GEN_LOBSTER_H_\n\n#include \"flatbuffers/code_generator.h\"\n\nnamespace flatbuffers {\n\n// Constructs a new Lobster code generator.\nstd::unique_ptr<CodeGenerator> NewLobsterCodeGenerator();\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_IDL_GEN_LOBSTER_H_\n"
  },
  {
    "path": "src/idl_gen_php.cpp",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// independent from idl_parser, since this code is not needed for most clients\n\n#include \"idl_gen_php.h\"\n\n#include <string>\n\n#include \"flatbuffers/code_generators.h\"\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/idl.h\"\n#include \"flatbuffers/util.h\"\n\nnamespace flatbuffers {\nnamespace php {\n// Hardcode spaces per indentation.\nconst std::string Indent = \"    \";\nclass PhpGenerator : public BaseGenerator {\n public:\n  PhpGenerator(const Parser& parser, const std::string& path,\n               const std::string& file_name)\n      : BaseGenerator(parser, path, file_name, \"\\\\\", \"\\\\\", \"php\") {}\n  bool generate() {\n    if (!GenerateEnums()) return false;\n    if (!GenerateStructs()) return false;\n    return true;\n  }\n\n private:\n  bool GenerateEnums() {\n    for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end();\n         ++it) {\n      auto& enum_def = **it;\n      std::string enumcode;\n      GenEnum(enum_def, &enumcode);\n      if (!SaveType(enum_def, enumcode, false)) return false;\n    }\n    return true;\n  }\n\n  bool GenerateStructs() {\n    for (auto it = parser_.structs_.vec.begin();\n         it != parser_.structs_.vec.end(); ++it) {\n      auto& struct_def = **it;\n      std::string declcode;\n      GenStruct(struct_def, &declcode);\n      if (!SaveType(struct_def, declcode, true)) return false;\n    }\n    return true;\n  }\n\n  // Begin by declaring namespace and imports.\n  void BeginFile(const std::string& name_space_name, const bool needs_imports,\n                 std::string* code_ptr) {\n    auto& code = *code_ptr;\n    code += \"<?php\\n\";\n    code = code + \"// \" + FlatBuffersGeneratedWarning() + \"\\n\\n\";\n\n    if (!name_space_name.empty()) {\n      code += \"namespace \" + name_space_name + \";\\n\\n\";\n    }\n\n    if (needs_imports) {\n      code += \"use \\\\Google\\\\FlatBuffers\\\\Struct;\\n\";\n      code += \"use \\\\Google\\\\FlatBuffers\\\\Table;\\n\";\n      code += \"use \\\\Google\\\\FlatBuffers\\\\ByteBuffer;\\n\";\n      code += \"use \\\\Google\\\\FlatBuffers\\\\FlatBufferBuilder;\\n\";\n      code += \"\\n\";\n    }\n  }\n\n  // Save out the generated code for a Php Table type.\n  bool SaveType(const Definition& def, const std::string& classcode,\n                bool needs_imports) {\n    if (!classcode.length()) return true;\n\n    std::string code = \"\";\n    BeginFile(FullNamespace(\"\\\\\", *def.defined_namespace), needs_imports,\n              &code);\n    code += classcode;\n\n    std::string filename =\n        NamespaceDir(*def.defined_namespace) + def.name + \".php\";\n    return parser_.opts.file_saver->SaveFile(filename.c_str(), code, false);\n  }\n\n  // Begin a class declaration.\n  static void BeginClass(const StructDef& struct_def, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    if (struct_def.fixed) {\n      code += \"class \" + struct_def.name + \" extends Struct\\n\";\n    } else {\n      code += \"class \" + struct_def.name + \" extends Table\\n\";\n    }\n    code += \"{\\n\";\n  }\n\n  static void EndClass(std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code += \"}\\n\";\n  }\n\n  // Begin enum code with a class declaration.\n  static void BeginEnum(const std::string& class_name, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code += \"class \" + class_name + \"\\n{\\n\";\n  }\n\n  // A single enum member.\n  static void EnumMember(const EnumDef& enum_def, const EnumVal& ev,\n                         std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code += Indent + \"const \";\n    code += ev.name;\n    code += \" = \";\n    code += enum_def.ToString(ev) + \";\\n\";\n  }\n\n  // End enum code.\n  static void EndEnum(std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code += \"}\\n\";\n  }\n\n  // Initialize a new struct or table from existing data.\n  static void NewRootTypeFromBuffer(const StructDef& struct_def,\n                                    std::string* code_ptr) {\n    std::string& code = *code_ptr;\n\n    code += Indent + \"/**\\n\";\n    code += Indent + \" * @param ByteBuffer $bb\\n\";\n    code += Indent + \" * @return \" + struct_def.name + \"\\n\";\n    code += Indent + \" */\\n\";\n    code += Indent + \"public static function getRootAs\";\n    code += struct_def.name;\n    code += \"(ByteBuffer $bb)\\n\";\n    code += Indent + \"{\\n\";\n\n    code += Indent + Indent + \"$obj = new \" + struct_def.name + \"();\\n\";\n    code += Indent + Indent;\n    code += \"return ($obj->init($bb->getInt($bb->getPosition())\";\n    code += \" + $bb->getPosition(), $bb));\\n\";\n    code += Indent + \"}\\n\\n\";\n  }\n\n  // Initialize an existing object with other data, to avoid an allocation.\n  static void InitializeExisting(const StructDef& struct_def,\n                                 std::string* code_ptr) {\n    std::string& code = *code_ptr;\n\n    code += Indent + \"/**\\n\";\n    code += Indent + \" * @param int $_i offset\\n\";\n    code += Indent + \" * @param ByteBuffer $_bb\\n\";\n    code += Indent + \" * @return \" + struct_def.name + \"\\n\";\n    code += Indent + \" **/\\n\";\n    code += Indent + \"public function init($_i, ByteBuffer $_bb)\\n\";\n    code += Indent + \"{\\n\";\n    code += Indent + Indent + \"$this->bb_pos = $_i;\\n\";\n    code += Indent + Indent + \"$this->bb = $_bb;\\n\";\n    code += Indent + Indent + \"return $this;\\n\";\n    code += Indent + \"}\\n\\n\";\n  }\n\n  // Get the length of a vector.\n  static void GetVectorLen(const FieldDef& field, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n\n    code += Indent + \"/**\\n\";\n    code += Indent + \" * @return int\\n\";\n    code += Indent + \" */\\n\";\n    code += Indent + \"public function get\";\n    code += ConvertCase(field.name, Case::kUpperCamel) + \"Length()\\n\";\n    code += Indent + \"{\\n\";\n    code += Indent + Indent + \"$o = $this->__offset(\";\n    code += NumToString(field.value.offset) + \");\\n\";\n    code += Indent + Indent;\n    code += \"return $o != 0 ? $this->__vector_len($o) : 0;\\n\";\n    code += Indent + \"}\\n\\n\";\n  }\n\n  // Get a [ubyte] vector as a byte array.\n  static void GetUByte(const FieldDef& field, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n\n    code += Indent + \"/**\\n\";\n    code += Indent + \" * @return string\\n\";\n    code += Indent + \" */\\n\";\n    code += Indent + \"public function get\";\n    code += ConvertCase(field.name, Case::kUpperCamel) + \"Bytes()\\n\";\n    code += Indent + \"{\\n\";\n    code += Indent + Indent + \"return $this->__vector_as_bytes(\";\n    code += NumToString(field.value.offset) + \");\\n\";\n    code += Indent + \"}\\n\\n\";\n  }\n\n  // Get the value of a struct's scalar.\n  static void GetScalarFieldOfStruct(const FieldDef& field,\n                                     std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    std::string getter = GenGetter(field.value.type);\n\n    code += Indent + \"/**\\n\";\n    code += Indent + \" * @return \";\n    code += GenTypeGet(field.value.type) + \"\\n\";\n    code += Indent + \" */\\n\";\n    code += Indent + \"public function \" + getter;\n    code += ConvertCase(field.name, Case::kUpperCamel) + \"()\\n\";\n    code += Indent + \"{\\n\";\n    code += Indent + Indent + \"return \";\n\n    code += \"$this->bb->get\";\n    code += ConvertCase(GenTypeGet(field.value.type), Case::kUpperCamel);\n    code += \"($this->bb_pos + \";\n    code += NumToString(field.value.offset) + \")\";\n    code += \";\\n\";\n\n    code += Indent + \"}\\n\\n\";\n  }\n\n  // Get the value of a table's scalar.\n  void GetScalarFieldOfTable(const FieldDef& field, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n\n    code += Indent + \"/**\\n\";\n    code += Indent + \" * @return \" + GenTypeGet(field.value.type) + \"\\n\";\n    code += Indent + \" */\\n\";\n    code += Indent + \"public function get\";\n    code += ConvertCase(field.name, Case::kUpperCamel);\n    code += \"()\\n\";\n    code += Indent + \"{\\n\";\n    code += Indent + Indent + \"$o = $this->__offset(\" +\n            NumToString(field.value.offset) + \");\\n\" + Indent + Indent +\n            \"return $o != 0 ? \";\n    code += \"$this->bb->get\";\n    code += ConvertCase(GenTypeGet(field.value.type), Case::kUpperCamel) +\n            \"($o + $this->bb_pos)\";\n    code += \" : \" + GenDefaultValue(field.value) + \";\\n\";\n    code += Indent + \"}\\n\\n\";\n  }\n\n  // Get a struct by initializing an existing struct.\n  // Specific to Struct.\n  void GetStructFieldOfStruct(const FieldDef& field, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n\n    code += Indent + \"/**\\n\";\n    code += Indent + \" * @return \" + GenTypeGet(field.value.type) + \"\\n\";\n    code += Indent + \" */\\n\";\n    code += Indent + \"public function get\";\n    code += ConvertCase(field.name, Case::kUpperCamel) + \"()\\n\";\n    code += Indent + \"{\\n\";\n    code += Indent + Indent + \"$obj = new \";\n    code += GenTypeGet(field.value.type) + \"();\\n\";\n    code += Indent + Indent + \"$obj->init($this->bb_pos + \";\n    code += NumToString(field.value.offset) + \", $this->bb);\";\n    code += \"\\n\" + Indent + Indent + \"return $obj;\\n\";\n    code += Indent + \"}\\n\\n\";\n  }\n\n  // Get a struct by initializing an existing struct.\n  // Specific to Table.\n  void GetStructFieldOfTable(const FieldDef& field, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n\n    code += Indent + \"public function get\";\n    code += ConvertCase(field.name, Case::kUpperCamel);\n    code += \"()\\n\";\n    code += Indent + \"{\\n\";\n    code += Indent + Indent + \"$obj = new \";\n    code +=\n        ConvertCase(GenTypeGet(field.value.type), Case::kUpperCamel) + \"();\\n\";\n    code += Indent + Indent + \"$o = $this->__offset(\" +\n            NumToString(field.value.offset) + \");\\n\";\n    code += Indent + Indent;\n    code += \"return $o != 0 ? $obj->init(\";\n    if (field.value.type.struct_def->fixed) {\n      code += \"$o + $this->bb_pos, $this->bb) : \";\n    } else {\n      code += \"$this->__indirect($o + $this->bb_pos), $this->bb) : \";\n    }\n    code += GenDefaultValue(field.value) + \";\\n\";\n    code += Indent + \"}\\n\\n\";\n  }\n\n  // Get the value of a string.\n  void GetStringField(const FieldDef& field, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code += Indent + \"public function get\";\n    code += ConvertCase(field.name, Case::kUpperCamel);\n    code += \"()\\n\";\n    code += Indent + \"{\\n\";\n    code += Indent + Indent + \"$o = $this->__offset(\" +\n            NumToString(field.value.offset) + \");\\n\";\n    code += Indent + Indent;\n    code += \"return $o != 0 ? $this->__string($o + $this->bb_pos) : \";\n    code += GenDefaultValue(field.value) + \";\\n\";\n    code += Indent + \"}\\n\\n\";\n  }\n\n  // Get the value of a union from an object.\n  void GetUnionField(const FieldDef& field, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n\n    code += Indent + \"/**\\n\";\n    code += Indent + \" * @return\" + GenTypeBasic(field.value.type) + \"\\n\";\n    code += Indent + \" */\\n\";\n    code += Indent + \"public function get\";\n    code += ConvertCase(field.name, Case::kUpperCamel) + \"($obj)\\n\";\n    code += Indent + \"{\\n\";\n    code += Indent + Indent + \"$o = $this->__offset(\" +\n            NumToString(field.value.offset) + \");\\n\";\n    code += Indent + Indent;\n    code += \"return $o != 0 ? $this->__union($obj, $o) : null;\\n\";\n    code += Indent + \"}\\n\\n\";\n  }\n\n  // Get the value of a vector's struct member.\n  void GetMemberOfVectorOfStruct(const StructDef& struct_def,\n                                 const FieldDef& field, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    auto vectortype = field.value.type.VectorType();\n\n    code += Indent + \"/**\\n\";\n    code += Indent + \" * @return\" + GenTypeBasic(field.value.type) + \"\\n\";\n    code += Indent + \" */\\n\";\n    code += Indent + \"public function get\";\n    code += ConvertCase(field.name, Case::kUpperCamel);\n    code += \"($j)\\n\";\n    code += Indent + \"{\\n\";\n    code += Indent + Indent + \"$o = $this->__offset(\" +\n            NumToString(field.value.offset) + \");\\n\";\n    code += Indent + Indent + \"$obj = new \";\n    code +=\n        ConvertCase(GenTypeGet(field.value.type), Case::kUpperCamel) + \"();\\n\";\n\n    switch (field.value.type.base_type) {\n      case BASE_TYPE_STRUCT:\n        if (struct_def.fixed) {\n          code += Indent + Indent;\n          code += \"return $o != 0 ? $obj->init($this->bb_pos +\" +\n                  NumToString(field.value.offset) + \", $this->bb) : null;\\n\";\n        } else {\n          code += Indent + Indent + \"return $o != 0 ? $obj->init(\";\n          code += field.value.type.struct_def->fixed\n                      ? \"$o + $this->bb_pos\"\n                      : \"$this->__indirect($o + $this->bb_pos)\";\n          code += \", $this->bb) : null;\\n\";\n        }\n        break;\n      case BASE_TYPE_STRING:\n        code += \"// base_type_string\\n\";\n        // TODO(chobie): do we need this?\n        break;\n      case BASE_TYPE_VECTOR:\n        if (vectortype.base_type == BASE_TYPE_STRUCT) {\n          code += Indent + Indent + \"return $o != 0 ? $obj->init(\";\n          if (vectortype.struct_def->fixed) {\n            code += \"$this->__vector($o) + $j *\";\n            code += NumToString(InlineSize(vectortype));\n          } else {\n            code += \"$this->__indirect($this->__vector($o) + $j * \";\n            code += NumToString(InlineSize(vectortype)) + \")\";\n          }\n          code += \", $this->bb) : null;\\n\";\n        }\n        break;\n      case BASE_TYPE_UNION:\n        code += Indent + Indent + \"return $o != 0 ? $this->\";\n        code += GenGetter(field.value.type) + \"($obj, $o); null;\\n\";\n        break;\n      default:\n        break;\n    }\n\n    code += Indent + \"}\\n\\n\";\n  }\n\n  // Get the value of a vector's non-struct member. Uses a named return\n  // argument to conveniently set the zero value for the result.\n  void GetMemberOfVectorOfNonStruct(const FieldDef& field,\n                                    std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    auto vectortype = field.value.type.VectorType();\n\n    code += Indent + \"/**\\n\";\n    code += Indent + \" * @param int offset\\n\";\n    code += Indent + \" * @return \" + GenTypeGet(field.value.type) + \"\\n\";\n    code += Indent + \" */\\n\";\n    code += Indent + \"public function get\";\n    code += ConvertCase(field.name, Case::kUpperCamel);\n    code += \"($j)\\n\";\n    code += Indent + \"{\\n\";\n    code += Indent + Indent + \"$o = $this->__offset(\" +\n            NumToString(field.value.offset) + \");\\n\";\n\n    if (IsString(field.value.type.VectorType())) {\n      code += Indent + Indent;\n      code += \"return $o != 0 ? $this->__string($this->__vector($o) + $j * \";\n      code += NumToString(InlineSize(vectortype)) + \") : \";\n      code += GenDefaultValue(field.value) + \";\\n\";\n    } else {\n      code += Indent + Indent + \"return $o != 0 ? $this->bb->get\";\n      code += ConvertCase(GenTypeGet(field.value.type), Case::kUpperCamel);\n      code += \"($this->__vector($o) + $j * \";\n      code += NumToString(InlineSize(vectortype)) + \") : \";\n      code += GenDefaultValue(field.value) + \";\\n\";\n    }\n    code += Indent + \"}\\n\\n\";\n  }\n\n  // Get the value of a vector's union member. Uses a named return\n  // argument to conveniently set the zero value for the result.\n  void GetMemberOfVectorOfUnion(const FieldDef& field, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    auto vectortype = field.value.type.VectorType();\n\n    code += Indent + \"/**\\n\";\n    code += Indent + \" * @param int offset\\n\";\n    code += Indent + \" * @return \" + GenTypeGet(field.value.type) + \"\\n\";\n    code += Indent + \" */\\n\";\n    code += Indent + \"public function get\";\n    code += ConvertCase(field.name, Case::kUpperCamel);\n    code += \"($j, $obj)\\n\";\n    code += Indent + \"{\\n\";\n    code += Indent + Indent + \"$o = $this->__offset(\" +\n            NumToString(field.value.offset) + \");\\n\";\n    code += Indent + Indent + \"return $o != 0 ? \";\n    code += \"$this->__union($obj, $this->__vector($o) + $j * \";\n    code += NumToString(InlineSize(vectortype)) + \" - $this->bb_pos) : null;\\n\";\n    code += Indent + \"}\\n\\n\";\n  }\n\n  // Recursively generate arguments for a constructor, to deal with nested\n  // structs.\n  static void StructBuilderArgs(const StructDef& struct_def,\n                                const char* nameprefix, std::string* code_ptr) {\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (IsStruct(field.value.type)) {\n        // Generate arguments for a struct inside a struct. To ensure names\n        // don't clash, and to make it obvious\n        // these arguments are constructing\n        // a nested struct, prefix the name with the field name.\n        StructBuilderArgs(*field.value.type.struct_def,\n                          (nameprefix + (field.name + \"_\")).c_str(), code_ptr);\n      } else {\n        std::string& code = *code_ptr;\n        code += std::string(\", $\") + nameprefix;\n        code += ConvertCase(field.name, Case::kLowerCamel);\n      }\n    }\n  }\n\n  // Recursively generate struct construction statements and instert manual\n  // padding.\n  static void StructBuilderBody(const StructDef& struct_def,\n                                const char* nameprefix, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code += Indent + Indent + \"$builder->prep(\";\n    code += NumToString(struct_def.minalign) + \", \";\n    code += NumToString(struct_def.bytesize) + \");\\n\";\n    for (auto it = struct_def.fields.vec.rbegin();\n         it != struct_def.fields.vec.rend(); ++it) {\n      auto& field = **it;\n      if (field.padding) {\n        code += Indent + Indent + \"$builder->pad(\";\n        code += NumToString(field.padding) + \");\\n\";\n      }\n      if (IsStruct(field.value.type)) {\n        StructBuilderBody(*field.value.type.struct_def,\n                          (nameprefix + (field.name + \"_\")).c_str(), code_ptr);\n      } else {\n        code += Indent + Indent + \"$builder->put\" + GenMethod(field) + \"($\";\n        code +=\n            nameprefix + ConvertCase(field.name, Case::kLowerCamel) + \");\\n\";\n      }\n    }\n  }\n\n  // Get the value of a table's starting offset.\n  static void GetStartOfTable(const StructDef& struct_def,\n                              std::string* code_ptr) {\n    std::string& code = *code_ptr;\n\n    code += Indent + \"/**\\n\";\n    code += Indent + \" * @param FlatBufferBuilder $builder\\n\";\n    code += Indent + \" * @return void\\n\";\n    code += Indent + \" */\\n\";\n    code += Indent + \"public static function start\" + struct_def.name;\n    code += \"(FlatBufferBuilder $builder)\\n\";\n    code += Indent + \"{\\n\";\n    code += Indent + Indent + \"$builder->StartObject(\";\n    code += NumToString(struct_def.fields.vec.size());\n    code += \");\\n\";\n    code += Indent + \"}\\n\\n\";\n\n    code += Indent + \"/**\\n\";\n    code += Indent + \" * @param FlatBufferBuilder $builder\\n\";\n    code += Indent + \" * @return \" + struct_def.name + \"\\n\";\n    code += Indent + \" */\\n\";\n    code += Indent + \"public static function create\" + struct_def.name;\n    code += \"(FlatBufferBuilder $builder, \";\n\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n\n      if (field.deprecated) continue;\n      if (it != struct_def.fields.vec.begin()) {\n        code += \", \";\n      }\n      code += \"$\" + field.name;\n    }\n    code += \")\\n\";\n    code += Indent + \"{\\n\";\n    code += Indent + Indent + \"$builder->startObject(\";\n    code += NumToString(struct_def.fields.vec.size());\n    code += \");\\n\";\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (field.deprecated) continue;\n\n      code += Indent + Indent + \"self::add\";\n      code += ConvertCase(field.name, Case::kUpperCamel) + \"($builder, $\" +\n              field.name + \");\\n\";\n    }\n\n    code += Indent + Indent + \"$o = $builder->endObject();\\n\";\n\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (!field.deprecated && field.IsRequired()) {\n        code += Indent + Indent + \"$builder->required($o, \";\n        code += NumToString(field.value.offset);\n        code += \");  // \" + field.name + \"\\n\";\n      }\n    }\n    code += Indent + Indent + \"return $o;\\n\";\n    code += Indent + \"}\\n\\n\";\n  }\n\n  // Set the value of a table's field.\n  static void BuildFieldOfTable(const FieldDef& field, const size_t offset,\n                                std::string* code_ptr) {\n    std::string& code = *code_ptr;\n\n    code += Indent + \"/**\\n\";\n    code += Indent + \" * @param FlatBufferBuilder $builder\\n\";\n    code += Indent + \" * @param \" + GenTypeBasic(field.value.type) + \"\\n\";\n    code += Indent + \" * @return void\\n\";\n    code += Indent + \" */\\n\";\n    code += Indent + \"public static function \";\n    code += \"add\" + ConvertCase(field.name, Case::kUpperCamel);\n    code += \"(FlatBufferBuilder $builder, \";\n    code += \"$\" + ConvertCase(field.name, Case::kLowerCamel);\n    code += \")\\n\";\n    code += Indent + \"{\\n\";\n    code += Indent + Indent + \"$builder->add\";\n    code += GenMethod(field) + \"X(\";\n    code += NumToString(offset) + \", \";\n\n    code += \"$\" + ConvertCase(field.name, Case::kLowerCamel);\n    code += \", \";\n\n    if (field.value.type.base_type == BASE_TYPE_BOOL) {\n      code += \"false\";\n    } else {\n      code += field.value.constant;\n    }\n    code += \");\\n\";\n    code += Indent + \"}\\n\\n\";\n  }\n\n  // Set the value of one of the members of a table's vector.\n  static void BuildVectorOfTable(const FieldDef& field, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n\n    auto vector_type = field.value.type.VectorType();\n    auto alignment = InlineAlignment(vector_type);\n    auto elem_size = InlineSize(vector_type);\n    code += Indent + \"/**\\n\";\n    code += Indent + \" * @param FlatBufferBuilder $builder\\n\";\n    code += Indent + \" * @param array offset array\\n\";\n    code += Indent + \" * @return int vector offset\\n\";\n    code += Indent + \" */\\n\";\n    code += Indent + \"public static function create\";\n    code += ConvertCase(field.name, Case::kUpperCamel);\n    code += \"Vector(FlatBufferBuilder $builder, array $data)\\n\";\n    code += Indent + \"{\\n\";\n    code += Indent + Indent + \"$builder->startVector(\";\n    code += NumToString(elem_size);\n    code += \", count($data), \" + NumToString(alignment);\n    code += \");\\n\";\n    code += Indent + Indent;\n    code += \"for ($i = count($data) - 1; $i >= 0; $i--) {\\n\";\n    if (IsScalar(field.value.type.VectorType().base_type)) {\n      code += Indent + Indent + Indent;\n      code += \"$builder->put\";\n      code += ConvertCase(GenTypeBasic(field.value.type.VectorType()),\n                          Case::kUpperCamel);\n      code += \"($data[$i]);\\n\";\n    } else {\n      code += Indent + Indent + Indent;\n      code += \"$builder->putOffset($data[$i]);\\n\";\n    }\n    code += Indent + Indent + \"}\\n\";\n    code += Indent + Indent + \"return $builder->endVector();\\n\";\n    code += Indent + \"}\\n\\n\";\n\n    code += Indent + \"/**\\n\";\n    code += Indent + \" * @param FlatBufferBuilder $builder\\n\";\n    code += Indent + \" * @param int $numElems\\n\";\n    code += Indent + \" * @return void\\n\";\n    code += Indent + \" */\\n\";\n    code += Indent + \"public static function start\";\n    code += ConvertCase(field.name, Case::kUpperCamel);\n    code += \"Vector(FlatBufferBuilder $builder, $numElems)\\n\";\n    code += Indent + \"{\\n\";\n    code += Indent + Indent + \"$builder->startVector(\";\n    code += NumToString(elem_size);\n    code += \", $numElems, \" + NumToString(alignment);\n    code += \");\\n\";\n    code += Indent + \"}\\n\\n\";\n  }\n\n  // Get the offset of the end of a table.\n  void GetEndOffsetOnTable(const StructDef& struct_def, std::string* code_ptr) {\n    std::string& code = *code_ptr;\n\n    code += Indent + \"/**\\n\";\n    code += Indent + \" * @param FlatBufferBuilder $builder\\n\";\n    code += Indent + \" * @return int table offset\\n\";\n    code += Indent + \" */\\n\";\n    code += Indent + \"public static function end\" + struct_def.name;\n    code += \"(FlatBufferBuilder $builder)\\n\";\n    code += Indent + \"{\\n\";\n    code += Indent + Indent + \"$o = $builder->endObject();\\n\";\n\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (!field.deprecated && field.IsRequired()) {\n        code += Indent + Indent + \"$builder->required($o, \";\n        code += NumToString(field.value.offset);\n        code += \");  // \" + field.name + \"\\n\";\n      }\n    }\n    code += Indent + Indent + \"return $o;\\n\";\n    code += Indent + \"}\\n\";\n\n    if (parser_.root_struct_def_ == &struct_def) {\n      code += \"\\n\";\n      code += Indent + \"public static function finish\";\n      code += struct_def.name;\n      code += \"Buffer(FlatBufferBuilder $builder, $offset)\\n\";\n      code += Indent + \"{\\n\";\n      code += Indent + Indent + \"$builder->finish($offset\";\n\n      if (parser_.file_identifier_.length())\n        code += \", \\\"\" + parser_.file_identifier_ + \"\\\"\";\n      code += \");\\n\";\n      code += Indent + \"}\\n\";\n    }\n  }\n\n  // Generate a struct field, conditioned on its child type(s).\n  void GenStructAccessor(const StructDef& struct_def, const FieldDef& field,\n                         std::string* code_ptr) {\n    GenComment(field.doc_comment, code_ptr, nullptr, Indent.c_str());\n\n    if (IsScalar(field.value.type.base_type)) {\n      if (struct_def.fixed) {\n        GetScalarFieldOfStruct(field, code_ptr);\n      } else {\n        GetScalarFieldOfTable(field, code_ptr);\n      }\n    } else {\n      switch (field.value.type.base_type) {\n        case BASE_TYPE_STRUCT:\n          if (struct_def.fixed) {\n            GetStructFieldOfStruct(field, code_ptr);\n          } else {\n            GetStructFieldOfTable(field, code_ptr);\n          }\n          break;\n        case BASE_TYPE_STRING:\n          GetStringField(field, code_ptr);\n          break;\n        case BASE_TYPE_VECTOR: {\n          auto vectortype = field.value.type.VectorType();\n          if (vectortype.base_type == BASE_TYPE_UNION) {\n            GetMemberOfVectorOfUnion(field, code_ptr);\n          } else if (vectortype.base_type == BASE_TYPE_STRUCT) {\n            GetMemberOfVectorOfStruct(struct_def, field, code_ptr);\n          } else {\n            GetMemberOfVectorOfNonStruct(field, code_ptr);\n          }\n          break;\n        }\n        case BASE_TYPE_UNION:\n          GetUnionField(field, code_ptr);\n          break;\n        default:\n          FLATBUFFERS_ASSERT(0);\n      }\n    }\n    if (IsVector(field.value.type)) {\n      GetVectorLen(field, code_ptr);\n      if (field.value.type.element == BASE_TYPE_UCHAR) {\n        GetUByte(field, code_ptr);\n      }\n    }\n  }\n\n  // Generate table constructors, conditioned on its members' types.\n  void GenTableBuilders(const StructDef& struct_def, std::string* code_ptr) {\n    GetStartOfTable(struct_def, code_ptr);\n\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (field.deprecated) continue;\n\n      auto offset = it - struct_def.fields.vec.begin();\n      if (field.value.type.base_type == BASE_TYPE_UNION) {\n        std::string& code = *code_ptr;\n        code += Indent + \"public static function add\";\n        code += ConvertCase(field.name, Case::kUpperCamel);\n        code += \"(FlatBufferBuilder $builder, $offset)\\n\";\n        code += Indent + \"{\\n\";\n        code += Indent + Indent + \"$builder->addOffsetX(\";\n        code += NumToString(offset) + \", $offset, 0);\\n\";\n        code += Indent + \"}\\n\\n\";\n      } else {\n        BuildFieldOfTable(field, offset, code_ptr);\n      }\n      if (IsVector(field.value.type)) {\n        BuildVectorOfTable(field, code_ptr);\n      }\n    }\n\n    GetEndOffsetOnTable(struct_def, code_ptr);\n  }\n\n  // Generate struct or table methods.\n  void GenStruct(const StructDef& struct_def, std::string* code_ptr) {\n    if (struct_def.generated) return;\n\n    GenComment(struct_def.doc_comment, code_ptr, nullptr);\n    BeginClass(struct_def, code_ptr);\n\n    if (!struct_def.fixed) {\n      // Generate a special accessor for the table that has been declared as\n      // the root type.\n      NewRootTypeFromBuffer(struct_def, code_ptr);\n    }\n\n    std::string& code = *code_ptr;\n    if (!struct_def.fixed) {\n      if (parser_.file_identifier_.length()) {\n        // Return the identifier\n        code += Indent + \"public static function \" + struct_def.name;\n        code += \"Identifier()\\n\";\n        code += Indent + \"{\\n\";\n        code += Indent + Indent + \"return \\\"\";\n        code += parser_.file_identifier_ + \"\\\";\\n\";\n        code += Indent + \"}\\n\\n\";\n\n        // Check if a buffer has the identifier.\n        code += Indent + \"public static function \" + struct_def.name;\n        code += \"BufferHasIdentifier(ByteBuffer $buf)\\n\";\n        code += Indent + \"{\\n\";\n        code += Indent + Indent + \"return self::\";\n        code += \"__has_identifier($buf, self::\";\n        code += struct_def.name + \"Identifier());\\n\";\n        code += Indent + \"}\\n\\n\";\n      }\n\n      if (parser_.file_extension_.length()) {\n        // Return the extension\n        code += Indent + \"public static function \" + struct_def.name;\n        code += \"Extension()\\n\";\n        code += Indent + \"{\\n\";\n        code += Indent + Indent + \"return \\\"\" + parser_.file_extension_;\n        code += \"\\\";\\n\";\n        code += Indent + \"}\\n\\n\";\n      }\n    }\n\n    // Generate the Init method that sets the field in a pre-existing\n    // accessor object. This is to allow object reuse.\n    InitializeExisting(struct_def, code_ptr);\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (field.deprecated) continue;\n\n      GenStructAccessor(struct_def, field, code_ptr);\n    }\n\n    if (struct_def.fixed) {\n      // create a struct constructor function\n      GenStructBuilder(struct_def, code_ptr);\n    } else {\n      // Create a set of functions that allow table construction.\n      GenTableBuilders(struct_def, code_ptr);\n    }\n    EndClass(code_ptr);\n  }\n\n  // Generate enum declarations.\n  static void GenEnum(const EnumDef& enum_def, std::string* code_ptr) {\n    if (enum_def.generated) return;\n\n    GenComment(enum_def.doc_comment, code_ptr, nullptr);\n    BeginEnum(enum_def.name, code_ptr);\n    for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {\n      auto& ev = **it;\n      GenComment(ev.doc_comment, code_ptr, nullptr, Indent.c_str());\n      EnumMember(enum_def, ev, code_ptr);\n    }\n\n    std::string& code = *code_ptr;\n    code += \"\\n\";\n    code += Indent + \"private static $names = array(\\n\";\n    for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {\n      auto& ev = **it;\n      code += Indent + Indent + enum_def.name + \"::\" + ev.name + \"=>\" + \"\\\"\" +\n              ev.name + \"\\\",\\n\";\n    }\n\n    code += Indent + \");\\n\\n\";\n    code += Indent + \"public static function Name($e)\\n\";\n    code += Indent + \"{\\n\";\n    code += Indent + Indent + \"if (!isset(self::$names[$e])) {\\n\";\n    code += Indent + Indent + Indent + \"throw new \\\\Exception();\\n\";\n    code += Indent + Indent + \"}\\n\";\n    code += Indent + Indent + \"return self::$names[$e];\\n\";\n    code += Indent + \"}\\n\";\n    EndEnum(code_ptr);\n  }\n\n  // Returns the function name that is able to read a value of the given type.\n  static std::string GenGetter(const Type& type) {\n    switch (type.base_type) {\n      case BASE_TYPE_STRING:\n        return \"__string\";\n      case BASE_TYPE_STRUCT:\n        return \"__struct\";\n      case BASE_TYPE_UNION:\n        return \"__union\";\n      case BASE_TYPE_VECTOR:\n        return GenGetter(type.VectorType());\n      default:\n        return \"Get\";\n    }\n  }\n\n  // Returns the method name for use with add/put calls.\n  static std::string GenMethod(const FieldDef& field) {\n    return IsScalar(field.value.type.base_type)\n               ? ConvertCase(GenTypeBasic(field.value.type), Case::kUpperCamel)\n               : (IsStruct(field.value.type) ? \"Struct\" : \"Offset\");\n  }\n\n  static std::string GenTypeBasic(const Type& type) {\n    // clang-format off\n    static const char *ctypename[] = {\n      #define FLATBUFFERS_TD(ENUM, IDLTYPE, \\\n              CTYPE, JTYPE, GTYPE, NTYPE, ...) \\\n        #NTYPE,\n        FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)\n      #undef FLATBUFFERS_TD\n    };\n    // clang-format on\n    return ctypename[type.base_type];\n  }\n\n  std::string GenDefaultValue(const Value& value) {\n    if (value.type.enum_def) {\n      if (auto val = value.type.enum_def->FindByValue(value.constant)) {\n        return WrapInNameSpace(*value.type.enum_def) + \"::\" + val->name;\n      }\n    }\n\n    switch (value.type.base_type) {\n      case BASE_TYPE_BOOL:\n        return value.constant == \"0\" ? \"false\" : \"true\";\n\n      case BASE_TYPE_STRING:\n        return \"null\";\n\n      case BASE_TYPE_LONG:\n      case BASE_TYPE_ULONG:\n        if (value.constant != \"0\") {\n          int64_t constant = StringToInt(value.constant.c_str());\n          return NumToString(constant);\n        }\n        return \"0\";\n\n      default:\n        return value.constant;\n    }\n  }\n\n  static std::string GenTypePointer(const Type& type) {\n    switch (type.base_type) {\n      case BASE_TYPE_STRING:\n        return \"string\";\n      case BASE_TYPE_VECTOR:\n        return GenTypeGet(type.VectorType());\n      case BASE_TYPE_STRUCT:\n        return type.struct_def->name;\n      case BASE_TYPE_UNION:\n        // fall through\n      default:\n        return \"Table\";\n    }\n  }\n\n  static std::string GenTypeGet(const Type& type) {\n    return IsScalar(type.base_type) ? GenTypeBasic(type) : GenTypePointer(type);\n  }\n\n  // Create a struct with a builder and the struct's arguments.\n  static void GenStructBuilder(const StructDef& struct_def,\n                               std::string* code_ptr) {\n    std::string& code = *code_ptr;\n    code += \"\\n\";\n    code += Indent + \"/**\\n\";\n    code += Indent + \" * @return int offset\\n\";\n    code += Indent + \" */\\n\";\n    code += Indent + \"public static function create\" + struct_def.name;\n    code += \"(FlatBufferBuilder $builder\";\n    StructBuilderArgs(struct_def, \"\", code_ptr);\n    code += \")\\n\";\n    code += Indent + \"{\\n\";\n\n    StructBuilderBody(struct_def, \"\", code_ptr);\n\n    code += Indent + Indent + \"return $builder->offset();\\n\";\n    code += Indent + \"}\\n\";\n  }\n};\n}  // namespace php\n\nstatic bool GeneratePhp(const Parser& parser, const std::string& path,\n                        const std::string& file_name) {\n  php::PhpGenerator generator(parser, path, file_name);\n  return generator.generate();\n}\n\nnamespace {\n\nclass PhpCodeGenerator : public CodeGenerator {\n public:\n  Status GenerateCode(const Parser& parser, const std::string& path,\n                      const std::string& filename) override {\n    if (!GeneratePhp(parser, path, filename)) {\n      return Status::ERROR;\n    }\n    return Status::OK;\n  }\n\n  Status GenerateCode(const uint8_t*, int64_t, const CodeGenOptions&) override {\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateMakeRule(const Parser& parser, const std::string& path,\n                          const std::string& filename,\n                          std::string& output) override {\n    (void)parser;\n    (void)path;\n    (void)filename;\n    (void)output;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateGrpcCode(const Parser& parser, const std::string& path,\n                          const std::string& filename) override {\n    (void)parser;\n    (void)path;\n    (void)filename;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateRootFile(const Parser& parser,\n                          const std::string& path) override {\n    (void)parser;\n    (void)path;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  bool IsSchemaOnly() const override { return true; }\n\n  bool SupportsBfbsGeneration() const override { return false; }\n\n  bool SupportsRootFileGeneration() const override { return false; }\n\n  IDLOptions::Language Language() const override { return IDLOptions::kPhp; }\n\n  std::string LanguageName() const override { return \"Php\"; }\n};\n}  // namespace\n\nstd::unique_ptr<CodeGenerator> NewPhpCodeGenerator() {\n  return std::unique_ptr<PhpCodeGenerator>(new PhpCodeGenerator());\n}\n\n}  // namespace flatbuffers\n"
  },
  {
    "path": "src/idl_gen_php.h",
    "content": "/*\n * Copyright 2023 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_IDL_GEN_PHP_H_\n#define FLATBUFFERS_IDL_GEN_PHP_H_\n\n#include \"flatbuffers/code_generator.h\"\n\nnamespace flatbuffers {\n\n// Constructs a new Php code generator.\nstd::unique_ptr<CodeGenerator> NewPhpCodeGenerator();\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_IDL_GEN_PHP_H_\n"
  },
  {
    "path": "src/idl_gen_python.cpp",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// independent from idl_parser, since this code is not needed for most clients\n\n#include \"idl_gen_python.h\"\n\n#include <algorithm>\n#include <cstddef>\n#include <cstdint>\n#include <cstdio>\n#include <map>\n#include <set>\n#include <sstream>\n#include <string>\n#include <utility>\n#include <vector>\n\n#include \"codegen/idl_namer.h\"\n#include \"codegen/python.h\"\n#include \"flatbuffers/code_generators.h\"\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/idl.h\"\n#include \"flatbuffers/util.h\"\n\nnamespace flatbuffers {\nnamespace python {\n\nnamespace {\n\ntypedef std::pair<std::string, std::string> ImportMapEntry;\ntypedef std::set<ImportMapEntry> ImportMap;\n\n// Hardcode spaces per indentation.\nstatic const CommentConfig def_comment = {nullptr, \"#\", nullptr};\nstatic const std::string Indent = \"    \";\n\nclass PythonStubGenerator {\n public:\n  PythonStubGenerator(const Parser& parser, const std::string& path,\n                      const Version& version)\n      : parser_{parser},\n        namer_{WithFlagOptions(kStubConfig, parser.opts, path),\n               Keywords(version)},\n        version_(version) {}\n\n  bool Generate() {\n    if (parser_.opts.one_file) {\n      Imports imports;\n      std::stringstream stub;\n\n      DeclareUOffset(stub, &imports);\n      for (const EnumDef* def : parser_.enums_.vec) {\n        if (def->generated) continue;\n        GenerateEnumStub(stub, def, &imports);\n      }\n      for (const StructDef* def : parser_.structs_.vec) {\n        if (def->generated) continue;\n        GenerateStructStub(stub, def, &imports);\n      }\n\n      std::string filename =\n          namer_.config_.output_path +\n          StripPath(StripExtension(parser_.file_being_parsed_)) +\n          namer_.config_.filename_suffix + namer_.config_.filename_extension;\n\n      return SaveFile(filename, imports, stub);\n    }\n\n    for (const EnumDef* def : parser_.enums_.vec) {\n      if (def->generated) continue;\n\n      Imports imports;\n      std::stringstream stub;\n\n      DeclareUOffset(stub, &imports);\n      GenerateEnumStub(stub, def, &imports);\n\n      std::string filename = namer_.Directories(*def->defined_namespace) +\n                             namer_.File(*def, SkipFile::Suffix);\n      if (!SaveFile(filename, imports, stub)) return false;\n    }\n\n    for (const StructDef* def : parser_.structs_.vec) {\n      if (def->generated) continue;\n\n      Imports imports;\n      std::stringstream stub;\n\n      DeclareUOffset(stub, &imports);\n      GenerateStructStub(stub, def, &imports);\n\n      std::string filename = namer_.Directories(*def->defined_namespace) +\n                             namer_.File(*def, SkipFile::Suffix);\n      if (!SaveFile(filename, imports, stub)) return false;\n    }\n\n    return true;\n  }\n\n private:\n  bool SaveFile(const std::string& filename, const Imports& imports,\n                const std::stringstream& content) {\n    std::stringstream ss;\n    GenerateImports(ss, imports);\n    ss << '\\n';\n    ss << content.str() << '\\n';\n\n    EnsureDirExists(StripFileName(filename));\n    return parser_.opts.file_saver->SaveFile(filename.c_str(), ss.str(), false);\n  }\n\n  static void DeclareUOffset(std::stringstream& stub, Imports* imports) {\n    imports->Import(\"flatbuffers\");\n    imports->Import(\"typing\");\n    stub << \"uoffset: typing.TypeAlias = \"\n            \"flatbuffers.number_types.UOffsetTFlags.py_type\\n\"\n         << '\\n';\n  }\n\n  std::string ModuleForFile(const std::string& file) const {\n    if (parser_.file_being_parsed_ == file) return \".\";\n\n    std::string module = parser_.opts.include_prefix + StripExtension(file) +\n                         parser_.opts.filename_suffix;\n    std::replace(module.begin(), module.end(), '/', '.');\n    return module;\n  }\n\n  template <typename T>\n  std::string ModuleFor(const T* def) const {\n    if (parser_.opts.one_file) return ModuleForFile(def->file);\n    return namer_.NamespacedType(*def);\n  }\n\n  const StructDef* GetNestedStruct(const FieldDef* field) const {\n    const Value* nested = field->attributes.Lookup(\"nested_flatbuffer\");\n    if (nested == nullptr) return nullptr;\n\n    StructDef* nested_def = parser_.LookupStruct(nested->constant);\n    if (nested_def != nullptr) return nested_def;\n\n    return parser_.LookupStruct(namer_.NamespacedType(\n        parser_.current_namespace_->components, nested->constant));\n  }\n\n  static std::string ScalarType(BaseType type) {\n    if (IsBool(type)) return \"bool\";\n    if (IsInteger(type)) return \"int\";\n    if (IsFloat(type)) return \"float\";\n    FLATBUFFERS_ASSERT(false);\n    return \"None\";\n  }\n\n  template <typename F>\n  std::string UnionType(const EnumDef& enum_def, Imports* imports,\n                        F type) const {\n    imports->Import(\"typing\");\n\n    std::string result = \"\";\n    for (const EnumVal* val : enum_def.Vals()) {\n      if (!result.empty()) result += \", \";\n\n      switch (val->union_type.base_type) {\n        case BASE_TYPE_STRUCT: {\n          Import import = imports->Import(ModuleFor(val->union_type.struct_def),\n                                          type(*val->union_type.struct_def));\n          result += import.name;\n          break;\n        }\n        case BASE_TYPE_STRING:\n          result += \"str\";\n          break;\n        case BASE_TYPE_NONE:\n          result += \"None\";\n          break;\n        default:\n          break;\n      }\n    }\n    return \"typing.Union[\" + result + \"]\";\n  }\n\n  std::string UnionObjectType(const EnumDef& enum_def, Imports* imports) const {\n    return UnionType(enum_def, imports, [this](const StructDef& struct_def) {\n      return namer_.ObjectType(struct_def);\n    });\n  }\n\n  std::string UnionType(const EnumDef& enum_def, Imports* imports) const {\n    return UnionType(enum_def, imports, [this](const StructDef& struct_def) {\n      return namer_.Type(struct_def);\n    });\n  }\n\n  std::string EnumType(const EnumDef& enum_def, Imports* imports) const {\n    imports->Import(\"typing\");\n    const Import& import =\n        imports->Import(ModuleFor(&enum_def), namer_.Type(enum_def));\n\n    std::string result = \"\";\n    for (const EnumVal* val : enum_def.Vals()) {\n      if (!result.empty()) result += \", \";\n      result += import.name + \".\" + namer_.Variant(*val);\n    }\n    return \"typing.Literal[\" + result + \"]\";\n  }\n\n  std::string TypeOf(const Type& type, Imports* imports) const {\n    if (type.enum_def != nullptr) return EnumType(*type.enum_def, imports);\n    if (IsScalar(type.base_type)) return ScalarType(type.base_type);\n\n    switch (type.base_type) {\n      case BASE_TYPE_STRUCT: {\n        const Import& import = imports->Import(ModuleFor(type.struct_def),\n                                               namer_.Type(*type.struct_def));\n        return import.name;\n      }\n      case BASE_TYPE_STRING:\n        return \"str\";\n      case BASE_TYPE_ARRAY:\n      case BASE_TYPE_VECTOR: {\n        imports->Import(\"typing\");\n        return \"typing.List[\" + TypeOf(type.VectorType(), imports) + \"]\";\n      }\n      case BASE_TYPE_UNION:\n        return UnionType(*type.enum_def, imports);\n      default:\n        FLATBUFFERS_ASSERT(0);\n        return \"\";\n    }\n  }\n\n  std::string GenerateObjectFieldStub(const FieldDef* field,\n                                      Imports* imports) const {\n    std::string field_name = namer_.Field(*field);\n\n    const Type& field_type = field->value.type;\n    if (IsScalar(field_type.base_type)) {\n      std::string result = field_name + \": \" + TypeOf(field_type, imports);\n      if (field->IsOptional()) result += \" | None\";\n      return result;\n    }\n\n    switch (field_type.base_type) {\n      case BASE_TYPE_STRUCT: {\n        Import import =\n            imports->Import(ModuleFor(field_type.struct_def),\n                            namer_.ObjectType(*field_type.struct_def));\n        return field_name + \": \" + import.name + \" | None\";\n      }\n      case BASE_TYPE_STRING:\n        return field_name + \": str | None\";\n      case BASE_TYPE_ARRAY:\n      case BASE_TYPE_VECTOR: {\n        imports->Import(\"typing\");\n        if (field_type.element == BASE_TYPE_STRUCT) {\n          Import import =\n              imports->Import(ModuleFor(field_type.struct_def),\n                              namer_.ObjectType(*field_type.struct_def));\n          return field_name + \": typing.List[\" + import.name + \"]\";\n        }\n        if (field_type.element == BASE_TYPE_STRING) {\n          return field_name + \": typing.List[str]\";\n        }\n        return field_name + \": typing.List[\" +\n               TypeOf(field_type.VectorType(), imports) + \"]\";\n      }\n      case BASE_TYPE_UNION:\n        return field_name + \": \" +\n               UnionObjectType(*field->value.type.enum_def, imports);\n      default:\n        return field_name;\n    }\n  }\n\n  void GenerateObjectInitializerStub(std::stringstream& stub,\n                                     const StructDef* struct_def,\n                                     Imports* imports) const {\n    stub << \"  def __init__(\\n\";\n    stub << \"    self,\\n\";\n\n    for (const FieldDef* field : struct_def->fields.vec) {\n      if (field->deprecated) continue;\n\n      std::string field_name = namer_.Field(*field);\n      std::string field_type;\n      const Type& type = field->value.type;\n\n      if (IsScalar(type.base_type)) {\n        field_type = TypeOf(type, imports);\n        if (field->IsOptional()) {\n          field_type += \" | None\";\n        }\n      } else {\n        switch (type.base_type) {\n          case BASE_TYPE_STRUCT: {\n            Import import_ =\n                imports->Import(ModuleFor(type.struct_def),\n                                namer_.ObjectType(*type.struct_def));\n            field_type = \"'\" + import_.name + \"' | None\";\n            break;\n          }\n          case BASE_TYPE_STRING:\n            field_type = \"str | None\";\n            break;\n          case BASE_TYPE_ARRAY:\n          case BASE_TYPE_VECTOR: {\n            imports->Import(\"typing\");\n            if (type.element == BASE_TYPE_STRUCT) {\n              Import import_ =\n                  imports->Import(ModuleFor(type.struct_def),\n                                  namer_.ObjectType(*type.struct_def));\n              field_type = \"typing.List['\" + import_.name + \"'] | None\";\n            } else if (type.element == BASE_TYPE_STRING) {\n              field_type = \"typing.List[str] | None\";\n            } else {\n              field_type = \"typing.List[\" + TypeOf(type.VectorType(), imports) +\n                           \"] | None\";\n            }\n            break;\n          }\n          case BASE_TYPE_UNION:\n            field_type = UnionObjectType(*type.enum_def, imports);\n            break;\n          default:\n            field_type = \"typing.Any\";\n            break;\n        }\n      }\n      stub << \"    \" << field_name << \": \" << field_type << \" = ...,\\n\";\n    }\n    stub << \"  ) -> None: ...\\n\";\n  }\n\n  void GenerateObjectStub(std::stringstream& stub, const StructDef* struct_def,\n                          Imports* imports) const {\n    std::string name = namer_.ObjectType(*struct_def);\n    imports->Export(ModuleFor(struct_def), namer_.Type(*struct_def));\n\n    stub << \"class \" << name;\n    if (version_.major != 3) stub << \"(object)\";\n    stub << \":\\n\";\n    for (const FieldDef* field : struct_def->fields.vec) {\n      if (field->deprecated) continue;\n      stub << \"  \" << GenerateObjectFieldStub(field, imports) << \"\\n\";\n    }\n\n    GenerateObjectInitializerStub(stub, struct_def, imports);\n\n    stub << \"  @classmethod\\n\";\n    stub << \"  def InitFromBuf(cls, buf: bytes, pos: int) -> \" << name\n         << \": ...\\n\";\n\n    stub << \"  @classmethod\\n\";\n    stub << \"  def InitFromPackedBuf(cls, buf: bytes, pos: int = 0) -> \" << name\n         << \": ...\\n\";\n\n    const Import& import =\n        imports->Import(ModuleFor(struct_def), namer_.Type(*struct_def));\n\n    stub << \"  @classmethod\\n\";\n    stub << \"  def InitFromObj(cls, \" << namer_.Variable(*struct_def)\n         << \": \" + import.name + \") -> \" << name << \": ...\\n\";\n\n    stub << \"  def _UnPack(self, \" << namer_.Variable(*struct_def) << \": \"\n         << import.name << \") -> None: ...\\n\";\n\n    stub << \"  def Pack(self, builder: flatbuffers.Builder) -> None: ...\\n\";\n\n    if (parser_.opts.gen_compare) {\n      stub << \"  def __eq__(self, other: \" << name + \") -> bool: ...\\n\";\n    }\n  }\n\n  void GenerateStructStub(std::stringstream& stub, const StructDef* struct_def,\n                          Imports* imports) const {\n    std::string type = namer_.Type(*struct_def);\n    imports->Export(ModuleFor(struct_def), namer_.Type(*struct_def));\n\n    stub << \"class \" << type;\n    if (version_.major != 3) stub << \"(object)\";\n    stub << \":\\n\";\n    if (struct_def->fixed) {\n      stub << \"  @classmethod\\n\";\n      stub << \"  def SizeOf(cls) -> int: ...\\n\\n\";\n    } else {\n      stub << \"  @classmethod\\n\";\n      stub << \"  def GetRootAs(cls, buf: bytes, offset: int) -> \" << type\n           << \": ...\\n\";\n\n      if (!parser_.opts.python_no_type_prefix_suffix) {\n        stub << \"  @classmethod\\n\";\n        stub << \"  def GetRootAs\" << type\n             << \"(cls, buf: bytes, offset: int) -> \" << type << \": ...\\n\";\n      }\n      if (parser_.file_identifier_.length()) {\n        stub << \"  @classmethod\\n\";\n        stub << \"  def \" << type\n             << \"BufferHasIdentifier(cls, buf: bytes, offset: int, \"\n                \"size_prefixed: bool) -> bool: ...\\n\";\n      }\n    }\n\n    stub << \"  def Init(self, buf: bytes, pos: int) -> None: ...\\n\";\n\n    for (const FieldDef* field : struct_def->fields.vec) {\n      if (field->deprecated) continue;\n\n      std::string name = namer_.Method(*field);\n\n      const Type& field_type = field->value.type;\n      if (IsScalar(field_type.base_type)) {\n        stub << \"  def \" << name << \"(self) -> \" << TypeOf(field_type, imports);\n        if (field->IsOptional()) stub << \" | None\";\n        stub << \": ...\\n\";\n      } else {\n        switch (field_type.base_type) {\n          case BASE_TYPE_STRUCT: {\n            const Import& import =\n                imports->Import(ModuleFor(field_type.struct_def),\n                                namer_.Type(*field_type.struct_def));\n            if (struct_def->fixed) {\n              stub << \"  def \" << name << \"(self, obj: \" << import.name\n                   << \") -> \" << import.name << \": ...\\n\";\n            } else {\n              stub << \"  def \" << name + \"(self) -> \" << import.name\n                   << \" | None: ...\\n\";\n            }\n            break;\n          }\n          case BASE_TYPE_STRING:\n            stub << \"  def \" << name << \"(self) -> str | None: ...\\n\";\n            break;\n          case BASE_TYPE_ARRAY:\n          case BASE_TYPE_VECTOR: {\n            switch (field_type.element) {\n              case BASE_TYPE_STRUCT: {\n                const Import& import =\n                    imports->Import(ModuleFor(field_type.struct_def),\n                                    namer_.Type(*field_type.struct_def));\n                stub << \"  def \" << name << \"(self, i: int) -> \" << import.name\n                     << \" | None: ...\\n\";\n                break;\n              }\n              case BASE_TYPE_STRING:\n                stub << \"  def \" << name << \"(self, i: int) -> str: ...\\n\";\n                break;\n              default:  // scalars\n                stub << \"  def \" << name << \"(self, i: int) -> \"\n                     << TypeOf(field_type, imports) << \": ...\\n\";\n\n                if (parser_.opts.python_gen_numpy) {\n                  stub << \"  def \" << name\n                       << \"AsNumpy(self) -> np.ndarray: ...\\n\";\n                }\n\n                const StructDef* nested_def = GetNestedStruct(field);\n                if (nested_def != nullptr) {\n                  const Import& import = imports->Import(\n                      ModuleFor(nested_def), namer_.Type(*nested_def));\n\n                  stub << \"  def \" << name + \"NestedRoot(self) -> \"\n                       << import.name << \" | None: ...\\n\";\n                }\n                break;\n            }\n            stub << \"  def \" << name << \"Length(self) -> int: ...\\n\";\n            stub << \"  def \" << name << \"IsNone(self) -> bool: ...\\n\";\n            break;\n          }\n          case BASE_TYPE_UNION: {\n            imports->Import(\"flatbuffers\", \"table\");\n            stub << \"  def \" << name << \"(self) -> table.Table | None: ...\\n\";\n            break;\n          }\n          default:\n            break;\n        }\n      }\n    }\n\n    if (parser_.opts.generate_object_based_api) {\n      GenerateObjectStub(stub, struct_def, imports);\n    }\n\n    if (struct_def->fixed) {\n      GenerateStructBuilderStub(stub, struct_def, imports);\n    } else {\n      GenerateTableBuilderStub(stub, struct_def, imports);\n    }\n  }\n\n  void StructBuilderArgs(const StructDef& struct_def, const std::string prefix,\n                         Imports* imports,\n                         std::vector<std::string>* args) const {\n    for (const FieldDef* field : struct_def.fields.vec) {\n      const Type type = IsArray(field->value.type)\n                            ? field->value.type.VectorType()\n                            : field->value.type;\n      if (type.base_type == BASE_TYPE_STRUCT) {\n        StructBuilderArgs(*field->value.type.struct_def,\n                          prefix + namer_.Field(*field) + \"_\", imports, args);\n      } else {\n        args->push_back(prefix + namer_.Field(*field) + \": \" +\n                        TypeOf(type, imports));\n      }\n    }\n  }\n\n  void GenerateStructBuilderStub(std::stringstream& stub,\n                                 const StructDef* struct_def,\n                                 Imports* imports) const {\n    imports->Import(\"flatbuffers\");\n\n    std::vector<std::string> args;\n    StructBuilderArgs(*struct_def, \"\", imports, &args);\n\n    stub << '\\n';\n    stub << \"def Create\" + namer_.Type(*struct_def)\n         << \"(builder: flatbuffers.Builder\";\n    for (const std::string& arg : args) {\n      stub << \", \" << arg;\n    }\n    stub << \") -> uoffset: ...\\n\";\n  }\n\n  void GenerateTableBuilderStub(std::stringstream& stub,\n                                const StructDef* struct_def,\n                                Imports* imports) const {\n    std::string type = namer_.Type(*struct_def);\n\n    /**************************** def TableStart ****************************/\n    stub << \"def \";\n    if (!parser_.opts.python_no_type_prefix_suffix) stub << type;\n    stub << \"Start(builder: flatbuffers.Builder) -> None: ...\\n\";\n    if (!parser_.opts.one_file && !parser_.opts.python_no_type_prefix_suffix) {\n      stub << \"def Start(builder: flatbuffers.Builder) -> None: ...\\n\";\n    }\n\n    /************************** def TableAddField ***************************/\n    for (const FieldDef* field : struct_def->fields.vec) {\n      if (field->deprecated) continue;\n\n      stub << \"def \";\n      if (!parser_.opts.python_no_type_prefix_suffix) stub << type;\n      stub << \"Add\" << namer_.Method(*field)\n           << \"(builder: flatbuffers.Builder, \"\n           << namer_.Variable(*field) + \": \";\n      if (IsScalar(field->value.type.base_type)) {\n        stub << TypeOf(field->value.type, imports);\n      } else if (IsArray(field->value.type)) {\n        stub << TypeOf(field->value.type.VectorType(), imports);\n      } else {\n        stub << \"uoffset\";\n      }\n      stub << \") -> None: ...\\n\";\n\n      if (IsVector(field->value.type)) {\n        stub << \"def \";\n        if (!parser_.opts.python_no_type_prefix_suffix) stub << type;\n        stub << \"Start\" << namer_.Method(*field)\n             << \"Vector(builder: flatbuffers.Builder, num_elems: int) -> \"\n                \"uoffset: ...\\n\";\n\n        if (!parser_.opts.one_file &&\n            !parser_.opts.python_no_type_prefix_suffix) {\n          stub << \"def Start\" << namer_.Method(*field)\n               << \"Vector(builder: flatbuffers.Builder, num_elems: int) -> \"\n                  \"uoffset: ...\\n\";\n        }\n\n        if (GetNestedStruct(field) != nullptr) {\n          stub << \"def \" << type << \"Make\" << namer_.Method(*field)\n               << \"VectorFromBytes(builder: flatbuffers.Builder, buf: \"\n                  \"bytes) -> uoffset: ...\\n\";\n          if (!parser_.opts.one_file) {\n            stub << \"def Make\" << namer_.Method(*field)\n                 << \"VectorFromBytes(builder: flatbuffers.Builder, buf: \"\n                    \"bytes) -> uoffset: ...\\n\";\n          }\n        }\n\n        stub << \"def \";\n        if (!parser_.opts.python_no_type_prefix_suffix) stub << type;\n        stub << \"Create\" << namer_.Method(*field)\n             << \"Vector(builder: flatbuffers.Builder, data: typing.Iterable[\"\n                \"typing.Any]) -> uoffset: ...\\n\";\n        if (!parser_.opts.one_file &&\n            !parser_.opts.python_no_type_prefix_suffix) {\n          stub << \"def Create\" << namer_.Method(*field)\n               << \"Vector(builder: flatbuffers.Builder, data: \"\n                  \"typing.Iterable[typing.Any]) -> uoffset: ...\\n\";\n        }\n      }\n    }\n\n    /***************************** def TableEnd *****************************/\n    stub << \"def \";\n    if (!parser_.opts.python_no_type_prefix_suffix) stub << type;\n    stub << \"End(builder: flatbuffers.Builder) -> uoffset: ...\\n\";\n    if (!parser_.opts.one_file && !parser_.opts.python_no_type_prefix_suffix) {\n      stub << \"def End(builder: flatbuffers.Builder) -> uoffset: ...\\n\";\n    }\n  }\n\n  void GenerateEnumStub(std::stringstream& stub, const EnumDef* enum_def,\n                        Imports* imports) const {\n    stub << \"class \" << namer_.Type(*enum_def);\n    imports->Export(ModuleFor(enum_def), namer_.Type(*enum_def));\n\n    imports->Import(\"typing\", \"cast\");\n\n    if (version_.major == 3) {\n      imports->Import(\"enum\", \"IntEnum\");\n      stub << \"(IntEnum)\";\n    } else {\n      stub << \"(object)\";\n    }\n\n    stub << \":\\n\";\n    for (const EnumVal* val : enum_def->Vals()) {\n      stub << \"  \" << namer_.Variant(*val) << \" = cast(\"\n           << ScalarType(enum_def->underlying_type.base_type) << \", ...)\\n\";\n    }\n\n    if (parser_.opts.generate_object_based_api & enum_def->is_union) {\n      imports->Import(\"flatbuffers\", \"table\");\n      stub << \"def \" << namer_.Function(*enum_def)\n           << \"Creator(union_type: \" << EnumType(*enum_def, imports)\n           << \", table: table.Table) -> \" << UnionType(*enum_def, imports)\n           << \": ...\\n\";\n    }\n  }\n\n  void GenerateImports(std::stringstream& ss, const Imports& imports) {\n    ss << \"from __future__ import annotations\\n\";\n    ss << '\\n';\n    ss << \"import flatbuffers\\n\";\n    if (parser_.opts.python_gen_numpy) {\n      ss << \"import numpy as np\\n\";\n    }\n    ss << '\\n';\n\n    std::set<std::string> modules;\n    std::map<std::string, std::set<std::string>> names_by_module;\n    for (const Import& import : imports.imports) {\n      if (import.IsLocal()) continue;  // skip all local imports\n      if (import.module == \"flatbuffers\" && import.name == \"\")\n        continue;  // skip double include hardcoded flatbuffers\n      if (import.name == \"\") {\n        modules.insert(import.module);\n      } else {\n        names_by_module[import.module].insert(import.name);\n      }\n    }\n\n    // Remove imports from exports\n    for (const Import& import : imports.exports) {\n      if (import.name == \"\") {\n        modules.erase(import.module);\n      } else {\n        auto search = names_by_module.find(import.module);\n        if (search != names_by_module.end()) {\n          search->second.erase(import.name);\n        }\n      }\n    }\n\n    for (const std::string& module : modules) {\n      ss << \"import \" << module << '\\n';\n    }\n    for (const auto& import : names_by_module) {\n      if (!import.second.empty()) {\n        ss << \"from \" << import.first << \" import \";\n        size_t i = 0;\n        for (const std::string& name : import.second) {\n          if (i > 0) ss << \", \";\n          ss << name;\n          ++i;\n        }\n        ss << '\\n';\n      }\n    }\n  }\n\n  const Parser& parser_;\n  const IdlNamer namer_;\n  const Version version_;\n};\n}  // namespace\n\nclass PythonGenerator : public BaseGenerator {\n public:\n  PythonGenerator(const Parser& parser, const std::string& path,\n                  const std::string& file_name, const Version& version)\n      : BaseGenerator(parser, path, file_name, \"\" /* not used */,\n                      \"\" /* not used */, \"py\"),\n        float_const_gen_(\"float('nan')\", \"float('inf')\", \"float('-inf')\"),\n        namer_(WithFlagOptions(kConfig, parser.opts, path), Keywords(version)) {\n  }\n\n  // Most field accessors need to retrieve and test the field offset first,\n  // this is the prefix code for that.\n  std::string OffsetPrefix(const FieldDef& field, bool new_line = true) const {\n    return \"\\n\" + Indent + Indent +\n           \"o = flatbuffers.number_types.UOffsetTFlags.py_type\" +\n           \"(self._tab.Offset(\" + NumToString(field.value.offset) + \"))\\n\" +\n           Indent + Indent + \"if o != 0:\" + (new_line ? \"\\n\" : \"\");\n  }\n\n  // Begin a class declaration.\n  void BeginClass(const StructDef& struct_def, std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    code += \"class \" + namer_.Type(struct_def) + \"(object):\\n\";\n    code += Indent + \"__slots__ = ['_tab']\";\n    code += \"\\n\\n\";\n  }\n\n  // Begin enum code with a class declaration.\n  void BeginEnum(const EnumDef& enum_def, std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    code += \"class \" + namer_.Type(enum_def) + \"(object):\\n\";\n  }\n\n  // Starts a new line and then indents.\n  std::string GenIndents(int num) const {\n    return \"\\n\" + std::string(num * Indent.length(), ' ');\n  }\n\n  // A single enum member.\n  void EnumMember(const EnumDef& enum_def, const EnumVal& ev,\n                  std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    code += Indent;\n    code += namer_.Variant(ev);\n    code += \" = \";\n    code += enum_def.ToString(ev) + \"\\n\";\n  }\n\n  // Initialize a new struct or table from existing data.\n  void NewRootTypeFromBuffer(const StructDef& struct_def,\n                             std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    const std::string struct_type = namer_.Type(struct_def);\n\n    code += Indent + \"@classmethod\\n\";\n    code += Indent + \"def GetRootAs\";\n    if (parser_.opts.python_typing) {\n      code += \"(cls, buf, offset: int = 0):\";\n    } else {\n      code += \"(cls, buf, offset=0):\";\n    }\n    code += \"\\n\";\n    code += Indent + Indent;\n    code += \"n = flatbuffers.encode.Get\";\n    code += \"(flatbuffers.packer.uoffset, buf, offset)\\n\";\n    code += Indent + Indent + \"x = \" + struct_type + \"()\\n\";\n    code += Indent + Indent + \"x.Init(buf, n + offset)\\n\";\n    code += Indent + Indent + \"return x\\n\";\n    code += \"\\n\";\n\n    if (!parser_.opts.python_no_type_prefix_suffix) {\n      // Add an alias with the old name\n      code += Indent + \"@classmethod\\n\";\n      code +=\n          Indent + \"def GetRootAs\" + struct_type + \"(cls, buf, offset=0):\\n\";\n      code += Indent + Indent +\n              \"\\\"\\\"\\\"This method is deprecated. Please switch to \"\n              \"GetRootAs.\\\"\\\"\\\"\\n\";\n      code += Indent + Indent + \"return cls.GetRootAs(buf, offset)\\n\";\n    }\n  }\n\n  // Initialize an existing object with other data, to avoid an allocation.\n  void InitializeExisting(const StructDef& struct_def,\n                          std::string* code_ptr) const {\n    auto& code = *code_ptr;\n\n    GenReceiver(struct_def, code_ptr);\n    if (parser_.opts.python_typing) {\n      code += \"Init(self, buf: bytes, pos: int):\\n\";\n    } else {\n      code += \"Init(self, buf, pos):\\n\";\n    }\n    code += Indent + Indent + \"self._tab = flatbuffers.table.Table(buf, pos)\\n\";\n    code += \"\\n\";\n  }\n\n  // Get the length of a vector.\n  void GetVectorLen(const StructDef& struct_def, const FieldDef& field,\n                    std::string* code_ptr) const {\n    auto& code = *code_ptr;\n\n    GenReceiver(struct_def, code_ptr);\n    code += namer_.Method(field) + \"Length(self)\";\n    if (parser_.opts.python_typing) {\n      code += \" -> int\";\n    }\n    code += \":\";\n    if (!IsArray(field.value.type)) {\n      code += OffsetPrefix(field, false);\n      code += GenIndents(3) + \"return self._tab.VectorLen(o)\";\n      code += GenIndents(2) + \"return 0\\n\\n\";\n    } else {\n      code += GenIndents(2) + \"return \" +\n              NumToString(field.value.type.fixed_length) + \"\\n\\n\";\n    }\n  }\n\n  // Determines whether a vector is none or not.\n  void GetVectorIsNone(const StructDef& struct_def, const FieldDef& field,\n                       std::string* code_ptr) const {\n    auto& code = *code_ptr;\n\n    GenReceiver(struct_def, code_ptr);\n    code += namer_.Method(field) + \"IsNone(self)\";\n    if (parser_.opts.python_typing) {\n      code += \" -> bool\";\n    }\n    code += \":\";\n    if (!IsArray(field.value.type)) {\n      code += GenIndents(2) +\n              \"o = flatbuffers.number_types.UOffsetTFlags.py_type\" +\n              \"(self._tab.Offset(\" + NumToString(field.value.offset) + \"))\";\n      code += GenIndents(2) + \"return o == 0\";\n    } else {\n      // assume that we always have an array as memory is preassigned\n      code += GenIndents(2) + \"return False\";\n    }\n    code += \"\\n\\n\";\n  }\n\n  // Get the value of a struct's scalar.\n  void GetScalarFieldOfStruct(const StructDef& struct_def,\n                              const FieldDef& field,\n                              std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    std::string getter = GenGetter(field.value.type);\n    GenReceiver(struct_def, code_ptr);\n    code += namer_.Method(field);\n    code += \"(self): return \" + getter;\n    code += \"self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(\";\n    code += NumToString(field.value.offset) + \"))\\n\";\n  }\n\n  // Get the value of a table's scalar.\n  void GetScalarFieldOfTable(const StructDef& struct_def, const FieldDef& field,\n                             std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    std::string getter = GenGetter(field.value.type);\n    GenReceiver(struct_def, code_ptr);\n    code += namer_.Method(field);\n    code += \"(self):\";\n    code += OffsetPrefix(field);\n    getter += \"o + self._tab.Pos)\";\n    auto is_bool = IsBool(field.value.type.base_type);\n    if (is_bool) {\n      getter = \"bool(\" + getter + \")\";\n    }\n    code += Indent + Indent + Indent + \"return \" + getter + \"\\n\";\n    std::string default_value;\n    if (field.IsScalarOptional()) {\n      default_value = \"None\";\n    } else if (is_bool) {\n      default_value = field.value.constant == \"0\" ? \"False\" : \"True\";\n    } else {\n      default_value = IsFloat(field.value.type.base_type)\n                          ? float_const_gen_.GenFloatConstant(field)\n                          : field.value.constant;\n    }\n    code += Indent + Indent + \"return \" + default_value + \"\\n\\n\";\n  }\n\n  // Get a struct by initializing an existing struct.\n  // Specific to Struct.\n  void GetStructFieldOfStruct(const StructDef& struct_def,\n                              const FieldDef& field,\n                              std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    GenReceiver(struct_def, code_ptr);\n    code += namer_.Method(field);\n    code += \"(self, obj):\\n\";\n    code += Indent + Indent + \"obj.Init(self._tab.Bytes, self._tab.Pos + \";\n    code += NumToString(field.value.offset) + \")\";\n    code += \"\\n\" + Indent + Indent + \"return obj\\n\\n\";\n  }\n\n  // Get the value of a fixed size array.\n  void GetArrayOfStruct(const StructDef& struct_def, const FieldDef& field,\n                        std::string* code_ptr, ImportMap& imports) const {\n    auto& code = *code_ptr;\n    const auto vec_type = field.value.type.VectorType();\n    GenReceiver(struct_def, code_ptr);\n    code += namer_.Method(field);\n\n    const ImportMapEntry import_entry = {GenPackageReference(field.value.type),\n                                         TypeName(field)};\n\n    if (parser_.opts.python_typing) {\n      const std::string return_type = ReturnType(struct_def, field);\n      code += \"(self, i: int)\";\n      code += \" -> \" + return_type + \":\";\n\n      imports.insert(import_entry);\n    } else {\n      code += \"(self, i):\";\n    }\n\n    if (parser_.opts.include_dependence_headers &&\n        !parser_.opts.python_typing) {\n      code += GenIndents(2);\n      code += \"from \" + import_entry.first + \" import \" + import_entry.second +\n              \"\\n\";\n    }\n\n    code += GenIndents(2) + \"obj = \" + TypeName(field) + \"()\";\n    code += GenIndents(2) + \"obj.Init(self._tab.Bytes, self._tab.Pos + \";\n    code += NumToString(field.value.offset) + \" + i * \";\n    code += NumToString(InlineSize(vec_type));\n    code += \")\" + GenIndents(2) + \"return obj\\n\\n\";\n  }\n\n  // Get the value of a vector's non-struct member. Uses a named return\n  // argument to conveniently set the zero value for the result.\n  void GetArrayOfNonStruct(const StructDef& struct_def, const FieldDef& field,\n                           std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    GenReceiver(struct_def, code_ptr);\n    code += namer_.Method(field);\n    code += \"(self, j = None):\";\n    code += GenIndents(2) + \"if j is None:\";\n    code += GenIndents(3) + \"return [\" + GenGetter(field.value.type);\n    code += \"self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(\";\n    code += NumToString(field.value.offset) + \" + i * \";\n    code += NumToString(InlineSize(field.value.type.VectorType()));\n    code += \")) for i in range(\";\n    code += \"self.\" + namer_.Method(field) + \"Length()\" + \")]\";\n    code += GenIndents(2) + \"elif j >= 0 and j < self.\" + namer_.Method(field) +\n            \"Length():\";\n    code += GenIndents(3) + \"return \" + GenGetter(field.value.type);\n    code += \"self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(\";\n    code += NumToString(field.value.offset) + \" + j * \";\n    code += NumToString(InlineSize(field.value.type.VectorType()));\n    code += \"))\";\n    code += GenIndents(2) + \"else:\";\n    code += GenIndents(3) + \"return None\\n\\n\";\n  }\n\n  // Get a struct by initializing an existing struct.\n  // Specific to Table.\n  void GetStructFieldOfTable(const StructDef& struct_def, const FieldDef& field,\n                             std::string* code_ptr, ImportMap& imports) const {\n    auto& code = *code_ptr;\n    GenReceiver(struct_def, code_ptr);\n    code += namer_.Method(field) + \"(self)\";\n\n    const ImportMapEntry import_entry = {GenPackageReference(field.value.type),\n                                         TypeName(field)};\n\n    if (parser_.opts.python_typing) {\n      const std::string return_type = ReturnType(struct_def, field);\n      code += \" -> Optional[\" + return_type + \"]\";\n      imports.insert(ImportMapEntry{\"typing\", \"Optional\"});\n      imports.insert(import_entry);\n    }\n    code += \":\";\n    code += OffsetPrefix(field);\n    if (field.value.type.struct_def->fixed) {\n      code += Indent + Indent + Indent + \"x = o + self._tab.Pos\\n\";\n    } else {\n      code += Indent + Indent + Indent;\n      code += \"x = self._tab.Indirect(o + self._tab.Pos)\\n\";\n    }\n\n    if (parser_.opts.include_dependence_headers &&\n        !parser_.opts.python_typing) {\n      code += Indent + Indent + Indent;\n      code += \"from \" + import_entry.first + \" import \" + import_entry.second +\n              \"\\n\";\n    }\n    code += Indent + Indent + Indent + \"obj = \" + TypeName(field) + \"()\\n\";\n    code += Indent + Indent + Indent + \"obj.Init(self._tab.Bytes, x)\\n\";\n    code += Indent + Indent + Indent + \"return obj\\n\";\n    code += Indent + Indent + \"return None\\n\\n\";\n  }\n\n  // Get the value of a string.\n  void GetStringField(const StructDef& struct_def, const FieldDef& field,\n                      std::string* code_ptr, ImportMap& imports) const {\n    auto& code = *code_ptr;\n    GenReceiver(struct_def, code_ptr);\n    code += namer_.Method(field);\n\n    if (parser_.opts.python_typing) {\n      code += \"(self) -> Optional[str]:\";\n      imports.insert(ImportMapEntry{\"typing\", \"Optional\"});\n    } else {\n      code += \"(self):\";\n    }\n\n    code += OffsetPrefix(field);\n    code += Indent + Indent + Indent + \"return \" + GenGetter(field.value.type);\n    code += \"o + self._tab.Pos)\\n\";\n    code += Indent + Indent + \"return None\\n\\n\";\n  }\n\n  // Get the value of a union from an object.\n  void GetUnionField(const StructDef& struct_def, const FieldDef& field,\n                     std::string* code_ptr, ImportMap& imports) const {\n    auto& code = *code_ptr;\n    GenReceiver(struct_def, code_ptr);\n    std::string return_ty = \"flatbuffers.table.Table\";\n\n    bool is_native_table = TypeName(field) == \"*flatbuffers.Table\";\n    ImportMapEntry import_entry;\n    if (is_native_table) {\n      import_entry = ImportMapEntry{\"flatbuffers.table\", \"Table\"};\n    } else {\n      return_ty = TypeName(field);\n      import_entry = ImportMapEntry{GenPackageReference(field.value.type),\n                                    TypeName(field)};\n    }\n\n    code += namer_.Method(field) + \"(self)\";\n    if (parser_.opts.python_typing) {\n      code += \" -> Optional[\" + return_ty + \"]\";\n      imports.insert(ImportMapEntry{\"typing\", \"Optional\"});\n      imports.insert(import_entry);\n    }\n    code += \":\";\n    code += OffsetPrefix(field);\n\n    if (!parser_.opts.python_typing) {\n      code += Indent + Indent + Indent;\n      code += \"from \" + import_entry.first + \" import \" + import_entry.second +\n              \"\\n\";\n    }\n    code += Indent + Indent + Indent + \"obj = Table(bytearray(), 0)\\n\";\n    code += Indent + Indent + Indent + GenGetter(field.value.type);\n    code += \"obj, o)\\n\" + Indent + Indent + Indent + \"return obj\\n\";\n    code += Indent + Indent + \"return None\\n\\n\";\n  }\n\n  template <typename T>\n  std::string ModuleFor(const T* def) const {\n    if (!parser_.opts.one_file) {\n      return namer_.NamespacedType(*def);\n    }\n\n    std::string filename =\n        StripExtension(def->file) + parser_.opts.filename_suffix;\n    if (parser_.file_being_parsed_ == def->file) {\n      return \".\" + StripPath(filename);  // make it a \"local\" import\n    }\n\n    std::string module = parser_.opts.include_prefix + filename;\n    std::replace(module.begin(), module.end(), '/', '.');\n    return module;\n  }\n\n  // Generate the package reference when importing a struct or enum from its\n  // module.\n  std::string GenPackageReference(const Type& type) const {\n    if (type.struct_def) return ModuleFor(type.struct_def);\n    if (type.enum_def) return ModuleFor(type.enum_def);\n    return \".\" + GenTypeGet(type);\n  }\n\n  // Get the value of a vector's struct member.\n  void GetMemberOfVectorOfStruct(const StructDef& struct_def,\n                                 const FieldDef& field, std::string* code_ptr,\n                                 ImportMap& imports) const {\n    auto& code = *code_ptr;\n    auto vectortype = field.value.type.VectorType();\n\n    GenReceiver(struct_def, code_ptr);\n    code += namer_.Method(field);\n    const ImportMapEntry import_entry = {GenPackageReference(field.value.type),\n                                         TypeName(field)};\n\n    if (parser_.opts.python_typing) {\n      const std::string return_type = ReturnType(struct_def, field);\n      code += \"(self, j: int) -> Optional[\" + return_type + \"]\";\n      imports.insert(ImportMapEntry{\"typing\", \"Optional\"});\n      imports.insert(import_entry);\n    } else {\n      code += \"(self, j)\";\n    }\n    code += \":\" + OffsetPrefix(field);\n    code += Indent + Indent + Indent + \"x = self._tab.Vector(o)\\n\";\n    code += Indent + Indent + Indent;\n    code += \"x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * \";\n    code += NumToString(InlineSize(vectortype)) + \"\\n\";\n    if (!(vectortype.struct_def->fixed)) {\n      code += Indent + Indent + Indent + \"x = self._tab.Indirect(x)\\n\";\n    }\n    if (parser_.opts.include_dependence_headers &&\n        !parser_.opts.python_typing) {\n      code += Indent + Indent + Indent;\n      code += \"from \" + import_entry.first + \" import \" + import_entry.second +\n              \"\\n\";\n    }\n    code += Indent + Indent + Indent + \"obj = \" + TypeName(field) + \"()\\n\";\n    code += Indent + Indent + Indent + \"obj.Init(self._tab.Bytes, x)\\n\";\n    code += Indent + Indent + Indent + \"return obj\\n\";\n    code += Indent + Indent + \"return None\\n\\n\";\n  }\n\n  // Get the value of a vector's non-struct member. Uses a named return\n  // argument to conveniently set the zero value for the result.\n  void GetMemberOfVectorOfNonStruct(const StructDef& struct_def,\n                                    const FieldDef& field,\n                                    std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    auto vectortype = field.value.type.VectorType();\n\n    GenReceiver(struct_def, code_ptr);\n    code += namer_.Method(field);\n    if (parser_.opts.python_typing) {\n      code += \"(self, j: int)\";\n    } else {\n      code += \"(self, j)\";\n    }\n    code += \":\";\n    code += OffsetPrefix(field);\n    code += Indent + Indent + Indent + \"a = self._tab.Vector(o)\\n\";\n    code += Indent + Indent + Indent;\n    code += \"return \" + GenGetter(field.value.type);\n    code += \"a + flatbuffers.number_types.UOffsetTFlags.py_type(j * \";\n    code += NumToString(InlineSize(vectortype)) + \"))\\n\";\n    if (IsString(vectortype)) {\n      code += Indent + Indent + \"return \\\"\\\"\\n\";\n    } else {\n      code += Indent + Indent + \"return 0\\n\";\n    }\n    code += \"\\n\";\n  }\n\n  // Returns a non-struct vector as a numpy array. Much faster\n  // than iterating over the vector element by element.\n  void GetVectorOfNonStructAsNumpy(const StructDef& struct_def,\n                                   const FieldDef& field,\n                                   std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    auto vectortype = field.value.type.VectorType();\n\n    // Currently, we only support accessing as numpy array if\n    // the vector type is a scalar.\n    if (!(IsScalar(vectortype.base_type))) {\n      return;\n    }\n\n    GenReceiver(struct_def, code_ptr);\n    code += namer_.Method(field) + \"AsNumpy(self):\";\n    if (!IsArray(field.value.type)) {\n      code += OffsetPrefix(field, false);\n\n      code += GenIndents(3);\n      code += \"return \";\n      code += \"self._tab.GetVectorAsNumpy(flatbuffers.number_types.\";\n      code += namer_.Method(GenTypeGet(field.value.type));\n      code += \"Flags, o)\";\n\n      if (IsString(vectortype)) {\n        code += GenIndents(2) + \"return \\\"\\\"\\n\";\n      } else {\n        code += GenIndents(2) + \"return 0\\n\";\n      }\n    } else {\n      code += GenIndents(2) + \"return \";\n      code += \"self._tab.GetArrayAsNumpy(flatbuffers.number_types.\";\n      code += namer_.Method(GenTypeGet(field.value.type.VectorType()));\n      code += \"Flags, self._tab.Pos + \" + NumToString(field.value.offset) +\n              \", \" + NumToString(\"self.\" + namer_.Method(field) + \"Length()\") +\n              \")\\n\";\n    }\n    code += \"\\n\";\n  }\n\n  std::string NestedFlatbufferType(std::string unqualified_name) const {\n    StructDef* nested_root = parser_.LookupStruct(unqualified_name);\n    std::string qualified_name;\n    if (nested_root == nullptr) {\n      qualified_name = namer_.NamespacedType(\n          parser_.current_namespace_->components, unqualified_name);\n      // Double check qualified name just to be sure it exists.\n      nested_root = parser_.LookupStruct(qualified_name);\n    }\n    FLATBUFFERS_ASSERT(nested_root);  // Guaranteed to exist by parser.\n    return qualified_name;\n  }\n\n  // Returns a nested flatbuffer as itself.\n  void GetVectorAsNestedFlatbuffer(const StructDef& struct_def,\n                                   const FieldDef& field, std::string* code_ptr,\n                                   ImportMap& imports) const {\n    auto nested = field.attributes.Lookup(\"nested_flatbuffer\");\n    if (!nested) {\n      return;\n    }  // There is no nested flatbuffer.\n\n    std::string unqualified_name = nested->constant;\n    std::string qualified_name = NestedFlatbufferType(unqualified_name);\n    if (qualified_name.empty()) {\n      qualified_name = nested->constant;\n    }\n\n    // name may be partially qualified -- need to get the true unqualified name\n    unqualified_name = namer_.Denamespace(qualified_name);\n\n    const ImportMapEntry import_entry = {qualified_name, unqualified_name};\n\n    auto& code = *code_ptr;\n    GenReceiver(struct_def, code_ptr);\n    code += namer_.Method(field) + \"NestedRoot(self)\";\n    if (parser_.opts.python_typing) {\n      code += \" -> Union[\" + unqualified_name + \", int]\";\n      imports.insert(ImportMapEntry{\"typing\", \"Union\"});\n      imports.insert(import_entry);\n    }\n    code += \":\";\n\n    code += OffsetPrefix(field);\n\n    if (!parser_.opts.python_typing) {\n      code += Indent + Indent + Indent;\n      code += \"from \" + import_entry.first + \" import \" + import_entry.second +\n              \"\\n\";\n    }\n    code += Indent + Indent + Indent + \"return \" + unqualified_name;\n    code += \".GetRootAs\";\n    code += \"(self._tab.Bytes, self._tab.Vector(o))\\n\";\n    code += Indent + Indent + \"return 0\\n\";\n    code += \"\\n\";\n  }\n\n  // Begin the creator function signature.\n  void BeginBuilderArgs(const StructDef& struct_def,\n                        std::string* code_ptr) const {\n    auto& code = *code_ptr;\n\n    code += \"\\n\";\n    code += \"def Create\" + namer_.Function(struct_def);\n    code += \"(builder\";\n  }\n\n  // Recursively generate arguments for a constructor, to deal with nested\n  // structs.\n  void StructBuilderArgs(const StructDef& struct_def,\n                         const std::string nameprefix,\n                         const std::string namesuffix, bool has_field_name,\n                         const std::string fieldname_suffix,\n                         std::string* code_ptr) const {\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      const auto& field_type = field.value.type;\n      const auto& type =\n          IsArray(field_type) ? field_type.VectorType() : field_type;\n      if (IsStruct(type)) {\n        // Generate arguments for a struct inside a struct. To ensure names\n        // don't clash, and to make it obvious these arguments are constructing\n        // a nested struct, prefix the name with the field name.\n        auto subprefix = nameprefix;\n        if (has_field_name) {\n          subprefix += namer_.Field(field) + fieldname_suffix;\n        }\n        StructBuilderArgs(*field.value.type.struct_def, subprefix, namesuffix,\n                          has_field_name, fieldname_suffix, code_ptr);\n      } else {\n        auto& code = *code_ptr;\n        code += std::string(\", \") + nameprefix;\n        if (has_field_name) {\n          code += namer_.Field(field);\n        }\n        code += namesuffix;\n      }\n    }\n  }\n\n  // End the creator function signature.\n  void EndBuilderArgs(std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    code += \"):\\n\";\n  }\n\n  // Recursively generate struct construction statements and instert manual\n  // padding.\n  void StructBuilderBody(const StructDef& struct_def, const char* nameprefix,\n                         std::string* code_ptr, size_t index = 0,\n                         bool in_array = false) const {\n    auto& code = *code_ptr;\n    std::string indent(index * 4, ' ');\n    code +=\n        indent + \"    builder.Prep(\" + NumToString(struct_def.minalign) + \", \";\n    code += NumToString(struct_def.bytesize) + \")\\n\";\n    for (auto it = struct_def.fields.vec.rbegin();\n         it != struct_def.fields.vec.rend(); ++it) {\n      auto& field = **it;\n      const auto& field_type = field.value.type;\n      const auto& type =\n          IsArray(field_type) ? field_type.VectorType() : field_type;\n      if (field.padding)\n        code +=\n            indent + \"    builder.Pad(\" + NumToString(field.padding) + \")\\n\";\n      if (IsStruct(field_type)) {\n        StructBuilderBody(*field_type.struct_def,\n                          (nameprefix + (namer_.Field(field) + \"_\")).c_str(),\n                          code_ptr, index, in_array);\n      } else {\n        const auto index_var = \"_idx\" + NumToString(index);\n        if (IsArray(field_type)) {\n          code += indent + \"    for \" + index_var + \" in range(\";\n          code += NumToString(field_type.fixed_length);\n          code += \" , 0, -1):\\n\";\n          in_array = true;\n        }\n        if (IsStruct(type)) {\n          StructBuilderBody(*field_type.struct_def,\n                            (nameprefix + (namer_.Field(field) + \"_\")).c_str(),\n                            code_ptr, index + 1, in_array);\n        } else {\n          code += IsArray(field_type) ? \"    \" : \"\";\n          code += indent + \"    builder.Prepend\" + GenMethod(field) + \"(\";\n          code += nameprefix + namer_.Variable(field);\n          size_t array_cnt = index + (IsArray(field_type) ? 1 : 0);\n          for (size_t i = 0; in_array && i < array_cnt; i++) {\n            code += \"[_idx\" + NumToString(i) + \"-1]\";\n          }\n          code += \")\\n\";\n        }\n      }\n    }\n  }\n\n  void EndBuilderBody(std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    code += \"    return builder.Offset()\\n\";\n  }\n\n  // Get the value of a table's starting offset.\n  void GetStartOfTable(const StructDef& struct_def,\n                       std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    const auto struct_type = namer_.Type(struct_def);\n    // Generate method with struct name.\n\n    const auto name = parser_.opts.python_no_type_prefix_suffix\n                          ? \"Start\"\n                          : struct_type + \"Start\";\n\n    code += \"def \" + name;\n    if (parser_.opts.python_typing) {\n      code += \"(builder: flatbuffers.Builder):\\n\";\n    } else {\n      code += \"(builder):\\n\";\n    }\n\n    code += Indent + \"builder.StartObject(\";\n    code += NumToString(struct_def.fields.vec.size());\n    code += \")\\n\\n\";\n\n    if (!parser_.opts.one_file && !parser_.opts.python_no_type_prefix_suffix) {\n      // Generate method without struct name.\n      if (parser_.opts.python_typing) {\n        code += \"def Start(builder: flatbuffers.Builder):\\n\";\n      } else {\n        code += \"def Start(builder):\\n\";\n      }\n      code += Indent + struct_type + \"Start(builder)\\n\\n\";\n    }\n  }\n\n  // Set the value of a table's field.\n  void BuildFieldOfTable(const StructDef& struct_def, const FieldDef& field,\n                         const size_t offset, std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    const std::string field_var = namer_.Variable(field);\n    const std::string field_method = namer_.Method(field);\n    const std::string field_ty = GenFieldTy(field);\n\n    const auto name = parser_.opts.python_no_type_prefix_suffix\n                          ? \"Add\" + field_method\n                          : namer_.Type(struct_def) + \"Add\" + field_method;\n\n    // Generate method with struct name.\n    code += \"def \" + name;\n    if (parser_.opts.python_typing) {\n      code += \"(builder: flatbuffers.Builder, \" + field_var + \": \" + field_ty;\n    } else {\n      code += \"(builder, \" + field_var;\n    }\n    code += \"):\\n\";\n    code += Indent + \"builder.Prepend\";\n    code += GenMethod(field) + \"Slot(\";\n    code += NumToString(offset) + \", \";\n    if (!IsScalar(field.value.type.base_type) && (!struct_def.fixed)) {\n      code += \"flatbuffers.number_types.UOffsetTFlags.py_type\";\n      code += \"(\" + field_var + \")\";\n    } else {\n      code += field_var;\n    }\n    code += \", \";\n    if (field.IsScalarOptional()) {\n      code += \"None\";\n    } else if (IsFloat(field.value.type.base_type)) {\n      code += float_const_gen_.GenFloatConstant(field);\n    } else {\n      code += field.value.constant;\n    }\n    code += \")\\n\\n\";\n\n    if (!parser_.opts.one_file && !parser_.opts.python_no_type_prefix_suffix) {\n      // Generate method without struct name.\n      code += \"def Add\" + field_method;\n      if (parser_.opts.python_typing) {\n        code += \"(builder: flatbuffers.Builder, \" + field_var + \": \" + field_ty;\n      } else {\n        code += \"(builder, \" + field_var;\n      }\n      code += \"):\\n\";\n      code += Indent + namer_.Type(struct_def) + \"Add\" + field_method;\n      code += \"(builder, \";\n      code += field_var;\n      code += \")\\n\\n\";\n    }\n  }\n\n  // Set the value of one of the members of a table's vector.\n  void BuildVectorOfTable(const StructDef& struct_def, const FieldDef& field,\n                          std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    const std::string struct_type = namer_.Type(struct_def);\n    const std::string field_method = namer_.Method(field);\n\n    // Generate method with struct name.\n    const auto name = parser_.opts.python_no_type_prefix_suffix\n                          ? \"Start\" + field_method\n                          : struct_type + \"Start\" + field_method;\n    code += \"def \" + name;\n    if (parser_.opts.python_typing) {\n      code += \"Vector(builder, numElems: int) -> int:\\n\";\n    } else {\n      code += \"Vector(builder, numElems):\\n\";\n    }\n\n    code += Indent + \"return builder.StartVector(\";\n    auto vector_type = field.value.type.VectorType();\n    auto alignment = InlineAlignment(vector_type);\n    auto elem_size = InlineSize(vector_type);\n    code += NumToString(elem_size);\n    code += \", numElems, \" + NumToString(alignment);\n    code += \")\\n\\n\";\n\n    if (!parser_.opts.one_file && !parser_.opts.python_no_type_prefix_suffix) {\n      // Generate method without struct name.\n      if (parser_.opts.python_typing) {\n        code += \"def Start\" + field_method +\n                \"Vector(builder, numElems: int) -> int:\\n\";\n      } else {\n        code += \"def Start\" + field_method + \"Vector(builder, numElems):\\n\";\n      }\n      code += Indent + \"return \" + struct_type + \"Start\";\n      code += field_method + \"Vector(builder, numElems)\\n\\n\";\n    }\n  }\n\n  void BuildVectorCreationHelper(const StructDef& struct_def,\n                                 const FieldDef& field, std::string* code_ptr,\n                                 ImportMap& imports) const {\n    auto& code = *code_ptr;\n    const auto vector_type = field.value.type.VectorType();\n    const bool is_struct_vector = IsStruct(vector_type);\n    const bool is_scalar_vector =\n        IsScalar(vector_type.base_type) || vector_type.enum_def != nullptr;\n    const std::string struct_type = namer_.Type(struct_def);\n    const std::string field_method = namer_.Method(field);\n    const std::string helper_name =\n        parser_.opts.python_no_type_prefix_suffix\n            ? \"Create\" + field_method + \"Vector\"\n            : struct_type + \"Create\" + field_method + \"Vector\";\n\n    if (parser_.opts.python_typing) {\n      imports.insert(ImportMapEntry{\"typing\", \"Iterable\"});\n      code += \"def \" + helper_name +\n              \"(builder: flatbuffers.Builder, data: Iterable[Any]) -> int:\\n\";\n    } else {\n      code += \"def \" + helper_name + \"(builder, data):\\n\";\n    }\n\n    if (is_scalar_vector || is_struct_vector) {\n      auto alignment = InlineAlignment(vector_type);\n      auto elem_size = InlineSize(vector_type);\n      code += Indent + \"data = list(data)\\n\";\n      code += Indent + \"builder.StartVector(\" + NumToString(elem_size) +\n              \", len(data), \" + NumToString(alignment) + \")\\n\";\n      code += Indent + \"for item in reversed(data):\\n\";\n      if (is_struct_vector) {\n        code += Indent + Indent + \"item.Pack(builder)\\n\";\n      } else {\n        code += Indent + Indent + \"builder.Prepend\" +\n                namer_.Method(GenTypeBasic(vector_type)) + \"(item)\\n\";\n      }\n      code += Indent + \"return builder.EndVector()\\n\\n\";\n    } else {\n      code += Indent + \"return builder.CreateVectorOfTables(data)\\n\\n\";\n    }\n\n    if (!parser_.opts.one_file && !parser_.opts.python_no_type_prefix_suffix) {\n      if (parser_.opts.python_typing) {\n        code += \"def Create\" + field_method +\n                \"Vector(builder: flatbuffers.Builder, data: Iterable[Any]) \"\n                \"-> int:\\n\";\n      } else {\n        code += \"def Create\" + field_method + \"Vector(builder, data):\\n\";\n      }\n      code += Indent + \"return \" + helper_name + \"(builder, data)\\n\\n\";\n    }\n  }\n\n  // Set the value of one of the members of a table's vector and fills in the\n  // elements from a bytearray. This is for simplifying the use of nested\n  // flatbuffers.\n  void BuildVectorOfTableFromBytes(const StructDef& struct_def,\n                                   const FieldDef& field,\n                                   std::string* code_ptr) const {\n    auto nested = field.attributes.Lookup(\"nested_flatbuffer\");\n    if (!nested) {\n      return;\n    }  // There is no nested flatbuffer.\n\n    auto& code = *code_ptr;\n    const std::string field_method = namer_.Method(field);\n    const std::string struct_type = namer_.Type(struct_def);\n\n    // Generate method with struct and field name.\n    code += \"def \" + struct_type + \"Make\" + field_method;\n    code += \"VectorFromBytes(builder, bytes):\\n\";\n    code += Indent + \"builder.StartVector(\";\n    auto vector_type = field.value.type.VectorType();\n    auto alignment = InlineAlignment(vector_type);\n    auto elem_size = InlineSize(vector_type);\n    code += NumToString(elem_size);\n    code += \", len(bytes), \" + NumToString(alignment);\n    code += \")\\n\";\n    code += Indent + \"builder.head = builder.head - len(bytes)\\n\";\n    code += Indent + \"builder.Bytes[builder.head : builder.head + len(bytes)]\";\n    code += \" = bytes\\n\";\n    code += Indent + \"return builder.EndVector()\\n\";\n\n    if (!parser_.opts.one_file) {\n      // Generate method without struct and field name.\n      code += \"def Make\" + field_method + \"VectorFromBytes(builder, bytes):\\n\";\n      code += Indent + \"return \" + struct_type + \"Make\" + field_method +\n              \"VectorFromBytes(builder, bytes)\\n\";\n    }\n  }\n\n  // Get the offset of the end of a table.\n  void GetEndOffsetOnTable(const StructDef& struct_def,\n                           std::string* code_ptr) const {\n    auto& code = *code_ptr;\n\n    const auto name = parser_.opts.python_no_type_prefix_suffix\n                          ? \"End\"\n                          : namer_.Type(struct_def) + \"End\";\n    // Generate method with struct name.\n    if (parser_.opts.python_typing) {\n      code += \"def \" + name + \"(builder: flatbuffers.Builder) -> int:\\n\";\n    } else {\n      code += \"def \" + name + \"(builder):\\n\";\n    }\n    code += Indent + \"return builder.EndObject()\\n\\n\";\n\n    if (!parser_.opts.one_file && !parser_.opts.python_no_type_prefix_suffix) {\n      // Generate method without struct name.\n      if (parser_.opts.python_typing) {\n        code += \"def End(builder: flatbuffers.Builder) -> int:\\n\";\n      } else {\n        code += \"def End(builder):\\n\";\n      }\n      code += Indent + \"return \" + namer_.Type(struct_def) + \"End(builder)\";\n      code += \"\\n\";\n    }\n  }\n\n  // Generate the receiver for function signatures.\n  void GenReceiver(const StructDef& struct_def, std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    code += Indent + \"# \" + namer_.Type(struct_def) + \"\\n\";\n    code += Indent + \"def \";\n  }\n\n  // Generate a struct field, conditioned on its child type(s).\n  void GenStructAccessor(const StructDef& struct_def, const FieldDef& field,\n                         std::string* code_ptr, ImportMap& imports) const {\n    GenComment(field.doc_comment, code_ptr, &def_comment, Indent.c_str());\n    if (IsScalar(field.value.type.base_type)) {\n      if (struct_def.fixed) {\n        GetScalarFieldOfStruct(struct_def, field, code_ptr);\n      } else {\n        GetScalarFieldOfTable(struct_def, field, code_ptr);\n      }\n    } else {\n      switch (field.value.type.base_type) {\n        case BASE_TYPE_STRUCT:\n          if (struct_def.fixed) {\n            GetStructFieldOfStruct(struct_def, field, code_ptr);\n          } else {\n            GetStructFieldOfTable(struct_def, field, code_ptr, imports);\n          }\n          break;\n        case BASE_TYPE_STRING:\n          GetStringField(struct_def, field, code_ptr, imports);\n          break;\n        case BASE_TYPE_VECTOR: {\n          auto vectortype = field.value.type.VectorType();\n          if (vectortype.base_type == BASE_TYPE_STRUCT) {\n            GetMemberOfVectorOfStruct(struct_def, field, code_ptr, imports);\n          } else {\n            GetMemberOfVectorOfNonStruct(struct_def, field, code_ptr);\n            if (parser_.opts.python_gen_numpy) {\n              GetVectorOfNonStructAsNumpy(struct_def, field, code_ptr);\n            }\n            GetVectorAsNestedFlatbuffer(struct_def, field, code_ptr, imports);\n          }\n          break;\n        }\n        case BASE_TYPE_ARRAY: {\n          auto vectortype = field.value.type.VectorType();\n          if (vectortype.base_type == BASE_TYPE_STRUCT) {\n            GetArrayOfStruct(struct_def, field, code_ptr, imports);\n          } else {\n            GetArrayOfNonStruct(struct_def, field, code_ptr);\n            if (parser_.opts.python_gen_numpy) {\n              GetVectorOfNonStructAsNumpy(struct_def, field, code_ptr);\n            }\n            GetVectorAsNestedFlatbuffer(struct_def, field, code_ptr, imports);\n          }\n          break;\n        }\n        case BASE_TYPE_UNION:\n          GetUnionField(struct_def, field, code_ptr, imports);\n          break;\n        default:\n          FLATBUFFERS_ASSERT(0);\n      }\n    }\n    if (IsVector(field.value.type) || IsArray(field.value.type)) {\n      GetVectorLen(struct_def, field, code_ptr);\n      GetVectorIsNone(struct_def, field, code_ptr);\n    }\n  }\n\n  // Generate struct sizeof.\n  void GenStructSizeOf(const StructDef& struct_def,\n                       std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    code += Indent + \"@classmethod\\n\";\n    if (parser_.opts.python_typing) {\n      code += Indent + \"def SizeOf(cls) -> int:\\n\";\n    } else {\n      code += Indent + \"def SizeOf(cls):\\n\";\n    }\n    code +=\n        Indent + Indent + \"return \" + NumToString(struct_def.bytesize) + \"\\n\";\n    code += \"\\n\";\n  }\n\n  // Generate table constructors, conditioned on its members' types.\n  void GenTableBuilders(const StructDef& struct_def, std::string* code_ptr,\n                        ImportMap& imports) const {\n    GetStartOfTable(struct_def, code_ptr);\n\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (field.deprecated) continue;\n\n      auto offset = it - struct_def.fields.vec.begin();\n      BuildFieldOfTable(struct_def, field, offset, code_ptr);\n      if (IsVector(field.value.type)) {\n        BuildVectorOfTable(struct_def, field, code_ptr);\n        BuildVectorCreationHelper(struct_def, field, code_ptr, imports);\n        BuildVectorOfTableFromBytes(struct_def, field, code_ptr);\n      }\n    }\n\n    GetEndOffsetOnTable(struct_def, code_ptr);\n  }\n\n  // Generate function to check for proper file identifier\n  void GenHasFileIdentifier(const StructDef& struct_def,\n                            std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    std::string escapedID;\n    // In the event any of file_identifier characters are special(NULL, \\, etc),\n    // problems occur. To prevent this, convert all chars to their hex-escaped\n    // equivalent.\n    for (auto it = parser_.file_identifier_.begin();\n         it != parser_.file_identifier_.end(); ++it) {\n      escapedID += \"\\\\x\" + IntToStringHex(*it, 2);\n    }\n\n    code += Indent + \"@classmethod\\n\";\n    code += Indent + \"def \" + namer_.Type(struct_def);\n    code += \"BufferHasIdentifier(cls, buf, offset, size_prefixed=False):\";\n    code += \"\\n\";\n    code += Indent + Indent;\n    code += \"return flatbuffers.util.BufferHasIdentifier(buf, offset, b\\\"\";\n    code += escapedID;\n    code += \"\\\", size_prefixed=size_prefixed)\\n\";\n    code += \"\\n\";\n  }\n\n  // Generates struct or table methods.\n  void GenStruct(const StructDef& struct_def, std::string* code_ptr,\n                 ImportMap& imports) const {\n    if (struct_def.generated) return;\n\n    GenComment(struct_def.doc_comment, code_ptr, &def_comment);\n    BeginClass(struct_def, code_ptr);\n    if (!struct_def.fixed) {\n      // Generate a special accessor for the table that has been declared as\n      // the root type.\n      NewRootTypeFromBuffer(struct_def, code_ptr);\n      if (parser_.file_identifier_.length()) {\n        // Generate a special function to test file_identifier\n        GenHasFileIdentifier(struct_def, code_ptr);\n      }\n    } else {\n      // Generates the SizeOf method for all structs.\n      GenStructSizeOf(struct_def, code_ptr);\n    }\n    // Generates the Init method that sets the field in a pre-existing\n    // accessor object. This is to allow object reuse.\n    InitializeExisting(struct_def, code_ptr);\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (field.deprecated) continue;\n\n      GenStructAccessor(struct_def, field, code_ptr, imports);\n    }\n\n    if (struct_def.fixed) {\n      // creates a struct constructor function\n      GenStructBuilder(struct_def, code_ptr);\n    } else {\n      // Creates a set of functions that allow table construction.\n      GenTableBuilders(struct_def, code_ptr, imports);\n    }\n  }\n\n  void GenReceiverForObjectAPI(const StructDef& struct_def,\n                               std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    code += GenIndents(1) + \"# \" + namer_.ObjectType(struct_def);\n    code += GenIndents(1) + \"def \";\n  }\n\n  void BeginClassForObjectAPI(const StructDef& struct_def,\n                              std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    code += \"\\n\";\n    code += \"class \" + namer_.ObjectType(struct_def) + \"(object):\";\n    code += \"\\n\";\n  }\n\n  // Gets the accoresponding python builtin type of a BaseType for scalars and\n  // string.\n  std::string GetBasePythonTypeForScalarAndString(\n      const BaseType& base_type) const {\n    if (IsBool(base_type)) {\n      return \"bool\";\n    } else if (IsFloat(base_type)) {\n      return \"float\";\n    } else if (IsInteger(base_type)) {\n      return \"int\";\n    } else if (base_type == BASE_TYPE_STRING) {\n      return \"Optional[str]\";\n    } else {\n      FLATBUFFERS_ASSERT(false && \"base_type is not a scalar or string type.\");\n      return \"\";\n    }\n  }\n\n  std::string GetDefaultValue(const FieldDef& field) const {\n    BaseType base_type = field.value.type.base_type;\n    if (field.IsScalarOptional()) {\n      return \"None\";\n    } else if (IsBool(base_type)) {\n      return field.value.constant == \"0\" ? \"False\" : \"True\";\n    } else if (IsFloat(base_type)) {\n      return float_const_gen_.GenFloatConstant(field);\n    } else if (IsInteger(base_type)) {\n      return field.value.constant;\n    } else {\n      // For string, struct, and table.\n      return \"None\";\n    }\n  }\n\n  void GenUnionInit(const FieldDef& field, std::string* field_types_ptr,\n                    std::set<std::string>* import_list,\n                    std::set<std::string>* import_typing_list) const {\n    // Gets all possible types in the union.\n    import_typing_list->insert(\"Union\");\n    auto& field_types = *field_types_ptr;\n    field_types = \"Union[\";\n\n    std::string separator_string = \", \";\n    auto enum_def = field.value.type.enum_def;\n    for (auto it = enum_def->Vals().begin(); it != enum_def->Vals().end();\n         ++it) {\n      auto& ev = **it;\n      // Union only supports string and table.\n      std::string field_type;\n      switch (ev.union_type.base_type) {\n        case BASE_TYPE_STRUCT:\n          field_type = namer_.ObjectType(*ev.union_type.struct_def);\n          if (parser_.opts.include_dependence_headers) {\n            auto package_reference = GenPackageReference(ev.union_type);\n            field_type = package_reference + \".\" + field_type;\n            import_list->insert(\"import \" + package_reference);\n          }\n          field_type = \"'\" + field_type + \"'\";\n          break;\n        case BASE_TYPE_STRING:\n          field_type += \"str\";\n          break;\n        case BASE_TYPE_NONE:\n          field_type += \"None\";\n          break;\n        default:\n          break;\n      }\n      field_types += field_type + separator_string;\n    }\n\n    // Removes the last separator_string.\n    field_types.erase(field_types.length() - separator_string.size());\n    field_types += \"]\";\n\n    // Gets the import lists for the union.\n    if (parser_.opts.include_dependence_headers) {\n      const auto package_reference = GenPackageReference(field.value.type);\n      import_list->insert(\"import \" + package_reference);\n    }\n  }\n\n  void GenStructInit(const FieldDef& field, std::string* out_ptr,\n                     std::set<std::string>* import_list,\n                     std::set<std::string>* import_typing_list) const {\n    import_typing_list->insert(\"Optional\");\n    auto& output = *out_ptr;\n    const Type& type = field.value.type;\n    const std::string object_type = namer_.ObjectType(*type.struct_def);\n    if (parser_.opts.include_dependence_headers) {\n      auto package_reference = GenPackageReference(type);\n      output = package_reference + \".\" + object_type + \"]\";\n      import_list->insert(\"import \" + package_reference);\n    } else {\n      output = object_type + \"]\";\n    }\n    output = \"Optional[\" + output;\n  }\n\n  void GenVectorInit(const FieldDef& field, std::string* field_type_ptr,\n                     std::set<std::string>* import_list,\n                     std::set<std::string>* import_typing_list) const {\n    import_typing_list->insert(\"List\");\n    auto& field_type = *field_type_ptr;\n    const Type& vector_type = field.value.type.VectorType();\n    const BaseType base_type = vector_type.base_type;\n    if (base_type == BASE_TYPE_STRUCT) {\n      const std::string object_type =\n          namer_.ObjectType(*vector_type.struct_def);\n      field_type = object_type + \"]\";\n      if (parser_.opts.include_dependence_headers) {\n        auto package_reference = GenPackageReference(vector_type);\n        field_type = package_reference + \".\" + object_type + \"]\";\n        import_list->insert(\"import \" + package_reference);\n      }\n      field_type = \"Optional[List[\" + field_type + \"]\";\n    } else {\n      field_type = \"Optional[List[\" +\n                   GetBasePythonTypeForScalarAndString(base_type) + \"]]\";\n    }\n  }\n\n  void GenInitialize(const StructDef& struct_def, std::string* code_ptr,\n                     std::set<std::string>* import_list) const {\n    std::string signature_params;\n    std::string init_body;\n    std::set<std::string> import_typing_list;\n\n    signature_params += GenIndents(2) + \"self,\";\n\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (field.deprecated) continue;\n\n      // Determines field type, default value, and typing imports.\n      auto base_type = field.value.type.base_type;\n      std::string field_type;\n      switch (base_type) {\n        case BASE_TYPE_UNION: {\n          GenUnionInit(field, &field_type, import_list, &import_typing_list);\n          break;\n        }\n        case BASE_TYPE_STRUCT: {\n          GenStructInit(field, &field_type, import_list, &import_typing_list);\n          break;\n        }\n        case BASE_TYPE_VECTOR:\n        case BASE_TYPE_ARRAY: {\n          GenVectorInit(field, &field_type, import_list, &import_typing_list);\n          break;\n        }\n        default:\n          // Scalar or sting fields.\n          field_type = GetBasePythonTypeForScalarAndString(base_type);\n          if (field.IsScalarOptional()) {\n            import_typing_list.insert(\"Optional\");\n            field_type = \"Optional[\" + field_type + \"]\";\n          }\n          break;\n      }\n\n      const auto default_value = GetDefaultValue(field);\n      // Writes the init statement.\n      const auto field_field = namer_.Field(field);\n\n      // Build signature with keyword arguments, type hints, and default values.\n      signature_params +=\n          GenIndents(2) + field_field + \" = \" + default_value + \",\";\n\n      // Build the body of the __init__ method.\n      init_body += GenIndents(2) + \"self.\" + field_field + \" = \" + field_field +\n                   \"  # type: \" + field_type;\n    }\n\n    // Writes __init__ method.\n    auto& code_base = *code_ptr;\n    GenReceiverForObjectAPI(struct_def, code_ptr);\n    code_base += \"__init__(\" + signature_params + GenIndents(1) + \"):\";\n    if (init_body.empty()) {\n      code_base += GenIndents(2) + \"pass\";\n    } else {\n      code_base += init_body;\n    }\n    code_base += \"\\n\";\n\n    // Merges the typing imports into import_list.\n    if (!import_typing_list.empty()) {\n      // Adds the try statement.\n      std::string typing_imports = \"try:\";\n      typing_imports += GenIndents(1) + \"from typing import \";\n      std::string separator_string = \", \";\n      for (auto it = import_typing_list.begin(); it != import_typing_list.end();\n           ++it) {\n        const std::string& im = *it;\n        typing_imports += im + separator_string;\n      }\n      // Removes the last separator_string.\n      typing_imports.erase(typing_imports.length() - separator_string.size());\n\n      // Adds the except statement.\n      typing_imports += \"\\n\";\n      typing_imports += \"except:\";\n      typing_imports += GenIndents(1) + \"pass\";\n      import_list->insert(typing_imports);\n    }\n\n    // Removes the import of the struct itself, if applied.\n    auto struct_import = \"import \" + namer_.NamespacedType(struct_def);\n    import_list->erase(struct_import);\n  }\n\n  void InitializeFromBuf(const StructDef& struct_def,\n                         std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    const auto struct_var = namer_.Variable(struct_def);\n    const auto struct_type = namer_.Type(struct_def);\n\n    code += GenIndents(1) + \"@classmethod\";\n    code += GenIndents(1) + \"def InitFromBuf(cls, buf, pos):\";\n    code += GenIndents(2) + struct_var + \" = \" + struct_type + \"()\";\n    code += GenIndents(2) + struct_var + \".Init(buf, pos)\";\n    code += GenIndents(2) + \"return cls.InitFromObj(\" + struct_var + \")\";\n    code += \"\\n\";\n  }\n\n  void InitializeFromPackedBuf(const StructDef& struct_def,\n                               std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    const auto struct_var = namer_.Variable(struct_def);\n    const auto struct_type = namer_.Type(struct_def);\n\n    code += GenIndents(1) + \"@classmethod\";\n    code += GenIndents(1) + \"def InitFromPackedBuf(cls, buf, pos=0):\";\n    code += GenIndents(2) +\n            \"n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\";\n    code += GenIndents(2) + \"return cls.InitFromBuf(buf, pos+n)\";\n    code += \"\\n\";\n  }\n\n  void InitializeFromObjForObject(const StructDef& struct_def,\n                                  std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    const auto struct_var = namer_.Variable(struct_def);\n    const auto struct_object = namer_.ObjectType(struct_def);\n\n    code += GenIndents(1) + \"@classmethod\";\n    code += GenIndents(1) + \"def InitFromObj(cls, \" + struct_var + \"):\";\n    code += GenIndents(2) + \"x = \" + struct_object + \"()\";\n    code += GenIndents(2) + \"x._UnPack(\" + struct_var + \")\";\n    code += GenIndents(2) + \"return x\";\n    code += \"\\n\";\n  }\n\n  void GenCompareOperator(const StructDef& struct_def,\n                          std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    code += GenIndents(1) + \"def __eq__(self, other):\";\n    code += GenIndents(2) + \"return type(self) == type(other)\";\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (field.deprecated) continue;\n\n      // Writes the comparison statement for this field.\n      const auto field_name = namer_.Field(field);\n      if (parser_.opts.python_gen_numpy &&\n          field.value.type.base_type == BASE_TYPE_VECTOR) {\n        code += \" and \\\\\" + GenIndents(3) + \"np.array_equal(self.\" +\n                field_name + \", \" + \"other.\" + field_name + \")\";\n      } else {\n        code += \" and \\\\\" + GenIndents(3) + \"self.\" + field_name +\n                \" == \" + \"other.\" + field_name;\n      }\n    }\n    code += \"\\n\";\n  }\n\n  void GenUnPackForStruct(const StructDef& struct_def, const FieldDef& field,\n                          std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    const auto struct_var = namer_.Variable(struct_def);\n    const auto field_field = namer_.Field(field);\n    const auto field_method = namer_.Method(field);\n    auto field_type = TypeName(field);\n\n    if (parser_.opts.include_dependence_headers) {\n      auto package_reference = GenPackageReference(field.value.type);\n      field_type = package_reference + \".\" + TypeName(field);\n    }\n\n    code += GenIndents(2) + \"if \" + struct_var + \".\" + field_method + \"(\";\n    // if field is a struct, we need to create an instance for it first.\n    if (struct_def.fixed && field.value.type.base_type == BASE_TYPE_STRUCT) {\n      code += field_type + \"()\";\n    }\n    code += \") is not None:\";\n    code += GenIndents(3) + \"self.\" + field_field + \" = \" +\n            namer_.ObjectType(field_type) + +\".InitFromObj(\" + struct_var +\n            \".\" + field_method + \"(\";\n    // A struct's accessor requires a struct buf instance.\n    if (struct_def.fixed && field.value.type.base_type == BASE_TYPE_STRUCT) {\n      code += field_type + \"()\";\n    }\n    code += \"))\";\n  }\n\n  void GenUnPackForUnion(const StructDef& struct_def, const FieldDef& field,\n                         std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    const auto field_field = namer_.Field(field);\n    const auto field_method = namer_.Method(field);\n    const auto struct_var = namer_.Variable(struct_def);\n    const EnumDef& enum_def = *field.value.type.enum_def;\n    auto union_fn = namer_.Function(enum_def);\n\n    if (parser_.opts.include_dependence_headers) {\n      union_fn = namer_.NamespacedType(enum_def) + \".\" + union_fn;\n    }\n    code += GenIndents(2) + \"self.\" + field_field + \" = \" + union_fn +\n            \"Creator(\" + \"self.\" + field_field + \"Type, \" + struct_var + \".\" +\n            field_method + \"())\";\n  }\n\n  void GenUnPackForStructVector(const StructDef& struct_def,\n                                const FieldDef& field,\n                                std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    const auto field_field = namer_.Field(field);\n    const auto field_method = namer_.Method(field);\n    const auto struct_var = namer_.Variable(struct_def);\n\n    code += GenIndents(2) + \"if not \" + struct_var + \".\" + field_method +\n            \"IsNone():\";\n    code += GenIndents(3) + \"self.\" + field_field + \" = []\";\n    code += GenIndents(3) + \"for i in range(\" + struct_var + \".\" +\n            field_method + \"Length()):\";\n\n    auto field_type = TypeName(field);\n    auto one_instance = field_type + \"_\";\n    one_instance[0] = CharToLower(one_instance[0]);\n    if (parser_.opts.include_dependence_headers) {\n      auto package_reference = GenPackageReference(field.value.type);\n      field_type = package_reference + \".\" + TypeName(field);\n    }\n    code += GenIndents(4) + \"if \" + struct_var + \".\" + field_method +\n            \"(i) is None:\";\n    code += GenIndents(5) + \"self.\" + field_field + \".append(None)\";\n    code += GenIndents(4) + \"else:\";\n    code += GenIndents(5) + one_instance + \" = \" +\n            namer_.ObjectType(field_type) + \".InitFromObj(\" + struct_var + \".\" +\n            field_method + \"(i))\";\n    code +=\n        GenIndents(5) + \"self.\" + field_field + \".append(\" + one_instance + \")\";\n  }\n\n  void GenUnpackForTableVector(const StructDef& struct_def,\n                               const FieldDef& field,\n                               std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    const auto field_field = namer_.Field(field);\n    const auto field_method = namer_.Method(field);\n    const auto struct_var = namer_.Variable(struct_def);\n\n    code += GenIndents(2) + \"if not \" + struct_var + \".\" + field_method +\n            \"IsNone():\";\n    code += GenIndents(3) + \"self.\" + field_field + \" = []\";\n    code += GenIndents(3) + \"for i in range(\" + struct_var + \".\" +\n            field_method + \"Length()):\";\n\n    auto field_type = TypeName(field);\n    auto one_instance = field_type + \"_\";\n    one_instance[0] = CharToLower(one_instance[0]);\n    if (parser_.opts.include_dependence_headers) {\n      auto package_reference = GenPackageReference(field.value.type);\n      field_type = package_reference + \".\" + TypeName(field);\n    }\n    code += GenIndents(4) + \"if \" + struct_var + \".\" + field_method +\n            \"(i) is None:\";\n    code += GenIndents(5) + \"self.\" + field_field + \".append(None)\";\n    code += GenIndents(4) + \"else:\";\n    code += GenIndents(5) + one_instance + \" = \" +\n            namer_.ObjectType(field_type) + \".InitFromObj(\" + struct_var + \".\" +\n            field_method + \"(i))\";\n    code +=\n        GenIndents(5) + \"self.\" + field_field + \".append(\" + one_instance + \")\";\n  }\n\n  void GenUnpackforScalarVectorHelper(const StructDef& struct_def,\n                                      const FieldDef& field,\n                                      std::string* code_ptr,\n                                      int indents) const {\n    auto& code = *code_ptr;\n    const auto field_field = namer_.Field(field);\n    const auto field_method = namer_.Method(field);\n    const auto struct_var = namer_.Variable(struct_def);\n\n    code += GenIndents(indents) + \"self.\" + field_field + \" = []\";\n    code += GenIndents(indents) + \"for i in range(\" + struct_var + \".\" +\n            field_method + \"Length()):\";\n    code += GenIndents(indents + 1) + \"self.\" + field_field + \".append(\" +\n            struct_var + \".\" + field_method + \"(i))\";\n  }\n\n  void GenUnPackForScalarVector(const StructDef& struct_def,\n                                const FieldDef& field,\n                                std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    const auto field_field = namer_.Field(field);\n    const auto field_method = namer_.Method(field);\n    const auto struct_var = namer_.Variable(struct_def);\n\n    code += GenIndents(2) + \"if not \" + struct_var + \".\" + field_method +\n            \"IsNone():\";\n\n    // String does not have the AsNumpy method.\n    if (!(IsScalar(field.value.type.VectorType().base_type))) {\n      GenUnpackforScalarVectorHelper(struct_def, field, code_ptr, 3);\n      return;\n    }\n\n    if (parser_.opts.python_gen_numpy) {\n      code += GenIndents(3) + \"if np is None:\";\n      GenUnpackforScalarVectorHelper(struct_def, field, code_ptr, 4);\n\n      // If numpy exists, use the AsNumpy method to optimize the unpack speed.\n      code += GenIndents(3) + \"else:\";\n      code += GenIndents(4) + \"self.\" + field_field + \" = \" + struct_var + \".\" +\n              field_method + \"AsNumpy()\";\n    } else {\n      GenUnpackforScalarVectorHelper(struct_def, field, code_ptr, 3);\n    }\n  }\n\n  void GenUnPackForString(const StructDef& struct_def, const FieldDef& field,\n                          std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    const auto field_field = namer_.Field(field);\n    const auto field_method = namer_.Method(field);\n    const auto struct_var = namer_.Variable(struct_def);\n\n    code += GenIndents(2) + \"self.\" + field_field + \" = \" + struct_var + \".\" +\n            field_method + \"()\";\n    code += GenIndents(2) + \"if self.\" + field_field + \" is not None:\";\n    code += GenIndents(3) + \"self.\" + field_field + \" = self.\" + field_field +\n            \".decode('utf-8')\";\n  }\n\n  void GenUnPackForScalar(const StructDef& struct_def, const FieldDef& field,\n                          std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    const auto field_field = namer_.Field(field);\n    const auto field_method = namer_.Method(field);\n    const auto struct_var = namer_.Variable(struct_def);\n\n    code += GenIndents(2) + \"self.\" + field_field + \" = \" + struct_var + \".\" +\n            field_method + \"()\";\n  }\n\n  // Generates the UnPack method for the object class.\n  void GenUnPack(const StructDef& struct_def, std::string* code_ptr) const {\n    std::string code;\n    // Items that needs to be imported. No duplicate modules will be imported.\n    std::set<std::string> import_list;\n\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (field.deprecated) continue;\n\n      switch (field.value.type.base_type) {\n        case BASE_TYPE_STRUCT: {\n          GenUnPackForStruct(struct_def, field, &code);\n          break;\n        }\n        case BASE_TYPE_UNION: {\n          GenUnPackForUnion(struct_def, field, &code);\n          break;\n        }\n        case BASE_TYPE_ARRAY:\n        case BASE_TYPE_VECTOR: {\n          auto vectortype = field.value.type.VectorType();\n          if (vectortype.base_type == BASE_TYPE_STRUCT) {\n            GenUnPackForStructVector(struct_def, field, &code);\n          } else {\n            GenUnPackForScalarVector(struct_def, field, &code);\n          }\n          break;\n        }\n        case BASE_TYPE_STRING: {\n          if (parser_.opts.python_decode_obj_api_strings) {\n            GenUnPackForString(struct_def, field, &code);\n          } else {\n            GenUnPackForScalar(struct_def, field, &code);\n          }\n          break;\n        }\n        default:\n          GenUnPackForScalar(struct_def, field, &code);\n      }\n    }\n\n    // Writes import statements and code into the generated file.\n    auto& code_base = *code_ptr;\n    const auto struct_var = namer_.Variable(struct_def);\n\n    GenReceiverForObjectAPI(struct_def, code_ptr);\n    code_base += \"_UnPack(self, \" + struct_var + \"):\";\n    code_base += GenIndents(2) + \"if \" + struct_var + \" is None:\";\n    code_base += GenIndents(3) + \"return\";\n\n    // Write the import statements.\n    for (std::set<std::string>::iterator it = import_list.begin();\n         it != import_list.end(); ++it) {\n      code_base += GenIndents(2) + *it;\n    }\n\n    // Write the code.\n    code_base += code;\n    code_base += \"\\n\";\n  }\n\n  void GenPackForStruct(const StructDef& struct_def,\n                        std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    const auto struct_fn = namer_.Function(struct_def);\n\n    GenReceiverForObjectAPI(struct_def, code_ptr);\n    code += \"Pack(self, builder):\";\n    code += GenIndents(2) + \"return Create\" + struct_fn + \"(builder\";\n\n    StructBuilderArgs(struct_def,\n                      /* nameprefix = */ \"self.\",\n                      /* namesuffix = */ \"\",\n                      /* has_field_name = */ true,\n                      /* fieldname_suffix = */ \".\", code_ptr);\n    code += \")\\n\";\n  }\n\n  void GenPackForStructVectorField(const StructDef& struct_def,\n                                   const FieldDef& field,\n                                   std::string* code_prefix_ptr,\n                                   std::string* code_ptr) const {\n    auto& code_prefix = *code_prefix_ptr;\n    auto& code = *code_ptr;\n    const auto field_field = namer_.Field(field);\n    const auto struct_type = namer_.Type(struct_def);\n    const auto field_method = namer_.Method(field);\n\n    // Creates the field.\n    code_prefix += GenIndents(2) + \"if self.\" + field_field + \" is not None:\";\n    if (field.value.type.struct_def->fixed) {\n      code_prefix += GenIndents(3) + struct_type + \"Start\" + field_method +\n                     \"Vector(builder, len(self.\" + field_field + \"))\";\n      code_prefix += GenIndents(3) + \"for i in reversed(range(len(self.\" +\n                     field_field + \"))):\";\n      code_prefix +=\n          GenIndents(4) + \"self.\" + field_field + \"[i].Pack(builder)\";\n      code_prefix += GenIndents(3) + field_field + \" = builder.EndVector()\";\n    } else {\n      // If the vector is a struct vector, we need to first build accessor for\n      // each struct element.\n      code_prefix += GenIndents(3) + field_field + \"list = []\";\n      code_prefix += GenIndents(3);\n      code_prefix += \"for i in range(len(self.\" + field_field + \")):\";\n      code_prefix += GenIndents(4) + field_field + \"list.append(self.\" +\n                     field_field + \"[i].Pack(builder))\";\n\n      code_prefix += GenIndents(3) + struct_type + \"Start\" + field_method +\n                     \"Vector(builder, len(self.\" + field_field + \"))\";\n      code_prefix += GenIndents(3) + \"for i in reversed(range(len(self.\" +\n                     field_field + \"))):\";\n      code_prefix += GenIndents(4) + \"builder.PrependUOffsetTRelative\" + \"(\" +\n                     field_field + \"list[i])\";\n      code_prefix += GenIndents(3) + field_field + \" = builder.EndVector()\";\n    }\n\n    // Adds the field into the struct.\n    code += GenIndents(2) + \"if self.\" + field_field + \" is not None:\";\n    code += GenIndents(3) + struct_type + \"Add\" + field_method + \"(builder, \" +\n            field_field + \")\";\n  }\n\n  void GenPackForScalarVectorFieldHelper(const StructDef& struct_def,\n                                         const FieldDef& field,\n                                         std::string* code_ptr,\n                                         int indents) const {\n    auto& code = *code_ptr;\n    const auto field_field = namer_.Field(field);\n    const auto field_method = namer_.Method(field);\n    const auto struct_type = namer_.Type(struct_def);\n    const auto vectortype = field.value.type.VectorType();\n\n    code += GenIndents(indents) + struct_type + \"Start\" + field_method +\n            \"Vector(builder, len(self.\" + field_field + \"))\";\n    code += GenIndents(indents) + \"for i in reversed(range(len(self.\" +\n            field_field + \"))):\";\n    code += GenIndents(indents + 1) + \"builder.Prepend\";\n\n    std::string type_name;\n    switch (vectortype.base_type) {\n      case BASE_TYPE_BOOL:\n        type_name = \"Bool\";\n        break;\n      case BASE_TYPE_CHAR:\n        type_name = \"Byte\";\n        break;\n      case BASE_TYPE_UCHAR:\n        type_name = \"Uint8\";\n        break;\n      case BASE_TYPE_SHORT:\n        type_name = \"Int16\";\n        break;\n      case BASE_TYPE_USHORT:\n        type_name = \"Uint16\";\n        break;\n      case BASE_TYPE_INT:\n        type_name = \"Int32\";\n        break;\n      case BASE_TYPE_UINT:\n        type_name = \"Uint32\";\n        break;\n      case BASE_TYPE_LONG:\n        type_name = \"Int64\";\n        break;\n      case BASE_TYPE_ULONG:\n        type_name = \"Uint64\";\n        break;\n      case BASE_TYPE_FLOAT:\n        type_name = \"Float32\";\n        break;\n      case BASE_TYPE_DOUBLE:\n        type_name = \"Float64\";\n        break;\n      case BASE_TYPE_STRING:\n        type_name = \"UOffsetTRelative\";\n        break;\n      default:\n        type_name = \"VOffsetT\";\n        break;\n    }\n    code += type_name;\n  }\n\n  void GenPackForScalarVectorField(const StructDef& struct_def,\n                                   const FieldDef& field,\n                                   std::string* code_prefix_ptr,\n                                   std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    auto& code_prefix = *code_prefix_ptr;\n    const auto field_field = namer_.Field(field);\n    const auto field_method = namer_.Method(field);\n    const auto struct_type = namer_.Type(struct_def);\n\n    // Adds the field into the struct.\n    code += GenIndents(2) + \"if self.\" + field_field + \" is not None:\";\n    code += GenIndents(3) + struct_type + \"Add\" + field_method + \"(builder, \" +\n            field_field + \")\";\n\n    // Creates the field.\n    code_prefix += GenIndents(2) + \"if self.\" + field_field + \" is not None:\";\n    // If the vector is a string vector, we need to first build accessor for\n    // each string element. And this generated code, needs to be\n    // placed ahead of code_prefix.\n    auto vectortype = field.value.type.VectorType();\n    if (IsString(vectortype)) {\n      code_prefix += GenIndents(3) + field_field + \"list = []\";\n      code_prefix +=\n          GenIndents(3) + \"for i in range(len(self.\" + field_field + \")):\";\n      code_prefix += GenIndents(4) + field_field +\n                     \"list.append(builder.CreateString(self.\" + field_field +\n                     \"[i]))\";\n      GenPackForScalarVectorFieldHelper(struct_def, field, code_prefix_ptr, 3);\n      code_prefix += \"(\" + field_field + \"list[i])\";\n      code_prefix += GenIndents(3) + field_field + \" = builder.EndVector()\";\n      return;\n    }\n\n    if (parser_.opts.python_gen_numpy) {\n      code_prefix += GenIndents(3) + \"if np is not None and type(self.\" +\n                     field_field + \") is np.ndarray:\";\n      code_prefix += GenIndents(4) + field_field +\n                     \" = builder.CreateNumpyVector(self.\" + field_field + \")\";\n      code_prefix += GenIndents(3) + \"else:\";\n      GenPackForScalarVectorFieldHelper(struct_def, field, code_prefix_ptr, 4);\n      code_prefix += \"(self.\" + field_field + \"[i])\";\n      code_prefix += GenIndents(4) + field_field + \" = builder.EndVector()\";\n    } else {\n      GenPackForScalarVectorFieldHelper(struct_def, field, code_prefix_ptr, 3);\n      code_prefix += \"(self.\" + field_field + \"[i])\";\n      code_prefix += GenIndents(4) + field_field + \" = builder.EndVector()\";\n    }\n  }\n\n  void GenPackForStructField(const StructDef& struct_def, const FieldDef& field,\n                             std::string* code_prefix_ptr,\n                             std::string* code_ptr) const {\n    auto& code_prefix = *code_prefix_ptr;\n    auto& code = *code_ptr;\n    const auto field_field = namer_.Field(field);\n    const auto field_method = namer_.Method(field);\n    const auto struct_type = namer_.Type(struct_def);\n\n    if (field.value.type.struct_def->fixed) {\n      // Pure struct fields need to be created along with their parent\n      // structs.\n      code += GenIndents(2) + \"if self.\" + field_field + \" is not None:\";\n      code += GenIndents(3) + field_field + \" = self.\" + field_field +\n              \".Pack(builder)\";\n    } else {\n      // Tables need to be created before their parent structs are created.\n      code_prefix += GenIndents(2) + \"if self.\" + field_field + \" is not None:\";\n      code_prefix += GenIndents(3) + field_field + \" = self.\" + field_field +\n                     \".Pack(builder)\";\n      code += GenIndents(2) + \"if self.\" + field_field + \" is not None:\";\n    }\n\n    code += GenIndents(3) + struct_type + \"Add\" + field_method + \"(builder, \" +\n            field_field + \")\";\n  }\n\n  void GenPackForUnionField(const StructDef& struct_def, const FieldDef& field,\n                            std::string* code_prefix_ptr,\n                            std::string* code_ptr) const {\n    auto& code_prefix = *code_prefix_ptr;\n    auto& code = *code_ptr;\n    const auto field_field = namer_.Field(field);\n    const auto field_method = namer_.Method(field);\n    const auto struct_type = namer_.Type(struct_def);\n\n    // TODO(luwa): TypeT should be moved under the None check as well.\n    code_prefix += GenIndents(2) + \"if self.\" + field_field + \" is not None:\";\n    code_prefix += GenIndents(3) + field_field + \" = self.\" + field_field +\n                   \".Pack(builder)\";\n    code += GenIndents(2) + \"if self.\" + field_field + \" is not None:\";\n    code += GenIndents(3) + struct_type + \"Add\" + field_method + \"(builder, \" +\n            field_field + \")\";\n  }\n\n  void GenPackForTable(const StructDef& struct_def,\n                       std::string* code_ptr) const {\n    auto& code_base = *code_ptr;\n    std::string code, code_prefix;\n    const auto struct_var = namer_.Variable(struct_def);\n    const auto struct_type = namer_.Type(struct_def);\n\n    GenReceiverForObjectAPI(struct_def, code_ptr);\n    code_base += \"Pack(self, builder):\";\n    code += GenIndents(2) + struct_type + \"Start(builder)\";\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (field.deprecated) continue;\n\n      const auto field_method = namer_.Method(field);\n      const auto field_field = namer_.Field(field);\n\n      switch (field.value.type.base_type) {\n        case BASE_TYPE_STRUCT: {\n          GenPackForStructField(struct_def, field, &code_prefix, &code);\n          break;\n        }\n        case BASE_TYPE_UNION: {\n          GenPackForUnionField(struct_def, field, &code_prefix, &code);\n          break;\n        }\n        case BASE_TYPE_ARRAY:\n        case BASE_TYPE_VECTOR: {\n          auto vectortype = field.value.type.VectorType();\n          if (vectortype.base_type == BASE_TYPE_STRUCT) {\n            GenPackForStructVectorField(struct_def, field, &code_prefix, &code);\n          } else {\n            GenPackForScalarVectorField(struct_def, field, &code_prefix, &code);\n          }\n          break;\n        }\n        case BASE_TYPE_STRING: {\n          code_prefix +=\n              GenIndents(2) + \"if self.\" + field_field + \" is not None:\";\n          code_prefix += GenIndents(3) + field_field +\n                         \" = builder.CreateString(self.\" + field_field + \")\";\n          code += GenIndents(2) + \"if self.\" + field_field + \" is not None:\";\n          code += GenIndents(3) + struct_type + \"Add\" + field_method +\n                  \"(builder, \" + field_field + \")\";\n          break;\n        }\n        default:\n          // Generates code for scalar values. If the value equals to the\n          // default value, builder will automatically ignore it. So we don't\n          // need to check the value ahead.\n          code += GenIndents(2) + struct_type + \"Add\" + field_method +\n                  \"(builder, self.\" + field_field + \")\";\n          break;\n      }\n    }\n\n    code += GenIndents(2) + struct_var + \" = \" + struct_type + \"End(builder)\";\n    code += GenIndents(2) + \"return \" + struct_var;\n\n    code_base += code_prefix + code;\n    code_base += \"\\n\";\n  }\n\n  void GenStructForObjectAPI(const StructDef& struct_def,\n                             std::string* code_ptr) const {\n    if (struct_def.generated) return;\n\n    std::set<std::string> import_list;\n    std::string code;\n\n    // Creates an object class for a struct or a table\n    BeginClassForObjectAPI(struct_def, &code);\n\n    GenInitialize(struct_def, &code, &import_list);\n\n    InitializeFromBuf(struct_def, &code);\n\n    InitializeFromPackedBuf(struct_def, &code);\n\n    InitializeFromObjForObject(struct_def, &code);\n\n    if (parser_.opts.gen_compare) {\n      GenCompareOperator(struct_def, &code);\n    }\n\n    GenUnPack(struct_def, &code);\n\n    if (struct_def.fixed) {\n      GenPackForStruct(struct_def, &code);\n    } else {\n      GenPackForTable(struct_def, &code);\n    }\n\n    // Adds the imports at top.\n    auto& code_base = *code_ptr;\n    code_base += \"\\n\";\n    for (auto it = import_list.begin(); it != import_list.end(); it++) {\n      auto im = *it;\n      code_base += im + \"\\n\";\n    }\n    code_base += code;\n  }\n\n  void GenUnionCreatorForStruct(const EnumDef& enum_def, const EnumVal& ev,\n                                std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    const auto union_type = namer_.Type(enum_def);\n    const auto variant = namer_.Variant(ev);\n    auto field_type = namer_.ObjectType(*ev.union_type.struct_def);\n\n    code +=\n        GenIndents(1) + \"if unionType == \" + union_type + \".\" + variant + \":\";\n    if (parser_.opts.include_dependence_headers) {\n      auto package_reference = GenPackageReference(ev.union_type);\n      code += GenIndents(2) + \"import \" + package_reference;\n      field_type = package_reference + \".\" + field_type;\n    }\n    code += GenIndents(2) + \"return \" + field_type +\n            \".InitFromBuf(table.Bytes, table.Pos)\";\n  }\n\n  void GenUnionCreatorForString(const EnumDef& enum_def, const EnumVal& ev,\n                                std::string* code_ptr) const {\n    auto& code = *code_ptr;\n    const auto union_type = namer_.Type(enum_def);\n    const auto variant = namer_.Variant(ev);\n\n    code +=\n        GenIndents(1) + \"if unionType == \" + union_type + \"().\" + variant + \":\";\n    code += GenIndents(2) + \"tab = Table(table.Bytes, table.Pos)\";\n    code += GenIndents(2) + \"union = tab.String(table.Pos)\";\n    code += GenIndents(2) + \"return union\";\n  }\n\n  // Creates an union object based on union type.\n  void GenUnionCreator(const EnumDef& enum_def, std::string* code_ptr) const {\n    if (enum_def.generated) return;\n\n    auto& code = *code_ptr;\n    const auto enum_fn = namer_.Function(enum_def);\n\n    code += \"\\n\";\n    code += \"def \" + enum_fn + \"Creator(unionType, table):\";\n    code += GenIndents(1) + \"from flatbuffers.table import Table\";\n    code += GenIndents(1) + \"if not isinstance(table, Table):\";\n    code += GenIndents(2) + \"return None\";\n\n    for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {\n      auto& ev = **it;\n      // Union only supports string and table.\n      switch (ev.union_type.base_type) {\n        case BASE_TYPE_STRUCT:\n          GenUnionCreatorForStruct(enum_def, ev, &code);\n          break;\n        case BASE_TYPE_STRING:\n          GenUnionCreatorForString(enum_def, ev, &code);\n          break;\n        default:\n          break;\n      }\n    }\n    code += GenIndents(1) + \"return None\";\n    code += \"\\n\";\n  }\n\n  // Generate enum declarations.\n  void GenEnum(const EnumDef& enum_def, std::string* code_ptr) const {\n    if (enum_def.generated) return;\n\n    GenComment(enum_def.doc_comment, code_ptr, &def_comment);\n    BeginEnum(enum_def, code_ptr);\n    for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {\n      auto& ev = **it;\n      GenComment(ev.doc_comment, code_ptr, &def_comment, Indent.c_str());\n      EnumMember(enum_def, ev, code_ptr);\n    }\n  }\n\n  // Returns the function name that is able to read a value of the given type.\n  std::string GenGetter(const Type& type) const {\n    switch (type.base_type) {\n      case BASE_TYPE_STRING:\n        return \"self._tab.String(\";\n      case BASE_TYPE_UNION:\n        return \"self._tab.Union(\";\n      case BASE_TYPE_VECTOR:\n        return GenGetter(type.VectorType());\n      default:\n        return \"self._tab.Get(flatbuffers.number_types.\" +\n               namer_.Method(GenTypeGet(type)) + \"Flags, \";\n    }\n  }\n\n  std::string GenFieldTy(const FieldDef& field) const {\n    if (IsScalar(field.value.type.base_type) || IsArray(field.value.type)) {\n      const std::string ty = GenTypeBasic(field.value.type);\n      if (ty.find(\"int\") != std::string::npos) {\n        return \"int\";\n      }\n\n      if (ty.find(\"float\") != std::string::npos) {\n        return \"float\";\n      }\n\n      if (ty == \"bool\") {\n        return \"bool\";\n      }\n\n      return \"Any\";\n    } else {\n      if (IsStruct(field.value.type)) {\n        return \"Any\";\n      } else {\n        return \"int\";\n      }\n    }\n  }\n\n  // Returns the method name for use with add/put calls.\n  std::string GenMethod(const FieldDef& field) const {\n    return (IsScalar(field.value.type.base_type) || IsArray(field.value.type))\n               ? namer_.Method(GenTypeBasic(field.value.type))\n               : (IsStruct(field.value.type) ? \"Struct\" : \"UOffsetTRelative\");\n  }\n\n  std::string GenTypeBasic(const Type& type) const {\n    // clang-format off\n    static const char *ctypename[] = {\n      #define FLATBUFFERS_TD(ENUM, IDLTYPE, \\\n              CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, ...) \\\n        #PTYPE,\n        FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)\n      #undef FLATBUFFERS_TD\n    };\n    // clang-format on\n    return ctypename[IsArray(type) ? type.VectorType().base_type\n                                   : type.base_type];\n  }\n\n  std::string GenTypePointer(const Type& type) const {\n    switch (type.base_type) {\n      case BASE_TYPE_STRING:\n        return \"string\";\n      case BASE_TYPE_VECTOR:\n        // fall through\n      case BASE_TYPE_ARRAY:\n        return GenTypeGet(type.VectorType());\n      case BASE_TYPE_STRUCT:\n        return type.struct_def->name;\n      case BASE_TYPE_UNION:\n        // fall through\n      default:\n        return \"*flatbuffers.Table\";\n    }\n  }\n\n  std::string GenTypeGet(const Type& type) const {\n    return IsScalar(type.base_type) ? GenTypeBasic(type) : GenTypePointer(type);\n  }\n\n  std::string TypeName(const FieldDef& field) const {\n    return GenTypeGet(field.value.type);\n  }\n\n  std::string ReturnType(const StructDef& struct_def,\n                         const FieldDef& field) const {\n    // If we have a class member that returns an instance of the same class,\n    // for example:\n    // class Field(object):\n    //   def Children(self, j: int) -> Optional[Field]:\n    //     pass\n    //\n    // we need to quote the return type:\n    // class Field(object):\n    //   def Children(self, j: int) -> Optional['Field']:\n    //     pass\n    //\n    // because Python is unable to resolve the name during parse and will return\n    // an error.\n    // (see PEP 484 under forward references:\n    // https://peps.python.org/pep-0484/#forward-references)\n    const std::string self_type = struct_def.name;\n    std::string field_type = TypeName(field);\n\n    if (self_type == field_type) {\n      field_type = \"'\" + field_type + \"'\";\n    }\n\n    return field_type;\n  }\n\n  // Create a struct with a builder and the struct's arguments.\n  void GenStructBuilder(const StructDef& struct_def,\n                        std::string* code_ptr) const {\n    BeginBuilderArgs(struct_def, code_ptr);\n    StructBuilderArgs(struct_def,\n                      /* nameprefix = */ \"\",\n                      /* namesuffix = */ \"\",\n                      /* has_field_name = */ true,\n                      /* fieldname_suffix = */ \"_\", code_ptr);\n    EndBuilderArgs(code_ptr);\n\n    StructBuilderBody(struct_def, \"\", code_ptr);\n    EndBuilderBody(code_ptr);\n  }\n\n  bool generate() {\n    std::string one_file_code;\n    ImportMap one_file_imports;\n    if (!generateEnums(&one_file_code)) return false;\n    if (!generateStructs(&one_file_code, one_file_imports)) return false;\n\n    if (parser_.opts.one_file) {\n      const std::string mod = file_name_ + parser_.opts.filename_suffix;\n\n      // Legacy file format uses keep casing.\n      return SaveType(mod + \".py\", *parser_.current_namespace_, one_file_code,\n                      one_file_imports, mod, true);\n    }\n\n    return true;\n  }\n\n private:\n  bool generateEnums(std::string* one_file_code) const {\n    for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end();\n         ++it) {\n      auto& enum_def = **it;\n      std::string enumcode;\n      GenEnum(enum_def, &enumcode);\n      if (parser_.opts.generate_object_based_api & enum_def.is_union) {\n        GenUnionCreator(enum_def, &enumcode);\n      }\n\n      if (parser_.opts.one_file && !enumcode.empty()) {\n        *one_file_code += enumcode + \"\\n\\n\";\n      } else {\n        ImportMap imports;\n        const std::string mod =\n            namer_.File(enum_def, SkipFile::SuffixAndExtension);\n\n        if (!SaveType(namer_.File(enum_def, SkipFile::Suffix),\n                      *enum_def.defined_namespace, enumcode, imports, mod,\n                      false))\n          return false;\n      }\n    }\n    return true;\n  }\n\n  bool generateStructs(std::string* one_file_code,\n                       ImportMap& one_file_imports) const {\n    for (auto it = parser_.structs_.vec.begin();\n         it != parser_.structs_.vec.end(); ++it) {\n      auto& struct_def = **it;\n      std::string declcode;\n      ImportMap imports;\n      GenStruct(struct_def, &declcode, imports);\n      if (parser_.opts.generate_object_based_api) {\n        GenStructForObjectAPI(struct_def, &declcode);\n      }\n\n      if (parser_.opts.one_file) {\n        if (!declcode.empty()) {\n          *one_file_code += declcode + \"\\n\\n\";\n        }\n\n        for (auto import_str : imports) {\n          one_file_imports.insert(import_str);\n        }\n      } else {\n        const std::string mod =\n            namer_.File(struct_def, SkipFile::SuffixAndExtension);\n        if (!SaveType(namer_.File(struct_def, SkipFile::Suffix),\n                      *struct_def.defined_namespace, declcode, imports, mod,\n                      true))\n          return false;\n      }\n    }\n    return true;\n  }\n\n  // Begin by declaring namespace and imports.\n  void BeginFile(const std::string& name_space_name, const bool needs_imports,\n                 std::string* code_ptr, const std::string& mod,\n                 const ImportMap& imports) const {\n    auto& code = *code_ptr;\n    code = code + \"# \" + FlatBuffersGeneratedWarning() + \"\\n\\n\";\n    code += \"# namespace: \" + name_space_name + \"\\n\\n\";\n\n    if (needs_imports) {\n      const std::string local_import = \".\" + mod;\n\n      code += \"import flatbuffers\\n\";\n      if (parser_.opts.python_gen_numpy) {\n        code += \"from flatbuffers.compat import import_numpy\\n\";\n      }\n      if (parser_.opts.python_typing) {\n        code += \"from typing import Any\\n\";\n\n        for (auto import_entry : imports) {\n          // If we have a file called, say, \"MyType.py\" and in it we have a\n          // class \"MyType\", we can generate imports -- usually when we\n          // have a type that contains arrays of itself -- of the type\n          // \"from .MyType import MyType\", which Python can't resolve. So\n          // if we are trying to import ourself, we skip.\n          if (import_entry.first != local_import) {\n            code += \"from \" + import_entry.first + \" import \" +\n                    import_entry.second + \"\\n\";\n          }\n        }\n      }\n      if (parser_.opts.python_gen_numpy) {\n        code += \"np = import_numpy()\\n\\n\";\n      }\n    }\n  }\n\n  // Save out the generated code for a Python Table type.\n  bool SaveType(const std::string& defname, const Namespace& ns,\n                const std::string& classcode, const ImportMap& imports,\n                const std::string& mod, bool needs_imports) const {\n    if (classcode.empty()) return true;\n\n    std::string code = \"\";\n    BeginFile(LastNamespacePart(ns), needs_imports, &code, mod, imports);\n    code += classcode;\n\n    const std::string directories =\n        parser_.opts.one_file ? path_ : namer_.Directories(ns.components);\n    EnsureDirExists(directories);\n\n    for (size_t i = directories.find(kPathSeparator, path_.size());\n         i != std::string::npos; i = directories.find(kPathSeparator, i + 1)) {\n      const std::string init_py =\n          directories.substr(0, i) + kPathSeparator + \"__init__.py\";\n      parser_.opts.file_saver->SaveFile(init_py.c_str(), \"\", false);\n    }\n\n    const std::string filename = directories + defname;\n    return parser_.opts.file_saver->SaveFile(filename.c_str(), code, false);\n  }\n\n private:\n  const SimpleFloatConstantGenerator float_const_gen_;\n  const IdlNamer namer_;\n};\n\n}  // namespace python\n\nstatic const char* GeneratePython(const Parser& parser, const std::string& path,\n                                  const std::string& file_name) {\n  python::Version version{parser.opts.python_version};\n  if (!version.IsValid()) return \"The provided Python version is not valid\";\n\n  python::PythonGenerator generator(parser, path, file_name, version);\n  if (!generator.generate()) return \"could not generate Python code\";\n\n  if (parser.opts.python_typing) {\n    python::PythonStubGenerator stub_generator(parser, path, version);\n    if (!stub_generator.Generate())\n      return \"could not generate Python type stubs\";\n  }\n  return nullptr;\n}\n\nnamespace {\n\nclass PythonCodeGenerator : public CodeGenerator {\n public:\n  Status GenerateCode(const Parser& parser, const std::string& path,\n                      const std::string& filename) override {\n    auto err = GeneratePython(parser, path, filename);\n    if (err) {\n      status_detail = \" \" + std::string(err);\n      return Status::ERROR;\n    }\n    return Status::OK;\n  }\n\n  Status GenerateCode(const uint8_t*, int64_t, const CodeGenOptions&) override {\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateMakeRule(const Parser& parser, const std::string& path,\n                          const std::string& filename,\n                          std::string& output) override {\n    (void)parser;\n    (void)path;\n    (void)filename;\n    (void)output;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateGrpcCode(const Parser& parser, const std::string& path,\n                          const std::string& filename) override {\n    if (!GeneratePythonGRPC(parser, path,\n                            filename)) {  // TODO add status GeneratePythonGRPC\n      return Status::ERROR;\n    }\n    return Status::OK;\n  }\n\n  Status GenerateRootFile(const Parser& parser,\n                          const std::string& path) override {\n    (void)parser;\n    (void)path;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  bool IsSchemaOnly() const override { return true; }\n\n  bool SupportsBfbsGeneration() const override { return false; }\n  bool SupportsRootFileGeneration() const override { return false; }\n\n  IDLOptions::Language Language() const override { return IDLOptions::kPython; }\n\n  std::string LanguageName() const override { return \"Python\"; }\n};\n}  // namespace\n\nstd::unique_ptr<CodeGenerator> NewPythonCodeGenerator() {\n  return std::unique_ptr<PythonCodeGenerator>(new PythonCodeGenerator());\n}\n\n}  // namespace flatbuffers\n"
  },
  {
    "path": "src/idl_gen_python.h",
    "content": "/*\n * Copyright 2023 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_IDL_GEN_PYTHON_H_\n#define FLATBUFFERS_IDL_GEN_PYTHON_H_\n\n#include \"flatbuffers/code_generator.h\"\n\nnamespace flatbuffers {\n\n// Constructs a new Python code generator.\nstd::unique_ptr<CodeGenerator> NewPythonCodeGenerator();\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_IDL_GEN_PYTHON_H_\n"
  },
  {
    "path": "src/idl_gen_rust.cpp",
    "content": "/*\n * Copyright 2018 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// independent from idl_parser, since this code is not needed for most clients\n\n#include \"idl_gen_rust.h\"\n\n#include <cmath>\n\n#include \"flatbuffers/code_generators.h\"\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/idl.h\"\n#include \"flatbuffers/util.h\"\n#include \"idl_namer.h\"\n\nnamespace flatbuffers {\nnamespace {\n\nstatic Namer::Config RustDefaultConfig() {\n  // Historical note: We've been using \"keep\" casing since the original\n  // implementation, presumably because Flatbuffers schema style and Rust style\n  // roughly align. We are not going to enforce proper casing since its an\n  // unnecessary breaking change.\n  return {/*types=*/Case::kKeep,\n          /*constants=*/Case::kScreamingSnake,\n          /*methods=*/Case::kSnake,\n          /*functions=*/Case::kSnake,\n          /*fields=*/Case::kKeep,\n          /*variables=*/Case::kUnknown,  // Unused.\n          /*variants=*/Case::kKeep,\n          /*enum_variant_seperator=*/\"::\",\n          /*escape_keywords=*/Namer::Config::Escape::BeforeConvertingCase,\n          /*namespaces=*/Case::kSnake,\n          /*namespace_seperator=*/\"::\",\n          /*object_prefix=*/\"\",\n          /*object_suffix=*/\"T\",\n          /*keyword_prefix=*/\"\",\n          /*keyword_suffix=*/\"_\",\n          /*keywords_casing=*/Namer::Config::KeywordsCasing::CaseSensitive,\n          /*filenames=*/Case::kSnake,\n          /*directories=*/Case::kSnake,\n          /*output_path=*/\"\",\n          /*filename_suffix=*/\"_generated\",\n          /*filename_extension=*/\".rs\"};\n}\n\nstatic std::set<std::string> RustKeywords() {\n  return {\n      // https://doc.rust-lang.org/book/second-edition/appendix-01-keywords.html\n      \"as\",\n      \"break\",\n      \"const\",\n      \"continue\",\n      \"crate\",\n      \"else\",\n      \"enum\",\n      \"extern\",\n      \"false\",\n      \"fn\",\n      \"for\",\n      \"if\",\n      \"impl\",\n      \"in\",\n      \"let\",\n      \"loop\",\n      \"match\",\n      \"mod\",\n      \"move\",\n      \"mut\",\n      \"pub\",\n      \"ref\",\n      \"return\",\n      \"Self\",\n      \"self\",\n      \"static\",\n      \"struct\",\n      \"super\",\n      \"trait\",\n      \"true\",\n      \"type\",\n      \"unsafe\",\n      \"use\",\n      \"where\",\n      \"while\",\n      // future possible keywords\n      \"abstract\",\n      \"alignof\",\n      \"become\",\n      \"box\",\n      \"do\",\n      \"final\",\n      \"macro\",\n      \"offsetof\",\n      \"override\",\n      \"priv\",\n      \"proc\",\n      \"pure\",\n      \"sizeof\",\n      \"typeof\",\n      \"unsized\",\n      \"virtual\",\n      \"yield\",\n      // other rust terms we should not use\n      \"std\",\n      \"usize\",\n      \"isize\",\n      \"u8\",\n      \"i8\",\n      \"u16\",\n      \"i16\",\n      \"u32\",\n      \"i32\",\n      \"u64\",\n      \"i64\",\n      \"u128\",\n      \"i128\",\n      \"f32\",\n      \"f64\",\n      // Terms that we use ourselves\n      \"follow\",\n      \"push\",\n      \"to_little_endian\",\n      \"from_little_endian\",\n      \"ENUM_MAX\",\n      \"ENUM_MIN\",\n      \"ENUM_VALUES\",\n  };\n}\n\n// Encapsulate all logical field types in this enum. This allows us to write\n// field logic based on type switches, instead of branches on the properties\n// set on the Type.\n// TODO(rw): for backwards compatibility, we can't use a strict `enum class`\n//           declaration here. could we use the `-Wswitch-enum` warning to\n//           achieve the same effect?\nenum FullType {\n  ftInteger = 0,\n  ftFloat = 1,\n  ftBool = 2,\n\n  ftStruct = 3,\n  ftTable = 4,\n\n  ftEnumKey = 5,\n  ftUnionKey = 6,\n\n  ftUnionValue = 7,\n\n  // TODO(rw): bytestring?\n  ftString = 8,\n\n  ftVectorOfInteger = 9,\n  ftVectorOfFloat = 10,\n  ftVectorOfBool = 11,\n  ftVectorOfEnumKey = 12,\n  ftVectorOfStruct = 13,\n  ftVectorOfTable = 14,\n  ftVectorOfString = 15,\n  ftVectorOfUnionValue = 16,\n\n  ftArrayOfBuiltin = 17,\n  ftArrayOfEnum = 18,\n  ftArrayOfStruct = 19,\n};\n\n// Convert a Type to a FullType (exhaustive).\nstatic FullType GetFullType(const Type& type) {\n  // N.B. The order of these conditionals matters for some types.\n\n  if (IsString(type)) {\n    return ftString;\n  } else if (type.base_type == BASE_TYPE_STRUCT) {\n    if (type.struct_def->fixed) {\n      return ftStruct;\n    } else {\n      return ftTable;\n    }\n  } else if (IsVector(type)) {\n    switch (GetFullType(type.VectorType())) {\n      case ftInteger: {\n        return ftVectorOfInteger;\n      }\n      case ftFloat: {\n        return ftVectorOfFloat;\n      }\n      case ftBool: {\n        return ftVectorOfBool;\n      }\n      case ftStruct: {\n        return ftVectorOfStruct;\n      }\n      case ftTable: {\n        return ftVectorOfTable;\n      }\n      case ftString: {\n        return ftVectorOfString;\n      }\n      case ftEnumKey: {\n        return ftVectorOfEnumKey;\n      }\n      case ftUnionKey:\n      case ftUnionValue: {\n        FLATBUFFERS_ASSERT(false && \"vectors of unions are unsupported\");\n        break;\n      }\n      default: {\n        FLATBUFFERS_ASSERT(false && \"vector of vectors are unsupported\");\n      }\n    }\n  } else if (IsArray(type)) {\n    switch (GetFullType(type.VectorType())) {\n      case ftInteger:\n      case ftFloat:\n      case ftBool: {\n        return ftArrayOfBuiltin;\n      }\n      case ftStruct: {\n        return ftArrayOfStruct;\n      }\n      case ftEnumKey: {\n        return ftArrayOfEnum;\n      }\n      default: {\n        FLATBUFFERS_ASSERT(false && \"Unsupported type for fixed array\");\n      }\n    }\n  } else if (type.enum_def != nullptr) {\n    if (type.enum_def->is_union) {\n      if (type.base_type == BASE_TYPE_UNION) {\n        return ftUnionValue;\n      } else if (IsInteger(type.base_type)) {\n        return ftUnionKey;\n      } else {\n        FLATBUFFERS_ASSERT(false && \"unknown union field type\");\n      }\n    } else {\n      return ftEnumKey;\n    }\n  } else if (IsScalar(type.base_type)) {\n    if (IsBool(type.base_type)) {\n      return ftBool;\n    } else if (IsInteger(type.base_type)) {\n      return ftInteger;\n    } else if (IsFloat(type.base_type)) {\n      return ftFloat;\n    } else {\n      FLATBUFFERS_ASSERT(false && \"unknown number type\");\n    }\n  }\n\n  FLATBUFFERS_ASSERT(false && \"completely unknown type\");\n\n  // this is only to satisfy the compiler's return analysis.\n  return ftBool;\n}\n\nstatic bool IsBitFlagsEnum(const EnumDef& enum_def) {\n  return enum_def.attributes.Lookup(\"bit_flags\") != nullptr;\n}\n\n// TableArgs make required non-scalars \"Option<_>\".\n// TODO(cneo): Rework how we do defaults and stuff.\nstatic bool IsOptionalToBuilder(const FieldDef& field) {\n  return field.IsOptional() || !IsScalar(field.value.type.base_type);\n}\n}  // namespace\n\nstatic bool GenerateRustModuleRootFile(const Parser& parser,\n                                       const std::string& output_dir) {\n  if (!parser.opts.rust_module_root_file) {\n    // Don't generate a root file when generating one file. This isn't an error\n    // so return true.\n    return true;\n  }\n  Namer namer(WithFlagOptions(RustDefaultConfig(), parser.opts, output_dir),\n              RustKeywords());\n  // We gather the symbols into a tree of namespaces (which are rust mods) and\n  // generate a file that gathers them all.\n  struct Module {\n    std::map<std::string, Module> sub_modules;\n    std::vector<std::string> generated_files;\n    // Add a symbol into the tree.\n    void Insert(const Namer& namer, const Definition* s) {\n      const Definition& symbol = *s;\n      Module* current_module = this;\n      for (auto it = symbol.defined_namespace->components.begin();\n           it != symbol.defined_namespace->components.end(); it++) {\n        std::string ns_component = namer.Namespace(*it);\n        current_module = &current_module->sub_modules[ns_component];\n      }\n      current_module->generated_files.push_back(\n          namer.File(symbol.name, SkipFile::Extension));\n    }\n    // Recursively create the importer file.\n    void GenerateImports(CodeWriter& code) {\n      for (auto it = sub_modules.begin(); it != sub_modules.end(); it++) {\n        code += \"pub mod \" + it->first + \" {\";\n        code.IncrementIdentLevel();\n        code += \"use super::*;\";\n        it->second.GenerateImports(code);\n        code.DecrementIdentLevel();\n        code += \"} // \" + it->first;\n      }\n      for (auto it = generated_files.begin(); it != generated_files.end();\n           it++) {\n        code += \"mod \" + *it + \";\";\n        code += \"pub use self::\" + *it + \"::*;\";\n      }\n    }\n  };\n  Module root_module;\n  for (auto it = parser.enums_.vec.begin(); it != parser.enums_.vec.end();\n       it++) {\n    root_module.Insert(namer, *it);\n  }\n  for (auto it = parser.structs_.vec.begin(); it != parser.structs_.vec.end();\n       it++) {\n    root_module.Insert(namer, *it);\n  }\n  CodeWriter code(\"    \");\n  // TODO(caspern): Move generated warning out of BaseGenerator.\n  code +=\n      \"// Automatically generated by the Flatbuffers compiler. \"\n      \"Do not modify.\";\n  code += \"// @generated\";\n  root_module.GenerateImports(code);\n  const bool success = parser.opts.file_saver->SaveFile(\n      (output_dir + \"mod.rs\").c_str(), code.ToString(), false);\n  code.Clear();\n  return success;\n}\n\nnamespace rust {\n\nclass RustGenerator : public BaseGenerator {\n public:\n  RustGenerator(const Parser& parser, const std::string& path,\n                const std::string& file_name)\n      : BaseGenerator(parser, path, file_name, \"\", \"::\", \"rs\"),\n        cur_name_space_(nullptr),\n        namer_(WithFlagOptions(RustDefaultConfig(), parser.opts, path),\n               RustKeywords()) {\n    // TODO: Namer flag overrides should be in flatc or flatc_main.\n    code_.SetPadding(\"    \");\n  }\n\n  bool generate() {\n    if (!parser_.opts.rust_module_root_file) {\n      return GenerateOneFile();\n    } else {\n      return GenerateIndividualFiles();\n    }\n  }\n\n  template <typename T>\n  bool GenerateSymbols(const SymbolTable<T>& symbols,\n                       std::function<void(const T&)> gen_symbol) {\n    for (auto it = symbols.vec.begin(); it != symbols.vec.end(); it++) {\n      const T& symbol = **it;\n      if (symbol.generated) continue;\n      code_.Clear();\n      code_ += \"// \" + std::string(FlatBuffersGeneratedWarning());\n      code_ += \"// @generated\";\n      code_ += \"extern crate alloc;\";\n      if (parser_.opts.rust_serialize) {\n        code_ += \"extern crate serde;\";\n        code_ +=\n            \"use self::serde::ser::{Serialize, Serializer, SerializeStruct};\";\n      }\n      code_ += \"use super::*;\";\n      cur_name_space_ = symbol.defined_namespace;\n      gen_symbol(symbol);\n\n      const std::string directories =\n          namer_.Directories(*symbol.defined_namespace);\n      EnsureDirExists(directories);\n      const std::string file_path = directories + namer_.File(symbol);\n      const bool save_success = parser_.opts.file_saver->SaveFile(\n          file_path.c_str(), code_.ToString(), /*binary=*/false);\n      if (!save_success) return false;\n    }\n    return true;\n  }\n\n  bool GenerateIndividualFiles() {\n    code_.Clear();\n    // Don't bother with imports. Use absolute paths everywhere.\n    return GenerateSymbols<EnumDef>(\n               parser_.enums_, [&](const EnumDef& e) { this->GenEnum(e); }) &&\n           GenerateSymbols<StructDef>(\n               parser_.structs_, [&](const StructDef& s) {\n                 if (s.fixed) {\n                   this->GenStruct(s);\n                 } else {\n                   this->GenTable(s);\n                   if (this->parser_.opts.generate_object_based_api) {\n                     this->GenTableObject(s);\n                   }\n                 }\n                 if (this->parser_.root_struct_def_ == &s) {\n                   this->GenRootTableFuncs(s);\n                 }\n               });\n  }\n\n  // Generates code organized by .fbs files. This is broken legacy behavior\n  // that does not work with multiple fbs files with shared namespaces.\n  // Iterate through all definitions we haven't generated code for (enums,\n  // structs, and tables) and output them to a single file.\n  bool GenerateOneFile() {\n    code_.Clear();\n    code_ += \"// \" + std::string(FlatBuffersGeneratedWarning());\n    code_ += \"// @generated\";\n\n    assert(!cur_name_space_);\n\n    // Generate imports for the global scope in case no namespace is used\n    // in the schema file.\n    GenNamespaceImports();\n\n    // Generate all code in their namespaces, once, because Rust does not\n    // permit re-opening modules.\n    //\n    // TODO(rw): Use a set data structure to reduce namespace evaluations from\n    //           O(n**2) to O(n).\n    for (auto ns_it = parser_.namespaces_.begin();\n         ns_it != parser_.namespaces_.end(); ++ns_it) {\n      const auto& ns = *ns_it;\n\n      // Generate code for all the enum declarations.\n      for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end();\n           ++it) {\n        const auto& enum_def = **it;\n        if (enum_def.defined_namespace == ns && !enum_def.generated) {\n          SetNameSpace(enum_def.defined_namespace);\n          GenEnum(enum_def);\n        }\n      }\n\n      // Generate code for all structs.\n      for (auto it = parser_.structs_.vec.begin();\n           it != parser_.structs_.vec.end(); ++it) {\n        const auto& struct_def = **it;\n        if (struct_def.defined_namespace == ns && struct_def.fixed &&\n            !struct_def.generated) {\n          SetNameSpace(struct_def.defined_namespace);\n          GenStruct(struct_def);\n        }\n      }\n\n      // Generate code for all tables.\n      for (auto it = parser_.structs_.vec.begin();\n           it != parser_.structs_.vec.end(); ++it) {\n        const auto& struct_def = **it;\n        if (struct_def.defined_namespace == ns && !struct_def.fixed &&\n            !struct_def.generated) {\n          SetNameSpace(struct_def.defined_namespace);\n          GenTable(struct_def);\n          if (parser_.opts.generate_object_based_api) {\n            GenTableObject(struct_def);\n          }\n        }\n      }\n\n      // Generate global helper functions.\n      if (parser_.root_struct_def_) {\n        auto& struct_def = *parser_.root_struct_def_;\n        if (struct_def.defined_namespace != ns) {\n          continue;\n        }\n        SetNameSpace(struct_def.defined_namespace);\n        GenRootTableFuncs(struct_def);\n      }\n    }\n    if (cur_name_space_) SetNameSpace(nullptr);\n\n    const auto file_path = GeneratedFileName(path_, file_name_, parser_.opts);\n    const auto final_code = code_.ToString();\n    return parser_.opts.file_saver->SaveFile(file_path.c_str(), final_code,\n                                             false);\n  }\n\n private:\n  CodeWriter code_;\n\n  // This tracks the current namespace so we can insert namespace declarations.\n  const Namespace* cur_name_space_;\n\n  const Namespace* CurrentNameSpace() const { return cur_name_space_; }\n\n  // Determine if a Type needs a lifetime template parameter when used in the\n  // Rust builder args.\n  bool TableBuilderTypeNeedsLifetime(const Type& type) const {\n    switch (GetFullType(type)) {\n      case ftInteger:\n      case ftFloat:\n      case ftBool:\n      case ftEnumKey:\n      case ftUnionKey:\n      case ftUnionValue: {\n        return false;\n      }\n      default: {\n        return true;\n      }\n    }\n  }\n\n  // Determine if a table args rust type needs a lifetime template parameter.\n  bool TableBuilderArgsNeedsLifetime(const StructDef& struct_def) const {\n    FLATBUFFERS_ASSERT(!struct_def.fixed);\n\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      const auto& field = **it;\n      if (field.deprecated) {\n        continue;\n      }\n\n      if (TableBuilderTypeNeedsLifetime(field.value.type)) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  std::string NamespacedNativeName(const EnumDef& def) {\n    return WrapInNameSpace(def.defined_namespace, namer_.ObjectType(def));\n  }\n  std::string NamespacedNativeName(const StructDef& def) {\n    return WrapInNameSpace(def.defined_namespace, namer_.ObjectType(def));\n  }\n\n  std::string WrapInNameSpace(const Definition& def) const {\n    return WrapInNameSpace(def.defined_namespace,\n                           namer_.EscapeKeyword(def.name));\n  }\n  std::string WrapInNameSpace(const Namespace* ns,\n                              const std::string& name) const {\n    if (CurrentNameSpace() == ns) return name;\n    std::string prefix = GetRelativeNamespaceTraversal(CurrentNameSpace(), ns);\n    return prefix + name;\n  }\n\n  // Determine the relative namespace traversal needed to reference one\n  // namespace from another namespace. This is useful because it does not force\n  // the user to have a particular file layout. (If we output absolute\n  // namespace paths, that may require users to organize their Rust crates in a\n  // particular way.)\n  std::string GetRelativeNamespaceTraversal(const Namespace* src,\n                                            const Namespace* dst) const {\n    // calculate the path needed to reference dst from src.\n    // example: f(A::B::C, A::B::C) -> (none)\n    // example: f(A::B::C, A::B)    -> super::\n    // example: f(A::B::C, A::B::D) -> super::D\n    // example: f(A::B::C, A)       -> super::super::\n    // example: f(A::B::C, D)       -> super::super::super::D\n    // example: f(A::B::C, D::E)    -> super::super::super::D::E\n    // example: f(A, D::E)          -> super::D::E\n    // does not include leaf object (typically a struct type).\n\n    std::stringstream stream;\n    size_t common = 0;\n    std::vector<std::string> s, d;\n    if (src) s = src->components;\n    if (dst) d = dst->components;\n    while (common < s.size() && common < d.size() && s[common] == d[common])\n      common++;\n    // If src namespace is empty, this must be an absolute path.\n    for (size_t i = common; i < s.size(); i++) stream << \"super::\";\n    for (size_t i = common; i < d.size(); i++)\n      stream << namer_.Namespace(d[i]) + \"::\";\n    return stream.str();\n  }\n\n  // Generate a comment from the schema.\n  void GenComment(const std::vector<std::string>& dc, const char* prefix = \"\") {\n    for (auto it = dc.begin(); it != dc.end(); it++) {\n      code_ += std::string(prefix) + \"///\" + *it;\n    }\n  }\n\n  // Return a Rust type from the table in idl.h.\n  std::string GetTypeBasic(const Type& type) const {\n    switch (GetFullType(type)) {\n      case ftInteger:\n      case ftFloat:\n      case ftBool:\n      case ftEnumKey:\n      case ftUnionKey: {\n        break;\n      }\n      default: {\n        FLATBUFFERS_ASSERT(false && \"incorrect type given\");\n      }\n    }\n\n    // clang-format off\n    static const char * const ctypename[] = {\n    #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, \\\n                           RTYPE, ...) \\\n      #RTYPE,\n      FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)\n    #undef FLATBUFFERS_TD\n    };\n    // clang-format on\n\n    if (type.enum_def) {\n      return WrapInNameSpace(*type.enum_def);\n    }\n    return ctypename[type.base_type];\n  }\n\n  // Look up the native type for an enum. This will always be an integer like\n  // u8, i32, etc.\n  std::string GetEnumTypeForDecl(const Type& type) {\n    const auto ft = GetFullType(type);\n    if (!(ft == ftEnumKey || ft == ftUnionKey)) {\n      FLATBUFFERS_ASSERT(false && \"precondition failed in GetEnumTypeForDecl\");\n    }\n\n    // clang-format off\n    static const char *ctypename[] = {\n    #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, \\\n                           RTYPE, ...) \\\n      #RTYPE,\n      FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)\n    #undef FLATBUFFERS_TD\n    };\n    // clang-format on\n\n    // Enums can be bools, but their Rust representation must be a u8, as used\n    // in the repr attribute (#[repr(bool)] is an invalid attribute).\n    if (type.base_type == BASE_TYPE_BOOL) return \"u8\";\n    return ctypename[type.base_type];\n  }\n\n  // Return a Rust type for any type (scalar, table, struct) specifically for\n  // using a FlatBuffer.\n  std::string GetTypeGet(const Type& type) const {\n    switch (GetFullType(type)) {\n      case ftInteger:\n      case ftFloat:\n      case ftBool:\n      case ftEnumKey:\n      case ftUnionKey: {\n        return GetTypeBasic(type);\n      }\n      case ftArrayOfBuiltin:\n      case ftArrayOfEnum:\n      case ftArrayOfStruct: {\n        return \"[\" + GetTypeGet(type.VectorType()) + \"; \" +\n               NumToString(type.fixed_length) + \"]\";\n      }\n      case ftTable: {\n        return WrapInNameSpace(type.struct_def->defined_namespace,\n                               type.struct_def->name) +\n               \"<'a>\";\n      }\n      default: {\n        return WrapInNameSpace(type.struct_def->defined_namespace,\n                               type.struct_def->name);\n      }\n    }\n  }\n\n  std::string GetEnumValue(const EnumDef& enum_def,\n                           const EnumVal& enum_val) const {\n    return namer_.EnumVariant(enum_def, enum_val);\n  }\n\n  // 1 suffix since old C++ can't figure out the overload.\n  void ForAllEnumValues1(const EnumDef& enum_def,\n                         std::function<void(const EnumVal&)> cb) {\n    for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {\n      const auto& ev = **it;\n      code_.SetValue(\"VARIANT\", namer_.Variant(ev));\n      code_.SetValue(\"VALUE\", enum_def.ToString(ev));\n      code_.IncrementIdentLevel();\n      cb(ev);\n      code_.DecrementIdentLevel();\n    }\n  }\n  void ForAllEnumValues(const EnumDef& enum_def, std::function<void()> cb) {\n    std::function<void(const EnumVal&)> wrapped = [&](const EnumVal& unused) {\n      (void)unused;\n      cb();\n    };\n    ForAllEnumValues1(enum_def, wrapped);\n  }\n  // Generate an enum declaration,\n  // an enum string lookup table,\n  // an enum match function,\n  // and an enum array of values\n  void GenEnum(const EnumDef& enum_def) {\n    code_ += \"\";\n\n    const bool is_private = parser_.opts.no_leak_private_annotations &&\n                            (enum_def.attributes.Lookup(\"private\") != nullptr);\n    code_.SetValue(\"ACCESS_TYPE\", is_private ? \"pub(crate)\" : \"pub\");\n    code_.SetValue(\"ENUM_TY\", namer_.Type(enum_def));\n    code_.SetValue(\"BASE_TYPE\", GetEnumTypeForDecl(enum_def.underlying_type));\n    code_.SetValue(\"ENUM_NAMESPACE\", namer_.Namespace(enum_def.name));\n    code_.SetValue(\"ENUM_CONSTANT\", namer_.Constant(enum_def.name));\n    const EnumVal* minv = enum_def.MinValue();\n    const EnumVal* maxv = enum_def.MaxValue();\n    FLATBUFFERS_ASSERT(minv && maxv);\n    code_.SetValue(\"ENUM_MIN_BASE_VALUE\", enum_def.ToString(*minv));\n    code_.SetValue(\"ENUM_MAX_BASE_VALUE\", enum_def.ToString(*maxv));\n\n    if (IsBitFlagsEnum(enum_def)) {\n      // Defer to the convenient and canonical bitflags crate. We declare it in\n      // a module to #allow camel case constants in a smaller scope. This\n      // matches Flatbuffers c-modeled enums where variants are associated\n      // constants but in camel case.\n      code_ += \"#[allow(non_upper_case_globals)]\";\n      code_ += \"mod bitflags_{{ENUM_NAMESPACE}} {\";\n      code_ += \"    ::flatbuffers::bitflags::bitflags! {\";\n      GenComment(enum_def.doc_comment, \"        \");\n      code_ += \"        #[derive(Default, Debug, Clone, Copy, PartialEq)]\";\n      code_ += \"        {{ACCESS_TYPE}} struct {{ENUM_TY}}: {{BASE_TYPE}} {\";\n      ForAllEnumValues1(enum_def, [&](const EnumVal& ev) {\n        this->GenComment(ev.doc_comment, \"        \");\n        code_ += \"        const {{VARIANT}} = {{VALUE}};\";\n      });\n      code_ += \"        }\";\n      code_ += \"    }\";\n      code_ += \"}\";\n      code_ += \"\";\n\n      code_ += \"pub use self::bitflags_{{ENUM_NAMESPACE}}::{{ENUM_TY}};\";\n      code_ += \"\";\n\n      code_.SetValue(\"INTO_BASE\", \"self.bits()\");\n    } else {\n      // Normal, c-modelled enums.\n      // Deprecated associated constants;\n      const std::string deprecation_warning =\n          \"#[deprecated(since = \\\"2.0.0\\\", note = \\\"Use associated constants\"\n          \" instead. This will no longer be generated in 2021.\\\")]\";\n      code_ += deprecation_warning;\n      code_ +=\n          \"pub const ENUM_MIN_{{ENUM_CONSTANT}}: {{BASE_TYPE}}\"\n          \" = {{ENUM_MIN_BASE_VALUE}};\";\n      code_ += \"\";\n\n      code_ += deprecation_warning;\n      code_ +=\n          \"pub const ENUM_MAX_{{ENUM_CONSTANT}}: {{BASE_TYPE}}\"\n          \" = {{ENUM_MAX_BASE_VALUE}};\";\n      code_ += \"\";\n\n      auto num_fields = NumToString(enum_def.size());\n      code_ += deprecation_warning;\n      code_ += \"#[allow(non_camel_case_types)]\";\n      code_ += \"pub const ENUM_VALUES_{{ENUM_CONSTANT}}: [{{ENUM_TY}}; \" +\n               num_fields + \"] = [\";\n      ForAllEnumValues1(enum_def, [&](const EnumVal& ev) {\n        code_ += namer_.EnumVariant(enum_def, ev) + \",\";\n      });\n      code_ += \"];\";\n      code_ += \"\";\n\n      GenComment(enum_def.doc_comment);\n      // Derive Default to be 0. flatc enforces this when the enum\n      // is put into a struct, though this isn't documented behavior, it is\n      // needed to derive defaults in struct objects.\n      code_ +=\n          \"#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, \"\n          \"Default)]\";\n      code_ += \"#[repr(transparent)]\";\n      code_ += \"{{ACCESS_TYPE}} struct {{ENUM_TY}}(pub {{BASE_TYPE}});\";\n      code_ += \"\";\n\n      code_ += \"#[allow(non_upper_case_globals)]\";\n      code_ += \"impl {{ENUM_TY}} {\";\n      ForAllEnumValues1(enum_def, [&](const EnumVal& ev) {\n        this->GenComment(ev.doc_comment);\n        code_ += \"pub const {{VARIANT}}: Self = Self({{VALUE}});\";\n      });\n      code_ += \"\";\n      // Generate Associated constants\n      code_ +=\n          \"    pub const ENUM_MIN: {{BASE_TYPE}} = {{ENUM_MIN_BASE_VALUE}};\";\n      code_ +=\n          \"    pub const ENUM_MAX: {{BASE_TYPE}} = {{ENUM_MAX_BASE_VALUE}};\";\n      code_ += \"    pub const ENUM_VALUES: &'static [Self] = &[\";\n      ForAllEnumValues(enum_def, [&]() { code_ += \"    Self::{{VARIANT}},\"; });\n      code_ += \"    ];\";\n      code_ += \"\";\n\n      code_ += \"    /// Returns the variant's name or \\\"\\\" if unknown.\";\n      code_ += \"    pub fn variant_name(self) -> Option<&'static str> {\";\n      code_ += \"        match self {\";\n      ForAllEnumValues(enum_def, [&]() {\n        code_ += \"        Self::{{VARIANT}} => Some(\\\"{{VARIANT}}\\\"),\";\n      });\n      code_ += \"            _ => None,\";\n      code_ += \"        }\";\n      code_ += \"    }\";\n      code_ += \"}\";\n      code_ += \"\";\n\n      // Generate Debug. Unknown variants are printed like \"<UNKNOWN 42>\".\n      code_ += \"impl ::core::fmt::Debug for {{ENUM_TY}} {\";\n      code_ +=\n          \"    fn fmt(&self, f: &mut ::core::fmt::Formatter) ->\"\n          \" ::core::fmt::Result {\";\n      code_ += \"        if let Some(name) = self.variant_name() {\";\n      code_ += \"            f.write_str(name)\";\n      code_ += \"        } else {\";\n      code_ +=\n          \"            f.write_fmt(format_args!(\\\"<UNKNOWN {:?}>\\\", self.0))\";\n      code_ += \"        }\";\n      code_ += \"    }\";\n      code_ += \"}\";\n      code_ += \"\";\n\n      code_.SetValue(\"INTO_BASE\", \"self.0\");\n    }\n\n    // Implement serde::Serialize\n    if (parser_.opts.rust_serialize) {\n      code_ += \"impl Serialize for {{ENUM_TY}} {\";\n      code_ +=\n          \"    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, \"\n          \"S::Error>\";\n      code_ += \"    where\";\n      code_ += \"        S: Serializer,\";\n      code_ += \"    {\";\n      if (IsBitFlagsEnum(enum_def)) {\n        code_ += \"        serializer.serialize_u32(self.bits() as u32)\";\n      } else {\n        code_ +=\n            \"        serializer.serialize_unit_variant(\\\"{{ENUM_TY}}\\\", self.0 \"\n            \"as \"\n            \"u32, self.variant_name().unwrap())\";\n      }\n      code_ += \"    }\";\n      code_ += \"}\";\n      code_ += \"\";\n\n      if (!IsBitFlagsEnum(enum_def)) {\n        code_ += \"impl<'de> serde::Deserialize<'de> for {{ENUM_TY}} {\";\n        code_ +=\n            \"    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\";\n        code_ += \"    where\";\n        code_ += \"        D: serde::Deserializer<'de>,\";\n        code_ += \"    {\";\n        code_ += \"        let s = String::deserialize(deserializer)?;\";\n        code_ += \"        for item in {{ENUM_TY}}::ENUM_VALUES {\";\n        code_ +=\n            \"            if let Some(item_name) = \"\n            \"item.variant_name() {\";\n        code_ += \"                if item_name == s {\";\n        code_ += \"                    return Ok(item.clone());\";\n        code_ += \"                }\";\n        code_ += \"            }\";\n        code_ += \"        }\";\n        code_ += \"        Err(serde::de::Error::custom(format!(\";\n        code_ += \"            \\\"Unknown {{ENUM_TY}} variant: {s}\\\"\";\n        code_ += \"        )))\";\n        code_ += \"    }\";\n        code_ += \"}\";\n        code_ += \"\";\n      }\n    }\n\n    // Generate Follow and Push so we can serialize and stuff.\n    code_ += \"impl<'a> ::flatbuffers::Follow<'a> for {{ENUM_TY}} {\";\n    code_ += \"    type Inner = Self;\";\n    code_ += \"\";\n    code_ += \"    #[inline]\";\n    code_ += \"    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\";\n    code_ +=\n        \"        let b = unsafe { \"\n        \"::flatbuffers::read_scalar_at::<{{BASE_TYPE}}>(buf, loc) };\";\n    if (IsBitFlagsEnum(enum_def)) {\n      code_ += \"        Self::from_bits_retain(b)\";\n    } else {\n      code_ += \"        Self(b)\";\n    }\n    code_ += \"    }\";\n    code_ += \"}\";\n    code_ += \"\";\n    code_ += \"impl ::flatbuffers::Push for {{ENUM_TY}} {\";\n    code_ += \"    type Output = {{ENUM_TY}};\";\n    code_ += \"\";\n    code_ += \"    #[inline]\";\n    code_ += \"    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\";\n    code_ +=\n        \"        unsafe { ::flatbuffers::emplace_scalar::<{{BASE_TYPE}}>(dst, \"\n        \"{{INTO_BASE}}) };\";\n    code_ += \"    }\";\n    code_ += \"}\";\n    code_ += \"\";\n    code_ += \"impl ::flatbuffers::EndianScalar for {{ENUM_TY}} {\";\n    code_ += \"    type Scalar = {{BASE_TYPE}};\";\n    code_ += \"\";\n    code_ += \"    #[inline]\";\n    code_ += \"    fn to_little_endian(self) -> {{BASE_TYPE}} {\";\n    code_ += \"        {{INTO_BASE}}.to_le()\";\n    code_ += \"    }\";\n    code_ += \"\";\n    code_ += \"    #[inline]\";\n    code_ += \"    #[allow(clippy::wrong_self_convention)]\";\n    code_ += \"    fn from_little_endian(v: {{BASE_TYPE}}) -> Self {\";\n    code_ += \"        let b = {{BASE_TYPE}}::from_le(v);\";\n    if (IsBitFlagsEnum(enum_def)) {\n      code_ += \"        Self::from_bits_retain(b)\";\n    } else {\n      code_ += \"        Self(b)\";\n    }\n    code_ += \"    }\";\n    code_ += \"}\";\n    code_ += \"\";\n\n    // Generate verifier - deferring to the base type.\n    code_ += \"impl<'a> ::flatbuffers::Verifiable for {{ENUM_TY}} {\";\n    code_ += \"    #[inline]\";\n    code_ += \"    fn run_verifier(\";\n    code_ += \"        v: &mut ::flatbuffers::Verifier, pos: usize\";\n    code_ += \"    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\";\n    code_ += \"        {{BASE_TYPE}}::run_verifier(v, pos)\";\n    code_ += \"    }\";\n    code_ += \"}\";\n    code_ += \"\";\n    // Enums are basically integers.\n    code_ += \"impl ::flatbuffers::SimpleToVerifyInSlice for {{ENUM_TY}} {}\";\n\n    if (enum_def.is_union) {\n      // Generate typesafe offset(s) for unions\n      code_.SetValue(\"UNION_TYPE\", namer_.Type(enum_def));\n      code_ += \"\";\n      code_ += \"{{ACCESS_TYPE}} struct {{UNION_TYPE}}UnionTableOffset {}\";\n      if (parser_.opts.generate_object_based_api) {\n        GenUnionObject(enum_def);\n      }\n    }\n  }\n\n  // TODO(cneo): dedup Object versions from non object versions.\n  void ForAllUnionObjectVariantsBesidesNone(const EnumDef& enum_def,\n                                            std::function<void()> cb) {\n    for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {\n      auto& enum_val = **it;\n      if (enum_val.union_type.base_type == BASE_TYPE_NONE) continue;\n      code_.SetValue(\"VARIANT_NAME\", namer_.Variant(enum_val));\n      // For legacy reasons, enum variants are Keep case while enum native\n      // variants are UpperCamel case.\n      code_.SetValue(\"NATIVE_VARIANT\",\n                     namer_.LegacyRustNativeVariant(enum_val));\n      code_.SetValue(\"U_ELEMENT_NAME\", namer_.Method(enum_val));\n      code_.SetValue(\"U_ELEMENT_TABLE_TYPE\",\n                     NamespacedNativeName(*enum_val.union_type.struct_def));\n      code_.IncrementIdentLevel();\n      cb();\n      code_.DecrementIdentLevel();\n    }\n  }\n  void GenUnionObject(const EnumDef& enum_def) {\n    code_.SetValue(\"ENUM_TY\", namer_.Type(enum_def));\n    code_.SetValue(\"ENUM_FN\", namer_.Function(enum_def));\n    code_.SetValue(\"ENUM_OTY\", namer_.ObjectType(enum_def));\n\n    // Generate native union.\n    code_ += \"\";\n    code_ += \"#[allow(clippy::upper_case_acronyms)]\";  // NONE's spelling is\n                                                       // intended.\n    code_ += \"#[non_exhaustive]\";\n    code_ += \"#[derive(Debug, Clone, PartialEq)]\";\n    code_ += \"{{ACCESS_TYPE}} enum {{ENUM_OTY}} {\";\n    code_ += \"    NONE,\";\n    ForAllUnionObjectVariantsBesidesNone(enum_def, [&] {\n      code_ +=\n          \"{{NATIVE_VARIANT}}(alloc::boxed::Box<{{U_ELEMENT_TABLE_TYPE}}>),\";\n    });\n    code_ += \"}\";\n    code_ += \"\";\n\n    // Generate Default (NONE).\n    code_ += \"impl Default for {{ENUM_OTY}} {\";\n    code_ += \"    fn default() -> Self {\";\n    code_ += \"        Self::NONE\";\n    code_ += \"    }\";\n    code_ += \"}\";\n    code_ += \"\";\n\n    // Generate native union methods.\n    code_ += \"impl {{ENUM_OTY}} {\";\n\n    // Get flatbuffers union key.\n    // TODO(cneo): add docstrings?\n    code_ += \"    pub fn {{ENUM_FN}}_type(&self) -> {{ENUM_TY}} {\";\n    code_ += \"        match self {\";\n    code_ += \"            Self::NONE => {{ENUM_TY}}::NONE,\";\n    ForAllUnionObjectVariantsBesidesNone(enum_def, [&] {\n      code_ +=\n          \"        Self::{{NATIVE_VARIANT}}(_) => {{ENUM_TY}}::\"\n          \"{{VARIANT_NAME}},\";\n    });\n    code_ += \"        }\";\n    code_ += \"    }\";\n    code_ += \"\";\n\n    // Pack flatbuffers union value\n    code_ +=\n        \"    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(&self, fbb: \"\n        \"&mut \"\n        \"::flatbuffers::FlatBufferBuilder<'b, A>)\"\n        \" -> Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>>\"\n        \" {\";\n    code_ += \"        match self {\";\n    code_ += \"            Self::NONE => None,\";\n    ForAllUnionObjectVariantsBesidesNone(enum_def, [&] {\n      code_ += \"        Self::{{NATIVE_VARIANT}}(v) => \\\\\";\n      code_ += \"Some(v.pack(fbb).as_union_value()),\";\n    });\n    code_ += \"        }\";\n    code_ += \"    }\";\n\n    // Generate some accessors;\n    ForAllUnionObjectVariantsBesidesNone(enum_def, [&] {\n      // Move accessor.\n      code_ += \"\";\n      code_ +=\n          \"/// If the union variant matches, return the owned \"\n          \"{{U_ELEMENT_TABLE_TYPE}}, setting the union to NONE.\";\n      code_ +=\n          \"pub fn take_{{U_ELEMENT_NAME}}(&mut self) -> \"\n          \"Option<alloc::boxed::Box<{{U_ELEMENT_TABLE_TYPE}}>> {\";\n      code_ += \"    if let Self::{{NATIVE_VARIANT}}(_) = self {\";\n      code_ += \"        let v = ::core::mem::replace(self, Self::NONE);\";\n      code_ += \"        if let Self::{{NATIVE_VARIANT}}(w) = v {\";\n      code_ += \"            Some(w)\";\n      code_ += \"        } else {\";\n      code_ += \"            unreachable!()\";\n      code_ += \"        }\";\n      code_ += \"    } else {\";\n      code_ += \"        None\";\n      code_ += \"    }\";\n      code_ += \"}\";\n\n      // Immutable reference accessor.\n      code_ += \"\";\n      code_ +=\n          \"/// If the union variant matches, return a reference to the \"\n          \"{{U_ELEMENT_TABLE_TYPE}}.\";\n      code_ +=\n          \"pub fn as_{{U_ELEMENT_NAME}}(&self) -> \"\n          \"Option<&{{U_ELEMENT_TABLE_TYPE}}> {\";\n      code_ +=\n          \"    if let Self::{{NATIVE_VARIANT}}(v) = self \"\n          \"{ Some(v.as_ref()) } else { None }\";\n      code_ += \"}\";\n\n      // Mutable reference accessor.\n      code_ += \"\";\n      code_ +=\n          \"/// If the union variant matches, return a mutable reference\"\n          \" to the {{U_ELEMENT_TABLE_TYPE}}.\";\n      code_ +=\n          \"pub fn as_{{U_ELEMENT_NAME}}_mut(&mut self) -> \"\n          \"Option<&mut {{U_ELEMENT_TABLE_TYPE}}> {\";\n      code_ +=\n          \"    if let Self::{{NATIVE_VARIANT}}(v) = self \"\n          \"{ Some(v.as_mut()) } else { None }\";\n      code_ += \"}\";\n    });\n\n    code_ += \"}\";  // End union methods impl.\n    code_ += \"\";\n  }\n\n  enum DefaultContext { kBuilder, kAccessor, kObject };\n  std::string GetDefaultValue(const FieldDef& field,\n                              const DefaultContext context) {\n    if (context == kBuilder) {\n      // Builders and Args structs model nonscalars \"optional\" even if they're\n      // required or have defaults according to the schema. I guess its because\n      // WIPOffset is not nullable.\n      if (!IsScalar(field.value.type.base_type) || field.IsOptional()) {\n        return \"None\";\n      }\n    } else {\n      // This for defaults in objects.\n      // Unions have a NONE variant instead of using Rust's None.\n      if (field.IsOptional() && !IsUnion(field.value.type)) {\n        return \"None\";\n      }\n    }\n    switch (GetFullType(field.value.type)) {\n      case ftInteger: {\n        return field.value.constant;\n      }\n      case ftFloat: {\n        const std::string float_prefix =\n            (field.value.type.base_type == BASE_TYPE_FLOAT) ? \"f32::\" : \"f64::\";\n        if (StringIsFlatbufferNan(field.value.constant)) {\n          return float_prefix + \"NAN\";\n        } else if (StringIsFlatbufferPositiveInfinity(field.value.constant)) {\n          return float_prefix + \"INFINITY\";\n        } else if (StringIsFlatbufferNegativeInfinity(field.value.constant)) {\n          return float_prefix + \"NEG_INFINITY\";\n        }\n        return field.value.constant;\n      }\n      case ftBool: {\n        return field.value.constant == \"0\" ? \"false\" : \"true\";\n      }\n      case ftUnionKey:\n      case ftEnumKey: {\n        auto ev = field.value.type.enum_def->FindByValue(field.value.constant);\n        if (!ev) return \"Default::default()\";  // Bitflags enum.\n        return WrapInNameSpace(\n            field.value.type.enum_def->defined_namespace,\n            namer_.EnumVariant(*field.value.type.enum_def, *ev));\n      }\n      case ftUnionValue: {\n        return ObjectFieldType(field, true) + \"::NONE\";\n      }\n      case ftString: {\n        // Required fields do not have defaults defined by the schema, but we\n        // need one for Rust's Default trait so we use empty string. The usual\n        // value of field.value.constant is `0`, which is non-sensical except\n        // maybe to c++ (nullptr == 0).\n        std::string defval;\n        if (field.IsRequired()) {\n          defval = \"\\\"\\\"\";\n        } else {\n          flatbuffers::EscapeString(field.value.constant.c_str(),\n                                    field.value.constant.length(), &defval,\n                                    true, false);\n        }\n        if (context == kObject) {\n          return \"alloc::string::ToString::to_string(\" + defval + \")\";\n        }\n        if (context == kAccessor) return \"&\" + defval;\n        FLATBUFFERS_ASSERT(false);\n        return \"INVALID_CODE_GENERATION\";\n      }\n\n      case ftArrayOfStruct:\n      case ftArrayOfEnum:\n      case ftArrayOfBuiltin:\n      case ftVectorOfBool:\n      case ftVectorOfFloat:\n      case ftVectorOfInteger:\n      case ftVectorOfString:\n      case ftVectorOfStruct:\n      case ftVectorOfTable:\n      case ftVectorOfEnumKey:\n      case ftVectorOfUnionValue:\n      case ftStruct:\n      case ftTable: {\n        // We only support empty vectors which matches the defaults for\n        // &[T] and Vec<T> anyway.\n        //\n        // For required structs and tables fields, we defer to their object API\n        // defaults. This works so long as there's nothing recursive happening,\n        // but `table Infinity { i: Infinity (required); }` does compile.\n        return \"Default::default()\";\n      }\n    }\n    FLATBUFFERS_ASSERT(false);\n    return \"INVALID_CODE_GENERATION\";\n  }\n\n  // Create the return type for fields in the *BuilderArgs structs that are\n  // used to create Tables.\n  //\n  // Note: we could make all inputs to the BuilderArgs be an Option, as well\n  // as all outputs. But, the UX of Flatbuffers is that the user doesn't get to\n  // know if the value is default or not, because there are three ways to\n  // return a default value:\n  // 1) return a stored value that happens to be the default,\n  // 2) return a hardcoded value because the relevant vtable field is not in\n  //    the vtable, or\n  // 3) return a hardcoded value because the vtable field value is set to zero.\n  std::string TableBuilderArgsDefnType(const FieldDef& field,\n                                       const std::string& lifetime) {\n    const Type& type = field.value.type;\n    auto WrapOption = [&](std::string s) {\n      return IsOptionalToBuilder(field) ? \"Option<\" + s + \">\" : s;\n    };\n    auto WrapVector = [&](std::string ty) {\n      return WrapOption(\"::flatbuffers::WIPOffset<::flatbuffers::Vector<\" +\n                        lifetime + \", \" + ty + \">>\");\n    };\n    auto WrapUOffsetsVector = [&](std::string ty) {\n      return WrapVector(\"::flatbuffers::ForwardsUOffset<\" + ty + \">\");\n    };\n\n    switch (GetFullType(type)) {\n      case ftInteger:\n      case ftFloat:\n      case ftBool: {\n        return WrapOption(GetTypeBasic(type));\n      }\n      case ftStruct: {\n        const auto typname = WrapInNameSpace(*type.struct_def);\n        return WrapOption(\"&\" + lifetime + \" \" + typname);\n      }\n      case ftTable: {\n        const auto typname = WrapInNameSpace(*type.struct_def);\n        return WrapOption(\"::flatbuffers::WIPOffset<\" + typname + \"<\" +\n                          lifetime + \">>\");\n      }\n      case ftString: {\n        return WrapOption(\"::flatbuffers::WIPOffset<&\" + lifetime + \" str>\");\n      }\n      case ftEnumKey:\n      case ftUnionKey: {\n        return WrapOption(WrapInNameSpace(*type.enum_def));\n      }\n      case ftUnionValue: {\n        return \"Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>\"\n               \">\";\n      }\n\n      case ftVectorOfInteger:\n      case ftVectorOfBool:\n      case ftVectorOfFloat: {\n        const auto typname = GetTypeBasic(type.VectorType());\n        return WrapVector(typname);\n      }\n      case ftVectorOfEnumKey: {\n        const auto typname = WrapInNameSpace(*type.enum_def);\n        return WrapVector(typname);\n      }\n      case ftVectorOfStruct: {\n        const auto typname = WrapInNameSpace(*type.struct_def);\n        return WrapVector(typname);\n      }\n      case ftVectorOfTable: {\n        const auto typname = WrapInNameSpace(*type.struct_def);\n        return WrapUOffsetsVector(typname + \"<\" + lifetime + \">\");\n      }\n      case ftVectorOfString: {\n        return WrapUOffsetsVector(\"&\" + lifetime + \" str\");\n      }\n      case ftVectorOfUnionValue: {\n        return WrapUOffsetsVector(\"::flatbuffers::Table<\" + lifetime + \">\");\n      }\n      case ftArrayOfEnum:\n      case ftArrayOfStruct:\n      case ftArrayOfBuiltin: {\n        FLATBUFFERS_ASSERT(false && \"arrays are not supported within tables\");\n        return \"ARRAYS_NOT_SUPPORTED_IN_TABLES\";\n      }\n    }\n    return \"INVALID_CODE_GENERATION\";  // for return analysis\n  }\n\n  std::string ObjectFieldType(const FieldDef& field, bool in_a_table) {\n    const Type& type = field.value.type;\n    std::string ty;\n    switch (GetFullType(type)) {\n      case ftInteger:\n      case ftBool:\n      case ftFloat: {\n        ty = GetTypeBasic(type);\n        break;\n      }\n      case ftString: {\n        ty = \"alloc::string::String\";\n        break;\n      }\n      case ftStruct: {\n        ty = NamespacedNativeName(*type.struct_def);\n        break;\n      }\n      case ftTable: {\n        // Since Tables can contain themselves, Box is required to avoid\n        // infinite types.\n        ty =\n            \"alloc::boxed::Box<\" + NamespacedNativeName(*type.struct_def) + \">\";\n        break;\n      }\n      case ftUnionKey: {\n        // There is no native \"UnionKey\", natively, unions are rust enums with\n        // newtype-struct-variants.\n        return \"INVALID_CODE_GENERATION\";\n      }\n      case ftUnionValue: {\n        ty = NamespacedNativeName(*type.enum_def);\n        break;\n      }\n      case ftEnumKey: {\n        ty = WrapInNameSpace(*type.enum_def);\n        break;\n      }\n      // Vectors are in tables and are optional\n      case ftVectorOfEnumKey: {\n        ty = \"alloc::vec::Vec<\" + WrapInNameSpace(*type.VectorType().enum_def) +\n             \">\";\n        break;\n      }\n      case ftVectorOfInteger:\n      case ftVectorOfBool:\n      case ftVectorOfFloat: {\n        ty = \"alloc::vec::Vec<\" + GetTypeBasic(type.VectorType()) + \">\";\n        break;\n      }\n      case ftVectorOfString: {\n        ty = \"alloc::vec::Vec<alloc::string::String>\";\n        break;\n      }\n      case ftVectorOfTable:\n      case ftVectorOfStruct: {\n        ty = NamespacedNativeName(*type.VectorType().struct_def);\n        ty = \"alloc::vec::Vec<\" + ty + \">\";\n        break;\n      }\n      case ftVectorOfUnionValue: {\n        FLATBUFFERS_ASSERT(false && \"vectors of unions are not yet supported\");\n        return \"INVALID_CODE_GENERATION\";  // OH NO!\n      }\n      case ftArrayOfEnum: {\n        ty = \"[\" + WrapInNameSpace(*type.VectorType().enum_def) + \"; \" +\n             NumToString(type.fixed_length) + \"]\";\n        break;\n      }\n      case ftArrayOfStruct: {\n        ty = \"[\" + NamespacedNativeName(*type.VectorType().struct_def) + \"; \" +\n             NumToString(type.fixed_length) + \"]\";\n        break;\n      }\n      case ftArrayOfBuiltin: {\n        ty = \"[\" + GetTypeBasic(type.VectorType()) + \"; \" +\n             NumToString(type.fixed_length) + \"]\";\n        break;\n      }\n    }\n    if (in_a_table && !IsUnion(type) && field.IsOptional()) {\n      return \"Option<\" + ty + \">\";\n    } else {\n      return ty;\n    }\n  }\n\n  std::string TableBuilderArgsAddFuncType(const FieldDef& field,\n                                          const std::string& lifetime) {\n    const Type& type = field.value.type;\n\n    switch (GetFullType(field.value.type)) {\n      case ftVectorOfStruct: {\n        const auto typname = WrapInNameSpace(*type.struct_def);\n        return \"::flatbuffers::WIPOffset<::flatbuffers::Vector<\" + lifetime +\n               \", \" + typname + \">>\";\n      }\n      case ftVectorOfTable: {\n        const auto typname = WrapInNameSpace(*type.struct_def);\n        return \"::flatbuffers::WIPOffset<::flatbuffers::Vector<\" + lifetime +\n               \", ::flatbuffers::ForwardsUOffset<\" + typname + \"<\" + lifetime +\n               \">>>>\";\n      }\n      case ftVectorOfInteger:\n      case ftVectorOfBool:\n      case ftVectorOfFloat: {\n        const auto typname = GetTypeBasic(type.VectorType());\n        return \"::flatbuffers::WIPOffset<::flatbuffers::Vector<\" + lifetime +\n               \", \" + typname + \">>\";\n      }\n      case ftVectorOfString: {\n        return \"::flatbuffers::WIPOffset<::flatbuffers::Vector<\" + lifetime +\n               \", ::flatbuffers::ForwardsUOffset<&\" + lifetime + \" str>>>\";\n      }\n      case ftVectorOfEnumKey: {\n        const auto typname = WrapInNameSpace(*type.enum_def);\n        return \"::flatbuffers::WIPOffset<::flatbuffers::Vector<\" + lifetime +\n               \", \" + typname + \">>\";\n      }\n      case ftVectorOfUnionValue: {\n        return \"::flatbuffers::WIPOffset<::flatbuffers::Vector<\" + lifetime +\n               \", ::flatbuffers::ForwardsUOffset<::flatbuffers::Table<\" +\n               lifetime + \">>>\";\n      }\n      case ftEnumKey:\n      case ftUnionKey: {\n        const auto typname = WrapInNameSpace(*type.enum_def);\n        return typname;\n      }\n      case ftStruct: {\n        const auto typname = WrapInNameSpace(*type.struct_def);\n        return \"&\" + typname + \"\";\n      }\n      case ftTable: {\n        const auto typname = WrapInNameSpace(*type.struct_def);\n        return \"::flatbuffers::WIPOffset<\" + typname + \"<\" + lifetime + \">>\";\n      }\n      case ftInteger:\n      case ftBool:\n      case ftFloat: {\n        return GetTypeBasic(type);\n      }\n      case ftString: {\n        return \"::flatbuffers::WIPOffset<&\" + lifetime + \" str>\";\n      }\n      case ftUnionValue: {\n        return \"::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>\";\n      }\n      case ftArrayOfBuiltin: {\n        const auto typname = GetTypeBasic(type.VectorType());\n        return \"::flatbuffers::Array<\" + lifetime + \", \" + typname + \", \" +\n               NumToString(type.fixed_length) + \">\";\n      }\n      case ftArrayOfEnum: {\n        const auto typname = WrapInNameSpace(*type.enum_def);\n        return \"::flatbuffers::Array<\" + lifetime + \", \" + typname + \", \" +\n               NumToString(type.fixed_length) + \">\";\n      }\n      case ftArrayOfStruct: {\n        const auto typname = WrapInNameSpace(*type.struct_def);\n        return \"::flatbuffers::Array<\" + lifetime + \", \" + typname + \", \" +\n               NumToString(type.fixed_length) + \">\";\n      }\n    }\n\n    return \"INVALID_CODE_GENERATION\";  // for return analysis\n  }\n\n  std::string TableBuilderArgsAddFuncBody(const FieldDef& field) {\n    const Type& type = field.value.type;\n\n    switch (GetFullType(field.value.type)) {\n      case ftInteger:\n      case ftBool:\n      case ftFloat: {\n        const auto typname = GetTypeBasic(field.value.type);\n        return (field.IsOptional() ? \"self.fbb_.push_slot_always::<\"\n                                   : \"self.fbb_.push_slot::<\") +\n               typname + \">\";\n      }\n      case ftEnumKey:\n      case ftUnionKey: {\n        const auto underlying_typname = GetTypeBasic(type);\n        return (field.IsOptional() ? \"self.fbb_.push_slot_always::<\"\n                                   : \"self.fbb_.push_slot::<\") +\n               underlying_typname + \">\";\n      }\n\n      case ftStruct: {\n        const std::string typname = WrapInNameSpace(*type.struct_def);\n        return \"self.fbb_.push_slot_always::<&\" + typname + \">\";\n      }\n      case ftTable: {\n        const auto typname = WrapInNameSpace(*type.struct_def);\n        return \"self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<\" +\n               typname + \">>\";\n      }\n\n      case ftUnionValue:\n      case ftString:\n      case ftVectorOfInteger:\n      case ftVectorOfFloat:\n      case ftVectorOfBool:\n      case ftVectorOfEnumKey:\n      case ftVectorOfStruct:\n      case ftVectorOfTable:\n      case ftVectorOfString:\n      case ftVectorOfUnionValue: {\n        return \"self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>\";\n      }\n      case ftArrayOfEnum:\n      case ftArrayOfStruct:\n      case ftArrayOfBuiltin: {\n        FLATBUFFERS_ASSERT(false && \"arrays are not supported within tables\");\n        return \"ARRAYS_NOT_SUPPORTED_IN_TABLES\";\n      }\n    }\n    return \"INVALID_CODE_GENERATION\";  // for return analysis\n  }\n\n  std::string GenTableAccessorFuncReturnType(const FieldDef& field,\n                                             const std::string& lifetime) {\n    const Type& type = field.value.type;\n    const auto WrapOption = [&](std::string s) {\n      return field.IsOptional() ? \"Option<\" + s + \">\" : s;\n    };\n\n    switch (GetFullType(field.value.type)) {\n      case ftInteger:\n      case ftFloat:\n      case ftBool: {\n        return WrapOption(GetTypeBasic(type));\n      }\n      case ftStruct: {\n        const auto typname = WrapInNameSpace(*type.struct_def);\n        return WrapOption(\"&\" + lifetime + \" \" + typname);\n      }\n      case ftTable: {\n        const auto typname = WrapInNameSpace(*type.struct_def);\n        return WrapOption(typname + \"<\" + lifetime + \">\");\n      }\n      case ftEnumKey:\n      case ftUnionKey: {\n        return WrapOption(WrapInNameSpace(*type.enum_def));\n      }\n\n      case ftUnionValue: {\n        return WrapOption(\"::flatbuffers::Table<\" + lifetime + \">\");\n      }\n      case ftString: {\n        return WrapOption(\"&\" + lifetime + \" str\");\n      }\n      case ftVectorOfInteger:\n      case ftVectorOfBool:\n      case ftVectorOfFloat: {\n        const auto typname = GetTypeBasic(type.VectorType());\n        return WrapOption(\"::flatbuffers::Vector<\" + lifetime + \", \" + typname +\n                          \">\");\n      }\n      case ftVectorOfEnumKey: {\n        const auto typname = WrapInNameSpace(*type.enum_def);\n        return WrapOption(\"::flatbuffers::Vector<\" + lifetime + \", \" + typname +\n                          \">\");\n      }\n      case ftVectorOfStruct: {\n        const auto typname = WrapInNameSpace(*type.struct_def);\n        return WrapOption(\"::flatbuffers::Vector<\" + lifetime + \", \" + typname +\n                          \">\");\n      }\n      case ftVectorOfTable: {\n        const auto typname = WrapInNameSpace(*type.struct_def);\n        return WrapOption(\"::flatbuffers::Vector<\" + lifetime +\n                          \", ::flatbuffers::ForwardsUOffset<\" + typname + \"<\" +\n                          lifetime + \">>>\");\n      }\n      case ftVectorOfString: {\n        return WrapOption(\"::flatbuffers::Vector<\" + lifetime +\n                          \", ::flatbuffers::ForwardsUOffset<&\" + lifetime +\n                          \" str>>\");\n      }\n      case ftVectorOfUnionValue: {\n        FLATBUFFERS_ASSERT(false && \"vectors of unions are not yet supported\");\n        // TODO(rw): when we do support these, we should consider using the\n        //           Into trait to convert tables to typesafe union values.\n        return \"INVALID_CODE_GENERATION\";  // for return analysis\n      }\n      case ftArrayOfEnum:\n      case ftArrayOfStruct:\n      case ftArrayOfBuiltin: {\n        FLATBUFFERS_ASSERT(false && \"arrays are not supported within tables\");\n        return \"ARRAYS_NOT_SUPPORTED_IN_TABLES\";\n      }\n    }\n    return \"INVALID_CODE_GENERATION\";  // for return analysis\n  }\n\n  std::string FollowType(const Type& type, const std::string& lifetime) {\n    // IsVector... This can be made iterative?\n\n    const auto WrapForwardsUOffset = [](std::string ty) -> std::string {\n      return \"::flatbuffers::ForwardsUOffset<\" + ty + \">\";\n    };\n    const auto WrapVector = [&](std::string ty) -> std::string {\n      return \"::flatbuffers::Vector<\" + lifetime + \", \" + ty + \">\";\n    };\n    const auto WrapArray = [&](std::string ty, uint16_t length) -> std::string {\n      return \"::flatbuffers::Array<\" + lifetime + \", \" + ty + \", \" +\n             NumToString(length) + \">\";\n    };\n    switch (GetFullType(type)) {\n      case ftInteger:\n      case ftFloat:\n      case ftBool: {\n        return GetTypeBasic(type);\n      }\n      case ftStruct: {\n        return WrapInNameSpace(*type.struct_def);\n      }\n      case ftUnionKey:\n      case ftEnumKey: {\n        return WrapInNameSpace(*type.enum_def);\n      }\n      case ftTable: {\n        const auto typname = WrapInNameSpace(*type.struct_def);\n        return WrapForwardsUOffset(typname);\n      }\n      case ftUnionValue: {\n        return WrapForwardsUOffset(\"::flatbuffers::Table<\" + lifetime + \">\");\n      }\n      case ftString: {\n        return WrapForwardsUOffset(\"&str\");\n      }\n      case ftVectorOfInteger:\n      case ftVectorOfBool:\n      case ftVectorOfFloat: {\n        const auto typname = GetTypeBasic(type.VectorType());\n        return WrapForwardsUOffset(WrapVector(typname));\n      }\n      case ftVectorOfEnumKey: {\n        const auto typname = WrapInNameSpace(*type.VectorType().enum_def);\n        return WrapForwardsUOffset(WrapVector(typname));\n      }\n      case ftVectorOfStruct: {\n        const auto typname = WrapInNameSpace(*type.struct_def);\n        return WrapForwardsUOffset(WrapVector(typname));\n      }\n      case ftVectorOfTable: {\n        const auto typname = WrapInNameSpace(*type.struct_def);\n        return WrapForwardsUOffset(WrapVector(WrapForwardsUOffset(typname)));\n      }\n      case ftVectorOfString: {\n        return WrapForwardsUOffset(\n            WrapVector(WrapForwardsUOffset(\"&\" + lifetime + \" str\")));\n      }\n      case ftVectorOfUnionValue: {\n        FLATBUFFERS_ASSERT(false && \"vectors of unions are not yet supported\");\n        return \"INVALID_CODE_GENERATION\";  // for return analysis\n      }\n      case ftArrayOfEnum: {\n        const auto typname = WrapInNameSpace(*type.VectorType().enum_def);\n        return WrapArray(typname, type.fixed_length);\n      }\n      case ftArrayOfStruct: {\n        const auto typname = WrapInNameSpace(*type.struct_def);\n        return WrapArray(typname, type.fixed_length);\n      }\n      case ftArrayOfBuiltin: {\n        const auto typname = GetTypeBasic(type.VectorType());\n        return WrapArray(typname, type.fixed_length);\n      }\n    }\n    return \"INVALID_CODE_GENERATION\";  // for return analysis\n  }\n\n  std::string GenTableAccessorFuncBody(const FieldDef& field,\n                                       const std::string& lifetime) {\n    const std::string vt_offset = namer_.LegacyRustFieldOffsetName(field);\n    const std::string typname = FollowType(field.value.type, lifetime);\n    // Default-y fields (scalars so far) are neither optional nor required.\n    const std::string default_value =\n        !(field.IsOptional() || field.IsRequired())\n            ? \"Some(\" + GetDefaultValue(field, kAccessor) + \")\"\n            : \"None\";\n    const std::string unwrap = field.IsOptional() ? \"\" : \".unwrap()\";\n\n    return \"unsafe { self._tab.get::<\" + typname +\n           \">({{STRUCT_TY}}::\" + vt_offset + \", \" + default_value + \")\" +\n           unwrap + \"}\";\n  }\n\n  // Generates a fully-qualified name getter for use with --gen-name-strings\n  void GenFullyQualifiedNameGetter(const StructDef& struct_def,\n                                   const std::string& name) {\n    const std::string fully_qualified_name =\n        struct_def.defined_namespace->GetFullyQualifiedName(name);\n    code_ += \"    pub const fn get_fully_qualified_name() -> &'static str {\";\n    code_ += \"        \\\"\" + fully_qualified_name + \"\\\"\";\n    code_ += \"    }\";\n    code_ += \"\";\n  }\n\n  void ForAllUnionVariantsBesidesNone(\n      const EnumDef& def, std::function<void(const EnumVal& ev)> cb) {\n    FLATBUFFERS_ASSERT(def.is_union);\n\n    for (auto it = def.Vals().begin(); it != def.Vals().end(); ++it) {\n      const EnumVal& ev = **it;\n      // TODO(cneo): Can variants be deprecated, should we skip them?\n      if (ev.union_type.base_type == BASE_TYPE_NONE) {\n        continue;\n      }\n      code_.SetValue(\n          \"U_ELEMENT_ENUM_TYPE\",\n          WrapInNameSpace(def.defined_namespace, namer_.EnumVariant(def, ev)));\n      code_.SetValue(\n          \"U_ELEMENT_TABLE_TYPE\",\n          WrapInNameSpace(ev.union_type.struct_def->defined_namespace,\n                          ev.union_type.struct_def->name));\n      code_.SetValue(\"U_ELEMENT_NAME\", namer_.Function(ev.name));\n      cb(ev);\n    }\n  }\n\n  void ForAllTableFields(const StructDef& struct_def,\n                         std::function<void(const FieldDef&)> cb,\n                         bool reversed = false) {\n    // TODO(cneo): Remove `reversed` overload. It's only here to minimize the\n    // diff when refactoring to the `ForAllX` helper functions.\n    auto go = [&](const FieldDef& field) {\n      if (field.deprecated) return;\n      code_.SetValue(\"OFFSET_NAME\", namer_.LegacyRustFieldOffsetName(field));\n      code_.SetValue(\"OFFSET_VALUE\", NumToString(field.value.offset));\n      code_.SetValue(\"FIELD\", namer_.Field(field));\n      code_.SetValue(\"BLDR_DEF_VAL\", GetDefaultValue(field, kBuilder));\n      code_.SetValue(\"DISCRIMINANT\", namer_.LegacyRustUnionTypeMethod(field));\n      code_.IncrementIdentLevel();\n      cb(field);\n      code_.DecrementIdentLevel();\n    };\n    const auto& fields = struct_def.fields.vec;\n    if (reversed) {\n      for (auto it = fields.rbegin(); it != fields.rend(); ++it) go(**it);\n    } else {\n      for (auto it = fields.begin(); it != fields.end(); ++it) go(**it);\n    }\n  }\n  // Generate an accessor struct, builder struct, and create function for a\n  // table.\n  void GenTable(const StructDef& struct_def) {\n    code_ += \"\";\n\n    const bool is_private =\n        parser_.opts.no_leak_private_annotations &&\n        (struct_def.attributes.Lookup(\"private\") != nullptr);\n    code_.SetValue(\"ACCESS_TYPE\", is_private ? \"pub(crate)\" : \"pub\");\n    code_.SetValue(\"STRUCT_TY\", namer_.Type(struct_def));\n    code_.SetValue(\"STRUCT_FN\", namer_.Function(struct_def));\n\n    // Generate an offset type, the base type, the Follow impl, and the\n    // init_from_table impl.\n    code_ += \"{{ACCESS_TYPE}} enum {{STRUCT_TY}}Offset {}\";\n    code_ += \"\";\n\n    GenComment(struct_def.doc_comment);\n\n    code_ += \"#[derive(Copy, Clone, PartialEq)]\";\n    code_ += \"{{ACCESS_TYPE}} struct {{STRUCT_TY}}<'a> {\";\n    code_ += \"    pub _tab: ::flatbuffers::Table<'a>,\";\n    code_ += \"}\";\n    code_ += \"\";\n    code_ += \"impl<'a> ::flatbuffers::Follow<'a> for {{STRUCT_TY}}<'a> {\";\n    code_ += \"    type Inner = {{STRUCT_TY}}<'a>;\";\n    code_ += \"\";\n    code_ += \"    #[inline]\";\n    code_ += \"    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\";\n    code_ +=\n        \"        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\";\n    code_ += \"    }\";\n    code_ += \"}\";\n    code_ += \"\";\n    code_ += \"impl<'a> {{STRUCT_TY}}<'a> {\";\n\n    // Generate field id constants.\n    ForAllTableFields(struct_def, [&](const FieldDef& unused) {\n      (void)unused;\n      code_ +=\n          \"pub const {{OFFSET_NAME}}: ::flatbuffers::VOffsetT = \"\n          \"{{OFFSET_VALUE}};\";\n    });\n\n    if (struct_def.fields.vec.size() > 0) { code_ += \"\"; }\n\n    if (parser_.opts.generate_name_strings) {\n      GenFullyQualifiedNameGetter(struct_def, struct_def.name);\n    }\n\n    code_ += \"    #[inline]\";\n    code_ +=\n        \"    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> \"\n        \"Self {\";\n    code_ += \"        {{STRUCT_TY}} { _tab: table }\";\n    code_ += \"    }\";\n    code_ += \"\";\n\n    // Generate a convenient create* function that uses the above builder\n    // to create a table in one function call.\n    code_.SetValue(\"MAYBE_US\", struct_def.fields.vec.size() == 0 ? \"_\" : \"\");\n    code_.SetValue(\"MAYBE_LT\",\n                   TableBuilderArgsNeedsLifetime(struct_def) ? \"<'args>\" : \"\");\n    code_ += \"    #[allow(unused_mut)]\";\n    code_ +=\n        \"    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: \"\n        \"::flatbuffers::Allocator + 'bldr>(\";\n    code_ +=\n        \"        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, \"\n        \"A>,\";\n    code_ += \"        {{MAYBE_US}}args: &'args {{STRUCT_TY}}Args{{MAYBE_LT}}\";\n    code_ += \"    ) -> ::flatbuffers::WIPOffset<{{STRUCT_TY}}<'bldr>> {\";\n\n    code_ += \"        let mut builder = {{STRUCT_TY}}Builder::new(_fbb);\";\n    for (size_t size = struct_def.sortbysize ? sizeof(largest_scalar_t) : 1;\n         size; size /= 2) {\n      ForAllTableFields(\n          struct_def,\n          [&](const FieldDef& field) {\n            if (struct_def.sortbysize &&\n                size != SizeOf(field.value.type.base_type))\n              return;\n            if (IsOptionalToBuilder(field)) {\n              code_ +=\n                  \"    if let Some(x) = args.{{FIELD}} \"\n                  \"{ builder.add_{{FIELD}}(x); }\";\n            } else {\n              code_ += \"    builder.add_{{FIELD}}(args.{{FIELD}});\";\n            }\n          },\n          /*reverse=*/true);\n    }\n    code_ += \"        builder.finish()\";\n    code_ += \"    }\";\n    code_ += \"\";\n\n    // Generate Object API Packer function.\n    if (parser_.opts.generate_object_based_api) {\n      // TODO(cneo): Replace more for loops with ForAllX stuff.\n      // TODO(cneo): Manage indentation with IncrementIdentLevel?\n      code_.SetValue(\"STRUCT_OTY\", namer_.ObjectType(struct_def));\n      code_ += \"    pub fn unpack(&self) -> {{STRUCT_OTY}} {\";\n      ForAllObjectTableFields(struct_def, [&](const FieldDef& field) {\n        const Type& type = field.value.type;\n        switch (GetFullType(type)) {\n          case ftInteger:\n          case ftBool:\n          case ftFloat:\n          case ftEnumKey: {\n            code_ += \"    let {{FIELD}} = self.{{FIELD}}();\";\n            return;\n          }\n          case ftUnionKey:\n            return;\n          case ftUnionValue: {\n            const auto& enum_def = *type.enum_def;\n            code_.SetValue(\"ENUM_TY\", WrapInNameSpace(enum_def));\n            code_.SetValue(\"NATIVE_ENUM_NAME\", NamespacedNativeName(enum_def));\n            code_.SetValue(\"UNION_TYPE_METHOD\",\n                           namer_.LegacyRustUnionTypeMethod(field));\n\n            code_ += \"    let {{FIELD}} = match self.{{UNION_TYPE_METHOD}}() {\";\n            code_ += \"        {{ENUM_TY}}::NONE => {{NATIVE_ENUM_NAME}}::NONE,\";\n            ForAllUnionObjectVariantsBesidesNone(enum_def, [&] {\n              code_ +=\n                  \"    {{ENUM_TY}}::{{VARIANT_NAME}} => \"\n                  \"{{NATIVE_ENUM_NAME}}::{{NATIVE_VARIANT}}(alloc::boxed::Box::\"\n                  \"new(\";\n              code_ += \"        self.{{FIELD}}_as_{{U_ELEMENT_NAME}}()\";\n              code_ +=\n                  \"            .expect(\\\"Invalid union table, \"\n                  \"expected `{{ENUM_TY}}::{{VARIANT_NAME}}`.\\\")\";\n              code_ += \"            .unpack()\";\n              code_ += \"    )),\";\n            });\n            // Maybe we shouldn't throw away unknown discriminants?\n            code_ += \"        _ => {{NATIVE_ENUM_NAME}}::NONE,\";\n            code_ += \"    };\";\n            return;\n          }\n          // The rest of the types need special handling based on if the field\n          // is optional or not.\n          case ftString: {\n            code_.SetValue(\"EXPR\", \"alloc::string::ToString::to_string(x)\");\n            break;\n          }\n          case ftStruct: {\n            code_.SetValue(\"EXPR\", \"x.unpack()\");\n            break;\n          }\n          case ftTable: {\n            code_.SetValue(\"EXPR\", \"alloc::boxed::Box::new(x.unpack())\");\n            break;\n          }\n          case ftVectorOfInteger:\n          case ftVectorOfBool:\n          case ftVectorOfFloat:\n          case ftVectorOfEnumKey: {\n            code_.SetValue(\"EXPR\", \"x.into_iter().collect()\");\n            break;\n          }\n          case ftVectorOfString: {\n            code_.SetValue(\"EXPR\",\n                           \"x.iter().map(|s| \"\n                           \"alloc::string::ToString::to_string(s)).collect()\");\n            break;\n          }\n          case ftVectorOfStruct:\n          case ftVectorOfTable: {\n            code_.SetValue(\"EXPR\", \"x.iter().map(|t| t.unpack()).collect()\");\n            break;\n          }\n          case ftVectorOfUnionValue: {\n            FLATBUFFERS_ASSERT(false && \"vectors of unions not yet supported\");\n            return;\n          }\n          case ftArrayOfEnum:\n          case ftArrayOfStruct:\n          case ftArrayOfBuiltin: {\n            FLATBUFFERS_ASSERT(false &&\n                               \"arrays are not supported within tables\");\n            return;\n          }\n        }\n        if (field.IsOptional()) {\n          code_ += \"    let {{FIELD}} = self.{{FIELD}}().map(|x| {\";\n          code_ += \"        {{EXPR}}\";\n          code_ += \"    });\";\n        } else {\n          code_ += \"    let {{FIELD}} = {\";\n          code_ += \"        let x = self.{{FIELD}}();\";\n          code_ += \"        {{EXPR}}\";\n          code_ += \"    };\";\n        }\n      });\n\n      code_ += \"        {{STRUCT_OTY}} {\";\n      ForAllObjectTableFields(struct_def, [&](const FieldDef& field) {\n        if (field.value.type.base_type == BASE_TYPE_UTYPE) return;\n        code_ += \"        {{FIELD}},\";\n      });\n      code_ += \"        }\";\n      code_ += \"    }\";\n    }\n\n    // Generate the accessors. Each has one of two forms:\n    //\n    // If a value can be None:\n    //   pub fn name(&'a self) -> Option<user_facing_type> {\n    //     self._tab.get::<internal_type>(offset, defaultval)\n    //   }\n    //\n    // If a value is always Some:\n    //   pub fn name(&'a self) -> user_facing_type {\n    //     self._tab.get::<internal_type>(offset, defaultval).unwrap()\n    //   }\n    ForAllTableFields(struct_def, [&](const FieldDef& field) {\n      code_ += \"\";\n      code_.SetValue(\"RETURN_TYPE\",\n                     GenTableAccessorFuncReturnType(field, \"'a\"));\n\n      this->GenComment(field.doc_comment);\n      code_ += \"#[inline]\";\n      code_ += \"pub fn {{FIELD}}(&self) -> {{RETURN_TYPE}} {\";\n      code_ += \"    // Safety:\";\n      code_ += \"    // Created from valid Table for this object\";\n      code_ += \"    // which contains a valid value in this slot\";\n      code_ += \"    \" + GenTableAccessorFuncBody(field, \"'a\");\n      code_ += \"}\";\n\n      // Generate a comparison function for this field if it is a key.\n      if (field.key) {\n        GenKeyFieldMethods(field);\n      }\n\n      // Generate a nested flatbuffer field, if applicable.\n      auto nested = field.attributes.Lookup(\"nested_flatbuffer\");\n      if (nested) {\n        std::string qualified_name = nested->constant;\n        auto nested_root = parser_.LookupStruct(nested->constant);\n        if (nested_root == nullptr) {\n          qualified_name = parser_.current_namespace_->GetFullyQualifiedName(\n              nested->constant);\n          nested_root = parser_.LookupStruct(qualified_name);\n        }\n        FLATBUFFERS_ASSERT(nested_root);  // Guaranteed to exist by parser.\n\n        code_.SetValue(\"NESTED\", WrapInNameSpace(*nested_root));\n        code_ += \"\";\n        code_ += \"pub fn {{FIELD}}_nested_flatbuffer(&'a self) -> \\\\\";\n        if (field.IsRequired()) {\n          code_ += \"{{NESTED}}<'a> {\";\n          code_ += \"    let data = self.{{FIELD}}();\";\n          code_ += \"    use ::flatbuffers::Follow;\";\n          code_ += \"    // Safety:\";\n          code_ += \"    // Created from a valid Table for this object\";\n          code_ += \"    // Which contains a valid flatbuffer in this slot\";\n          code_ +=\n              \"    unsafe { <::flatbuffers::ForwardsUOffset<{{NESTED}}<'a>>>\"\n              \"::follow(data.bytes(), 0) }\";\n        } else {\n          code_ += \"Option<{{NESTED}}<'a>> {\";\n          code_ += \"    self.{{FIELD}}().map(|data| {\";\n          code_ += \"        use ::flatbuffers::Follow;\";\n          code_ += \"        // Safety:\";\n          code_ += \"        // Created from a valid Table for this object\";\n          code_ += \"        // Which contains a valid flatbuffer in this slot\";\n          code_ +=\n              \"        unsafe { \"\n              \"<::flatbuffers::ForwardsUOffset<{{NESTED}}<'a>>>\"\n              \"::follow(data.bytes(), 0) }\";\n          code_ += \"    })\";\n        }\n        code_ += \"}\";\n      }\n    });\n\n    // Explicit specializations for union accessors\n    ForAllTableFields(struct_def, [&](const FieldDef& field) {\n      if (field.value.type.base_type != BASE_TYPE_UNION) return;\n      ForAllUnionVariantsBesidesNone(\n          *field.value.type.enum_def, [&](const EnumVal& unused) {\n            (void)unused;\n            code_ += \"\";\n            code_ += \"#[inline]\";\n            code_ += \"#[allow(non_snake_case)]\";\n            code_ +=\n                \"pub fn {{FIELD}}_as_{{U_ELEMENT_NAME}}(&self) -> \"\n                \"Option<{{U_ELEMENT_TABLE_TYPE}}<'a>> {\";\n            // If the user defined schemas name a field that clashes with a\n            // language reserved word, flatc will try to escape the field name\n            // by appending an underscore. This works well for most cases,\n            // except one. When generating union accessors (and referring to\n            // them internally within the code generated here), an extra\n            // underscore will be appended to the name, causing build failures.\n            //\n            // This only happens when unions have members that overlap with\n            // language reserved words.\n            //\n            // To avoid this problem the type field name is used unescaped here:\n            code_ +=\n                \"    if self.{{DISCRIMINANT}}() == {{U_ELEMENT_ENUM_TYPE}} {\";\n\n            // The following logic is not tested in the integration test,\n            // as of April 10, 2020\n            if (field.IsRequired()) {\n              code_ += \"        let u = self.{{FIELD}}();\";\n              code_ += \"        // Safety:\";\n              code_ += \"        // Created from a valid Table for this object\";\n              code_ += \"        // Which contains a valid union in this slot\";\n              code_ +=\n                  \"    Some(unsafe { \"\n                  \"{{U_ELEMENT_TABLE_TYPE}}::init_from_table(u) })\";\n            } else {\n              code_ += \"        self.{{FIELD}}().map(|t| {\";\n              code_ += \"            // Safety:\";\n              code_ +=\n                  \"            // Created from a valid Table for this object\";\n              code_ +=\n                  \"            // Which contains a valid union in this slot\";\n              code_ +=\n                  \"            unsafe { \"\n                  \"{{U_ELEMENT_TABLE_TYPE}}::init_from_table(t) \"\n                  \"}\";\n              code_ += \"        })\";\n            }\n            code_ += \"    } else {\";\n            code_ += \"        None\";\n            code_ += \"    }\";\n            code_ += \"}\";\n          });\n    });\n    code_ += \"}\";  // End of table impl.\n    code_ += \"\";\n\n    // Generate Verifier;\n    code_ += \"impl ::flatbuffers::Verifiable for {{STRUCT_TY}}<'_> {\";\n    code_ += \"    #[inline]\";\n    code_ += \"    fn run_verifier(\";\n    code_ += \"        v: &mut ::flatbuffers::Verifier, pos: usize\";\n    code_ += \"    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\";\n    code_ += \"        v.visit_table(pos)?\";\n    // Escape newline and insert it onthe next line so we can end the builder\n    // with a nice semicolon.\n    ForAllTableFields(struct_def, [&](const FieldDef& field) {\n      if (GetFullType(field.value.type) == ftUnionKey) return;\n\n      code_.SetValue(\"IS_REQ\", field.IsRequired() ? \"true\" : \"false\");\n      if (GetFullType(field.value.type) != ftUnionValue) {\n        // All types besides unions.\n        code_.SetValue(\"TY\", FollowType(field.value.type, \"'_\"));\n        code_ +=\n            \"        .visit_field::<{{TY}}>(\\\"{{FIELD}}\\\", \"\n            \"Self::{{OFFSET_NAME}}, {{IS_REQ}})?\";\n        return;\n      }\n      // Unions.\n      const EnumDef& union_def = *field.value.type.enum_def;\n      code_.SetValue(\"UNION_TYPE\", WrapInNameSpace(union_def));\n      code_.SetValue(\"UNION_TYPE_OFFSET_NAME\",\n                     namer_.LegacyRustUnionTypeOffsetName(field));\n      code_.SetValue(\"UNION_TYPE_METHOD\",\n                     namer_.LegacyRustUnionTypeMethod(field));\n      code_ +=\n          \"        .visit_union::<{{UNION_TYPE}}, _>(\"\n          \"\\\"{{UNION_TYPE_METHOD}}\\\", Self::{{UNION_TYPE_OFFSET_NAME}}, \"\n          \"\\\"{{FIELD}}\\\", Self::{{OFFSET_NAME}}, {{IS_REQ}}, \"\n          \"|key, v, pos| {\";\n      code_ += \"            match key {\";\n      ForAllUnionVariantsBesidesNone(union_def, [&](const EnumVal& unused) {\n        (void)unused;\n        code_ +=\n            \"                {{U_ELEMENT_ENUM_TYPE}} => \"\n            \"v.verify_union_variant::\"\n            \"<::flatbuffers::ForwardsUOffset<{{U_ELEMENT_TABLE_TYPE}}>>(\"\n            \"\\\"{{U_ELEMENT_ENUM_TYPE}}\\\", pos),\";\n      });\n      code_ += \"                _ => Ok(()),\";\n      code_ += \"            }\";\n      code_ += \"        })?\";\n    });\n    code_ += \"            .finish();\";\n    code_ += \"        Ok(())\";\n    code_ += \"    }\";\n    code_ += \"}\";\n    code_ += \"\";\n\n    // Generate an args struct:\n    code_.SetValue(\"MAYBE_LT\",\n                   TableBuilderArgsNeedsLifetime(struct_def) ? \"<'a>\" : \"\");\n    code_ += \"{{ACCESS_TYPE}} struct {{STRUCT_TY}}Args{{MAYBE_LT}} {\";\n    ForAllTableFields(struct_def, [&](const FieldDef& field) {\n      code_.SetValue(\"PARAM_TYPE\", TableBuilderArgsDefnType(field, \"'a\"));\n      code_ += \"pub {{FIELD}}: {{PARAM_TYPE}},\";\n    });\n    code_ += \"}\";\n    code_ += \"\";\n\n    // Generate an impl of Default for the *Args type:\n    code_ += \"impl<'a> Default for {{STRUCT_TY}}Args{{MAYBE_LT}} {\";\n    code_ += \"    #[inline]\";\n    code_ += \"    fn default() -> Self {\";\n    code_ += \"        {{STRUCT_TY}}Args {\";\n    ForAllTableFields(struct_def, [&](const FieldDef& field) {\n      code_ += \"        {{FIELD}}: {{BLDR_DEF_VAL}},\\\\\";\n      code_ += field.IsRequired() ? \" // required field\" : \"\";\n    });\n    code_ += \"        }\";\n    code_ += \"    }\";\n    code_ += \"}\";\n    code_ += \"\";\n\n    // Implement serde::Serialize\n    if (parser_.opts.rust_serialize) {\n      const auto numFields = struct_def.fields.vec.size();\n      code_.SetValue(\"NUM_FIELDS\", NumToString(numFields));\n      code_ += \"impl Serialize for {{STRUCT_TY}}<'_> {\";\n      code_ +=\n          \"    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, \"\n          \"S::Error>\";\n      code_ += \"    where\";\n      code_ += \"        S: Serializer,\";\n      code_ += \"    {\";\n      if (numFields == 0) {\n        code_ +=\n            \"        let s = serializer.serialize_struct(\\\"{{STRUCT_TY}}\\\", \"\n            \"0)?;\";\n      } else {\n        code_ +=\n            \"        let mut s = \"\n            \"serializer.serialize_struct(\\\"{{STRUCT_TY}}\\\", {{NUM_FIELDS}})?;\";\n      }\n      ForAllTableFields(struct_def, [&](const FieldDef& field) {\n        const Type& type = field.value.type;\n        if (IsUnion(type)) {\n          if (type.base_type == BASE_TYPE_UNION) {\n            const auto& enum_def = *type.enum_def;\n            code_.SetValue(\"ENUM_TY\", WrapInNameSpace(enum_def));\n            code_.SetValue(\"FIELD\", namer_.Field(field));\n            code_.SetValue(\"UNION_TYPE_METHOD\",\n                           namer_.LegacyRustUnionTypeMethod(field));\n\n            code_ += \"    match self.{{UNION_TYPE_METHOD}}() {\";\n            code_ += \"        {{ENUM_TY}}::NONE => (),\";\n            ForAllUnionObjectVariantsBesidesNone(enum_def, [&] {\n              code_.SetValue(\"FIELD\", namer_.Field(field));\n              code_ += \"        {{ENUM_TY}}::{{VARIANT_NAME}} => {\";\n              code_ +=\n                  \"            let f = \"\n                  \"self.{{FIELD}}_as_{{U_ELEMENT_NAME}}()\";\n              code_ +=\n                  \"                .expect(\\\"Invalid union table, expected \"\n                  \"`{{ENUM_TY}}::{{VARIANT_NAME}}`.\\\");\";\n              code_ += \"            s.serialize_field(\\\"{{FIELD}}\\\", &f)?;\";\n              code_ += \"        }\";\n            });\n            code_ += \"        _ => unimplemented!(),\";\n            code_ += \"    }\";\n          } else {\n            code_ +=\n                \"    s.serialize_field(\\\"{{FIELD}}\\\", \"\n                \"&self.{{FIELD}}())?;\";\n          }\n        } else {\n          if (field.IsOptional()) {\n            code_ += \"    if let Some(f) = self.{{FIELD}}() {\";\n            code_ += \"        s.serialize_field(\\\"{{FIELD}}\\\", &f)?;\";\n            code_ += \"    } else {\";\n            code_ += \"        s.skip_field(\\\"{{FIELD}}\\\")?;\";\n            code_ += \"    }\";\n          } else {\n            code_ +=\n                \"    s.serialize_field(\\\"{{FIELD}}\\\", \"\n                \"&self.{{FIELD}}())?;\";\n          }\n        }\n      });\n      code_ += \"        s.end()\";\n      code_ += \"    }\";\n      code_ += \"}\";\n      code_ += \"\";\n    }\n\n    // Generate a builder struct:\n    code_ +=\n        \"{{ACCESS_TYPE}} struct {{STRUCT_TY}}Builder<'a: 'b, 'b, A: \"\n        \"::flatbuffers::Allocator + 'a> {\";\n    code_ += \"    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\";\n    code_ +=\n        \"    start_: ::flatbuffers::WIPOffset<\"\n        \"::flatbuffers::TableUnfinishedWIPOffset>,\";\n    code_ += \"}\";\n    code_ += \"\";\n\n    // Generate builder functions:\n    code_ +=\n        \"impl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> \"\n        \"{{STRUCT_TY}}Builder<'a, \"\n        \"'b, A> {\";\n    ForAllTableFields(struct_def, [&](const FieldDef& field) {\n      const bool is_scalar = IsScalar(field.value.type.base_type);\n      std::string offset = namer_.LegacyRustFieldOffsetName(field);\n      // Generate functions to add data, which take one of two forms.\n      //\n      // If a value has a default:\n      //   fn add_x(x_: type) {\n      //     fbb_.push_slot::<type>(offset, x_, Some(default));\n      //   }\n      //\n      // If a value does not have a default:\n      //   fn add_x(x_: type) {\n      //     fbb_.push_slot_always::<type>(offset, x_);\n      //   }\n      code_.SetValue(\"FIELD_OFFSET\", namer_.Type(struct_def) + \"::\" + offset);\n      code_.SetValue(\"FIELD_TYPE\", TableBuilderArgsAddFuncType(field, \"'b \"));\n      code_.SetValue(\"FUNC_BODY\", TableBuilderArgsAddFuncBody(field));\n      code_ += \"#[inline]\";\n      code_ +=\n          \"pub fn add_{{FIELD}}(&mut self, {{FIELD}}: \"\n          \"{{FIELD_TYPE}}) {\";\n      if (is_scalar && !field.IsOptional()) {\n        code_ +=\n            \"    {{FUNC_BODY}}({{FIELD_OFFSET}}, {{FIELD}}, \"\n            \"{{BLDR_DEF_VAL}});\";\n      } else {\n        code_ += \"    {{FUNC_BODY}}({{FIELD_OFFSET}}, {{FIELD}});\";\n      }\n      code_ += \"}\";\n      code_ += \"\";\n    });\n\n    // Struct initializer (all fields required);\n    code_ += \"    #[inline]\";\n    code_ +=\n        \"    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) \"\n        \"-> \"\n        \"{{STRUCT_TY}}Builder<'a, 'b, A> {\";\n    code_.SetValue(\"NUM_FIELDS\", NumToString(struct_def.fields.vec.size()));\n    code_ += \"        let start = _fbb.start_table();\";\n    code_ += \"        {{STRUCT_TY}}Builder {\";\n    code_ += \"            fbb_: _fbb,\";\n    code_ += \"            start_: start,\";\n    code_ += \"        }\";\n    code_ += \"    }\";\n    code_ += \"\";\n\n    // finish() function.\n    code_ += \"    #[inline]\";\n    code_ +=\n        \"    pub fn finish(self) -> \"\n        \"::flatbuffers::WIPOffset<{{STRUCT_TY}}<'a>> {\";\n    code_ += \"        let o = self.fbb_.end_table(self.start_);\";\n\n    ForAllTableFields(struct_def, [&](const FieldDef& field) {\n      if (!field.IsRequired()) return;\n      code_ +=\n          \"    self.fbb_.required(o, {{STRUCT_TY}}::{{OFFSET_NAME}},\"\n          \"\\\"{{FIELD}}\\\");\";\n    });\n    code_ += \"        ::flatbuffers::WIPOffset::new(o.value())\";\n    code_ += \"    }\";\n    code_ += \"}\";\n    code_ += \"\";\n\n    code_ += \"impl ::core::fmt::Debug for {{STRUCT_TY}}<'_> {\";\n    code_ +=\n        \"    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>\"\n        \") -> ::core::fmt::Result {\";\n    code_ += \"        let mut ds = f.debug_struct(\\\"{{STRUCT_TY}}\\\");\";\n    ForAllTableFields(struct_def, [&](const FieldDef& field) {\n      if (GetFullType(field.value.type) == ftUnionValue) {\n        // Generate a match statement to handle unions properly.\n        code_.SetValue(\"KEY_TYPE\", GenTableAccessorFuncReturnType(field, \"\"));\n        code_.SetValue(\"UNION_ERR\",\n                       \"&\\\"InvalidFlatbuffer: Union discriminant\"\n                       \" does not match value.\\\"\");\n\n        code_ += \"    match self.{{DISCRIMINANT}}() {\";\n        ForAllUnionVariantsBesidesNone(\n            *field.value.type.enum_def, [&](const EnumVal& unused) {\n              (void)unused;\n              code_ += \"        {{U_ELEMENT_ENUM_TYPE}} => {\";\n              code_ +=\n                  \"            if let Some(x) = \"\n                  \"self.{{FIELD}}_as_\"\n                  \"{{U_ELEMENT_NAME}}() {\";\n              code_ += \"                ds.field(\\\"{{FIELD}}\\\", &x)\";\n              code_ += \"            } else {\";\n              code_ += \"                ds.field(\\\"{{FIELD}}\\\", {{UNION_ERR}})\";\n              code_ += \"            }\";\n              code_ += \"        },\";\n            });\n        code_ += \"        _ => {\";\n        code_ += \"            let x: Option<()> = None;\";\n        code_ += \"            ds.field(\\\"{{FIELD}}\\\", &x)\";\n        code_ += \"        },\";\n        code_ += \"    };\";\n      } else {\n        // Most fields.\n        code_ += \"    ds.field(\\\"{{FIELD}}\\\", &self.{{FIELD}}());\";\n      }\n    });\n    code_ += \"        ds.finish()\";\n    code_ += \"    }\";\n    code_ += \"}\";\n  }\n\n  void GenTableObject(const StructDef& table) {\n    code_ += \"\";\n\n    code_.SetValue(\"STRUCT_OTY\", namer_.ObjectType(table));\n    code_.SetValue(\"STRUCT_TY\", namer_.Type(table));\n\n    // Generate the native object.\n    code_ += \"#[non_exhaustive]\";\n    code_ += \"#[derive(Debug, Clone, PartialEq)]\";\n    code_ += \"{{ACCESS_TYPE}} struct {{STRUCT_OTY}} {\";\n    ForAllObjectTableFields(table, [&](const FieldDef& field) {\n      // Union objects combine both the union discriminant and value, so we\n      // skip making a field for the discriminant.\n      if (field.value.type.base_type == BASE_TYPE_UTYPE) return;\n      code_ += \"pub {{FIELD}}: {{FIELD_OTY}},\";\n    });\n    code_ += \"}\";\n    code_ += \"\";\n\n    code_ += \"impl Default for {{STRUCT_OTY}} {\";\n    code_ += \"    fn default() -> Self {\";\n    code_ += \"        Self {\";\n    ForAllObjectTableFields(table, [&](const FieldDef& field) {\n      if (field.value.type.base_type == BASE_TYPE_UTYPE) return;\n      std::string default_value = GetDefaultValue(field, kObject);\n      code_ += \"        {{FIELD}}: \" + default_value + \",\";\n    });\n    code_ += \"        }\";\n    code_ += \"    }\";\n    code_ += \"}\";\n    code_ += \"\";\n\n    // TODO(cneo): Generate defaults for Native tables. However, since structs\n    // may be required, they, and therefore enums need defaults.\n\n    // Generate pack function.\n    code_ += \"impl {{STRUCT_OTY}} {\";\n    code_ += \"    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\";\n    code_ += \"        &self,\";\n    code_ += \"        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\";\n    code_ += \"    ) -> ::flatbuffers::WIPOffset<{{STRUCT_TY}}<'b>> {\";\n    // First we generate variables for each field and then later assemble them\n    // using \"StructArgs\" to more easily manage ownership of the builder.\n    ForAllObjectTableFields(table, [&](const FieldDef& field) {\n      const Type& type = field.value.type;\n      switch (GetFullType(type)) {\n        case ftInteger:\n        case ftBool:\n        case ftFloat:\n        case ftEnumKey: {\n          code_ += \"    let {{FIELD}} = self.{{FIELD}};\";\n          return;\n        }\n        case ftUnionKey:\n          return;  // Generate union type with union value.\n        case ftUnionValue: {\n          code_.SetValue(\"ENUM_METHOD\",\n                         namer_.Method(*field.value.type.enum_def));\n          code_.SetValue(\"DISCRIMINANT\",\n                         namer_.LegacyRustUnionTypeMethod(field));\n          code_ +=\n              \"    let {{DISCRIMINANT}} = \"\n              \"self.{{FIELD}}.{{ENUM_METHOD}}_type();\";\n          code_ += \"    let {{FIELD}} = self.{{FIELD}}.pack(_fbb);\";\n          return;\n        }\n        // The rest of the types require special casing around optionalness\n        // due to \"required\" annotation.\n        case ftString: {\n          MapNativeTableField(field, \"_fbb.create_string(x)\");\n          return;\n        }\n        case ftStruct: {\n          // Hold the struct in a variable so we can reference it.\n          if (field.IsRequired()) {\n            code_ += \"    let {{FIELD}}_tmp = Some(self.{{FIELD}}.pack());\";\n          } else {\n            code_ +=\n                \"    let {{FIELD}}_tmp = self.{{FIELD}}\"\n                \".as_ref().map(|x| x.pack());\";\n          }\n          code_ += \"    let {{FIELD}} = {{FIELD}}_tmp.as_ref();\";\n\n          return;\n        }\n        case ftTable: {\n          MapNativeTableField(field, \"x.pack(_fbb)\");\n          return;\n        }\n        case ftVectorOfEnumKey:\n        case ftVectorOfInteger:\n        case ftVectorOfBool:\n        case ftVectorOfFloat: {\n          MapNativeTableField(field, \"_fbb.create_vector(x)\");\n          return;\n        }\n        case ftVectorOfStruct: {\n          MapNativeTableField(field,\n                              \"let w: alloc::vec::Vec<_> = x.iter().map(|t| \"\n                              \"t.pack()).collect();\"\n                              \"_fbb.create_vector(&w)\");\n          return;\n        }\n        case ftVectorOfString: {\n          // TODO(cneo): create_vector* should be more generic to avoid\n          // allocations.\n\n          MapNativeTableField(field,\n                              \"let w: alloc::vec::Vec<_> = x.iter().map(|s| \"\n                              \"_fbb.create_string(s)).collect();\"\n                              \"_fbb.create_vector(&w)\");\n          return;\n        }\n        case ftVectorOfTable: {\n          MapNativeTableField(field,\n                              \"let w: alloc::vec::Vec<_> = x.iter().map(|t| \"\n                              \"t.pack(_fbb)).collect();\"\n                              \"_fbb.create_vector(&w)\");\n          return;\n        }\n        case ftVectorOfUnionValue: {\n          FLATBUFFERS_ASSERT(false && \"vectors of unions not yet supported\");\n          return;\n        }\n        case ftArrayOfEnum:\n        case ftArrayOfStruct:\n        case ftArrayOfBuiltin: {\n          FLATBUFFERS_ASSERT(false && \"arrays are not supported within tables\");\n          return;\n        }\n      }\n    });\n    code_ += \"        {{STRUCT_TY}}::create(_fbb, &{{STRUCT_TY}}Args{\";\n    ForAllObjectTableFields(table, [&](const FieldDef& field) {\n      (void)field;  // Unused.\n      code_ += \"        {{FIELD}},\";\n    });\n    code_ += \"        })\";\n    code_ += \"    }\";\n    code_ += \"}\";\n  }\n  void ForAllObjectTableFields(const StructDef& table,\n                               std::function<void(const FieldDef&)> cb) {\n    const std::vector<FieldDef*>& v = table.fields.vec;\n    for (auto it = v.begin(); it != v.end(); it++) {\n      const FieldDef& field = **it;\n      if (field.deprecated) continue;\n      code_.SetValue(\"FIELD\", namer_.Field(field));\n      code_.SetValue(\"FIELD_OTY\", ObjectFieldType(field, true));\n      code_.IncrementIdentLevel();\n      cb(field);\n      code_.DecrementIdentLevel();\n    }\n  }\n  void MapNativeTableField(const FieldDef& field, const std::string& expr) {\n    if (field.IsOptional()) {\n      code_ += \"    let {{FIELD}} = self.{{FIELD}}.as_ref().map(|x|{\";\n      code_ += \"        \" + expr;\n      code_ += \"    });\";\n    } else {\n      // For some reason Args has optional types for required fields.\n      // TODO(cneo): Fix this... but its a breaking change?\n      code_ += \"    let {{FIELD}} = Some({\";\n      code_ += \"        let x = &self.{{FIELD}};\";\n      code_ += \"        \" + expr;\n      code_ += \"    });\";\n    }\n  }\n\n  // Generate functions to compare tables and structs by key. This function\n  // must only be called if the field key is defined.\n  void GenKeyFieldMethods(const FieldDef& field) {\n    FLATBUFFERS_ASSERT(field.key);\n\n    code_.SetValue(\"KEY_TYPE\", GenTableAccessorFuncReturnType(field, \"\"));\n    code_.SetValue(\"REF\", IsString(field.value.type) ? \"\" : \"&\");\n\n    code_ += \"\";\n\n    code_ += \"#[inline]\";\n    code_ +=\n        \"pub fn key_compare_less_than(&self, o: &{{STRUCT_TY}}) -> \"\n        \"bool {\";\n    code_ += \"    self.{{FIELD}}() < o.{{FIELD}}()\";\n    code_ += \"}\";\n    code_ += \"\";\n\n    code_ += \"#[inline]\";\n    code_ +=\n        \"pub fn key_compare_with_value(&self, val: {{KEY_TYPE}}) -> \"\n        \"::core::cmp::Ordering {\";\n    code_ += \"    let key = self.{{FIELD}}();\";\n    code_ += \"    key.cmp({{REF}}val)\";\n    code_ += \"}\";\n  }\n\n  // Generate functions for accessing the root table object. This function\n  // must only be called if the root table is defined.\n  void GenRootTableFuncs(const StructDef& struct_def) {\n    code_ += \"\";\n\n    FLATBUFFERS_ASSERT(parser_.root_struct_def_ && \"root table not defined\");\n    code_.SetValue(\"STRUCT_TY\", namer_.Type(struct_def));\n    code_.SetValue(\"STRUCT_FN\", namer_.Function(struct_def));\n    code_.SetValue(\"STRUCT_CONST\", namer_.Constant(struct_def.name));\n\n    // Default verifier root fns.\n    code_ += \"/// Verifies that a buffer of bytes contains a `{{STRUCT_TY}}`\";\n    code_ += \"/// and returns it.\";\n    code_ += \"/// Note that verification is still experimental and may not\";\n    code_ += \"/// catch every error, or be maximally performant. For the\";\n    code_ += \"/// previous, unchecked, behavior use\";\n    code_ += \"/// `root_as_{{STRUCT_FN}}_unchecked`.\";\n    code_ += \"#[inline]\";\n    code_ +=\n        \"pub fn root_as_{{STRUCT_FN}}(buf: &[u8]) \"\n        \"-> Result<{{STRUCT_TY}}<'_>, ::flatbuffers::InvalidFlatbuffer> {\";\n    code_ += \"    ::flatbuffers::root::<{{STRUCT_TY}}>(buf)\";\n    code_ += \"}\";\n    code_ += \"\";\n\n    code_ += \"/// Verifies that a buffer of bytes contains a size prefixed\";\n    code_ += \"/// `{{STRUCT_TY}}` and returns it.\";\n    code_ += \"/// Note that verification is still experimental and may not\";\n    code_ += \"/// catch every error, or be maximally performant. For the\";\n    code_ += \"/// previous, unchecked, behavior use\";\n    code_ += \"/// `size_prefixed_root_as_{{STRUCT_FN}}_unchecked`.\";\n    code_ += \"#[inline]\";\n    code_ +=\n        \"pub fn size_prefixed_root_as_{{STRUCT_FN}}\"\n        \"(buf: &[u8]) -> Result<{{STRUCT_TY}}<'_>, \"\n        \"::flatbuffers::InvalidFlatbuffer> {\";\n    code_ += \"    ::flatbuffers::size_prefixed_root::<{{STRUCT_TY}}>(buf)\";\n    code_ += \"}\";\n    code_ += \"\";\n\n    // Verifier with options root fns.\n    code_ += \"/// Verifies, with the given options, that a buffer of bytes\";\n    code_ += \"/// contains a `{{STRUCT_TY}}` and returns it.\";\n    code_ += \"/// Note that verification is still experimental and may not\";\n    code_ += \"/// catch every error, or be maximally performant. For the\";\n    code_ += \"/// previous, unchecked, behavior use\";\n    code_ += \"/// `root_as_{{STRUCT_FN}}_unchecked`.\";\n    code_ += \"#[inline]\";\n    code_ += \"pub fn root_as_{{STRUCT_FN}}_with_opts<'b, 'o>(\";\n    code_ += \"    opts: &'o ::flatbuffers::VerifierOptions,\";\n    code_ += \"    buf: &'b [u8],\";\n    code_ +=\n        \") -> Result<{{STRUCT_TY}}<'b>, ::flatbuffers::InvalidFlatbuffer>\"\n        \" {\";\n    code_ +=\n        \"    ::flatbuffers::root_with_opts::<{{STRUCT_TY}}<'b>>(opts, buf)\";\n    code_ += \"}\";\n    code_ += \"\";\n\n    code_ += \"/// Verifies, with the given verifier options, that a buffer of\";\n    code_ += \"/// bytes contains a size prefixed `{{STRUCT_TY}}` and returns\";\n    code_ += \"/// it. Note that verification is still experimental and may not\";\n    code_ += \"/// catch every error, or be maximally performant. For the\";\n    code_ += \"/// previous, unchecked, behavior use\";\n    code_ += \"/// `root_as_{{STRUCT_FN}}_unchecked`.\";\n    code_ += \"#[inline]\";\n    code_ +=\n        \"pub fn size_prefixed_root_as_{{STRUCT_FN}}_with_opts\"\n        \"<'b, 'o>(\";\n    code_ += \"    opts: &'o ::flatbuffers::VerifierOptions,\";\n    code_ += \"    buf: &'b [u8],\";\n    code_ +=\n        \") -> Result<{{STRUCT_TY}}<'b>, ::flatbuffers::InvalidFlatbuffer>\"\n        \" {\";\n    code_ +=\n        \"    ::flatbuffers::size_prefixed_root_with_opts::<{{STRUCT_TY}}\"\n        \"<'b>>(opts, buf)\";\n    code_ += \"}\";\n    code_ += \"\";\n\n    // Unchecked root fns.\n    code_ +=\n        \"/// Assumes, without verification, that a buffer of bytes \"\n        \"contains a {{STRUCT_TY}} and returns it.\";\n    code_ += \"/// # Safety\";\n    code_ +=\n        \"/// Callers must trust the given bytes do indeed contain a valid\"\n        \" `{{STRUCT_TY}}`.\";\n    code_ += \"#[inline]\";\n    code_ +=\n        \"pub unsafe fn root_as_{{STRUCT_FN}}_unchecked\"\n        \"(buf: &[u8]) -> {{STRUCT_TY}}<'_> {\";\n    code_ +=\n        \"    unsafe { ::flatbuffers::root_unchecked::<{{STRUCT_TY}}>(buf) }\";\n    code_ += \"}\";\n    code_ += \"\";\n\n    code_ +=\n        \"/// Assumes, without verification, that a buffer of bytes \"\n        \"contains a size prefixed {{STRUCT_TY}} and returns it.\";\n    code_ += \"/// # Safety\";\n    code_ +=\n        \"/// Callers must trust the given bytes do indeed contain a valid\"\n        \" size prefixed `{{STRUCT_TY}}`.\";\n    code_ += \"#[inline]\";\n    code_ +=\n        \"pub unsafe fn size_prefixed_root_as_{{STRUCT_FN}}\"\n        \"_unchecked(buf: &[u8]) -> {{STRUCT_TY}}<'_> {\";\n    code_ +=\n        \"    unsafe { \"\n        \"::flatbuffers::size_prefixed_root_unchecked::<{{STRUCT_TY}}>\"\n        \"(buf) }\";\n    code_ += \"}\";\n    code_ += \"\";\n\n    if (parser_.file_identifier_.length()) {\n      // Declare the identifier\n      // (no lifetime needed as constants have static lifetimes by default)\n      code_ += \"pub const {{STRUCT_CONST}}_IDENTIFIER: &str\\\\\";\n      code_ += \" = \\\"\" + parser_.file_identifier_ + \"\\\";\";\n      code_ += \"\";\n\n      // Check if a buffer has the identifier.\n      code_ += \"#[inline]\";\n      code_ += \"pub fn {{STRUCT_FN}}_buffer_has_identifier\\\\\";\n      code_ += \"(buf: &[u8]) -> bool {\";\n      code_ += \"    ::flatbuffers::buffer_has_identifier(buf, \\\\\";\n      code_ += \"{{STRUCT_CONST}}_IDENTIFIER, false)\";\n      code_ += \"}\";\n      code_ += \"\";\n      code_ += \"#[inline]\";\n      code_ += \"pub fn {{STRUCT_FN}}_size_prefixed\\\\\";\n      code_ += \"_buffer_has_identifier(buf: &[u8]) -> bool {\";\n      code_ += \"    ::flatbuffers::buffer_has_identifier(buf, \\\\\";\n      code_ += \"{{STRUCT_CONST}}_IDENTIFIER, true)\";\n      code_ += \"}\";\n      code_ += \"\";\n    }\n\n    if (parser_.file_extension_.length()) {\n      // Return the extension\n      code_ += \"pub const {{STRUCT_CONST}}_EXTENSION: &str = \\\\\";\n      code_ += \"\\\"\" + parser_.file_extension_ + \"\\\";\";\n      code_ += \"\";\n    }\n\n    // Finish a buffer with a given root object:\n    code_ += \"#[inline]\";\n    code_ +=\n        \"pub fn finish_{{STRUCT_FN}}_buffer<'a, 'b, A: \"\n        \"::flatbuffers::Allocator + 'a>(\";\n    code_ += \"    fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\";\n    code_ += \"    root: ::flatbuffers::WIPOffset<{{STRUCT_TY}}<'a>>\";\n    code_ += \") {\";\n    if (parser_.file_identifier_.length()) {\n      code_ += \"    fbb.finish(root, Some({{STRUCT_CONST}}_IDENTIFIER));\";\n    } else {\n      code_ += \"    fbb.finish(root, None);\";\n    }\n    code_ += \"}\";\n    code_ += \"\";\n    code_ += \"#[inline]\";\n    code_ +=\n        \"pub fn finish_size_prefixed_{{STRUCT_FN}}_buffer\"\n        \"<'a, 'b, A: ::flatbuffers::Allocator + 'a>(\";\n    code_ += \"    fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\";\n    code_ += \"    root: ::flatbuffers::WIPOffset<{{STRUCT_TY}}<'a>>\";\n    code_ += \") {\";\n    if (parser_.file_identifier_.length()) {\n      code_ +=\n          \"    fbb.finish_size_prefixed(root, \"\n          \"Some({{STRUCT_CONST}}_IDENTIFIER));\";\n    } else {\n      code_ += \"    fbb.finish_size_prefixed(root, None);\";\n    }\n    code_ += \"}\";\n  }\n\n  static void GenPadding(\n      const FieldDef& field, std::string* code_ptr, int* id,\n      const std::function<void(int bits, std::string* code_ptr, int* id)>& f) {\n    if (field.padding) {\n      for (int i = 0; i < 4; i++) {\n        if (static_cast<int>(field.padding) & (1 << i)) {\n          f((1 << i) * 8, code_ptr, id);\n        }\n      }\n      assert(!(field.padding & ~0xF));\n    }\n  }\n\n  static void PaddingDefinition(int bits, std::string* code_ptr, int* id) {\n    *code_ptr +=\n        \"  padding\" + NumToString((*id)++) + \"__: u\" + NumToString(bits) + \",\";\n  }\n\n  static void PaddingInitializer(int bits, std::string* code_ptr, int* id) {\n    (void)bits;\n    *code_ptr += \"padding\" + NumToString((*id)++) + \"__: 0,\";\n  }\n\n  void ForAllStructFields(const StructDef& struct_def,\n                          std::function<void(const FieldDef& field)> cb) {\n    size_t offset_to_field = 0;\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      const auto& field = **it;\n      code_.SetValue(\"FIELD_TYPE\", GetTypeGet(field.value.type));\n      code_.SetValue(\"FIELD_OTY\", ObjectFieldType(field, false));\n      code_.SetValue(\"FIELD\", namer_.Field(field));\n      code_.SetValue(\"FIELD_OFFSET\", NumToString(offset_to_field));\n      code_.SetValue(\n          \"REF\",\n          IsStruct(field.value.type) || IsArray(field.value.type) ? \"&\" : \"\");\n      code_.IncrementIdentLevel();\n      cb(field);\n      code_.DecrementIdentLevel();\n      const size_t size = InlineSize(field.value.type);\n      offset_to_field += size + field.padding;\n    }\n  }\n  // Generate an accessor struct with constructor for a flatbuffers struct.\n  void GenStruct(const StructDef& struct_def) {\n    code_ += \"\";\n\n    const bool is_private =\n        parser_.opts.no_leak_private_annotations &&\n        (struct_def.attributes.Lookup(\"private\") != nullptr);\n    code_.SetValue(\"ACCESS_TYPE\", is_private ? \"pub(crate)\" : \"pub\");\n    // Generates manual padding and alignment.\n    // Variables are private because they contain little endian data on all\n    // platforms.\n    GenComment(struct_def.doc_comment);\n    code_.SetValue(\"ALIGN\", NumToString(struct_def.minalign));\n    code_.SetValue(\"STRUCT_TY\", namer_.Type(struct_def));\n    code_.SetValue(\"STRUCT_SIZE\", NumToString(struct_def.bytesize));\n\n    // We represent Flatbuffers-structs in Rust-u8-arrays since the data may be\n    // of the wrong endianness and alignment 1.\n    //\n    // PartialEq is useful to derive because we can correctly compare structs\n    // for equality by just comparing their underlying byte data. This doesn't\n    // hold for PartialOrd/Ord.\n    code_ += \"// struct {{STRUCT_TY}}, aligned to {{ALIGN}}\";\n    code_ += \"#[repr(transparent)]\";\n    code_ += \"#[derive(Clone, Copy, PartialEq)]\";\n    code_ += \"{{ACCESS_TYPE}} struct {{STRUCT_TY}}(pub [u8; {{STRUCT_SIZE}}]);\";\n    code_ += \"\";\n\n    code_ += \"impl Default for {{STRUCT_TY}} {\";\n    code_ += \"    fn default() -> Self {\";\n    code_ += \"        Self([0; {{STRUCT_SIZE}}])\";\n    code_ += \"    }\";\n    code_ += \"}\";\n    code_ += \"\";\n\n    // Debug for structs.\n    code_ += \"impl ::core::fmt::Debug for {{STRUCT_TY}} {\";\n    code_ +=\n        \"    fn fmt(&self, f: &mut ::core::fmt::Formatter\"\n        \") -> ::core::fmt::Result {\";\n    code_ += \"        f.debug_struct(\\\"{{STRUCT_TY}}\\\")\";\n    ForAllStructFields(struct_def, [&](const FieldDef& unused) {\n      (void)unused;\n      code_ += \"        .field(\\\"{{FIELD}}\\\", &self.{{FIELD}}())\";\n    });\n    code_ += \"            .finish()\";\n    code_ += \"    }\";\n    code_ += \"}\";\n    code_ += \"\";\n\n    // Generate impls for SafeSliceAccess (because all structs are endian-safe),\n    // Follow for the value type, Follow for the reference type, Push for the\n    // value type, and Push for the reference type.\n    code_ += \"impl ::flatbuffers::SimpleToVerifyInSlice for {{STRUCT_TY}} {}\";\n    code_ += \"\";\n\n    code_ += \"impl<'a> ::flatbuffers::Follow<'a> for {{STRUCT_TY}} {\";\n    code_ += \"    type Inner = &'a {{STRUCT_TY}};\";\n    code_ += \"\";\n    code_ += \"    #[inline]\";\n    code_ += \"    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\";\n    code_ += \"        unsafe { <&'a {{STRUCT_TY}}>::follow(buf, loc) }\";\n    code_ += \"    }\";\n    code_ += \"}\";\n    code_ += \"\";\n\n    code_ += \"impl<'a> ::flatbuffers::Follow<'a> for &'a {{STRUCT_TY}} {\";\n    code_ += \"    type Inner = &'a {{STRUCT_TY}};\";\n    code_ += \"\";\n    code_ += \"    #[inline]\";\n    code_ += \"    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\";\n    code_ +=\n        \"        unsafe { ::flatbuffers::follow_cast_ref::<{{STRUCT_TY}}>(buf, \"\n        \"loc) }\";\n    code_ += \"    }\";\n    code_ += \"}\";\n    code_ += \"\";\n\n    code_ += \"impl<'b> ::flatbuffers::Push for {{STRUCT_TY}} {\";\n    code_ += \"    type Output = {{STRUCT_TY}};\";\n    code_ += \"\";\n    code_ += \"    #[inline]\";\n    code_ += \"    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\";\n    code_ +=\n        \"        let src = unsafe { ::core::slice::from_raw_parts(self as \"\n        \"*const \"\n        \"{{STRUCT_TY}} as *const u8, <Self as ::flatbuffers::Push>::size()) };\";\n    code_ += \"        dst.copy_from_slice(src);\";\n    code_ += \"    }\";\n    code_ += \"\";\n\n    code_ += \"    #[inline]\";\n    code_ += \"    fn alignment() -> ::flatbuffers::PushAlignment {\";\n    code_ += \"        ::flatbuffers::PushAlignment::new({{ALIGN}})\";\n    code_ += \"    }\";\n    code_ += \"}\";\n    code_ += \"\";\n\n    // Generate verifier: Structs are simple so presence and alignment are\n    // all that need to be checked.\n    code_ += \"impl<'a> ::flatbuffers::Verifiable for {{STRUCT_TY}} {\";\n    code_ += \"    #[inline]\";\n    code_ += \"    fn run_verifier(\";\n    code_ += \"        v: &mut ::flatbuffers::Verifier, pos: usize\";\n    code_ += \"    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\";\n    code_ += \"        v.in_buffer::<Self>(pos)\";\n    code_ += \"    }\";\n    code_ += \"}\";\n    code_ += \"\";\n\n    // Implement serde::Serialize\n    if (parser_.opts.rust_serialize) {\n      const auto numFields = struct_def.fields.vec.size();\n      code_.SetValue(\"NUM_FIELDS\", NumToString(numFields));\n      code_ += \"impl Serialize for {{STRUCT_TY}} {\";\n      code_ +=\n          \"    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, \"\n          \"S::Error>\";\n      code_ += \"    where\";\n      code_ += \"        S: Serializer,\";\n      code_ += \"    {\";\n      if (numFields == 0) {\n        code_ +=\n            \"    let s = serializer.serialize_struct(\\\"{{STRUCT_TY}}\\\", 0)?;\";\n      } else {\n        code_ +=\n            \"    let mut s = serializer.serialize_struct(\\\"{{STRUCT_TY}}\\\", \"\n            \"{{NUM_FIELDS}})?;\";\n      }\n      ForAllStructFields(struct_def, [&](const FieldDef& unused) {\n        (void)unused;\n        code_ +=\n            \"    s.serialize_field(\\\"{{FIELD}}\\\", \"\n            \"&self.{{FIELD}}())?;\";\n      });\n      code_ += \"        s.end()\";\n      code_ += \"    }\";\n      code_ += \"}\";\n      code_ += \"\";\n    }\n\n    // Generate a constructor that takes all fields as arguments.\n    code_ += \"impl<'a> {{STRUCT_TY}} {\";\n    code_ += \"    #[allow(clippy::too_many_arguments)]\";\n    code_ += \"    pub fn new(\";\n    ForAllStructFields(struct_def, [&](const FieldDef& unused) {\n      (void)unused;\n      code_ += \"    {{FIELD}}: {{REF}}{{FIELD_TYPE}},\";\n    });\n    code_ += \"    ) -> Self {\";\n    code_ += \"        let mut s = Self([0; {{STRUCT_SIZE}}]);\";\n    ForAllStructFields(struct_def, [&](const FieldDef& unused) {\n      (void)unused;\n      code_ += \"    s.set_{{FIELD}}({{FIELD}});\";\n    });\n    code_ += \"        s\";\n    code_ += \"    }\";\n    code_ += \"\";\n\n    if (parser_.opts.generate_name_strings) {\n      GenFullyQualifiedNameGetter(struct_def, struct_def.name);\n    }\n\n    // Generate accessor methods for the struct.\n    ForAllStructFields(struct_def, [&](const FieldDef& field) {\n      this->GenComment(field.doc_comment);\n      // Getter.\n      if (IsStruct(field.value.type)) {\n        code_ += \"pub fn {{FIELD}}(&self) -> &{{FIELD_TYPE}} {\";\n        code_ += \"    // Safety:\";\n        code_ += \"    // Created from a valid Table for this object\";\n        code_ += \"    // Which contains a valid struct in this slot\";\n        code_ +=\n            \"    unsafe {\"\n            \" &*(self.0[{{FIELD_OFFSET}}..].as_ptr() as *const\"\n            \" {{FIELD_TYPE}}) }\";\n      } else if (IsArray(field.value.type)) {\n        code_.SetValue(\"ARRAY_SIZE\",\n                       NumToString(field.value.type.fixed_length));\n        code_.SetValue(\"ARRAY_ITEM\", GetTypeGet(field.value.type.VectorType()));\n        code_ +=\n            \"pub fn {{FIELD}}(&'a self) -> \"\n            \"::flatbuffers::Array<'a, {{ARRAY_ITEM}}, {{ARRAY_SIZE}}> {\";\n        code_ += \"    // Safety:\";\n        code_ += \"    // Created from a valid Table for this object\";\n        code_ += \"    // Which contains a valid array in this slot\";\n        code_ += \"    use ::flatbuffers::Follow;\";\n        code_ +=\n            \"    unsafe { ::flatbuffers::Array::follow(&self.0, \"\n            \"{{FIELD_OFFSET}}) \"\n            \"}\";\n      } else {\n        code_ += \"pub fn {{FIELD}}(&self) -> {{FIELD_TYPE}} {\";\n        code_ +=\n            \"    let mut mem = ::core::mem::MaybeUninit::\"\n            \"<<{{FIELD_TYPE}} as \"\n            \"::flatbuffers::EndianScalar>::Scalar>::uninit();\";\n        code_ += \"    // Safety:\";\n        code_ += \"    // Created from a valid Table for this object\";\n        code_ += \"    // Which contains a valid value in this slot\";\n        code_ += \"    ::flatbuffers::EndianScalar::from_little_endian(unsafe {\";\n        code_ += \"        ::core::ptr::copy_nonoverlapping(\";\n        code_ += \"            self.0[{{FIELD_OFFSET}}..].as_ptr(),\";\n        code_ += \"            mem.as_mut_ptr() as *mut u8,\";\n        code_ +=\n            \"            ::core::mem::size_of::<<{{FIELD_TYPE}} as \"\n            \"::flatbuffers::EndianScalar>::Scalar>(),\";\n        code_ += \"        );\";\n        code_ += \"        mem.assume_init()\";\n        code_ += \"    })\";\n      }\n      code_ += \"}\\n\";\n      // Setter.\n      if (IsStruct(field.value.type)) {\n        code_.SetValue(\"FIELD_SIZE\", NumToString(InlineSize(field.value.type)));\n        code_ += \"#[allow(clippy::identity_op)]\";  // If FIELD_OFFSET=0.\n        code_ += \"pub fn set_{{FIELD}}(&mut self, x: &{{FIELD_TYPE}}) {\";\n        code_ +=\n            \"    self.0[{{FIELD_OFFSET}}..{{FIELD_OFFSET}} + {{FIELD_SIZE}}]\"\n            \".copy_from_slice(&x.0)\";\n      } else if (IsArray(field.value.type)) {\n        if (GetFullType(field.value.type) == ftArrayOfBuiltin) {\n          code_.SetValue(\"ARRAY_ITEM\",\n                         GetTypeGet(field.value.type.VectorType()));\n          code_.SetValue(\n              \"ARRAY_ITEM_SIZE\",\n              NumToString(InlineSize(field.value.type.VectorType())));\n          code_ +=\n              \"pub fn set_{{FIELD}}(&mut self, items: &{{FIELD_TYPE}}) \"\n              \"{\";\n          code_ += \"    // Safety:\";\n          code_ += \"    // Created from a valid Table for this object\";\n          code_ += \"    // Which contains a valid array in this slot\";\n          code_ +=\n              \"    unsafe { ::flatbuffers::emplace_scalar_array(&mut self.0, \"\n              \"{{FIELD_OFFSET}}, items) };\";\n        } else {\n          code_.SetValue(\"FIELD_SIZE\",\n                         NumToString(InlineSize(field.value.type)));\n          code_ += \"pub fn set_{{FIELD}}(&mut self, x: &{{FIELD_TYPE}}) {\";\n          code_ += \"    // Safety:\";\n          code_ += \"    // Created from a valid Table for this object\";\n          code_ += \"    // Which contains a valid array in this slot\";\n          code_ += \"    unsafe {\";\n          code_ += \"        ::core::ptr::copy(\";\n          code_ += \"            x.as_ptr() as *const u8,\";\n          code_ += \"            self.0.as_mut_ptr().add({{FIELD_OFFSET}}),\";\n          code_ += \"            {{FIELD_SIZE}},\";\n          code_ += \"        );\";\n          code_ += \"    }\";\n        }\n      } else {\n        code_ += \"pub fn set_{{FIELD}}(&mut self, x: {{FIELD_TYPE}}) {\";\n        code_ +=\n            \"    let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\";\n        code_ += \"    // Safety:\";\n        code_ += \"    // Created from a valid Table for this object\";\n        code_ += \"    // Which contains a valid value in this slot\";\n        code_ += \"    unsafe {\";\n        code_ += \"        ::core::ptr::copy_nonoverlapping(\";\n        code_ += \"            &x_le as *const _ as *const u8,\";\n        code_ += \"            self.0[{{FIELD_OFFSET}}..].as_mut_ptr(),\";\n        code_ +=\n            \"            ::core::mem::size_of::<<{{FIELD_TYPE}} as \"\n            \"::flatbuffers::EndianScalar>::Scalar>(),\";\n        code_ += \"        );\";\n        code_ += \"    }\";\n      }\n      code_ += \"}\\n\";\n\n      // Generate a comparison function for this field if it is a key.\n      if (field.key) {\n        GenKeyFieldMethods(field);\n      }\n    });\n\n    // Generate Object API unpack method.\n    if (parser_.opts.generate_object_based_api) {\n      code_.SetValue(\"STRUCT_OTY\", namer_.ObjectType(struct_def));\n      code_ += \"    pub fn unpack(&self) -> {{STRUCT_OTY}} {\";\n      code_ += \"        {{STRUCT_OTY}} {\";\n      ForAllStructFields(struct_def, [&](const FieldDef& field) {\n        if (IsArray(field.value.type)) {\n          if (GetFullType(field.value.type) == ftArrayOfStruct) {\n            code_ +=\n                \"    {{FIELD}}: { let {{FIELD}} = \"\n                \"self.{{FIELD}}(); ::flatbuffers::array_init(|i| \"\n                \"{{FIELD}}.get(i).unpack()) },\";\n          } else {\n            code_ += \"        {{FIELD}}: self.{{FIELD}}().into(),\";\n          }\n        } else {\n          std::string unpack = IsStruct(field.value.type) ? \".unpack()\" : \"\";\n          code_ += \"        {{FIELD}}: self.{{FIELD}}()\" + unpack + \",\";\n        }\n      });\n      code_ += \"        }\";\n      code_ += \"    }\";\n    }\n\n    code_ += \"}\";  // End impl Struct methods.\n\n    // Generate Struct Object.\n    if (parser_.opts.generate_object_based_api) {\n      // Struct declaration\n      code_ += \"\";\n      code_ += \"#[derive(Debug, Clone, PartialEq)]\";\n      code_ += \"{{ACCESS_TYPE}} struct {{STRUCT_OTY}} {\";\n      ForAllStructFields(struct_def, [&](const FieldDef& field) {\n        (void)field;  // unused.\n        code_ += \"pub {{FIELD}}: {{FIELD_OTY}},\";\n      });\n      code_ += \"}\";\n      // Manual impl Default to avoid issues with arrays > 32 elements\n      // where #[derive(Default)] fails on older Rust versions.\n      code_ += \"impl Default for {{STRUCT_OTY}} {\";\n      code_ += \"    fn default() -> Self {\";\n      code_ += \"        Self {\";\n      ForAllStructFields(struct_def, [&](const FieldDef& field) {\n        const auto full_type = GetFullType(field.value.type);\n        switch (full_type) {\n          case ftArrayOfBuiltin: {\n            // Use the correct zero literal for each element type:\n            // bool -> false, float/double -> 0.0, integers -> 0\n            const auto elem_type = field.value.type.VectorType().base_type;\n            std::string zero;\n            if (elem_type == BASE_TYPE_BOOL) {\n              zero = \"false\";\n            } else if (IsFloat(elem_type)) {\n              zero = \"0.0\";\n            } else {\n              zero = \"0\";\n            }\n            code_ += \"        {{FIELD}}: [\" + zero + \"; \" +\n                     NumToString(field.value.type.fixed_length) + \"],\";\n            break;\n          }\n          case ftArrayOfEnum:\n          case ftArrayOfStruct: {\n            code_ +=\n                \"        {{FIELD}}: ::flatbuffers::array_init(|_| \"\n                \"Default::default()),\";\n            break;\n          }\n          default: {\n            std::string default_value =\n                GetDefaultValue(field, kObject);\n            code_ += \"        {{FIELD}}: \" + default_value + \",\";\n            break;\n          }\n        }\n      });\n      code_ += \"        }\";\n      code_ += \"    }\";\n      code_ += \"}\";\n      code_ += \"\";\n      // The `pack` method that turns the native struct into its Flatbuffers\n      // counterpart.\n      code_ += \"impl {{STRUCT_OTY}} {\";\n      code_ += \"    pub fn pack(&self) -> {{STRUCT_TY}} {\";\n      code_ += \"        {{STRUCT_TY}}::new(\";\n      ForAllStructFields(struct_def, [&](const FieldDef& field) {\n        if (IsStruct(field.value.type)) {\n          code_ += \"        &self.{{FIELD}}.pack(),\";\n        } else if (IsArray(field.value.type)) {\n          if (GetFullType(field.value.type) == ftArrayOfStruct) {\n            code_ +=\n                \"        &::flatbuffers::array_init(|i| \"\n                \"self.{{FIELD}}[i].pack()),\";\n          } else {\n            code_ += \"        &self.{{FIELD}},\";\n          }\n        } else {\n          code_ += \"        self.{{FIELD}},\";\n        }\n      });\n      code_ += \"        )\";\n      code_ += \"    }\";\n      code_ += \"}\";\n    }\n  }\n\n  void GenNamespaceImports() {\n    // DO not use global attributes (i.e. #![...]) since it interferes\n    // with users who include! generated files.\n    // See: https://github.com/google/flatbuffers/issues/6261\n    if (!parser_.opts.generate_all) {\n      for (auto it = parser_.included_files_.begin();\n           it != parser_.included_files_.end(); ++it) {\n        if (it->second.empty()) continue;\n        auto noext = flatbuffers::StripExtension(it->second);\n        auto basename = flatbuffers::StripPath(noext);\n\n        if (parser_.opts.include_prefix.empty()) {\n          code_ +=\n              \"use crate::\" + basename + parser_.opts.filename_suffix + \"::*;\";\n        } else {\n          auto prefix = parser_.opts.include_prefix;\n          prefix.pop_back();\n\n          code_ += \"use crate::\" + prefix + \"::\" + basename +\n                   parser_.opts.filename_suffix + \"::*;\";\n        }\n      }\n    }\n\n    if (parser_.opts.rust_serialize) {\n      code_ += \"extern crate serde;\";\n      code_ +=\n          \"use self::serde::ser::{Serialize, Serializer, SerializeStruct};\";\n    }\n    code_ += \"extern crate alloc;\";\n  }\n\n  // Set up the correct namespace. This opens a namespace if the current\n  // namespace is different from the target namespace. This function\n  // closes and opens the namespaces only as necessary.\n  //\n  // The file must start and end with an empty (or null) namespace so that\n  // namespaces are properly opened and closed.\n  void SetNameSpace(const Namespace* ns) {\n    if (cur_name_space_ == ns) {\n      return;\n    }\n\n    // Compute the size of the longest common namespace prefix.\n    // If cur_name_space is A::B::C::D and ns is A::B::E::F::G,\n    // the common prefix is A::B:: and we have old_size = 4, new_size = 5\n    // and common_prefix_size = 2\n    size_t old_size = cur_name_space_ ? cur_name_space_->components.size() : 0;\n    size_t new_size = ns ? ns->components.size() : 0;\n\n    size_t common_prefix_size = 0;\n    while (common_prefix_size < old_size && common_prefix_size < new_size &&\n           ns->components[common_prefix_size] ==\n               cur_name_space_->components[common_prefix_size]) {\n      common_prefix_size++;\n    }\n\n    // Close cur_name_space in reverse order to reach the common prefix.\n    // In the previous example, D then C are closed.\n    for (size_t j = old_size; j > common_prefix_size; --j) {\n      code_.DecrementIdentLevel();\n      code_ += \"} // pub mod \" + cur_name_space_->components[j - 1];\n    }\n\n    // open namespace parts to reach the ns namespace\n    // in the previous example, E, then F, then G are opened\n    for (auto j = common_prefix_size; j != new_size; ++j) {\n      code_ += \"\";\n      code_ += \"#[allow(unused_imports, dead_code)]\";\n      code_ += \"pub mod \" + namer_.Namespace(ns->components[j]) + \" {\";\n      code_.IncrementIdentLevel();\n      GenNamespaceImports();\n    }\n\n    cur_name_space_ = ns;\n  }\n\n private:\n  IdlNamer namer_;\n};\n\n}  // namespace rust\n\nstatic bool GenerateRust(const Parser& parser, const std::string& path,\n                         const std::string& file_name) {\n  rust::RustGenerator generator(parser, path, file_name);\n  return generator.generate();\n}\n\nstatic std::string RustMakeRule(const Parser& parser, const std::string& path,\n                                const std::string& file_name) {\n  std::string filebase =\n      flatbuffers::StripPath(flatbuffers::StripExtension(file_name));\n  rust::RustGenerator generator(parser, path, file_name);\n  std::string make_rule =\n      generator.GeneratedFileName(path, filebase, parser.opts) + \": \";\n\n  auto included_files = parser.GetIncludedFilesRecursive(file_name);\n  for (auto it = included_files.begin(); it != included_files.end(); ++it) {\n    make_rule += \" \" + *it;\n  }\n  return make_rule;\n}\n\nnamespace {\n\nclass RustCodeGenerator : public CodeGenerator {\n public:\n  Status GenerateCode(const Parser& parser, const std::string& path,\n                      const std::string& filename) override {\n    if (!GenerateRust(parser, path, filename)) {\n      return Status::ERROR;\n    }\n    return Status::OK;\n  }\n\n  Status GenerateCode(const uint8_t*, int64_t, const CodeGenOptions&) override {\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateMakeRule(const Parser& parser, const std::string& path,\n                          const std::string& filename,\n                          std::string& output) override {\n    output = RustMakeRule(parser, path, filename);\n    return Status::OK;\n  }\n\n  Status GenerateGrpcCode(const Parser& parser, const std::string& path,\n                          const std::string& filename) override {\n    (void)parser;\n    (void)path;\n    (void)filename;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateRootFile(const Parser& parser,\n                          const std::string& path) override {\n    if (!GenerateRustModuleRootFile(parser, path)) {\n      return Status::ERROR;\n    }\n    return Status::OK;\n  }\n\n  bool IsSchemaOnly() const override { return true; }\n\n  bool SupportsBfbsGeneration() const override { return false; }\n\n  bool SupportsRootFileGeneration() const override { return true; }\n\n  IDLOptions::Language Language() const override { return IDLOptions::kRust; }\n\n  std::string LanguageName() const override { return \"Rust\"; }\n};\n}  // namespace\n\nstd::unique_ptr<CodeGenerator> NewRustCodeGenerator() {\n  return std::unique_ptr<RustCodeGenerator>(new RustCodeGenerator());\n}\n\n}  // namespace flatbuffers\n\n// TODO(rw): Generated code should import other generated files.\n// TODO(rw): Generated code should refer to namespaces in included files in a\n//           way that makes them referrable.\n// TODO(rw): Generated code should indent according to nesting level.\n// TODO(rw): Generated code should generate endian-safe Debug impls.\n// TODO(rw): Generated code could use a Rust-only enum type to access unions,\n//           instead of making the user use _type() to manually switch.\n// TODO(maxburke): There should be test schemas added that use language\n//           keywords as fields of structs, tables, unions, enums, to make sure\n//           that internal code generated references escaped names correctly.\n// TODO(maxburke): We should see if there is a more flexible way of resolving\n//           module paths for use declarations. Right now if schemas refer to\n//           other flatbuffer files, the include paths in emitted Rust bindings\n//           are crate-relative which may undesirable.\n"
  },
  {
    "path": "src/idl_gen_rust.h",
    "content": "/*\n * Copyright 2023 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_IDL_GEN_RUST_H_\n#define FLATBUFFERS_IDL_GEN_RUST_H_\n\n#include \"flatbuffers/code_generator.h\"\n\nnamespace flatbuffers {\n\n// Constructs a new Rust code generator.\nstd::unique_ptr<CodeGenerator> NewRustCodeGenerator();\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_IDL_GEN_RUST_H_\n"
  },
  {
    "path": "src/idl_gen_swift.cpp",
    "content": "/*\n * Copyright 2020 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"idl_gen_swift.h\"\n\n#include <cctype>\n#include <unordered_set>\n\n#include \"flatbuffers/code_generators.h\"\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/idl.h\"\n#include \"flatbuffers/util.h\"\n#include \"idl_namer.h\"\n\nnamespace flatbuffers {\n\nnamespace swift {\n\nnamespace {\n\nstatic Namer::Config SwiftDefaultConfig() {\n  return {/*types=*/Case::kKeep,\n          /*constants=*/Case::kLowerCamel,\n          /*methods=*/Case::kLowerCamel,\n          /*functions=*/Case::kLowerCamel,\n          /*fields=*/Case::kLowerCamel,\n          /*variables=*/Case::kLowerCamel,\n          /*variants=*/Case::kLowerCamel,\n          /*enum_variant_seperator=*/\".\",\n          /*escape_keywords=*/Namer::Config::Escape::AfterConvertingCase,\n          /*namespaces=*/Case::kKeep,\n          /*namespace_seperator=*/\"_\",\n          /*object_prefix=*/\"\",\n          /*object_suffix=*/\"T\",\n          /*keyword_prefix=*/\"\",\n          /*keyword_suffix=*/\"_\",\n          /*keywords_casing=*/Namer::Config::KeywordsCasing::CaseSensitive,\n          /*filenames=*/Case::kKeep,\n          /*directories=*/Case::kKeep,\n          /*output_path=*/\"\",\n          /*filename_suffix=*/\"_generated\",\n          /*filename_extension=*/\".swift\"};\n}\n\nstatic std::set<std::string> SwiftKeywords() {\n  return {\n      \"associatedtype\",\n      \"class\",\n      \"deinit\",\n      \"enum\",\n      \"extension\",\n      \"fileprivate\",\n      \"func\",\n      \"import\",\n      \"init\",\n      \"inout\",\n      \"internal\",\n      \"let\",\n      \"open\",\n      \"operator\",\n      \"private\",\n      \"protocol\",\n      \"public\",\n      \"rethrows\",\n      \"static\",\n      \"struct\",\n      \"subscript\",\n      \"typealias\",\n      \"var\",\n      \"break\",\n      \"case\",\n      \"continue\",\n      \"default\",\n      \"defer\",\n      \"do\",\n      \"else\",\n      \"fallthrough\",\n      \"for\",\n      \"guard\",\n      \"if\",\n      \"in\",\n      \"repeat\",\n      \"return\",\n      \"switch\",\n      \"where\",\n      \"while\",\n      \"Any\",\n      \"catch\",\n      \"false\",\n      \"is\",\n      \"nil\",\n      \"super\",\n      \"self\",\n      \"Self\",\n      \"throw\",\n      \"throws\",\n      \"true\",\n      \"try\",\n      \"associativity\",\n      \"convenience\",\n      \"dynamic\",\n      \"didSet\",\n      \"final\",\n      \"get\",\n      \"infix\",\n      \"indirect\",\n      \"lazy\",\n      \"left\",\n      \"mutating\",\n      \"none\",\n      \"nonmutating\",\n      \"optional\",\n      \"override\",\n      \"postfix\",\n      \"precedence\",\n      \"prefix\",\n      \"Protocol\",\n      \"required\",\n      \"right\",\n      \"set\",\n      \"Type\",\n      \"unowned\",\n      \"weak\",\n      \"willSet\",\n      \"Void\",\n  };\n}\n\nstatic std::string GenIndirect(const std::string& reading) {\n  return \"{{ACCESS}}.indirect(\" + reading + \")\";\n}\n\n}  // namespace\n\nclass SwiftGenerator : public BaseGenerator {\n private:\n  CodeWriter code_;\n  std::unordered_set<std::string> keywords_;\n  int namespace_depth;\n\n public:\n  SwiftGenerator(const Parser& parser, const std::string& path,\n                 const std::string& file_name)\n      : BaseGenerator(parser, path, file_name, \"\", \"_\", \"swift\"),\n        namer_(WithFlagOptions(SwiftDefaultConfig(), parser.opts, path),\n               SwiftKeywords()) {\n    namespace_depth = 0;\n    code_.SetPadding(\"  \");\n  }\n\n  bool generate() {\n    code_.Clear();\n    code_.SetValue(\"ACCESS\", \"_accessor\");\n    code_.SetValue(\"TABLEOFFSET\", \"VT\");\n    code_ += \"// \" + std::string(FlatBuffersGeneratedWarning());\n    code_ += \"// swiftlint:disable all\";\n    code_ += \"// swiftformat:disable all\\n\";\n\n    if (parser_.opts.include_dependence_headers || parser_.opts.generate_all) {\n      code_.SetValue(\"IMPLEMENTONLY\", parser_.opts.swift_implementation_only\n                                          ? \"@_implementationOnly \"\n                                          : \"\");\n      code_ += \"#if canImport(Common)\";\n      code_ += \"{{IMPLEMENTONLY}}import Common\";\n      code_ += \"#endif\";\n      code_ += \"\";\n      code_ += \"{{IMPLEMENTONLY}}import FlatBuffers\\n\";\n    }\n\n    if (parser_.advanced_features_ == reflection::AdvancedArrayFeatures) {\n      code_ += \"#if compiler(>=6.2)\";\n    }\n\n    GenerateCode();\n\n    if (parser_.advanced_features_ == reflection::AdvancedArrayFeatures) {\n      code_ += \"#endif\";\n    }\n\n    const auto filename = GeneratedFileName(path_, file_name_, parser_.opts);\n    const auto final_code = code_.ToString();\n    return parser_.opts.file_saver->SaveFile(filename.c_str(), final_code,\n                                             false);\n  }\n\n  void GenerateCode() {\n    // Generate code for all the enum declarations.\n    for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end();\n         ++it) {\n      const auto& enum_def = **it;\n      if (!enum_def.generated) {\n        GenEnum(enum_def);\n      }\n    }\n\n    for (auto it = parser_.structs_.vec.begin();\n         it != parser_.structs_.vec.end(); ++it) {\n      const auto& struct_def = **it;\n      if (struct_def.fixed && !struct_def.generated) {\n        GenStructReader(struct_def);\n        GenMutableStructReader(struct_def);\n      }\n    }\n\n    for (auto it = parser_.structs_.vec.begin();\n         it != parser_.structs_.vec.end(); ++it) {\n      const auto& struct_def = **it;\n      if (!struct_def.fixed && !struct_def.generated) {\n        GenTable(struct_def);\n        if (parser_.opts.generate_object_based_api) {\n          GenObjectAPI(struct_def);\n        }\n      }\n    }\n  }\n\n  void mark(const std::string& str) {\n    code_.SetValue(\"MARKVALUE\", str);\n    code_ += \"\\n// MARK: - {{MARKVALUE}}\\n\";\n  }\n\n  // MARK: - Generating structs\n\n  // Generates the reader for swift\n  void GenStructReader(const StructDef& struct_def) {\n    const bool is_private_access =\n        parser_.opts.swift_implementation_only ||\n        struct_def.attributes.Lookup(\"private\") != nullptr;\n    code_.SetValue(\"ACCESS_TYPE\", is_private_access ? \"internal\" : \"public\");\n    GenComment(struct_def.doc_comment);\n    code_.SetValue(\"STRUCTNAME\", namer_.NamespacedType(struct_def));\n    GenOSVersionChecks();\n    code_ +=\n        \"{{ACCESS_TYPE}} struct {{STRUCTNAME}}: NativeStruct, \"\n        \"FlatbuffersVectorInitializable, Verifiable, \"\n        \"FlatbuffersInitializable\\\\\";\n    if (parser_.opts.generate_object_based_api) code_ += \", NativeObject\\\\\";\n    code_ += \" {\";\n    code_ += \"\";\n    Indent();\n    code_ += ValidateFunc();\n    code_ += \"\";\n    int padding_id = 0;\n    std::string constructor = \"\";\n    std::vector<std::string> base_constructor;\n    std::vector<std::string> main_constructor;\n\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      const auto& field = **it;\n      if (field.deprecated) continue;\n\n      if (!constructor.empty()) constructor += \", \";\n\n      const auto field_var = namer_.Variable(field);\n      code_.SetValue(\"FIELDVAR\", field_var);\n      const auto type = GenType(field.value.type);\n      if (IsEnum(field.value.type)) {\n        code_.SetValue(\"BASEVALUE\", GenTypeBasic(field.value.type, false));\n      }\n      code_.SetValue(\"VALUETYPE\", type);\n      GenComment(field.doc_comment);\n\n      if (IsArray(field.value.type)) {\n        std::string valueType = IsEnum(field.value.type.VectorType())\n                                    ? \"{{BASEVALUE}}\"\n                                    : \"{{VALUETYPE}}\";\n        const auto fixed_length =\n            NumToString(field.value.type.VectorType().fixed_length);\n        code_.SetValue(\"FIXEDLENGTH\", fixed_length);\n\n        std::string vector_base_type;\n        if (IsStruct(field.value.type.VectorType())) {\n          vector_base_type = type + \"()\";\n        } else if (IsBool(field.value.type.VectorType().base_type)) {\n          vector_base_type = \"false\";\n        } else if (IsFloat(field.value.type.VectorType().base_type)) {\n          vector_base_type = \"0.0\";\n        } else {\n          vector_base_type = SwiftConstant(field);\n        }\n        code_ += \"private var _{{FIELDVAR}}: InlineArray<{{FIXEDLENGTH}}, \" +\n                 valueType + \">\";\n\n        main_constructor.push_back(\"_\" + field_var + \" = \" + field_var);\n        base_constructor.push_back(\n            \"_\" + field_var + \" = InlineArray(repeating: \" + vector_base_type +\n            \")\");\n\n        if (field.padding) {\n          GenPadding(field, &padding_id);\n        }\n        constructor += field_var + \": \" + \"InlineArray<\" + fixed_length + \", \";\n        if (IsEnum(field.value.type.VectorType())) {\n          constructor +=\n              GenTypeBasic(field.value.type.VectorType(), false) + \">\";\n        } else {\n          constructor += type + \">\";\n        }\n      } else {\n        const auto accessing_value = IsEnum(field.value.type) ? \".value\" : \"\";\n        const auto base_value =\n            IsStruct(field.value.type) ? (type + \"()\") : SwiftConstant(field);\n\n        std::string valueType =\n            IsEnum(field.value.type) ? \"{{BASEVALUE}}\" : \"{{VALUETYPE}}\";\n        code_ += \"private var _{{FIELDVAR}}: \" + valueType;\n\n        main_constructor.push_back(\"_\" + field_var + \" = \" + field_var +\n                                   accessing_value);\n        base_constructor.push_back(\"_\" + field_var + \" = \" + base_value);\n\n        if (field.padding) {\n          GenPadding(field, &padding_id);\n        }\n        constructor += field_var + \": \" + type;\n      }\n    }\n    code_ += \"\";\n    code_ += \"{{ACCESS_TYPE}} init(_ bb: ByteBuffer, o: Int32) {\";\n    Indent();\n    code_ += \"self = bb.read(def: Self.self, position: Int(o))\";\n    Outdent();\n    code_ += \"}\\n\";\n\n    BuildObjectConstructor(main_constructor, constructor);\n    BuildObjectConstructor(base_constructor, \"\");\n\n    if (parser_.opts.generate_object_based_api)\n      GenerateObjectAPIStructConstructor(struct_def);\n\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      const auto& field = **it;\n      if (field.deprecated) continue;\n      code_.SetValue(\"FIELDVAR\", namer_.Variable(field));\n      code_.SetValue(\"VALUETYPE\", GenType(field.value.type));\n      GenComment(field.doc_comment);\n      if (IsArray(field.value.type)) {\n        const auto fixed_length =\n            NumToString(field.value.type.VectorType().fixed_length);\n        code_.SetValue(\"FIXEDLENGTH\", fixed_length);\n        if (IsEnum(field.value.type.VectorType())) {\n          code_ +=\n              \"{{ACCESS_TYPE}} var {{FIELDVAR}}: InlineArray<{{FIXEDLENGTH}}, \"\n              \"{{VALUETYPE}}> { InlineArray { {{VALUETYPE}}(rawValue: \"\n              \"_{{FIELDVAR}}[$0])! } }\";\n        } else {\n          code_ +=\n              \"{{ACCESS_TYPE}} var {{FIELDVAR}}: InlineArray<{{FIXEDLENGTH}}, \"\n              \"{{VALUETYPE}}> { _{{FIELDVAR}} }\";\n        }\n      } else if (!IsEnum(field.value.type)) {\n        code_ += GenReaderMainBody() + \"_{{FIELDVAR}} }\";\n      } else if (IsEnum(field.value.type)) {\n        code_ +=\n            GenReaderMainBody() + \"{{VALUETYPE}}(rawValue: _{{FIELDVAR}})! }\";\n      }\n    }\n    code_ += \"\";\n    code_ +=\n        \"{{ACCESS_TYPE}} static func verify<T>(_ verifier: inout Verifier, at \"\n        \"position: \"\n        \"Int, of type: T.Type) throws where T: Verifiable {\";\n    Indent();\n    code_ +=\n        \"try verifier.inBuffer(position: position, of: {{STRUCTNAME}}.self)\";\n    Outdent();\n    code_ += \"}\";\n    Outdent();\n    code_ += \"}\\n\";\n    if (parser_.opts.gen_json_coders) GenerateJSONEncodingAPIs(struct_def);\n  }\n\n  void GenMutableStructReader(const StructDef& struct_def) {\n    GenObjectHeader(struct_def);\n\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      const auto& field = **it;\n      if (field.deprecated) continue;\n      const auto offset = NumToString(field.value.offset);\n      const auto type = GenType(field.value.type);\n      code_.SetValue(\"FIELDVAR\", namer_.Variable(field));\n      if (IsEnum(field.value.type)) {\n        code_.SetValue(\"BASEVALUE\", GenTypeBasic(field.value.type, false));\n      }\n      code_.SetValue(\"VALUETYPE\", type);\n      code_.SetValue(\"OFFSET\", offset);\n\n      if (IsArray(field.value.type)) {\n        code_.SetValue(\"OFFSET_VALUE\", NumToString(field.value.offset));\n        code_.SetValue(\"SIZE\",\n                       NumToString(InlineSize(field.value.type.VectorType())));\n        code_.SetValue(\"MUTABLE\", IsStruct(field.value.type.VectorType())\n                                      ? Mutable()\n                                      : \"\");\n        const auto fixed_length =\n            NumToString(field.value.type.VectorType().fixed_length);\n        code_.SetValue(\"FIXEDLENGTH\", fixed_length);\n\n        code_ +=\n            \"{{ACCESS_TYPE}} var {{FIELDVAR}}: \"\n            \"FlatbufferVector<{{VALUETYPE}}{{MUTABLE}}> \"\n            \"{ return {{ACCESS}}.vector(at: {{OFFSET_VALUE}}, count: \"\n            \"{{FIXEDLENGTH}}, size: {{SIZE}}) \"\n            \"}\";\n      } else if (IsScalar(field.value.type.base_type) &&\n                 !IsEnum(field.value.type)) {\n        code_ +=\n            GenReaderMainBody() + \"return \" + GenReader(\"VALUETYPE\") + \" }\";\n      } else if (IsEnum(field.value.type)) {\n        code_.SetValue(\"BASEVALUE\", GenTypeBasic(field.value.type, false));\n        code_ += GenReaderMainBody() + \"return \" +\n                 GenEnumConstructor(\"{{OFFSET}}\") + \"?? \" +\n                 GenEnumDefaultValue(field) + \" }\";\n      } else if (IsStruct(field.value.type)) {\n        code_.SetValue(\"VALUETYPE\", GenType(field.value.type) + Mutable());\n        code_ += GenReaderMainBody() + \"return \" +\n                 GenConstructor(\"{{ACCESS}}.position + {{OFFSET}}\");\n      } else if (IsVector(field.value.type.base_type)) {\n        code_.SetValue(\"VALUETYPE\", GenType(field.value.type) + Mutable());\n        code_ += GenReaderMainBody() + \"return \" +\n                 GenConstructor(\"{{ACCESS}}.position + {{OFFSET}}\");\n      }\n\n      if (parser_.opts.mutable_buffer) {\n        if (!IsStruct(field.value.type) && !IsArray(field.value.type)) {\n          code_ += GenMutate(\"{{OFFSET}}\", \"\", IsEnum(field.value.type));\n        } else if (IsArray(field.value.type) &&\n                   !IsStruct(field.value.type.VectorType())) {\n          code_.SetValue(\"IS_RAW\", IsEnum(field.value.type.VectorType())\n                                       ? \".rawValue\"\n                                       : \"\");\n          code_ +=\n              \"@discardableResult {{ACCESS_TYPE}} func mutate({{FIELDVAR}}: \"\n              \"{{VALUETYPE}}, at index: Int32) -> Bool { \"\n              \"return {{ACCESS}}.mutate({{FIELDVAR}}{{IS_RAW}}, index: \"\n              \"{{OFFSET_VALUE}} + (index * {{SIZE}})) }\";\n        }\n      }\n    }\n\n    if (parser_.opts.generate_object_based_api) {\n      GenerateObjectAPIExtensionHeader(namer_.NamespacedType(struct_def),\n                                       struct_def.fixed);\n      code_ += \"return builder.create(struct: obj)\";\n      Outdent();\n      code_ += \"}\";\n    }\n    Outdent();\n    code_ += \"}\\n\";\n  }\n\n  void GenerateStructArgs(const StructDef& struct_def, std::string* code_ptr,\n                          const std::string& nameprefix,\n                          const std::string& object_name,\n                          const std::string& obj_api_named = \"\",\n                          bool is_obj_api = false) {\n    auto& code = *code_ptr;\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      const auto& field = **it;\n      if (field.deprecated) continue;\n      const auto& field_type = field.value.type;\n      if (IsStruct(field.value.type)) {\n        GenerateStructArgs(\n            *field_type.struct_def, code_ptr, (nameprefix + field.name),\n            (object_name + \".\" + field.name), obj_api_named, is_obj_api);\n      } else {\n        const auto field_var = namer_.Variable(field);\n        const auto field_field = namer_.Field(field);\n        const auto type = GenType(field.value.type);\n        if (!is_obj_api) {\n          code += nameprefix + field_var + \": \" + type;\n          if (!IsEnum(field.value.type)) {\n            code += \" = \";\n            code += SwiftConstant(field);\n          }\n          code += \", \";\n          continue;\n        }\n        code += nameprefix + field_var + \": \" + obj_api_named + object_name +\n                \".\" + field_field;\n        code += \", \";\n      }\n    }\n  }\n\n  // MARK: - Table Generator\n\n  // Generates the reader for swift\n  void GenTable(const StructDef& struct_def) {\n    const bool is_private_access =\n        parser_.opts.swift_implementation_only ||\n        struct_def.attributes.Lookup(\"private\") != nullptr;\n    code_.SetValue(\"ACCESS_TYPE\", is_private_access ? \"internal\" : \"public\");\n    GenObjectHeader(struct_def);\n    GenTableAccessors(struct_def);\n    GenTableReader(struct_def);\n    GenTableWriter(struct_def);\n    if (parser_.opts.generate_object_based_api)\n      GenerateObjectAPITableExtension(struct_def);\n    code_ += \"\";\n    GenerateVerifier(struct_def);\n    Outdent();\n    code_ += \"}\\n\";\n    if (parser_.opts.gen_json_coders) GenerateJSONEncodingAPIs(struct_def);\n  }\n\n  // Generates the reader for swift\n  void GenTableAccessors(const StructDef& struct_def) {\n    // Generate field id constants.\n    if (struct_def.fields.vec.size() > 0) {\n      code_ += \"private struct {{TABLEOFFSET}} {\";\n      Indent();\n      for (auto it = struct_def.fields.vec.begin();\n           it != struct_def.fields.vec.end(); ++it) {\n        const auto& field = **it;\n        if (field.deprecated) {\n          continue;\n        }\n        code_.SetValue(\"OFFSET_NAME\", namer_.Variable(field));\n        code_.SetValue(\"OFFSET_VALUE\", NumToString(field.value.offset));\n        code_ += \"static let {{OFFSET_NAME}}: VOffset = {{OFFSET_VALUE}}\";\n      }\n      Outdent();\n      code_ += \"}\";\n      code_ += \"\";\n    }\n  }\n\n  void GenObjectHeader(const StructDef& struct_def) {\n    GenComment(struct_def.doc_comment);\n\n    code_.SetValue(\"SHORT_STRUCTNAME\", namer_.Type(struct_def));\n    code_.SetValue(\"STRUCTNAME\", namer_.NamespacedType(struct_def));\n    code_.SetValue(\"OBJECTTYPE\", struct_def.fixed ? \"Struct\" : \"Table\");\n    code_.SetValue(\"MUTABLE\", struct_def.fixed ? Mutable() : \"\");\n\n    GenOSVersionChecks();\n    code_ +=\n        \"{{ACCESS_TYPE}} struct {{STRUCTNAME}}{{MUTABLE}}: \"\n        \"FlatBuffer{{OBJECTTYPE}}, FlatbuffersVectorInitializable\\\\\";\n    if (!struct_def.fixed) code_ += \", Verifiable\\\\\";\n    if (!struct_def.fixed && parser_.opts.generate_object_based_api)\n      code_ += \", ObjectAPIPacker\\\\\";\n    code_ += \" {\\n\";\n    Indent();\n    code_ += ValidateFunc();\n    code_ +=\n        \"{{ACCESS_TYPE}} var __buffer: ByteBuffer! { return {{ACCESS}}.bb }\";\n    code_ += \"private var {{ACCESS}}: {{OBJECTTYPE}}\\n\";\n    if (!struct_def.fixed) {\n      if (parser_.file_identifier_.length()) {\n        code_.SetValue(\"FILENAME\", parser_.file_identifier_);\n        code_ += \"{{ACCESS_TYPE}} static var id: String { \\\"{{FILENAME}}\\\" } \";\n        code_ +=\n            \"{{ACCESS_TYPE}} static func finish(_ fbb: inout \"\n            \"FlatBufferBuilder, end: \"\n            \"Offset, prefix: Bool = false) { fbb.finish(offset: end, \"\n            \"fileId: \"\n            \"{{STRUCTNAME}}.id, addPrefix: prefix) }\";\n      }\n      code_ += \"private init(_ t: Table) { {{ACCESS}} = t }\";\n    }\n    code_ +=\n        \"{{ACCESS_TYPE}} init(_ bb: ByteBuffer, o: Int32) { {{ACCESS}} = \"\n        \"{{OBJECTTYPE}}(bb: \"\n        \"bb, position: o) }\";\n    code_ += \"\";\n  }\n\n  void GenTableWriter(const StructDef& struct_def) {\n    flatbuffers::FieldDef* key_field = nullptr;\n    std::vector<std::string> require_fields;\n    std::vector<std::string> create_func_body;\n    std::vector<std::string> create_func_header;\n    const auto should_generate_create = struct_def.fields.vec.size() != 0;\n\n    code_.SetValue(\"NUMBEROFFIELDS\", NumToString(struct_def.fields.vec.size()));\n    code_ +=\n        \"{{ACCESS_TYPE}} static func start{{SHORT_STRUCTNAME}}(_ fbb: inout \"\n        \"FlatBufferBuilder) -> \"\n        \"UOffset { fbb.startTable(with: {{NUMBEROFFIELDS}}) }\";\n\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (field.deprecated) continue;\n      if (field.key) key_field = &field;\n      if (field.IsRequired())\n        require_fields.push_back(NumToString(field.value.offset));\n\n      GenTableWriterFields(field, &create_func_body, &create_func_header);\n    }\n    code_ +=\n        \"{{ACCESS_TYPE}} static func end{{SHORT_STRUCTNAME}}(_ fbb: inout \"\n        \"FlatBufferBuilder, \"\n        \"start: \"\n        \"UOffset) -> Offset { let end = Offset(offset: \"\n        \"fbb.endTable(at: start))\\\\\";\n    if (require_fields.capacity() != 0) {\n      std::string fields = \"\";\n      for (auto it = require_fields.begin(); it != require_fields.end(); ++it)\n        fields += *it + \", \";\n      code_.SetValue(\"FIELDS\", fields.substr(0, fields.size() - 2));\n      code_ += \"; fbb.require(table: end, fields: [{{FIELDS}}])\\\\\";\n    }\n    code_ += \"; return end }\";\n\n    if (should_generate_create) {\n      code_ += \"{{ACCESS_TYPE}} static func create{{SHORT_STRUCTNAME}}(\";\n      Indent();\n      code_ += \"_ fbb: inout FlatBufferBuilder\\\\\";\n      if (create_func_header.empty() == false) code_ += \",\";\n      for (auto it = create_func_header.begin(); it < create_func_header.end();\n           ++it) {\n        code_ += *it + \"\\\\\";\n        if (it < create_func_header.end() - 1) code_ += \",\";\n      }\n      code_ += \"\";\n      Outdent();\n      code_ += \") -> Offset {\";\n      Indent();\n      code_ += \"let __start = {{STRUCTNAME}}.start{{SHORT_STRUCTNAME}}(&fbb)\";\n      for (auto it = create_func_body.begin(); it < create_func_body.end();\n           ++it) {\n        code_ += *it;\n      }\n      code_ +=\n          \"return {{STRUCTNAME}}.end{{SHORT_STRUCTNAME}}(&fbb, start: __start)\";\n      Outdent();\n      code_ += \"}\";\n    }\n\n    std::string spacing = \"\";\n\n    if (key_field != nullptr && !struct_def.fixed && struct_def.has_key) {\n      code_.SetValue(\"VOFFSET\", NumToString(key_field->value.offset));\n\n      code_ += \"{{ACCESS_TYPE}} static func \" +\n               namer_.Method(\"sort_vector_of\", struct_def) +\n               \"(offsets:[Offset], \"\n               \"_ fbb: inout FlatBufferBuilder) -> Offset {\";\n      Indent();\n      code_ += spacing + \"var off = offsets\";\n      code_ += spacing +\n               \"off.sort { Table.compare(Table.offset(Int32($1.o), vOffset: \"\n               \"{{VOFFSET}}, fbb: &fbb), Table.offset(Int32($0.o), vOffset: \"\n               \"{{VOFFSET}}, fbb: &fbb), fbb: &fbb) < 0 } \";\n      code_ += spacing + \"return fbb.createVector(ofOffsets: off)\";\n      Outdent();\n      code_ += \"}\";\n      GenLookup(*key_field, namer_.NamespacedType(struct_def));\n    }\n  }\n\n  void GenTableWriterFields(const FieldDef& field,\n                            std::vector<std::string>* create_body,\n                            std::vector<std::string>* create_header) {\n    std::string builder_string = \", _ fbb: inout FlatBufferBuilder) { \";\n    auto& create_func_body = *create_body;\n    auto& create_func_header = *create_header;\n    const auto field_field = namer_.Field(field);\n    const auto field_var = namer_.Variable(field);\n    const auto type = GenType(field.value.type);\n    const auto opt_scalar =\n        field.IsOptional() && IsScalar(field.value.type.base_type);\n    const auto nullable_type = opt_scalar ? type + \"?\" : type;\n    code_.SetValue(\"FIELDVAR\", namer_.Variable(field));\n    code_.SetValue(\"VALUETYPE\", nullable_type);\n    code_.SetValue(\"OFFSET\", namer_.Field(field));\n    code_.SetValue(\"CONSTANT\", SwiftConstant(field));\n    std::string check_if_vector =\n        (IsVector(field.value.type) || IsArray(field.value.type)) ? \"VectorOf(\"\n                                                                  : \"(\";\n    const auto body = \"add\" + check_if_vector + field_field + \": \";\n    code_ += \"{{ACCESS_TYPE}} static func \" + body + \"\\\\\";\n\n    create_func_body.push_back(\"{{STRUCTNAME}}.\" + body + field_field +\n                               \", &fbb)\");\n\n    if (IsScalar(field.value.type.base_type) &&\n        !IsBool(field.value.type.base_type)) {\n      const std::string is_enum = IsEnum(field.value.type) ? \".rawValue\" : \"\";\n      const std::string optional_enum =\n          IsEnum(field.value.type) ? (\"?\" + is_enum) : \"\";\n      code_ +=\n          \"{{VALUETYPE}}\" + builder_string + \"fbb.add(element: {{FIELDVAR}}\\\\\";\n\n      code_ += field.IsOptional() ? (optional_enum + \"\\\\\")\n                                  : (is_enum + \", def: {{CONSTANT}}\\\\\");\n\n      code_ += \", at: {{TABLEOFFSET}}.{{OFFSET}}) }\";\n\n      const auto default_value =\n          IsEnum(field.value.type)\n              ? (field.IsOptional() ? \"nil\" : GenEnumDefaultValue(field))\n              : SwiftConstant(field);\n      create_func_header.push_back(\n          \"\" + field_field + \": \" + nullable_type + \" = \" +\n          (field.IsOptional() ? \"nil\" : default_value));\n      return;\n    }\n\n    if (IsBool(field.value.type.base_type)) {\n      std::string default_value = SwiftConstant(field);\n\n      code_.SetValue(\"CONSTANT\", default_value);\n      code_.SetValue(\"VALUETYPE\", field.IsOptional() ? \"Bool?\" : \"Bool\");\n      code_ +=\n          \"{{VALUETYPE}}\" + builder_string + \"fbb.add(element: {{FIELDVAR}},\\\\\";\n      code_ += field.IsOptional() ? \"\\\\\" : \" def: {{CONSTANT}},\";\n      code_ += \" at: {{TABLEOFFSET}}.{{OFFSET}}) }\";\n      create_func_header.push_back(\n          field_var + \": \" + nullable_type + \" = \" +\n          (field.IsOptional() ? \"nil\" : default_value));\n      return;\n    }\n\n    if (IsStruct(field.value.type)) {\n      const auto create_struct =\n          \"guard let {{FIELDVAR}} = {{FIELDVAR}} else { return };\"\n          \" fbb.create(struct: {{FIELDVAR}}, position: \"\n          \"{{TABLEOFFSET}}.{{OFFSET}}) }\";\n      code_ += type + \"?\" + builder_string + create_struct;\n      /// Optional hard coded since structs are always optional\n      create_func_header.push_back(field_var + \": \" + type +\n                                   (field.IsOptional() ? \"? = nil\" : \"\"));\n      return;\n    }\n\n    const auto arg_label =\n        namer_.Variable(field) +\n        (IsVector(field.value.type) || IsArray(field.value.type)\n             ? \"VectorOffset\"\n             : \"Offset\");\n    create_func_header.push_back(arg_label + \" \" + field_var + \": \" + \"Offset\" +\n                                 (field.IsRequired() ? \"\" : \" = Offset()\"));\n    const auto reader_type =\n        IsStruct(field.value.type) && field.value.type.struct_def->fixed\n            ? \"structOffset: {{TABLEOFFSET}}.{{OFFSET}}) }\"\n            : \"offset: {{FIELDVAR}}, at: {{TABLEOFFSET}}.{{OFFSET}}) \"\n              \"}\";\n    code_ += \"Offset\" + builder_string + \"fbb.add(\" + reader_type;\n\n    const auto vectortype = field.value.type.VectorType();\n\n    if ((vectortype.base_type == BASE_TYPE_STRUCT &&\n         field.value.type.struct_def->fixed) &&\n        (IsVector(field.value.type) || IsArray(field.value.type))) {\n      const auto field_name = namer_.NamespacedType(*vectortype.struct_def);\n      code_ += \"{{ACCESS_TYPE}} static func \" +\n               namer_.Method(\"start_vector_of\", field_var) +\n               \"(_ size: Int, in builder: inout \"\n               \"FlatBufferBuilder) {\";\n      Indent();\n      code_ += \"builder.startVector(size * MemoryLayout<\" + field_name +\n               \">.size, elementSize: MemoryLayout<\" + field_name +\n               \">.alignment)\";\n      Outdent();\n      code_ += \"}\";\n    }\n  }\n\n  void GenTableReader(const StructDef& struct_def) {\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      const auto& field = **it;\n      if (field.deprecated) continue;\n      GenTableReaderFields(field);\n    }\n  }\n\n  void GenTableReaderFields(const FieldDef& field) {\n    const auto offset = NumToString(field.value.offset);\n    const auto field_field = namer_.Field(field);\n    const auto type = GenType(field.value.type);\n    code_.SetValue(\"FIELDVAR\", namer_.Variable(field));\n    code_.SetValue(\"FIELDMETHOD\", namer_.Method(field));\n    code_.SetValue(\"VALUETYPE\", type);\n    code_.SetValue(\"OFFSET\", namer_.Constant(field.name));\n    code_.SetValue(\"CONSTANT\", SwiftConstant(field));\n    bool opt_scalar =\n        field.IsOptional() && IsScalar(field.value.type.base_type);\n    std::string def_Val = opt_scalar ? \"nil\" : \"{{CONSTANT}}\";\n    std::string optional = opt_scalar ? \"?\" : \"\";\n    const auto const_string = \"return o == 0 ? \" + def_Val + \" : \";\n    GenComment(field.doc_comment);\n    if (IsScalar(field.value.type.base_type) && !IsEnum(field.value.type) &&\n        !IsBool(field.value.type.base_type)) {\n      code_ += GenReaderMainBody(optional) + GenOffset() + const_string +\n               GenReader(\"VALUETYPE\", \"o\") + \" }\";\n      if (parser_.opts.mutable_buffer) code_ += GenMutate(\"o\", GenOffset());\n      return;\n    }\n\n    if (IsBool(field.value.type.base_type)) {\n      std::string default_value =\n          field.IsOptional() ? \"nil\" : SwiftConstant(field);\n      code_.SetValue(\"CONSTANT\", default_value);\n      code_.SetValue(\"VALUETYPE\", \"Bool\");\n      code_ += GenReaderMainBody(optional) + \"\\\\\";\n      code_ += GenOffset() +\n               \"return o == 0 ? {{CONSTANT}} : \" + GenReader(\"VALUETYPE\", \"o\") +\n               \" }\";\n      if (parser_.opts.mutable_buffer) code_ += GenMutate(\"o\", GenOffset());\n      return;\n    }\n\n    if (IsEnum(field.value.type)) {\n      const auto default_value =\n          field.IsOptional() ? \"nil\" : GenEnumDefaultValue(field);\n      code_.SetValue(\"BASEVALUE\", GenTypeBasic(field.value.type, false));\n      code_ += GenReaderMainBody(optional) + \"\\\\\";\n      code_ += GenOffset() + \"return o == 0 ? \" + default_value + \" : \" +\n               GenEnumConstructor(\"o\") + \"?? \" + default_value + \" }\";\n      if (parser_.opts.mutable_buffer && !IsUnion(field.value.type))\n        code_ += GenMutate(\"o\", GenOffset(), true);\n      return;\n    }\n\n    const std::string is_required = field.IsRequired() ? \"!\" : \"?\";\n    const auto required_reader = field.IsRequired() ? \"return \" : const_string;\n\n    if (IsStruct(field.value.type) && field.value.type.struct_def->fixed) {\n      code_.SetValue(\"VALUETYPE\", GenType(field.value.type));\n      code_.SetValue(\"CONSTANT\", \"nil\");\n      code_ += GenReaderMainBody(is_required) + GenOffset() + required_reader +\n               \"{{ACCESS}}.readBuffer(of: {{VALUETYPE}}.self, at: o) }\";\n      code_.SetValue(\"FIELDVAR\", namer_.Variable(\"mutable\", field_field));\n      code_.SetValue(\"VALUETYPE\", GenType(field.value.type) + Mutable());\n      code_.SetValue(\"CONSTANT\", \"nil\");\n      code_ += GenReaderMainBody(is_required) + GenOffset() + required_reader +\n               GenConstructor(\"o + {{ACCESS}}.position\");\n      return;\n    }\n    switch (field.value.type.base_type) {\n      case BASE_TYPE_STRUCT:\n        code_.SetValue(\"VALUETYPE\", GenType(field.value.type));\n        code_.SetValue(\"CONSTANT\", \"nil\");\n        code_ += GenReaderMainBody(is_required) + GenOffset() +\n                 required_reader +\n                 GenConstructor(GenIndirect(\"o + {{ACCESS}}.position\"));\n        break;\n\n      case BASE_TYPE_STRING: {\n        const auto sc = SwiftConstant(field);\n        std::string default_string;\n        flatbuffers::EscapeString(sc.c_str(), sc.length(), &default_string,\n                                  true, false);\n        code_.SetValue(\"VALUETYPE\", GenType(field.value.type));\n        code_.SetValue(\"CONSTANT\", field.IsDefault() ? default_string : \"nil\");\n        code_ += GenReaderMainBody(is_required) + GenOffset() +\n                 required_reader + \"{{ACCESS}}.string(at: o) }\";\n        code_ += \"{{ACCESS_TYPE}} var {{FIELDVAR}}SegmentArray: [UInt8]\" +\n                 is_required +\n                 \" { return \"\n                 \"{{ACCESS}}.getVector(at: {{TABLEOFFSET}}.{{OFFSET}}) }\";\n        break;\n      }\n      case BASE_TYPE_ARRAY:\n        FLATBUFFERS_FALLTHROUGH();  // fall thru\n      case BASE_TYPE_VECTOR:\n        GenTableReaderVectorFields(field);\n        break;\n      case BASE_TYPE_UNION:\n        code_.SetValue(\"CONSTANT\", \"nil\");\n        code_ +=\n            \"{{ACCESS_TYPE}} func {{FIELDVAR}}<T: \"\n            \"FlatbuffersInitializable>(type: \"\n            \"T.Type) -> T\" +\n            is_required + \" { \" + GenOffset() + required_reader +\n            \"{{ACCESS}}.union(o) }\";\n        break;\n      default:\n        FLATBUFFERS_ASSERT(0);\n    }\n  }\n\n  void GenTableReaderVectorFields(const FieldDef& field) {\n    const auto vectortype = field.value.type.VectorType();\n    code_.SetValue(\"SIZE\", NumToString(InlineSize(vectortype)));\n\n    if (vectortype.base_type == BASE_TYPE_STRING) {\n      code_.SetValue(\"VALUETYPE\", \"String?\");\n    }\n\n    if (vectortype.base_type != BASE_TYPE_UNION) {\n      code_ +=\n          \"{{ACCESS_TYPE}} var {{FIELDVAR}}: \"\n          \"FlatbufferVector<{{VALUETYPE}}> \"\n          \"{ return {{ACCESS}}.vector(at: {{TABLEOFFSET}}.{{OFFSET}}, \"\n          \"byteSize: {{SIZE}}) }\";\n    }\n\n    if (IsScalar(vectortype.base_type) && !IsEnum(vectortype) &&\n        !IsBool(field.value.type.base_type)) {\n      if (parser_.opts.mutable_buffer) code_ += GenMutateArray();\n      GenUnsafeBufferPointer(field);\n      return;\n    }\n\n    if (vectortype.base_type == BASE_TYPE_STRUCT &&\n        field.value.type.struct_def->fixed) {\n      code_.SetValue(\"FIELDVAR\", namer_.Method(\"mutable\", field));\n      code_ +=\n          \"{{ACCESS_TYPE}} var {{FIELDVAR}}: \"\n          \"FlatbufferVector<{{VALUETYPE}}_Mutable> \"\n          \"{ return {{ACCESS}}.vector(at: {{TABLEOFFSET}}.{{OFFSET}}, \"\n          \"byteSize: {{SIZE}}) }\";\n      GenUnsafeBufferPointer(field);\n      return;\n    }\n\n    if (vectortype.base_type == BASE_TYPE_UNION) {\n      code_ +=\n          \"{{ACCESS_TYPE}} var {{FIELDVAR}}: UnionFlatbufferVector \"\n          \"{ return {{ACCESS}}.unionVector(at: \"\n          \"{{TABLEOFFSET}}.{{OFFSET}}, \"\n          \"byteSize: {{SIZE}}) }\";\n      code_ +=\n          \"{{ACCESS_TYPE}} func {{FIELDVAR}}<T: FlatbuffersInitializable>(at \"\n          \"index: \"\n          \"Int32, type: T.Type) -> T? { \" +\n          GenOffset() + \"return o == 0 ? nil : \\\\\";\n      code_ +=\n          \"{{ACCESS}}.directUnion({{ACCESS}}.vector(at: o) + \"\n          \"index * {{SIZE}}) }\";\n      return;\n    }\n\n    if (vectortype.base_type == BASE_TYPE_STRUCT &&\n        !field.value.type.struct_def->fixed) {\n      const auto& sd = *field.value.type.struct_def;\n      const auto& fields = sd.fields.vec;\n      for (auto kit = fields.begin(); kit != fields.end(); ++kit) {\n        const auto& key_field = **kit;\n        if (key_field.key) {\n          GenByKeyFunctions(key_field);\n          break;\n        }\n      }\n    }\n  }\n\n  void GenUnsafeBufferPointer(const FieldDef& field) {\n    code_.SetValue(\"functionName\",\n                   namer_.Variable(\"withUnsafePointerTo\", field));\n    code_ +=\n        \"{{ACCESS_TYPE}} func {{functionName}}<T>(_ body: \"\n        \"(UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return \"\n        \"try \"\n        \"{{ACCESS}}.withUnsafePointerToSlice(at: \"\n        \"{{TABLEOFFSET}}.{{OFFSET}}, \"\n        \"body: body) }\";\n  }\n\n  std::vector<std::string> GenerateCodingKeys(const StructDef& struct_def) {\n    std::vector<std::string> coding_keys;\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      const auto& field = **it;\n      if (field.deprecated) continue;\n      coding_keys.push_back(\"case \" + namer_.Variable(field) + \" = \\\"\" +\n                            field.name + \"\\\"\");\n    }\n    return coding_keys;\n  }\n\n  void GenerateEncoderUnionBody(const FieldDef& field) {\n    EnumDef& union_def = *field.value.type.enum_def;\n    const auto is_vector = field.value.type.base_type == BASE_TYPE_VECTOR ||\n                           field.value.type.base_type == BASE_TYPE_ARRAY;\n    if (field.value.type.base_type == BASE_TYPE_UTYPE ||\n        (is_vector &&\n         field.value.type.VectorType().base_type == BASE_TYPE_UTYPE))\n      return;\n    if (is_vector) {\n      code_ +=\n          \"try container.encode({{FIELDVAR}}Type, forKey: .charactersType)\";\n      code_ +=\n          \"var contentEncoder = container.nestedUnkeyedContainer(forKey: \"\n          \".{{FIELDVAR}})\";\n      code_ += \"let _{{FIELDVAR}} = {{FIELDVAR}}Type\";\n      code_ +=\n          \"for index in _{{FIELDVAR}}.startIndex..<_{{FIELDVAR}}.endIndex {\";\n      Indent();\n      code_ += \"switch _{{FIELDVAR}}[index] {\";\n      for (auto it = union_def.Vals().begin(); it != union_def.Vals().end();\n           ++it) {\n        const auto& ev = **it;\n        const auto type = GenType(ev.union_type);\n        code_.SetValue(\"KEY\", namer_.LegacySwiftVariant(ev));\n        code_.SetValue(\"VALUETYPE\", type);\n        if (ev.union_type.base_type == BASE_TYPE_NONE) {\n          continue;\n        }\n        code_ += \"case .{{KEY}}:\";\n        Indent();\n        code_ +=\n            \"let _v = {{FIELDVAR}}(at: Int32(index), type: {{VALUETYPE}}.self)\";\n        code_ += \"try contentEncoder.encode(_v)\";\n        Outdent();\n      }\n      code_ += \"default: break;\";\n      code_ += \"}\";\n      Outdent();\n      code_ += \"}\";\n      return;\n    }\n\n    code_ += \"switch {{FIELDVAR}}Type {\";\n    for (auto it = union_def.Vals().begin(); it != union_def.Vals().end();\n         ++it) {\n      const auto& ev = **it;\n      const auto type = GenType(ev.union_type);\n      code_.SetValue(\"KEY\", namer_.LegacySwiftVariant(ev));\n      code_.SetValue(\"VALUETYPE\", type);\n      if (ev.union_type.base_type == BASE_TYPE_NONE) {\n        continue;\n      }\n      code_ += \"case .{{KEY}}:\";\n      Indent();\n      code_ += \"let _v = {{FIELDVAR}}(type: {{VALUETYPE}}.self)\";\n      code_ += \"try container.encodeIfPresent(_v, forKey: .{{FIELDVAR}})\";\n      Outdent();\n    }\n    code_ += \"default: break;\";\n    code_ += \"}\";\n  }\n\n  void GenerateEncoderBody(const StructDef& struct_def) {\n    code_ += \"var container = encoder.container(keyedBy: CodingKeys.self)\";\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      const auto& field = **it;\n      if (field.deprecated) continue;\n      const auto type = field.value.type;\n\n      code_.SetValue(\"FIELDVAR\", namer_.Variable(field));\n      code_.SetValue(\"CONSTANT\", SwiftConstant(field));\n      bool should_indent = true;\n      if (IsEnum(type) && !field.IsOptional()) {\n        code_.SetValue(\"CONSTANT\", GenEnumDefaultValue(field));\n        code_ += \"if {{FIELDVAR}} != {{CONSTANT}} {\";\n      } else if (IsFloat(type.base_type) &&\n                 StringIsFlatbufferNan(field.value.constant)) {\n        code_ += \"if !{{FIELDVAR}}.isNaN {\";\n      } else if (IsScalar(type.base_type) && !IsEnum(type) &&\n                 !IsBool(type.base_type) && !field.IsOptional()) {\n        code_ += \"if {{FIELDVAR}} != {{CONSTANT}} {\";\n      } else if (IsBool(type.base_type) && !field.IsOptional()) {\n        code_.SetValue(\"CONSTANT\", SwiftConstant(field));\n        code_ += \"if {{FIELDVAR}} != {{CONSTANT}} {\";\n      } else {\n        should_indent = false;\n      }\n      if (should_indent) Indent();\n\n      if (IsUnion(type) && !IsEnum(type)) {\n        GenerateEncoderUnionBody(field);\n      } else if (IsArray(type)) {\n        code_ +=\n            \"var {{FIELDVAR}}Container = \"\n            \"container.nestedUnkeyedContainer(forKey: .{{FIELDVAR}})\";\n        code_ +=\n            \"for index in {{FIELDVAR}}.startIndex..<{{FIELDVAR}}.endIndex {\";\n        Indent();\n        code_ += \"try {{FIELDVAR}}Container.encode({{FIELDVAR}}[index])\";\n        Outdent();\n        code_ += \"}\";\n      } else {\n        code_ +=\n            \"try container.encodeIfPresent({{FIELDVAR}}, forKey: \"\n            \".{{FIELDVAR}})\";\n      }\n      if (should_indent) Outdent();\n\n      if ((IsScalar(type.base_type) && !field.IsOptional())) {\n        code_ += \"}\";\n      }\n    }\n  }\n\n  void GenerateJSONEncodingAPIs(const StructDef& struct_def) {\n    GenOSVersionChecks();\n    code_ += \"extension {{STRUCTNAME}}: Encodable {\";\n    Indent();\n    auto coding_keys = GenerateCodingKeys(struct_def);\n\n    if (coding_keys.empty() == false) {\n      code_ += \"enum CodingKeys: String, CodingKey {\";\n      Indent();\n      for (auto it = coding_keys.begin(); it != coding_keys.end(); ++it) {\n        const auto& field = *it;\n        code_ += field;\n      }\n      Outdent();\n      code_ += \"}\";\n\n      code_ += \"\";\n    }\n\n    code_ += \"{{ACCESS_TYPE}} func encode(to encoder: Encoder) throws {\";\n\n    if (coding_keys.empty() == false) {\n      Indent();\n      GenerateEncoderBody(struct_def);\n      Outdent();\n    }\n\n    code_ += \"}\";\n\n    Outdent();\n    code_ += \"}\";\n    code_ += \"\";\n  }\n\n  void GenerateVerifier(const StructDef& struct_def) {\n    code_ +=\n        \"{{ACCESS_TYPE}} static func verify<T>(_ verifier: inout Verifier, at \"\n        \"position: \"\n        \"Int, of type: T.Type) throws where T: Verifiable {\";\n    Indent();\n    code_ += \"var _v = try verifier.visitTable(at: position)\";\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      const auto& field = **it;\n      if (field.deprecated) continue;\n      const auto offset = NumToString(field.value.offset);\n\n      code_.SetValue(\"FIELDVAR\", namer_.Variable(field));\n      code_.SetValue(\"VALUETYPE\", GenerateVerifierType(field));\n      code_.SetValue(\"OFFSET\", namer_.Field(field));\n      code_.SetValue(\"ISREQUIRED\", field.IsRequired() ? \"true\" : \"false\");\n\n      if (IsUnion(field.value.type)) {\n        GenerateUnionTypeVerifier(field);\n        continue;\n      }\n\n      code_ +=\n          \"try _v.visit(field: {{TABLEOFFSET}}.{{OFFSET}}, fieldName: \"\n          \"\\\"{{FIELDVAR}}\\\", required: {{ISREQUIRED}}, type: \"\n          \"{{VALUETYPE}}.self)\";\n    }\n    code_ += \"_v.finish()\";\n    Outdent();\n    code_ += \"}\";\n  }\n\n  void GenerateUnionTypeVerifier(const FieldDef& field) {\n    const auto is_vector =\n        IsVector(field.value.type) || IsArray(field.value.type);\n    if (field.value.type.base_type == BASE_TYPE_UTYPE ||\n        (is_vector &&\n         field.value.type.VectorType().base_type == BASE_TYPE_UTYPE))\n      return;\n    EnumDef& union_def = *field.value.type.enum_def;\n    code_.SetValue(\"VALUETYPE\", namer_.NamespacedType(union_def));\n    code_.SetValue(\"FUNCTION_NAME\", is_vector ? \"visitUnionVector\" : \"visit\");\n    code_ +=\n        \"try _v.{{FUNCTION_NAME}}(unionKey: \"\n        \"{{TABLEOFFSET}}.{{OFFSET}}Type, \"\n        \"unionField: {{TABLEOFFSET}}.{{OFFSET}}, unionKeyName: \"\n        \"\\\"{{FIELDVAR}}Type\\\", fieldName: \\\"{{FIELDVAR}}\\\", required: \"\n        \"{{ISREQUIRED}}, completion: { (verifier, key: {{VALUETYPE}}, pos) in\";\n    Indent();\n    code_ += \"switch key {\";\n    for (auto it = union_def.Vals().begin(); it != union_def.Vals().end();\n         ++it) {\n      const auto& ev = **it;\n      const auto type = GenType(ev.union_type);\n      code_.SetValue(\"KEY\", namer_.LegacySwiftVariant(ev));\n      code_.SetValue(\"VALUETYPE\", type);\n      code_ += \"case .{{KEY}}:\";\n      Indent();\n      if (ev.union_type.base_type == BASE_TYPE_NONE) {\n        code_ += \"break // NOTE - SWIFT doesnt support none\";\n      } else if (ev.union_type.base_type == BASE_TYPE_STRING) {\n        code_ +=\n            \"try ForwardOffset<String>.verify(&verifier, at: pos, of: \"\n            \"String.self)\";\n      } else {\n        code_.SetValue(\"MAINTYPE\", ev.union_type.struct_def->fixed\n                                       ? type\n                                       : \"ForwardOffset<\" + type + \">\");\n        code_ +=\n            \"try {{MAINTYPE}}.verify(&verifier, at: pos, of: \"\n            \"{{VALUETYPE}}.self)\";\n      }\n      Outdent();\n    }\n    code_ += \"}\";\n    Outdent();\n    code_ += \"})\";\n  }\n\n  std::string GenerateVerifierType(const FieldDef& field) {\n    const auto type = field.value.type;\n    const auto is_vector = IsVector(type) || IsArray(type);\n\n    if (is_vector) {\n      const auto vector_type = field.value.type.VectorType();\n      return \"ForwardOffset<Vector<\" +\n             GenerateNestedVerifierTypes(vector_type) + \", \" +\n             GenType(vector_type) + \">>\";\n    }\n\n    return GenerateNestedVerifierTypes(field.value.type);\n  }\n\n  std::string GenerateNestedVerifierTypes(const Type& type) {\n    const auto string_type = GenType(type);\n\n    if (IsScalar(type.base_type)) {\n      return string_type;\n    }\n\n    if (IsString(type)) {\n      return \"ForwardOffset<\" + string_type + \">\";\n    }\n\n    if (type.struct_def && type.struct_def->fixed) {\n      return string_type;\n    }\n\n    return \"ForwardOffset<\" + string_type + \">\";\n  }\n\n  void GenByKeyFunctions(const FieldDef& key_field) {\n    code_.SetValue(\"TYPE\", GenType(key_field.value.type));\n    code_ +=\n        \"{{ACCESS_TYPE}} func {{FIELDVAR}}By(key: {{TYPE}}) -> {{VALUETYPE}}? \"\n        \"{ \\\\\";\n    code_ += GenOffset() +\n             \"return o == 0 ? nil : {{VALUETYPE}}.lookupByKey(vector: \"\n             \"{{ACCESS}}.vector(at: o), key: key, fbb: {{ACCESS}}.bb) }\";\n  }\n\n  void GenEnum(const EnumDef& enum_def) {\n    if (enum_def.generated) return;\n    const bool is_private_access =\n        parser_.opts.swift_implementation_only ||\n        enum_def.attributes.Lookup(\"private\") != nullptr;\n    code_.SetValue(\"ENUM_TYPE\",\n                   enum_def.is_union ? \"UnionEnum\" : \"Enum, Verifiable\");\n    code_.SetValue(\"ACCESS_TYPE\", is_private_access ? \"internal\" : \"public\");\n    code_.SetValue(\"ENUM_NAME\", namer_.NamespacedType(enum_def));\n    code_.SetValue(\"BASE_TYPE\", GenTypeBasic(enum_def.underlying_type, false));\n    GenComment(enum_def.doc_comment);\n    code_ +=\n        \"{{ACCESS_TYPE}} enum {{ENUM_NAME}}: \"\n        \"{{BASE_TYPE}}, FlatbuffersVectorInitializable, {{ENUM_TYPE}} {\";\n    Indent();\n    code_ += \"{{ACCESS_TYPE}} typealias T = {{BASE_TYPE}}\";\n    if (enum_def.is_union) {\n      code_ += \"\";\n      code_ += \"{{ACCESS_TYPE}} init?(value: T) {\";\n      Indent();\n      code_ += \"self.init(rawValue: value)\";\n      Outdent();\n      code_ += \"}\\n\";\n    }\n    code_ +=\n        \"{{ACCESS_TYPE}} static var byteSize: Int { return \"\n        \"MemoryLayout<{{BASE_TYPE}}>.size \"\n        \"}\";\n    code_ +=\n        \"{{ACCESS_TYPE}} var value: {{BASE_TYPE}} { return self.rawValue }\";\n    for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {\n      const auto& ev = **it;\n      code_.SetValue(\"KEY\", namer_.LegacySwiftVariant(ev));\n      code_.SetValue(\"VALUE\", enum_def.ToString(ev));\n      GenComment(ev.doc_comment);\n      code_ += \"case {{KEY}} = {{VALUE}}\";\n    }\n    code_ += \"\";\n    AddMinOrMaxEnumValue(namer_.LegacySwiftVariant(*enum_def.MaxValue()),\n                         \"max\");\n    AddMinOrMaxEnumValue(namer_.LegacySwiftVariant(*enum_def.MinValue()),\n                         \"min\");\n    Outdent();\n    code_ += \"}\\n\";\n    if (parser_.opts.gen_json_coders) EnumEncoder(enum_def);\n    code_ += \"\";\n    if (parser_.opts.generate_object_based_api && enum_def.is_union) {\n      code_ += \"{{ACCESS_TYPE}} struct {{ENUM_NAME}}Union {\";\n      Indent();\n      code_ += \"{{ACCESS_TYPE}} var type: {{ENUM_NAME}}\";\n      code_ += \"{{ACCESS_TYPE}} var value: NativeObject?\";\n      code_ +=\n          \"{{ACCESS_TYPE}} init(_ v: NativeObject?, type: {{ENUM_NAME}}) {\";\n      Indent();\n      code_ += \"self.type = type\";\n      code_ += \"self.value = v\";\n      Outdent();\n      code_ += \"}\";\n      code_ +=\n          \"{{ACCESS_TYPE}} func pack(builder: inout FlatBufferBuilder) -> \"\n          \"Offset {\";\n      Indent();\n      BuildUnionEnumSwitchCaseWritter(enum_def);\n      Outdent();\n      code_ += \"}\";\n      Outdent();\n      code_ += \"}\";\n    }\n  }\n\n  void EnumEncoder(const EnumDef& enum_def) {\n    code_ += \"extension {{ENUM_NAME}}: Encodable {\";\n    Indent();\n    code_ += \"{{ACCESS_TYPE}} func encode(to encoder: Encoder) throws {\";\n    Indent();\n    code_ += \"var container = encoder.singleValueContainer()\";\n    code_ += \"switch self {\";\n    for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {\n      const auto& ev = **it;\n      code_.SetValue(\"KEY\", namer_.LegacySwiftVariant(ev));\n      code_.SetValue(\"RAWKEY\", ev.name);\n      code_ += \"case .{{KEY}}: try container.encode(\\\"{{RAWKEY}}\\\")\";\n    }\n    code_ += \"}\";\n    Outdent();\n    code_ += \"}\";\n    Outdent();\n    code_ += \"}\";\n  }\n\n  // MARK: - Object API\n\n  void GenerateObjectAPIExtensionHeader(std::string type_name,\n                                        const bool is_fixed_struct) {\n    //    code_.SetValue(\"MUTATING\", is_fixed_struct ? \"\" : \" mutating\");\n    code_ += \"\";\n    code_ += \"{{ACCESS_TYPE}} func unpack() -> \" + type_name + \" {\";\n    Indent();\n    code_ += \"return \" + type_name + (is_fixed_struct ? \"(self)\" : \"(self)\");\n    Outdent();\n    code_ += \"}\";\n    code_ +=\n        \"{{ACCESS_TYPE}} static func pack(_ builder: inout FlatBufferBuilder, \"\n        \"obj: \"\n        \"inout \" +\n        type_name + \"?) -> Offset {\";\n    Indent();\n    code_ += \"guard var obj = obj else { return Offset() }\";\n    code_ += \"return pack(&builder, obj: &obj)\";\n    Outdent();\n    code_ += \"}\";\n    code_ += \"\";\n    code_ +=\n        \"{{ACCESS_TYPE}} static func pack(_ builder: inout FlatBufferBuilder, \"\n        \"obj: \"\n        \"inout \" +\n        type_name + \") -> Offset {\";\n    Indent();\n  }\n\n  void GenerateObjectAPIStructConstructor(const StructDef& struct_def) {\n    code_ += \"{{ACCESS_TYPE}} init(_ _t: borrowing {{STRUCTNAME}}\" + Mutable() +\n             \") {\";\n    Indent();\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      const auto& field = **it;\n      if (field.deprecated) continue;\n\n      const auto type = GenType(field.value.type);\n      code_.SetValue(\"FIELDVAR\", namer_.Variable(field));\n      if (IsArray(field.value.type)) {\n        code_.SetValue(\n            \"RAW_VALUE\",\n            IsStruct(field.value.type.VectorType())\n                ? \".unpack()\"\n                : (IsEnum(field.value.type.VectorType()) ? \".rawValue\" : \"\"));\n        code_ += \"let _v{{FIELDVAR}} = _t.{{FIELDVAR}}\";\n        code_ +=\n            \"_{{FIELDVAR}} = InlineArray { _v{{FIELDVAR}}[$0]{{RAW_VALUE}} }\";\n        continue;\n      } else if (IsStruct(field.value.type)) {\n        code_ += \"let _v{{FIELDVAR}} = _t.{{FIELDVAR}}\";\n        code_ += \"_{{FIELDVAR}} = _v{{FIELDVAR}}.unpack()\";\n        continue;\n      }\n      std::string is_enum = IsEnum(field.value.type) ? \".value\" : \"\";\n      code_ += \"_{{FIELDVAR}} = _t.{{FIELDVAR}}\" + is_enum;\n    }\n    Outdent();\n    code_ += \"}\\n\";\n  }\n\n  void GenObjectAPI(const StructDef& struct_def) {\n    GenOSVersionChecks();\n    code_ += \"{{ACCESS_TYPE}} class \" +\n             namer_.NamespacedObjectType(struct_def) + \": NativeObject {\\n\";\n    std::vector<std::string> buffer_constructor;\n    std::vector<std::string> base_constructor;\n    Indent();\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      const auto& field = **it;\n      if (field.deprecated) continue;\n      BuildObjectAPIConstructorBody(field, struct_def.fixed, buffer_constructor,\n                                    base_constructor);\n    }\n    code_ += \"\";\n    BuildObjectConstructor(\n        buffer_constructor,\n        \"_ _t: borrowing \" + namer_.NamespacedType(struct_def));\n    BuildObjectConstructor(base_constructor);\n    if (!struct_def.fixed)\n      code_ +=\n          \"{{ACCESS_TYPE}} func serialize() -> ByteBuffer { return \"\n          \"serialize(type: \"\n          \"{{STRUCTNAME}}.self) }\\n\";\n    Outdent();\n    code_ += \"}\";\n  }\n\n  void GenerateObjectAPITableExtension(const StructDef& struct_def) {\n    GenerateObjectAPIExtensionHeader(namer_.NamespacedObjectType(struct_def),\n                                     struct_def.fixed);\n    std::vector<std::string> unpack_body;\n    std::string builder = \", &builder)\";\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      const auto& field = **it;\n      if (field.deprecated) continue;\n      const auto field_var = namer_.Variable(field);\n      const auto field_field = namer_.Field(field);\n      const auto field_method = namer_.Method(field);\n      const auto type = GenType(field.value.type);\n      std::string check_if_vector =\n          (IsVector(field.value.type) || IsArray(field.value.type))\n              ? \"VectorOf(\"\n              : \"(\";\n      std::string body = \"add\" + check_if_vector + field_method + \": \";\n      switch (field.value.type.base_type) {\n        case BASE_TYPE_ARRAY:\n          FLATBUFFERS_FALLTHROUGH();\n        case BASE_TYPE_VECTOR: {\n          GenerateVectorObjectAPITableExtension(field);\n          unpack_body.push_back(\"{{STRUCTNAME}}.\" + body + \"__\" + field_var +\n                                builder);\n          break;\n        }\n        case BASE_TYPE_UNION: {\n          code_ += \"let __\" + field_var + \" = obj.\" + field_var +\n                   \"?.pack(builder: &builder) ?? Offset()\";\n          unpack_body.push_back(\"if let o = obj.\" + field_var + \"?.type {\");\n          unpack_body.push_back(\"  {{STRUCTNAME}}.add(\" + field_var +\n                                \"Type: o\" + builder);\n          unpack_body.push_back(\"  {{STRUCTNAME}}.\" + body + \"__\" + field_var +\n                                builder);\n          unpack_body.push_back(\"}\\n\");\n          break;\n        }\n        case BASE_TYPE_STRUCT: {\n          if (field.value.type.struct_def &&\n              field.value.type.struct_def->fixed) {\n            // This is a Struct (IsStruct), not a table. We create\n            // a native swift object in this case.\n            std::string code;\n            GenerateStructArgs(*field.value.type.struct_def, &code, \"\", \"\",\n                               \"$0\", true);\n            code = code.substr(0, code.size() - 2);\n            unpack_body.push_back(\"{{STRUCTNAME}}.\" + body + \"obj.\" +\n                                  field_field + builder);\n          } else {\n            code_ += \"let __\" + field_var + \" = \" + type +\n                     \".pack(&builder, obj: &obj.\" + field_field + \")\";\n            unpack_body.push_back(\"{{STRUCTNAME}}.\" + body + \"__\" + field_var +\n                                  builder);\n          }\n          break;\n        }\n        case BASE_TYPE_STRING: {\n          unpack_body.push_back(\"{{STRUCTNAME}}.\" + body + \"__\" + field_var +\n                                builder);\n          if (field.IsRequired()) {\n            code_ += \"let __\" + field_var + \" = builder.create(string: obj.\" +\n                     field_field + \")\";\n          } else {\n            BuildingOptionalObjects(field_field, \"builder.create(string: s)\");\n          }\n          break;\n        }\n        case BASE_TYPE_UTYPE:\n          break;\n        default:\n          unpack_body.push_back(\"{{STRUCTNAME}}.\" + body + \"obj.\" +\n                                field_field + builder);\n      }\n    }\n    code_ += \"let __root = {{STRUCTNAME}}.start{{SHORT_STRUCTNAME}}(&builder)\";\n    for (auto it = unpack_body.begin(); it < unpack_body.end(); it++)\n      code_ += *it;\n    code_ +=\n        \"return {{STRUCTNAME}}.end{{SHORT_STRUCTNAME}}(&builder, start: \"\n        \"__root)\";\n    Outdent();\n    code_ += \"}\";\n  }\n\n  void GenerateVectorObjectAPITableExtension(const FieldDef& field_def) {\n    const Type& field_type = field_def.value.type;\n    const auto type = GenType(field_type);\n    const auto var = namer_.Variable(field_def);\n    const auto field = namer_.Field(field_def);\n\n    const auto vectortype = field_type.VectorType();\n    switch (vectortype.base_type) {\n      case BASE_TYPE_UNION: {\n        code_ += \"var __\" + var + \"__: [Offset] = []\";\n        code_ += \"for i in obj.\" + var + \" {\";\n        Indent();\n        code_ += \"guard let off = i?.pack(builder: &builder) else { continue }\";\n        code_ += \"__\" + var + \"__.append(off)\";\n        Outdent();\n        code_ += \"}\";\n        code_ += \"let __\" + var + \" = builder.createVector(ofOffsets: __\" +\n                 var + \"__)\";\n        code_ += \"let __\" + var + \"Type = builder.createVector(obj.\" + field +\n                 \".compactMap { $0?.type })\";\n        break;\n      }\n      case BASE_TYPE_UTYPE:\n        break;\n      case BASE_TYPE_STRUCT: {\n        if (field_type.struct_def && !field_type.struct_def->fixed) {\n          code_ += \"var __\" + var + \"__: [Offset] = []\";\n          code_ += \"for var i in obj.\" + var + \" {\";\n          Indent();\n          code_ +=\n              \"__\" + var + \"__.append(\" + type + \".pack(&builder, obj: &i))\";\n          Outdent();\n          code_ += \"}\";\n          code_ += \"let __\" + var + \" = builder.createVector(ofOffsets: __\" +\n                   var + \"__)\";\n        } else {\n          code_ += \"{{STRUCTNAME}}.\" + namer_.Method(\"start_vector_of\", var) +\n                   \"(obj.\" + field + \".count, in: &builder)\";\n          std::string code;\n          GenerateStructArgs(*field_type.struct_def, &code, \"\", \"\", \"_o\", true);\n          code = code.substr(0, code.size() - 2);\n          code_ += \"for val in obj.\" + field + \" {\";\n          Indent();\n          code_ += \"builder.create(struct: val)\";\n          Outdent();\n          code_ += \"}\";\n          code_ += \"let __\" + var + \" = builder.endVector(len: obj.\" + field +\n                   \".count)\";\n        }\n        break;\n      }\n      case BASE_TYPE_STRING: {\n        code_ += \"let __\" + var + \" = builder.createVector(ofStrings: obj.\" +\n                 var + \".compactMap({ $0 }) )\";\n        break;\n      }\n      default: {\n        code_ += \"let __\" + var + \" = builder.createVector(obj.\" + field + \")\";\n        break;\n      }\n    }\n  }\n\n  void BuildingOptionalObjects(const std::string& var,\n                               const std::string& body_front) {\n    code_ += \"let __\" + var + \": Offset\";\n    code_ += \"if let s = obj.\" + var + \" {\";\n    Indent();\n    code_ += \"__\" + var + \" = \" + body_front;\n    Outdent();\n    code_ += \"} else {\";\n    Indent();\n    code_ += \"__\" + var + \" = Offset()\";\n    Outdent();\n    code_ += \"}\";\n    code_ += \"\";\n  }\n\n  void BuildObjectConstructor(const std::vector<std::string>& body,\n                              const std::string& header = \"\") {\n    code_.SetValue(\"HEADER\", header);\n    code_ += \"{{ACCESS_TYPE}} init({{HEADER}}) {\";\n    Indent();\n    for (auto it = body.begin(); it < body.end(); ++it) code_ += *it;\n    Outdent();\n    code_ += \"}\\n\";\n  }\n\n  void BuildObjectAPIConstructorBody(\n      const FieldDef& field, bool is_fixed,\n      std::vector<std::string>& buffer_constructor,\n      std::vector<std::string>& base_constructor) {\n    const auto field_field = namer_.Field(field);\n    const auto field_var = namer_.Variable(field);\n    const auto type = GenType(field.value.type);\n    code_.SetValue(\"FIELDVAR\", field_field);\n    code_.SetValue(\"VALUETYPE\", type);\n    std::string is_required = field.IsRequired() ? \"\" : \"?\";\n\n    switch (field.value.type.base_type) {\n      case BASE_TYPE_STRUCT: {\n        const auto objtype = GenType(field.value.type, true);\n        code_.SetValue(\"VALUETYPE\", objtype);\n        const auto optional =\n            (field.value.type.struct_def && field.value.type.struct_def->fixed);\n        std::string question_mark =\n            (field.IsRequired() || (optional && is_fixed) ? \"\" : \"?\");\n\n        code_ +=\n            \"{{ACCESS_TYPE}} var {{FIELDVAR}}: {{VALUETYPE}}\" + question_mark;\n        base_constructor.push_back(\"\" + field_var + \" = \" + objtype + \"()\");\n\n        if (field.value.type.struct_def->fixed) {\n          buffer_constructor.push_back(\"\" + field_var + \" = _t.\" + field_field);\n        } else {\n          buffer_constructor.push_back(\n              \"\" + field_var + \" = _t.\" + field_var +\n              (field.IsRequired() ? \"!\" : question_mark) + \".unpack()\");\n        }\n        break;\n      }\n      case BASE_TYPE_ARRAY:\n        FLATBUFFERS_FALLTHROUGH();\n      case BASE_TYPE_VECTOR: {\n        BuildObjectAPIConstructorBodyVectors(field, buffer_constructor,\n                                             base_constructor, \"    \");\n        break;\n      }\n      case BASE_TYPE_STRING: {\n        code_ += \"{{ACCESS_TYPE}} var {{FIELDVAR}}: String\" + is_required;\n        buffer_constructor.push_back(field_var + \" = _t.\" + field_field);\n\n        if (field.IsRequired()) {\n          std::string default_value;\n          if (field.IsDefault()) {\n            const auto sc = SwiftConstant(field);\n            flatbuffers::EscapeString(sc.c_str(), sc.length(), &default_value,\n                                      true, false);\n          } else {\n            default_value = \"\\\"\\\"\";\n          }\n          base_constructor.push_back(field_var + \" = \" + default_value);\n          break;\n        }\n        if (field.IsDefault() && !field.IsRequired()) {\n          const auto sc = SwiftConstant(field);\n          std::string value;\n          flatbuffers::EscapeString(sc.c_str(), sc.length(), &value,\n                                    true, false);\n          base_constructor.push_back(field_var + \" = \" + value);\n        }\n        break;\n      }\n      case BASE_TYPE_UTYPE:\n        break;\n      case BASE_TYPE_UNION: {\n        BuildUnionEnumSwitchCase(*field.value.type.enum_def, field_var,\n                                 buffer_constructor);\n        break;\n      }\n      default: {\n        buffer_constructor.push_back(field_var + \" = _t.\" + field_field);\n        std::string nullable = field.IsOptional() ? \"?\" : \"\";\n        if (IsScalar(field.value.type.base_type) &&\n            !IsBool(field.value.type.base_type) && !IsEnum(field.value.type)) {\n          code_ += \"{{ACCESS_TYPE}} var {{FIELDVAR}}: {{VALUETYPE}}\" + nullable;\n          if (!field.IsOptional())\n            base_constructor.push_back(field_var + \" = \" +\n                                       SwiftConstant(field));\n          break;\n        }\n\n        if (IsEnum(field.value.type)) {\n          const auto default_value = IsEnum(field.value.type)\n                                         ? GenEnumDefaultValue(field)\n                                         : SwiftConstant(field);\n          code_ += \"{{ACCESS_TYPE}} var {{FIELDVAR}}: {{VALUETYPE}}\";\n          base_constructor.push_back(field_var + \" = \" + default_value);\n          break;\n        }\n\n        if (IsBool(field.value.type.base_type)) {\n          code_ += \"{{ACCESS_TYPE}} var {{FIELDVAR}}: Bool\" + nullable;\n          if (!field.IsOptional())\n            base_constructor.push_back(field_var + \" = \" +\n                                       SwiftConstant(field));\n        }\n      }\n    }\n  }\n\n  void BuildObjectAPIConstructorBodyVectors(\n      const FieldDef& field, std::vector<std::string>& buffer_constructor,\n      std::vector<std::string>& base_constructor,\n      const std::string& indentation) {\n    const auto vectortype = field.value.type.VectorType();\n    const auto field_var = namer_.Field(field);\n    const auto field_field = namer_.Field(field);\n\n    if (vectortype.base_type != BASE_TYPE_UTYPE) {\n      buffer_constructor.push_back(field_var + \" = []\");\n      base_constructor.push_back(field_var + \" = []\");\n    }\n\n    switch (vectortype.base_type) {\n      case BASE_TYPE_STRUCT: {\n        code_.SetValue(\"VALUETYPE\", GenType(vectortype, true));\n        code_.SetValue(\"OPTIONAL\", !vectortype.struct_def->fixed ? \"?\" : \"\");\n        code_ +=\n            \"{{ACCESS_TYPE}} var {{FIELDVAR}}: [{{VALUETYPE}}{{OPTIONAL}}]\";\n        if (!vectortype.struct_def->fixed) {\n          buffer_constructor.push_back(\"for val in _t.\" + field_field + \"{\");\n          buffer_constructor.push_back(indentation + field_var +\n                                       \".append(val.unpack())\");\n          buffer_constructor.push_back(\"}\");\n        } else {\n          buffer_constructor.push_back(field_var + \".append(contentsOf: _t.\" +\n                                       field_field + \")\");\n        }\n        break;\n      }\n      case BASE_TYPE_ARRAY:\n        FLATBUFFERS_FALLTHROUGH();\n      case BASE_TYPE_VECTOR: {\n        break;\n      }\n      case BASE_TYPE_UNION: {\n        BuildUnionEnumSwitchCase(*field.value.type.enum_def, field_var,\n                                 buffer_constructor, indentation, true);\n        break;\n      }\n      case BASE_TYPE_UTYPE:\n        break;\n      default: {\n        code_.SetValue(\n            \"VALUETYPE\",\n            (IsString(vectortype) ? \"String?\" : GenType(vectortype)));\n        code_ += \"{{ACCESS_TYPE}} var {{FIELDVAR}}: [{{VALUETYPE}}]\";\n\n        buffer_constructor.push_back(field_var + \".append(contentsOf: _t.\" +\n                                     field_field + \")\");\n        break;\n      }\n    }\n  }\n\n  void BuildUnionEnumSwitchCaseWritter(const EnumDef& ed) {\n    code_ += \"switch type {\";\n    for (auto it = ed.Vals().begin(); it < ed.Vals().end(); ++it) {\n      const auto ev = **it;\n      const auto variant = namer_.LegacySwiftVariant(ev);\n      const auto type = GenType(ev.union_type);\n      const auto is_struct = IsStruct(ev.union_type) ? type + Mutable() : type;\n      if (ev.union_type.base_type == BASE_TYPE_NONE) {\n        continue;\n      }\n      code_ += \"case .\" + variant + \":\";\n      Indent();\n      code_ += \"var __obj = value as? \" + GenType(ev.union_type, true);\n      code_ += \"return \" + is_struct + \".pack(&builder, obj: &__obj)\";\n      Outdent();\n    }\n    code_ += \"default: return Offset()\";\n    code_ += \"}\";\n  }\n\n  void BuildUnionEnumSwitchCase(const EnumDef& ed, const std::string& field,\n                                std::vector<std::string>& buffer_constructor,\n                                const std::string& indentation = \"\",\n                                const bool is_vector = false) {\n    const auto ns_type = namer_.NamespacedType(ed);\n    code_.SetValue(\"VALUETYPE\", ns_type);\n    code_ += \"{{ACCESS_TYPE}} var {{FIELDVAR}}: \\\\\";\n    code_ += is_vector ? \"[{{VALUETYPE}}Union?]\" : \"{{VALUETYPE}}Union?\";\n\n    const auto vector_reader = is_vector ? \"[index]\" : \"\";\n    if (is_vector) {\n      buffer_constructor.push_back(\"let _\" + field + \"Type = _t.\" + field +\n                                   \"Type\");\n      buffer_constructor.push_back(\"for index in _\" + field +\n                                   \"Type.startIndex..<_\" + field +\n                                   \"Type.endIndex {\");\n    }\n\n    buffer_constructor.push_back(indentation + \"switch _t.\" + field + \"Type\" +\n                                 vector_reader + \" {\");\n\n    for (auto it = ed.Vals().begin(); it < ed.Vals().end(); ++it) {\n      const auto ev = **it;\n      const auto variant = namer_.LegacySwiftVariant(ev);\n      if (ev.union_type.base_type == BASE_TYPE_NONE) {\n        continue;\n      }\n      const auto type = IsStruct(ev.union_type)\n                            ? GenType(ev.union_type) + Mutable()\n                            : GenType(ev.union_type);\n\n      buffer_constructor.push_back(indentation + \"case .\" + variant + \":\");\n      const auto constructor =\n          ns_type + \"Union(_v?.unpack(), type: .\" + variant + \")\";\n      if (is_vector) {\n        buffer_constructor.push_back(indentation + \"  let _v = _t.\" + field +\n                                     \"(at: Int32(index), type: \" + type +\n                                     \".self)\");\n        buffer_constructor.push_back(indentation + \"  \" + field + \".append(\" +\n                                     constructor + \")\");\n      } else {\n        buffer_constructor.push_back(indentation + \"  let _v = _t.\" + field +\n                                     \"(\" + \"type: \" + type + \".self)\");\n        buffer_constructor.push_back(indentation + \"  \" + field + \" = \" +\n                                     constructor);\n      }\n    }\n    buffer_constructor.push_back(indentation + \"default: break\");\n    buffer_constructor.push_back(indentation + \"}\");\n    if (is_vector) {\n      buffer_constructor.push_back(\"}\");\n    }\n  }\n\n  void AddMinOrMaxEnumValue(const std::string& str, const std::string& type) {\n    const auto current_value = str;\n    code_.SetValue(type, current_value);\n    code_ += \"{{ACCESS_TYPE}} static var \" + type +\n             \": {{ENUM_NAME}} { return .{{\" + type + \"}} }\";\n  }\n\n  void GenLookup(const FieldDef& key_field, const std::string& struct_type) {\n    code_.SetValue(\"STRUCTTYPE\", struct_type);\n    code_.SetValue(\"OFFSET\", NumToString(key_field.value.offset));\n    std::string offset_reader =\n        \"Table.offset(Int32(fbb.capacity) - tableOffset, vOffset: {{OFFSET}}, \"\n        \"fbb: fbb)\";\n\n    code_.SetValue(\"TYPE\", GenType(key_field.value.type));\n    code_ +=\n        \"fileprivate static func lookupByKey(vector: Int32, key: {{TYPE}}, \"\n        \"fbb: \"\n        \"ByteBuffer) -> {{STRUCTTYPE}}? {\";\n    Indent();\n    if (IsString(key_field.value.type))\n      code_ += \"let key = key.utf8.map { $0 }\";\n    code_ += \"var span = fbb.read(def: Int32.self, position: Int(vector - 4))\";\n    code_ += \"var start: Int32 = 0\";\n    code_ += \"while span != 0 {\";\n    Indent();\n    code_ += \"var middle = span / 2\";\n    code_ +=\n        \"let tableOffset = Table.indirect(vector + 4 * (start + middle), fbb)\";\n    if (IsString(key_field.value.type)) {\n      code_ += \"let comp = Table.compare(\" + offset_reader + \", key, fbb: fbb)\";\n    } else {\n      code_ += \"let comp = fbb.read(def: {{TYPE}}.self, position: Int(\" +\n               offset_reader + \"))\";\n    }\n\n    code_ += \"if comp > 0 {\";\n    Indent();\n    code_ += \"span = middle\";\n    Outdent();\n    code_ += \"} else if comp < 0 {\";\n    Indent();\n    code_ += \"middle += 1\";\n    code_ += \"start += middle\";\n    code_ += \"span -= middle\";\n    Outdent();\n    code_ += \"} else {\";\n    Indent();\n    code_ += \"return {{STRUCTTYPE}}(fbb, o: tableOffset)\";\n    Outdent();\n    code_ += \"}\";\n    Outdent();\n    code_ += \"}\";\n    code_ += \"return nil\";\n    Outdent();\n    code_ += \"}\";\n  }\n\n  inline void GenPadding(const FieldDef& field, int* id) {\n    if (field.padding) {\n      for (int i = 0; i < 4; i++) {\n        if (static_cast<int>(field.padding) & (1 << i)) {\n          const auto bits = (1 << i) * 8;\n          code_ += \"private var padding\" + NumToString((*id)++) + \"__: UInt\" +\n                   NumToString(bits) + \" = 0\";\n        }\n      }\n      FLATBUFFERS_ASSERT(!(field.padding & ~0xF));\n    }\n  }\n\n  void GenComment(const std::vector<std::string>& dc) {\n    if (dc.begin() == dc.end()) {\n      // Don't output empty comment blocks with 0 lines of comment content.\n      return;\n    }\n    for (auto it = dc.begin(); it != dc.end(); ++it) {\n      code_ += \"/// \" + *it;\n    }\n  }\n\n  void GenOSVersionChecks() {\n    if (parser_.advanced_features_ == reflection::AdvancedArrayFeatures) {\n      code_ += \"@available(macOS 26.0, iOS 26.0, watchOS 26.0, tvOS 26.0, *)\";\n    }\n  }\n\n  std::string GenOffset() {\n    return \"let o = {{ACCESS}}.offset({{TABLEOFFSET}}.{{OFFSET}}); \";\n  }\n\n  std::string GenReaderMainBody(const std::string& optional = \"\") {\n    return \"{{ACCESS_TYPE}} var {{FIELDVAR}}: {{VALUETYPE}}\" + optional + \" { \";\n  }\n\n  std::string GenReader(const std::string& type,\n                        const std::string& at = \"{{OFFSET}}\") {\n    return \"{{ACCESS}}.readBuffer(of: {{\" + type + \"}}.self, at: \" + at + \")\";\n  }\n\n  std::string GenConstructor(const std::string& offset) {\n    return \"{{VALUETYPE}}({{ACCESS}}.bb, o: \" + offset + \") }\";\n  }\n\n  std::string GenMutate(const std::string& offset,\n                        const std::string& get_offset, bool isRaw = false) {\n    return \"@discardableResult {{ACCESS_TYPE}} func mutate({{FIELDVAR}}: \"\n           \"{{VALUETYPE}}) -> Bool {\" +\n           get_offset + \" return {{ACCESS}}.mutate({{FIELDVAR}}\" +\n           (isRaw ? \".rawValue\" : \"\") + \", index: \" + offset + \") }\";\n  }\n\n  std::string GenMutateArray() {\n    return \"{{ACCESS_TYPE}} func mutate({{FIELDVAR}}: {{VALUETYPE}}, at \"\n           \"index: Int32) -> Bool { \" +\n           GenOffset() +\n           \"return {{ACCESS}}.directMutate({{FIELDVAR}}, index: \"\n           \"{{ACCESS}}.vector(at: o) + index * {{SIZE}}) }\";\n  }\n\n  std::string GenEnumDefaultValue(const FieldDef& field) {\n    const auto& value = field.value;\n    FLATBUFFERS_ASSERT(value.type.enum_def);\n    const auto& enum_def = *value.type.enum_def;\n    // Vector of enum defaults are always \"[]\" which never works.\n    const std::string constant = IsVector(value.type) ? \"0\" : value.constant;\n    const auto enum_val = enum_def.FindByValue(constant);\n    if (enum_val) {\n      return \".\" + namer_.LegacySwiftVariant(*enum_val);\n    } else {\n      const auto& ev = **enum_def.Vals().begin();\n      return \".\" + namer_.LegacySwiftVariant(ev);\n    }\n  }\n\n  std::string SwiftConstant(const FieldDef& field) {\n    const auto default_value =\n        StringIsFlatbufferNan(field.value.constant)                ? \".nan\"\n        : StringIsFlatbufferPositiveInfinity(field.value.constant) ? \".infinity\"\n        : StringIsFlatbufferNegativeInfinity(field.value.constant)\n            ? \"-.infinity\"\n        : IsBool(field.value.type.base_type)\n            ? (\"0\" == field.value.constant ? \"false\" : \"true\")\n            : field.value.constant;\n    return default_value;\n  }\n\n  std::string GenEnumConstructor(const std::string& at) {\n    return \"{{VALUETYPE}}(rawValue: \" + GenReader(\"BASEVALUE\", at) + \") \";\n  }\n\n  std::string ValidateFunc() {\n    return \"static func validateVersion() { FlatBuffersVersion_25_12_19() }\";\n  }\n\n  std::string GenType(const Type& type,\n                      const bool should_consider_suffix = false) const {\n    return IsScalar(type.base_type) ? GenTypeBasic(type)\n           : IsArray(type)          ? GenType(type.VectorType())\n                           : GenTypePointer(type, should_consider_suffix);\n  }\n\n  std::string GenTypePointer(const Type& type,\n                             const bool should_consider_suffix) const {\n    switch (type.base_type) {\n      case BASE_TYPE_STRING:\n        return \"String\";\n      case BASE_TYPE_VECTOR:\n        return GenType(type.VectorType());\n      case BASE_TYPE_STRUCT: {\n        const auto& sd = *type.struct_def;\n        if (should_consider_suffix && !sd.fixed) {\n          return namer_.NamespacedObjectType(sd);\n        }\n        return namer_.NamespacedType(sd);\n      }\n      case BASE_TYPE_UNION:\n      default:\n        return \"FlatbuffersInitializable\";\n    }\n  }\n\n  std::string GenTypeBasic(const Type& type) const {\n    return GenTypeBasic(type, true);\n  }\n\n  void Indent() { code_.IncrementIdentLevel(); }\n\n  void Outdent() { code_.DecrementIdentLevel(); }\n\n  std::string GenTypeBasic(const Type& type, bool can_override) const {\n    // clang-format off\n    static const char * const swift_type[] = {\n      #define FLATBUFFERS_TD(ENUM, IDLTYPE, \\\n              CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, RTYPE, KTYPE, STYPE, ...) \\\n        #STYPE,\n        FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)\n      #undef FLATBUFFERS_TD\n    };\n    // clang-format on\n    if (can_override) {\n      if (type.enum_def) return namer_.NamespacedType(*type.enum_def);\n      if (type.base_type == BASE_TYPE_BOOL) return \"Bool\";\n    }\n    return swift_type[static_cast<int>(type.base_type)];\n  }\n\n  std::string Mutable() const { return \"_Mutable\"; }\n\n  IdlNamer namer_;\n};\n}  // namespace swift\n\nstatic bool GenerateSwift(const Parser& parser, const std::string& path,\n                          const std::string& file_name) {\n  swift::SwiftGenerator generator(parser, path, file_name);\n  return generator.generate();\n}\n\nnamespace {\n\nclass SwiftCodeGenerator : public CodeGenerator {\n public:\n  Status GenerateCode(const Parser& parser, const std::string& path,\n                      const std::string& filename) override {\n    if (!GenerateSwift(parser, path, filename)) {\n      return Status::ERROR;\n    }\n    return Status::OK;\n  }\n\n  Status GenerateCode(const uint8_t*, int64_t, const CodeGenOptions&) override {\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateGrpcCode(const Parser& parser, const std::string& path,\n                          const std::string& filename) override {\n    if (!GenerateSwiftGRPC(parser, path, filename)) {\n      return Status::ERROR;\n    }\n    return Status::OK;\n  }\n\n  Status GenerateMakeRule(const Parser& parser, const std::string& path,\n                          const std::string& filename,\n                          std::string& output) override {\n    (void)parser;\n    (void)path;\n    (void)filename;\n    (void)output;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateRootFile(const Parser& parser,\n                          const std::string& path) override {\n    (void)parser;\n    (void)path;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  bool IsSchemaOnly() const override { return true; }\n\n  bool SupportsBfbsGeneration() const override { return false; }\n\n  bool SupportsRootFileGeneration() const override { return false; }\n\n  IDLOptions::Language Language() const override { return IDLOptions::kSwift; }\n\n  std::string LanguageName() const override { return \"Swift\"; }\n};\n}  // namespace\n\nstd::unique_ptr<CodeGenerator> NewSwiftCodeGenerator() {\n  return std::unique_ptr<SwiftCodeGenerator>(new SwiftCodeGenerator());\n}\n\n}  // namespace flatbuffers\n"
  },
  {
    "path": "src/idl_gen_swift.h",
    "content": "/*\n * Copyright 2023 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_IDL_GEN_SWIFT_H_\n#define FLATBUFFERS_IDL_GEN_SWIFT_H_\n\n#include \"flatbuffers/code_generator.h\"\n\nnamespace flatbuffers {\n\n// Constructs a new Cpp code generator.\nstd::unique_ptr<CodeGenerator> NewSwiftCodeGenerator();\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_IDL_GEN_SWIFT_H_\n"
  },
  {
    "path": "src/idl_gen_text.cpp",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// independent from idl_parser, since this code is not needed for most clients\n#include \"idl_gen_text.h\"\n\n#include <algorithm>\n\n#include \"flatbuffers/base.h\"\n#include \"flatbuffers/code_generator.h\"\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/flexbuffers.h\"\n#include \"flatbuffers/idl.h\"\n#include \"flatbuffers/util.h\"\n\nnamespace flatbuffers {\n\nstruct PrintScalarTag {};\nstruct PrintPointerTag {};\ntemplate <typename T>\nstruct PrintTag {\n  typedef PrintScalarTag type;\n};\ntemplate <>\nstruct PrintTag<const void*> {\n  typedef PrintPointerTag type;\n};\n\nstruct JsonPrinter {\n  // If indentation is less than 0, that indicates we don't want any newlines\n  // either.\n  void AddNewLine() {\n    if (opts.indent_step >= 0) text += '\\n';\n  }\n\n  void AddIndent(int ident) { text.append(ident, ' '); }\n\n  int Indent() const { return std::max(opts.indent_step, 0); }\n\n  // Output an identifier with or without quotes depending on strictness.\n  void OutputIdentifier(const std::string& name) {\n    if (opts.strict_json) text += '\\\"';\n    text += name;\n    if (opts.strict_json) text += '\\\"';\n  }\n\n  // Print (and its template specialization below for pointers) generate text\n  // for a single FlatBuffer value into JSON format.\n  // The general case for scalars:\n  template <typename T>\n  void PrintScalar(T val, const Type& type, int /*indent*/) {\n    if (IsBool(type.base_type)) {\n      text += val != 0 ? \"true\" : \"false\";\n      return;  // done\n    }\n\n    if (opts.output_enum_identifiers && type.enum_def) {\n      const auto& enum_def = *type.enum_def;\n      if (auto ev = enum_def.ReverseLookup(static_cast<int64_t>(val))) {\n        text += '\\\"';\n        text += ev->name;\n        text += '\\\"';\n        return;  // done\n      } else if (val && enum_def.attributes.Lookup(\"bit_flags\")) {\n        const auto entry_len = text.length();\n        const auto u64 = static_cast<uint64_t>(val);\n        uint64_t mask = 0;\n        text += '\\\"';\n        for (auto it = enum_def.Vals().begin(), e = enum_def.Vals().end();\n             it != e; ++it) {\n          auto f = (*it)->GetAsUInt64();\n          if (f & u64) {\n            mask |= f;\n            text += (*it)->name;\n            text += ' ';\n          }\n        }\n        // Don't slice if (u64 != mask)\n        if (mask && (u64 == mask)) {\n          text[text.length() - 1] = '\\\"';\n          return;  // done\n        }\n        text.resize(entry_len);  // restore\n      }\n      // print as numeric value\n    }\n\n    text += NumToString(val);\n    return;\n  }\n\n  void AddComma() {\n    if (!opts.protobuf_ascii_alike) text += ',';\n  }\n\n  // Print a vector or an array of JSON values, comma seperated, wrapped in\n  // \"[]\".\n  template <typename Container, typename SizeT = typename Container::size_type>\n  const char* PrintContainer(PrintScalarTag, const Container& c, SizeT size,\n                             const Type& type, int indent, const uint8_t*) {\n    const auto elem_indent = indent + Indent();\n    text += '[';\n    AddNewLine();\n    for (SizeT i = 0; i < size; i++) {\n      if (i) {\n        AddComma();\n        AddNewLine();\n      }\n      AddIndent(elem_indent);\n      PrintScalar(c[i], type, elem_indent);\n    }\n    AddNewLine();\n    AddIndent(indent);\n    text += ']';\n    return nullptr;\n  }\n\n  // Print a vector or an array of JSON values, comma seperated, wrapped in\n  // \"[]\".\n  template <typename Container, typename SizeT = typename Container::size_type>\n  const char* PrintContainer(PrintPointerTag, const Container& c, SizeT size,\n                             const Type& type, int indent,\n                             const uint8_t* prev_val) {\n    const auto is_struct = IsStruct(type);\n    const auto elem_indent = indent + Indent();\n    text += '[';\n    AddNewLine();\n    for (SizeT i = 0; i < size; i++) {\n      if (i) {\n        AddComma();\n        AddNewLine();\n      }\n      AddIndent(elem_indent);\n      auto ptr = is_struct ? reinterpret_cast<const void*>(\n                                 c.Data() + type.struct_def->bytesize * i)\n                           : c[i];\n      auto err = PrintOffset(ptr, type, elem_indent, prev_val,\n                             static_cast<soffset_t>(i));\n      if (err) return err;\n    }\n    AddNewLine();\n    AddIndent(indent);\n    text += ']';\n    return nullptr;\n  }\n\n  template <typename T, typename SizeT = uoffset_t>\n  const char* PrintVector(const void* val, const Type& type, int indent,\n                          const uint8_t* prev_val) {\n    typedef Vector<T, SizeT> Container;\n    typedef typename PrintTag<typename Container::return_type>::type tag;\n    auto& vec = *reinterpret_cast<const Container*>(val);\n    return PrintContainer<Container>(tag(), vec, vec.size(), type, indent,\n                                     prev_val);\n  }\n\n  // Print an array a sequence of JSON values, comma separated, wrapped in \"[]\".\n  template <typename T>\n  const char* PrintArray(const void* val, uint16_t size, const Type& type,\n\n                         int indent) {\n    typedef Array<T, 0xFFFF> Container;\n    typedef typename PrintTag<typename Container::return_type>::type tag;\n    auto& arr = *reinterpret_cast<const Container*>(val);\n    return PrintContainer<Container>(tag(), arr, size, type, indent, nullptr);\n  }\n\n  const char* PrintOffset(const void* val, const Type& type, int indent,\n                          const uint8_t* prev_val, soffset_t vector_index) {\n    switch (type.base_type) {\n      case BASE_TYPE_UNION: {\n        // If this assert hits, you have an corrupt buffer, a union type field\n        // was not present or was out of range.\n        FLATBUFFERS_ASSERT(prev_val);\n        auto union_type_byte = *prev_val;  // Always a uint8_t.\n        if (vector_index >= 0) {\n          auto type_vec = reinterpret_cast<const Vector<uint8_t>*>(\n              prev_val + ReadScalar<uoffset_t>(prev_val));\n          union_type_byte = type_vec->Get(static_cast<uoffset_t>(vector_index));\n        }\n        auto enum_val = type.enum_def->ReverseLookup(union_type_byte, true);\n        if (enum_val) {\n          return PrintOffset(val, enum_val->union_type, indent, nullptr, -1);\n        } else {\n          return \"unknown enum value\";\n        }\n      }\n      case BASE_TYPE_STRUCT:\n        return GenStruct(*type.struct_def, reinterpret_cast<const Table*>(val),\n                         indent);\n      case BASE_TYPE_STRING: {\n        auto s = reinterpret_cast<const String*>(val);\n        bool ok = EscapeString(s->c_str(), s->size(), &text,\n                               opts.allow_non_utf8, opts.natural_utf8);\n        return ok ? nullptr : \"string contains non-utf8 bytes\";\n      }\n      case BASE_TYPE_VECTOR: {\n        const auto vec_type = type.VectorType();\n        // Call PrintVector above specifically for each element type:\n        // clang-format off\n        switch (vec_type.base_type) {\n        #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \\\n          case BASE_TYPE_ ## ENUM: { \\\n            auto err = PrintVector<CTYPE>(val, vec_type, indent, prev_val); \\\n            if (err) return err; \\\n            break; }\n          FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)\n        #undef FLATBUFFERS_TD\n        }\n        // clang-format on\n        return nullptr;\n      }\n      case BASE_TYPE_ARRAY: {\n        const auto vec_type = type.VectorType();\n        // Call PrintArray above specifically for each element type:\n        // clang-format off\n        switch (vec_type.base_type) {\n        #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \\\n          case BASE_TYPE_ ## ENUM: { \\\n            auto err = PrintArray<CTYPE>(val, type.fixed_length, vec_type, indent); \\\n            if (err) return err; \\\n            break; }\n            FLATBUFFERS_GEN_TYPES_SCALAR(FLATBUFFERS_TD)\n              // Arrays of scalars or structs are only possible.\n              FLATBUFFERS_GEN_TYPES_POINTER(FLATBUFFERS_TD)\n        #undef FLATBUFFERS_TD\n          case BASE_TYPE_ARRAY: FLATBUFFERS_ASSERT(0);\n        }\n        // clang-format on\n        return nullptr;\n      }\n      default:\n        FLATBUFFERS_ASSERT(0);\n        return \"unknown type\";\n    }\n  }\n\n  template <typename T>\n  static T GetFieldDefault(const FieldDef& fd) {\n    T val{};\n    auto check = StringToNumber(fd.value.constant.c_str(), &val);\n    (void)check;\n    FLATBUFFERS_ASSERT(check);\n    return val;\n  }\n\n  // Generate text for a scalar field.\n  template <typename T>\n  void GenField(const FieldDef& fd, const Table* table, bool fixed,\n                int indent) {\n    if (fixed) {\n      PrintScalar(\n          reinterpret_cast<const Struct*>(table)->GetField<T>(fd.value.offset),\n          fd.value.type, indent);\n    } else if (fd.IsOptional()) {\n      auto opt = table->GetOptional<T, T>(fd.value.offset);\n      if (opt) {\n        PrintScalar(*opt, fd.value.type, indent);\n      } else {\n        text += \"null\";\n      }\n    } else {\n      PrintScalar(table->GetField<T>(fd.value.offset, GetFieldDefault<T>(fd)),\n                  fd.value.type, indent);\n    }\n  }\n\n  // Generate text for non-scalar field.\n  const char* GenFieldOffset(const FieldDef& fd, const Table* table, bool fixed,\n                             int indent, const uint8_t* prev_val) {\n    const void* val = nullptr;\n    if (fixed) {\n      // The only non-scalar fields in structs are structs or arrays.\n      FLATBUFFERS_ASSERT(IsStruct(fd.value.type) || IsArray(fd.value.type));\n      val = reinterpret_cast<const Struct*>(table)->GetStruct<const void*>(\n          fd.value.offset);\n    } else if (fd.flexbuffer && opts.json_nested_flexbuffers) {\n      // We could verify this FlexBuffer before access, but since this sits\n      // inside a FlatBuffer that we don't know wether it has been verified or\n      // not, there is little point making this part safer than the parent..\n      // The caller should really be verifying the whole.\n      // If the whole buffer is corrupt, we likely crash before we even get\n      // here.\n      auto vec = table->GetPointer<const Vector<uint8_t>*>(fd.value.offset);\n      auto root = flexbuffers::GetRoot(vec->data(), vec->size());\n      root.ToString(true, opts.strict_json, text);\n      return nullptr;\n    } else if (fd.nested_flatbuffer && opts.json_nested_flatbuffers) {\n      auto vec = table->GetPointer<const Vector<uint8_t>*>(fd.value.offset);\n      auto root = GetRoot<Table>(vec->data());\n      return GenStruct(*fd.nested_flatbuffer, root, indent);\n    } else {\n      val = IsStruct(fd.value.type)\n                ? table->GetStruct<const void*>(fd.value.offset)\n                : table->GetPointer<const void*>(fd.value.offset);\n    }\n    return PrintOffset(val, fd.value.type, indent, prev_val, -1);\n  }\n\n  // Generate text for a struct or table, values separated by commas, indented,\n  // and bracketed by \"{}\"\n  const char* GenStruct(const StructDef& struct_def, const Table* table,\n                        int indent) {\n    text += '{';\n    int fieldout = 0;\n    const uint8_t* prev_val = nullptr;\n    const auto elem_indent = indent + Indent();\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      FieldDef& fd = **it;\n      auto is_present = struct_def.fixed || table->CheckField(fd.value.offset);\n      auto output_anyway = (opts.output_default_scalars_in_json || fd.key) &&\n                           IsScalar(fd.value.type.base_type) && !fd.deprecated;\n      if (is_present || output_anyway) {\n        if (fieldout++) {\n          AddComma();\n        }\n        AddNewLine();\n        AddIndent(elem_indent);\n        OutputIdentifier(fd.name);\n        if (!opts.protobuf_ascii_alike ||\n            (fd.value.type.base_type != BASE_TYPE_STRUCT &&\n             fd.value.type.base_type != BASE_TYPE_VECTOR))\n          text += ':';\n        text += ' ';\n        // clang-format off\n        switch (fd.value.type.base_type) {\n        #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \\\n          case BASE_TYPE_ ## ENUM: { \\\n            GenField<CTYPE>(fd, table, struct_def.fixed, elem_indent); \\\n            break; }\n            FLATBUFFERS_GEN_TYPES_SCALAR(FLATBUFFERS_TD)\n        #undef FLATBUFFERS_TD\n        // Generate drop-thru case statements for all pointer types:\n        #define FLATBUFFERS_TD(ENUM, ...) \\\n          case BASE_TYPE_ ## ENUM:\n              FLATBUFFERS_GEN_TYPES_POINTER(FLATBUFFERS_TD)\n              FLATBUFFERS_GEN_TYPE_ARRAY(FLATBUFFERS_TD)\n        #undef FLATBUFFERS_TD\n            {\n              auto err = GenFieldOffset(fd, table, struct_def.fixed, elem_indent, prev_val);\n              if (err) return err;\n              break;\n            }\n        }\n        // clang-format on\n        // Track prev val for use with union types.\n        if (struct_def.fixed) {\n          prev_val = reinterpret_cast<const uint8_t*>(table) + fd.value.offset;\n        } else {\n          prev_val = table->GetAddressOf(fd.value.offset);\n        }\n      }\n    }\n    AddNewLine();\n    AddIndent(indent);\n    text += '}';\n    return nullptr;\n  }\n\n  JsonPrinter(const Parser& parser, std::string& dest)\n      : opts(parser.opts), text(dest) {\n    text.reserve(1024);  // Reduce amount of inevitable reallocs.\n  }\n\n  const IDLOptions& opts;\n  std::string& text;\n};\n\nstatic const char* GenerateTextImpl(const Parser& parser, const Table* table,\n                                    const StructDef& struct_def,\n                                    std::string* _text) {\n  JsonPrinter printer(parser, *_text);\n  auto err = printer.GenStruct(struct_def, table, 0);\n  if (err) return err;\n  printer.AddNewLine();\n  return nullptr;\n}\n\n// Generate a text representation of a flatbuffer in JSON format.\n// Deprecated: please use `GenTextFromTable`\nbool GenerateTextFromTable(const Parser& parser, const void* table,\n                           const std::string& table_name, std::string* _text) {\n  return GenTextFromTable(parser, table, table_name, _text) != nullptr;\n}\n\n// Generate a text representation of a flatbuffer in JSON format.\nconst char* GenTextFromTable(const Parser& parser, const void* table,\n                             const std::string& table_name,\n                             std::string* _text) {\n  auto struct_def = parser.LookupStruct(table_name);\n  if (struct_def == nullptr) {\n    return \"unknown struct\";\n  }\n  auto root = static_cast<const Table*>(table);\n  return GenerateTextImpl(parser, root, *struct_def, _text);\n}\n\n// Deprecated: please use `GenText`\nconst char* GenerateText(const Parser& parser, const void* flatbuffer,\n                         std::string* _text) {\n  return GenText(parser, flatbuffer, _text);\n}\n\n// Generate a text representation of a flatbuffer in JSON format.\nconst char* GenText(const Parser& parser, const void* flatbuffer,\n                    std::string* _text) {\n  FLATBUFFERS_ASSERT(parser.root_struct_def_);  // call SetRootType()\n  auto root = parser.opts.size_prefixed ? GetSizePrefixedRoot<Table>(flatbuffer)\n                                        : GetRoot<Table>(flatbuffer);\n  return GenerateTextImpl(parser, root, *parser.root_struct_def_, _text);\n}\n\nstatic std::string TextFileName(const std::string& path,\n                                const std::string& file_name) {\n  return path + file_name + \".json\";\n}\n\n// Deprecated: please use `GenTextFile`\nconst char* GenerateTextFile(const Parser& parser, const std::string& path,\n                             const std::string& file_name) {\n  return GenTextFile(parser, path, file_name);\n}\n\nconst char* GenTextFile(const Parser& parser, const std::string& path,\n                        const std::string& file_name) {\n  if (parser.opts.use_flexbuffers) {\n    std::string json;\n    parser.flex_root_.ToString(true, parser.opts.strict_json, json);\n    return parser.opts.file_saver->SaveFile(\n               TextFileName(path, file_name).c_str(), json.c_str(), json.size(),\n               true)\n               ? nullptr\n               : \"SaveFile failed\";\n  }\n  if (!parser.builder_.GetSize() || !parser.root_struct_def_) return nullptr;\n  std::string text;\n  auto err = GenText(parser, parser.builder_.GetBufferPointer(), &text);\n  if (err) return err;\n  return parser.opts.file_saver->SaveFile(TextFileName(path, file_name).c_str(),\n                                          text, false)\n             ? nullptr\n             : \"SaveFile failed\";\n}\n\nstatic std::string TextMakeRule(const Parser& parser, const std::string& path,\n                                const std::string& file_name) {\n  if (!parser.builder_.GetSize() || !parser.root_struct_def_) return \"\";\n  std::string filebase =\n      flatbuffers::StripPath(flatbuffers::StripExtension(file_name));\n  std::string make_rule = TextFileName(path, filebase) + \": \" + file_name;\n  auto included_files =\n      parser.GetIncludedFilesRecursive(parser.root_struct_def_->file);\n  for (auto it = included_files.begin(); it != included_files.end(); ++it) {\n    make_rule += \" \" + *it;\n  }\n  return make_rule;\n}\n\nnamespace {\n\nclass TextCodeGenerator : public CodeGenerator {\n public:\n  Status GenerateCode(const Parser& parser, const std::string& path,\n                      const std::string& filename) override {\n    auto err = GenTextFile(parser, path, filename);\n    if (err) {\n      status_detail = \" (\" + std::string(err) + \")\";\n      return Status::ERROR;\n    }\n    return Status::OK;\n  }\n\n  // Generate code from the provided `buffer` of given `length`. The buffer is a\n  // serialized reflection.fbs.\n  Status GenerateCode(const uint8_t*, int64_t, const CodeGenOptions&) override {\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateMakeRule(const Parser& parser, const std::string& path,\n                          const std::string& filename,\n                          std::string& output) override {\n    output = TextMakeRule(parser, path, filename);\n    return Status::OK;\n  }\n\n  Status GenerateGrpcCode(const Parser& parser, const std::string& path,\n                          const std::string& filename) override {\n    (void)parser;\n    (void)path;\n    (void)filename;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateRootFile(const Parser& parser,\n                          const std::string& path) override {\n    (void)parser;\n    (void)path;\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  bool IsSchemaOnly() const override { return false; }\n\n  bool SupportsBfbsGeneration() const override { return false; }\n\n  bool SupportsRootFileGeneration() const override { return false; }\n\n  IDLOptions::Language Language() const override { return IDLOptions::kJson; }\n\n  std::string LanguageName() const override { return \"text\"; }\n};\n\n}  // namespace\n\nstd::unique_ptr<CodeGenerator> NewTextCodeGenerator() {\n  return std::unique_ptr<TextCodeGenerator>(new TextCodeGenerator());\n}\n\n}  // namespace flatbuffers\n"
  },
  {
    "path": "src/idl_gen_text.h",
    "content": "/*\n * Copyright 2023 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_IDL_GEN_TEXT_H_\n#define FLATBUFFERS_IDL_GEN_TEXT_H_\n\n#include \"flatbuffers/code_generator.h\"\n\nnamespace flatbuffers {\n\n// Constructs a new Text code generator.\nstd::unique_ptr<CodeGenerator> NewTextCodeGenerator();\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_IDL_GEN_TEXT_H_\n"
  },
  {
    "path": "src/idl_gen_ts.cpp",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"idl_gen_ts.h\"\n\n#include <algorithm>\n#include <cassert>\n#include <cmath>\n#include <iostream>\n#include <unordered_map>\n#include <unordered_set>\n\n#include \"flatbuffers/code_generators.h\"\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/flatc.h\"\n#include \"flatbuffers/idl.h\"\n#include \"flatbuffers/util.h\"\n#include \"idl_namer.h\"\n\nnamespace flatbuffers {\nnamespace {\nstruct ImportDefinition {\n  std::string name;\n  std::string import_statement;\n  std::string export_statement;\n  std::string bare_file_path;\n  std::string rel_file_path;\n  std::string object_name;\n  const Definition* dependent = nullptr;\n  const Definition* dependency = nullptr;\n};\n\nstruct NsDefinition {\n  std::string path;\n  std::string filepath;\n  std::string symbolic_name;\n  const Namespace* ns = nullptr;\n  std::map<std::string, const Definition*> definitions;\n};\n\nNamer::Config TypeScriptDefaultConfig() {\n  return {/*types=*/Case::kKeep,\n          /*constants=*/Case::kUnknown,\n          /*methods=*/Case::kLowerCamel,\n          /*functions=*/Case::kLowerCamel,\n          /*fields=*/Case::kLowerCamel,\n          /*variables=*/Case::kLowerCamel,\n          /*variants=*/Case::kKeep,\n          /*enum_variant_seperator=*/\"::\",\n          /*escape_keywords=*/Namer::Config::Escape::AfterConvertingCase,\n          /*namespaces=*/Case::kKeep,\n          /*namespace_seperator=*/\"_\",\n          /*object_prefix=*/\"\",\n          /*object_suffix=*/\"T\",\n          /*keyword_prefix=*/\"\",\n          /*keyword_suffix=*/\"_\",\n          /*keywords_casing=*/Namer::Config::KeywordsCasing::CaseSensitive,\n          /*filenames=*/Case::kDasher,\n          /*directories=*/Case::kDasher,\n          /*output_path=*/\"\",\n          /*filename_suffix=*/\"_generated\",\n          /*filename_extension=*/\".ts\"};\n}\n\nstd::set<std::string> TypescriptKeywords() {\n  // List of keywords retrieved from here:\n  // https://github.com/microsoft/TypeScript/issues/2536\n  return {\n      \"arguments\", \"break\",    \"case\",      \"catch\",      \"class\",      \"const\",\n      \"continue\",  \"debugger\", \"default\",   \"delete\",     \"do\",         \"else\",\n      \"enum\",      \"export\",   \"extends\",   \"false\",      \"finally\",    \"for\",\n      \"function\",  \"if\",       \"import\",    \"in\",         \"instanceof\", \"new\",\n      \"null\",      \"Object\",   \"return\",    \"super\",      \"switch\",     \"this\",\n      \"throw\",     \"true\",     \"try\",       \"typeof\",     \"var\",        \"void\",\n      \"while\",     \"with\",     \"as\",        \"implements\", \"interface\",  \"let\",\n      \"package\",   \"private\",  \"protected\", \"public\",     \"static\",     \"yield\",\n      \"undefined\"  // Used with --ts-undefined-for-optionals\n  };\n}\n\nenum AnnotationType { kParam = 0, kType = 1, kReturns = 2 };\n\ntemplate <typename T>\nstruct SupportsObjectAPI : std::false_type {};\n\ntemplate <>\nstruct SupportsObjectAPI<StructDef> : std::true_type {};\n\n}  // namespace\n\nnamespace ts {\n// Iterate through all definitions we haven't generate code for (enums, structs,\n// and tables) and output them to a single file.\nclass TsGenerator : public BaseGenerator {\n public:\n  typedef std::map<std::string, ImportDefinition> import_set;\n\n  TsGenerator(const Parser& parser, const std::string& path,\n              const std::string& file_name)\n      : BaseGenerator(parser, path, file_name, \"\", \"_\", \"ts\"),\n        namer_(WithFlagOptions(TypeScriptDefaultConfig(), parser.opts, path),\n               TypescriptKeywords()),\n        null_keyword_(parser_.opts.ts_undefined_for_optionals ? \"undefined\"\n                                                              : \"null\") {}\n\n  bool generate() {\n    generateEnums();\n    generateStructs();\n    if (!parser_.opts.ts_omit_entrypoint) {\n      generateEntry();\n    }\n    return true;\n  }\n\n  std::string GetTypeName(const EnumDef& def, const bool = false,\n                          const bool force_ns_wrap = false) {\n    if (force_ns_wrap) {\n      return namer_.NamespacedType(def);\n    }\n    return namer_.Type(def);\n  }\n\n  std::string GetTypeName(const StructDef& def, const bool object_api = false,\n                          const bool force_ns_wrap = false) {\n    if (object_api && parser_.opts.generate_object_based_api) {\n      if (force_ns_wrap) {\n        return namer_.NamespacedObjectType(def);\n      } else {\n        return namer_.ObjectType(def);\n      }\n    } else {\n      if (force_ns_wrap) {\n        return namer_.NamespacedType(def);\n      } else {\n        return namer_.Type(def);\n      }\n    }\n  }\n\n  // Save out the generated code for a single class while adding\n  // declaration boilerplate.\n  bool SaveType(const Definition& definition, const std::string& class_code,\n                import_set& imports, import_set& bare_imports) {\n    if (!class_code.length()) return true;\n\n    std::string code;\n\n    code += \"// \" + std::string(FlatBuffersGeneratedWarning()) + \"\\n\\n\" +\n            \"/* eslint-disable @typescript-eslint/no-unused-vars, \"\n            \"@typescript-eslint/no-explicit-any, \"\n            \"@typescript-eslint/no-non-null-assertion */\\n\\n\";\n\n    for (auto it = bare_imports.begin(); it != bare_imports.end(); it++) {\n      code += it->second.import_statement + \"\\n\";\n    }\n    if (!bare_imports.empty()) code += \"\\n\";\n\n    for (auto it = imports.begin(); it != imports.end(); it++) {\n      if (it->second.dependency != &definition) {\n        code += it->second.import_statement + \"\\n\";\n      }\n    }\n    if (!imports.empty()) code += \"\\n\\n\";\n\n    code += class_code;\n\n    auto dirs = namer_.Directories(*definition.defined_namespace);\n    EnsureDirExists(dirs);\n    auto basename = dirs + namer_.File(definition, SkipFile::Suffix);\n\n    return parser_.opts.file_saver->SaveFile(basename.c_str(), code, false);\n  }\n\n  void TrackNsDef(const Definition& definition, std::string type_name) {\n    std::string path;\n    std::string filepath;\n    std::string symbolic_name;\n    if (definition.defined_namespace->components.size() > 0) {\n      path = namer_.Directories(*definition.defined_namespace,\n                                SkipDir::TrailingPathSeperator);\n      filepath = path + \".ts\";\n      path = namer_.Directories(*definition.defined_namespace,\n                                SkipDir::OutputPathAndTrailingPathSeparator);\n      symbolic_name = definition.defined_namespace->components.back();\n    } else {\n      auto def_mod_name = namer_.File(definition, SkipFile::SuffixAndExtension);\n      symbolic_name = file_name_;\n      filepath = path_ + symbolic_name + \".ts\";\n    }\n    if (ns_defs_.count(path) == 0) {\n      NsDefinition nsDef;\n      nsDef.path = path;\n      nsDef.filepath = filepath;\n      nsDef.ns = definition.defined_namespace;\n      nsDef.definitions.insert(std::make_pair(type_name, &definition));\n      nsDef.symbolic_name = symbolic_name;\n      ns_defs_[path] = nsDef;\n    } else {\n      ns_defs_[path].definitions.insert(std::make_pair(type_name, &definition));\n    }\n  }\n\n private:\n  IdlNamer namer_;\n\n  std::map<std::string, NsDefinition> ns_defs_;\n\n  std::string null_keyword_;\n\n  // Generate code for all enums.\n  void generateEnums() {\n    for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end();\n         ++it) {\n      import_set bare_imports;\n      import_set imports;\n      std::string enumcode;\n      auto& enum_def = **it;\n      GenEnum(enum_def, &enumcode, imports, false);\n      GenEnum(enum_def, &enumcode, imports, true);\n      std::string type_name = GetTypeName(enum_def);\n      TrackNsDef(enum_def, type_name);\n      SaveType(enum_def, enumcode, imports, bare_imports);\n    }\n  }\n\n  // Generate code for all structs.\n  void generateStructs() {\n    for (auto it = parser_.structs_.vec.begin();\n         it != parser_.structs_.vec.end(); ++it) {\n      import_set bare_imports;\n      import_set imports;\n      AddImport(bare_imports, \"* as flatbuffers\", \"flatbuffers\");\n      auto& struct_def = **it;\n      std::string declcode;\n      GenStruct(parser_, struct_def, &declcode, imports);\n      std::string type_name = GetTypeName(struct_def);\n      TrackNsDef(struct_def, type_name);\n      SaveType(struct_def, declcode, imports, bare_imports);\n    }\n  }\n\n  // Generate code for a single entry point module.\n  void generateEntry() {\n    std::string code;\n\n    // add root namespace def if not already existing from defs tracking\n    std::string root;\n    if (ns_defs_.count(root) == 0) {\n      NsDefinition nsDef;\n      nsDef.path = root;\n      nsDef.symbolic_name = file_name_;\n      nsDef.filepath = path_ + file_name_ + \".ts\";\n      nsDef.ns = parser_.empty_namespace_;\n      ns_defs_[nsDef.path] = nsDef;\n    }\n\n    for (const auto& it : ns_defs_) {\n      code = \"// \" + std::string(FlatBuffersGeneratedWarning()) + \"\\n\\n\" +\n             \"/* eslint-disable @typescript-eslint/no-unused-vars, \"\n             \"@typescript-eslint/no-explicit-any, \"\n             \"@typescript-eslint/no-non-null-assertion */\\n\\n\";\n\n      // export all definitions in ns entry point module\n      int export_counter = 0;\n      for (const auto& def : it.second.definitions) {\n        std::vector<std::string> rel_components;\n        // build path for root level vs child level\n        if (it.second.ns->components.size() > 0) {\n          rel_components.push_back(it.second.ns->components.back());\n        }\n        auto base_file_name =\n            namer_.File(*(def.second), SkipFile::SuffixAndExtension);\n        auto base_name =\n            namer_.Directories(it.second.ns->components, SkipDir::OutputPath) +\n            base_file_name;\n        auto ts_file_path = base_name + \".ts\";\n        auto base_name_rel = std::string(\"./\");\n        base_name_rel +=\n            namer_.Directories(rel_components, SkipDir::OutputPath);\n        base_name_rel += base_file_name;\n        auto ts_file_path_rel = base_name_rel + \".ts\";\n        auto type_name = def.first;\n        auto fully_qualified_type_name =\n            it.second.ns->GetFullyQualifiedName(type_name);\n        auto is_struct = parser_.structs_.Lookup(fully_qualified_type_name);\n        code += \"export { \" + type_name;\n        if (parser_.opts.generate_object_based_api && is_struct) {\n          code += \", \" + type_name + parser_.opts.object_suffix;\n        }\n        code += \" } from '\";\n        std::string import_extension =\n            parser_.opts.ts_no_import_ext ? \"\" : \".js\";\n        code += base_name_rel + import_extension + \"';\\n\";\n        export_counter++;\n      }\n\n      // re-export child namespace(s) in parent\n      const auto child_ns_level = it.second.ns->components.size() + 1;\n      for (const auto& it2 : ns_defs_) {\n        if (it2.second.ns->components.size() != child_ns_level) continue;\n        auto ts_file_path = it2.second.path + \".ts\";\n        code += \"export * as \" + it2.second.symbolic_name + \" from './\";\n        int count = it2.second.ns->components.size() > 1 ? 2 : 1;\n        std::vector<std::string> rel_path;\n        std::copy(it2.second.ns->components.end() - count,\n                  it2.second.ns->components.end(),\n                  std::back_inserter(rel_path));\n        code += namer_.Directories(\n                    rel_path, SkipDir::OutputPathAndTrailingPathSeparator) +\n                \".js';\\n\";\n        export_counter++;\n      }\n\n      if (export_counter > 0) {\n        parser_.opts.file_saver->SaveFile(it.second.filepath.c_str(), code,\n                                          false);\n      }\n    }\n  }\n\n  // Generate a documentation comment, if available.\n  static void GenDocComment(const std::vector<std::string>& dc,\n                            std::string* code_ptr,\n                            const char* indent = nullptr) {\n    if (dc.empty()) {\n      // Don't output empty comment blocks with 0 lines of comment content.\n      return;\n    }\n\n    std::string& code = *code_ptr;\n    if (indent) code += indent;\n    code += \"/**\\n\";\n    for (auto it = dc.begin(); it != dc.end(); ++it) {\n      if (indent) code += indent;\n      std::string safe = *it;\n      for (size_t pos = 0; (pos = safe.find(\"*/\", pos)) != std::string::npos;) {\n        safe.replace(pos, 2, \"*\\\\/\");\n        pos += 3;\n      }\n      code += \" *\" + safe + \"\\n\";\n    }\n    if (indent) code += indent;\n    code += \" */\\n\";\n  }\n\n  static void GenDocComment(std::string* code_ptr) {\n    GenDocComment(std::vector<std::string>(), code_ptr);\n  }\n\n  // Generate an enum declaration and an enum string lookup table.\n  void GenEnum(EnumDef& enum_def, std::string* code_ptr, import_set& imports,\n               bool reverse) {\n    if (enum_def.generated) return;\n    if (reverse) return;  // FIXME.\n    std::string& code = *code_ptr;\n    GenDocComment(enum_def.doc_comment, code_ptr);\n    code += \"export enum \";\n    code += GetTypeName(enum_def);\n    code += \" {\\n\";\n    for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {\n      auto& ev = **it;\n      if (!ev.doc_comment.empty()) {\n        if (it != enum_def.Vals().begin()) {\n          code += '\\n';\n        }\n        GenDocComment(ev.doc_comment, code_ptr, \"  \");\n      }\n\n      // Generate mapping between EnumName: EnumValue(int)\n      if (reverse) {\n        code += \"  '\" + enum_def.ToString(ev) + \"'\";\n        code += \" = \";\n        code += \"'\" + namer_.Variant(ev) + \"'\";\n      } else {\n        code += \"  \" + namer_.Variant(ev);\n        code += \" = \";\n        // Unfortunately, because typescript does not support bigint enums,\n        // for 64-bit enums, we instead map the enum names to strings.\n        switch (enum_def.underlying_type.base_type) {\n          case BASE_TYPE_LONG:\n          case BASE_TYPE_ULONG: {\n            code += \"'\" + enum_def.ToString(ev) + \"'\";\n            break;\n          }\n          default:\n            code += enum_def.ToString(ev);\n        }\n      }\n\n      code += (it + 1) != enum_def.Vals().end() ? \",\\n\" : \"\\n\";\n    }\n    code += \"}\";\n\n    if (enum_def.is_union) {\n      code += GenUnionConvFunc(enum_def.underlying_type, imports);\n    }\n\n    code += \"\\n\";\n  }\n\n  static std::string GenType(const Type& type) {\n    switch (type.base_type) {\n      case BASE_TYPE_BOOL:\n      case BASE_TYPE_CHAR:\n        return \"Int8\";\n      case BASE_TYPE_UTYPE:\n        return GenType(GetUnionUnderlyingType(type));\n      case BASE_TYPE_UCHAR:\n        return \"Uint8\";\n      case BASE_TYPE_SHORT:\n        return \"Int16\";\n      case BASE_TYPE_USHORT:\n        return \"Uint16\";\n      case BASE_TYPE_INT:\n        return \"Int32\";\n      case BASE_TYPE_UINT:\n        return \"Uint32\";\n      case BASE_TYPE_LONG:\n        return \"Int64\";\n      case BASE_TYPE_ULONG:\n        return \"Uint64\";\n      case BASE_TYPE_FLOAT:\n        return \"Float32\";\n      case BASE_TYPE_DOUBLE:\n        return \"Float64\";\n      case BASE_TYPE_STRING:\n        return \"String\";\n      case BASE_TYPE_VECTOR:\n        return GenType(type.VectorType());\n      case BASE_TYPE_STRUCT:\n        return type.struct_def->name;\n      default:\n        return \"flatbuffers.Table\";\n    }\n  }\n\n  std::string GenGetter(const Type& type, const std::string& arguments) {\n    switch (type.base_type) {\n      case BASE_TYPE_STRING:\n        return GenBBAccess() + \".__string\" + arguments;\n      case BASE_TYPE_STRUCT:\n        return GenBBAccess() + \".__struct\" + arguments;\n      case BASE_TYPE_UNION:\n        if (!UnionHasStringType(*type.enum_def)) {\n          return GenBBAccess() + \".__union\" + arguments;\n        }\n        return GenBBAccess() + \".__union_with_string\" + arguments;\n      case BASE_TYPE_VECTOR:\n        return GenGetter(type.VectorType(), arguments);\n      default: {\n        auto getter = GenBBAccess() + \".\" + \"read\" + GenType(type) + arguments;\n        if (type.base_type == BASE_TYPE_BOOL) {\n          getter = \"!!\" + getter;\n        }\n        return getter;\n      }\n    }\n  }\n\n  std::string GenBBAccess() const { return \"this.bb!\"; }\n\n  std::string GenDefaultValue(const FieldDef& field, import_set& imports) {\n    if (field.IsScalarOptional()) {\n      return null_keyword_;\n    }\n\n    const auto& value = field.value;\n    if (value.type.enum_def && value.type.base_type != BASE_TYPE_UNION &&\n        value.type.base_type != BASE_TYPE_VECTOR) {\n      switch (value.type.base_type) {\n        case BASE_TYPE_ARRAY: {\n          std::string ret = \"[\";\n          for (auto i = 0; i < value.type.fixed_length; ++i) {\n            std::string enum_name =\n                AddImport(imports, *value.type.enum_def, *value.type.enum_def)\n                    .name;\n            const EnumVal* val =\n                value.type.enum_def->FindByValue(value.constant);\n            if (val == nullptr) {\n              val = value.type.enum_def->MinValue();\n            }\n            std::string enum_value = namer_.Variant(*val);\n            ret += enum_name + \".\" + enum_value +\n                   (i < value.type.fixed_length - 1 ? \", \" : \"\");\n          }\n          ret += \"]\";\n          return ret;\n        }\n        case BASE_TYPE_LONG:\n        case BASE_TYPE_ULONG: {\n          // If the value is an enum with a 64-bit base type, we have to just\n          // return the bigint value directly since typescript does not support\n          // enums with bigint backing types.\n          return \"BigInt('\" + value.constant + \"')\";\n        }\n        default: {\n          const EnumVal* val = value.type.enum_def->FindByValue(value.constant);\n          if (val == nullptr) {\n            val = value.type.enum_def->MinValue();\n          }\n          return AddImport(imports, *value.type.enum_def, *value.type.enum_def)\n                     .name +\n                 \".\" + namer_.Variant(*val);\n        }\n      }\n    }\n\n    switch (value.type.base_type) {\n      case BASE_TYPE_BOOL:\n        return value.constant == \"0\" ? \"false\" : \"true\";\n\n      case BASE_TYPE_STRING: {\n        // NOTE: Strings without a default value are parsed as \"0\" by\n        // the parser, so therefore we have to treat \"0\" as a null-signifying\n        // value.\n        if (value.constant == \"0\" || value.constant == \"null\") {\n          return \"null\";\n        } else {\n          std::string escaped;\n          flatbuffers::EscapeString(value.constant.c_str(),\n                                    value.constant.length(), &escaped,\n                                    true, false);\n          return escaped;\n        }\n      }\n      case BASE_TYPE_UNION:\n      case BASE_TYPE_STRUCT: {\n        return null_keyword_;\n      }\n\n      case BASE_TYPE_ARRAY:\n      case BASE_TYPE_VECTOR:\n        return \"[]\";\n\n      case BASE_TYPE_LONG:\n      case BASE_TYPE_ULONG: {\n        return \"BigInt('\" + value.constant + \"')\";\n      }\n\n      default: {\n        if (StringIsFlatbufferNan(value.constant)) {\n          return \"NaN\";\n        } else if (StringIsFlatbufferPositiveInfinity(value.constant)) {\n          return \"Infinity\";\n        } else if (StringIsFlatbufferNegativeInfinity(value.constant)) {\n          return \"-Infinity\";\n        }\n        return value.constant;\n      }\n    }\n  }\n\n  std::string GenTypeName(import_set& imports, const Definition& owner,\n                          const Type& type, bool input,\n                          bool allowNull = false) {\n    if (!input) {\n      if (IsString(type) || type.base_type == BASE_TYPE_STRUCT) {\n        std::string name;\n        if (IsString(type)) {\n          name = \"string|Uint8Array\";\n        } else {\n          name = AddImport(imports, owner, *type.struct_def).name;\n        }\n        return allowNull ? (name + \"|\" + null_keyword_) : name;\n      }\n    }\n\n    switch (type.base_type) {\n      case BASE_TYPE_BOOL:\n        return allowNull ? (\"boolean|\" + null_keyword_) : \"boolean\";\n      case BASE_TYPE_LONG:\n      case BASE_TYPE_ULONG:\n        return allowNull ? (\"bigint|\" + null_keyword_) : \"bigint\";\n      case BASE_TYPE_ARRAY: {\n        std::string name;\n        if (type.element == BASE_TYPE_LONG || type.element == BASE_TYPE_ULONG) {\n          name = \"bigint[]\";\n        } else if (type.element != BASE_TYPE_STRUCT) {\n          name = \"number[]\";\n        } else {\n          name = \"any[]\";\n          if (parser_.opts.generate_object_based_api) {\n            name = \"(any|\" +\n                   GetTypeName(*type.struct_def, /*object_api =*/true) + \")[]\";\n          }\n        }\n\n        return name + (allowNull ? (\"|\" + null_keyword_) : \"\");\n      }\n      default:\n        if (IsScalar(type.base_type)) {\n          if (type.enum_def) {\n            const auto enum_name =\n                AddImport(imports, owner, *type.enum_def).name;\n            return allowNull ? (enum_name + \"|\" + null_keyword_) : enum_name;\n          }\n          return allowNull ? (\"number|\" + null_keyword_) : \"number\";\n        }\n        return \"flatbuffers.Offset\";\n    }\n  }\n\n  static Type GetUnionUnderlyingType(const Type& type) {\n    if (type.enum_def != nullptr &&\n        type.enum_def->underlying_type.base_type != type.base_type) {\n      return type.enum_def->underlying_type;\n    } else {\n      return Type(BASE_TYPE_UCHAR);\n    }\n  }\n\n  static Type GetUnderlyingVectorType(const Type& vector_type) {\n    return (vector_type.base_type == BASE_TYPE_UTYPE)\n               ? GetUnionUnderlyingType(vector_type)\n               : vector_type;\n  }\n\n  // Returns the method name for use with add/put calls.\n  std::string GenWriteMethod(const Type& type) {\n    // Forward to signed versions since unsigned versions don't exist\n    switch (type.base_type) {\n      case BASE_TYPE_UTYPE:\n        return GenWriteMethod(GetUnionUnderlyingType(type));\n      case BASE_TYPE_UCHAR:\n        return GenWriteMethod(Type(BASE_TYPE_CHAR));\n      case BASE_TYPE_USHORT:\n        return GenWriteMethod(Type(BASE_TYPE_SHORT));\n      case BASE_TYPE_UINT:\n        return GenWriteMethod(Type(BASE_TYPE_INT));\n      case BASE_TYPE_ULONG:\n        return GenWriteMethod(Type(BASE_TYPE_LONG));\n      default:\n        break;\n    }\n\n    return IsScalar(type.base_type) ? namer_.Type(GenType(type))\n                                    : (IsStruct(type) ? \"Struct\" : \"Offset\");\n  }\n\n  template <typename T>\n  static std::string MaybeAdd(T value) {\n    return value != 0 ? \" + \" + NumToString(value) : \"\";\n  }\n\n  template <typename T>\n  static std::string MaybeScale(T value) {\n    return value != 1 ? \" * \" + NumToString(value) : \"\";\n  }\n\n  void GenStructArgs(import_set& imports, const StructDef& struct_def,\n                     const Definition& owner, std::string* arguments,\n                     const std::string& nameprefix) {\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (IsStruct(field.value.type)) {\n        // Generate arguments for a struct inside a struct. To ensure names\n        // don't clash, and to make it obvious these arguments are constructing\n        // a nested struct, prefix the name with the field name.\n        GenStructArgs(imports, *field.value.type.struct_def, owner, arguments,\n                      nameprefix + field.name + \"_\");\n      } else {\n        *arguments += \", \" + nameprefix + field.name + \": \" +\n                      GenTypeName(imports, owner, field.value.type, true,\n                                  field.IsOptional());\n      }\n    }\n  }\n\n  void GenStructBody(const StructDef& struct_def, std::string* body,\n                     const std::string& nameprefix) {\n    *body += \"  builder.prep(\";\n    *body += NumToString(struct_def.minalign) + \", \";\n    *body += NumToString(struct_def.bytesize) + \");\\n\";\n\n    for (auto it = struct_def.fields.vec.rbegin();\n         it != struct_def.fields.vec.rend(); ++it) {\n      auto& field = **it;\n      if (field.padding) {\n        *body += \"  builder.pad(\" + NumToString(field.padding) + \");\\n\";\n      }\n      if (IsStruct(field.value.type)) {\n        // Generate arguments for a struct inside a struct. To ensure names\n        // don't clash, and to make it obvious these arguments are constructing\n        // a nested struct, prefix the name with the field name.\n        GenStructBody(\n            *field.value.type.struct_def, body,\n            nameprefix.length() ? nameprefix + \"_\" + field.name : field.name);\n      } else {\n        auto element_type = field.value.type.element;\n\n        if (field.value.type.base_type == BASE_TYPE_ARRAY) {\n          switch (field.value.type.element) {\n            case BASE_TYPE_STRUCT: {\n              std::string str_last_item_idx =\n                  NumToString(field.value.type.fixed_length - 1);\n              *body += \"\\n  for (let i = \" + str_last_item_idx +\n                       \"; i >= 0; --i\" + \") {\\n\";\n\n              std::string fname = nameprefix.length()\n                                      ? nameprefix + \"_\" + field.name\n                                      : field.name;\n\n              *body += \"    const item = \" + fname + \"?.[i];\\n\\n\";\n\n              if (parser_.opts.generate_object_based_api) {\n                *body += \"    if (item instanceof \" +\n                         GetTypeName(*field.value.type.struct_def,\n                                     /*object_api =*/true) +\n                         \") {\\n\";\n                *body += \"      item.pack(builder);\\n\";\n                *body += \"      continue;\\n\";\n                *body += \"    }\\n\\n\";\n              }\n\n              std::string class_name =\n                  GetPrefixedName(*field.value.type.struct_def);\n              std::string pack_func_create_call =\n                  class_name + \".create\" + class_name + \"(builder,\\n\";\n              pack_func_create_call +=\n                  \"    \" +\n                  GenStructMemberValueTS(*field.value.type.struct_def, \"item\",\n                                         \",\\n    \", false) +\n                  \"\\n  \";\n              *body += \"    \" + pack_func_create_call;\n              *body += \"  );\\n  }\\n\\n\";\n\n              break;\n            }\n            default: {\n              std::string str_last_item_idx =\n                  NumToString(field.value.type.fixed_length - 1);\n              std::string fname = nameprefix.length()\n                                      ? nameprefix + \"_\" + field.name\n                                      : field.name;\n\n              *body += \"\\n  for (let i = \" + str_last_item_idx +\n                       \"; i >= 0; --i) {\\n\";\n              *body += \"    builder.write\";\n              *body += GenWriteMethod(\n                  static_cast<flatbuffers::Type>(field.value.type.element));\n              *body += \"(\";\n              *body += element_type == BASE_TYPE_BOOL ? \"+\" : \"\";\n\n              if (element_type == BASE_TYPE_LONG ||\n                  element_type == BASE_TYPE_ULONG) {\n                *body += \"BigInt(\" + fname + \"?.[i] ?? 0));\\n\";\n              } else {\n                *body += \"(\" + fname + \"?.[i] ?? 0));\\n\\n\";\n              }\n              *body += \"  }\\n\\n\";\n              break;\n            }\n          }\n        } else {\n          std::string fname =\n              nameprefix.length() ? nameprefix + \"_\" + field.name : field.name;\n\n          *body += \"  builder.write\" + GenWriteMethod(field.value.type) + \"(\";\n          if (field.value.type.base_type == BASE_TYPE_BOOL) {\n            *body += \"Number(Boolean(\" + fname + \")));\\n\";\n            continue;\n          } else if (field.value.type.base_type == BASE_TYPE_LONG ||\n                     field.value.type.base_type == BASE_TYPE_ULONG) {\n            *body += \"BigInt(\" + fname + \" ?? 0));\\n\";\n            continue;\n          }\n\n          *body += fname + \");\\n\";\n        }\n      }\n    }\n  }\n\n  std::string GenerateNewExpression(const std::string& object_name) {\n    return \"new \" + namer_.Type(object_name) + \"()\";\n  }\n\n  void GenerateRootAccessor(StructDef& struct_def, std::string* code_ptr,\n                            std::string& code, const std::string& object_name,\n                            bool size_prefixed) {\n    if (!struct_def.fixed) {\n      GenDocComment(code_ptr);\n      std::string sizePrefixed(\"SizePrefixed\");\n      code += \"static get\" + (size_prefixed ? sizePrefixed : \"\") + \"Root\" +\n              GetPrefixedName(struct_def, \"As\");\n      code += \"(bb:flatbuffers.ByteBuffer, obj?:\" + object_name +\n              \"):\" + object_name + \" {\\n\";\n      if (size_prefixed) {\n        code +=\n            \"  bb.setPosition(bb.position() + \"\n            \"flatbuffers.SIZE_PREFIX_LENGTH);\\n\";\n      }\n      code += \"  return (obj || \" + GenerateNewExpression(object_name);\n      code += \").__init(bb.readInt32(bb.position()) + bb.position(), bb);\\n\";\n      code += \"}\\n\\n\";\n    }\n  }\n\n  void GenerateFinisher(StructDef& struct_def, std::string* code_ptr,\n                        std::string& code, bool size_prefixed) {\n    if (parser_.root_struct_def_ == &struct_def) {\n      std::string sizePrefixed(\"SizePrefixed\");\n      GenDocComment(code_ptr);\n\n      code += \"static finish\" + (size_prefixed ? sizePrefixed : \"\") +\n              GetPrefixedName(struct_def) + \"Buffer\";\n      code += \"(builder:flatbuffers.Builder, offset:flatbuffers.Offset) {\\n\";\n      code += \"  builder.finish(offset\";\n      if (!parser_.file_identifier_.empty()) {\n        code += \", '\" + parser_.file_identifier_ + \"'\";\n      }\n      if (size_prefixed) {\n        if (parser_.file_identifier_.empty()) {\n          code += \", undefined\";\n        }\n        code += \", true\";\n      }\n      code += \");\\n\";\n      code += \"}\\n\\n\";\n    }\n  }\n\n  bool UnionHasStringType(const EnumDef& union_enum) {\n    return std::any_of(union_enum.Vals().begin(), union_enum.Vals().end(),\n                       [](const EnumVal* ev) {\n                         return !ev->IsZero() && IsString(ev->union_type);\n                       });\n  }\n\n  std::string GenUnionGenericTypeTS(const EnumDef& union_enum) {\n    // TODO: make it work without any\n    // return std::string(\"T\") + (UnionHasStringType(union_enum) ? \"|string\" :\n    // \"\");\n    return std::string(\"any\") +\n           (UnionHasStringType(union_enum) ? \"|string\" : \"\");\n  }\n\n  std::string GenUnionTypeTS(const EnumDef& union_enum, import_set& imports) {\n    std::string ret;\n    std::set<std::string> type_list;\n\n    for (auto it = union_enum.Vals().begin(); it != union_enum.Vals().end();\n         ++it) {\n      const auto& ev = **it;\n      if (ev.IsZero()) {\n        continue;\n      }\n\n      std::string type = \"\";\n      if (IsString(ev.union_type)) {\n        type = \"string\";  // no need to wrap string type in namespace\n      } else if (ev.union_type.base_type == BASE_TYPE_STRUCT) {\n        type = AddImport(imports, union_enum, *ev.union_type.struct_def).name;\n      } else {\n        FLATBUFFERS_ASSERT(false);\n      }\n      type_list.insert(type);\n    }\n\n    for (auto it = type_list.begin(); it != type_list.end(); ++it) {\n      ret += *it + ((std::next(it) == type_list.end()) ? \"\" : \"|\");\n    }\n\n    return ret;\n  }\n\n  static bool CheckIfNameClashes(const import_set& imports,\n                                 const std::string& name) {\n    // TODO: this would be better as a hashset.\n    for (auto it = imports.begin(); it != imports.end(); it++) {\n      if (it->second.name == name) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  std::string GenSymbolExpression(const StructDef& struct_def,\n                                  const bool has_name_clash,\n                                  const std::string& import_name,\n                                  const std::string& name,\n                                  const std::string& object_name) {\n    std::string symbols_expression;\n\n    if (has_name_clash) {\n      // We have a name clash\n      symbols_expression += import_name + \" as \" + name;\n\n      if (parser_.opts.generate_object_based_api) {\n        symbols_expression += \", \" +\n                              GetTypeName(struct_def, /*object_api =*/true) +\n                              \" as \" + object_name;\n      }\n    } else {\n      // No name clash, use the provided name\n      symbols_expression += name;\n\n      if (parser_.opts.generate_object_based_api) {\n        symbols_expression += \", \" + object_name;\n      }\n    }\n\n    return symbols_expression;\n  }\n\n  std::string GenSymbolExpression(const EnumDef& enum_def,\n                                  const bool has_name_clash,\n                                  const std::string& import_name,\n                                  const std::string& name, const std::string&) {\n    std::string symbols_expression;\n    if (has_name_clash) {\n      symbols_expression += import_name + \" as \" + name;\n    } else {\n      symbols_expression += name;\n    }\n\n    if (enum_def.is_union) {\n      symbols_expression += (\", \" + namer_.Function(\"unionTo\" + name));\n      symbols_expression += (\", \" + namer_.Function(\"unionListTo\" + name));\n    }\n\n    return symbols_expression;\n  }\n\n  std::vector<std::string> PathComponents(const std::string& path) const {\n    std::vector<std::string> components;\n    size_t start = 0;\n    while (start < path.size()) {\n      auto end = path.find(kPathSeparator, start);\n      if (end == std::string::npos) end = path.size();\n      if (end > start) {\n        components.emplace_back(path.substr(start, end - start));\n      }\n      if (end == path.size()) break;\n      start = end + 1;\n    }\n    return components;\n  }\n\n  std::string RelativeDirectory(const std::vector<std::string>& from,\n                                const std::vector<std::string>& to) const {\n    size_t common = 0;\n    while (common < from.size() && common < to.size() &&\n           from[common] == to[common]) {\n      ++common;\n    }\n\n    std::string rel;\n    const size_t ups = from.size() - common;\n    if (ups == 0) {\n      rel = \".\";\n    } else {\n      for (size_t i = 0; i < ups; ++i) {\n        if (!rel.empty()) rel += kPathSeparator;\n        rel += \"..\";\n      }\n    }\n\n    for (size_t i = common; i < to.size(); ++i) {\n      if (!rel.empty()) rel += kPathSeparator;\n      rel += to[i];\n    }\n\n    return rel;\n  }\n\n  template <typename DefinitionT>\n  ImportDefinition AddImport(import_set& imports, const Definition& dependent,\n                             const DefinitionT& dependency) {\n    // The unique name of the dependency, fully qualified in its namespace.\n    const std::string unique_name = GetTypeName(\n        dependency, /*object_api = */ false, /*force_ns_wrap=*/true);\n\n    // Look if we have already added this import and return its name if found.\n    const auto import_pair = imports.find(unique_name);\n    if (import_pair != imports.end()) {\n      return import_pair->second;\n    }\n\n    // Check if this name would have a name clash with another type. Just use\n    // the \"base\" name (properly escaped) without any namespacing applied.\n    const std::string import_name = GetTypeName(dependency);\n    const bool has_name_clash = CheckIfNameClashes(imports, import_name);\n\n    // If we have a name clash, use the unique name, otherwise use simple name.\n    std::string name = has_name_clash ? unique_name : import_name;\n\n    const std::string object_name =\n        GetTypeName(dependency, /*object_api=*/true, has_name_clash);\n\n    const std::string symbols_expression = GenSymbolExpression(\n        dependency, has_name_clash, import_name, name, object_name);\n\n    const Namespace* dependent_ns = dependent.defined_namespace\n                                        ? dependent.defined_namespace\n                                        : parser_.empty_namespace_;\n    const Namespace* dependency_ns = dependency.defined_namespace\n                                         ? dependency.defined_namespace\n                                         : parser_.empty_namespace_;\n\n    const std::string dependent_dirs =\n        namer_.Directories(*dependent_ns, SkipDir::OutputPath);\n    const std::string dependency_dirs =\n        namer_.Directories(*dependency_ns, SkipDir::OutputPath);\n\n    const auto dependent_components = PathComponents(dependent_dirs);\n    const auto dependency_components = PathComponents(dependency_dirs);\n\n    std::string rel_dir =\n        RelativeDirectory(dependent_components, dependency_components);\n    if (rel_dir.empty()) rel_dir = \".\";\n    if (!rel_dir.empty()) rel_dir += kPathSeparator;\n\n    std::string rel_file_path =\n        rel_dir + namer_.File(dependency, SkipFile::SuffixAndExtension);\n\n    std::string bare_file_path =\n        kPathSeparator + dependency_dirs +\n        namer_.File(dependency, SkipFile::SuffixAndExtension);\n\n    ImportDefinition import;\n    import.name = name;\n    import.object_name = object_name;\n    import.bare_file_path = bare_file_path;\n    import.rel_file_path = rel_file_path;\n    std::string import_extension = parser_.opts.ts_no_import_ext ? \"\" : \".js\";\n    import.import_statement = \"import { \" + symbols_expression + \" } from '\" +\n                              rel_file_path + import_extension + \"';\";\n    import.export_statement = \"export { \" + symbols_expression + \" } from '.\" +\n                              bare_file_path + import_extension + \"';\";\n    import.dependency = &dependency;\n    import.dependent = &dependent;\n\n    imports.insert(std::make_pair(unique_name, import));\n\n    return import;\n  }\n\n  void AddImport(import_set& imports, std::string import_name,\n                 std::string fileName) {\n    ImportDefinition import;\n    import.name = import_name;\n    import.import_statement =\n        \"import \" + import_name + \" from '\" + fileName + \"';\";\n    imports.insert(std::make_pair(import_name, import));\n  }\n\n  // Generate a TS union type based on a union's enum\n  std::string GenObjApiUnionTypeTS(import_set& imports,\n                                   const StructDef& dependent,\n                                   const IDLOptions&,\n                                   const EnumDef& union_enum) {\n    std::string ret = \"\";\n    std::set<std::string> type_list;\n\n    for (auto it = union_enum.Vals().begin(); it != union_enum.Vals().end();\n         ++it) {\n      const auto& ev = **it;\n      if (ev.IsZero()) {\n        continue;\n      }\n\n      std::string type = \"\";\n      if (IsString(ev.union_type)) {\n        type = \"string\";  // no need to wrap string type in namespace\n      } else if (ev.union_type.base_type == BASE_TYPE_STRUCT) {\n        type = AddImport(imports, dependent, *ev.union_type.struct_def)\n                   .object_name;\n      } else {\n        FLATBUFFERS_ASSERT(false);\n      }\n      type_list.insert(type);\n    }\n\n    size_t totalPrinted = 0;\n    for (auto it = type_list.begin(); it != type_list.end(); ++it) {\n      ++totalPrinted;\n      ret += *it + ((totalPrinted == type_list.size()) ? \"\" : \"|\");\n    }\n\n    return ret;\n  }\n\n  std::string GenUnionConvFuncName(const EnumDef& enum_def) {\n    return namer_.Function(\"unionTo\", enum_def);\n  }\n\n  std::string GenUnionListConvFuncName(const EnumDef& enum_def) {\n    return namer_.Function(\"unionListTo\", enum_def);\n  }\n\n  std::string GenUnionConvFunc(const Type& union_type, import_set& imports) {\n    if (union_type.enum_def) {\n      const auto& enum_def = *union_type.enum_def;\n\n      const auto valid_union_type = GenUnionTypeTS(enum_def, imports);\n      const auto valid_union_type_with_null =\n          valid_union_type + \"|\" + null_keyword_;\n\n      auto ret = \"\\n\\nexport function \" + GenUnionConvFuncName(enum_def) +\n                 \"(\\n  type: \" + GetTypeName(enum_def) +\n                 \",\\n  accessor: (obj:\" + valid_union_type + \") => \" +\n                 valid_union_type_with_null +\n                 \"\\n): \" + valid_union_type_with_null + \" {\\n\";\n\n      const auto enum_type = AddImport(imports, enum_def, enum_def).name;\n\n      const auto union_enum_loop = [&](const std::string& accessor_str) {\n        ret += \"  switch(\" + enum_type + \"[type]) {\\n\";\n        ret += \"    case 'NONE': return \" + null_keyword_ + \"; \\n\";\n\n        for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end();\n             ++it) {\n          const auto& ev = **it;\n          if (ev.IsZero()) {\n            continue;\n          }\n\n          ret += \"    case '\" + namer_.Variant(ev) + \"': \";\n\n          if (IsString(ev.union_type)) {\n            ret += \"return \" + accessor_str + \"'') as string;\";\n          } else if (ev.union_type.base_type == BASE_TYPE_STRUCT) {\n            const auto type =\n                AddImport(imports, enum_def, *ev.union_type.struct_def).name;\n            ret += \"return \" + accessor_str + \"new \" + type + \"())! as \" +\n                   type + \";\";\n          } else {\n            FLATBUFFERS_ASSERT(false);\n          }\n          ret += \"\\n\";\n        }\n\n        ret += \"    default: return \" + null_keyword_ + \";\\n\";\n        ret += \"  }\\n\";\n      };\n\n      union_enum_loop(\"accessor(\");\n      ret += \"}\";\n\n      ret += \"\\n\\nexport function \" + GenUnionListConvFuncName(enum_def) +\n             \"(\\n  type: \" + GetTypeName(enum_def) +\n             \", \\n  accessor: (index: number, obj:\" + valid_union_type +\n             \") => \" + valid_union_type_with_null +\n             \", \\n  index: number\\n): \" + valid_union_type_with_null + \" {\\n\";\n      union_enum_loop(\"accessor(index, \");\n      ret += \"}\";\n\n      return ret;\n    }\n    FLATBUFFERS_ASSERT(0);\n    return \"\";\n  }\n\n  // Used for generating a short function that returns the correct class\n  // based on union enum type. Assume the context is inside the non object api\n  // type\n  std::string GenUnionValTS(import_set& imports, const StructDef& dependent,\n                            const std::string& field_name,\n                            const Type& union_type,\n                            const bool is_array = false) {\n    if (union_type.enum_def) {\n      const auto& enum_def = *union_type.enum_def;\n      const auto enum_type = AddImport(imports, dependent, enum_def).name;\n      const std::string union_accessor = \"this.\" + field_name;\n\n      const auto union_has_string = UnionHasStringType(enum_def);\n      const auto field_binded_method = \"this.\" + field_name + \".bind(this)\";\n\n      std::string ret;\n\n      if (!is_array) {\n        const auto conversion_function = GenUnionConvFuncName(enum_def);\n\n        ret = \"(() => {\\n\";\n        ret += \"      const temp = \" + conversion_function + \"(this.\" +\n               namer_.Method(field_name, \"Type\") + \"(), \" +\n               field_binded_method + \");\\n\";\n        ret += \"      if(temp === \" + null_keyword_ + \") { return \" +\n               null_keyword_ + \"; }\\n\";\n        ret += union_has_string\n                   ? \"      if(typeof temp === 'string') { return temp; }\\n\"\n                   : \"\";\n        ret += \"      return temp.unpack()\\n\";\n        ret += \"  })()\";\n      } else {\n        const auto conversion_function = GenUnionListConvFuncName(enum_def);\n\n        ret = \"(() => {\\n\";\n        ret += \"    const ret: (\" +\n               GenObjApiUnionTypeTS(imports, *union_type.struct_def,\n                                    parser_.opts, *union_type.enum_def) +\n               \")[] = [];\\n\";\n        ret += \"    for(let targetEnumIndex = 0; targetEnumIndex < this.\" +\n               namer_.Method(field_name, \"TypeLength\") + \"()\" +\n               \"; \"\n               \"++targetEnumIndex) {\\n\";\n        ret += \"      const targetEnum = this.\" +\n               namer_.Method(field_name, \"Type\") + \"(targetEnumIndex);\\n\";\n        ret += \"      if(targetEnum === \" + null_keyword_ + \" || \" + enum_type +\n               \"[targetEnum!] === 'NONE') { \"\n               \"continue; }\\n\\n\";\n        ret += \"      const temp = \" + conversion_function + \"(targetEnum, \" +\n               field_binded_method + \", targetEnumIndex);\\n\";\n        ret += \"      if(temp === \" + null_keyword_ + \") { continue; }\\n\";\n        ret += union_has_string ? \"      if(typeof temp === 'string') { \"\n                                  \"ret.push(temp); continue; }\\n\"\n                                : \"\";\n        ret += \"      ret.push(temp.unpack());\\n\";\n        ret += \"    }\\n\";\n        ret += \"    return ret;\\n\";\n        ret += \"  })()\";\n      }\n\n      return ret;\n    }\n\n    FLATBUFFERS_ASSERT(0);\n    return \"\";\n  }\n\n  std::string GenNullCheckConditional(const std::string& nullCheckVar,\n                                      const std::string& trueVal,\n                                      const std::string& falseVal = \"\") {\n    std::string false_val = falseVal.empty() ? null_keyword_ : falseVal;\n    return \"(\" + nullCheckVar + \" !== \" + null_keyword_ + \" ? \" + trueVal +\n           \" : \" + false_val + \")\";\n  }\n\n  std::string GenStructMemberValueTS(const StructDef& struct_def,\n                                     const std::string& prefix,\n                                     const std::string& delimiter,\n                                     const bool nullCheck = true) {\n    std::string ret;\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n\n      auto curr_member_accessor = prefix + \".\" + namer_.Method(field);\n      if (prefix != \"this\") {\n        curr_member_accessor = prefix + \"?.\" + namer_.Method(field);\n      }\n      if (IsStruct(field.value.type)) {\n        ret += GenStructMemberValueTS(*field.value.type.struct_def,\n                                      curr_member_accessor, delimiter);\n      } else {\n        if (nullCheck) {\n          std::string nullValue = \"0\";\n          if (field.value.type.base_type == BASE_TYPE_BOOL) {\n            nullValue = \"false\";\n          } else if (field.value.type.base_type == BASE_TYPE_LONG ||\n                     field.value.type.base_type == BASE_TYPE_ULONG) {\n            nullValue = \"BigInt(0)\";\n          } else if (field.value.type.base_type == BASE_TYPE_ARRAY) {\n            nullValue = \"[]\";\n          }\n          ret += \"(\" + curr_member_accessor + \" ?? \" + nullValue + \")\";\n        } else {\n          ret += curr_member_accessor;\n        }\n      }\n\n      if (std::next(it) != struct_def.fields.vec.end()) {\n        ret += delimiter;\n      }\n    }\n\n    return ret;\n  }\n\n  void GenObjApi(const Parser& parser, StructDef& struct_def,\n                 std::string& obj_api_unpack_func, std::string& obj_api_class,\n                 import_set& imports) {\n    const auto class_name = GetTypeName(struct_def, /*object_api=*/true);\n\n    std::string unpack_func = \"\\nunpack(): \" + class_name +\n                              \" {\\n  return new \" + class_name + \"(\" +\n                              (struct_def.fields.vec.empty() ? \"\" : \"\\n\");\n    std::string unpack_to_func = \"\\nunpackTo(_o: \" + class_name + \"): void {\" +\n                                 +(struct_def.fields.vec.empty() ? \"\" : \"\\n\");\n\n    std::string constructor_func = \"constructor(\";\n    constructor_func += (struct_def.fields.vec.empty() ? \"\" : \"\\n\");\n\n    const auto has_create =\n        struct_def.fixed || CanCreateFactoryMethod(struct_def);\n\n    std::string pack_func_prototype =\n        \"\\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\\n\";\n\n    std::string pack_func_offset_decl;\n    std::string pack_func_create_call;\n\n    const auto struct_name = AddImport(imports, struct_def, struct_def).name;\n\n    if (has_create) {\n      pack_func_create_call = \"  return \" + struct_name + \".create\" +\n                              GetPrefixedName(struct_def) + \"(builder\" +\n                              (struct_def.fields.vec.empty() ? \"\" : \",\\n    \");\n    } else {\n      pack_func_create_call = \"  \" + struct_name + \".start\" +\n                              GetPrefixedName(struct_def) + \"(builder);\\n\";\n    }\n\n    if (struct_def.fixed) {\n      // when packing struct, nested struct's members instead of the struct's\n      // offset are used\n      pack_func_create_call +=\n          GenStructMemberValueTS(struct_def, \"this\", \",\\n    \", false) + \"\\n  \";\n    }\n\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (field.deprecated) continue;\n\n      const auto field_method = namer_.Method(field);\n      const auto field_field = namer_.Field(field);\n      const std::string field_binded_method =\n          \"this.\" + field_method + \".bind(this)\";\n\n      std::string field_val;\n      std::string field_type;\n      // a string that declares a variable containing the\n      // offset for things that can't be generated inline\n      // empty otw\n      std::string field_offset_decl;\n      // a string that contains values for things that can be created inline or\n      // the variable name from field_offset_decl\n      std::string field_offset_val;\n      const auto field_default_val = GenDefaultValue(field, imports);\n\n      // Emit a scalar field\n      const auto is_string = IsString(field.value.type);\n      if (IsScalar(field.value.type.base_type) || is_string) {\n        field_type +=\n            GenTypeName(imports, field, field.value.type, false,\n                        !HasDefaultValue(field) || HasNullDefault(field));\n        field_val = \"this.\" + namer_.Method(field) + \"()\";\n\n        if (field.value.type.base_type != BASE_TYPE_STRING) {\n          field_offset_val = \"this.\" + namer_.Field(field);\n        } else {\n          field_offset_decl = GenNullCheckConditional(\n              \"this.\" + namer_.Field(field),\n              \"builder.createString(this.\" + field_field + \"!)\", \"0\");\n        }\n      }\n\n      // Emit an object field\n      else {\n        auto is_vector = false;\n        switch (field.value.type.base_type) {\n          case BASE_TYPE_STRUCT: {\n            const auto& sd = *field.value.type.struct_def;\n            field_type += AddImport(imports, struct_def, sd).object_name;\n\n            const std::string field_accessor =\n                \"this.\" + namer_.Method(field) + \"()\";\n            field_val = GenNullCheckConditional(\n                field_accessor, field_accessor + \"!.unpack()\", null_keyword_);\n            auto packing = GenNullCheckConditional(\n                \"this.\" + field_field,\n                \"this.\" + field_field + \"!.pack(builder)\", \"0\");\n\n            if (sd.fixed) {\n              field_offset_val = std::move(packing);\n            } else {\n              field_offset_decl = std::move(packing);\n            }\n\n            break;\n          }\n\n          case BASE_TYPE_ARRAY: {\n            auto vectortype = field.value.type.VectorType();\n            auto vectortypename =\n                GenTypeName(imports, struct_def, vectortype, false);\n            is_vector = true;\n\n            field_type = \"(\";\n\n            switch (vectortype.base_type) {\n              case BASE_TYPE_STRUCT: {\n                const auto& sd = *field.value.type.struct_def;\n                const auto field_type_name =\n                    GetTypeName(sd, /*object_api=*/true);\n                field_type += field_type_name;\n                field_type += \")[]\";\n\n                field_val = GenBBAccess() + \".createObjList<\" + vectortypename +\n                            \", \" + field_type_name + \">(\" +\n                            field_binded_method + \", \" +\n                            NumToString(field.value.type.fixed_length) + \")\";\n\n                if (sd.fixed) {\n                  field_offset_decl =\n                      \"builder.createStructOffsetList(this.\" + field_field +\n                      \", \" + AddImport(imports, struct_def, struct_def).name +\n                      \".\" + namer_.Method(\"start\", field, \"Vector\") + \")\";\n                } else {\n                  field_offset_decl =\n                      AddImport(imports, struct_def, struct_def).name + \".\" +\n                      namer_.Method(\"create\", field, \"Vector\") +\n                      \"(builder, builder.createObjectOffsetList(\" + \"this.\" +\n                      field_field + \"))\";\n                }\n\n                break;\n              }\n\n              case BASE_TYPE_STRING: {\n                field_type += \"string)[]\";\n                field_val = GenBBAccess() + \".createScalarList<string>(\" +\n                            field_binded_method + \", this.\" +\n                            namer_.Field(field, \"Length\") + \"())\";\n                field_offset_decl =\n                    AddImport(imports, struct_def, struct_def).name + \".\" +\n                    namer_.Method(\"create\", field, \"Vector\") +\n                    \"(builder, builder.createObjectOffsetList(\" + \"this.\" +\n                    namer_.Field(field) + \"))\";\n                break;\n              }\n\n              case BASE_TYPE_UNION: {\n                field_type += GenObjApiUnionTypeTS(\n                    imports, struct_def, parser.opts, *(vectortype.enum_def));\n                field_type += \")[]\";\n                field_val = GenUnionValTS(imports, struct_def, field_method,\n                                          vectortype, true);\n\n                field_offset_decl =\n                    AddImport(imports, struct_def, struct_def).name + \".\" +\n                    namer_.Method(\"create\", field, \"Vector\") +\n                    \"(builder, builder.createObjectOffsetList(\" + \"this.\" +\n                    namer_.Field(field) + \"))\";\n\n                break;\n              }\n              default: {\n                if (vectortype.enum_def) {\n                  field_type += GenTypeName(imports, struct_def, vectortype,\n                                            false, HasNullDefault(field));\n                } else {\n                  field_type += vectortypename;\n                }\n                field_type += \")[]\";\n                field_val = GenBBAccess() + \".createScalarList<\" +\n                            vectortypename + \">(\" + field_binded_method + \", \" +\n                            NumToString(field.value.type.fixed_length) + \")\";\n\n                field_offset_decl =\n                    AddImport(imports, struct_def, struct_def).name + \".\" +\n                    namer_.Method(\"create\", field, \"Vector\") +\n                    \"(builder, this.\" + field_field + \")\";\n\n                break;\n              }\n            }\n\n            break;\n          }\n\n          case BASE_TYPE_VECTOR: {\n            auto vectortype = field.value.type.VectorType();\n            auto vectortypename =\n                GenTypeName(imports, struct_def, vectortype, false);\n            is_vector = true;\n\n            field_type = \"(\";\n\n            switch (vectortype.base_type) {\n              case BASE_TYPE_STRUCT: {\n                const auto& sd = *field.value.type.struct_def;\n                const auto field_type_name =\n                    GetTypeName(sd, /*object_api=*/true);\n                field_type += field_type_name;\n                field_type += \")[]\";\n\n                field_val = GenBBAccess() + \".createObjList<\" + vectortypename +\n                            \", \" + field_type_name + \">(\" +\n                            field_binded_method + \", this.\" +\n                            namer_.Method(field, \"Length\") + \"())\";\n\n                if (sd.fixed) {\n                  field_offset_decl =\n                      \"builder.createStructOffsetList(this.\" + field_field +\n                      \", \" + AddImport(imports, struct_def, struct_def).name +\n                      \".\" + namer_.Method(\"start\", field, \"Vector\") + \")\";\n                } else {\n                  field_offset_decl =\n                      AddImport(imports, struct_def, struct_def).name + \".\" +\n                      namer_.Method(\"create\", field, \"Vector\") +\n                      \"(builder, builder.createObjectOffsetList(\" + \"this.\" +\n                      field_field + \"))\";\n                }\n\n                break;\n              }\n\n              case BASE_TYPE_STRING: {\n                field_type += \"string)[]\";\n                field_val = GenBBAccess() + \".createScalarList<string>(\" +\n                            field_binded_method + \", this.\" +\n                            namer_.Field(field, \"Length\") + \"())\";\n                field_offset_decl =\n                    AddImport(imports, struct_def, struct_def).name + \".\" +\n                    namer_.Method(\"create\", field, \"Vector\") +\n                    \"(builder, builder.createObjectOffsetList(\" + \"this.\" +\n                    namer_.Field(field) + \"))\";\n                break;\n              }\n\n              case BASE_TYPE_UNION: {\n                field_type += GenObjApiUnionTypeTS(\n                    imports, struct_def, parser.opts, *(vectortype.enum_def));\n                field_type += \")[]\";\n                field_val = GenUnionValTS(imports, struct_def, field_method,\n                                          vectortype, true);\n\n                field_offset_decl =\n                    AddImport(imports, struct_def, struct_def).name + \".\" +\n                    namer_.Method(\"create\", field, \"Vector\") +\n                    \"(builder, builder.createObjectOffsetList(\" + \"this.\" +\n                    namer_.Field(field) + \"))\";\n\n                break;\n              }\n              default: {\n                if (vectortype.enum_def) {\n                  field_type += GenTypeName(imports, struct_def, vectortype,\n                                            false, HasNullDefault(field));\n                } else {\n                  field_type += vectortypename;\n                }\n                field_type += \")[]\";\n                field_val = GenBBAccess() + \".createScalarList<\" +\n                            vectortypename + \">(\" + field_binded_method +\n                            \", this.\" + namer_.Method(field, \"Length\") + \"())\";\n\n                field_offset_decl =\n                    AddImport(imports, struct_def, struct_def).name + \".\" +\n                    namer_.Method(\"create\", field, \"Vector\") +\n                    \"(builder, this.\" + field_field + \")\";\n\n                break;\n              }\n            }\n\n            break;\n          }\n\n          case BASE_TYPE_UNION: {\n            field_type += GenObjApiUnionTypeTS(imports, struct_def, parser.opts,\n                                               *(field.value.type.enum_def));\n\n            field_val = GenUnionValTS(imports, struct_def, field_method,\n                                      field.value.type);\n            field_offset_decl =\n                \"builder.createObjectOffset(this.\" + field_field + \")\";\n            break;\n          }\n\n          default:\n            FLATBUFFERS_ASSERT(0);\n            break;\n        }\n\n        // length 0 vector is simply empty instead of null/undefined.\n        field_type += is_vector ? \"\" : (\"|\" + null_keyword_);\n      }\n\n      if (!field_offset_decl.empty()) {\n        field_offset_decl =\n            \"  const \" + field_field + \" = \" + field_offset_decl + \";\";\n      }\n      if (field_offset_val.empty()) {\n        field_offset_val = field_field;\n      }\n\n      unpack_func += \"    \" + field_val;\n      unpack_to_func += \"  _o.\" + field_field + \" = \" + field_val + \";\";\n\n      // FIXME: if field_type and field_field are identical, then\n      // this generates invalid typescript.\n      constructor_func += \"  public \" + field_field + \": \" + field_type +\n                          \" = \" + field_default_val;\n\n      if (!struct_def.fixed) {\n        if (!field_offset_decl.empty()) {\n          pack_func_offset_decl += field_offset_decl + \"\\n\";\n        }\n\n        if (has_create) {\n          pack_func_create_call += field_offset_val;\n        } else {\n          if (field.IsScalarOptional()) {\n            pack_func_create_call +=\n                \"  if (\" + field_offset_val + \" !== \" + null_keyword_ + \")\\n  \";\n          }\n          pack_func_create_call += \"  \" + struct_name + \".\" +\n                                   namer_.Method(\"add\", field) + \"(builder, \" +\n                                   field_offset_val + \");\\n\";\n        }\n      }\n\n      if (std::next(it) != struct_def.fields.vec.end()) {\n        constructor_func += \",\\n\";\n\n        if (!struct_def.fixed && has_create) {\n          pack_func_create_call += \",\\n    \";\n        }\n\n        unpack_func += \",\\n\";\n        unpack_to_func += \"\\n\";\n      } else {\n        constructor_func += \"\\n\";\n        if (!struct_def.fixed) {\n          pack_func_offset_decl += (pack_func_offset_decl.empty() ? \"\" : \"\\n\");\n          pack_func_create_call += \"\\n  \";\n        }\n\n        unpack_func += \"\\n  \";\n        unpack_to_func += \"\\n\";\n      }\n    }\n\n    constructor_func += \"){}\\n\\n\";\n\n    if (has_create) {\n      pack_func_create_call += \");\";\n    } else {\n      pack_func_create_call += \"return \" + struct_name + \".end\" +\n                               GetPrefixedName(struct_def) + \"(builder);\";\n    }\n    obj_api_class = \"\\n\";\n    obj_api_class += \"export class \";\n    obj_api_class += GetTypeName(struct_def, /*object_api=*/true);\n    obj_api_class += \" implements flatbuffers.IGeneratedObject {\\n\";\n    obj_api_class += constructor_func;\n    obj_api_class += pack_func_prototype + pack_func_offset_decl +\n                     pack_func_create_call + \"\\n}\";\n\n    obj_api_class += \"\\n}\\n\";\n\n    unpack_func += \");\\n}\";\n    unpack_to_func += \"}\\n\";\n\n    obj_api_unpack_func = unpack_func + \"\\n\\n\" + unpack_to_func;\n  }\n\n  static bool CanCreateFactoryMethod(const StructDef& struct_def) {\n    // to preserve backwards compatibility, we allow the first field to be a\n    // struct\n    return struct_def.fields.vec.size() < 2 ||\n           std::all_of(\n               std::begin(struct_def.fields.vec) + 1,\n               std::end(struct_def.fields.vec),\n               [](const FieldDef* f) -> bool {\n                 FLATBUFFERS_ASSERT(f != nullptr);\n                 return f->value.type.base_type != BASE_TYPE_STRUCT;\n               });\n  }\n\n  // Generate an accessor struct with constructor for a flatbuffers struct.\n  void GenStruct(const Parser& parser, StructDef& struct_def,\n                 std::string* code_ptr, import_set& imports) {\n    if (struct_def.generated) return;\n    std::string& code = *code_ptr;\n\n    // Special case for the root struct, since no one will necessarily reference\n    // it, we have to explicitly add it to the import list.\n    if (&struct_def == parser_.root_struct_def_) {\n      AddImport(imports, struct_def, struct_def);\n    }\n\n    const std::string object_name = GetTypeName(struct_def);\n    const std::string object_api_name = GetTypeName(struct_def, true);\n\n    // Emit constructor\n    GenDocComment(struct_def.doc_comment, code_ptr);\n    code += \"export class \";\n    code += object_name;\n    if (parser.opts.generate_object_based_api) {\n      code += \" implements flatbuffers.IUnpackableObject<\" + object_api_name +\n              \"> {\\n\";\n    } else {\n      code += \" {\\n\";\n    }\n    code += \"  bb: flatbuffers.ByteBuffer|\" + null_keyword_ + \" = \" +\n            null_keyword_ + \";\\n\";\n    code += \"  bb_pos = 0;\\n\";\n\n    // Generate the __init method that sets the field in a pre-existing\n    // accessor object. This is to allow object reuse.\n    code +=\n        \"  __init(i:number, bb:flatbuffers.ByteBuffer):\" + object_name + \" {\\n\";\n    code += \"  this.bb_pos = i;\\n\";\n    code += \"  this.bb = bb;\\n\";\n    code += \"  return this;\\n\";\n    code += \"}\\n\\n\";\n\n    // Generate special accessors for the table that when used as the root of a\n    // FlatBuffer\n    GenerateRootAccessor(struct_def, code_ptr, code, object_name, false);\n    GenerateRootAccessor(struct_def, code_ptr, code, object_name, true);\n\n    // Generate the identifier check method\n    if (!struct_def.fixed && parser_.root_struct_def_ == &struct_def &&\n        !parser_.file_identifier_.empty()) {\n      GenDocComment(code_ptr);\n      code +=\n          \"static bufferHasIdentifier(bb:flatbuffers.ByteBuffer):boolean \"\n          \"{\\n\";\n      code += \"  return bb.__has_identifier('\" + parser_.file_identifier_;\n      code += \"');\\n}\\n\\n\";\n    }\n\n    // Emit field accessors\n    for (auto it = struct_def.fields.vec.begin();\n         it != struct_def.fields.vec.end(); ++it) {\n      auto& field = **it;\n      if (field.deprecated) continue;\n      std::string offset_prefix = \"\";\n\n      if (field.value.type.base_type == BASE_TYPE_ARRAY) {\n        offset_prefix = \"    return \";\n      } else {\n        offset_prefix = \"  const offset = \" + GenBBAccess() +\n                        \".__offset(this.bb_pos, \" +\n                        NumToString(field.value.offset) + \");\\n\";\n        offset_prefix += \"  return \";\n      }\n\n      // Emit a scalar field\n      const auto is_string = IsString(field.value.type);\n      if (IsScalar(field.value.type.base_type) || is_string) {\n        const auto has_null_default =\n            !field.IsRequired() && !HasDefaultValue(field);\n\n        GenDocComment(field.doc_comment, code_ptr);\n        std::string prefix = namer_.Method(field) + \"(\";\n        if (is_string) {\n          code += prefix + \"):\" + (has_null_default ? \"string|\" + null_keyword_ : \"string\") + \"\\n\";\n          code +=\n              prefix + \"optionalEncoding:flatbuffers.Encoding\" + \"):\" +\n              GenTypeName(imports, struct_def, field.value.type, false, has_null_default) +\n              \"\\n\";\n          code += prefix + \"optionalEncoding?:any\";\n        } else {\n          code += prefix;\n        }\n        if (field.value.type.enum_def) {\n          code += \"):\" +\n                  GenTypeName(imports, struct_def, field.value.type, false,\n                              field.IsOptional()) +\n                  \" {\\n\";\n        } else {\n          code += \"):\" +\n                  GenTypeName(imports, struct_def, field.value.type, false,\n                              has_null_default) +\n                  \" {\\n\";\n        }\n\n        if (struct_def.fixed) {\n          code +=\n              \"  return \" +\n              GenGetter(field.value.type,\n                        \"(this.bb_pos\" + MaybeAdd(field.value.offset) + \")\") +\n              \";\\n\";\n        } else {\n          std::string index = \"this.bb_pos + offset\";\n          if (is_string) {\n            index += \", optionalEncoding\";\n          }\n          if (field.IsRequired()) {\n            code +=\n                offset_prefix + GenGetter(field.value.type, \"(\" + index + \")\");\n            ;\n          } else {\n            code += offset_prefix + \"offset ? \" +\n                    GenGetter(field.value.type, \"(\" + index + \")\");\n          }\n          if (field.value.type.base_type != BASE_TYPE_ARRAY &&\n              !field.IsRequired()) {\n            code += \" : \" + GenDefaultValue(field, imports);\n          }\n          code += \";\\n\";\n        }\n      }\n\n      // Emit an object field\n      else {\n        switch (field.value.type.base_type) {\n          case BASE_TYPE_STRUCT: {\n            const auto type =\n                AddImport(imports, struct_def, *field.value.type.struct_def)\n                    .name;\n            GenDocComment(field.doc_comment, code_ptr);\n            code += namer_.Method(field);\n            code +=\n                \"(obj?:\" + type + \"):\" + type + \"|\" + null_keyword_ + \" {\\n\";\n\n            if (struct_def.fixed) {\n              code += \"  return (obj || \" + GenerateNewExpression(type);\n              code += \").__init(this.bb_pos\";\n              code +=\n                  MaybeAdd(field.value.offset) + \", \" + GenBBAccess() + \");\\n\";\n            } else {\n              code += offset_prefix + \"offset ? (obj || \" +\n                      GenerateNewExpression(type) + \").__init(\";\n              code += field.value.type.struct_def->fixed\n                          ? \"this.bb_pos + offset\"\n                          : GenBBAccess() + \".__indirect(this.bb_pos + offset)\";\n              code += \", \" + GenBBAccess() + \") : \" + null_keyword_ + \";\\n\";\n            }\n\n            break;\n          }\n\n          case BASE_TYPE_ARRAY: {\n            auto vectortype = field.value.type.VectorType();\n            auto vectortypename =\n                GenTypeName(imports, struct_def, vectortype, false);\n            auto inline_size = InlineSize(vectortype);\n            auto index = \"this.bb_pos + \" + NumToString(field.value.offset) +\n                         \" + index\" + MaybeScale(inline_size);\n            std::string ret_type;\n            bool is_union = false;\n            switch (vectortype.base_type) {\n              case BASE_TYPE_STRUCT:\n                ret_type = vectortypename;\n                break;\n              case BASE_TYPE_STRING:\n                ret_type = vectortypename;\n                break;\n              case BASE_TYPE_UNION:\n                ret_type = \"?flatbuffers.Table\";\n                is_union = true;\n                break;\n              default:\n                ret_type = vectortypename;\n            }\n            GenDocComment(field.doc_comment, code_ptr);\n            std::string prefix = namer_.Method(field);\n            // TODO: make it work without any\n            // if (is_union) { prefix += \"<T extends flatbuffers.Table>\"; }\n            if (is_union) {\n              prefix += \"\";\n            }\n            prefix += \"(index: number\";\n            if (is_union) {\n              const auto union_type =\n                  GenUnionGenericTypeTS(*(field.value.type.enum_def));\n\n              vectortypename = union_type;\n              code += prefix + \", obj:\" + union_type;\n            } else if (vectortype.base_type == BASE_TYPE_STRUCT) {\n              code += prefix + \", obj?:\" + vectortypename;\n            } else if (IsString(vectortype)) {\n              code += prefix + \"):string\\n\";\n              code += prefix + \",optionalEncoding:flatbuffers.Encoding\" +\n                      \"):\" + vectortypename + \"\\n\";\n              code += prefix + \",optionalEncoding?:any\";\n            } else {\n              code += prefix;\n            }\n            code += \"):\" + vectortypename + \"|\" + null_keyword_ + \" {\\n\";\n\n            if (vectortype.base_type == BASE_TYPE_STRUCT) {\n              code += offset_prefix + \"(obj || \" +\n                      GenerateNewExpression(vectortypename);\n              code += \").__init(\";\n              code += vectortype.struct_def->fixed\n                          ? index\n                          : GenBBAccess() + \".__indirect(\" + index + \")\";\n              code += \", \" + GenBBAccess() + \")\";\n            } else {\n              if (is_union) {\n                index = \"obj, \" + index;\n              } else if (IsString(vectortype)) {\n                index += \", optionalEncoding\";\n              }\n              code += offset_prefix + GenGetter(vectortype, \"(\" + index + \")\");\n            }\n\n            switch (field.value.type.base_type) {\n              case BASE_TYPE_ARRAY: {\n                break;\n              }\n              case BASE_TYPE_BOOL: {\n                code += \" : false\";\n                break;\n              }\n              case BASE_TYPE_LONG:\n              case BASE_TYPE_ULONG: {\n                code += \" : BigInt(0)\";\n                break;\n              }\n              default: {\n                if (IsScalar(field.value.type.element)) {\n                  if (field.value.type.enum_def) {\n                    code += field.value.constant;\n                  } else {\n                    code += \" : 0\";\n                  }\n                } else {\n                  code += \": \" + null_keyword_;\n                }\n                break;\n              }\n            }\n            code += \";\\n\";\n            break;\n          }\n\n          case BASE_TYPE_VECTOR: {\n            auto vectortype = field.value.type.VectorType();\n            auto vectortypename =\n                GenTypeName(imports, struct_def, vectortype, false);\n            auto type = GetUnderlyingVectorType(vectortype);\n            auto inline_size = InlineSize(type);\n            auto index = GenBBAccess() +\n                         \".__vector(this.bb_pos + offset) + index\" +\n                         MaybeScale(inline_size);\n            std::string ret_type;\n            bool is_union = false;\n            switch (vectortype.base_type) {\n              case BASE_TYPE_STRUCT:\n                ret_type = vectortypename;\n                break;\n              case BASE_TYPE_STRING:\n                ret_type = vectortypename;\n                break;\n              case BASE_TYPE_UNION:\n                ret_type = \"?flatbuffers.Table\";\n                is_union = true;\n                break;\n              default:\n                ret_type = vectortypename;\n            }\n            GenDocComment(field.doc_comment, code_ptr);\n            std::string prefix = namer_.Method(field);\n            // TODO: make it work without any\n            // if (is_union) { prefix += \"<T extends flatbuffers.Table>\"; }\n            if (is_union) {\n              prefix += \"\";\n            }\n            prefix += \"(index: number\";\n            if (is_union) {\n              const auto union_type =\n                  GenUnionGenericTypeTS(*(field.value.type.enum_def));\n\n              vectortypename = union_type;\n              code += prefix + \", obj:\" + union_type;\n            } else if (vectortype.base_type == BASE_TYPE_STRUCT) {\n              code += prefix + \", obj?:\" + vectortypename;\n            } else if (IsString(vectortype)) {\n              code += prefix + \"):string\\n\";\n              code += prefix + \",optionalEncoding:flatbuffers.Encoding\" +\n                      \"):\" + vectortypename + \"\\n\";\n              code += prefix + \",optionalEncoding?:any\";\n            } else {\n              code += prefix;\n            }\n            code += \"):\" + vectortypename + \"|\" + null_keyword_ + \" {\\n\";\n\n            if (vectortype.base_type == BASE_TYPE_STRUCT) {\n              code += offset_prefix + \"offset ? (obj || \" +\n                      GenerateNewExpression(vectortypename);\n              code += \").__init(\";\n              code += vectortype.struct_def->fixed\n                          ? index\n                          : GenBBAccess() + \".__indirect(\" + index + \")\";\n              code += \", \" + GenBBAccess() + \")\";\n            } else {\n              if (is_union) {\n                index = \"obj, \" + index;\n              } else if (IsString(vectortype)) {\n                index += \", optionalEncoding\";\n              }\n              code += offset_prefix + \"offset ? \" +\n                      GenGetter(vectortype, \"(\" + index + \")\");\n            }\n            code += \" : \";\n            if (field.value.type.element == BASE_TYPE_BOOL) {\n              code += \"false\";\n            } else if (field.value.type.element == BASE_TYPE_LONG ||\n                       field.value.type.element == BASE_TYPE_ULONG) {\n              code += \"BigInt(0)\";\n            } else if (IsScalar(field.value.type.element)) {\n              if (field.value.type.enum_def) {\n                code += null_keyword_;\n              } else {\n                code += \"0\";\n              }\n            } else {\n              code += null_keyword_;\n            }\n            code += \";\\n\";\n            break;\n          }\n\n          case BASE_TYPE_UNION: {\n            GenDocComment(field.doc_comment, code_ptr);\n            code += namer_.Method(field);\n\n            const auto& union_enum = *(field.value.type.enum_def);\n            const auto union_type = GenUnionGenericTypeTS(union_enum);\n            code += \"<T extends flatbuffers.Table>(obj:\" + union_type +\n                    \"):\" + union_type + \"|\" + null_keyword_ +\n                    \" \"\n                    \"{\\n\";\n\n            code += offset_prefix + \"offset ? \" +\n                    GenGetter(field.value.type, \"(obj, this.bb_pos + offset)\") +\n                    \" : \" + null_keyword_ + \";\\n\";\n            break;\n          }\n          default:\n            FLATBUFFERS_ASSERT(0);\n        }\n      }\n      code += \"}\\n\\n\";\n\n      // Adds the mutable scalar value to the output\n      if (IsScalar(field.value.type.base_type) && parser.opts.mutable_buffer &&\n          !IsUnion(field.value.type)) {\n        std::string type =\n            GenTypeName(imports, struct_def, field.value.type, true);\n\n        code += namer_.LegacyTsMutateMethod(field) + \"(value:\" + type +\n                \"):boolean {\\n\";\n\n        const std::string write_method =\n            \".\" + namer_.Method(\"write\", GenType(field.value.type));\n\n        if (struct_def.fixed) {\n          code += \"  \" + GenBBAccess() + write_method + \"(this.bb_pos + \" +\n                  NumToString(field.value.offset) + \", \";\n        } else {\n          code += \"  const offset = \" + GenBBAccess() +\n                  \".__offset(this.bb_pos, \" + NumToString(field.value.offset) +\n                  \");\\n\\n\";\n          code += \"  if (offset === 0) {\\n\";\n          code += \"    return false;\\n\";\n          code += \"  }\\n\\n\";\n\n          code +=\n              \"  \" + GenBBAccess() + write_method + \"(this.bb_pos + offset, \";\n        }\n\n        // special case for bools, which are treated as uint8\n        if (field.value.type.base_type == BASE_TYPE_BOOL) {\n          code += \"+\";\n        }\n\n        code += \"value);\\n\";\n        code += \"  return true;\\n\";\n        code += \"}\\n\\n\";\n      }\n\n      // Emit vector helpers\n      if (IsVector(field.value.type)) {\n        // Emit a length helper\n        GenDocComment(code_ptr);\n        code += namer_.Method(field, \"Length\");\n        code += \"():number {\\n\" + offset_prefix + \"offset ? \";\n\n        code +=\n            GenBBAccess() + \".__vector_len(this.bb_pos + offset) : 0;\\n}\\n\\n\";\n\n        // For scalar types, emit a typed array helper\n        auto vectorType = field.value.type.VectorType();\n        if (IsScalar(vectorType.base_type) && !IsLong(vectorType.base_type)) {\n          GenDocComment(code_ptr);\n\n          code += namer_.Method(field, \"Array\");\n\n          std::string return_type =\n              (field.IsRequired() || HasDefaultValue(field))\n                  ? \"Array\"\n                  : (\"Array|\" + null_keyword_);\n          if (field.IsRequired()) {\n            code += \"():\" + GenType(vectorType) + return_type + \" {\\n\" +\n                    offset_prefix + \"new \" + GenType(vectorType) + \"Array(\" +\n                    GenBBAccess() + \".bytes().buffer, \" + GenBBAccess() +\n                    \".bytes().byteOffset + \" + GenBBAccess() +\n                    \".__vector(this.bb_pos + offset), \" + GenBBAccess() +\n                    \".__vector_len(this.bb_pos + offset));\\n}\\n\\n\";\n          } else {\n            std::string value = HasDefaultValue(field)\n                                    ? \"new \" + GenType(vectorType) + \"Array()\"\n                                    : \"null\";\n            code += \"():\" + GenType(vectorType) + return_type + \" {\\n\" +\n                    offset_prefix + \"offset ? new \" + GenType(vectorType) +\n                    \"Array(\" + GenBBAccess() + \".bytes().buffer, \" +\n                    GenBBAccess() + \".bytes().byteOffset + \" + GenBBAccess() +\n                    \".__vector(this.bb_pos + offset), \" + GenBBAccess() +\n                    \".__vector_len(this.bb_pos + offset)) : \" + value +\n                    \";\\n}\\n\\n\";\n          }\n        }\n      }\n    }\n\n    // Emit the fully qualified name\n    if (parser_.opts.generate_name_strings) {\n      const std::string fullyQualifiedName =\n          struct_def.defined_namespace->GetFullyQualifiedName(struct_def.name);\n\n      GenDocComment(code_ptr);\n      code += \"static getFullyQualifiedName(): \\\"\";\n      code += fullyQualifiedName;\n      code += \"\\\" {\\n\";\n      code += \"  return '\" + fullyQualifiedName + \"';\\n\";\n      code += \"}\\n\\n\";\n    }\n\n    // Emit the size of the struct.\n    if (struct_def.fixed) {\n      GenDocComment(code_ptr);\n      code += \"static sizeOf():number {\\n\";\n      code += \"  return \" + NumToString(struct_def.bytesize) + \";\\n\";\n      code += \"}\\n\\n\";\n    }\n\n    // Emit a factory constructor\n    if (struct_def.fixed) {\n      std::string arguments;\n      GenStructArgs(imports, struct_def, struct_def, &arguments, \"\");\n      GenDocComment(code_ptr);\n\n      code += \"static create\" + GetPrefixedName(struct_def) +\n              \"(builder:flatbuffers.Builder\";\n      code += arguments + \"):flatbuffers.Offset {\\n\";\n\n      GenStructBody(struct_def, &code, \"\");\n      code += \"  return builder.offset();\\n}\\n\\n\";\n    } else {\n      // Generate a method to start building a new object\n      GenDocComment(code_ptr);\n\n      code += \"static start\" + GetPrefixedName(struct_def) +\n              \"(builder:flatbuffers.Builder) {\\n\";\n\n      code += \"  builder.startObject(\" +\n              NumToString(struct_def.fields.vec.size()) + \");\\n\";\n      code += \"}\\n\\n\";\n\n      // Generate a set of static methods that allow table construction\n      for (auto it = struct_def.fields.vec.begin();\n           it != struct_def.fields.vec.end(); ++it) {\n        auto& field = **it;\n        if (field.deprecated) continue;\n        const auto argname = GetArgName(field);\n\n        // Generate the field insertion method\n        GenDocComment(code_ptr);\n        code += \"static \" + namer_.Method(\"add\", field);\n        code += \"(builder:flatbuffers.Builder, \" + argname + \":\" +\n                GetArgType(imports, struct_def, field, false) + \") {\\n\";\n        code += \"  builder.addField\" + GenWriteMethod(field.value.type) + \"(\";\n        code += NumToString(it - struct_def.fields.vec.begin()) + \", \";\n        if (field.value.type.base_type == BASE_TYPE_BOOL) {\n          code += \"+\";\n        }\n        code += argname + \", \";\n        if (!IsScalar(field.value.type.base_type)) {\n          code += \"0\";\n        } else if (HasNullDefault(field)) {\n          code += null_keyword_;\n        } else {\n          if (field.value.type.base_type == BASE_TYPE_BOOL) {\n            code += \"+\";\n          }\n          code += GenDefaultValue(field, imports);\n        }\n        code += \");\\n}\\n\\n\";\n\n        if (IsVector(field.value.type)) {\n          auto vector_type = field.value.type.VectorType();\n          auto type = GetUnderlyingVectorType(vector_type);\n          auto alignment = InlineAlignment(type);\n          auto elem_size = InlineSize(type);\n\n          // Generate a method to create a vector from a JavaScript array\n          if (!IsStruct(vector_type)) {\n            GenDocComment(code_ptr);\n\n            const std::string sig_begin =\n                \"static \" + namer_.Method(\"create\", field, \"Vector\") +\n                \"(builder:flatbuffers.Builder, data:\";\n            const std::string sig_end = \"):flatbuffers.Offset\";\n            std::string type =\n                GenTypeName(imports, struct_def, vector_type, true) + \"[]\";\n            if (type == \"number[]\") {\n              const auto& array_type = GenType(vector_type);\n              // the old type should be deprecated in the future\n              std::string type_old = \"number[]|Uint8Array\";\n              std::string type_new = \"number[]|\" + array_type + \"Array\";\n              if (type_old == type_new) {\n                type = type_new;\n              } else {\n                // add function overloads\n                code += sig_begin + type_new + sig_end + \";\\n\";\n                code +=\n                    \"/**\\n * @deprecated This Uint8Array overload will \"\n                    \"be removed in the future.\\n */\\n\";\n                code += sig_begin + type_old + sig_end + \";\\n\";\n                type = type_new + \"|Uint8Array\";\n              }\n            }\n            code += sig_begin + type + sig_end + \" {\\n\";\n            code += \"  builder.startVector(\" + NumToString(elem_size);\n            code += \", data.length, \" + NumToString(alignment) + \");\\n\";\n            code += \"  for (let i = data.length - 1; i >= 0; i--) {\\n\";\n            code += \"    builder.add\" + GenWriteMethod(vector_type) + \"(\";\n            if (vector_type.base_type == BASE_TYPE_BOOL) {\n              code += \"+\";\n            }\n            code += \"data[i]!);\\n\";\n            code += \"  }\\n\";\n            code += \"  return builder.endVector();\\n\";\n            code += \"}\\n\\n\";\n          }\n\n          // Generate a method to start a vector, data to be added manually\n          // after\n          GenDocComment(code_ptr);\n\n          code += \"static \";\n          code += namer_.Method(\"start\", field, \"Vector\");\n          code += \"(builder:flatbuffers.Builder, numElems:number) {\\n\";\n          code += \"  builder.startVector(\" + NumToString(elem_size);\n          code += \", numElems, \" + NumToString(alignment) + \");\\n\";\n          code += \"}\\n\\n\";\n        }\n      }\n\n      // Generate a method to stop building a new object\n      GenDocComment(code_ptr);\n\n      code += \"static end\" + GetPrefixedName(struct_def);\n      code += \"(builder:flatbuffers.Builder):flatbuffers.Offset {\\n\";\n\n      code += \"  const offset = builder.endObject();\\n\";\n      for (auto it = struct_def.fields.vec.begin();\n           it != struct_def.fields.vec.end(); ++it) {\n        auto& field = **it;\n        if (!field.deprecated && field.IsRequired()) {\n          code += \"  builder.requiredField(offset, \";\n          code += NumToString(field.value.offset);\n          code += \") // \" + field.name + \"\\n\";\n        }\n      }\n      code += \"  return offset;\\n\";\n      code += \"}\\n\\n\";\n\n      // Generate the methods to complete buffer construction\n      GenerateFinisher(struct_def, code_ptr, code, false);\n      GenerateFinisher(struct_def, code_ptr, code, true);\n\n      // Generate a convenient CreateX function\n      if (CanCreateFactoryMethod(struct_def)) {\n        code += \"static create\" + GetPrefixedName(struct_def);\n        code += \"(builder:flatbuffers.Builder\";\n        for (auto it = struct_def.fields.vec.begin();\n             it != struct_def.fields.vec.end(); ++it) {\n          const auto& field = **it;\n          if (field.deprecated) continue;\n          code += \", \" + GetArgName(field) + \":\" +\n                  GetArgType(imports, struct_def, field, true);\n        }\n\n        code += \"):flatbuffers.Offset {\\n\";\n        code += \"  \" + object_name + \".start\" + GetPrefixedName(struct_def) +\n                \"(builder);\\n\";\n\n        std::string methodPrefix = object_name;\n        for (auto it = struct_def.fields.vec.begin();\n             it != struct_def.fields.vec.end(); ++it) {\n          const auto& field = **it;\n          if (field.deprecated) continue;\n\n          const auto arg_name = GetArgName(field);\n\n          if (field.IsScalarOptional()) {\n            code += \"  if (\" + arg_name + \" !== \" + null_keyword_ + \")\\n  \";\n          }\n\n          code += \"  \" + methodPrefix + \".\" + namer_.Method(\"add\", field) + \"(\";\n          code += \"builder, \" + arg_name + \");\\n\";\n        }\n\n        code += \"  return \" + methodPrefix + \".end\" +\n                GetPrefixedName(struct_def) + \"(builder);\\n\";\n        code += \"}\\n\";\n      }\n    }\n\n    if (!struct_def.fixed && parser_.services_.vec.size() != 0) {\n      auto name = GetPrefixedName(struct_def, \"\");\n      code += \"\\n\";\n      code += \"serialize():Uint8Array {\\n\";\n      code += \"  return this.bb!.bytes();\\n\";\n      code += \"}\\n\";\n\n      code += \"\\n\";\n      code += \"static deserialize(buffer: Uint8Array):\" +\n              namer_.EscapeKeyword(name) + \" {\\n\";\n      code += \"  return \" + AddImport(imports, struct_def, struct_def).name +\n              \".getRootAs\" + name + \"(new flatbuffers.ByteBuffer(buffer))\\n\";\n      code += \"}\\n\";\n    }\n\n    if (parser_.opts.generate_object_based_api) {\n      std::string obj_api_class;\n      std::string obj_api_unpack_func;\n      GenObjApi(parser_, struct_def, obj_api_unpack_func, obj_api_class,\n                imports);\n\n      code += obj_api_unpack_func + \"}\\n\" + obj_api_class;\n    } else {\n      code += \"}\\n\";\n    }\n  }\n\n  bool HasNullDefault(const FieldDef& field) {\n    return field.IsOptional() && field.value.constant == \"null\";\n  }\n\n  static bool HasDefaultValue(const FieldDef& field) {\n    switch (field.value.type.base_type) {\n      // These types can't have defaults\n      case BASE_TYPE_UNION:\n      case BASE_TYPE_STRUCT: {\n        return false;\n      }\n\n      // Arrays always have a default (empty array)\n      case BASE_TYPE_ARRAY:\n        return true;\n\n      // The only supported default for vectors is []\n      case BASE_TYPE_VECTOR:\n        return field.value.constant == \"[]\";\n\n      // Even strings are presumed to be null-default if the default value is\n      // \"0\", this is intended behavior.\n      case BASE_TYPE_STRING: {\n        return field.value.constant != \"0\" && field.value.constant != \"null\";\n      }\n\n      default: {\n        return field.value.constant != \"null\";\n      }\n    }\n  }\n\n  std::string GetArgType(import_set& imports, const Definition& owner,\n                         const FieldDef& field, bool allowNull) {\n    return GenTypeName(imports, owner, field.value.type, true,\n                       allowNull && field.IsOptional());\n  }\n\n  std::string GetArgName(const FieldDef& field) {\n    auto argname = namer_.Variable(field);\n    if (!IsScalar(field.value.type.base_type)) {\n      argname += \"Offset\";\n    }\n    return argname;\n  }\n\n  std::string GetPrefixedName(const StructDef& struct_def,\n                              const char* prefix = \"\") {\n    return prefix + struct_def.name;\n  }\n};  // namespace ts\n}  // namespace ts\n\nstatic bool GenerateTS(const Parser& parser, const std::string& path,\n                       const std::string& file_name) {\n  ts::TsGenerator generator(parser, path, file_name);\n  return generator.generate();\n}\n\nstatic std::string TSMakeRule(const Parser& parser, const std::string& path,\n                              const std::string& file_name) {\n  std::string filebase =\n      flatbuffers::StripPath(flatbuffers::StripExtension(file_name));\n  ts::TsGenerator generator(parser, path, file_name);\n  std::string make_rule =\n      generator.GeneratedFileName(path, filebase, parser.opts) + \": \";\n\n  auto included_files = parser.GetIncludedFilesRecursive(file_name);\n  for (auto it = included_files.begin(); it != included_files.end(); ++it) {\n    make_rule += \" \" + *it;\n  }\n  return make_rule;\n}\n\nnamespace {\n\nclass TsCodeGenerator : public CodeGenerator {\n public:\n  Status GenerateCode(const Parser& parser, const std::string& path,\n                      const std::string& filename) override {\n    if (!GenerateTS(parser, path, filename)) {\n      return Status::ERROR;\n    }\n    return Status::OK;\n  }\n\n  Status GenerateCode(const uint8_t*, int64_t, const CodeGenOptions&) override {\n    return Status::NOT_IMPLEMENTED;\n  }\n\n  Status GenerateMakeRule(const Parser& parser, const std::string& path,\n                          const std::string& filename,\n                          std::string& output) override {\n    output = TSMakeRule(parser, path, filename);\n    return Status::OK;\n  }\n\n  Status GenerateGrpcCode(const Parser& parser, const std::string& path,\n                          const std::string& filename) override {\n    if (!GenerateTSGRPC(parser, path, filename)) {\n      return Status::ERROR;\n    }\n    return Status::OK;\n  }\n\n  Status GenerateRootFile(const Parser& parser,\n                          const std::string& path) override {\n    (void)parser;\n    (void)path;\n    return Status::NOT_IMPLEMENTED;\n  }\n  bool IsSchemaOnly() const override { return true; }\n\n  bool SupportsBfbsGeneration() const override { return false; }\n  bool SupportsRootFileGeneration() const override { return false; }\n\n  IDLOptions::Language Language() const override { return IDLOptions::kTs; }\n\n  std::string LanguageName() const override { return \"TS\"; }\n};\n}  // namespace\n\nstd::unique_ptr<CodeGenerator> NewTsCodeGenerator() {\n  return std::unique_ptr<TsCodeGenerator>(new TsCodeGenerator());\n}\n\n}  // namespace flatbuffers\n"
  },
  {
    "path": "src/idl_gen_ts.h",
    "content": "/*\n * Copyright 2023 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef FLATBUFFERS_IDL_GEN_TS_H_\n#define FLATBUFFERS_IDL_GEN_TS_H_\n\n#include <memory>\n#include <string>\n\n#include \"flatbuffers/code_generator.h\"\n\nnamespace flatbuffers {\n\n// Constructs a new Ts code generator.\nstd::unique_ptr<CodeGenerator> NewTsCodeGenerator();\n\n}  // namespace flatbuffers\n\n#endif  // FLATBUFFERS_IDL_GEN_TS_H_\n"
  },
  {
    "path": "src/idl_namer.h",
    "content": "#ifndef FLATBUFFERS_IDL_NAMER_H_\n#define FLATBUFFERS_IDL_NAMER_H_\n\n#include \"codegen/idl_namer.h\"\n\n#endif  // FLATBUFFERS_IDL_NAMER_H_\n"
  },
  {
    "path": "src/idl_parser.cpp",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include <algorithm>\n#include <cmath>\n#include <iostream>\n#include <list>\n#include <string>\n#include <utility>\n\n#include \"flatbuffers/base.h\"\n#include \"flatbuffers/buffer.h\"\n#include \"flatbuffers/idl.h\"\n#include \"flatbuffers/reflection_generated.h\"\n#include \"flatbuffers/util.h\"\n\nnamespace flatbuffers {\n\n// Reflects the version at the compiling time of binary(lib/dll/so).\nconst char* FLATBUFFERS_VERSION() {\n  // clang-format off\n  return\n      FLATBUFFERS_STRING(FLATBUFFERS_VERSION_MAJOR) \".\"\n      FLATBUFFERS_STRING(FLATBUFFERS_VERSION_MINOR) \".\"\n      FLATBUFFERS_STRING(FLATBUFFERS_VERSION_REVISION);\n  // clang-format on\n}\n\nnamespace {\n\nstatic const double kPi = 3.14159265358979323846;\n\n// The enums in the reflection schema should match the ones we use internally.\n// Compare the last element to check if these go out of sync.\nstatic_assert(BASE_TYPE_VECTOR64 ==\n                  static_cast<BaseType>(reflection::MaxBaseType - 1),\n              \"enums don't match\");\n\n// Any parsing calls have to be wrapped in this macro, which automates\n// handling of recursive error checking a bit. It will check the received\n// CheckedError object, and return straight away on error.\n#define ECHECK(call)           \\\n  {                            \\\n    auto ce = (call);          \\\n    if (ce.Check()) return ce; \\\n  }\n\n// These two functions are called hundreds of times below, so define a short\n// form:\n#define NEXT() ECHECK(Next())\n#define EXPECT(tok) ECHECK(Expect(tok))\n\nstatic bool ValidateUTF8(const std::string& str) {\n  const char* s = &str[0];\n  const char* const sEnd = s + str.length();\n  while (s < sEnd) {\n    if (FromUTF8(&s) < 0) {\n      return false;\n    }\n  }\n  return true;\n}\n\nstatic bool IsLowerSnakeCase(const std::string& str) {\n  for (size_t i = 0; i < str.length(); i++) {\n    char c = str[i];\n    if (!check_ascii_range(c, 'a', 'z') && !is_digit(c) && c != '_') {\n      return false;\n    }\n  }\n  return true;\n}\n\nstatic void DeserializeDoc(std::vector<std::string>& doc,\n                           const Vector<Offset<String>>* documentation) {\n  if (documentation == nullptr) return;\n  for (uoffset_t index = 0; index < documentation->size(); index++)\n    doc.push_back(documentation->Get(index)->str());\n}\n\nstatic CheckedError NoError() { return CheckedError(false); }\n\ntemplate <typename T>\nstatic std::string TypeToIntervalString() {\n  return \"[\" + NumToString((flatbuffers::numeric_limits<T>::lowest)()) + \"; \" +\n         NumToString((flatbuffers::numeric_limits<T>::max)()) + \"]\";\n}\n\n// atot: template version of atoi/atof: convert a string to an instance of T.\ntemplate <typename T>\nstatic bool atot_scalar(const char* s, T* val, bool_constant<false>) {\n  return StringToNumber(s, val);\n}\n\ntemplate <typename T>\nstatic bool atot_scalar(const char* s, T* val, bool_constant<true>) {\n  // Normalize NaN parsed from fbs or json to unsigned NaN.\n  if (false == StringToNumber(s, val)) return false;\n  *val = (*val != *val) ? std::fabs(*val) : *val;\n  return true;\n}\n\ntemplate <typename T>\nstatic CheckedError atot(const char* s, Parser& parser, T* val) {\n  auto done = atot_scalar(s, val, bool_constant<is_floating_point<T>::value>());\n  if (done) return NoError();\n  if (0 == *val)\n    return parser.Error(\"invalid number: \\\"\" + std::string(s) + \"\\\"\");\n  else\n    return parser.Error(\"invalid number: \\\"\" + std::string(s) + \"\\\"\" +\n                        \", constant does not fit \" + TypeToIntervalString<T>());\n}\ntemplate <>\nCheckedError atot<Offset<void>>(const char* s, Parser& parser,\n                                Offset<void>* val) {\n  (void)parser;\n  *val = Offset<void>(atoi(s));\n  return NoError();\n}\n\ntemplate <>\nCheckedError atot<Offset64<void>>(const char* s, Parser& parser,\n                                  Offset64<void>* val) {\n  (void)parser;\n  *val = Offset64<void>(atoi(s));\n  return NoError();\n}\n\ntemplate <typename T>\nstatic T* LookupTableByName(const SymbolTable<T>& table,\n                            const std::string& name,\n                            const Namespace& current_namespace,\n                            size_t skip_top) {\n  const auto& components = current_namespace.components;\n  if (table.dict.empty()) return nullptr;\n  if (components.size() < skip_top) return nullptr;\n  const auto N = components.size() - skip_top;\n  std::string full_name;\n  for (size_t i = 0; i < N; i++) {\n    full_name += components[i];\n    full_name += '.';\n  }\n  for (size_t i = N; i > 0; i--) {\n    full_name += name;\n    auto obj = table.Lookup(full_name);\n    if (obj) return obj;\n    auto len = full_name.size() - components[i - 1].size() - 1 - name.size();\n    full_name.resize(len);\n  }\n  FLATBUFFERS_ASSERT(full_name.empty());\n  return table.Lookup(name);  // lookup in global namespace\n}\n\n// Declare tokens we'll use. Single character tokens are represented by their\n// ascii character code (e.g. '{'), others above 256.\n// clang-format off\n#define FLATBUFFERS_GEN_TOKENS(TD) \\\n  TD(Eof, 256, \"end of file\") \\\n  TD(StringConstant, 257, \"string constant\") \\\n  TD(IntegerConstant, 258, \"integer constant\") \\\n  TD(FloatConstant, 259, \"float constant\") \\\n  TD(Identifier, 260, \"identifier\")\n#ifdef __GNUC__\n__extension__  // Stop GCC complaining about trailing comma with -Wpendantic.\n#endif\nenum {\n  #define FLATBUFFERS_TOKEN(NAME, VALUE, STRING) kToken ## NAME = VALUE,\n    FLATBUFFERS_GEN_TOKENS(FLATBUFFERS_TOKEN)\n  #undef FLATBUFFERS_TOKEN\n};\n\nstatic std::string TokenToString(int t) {\n  static const char * const tokens[] = {\n    #define FLATBUFFERS_TOKEN(NAME, VALUE, STRING) STRING,\n      FLATBUFFERS_GEN_TOKENS(FLATBUFFERS_TOKEN)\n    #undef FLATBUFFERS_TOKEN\n    #define FLATBUFFERS_TD(ENUM, IDLTYPE, ...) \\\n      IDLTYPE,\n      FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)\n    #undef FLATBUFFERS_TD\n  };\n  if (t < 256) {  // A single ascii char token.\n    std::string s;\n    s.append(1, static_cast<char>(t));\n    return s;\n  } else {       // Other tokens.\n    return tokens[t - 256];\n  }\n}\n// clang-format on\n\nstatic bool IsIdentifierStart(char c) { return is_alpha(c) || (c == '_'); }\n\nstatic bool CompareSerializedScalars(const uint8_t* a, const uint8_t* b,\n                                     const FieldDef& key) {\n  switch (key.value.type.base_type) {\n#define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...)       \\\n  case BASE_TYPE_##ENUM: {                              \\\n    CTYPE def = static_cast<CTYPE>(0);                  \\\n    if (!a || !b) {                                     \\\n      StringToNumber(key.value.constant.c_str(), &def); \\\n    }                                                   \\\n    const auto av = a ? ReadScalar<CTYPE>(a) : def;     \\\n    const auto bv = b ? ReadScalar<CTYPE>(b) : def;     \\\n    return av < bv;                                     \\\n  }\n    FLATBUFFERS_GEN_TYPES_SCALAR(FLATBUFFERS_TD)\n#undef FLATBUFFERS_TD\n    default: {\n      FLATBUFFERS_ASSERT(false && \"scalar type expected\");\n      return false;\n    }\n  }\n}\n\nstatic bool CompareTablesByScalarKey(const Offset<Table>* _a,\n                                     const Offset<Table>* _b,\n                                     const FieldDef& key) {\n  const voffset_t offset = key.value.offset;\n  // Indirect offset pointer to table pointer.\n  auto a = reinterpret_cast<const uint8_t*>(_a) + ReadScalar<uoffset_t>(_a);\n  auto b = reinterpret_cast<const uint8_t*>(_b) + ReadScalar<uoffset_t>(_b);\n  // Fetch field address from table.\n  a = reinterpret_cast<const Table*>(a)->GetAddressOf(offset);\n  b = reinterpret_cast<const Table*>(b)->GetAddressOf(offset);\n  return CompareSerializedScalars(a, b, key);\n}\n\nstatic bool CompareTablesByStringKey(const Offset<Table>* _a,\n                                     const Offset<Table>* _b,\n                                     const FieldDef& key) {\n  const voffset_t offset = key.value.offset;\n  // Indirect offset pointer to table pointer.\n  auto a = reinterpret_cast<const uint8_t*>(_a) + ReadScalar<uoffset_t>(_a);\n  auto b = reinterpret_cast<const uint8_t*>(_b) + ReadScalar<uoffset_t>(_b);\n  // Fetch field address from table.\n  a = reinterpret_cast<const Table*>(a)->GetAddressOf(offset);\n  b = reinterpret_cast<const Table*>(b)->GetAddressOf(offset);\n  if (a && b) {\n    // Indirect offset pointer to string pointer.\n    a += ReadScalar<uoffset_t>(a);\n    b += ReadScalar<uoffset_t>(b);\n    return *reinterpret_cast<const String*>(a) <\n           *reinterpret_cast<const String*>(b);\n  } else {\n    return a ? true : false;\n  }\n}\n\nstatic void SwapSerializedTables(Offset<Table>* a, Offset<Table>* b) {\n  // These are serialized offsets, so are relative where they are\n  // stored in memory, so compute the distance between these pointers:\n  ptrdiff_t diff = (b - a) * sizeof(Offset<Table>);\n  FLATBUFFERS_ASSERT(diff >= 0);  // Guaranteed by SimpleQsort.\n  auto udiff = static_cast<uoffset_t>(diff);\n  a->o = EndianScalar(ReadScalar<uoffset_t>(a) - udiff);\n  b->o = EndianScalar(ReadScalar<uoffset_t>(b) + udiff);\n  std::swap(*a, *b);\n}\n\n// See below for why we need our own sort :(\ntemplate <typename T, typename F, typename S>\nstatic void SimpleQsort(T* begin, T* end, size_t width, F comparator,\n                        S swapper) {\n  if (end - begin <= static_cast<ptrdiff_t>(width)) return;\n  auto l = begin + width;\n  auto r = end;\n  while (l < r) {\n    if (comparator(begin, l)) {\n      r -= width;\n      swapper(l, r);\n    } else {\n      l += width;\n    }\n  }\n  l -= width;\n  swapper(begin, l);\n  SimpleQsort(begin, l, width, comparator, swapper);\n  SimpleQsort(r, end, width, comparator, swapper);\n}\n\ntemplate <typename T>\nstatic inline void SingleValueRepack(Value& e, T val) {\n  // Remove leading zeros.\n  if (IsInteger(e.type.base_type)) {\n    e.constant = NumToString(val);\n  }\n}\n\n#if defined(FLATBUFFERS_HAS_NEW_STRTOD) && (FLATBUFFERS_HAS_NEW_STRTOD > 0)\n// Normalize defaults NaN to unsigned quiet-NaN(0) if value was parsed from\n// hex-float literal.\nstatic void SingleValueRepack(Value& e, float val) {\n  if (val != val) e.constant = \"nan\";\n}\nstatic void SingleValueRepack(Value& e, double val) {\n  if (val != val) e.constant = \"nan\";\n}\n#endif\n\ntemplate <typename T>\nstatic uint64_t EnumDistanceImpl(T e1, T e2) {\n  if (e1 < e2) {\n    std::swap(e1, e2);\n  }  // use std for scalars\n  // Signed overflow may occur, use unsigned calculation.\n  // The unsigned overflow is well-defined by C++ standard (modulo 2^n).\n  return static_cast<uint64_t>(e1) - static_cast<uint64_t>(e2);\n}\n\nstatic bool compareFieldDefs(const FieldDef* a, const FieldDef* b) {\n  auto a_id = atoi(a->attributes.Lookup(\"id\")->constant.c_str());\n  auto b_id = atoi(b->attributes.Lookup(\"id\")->constant.c_str());\n  return a_id < b_id;\n}\n\nstatic Namespace* GetNamespace(\n    const std::string& qualified_name, std::vector<Namespace*>& namespaces,\n    std::map<std::string, Namespace*>& namespaces_index) {\n  size_t dot = qualified_name.find_last_of('.');\n  std::string namespace_name = (dot != std::string::npos)\n                                   ? std::string(qualified_name.c_str(), dot)\n                                   : \"\";\n  Namespace*& ns = namespaces_index[namespace_name];\n\n  if (!ns) {\n    ns = new Namespace();\n    namespaces.push_back(ns);\n\n    size_t pos = 0;\n\n    for (;;) {\n      dot = qualified_name.find('.', pos);\n      if (dot == std::string::npos) {\n        break;\n      }\n      ns->components.push_back(qualified_name.substr(pos, dot - pos));\n      pos = dot + 1;\n    }\n  }\n\n  return ns;\n}\n\n// Generate a unique hash for a file based on its name and contents (if any).\nstatic uint64_t HashFile(const char* source_filename, const char* source) {\n  uint64_t hash = 0;\n\n  if (source_filename)\n    hash = HashFnv1a<uint64_t>(StripPath(source_filename).c_str());\n\n  if (source && *source) hash ^= HashFnv1a<uint64_t>(source);\n\n  return hash;\n}\n\ntemplate <typename T>\nstatic bool compareName(const T* a, const T* b) {\n  return a->defined_namespace->GetFullyQualifiedName(a->name) <\n         b->defined_namespace->GetFullyQualifiedName(b->name);\n}\n\ntemplate <typename T>\nstatic void AssignIndices(const std::vector<T*>& defvec) {\n  // Pre-sort these vectors, such that we can set the correct indices for them.\n  auto vec = defvec;\n  std::sort(vec.begin(), vec.end(), compareName<T>);\n  for (int i = 0; i < static_cast<int>(vec.size()); i++) vec[i]->index = i;\n}\n\n}  // namespace\n\nvoid Parser::Message(const std::string& msg) {\n  if (!error_.empty()) error_ += \"\\n\";  // log all warnings and errors\n  error_ += file_being_parsed_.length() ? AbsolutePath(file_being_parsed_) : \"\";\n  // clang-format off\n\n  #ifdef _WIN32  // MSVC alike\n    error_ +=\n        \"(\" + NumToString(line_) + \", \" + NumToString(CursorPosition()) + \")\";\n  #else  // gcc alike\n    if (file_being_parsed_.length()) error_ += \":\";\n    error_ += NumToString(line_) + \": \" + NumToString(CursorPosition());\n  #endif\n  // clang-format on\n  error_ += \": \" + msg;\n}\n\nvoid Parser::Warning(const std::string& msg) {\n  if (!opts.no_warnings) {\n    Message(\"warning: \" + msg);\n    has_warning_ = true;  // for opts.warnings_as_errors\n  }\n}\n\nCheckedError Parser::Error(const std::string& msg) {\n  Message(\"error: \" + msg);\n  return CheckedError(true);\n}\n\nCheckedError Parser::RecurseError() {\n  return Error(\"maximum parsing depth \" + NumToString(parse_depth_counter_) +\n               \" reached\");\n}\n\nconst std::string& Parser::GetPooledString(const std::string& s) const {\n  return *(string_cache_.insert(s).first);\n}\n\nclass Parser::ParseDepthGuard {\n public:\n  explicit ParseDepthGuard(Parser* parser_not_null)\n      : parser_(*parser_not_null), caller_depth_(parser_.parse_depth_counter_) {\n    FLATBUFFERS_ASSERT(caller_depth_ <= (FLATBUFFERS_MAX_PARSING_DEPTH) &&\n                       \"Check() must be called to prevent stack overflow\");\n    parser_.parse_depth_counter_ += 1;\n  }\n\n  ~ParseDepthGuard() { parser_.parse_depth_counter_ -= 1; }\n\n  CheckedError Check() {\n    return caller_depth_ >= (FLATBUFFERS_MAX_PARSING_DEPTH)\n               ? parser_.RecurseError()\n               : CheckedError(false);\n  }\n\n  FLATBUFFERS_DELETE_FUNC(ParseDepthGuard(const ParseDepthGuard&));\n  FLATBUFFERS_DELETE_FUNC(ParseDepthGuard& operator=(const ParseDepthGuard&));\n\n private:\n  Parser& parser_;\n  const int caller_depth_;\n};\n\nstd::string Namespace::GetFullyQualifiedName(const std::string& name,\n                                             size_t max_components) const {\n  // Early exit if we don't have a defined namespace.\n  if (components.empty() || !max_components) {\n    return name;\n  }\n  std::string stream_str;\n  for (size_t i = 0; i < std::min(components.size(), max_components); i++) {\n    stream_str += components[i];\n    stream_str += '.';\n  }\n  if (!stream_str.empty()) stream_str.pop_back();\n  if (name.length()) {\n    stream_str += '.';\n    stream_str += name;\n  }\n  return stream_str;\n}\n\nstd::string Parser::TokenToStringId(int t) const {\n  return t == kTokenIdentifier ? attribute_ : TokenToString(t);\n}\n\n// Parses exactly nibbles worth of hex digits into a number, or error.\nCheckedError Parser::ParseHexNum(int nibbles, uint64_t* val) {\n  FLATBUFFERS_ASSERT(nibbles > 0);\n  for (int i = 0; i < nibbles; i++)\n    if (!is_xdigit(cursor_[i]))\n      return Error(\"escape code must be followed by \" + NumToString(nibbles) +\n                   \" hex digits\");\n  std::string target(cursor_, cursor_ + nibbles);\n  *val = StringToUInt(target.c_str(), 16);\n  cursor_ += nibbles;\n  return NoError();\n}\n\nCheckedError Parser::SkipByteOrderMark() {\n  if (static_cast<unsigned char>(*cursor_) != 0xef) return NoError();\n  cursor_++;\n  if (static_cast<unsigned char>(*cursor_) != 0xbb)\n    return Error(\"invalid utf-8 byte order mark\");\n  cursor_++;\n  if (static_cast<unsigned char>(*cursor_) != 0xbf)\n    return Error(\"invalid utf-8 byte order mark\");\n  cursor_++;\n  return NoError();\n}\n\nCheckedError Parser::Next() {\n  doc_comment_.clear();\n  prev_cursor_ = cursor_;\n  bool seen_newline = cursor_ == source_;\n  attribute_.clear();\n  attr_is_trivial_ascii_string_ = true;\n  for (;;) {\n    char c = *cursor_++;\n    token_ = c;\n    switch (c) {\n      case '\\0':\n        cursor_--;\n        token_ = kTokenEof;\n        return NoError();\n      case ' ':\n      case '\\r':\n      case '\\t':\n        break;\n      case '\\n':\n        MarkNewLine();\n        seen_newline = true;\n        break;\n      case '{':\n      case '}':\n      case '(':\n      case ')':\n      case '[':\n      case ']':\n      case '<':\n      case '>':\n      case ',':\n      case ':':\n      case ';':\n      case '=':\n        return NoError();\n      case '\\\"':\n      case '\\'': {\n        int unicode_high_surrogate = -1;\n\n        while (*cursor_ != c) {\n          if (*cursor_ < ' ' && static_cast<signed char>(*cursor_) >= 0)\n            return Error(\"illegal character in string constant\");\n          if (*cursor_ == '\\\\') {\n            attr_is_trivial_ascii_string_ = false;  // has escape sequence\n            cursor_++;\n            if (unicode_high_surrogate != -1 && *cursor_ != 'u') {\n              return Error(\n                  \"illegal Unicode sequence (unpaired high surrogate)\");\n            }\n            switch (*cursor_) {\n              case 'n':\n                attribute_ += '\\n';\n                cursor_++;\n                break;\n              case 't':\n                attribute_ += '\\t';\n                cursor_++;\n                break;\n              case 'r':\n                attribute_ += '\\r';\n                cursor_++;\n                break;\n              case 'b':\n                attribute_ += '\\b';\n                cursor_++;\n                break;\n              case 'f':\n                attribute_ += '\\f';\n                cursor_++;\n                break;\n              case '\\\"':\n                attribute_ += '\\\"';\n                cursor_++;\n                break;\n              case '\\'':\n                attribute_ += '\\'';\n                cursor_++;\n                break;\n              case '\\\\':\n                attribute_ += '\\\\';\n                cursor_++;\n                break;\n              case '/':\n                attribute_ += '/';\n                cursor_++;\n                break;\n              case 'x': {  // Not in the JSON standard\n                cursor_++;\n                uint64_t val;\n                ECHECK(ParseHexNum(2, &val));\n                attribute_ += static_cast<char>(val);\n                break;\n              }\n              case 'u': {\n                cursor_++;\n                uint64_t val;\n                ECHECK(ParseHexNum(4, &val));\n                if (val >= 0xD800 && val <= 0xDBFF) {\n                  if (unicode_high_surrogate != -1) {\n                    return Error(\n                        \"illegal Unicode sequence (multiple high surrogates)\");\n                  } else {\n                    unicode_high_surrogate = static_cast<int>(val);\n                  }\n                } else if (val >= 0xDC00 && val <= 0xDFFF) {\n                  if (unicode_high_surrogate == -1) {\n                    return Error(\n                        \"illegal Unicode sequence (unpaired low surrogate)\");\n                  } else {\n                    int code_point = 0x10000 +\n                                     ((unicode_high_surrogate & 0x03FF) << 10) +\n                                     (val & 0x03FF);\n                    ToUTF8(code_point, &attribute_);\n                    unicode_high_surrogate = -1;\n                  }\n                } else {\n                  if (unicode_high_surrogate != -1) {\n                    return Error(\n                        \"illegal Unicode sequence (unpaired high surrogate)\");\n                  }\n                  ToUTF8(static_cast<int>(val), &attribute_);\n                }\n                break;\n              }\n              default:\n                return Error(\"unknown escape code in string constant\");\n            }\n          } else {  // printable chars + UTF-8 bytes\n            if (unicode_high_surrogate != -1) {\n              return Error(\n                  \"illegal Unicode sequence (unpaired high surrogate)\");\n            }\n            // reset if non-printable\n            attr_is_trivial_ascii_string_ &=\n                check_ascii_range(*cursor_, ' ', '~');\n\n            attribute_ += *cursor_++;\n          }\n        }\n        if (unicode_high_surrogate != -1) {\n          return Error(\"illegal Unicode sequence (unpaired high surrogate)\");\n        }\n        cursor_++;\n        if (!attr_is_trivial_ascii_string_ && !opts.allow_non_utf8 &&\n            !ValidateUTF8(attribute_)) {\n          return Error(\"illegal UTF-8 sequence\");\n        }\n        token_ = kTokenStringConstant;\n        return NoError();\n      }\n      case '/':\n        if (*cursor_ == '/') {\n          const char* start = ++cursor_;\n          while (*cursor_ && *cursor_ != '\\n' && *cursor_ != '\\r') cursor_++;\n          if (*start == '/') {  // documentation comment\n            if (!seen_newline)\n              return Error(\n                  \"a documentation comment should be on a line on its own\");\n            doc_comment_.push_back(std::string(start + 1, cursor_));\n          }\n          break;\n        } else if (*cursor_ == '*') {\n          cursor_++;\n          // TODO: make nested.\n          while (*cursor_ != '*' || cursor_[1] != '/') {\n            if (*cursor_ == '\\n') MarkNewLine();\n            if (!*cursor_) return Error(\"end of file in comment\");\n            cursor_++;\n          }\n          cursor_ += 2;\n          break;\n        }\n        FLATBUFFERS_FALLTHROUGH();  // else fall thru\n      default:\n        if (IsIdentifierStart(c)) {\n          // Collect all chars of an identifier:\n          const char* start = cursor_ - 1;\n          while (IsIdentifierStart(*cursor_) || is_digit(*cursor_)) cursor_++;\n          attribute_.append(start, cursor_);\n          token_ = kTokenIdentifier;\n          return NoError();\n        }\n\n        const auto has_sign = (c == '+') || (c == '-');\n        if (has_sign) {\n          // Check for +/-inf which is considered a float constant.\n          if (strncmp(cursor_, \"inf\", 3) == 0 &&\n              !(IsIdentifierStart(cursor_[3]) || is_digit(cursor_[3]))) {\n            attribute_.assign(cursor_ - 1, cursor_ + 3);\n            token_ = kTokenFloatConstant;\n            cursor_ += 3;\n            return NoError();\n          }\n\n          if (IsIdentifierStart(*cursor_)) {\n            // '-'/'+' and following identifier - it could be a predefined\n            // constant. Return the sign in token_, see ParseSingleValue.\n            return NoError();\n          }\n        }\n\n        auto dot_lvl =\n            (c == '.') ? 0 : 1;  // dot_lvl==0 <=> exactly one '.' seen\n        if (!dot_lvl && !is_digit(*cursor_)) return NoError();  // enum?\n        // Parser accepts hexadecimal-floating-literal (see C++ 5.13.4).\n        if (is_digit(c) || has_sign || !dot_lvl) {\n          const auto start = cursor_ - 1;\n          auto start_digits = !is_digit(c) ? cursor_ : cursor_ - 1;\n          if (!is_digit(c) && is_digit(*cursor_)) {\n            start_digits = cursor_;  // see digit in cursor_ position\n            c = *cursor_++;\n          }\n          // hex-float can't begind with '.'\n          auto use_hex = dot_lvl && (c == '0') && is_alpha_char(*cursor_, 'X');\n          if (use_hex) start_digits = ++cursor_;  // '0x' is the prefix, skip it\n          // Read an integer number or mantisa of float-point number.\n          do {\n            if (use_hex) {\n              while (is_xdigit(*cursor_)) cursor_++;\n            } else {\n              while (is_digit(*cursor_)) cursor_++;\n            }\n          } while ((*cursor_ == '.') && (++cursor_) && (--dot_lvl >= 0));\n          // Exponent of float-point number.\n          if ((dot_lvl >= 0) && (cursor_ > start_digits)) {\n            // The exponent suffix of hexadecimal float number is mandatory.\n            if (use_hex && !dot_lvl) start_digits = cursor_;\n            if ((use_hex && is_alpha_char(*cursor_, 'P')) ||\n                is_alpha_char(*cursor_, 'E')) {\n              dot_lvl = 0;  // Emulate dot to signal about float-point number.\n              cursor_++;\n              if (*cursor_ == '+' || *cursor_ == '-') cursor_++;\n              start_digits = cursor_;  // the exponent-part has to have digits\n              // Exponent is decimal integer number\n              while (is_digit(*cursor_)) cursor_++;\n              if (*cursor_ == '.') {\n                cursor_++;  // If see a dot treat it as part of invalid number.\n                dot_lvl = -1;  // Fall thru to Error().\n              }\n            }\n          }\n          // Finalize.\n          if ((dot_lvl >= 0) && (cursor_ > start_digits)) {\n            attribute_.append(start, cursor_);\n            token_ = dot_lvl ? kTokenIntegerConstant : kTokenFloatConstant;\n            return NoError();\n          } else {\n            return Error(\"invalid number: \" + std::string(start, cursor_));\n          }\n        }\n        std::string ch;\n        ch = c;\n        if (false == check_ascii_range(c, ' ', '~'))\n          ch = \"code: \" + NumToString(c);\n        return Error(\"illegal character: \" + ch);\n    }\n  }\n}\n\n// Check if a given token is next.\nbool Parser::Is(int t) const { return t == token_; }\n\nbool Parser::IsIdent(const char* id) const {\n  return token_ == kTokenIdentifier && attribute_ == id;\n}\n\n// Expect a given token to be next, consume it, or error if not present.\nCheckedError Parser::Expect(int t) {\n  if (t != token_) {\n    return Error(\"expecting: \" + TokenToString(t) +\n                 \" instead got: \" + TokenToStringId(token_));\n  }\n  NEXT();\n  return NoError();\n}\n\nCheckedError Parser::ParseNamespacing(std::string* id, std::string* last) {\n  while (Is('.')) {\n    NEXT();\n    *id += \".\";\n    *id += attribute_;\n    if (last) *last = attribute_;\n    EXPECT(kTokenIdentifier);\n  }\n  return NoError();\n}\n\nEnumDef* Parser::LookupEnum(const std::string& id) {\n  // Search thru parent namespaces.\n  return LookupTableByName(enums_, id, *current_namespace_, 0);\n}\n\nStructDef* Parser::LookupStruct(const std::string& id) const {\n  auto sd = structs_.Lookup(id);\n  if (sd) sd->refcount++;\n  return sd;\n}\n\nStructDef* Parser::LookupStructThruParentNamespaces(\n    const std::string& id) const {\n  auto sd = LookupTableByName(structs_, id, *current_namespace_, 1);\n  if (sd) sd->refcount++;\n  return sd;\n}\n\nCheckedError Parser::ParseTypeIdent(Type& type) {\n  std::string id = attribute_;\n  EXPECT(kTokenIdentifier);\n  ECHECK(ParseNamespacing(&id, nullptr));\n  auto enum_def = LookupEnum(id);\n  if (enum_def) {\n    type = enum_def->underlying_type;\n    if (enum_def->is_union) type.base_type = BASE_TYPE_UNION;\n  } else {\n    type.base_type = BASE_TYPE_STRUCT;\n    type.struct_def = LookupCreateStruct(id);\n  }\n  return NoError();\n}\n\n// Parse any IDL type.\nCheckedError Parser::ParseType(Type& type) {\n  if (token_ == kTokenIdentifier) {\n    if (IsIdent(\"bool\")) {\n      type.base_type = BASE_TYPE_BOOL;\n      NEXT();\n    } else if (IsIdent(\"byte\") || IsIdent(\"int8\")) {\n      type.base_type = BASE_TYPE_CHAR;\n      NEXT();\n    } else if (IsIdent(\"ubyte\") || IsIdent(\"uint8\")) {\n      type.base_type = BASE_TYPE_UCHAR;\n      NEXT();\n    } else if (IsIdent(\"short\") || IsIdent(\"int16\")) {\n      type.base_type = BASE_TYPE_SHORT;\n      NEXT();\n    } else if (IsIdent(\"ushort\") || IsIdent(\"uint16\")) {\n      type.base_type = BASE_TYPE_USHORT;\n      NEXT();\n    } else if (IsIdent(\"int\") || IsIdent(\"int32\")) {\n      type.base_type = BASE_TYPE_INT;\n      NEXT();\n    } else if (IsIdent(\"uint\") || IsIdent(\"uint32\")) {\n      type.base_type = BASE_TYPE_UINT;\n      NEXT();\n    } else if (IsIdent(\"long\") || IsIdent(\"int64\")) {\n      type.base_type = BASE_TYPE_LONG;\n      NEXT();\n    } else if (IsIdent(\"ulong\") || IsIdent(\"uint64\")) {\n      type.base_type = BASE_TYPE_ULONG;\n      NEXT();\n    } else if (IsIdent(\"float\") || IsIdent(\"float32\")) {\n      type.base_type = BASE_TYPE_FLOAT;\n      NEXT();\n    } else if (IsIdent(\"double\") || IsIdent(\"float64\")) {\n      type.base_type = BASE_TYPE_DOUBLE;\n      NEXT();\n    } else if (IsIdent(\"string\")) {\n      type.base_type = BASE_TYPE_STRING;\n      NEXT();\n    } else {\n      ECHECK(ParseTypeIdent(type));\n    }\n  } else if (token_ == '[') {\n    ParseDepthGuard depth_guard(this);\n    ECHECK(depth_guard.Check());\n    NEXT();\n    Type subtype;\n    ECHECK(ParseType(subtype));\n    if (IsSeries(subtype)) {\n      // We could support this, but it will complicate things, and it's\n      // easier to work around with a struct around the inner vector.\n      return Error(\"nested vector types not supported (wrap in table first)\");\n    }\n    if (token_ == ':') {\n      NEXT();\n      if (token_ != kTokenIntegerConstant) {\n        return Error(\"length of fixed-length array must be an integer value\");\n      }\n      uint16_t fixed_length = 0;\n      bool check = StringToNumber(attribute_.c_str(), &fixed_length);\n      if (!check || fixed_length < 1) {\n        return Error(\n            \"length of fixed-length array must be positive and fit to \"\n            \"uint16_t type\");\n      }\n      type = Type(BASE_TYPE_ARRAY, subtype.struct_def, subtype.enum_def,\n                  fixed_length);\n      NEXT();\n    } else {\n      type = Type(BASE_TYPE_VECTOR, subtype.struct_def, subtype.enum_def);\n    }\n    type.element = subtype.base_type;\n    EXPECT(']');\n  } else {\n    return Error(\"illegal type syntax\");\n  }\n  return NoError();\n}\n\nCheckedError Parser::AddField(StructDef& struct_def, const std::string& name,\n                              const Type& type, FieldDef** dest) {\n  auto& field = *new FieldDef();\n  field.value.offset =\n      FieldIndexToOffset(static_cast<voffset_t>(struct_def.fields.vec.size()));\n  field.name = name;\n  field.file = struct_def.file;\n  field.value.type = type;\n  if (struct_def.fixed) {  // statically compute the field offset\n    auto size = InlineSize(type);\n    auto alignment = InlineAlignment(type);\n    // structs_ need to have a predictable format, so we need to align to\n    // the largest scalar\n    struct_def.minalign = std::max(struct_def.minalign, alignment);\n    struct_def.PadLastField(alignment);\n    field.value.offset = static_cast<voffset_t>(struct_def.bytesize);\n    struct_def.bytesize += size;\n  }\n  if (struct_def.fields.Add(name, &field))\n    return Error(\"field already exists: \" + name);\n  *dest = &field;\n  return NoError();\n}\n\nCheckedError Parser::ParseField(StructDef& struct_def) {\n  std::string name = attribute_;\n\n  if (LookupCreateStruct(name, false, false))\n    return Error(\"field name can not be the same as table/struct name\");\n\n  if (!IsLowerSnakeCase(name)) {\n    Warning(\"field names should be lowercase snake_case, got: \" + name);\n  }\n\n  std::vector<std::string> dc = doc_comment_;\n  EXPECT(kTokenIdentifier);\n  EXPECT(':');\n  Type type;\n  ECHECK(ParseType(type));\n\n  if (struct_def.fixed) {\n    if (IsIncompleteStruct(type) ||\n        (IsArray(type) && IsIncompleteStruct(type.VectorType()))) {\n      std::string type_name = IsArray(type) ? type.VectorType().struct_def->name\n                                            : type.struct_def->name;\n      return Error(\n          std::string(\"Incomplete type in struct is not allowed, type name: \") +\n          type_name);\n    }\n\n    auto valid = IsScalar(type.base_type) || IsStruct(type);\n    if (!valid && IsArray(type)) {\n      const auto& elem_type = type.VectorType();\n      valid |= IsScalar(elem_type.base_type) || IsStruct(elem_type);\n    }\n    if (!valid)\n      return Error(\"structs may contain only scalar or struct fields\");\n  }\n\n  if (!struct_def.fixed && IsArray(type))\n    return Error(\"fixed-length array in table must be wrapped in struct\");\n\n  if (IsArray(type)) {\n    advanced_features_ |= reflection::AdvancedArrayFeatures;\n    if (!SupportsAdvancedArrayFeatures()) {\n      return Error(\n          \"Arrays are not yet supported in all \"\n          \"the specified programming languages.\");\n    }\n  }\n\n  FieldDef* typefield = nullptr;\n  if (type.base_type == BASE_TYPE_UNION) {\n    // For union fields, add a second auto-generated field to hold the type,\n    // with a special suffix.\n\n    // To ensure compatibility with many codes that rely on the BASE_TYPE_UTYPE\n    // value to identify union type fields.\n    Type union_type(type.enum_def->underlying_type);\n    union_type.base_type = BASE_TYPE_UTYPE;\n    ECHECK(AddField(struct_def, name + UnionTypeFieldSuffix(), union_type,\n                    &typefield));\n\n  } else if (IsVector(type) && type.element == BASE_TYPE_UNION) {\n    advanced_features_ |= reflection::AdvancedUnionFeatures;\n    // Only cpp, js and ts supports the union vector feature so far.\n    if (!SupportsAdvancedUnionFeatures()) {\n      return Error(\n          \"Vectors of unions are not yet supported in at least one of \"\n          \"the specified programming languages.\");\n    }\n    // For vector of union fields, add a second auto-generated vector field to\n    // hold the types, with a special suffix.\n    Type union_vector(BASE_TYPE_VECTOR, nullptr, type.enum_def);\n    union_vector.element = BASE_TYPE_UTYPE;\n    ECHECK(AddField(struct_def, name + UnionTypeFieldSuffix(), union_vector,\n                    &typefield));\n  }\n\n  FieldDef* field;\n  ECHECK(AddField(struct_def, name, type, &field));\n\n  if (typefield) {\n    // We preserve the relation between the typefield\n    // and field, so we can easily map it in the code\n    // generators.\n    typefield->sibling_union_field = field;\n    field->sibling_union_field = typefield;\n  }\n\n  if (token_ == '=') {\n    NEXT();\n    ECHECK(ParseSingleValue(&field->name, field->value, true));\n    if (IsStruct(type) || (struct_def.fixed && field->value.constant != \"0\"))\n      return Error(\n          \"default values are not supported for struct fields, table fields, \"\n          \"or in structs.\");\n    if (IsString(type) || IsVector(type)) {\n      advanced_features_ |= reflection::DefaultVectorsAndStrings;\n      if (field->value.constant != \"0\" && !SupportsDefaultVectorsAndStrings()) {\n        return Error(\n            \"Default values for strings and vectors are not supported in one \"\n            \"of the specified programming languages\");\n      }\n    }\n\n    if (IsVector(type) && field->value.constant != \"0\" &&\n        field->value.constant != \"[]\") {\n      return Error(\"The only supported default for vectors is `[]`.\");\n    }\n  }\n\n  // Append .0 if the value has not it (skip hex and scientific floats).\n  // This suffix needed for generated C++ code.\n  if (IsFloat(type.base_type)) {\n    auto& text = field->value.constant;\n    FLATBUFFERS_ASSERT(false == text.empty());\n    auto s = text.c_str();\n    while (*s == ' ') s++;\n    if (*s == '-' || *s == '+') s++;\n    // 1) A float constants (nan, inf, pi, etc) is a kind of identifier.\n    // 2) A float number needn't \".0\" at the end if it has exponent.\n    if ((false == IsIdentifierStart(*s)) &&\n        (std::string::npos == field->value.constant.find_first_of(\".eEpP\"))) {\n      field->value.constant += \".0\";\n    }\n  }\n\n  field->doc_comment = dc;\n  ECHECK(ParseMetaData(&field->attributes));\n  field->deprecated = field->attributes.Lookup(\"deprecated\") != nullptr;\n  auto hash_name = field->attributes.Lookup(\"hash\");\n  if (hash_name) {\n    switch ((IsVector(type)) ? type.element : type.base_type) {\n      case BASE_TYPE_SHORT:\n      case BASE_TYPE_USHORT: {\n        if (FindHashFunction16(hash_name->constant.c_str()) == nullptr)\n          return Error(\"Unknown hashing algorithm for 16 bit types: \" +\n                       hash_name->constant);\n        break;\n      }\n      case BASE_TYPE_INT:\n      case BASE_TYPE_UINT: {\n        if (FindHashFunction32(hash_name->constant.c_str()) == nullptr)\n          return Error(\"Unknown hashing algorithm for 32 bit types: \" +\n                       hash_name->constant);\n        break;\n      }\n      case BASE_TYPE_LONG:\n      case BASE_TYPE_ULONG: {\n        if (FindHashFunction64(hash_name->constant.c_str()) == nullptr)\n          return Error(\"Unknown hashing algorithm for 64 bit types: \" +\n                       hash_name->constant);\n        break;\n      }\n      default:\n        return Error(\n            \"only short, ushort, int, uint, long and ulong data types support \"\n            \"hashing.\");\n    }\n  }\n\n  if (field->attributes.Lookup(\"vector64\") != nullptr) {\n    if (!IsVector(type)) {\n      return Error(\"`vector64` attribute can only be applied on vectors.\");\n    }\n\n    // Upgrade the type to be a BASE_TYPE_VECTOR64, since the attributes are\n    // parsed after the type.\n    const BaseType element_base_type = type.element;\n    type = Type(BASE_TYPE_VECTOR64, type.struct_def, type.enum_def);\n    type.element = element_base_type;\n\n    // Since the field was already added to the parent object, update the type\n    // in place.\n    field->value.type = type;\n\n    // 64-bit vectors imply the offset64 attribute.\n    field->offset64 = true;\n  }\n\n  // Record that this field uses 64-bit offsets.\n  if (field->attributes.Lookup(\"offset64\") != nullptr) {\n    // TODO(derekbailey): would be nice to have this be a recommendation or hint\n    // instead of a warning.\n    if (type.base_type == BASE_TYPE_VECTOR64) {\n      Warning(\"attribute `vector64` implies `offset64` and isn't required.\");\n    }\n\n    field->offset64 = true;\n  }\n\n  // Check for common conditions with Offset64 fields.\n  if (field->offset64) {\n    // TODO(derekbailey): this is where we can disable string support for\n    // offset64, as that is not a hard requirement to have.\n    if (!IsString(type) && !IsVector(type)) {\n      return Error(\n          \"only string and vectors can have `offset64` attribute applied\");\n    }\n\n    // If this is a Vector, only scalar and scalar-like (structs) items are\n    // allowed.\n    // TODO(derekbailey): allow vector of strings, just require that the strings\n    // are Offset64<string>.\n    if (IsVector(type) &&\n        !((IsScalar(type.element) && !IsEnum(type.VectorType())) ||\n          IsStruct(type.VectorType()))) {\n      return Error(\"only vectors of scalars are allowed to be 64-bit.\");\n    }\n\n    // Lastly, check if it is supported by the specified generated languages. Do\n    // this last so the above checks can inform the user of schema errors to fix\n    // first.\n    if (!Supports64BitOffsets()) {\n      return Error(\n          \"fields using 64-bit offsets are not yet supported in at least one \"\n          \"of the specified programming languages.\");\n    }\n  }\n\n  field->key = field->attributes.Lookup(\"key\") != nullptr;\n\n  if (!struct_def.fixed) {\n    // For historical convenience reasons, string keys are assumed required.\n    // Scalars are kDefault unless otherwise specified.\n    // Nonscalars are kOptional unless required;\n    const bool required = field->attributes.Lookup(\"required\") != nullptr ||\n                          (IsString(type) && field->key);\n    const bool default_str_or_vec =\n        ((IsString(type) || IsVector(type)) && field->value.constant != \"0\");\n    const bool optional = IsScalar(type.base_type)\n                              ? (field->value.constant == \"null\")\n                              : !(required || default_str_or_vec);\n    if (required && optional) {\n      return Error(\"Fields cannot be both optional and required.\");\n    }\n    field->presence = FieldDef::MakeFieldPresence(optional, required);\n\n    if (required && IsScalar(type.base_type)) {\n      return Error(\"only non-scalar fields in tables may be 'required'\");\n    }\n  } else {\n    // all struct fields are required\n    field->presence = FieldDef::kDefault;\n\n    // setting required or optional on a struct field is meaningless\n    if (field->attributes.Lookup(\"required\") != nullptr ||\n        field->attributes.Lookup(\"optional\") != nullptr) {\n      return Error(\"struct fields are always required\");\n    }\n  }\n\n  if (field->key) {\n    if (struct_def.has_key) return Error(\"only one field may be set as 'key'\");\n    struct_def.has_key = true;\n    auto is_valid =\n        IsScalar(type.base_type) || IsString(type) || IsStruct(type);\n    if (IsArray(type)) {\n      is_valid |=\n          IsScalar(type.VectorType().base_type) || IsStruct(type.VectorType());\n    }\n    if (!is_valid) {\n      return Error(\n          \"'key' field must be string, scalar type or fixed size array of \"\n          \"scalars\");\n    }\n  }\n\n  if (field->IsScalarOptional()) {\n    advanced_features_ |= reflection::OptionalScalars;\n    if (type.enum_def && type.enum_def->Lookup(\"null\")) {\n      FLATBUFFERS_ASSERT(IsInteger(type.base_type));\n      return Error(\n          \"the default 'null' is reserved for declaring optional scalar \"\n          \"fields, it conflicts with declaration of enum '\" +\n          type.enum_def->name + \"'.\");\n    }\n    if (field->attributes.Lookup(\"key\")) {\n      return Error(\n          \"only a non-optional scalar field can be used as a 'key' field\");\n    }\n    if (!SupportsOptionalScalars()) {\n      return Error(\n          \"Optional scalars are not yet supported in at least one of \"\n          \"the specified programming languages.\");\n    }\n  }\n\n  auto check_enum = [this](const FieldDef* field, const Type& type,\n                           const std::string& name,\n                           const std::string& constant) -> CheckedError {\n    // Optional and bitflags enums may have default constants that are not\n    // their specified variants.\n    if (!field->IsOptional() &&\n        type.enum_def->attributes.Lookup(\"bit_flags\") == nullptr) {\n      if (type.enum_def->FindByValue(constant) == nullptr) {\n        return Error(\"default value of `\" + constant + \"` for \" + \"field `\" +\n                     name + \"` is not part of enum `\" + type.enum_def->name +\n                     \"`.\");\n      }\n    }\n\n    return NoError();\n  };\n\n  if (type.enum_def) {\n    // Verify the enum's type and default value.\n    const std::string& constant = field->value.constant;\n    if (type.base_type == BASE_TYPE_UNION) {\n      if (constant != \"0\") {\n        return Error(\"Union defaults must be NONE\");\n      }\n    } else if (IsVector(type)) {\n      if (constant != \"0\" && constant != \"[]\") {\n        return Error(\"Vector defaults may only be `[]`.\");\n      }\n    } else if (IsArray(type)) {\n      if (constant != \"0\") {\n        return Error(\"Array defaults are not supported yet.\");\n      }\n      CheckedError err = check_enum(field, type.VectorType(), name, constant);\n      if (err.Check()) {\n        // reset the check state of the error\n        return CheckedError{err};\n      }\n    } else {\n      if (!IsInteger(type.base_type)) {\n        return Error(\"Enums must have integer base types\");\n      }\n      CheckedError err = check_enum(field, type, name, constant);\n      if (err.Check()) {\n        // reset the check state of the error\n        return CheckedError{err};\n      }\n    }\n  }\n\n  if (field->deprecated && struct_def.fixed)\n    return Error(\"can't deprecate fields in a struct\");\n\n  auto cpp_type = field->attributes.Lookup(\"cpp_type\");\n  if (cpp_type) {\n    if (!hash_name)\n      return Error(\"cpp_type can only be used with a hashed field\");\n    /// forcing cpp_ptr_type to 'naked' if unset\n    auto cpp_ptr_type = field->attributes.Lookup(\"cpp_ptr_type\");\n    if (!cpp_ptr_type) {\n      auto val = new Value();\n      val->type = cpp_type->type;\n      val->constant = \"naked\";\n      field->attributes.Add(\"cpp_ptr_type\", val);\n    }\n  }\n\n  field->shared = field->attributes.Lookup(\"shared\") != nullptr;\n  if (field->shared && field->value.type.base_type != BASE_TYPE_STRING)\n    return Error(\"shared can only be defined on strings\");\n\n  auto field_native_custom_alloc =\n      field->attributes.Lookup(\"native_custom_alloc\");\n  if (field_native_custom_alloc)\n    return Error(\n        \"native_custom_alloc can only be used with a table or struct \"\n        \"definition\");\n\n  field->native_inline = field->attributes.Lookup(\"native_inline\") != nullptr;\n  if (field->native_inline && !IsStruct(field->value.type) &&\n      !IsVectorOfStruct(field->value.type) &&\n      !IsVectorOfTable(field->value.type))\n    return Error(\n        \"'native_inline' can only be defined on structs, vector of structs or \"\n        \"vector of tables\");\n\n  auto nested = field->attributes.Lookup(\"nested_flatbuffer\");\n  if (nested) {\n    if (nested->type.base_type != BASE_TYPE_STRING)\n      return Error(\n          \"nested_flatbuffer attribute must be a string (the root type)\");\n    if (!IsVector(type.base_type) || type.element != BASE_TYPE_UCHAR)\n      return Error(\n          \"nested_flatbuffer attribute may only apply to a vector of ubyte\");\n    // This will cause an error if the root type of the nested flatbuffer\n    // wasn't defined elsewhere.\n    field->nested_flatbuffer = LookupCreateStruct(nested->constant);\n  }\n\n  if (field->attributes.Lookup(\"flexbuffer\")) {\n    field->flexbuffer = true;\n    uses_flexbuffers_ = true;\n    if (type.base_type != BASE_TYPE_VECTOR || type.element != BASE_TYPE_UCHAR)\n      return Error(\"flexbuffer attribute may only apply to a vector of ubyte\");\n  }\n\n  if (typefield) {\n    if (!IsScalar(typefield->value.type.base_type)) {\n      // this is a union vector field\n      typefield->presence = field->presence;\n    }\n    // If this field is a union, and it has a manually assigned id,\n    // the automatically added type field should have an id as well (of N - 1).\n    auto attr = field->attributes.Lookup(\"id\");\n    if (attr) {\n      const auto& id_str = attr->constant;\n      voffset_t id = 0;\n      const auto done = !atot(id_str.c_str(), *this, &id).Check();\n      if (done && id > 0) {\n        auto val = new Value();\n        val->type = attr->type;\n        val->constant = NumToString(id - 1);\n        typefield->attributes.Add(\"id\", val);\n      } else {\n        return Error(\n            \"a union type effectively adds two fields with non-negative ids, \"\n            \"its id must be that of the second field (the first field is \"\n            \"the type field and not explicitly declared in the schema);\\n\"\n            \"field: \" +\n            field->name + \", id: \" + id_str);\n      }\n    }\n    // if this field is a union that is deprecated,\n    // the automatically added type field should be deprecated as well\n    if (field->deprecated) {\n      typefield->deprecated = true;\n    }\n  }\n\n  EXPECT(';');\n  return NoError();\n}\n\nCheckedError Parser::ParseString(Value& val, bool use_string_pooling) {\n  auto s = attribute_;\n  EXPECT(kTokenStringConstant);\n  if (use_string_pooling) {\n    val.constant = NumToString(builder_.CreateSharedString(s).o);\n  } else {\n    val.constant = NumToString(builder_.CreateString(s).o);\n  }\n  return NoError();\n}\n\nCheckedError Parser::ParseComma() {\n  if (!opts.protobuf_ascii_alike) EXPECT(',');\n  return NoError();\n}\n\nCheckedError Parser::ParseAnyValue(Value& val, FieldDef* field,\n                                   size_t parent_fieldn,\n                                   const StructDef* parent_struct_def,\n                                   size_t count, bool inside_vector) {\n  switch (val.type.base_type) {\n    case BASE_TYPE_UNION: {\n      FLATBUFFERS_ASSERT(field);\n      std::string constant;\n      Vector<uint8_t>* vector_of_union_types = nullptr;\n      // Find corresponding type field we may have already parsed.\n      for (auto elem = field_stack_.rbegin() + count;\n           elem != field_stack_.rbegin() + parent_fieldn + count; ++elem) {\n        auto& type = elem->second->value.type;\n        if (type.enum_def == val.type.enum_def) {\n          if (inside_vector) {\n            if (IsVector(type) && type.element == BASE_TYPE_UTYPE) {\n              // Vector of union type field.\n              uoffset_t offset;\n              ECHECK(atot(elem->first.constant.c_str(), *this, &offset));\n              vector_of_union_types = reinterpret_cast<Vector<uint8_t>*>(\n                  builder_.GetCurrentBufferPointer() + builder_.GetSize() -\n                  offset);\n              break;\n            }\n          } else {\n            if (type.base_type == BASE_TYPE_UTYPE) {\n              // Union type field.\n              constant = elem->first.constant;\n              break;\n            }\n          }\n        }\n      }\n      if (constant.empty() && !inside_vector) {\n        // We haven't seen the type field yet. Sadly a lot of JSON writers\n        // output these in alphabetical order, meaning it comes after this\n        // value. So we scan past the value to find it, then come back here.\n        // We currently don't do this for vectors of unions because the\n        // scanning/serialization logic would get very complicated.\n        auto type_name = field->name + UnionTypeFieldSuffix();\n        FLATBUFFERS_ASSERT(parent_struct_def);\n        auto type_field = parent_struct_def->fields.Lookup(type_name);\n        FLATBUFFERS_ASSERT(type_field);  // Guaranteed by ParseField().\n        // Remember where we are in the source file, so we can come back here.\n        auto backup = *static_cast<ParserState*>(this);\n        ECHECK(SkipAnyJsonValue());  // The table.\n        ECHECK(ParseComma());\n        auto next_name = attribute_;\n        if (Is(kTokenStringConstant)) {\n          NEXT();\n        } else {\n          EXPECT(kTokenIdentifier);\n        }\n        if (next_name == type_name) {\n          EXPECT(':');\n          ParseDepthGuard depth_guard(this);\n          ECHECK(depth_guard.Check());\n          Value type_val = type_field->value;\n          ECHECK(ParseAnyValue(type_val, type_field, 0, nullptr, 0));\n          constant = type_val.constant;\n          // Got the information we needed, now rewind:\n          *static_cast<ParserState*>(this) = backup;\n        }\n      }\n      if (constant.empty() && !vector_of_union_types) {\n        return Error(\"missing type field for this union value: \" + field->name);\n      }\n      uint8_t enum_idx;\n      if (vector_of_union_types) {\n        if (vector_of_union_types->size() <= count)\n          return Error(\n              \"union types vector smaller than union values vector for: \" +\n              field->name);\n        enum_idx = vector_of_union_types->Get(static_cast<uoffset_t>(count));\n      } else {\n        ECHECK(atot(constant.c_str(), *this, &enum_idx));\n      }\n      auto enum_val = val.type.enum_def->ReverseLookup(enum_idx, true);\n      if (!enum_val) return Error(\"illegal type id for: \" + field->name);\n      if (enum_val->union_type.base_type == BASE_TYPE_STRUCT) {\n        ECHECK(ParseTable(*enum_val->union_type.struct_def, &val.constant,\n                          nullptr));\n        if (enum_val->union_type.struct_def->fixed) {\n          // All BASE_TYPE_UNION values are offsets, so turn this into one.\n          SerializeStruct(*enum_val->union_type.struct_def, val);\n          builder_.ClearOffsets();\n          val.constant = NumToString(builder_.GetSize());\n        }\n      } else if (IsString(enum_val->union_type)) {\n        ECHECK(ParseString(val, field->shared));\n      } else {\n        FLATBUFFERS_ASSERT(false);\n      }\n      break;\n    }\n    case BASE_TYPE_STRUCT:\n      ECHECK(ParseTable(*val.type.struct_def, &val.constant, nullptr));\n      break;\n    case BASE_TYPE_STRING: {\n      ECHECK(ParseString(val, field->shared));\n      break;\n    }\n    case BASE_TYPE_VECTOR64:\n    case BASE_TYPE_VECTOR: {\n      uoffset_t off;\n      ECHECK(ParseVector(val.type, &off, field, parent_fieldn));\n      val.constant = NumToString(off);\n      break;\n    }\n    case BASE_TYPE_ARRAY: {\n      ECHECK(ParseArray(val));\n      break;\n    }\n    case BASE_TYPE_INT:\n    case BASE_TYPE_UINT:\n    case BASE_TYPE_LONG:\n    case BASE_TYPE_ULONG: {\n      if (field && field->attributes.Lookup(\"hash\") &&\n          (token_ == kTokenIdentifier || token_ == kTokenStringConstant)) {\n        ECHECK(ParseHash(val, field));\n      } else {\n        ECHECK(ParseSingleValue(field ? &field->name : nullptr, val, false));\n      }\n      break;\n    }\n    default:\n      ECHECK(ParseSingleValue(field ? &field->name : nullptr, val, false));\n      break;\n  }\n  return NoError();\n}\n\nvoid Parser::SerializeStruct(const StructDef& struct_def, const Value& val) {\n  SerializeStruct(builder_, struct_def, val);\n}\n\nvoid Parser::SerializeStruct(FlatBufferBuilder& builder,\n                             const StructDef& struct_def, const Value& val) {\n  FLATBUFFERS_ASSERT(val.constant.length() == struct_def.bytesize);\n  builder.Align(struct_def.minalign);\n  builder.PushBytes(reinterpret_cast<const uint8_t*>(val.constant.c_str()),\n                    struct_def.bytesize);\n  builder.AddStructOffset(val.offset, builder.GetSize());\n}\n\ntemplate <typename F>\nCheckedError Parser::ParseTableDelimiters(size_t& fieldn,\n                                          const StructDef* struct_def, F body) {\n  // We allow tables both as JSON object{ .. } with field names\n  // or vector[..] with all fields in order\n  char terminator = '}';\n  bool is_nested_vector = struct_def && Is('[');\n  if (is_nested_vector) {\n    NEXT();\n    terminator = ']';\n  } else {\n    EXPECT('{');\n  }\n  for (;;) {\n    if ((!opts.strict_json || !fieldn) && Is(terminator)) break;\n    std::string name;\n    if (is_nested_vector) {\n      if (fieldn >= struct_def->fields.vec.size()) {\n        return Error(\"too many unnamed fields in nested array\");\n      }\n      name = struct_def->fields.vec[fieldn]->name;\n    } else {\n      name = attribute_;\n      if (Is(kTokenStringConstant)) {\n        NEXT();\n      } else {\n        EXPECT(opts.strict_json ? kTokenStringConstant : kTokenIdentifier);\n      }\n      if (!opts.protobuf_ascii_alike || !(Is('{') || Is('['))) EXPECT(':');\n    }\n    ECHECK(body(name, fieldn, struct_def));\n    if (Is(terminator)) break;\n    ECHECK(ParseComma());\n  }\n  NEXT();\n  if (is_nested_vector && fieldn != struct_def->fields.vec.size()) {\n    return Error(\"wrong number of unnamed fields in table vector\");\n  }\n  return NoError();\n}\n\nCheckedError Parser::ParseTable(const StructDef& struct_def, std::string* value,\n                                uoffset_t* ovalue) {\n  ParseDepthGuard depth_guard(this);\n  ECHECK(depth_guard.Check());\n\n  size_t fieldn_outer = 0;\n  auto err = ParseTableDelimiters(\n      fieldn_outer, &struct_def,\n      [&](const std::string& name, size_t& fieldn,\n          const StructDef* struct_def_inner) -> CheckedError {\n        if (name == \"$schema\") {\n          ECHECK(Expect(kTokenStringConstant));\n          return NoError();\n        }\n        auto field = struct_def_inner->fields.Lookup(name);\n        if (!field) {\n          if (!opts.skip_unexpected_fields_in_json) {\n            return Error(\"unknown field: \" + name);\n          } else {\n            ECHECK(SkipAnyJsonValue());\n          }\n        } else {\n          if (IsIdent(\"null\") && !IsScalar(field->value.type.base_type)) {\n            ECHECK(Next());  // Ignore this field.\n          } else {\n            Value val = field->value;\n            if (field->flexbuffer) {\n              flexbuffers::Builder builder(1024,\n                                           flexbuffers::BUILDER_FLAG_SHARE_ALL);\n              ECHECK(ParseFlexBufferValue(&builder));\n              builder.Finish();\n              // Force alignment for nested flexbuffer\n              builder_.ForceVectorAlignment(builder.GetSize(), sizeof(uint8_t),\n                                            sizeof(largest_scalar_t));\n              auto off = builder_.CreateVector(builder.GetBuffer());\n              val.constant = NumToString(off.o);\n            } else if (field->nested_flatbuffer) {\n              ECHECK(\n                  ParseNestedFlatbuffer(val, field, fieldn, struct_def_inner));\n            } else {\n              ECHECK(ParseAnyValue(val, field, fieldn, struct_def_inner, 0));\n            }\n            // Hardcoded insertion-sort with error-check.\n            // If fields are specified in order, then this loop exits\n            // immediately.\n            auto elem = field_stack_.rbegin();\n            for (; elem != field_stack_.rbegin() + fieldn; ++elem) {\n              auto existing_field = elem->second;\n              if (existing_field == field)\n                return Error(\"field set more than once: \" + field->name);\n              if (existing_field->value.offset < field->value.offset) break;\n            }\n            // Note: elem points to before the insertion point, thus .base()\n            // points to the correct spot.\n            field_stack_.insert(elem.base(), std::make_pair(val, field));\n            fieldn++;\n          }\n        }\n        return NoError();\n      });\n  ECHECK(err);\n\n  // Check if all required fields are parsed.\n  for (auto field_it = struct_def.fields.vec.begin();\n       field_it != struct_def.fields.vec.end(); ++field_it) {\n    auto required_field = *field_it;\n    if (!required_field->IsRequired()) {\n      continue;\n    }\n    bool found = false;\n    for (auto pf_it = field_stack_.end() - fieldn_outer;\n         pf_it != field_stack_.end(); ++pf_it) {\n      auto parsed_field = pf_it->second;\n      if (parsed_field == required_field) {\n        found = true;\n        break;\n      }\n    }\n    if (!found) {\n      return Error(\"required field is missing: \" + required_field->name +\n                   \" in \" + struct_def.name);\n    }\n  }\n\n  if (struct_def.fixed && fieldn_outer != struct_def.fields.vec.size())\n    return Error(\"struct: wrong number of initializers: \" + struct_def.name);\n\n  auto start = struct_def.fixed ? builder_.StartStruct(struct_def.minalign)\n                                : builder_.StartTable();\n\n  for (size_t size = struct_def.sortbysize ? sizeof(largest_scalar_t) : 1; size;\n       size /= 2) {\n    // Go through elements in reverse, since we're building the data backwards.\n    // TODO(derekbailey): this doesn't work when there are Offset64 fields, as\n    // those have to be built first. So this needs to be changed to iterate over\n    // Offset64 then Offset32 fields.\n    for (auto it = field_stack_.rbegin();\n         it != field_stack_.rbegin() + fieldn_outer; ++it) {\n      auto& field_value = it->first;\n      auto field = it->second;\n      if (!struct_def.sortbysize ||\n          size == SizeOf(field_value.type.base_type)) {\n        switch (field_value.type.base_type) {\n          // clang-format off\n          #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \\\n            case BASE_TYPE_ ## ENUM: \\\n              builder_.Pad(field->padding); \\\n              if (struct_def.fixed) { \\\n                CTYPE val; \\\n                ECHECK(atot(field_value.constant.c_str(), *this, &val)); \\\n                builder_.PushElement(val); \\\n              } else { \\\n                if (field->IsScalarOptional()) { \\\n                  if (field_value.constant != \"null\") { \\\n                    CTYPE val; \\\n                    ECHECK(atot(field_value.constant.c_str(), *this, &val)); \\\n                    builder_.AddElement(field_value.offset, val); \\\n                  } \\\n                } else { \\\n                  CTYPE val, valdef; \\\n                  ECHECK(atot(field_value.constant.c_str(), *this, &val)); \\\n                  ECHECK(atot(field->value.constant.c_str(), *this, &valdef)); \\\n                  builder_.AddElement(field_value.offset, val, valdef); \\\n                } \\\n              } \\\n              break;\n            FLATBUFFERS_GEN_TYPES_SCALAR(FLATBUFFERS_TD)\n          #undef FLATBUFFERS_TD\n          #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \\\n            case BASE_TYPE_ ## ENUM: \\\n              builder_.Pad(field->padding); \\\n              if (IsStruct(field->value.type)) { \\\n                SerializeStruct(*field->value.type.struct_def, field_value); \\\n              } else { \\\n                /* Special case for fields that use 64-bit addressing */ \\\n                if(field->offset64) { \\\n                  Offset64<void> offset; \\\n                  ECHECK(atot(field_value.constant.c_str(), *this, &offset)); \\\n                  builder_.AddOffset(field_value.offset, offset); \\\n                } else { \\\n                  CTYPE val; \\\n                  ECHECK(atot(field_value.constant.c_str(), *this, &val)); \\\n                  builder_.AddOffset(field_value.offset, val); \\\n                } \\\n              } \\\n              break;\n            FLATBUFFERS_GEN_TYPES_POINTER(FLATBUFFERS_TD)\n          #undef FLATBUFFERS_TD\n            case BASE_TYPE_ARRAY:\n              builder_.Pad(field->padding);\n              builder_.PushBytes(\n                reinterpret_cast<const uint8_t*>(field_value.constant.c_str()),\n                InlineSize(field_value.type));\n              break;\n            // clang-format on\n        }\n      }\n    }\n  }\n  for (size_t i = 0; i < fieldn_outer; i++) field_stack_.pop_back();\n\n  if (struct_def.fixed) {\n    builder_.ClearOffsets();\n    builder_.EndStruct();\n    FLATBUFFERS_ASSERT(value);\n    // Temporarily store this struct in the value string, since it is to\n    // be serialized in-place elsewhere.\n    value->assign(\n        reinterpret_cast<const char*>(builder_.GetCurrentBufferPointer()),\n        struct_def.bytesize);\n    builder_.PopBytes(struct_def.bytesize);\n    FLATBUFFERS_ASSERT(!ovalue);\n  } else {\n    auto val = builder_.EndTable(start);\n    if (ovalue) *ovalue = val;\n    if (value) *value = NumToString(val);\n  }\n  return NoError();\n}\n\ntemplate <typename F>\nCheckedError Parser::ParseVectorDelimiters(size_t& count, F body) {\n  EXPECT('[');\n  for (;;) {\n    if ((!opts.strict_json || !count) && Is(']')) break;\n    ECHECK(body(count));\n    count++;\n    if (Is(']')) break;\n    ECHECK(ParseComma());\n  }\n  NEXT();\n  return NoError();\n}\n\nCheckedError Parser::ParseAlignAttribute(const std::string& align_constant,\n                                         size_t min_align, size_t* align) {\n  // Use uint8_t to avoid problems with size_t==`unsigned long` on LP64.\n  uint8_t align_value;\n  if (StringToNumber(align_constant.c_str(), &align_value) &&\n      VerifyAlignmentRequirements(static_cast<size_t>(align_value),\n                                  min_align)) {\n    *align = align_value;\n    return NoError();\n  }\n  return Error(\"unexpected force_align value '\" + align_constant +\n               \"', alignment must be a power of two integer ranging from the \"\n               \"type\\'s natural alignment \" +\n               NumToString(min_align) + \" to \" +\n               NumToString(FLATBUFFERS_MAX_ALIGNMENT));\n}\n\nCheckedError Parser::ParseVector(const Type& vector_type, uoffset_t* ovalue,\n                                 FieldDef* field, size_t fieldn) {\n  Type type = vector_type.VectorType();\n  size_t count = 0;\n  auto err = ParseVectorDelimiters(count, [&](size_t&) -> CheckedError {\n    Value val;\n    val.type = type;\n    ECHECK(ParseAnyValue(val, field, fieldn, nullptr, count, true));\n    field_stack_.push_back(std::make_pair(val, nullptr));\n    return NoError();\n  });\n  ECHECK(err);\n\n  const size_t alignment = InlineAlignment(type);\n  const size_t len = count * InlineSize(type) / InlineAlignment(type);\n  const size_t elemsize = InlineAlignment(type);\n  const auto force_align = field->attributes.Lookup(\"force_align\");\n  if (force_align) {\n    size_t align;\n    ECHECK(ParseAlignAttribute(force_align->constant, 1, &align));\n    if (align > 1) {\n      builder_.ForceVectorAlignment(len, elemsize, align);\n    }\n  }\n\n  // TODO Fix using element alignment as size (`elemsize`)!\n  if (vector_type.base_type == BASE_TYPE_VECTOR64) {\n    // TODO(derekbailey): this requires a 64-bit builder.\n    // builder_.StartVector<Offset64, uoffset64_t>(len, elemsize, alignment);\n    builder_.StartVector(len, elemsize, alignment);\n  } else {\n    builder_.StartVector(len, elemsize, alignment);\n  }\n  for (size_t i = 0; i < count; i++) {\n    // start at the back, since we're building the data backwards.\n    auto& val = field_stack_.back().first;\n    switch (val.type.base_type) {\n      // clang-format off\n      #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE,...) \\\n        case BASE_TYPE_ ## ENUM: \\\n          if (IsStruct(val.type)) SerializeStruct(*val.type.struct_def, val); \\\n          else { \\\n             CTYPE elem; \\\n             ECHECK(atot(val.constant.c_str(), *this, &elem)); \\\n             builder_.PushElement(elem); \\\n          } \\\n          break;\n        FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)\n      #undef FLATBUFFERS_TD\n      // clang-format on\n    }\n    field_stack_.pop_back();\n  }\n\n  builder_.ClearOffsets();\n  if (vector_type.base_type == BASE_TYPE_VECTOR64) {\n    *ovalue = builder_.EndVector<uoffset64_t>(count);\n  } else {\n    *ovalue = builder_.EndVector(count);\n  }\n\n  if (type.base_type == BASE_TYPE_STRUCT && type.struct_def->has_key) {\n    // We should sort this vector. Find the key first.\n    const FieldDef* key = nullptr;\n    for (auto it = type.struct_def->fields.vec.begin();\n         it != type.struct_def->fields.vec.end(); ++it) {\n      if ((*it)->key) {\n        key = (*it);\n        break;\n      }\n    }\n    FLATBUFFERS_ASSERT(key);\n    // Now sort it.\n    // We can't use std::sort because for structs the size is not known at\n    // compile time, and for tables our iterators dereference offsets, so can't\n    // be used to swap elements.\n    // And we can't use C qsort either, since that would force use to use\n    // globals, making parsing thread-unsafe.\n    // So for now, we use SimpleQsort above.\n    // TODO: replace with something better, preferably not recursive.\n\n    if (type.struct_def->fixed) {\n      const voffset_t offset = key->value.offset;\n      const size_t struct_size = type.struct_def->bytesize;\n      auto v =\n          reinterpret_cast<VectorOfAny*>(builder_.GetCurrentBufferPointer());\n      SimpleQsort<uint8_t>(\n          v->Data(), v->Data() + v->size() * type.struct_def->bytesize,\n          type.struct_def->bytesize,\n          [offset, key](const uint8_t* a, const uint8_t* b) -> bool {\n            return CompareSerializedScalars(a + offset, b + offset, *key);\n          },\n          [struct_size](uint8_t* a, uint8_t* b) {\n            // FIXME: faster?\n            for (size_t i = 0; i < struct_size; i++) {\n              std::swap(a[i], b[i]);\n            }\n          });\n    } else {\n      auto v = reinterpret_cast<Vector<Offset<Table>>*>(\n          builder_.GetCurrentBufferPointer());\n      // Here also can't use std::sort. We do have an iterator type for it,\n      // but it is non-standard as it will dereference the offsets, and thus\n      // can't be used to swap elements.\n      if (key->value.type.base_type == BASE_TYPE_STRING) {\n        SimpleQsort<Offset<Table>>(\n            v->data(), v->data() + v->size(), 1,\n            [key](const Offset<Table>* _a, const Offset<Table>* _b) -> bool {\n              return CompareTablesByStringKey(_a, _b, *key);\n            },\n            SwapSerializedTables);\n      } else {\n        SimpleQsort<Offset<Table>>(\n            v->data(), v->data() + v->size(), 1,\n            [key](const Offset<Table>* _a, const Offset<Table>* _b) -> bool {\n              return CompareTablesByScalarKey(_a, _b, *key);\n            },\n            SwapSerializedTables);\n      }\n    }\n  }\n  return NoError();\n}\n\nCheckedError Parser::ParseArray(Value& array) {\n  std::vector<Value> stack;\n  FlatBufferBuilder builder;\n  const auto& type = array.type.VectorType();\n  auto length = array.type.fixed_length;\n  size_t count = 0;\n  auto err = ParseVectorDelimiters(count, [&](size_t&) -> CheckedError {\n    stack.emplace_back(Value());\n    auto& val = stack.back();\n    val.type = type;\n    if (IsStruct(type)) {\n      ECHECK(ParseTable(*val.type.struct_def, &val.constant, nullptr));\n    } else {\n      ECHECK(ParseSingleValue(nullptr, val, false));\n    }\n    return NoError();\n  });\n  ECHECK(err);\n  if (length != count) return Error(\"Fixed-length array size is incorrect.\");\n\n  for (auto it = stack.rbegin(); it != stack.rend(); ++it) {\n    auto& val = *it;\n    // clang-format off\n    switch (val.type.base_type) {\n      #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \\\n        case BASE_TYPE_ ## ENUM: \\\n          if (IsStruct(val.type)) { \\\n            SerializeStruct(builder, *val.type.struct_def, val); \\\n          } else { \\\n            CTYPE elem; \\\n            ECHECK(atot(val.constant.c_str(), *this, &elem)); \\\n            builder.PushElement(elem); \\\n          } \\\n        break;\n        FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)\n      #undef FLATBUFFERS_TD\n      default: FLATBUFFERS_ASSERT(0);\n    }\n    // clang-format on\n  }\n\n  array.constant.assign(\n      reinterpret_cast<const char*>(builder.GetCurrentBufferPointer()),\n      InlineSize(array.type));\n  return NoError();\n}\n\nCheckedError Parser::ParseNestedFlatbuffer(Value& val, FieldDef* field,\n                                           size_t fieldn,\n                                           const StructDef* parent_struct_def) {\n  if (token_ == '[') {  // backwards compat for 'legacy' ubyte buffers\n    if (opts.json_nested_legacy_flatbuffers) {\n      ECHECK(ParseAnyValue(val, field, fieldn, parent_struct_def, 0));\n    } else {\n      return Error(\n          \"cannot parse nested_flatbuffer as bytes unless\"\n          \" --json-nested-bytes is set\");\n    }\n  } else {\n    auto cursor_at_value_begin = cursor_;\n    ECHECK(SkipAnyJsonValue());\n    std::string substring(cursor_at_value_begin - 1, cursor_ - 1);\n\n    // Create and initialize new parser\n    Parser nested_parser;\n    FLATBUFFERS_ASSERT(field->nested_flatbuffer);\n    nested_parser.root_struct_def_ = field->nested_flatbuffer;\n    nested_parser.enums_ = enums_;\n    nested_parser.opts = opts;\n    nested_parser.uses_flexbuffers_ = uses_flexbuffers_;\n    nested_parser.parse_depth_counter_ = parse_depth_counter_;\n    // Parse JSON substring into new flatbuffer builder using nested_parser\n    bool ok = nested_parser.Parse(substring.c_str(), nullptr, nullptr);\n\n    // Clean nested_parser to avoid deleting the elements in\n    // the SymbolTables on destruction\n    nested_parser.enums_.dict.clear();\n    nested_parser.enums_.vec.clear();\n\n    if (!ok) {\n      ECHECK(Error(nested_parser.error_));\n    }\n    // Force alignment for nested flatbuffer\n    builder_.ForceVectorAlignment(\n        nested_parser.builder_.GetSize(), sizeof(uint8_t),\n        nested_parser.builder_.GetBufferMinAlignment());\n\n    auto off = builder_.CreateVector(nested_parser.builder_.GetBufferPointer(),\n                                     nested_parser.builder_.GetSize());\n    val.constant = NumToString(off.o);\n  }\n  return NoError();\n}\n\nCheckedError Parser::ParseMetaData(SymbolTable<Value>* attributes) {\n  if (Is('(')) {\n    NEXT();\n    for (;;) {\n      auto name = attribute_;\n      if (false == (Is(kTokenIdentifier) || Is(kTokenStringConstant)))\n        return Error(\"attribute name must be either identifier or string: \" +\n                     name);\n      if (known_attributes_.find(name) == known_attributes_.end())\n        return Error(\"user define attributes must be declared before use: \" +\n                     name);\n      NEXT();\n      auto e = new Value();\n      if (attributes->Add(name, e)) Warning(\"attribute already found: \" + name);\n      if (Is(':')) {\n        NEXT();\n        ECHECK(ParseSingleValue(&name, *e, true));\n      }\n      if (Is(')')) {\n        NEXT();\n        break;\n      }\n      EXPECT(',');\n    }\n  }\n  return NoError();\n}\n\nCheckedError Parser::ParseEnumFromString(const Type& type,\n                                         std::string* result) {\n  const auto base_type =\n      type.enum_def ? type.enum_def->underlying_type.base_type : type.base_type;\n  if (!IsInteger(base_type)) return Error(\"not a valid value for this field\");\n  uint64_t u64 = 0;\n  for (size_t pos = 0; pos != std::string::npos;) {\n    const auto delim = attribute_.find_first_of(' ', pos);\n    const auto last = (std::string::npos == delim);\n    auto word = attribute_.substr(pos, !last ? delim - pos : std::string::npos);\n    pos = !last ? delim + 1 : std::string::npos;\n    const EnumVal* ev = nullptr;\n    if (type.enum_def) {\n      ev = type.enum_def->Lookup(word);\n    } else {\n      auto dot = word.find_first_of('.');\n      if (std::string::npos == dot)\n        return Error(\"enum values need to be qualified by an enum type\");\n      auto enum_def_str = word.substr(0, dot);\n      const auto enum_def = LookupEnum(enum_def_str);\n      if (!enum_def) return Error(\"unknown enum: \" + enum_def_str);\n      auto enum_val_str = word.substr(dot + 1);\n      ev = enum_def->Lookup(enum_val_str);\n    }\n    if (!ev) return Error(\"unknown enum value: \" + word);\n    u64 |= ev->GetAsUInt64();\n  }\n  *result = IsUnsigned(base_type) ? NumToString(u64)\n                                  : NumToString(static_cast<int64_t>(u64));\n  return NoError();\n}\n\nCheckedError Parser::ParseHash(Value& e, FieldDef* field) {\n  FLATBUFFERS_ASSERT(field);\n  Value* hash_name = field->attributes.Lookup(\"hash\");\n  switch (e.type.base_type) {\n    case BASE_TYPE_SHORT: {\n      auto hash = FindHashFunction16(hash_name->constant.c_str());\n      int16_t hashed_value = static_cast<int16_t>(hash(attribute_.c_str()));\n      e.constant = NumToString(hashed_value);\n      break;\n    }\n    case BASE_TYPE_USHORT: {\n      auto hash = FindHashFunction16(hash_name->constant.c_str());\n      uint16_t hashed_value = hash(attribute_.c_str());\n      e.constant = NumToString(hashed_value);\n      break;\n    }\n    case BASE_TYPE_INT: {\n      auto hash = FindHashFunction32(hash_name->constant.c_str());\n      int32_t hashed_value = static_cast<int32_t>(hash(attribute_.c_str()));\n      e.constant = NumToString(hashed_value);\n      break;\n    }\n    case BASE_TYPE_UINT: {\n      auto hash = FindHashFunction32(hash_name->constant.c_str());\n      uint32_t hashed_value = hash(attribute_.c_str());\n      e.constant = NumToString(hashed_value);\n      break;\n    }\n    case BASE_TYPE_LONG: {\n      auto hash = FindHashFunction64(hash_name->constant.c_str());\n      int64_t hashed_value = static_cast<int64_t>(hash(attribute_.c_str()));\n      e.constant = NumToString(hashed_value);\n      break;\n    }\n    case BASE_TYPE_ULONG: {\n      auto hash = FindHashFunction64(hash_name->constant.c_str());\n      uint64_t hashed_value = hash(attribute_.c_str());\n      e.constant = NumToString(hashed_value);\n      break;\n    }\n    default:\n      FLATBUFFERS_ASSERT(0);\n  }\n  NEXT();\n  return NoError();\n}\n\nCheckedError Parser::TokenError() {\n  return Error(\"cannot parse value starting with: \" + TokenToStringId(token_));\n}\n\nCheckedError Parser::ParseFunction(const std::string* name, Value& e) {\n  ParseDepthGuard depth_guard(this);\n  ECHECK(depth_guard.Check());\n\n  // Copy name, attribute will be changed on NEXT().\n  const auto functionname = attribute_;\n  if (!IsFloat(e.type.base_type)) {\n    return Error(functionname + \": type of argument mismatch, expecting: \" +\n                 TypeName(BASE_TYPE_DOUBLE) +\n                 \", found: \" + TypeName(e.type.base_type) +\n                 \", name: \" + (name ? *name : \"\") + \", value: \" + e.constant);\n  }\n  NEXT();\n  EXPECT('(');\n  ECHECK(ParseSingleValue(name, e, false));\n  EXPECT(')');\n  // calculate with double precision\n  double x, y = 0.0;\n  ECHECK(atot(e.constant.c_str(), *this, &x));\n  // clang-format off\n  auto func_match = false;\n  #define FLATBUFFERS_FN_DOUBLE(name, op) \\\n    if (!func_match && functionname == name) { y = op; func_match = true; }\n  FLATBUFFERS_FN_DOUBLE(\"deg\", x / kPi * 180);\n  FLATBUFFERS_FN_DOUBLE(\"rad\", x * kPi / 180);\n  FLATBUFFERS_FN_DOUBLE(\"sin\", sin(x));\n  FLATBUFFERS_FN_DOUBLE(\"cos\", cos(x));\n  FLATBUFFERS_FN_DOUBLE(\"tan\", tan(x));\n  FLATBUFFERS_FN_DOUBLE(\"asin\", asin(x));\n  FLATBUFFERS_FN_DOUBLE(\"acos\", acos(x));\n  FLATBUFFERS_FN_DOUBLE(\"atan\", atan(x));\n  // TODO(wvo): add more useful conversion functions here.\n  #undef FLATBUFFERS_FN_DOUBLE\n  // clang-format on\n  if (true != func_match) {\n    return Error(std::string(\"Unknown conversion function: \") + functionname +\n                 \", field name: \" + (name ? *name : \"\") +\n                 \", value: \" + e.constant);\n  }\n  e.constant = NumToString(y);\n  return NoError();\n}\n\nCheckedError Parser::TryTypedValue(const std::string* name, int dtoken,\n                                   bool check, Value& e, BaseType req,\n                                   bool* destmatch) {\n  FLATBUFFERS_ASSERT(*destmatch == false && dtoken == token_);\n  *destmatch = true;\n  e.constant = attribute_;\n  // Check token match\n  if (!check) {\n    if (e.type.base_type == BASE_TYPE_NONE) {\n      e.type.base_type = req;\n    } else {\n      return Error(std::string(\"type mismatch: expecting: \") +\n                   TypeName(e.type.base_type) + \", found: \" + TypeName(req) +\n                   \", name: \" + (name ? *name : \"\") + \", value: \" + e.constant);\n    }\n  }\n  // The exponent suffix of hexadecimal float-point number is mandatory.\n  // A hex-integer constant is forbidden as an initializer of float number.\n  if ((kTokenFloatConstant != dtoken) && IsFloat(e.type.base_type)) {\n    const auto& s = e.constant;\n    const auto k = s.find_first_of(\"0123456789.\");\n    if ((std::string::npos != k) && (s.length() > (k + 1)) &&\n        (s[k] == '0' && is_alpha_char(s[k + 1], 'X')) &&\n        (std::string::npos == s.find_first_of(\"pP\", k + 2))) {\n      return Error(\n          \"invalid number, the exponent suffix of hexadecimal \"\n          \"floating-point literals is mandatory: \\\"\" +\n          s + \"\\\"\");\n    }\n  }\n  NEXT();\n  return NoError();\n}\n\nCheckedError Parser::ParseSingleValue(const std::string* name, Value& e,\n                                      bool check_now) {\n  if (token_ == '+' || token_ == '-') {\n    const char sign = static_cast<char>(token_);\n    // Get an indentifier: NAN, INF, or function name like cos/sin/deg.\n    NEXT();\n    if (token_ != kTokenIdentifier) return Error(\"constant name expected\");\n    attribute_.insert(size_t(0), size_t(1), sign);\n  }\n\n  const auto in_type = e.type.base_type;\n  const auto is_tok_ident = (token_ == kTokenIdentifier);\n  const auto is_tok_string = (token_ == kTokenStringConstant);\n\n  // First see if this could be a conversion function.\n  if (is_tok_ident && *cursor_ == '(') {\n    return ParseFunction(name, e);\n  }\n\n  // clang-format off\n  auto match = false;\n\n  #define IF_ECHECK_(force, dtoken, check, req)    \\\n    if (!match && ((dtoken) == token_) && ((check) || flatbuffers::IsConstTrue(force))) \\\n      ECHECK(TryTypedValue(name, dtoken, check, e, req, &match))\n  #define TRY_ECHECK(dtoken, check, req) IF_ECHECK_(false, dtoken, check, req)\n  #define FORCE_ECHECK(dtoken, check, req) IF_ECHECK_(true, dtoken, check, req)\n  // clang-format on\n\n  if (is_tok_ident || is_tok_string) {\n    const auto kTokenStringOrIdent = token_;\n    // The string type is a most probable type, check it first.\n    TRY_ECHECK(kTokenStringConstant, in_type == BASE_TYPE_STRING,\n               BASE_TYPE_STRING);\n\n    // avoid escaped and non-ascii in the string\n    if (!match && is_tok_string && IsScalar(in_type) &&\n        !attr_is_trivial_ascii_string_) {\n      return Error(\n          std::string(\"type mismatch or invalid value, an initializer of \"\n                      \"non-string field must be trivial ASCII string: type: \") +\n          TypeName(in_type) + \", name: \" + (name ? *name : \"\") +\n          \", value: \" + attribute_);\n    }\n\n    // A boolean as true/false. Boolean as Integer check below.\n    if (!match && IsBool(in_type)) {\n      auto is_true = attribute_ == \"true\";\n      if (is_true || attribute_ == \"false\") {\n        attribute_ = is_true ? \"1\" : \"0\";\n        // accepts both kTokenStringConstant and kTokenIdentifier\n        TRY_ECHECK(kTokenStringOrIdent, IsBool(in_type), BASE_TYPE_BOOL);\n      }\n    }\n    // Check for optional scalars.\n    if (!match && IsScalar(in_type) && attribute_ == \"null\") {\n      e.constant = \"null\";\n      NEXT();\n      match = true;\n    }\n    // Check if this could be a string/identifier enum value.\n    // Enum can have only true integer base type.\n    if (!match && IsInteger(in_type) && !IsBool(in_type) &&\n        IsIdentifierStart(*attribute_.c_str())) {\n      ECHECK(ParseEnumFromString(e.type, &e.constant));\n      NEXT();\n      match = true;\n    }\n    // Parse a float/integer number from the string.\n    // A \"scalar-in-string\" value needs extra checks.\n    if (!match && is_tok_string && IsScalar(in_type)) {\n      // Strip trailing whitespaces from attribute_.\n      auto last_non_ws = attribute_.find_last_not_of(' ');\n      if (std::string::npos != last_non_ws) attribute_.resize(last_non_ws + 1);\n      if (IsFloat(e.type.base_type)) {\n        // The functions strtod() and strtof() accept both 'nan' and\n        // 'nan(number)' literals. While 'nan(number)' is rejected by the parser\n        // as an unsupported function if is_tok_ident is true.\n        if (attribute_.find_last_of(')') != std::string::npos) {\n          return Error(\"invalid number: \" + attribute_);\n        }\n      }\n    }\n    // Float numbers or nan, inf, pi, etc.\n    TRY_ECHECK(kTokenStringOrIdent, IsFloat(in_type), BASE_TYPE_FLOAT);\n    // An integer constant in string.\n    TRY_ECHECK(kTokenStringOrIdent, IsInteger(in_type), BASE_TYPE_INT);\n    // Unknown tokens will be interpreted as string type.\n    // An attribute value may be a scalar or string constant.\n    FORCE_ECHECK(kTokenStringConstant, in_type == BASE_TYPE_STRING,\n                 BASE_TYPE_STRING);\n  } else {\n    // Try a float number.\n    TRY_ECHECK(kTokenFloatConstant, IsFloat(in_type), BASE_TYPE_FLOAT);\n    // Integer token can init any scalar (integer of float).\n    FORCE_ECHECK(kTokenIntegerConstant, IsScalar(in_type), BASE_TYPE_INT);\n  }\n  // Match empty vectors for default-empty-vectors.\n  if (!match && IsVector(e.type) && token_ == '[') {\n    NEXT();\n    if (token_ != ']') {\n      return Error(\"Expected `]` in vector default\");\n    }\n    NEXT();\n    match = true;\n    e.constant = \"[]\";\n  }\n\n#undef FORCE_ECHECK\n#undef TRY_ECHECK\n#undef IF_ECHECK_\n\n  if (!match) {\n    std::string msg;\n    msg += \"Cannot assign token starting with '\" + TokenToStringId(token_) +\n           \"' to value of <\" + std::string(TypeName(in_type)) + \"> type.\";\n    return Error(msg);\n  }\n  const auto match_type = e.type.base_type;  // may differ from in_type\n  // The check_now flag must be true when parse a fbs-schema.\n  // This flag forces to check default scalar values or metadata of field.\n  // For JSON parser the flag should be false.\n  // If it is set for JSON each value will be checked twice (see ParseTable).\n  // Special case 'null' since atot can't handle that.\n  if (check_now && IsScalar(match_type) && e.constant != \"null\") {\n    // clang-format off\n    switch (match_type) {\n    #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \\\n      case BASE_TYPE_ ## ENUM: {\\\n          CTYPE val; \\\n          ECHECK(atot(e.constant.c_str(), *this, &val)); \\\n          SingleValueRepack(e, val); \\\n        break; }\n    FLATBUFFERS_GEN_TYPES_SCALAR(FLATBUFFERS_TD)\n    #undef FLATBUFFERS_TD\n    default: break;\n    }\n    // clang-format on\n  }\n  return NoError();\n}\n\nStructDef* Parser::LookupCreateStruct(const std::string& name,\n                                      bool create_if_new, bool definition) {\n  std::string qualified_name = current_namespace_->GetFullyQualifiedName(name);\n  // See if it exists pre-declared by an unqualified use.\n  auto struct_def = LookupStruct(name);\n  if (struct_def && struct_def->predecl) {\n    if (definition) {\n      // Make sure it has the current namespace, and is registered under its\n      // qualified name.\n      struct_def->defined_namespace = current_namespace_;\n      structs_.Move(name, qualified_name);\n    }\n    return struct_def;\n  }\n  // See if it exists pre-declared by an qualified use.\n  struct_def = LookupStruct(qualified_name);\n  if (struct_def && struct_def->predecl) {\n    if (definition) {\n      // Make sure it has the current namespace.\n      struct_def->defined_namespace = current_namespace_;\n    }\n    return struct_def;\n  }\n  if (!definition && !struct_def) {\n    struct_def = LookupStructThruParentNamespaces(name);\n  }\n  if (!struct_def && create_if_new) {\n    struct_def = new StructDef();\n    if (definition) {\n      structs_.Add(qualified_name, struct_def);\n      struct_def->name = name;\n      struct_def->defined_namespace = current_namespace_;\n    } else {\n      // Not a definition.\n      // Rather than failing, we create a \"pre declared\" StructDef, due to\n      // circular references, and check for errors at the end of parsing.\n      // It is defined in the current namespace, as the best guess what the\n      // final namespace will be.\n      structs_.Add(name, struct_def);\n      struct_def->name = name;\n      struct_def->defined_namespace = current_namespace_;\n      struct_def->original_location.reset(\n          new std::string(file_being_parsed_ + \":\" + NumToString(line_)));\n    }\n  }\n  return struct_def;\n}\n\nconst EnumVal* EnumDef::MinValue() const {\n  return vals.vec.empty() ? nullptr : vals.vec.front();\n}\nconst EnumVal* EnumDef::MaxValue() const {\n  return vals.vec.empty() ? nullptr : vals.vec.back();\n}\n\nuint64_t EnumDef::Distance(const EnumVal* v1, const EnumVal* v2) const {\n  return IsUInt64() ? EnumDistanceImpl(v1->GetAsUInt64(), v2->GetAsUInt64())\n                    : EnumDistanceImpl(v1->GetAsInt64(), v2->GetAsInt64());\n}\n\nstd::string EnumDef::AllFlags() const {\n  FLATBUFFERS_ASSERT(attributes.Lookup(\"bit_flags\"));\n  uint64_t u64 = 0;\n  for (auto it = Vals().begin(); it != Vals().end(); ++it) {\n    u64 |= (*it)->GetAsUInt64();\n  }\n  return IsUInt64() ? NumToString(u64) : NumToString(static_cast<int64_t>(u64));\n}\n\nEnumVal* EnumDef::ReverseLookup(int64_t enum_idx,\n                                bool skip_union_default) const {\n  auto skip_first = static_cast<int>(is_union && skip_union_default);\n  for (auto it = Vals().begin() + skip_first; it != Vals().end(); ++it) {\n    if ((*it)->GetAsInt64() == enum_idx) {\n      return *it;\n    }\n  }\n  return nullptr;\n}\n\nEnumVal* EnumDef::FindByValue(const std::string& constant) const {\n  int64_t i64;\n  auto done = false;\n  if (IsUInt64()) {\n    uint64_t u64;  // avoid reinterpret_cast of pointers\n    done = StringToNumber(constant.c_str(), &u64);\n    i64 = static_cast<int64_t>(u64);\n  } else {\n    done = StringToNumber(constant.c_str(), &i64);\n  }\n  FLATBUFFERS_ASSERT(done);\n  if (!done) return nullptr;\n  return ReverseLookup(i64, false);\n}\n\nvoid EnumDef::SortByValue() {\n  auto& v = vals.vec;\n  if (IsUInt64())\n    std::sort(v.begin(), v.end(), [](const EnumVal* e1, const EnumVal* e2) {\n      if (e1->GetAsUInt64() == e2->GetAsUInt64()) {\n        return e1->name < e2->name;\n      }\n      return e1->GetAsUInt64() < e2->GetAsUInt64();\n    });\n  else\n    std::sort(v.begin(), v.end(), [](const EnumVal* e1, const EnumVal* e2) {\n      if (e1->GetAsInt64() == e2->GetAsInt64()) {\n        return e1->name < e2->name;\n      }\n      return e1->GetAsInt64() < e2->GetAsInt64();\n    });\n}\n\nvoid EnumDef::RemoveDuplicates() {\n  // This method depends form SymbolTable implementation!\n  // 1) vals.vec - owner (raw pointer)\n  // 2) vals.dict - access map\n  auto first = vals.vec.begin();\n  auto last = vals.vec.end();\n  if (first == last) return;\n  auto result = first;\n  while (++first != last) {\n    if ((*result)->value != (*first)->value) {\n      *(++result) = *first;\n    } else {\n      auto ev = *first;\n      for (auto it = vals.dict.begin(); it != vals.dict.end(); ++it) {\n        if (it->second == ev) it->second = *result;  // reassign\n      }\n      delete ev;  // delete enum value\n      *first = nullptr;\n    }\n  }\n  vals.vec.erase(++result, last);\n}\n\ntemplate <typename T>\nvoid EnumDef::ChangeEnumValue(EnumVal* ev, T new_value) {\n  ev->value = static_cast<int64_t>(new_value);\n}\n\nnamespace EnumHelper {\ntemplate <BaseType E>\nstruct EnumValType {\n  typedef int64_t type;\n};\ntemplate <>\nstruct EnumValType<BASE_TYPE_ULONG> {\n  typedef uint64_t type;\n};\n}  // namespace EnumHelper\n\nstruct EnumValBuilder {\n  EnumVal* CreateEnumerator(const std::string& ev_name) {\n    FLATBUFFERS_ASSERT(!temp);\n    auto first = enum_def.vals.vec.empty();\n    user_value = first;\n    temp = new EnumVal(ev_name, first ? 0 : enum_def.vals.vec.back()->value);\n    return temp;\n  }\n\n  EnumVal* CreateEnumerator(const std::string& ev_name, int64_t val) {\n    FLATBUFFERS_ASSERT(!temp);\n    user_value = true;\n    temp = new EnumVal(ev_name, val);\n    return temp;\n  }\n\n  FLATBUFFERS_CHECKED_ERROR AcceptEnumerator(const std::string& name) {\n    FLATBUFFERS_ASSERT(temp);\n    ECHECK(ValidateValue(&temp->value, false == user_value));\n    FLATBUFFERS_ASSERT((temp->union_type.enum_def == nullptr) ||\n                       (temp->union_type.enum_def == &enum_def));\n    auto not_unique = enum_def.vals.Add(name, temp);\n    temp = nullptr;\n    if (not_unique) return parser.Error(\"enum value already exists: \" + name);\n    return NoError();\n  }\n\n  FLATBUFFERS_CHECKED_ERROR AcceptEnumerator() {\n    return AcceptEnumerator(temp->name);\n  }\n\n  FLATBUFFERS_CHECKED_ERROR AssignEnumeratorValue(const std::string& value) {\n    user_value = true;\n    auto fit = false;\n    if (enum_def.IsUInt64()) {\n      uint64_t u64;\n      fit = StringToNumber(value.c_str(), &u64);\n      temp->value = static_cast<int64_t>(u64);  // well-defined since C++20.\n    } else {\n      int64_t i64;\n      fit = StringToNumber(value.c_str(), &i64);\n      temp->value = i64;\n    }\n    if (!fit) return parser.Error(\"enum value does not fit, \\\"\" + value + \"\\\"\");\n    return NoError();\n  }\n\n  template <BaseType E, typename CTYPE>\n  inline FLATBUFFERS_CHECKED_ERROR ValidateImpl(int64_t* ev, int m) {\n    typedef typename EnumHelper::EnumValType<E>::type T;  // int64_t or uint64_t\n    static_assert(sizeof(T) == sizeof(int64_t), \"invalid EnumValType\");\n    const auto v = static_cast<T>(*ev);\n    auto up = static_cast<T>((flatbuffers::numeric_limits<CTYPE>::max)());\n    auto dn = static_cast<T>((flatbuffers::numeric_limits<CTYPE>::lowest)());\n    if (v < dn || v > (up - m)) {\n      return parser.Error(\"enum value does not fit, \\\"\" + NumToString(v) +\n                          (m ? \" + 1\\\"\" : \"\\\"\") + \" out of \" +\n                          TypeToIntervalString<CTYPE>());\n    }\n    *ev = static_cast<int64_t>(v + m);  // well-defined since C++20.\n    return NoError();\n  }\n\n  FLATBUFFERS_CHECKED_ERROR ValidateValue(int64_t* ev, bool next) {\n    // clang-format off\n    switch (enum_def.underlying_type.base_type) {\n    #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...)                   \\\n      case BASE_TYPE_##ENUM: {                                          \\\n        if (!IsInteger(BASE_TYPE_##ENUM)) break;                        \\\n        return ValidateImpl<BASE_TYPE_##ENUM, CTYPE>(ev, next ? 1 : 0); \\\n      }\n      FLATBUFFERS_GEN_TYPES_SCALAR(FLATBUFFERS_TD)\n    #undef FLATBUFFERS_TD\n    default: break;\n    }\n    // clang-format on\n    return parser.Error(\"fatal: invalid enum underlying type\");\n  }\n\n  EnumValBuilder(Parser& _parser, EnumDef& _enum_def)\n      : parser(_parser),\n        enum_def(_enum_def),\n        temp(nullptr),\n        user_value(false) {}\n\n  ~EnumValBuilder() { delete temp; }\n\n  Parser& parser;\n  EnumDef& enum_def;\n  EnumVal* temp;\n  bool user_value;\n};\n\nCheckedError Parser::ParseEnum(const bool is_union, EnumDef** dest,\n                               const char* filename) {\n  std::vector<std::string> enum_comment = doc_comment_;\n  NEXT();\n  std::string enum_name = attribute_;\n  EXPECT(kTokenIdentifier);\n  EnumDef* enum_def;\n  ECHECK(StartEnum(enum_name, is_union, &enum_def));\n  if (filename != nullptr && !opts.project_root.empty()) {\n    enum_def->declaration_file = &GetPooledString(FilePath(\n        opts.project_root, filename, opts.binary_schema_absolute_paths));\n  }\n  enum_def->doc_comment = enum_comment;\n  if (!opts.proto_mode) {\n    // Give specialized error message, since this type spec used to\n    // be optional in the first FlatBuffers release.\n    bool explicit_underlying_type = false;\n    if (!Is(':')) {\n      // Enum is forced to have an explicit underlying type in declaration.\n      if (!is_union) {\n        return Error(\n            \"must specify the underlying integer type for this\"\n            \" enum (e.g. \\': short\\', which was the default).\");\n      }\n    } else {\n      // Union underlying type is only supported for cpp\n      if (is_union && !SupportsUnionUnderlyingType()) {\n        return Error(\n            \"Underlying type for union is not yet supported in at least one of \"\n            \"the specified programming languages.\");\n      }\n      NEXT();\n      explicit_underlying_type = true;\n    }\n\n    if (explicit_underlying_type) {\n      // Specify the integer type underlying this enum.\n      ECHECK(ParseType(enum_def->underlying_type));\n      if (!IsInteger(enum_def->underlying_type.base_type) ||\n          IsBool(enum_def->underlying_type.base_type)) {\n        return Error(\"underlying \" + std::string(is_union ? \"union\" : \"enum\") +\n                     \"type must be integral\");\n      }\n\n      // Make this type refer back to the enum it was derived from.\n      enum_def->underlying_type.enum_def = enum_def;\n    }\n  }\n  ECHECK(ParseMetaData(&enum_def->attributes));\n  const auto underlying_type = enum_def->underlying_type.base_type;\n  if (enum_def->attributes.Lookup(\"bit_flags\") &&\n      !IsUnsigned(underlying_type)) {\n    // todo: Convert to the Error in the future?\n    Warning(\"underlying type of bit_flags enum must be unsigned\");\n  }\n  if (enum_def->attributes.Lookup(\"force_align\")) {\n    return Error(\"`force_align` is not a valid attribute for Enums. \");\n  }\n  EnumValBuilder evb(*this, *enum_def);\n  EXPECT('{');\n  // A lot of code generatos expect that an enum is not-empty.\n  if ((is_union || Is('}')) && !opts.proto_mode) {\n    evb.CreateEnumerator(\"NONE\");\n    ECHECK(evb.AcceptEnumerator());\n  }\n  std::set<std::pair<BaseType, StructDef*>> union_types;\n  while (!Is('}')) {\n    if (opts.proto_mode && attribute_ == \"option\") {\n      ECHECK(ParseProtoOption());\n    } else {\n      auto& ev = *evb.CreateEnumerator(attribute_);\n      auto full_name = ev.name;\n      ev.doc_comment = doc_comment_;\n      EXPECT(kTokenIdentifier);\n      if (is_union) {\n        ECHECK(ParseNamespacing(&full_name, &ev.name));\n        if (opts.union_value_namespacing) {\n          // Since we can't namespace the actual enum identifiers, turn\n          // namespace parts into part of the identifier.\n          ev.name = full_name;\n          std::replace(ev.name.begin(), ev.name.end(), '.', '_');\n        }\n        if (Is(':')) {\n          NEXT();\n          ECHECK(ParseType(ev.union_type));\n          if (ev.union_type.base_type != BASE_TYPE_STRUCT &&\n              ev.union_type.base_type != BASE_TYPE_STRING)\n            return Error(\"union value type may only be table/struct/string\");\n        } else {\n          ev.union_type = Type(BASE_TYPE_STRUCT, LookupCreateStruct(full_name));\n        }\n        if (!enum_def->uses_multiple_type_instances) {\n          auto ins = union_types.insert(std::make_pair(\n              ev.union_type.base_type, ev.union_type.struct_def));\n          enum_def->uses_multiple_type_instances = (false == ins.second);\n        }\n      }\n\n      if (Is('=')) {\n        NEXT();\n        ECHECK(evb.AssignEnumeratorValue(attribute_));\n        EXPECT(kTokenIntegerConstant);\n      }\n\n      if (opts.proto_mode && Is('[')) {\n        NEXT();\n        // ignore attributes on enums.\n        while (token_ != ']') NEXT();\n        NEXT();\n      } else {\n        // parse attributes in fbs schema\n        ECHECK(ParseMetaData(&ev.attributes));\n      }\n\n      ECHECK(evb.AcceptEnumerator());\n    }\n    if (!Is(opts.proto_mode ? ';' : ',')) break;\n    NEXT();\n  }\n  EXPECT('}');\n\n  // At this point, the enum can be empty if input is invalid proto-file.\n  if (!enum_def->size())\n    return Error(\"incomplete enum declaration, values not found\");\n\n  if (enum_def->attributes.Lookup(\"bit_flags\")) {\n    const auto base_width = static_cast<uint64_t>(8 * SizeOf(underlying_type));\n    for (auto it = enum_def->Vals().begin(); it != enum_def->Vals().end();\n         ++it) {\n      auto ev = *it;\n      const auto u = ev->GetAsUInt64();\n      // Stop manipulations with the sign.\n      if (!IsUnsigned(underlying_type) && u == (base_width - 1))\n        return Error(\"underlying type of bit_flags enum must be unsigned\");\n      if (u >= base_width)\n        return Error(\"bit flag out of range of underlying integral type\");\n      enum_def->ChangeEnumValue(ev, 1ULL << u);\n    }\n  }\n\n  enum_def->SortByValue();  // Must be sorted to use MinValue/MaxValue.\n\n  // Ensure enum value uniqueness.\n  auto prev_it = enum_def->Vals().begin();\n  for (auto it = prev_it + 1; it != enum_def->Vals().end(); ++it) {\n    auto prev_ev = *prev_it;\n    auto ev = *it;\n    if (prev_ev->GetAsUInt64() == ev->GetAsUInt64())\n      return Error(\"all enum values must be unique: \" + prev_ev->name +\n                   \" and \" + ev->name + \" are both \" +\n                   NumToString(ev->GetAsInt64()));\n  }\n\n  if (dest) *dest = enum_def;\n  const auto qualified_name =\n      current_namespace_->GetFullyQualifiedName(enum_def->name);\n  if (types_.Add(qualified_name, new Type(BASE_TYPE_UNION, nullptr, enum_def)))\n    return Error(\"datatype already exists: \" + qualified_name);\n  return NoError();\n}\n\nCheckedError Parser::StartStruct(const std::string& name, StructDef** dest) {\n  auto& struct_def = *LookupCreateStruct(name, true, true);\n  if (!struct_def.predecl)\n    return Error(\"datatype already exists: \" +\n                 current_namespace_->GetFullyQualifiedName(name));\n  struct_def.predecl = false;\n  struct_def.name = name;\n  struct_def.file = file_being_parsed_;\n  // Move this struct to the back of the vector just in case it was predeclared,\n  // to preserve declaration order.\n  *std::remove(structs_.vec.begin(), structs_.vec.end(), &struct_def) =\n      &struct_def;\n  *dest = &struct_def;\n  return NoError();\n}\n\nCheckedError Parser::CheckClash(std::vector<FieldDef*>& fields,\n                                StructDef* struct_def, const char* suffix,\n                                BaseType basetype) {\n  auto len = strlen(suffix);\n  for (auto it = fields.begin(); it != fields.end(); ++it) {\n    auto& fname = (*it)->name;\n    if (fname.length() > len &&\n        fname.compare(fname.length() - len, len, suffix) == 0 &&\n        (*it)->value.type.base_type != BASE_TYPE_UTYPE) {\n      auto field =\n          struct_def->fields.Lookup(fname.substr(0, fname.length() - len));\n      if (field && field->value.type.base_type == basetype)\n        return Error(\"Field \" + fname +\n                     \" would clash with generated functions for field \" +\n                     field->name);\n    }\n  }\n  return NoError();\n}\n\nstd::vector<IncludedFile> Parser::GetIncludedFiles() const {\n  const auto it = files_included_per_file_.find(file_being_parsed_);\n  if (it == files_included_per_file_.end()) {\n    return {};\n  }\n\n  return {it->second.cbegin(), it->second.cend()};\n}\n\nbool Parser::HasCircularStructDependency() {\n  std::function<bool(StructDef*)> visit =\n      [&](StructDef* struct_def) {\n        // Only consider fixed structs and structs we have yet to check\n        if (!struct_def->fixed || struct_def->cycle_status == StructDef::CycleStatus::Checked) {\n          return false;\n        }\n\n        if (struct_def->cycle_status == StructDef::CycleStatus::InProgress) {\n          // cycle found\n          return true;\n        }\n\n        struct_def->cycle_status = StructDef::CycleStatus::InProgress;\n\n        for (const auto& field : struct_def->fields.vec) {\n          if (field->value.type.base_type == BASE_TYPE_STRUCT) {\n            if (visit(field->value.type.struct_def)) {\n              return true;  // Cycle detected in recursion.\n            }\n          }\n        }\n\n        struct_def->cycle_status = StructDef::CycleStatus::Checked;\n        return false;  // No cycle detected.\n      };\n\n  for (const auto& struct_def : structs_.vec) {\n    if (visit(struct_def)) {\n      return true;  // Cycle detected.\n    }\n  }\n\n  return false;  // No cycle detected.\n}\n\nbool Parser::SupportsOptionalScalars(const flatbuffers::IDLOptions& opts) {\n  static FLATBUFFERS_CONSTEXPR unsigned long supported_langs =\n      IDLOptions::kRust | IDLOptions::kSwift | IDLOptions::kLobster |\n      IDLOptions::kKotlin | IDLOptions::kKotlinKmp | IDLOptions::kCpp |\n      IDLOptions::kJava | IDLOptions::kCSharp | IDLOptions::kTs |\n      IDLOptions::kBinary | IDLOptions::kGo | IDLOptions::kPython |\n      IDLOptions::kJson | IDLOptions::kNim;\n  unsigned long langs = opts.lang_to_generate;\n  return (langs > 0 && langs < IDLOptions::kMAX) && !(langs & ~supported_langs);\n}\nbool Parser::SupportsOptionalScalars() const {\n  // Check in general if a language isn't specified.\n  return opts.lang_to_generate == 0 || SupportsOptionalScalars(opts);\n}\n\nbool Parser::SupportsDefaultVectorsAndStrings() const {\n  static FLATBUFFERS_CONSTEXPR unsigned long supported_langs =\n      IDLOptions::kRust | IDLOptions::kSwift | IDLOptions::kNim |\n      IDLOptions::kCpp | IDLOptions::kBinary | IDLOptions::kJson |\n      IDLOptions::kTs;\n  return !(opts.lang_to_generate & ~supported_langs);\n}\n\nbool Parser::SupportsAdvancedUnionFeatures() const {\n  return (opts.lang_to_generate &\n          ~(IDLOptions::kCpp | IDLOptions::kTs | IDLOptions::kPhp |\n            IDLOptions::kJava | IDLOptions::kCSharp | IDLOptions::kKotlin |\n            IDLOptions::kBinary | IDLOptions::kSwift | IDLOptions::kNim |\n            IDLOptions::kJson | IDLOptions::kKotlinKmp)) == 0;\n}\n\nbool Parser::SupportsAdvancedArrayFeatures() const {\n  return (opts.lang_to_generate &\n          ~(IDLOptions::kCpp | IDLOptions::kPython | IDLOptions::kJava |\n            IDLOptions::kCSharp | IDLOptions::kJsonSchema | IDLOptions::kJson |\n            IDLOptions::kBinary | IDLOptions::kRust | IDLOptions::kTs |\n            IDLOptions::kSwift)) == 0;\n}\n\nbool Parser::Supports64BitOffsets() const {\n  return (opts.lang_to_generate &\n          ~(IDLOptions::kCpp | IDLOptions::kJson | IDLOptions::kBinary)) == 0;\n}\n\nbool Parser::SupportsUnionUnderlyingType() const {\n  return (opts.lang_to_generate &\n          ~(IDLOptions::kCpp | IDLOptions::kTs | IDLOptions::kBinary)) == 0;\n}\n\nNamespace* Parser::UniqueNamespace(Namespace* ns) {\n  for (auto it = namespaces_.begin(); it != namespaces_.end(); ++it) {\n    if (ns->components == (*it)->components) {\n      delete ns;\n      return *it;\n    }\n  }\n  namespaces_.push_back(ns);\n  return ns;\n}\n\nstd::string Parser::UnqualifiedName(const std::string& full_qualified_name) {\n  Namespace* ns = new Namespace();\n\n  std::size_t current, previous = 0;\n  current = full_qualified_name.find('.');\n  while (current != std::string::npos) {\n    ns->components.push_back(\n        full_qualified_name.substr(previous, current - previous));\n    previous = current + 1;\n    current = full_qualified_name.find('.', previous);\n  }\n  current_namespace_ = UniqueNamespace(ns);\n  return full_qualified_name.substr(previous, current - previous);\n}\n\nCheckedError Parser::ParseDecl(const char* filename) {\n  std::vector<std::string> dc = doc_comment_;\n  bool fixed = IsIdent(\"struct\");\n  if (!fixed && !IsIdent(\"table\")) return Error(\"declaration expected\");\n  NEXT();\n  std::string name = attribute_;\n  EXPECT(kTokenIdentifier);\n  StructDef* struct_def;\n  ECHECK(StartStruct(name, &struct_def));\n  struct_def->doc_comment = dc;\n  struct_def->fixed = fixed;\n  if (filename && !opts.project_root.empty()) {\n    struct_def->declaration_file = &GetPooledString(FilePath(\n        opts.project_root, filename, opts.binary_schema_absolute_paths));\n  }\n  ECHECK(ParseMetaData(&struct_def->attributes));\n  struct_def->sortbysize =\n      struct_def->attributes.Lookup(\"original_order\") == nullptr && !fixed;\n  EXPECT('{');\n  while (token_ != '}') ECHECK(ParseField(*struct_def));\n  if (fixed) {\n    const auto force_align = struct_def->attributes.Lookup(\"force_align\");\n    if (force_align) {\n      size_t align;\n      ECHECK(ParseAlignAttribute(force_align->constant, struct_def->minalign,\n                                 &align));\n      struct_def->minalign = align;\n    }\n    if (!struct_def->bytesize) return Error(\"size 0 structs not allowed\");\n  }\n  struct_def->PadLastField(struct_def->minalign);\n  // Check if this is a table that has manual id assignments\n  auto& fields = struct_def->fields.vec;\n  if (!fixed && fields.size()) {\n    size_t num_id_fields = 0;\n    for (auto it = fields.begin(); it != fields.end(); ++it) {\n      if ((*it)->attributes.Lookup(\"id\")) num_id_fields++;\n    }\n    // If any fields have ids..\n    if (num_id_fields || opts.require_explicit_ids) {\n      // Then all fields must have them.\n      if (num_id_fields != fields.size()) {\n        if (opts.require_explicit_ids) {\n          return Error(\n              \"all fields must have an 'id' attribute when \"\n              \"--require-explicit-ids is used\");\n        } else {\n          return Error(\n              \"either all fields or no fields must have an 'id' attribute\");\n        }\n      }\n      // Simply sort by id, then the fields are the same as if no ids had\n      // been specified.\n      std::sort(fields.begin(), fields.end(), compareFieldDefs);\n      // Verify we have a contiguous set, and reassign vtable offsets.\n      FLATBUFFERS_ASSERT(fields.size() <=\n                         flatbuffers::numeric_limits<voffset_t>::max());\n      for (voffset_t i = 0; i < static_cast<voffset_t>(fields.size()); i++) {\n        auto& field = *fields[i];\n        const auto& id_str = field.attributes.Lookup(\"id\")->constant;\n\n        // Metadata values have a dynamic type, they can be `float`, 'int', or\n        // 'string`.\n        // The FieldIndexToOffset(i) expects the voffset_t so `id` is limited by\n        // this type.\n        voffset_t id = 0;\n        const auto done = !atot(id_str.c_str(), *this, &id).Check();\n        if (!done)\n          return Error(\"field id\\'s must be non-negative number, field: \" +\n                       field.name + \", id: \" + id_str);\n        if (i != id)\n          return Error(\"field id\\'s must be consecutive from 0, id \" +\n                       NumToString(i) + \" missing or set twice, field: \" +\n                       field.name + \", id: \" + id_str);\n        field.value.offset = FieldIndexToOffset(i);\n      }\n    }\n  }\n\n  ECHECK(\n      CheckClash(fields, struct_def, UnionTypeFieldSuffix(), BASE_TYPE_UNION));\n  ECHECK(CheckClash(fields, struct_def, \"Type\", BASE_TYPE_UNION));\n  ECHECK(CheckClash(fields, struct_def, \"_length\", BASE_TYPE_VECTOR));\n  ECHECK(CheckClash(fields, struct_def, \"Length\", BASE_TYPE_VECTOR));\n  ECHECK(CheckClash(fields, struct_def, \"_byte_vector\", BASE_TYPE_STRING));\n  ECHECK(CheckClash(fields, struct_def, \"ByteVector\", BASE_TYPE_STRING));\n  EXPECT('}');\n  const auto qualified_name =\n      current_namespace_->GetFullyQualifiedName(struct_def->name);\n  if (types_.Add(qualified_name,\n                 new Type(BASE_TYPE_STRUCT, struct_def, nullptr)))\n    return Error(\"datatype already exists: \" + qualified_name);\n  return NoError();\n}\n\nCheckedError Parser::ParseService(const char* filename) {\n  std::vector<std::string> service_comment = doc_comment_;\n  NEXT();\n  auto service_name = attribute_;\n  EXPECT(kTokenIdentifier);\n  auto& service_def = *new ServiceDef();\n  service_def.name = service_name;\n  service_def.file = file_being_parsed_;\n  service_def.doc_comment = service_comment;\n  service_def.defined_namespace = current_namespace_;\n  if (filename != nullptr && !opts.project_root.empty()) {\n    service_def.declaration_file = &GetPooledString(FilePath(\n        opts.project_root, filename, opts.binary_schema_absolute_paths));\n  }\n  if (services_.Add(current_namespace_->GetFullyQualifiedName(service_name),\n                    &service_def))\n    return Error(\"service already exists: \" + service_name);\n  ECHECK(ParseMetaData(&service_def.attributes));\n  EXPECT('{');\n  do {\n    std::vector<std::string> doc_comment = doc_comment_;\n    auto rpc_name = attribute_;\n    EXPECT(kTokenIdentifier);\n    EXPECT('(');\n    Type reqtype, resptype;\n    ECHECK(ParseTypeIdent(reqtype));\n    EXPECT(')');\n    EXPECT(':');\n    ECHECK(ParseTypeIdent(resptype));\n    if (reqtype.base_type != BASE_TYPE_STRUCT || reqtype.struct_def->fixed ||\n        resptype.base_type != BASE_TYPE_STRUCT || resptype.struct_def->fixed)\n      return Error(\"rpc request and response types must be tables\");\n    auto& rpc = *new RPCCall();\n    rpc.name = rpc_name;\n    rpc.request = reqtype.struct_def;\n    rpc.response = resptype.struct_def;\n    rpc.doc_comment = doc_comment;\n    if (service_def.calls.Add(rpc_name, &rpc))\n      return Error(\"rpc already exists: \" + rpc_name);\n    ECHECK(ParseMetaData(&rpc.attributes));\n    EXPECT(';');\n  } while (token_ != '}');\n  NEXT();\n  return NoError();\n}\n\nbool Parser::SetRootType(const char* name) {\n  root_struct_def_ = LookupStruct(name);\n  if (!root_struct_def_)\n    root_struct_def_ =\n        LookupStruct(current_namespace_->GetFullyQualifiedName(name));\n  return root_struct_def_ != nullptr;\n}\n\nvoid Parser::MarkGenerated() {\n  // This function marks all existing definitions as having already\n  // been generated, which signals no code for included files should be\n  // generated.\n  for (auto it = enums_.vec.begin(); it != enums_.vec.end(); ++it) {\n    (*it)->generated = true;\n  }\n  for (auto it = structs_.vec.begin(); it != structs_.vec.end(); ++it) {\n    if (!(*it)->predecl) {\n      (*it)->generated = true;\n    }\n  }\n  for (auto it = services_.vec.begin(); it != services_.vec.end(); ++it) {\n    (*it)->generated = true;\n  }\n}\n\nCheckedError Parser::ParseNamespace() {\n  NEXT();\n  auto ns = new Namespace();\n  namespaces_.push_back(ns);  // Store it here to not leak upon error.\n  if (token_ != ';') {\n    for (;;) {\n      ns->components.push_back(attribute_);\n      EXPECT(kTokenIdentifier);\n      if (Is('.')) NEXT() else break;\n    }\n  }\n  namespaces_.pop_back();\n  current_namespace_ = UniqueNamespace(ns);\n  EXPECT(';');\n  return NoError();\n}\n\n// Best effort parsing of .proto declarations, with the aim to turn them\n// in the closest corresponding FlatBuffer equivalent.\n// We parse everything as identifiers instead of keywords, since we don't\n// want protobuf keywords to become invalid identifiers in FlatBuffers.\nCheckedError Parser::ParseProtoDecl() {\n  bool isextend = IsIdent(\"extend\");\n  if (IsIdent(\"package\")) {\n    // These are identical in syntax to FlatBuffer's namespace decl.\n    ECHECK(ParseNamespace());\n  } else if (IsIdent(\"message\") || isextend) {\n    std::vector<std::string> struct_comment = doc_comment_;\n    NEXT();\n    StructDef* struct_def = nullptr;\n    Namespace* parent_namespace = nullptr;\n    if (isextend) {\n      if (Is('.')) NEXT();  // qualified names may start with a . ?\n      auto id = attribute_;\n      EXPECT(kTokenIdentifier);\n      ECHECK(ParseNamespacing(&id, nullptr));\n      struct_def = LookupCreateStruct(id, false);\n      if (!struct_def)\n        return Error(\"cannot extend unknown message type: \" + id);\n    } else {\n      std::string name = attribute_;\n      EXPECT(kTokenIdentifier);\n      ECHECK(StartStruct(name, &struct_def));\n      // Since message definitions can be nested, we create a new namespace.\n      auto ns = new Namespace();\n      // Copy of current namespace.\n      *ns = *current_namespace_;\n      // But with current message name.\n      ns->components.push_back(name);\n      ns->from_table++;\n      parent_namespace = current_namespace_;\n      current_namespace_ = UniqueNamespace(ns);\n    }\n    struct_def->doc_comment = struct_comment;\n    ECHECK(ParseProtoFields(struct_def, isextend, false));\n    if (!isextend) {\n      current_namespace_ = parent_namespace;\n    }\n    if (Is(';')) NEXT();\n  } else if (IsIdent(\"enum\")) {\n    // These are almost the same, just with different terminator:\n    EnumDef* enum_def;\n    ECHECK(ParseEnum(false, &enum_def, nullptr));\n    if (Is(';')) NEXT();\n    // Temp: remove any duplicates, as .fbs files can't handle them.\n    enum_def->RemoveDuplicates();\n  } else if (IsIdent(\"syntax\")) {  // Skip these.\n    NEXT();\n    EXPECT('=');\n    EXPECT(kTokenStringConstant);\n    EXPECT(';');\n  } else if (IsIdent(\"option\")) {  // Skip these.\n    ECHECK(ParseProtoOption());\n    EXPECT(';');\n  } else if (IsIdent(\"service\")) {  // Skip these.\n    NEXT();\n    EXPECT(kTokenIdentifier);\n    ECHECK(ParseProtoCurliesOrIdent());\n  } else {\n    return Error(\"don\\'t know how to parse .proto declaration starting with \" +\n                 TokenToStringId(token_));\n  }\n  return NoError();\n}\n\nCheckedError Parser::StartEnum(const std::string& name, bool is_union,\n                               EnumDef** dest) {\n  auto& enum_def = *new EnumDef();\n  enum_def.name = name;\n  enum_def.file = file_being_parsed_;\n  enum_def.doc_comment = doc_comment_;\n  enum_def.is_union = is_union;\n  enum_def.defined_namespace = current_namespace_;\n  const auto qualified_name = current_namespace_->GetFullyQualifiedName(name);\n  if (enums_.Add(qualified_name, &enum_def))\n    return Error(\"enum already exists: \" + qualified_name);\n  enum_def.underlying_type.base_type =\n      is_union ? BASE_TYPE_UTYPE : BASE_TYPE_INT;\n  enum_def.underlying_type.enum_def = &enum_def;\n  if (dest) *dest = &enum_def;\n  return NoError();\n}\n\nCheckedError Parser::ParseProtoFields(StructDef* struct_def, bool isextend,\n                                      bool inside_oneof) {\n  EXPECT('{');\n  while (token_ != '}') {\n    if (IsIdent(\"message\") || IsIdent(\"extend\") || IsIdent(\"enum\")) {\n      // Nested declarations.\n      ECHECK(ParseProtoDecl());\n    } else if (IsIdent(\"extensions\")) {  // Skip these.\n      NEXT();\n      EXPECT(kTokenIntegerConstant);\n      if (Is(kTokenIdentifier)) {\n        NEXT();  // to\n        NEXT();  // num\n      }\n      EXPECT(';');\n    } else if (IsIdent(\"option\")) {  // Skip these.\n      ECHECK(ParseProtoOption());\n      EXPECT(';');\n    } else if (IsIdent(\"reserved\")) {  // Skip these.\n      /**\n       * Reserved proto ids can be comma seperated (e.g. 1,2,4,5;)\n       * or range based (e.g. 9 to 11;)\n       * or combination of them (e.g. 1,2,9 to 11,4,5;)\n       * It will be ended by a semicolon.\n       */\n      NEXT();\n      bool range = false;\n      voffset_t from = 0;\n\n      while (!Is(';')) {\n        if (token_ == kTokenIntegerConstant) {\n          voffset_t attribute = 0;\n          bool done = StringToNumber(attribute_.c_str(), &attribute);\n          if (!done)\n            return Error(\"Protobuf has non positive number in reserved ids\");\n\n          if (range) {\n            for (uint32_t id = static_cast<uint32_t>(from) + 1;\n                 id <= static_cast<uint32_t>(attribute); id++) {\n              struct_def->reserved_ids.push_back(static_cast<voffset_t>(id));\n            }\n\n            range = false;\n          } else {\n            struct_def->reserved_ids.push_back(attribute);\n          }\n\n          from = attribute;\n        }\n\n        if (attribute_ == \"to\") range = true;\n\n        NEXT();\n      }  // A variety of formats, just skip.\n\n      NEXT();\n    } else if (IsIdent(\"map\")) {\n      ECHECK(ParseProtoMapField(struct_def));\n    } else {\n      std::vector<std::string> field_comment = doc_comment_;\n      // Parse the qualifier.\n      bool required = false;\n      bool repeated = false;\n      bool oneof = false;\n      if (!inside_oneof) {\n        if (IsIdent(\"optional\")) {\n          // This is the default.\n          NEXT();\n        } else if (IsIdent(\"required\")) {\n          required = true;\n          NEXT();\n        } else if (IsIdent(\"repeated\")) {\n          repeated = true;\n          NEXT();\n        } else if (IsIdent(\"oneof\")) {\n          oneof = true;\n          NEXT();\n        } else {\n          // can't error, proto3 allows decls without any of the above.\n        }\n      }\n      StructDef* anonymous_struct = nullptr;\n      EnumDef* oneof_union = nullptr;\n      Type type;\n      if (IsIdent(\"group\") || oneof) {\n        if (!oneof) NEXT();\n        if (oneof && opts.proto_oneof_union) {\n          auto name = ConvertCase(attribute_, Case::kUpperCamel) + \"Union\";\n          ECHECK(StartEnum(name, true, &oneof_union));\n          type = Type(BASE_TYPE_UNION, nullptr, oneof_union);\n        } else {\n          auto name = \"Anonymous\" + NumToString(anonymous_counter_++);\n          ECHECK(StartStruct(name, &anonymous_struct));\n          type = Type(BASE_TYPE_STRUCT, anonymous_struct);\n        }\n      } else {\n        ECHECK(ParseTypeFromProtoType(&type));\n      }\n      // Repeated elements get mapped to a vector.\n      if (repeated) {\n        type.element = type.base_type;\n        type.base_type = BASE_TYPE_VECTOR;\n        if (type.element == BASE_TYPE_VECTOR) {\n          // We have a vector or vectors, which FlatBuffers doesn't support.\n          // For now make it a vector of string (since the source is likely\n          // \"repeated bytes\").\n          // TODO(wvo): A better solution would be to wrap this in a table.\n          type.element = BASE_TYPE_STRING;\n        }\n      }\n      std::string name = attribute_;\n      EXPECT(kTokenIdentifier);\n      std::string proto_field_id;\n      if (!oneof) {\n        // Parse the field id. Since we're just translating schemas, not\n        // any kind of binary compatibility, we can safely ignore these, and\n        // assign our own.\n        EXPECT('=');\n        proto_field_id = attribute_;\n        EXPECT(kTokenIntegerConstant);\n      }\n      FieldDef* field = nullptr;\n      if (isextend) {\n        // We allow a field to be re-defined when extending.\n        // TODO: are there situations where that is problematic?\n        field = struct_def->fields.Lookup(name);\n      }\n      if (!field) ECHECK(AddField(*struct_def, name, type, &field));\n      field->doc_comment = field_comment;\n      if (!proto_field_id.empty() || oneof) {\n        auto val = new Value();\n        val->constant = proto_field_id;\n        field->attributes.Add(\"id\", val);\n      }\n      if (!IsScalar(type.base_type) && required) {\n        field->presence = FieldDef::kRequired;\n      }\n      // See if there's a default specified.\n      if (Is('[')) {\n        NEXT();\n        for (;;) {\n          auto key = attribute_;\n          ECHECK(ParseProtoKey());\n          EXPECT('=');\n          auto val = attribute_;\n          ECHECK(ParseProtoCurliesOrIdent());\n          if (key == \"default\") {\n            // Temp: skip non-numeric and non-boolean defaults (enums).\n            auto numeric = strpbrk(val.c_str(), \"0123456789-+.\");\n            if (IsFloat(type.base_type) &&\n                (val == \"inf\" || val == \"+inf\" || val == \"-inf\")) {\n              // Prefer to be explicit with +inf.\n              field->value.constant = val == \"inf\" ? \"+inf\" : val;\n            } else if (IsScalar(type.base_type) && numeric == val.c_str()) {\n              field->value.constant = val;\n            } else if (val == \"true\") {\n              field->value.constant = val;\n            }  // \"false\" is default, no need to handle explicitly.\n          } else if (key == \"deprecated\") {\n            field->deprecated = val == \"true\";\n          }\n          if (!Is(',')) break;\n          NEXT();\n        }\n        EXPECT(']');\n      }\n      if (anonymous_struct) {\n        ECHECK(ParseProtoFields(anonymous_struct, false, oneof));\n        if (Is(';')) NEXT();\n      } else if (oneof_union) {\n        // Parse into a temporary StructDef, then transfer fields into an\n        // EnumDef describing the oneof as a union.\n        StructDef oneof_struct;\n        ECHECK(ParseProtoFields(&oneof_struct, false, oneof));\n        if (Is(';')) NEXT();\n        for (auto field_it = oneof_struct.fields.vec.begin();\n             field_it != oneof_struct.fields.vec.end(); ++field_it) {\n          const auto& oneof_field = **field_it;\n          const auto& oneof_type = oneof_field.value.type;\n          if (oneof_type.base_type != BASE_TYPE_STRUCT ||\n              !oneof_type.struct_def || oneof_type.struct_def->fixed)\n            return Error(\"oneof '\" + name +\n                         \"' cannot be mapped to a union because member '\" +\n                         oneof_field.name + \"' is not a table type.\");\n          EnumValBuilder evb(*this, *oneof_union);\n          auto ev = evb.CreateEnumerator(oneof_type.struct_def->name);\n          ev->union_type = oneof_type;\n          ev->doc_comment = oneof_field.doc_comment;\n          ECHECK(evb.AcceptEnumerator(oneof_field.name));\n        }\n      } else {\n        EXPECT(';');\n      }\n    }\n  }\n  NEXT();\n  return NoError();\n}\n\nCheckedError Parser::ParseProtoMapField(StructDef* struct_def) {\n  NEXT();\n  EXPECT('<');\n  Type key_type;\n  ECHECK(ParseType(key_type));\n  EXPECT(',');\n  Type value_type;\n  ECHECK(ParseType(value_type));\n  EXPECT('>');\n  auto field_name = attribute_;\n  NEXT();\n  EXPECT('=');\n  std::string proto_field_id = attribute_;\n  EXPECT(kTokenIntegerConstant);\n  EXPECT(';');\n\n  auto entry_table_name = ConvertCase(field_name, Case::kUpperCamel) + \"Entry\";\n  StructDef* entry_table;\n  ECHECK(StartStruct(entry_table_name, &entry_table));\n  entry_table->has_key = true;\n  FieldDef* key_field;\n  ECHECK(AddField(*entry_table, \"key\", key_type, &key_field));\n  key_field->key = true;\n  FieldDef* value_field;\n  ECHECK(AddField(*entry_table, \"value\", value_type, &value_field));\n\n  Type field_type;\n  field_type.base_type = BASE_TYPE_VECTOR;\n  field_type.element = BASE_TYPE_STRUCT;\n  field_type.struct_def = entry_table;\n  FieldDef* field;\n  ECHECK(AddField(*struct_def, field_name, field_type, &field));\n  if (!proto_field_id.empty()) {\n    auto val = new Value();\n    val->constant = proto_field_id;\n    field->attributes.Add(\"id\", val);\n  }\n\n  return NoError();\n}\n\nCheckedError Parser::ParseProtoKey() {\n  if (token_ == '(') {\n    NEXT();\n    // Skip \"(a.b)\" style custom attributes.\n    while (token_ == '.' || token_ == kTokenIdentifier) NEXT();\n    EXPECT(')');\n    while (Is('.')) {\n      NEXT();\n      EXPECT(kTokenIdentifier);\n    }\n  } else {\n    EXPECT(kTokenIdentifier);\n  }\n  return NoError();\n}\n\nCheckedError Parser::ParseProtoCurliesOrIdent() {\n  if (Is('{')) {\n    NEXT();\n    for (int nesting = 1; nesting;) {\n      if (token_ == '{')\n        nesting++;\n      else if (token_ == '}')\n        nesting--;\n      NEXT();\n    }\n  } else {\n    NEXT();  // Any single token.\n  }\n  return NoError();\n}\n\nCheckedError Parser::ParseProtoOption() {\n  NEXT();\n  ECHECK(ParseProtoKey());\n  EXPECT('=');\n  ECHECK(ParseProtoCurliesOrIdent());\n  return NoError();\n}\n\n// Parse a protobuf type, and map it to the corresponding FlatBuffer one.\nCheckedError Parser::ParseTypeFromProtoType(Type* type) {\n  struct type_lookup {\n    const char* proto_type;\n    BaseType fb_type, element;\n  };\n  static type_lookup lookup[] = {{\"float\", BASE_TYPE_FLOAT, BASE_TYPE_NONE},\n                                 {\"double\", BASE_TYPE_DOUBLE, BASE_TYPE_NONE},\n                                 {\"int32\", BASE_TYPE_INT, BASE_TYPE_NONE},\n                                 {\"int64\", BASE_TYPE_LONG, BASE_TYPE_NONE},\n                                 {\"uint32\", BASE_TYPE_UINT, BASE_TYPE_NONE},\n                                 {\"uint64\", BASE_TYPE_ULONG, BASE_TYPE_NONE},\n                                 {\"sint32\", BASE_TYPE_INT, BASE_TYPE_NONE},\n                                 {\"sint64\", BASE_TYPE_LONG, BASE_TYPE_NONE},\n                                 {\"fixed32\", BASE_TYPE_UINT, BASE_TYPE_NONE},\n                                 {\"fixed64\", BASE_TYPE_ULONG, BASE_TYPE_NONE},\n                                 {\"sfixed32\", BASE_TYPE_INT, BASE_TYPE_NONE},\n                                 {\"sfixed64\", BASE_TYPE_LONG, BASE_TYPE_NONE},\n                                 {\"bool\", BASE_TYPE_BOOL, BASE_TYPE_NONE},\n                                 {\"string\", BASE_TYPE_STRING, BASE_TYPE_NONE},\n                                 {\"bytes\", BASE_TYPE_VECTOR, BASE_TYPE_UCHAR},\n                                 {nullptr, BASE_TYPE_NONE, BASE_TYPE_NONE}};\n  for (auto tl = lookup; tl->proto_type; tl++) {\n    if (attribute_ == tl->proto_type) {\n      type->base_type = tl->fb_type;\n      type->element = tl->element;\n      NEXT();\n      return NoError();\n    }\n  }\n  if (Is('.')) NEXT();  // qualified names may start with a . ?\n  ECHECK(ParseTypeIdent(*type));\n  return NoError();\n}\n\nCheckedError Parser::SkipAnyJsonValue() {\n  ParseDepthGuard depth_guard(this);\n  ECHECK(depth_guard.Check());\n\n  switch (token_) {\n    case '{': {\n      size_t fieldn_outer = 0;\n      return ParseTableDelimiters(fieldn_outer, nullptr,\n                                  [&](const std::string&, size_t& fieldn,\n                                      const StructDef*) -> CheckedError {\n                                    ECHECK(SkipAnyJsonValue());\n                                    fieldn++;\n                                    return NoError();\n                                  });\n    }\n    case '[': {\n      size_t count = 0;\n      return ParseVectorDelimiters(\n          count, [&](size_t&) -> CheckedError { return SkipAnyJsonValue(); });\n    }\n    case kTokenStringConstant:\n    case kTokenIntegerConstant:\n    case kTokenFloatConstant:\n      NEXT();\n      break;\n    default:\n      if (IsIdent(\"true\") || IsIdent(\"false\") || IsIdent(\"null\") ||\n          IsIdent(\"inf\")) {\n        NEXT();\n      } else\n        return TokenError();\n  }\n  return NoError();\n}\n\nCheckedError Parser::ParseFlexBufferNumericConstant(\n    flexbuffers::Builder* builder) {\n  double d;\n  if (!StringToNumber(attribute_.c_str(), &d))\n    return Error(\"unexpected floating-point constant: \" + attribute_);\n  builder->Double(d);\n  return NoError();\n}\n\nCheckedError Parser::ParseFlexBufferValue(flexbuffers::Builder* builder) {\n  ParseDepthGuard depth_guard(this);\n  ECHECK(depth_guard.Check());\n\n  switch (token_) {\n    case '{': {\n      auto start = builder->StartMap();\n      size_t fieldn_outer = 0;\n      auto err =\n          ParseTableDelimiters(fieldn_outer, nullptr,\n                               [&](const std::string& name, size_t& fieldn,\n                                   const StructDef*) -> CheckedError {\n                                 builder->Key(name);\n                                 ECHECK(ParseFlexBufferValue(builder));\n                                 fieldn++;\n                                 return NoError();\n                               });\n      ECHECK(err);\n      builder->EndMap(start);\n      if (builder->HasDuplicateKeys())\n        return Error(\"FlexBuffers map has duplicate keys\");\n      break;\n    }\n    case '[': {\n      auto start = builder->StartVector();\n      size_t count = 0;\n      ECHECK(ParseVectorDelimiters(count, [&](size_t&) -> CheckedError {\n        return ParseFlexBufferValue(builder);\n      }));\n      builder->EndVector(start, false, false);\n      break;\n    }\n    case kTokenStringConstant:\n      builder->String(attribute_);\n      EXPECT(kTokenStringConstant);\n      break;\n    case kTokenIntegerConstant:\n      builder->Int(StringToInt(attribute_.c_str()));\n      EXPECT(kTokenIntegerConstant);\n      break;\n    case kTokenFloatConstant: {\n      double d;\n      StringToNumber(attribute_.c_str(), &d);\n      builder->Double(d);\n      EXPECT(kTokenFloatConstant);\n      break;\n    }\n    case '-':\n    case '+': {\n      // `[-+]?(nan|inf|infinity)`, see ParseSingleValue().\n      const auto sign = static_cast<char>(token_);\n      NEXT();\n      if (token_ != kTokenIdentifier)\n        return Error(\"floating-point constant expected\");\n      attribute_.insert(size_t(0), size_t(1), sign);\n      ECHECK(ParseFlexBufferNumericConstant(builder));\n      NEXT();\n      break;\n    }\n    default:\n      if (IsIdent(\"true\")) {\n        builder->Bool(true);\n        NEXT();\n      } else if (IsIdent(\"false\")) {\n        builder->Bool(false);\n        NEXT();\n      } else if (IsIdent(\"null\")) {\n        builder->Null();\n        NEXT();\n      } else if (IsIdent(\"inf\") || IsIdent(\"infinity\") || IsIdent(\"nan\")) {\n        ECHECK(ParseFlexBufferNumericConstant(builder));\n        NEXT();\n      } else\n        return TokenError();\n  }\n  return NoError();\n}\n\nbool Parser::ParseFlexBuffer(const char* source, const char* source_filename,\n                             flexbuffers::Builder* builder) {\n  const auto initial_depth = parse_depth_counter_;\n  (void)initial_depth;\n  auto ok = !StartParseFile(source, source_filename).Check() &&\n            !ParseFlexBufferValue(builder).Check();\n  if (ok) builder->Finish();\n  FLATBUFFERS_ASSERT(initial_depth == parse_depth_counter_);\n  return ok;\n}\n\nbool Parser::Parse(const char* source, const char** include_paths,\n                   const char* source_filename) {\n  const auto initial_depth = parse_depth_counter_;\n  (void)initial_depth;\n  bool r;\n\n  if (opts.use_flexbuffers) {\n    r = ParseFlexBuffer(source, source_filename, &flex_builder_);\n  } else {\n    r = !ParseRoot(source, include_paths, source_filename).Check();\n  }\n  FLATBUFFERS_ASSERT(initial_depth == parse_depth_counter_);\n  return r;\n}\n\nbool Parser::ParseJson(const char* json, const char* json_filename) {\n  const auto initial_depth = parse_depth_counter_;\n  (void)initial_depth;\n  builder_.Clear();\n  const auto done =\n      !StartParseFile(json, json_filename).Check() && !DoParseJson().Check();\n  FLATBUFFERS_ASSERT(initial_depth == parse_depth_counter_);\n  return done;\n}\n\nstd::ptrdiff_t Parser::BytesConsumed() const {\n  return std::distance(source_, prev_cursor_);\n}\n\nCheckedError Parser::StartParseFile(const char* source,\n                                    const char* source_filename) {\n  file_being_parsed_ = source_filename ? source_filename : \"\";\n  source_ = source;\n  ResetState(source_);\n  error_.clear();\n  ECHECK(SkipByteOrderMark());\n  NEXT();\n  if (Is(kTokenEof)) return Error(\"input file is empty\");\n  return NoError();\n}\n\nCheckedError Parser::ParseRoot(const char* source, const char** include_paths,\n                               const char* source_filename) {\n  ECHECK(DoParse(source, include_paths, source_filename, nullptr));\n\n  // Check that all types were defined.\n  for (auto it = structs_.vec.begin(); it != structs_.vec.end();) {\n    auto& struct_def = **it;\n    if (struct_def.predecl) {\n      if (opts.proto_mode) {\n        // Protos allow enums to be used before declaration, so check if that\n        // is the case here.\n        EnumDef* enum_def = nullptr;\n        for (size_t components =\n                 struct_def.defined_namespace->components.size() + 1;\n             components && !enum_def; components--) {\n          auto qualified_name =\n              struct_def.defined_namespace->GetFullyQualifiedName(\n                  struct_def.name, components - 1);\n          enum_def = LookupEnum(qualified_name);\n        }\n        if (enum_def) {\n          // This is pretty slow, but a simple solution for now.\n          auto initial_count = struct_def.refcount;\n          for (auto struct_it = structs_.vec.begin();\n               struct_it != structs_.vec.end(); ++struct_it) {\n            auto& sd = **struct_it;\n            for (auto field_it = sd.fields.vec.begin();\n                 field_it != sd.fields.vec.end(); ++field_it) {\n              auto& field = **field_it;\n              if (field.value.type.struct_def == &struct_def) {\n                field.value.type.struct_def = nullptr;\n                field.value.type.enum_def = enum_def;\n                auto& bt = IsVector(field.value.type)\n                               ? field.value.type.element\n                               : field.value.type.base_type;\n                FLATBUFFERS_ASSERT(bt == BASE_TYPE_STRUCT);\n                bt = enum_def->underlying_type.base_type;\n                struct_def.refcount--;\n                enum_def->refcount++;\n              }\n            }\n          }\n          if (struct_def.refcount)\n            return Error(\"internal: \" + NumToString(struct_def.refcount) + \"/\" +\n                         NumToString(initial_count) +\n                         \" use(s) of pre-declaration enum not accounted for: \" +\n                         enum_def->name);\n          structs_.dict.erase(structs_.dict.find(struct_def.name));\n          it = structs_.vec.erase(it);\n          delete &struct_def;\n          continue;  // Skip error.\n        }\n      }\n      auto err = \"type referenced but not defined (check namespace): \" +\n                 struct_def.name;\n      if (struct_def.original_location)\n        err += \", originally at: \" + *struct_def.original_location;\n      return Error(err);\n    }\n    ++it;\n  }\n\n  // This check has to happen here and not earlier, because only now do we\n  // know for sure what the type of these are.\n  for (auto it = enums_.vec.begin(); it != enums_.vec.end(); ++it) {\n    auto& enum_def = **it;\n    if (enum_def.is_union) {\n      for (auto val_it = enum_def.Vals().begin();\n           val_it != enum_def.Vals().end(); ++val_it) {\n        auto& val = **val_it;\n\n        if (!(opts.lang_to_generate != 0 && SupportsAdvancedUnionFeatures()) &&\n            (IsStruct(val.union_type) || IsString(val.union_type)))\n\n          return Error(\n              \"only tables can be union elements in the generated language: \" +\n              val.name);\n      }\n    }\n  }\n\n  auto err = CheckPrivateLeak();\n  if (err.Check()) return err;\n\n  // Parse JSON object only if the scheme has been parsed.\n  if (token_ == '{') {\n    ECHECK(DoParseJson());\n  }\n  return NoError();\n}\n\nCheckedError Parser::CheckPrivateLeak() {\n  if (!opts.no_leak_private_annotations) return NoError();\n  // Iterate over all structs/tables to validate we arent leaking\n  // any private (structs/tables/enums)\n  for (auto it = structs_.vec.begin(); it != structs_.vec.end(); it++) {\n    auto& struct_def = **it;\n    for (auto fld_it = struct_def.fields.vec.begin();\n         fld_it != struct_def.fields.vec.end(); ++fld_it) {\n      auto& field = **fld_it;\n\n      if (field.value.type.enum_def) {\n        auto err =\n            CheckPrivatelyLeakedFields(struct_def, *field.value.type.enum_def);\n        if (err.Check()) {\n          return err;\n        }\n      } else if (field.value.type.struct_def) {\n        auto err = CheckPrivatelyLeakedFields(struct_def,\n                                              *field.value.type.struct_def);\n        if (err.Check()) {\n          return err;\n        }\n      }\n    }\n  }\n  // Iterate over all enums to validate we arent leaking\n  // any private (structs/tables)\n  for (auto it = enums_.vec.begin(); it != enums_.vec.end(); ++it) {\n    auto& enum_def = **it;\n    if (enum_def.is_union) {\n      for (auto val_it = enum_def.Vals().begin();\n           val_it != enum_def.Vals().end(); ++val_it) {\n        auto& val = **val_it;\n        if (val.union_type.struct_def) {\n          auto err =\n              CheckPrivatelyLeakedFields(enum_def, *val.union_type.struct_def);\n          if (err.Check()) {\n            return err;\n          }\n        }\n      }\n    }\n  }\n  return NoError();\n}\n\nCheckedError Parser::CheckPrivatelyLeakedFields(const Definition& def,\n                                                const Definition& value_type) {\n  if (!opts.no_leak_private_annotations) return NoError();\n  const auto is_private = def.attributes.Lookup(\"private\");\n  const auto is_field_private = value_type.attributes.Lookup(\"private\");\n  if (!is_private && is_field_private) {\n    return Error(\n        \"Leaking private implementation, verify all objects have similar \"\n        \"annotations\");\n  }\n  return NoError();\n}\n\nCheckedError Parser::DoParse(const char* source, const char** include_paths,\n                             const char* source_filename,\n                             const char* include_filename) {\n  uint64_t source_hash = 0;\n  if (source_filename) {\n    // If the file is in-memory, don't include its contents in the hash as we\n    // won't be able to load them later.\n    if (FileExists(source_filename))\n      source_hash = HashFile(source_filename, source);\n    else\n      source_hash = HashFile(source_filename, nullptr);\n\n    if (included_files_.find(source_hash) == included_files_.end()) {\n      included_files_[source_hash] = include_filename ? include_filename : \"\";\n      files_included_per_file_[source_filename] = std::set<IncludedFile>();\n    } else {\n      return NoError();\n    }\n  }\n  if (!include_paths) {\n    static const char* current_directory[] = {\"\", nullptr};\n    include_paths = current_directory;\n  }\n  field_stack_.clear();\n  builder_.Clear();\n  // Start with a blank namespace just in case this file doesn't have one.\n  current_namespace_ = empty_namespace_;\n\n  ECHECK(StartParseFile(source, source_filename));\n\n  // Includes must come before type declarations:\n  for (;;) {\n    // Parse pre-include proto statements if any:\n    if (opts.proto_mode && (attribute_ == \"option\" || attribute_ == \"syntax\" ||\n                            attribute_ == \"package\")) {\n      ECHECK(ParseProtoDecl());\n    } else if (IsIdent(\"native_include\")) {\n      NEXT();\n      native_included_files_.emplace_back(attribute_);\n      EXPECT(kTokenStringConstant);\n      EXPECT(';');\n    } else if (IsIdent(\"include\") || (opts.proto_mode && IsIdent(\"import\"))) {\n      NEXT();\n      if (opts.proto_mode && attribute_ == \"public\") NEXT();\n      auto name = flatbuffers::PosixPath(attribute_.c_str());\n      EXPECT(kTokenStringConstant);\n      // Look for the file relative to the directory of the current file.\n      std::string filepath;\n      if (source_filename) {\n        auto source_file_directory =\n            flatbuffers::StripFileName(source_filename);\n        filepath = flatbuffers::ConCatPathFileName(source_file_directory, name);\n      }\n      if (filepath.empty() || !FileExists(filepath.c_str())) {\n        // Look for the file in include_paths.\n        for (auto paths = include_paths; paths && *paths; paths++) {\n          filepath = flatbuffers::ConCatPathFileName(*paths, name);\n          if (FileExists(filepath.c_str())) break;\n        }\n      }\n      if (filepath.empty())\n        return Error(\"unable to locate include file: \" + name);\n      if (source_filename) {\n        IncludedFile included_file;\n        included_file.filename = filepath;\n        included_file.schema_name = name;\n        files_included_per_file_[source_filename].insert(included_file);\n      }\n\n      std::string contents;\n      bool file_loaded = LoadFile(filepath.c_str(), true, &contents);\n      if (included_files_.find(HashFile(filepath.c_str(), contents.c_str())) ==\n          included_files_.end()) {\n        // We found an include file that we have not parsed yet.\n        // Parse it.\n        if (!file_loaded) return Error(\"unable to load include file: \" + name);\n        ECHECK(DoParse(contents.c_str(), include_paths, filepath.c_str(),\n                       name.c_str()));\n        // We generally do not want to output code for any included files:\n        if (!opts.generate_all) MarkGenerated();\n        // Reset these just in case the included file had them, and the\n        // parent doesn't.\n        root_struct_def_ = nullptr;\n        file_identifier_.clear();\n        file_extension_.clear();\n        // This is the easiest way to continue this file after an include:\n        // instead of saving and restoring all the state, we simply start the\n        // file anew. This will cause it to encounter the same include\n        // statement again, but this time it will skip it, because it was\n        // entered into included_files_.\n        // This is recursive, but only go as deep as the number of include\n        // statements.\n        included_files_.erase(source_hash);\n        return DoParse(source, include_paths, source_filename,\n                       include_filename);\n      }\n      EXPECT(';');\n    } else {\n      break;\n    }\n  }\n  // Now parse all other kinds of declarations:\n  while (token_ != kTokenEof) {\n    if (opts.proto_mode) {\n      ECHECK(ParseProtoDecl());\n    } else if (IsIdent(\"namespace\")) {\n      ECHECK(ParseNamespace());\n    } else if (token_ == '{') {\n      return NoError();\n    } else if (IsIdent(\"enum\")) {\n      ECHECK(ParseEnum(false, nullptr, source_filename));\n    } else if (IsIdent(\"union\")) {\n      ECHECK(ParseEnum(true, nullptr, source_filename));\n    } else if (IsIdent(\"root_type\")) {\n      NEXT();\n      auto root_type = attribute_;\n      EXPECT(kTokenIdentifier);\n      ECHECK(ParseNamespacing(&root_type, nullptr));\n      if (opts.root_type.empty()) {\n        if (!SetRootType(root_type.c_str()))\n          return Error(\"unknown root type: \" + root_type);\n        if (root_struct_def_->fixed) return Error(\"root type must be a table\");\n      }\n      EXPECT(';');\n    } else if (IsIdent(\"file_identifier\")) {\n      NEXT();\n      file_identifier_ = attribute_;\n      EXPECT(kTokenStringConstant);\n      if (file_identifier_.length() != flatbuffers::kFileIdentifierLength)\n        return Error(\"file_identifier must be exactly \" +\n                     NumToString(flatbuffers::kFileIdentifierLength) +\n                     \" characters\");\n      EXPECT(';');\n    } else if (IsIdent(\"file_extension\")) {\n      NEXT();\n      file_extension_ = attribute_;\n      EXPECT(kTokenStringConstant);\n      EXPECT(';');\n    } else if (IsIdent(\"include\")) {\n      return Error(\"includes must come before declarations\");\n    } else if (IsIdent(\"attribute\")) {\n      NEXT();\n      auto name = attribute_;\n      if (Is(kTokenIdentifier)) {\n        NEXT();\n      } else {\n        EXPECT(kTokenStringConstant);\n      }\n      EXPECT(';');\n      known_attributes_[name] = false;\n    } else if (IsIdent(\"rpc_service\")) {\n      ECHECK(ParseService(source_filename));\n    } else {\n      ECHECK(ParseDecl(source_filename));\n    }\n  }\n  EXPECT(kTokenEof);\n  if (opts.warnings_as_errors && has_warning_) {\n    return Error(\"treating warnings as errors, failed due to above warnings\");\n  }\n  return NoError();\n}\n\nCheckedError Parser::DoParseJson() {\n  if (token_ != '{') {\n    EXPECT('{');\n  } else {\n    if (!root_struct_def_) return Error(\"no root type set to parse json with\");\n    if (builder_.GetSize()) {\n      return Error(\"cannot have more than one json object in a file\");\n    }\n    uoffset_t toff;\n    ECHECK(ParseTable(*root_struct_def_, nullptr, &toff));\n    if (opts.size_prefixed) {\n      builder_.FinishSizePrefixed(\n          Offset<Table>(toff),\n          file_identifier_.length() ? file_identifier_.c_str() : nullptr);\n    } else {\n      builder_.Finish(Offset<Table>(toff), file_identifier_.length()\n                                               ? file_identifier_.c_str()\n                                               : nullptr);\n    }\n  }\n  if (opts.require_json_eof) {\n    // Check that JSON file doesn't contain more objects or IDL directives.\n    // Comments after JSON are allowed.\n    EXPECT(kTokenEof);\n  }\n  return NoError();\n}\n\nstd::set<std::string> Parser::GetIncludedFilesRecursive(\n    const std::string& file_name) const {\n  std::set<std::string> included_files;\n  std::list<std::string> to_process;\n\n  if (file_name.empty()) return included_files;\n  to_process.push_back(file_name);\n\n  while (!to_process.empty()) {\n    std::string current = to_process.front();\n    to_process.pop_front();\n    included_files.insert(current);\n\n    // Workaround the lack of const accessor in C++98 maps.\n    auto& new_files =\n        (*const_cast<std::map<std::string, std::set<IncludedFile>>*>(\n            &files_included_per_file_))[current];\n    for (auto it = new_files.begin(); it != new_files.end(); ++it) {\n      if (included_files.find(it->filename) == included_files.end())\n        to_process.push_back(it->filename);\n    }\n  }\n\n  return included_files;\n}\n\n// Schema serialization functionality:\n\nstatic flatbuffers::Offset<\n    flatbuffers::Vector<flatbuffers::Offset<reflection::KeyValue>>>\nSerializeAttributesCommon(const SymbolTable<Value>& attributes,\n                          FlatBufferBuilder* builder, const Parser& parser) {\n  std::vector<flatbuffers::Offset<reflection::KeyValue>> attrs;\n  for (auto kv = attributes.dict.begin(); kv != attributes.dict.end(); ++kv) {\n    auto it = parser.known_attributes_.find(kv->first);\n    FLATBUFFERS_ASSERT(it != parser.known_attributes_.end());\n    if (parser.opts.binary_schema_builtins || !it->second) {\n      auto key = builder->CreateString(kv->first);\n      auto val = builder->CreateString(kv->second->constant);\n      attrs.push_back(reflection::CreateKeyValue(*builder, key, val));\n    }\n  }\n  if (attrs.size()) {\n    return builder->CreateVectorOfSortedTables(&attrs);\n  } else {\n    return 0;\n  }\n}\n\nstatic bool DeserializeAttributesCommon(\n    SymbolTable<Value>& attributes, Parser& parser,\n    const Vector<Offset<reflection::KeyValue>>* attrs) {\n  if (attrs == nullptr) return true;\n  for (uoffset_t i = 0; i < attrs->size(); ++i) {\n    auto kv = attrs->Get(i);\n    auto value = new Value();\n    if (kv->value()) {\n      value->constant = kv->value()->str();\n    }\n    if (attributes.Add(kv->key()->str(), value)) {\n      delete value;\n      return false;\n    }\n    parser.known_attributes_[kv->key()->str()];\n  }\n  return true;\n}\n\nvoid Parser::Serialize() {\n  builder_.Clear();\n  AssignIndices(structs_.vec);\n  AssignIndices(enums_.vec);\n  std::vector<Offset<reflection::Object>> object_offsets;\n  std::set<std::string> files;\n  for (auto it = structs_.vec.begin(); it != structs_.vec.end(); ++it) {\n    auto offset = (*it)->Serialize(&builder_, *this);\n    object_offsets.push_back(offset);\n    (*it)->serialized_location = offset.o;\n    const std::string* file = (*it)->declaration_file;\n    if (file) files.insert(*file);\n  }\n  std::vector<Offset<reflection::Enum>> enum_offsets;\n  for (auto it = enums_.vec.begin(); it != enums_.vec.end(); ++it) {\n    auto offset = (*it)->Serialize(&builder_, *this);\n    enum_offsets.push_back(offset);\n    const std::string* file = (*it)->declaration_file;\n    if (file) files.insert(*file);\n  }\n  std::vector<Offset<reflection::Service>> service_offsets;\n  for (auto it = services_.vec.begin(); it != services_.vec.end(); ++it) {\n    auto offset = (*it)->Serialize(&builder_, *this);\n    service_offsets.push_back(offset);\n    const std::string* file = (*it)->declaration_file;\n    if (file) files.insert(*file);\n  }\n\n  // Create Schemafiles vector of tables.\n  flatbuffers::Offset<\n      flatbuffers::Vector<flatbuffers::Offset<reflection::SchemaFile>>>\n      schema_files__;\n  if (!opts.project_root.empty()) {\n    std::vector<Offset<reflection::SchemaFile>> schema_files;\n    std::vector<Offset<flatbuffers::String>> included_files;\n    for (auto f = files_included_per_file_.begin();\n         f != files_included_per_file_.end(); f++) {\n      const auto filename__ = builder_.CreateSharedString(FilePath(\n          opts.project_root, f->first, opts.binary_schema_absolute_paths));\n      for (auto i = f->second.begin(); i != f->second.end(); i++) {\n        included_files.push_back(builder_.CreateSharedString(\n            FilePath(opts.project_root, i->filename,\n                     opts.binary_schema_absolute_paths)));\n      }\n      const auto included_files__ = builder_.CreateVector(included_files);\n      included_files.clear();\n\n      schema_files.push_back(\n          reflection::CreateSchemaFile(builder_, filename__, included_files__));\n    }\n    schema_files__ = builder_.CreateVectorOfSortedTables(&schema_files);\n  }\n\n  const auto objs__ = builder_.CreateVectorOfSortedTables(&object_offsets);\n  const auto enum__ = builder_.CreateVectorOfSortedTables(&enum_offsets);\n  const auto fiid__ = builder_.CreateString(file_identifier_);\n  const auto fext__ = builder_.CreateString(file_extension_);\n  const auto serv__ = builder_.CreateVectorOfSortedTables(&service_offsets);\n  const auto schema_offset = reflection::CreateSchema(\n      builder_, objs__, enum__, fiid__, fext__,\n      (root_struct_def_ ? root_struct_def_->serialized_location : 0), serv__,\n      static_cast<reflection::AdvancedFeatures>(advanced_features_),\n      schema_files__);\n  if (opts.size_prefixed) {\n    builder_.FinishSizePrefixed(schema_offset, reflection::SchemaIdentifier());\n  } else {\n    builder_.Finish(schema_offset, reflection::SchemaIdentifier());\n  }\n}\n\nOffset<reflection::Object> StructDef::Serialize(FlatBufferBuilder* builder,\n                                                const Parser& parser) const {\n  std::vector<Offset<reflection::Field>> field_offsets;\n  for (auto it = fields.vec.begin(); it != fields.vec.end(); ++it) {\n    field_offsets.push_back((*it)->Serialize(\n        builder, static_cast<uint16_t>(it - fields.vec.begin()), parser));\n  }\n  const auto qualified_name = defined_namespace->GetFullyQualifiedName(name);\n  const auto name__ = builder->CreateString(qualified_name);\n  const auto flds__ = builder->CreateVectorOfSortedTables(&field_offsets);\n  const auto attr__ = SerializeAttributes(builder, parser);\n  const auto docs__ = parser.opts.binary_schema_comments && !doc_comment.empty()\n                          ? builder->CreateVectorOfStrings(doc_comment)\n                          : 0;\n  std::string decl_file_in_project = declaration_file ? *declaration_file : \"\";\n  const auto file__ = builder->CreateSharedString(decl_file_in_project);\n  return reflection::CreateObject(\n      *builder, name__, flds__, fixed, static_cast<int>(minalign),\n      static_cast<int>(bytesize), attr__, docs__, file__);\n}\n\nbool StructDef::Deserialize(Parser& parser, const reflection::Object* object) {\n  if (!DeserializeAttributes(parser, object->attributes())) return false;\n  DeserializeDoc(doc_comment, object->documentation());\n  name = parser.UnqualifiedName(object->name()->str());\n  predecl = false;\n  sortbysize = attributes.Lookup(\"original_order\") == nullptr && !fixed;\n  const auto& of = *(object->fields());\n  auto indexes = std::vector<uoffset_t>(of.size());\n  for (uoffset_t i = 0; i < of.size(); i++) indexes[of.Get(i)->id()] = i;\n  size_t tmp_struct_size = 0;\n  for (size_t i = 0; i < indexes.size(); i++) {\n    auto field = of.Get(indexes[i]);\n    auto field_def = new FieldDef();\n    if (!field_def->Deserialize(parser, field) ||\n        fields.Add(field_def->name, field_def)) {\n      delete field_def;\n      return false;\n    }\n    if (field_def->key) {\n      if (has_key) {\n        // only one field may be set as key\n        delete field_def;\n        return false;\n      }\n      has_key = true;\n    }\n    if (fixed) {\n      // Recompute padding since that's currently not serialized.\n      auto size = InlineSize(field_def->value.type);\n      auto next_field =\n          i + 1 < indexes.size() ? of.Get(indexes[i + 1]) : nullptr;\n      tmp_struct_size += size;\n      field_def->padding =\n          next_field ? (next_field->offset() - field_def->value.offset) - size\n                     : PaddingBytes(tmp_struct_size, minalign);\n      tmp_struct_size += field_def->padding;\n    }\n  }\n  FLATBUFFERS_ASSERT(static_cast<int>(tmp_struct_size) == object->bytesize());\n  return true;\n}\n\nOffset<reflection::Field> FieldDef::Serialize(FlatBufferBuilder* builder,\n                                              uint16_t id,\n                                              const Parser& parser) const {\n  auto name__ = builder->CreateString(name);\n  auto type__ = value.type.Serialize(builder);\n  auto attr__ = SerializeAttributes(builder, parser);\n  auto docs__ = parser.opts.binary_schema_comments && !doc_comment.empty()\n                    ? builder->CreateVectorOfStrings(doc_comment)\n                    : 0;\n  double d;\n  StringToNumber(value.constant.c_str(), &d);\n  return reflection::CreateField(\n      *builder, name__, type__, id, value.offset,\n      // Is uint64>max(int64) tested?\n      IsInteger(value.type.base_type) ? StringToInt(value.constant.c_str()) : 0,\n      // result may be platform-dependent if underlying is float (not double)\n      IsFloat(value.type.base_type) ? d : 0.0, deprecated, IsRequired(), key,\n      attr__, docs__, IsOptional(), static_cast<uint16_t>(padding), offset64);\n  // TODO: value.constant is almost always \"0\", we could save quite a bit of\n  // space by sharing it. Same for common values of value.type.\n}\n\nbool FieldDef::Deserialize(Parser& parser, const reflection::Field* field) {\n  name = field->name()->str();\n  defined_namespace = parser.current_namespace_;\n  if (!value.type.Deserialize(parser, field->type())) return false;\n  value.offset = field->offset();\n  if (IsInteger(value.type.base_type)) {\n    value.constant = NumToString(field->default_integer());\n  } else if (IsFloat(value.type.base_type)) {\n    value.constant = FloatToString(field->default_real(), 17);\n  }\n  presence = FieldDef::MakeFieldPresence(field->optional(), field->required());\n  padding = field->padding();\n  key = field->key();\n  offset64 = field->offset64();\n  if (!DeserializeAttributes(parser, field->attributes())) return false;\n  // TODO: this should probably be handled by a separate attribute\n  if (attributes.Lookup(\"flexbuffer\")) {\n    flexbuffer = true;\n    parser.uses_flexbuffers_ = true;\n    if (value.type.base_type != BASE_TYPE_VECTOR ||\n        value.type.element != BASE_TYPE_UCHAR)\n      return false;\n  }\n  if (auto nested = attributes.Lookup(\"nested_flatbuffer\")) {\n    auto nested_qualified_name =\n        parser.current_namespace_->GetFullyQualifiedName(nested->constant);\n    nested_flatbuffer = parser.LookupStruct(nested_qualified_name);\n    if (!nested_flatbuffer) return false;\n  }\n  shared = attributes.Lookup(\"shared\") != nullptr;\n  DeserializeDoc(doc_comment, field->documentation());\n  return true;\n}\n\nOffset<reflection::RPCCall> RPCCall::Serialize(FlatBufferBuilder* builder,\n                                               const Parser& parser) const {\n  auto name__ = builder->CreateString(name);\n  auto attr__ = SerializeAttributes(builder, parser);\n  auto docs__ = parser.opts.binary_schema_comments && !doc_comment.empty()\n                    ? builder->CreateVectorOfStrings(doc_comment)\n                    : 0;\n  return reflection::CreateRPCCall(\n      *builder, name__, request->serialized_location,\n      response->serialized_location, attr__, docs__);\n}\n\nbool RPCCall::Deserialize(Parser& parser, const reflection::RPCCall* call) {\n  name = call->name()->str();\n  if (!DeserializeAttributes(parser, call->attributes())) return false;\n  DeserializeDoc(doc_comment, call->documentation());\n  request = parser.structs_.Lookup(call->request()->name()->str());\n  response = parser.structs_.Lookup(call->response()->name()->str());\n  if (!request || !response) {\n    return false;\n  }\n  return true;\n}\n\nOffset<reflection::Service> ServiceDef::Serialize(FlatBufferBuilder* builder,\n                                                  const Parser& parser) const {\n  std::vector<Offset<reflection::RPCCall>> servicecall_offsets;\n  for (auto it = calls.vec.begin(); it != calls.vec.end(); ++it) {\n    servicecall_offsets.push_back((*it)->Serialize(builder, parser));\n  }\n  const auto qualified_name = defined_namespace->GetFullyQualifiedName(name);\n  const auto name__ = builder->CreateString(qualified_name);\n  const auto call__ = builder->CreateVector(servicecall_offsets);\n  const auto attr__ = SerializeAttributes(builder, parser);\n  const auto docs__ = parser.opts.binary_schema_comments && !doc_comment.empty()\n                          ? builder->CreateVectorOfStrings(doc_comment)\n                          : 0;\n  std::string decl_file_in_project = declaration_file ? *declaration_file : \"\";\n  const auto file__ = builder->CreateSharedString(decl_file_in_project);\n  return reflection::CreateService(*builder, name__, call__, attr__, docs__,\n                                   file__);\n}\n\nbool ServiceDef::Deserialize(Parser& parser,\n                             const reflection::Service* service) {\n  name = parser.UnqualifiedName(service->name()->str());\n  if (service->calls()) {\n    for (uoffset_t i = 0; i < service->calls()->size(); ++i) {\n      auto call = new RPCCall();\n      if (!call->Deserialize(parser, service->calls()->Get(i)) ||\n          calls.Add(call->name, call)) {\n        delete call;\n        return false;\n      }\n    }\n  }\n  if (!DeserializeAttributes(parser, service->attributes())) return false;\n  DeserializeDoc(doc_comment, service->documentation());\n  return true;\n}\n\nOffset<reflection::Enum> EnumDef::Serialize(FlatBufferBuilder* builder,\n                                            const Parser& parser) const {\n  std::vector<Offset<reflection::EnumVal>> enumval_offsets;\n  for (auto it = vals.vec.begin(); it != vals.vec.end(); ++it) {\n    enumval_offsets.push_back((*it)->Serialize(builder, parser));\n  }\n  const auto qualified_name = defined_namespace->GetFullyQualifiedName(name);\n  const auto name__ = builder->CreateString(qualified_name);\n  const auto vals__ = builder->CreateVector(enumval_offsets);\n  const auto type__ = underlying_type.Serialize(builder);\n  const auto attr__ = SerializeAttributes(builder, parser);\n  const auto docs__ = parser.opts.binary_schema_comments && !doc_comment.empty()\n                          ? builder->CreateVectorOfStrings(doc_comment)\n                          : 0;\n  std::string decl_file_in_project = declaration_file ? *declaration_file : \"\";\n  const auto file__ = builder->CreateSharedString(decl_file_in_project);\n  return reflection::CreateEnum(*builder, name__, vals__, is_union, type__,\n                                attr__, docs__, file__);\n}\n\nbool EnumDef::Deserialize(Parser& parser, const reflection::Enum* _enum) {\n  name = parser.UnqualifiedName(_enum->name()->str());\n  for (uoffset_t i = 0; i < _enum->values()->size(); ++i) {\n    auto val = new EnumVal();\n    if (!val->Deserialize(parser, _enum->values()->Get(i)) ||\n        vals.Add(val->name, val)) {\n      delete val;\n      return false;\n    }\n  }\n  is_union = _enum->is_union();\n  if (!underlying_type.Deserialize(parser, _enum->underlying_type())) {\n    return false;\n  }\n  if (!DeserializeAttributes(parser, _enum->attributes())) return false;\n  DeserializeDoc(doc_comment, _enum->documentation());\n  return true;\n}\n\nflatbuffers::Offset<\n    flatbuffers::Vector<flatbuffers::Offset<reflection::KeyValue>>>\nEnumVal::SerializeAttributes(FlatBufferBuilder* builder,\n                             const Parser& parser) const {\n  return SerializeAttributesCommon(attributes, builder, parser);\n}\n\nbool EnumVal::DeserializeAttributes(\n    Parser& parser, const Vector<Offset<reflection::KeyValue>>* attrs) {\n  return DeserializeAttributesCommon(attributes, parser, attrs);\n}\n\nOffset<reflection::EnumVal> EnumVal::Serialize(FlatBufferBuilder* builder,\n                                               const Parser& parser) const {\n  const auto name__ = builder->CreateString(name);\n  const auto type__ = union_type.Serialize(builder);\n  const auto attr__ = SerializeAttributes(builder, parser);\n  const auto docs__ = parser.opts.binary_schema_comments && !doc_comment.empty()\n                          ? builder->CreateVectorOfStrings(doc_comment)\n                          : 0;\n  return reflection::CreateEnumVal(*builder, name__, value, type__, docs__,\n                                   attr__);\n}\n\nbool EnumVal::Deserialize(Parser& parser, const reflection::EnumVal* val) {\n  name = val->name()->str();\n  value = val->value();\n  if (!union_type.Deserialize(parser, val->union_type())) return false;\n  if (!DeserializeAttributes(parser, val->attributes())) return false;\n  DeserializeDoc(doc_comment, val->documentation());\n  return true;\n}\n\nOffset<reflection::Type> Type::Serialize(FlatBufferBuilder* builder) const {\n  size_t element_size = SizeOf(element);\n  if (base_type == BASE_TYPE_VECTOR && element == BASE_TYPE_STRUCT &&\n      struct_def->bytesize != 0) {\n    // struct_def->bytesize==0 means struct is table\n    element_size = struct_def->bytesize;\n  }\n  return reflection::CreateType(\n      *builder, static_cast<reflection::BaseType>(base_type),\n      static_cast<reflection::BaseType>(element),\n      struct_def ? struct_def->index : (enum_def ? enum_def->index : -1),\n      fixed_length, static_cast<uint32_t>(SizeOf(base_type)),\n      static_cast<uint32_t>(element_size));\n}\n\nbool Type::Deserialize(const Parser& parser, const reflection::Type* type) {\n  if (type == nullptr) return true;\n  base_type = static_cast<BaseType>(type->base_type());\n  element = static_cast<BaseType>(type->element());\n  fixed_length = type->fixed_length();\n  if (type->index() >= 0) {\n    bool is_series = type->base_type() == reflection::Vector ||\n                     type->base_type() == reflection::Array;\n    if (type->base_type() == reflection::Obj ||\n        (is_series && type->element() == reflection::Obj)) {\n      if (static_cast<size_t>(type->index()) < parser.structs_.vec.size()) {\n        struct_def = parser.structs_.vec[type->index()];\n        struct_def->refcount++;\n      } else {\n        return false;\n      }\n    } else {\n      if (static_cast<size_t>(type->index()) < parser.enums_.vec.size()) {\n        enum_def = parser.enums_.vec[type->index()];\n      } else {\n        return false;\n      }\n    }\n  }\n  return true;\n}\n\nflatbuffers::Offset<\n    flatbuffers::Vector<flatbuffers::Offset<reflection::KeyValue>>>\nDefinition::SerializeAttributes(FlatBufferBuilder* builder,\n                                const Parser& parser) const {\n  return SerializeAttributesCommon(attributes, builder, parser);\n}\n\nbool Definition::DeserializeAttributes(\n    Parser& parser, const Vector<Offset<reflection::KeyValue>>* attrs) {\n  return DeserializeAttributesCommon(attributes, parser, attrs);\n}\n\n/************************************************************************/\n/* DESERIALIZATION                                                      */\n/************************************************************************/\nbool Parser::Deserialize(const uint8_t* buf, const size_t size) {\n  flatbuffers::Verifier verifier(reinterpret_cast<const uint8_t*>(buf), size);\n  bool size_prefixed = false;\n  if (!reflection::SchemaBufferHasIdentifier(buf)) {\n    if (!flatbuffers::BufferHasIdentifier(buf, reflection::SchemaIdentifier(),\n                                          true))\n      return false;\n    else\n      size_prefixed = true;\n  }\n  auto verify_fn = size_prefixed\n                       ? &reflection::VerifySizePrefixedSchemaBuffer<false>\n                       : &reflection::VerifySchemaBuffer<false>;\n  if (!verify_fn(verifier)) {\n    return false;\n  }\n  auto schema = size_prefixed ? reflection::GetSizePrefixedSchema(buf)\n                              : reflection::GetSchema(buf);\n  return Deserialize(schema);\n}\n\nbool Parser::Deserialize(const reflection::Schema* schema) {\n  file_identifier_ = schema->file_ident() ? schema->file_ident()->str() : \"\";\n  file_extension_ = schema->file_ext() ? schema->file_ext()->str() : \"\";\n  std::map<std::string, Namespace*> namespaces_index;\n\n  // Create defs without deserializing so references from fields to structs and\n  // enums can be resolved.\n  for (auto it = schema->objects()->begin(); it != schema->objects()->end();\n       ++it) {\n    auto struct_def = new StructDef();\n    struct_def->bytesize = it->bytesize();\n    struct_def->fixed = it->is_struct();\n    struct_def->minalign = it->minalign();\n    if (structs_.Add(it->name()->str(), struct_def)) {\n      delete struct_def;\n      return false;\n    }\n    auto type = new Type(BASE_TYPE_STRUCT, struct_def, nullptr);\n    if (types_.Add(it->name()->str(), type)) {\n      delete type;\n      return false;\n    }\n  }\n  for (auto it = schema->enums()->begin(); it != schema->enums()->end(); ++it) {\n    auto enum_def = new EnumDef();\n    if (enums_.Add(it->name()->str(), enum_def)) {\n      delete enum_def;\n      return false;\n    }\n    auto type = new Type(BASE_TYPE_UNION, nullptr, enum_def);\n    if (types_.Add(it->name()->str(), type)) {\n      delete type;\n      return false;\n    }\n  }\n\n  // Now fields can refer to structs and enums by index.\n  for (auto it = schema->objects()->begin(); it != schema->objects()->end();\n       ++it) {\n    std::string qualified_name = it->name()->str();\n    auto struct_def = structs_.Lookup(qualified_name);\n    struct_def->defined_namespace =\n        GetNamespace(qualified_name, namespaces_, namespaces_index);\n    if (!struct_def->Deserialize(*this, *it)) {\n      return false;\n    }\n    if (schema->root_table() == *it) {\n      root_struct_def_ = struct_def;\n    }\n  }\n  for (auto it = schema->enums()->begin(); it != schema->enums()->end(); ++it) {\n    std::string qualified_name = it->name()->str();\n    auto enum_def = enums_.Lookup(qualified_name);\n    enum_def->defined_namespace =\n        GetNamespace(qualified_name, namespaces_, namespaces_index);\n    if (!enum_def->Deserialize(*this, *it)) {\n      return false;\n    }\n  }\n\n  if (schema->services()) {\n    for (auto it = schema->services()->begin(); it != schema->services()->end();\n         ++it) {\n      std::string qualified_name = it->name()->str();\n      auto service_def = new ServiceDef();\n      service_def->defined_namespace =\n          GetNamespace(qualified_name, namespaces_, namespaces_index);\n      if (!service_def->Deserialize(*this, *it) ||\n          services_.Add(qualified_name, service_def)) {\n        delete service_def;\n        return false;\n      }\n    }\n  }\n  advanced_features_ = schema->advanced_features();\n\n  if (schema->fbs_files())\n    for (auto s = schema->fbs_files()->begin(); s != schema->fbs_files()->end();\n         ++s) {\n      for (auto f = s->included_filenames()->begin();\n           f != s->included_filenames()->end(); ++f) {\n        IncludedFile included_file;\n        included_file.filename = f->str();\n        files_included_per_file_[s->filename()->str()].insert(included_file);\n      }\n    }\n\n  return true;\n}\n\nstd::string Parser::ConformTo(const Parser& base) {\n  for (auto sit = structs_.vec.begin(); sit != structs_.vec.end(); ++sit) {\n    auto& struct_def = **sit;\n    auto qualified_name =\n        struct_def.defined_namespace->GetFullyQualifiedName(struct_def.name);\n    auto struct_def_base = base.LookupStruct(qualified_name);\n    if (!struct_def_base) continue;\n    std::set<FieldDef*> renamed_fields;\n    for (auto fit = struct_def.fields.vec.begin();\n         fit != struct_def.fields.vec.end(); ++fit) {\n      auto& field = **fit;\n      auto field_base = struct_def_base->fields.Lookup(field.name);\n      const auto qualified_field_name = qualified_name + \".\" + field.name;\n      if (field_base) {\n        if (field.value.offset != field_base->value.offset) {\n          return \"offsets differ for field: \" + qualified_field_name;\n        }\n        if (field.value.constant != field_base->value.constant) {\n          return \"defaults differ for field: \" + qualified_field_name;\n        }\n        if (!EqualByName(field.value.type, field_base->value.type)) {\n          return \"types differ for field: \" + qualified_field_name;\n        }\n        if (field.offset64 != field_base->offset64) {\n          return \"offset types differ for field: \" + qualified_field_name;\n        }\n      } else {\n        // Doesn't have to exist, deleting fields is fine.\n        // But we should check if there is a field that has the same offset\n        // but is incompatible (in the case of field renaming).\n        for (auto fbit = struct_def_base->fields.vec.begin();\n             fbit != struct_def_base->fields.vec.end(); ++fbit) {\n          field_base = *fbit;\n          if (field.value.offset == field_base->value.offset) {\n            renamed_fields.insert(field_base);\n            if (!EqualByName(field.value.type, field_base->value.type)) {\n              const auto qualified_field_base =\n                  qualified_name + \".\" + field_base->name;\n              return \"field renamed to different type: \" +\n                     qualified_field_name + \" (renamed from \" +\n                     qualified_field_base + \")\";\n            }\n            break;\n          }\n        }\n      }\n    }\n    // deletion of trailing fields are not allowed\n    for (auto fit = struct_def_base->fields.vec.begin();\n         fit != struct_def_base->fields.vec.end(); ++fit) {\n      auto& field_base = **fit;\n      // not a renamed field\n      if (renamed_fields.find(&field_base) == renamed_fields.end()) {\n        auto field = struct_def.fields.Lookup(field_base.name);\n        if (!field) {\n          return \"field deleted: \" + qualified_name + \".\" + field_base.name;\n        }\n      }\n    }\n  }\n\n  for (auto eit = enums_.vec.begin(); eit != enums_.vec.end(); ++eit) {\n    auto& enum_def = **eit;\n    auto qualified_name =\n        enum_def.defined_namespace->GetFullyQualifiedName(enum_def.name);\n    auto enum_def_base = base.enums_.Lookup(qualified_name);\n    if (!enum_def_base) continue;\n    for (auto evit = enum_def.Vals().begin(); evit != enum_def.Vals().end();\n         ++evit) {\n      auto& enum_val = **evit;\n      auto enum_val_base = enum_def_base->Lookup(enum_val.name);\n      if (enum_val_base) {\n        if (enum_val != *enum_val_base)\n          return \"values differ for enum: \" + enum_val.name;\n      }\n    }\n    // Check underlying type changes\n    if (enum_def_base->underlying_type.base_type !=\n        enum_def.underlying_type.base_type) {\n      return \"underlying type differ for \" +\n             std::string(enum_def.is_union ? \"union: \" : \"enum: \") +\n             qualified_name;\n    }\n  }\n  return \"\";\n}\n\n}  // namespace flatbuffers\n"
  },
  {
    "path": "src/namer.h",
    "content": "#ifndef FLATBUFFERS_NAMER_H_\n#define FLATBUFFERS_NAMER_H_\n\n#include \"codegen/namer.h\"\n\n#endif  // FLATBUFFERS_NAMER_H_\n"
  },
  {
    "path": "src/reflection.cpp",
    "content": "/*\n * Copyright 2015 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"flatbuffers/reflection.h\"\n\n#include \"flatbuffers/util.h\"\n\n// Helper functionality for reflection.\n\nnamespace flatbuffers {\n\nnamespace {\n\nstatic void CopyInline(FlatBufferBuilder& fbb,\n                       const reflection::Field& fielddef, const Table& table,\n                       size_t align, size_t size) {\n  fbb.Align(align);\n  fbb.PushBytes(table.GetStruct<const uint8_t*>(fielddef.offset()), size);\n  fbb.TrackField(fielddef.offset(), fbb.GetSize());\n}\n\nstatic bool VerifyStruct(flatbuffers::Verifier& v,\n                         const flatbuffers::Table& parent_table,\n                         voffset_t field_offset, const reflection::Object& obj,\n                         bool required) {\n  auto offset = parent_table.GetOptionalFieldOffset(field_offset);\n  if (required && !offset) {\n    return false;\n  }\n\n  return !offset ||\n         v.VerifyFieldStruct(reinterpret_cast<const uint8_t*>(&parent_table),\n                             offset, obj.bytesize(), obj.minalign());\n}\n\nstatic bool VerifyVectorOfStructs(flatbuffers::Verifier& v,\n                                  const flatbuffers::Table& parent_table,\n                                  voffset_t field_offset,\n                                  const reflection::Object& obj,\n                                  bool required) {\n  auto p = parent_table.GetPointer<const uint8_t*>(field_offset);\n  if (required && !p) {\n    return false;\n  }\n\n  return !p || v.VerifyVectorOrString(p, obj.bytesize());\n}\n\n// forward declare to resolve cyclic deps between VerifyObject and VerifyVector\nstatic bool VerifyObject(flatbuffers::Verifier& v,\n                         const reflection::Schema& schema,\n                         const reflection::Object& obj,\n                         const flatbuffers::Table* table, bool required);\n\nstatic bool VerifyUnion(flatbuffers::Verifier& v,\n                        const reflection::Schema& schema, uint8_t utype,\n                        const uint8_t* elem,\n                        const reflection::Field& union_field) {\n  if (!utype) return true;  // Not present.\n  auto fb_enum = schema.enums()->Get(union_field.type()->index());\n  if (utype >= fb_enum->values()->size()) return false;\n  auto elem_type = fb_enum->values()->Get(utype)->union_type();\n  switch (elem_type->base_type()) {\n    case reflection::Obj: {\n      auto elem_obj = schema.objects()->Get(elem_type->index());\n      if (elem_obj->is_struct()) {\n        return v.VerifyFromPointer(elem, elem_obj->bytesize());\n      } else {\n        return VerifyObject(v, schema, *elem_obj,\n                            reinterpret_cast<const flatbuffers::Table*>(elem),\n                            true);\n      }\n    }\n    case reflection::String:\n      return v.VerifyString(reinterpret_cast<const flatbuffers::String*>(elem));\n    default:\n      return false;\n  }\n}\n\nstatic bool VerifyVector(flatbuffers::Verifier& v,\n                         const reflection::Schema& schema,\n                         const flatbuffers::Table& table,\n                         const reflection::Field& vec_field) {\n  FLATBUFFERS_ASSERT(vec_field.type()->base_type() == reflection::Vector);\n  if (!table.VerifyField<uoffset_t>(v, vec_field.offset(), sizeof(uoffset_t)))\n    return false;\n\n  switch (vec_field.type()->element()) {\n    case reflection::UType:\n      return v.VerifyVector(flatbuffers::GetFieldV<uint8_t>(table, vec_field));\n    case reflection::Bool:\n    case reflection::Byte:\n    case reflection::UByte:\n      return v.VerifyVector(flatbuffers::GetFieldV<int8_t>(table, vec_field));\n    case reflection::Short:\n    case reflection::UShort:\n      return v.VerifyVector(flatbuffers::GetFieldV<int16_t>(table, vec_field));\n    case reflection::Int:\n    case reflection::UInt:\n      return v.VerifyVector(flatbuffers::GetFieldV<int32_t>(table, vec_field));\n    case reflection::Long:\n    case reflection::ULong:\n      return v.VerifyVector(flatbuffers::GetFieldV<int64_t>(table, vec_field));\n    case reflection::Float:\n      return v.VerifyVector(flatbuffers::GetFieldV<float>(table, vec_field));\n    case reflection::Double:\n      return v.VerifyVector(flatbuffers::GetFieldV<double>(table, vec_field));\n    case reflection::String: {\n      auto vec_string =\n          flatbuffers::GetFieldV<flatbuffers::Offset<flatbuffers::String>>(\n              table, vec_field);\n      if (v.VerifyVector(vec_string) && v.VerifyVectorOfStrings(vec_string)) {\n        return true;\n      } else {\n        return false;\n      }\n    }\n    case reflection::Obj: {\n      auto obj = schema.objects()->Get(vec_field.type()->index());\n      if (obj->is_struct()) {\n        return VerifyVectorOfStructs(v, table, vec_field.offset(), *obj,\n                                     vec_field.required());\n      } else {\n        auto vec =\n            flatbuffers::GetFieldV<flatbuffers::Offset<flatbuffers::Table>>(\n                table, vec_field);\n        if (!v.VerifyVector(vec)) return false;\n        if (!vec) return true;\n        for (uoffset_t j = 0; j < vec->size(); j++) {\n          if (!VerifyObject(v, schema, *obj, vec->Get(j), true)) {\n            return false;\n          }\n        }\n        return true;\n      }\n    }\n    case reflection::Union: {\n      auto vec = flatbuffers::GetFieldV<flatbuffers::Offset<uint8_t>>(\n          table, vec_field);\n      if (!v.VerifyVector(vec)) return false;\n      if (!vec) return true;\n      auto type_vec = table.GetPointer<Vector<uint8_t>*>(vec_field.offset() -\n                                                         sizeof(voffset_t));\n      if (!v.VerifyVector(type_vec)) return false;\n      if (type_vec->size() != vec->size()) return false;\n      for (uoffset_t j = 0; j < vec->size(); j++) {\n        //  get union type from the prev field\n        auto utype = type_vec->Get(j);\n        auto elem = vec->Get(j);\n        if (!VerifyUnion(v, schema, utype, elem, vec_field)) return false;\n      }\n      return true;\n    }\n    case reflection::Vector:\n    case reflection::None:\n    default:\n      FLATBUFFERS_ASSERT(false);\n      return false;\n  }\n}\n\nstatic bool VerifyObject(flatbuffers::Verifier& v,\n                         const reflection::Schema& schema,\n                         const reflection::Object& obj,\n                         const flatbuffers::Table* table, bool required) {\n  if (!table) return !required;\n  if (!table->VerifyTableStart(v)) return false;\n  for (uoffset_t i = 0; i < obj.fields()->size(); i++) {\n    auto field_def = obj.fields()->Get(i);\n    switch (field_def->type()->base_type()) {\n      case reflection::None:\n        FLATBUFFERS_ASSERT(false);\n        break;\n      case reflection::UType:\n        if (!table->VerifyField<uint8_t>(v, field_def->offset(),\n                                         sizeof(uint8_t)))\n          return false;\n        break;\n      case reflection::Bool:\n      case reflection::Byte:\n      case reflection::UByte:\n        if (!table->VerifyField<int8_t>(v, field_def->offset(), sizeof(int8_t)))\n          return false;\n        break;\n      case reflection::Short:\n      case reflection::UShort:\n        if (!table->VerifyField<int16_t>(v, field_def->offset(),\n                                         sizeof(int16_t)))\n          return false;\n        break;\n      case reflection::Int:\n      case reflection::UInt:\n        if (!table->VerifyField<int32_t>(v, field_def->offset(),\n                                         sizeof(int32_t)))\n          return false;\n        break;\n      case reflection::Long:\n      case reflection::ULong:\n        if (!table->VerifyField<int64_t>(v, field_def->offset(),\n                                         sizeof(int64_t)))\n          return false;\n        break;\n      case reflection::Float:\n        if (!table->VerifyField<float>(v, field_def->offset(), sizeof(float)))\n          return false;\n        break;\n      case reflection::Double:\n        if (!table->VerifyField<double>(v, field_def->offset(), sizeof(double)))\n          return false;\n        break;\n      case reflection::String:\n        if (!table->VerifyField<uoffset_t>(v, field_def->offset(),\n                                           sizeof(uoffset_t)) ||\n            !v.VerifyString(flatbuffers::GetFieldS(*table, *field_def))) {\n          return false;\n        }\n        break;\n      case reflection::Vector:\n        if (!VerifyVector(v, schema, *table, *field_def)) return false;\n        break;\n      case reflection::Obj: {\n        auto child_obj = schema.objects()->Get(field_def->type()->index());\n        if (child_obj->is_struct()) {\n          if (!VerifyStruct(v, *table, field_def->offset(), *child_obj,\n                            field_def->required())) {\n            return false;\n          }\n        } else {\n          if (!VerifyObject(v, schema, *child_obj,\n                            flatbuffers::GetFieldT(*table, *field_def),\n                            field_def->required())) {\n            return false;\n          }\n        }\n        break;\n      }\n      case reflection::Union: {\n        //  get union type from the prev field\n        voffset_t utype_offset = field_def->offset() - sizeof(voffset_t);\n        auto utype = table->GetField<uint8_t>(utype_offset, 0);\n        auto uval = reinterpret_cast<const uint8_t*>(\n            flatbuffers::GetFieldT(*table, *field_def));\n        if (!VerifyUnion(v, schema, utype, uval, *field_def)) {\n          return false;\n        }\n        break;\n      }\n      default:\n        FLATBUFFERS_ASSERT(false);\n        break;\n    }\n  }\n\n  if (!v.EndTable()) return false;\n\n  return true;\n}\n\n}  // namespace\n\nint64_t GetAnyValueI(reflection::BaseType type, const uint8_t* data) {\n  // clang-format off\n  #define FLATBUFFERS_GET(T) static_cast<int64_t>(ReadScalar<T>(data))\n  switch (type) {\n    case reflection::UType:\n    case reflection::Bool:\n    case reflection::UByte:  return FLATBUFFERS_GET(uint8_t);\n    case reflection::Byte:   return FLATBUFFERS_GET(int8_t);\n    case reflection::Short:  return FLATBUFFERS_GET(int16_t);\n    case reflection::UShort: return FLATBUFFERS_GET(uint16_t);\n    case reflection::Int:    return FLATBUFFERS_GET(int32_t);\n    case reflection::UInt:   return FLATBUFFERS_GET(uint32_t);\n    case reflection::Long:   return FLATBUFFERS_GET(int64_t);\n    case reflection::ULong:  return FLATBUFFERS_GET(uint64_t);\n    case reflection::Float:  return FLATBUFFERS_GET(float);\n    case reflection::Double: return FLATBUFFERS_GET(double);\n    case reflection::String: {\n      auto s = reinterpret_cast<const String *>(ReadScalar<uoffset_t>(data) +\n                                                data);\n      return s ? StringToInt(s->c_str()) : 0;\n    }\n    default: return 0;  // Tables & vectors do not make sense.\n  }\n  #undef FLATBUFFERS_GET\n  // clang-format on\n}\n\ndouble GetAnyValueF(reflection::BaseType type, const uint8_t* data) {\n  switch (type) {\n    case reflection::Float:\n      return static_cast<double>(ReadScalar<float>(data));\n    case reflection::Double:\n      return ReadScalar<double>(data);\n    case reflection::String: {\n      auto s =\n          reinterpret_cast<const String*>(ReadScalar<uoffset_t>(data) + data);\n      if (s) {\n        double d;\n        StringToNumber(s->c_str(), &d);\n        return d;\n      } else {\n        return 0.0;\n      }\n    }\n    default:\n      return static_cast<double>(GetAnyValueI(type, data));\n  }\n}\n\nstd::string GetAnyValueS(reflection::BaseType type, const uint8_t* data,\n                         const reflection::Schema* schema, int type_index) {\n  switch (type) {\n    case reflection::Float:\n    case reflection::Double:\n      return NumToString(GetAnyValueF(type, data));\n    case reflection::String: {\n      auto s =\n          reinterpret_cast<const String*>(ReadScalar<uoffset_t>(data) + data);\n      return s ? s->c_str() : \"\";\n    }\n    case reflection::Obj:\n      if (schema) {\n        // Convert the table to a string. This is mostly for debugging purposes,\n        // and does NOT promise to be JSON compliant.\n        // Also prefixes the type.\n        auto& objectdef = *schema->objects()->Get(type_index);\n        auto s = objectdef.name()->str();\n        if (objectdef.is_struct()) {\n          s += \"(struct)\";  // TODO: implement this as well.\n        } else {\n          auto table_field = reinterpret_cast<const Table*>(\n              ReadScalar<uoffset_t>(data) + data);\n          s += \" { \";\n          auto fielddefs = objectdef.fields();\n          for (auto it = fielddefs->begin(); it != fielddefs->end(); ++it) {\n            auto& fielddef = **it;\n            if (!table_field->CheckField(fielddef.offset())) continue;\n            auto val = GetAnyFieldS(*table_field, fielddef, schema);\n            if (fielddef.type()->base_type() == reflection::String) {\n              std::string esc;\n              flatbuffers::EscapeString(val.c_str(), val.length(), &esc, true,\n                                        false);\n              val = esc;\n            }\n            s += fielddef.name()->str();\n            s += \": \";\n            s += val;\n            s += \", \";\n          }\n          s += \"}\";\n        }\n        return s;\n      } else {\n        return \"(table)\";\n      }\n    case reflection::Vector:\n      return \"[(elements)]\";  // TODO: implement this as well.\n    case reflection::Union:\n      return \"(union)\";  // TODO: implement this as well.\n    default:\n      return NumToString(GetAnyValueI(type, data));\n  }\n}\n\nvoid ForAllFields(const reflection::Object* object, bool reverse,\n                  std::function<void(const reflection::Field*)> func) {\n  std::vector<uint32_t> field_to_id_map;\n  field_to_id_map.resize(object->fields()->size());\n\n  // Create the mapping of field ID to the index into the vector.\n  for (uint32_t i = 0; i < object->fields()->size(); ++i) {\n    auto field = object->fields()->Get(i);\n    field_to_id_map[field->id()] = i;\n  }\n\n  for (size_t i = 0; i < field_to_id_map.size(); ++i) {\n    func(object->fields()->Get(\n        field_to_id_map[reverse ? field_to_id_map.size() - i + 1 : i]));\n  }\n}\n\nvoid SetAnyValueI(reflection::BaseType type, uint8_t* data, int64_t val) {\n  // clang-format off\n  #define FLATBUFFERS_SET(T) WriteScalar(data, static_cast<T>(val))\n  switch (type) {\n    case reflection::UType:\n    case reflection::Bool:\n    case reflection::UByte:  FLATBUFFERS_SET(uint8_t ); break;\n    case reflection::Byte:   FLATBUFFERS_SET(int8_t  ); break;\n    case reflection::Short:  FLATBUFFERS_SET(int16_t ); break;\n    case reflection::UShort: FLATBUFFERS_SET(uint16_t); break;\n    case reflection::Int:    FLATBUFFERS_SET(int32_t ); break;\n    case reflection::UInt:   FLATBUFFERS_SET(uint32_t); break;\n    case reflection::Long:   FLATBUFFERS_SET(int64_t ); break;\n    case reflection::ULong:  FLATBUFFERS_SET(uint64_t); break;\n    case reflection::Float:  FLATBUFFERS_SET(float   ); break;\n    case reflection::Double: FLATBUFFERS_SET(double  ); break;\n    // TODO: support strings\n    default: break;\n  }\n  #undef FLATBUFFERS_SET\n  // clang-format on\n}\n\nvoid SetAnyValueF(reflection::BaseType type, uint8_t* data, double val) {\n  switch (type) {\n    case reflection::Float:\n      WriteScalar(data, static_cast<float>(val));\n      break;\n    case reflection::Double:\n      WriteScalar(data, val);\n      break;\n    // TODO: support strings.\n    default:\n      SetAnyValueI(type, data, static_cast<int64_t>(val));\n      break;\n  }\n}\n\nvoid SetAnyValueS(reflection::BaseType type, uint8_t* data, const char* val) {\n  switch (type) {\n    case reflection::Float:\n    case reflection::Double: {\n      double d;\n      StringToNumber(val, &d);\n      SetAnyValueF(type, data, d);\n      break;\n    }\n    // TODO: support strings.\n    default:\n      SetAnyValueI(type, data, StringToInt(val));\n      break;\n  }\n}\n\n// Resize a FlatBuffer in-place by iterating through all offsets in the buffer\n// and adjusting them by \"delta\" if they straddle the start offset.\n// Once that is done, bytes can now be inserted/deleted safely.\n// \"delta\" may be negative (shrinking).\n// Unless \"delta\" is a multiple of the largest alignment, you'll create a small\n// amount of garbage space in the buffer (usually 0..7 bytes).\n// If your FlatBuffer's root table is not the schema's root table, you should\n// pass in your root_table type as well.\nclass ResizeContext {\n public:\n  ResizeContext(const reflection::Schema& schema, uoffset_t start, int delta,\n                std::vector<uint8_t>* flatbuf,\n                const reflection::Object* root_table = nullptr)\n      : schema_(schema),\n        startptr_(flatbuf->data() + start),\n        delta_(delta),\n        buf_(*flatbuf),\n        dag_check_(flatbuf->size() / sizeof(uoffset_t), false) {\n    auto mask = static_cast<int>(sizeof(largest_scalar_t) - 1);\n    delta_ = (delta_ + mask) & ~mask;\n    if (!delta_) return;  // We can't shrink by less than largest_scalar_t.\n    // Now change all the offsets by delta_.\n    auto root = GetAnyRoot(buf_.data());\n    Straddle<uoffset_t, 1>(buf_.data(), root, buf_.data());\n    ResizeTable(root_table ? *root_table : *schema.root_table(), root);\n    // We can now add or remove bytes at start.\n    if (delta_ > 0)\n      buf_.insert(buf_.begin() + start, delta_, 0);\n    else\n      buf_.erase(buf_.begin() + start + delta_, buf_.begin() + start);\n  }\n\n  // Check if the range between first (lower address) and second straddles\n  // the insertion point. If it does, change the offset at offsetloc (of\n  // type T, with direction D).\n  template <typename T, int D>\n  void Straddle(const void* first, const void* second, void* offsetloc) {\n    if (first <= startptr_ && second >= startptr_) {\n      WriteScalar<T>(offsetloc, ReadScalar<T>(offsetloc) + delta_ * D);\n      DagCheck(offsetloc) = true;\n    }\n  }\n\n  // This returns a boolean that records if the corresponding offset location\n  // has been modified already. If so, we can't even read the corresponding\n  // offset, since it is pointing to a location that is illegal until the\n  // resize actually happens.\n  // This must be checked for every offset, since we can't know which offsets\n  // will straddle and which won't.\n  uint8_t& DagCheck(const void* offsetloc) {\n    auto dag_idx = reinterpret_cast<const uoffset_t*>(offsetloc) -\n                   reinterpret_cast<const uoffset_t*>(buf_.data());\n    return dag_check_[dag_idx];\n  }\n\n  void ResizeTable(const reflection::Object& objectdef, Table* table) {\n    if (DagCheck(table)) return;  // Table already visited.\n    auto vtable = table->GetVTable();\n    // Early out: since all fields inside the table must point forwards in\n    // memory, if the insertion point is before the table we can stop here.\n    auto tableloc = reinterpret_cast<uint8_t*>(table);\n    if (startptr_ <= tableloc) {\n      // Check if insertion point is between the table and a vtable that\n      // precedes it. This can't happen in current construction code, but check\n      // just in case we ever change the way flatbuffers are built.\n      Straddle<soffset_t, -1>(vtable, table, table);\n    } else {\n      // Check each field.\n      auto fielddefs = objectdef.fields();\n      for (auto it = fielddefs->begin(); it != fielddefs->end(); ++it) {\n        auto& fielddef = **it;\n        auto base_type = fielddef.type()->base_type();\n        // Ignore scalars.\n        if (base_type <= reflection::Double) continue;\n        // Ignore fields that are not stored.\n        auto offset = table->GetOptionalFieldOffset(fielddef.offset());\n        if (!offset) continue;\n        // Ignore structs.\n        auto subobjectdef =\n            base_type == reflection::Obj\n                ? schema_.objects()->Get(fielddef.type()->index())\n                : nullptr;\n        if (subobjectdef && subobjectdef->is_struct()) continue;\n        // Get this fields' offset, and read it if safe.\n        auto offsetloc = tableloc + offset;\n        if (DagCheck(offsetloc)) continue;  // This offset already visited.\n        auto ref = offsetloc + ReadScalar<uoffset_t>(offsetloc);\n        Straddle<uoffset_t, 1>(offsetloc, ref, offsetloc);\n        // Recurse.\n        switch (base_type) {\n          case reflection::Obj: {\n            if (subobjectdef) {\n              ResizeTable(*subobjectdef, reinterpret_cast<Table*>(ref));\n            }\n            break;\n          }\n          case reflection::Vector: {\n            auto elem_type = fielddef.type()->element();\n            if (elem_type != reflection::Obj && elem_type != reflection::String)\n              break;\n            auto vec = reinterpret_cast<Vector<uoffset_t>*>(ref);\n            auto elemobjectdef =\n                elem_type == reflection::Obj\n                    ? schema_.objects()->Get(fielddef.type()->index())\n                    : nullptr;\n            if (elemobjectdef && elemobjectdef->is_struct()) break;\n            for (uoffset_t i = 0; i < vec->size(); i++) {\n              auto loc = vec->Data() + i * sizeof(uoffset_t);\n              if (DagCheck(loc)) continue;  // This offset already visited.\n              auto dest = loc + vec->Get(i);\n              Straddle<uoffset_t, 1>(loc, dest, loc);\n              if (elemobjectdef)\n                ResizeTable(*elemobjectdef, reinterpret_cast<Table*>(dest));\n            }\n            break;\n          }\n          case reflection::Union: {\n            ResizeTable(GetUnionType(schema_, objectdef, fielddef, *table),\n                        reinterpret_cast<Table*>(ref));\n            break;\n          }\n          case reflection::String:\n            break;\n          default:\n            FLATBUFFERS_ASSERT(false);\n        }\n      }\n      // Check if the vtable offset points beyond the insertion point.\n      // Must do this last, since GetOptionalFieldOffset above still reads\n      // this value.\n      Straddle<soffset_t, -1>(table, vtable, table);\n    }\n  }\n\n private:\n  const reflection::Schema& schema_;\n  uint8_t* startptr_;\n  int delta_;\n  std::vector<uint8_t>& buf_;\n  std::vector<uint8_t> dag_check_;\n};\n\nvoid SetString(const reflection::Schema& schema, const std::string& val,\n               const String* str, std::vector<uint8_t>* flatbuf,\n               const reflection::Object* root_table) {\n  auto delta = static_cast<int>(val.size()) - static_cast<int>(str->size());\n  auto str_start = static_cast<uoffset_t>(\n      reinterpret_cast<const uint8_t*>(str) - flatbuf->data());\n  auto start = str_start + static_cast<uoffset_t>(sizeof(uoffset_t));\n  if (delta) {\n    // Clear the old string, since we don't want parts of it remaining.\n    memset(flatbuf->data() + start, 0, str->size());\n    // Different size, we must expand (or contract).\n    ResizeContext ctx(schema, start, delta, flatbuf, root_table);\n    // Set the new length.\n    WriteScalar(flatbuf->data() + str_start,\n                static_cast<uoffset_t>(val.size()));\n  }\n  // Copy new data. Safe because we created the right amount of space.\n  memcpy(flatbuf->data() + start, val.c_str(), val.size() + 1);\n}\n\nuint8_t* ResizeAnyVector(const reflection::Schema& schema, uoffset_t newsize,\n                         const VectorOfAny* vec, uoffset_t num_elems,\n                         uoffset_t elem_size, std::vector<uint8_t>* flatbuf,\n                         const reflection::Object* root_table) {\n  auto delta_elem = static_cast<int>(newsize) - static_cast<int>(num_elems);\n  auto delta_bytes = delta_elem * static_cast<int>(elem_size);\n  auto vec_start = reinterpret_cast<const uint8_t*>(vec) - flatbuf->data();\n  auto start = static_cast<uoffset_t>(vec_start) +\n               static_cast<uoffset_t>(sizeof(uoffset_t)) +\n               elem_size * num_elems;\n  if (delta_bytes) {\n    if (delta_elem < 0) {\n      // Clear elements we're throwing away, since some might remain in the\n      // buffer.\n      auto size_clear = -delta_elem * elem_size;\n      memset(flatbuf->data() + start - size_clear, 0, size_clear);\n    }\n    ResizeContext ctx(schema, start, delta_bytes, flatbuf, root_table);\n    WriteScalar(flatbuf->data() + vec_start, newsize);  // Length field.\n    // Set new elements to 0.. this can be overwritten by the caller.\n    if (delta_elem > 0) {\n      memset(flatbuf->data() + start, 0,\n             static_cast<size_t>(delta_elem) * elem_size);\n    }\n  }\n  return flatbuf->data() + start;\n}\n\nconst uint8_t* AddFlatBuffer(std::vector<uint8_t>& flatbuf,\n                             const uint8_t* newbuf, size_t newlen) {\n  // Align to sizeof(uoffset_t) past sizeof(largest_scalar_t) since we're\n  // going to chop off the root offset.\n  if (!newbuf || newlen < sizeof(uoffset_t)) return nullptr;\n  FLATBUFFERS_ASSERT(newlen >= sizeof(uoffset_t));\n  auto root = ReadScalar<uoffset_t>(newbuf);\n  if (root < sizeof(uoffset_t) || root >= newlen) return nullptr;\n  while ((flatbuf.size() & (sizeof(uoffset_t) - 1)) ||\n         !(flatbuf.size() & (sizeof(largest_scalar_t) - 1))) {\n    flatbuf.push_back(0);\n  }\n  auto insertion_point = static_cast<uoffset_t>(flatbuf.size());\n  // Insert the entire FlatBuffer minus the root pointer.\n  flatbuf.insert(flatbuf.end(), newbuf + sizeof(uoffset_t), newbuf + newlen);\n  auto root_offset = root - sizeof(uoffset_t);\n  return flatbuf.data() + insertion_point + root_offset;\n}\n\nOffset<const Table*> CopyTable(FlatBufferBuilder& fbb,\n                               const reflection::Schema& schema,\n                               const reflection::Object& objectdef,\n                               const Table& table, bool use_string_pooling) {\n  // Before we can construct the table, we have to first generate any\n  // subobjects, and collect their offsets.\n  std::vector<uoffset_t> offsets;\n  auto fielddefs = objectdef.fields();\n  for (auto it = fielddefs->begin(); it != fielddefs->end(); ++it) {\n    auto& fielddef = **it;\n    // Skip if field is not present in the source.\n    if (!table.CheckField(fielddef.offset())) continue;\n    uoffset_t offset = 0;\n    switch (fielddef.type()->base_type()) {\n      case reflection::String: {\n        offset = use_string_pooling\n                     ? fbb.CreateSharedString(GetFieldS(table, fielddef)).o\n                     : fbb.CreateString(GetFieldS(table, fielddef)).o;\n        break;\n      }\n      case reflection::Obj: {\n        auto& subobjectdef = *schema.objects()->Get(fielddef.type()->index());\n        if (!subobjectdef.is_struct()) {\n          offset = CopyTable(fbb, schema, subobjectdef,\n                             *GetFieldT(table, fielddef), use_string_pooling)\n                       .o;\n        }\n        break;\n      }\n      case reflection::Union: {\n        auto& subobjectdef = GetUnionType(schema, objectdef, fielddef, table);\n        offset = CopyTable(fbb, schema, subobjectdef,\n                           *GetFieldT(table, fielddef), use_string_pooling)\n                     .o;\n        break;\n      }\n      case reflection::Vector: {\n        auto vec =\n            table.GetPointer<const Vector<Offset<Table>>*>(fielddef.offset());\n        auto element_base_type = fielddef.type()->element();\n        auto elemobjectdef =\n            element_base_type == reflection::Obj\n                ? schema.objects()->Get(fielddef.type()->index())\n                : nullptr;\n        switch (element_base_type) {\n          case reflection::String: {\n            std::vector<Offset<const String*>> elements(vec->size());\n            auto vec_s = reinterpret_cast<const Vector<Offset<String>>*>(vec);\n            for (uoffset_t i = 0; i < vec_s->size(); i++) {\n              elements[i] = use_string_pooling\n                                ? fbb.CreateSharedString(vec_s->Get(i)).o\n                                : fbb.CreateString(vec_s->Get(i)).o;\n            }\n            offset = fbb.CreateVector(elements).o;\n            break;\n          }\n          case reflection::Obj: {\n            if (!elemobjectdef->is_struct()) {\n              std::vector<Offset<const Table*>> elements(vec->size());\n              for (uoffset_t i = 0; i < vec->size(); i++) {\n                elements[i] = CopyTable(fbb, schema, *elemobjectdef,\n                                        *vec->Get(i), use_string_pooling);\n              }\n              offset = fbb.CreateVector(elements).o;\n              break;\n            }\n          }\n            FLATBUFFERS_FALLTHROUGH();  // fall thru\n          default: {                    // Scalars and structs.\n            auto element_size = GetTypeSize(element_base_type);\n            auto element_alignment = element_size;  // For primitive elements\n            if (elemobjectdef && elemobjectdef->is_struct())\n              element_size = elemobjectdef->bytesize();\n            fbb.StartVector(vec->size(), element_size, element_alignment);\n            fbb.PushBytes(vec->Data(), element_size * vec->size());\n            offset = fbb.EndVector(vec->size());\n            break;\n          }\n        }\n        break;\n      }\n      default:  // Scalars.\n        break;\n    }\n    if (offset) {\n      offsets.push_back(offset);\n    }\n  }\n  // Now we can build the actual table from either offsets or scalar data.\n  auto start = objectdef.is_struct() ? fbb.StartStruct(objectdef.minalign())\n                                     : fbb.StartTable();\n  size_t offset_idx = 0;\n  for (auto it = fielddefs->begin(); it != fielddefs->end(); ++it) {\n    auto& fielddef = **it;\n    if (!table.CheckField(fielddef.offset())) continue;\n    auto base_type = fielddef.type()->base_type();\n    switch (base_type) {\n      case reflection::Obj: {\n        auto& subobjectdef = *schema.objects()->Get(fielddef.type()->index());\n        if (subobjectdef.is_struct()) {\n          CopyInline(fbb, fielddef, table, subobjectdef.minalign(),\n                     subobjectdef.bytesize());\n          break;\n        }\n      }\n        FLATBUFFERS_FALLTHROUGH();  // fall thru\n      case reflection::Union:\n      case reflection::String:\n      case reflection::Vector:\n        fbb.AddOffset(fielddef.offset(), Offset<void>(offsets[offset_idx++]));\n        break;\n      default: {  // Scalars.\n        auto size = GetTypeSize(base_type);\n        CopyInline(fbb, fielddef, table, size, size);\n        break;\n      }\n    }\n  }\n  FLATBUFFERS_ASSERT(offset_idx == offsets.size());\n  if (objectdef.is_struct()) {\n    fbb.ClearOffsets();\n    return fbb.EndStruct();\n  } else {\n    return fbb.EndTable(start);\n  }\n}\n\nbool Verify(const reflection::Schema& schema, const reflection::Object& root,\n            const uint8_t* const buf, const size_t length,\n            const uoffset_t max_depth, const uoffset_t max_tables) {\n  Verifier v(buf, length, max_depth, max_tables);\n  return VerifyObject(v, schema, root, flatbuffers::GetAnyRoot(buf),\n                      /*required=*/true);\n}\n\nbool VerifySizePrefixed(const reflection::Schema& schema,\n                        const reflection::Object& root,\n                        const uint8_t* const buf, const size_t length,\n                        const uoffset_t max_depth, const uoffset_t max_tables) {\n  Verifier v(buf, length, max_depth, max_tables);\n  return VerifyObject(v, schema, root, flatbuffers::GetAnySizePrefixedRoot(buf),\n                      /*required=*/true);\n}\n\n}  // namespace flatbuffers\n"
  },
  {
    "path": "src/util.cpp",
    "content": "/*\n * Copyright 2016 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// clang-format off\n// Dont't remove `format off`, it prevent reordering of win-includes.\n\n#include <cstring>\n#if defined(__MINGW32__) || defined(__MINGW64__) || defined(__CYGWIN__) || \\\n    defined(__QNXNTO__)\n#  define _POSIX_C_SOURCE 200809L\n#  define _XOPEN_SOURCE 700L\n#endif\n\n#if defined(_WIN32) || defined(__MINGW32__) || defined(__MINGW64__) || defined(__CYGWIN__)\n#  ifndef WIN32_LEAN_AND_MEAN\n#    define WIN32_LEAN_AND_MEAN\n#  endif\n#  ifndef NOMINMAX\n#    define NOMINMAX\n#  endif\n#  ifdef _MSC_VER\n#    include <crtdbg.h>\n#  endif\n#  include <windows.h>  // Must be included before <direct.h>\n#  ifndef __CYGWIN__\n#    include <direct.h>\n#  endif\n#  include <winbase.h>\n#  undef interface  // This is also important because of reasons\n#endif\n// clang-format on\n\n#include \"flatbuffers/util.h\"\n\n#include <sys/stat.h>\n\n#include <clocale>\n#include <cstdlib>\n#include <fstream>\n#include <functional>\n\n#include \"flatbuffers/base.h\"\n\nnamespace flatbuffers {\n\nnamespace {\n\nstatic bool FileExistsRaw(const char* name) {\n  std::ifstream ifs(name);\n  return ifs.good();\n}\n\nstatic bool LoadFileRaw(const char* name, bool binary, std::string* buf) {\n  if (DirExists(name)) return false;\n  std::ifstream ifs(name, binary ? std::ifstream::binary : std::ifstream::in);\n  if (!ifs.is_open()) return false;\n  if (binary) {\n    // The fastest way to read a file into a string.\n    ifs.seekg(0, std::ios::end);\n    auto size = ifs.tellg();\n    (*buf).resize(static_cast<size_t>(size));\n    ifs.seekg(0, std::ios::beg);\n    ifs.read(&(*buf)[0], (*buf).size());\n  } else {\n    // This is slower, but works correctly on all platforms for text files.\n    std::ostringstream oss;\n    oss << ifs.rdbuf();\n    *buf = oss.str();\n  }\n  return !ifs.bad();\n}\n\nLoadFileFunction g_load_file_function = LoadFileRaw;\nFileExistsFunction g_file_exists_function = FileExistsRaw;\n\nstatic std::string ToCamelCase(const std::string& input, bool is_upper) {\n  std::string s;\n  for (size_t i = 0; i < input.length(); i++) {\n    if (!i && input[i] == '_') {\n      s += input[i];\n      // we ignore leading underscore but make following\n      // alphabet char upper.\n      if (i + 1 < input.length() && is_alpha(input[i + 1]))\n        s += CharToUpper(input[++i]);\n    } else if (!i)\n      s += is_upper ? CharToUpper(input[i]) : CharToLower(input[i]);\n    else if (input[i] == '_' && i + 1 < input.length())\n      s += CharToUpper(input[++i]);\n    else\n      s += input[i];\n  }\n  return s;\n}\n\nstatic std::string ToSnakeCase(const std::string& input, bool screaming) {\n  std::string s;\n  for (size_t i = 0; i < input.length(); i++) {\n    if (i == 0) {\n      s += screaming ? CharToUpper(input[i]) : CharToLower(input[i]);\n    } else if (input[i] == '_') {\n      s += '_';\n    } else if (!islower(input[i])) {\n      // Prevent duplicate underscores for Upper_Snake_Case strings\n      // and UPPERCASE strings.\n      if (islower(input[i - 1]) ||\n          (isdigit(input[i - 1]) && !isdigit(input[i]))) {\n        s += '_';\n      }\n      s += screaming ? CharToUpper(input[i]) : CharToLower(input[i]);\n    } else {\n      s += screaming ? CharToUpper(input[i]) : input[i];\n    }\n  }\n  return s;\n}\n\nstd::string ToAll(const std::string& input,\n                  std::function<char(const char)> transform) {\n  std::string s;\n  for (size_t i = 0; i < input.length(); i++) {\n    s += transform(input[i]);\n  }\n  return s;\n}\n\nstd::string CamelToSnake(const std::string& input) {\n  std::string s;\n  for (size_t i = 0; i < input.length(); i++) {\n    if (i == 0) {\n      s += CharToLower(input[i]);\n    } else if (input[i] == '_') {\n      s += '_';\n    } else if (!islower(input[i])) {\n      // Prevent duplicate underscores for Upper_Snake_Case strings\n      // and UPPERCASE strings.\n      if (islower(input[i - 1]) ||\n          (isdigit(input[i - 1]) && !isdigit(input[i]))) {\n        s += '_';\n      }\n      s += CharToLower(input[i]);\n    } else {\n      s += input[i];\n    }\n  }\n  return s;\n}\n\nstd::string DasherToSnake(const std::string& input) {\n  std::string s;\n  for (size_t i = 0; i < input.length(); i++) {\n    if (input[i] == '-') {\n      s += \"_\";\n    } else {\n      s += input[i];\n    }\n  }\n  return s;\n}\n\nstd::string ToDasher(const std::string& input) {\n  std::string s;\n  char p = 0;\n  for (size_t i = 0; i < input.length(); i++) {\n    char const& c = input[i];\n    if (c == '_') {\n      if (i > 0 && p != kPathSeparator &&\n          // The following is a special case to ignore digits after a _. This is\n          // because ThisExample3 would be converted to this_example_3 in the\n          // CamelToSnake conversion, and then dasher would do this-example-3,\n          // but it expects this-example3.\n          !(i + 1 < input.length() && isdigit(input[i + 1])))\n        s += \"-\";\n    } else {\n      s += c;\n    }\n    p = c;\n  }\n  return s;\n}\n\n// Converts foo_bar_123baz_456 to foo_bar123_baz456\nstd::string SnakeToSnake2(const std::string& s) {\n  if (s.length() <= 1) return s;\n  std::string result;\n  result.reserve(s.size());\n  for (size_t i = 0; i < s.length() - 1; i++) {\n    if (s[i] == '_' && isdigit(s[i + 1])) {\n      continue;  // Move the `_` until after the digits.\n    }\n\n    result.push_back(s[i]);\n\n    if (isdigit(s[i]) && isalpha(s[i + 1]) && islower(s[i + 1])) {\n      result.push_back('_');\n    }\n  }\n  result.push_back(s.back());\n\n  return result;\n}\n\n}  // namespace\n\nbool LoadFile(const char* name, bool binary, std::string* buf) {\n  FLATBUFFERS_ASSERT(g_load_file_function);\n  return g_load_file_function(name, binary, buf);\n}\n\nbool FileExists(const char* name) {\n  FLATBUFFERS_ASSERT(g_file_exists_function);\n  return g_file_exists_function(name);\n}\n\nbool DirExists(const char* name) {\n  // clang-format off\n\n  #ifdef _WIN32\n    #define flatbuffers_stat _stat\n    #define FLATBUFFERS_S_IFDIR _S_IFDIR\n  #else\n    #define flatbuffers_stat stat\n    #define FLATBUFFERS_S_IFDIR S_IFDIR\n  #endif\n  // clang-format on\n  struct flatbuffers_stat file_info;\n  if (flatbuffers_stat(name, &file_info) != 0) return false;\n  return (file_info.st_mode & FLATBUFFERS_S_IFDIR) != 0;\n}\n\nLoadFileFunction SetLoadFileFunction(LoadFileFunction load_file_function) {\n  LoadFileFunction previous_function = g_load_file_function;\n  g_load_file_function = load_file_function ? load_file_function : LoadFileRaw;\n  return previous_function;\n}\n\nFileExistsFunction SetFileExistsFunction(\n    FileExistsFunction file_exists_function) {\n  FileExistsFunction previous_function = g_file_exists_function;\n  g_file_exists_function =\n      file_exists_function ? file_exists_function : FileExistsRaw;\n  return previous_function;\n}\n\nbool SaveFile(const char* name, const char* buf, size_t len, bool binary) {\n  std::ofstream ofs(name, binary ? std::ofstream::binary : std::ofstream::out);\n  if (!ofs.is_open()) return false;\n  ofs.write(buf, len);\n  return !ofs.bad();\n}\n\n// We internally store paths in posix format ('/'). Paths supplied\n// by the user should go through PosixPath to ensure correct behavior\n// on Windows when paths are string-compared.\n\nstatic const char kPathSeparatorWindows = '\\\\';\nstatic const char* PathSeparatorSet = \"\\\\/\";  // Intentionally no ':'\n\nstd::string StripExtension(const std::string& filepath) {\n  size_t i = filepath.find_last_of('.');\n  return i != std::string::npos ? filepath.substr(0, i) : filepath;\n}\n\nstd::string GetExtension(const std::string& filepath) {\n  size_t i = filepath.find_last_of('.');\n  return i != std::string::npos ? filepath.substr(i + 1) : \"\";\n}\n\nstd::string StripPath(const std::string& filepath) {\n  size_t i = filepath.find_last_of(PathSeparatorSet);\n  return i != std::string::npos ? filepath.substr(i + 1) : filepath;\n}\n\nstd::string StripFileName(const std::string& filepath) {\n  size_t i = filepath.find_last_of(PathSeparatorSet);\n  return i != std::string::npos ? filepath.substr(0, i) : \"\";\n}\n\nstd::string StripPrefix(const std::string& filepath,\n                        const std::string& prefix_to_remove) {\n  if (!strncmp(filepath.c_str(), prefix_to_remove.c_str(),\n               prefix_to_remove.size())) {\n    return filepath.substr(prefix_to_remove.size());\n  }\n  return filepath;\n}\n\nstd::string ConCatPathFileName(const std::string& path,\n                               const std::string& filename) {\n  std::string filepath = path;\n  if (filepath.length()) {\n    char& filepath_last_character = filepath.back();\n    if (filepath_last_character == kPathSeparatorWindows) {\n      filepath_last_character = kPathSeparator;\n    } else if (filepath_last_character != kPathSeparator) {\n      filepath += kPathSeparator;\n    }\n  }\n  filepath += filename;\n  // Ignore './' at the start of filepath.\n  if (filepath[0] == '.' && filepath[1] == kPathSeparator) {\n    filepath.erase(0, 2);\n  }\n  return filepath;\n}\n\nstd::string PosixPath(const char* path) {\n  std::string p = path;\n  std::replace(p.begin(), p.end(), '\\\\', '/');\n  return p;\n}\nstd::string PosixPath(const std::string& path) {\n  return PosixPath(path.c_str());\n}\n\nvoid EnsureDirExists(const std::string& filepath) {\n  auto parent = StripFileName(filepath);\n  if (parent.length()) EnsureDirExists(parent);\n  // clang-format off\n\n  #ifdef _WIN32\n    (void)_mkdir(filepath.c_str());\n  #else\n    mkdir(filepath.c_str(), S_IRWXU|S_IRGRP|S_IXGRP);\n  #endif\n  // clang-format on\n}\n\nstd::string FilePath(const std::string& project, const std::string& filePath,\n                     bool absolute) {\n  return (absolute) ? AbsolutePath(filePath)\n                    : RelativeToRootPath(project, filePath);\n}\n\nstd::string AbsolutePath(const std::string& filepath) {\n  // clang-format off\n\n  #ifdef FLATBUFFERS_NO_ABSOLUTE_PATH_RESOLUTION\n    return filepath;\n  #else\n    #if defined(_WIN32) || defined(__MINGW32__) || defined(__MINGW64__) || defined(__CYGWIN__)\n      char abs_path[MAX_PATH];\n      return GetFullPathNameA(filepath.c_str(), MAX_PATH, abs_path, nullptr)\n    #else\n      char *abs_path_temp = realpath(filepath.c_str(), nullptr);\n      bool success = abs_path_temp != nullptr;\n      std::string abs_path;\n      if(success) {\n        abs_path = abs_path_temp;\n        free(abs_path_temp);\n      }\n      return success\n    #endif\n      ? abs_path\n      : filepath;\n  #endif // FLATBUFFERS_NO_ABSOLUTE_PATH_RESOLUTION\n  // clang-format on\n}\n\nstd::string RelativeToRootPath(const std::string& project,\n                               const std::string& filepath) {\n  std::string absolute_project = PosixPath(AbsolutePath(project));\n  if (absolute_project.back() != '/') absolute_project += \"/\";\n  std::string absolute_filepath = PosixPath(AbsolutePath(filepath));\n\n  // Find the first character where they disagree.\n  // The previous directory is the lowest common ancestor;\n  const char* a = absolute_project.c_str();\n  const char* b = absolute_filepath.c_str();\n  size_t common_prefix_len = 0;\n  while (*a != '\\0' && *b != '\\0' && *a == *b) {\n    if (*a == '/') common_prefix_len = a - absolute_project.c_str();\n    a++;\n    b++;\n  }\n  // the number of ../ to prepend to b depends on the number of remaining\n  // directories in A.\n  const char* suffix = absolute_project.c_str() + common_prefix_len;\n  size_t num_up = 0;\n  while (*suffix != '\\0')\n    if (*suffix++ == '/') num_up++;\n  num_up--;  // last one is known to be '/'.\n  std::string result = \"//\";\n  for (size_t i = 0; i < num_up; i++) result += \"../\";\n  result += absolute_filepath.substr(common_prefix_len + 1);\n\n  return result;\n}\n\n// Locale-independent code.\n#if defined(FLATBUFFERS_LOCALE_INDEPENDENT) && \\\n    (FLATBUFFERS_LOCALE_INDEPENDENT > 0)\n\n// clang-format off\n// Allocate locale instance at startup of application.\nClassicLocale ClassicLocale::instance_;\n\n#ifdef _MSC_VER\n  ClassicLocale::ClassicLocale()\n    : locale_(_create_locale(LC_ALL, \"C\")) {}\n  ClassicLocale::~ClassicLocale() { _free_locale(locale_); }\n#else\n  ClassicLocale::ClassicLocale()\n    : locale_(newlocale(LC_ALL, \"C\", nullptr)) {}\n  ClassicLocale::~ClassicLocale() { freelocale(locale_); }\n#endif\n// clang-format on\n\n#endif  // !FLATBUFFERS_LOCALE_INDEPENDENT\n\nstd::string RemoveStringQuotes(const std::string& s) {\n  auto ch = *s.c_str();\n  return ((s.size() >= 2) && (ch == '\\\"' || ch == '\\'') && (ch == s.back()))\n             ? s.substr(1, s.length() - 2)\n             : s;\n}\n\nbool SetGlobalTestLocale(const char* locale_name, std::string* _value) {\n  const auto the_locale = setlocale(LC_ALL, locale_name);\n  if (!the_locale) return false;\n  if (_value) *_value = std::string(the_locale);\n  return true;\n}\n\nbool ReadEnvironmentVariable(const char* var_name, std::string* _value) {\n#ifdef _MSC_VER\n  __pragma(warning(disable : 4996));  // _CRT_SECURE_NO_WARNINGS\n#endif\n  auto env_str = std::getenv(var_name);\n  if (!env_str) return false;\n  if (_value) *_value = std::string(env_str);\n  return true;\n}\n\nstd::string ConvertCase(const std::string& input, Case output_case,\n                        Case input_case) {\n  if (output_case == Case::kKeep) return input;\n  // The output cases expect snake_case inputs, so if we don't have that input\n  // format, try to convert to snake_case.\n  switch (input_case) {\n    case Case::kLowerCamel:\n    case Case::kUpperCamel:\n      return ConvertCase(CamelToSnake(input), output_case);\n    case Case::kDasher:\n      return ConvertCase(DasherToSnake(input), output_case);\n    case Case::kKeep:\n      printf(\"WARNING: Converting from kKeep case.\\n\");\n      break;\n    default:\n    case Case::kSnake:\n    case Case::kScreamingSnake:\n    case Case::kAllLower:\n    case Case::kAllUpper:\n      break;\n  }\n\n  switch (output_case) {\n    case Case::kUpperCamel:\n      return ToCamelCase(input, true);\n    case Case::kLowerCamel:\n      return ToCamelCase(input, false);\n    case Case::kSnake:\n      return input;\n    case Case::kScreamingSnake:\n      return ToSnakeCase(input, true);\n    case Case::kAllUpper:\n      return ToAll(input, CharToUpper);\n    case Case::kAllLower:\n      return ToAll(input, CharToLower);\n    case Case::kDasher:\n      return ToDasher(input);\n    case Case::kSnake2:\n      return SnakeToSnake2(input);\n    default:\n    case Case::kUnknown:\n      return input;\n  }\n}\n\n}  // namespace flatbuffers\n"
  },
  {
    "path": "swift/BUILD.bazel",
    "content": "load(\"@build_bazel_rules_swift//swift:swift.bzl\", \"swift_library\")\n\nswift_library(\n    name = \"FlexBuffers\",\n    srcs = glob([\n        \"Sources/FlexBuffers/**/*.swift\",\n        \"Sources/Common/*.swift\",\n    ]),\n    module_name = \"FlexBuffers\",\n    visibility = [\"//visibility:public\"],\n)\n\nswift_library(\n    name = \"swift\",\n    srcs = glob([\n        \"Sources/FlatBuffers/*.swift\",\n        \"Sources/FlatBuffers/Vectors/*.swift\",\n        \"Sources/Common/*.swift\"\n    ]),\n    module_name = \"FlatBuffers\",\n    visibility = [\"//visibility:public\"],\n)\n"
  },
  {
    "path": "swift/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "swift/README.md",
    "content": "FlatBuffers swift can be found in both SPM\n\n`.package(url: \"https://github.com/google/flatbuffers.git\", from: \"X.Y.Z\"),`\n\nand Cocoapods\n\n`pod 'FlatBuffers'`\n\n### Contribute\n\n1- Always run `swift test --generate-linuxmain` whenever new test functions are added or removed\n"
  },
  {
    "path": "swift/Sources/Common/Int+extension.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\nextension Int {\n\n  /// Moves the current int into the nearest power of two\n  ///\n  /// This is used since the UnsafeMutableRawPointer will face issues when writing/reading\n  /// if the buffer alignment exceeds that actual size of the buffer\n  @inline(__always)\n  public var convertToPowerofTwo: Int {\n    guard self > 0 else { return 1 }\n    var n = UInt32(self)\n\n    #if arch(arm) || arch(i386)\n    let max = UInt32(Int.max)\n    #else\n    let max = UInt32.max\n    #endif\n\n    n -= 1\n    n |= n >> 1\n    n |= n >> 2\n    n |= n >> 4\n    n |= n >> 8\n    n |= n >> 16\n    if n != max {\n      n += 1\n    }\n\n    return Int(n)\n  }\n}\n"
  },
  {
    "path": "swift/Sources/Common/Scalar.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\n/// A boolean to see if the system is littleEndian\npublic let isLitteEndian: Bool = {\n  let number: UInt32 = 0x1234_5678\n  return number == number.littleEndian\n}()\n\n/// Constant for the file id length\npublic let FileIdLength = 4\n\n/// Protocol that All Scalars should conform to\n///\n/// Scalar is used to conform all the numbers that can be represented in a FlatBuffer. It's used to write/read from the buffer.\npublic protocol Scalar: Equatable {\n  associatedtype NumericValue\n  var convertedEndian: NumericValue { get }\n}\n\nextension Scalar where Self: FixedWidthInteger {\n  /// Converts the value from BigEndian to LittleEndian\n  ///\n  /// Converts values to little endian on machines that work with BigEndian, however this is NOT TESTED yet.\n  public var convertedEndian: NumericValue {\n    self as! Self.NumericValue\n  }\n}\n\nextension Double: Scalar {\n  public typealias NumericValue = UInt64\n\n  public var convertedEndian: UInt64 {\n    bitPattern.littleEndian\n  }\n}\n\nextension Float32: Scalar {\n  public typealias NumericValue = UInt32\n\n  public var convertedEndian: UInt32 {\n    bitPattern.littleEndian\n  }\n}\n\nextension Bool: Scalar {\n  public var convertedEndian: UInt8 {\n    self == true ? 1 : 0\n  }\n\n  public typealias NumericValue = UInt8\n}\n\nextension Int: Scalar {\n  public typealias NumericValue = Int\n}\n\nextension Int8: Scalar {\n  public typealias NumericValue = Int8\n}\n\nextension Int16: Scalar {\n  public typealias NumericValue = Int16\n}\n\nextension Int32: Scalar {\n  public typealias NumericValue = Int32\n}\n\nextension Int64: Scalar {\n  public typealias NumericValue = Int64\n}\n\nextension UInt: Scalar {\n  public typealias NumericValue = UInt\n}\n\nextension UInt8: Scalar {\n  public typealias NumericValue = UInt8\n}\n\nextension UInt16: Scalar {\n  public typealias NumericValue = UInt16\n}\n\nextension UInt32: Scalar {\n  public typealias NumericValue = UInt32\n}\n\nextension UInt64: Scalar {\n  public typealias NumericValue = UInt64\n}\n"
  },
  {
    "path": "swift/Sources/Common/padding.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\n/// Gets the padding for the current element\n/// - Parameters:\n///   - bufSize: Current size of the buffer + the offset of the object to be written\n///   - elementSize: Element size\n@inline(__always)\npublic func padding(\n  bufSize: UInt,\n  elementSize: UInt) -> UInt\n{\n  ((~bufSize) &+ 1) & (elementSize &- 1)\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/ByteBuffer.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\n/// `ByteBuffer` is the interface that stores the data for a `Flatbuffers` object\n/// it allows users to write and read data directly from memory thus the use of its\n/// functions should be used\n@frozen\npublic struct ByteBuffer {\n\n  /// Storage is a container that would hold the memory pointer to solve the issue of\n  /// deallocating the memory that was held by (memory: UnsafeMutableRawPointer)\n  @usableFromInline\n  final class Storage {\n    @usableFromInline\n    enum Blob {\n      #if !os(WASI)\n      case data(Data)\n      case bytes(ContiguousBytes)\n      #endif\n\n      case byteBuffer(_InternalByteBuffer)\n      case array([UInt8])\n      case pointer(UnsafeMutableRawPointer)\n    }\n\n    /// This storage doesn't own the memory, therefore, we won't deallocate on deinit.\n    private let isOwned: Bool\n    /// Capacity of UInt8 the buffer can hold\n    private let capacity: Int\n    /// Retained blob of data that requires the storage to retain a pointer to.\n    @usableFromInline\n    var retainedBlob: Blob\n\n    @usableFromInline\n    init(count: Int) {\n      let memory = UnsafeMutableRawPointer.allocate(\n        byteCount: count,\n        alignment: MemoryLayout<UInt8>.alignment)\n      capacity = count\n      retainedBlob = .pointer(memory)\n      isOwned = true\n    }\n\n    @usableFromInline\n    init(blob: Blob, capacity count: Int) {\n      capacity = count\n      retainedBlob = blob\n      isOwned = false\n    }\n\n    deinit {\n      guard isOwned else { return }\n      switch retainedBlob {\n      case .pointer(let unsafeMutableRawPointer):\n        unsafeMutableRawPointer.deallocate()\n      default: break\n      }\n    }\n\n    @usableFromInline\n    func copy(from ptr: UnsafeRawPointer, count: Int) {\n      assert(\n        isOwned,\n        \"copy should NOT be called on a buffer that is built by assumingMemoryBound\")\n      withUnsafeRawPointer {\n        $0.copyMemory(from: ptr, byteCount: count)\n      }\n    }\n\n    @usableFromInline\n    func initialize(for size: Int) {\n      assert(\n        isOwned,\n        \"initalize should NOT be called on a buffer that is built by assumingMemoryBound\")\n      withUnsafeRawPointer {\n        memset($0, 0, size)\n      }\n    }\n\n    @discardableResult\n    @inline(__always)\n    func withUnsafeBytes<T>(\n      _ body: (UnsafeRawBufferPointer) throws\n        -> T) rethrows -> T\n    {\n      switch retainedBlob {\n      case .byteBuffer(let byteBuffer):\n        return try byteBuffer.withUnsafeBytes(body)\n      #if !os(WASI)\n      case .data(let data):\n        return try data.withUnsafeBytes(body)\n      case .bytes(let contiguousBytes):\n        return try contiguousBytes.withUnsafeBytes(body)\n      #endif\n      case .array(let array):\n        return try array.withUnsafeBytes(body)\n      case .pointer(let ptr):\n        return try body(UnsafeRawBufferPointer(start: ptr, count: capacity))\n      }\n    }\n\n    @discardableResult\n    @inline(__always)\n    func withUnsafeRawPointer<T>(\n      _ body: (UnsafeMutableRawPointer) throws\n        -> T) rethrows -> T\n    {\n      switch retainedBlob {\n      case .byteBuffer(let byteBuffer):\n        return try byteBuffer.withUnsafeRawPointer(body)\n      #if !os(WASI)\n      case .data(let data):\n        return\n          try data\n            .withUnsafeBytes {\n              try body(UnsafeMutableRawPointer(mutating: $0.baseAddress!))\n            }\n      case .bytes(let contiguousBytes):\n        return\n          try contiguousBytes\n            .withUnsafeBytes {\n              try body(UnsafeMutableRawPointer(mutating: $0.baseAddress!))\n            }\n      #endif\n      case .array(let array):\n        return\n          try array\n            .withUnsafeBytes {\n              try body(UnsafeMutableRawPointer(mutating: $0.baseAddress!))\n            }\n      case .pointer(let ptr):\n        return try body(ptr)\n      }\n    }\n\n    @discardableResult\n    @inline(__always)\n    func readWithUnsafeRawPointer<T>(\n      position: Int,\n      _ body: (UnsafeRawPointer) throws -> T) rethrows -> T\n    {\n      switch retainedBlob {\n      case .byteBuffer(let byteBuffer):\n        return try byteBuffer.readWithUnsafeRawPointer(position: position, body)\n      #if !os(WASI)\n      case .data(let data):\n        return try data.withUnsafeBytes {\n          try body($0.baseAddress!.advanced(by: position))\n        }\n      case .bytes(let contiguousBytes):\n        return try contiguousBytes.withUnsafeBytes {\n          try body($0.baseAddress!.advanced(by: position))\n        }\n      #endif\n      case .array(let array):\n        return try array.withUnsafeBytes {\n          try body($0.baseAddress!.advanced(by: position))\n        }\n      case .pointer(let ptr):\n        return try body(ptr.advanced(by: position))\n      }\n    }\n  }\n\n  @usableFromInline var _storage: Storage\n\n  /// The size of the elements written to the buffer + their paddings\n  private var _readerIndex: Int = 0\n  /// Reader is the position of the current Writer Index (capacity - size)\n  public var reader: Int { capacity &- _readerIndex }\n  /// Current size of the buffer\n  public var size: UOffset { UOffset(_readerIndex) }\n  /// Current capacity for the buffer\n  public let capacity: Int\n\n  /// Constructor that creates a Flatbuffer object from an InternalByteBuffer\n  /// - Parameter\n  ///   - bytes: Array of UInt8\n  @inline(__always)\n  init(byteBuffer: _InternalByteBuffer) {\n    _storage = Storage(\n      blob: .byteBuffer(byteBuffer),\n      capacity: byteBuffer.capacity)\n    _readerIndex = Int(byteBuffer.size)\n    capacity = byteBuffer.capacity\n  }\n\n  /// Constructor that creates a Flatbuffer from unsafe memory region by copying\n  /// the underlying data to a new pointer\n  ///\n  /// - Parameters:\n  ///   - copyingMemoryBound: The unsafe memory region\n  ///   - capacity: The size of the given memory region\n  @inline(__always)\n  public init(\n    copyingMemoryBound memory: UnsafeRawPointer,\n    capacity: Int)\n  {\n    _storage = Storage(count: capacity)\n    _storage.copy(from: memory, count: capacity)\n    _readerIndex = capacity\n    self.capacity = capacity\n  }\n\n  /// Constructor that creates a Flatbuffer object from a UInt8\n  /// - Parameter\n  ///   - bytes: Array of UInt8\n  @inline(__always)\n  public init(bytes: [UInt8]) {\n    _storage = Storage(blob: .array(bytes), capacity: bytes.count)\n    _readerIndex = bytes.count\n    capacity = bytes.count\n  }\n\n  #if !os(WASI)\n  /// Constructor that creates a Flatbuffer from the Swift Data type object\n  /// - Parameter\n  ///   - data: Swift data Object\n  @inline(__always)\n  public init(data: Data) {\n    _storage = Storage(blob: .data(data), capacity: data.count)\n    _readerIndex = data.count\n    capacity = data.count\n  }\n\n  /// Constructor that creates a Flatbuffer object from a ContiguousBytes\n  /// - Parameters:\n  ///   - contiguousBytes: Binary stripe to use as the buffer\n  ///   - count: amount of readable bytes\n  @inline(__always)\n  public init<Bytes: ContiguousBytes>(\n    contiguousBytes: Bytes,\n    count: Int)\n  {\n    _storage = Storage(blob: .bytes(contiguousBytes), capacity: count)\n    _readerIndex = count\n    capacity = count\n  }\n  #endif\n\n  /// Constructor that creates a Flatbuffer from unsafe memory region without copying\n  /// **NOTE** Needs a call to `memory.deallocate()` later on to free the memory\n  ///\n  /// - Parameters:\n  ///   - assumingMemoryBound: The unsafe memory region\n  ///   - capacity: The size of the given memory region\n  @inline(__always)\n  public init(\n    assumingMemoryBound memory: UnsafeMutableRawPointer,\n    capacity: Int)\n  {\n    _storage = Storage(\n      blob: .pointer(memory),\n      capacity: capacity)\n    _readerIndex = capacity\n    self.capacity = capacity\n  }\n\n  /// Creates a copy of the existing flatbuffer, by copying it to a different memory.\n  /// - Parameters:\n  ///   - memory: Current memory of the buffer\n  ///   - count: count of bytes\n  ///   - removeBytes: Removes a number of bytes from the current size\n  @inline(__always)\n  init(\n    blob: Storage.Blob,\n    count: Int,\n    removing removeBytes: Int)\n  {\n    _storage = Storage(blob: blob, capacity: count)\n    _readerIndex = removeBytes\n    capacity = count\n  }\n\n  /// Write stores an object into the buffer directly or indirectly.\n  ///\n  /// Direct: ignores the capacity of buffer which would mean we are referring to the direct point in memory\n  /// indirect: takes into respect the current capacity of the buffer (capacity - index), writing to the buffer from the end\n  /// - Parameters:\n  ///   - value: Value that needs to be written to the buffer\n  ///   - index: index to write to\n  ///   - direct: Should take into consideration the capacity of the buffer\n  @inline(__always)\n  func write<T>(value: T, index: Int, direct: Bool = false) {\n    var index = index\n    if !direct {\n      index = capacity &- index\n    }\n    assert(index < capacity, \"Write index is out of writing bound\")\n    assert(index >= 0, \"Writer index should be above zero\")\n    _ = withUnsafePointer(to: value) { ptr in\n      _storage.withUnsafeRawPointer {\n        memcpy(\n          $0.advanced(by: index),\n          ptr,\n          MemoryLayout<T>.size)\n      }\n    }\n  }\n\n  /// Reads an object from the buffer\n  /// - Parameters:\n  ///   - def: Type of the object\n  ///   - position: the index of the object in the buffer\n  @inline(__always)\n  public func read<T>(def: T.Type, position: Int) -> T {\n    _storage.readWithUnsafeRawPointer(position: position) {\n      $0.bindMemory(to: T.self, capacity: 1)\n        .pointee\n    }\n  }\n\n  /// Reads a slice from the memory assuming a type of T\n  /// - Parameters:\n  ///   - index: index of the object to be read from the buffer\n  ///   - count: count of bytes in memory\n  @inline(__always)\n  public func readSlice<T>(\n    index: Int,\n    count: Int) -> [T]\n  {\n    assert(\n      index + count <= capacity,\n      \"Reading out of bounds is illegal\")\n\n    return _storage.readWithUnsafeRawPointer(position: index) {\n      let buf = UnsafeBufferPointer(\n        start: $0.bindMemory(to: T.self, capacity: count),\n        count: count)\n      return Array(buf)\n    }\n  }\n\n  /// Provides a pointer towards the underlying primitive types\n  /// - Parameters:\n  ///   - index: index of the object to be read from the buffer\n  ///   - count: count of bytes in memory\n  @discardableResult\n  @inline(__always)\n  public func withUnsafePointerToSlice<T>(\n    index: Int,\n    count: Int,\n    body: (UnsafeRawBufferPointer) throws -> T) rethrows -> T\n  {\n    assert(\n      index + count <= capacity,\n      \"Reading out of bounds is illegal\")\n    return try _storage.readWithUnsafeRawPointer(position: index) {\n      try body(UnsafeRawBufferPointer(start: $0, count: count))\n    }\n  }\n\n  #if !os(WASI)\n  /// Reads a string from the buffer and encodes it to a swift string\n  /// - Parameters:\n  ///   - index: index of the string in the buffer\n  ///   - count: length of the string\n  ///   - type: Encoding of the string\n  @inline(__always)\n  public func readString(\n    at index: Int,\n    count: Int,\n    type: String.Encoding = .utf8) -> String?\n  {\n    assert(\n      index + count <= capacity,\n      \"Reading out of bounds is illegal\")\n    return _storage.readWithUnsafeRawPointer(position: index) {\n      let buf = UnsafeBufferPointer(\n        start: $0.bindMemory(to: UInt8.self, capacity: count),\n        count: count)\n      return String(\n        bytes: buf,\n        encoding: type)\n    }\n  }\n  #else\n  /// Reads a string from the buffer and encodes it to a swift string\n  /// - Parameters:\n  ///   - index: index of the string in the buffer\n  ///   - count: length of the string\n  @inline(__always)\n  public func readString(\n    at index: Int,\n    count: Int) -> String?\n  {\n    assert(\n      index + count <= capacity,\n      \"Reading out of bounds is illegal\")\n    return _storage.readWithUnsafeRawPointer(position: index) {\n      String(cString: $0.bindMemory(to: UInt8.self, capacity: count))\n    }\n  }\n  #endif\n\n  /// Creates a new Flatbuffer object that's duplicated from the current one\n  /// - Parameter removeBytes: the amount of bytes to remove from the current Size\n  @inline(__always)\n  public func duplicate(removing removeBytes: Int = 0) -> ByteBuffer {\n    assert(removeBytes > 0, \"Can NOT remove negative bytes\")\n    assert(\n      removeBytes < capacity,\n      \"Can NOT remove more bytes than the ones allocated\")\n    return ByteBuffer(\n      blob: _storage.retainedBlob,\n      count: capacity,\n      removing: _readerIndex &- removeBytes)\n  }\n\n  /// SkipPrefix Skips the first 4 bytes in case one of the following\n  /// functions are called `getPrefixedSizeCheckedRoot` & `getPrefixedSizeRoot`\n  /// which allows us to skip the first 4 bytes instead of recreating the buffer\n  @discardableResult\n  @usableFromInline\n  @inline(__always)\n  mutating func skipPrefix() -> Int32 {\n    _readerIndex = _readerIndex &- MemoryLayout<Int32>.size\n    return read(def: Int32.self, position: 0)\n  }\n\n  @discardableResult\n  @inline(__always)\n  public func withUnsafeBytes<T>(\n    body: (UnsafeRawBufferPointer) throws\n      -> T) rethrows -> T\n  {\n    try _storage.withUnsafeBytes(body)\n  }\n\n  @discardableResult\n  @inline(__always)\n  func withUnsafeMutableRawPointer<T>(\n    body: (UnsafeMutableRawPointer) throws\n      -> T) rethrows -> T\n  {\n    try _storage.withUnsafeRawPointer(body)\n  }\n\n  @discardableResult\n  @inline(__always)\n  func readWithUnsafeRawPointer<T>(\n    position: Int,\n    _ body: (UnsafeRawPointer) throws -> T) rethrows -> T\n  {\n    try _storage.readWithUnsafeRawPointer(position: position, body)\n  }\n}\n\nextension ByteBuffer: CustomDebugStringConvertible {\n\n  public var debugDescription: String {\n    \"\"\"\n    buffer located at: \\(_storage.retainedBlob), \n    with capacity of \\(capacity),\n    { writtenSize: \\(_readerIndex), readerSize: \\(reader), \n    size: \\(size) }\n    \"\"\"\n  }\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Constants.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\n#if canImport(Common)\nimport Common\n#endif\n\n/// Type aliases\npublic typealias Byte = UInt8\npublic typealias UOffset = UInt32\npublic typealias SOffset = Int32\npublic typealias VOffset = UInt16\n/// Maximum size for a buffer\npublic let FlatBufferMaxSize =\n  UInt32\n    .max << ((MemoryLayout<SOffset>.size * 8 - 1) - 1)\n\n/// Protocol that All Scalars should conform to\n///\n/// Scalar is used to conform all the numbers that can be represented in a FlatBuffer. It's used to write/read from the buffer.\n\nextension Scalar where Self: FixedWidthInteger {}\n\nextension Double: Verifiable, FlatbuffersVectorInitializable {}\n\nextension Float32: Verifiable, FlatbuffersVectorInitializable {}\n\nextension Bool: Verifiable, FlatbuffersVectorInitializable {}\n\nextension Int: Verifiable, FlatbuffersVectorInitializable {}\n\nextension Int8: Verifiable, FlatbuffersVectorInitializable {}\n\nextension Int16: Verifiable, FlatbuffersVectorInitializable {}\n\nextension Int32: Verifiable, FlatbuffersVectorInitializable {}\n\nextension Int64: Verifiable, FlatbuffersVectorInitializable {}\n\nextension UInt8: Verifiable, FlatbuffersVectorInitializable {}\n\nextension UInt16: Verifiable, FlatbuffersVectorInitializable {}\n\nextension UInt32: Verifiable, FlatbuffersVectorInitializable {}\n\nextension UInt64: Verifiable, FlatbuffersVectorInitializable {}\n\npublic func FlatBuffersVersion_25_12_19() {}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Documentation.docc/Documentation.md",
    "content": "# ``FlatBuffers``\n\nFlatBuffers: Memory Efficient Serialization Library\n\n## Overview\n\n- Access to serialized data without parsing/unpacking - What sets FlatBuffers apart is that it represents hierarchical data in a flat binary buffer in such a way that it can still be accessed directly without parsing/unpacking, while also still supporting data structure evolution (forwards/backwards compatibility).\n- Memory efficiency and speed - The only memory needed to access your data is that of the buffer. It requires 0 additional allocations (in C++, other languages may vary). FlatBuffers is also very suitable for use with mmap (or streaming), requiring only part of the buffer to be in memory. Access is close to the speed of raw struct access with only one extra indirection (a kind of vtable) to allow for format evolution and optional fields. It is aimed at projects where spending time and space (many memory allocations) to be able to access or construct serialized data is undesirable, such as in games or any other performance sensitive applications. See the benchmarks for details.\n- Flexible - Optional fields means not only do you get great forwards and backwards compatibility (increasingly important for long-lived games: don't have to update all data with each new version!). It also means you have a lot of choice in what data you write and what data you don't, and how you design data structures.\n- Tiny code footprint - Small amounts of generated code, and just a single small header as the minimum dependency, which is very easy to integrate. Again, see the benchmark section for details.\n- Strongly typed - Errors happen at compile time rather than manually having to write repetitive and error prone run-time checks. Useful code can be generated for you.\n\n## Topics\n\n### Read this first\n\n- <doc:Tutorial_Table_of_Contents>\n\n### Where to start\n\n- ``FlatBufferBuilder``\n- ``ByteBuffer``\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Documentation.docc/Resources/code/fbs/monster_step_1.fbs",
    "content": "\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Documentation.docc/Resources/code/fbs/monster_step_2.fbs",
    "content": "enum Color:byte { red, green, blue }\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Documentation.docc/Resources/code/fbs/monster_step_3.fbs",
    "content": "enum Color:byte { red, green, blue }\n\nstruct Vec3 {\n  x:float;\n  y:float;\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Documentation.docc/Resources/code/fbs/monster_step_4.fbs",
    "content": "enum Color:byte { red, green, blue }\n\nstruct Vec3 {\n  x:float;\n  y:float;\n}\n\ntable Monster {\n  pos:Vec3;\n  color:Color = Blue;\n}\n\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Documentation.docc/Resources/code/fbs/monster_step_5.fbs",
    "content": "enum Color:byte { red, green, blue }\n\nstruct Vec3 {\n  x:float;\n  y:float;\n}\n\ntable Monster {\n  pos:Vec3;\n  color:Color = Blue;\n\n  mana:short = 150;\n  hp:short = 100;\n  name:string;\n  equipped:Equipment;\n  weapons:[Weapon];\n  path:[Vec3];\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Documentation.docc/Resources/code/fbs/monster_step_6.fbs",
    "content": "enum Color:byte { red, green, blue }\n\nunion Equipment { Weapon } // Optionally add more tables.\n\nstruct Vec3 {\n  x:float;\n  y:float;\n}\n\ntable Monster {\n  pos:Vec3;\n  color:Color = Blue;\n\n  mana:short = 150;\n  hp:short = 100;\n  name:string;\n  equipped:Equipment;\n  weapons:[Weapon];\n  path:[Vec3];\n}\n\ntable Weapon {\n  name:string;\n  damage:short;\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Documentation.docc/Resources/code/fbs/monster_step_7.fbs",
    "content": "enum Color:byte { red, green, blue }\n\nunion Equipment { Weapon } // Optionally add more tables.\n\nstruct Vec3 {\n  x:float;\n  y:float;\n}\n\ntable Monster {\n  pos:Vec3;\n  color:Color = Blue;\n\n  mana:short = 150;\n  hp:short = 100;\n  name:string;\n  equipped:Equipment;\n  weapons:[Weapon];\n  path:[Vec3];\n}\n\ntable Weapon {\n  name:string;\n  damage:short;\n}\n\nroot_type Monster; // flatc --swift monster.fbs\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_1.swift",
    "content": "import Foundation\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_10.swift",
    "content": "import FlatBuffers\nimport Foundation\n\nfunc run() {\n  // create a `FlatBufferBuilder`, which will be used to serialize objects\n  let builder = FlatBufferBuilder(initialSize: 1024)\n\n  let weapon1Name = builder.create(string: \"Sword\")\n  let weapon2Name = builder.create(string: \"Axe\")\n\n  // start creating the weapon by calling startWeapon\n  let weapon1Start = Weapon.startWeapon(&builder)\n  Weapon.add(name: weapon1Name, &builder)\n  Weapon.add(damage: 3, &builder)\n  // end the object by passing the start point for the weapon 1\n  let sword = Weapon.endWeapon(&builder, start: weapon1Start)\n\n  let weapon2Start = Weapon.startWeapon(&builder)\n  Weapon.add(name: weapon2Name, &builder)\n  Weapon.add(damage: 5, &builder)\n  let axe = Weapon.endWeapon(&builder, start: weapon2Start)\n\n  // Create a FlatBuffer `vector` that contains offsets to the sword and axe\n  // we created above.\n  let weaponsOffset = builder.createVector(ofOffsets: [sword, axe])\n\n  // Name of the Monster.\n  let name = builder.create(string: \"Orc\")\n\n  let pathOffset = fbb.createVector(ofStructs: [\n    Vec3(x: 0, y: 0),\n    Vec3(x: 5, y: 5),\n  ])\n\n  // startVector(len, elementSize: MemoryLayout<Offset>.size)\n  // for o in offsets.reversed() {\n  //   push(element: o)\n  // }\n  // endVector(len: len)\n\n  let orc = Monster.createMonster(\n    &builder,\n    pos: Vec3(x: 1, y: 2),\n    hp: 300,\n    nameOffset: name,\n    color: .red,\n    weaponsVectorOffset: weaponsOffset,\n    equippedType: .weapon,\n    equippedOffset: axe,\n    pathOffset: pathOffset)\n\n  // let start = Monster.startMonster(&builder)\n  // Monster.add(pos: Vec3(x: 1, y: 2), &builder)\n  // Monster.add(hp: 300, &builder)\n  // Monster.add(name: name, &builder)\n  // Monster.add(color: .red, &builder)\n  // Monster.addVectorOf(weapons: weaponsOffset, &builder)\n  // Monster.add(equippedType: .weapon, &builder)\n  // Monster.addVectorOf(paths: weaponsOffset, &builder)\n  // Monster.add(equipped: axe, &builder)\n  // var orc = Monster.endMonster(&builder, start: start)\n\n  // Call `finish(offset:)` to instruct the builder that this monster is complete.\n  builder.finish(offset: orc)\n  // This must be called after `finish()`.\n  // `sizedByteArray` returns the finished buf of type [UInt8].\n  let buf = builder.sizedByteArray\n\n  // or you can use to get an object of type Data\n  let bufData = ByteBuffer(data: builder.sizedBuffer)\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_11.swift",
    "content": "import FlatBuffers\nimport Foundation\n\nfunc run() {\n  // create a ByteBuffer(:) from an [UInt8] or Data()\n  let buf = []  // Get your data\n  var byteBuffer = ByteBuffer(bytes: buf)\n  // Get an accessor to the root object inside the buffer.\n  let monster: Monster = try! getCheckedRoot(byteBuffer: &byteBuffer)\n  // let monster: Monster = getRoot(byteBuffer: &byteBuffer)\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_12.swift",
    "content": "import FlatBuffers\nimport Foundation\n\nfunc run() {\n  // create a ByteBuffer(:) from an [UInt8] or Data()\n  let buf = []  // Get your data\n  var byteBuffer = ByteBuffer(bytes: buf)\n  // Get an accessor to the root object inside the buffer.\n  let monster: Monster = try! getCheckedRoot(byteBuffer: &byteBuffer)\n  // let monster: Monster = getRoot(byteBuffer: &byteBuffer)\n\n  let hp = monster.hp\n  let mana = monster.mana\n  let name = monster.name  // returns an optional string\n\n  let pos = monster.pos\n  let x = pos.x\n  let y = pos.y\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_13.swift",
    "content": "import FlatBuffers\nimport Foundation\n\nfunc run() {\n  // create a ByteBuffer(:) from an [UInt8] or Data()\n  let buf = []  // Get your data\n  var byteBuffer = ByteBuffer(bytes: buf)\n  // Get an accessor to the root object inside the buffer.\n  let monster: Monster = try! getCheckedRoot(byteBuffer: &byteBuffer)\n  // let monster: Monster = getRoot(byteBuffer: &byteBuffer)\n\n  let hp = monster.hp\n  let mana = monster.mana\n  let name = monster.name  // returns an optional string\n\n  let pos = monster.pos\n  let x = pos.x\n  let y = pos.y\n\n  // Get and check if the monster has an equipped item\n  if monster.equippedType == .weapon {\n    let _weapon = monster.equipped(type: Weapon.self)\n    let name = _weapon.name  // should return \"Axe\"\n    let dmg = _weapon.damage  // should return 5\n  }\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_2.swift",
    "content": "import FlatBuffers\nimport Foundation\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_3.swift",
    "content": "import FlatBuffers\nimport Foundation\n\nfunc run() {\n  // create a `FlatBufferBuilder`, which will be used to serialize objects\n  let builder = FlatBufferBuilder(initialSize: 1024)\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_4.swift",
    "content": "import FlatBuffers\nimport Foundation\n\nfunc run() {\n  // create a `FlatBufferBuilder`, which will be used to serialize objects\n  let builder = FlatBufferBuilder(initialSize: 1024)\n\n  let weapon1Name = builder.create(string: \"Sword\")\n  let weapon2Name = builder.create(string: \"Axe\")\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_5.swift",
    "content": "import FlatBuffers\nimport Foundation\n\nfunc run() {\n  // create a `FlatBufferBuilder`, which will be used to serialize objects\n  let builder = FlatBufferBuilder(initialSize: 1024)\n\n  let weapon1Name = builder.create(string: \"Sword\")\n  let weapon2Name = builder.create(string: \"Axe\")\n\n  // start creating the weapon by calling startWeapon\n  let weapon1Start = Weapon.startWeapon(&builder)\n  Weapon.add(name: weapon1Name, &builder)\n  Weapon.add(damage: 3, &builder)\n  // end the object by passing the start point for the weapon 1\n  let sword = Weapon.endWeapon(&builder, start: weapon1Start)\n\n  let weapon2Start = Weapon.startWeapon(&builder)\n  Weapon.add(name: weapon2Name, &builder)\n  Weapon.add(damage: 5, &builder)\n  let axe = Weapon.endWeapon(&builder, start: weapon2Start)\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_6.swift",
    "content": "import FlatBuffers\nimport Foundation\n\nfunc run() {\n  // create a `FlatBufferBuilder`, which will be used to serialize objects\n  let builder = FlatBufferBuilder(initialSize: 1024)\n\n  let weapon1Name = builder.create(string: \"Sword\")\n  let weapon2Name = builder.create(string: \"Axe\")\n\n  // start creating the weapon by calling startWeapon\n  let weapon1Start = Weapon.startWeapon(&builder)\n  Weapon.add(name: weapon1Name, &builder)\n  Weapon.add(damage: 3, &builder)\n  // end the object by passing the start point for the weapon 1\n  let sword = Weapon.endWeapon(&builder, start: weapon1Start)\n\n  let weapon2Start = Weapon.startWeapon(&builder)\n  Weapon.add(name: weapon2Name, &builder)\n  Weapon.add(damage: 5, &builder)\n  let axe = Weapon.endWeapon(&builder, start: weapon2Start)\n\n  // Create a FlatBuffer `vector` that contains offsets to the sword and axe\n  // we created above.\n  let weaponsOffset = builder.createVector(ofOffsets: [sword, axe])\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_7.swift",
    "content": "import FlatBuffers\nimport Foundation\n\nfunc run() {\n  // create a `FlatBufferBuilder`, which will be used to serialize objects\n  let builder = FlatBufferBuilder(initialSize: 1024)\n\n  let weapon1Name = builder.create(string: \"Sword\")\n  let weapon2Name = builder.create(string: \"Axe\")\n\n  // start creating the weapon by calling startWeapon\n  let weapon1Start = Weapon.startWeapon(&builder)\n  Weapon.add(name: weapon1Name, &builder)\n  Weapon.add(damage: 3, &builder)\n  // end the object by passing the start point for the weapon 1\n  let sword = Weapon.endWeapon(&builder, start: weapon1Start)\n\n  let weapon2Start = Weapon.startWeapon(&builder)\n  Weapon.add(name: weapon2Name, &builder)\n  Weapon.add(damage: 5, &builder)\n  let axe = Weapon.endWeapon(&builder, start: weapon2Start)\n\n  // Create a FlatBuffer `vector` that contains offsets to the sword and axe\n  // we created above.\n  let weaponsOffset = builder.createVector(ofOffsets: [sword, axe])\n\n  // Name of the Monster.\n  let name = builder.create(string: \"Orc\")\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_8.swift",
    "content": "import FlatBuffers\nimport Foundation\n\nfunc run() {\n  // create a `FlatBufferBuilder`, which will be used to serialize objects\n  let builder = FlatBufferBuilder(initialSize: 1024)\n\n  let weapon1Name = builder.create(string: \"Sword\")\n  let weapon2Name = builder.create(string: \"Axe\")\n\n  // start creating the weapon by calling startWeapon\n  let weapon1Start = Weapon.startWeapon(&builder)\n  Weapon.add(name: weapon1Name, &builder)\n  Weapon.add(damage: 3, &builder)\n  // end the object by passing the start point for the weapon 1\n  let sword = Weapon.endWeapon(&builder, start: weapon1Start)\n\n  let weapon2Start = Weapon.startWeapon(&builder)\n  Weapon.add(name: weapon2Name, &builder)\n  Weapon.add(damage: 5, &builder)\n  let axe = Weapon.endWeapon(&builder, start: weapon2Start)\n\n  // Create a FlatBuffer `vector` that contains offsets to the sword and axe\n  // we created above.\n  let weaponsOffset = builder.createVector(ofOffsets: [sword, axe])\n\n  // Name of the Monster.\n  let name = builder.create(string: \"Orc\")\n\n  let pathOffset = fbb.createVector(ofStructs: [\n    Vec3(x: 0, y: 0),\n    Vec3(x: 5, y: 5),\n  ])\n\n  // startVector(len, elementSize: MemoryLayout<Offset>.size)\n  // for o in offsets.reversed() {\n  //   push(element: o)\n  // }\n  // endVector(len: len)\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_9.swift",
    "content": "import FlatBuffers\nimport Foundation\n\nfunc run() {\n  // create a `FlatBufferBuilder`, which will be used to serialize objects\n  let builder = FlatBufferBuilder(initialSize: 1024)\n\n  let weapon1Name = builder.create(string: \"Sword\")\n  let weapon2Name = builder.create(string: \"Axe\")\n\n  // start creating the weapon by calling startWeapon\n  let weapon1Start = Weapon.startWeapon(&builder)\n  Weapon.add(name: weapon1Name, &builder)\n  Weapon.add(damage: 3, &builder)\n  // end the object by passing the start point for the weapon 1\n  let sword = Weapon.endWeapon(&builder, start: weapon1Start)\n\n  let weapon2Start = Weapon.startWeapon(&builder)\n  Weapon.add(name: weapon2Name, &builder)\n  Weapon.add(damage: 5, &builder)\n  let axe = Weapon.endWeapon(&builder, start: weapon2Start)\n\n  // Create a FlatBuffer `vector` that contains offsets to the sword and axe\n  // we created above.\n  let weaponsOffset = builder.createVector(ofOffsets: [sword, axe])\n\n  // Name of the Monster.\n  let name = builder.create(string: \"Orc\")\n\n  let pathOffset = fbb.createVector(ofStructs: [\n    Vec3(x: 0, y: 0),\n    Vec3(x: 5, y: 5),\n  ])\n\n  // startVector(len, elementSize: MemoryLayout<Offset>.size)\n  // for o in offsets.reversed() {\n  //   push(element: o)\n  // }\n  // endVector(len: len)\n\n  let orc = Monster.createMonster(\n    &builder,\n    pos: Vec3(x: 1, y: 2),\n    hp: 300,\n    nameOffset: name,\n    color: .red,\n    weaponsVectorOffset: weaponsOffset,\n    equippedType: .weapon,\n    equippedOffset: axe,\n    pathOffset: pathOffset)\n\n  // let start = Monster.startMonster(&builder)\n  // Monster.add(pos: Vec3(x: 1, y: 2), &builder)\n  // Monster.add(hp: 300, &builder)\n  // Monster.add(name: name, &builder)\n  // Monster.add(color: .red, &builder)\n  // Monster.addVectorOf(weapons: weaponsOffset, &builder)\n  // Monster.add(equippedType: .weapon, &builder)\n  // Monster.addVectorOf(paths: weaponsOffset, &builder)\n  // Monster.add(equipped: axe, &builder)\n  // var orc = Monster.endMonster(&builder, start: start)\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Documentation.docc/Tutorials/Tutorial_Table_of_Contents.tutorial",
    "content": "@Tutorials(name: \"Starting with FlatBuffers\") {\n    @Intro(title: \"Starting with FlatBuffers\") {\n      FlatBuffers is an efficient cross platform serialization library for C++,\n      C#, C, Go, Java, Kotlin, JavaScript, Lobster, Lua, TypeScript, PHP, Python, Rust and Swift.\n      It was originally created at Google for game development and other performance-critical applications.\n    }\n    @Chapter(name: \"Generating your code\") {\n        Start by generating your first FlatBuffers objects.\n        @Image(source: tutorial_cover_image_1.png, alt: \"A code structure for a base struct in flatbuffers\")\n        @TutorialReference(tutorial: \"doc:creating_flatbuffer_schema\")\n        @TutorialReference(tutorial: \"doc:create_your_first_buffer\")\n        @TutorialReference(tutorial: \"doc:reading_bytebuffer\")\n    }\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Documentation.docc/Tutorials/create_your_first_buffer.tutorial",
    "content": "@Tutorial(time: 5) {\n  @Intro(title: \"After having our code generated\") {\n    After generating the code from the previous section, we will know start creating our monster object.\n    We will create a monster object called orc.\n    }\n    \n    @Section(title: \"Building your first buffer\") {\n      @ContentAndMedia {}\n      @Steps {\n        @Step {\n          Starting with a new file, we will create our very first Flatbuffer.\n          @Code(name: \"ViewController.swift\", file: \"swift_code_1.swift\")\n        }\n        @Step {\n          First, we need to import ``FlatBuffers``\n          @Code(name: \"ViewController.swift\", file: \"swift_code_2.swift\")\n        }\n        @Step {\n          We need to create an instance of the `FlatBufferBuilder`, which will contain the buffer as it grows. \n          You can pass an initial size of the buffer (here 1024 bytes), which will grow automatically if needed.\n          @Code(name: \"ViewController.swift\", file: \"swift_code_3.swift\")\n        }\n        @Step {\n          After creating the builder, we can start serializing our data. Before we make our orc Monster, \n          let's create some Weapons: a Sword and an Axe. However we will start by naming our weapons as `Sword` and `Axe`\n          @Code(name: \"ViewController.swift\", file: \"swift_code_4.swift\")\n        }\n        @Step {\n          After naming the weapons, we will create two weapon objects with the damage that the weapon is going to deal. \n          That's done by calling the `start` Method on each table you will be creating, in this case its called `startWeapon` \n          and finished by calling `end`.\n          @Code(name: \"ViewController.swift\", file: \"swift_code_5.swift\")\n        }\n        @Step {\n          We will take our (Sword and Axe) serialized data and serialize their offsets as a vector of tables into our `ByteBuffer`. \n          So we can reference them later on from our Monster Object\n          @Code(name: \"ViewController.swift\", file: \"swift_code_6.swift\")\n        }\n        @Step {\n          We will add our Monster name as a string value just like we did with the weapons.\n          @Code(name: \"ViewController.swift\", file: \"swift_code_7.swift\")\n        }\n        \n        @Step {\n          We will create a path that our monster should be using while roaming in its den. To create a vector of paths we would us\n          `createVector(ofStructs: [])` which will take a Native `Swift` struct that has been padded to fit the `FlatBuffers` standards.\n          \n          There are usually two ways of creating vectors in `FlatBuffers` which you can see in commented out code. \n          And thus there are multiple convenience methods that will cover all the bases \n          when trying to create a vector so that you dont have to create it with `start` and `end`\n          @Code(name: \"ViewController.swift\", file: \"swift_code_8.swift\")\n        }\n        \n        @Step {\n          Now to serialize our data into our `Monster` object. Which again there are two ways of doing, by calling the `create` method or\n          by serializing the objects yourself. What we added to our Monster were the `Equipped Type` and the `Equipped` union itself, which\n          allows the Monster to have the `Axe` as his equipped weapon.\n          \n          Important: Unlike structs, you should not nest tables or other objects, \n          which is why we created all the `strings/vectors/tables` that this monster refers to before start.\n          If you try to create any of them between start and end, you will get an `assert`.\n          @Code(name: \"ViewController.swift\", file: \"swift_code_9.swift\")\n        }\n        \n        @Step {\n          Finally you can just finalize the buffer by calling `builder.finish` and get the Byte array from the buffer.\n          @Code(name: \"ViewController.swift\", file: \"swift_code_10.swift\")\n        }\n\n      }\n    }\n  }\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Documentation.docc/Tutorials/creating_flatbuffer_schema.tutorial",
    "content": "@Tutorial(time: 2) {\n  @Intro(title: \"Creating a schema\") {\n    You will need to have the FlatBuffer compiler to be installed on your device\n    }\n    \n    @Section(title: \"Creating a schema\") {\n      @ContentAndMedia {}\n      @Steps {\n        @Step {\n          Start by creating a new empty folder called `monster.fbs`. We want to create a Monster table, that contains\n          position, color, and basic information about the monster.\n          @Code(name: \"monster.fbs\", file: \"monster_step_1.fbs\")\n        }\n        @Step {\n          We will start by adding our Color object. We will be using an enumerate, to represent this object\n          @Code(name: \"monster.fbs\", file: \"monster_step_2.fbs\")\n        }\n        @Step {\n          We will add a position object and will use a struct to represent that type of data. Where we will need the monsters\n          x and y positions.\n          @Code(name: \"monster.fbs\", file: \"monster_step_3.fbs\")\n        }\n        @Step {\n          Then we will be creating our Monster object of type table. This will contain the current position of our\n          monster and its color\n          @Code(name: \"monster.fbs\", file: \"monster_step_4.fbs\")\n        }\n        @Step {\n          Our Monster is missing a name, mana, hp, name, equipped Weapon, weapons, and path. We will be adding these \n          fields to our table with a proper data type for each. Example; weapons, and path would be a vector of data.\n          @Code(name: \"monster.fbs\", file: \"monster_step_5.fbs\")\n        }\n        @Step {\n          Now we are missing two data types here, `Weapon` and `Equipment`. And since Equipment can be a weapon, we will be using\n          a `Union` enumerate that can contain all the equipment that you would want your monster to have. And the weapon can simply\n          have a name and amount of damage\n          @Code(name: \"monster.fbs\", file: \"monster_step_6.fbs\")\n        }\n        @Step {\n          And to finalize our monster table, we can add a root type of type Monster. \n          Then run the command `flatc --swift monster.fbs`\n          Note: Make sure to import the file to your xcode project.\n          @Code(name: \"monster.fbs\", file: \"monster_step_7.fbs\")\n        }\n      }\n    }\n  }\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Documentation.docc/Tutorials/reading_bytebuffer.tutorial",
    "content": "@Tutorial(time: 2) {\n  @Intro(title: \"Reading ByteBuffers\") {\n    After getting our ByteBuffer created, we can now read it.\n    }\n    \n    @Section(title: \"Reading your first buffer\") {\n      @ContentAndMedia {}\n      @Steps {\n        @Step {\n          After fetching the data from disk or network you need to access that data, and that can be done.\n          By simply calling `getCheckedRoot`, which checks if the data is valid before enabling you to read from a corrupt buffer.\n          however, if you are sure that the data is 100% correct you can simply call `getRoot`\n          @Code(name: \"ViewController.swift\", file: \"swift_code_11.swift\")\n        }\n        @Step {\n          Now since we have a Monster object, all the fields can be accessed by simply fetching the data. Note, Deprecated fields will not\n          show up\n          @Code(name: \"ViewController.swift\", file: \"swift_code_12.swift\")\n        }\n        @Step {\n          And you can access union types as easy as this\n          @Code(name: \"ViewController.swift\", file: \"swift_code_13.swift\")\n        }\n      }\n    }\n  }\n\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Enum.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\n#if canImport(Common)\nimport Common\n#endif\n\n/// Enum is a protocol that all flatbuffers enums should conform to\n/// Since it allows us to get the actual `ByteSize` and `Value` from\n/// a swift enum.\npublic protocol Enum {\n  /// associatedtype that the type of the enum should conform to\n  associatedtype T: Scalar & Verifiable\n  /// Size of the current associatedtype in the enum\n  static var byteSize: Int { get }\n  /// Provides a static min value in case we fail to decode\n  /// in vectors\n  static var min: Self { get }\n  /// The current value the enum hosts\n  var value: T { get }\n\n  init?(rawValue: T)\n}\n\nextension Enum where Self: Verifiable {\n\n  /// Verifies that the current value is which the bounds of the buffer, and if\n  /// the current `Value` is aligned properly\n  /// - Parameters:\n  ///   - verifier: Verifier that hosts the buffer\n  ///   - position: Current position within the buffer\n  ///   - type: The type of the object to be verified\n  /// - Throws: Errors coming from `inBuffer` function\n  public static func verify<T>(\n    _ verifier: inout Verifier,\n    at position: Int,\n    of type: T.Type) throws where T: Verifiable\n  {\n    try verifier.inBuffer(position: position, of: type.self)\n  }\n\n}\n\n/// UnionEnum is a Protocol that allows us to create Union type of enums\n/// and their value initializers. Since an `init` was required by\n/// the verifier\npublic protocol UnionEnum: Enum {\n  init?(value: T) throws\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/FlatBufferBuilder.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\n#if canImport(Common)\nimport Common\n#endif\n\n/// ``FlatBufferBuilder`` builds a `FlatBuffer` through manipulating its internal state.\n///\n/// This is done by creating a ``ByteBuffer`` that hosts the incoming data and\n/// has a hardcoded growth limit of `2GiB` which is set by the Flatbuffers standards.\n///\n/// ```swift\n/// var builder = FlatBufferBuilder()\n/// ```\n/// The builder should be always created as a variable, since it would be passed into the writers\n///\n@frozen\npublic struct FlatBufferBuilder {\n\n  /// Storage for the Vtables used in the buffer are stored in here, so they would be written later in EndTable\n  @usableFromInline internal var _vtableStorage = VTableStorage()\n  /// Flatbuffer data will be written into\n  @usableFromInline internal var _bb: _InternalByteBuffer\n\n  /// Reference Vtables that were already written to the buffer\n  private var _vtables: [UOffset] = []\n  /// A check if the buffer is being written into by a different table\n  private var isNested = false\n  /// Dictonary that stores a map of all the strings that were written to the buffer\n  private var stringOffsetMap: [String: Offset] = [:]\n  /// A check to see if finish(::) was ever called to retreive data object\n  private var finished = false\n  /// A check to see if the buffer should serialize Default values\n  private var serializeDefaults: Bool\n\n  /// Current alignment for the buffer\n  var _minAlignment: Int = 0 {\n    didSet {\n      _bb.alignment = _minAlignment\n    }\n  }\n\n  /// Gives a read access to the buffer's size\n  public var size: UOffset { _bb.size }\n  /// Current allocated capacity within the storage\n  @inline(__always)\n  public var capacity: Int { _bb.capacity }\n\n  #if !os(WASI)\n  /// Data representation of the buffer\n  ///\n  /// Should only be used after ``finish(offset:addPrefix:)`` is called\n  public var data: Data {\n    assert(finished, \"Data shouldn't be called before finish()\")\n    return _bb.withUnsafeSlicedBytes { ptr in\n      var data = Data()\n      data.append(\n        ptr.baseAddress!.bindMemory(\n          to: UInt8.self,\n          capacity: ptr.count),\n        count: ptr.count)\n      return data\n    }\n  }\n  #endif\n\n  /// Returns the underlying bytes in the ``ByteBuffer``\n  ///\n  /// Note: This should be used with caution.\n  public var fullSizedByteArray: [UInt8] {\n    _bb.withUnsafeBytes { ptr in\n      Array(ptr)\n    }\n  }\n\n  /// Returns the written bytes into the ``ByteBuffer``\n  ///\n  /// Should only be used after ``finish(offset:addPrefix:)`` is called\n  public var sizedByteArray: [UInt8] {\n    assert(finished, \"Data shouldn't be called before finish()\")\n    return _bb.withUnsafeSlicedBytes { ptr in\n      Array(ptr)\n    }\n  }\n\n  /// Returns the original ``ByteBuffer``\n  ///\n  /// Returns the current buffer that was just created\n  /// with the offsets, and data written to it.\n  public var buffer: ByteBuffer {\n    ByteBuffer(byteBuffer: _bb)\n  }\n\n  /// Returns a newly created sized ``ByteBuffer``\n  ///\n  /// returns a new buffer that is sized to the data written\n  /// to the main buffer\n  public var sizedBuffer: ByteBuffer {\n    assert(finished, \"Data shouldn't be called before finish()\")\n    return _bb.withUnsafeSlicedBytes { ptr in\n      ByteBuffer(\n        copyingMemoryBound: ptr.baseAddress!,\n        capacity: ptr.count)\n    }\n  }\n\n  // MARK: - Init\n\n  /// Initialize the buffer with a size\n  /// - Parameters:\n  ///   - initialSize: Initial size for the buffer\n  ///   - force: Allows default to be serialized into the buffer\n  ///\n  /// This initializes a new builder with an initialSize that would initialize\n  /// a new ``ByteBuffer``. ``FlatBufferBuilder`` by default doesnt serialize defaults\n  /// however the builder can be force by passing true for `serializeDefaults`\n  public init(\n    initialSize: Int32 = 1024,\n    serializeDefaults force: Bool = false)\n  {\n    assert(initialSize > 0, \"Size should be greater than zero!\")\n    guard isLitteEndian else {\n      fatalError(\n        \"Reading/Writing a buffer in big endian machine is not supported on swift\")\n    }\n    serializeDefaults = force\n    _bb = _InternalByteBuffer(initialSize: Int(initialSize))\n  }\n\n  /// Clears the builder and the buffer from the written data.\n  mutating public func clear(keepingCapacity: Bool = false) {\n    _minAlignment = 0\n    isNested = false\n    stringOffsetMap.removeAll(keepingCapacity: keepingCapacity)\n    _vtables.removeAll(keepingCapacity: keepingCapacity)\n    _vtableStorage.reset(keepingCapacity: keepingCapacity)\n    _bb.clear(keepingCapacity: keepingCapacity)\n  }\n\n  // MARK: - Create Tables\n\n  /// Checks if the required fields were serialized into the buffer\n  /// - Parameters:\n  ///   - table: offset for the table\n  ///   - fields: Array of all the important fields to be serialized\n  ///\n  /// *NOTE: Never call this function, this is only supposed to be called\n  /// by the generated code*\n  @inline(__always)\n  mutating public func require(table: Offset, fields: [Int32]) {\n    for index in stride(from: 0, to: fields.count, by: 1) {\n      let start = _bb.capacity &- Int(table.o)\n      let startTable = start &- Int(_bb.read(def: Int32.self, position: start))\n      let isOkay =\n        _bb.read(\n          def: VOffset.self,\n          position: startTable &+ Int(fields[index])) != 0\n      assert(isOkay, \"Flatbuffers requires the following field\")\n    }\n  }\n\n  /// Finished the buffer by adding the file id and then calling finish\n  /// - Parameters:\n  ///   - offset: Offset of the table\n  ///   - fileId: Takes the fileId\n  ///   - prefix: if false it wont add the size of the buffer\n  ///\n  /// ``finish(offset:fileId:addPrefix:)`` should be called at the end of creating\n  /// a table\n  /// ```swift\n  /// var root = SomeObject\n  ///   .createObject(&builder,\n  ///   name: nameOffset)\n  /// builder.finish(\n  ///   offset: root,\n  ///   fileId: \"ax1a\",\n  ///   addPrefix: true)\n  /// ```\n  /// File id would append a file id name at the end of the written bytes before,\n  /// finishing the buffer.\n  ///\n  /// Whereas, if `addPrefix` is true, the written bytes would\n  /// include the size of the current buffer.\n  mutating public func finish(\n    offset: Offset,\n    fileId: String,\n    addPrefix prefix: Bool = false)\n  {\n    let size = MemoryLayout<UOffset>.size\n    preAlign(\n      len: size &+ (prefix ? size : 0) &+ FileIdLength,\n      alignment: _minAlignment)\n    assert(fileId.count == FileIdLength, \"Flatbuffers requires file id to be 4\")\n    fileId.withCString { ptr in\n      _bb.writeBytes(ptr, len: 4)\n    }\n    finish(offset: offset, addPrefix: prefix)\n  }\n\n  /// Finished the buffer by adding the file id, offset, and prefix to it.\n  /// - Parameters:\n  ///   - offset: Offset of the table\n  ///   - prefix: if false it wont add the size of the buffer\n  ///\n  /// ``finish(offset:addPrefix:)`` should be called at the end of creating\n  /// a table\n  /// ```swift\n  /// var root = SomeObject\n  ///   .createObject(&builder,\n  ///   name: nameOffset)\n  /// builder.finish(\n  ///   offset: root,\n  ///   addPrefix: true)\n  /// ```\n  /// If `addPrefix` is true, the written bytes would\n  /// include the size of the current buffer.\n  mutating public func finish(\n    offset: Offset,\n    addPrefix prefix: Bool = false)\n  {\n    notNested()\n    let size = MemoryLayout<UOffset>.size\n    preAlign(len: size &+ (prefix ? size : 0), alignment: _minAlignment)\n    push(element: refer(to: offset.o))\n    if prefix { push(element: _bb.size) }\n    _vtableStorage.clear()\n    finished = true\n  }\n\n  /// ``startTable(with:)`` will let the builder know, that a new object is being serialized.\n  ///\n  /// The function will fatalerror if called while there is another object being serialized.\n  /// ```swift\n  /// let start = Monster\n  ///   .startMonster(&fbb)\n  /// ```\n  /// - Parameter numOfFields: Number of elements to be written to the buffer\n  /// - Returns: Offset of the newly started table\n  @inline(__always)\n  mutating public func startTable(with numOfFields: Int) -> UOffset {\n    notNested()\n    isNested = true\n    _vtableStorage.start(count: numOfFields)\n    return _bb.size\n  }\n\n  /// ``endTable(at:)`` will let the ``FlatBufferBuilder`` know that the\n  /// object that's written to it is completed\n  ///\n  /// This would be called after all the elements are serialized,\n  /// it will add the current vtable into the ``ByteBuffer``.\n  /// The functions will `fatalError` in case the object is called\n  /// without ``startTable(with:)``, or the object has exceeded  the limit of 2GB.\n  ///\n  /// - Parameter startOffset:Start point of the object written\n  /// - returns: The root of the table\n  @inline(__always)\n  mutating public func endTable(at startOffset: UOffset) -> UOffset {\n    assert(isNested, \"Calling endtable without calling starttable\")\n    let sizeofVoffset = MemoryLayout<VOffset>.size\n    let vTableOffset = push(element: SOffset(0))\n\n    let tableObjectSize = vTableOffset &- startOffset\n    assert(tableObjectSize < 0x10000, \"Buffer can't grow beyond 2 Gigabytes\")\n    let _max = Int(_vtableStorage.maxOffset) &+ sizeofVoffset\n\n    _bb.fill(padding: _max)\n    _bb.write(\n      value: VOffset(tableObjectSize),\n      index: _bb.writerIndex &+ sizeofVoffset,\n      direct: true)\n    _bb.write(value: VOffset(_max), index: _bb.writerIndex, direct: true)\n\n    var itr = 0\n    while itr < _vtableStorage.writtenIndex {\n      let loaded = _vtableStorage.load(at: itr)\n      itr = itr &+ _vtableStorage.size\n      guard loaded.offset != 0 else { continue }\n      let _index = (_bb.writerIndex &+ Int(loaded.position))\n      _bb.write(\n        value: VOffset(vTableOffset &- loaded.offset),\n        index: _index,\n        direct: true)\n    }\n\n    _vtableStorage.clear()\n    let vt_use = _bb.size\n\n    var isAlreadyAdded: Int?\n\n    let vt2 = _bb.memory.advanced(by: _bb.writerIndex)\n    let len2 = vt2.bindMemory(to: Int16.self, capacity: 1).pointee\n\n    for index in stride(from: 0, to: _vtables.count, by: 1) {\n      let position = _bb.capacity &- Int(_vtables[index])\n      let vt1 = _bb.memory.advanced(by: position)\n      let len1 = vt1.bindMemory(to: Int16.self, capacity: 1).pointee\n      if len2 != len1 || 0 != memcmp(vt1, vt2, Int(len2)) { continue }\n\n      isAlreadyAdded = Int(_vtables[index])\n      break\n    }\n\n    if let offset = isAlreadyAdded {\n      let vTableOff = Int(vTableOffset)\n      let space = _bb.capacity &- vTableOff\n      _bb.write(value: Int32(offset &- vTableOff), index: space, direct: true)\n      _bb.pop(_bb.capacity &- space)\n    } else {\n      _bb.write(value: Int32(vt_use &- vTableOffset), index: Int(vTableOffset))\n      _vtables.append(_bb.size)\n    }\n    isNested = false\n    return vTableOffset\n  }\n\n  // MARK: - Builds Buffer\n\n  /// Asserts to see if the object is not nested\n  @inline(__always)\n  @usableFromInline\n  mutating internal func notNested() {\n    assert(!isNested, \"Object serialization must not be nested\")\n  }\n\n  /// Changes the minimuim alignment of the buffer\n  /// - Parameter size: size of the current alignment\n  @inline(__always)\n  @usableFromInline\n  mutating internal func minAlignment(size: Int) {\n    if size > _minAlignment {\n      _minAlignment = size\n    }\n  }\n\n  /// Prealigns the buffer before writting a new object into the buffer\n  /// - Parameters:\n  ///   - len:Length of the object\n  ///   - alignment: Alignment type\n  @inline(__always)\n  @usableFromInline\n  mutating internal func preAlign(len: Int, alignment: Int) {\n    minAlignment(size: alignment)\n    _bb.fill(\n      padding: numericCast(\n        padding(\n          bufSize: numericCast(_bb.size) &+ numericCast(len),\n          elementSize: numericCast(alignment))))\n  }\n\n  /// Prealigns the buffer before writting a new object into the buffer\n  /// - Parameters:\n  ///   - len: Length of the object\n  ///   - type: Type of the object to be written\n  @inline(__always)\n  @usableFromInline\n  mutating internal func preAlign<T: Scalar>(len: Int, type: T.Type) {\n    preAlign(len: len, alignment: MemoryLayout<T>.size)\n  }\n\n  /// Refers to an object that's written in the buffer\n  /// - Parameter off: the objects index value\n  @inline(__always)\n  @usableFromInline\n  mutating internal func refer(to off: UOffset) -> UOffset {\n    let size = MemoryLayout<UOffset>.size\n    preAlign(len: size, alignment: size)\n    return _bb.size &- off &+ UInt32(size)\n  }\n\n  /// Tracks the elements written into the buffer\n  /// - Parameters:\n  ///   - offset: The offset of the element witten\n  ///   - position: The position of the element\n  @inline(__always)\n  @usableFromInline\n  mutating internal func track(offset: UOffset, at position: VOffset) {\n    _vtableStorage.add(loc: (offset: offset, position: position))\n  }\n\n  // MARK: - Inserting Vectors\n\n  /// ``startVector(_:elementSize:)`` creates a new vector within buffer\n  ///\n  /// The function checks if there is a current object being written, if\n  /// the check passes it creates a buffer alignment of `length * elementSize`\n  /// ```swift\n  /// builder.startVector(\n  ///   int32Values.count, elementSize: 4)\n  /// ```\n  ///\n  /// - Parameters:\n  ///   - len: Length of vector to be created\n  ///   - elementSize: Size of object type to be written\n  @inline(__always)\n  mutating public func startVector(_ len: Int, elementSize: Int) {\n    notNested()\n    isNested = true\n    preAlign(len: len &* elementSize, type: UOffset.self)\n    preAlign(len: len &* elementSize, alignment: elementSize)\n  }\n\n  /// ``endVector(len:)`` ends the currently created vector\n  ///\n  /// Calling ``endVector(len:)`` requires the length, of the current\n  /// vector. The length would be pushed to indicate the count of numbers\n  /// within the vector. If ``endVector(len:)`` is called without\n  /// ``startVector(_:elementSize:)`` it asserts.\n  ///\n  /// ```swift\n  /// let vectorOffset = builder.\n  ///   endVector(len: int32Values.count)\n  /// ```\n  ///\n  /// - Parameter len: Length of the buffer\n  /// - Returns: Returns the current ``Offset`` in the ``ByteBuffer``\n  @inline(__always)\n  mutating public func endVector(len: Int) -> Offset {\n    assert(isNested, \"Calling endVector without calling startVector\")\n    isNested = false\n    return Offset(offset: push(element: Int32(len)))\n  }\n\n  /// Creates a vector of type ``Scalar`` into the ``ByteBuffer``\n  ///\n  /// ``createVector(_:)-4swl0`` writes a vector of type Scalars into\n  /// ``ByteBuffer``. This is a convenient method instead of calling,\n  /// ``startVector(_:elementSize:)`` and then ``endVector(len:)``\n  /// ```swift\n  /// let vectorOffset = builder.\n  ///   createVector([1, 2, 3, 4])\n  /// ```\n  ///\n  /// The underlying implementation simply calls ``createVector(_:size:)-4lhrv``\n  ///\n  /// - Parameter elements: elements to be written into the buffer\n  /// - returns: ``Offset`` of the vector\n  @inline(__always)\n  mutating public func createVector<T: Scalar>(_ elements: [T]) -> Offset {\n    createVector(elements, size: elements.count)\n  }\n\n  ///  Creates a vector of type Scalar in the buffer\n  ///\n  /// ``createVector(_:)-4swl0`` writes a vector of type Scalars into\n  /// ``ByteBuffer``. This is a convenient method instead of calling,\n  /// ``startVector(_:elementSize:)`` and then ``endVector(len:)``\n  /// ```swift\n  /// let vectorOffset = builder.\n  ///   createVector([1, 2, 3, 4], size: 4)\n  /// ```\n  ///\n  /// - Parameter elements: Elements to be written into the buffer\n  /// - Parameter size: Count of elements\n  /// - returns: ``Offset`` of the vector\n  @inline(__always)\n  mutating public func createVector<T: Scalar>(\n    _ elements: [T],\n    size: Int) -> Offset\n  {\n    let size = size\n    startVector(size, elementSize: MemoryLayout<T>.size)\n    _bb.push(elements: elements)\n    return endVector(len: size)\n  }\n\n  #if !os(WASI)\n  @inline(__always)\n  /// Creates a vector of bytes in the buffer.\n  ///\n  /// Allows creating a vector from `Data` without copying to a `[UInt8]`\n  ///\n  /// - Parameter bytes: bytes to be written into the buffer\n  /// - Returns: ``Offset`` of the vector\n  mutating public func createVector(bytes: ContiguousBytes) -> Offset {\n    bytes.withUnsafeBytes {\n      startVector($0.count, elementSize: MemoryLayout<UInt8>.size)\n      _bb.push(bytes: $0)\n      return endVector(len: $0.count)\n    }\n  }\n  #endif\n\n  /// Creates a vector of type ``Enum`` into the ``ByteBuffer``\n  ///\n  /// ``createVector(_:)-9h189`` writes a vector of type ``Enum`` into\n  /// ``ByteBuffer``. This is a convenient method instead of calling,\n  /// ``startVector(_:elementSize:)`` and then ``endVector(len:)``\n  /// ```swift\n  /// let vectorOffset = builder.\n  ///   createVector([.swift, .cpp])\n  /// ```\n  ///\n  /// The underlying implementation simply calls ``createVector(_:size:)-7cx6z``\n  ///\n  /// - Parameter elements: elements to be written into the buffer\n  /// - returns: ``Offset`` of the vector\n  @inline(__always)\n  mutating public func createVector<T: Enum>(_ elements: [T]) -> Offset {\n    createVector(elements, size: elements.count)\n  }\n\n  /// Creates a vector of type ``Enum`` into the ``ByteBuffer``\n  ///\n  /// ``createVector(_:)-9h189`` writes a vector of type ``Enum`` into\n  /// ``ByteBuffer``. This is a convenient method instead of calling,\n  /// ``startVector(_:elementSize:)`` and then ``endVector(len:)``\n  /// ```swift\n  /// let vectorOffset = builder.\n  ///   createVector([.swift, .cpp])\n  /// ```\n  ///\n  /// - Parameter elements: Elements to be written into the buffer\n  /// - Parameter size: Count of elements\n  /// - returns: ``Offset`` of the vector\n  @inline(__always)\n  mutating public func createVector<T: Enum>(\n    _ elements: [T],\n    size: Int) -> Offset\n  {\n    let size = size\n    startVector(size, elementSize: T.byteSize)\n    for index in stride(from: elements.count, to: 0, by: -1) {\n      _bb.push(value: elements[index &- 1].value, len: T.byteSize)\n    }\n    return endVector(len: size)\n  }\n\n  /// Creates a vector of already written offsets\n  ///\n  /// ``createVector(ofOffsets:)`` creates a vector of ``Offset`` into\n  /// ``ByteBuffer``. This is a convenient method instead of calling,\n  /// ``startVector(_:elementSize:)`` and then ``endVector(len:)``.\n  ///\n  /// The underlying implementation simply calls ``createVector(ofOffsets:len:)``\n  ///\n  /// ```swift\n  /// let namesOffsets = builder.\n  ///   createVector(ofOffsets: [name1, name2])\n  /// ```\n  /// - Parameter offsets: Array of offsets of type ``Offset``\n  /// - returns: ``Offset`` of the vector\n  @inline(__always)\n  mutating public func createVector(ofOffsets offsets: [Offset]) -> Offset {\n    createVector(ofOffsets: offsets, len: offsets.count)\n  }\n\n  /// Creates a vector of already written offsets\n  ///\n  /// ``createVector(ofOffsets:)`` creates a vector of ``Offset`` into\n  /// ``ByteBuffer``. This is a convenient method instead of calling,\n  /// ``startVector(_:elementSize:)`` and then ``endVector(len:)``\n  ///\n  /// ```swift\n  /// let namesOffsets = builder.\n  ///   createVector(ofOffsets: [name1, name2])\n  /// ```\n  ///\n  /// - Parameter offsets: Array of offsets of type ``Offset``\n  /// - Parameter size: Count of elements\n  /// - returns: ``Offset`` of the vector\n  @inline(__always)\n  mutating public func createVector(\n    ofOffsets offsets: [Offset],\n    len: Int) -> Offset\n  {\n    startVector(len, elementSize: MemoryLayout<Offset>.size)\n    for index in stride(from: offsets.count, to: 0, by: -1) {\n      push(element: offsets[index &- 1])\n    }\n    return endVector(len: len)\n  }\n\n  /// Creates a vector of strings\n  ///\n  /// ``createVector(ofStrings:)`` creates a vector of `String` into\n  /// ``ByteBuffer``. This is a convenient method instead of manually\n  /// creating the string offsets, you simply pass it to this function\n  /// and it would write the strings into the ``ByteBuffer``.\n  /// After that it calls ``createVector(ofOffsets:)``\n  ///\n  /// ```swift\n  /// let namesOffsets = builder.\n  ///   createVector(ofStrings: [\"Name\", \"surname\"])\n  /// ```\n  ///\n  /// - Parameter str: Array of string\n  /// - returns: ``Offset`` of the vector\n  @inline(__always)\n  mutating public func createVector(ofStrings str: [String]) -> Offset {\n    var offsets: [Offset] = []\n    for index in stride(from: 0, to: str.count, by: 1) {\n      offsets.append(create(string: str[index]))\n    }\n    return createVector(ofOffsets: offsets)\n  }\n\n  /// Creates a vector of type ``NativeStruct``.\n  ///\n  /// Any swift struct in the generated code, should confirm to\n  /// ``NativeStruct``. Since the generated swift structs are padded\n  /// to the `FlatBuffers` standards.\n  ///\n  /// ```swift\n  /// let offsets = builder.\n  ///   createVector(ofStructs: [NativeStr(num: 1), NativeStr(num: 2)])\n  /// ```\n  ///\n  /// - Parameter structs: A vector of ``NativeStruct``\n  /// - Returns: ``Offset`` of the vector\n  @inline(__always)\n  mutating public func createVector<T: NativeStruct>(ofStructs structs: [T])\n    -> Offset\n  {\n    startVector(\n      structs.count * MemoryLayout<T>.size,\n      elementSize: MemoryLayout<T>.alignment)\n    _bb.push(elements: structs)\n    return endVector(len: structs.count)\n  }\n\n  // MARK: - Inserting Structs\n\n  /// Writes a ``NativeStruct`` into the ``ByteBuffer``\n  ///\n  /// Adds a native struct that's build and padded according\n  /// to `FlatBuffers` standards. with a predefined position.\n  ///\n  /// ```swift\n  /// let offset = builder.create(\n  ///   struct: NativeStr(num: 1),\n  ///   position: 10)\n  /// ```\n  ///\n  /// - Parameters:\n  ///   - s: ``NativeStruct`` to be inserted into the ``ByteBuffer``\n  ///   - position: The  predefined position of the object\n  /// - Returns: ``Offset`` of written struct\n  @inline(__always)\n  @discardableResult\n  mutating public func create<T: NativeStruct>(\n    struct s: T, position: VOffset) -> Offset\n  {\n    let offset = create(struct: s)\n    _vtableStorage.add(\n      loc: (offset: _bb.size, position: VOffset(position)))\n    return offset\n  }\n\n  /// Writes a ``NativeStruct`` into the ``ByteBuffer``\n  ///\n  /// Adds a native struct that's build and padded according\n  /// to `FlatBuffers` standards, directly into the buffer without\n  /// a predefined position.\n  ///\n  /// ```swift\n  /// let offset = builder.create(\n  ///   struct: NativeStr(num: 1))\n  /// ```\n  ///\n  /// - Parameters:\n  ///   - s: ``NativeStruct`` to be inserted into the ``ByteBuffer``\n  /// - Returns: ``Offset`` of written struct\n  @inline(__always)\n  @discardableResult\n  mutating public func create<T: NativeStruct>(\n    struct s: T) -> Offset\n  {\n    let size = MemoryLayout<T>.size\n    preAlign(len: size, alignment: MemoryLayout<T>.alignment)\n    _bb.push(struct: s, size: size)\n    return Offset(offset: _bb.size)\n  }\n\n  // MARK: - Inserting Strings\n\n  /// Insets a string into the buffer of type `UTF8`\n  ///\n  /// Adds a swift string into ``ByteBuffer`` by encoding it\n  /// using `UTF8`\n  ///\n  /// ```swift\n  /// let nameOffset = builder\n  ///   .create(string: \"welcome\")\n  /// ```\n  ///\n  /// - Parameter str: String to be serialized\n  /// - returns: ``Offset`` of inserted string\n  @inline(__always)\n  mutating public func create(string str: String?) -> Offset {\n    guard let str = str else { return Offset() }\n    let len = str.utf8.count\n    notNested()\n    preAlign(len: len &+ 1, type: UOffset.self)\n    str.withCString { ptr in\n      _bb.writeBytes(ptr, len: len &+ 1)\n    }\n    push(element: UOffset(len))\n    return Offset(offset: _bb.size)\n  }\n\n  /// Insets a shared string into the buffer of type `UTF8`\n  ///\n  /// Adds a swift string into ``ByteBuffer`` by encoding it\n  /// using `UTF8`. The function will check if the string,\n  /// is already written to the ``ByteBuffer``\n  ///\n  /// ```swift\n  /// let nameOffset = builder\n  ///   .createShared(string: \"welcome\")\n  ///\n  ///\n  /// let secondOffset = builder\n  ///   .createShared(string: \"welcome\")\n  ///\n  /// assert(nameOffset.o == secondOffset.o)\n  /// ```\n  ///\n  /// - Parameter str: String to be serialized\n  /// - returns: ``Offset`` of inserted string\n  @inline(__always)\n  mutating public func createShared(string str: String?) -> Offset {\n    guard let str = str else { return Offset() }\n    if let offset = stringOffsetMap[str] {\n      return offset\n    }\n    let offset = create(string: str)\n    stringOffsetMap[str] = offset\n    return offset\n  }\n\n  // MARK: - Inseting offsets\n\n  /// Writes the ``Offset`` of an already written table\n  ///\n  /// Writes the ``Offset`` of a table if not empty into the\n  /// ``ByteBuffer``\n  ///\n  /// - Parameters:\n  ///   - offset: ``Offset`` of another object to be written\n  ///   - position: The predefined position of the object\n  @inline(__always)\n  mutating public func add(offset: Offset, at position: VOffset) {\n    if offset.isEmpty { return }\n    add(element: refer(to: offset.o), def: 0, at: position)\n  }\n\n  /// Pushes a value of type ``Offset`` into the ``ByteBuffer``\n  /// - Parameter o: ``Offset``\n  /// - returns: Current position of the ``Offset``\n  @inline(__always)\n  @discardableResult\n  mutating public func push(element o: Offset) -> UOffset {\n    push(element: refer(to: o.o))\n  }\n\n  // MARK: - Inserting Scalars to Buffer\n\n  /// Writes a ``Scalar`` value into ``ByteBuffer``\n  ///\n  /// ``add(element:def:at:)`` takes in a default value, and current value\n  /// and the position within the `VTable`. The default value would not\n  /// be serialized if the value is the same as the current value or\n  /// `serializeDefaults` is equal to false.\n  ///\n  /// If serializing defaults is important ``init(initialSize:serializeDefaults:)``,\n  /// passing true for `serializeDefaults` would do the job.\n  ///\n  /// ```swift\n  /// // Adds 10 to the buffer\n  /// builder.add(element: Int(10), def: 1, position 12)\n  /// ```\n  ///\n  /// *NOTE: Never call this manually*\n  ///\n  /// - Parameters:\n  ///   - element: Element to insert\n  ///   - def: Default value for that element\n  ///   - position: The predefined position of the element\n  @inline(__always)\n  mutating public func add<T: Scalar>(\n    element: T,\n    def: T,\n    at position: VOffset)\n  {\n    if element == def && !serializeDefaults { return }\n    track(offset: push(element: element), at: position)\n  }\n\n  /// Writes a optional ``Scalar`` value into ``ByteBuffer``\n  ///\n  /// Takes an optional value to be written into the ``ByteBuffer``\n  ///\n  /// *NOTE: Never call this manually*\n  ///\n  /// - Parameters:\n  ///   - element: Optional element of type scalar\n  ///   - position: The predefined position of the element\n  @inline(__always)\n  mutating public func add<T: Scalar>(element: T?, at position: VOffset) {\n    guard let element = element else { return }\n    track(offset: push(element: element), at: position)\n  }\n\n  /// Pushes a values of type ``Scalar`` into the ``ByteBuffer``\n  ///\n  /// *NOTE: Never call this manually*\n  ///\n  /// - Parameter element: Element to insert\n  /// - returns: position of the Element\n  @inline(__always)\n  @discardableResult\n  mutating public func push<T: Scalar>(element: T) -> UOffset {\n    let size = MemoryLayout<T>.size\n    preAlign(\n      len: size,\n      alignment: size)\n    _bb.push(value: element, len: size)\n    return _bb.size\n  }\n\n  @inline(__always)\n  public func read<T>(def: T.Type, position: Int) -> T {\n    _bb.read(def: def, position: position)\n  }\n}\n\nextension FlatBufferBuilder: CustomDebugStringConvertible {\n\n  public var debugDescription: String {\n    \"\"\"\n    buffer debug:\n    \\(_bb)\n    builder debug:\n    { finished: \\(finished), serializeDefaults: \\(\n      serializeDefaults), isNested: \\(isNested) }\n    \"\"\"\n  }\n\n  typealias FieldLoc = (offset: UOffset, position: VOffset)\n\n  /// VTableStorage is a class to contain the VTable buffer that would be serialized into buffer\n  @usableFromInline\n  internal class VTableStorage {\n    /// Size of FieldLoc in memory\n    let size = MemoryLayout<FieldLoc>.stride\n    /// Memeory buffer\n    var memory: UnsafeMutableRawBufferPointer!\n    /// Capacity of the current buffer\n    var capacity: Int = 0\n    /// Maximuim offset written to the class\n    var maxOffset: VOffset = 0\n    /// number of fields written into the buffer\n    var numOfFields: Int = 0\n    /// Last written Index\n    var writtenIndex: Int = 0\n\n    /// Creates the memory to store the buffer in\n    @usableFromInline\n    @inline(__always)\n    init() {\n      memory = UnsafeMutableRawBufferPointer.allocate(\n        byteCount: 0,\n        alignment: 0)\n    }\n\n    @inline(__always)\n    deinit {\n      memory.deallocate()\n    }\n\n    /// Builds a buffer with byte count of fieldloc.size * count of field numbers\n    /// - Parameter count: number of fields to be written\n    @inline(__always)\n    func start(count: Int) {\n      assert(count >= 0, \"number of fields should NOT be negative\")\n      let capacity = count &* size\n      ensure(space: capacity)\n    }\n\n    /// Adds a FieldLoc into the buffer, which would track how many have been written,\n    /// and max offset\n    /// - Parameter loc: Location of encoded element\n    @inline(__always)\n    func add(loc: FieldLoc) {\n      memory.baseAddress?.advanced(by: writtenIndex).storeBytes(\n        of: loc,\n        as: FieldLoc.self)\n      writtenIndex = writtenIndex &+ size\n      numOfFields = numOfFields &+ 1\n      maxOffset = max(loc.position, maxOffset)\n    }\n\n    /// Clears the data stored related to the encoded buffer\n    @inline(__always)\n    func reset(keepingCapacity: Bool) {\n      maxOffset = 0\n      numOfFields = 0\n      writtenIndex = 0\n      if keepingCapacity {\n        memset(memory.baseAddress!, 0, memory.count)\n      } else {\n        capacity = 0\n        let memory = UnsafeMutableRawBufferPointer.allocate(\n          byteCount: 0,\n          alignment: 0)\n        self.memory.deallocate()\n        self.memory = memory\n      }\n    }\n\n    /// Clears the data stored related to the encoded buffer\n    @inline(__always)\n    func clear() {\n      maxOffset = 0\n      numOfFields = 0\n      writtenIndex = 0\n    }\n\n    /// Ensure that the buffer has enough space instead of recreating the buffer each time.\n    /// - Parameter space: space required for the new vtable\n    @inline(__always)\n    func ensure(space: Int) {\n      guard space &+ writtenIndex > capacity else { return }\n      memory.deallocate()\n      memory = UnsafeMutableRawBufferPointer.allocate(\n        byteCount: space,\n        alignment: size)\n      capacity = space\n    }\n\n    /// Loads an object of type `FieldLoc` from buffer memory\n    /// - Parameter index: index of element\n    /// - Returns: a FieldLoc at index\n    @inline(__always)\n    func load(at index: Int) -> FieldLoc {\n      memory.load(fromByteOffset: index, as: FieldLoc.self)\n    }\n  }\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/FlatBufferObject.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\n/// NativeStruct is a protocol that indicates if the struct is a native `swift` struct\n/// since now we will be serializing native structs into the buffer.\npublic protocol NativeStruct {}\n\n/// FlatbuffersInitializable is a protocol that allows any object to be\n/// Initialized from a ByteBuffer\npublic protocol FlatbuffersInitializable {\n  /// Any flatbuffers object that confirms to this protocol is going to be\n  /// initializable through this initializer\n  init(_ bb: ByteBuffer, o: Int32)\n}\n\n/// FlatbufferTabke structures all the Flatbuffers tables\npublic protocol FlatBufferTable: FlatbuffersInitializable,\n  FlatbuffersVectorInitializable\n{\n  var __buffer: ByteBuffer! { get }\n}\n\n/// FlatbufferStruct structures all the Flatbuffers structs\npublic protocol FlatBufferStruct: FlatbuffersInitializable,\n  FlatbuffersVectorInitializable\n{\n  var __buffer: ByteBuffer! { get }\n}\n\n/// ``ObjectAPIPacker`` is a protocol that allows object to pack and unpack from a\n/// ``NativeObject`` to a flatbuffers Object and vice versa.\npublic protocol ObjectAPIPacker {\n  /// associatedtype to the object that should be unpacked.\n  associatedtype T\n\n  /// ``pack(_:obj:)-3ptws`` tries to pacs the variables of a native Object into the `ByteBuffer` by using\n  /// a FlatBufferBuilder\n  /// - Parameters:\n  ///   - builder: FlatBufferBuilder that will host incoming data\n  ///   - obj: Object of associatedtype to the current implementer\n  ///\n  /// ``pack(_:obj:)-3ptws`` can be called by passing through an already initialized ``FlatBufferBuilder``\n  /// or it can be called by using the public API that will create a new ``FlatBufferBuilder``\n  static func pack(_ builder: inout FlatBufferBuilder, obj: inout T?) -> Offset\n\n  /// ``pack(_:obj:)-20ipk`` packs the variables of a native Object into the `ByteBuffer` by using\n  /// the FlatBufferBuilder\n  /// - Parameters:\n  ///   - builder: FlatBufferBuilder that will host incoming data\n  ///   - obj: Object of associatedtype to the current implementer\n  ///\n  /// ``pack(_:obj:)-20ipk`` can be called by passing through an already initialized ``FlatBufferBuilder``\n  /// or it can be called by using the public API that will create a new ``FlatBufferBuilder``\n  static func pack(_ builder: inout FlatBufferBuilder, obj: inout T) -> Offset\n\n  /// ``unpack()`` unpacks a ``FlatBuffers`` object into a Native swift object.\n  func unpack() -> T\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/FlatBuffersUtils.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\n/// FlatBuffersUtils hosts some utility functions that might be useful\npublic enum FlatBuffersUtils {\n\n  /// Gets the size of the prefix\n  /// - Parameter bb: Flatbuffer object\n  public static func getSizePrefix(bb: ByteBuffer) -> Int32 {\n    bb.read(def: Int32.self, position: bb.reader)\n  }\n\n  /// Removes the prefix by duplicating the Flatbuffer this call is expensive since its\n  /// creates a new buffer use `readPrefixedSizeCheckedRoot` instead\n  /// unless a completely new buffer is required\n  /// - Parameter bb: Flatbuffer object\n  ///\n  ///\n  public static func removeSizePrefix(bb: ByteBuffer) -> ByteBuffer {\n    bb.duplicate(removing: MemoryLayout<Int32>.size)\n  }\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/FlatbuffersErrors.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\n/// Collection of thrown from the Flatbuffer verifier\npublic enum FlatbuffersErrors: Error, Equatable {\n\n  /// Thrown when trying to verify a buffer that doesnt have the length of an ID\n  case bufferDoesntContainID\n  /// Thrown when verifying a file id that doesnt match buffer id\n  case bufferIdDidntMatchPassedId\n  /// Prefixed size doesnt match the current (readable) buffer size\n  case prefixedSizeNotEqualToBufferSize\n  /// Thrown when buffer is bigger than the allowed 2GiB\n  case exceedsMaxSizeAllowed\n  /// Thrown when there is an missaligned pointer at position\n  /// of type\n  case missAlignedPointer(position: Int, type: String)\n  /// Thrown when trying to read a value that goes out of the\n  /// current buffer bounds\n  case outOfBounds(position: UInt, end: Int)\n  /// Thrown when the signed offset is out of the bounds of the\n  /// current buffer\n  case signedOffsetOutOfBounds(offset: Int, position: Int)\n  /// Thrown when a required field doesnt exist within the buffer\n  case requiredFieldDoesntExist(position: VOffset, name: String)\n  /// Thrown when a string is missing its NULL Terminator `\\0`,\n  /// this can be disabled in the `VerifierOptions`\n  case missingNullTerminator(position: Int, str: String?)\n  /// Thrown when the verifier has reached the maximum tables allowed,\n  /// this can be disabled in the `VerifierOptions`\n  case maximumTables\n  /// Thrown when the verifier has reached the maximum depth allowed,\n  /// this can be disabled in the `VerifierOptions`\n  case maximumDepth\n  /// Thrown when the verifier is presented with an unknown union case\n  case unknownUnionCase\n  /// thrown when a value for a union is not found within the buffer\n  case valueNotFound(key: Int?, keyName: String, field: Int?, fieldName: String)\n  /// thrown when the size of the keys vector doesnt match fields vector\n  case unionVectorSize(\n    keyVectorSize: Int,\n    fieldVectorSize: Int,\n    unionKeyName: String,\n    fieldName: String)\n  case apparentSizeTooLarge\n\n}\n\n#if !os(WASI)\n\nextension FlatbuffersErrors {\n  public static func == (\n    lhs: FlatbuffersErrors,\n    rhs: FlatbuffersErrors) -> Bool\n  {\n    lhs.localizedDescription == rhs.localizedDescription\n  }\n}\n\n#endif\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Message.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\n/// FlatBufferGRPCMessage protocol that should allow us to invoke\n/// initializers directly from the GRPC generated code\npublic protocol FlatBufferGRPCMessage {\n  /// Size of readable bytes in the buffer\n  var size: Int { get }\n\n  init(byteBuffer: ByteBuffer)\n\n  @discardableResult\n  @inline(__always)\n  func withUnsafeReadableBytes<T>(\n    _ body: (UnsafeRawBufferPointer) throws\n      -> T) rethrows -> T\n}\n\n/// Message is a wrapper around Buffers to to able to send Flatbuffers `Buffers` through the\n/// GRPC library\npublic struct Message<T: FlatBufferTable>: FlatBufferGRPCMessage {\n  internal var buffer: ByteBuffer\n\n  /// Returns the an object of type T that would be  read from the buffer\n  public var object: T {\n    T.init(\n      buffer,\n      o: Int32(buffer.read(def: UOffset.self, position: buffer.reader)) &+\n        Int32(buffer.reader))\n  }\n\n  public var size: Int { Int(buffer.size) }\n\n  /// Initializes the message with the type Flatbuffer.Bytebuffer that is transmitted over\n  /// GRPC\n  /// - Parameter byteBuffer: Flatbuffer ByteBuffer object\n  public init(byteBuffer: ByteBuffer) {\n    buffer = byteBuffer\n  }\n\n  /// Initializes the message by copying the buffer to the message to be sent.\n  /// from the builder\n  /// - Parameter builder: FlatbufferBuilder that has the bytes created in\n  /// - Note: Use  `builder.finish(offset)` before passing the builder without prefixing anything to it\n  public init(builder: inout FlatBufferBuilder) {\n    buffer = builder.sizedBuffer\n    builder.clear()\n  }\n\n  @discardableResult\n  @inline(__always)\n  public func withUnsafeReadableBytes<Data>(\n    _ body: (UnsafeRawBufferPointer) throws\n      -> Data) rethrows -> Data\n  {\n    return try buffer.readWithUnsafeRawPointer(position: buffer.reader) {\n      try body(UnsafeRawBufferPointer(start: $0, count: size))\n    }\n  }\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Mutable.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\n#if canImport(Common)\nimport Common\n#endif\n\n/// Mutable is a protocol that allows us to mutate Scalar values within a ``ByteBuffer``\npublic protocol Mutable {\n  /// makes Flatbuffer accessed within the Protocol\n  var bb: ByteBuffer { get }\n  /// makes position of the ``Table``/``Struct`` accessed within the Protocol\n  var position: Int32 { get }\n}\n\nextension Mutable {\n\n  /// Mutates the memory in the buffer, this is only called from the access function of ``Table`` and ``struct``\n  /// - Parameters:\n  ///   - value: New value to be inserted to the buffer\n  ///   - index: index of the Element\n  func mutate<T: Scalar>(value: T, o: Int32) -> Bool {\n    guard o != 0 else { return false }\n    bb.write(value: value, index: Int(o), direct: true)\n    return true\n  }\n}\n\nextension Mutable where Self == Table {\n\n  /// Mutates a value by calling mutate with respect to the position in a ``Table``\n  /// - Parameters:\n  ///   - value: New value to be inserted to the buffer\n  ///   - index: index of the Element\n  public func mutate<T: Scalar>(_ value: T, index: Int32) -> Bool {\n    guard index != 0 else { return false }\n    return mutate(value: value, o: index &+ position)\n  }\n\n  /// Directly mutates the element by calling mutate\n  ///\n  /// Mutates the Element at index ignoring the current position by calling mutate\n  /// - Parameters:\n  ///   - value: New value to be inserted to the buffer\n  ///   - index: index of the Element\n  public func directMutate<T: Scalar>(_ value: T, index: Int32) -> Bool {\n    mutate(value: value, o: index)\n  }\n}\n\nextension Mutable where Self == Struct {\n\n  /// Mutates a value by calling mutate with respect to the position in the struct\n  /// - Parameters:\n  ///   - value: New value to be inserted to the buffer\n  ///   - index: index of the Element\n  public func mutate<T: Scalar>(_ value: T, index: Int32) -> Bool {\n    mutate(value: value, o: index &+ position)\n  }\n\n  /// Directly mutates the element by calling mutate\n  ///\n  /// Mutates the Element at index ignoring the current position by calling mutate\n  /// - Parameters:\n  ///   - value: New value to be inserted to the buffer\n  ///   - index: index of the Element\n  public func directMutate<T: Scalar>(_ value: T, index: Int32) -> Bool {\n    mutate(value: value, o: index)\n  }\n}\n\nextension Struct: Mutable {}\nextension Table: Mutable {}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/NativeObject.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\n/// NativeObject is a protocol that all of the `Object-API` generated code should be\n/// conforming to since it allows developers the ease of use to pack and unpack their\n/// Flatbuffers objects\npublic protocol NativeObject {}\n\nextension NativeObject {\n\n  /// Serialize is a helper function that serializes the data from the Object API to a bytebuffer directly th\n  /// - Parameter type: Type of the Flatbuffer object\n  /// - Returns: returns the encoded sized ByteBuffer\n  public func serialize<T: ObjectAPIPacker>(type: T.Type) -> ByteBuffer\n    where T.T == Self\n  {\n    var builder = FlatBufferBuilder(initialSize: 1024)\n    return serialize(builder: &builder, type: type.self)\n  }\n\n  /// Serialize is a helper function that serializes the data from the Object API to a bytebuffer directly.\n  ///\n  /// - Parameters:\n  ///   - builder: A FlatBufferBuilder\n  ///   - type: Type of the Flatbuffer object\n  /// - Returns: returns the encoded sized ByteBuffer\n  /// - Note: The `serialize(builder:type)` can be considered as a function that allows you to create smaller builder instead of the default `1024`.\n  ///  It can be considered less expensive in terms of memory allocation\n  public func serialize<T: ObjectAPIPacker>(\n    builder: inout FlatBufferBuilder,\n    type: T.Type) -> ByteBuffer where T.T == Self\n  {\n    var s = self\n    let root = type.pack(&builder, obj: &s)\n    builder.finish(offset: root)\n    return builder.sizedBuffer\n  }\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Offset.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\n/// Offset object for all the Objects that are written into the buffer\npublic struct Offset {\n  /// Offset of the object in the buffer\n  public var o: UOffset\n  /// Returns false if the offset is equal to zero\n  public var isEmpty: Bool { o == 0 }\n\n  public init(offset: UOffset) { o = offset }\n  public init() { o = 0 }\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Root.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\n/// Takes in a prefixed sized buffer, where the prefixed size would be skipped.\n/// And would verify that the buffer passed is a valid `Flatbuffers` Object.\n/// - Parameters:\n///   - byteBuffer: Buffer that needs to be checked and read\n///   - options: Verifier options\n/// - Throws: FlatbuffersErrors\n/// - Returns: Returns a valid, checked Flatbuffers object\n///\n/// ``getPrefixedSizeCheckedRoot(byteBuffer:options:)`` would skip the first Bytes in\n/// the ``ByteBuffer`` and verifies the buffer by calling ``getCheckedRoot(byteBuffer:options:)``\npublic func getPrefixedSizeCheckedRoot<T: FlatBufferTable & Verifiable>(\n  byteBuffer: inout ByteBuffer,\n  fileId: String? = nil,\n  options: VerifierOptions = .init()) throws -> T\n{\n  byteBuffer.skipPrefix()\n  return try getCheckedRoot(\n    byteBuffer: &byteBuffer,\n    fileId: fileId,\n    options: options)\n}\n\n/// Takes in a prefixed sized buffer, where we check if the sized buffer is equal to prefix size.\n/// And would verify that the buffer passed is a valid `Flatbuffers` Object.\n/// - Parameters:\n///   - byteBuffer: Buffer that needs to be checked and read\n///   - options: Verifier options\n/// - Throws: FlatbuffersErrors\n/// - Returns: Returns a valid, checked Flatbuffers object\n///\n/// ``getPrefixedSizeCheckedRoot(byteBuffer:options:)`` would skip the first Bytes in\n/// the ``ByteBuffer`` and verifies the buffer by calling ``getCheckedRoot(byteBuffer:options:)``\npublic func getCheckedPrefixedSizeRoot<T: FlatBufferTable & Verifiable>(\n  byteBuffer: inout ByteBuffer,\n  fileId: String? = nil,\n  options: VerifierOptions = .init()) throws -> T\n{\n  let prefix = byteBuffer.skipPrefix()\n  if prefix != byteBuffer.size {\n    throw FlatbuffersErrors.prefixedSizeNotEqualToBufferSize\n  }\n  return try getCheckedRoot(\n    byteBuffer: &byteBuffer,\n    fileId: fileId,\n    options: options)\n}\n\n/// Takes in a prefixed sized buffer, where the prefixed size would be skipped.\n/// Returns a `NON-Checked` flatbuffers object\n/// - Parameter byteBuffer: Buffer that contains data\n/// - Returns: Returns a Flatbuffers object\n///\n/// ``getPrefixedSizeCheckedRoot(byteBuffer:options:)`` would skip the first Bytes in\n/// the ``ByteBuffer`` and then calls ``getRoot(byteBuffer:)``\npublic func getPrefixedSizeRoot<T: FlatBufferTable>(\n  byteBuffer: inout ByteBuffer)\n  -> T\n{\n  byteBuffer.skipPrefix()\n  return getRoot(byteBuffer: &byteBuffer)\n\n}\n\n/// Verifies that the buffer passed is a valid `Flatbuffers` Object.\n/// - Parameters:\n///   - byteBuffer: Buffer that needs to be checked and read\n///   - options: Verifier options\n/// - Throws: FlatbuffersErrors\n/// - Returns: Returns a valid, checked Flatbuffers object\n///\n/// ``getCheckedRoot(byteBuffer:options:)`` Takes in a ``ByteBuffer`` and verifies\n/// that by creating a ``Verifier`` and checkes if all the `Bytes` and correctly aligned\n/// and within the ``ByteBuffer`` range.\npublic func getCheckedRoot<T: FlatBufferTable & Verifiable>(\n  byteBuffer: inout ByteBuffer,\n  fileId: String? = nil,\n  options: VerifierOptions = .init()) throws -> T\n{\n  var verifier = try Verifier(buffer: &byteBuffer, options: options)\n  if let fileId = fileId {\n    try verifier.verify(id: fileId)\n  }\n  try ForwardOffset<T>.verify(&verifier, at: 0, of: T.self)\n  return T.init(\n    byteBuffer,\n    o: Int32(byteBuffer.read(def: UOffset.self, position: byteBuffer.reader))\n      &+ Int32(byteBuffer.reader))\n}\n\n/// Returns a `NON-Checked` flatbuffers object\n/// - Parameter byteBuffer: Buffer that contains data\n/// - Returns: Returns a Flatbuffers object\npublic func getRoot<T: FlatBufferTable>(byteBuffer: inout ByteBuffer) -> T {\n  T.init(\n    byteBuffer,\n    o: Int32(byteBuffer.read(def: UOffset.self, position: byteBuffer.reader))\n      &+ Int32(byteBuffer.reader))\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/String+extension.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\nextension String: Verifiable {\n\n  /// Verifies that the current value is which the bounds of the buffer, and if\n  /// the current `Value` is aligned properly\n  /// - Parameters:\n  ///   - verifier: Verifier that hosts the buffer\n  ///   - position: Current position within the buffer\n  ///   - type: The type of the object to be verified\n  /// - Throws: Errors coming from `inBuffer`, `missingNullTerminator` and `outOfBounds`\n  public static func verify<T>(\n    _ verifier: inout Verifier,\n    at position: Int,\n    of type: T.Type) throws where T: Verifiable\n  {\n\n    let range = try String.verifyRange(&verifier, at: position, of: UInt8.self)\n    /// Safe &+ since we already check for overflow in verify range\n    let stringLen = range.start &+ range.count\n\n    if stringLen >= verifier.capacity {\n      throw FlatbuffersErrors.outOfBounds(\n        position: UInt(clamping: stringLen.magnitude),\n        end: verifier.capacity)\n    }\n\n    let isNullTerminated =\n      verifier._buffer.read(\n        def: UInt8.self,\n        position: stringLen) == 0\n\n    if !verifier._options._ignoreMissingNullTerminators && !isNullTerminated {\n      let str = verifier._buffer.readString(at: range.start, count: range.count)\n      throw FlatbuffersErrors.missingNullTerminator(\n        position: position,\n        str: str)\n    }\n  }\n}\n\nextension String: FlatbuffersInitializable {\n\n  /// Initailizes a string from a Flatbuffers ByteBuffer\n  /// - Parameters:\n  ///   - bb: ByteBuffer containing the readable string\n  ///   - o: Current position\n  public init(_ bb: ByteBuffer, o: Int32) {\n    let v = Int(o)\n    let count = bb.read(def: Int32.self, position: v)\n    self =\n      bb.readString(\n        at: MemoryLayout<Int32>.size &+ v,\n        count: Int(count)) ?? \"\"\n  }\n}\n\nextension String: ObjectAPIPacker {\n\n  public static func pack(\n    _ builder: inout FlatBufferBuilder,\n    obj: inout String?) -> Offset\n  {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(\n    _ builder: inout FlatBufferBuilder,\n    obj: inout String) -> Offset\n  {\n    builder.create(string: obj)\n  }\n\n  public func unpack() -> String {\n    self\n  }\n\n}\n\nextension String: NativeObject {\n\n  public func serialize<T: ObjectAPIPacker>(type: T.Type) -> ByteBuffer\n    where T.T == Self\n  {\n    fatalError(\"serialize should never be called from string directly\")\n  }\n\n  public func serialize<T: ObjectAPIPacker>(\n    builder: inout FlatBufferBuilder,\n    type: T.Type) -> ByteBuffer where T.T == Self\n  {\n    fatalError(\"serialize should never be called from string directly\")\n  }\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Struct.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\n#if canImport(Common)\nimport Common\n#endif\n\n/// Struct is a representation of a mutable `Flatbuffers` struct\n/// since native structs are value types and cant be mutated\n@frozen\npublic struct Struct {\n\n  /// Hosting Bytebuffer\n  public private(set) var bb: ByteBuffer\n  /// Current position of the struct\n  public private(set) var position: Int32\n\n  /// Initializer for a mutable flatbuffers struct\n  /// - Parameters:\n  ///   - bb: Current hosting Bytebuffer\n  ///   - position: Current position for the struct in the ByteBuffer\n  public init(bb: ByteBuffer, position: Int32 = 0) {\n    self.bb = bb\n    self.position = position\n  }\n\n  /// Reads data from the buffer directly at offset O\n  /// - Parameters:\n  ///   - type: Type of data to be read\n  ///   - o: Current offset of the data\n  /// - Returns: Data of Type T that conforms to type Scalar\n  public func readBuffer<T: Scalar>(of type: T.Type, at o: Int32) -> T {\n    let r = bb.read(def: T.self, position: Int(o &+ position))\n    return r\n  }\n\n  public func vector<T>(\n    at off: Int32,\n    count: Int,\n    size: Int) -> FlatbufferVector<T>\n  {\n    FlatbufferVector(\n      bb: bb,\n      startPosition: position &+ off,\n      count: count,\n      byteSize: size)\n  }\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Table.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\n#if canImport(Common)\nimport Common\n#endif\n\n/// `Table` is a Flatbuffers object that can read,\n/// mutate scalar fields within a valid flatbuffers buffer\n@frozen\npublic struct Table {\n\n  /// Hosting Bytebuffer\n  public private(set) var bb: ByteBuffer\n  /// Current position of the table within the buffer\n  public private(set) var position: Int32\n\n  /// Initializer for the table interface to allow generated code to read\n  /// data from memory\n  /// - Parameters:\n  ///   - bb: ByteBuffer that stores data\n  ///   - position: Current table position\n  /// - Note: This will `CRASH` if read on a big endian machine\n  public init(bb: ByteBuffer, position: Int32 = 0) {\n    guard isLitteEndian else {\n      fatalError(\n        \"Reading/Writing a buffer in big endian machine is not supported on swift\")\n    }\n    self.bb = bb\n    self.position = position\n  }\n\n  /// Gets the offset of the current field within the buffer by reading\n  /// the vtable\n  /// - Parameter o: current offset\n  /// - Returns: offset of field within buffer\n  public func offset(_ o: VOffset) -> Int32 {\n    let vtable = position &- bb.read(def: Int32.self, position: Int(position))\n    return o\n      < bb\n      .read(def: VOffset.self, position: Int(vtable))\n      ? Int32(\n        bb.read(\n          def: Int16.self,\n          position: Int(vtable &+ Int32(o)))) : 0\n  }\n\n  /// Gets the indirect offset of the current stored object\n  /// (applicable only for object arrays)\n  /// - Parameter o: current offset\n  /// - Returns: offset of field within buffer\n  public func indirect(_ o: Int32) -> Int32 {\n    o &+ bb.read(def: Int32.self, position: Int(o))\n  }\n\n  /// String reads from the buffer with respect to position of the current table.\n  /// - Parameter offset: Offset of the string\n  public func string(at offset: Int32) -> String? {\n    var offset = offset &+ position\n    offset &+= bb.read(def: Int32.self, position: Int(offset))\n    let count = bb.read(def: Int32.self, position: Int(offset))\n    let position = Int(offset) &+ MemoryLayout<Int32>.size\n    return bb.readString(at: position, count: Int(count))\n  }\n\n  /// Reads from the buffer with respect to the position in the table.\n  /// - Parameters:\n  ///   - type: Type of Element that needs to be read from the buffer\n  ///   - o: Offset of the Element\n  public func readBuffer<T>(of type: T.Type, at o: Int32) -> T {\n    bb.read(def: T.self, position: Int(o &+ position))\n  }\n\n  /// Returns that current `Union` object at a specific offset\n  /// by adding offset to the current position of table\n  /// - Parameter o: offset\n  /// - Returns: A flatbuffers object\n  public func union<T: FlatbuffersInitializable>(_ o: Int32) -> T {\n    let o = o &+ position\n    return directUnion(o)\n  }\n\n  /// Returns a direct `Union` object at a specific offset\n  /// - Parameter o: offset\n  /// - Returns: A flatbuffers object\n  public func directUnion<T: FlatbuffersInitializable>(_ o: Int32) -> T {\n    T.init(bb, o: o &+ bb.read(def: Int32.self, position: Int(o)))\n  }\n\n  /// Returns a vector of type T at a specific offset\n  /// This should only be used by `Scalars`\n  /// - Parameter off: Readable offset\n  /// - Returns: Returns a vector of type [T]\n  public func getVector<T>(at off: VOffset) -> [T]? {\n    let o = offset(off)\n    guard o != 0 else { return nil }\n    return bb.readSlice(index: Int(vector(at: o)), count: Int(vector(count: o)))\n  }\n\n  public func vector<T>(at off: VOffset, byteSize: Int) -> FlatbufferVector<T> {\n    let off = offset(off)\n    return FlatbufferVector(\n      bb: bb,\n      startPosition: vector(at: off),\n      count: Int(count(offset: off)),\n      byteSize: byteSize)\n  }\n\n  public func unionVector(\n    at off: VOffset,\n    byteSize: Int) -> UnionFlatbufferVector\n  {\n    let off = offset(off)\n    return UnionFlatbufferVector(\n      bb: bb,\n      startPosition: vector(at: off),\n      count: Int(count(offset: off)),\n      byteSize: byteSize)\n  }\n\n  private func count(offset: Int32) -> Int32 {\n    if offset == 0 {\n      return 0\n    }\n    return vector(count: offset)\n  }\n\n  /// Returns the underlying pointer to a vector within the buffer\n  /// This should only be used by `Scalars`\n  /// - Parameter off: Readable offset\n  /// - Returns: Returns a pointer to the underlying data\n  @inline(__always)\n  public func withUnsafePointerToSlice<T>(\n    at off: VOffset,\n    body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T?\n  {\n    let o = offset(off)\n    guard o != 0 else { return nil }\n    let count = Int(vector(count: o))\n    return try bb.withUnsafePointerToSlice(\n      index: Int(vector(at: o)),\n      count: count,\n      body: { try body($0, count) })\n  }\n\n  /// Vector count gets the count of Elements within the array\n  /// - Parameter o: start offset of the vector\n  /// - returns: Count of elements\n  public func vector(count o: Int32) -> Int32 {\n    var o = o\n    o &+= position\n    o &+= bb.read(def: Int32.self, position: Int(o))\n    return bb.read(def: Int32.self, position: Int(o))\n  }\n\n  /// Vector start index in the buffer\n  /// - Parameter o:start offset of the vector\n  /// - returns: the start index of the vector\n  public func vector(at o: Int32) -> Int32 {\n    var o = o\n    o &+= position\n    return o &+ bb.read(def: Int32.self, position: Int(o)) &+ 4\n  }\n\n  /// Reading an indirect offset of a table.\n  /// - Parameters:\n  ///   - o: position within the buffer\n  ///   - fbb: ByteBuffer\n  /// - Returns: table offset\n  static public func indirect(_ o: Int32, _ fbb: ByteBuffer) -> Int32 {\n    o &+ fbb.read(def: Int32.self, position: Int(o))\n  }\n\n  /// Gets a vtable value according to an table Offset and a field offset\n  /// - Parameters:\n  ///   - o: offset relative to entire buffer\n  ///   - vOffset: Field offset within a vtable\n  ///   - fbb: ByteBuffer\n  /// - Returns: an position of a field\n  @inline(__always)\n  static public func offset(\n    _ o: Int32,\n    vOffset: Int32,\n    fbb: inout FlatBufferBuilder) -> Int32\n  {\n    let vTable = Int32(fbb.capacity) &- o\n    return vTable\n      &+ Int32(\n        fbb.read(\n          def: Int16.self,\n          position: Int(\n            vTable &+ vOffset\n              &- fbb.read(\n                def: Int32.self,\n                position: Int(vTable)))))\n  }\n\n  /// Compares two objects at offset A and offset B within a ByteBuffer\n  /// - Parameters:\n  ///   - off1: first offset to compare\n  ///   - off2: second offset to compare\n  ///   - fbb: Bytebuffer\n  /// - Returns: returns the difference between\n  @inline(__always)\n  static public func compare(\n    _ off1: Int32,\n    _ off2: Int32,\n    fbb: inout FlatBufferBuilder) -> Int32\n  {\n    let memorySize = Int32(MemoryLayout<Int32>.size)\n    let _off1 = off1 &+ fbb.read(def: Int32.self, position: Int(off1))\n    let _off2 = off2 &+ fbb.read(def: Int32.self, position: Int(off2))\n    let len1 = fbb.read(def: Int32.self, position: Int(_off1))\n    let len2 = fbb.read(def: Int32.self, position: Int(_off2))\n    let startPos1 = _off1 &+ memorySize\n    let startPos2 = _off2 &+ memorySize\n    let minValue = min(len1, len2)\n    for i in 0...minValue {\n      let b1 = fbb.read(def: Int8.self, position: Int(i &+ startPos1))\n      let b2 = fbb.read(def: Int8.self, position: Int(i &+ startPos2))\n      if b1 != b2 {\n        return Int32(b2 &- b1)\n      }\n    }\n    return len1 &- len2\n  }\n\n  /// Compares two objects at offset A and array of `Bytes` within a ByteBuffer\n  /// - Parameters:\n  ///   - off1: Offset to compare to\n  ///   - key: bytes array to compare to\n  ///   - fbb: Bytebuffer\n  /// - Returns: returns the difference between\n  @inline(__always)\n  static public func compare(\n    _ off1: Int32,\n    _ key: [Byte],\n    fbb: inout FlatBufferBuilder) -> Int32\n  {\n    let memorySize = Int32(MemoryLayout<Int32>.size)\n    let _off1 = off1 &+ fbb.read(def: Int32.self, position: Int(off1))\n    let len1 = fbb.read(def: Int32.self, position: Int(_off1))\n    let len2 = Int32(key.count)\n    let startPos1 = _off1 &+ memorySize\n    let minValue = min(len1, len2)\n    for i in 0..<minValue {\n      let b = fbb.read(def: Int8.self, position: Int(i &+ startPos1))\n      let byte = key[Int(i)]\n      if b != byte {\n        return Int32(b &- Int8(byte))\n      }\n    }\n    return len1 &- len2\n  }\n\n  /// Gets a vtable value according to an table Offset and a field offset\n  /// - Parameters:\n  ///   - o: offset relative to entire buffer\n  ///   - vOffset: Field offset within a vtable\n  ///   - fbb: ByteBuffer\n  /// - Returns: an position of a field\n  @inline(__always)\n  static public func offset(\n    _ o: Int32,\n    vOffset: Int32,\n    fbb: ByteBuffer) -> Int32\n  {\n    let vTable = Int32(fbb.capacity) &- o\n    return vTable\n      &+ Int32(\n        fbb.read(\n          def: Int16.self,\n          position: Int(\n            vTable &+ vOffset\n              &- fbb.read(\n                def: Int32.self,\n                position: Int(vTable)))))\n  }\n\n  /// Compares two objects at offset A and offset B within a ByteBuffer\n  /// - Parameters:\n  ///   - off1: first offset to compare\n  ///   - off2: second offset to compare\n  ///   - fbb: Bytebuffer\n  /// - Returns: returns the difference between\n  @inline(__always)\n  static public func compare(\n    _ off1: Int32,\n    _ off2: Int32,\n    fbb: ByteBuffer) -> Int32\n  {\n    let memorySize = Int32(MemoryLayout<Int32>.size)\n    let _off1 = off1 &+ fbb.read(def: Int32.self, position: Int(off1))\n    let _off2 = off2 &+ fbb.read(def: Int32.self, position: Int(off2))\n    let len1 = fbb.read(def: Int32.self, position: Int(_off1))\n    let len2 = fbb.read(def: Int32.self, position: Int(_off2))\n    let startPos1 = _off1 &+ memorySize\n    let startPos2 = _off2 &+ memorySize\n    let minValue = min(len1, len2)\n    for i in 0...minValue {\n      let b1 = fbb.read(def: Int8.self, position: Int(i &+ startPos1))\n      let b2 = fbb.read(def: Int8.self, position: Int(i &+ startPos2))\n      if b1 != b2 {\n        return Int32(b2 &- b1)\n      }\n    }\n    return len1 &- len2\n  }\n\n  /// Compares two objects at offset A and array of `Bytes` within a ByteBuffer\n  /// - Parameters:\n  ///   - off1: Offset to compare to\n  ///   - key: bytes array to compare to\n  ///   - fbb: Bytebuffer\n  /// - Returns: returns the difference between\n  @inline(__always)\n  static public func compare(\n    _ off1: Int32,\n    _ key: [Byte],\n    fbb: ByteBuffer) -> Int32\n  {\n    let memorySize = Int32(MemoryLayout<Int32>.size)\n    let _off1 = off1 &+ fbb.read(def: Int32.self, position: Int(off1))\n    let len1 = fbb.read(def: Int32.self, position: Int(_off1))\n    let len2 = Int32(key.count)\n    let startPos1 = _off1 &+ memorySize\n    let minValue = min(len1, len2)\n    for i in 0..<minValue {\n      let b = fbb.read(def: Int8.self, position: Int(i &+ startPos1))\n      let byte = key[Int(i)]\n      if b != byte {\n        return Int32(b &- Int8(byte))\n      }\n    }\n    return len1 &- len2\n  }\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/TableVerifier.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\n/// `TableVerifier` verifies a table object is within a provided memory.\n/// It checks if all the objects for a specific generated table, are within\n/// the bounds of the buffer, aligned.\npublic struct TableVerifier {\n\n  /// position of current table in `ByteBuffer`\n  fileprivate var _position: Int\n\n  /// Current VTable position\n  fileprivate var _vtable: Int\n\n  /// Length of current VTable\n  fileprivate var _vtableLength: Int\n\n  /// `Verifier` object created in the base verifable call.\n  fileprivate var _verifier: Verifier\n\n  /// Creates a `TableVerifier` verifier that allows the Flatbuffer object\n  /// to verify the buffer before accessing any of the data.\n  ///\n  /// - Parameters:\n  ///   - position: Current table Position\n  ///   - vtable: Current `VTable` position\n  ///   - vtableLength: Current `VTable` length\n  ///   - verifier: `Verifier` Object  that caches the data of the verifiable object\n  internal init(\n    position: Int,\n    vtable: Int,\n    vtableLength: Int,\n    verifier: inout Verifier)\n  {\n    _position = position\n    _vtable = vtable\n    _vtableLength = vtableLength\n    _verifier = verifier\n  }\n\n  /// Dereference the current object position from the `VTable`\n  /// - Parameter field: Current VTable refrence to  position.\n  /// - Throws: A `FlatbuffersErrors` incase the voffset is not aligned/outOfBounds/apparentSizeTooLarge\n  /// - Returns: An optional position for current field\n  internal mutating func dereference(_ field: VOffset) throws -> Int? {\n    if field >= _vtableLength {\n      return nil\n    }\n\n    /// Reading the offset for the field needs to be read.\n    let offset: VOffset = try _verifier.getValue(\n      at: Int(clamping: _vtable &+ Int(field)))\n\n    if offset > 0 {\n      return Int(clamping: _position &+ Int(offset))\n    }\n    return nil\n  }\n\n  /// Visits all the fields within the table to validate the integrity\n  /// of the data\n  /// - Parameters:\n  ///   - field: voffset of the current field to be read\n  ///   - fieldName: fieldname to report data Errors.\n  ///   - required: If the field has to be available in the buffer\n  ///   - type: Type of field to be read\n  /// - Throws: A `FlatbuffersErrors` where the field is corrupt\n  public mutating func visit<T>(\n    field: VOffset,\n    fieldName: String,\n    required: Bool,\n    type: T.Type) throws where T: Verifiable\n  {\n    let derefValue = try dereference(field)\n\n    if let value = derefValue {\n      try T.verify(&_verifier, at: value, of: T.self)\n      return\n    }\n    if required {\n      throw FlatbuffersErrors.requiredFieldDoesntExist(\n        position: field,\n        name: fieldName)\n    }\n  }\n\n  /// Visits all the fields for a union object within the table to\n  /// validate the integrity of the data\n  /// - Parameters:\n  ///   - key: Current Key Voffset\n  ///   - field: Current field Voffset\n  ///   - unionKeyName: Union key name\n  ///   - fieldName: Field key name\n  ///   - required: indicates if an object is required to be present\n  ///   - completion: Completion is a handler that WILL be called in the generated\n  /// - Throws: A `FlatbuffersErrors` where the field is corrupt\n  public mutating func visit<T>(\n    unionKey key: VOffset,\n    unionField field: VOffset,\n    unionKeyName: String,\n    fieldName: String,\n    required: Bool,\n    completion: @escaping (inout Verifier, T, Int) throws -> Void) throws\n    where T: UnionEnum\n  {\n    let keyPos = try dereference(key)\n    let valPos = try dereference(field)\n\n    if keyPos == nil && valPos == nil {\n      if required {\n        throw FlatbuffersErrors.requiredFieldDoesntExist(\n          position: key,\n          name: unionKeyName)\n      }\n      return\n    }\n\n    if let _key = keyPos,\n       let _val = valPos\n    {\n      /// verifiying that the key is within the buffer\n      try T.T.verify(&_verifier, at: _key, of: T.T.self)\n      guard\n        let _enum = try T.init(\n          value: _verifier._buffer.read(\n            def: T.T.self,\n            position: _key))\n      else {\n        throw FlatbuffersErrors.unknownUnionCase\n      }\n      /// we are assuming that Unions will always be of type Uint8\n      try completion(\n        &_verifier,\n        _enum,\n        _val)\n      return\n    }\n    throw FlatbuffersErrors.valueNotFound(\n      key: keyPos,\n      keyName: unionKeyName,\n      field: valPos,\n      fieldName: fieldName)\n  }\n\n  /// Visits and validates all the objects within a union vector\n  /// - Parameters:\n  ///   - key: Current Key Voffset\n  ///   - field: Current field Voffset\n  ///   - unionKeyName: Union key name\n  ///   - fieldName: Field key name\n  ///   - required: indicates if an object is required to be present\n  ///   - completion: Completion is a handler that WILL be called in the generated\n  /// - Throws: A `FlatbuffersErrors` where the field is corrupt\n  public mutating func visitUnionVector<T>(\n    unionKey key: VOffset,\n    unionField field: VOffset,\n    unionKeyName: String,\n    fieldName: String,\n    required: Bool,\n    completion: @escaping (inout Verifier, T, Int) throws -> Void) throws\n    where T: UnionEnum\n  {\n    let keyVectorPosition = try dereference(key)\n    let offsetVectorPosition = try dereference(field)\n\n    if let keyPos = keyVectorPosition,\n       let valPos = offsetVectorPosition\n    {\n      try UnionVector<T>.verify(\n        &_verifier,\n        keyPosition: keyPos,\n        fieldPosition: valPos,\n        unionKeyName: unionKeyName,\n        fieldName: fieldName,\n        completion: completion)\n      return\n    }\n    if required {\n      throw FlatbuffersErrors.requiredFieldDoesntExist(\n        position: field,\n        name: fieldName)\n    }\n  }\n\n  /// Finishs the current Table verifier, and subtracts the current\n  /// table from the incremented depth.\n  public mutating func finish() {\n    _verifier.finish()\n  }\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Vectors/FlatbufferVector.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\npublic struct FlatbufferVector<\n  Element: FlatbuffersVectorInitializable\n>: RandomAccessCollection {\n  public typealias Element = Element\n  public typealias Index = Int\n\n  private let bb: ByteBuffer\n  private let byteSize: Int\n  private let startPosition: Int32\n  public let count: Int\n\n  init(\n    bb: ByteBuffer,\n    startPosition: Int32,\n    count: Int,\n    byteSize: Int)\n  {\n    self.bb = bb\n    self.byteSize = byteSize\n    self.count = count\n    self.startPosition = startPosition\n  }\n\n  public var startIndex: Int {\n    0\n  }\n\n  public var endIndex: Int {\n    count\n  }\n\n  public var isEmpty: Bool {\n    count == 0\n  }\n\n\n  public subscript(position: Int) -> Element {\n    guard position < count else {\n      fatalError(\n        \"Trying to read element at index \\(position) in a vector of size \\(count)\")\n    }\n    let index = startPosition &+ Int32(position &* byteSize)\n    return Element.readFrom(byteBuffer: bb, index: Int(index))\n  }\n\n  public func index(after i: Int) -> Int {\n    guard i < count else { return count }\n    return i &+ 1\n  }\n}\n\nextension FlatbufferVector: Encodable where Element: Encodable {\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.unkeyedContainer()\n    for element in self {\n      try container.encode(element)\n    }\n  }\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Vectors/FlatbuffersVectorInitializable.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\n#if canImport(Common)\nimport Common\n#endif\n\npublic protocol FlatbuffersVectorInitializable {\n  static func readFrom(byteBuffer: ByteBuffer, index: Int) -> Self\n}\n\nextension Scalar where Self: FlatbuffersVectorInitializable {\n  public static func readFrom(byteBuffer: ByteBuffer, index: Int) -> Self {\n    byteBuffer.read(def: Self.self, position: index)\n  }\n}\n\nextension NativeStruct where Self: FlatbuffersVectorInitializable {\n  public static func readFrom(byteBuffer: ByteBuffer, index: Int) -> Self {\n    byteBuffer.read(def: Self.self, position: index)\n  }\n}\n\nextension FlatBufferStruct {\n  public static func readFrom(byteBuffer: ByteBuffer, index: Int) -> Self {\n    Self.init(byteBuffer, o: Int32(index))\n  }\n}\n\nextension FlatBufferTable {\n  public static func readFrom(byteBuffer: ByteBuffer, index: Int) -> Self {\n    return Self.init(\n      byteBuffer,\n      o: Int32(index) &+ byteBuffer.read(def: Int32.self, position: index))\n  }\n}\n\nextension Optional: FlatbuffersVectorInitializable where Wrapped == String {\n  public static func readFrom(byteBuffer: ByteBuffer, index: Int) -> Self {\n    var index = Int32(index)\n    index &+= byteBuffer.read(def: Int32.self, position: Int(index))\n    let count = byteBuffer.read(def: Int32.self, position: Int(index))\n    let position = Int(index) &+ MemoryLayout<Int32>.size\n    return byteBuffer.readString(at: position, count: Int(count))\n  }\n}\n\nextension Enum where Self: FlatbuffersVectorInitializable {\n  public static func readFrom(byteBuffer: ByteBuffer, index: Int) -> Self {\n    Self\n      .init(rawValue: byteBuffer.read(def: Self.T.self, position: index)) ??\n      Self.min\n  }\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Vectors/UnionFlatbufferVector.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\npublic struct UnionFlatbufferVector {\n\n  private let bb: ByteBuffer\n  private let byteSize: Int\n  private let startPosition: Int32\n  public let count: Int\n\n  init(\n    bb: ByteBuffer,\n    startPosition: Int32,\n    count: Int,\n    byteSize: Int)\n  {\n    self.bb = bb\n    self.byteSize = byteSize\n    self.count = count\n    self.startPosition = startPosition\n  }\n\n  public var startIndex: Int {\n    0\n  }\n\n  public var endIndex: Int {\n    count\n  }\n\n  public var isEmpty: Bool {\n    count == 0\n  }\n\n  public subscript(\n    position: Int,\n    Type: FlatbuffersVectorInitializable\n      .Type) -> FlatbuffersVectorInitializable\n  {\n    guard position < count else {\n      fatalError(\n        \"Trying to read element at index \\(position) in a vector of size \\(count)\")\n    }\n    let index = startPosition &+ Int32(position &* byteSize)\n    return Type.readFrom(byteBuffer: bb, index: Int(index))\n  }\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/VeriferOptions.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\n/// `VerifierOptions` is a set of options to verify a flatbuffer\npublic struct VerifierOptions {\n\n  /// Maximum `Apparent` size if the buffer can be expanded into a DAG tree\n  internal var _maxApparentSize: UOffset\n\n  /// Maximum table count allowed in a buffer\n  internal var _maxTableCount: UOffset\n\n  /// Maximum depth allowed in a buffer\n  internal var _maxDepth: UOffset\n\n  /// Ignoring missing null terminals in strings\n  internal var _ignoreMissingNullTerminators: Bool\n\n  /// initializes the set of options for the verifier\n  /// - Parameters:\n  ///   - maxDepth: Maximum depth allowed in a buffer\n  ///   - maxTableCount: Maximum table count allowed in a buffer\n  ///   - maxApparentSize: Maximum `Apparent` size if the buffer can be expanded into a DAG tree\n  ///   - ignoreMissingNullTerminators: Ignoring missing null terminals in strings *Currently not supported in swift*\n  public init(\n    maxDepth: UOffset = 64,\n    maxTableCount: UOffset = 1_000_000,\n    maxApparentSize: UOffset = 1 << 31,\n    ignoreMissingNullTerminators: Bool = false)\n  {\n    _maxDepth = maxDepth\n    _maxTableCount = maxTableCount\n    _maxApparentSize = maxApparentSize\n    _ignoreMissingNullTerminators = ignoreMissingNullTerminators\n  }\n\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Verifiable.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\n#if canImport(Common)\nimport Common\n#endif\n\n/// Verifiable is a protocol all swift flatbuffers object should conform to,\n/// since swift is similar to `cpp` and `rust` where the data is read directly\n/// from `unsafeMemory` thus the need to verify if the buffer received is a valid one\npublic protocol Verifiable {\n\n  /// Verifies that the current value is which the bounds of the buffer, and if\n  /// the current `Value` is aligned properly\n  /// - Parameters:\n  ///   - verifier: Verifier that hosts the buffer\n  ///   - position: Current position within the buffer\n  ///   - type: The type of the object to be verified\n  /// - Throws: Errors coming from `inBuffer` function\n  static func verify<T>(\n    _ verifier: inout Verifier,\n    at position: Int,\n    of type: T.Type) throws where T: Verifiable\n}\n\nextension Verifiable {\n\n  /// Verifies if the current range to be read is within the bounds of the buffer,\n  /// and if the range is properly aligned\n  /// - Parameters:\n  ///   - verifier: Verifier that hosts the buffer\n  ///   - position: Current position within the buffer\n  ///   - type: The type of the object to be verified\n  /// - Throws: Erros thrown from `isAligned` & `rangeInBuffer`\n  /// - Returns: a tuple of the start position and the count of objects within the range\n  @discardableResult\n  public static func verifyRange<T>(\n    _ verifier: inout Verifier,\n    at position: Int, of type: T.Type) throws -> (start: Int, count: Int)\n  {\n    let len: UOffset = try verifier.getValue(at: position)\n    let intLen = Int(len)\n    let start = Int(clamping: (position &+ MemoryLayout<Int32>.size).magnitude)\n    try verifier.isAligned(position: start, type: type.self)\n    try verifier.rangeInBuffer(position: start, size: intLen)\n    return (start, intLen)\n  }\n}\n\nextension Verifiable where Self: Scalar {\n\n  /// Verifies that the current value is which the bounds of the buffer, and if\n  /// the current `Value` is aligned properly\n  /// - Parameters:\n  ///   - verifier: Verifier that hosts the buffer\n  ///   - position: Current position within the buffer\n  ///   - type: The type of the object to be verified\n  /// - Throws: Errors coming from `inBuffer` function\n  public static func verify<T>(\n    _ verifier: inout Verifier,\n    at position: Int,\n    of type: T.Type) throws where T: Verifiable\n  {\n    try verifier.inBuffer(position: position, of: type.self)\n  }\n}\n\n// MARK: - ForwardOffset\n\n/// ForwardOffset is a container to wrap around the Generic type to be verified\n/// from the flatbuffers object.\npublic enum ForwardOffset<U>: Verifiable where U: Verifiable {\n\n  /// Verifies that the current value is which the bounds of the buffer, and if\n  /// the current `Value` is aligned properly\n  /// - Parameters:\n  ///   - verifier: Verifier that hosts the buffer\n  ///   - position: Current position within the buffer\n  ///   - type: The type of the object to be verified\n  /// - Throws: Errors coming from `inBuffer` function\n  public static func verify<T>(\n    _ verifier: inout Verifier,\n    at position: Int,\n    of type: T.Type) throws where T: Verifiable\n  {\n    let offset: UOffset = try verifier.getValue(at: position)\n    let nextOffset = Int(clamping: (Int(offset) &+ position).magnitude)\n    try U.verify(&verifier, at: nextOffset, of: U.self)\n  }\n}\n\n// MARK: - Vector\n\n/// Vector is a container to wrap around the Generic type to be verified\n/// from the flatbuffers object.\npublic enum Vector<U, S>: Verifiable where U: Verifiable, S: Verifiable {\n\n  /// Verifies that the current value is which the bounds of the buffer, and if\n  /// the current `Value` is aligned properly\n  /// - Parameters:\n  ///   - verifier: Verifier that hosts the buffer\n  ///   - position: Current position within the buffer\n  ///   - type: The type of the object to be verified\n  /// - Throws: Errors coming from `inBuffer` function\n  public static func verify<T>(\n    _ verifier: inout Verifier,\n    at position: Int,\n    of type: T.Type) throws where T: Verifiable\n  {\n    /// checks if the next verification type S is equal to U of type forwardOffset\n    /// This had to be done since I couldnt find a solution for duplicate call functions\n    /// A fix will be appreciated\n    if U.self is ForwardOffset<S>.Type {\n      let range = try verifyRange(&verifier, at: position, of: UOffset.self)\n      for index in stride(\n        from: range.start,\n        to: Int(\n          clamping: range\n            .start &+ (range.count &* MemoryLayout<Int32>.size)),\n        by: MemoryLayout<UOffset>.size)\n      {\n        try U.verify(&verifier, at: index, of: U.self)\n      }\n    } else {\n      try S.verifyRange(&verifier, at: position, of: S.self)\n    }\n  }\n}\n\n// MARK: - UnionVector\n\n/// UnionVector is a container to wrap around the Generic type to be verified\n/// from the flatbuffers object.\npublic enum UnionVector<S> where S: UnionEnum {\n\n  /// Completion handler for the function Verify, that passes the verifier\n  /// enum type and position of union field\n  public typealias Completion = (inout Verifier, S, Int) throws -> Void\n\n  /// Verifies if the current range to be read is within the bounds of the buffer,\n  /// and if the range is properly aligned. It also verifies if the union type is a\n  /// *valid/supported* union type.\n  /// - Parameters:\n  ///   - verifier: Verifier that hosts the buffer\n  ///   - keyPosition: Current union key position within the buffer\n  ///   - fieldPosition: Current union field position within the buffer\n  ///   - unionKeyName: Name of key to written if error is presented\n  ///   - fieldName: Name of field to written if error is presented\n  ///   - completion: Completion is a handler that WILL be called in the generated\n  ///   code to verify the actual objects\n  /// - Throws: FlatbuffersErrors\n  public static func verify(\n    _ verifier: inout Verifier,\n    keyPosition: Int,\n    fieldPosition: Int,\n    unionKeyName: String,\n    fieldName: String,\n    completion: @escaping Completion) throws\n  {\n    /// Get offset for union key vectors and offset vectors\n    let keyOffset: UOffset = try verifier.getValue(at: keyPosition)\n    let fieldOffset: UOffset = try verifier.getValue(at: fieldPosition)\n\n    /// Check if values are within the buffer, returns the start position of vectors, and vector counts\n    /// Using &+ is safe since we already verified that the value is within the buffer, where the max is\n    /// going to be 2Gib and swift supports Int64 by default\n    let keysRange = try S.T.verifyRange(\n      &verifier,\n      at: Int(keyOffset) &+ keyPosition,\n      of: S.T.self)\n    let offsetsRange = try UOffset.verifyRange(\n      &verifier,\n      at: Int(fieldOffset) &+ fieldPosition,\n      of: UOffset.self)\n\n    guard keysRange.count == offsetsRange.count else {\n      throw FlatbuffersErrors.unionVectorSize(\n        keyVectorSize: keysRange.count,\n        fieldVectorSize: offsetsRange.count,\n        unionKeyName: unionKeyName,\n        fieldName: fieldName)\n    }\n\n    var count = 0\n    /// Iterate over the vector of keys and offsets.\n    while count < keysRange.count {\n\n      /// index of readable enum value in array\n      let keysIndex = MemoryLayout<S.T>.size &* count\n      guard\n        let _enum = try S.init(\n          value: verifier._buffer.read(\n            def: S.T.self,\n            position: keysRange.start &+ keysIndex))\n      else {\n        throw FlatbuffersErrors.unknownUnionCase\n      }\n      /// index of readable offset value in array\n      let fieldIndex = MemoryLayout<UOffset>.size &* count\n      try completion(&verifier, _enum, offsetsRange.start &+ fieldIndex)\n      count &+= 1\n    }\n  }\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/Verifier.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\n/// Verifier that check if the buffer passed into it is a valid,\n/// safe, aligned Flatbuffers object since swift read from `unsafeMemory`\npublic struct Verifier {\n\n  /// Flag to check for alignment if true\n  fileprivate let _checkAlignment: Bool\n  /// Storage for all changing values within the verifier\n  private let storage: Storage\n  /// Current verifiable ByteBuffer\n  internal var _buffer: ByteBuffer\n  /// Options for verification\n  internal let _options: VerifierOptions\n\n  /// Current stored capacity within the verifier\n  var capacity: Int {\n    storage.capacity\n  }\n\n  /// Current depth of verifier\n  var depth: Int {\n    storage.depth\n  }\n\n  /// Current table count\n  var tableCount: Int {\n    storage.tableCount\n  }\n\n  /// Initializer for the verifier\n  /// - Parameters:\n  ///   - buffer: Bytebuffer that is required to be verified\n  ///   - options: `VerifierOptions` that set the rule for some of the verification done\n  ///   - checkAlignment: If alignment check is required to be preformed\n  /// - Throws: `exceedsMaxSizeAllowed` if capacity of the buffer is more than 2GiB\n  public init(\n    buffer: inout ByteBuffer,\n    options: VerifierOptions = .init(),\n    checkAlignment: Bool = true) throws\n  {\n    guard buffer.capacity < FlatBufferMaxSize else {\n      throw FlatbuffersErrors.exceedsMaxSizeAllowed\n    }\n\n    _buffer = buffer\n    _checkAlignment = checkAlignment\n    _options = options\n    storage = Storage(capacity: buffer.capacity)\n  }\n\n  /// Resets the verifier to initial state\n  public func reset() {\n    storage.depth = 0\n    storage.tableCount = 0\n  }\n\n  /// Checks if the value of type `T` is aligned properly in the buffer\n  /// - Parameters:\n  ///   - position: Current position\n  ///   - type: Type of value to check\n  /// - Throws: `missAlignedPointer` if the pointer is not aligned properly\n  public func isAligned<T>(position: Int, type: T.Type) throws {\n\n    /// If check alignment is false this mutating function doesnt continue\n    if !_checkAlignment { return }\n\n    /// advance pointer to position X\n    try _buffer.withUnsafeBytes { pointer in\n      let ptr = pointer.baseAddress!.advanced(by: position)\n\n      /// Check if the pointer is aligned\n      if Int(bitPattern: ptr) & (MemoryLayout<T>.alignment &- 1) == 0 {\n        return\n      }\n\n      throw FlatbuffersErrors.missAlignedPointer(\n        position: position,\n        type: String(describing: T.self))\n    }\n  }\n\n  /// Checks if the value of Size \"X\" is within the range of the buffer\n  /// - Parameters:\n  ///   - position: Current position to be read\n  ///   - size: `Byte` Size of readable object within the buffer\n  /// - Throws: `outOfBounds` if the value is out of the bounds of the buffer\n  /// and `apparentSizeTooLarge` if the apparent size is bigger than the one specified\n  /// in `VerifierOptions`\n  public func rangeInBuffer(position: Int, size: Int) throws {\n    let end = UInt(clamping: (position &+ size).magnitude)\n    if end > _buffer.capacity {\n      throw FlatbuffersErrors.outOfBounds(position: end, end: storage.capacity)\n    }\n    storage.apparentSize = storage.apparentSize &+ UInt32(size)\n    if storage.apparentSize > _options._maxApparentSize {\n      throw FlatbuffersErrors.apparentSizeTooLarge\n    }\n  }\n\n  /// Validates if a value of type `T` is aligned and within the bounds of\n  /// the buffer\n  /// - Parameters:\n  ///   - position: Current readable position\n  ///   - type: Type of value to check\n  /// - Throws: FlatbuffersErrors\n  public func inBuffer<T>(position: Int, of type: T.Type) throws {\n    try isAligned(position: position, type: type)\n    try rangeInBuffer(position: position, size: MemoryLayout<T>.size)\n  }\n\n  /// Visits a table at the current position and validates if the table meets\n  /// the rules specified in the `VerifierOptions`\n  /// - Parameter position: Current position to be read\n  /// - Throws: FlatbuffersErrors\n  /// - Returns: A `TableVerifier` at the current readable table\n  public mutating func visitTable(at position: Int) throws -> TableVerifier {\n    let vtablePosition = try derefOffset(position: position)\n    let vtableLength: VOffset = try getValue(at: vtablePosition)\n\n    let length = Int(vtableLength)\n    try isAligned(\n      position: Int(clamping: (vtablePosition &+ length).magnitude),\n      type: VOffset.self)\n    try rangeInBuffer(position: vtablePosition, size: length)\n\n    storage.tableCount &+= 1\n\n    if storage.tableCount > _options._maxTableCount {\n      throw FlatbuffersErrors.maximumTables\n    }\n\n    storage.depth &+= 1\n\n    if storage.depth > _options._maxDepth {\n      throw FlatbuffersErrors.maximumDepth\n    }\n\n    return TableVerifier(\n      position: position,\n      vtable: vtablePosition,\n      vtableLength: length,\n      verifier: &self)\n  }\n\n  /// Validates if a value of type `T` is within the buffer and returns it\n  /// - Parameter position: Current position to be read\n  /// - Throws: `inBuffer` errors\n  /// - Returns: a value of type `T` usually a `VTable` or a table offset\n  internal func getValue<T>(at position: Int) throws -> T {\n    try inBuffer(position: position, of: T.self)\n    return _buffer.read(def: T.self, position: position)\n  }\n\n  /// derefrences an offset within a vtable to get the position of the field\n  /// in the bytebuffer\n  /// - Parameter position: Current readable position\n  /// - Throws: `inBuffer` errors & `signedOffsetOutOfBounds`\n  /// - Returns: Current readable position for a field\n  @inline(__always)\n  internal func derefOffset(position: Int) throws -> Int {\n    try inBuffer(position: position, of: Int32.self)\n\n    let offset = _buffer.read(def: Int32.self, position: position)\n    // switching to int32 since swift's default Int is int64\n    // this should be safe since we already checked if its within\n    // the buffer\n    let _int32Position = UInt32(position)\n\n    let reportedOverflow: (partialValue: UInt32, overflow: Bool)\n    if offset > 0 {\n      reportedOverflow =\n        _int32Position\n          .subtractingReportingOverflow(offset.magnitude)\n    } else {\n      reportedOverflow =\n        _int32Position\n          .addingReportingOverflow(offset.magnitude)\n    }\n\n    /// since `subtractingReportingOverflow` & `addingReportingOverflow` returns true,\n    /// if there is overflow we return failure\n    if reportedOverflow.overflow\n      || reportedOverflow.partialValue\n      > _buffer\n      .capacity\n    {\n      throw FlatbuffersErrors.signedOffsetOutOfBounds(\n        offset: Int(offset),\n        position: position)\n    }\n\n    return Int(reportedOverflow.partialValue)\n  }\n\n  /// finishes the current iteration of verification on an object\n  internal func finish() {\n    storage.depth -= 1\n  }\n\n  @inline(__always)\n  func verify(id: String) throws {\n    let size = MemoryLayout<Int32>.size\n    guard storage.capacity >= (size &* 2) else {\n      throw FlatbuffersErrors.bufferDoesntContainID\n    }\n    let str = _buffer.readString(at: size, count: size)\n    if id == str {\n      return\n    }\n    throw FlatbuffersErrors.bufferIdDidntMatchPassedId\n  }\n\n  final private class Storage {\n    /// Current ApparentSize\n    fileprivate var apparentSize: UOffset = 0\n    /// Amount of tables present within a buffer\n    fileprivate var tableCount = 0\n    /// Capacity of the current buffer\n    fileprivate let capacity: Int\n    /// Current reached depth within the buffer\n    fileprivate var depth = 0\n\n    init(capacity: Int) {\n      self.capacity = capacity\n    }\n  }\n}\n"
  },
  {
    "path": "swift/Sources/FlatBuffers/_InternalByteBuffer.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\n#if canImport(Common)\nimport Common\n#endif\n\n/// `ByteBuffer` is the interface that stores the data for a `Flatbuffers` object\n/// it allows users to Construct their buffers internally without much cost to performance\n@usableFromInline\nstruct _InternalByteBuffer {\n\n  /// Storage is a container that would hold the memory pointer to solve the issue of\n  /// deallocating the memory that was held by (memory: UnsafeMutableRawPointer)\n  @usableFromInline\n  final class Storage {\n    /// pointer to the start of the buffer object in memory\n    private(set) var memory: UnsafeMutableRawPointer\n\n    @usableFromInline\n    init(count: Int, alignment: Int) {\n      memory = UnsafeMutableRawPointer.allocate(\n        byteCount: count,\n        alignment: alignment)\n    }\n\n    deinit {\n      memory.deallocate()\n    }\n\n    @usableFromInline\n    func initialize(for size: Int) {\n      memset(memory, 0, size)\n    }\n\n    /// Reallocates the buffer incase the object to be written doesnt fit in the current buffer\n    /// - Parameter size: Size of the current object\n    @usableFromInline\n    func reallocate(\n      capacity: Int,\n      writerSize: Int,\n      currentWritingIndex: Int,\n      alignment: Int)\n    {\n      let newData = UnsafeMutableRawPointer.allocate(\n        byteCount: capacity,\n        alignment: alignment)\n      memset(newData, 0, capacity &- writerSize)\n      memcpy(\n        newData.advanced(by: capacity &- writerSize),\n        memory.advanced(by: currentWritingIndex),\n        writerSize)\n      memory.deallocate()\n      memory = newData\n    }\n  }\n\n  @usableFromInline var _storage: Storage\n\n  private let initialSize: Int\n  /// The size of the elements written to the buffer + their paddings\n  private var _writerSize: Int = 0\n  /// Alignment of the current  memory being written to the buffer\n  var alignment = 1\n  /// Current Index which is being used to write to the buffer, it is written from the end to the start of the buffer\n  var writerIndex: Int { capacity &- _writerSize }\n\n  /// Reader is the position of the current Writer Index (capacity - size)\n  public var reader: Int { writerIndex }\n  /// Current size of the buffer\n  public var size: UOffset { UOffset(_writerSize) }\n  /// Public Pointer to the buffer object in memory. This should NOT be modified for any reason\n  @usableFromInline\n  var memory: UnsafeMutableRawPointer { _storage.memory }\n  /// Current capacity for the buffer\n  public private(set) var capacity: Int\n\n  /// Constructor that creates a Flatbuffer instance with a size\n  /// - Parameter:\n  ///   - size: Length of the buffer\n  ///   - allowReadingUnalignedBuffers: allow reading from unaligned buffer\n  init(initialSize size: Int) {\n    initialSize = size.convertToPowerofTwo\n    capacity = initialSize\n    _storage = Storage(count: initialSize, alignment: alignment)\n    _storage.initialize(for: initialSize)\n  }\n\n  /// Fills the buffer with padding by adding to the writersize\n  /// - Parameter padding: Amount of padding between two to be serialized objects\n  @inline(__always)\n  @usableFromInline\n  mutating func fill(padding: Int) {\n    assert(padding >= 0, \"Fill should be larger than or equal to zero\")\n    ensureSpace(size: padding)\n    _writerSize = _writerSize &+ (MemoryLayout<UInt8>.size &* padding)\n  }\n\n  /// Adds an array of type Scalar to the buffer memory\n  /// - Parameter elements: An array of Scalars\n  @inline(__always)\n  @usableFromInline\n  mutating func push<T: Scalar>(elements: [T]) {\n    elements.withUnsafeBytes { ptr in\n      ensureSpace(size: ptr.count)\n      memcpy(\n        _storage.memory.advanced(by: writerIndex &- ptr.count),\n        ptr.baseAddress!,\n        ptr.count)\n      _writerSize = _writerSize &+ ptr.count\n    }\n  }\n\n  /// Adds an array of type Scalar to the buffer memory\n  /// - Parameter elements: An array of Scalars\n  @inline(__always)\n  @usableFromInline\n  mutating func push<T: NativeStruct>(elements: [T]) {\n    elements.withUnsafeBytes { ptr in\n      ensureSpace(size: ptr.count)\n      memcpy(\n        _storage.memory.advanced(by: writerIndex &- ptr.count),\n        ptr.baseAddress!,\n        ptr.count)\n      _writerSize = _writerSize &+ ptr.count\n    }\n  }\n\n  /// Adds a `ContiguousBytes` to buffer memory\n  /// - Parameter value: bytes to copy\n  #if !os(WASI)\n  @inline(__always)\n  @usableFromInline\n  mutating func push(bytes: ContiguousBytes) {\n    bytes.withUnsafeBytes { ptr in\n      ensureSpace(size: ptr.count)\n      memcpy(\n        _storage.memory.advanced(by: writerIndex &- ptr.count),\n        ptr.baseAddress!,\n        ptr.count)\n      _writerSize = _writerSize &+ ptr.count\n    }\n  }\n  #endif\n\n  /// Adds an object of type NativeStruct into the buffer\n  /// - Parameters:\n  ///   - value: Object  that will be written to the buffer\n  ///   - size: size to subtract from the WriterIndex\n  @usableFromInline\n  @inline(__always)\n  mutating func push<T: NativeStruct>(struct value: T, size: Int) {\n    ensureSpace(size: size)\n    withUnsafePointer(to: value) {\n      memcpy(\n        _storage.memory.advanced(by: writerIndex &- size),\n        $0,\n        size)\n      _writerSize = _writerSize &+ size\n    }\n  }\n\n  /// Adds an object of type Scalar into the buffer\n  /// - Parameters:\n  ///   - value: Object  that will be written to the buffer\n  ///   - len: Offset to subtract from the WriterIndex\n  @inline(__always)\n  @usableFromInline\n  mutating func push<T: Scalar>(value: T, len: Int) {\n    ensureSpace(size: len)\n    withUnsafePointer(to: value) {\n      memcpy(\n        _storage.memory.advanced(by: writerIndex &- len),\n        $0,\n        len)\n      _writerSize = _writerSize &+ len\n    }\n  }\n\n  /// Adds a RawPointer into the buffer\n  /// - Parameter pointer: pointer to be copied into the buffer\n  /// - Parameter len: length of the data\n  @inline(__always)\n  mutating func writeBytes(_ ptr: UnsafeRawPointer, len: Int) {\n    ensureSpace(size: len)\n    memcpy(\n      _storage.memory.advanced(by: writerIndex &- len),\n      ptr,\n      len)\n    _writerSize = _writerSize &+ len\n  }\n\n  /// Write stores an object into the buffer directly or indirectly.\n  ///\n  /// Direct: ignores the capacity of buffer which would mean we are referring to the direct point in memory\n  /// indirect: takes into respect the current capacity of the buffer (capacity - index), writing to the buffer from the end\n  /// - Parameters:\n  ///   - value: Value that needs to be written to the buffer\n  ///   - index: index to write to\n  ///   - direct: Should take into consideration the capacity of the buffer\n  @inline(__always)\n  func write<T>(value: T, index: Int, direct: Bool = false) {\n    var index = index\n    if !direct {\n      index = capacity &- index\n    }\n    assert(index < capacity, \"Write index is out of writing bound\")\n    assert(index >= 0, \"Writer index should be above zero\")\n    _ = withUnsafePointer(to: value) {\n      memcpy(\n        _storage.memory.advanced(by: index),\n        $0,\n        MemoryLayout<T>.size)\n    }\n  }\n\n  /// Makes sure that buffer has enouch space for each of the objects that will be written into it\n  /// - Parameter size: size of object\n  @discardableResult\n  @usableFromInline\n  mutating func ensureSpace(size: Int) -> Int {\n    let expectedWriterIndex = size &+ _writerSize\n    if expectedWriterIndex > capacity {\n\n      let currentWritingIndex = capacity &- _writerSize\n      while capacity <= expectedWriterIndex {\n        capacity = capacity << 1\n      }\n\n      /// solution take from Apple-NIO\n      capacity = capacity.convertToPowerofTwo\n\n      _storage.reallocate(\n        capacity: capacity,\n        writerSize: _writerSize,\n        currentWritingIndex: currentWritingIndex,\n        alignment: alignment)\n    }\n    assert(size < FlatBufferMaxSize, \"Buffer can't grow beyond 2 Gigabytes\")\n    return size\n  }\n\n  /// pops the written VTable if it's already written into the buffer\n  /// - Parameter size: size of the `VTable`\n  @usableFromInline\n  @inline(__always)\n  mutating func pop(_ size: Int) {\n    assert(\n      (_writerSize &- size) > 0,\n      \"New size should NOT be a negative number\")\n    memset(_storage.memory.advanced(by: writerIndex), 0, _writerSize &- size)\n    _writerSize = size\n  }\n\n  /// Clears the current size of the buffer\n  @inline(__always)\n  mutating public func clearSize() {\n    _writerSize = 0\n  }\n\n  /// Clears the current instance of the buffer, replacing it with new memory\n  @inline(__always)\n  mutating public func clear(keepingCapacity: Bool = false) {\n    _writerSize = 0\n    alignment = 1\n    if keepingCapacity {\n      _storage.initialize(for: capacity)\n    } else {\n      capacity = initialSize\n      _storage = Storage(count: initialSize, alignment: alignment)\n    }\n  }\n\n  /// Reads an object from the buffer\n  /// - Parameters:\n  ///   - def: Type of the object\n  ///   - position: the index of the object in the buffer\n  @inline(__always)\n  public func read<T>(def: T.Type, position: Int) -> T {\n    _storage.memory\n      .advanced(by: position)\n      .bindMemory(to: T.self, capacity: 1)\n      .pointee\n  }\n\n  @discardableResult\n  @inline(__always)\n  func withUnsafeBytes<T>(\n    _ body: (UnsafeRawBufferPointer) throws\n      -> T) rethrows -> T\n  {\n    try body(\n      UnsafeRawBufferPointer(\n        start: _storage.memory,\n        count: capacity))\n  }\n\n  @discardableResult\n  @inline(__always)\n  func withUnsafeSlicedBytes<T>(\n    _ body: (UnsafeRawBufferPointer) throws\n      -> T) rethrows -> T\n  {\n    try body(\n      UnsafeRawBufferPointer(\n        start: _storage.memory.advanced(by: writerIndex),\n        count: capacity &- writerIndex))\n  }\n\n  @discardableResult\n  @inline(__always)\n  func withUnsafeRawPointer<T>(\n    _ body: (UnsafeMutableRawPointer) throws\n      -> T) rethrows -> T\n  {\n    try body(_storage.memory)\n  }\n\n  @discardableResult\n  @inline(__always)\n  func readWithUnsafeRawPointer<T>(\n    position: Int,\n    _ body: (UnsafeRawPointer) throws -> T) rethrows -> T\n  {\n    try body(_storage.memory.advanced(by: position))\n  }\n}\n\nextension _InternalByteBuffer: CustomDebugStringConvertible {\n\n  public var debugDescription: String {\n    \"\"\"\n    buffer located at: \\(_storage.memory), with capacity of \\(capacity)\n    { writerSize: \\(_writerSize), readerSize: \\(reader), writerIndex: \\(\n      writerIndex) }\n    \"\"\"\n  }\n}\n"
  },
  {
    "path": "swift/Sources/FlexBuffers/ByteBuffer.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\n/// `ByteBuffer` is the interface that stores the data for a `Flatbuffers` object\n/// it allows users to write and read data directly from memory thus the use of its\n/// functions should be used\n@frozen\npublic struct ByteBuffer {\n\n  /// Storage is a container that would hold the memory pointer to solve the issue of\n  /// deallocating the memory that was held by (memory: UnsafeMutableRawPointer)\n  @usableFromInline\n  final class Storage {\n    @usableFromInline\n    enum Blob {\n      #if !os(WASI)\n      case data(Data)\n      case bytes(ContiguousBytes)\n      #endif\n\n      case byteBuffer(_InternalByteBuffer)\n      case array([UInt8])\n      case pointer(UnsafeMutableRawPointer)\n    }\n\n    /// This storage doesn't own the memory, therefore, we won't deallocate on deinit.\n    private let isOwned: Bool\n    /// Capacity of UInt8 the buffer can hold\n    private let capacity: Int\n    /// Retained blob of data that requires the storage to retain a pointer to.\n    @usableFromInline\n    var retainedBlob: Blob\n\n    @usableFromInline\n    init(count: Int) {\n      let memory = UnsafeMutableRawPointer.allocate(\n        byteCount: count,\n        alignment: MemoryLayout<UInt8>.alignment)\n      capacity = count\n      retainedBlob = .pointer(memory)\n      isOwned = true\n    }\n\n    @usableFromInline\n    init(blob: Blob, capacity count: Int) {\n      capacity = count\n      retainedBlob = blob\n      isOwned = false\n    }\n\n    deinit {\n      guard isOwned else { return }\n      switch retainedBlob {\n      case .pointer(let unsafeMutableRawPointer):\n        unsafeMutableRawPointer.deallocate()\n      default: break\n      }\n    }\n\n    @usableFromInline\n    func copy(from ptr: UnsafeRawPointer, count: Int) {\n      assert(\n        isOwned,\n        \"copy should NOT be called on a buffer that is built by assumingMemoryBound\")\n      withUnsafeRawPointer {\n        $0.copyMemory(from: ptr, byteCount: count)\n      }\n    }\n\n    @usableFromInline\n    func initialize(for size: Int) {\n      assert(\n        isOwned,\n        \"initalize should NOT be called on a buffer that is built by assumingMemoryBound\")\n      withUnsafeRawPointer {\n        memset($0, 0, size)\n      }\n    }\n\n    @discardableResult\n    @inline(__always)\n    func withUnsafeBytes<T>(\n      _ body: (UnsafeRawBufferPointer) throws\n        -> T) rethrows -> T\n    {\n      switch retainedBlob {\n      case .byteBuffer(let byteBuffer):\n        return try byteBuffer.withUnsafeBytes(body)\n      #if !os(WASI)\n      case .data(let data):\n        return try data.withUnsafeBytes(body)\n      case .bytes(let contiguousBytes):\n        return try contiguousBytes.withUnsafeBytes(body)\n      #endif\n      case .array(let array):\n        return try array.withUnsafeBytes(body)\n      case .pointer(let ptr):\n        return try body(UnsafeRawBufferPointer(start: ptr, count: capacity))\n      }\n    }\n\n    @discardableResult\n    @inline(__always)\n    func withUnsafeRawPointer<T>(\n      _ body: (UnsafeMutableRawPointer) throws\n        -> T) rethrows -> T\n    {\n      switch retainedBlob {\n      case .byteBuffer(let byteBuffer):\n        return try byteBuffer.withUnsafeRawPointer(body)\n      #if !os(WASI)\n      case .data(let data):\n        return\n          try data\n            .withUnsafeBytes {\n              try body(UnsafeMutableRawPointer(mutating: $0.baseAddress!))\n            }\n      case .bytes(let contiguousBytes):\n        return\n          try contiguousBytes\n            .withUnsafeBytes {\n              try body(UnsafeMutableRawPointer(mutating: $0.baseAddress!))\n            }\n      #endif\n      case .array(let array):\n        return\n          try array\n            .withUnsafeBytes {\n              try body(UnsafeMutableRawPointer(mutating: $0.baseAddress!))\n            }\n      case .pointer(let ptr):\n        return try body(ptr)\n      }\n    }\n\n    @discardableResult\n    @inline(__always)\n    func readWithUnsafeRawPointer<T>(\n      position: Int,\n      _ body: (UnsafeRawPointer) throws -> T) rethrows -> T\n    {\n      switch retainedBlob {\n      case .byteBuffer(let byteBuffer):\n        return try byteBuffer.readWithUnsafeRawPointer(position: position, body)\n      #if !os(WASI)\n      case .data(let data):\n        return try data.withUnsafeBytes {\n          try body($0.baseAddress!.advanced(by: position))\n        }\n      case .bytes(let contiguousBytes):\n        return try contiguousBytes.withUnsafeBytes {\n          try body($0.baseAddress!.advanced(by: position))\n        }\n      #endif\n      case .array(let array):\n        return try array.withUnsafeBytes {\n          try body($0.baseAddress!.advanced(by: position))\n        }\n      case .pointer(let ptr):\n        return try body(ptr.advanced(by: position))\n      }\n    }\n  }\n\n  @usableFromInline var _storage: Storage\n\n  /// The size of the elements written to the buffer + their paddings\n  private var _readerIndex: Int = 0\n  /// Current size of the buffer\n  public var count: Int { _readerIndex }\n  /// Current capacity for the buffer including unused space\n  public let capacity: Int\n\n  /// Constructor that creates a Flatbuffer object from an InternalByteBuffer\n  /// - Parameter\n  ///   - bytes: Array of UInt8\n  @inline(__always)\n  init(byteBuffer: _InternalByteBuffer) {\n    _storage = Storage(\n      blob: .byteBuffer(byteBuffer),\n      capacity: byteBuffer.capacity)\n    _readerIndex = byteBuffer.writerIndex\n    capacity = byteBuffer.capacity\n  }\n\n  /// Constructor that creates a Flatbuffer from unsafe memory region by copying\n  /// the underlying data to a new pointer\n  ///\n  /// - Parameters:\n  ///   - copyingMemoryBound: The unsafe memory region\n  ///   - capacity: The size of the given memory region\n  @inline(__always)\n  public init(\n    copyingMemoryBound memory: UnsafeRawPointer,\n    capacity: Int)\n  {\n    _storage = Storage(count: capacity)\n    _storage.copy(from: memory, count: capacity)\n    _readerIndex = capacity\n    self.capacity = capacity\n  }\n\n  /// Constructor that creates a Flatbuffer object from a UInt8\n  /// - Parameter\n  ///   - bytes: Array of UInt8\n  @inline(__always)\n  public init(bytes: [UInt8]) {\n    _storage = Storage(blob: .array(bytes), capacity: bytes.count)\n    _readerIndex = bytes.count\n    capacity = bytes.count\n  }\n\n  #if !os(WASI)\n  /// Constructor that creates a Flatbuffer from the Swift Data type object\n  /// - Parameter\n  ///   - data: Swift data Object\n  @inline(__always)\n  public init(data: Data) {\n    _storage = Storage(blob: .data(data), capacity: data.count)\n    _readerIndex = data.count\n    capacity = data.count\n  }\n\n  /// Constructor that creates a Flatbuffer object from a ContiguousBytes\n  /// - Parameters:\n  ///   - contiguousBytes: Binary stripe to use as the buffer\n  ///   - count: amount of readable bytes\n  @inline(__always)\n  public init<Bytes: ContiguousBytes>(\n    contiguousBytes: Bytes,\n    count: Int)\n  {\n    _storage = Storage(blob: .bytes(contiguousBytes), capacity: count)\n    _readerIndex = count\n    capacity = count\n  }\n  #endif\n\n  /// Constructor that creates a Flatbuffer from unsafe memory region without copying\n  /// **NOTE** Needs a call to `memory.deallocate()` later on to free the memory\n  ///\n  /// - Parameters:\n  ///   - assumingMemoryBound: The unsafe memory region\n  ///   - capacity: The size of the given memory region\n  @inline(__always)\n  public init(\n    assumingMemoryBound memory: UnsafeMutableRawPointer,\n    capacity: Int)\n  {\n    _storage = Storage(\n      blob: .pointer(memory),\n      capacity: capacity)\n    _readerIndex = capacity\n    self.capacity = capacity\n  }\n\n  /// Creates a copy of the existing flatbuffer, by copying it to a different memory.\n  /// - Parameters:\n  ///   - memory: Current memory of the buffer\n  ///   - count: count of bytes\n  ///   - removeBytes: Removes a number of bytes from the current size\n  @inline(__always)\n  init(\n    blob: Storage.Blob,\n    count: Int,\n    removing removeBytes: Int)\n  {\n    _storage = Storage(blob: blob, capacity: count)\n    _readerIndex = removeBytes\n    capacity = count\n  }\n\n  /// Write stores an object into the buffer directly or indirectly.\n  ///\n  /// Direct: ignores the capacity of buffer which would mean we are referring to the direct point in memory\n  /// indirect: takes into respect the current capacity of the buffer (capacity - index), writing to the buffer from the end\n  /// - Parameters:\n  ///   - value: Value that needs to be written to the buffer\n  ///   - index: index to write to\n  ///   - direct: Should take into consideration the capacity of the buffer\n  @inline(__always)\n  func write<T>(value: T, index: Int, direct: Bool = false) {\n    var index = index\n    if !direct {\n      index = capacity &- index\n    }\n    assert(index < capacity, \"Write index is out of writing bound\")\n    assert(index >= 0, \"Writer index should be above zero\")\n    _ = withUnsafePointer(to: value) { ptr in\n      _storage.withUnsafeRawPointer {\n        memcpy(\n          $0.advanced(by: index),\n          ptr,\n          MemoryLayout<T>.size)\n      }\n    }\n  }\n\n  /// Reads an object from the buffer\n  /// - Parameters:\n  ///   - def: Type of the object\n  ///   - position: the index of the object in the buffer\n  @inline(__always)\n  public func read<T>(def: T.Type, position: Int) -> T {\n    _storage.readWithUnsafeRawPointer(position: position) {\n      $0.bindMemory(to: T.self, capacity: 1)\n        .pointee\n    }\n  }\n\n  @inline(__always)\n  public func readUInt64(offset: Int, byteWidth: UInt8) -> UInt64 {\n    readSizedScalar(\n      def: UInt64.self,\n      t1: UInt8.self,\n      t2: UInt16.self,\n      t3: UInt32.self,\n      t4: UInt64.self,\n      position: offset,\n      byteWidth: byteWidth)\n  }\n\n  @inline(__always)\n  public func readInt64(offset: Int, byteWidth: UInt8) -> Int64 {\n    readSizedScalar(\n      def: Int64.self,\n      t1: Int8.self,\n      t2: Int16.self,\n      t3: Int32.self,\n      t4: Int64.self,\n      position: offset,\n      byteWidth: byteWidth)\n  }\n\n  @inline(__always)\n  public func readDouble(offset: Int, byteWidth: UInt8) -> Double {\n    switch byteWidth {\n    case 4:\n      Double(read(def: Float32.self, position: offset))\n    default:\n      read(def: Double.self, position: offset)\n    }\n  }\n\n  @inline(__always)\n  func readSizedScalar<\n    T: BinaryInteger,\n    T1: BinaryInteger,\n    T2: BinaryInteger,\n    T3: BinaryInteger,\n    T4: BinaryInteger\n  >(\n    def: T.Type,\n    t1: T1.Type,\n    t2: T2.Type,\n    t3: T3.Type,\n    t4: T4.Type,\n    position: Int,\n    byteWidth: UInt8) -> T\n  {\n    switch byteWidth {\n    case 1:\n      numericCast(read(def: T1.self, position: position))\n    case 2:\n      numericCast(read(def: T2.self, position: position))\n    case 4:\n      numericCast(read(def: T3.self, position: position))\n    default:\n      numericCast(read(def: T4.self, position: position))\n    }\n  }\n\n  /// Reads a slice from the memory assuming a type of T\n  /// - Parameters:\n  ///   - index: index of the object to be read from the buffer\n  ///   - count: count of bytes in memory\n  @inline(__always)\n  public func readSlice<T>(\n    index: Int,\n    count: Int) -> [T]\n  {\n    assert(\n      index + count <= capacity,\n      \"Reading out of bounds is illegal\")\n\n    return _storage.readWithUnsafeRawPointer(position: index) {\n      let buf = UnsafeBufferPointer(\n        start: $0.bindMemory(to: T.self, capacity: count),\n        count: count)\n      return Array(buf)\n    }\n  }\n\n  @inline(__always)\n  public func readString(\n    at index: Int,\n    count: Int,\n    type: String.Encoding) -> String?\n  {\n    assert(\n      index + count <= capacity,\n      \"Reading out of bounds is illegal\")\n    return _storage.readWithUnsafeRawPointer(position: index) {\n      let buf = UnsafeBufferPointer(\n        start: $0.bindMemory(to: UInt8.self, capacity: count),\n        count: count)\n      return String(\n        bytes: buf,\n        encoding: type)\n    }\n  }\n\n  /// Reads a string from the buffer and encodes it to a swift string\n  /// - Parameters:\n  ///   - index: index of the string in the buffer\n  ///   - count: length of the string\n  @inline(__always)\n  public func readString(\n    at index: Int,\n    count: Int) -> String?\n  {\n    assert(\n      index + count <= capacity,\n      \"Reading out of bounds is illegal\")\n    return _storage.readWithUnsafeRawPointer(position: index) {\n      String(cString: $0.bindMemory(to: UInt8.self, capacity: count))\n    }\n  }\n\n  /// Provides a pointer towards the underlying primitive types\n  /// - Parameters:\n  ///   - index: index of the object to be read from the buffer\n  ///   - count: count of bytes in memory\n  @discardableResult\n  @inline(__always)\n  public func withUnsafePointerToSlice<T>(\n    index: Int,\n    count: Int,\n    body: (UnsafeRawBufferPointer) throws -> T) rethrows -> T\n  {\n    assert(\n      index + count <= capacity,\n      \"Reading out of bounds is illegal\")\n    return try _storage.readWithUnsafeRawPointer(position: index) {\n      try body(UnsafeRawBufferPointer(start: $0, count: count))\n    }\n  }\n\n  @discardableResult\n  @inline(__always)\n  public func withUnsafeBytes<T>(\n    body: (UnsafeRawBufferPointer) throws\n      -> T) rethrows -> T\n  {\n    try _storage.withUnsafeBytes(body)\n  }\n\n  @discardableResult\n  @inline(__always)\n  func withUnsafeMutableRawPointer<T>(\n    body: (UnsafeMutableRawPointer) throws\n      -> T) rethrows -> T\n  {\n    try _storage.withUnsafeRawPointer(body)\n  }\n\n  @discardableResult\n  @inline(__always)\n  func readWithUnsafeRawPointer<T>(\n    position: Int,\n    _ body: (UnsafeRawPointer) throws -> T) rethrows -> T\n  {\n    try _storage.readWithUnsafeRawPointer(position: position, body)\n  }\n}\n"
  },
  {
    "path": "swift/Sources/FlexBuffers/FlexBufferType.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\npublic enum FlexBufferType: UInt64 {\n  case null = 0\n  /// Variable width signed integer: `Int8, Int16, Int32, Int64`\n  case int = 1\n  /// Variable width signed integer: `UInt8, UInt16, UInt32, UInt64`\n  case uint = 2\n  /// Variable width floating point: `Float32, Double64`\n  case float = 3\n  case key = 4\n  case string = 5\n  /// An Int, stored by offset rather than inline. Indirect types can keep the bitwidth of a\n  /// vector or map small when the inline value would have increased the bitwidth.\n  case indirectInt = 6\n  /// A UInt, stored by offset rather than inline. Indirect types can keep the bitwidth of a\n  /// vector or map small when the inline value would have increased the bitwidth.\n  case indirectUInt = 7\n  /// A Float, stored by offset rather than inline. Indirect types can keep the bitwidth of a\n  /// vector or map small when the inline value would have increased the bitwidth.\n  case indirectFloat = 8\n  case map = 9\n  /// Untyped\n  case vector = 10\n  /// Typed any sizes (stores no type table).\n  case vectorInt = 11\n  case vectorUInt = 12\n  case vectorFloat = 13\n  case vectorKey = 14\n  @available(\n    *,\n    deprecated,\n    message: \"use FBT_VECTOR or FBT_VECTOR_KEY instead.\")\n  case vectorString = 15\n\n  /// Typed tuples (no type table, no size field).\n  case vectorInt2 = 16\n  case vectorUInt2 = 17\n  case vectorFloat2 = 18\n  /// Typed triples (no type table, no size field).\n  case vectorInt3 = 19\n  case vectorUInt3 = 20\n  case vectorFloat3 = 21\n  /// Typed quad (no type table, no size field).\n  case vectorInt4 = 22\n  case vectorUInt4 = 23\n  case vectorFloat4 = 24\n  case blob = 25\n  case bool = 26\n  /// To Allow the same type of conversion of type to vector type\n  case vectorBool = 36\n  case max = 37\n}\n\nextension FlexBufferType: Comparable {\n  public static func < (lhs: FlexBufferType, rhs: FlexBufferType) -> Bool {\n    lhs.rawValue < rhs.rawValue\n  }\n}\n"
  },
  {
    "path": "swift/Sources/FlexBuffers/Reader/FixedTypedVector.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\npublic struct FixedTypedVector: FlexBufferVector {\n  public let byteBuffer: ByteBuffer\n  public let offset: Int\n  public let type: FlexBufferType\n  public let count: Int\n  public var isEmpty: Bool { count == 0 }\n\n  let byteWidth: UInt8\n\n  @inline(__always)\n  init(\n    byteBuffer: ByteBuffer,\n    offset: Int,\n    byteWidth: UInt8,\n    type: FlexBufferType,\n    count: Int)\n  {\n    self.byteBuffer = byteBuffer\n    self.offset = offset\n    self.byteWidth = byteWidth\n    self.type = type\n    self.count = count\n  }\n\n  @inline(__always)\n  public subscript(index: Int) -> Reference? {\n    let elementOffset = offset &+ (numericCast(index) &* numericCast(byteWidth))\n    return Reference(\n      byteBuffer: byteBuffer,\n      offset: elementOffset,\n      parentWidth: byteWidth,\n      byteWidth: 1,\n      type: type)\n  }\n}\n"
  },
  {
    "path": "swift/Sources/FlexBuffers/Reader/FlexBufferVector.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\nprotocol FlexBufferVector: Sized & FlexBufferContiguousBytes {\n  subscript(index: Int) -> Reference? { get }\n}\n\nextension FlexBufferVector {\n  public func jsonBuilder(json: inout String) {\n    json += \"[\"\n    for i in 0..<count {\n      if let val = self[i]?.jsonString() {\n        let comma = i == count &- 1 ? \"\" : \", \"\n        json += \"\\(val)\\(comma)\"\n      }\n    }\n    json += \"]\"\n  }\n}\n\npublic protocol FlexBufferContiguousBytes {\n  var byteBuffer: ByteBuffer { get }\n  var offset: Int { get }\n  var count: Int { get }\n\n  func withUnsafeRawBufferPointer<Result>(\n    _ body: (UnsafeRawBufferPointer) throws -> Result) rethrows -> Result\n}\n\nextension FlexBufferContiguousBytes {\n  public func withUnsafeRawBufferPointer<Result>(\n    _ body: (UnsafeRawBufferPointer) throws -> Result) rethrows -> Result\n  {\n    try byteBuffer.withUnsafePointerToSlice(\n      index: offset,\n      count: count,\n      body: body)\n  }\n}\n"
  },
  {
    "path": "swift/Sources/FlexBuffers/Reader/Map.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npublic struct Map: Sized {\n  let byteBuffer: ByteBuffer\n  let offset: Int\n  let byteWidth: UInt8\n  public let keys: TypedVector\n  public let count: Int\n\n  public var values: Vector {\n    return Vector(byteBuffer: byteBuffer, offset: offset, byteWidth: byteWidth)\n  }\n\n  @inline(__always)\n  init(byteBuffer: ByteBuffer, offset: Int, byteWidth: UInt8) {\n    self.byteBuffer = byteBuffer\n    self.offset = offset\n    self.byteWidth = byteWidth\n\n    count = getCount(buffer: byteBuffer, offset: offset, byteWidth: byteWidth)\n    keys = TypedVector.mapKeys(\n      byteBuffer: byteBuffer,\n      offset: offset,\n      byteWidth: byteWidth)\n  }\n\n  @inline(__always)\n  public subscript(key: String) -> Reference? {\n    guard let position = binarySearch(vector: keys, target: key)\n    else { return nil }\n\n    return getReference(at: position)\n  }\n}\n\nextension Map {\n  public func jsonBuilder(json: inout String) {\n    json += \"{\"\n    for i in 0..<count {\n      if let key = keys[i]?.cString {\n        let comma = i == count &- 1 ? \"\" : \", \"\n        let value = values[i]?.jsonString() ?? StaticJSON.null\n        json += \"\\\"\\(key)\\\": \\(value)\\(comma)\"\n      }\n    }\n    json += \"}\"\n  }\n}\n"
  },
  {
    "path": "swift/Sources/FlexBuffers/Reader/Reference.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Common\nimport Foundation\n\nenum FlexBuffersErrors: Error {\n  case sizeOfBufferIsTooSmall\n  case typeCouldNotBeDetermined\n}\n\n@inline(__always)\npublic func getRoot(buffer: ByteBuffer) throws -> Reference? {\n  assert(\n    isLitteEndian,\n    \"Swift FlexBuffers currently only supports little-endian systems\")\n\n  let end = buffer.count\n  if buffer.count < 3 {\n    throw FlexBuffersErrors.sizeOfBufferIsTooSmall\n  }\n\n  let byteWidth = buffer.read(def: UInt8.self, position: end &- 1)\n  let packedType = buffer.read(def: UInt8.self, position: end &- 2)\n  let offset = end &- 2 &- numericCast(byteWidth)\n\n  return Reference(\n    byteBuffer: buffer,\n    offset: offset,\n    parentWidth: byteWidth,\n    packedType: packedType)\n}\n\n@inline(__always)\npublic func getRootChecked(buffer: ByteBuffer) throws -> Reference? {\n  // TODO(mustiikhalil): implement verifier\n  return try getRoot(buffer: buffer)\n}\n\npublic struct Reference {\n  private let byteBuffer: ByteBuffer\n  private let offset: Int\n  private let parentWidth: UInt8\n  private let byteWidth: UInt8\n\n  public let type: FlexBufferType\n\n  @inline(__always)\n  init?(\n    byteBuffer: ByteBuffer,\n    offset: Int,\n    parentWidth: UInt8,\n    packedType: UInt8)\n  {\n    guard let type = FlexBufferType(rawValue: UInt64(packedType >> 2)) else {\n      return nil\n    }\n    self.byteBuffer = byteBuffer\n    self.offset = offset\n    self.parentWidth = parentWidth\n    byteWidth = 1 << (packedType & 3)\n    self.type = type\n  }\n\n  @inline(__always)\n  init(\n    byteBuffer: ByteBuffer,\n    offset: Int,\n    parentWidth: UInt8,\n    byteWidth: UInt8,\n    type: FlexBufferType)\n  {\n    self.byteBuffer = byteBuffer\n    self.offset = offset\n    self.parentWidth = parentWidth\n    self.byteWidth = byteWidth\n    self.type = type\n  }\n\n  @inline(__always)\n  public var bool: Bool? {\n    return switch type {\n    case .bool: byteBuffer.readUInt64(offset: offset, byteWidth: byteWidth) != 0\n    default: nil\n    }\n  }\n\n  @inline(__always)\n  public var uint: UInt64? {\n    return switch type {\n    case .uint: byteBuffer.readUInt64(offset: offset, byteWidth: byteWidth)\n    case .indirectUInt:\n      byteBuffer.readUInt64(\n        offset: indirect(),\n        byteWidth: byteWidth)\n    default: nil\n    }\n  }\n\n  @inline(__always)\n  public var int: Int64? {\n    return switch type {\n    case .int: byteBuffer.readInt64(offset: offset, byteWidth: byteWidth)\n    case .indirectInt:\n      byteBuffer.readInt64(\n        offset: indirect(),\n        byteWidth: byteWidth)\n    default: nil\n    }\n  }\n\n  @inline(__always)\n  public var double: Double? {\n    return switch type {\n    case .float: byteBuffer.readDouble(offset: offset, byteWidth: byteWidth)\n    case .indirectFloat:\n      byteBuffer.readDouble(\n        offset: indirect(),\n        byteWidth: byteWidth)\n    default: nil\n    }\n  }\n\n  @inline(__always)\n  public var map: Map? {\n    guard type == .map else { return nil }\n    return Map(\n      byteBuffer: byteBuffer,\n      offset: indirect(),\n      byteWidth: byteWidth)\n  }\n\n  @inline(__always)\n  public var vector: Vector? {\n    guard type == .vector || type == .map else { return nil }\n    return Vector(\n      byteBuffer: byteBuffer,\n      offset: indirect(),\n      byteWidth: byteWidth)\n  }\n\n  @inline(__always)\n  public var cString: String? {\n    guard type == .string || type == .key else { return nil }\n    let offset = indirect()\n\n    let count = getCount(\n      buffer: byteBuffer,\n      offset: offset,\n      byteWidth: byteWidth)\n\n    return byteBuffer.readString(\n      at: offset,\n      count: count)\n  }\n\n  @inline(__always)\n  public func blob<Result>(_ completion: (UnsafeRawBufferPointer) -> Result)\n    -> Result?\n  {\n    guard type == .blob || type == .string else { return nil }\n\n    let offset = indirect()\n    let count = getCount(\n      buffer: byteBuffer,\n      offset: offset,\n      byteWidth: byteWidth)\n    return byteBuffer.withUnsafePointerToSlice(\n      index: offset,\n      count: count,\n      body: completion)\n  }\n\n  @inline(__always)\n  public var typedVector: TypedVector? {\n    guard isTypedVectorType(type: type) else { return nil }\n    guard var type = toTypedVectorElementType(type: type) else { return nil }\n    if type == .string {\n      type = .key\n    }\n    return TypedVector(\n      byteBuffer: byteBuffer,\n      offset: indirect(),\n      byteWidth: byteWidth,\n      type: type)\n  }\n\n  @inline(__always)\n  public var fixedTypedVector: FixedTypedVector? {\n    guard isFixedTypedVectorType(type: type) else { return nil }\n    let t = toFixedTypedVectorElementType(type: type)\n    guard let type = t.type else { return nil }\n    return FixedTypedVector(\n      byteBuffer: byteBuffer,\n      offset: indirect(),\n      byteWidth: byteWidth,\n      type: type,\n      count: t.count)\n  }\n\n  @inline(__always)\n  public func string(encoding: String.Encoding = .utf8) -> String? {\n    guard type == .string else { return nil }\n    let offset = indirect()\n\n    let count = getCount(\n      buffer: byteBuffer,\n      offset: offset,\n      byteWidth: byteWidth)\n\n    return byteBuffer.readString(\n      at: offset,\n      count: count,\n      type: encoding)\n  }\n\n  @inline(__always)\n  public func asInt<T: FixedWidthInteger>() -> T? {\n    guard let v = int else {\n      return nil\n    }\n    return numericCast(v)\n  }\n\n  @inline(__always)\n  public func asUInt<T: FixedWidthInteger>() -> T? {\n    guard let v = uint else {\n      return nil\n    }\n    return numericCast(v)\n  }\n\n  @inline(__always)\n  public func withUnsafeRawPointer<Result>(\n    _ completion: (UnsafeRawPointer) throws\n      -> Result)\n    rethrows -> Result?\n  {\n    return try byteBuffer.readWithUnsafeRawPointer(\n      position: indirect(),\n      completion)\n  }\n\n  private func indirect() -> Int {\n    readIndirect(buffer: byteBuffer, offset: offset, parentWidth)\n  }\n}\n\nextension Reference {\n\n  public func jsonString() -> String {\n    var str = \"\"\n    jsonBuilder(json: &str)\n    return str\n  }\n\n  func jsonBuilder(json: inout String) {\n    switch type {\n    case .null:\n      json += StaticJSON.null\n    case .uint, .indirectUInt:\n      json += uint.valueOrNull\n    case .int, .indirectInt:\n      json += int.valueOrNull\n    case .float, .indirectFloat:\n      json += double.valueOrNull\n    case .string, .key:\n      json += \"\\\"\\(cString ?? StaticJSON.null)\\\"\"\n    case .map:\n      map?.jsonBuilder(json: &json)\n    case .bool:\n      json += bool.valueOrNull\n    case .blob:\n      if let p = blob({ String(data: Data($0), encoding: .utf8) })?\n        .valueOrNull\n      {\n        json += \"\\\"\\(p)\\\"\"\n      } else {\n        json += StaticJSON.null\n      }\n    default:\n      if type == .vector {\n        vector?.jsonBuilder(json: &json)\n      } else if isTypedVectorType(type: type) {\n        typedVector?.jsonBuilder(json: &json)\n      } else if isFixedTypedVectorType(type: type) {\n        fixedTypedVector?.jsonBuilder(json: &json)\n      } else {\n        json += StaticJSON.null\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "swift/Sources/FlexBuffers/Reader/Sized.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nprotocol Sized {\n  var byteBuffer: ByteBuffer { get }\n  var offset: Int { get }\n  var byteWidth: UInt8 { get }\n  var count: Int { get }\n}\n\nextension Sized {\n\n  @inline(__always)\n  func getReference(at index: Int) -> Reference? {\n    if index >= count { return nil }\n    let bWidth = Int(byteWidth)\n\n    let packedType = byteBuffer.read(\n      def: UInt8.self,\n      position: (offset &+ (count &* bWidth)) &+ index)\n\n    let offset = offset &+ (index &* bWidth)\n\n    return Reference(\n      byteBuffer: byteBuffer,\n      offset: offset,\n      parentWidth: byteWidth,\n      packedType: packedType)\n  }\n}\n"
  },
  {
    "path": "swift/Sources/FlexBuffers/Reader/TypedVector.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\npublic struct TypedVector: FlexBufferVector {\n  public let byteBuffer: ByteBuffer\n  public let offset: Int\n  public let type: FlexBufferType\n  public let count: Int\n  public var isEmpty: Bool { count == 0 }\n\n  let byteWidth: UInt8\n\n  @inline(__always)\n  init(\n    byteBuffer: ByteBuffer,\n    offset: Int,\n    byteWidth: UInt8,\n    type: FlexBufferType)\n  {\n    self.byteBuffer = byteBuffer\n    self.offset = offset\n    self.byteWidth = byteWidth\n    self.type = type\n    count = getCount(buffer: byteBuffer, offset: offset, byteWidth: byteWidth)\n  }\n\n  @inline(__always)\n  public subscript(index: Int) -> Reference? {\n    let elementOffset = offset &+ (numericCast(index) &* numericCast(byteWidth))\n    return Reference(\n      byteBuffer: byteBuffer,\n      offset: elementOffset,\n      parentWidth: byteWidth,\n      byteWidth: 1,\n      type: type)\n  }\n\n  @inline(__always)\n  static func mapKeys(\n    byteBuffer: ByteBuffer,\n    offset: Int,\n    byteWidth: UInt8) -> TypedVector\n  {\n    let prefixedFields = 3\n    let keysOffset = offset &- (numericCast(byteWidth) &* prefixedFields)\n\n    let indirectOffset = readIndirect(\n      buffer: byteBuffer,\n      offset: keysOffset,\n      byteWidth)\n\n    let childByteWidth = byteBuffer.readUInt64(\n      offset: keysOffset &+ numericCast(byteWidth),\n      byteWidth: byteWidth)\n\n    return TypedVector(\n      byteBuffer: byteBuffer,\n      offset: indirectOffset,\n      byteWidth: numericCast(childByteWidth),\n      type: .key)\n  }\n}\n\nextension TypedVector {\n  @inline(__always)\n  func compare(offset off: Int, target: String) -> Int {\n\n    let elementOffset = offset &+ (off &* numericCast(byteWidth))\n\n    let indirectoffset = readIndirect(\n      buffer: byteBuffer,\n      offset: elementOffset,\n      byteWidth)\n\n    return byteBuffer.readWithUnsafeRawPointer(\n      position: indirectoffset)\n    { bufPointer in\n      target.withCString { strPointer in\n        Int(strcmp(bufPointer, strPointer))\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "swift/Sources/FlexBuffers/Reader/Vector.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// MARK: - Vector\n\npublic struct Vector: FlexBufferVector {\n  public let byteBuffer: ByteBuffer\n  public let offset: Int\n  public let count: Int\n  public var isEmpty: Bool { count == 0 }\n\n  let byteWidth: UInt8\n\n  @inline(__always)\n  init(byteBuffer: ByteBuffer, offset: Int, byteWidth: UInt8) {\n    self.byteBuffer = byteBuffer\n    self.offset = offset\n    self.byteWidth = byteWidth\n    count = getCount(\n      buffer: byteBuffer,\n      offset: offset,\n      byteWidth: byteWidth)\n  }\n\n  @inline(__always)\n  public subscript(index: Int) -> Reference? {\n    return getReference(at: index)\n  }\n}\n"
  },
  {
    "path": "swift/Sources/FlexBuffers/Utils/BitWidth.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\n@usableFromInline\nenum BitWidth: UInt64, CaseIterable {\n  case w8 = 0\n  case w16 = 1\n  case w32 = 2\n  case w64 = 3\n}\n\nextension BitWidth: Comparable {\n  @usableFromInline\n  static func < (lhs: BitWidth, rhs: BitWidth) -> Bool {\n    lhs.rawValue < rhs.rawValue\n  }\n\n  @inline(__always)\n  static func widthB(_ v: Int) -> BitWidth {\n    switch v {\n    case 1: return .w8\n    case 2: return .w16\n    case 4: return .w32\n    case 8: return .w64\n    default:\n      assert(false, \"We shouldn't reach here\")\n      return .w64\n    }\n  }\n\n  @inline(__always)\n  static func max(_ lhs: BitWidth, rhs: BitWidth) -> BitWidth {\n    if lhs.rawValue > rhs.rawValue { return lhs }\n    return rhs\n  }\n}\n"
  },
  {
    "path": "swift/Sources/FlexBuffers/Utils/Constants.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\n#if canImport(Common)\nimport Common\n#endif\n\nextension UInt64 {\n  static let one: UInt64 = 1\n}\n\nextension UInt32 {\n  static let one: UInt32 = 1\n}\n\npublic enum BuilderFlag: UInt8 {\n  case none = 0\n  case shareKeys = 1\n  case shareStrings = 2\n  case shareKeysAndStrings = 3\n  case shareKeyVectors = 4\n  case shareAll = 7\n}\n\nextension BuilderFlag: Comparable {\n  public static func < (lhs: BuilderFlag, rhs: BuilderFlag) -> Bool {\n    lhs.rawValue < rhs.rawValue\n  }\n}\n\nenum StaticJSON {\n  static let null = \"null\"\n}\n\nextension Optional {\n  var valueOrNull: String {\n    if let value = self {\n      return \"\\(value)\"\n    } else {\n      return StaticJSON.null\n    }\n  }\n}\n"
  },
  {
    "path": "swift/Sources/FlexBuffers/Utils/Value.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\n#if canImport(Common)\nimport Common\n#endif\n\npublic struct Value: Equatable {\n\n  @usableFromInline\n  enum Union: Equatable {\n    case i(Int64)\n    case u(UInt64)\n    case f(Double)\n  }\n\n  var sloc: Union\n  let type: FlexBufferType\n  let bitWidth: BitWidth\n\n  @inline(__always)\n  private init() {\n    sloc = .i(0)\n    type = .null\n    bitWidth = .w8\n  }\n\n  @inline(__always)\n  init(bool: Bool) {\n    sloc = .u(bool ? 1 : 0)\n    type = .bool\n    bitWidth = .w8\n  }\n\n  @inline(__always)\n  init(v: UInt64, type: FlexBufferType, bitWidth: BitWidth) {\n    sloc = .u(v)\n    self.type = type\n    self.bitWidth = bitWidth\n  }\n\n  @inline(__always)\n  init(v: Int64, type: FlexBufferType, bitWidth: BitWidth) {\n    sloc = .i(v)\n    self.type = type\n    self.bitWidth = bitWidth\n  }\n\n  @inline(__always)\n  init(v: Double, type: FlexBufferType, bitWidth: BitWidth) {\n    sloc = .f(v)\n    self.type = type\n    self.bitWidth = bitWidth\n  }\n\n  @inline(__always)\n  init(sloc: Union, type: FlexBufferType, bitWidth: BitWidth) {\n    self.sloc = sloc\n    self.type = type\n    self.bitWidth = bitWidth\n  }\n\n  @usableFromInline\n  var i: Int64 {\n    switch sloc {\n    case .i(let v): v\n    default: 0\n    }\n  }\n\n  @usableFromInline\n  var u: UInt64 {\n    switch sloc {\n    case .u(let v): v\n    default: 0\n    }\n  }\n\n  @usableFromInline\n  var f: Double {\n    switch sloc {\n    case .f(let v): v\n    default: 0\n    }\n  }\n\n  static let `nil` = Value()\n}\n\nextension Value {\n  @usableFromInline\n  @inline(__always)\n  func elementWidth(size: Int, index: UInt64) -> BitWidth {\n    if isInline(type) {\n      return bitWidth\n    } else {\n      for byteWidth in stride(from: 1, to: MemoryLayout<UInt64>.size, by: 2) {\n        let _offsetLoc: UInt64 = numericCast(\n          numericCast(size)\n            &+ padding(\n              bufSize: numericCast(size),\n              elementSize: numericCast(byteWidth)))\n        let offsetLoc = _offsetLoc &+ (index &* numericCast(byteWidth))\n        let offset = offsetLoc &- u\n\n        let bitWidth = widthU(offset)\n        if (UInt32.one << bitWidth.rawValue) == byteWidth {\n          return bitWidth\n        }\n      }\n      return .w64\n    }\n  }\n\n  @inline(__always)\n  func storedPackedType(width: BitWidth = .w8) -> UInt8 {\n    packedType(bitWidth: storedWidth(width: width), type: type)\n  }\n\n  @inline(__always)\n  private func storedWidth(width: BitWidth) -> BitWidth {\n    if isInline(type) {\n      return max(bitWidth, width)\n    } else {\n      return bitWidth\n    }\n  }\n}\n"
  },
  {
    "path": "swift/Sources/FlexBuffers/Utils/functions.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\n#if canImport(Common)\nimport Common\n#endif\n\n@inline(__always)\ninternal func isInline(_ t: FlexBufferType) -> Bool {\n  return t <= .float || t == .bool\n}\n\n@inline(__always)\nprivate func check(_ v: UInt64, width: UInt64) -> Bool {\n  (v & ~((.one << width) &- 1)) == 0\n}\n\n@inline(__always)\ninternal func widthI(_ v: Int64) -> BitWidth {\n  let u = UInt64(bitPattern: v) << 1\n  return widthU(v >= 0 ? u : ~u)\n}\n\n@inline(__always)\ninternal func widthF(_ v: Double) -> BitWidth {\n  Double(Float(v)) == v ? .w32 : .w64\n}\n\n@inline(__always)\ninternal func widthU(_ v: UInt64) -> BitWidth {\n  if check(v, width: 8) { return .w8 }\n  if check(v, width: 16) { return .w16 }\n  if check(v, width: 32) { return .w32 }\n  return .w64\n}\n\n@inline(__always)\ninternal func packedType(bitWidth: BitWidth, type: FlexBufferType) -> UInt8 {\n  numericCast(bitWidth.rawValue | (type.rawValue << 2))\n}\n\n@inline(__always)\nfunc getScalarType<T>(type: T.Type) -> FlexBufferType where T: Scalar {\n  if T.self is (any BinaryFloatingPoint.Type) {\n    return .float\n  }\n\n  if T.self is Bool.Type {\n    return .bool\n  }\n\n  if T.self is (any UnsignedInteger.Type) {\n    return .uint\n  }\n\n  return .int\n}\n\n@inline(__always)\nfunc toTypedVector(type: FlexBufferType, length: UInt64) -> FlexBufferType {\n  let type: UInt64 =\n    switch length {\n    case 0:\n      type.rawValue &- FlexBufferType.int.rawValue\n        &+ FlexBufferType\n        .vectorInt.rawValue\n    case 2:\n      type.rawValue &- FlexBufferType.int.rawValue\n        &+ FlexBufferType\n        .vectorInt2.rawValue\n    case 3:\n      type.rawValue &- FlexBufferType.int.rawValue\n        &+ FlexBufferType\n        .vectorInt3.rawValue\n    case 4:\n      type.rawValue &- FlexBufferType.int.rawValue\n        &+ FlexBufferType\n        .vectorInt4.rawValue\n    default: 0\n    }\n  return FlexBufferType(rawValue: type) ?? .null\n}\n\n@inline(__always)\nfunc isTypedVectorElementType(type: FlexBufferType) -> Bool {\n  return type >= .int && type <= .string || type == .bool\n}\n\n@inline(__always)\nfunc isTypedVectorType(type: FlexBufferType) -> Bool {\n  return type >= .vectorInt && type <= .vectorString || type == .vectorBool\n}\n\n@inline(__always)\nfunc toTypedVectorElementType(type: FlexBufferType) -> FlexBufferType? {\n  return FlexBufferType(\n    rawValue: type.rawValue\n      &- FlexBufferType.vectorInt\n      .rawValue &+ FlexBufferType.int.rawValue)\n}\n\n@inline(__always)\nfunc isFixedTypedVectorType(type: FlexBufferType) -> Bool {\n  return type >= .vectorInt2 && type <= .vectorFloat4\n}\n\n@inline(__always)\nfunc toFixedTypedVectorElementType(type: FlexBufferType)\n  -> (type: FlexBufferType?, count: Int)\n{\n  assert(isFixedTypedVectorType(type: type))\n  let fixedType: UInt64 = numericCast(\n    type.rawValue\n      &- FlexBufferType.vectorInt2\n      .rawValue)\n  let len: Int = numericCast(\n    fixedType.dividedReportingOverflow(by: 3)\n      .partialValue &+ 2)\n  return (\n    FlexBufferType(\n      rawValue: (fixedType.quotientAndRemainder(dividingBy: 3).remainder)\n        &+ FlexBufferType.int.rawValue),\n    len)\n}\n\n// MARK: - Reader functions\n\n@inline(__always)\nfunc binarySearch(\n  vector: TypedVector,\n  target: String) -> Int?\n{\n  var left = 0\n  var right = vector.count\n\n  while left <= right {\n    let mid = left &+ (right &- left) / 2\n    let comp = vector.compare(offset: mid, target: target)\n    if comp == 0 {\n      return mid\n    } else if comp < 0 {\n      left = mid &+ 1\n    } else {\n      right = mid &- 1\n    }\n  }\n  return nil\n}\n\n@inline(__always)\nfunc readIndirect(buffer: ByteBuffer, offset: Int, _ byteWidth: UInt8) -> Int {\n  return offset\n    &- numericCast(\n      buffer.readUInt64(\n        offset: offset,\n        byteWidth: byteWidth))\n}\n\n@inline(__always)\nfunc getCount(buffer: ByteBuffer, offset: Int, byteWidth: UInt8) -> Int {\n  Int(\n    buffer.readUInt64(\n      offset: offset &- numericCast(byteWidth),\n      byteWidth: byteWidth))\n}\n"
  },
  {
    "path": "swift/Sources/FlexBuffers/Writer/FlexBuffersWriter.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\n#if canImport(Common)\nimport Common\n#endif\n\nprivate let twentyFourBytes: Int = 24\npublic typealias FlexBuffersWriterBuilder = (inout FlexBuffersWriter) -> Void\n\npublic struct FlexBuffersWriter {\n\n  var capacity: Int {\n    _bb.capacity\n  }\n\n  var writerIndex: Int {\n    _bb.writerIndex\n  }\n\n  private var finished = false\n  private var hasDuplicatedKeys = false\n  private var minBitWidth: BitWidth = .w8\n  private var _bb: _InternalByteBuffer\n  private var stack: Stack = Stack()\n  private var keyPool: [Int: UInt] = [:]\n  private var stringPool: [Int: UInt] = [:]\n  private var flags: BuilderFlag\n\n  public init(initialSize: Int = 1024, flags: BuilderFlag = .shareKeys) {\n    assert(\n      isLitteEndian,\n      \"Swift FlexBuffers currently only supports little-endian systems\")\n    _bb = _InternalByteBuffer(initialSize: initialSize)\n    self.flags = flags\n  }\n\n  /// Returns the written bytes into the ``ByteBuffer``\n  ///\n  /// Should only be used after ``finish(offset:addPrefix:)`` is called\n  public var sizedByteArray: [UInt8] {\n    assert(\n      finished == true,\n      \"function finish() should be called before accessing data\")\n    return _bb.underlyingBytes\n  }\n\n  public var sizedByteBuffer: ByteBuffer {\n    assert(\n      finished == true,\n      \"function finish() should be called before accessing data\")\n    return _bb.withUnsafeSlicedBytes {\n      ByteBuffer(copyingMemoryBound: $0.baseAddress!, capacity: $0.count)\n    }\n  }\n\n  public var byteBuffer: ByteBuffer {\n    assert(\n      finished == true,\n      \"function finish() should be called before accessing data\")\n    return ByteBuffer(byteBuffer: _bb)\n  }\n\n  #if !os(WASI)\n  /// Data representation of the buffer\n  ///\n  /// Should only be used after ``finish(offset:addPrefix:)`` is called\n  public var data: Data {\n    assert(finished, \"Data shouldn't be called before finish()\")\n    return _bb.withUnsafeSlicedBytes { ptr in\n      var data = Data()\n      data.append(\n        ptr.baseAddress!.bindMemory(\n          to: UInt8.self,\n          capacity: ptr.count),\n        count: ptr.count)\n      return data\n    }\n  }\n  #endif\n\n  /// Resets the internal state. Automatically called before building a new flexbuffer.\n  public mutating func reset(keepingCapacity: Bool = false) {\n    _bb.clear(keepingCapacity: keepingCapacity)\n    stack.removeAll(keepingCapacity: keepingCapacity)\n    finished = false\n    minBitWidth = .w8\n    keyPool.removeAll(keepingCapacity: keepingCapacity)\n    stringPool.removeAll(keepingCapacity: keepingCapacity)\n  }\n\n  // MARK: - Storing root\n  public mutating func finish() {\n    assert(stack.count == 1)\n\n    // Write root value.\n    var byteWidth = align(\n      width: stack[0].elementWidth(\n        size: writerIndex,\n        index: 0))\n\n    write(value: stack[0], byteWidth: byteWidth)\n    var storedType = stack[0].storedPackedType()\n    // Write root type.\n    _bb.writeBytes(&storedType, len: 1)\n    // Write root size. Normally determined by parent, but root has no parent :)\n    _bb.writeBytes(&byteWidth, len: 1)\n\n    finished = true\n  }\n\n  // MARK: - Vector\n  @discardableResult\n  @inline(__always)\n  public func startVector() -> Int {\n    stack.count\n  }\n\n  @discardableResult\n  @inline(__always)\n  public mutating func startVector(key k: String) -> Int {\n    add(key: k)\n    return stack.count\n  }\n\n  @discardableResult\n  public mutating func endVector(\n    start: Int,\n    typed: Bool = false,\n    fixed: Bool = false) -> UInt64\n  {\n    let vec = createVector(\n      start: start,\n      count: stack.count &- start,\n      step: 1,\n      typed: typed,\n      fixed: fixed,\n      keys: nil)\n    stack.popLast(start)\n    stack.append(vec)\n    return vec.u\n  }\n\n  @discardableResult\n  @inline(__always)\n  public mutating func create<T>(vector: [T]) -> Int where T: Scalar {\n    create(vector: vector, fixed: false)\n  }\n\n  @discardableResult\n  @inline(__always)\n  public mutating func create<T>(vector: [T], key: borrowing String) -> Int\n    where T: Scalar\n  {\n    add(key: key)\n    return create(vector: vector, fixed: false)\n  }\n\n  @discardableResult\n  @inline(__always)\n  public mutating func createFixed<T>(vector: [T]) -> Int where T: Scalar {\n    assert(vector.count >= 2 && vector.count <= 4)\n    return create(vector: vector, fixed: true)\n  }\n\n  @discardableResult\n  @inline(__always)\n  public mutating func createFixed<T>(\n    vector: [T],\n    key: borrowing String) -> Int where T: Scalar\n  {\n    assert(vector.count >= 2 && vector.count <= 4)\n    add(key: key)\n    return create(vector: vector, fixed: true)\n  }\n\n  // MARK: - Map\n  @discardableResult\n  @inline(__always)\n  public func startMap() -> Int {\n    stack.count\n  }\n\n  @discardableResult\n  @inline(__always)\n  public mutating func startMap(key k: String) -> Int {\n    add(key: k)\n    return stack.count\n  }\n\n  @discardableResult\n  public mutating func endMap(start: Int) -> UInt64 {\n    let len = sortMapByKeys(start: start)\n\n    let keys = createVector(\n      start: start,\n      count: len,\n      step: 2,\n      typed: true,\n      fixed: false)\n    let vec = createVector(\n      start: start &+ 1,\n      count: len,\n      step: 2,\n      typed: false,\n      fixed: false,\n      keys: keys)\n    stack.popLast(start)\n    stack.append(vec)\n    return numericCast(vec.u)\n  }\n\n  // MARK: - Write Null\n\n  @inline(__always)\n  public mutating func addNil() {\n    stack.append(Value.nil)\n  }\n\n  @inline(__always)\n  public mutating func addNil(key: borrowing String) {\n    add(key: key)\n    addNil()\n  }\n\n  // MARK: - Write Bool\n\n  @inline(__always)\n  public mutating func add(bool: borrowing Bool) {\n    stack.append(Value(bool: bool))\n  }\n\n  @inline(__always)\n  public mutating func add(bool: borrowing Bool, key: borrowing String) {\n    add(key: key)\n    add(bool: bool)\n  }\n\n  // MARK: - Write UInt\n\n  @inline(__always)\n  public mutating func add(uint8 value: UInt8) {\n    add(uint64: numericCast(value))\n  }\n\n  @inline(__always)\n  public mutating func add(uint8 value: UInt8, key: borrowing String) {\n    add(key: key)\n    add(uint64: numericCast(value))\n  }\n\n  @inline(__always)\n  public mutating func add(uint16 value: UInt16) {\n    add(uint64: numericCast(value))\n  }\n\n  @inline(__always)\n  public mutating func add(uint16 value: UInt16, key: borrowing String) {\n    add(key: key)\n    add(uint64: numericCast(value))\n  }\n\n  @inline(__always)\n  public mutating func add(uint32 value: UInt32) {\n    add(uint64: numericCast(value))\n  }\n\n  @inline(__always)\n  public mutating func add(uint32 value: UInt32, key: borrowing String) {\n    add(key: key)\n    add(uint64: numericCast(value))\n  }\n\n  @inline(__always)\n  public mutating func add(uint value: UInt) {\n    add(uint64: numericCast(value))\n  }\n\n  @inline(__always)\n  public mutating func add(uint value: UInt, key: borrowing String) {\n    add(key: key)\n    add(uint64: numericCast(value))\n  }\n\n  @inline(__always)\n  public mutating func add(uint64 value: borrowing UInt64) {\n    stack.append(Value(v: value, type: .uint, bitWidth: widthU(value)))\n  }\n\n  @inline(__always)\n  public mutating func add(\n    uint64 value: borrowing UInt64,\n    key: borrowing String)\n  {\n    add(key: key)\n    add(uint64: value)\n  }\n\n  @inline(__always)\n  public mutating func indirect(uint64 val: borrowing UInt64) {\n    pushIndirect(value: val, type: .indirectUInt, bitWidth: widthU(val))\n  }\n\n  @inline(__always)\n  public mutating func indirect(\n    uint64 val: borrowing UInt64,\n    key: borrowing String)\n  {\n    add(key: key)\n    indirect(uint64: val)\n  }\n\n  @inline(__always)\n  public mutating func indirect(\n    uint val: borrowing UInt,\n    key: borrowing String)\n  {\n    add(key: key)\n    indirect(uint64: numericCast(val))\n  }\n\n  // MARK: - Write Int\n\n  @inline(__always)\n  public mutating func add(int8 value: Int8) {\n    add(int64: numericCast(value))\n  }\n\n  @inline(__always)\n  public mutating func add(int8 value: Int8, key: borrowing String) {\n    add(key: key)\n    add(int64: numericCast(value))\n  }\n\n  @inline(__always)\n  public mutating func add(int16 value: Int16) {\n    add(int64: numericCast(value))\n  }\n\n  @inline(__always)\n  public mutating func add(int16 value: Int16, key: borrowing String) {\n    add(key: key)\n    add(int64: numericCast(value))\n  }\n\n  @inline(__always)\n  public mutating func add(int32 value: Int32) {\n    add(int64: numericCast(value))\n  }\n\n  @inline(__always)\n  public mutating func add(int32 value: Int32, key: borrowing String) {\n    add(key: key)\n    add(int64: numericCast(value))\n  }\n\n  @inline(__always)\n  public mutating func add(int value: Int) {\n    add(int64: numericCast(value))\n  }\n\n  @inline(__always)\n  public mutating func add(int value: Int, key: borrowing String) {\n    add(key: key)\n    add(int64: numericCast(value))\n  }\n\n  @inline(__always)\n  public mutating func add(int64 value: borrowing Int64) {\n    stack.append(Value(v: value, type: .int, bitWidth: widthI(value)))\n  }\n\n  @inline(__always)\n  public mutating func add(\n    int64 value: borrowing Int64,\n    key: borrowing String)\n  {\n    add(key: key)\n    add(int64: value)\n  }\n\n  @inline(__always)\n  public mutating func indirect(int64 val: borrowing Int64) {\n    pushIndirect(value: val, type: .indirectInt, bitWidth: widthI(val))\n  }\n\n  @inline(__always)\n  public mutating func indirect(\n    int64 val: borrowing Int64,\n    key: borrowing String)\n  {\n    add(key: key)\n    indirect(int64: val)\n  }\n\n  @inline(__always)\n  public mutating func indirect(\n    int val: borrowing Int,\n    key: borrowing String)\n  {\n    add(key: key)\n    indirect(int64: numericCast(val))\n  }\n\n  // MARK: - Write Floats\n\n  @inline(__always)\n  public mutating func add(float32 value: borrowing Float32) {\n    stack.append(Value(v: Double(value), type: .float, bitWidth: .w32))\n  }\n\n  @inline(__always)\n  public mutating func add(\n    float32 value: borrowing Float32,\n    key: borrowing String)\n  {\n    add(key: key)\n    add(float32: value)\n  }\n\n  @inline(__always)\n  public mutating func indirect(float32 val: borrowing Float32) {\n    pushIndirect(value: val, type: .indirectFloat, bitWidth: .w32)\n  }\n\n  @inline(__always)\n  public mutating func indirect(\n    float32 val: borrowing Float32,\n    key: borrowing String)\n  {\n    add(key: key)\n    indirect(float32: val)\n  }\n\n  @inline(__always)\n  public mutating func add(double value: borrowing Double) {\n    stack.append(Value(v: value, type: .float, bitWidth: widthF(value)))\n  }\n\n  @inline(__always)\n  public mutating func add(\n    double value: borrowing Double,\n    key: borrowing String)\n  {\n    add(key: key)\n    add(double: value)\n  }\n\n  @inline(__always)\n  public mutating func indirect(double val: borrowing Double) {\n    pushIndirect(value: val, type: .indirectFloat, bitWidth: widthF(val))\n  }\n\n  @inline(__always)\n  public mutating func indirect(\n    double val: borrowing Double,\n    key: borrowing String)\n  {\n    add(key: key)\n    indirect(double: val)\n  }\n\n  // MARK: - Writing strings\n  @inline(__always)\n  public mutating func add(string: borrowing String, key: borrowing String) {\n    add(key: key)\n    write(str: string, len: string.count)\n  }\n\n  @inline(__always)\n  public mutating func add(string: borrowing String) {\n    write(str: string, len: string.count)\n  }\n\n  // MARK: - Writing Blobs\n  @discardableResult\n  @inline(__always)\n  public mutating func add<T>(\n    blob: borrowing T,\n    length l: Int) -> UInt where T: ContiguousBytes\n  {\n    storeBlob(blob, len: l, type: .blob)\n  }\n\n  @discardableResult\n  @inline(__always)\n  public mutating func add<T>(\n    blob: borrowing T,\n    key: borrowing String,\n    length l: Int) -> UInt where T: ContiguousBytes\n  {\n    add(key: key)\n    return storeBlob(blob, len: l, type: .blob)\n  }\n\n  // MARK: - Reuse Values\n  @inline(__always)\n  public func lastValue() -> Value? {\n    return stack.last\n  }\n\n  @inline(__always)\n  public mutating func reuse(value: Value) {\n    stack.append(value)\n  }\n\n  @inline(__always)\n  public mutating func reuse(value: Value, key: borrowing String) {\n    add(key: key)\n    reuse(value: value)\n  }\n\n  // MARK: - Private -\n\n  // MARK: Writing to buffer\n\n  @usableFromInline\n  mutating func write(value: Value, byteWidth: Int) {\n    switch value.type {\n    case .null, .int: write(value: value.i, byteWidth: byteWidth)\n    case .bool, .uint: write(value: value.u, byteWidth: byteWidth)\n    case .float: write(double: value.f, byteWidth: byteWidth)\n    default:\n      write(offset: value.u, byteWidth: byteWidth)\n    }\n  }\n\n  @usableFromInline\n  mutating func pushIndirect<T>(\n    value: T,\n    type: FlexBufferType,\n    bitWidth: BitWidth)\n  {\n    let byteWidth = align(width: bitWidth)\n    let iloc = writerIndex\n    _bb.ensureSpace(size: byteWidth)\n\n    _bb.write(value, len: byteWidth)\n    stack.append(\n      Value(\n        sloc: .u(numericCast(iloc)),\n        type: type,\n        bitWidth: bitWidth))\n  }\n\n  // MARK: Internal Writing Strings\n\n  /// Adds a string to the buffer using swift.utf8 object\n  /// - Parameter str: String that will be added to the buffer\n  /// - Parameter len: length of the string\n  @discardableResult\n  @usableFromInline\n  mutating func write(str: borrowing String, len: Int) -> UInt {\n    let resetTo = writerIndex\n    var sloc = str.withCString {\n      storeBlob(pointer: $0, len: len, trailing: 1, type: .string)\n    }\n\n    if flags >= .shareKeysAndStrings {\n      let loc = stringPool[str.hashValue]\n      if let loc {\n        _bb.resetWriter(to: resetTo)\n        sloc = loc\n        assert(\n          stack.count > 0,\n          \"Attempting to override the location, but stack is empty\")\n        stack[stack.count - 1].sloc = .u(numericCast(sloc))\n      } else {\n        stringPool[str.hashValue] = sloc\n      }\n    }\n    return sloc\n  }\n\n  // MARK: Write Keys\n  @discardableResult\n  @inline(__always)\n  private mutating func add(key: borrowing String) -> UInt {\n    add(key: key, len: key.count)\n  }\n\n  @discardableResult\n  @usableFromInline\n  mutating func add(key: borrowing String, len: Int) -> UInt {\n    _bb.ensureSpace(size: len)\n\n    var sloc: UInt = numericCast(writerIndex)\n    key.withCString {\n      _bb.writeBytes($0, len: len &+ 1)\n    }\n\n    if flags > .shareKeys {\n      let loc = keyPool[key.hashValue]\n      if let loc {\n        _bb.resetWriter(to: Int(sloc))\n        sloc = loc\n      } else {\n        keyPool[key.hashValue] = sloc\n      }\n    }\n    stack.append(Value(sloc: .u(numericCast(sloc)), type: .key, bitWidth: .w8))\n    return sloc\n  }\n\n  // MARK: - Storing Blobs\n  @usableFromInline\n  mutating func storeBlob<T>(\n    _ bytes: T,\n    len: Int,\n    type: FlexBufferType) -> UInt where T: ContiguousBytes\n  {\n    return bytes.withUnsafeBytes {\n      storeBlob(pointer: $0.baseAddress!, len: len, type: type)\n    }\n  }\n\n  @discardableResult\n  @usableFromInline\n  mutating func storeBlob(\n    pointer: borrowing UnsafeRawPointer,\n    len: Int,\n    trailing: Int = 0,\n    type: FlexBufferType) -> UInt\n  {\n    _bb.ensureSpace(size: len &+ trailing)\n    let bitWidth = widthU(numericCast(len))\n\n    let bytes = align(width: bitWidth)\n\n    var len = len\n    _bb.writeBytes(&len, len: bytes)\n    let sloc = writerIndex\n\n    _bb.writeBytes(pointer, len: len &+ trailing)\n    stack.append(\n      Value(\n        sloc: .u(numericCast(sloc)),\n        type: type,\n        bitWidth: bitWidth))\n    return numericCast(sloc)\n  }\n\n  // MARK: Write Vectors\n  @discardableResult\n  @usableFromInline\n  mutating func create<T>(vector: [T], fixed: Bool) -> Int\n    where T: Scalar\n  {\n    let length: UInt64 = numericCast(vector.count)\n    let vectorType = getScalarType(type: T.self)\n    let byteWidth = MemoryLayout<T>.size\n    let bitWidth = BitWidth.widthB(byteWidth)\n\n    _bb.ensureSpace(size: vector.count &* Int(bitWidth.rawValue))\n\n    assert(widthU(length) <= bitWidth)\n\n    align(width: bitWidth)\n\n    if !fixed {\n      write(value: length, byteWidth: byteWidth)\n    }\n    let vloc = _bb.writerIndex\n\n    for i in stride(from: 0, to: vector.count, by: 1) {\n      write(value: vector[i], byteWidth: byteWidth)\n    }\n\n    stack.append(\n      Value(\n        sloc: .u(numericCast(vloc)),\n        type: toTypedVector(type: vectorType, length: fixed ? length : 0),\n        bitWidth: bitWidth))\n    return vloc\n  }\n\n  @usableFromInline\n  mutating func createVector(\n    start: Int,\n    count: Int,\n    step: Int,\n    typed: Bool,\n    fixed: Bool,\n    keys: Value? = nil) -> Value\n  {\n    assert(\n      !fixed || typed,\n      \"Typed false and fixed true is a combination not supported currently\")\n\n    var bitWidth = BitWidth.max(minBitWidth, rhs: widthU(numericCast(count)))\n    var prefixElements = 1\n    if keys != nil {\n      /// If this vector is part of a map, we will pre-fix an offset to the keys\n      /// to this vector.\n      bitWidth = max(bitWidth, keys!.elementWidth(size: writerIndex, index: 0))\n      prefixElements = prefixElements &+ 2\n    }\n    var vectorType: FlexBufferType = .key\n\n    for i in stride(from: start, to: stack.count, by: step) {\n      let elemWidth = stack[i].elementWidth(\n        size: _bb.writerIndex,\n        index: numericCast(i &- start &+ prefixElements))\n      bitWidth = BitWidth.max(bitWidth, rhs: elemWidth)\n      guard typed else { continue }\n      if i == start {\n        vectorType = stack[i].type\n      } else {\n        assert(\n          vectorType == stack[i].type,\n          \"\"\"\n          If you get this assert you are writing a typed vector\n          with elements that are not all the same type\n          \"\"\")\n      }\n    }\n    assert(\n      !typed || isTypedVectorElementType(type: vectorType),\n      \"\"\"\n      If you get this assert, your typed types are not one of:\n      Int / UInt / Float / Key.\n      \"\"\")\n\n    let byteWidth = align(width: bitWidth)\n\n    let currentSize: Int = count &* step &* byteWidth\n    let requiredSize: Int =\n      if !typed {\n        // We ensure that we have enough space\n        // for loop two write operations &\n        // 24 bytes for when its not fixed,\n        // and keys isn't null. As an extra safe\n        // guard\n        (currentSize &* 2) &+ twentyFourBytes\n      } else {\n        currentSize\n      }\n\n    _bb.ensureSpace(\n      size: requiredSize)\n\n    if keys != nil {\n      write(offset: keys!.u, byteWidth: byteWidth)\n      write(value: UInt64.one << keys!.bitWidth.rawValue, byteWidth: byteWidth)\n    }\n\n    if !fixed {\n      write(value: UInt64(count), byteWidth: byteWidth)\n    }\n\n    let vloc = _bb.writerIndex\n\n    for i in stride(from: start, to: stack.count, by: step) {\n      write(value: stack[i], byteWidth: byteWidth)\n    }\n\n    if !typed {\n      for i in stride(from: start, to: stack.count, by: step) {\n        _bb.write(stack[i].storedPackedType(width: bitWidth), len: 1)\n      }\n    }\n\n    let type: FlexBufferType =\n      if keys != nil {\n        .map\n      } else if typed {\n        toTypedVector(type: vectorType, length: numericCast(fixed ? count : 0))\n      } else {\n        .vector\n      }\n\n    return Value(sloc: .u(numericCast(vloc)), type: type, bitWidth: bitWidth)\n  }\n\n  // MARK: Write Scalar functions\n  @inline(__always)\n  private mutating func write(offset: UInt64, byteWidth: Int) {\n    let offset: UInt64 = numericCast(writerIndex) &- offset\n    assert(byteWidth == 8 || offset < UInt64.one << (byteWidth * 8))\n    withUnsafePointer(to: offset) {\n      _bb.writeBytes($0, len: byteWidth)\n    }\n  }\n\n  @inline(__always)\n  private mutating func write<T>(value: T, byteWidth: Int) where T: Scalar {\n    withUnsafePointer(to: value) {\n      _bb.writeBytes($0, len: byteWidth)\n    }\n  }\n\n  @inline(__always)\n  private mutating func write(double value: Double, byteWidth: Int) {\n    switch byteWidth {\n    case 8: write(value: value, byteWidth: byteWidth)\n    case 4: write(value: Float(value), byteWidth: byteWidth)\n    default: assert(false, \"Should never reach here\")\n    }\n  }\n\n  // MARK: Misc functions\n  @discardableResult\n  @inline(__always)\n  private mutating func align(width: BitWidth) -> Int {\n    let bytes: Int = numericCast(UInt32.one << width.rawValue)\n    _bb.addPadding(bytes: bytes)\n    return bytes\n  }\n\n  @usableFromInline\n  mutating func sortMapByKeys(start: Int) -> Int {\n    let len = mapElementCount(start: start)\n    for index in stride(from: start, to: stack.count, by: 2) {\n      assert(stack[index].type == .key)\n    }\n\n    struct TwoValue: Equatable {\n      let key, value: Value\n    }\n\n    stack.withUnsafeMutableBytes(start: start) { buffer in\n      var ptr = buffer.assumingMemoryBound(to: TwoValue.self)\n      ptr.sort { a, b in\n        let aMem = _bb.memory.advanced(by: numericCast(a.key.u))\n          .assumingMemoryBound(to: CChar.self)\n        let bMem = _bb.memory.advanced(by: numericCast(b.key.u))\n          .assumingMemoryBound(to: CChar.self)\n\n        let comp = strcmp(aMem, bMem)\n        if (comp == 0) && a != b { hasDuplicatedKeys = true }\n        return comp < 0\n      }\n    }\n    return len\n  }\n\n  @inline(__always)\n  private func mapElementCount(start: Int) -> Int {\n    var len = stack.count - start\n    assert((len & 1) == 0)\n    len /= 2\n    return len\n  }\n}\n\n// MARK: - Vectors helper functions\nextension FlexBuffersWriter {\n  @discardableResult\n  public mutating func vector(\n    key: String,\n    _ closure: FlexBuffersWriterBuilder) -> UInt64\n  {\n    let start = startVector(key: key)\n    closure(&self)\n    return endVector(start: start)\n  }\n\n  @discardableResult\n  public mutating func vector(_ closure: FlexBuffersWriterBuilder)\n    -> UInt64\n  {\n    let start = startVector()\n    closure(&self)\n    return endVector(start: start)\n  }\n}\n\n// MARK: - Maps helper functions\nextension FlexBuffersWriter {\n  @discardableResult\n  public mutating func map(\n    key: String,\n    _ closure: FlexBuffersWriterBuilder) -> UInt64\n  {\n    let start = startMap(key: key)\n    closure(&self)\n    return endMap(start: start)\n  }\n\n  @discardableResult\n  public mutating func map(_ closure: FlexBuffersWriterBuilder)\n    -> UInt64\n  {\n    let start = startMap()\n    closure(&self)\n    return endMap(start: start)\n  }\n}\n\nfileprivate struct Stack: RandomAccessCollection {\n  typealias Element = Value\n  typealias Index = Int\n\n  private final class Storage {\n    var memory: UnsafeMutableRawPointer\n\n    init(capacity: Int, alignment: Int) {\n      memory = .allocate(byteCount: capacity, alignment: alignment)\n      memset(memory, 0, capacity)\n    }\n\n    deinit {\n      memory.deallocate()\n    }\n  }\n\n  private static let initialCapacity = 10 &* MemoryLayout<Value>.stride\n  private let storage: Storage\n  private var capacity: Int\n  private(set) var count: Int\n\n  var startIndex: Int {\n    0\n  }\n\n  var endIndex: Int {\n    count\n  }\n\n  init() {\n    count = 0\n    capacity = Self.initialCapacity\n\n    storage = Storage(\n      capacity: capacity,\n      alignment: MemoryLayout<Value>.alignment)\n  }\n\n  @inline(__always)\n  subscript(position: Int) -> Value {\n    get {\n      storage.memory.advanced(by: position &* MemoryLayout<Value>.stride)\n        .assumingMemoryBound(to: Value.self).pointee\n    }\n    set {\n      storage.memory.advanced(by: position &* MemoryLayout<Value>.stride)\n        .assumingMemoryBound(to: Value.self).pointee = newValue\n    }\n  }\n\n  @inline(__always)\n  mutating func popLast(_ val: Int) {\n    count = if val < 0 {\n      0\n    } else {\n      val\n    }\n  }\n\n  mutating func append(_ value: Value) {\n    let writePosition = count &* MemoryLayout<Value>.stride\n    if writePosition >= capacity {\n      reallocate(writePosition: writePosition)\n    }\n\n    storage.memory.advanced(by: writePosition).storeBytes(\n      of: value,\n      as: Value.self)\n    count += 1\n  }\n\n  mutating func removeAll(keepingCapacity keepCapacity: Bool = false) {\n    count = 0\n    if !keepCapacity {\n      capacity = Self.initialCapacity\n      storage.memory = UnsafeMutableRawPointer.allocate(\n        byteCount: capacity,\n        alignment: MemoryLayout<Value>.alignment)\n    }\n    memset(storage.memory, 0, capacity)\n  }\n\n  @discardableResult\n  mutating func withUnsafeMutableBytes<R>(\n    start: Int,\n    _ body: (UnsafeMutableRawBufferPointer) throws -> R) rethrows -> R\n  {\n    let startingPosition = start &* MemoryLayout<Value>.stride\n    let pointer = storage.memory.advanced(by: startingPosition)\n    return try body(UnsafeMutableRawBufferPointer(\n      start: pointer,\n      count: (count &* MemoryLayout<Value>.stride) &- startingPosition))\n  }\n\n  @discardableResult\n  mutating func withUnsafeMutableBytes<R>(\n    _ body: (UnsafeMutableRawBufferPointer) throws\n      -> R) rethrows -> R\n  {\n    return try body(UnsafeMutableRawBufferPointer(\n      start: storage.memory,\n      count: count &* MemoryLayout<Value>.stride))\n  }\n\n  mutating private func reallocate(writePosition: Int) {\n    while capacity <= writePosition {\n      capacity = capacity << 1\n    }\n\n    /// solution take from Apple-NIO\n    capacity = capacity.convertToPowerofTwo\n\n    let newData = UnsafeMutableRawPointer.allocate(\n      byteCount: capacity,\n      alignment: MemoryLayout<Value>.alignment)\n    memset(newData, 0, capacity)\n    memcpy(\n      newData,\n      storage.memory,\n      writePosition)\n    storage.memory.deallocate()\n    storage.memory = newData\n  }\n}\n"
  },
  {
    "path": "swift/Sources/FlexBuffers/_InternalByteBuffer.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\n\n#if canImport(Common)\nimport Common\n#endif\n\n/// `ByteBuffer` is the interface that stores the data for a `Flatbuffers` object\n/// it allows users to write and read data directly from memory thus the use of its\n/// functions should be used\n@usableFromInline\nstruct _InternalByteBuffer {\n\n  /// Storage is a container that would hold the memory pointer to solve the issue of\n  /// deallocating the memory that was held by (memory: UnsafeMutableRawPointer)\n  @usableFromInline\n  final class Storage {\n    /// pointer to the start of the buffer object in memory\n    var memory: UnsafeMutableRawPointer\n\n    @usableFromInline\n    init(count: Int, alignment: Int) {\n      memory = UnsafeMutableRawPointer.allocate(\n        byteCount: count,\n        alignment: alignment)\n    }\n\n    deinit {\n      memory.deallocate()\n    }\n\n    @usableFromInline\n    func initialize(for size: Int) {\n      memset(memory, 0, size)\n    }\n\n    /// Reallocates the buffer incase the object to be written doesnt fit in the current buffer\n    /// - Parameter size: Size of the current object\n    @usableFromInline\n    func reallocate(\n      capacity: Int,\n      writerSize: Int,\n      alignment: Int)\n    {\n      let newData = UnsafeMutableRawPointer.allocate(\n        byteCount: capacity,\n        alignment: alignment)\n      memset(newData, 0, capacity)\n      memcpy(\n        newData,\n        memory,\n        writerSize)\n      memory.deallocate()\n      memory = newData\n    }\n  }\n\n  @usableFromInline var _storage: Storage\n  // Initial size of the internal storage\n  private let initialSize: Int\n  /// The size of the elements written to the buffer + their paddings\n  var writerIndex: Int = 0\n  /// Alignment of the current  memory being written to the buffer\n  private var alignment = 1\n  /// Public Pointer to the buffer object in memory. This should NOT be modified for any reason\n  public var memory: UnsafeMutableRawPointer { _storage.memory }\n  /// Current capacity for the buffer\n  public private(set) var capacity: Int\n\n  /// Returns the written bytes into the ``ByteBuffer``\n  public var underlyingBytes: [UInt8] {\n    let start = memory.bindMemory(to: UInt8.self, capacity: writerIndex)\n\n    let ptr = UnsafeBufferPointer<UInt8>(start: start, count: writerIndex)\n    return Array(ptr)\n  }\n\n  /// Constructor that creates a Flatbuffer instance with a size\n  /// - Parameter:\n  ///   - size: Length of the buffer\n  ///   - allowReadingUnalignedBuffers: allow reading from unaligned buffer\n  init(initialSize size: Int) {\n    initialSize = size.convertToPowerofTwo\n    capacity = initialSize\n    _storage = Storage(count: initialSize, alignment: alignment)\n    _storage.initialize(for: initialSize)\n  }\n\n  /// Clears the current instance of the buffer, replacing it with new memory\n  @inline(__always)\n  mutating public func clear(keepingCapacity: Bool = false) {\n    writerIndex = 0\n    alignment = 1\n    if keepingCapacity {\n      _storage.initialize(for: capacity)\n    } else {\n      capacity = initialSize\n      _storage = Storage(count: initialSize, alignment: alignment)\n    }\n  }\n\n  @inline(__always)\n  mutating public func resetWriter(to writer: Int) {\n    writerIndex = writer\n  }\n\n  /// Makes sure that buffer has enouch space for each of the objects that will be written into it\n  /// - Parameter size: size of object\n  @usableFromInline\n  mutating func ensureSpace(size: Int) {\n    guard size &+ writerIndex > capacity else { return }\n\n    while capacity <= writerIndex &+ size {\n      capacity = capacity << 1\n    }\n\n    /// solution take from Apple-NIO\n    capacity = capacity.convertToPowerofTwo\n\n    _storage.reallocate(\n      capacity: capacity,\n      writerSize: writerIndex,\n      alignment: alignment)\n  }\n\n  @inline(__always)\n  mutating func addPadding(bytes: Int) {\n    writerIndex =\n      writerIndex\n        &+ numericCast(\n          padding(\n            bufSize: numericCast(writerIndex),\n            elementSize: numericCast(bytes)))\n    ensureSpace(size: writerIndex)\n  }\n\n  @inline(__always)\n  mutating func writeBytes(_ ptr: UnsafeRawPointer, len: Int) {\n    memcpy(\n      _storage.memory.advanced(by: writerIndex),\n      ptr,\n      len)\n    writerIndex = writerIndex &+ len\n  }\n\n  @inline(__always)\n  mutating func write<T>(_ v: T, len: Int) {\n    withUnsafePointer(to: v) {\n      memcpy(\n        _storage.memory.advanced(by: writerIndex),\n        $0,\n        len)\n      writerIndex = writerIndex &+ len\n    }\n  }\n\n  @discardableResult\n  @inline(__always)\n  func withUnsafeBytes<T>(\n    _ body: (UnsafeRawBufferPointer) throws\n      -> T) rethrows -> T\n  {\n    try body(\n      UnsafeRawBufferPointer(\n        start: _storage.memory,\n        count: capacity))\n  }\n\n  @discardableResult\n  @inline(__always)\n  func withUnsafeSlicedBytes<T>(\n    _ body: (UnsafeRawBufferPointer) throws\n      -> T) rethrows -> T\n  {\n    try body(\n      UnsafeRawBufferPointer(\n        start: _storage.memory,\n        count: writerIndex))\n  }\n\n  @discardableResult\n  @inline(__always)\n  func withUnsafeRawPointer<T>(\n    _ body: (UnsafeMutableRawPointer) throws\n      -> T) rethrows -> T\n  {\n    try body(_storage.memory)\n  }\n\n  @discardableResult\n  @inline(__always)\n  func readWithUnsafeRawPointer<T>(\n    position: Int,\n    _ body: (UnsafeRawPointer) throws -> T) rethrows -> T\n  {\n    try body(_storage.memory.advanced(by: position))\n  }\n}\n\nextension _InternalByteBuffer: CustomDebugStringConvertible {\n\n  public var debugDescription: String {\n    \"\"\"\n    buffer located at: \\(_storage.memory), with capacity of \\(capacity)\n    { writerIndex: \\(writerIndex) }\n    \"\"\"\n  }\n}\n"
  },
  {
    "path": "swift.swiftformat",
    "content": "--swiftversion 5.7\n\n# format\n--indent 2\n--maxwidth 80\n\n# options\n--self remove # redundantSelf\n--importgrouping testable-bottom # sortImports\n--trimwhitespace always\n--indentcase false\n--ifdef no-indent #indent\n--wraparguments before-first # wrapArguments\n--wrapparameters before-first # wrapArguments\n--closingparen same-line # wrapArguments\n--funcattributes prev-line # wrapAttributes\n--typeattributes prev-line # wrapAttributes\n\n# rules\n--rules wrap,todos,anyObjectProtocol,redundantParens,redundantSelf,sortImports,strongifiedSelf,trailingCommas,trailingSpace,wrapArguments,wrapMultilineStatementBraces,indent,wrapAttributes,void,fileHeader\n--disable trailingclosures\n\n--exclude **/*_generated.swift\n--exclude **/swift_code_*.swift\n--exclude **/*.grpc.swift\n--exclude **/Build/tests/**\n\n--header \"/*\\n * Copyright 2024 Google Inc. All rights reserved.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n *     http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n */\"\n"
  },
  {
    "path": "tests/.gitignore",
    "content": "# Generated files shouldn't be checked in for tests.\n**_generated.h"
  },
  {
    "path": "tests/64bit/evolution/v1.fbs",
    "content": "namespace v1;\n\ntable RootTable {\n  a:float;\n  b:[uint8];\n}\n\nroot_type RootTable;\n"
  },
  {
    "path": "tests/64bit/evolution/v2.fbs",
    "content": "namespace v2;\n\ntable RootTable {\n  a:float;\n  b:[uint8];\n  big_vector:[uint8] (vector64);\n}\n\nroot_type RootTable;\n"
  },
  {
    "path": "tests/64bit/offset64_test.cpp",
    "content": "#include \"offset64_test.h\"\n\n#include <stdint.h>\n\n#include <cstdint>\n#include <fstream>\n#include <limits>\n#include <ostream>\n\n#include \"flatbuffers/base.h\"\n#include \"flatbuffers/buffer.h\"\n#include \"flatbuffers/flatbuffer_builder.h\"\n#include \"flatbuffers/flatbuffers.h\"\n#include \"tests/64bit/evolution/v1_generated.h\"\n#include \"tests/64bit/evolution/v2_generated.h\"\n#include \"tests/64bit/test_64bit_generated.h\"\n#include \"tests/test_assert.h\"\n\nnamespace flatbuffers {\nnamespace tests {\n\nvoid Offset64Test() {\n  FlatBufferBuilder64 builder;\n\n  const size_t far_vector_size = 1LL << 2;\n  // Make a large number if wanting to test a real large buffer.\n  const size_t big_vector_size = 1LL << 2;\n\n  {\n    // First create the vectors that will be copied to the buffer.\n    std::vector<uint8_t> far_data;\n    far_data.resize(far_vector_size);\n    far_data[0] = 4;\n    far_data[far_vector_size - 1] = 2;\n\n    std::vector<bool> big_bool_data = {true,  false, true, true,\n                                       false, false, true};\n\n    std::vector<uint8_t> big_data;\n    big_data.resize(big_vector_size);\n    big_data[0] = 8;\n    big_data[big_vector_size - 1] = 3;\n\n    // Then serialize all the fields that have 64-bit offsets, as these must be\n    // serialized before any 32-bit fields are added to the buffer.\n    const Offset64<Vector<uint8_t>> far_vector_offset =\n        builder.CreateVector64<Vector>(far_data);\n\n    const Offset64<String> far_string_offset =\n        builder.CreateString<Offset64>(\"some far string\");\n\n    const Offset64<Vector64<uint8_t>> big_vector_offset =\n        builder.CreateVector64(big_data);\n\n    const Offset64<Vector64<uint8_t>> big_bool_vector_offset =\n        builder.CreateVector64(big_bool_data);\n\n    // Now that we are done with the 64-bit fields, we can create and add the\n    // normal fields.\n    const Offset<String> near_string_offset =\n        builder.CreateString(\"some near string\");\n\n    // Finish by building the root table by passing in all the offsets.\n    const Offset<RootTable> root_table_offset = CreateRootTable(\n        builder, far_vector_offset, 0, far_string_offset,\n        big_bool_vector_offset, big_vector_offset, near_string_offset);\n\n    // Finish the buffer.\n    builder.Finish(root_table_offset);\n\n    Verifier::Options options;\n    // Allow the verifier to verify 64-bit buffers.\n    options.max_size = FLATBUFFERS_MAX_64_BUFFER_SIZE;\n    options.assert = true;\n\n    Verifier verifier(builder.GetBufferPointer(), builder.GetSize(), options);\n\n    TEST_EQ(VerifyRootTableBuffer(verifier), true);\n  }\n\n  {\n    const RootTable* root_table = GetRootTable(builder.GetBufferPointer());\n\n    // Expect the far vector to be properly sized.\n    TEST_EQ(root_table->far_vector()->size(), far_vector_size);\n    TEST_EQ(root_table->far_vector()->Get(0), 4);\n    TEST_EQ(root_table->far_vector()->Get(far_vector_size - 1), 2);\n\n    TEST_EQ_STR(root_table->far_string()->c_str(), \"some far string\");\n\n    // Expect the big vector to be properly sized.\n    TEST_EQ(root_table->big_vector()->size(), big_vector_size);\n    TEST_EQ(root_table->big_vector()->Get(0), 8);\n    TEST_EQ(root_table->big_vector()->Get(big_vector_size - 1), 3);\n\n    TEST_EQ_STR(root_table->near_string()->c_str(), \"some near string\");\n  }\n}\n\nvoid Offset64SerializedFirst() {\n  FlatBufferBuilder64 fbb;\n\n  // First create the vectors that will be copied to the buffer.\n  std::vector<uint8_t> data;\n  data.resize(64);\n\n  // Then serialize all the fields that have 64-bit offsets, as these must be\n  // serialized before any 32-bit fields are added to the buffer.\n  fbb.CreateVector64(data);\n\n  // TODO(derekbailey): figure out how to test assertions.\n  // Uncommenting this line should fail the test with an assertion.\n  // fbb.CreateString(\"some near string\");\n\n  fbb.CreateVector64(data);\n}\n\nvoid Offset64NestedFlatBuffer() {\n  FlatBufferBuilder64 fbb;\n\n  // First serialize a nested buffer.\n  const Offset<String> near_string_offset =\n      fbb.CreateString(\"nested: some near string\");\n\n  // Finish by building the root table by passing in all the offsets.\n  const Offset<RootTable> root_table_offset =\n      CreateRootTable(fbb, 0, 0, 0, 0, 0, near_string_offset, 0);\n\n  // Finish the buffer.\n  fbb.Finish(root_table_offset);\n\n  // Ensure the buffer is valid.\n  const RootTable* root_table = GetRootTable(fbb.GetBufferPointer());\n  TEST_EQ_STR(root_table->near_string()->c_str(), \"nested: some near string\");\n\n  // Copy the data out of the builder.\n  std::vector<uint8_t> nested_data{fbb.GetBufferPointer(),\n                                   fbb.GetBufferPointer() + fbb.GetSize()};\n\n  {\n    // Clear so we can reuse the builder.\n    fbb.Clear();\n\n    const Offset64<Vector64<uint8_t>> nested_flatbuffer_offset =\n        fbb.CreateVector64<Vector64>(nested_data);\n\n    // Now that we are done with the 64-bit fields, we can create and add the\n    // normal fields.\n    const Offset<String> near_string_offset =\n        fbb.CreateString(\"some near string\");\n\n    // Finish by building the root table by passing in all the offsets.\n    const Offset<RootTable> root_table_offset = CreateRootTable(\n        fbb, 0, 0, 0, 0, 0, near_string_offset, nested_flatbuffer_offset);\n\n    // Finish the buffer.\n    fbb.Finish(root_table_offset);\n\n    Verifier::Options options;\n    // Allow the verifier to verify 64-bit buffers.\n    options.max_size = FLATBUFFERS_MAX_64_BUFFER_SIZE;\n    options.assert = true;\n\n    Verifier verifier(fbb.GetBufferPointer(), fbb.GetSize(), options);\n\n    TEST_EQ(VerifyRootTableBuffer(verifier), true);\n  }\n\n  {\n    const RootTable* root_table = GetRootTable(fbb.GetBufferPointer());\n\n    // Test that the parent buffer field is ok.\n    TEST_EQ_STR(root_table->near_string()->c_str(), \"some near string\");\n\n    // Expect nested buffer to be properly sized.\n    TEST_EQ(root_table->nested_root()->size(), nested_data.size());\n\n    // Expect the direct accessors to the nested buffer work.\n    TEST_EQ_STR(root_table->nested_root_nested_root()->near_string()->c_str(),\n                \"nested: some near string\");\n  }\n}\n\nvoid Offset64CreateDirect() {\n  FlatBufferBuilder64 fbb;\n\n  // Create a vector of some data\n  std::vector<uint8_t> data{0, 1, 2};\n\n  // Call the \"Direct\" creation method to ensure that things are added to the\n  // buffer in the correct order, Offset64 first followed by any Offsets.\n  const Offset<RootTable> root_table_offset = CreateRootTableDirect(\n      fbb, &data, 0, \"some far string\", nullptr, &data, \"some near string\");\n\n  // Finish the buffer.\n  fbb.Finish(root_table_offset);\n\n  Verifier::Options options;\n  // Allow the verifier to verify 64-bit buffers.\n  options.max_size = FLATBUFFERS_MAX_64_BUFFER_SIZE;\n  options.assert = true;\n\n  Verifier verifier(fbb.GetBufferPointer(), fbb.GetSize(), options);\n\n  TEST_EQ(VerifyRootTableBuffer(verifier), true);\n\n  // Verify the data.\n  const RootTable* root_table = GetRootTable(fbb.GetBufferPointer());\n  TEST_EQ(root_table->far_vector()->size(), data.size());\n  TEST_EQ(root_table->big_vector()->size(), data.size());\n  TEST_EQ_STR(root_table->far_string()->c_str(), \"some far string\");\n  TEST_EQ_STR(root_table->near_string()->c_str(), \"some near string\");\n}\n\nvoid Offset64Evolution() {\n  // Some common data for the tests.\n  const std::vector<uint8_t> data = {1, 2, 3, 4};\n  const std::vector<uint8_t> big_data = {6, 7, 8, 9, 10};\n\n  // Built V1 read V2\n  {\n    // Use the 32-bit builder since V1 doesn't have any 64-bit offsets.\n    FlatBufferBuilder builder;\n\n    builder.Finish(v1::CreateRootTableDirect(builder, 1234, &data));\n\n    // Use each version to get a view at the root table.\n    auto v1_root = v1::GetRootTable(builder.GetBufferPointer());\n    auto v2_root = v2::GetRootTable(builder.GetBufferPointer());\n\n    // Test field equivalents for fields common to V1 and V2.\n    TEST_EQ(v1_root->a(), v2_root->a());\n\n    TEST_EQ(v1_root->b(), v2_root->b());\n    TEST_EQ(v1_root->b()->Get(2), 3);\n    TEST_EQ(v2_root->b()->Get(2), 3);\n\n    // This field is added in V2, so it should be null since V1 couldn't have\n    // written it.\n    TEST_ASSERT(v2_root->big_vector() == nullptr);\n  }\n\n  // Built V2 read V1\n  {\n    // Use the 64-bit builder since V2 has 64-bit offsets.\n    FlatBufferBuilder64 builder;\n\n    builder.Finish(v2::CreateRootTableDirect(builder, 1234, &data, &big_data));\n\n    // Use each version to get a view at the root table.\n    auto v1_root = v1::GetRootTable(builder.GetBufferPointer());\n    auto v2_root = v2::GetRootTable(builder.GetBufferPointer());\n\n    // Test field equivalents for fields common to V1 and V2.\n    TEST_EQ(v1_root->a(), v2_root->a());\n\n    TEST_EQ(v1_root->b(), v2_root->b());\n    TEST_EQ(v1_root->b()->Get(2), 3);\n    TEST_EQ(v2_root->b()->Get(2), 3);\n\n    // Test that V2 can read the big vector, which V1 doesn't even have\n    // accessors for (i.e. v1_root->big_vector() doesn't exist).\n    TEST_ASSERT(v2_root->big_vector() != nullptr);\n    TEST_EQ(v2_root->big_vector()->size(), big_data.size());\n    TEST_EQ(v2_root->big_vector()->Get(2), 8);\n  }\n\n  // Built V2 read V1, bigger than max 32-bit buffer sized.\n  // This checks that even a large buffer can still be read by V1.\n  {\n    // Use the 64-bit builder since V2 has 64-bit offsets.\n    FlatBufferBuilder64 builder;\n\n    std::vector<uint8_t> giant_data;\n    giant_data.resize(1LL << 3);\n    giant_data[2] = 42;\n\n    builder.Finish(\n        v2::CreateRootTableDirect(builder, 1234, &data, &giant_data));\n\n    // Use each version to get a view at the root table.\n    auto v1_root = v1::GetRootTable(builder.GetBufferPointer());\n    auto v2_root = v2::GetRootTable(builder.GetBufferPointer());\n\n    // Test field equivalents for fields common to V1 and V2.\n    TEST_EQ(v1_root->a(), v2_root->a());\n\n    TEST_EQ(v1_root->b(), v2_root->b());\n    TEST_EQ(v1_root->b()->Get(2), 3);\n    TEST_EQ(v2_root->b()->Get(2), 3);\n\n    // Test that V2 can read the big vector, which V1 doesn't even have\n    // accessors for (i.e. v1_root->big_vector() doesn't exist).\n    TEST_ASSERT(v2_root->big_vector() != nullptr);\n    TEST_EQ(v2_root->big_vector()->size(), giant_data.size());\n    TEST_EQ(v2_root->big_vector()->Get(2), 42);\n  }\n}\n\nvoid Offset64VectorOfStructs() {\n  FlatBufferBuilder64 builder;\n\n  std::vector<LeafStruct> far_leaves;\n  far_leaves.emplace_back(LeafStruct{123, 4.567});\n  far_leaves.emplace_back(LeafStruct{987, 6.543});\n\n  std::vector<LeafStruct> big_leaves;\n  big_leaves.emplace_back(LeafStruct{72, 72.8});\n  big_leaves.emplace_back(LeafStruct{82, 82.8});\n  big_leaves.emplace_back(LeafStruct{92, 92.8});\n\n  // Add the two vectors of leaf structs.\n  const Offset<RootTable> root_table_offset =\n      CreateRootTableDirect(builder, nullptr, 0, nullptr, nullptr, nullptr,\n                            nullptr, nullptr, &far_leaves, &big_leaves);\n\n  // Finish the buffer.\n  builder.Finish(root_table_offset);\n\n  Verifier::Options options;\n  // Allow the verifier to verify 64-bit buffers.\n  options.max_size = FLATBUFFERS_MAX_64_BUFFER_SIZE;\n  options.assert = true;\n\n  Verifier verifier(builder.GetBufferPointer(), builder.GetSize(), options);\n\n  TEST_EQ(VerifyRootTableBuffer(verifier), true);\n\n  // Verify the data.\n  const RootTable* root_table = GetRootTable(builder.GetBufferPointer());\n  TEST_EQ(root_table->far_struct_vector()->size(), far_leaves.size());\n  TEST_EQ(root_table->far_struct_vector()->Get(0)->a(), 123);\n  TEST_EQ(root_table->far_struct_vector()->Get(0)->b(), 4.567);\n  TEST_EQ(root_table->far_struct_vector()->Get(1)->a(), 987);\n  TEST_EQ(root_table->far_struct_vector()->Get(1)->b(), 6.543);\n\n  TEST_EQ(root_table->big_struct_vector()->size(), big_leaves.size());\n  TEST_EQ(root_table->big_struct_vector()->Get(0)->a(), 72);\n  TEST_EQ(root_table->big_struct_vector()->Get(0)->b(), 72.8);\n  TEST_EQ(root_table->big_struct_vector()->Get(1)->a(), 82);\n  TEST_EQ(root_table->big_struct_vector()->Get(1)->b(), 82.8);\n  TEST_EQ(root_table->big_struct_vector()->Get(2)->a(), 92);\n  TEST_EQ(root_table->big_struct_vector()->Get(2)->b(), 92.8);\n}\n\nvoid Offset64SizePrefix() {\n  FlatBufferBuilder64 builder;\n\n  // First serialize a nested buffer.\n  const Offset<String> near_string_offset =\n      builder.CreateString(\"some near string\");\n\n  // Finish by building the root table by passing in all the offsets.\n  const Offset<RootTable> root_table_offset =\n      CreateRootTable(builder, 0, 0, 0, 0, 0, near_string_offset, 0);\n\n  // Finish the buffer.\n  FinishSizePrefixedRootTableBuffer(builder, root_table_offset);\n\n  TEST_EQ(GetPrefixedSize<uoffset64_t>(builder.GetBufferPointer()),\n          builder.GetSize() - sizeof(uoffset64_t));\n\n  Verifier::Options options;\n  // Allow the verifier to verify 64-bit buffers.\n  options.max_size = FLATBUFFERS_MAX_64_BUFFER_SIZE;\n  options.assert = true;\n\n  Verifier verifier(builder.GetBufferPointer(), builder.GetSize(), options);\n\n  TEST_EQ(VerifySizePrefixedRootTableBuffer(verifier), true);\n\n  const RootTable* root_table =\n      GetSizePrefixedRootTable(builder.GetBufferPointer());\n\n  // Verify the fields.\n  TEST_EQ_STR(root_table->near_string()->c_str(), \"some near string\");\n}\n\nvoid Offset64ManyVectors() {\n  FlatBufferBuilder64 builder;\n\n  // Setup some data to serialize.\n  std::vector<int8_t> data;\n  data.resize(20);\n  data.front() = 42;\n  data.back() = 18;\n\n  const size_t kNumVectors = 20;\n\n  // First serialize all the 64-bit address vectors. We need to store all the\n  // offsets to later add to a wrapper table. We cannot serialize one vector and\n  // then add it to a table immediately, as it would violate the strict ordering\n  // of putting all 64-bit things at the tail of the buffer.\n  std::array<Offset64<Vector<int8_t>>, kNumVectors> offsets_64bit;\n  for (size_t i = 0; i < kNumVectors; ++i) {\n    offsets_64bit[i] = builder.CreateVector64<Vector>(data);\n  }\n\n  // Create some unrelated, 64-bit offset value for later testing.\n  const Offset64<String> far_string_offset =\n      builder.CreateString<Offset64>(\"some far string\");\n\n  // Now place all the offsets into their own wrapper tables. Again, we have to\n  // store the offsets before we can add them to the root table vector.\n  std::array<Offset<WrapperTable>, kNumVectors> offsets_wrapper;\n  for (size_t i = 0; i < kNumVectors; ++i) {\n    offsets_wrapper[i] = CreateWrapperTable(builder, offsets_64bit[i]);\n  }\n\n  // Now create the 32-bit vector that is stored in the root table.\n  // TODO(derekbailey): the array type wasn't auto deduced, see if that could be\n  // fixed.\n  const Offset<Vector<Offset<WrapperTable>>> many_vectors_offset =\n      builder.CreateVector<Offset<WrapperTable>>(offsets_wrapper);\n\n  // Finish by building using the root table builder, to exercise a different\n  // code path than the other tests.\n  RootTableBuilder root_table_builder(builder);\n  root_table_builder.add_many_vectors(many_vectors_offset);\n  root_table_builder.add_far_string(far_string_offset);\n  const Offset<RootTable> root_table_offset = root_table_builder.Finish();\n\n  // Finish the buffer.\n  FinishRootTableBuffer(builder, root_table_offset);\n\n  Verifier::Options options;\n  // Allow the verifier to verify 64-bit buffers.\n  options.max_size = FLATBUFFERS_MAX_64_BUFFER_SIZE;\n  options.assert = true;\n\n  Verifier verifier(builder.GetBufferPointer(), builder.GetSize(), options);\n\n  TEST_EQ(VerifyRootTableBuffer(verifier), true);\n\n  const RootTable* root_table = GetRootTable(builder.GetBufferPointer());\n\n  // Verify the fields.\n  TEST_EQ_STR(root_table->far_string()->c_str(), \"some far string\");\n  TEST_EQ(root_table->many_vectors()->size(), kNumVectors);\n\n  // Spot check one of the vectors.\n  TEST_EQ(root_table->many_vectors()->Get(12)->vector()->size(), 20);\n  TEST_EQ(root_table->many_vectors()->Get(12)->vector()->Get(0), 42);\n  TEST_EQ(root_table->many_vectors()->Get(12)->vector()->Get(19), 18);\n}\n\nvoid Offset64ForceAlign() {\n  FlatBufferBuilder64 builder;\n\n  // Setup some data to serialize that is less than the force_align size of 32\n  // bytes.\n  std::vector<uint8_t> data{1, 2, 3};\n\n  // Use the CreateDirect which calls the ForceVectorAlign\n  const auto root_table_offset =\n      CreateRootTableDirect(builder, nullptr, 0, nullptr, nullptr, nullptr,\n                            nullptr, nullptr, nullptr, nullptr, nullptr, &data);\n\n  // Finish the buffer.\n  FinishRootTableBuffer(builder, root_table_offset);\n}\n\n}  // namespace tests\n}  // namespace flatbuffers\n"
  },
  {
    "path": "tests/64bit/offset64_test.h",
    "content": "#ifndef TESTS_64BIT_OFFSET64_TEST_H\n#define TESTS_64BIT_OFFSET64_TEST_H\n\nnamespace flatbuffers {\nnamespace tests {\n\nvoid Offset64Test();\nvoid Offset64SerializedFirst();\nvoid Offset64NestedFlatBuffer();\nvoid Offset64CreateDirect();\nvoid Offset64Evolution();\nvoid Offset64VectorOfStructs();\nvoid Offset64SizePrefix();\nvoid Offset64ManyVectors();\nvoid Offset64ForceAlign();\n\n}  // namespace tests\n}  // namespace flatbuffers\n\n#endif  // TESTS_64BIT_OFFSET64_TEST_H\n"
  },
  {
    "path": "tests/64bit/test_64bit.afb",
    "content": "// Annotated Flatbuffer Binary\n//\n// Schema file: tests/64bit/test_64bit.bfbs\n// Binary file: tests/64bit/test_64bit.bin\n\nheader:\n  +0x0000 | 1C 00 00 00             | UOffset32  | 0x0000001C (28) Loc: 0x001C          | offset to root table `RootTable`\n\npadding:\n  +0x0004 | 00 00                   | uint8_t[2] | ..                                   | padding\n\nvtable (RootTable):\n  +0x0006 | 16 00                   | uint16_t   | 0x0016 (22)                          | size of this vtable\n  +0x0008 | 3C 00                   | uint16_t   | 0x003C (60)                          | size of referring table\n  +0x000A | 04 00                   | VOffset16  | 0x0004 (4)                           | offset to field `far_vector` (id: 0)\n  +0x000C | 10 00                   | VOffset16  | 0x0010 (16)                          | offset to field `a` (id: 1)\n  +0x000E | 14 00                   | VOffset16  | 0x0014 (20)                          | offset to field `far_string` (id: 2)\n  +0x0010 | 24 00                   | VOffset16  | 0x0024 (36)                          | offset to field `big_bool_vector` (id: 3)\n  +0x0012 | 2C 00                   | VOffset16  | 0x002C (44)                          | offset to field `big_vector` (id: 4)\n  +0x0014 | 20 00                   | VOffset16  | 0x0020 (32)                          | offset to field `near_string` (id: 5)\n  +0x0016 | 00 00                   | VOffset16  | 0x0000 (0)                           | offset to field `nested_root` (id: 6) <null> (Vector64)\n  +0x0018 | 00 00                   | VOffset16  | 0x0000 (0)                           | offset to field `far_struct_vector` (id: 7) <null> (Vector)\n  +0x001A | 34 00                   | VOffset16  | 0x0034 (52)                          | offset to field `big_struct_vector` (id: 8)\n\nroot_table (RootTable):\n  +0x001C | 16 00 00 00             | SOffset32  | 0x00000016 (22) Loc: 0x0006          | offset to vtable\n  +0x0020 | E8 00 00 00 00 00 00 00 | UOffset64  | 0x00000000000000E8 (232) Loc: 0x0108 | offset to field `far_vector` (vector)\n  +0x0028 | 00 00 00 00             | uint8_t[4] | ....                                 | padding\n  +0x002C | D2 04 00 00             | uint32_t   | 0x000004D2 (1234)                    | table field `a` (Int)\n  +0x0030 | A4 00 00 00 00 00 00 00 | UOffset64  | 0x00000000000000A4 (164) Loc: 0x00D4 | offset to field `far_string` (string)\n  +0x0038 | 00 00 00 00             | uint8_t[4] | ....                                 | padding\n  +0x003C | 48 00 00 00             | UOffset32  | 0x00000048 (72) Loc: 0x0084          | offset to field `near_string` (string)\n  +0x0040 | 78 00 00 00 00 00 00 00 | UOffset64  | 0x0000000000000078 (120) Loc: 0x00B8 | offset to field `big_bool_vector` (vector64)\n  +0x0048 | 80 00 00 00 00 00 00 00 | UOffset64  | 0x0000000000000080 (128) Loc: 0x00C8 | offset to field `big_vector` (vector64)\n  +0x0050 | 08 00 00 00 00 00 00 00 | UOffset64  | 0x0000000000000008 (8) Loc: 0x0058   | offset to field `big_struct_vector` (vector64)\n\nvector64 (RootTable.big_struct_vector):\n  +0x0058 | 02 00 00 00 00 00 00 00 | uint64_t   | 0x0000000000000002 (2)               | length of vector (# items)\n  +0x0060 | 0C 00 00 00             | uint32_t   | 0x0000000C (12)                      | struct field `[0].a` of 'LeafStruct' (Int)\n  +0x0064 | 00 00 00 00             | uint8_t[4] | ....                                 | padding\n  +0x0068 | D9 CE F7 53 E3 A5 0B 40 | double     | 0x400BA5E353F7CED9 (3.456)           | struct field `[0].b` of 'LeafStruct' (Double)\n  +0x0070 | 4E 00 00 00             | uint32_t   | 0x0000004E (78)                      | struct field `[1].a` of 'LeafStruct' (Int)\n  +0x0074 | 00 00 00 00             | uint8_t[4] | ....                                 | padding\n  +0x0078 | 33 33 33 33 33 33 22 40 | double     | 0x4022333333333333 (9.1)             | struct field `[1].b` of 'LeafStruct' (Double)\n\npadding:\n  +0x0080 | 00 00 00 00             | uint8_t[4] | ....                                 | padding\n\nstring (RootTable.near_string):\n  +0x0084 | 2F 00 00 00             | uint32_t   | 0x0000002F (47)                      | length of string\n  +0x0088 | 74 68 69 73 20 69 73 20 | char[47]   | this is                              | string literal\n  +0x0090 | 61 20 6E 65 61 72 20 73 |            | a near s\n  +0x0098 | 74 72 69 6E 67 20 77 68 |            | tring wh\n  +0x00A0 | 69 63 68 20 68 61 73 20 |            | ich has \n  +0x00A8 | 61 20 33 32 2D 62 69 74 |            | a 32-bit\n  +0x00B0 | 20 6F 66 66 73 65 74    |            |  offset\n  +0x00B7 | 00                      | char       | 0x00 (0)                             | string terminator\n\nvector64 (RootTable.big_bool_vector):\n  +0x00B8 | 07 00 00 00 00 00 00 00 | uint64_t   | 0x0000000000000007 (7)               | length of vector (# items)\n  +0x00C0 | 01                      | uint8_t    | 0x01 (1)                             | value[0]\n  +0x00C1 | 00                      | uint8_t    | 0x00 (0)                             | value[1]\n  +0x00C2 | 01                      | uint8_t    | 0x01 (1)                             | value[2]\n  +0x00C3 | 01                      | uint8_t    | 0x01 (1)                             | value[3]\n  +0x00C4 | 00                      | uint8_t    | 0x00 (0)                             | value[4]\n  +0x00C5 | 00                      | uint8_t    | 0x00 (0)                             | value[5]\n  +0x00C6 | 01                      | uint8_t    | 0x01 (1)                             | value[6]\n\nvector64 (RootTable.big_vector):\n  +0x00C8 | 04 00 00 00 00 00 00 00 | uint64_t   | 0x0000000000000004 (4)               | length of vector (# items)\n  +0x00D0 | 05                      | uint8_t    | 0x05 (5)                             | value[0]\n  +0x00D1 | 06                      | uint8_t    | 0x06 (6)                             | value[1]\n  +0x00D2 | 07                      | uint8_t    | 0x07 (7)                             | value[2]\n  +0x00D3 | 08                      | uint8_t    | 0x08 (8)                             | value[3]\n\nstring (RootTable.far_string):\n  +0x00D4 | 2E 00 00 00             | uint32_t   | 0x0000002E (46)                      | length of string\n  +0x00D8 | 74 68 69 73 20 69 73 20 | char[46]   | this is                              | string literal\n  +0x00E0 | 61 20 66 61 72 20 73 74 |            | a far st\n  +0x00E8 | 72 69 6E 67 20 77 68 69 |            | ring whi\n  +0x00F0 | 63 68 20 68 61 73 20 61 |            | ch has a\n  +0x00F8 | 20 36 34 2D 62 69 74 20 |            |  64-bit \n  +0x0100 | 6F 66 66 73 65 74       |            | offset\n  +0x0106 | 00                      | char       | 0x00 (0)                             | string terminator\n\nvector (RootTable.far_vector):\n  +0x0108 | 03 00 00 00             | uint32_t   | 0x00000003 (3)                       | length of vector (# items)\n  +0x010C | 01                      | uint8_t    | 0x01 (1)                             | value[0]\n  +0x010D | 02                      | uint8_t    | 0x02 (2)                             | value[1]\n  +0x010E | 03                      | uint8_t    | 0x03 (3)                             | value[2]\n"
  },
  {
    "path": "tests/64bit/test_64bit.fbs",
    "content": "struct LeafStruct {\n  a:int;\n  b:double;\n}\n\ntable WrapperTable {\n  // A normal 32-bit sized vector that could be very far away (64-bit address).\n  vector:[int8] (offset64);\n}\n\ntable RootTable {\n  // A normal 32-bit sized vector, that could be very far away (64-bit address).\n  far_vector:[ubyte] (offset64);\n\n  // An inplace value just to check that vtable offsets are correct.\n  a:int;\n\n  // A normal 32-bit sized string, that could be very far away (64-bit address).\n  far_string:string (offset64);\n\n  // a big vector of bool, that could be very far away (64-bit address).\n  // tests vector<bool> specialization with 64-bit offsets.\n  big_bool_vector:[ubyte] (vector64);\n\n  // A big 64-bit sized vector, that could be very far away (64-bit address).\n  big_vector:[ubyte] (vector64);\n\n  // A normal 32-bit sized string that is no far away (32-bit address).\n  near_string:string;\n\n  // A big 64-bit sized vector that is a nested flatbuffers (64-bit address).\n  nested_root:[ubyte] (vector64, nested_flatbuffer: \"RootTable\");\n\n  // A normal 32-bit size vector of structs, that could be very far away\n  // (64-bit address)\n  far_struct_vector:[LeafStruct] (offset64);\n\n  // A big 64-bit size vector of structs that could be very far away\n  // (64-bit address)\n  big_struct_vector:[LeafStruct] (vector64);\n\n  // A normal 32-bit size vector of tables. Currently 64-bit vectors don't\n  // support tables as it would require serializing a table (32-bit) before the\n  // vector (64-bit), which is not allowed.\n  //\n  // This demonstrates how you could have many vectors in the buffer, by\n  // effectively having a vector of 64-bit vectors. The IDL doesn't support\n  // nested vecotrs (e.g.: [[type]] ), so going through a wrapper table allows\n  // this.\n  many_vectors:[WrapperTable];\n\n  // A vector that has force_align to test that the 32/64 bit region of the\n  // builder is respected.\n  forced_aligned_vector:[ubyte] (vector64, force_align:32);\n}\n\nroot_type RootTable;\n"
  },
  {
    "path": "tests/64bit/test_64bit.json",
    "content": "{\n  \"far_vector\": [1, 2, 3],\n  \"a\": 1234,\n  \"far_string\": \"this is a far string which has a 64-bit offset\",\n  \"big_vector\": [5, 6, 7, 8],\n  \"big_bool_vector\": [\n    1,\n    0,\n    1,\n    1,\n    0,\n    0,\n    1\n  ],\n  \"near_string\": \"this is a near string which has a 32-bit offset\",\n  \"big_struct_vector\": [\n    {\n      \"a\": 12,\n      \"b\": 3.456\n    },\n    {\n      \"a\": 78,\n      \"b\": 9.10\n    }\n  ]\n}\n"
  },
  {
    "path": "tests/Abc.nim",
    "content": "#[ Abc\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : \n]#\n\ntype Abc*{.pure.} = enum\n  A = 0.int32,\n  B = 1.int32,\n  C = 2.int32,\n"
  },
  {
    "path": "tests/BUILD.bazel",
    "content": "load(\"@aspect_bazel_lib//lib:copy_to_bin.bzl\", \"copy_to_bin\")\nload(\"@rules_cc//cc:defs.bzl\", \"cc_library\", \"cc_test\")\nload(\"//:build_defs.bzl\", \"DEFAULT_FLATC_ARGS\", \"flatbuffer_cc_library\")\n\npackage(default_visibility = [\"//visibility:private\"])\n\nexports_files([\n    \"bazel_repository_test_template.sh\",\n])\n\n# rules_js works around various JS tooling limitations by copying everything\n# into the output directory. Make the test data available to the tests this way.\ncopy_to_bin(\n    name = \"test_data_copied_to_bin\",\n    srcs = glob([\n        \"*.mon\",\n        \"*.json\",\n    ]),\n    visibility = [\"//tests/ts:__subpackages__\"],\n)\n\n# Test binary.\ncc_test(\n    name = \"flatbuffers_test\",\n    testonly = 1,\n    srcs = [\n        \"64bit/evolution/v1_generated.h\",\n        \"64bit/evolution/v2_generated.h\",\n        \"64bit/offset64_test.cpp\",\n        \"64bit/offset64_test.h\",\n        \"64bit/test_64bit_bfbs_generated.h\",\n        \"64bit/test_64bit_generated.h\",\n        \"alignment_test.cpp\",\n        \"alignment_test.h\",\n        \"alignment_test_generated.h\",\n        \"default_vectors_strings_test.cpp\",\n        \"default_vectors_strings_test.h\",\n        \"evolution_test.cpp\",\n        \"evolution_test.h\",\n        \"evolution_test/evolution_v1_generated.h\",\n        \"evolution_test/evolution_v2_generated.h\",\n        \"flexbuffers_test.cpp\",\n        \"flexbuffers_test.h\",\n        \"fuzz_test.cpp\",\n        \"fuzz_test.h\",\n        \"is_quiet_nan.h\",\n        \"json_test.cpp\",\n        \"json_test.h\",\n        \"key_field/key_field_sample_generated.h\",\n        \"key_field_test.cpp\",\n        \"key_field_test.h\",\n        \"monster_test.cpp\",\n        \"monster_test.h\",\n        \"monster_test_bfbs_generated.h\",\n        \"cross_namespace_pack_test_generated.h\",\n        \"namespace_test/namespace_test1_generated.h\",\n        \"namespace_test/namespace_test2_generated.h\",\n        \"native_inline_table_test_generated.h\",\n        \"native_type_test_impl.cpp\",\n        \"native_type_test_impl.h\",\n        \"optional_scalars_generated.h\",\n        \"optional_scalars_test.cpp\",\n        \"optional_scalars_test.h\",\n        \"parser_test.cpp\",\n        \"parser_test.h\",\n        \"proto_test.cpp\",\n        \"proto_test.h\",\n        \"reflection_test.cpp\",\n        \"reflection_test.h\",\n        \"test.cpp\",\n        \"test_assert.cpp\",\n        \"test_assert.h\",\n        \"test_builder.cpp\",\n        \"test_builder.h\",\n        \"union_underlying_type_test_generated.h\",\n        \"union_vector/union_vector_generated.h\",\n        \"util_test.cpp\",\n        \"util_test.h\",\n        \"vector_table_naked_ptr/vector_table_naked_ptr_generated.h\",\n        \"vector_table_naked_ptr_test.h\",\n        \"vector_table_naked_ptr_test.cpp\",\n    ],\n    copts = [\n        \"-DFLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE\",\n    ],\n    data = [\n        \":alignment_test.fbs\",\n        \":arrays_test.bfbs\",\n        \":arrays_test.fbs\",\n        \":arrays_test.golden\",\n        \":evolution_test/evolution_v1.fbs\",\n        \":evolution_test/evolution_v1.json\",\n        \":evolution_test/evolution_v2.fbs\",\n        \":evolution_test/evolution_v2.json\",\n        \":include_test/include_test1.fbs\",\n        \":include_test/sub/include_test2.fbs\",\n        \":key_field/key_field_sample.fbs\",\n        \":monster_extra.fbs\",\n        \":monster_test.bfbs\",\n        \":monster_test.fbs\",\n        \":monsterdata_extra.json\",\n        \":monsterdata_test.golden\",\n        \":monsterdata_test.json\",\n        \":name_clash_test/invalid_test1.fbs\",\n        \":name_clash_test/invalid_test2.fbs\",\n        \":name_clash_test/valid_test1.fbs\",\n        \":name_clash_test/valid_test2.fbs\",\n        \":native_type_test.fbs\",\n        \":optional_scalars.fbs\",\n        \":optional_scalars.json\",\n        \":optional_scalars_defaults.json\",\n        \":prototest/imported.proto\",\n        \":prototest/non-positive-id.proto\",\n        \":prototest/test.golden.fbs\",\n        \":prototest/test.proto\",\n        \":prototest/test_id.golden.fbs\",\n        \":prototest/test_include.golden.fbs\",\n        \":prototest/test_include_id.golden.fbs\",\n        \":prototest/test_suffix.golden.fbs\",\n        \":prototest/test_suffix_id.golden.fbs\",\n        \":prototest/test_union.golden.fbs\",\n        \":prototest/test_union_id.golden.fbs\",\n        \":prototest/test_union_include.golden.fbs\",\n        \":prototest/test_union_include_id.golden.fbs\",\n        \":prototest/test_union_suffix.golden.fbs\",\n        \":prototest/test_union_suffix_id.golden.fbs\",\n        \":prototest/twice-id.proto\",\n        \":prototest/use-reserved-id.proto\",\n        \":unicode_test.json\",\n        \":union_vector/union_vector.fbs\",\n        \":union_vector/union_vector.json\",\n    ],\n    includes = [\n        \"\",\n        \"include/\",\n    ],\n    deps = [\n        \":alignment_test_cc_fbs\",\n        \":arrays_test_cc_fbs\",\n        \":cross_namespace_pack_test_cc_fbs\",\n        \":default_vectors_strings_test_cc_fbs\",\n        \":monster_extra_cc_fbs\",\n        \":monster_test_cc_fbs\",\n        \":native_type_test_cc_fbs\",\n        \"//:flatbuffers\",\n        \"//src:generate_fbs\",\n    ],\n)\n\n# Test bzl rules\n\ncc_library(\n    name = \"test_assert\",\n    srcs = [\"test_assert.cpp\"],\n    hdrs = [\"test_assert.h\"],\n    visibility = [\"//grpc/tests:__subpackages__\"],\n    deps = [\"//:flatbuffers\"],\n)\n\ncc_library(\n    name = \"test_builder\",\n    srcs = [\"test_builder.cpp\"],\n    hdrs = [\"test_builder.h\"],\n    visibility = [\"//grpc/tests:__subpackages__\"],\n    deps = [\n        \":monster_test_grpc\",\n        \":test_assert\",\n        \"//:flatbuffers\",\n    ],\n)\n\ncc_library(\n    name = \"monster_test_grpc\",\n    srcs = [\n        \"monster_test.grpc.fb.cc\",\n        \"monster_test.grpc.fb.h\",\n        \"monster_test_generated.h\",\n    ],\n    hdrs = [\n        \"monster_test.grpc.fb.h\",\n        \"monster_test_bfbs_generated.h\",\n        \"monster_test_generated.h\",\n    ],\n    includes = [\".\"],\n    visibility = [\"//grpc/tests:__subpackages__\"],\n    deps = [\n        \"//:flatbuffers\",\n        \"@com_github_grpc_grpc//:grpc++\",\n    ],\n)\n\nflatbuffer_cc_library(\n    name = \"include_test_fbs\",\n    srcs = [\n        \"include_test/include_test1.fbs\",\n        \"include_test/sub/include_test2.fbs\",\n    ],\n    include_paths = [\"tests/include_test\"],\n)\n\nflatbuffer_cc_library(\n    name = \"monster_test_cc_fbs\",\n    srcs = [\"monster_test.fbs\"],\n    outs = [\"monster_test_bfbs_generated.h\"],\n    flatc_args = DEFAULT_FLATC_ARGS + [\n        \"--bfbs-comments\",\n        \"--bfbs-builtins\",\n        \"--bfbs-gen-embed\",\n        \"--bfbs-filenames tests\",\n    ],\n    include_paths = [\"tests/include_test\"],\n    visibility = [\"//grpc/tests:__subpackages__\"],\n    deps = [\":include_test_fbs\"],\n)\n\n# Test that running without --no-includes works properly (monster_test doesn't\n# work cleanly due to the circular dependency in the include_tests/ files).\ninclude_test_args = [\n    \"--gen-object-api\",\n    \"--gen-compare\",\n    \"--gen-absl-hash\",\n    \"--gen-mutable\",\n    \"--reflect-names\",\n    \"--cpp-ptr-type flatbuffers::unique_ptr\",\n    \"--force-empty\",\n]\n\nflatbuffer_cc_library(\n    name = \"included_test_fbs\",\n    srcs = [\"included_test.fbs\"],\n    flatc_args = include_test_args,\n)\n\nflatbuffer_cc_library(\n    name = \"includer_test_fbs\",\n    srcs = [\"includer_test.fbs\"],\n    flatc_args = include_test_args,\n    deps = [\":included_test_fbs\"],\n)\n\ncc_library(\n    name = \"include_build_test\",\n    srcs = [\"include_build_test.cc\"],\n    deps = [\":includer_test_fbs\"],\n)\n\nflatbuffer_cc_library(\n    name = \"monster_extra_cc_fbs\",\n    srcs = [\"monster_extra.fbs\"],\n)\n\nflatbuffer_cc_library(\n    name = \"arrays_test_cc_fbs\",\n    srcs = [\"arrays_test.fbs\"],\n    flatc_args = [\n        \"--gen-object-api\",\n        \"--gen-compare\",\n        \"--no-includes\",\n        \"--gen-mutable\",\n        \"--reflect-names\",\n        \"--cpp-ptr-type flatbuffers::unique_ptr\",\n        \"--scoped-enums\",\n    ],\n)\n\nflatbuffer_cc_library(\n    name = \"cross_namespace_pack_test_cc_fbs\",\n    srcs = [\"cross_namespace_pack_test.fbs\"],\n    flatc_args = [\n        \"--gen-object-api\",\n        \"--gen-mutable\",\n        \"--gen-compare\",\n        \"--reflect-names\",\n    ],\n)\n\nflatbuffer_cc_library(\n    name = \"native_type_test_cc_fbs\",\n    srcs = [\"native_type_test.fbs\"],\n    flatc_args = [\n        \"--gen-object-api\",\n        \"--gen-mutable\",\n        \"--cpp-ptr-type flatbuffers::unique_ptr\",\n    ],\n)\n\nflatbuffer_cc_library(\n    name = \"alignment_test_cc_fbs\",\n    srcs = [\"alignment_test.fbs\"],\n)\n\nflatbuffer_cc_library(\n    name = \"default_vectors_strings_test_cc_fbs\",\n    srcs = [\"default_vectors_strings_test.fbs\"],\n    flatc_args = [\n        \"--gen-compare\",\n        \"--gen-mutable\",\n        \"--gen-object-api\",\n        \"--reflect-names\",\n        \"--filename-suffix .fbs\",\n    ],\n    filename_suffix = \".fbs\"\n)\n"
  },
  {
    "path": "tests/DartTest.sh",
    "content": "#!/bin/sh\nset -euo pipefail\n#\n# Copyright 2016 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\npushd \"$(dirname $0)\" >/dev/null\n\ncommand -v dart >/dev/null 2>&1 || {\n    echo >&2 \"Dart tests require dart to be in path but it's not installed.  Aborting.\"\n    exit 1\n}\n# output required files to the dart folder so that pub will be able to\n# distribute them and more people can more easily run the dart tests\n../flatc --dart --gen-object-api -I include_test -o ../dart/test monster_test.fbs\n../flatc --dart --gen-object-api -I include_test/sub -o ../dart/test include_test/include_test1.fbs\n../flatc --dart --gen-object-api -I include_test -o ../dart/test include_test/sub/include_test2.fbs\n\ncp monsterdata_test.mon ../dart/test\ncp monster_test.fbs ../dart/test\n\ncd ../dart\n\n../flatc --dart --gen-object-api -o ./test ./test/enums.fbs\n../flatc --dart --gen-object-api -o ./test ./test/bool_structs.fbs\n\n# update packages\ndart pub get\n# Execute the sample.\ndart test\n"
  },
  {
    "path": "tests/DictionaryLookup/LongFloatEntry.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage DictionaryLookup;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class LongFloatEntry extends com.google.flatbuffers.Table {\n  public static void ValidateVersion() { Constants.FLATBUFFERS_25_12_19(); }\n  public static LongFloatEntry getRootAsLongFloatEntry(ByteBuffer _bb) { return getRootAsLongFloatEntry(_bb, new LongFloatEntry()); }\n  public static LongFloatEntry getRootAsLongFloatEntry(ByteBuffer _bb, LongFloatEntry obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public LongFloatEntry __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public long key() { int o = __offset(4); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }\n  public float value() { int o = __offset(6); return o != 0 ? bb.getFloat(o + bb_pos) : 0.0f; }\n\n  public static int createLongFloatEntry(FlatBufferBuilder builder,\n      long key,\n      float value) {\n    builder.startTable(2);\n    LongFloatEntry.addKey(builder, key);\n    LongFloatEntry.addValue(builder, value);\n    return LongFloatEntry.endLongFloatEntry(builder);\n  }\n\n  public static void startLongFloatEntry(FlatBufferBuilder builder) { builder.startTable(2); }\n  public static void addKey(FlatBufferBuilder builder, long key) { builder.addLong(key); builder.slot(0); }\n  public static void addValue(FlatBufferBuilder builder, float value) { builder.addFloat(1, value, 0.0f); }\n  public static int endLongFloatEntry(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    return o;\n  }\n\n  @Override\n  protected int keysCompare(Integer o1, Integer o2, ByteBuffer _bb) {\n    long val_1 = _bb.getLong(__offset(4, o1, _bb));\n    long val_2 = _bb.getLong(__offset(4, o2, _bb));\n    return val_1 > val_2 ? 1 : val_1 < val_2 ? -1 : 0;\n  }\n\n  public static LongFloatEntry __lookup_by_key(LongFloatEntry obj, int vectorLocation, long key, ByteBuffer bb) {\n    int span = bb.getInt(vectorLocation - 4);\n    int start = 0;\n    while (span != 0) {\n      int middle = span / 2;\n      int tableOffset = __indirect(vectorLocation + 4 * (start + middle), bb);\n      long val = bb.getLong(__offset(4, bb.capacity() - tableOffset, bb));\n      int comp = val > key ? 1 : val < key ? -1 : 0;\n      if (comp > 0) {\n        span = middle;\n      } else if (comp < 0) {\n        middle++;\n        start += middle;\n        span -= middle;\n      } else {\n        return (obj == null ? new LongFloatEntry() : obj).__assign(tableOffset, bb);\n      }\n    }\n    return null;\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public LongFloatEntry get(int j) { return get(new LongFloatEntry(), j); }\n    public LongFloatEntry get(LongFloatEntry obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); }\n    public LongFloatEntry getByKey(long key) {  return __lookup_by_key(null, __vector(), key, bb); }\n    public LongFloatEntry getByKey(LongFloatEntry obj, long key) {  return __lookup_by_key(obj, __vector(), key, bb); }\n  }\n}\n\n"
  },
  {
    "path": "tests/DictionaryLookup/LongFloatEntry.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage DictionaryLookup\n\nimport com.google.flatbuffers.BaseVector\nimport com.google.flatbuffers.BooleanVector\nimport com.google.flatbuffers.ByteVector\nimport com.google.flatbuffers.Constants\nimport com.google.flatbuffers.DoubleVector\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.FloatVector\nimport com.google.flatbuffers.LongVector\nimport com.google.flatbuffers.StringVector\nimport com.google.flatbuffers.Struct\nimport com.google.flatbuffers.Table\nimport com.google.flatbuffers.UnionVector\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport kotlin.math.sign\n\n@Suppress(\"unused\")\nclass LongFloatEntry : Table() {\n\n    fun __init(_i: Int, _bb: ByteBuffer)  {\n        __reset(_i, _bb)\n    }\n    fun __assign(_i: Int, _bb: ByteBuffer) : LongFloatEntry {\n        __init(_i, _bb)\n        return this\n    }\n    val key : Long\n        get() {\n            val o = __offset(4)\n            return if(o != 0) bb.getLong(o + bb_pos) else 0L\n        }\n    val value : Float\n        get() {\n            val o = __offset(6)\n            return if(o != 0) bb.getFloat(o + bb_pos) else 0.0f\n        }\n    override fun keysCompare(o1: Int, o2: Int, _bb: ByteBuffer) : Int {\n        val val_1 = _bb.getLong(__offset(4, o1, _bb))\n        val val_2 = _bb.getLong(__offset(4, o2, _bb))\n        return (val_1 - val_2).sign\n    }\n    companion object {\n        fun validateVersion() = Constants.FLATBUFFERS_25_12_19()\n        fun getRootAsLongFloatEntry(_bb: ByteBuffer): LongFloatEntry = getRootAsLongFloatEntry(_bb, LongFloatEntry())\n        fun getRootAsLongFloatEntry(_bb: ByteBuffer, obj: LongFloatEntry): LongFloatEntry {\n            _bb.order(ByteOrder.LITTLE_ENDIAN)\n            return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb))\n        }\n        fun createLongFloatEntry(builder: FlatBufferBuilder, key: Long, value: Float) : Int {\n            builder.startTable(2)\n            addKey(builder, key)\n            addValue(builder, value)\n            return endLongFloatEntry(builder)\n        }\n        fun startLongFloatEntry(builder: FlatBufferBuilder) = builder.startTable(2)\n        fun addKey(builder: FlatBufferBuilder, key: Long)  {\n            builder.addLong(key)\n            builder.slot(0)\n        }\n        fun addValue(builder: FlatBufferBuilder, value: Float) = builder.addFloat(1, value, 0.0)\n        fun endLongFloatEntry(builder: FlatBufferBuilder) : Int {\n            val o = builder.endTable()\n            return o\n        }\n        fun __lookup_by_key(obj: LongFloatEntry?, vectorLocation: Int, key: Long, bb: ByteBuffer) : LongFloatEntry? {\n            var span = bb.getInt(vectorLocation - 4)\n            var start = 0\n            while (span != 0) {\n                var middle = span / 2\n                val tableOffset = __indirect(vectorLocation + 4 * (start + middle), bb)\n                val value = bb.getLong(__offset(4, bb.capacity() - tableOffset, bb))\n                val comp = value.compareTo(key)\n                when {\n                    comp > 0 -> span = middle\n                    comp < 0 -> {\n                        middle++\n                        start += middle\n                        span -= middle\n                    }\n                    else -> {\n                        return (obj ?: LongFloatEntry()).__assign(tableOffset, bb)\n                    }\n                }\n            }\n            return null\n        }\n    }\n}\n"
  },
  {
    "path": "tests/DictionaryLookup/LongFloatMap.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage DictionaryLookup;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class LongFloatMap extends com.google.flatbuffers.Table {\n  public static void ValidateVersion() { Constants.FLATBUFFERS_25_12_19(); }\n  public static LongFloatMap getRootAsLongFloatMap(ByteBuffer _bb) { return getRootAsLongFloatMap(_bb, new LongFloatMap()); }\n  public static LongFloatMap getRootAsLongFloatMap(ByteBuffer _bb, LongFloatMap obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public LongFloatMap __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public DictionaryLookup.LongFloatEntry entries(int j) { return entries(new DictionaryLookup.LongFloatEntry(), j); }\n  public DictionaryLookup.LongFloatEntry entries(DictionaryLookup.LongFloatEntry obj, int j) { int o = __offset(4); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }\n  public int entriesLength() { int o = __offset(4); return o != 0 ? __vector_len(o) : 0; }\n  public DictionaryLookup.LongFloatEntry entriesByKey(long key) { int o = __offset(4); return o != 0 ? DictionaryLookup.LongFloatEntry.__lookup_by_key(null, __vector(o), key, bb) : null; }\n  public DictionaryLookup.LongFloatEntry entriesByKey(DictionaryLookup.LongFloatEntry obj, long key) { int o = __offset(4); return o != 0 ? DictionaryLookup.LongFloatEntry.__lookup_by_key(obj, __vector(o), key, bb) : null; }\n  public DictionaryLookup.LongFloatEntry.Vector entriesVector() { return entriesVector(new DictionaryLookup.LongFloatEntry.Vector()); }\n  public DictionaryLookup.LongFloatEntry.Vector entriesVector(DictionaryLookup.LongFloatEntry.Vector obj) { int o = __offset(4); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n\n  public static int createLongFloatMap(FlatBufferBuilder builder,\n      int entriesOffset) {\n    builder.startTable(1);\n    LongFloatMap.addEntries(builder, entriesOffset);\n    return LongFloatMap.endLongFloatMap(builder);\n  }\n\n  public static void startLongFloatMap(FlatBufferBuilder builder) { builder.startTable(1); }\n  public static void addEntries(FlatBufferBuilder builder, int entriesOffset) { builder.addOffset(0, entriesOffset, 0); }\n  public static int createEntriesVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }\n  public static void startEntriesVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static int endLongFloatMap(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    return o;\n  }\n  public static void finishLongFloatMapBuffer(FlatBufferBuilder builder, int offset) { builder.finish(offset); }\n  public static void finishSizePrefixedLongFloatMapBuffer(FlatBufferBuilder builder, int offset) { builder.finishSizePrefixed(offset); }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public LongFloatMap get(int j) { return get(new LongFloatMap(), j); }\n    public LongFloatMap get(LongFloatMap obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); }\n  }\n}\n\n"
  },
  {
    "path": "tests/DictionaryLookup/LongFloatMap.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage DictionaryLookup\n\nimport com.google.flatbuffers.BaseVector\nimport com.google.flatbuffers.BooleanVector\nimport com.google.flatbuffers.ByteVector\nimport com.google.flatbuffers.Constants\nimport com.google.flatbuffers.DoubleVector\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.FloatVector\nimport com.google.flatbuffers.LongVector\nimport com.google.flatbuffers.StringVector\nimport com.google.flatbuffers.Struct\nimport com.google.flatbuffers.Table\nimport com.google.flatbuffers.UnionVector\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport kotlin.math.sign\n\n@Suppress(\"unused\")\nclass LongFloatMap : Table() {\n\n    fun __init(_i: Int, _bb: ByteBuffer)  {\n        __reset(_i, _bb)\n    }\n    fun __assign(_i: Int, _bb: ByteBuffer) : LongFloatMap {\n        __init(_i, _bb)\n        return this\n    }\n    fun entries(j: Int) : DictionaryLookup.LongFloatEntry? = entries(DictionaryLookup.LongFloatEntry(), j)\n    fun entries(obj: DictionaryLookup.LongFloatEntry, j: Int) : DictionaryLookup.LongFloatEntry? {\n        val o = __offset(4)\n        return if (o != 0) {\n            obj.__assign(__indirect(__vector(o) + j * 4), bb)\n        } else {\n            null\n        }\n    }\n    val entriesLength : Int\n        get() {\n            val o = __offset(4); return if (o != 0) __vector_len(o) else 0\n        }\n    fun entriesByKey(key: Long) : DictionaryLookup.LongFloatEntry? {\n        val o = __offset(4)\n        return if (o != 0) {\n            DictionaryLookup.LongFloatEntry.__lookup_by_key(null, __vector(o), key, bb)\n        } else {\n            null\n        }\n    }\n    fun entriesByKey(obj: DictionaryLookup.LongFloatEntry, key: Long) : DictionaryLookup.LongFloatEntry? {\n        val o = __offset(4)\n        return if (o != 0) {\n            DictionaryLookup.LongFloatEntry.__lookup_by_key(obj, __vector(o), key, bb)\n        } else {\n            null\n        }\n    }\n    companion object {\n        fun validateVersion() = Constants.FLATBUFFERS_25_12_19()\n        fun getRootAsLongFloatMap(_bb: ByteBuffer): LongFloatMap = getRootAsLongFloatMap(_bb, LongFloatMap())\n        fun getRootAsLongFloatMap(_bb: ByteBuffer, obj: LongFloatMap): LongFloatMap {\n            _bb.order(ByteOrder.LITTLE_ENDIAN)\n            return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb))\n        }\n        fun createLongFloatMap(builder: FlatBufferBuilder, entriesOffset: Int) : Int {\n            builder.startTable(1)\n            addEntries(builder, entriesOffset)\n            return endLongFloatMap(builder)\n        }\n        fun startLongFloatMap(builder: FlatBufferBuilder) = builder.startTable(1)\n        fun addEntries(builder: FlatBufferBuilder, entries: Int) = builder.addOffset(0, entries, 0)\n        fun createEntriesVector(builder: FlatBufferBuilder, data: IntArray) : Int {\n            builder.startVector(4, data.size, 4)\n            for (i in data.size - 1 downTo 0) {\n                builder.addOffset(data[i])\n            }\n            return builder.endVector()\n        }\n        fun startEntriesVector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(4, numElems, 4)\n        fun endLongFloatMap(builder: FlatBufferBuilder) : Int {\n            val o = builder.endTable()\n            return o\n        }\n        fun finishLongFloatMapBuffer(builder: FlatBufferBuilder, offset: Int) = builder.finish(offset)\n        fun finishSizePrefixedLongFloatMapBuffer(builder: FlatBufferBuilder, offset: Int) = builder.finishSizePrefixed(offset)\n    }\n}\n"
  },
  {
    "path": "tests/FlatBuffers.Benchmarks/FlatBufferBuilderBenchmark.cs",
    "content": "﻿/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nusing BenchmarkDotNet.Attributes;\nusing MyGame.Example;\n\nnamespace Google.FlatBuffers.Benchmarks\n{\n    //[EtwProfiler] - needs elevated privileges\n    [MemoryDiagnoser]\n    public class FlatBufferBuilderBenchmark\n    {\n        private const int NumberOfRows = 10_000;\n\n        [Benchmark]\n        public void BuildNestedMonster()\n        {\n            const string nestedMonsterName = \"NestedMonsterName\";\n            const short nestedMonsterHp = 600;\n            const short nestedMonsterMana = 1024;\n\n            for (int i = 0; i < NumberOfRows; i++)\n            {\n                // Create nested buffer as a Monster type\n                var fbb1 = new FlatBufferBuilder(16);\n                var str1 = fbb1.CreateString(nestedMonsterName);\n                Monster.StartMonster(fbb1);\n                Monster.AddName(fbb1, str1);\n                Monster.AddHp(fbb1, nestedMonsterHp);\n                Monster.AddMana(fbb1, nestedMonsterMana);\n                var monster1 = Monster.EndMonster(fbb1);\n                Monster.FinishMonsterBuffer(fbb1, monster1);\n                var fbb1Bytes = fbb1.SizedByteArray();\n                fbb1 = null;\n\n                // Create a Monster which has the first buffer as a nested buffer\n                var fbb2 = new FlatBufferBuilder(16);\n                var str2 = fbb2.CreateString(\"My Monster\");\n                var nestedBuffer = Monster.CreateTestnestedflatbufferVector(fbb2, fbb1Bytes);\n                Monster.StartMonster(fbb2);\n                Monster.AddName(fbb2, str2);\n                Monster.AddHp(fbb2, 50);\n                Monster.AddMana(fbb2, 32);\n                Monster.AddTestnestedflatbuffer(fbb2, nestedBuffer);\n                var monster = Monster.EndMonster(fbb2);\n                Monster.FinishMonsterBuffer(fbb2, monster);\n            }\n        }\n\n        [Benchmark]\n        public void BuildMonster()\n        {\n            for (int i = 0; i < NumberOfRows; i++)\n            {\n                var builder = new FlatBufferBuilder(16);\n                var str1 = builder.CreateString(\"MonsterName\");\n                Monster.StartMonster(builder);\n                Monster.AddName(builder, str1);\n                Monster.AddHp(builder, 600);\n                Monster.AddMana(builder, 1024);\n                Monster.AddColor(builder, Color.Blue);\n                Monster.AddTestbool(builder, true);\n                Monster.AddTestf(builder, 0.3f);\n                Monster.AddTestf2(builder, 0.2f);\n                Monster.AddTestf3(builder, 0.1f);\n\n                var monster1 = Monster.EndMonster(builder);\n                Monster.FinishMonsterBuffer(builder, monster1);\n            }\n        }\n\n        [Benchmark]\n        public void TestTables()\n        {\n            FlatBufferBuilder builder = new FlatBufferBuilder(1024 * 1024 * 32);\n            for (int x = 0; x < 500000; ++x)\n            {\n                var offset = builder.CreateString(\"T\");\n                builder.StartObject(4);\n                builder.AddDouble(3.2);\n                builder.AddDouble(4.2);\n                builder.AddDouble(5.2);\n                builder.AddOffset(offset.Value);\n                builder.EndObject();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/FlatBuffers.Benchmarks/FlatBuffers.Benchmarks.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n    <LangVersion>latest</LangVersion>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n    <DefineConstants>$(DefineConstants);UNSAFE_BYTEBUFFER;BYTEBUFFER_NO_BOUNDS_CHECK;ENABLE_SPAN_T</DefineConstants>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.11.3\" />\n    <PackageReference Include=\"BenchmarkDotNet.Diagnostics.Windows\" Version=\"0.11.3\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Compile Include=\"..\\..\\net\\FlatBuffers\\*.cs\" Link=\"FlatBuffers\\%(FileName).cs\" />\n    <Compile Include=\"..\\MyGame\\**\\*.cs\" Link=\"MyGame\\Example\\%(FileName).cs\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "tests/FlatBuffers.Benchmarks/Program.cs",
    "content": "﻿/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nusing BenchmarkDotNet.Running;\n\nnamespace Google.FlatBuffers.Benchmarks\n{\n    public static class Program\n    {\n        public static void Main(string[] args)\n        {\n            BenchmarkSwitcher\n                .FromAssembly(typeof(Program).Assembly)\n                .Run(args);\n        }\n    }\n}"
  },
  {
    "path": "tests/FlatBuffers.Test/.gitignore",
    "content": "dotnet-install.sh\n.dotnet_tmp/\n.tmp/\npackages/"
  },
  {
    "path": "tests/FlatBuffers.Test/Assert.cs",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace Google.FlatBuffers.Test\n{\n\n    public class AssertFailedException : Exception\n    {\n        private readonly object _expected;\n        private readonly object _actual;\n\n        public AssertFailedException(object expected, object actual)\n        {\n            _expected = expected;\n            _actual = actual;\n        }\n\n        public override string Message\n        {\n            get { return string.Format(\"Expected {0} but saw {1}\", _expected, _actual); }\n        }\n    }\n\n    public class AssertArrayFailedException : Exception\n    {\n        private readonly int _index;\n        private readonly object _expected;\n        private readonly object _actual;\n\n        public AssertArrayFailedException(int index, object expected, object actual)\n        {\n            _index = index;\n            _expected = expected;\n            _actual = actual;\n        }\n\n        public override string Message\n        {\n            get { return string.Format(\"Expected {0} at index {1} but saw {2}\", _expected, _index, _actual); }\n        }\n    }\n\n    public class AssertUnexpectedThrowException : Exception\n    {\n        private readonly object _expected;\n\n        public AssertUnexpectedThrowException(object expected)\n        {\n            _expected = expected;\n        }\n\n        public override string Message\n        {\n            get { return string.Format(\"Expected exception of type {0}\", _expected); }\n        }\n    }\n\n    public static class Assert\n    {\n        public static void AreEqual<T>(T expected, T actual)\n        {\n            if (!expected.Equals(actual))\n            {\n                throw new AssertFailedException(expected, actual);\n            }\n        }\n\n        public static void ArrayEqual<T>(T[] expected, T[] actual)\n        {\n            if (expected.Length != actual.Length)\n            {\n                throw new AssertFailedException(expected, actual);\n            }\n\n            for(var i = 0; i < expected.Length; ++i)\n            {\n                if (!expected[i].Equals(actual[i]))\n                {\n                    throw new AssertArrayFailedException(i, expected, actual);\n                }\n            }\n        }\n\n        public static void ArrayEqual<T>(ArraySegment<T> expected, T[] actual)\n        {\n#if NETCOREAPP\n            ArrayEqual(expected.ToArray(), actual);\n#else\n            if (expected.Count != actual.Length)\n            {\n                throw new AssertFailedException(expected, actual);\n            }\n\n            for (var i = 0; i < expected.Count; ++i)\n            {\n                if (!expected.Array[expected.Offset + i].Equals(actual[i]))\n                {\n                    throw new AssertArrayFailedException(i, expected, actual);\n                }\n            }\n#endif\n    }\n\n        public static void IsTrue(bool value)\n        {\n            if (!value)\n            {\n                throw new AssertFailedException(true, value);\n            }\n        }\n\n        public static void IsFalse(bool value)\n        {\n            if (value)\n            {\n                throw new AssertFailedException(false, value);\n            }\n        }\n\n        public static void Throws<T>(Action action) where T : Exception\n        {\n            var caught = false;\n            try\n            {\n                action();\n            }\n            catch (T)\n            {\n                caught = true;\n            }\n\n            if (!caught)\n            {\n                throw new AssertUnexpectedThrowException(typeof (T));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/FlatBuffers.Test/ByteBufferTests.cs",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nusing System;\nusing System.Linq;\nusing System.Runtime.InteropServices;\n\nnamespace Google.FlatBuffers.Test\n{\n    [FlatBuffersTestClass]\n    public class ByteBufferTests\n    {\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_Length_MatchesBufferLength()\n        {\n            var buffer = new byte[1000];\n            var uut = new ByteBuffer(buffer);\n            Assert.AreEqual(buffer.Length, uut.Length);\n        }\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_PutBytePopulatesBufferAtZeroOffset()\n        {\n            var buffer = new byte[1];\n            var uut = new ByteBuffer(buffer);\n            uut.PutByte(0, (byte)99);\n\n            Assert.AreEqual((byte)99, buffer[0]);\n        }\n\n#if !BYTEBUFFER_NO_BOUNDS_CHECK\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_PutByteCannotPutAtOffsetPastLength()\n        {\n            var uut = new ByteBuffer(1);\n            Assert.Throws<ArgumentOutOfRangeException>(() => uut.PutByte(1, 99));\n        }\n#endif\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_PutShortPopulatesBufferCorrectly()\n        {\n            var buffer = new byte[2];\n            var uut = new ByteBuffer(buffer);\n            uut.PutShort(0, (short)1);\n\n            // Ensure Endianness was written correctly\n            Assert.AreEqual((byte)1, buffer[0]);\n            Assert.AreEqual((byte)0, buffer[1]);\n        }\n\n#if !BYTEBUFFER_NO_BOUNDS_CHECK\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_PutShortCannotPutAtOffsetPastLength()\n        {\n            var uut = new ByteBuffer(2);\n            Assert.Throws<ArgumentOutOfRangeException>(() => uut.PutShort(2, 99));\n        }\n#endif\n\n#if !BYTEBUFFER_NO_BOUNDS_CHECK\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_PutShortChecksLength()\n        {\n            var uut = new ByteBuffer(1);\n            Assert.Throws<ArgumentOutOfRangeException>(() => uut.PutShort(0, 99));\n        }\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_PutShortChecksLengthAndOffset()\n        {\n            var uut = new ByteBuffer(2);\n            Assert.Throws<ArgumentOutOfRangeException>(() => uut.PutShort(1, 99));\n        }\n#endif\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_PutIntPopulatesBufferCorrectly()\n        {\n            var buffer = new byte[4];\n            var uut = new ByteBuffer(buffer);\n            uut.PutInt(0, 0x0A0B0C0D);\n\n            // Ensure Endianness was written correctly\n            Assert.AreEqual(0x0D, buffer[0]);\n            Assert.AreEqual(0x0C, buffer[1]);\n            Assert.AreEqual(0x0B, buffer[2]);\n            Assert.AreEqual(0x0A, buffer[3]);\n        }\n\n#if !BYTEBUFFER_NO_BOUNDS_CHECK\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_PutIntCannotPutAtOffsetPastLength()\n        {\n            var uut = new ByteBuffer(4);\n            Assert.Throws<ArgumentOutOfRangeException>(() => uut.PutInt(2, 0x0A0B0C0D));\n        }\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_PutIntChecksLength()\n        {\n            var uut = new ByteBuffer(1);\n            Assert.Throws<ArgumentOutOfRangeException>(() => uut.PutInt(0, 0x0A0B0C0D));\n        }\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_PutIntChecksLengthAndOffset()\n        {\n            var uut = new ByteBuffer(4);\n            Assert.Throws<ArgumentOutOfRangeException>(() => uut.PutInt(2, 0x0A0B0C0D));\n        }\n#endif\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_PutLongPopulatesBufferCorrectly()\n        {\n            var buffer = new byte[8];\n            var uut = new ByteBuffer(buffer);\n            uut.PutLong(0, 0x010203040A0B0C0D);\n\n            // Ensure Endianness was written correctly\n            Assert.AreEqual(0x0D, buffer[0]);\n            Assert.AreEqual(0x0C, buffer[1]);\n            Assert.AreEqual(0x0B, buffer[2]);\n            Assert.AreEqual(0x0A, buffer[3]);\n            Assert.AreEqual(0x04, buffer[4]);\n            Assert.AreEqual(0x03, buffer[5]);\n            Assert.AreEqual(0x02, buffer[6]);\n            Assert.AreEqual(0x01, buffer[7]);\n        }\n\n#if !BYTEBUFFER_NO_BOUNDS_CHECK\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_PutLongCannotPutAtOffsetPastLength()\n        {\n            var uut = new ByteBuffer(8);\n            Assert.Throws<ArgumentOutOfRangeException>(() => uut.PutLong(2, 0x010203040A0B0C0D));\n        }\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_PutLongChecksLength()\n        {\n            var uut = new ByteBuffer(1);\n            Assert.Throws<ArgumentOutOfRangeException>(() => uut.PutLong(0, 0x010203040A0B0C0D));\n        }\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_PutLongChecksLengthAndOffset()\n        {\n            var uut = new ByteBuffer(8);\n            Assert.Throws<ArgumentOutOfRangeException>(() => uut.PutLong(2, 0x010203040A0B0C0D));\n        }\n#endif\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_GetByteReturnsCorrectData()\n        {\n            var buffer = new byte[1];\n            buffer[0] = 99;\n            var uut = new ByteBuffer(buffer);\n            Assert.AreEqual((byte)99, uut.Get(0));\n        }\n\n#if !BYTEBUFFER_NO_BOUNDS_CHECK\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_GetByteChecksOffset()\n        {\n            var uut = new ByteBuffer(1);\n            Assert.Throws<ArgumentOutOfRangeException>(() => uut.Get(1));\n        }\n#endif\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_GetShortReturnsCorrectData()\n        {\n            var buffer = new byte[2];\n            buffer[0] = 1;\n            buffer[1] = 0;\n            var uut = new ByteBuffer(buffer);\n            Assert.AreEqual(1, uut.GetShort(0));\n        }\n\n#if !BYTEBUFFER_NO_BOUNDS_CHECK\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_GetShortChecksOffset()\n        {\n            var uut = new ByteBuffer(2);\n            Assert.Throws<ArgumentOutOfRangeException>(() => uut.GetShort(2));\n        }\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_GetShortChecksLength()\n        {\n            var uut = new ByteBuffer(2);\n            Assert.Throws<ArgumentOutOfRangeException>(() => uut.GetShort(1));\n        }\n#endif\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_GetIntReturnsCorrectData()\n        {\n            var buffer = new byte[4];\n            buffer[0] = 0x0D;\n            buffer[1] = 0x0C;\n            buffer[2] = 0x0B;\n            buffer[3] = 0x0A;\n            var uut = new ByteBuffer(buffer);\n            Assert.AreEqual(0x0A0B0C0D, uut.GetInt(0));\n        }\n\n#if !BYTEBUFFER_NO_BOUNDS_CHECK\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_GetIntChecksOffset()\n        {\n            var uut = new ByteBuffer(4);\n            Assert.Throws<ArgumentOutOfRangeException>(() => uut.GetInt(4));\n        }\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_GetIntChecksLength()\n        {\n            var uut = new ByteBuffer(2);\n            Assert.Throws<ArgumentOutOfRangeException>(() => uut.GetInt(0));\n        }\n#endif\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_GetLongReturnsCorrectData()\n        {\n            var buffer = new byte[8];\n            buffer[0] = 0x0D;\n            buffer[1] = 0x0C;\n            buffer[2] = 0x0B;\n            buffer[3] = 0x0A;\n            buffer[4] = 0x04;\n            buffer[5] = 0x03;\n            buffer[6] = 0x02;\n            buffer[7] = 0x01;\n            var uut = new ByteBuffer(buffer);\n            Assert.AreEqual(0x010203040A0B0C0D, uut.GetLong(0));\n        }\n\n#if !BYTEBUFFER_NO_BOUNDS_CHECK\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_GetLongChecksOffset()\n        {\n            var uut = new ByteBuffer(8);\n            Assert.Throws<ArgumentOutOfRangeException>(() => uut.GetLong(8));\n        }\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_GetLongChecksLength()\n        {\n            var uut = new ByteBuffer(7);\n            Assert.Throws<ArgumentOutOfRangeException>(() => uut.GetLong(0));\n        }\n#endif\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_ReverseBytesUshort()\n        {\n            const ushort original = (ushort)0x1234U;\n            var reverse = ByteBuffer.ReverseBytes(original);\n            Assert.AreEqual(0x3412U, reverse);\n\n            var rereverse = ByteBuffer.ReverseBytes(reverse);\n            Assert.AreEqual(original, rereverse);\n        }\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_ReverseBytesUint()\n        {\n            const uint original = 0x12345678;\n            var reverse = ByteBuffer.ReverseBytes(original);\n            Assert.AreEqual(0x78563412U, reverse);\n\n            var rereverse = ByteBuffer.ReverseBytes(reverse);\n            Assert.AreEqual(original, rereverse);\n        }\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_ReverseBytesUlong()\n        {\n            const ulong original = 0x1234567890ABCDEFUL;\n            var reverse = ByteBuffer.ReverseBytes(original);\n            Assert.AreEqual(0xEFCDAB9078563412UL, reverse);\n\n            var rereverse = ByteBuffer.ReverseBytes(reverse);\n            Assert.AreEqual(original, rereverse);\n        }\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_ToFullArray_MatchesBuffer()\n        {\n            var buffer = new byte[4];\n            buffer[0] = 0x0D;\n            buffer[1] = 0x0C;\n            buffer[2] = 0x0B;\n            buffer[3] = 0x0A;\n            var uut = new ByteBuffer(buffer);\n            Assert.ArrayEqual(buffer, uut.ToFullArray());\n        }\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_ToSizedArray_MatchesBuffer()\n        {\n            var buffer = new byte[4];\n            buffer[0] = 0x0D;\n            buffer[1] = 0x0C;\n            buffer[2] = 0x0B;\n            buffer[3] = 0x0A;\n            var uut = new ByteBuffer(buffer);\n            Assert.ArrayEqual(buffer, uut.ToFullArray());\n        }\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_Duplicate_MatchesBuffer()\n        {\n            var buffer = new byte[4];\n            buffer[0] = 0x0D;\n            buffer[1] = 0x0C;\n            buffer[2] = 0x0B;\n            buffer[3] = 0x0A;\n            var uut = new ByteBuffer(buffer);\n            Assert.AreEqual(0x0A0B0C0D, uut.GetInt(0));\n\n            // Advance by two bytes\n            uut.Position = 2; uut = uut.Duplicate();\n            Assert.AreEqual(0x0A0B, uut.GetShort(2));\n\n            // Advance by one more byte\n            uut.Position = 1; uut = uut.Duplicate();\n            Assert.AreEqual(0x0A, uut.Get(3));\n        }\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_To_Array_Float()\n        {\n            const int len = 9;\n\n            // Construct the data array\n            var fData = new float[len];\n            fData[0] = 1.0079F;\n            fData[1] = 4.0026F;\n            fData[2] = 6.941F;\n            fData[3] = 9.0122F;\n            fData[4] = 10.811F;\n            fData[5] = 12.0107F;\n            fData[6] = 14.0067F;\n            fData[7] = 15.9994F;\n            fData[8] = 18.9984F;\n\n            var sizeInBytes = ByteBuffer.ConvertTsToBytes<float>(fData.Length);\n\n            // Tranfer it to a byte array\n            var buffer = new byte[sizeInBytes];\n            Buffer.BlockCopy(fData, 0, buffer, 0, buffer.Length);\n\n            // Create the Byte Buffer from byte array\n            var uut = new ByteBuffer(buffer);\n\n            // Get the full array back out and ensure they are equivalent\n            var bbArray = uut.ToArray<float>(0, sizeInBytes);\n            Assert.ArrayEqual(fData, bbArray);\n\n            // Get a portion of the full array back out and ensure the\n            // subrange agrees\n            var posInFloats = 4;\n            var lenInFloats = Math.Min(fData.Length - posInFloats - 1, 4);\n            var bbArray2 = uut.ToArray<float>(ByteBuffer.ConvertTsToBytes<float>(posInFloats), ByteBuffer.ConvertTsToBytes<float>(lenInFloats));\n            Assert.ArrayEqual(fData.Skip(posInFloats).Take(bbArray2.Length).ToArray(), bbArray2);\n\n            // Get a sub portion of the full array back out and ensure the\n            // subrange agrees\n            posInFloats = 6;\n            lenInFloats = Math.Min(fData.Length - posInFloats - 1, 1);\n            var bbArray3 = uut.ToArray<float>(ByteBuffer.ConvertTsToBytes<float>(posInFloats), ByteBuffer.ConvertTsToBytes<float>(lenInFloats));\n            Assert.ArrayEqual(fData.Skip(posInFloats).Take(bbArray3.Length).ToArray(), bbArray3);\n        }\n\n        public void ByteBuffer_Put_Array_Helper<T>(T[] data, int typeSize)\n            where T : struct\n        {\n            // Create the Byte Buffer\n            var uut = new ByteBuffer(1024);\n\n            // Put the data into the buffer and make sure the offset is\n            // calculated correctly\n            int nOffset = uut.Put(1024, data);\n            Assert.AreEqual(1024 - typeSize * data.Length, nOffset);\n\n            // Get the full array back out and ensure they are equivalent\n            var bbArray = uut.ToArray<T>(nOffset, ByteBuffer.ConvertTsToBytes<T>(data.Length));\n            Assert.ArrayEqual(data, bbArray);\n        }\n\n        public void ByteBuffer_Put_ArraySegment_Helper<T>(ArraySegment<T> data, int typeSize)\n            where T : struct\n        {\n            // Create the Byte Buffer\n            var uut = new ByteBuffer(1024);\n\n            // Put the data into the buffer and make sure the offset is\n            // calculated correctly\n            int nOffset = uut.Put(1024, data);\n            Assert.AreEqual(1024 - typeSize * data.Count, nOffset);\n      \n            // Get the full array back out and ensure they are equivalent\n            var bbArray = uut.ToArray<T>(nOffset, ByteBuffer.ConvertTsToBytes<T>(data.Count));\n            Assert.ArrayEqual(data, bbArray);\n        }\n    \n        public unsafe void ByteBuffer_Put_IntPtr_Helper<T>(T[] data, int typeSize)\n            where T : struct\n        {\n            GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned);\n            try\n            {\n                var dataPtr = handle.AddrOfPinnedObject();\n                var sizeInBytes = data.Length * typeSize;\n\n                // Create the Byte Buffer\n                var uut = new ByteBuffer(1024);\n\n                // Put the data into the buffer and make sure the offset is\n                // calculated correctly\n                int nOffset = uut.Put<T>(1024, dataPtr, sizeInBytes);\n                Assert.AreEqual(1024 - sizeInBytes, nOffset);\n\n                // Get the full array back out and ensure they are equivalent\n                var bbArray = uut.ToArray<T>(nOffset, ByteBuffer.ConvertTsToBytes<T>(data.Length));\n                Assert.ArrayEqual(data, bbArray);\n            }\n            finally\n            {\n                handle.Free();\n            }\n        }\n\n        public void ByteBuffer_Put_ArrayTypes_Helper<T>(T[] data, int typeSize)\n            where T : struct\n        {\n            ByteBuffer_Put_Array_Helper(data, typeSize);\n\n            var arraySegment = CreateArraySegment(data);\n            ByteBuffer_Put_ArraySegment_Helper(arraySegment, typeSize);\n\n            ByteBuffer_Put_IntPtr_Helper(data, typeSize);\n        }\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_Put_Array_Float()\n        {\n            const int len = 9;\n\n            // Construct the data array\n            var data = new float[len];\n            data[0] = 1.0079F;\n            data[1] = 4.0026F;\n            data[2] = 6.941F;\n            data[3] = 9.0122F;\n            data[4] = 10.811F;\n            data[5] = 12.0107F;\n            data[6] = 14.0067F;\n            data[7] = 15.9994F;\n            data[8] = 18.9984F;\n\n            ByteBuffer_Put_ArrayTypes_Helper(data, sizeof(float));\n        }\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_Put_Array_Double()\n        {\n            const int len = 9;\n\n            // Construct the data array\n            var data = new double[len];\n            data[0] = 1.0079;\n            data[1] = 4.0026;\n            data[2] = 6.941;\n            data[3] = 9.0122;\n            data[4] = 10.811;\n            data[5] = 12.0107;\n            data[6] = 14.0067;\n            data[7] = 15.9994;\n            data[8] = 18.9984;\n\n            ByteBuffer_Put_ArrayTypes_Helper(data, sizeof(double));\n        }\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_Put_Array_Int()\n        {\n            const int len = 9;\n\n            // Construct the data array\n            var data = new int[len];\n            data[0] = 1;\n            data[1] = 4;\n            data[2] = 6;\n            data[3] = 9;\n            data[4] = 10;\n            data[5] = 12;\n            data[6] = 14;\n            data[7] = 15;\n            data[8] = 18;\n\n            ByteBuffer_Put_ArrayTypes_Helper(data, sizeof(int));\n        }\n\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_Put_Array_UInt()\n        {\n            const int len = 9;\n\n            // Construct the data array\n            var data = new uint[len];\n            data[0] = 1;\n            data[1] = 4;\n            data[2] = 6;\n            data[3] = 9;\n            data[4] = 10;\n            data[5] = 12;\n            data[6] = 14;\n            data[7] = 15;\n            data[8] = 18;\n\n            ByteBuffer_Put_ArrayTypes_Helper(data, sizeof(uint));\n        }\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_Put_Array_Bool()\n        {\n            const int len = 9;\n\n            // Construct the data array\n            var data = new bool[len];\n            data[0] = true;\n            data[1] = true;\n            data[2] = false;\n            data[3] = true;\n            data[4] = false;\n            data[5] = true;\n            data[6] = true;\n            data[7] = true;\n            data[8] = false;\n\n            ByteBuffer_Put_ArrayTypes_Helper(data, sizeof(bool));\n        }\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_Put_Array_Long()\n        {\n            const int len = 9;\n\n            // Construct the data array\n            var data = new long[len];\n            data[0] = 1;\n            data[1] = 4;\n            data[2] = 6;\n            data[3] = 9;\n            data[4] = 10;\n            data[5] = 12;\n            data[6] = 14;\n            data[7] = 15;\n            data[8] = 18;\n\n            ByteBuffer_Put_ArrayTypes_Helper(data, sizeof(long));\n        }\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_Put_Array_Byte()\n        {\n            const int len = 9;\n\n            // Construct the data array\n            var data = new byte[len];\n            data[0] = 1;\n            data[1] = 4;\n            data[2] = 6;\n            data[3] = 9;\n            data[4] = 10;\n            data[5] = 12;\n            data[6] = 14;\n            data[7] = 15;\n            data[8] = 18;\n\n            ByteBuffer_Put_ArrayTypes_Helper(data, sizeof(byte));\n        }\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_Put_Array_SByte()\n        {\n            const int len = 9;\n\n            // Construct the data array\n            var data = new sbyte[len];\n            data[0] = 1;\n            data[1] = 4;\n            data[2] = 6;\n            data[3] = 9;\n            data[4] = 10;\n            data[5] = 12;\n            data[6] = 14;\n            data[7] = 15;\n            data[8] = 18;\n\n            ByteBuffer_Put_ArrayTypes_Helper(data, sizeof(sbyte));\n        }\n\n        private static ArraySegment<T> CreateArraySegment<T>(T[] data)\n            where T : struct\n        {\n            const int arraySegmentPadding = 7;\n            var newData = new T[data.Length + 2 * arraySegmentPadding];\n            Array.Copy(data, 0, newData, arraySegmentPadding, data.Length);\n            return new ArraySegment<T>(newData, arraySegmentPadding, data.Length);\n        }\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_Put_Array_Null_Throws()\n        {\n            // Create the Byte Buffer\n            var uut = new ByteBuffer(1024);\n\n            // create a null array and try to put it into the buffer\n            float[] data = null;\n            Assert.Throws<ArgumentNullException>(() => uut.Put(1024, data));\n\n            ArraySegment<float> dataArraySegment = default(ArraySegment<float>);\n            Assert.Throws<ArgumentNullException>(() => uut.Put(1024, dataArraySegment));\n\n            IntPtr dataPtr = IntPtr.Zero;\n            int dataPtrLength = 100;\n            Assert.Throws<ArgumentNullException>(() => uut.Put<float>(1024, dataPtr, dataPtrLength));\n        }\n\n        [FlatBuffersTestMethod]\n        public unsafe void ByteBuffer_Put_Array_Empty_Throws()\n        {\n            // Create the Byte Buffer\n            var uut = new ByteBuffer(1024);\n\n            // create an array of length == 0, and try to put it into the buffer\n            float[] data = new float[0];\n            Assert.Throws<ArgumentException>(() => uut.Put(1024, data));\n\n            var dataArraySegment = new ArraySegment<float>(new float[10], 5, 0);\n            Assert.Throws<ArgumentException>(() => uut.Put(1024, dataArraySegment));\n\n            fixed(float* floatPtr = data)\n            {\n                var dataPtr = (IntPtr)floatPtr;\n                var dataPtrLength = 0;\n                Assert.Throws<ArgumentException>(() => uut.Put<float>(1024, dataPtr, dataPtrLength));\n            }\n        }\n\n        [FlatBuffersTestMethod]\n        public unsafe void ByteBuffer_Put_IntPtr_NegativeSize_Throws()\n        {\n            // Create the Byte Buffer\n            var uut = new ByteBuffer(1024);\n\n            // create an array of length == 0, and try to put it into the buffer\n            float[] data = new float[10];\n            fixed(float* floatPtr = data)\n            {\n                var dataPtr = (IntPtr)floatPtr;\n                var dataPtrLength = -1;\n                Assert.Throws<ArgumentException>(() => uut.Put<float>(1024, dataPtr, dataPtrLength));\n            }\n        }\n\n        #pragma warning disable 0169\n        // These are purposely not used and the warning is suppress\n        private struct dummyStruct\n        {\n            int a;\n            float b;\n        }\n        #pragma warning restore 0169\n\n        [FlatBuffersTestMethod]\n        public unsafe void ByteBuffer_Put_Array_IncorrectType_Throws()\n        {\n            // Create the Byte Buffer\n            var uut = new ByteBuffer(1024);\n\n            // Create an array of dummy structures that shouldn't be\n            // able to be put into the buffer\n            var data = new dummyStruct[10];\n            Assert.Throws<ArgumentException>(() => uut.Put(1024, data));\n\n            var dataArraySegment = new ArraySegment<dummyStruct>(data);\n            Assert.Throws<ArgumentException>(() => uut.Put(1024, dataArraySegment));\n\n            fixed(dummyStruct* floatPtr = data)\n            {\n                var dataPtr = (IntPtr)floatPtr;\n                var dataPtrLength = data.Length * sizeof(dummyStruct);\n                Assert.Throws<ArgumentException>(() => uut.Put<dummyStruct>(1024, dataPtr, dataPtrLength));\n            }\n        }\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_Get_Double()\n        {\n            var uut = new ByteBuffer(1024);\n            double value = 3.14159265;\n            uut.PutDouble(900, value);\n            double getValue = uut.GetDouble(900);\n            Assert.AreEqual(value, getValue);\n        }\n\n        [FlatBuffersTestMethod]\n        public void ByteBuffer_Get_Float()\n        {\n            var uut = new ByteBuffer(1024);\n            float value = 3.14159265F;\n            uut.PutFloat(900, value);\n            double getValue = uut.GetFloat(900);\n            Assert.AreEqual(value, getValue);\n        }\n    }\n}\n"
  },
  {
    "path": "tests/FlatBuffers.Test/FlatBufferBuilderTests.cs",
    "content": "/*\n * Copyright 2016 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nusing System;\nusing System.Diagnostics;\n\nnamespace Google.FlatBuffers.Test\n{\n    [FlatBuffersTestClass]\n    public class FlatBufferBuilderTests\n    {\n        private FlatBufferBuilder CreateBuffer(bool forceDefaults = true)\n        {\n            var fbb = new FlatBufferBuilder(16) {ForceDefaults = forceDefaults};\n            fbb.StartTable(1);\n            return fbb;\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WithForceDefaults_WhenAddBool_AndDefaultValue_OffsetIncreasesBySize()\n        {\n            var fbb = CreateBuffer();\n            var storedOffset = fbb.Offset;\n            fbb.AddBool(0, false, false);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(sizeof(bool), endOffset-storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WithForceDefaults_WhenAddSByte_AndDefaultValue_OffsetIncreasesBySize()\n        {\n            var fbb = CreateBuffer();\n            var storedOffset = fbb.Offset;\n            fbb.AddSbyte(0, 0, 0);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(sizeof(sbyte), endOffset - storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WithForceDefaults_WhenAddByte_AndDefaultValue_OffsetIncreasesBySize()\n        {\n            var fbb = CreateBuffer();\n            var storedOffset = fbb.Offset;\n            fbb.AddByte(0, 0, 0);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(sizeof(byte), endOffset - storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WithForceDefaults_WhenAddShort_AndDefaultValue_OffsetIncreasesBySize()\n        {\n            var fbb = CreateBuffer();\n            var storedOffset = fbb.Offset;\n            fbb.AddShort(0, 0, 0);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(sizeof(short), endOffset - storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WithForceDefaults_WhenAddUShort_AndDefaultValue_OffsetIncreasesBySize()\n        {\n            var fbb = CreateBuffer();\n            var storedOffset = fbb.Offset;\n            fbb.AddUshort(0, 0, 0);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(sizeof(ushort), endOffset - storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WithForceDefaults_WhenAddInt_AndDefaultValue_OffsetIncreasesBySize()\n        {\n            var fbb = CreateBuffer();\n            var storedOffset = fbb.Offset;\n            fbb.AddInt(0, 0, 0);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(sizeof(int), endOffset - storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WithForceDefaults_WhenAddUInt_AndDefaultValue_OffsetIncreasesBySize()\n        {\n            var fbb = CreateBuffer();\n            var storedOffset = fbb.Offset;\n            fbb.AddUint(0, 0, 0);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(sizeof(uint), endOffset - storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WithForceDefaults_WhenAddLong_AndDefaultValue_OffsetIncreasesBySize()\n        {\n            var fbb = CreateBuffer();\n            var storedOffset = fbb.Offset;\n            fbb.AddLong(0, 0, 0);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(sizeof(long), endOffset - storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WithForceDefaults_WhenAddULong_AndDefaultValue_OffsetIncreasesBySize()\n        {\n            var fbb = CreateBuffer();\n            var storedOffset = fbb.Offset;\n            fbb.AddUlong(0, 0, 0);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(sizeof(ulong), endOffset - storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WithForceDefaults_WhenAddFloat_AndDefaultValue_OffsetIncreasesBySize()\n        {\n            var fbb = CreateBuffer();\n            var storedOffset = fbb.Offset;\n            fbb.AddFloat(0, 0, 0);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(sizeof(float), endOffset - storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WithForceDefaults_WhenAddDouble_AndDefaultValue_OffsetIncreasesBySize()\n        {\n            var fbb = CreateBuffer();\n            var storedOffset = fbb.Offset;\n            fbb.AddDouble(0, 0, 0);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(sizeof(double), endOffset - storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddBool_AndDefaultValue_OffsetIsUnchanged()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddBool(0, false, false);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(endOffset, storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddSByte_AndDefaultValue_OffsetIsUnchanged()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddSbyte(0, 0, 0);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(endOffset, storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddByte_AndDefaultValue_OffsetIsUnchanged()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddByte(0, 0, 0);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(endOffset, storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddShort_AndDefaultValue_OffsetIsUnchanged()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddShort(0, 0, 0);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(endOffset, storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddUShort_AndDefaultValue_OffsetIsUnchanged()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddUshort(0, 0, 0);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(endOffset, storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddInt_AndDefaultValue_OffsetIsUnchanged()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddInt(0, 0, 0);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(endOffset, storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddUInt_AndDefaultValue_OffsetIsUnchanged()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddUint(0, 0, 0);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(endOffset, storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddLong_AndDefaultValue_OffsetIsUnchanged()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddLong(0, 0, 0);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(endOffset, storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddULong_AndDefaultValue_OffsetIsUnchanged()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddUlong(0, 0, 0);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(endOffset, storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddFloat_AndDefaultValue_OffsetIsUnchanged()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddFloat(0, 0, 0);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(endOffset, storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddDouble_AndDefaultValue_OffsetIsUnchanged()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddDouble(0, 0, 0);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(endOffset, storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddNullableBool_OffsetIsUnchanged()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddBool(0, null);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(endOffset, storedOffset);\n        }\n\n                [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddNullableSbyte_OffsetIsUnchanged()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddSbyte(0, null);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(endOffset, storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddNullableByte_OffsetIsUnchanged()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddByte(0, null);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(endOffset, storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddNullableShort_OffsetIsUnchanged()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddShort(0, null);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(endOffset, storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddNullableUShort_OffsetIsUnchanged()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddUshort(0, null);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(endOffset, storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddNullableInt_OffsetIsUnchanged()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddInt(0, null);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(endOffset, storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddNullableUInt_OffsetIsUnchanged()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddUint(0, null);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(endOffset, storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddNullableLong_OffsetIsUnchanged()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddLong(0, null);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(endOffset, storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddNullableULong_OffsetIsUnchanged()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddUlong(0, null);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(endOffset, storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddNullableFloat_OffsetIsUnchanged()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddFloat(0, null);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(endOffset, storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddNullableDouble_OffsetIsUnchanged()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddDouble(0, null);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(endOffset, storedOffset);\n        }\n\n         [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddNullableBool_OffsetIsChangedBySize()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddBool(0, true);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(sizeof(bool), endOffset - storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddNullableSbyte_OffsetIsChangedBySize()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddSbyte(0, 1);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(sizeof(sbyte), endOffset - storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddNullableByte_OffsetIsChangedBySize()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddByte(0, 1);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(sizeof(byte), endOffset - storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddNullableShort_OffsetIsChangedBySize()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddShort(0, 1);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(sizeof(short), endOffset - storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddNullableUShort_OffsetIsChangedBySize()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddUshort(0, 1);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(sizeof(ushort), endOffset - storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddNullableInt_OffsetIsChangedBySize()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddInt(0, 1);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(sizeof(int), endOffset - storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddNullableUInt_OffsetIsChangedBySize()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddUint(0, 1);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(sizeof(uint), endOffset - storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddNullableLong_OffsetIsChangedBySize()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddLong(0, 1);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(sizeof(long), endOffset - storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddNullableULong_OffsetIsChangedBySize()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddUlong(0, 1);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(sizeof(ulong), endOffset - storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddNullableFloat_OffsetIsChangedBySize()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddFloat(0, 1.0F);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(sizeof(float), endOffset - storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_WhenAddNullableDouble_OffsetIsChangedBySize()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n            fbb.AddDouble(0, 1.0);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(sizeof(double), endOffset - storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_Add_Array_Float()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n\n            const int len = 9;\n\n            // Construct the data array\n            var data = new float[len];\n            data[0] = 1.0079F;\n            data[1] = 4.0026F;\n            data[2] = 6.941F;\n            data[3] = 9.0122F;\n            data[4] = 10.811F;\n            data[5] = 12.0107F;\n            data[6] = 14.0067F;\n            data[7] = 15.9994F;\n            data[8] = 18.9984F;\n\n            fbb.Add(data);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(endOffset, storedOffset + sizeof(float) * data.Length);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_Add_Array_Bool()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n\n            const int len = 9;\n\n            // Construct the data array\n            var data = new bool[len];\n            data[0] = true;\n            data[1] = true;\n            data[2] = false;\n            data[3] = true;\n            data[4] = false;\n            data[5] = true;\n            data[6] = true;\n            data[7] = true;\n            data[8] = false;\n\n            fbb.Add(data);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(endOffset, storedOffset + sizeof(bool) * data.Length);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_Add_Array_Double()\n        {\n            var fbb = CreateBuffer(false);\n            var storedOffset = fbb.Offset;\n\n            const int len = 9;\n\n            // Construct the data array\n            var data = new double[len];\n            data[0] = 1.0079;\n            data[1] = 4.0026;\n            data[2] = 6.941;\n            data[3] = 9.0122;\n            data[4] = 10.811;\n            data[5] = 12.0107;\n            data[6] = 14.0067;\n            data[7] = 15.9994;\n            data[8] = 18.9984;\n\n            fbb.Add(data);\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(endOffset, storedOffset + sizeof(double) * data.Length);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_Add_Array_Null_Throws()\n        {\n            var fbb = CreateBuffer(false);\n\n            // Construct the data array\n            float[] data = null;\n\n            Assert.Throws<ArgumentNullException>(() => fbb.Add(data));\n        }\n        \n        [FlatBuffersTestMethod]\n        public unsafe void FlatBufferBuilder_Add_Array_UnsupportedType_Throws()\n        {\n            var fbb = CreateBuffer(false);\n                  \n            var storedOffset = fbb.Offset;\n\n            // Construct the data array\n            var data = new DummyStruct[10];\n            Assert.Throws<ArgumentException>(() => fbb.Add(data));\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_Add_Array_Empty_Noop()\n        {\n            var fbb = CreateBuffer(false);\n\n            var storedOffset = fbb.Offset;\n\n            // Construct an empty data array\n            float[] data = new float[0];\n            fbb.Add(data);\n\n            // Make sure the offset didn't change since nothing\n            // was really added\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(endOffset, storedOffset);\n        }\n    \n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_Add_ArraySegment_Default_Throws()\n        {\n#if NETCOREAPP\n      var fbb = CreateBuffer(false);\n\n            // Construct the data array\n            ArraySegment<float> data = default(ArraySegment<float>);\n\n            Assert.Throws<ArgumentNullException>(() => fbb.Add(data));\n#endif\n        }\n            \n        [FlatBuffersTestMethod]\n        public unsafe void FlatBufferBuilder_Add_ArraySegment_UnsupportedType_Throws()\n        {\n            var fbb = CreateBuffer(false);\n                  \n            var storedOffset = fbb.Offset;\n\n            // Construct the data array\n            var array = new DummyStruct[10];\n            var data = new ArraySegment<DummyStruct>(array);\n            Assert.Throws<ArgumentException>(() => fbb.Add(data));\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_Add_ArraySegment_Empty_Noop()\n        {\n            var fbb = CreateBuffer(false);\n                  \n            var storedOffset = fbb.Offset;\n\n            // Construct the data array\n            var array = new float[10];\n            var data = new ArraySegment<float>(array, 5, 0);\n            fbb.Add(data);\n\n            // Make sure the offset didn't change since nothing\n            // was really added\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(endOffset, storedOffset);\n        }\n    \n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_Add_IntPtr_Zero_Throws()\n        {\n            var fbb = CreateBuffer(false);\n\n            // Construct the data array\n            var data = IntPtr.Zero;\n            var length = 100;\n\n            Assert.Throws<ArgumentNullException>(() => fbb.Add<float>(data, length));\n        }\n            \n        [FlatBuffersTestMethod]\n        public unsafe void FlatBufferBuilder_Add_IntPtr_SizeNegative_Throws()\n        {\n            var fbb = CreateBuffer(false);\n\n            // Construct the data array\n            var array = new float[10];\n            fixed(float* ptr = array)\n            {\n                var data = (IntPtr)ptr;\n                var length = -1;\n                Assert.Throws<ArgumentOutOfRangeException>(() => fbb.Add<float>(data, length));\n            }\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_Add_IntPtr_Zero_Empty_Noop()\n        {\n            var fbb = CreateBuffer(false);\n\n            var storedOffset = fbb.Offset;\n\n            // Construct the data array\n            var data = IntPtr.Zero;\n            var length = 0;\n\n            fbb.Add<float>(data, length);\n\n            // make sure that a length of 0 doesn't throw also if ptr is Zero as well\n            // and that nothing was really added\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(endOffset, storedOffset);\n        }\n\n        [FlatBuffersTestMethod]\n        public unsafe void FlatBufferBuilder_Add_IntPtr_Empty_Noop()\n        {\n            var fbb = CreateBuffer(false);\n                  \n            var storedOffset = fbb.Offset;\n\n            // Construct the data array\n            var array = new float[10];\n            fixed(float* ptr = array)\n            {\n                var data = (IntPtr)ptr;\n                var length = 0;\n                fbb.Add<float>(data, length);\n            }\n\n            // Make sure the offset didn't change since nothing\n            // was really added\n            var endOffset = fbb.Offset;\n            Assert.AreEqual(endOffset, storedOffset);\n        }\n    \n        [FlatBuffersTestMethod]\n        public unsafe void FlatBufferBuilder_Add_IntPtr_SizeInBytesNotMatchingDataType_Throws()\n        {\n            var fbb = CreateBuffer(false);\n                  \n            var storedOffset = fbb.Offset;\n\n            // Construct the data array\n            var array = new float[10];\n            fixed(float* ptr = array)\n            {\n                const int invalidBytes = 1;\n                var data = (IntPtr)ptr;\n                // add some invalid bytes to the length\n                var length = 2 * sizeof(float) + invalidBytes;\n            \n                Assert.Throws<ArgumentException>(() => fbb.Add<float>(data, length));\n            }\n        }\n    \n        [FlatBuffersTestMethod]\n        public unsafe void FlatBufferBuilder_Add_IntPtr_UnsupportedType_Throws()\n        {\n            var fbb = CreateBuffer(false);\n                  \n            var storedOffset = fbb.Offset;\n\n            // Construct the data array\n            var array = new DummyStruct[10];\n            fixed(DummyStruct* ptr = array)\n            {\n                var data = (IntPtr)ptr;\n                var length = 10 * sizeof(DummyStruct);\n            \n                Assert.Throws<ArgumentException>(() => fbb.Add<DummyStruct>(data, length));\n            }\n        }\n\n        private struct DummyStruct\n        {\n            int value;\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_Add_null_String()\n        {\n            var fbb = new FlatBufferBuilder(16);\n            string s = null;\n            Assert.AreEqual(fbb.CreateSharedString(s).Value, 0);\n            Assert.AreEqual(fbb.CreateString(s).Value, 0);\n        }\n\n        [FlatBuffersTestMethod]\n        public void FlatBufferBuilder_Empty_Builder()\n        {\n            var fbb = new FlatBufferBuilder(16);\n            var str = \"Hello\";\n            var flatbuffer = \"Flatbuffers!\";\n            var strOffset = fbb.CreateSharedString(str);\n            var flatbufferOffset = fbb.CreateSharedString(flatbuffer);\n            fbb.Clear();\n            var flatbufferOffset2 = fbb.CreateSharedString(flatbuffer);\n            var strOffset2 = fbb.CreateSharedString(str);\n            Assert.IsFalse(strOffset.Value == strOffset2.Value);\n            Assert.IsFalse(flatbufferOffset.Value == flatbufferOffset2.Value);\n        }\n    }\n}\n"
  },
  {
    "path": "tests/FlatBuffers.Test/FlatBuffers.Test.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFrameworks>net6.0;net8.0</TargetFrameworks>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Remove=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n\n  <PropertyGroup Condition=\"'$(UNSAFE_BYTEBUFFER)' == 'true'\">\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n    <DefineConstants>$(DefineConstants);UNSAFE_BYTEBUFFER</DefineConstants>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(ENABLE_SPAN_T)' == 'true'\">\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n    <DefineConstants>$(DefineConstants);ENABLE_SPAN_T</DefineConstants>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|AnyCPU'\">\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|AnyCPU'\">\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"..\\..\\net\\FlatBuffers\\ByteBuffer.cs\">\n      <Link>FlatBuffers\\ByteBuffer.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\..\\net\\FlatBuffers\\ByteBufferUtil.cs\">\n      <Link>FlatBuffers\\ByteBufferUtil.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\..\\net\\FlatBuffers\\IFlatbufferObject.cs\">\n      <Link>FlatBuffers\\IFlatbufferObject.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\..\\net\\FlatBuffers\\Offset.cs\">\n      <Link>FlatBuffers\\Offset.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\..\\net\\FlatBuffers\\FlatBufferBuilder.cs\">\n      <Link>FlatBuffers\\FlatBufferBuilder.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\..\\net\\FlatBuffers\\FlatBufferConstants.cs\">\n      <Link>FlatBuffers\\FlatBufferConstants.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\..\\net\\FlatBuffers\\FlatBufferVerify.cs\">\n      <Link>FlatBuffers\\FlatBufferVerify.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\..\\net\\FlatBuffers\\Struct.cs\">\n      <Link>FlatBuffers\\Struct.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\..\\net\\FlatBuffers\\Table.cs\">\n      <Link>FlatBuffers\\Table.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\MyGame\\Example2\\Monster.cs\">\n      <Link>MyGame\\Example2\\Monster.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\MyGame\\Example\\Any.cs\">\n      <Link>MyGame\\Example\\Any.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\MyGame\\Example\\AnyAmbiguousAliases.cs\">\n      <Link>MyGame\\Example\\AnyAmbiguousAliases.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\MyGame\\Example\\AnyUniqueAliases.cs\">\n      <Link>MyGame\\Example\\AnyUniqueAliases.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\MyGame\\Example\\Color.cs\">\n      <Link>MyGame\\Example\\Color.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\MyGame\\Example\\Race.cs\">\n      <Link>MyGame\\Example\\Race.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\MyGame\\Example\\Monster.cs\">\n      <Link>MyGame\\Example\\Monster.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\MyGame\\Example\\Referrable.cs\">\n      <Link>MyGame\\Example\\Referrable.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\MyGame\\Example\\Stat.cs\">\n      <Link>MyGame\\Example\\Stat.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\MyGame\\Example\\Test.cs\">\n      <Link>MyGame\\Example\\Test.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\MyGame\\Example\\TestSimpleTableWithEnum.cs\">\n      <Link>MyGame\\Example\\TestSimpleTableWithEnum.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\MyGame\\Example\\TypeAliases.cs\">\n      <Link>MyGame\\Example\\TypeAliases.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\MyGame\\Example\\Vec3.cs\">\n      <Link>MyGame\\Example\\Vec3.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\MyGame\\Example\\Ability.cs\">\n      <Link>MyGame\\Example\\Ability.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\MyGame\\Example\\ArrayTable.cs\">\n      <Link>MyGame\\Example\\ArrayTable.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\MyGame\\Example\\ArrayStruct.cs\">\n      <Link>MyGame\\Example\\ArrayStruct.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\MyGame\\Example\\NestedStruct.cs\">\n      <Link>MyGame\\Example\\NestedStruct.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\MyGame\\Example\\LargeArrayStruct.cs\">\n      <Link>MyGame\\Example\\LargeArrayStruct.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\MyGame\\Example\\LongEnum.cs\">\n      <Link>MyGame\\Example\\LongEnum.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\MyGame\\Example\\TestEnum.cs\">\n      <Link>MyGame\\Example\\TestEnum.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\MyGame\\InParentNamespace.cs\">\n      <Link>MyGame\\InParentNamespace.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\namespace_test\\NamespaceA\\NamespaceB\\EnumInNestedNS.cs\">\n      <Link>NamespaceA\\NamespaceB\\EnumInNestedNS.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\namespace_test\\NamespaceA\\NamespaceB\\StructInNestedNS.cs\">\n      <Link>NamespaceA\\NamespaceB\\StructInNestedNS.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\namespace_test\\NamespaceA\\NamespaceB\\TableInNestedNS.cs\">\n      <Link>NamespaceA\\NamespaceB\\TableInNestedNS.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\namespace_test\\NamespaceA\\NamespaceB\\UnionInNestedNS.cs\">\n      <Link>NamespaceA\\NamespaceB\\UnionInNestedNS.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\namespace_test\\NamespaceA\\TableInFirstNS.cs\">\n      <Link>NamespaceA\\TableInFirstNS.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\union_vector\\Attacker.cs\">\n      <Link>union_vector\\Attacker.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\union_vector\\BookReader.cs\">\n      <Link>union_vector\\BookReader.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\union_vector\\Character.cs\">\n      <Link>union_vector\\Character.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\union_vector\\Movie.cs\">\n      <Link>union_vector\\Movie.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\union_vector\\Rapunzel.cs\">\n      <Link>union_vector\\Rapunzel.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\optional_scalars\\OptionalByte.cs\">\n      <Link>optional_scalars\\OptionalByte.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\optional_scalars\\ScalarStuff.cs\">\n      <Link>optional_scalars\\ScalarStuff.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\KeywordTest\\ABC.cs\">\n      <Link>KeywordTest\\ABC.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\KeywordTest\\public.cs\">\n      <Link>KeywordTest\\public.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\KeywordTest\\KeywordsInTable.cs\">\n      <Link>KeywordTest\\KeywordsInTable.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\KeywordTest\\KeywordsInUnion.cs\">\n      <Link>KeywordTest\\KeywordsInUnion.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\nested_namespace_test\\nested_namespace_test1_generated.cs\">\n      <Link>nested_namespace_test\\nested_namespace_test1_generated.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\nested_namespace_test\\nested_namespace_test2_generated.cs\">\n      <Link>nested_namespace_test\\nested_namespace_test2_generated.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\nested_namespace_test\\nested_namespace_test3_generated.cs\">\n      <Link>nested_namespace_test\\nested_namespace_test3_generated.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\union_value_collsion\\union_value_collision_generated.cs\">\n      <Link>union_value_collsion\\union_value_collision_generated.cs</Link>\n    </Compile>\n  </ItemGroup>\n\n  <ItemGroup>\n    <None Remove=\".gitignore\" />\n    <None Remove=\"clean.sh\" />\n    <None Remove=\"NetTest.sh\" />\n    <None Remove=\"packages.config\" />\n    <None Remove=\"README.md\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Content Include=\"..\\monsterdata_test.mon\">\n      <Link>monsterdata_test.mon</Link>\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <Content Include=\"..\\monsterdata_test.json\">\n      <Link>monsterdata_test.json</Link>\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Newtonsoft.Json\" Version=\"13.0.3\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "tests/FlatBuffers.Test/FlatBuffersExampleTests.cs",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nusing System.IO;\nusing System.Text;\nusing System.Threading;\nusing MyGame.Example;\nusing optional_scalars;\nusing KeywordTest;\n\nnamespace Google.FlatBuffers.Test\n{\n    [FlatBuffersTestClass]\n    public class FlatBuffersExampleTests\n    {\n        public void RunTests()\n        {\n            CanCreateNewFlatBufferFromScratch();\n            CanReadCppGeneratedWireFile();\n            TestEnums();\n        }\n\n        [FlatBuffersTestMethod]\n        public void CanCreateNewFlatBufferFromScratch()\n        {\n            CanCreateNewFlatBufferFromScratch(true);\n            CanCreateNewFlatBufferFromScratch(false);\n        }\n\n        private void CanCreateNewFlatBufferFromScratch(bool sizePrefix)\n        {\n            // Second, let's create a FlatBuffer from scratch in C#, and test it also.\n            // We use an initial size of 1 to exercise the reallocation algorithm,\n            // normally a size larger than the typical FlatBuffer you generate would be\n            // better for performance.\n            var fbb = new FlatBufferBuilder(1);\n\n            StringOffset[] names = { fbb.CreateString(\"Frodo\"), fbb.CreateString(\"Barney\"), fbb.CreateString(\"Wilma\") };\n            Offset<Monster>[] off = new Offset<Monster>[3];\n            Monster.StartMonster(fbb);\n            Monster.AddName(fbb, names[0]);\n            off[0] = Monster.EndMonster(fbb);\n            Monster.StartMonster(fbb);\n            Monster.AddName(fbb, names[1]);\n            off[1] = Monster.EndMonster(fbb);\n            Monster.StartMonster(fbb);\n            Monster.AddName(fbb, names[2]);\n            off[2] = Monster.EndMonster(fbb);\n            var sortMons = Monster.CreateSortedVectorOfMonster(fbb, off);\n\n            // We set up the same values as monsterdata.json:\n\n            var str = fbb.CreateString(\"MyMonster\");\n            var test1 = fbb.CreateString(\"test1\");\n            var test2 = fbb.CreateString(\"test2\");\n\n\n            Monster.StartInventoryVector(fbb, 5);\n            for (int i = 4; i >= 0; i--)\n            {\n                fbb.AddByte((byte)i);\n            }\n            var inv = fbb.EndVector();\n\n            var fred = fbb.CreateString(\"Fred\");\n            Monster.StartMonster(fbb);\n            Monster.AddName(fbb, fred);\n            var mon2 = Monster.EndMonster(fbb);\n\n            Monster.StartTest4Vector(fbb, 2);\n            MyGame.Example.Test.CreateTest(fbb, (short)10, (sbyte)20);\n            MyGame.Example.Test.CreateTest(fbb, (short)30, (sbyte)40);\n            var test4 = fbb.EndVector();\n\n            Monster.StartTestarrayofstringVector(fbb, 2);\n            fbb.AddOffset(test2.Value);\n            fbb.AddOffset(test1.Value);\n            var testArrayOfString = fbb.EndVector();\n\n            var longsVector = Monster.CreateVectorOfLongsVector(fbb, new long[] { 1, 100, 10000, 1000000, 100000000 });\n            var doublesVector = Monster.CreateVectorOfDoublesVector(fbb, new double[] { -1.7976931348623157e+308, 0, 1.7976931348623157e+308 });\n\n            Monster.StartMonster(fbb);\n            Monster.AddPos(fbb, Vec3.CreateVec3(fbb, 1.0f, 2.0f, 3.0f, 3.0,\n                                                     Color.Green, (short)5, (sbyte)6));\n            Monster.AddHp(fbb, (short)80);\n            Monster.AddName(fbb, str);\n            Monster.AddInventory(fbb, inv);\n            Monster.AddTestType(fbb, Any.Monster);\n            Monster.AddTest(fbb, mon2.Value);\n            Monster.AddTest4(fbb, test4);\n            Monster.AddTestarrayofstring(fbb, testArrayOfString);\n            Monster.AddTestbool(fbb, true);\n            Monster.AddTestarrayoftables(fbb, sortMons);\n            Monster.AddVectorOfLongs(fbb, longsVector);\n            Monster.AddVectorOfDoubles(fbb, doublesVector);\n            var mon = Monster.EndMonster(fbb);\n\n            if (sizePrefix)\n            {\n                Monster.FinishSizePrefixedMonsterBuffer(fbb, mon);\n            }\n            else\n            {\n                Monster.FinishMonsterBuffer(fbb, mon);\n            }\n\n            // Dump to output directory so we can inspect later, if needed\n            #if ENABLE_SPAN_T\n            var data = fbb.DataBuffer.ToSizedArray();\n            string filename = @\"monsterdata_cstest\" + (sizePrefix ? \"_sp\" : \"\") + \".mon\";\n            File.WriteAllBytes(filename, data);\n            #else\n            using (var ms = fbb.DataBuffer.ToMemoryStream(fbb.DataBuffer.Position, fbb.Offset))\n            {\n                var data = ms.ToArray();\n                string filename = @\"monsterdata_cstest\" + (sizePrefix ? \"_sp\" : \"\") + \".mon\";\n                File.WriteAllBytes(filename, data);\n            }\n            #endif\n\n            // Remove the size prefix if necessary for further testing\n            ByteBuffer dataBuffer = fbb.DataBuffer;\n            if (sizePrefix)\n            {\n                Assert.AreEqual(ByteBufferUtil.GetSizePrefix(dataBuffer) + FlatBufferConstants.SizePrefixLength,\n                                dataBuffer.Length - dataBuffer.Position);\n                dataBuffer = ByteBufferUtil.RemoveSizePrefix(dataBuffer);\n            }\n\n            // Now assert the buffer\n            TestBuffer(dataBuffer);\n\n            //Attempt to mutate Monster fields and check whether the buffer has been mutated properly\n            // revert to original values after testing\n            Monster monster = Monster.GetRootAsMonster(dataBuffer);\n            \n\n            // mana is optional and does not exist in the buffer so the mutation should fail\n            // the mana field should retain its default value\n            Assert.AreEqual(monster.MutateMana((short)10), false);\n            Assert.AreEqual(monster.Mana, (short)150);\n\n            // Accessing a vector of sorted by the key tables\n            Assert.AreEqual(monster.Testarrayoftables(0).Value.Name, \"Barney\");\n            Assert.AreEqual(monster.Testarrayoftables(1).Value.Name, \"Frodo\");\n            Assert.AreEqual(monster.Testarrayoftables(2).Value.Name, \"Wilma\");\n\n            // Example of searching for a table by the key\n            Assert.IsTrue(monster.TestarrayoftablesByKey(\"Frodo\") != null);\n            Assert.AreEqual(monster.TestarrayoftablesByKey(\"Frodo\").Value.Name, \"Frodo\");\n            Assert.IsTrue(monster.TestarrayoftablesByKey(\"Barney\") != null);\n            Assert.AreEqual(monster.TestarrayoftablesByKey(\"Barney\").Value.Name, \"Barney\");\n            Assert.IsTrue(monster.TestarrayoftablesByKey(\"Wilma\") != null);\n            Assert.AreEqual(monster.TestarrayoftablesByKey(\"Wilma\").Value.Name, \"Wilma\");\n\n            // testType is an existing field\n            Assert.AreEqual(monster.TestType, Any.Monster);\n\n            //mutate the inventory vector\n            Assert.AreEqual(monster.MutateInventory(0, 1), true);\n            Assert.AreEqual(monster.MutateInventory(1, 2), true);\n            Assert.AreEqual(monster.MutateInventory(2, 3), true);\n            Assert.AreEqual(monster.MutateInventory(3, 4), true);\n            Assert.AreEqual(monster.MutateInventory(4, 5), true);\n\n            for (int i = 0; i < monster.InventoryLength; i++)\n            {\n                Assert.AreEqual(monster.Inventory(i), i + 1);\n            }\n\n            //reverse mutation\n            Assert.AreEqual(monster.MutateInventory(0, 0), true);\n            Assert.AreEqual(monster.MutateInventory(1, 1), true);\n            Assert.AreEqual(monster.MutateInventory(2, 2), true);\n            Assert.AreEqual(monster.MutateInventory(3, 3), true);\n            Assert.AreEqual(monster.MutateInventory(4, 4), true);\n\n            // get a struct field and edit one of its fields\n            Vec3 pos = (Vec3)monster.Pos;\n            Assert.AreEqual(pos.X, 1.0f);\n            pos.MutateX(55.0f);\n            Assert.AreEqual(pos.X, 55.0f);\n            pos.MutateX(1.0f);\n            Assert.AreEqual(pos.X, 1.0f);\n\n            TestBuffer(dataBuffer);\n            TestObjectAPI(Monster.GetRootAsMonster(dataBuffer));\n        }\n\n        private void TestBuffer(ByteBuffer bb)\n        {\n            bool test = Monster.VerifyMonster(bb);\n            Assert.AreEqual(true, test);\n\n            Monster monster = Monster.GetRootAsMonster(bb);\n\n            Assert.AreEqual(80, monster.Hp);\n            Assert.AreEqual(150, monster.Mana);\n            Assert.AreEqual(\"MyMonster\", monster.Name);\n\n            var pos = monster.Pos.Value;\n            Assert.AreEqual(1.0f, pos.X);\n            Assert.AreEqual(2.0f, pos.Y);\n            Assert.AreEqual(3.0f, pos.Z);\n\n            Assert.AreEqual(3.0f, pos.Test1);\n            Assert.AreEqual(Color.Green, pos.Test2);\n            var t = (MyGame.Example.Test)pos.Test3;\n            Assert.AreEqual((short)5, t.A);\n            Assert.AreEqual((sbyte)6, t.B);\n\n            Assert.AreEqual(Any.Monster, monster.TestType);\n\n            var monster2 = monster.Test<Monster>().Value;\n            Assert.AreEqual(\"Fred\", monster2.Name);\n\n\n            Assert.AreEqual(5, monster.InventoryLength);\n            var invsum = 0;\n            for (var i = 0; i < monster.InventoryLength; i++)\n            {\n                invsum += monster.Inventory(i);\n            }\n            Assert.AreEqual(10, invsum);\n\n            // Get the inventory as an array and subtract the\n            // sum to get it back to 0\n            var inventoryArray = monster.GetInventoryArray();\n            Assert.AreEqual(5, inventoryArray.Length);\n            foreach(var inv in inventoryArray)\n            {\n                invsum -= inv;\n            }\n            Assert.AreEqual(0, invsum);\n\n            var test0 = monster.Test4(0).Value;\n            var test1 = monster.Test4(1).Value;\n            Assert.AreEqual(2, monster.Test4Length);\n\n            Assert.AreEqual(100, test0.A + test0.B + test1.A + test1.B);\n\n            Assert.AreEqual(2, monster.TestarrayofstringLength);\n            Assert.AreEqual(\"test1\", monster.Testarrayofstring(0));\n            Assert.AreEqual(\"test2\", monster.Testarrayofstring(1));\n\n            Assert.AreEqual(true, monster.Testbool);\n\n            #if ENABLE_SPAN_T\n            var nameBytes = monster.GetNameBytes();\n            Assert.AreEqual(\"MyMonster\", Encoding.UTF8.GetString(nameBytes.ToArray(), 0, nameBytes.Length));\n\n            if (0 == monster.TestarrayofboolsLength)\n            {\n                Assert.IsFalse(monster.GetTestarrayofboolsBytes().Length != 0);\n            }\n            else\n            {\n                Assert.IsTrue(monster.GetTestarrayofboolsBytes().Length != 0);\n            }\n\n            var longArrayBytes = monster.GetVectorOfLongsBytes();\n            Assert.IsTrue(monster.VectorOfLongsLength == longArrayBytes.Length);\n\n            var doubleArrayBytes = monster.GetVectorOfDoublesBytes();\n            Assert.IsTrue(monster.VectorOfDoublesLength == doubleArrayBytes.Length);\n            #else\n            var nameBytes = monster.GetNameBytes().Value;\n            Assert.AreEqual(\"MyMonster\", Encoding.UTF8.GetString(nameBytes.Array, nameBytes.Offset, nameBytes.Count));\n\n            if (0 == monster.TestarrayofboolsLength)\n            {\n                Assert.IsFalse(monster.GetTestarrayofboolsBytes().HasValue);\n            }\n            else\n            {\n                Assert.IsTrue(monster.GetTestarrayofboolsBytes().HasValue);\n            }\n            #endif\n\n            var longArray = monster.GetVectorOfLongsArray();\n            Assert.AreEqual(5, longArray.Length);\n            Assert.AreEqual(100, longArray[1]);\n\n            var doublesArray = monster.GetVectorOfDoublesArray();\n            Assert.AreEqual(3, doublesArray.Length);\n        }\n\n        [FlatBuffersTestMethod]\n        public void CanReadCppGeneratedWireFile()\n        {\n            var data = File.ReadAllBytes(@\"monsterdata_test.mon\");\n            var bb = new ByteBuffer(data);\n            TestBuffer(bb);\n            TestObjectAPI(Monster.GetRootAsMonster(bb));\n        }\n\n        [FlatBuffersTestMethod]\n        public void CanReadJsonFile()\n        {\n            var jsonText = File.ReadAllText(@\"monsterdata_test.json\");\n            var mon = MonsterT.DeserializeFromJson(jsonText);\n            var fbb = new FlatBufferBuilder(1);\n            Monster.FinishMonsterBuffer(fbb, Monster.Pack(fbb, mon));\n            TestBuffer(fbb.DataBuffer);\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestEnums()\n        {\n            Assert.AreEqual(\"Red\", Color.Red.ToString());\n            Assert.AreEqual(\"Blue\", Color.Blue.ToString());\n            Assert.AreEqual(\"NONE\", Any.NONE.ToString());\n            Assert.AreEqual(\"Monster\", Any.Monster.ToString());\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestVectorOfEnums()\n        {\n            const string monsterName = \"TestVectorOfEnumsMonster\";\n            var colorVec = new Color[] { Color.Red, Color.Green, Color.Blue };\n            var fbb = new FlatBufferBuilder(32);\n            var str1 = fbb.CreateString(monsterName);\n            var vec1 = Monster.CreateVectorOfEnumsVector(fbb, colorVec);\n            Monster.StartMonster(fbb);\n            Monster.AddName(fbb, str1);\n            Monster.AddVectorOfEnums(fbb, vec1);\n            var monster1 = Monster.EndMonster(fbb);\n            Monster.FinishMonsterBuffer(fbb, monster1);\n\n            var mons = Monster.GetRootAsMonster(fbb.DataBuffer);\n            var colors = mons.GetVectorOfEnumsArray();\n            Assert.ArrayEqual(colorVec, colors);\n\n            TestObjectAPI(mons);\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestNestedFlatBuffer()\n        {\n            const string nestedMonsterName = \"NestedMonsterName\";\n            const short nestedMonsterHp = 600;\n            const short nestedMonsterMana = 1024;\n            // Create nested buffer as a Monster type\n            var fbb1 = new FlatBufferBuilder(16);\n            var str1 = fbb1.CreateString(nestedMonsterName);\n            Monster.StartMonster(fbb1);\n            Monster.AddName(fbb1, str1);\n            Monster.AddHp(fbb1, nestedMonsterHp);\n            Monster.AddMana(fbb1, nestedMonsterMana);\n            var monster1 = Monster.EndMonster(fbb1);\n            Monster.FinishMonsterBuffer(fbb1, monster1);\n            var fbb1Bytes = fbb1.SizedByteArray();\n            fbb1 = null;\n\n            // Create a Monster which has the first buffer as a nested buffer\n            var fbb2 = new FlatBufferBuilder(16);\n            var str2 = fbb2.CreateString(\"My Monster\");\n            var nestedBuffer = Monster.CreateTestnestedflatbufferVector(fbb2, fbb1Bytes);\n            Monster.StartMonster(fbb2);\n            Monster.AddName(fbb2, str2);\n            Monster.AddHp(fbb2, 50);\n            Monster.AddMana(fbb2, 32);\n            Monster.AddTestnestedflatbuffer(fbb2, nestedBuffer);\n            var monster = Monster.EndMonster(fbb2);\n            Monster.FinishMonsterBuffer(fbb2, monster);\n\n            // Now test the data extracted from the nested buffer\n            var mons = Monster.GetRootAsMonster(fbb2.DataBuffer);\n            var nestedMonster = mons.GetTestnestedflatbufferAsMonster().Value;\n\n            Assert.AreEqual(nestedMonsterMana, nestedMonster.Mana);\n            Assert.AreEqual(nestedMonsterHp, nestedMonster.Hp);\n            Assert.AreEqual(nestedMonsterName, nestedMonster.Name);\n\n            TestObjectAPI(mons);\n            TestObjectAPI(nestedMonster);\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestFixedLenghtArrays()\n        {\n            FlatBufferBuilder builder = new FlatBufferBuilder(100);\n\n            float   a;\n            int[]   b = new int[15];\n            sbyte   c;\n            int[,]  d_a = new int[2, 2];\n            TestEnum[]  d_b = new TestEnum[2];\n            TestEnum[,] d_c = new TestEnum[2, 2];\n            long[,]     d_d = new long[2, 2];\n            int         e;\n            long[]      f = new long[2];\n\n            a = 0.5f;\n            for (int i = 0; i < 15; i++) b[i] = i;\n            c = 1;\n            d_a[0, 0] = 1;\n            d_a[0, 1] = 2;\n            d_a[1, 0] = 3;\n            d_a[1, 1] = 4;\n            d_b[0] = TestEnum.B;\n            d_b[1] = TestEnum.C;\n            d_c[0, 0] = TestEnum.A;\n            d_c[0, 1] = TestEnum.B;\n            d_c[1, 0] = TestEnum.C;\n            d_c[1, 1] = TestEnum.B;\n            d_d[0, 0] = -1;\n            d_d[0, 1] = 1;\n            d_d[1, 0] = -2;\n            d_d[1, 1] = 2;\n            e = 2;\n            f[0] = -1;\n            f[1] = 1;\n\n            Offset<ArrayStruct> arrayOffset = ArrayStruct.CreateArrayStruct(\n                builder, a, b, c, d_a, d_b, d_c, d_d, e, f);\n\n            // Create a table with the ArrayStruct.\n            ArrayTable.StartArrayTable(builder);\n            ArrayTable.AddA(builder, arrayOffset);\n            Offset<ArrayTable> tableOffset = ArrayTable.EndArrayTable(builder);\n\n            ArrayTable.FinishArrayTableBuffer(builder, tableOffset);\n\n            ArrayTable table = ArrayTable.GetRootAsArrayTable(builder.DataBuffer);\n\n            Assert.AreEqual(table.A.Value.A, 0.5f);\n            for (int i = 0; i < 15; i++) Assert.AreEqual(table.A.Value.B(i), i);\n            Assert.AreEqual(table.A.Value.C, (sbyte)1);\n            Assert.AreEqual(table.A.Value.D(0).A(0), 1);\n            Assert.AreEqual(table.A.Value.D(0).A(1), 2);\n            Assert.AreEqual(table.A.Value.D(1).A(0), 3);\n            Assert.AreEqual(table.A.Value.D(1).A(1), 4);\n            Assert.AreEqual(table.A.Value.D(0).B, TestEnum.B);\n            Assert.AreEqual(table.A.Value.D(1).B, TestEnum.C);\n            Assert.AreEqual(table.A.Value.D(0).C(0), TestEnum.A);\n            Assert.AreEqual(table.A.Value.D(0).C(1), TestEnum.B);\n            Assert.AreEqual(table.A.Value.D(1).C(0), TestEnum.C);\n            Assert.AreEqual(table.A.Value.D(1).C(1), TestEnum.B);\n            Assert.AreEqual(table.A.Value.D(0).D(0), -1);\n            Assert.AreEqual(table.A.Value.D(0).D(1), 1);\n            Assert.AreEqual(table.A.Value.D(1).D(0), -2);\n            Assert.AreEqual(table.A.Value.D(1).D(1), 2);\n            Assert.AreEqual(table.A.Value.E, 2);\n            Assert.AreEqual(table.A.Value.F(0), -1);\n            Assert.AreEqual(table.A.Value.F(1), 1);\n\n            TestObjectAPI(table);\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestUnionVector()\n        {\n            var fbb = new FlatBufferBuilder(100);\n            var rapunzel = Rapunzel.CreateRapunzel(fbb, 40).Value;\n\n            var characterTypes = new[]\n            {\n                Character.MuLan,\n                Character.Belle,\n                Character.Other,\n            };\n            var characterTypesOffset = Movie.CreateCharactersTypeVector(fbb, characterTypes);\n\n            var characters = new[]\n            {\n                Attacker.CreateAttacker(fbb, 10).Value,\n                BookReader.CreateBookReader(fbb, 20).Value,\n                fbb.CreateSharedString(\"Chip\").Value,\n            };\n            var charactersOffset = Movie.CreateCharactersVector(fbb, characters);\n\n            var movieOffset = Movie.CreateMovie(\n                fbb,\n                Character.Rapunzel,\n                rapunzel,\n                characterTypesOffset,\n                charactersOffset);\n            Movie.FinishMovieBuffer(fbb, movieOffset);\n\n            var movie = Movie.GetRootAsMovie(fbb.DataBuffer);\n            Assert.AreEqual(Character.Rapunzel, movie.MainCharacterType);\n            Assert.AreEqual(40, movie.MainCharacter<Rapunzel>().Value.HairLength);\n\n            Assert.AreEqual(3, movie.CharactersLength);\n            Assert.AreEqual(Character.MuLan, movie.CharactersType(0));\n            Assert.AreEqual(10, movie.Characters<Attacker>(0).Value.SwordAttackDamage);\n            Assert.AreEqual(Character.Belle, movie.CharactersType(1));\n            Assert.AreEqual(20, movie.Characters<BookReader>(1).Value.BooksRead);\n            Assert.AreEqual(Character.Other, movie.CharactersType(2));\n            Assert.AreEqual(\"Chip\", movie.CharactersAsString(2));\n\n            TestObjectAPI(movie);\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestUnionUtility()\n        {\n            var movie = new MovieT\n            {\n                MainCharacter = CharacterUnion.FromRapunzel(new RapunzelT { HairLength = 40 }),\n                Characters = new System.Collections.Generic.List<CharacterUnion>\n                {\n                    CharacterUnion.FromMuLan(new AttackerT { SwordAttackDamage = 10 }),\n                    CharacterUnion.FromBelle(new BookReaderT { BooksRead = 20 }),\n                    CharacterUnion.FromOther(\"Chip\"),\n                },\n            };\n\n            var fbb = new FlatBufferBuilder(100);\n            Movie.FinishMovieBuffer(fbb, Movie.Pack(fbb, movie));\n\n            TestObjectAPI(Movie.GetRootAsMovie(fbb.DataBuffer));\n        }\n\n        private void AreEqual(Monster a, MonsterT b)\n        {\n            Assert.AreEqual(a.Hp, b.Hp);\n            Assert.AreEqual(a.Mana, b.Mana);\n            Assert.AreEqual(a.Name, b.Name);\n\n            var posA = a.Pos;\n            var posB = b.Pos;\n            if (posA != null)\n            {\n                Assert.AreEqual(posA.Value.X, posB.X);\n                Assert.AreEqual(posA.Value.Y, posB.Y);\n                Assert.AreEqual(posA.Value.Z, posB.Z);\n\n                Assert.AreEqual(posA.Value.Test1, posB.Test1);\n                Assert.AreEqual(posA.Value.Test2, posB.Test2);\n                var tA = posA.Value.Test3;\n                var tB = posB.Test3;\n                Assert.AreEqual(tA.A, tB.A);\n                Assert.AreEqual(tA.B, tB.B);\n            }\n\n            Assert.AreEqual(a.TestType, b.Test.Type);\n            if (a.TestType == Any.Monster)\n            {\n                var monster2A = a.Test<Monster>().Value;\n                var monster2B = b.Test.AsMonster();\n                Assert.AreEqual(monster2A.Name, monster2B.Name);\n            }\n\n            Assert.AreEqual(a.InventoryLength, b.Inventory.Count);\n            for (var i = 0; i < a.InventoryLength; ++i)\n            {\n                Assert.AreEqual(a.Inventory(i), b.Inventory[i]);\n            }\n\n            var inventoryArray = a.GetInventoryArray();\n            var inventoryArrayLength = inventoryArray == null ? 0 : inventoryArray.Length;\n            Assert.AreEqual(inventoryArrayLength, b.Inventory.Count);\n            for (var i = 0; i < inventoryArrayLength; ++i)\n            {\n                Assert.AreEqual(inventoryArray[i], b.Inventory[i]);\n            }\n\n            Assert.AreEqual(a.Test4Length, b.Test4.Count);\n            for (var i = 0; i < a.Test4Length; ++i)\n            {\n                var t4A = a.Test4(i);\n                var t4B = b.Test4[i];\n                Assert.AreEqual(t4A.Value.A, t4B.A);\n                Assert.AreEqual(t4A.Value.B, t4B.B);\n            }\n\n            Assert.AreEqual(a.TestarrayofstringLength, b.Testarrayofstring.Count);\n            for (var i = 0; i < a.TestarrayofstringLength; ++i)\n            {\n                Assert.AreEqual(a.Testarrayofstring(i), b.Testarrayofstring[i]);\n            }\n\n            Assert.AreEqual(a.Testbool, b.Testbool);\n\n            Assert.AreEqual(a.TestarrayofboolsLength, b.Testarrayofbools.Count);\n            for (var i = 0; i < a.TestarrayofboolsLength; ++i)\n            {\n                Assert.AreEqual(a.Testarrayofbools(i), b.Testarrayofbools[i]);\n            }\n\n            Assert.AreEqual(a.VectorOfLongsLength, b.VectorOfLongs.Count);\n            for (var i = 0; i < a.VectorOfLongsLength; ++i)\n            {\n                Assert.AreEqual(a.VectorOfLongs(i), b.VectorOfLongs[i]);\n            }\n\n            Assert.AreEqual(a.VectorOfDoublesLength, b.VectorOfDoubles.Count);\n            for (var i = 0; i < a.VectorOfDoublesLength; ++i)\n            {\n                Assert.AreEqual(a.VectorOfDoubles(i), b.VectorOfDoubles[i]);\n            }\n\n            Assert.AreEqual(a.VectorOfEnumsLength, b.VectorOfEnums.Count);\n            for (var i = 0; i < a.VectorOfEnumsLength; ++i)\n            {\n                Assert.AreEqual(a.VectorOfEnums(i), b.VectorOfEnums[i]);\n            }\n        }\n\n        private void AreEqual(Monster a, Monster b)\n        {\n            Assert.AreEqual(a.Hp, b.Hp);\n            Assert.AreEqual(a.Mana, b.Mana);\n            Assert.AreEqual(a.Name, b.Name);\n\n            var posA = a.Pos;\n            var posB = b.Pos;\n            if (posA != null)\n            {\n                Assert.AreEqual(posA.Value.X, posB.Value.X);\n                Assert.AreEqual(posA.Value.Y, posB.Value.Y);\n                Assert.AreEqual(posA.Value.Z, posB.Value.Z);\n\n                Assert.AreEqual(posA.Value.Test1, posB.Value.Test1);\n                Assert.AreEqual(posA.Value.Test2, posB.Value.Test2);\n                var tA = posA.Value.Test3;\n                var tB = posB.Value.Test3;\n                Assert.AreEqual(tA.A, tB.A);\n                Assert.AreEqual(tA.B, tB.B);\n            }\n\n            Assert.AreEqual(a.TestType, b.TestType);\n            if (a.TestType == Any.Monster)\n            {\n                var monster2A = a.Test<Monster>().Value;\n                var monster2B = b.Test<Monster>().Value;\n                Assert.AreEqual(monster2A.Name, monster2B.Name);\n            }\n\n            Assert.AreEqual(a.InventoryLength, b.InventoryLength);\n            for (var i = 0; i < a.InventoryLength; ++i)\n            {\n                Assert.AreEqual(a.Inventory(i), b.Inventory(i));\n            }\n\n            var inventoryArrayA = a.GetInventoryArray();\n            var inventoryArrayALength = inventoryArrayA == null ? 0 : inventoryArrayA.Length;\n            var inventoryArrayB = b.GetInventoryArray();\n            var inventoryArrayBLength = inventoryArrayB == null ? 0 : inventoryArrayB.Length;\n            Assert.AreEqual(inventoryArrayALength, inventoryArrayBLength);\n            for (var i = 0; i < inventoryArrayALength; ++i)\n            {\n                Assert.AreEqual(inventoryArrayA[i], inventoryArrayB[i]);\n            }\n\n            Assert.AreEqual(a.Test4Length, b.Test4Length);\n            for (var i = 0; i < a.Test4Length; ++i)\n            {\n                var t4A = a.Test4(i);\n                var t4B = b.Test4(i);\n                Assert.AreEqual(t4A.Value.A, t4B.Value.A);\n                Assert.AreEqual(t4A.Value.B, t4B.Value.B);\n            }\n\n            Assert.AreEqual(a.TestarrayofstringLength, b.TestarrayofstringLength);\n            for (var i = 0; i < a.TestarrayofstringLength; ++i)\n            {\n                Assert.AreEqual(a.Testarrayofstring(i), b.Testarrayofstring(i));\n            }\n\n            Assert.AreEqual(a.Testbool, b.Testbool);\n\n            Assert.AreEqual(a.TestarrayofboolsLength, b.TestarrayofboolsLength);\n            for (var i = 0; i < a.TestarrayofboolsLength; ++i)\n            {\n                Assert.AreEqual(a.Testarrayofbools(i), b.Testarrayofbools(i));\n            }\n\n            Assert.AreEqual(a.VectorOfLongsLength, b.VectorOfLongsLength);\n            for (var i = 0; i < a.VectorOfLongsLength; ++i)\n            {\n                Assert.AreEqual(a.VectorOfLongs(i), b.VectorOfLongs(i));\n            }\n\n            Assert.AreEqual(a.VectorOfDoublesLength, b.VectorOfDoublesLength);\n            for (var i = 0; i < a.VectorOfDoublesLength; ++i)\n            {\n                Assert.AreEqual(a.VectorOfDoubles(i), b.VectorOfDoubles(i));\n            }\n\n            Assert.AreEqual(a.VectorOfEnumsLength, b.VectorOfEnumsLength);\n            for (var i = 0; i < a.VectorOfEnumsLength; ++i)\n            {\n                Assert.AreEqual(a.VectorOfEnums(i), b.VectorOfEnums(i));\n            }\n        }\n\n        private void TestObjectAPI(Monster a)\n        {\n            var b = a.UnPack();\n            AreEqual(a, b);\n\n            var fbb = new FlatBufferBuilder(1);\n            fbb.Finish(Monster.Pack(fbb, b).Value);\n            var c = Monster.GetRootAsMonster(fbb.DataBuffer);\n            AreEqual(a, c);\n\n            var jsonText = b.SerializeToJson();\n            var d = MonsterT.DeserializeFromJson(jsonText);\n            AreEqual(a, d);\n\n            var fbBuffer = b.SerializeToBinary();\n            Assert.IsTrue(Monster.MonsterBufferHasIdentifier(new ByteBuffer(fbBuffer)));\n            var e = MonsterT.DeserializeFromBinary(fbBuffer);\n            AreEqual(a, e);\n        }\n\n        private void AreEqual(ArrayTable a, ArrayTableT b)\n        {\n            Assert.AreEqual(a.A.Value.A, b.A.A);\n\n            for (int i = 0; i < 15; ++i)\n            {\n                Assert.AreEqual(a.A.Value.B(i), b.A.B[i]);\n            }\n\n            Assert.AreEqual(a.A.Value.C, b.A.C);\n\n            for (int i = 0; i < 2; ++i)\n            {\n                var ad = a.A.Value.D(i);\n                var bd = b.A.D[i];\n\n                for (int j = 0; j < 2; ++j)\n                {\n                    Assert.AreEqual(ad.A(j), bd.A[j]);\n                }\n\n                Assert.AreEqual(ad.B, bd.B);\n\n                for (int j = 0; j < 2; ++j)\n                {\n                    Assert.AreEqual(ad.C(j), bd.C[j]);\n                }\n\n                for (int j = 0; j < 2; ++j)\n                {\n                    Assert.AreEqual(ad.D(j), bd.D[j]);\n                }\n            }\n\n            Assert.AreEqual(a.A.Value.E, b.A.E);\n\n            for (int i = 0; i < 2; ++i)\n            {\n                Assert.AreEqual(a.A.Value.F(i), b.A.F[i]);\n            }\n        }\n\n        private void AreEqual(ArrayTable a, ArrayTable b)\n        {\n            Assert.AreEqual(a.A.Value.A, b.A.Value.A);\n\n            for (int i = 0; i < 15; ++i)\n            {\n                Assert.AreEqual(a.A.Value.B(i), b.A.Value.B(i));\n            }\n\n            Assert.AreEqual(a.A.Value.C, b.A.Value.C);\n\n            for (int i = 0; i < 2; ++i)\n            {\n                var ad = a.A.Value.D(i);\n                var bd = b.A.Value.D(i);\n\n                for (int j = 0; j < 2; ++j)\n                {\n                    Assert.AreEqual(ad.A(j), bd.A(j));\n                }\n\n                Assert.AreEqual(ad.B, bd.B);\n\n                for (int j = 0; j < 2; ++j)\n                {\n                    Assert.AreEqual(ad.C(j), bd.C(j));\n                }\n\n                for (int j = 0; j < 2; ++j)\n                {\n                    Assert.AreEqual(ad.D(j), bd.D(j));\n                }\n            }\n\n            Assert.AreEqual(a.A.Value.E, b.A.Value.E);\n\n            for (int i = 0; i < 2; ++i)\n            {\n                Assert.AreEqual(a.A.Value.F(i), b.A.Value.F(i));\n            }\n        }\n\n        private void TestObjectAPI(ArrayTable a)\n        {\n            var b = a.UnPack();\n            AreEqual(a, b);\n\n            var fbb = new FlatBufferBuilder(1);\n            fbb.Finish(ArrayTable.Pack(fbb, b).Value);\n            var c = ArrayTable.GetRootAsArrayTable(fbb.DataBuffer);\n            AreEqual(a, c);\n\n            var jsonText = b.SerializeToJson();\n            var d = ArrayTableT.DeserializeFromJson(jsonText);\n            AreEqual(a, d);\n\n            var fbBuffer = b.SerializeToBinary();\n            Assert.IsTrue(ArrayTable.ArrayTableBufferHasIdentifier(new ByteBuffer(fbBuffer)));\n            var e = ArrayTableT.DeserializeFromBinary(fbBuffer);\n            AreEqual(a, e);\n        }\n\n        private void AreEqual(Movie a, MovieT b)\n        {\n            Assert.AreEqual(a.MainCharacterType, b.MainCharacter.Type);\n            Assert.AreEqual(a.MainCharacter<Rapunzel>().Value.HairLength, b.MainCharacter.AsRapunzel().HairLength);\n\n            Assert.AreEqual(a.CharactersLength, b.Characters.Count);\n            Assert.AreEqual(a.CharactersType(0), b.Characters[0].Type);\n            Assert.AreEqual(a.Characters<Attacker>(0).Value.SwordAttackDamage, b.Characters[0].AsMuLan().SwordAttackDamage);\n            Assert.AreEqual(a.CharactersType(1), b.Characters[1].Type);\n            Assert.AreEqual(a.Characters<BookReader>(1).Value.BooksRead, b.Characters[1].AsBelle().BooksRead);\n            Assert.AreEqual(a.CharactersType(2), b.Characters[2].Type);\n            Assert.AreEqual(a.CharactersAsString(2), b.Characters[2].AsOther());\n        }\n\n        private void AreEqual(Movie a, Movie b)\n        {\n            Assert.AreEqual(a.MainCharacterType, b.MainCharacterType);\n            Assert.AreEqual(a.MainCharacter<Rapunzel>().Value.HairLength, b.MainCharacter<Rapunzel>().Value.HairLength);\n\n            Assert.AreEqual(a.CharactersLength, b.CharactersLength);\n            Assert.AreEqual(a.CharactersType(0), b.CharactersType(0));\n            Assert.AreEqual(a.Characters<Attacker>(0).Value.SwordAttackDamage, b.Characters<Attacker>(0).Value.SwordAttackDamage);\n            Assert.AreEqual(a.CharactersType(1), b.CharactersType(1));\n            Assert.AreEqual(a.Characters<BookReader>(1).Value.BooksRead, b.Characters<BookReader>(1).Value.BooksRead);\n            Assert.AreEqual(a.CharactersType(2), b.CharactersType(2));\n            Assert.AreEqual(a.CharactersAsString(2), b.CharactersAsString(2));\n        }\n\n        private void TestObjectAPI(Movie a)\n        {\n            var b = a.UnPack();\n            AreEqual(a, b);\n\n            var fbb = new FlatBufferBuilder(1);\n            fbb.Finish(Movie.Pack(fbb, b).Value);\n            var c = Movie.GetRootAsMovie(fbb.DataBuffer);\n            AreEqual(a, c);\n\n            var jsonText = b.SerializeToJson();\n            var d = MovieT.DeserializeFromJson(jsonText);\n            AreEqual(a, d);\n\n            var fbBuffer = b.SerializeToBinary();\n            Assert.IsTrue(Movie.MovieBufferHasIdentifier(new ByteBuffer(fbBuffer)));\n            var e = MovieT.DeserializeFromBinary(fbBuffer);\n            AreEqual(a, e);\n        }\n\n        // For use in TestParallelAccess test case.\n        static private int _comparisons = 0;\n        static private int _failures = 0;\n        static private void KeepComparing(Monster mon, int count, float floatValue, double doubleValue)\n        {\n            int i = 0;\n            while (++i <= count)\n            {\n                Interlocked.Add(ref _comparisons, 1);\n                if(mon.Pos.Value.Test1 != doubleValue || mon.Pos.Value.Z != floatValue) {\n                    Interlocked.Add(ref _failures, 1);\n                }\n            }\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestParallelAccess() {\n            // Tests that reading from a flatbuffer over multiple threads is thread-safe in regard to double and float\n            // values, since they previously were non-thread safe\n            const float floatValue = 3.141592F;\n            const double doubleValue = 1.618033988;\n\n            var fbb = new FlatBufferBuilder(1);\n            var str = fbb.CreateString(\"ParallelTest\");\n            Monster.StartMonster(fbb);\n            Monster.AddPos(fbb, Vec3.CreateVec3(fbb, 1.0f, 2.0f, floatValue, doubleValue,\n                                                     Color.Green, (short)5, (sbyte)6));\n\n            Monster.AddName(fbb, str);\n            Monster.FinishMonsterBuffer(fbb, Monster.EndMonster(fbb));\n\n            var mon = Monster.GetRootAsMonster(fbb.DataBuffer);\n\n            var pos = mon.Pos.Value;\n            Assert.AreEqual(pos.Test1, doubleValue);\n            Assert.AreEqual(pos.Z, floatValue);\n\n            const int thread_count = 10;\n            const int reps = 1000000;\n\n            // Need to use raw Threads since Tasks are not supported in .NET 3.5\n            Thread[] threads = new Thread[thread_count];\n            for(int i = 0; i < thread_count; i++) {\n               threads[i] = new Thread(() => KeepComparing(mon, reps, floatValue, doubleValue));\n            }\n            for(int i = 0; i < thread_count; i++) {\n               threads[i].Start();\n            }\n            for(int i = 0; i < thread_count; i++) {\n               threads[i].Join();\n            }\n\n            // Make sure the threads actually did the comparisons.\n            Assert.AreEqual(thread_count * reps, _comparisons);\n\n            // Make sure we never read the values incorrectly.\n            Assert.AreEqual(0, _failures);\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestScalarOptional_EmptyBuffer() {\n            var fbb = new FlatBufferBuilder(1);\n            ScalarStuff.StartScalarStuff(fbb);\n            var offset = ScalarStuff.EndScalarStuff(fbb);\n            ScalarStuff.FinishScalarStuffBuffer(fbb, offset);\n\n            ScalarStuff scalarStuff = ScalarStuff.GetRootAsScalarStuff(fbb.DataBuffer);\n            Assert.AreEqual((sbyte)0, scalarStuff.JustI8);\n            Assert.AreEqual(null, scalarStuff.MaybeI8);\n            Assert.AreEqual((sbyte)42, scalarStuff.DefaultI8);\n            Assert.AreEqual((byte)0, scalarStuff.JustU8);\n            Assert.AreEqual(null, scalarStuff.MaybeU8);\n            Assert.AreEqual((byte)42, scalarStuff.DefaultU8);\n\n            Assert.AreEqual((short)0, scalarStuff.JustI16);\n            Assert.AreEqual(null, scalarStuff.MaybeI16);\n            Assert.AreEqual((short)42, scalarStuff.DefaultI16);\n            Assert.AreEqual((ushort)0, scalarStuff.JustU16);\n            Assert.AreEqual(null, scalarStuff.MaybeU16);\n            Assert.AreEqual((ushort)42, scalarStuff.DefaultU16);\n\n            Assert.AreEqual((int)0, scalarStuff.JustI32);\n            Assert.AreEqual(null, scalarStuff.MaybeI32);\n            Assert.AreEqual((int)42, scalarStuff.DefaultI32);\n            Assert.AreEqual((uint)0, scalarStuff.JustU32);\n            Assert.AreEqual(null, scalarStuff.MaybeU32);\n            Assert.AreEqual((uint)42, scalarStuff.DefaultU32);\n\n            Assert.AreEqual((long)0, scalarStuff.JustI64);\n            Assert.AreEqual(null, scalarStuff.MaybeI64);\n            Assert.AreEqual((long)42, scalarStuff.DefaultI64);\n            Assert.AreEqual((ulong)0, scalarStuff.JustU64);\n            Assert.AreEqual(null, scalarStuff.MaybeU64);\n            Assert.AreEqual((ulong)42, scalarStuff.DefaultU64);\n\n            Assert.AreEqual((float)0.0F, scalarStuff.JustF32);\n            Assert.AreEqual(null, scalarStuff.MaybeF32);\n            Assert.AreEqual((float)42.0F, scalarStuff.DefaultF32);\n\n            Assert.AreEqual((double)0.0, scalarStuff.JustF64);\n            Assert.AreEqual(null, scalarStuff.MaybeF64);\n            Assert.AreEqual((double)42.0, scalarStuff.DefaultF64);\n\n            Assert.AreEqual(false, scalarStuff.JustBool);\n            Assert.AreEqual(null, scalarStuff.MaybeBool);\n            Assert.AreEqual(true, scalarStuff.DefaultBool);\n\n            Assert.AreEqual(OptionalByte.None, scalarStuff.JustEnum);\n            Assert.AreEqual(null, scalarStuff.MaybeEnum);\n            Assert.AreEqual(OptionalByte.One, scalarStuff.DefaultEnum);\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestScalarOptional_Construction() {\n            var fbb = new FlatBufferBuilder(1);\n            ScalarStuff.StartScalarStuff(fbb);\n            ScalarStuff.AddJustI8(fbb, 5);\n            ScalarStuff.AddMaybeI8(fbb, 5);\n            ScalarStuff.AddDefaultI8(fbb, 5);\n            ScalarStuff.AddJustU8(fbb, 6);\n            ScalarStuff.AddMaybeU8(fbb, 6);\n            ScalarStuff.AddDefaultU8(fbb, 6);\n\n            ScalarStuff.AddJustI16(fbb, 7);\n            ScalarStuff.AddMaybeI16(fbb, 7);\n            ScalarStuff.AddDefaultI16(fbb, 7);\n            ScalarStuff.AddJustU16(fbb, 8);\n            ScalarStuff.AddMaybeU16(fbb, 8);\n            ScalarStuff.AddDefaultU16(fbb, 8);\n\n            ScalarStuff.AddJustI32(fbb, 9);\n            ScalarStuff.AddMaybeI32(fbb, 9);\n            ScalarStuff.AddDefaultI32(fbb, 9);\n            ScalarStuff.AddJustU32(fbb, 10);\n            ScalarStuff.AddMaybeU32(fbb, 10);\n            ScalarStuff.AddDefaultU32(fbb, 10);\n\n            ScalarStuff.AddJustI64(fbb, 11);\n            ScalarStuff.AddMaybeI64(fbb, 11);\n            ScalarStuff.AddDefaultI64(fbb, 11);\n            ScalarStuff.AddJustU64(fbb, 12);\n            ScalarStuff.AddMaybeU64(fbb, 12);\n            ScalarStuff.AddDefaultU64(fbb, 12);\n\n            ScalarStuff.AddJustF32(fbb, 13.0f);\n            ScalarStuff.AddMaybeF32(fbb, 13.0f);\n            ScalarStuff.AddDefaultF32(fbb, 13.0f);\n            ScalarStuff.AddJustF64(fbb, 14.0);\n            ScalarStuff.AddMaybeF64(fbb, 14.0);\n            ScalarStuff.AddDefaultF64(fbb, 14.0);\n\n            ScalarStuff.AddJustBool(fbb, true);\n            ScalarStuff.AddMaybeBool(fbb, true);\n            ScalarStuff.AddDefaultBool(fbb, false); // note this is the opposite\n\n            ScalarStuff.AddJustEnum(fbb, OptionalByte.Two);\n            ScalarStuff.AddMaybeEnum(fbb, OptionalByte.Two);\n            ScalarStuff.AddDefaultEnum(fbb, OptionalByte.Two);\n\n            var offset = ScalarStuff.EndScalarStuff(fbb);\n            ScalarStuff.FinishScalarStuffBuffer(fbb, offset);\n\n            ScalarStuff scalarStuff = ScalarStuff.GetRootAsScalarStuff(fbb.DataBuffer);\n            Assert.AreEqual((sbyte)5, scalarStuff.JustI8);\n            Assert.AreEqual((sbyte)5, scalarStuff.MaybeI8);\n            Assert.AreEqual((sbyte)5, scalarStuff.DefaultI8);\n            Assert.AreEqual((byte)6, scalarStuff.JustU8);\n            Assert.AreEqual((byte)6, scalarStuff.MaybeU8);\n            Assert.AreEqual((byte)6, scalarStuff.DefaultU8);\n\n            Assert.AreEqual((short)7, scalarStuff.JustI16);\n            Assert.AreEqual((short)7, scalarStuff.MaybeI16);\n            Assert.AreEqual((short)7, scalarStuff.DefaultI16);\n            Assert.AreEqual((ushort)8, scalarStuff.JustU16);\n            Assert.AreEqual((ushort)8, scalarStuff.MaybeU16);\n            Assert.AreEqual((ushort)8, scalarStuff.DefaultU16);\n\n            Assert.AreEqual((int)9, scalarStuff.JustI32);\n            Assert.AreEqual((int)9, scalarStuff.MaybeI32);\n            Assert.AreEqual((int)9, scalarStuff.DefaultI32);\n            Assert.AreEqual((uint)10, scalarStuff.JustU32);\n            Assert.AreEqual((uint)10, scalarStuff.MaybeU32);\n            Assert.AreEqual((uint)10, scalarStuff.DefaultU32);\n\n            Assert.AreEqual((long)11, scalarStuff.JustI64);\n            Assert.AreEqual((long)11, scalarStuff.MaybeI64);\n            Assert.AreEqual((long)11, scalarStuff.DefaultI64);\n            Assert.AreEqual((ulong)12, scalarStuff.JustU64);\n            Assert.AreEqual((ulong)12, scalarStuff.MaybeU64);\n            Assert.AreEqual((ulong)12, scalarStuff.DefaultU64);\n\n            Assert.AreEqual((float)13.0F, scalarStuff.JustF32);\n            Assert.AreEqual((float)13.0F, scalarStuff.MaybeF32);\n            Assert.AreEqual((float)13.0F, scalarStuff.DefaultF32);\n\n            Assert.AreEqual((double)14.0, scalarStuff.JustF64);\n            Assert.AreEqual((double)14.0, scalarStuff.MaybeF64);\n            Assert.AreEqual((double)14.0, scalarStuff.DefaultF64);\n\n            Assert.AreEqual(true, scalarStuff.JustBool);\n            Assert.AreEqual(true, scalarStuff.MaybeBool);\n            Assert.AreEqual(false, scalarStuff.DefaultBool);\n\n            Assert.AreEqual(OptionalByte.Two, scalarStuff.JustEnum);\n            Assert.AreEqual(OptionalByte.Two, scalarStuff.MaybeEnum);\n            Assert.AreEqual(OptionalByte.Two, scalarStuff.DefaultEnum);\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestScalarOptional_Construction_CreatorMethod() {\n            var fbb = new FlatBufferBuilder(1);\n\n            var offset = ScalarStuff.CreateScalarStuff(fbb,5,5,5,6,6,6,7,7,7,\n                8,8,8,9,9,9,10,10,10,11,11,11,12,12,12,13.0f,13.0f,13.0f,14.0,\n                14.0,14.0,true,true,false,OptionalByte.Two,OptionalByte.Two,\n                OptionalByte.Two);\n            ScalarStuff.FinishScalarStuffBuffer(fbb, offset);\n\n            ScalarStuff scalarStuff = ScalarStuff.GetRootAsScalarStuff(fbb.DataBuffer);\n            Assert.AreEqual((sbyte)5, scalarStuff.JustI8);\n            Assert.AreEqual((sbyte)5, scalarStuff.MaybeI8);\n            Assert.AreEqual((sbyte)5, scalarStuff.DefaultI8);\n            Assert.AreEqual((byte)6, scalarStuff.JustU8);\n            Assert.AreEqual((byte)6, scalarStuff.MaybeU8);\n            Assert.AreEqual((byte)6, scalarStuff.DefaultU8);\n\n            Assert.AreEqual((short)7, scalarStuff.JustI16);\n            Assert.AreEqual((short)7, scalarStuff.MaybeI16);\n            Assert.AreEqual((short)7, scalarStuff.DefaultI16);\n            Assert.AreEqual((ushort)8, scalarStuff.JustU16);\n            Assert.AreEqual((ushort)8, scalarStuff.MaybeU16);\n            Assert.AreEqual((ushort)8, scalarStuff.DefaultU16);\n\n            Assert.AreEqual((int)9, scalarStuff.JustI32);\n            Assert.AreEqual((int)9, scalarStuff.MaybeI32);\n            Assert.AreEqual((int)9, scalarStuff.DefaultI32);\n            Assert.AreEqual((uint)10, scalarStuff.JustU32);\n            Assert.AreEqual((uint)10, scalarStuff.MaybeU32);\n            Assert.AreEqual((uint)10, scalarStuff.DefaultU32);\n\n            Assert.AreEqual((long)11, scalarStuff.JustI64);\n            Assert.AreEqual((long)11, scalarStuff.MaybeI64);\n            Assert.AreEqual((long)11, scalarStuff.DefaultI64);\n            Assert.AreEqual((ulong)12, scalarStuff.JustU64);\n            Assert.AreEqual((ulong)12, scalarStuff.MaybeU64);\n            Assert.AreEqual((ulong)12, scalarStuff.DefaultU64);\n\n            Assert.AreEqual((float)13.0F, scalarStuff.JustF32);\n            Assert.AreEqual((float)13.0F, scalarStuff.MaybeF32);\n            Assert.AreEqual((float)13.0F, scalarStuff.DefaultF32);\n\n            Assert.AreEqual((double)14.0, scalarStuff.JustF64);\n            Assert.AreEqual((double)14.0, scalarStuff.MaybeF64);\n            Assert.AreEqual((double)14.0, scalarStuff.DefaultF64);\n\n            Assert.AreEqual(true, scalarStuff.JustBool);\n            Assert.AreEqual(true, scalarStuff.MaybeBool);\n            Assert.AreEqual(false, scalarStuff.DefaultBool);\n\n            Assert.AreEqual(OptionalByte.Two, scalarStuff.JustEnum);\n            Assert.AreEqual(OptionalByte.Two, scalarStuff.MaybeEnum);\n            Assert.AreEqual(OptionalByte.Two, scalarStuff.DefaultEnum);\n        }\n\n\n        [FlatBuffersTestMethod]\n        public void TestKeywordEscaping() {\n            Assert.AreEqual((int)KeywordTest.@public.NONE, 0);\n\n            Assert.AreEqual((int)KeywordTest.ABC.@void, 0);\n            Assert.AreEqual((int)KeywordTest.ABC.where, 1);\n            Assert.AreEqual((int)KeywordTest.ABC.@stackalloc, 2);\n\n            var fbb = new FlatBufferBuilder(1);\n            var offset = KeywordsInTable.CreateKeywordsInTable(\n                fbb, KeywordTest.ABC.@stackalloc, KeywordTest.@public.NONE);\n            fbb.Finish(offset.Value);\n \n            KeywordsInTable keywordsInTable = \n                KeywordsInTable.GetRootAsKeywordsInTable(fbb.DataBuffer);\n\n            Assert.AreEqual(keywordsInTable.Is, KeywordTest.ABC.@stackalloc);\n            Assert.AreEqual(keywordsInTable.Private, KeywordTest.@public.NONE);\n        }\n\n\n        [FlatBuffersTestMethod]\n        public void AddOptionalEnum_WhenPassNull_ShouldWorkProperly() {\n          var fbb = new FlatBufferBuilder(1);\n          ScalarStuff.StartScalarStuff(fbb);\n          ScalarStuff.AddMaybeEnum(fbb, null);\n          var offset = ScalarStuff.EndScalarStuff(fbb);\n          ScalarStuff.FinishScalarStuffBuffer(fbb, offset);\n          \n          ScalarStuff scalarStuff = ScalarStuff.GetRootAsScalarStuff(fbb.DataBuffer);\n          Assert.AreEqual(null, scalarStuff.MaybeEnum);\n        }\n\n\n        [FlatBuffersTestMethod]\n        public void SortKey_WithDefaultedValue_IsFindable() {\n            // This checks if using the `key` attribute that includes the\n            // default value (e.g., 0) is still searchable. This is a regression\n            // test for https://github.com/google/flatbuffers/issues/7380.\n            var fbb = new FlatBufferBuilder(1);\n\n            // Create a vector of Stat objects, with Count being the key. \n            var stat_offsets = new Offset<Stat>[4];\n            for(ushort i = 0; i < stat_offsets.Length; i++) {\n                Stat.StartStat(fbb);\n                Stat.AddCount(fbb, i);\n                stat_offsets[stat_offsets.Length - 1 - i] = Stat.EndStat(fbb);\n            }\n\n            // Ensure the sort works.\n            var sort = Stat.CreateSortedVectorOfStat(fbb, stat_offsets);\n\n            // Create the monster with the sorted vector of Stat objects.\n            var str = fbb.CreateString(\"MyMonster\");\n            Monster.StartMonster(fbb);\n            Monster.AddName(fbb, str);\n            Monster.AddScalarKeySortedTables(fbb, sort);\n            fbb.Finish(Monster.EndMonster(fbb).Value);\n\n            // Get the monster.\n            var monster = Monster.GetRootAsMonster(fbb.DataBuffer);\n\n            // Ensure each key is findable.\n            for(ushort i =0 ; i < stat_offsets.Length; i++) {\n                Assert.IsTrue(monster.ScalarKeySortedTablesByKey(i) != null);\n                Assert.AreEqual(monster.ScalarKeySortedTablesByKey(i).Value.Count, i);\n            }\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestVerifyingUnions()\n        {\n            var fbb = new FlatBufferBuilder(1);\n            var name_inner = fbb.CreateString(\"inner\");\n            var name_outer = fbb.CreateString(\"outer\");\n            Monster.StartMonster(fbb);\n            Monster.AddName(fbb, name_inner);\n            var monster_inner = Monster.EndMonster(fbb);\n            Monster.StartMonster(fbb);\n            Monster.AddName(fbb, name_outer);\n            Monster.AddTest(fbb, monster_inner.Value);\n            Monster.AddTestType(fbb, Any.Monster);\n            var monster_outer = Monster.EndMonster(fbb);\n            fbb.Finish(monster_outer.Value);\n            var bytes = fbb.SizedByteArray();\n            var bytes_to_corrupt_inner_name = fbb.SizedByteArray();\n            var bytes_to_corrupt_outer_name = fbb.SizedByteArray();\n\n            bytes_to_corrupt_inner_name[bytes.Length - name_inner.Value] = 0xFF;\n            bytes_to_corrupt_outer_name[bytes.Length - name_outer.Value] = 0xFF;\n            var valid = Monster.VerifyMonster(new ByteBuffer(bytes));\n            var valid_after_inner_corrupt = Monster.VerifyMonster(new ByteBuffer(bytes_to_corrupt_inner_name));\n            var valid_after_outer_corrupt = Monster.VerifyMonster(new ByteBuffer(bytes_to_corrupt_outer_name));\n\n            Assert.IsTrue(valid);\n            Assert.IsFalse(valid_after_inner_corrupt);\n            Assert.IsFalse(valid_after_outer_corrupt);\n        }\n    }\n}\n"
  },
  {
    "path": "tests/FlatBuffers.Test/FlatBuffersFixedLengthArrayTests.cs",
    "content": "/*\n * Copyright 2025 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nusing System;\nusing System.Linq;\nusing MyGame.Example;\n\nnamespace Google.FlatBuffers.Test\n{\n    [FlatBuffersTestClass]\n    public class FlatBuffersFixedLengthArrayTests\n    {\n        [FlatBuffersTestMethod]\n        public void FixedLengthArray_LengthConstantsMatchSchema_ReturnTrue()\n        {\n            const int nestedALength = NestedStruct.ALength;\n            const int nestedCLength = NestedStruct.CLength;\n            const int nestedDLength = NestedStruct.DLength;\n            const int arrayBLength = ArrayStruct.BLength;\n            const int arrayFLength = ArrayStruct.FLength;\n\n            Assert.AreEqual(2, nestedALength);\n            Assert.AreEqual(2, nestedCLength);\n            Assert.AreEqual(2, nestedDLength);\n            Assert.AreEqual(15, arrayBLength);\n            Assert.AreEqual(2, arrayFLength);\n        }\n\n#if ENABLE_SPAN_T\n        [FlatBuffersTestMethod]\n        public void FixedLengthArray_GetBytesSpanLengthIsCorrect_ReturnTrue()\n        {\n            var builder = new FlatBufferBuilder(1024);\n            var ints = new int[] { 1, 2 };\n            var enumB = TestEnum.A;\n            var enums = new TestEnum[] { TestEnum.B, TestEnum.C };\n            var longs = new long[] { 10L, 20L };\n            \n            var structOffset = NestedStruct.CreateNestedStruct(builder, ints, enumB, enums, longs);\n            builder.Finish(structOffset.Value);\n            \n            var bb = builder.DataBuffer;\n            var nestedStruct = new NestedStruct();\n            nestedStruct.__assign(bb.Length - builder.Offset, bb);\n\n            Span<int> intSpan = nestedStruct.GetABytes();\n            Span<TestEnum> enumSpan = nestedStruct.GetCBytes();\n            Span<long> longSpan = nestedStruct.GetDBytes();\n\n            Assert.AreEqual(intSpan.Length, NestedStruct.ALength);\n            Assert.AreEqual(enumSpan.Length, NestedStruct.CLength);\n            Assert.AreEqual(longSpan.Length, NestedStruct.DLength);          \n        }\n#endif\n\n#if !ENABLE_SPAN_T\n        [FlatBuffersTestMethod]\n        public void FixedLengthArray_GetBytesArraySegmentLengthIsCorrect_ReturnTrue()\n        {\n            var builder = new FlatBufferBuilder(1024);\n            var ints = new int[] { 1, 2 };\n            var enumB = TestEnum.A;\n            var enums = new TestEnum[] { TestEnum.B, TestEnum.C };\n            var longs = new long[] { 10L, 20L };\n\n            var structOffset = NestedStruct.CreateNestedStruct(builder, ints, enumB, enums, longs);\n            builder.Finish(structOffset.Value);\n\n            var buffer = builder.DataBuffer;\n            var nestedStruct = new NestedStruct();\n            nestedStruct.__assign(buffer.Length - builder.Offset, buffer);\n\n            Assert.IsTrue(nestedStruct.GetABytes().HasValue);\n            Assert.IsTrue(nestedStruct.GetCBytes().HasValue);\n            Assert.IsTrue(nestedStruct.GetDBytes().HasValue);\n\n            ArraySegment<byte> intSegment = nestedStruct.GetABytes().Value;\n            ArraySegment<byte> enumSegment = nestedStruct.GetCBytes().Value;\n            ArraySegment<byte> longSegment = nestedStruct.GetDBytes().Value;\n\n            Assert.AreEqual(intSegment.Count, NestedStruct.ALength * sizeof(int));\n            Assert.AreEqual(enumSegment.Count, NestedStruct.CLength * sizeof(sbyte));\n            Assert.AreEqual(longSegment.Count, NestedStruct.DLength * sizeof(long));\n        }\n#endif\n\n#if ENABLE_SPAN_T\n        [FlatBuffersTestMethod]\n        public void FixedLengthArray_GetBytesSpanEquality_ReturnTrue()\n        {\n            var builder = new FlatBufferBuilder(1024);\n\n            var floatA = 3.14f;\n            var intArray = Enumerable.Range(1, 15).ToArray();\n            var byteC = (sbyte)42;\n            var intE = 999;\n            var longArray = new long[] { 5000L, 6000L };\n\n            var nestedInts = new int[2, 2] { { 10, 20 }, { 30, 40 } };\n            var nestedEnumB = new TestEnum[] { TestEnum.A, TestEnum.B };\n            var nestedEnums = new TestEnum[2, 2] { { TestEnum.A, TestEnum.B }, { TestEnum.C, TestEnum.A } };\n            var nestedLongs = new long[2, 2] { { 100L, 200L }, { 300L, 400L } };\n\n            var structOffset = ArrayStruct.CreateArrayStruct(builder, floatA, intArray, byteC,\n                nestedInts, nestedEnumB, nestedEnums, nestedLongs, intE, longArray);\n\n            ArrayTable.StartArrayTable(builder);\n            ArrayTable.AddA(builder, structOffset);\n            var rootTable = ArrayTable.EndArrayTable(builder);\n            builder.Finish(rootTable.Value);\n\n            var finishedBytes = builder.SizedByteArray();\n            ByteBuffer bb = new ByteBuffer(finishedBytes);\n            ArrayTable arrayTable = ArrayTable.GetRootAsArrayTable(bb);\n            ArrayStruct arrayStruct = arrayTable.A.Value;\n\n            Assert.AreEqual(byteC, arrayStruct.C);\n            Assert.AreEqual(intE, arrayStruct.E);\n\n            Assert.IsTrue(arrayStruct.GetBBytes().SequenceEqual(intArray));\n            Assert.IsTrue(arrayStruct.GetFBytes().SequenceEqual(longArray));\n            \n            // Test nested struct arrays\n            for (int i = 0; i < 2; i++)\n            {\n                var nestedStruct = arrayStruct.D(i);\n                \n                var nestedIntSpan = nestedStruct.GetABytes();\n                var expectedNestedInts = new int[] { nestedInts[i, 0], nestedInts[i, 1] };\n                Assert.IsTrue(nestedIntSpan.SequenceEqual(expectedNestedInts));\n                \n                Assert.AreEqual(nestedEnumB[i], nestedStruct.B);\n                \n                var nestedEnumSpan = nestedStruct.GetCBytes();\n                var expectedNestedEnums = new TestEnum[] { nestedEnums[i, 0], nestedEnums[i, 1] };\n                Assert.IsTrue(nestedEnumSpan.SequenceEqual(expectedNestedEnums));\n                \n                var nestedLongSpan = nestedStruct.GetDBytes();\n                var expectedNestedLongs = new long[] { nestedLongs[i, 0], nestedLongs[i, 1] };\n                Assert.IsTrue(nestedLongSpan.SequenceEqual(expectedNestedLongs));\n            }\n        }\n#endif  \n\n#if !ENABLE_SPAN_T\n        [FlatBuffersTestMethod] \n        public void FixedLengthArray_GetBytesArraySegmentEquality_ReturnTrue()\n        {\n            var builder = new FlatBufferBuilder(1024);\n            \n            var floatA = 3.14f;\n            var intArray = Enumerable.Range(1, 15).ToArray();\n            var byteC = (sbyte)42;\n            var intE = 999;\n            var longArray = new long[] { 5000L, 6000L };\n            \n            var nestedInts = new int[2, 2] { { 10, 20 }, { 30, 40 } };\n            var nestedEnumB = new TestEnum[] { TestEnum.A, TestEnum.B };\n            var nestedEnums = new TestEnum[2, 2] { { TestEnum.A, TestEnum.B }, { TestEnum.C, TestEnum.A } };\n            var nestedLongs = new long[2, 2] { { 100L, 200L }, { 300L, 400L } };\n            \n            var structOffset = ArrayStruct.CreateArrayStruct(builder, floatA, intArray, byteC, \n                nestedInts, nestedEnumB, nestedEnums, nestedLongs, intE, longArray);\n\n            ArrayTable.StartArrayTable(builder);\n            ArrayTable.AddA(builder, structOffset);\n            var rootTable = ArrayTable.EndArrayTable(builder);\n            builder.Finish(rootTable.Value);\n\n            var finishedBytes = builder.SizedByteArray();\n            ByteBuffer bb = new ByteBuffer(finishedBytes);\n            ArrayTable arrayTable = ArrayTable.GetRootAsArrayTable(bb);\n            ArrayStruct arrayStruct = arrayTable.A.Value;\n\n            // Test that we can read basic scalars correctly\n            Assert.AreEqual(byteC, arrayStruct.C);\n            Assert.AreEqual(intE, arrayStruct.E);\n            \n            Assert.IsTrue(arrayStruct.GetBBytes().HasValue);\n            var intSegment = arrayStruct.GetBBytes().Value;\n            for (int i = 0, offset = 0; i < intArray.Length; i++, offset += sizeof(int))\n            {\n                var segmentValue = BitConverter.ToInt32(intSegment.Array,\n                    intSegment.Offset + offset);\n                Assert.AreEqual(intArray[i], segmentValue);\n            }\n            \n            Assert.IsTrue(arrayStruct.GetFBytes().HasValue);\n            var longSegment = arrayStruct.GetFBytes().Value;\n            for (int i = 0, offset = 0; i < longArray.Length; i++, offset += sizeof(long))\n            {\n                var segmentValue = BitConverter.ToInt64(longSegment.Array,\n                    longSegment.Offset + offset);\n                Assert.AreEqual(longArray[i], segmentValue);\n            }\n            \n            // Test nested struct arrays\n            for (int i = 0; i < 2; i++)\n            {\n                var nestedStruct = arrayStruct.D(i);\n                \n                Assert.IsTrue(nestedStruct.GetABytes().HasValue);\n                var nestedIntSegment = nestedStruct.GetABytes().Value;\n                var expectedNestedInts = new int[] { nestedInts[i, 0], nestedInts[i, 1] };\n                for (int ii = 0, offset = 0; ii < NestedStruct.ALength; ii++, offset += sizeof(int))\n                {\n                    var segmentValue = BitConverter.ToInt32(nestedIntSegment.Array,\n                        nestedIntSegment.Offset + offset);\n                    Assert.AreEqual(expectedNestedInts[ii], segmentValue);\n                }\n\n                Assert.AreEqual(nestedEnumB[i], nestedStruct.B);\n                \n                Assert.IsTrue(nestedStruct.GetCBytes().HasValue);\n                var nestedEnumSegment = nestedStruct.GetCBytes().Value;\n                var expectedNestedEnums = new TestEnum[] { nestedEnums[i, 0], nestedEnums[i, 1] };\n                for (int ii = 0, offset = 0; ii < NestedStruct.CLength; ii++, offset += sizeof(sbyte))\n                {\n                    var segmentValue = (TestEnum)nestedEnumSegment.Array[nestedEnumSegment.Offset + offset];\n                    Assert.AreEqual(expectedNestedEnums[ii], segmentValue);\n                }\n                \n                Assert.IsTrue(nestedStruct.GetDBytes().HasValue);\n                var nestedLongSegment = nestedStruct.GetDBytes().Value;\n                var expectedNestedLongs = new long[] { nestedLongs[i, 0], nestedLongs[i, 1] };\n                for (int ii = 0, offset = 0; ii < NestedStruct.DLength; ii++, offset += sizeof(long))\n                {\n                    var segmentValue = BitConverter.ToInt64(nestedLongSegment.Array,\n                        nestedLongSegment.Offset + offset);\n                    Assert.AreEqual(expectedNestedLongs[ii], segmentValue);\n                }\n            }\n        }\n#endif\n    }\n}\n"
  },
  {
    "path": "tests/FlatBuffers.Test/FlatBuffersFuzzTests.cs",
    "content": "/*\n * Copyright 2015 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nusing System;\nusing Google.FlatBuffers;\n\nnamespace Google.FlatBuffers.Test\n{\n    [FlatBuffersTestClass]\n    public class FlatBuffersFuzzTests\n    {\n        private readonly Lcg _lcg = new Lcg();\n\n        [FlatBuffersTestMethod]\n        public void TestObjects()\n        {\n            CheckObjects(11, 100);\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestNumbers()\n        {\n            var builder = new FlatBufferBuilder(1);\n            Assert.ArrayEqual(new byte[] { 0 }, builder.DataBuffer.ToFullArray());\n            builder.AddBool(true);\n            Assert.ArrayEqual(new byte[] { 1 }, builder.DataBuffer.ToFullArray());\n            builder.AddSbyte(-127);\n            Assert.ArrayEqual(new byte[] { 129, 1 }, builder.DataBuffer.ToFullArray());\n            builder.AddByte(255);\n            Assert.ArrayEqual(new byte[] { 0, 255, 129, 1 }, builder.DataBuffer.ToFullArray()); // First pad\n            builder.AddShort(-32222);\n            Assert.ArrayEqual(new byte[] { 0, 0, 0x22, 0x82, 0, 255, 129, 1 }, builder.DataBuffer.ToFullArray()); // Second pad\n            builder.AddUshort(0xFEEE);\n            Assert.ArrayEqual(new byte[] { 0xEE, 0xFE, 0x22, 0x82, 0, 255, 129, 1 }, builder.DataBuffer.ToFullArray()); // no pad\n            builder.AddInt(-53687092);\n            Assert.ArrayEqual(new byte[] { 0, 0, 0, 0, 204, 204, 204, 252, 0xEE, 0xFE, 0x22, 0x82, 0, 255, 129, 1 }, builder.DataBuffer.ToFullArray()); // third pad\n            builder.AddUint(0x98765432);\n            Assert.ArrayEqual(new byte[] { 0x32, 0x54, 0x76, 0x98, 204, 204, 204, 252, 0xEE, 0xFE, 0x22, 0x82, 0, 255, 129, 1 }, builder.DataBuffer.ToFullArray()); // no pad\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestNumbers64()\n        {\n            var builder = new FlatBufferBuilder(1);\n            builder.AddUlong(0x1122334455667788);\n            Assert.ArrayEqual(new byte[] { 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11 }, builder.DataBuffer.ToFullArray());\n\n            builder = new FlatBufferBuilder(1);\n            builder.AddLong(0x1122334455667788);\n            Assert.ArrayEqual(new byte[] { 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11 }, builder.DataBuffer.ToFullArray());\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestVector_1xUInt8()\n        {\n            var builder = new FlatBufferBuilder(1);\n            builder.StartVector(sizeof(byte), 1, 1);\n            Assert.ArrayEqual(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, builder.DataBuffer.ToFullArray());\n            builder.AddByte(1);\n            Assert.ArrayEqual(new byte[] { 0, 0, 0, 0, 1, 0, 0, 0 }, builder.DataBuffer.ToFullArray());\n            builder.EndVector();\n            Assert.ArrayEqual(new byte[] { 1, 0, 0, 0, 1, 0, 0, 0 }, builder.DataBuffer.ToFullArray());\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestVector_2xUint8()\n        {\n            var builder = new FlatBufferBuilder(1);\n            builder.StartVector(sizeof(byte), 2, 1);\n            Assert.ArrayEqual(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, builder.DataBuffer.ToFullArray());\n            builder.AddByte(1);\n            Assert.ArrayEqual(new byte[] { 0, 0, 0, 0, 0, 1, 0, 0 }, builder.DataBuffer.ToFullArray());\n            builder.AddByte(2);\n            Assert.ArrayEqual(new byte[] { 0, 0, 0, 0, 2, 1, 0, 0 }, builder.DataBuffer.ToFullArray());\n            builder.EndVector();\n            Assert.ArrayEqual(new byte[] { 2, 0, 0, 0, 2, 1, 0, 0 }, builder.DataBuffer.ToFullArray());\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestVector_1xUInt16()\n        {\n            var builder = new FlatBufferBuilder(1);\n            builder.StartVector(sizeof(ushort), 1, 1);\n            Assert.ArrayEqual(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, builder.DataBuffer.ToFullArray());\n            builder.AddUshort(1);\n            Assert.ArrayEqual(new byte[] { 0, 0, 0, 0, 1, 0, 0, 0 }, builder.DataBuffer.ToFullArray());\n            builder.EndVector();\n            Assert.ArrayEqual(new byte[] { 1, 0, 0, 0, 1, 0, 0, 0 }, builder.DataBuffer.ToFullArray());\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestVector_2xUInt16()\n        {\n            var builder = new FlatBufferBuilder(1);\n            builder.StartVector(sizeof(ushort), 2, 1);\n            Assert.ArrayEqual(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, builder.DataBuffer.ToFullArray());\n            builder.AddUshort(0xABCD);\n            Assert.ArrayEqual(new byte[] { 0, 0, 0, 0, 0, 0, 0xCD, 0xAB }, builder.DataBuffer.ToFullArray());\n            builder.AddUshort(0xDCBA);\n            Assert.ArrayEqual(new byte[] { 0, 0, 0, 0, 0xBA, 0xDC, 0xCD, 0xAB }, builder.DataBuffer.ToFullArray());\n            builder.EndVector();\n            Assert.ArrayEqual(new byte[] { 2, 0, 0, 0, 0xBA, 0xDC, 0xCD, 0xAB }, builder.DataBuffer.ToFullArray());\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestCreateAsciiString()\n        {\n            var builder = new FlatBufferBuilder(1);\n            builder.CreateString(\"foo\");\n            Assert.ArrayEqual(new byte[] { 3, 0, 0, 0, (byte)'f', (byte)'o', (byte)'o', 0 }, builder.DataBuffer.ToFullArray());\n\n            builder.CreateString(\"moop\");\n            Assert.ArrayEqual(new byte[]\n            {\n                0, 0, 0, 0,\n                0, 0, 0, 0,\n                0, 0, 0, 0,  // Padding to 32 bytes\n                4, 0, 0, 0,\n                (byte)'m', (byte)'o', (byte)'o', (byte)'p',\n                0, 0, 0, 0, // zero terminator with 3 byte pad\n                3, 0, 0, 0,\n                (byte)'f', (byte)'o', (byte)'o', 0\n            }, builder.DataBuffer.ToFullArray());\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestCreateSharedAsciiString()\n        {\n            var builder = new FlatBufferBuilder(1);\n            builder.CreateSharedString(\"foo\");\n            Assert.ArrayEqual(new byte[] { 3, 0, 0, 0, (byte)'f', (byte)'o', (byte)'o', 0 }, builder.DataBuffer.ToFullArray());\n\n            builder.CreateSharedString(\"foo\");\n            Assert.ArrayEqual(new byte[] { 3, 0, 0, 0, (byte)'f', (byte)'o', (byte)'o', 0 }, builder.DataBuffer.ToFullArray());\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestCreateArbitarytring()\n        {\n            var builder = new FlatBufferBuilder(1);\n            builder.CreateString(\"\\x01\\x02\\x03\");\n            Assert.ArrayEqual(new byte[]\n            {\n                3, 0, 0, 0,\n                0x01, 0x02, 0x03, 0\n            }, builder.DataBuffer.ToFullArray()); // No padding\n            builder.CreateString(\"\\x04\\x05\\x06\\x07\");\n            Assert.ArrayEqual(new byte[]\n            {\n                0, 0, 0, 0,\n                0, 0, 0, 0,\n                0, 0, 0, 0,  // Padding to 32 bytes\n                4, 0, 0, 0,\n                0x04, 0x05, 0x06, 0x07,\n                0, 0, 0, 0, // zero terminator with 3 byte pad\n                3, 0, 0, 0,\n                0x01, 0x02, 0x03, 0\n            }, builder.DataBuffer.ToFullArray()); // No padding\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestEmptyVTable()\n        {\n            var builder = new FlatBufferBuilder(1);\n            builder.StartTable(0);\n            Assert.ArrayEqual(new byte[] { 0 }, builder.DataBuffer.ToFullArray());\n            builder.EndTable();\n            Assert.ArrayEqual(new byte[]\n            {\n                4, 0, 4, 0,\n                4, 0, 0, 0\n            },\n                builder.DataBuffer.ToFullArray());\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestVTableWithOneBool()\n        {\n            var builder = new FlatBufferBuilder(1);\n            builder.StartTable(1);\n            Assert.ArrayEqual(new byte[] { 0 }, builder.DataBuffer.ToFullArray());\n            builder.AddBool(0, true, false);\n            builder.EndTable();\n            Assert.ArrayEqual(new byte[]\n            {\n                0, 0, // padding to 16 bytes\n                6, 0, // vtable bytes\n                8, 0, // object length inc vtable offset\n                7, 0, // start of bool value\n                6, 0, 0, 0, // int32 offset for start of vtable\n                0, 0, 0, // padding\n                1, // value 0\n            },\n                builder.DataBuffer.ToFullArray());\n            var verifier = new Verifier(builder.DataBuffer);\n            var offset = 8;\n            // table must be ok\n            Assert.IsTrue(verifier.VerifyTableStart((uint)offset));\n            // First field must be bool\n            Assert.IsTrue(verifier.VerifyField((uint)offset, 4, 1, 1, true));\n            // Check Error: Second field\n            Assert.IsFalse(verifier.VerifyField((uint)offset, 6, 1, 1, true));\n            // Check Error: First field too big alignment\n            Assert.IsFalse(verifier.VerifyField((uint)offset, 4, 1, 2, true));\n            // Check Error: First size to big\n            Assert.IsFalse(verifier.VerifyField((uint)offset, 4, 2, 1, true));\n    }\n\n    [FlatBuffersTestMethod]\n        public void TestVTableWithOneBool_DefaultValue()\n        {\n            var builder = new FlatBufferBuilder(1);\n            builder.StartTable(1);\n            Assert.ArrayEqual(new byte[] { 0 }, builder.DataBuffer.ToFullArray());\n            builder.AddBool(0, false, false);\n            builder.EndTable();\n            Assert.ArrayEqual(new byte[]\n            {\n                // No padding.\n                4, 0, // vtable bytes\n                4, 0, // end of object from here\n                // entry 0 is not stored (trimmed end of vtable)\n                4, 0, 0, 0, // int32 offset for start of vtable\n            },\n                builder.DataBuffer.ToFullArray());\n            var verifier = new Verifier(builder.DataBuffer);\n            var offset = 4;\n            // table must be ok\n            Assert.IsTrue(verifier.VerifyTableStart((uint)offset));\n            // First field must be bool\n            Assert.IsTrue(verifier.VerifyField((uint)offset, 4, 1, 1, false));\n            // Error Check: First field not present\n            Assert.IsFalse(verifier.VerifyField((uint)offset, 4, 1, 1, true));\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestVTableWithOneInt16()\n        {\n            var builder = new FlatBufferBuilder(1);\n            builder.StartTable(1);\n            Assert.ArrayEqual(new byte[] { 0 }, builder.DataBuffer.ToFullArray());\n            builder.AddShort(0, 0x789A, 0);\n            int offset = builder.EndTable();\n            Assert.ArrayEqual(new byte[]\n            {\n                0, 0, // padding to 16 bytes\n                6, 0, // vtable bytes\n                8, 0, // object length inc vtable offset\n                6, 0, // start of int16 value\n                6, 0, 0, 0, // int32 offset for start of vtable\n                0, 0, // padding\n                0x9A, 0x78, //value 0\n            },\n                builder.DataBuffer.ToFullArray());\n            var verifier = new Verifier(builder.DataBuffer);\n            offset += builder.DataBuffer.Position;\n            // table must be ok\n            Assert.IsTrue(verifier.VerifyTableStart((uint)offset));\n            // First field must be ushort\n            Assert.IsTrue(verifier.VerifyField((uint)offset, 4, 2, 2, true));\n            // Check Error: Second field\n            Assert.IsFalse(verifier.VerifyField((uint)offset, 6, 2, 2, true));\n            // Check Error: First field too big alignment\n            Assert.IsFalse(verifier.VerifyField((uint)offset, 4, 4, 2, true));\n            // Check Error: First field size to big\n            Assert.IsFalse(verifier.VerifyField((uint)offset, 4, 2, 4, true));\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestVTableWithTwoInt16()\n        {\n            var builder = new FlatBufferBuilder(1);\n            builder.StartTable(2);\n            Assert.ArrayEqual(new byte[] { 0 }, builder.DataBuffer.ToFullArray());\n            builder.AddShort(0, 0x3456, 0);\n            builder.AddShort(1, 0x789A, 0);\n            int offset = builder.EndTable();\n            Assert.ArrayEqual(new byte[]\n            {\n                8, 0, // vtable bytes\n                8, 0, // object length inc vtable offset\n                6, 0, // start of int16 value 0\n                4, 0, // start of int16 value 1\n                8, 0, 0, 0, // int32 offset for start of vtable\n                0x9A, 0x78, // value 1\n                0x56, 0x34, // value 0\n            },\n                builder.DataBuffer.ToFullArray());\n            var verifier = new Verifier(builder.DataBuffer);\n            offset += builder.DataBuffer.Position;\n            // table must be ok\n            Assert.IsTrue(verifier.VerifyTableStart((uint)offset));\n            // First field must be ushort\n            Assert.IsTrue(verifier.VerifyField((uint)offset, 4, 2, 2, true));\n            // Check Error: Second field\n            Assert.IsTrue(verifier.VerifyField((uint)offset, 6, 2, 2, true));\n            // Check Error: Second field too big alignment\n            Assert.IsFalse(verifier.VerifyField((uint)offset, 4, 4, 2, true));\n            // Check Error: Second field size to big\n            Assert.IsFalse(verifier.VerifyField((uint)offset, 4, 2, 4, true));\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestVTableWithInt16AndBool()\n        {\n            var builder = new FlatBufferBuilder(1);\n            builder.StartTable(2);\n            Assert.ArrayEqual(new byte[] { 0 }, builder.DataBuffer.ToFullArray());\n            builder.AddShort(0, 0x3456, 0);\n            builder.AddBool(1, true, false);\n            int offset = builder.EndTable();\n            Assert.ArrayEqual(new byte[]\n            {\n                8, 0, // vtable bytes\n                8, 0, // object length inc vtable offset\n                6, 0, // start of int16 value 0\n                5, 0, // start of bool value 1\n                8, 0, 0, 0, // int32 offset for start of vtable\n                0, 1, // padding + value 1\n                0x56, 0x34, // value 0\n            },\n                builder.DataBuffer.ToFullArray());\n            var verifier = new Verifier(builder.DataBuffer);\n            offset += builder.DataBuffer.Position;\n            // table must be ok\n            Assert.IsTrue(verifier.VerifyTableStart((uint)offset));\n            // First field must be ushort\n            Assert.IsTrue(verifier.VerifyField((uint)offset, 4, 2, 2, true));\n            // Check Error: Second field must be bool\n            Assert.IsTrue(verifier.VerifyField((uint)offset, 6, 1, 1, true));\n            // Check Error: Second field too big alignment\n            Assert.IsFalse(verifier.VerifyField((uint)offset, 4, 4, 2, true));\n            // Check Error: Second field size to big\n            Assert.IsFalse(verifier.VerifyField((uint)offset, 4, 2, 4, true));\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestVTableWithEmptyVector()\n        {\n            var builder = new FlatBufferBuilder(1);\n            builder.StartVector(sizeof(byte), 0, 1);\n            var vecEnd = builder.EndVector();\n\n            builder.StartTable(1);\n\n            builder.AddOffset(0, vecEnd.Value, 0);\n            builder.EndTable();\n            Assert.ArrayEqual(new byte[]\n            {\n                0, 0, 0, 0,\n                0, 0, 0, 0,\n                0, 0, 0, 0,\n                0, 0,       // Padding to 32 bytes\n                6, 0, // vtable bytes\n                8, 0, // object length inc vtable offset\n                4, 0, // start of vector offset value 0\n                6, 0, 0, 0, // int32 offset for start of vtable\n                4, 0, 0, 0,\n                0, 0, 0, 0,\n            },\n                builder.DataBuffer.ToFullArray());\n            var verifier = new Verifier(builder.DataBuffer);\n            uint checkOffset = 20;\n            // table must be ok\n            Assert.IsTrue(verifier.VerifyTableStart(checkOffset));\n            // First field must be vector with element size 1\n            Assert.IsTrue(verifier.VerifyVectorOfData(checkOffset, 4, 1, true));\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestVTableWithEmptyVectorAndScalars()\n        {\n            var builder = new FlatBufferBuilder(1);\n            builder.StartVector(sizeof(byte), 0, 1);\n            var vecEnd = builder.EndVector();\n\n            builder.StartTable(2);\n            builder.AddShort(0, 55, 0);\n            builder.AddOffset(1, vecEnd.Value, 0);\n            builder.EndTable();\n            Assert.ArrayEqual(new byte[]\n            {\n                0, 0, 0, 0,\n                0, 0, 0, 0, // Padding to 32 bytes\n                8, 0, // vtable bytes\n                12, 0, // object length inc vtable offset\n                10, 0,     // offset to int16 value 0\n                4, 0, // start of vector offset value 1\n                8, 0, 0, 0, // int32 offset for start of vtable\n                8, 0, 0, 0, // value 1\n                0, 0, 55, 0, // value 0\n                0, 0, 0, 0, // length of vector (not in sctruc)\n            },\n                builder.DataBuffer.ToFullArray());\n            var verifier = new Verifier(builder.DataBuffer);\n            uint checkOffset = 16;\n            // table must be ok\n            Assert.IsTrue(verifier.VerifyTableStart(checkOffset));\n            // First field must be short\n            Assert.IsTrue(verifier.VerifyField(checkOffset, 4, 2, 2, true));\n            // Second field must be vector with element size 1\n            Assert.IsTrue(verifier.VerifyVectorOfData(checkOffset, 6, 2, true));\n       }\n\n\n        [FlatBuffersTestMethod]\n        public void TestVTableWith_1xInt16_and_Vector_or_2xInt16()\n        {\n            var builder = new FlatBufferBuilder(1);\n            builder.StartVector(sizeof(short), 2, 1);\n            builder.AddShort(0x1234);\n            builder.AddShort(0x5678);\n            var vecEnd = builder.EndVector();\n\n            builder.StartTable(2);\n            builder.AddOffset(1, vecEnd.Value, 0);\n            builder.AddShort(0, 55, 0);\n            builder.EndTable();\n            Assert.ArrayEqual(new byte[]\n            {\n                0, 0, 0, 0, // Padding to 32 bytes\n                8, 0, // vtable bytes\n                12, 0, // object length\n                6, 0,     // start of value 0 from end of vtable\n                8, 0,     // start of value 1 from end of buffer\n                8, 0, 0, 0, // int32 offset for start of vtable\n                0, 0, 55, 0,    // padding + value 0\n                4, 0, 0, 0, // position of vector from here\n                2, 0, 0, 0, // length of vector\n                0x78, 0x56,       // vector value 0\n                0x34, 0x12,       // vector value 1\n            },\n                builder.DataBuffer.ToFullArray());\n            var verifier = new Verifier(builder.DataBuffer);\n            uint checkOffset = 12;\n            // table must be ok\n            Assert.IsTrue(verifier.VerifyTableStart(checkOffset));\n            // Second field must be vector with element size 2\n            Assert.IsTrue(verifier.VerifyVectorOfData(checkOffset, 6, 2, true));\n            // Check Error: Second field with too big size\n            Assert.IsFalse(verifier.VerifyVectorOfData(checkOffset, 6, 4, true));\n            // First field must be short\n            Assert.IsTrue(verifier.VerifyField(checkOffset, 4, 2, 2, true));\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestVTableWithAStruct_of_int8_int16_int32()\n        {\n            var builder = new FlatBufferBuilder(1);\n            builder.StartTable(1);\n            builder.Prep(4+4+4, 0);\n            builder.AddSbyte(55);\n            builder.Pad(3);\n            builder.AddShort(0x1234);\n            builder.Pad(2);\n            builder.AddInt(0x12345678);\n            var structStart = builder.Offset;\n            builder.AddStruct(0, structStart, 0);\n            builder.EndTable();\n            Assert.ArrayEqual(new byte[]\n            {\n                0, 0, 0, 0,\n                0, 0, 0, 0,\n                0, 0, // Padding to 32 bytes\n                6, 0, // vtable bytes\n                16, 0, // object length\n                4, 0,     // start of struct from here\n                6, 0, 0, 0, // int32 offset for start of vtable\n                0x78, 0x56, 0x34, 0x12,  // struct value 2\n                0x00, 0x00, 0x34, 0x12, // struct value 1\n                0x00, 0x00, 0x00, 55, // struct value 0\n            },\n                builder.DataBuffer.ToFullArray());\n            var verifier = new Verifier(builder.DataBuffer);\n            uint checkOffset = 16;\n            // table must be ok\n            Assert.IsTrue(verifier.VerifyTableStart(checkOffset));\n            // First field must be a struct with 12 bytes\n            Assert.IsTrue(verifier.VerifyField(checkOffset, 4, 12, 4, true));\n            // Check Error: First field with more than 12 bytes\n            Assert.IsFalse(verifier.VerifyField(checkOffset, 4, 16, 4, true));\n        }\n\n\n        [FlatBuffersTestMethod]\n        public void TestVTableWithAVectorOf_2xStructOf_2xInt8()\n        {\n            var builder = new FlatBufferBuilder(1);\n            builder.StartVector(sizeof(byte)*2, 2, 1);\n            builder.AddByte(33);\n            builder.AddByte(44);\n            builder.AddByte(55);\n            builder.AddByte(66);\n            var vecEnd = builder.EndVector();\n\n            builder.StartTable(1);\n            builder.AddOffset(0, vecEnd.Value, 0);\n            builder.EndTable();\n\n            Assert.ArrayEqual(new byte[]\n            {\n                0, 0, 0, 0,\n                0, 0, 0, 0,\n                0, 0, // Padding to 32 bytes\n                6, 0, // vtable bytes\n                8, 0, // object length\n                4, 0,     // offset of vector offset\n                6, 0, 0, 0, // int32 offset for start of vtable\n                4, 0, 0, 0, // Vector start offset\n                2, 0, 0, 0, // Vector len\n                66, // vector 1, 1\n                55, // vector 1, 0\n                44, // vector 0, 1\n                33, // vector 0, 0\n            },\n                builder.DataBuffer.ToFullArray());\n            var verifier = new Verifier(builder.DataBuffer);\n            uint checkOffset = 16;\n            // table must be ok\n            Assert.IsTrue(verifier.VerifyTableStart(checkOffset));\n            // First field must be vector with element size 2\n            Assert.IsTrue(verifier.VerifyVectorOfData(checkOffset, 4, 2, true));\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestVTableWithSomeElements()\n        {\n            var builder = new FlatBufferBuilder(1);\n            builder.StartTable(2);\n            builder.AddByte(0, 33, 0);\n            builder.AddShort(1, 66, 0);\n            var off = builder.EndTable();\n            builder.Finish(off);\n\n            byte[] padded = new byte[]\n            {\n                0, 0, 0, 0,\n                0, 0, 0, 0,\n                0, 0, 0, 0, //Padding to 32 bytes\n                12, 0, 0, 0,     // root of table, pointing to vtable offset\n                8, 0, // vtable bytes\n                8, 0, // object length\n                7, 0, // start of value 0\n                4, 0, // start of value 1\n                8, 0, 0, 0, // int32 offset for start of vtable\n                66, 0, // value 1\n                0, 33, // value 0\n\n            };\n            Assert.ArrayEqual(padded, builder.DataBuffer.ToFullArray());\n\n            // no padding in sized array\n            byte[] unpadded = new byte[padded.Length - 12];\n            Buffer.BlockCopy(padded, 12, unpadded, 0, unpadded.Length);\n            Assert.ArrayEqual(unpadded, builder.DataBuffer.ToSizedArray());\n\n            var verifier = new Verifier(builder.DataBuffer);\n            uint checkOffset = builder.DataBuffer.GetUint(builder.DataBuffer.Position) + (uint)builder.DataBuffer.Position;\n            // table must be ok\n            Assert.IsTrue(verifier.VerifyTableStart(checkOffset));\n            // First field must be a struct with 12 bytes\n            Assert.IsTrue(verifier.VerifyField(checkOffset, 4, 1, 1, true));\n            // Second field must be a struct with 12 bytes\n            Assert.IsTrue(verifier.VerifyField(checkOffset, 6, 2, 2, true));\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestVTableWithStrings()\n        {\n            var builder = new FlatBufferBuilder(64);\n            var str1 = builder.CreateString(\"foo\");\n            var str2 = builder.CreateString(\"foobar\");\n            builder.StartTable(2);\n            builder.AddOffset(0, str1.Value, 0);\n            builder.AddOffset(1, str2.Value, 0);\n            var off = builder.EndTable();\n            builder.Finish(off);\n\n            byte[] padded = new byte[]\n            {\n                0, 0, 0, 0,\n                0, 0, 0, 0,\n                0, 0, 0, 0,\n                0, 0, 0, 0,\n                0, 0, 0, 0, //Padding to 32 bytes\n                12, 0, 0, 0, // root of table, pointing to vtable offset\n                8, 0, // vtable bytes\n                12, 0, // object length\n                8, 0, // start of value 0\n                4, 0, // start of value 1\n                8, 0, 0, 0, // int32 offset for start of vtable\n                8, 0, 0, 0, // pointer to string\n                16, 0, 0, 0, // pointer to string\n                6, 0, 0, 0, // length of string\n                102, 111, 111, 98, 97, 114, 0, 0, // \"foobar\" + padding\n                3, 0, 0, 0, // length of string\n                102, 111, 111, 0 // \"bar\"\n            };\n            Assert.ArrayEqual(padded, builder.DataBuffer.ToFullArray());\n\n            var verifier = new Verifier(builder.DataBuffer);\n            uint checkOffset = builder.DataBuffer.GetUint(builder.DataBuffer.Position) + (uint)builder.DataBuffer.Position;\n            // table must be ok\n            Assert.IsTrue(verifier.VerifyTableStart(checkOffset));\n            // First field string check\n            Assert.IsTrue(verifier.VerifyString(checkOffset, 4, true));\n            // Second field string check\n            Assert.IsTrue(verifier.VerifyString(checkOffset, 6, true));\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestVTableWithVectorOfStrings()\n        {\n            var builder = new FlatBufferBuilder(64);\n            var str1 = builder.CreateString(\"foo\");\n            var str2 = builder.CreateString(\"foobar\");\n            builder.StartVector(sizeof(int), 2, 1);\n            builder.AddOffset(str1.Value);\n            builder.AddOffset(str2.Value);\n            var vec = builder.EndVector();\n            builder.StartTable(1);\n            builder.AddOffset(0, vec.Value, 0);\n            var off = builder.EndTable();\n            builder.Finish(off);\n\n            byte[] padded = new byte[]\n            {\n                0, 0, 0, 0,\n                0, 0, 0, 0,\n                0, 0, 0, 0, //Padding to 32 bytes\n                12, 0, 0, 0, // root of table, pointing to vtable offset\n                0, 0, // padding\n                6, 0, // vtable bytes\n                8, 0, // object length\n                4, 0, // start of value 0\n                6, 0, 0, 0, // int32 offset for start of vtable\n                4, 0, 0, 0, // pointer to vector\n                2, 0, 0, 0, // length of vector\n                8, 0, 0, 0, // int32 offset to string 1\n                16, 0, 0, 0, // int32 offset to string 2\n                6, 0, 0, 0, // length of string\n                102, 111, 111, 98, 97, 114, 0, 0, // \"foobar\" + padding\n                3, 0, 0, 0, // length of string\n                102, 111, 111, 0 // \"bar\"\n            };\n            Assert.ArrayEqual(padded, builder.DataBuffer.ToFullArray());\n\n            var verifier = new Verifier(builder.DataBuffer);\n            uint checkOffset = builder.DataBuffer.GetUint(builder.DataBuffer.Position) + (uint)builder.DataBuffer.Position;\n            // table must be ok\n            Assert.IsTrue(verifier.VerifyTableStart(checkOffset));\n            // First field string check\n            Assert.IsTrue(verifier.VerifyVectorOfStrings(checkOffset, 4, true));\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestTwoFinishTable()\n        {\n            var builder = new FlatBufferBuilder(1);\n            builder.StartTable(2);\n            builder.AddByte(0, 33, 0);\n            builder.AddByte(1, 44, 0);\n            var off0 = builder.EndTable();\n            builder.Finish(off0);\n\n            builder.StartTable(3);\n            builder.AddByte(0, 55, 0);\n            builder.AddByte(1, 66, 0);\n            builder.AddByte(2, 77, 0);\n            var off1 = builder.EndTable();\n            builder.Finish(off1);\n\n            Assert.ArrayEqual(new byte[]\n            {\n                0, 0, 0, 0,\n                0, 0, 0, 0,\n                0, 0, 0, 0,\n                0, 0, 0, 0,\n                0, 0, 0, 0,       // padding to 64 bytes\n                16, 0, 0, 0,     // root of table, pointing to vtable offset (obj1)\n                0, 0, // padding\n\n                10, 0, // vtable bytes\n                8, 0, // object length\n                7, 0, // start of value 0\n                6, 0, // start of value 1\n                5, 0, // start of value 2\n                10, 0, 0, 0, // int32 offset for start of vtable\n                0, // pad\n                77, // values 2, 1, 0\n                66,\n                55,\n\n                12, 0, 0, 0,     // root of table, pointing to vtable offset (obj0)\n                8, 0, // vtable bytes\n                8, 0, // object length\n                7, 0, // start of value 0\n                6, 0, // start of value 1\n                8, 0, 0, 0, // int32 offset for start of vtable\n                0, 0, // pad\n                44, // value 1, 0\n                33,\n            },\n                builder.DataBuffer.ToFullArray());\n\n            // check obj1\n            var verifier = new Verifier(builder.DataBuffer);\n            uint checkOffset = builder.DataBuffer.GetUint(builder.DataBuffer.Position) + (uint)builder.DataBuffer.Position;\n            // table must be ok\n            Assert.IsTrue(verifier.VerifyTableStart(checkOffset));\n            // First field must be a struct with 12 bytes\n            Assert.IsTrue(verifier.VerifyField(checkOffset, 4, 1, 1, true));\n            // Second field must be a struct with 12 bytes\n            Assert.IsTrue(verifier.VerifyField(checkOffset, 6, 1, 1, true));\n            // Third field must be a struct with 12 bytes\n            Assert.IsTrue(verifier.VerifyField(checkOffset, 8, 1, 1, true));\n            // Check Error: 4. field did not exist\n            Assert.IsFalse(verifier.VerifyField(checkOffset, 10, 1, 1, true));\n\n            // check obj0\n            checkOffset = 56;\n            // table must be ok\n            Assert.IsTrue(verifier.VerifyTableStart(checkOffset));\n            // First field must be a struct with 12 bytes\n            Assert.IsTrue(verifier.VerifyField(checkOffset, 4, 1, 1, true));\n            // Second field must be a struct with 12 bytes\n            Assert.IsTrue(verifier.VerifyField(checkOffset, 6, 1, 1, true));\n            // Check Error: 3. field did not exist\n            Assert.IsFalse(verifier.VerifyField(checkOffset, 8, 1, 1, true));\n            // Check Error: 4. field did not exist\n            Assert.IsFalse(verifier.VerifyField(checkOffset, 10, 1, 1, true));\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestBunchOfBools()\n        {\n            var builder = new FlatBufferBuilder(1);\n            builder.StartTable(8);\n            for (var i = 0; i < 8; i++)\n            {\n                builder.AddBool(i, true, false);\n            }\n            var off = builder.EndTable();\n            builder.Finish(off);\n\n            byte[] padded = new byte[]\n            {\n                0, 0, 0, 0,\n                0, 0, 0, 0,\n                0, 0, 0, 0,\n                0, 0, 0, 0,\n                0, 0, 0, 0,\n                0, 0, 0, 0,\n                0, 0, 0, 0,       // padding to 64 bytes\n\n                24, 0, 0, 0,     // root of table, pointing to vtable offset (obj0)\n                20, 0, // vtable bytes\n                12, 0, // object length\n                11, 0, // start of value 0\n                10, 0, // start of value 1\n                9, 0, // start of value 2\n                8, 0, // start of value 3\n                7, 0, // start of value 4\n                6, 0, // start of value 5\n                5, 0, // start of value 6\n                4, 0, // start of value 7\n\n                20, 0, 0, 0, // int32 offset for start of vtable\n\n                1, 1, 1, 1,  // values\n                1, 1, 1, 1,\n\n            };\n            Assert.ArrayEqual(padded, builder.DataBuffer.ToFullArray());\n\n            // no padding in sized array\n            byte[] unpadded = new byte[padded.Length - 28];\n            Buffer.BlockCopy(padded, 28, unpadded, 0, unpadded.Length);\n            Assert.ArrayEqual(unpadded, builder.DataBuffer.ToSizedArray());\n\n            var verifier = new Verifier(builder.DataBuffer);\n            uint checkOffset = builder.DataBuffer.GetUint(builder.DataBuffer.Position) + (uint)builder.DataBuffer.Position;\n            // table must be ok\n            Assert.IsTrue(verifier.VerifyTableStart(checkOffset));\n            for (var i = 0; i < 8; i++)\n            {\n                Assert.IsTrue(verifier.VerifyField(checkOffset, (short)(4 + i * 2), 1, 1, true));\n            }\n            Assert.IsFalse(verifier.VerifyField(checkOffset, (short)(4 + 8 * 2), 1, 1, true));\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestBunchOfBoolsSizePrefixed()\n        {\n            var builder = new FlatBufferBuilder(1);\n            builder.StartTable(8);\n            for (var i = 0; i < 8; i++)\n            {\n                builder.AddBool(i, true, false);\n            }\n            var off = builder.EndTable();\n            builder.FinishSizePrefixed(off);\n\n            byte[] padded = new byte[]\n            {\n                0, 0, 0, 0,\n                0, 0, 0, 0,\n                0, 0, 0, 0,\n                0, 0, 0, 0,\n                0, 0, 0, 0,\n                0, 0, 0, 0,      // padding to 64 bytes\n\n                36, 0, 0, 0,     // size prefix\n                24, 0, 0, 0,     // root of table, pointing to vtable offset (obj0)\n                20, 0, // vtable bytes\n                12, 0, // object length\n                11, 0, // start of value 0\n                10, 0, // start of value 1\n                9, 0, // start of value 2\n                8, 0, // start of value 3\n                7, 0, // start of value 4\n                6, 0, // start of value 5\n                5, 0, // start of value 6\n                4, 0, // start of value 7\n\n                20, 0, 0, 0, // int32 offset for start of vtable\n\n                1, 1, 1, 1,  // values\n                1, 1, 1, 1,\n\n            };\n            Assert.ArrayEqual(padded, builder.DataBuffer.ToFullArray());\n\n            // no padding in sized array\n            byte[] unpadded = new byte[padded.Length - 24];\n            Buffer.BlockCopy(padded, 24, unpadded, 0, unpadded.Length);\n            Assert.ArrayEqual(unpadded, builder.DataBuffer.ToSizedArray());\n        }\n\n        [FlatBuffersTestMethod]\n        public void TestWithFloat()\n        {\n            var builder = new FlatBufferBuilder(1);\n            builder.StartTable(1);\n            builder.AddFloat(0, 1, 0);\n            builder.EndTable();\n\n\n            Assert.ArrayEqual(new byte[]\n            {\n                0, 0,\n                6, 0, // vtable bytes\n                8, 0, // object length\n                4, 0, // start of value 0\n                6, 0, 0, 0, // int32 offset for start of vtable\n                0, 0, 128, 63,  // value\n\n            },\n                builder.DataBuffer.ToFullArray());\n            var verifier = new Verifier(builder.DataBuffer);\n            uint checkOffset = 8;\n            // table must be ok\n            Assert.IsTrue(verifier.VerifyTableStart(checkOffset));\n            // First Field must be float\n            Assert.IsTrue(verifier.VerifyField(checkOffset, 4, 4, 4, true));\n            // Check Error: First Field with to big size\n            Assert.IsFalse(verifier.VerifyField(checkOffset, 4, 8, 4, true));\n            // Check Error: First Field with to big padding\n            Assert.IsFalse(verifier.VerifyField(checkOffset, 4, 4, 8, true));\n        }\n\n        private void CheckObjects(int fieldCount, int objectCount)\n        {\n            _lcg.Reset();\n\n            const int testValuesMax = 11;\n\n            var builder = new FlatBufferBuilder(1);\n\n            var objects = new int[objectCount];\n\n            for (var i = 0; i < objectCount; ++i)\n            {\n                builder.StartTable(fieldCount);\n\n                for (var j = 0; j < fieldCount; ++j)\n                {\n                    var fieldType = _lcg.Next()%testValuesMax;\n\n                    switch (fieldType)\n                    {\n                        case 0:\n                        {\n                            builder.AddBool(j, FuzzTestData.BoolValue, false);\n                            break;\n                        }\n                        case 1:\n                        {\n                            builder.AddSbyte(j, FuzzTestData.Int8Value, 0);\n                            break;\n                        }\n                        case 2:\n                        {\n                            builder.AddByte(j, FuzzTestData.UInt8Value, 0);\n                            break;\n                        }\n                        case 3:\n                        {\n                            builder.AddShort(j, FuzzTestData.Int16Value, 0);\n                            break;\n                        }\n                        case 4:\n                        {\n                            builder.AddUshort(j, FuzzTestData.UInt16Value, 0);\n                            break;\n                        }\n                        case 5:\n                        {\n                            builder.AddInt(j, FuzzTestData.Int32Value, 0);\n                            break;\n                        }\n                        case 6:\n                        {\n                            builder.AddUint(j, FuzzTestData.UInt32Value, 0);\n                            break;\n                        }\n                        case 7:\n                        {\n                            builder.AddLong(j, FuzzTestData.Int64Value, 0);\n                            break;\n                        }\n                        case 8:\n                        {\n                            builder.AddUlong(j, FuzzTestData.UInt64Value, 0);\n                            break;\n                        }\n                        case 9:\n                        {\n                            builder.AddFloat(j, FuzzTestData.Float32Value, 0);\n                            break;\n                        }\n                        case 10:\n                        {\n                            builder.AddDouble(j, FuzzTestData.Float64Value, 0);\n                            break;\n                        }\n                        default:\n                            throw new Exception(\"Unreachable\");\n                    }\n\n                }\n\n                var offset = builder.EndTable();\n\n                // Store the object offset\n                objects[i] = offset;\n            }\n\n            _lcg.Reset();\n\n            // Test all objects are readable and return expected values...\n            for (var i = 0; i < objectCount; ++i)\n            {\n                var table = new TestTable(builder.DataBuffer, builder.DataBuffer.Length - objects[i]);\n\n                for (var j = 0; j < fieldCount; ++j)\n                {\n                    var fieldType = _lcg.Next() % testValuesMax;\n                    var fc = 2 + j; // 2 == VtableMetadataFields\n                    var f = fc * 2;\n\n                    switch (fieldType)\n                    {\n                        case 0:\n                        {\n                            Assert.AreEqual(FuzzTestData.BoolValue, table.GetSlot(f, false));\n                            break;\n                        }\n                        case 1:\n                        {\n                            Assert.AreEqual(FuzzTestData.Int8Value, table.GetSlot(f, (sbyte)0));\n                            break;\n                        }\n                        case 2:\n                        {\n                            Assert.AreEqual(FuzzTestData.UInt8Value, table.GetSlot(f, (byte)0));\n                            break;\n                        }\n                        case 3:\n                        {\n                            Assert.AreEqual(FuzzTestData.Int16Value, table.GetSlot(f, (short)0));\n                            break;\n                        }\n                        case 4:\n                        {\n                            Assert.AreEqual(FuzzTestData.UInt16Value, table.GetSlot(f, (ushort)0));\n                            break;\n                        }\n                        case 5:\n                        {\n                            Assert.AreEqual(FuzzTestData.Int32Value, table.GetSlot(f, (int)0));\n                            break;\n                        }\n                        case 6:\n                        {\n                            Assert.AreEqual(FuzzTestData.UInt32Value, table.GetSlot(f, (uint)0));\n                            break;\n                        }\n                        case 7:\n                        {\n                            Assert.AreEqual(FuzzTestData.Int64Value, table.GetSlot(f, (long)0));\n                            break;\n                        }\n                        case 8:\n                        {\n                            Assert.AreEqual(FuzzTestData.UInt64Value, table.GetSlot(f, (ulong)0));\n                            break;\n                        }\n                        case 9:\n                        {\n                            Assert.AreEqual(FuzzTestData.Float32Value, table.GetSlot(f, (float)0));\n                            break;\n                        }\n                        case 10:\n                        {\n                            Assert.AreEqual(FuzzTestData.Float64Value, table.GetSlot(f, (double)0));\n                            break;\n                        }\n                        default:\n                            throw new Exception(\"Unreachable\");\n                    }\n\n                }\n\n            }\n\n        }\n    }\n}\n"
  },
  {
    "path": "tests/FlatBuffers.Test/FlatBuffersTestClassAttribute.cs",
    "content": "/*\n * Copyright 2016 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace Google.FlatBuffers.Test\n{\n    [AttributeUsage(AttributeTargets.Class)]\n    public class FlatBuffersTestClassAttribute : Attribute\n    {\n    }\n}\n"
  },
  {
    "path": "tests/FlatBuffers.Test/FlatBuffersTestMethodAttribute.cs",
    "content": "/*\n * Copyright 2016 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n using System;\n\nnamespace Google.FlatBuffers.Test\n{\n    [AttributeUsage(AttributeTargets.Method)]\n    public class FlatBuffersTestMethodAttribute : Attribute\n    {\n    }\n}"
  },
  {
    "path": "tests/FlatBuffers.Test/FuzzTestData.cs",
    "content": "/*\n * Copyright 2016 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nusing System;\n\nnamespace Google.FlatBuffers.Test\n{\n    internal static class FuzzTestData\n    {\n        private static readonly byte[] _overflowInt32 = new byte[] {0x83, 0x33, 0x33, 0x33};\n        private static readonly byte[] _overflowInt64 = new byte[] { 0x84, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 };\n\n        public static readonly bool BoolValue = true;\n        public static readonly  sbyte Int8Value = -127;        // 0x81\n        public static readonly  byte UInt8Value = 255;         // 0xFF\n        public static readonly  short Int16Value = -32222;     // 0x8222;\n        public static readonly  ushort UInt16Value = 65262;      // 0xFEEE\n        public static readonly int Int32Value = BitConverter.ToInt32(_overflowInt32, 0);\n        public static readonly uint UInt32Value = 0xFDDDDDDD;\n        public static readonly long Int64Value = BitConverter.ToInt64(_overflowInt64, 0);\n        public static readonly ulong UInt64Value = 0xFCCCCCCCCCCCCCCC;\n        public static readonly float Float32Value = 3.14159f;\n        public static readonly double Float64Value = 3.14159265359;\n    }\n}"
  },
  {
    "path": "tests/FlatBuffers.Test/Lcg.cs",
    "content": "/*\n * Copyright 2016 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nnamespace Google.FlatBuffers.Test\n{\n    /// <summary>\n    /// Lcg Pseudo RNG\n    /// </summary>\n    internal sealed class Lcg\n    {\n        private const uint InitialValue = 10000;\n        private uint _state;\n\n        public Lcg()\n        {\n            _state = InitialValue;\n        }\n\n        public uint Next()\n        {\n            return (_state = 69069 * _state + 362437);\n        }\n\n        public void Reset()\n        {\n            _state = InitialValue;\n        }\n    }\n}"
  },
  {
    "path": "tests/FlatBuffers.Test/NetTest.bat",
    "content": "@echo off\n@REM Builds a .NET solution file, adds the project, builds it\n@REM and executes it. Cleans up all generated files and directories.\n\nset TEMP_BIN=.tmp\n\n@REM Run the .NET tests\nset CORE_FILE=FlatBuffers.Test\nset CORE_PROJ_FILE=%CORE_FILE%.csproj\nset CORE_SLN_FILE=%CORE_FILE%.sln\ndotnet new sln --force --name %CORE_FILE%\ndotnet sln %CORE_SLN_FILE% add %CORE_PROJ_FILE%\ndotnet build -c Release -o %TEMP_BIN% -v quiet %CORE_PROJ_FILE%\n%TEMP_BIN%\\%CORE_FILE%.exe\ndel /f %CORE_SLN_FILE%\n\n@REM TODO(dbaileychess): Support the other configurations in NetTest.sh\n\n@REM remove the temp bin directory, with files (/S) and quietly (/Q)\nRD /S /Q %TEMP_BIN%\n"
  },
  {
    "path": "tests/FlatBuffers.Test/NetTest.sh",
    "content": "#!/bin/sh\n\nPROJ_FILE=FlatBuffers.Test.csproj\n\nTEMP_DOTNET_DIR=.dotnet_tmp\nTEMP_BIN=.tmp\n\n[ -d $TEMP_DOTNET_DIR ] || mkdir $TEMP_DOTNET_DIR\n\n[ -f dotnet-install.sh ] || curl -OL https://dot.net/v1/dotnet-install.sh\n\n./dotnet-install.sh --version latest --install-dir $TEMP_DOTNET_DIR\n\nDOTNET=$TEMP_DOTNET_DIR/dotnet\n\n$DOTNET new sln\n$DOTNET sln add $PROJ_FILE\n$DOTNET restore -r linux-x64 $PROJ_FILE\n\n# Testing with default options.\nmsbuild -property:Configuration=Release,OutputPath=$TEMP_BIN -verbosity:quiet $PROJ_FILE\n$TEMP_BIN/FlatBuffers.Core.Test.exe\nrm -fr $TEMP_BIN\n\n# Repeat with unsafe versions\nmsbuild -property:Configuration=Release,UnsafeByteBuffer=true,OutputPath=$TEMP_BIN -verbosity:quiet $PROJ_FILE\n$TEMP_BIN/FlatBuffers.Core.Test.exe\nrm -fr $TEMP_BIN\n\n# Repeat with SpanT versions\nmsbuild -property:Configuration=Release,EnableSpanT=true,OutputPath=$TEMP_BIN -verbosity:quiet $PROJ_FILE\n$TEMP_BIN/FlatBuffers.Core.Test.exe\nrm -fr $TEMP_BIN\n\nrm FlatBuffers.Test.sln\nrm -rf obj\n"
  },
  {
    "path": "tests/FlatBuffers.Test/Program.cs",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\n\nnamespace Google.FlatBuffers.Test\n{\n    static class Program\n    {\n        public static int Main(string[] args)\n        {\n            var testResults = new List<bool>();\n\n            var testClasses = Assembly.GetExecutingAssembly().GetExportedTypes()\n                .Where(t => t.IsClass && t.GetCustomAttributes(typeof (FlatBuffersTestClassAttribute), false).Length > 0);\n\n            foreach (var testClass in testClasses)\n            {\n                var methods = testClass.GetMethods(BindingFlags.Public |\n                                                         BindingFlags.Instance)\n                          .Where(m => m.GetCustomAttributes(typeof(FlatBuffersTestMethodAttribute), false).Length > 0);\n\n                var inst = Activator.CreateInstance(testClass);\n\n                foreach (var method in methods)\n                {\n                    try\n                    {\n                        method.Invoke(inst, new object[] { });\n                        testResults.Add(true);\n                    }\n                    catch (Exception ex)\n                    {\n                        Console.WriteLine(\"{0}: FAILED when invoking {1} with error {2}\",\n                            testClass.Name ,method.Name, ex.GetBaseException());\n                        testResults.Add(false);\n                    }\n                }\n            }\n\n            var failedCount = testResults.Count(i => i == false);\n\n            Console.WriteLine(\"{0} tests run, {1} failed\", testResults.Count, failedCount);\n\n            if (failedCount > 0)\n            {\n                return -1;\n            }\n            return 0;\n        }\n    }\n}\n"
  },
  {
    "path": "tests/FlatBuffers.Test/Properties/AssemblyInfo.cs",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nusing System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following\n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"FlatBuffers.Test\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"FlatBuffers.Test\")]\n[assembly: AssemblyCopyright(\"Copyright (c) 2014  Google Inc\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"a1d58a51-3e74-4ae9-aac7-5a399c9eed1a\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version\n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers\n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "tests/FlatBuffers.Test/README.md",
    "content": "# .NET Tests\n\n## Running on Linux\n\n### Prerequisites\nTo run the tests on a Linux a few prerequisites are needed:\n\n1) mono\n2) msbuild\n\n### Running\n\nTo run the tests:\n\n```\n./NetTest.sh\n```\n\nThis will download the .NET installer and core SDK if those are not already\ninstalled. Then it will build the tests using `msbuild` and run the resulting\ntest binary with `mono`.\n\nAfter running the tests, the downloaded .NET installer and SDK are *not* removed\nas they can be reused in subsequent invocations. The files are ignored by git by\ndefault, and can remain in the working directory.\n\n### Cleaning\n\nIf you want to clean up the downloaded .NET installer and SDK, run:\n\n```\n./clean.sh\n```\n\nThis will wipe away the downloaded files and directories. Those will be\nautomatically re-downloaded when running `NetTest.sh`.\n\n\n"
  },
  {
    "path": "tests/FlatBuffers.Test/TestTable.cs",
    "content": "/*\n * Copyright 2016 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nnamespace Google.FlatBuffers.Test\n{\n    /// <summary>\n    /// A test Table object that gives easy access to the slot data\n    /// </summary>\n    internal struct TestTable\n    {\n        Table t;\n\n        public TestTable(ByteBuffer bb, int pos)\n        {\n          t = new Table(pos, bb);\n        }\n\n        public bool GetSlot(int slot, bool def)\n        {\n            var off = t.__offset(slot);\n\n            if (off == 0)\n            {\n                return def;\n            }\n            return t.bb.GetSbyte(t.bb_pos + off) != 0;\n        }\n\n        public sbyte GetSlot(int slot, sbyte def)\n        {\n            var off = t.__offset(slot);\n\n            if (off == 0)\n            {\n                return def;\n            }\n            return t.bb.GetSbyte(t.bb_pos + off);\n        }\n\n        public byte GetSlot(int slot, byte def)\n        {\n            var off = t.__offset(slot);\n\n            if (off == 0)\n            {\n                return def;\n            }\n            return t.bb.Get(t.bb_pos + off);\n        }\n\n        public short GetSlot(int slot, short def)\n        {\n            var off = t.__offset(slot);\n\n            if (off == 0)\n            {\n                return def;\n            }\n            return t.bb.GetShort(t.bb_pos + off);\n        }\n\n        public ushort GetSlot(int slot, ushort def)\n        {\n            var off = t.__offset(slot);\n\n            if (off == 0)\n            {\n                return def;\n            }\n            return t.bb.GetUshort(t.bb_pos + off);\n        }\n\n        public int GetSlot(int slot, int def)\n        {\n            var off = t.__offset(slot);\n\n            if (off == 0)\n            {\n                return def;\n            }\n            return t.bb.GetInt(t.bb_pos + off);\n        }\n\n        public uint GetSlot(int slot, uint def)\n        {\n            var off = t.__offset(slot);\n\n            if (off == 0)\n            {\n                return def;\n            }\n            return t.bb.GetUint(t.bb_pos + off);\n        }\n\n        public long GetSlot(int slot, long def)\n        {\n            var off = t.__offset(slot);\n\n            if (off == 0)\n            {\n                return def;\n            }\n            return t.bb.GetLong(t.bb_pos + off);\n        }\n\n        public ulong GetSlot(int slot, ulong def)\n        {\n            var off = t.__offset(slot);\n\n            if (off == 0)\n            {\n                return def;\n            }\n            return t.bb.GetUlong(t.bb_pos + off);\n        }\n\n        public float GetSlot(int slot, float def)\n        {\n            var off = t.__offset(slot);\n\n            if (off == 0)\n            {\n                return def;\n            }\n            return t.bb.GetFloat(t.bb_pos + off);\n        }\n\n        public double GetSlot(int slot, double def)\n        {\n            var off = t.__offset(slot);\n\n            if (off == 0)\n            {\n                return def;\n            }\n            return t.bb.GetDouble(t.bb_pos + off);\n        }\n    }\n}\n"
  },
  {
    "path": "tests/FlatBuffers.Test/clean.sh",
    "content": "#!/bin/sh\n\n# Remove files and directory that are needed to build and run the .NET tests.\n# The script NetTest.sh installs these as needed.\n\n[ -d .dotnet_tmp ] && rm -rf .dotnet_tmp\n[ -d packages ] && rm -rf packages\n[ -d .tmp ] && rm -rf .tmp\n[ -f nuget.exe ] && rm nuget.exe\n[ -f dotnet-intall.sh ] && rm dotnet-install.sh\n"
  },
  {
    "path": "tests/FlatBuffers.Test/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Newtonsoft.Json\" version=\"13.0.3\" />\n</packages>\n"
  },
  {
    "path": "tests/GoTest.sh",
    "content": "#!/bin/bash -eu\n#\n# Copyright 2014 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\npushd \"$(dirname $0)\" >/dev/null\ntest_dir=\"$(pwd)\"\ngo_path=${test_dir}/go_gen\ngo_src=${go_path}/src\n\n# Emit Go code for the example schemas in the test dir:\n../flatc -g --gen-object-api -I include_test -o ${go_src} monster_test.fbs optional_scalars.fbs\n../flatc -g --gen-object-api -I include_test/sub -o ${go_src} include_test/order.fbs\n../flatc -g --gen-object-api -o ${go_src}/Pizza include_test/sub/no_namespace.fbs\n../flatc -g --gen-object-api -o ${go_src} required_strings.fbs\n\n# Go requires a particular layout of files in order to link multiple packages.\n# Copy flatbuffer Go files to their own package directories to compile the\n# test binary:\nmkdir -p ${go_src}/github.com/google/flatbuffers/go\nmkdir -p ${go_src}/flatbuffers_test\n\ncp -a ../go/* ./go_gen/src/github.com/google/flatbuffers/go\ncp -a ./go_test.go ./go_gen/src/flatbuffers_test/\n\n# https://stackoverflow.com/a/63545857/7024978\n# We need to turn off go modules for this script\n# to work.\ngo env -w  GO111MODULE=off\n\n# Run tests with necessary flags.\n# Developers may wish to see more detail by appending the verbosity flag\n# -test.v to arguments for this command, as in:\n#   go -test -test.v ...\n# Developers may also wish to run benchmarks, which may be achieved with the\n# flag -test.bench and the wildcard regexp \".\":\n#   go -test -test.bench=. ...\nGOPATH=${go_path} go test flatbuffers_test \\\n                     --coverpkg=github.com/google/flatbuffers/go \\\n                     --cpp_data=${test_dir}/monsterdata_test.mon \\\n                     --out_data=${test_dir}/monsterdata_go_wire.mon \\\n                     --bench=. \\\n                     --benchtime=3s \\\n                     --fuzz=true \\\n                     --fuzz_fields=4 \\\n                     --fuzz_objects=10000\n\nGO_TEST_RESULT=$?\nrm -rf ${go_path}/{pkg,src}\nif [[ $GO_TEST_RESULT  == 0 ]]; then\n    echo \"OK: Go tests passed.\"\nelse\n    echo \"KO: Go tests failed.\"\n    exit 1\nfi\n\nNOT_FMT_FILES=$(gofmt -l .)\nif [[ ${NOT_FMT_FILES} != \"\" ]]; then\n    echo \"These files are not well gofmt'ed:\"\n    echo\n    echo \"${NOT_FMT_FILES}\"\n    # enable this when enums are properly formated\n    # exit 1\nfi\n\n# Re-enable go modules when done tests\ngo env -w  GO111MODULE=on\n"
  },
  {
    "path": "tests/KeywordTest/ABC.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace KeywordTest\n{\n\n[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]\npublic enum ABC : int\n{\n  @void = 0,\n  where = 1,\n  @stackalloc = 2,\n};\n\n\n}\n"
  },
  {
    "path": "tests/KeywordTest/KeywordsInTable.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace KeywordTest\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct KeywordsInTable : IFlatbufferObject\n{\n  private Table __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_25_12_19(); }\n  public static KeywordsInTable GetRootAsKeywordsInTable(ByteBuffer _bb) { return GetRootAsKeywordsInTable(_bb, new KeywordsInTable()); }\n  public static KeywordsInTable GetRootAsKeywordsInTable(ByteBuffer _bb, KeywordsInTable obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }\n  public KeywordsInTable __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public KeywordTest.ABC Is { get { int o = __p.__offset(4); return o != 0 ? (KeywordTest.ABC)__p.bb.GetInt(o + __p.bb_pos) : KeywordTest.ABC.@void; } }\n  public bool MutateIs(KeywordTest.ABC @is) { int o = __p.__offset(4); if (o != 0) { __p.bb.PutInt(o + __p.bb_pos, (int)@is); return true; } else { return false; } }\n  public KeywordTest.@public Private { get { int o = __p.__offset(6); return o != 0 ? (KeywordTest.@public)__p.bb.GetInt(o + __p.bb_pos) : KeywordTest.@public.NONE; } }\n  public bool MutatePrivate(KeywordTest.@public @private) { int o = __p.__offset(6); if (o != 0) { __p.bb.PutInt(o + __p.bb_pos, (int)@private); return true; } else { return false; } }\n  public int Type { get { int o = __p.__offset(8); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } }\n  public bool MutateType(int type) { int o = __p.__offset(8); if (o != 0) { __p.bb.PutInt(o + __p.bb_pos, type); return true; } else { return false; } }\n  public bool Default { get { int o = __p.__offset(10); return o != 0 ? 0!=__p.bb.Get(o + __p.bb_pos) : (bool)false; } }\n  public bool MutateDefault(bool @default) { int o = __p.__offset(10); if (o != 0) { __p.bb.Put(o + __p.bb_pos, (byte)(@default ? 1 : 0)); return true; } else { return false; } }\n\n  public static Offset<KeywordTest.KeywordsInTable> CreateKeywordsInTable(FlatBufferBuilder builder,\n      KeywordTest.ABC @is = KeywordTest.ABC.@void,\n      KeywordTest.@public @private = KeywordTest.@public.NONE,\n      int type = 0,\n      bool @default = false) {\n    builder.StartTable(4);\n    KeywordsInTable.AddType(builder, type);\n    KeywordsInTable.AddPrivate(builder, @private);\n    KeywordsInTable.AddIs(builder, @is);\n    KeywordsInTable.AddDefault(builder, @default);\n    return KeywordsInTable.EndKeywordsInTable(builder);\n  }\n\n  public static void StartKeywordsInTable(FlatBufferBuilder builder) { builder.StartTable(4); }\n  public static void AddIs(FlatBufferBuilder builder, KeywordTest.ABC @is) { builder.AddInt(0, (int)@is, 0); }\n  public static void AddPrivate(FlatBufferBuilder builder, KeywordTest.@public @private) { builder.AddInt(1, (int)@private, 0); }\n  public static void AddType(FlatBufferBuilder builder, int type) { builder.AddInt(2, type, 0); }\n  public static void AddDefault(FlatBufferBuilder builder, bool @default) { builder.AddBool(3, @default, false); }\n  public static Offset<KeywordTest.KeywordsInTable> EndKeywordsInTable(FlatBufferBuilder builder) {\n    int o = builder.EndTable();\n    return new Offset<KeywordTest.KeywordsInTable>(o);\n  }\n  public KeywordsInTableT UnPack() {\n    var _o = new KeywordsInTableT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(KeywordsInTableT _o) {\n    _o.Is = this.Is;\n    _o.Private = this.Private;\n    _o.Type = this.Type;\n    _o.Default = this.Default;\n  }\n  public static Offset<KeywordTest.KeywordsInTable> Pack(FlatBufferBuilder builder, KeywordsInTableT _o) {\n    if (_o == null) return default(Offset<KeywordTest.KeywordsInTable>);\n    return CreateKeywordsInTable(\n      builder,\n      _o.Is,\n      _o.Private,\n      _o.Type,\n      _o.Default);\n  }\n}\n\npublic class KeywordsInTableT\n{\n  [Newtonsoft.Json.JsonProperty(\"is\")]\n  public KeywordTest.ABC Is { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"private\")]\n  public KeywordTest.@public Private { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"type\")]\n  public int Type { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"default\")]\n  public bool Default { get; set; }\n\n  public KeywordsInTableT() {\n    this.Is = KeywordTest.ABC.@void;\n    this.Private = KeywordTest.@public.NONE;\n    this.Type = 0;\n    this.Default = false;\n  }\n}\n\n\nstatic public class KeywordsInTableVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos)\n  {\n    return verifier.VerifyTableStart(tablePos)\n      && verifier.VerifyField(tablePos, 4 /*Is*/, 4 /*KeywordTest.ABC*/, 4, false)\n      && verifier.VerifyField(tablePos, 6 /*Private*/, 4 /*KeywordTest.@public*/, 4, false)\n      && verifier.VerifyField(tablePos, 8 /*Type*/, 4 /*int*/, 4, false)\n      && verifier.VerifyField(tablePos, 10 /*Default*/, 1 /*bool*/, 1, false)\n      && verifier.VerifyTableEnd(tablePos);\n  }\n}\n\n}\n"
  },
  {
    "path": "tests/KeywordTest/KeywordsInUnion.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace KeywordTest\n{\n\n[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]\npublic enum KeywordsInUnion : byte\n{\n  NONE = 0,\n  @static = 1,\n  @internal = 2,\n};\n\npublic class KeywordsInUnionUnion {\n  public KeywordsInUnion Type { get; set; }\n  public object Value { get; set; }\n\n  public KeywordsInUnionUnion() {\n    this.Type = KeywordsInUnion.NONE;\n    this.Value = null;\n  }\n\n  public T As<T>() where T : class { return this.Value as T; }\n  public KeywordTest.KeywordsInTableT Asstatic() { return this.As<KeywordTest.KeywordsInTableT>(); }\n  public static KeywordsInUnionUnion Fromstatic(KeywordTest.KeywordsInTableT _static) { return new KeywordsInUnionUnion{ Type = KeywordsInUnion.@static, Value = _static }; }\n  public KeywordTest.KeywordsInTableT Asinternal() { return this.As<KeywordTest.KeywordsInTableT>(); }\n  public static KeywordsInUnionUnion Frominternal(KeywordTest.KeywordsInTableT _internal) { return new KeywordsInUnionUnion{ Type = KeywordsInUnion.@internal, Value = _internal }; }\n\n  public static int Pack(Google.FlatBuffers.FlatBufferBuilder builder, KeywordsInUnionUnion _o) {\n    switch (_o.Type) {\n      default: return 0;\n      case KeywordsInUnion.@static: return KeywordTest.KeywordsInTable.Pack(builder, _o.Asstatic()).Value;\n      case KeywordsInUnion.@internal: return KeywordTest.KeywordsInTable.Pack(builder, _o.Asinternal()).Value;\n    }\n  }\n}\n\npublic class KeywordsInUnionUnion_JsonConverter : Newtonsoft.Json.JsonConverter {\n  public override bool CanConvert(System.Type objectType) {\n    return objectType == typeof(KeywordsInUnionUnion) || objectType == typeof(System.Collections.Generic.List<KeywordsInUnionUnion>);\n  }\n  public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) {\n    var _olist = value as System.Collections.Generic.List<KeywordsInUnionUnion>;\n    if (_olist != null) {\n      writer.WriteStartArray();\n      foreach (var _o in _olist) { this.WriteJson(writer, _o, serializer); }\n      writer.WriteEndArray();\n    } else {\n      this.WriteJson(writer, value as KeywordsInUnionUnion, serializer);\n    }\n  }\n  public void WriteJson(Newtonsoft.Json.JsonWriter writer, KeywordsInUnionUnion _o, Newtonsoft.Json.JsonSerializer serializer) {\n    if (_o == null) return;\n    serializer.Serialize(writer, _o.Value);\n  }\n  public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) {\n    var _olist = existingValue as System.Collections.Generic.List<KeywordsInUnionUnion>;\n    if (_olist != null) {\n      for (var _j = 0; _j < _olist.Count; ++_j) {\n        reader.Read();\n        _olist[_j] = this.ReadJson(reader, _olist[_j], serializer);\n      }\n      reader.Read();\n      return _olist;\n    } else {\n      return this.ReadJson(reader, existingValue as KeywordsInUnionUnion, serializer);\n    }\n  }\n  public KeywordsInUnionUnion ReadJson(Newtonsoft.Json.JsonReader reader, KeywordsInUnionUnion _o, Newtonsoft.Json.JsonSerializer serializer) {\n    if (_o == null) return null;\n    switch (_o.Type) {\n      default: break;\n      case KeywordsInUnion.@static: _o.Value = serializer.Deserialize<KeywordTest.KeywordsInTableT>(reader); break;\n      case KeywordsInUnion.@internal: _o.Value = serializer.Deserialize<KeywordTest.KeywordsInTableT>(reader); break;\n    }\n    return _o;\n  }\n}\n\n\n\nstatic public class KeywordsInUnionVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)\n  {\n    bool result = true;\n    switch((KeywordsInUnion)typeId)\n    {\n      case KeywordsInUnion.@static:\n        result = KeywordTest.KeywordsInTableVerify.Verify(verifier, tablePos);\n        break;\n      case KeywordsInUnion.@internal:\n        result = KeywordTest.KeywordsInTableVerify.Verify(verifier, tablePos);\n        break;\n      default: result = true;\n        break;\n    }\n    return result;\n  }\n}\n\n\n}\n"
  },
  {
    "path": "tests/KeywordTest/Table2.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace KeywordTest\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct Table2 : IFlatbufferObject\n{\n  private Table __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_25_12_19(); }\n  public static Table2 GetRootAsTable2(ByteBuffer _bb) { return GetRootAsTable2(_bb, new Table2()); }\n  public static Table2 GetRootAsTable2(ByteBuffer _bb, Table2 obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }\n  public Table2 __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public KeywordTest.KeywordsInUnion TypeType { get { int o = __p.__offset(4); return o != 0 ? (KeywordTest.KeywordsInUnion)__p.bb.Get(o + __p.bb_pos) : KeywordTest.KeywordsInUnion.NONE; } }\n  public TTable? Type<TTable>() where TTable : struct, IFlatbufferObject { int o = __p.__offset(6); return o != 0 ? (TTable?)__p.__union<TTable>(o + __p.bb_pos) : null; }\n  public KeywordTest.KeywordsInTable TypeAsstatic() { return Type<KeywordTest.KeywordsInTable>().Value; }\n  public KeywordTest.KeywordsInTable TypeAsinternal() { return Type<KeywordTest.KeywordsInTable>().Value; }\n\n  public static Offset<KeywordTest.Table2> CreateTable2(FlatBufferBuilder builder,\n      KeywordTest.KeywordsInUnion type_type = KeywordTest.KeywordsInUnion.NONE,\n      int typeOffset = 0) {\n    builder.StartTable(2);\n    Table2.AddType(builder, typeOffset);\n    Table2.AddTypeType(builder, type_type);\n    return Table2.EndTable2(builder);\n  }\n\n  public static void StartTable2(FlatBufferBuilder builder) { builder.StartTable(2); }\n  public static void AddTypeType(FlatBufferBuilder builder, KeywordTest.KeywordsInUnion typeType) { builder.AddByte(0, (byte)typeType, 0); }\n  public static void AddType(FlatBufferBuilder builder, int typeOffset) { builder.AddOffset(1, typeOffset, 0); }\n  public static Offset<KeywordTest.Table2> EndTable2(FlatBufferBuilder builder) {\n    int o = builder.EndTable();\n    return new Offset<KeywordTest.Table2>(o);\n  }\n  public Table2T UnPack() {\n    var _o = new Table2T();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(Table2T _o) {\n    _o.Type = new KeywordTest.KeywordsInUnionUnion();\n    _o.Type.Type = this.TypeType;\n    switch (this.TypeType) {\n      default: break;\n      case KeywordTest.KeywordsInUnion.static:\n        _o.Type.Value = this.Type<KeywordTest.KeywordsInTable>().HasValue ? this.Type<KeywordTest.KeywordsInTable>().Value.UnPack() : null;\n        break;\n      case KeywordTest.KeywordsInUnion.internal:\n        _o.Type.Value = this.Type<KeywordTest.KeywordsInTable>().HasValue ? this.Type<KeywordTest.KeywordsInTable>().Value.UnPack() : null;\n        break;\n    }\n  }\n  public static Offset<KeywordTest.Table2> Pack(FlatBufferBuilder builder, Table2T _o) {\n    if (_o == null) return default(Offset<KeywordTest.Table2>);\n    var _type_type = _o.Type == null ? KeywordTest.KeywordsInUnion.NONE : _o.Type.Type;\n    var _type = _o.Type == null ? 0 : KeywordTest.KeywordsInUnionUnion.Pack(builder, _o.Type);\n    return CreateTable2(\n      builder,\n      _type_type,\n      _type);\n  }\n}\n\npublic class Table2T\n{\n  [Newtonsoft.Json.JsonProperty(\"type_type\")]\n  private KeywordTest.KeywordsInUnion TypeType {\n    get {\n      return this.Type != null ? this.Type.Type : KeywordTest.KeywordsInUnion.NONE;\n    }\n    set {\n      this.Type = new KeywordTest.KeywordsInUnionUnion();\n      this.Type.Type = value;\n    }\n  }\n  [Newtonsoft.Json.JsonProperty(\"type\")]\n  [Newtonsoft.Json.JsonConverter(typeof(KeywordTest.KeywordsInUnionUnion_JsonConverter))]\n  public KeywordTest.KeywordsInUnionUnion Type { get; set; }\n\n  public Table2T() {\n    this.Type = null;\n  }\n}\n\n\nstatic public class Table2Verify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos)\n  {\n    return verifier.VerifyTableStart(tablePos)\n      && verifier.VerifyField(tablePos, 4 /*TypeType*/, 1 /*KeywordTest.KeywordsInUnion*/, 1, false)\n      && verifier.VerifyUnion(tablePos, 4, 6 /*Type*/, KeywordTest.KeywordsInUnionVerify.Verify, false)\n      && verifier.VerifyTableEnd(tablePos);\n  }\n}\n\n}\n"
  },
  {
    "path": "tests/KeywordTest/public.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace KeywordTest\n{\n\n[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]\npublic enum @public : int\n{\n  NONE = 0,\n};\n\n\n}\n"
  },
  {
    "path": "tests/KotlinTest.kt",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport DictionaryLookup.*\nimport MyGame.Example.*\nimport NamespaceA.*\nimport NamespaceA.NamespaceB.*\nimport NamespaceA.NamespaceB.TableInNestedNS\nimport com.google.flatbuffers.ByteBufferUtil\nimport com.google.flatbuffers.Constants.SIZE_PREFIX_LENGTH\nimport com.google.flatbuffers.FlatBufferBuilder\nimport java.io.File\nimport java.io.FileOutputStream\nimport java.io.RandomAccessFile\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport java.nio.channels.FileChannel\nimport optional_scalars.*\n\n@kotlin.ExperimentalUnsignedTypes\nclass KotlinTest {\n\n  companion object {\n    @JvmStatic\n    fun main(args: Array<String>) {\n\n      // First, let's test reading a FlatBuffer generated by C++ code:\n      // This file was generated from monsterdata_test.json\n\n      val data =\n        RandomAccessFile(File(\"monsterdata_test.mon\"), \"r\").use {\n          val temp = ByteArray(it.length().toInt())\n          it.readFully(temp)\n          temp\n        }\n\n      // Now test it:\n\n      val bb = ByteBuffer.wrap(data)\n      TestBuffer(bb)\n\n      // Second, let's create a FlatBuffer from scratch in Java, and test it also.\n      // We use an initial size of 1 to exercise the reallocation algorithm,\n      // normally a size larger than the typical FlatBuffer you generate would be\n      // better for performance.\n      val fbb = FlatBufferBuilder(1)\n\n      TestBuilderBasics(fbb, true)\n      TestBuilderBasics(fbb, false)\n\n      TestExtendedBuffer(fbb.dataBuffer().asReadOnlyBuffer())\n\n      TestNamespaceNesting()\n\n      TestNestedFlatBuffer()\n\n      TestCreateByteVector()\n\n      TestCreateUninitializedVector()\n\n      TestByteBufferFactory()\n\n      TestSizedInputStream()\n\n      TestVectorOfUnions()\n\n      TestSharedStringPool()\n      TestScalarOptional()\n      TestDictionaryLookup()\n      TestNullFields()\n      println(\"FlatBuffers test: completed successfully\")\n    }\n\n    fun TestDictionaryLookup() {\n      val fbb = FlatBufferBuilder(16)\n      val lfIndex = LongFloatEntry.createLongFloatEntry(fbb, 0, 99.0f)\n      val vectorEntriesIdx = LongFloatMap.createEntriesVector(fbb, intArrayOf(lfIndex))\n      val rootIdx = LongFloatMap.createLongFloatMap(fbb, vectorEntriesIdx)\n\n      LongFloatMap.finishLongFloatMapBuffer(fbb, rootIdx)\n      val map = LongFloatMap.getRootAsLongFloatMap(fbb.dataBuffer())\n      assert(map.entriesLength == 1)\n\n      val e = map.entries(0)!!\n      assert(e.key == 0L)\n      assert(e.value == 99.0f)\n\n      val e2 = map.entriesByKey(0)!!\n      assert(e2.key == 0L)\n      assert(e2.value == 99.0f)\n    }\n\n    fun TestEnums() {\n      assert(Color.name(Color.Red.toInt()) == \"Red\")\n      assert(Color.name(Color.Blue.toInt()) == \"Blue\")\n      assert(Any_.name(Any_.NONE.toInt()) == \"NONE\")\n      assert(Any_.name(Any_.Monster.toInt()) == \"Monster\")\n    }\n\n    fun TestBuffer(bb: ByteBuffer) {\n      assert(Monster.MonsterBufferHasIdentifier(bb) == true)\n\n      val monster = Monster.getRootAsMonster(bb)\n\n      assert(monster.hp == 80.toShort())\n      assert(monster.mana == 150.toShort()) // default\n\n      assert(monster.name == \"MyMonster\")\n      // monster.friendly() // can't access, deprecated\n\n      val pos = monster.pos!!\n      assert(pos.x == 1.0f)\n      assert(pos.y == 2.0f)\n      assert(pos.z == 3.0f)\n      assert(pos.test1 == 3.0)\n      // issue: int != byte\n      assert(pos.test2 == Color.Green)\n      val t = pos.test3!!\n      assert(t.a == 5.toShort())\n      assert(t.b == 6.toByte())\n\n      assert(monster.testType == Any_.Monster)\n      val monster2 = Monster()\n      assert(monster.test(monster2) != null == true)\n      assert(monster2.name == \"Fred\")\n\n      assert(monster.inventoryLength == 5)\n      var invsum = 0u\n      for (i in 0 until monster.inventoryLength) invsum += monster.inventory(i)\n      assert(invsum == 10u)\n\n      // Alternative way of accessing a vector:\n      val ibb = monster.inventoryAsByteBuffer!!\n      invsum = 0u\n      while (ibb.position() < ibb.limit()) invsum += ibb.get().toUInt()\n      assert(invsum == 10u)\n\n      val test_0 = monster.test4(0)!!\n      val test_1 = monster.test4(1)!!\n      assert(monster.test4Length == 2)\n      assert(test_0.a + test_0.b + test_1.a + test_1.b == 100)\n\n      assert(monster.testarrayofstringLength == 2)\n      assert(monster.testarrayofstring(0) == \"test1\")\n      assert(monster.testarrayofstring(1) == \"test2\")\n\n      assert(monster.testbool == true)\n    }\n\n    // this method checks additional fields not present in the binary buffer read from file\n    // these new tests are performed on top of the regular tests\n    fun TestExtendedBuffer(bb: ByteBuffer) {\n      TestBuffer(bb)\n\n      val monster = Monster.getRootAsMonster(bb)\n\n      assert(monster.testhashu32Fnv1 == (Integer.MAX_VALUE + 1L).toUInt())\n    }\n\n    fun TestNamespaceNesting() {\n      // reference / manipulate these to verify compilation\n      val fbb = FlatBufferBuilder(1)\n\n      TableInNestedNS.startTableInNestedNS(fbb)\n      TableInNestedNS.addFoo(fbb, 1234)\n      val nestedTableOff = TableInNestedNS.endTableInNestedNS(fbb)\n\n      TableInFirstNS.startTableInFirstNS(fbb)\n      TableInFirstNS.addFooTable(fbb, nestedTableOff)\n    }\n\n    fun TestNestedFlatBuffer() {\n      val nestedMonsterName = \"NestedMonsterName\"\n      val nestedMonsterHp: Short = 600\n      val nestedMonsterMana: Short = 1024\n\n      var fbb1: FlatBufferBuilder? = FlatBufferBuilder(16)\n      val str1 = fbb1!!.createString(nestedMonsterName)\n      Monster.startMonster(fbb1)\n      Monster.addName(fbb1, str1)\n      Monster.addHp(fbb1, nestedMonsterHp)\n      Monster.addMana(fbb1, nestedMonsterMana)\n      val monster1 = Monster.endMonster(fbb1)\n      Monster.finishMonsterBuffer(fbb1, monster1)\n      val fbb1Bytes = fbb1.sizedByteArray()\n\n      val fbb2 = FlatBufferBuilder(16)\n      val str2 = fbb2.createString(\"My Monster\")\n      val nestedBuffer = Monster.createTestnestedflatbufferVector(fbb2, fbb1Bytes.asUByteArray())\n      Monster.startMonster(fbb2)\n      Monster.addName(fbb2, str2)\n      Monster.addHp(fbb2, 50.toShort())\n      Monster.addMana(fbb2, 32.toShort())\n      Monster.addTestnestedflatbuffer(fbb2, nestedBuffer)\n      val monster = Monster.endMonster(fbb2)\n      Monster.finishMonsterBuffer(fbb2, monster)\n\n      // Now test the data extracted from the nested buffer\n      val mons = Monster.getRootAsMonster(fbb2.dataBuffer())\n      val nestedMonster = mons.testnestedflatbufferAsMonster!!\n\n      assert(nestedMonsterMana == nestedMonster.mana)\n      assert(nestedMonsterHp == nestedMonster.hp)\n      assert(nestedMonsterName == nestedMonster.name)\n    }\n\n    fun TestCreateByteVector() {\n      val fbb = FlatBufferBuilder(16)\n      val str = fbb.createString(\"MyMonster\")\n      val inventory = byteArrayOf(0, 1, 2, 3, 4)\n      val vec = fbb.createByteVector(inventory)\n      Monster.startMonster(fbb)\n      Monster.addInventory(fbb, vec)\n      Monster.addName(fbb, str)\n      val monster1 = Monster.endMonster(fbb)\n      Monster.finishMonsterBuffer(fbb, monster1)\n      val monsterObject = Monster.getRootAsMonster(fbb.dataBuffer())\n\n      assert(monsterObject.inventory(1) == inventory[1].toUByte())\n      assert(monsterObject.inventoryLength == inventory.size)\n      assert(ByteBuffer.wrap(inventory) == monsterObject.inventoryAsByteBuffer)\n    }\n\n    fun TestCreateUninitializedVector() {\n      val fbb = FlatBufferBuilder(16)\n      val str = fbb.createString(\"MyMonster\")\n      val inventory = byteArrayOf(0, 1, 2, 3, 4)\n      val bb = fbb.createUnintializedVector(1, inventory.size, 1)\n      for (i in inventory) {\n        bb.put(i)\n      }\n      val vec = fbb.endVector()\n      Monster.startMonster(fbb)\n      Monster.addInventory(fbb, vec)\n      Monster.addName(fbb, str)\n      val monster1 = Monster.endMonster(fbb)\n      Monster.finishMonsterBuffer(fbb, monster1)\n      val monsterObject = Monster.getRootAsMonster(fbb.dataBuffer())\n\n      assert(monsterObject.inventory(1) == inventory[1].toUByte())\n      assert(monsterObject.inventoryLength == inventory.size)\n      assert(ByteBuffer.wrap(inventory) == monsterObject.inventoryAsByteBuffer)\n    }\n\n    fun TestByteBufferFactory() {\n      class MappedByteBufferFactory : FlatBufferBuilder.ByteBufferFactory() {\n        override fun newByteBuffer(capacity: Int): ByteBuffer? {\n          var bb: ByteBuffer?\n          try {\n            bb =\n              RandomAccessFile(\"javatest.bin\", \"rw\")\n                .channel\n                .map(FileChannel.MapMode.READ_WRITE, 0, capacity.toLong())\n                .order(ByteOrder.LITTLE_ENDIAN)\n          } catch (e: Throwable) {\n            println(\"FlatBuffers test: couldn't map ByteBuffer to a file\")\n            bb = null\n          }\n\n          return bb\n        }\n      }\n\n      val fbb = FlatBufferBuilder(1, MappedByteBufferFactory())\n\n      TestBuilderBasics(fbb, false)\n    }\n\n    fun TestSizedInputStream() {\n      // Test on default FlatBufferBuilder that uses HeapByteBuffer\n      val fbb = FlatBufferBuilder(1)\n\n      TestBuilderBasics(fbb, false)\n\n      val `in` = fbb.sizedInputStream()\n      val array = fbb.sizedByteArray()\n      var count = 0\n      var currentVal = 0\n\n      while (currentVal != -1 && count < array.size) {\n        try {\n          currentVal = `in`.read()\n        } catch (e: java.io.IOException) {\n          println(\"FlatBuffers test: couldn't read from InputStream\")\n          return\n        }\n\n        assert(currentVal.toByte() == array[count])\n        count++\n      }\n      assert(count == array.size)\n    }\n\n    fun TestBuilderBasics(fbb: FlatBufferBuilder, sizePrefix: Boolean) {\n      val names =\n        intArrayOf(fbb.createString(\"Frodo\"), fbb.createString(\"Barney\"), fbb.createString(\"Wilma\"))\n      val off = IntArray(3)\n      Monster.startMonster(fbb)\n      Monster.addName(fbb, names[0])\n      off[0] = Monster.endMonster(fbb)\n      Monster.startMonster(fbb)\n      Monster.addName(fbb, names[1])\n      off[1] = Monster.endMonster(fbb)\n      Monster.startMonster(fbb)\n      Monster.addName(fbb, names[2])\n      off[2] = Monster.endMonster(fbb)\n      val sortMons = fbb.createSortedVectorOfTables(Monster(), off)\n\n      // We set up the same values as monsterdata.json:\n\n      val str = fbb.createString(\"MyMonster\")\n\n      val inv = Monster.createInventoryVector(fbb, byteArrayOf(0, 1, 2, 3, 4).asUByteArray())\n\n      val fred = fbb.createString(\"Fred\")\n      Monster.startMonster(fbb)\n      Monster.addName(fbb, fred)\n      val mon2 = Monster.endMonster(fbb)\n\n      Monster.startTest4Vector(fbb, 2)\n      Test.createTest(fbb, 10.toShort(), 20.toByte())\n      Test.createTest(fbb, 30.toShort(), 40.toByte())\n      val test4 = fbb.endVector()\n\n      val testArrayOfString =\n        Monster.createTestarrayofstringVector(\n          fbb,\n          intArrayOf(fbb.createString(\"test1\"), fbb.createString(\"test2\")),\n        )\n\n      Monster.startMonster(fbb)\n      Monster.addPos(\n        fbb,\n        Vec3.createVec3(fbb, 1.0f, 2.0f, 3.0f, 3.0, Color.Green, 5.toShort(), 6.toByte()),\n      )\n      Monster.addHp(fbb, 80.toShort())\n      Monster.addName(fbb, str)\n      Monster.addInventory(fbb, inv)\n      Monster.addTestType(fbb, Any_.Monster)\n      Monster.addTest(fbb, mon2)\n      Monster.addTest4(fbb, test4)\n      Monster.addTestarrayofstring(fbb, testArrayOfString)\n      Monster.addTestbool(fbb, true)\n      Monster.addTesthashu32Fnv1(fbb, (Integer.MAX_VALUE + 1L).toUInt())\n      Monster.addTestarrayoftables(fbb, sortMons)\n      val mon = Monster.endMonster(fbb)\n\n      if (sizePrefix) {\n        Monster.finishSizePrefixedMonsterBuffer(fbb, mon)\n      } else {\n        Monster.finishMonsterBuffer(fbb, mon)\n      }\n\n      // Write the result to a file for debugging purposes:\n      // Note that the binaries are not necessarily identical, since the JSON\n      // parser may serialize in a slightly different order than the above\n      // Java code. They are functionally equivalent though.\n\n      try {\n        val filename = \"monsterdata_java_wire\" + (if (sizePrefix) \"_sp\" else \"\") + \".mon\"\n        val fc = FileOutputStream(filename).channel\n        fc.write(fbb.dataBuffer().duplicate())\n        fc.close()\n      } catch (e: java.io.IOException) {\n        println(\"FlatBuffers test: couldn't write file\")\n        return\n      }\n\n      // Test it:\n      var dataBuffer = fbb.dataBuffer()\n      if (sizePrefix) {\n        assert(\n          ByteBufferUtil.getSizePrefix(dataBuffer) + SIZE_PREFIX_LENGTH == dataBuffer.remaining()\n        )\n        dataBuffer = ByteBufferUtil.removeSizePrefix(dataBuffer)\n      }\n      TestExtendedBuffer(dataBuffer)\n\n      // Make sure it also works with read only ByteBuffers. This is slower,\n      // since creating strings incurs an additional copy\n      // (see Table.__string).\n      TestExtendedBuffer(dataBuffer.asReadOnlyBuffer())\n\n      TestEnums()\n\n      // Attempt to mutate Monster fields and check whether the buffer has been mutated properly\n      // revert to original values after testing\n      val monster = Monster.getRootAsMonster(dataBuffer)\n\n      // mana is optional and does not exist in the buffer so the mutation should fail\n      // the mana field should retain its default value\n      assert(monster.mutateMana(10.toShort()) == false)\n      assert(monster.mana == 150.toShort())\n\n      // Accessing a vector of sorted by the key tables\n      assert(monster.testarrayoftables(0)!!.name == \"Barney\")\n      assert(monster.testarrayoftables(1)!!.name == \"Frodo\")\n      assert(monster.testarrayoftables(2)!!.name == \"Wilma\")\n\n      // Example of searching for a table by the key\n      assert(monster.testarrayoftablesByKey(\"Frodo\")!!.name == \"Frodo\")\n      assert(monster.testarrayoftablesByKey(\"Barney\")!!.name == \"Barney\")\n      assert(monster.testarrayoftablesByKey(\"Wilma\")!!.name == \"Wilma\")\n\n      // testType is an existing field and mutating it should succeed\n      assert(monster.testType == Any_.Monster)\n      assert(monster.mutateTestType(Any_.NONE) == true)\n      assert(monster.testType == Any_.NONE)\n      assert(monster.mutateTestType(Any_.Monster) == true)\n      assert(monster.testType == Any_.Monster)\n\n      // mutate the inventory vector\n      assert(monster.mutateInventory(0, 1u) == true)\n      assert(monster.mutateInventory(1, 2u) == true)\n      assert(monster.mutateInventory(2, 3u) == true)\n      assert(monster.mutateInventory(3, 4u) == true)\n      assert(monster.mutateInventory(4, 5u) == true)\n\n      for (i in 0 until monster.inventoryLength) {\n        assert(monster.inventory(i) == (i.toUByte() + 1u).toUByte())\n      }\n\n      // reverse mutation\n      assert(monster.mutateInventory(0, 0u) == true)\n      assert(monster.mutateInventory(1, 1u) == true)\n      assert(monster.mutateInventory(2, 2u) == true)\n      assert(monster.mutateInventory(3, 3u) == true)\n      assert(monster.mutateInventory(4, 4u) == true)\n\n      // get a struct field and edit one of its fields\n      val pos = monster.pos!!\n      assert(pos.x == 1.0f)\n      pos.mutateX(55.0f)\n      assert(pos.x == 55.0f)\n      pos.mutateX(1.0f)\n      assert(pos.x == 1.0f)\n    }\n\n    fun TestVectorOfUnions() {\n      val fbb = FlatBufferBuilder()\n\n      val swordAttackDamage = 1\n\n      val characterVector = intArrayOf(Attacker.createAttacker(fbb, swordAttackDamage))\n\n      val characterTypeVector = ubyteArrayOf(Character_.MuLan)\n\n      Movie.finishMovieBuffer(\n        fbb,\n        Movie.createMovie(\n          fbb,\n          0u,\n          0,\n          Movie.createCharactersTypeVector(fbb, characterTypeVector),\n          Movie.createCharactersVector(fbb, characterVector),\n        ),\n      )\n\n      val movie = Movie.getRootAsMovie(fbb.dataBuffer())\n\n      assert(movie.charactersTypeLength == characterTypeVector.size)\n      assert(movie.charactersLength == characterVector.size)\n\n      assert(movie.charactersType(0) == characterTypeVector[0])\n\n      assert((movie.characters(Attacker(), 0) as Attacker).swordAttackDamage == swordAttackDamage)\n    }\n\n    fun TestSharedStringPool() {\n      val fb = FlatBufferBuilder(1)\n      val testString = \"My string\"\n      val offset = fb.createSharedString(testString)\n      for (i in 0..10) {\n        assert(offset == fb.createSharedString(testString))\n      }\n    }\n\n    fun TestScalarOptional() {\n      val fbb = FlatBufferBuilder(1)\n      ScalarStuff.startScalarStuff(fbb)\n      var pos = ScalarStuff.endScalarStuff(fbb)\n      fbb.finish(pos)\n\n      var scalarStuff = ScalarStuff.getRootAsScalarStuff(fbb.dataBuffer())\n\n      assert(scalarStuff.justI8 == 0.toByte())\n      assert(scalarStuff.maybeI8 == null)\n      assert(scalarStuff.defaultI8 == 42.toByte())\n      assert(scalarStuff.justU8 == 0.toUByte())\n      assert(scalarStuff.maybeU8 == null)\n      assert(scalarStuff.defaultU8 == 42.toUByte())\n      assert(scalarStuff.justI16 == 0.toShort())\n      assert(scalarStuff.maybeI16 == null)\n      assert(scalarStuff.defaultI16 == 42.toShort())\n      assert(scalarStuff.justU16 == 0.toUShort())\n      assert(scalarStuff.maybeU16 == null)\n      assert(scalarStuff.defaultU16 == 42.toUShort())\n      assert(scalarStuff.justI32 == 0)\n      assert(scalarStuff.maybeI32 == null)\n      assert(scalarStuff.defaultI32 == 42)\n      assert(scalarStuff.justU32 == 0.toUInt())\n      assert(scalarStuff.maybeU32 == null)\n      assert(scalarStuff.defaultU32 == 42U)\n      assert(scalarStuff.justI64 == 0L)\n      assert(scalarStuff.maybeI64 == null)\n      assert(scalarStuff.defaultI64 == 42L)\n      assert(scalarStuff.justU64 == 0UL)\n      assert(scalarStuff.maybeU64 == null)\n      assert(scalarStuff.defaultU64 == 42UL)\n      assert(scalarStuff.justF32 == 0.0f)\n      assert(scalarStuff.maybeF32 == null)\n      assert(scalarStuff.defaultF32 == 42.0f)\n      assert(scalarStuff.justF64 == 0.0)\n      assert(scalarStuff.maybeF64 == null)\n      assert(scalarStuff.defaultF64 == 42.0)\n      assert(scalarStuff.justBool == false)\n      assert(scalarStuff.maybeBool == null)\n      assert(scalarStuff.defaultBool == true)\n      assert(scalarStuff.justEnum == OptionalByte.None)\n      assert(scalarStuff.maybeEnum == null)\n      assert(scalarStuff.defaultEnum == OptionalByte.One)\n\n      fbb.clear()\n\n      ScalarStuff.startScalarStuff(fbb)\n      ScalarStuff.addJustI8(fbb, 5.toByte())\n      ScalarStuff.addMaybeI8(fbb, 5.toByte())\n      ScalarStuff.addDefaultI8(fbb, 5.toByte())\n      ScalarStuff.addJustU8(fbb, 6.toUByte())\n      ScalarStuff.addMaybeU8(fbb, 6.toUByte())\n      ScalarStuff.addDefaultU8(fbb, 6.toUByte())\n      ScalarStuff.addJustI16(fbb, 7.toShort())\n      ScalarStuff.addMaybeI16(fbb, 7.toShort())\n      ScalarStuff.addDefaultI16(fbb, 7.toShort())\n      ScalarStuff.addJustU16(fbb, 8.toUShort())\n      ScalarStuff.addMaybeU16(fbb, 8.toUShort())\n      ScalarStuff.addDefaultU16(fbb, 8.toUShort())\n      ScalarStuff.addJustI32(fbb, 9)\n      ScalarStuff.addMaybeI32(fbb, 9)\n      ScalarStuff.addDefaultI32(fbb, 9)\n      ScalarStuff.addJustU32(fbb, 10.toUInt())\n      ScalarStuff.addMaybeU32(fbb, 10.toUInt())\n      ScalarStuff.addDefaultU32(fbb, 10.toUInt())\n      ScalarStuff.addJustI64(fbb, 11L)\n      ScalarStuff.addMaybeI64(fbb, 11L)\n      ScalarStuff.addDefaultI64(fbb, 11L)\n      ScalarStuff.addJustU64(fbb, 12UL)\n      ScalarStuff.addMaybeU64(fbb, 12UL)\n      ScalarStuff.addDefaultU64(fbb, 12UL)\n      ScalarStuff.addJustF32(fbb, 13.0f)\n      ScalarStuff.addMaybeF32(fbb, 13.0f)\n      ScalarStuff.addDefaultF32(fbb, 13.0f)\n      ScalarStuff.addJustF64(fbb, 14.0)\n      ScalarStuff.addMaybeF64(fbb, 14.0)\n      ScalarStuff.addDefaultF64(fbb, 14.0)\n      ScalarStuff.addJustBool(fbb, true)\n      ScalarStuff.addMaybeBool(fbb, true)\n      ScalarStuff.addDefaultBool(fbb, true)\n      ScalarStuff.addJustEnum(fbb, OptionalByte.Two)\n      ScalarStuff.addMaybeEnum(fbb, OptionalByte.Two)\n      ScalarStuff.addDefaultEnum(fbb, OptionalByte.Two)\n\n      pos = ScalarStuff.endScalarStuff(fbb)\n\n      fbb.finish(pos)\n\n      scalarStuff = ScalarStuff.getRootAsScalarStuff(fbb.dataBuffer())\n\n      assert(scalarStuff.justI8 == 5.toByte())\n      assert(scalarStuff.maybeI8 == 5.toByte())\n      assert(scalarStuff.defaultI8 == 5.toByte())\n      assert(scalarStuff.justU8 == 6.toUByte())\n      assert(scalarStuff.maybeU8 == 6.toUByte())\n      assert(scalarStuff.defaultU8 == 6.toUByte())\n      assert(scalarStuff.justI16 == 7.toShort())\n      assert(scalarStuff.maybeI16 == 7.toShort())\n      assert(scalarStuff.defaultI16 == 7.toShort())\n      assert(scalarStuff.justU16 == 8.toUShort())\n      assert(scalarStuff.maybeU16 == 8.toUShort())\n      assert(scalarStuff.defaultU16 == 8.toUShort())\n      assert(scalarStuff.justI32 == 9)\n      assert(scalarStuff.maybeI32 == 9)\n      assert(scalarStuff.defaultI32 == 9)\n      assert(scalarStuff.justU32 == 10u)\n      assert(scalarStuff.maybeU32 == 10u)\n      assert(scalarStuff.defaultU32 == 10u)\n      assert(scalarStuff.justI64 == 11L)\n      assert(scalarStuff.maybeI64 == 11L)\n      assert(scalarStuff.defaultI64 == 11L)\n      assert(scalarStuff.justU64 == 12UL)\n      assert(scalarStuff.maybeU64 == 12UL)\n      assert(scalarStuff.defaultU64 == 12UL)\n      assert(scalarStuff.justF32 == 13.0f)\n      assert(scalarStuff.maybeF32 == 13.0f)\n      assert(scalarStuff.defaultF32 == 13.0f)\n      assert(scalarStuff.justF64 == 14.0)\n      assert(scalarStuff.maybeF64 == 14.0)\n      assert(scalarStuff.defaultF64 == 14.0)\n      assert(scalarStuff.justBool == true)\n      assert(scalarStuff.maybeBool == true)\n      assert(scalarStuff.defaultBool == true)\n      assert(scalarStuff.justEnum == OptionalByte.Two)\n      assert(scalarStuff.maybeEnum == OptionalByte.Two)\n      assert(scalarStuff.defaultEnum == OptionalByte.Two)\n    }\n\n    fun TestNullFields() {\n      val fbb = FlatBufferBuilder(1)\n      val nameOffset = fbb.createString(\"name\")\n      Monster.startMonster(fbb)\n      Monster.addName(fbb, nameOffset)\n      Monster.finishMonsterBuffer(fbb, Monster.endMonster(fbb))\n\n      val monsterBb = fbb.dataBuffer()\n      val monster = Monster.getRootAsMonster(monsterBb.duplicate())\n      assert(monster.pos == null) // struct\n      assert(monster.enemy == null) // table\n      assert(monster.test(Monster()) == null) // union\n      assert(monster.testType == Any_.NONE)\n      assert(monster.inventoryLength == 0) // vector of scalars\n      assert(monster.inventoryAsByteBuffer == null)\n      assert(monster.inventoryInByteBuffer(monsterBb) == null)\n      assert(monster.testarrayofsortedstructLength == 0) // vector of structs\n      assert(monster.testarrayofstringLength == 0) // vector of strings\n      assert(monster.testarrayoftablesLength == 0) // vector of tables\n\n\n      val fbb2 = FlatBufferBuilder(1)\n      val offset = Stat.createStat(fbb2, 0, 10, 10.toUShort())\n      fbb2.finish(offset)\n\n      val statBb = fbb2.dataBuffer()\n      val stat = Stat.getRootAsStat(statBb.duplicate())\n      assert(stat.id == null) // string\n      assert(stat.idAsByteBuffer == null)\n      assert(stat.idInByteBuffer(statBb) == null)\n    }\n  }\n}\n"
  },
  {
    "path": "tests/KotlinTest.sh",
    "content": "#!/bin/sh\n\n# Copyright 2014 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\necho Compile then run the Kotlin test.\n\ntestdir=$(dirname $0)\ntargetdir=\"${testdir}/kotlin\"\n\nif [[ -e \"${targetdir}\" ]]; then\n    echo \"cleaning target\"\n    rm -rf \"${targetdir}\"\nfi\n\nmkdir -v \"${targetdir}\"\n\nif ! find \"${testdir}/../java\" -type f -name \"*.class\" -delete; then\n    echo \"failed to clean .class files from java directory\" >&2\n    exit 1\nfi\n\nall_kt_files=`find . -name \"*.kt\" -print`\n\n# Compile java FlatBuffer library \njavac ${testdir}/../java/src/main/java/com/google/flatbuffers/*.java -d $targetdir\n# Compile Kotlin files\nkotlinc $all_kt_files -classpath $targetdir -include-runtime -d $targetdir\n# Make jar\njar cvf ${testdir}/kotlin_test.jar -C $targetdir . > /dev/null\n# Run test\nkotlin -J\"-ea\" -cp ${testdir}/kotlin_test.jar KotlinTest\n# clean up\nrm -rf $targetdir\nrm ${testdir}/kotlin_test.jar\n"
  },
  {
    "path": "tests/LobsterTest.bat",
    "content": "..\\Release\\flatc.exe --lobster -I include_test monster_test.fbs\n..\\Release\\flatc.exe --lobster -I include_test optional_scalars.fbs\n..\\..\\lobster\\bin\\lobster.exe .\\lobstertest.lobster\n"
  },
  {
    "path": "tests/LuaTest.bat",
    "content": "set buildtype=Release\nif \"%1\"==\"-b\" set buildtype=%2\n\necho Run with LuaJIT:\nluajit.exe luatest.lua\necho Run with Lua 5.3:\nlua53.exe luatest.lua"
  },
  {
    "path": "tests/LuaTest.sh",
    "content": "#!/bin/bash -eu\n#\n# Copyright 2019 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\npushd \"$(dirname $0)\" >/dev/null\ntest_dir=\"$(pwd)\"\n\ndeclare -a versions=(luajit lua5.1 lua5.2 lua5.3 lua5.4)\n\nfor i in \"${versions[@]}\"\ndo\n    if command -v $i &> /dev/null\n    then\n        echo \"[$i]\"\n        $i luatest.lua\n    fi\ndone\n"
  },
  {
    "path": "tests/MoreDefaults.nim",
    "content": "#[ MoreDefaults\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : \n]#\n\nimport Abc as Abc\nimport flatbuffers\n\ntype MoreDefaults* = object of FlatObj\nfunc intsLength*(self: MoreDefaults): int = \n  let o = self.tab.Offset(4)\n  if o != 0:\n    return self.tab.VectorLen(o)\nfunc ints*(self: MoreDefaults, j: int): int32 = \n  let o = self.tab.Offset(4)\n  if o != 0:\n    var x = self.tab.Vector(o)\n    x += j.uoffset * 4.uoffset\n    return Get[int32](self.tab, x)\nfunc ints*(self: MoreDefaults): seq[int32] = \n  let len = self.intsLength\n  for i in countup(0, len - 1):\n    result.add(self.ints(i))\nfunc floatsLength*(self: MoreDefaults): int = \n  let o = self.tab.Offset(6)\n  if o != 0:\n    return self.tab.VectorLen(o)\nfunc floats*(self: MoreDefaults, j: int): float32 = \n  let o = self.tab.Offset(6)\n  if o != 0:\n    var x = self.tab.Vector(o)\n    x += j.uoffset * 4.uoffset\n    return Get[float32](self.tab, x)\nfunc floats*(self: MoreDefaults): seq[float32] = \n  let len = self.floatsLength\n  for i in countup(0, len - 1):\n    result.add(self.floats(i))\nfunc emptyString*(self: MoreDefaults): string =\n  let o = self.tab.Offset(8)\n  if o != 0:\n    return self.tab.String(self.tab.Pos + o)\n  return \"\"\nfunc someString*(self: MoreDefaults): string =\n  let o = self.tab.Offset(10)\n  if o != 0:\n    return self.tab.String(self.tab.Pos + o)\n  return \"\"\nfunc abcsLength*(self: MoreDefaults): int = \n  let o = self.tab.Offset(12)\n  if o != 0:\n    return self.tab.VectorLen(o)\nfunc abcs*(self: MoreDefaults, j: int): Abc.Abc = \n  let o = self.tab.Offset(12)\n  if o != 0:\n    var x = self.tab.Vector(o)\n    x += j.uoffset * 4.uoffset\n    return Abc.Abc(Get[int32](self.tab, x))\nfunc abcs*(self: MoreDefaults): seq[Abc.Abc] = \n  let len = self.abcsLength\n  for i in countup(0, len - 1):\n    result.add(self.abcs(i))\nfunc boolsLength*(self: MoreDefaults): int = \n  let o = self.tab.Offset(14)\n  if o != 0:\n    return self.tab.VectorLen(o)\nfunc bools*(self: MoreDefaults, j: int): bool = \n  let o = self.tab.Offset(14)\n  if o != 0:\n    var x = self.tab.Vector(o)\n    x += j.uoffset * 1.uoffset\n    return Get[bool](self.tab, x)\nfunc bools*(self: MoreDefaults): seq[bool] = \n  let len = self.boolsLength\n  for i in countup(0, len - 1):\n    result.add(self.bools(i))\nproc MoreDefaultsStart*(builder: var Builder) =\n  builder.StartObject(6)\nproc MoreDefaultsAddints*(builder: var Builder, ints: uoffset) =\n  builder.PrependSlot(0, ints, default(uoffset))\nproc MoreDefaultsStartintsVector*(builder: var Builder, numElems: uoffset) =\n  builder.StartVector(4, numElems, 4)\nproc MoreDefaultsAddfloats*(builder: var Builder, floats: uoffset) =\n  builder.PrependSlot(1, floats, default(uoffset))\nproc MoreDefaultsStartfloatsVector*(builder: var Builder, numElems: uoffset) =\n  builder.StartVector(4, numElems, 4)\nproc MoreDefaultsAddemptyString*(builder: var Builder, emptyString: uoffset) =\n  builder.PrependSlot(2, emptyString, default(uoffset))\nproc MoreDefaultsAddsomeString*(builder: var Builder, someString: uoffset) =\n  builder.PrependSlot(3, someString, default(uoffset))\nproc MoreDefaultsAddabcs*(builder: var Builder, abcs: uoffset) =\n  builder.PrependSlot(4, abcs, default(uoffset))\nproc MoreDefaultsStartabcsVector*(builder: var Builder, numElems: uoffset) =\n  builder.StartVector(4, numElems, 4)\nproc MoreDefaultsAddbools*(builder: var Builder, bools: uoffset) =\n  builder.PrependSlot(5, bools, default(uoffset))\nproc MoreDefaultsStartboolsVector*(builder: var Builder, numElems: uoffset) =\n  builder.StartVector(1, numElems, 1)\nproc MoreDefaultsEnd*(builder: var Builder): uoffset =\n  return builder.EndObject()\n"
  },
  {
    "path": "tests/MutatingBool.fbs",
    "content": "\nstruct Property {\n  property: bool;\n}\n\ntable TestMutatingBool {\n  b: Property;\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Ability.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace MyGame.Example\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct Ability : IFlatbufferObject\n{\n  private Struct __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Struct(_i, _bb); }\n  public Ability __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public uint Id { get { return __p.bb.GetUint(__p.bb_pos + 0); } }\n  public void MutateId(uint id) { __p.bb.PutUint(__p.bb_pos + 0, id); }\n  public uint Distance { get { return __p.bb.GetUint(__p.bb_pos + 4); } }\n  public void MutateDistance(uint distance) { __p.bb.PutUint(__p.bb_pos + 4, distance); }\n\n  public static Offset<MyGame.Example.Ability> CreateAbility(FlatBufferBuilder builder, uint Id, uint Distance) {\n    builder.Prep(4, 8);\n    builder.PutUint(Distance);\n    builder.PutUint(Id);\n    return new Offset<MyGame.Example.Ability>(builder.Offset);\n  }\n  public AbilityT UnPack() {\n    var _o = new AbilityT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(AbilityT _o) {\n    _o.Id = this.Id;\n    _o.Distance = this.Distance;\n  }\n  public static Offset<MyGame.Example.Ability> Pack(FlatBufferBuilder builder, AbilityT _o) {\n    if (_o == null) return default(Offset<MyGame.Example.Ability>);\n    return CreateAbility(\n      builder,\n      _o.Id,\n      _o.Distance);\n  }\n}\n\npublic class AbilityT\n{\n  [Newtonsoft.Json.JsonProperty(\"id\")]\n  public uint Id { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"distance\")]\n  public uint Distance { get; set; }\n\n  public AbilityT() {\n    this.Id = 0;\n    this.Distance = 0;\n  }\n}\n\n\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Ability.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage Example\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n)\n\ntype AbilityT struct {\n\tId uint32 `json:\"id\"`\n\tDistance uint32 `json:\"distance\"`\n}\n\nfunc (t *AbilityT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\tif t == nil {\n\t\treturn 0\n\t}\n\treturn CreateAbility(builder, t.Id, t.Distance)\n}\nfunc (rcv *Ability) UnPackTo(t *AbilityT) {\n\tt.Id = rcv.Id()\n\tt.Distance = rcv.Distance()\n}\n\nfunc (rcv *Ability) UnPack() *AbilityT {\n\tif rcv == nil {\n\t\treturn nil\n\t}\n\tt := &AbilityT{}\n\trcv.UnPackTo(t)\n\treturn t\n}\n\ntype Ability struct {\n\t_tab flatbuffers.Struct\n}\n\nfunc (rcv *Ability) Init(buf []byte, i flatbuffers.UOffsetT) {\n\trcv._tab.Bytes = buf\n\trcv._tab.Pos = i\n}\n\nfunc (rcv *Ability) Table() flatbuffers.Table {\n\treturn rcv._tab.Table\n}\n\nfunc (rcv *Ability) Id() uint32 {\n\treturn rcv._tab.GetUint32(rcv._tab.Pos + flatbuffers.UOffsetT(0))\n}\nfunc (rcv *Ability) MutateId(n uint32) bool {\n\treturn rcv._tab.MutateUint32(rcv._tab.Pos+flatbuffers.UOffsetT(0), n)\n}\n\nfunc (rcv *Ability) Distance() uint32 {\n\treturn rcv._tab.GetUint32(rcv._tab.Pos + flatbuffers.UOffsetT(4))\n}\nfunc (rcv *Ability) MutateDistance(n uint32) bool {\n\treturn rcv._tab.MutateUint32(rcv._tab.Pos+flatbuffers.UOffsetT(4), n)\n}\n\nfunc CreateAbility(builder *flatbuffers.Builder, id uint32, distance uint32) flatbuffers.UOffsetT {\n\tbuilder.Prep(4, 8)\n\tbuilder.PrependUint32(distance)\n\tbuilder.PrependUint32(id)\n\treturn builder.Offset()\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Ability.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class Ability extends Struct {\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public Ability __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public long id() { return (long)bb.getInt(bb_pos + 0) & 0xFFFFFFFFL; }\n  public void mutateId(long id) { bb.putInt(bb_pos + 0, (int) id); }\n  public long distance() { return (long)bb.getInt(bb_pos + 4) & 0xFFFFFFFFL; }\n  public void mutateDistance(long distance) { bb.putInt(bb_pos + 4, (int) distance); }\n\n  public static int createAbility(FlatBufferBuilder builder, long id, long distance) {\n    builder.prep(4, 8);\n    builder.putInt((int) distance);\n    builder.putInt((int) id);\n    return builder.offset();\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public Ability get(int j) { return get(new Ability(), j); }\n    public Ability get(Ability obj, int j) {  return obj.__assign(__element(j), bb); }\n  }\n  public AbilityT unpack() {\n    AbilityT _o = new AbilityT();\n    unpackTo(_o);\n    return _o;\n  }\n  public void unpackTo(AbilityT _o) {\n    long _oId = id();\n    _o.setId(_oId);\n    long _oDistance = distance();\n    _o.setDistance(_oDistance);\n  }\n  public static int pack(FlatBufferBuilder builder, AbilityT _o) {\n    if (_o == null) return 0;\n    return createAbility(\n      builder,\n      _o.getId(),\n      _o.getDistance());\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/Ability.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example\n\nimport com.google.flatbuffers.BaseVector\nimport com.google.flatbuffers.BooleanVector\nimport com.google.flatbuffers.ByteVector\nimport com.google.flatbuffers.Constants\nimport com.google.flatbuffers.DoubleVector\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.FloatVector\nimport com.google.flatbuffers.LongVector\nimport com.google.flatbuffers.StringVector\nimport com.google.flatbuffers.Struct\nimport com.google.flatbuffers.Table\nimport com.google.flatbuffers.UnionVector\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport kotlin.math.sign\n\n@Suppress(\"unused\")\nclass Ability : Struct() {\n\n    fun __init(_i: Int, _bb: ByteBuffer)  {\n        __reset(_i, _bb)\n    }\n    fun __assign(_i: Int, _bb: ByteBuffer) : Ability {\n        __init(_i, _bb)\n        return this\n    }\n    val id : UInt get() = bb.getInt(bb_pos + 0).toUInt()\n    fun mutateId(id: UInt) : ByteBuffer = bb.putInt(bb_pos + 0, id.toInt())\n    val distance : UInt get() = bb.getInt(bb_pos + 4).toUInt()\n    fun mutateDistance(distance: UInt) : ByteBuffer = bb.putInt(bb_pos + 4, distance.toInt())\n    companion object {\n        fun createAbility(builder: FlatBufferBuilder, id: UInt, distance: UInt) : Int {\n            builder.prep(4, 8)\n            builder.putInt(distance.toInt())\n            builder.putInt(id.toInt())\n            return builder.offset()\n        }\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Ability.lua",
    "content": "--[[ MyGame.Example.Ability\n\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : //monster_test.fbs\n  Rooting type : MyGame.Example.Monster (//monster_test.fbs)\n\n--]]\n\nlocal flatbuffers = require('flatbuffers')\n\nlocal Ability = {}\nlocal mt = {}\n\nfunction Ability.New()\n  local o = {}\n  setmetatable(o, {__index = mt})\n  return o\nend\n\nfunction mt:Init(buf, pos)\n  self.view = flatbuffers.view.New(buf, pos)\nend\n\nfunction mt:Id()\n  return self.view:Get(flatbuffers.N.Uint32, self.view.pos + 0)\nend\n\nfunction mt:Distance()\n  return self.view:Get(flatbuffers.N.Uint32, self.view.pos + 4)\nend\n\nfunction Ability.CreateAbility(builder, id, distance)\n  builder:Prep(4, 8)\n  builder:PrependUint32(distance)\n  builder:PrependUint32(id)\n  return builder:Offset()\nend\n\nreturn Ability"
  },
  {
    "path": "tests/MyGame/Example/Ability.nim",
    "content": "#[ MyGame.Example.Ability\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : \n  Rooting type : MyGame.Example.Monster ()\n]#\n\nimport flatbuffers\n\ntype Ability* = object of FlatObj\nfunc id*(self: Ability): uint32 =\n  return Get[uint32](self.tab, self.tab.Pos + 0)\nfunc `id=`*(self: var Ability, n: uint32): bool =\n  return self.tab.Mutate(self.tab.Pos + 0, n)\nfunc distance*(self: Ability): uint32 =\n  return Get[uint32](self.tab, self.tab.Pos + 4)\nfunc `distance=`*(self: var Ability, n: uint32): bool =\n  return self.tab.Mutate(self.tab.Pos + 4, n)\nproc AbilityCreate*(self: var Builder, id: uint32, distance: uint32): uoffset =\n  self.Prep(4, 8)\n  self.Prepend(distance)\n  self.Prepend(id)\n  return self.Offset()\n"
  },
  {
    "path": "tests/MyGame/Example/Ability.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nnamespace MyGame\\Example;\n\nuse \\Google\\FlatBuffers\\Struct;\nuse \\Google\\FlatBuffers\\Table;\nuse \\Google\\FlatBuffers\\ByteBuffer;\nuse \\Google\\FlatBuffers\\FlatBufferBuilder;\n\nclass Ability extends Struct\n{\n    /**\n     * @param int $_i offset\n     * @param ByteBuffer $_bb\n     * @return Ability\n     **/\n    public function init($_i, ByteBuffer $_bb)\n    {\n        $this->bb_pos = $_i;\n        $this->bb = $_bb;\n        return $this;\n    }\n\n    /**\n     * @return uint\n     */\n    public function GetId()\n    {\n        return $this->bb->getUint($this->bb_pos + 0);\n    }\n\n    /**\n     * @return uint\n     */\n    public function GetDistance()\n    {\n        return $this->bb->getUint($this->bb_pos + 4);\n    }\n\n\n    /**\n     * @return int offset\n     */\n    public static function createAbility(FlatBufferBuilder $builder, $id, $distance)\n    {\n        $builder->prep(4, 8);\n        $builder->putUint($distance);\n        $builder->putUint($id);\n        return $builder->offset();\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Ability.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: Example\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\nclass Ability(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def SizeOf(cls):\n        return 8\n\n    # Ability\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # Ability\n    def Id(self): return self._tab.Get(flatbuffers.number_types.Uint32Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(0))\n    # Ability\n    def Distance(self): return self._tab.Get(flatbuffers.number_types.Uint32Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(4))\n\ndef CreateAbility(builder, id, distance):\n    builder.Prep(4, 8)\n    builder.PrependUint32(distance)\n    builder.PrependUint32(id)\n    return builder.Offset()\n\n\nclass AbilityT(object):\n\n    # AbilityT\n    def __init__(\n        self,\n        id = 0,\n        distance = 0,\n    ):\n        self.id = id  # type: int\n        self.distance = distance  # type: int\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        ability = Ability()\n        ability.Init(buf, pos)\n        return cls.InitFromObj(ability)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, ability):\n        x = AbilityT()\n        x._UnPack(ability)\n        return x\n\n    # AbilityT\n    def _UnPack(self, ability):\n        if ability is None:\n            return\n        self.id = ability.Id()\n        self.distance = ability.Distance()\n\n    # AbilityT\n    def Pack(self, builder):\n        return CreateAbility(builder, self.id, self.distance)\n"
  },
  {
    "path": "tests/MyGame/Example/AbilityT.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\npublic class AbilityT {\n  private long id;\n  private long distance;\n\n  public long getId() { return id; }\n\n  public void setId(long id) { this.id = id; }\n\n  public long getDistance() { return distance; }\n\n  public void setDistance(long distance) { this.distance = distance; }\n\n\n  public AbilityT() {\n    this.id = 0L;\n    this.distance = 0L;\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/Any.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace MyGame.Example\n{\n\n[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]\npublic enum Any : byte\n{\n  NONE = 0,\n  Monster = 1,\n  TestSimpleTableWithEnum = 2,\n  MyGame_Example2_Monster = 3,\n};\n\npublic class AnyUnion {\n  public Any Type { get; set; }\n  public object Value { get; set; }\n\n  public AnyUnion() {\n    this.Type = Any.NONE;\n    this.Value = null;\n  }\n\n  public T As<T>() where T : class { return this.Value as T; }\n  public MyGame.Example.MonsterT AsMonster() { return this.As<MyGame.Example.MonsterT>(); }\n  public static AnyUnion FromMonster(MyGame.Example.MonsterT _monster) { return new AnyUnion{ Type = Any.Monster, Value = _monster }; }\n  internal MyGame.Example.TestSimpleTableWithEnumT AsTestSimpleTableWithEnum() { return this.As<MyGame.Example.TestSimpleTableWithEnumT>(); }\n  internal static AnyUnion FromTestSimpleTableWithEnum(MyGame.Example.TestSimpleTableWithEnumT _testsimpletablewithenum) { return new AnyUnion{ Type = Any.TestSimpleTableWithEnum, Value = _testsimpletablewithenum }; }\n  public MyGame.Example2.MonsterT AsMyGame_Example2_Monster() { return this.As<MyGame.Example2.MonsterT>(); }\n  public static AnyUnion FromMyGame_Example2_Monster(MyGame.Example2.MonsterT _mygame_example2_monster) { return new AnyUnion{ Type = Any.MyGame_Example2_Monster, Value = _mygame_example2_monster }; }\n\n  public static int Pack(Google.FlatBuffers.FlatBufferBuilder builder, AnyUnion _o) {\n    switch (_o.Type) {\n      default: return 0;\n      case Any.Monster: return MyGame.Example.Monster.Pack(builder, _o.AsMonster()).Value;\n      case Any.TestSimpleTableWithEnum: return MyGame.Example.TestSimpleTableWithEnum.Pack(builder, _o.AsTestSimpleTableWithEnum()).Value;\n      case Any.MyGame_Example2_Monster: return MyGame.Example2.Monster.Pack(builder, _o.AsMyGame_Example2_Monster()).Value;\n    }\n  }\n}\n\npublic class AnyUnion_JsonConverter : Newtonsoft.Json.JsonConverter {\n  public override bool CanConvert(System.Type objectType) {\n    return objectType == typeof(AnyUnion) || objectType == typeof(System.Collections.Generic.List<AnyUnion>);\n  }\n  public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) {\n    var _olist = value as System.Collections.Generic.List<AnyUnion>;\n    if (_olist != null) {\n      writer.WriteStartArray();\n      foreach (var _o in _olist) { this.WriteJson(writer, _o, serializer); }\n      writer.WriteEndArray();\n    } else {\n      this.WriteJson(writer, value as AnyUnion, serializer);\n    }\n  }\n  public void WriteJson(Newtonsoft.Json.JsonWriter writer, AnyUnion _o, Newtonsoft.Json.JsonSerializer serializer) {\n    if (_o == null) return;\n    serializer.Serialize(writer, _o.Value);\n  }\n  public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) {\n    var _olist = existingValue as System.Collections.Generic.List<AnyUnion>;\n    if (_olist != null) {\n      for (var _j = 0; _j < _olist.Count; ++_j) {\n        reader.Read();\n        _olist[_j] = this.ReadJson(reader, _olist[_j], serializer);\n      }\n      reader.Read();\n      return _olist;\n    } else {\n      return this.ReadJson(reader, existingValue as AnyUnion, serializer);\n    }\n  }\n  public AnyUnion ReadJson(Newtonsoft.Json.JsonReader reader, AnyUnion _o, Newtonsoft.Json.JsonSerializer serializer) {\n    if (_o == null) return null;\n    switch (_o.Type) {\n      default: break;\n      case Any.Monster: _o.Value = serializer.Deserialize<MyGame.Example.MonsterT>(reader); break;\n      case Any.TestSimpleTableWithEnum: _o.Value = serializer.Deserialize<MyGame.Example.TestSimpleTableWithEnumT>(reader); break;\n      case Any.MyGame_Example2_Monster: _o.Value = serializer.Deserialize<MyGame.Example2.MonsterT>(reader); break;\n    }\n    return _o;\n  }\n}\n\n\n\nstatic public class AnyVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)\n  {\n    bool result = true;\n    switch((Any)typeId)\n    {\n      case Any.Monster:\n        result = MyGame.Example.MonsterVerify.Verify(verifier, tablePos);\n        break;\n      case Any.TestSimpleTableWithEnum:\n        result = MyGame.Example.TestSimpleTableWithEnumVerify.Verify(verifier, tablePos);\n        break;\n      case Any.MyGame_Example2_Monster:\n        result = MyGame.Example2.MonsterVerify.Verify(verifier, tablePos);\n        break;\n      default: result = true;\n        break;\n    }\n    return result;\n  }\n}\n\n\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Any.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage Example\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n\t\"strconv\"\n\n\tMyGame__Example2 \"MyGame/Example2\"\n)\n\ntype Any byte\n\nconst (\n\tAnyNONE                    Any = 0\n\tAnyMonster                 Any = 1\n\tAnyTestSimpleTableWithEnum Any = 2\n\tAnyMyGame_Example2_Monster Any = 3\n)\n\nvar EnumNamesAny = map[Any]string{\n\tAnyNONE:                    \"NONE\",\n\tAnyMonster:                 \"Monster\",\n\tAnyTestSimpleTableWithEnum: \"TestSimpleTableWithEnum\",\n\tAnyMyGame_Example2_Monster: \"MyGame_Example2_Monster\",\n}\n\nvar EnumValuesAny = map[string]Any{\n\t\"NONE\":                    AnyNONE,\n\t\"Monster\":                 AnyMonster,\n\t\"TestSimpleTableWithEnum\": AnyTestSimpleTableWithEnum,\n\t\"MyGame_Example2_Monster\": AnyMyGame_Example2_Monster,\n}\n\nfunc (v Any) String() string {\n\tif s, ok := EnumNamesAny[v]; ok {\n\t\treturn s\n\t}\n\treturn \"Any(\" + strconv.FormatInt(int64(v), 10) + \")\"\n}\n\ntype AnyT struct {\n\tType Any\n\tValue interface{}\n}\n\nfunc (t *AnyT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\tif t == nil {\n\t\treturn 0\n\t}\n\tswitch t.Type {\n\tcase AnyMonster:\n\t\treturn t.Value.(*MonsterT).Pack(builder)\n\tcase AnyTestSimpleTableWithEnum:\n\t\treturn t.Value.(*TestSimpleTableWithEnumT).Pack(builder)\n\tcase AnyMyGame_Example2_Monster:\n\t\treturn t.Value.(*MyGame__Example2.MonsterT).Pack(builder)\n\t}\n\treturn 0\n}\n\nfunc (rcv Any) UnPack(table flatbuffers.Table) *AnyT {\n\tswitch rcv {\n\tcase AnyMonster:\n\t\tvar x Monster\n\t\tx.Init(table.Bytes, table.Pos)\n\t\treturn &AnyT{Type: AnyMonster, Value: x.UnPack()}\n\tcase AnyTestSimpleTableWithEnum:\n\t\tvar x TestSimpleTableWithEnum\n\t\tx.Init(table.Bytes, table.Pos)\n\t\treturn &AnyT{Type: AnyTestSimpleTableWithEnum, Value: x.UnPack()}\n\tcase AnyMyGame_Example2_Monster:\n\t\tvar x MyGame__Example2.Monster\n\t\tx.Init(table.Bytes, table.Pos)\n\t\treturn &AnyT{Type: AnyMyGame_Example2_Monster, Value: x.UnPack()}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Any.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\n@SuppressWarnings(\"unused\")\npublic final class Any {\n  private Any() { }\n  public static final byte NONE = 0;\n  public static final byte Monster = 1;\n  public static final byte TestSimpleTableWithEnum = 2;\n  public static final byte MyGame_Example2_Monster = 3;\n\n  public static final String[] names = { \"NONE\", \"Monster\", \"TestSimpleTableWithEnum\", \"MyGame_Example2_Monster\", };\n\n  public static String name(int e) { return names[e]; }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/Any.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example\n\n@Suppress(\"unused\")\nclass Any_ private constructor() {\n    companion object {\n        const val NONE: UByte = 0u\n        const val Monster: UByte = 1u\n        const val TestSimpleTableWithEnum: UByte = 2u\n        const val MyGame_Example2_Monster: UByte = 3u\n        val names : Array<String> = arrayOf(\"NONE\", \"Monster\", \"TestSimpleTableWithEnum\", \"MyGame_Example2_Monster\")\n        fun name(e: Int) : String = names[e]\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Any.lua",
    "content": "--[[ MyGame.Example.Any\n\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : //monster_test.fbs\n  Rooting type : MyGame.Example.Monster (//monster_test.fbs)\n\n--]]\n\nlocal Any = {\n  NONE = 0,\n  Monster = 1,\n  TestSimpleTableWithEnum = 2,\n  MyGame_Example2_Monster = 3,\n}\n\nreturn Any"
  },
  {
    "path": "tests/MyGame/Example/Any.nim",
    "content": "#[ MyGame.Example.Any\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : \n  Rooting type : MyGame.Example.Monster ()\n]#\n\ntype Any*{.pure.} = enum\n  None = 0.uint8,\n  Monster = 1.uint8,\n  TestSimpleTableWithEnum = 2.uint8,\n  MyGameExample2Monster = 3.uint8,\n"
  },
  {
    "path": "tests/MyGame/Example/Any.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nnamespace MyGame\\Example;\n\nclass Any\n{\n    const NONE = 0;\n    const Monster = 1;\n    const TestSimpleTableWithEnum = 2;\n    const MyGame_Example2_Monster = 3;\n\n    private static $names = array(\n        Any::NONE=>\"NONE\",\n        Any::Monster=>\"Monster\",\n        Any::TestSimpleTableWithEnum=>\"TestSimpleTableWithEnum\",\n        Any::MyGame_Example2_Monster=>\"MyGame_Example2_Monster\",\n    );\n\n    public static function Name($e)\n    {\n        if (!isset(self::$names[$e])) {\n            throw new \\Exception();\n        }\n        return self::$names[$e];\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Any.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: Example\n\nclass Any(object):\n    NONE = 0\n    Monster = 1\n    TestSimpleTableWithEnum = 2\n    MyGame_Example2_Monster = 3\n\ndef AnyCreator(unionType, table):\n    from flatbuffers.table import Table\n    if not isinstance(table, Table):\n        return None\n    if unionType == Any.Monster:\n        import MyGame.Example.Monster\n        return MyGame.Example.Monster.MonsterT.InitFromBuf(table.Bytes, table.Pos)\n    if unionType == Any.TestSimpleTableWithEnum:\n        import MyGame.Example.TestSimpleTableWithEnum\n        return MyGame.Example.TestSimpleTableWithEnum.TestSimpleTableWithEnumT.InitFromBuf(table.Bytes, table.Pos)\n    if unionType == Any.MyGame_Example2_Monster:\n        import MyGame.Example2.Monster\n        return MyGame.Example2.Monster.MonsterT.InitFromBuf(table.Bytes, table.Pos)\n    return None\n"
  },
  {
    "path": "tests/MyGame/Example/AnyAmbiguousAliases.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace MyGame.Example\n{\n\n[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]\npublic enum AnyAmbiguousAliases : byte\n{\n  NONE = 0,\n  M1 = 1,\n  M2 = 2,\n  M3 = 3,\n};\n\npublic class AnyAmbiguousAliasesUnion {\n  public AnyAmbiguousAliases Type { get; set; }\n  public object Value { get; set; }\n\n  public AnyAmbiguousAliasesUnion() {\n    this.Type = AnyAmbiguousAliases.NONE;\n    this.Value = null;\n  }\n\n  public T As<T>() where T : class { return this.Value as T; }\n  public MyGame.Example.MonsterT AsM1() { return this.As<MyGame.Example.MonsterT>(); }\n  public static AnyAmbiguousAliasesUnion FromM1(MyGame.Example.MonsterT _m1) { return new AnyAmbiguousAliasesUnion{ Type = AnyAmbiguousAliases.M1, Value = _m1 }; }\n  public MyGame.Example.MonsterT AsM2() { return this.As<MyGame.Example.MonsterT>(); }\n  public static AnyAmbiguousAliasesUnion FromM2(MyGame.Example.MonsterT _m2) { return new AnyAmbiguousAliasesUnion{ Type = AnyAmbiguousAliases.M2, Value = _m2 }; }\n  public MyGame.Example.MonsterT AsM3() { return this.As<MyGame.Example.MonsterT>(); }\n  public static AnyAmbiguousAliasesUnion FromM3(MyGame.Example.MonsterT _m3) { return new AnyAmbiguousAliasesUnion{ Type = AnyAmbiguousAliases.M3, Value = _m3 }; }\n\n  public static int Pack(Google.FlatBuffers.FlatBufferBuilder builder, AnyAmbiguousAliasesUnion _o) {\n    switch (_o.Type) {\n      default: return 0;\n      case AnyAmbiguousAliases.M1: return MyGame.Example.Monster.Pack(builder, _o.AsM1()).Value;\n      case AnyAmbiguousAliases.M2: return MyGame.Example.Monster.Pack(builder, _o.AsM2()).Value;\n      case AnyAmbiguousAliases.M3: return MyGame.Example.Monster.Pack(builder, _o.AsM3()).Value;\n    }\n  }\n}\n\npublic class AnyAmbiguousAliasesUnion_JsonConverter : Newtonsoft.Json.JsonConverter {\n  public override bool CanConvert(System.Type objectType) {\n    return objectType == typeof(AnyAmbiguousAliasesUnion) || objectType == typeof(System.Collections.Generic.List<AnyAmbiguousAliasesUnion>);\n  }\n  public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) {\n    var _olist = value as System.Collections.Generic.List<AnyAmbiguousAliasesUnion>;\n    if (_olist != null) {\n      writer.WriteStartArray();\n      foreach (var _o in _olist) { this.WriteJson(writer, _o, serializer); }\n      writer.WriteEndArray();\n    } else {\n      this.WriteJson(writer, value as AnyAmbiguousAliasesUnion, serializer);\n    }\n  }\n  public void WriteJson(Newtonsoft.Json.JsonWriter writer, AnyAmbiguousAliasesUnion _o, Newtonsoft.Json.JsonSerializer serializer) {\n    if (_o == null) return;\n    serializer.Serialize(writer, _o.Value);\n  }\n  public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) {\n    var _olist = existingValue as System.Collections.Generic.List<AnyAmbiguousAliasesUnion>;\n    if (_olist != null) {\n      for (var _j = 0; _j < _olist.Count; ++_j) {\n        reader.Read();\n        _olist[_j] = this.ReadJson(reader, _olist[_j], serializer);\n      }\n      reader.Read();\n      return _olist;\n    } else {\n      return this.ReadJson(reader, existingValue as AnyAmbiguousAliasesUnion, serializer);\n    }\n  }\n  public AnyAmbiguousAliasesUnion ReadJson(Newtonsoft.Json.JsonReader reader, AnyAmbiguousAliasesUnion _o, Newtonsoft.Json.JsonSerializer serializer) {\n    if (_o == null) return null;\n    switch (_o.Type) {\n      default: break;\n      case AnyAmbiguousAliases.M1: _o.Value = serializer.Deserialize<MyGame.Example.MonsterT>(reader); break;\n      case AnyAmbiguousAliases.M2: _o.Value = serializer.Deserialize<MyGame.Example.MonsterT>(reader); break;\n      case AnyAmbiguousAliases.M3: _o.Value = serializer.Deserialize<MyGame.Example.MonsterT>(reader); break;\n    }\n    return _o;\n  }\n}\n\n\n\nstatic public class AnyAmbiguousAliasesVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)\n  {\n    bool result = true;\n    switch((AnyAmbiguousAliases)typeId)\n    {\n      case AnyAmbiguousAliases.M1:\n        result = MyGame.Example.MonsterVerify.Verify(verifier, tablePos);\n        break;\n      case AnyAmbiguousAliases.M2:\n        result = MyGame.Example.MonsterVerify.Verify(verifier, tablePos);\n        break;\n      case AnyAmbiguousAliases.M3:\n        result = MyGame.Example.MonsterVerify.Verify(verifier, tablePos);\n        break;\n      default: result = true;\n        break;\n    }\n    return result;\n  }\n}\n\n\n}\n"
  },
  {
    "path": "tests/MyGame/Example/AnyAmbiguousAliases.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage Example\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n\t\"strconv\"\n)\n\ntype AnyAmbiguousAliases byte\n\nconst (\n\tAnyAmbiguousAliasesNONE AnyAmbiguousAliases = 0\n\tAnyAmbiguousAliasesM1   AnyAmbiguousAliases = 1\n\tAnyAmbiguousAliasesM2   AnyAmbiguousAliases = 2\n\tAnyAmbiguousAliasesM3   AnyAmbiguousAliases = 3\n)\n\nvar EnumNamesAnyAmbiguousAliases = map[AnyAmbiguousAliases]string{\n\tAnyAmbiguousAliasesNONE: \"NONE\",\n\tAnyAmbiguousAliasesM1:   \"M1\",\n\tAnyAmbiguousAliasesM2:   \"M2\",\n\tAnyAmbiguousAliasesM3:   \"M3\",\n}\n\nvar EnumValuesAnyAmbiguousAliases = map[string]AnyAmbiguousAliases{\n\t\"NONE\": AnyAmbiguousAliasesNONE,\n\t\"M1\":   AnyAmbiguousAliasesM1,\n\t\"M2\":   AnyAmbiguousAliasesM2,\n\t\"M3\":   AnyAmbiguousAliasesM3,\n}\n\nfunc (v AnyAmbiguousAliases) String() string {\n\tif s, ok := EnumNamesAnyAmbiguousAliases[v]; ok {\n\t\treturn s\n\t}\n\treturn \"AnyAmbiguousAliases(\" + strconv.FormatInt(int64(v), 10) + \")\"\n}\n\ntype AnyAmbiguousAliasesT struct {\n\tType AnyAmbiguousAliases\n\tValue interface{}\n}\n\nfunc (t *AnyAmbiguousAliasesT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\tif t == nil {\n\t\treturn 0\n\t}\n\tswitch t.Type {\n\tcase AnyAmbiguousAliasesM1:\n\t\treturn t.Value.(*MonsterT).Pack(builder)\n\tcase AnyAmbiguousAliasesM2:\n\t\treturn t.Value.(*MonsterT).Pack(builder)\n\tcase AnyAmbiguousAliasesM3:\n\t\treturn t.Value.(*MonsterT).Pack(builder)\n\t}\n\treturn 0\n}\n\nfunc (rcv AnyAmbiguousAliases) UnPack(table flatbuffers.Table) *AnyAmbiguousAliasesT {\n\tswitch rcv {\n\tcase AnyAmbiguousAliasesM1:\n\t\tvar x Monster\n\t\tx.Init(table.Bytes, table.Pos)\n\t\treturn &AnyAmbiguousAliasesT{Type: AnyAmbiguousAliasesM1, Value: x.UnPack()}\n\tcase AnyAmbiguousAliasesM2:\n\t\tvar x Monster\n\t\tx.Init(table.Bytes, table.Pos)\n\t\treturn &AnyAmbiguousAliasesT{Type: AnyAmbiguousAliasesM2, Value: x.UnPack()}\n\tcase AnyAmbiguousAliasesM3:\n\t\tvar x Monster\n\t\tx.Init(table.Bytes, table.Pos)\n\t\treturn &AnyAmbiguousAliasesT{Type: AnyAmbiguousAliasesM3, Value: x.UnPack()}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "tests/MyGame/Example/AnyAmbiguousAliases.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\n@SuppressWarnings(\"unused\")\npublic final class AnyAmbiguousAliases {\n  private AnyAmbiguousAliases() { }\n  public static final byte NONE = 0;\n  public static final byte M1 = 1;\n  public static final byte M2 = 2;\n  public static final byte M3 = 3;\n\n  public static final String[] names = { \"NONE\", \"M1\", \"M2\", \"M3\", };\n\n  public static String name(int e) { return names[e]; }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/AnyAmbiguousAliases.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example\n\n@Suppress(\"unused\")\nclass AnyAmbiguousAliases private constructor() {\n    companion object {\n        const val NONE: UByte = 0u\n        const val M1: UByte = 1u\n        const val M2: UByte = 2u\n        const val M3: UByte = 3u\n        val names : Array<String> = arrayOf(\"NONE\", \"M1\", \"M2\", \"M3\")\n        fun name(e: Int) : String = names[e]\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/AnyAmbiguousAliases.lua",
    "content": "--[[ MyGame.Example.AnyAmbiguousAliases\n\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : //monster_test.fbs\n  Rooting type : MyGame.Example.Monster (//monster_test.fbs)\n\n--]]\n\nlocal AnyAmbiguousAliases = {\n  NONE = 0,\n  M1 = 1,\n  M2 = 2,\n  M3 = 3,\n}\n\nreturn AnyAmbiguousAliases"
  },
  {
    "path": "tests/MyGame/Example/AnyAmbiguousAliases.nim",
    "content": "#[ MyGame.Example.AnyAmbiguousAliases\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : \n  Rooting type : MyGame.Example.Monster ()\n]#\n\ntype AnyAmbiguousAliases*{.pure.} = enum\n  None = 0.uint8,\n  M1 = 1.uint8,\n  M2 = 2.uint8,\n  M3 = 3.uint8,\n"
  },
  {
    "path": "tests/MyGame/Example/AnyAmbiguousAliases.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nnamespace MyGame\\Example;\n\nclass AnyAmbiguousAliases\n{\n    const NONE = 0;\n    const M1 = 1;\n    const M2 = 2;\n    const M3 = 3;\n\n    private static $names = array(\n        AnyAmbiguousAliases::NONE=>\"NONE\",\n        AnyAmbiguousAliases::M1=>\"M1\",\n        AnyAmbiguousAliases::M2=>\"M2\",\n        AnyAmbiguousAliases::M3=>\"M3\",\n    );\n\n    public static function Name($e)\n    {\n        if (!isset(self::$names[$e])) {\n            throw new \\Exception();\n        }\n        return self::$names[$e];\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/AnyAmbiguousAliases.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: Example\n\nclass AnyAmbiguousAliases(object):\n    NONE = 0\n    M1 = 1\n    M2 = 2\n    M3 = 3\n\ndef AnyAmbiguousAliasesCreator(unionType, table):\n    from flatbuffers.table import Table\n    if not isinstance(table, Table):\n        return None\n    if unionType == AnyAmbiguousAliases.M1:\n        import MyGame.Example.Monster\n        return MyGame.Example.Monster.MonsterT.InitFromBuf(table.Bytes, table.Pos)\n    if unionType == AnyAmbiguousAliases.M2:\n        import MyGame.Example.Monster\n        return MyGame.Example.Monster.MonsterT.InitFromBuf(table.Bytes, table.Pos)\n    if unionType == AnyAmbiguousAliases.M3:\n        import MyGame.Example.Monster\n        return MyGame.Example.Monster.MonsterT.InitFromBuf(table.Bytes, table.Pos)\n    return None\n"
  },
  {
    "path": "tests/MyGame/Example/AnyAmbiguousAliasesUnion.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.FlatBufferBuilder;\n\npublic class AnyAmbiguousAliasesUnion {\n  private byte type;\n  private Object value;\n\n  public byte getType() { return type; }\n\n  public void setType(byte type) { this.type = type; }\n\n  public Object getValue() { return value; }\n\n  public void setValue(Object value) { this.value = value; }\n\n  public AnyAmbiguousAliasesUnion() {\n    this.type = AnyAmbiguousAliases.NONE;\n    this.value = null;\n  }\n\n  public MyGame.Example.MonsterT asM1() { return (MyGame.Example.MonsterT) value; }\n  public MyGame.Example.MonsterT asM2() { return (MyGame.Example.MonsterT) value; }\n  public MyGame.Example.MonsterT asM3() { return (MyGame.Example.MonsterT) value; }\n\n  public static int pack(FlatBufferBuilder builder, AnyAmbiguousAliasesUnion _o) {\n    switch (_o.type) {\n      case AnyAmbiguousAliases.M1: return MyGame.Example.Monster.pack(builder, _o.asM1());\n      case AnyAmbiguousAliases.M2: return MyGame.Example.Monster.pack(builder, _o.asM2());\n      case AnyAmbiguousAliases.M3: return MyGame.Example.Monster.pack(builder, _o.asM3());\n      default: return 0;\n    }\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/AnyUnion.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.FlatBufferBuilder;\n\npublic class AnyUnion {\n  private byte type;\n  private Object value;\n\n  public byte getType() { return type; }\n\n  public void setType(byte type) { this.type = type; }\n\n  public Object getValue() { return value; }\n\n  public void setValue(Object value) { this.value = value; }\n\n  public AnyUnion() {\n    this.type = Any.NONE;\n    this.value = null;\n  }\n\n  public MyGame.Example.MonsterT asMonster() { return (MyGame.Example.MonsterT) value; }\n  MyGame.Example.TestSimpleTableWithEnumT asTestSimpleTableWithEnum() { return (MyGame.Example.TestSimpleTableWithEnumT) value; }\n  public MyGame.Example2.MonsterT asMyGame_Example2_Monster() { return (MyGame.Example2.MonsterT) value; }\n\n  public static int pack(FlatBufferBuilder builder, AnyUnion _o) {\n    switch (_o.type) {\n      case Any.Monster: return MyGame.Example.Monster.pack(builder, _o.asMonster());\n      case Any.TestSimpleTableWithEnum: return MyGame.Example.TestSimpleTableWithEnum.pack(builder, _o.asTestSimpleTableWithEnum());\n      case Any.MyGame_Example2_Monster: return MyGame.Example2.Monster.pack(builder, _o.asMyGame_Example2_Monster());\n      default: return 0;\n    }\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/AnyUniqueAliases.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace MyGame.Example\n{\n\n[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]\npublic enum AnyUniqueAliases : byte\n{\n  NONE = 0,\n  M = 1,\n  TS = 2,\n  M2 = 3,\n};\n\npublic class AnyUniqueAliasesUnion {\n  public AnyUniqueAliases Type { get; set; }\n  public object Value { get; set; }\n\n  public AnyUniqueAliasesUnion() {\n    this.Type = AnyUniqueAliases.NONE;\n    this.Value = null;\n  }\n\n  public T As<T>() where T : class { return this.Value as T; }\n  public MyGame.Example.MonsterT AsM() { return this.As<MyGame.Example.MonsterT>(); }\n  public static AnyUniqueAliasesUnion FromM(MyGame.Example.MonsterT _m) { return new AnyUniqueAliasesUnion{ Type = AnyUniqueAliases.M, Value = _m }; }\n  internal MyGame.Example.TestSimpleTableWithEnumT AsTS() { return this.As<MyGame.Example.TestSimpleTableWithEnumT>(); }\n  internal static AnyUniqueAliasesUnion FromTS(MyGame.Example.TestSimpleTableWithEnumT _ts) { return new AnyUniqueAliasesUnion{ Type = AnyUniqueAliases.TS, Value = _ts }; }\n  public MyGame.Example2.MonsterT AsM2() { return this.As<MyGame.Example2.MonsterT>(); }\n  public static AnyUniqueAliasesUnion FromM2(MyGame.Example2.MonsterT _m2) { return new AnyUniqueAliasesUnion{ Type = AnyUniqueAliases.M2, Value = _m2 }; }\n\n  public static int Pack(Google.FlatBuffers.FlatBufferBuilder builder, AnyUniqueAliasesUnion _o) {\n    switch (_o.Type) {\n      default: return 0;\n      case AnyUniqueAliases.M: return MyGame.Example.Monster.Pack(builder, _o.AsM()).Value;\n      case AnyUniqueAliases.TS: return MyGame.Example.TestSimpleTableWithEnum.Pack(builder, _o.AsTS()).Value;\n      case AnyUniqueAliases.M2: return MyGame.Example2.Monster.Pack(builder, _o.AsM2()).Value;\n    }\n  }\n}\n\npublic class AnyUniqueAliasesUnion_JsonConverter : Newtonsoft.Json.JsonConverter {\n  public override bool CanConvert(System.Type objectType) {\n    return objectType == typeof(AnyUniqueAliasesUnion) || objectType == typeof(System.Collections.Generic.List<AnyUniqueAliasesUnion>);\n  }\n  public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) {\n    var _olist = value as System.Collections.Generic.List<AnyUniqueAliasesUnion>;\n    if (_olist != null) {\n      writer.WriteStartArray();\n      foreach (var _o in _olist) { this.WriteJson(writer, _o, serializer); }\n      writer.WriteEndArray();\n    } else {\n      this.WriteJson(writer, value as AnyUniqueAliasesUnion, serializer);\n    }\n  }\n  public void WriteJson(Newtonsoft.Json.JsonWriter writer, AnyUniqueAliasesUnion _o, Newtonsoft.Json.JsonSerializer serializer) {\n    if (_o == null) return;\n    serializer.Serialize(writer, _o.Value);\n  }\n  public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) {\n    var _olist = existingValue as System.Collections.Generic.List<AnyUniqueAliasesUnion>;\n    if (_olist != null) {\n      for (var _j = 0; _j < _olist.Count; ++_j) {\n        reader.Read();\n        _olist[_j] = this.ReadJson(reader, _olist[_j], serializer);\n      }\n      reader.Read();\n      return _olist;\n    } else {\n      return this.ReadJson(reader, existingValue as AnyUniqueAliasesUnion, serializer);\n    }\n  }\n  public AnyUniqueAliasesUnion ReadJson(Newtonsoft.Json.JsonReader reader, AnyUniqueAliasesUnion _o, Newtonsoft.Json.JsonSerializer serializer) {\n    if (_o == null) return null;\n    switch (_o.Type) {\n      default: break;\n      case AnyUniqueAliases.M: _o.Value = serializer.Deserialize<MyGame.Example.MonsterT>(reader); break;\n      case AnyUniqueAliases.TS: _o.Value = serializer.Deserialize<MyGame.Example.TestSimpleTableWithEnumT>(reader); break;\n      case AnyUniqueAliases.M2: _o.Value = serializer.Deserialize<MyGame.Example2.MonsterT>(reader); break;\n    }\n    return _o;\n  }\n}\n\n\n\nstatic public class AnyUniqueAliasesVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)\n  {\n    bool result = true;\n    switch((AnyUniqueAliases)typeId)\n    {\n      case AnyUniqueAliases.M:\n        result = MyGame.Example.MonsterVerify.Verify(verifier, tablePos);\n        break;\n      case AnyUniqueAliases.TS:\n        result = MyGame.Example.TestSimpleTableWithEnumVerify.Verify(verifier, tablePos);\n        break;\n      case AnyUniqueAliases.M2:\n        result = MyGame.Example2.MonsterVerify.Verify(verifier, tablePos);\n        break;\n      default: result = true;\n        break;\n    }\n    return result;\n  }\n}\n\n\n}\n"
  },
  {
    "path": "tests/MyGame/Example/AnyUniqueAliases.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage Example\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n\t\"strconv\"\n\n\tMyGame__Example2 \"MyGame/Example2\"\n)\n\ntype AnyUniqueAliases byte\n\nconst (\n\tAnyUniqueAliasesNONE AnyUniqueAliases = 0\n\tAnyUniqueAliasesM    AnyUniqueAliases = 1\n\tAnyUniqueAliasesTS   AnyUniqueAliases = 2\n\tAnyUniqueAliasesM2   AnyUniqueAliases = 3\n)\n\nvar EnumNamesAnyUniqueAliases = map[AnyUniqueAliases]string{\n\tAnyUniqueAliasesNONE: \"NONE\",\n\tAnyUniqueAliasesM:    \"M\",\n\tAnyUniqueAliasesTS:   \"TS\",\n\tAnyUniqueAliasesM2:   \"M2\",\n}\n\nvar EnumValuesAnyUniqueAliases = map[string]AnyUniqueAliases{\n\t\"NONE\": AnyUniqueAliasesNONE,\n\t\"M\":    AnyUniqueAliasesM,\n\t\"TS\":   AnyUniqueAliasesTS,\n\t\"M2\":   AnyUniqueAliasesM2,\n}\n\nfunc (v AnyUniqueAliases) String() string {\n\tif s, ok := EnumNamesAnyUniqueAliases[v]; ok {\n\t\treturn s\n\t}\n\treturn \"AnyUniqueAliases(\" + strconv.FormatInt(int64(v), 10) + \")\"\n}\n\ntype AnyUniqueAliasesT struct {\n\tType AnyUniqueAliases\n\tValue interface{}\n}\n\nfunc (t *AnyUniqueAliasesT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\tif t == nil {\n\t\treturn 0\n\t}\n\tswitch t.Type {\n\tcase AnyUniqueAliasesM:\n\t\treturn t.Value.(*MonsterT).Pack(builder)\n\tcase AnyUniqueAliasesTS:\n\t\treturn t.Value.(*TestSimpleTableWithEnumT).Pack(builder)\n\tcase AnyUniqueAliasesM2:\n\t\treturn t.Value.(*MyGame__Example2.MonsterT).Pack(builder)\n\t}\n\treturn 0\n}\n\nfunc (rcv AnyUniqueAliases) UnPack(table flatbuffers.Table) *AnyUniqueAliasesT {\n\tswitch rcv {\n\tcase AnyUniqueAliasesM:\n\t\tvar x Monster\n\t\tx.Init(table.Bytes, table.Pos)\n\t\treturn &AnyUniqueAliasesT{Type: AnyUniqueAliasesM, Value: x.UnPack()}\n\tcase AnyUniqueAliasesTS:\n\t\tvar x TestSimpleTableWithEnum\n\t\tx.Init(table.Bytes, table.Pos)\n\t\treturn &AnyUniqueAliasesT{Type: AnyUniqueAliasesTS, Value: x.UnPack()}\n\tcase AnyUniqueAliasesM2:\n\t\tvar x MyGame__Example2.Monster\n\t\tx.Init(table.Bytes, table.Pos)\n\t\treturn &AnyUniqueAliasesT{Type: AnyUniqueAliasesM2, Value: x.UnPack()}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "tests/MyGame/Example/AnyUniqueAliases.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\n@SuppressWarnings(\"unused\")\npublic final class AnyUniqueAliases {\n  private AnyUniqueAliases() { }\n  public static final byte NONE = 0;\n  public static final byte M = 1;\n  public static final byte TS = 2;\n  public static final byte M2 = 3;\n\n  public static final String[] names = { \"NONE\", \"M\", \"TS\", \"M2\", };\n\n  public static String name(int e) { return names[e]; }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/AnyUniqueAliases.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example\n\n@Suppress(\"unused\")\nclass AnyUniqueAliases private constructor() {\n    companion object {\n        const val NONE: UByte = 0u\n        const val M: UByte = 1u\n        const val TS: UByte = 2u\n        const val M2: UByte = 3u\n        val names : Array<String> = arrayOf(\"NONE\", \"M\", \"TS\", \"M2\")\n        fun name(e: Int) : String = names[e]\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/AnyUniqueAliases.lua",
    "content": "--[[ MyGame.Example.AnyUniqueAliases\n\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : //monster_test.fbs\n  Rooting type : MyGame.Example.Monster (//monster_test.fbs)\n\n--]]\n\nlocal AnyUniqueAliases = {\n  NONE = 0,\n  M = 1,\n  TS = 2,\n  M2 = 3,\n}\n\nreturn AnyUniqueAliases"
  },
  {
    "path": "tests/MyGame/Example/AnyUniqueAliases.nim",
    "content": "#[ MyGame.Example.AnyUniqueAliases\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : \n  Rooting type : MyGame.Example.Monster ()\n]#\n\ntype AnyUniqueAliases*{.pure.} = enum\n  None = 0.uint8,\n  M = 1.uint8,\n  Ts = 2.uint8,\n  M2 = 3.uint8,\n"
  },
  {
    "path": "tests/MyGame/Example/AnyUniqueAliases.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nnamespace MyGame\\Example;\n\nclass AnyUniqueAliases\n{\n    const NONE = 0;\n    const M = 1;\n    const TS = 2;\n    const M2 = 3;\n\n    private static $names = array(\n        AnyUniqueAliases::NONE=>\"NONE\",\n        AnyUniqueAliases::M=>\"M\",\n        AnyUniqueAliases::TS=>\"TS\",\n        AnyUniqueAliases::M2=>\"M2\",\n    );\n\n    public static function Name($e)\n    {\n        if (!isset(self::$names[$e])) {\n            throw new \\Exception();\n        }\n        return self::$names[$e];\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/AnyUniqueAliases.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: Example\n\nclass AnyUniqueAliases(object):\n    NONE = 0\n    M = 1\n    TS = 2\n    M2 = 3\n\ndef AnyUniqueAliasesCreator(unionType, table):\n    from flatbuffers.table import Table\n    if not isinstance(table, Table):\n        return None\n    if unionType == AnyUniqueAliases.M:\n        import MyGame.Example.Monster\n        return MyGame.Example.Monster.MonsterT.InitFromBuf(table.Bytes, table.Pos)\n    if unionType == AnyUniqueAliases.TS:\n        import MyGame.Example.TestSimpleTableWithEnum\n        return MyGame.Example.TestSimpleTableWithEnum.TestSimpleTableWithEnumT.InitFromBuf(table.Bytes, table.Pos)\n    if unionType == AnyUniqueAliases.M2:\n        import MyGame.Example2.Monster\n        return MyGame.Example2.Monster.MonsterT.InitFromBuf(table.Bytes, table.Pos)\n    return None\n"
  },
  {
    "path": "tests/MyGame/Example/AnyUniqueAliasesUnion.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.FlatBufferBuilder;\n\npublic class AnyUniqueAliasesUnion {\n  private byte type;\n  private Object value;\n\n  public byte getType() { return type; }\n\n  public void setType(byte type) { this.type = type; }\n\n  public Object getValue() { return value; }\n\n  public void setValue(Object value) { this.value = value; }\n\n  public AnyUniqueAliasesUnion() {\n    this.type = AnyUniqueAliases.NONE;\n    this.value = null;\n  }\n\n  public MyGame.Example.MonsterT asM() { return (MyGame.Example.MonsterT) value; }\n  MyGame.Example.TestSimpleTableWithEnumT asTS() { return (MyGame.Example.TestSimpleTableWithEnumT) value; }\n  public MyGame.Example2.MonsterT asM2() { return (MyGame.Example2.MonsterT) value; }\n\n  public static int pack(FlatBufferBuilder builder, AnyUniqueAliasesUnion _o) {\n    switch (_o.type) {\n      case AnyUniqueAliases.M: return MyGame.Example.Monster.pack(builder, _o.asM());\n      case AnyUniqueAliases.TS: return MyGame.Example.TestSimpleTableWithEnum.pack(builder, _o.asTS());\n      case AnyUniqueAliases.M2: return MyGame.Example2.Monster.pack(builder, _o.asM2());\n      default: return 0;\n    }\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/ArrayStruct.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace MyGame.Example\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct ArrayStruct : IFlatbufferObject\n{\n  private Struct __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Struct(_i, _bb); }\n  public ArrayStruct __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public float A { get { return __p.bb.GetFloat(__p.bb_pos + 0); } }\n  public void MutateA(float a) { __p.bb.PutFloat(__p.bb_pos + 0, a); }\n  public int B(int j) { return __p.bb.GetInt(__p.bb_pos + 4 + j * 4); }\n  public const int BLength = 15;\n#if ENABLE_SPAN_T\n  public Span<int> GetBBytes() { return System.Runtime.InteropServices.MemoryMarshal.Cast<byte, int>(__p.bb.ToSpan(__p.bb_pos + 4, 60)); }\n#else\n  public ArraySegment<byte>? GetBBytes() { return __p.bb.ToArraySegment(__p.bb_pos + 4, 60);}\n#endif\n  public void MutateB(int j, int b) { __p.bb.PutInt(__p.bb_pos + 4 + j * 4, b); }\n  public sbyte C { get { return __p.bb.GetSbyte(__p.bb_pos + 64); } }\n  public void MutateC(sbyte c) { __p.bb.PutSbyte(__p.bb_pos + 64, c); }\n  public MyGame.Example.NestedStruct D(int j) { return (new MyGame.Example.NestedStruct()).__assign(__p.bb_pos + 72 + j * 32, __p.bb); }\n  public int E { get { return __p.bb.GetInt(__p.bb_pos + 136); } }\n  public void MutateE(int e) { __p.bb.PutInt(__p.bb_pos + 136, e); }\n  public long F(int j) { return __p.bb.GetLong(__p.bb_pos + 144 + j * 8); }\n  public const int FLength = 2;\n#if ENABLE_SPAN_T\n  public Span<long> GetFBytes() { return System.Runtime.InteropServices.MemoryMarshal.Cast<byte, long>(__p.bb.ToSpan(__p.bb_pos + 144, 16)); }\n#else\n  public ArraySegment<byte>? GetFBytes() { return __p.bb.ToArraySegment(__p.bb_pos + 144, 16);}\n#endif\n  public void MutateF(int j, long f) { __p.bb.PutLong(__p.bb_pos + 144 + j * 8, f); }\n\n  public static Offset<MyGame.Example.ArrayStruct> CreateArrayStruct(FlatBufferBuilder builder, float A, int[] B, sbyte C, int[,] d_A, MyGame.Example.TestEnum[] d_B, MyGame.Example.TestEnum[,] d_C, long[,] d_D, int E, long[] F) {\n    builder.Prep(8, 160);\n    for (int _idx0 = 2; _idx0 > 0; _idx0--) {\n      builder.PutLong(F[_idx0-1]);\n    }\n    builder.Pad(4);\n    builder.PutInt(E);\n    for (int _idx0 = 2; _idx0 > 0; _idx0--) {\n      builder.Prep(8, 32);\n      for (int _idx1 = 2; _idx1 > 0; _idx1--) {\n        builder.PutLong(d_D[_idx0-1,_idx1-1]);\n      }\n      builder.Pad(5);\n      for (int _idx1 = 2; _idx1 > 0; _idx1--) {\n        builder.PutSbyte((sbyte)d_C[_idx0-1,_idx1-1]);\n      }\n      builder.PutSbyte((sbyte)d_B[_idx0-1]);\n      for (int _idx1 = 2; _idx1 > 0; _idx1--) {\n        builder.PutInt(d_A[_idx0-1,_idx1-1]);\n      }\n    }\n    builder.Pad(7);\n    builder.PutSbyte(C);\n    for (int _idx0 = 15; _idx0 > 0; _idx0--) {\n      builder.PutInt(B[_idx0-1]);\n    }\n    builder.PutFloat(A);\n    return new Offset<MyGame.Example.ArrayStruct>(builder.Offset);\n  }\n  public ArrayStructT UnPack() {\n    var _o = new ArrayStructT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(ArrayStructT _o) {\n    _o.A = this.A;\n    _o.B = new int[15];\n    for (var _j = 0; _j < 15; ++_j) { _o.B[_j] = this.B(_j); }\n    _o.C = this.C;\n    _o.D = new MyGame.Example.NestedStructT[2];\n    for (var _j = 0; _j < 2; ++_j) { _o.D[_j] = this.D(_j).UnPack(); }\n    _o.E = this.E;\n    _o.F = new long[2];\n    for (var _j = 0; _j < 2; ++_j) { _o.F[_j] = this.F(_j); }\n  }\n  public static Offset<MyGame.Example.ArrayStruct> Pack(FlatBufferBuilder builder, ArrayStructT _o) {\n    if (_o == null) return default(Offset<MyGame.Example.ArrayStruct>);\n    var _b = _o.B;\n    var _d_a = new int[2,2];\n    for (var idx0 = 0; idx0 < 2; ++idx0) {for (var idx1 = 0; idx1 < 2; ++idx1) {_d_a[idx0,idx1] = _o.D[idx0].A[idx1];}}\n    var _d_b = new MyGame.Example.TestEnum[2];\n    for (var idx0 = 0; idx0 < 2; ++idx0) {_d_b[idx0] = _o.D[idx0].B;}\n    var _d_c = new MyGame.Example.TestEnum[2,2];\n    for (var idx0 = 0; idx0 < 2; ++idx0) {for (var idx1 = 0; idx1 < 2; ++idx1) {_d_c[idx0,idx1] = _o.D[idx0].C[idx1];}}\n    var _d_d = new long[2,2];\n    for (var idx0 = 0; idx0 < 2; ++idx0) {for (var idx1 = 0; idx1 < 2; ++idx1) {_d_d[idx0,idx1] = _o.D[idx0].D[idx1];}}\n    var _f = _o.F;\n    return CreateArrayStruct(\n      builder,\n      _o.A,\n      _b,\n      _o.C,\n      _d_a,\n      _d_b,\n      _d_c,\n      _d_d,\n      _o.E,\n      _f);\n  }\n}\n\npublic class ArrayStructT\n{\n  [Newtonsoft.Json.JsonProperty(\"a\")]\n  public float A { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"b\")]\n  public int[] B { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"c\")]\n  public sbyte C { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"d\")]\n  public MyGame.Example.NestedStructT[] D { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"e\")]\n  public int E { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"f\")]\n  public long[] F { get; set; }\n\n  public ArrayStructT() {\n    this.A = 0.0f;\n    this.B = new int[15];\n    this.C = 0;\n    this.D = new MyGame.Example.NestedStructT[2];\n    this.E = 0;\n    this.F = new long[2];\n  }\n}\n\n\n}\n"
  },
  {
    "path": "tests/MyGame/Example/ArrayStruct.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class ArrayStruct extends Struct {\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public ArrayStruct __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public float a() { return bb.getFloat(bb_pos + 0); }\n  public void mutateA(float a) { bb.putFloat(bb_pos + 0, a); }\n  public int b(int j) { return bb.getInt(bb_pos + 4 + j * 4); }\n  public void mutateB(int j, int b) { bb.putInt(bb_pos + 4 + j * 4, b); }\n  public byte c() { return bb.get(bb_pos + 64); }\n  public void mutateC(byte c) { bb.put(bb_pos + 64, c); }\n  public MyGame.Example.NestedStruct d(int j) { return d(new MyGame.Example.NestedStruct(), j); }\n  public MyGame.Example.NestedStruct d(MyGame.Example.NestedStruct obj, int j) { return obj.__assign(bb_pos + 72 + j * 32, bb); }\n  public int e() { return bb.getInt(bb_pos + 136); }\n  public void mutateE(int e) { bb.putInt(bb_pos + 136, e); }\n  public long f(int j) { return bb.getLong(bb_pos + 144 + j * 8); }\n  public void mutateF(int j, long f) { bb.putLong(bb_pos + 144 + j * 8, f); }\n\n  public static int createArrayStruct(FlatBufferBuilder builder, float a, int[] b, byte c, int[][] d_a, byte[] d_b, byte[][] d_c, long[][] d_d, int e, long[] f) {\n    builder.prep(8, 160);\n    for (int _idx0 = 2; _idx0 > 0; _idx0--) {\n      builder.putLong(f[_idx0-1]);\n    }\n    builder.pad(4);\n    builder.putInt(e);\n    for (int _idx0 = 2; _idx0 > 0; _idx0--) {\n      builder.prep(8, 32);\n      for (int _idx1 = 2; _idx1 > 0; _idx1--) {\n        builder.putLong(d_d[_idx0-1][_idx1-1]);\n      }\n      builder.pad(5);\n      for (int _idx1 = 2; _idx1 > 0; _idx1--) {\n        builder.putByte(d_c[_idx0-1][_idx1-1]);\n      }\n      builder.putByte(d_b[_idx0-1]);\n      for (int _idx1 = 2; _idx1 > 0; _idx1--) {\n        builder.putInt(d_a[_idx0-1][_idx1-1]);\n      }\n    }\n    builder.pad(7);\n    builder.putByte(c);\n    for (int _idx0 = 15; _idx0 > 0; _idx0--) {\n      builder.putInt(b[_idx0-1]);\n    }\n    builder.putFloat(a);\n    return builder.offset();\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public ArrayStruct get(int j) { return get(new ArrayStruct(), j); }\n    public ArrayStruct get(ArrayStruct obj, int j) {  return obj.__assign(__element(j), bb); }\n  }\n  public ArrayStructT unpack() {\n    ArrayStructT _o = new ArrayStructT();\n    unpackTo(_o);\n    return _o;\n  }\n  public void unpackTo(ArrayStructT _o) {\n    float _oA = a();\n    _o.setA(_oA);\n    int[] _oB = _o.getB();\n    for (int _j = 0; _j < 15; ++_j) { _oB[_j] = b(_j); }\n    byte _oC = c();\n    _o.setC(_oC);\n    MyGame.Example.NestedStructT[] _oD = _o.getD();\n    for (int _j = 0; _j < 2; ++_j) { _oD[_j] = d(_j).unpack(); }\n    int _oE = e();\n    _o.setE(_oE);\n    long[] _oF = _o.getF();\n    for (int _j = 0; _j < 2; ++_j) { _oF[_j] = f(_j); }\n  }\n  public static int pack(FlatBufferBuilder builder, ArrayStructT _o) {\n    if (_o == null) return 0;\n    int[] _b = _o.getB();\n    int[][] _d_a = new int[2][2];\n    for (int idx0 = 0; idx0 < 2; ++idx0) {for (int idx1 = 0; idx1 < 2; ++idx1) {_d_a[idx0][idx1] = _o.getD()[idx0].getA()[idx1];}}\n    byte[] _d_b = new byte[2];\n    for (int idx0 = 0; idx0 < 2; ++idx0) {_d_b[idx0] = _o.getD()[idx0].getB();}\n    byte[][] _d_c = new byte[2][2];\n    for (int idx0 = 0; idx0 < 2; ++idx0) {for (int idx1 = 0; idx1 < 2; ++idx1) {_d_c[idx0][idx1] = _o.getD()[idx0].getC()[idx1];}}\n    long[][] _d_d = new long[2][2];\n    for (int idx0 = 0; idx0 < 2; ++idx0) {for (int idx1 = 0; idx1 < 2; ++idx1) {_d_d[idx0][idx1] = _o.getD()[idx0].getD()[idx1];}}\n    long[] _f = _o.getF();\n    return createArrayStruct(\n      builder,\n      _o.getA(),\n      _b,\n      _o.getC(),\n      _d_a,\n      _d_b,\n      _d_c,\n      _d_d,\n      _o.getE(),\n      _f);\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/ArrayStruct.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: Example\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nfrom typing import Any\nfrom MyGame.Example.NestedStruct import NestedStruct\nnp = import_numpy()\n\nclass ArrayStruct(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def SizeOf(cls) -> int:\n        return 160\n\n    # ArrayStruct\n    def Init(self, buf: bytes, pos: int):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # ArrayStruct\n    def A(self): return self._tab.Get(flatbuffers.number_types.Float32Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(0))\n    # ArrayStruct\n    def B(self, j = None):\n        if j is None:\n            return [self._tab.Get(flatbuffers.number_types.Int32Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(4 + i * 4)) for i in range(self.BLength())]\n        elif j >= 0 and j < self.BLength():\n            return self._tab.Get(flatbuffers.number_types.Int32Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(4 + j * 4))\n        else:\n            return None\n\n    # ArrayStruct\n    def BAsNumpy(self):\n        return self._tab.GetArrayAsNumpy(flatbuffers.number_types.Int32Flags, self._tab.Pos + 4, self.BLength())\n\n    # ArrayStruct\n    def BLength(self) -> int:\n        return 15\n\n    # ArrayStruct\n    def BIsNone(self) -> bool:\n        return False\n\n    # ArrayStruct\n    def C(self): return self._tab.Get(flatbuffers.number_types.Int8Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(64))\n    # ArrayStruct\n    def D(self, i: int) -> NestedStruct:\n        obj = NestedStruct()\n        obj.Init(self._tab.Bytes, self._tab.Pos + 72 + i * 32)\n        return obj\n\n    # ArrayStruct\n    def DLength(self) -> int:\n        return 2\n\n    # ArrayStruct\n    def DIsNone(self) -> bool:\n        return False\n\n    # ArrayStruct\n    def E(self): return self._tab.Get(flatbuffers.number_types.Int32Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(136))\n    # ArrayStruct\n    def F(self, j = None):\n        if j is None:\n            return [self._tab.Get(flatbuffers.number_types.Int64Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(144 + i * 8)) for i in range(self.FLength())]\n        elif j >= 0 and j < self.FLength():\n            return self._tab.Get(flatbuffers.number_types.Int64Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(144 + j * 8))\n        else:\n            return None\n\n    # ArrayStruct\n    def FAsNumpy(self):\n        return self._tab.GetArrayAsNumpy(flatbuffers.number_types.Int64Flags, self._tab.Pos + 144, self.FLength())\n\n    # ArrayStruct\n    def FLength(self) -> int:\n        return 2\n\n    # ArrayStruct\n    def FIsNone(self) -> bool:\n        return False\n\n\ndef CreateArrayStruct(builder, a, b, c, d_a, d_b, d_c, d_d, e, f):\n    builder.Prep(8, 160)\n    for _idx0 in range(2 , 0, -1):\n        builder.PrependInt64(f[_idx0-1])\n    builder.Pad(4)\n    builder.PrependInt32(e)\n    for _idx0 in range(2 , 0, -1):\n        builder.Prep(8, 32)\n        for _idx1 in range(2 , 0, -1):\n            builder.PrependInt64(d_d[_idx0-1][_idx1-1])\n        builder.Pad(5)\n        for _idx1 in range(2 , 0, -1):\n            builder.PrependInt8(d_c[_idx0-1][_idx1-1])\n        builder.PrependInt8(d_b[_idx0-1])\n        for _idx1 in range(2 , 0, -1):\n            builder.PrependInt32(d_a[_idx0-1][_idx1-1])\n    builder.Pad(7)\n    builder.PrependInt8(c)\n    for _idx0 in range(15 , 0, -1):\n        builder.PrependInt32(b[_idx0-1])\n    builder.PrependFloat32(a)\n    return builder.Offset()\n\nimport MyGame.Example.NestedStruct\ntry:\n    from typing import List\nexcept:\n    pass\n\nclass ArrayStructT(object):\n\n    # ArrayStructT\n    def __init__(\n        self,\n        a = 0.0,\n        b = None,\n        c = 0,\n        d = None,\n        e = 0,\n        f = None,\n    ):\n        self.a = a  # type: float\n        self.b = b  # type: Optional[List[int]]\n        self.c = c  # type: int\n        self.d = d  # type: Optional[List[MyGame.Example.NestedStruct.NestedStructT]]\n        self.e = e  # type: int\n        self.f = f  # type: Optional[List[int]]\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        arrayStruct = ArrayStruct()\n        arrayStruct.Init(buf, pos)\n        return cls.InitFromObj(arrayStruct)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, arrayStruct):\n        x = ArrayStructT()\n        x._UnPack(arrayStruct)\n        return x\n\n    # ArrayStructT\n    def _UnPack(self, arrayStruct):\n        if arrayStruct is None:\n            return\n        self.a = arrayStruct.A()\n        if not arrayStruct.BIsNone():\n            if np is None:\n                self.b = []\n                for i in range(arrayStruct.BLength()):\n                    self.b.append(arrayStruct.B(i))\n            else:\n                self.b = arrayStruct.BAsNumpy()\n        self.c = arrayStruct.C()\n        if not arrayStruct.DIsNone():\n            self.d = []\n            for i in range(arrayStruct.DLength()):\n                if arrayStruct.D(i) is None:\n                    self.d.append(None)\n                else:\n                    nestedStruct_ = MyGame.Example.NestedStruct.NestedStructT.InitFromObj(arrayStruct.D(i))\n                    self.d.append(nestedStruct_)\n        self.e = arrayStruct.E()\n        if not arrayStruct.FIsNone():\n            if np is None:\n                self.f = []\n                for i in range(arrayStruct.FLength()):\n                    self.f.append(arrayStruct.F(i))\n            else:\n                self.f = arrayStruct.FAsNumpy()\n\n    # ArrayStructT\n    def Pack(self, builder):\n        return CreateArrayStruct(builder, self.a, self.b, self.c, self.d.a, self.d.b, self.d.c, self.d.d, self.e, self.f)\n"
  },
  {
    "path": "tests/MyGame/Example/ArrayStruct.pyi",
    "content": "from __future__ import annotations\n\nimport flatbuffers\nimport numpy as np\n\nimport typing\nfrom MyGame.Example.NestedStruct import NestedStruct, NestedStructT\nfrom MyGame.Example.TestEnum import TestEnum\n\nuoffset: typing.TypeAlias = flatbuffers.number_types.UOffsetTFlags.py_type\n\nclass ArrayStruct(object):\n  @classmethod\n  def SizeOf(cls) -> int: ...\n\n  def Init(self, buf: bytes, pos: int) -> None: ...\n  def A(self) -> float: ...\n  def B(self, i: int) -> typing.List[int]: ...\n  def BAsNumpy(self) -> np.ndarray: ...\n  def BLength(self) -> int: ...\n  def BIsNone(self) -> bool: ...\n  def C(self) -> int: ...\n  def D(self, i: int) -> NestedStruct | None: ...\n  def DLength(self) -> int: ...\n  def DIsNone(self) -> bool: ...\n  def E(self) -> int: ...\n  def F(self, i: int) -> typing.List[int]: ...\n  def FAsNumpy(self) -> np.ndarray: ...\n  def FLength(self) -> int: ...\n  def FIsNone(self) -> bool: ...\nclass ArrayStructT(object):\n  a: float\n  b: typing.List[int]\n  c: int\n  d: typing.List[NestedStructT]\n  e: int\n  f: typing.List[int]\n  def __init__(\n    self,\n    a: float = ...,\n    b: typing.List[int] | None = ...,\n    c: int = ...,\n    d: typing.List['NestedStructT'] | None = ...,\n    e: int = ...,\n    f: typing.List[int] | None = ...,\n  ) -> None: ...\n  @classmethod\n  def InitFromBuf(cls, buf: bytes, pos: int) -> ArrayStructT: ...\n  @classmethod\n  def InitFromPackedBuf(cls, buf: bytes, pos: int = 0) -> ArrayStructT: ...\n  @classmethod\n  def InitFromObj(cls, arrayStruct: ArrayStruct) -> ArrayStructT: ...\n  def _UnPack(self, arrayStruct: ArrayStruct) -> None: ...\n  def Pack(self, builder: flatbuffers.Builder) -> None: ...\n\ndef CreateArrayStruct(builder: flatbuffers.Builder, a: float, b: int, c: int, d_a: int, d_b: typing.Literal[TestEnum.A, TestEnum.B, TestEnum.C], d_c: typing.Literal[TestEnum.A, TestEnum.B, TestEnum.C], d_d: int, e: int, f: int) -> uoffset: ...\n\n"
  },
  {
    "path": "tests/MyGame/Example/ArrayStructT.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\npublic class ArrayStructT {\n  private float a;\n  private int[] b;\n  private byte c;\n  private MyGame.Example.NestedStructT[] d;\n  private int e;\n  private long[] f;\n\n  public float getA() { return a; }\n\n  public void setA(float a) { this.a = a; }\n\n  public int[] getB() { return b; }\n\n  public void setB(int[] b) { if (b != null && b.length == 15) this.b = b; }\n\n  public byte getC() { return c; }\n\n  public void setC(byte c) { this.c = c; }\n\n  public MyGame.Example.NestedStructT[] getD() { return d; }\n\n  public void setD(MyGame.Example.NestedStructT[] d) { if (d != null && d.length == 2) this.d = d; }\n\n  public int getE() { return e; }\n\n  public void setE(int e) { this.e = e; }\n\n  public long[] getF() { return f; }\n\n  public void setF(long[] f) { if (f != null && f.length == 2) this.f = f; }\n\n\n  public ArrayStructT() {\n    this.a = 0.0f;\n    this.b = new int[15];\n    this.c = 0;\n    this.d = new MyGame.Example.NestedStructT[2];\n    this.e = 0;\n    this.f = new long[2];\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/ArrayTable.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace MyGame.Example\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct ArrayTable : IFlatbufferObject\n{\n  private Table __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_25_12_19(); }\n  public static ArrayTable GetRootAsArrayTable(ByteBuffer _bb) { return GetRootAsArrayTable(_bb, new ArrayTable()); }\n  public static ArrayTable GetRootAsArrayTable(ByteBuffer _bb, ArrayTable obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }\n  public static bool ArrayTableBufferHasIdentifier(ByteBuffer _bb) { return Table.__has_identifier(_bb, \"ARRT\"); }\n  public static bool VerifyArrayTable(ByteBuffer _bb) {Google.FlatBuffers.Verifier verifier = new Google.FlatBuffers.Verifier(_bb); return verifier.VerifyBuffer(\"ARRT\", false, ArrayTableVerify.Verify); }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }\n  public ArrayTable __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public MyGame.Example.ArrayStruct? A { get { int o = __p.__offset(4); return o != 0 ? (MyGame.Example.ArrayStruct?)(new MyGame.Example.ArrayStruct()).__assign(o + __p.bb_pos, __p.bb) : null; } }\n\n  public static void StartArrayTable(FlatBufferBuilder builder) { builder.StartTable(1); }\n  public static void AddA(FlatBufferBuilder builder, Offset<MyGame.Example.ArrayStruct> aOffset) { builder.AddStruct(0, aOffset.Value, 0); }\n  public static Offset<MyGame.Example.ArrayTable> EndArrayTable(FlatBufferBuilder builder) {\n    int o = builder.EndTable();\n    return new Offset<MyGame.Example.ArrayTable>(o);\n  }\n  public static void FinishArrayTableBuffer(FlatBufferBuilder builder, Offset<MyGame.Example.ArrayTable> offset) { builder.Finish(offset.Value, \"ARRT\"); }\n  public static void FinishSizePrefixedArrayTableBuffer(FlatBufferBuilder builder, Offset<MyGame.Example.ArrayTable> offset) { builder.FinishSizePrefixed(offset.Value, \"ARRT\"); }\n  public ArrayTableT UnPack() {\n    var _o = new ArrayTableT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(ArrayTableT _o) {\n    _o.A = this.A.HasValue ? this.A.Value.UnPack() : null;\n  }\n  public static Offset<MyGame.Example.ArrayTable> Pack(FlatBufferBuilder builder, ArrayTableT _o) {\n    if (_o == null) return default(Offset<MyGame.Example.ArrayTable>);\n    StartArrayTable(builder);\n    AddA(builder, MyGame.Example.ArrayStruct.Pack(builder, _o.A));\n    return EndArrayTable(builder);\n  }\n}\n\npublic class ArrayTableT\n{\n  [Newtonsoft.Json.JsonProperty(\"a\")]\n  public MyGame.Example.ArrayStructT A { get; set; }\n\n  public ArrayTableT() {\n    this.A = new MyGame.Example.ArrayStructT();\n  }\n\n  public static ArrayTableT DeserializeFromJson(string jsonText) {\n    return Newtonsoft.Json.JsonConvert.DeserializeObject<ArrayTableT>(jsonText);\n  }\n  public string SerializeToJson() {\n    return Newtonsoft.Json.JsonConvert.SerializeObject(this, Newtonsoft.Json.Formatting.Indented);\n  }\n  public static ArrayTableT DeserializeFromBinary(byte[] fbBuffer) {\n    return ArrayTable.GetRootAsArrayTable(new ByteBuffer(fbBuffer)).UnPack();\n  }\n  public byte[] SerializeToBinary() {\n    var fbb = new FlatBufferBuilder(0x10000);\n    ArrayTable.FinishArrayTableBuffer(fbb, ArrayTable.Pack(fbb, this));\n    return fbb.DataBuffer.ToSizedArray();\n  }\n}\n\n\nstatic public class ArrayTableVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos)\n  {\n    return verifier.VerifyTableStart(tablePos)\n      && verifier.VerifyField(tablePos, 4 /*A*/, 160 /*MyGame.Example.ArrayStruct*/, 8, false)\n      && verifier.VerifyTableEnd(tablePos);\n  }\n}\n\n}\n"
  },
  {
    "path": "tests/MyGame/Example/ArrayTable.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class ArrayTable extends com.google.flatbuffers.Table {\n  public static void ValidateVersion() { Constants.FLATBUFFERS_25_12_19(); }\n  public static ArrayTable getRootAsArrayTable(ByteBuffer _bb) { return getRootAsArrayTable(_bb, new ArrayTable()); }\n  public static ArrayTable getRootAsArrayTable(ByteBuffer _bb, ArrayTable obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }\n  public static boolean ArrayTableBufferHasIdentifier(ByteBuffer _bb) { return __has_identifier(_bb, \"ARRT\"); }\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public ArrayTable __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public MyGame.Example.ArrayStruct a() { return a(new MyGame.Example.ArrayStruct()); }\n  public MyGame.Example.ArrayStruct a(MyGame.Example.ArrayStruct obj) { int o = __offset(4); return o != 0 ? obj.__assign(o + bb_pos, bb) : null; }\n\n  public static void startArrayTable(FlatBufferBuilder builder) { builder.startTable(1); }\n  public static void addA(FlatBufferBuilder builder, int aOffset) { builder.addStruct(0, aOffset, 0); }\n  public static int endArrayTable(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    return o;\n  }\n  public static void finishArrayTableBuffer(FlatBufferBuilder builder, int offset) { builder.finish(offset, \"ARRT\"); }\n  public static void finishSizePrefixedArrayTableBuffer(FlatBufferBuilder builder, int offset) { builder.finishSizePrefixed(offset, \"ARRT\"); }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public ArrayTable get(int j) { return get(new ArrayTable(), j); }\n    public ArrayTable get(ArrayTable obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); }\n  }\n  public ArrayTableT unpack() {\n    ArrayTableT _o = new ArrayTableT();\n    unpackTo(_o);\n    return _o;\n  }\n  public void unpackTo(ArrayTableT _o) {\n    if (a() != null) a().unpackTo(_o.getA());\n    else _o.setA(null);\n  }\n  public static int pack(FlatBufferBuilder builder, ArrayTableT _o) {\n    if (_o == null) return 0;\n    startArrayTable(builder);\n    addA(builder, MyGame.Example.ArrayStruct.pack(builder, _o.getA()));\n    return endArrayTable(builder);\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/ArrayTable.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: Example\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nfrom typing import Any\nfrom MyGame.Example.ArrayStruct import ArrayStruct\nfrom typing import Optional\nnp = import_numpy()\n\nclass ArrayTable(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset: int = 0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = ArrayTable()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsArrayTable(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    @classmethod\n    def ArrayTableBufferHasIdentifier(cls, buf, offset, size_prefixed=False):\n        return flatbuffers.util.BufferHasIdentifier(buf, offset, b\"\\x41\\x52\\x52\\x54\", size_prefixed=size_prefixed)\n\n    # ArrayTable\n    def Init(self, buf: bytes, pos: int):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # ArrayTable\n    def A(self) -> Optional[ArrayStruct]:\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            x = o + self._tab.Pos\n            obj = ArrayStruct()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\ndef ArrayTableStart(builder: flatbuffers.Builder):\n    builder.StartObject(1)\n\ndef Start(builder: flatbuffers.Builder):\n    ArrayTableStart(builder)\n\ndef ArrayTableAddA(builder: flatbuffers.Builder, a: Any):\n    builder.PrependStructSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(a), 0)\n\ndef AddA(builder: flatbuffers.Builder, a: Any):\n    ArrayTableAddA(builder, a)\n\ndef ArrayTableEnd(builder: flatbuffers.Builder) -> int:\n    return builder.EndObject()\n\ndef End(builder: flatbuffers.Builder) -> int:\n    return ArrayTableEnd(builder)\n\nimport MyGame.Example.ArrayStruct\ntry:\n    from typing import Optional\nexcept:\n    pass\n\nclass ArrayTableT(object):\n\n    # ArrayTableT\n    def __init__(\n        self,\n        a = None,\n    ):\n        self.a = a  # type: Optional[MyGame.Example.ArrayStruct.ArrayStructT]\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        arrayTable = ArrayTable()\n        arrayTable.Init(buf, pos)\n        return cls.InitFromObj(arrayTable)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, arrayTable):\n        x = ArrayTableT()\n        x._UnPack(arrayTable)\n        return x\n\n    # ArrayTableT\n    def _UnPack(self, arrayTable):\n        if arrayTable is None:\n            return\n        if arrayTable.A() is not None:\n            self.a = MyGame.Example.ArrayStruct.ArrayStructT.InitFromObj(arrayTable.A())\n\n    # ArrayTableT\n    def Pack(self, builder):\n        ArrayTableStart(builder)\n        if self.a is not None:\n            a = self.a.Pack(builder)\n            ArrayTableAddA(builder, a)\n        arrayTable = ArrayTableEnd(builder)\n        return arrayTable\n"
  },
  {
    "path": "tests/MyGame/Example/ArrayTable.pyi",
    "content": "from __future__ import annotations\n\nimport flatbuffers\nimport numpy as np\n\nimport typing\nfrom MyGame.Example.ArrayStruct import ArrayStruct, ArrayStructT\n\nuoffset: typing.TypeAlias = flatbuffers.number_types.UOffsetTFlags.py_type\n\nclass ArrayTable(object):\n  @classmethod\n  def GetRootAs(cls, buf: bytes, offset: int) -> ArrayTable: ...\n  @classmethod\n  def GetRootAsArrayTable(cls, buf: bytes, offset: int) -> ArrayTable: ...\n  @classmethod\n  def ArrayTableBufferHasIdentifier(cls, buf: bytes, offset: int, size_prefixed: bool) -> bool: ...\n  def Init(self, buf: bytes, pos: int) -> None: ...\n  def A(self) -> ArrayStruct | None: ...\nclass ArrayTableT(object):\n  a: ArrayStructT | None\n  def __init__(\n    self,\n    a: 'ArrayStructT' | None = ...,\n  ) -> None: ...\n  @classmethod\n  def InitFromBuf(cls, buf: bytes, pos: int) -> ArrayTableT: ...\n  @classmethod\n  def InitFromPackedBuf(cls, buf: bytes, pos: int = 0) -> ArrayTableT: ...\n  @classmethod\n  def InitFromObj(cls, arrayTable: ArrayTable) -> ArrayTableT: ...\n  def _UnPack(self, arrayTable: ArrayTable) -> None: ...\n  def Pack(self, builder: flatbuffers.Builder) -> None: ...\ndef ArrayTableStart(builder: flatbuffers.Builder) -> None: ...\ndef Start(builder: flatbuffers.Builder) -> None: ...\ndef ArrayTableAddA(builder: flatbuffers.Builder, a: uoffset) -> None: ...\ndef ArrayTableEnd(builder: flatbuffers.Builder) -> uoffset: ...\ndef End(builder: flatbuffers.Builder) -> uoffset: ...\n\n"
  },
  {
    "path": "tests/MyGame/Example/ArrayTableT.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\npublic class ArrayTableT {\n  private MyGame.Example.ArrayStructT a;\n\n  public MyGame.Example.ArrayStructT getA() { return a; }\n\n  public void setA(MyGame.Example.ArrayStructT a) { this.a = a; }\n\n\n  public ArrayTableT() {\n    this.a = new MyGame.Example.ArrayStructT();\n  }\n  public static ArrayTableT deserializeFromBinary(byte[] fbBuffer) {\n    return ArrayTable.getRootAsArrayTable(ByteBuffer.wrap(fbBuffer)).unpack();\n  }\n  public byte[] serializeToBinary() {\n    FlatBufferBuilder fbb = new FlatBufferBuilder();\n    ArrayTable.finishArrayTableBuffer(fbb, ArrayTable.pack(fbb, this));\n    return fbb.sizedByteArray();\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/Color.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace MyGame.Example\n{\n\n/// Composite components of Monster color.\n[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]\n[System.FlagsAttribute]\npublic enum Color : byte\n{\n  Red = 1,\n  /// \\brief color Green\n  /// Green is bit_flag with value (1u << 1)\n  Green = 2,\n  /// \\brief color Blue (1u << 3)\n  Blue = 8,\n};\n\n\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Color.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage Example\n\nimport \"strconv\"\n\n/// Composite components of Monster color.\ntype Color byte\n\nconst (\n\tColorRed   Color = 1\n\t/// \\brief color Green\n\t/// Green is bit_flag with value (1u << 1)\n\tColorGreen Color = 2\n\t/// \\brief color Blue (1u << 3)\n\tColorBlue  Color = 8\n)\n\nvar EnumNamesColor = map[Color]string{\n\tColorRed:   \"Red\",\n\tColorGreen: \"Green\",\n\tColorBlue:  \"Blue\",\n}\n\nvar EnumValuesColor = map[string]Color{\n\t\"Red\":   ColorRed,\n\t\"Green\": ColorGreen,\n\t\"Blue\":  ColorBlue,\n}\n\nfunc (v Color) String() string {\n\tif s, ok := EnumNamesColor[v]; ok {\n\t\treturn s\n\t}\n\treturn \"Color(\" + strconv.FormatInt(int64(v), 10) + \")\"\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Color.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\n/**\n * Composite components of Monster color.\n */\n@SuppressWarnings(\"unused\")\npublic final class Color {\n  private Color() { }\n  public static final int Red = 1;\n  /**\n   * \\brief color Green\n   * Green is bit_flag with value (1u << 1)\n   */\n  public static final int Green = 2;\n  /**\n   * \\brief color Blue (1u << 3)\n   */\n  public static final int Blue = 8;\n\n  public static final String[] names = { \"Red\", \"Green\", \"\", \"\", \"\", \"\", \"\", \"Blue\", };\n\n  public static String name(int e) { return names[e - Red]; }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/Color.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example\n\n/**\n * Composite components of Monster color.\n */\n@Suppress(\"unused\")\nclass Color private constructor() {\n    companion object {\n        const val Red: UByte = 1u\n        /**\n         * \\brief color Green\n         * Green is bit_flag with value (1u << 1)\n         */\n        const val Green: UByte = 2u\n        /**\n         * \\brief color Blue (1u << 3)\n         */\n        const val Blue: UByte = 8u\n        val names : Array<String> = arrayOf(\"Red\", \"Green\", \"\", \"\", \"\", \"\", \"\", \"Blue\")\n        fun name(e: Int) : String = names[e - Red.toInt()]\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Color.lua",
    "content": "--[[ MyGame.Example.Color\n\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : //monster_test.fbs\n  Rooting type : MyGame.Example.Monster (//monster_test.fbs)\n\n--]]\n\n-- Composite components of Monster color.\nlocal Color = {\n  Red = 1,\n  -- \\brief color Green\n  -- Green is bit_flag with value (1u << 1)\n  Green = 2,\n  -- \\brief color Blue (1u << 3)\n  Blue = 8,\n}\n\nreturn Color"
  },
  {
    "path": "tests/MyGame/Example/Color.nim",
    "content": "#[ MyGame.Example.Color\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : \n  Rooting type : MyGame.Example.Monster ()\n]#\n\n#  Composite components of Monster color.\ntype Color*{.pure.} = enum\n  Red = 1.uint8,\n  #  \\brief color Green\n  #  Green is bit_flag with value (1u << 1)\n  Green = 2.uint8,\n  #  \\brief color Blue (1u << 3)\n  Blue = 8.uint8,\n"
  },
  {
    "path": "tests/MyGame/Example/Color.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nnamespace MyGame\\Example;\n\n/// Composite components of Monster color.\nclass Color\n{\n    const Red = 1;\n    /// \\brief color Green\n    /// Green is bit_flag with value (1u << 1)\n    const Green = 2;\n    /// \\brief color Blue (1u << 3)\n    const Blue = 8;\n\n    private static $names = array(\n        Color::Red=>\"Red\",\n        Color::Green=>\"Green\",\n        Color::Blue=>\"Blue\",\n    );\n\n    public static function Name($e)\n    {\n        if (!isset(self::$names[$e])) {\n            throw new \\Exception();\n        }\n        return self::$names[$e];\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Color.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: Example\n\n# Composite components of Monster color.\nclass Color(object):\n    Red = 1\n    # \\brief color Green\n    # Green is bit_flag with value (1u << 1)\n    Green = 2\n    # \\brief color Blue (1u << 3)\n    Blue = 8\n"
  },
  {
    "path": "tests/MyGame/Example/LargeArrayStruct.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace MyGame.Example\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct LargeArrayStruct : IFlatbufferObject\n{\n  private Struct __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Struct(_i, _bb); }\n  public LargeArrayStruct __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public byte D(int j) { return __p.bb.Get(__p.bb_pos + 0 + j * 1); }\n  public const int DLength = 64;\n#if ENABLE_SPAN_T\n  public Span<byte> GetDBytes() { return __p.bb.ToSpan(__p.bb_pos + 0, 64); }\n#else\n  public ArraySegment<byte>? GetDBytes() { return __p.bb.ToArraySegment(__p.bb_pos + 0, 64);}\n#endif\n  public void MutateD(int j, byte d) { __p.bb.Put(__p.bb_pos + 0 + j * 1, d); }\n  public float E(int j) { return __p.bb.GetFloat(__p.bb_pos + 64 + j * 4); }\n  public const int ELength = 64;\n#if ENABLE_SPAN_T\n  public Span<float> GetEBytes() { return System.Runtime.InteropServices.MemoryMarshal.Cast<byte, float>(__p.bb.ToSpan(__p.bb_pos + 64, 256)); }\n#else\n  public ArraySegment<byte>? GetEBytes() { return __p.bb.ToArraySegment(__p.bb_pos + 64, 256);}\n#endif\n  public void MutateE(int j, float e) { __p.bb.PutFloat(__p.bb_pos + 64 + j * 4, e); }\n  public bool F(int j) { return 0!=__p.bb.Get(__p.bb_pos + 320 + j * 1); }\n  public const int FLength = 64;\n#if ENABLE_SPAN_T\n  public Span<bool> GetFBytes() { return System.Runtime.InteropServices.MemoryMarshal.Cast<byte, bool>(__p.bb.ToSpan(__p.bb_pos + 320, 64)); }\n#else\n  public ArraySegment<byte>? GetFBytes() { return __p.bb.ToArraySegment(__p.bb_pos + 320, 64);}\n#endif\n  public void MutateF(int j, bool f) { __p.bb.Put(__p.bb_pos + 320 + j * 1, (byte)(f ? 1 : 0)); }\n  public MyGame.Example.NestedStruct G(int j) { return (new MyGame.Example.NestedStruct()).__assign(__p.bb_pos + 384 + j * 32, __p.bb); }\n  public MyGame.Example.TestEnum H(int j) { return (MyGame.Example.TestEnum)__p.bb.GetSbyte(__p.bb_pos + 2432 + j * 1); }\n  public const int HLength = 64;\n#if ENABLE_SPAN_T\n  public Span<MyGame.Example.TestEnum> GetHBytes() { return System.Runtime.InteropServices.MemoryMarshal.Cast<byte, MyGame.Example.TestEnum>(__p.bb.ToSpan(__p.bb_pos + 2432, 64)); }\n#else\n  public ArraySegment<byte>? GetHBytes() { return __p.bb.ToArraySegment(__p.bb_pos + 2432, 64);}\n#endif\n  public void MutateH(int j, MyGame.Example.TestEnum h) { __p.bb.PutSbyte(__p.bb_pos + 2432 + j * 1, (sbyte)h); }\n\n  public static Offset<MyGame.Example.LargeArrayStruct> CreateLargeArrayStruct(FlatBufferBuilder builder, byte[] D, float[] E, bool[] F, int[,] g_A, MyGame.Example.TestEnum[] g_B, MyGame.Example.TestEnum[,] g_C, long[,] g_D, MyGame.Example.TestEnum[] H) {\n    builder.Prep(8, 2496);\n    for (int _idx0 = 64; _idx0 > 0; _idx0--) {\n      builder.PutSbyte((sbyte)H[_idx0-1]);\n    }\n    for (int _idx0 = 64; _idx0 > 0; _idx0--) {\n      builder.Prep(8, 32);\n      for (int _idx1 = 2; _idx1 > 0; _idx1--) {\n        builder.PutLong(g_D[_idx0-1,_idx1-1]);\n      }\n      builder.Pad(5);\n      for (int _idx1 = 2; _idx1 > 0; _idx1--) {\n        builder.PutSbyte((sbyte)g_C[_idx0-1,_idx1-1]);\n      }\n      builder.PutSbyte((sbyte)g_B[_idx0-1]);\n      for (int _idx1 = 2; _idx1 > 0; _idx1--) {\n        builder.PutInt(g_A[_idx0-1,_idx1-1]);\n      }\n    }\n    for (int _idx0 = 64; _idx0 > 0; _idx0--) {\n      builder.PutBool(F[_idx0-1]);\n    }\n    for (int _idx0 = 64; _idx0 > 0; _idx0--) {\n      builder.PutFloat(E[_idx0-1]);\n    }\n    for (int _idx0 = 64; _idx0 > 0; _idx0--) {\n      builder.PutByte(D[_idx0-1]);\n    }\n    return new Offset<MyGame.Example.LargeArrayStruct>(builder.Offset);\n  }\n  public LargeArrayStructT UnPack() {\n    var _o = new LargeArrayStructT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(LargeArrayStructT _o) {\n    _o.D = new byte[64];\n    for (var _j = 0; _j < 64; ++_j) { _o.D[_j] = this.D(_j); }\n    _o.E = new float[64];\n    for (var _j = 0; _j < 64; ++_j) { _o.E[_j] = this.E(_j); }\n    _o.F = new bool[64];\n    for (var _j = 0; _j < 64; ++_j) { _o.F[_j] = this.F(_j); }\n    _o.G = new MyGame.Example.NestedStructT[64];\n    for (var _j = 0; _j < 64; ++_j) { _o.G[_j] = this.G(_j).UnPack(); }\n    _o.H = new MyGame.Example.TestEnum[64];\n    for (var _j = 0; _j < 64; ++_j) { _o.H[_j] = this.H(_j); }\n  }\n  public static Offset<MyGame.Example.LargeArrayStruct> Pack(FlatBufferBuilder builder, LargeArrayStructT _o) {\n    if (_o == null) return default(Offset<MyGame.Example.LargeArrayStruct>);\n    var _d = _o.D;\n    var _e = _o.E;\n    var _f = _o.F;\n    var _g_a = new int[64,2];\n    for (var idx0 = 0; idx0 < 64; ++idx0) {for (var idx1 = 0; idx1 < 2; ++idx1) {_g_a[idx0,idx1] = _o.G[idx0].A[idx1];}}\n    var _g_b = new MyGame.Example.TestEnum[64];\n    for (var idx0 = 0; idx0 < 64; ++idx0) {_g_b[idx0] = _o.G[idx0].B;}\n    var _g_c = new MyGame.Example.TestEnum[64,2];\n    for (var idx0 = 0; idx0 < 64; ++idx0) {for (var idx1 = 0; idx1 < 2; ++idx1) {_g_c[idx0,idx1] = _o.G[idx0].C[idx1];}}\n    var _g_d = new long[64,2];\n    for (var idx0 = 0; idx0 < 64; ++idx0) {for (var idx1 = 0; idx1 < 2; ++idx1) {_g_d[idx0,idx1] = _o.G[idx0].D[idx1];}}\n    var _h = _o.H;\n    return CreateLargeArrayStruct(\n      builder,\n      _d,\n      _e,\n      _f,\n      _g_a,\n      _g_b,\n      _g_c,\n      _g_d,\n      _h);\n  }\n}\n\npublic class LargeArrayStructT\n{\n  [Newtonsoft.Json.JsonProperty(\"d\")]\n  public byte[] D { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"e\")]\n  public float[] E { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"f\")]\n  public bool[] F { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"g\")]\n  public MyGame.Example.NestedStructT[] G { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"h\")]\n  public MyGame.Example.TestEnum[] H { get; set; }\n\n  public LargeArrayStructT() {\n    this.D = new byte[64];\n    this.E = new float[64];\n    this.F = new bool[64];\n    this.G = new MyGame.Example.NestedStructT[64];\n    this.H = new MyGame.Example.TestEnum[64];\n  }\n}\n\n\n}\n"
  },
  {
    "path": "tests/MyGame/Example/LargeArrayStruct.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class LargeArrayStruct extends Struct {\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public LargeArrayStruct __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public int d(int j) { return bb.get(bb_pos + 0 + j * 1); }\n  public void mutateD(int j, int d) { bb.put(bb_pos + 0 + j * 1, (byte) d); }\n  public float e(int j) { return bb.getFloat(bb_pos + 64 + j * 4); }\n  public void mutateE(int j, float e) { bb.putFloat(bb_pos + 64 + j * 4, e); }\n  public boolean f(int j) { return 0!=bb.get(bb_pos + 320 + j * 1); }\n  public void mutateF(int j, boolean f) { bb.put(bb_pos + 320 + j * 1, (byte)(f ? 1 : 0)); }\n  public MyGame.Example.NestedStruct g(int j) { return g(new MyGame.Example.NestedStruct(), j); }\n  public MyGame.Example.NestedStruct g(MyGame.Example.NestedStruct obj, int j) { return obj.__assign(bb_pos + 384 + j * 32, bb); }\n  public byte h(int j) { return bb.get(bb_pos + 2432 + j * 1); }\n  public void mutateH(int j, byte h) { bb.put(bb_pos + 2432 + j * 1, h); }\n\n  public static int createLargeArrayStruct(FlatBufferBuilder builder, int[] d, float[] e, boolean[] f, int[][] g_a, byte[] g_b, byte[][] g_c, long[][] g_d, byte[] h) {\n    builder.prep(8, 2496);\n    for (int _idx0 = 64; _idx0 > 0; _idx0--) {\n      builder.putByte(h[_idx0-1]);\n    }\n    for (int _idx0 = 64; _idx0 > 0; _idx0--) {\n      builder.prep(8, 32);\n      for (int _idx1 = 2; _idx1 > 0; _idx1--) {\n        builder.putLong(g_d[_idx0-1][_idx1-1]);\n      }\n      builder.pad(5);\n      for (int _idx1 = 2; _idx1 > 0; _idx1--) {\n        builder.putByte(g_c[_idx0-1][_idx1-1]);\n      }\n      builder.putByte(g_b[_idx0-1]);\n      for (int _idx1 = 2; _idx1 > 0; _idx1--) {\n        builder.putInt(g_a[_idx0-1][_idx1-1]);\n      }\n    }\n    for (int _idx0 = 64; _idx0 > 0; _idx0--) {\n      builder.putBoolean(f[_idx0-1]);\n    }\n    for (int _idx0 = 64; _idx0 > 0; _idx0--) {\n      builder.putFloat(e[_idx0-1]);\n    }\n    for (int _idx0 = 64; _idx0 > 0; _idx0--) {\n      builder.putByte((byte) d[_idx0-1]);\n    }\n    return builder.offset();\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public LargeArrayStruct get(int j) { return get(new LargeArrayStruct(), j); }\n    public LargeArrayStruct get(LargeArrayStruct obj, int j) {  return obj.__assign(__element(j), bb); }\n  }\n  public LargeArrayStructT unpack() {\n    LargeArrayStructT _o = new LargeArrayStructT();\n    unpackTo(_o);\n    return _o;\n  }\n  public void unpackTo(LargeArrayStructT _o) {\n    int[] _oD = _o.getD();\n    for (int _j = 0; _j < 64; ++_j) { _oD[_j] = d(_j); }\n    float[] _oE = _o.getE();\n    for (int _j = 0; _j < 64; ++_j) { _oE[_j] = e(_j); }\n    boolean[] _oF = _o.getF();\n    for (int _j = 0; _j < 64; ++_j) { _oF[_j] = f(_j); }\n    MyGame.Example.NestedStructT[] _oG = _o.getG();\n    for (int _j = 0; _j < 64; ++_j) { _oG[_j] = g(_j).unpack(); }\n    byte[] _oH = _o.getH();\n    for (int _j = 0; _j < 64; ++_j) { _oH[_j] = h(_j); }\n  }\n  public static int pack(FlatBufferBuilder builder, LargeArrayStructT _o) {\n    if (_o == null) return 0;\n    int[] _d = _o.getD();\n    float[] _e = _o.getE();\n    boolean[] _f = _o.getF();\n    int[][] _g_a = new int[64][2];\n    for (int idx0 = 0; idx0 < 64; ++idx0) {for (int idx1 = 0; idx1 < 2; ++idx1) {_g_a[idx0][idx1] = _o.getG()[idx0].getA()[idx1];}}\n    byte[] _g_b = new byte[64];\n    for (int idx0 = 0; idx0 < 64; ++idx0) {_g_b[idx0] = _o.getG()[idx0].getB();}\n    byte[][] _g_c = new byte[64][2];\n    for (int idx0 = 0; idx0 < 64; ++idx0) {for (int idx1 = 0; idx1 < 2; ++idx1) {_g_c[idx0][idx1] = _o.getG()[idx0].getC()[idx1];}}\n    long[][] _g_d = new long[64][2];\n    for (int idx0 = 0; idx0 < 64; ++idx0) {for (int idx1 = 0; idx1 < 2; ++idx1) {_g_d[idx0][idx1] = _o.getG()[idx0].getD()[idx1];}}\n    byte[] _h = _o.getH();\n    return createLargeArrayStruct(\n      builder,\n      _d,\n      _e,\n      _f,\n      _g_a,\n      _g_b,\n      _g_c,\n      _g_d,\n      _h);\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/LargeArrayStruct.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: Example\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nfrom typing import Any\nfrom MyGame.Example.NestedStruct import NestedStruct\nnp = import_numpy()\n\nclass LargeArrayStruct(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def SizeOf(cls) -> int:\n        return 2496\n\n    # LargeArrayStruct\n    def Init(self, buf: bytes, pos: int):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # LargeArrayStruct\n    def D(self, j = None):\n        if j is None:\n            return [self._tab.Get(flatbuffers.number_types.Uint8Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(0 + i * 1)) for i in range(self.DLength())]\n        elif j >= 0 and j < self.DLength():\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(0 + j * 1))\n        else:\n            return None\n\n    # LargeArrayStruct\n    def DAsNumpy(self):\n        return self._tab.GetArrayAsNumpy(flatbuffers.number_types.Uint8Flags, self._tab.Pos + 0, self.DLength())\n\n    # LargeArrayStruct\n    def DLength(self) -> int:\n        return 64\n\n    # LargeArrayStruct\n    def DIsNone(self) -> bool:\n        return False\n\n    # LargeArrayStruct\n    def E(self, j = None):\n        if j is None:\n            return [self._tab.Get(flatbuffers.number_types.Float32Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(64 + i * 4)) for i in range(self.ELength())]\n        elif j >= 0 and j < self.ELength():\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(64 + j * 4))\n        else:\n            return None\n\n    # LargeArrayStruct\n    def EAsNumpy(self):\n        return self._tab.GetArrayAsNumpy(flatbuffers.number_types.Float32Flags, self._tab.Pos + 64, self.ELength())\n\n    # LargeArrayStruct\n    def ELength(self) -> int:\n        return 64\n\n    # LargeArrayStruct\n    def EIsNone(self) -> bool:\n        return False\n\n    # LargeArrayStruct\n    def F(self, j = None):\n        if j is None:\n            return [self._tab.Get(flatbuffers.number_types.BoolFlags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(320 + i * 1)) for i in range(self.FLength())]\n        elif j >= 0 and j < self.FLength():\n            return self._tab.Get(flatbuffers.number_types.BoolFlags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(320 + j * 1))\n        else:\n            return None\n\n    # LargeArrayStruct\n    def FAsNumpy(self):\n        return self._tab.GetArrayAsNumpy(flatbuffers.number_types.BoolFlags, self._tab.Pos + 320, self.FLength())\n\n    # LargeArrayStruct\n    def FLength(self) -> int:\n        return 64\n\n    # LargeArrayStruct\n    def FIsNone(self) -> bool:\n        return False\n\n    # LargeArrayStruct\n    def G(self, i: int) -> NestedStruct:\n        obj = NestedStruct()\n        obj.Init(self._tab.Bytes, self._tab.Pos + 384 + i * 32)\n        return obj\n\n    # LargeArrayStruct\n    def GLength(self) -> int:\n        return 64\n\n    # LargeArrayStruct\n    def GIsNone(self) -> bool:\n        return False\n\n    # LargeArrayStruct\n    def H(self, j = None):\n        if j is None:\n            return [self._tab.Get(flatbuffers.number_types.Int8Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(2432 + i * 1)) for i in range(self.HLength())]\n        elif j >= 0 and j < self.HLength():\n            return self._tab.Get(flatbuffers.number_types.Int8Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(2432 + j * 1))\n        else:\n            return None\n\n    # LargeArrayStruct\n    def HAsNumpy(self):\n        return self._tab.GetArrayAsNumpy(flatbuffers.number_types.Int8Flags, self._tab.Pos + 2432, self.HLength())\n\n    # LargeArrayStruct\n    def HLength(self) -> int:\n        return 64\n\n    # LargeArrayStruct\n    def HIsNone(self) -> bool:\n        return False\n\n\ndef CreateLargeArrayStruct(builder, d, e, f, g_a, g_b, g_c, g_d, h):\n    builder.Prep(8, 2496)\n    for _idx0 in range(64 , 0, -1):\n        builder.PrependInt8(h[_idx0-1])\n    for _idx0 in range(64 , 0, -1):\n        builder.Prep(8, 32)\n        for _idx1 in range(2 , 0, -1):\n            builder.PrependInt64(g_d[_idx0-1][_idx1-1])\n        builder.Pad(5)\n        for _idx1 in range(2 , 0, -1):\n            builder.PrependInt8(g_c[_idx0-1][_idx1-1])\n        builder.PrependInt8(g_b[_idx0-1])\n        for _idx1 in range(2 , 0, -1):\n            builder.PrependInt32(g_a[_idx0-1][_idx1-1])\n    for _idx0 in range(64 , 0, -1):\n        builder.PrependBool(f[_idx0-1])\n    for _idx0 in range(64 , 0, -1):\n        builder.PrependFloat32(e[_idx0-1])\n    for _idx0 in range(64 , 0, -1):\n        builder.PrependUint8(d[_idx0-1])\n    return builder.Offset()\n\nimport MyGame.Example.NestedStruct\ntry:\n    from typing import List\nexcept:\n    pass\n\nclass LargeArrayStructT(object):\n\n    # LargeArrayStructT\n    def __init__(\n        self,\n        d = None,\n        e = None,\n        f = None,\n        g = None,\n        h = None,\n    ):\n        self.d = d  # type: Optional[List[int]]\n        self.e = e  # type: Optional[List[float]]\n        self.f = f  # type: Optional[List[bool]]\n        self.g = g  # type: Optional[List[MyGame.Example.NestedStruct.NestedStructT]]\n        self.h = h  # type: Optional[List[int]]\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        largeArrayStruct = LargeArrayStruct()\n        largeArrayStruct.Init(buf, pos)\n        return cls.InitFromObj(largeArrayStruct)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, largeArrayStruct):\n        x = LargeArrayStructT()\n        x._UnPack(largeArrayStruct)\n        return x\n\n    # LargeArrayStructT\n    def _UnPack(self, largeArrayStruct):\n        if largeArrayStruct is None:\n            return\n        if not largeArrayStruct.DIsNone():\n            if np is None:\n                self.d = []\n                for i in range(largeArrayStruct.DLength()):\n                    self.d.append(largeArrayStruct.D(i))\n            else:\n                self.d = largeArrayStruct.DAsNumpy()\n        if not largeArrayStruct.EIsNone():\n            if np is None:\n                self.e = []\n                for i in range(largeArrayStruct.ELength()):\n                    self.e.append(largeArrayStruct.E(i))\n            else:\n                self.e = largeArrayStruct.EAsNumpy()\n        if not largeArrayStruct.FIsNone():\n            if np is None:\n                self.f = []\n                for i in range(largeArrayStruct.FLength()):\n                    self.f.append(largeArrayStruct.F(i))\n            else:\n                self.f = largeArrayStruct.FAsNumpy()\n        if not largeArrayStruct.GIsNone():\n            self.g = []\n            for i in range(largeArrayStruct.GLength()):\n                if largeArrayStruct.G(i) is None:\n                    self.g.append(None)\n                else:\n                    nestedStruct_ = MyGame.Example.NestedStruct.NestedStructT.InitFromObj(largeArrayStruct.G(i))\n                    self.g.append(nestedStruct_)\n        if not largeArrayStruct.HIsNone():\n            if np is None:\n                self.h = []\n                for i in range(largeArrayStruct.HLength()):\n                    self.h.append(largeArrayStruct.H(i))\n            else:\n                self.h = largeArrayStruct.HAsNumpy()\n\n    # LargeArrayStructT\n    def Pack(self, builder):\n        return CreateLargeArrayStruct(builder, self.d, self.e, self.f, self.g.a, self.g.b, self.g.c, self.g.d, self.h)\n"
  },
  {
    "path": "tests/MyGame/Example/LargeArrayStruct.pyi",
    "content": "from __future__ import annotations\n\nimport flatbuffers\nimport numpy as np\n\nimport typing\nfrom MyGame.Example.NestedStruct import NestedStruct, NestedStructT\nfrom MyGame.Example.TestEnum import TestEnum\n\nuoffset: typing.TypeAlias = flatbuffers.number_types.UOffsetTFlags.py_type\n\nclass LargeArrayStruct(object):\n  @classmethod\n  def SizeOf(cls) -> int: ...\n\n  def Init(self, buf: bytes, pos: int) -> None: ...\n  def D(self, i: int) -> typing.List[int]: ...\n  def DAsNumpy(self) -> np.ndarray: ...\n  def DLength(self) -> int: ...\n  def DIsNone(self) -> bool: ...\n  def E(self, i: int) -> typing.List[float]: ...\n  def EAsNumpy(self) -> np.ndarray: ...\n  def ELength(self) -> int: ...\n  def EIsNone(self) -> bool: ...\n  def F(self, i: int) -> typing.List[bool]: ...\n  def FAsNumpy(self) -> np.ndarray: ...\n  def FLength(self) -> int: ...\n  def FIsNone(self) -> bool: ...\n  def G(self, i: int) -> NestedStruct | None: ...\n  def GLength(self) -> int: ...\n  def GIsNone(self) -> bool: ...\n  def H(self, i: int) -> typing.Literal[TestEnum.A, TestEnum.B, TestEnum.C]: ...\n  def HAsNumpy(self) -> np.ndarray: ...\n  def HLength(self) -> int: ...\n  def HIsNone(self) -> bool: ...\nclass LargeArrayStructT(object):\n  d: typing.List[int]\n  e: typing.List[float]\n  f: typing.List[bool]\n  g: typing.List[NestedStructT]\n  h: typing.List[typing.Literal[TestEnum.A, TestEnum.B, TestEnum.C]]\n  def __init__(\n    self,\n    d: typing.List[int] | None = ...,\n    e: typing.List[float] | None = ...,\n    f: typing.List[bool] | None = ...,\n    g: typing.List['NestedStructT'] | None = ...,\n    h: typing.List[typing.Literal[TestEnum.A, TestEnum.B, TestEnum.C]] | None = ...,\n  ) -> None: ...\n  @classmethod\n  def InitFromBuf(cls, buf: bytes, pos: int) -> LargeArrayStructT: ...\n  @classmethod\n  def InitFromPackedBuf(cls, buf: bytes, pos: int = 0) -> LargeArrayStructT: ...\n  @classmethod\n  def InitFromObj(cls, largeArrayStruct: LargeArrayStruct) -> LargeArrayStructT: ...\n  def _UnPack(self, largeArrayStruct: LargeArrayStruct) -> None: ...\n  def Pack(self, builder: flatbuffers.Builder) -> None: ...\n\ndef CreateLargeArrayStruct(builder: flatbuffers.Builder, d: int, e: float, f: bool, g_a: int, g_b: typing.Literal[TestEnum.A, TestEnum.B, TestEnum.C], g_c: typing.Literal[TestEnum.A, TestEnum.B, TestEnum.C], g_d: int, h: typing.Literal[TestEnum.A, TestEnum.B, TestEnum.C]) -> uoffset: ...\n\n"
  },
  {
    "path": "tests/MyGame/Example/LargeArrayStructT.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\npublic class LargeArrayStructT {\n  private int[] d;\n  private float[] e;\n  private boolean[] f;\n  private MyGame.Example.NestedStructT[] g;\n  private byte[] h;\n\n  public int[] getD() { return d; }\n\n  public void setD(int[] d) { if (d != null && d.length == 64) this.d = d; }\n\n  public float[] getE() { return e; }\n\n  public void setE(float[] e) { if (e != null && e.length == 64) this.e = e; }\n\n  public boolean[] getF() { return f; }\n\n  public void setF(boolean[] f) { if (f != null && f.length == 64) this.f = f; }\n\n  public MyGame.Example.NestedStructT[] getG() { return g; }\n\n  public void setG(MyGame.Example.NestedStructT[] g) { if (g != null && g.length == 64) this.g = g; }\n\n  public byte[] getH() { return h; }\n\n  public void setH(byte[] h) { if (h != null && h.length == 64) this.h = h; }\n\n\n  public LargeArrayStructT() {\n    this.d = new int[64];\n    this.e = new float[64];\n    this.f = new boolean[64];\n    this.g = new MyGame.Example.NestedStructT[64];\n    this.h = new byte[64];\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/LongEnum.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace MyGame.Example\n{\n\n[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]\n[System.FlagsAttribute]\npublic enum LongEnum : ulong\n{\n  LongOne = 2,\n  LongTwo = 4,\n  LongBig = 1099511627776,\n};\n\n\n}\n"
  },
  {
    "path": "tests/MyGame/Example/LongEnum.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage Example\n\nimport \"strconv\"\n\ntype LongEnum uint64\n\nconst (\n\tLongEnumLongOne LongEnum = 2\n\tLongEnumLongTwo LongEnum = 4\n\tLongEnumLongBig LongEnum = 1099511627776\n)\n\nvar EnumNamesLongEnum = map[LongEnum]string{\n\tLongEnumLongOne: \"LongOne\",\n\tLongEnumLongTwo: \"LongTwo\",\n\tLongEnumLongBig: \"LongBig\",\n}\n\nvar EnumValuesLongEnum = map[string]LongEnum{\n\t\"LongOne\": LongEnumLongOne,\n\t\"LongTwo\": LongEnumLongTwo,\n\t\"LongBig\": LongEnumLongBig,\n}\n\nfunc (v LongEnum) String() string {\n\tif s, ok := EnumNamesLongEnum[v]; ok {\n\t\treturn s\n\t}\n\treturn \"LongEnum(\" + strconv.FormatInt(int64(v), 10) + \")\"\n}\n"
  },
  {
    "path": "tests/MyGame/Example/LongEnum.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\n@SuppressWarnings(\"unused\")\npublic final class LongEnum {\n  private LongEnum() { }\n  public static final long LongOne = 2L;\n  public static final long LongTwo = 4L;\n  public static final long LongBig = 1099511627776L;\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/LongEnum.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example\n\n@Suppress(\"unused\")\nclass LongEnum private constructor() {\n    companion object {\n        const val LongOne: ULong = 2UL\n        const val LongTwo: ULong = 4UL\n        const val LongBig: ULong = 1099511627776UL\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/LongEnum.lua",
    "content": "--[[ MyGame.Example.LongEnum\n\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : //monster_test.fbs\n  Rooting type : MyGame.Example.Monster (//monster_test.fbs)\n\n--]]\n\nlocal LongEnum = {\n  LongOne = 2,\n  LongTwo = 4,\n  LongBig = 1099511627776,\n}\n\nreturn LongEnum"
  },
  {
    "path": "tests/MyGame/Example/LongEnum.nim",
    "content": "#[ MyGame.Example.LongEnum\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : \n  Rooting type : MyGame.Example.Monster ()\n]#\n\ntype LongEnum*{.pure.} = enum\n  LongOne = 2.uint64,\n  LongTwo = 4.uint64,\n  LongBig = 1099511627776.uint64,\n"
  },
  {
    "path": "tests/MyGame/Example/LongEnum.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nnamespace MyGame\\Example;\n\nclass LongEnum\n{\n    const LongOne = 2;\n    const LongTwo = 4;\n    const LongBig = 1099511627776;\n\n    private static $names = array(\n        LongEnum::LongOne=>\"LongOne\",\n        LongEnum::LongTwo=>\"LongTwo\",\n        LongEnum::LongBig=>\"LongBig\",\n    );\n\n    public static function Name($e)\n    {\n        if (!isset(self::$names[$e])) {\n            throw new \\Exception();\n        }\n        return self::$names[$e];\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/LongEnum.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: Example\n\nclass LongEnum(object):\n    LongOne = 2\n    LongTwo = 4\n    LongBig = 1099511627776\n"
  },
  {
    "path": "tests/MyGame/Example/Monster.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace MyGame.Example\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\n/// an example documentation comment: \"monster object\"\npublic struct Monster : IFlatbufferObject\n{\n  private Table __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_25_12_19(); }\n  public static Monster GetRootAsMonster(ByteBuffer _bb) { return GetRootAsMonster(_bb, new Monster()); }\n  public static Monster GetRootAsMonster(ByteBuffer _bb, Monster obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }\n  public static bool MonsterBufferHasIdentifier(ByteBuffer _bb) { return Table.__has_identifier(_bb, \"MONS\"); }\n  public static bool VerifyMonster(ByteBuffer _bb) {Google.FlatBuffers.Verifier verifier = new Google.FlatBuffers.Verifier(_bb); return verifier.VerifyBuffer(\"MONS\", false, MonsterVerify.Verify); }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }\n  public Monster __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public MyGame.Example.Vec3? Pos { get { int o = __p.__offset(4); return o != 0 ? (MyGame.Example.Vec3?)(new MyGame.Example.Vec3()).__assign(o + __p.bb_pos, __p.bb) : null; } }\n  public short Mana { get { int o = __p.__offset(6); return o != 0 ? __p.bb.GetShort(o + __p.bb_pos) : (short)150; } }\n  public bool MutateMana(short mana) { int o = __p.__offset(6); if (o != 0) { __p.bb.PutShort(o + __p.bb_pos, mana); return true; } else { return false; } }\n  public short Hp { get { int o = __p.__offset(8); return o != 0 ? __p.bb.GetShort(o + __p.bb_pos) : (short)100; } }\n  public bool MutateHp(short hp) { int o = __p.__offset(8); if (o != 0) { __p.bb.PutShort(o + __p.bb_pos, hp); return true; } else { return false; } }\n  public string Name { get { int o = __p.__offset(10); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } }\n#if ENABLE_SPAN_T\n  public Span<byte> GetNameBytes() { return __p.__vector_as_span<byte>(10, 1); }\n#else\n  public ArraySegment<byte>? GetNameBytes() { return __p.__vector_as_arraysegment(10); }\n#endif\n  public byte[] GetNameArray() { return __p.__vector_as_array<byte>(10); }\n  public byte Inventory(int j) { int o = __p.__offset(14); return o != 0 ? __p.bb.Get(__p.__vector(o) + j * 1) : (byte)0; }\n  public int InventoryLength { get { int o = __p.__offset(14); return o != 0 ? __p.__vector_len(o) : 0; } }\n#if ENABLE_SPAN_T\n  public Span<byte> GetInventoryBytes() { return __p.__vector_as_span<byte>(14, 1); }\n#else\n  public ArraySegment<byte>? GetInventoryBytes() { return __p.__vector_as_arraysegment(14); }\n#endif\n  public byte[] GetInventoryArray() { return __p.__vector_as_array<byte>(14); }\n  public bool MutateInventory(int j, byte inventory) { int o = __p.__offset(14); if (o != 0) { __p.bb.Put(__p.__vector(o) + j * 1, inventory); return true; } else { return false; } }\n  public MyGame.Example.Color Color { get { int o = __p.__offset(16); return o != 0 ? (MyGame.Example.Color)__p.bb.Get(o + __p.bb_pos) : MyGame.Example.Color.Blue; } }\n  public bool MutateColor(MyGame.Example.Color color) { int o = __p.__offset(16); if (o != 0) { __p.bb.Put(o + __p.bb_pos, (byte)color); return true; } else { return false; } }\n  public MyGame.Example.Any TestType { get { int o = __p.__offset(18); return o != 0 ? (MyGame.Example.Any)__p.bb.Get(o + __p.bb_pos) : MyGame.Example.Any.NONE; } }\n  public TTable? Test<TTable>() where TTable : struct, IFlatbufferObject { int o = __p.__offset(20); return o != 0 ? (TTable?)__p.__union<TTable>(o + __p.bb_pos) : null; }\n  public MyGame.Example.Monster TestAsMonster() { return Test<MyGame.Example.Monster>().Value; }\n  internal MyGame.Example.TestSimpleTableWithEnum TestAsTestSimpleTableWithEnum() { return Test<MyGame.Example.TestSimpleTableWithEnum>().Value; }\n  public MyGame.Example2.Monster TestAsMyGame_Example2_Monster() { return Test<MyGame.Example2.Monster>().Value; }\n  public MyGame.Example.Test? Test4(int j) { int o = __p.__offset(22); return o != 0 ? (MyGame.Example.Test?)(new MyGame.Example.Test()).__assign(__p.__vector(o) + j * 4, __p.bb) : null; }\n  public int Test4Length { get { int o = __p.__offset(22); return o != 0 ? __p.__vector_len(o) : 0; } }\n  public string Testarrayofstring(int j) { int o = __p.__offset(24); return o != 0 ? __p.__string(__p.__vector(o) + j * 4) : null; }\n  public int TestarrayofstringLength { get { int o = __p.__offset(24); return o != 0 ? __p.__vector_len(o) : 0; } }\n  /// an example documentation comment: this will end up in the generated code\n  /// multiline too\n  public MyGame.Example.Monster? Testarrayoftables(int j) { int o = __p.__offset(26); return o != 0 ? (MyGame.Example.Monster?)(new MyGame.Example.Monster()).__assign(__p.__indirect(__p.__vector(o) + j * 4), __p.bb) : null; }\n  public int TestarrayoftablesLength { get { int o = __p.__offset(26); return o != 0 ? __p.__vector_len(o) : 0; } }\n  public MyGame.Example.Monster? TestarrayoftablesByKey(string key) { int o = __p.__offset(26); return o != 0 ? MyGame.Example.Monster.__lookup_by_key(__p.__vector(o), key, __p.bb) : null; }\n  public MyGame.Example.Monster? Enemy { get { int o = __p.__offset(28); return o != 0 ? (MyGame.Example.Monster?)(new MyGame.Example.Monster()).__assign(__p.__indirect(o + __p.bb_pos), __p.bb) : null; } }\n  public byte Testnestedflatbuffer(int j) { int o = __p.__offset(30); return o != 0 ? __p.bb.Get(__p.__vector(o) + j * 1) : (byte)0; }\n  public int TestnestedflatbufferLength { get { int o = __p.__offset(30); return o != 0 ? __p.__vector_len(o) : 0; } }\n#if ENABLE_SPAN_T\n  public Span<byte> GetTestnestedflatbufferBytes() { return __p.__vector_as_span<byte>(30, 1); }\n#else\n  public ArraySegment<byte>? GetTestnestedflatbufferBytes() { return __p.__vector_as_arraysegment(30); }\n#endif\n  public byte[] GetTestnestedflatbufferArray() { return __p.__vector_as_array<byte>(30); }\n  public MyGame.Example.Monster? GetTestnestedflatbufferAsMonster() { int o = __p.__offset(30); return o != 0 ? (MyGame.Example.Monster?)(new MyGame.Example.Monster()).__assign(__p.__indirect(__p.__vector(o)), __p.bb) : null; }\n  public bool MutateTestnestedflatbuffer(int j, byte testnestedflatbuffer) { int o = __p.__offset(30); if (o != 0) { __p.bb.Put(__p.__vector(o) + j * 1, testnestedflatbuffer); return true; } else { return false; } }\n  public MyGame.Example.Stat? Testempty { get { int o = __p.__offset(32); return o != 0 ? (MyGame.Example.Stat?)(new MyGame.Example.Stat()).__assign(__p.__indirect(o + __p.bb_pos), __p.bb) : null; } }\n  public bool Testbool { get { int o = __p.__offset(34); return o != 0 ? 0!=__p.bb.Get(o + __p.bb_pos) : (bool)false; } }\n  public bool MutateTestbool(bool testbool) { int o = __p.__offset(34); if (o != 0) { __p.bb.Put(o + __p.bb_pos, (byte)(testbool ? 1 : 0)); return true; } else { return false; } }\n  public int Testhashs32Fnv1 { get { int o = __p.__offset(36); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } }\n  public bool MutateTesthashs32Fnv1(int testhashs32_fnv1) { int o = __p.__offset(36); if (o != 0) { __p.bb.PutInt(o + __p.bb_pos, testhashs32_fnv1); return true; } else { return false; } }\n  public uint Testhashu32Fnv1 { get { int o = __p.__offset(38); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }\n  public bool MutateTesthashu32Fnv1(uint testhashu32_fnv1) { int o = __p.__offset(38); if (o != 0) { __p.bb.PutUint(o + __p.bb_pos, testhashu32_fnv1); return true; } else { return false; } }\n  public long Testhashs64Fnv1 { get { int o = __p.__offset(40); return o != 0 ? __p.bb.GetLong(o + __p.bb_pos) : (long)0; } }\n  public bool MutateTesthashs64Fnv1(long testhashs64_fnv1) { int o = __p.__offset(40); if (o != 0) { __p.bb.PutLong(o + __p.bb_pos, testhashs64_fnv1); return true; } else { return false; } }\n  public ulong Testhashu64Fnv1 { get { int o = __p.__offset(42); return o != 0 ? __p.bb.GetUlong(o + __p.bb_pos) : (ulong)0; } }\n  public bool MutateTesthashu64Fnv1(ulong testhashu64_fnv1) { int o = __p.__offset(42); if (o != 0) { __p.bb.PutUlong(o + __p.bb_pos, testhashu64_fnv1); return true; } else { return false; } }\n  public int Testhashs32Fnv1a { get { int o = __p.__offset(44); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } }\n  public bool MutateTesthashs32Fnv1a(int testhashs32_fnv1a) { int o = __p.__offset(44); if (o != 0) { __p.bb.PutInt(o + __p.bb_pos, testhashs32_fnv1a); return true; } else { return false; } }\n  public uint Testhashu32Fnv1a { get { int o = __p.__offset(46); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }\n  public bool MutateTesthashu32Fnv1a(uint testhashu32_fnv1a) { int o = __p.__offset(46); if (o != 0) { __p.bb.PutUint(o + __p.bb_pos, testhashu32_fnv1a); return true; } else { return false; } }\n  public long Testhashs64Fnv1a { get { int o = __p.__offset(48); return o != 0 ? __p.bb.GetLong(o + __p.bb_pos) : (long)0; } }\n  public bool MutateTesthashs64Fnv1a(long testhashs64_fnv1a) { int o = __p.__offset(48); if (o != 0) { __p.bb.PutLong(o + __p.bb_pos, testhashs64_fnv1a); return true; } else { return false; } }\n  public ulong Testhashu64Fnv1a { get { int o = __p.__offset(50); return o != 0 ? __p.bb.GetUlong(o + __p.bb_pos) : (ulong)0; } }\n  public bool MutateTesthashu64Fnv1a(ulong testhashu64_fnv1a) { int o = __p.__offset(50); if (o != 0) { __p.bb.PutUlong(o + __p.bb_pos, testhashu64_fnv1a); return true; } else { return false; } }\n  public bool Testarrayofbools(int j) { int o = __p.__offset(52); return o != 0 ? 0!=__p.bb.Get(__p.__vector(o) + j * 1) : false; }\n  public int TestarrayofboolsLength { get { int o = __p.__offset(52); return o != 0 ? __p.__vector_len(o) : 0; } }\n#if ENABLE_SPAN_T\n  public Span<bool> GetTestarrayofboolsBytes() { return __p.__vector_as_span<bool>(52, 1); }\n#else\n  public ArraySegment<byte>? GetTestarrayofboolsBytes() { return __p.__vector_as_arraysegment(52); }\n#endif\n  public bool[] GetTestarrayofboolsArray() { return __p.__vector_as_array<bool>(52); }\n  public bool MutateTestarrayofbools(int j, bool testarrayofbools) { int o = __p.__offset(52); if (o != 0) { __p.bb.Put(__p.__vector(o) + j * 1, (byte)(testarrayofbools ? 1 : 0)); return true; } else { return false; } }\n  public float Testf { get { int o = __p.__offset(54); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)3.14159f; } }\n  public bool MutateTestf(float testf) { int o = __p.__offset(54); if (o != 0) { __p.bb.PutFloat(o + __p.bb_pos, testf); return true; } else { return false; } }\n  public float Testf2 { get { int o = __p.__offset(56); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)3.0f; } }\n  public bool MutateTestf2(float testf2) { int o = __p.__offset(56); if (o != 0) { __p.bb.PutFloat(o + __p.bb_pos, testf2); return true; } else { return false; } }\n  public float Testf3 { get { int o = __p.__offset(58); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)0.0f; } }\n  public bool MutateTestf3(float testf3) { int o = __p.__offset(58); if (o != 0) { __p.bb.PutFloat(o + __p.bb_pos, testf3); return true; } else { return false; } }\n  public string Testarrayofstring2(int j) { int o = __p.__offset(60); return o != 0 ? __p.__string(__p.__vector(o) + j * 4) : null; }\n  public int Testarrayofstring2Length { get { int o = __p.__offset(60); return o != 0 ? __p.__vector_len(o) : 0; } }\n  public MyGame.Example.Ability? Testarrayofsortedstruct(int j) { int o = __p.__offset(62); return o != 0 ? (MyGame.Example.Ability?)(new MyGame.Example.Ability()).__assign(__p.__vector(o) + j * 8, __p.bb) : null; }\n  public int TestarrayofsortedstructLength { get { int o = __p.__offset(62); return o != 0 ? __p.__vector_len(o) : 0; } }\n  public byte Flex(int j) { int o = __p.__offset(64); return o != 0 ? __p.bb.Get(__p.__vector(o) + j * 1) : (byte)0; }\n  public int FlexLength { get { int o = __p.__offset(64); return o != 0 ? __p.__vector_len(o) : 0; } }\n#if ENABLE_SPAN_T\n  public Span<byte> GetFlexBytes() { return __p.__vector_as_span<byte>(64, 1); }\n#else\n  public ArraySegment<byte>? GetFlexBytes() { return __p.__vector_as_arraysegment(64); }\n#endif\n  public byte[] GetFlexArray() { return __p.__vector_as_array<byte>(64); }\n  public bool MutateFlex(int j, byte flex) { int o = __p.__offset(64); if (o != 0) { __p.bb.Put(__p.__vector(o) + j * 1, flex); return true; } else { return false; } }\n  public MyGame.Example.Test? Test5(int j) { int o = __p.__offset(66); return o != 0 ? (MyGame.Example.Test?)(new MyGame.Example.Test()).__assign(__p.__vector(o) + j * 4, __p.bb) : null; }\n  public int Test5Length { get { int o = __p.__offset(66); return o != 0 ? __p.__vector_len(o) : 0; } }\n  public long VectorOfLongs(int j) { int o = __p.__offset(68); return o != 0 ? __p.bb.GetLong(__p.__vector(o) + j * 8) : (long)0; }\n  public int VectorOfLongsLength { get { int o = __p.__offset(68); return o != 0 ? __p.__vector_len(o) : 0; } }\n#if ENABLE_SPAN_T\n  public Span<long> GetVectorOfLongsBytes() { return __p.__vector_as_span<long>(68, 8); }\n#else\n  public ArraySegment<byte>? GetVectorOfLongsBytes() { return __p.__vector_as_arraysegment(68); }\n#endif\n  public long[] GetVectorOfLongsArray() { return __p.__vector_as_array<long>(68); }\n  public bool MutateVectorOfLongs(int j, long vector_of_longs) { int o = __p.__offset(68); if (o != 0) { __p.bb.PutLong(__p.__vector(o) + j * 8, vector_of_longs); return true; } else { return false; } }\n  public double VectorOfDoubles(int j) { int o = __p.__offset(70); return o != 0 ? __p.bb.GetDouble(__p.__vector(o) + j * 8) : (double)0; }\n  public int VectorOfDoublesLength { get { int o = __p.__offset(70); return o != 0 ? __p.__vector_len(o) : 0; } }\n#if ENABLE_SPAN_T\n  public Span<double> GetVectorOfDoublesBytes() { return __p.__vector_as_span<double>(70, 8); }\n#else\n  public ArraySegment<byte>? GetVectorOfDoublesBytes() { return __p.__vector_as_arraysegment(70); }\n#endif\n  public double[] GetVectorOfDoublesArray() { return __p.__vector_as_array<double>(70); }\n  public bool MutateVectorOfDoubles(int j, double vector_of_doubles) { int o = __p.__offset(70); if (o != 0) { __p.bb.PutDouble(__p.__vector(o) + j * 8, vector_of_doubles); return true; } else { return false; } }\n  public MyGame.InParentNamespace? ParentNamespaceTest { get { int o = __p.__offset(72); return o != 0 ? (MyGame.InParentNamespace?)(new MyGame.InParentNamespace()).__assign(__p.__indirect(o + __p.bb_pos), __p.bb) : null; } }\n  public MyGame.Example.Referrable? VectorOfReferrables(int j) { int o = __p.__offset(74); return o != 0 ? (MyGame.Example.Referrable?)(new MyGame.Example.Referrable()).__assign(__p.__indirect(__p.__vector(o) + j * 4), __p.bb) : null; }\n  public int VectorOfReferrablesLength { get { int o = __p.__offset(74); return o != 0 ? __p.__vector_len(o) : 0; } }\n  public MyGame.Example.Referrable? VectorOfReferrablesByKey(ulong key) { int o = __p.__offset(74); return o != 0 ? MyGame.Example.Referrable.__lookup_by_key(__p.__vector(o), key, __p.bb) : null; }\n  public ulong SingleWeakReference { get { int o = __p.__offset(76); return o != 0 ? __p.bb.GetUlong(o + __p.bb_pos) : (ulong)0; } }\n  public bool MutateSingleWeakReference(ulong single_weak_reference) { int o = __p.__offset(76); if (o != 0) { __p.bb.PutUlong(o + __p.bb_pos, single_weak_reference); return true; } else { return false; } }\n  public ulong VectorOfWeakReferences(int j) { int o = __p.__offset(78); return o != 0 ? __p.bb.GetUlong(__p.__vector(o) + j * 8) : (ulong)0; }\n  public int VectorOfWeakReferencesLength { get { int o = __p.__offset(78); return o != 0 ? __p.__vector_len(o) : 0; } }\n#if ENABLE_SPAN_T\n  public Span<ulong> GetVectorOfWeakReferencesBytes() { return __p.__vector_as_span<ulong>(78, 8); }\n#else\n  public ArraySegment<byte>? GetVectorOfWeakReferencesBytes() { return __p.__vector_as_arraysegment(78); }\n#endif\n  public ulong[] GetVectorOfWeakReferencesArray() { return __p.__vector_as_array<ulong>(78); }\n  public bool MutateVectorOfWeakReferences(int j, ulong vector_of_weak_references) { int o = __p.__offset(78); if (o != 0) { __p.bb.PutUlong(__p.__vector(o) + j * 8, vector_of_weak_references); return true; } else { return false; } }\n  public MyGame.Example.Referrable? VectorOfStrongReferrables(int j) { int o = __p.__offset(80); return o != 0 ? (MyGame.Example.Referrable?)(new MyGame.Example.Referrable()).__assign(__p.__indirect(__p.__vector(o) + j * 4), __p.bb) : null; }\n  public int VectorOfStrongReferrablesLength { get { int o = __p.__offset(80); return o != 0 ? __p.__vector_len(o) : 0; } }\n  public MyGame.Example.Referrable? VectorOfStrongReferrablesByKey(ulong key) { int o = __p.__offset(80); return o != 0 ? MyGame.Example.Referrable.__lookup_by_key(__p.__vector(o), key, __p.bb) : null; }\n  public ulong CoOwningReference { get { int o = __p.__offset(82); return o != 0 ? __p.bb.GetUlong(o + __p.bb_pos) : (ulong)0; } }\n  public bool MutateCoOwningReference(ulong co_owning_reference) { int o = __p.__offset(82); if (o != 0) { __p.bb.PutUlong(o + __p.bb_pos, co_owning_reference); return true; } else { return false; } }\n  public ulong VectorOfCoOwningReferences(int j) { int o = __p.__offset(84); return o != 0 ? __p.bb.GetUlong(__p.__vector(o) + j * 8) : (ulong)0; }\n  public int VectorOfCoOwningReferencesLength { get { int o = __p.__offset(84); return o != 0 ? __p.__vector_len(o) : 0; } }\n#if ENABLE_SPAN_T\n  public Span<ulong> GetVectorOfCoOwningReferencesBytes() { return __p.__vector_as_span<ulong>(84, 8); }\n#else\n  public ArraySegment<byte>? GetVectorOfCoOwningReferencesBytes() { return __p.__vector_as_arraysegment(84); }\n#endif\n  public ulong[] GetVectorOfCoOwningReferencesArray() { return __p.__vector_as_array<ulong>(84); }\n  public bool MutateVectorOfCoOwningReferences(int j, ulong vector_of_co_owning_references) { int o = __p.__offset(84); if (o != 0) { __p.bb.PutUlong(__p.__vector(o) + j * 8, vector_of_co_owning_references); return true; } else { return false; } }\n  public ulong NonOwningReference { get { int o = __p.__offset(86); return o != 0 ? __p.bb.GetUlong(o + __p.bb_pos) : (ulong)0; } }\n  public bool MutateNonOwningReference(ulong non_owning_reference) { int o = __p.__offset(86); if (o != 0) { __p.bb.PutUlong(o + __p.bb_pos, non_owning_reference); return true; } else { return false; } }\n  public ulong VectorOfNonOwningReferences(int j) { int o = __p.__offset(88); return o != 0 ? __p.bb.GetUlong(__p.__vector(o) + j * 8) : (ulong)0; }\n  public int VectorOfNonOwningReferencesLength { get { int o = __p.__offset(88); return o != 0 ? __p.__vector_len(o) : 0; } }\n#if ENABLE_SPAN_T\n  public Span<ulong> GetVectorOfNonOwningReferencesBytes() { return __p.__vector_as_span<ulong>(88, 8); }\n#else\n  public ArraySegment<byte>? GetVectorOfNonOwningReferencesBytes() { return __p.__vector_as_arraysegment(88); }\n#endif\n  public ulong[] GetVectorOfNonOwningReferencesArray() { return __p.__vector_as_array<ulong>(88); }\n  public bool MutateVectorOfNonOwningReferences(int j, ulong vector_of_non_owning_references) { int o = __p.__offset(88); if (o != 0) { __p.bb.PutUlong(__p.__vector(o) + j * 8, vector_of_non_owning_references); return true; } else { return false; } }\n  public MyGame.Example.AnyUniqueAliases AnyUniqueType { get { int o = __p.__offset(90); return o != 0 ? (MyGame.Example.AnyUniqueAliases)__p.bb.Get(o + __p.bb_pos) : MyGame.Example.AnyUniqueAliases.NONE; } }\n  public TTable? AnyUnique<TTable>() where TTable : struct, IFlatbufferObject { int o = __p.__offset(92); return o != 0 ? (TTable?)__p.__union<TTable>(o + __p.bb_pos) : null; }\n  public MyGame.Example.Monster AnyUniqueAsM() { return AnyUnique<MyGame.Example.Monster>().Value; }\n  internal MyGame.Example.TestSimpleTableWithEnum AnyUniqueAsTS() { return AnyUnique<MyGame.Example.TestSimpleTableWithEnum>().Value; }\n  public MyGame.Example2.Monster AnyUniqueAsM2() { return AnyUnique<MyGame.Example2.Monster>().Value; }\n  public MyGame.Example.AnyAmbiguousAliases AnyAmbiguousType { get { int o = __p.__offset(94); return o != 0 ? (MyGame.Example.AnyAmbiguousAliases)__p.bb.Get(o + __p.bb_pos) : MyGame.Example.AnyAmbiguousAliases.NONE; } }\n  public TTable? AnyAmbiguous<TTable>() where TTable : struct, IFlatbufferObject { int o = __p.__offset(96); return o != 0 ? (TTable?)__p.__union<TTable>(o + __p.bb_pos) : null; }\n  public MyGame.Example.Monster AnyAmbiguousAsM1() { return AnyAmbiguous<MyGame.Example.Monster>().Value; }\n  public MyGame.Example.Monster AnyAmbiguousAsM2() { return AnyAmbiguous<MyGame.Example.Monster>().Value; }\n  public MyGame.Example.Monster AnyAmbiguousAsM3() { return AnyAmbiguous<MyGame.Example.Monster>().Value; }\n  public MyGame.Example.Color VectorOfEnums(int j) { int o = __p.__offset(98); return o != 0 ? (MyGame.Example.Color)__p.bb.Get(__p.__vector(o) + j * 1) : (MyGame.Example.Color)0; }\n  public int VectorOfEnumsLength { get { int o = __p.__offset(98); return o != 0 ? __p.__vector_len(o) : 0; } }\n#if ENABLE_SPAN_T\n  public Span<MyGame.Example.Color> GetVectorOfEnumsBytes() { return __p.__vector_as_span<MyGame.Example.Color>(98, 1); }\n#else\n  public ArraySegment<byte>? GetVectorOfEnumsBytes() { return __p.__vector_as_arraysegment(98); }\n#endif\n  public MyGame.Example.Color[] GetVectorOfEnumsArray() { int o = __p.__offset(98); if (o == 0) return null; int p = __p.__vector(o); int l = __p.__vector_len(o); MyGame.Example.Color[] a = new MyGame.Example.Color[l]; for (int i = 0; i < l; i++) { a[i] = (MyGame.Example.Color)__p.bb.Get(p + i * 1); } return a; }\n  public bool MutateVectorOfEnums(int j, MyGame.Example.Color vector_of_enums) { int o = __p.__offset(98); if (o != 0) { __p.bb.Put(__p.__vector(o) + j * 1, (byte)vector_of_enums); return true; } else { return false; } }\n  public MyGame.Example.Race SignedEnum { get { int o = __p.__offset(100); return o != 0 ? (MyGame.Example.Race)__p.bb.GetSbyte(o + __p.bb_pos) : MyGame.Example.Race.None; } }\n  public bool MutateSignedEnum(MyGame.Example.Race signed_enum) { int o = __p.__offset(100); if (o != 0) { __p.bb.PutSbyte(o + __p.bb_pos, (sbyte)signed_enum); return true; } else { return false; } }\n  public byte Testrequirednestedflatbuffer(int j) { int o = __p.__offset(102); return o != 0 ? __p.bb.Get(__p.__vector(o) + j * 1) : (byte)0; }\n  public int TestrequirednestedflatbufferLength { get { int o = __p.__offset(102); return o != 0 ? __p.__vector_len(o) : 0; } }\n#if ENABLE_SPAN_T\n  public Span<byte> GetTestrequirednestedflatbufferBytes() { return __p.__vector_as_span<byte>(102, 1); }\n#else\n  public ArraySegment<byte>? GetTestrequirednestedflatbufferBytes() { return __p.__vector_as_arraysegment(102); }\n#endif\n  public byte[] GetTestrequirednestedflatbufferArray() { return __p.__vector_as_array<byte>(102); }\n  public MyGame.Example.Monster? GetTestrequirednestedflatbufferAsMonster() { int o = __p.__offset(102); return o != 0 ? (MyGame.Example.Monster?)(new MyGame.Example.Monster()).__assign(__p.__indirect(__p.__vector(o)), __p.bb) : null; }\n  public bool MutateTestrequirednestedflatbuffer(int j, byte testrequirednestedflatbuffer) { int o = __p.__offset(102); if (o != 0) { __p.bb.Put(__p.__vector(o) + j * 1, testrequirednestedflatbuffer); return true; } else { return false; } }\n  public MyGame.Example.Stat? ScalarKeySortedTables(int j) { int o = __p.__offset(104); return o != 0 ? (MyGame.Example.Stat?)(new MyGame.Example.Stat()).__assign(__p.__indirect(__p.__vector(o) + j * 4), __p.bb) : null; }\n  public int ScalarKeySortedTablesLength { get { int o = __p.__offset(104); return o != 0 ? __p.__vector_len(o) : 0; } }\n  public MyGame.Example.Stat? ScalarKeySortedTablesByKey(ushort key) { int o = __p.__offset(104); return o != 0 ? MyGame.Example.Stat.__lookup_by_key(__p.__vector(o), key, __p.bb) : null; }\n  public MyGame.Example.Test? NativeInline { get { int o = __p.__offset(106); return o != 0 ? (MyGame.Example.Test?)(new MyGame.Example.Test()).__assign(o + __p.bb_pos, __p.bb) : null; } }\n  public MyGame.Example.LongEnum LongEnumNonEnumDefault { get { int o = __p.__offset(108); return o != 0 ? (MyGame.Example.LongEnum)__p.bb.GetUlong(o + __p.bb_pos) : 0; } }\n  public bool MutateLongEnumNonEnumDefault(MyGame.Example.LongEnum long_enum_non_enum_default) { int o = __p.__offset(108); if (o != 0) { __p.bb.PutUlong(o + __p.bb_pos, (ulong)long_enum_non_enum_default); return true; } else { return false; } }\n  public MyGame.Example.LongEnum LongEnumNormalDefault { get { int o = __p.__offset(110); return o != 0 ? (MyGame.Example.LongEnum)__p.bb.GetUlong(o + __p.bb_pos) : MyGame.Example.LongEnum.LongOne; } }\n  public bool MutateLongEnumNormalDefault(MyGame.Example.LongEnum long_enum_normal_default) { int o = __p.__offset(110); if (o != 0) { __p.bb.PutUlong(o + __p.bb_pos, (ulong)long_enum_normal_default); return true; } else { return false; } }\n  public float NanDefault { get { int o = __p.__offset(112); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)Single.NaN; } }\n  public bool MutateNanDefault(float nan_default) { int o = __p.__offset(112); if (o != 0) { __p.bb.PutFloat(o + __p.bb_pos, nan_default); return true; } else { return false; } }\n  public float InfDefault { get { int o = __p.__offset(114); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)Single.PositiveInfinity; } }\n  public bool MutateInfDefault(float inf_default) { int o = __p.__offset(114); if (o != 0) { __p.bb.PutFloat(o + __p.bb_pos, inf_default); return true; } else { return false; } }\n  public float PositiveInfDefault { get { int o = __p.__offset(116); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)Single.PositiveInfinity; } }\n  public bool MutatePositiveInfDefault(float positive_inf_default) { int o = __p.__offset(116); if (o != 0) { __p.bb.PutFloat(o + __p.bb_pos, positive_inf_default); return true; } else { return false; } }\n  public float InfinityDefault { get { int o = __p.__offset(118); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)Single.PositiveInfinity; } }\n  public bool MutateInfinityDefault(float infinity_default) { int o = __p.__offset(118); if (o != 0) { __p.bb.PutFloat(o + __p.bb_pos, infinity_default); return true; } else { return false; } }\n  public float PositiveInfinityDefault { get { int o = __p.__offset(120); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)Single.PositiveInfinity; } }\n  public bool MutatePositiveInfinityDefault(float positive_infinity_default) { int o = __p.__offset(120); if (o != 0) { __p.bb.PutFloat(o + __p.bb_pos, positive_infinity_default); return true; } else { return false; } }\n  public float NegativeInfDefault { get { int o = __p.__offset(122); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)Single.NegativeInfinity; } }\n  public bool MutateNegativeInfDefault(float negative_inf_default) { int o = __p.__offset(122); if (o != 0) { __p.bb.PutFloat(o + __p.bb_pos, negative_inf_default); return true; } else { return false; } }\n  public float NegativeInfinityDefault { get { int o = __p.__offset(124); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)Single.NegativeInfinity; } }\n  public bool MutateNegativeInfinityDefault(float negative_infinity_default) { int o = __p.__offset(124); if (o != 0) { __p.bb.PutFloat(o + __p.bb_pos, negative_infinity_default); return true; } else { return false; } }\n  public double DoubleInfDefault { get { int o = __p.__offset(126); return o != 0 ? __p.bb.GetDouble(o + __p.bb_pos) : (double)Double.PositiveInfinity; } }\n  public bool MutateDoubleInfDefault(double double_inf_default) { int o = __p.__offset(126); if (o != 0) { __p.bb.PutDouble(o + __p.bb_pos, double_inf_default); return true; } else { return false; } }\n\n  public static Offset<MyGame.Example.Monster> CreateMonster(FlatBufferBuilder builder,\n      MyGame.Example.Vec3T pos = null,\n      short mana = 150,\n      short hp = 100,\n      StringOffset nameOffset = default(StringOffset),\n      VectorOffset inventoryOffset = default(VectorOffset),\n      MyGame.Example.Color color = MyGame.Example.Color.Blue,\n      MyGame.Example.Any test_type = MyGame.Example.Any.NONE,\n      int testOffset = 0,\n      VectorOffset test4Offset = default(VectorOffset),\n      VectorOffset testarrayofstringOffset = default(VectorOffset),\n      VectorOffset testarrayoftablesOffset = default(VectorOffset),\n      Offset<MyGame.Example.Monster> enemyOffset = default(Offset<MyGame.Example.Monster>),\n      VectorOffset testnestedflatbufferOffset = default(VectorOffset),\n      Offset<MyGame.Example.Stat> testemptyOffset = default(Offset<MyGame.Example.Stat>),\n      bool testbool = false,\n      int testhashs32_fnv1 = 0,\n      uint testhashu32_fnv1 = 0,\n      long testhashs64_fnv1 = 0,\n      ulong testhashu64_fnv1 = 0,\n      int testhashs32_fnv1a = 0,\n      uint testhashu32_fnv1a = 0,\n      long testhashs64_fnv1a = 0,\n      ulong testhashu64_fnv1a = 0,\n      VectorOffset testarrayofboolsOffset = default(VectorOffset),\n      float testf = 3.14159f,\n      float testf2 = 3.0f,\n      float testf3 = 0.0f,\n      VectorOffset testarrayofstring2Offset = default(VectorOffset),\n      VectorOffset testarrayofsortedstructOffset = default(VectorOffset),\n      VectorOffset flexOffset = default(VectorOffset),\n      VectorOffset test5Offset = default(VectorOffset),\n      VectorOffset vector_of_longsOffset = default(VectorOffset),\n      VectorOffset vector_of_doublesOffset = default(VectorOffset),\n      Offset<MyGame.InParentNamespace> parent_namespace_testOffset = default(Offset<MyGame.InParentNamespace>),\n      VectorOffset vector_of_referrablesOffset = default(VectorOffset),\n      ulong single_weak_reference = 0,\n      VectorOffset vector_of_weak_referencesOffset = default(VectorOffset),\n      VectorOffset vector_of_strong_referrablesOffset = default(VectorOffset),\n      ulong co_owning_reference = 0,\n      VectorOffset vector_of_co_owning_referencesOffset = default(VectorOffset),\n      ulong non_owning_reference = 0,\n      VectorOffset vector_of_non_owning_referencesOffset = default(VectorOffset),\n      MyGame.Example.AnyUniqueAliases any_unique_type = MyGame.Example.AnyUniqueAliases.NONE,\n      int any_uniqueOffset = 0,\n      MyGame.Example.AnyAmbiguousAliases any_ambiguous_type = MyGame.Example.AnyAmbiguousAliases.NONE,\n      int any_ambiguousOffset = 0,\n      VectorOffset vector_of_enumsOffset = default(VectorOffset),\n      MyGame.Example.Race signed_enum = MyGame.Example.Race.None,\n      VectorOffset testrequirednestedflatbufferOffset = default(VectorOffset),\n      VectorOffset scalar_key_sorted_tablesOffset = default(VectorOffset),\n      MyGame.Example.TestT native_inline = null,\n      MyGame.Example.LongEnum long_enum_non_enum_default = 0,\n      MyGame.Example.LongEnum long_enum_normal_default = MyGame.Example.LongEnum.LongOne,\n      float nan_default = Single.NaN,\n      float inf_default = Single.PositiveInfinity,\n      float positive_inf_default = Single.PositiveInfinity,\n      float infinity_default = Single.PositiveInfinity,\n      float positive_infinity_default = Single.PositiveInfinity,\n      float negative_inf_default = Single.NegativeInfinity,\n      float negative_infinity_default = Single.NegativeInfinity,\n      double double_inf_default = Double.PositiveInfinity) {\n    builder.StartTable(62);\n    Monster.AddDoubleInfDefault(builder, double_inf_default);\n    Monster.AddLongEnumNormalDefault(builder, long_enum_normal_default);\n    Monster.AddLongEnumNonEnumDefault(builder, long_enum_non_enum_default);\n    Monster.AddNonOwningReference(builder, non_owning_reference);\n    Monster.AddCoOwningReference(builder, co_owning_reference);\n    Monster.AddSingleWeakReference(builder, single_weak_reference);\n    Monster.AddTesthashu64Fnv1a(builder, testhashu64_fnv1a);\n    Monster.AddTesthashs64Fnv1a(builder, testhashs64_fnv1a);\n    Monster.AddTesthashu64Fnv1(builder, testhashu64_fnv1);\n    Monster.AddTesthashs64Fnv1(builder, testhashs64_fnv1);\n    Monster.AddNegativeInfinityDefault(builder, negative_infinity_default);\n    Monster.AddNegativeInfDefault(builder, negative_inf_default);\n    Monster.AddPositiveInfinityDefault(builder, positive_infinity_default);\n    Monster.AddInfinityDefault(builder, infinity_default);\n    Monster.AddPositiveInfDefault(builder, positive_inf_default);\n    Monster.AddInfDefault(builder, inf_default);\n    Monster.AddNanDefault(builder, nan_default);\n    Monster.AddNativeInline(builder, MyGame.Example.Test.Pack(builder, native_inline));\n    Monster.AddScalarKeySortedTables(builder, scalar_key_sorted_tablesOffset);\n    Monster.AddTestrequirednestedflatbuffer(builder, testrequirednestedflatbufferOffset);\n    Monster.AddVectorOfEnums(builder, vector_of_enumsOffset);\n    Monster.AddAnyAmbiguous(builder, any_ambiguousOffset);\n    Monster.AddAnyUnique(builder, any_uniqueOffset);\n    Monster.AddVectorOfNonOwningReferences(builder, vector_of_non_owning_referencesOffset);\n    Monster.AddVectorOfCoOwningReferences(builder, vector_of_co_owning_referencesOffset);\n    Monster.AddVectorOfStrongReferrables(builder, vector_of_strong_referrablesOffset);\n    Monster.AddVectorOfWeakReferences(builder, vector_of_weak_referencesOffset);\n    Monster.AddVectorOfReferrables(builder, vector_of_referrablesOffset);\n    Monster.AddParentNamespaceTest(builder, parent_namespace_testOffset);\n    Monster.AddVectorOfDoubles(builder, vector_of_doublesOffset);\n    Monster.AddVectorOfLongs(builder, vector_of_longsOffset);\n    Monster.AddTest5(builder, test5Offset);\n    Monster.AddFlex(builder, flexOffset);\n    Monster.AddTestarrayofsortedstruct(builder, testarrayofsortedstructOffset);\n    Monster.AddTestarrayofstring2(builder, testarrayofstring2Offset);\n    Monster.AddTestf3(builder, testf3);\n    Monster.AddTestf2(builder, testf2);\n    Monster.AddTestf(builder, testf);\n    Monster.AddTestarrayofbools(builder, testarrayofboolsOffset);\n    Monster.AddTesthashu32Fnv1a(builder, testhashu32_fnv1a);\n    Monster.AddTesthashs32Fnv1a(builder, testhashs32_fnv1a);\n    Monster.AddTesthashu32Fnv1(builder, testhashu32_fnv1);\n    Monster.AddTesthashs32Fnv1(builder, testhashs32_fnv1);\n    Monster.AddTestempty(builder, testemptyOffset);\n    Monster.AddTestnestedflatbuffer(builder, testnestedflatbufferOffset);\n    Monster.AddEnemy(builder, enemyOffset);\n    Monster.AddTestarrayoftables(builder, testarrayoftablesOffset);\n    Monster.AddTestarrayofstring(builder, testarrayofstringOffset);\n    Monster.AddTest4(builder, test4Offset);\n    Monster.AddTest(builder, testOffset);\n    Monster.AddInventory(builder, inventoryOffset);\n    Monster.AddName(builder, nameOffset);\n    Monster.AddPos(builder, MyGame.Example.Vec3.Pack(builder, pos));\n    Monster.AddHp(builder, hp);\n    Monster.AddMana(builder, mana);\n    Monster.AddSignedEnum(builder, signed_enum);\n    Monster.AddAnyAmbiguousType(builder, any_ambiguous_type);\n    Monster.AddAnyUniqueType(builder, any_unique_type);\n    Monster.AddTestbool(builder, testbool);\n    Monster.AddTestType(builder, test_type);\n    Monster.AddColor(builder, color);\n    return Monster.EndMonster(builder);\n  }\n\n  public static void StartMonster(FlatBufferBuilder builder) { builder.StartTable(62); }\n  public static void AddPos(FlatBufferBuilder builder, Offset<MyGame.Example.Vec3> posOffset) { builder.AddStruct(0, posOffset.Value, 0); }\n  public static void AddMana(FlatBufferBuilder builder, short mana) { builder.AddShort(1, mana, 150); }\n  public static void AddHp(FlatBufferBuilder builder, short hp) { builder.AddShort(2, hp, 100); }\n  public static void AddName(FlatBufferBuilder builder, StringOffset nameOffset) { builder.AddOffset(3, nameOffset.Value, 0); }\n  public static void AddInventory(FlatBufferBuilder builder, VectorOffset inventoryOffset) { builder.AddOffset(5, inventoryOffset.Value, 0); }\n  public static VectorOffset CreateInventoryVector(FlatBufferBuilder builder, byte[] data) { builder.StartVector(1, data.Length, 1); for (int i = data.Length - 1; i >= 0; i--) builder.AddByte(data[i]); return builder.EndVector(); }\n  public static VectorOffset CreateInventoryVectorBlock(FlatBufferBuilder builder, byte[] data) { builder.StartVector(1, data.Length, 1); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateInventoryVectorBlock(FlatBufferBuilder builder, ArraySegment<byte> data) { builder.StartVector(1, data.Count, 1); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateInventoryVectorBlock(FlatBufferBuilder builder, IntPtr dataPtr, int sizeInBytes) { builder.StartVector(1, sizeInBytes, 1); builder.Add<byte>(dataPtr, sizeInBytes); return builder.EndVector(); }\n  public static void StartInventoryVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(1, numElems, 1); }\n  public static void AddColor(FlatBufferBuilder builder, MyGame.Example.Color color) { builder.AddByte(6, (byte)color, 8); }\n  public static void AddTestType(FlatBufferBuilder builder, MyGame.Example.Any testType) { builder.AddByte(7, (byte)testType, 0); }\n  public static void AddTest(FlatBufferBuilder builder, int testOffset) { builder.AddOffset(8, testOffset, 0); }\n  public static void AddTest4(FlatBufferBuilder builder, VectorOffset test4Offset) { builder.AddOffset(9, test4Offset.Value, 0); }\n  public static void StartTest4Vector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 2); }\n  public static void AddTestarrayofstring(FlatBufferBuilder builder, VectorOffset testarrayofstringOffset) { builder.AddOffset(10, testarrayofstringOffset.Value, 0); }\n  public static VectorOffset CreateTestarrayofstringVector(FlatBufferBuilder builder, StringOffset[] data) { builder.StartVector(4, data.Length, 4); for (int i = data.Length - 1; i >= 0; i--) builder.AddOffset(data[i].Value); return builder.EndVector(); }\n  public static VectorOffset CreateTestarrayofstringVectorBlock(FlatBufferBuilder builder, StringOffset[] data) { builder.StartVector(4, data.Length, 4); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateTestarrayofstringVectorBlock(FlatBufferBuilder builder, ArraySegment<StringOffset> data) { builder.StartVector(4, data.Count, 4); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateTestarrayofstringVectorBlock(FlatBufferBuilder builder, IntPtr dataPtr, int sizeInBytes) { builder.StartVector(1, sizeInBytes, 1); builder.Add<StringOffset>(dataPtr, sizeInBytes); return builder.EndVector(); }\n  public static void StartTestarrayofstringVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 4); }\n  public static void AddTestarrayoftables(FlatBufferBuilder builder, VectorOffset testarrayoftablesOffset) { builder.AddOffset(11, testarrayoftablesOffset.Value, 0); }\n  public static VectorOffset CreateTestarrayoftablesVector(FlatBufferBuilder builder, Offset<MyGame.Example.Monster>[] data) { builder.StartVector(4, data.Length, 4); for (int i = data.Length - 1; i >= 0; i--) builder.AddOffset(data[i].Value); return builder.EndVector(); }\n  public static VectorOffset CreateTestarrayoftablesVectorBlock(FlatBufferBuilder builder, Offset<MyGame.Example.Monster>[] data) { builder.StartVector(4, data.Length, 4); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateTestarrayoftablesVectorBlock(FlatBufferBuilder builder, ArraySegment<Offset<MyGame.Example.Monster>> data) { builder.StartVector(4, data.Count, 4); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateTestarrayoftablesVectorBlock(FlatBufferBuilder builder, IntPtr dataPtr, int sizeInBytes) { builder.StartVector(1, sizeInBytes, 1); builder.Add<Offset<MyGame.Example.Monster>>(dataPtr, sizeInBytes); return builder.EndVector(); }\n  public static void StartTestarrayoftablesVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 4); }\n  public static void AddEnemy(FlatBufferBuilder builder, Offset<MyGame.Example.Monster> enemyOffset) { builder.AddOffset(12, enemyOffset.Value, 0); }\n  public static void AddTestnestedflatbuffer(FlatBufferBuilder builder, VectorOffset testnestedflatbufferOffset) { builder.AddOffset(13, testnestedflatbufferOffset.Value, 0); }\n  public static VectorOffset CreateTestnestedflatbufferVector(FlatBufferBuilder builder, byte[] data) { builder.StartVector(1, data.Length, 1); for (int i = data.Length - 1; i >= 0; i--) builder.AddByte(data[i]); return builder.EndVector(); }\n  public static VectorOffset CreateTestnestedflatbufferVectorBlock(FlatBufferBuilder builder, byte[] data) { builder.StartVector(1, data.Length, 1); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateTestnestedflatbufferVectorBlock(FlatBufferBuilder builder, ArraySegment<byte> data) { builder.StartVector(1, data.Count, 1); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateTestnestedflatbufferVectorBlock(FlatBufferBuilder builder, IntPtr dataPtr, int sizeInBytes) { builder.StartVector(1, sizeInBytes, 1); builder.Add<byte>(dataPtr, sizeInBytes); return builder.EndVector(); }\n  public static void StartTestnestedflatbufferVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(1, numElems, 1); }\n  public static void AddTestempty(FlatBufferBuilder builder, Offset<MyGame.Example.Stat> testemptyOffset) { builder.AddOffset(14, testemptyOffset.Value, 0); }\n  public static void AddTestbool(FlatBufferBuilder builder, bool testbool) { builder.AddBool(15, testbool, false); }\n  public static void AddTesthashs32Fnv1(FlatBufferBuilder builder, int testhashs32Fnv1) { builder.AddInt(16, testhashs32Fnv1, 0); }\n  public static void AddTesthashu32Fnv1(FlatBufferBuilder builder, uint testhashu32Fnv1) { builder.AddUint(17, testhashu32Fnv1, 0); }\n  public static void AddTesthashs64Fnv1(FlatBufferBuilder builder, long testhashs64Fnv1) { builder.AddLong(18, testhashs64Fnv1, 0); }\n  public static void AddTesthashu64Fnv1(FlatBufferBuilder builder, ulong testhashu64Fnv1) { builder.AddUlong(19, testhashu64Fnv1, 0); }\n  public static void AddTesthashs32Fnv1a(FlatBufferBuilder builder, int testhashs32Fnv1a) { builder.AddInt(20, testhashs32Fnv1a, 0); }\n  public static void AddTesthashu32Fnv1a(FlatBufferBuilder builder, uint testhashu32Fnv1a) { builder.AddUint(21, testhashu32Fnv1a, 0); }\n  public static void AddTesthashs64Fnv1a(FlatBufferBuilder builder, long testhashs64Fnv1a) { builder.AddLong(22, testhashs64Fnv1a, 0); }\n  public static void AddTesthashu64Fnv1a(FlatBufferBuilder builder, ulong testhashu64Fnv1a) { builder.AddUlong(23, testhashu64Fnv1a, 0); }\n  public static void AddTestarrayofbools(FlatBufferBuilder builder, VectorOffset testarrayofboolsOffset) { builder.AddOffset(24, testarrayofboolsOffset.Value, 0); }\n  public static VectorOffset CreateTestarrayofboolsVector(FlatBufferBuilder builder, bool[] data) { builder.StartVector(1, data.Length, 1); for (int i = data.Length - 1; i >= 0; i--) builder.AddBool(data[i]); return builder.EndVector(); }\n  public static VectorOffset CreateTestarrayofboolsVectorBlock(FlatBufferBuilder builder, bool[] data) { builder.StartVector(1, data.Length, 1); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateTestarrayofboolsVectorBlock(FlatBufferBuilder builder, ArraySegment<bool> data) { builder.StartVector(1, data.Count, 1); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateTestarrayofboolsVectorBlock(FlatBufferBuilder builder, IntPtr dataPtr, int sizeInBytes) { builder.StartVector(1, sizeInBytes, 1); builder.Add<bool>(dataPtr, sizeInBytes); return builder.EndVector(); }\n  public static void StartTestarrayofboolsVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(1, numElems, 1); }\n  public static void AddTestf(FlatBufferBuilder builder, float testf) { builder.AddFloat(25, testf, 3.14159f); }\n  public static void AddTestf2(FlatBufferBuilder builder, float testf2) { builder.AddFloat(26, testf2, 3.0f); }\n  public static void AddTestf3(FlatBufferBuilder builder, float testf3) { builder.AddFloat(27, testf3, 0.0f); }\n  public static void AddTestarrayofstring2(FlatBufferBuilder builder, VectorOffset testarrayofstring2Offset) { builder.AddOffset(28, testarrayofstring2Offset.Value, 0); }\n  public static VectorOffset CreateTestarrayofstring2Vector(FlatBufferBuilder builder, StringOffset[] data) { builder.StartVector(4, data.Length, 4); for (int i = data.Length - 1; i >= 0; i--) builder.AddOffset(data[i].Value); return builder.EndVector(); }\n  public static VectorOffset CreateTestarrayofstring2VectorBlock(FlatBufferBuilder builder, StringOffset[] data) { builder.StartVector(4, data.Length, 4); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateTestarrayofstring2VectorBlock(FlatBufferBuilder builder, ArraySegment<StringOffset> data) { builder.StartVector(4, data.Count, 4); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateTestarrayofstring2VectorBlock(FlatBufferBuilder builder, IntPtr dataPtr, int sizeInBytes) { builder.StartVector(1, sizeInBytes, 1); builder.Add<StringOffset>(dataPtr, sizeInBytes); return builder.EndVector(); }\n  public static void StartTestarrayofstring2Vector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 4); }\n  public static void AddTestarrayofsortedstruct(FlatBufferBuilder builder, VectorOffset testarrayofsortedstructOffset) { builder.AddOffset(29, testarrayofsortedstructOffset.Value, 0); }\n  public static void StartTestarrayofsortedstructVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(8, numElems, 4); }\n  public static void AddFlex(FlatBufferBuilder builder, VectorOffset flexOffset) { builder.AddOffset(30, flexOffset.Value, 0); }\n  public static VectorOffset CreateFlexVector(FlatBufferBuilder builder, byte[] data) { builder.StartVector(1, data.Length, 1); for (int i = data.Length - 1; i >= 0; i--) builder.AddByte(data[i]); return builder.EndVector(); }\n  public static VectorOffset CreateFlexVectorBlock(FlatBufferBuilder builder, byte[] data) { builder.StartVector(1, data.Length, 1); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateFlexVectorBlock(FlatBufferBuilder builder, ArraySegment<byte> data) { builder.StartVector(1, data.Count, 1); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateFlexVectorBlock(FlatBufferBuilder builder, IntPtr dataPtr, int sizeInBytes) { builder.StartVector(1, sizeInBytes, 1); builder.Add<byte>(dataPtr, sizeInBytes); return builder.EndVector(); }\n  public static void StartFlexVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(1, numElems, 1); }\n  public static void AddTest5(FlatBufferBuilder builder, VectorOffset test5Offset) { builder.AddOffset(31, test5Offset.Value, 0); }\n  public static void StartTest5Vector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 2); }\n  public static void AddVectorOfLongs(FlatBufferBuilder builder, VectorOffset vectorOfLongsOffset) { builder.AddOffset(32, vectorOfLongsOffset.Value, 0); }\n  public static VectorOffset CreateVectorOfLongsVector(FlatBufferBuilder builder, long[] data) { builder.StartVector(8, data.Length, 8); for (int i = data.Length - 1; i >= 0; i--) builder.AddLong(data[i]); return builder.EndVector(); }\n  public static VectorOffset CreateVectorOfLongsVectorBlock(FlatBufferBuilder builder, long[] data) { builder.StartVector(8, data.Length, 8); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateVectorOfLongsVectorBlock(FlatBufferBuilder builder, ArraySegment<long> data) { builder.StartVector(8, data.Count, 8); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateVectorOfLongsVectorBlock(FlatBufferBuilder builder, IntPtr dataPtr, int sizeInBytes) { builder.StartVector(1, sizeInBytes, 1); builder.Add<long>(dataPtr, sizeInBytes); return builder.EndVector(); }\n  public static void StartVectorOfLongsVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(8, numElems, 8); }\n  public static void AddVectorOfDoubles(FlatBufferBuilder builder, VectorOffset vectorOfDoublesOffset) { builder.AddOffset(33, vectorOfDoublesOffset.Value, 0); }\n  public static VectorOffset CreateVectorOfDoublesVector(FlatBufferBuilder builder, double[] data) { builder.StartVector(8, data.Length, 8); for (int i = data.Length - 1; i >= 0; i--) builder.AddDouble(data[i]); return builder.EndVector(); }\n  public static VectorOffset CreateVectorOfDoublesVectorBlock(FlatBufferBuilder builder, double[] data) { builder.StartVector(8, data.Length, 8); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateVectorOfDoublesVectorBlock(FlatBufferBuilder builder, ArraySegment<double> data) { builder.StartVector(8, data.Count, 8); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateVectorOfDoublesVectorBlock(FlatBufferBuilder builder, IntPtr dataPtr, int sizeInBytes) { builder.StartVector(1, sizeInBytes, 1); builder.Add<double>(dataPtr, sizeInBytes); return builder.EndVector(); }\n  public static void StartVectorOfDoublesVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(8, numElems, 8); }\n  public static void AddParentNamespaceTest(FlatBufferBuilder builder, Offset<MyGame.InParentNamespace> parentNamespaceTestOffset) { builder.AddOffset(34, parentNamespaceTestOffset.Value, 0); }\n  public static void AddVectorOfReferrables(FlatBufferBuilder builder, VectorOffset vectorOfReferrablesOffset) { builder.AddOffset(35, vectorOfReferrablesOffset.Value, 0); }\n  public static VectorOffset CreateVectorOfReferrablesVector(FlatBufferBuilder builder, Offset<MyGame.Example.Referrable>[] data) { builder.StartVector(4, data.Length, 4); for (int i = data.Length - 1; i >= 0; i--) builder.AddOffset(data[i].Value); return builder.EndVector(); }\n  public static VectorOffset CreateVectorOfReferrablesVectorBlock(FlatBufferBuilder builder, Offset<MyGame.Example.Referrable>[] data) { builder.StartVector(4, data.Length, 4); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateVectorOfReferrablesVectorBlock(FlatBufferBuilder builder, ArraySegment<Offset<MyGame.Example.Referrable>> data) { builder.StartVector(4, data.Count, 4); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateVectorOfReferrablesVectorBlock(FlatBufferBuilder builder, IntPtr dataPtr, int sizeInBytes) { builder.StartVector(1, sizeInBytes, 1); builder.Add<Offset<MyGame.Example.Referrable>>(dataPtr, sizeInBytes); return builder.EndVector(); }\n  public static void StartVectorOfReferrablesVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 4); }\n  public static void AddSingleWeakReference(FlatBufferBuilder builder, ulong singleWeakReference) { builder.AddUlong(36, singleWeakReference, 0); }\n  public static void AddVectorOfWeakReferences(FlatBufferBuilder builder, VectorOffset vectorOfWeakReferencesOffset) { builder.AddOffset(37, vectorOfWeakReferencesOffset.Value, 0); }\n  public static VectorOffset CreateVectorOfWeakReferencesVector(FlatBufferBuilder builder, ulong[] data) { builder.StartVector(8, data.Length, 8); for (int i = data.Length - 1; i >= 0; i--) builder.AddUlong(data[i]); return builder.EndVector(); }\n  public static VectorOffset CreateVectorOfWeakReferencesVectorBlock(FlatBufferBuilder builder, ulong[] data) { builder.StartVector(8, data.Length, 8); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateVectorOfWeakReferencesVectorBlock(FlatBufferBuilder builder, ArraySegment<ulong> data) { builder.StartVector(8, data.Count, 8); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateVectorOfWeakReferencesVectorBlock(FlatBufferBuilder builder, IntPtr dataPtr, int sizeInBytes) { builder.StartVector(1, sizeInBytes, 1); builder.Add<ulong>(dataPtr, sizeInBytes); return builder.EndVector(); }\n  public static void StartVectorOfWeakReferencesVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(8, numElems, 8); }\n  public static void AddVectorOfStrongReferrables(FlatBufferBuilder builder, VectorOffset vectorOfStrongReferrablesOffset) { builder.AddOffset(38, vectorOfStrongReferrablesOffset.Value, 0); }\n  public static VectorOffset CreateVectorOfStrongReferrablesVector(FlatBufferBuilder builder, Offset<MyGame.Example.Referrable>[] data) { builder.StartVector(4, data.Length, 4); for (int i = data.Length - 1; i >= 0; i--) builder.AddOffset(data[i].Value); return builder.EndVector(); }\n  public static VectorOffset CreateVectorOfStrongReferrablesVectorBlock(FlatBufferBuilder builder, Offset<MyGame.Example.Referrable>[] data) { builder.StartVector(4, data.Length, 4); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateVectorOfStrongReferrablesVectorBlock(FlatBufferBuilder builder, ArraySegment<Offset<MyGame.Example.Referrable>> data) { builder.StartVector(4, data.Count, 4); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateVectorOfStrongReferrablesVectorBlock(FlatBufferBuilder builder, IntPtr dataPtr, int sizeInBytes) { builder.StartVector(1, sizeInBytes, 1); builder.Add<Offset<MyGame.Example.Referrable>>(dataPtr, sizeInBytes); return builder.EndVector(); }\n  public static void StartVectorOfStrongReferrablesVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 4); }\n  public static void AddCoOwningReference(FlatBufferBuilder builder, ulong coOwningReference) { builder.AddUlong(39, coOwningReference, 0); }\n  public static void AddVectorOfCoOwningReferences(FlatBufferBuilder builder, VectorOffset vectorOfCoOwningReferencesOffset) { builder.AddOffset(40, vectorOfCoOwningReferencesOffset.Value, 0); }\n  public static VectorOffset CreateVectorOfCoOwningReferencesVector(FlatBufferBuilder builder, ulong[] data) { builder.StartVector(8, data.Length, 8); for (int i = data.Length - 1; i >= 0; i--) builder.AddUlong(data[i]); return builder.EndVector(); }\n  public static VectorOffset CreateVectorOfCoOwningReferencesVectorBlock(FlatBufferBuilder builder, ulong[] data) { builder.StartVector(8, data.Length, 8); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateVectorOfCoOwningReferencesVectorBlock(FlatBufferBuilder builder, ArraySegment<ulong> data) { builder.StartVector(8, data.Count, 8); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateVectorOfCoOwningReferencesVectorBlock(FlatBufferBuilder builder, IntPtr dataPtr, int sizeInBytes) { builder.StartVector(1, sizeInBytes, 1); builder.Add<ulong>(dataPtr, sizeInBytes); return builder.EndVector(); }\n  public static void StartVectorOfCoOwningReferencesVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(8, numElems, 8); }\n  public static void AddNonOwningReference(FlatBufferBuilder builder, ulong nonOwningReference) { builder.AddUlong(41, nonOwningReference, 0); }\n  public static void AddVectorOfNonOwningReferences(FlatBufferBuilder builder, VectorOffset vectorOfNonOwningReferencesOffset) { builder.AddOffset(42, vectorOfNonOwningReferencesOffset.Value, 0); }\n  public static VectorOffset CreateVectorOfNonOwningReferencesVector(FlatBufferBuilder builder, ulong[] data) { builder.StartVector(8, data.Length, 8); for (int i = data.Length - 1; i >= 0; i--) builder.AddUlong(data[i]); return builder.EndVector(); }\n  public static VectorOffset CreateVectorOfNonOwningReferencesVectorBlock(FlatBufferBuilder builder, ulong[] data) { builder.StartVector(8, data.Length, 8); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateVectorOfNonOwningReferencesVectorBlock(FlatBufferBuilder builder, ArraySegment<ulong> data) { builder.StartVector(8, data.Count, 8); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateVectorOfNonOwningReferencesVectorBlock(FlatBufferBuilder builder, IntPtr dataPtr, int sizeInBytes) { builder.StartVector(1, sizeInBytes, 1); builder.Add<ulong>(dataPtr, sizeInBytes); return builder.EndVector(); }\n  public static void StartVectorOfNonOwningReferencesVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(8, numElems, 8); }\n  public static void AddAnyUniqueType(FlatBufferBuilder builder, MyGame.Example.AnyUniqueAliases anyUniqueType) { builder.AddByte(43, (byte)anyUniqueType, 0); }\n  public static void AddAnyUnique(FlatBufferBuilder builder, int anyUniqueOffset) { builder.AddOffset(44, anyUniqueOffset, 0); }\n  public static void AddAnyAmbiguousType(FlatBufferBuilder builder, MyGame.Example.AnyAmbiguousAliases anyAmbiguousType) { builder.AddByte(45, (byte)anyAmbiguousType, 0); }\n  public static void AddAnyAmbiguous(FlatBufferBuilder builder, int anyAmbiguousOffset) { builder.AddOffset(46, anyAmbiguousOffset, 0); }\n  public static void AddVectorOfEnums(FlatBufferBuilder builder, VectorOffset vectorOfEnumsOffset) { builder.AddOffset(47, vectorOfEnumsOffset.Value, 0); }\n  public static VectorOffset CreateVectorOfEnumsVector(FlatBufferBuilder builder, MyGame.Example.Color[] data) { builder.StartVector(1, data.Length, 1); for (int i = data.Length - 1; i >= 0; i--) builder.AddByte((byte)data[i]); return builder.EndVector(); }\n  public static VectorOffset CreateVectorOfEnumsVectorBlock(FlatBufferBuilder builder, MyGame.Example.Color[] data) { builder.StartVector(1, data.Length, 1); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateVectorOfEnumsVectorBlock(FlatBufferBuilder builder, ArraySegment<MyGame.Example.Color> data) { builder.StartVector(1, data.Count, 1); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateVectorOfEnumsVectorBlock(FlatBufferBuilder builder, IntPtr dataPtr, int sizeInBytes) { builder.StartVector(1, sizeInBytes, 1); builder.Add<MyGame.Example.Color>(dataPtr, sizeInBytes); return builder.EndVector(); }\n  public static void StartVectorOfEnumsVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(1, numElems, 1); }\n  public static void AddSignedEnum(FlatBufferBuilder builder, MyGame.Example.Race signedEnum) { builder.AddSbyte(48, (sbyte)signedEnum, -1); }\n  public static void AddTestrequirednestedflatbuffer(FlatBufferBuilder builder, VectorOffset testrequirednestedflatbufferOffset) { builder.AddOffset(49, testrequirednestedflatbufferOffset.Value, 0); }\n  public static VectorOffset CreateTestrequirednestedflatbufferVector(FlatBufferBuilder builder, byte[] data) { builder.StartVector(1, data.Length, 1); for (int i = data.Length - 1; i >= 0; i--) builder.AddByte(data[i]); return builder.EndVector(); }\n  public static VectorOffset CreateTestrequirednestedflatbufferVectorBlock(FlatBufferBuilder builder, byte[] data) { builder.StartVector(1, data.Length, 1); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateTestrequirednestedflatbufferVectorBlock(FlatBufferBuilder builder, ArraySegment<byte> data) { builder.StartVector(1, data.Count, 1); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateTestrequirednestedflatbufferVectorBlock(FlatBufferBuilder builder, IntPtr dataPtr, int sizeInBytes) { builder.StartVector(1, sizeInBytes, 1); builder.Add<byte>(dataPtr, sizeInBytes); return builder.EndVector(); }\n  public static void StartTestrequirednestedflatbufferVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(1, numElems, 1); }\n  public static void AddScalarKeySortedTables(FlatBufferBuilder builder, VectorOffset scalarKeySortedTablesOffset) { builder.AddOffset(50, scalarKeySortedTablesOffset.Value, 0); }\n  public static VectorOffset CreateScalarKeySortedTablesVector(FlatBufferBuilder builder, Offset<MyGame.Example.Stat>[] data) { builder.StartVector(4, data.Length, 4); for (int i = data.Length - 1; i >= 0; i--) builder.AddOffset(data[i].Value); return builder.EndVector(); }\n  public static VectorOffset CreateScalarKeySortedTablesVectorBlock(FlatBufferBuilder builder, Offset<MyGame.Example.Stat>[] data) { builder.StartVector(4, data.Length, 4); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateScalarKeySortedTablesVectorBlock(FlatBufferBuilder builder, ArraySegment<Offset<MyGame.Example.Stat>> data) { builder.StartVector(4, data.Count, 4); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateScalarKeySortedTablesVectorBlock(FlatBufferBuilder builder, IntPtr dataPtr, int sizeInBytes) { builder.StartVector(1, sizeInBytes, 1); builder.Add<Offset<MyGame.Example.Stat>>(dataPtr, sizeInBytes); return builder.EndVector(); }\n  public static void StartScalarKeySortedTablesVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 4); }\n  public static void AddNativeInline(FlatBufferBuilder builder, Offset<MyGame.Example.Test> nativeInlineOffset) { builder.AddStruct(51, nativeInlineOffset.Value, 0); }\n  public static void AddLongEnumNonEnumDefault(FlatBufferBuilder builder, MyGame.Example.LongEnum longEnumNonEnumDefault) { builder.AddUlong(52, (ulong)longEnumNonEnumDefault, 0); }\n  public static void AddLongEnumNormalDefault(FlatBufferBuilder builder, MyGame.Example.LongEnum longEnumNormalDefault) { builder.AddUlong(53, (ulong)longEnumNormalDefault, 2); }\n  public static void AddNanDefault(FlatBufferBuilder builder, float nanDefault) { builder.AddFloat(54, nanDefault, Single.NaN); }\n  public static void AddInfDefault(FlatBufferBuilder builder, float infDefault) { builder.AddFloat(55, infDefault, Single.PositiveInfinity); }\n  public static void AddPositiveInfDefault(FlatBufferBuilder builder, float positiveInfDefault) { builder.AddFloat(56, positiveInfDefault, Single.PositiveInfinity); }\n  public static void AddInfinityDefault(FlatBufferBuilder builder, float infinityDefault) { builder.AddFloat(57, infinityDefault, Single.PositiveInfinity); }\n  public static void AddPositiveInfinityDefault(FlatBufferBuilder builder, float positiveInfinityDefault) { builder.AddFloat(58, positiveInfinityDefault, Single.PositiveInfinity); }\n  public static void AddNegativeInfDefault(FlatBufferBuilder builder, float negativeInfDefault) { builder.AddFloat(59, negativeInfDefault, Single.NegativeInfinity); }\n  public static void AddNegativeInfinityDefault(FlatBufferBuilder builder, float negativeInfinityDefault) { builder.AddFloat(60, negativeInfinityDefault, Single.NegativeInfinity); }\n  public static void AddDoubleInfDefault(FlatBufferBuilder builder, double doubleInfDefault) { builder.AddDouble(61, doubleInfDefault, Double.PositiveInfinity); }\n  public static Offset<MyGame.Example.Monster> EndMonster(FlatBufferBuilder builder) {\n    int o = builder.EndTable();\n    builder.Required(o, 10);  // name\n    return new Offset<MyGame.Example.Monster>(o);\n  }\n  public static void FinishMonsterBuffer(FlatBufferBuilder builder, Offset<MyGame.Example.Monster> offset) { builder.Finish(offset.Value, \"MONS\"); }\n  public static void FinishSizePrefixedMonsterBuffer(FlatBufferBuilder builder, Offset<MyGame.Example.Monster> offset) { builder.FinishSizePrefixed(offset.Value, \"MONS\"); }\n\n  public static VectorOffset CreateSortedVectorOfMonster(FlatBufferBuilder builder, Offset<Monster>[] offsets) {\n    Array.Sort(offsets,\n      (Offset<Monster> o1, Offset<Monster> o2) =>\n        string.CompareOrdinal(new Monster().__assign(builder.DataBuffer.Length - o1.Value, builder.DataBuffer).Name, new Monster().__assign(builder.DataBuffer.Length - o2.Value, builder.DataBuffer).Name));\n    return builder.CreateVectorOfTables(offsets);\n  }\n\n  public static Monster? __lookup_by_key(int vectorLocation, string key, ByteBuffer bb) {\n    Monster obj_ = new Monster();\n    int span = bb.GetInt(vectorLocation - 4);\n    int start = 0;\n    while (span != 0) {\n      int middle = span / 2;\n      int tableOffset = Table.__indirect(vectorLocation + 4 * (start + middle), bb);\n      obj_.__assign(tableOffset, bb);\n      int comp = string.CompareOrdinal(obj_.Name, key);\n      if (comp > 0) {\n        span = middle;\n      } else if (comp < 0) {\n        middle++;\n        start += middle;\n        span -= middle;\n      } else {\n        return obj_;\n      }\n    }\n    return null;\n  }\n  public MonsterT UnPack() {\n    var _o = new MonsterT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(MonsterT _o) {\n    _o.Pos = this.Pos.HasValue ? this.Pos.Value.UnPack() : null;\n    _o.Mana = this.Mana;\n    _o.Hp = this.Hp;\n    _o.Name = this.Name;\n    _o.Inventory = new List<byte>();\n    for (var _j = 0; _j < this.InventoryLength; ++_j) {_o.Inventory.Add(this.Inventory(_j));}\n    _o.Color = this.Color;\n    _o.Test = new MyGame.Example.AnyUnion();\n    _o.Test.Type = this.TestType;\n    switch (this.TestType) {\n      default: break;\n      case MyGame.Example.Any.Monster:\n        _o.Test.Value = this.Test<MyGame.Example.Monster>().HasValue ? this.Test<MyGame.Example.Monster>().Value.UnPack() : null;\n        break;\n      case MyGame.Example.Any.TestSimpleTableWithEnum:\n        _o.Test.Value = this.Test<MyGame.Example.TestSimpleTableWithEnum>().HasValue ? this.Test<MyGame.Example.TestSimpleTableWithEnum>().Value.UnPack() : null;\n        break;\n      case MyGame.Example.Any.MyGame_Example2_Monster:\n        _o.Test.Value = this.Test<MyGame.Example2.Monster>().HasValue ? this.Test<MyGame.Example2.Monster>().Value.UnPack() : null;\n        break;\n    }\n    _o.Test4 = new List<MyGame.Example.TestT>();\n    for (var _j = 0; _j < this.Test4Length; ++_j) {_o.Test4.Add(this.Test4(_j).HasValue ? this.Test4(_j).Value.UnPack() : null);}\n    _o.Testarrayofstring = new List<string>();\n    for (var _j = 0; _j < this.TestarrayofstringLength; ++_j) {_o.Testarrayofstring.Add(this.Testarrayofstring(_j));}\n    _o.Testarrayoftables = new List<MyGame.Example.MonsterT>();\n    for (var _j = 0; _j < this.TestarrayoftablesLength; ++_j) {_o.Testarrayoftables.Add(this.Testarrayoftables(_j).HasValue ? this.Testarrayoftables(_j).Value.UnPack() : null);}\n    _o.Enemy = this.Enemy.HasValue ? this.Enemy.Value.UnPack() : null;\n    _o.Testnestedflatbuffer = new List<byte>();\n    for (var _j = 0; _j < this.TestnestedflatbufferLength; ++_j) {_o.Testnestedflatbuffer.Add(this.Testnestedflatbuffer(_j));}\n    _o.Testempty = this.Testempty.HasValue ? this.Testempty.Value.UnPack() : null;\n    _o.Testbool = this.Testbool;\n    _o.Testhashs32Fnv1 = this.Testhashs32Fnv1;\n    _o.Testhashu32Fnv1 = this.Testhashu32Fnv1;\n    _o.Testhashs64Fnv1 = this.Testhashs64Fnv1;\n    _o.Testhashu64Fnv1 = this.Testhashu64Fnv1;\n    _o.Testhashs32Fnv1a = this.Testhashs32Fnv1a;\n    _o.Testhashu32Fnv1a = this.Testhashu32Fnv1a;\n    _o.Testhashs64Fnv1a = this.Testhashs64Fnv1a;\n    _o.Testhashu64Fnv1a = this.Testhashu64Fnv1a;\n    _o.Testarrayofbools = new List<bool>();\n    for (var _j = 0; _j < this.TestarrayofboolsLength; ++_j) {_o.Testarrayofbools.Add(this.Testarrayofbools(_j));}\n    _o.Testf = this.Testf;\n    _o.Testf2 = this.Testf2;\n    _o.Testf3 = this.Testf3;\n    _o.Testarrayofstring2 = new List<string>();\n    for (var _j = 0; _j < this.Testarrayofstring2Length; ++_j) {_o.Testarrayofstring2.Add(this.Testarrayofstring2(_j));}\n    _o.Testarrayofsortedstruct = new List<MyGame.Example.AbilityT>();\n    for (var _j = 0; _j < this.TestarrayofsortedstructLength; ++_j) {_o.Testarrayofsortedstruct.Add(this.Testarrayofsortedstruct(_j).HasValue ? this.Testarrayofsortedstruct(_j).Value.UnPack() : null);}\n    _o.Flex = new List<byte>();\n    for (var _j = 0; _j < this.FlexLength; ++_j) {_o.Flex.Add(this.Flex(_j));}\n    _o.Test5 = new List<MyGame.Example.TestT>();\n    for (var _j = 0; _j < this.Test5Length; ++_j) {_o.Test5.Add(this.Test5(_j).HasValue ? this.Test5(_j).Value.UnPack() : null);}\n    _o.VectorOfLongs = new List<long>();\n    for (var _j = 0; _j < this.VectorOfLongsLength; ++_j) {_o.VectorOfLongs.Add(this.VectorOfLongs(_j));}\n    _o.VectorOfDoubles = new List<double>();\n    for (var _j = 0; _j < this.VectorOfDoublesLength; ++_j) {_o.VectorOfDoubles.Add(this.VectorOfDoubles(_j));}\n    _o.ParentNamespaceTest = this.ParentNamespaceTest.HasValue ? this.ParentNamespaceTest.Value.UnPack() : null;\n    _o.VectorOfReferrables = new List<MyGame.Example.ReferrableT>();\n    for (var _j = 0; _j < this.VectorOfReferrablesLength; ++_j) {_o.VectorOfReferrables.Add(this.VectorOfReferrables(_j).HasValue ? this.VectorOfReferrables(_j).Value.UnPack() : null);}\n    _o.SingleWeakReference = this.SingleWeakReference;\n    _o.VectorOfWeakReferences = new List<ulong>();\n    for (var _j = 0; _j < this.VectorOfWeakReferencesLength; ++_j) {_o.VectorOfWeakReferences.Add(this.VectorOfWeakReferences(_j));}\n    _o.VectorOfStrongReferrables = new List<MyGame.Example.ReferrableT>();\n    for (var _j = 0; _j < this.VectorOfStrongReferrablesLength; ++_j) {_o.VectorOfStrongReferrables.Add(this.VectorOfStrongReferrables(_j).HasValue ? this.VectorOfStrongReferrables(_j).Value.UnPack() : null);}\n    _o.CoOwningReference = this.CoOwningReference;\n    _o.VectorOfCoOwningReferences = new List<ulong>();\n    for (var _j = 0; _j < this.VectorOfCoOwningReferencesLength; ++_j) {_o.VectorOfCoOwningReferences.Add(this.VectorOfCoOwningReferences(_j));}\n    _o.NonOwningReference = this.NonOwningReference;\n    _o.VectorOfNonOwningReferences = new List<ulong>();\n    for (var _j = 0; _j < this.VectorOfNonOwningReferencesLength; ++_j) {_o.VectorOfNonOwningReferences.Add(this.VectorOfNonOwningReferences(_j));}\n    _o.AnyUnique = new MyGame.Example.AnyUniqueAliasesUnion();\n    _o.AnyUnique.Type = this.AnyUniqueType;\n    switch (this.AnyUniqueType) {\n      default: break;\n      case MyGame.Example.AnyUniqueAliases.M:\n        _o.AnyUnique.Value = this.AnyUnique<MyGame.Example.Monster>().HasValue ? this.AnyUnique<MyGame.Example.Monster>().Value.UnPack() : null;\n        break;\n      case MyGame.Example.AnyUniqueAliases.TS:\n        _o.AnyUnique.Value = this.AnyUnique<MyGame.Example.TestSimpleTableWithEnum>().HasValue ? this.AnyUnique<MyGame.Example.TestSimpleTableWithEnum>().Value.UnPack() : null;\n        break;\n      case MyGame.Example.AnyUniqueAliases.M2:\n        _o.AnyUnique.Value = this.AnyUnique<MyGame.Example2.Monster>().HasValue ? this.AnyUnique<MyGame.Example2.Monster>().Value.UnPack() : null;\n        break;\n    }\n    _o.AnyAmbiguous = new MyGame.Example.AnyAmbiguousAliasesUnion();\n    _o.AnyAmbiguous.Type = this.AnyAmbiguousType;\n    switch (this.AnyAmbiguousType) {\n      default: break;\n      case MyGame.Example.AnyAmbiguousAliases.M1:\n        _o.AnyAmbiguous.Value = this.AnyAmbiguous<MyGame.Example.Monster>().HasValue ? this.AnyAmbiguous<MyGame.Example.Monster>().Value.UnPack() : null;\n        break;\n      case MyGame.Example.AnyAmbiguousAliases.M2:\n        _o.AnyAmbiguous.Value = this.AnyAmbiguous<MyGame.Example.Monster>().HasValue ? this.AnyAmbiguous<MyGame.Example.Monster>().Value.UnPack() : null;\n        break;\n      case MyGame.Example.AnyAmbiguousAliases.M3:\n        _o.AnyAmbiguous.Value = this.AnyAmbiguous<MyGame.Example.Monster>().HasValue ? this.AnyAmbiguous<MyGame.Example.Monster>().Value.UnPack() : null;\n        break;\n    }\n    _o.VectorOfEnums = new List<MyGame.Example.Color>();\n    for (var _j = 0; _j < this.VectorOfEnumsLength; ++_j) {_o.VectorOfEnums.Add(this.VectorOfEnums(_j));}\n    _o.SignedEnum = this.SignedEnum;\n    _o.Testrequirednestedflatbuffer = new List<byte>();\n    for (var _j = 0; _j < this.TestrequirednestedflatbufferLength; ++_j) {_o.Testrequirednestedflatbuffer.Add(this.Testrequirednestedflatbuffer(_j));}\n    _o.ScalarKeySortedTables = new List<MyGame.Example.StatT>();\n    for (var _j = 0; _j < this.ScalarKeySortedTablesLength; ++_j) {_o.ScalarKeySortedTables.Add(this.ScalarKeySortedTables(_j).HasValue ? this.ScalarKeySortedTables(_j).Value.UnPack() : null);}\n    _o.NativeInline = this.NativeInline.HasValue ? this.NativeInline.Value.UnPack() : null;\n    _o.LongEnumNonEnumDefault = this.LongEnumNonEnumDefault;\n    _o.LongEnumNormalDefault = this.LongEnumNormalDefault;\n    _o.NanDefault = this.NanDefault;\n    _o.InfDefault = this.InfDefault;\n    _o.PositiveInfDefault = this.PositiveInfDefault;\n    _o.InfinityDefault = this.InfinityDefault;\n    _o.PositiveInfinityDefault = this.PositiveInfinityDefault;\n    _o.NegativeInfDefault = this.NegativeInfDefault;\n    _o.NegativeInfinityDefault = this.NegativeInfinityDefault;\n    _o.DoubleInfDefault = this.DoubleInfDefault;\n  }\n  public static Offset<MyGame.Example.Monster> Pack(FlatBufferBuilder builder, MonsterT _o) {\n    if (_o == null) return default(Offset<MyGame.Example.Monster>);\n    var _name = _o.Name == null ? default(StringOffset) : builder.CreateString(_o.Name);\n    var _inventory = default(VectorOffset);\n    if (_o.Inventory != null) {\n      var __inventory = _o.Inventory.ToArray();\n      _inventory = CreateInventoryVector(builder, __inventory);\n    }\n    var _test_type = _o.Test == null ? MyGame.Example.Any.NONE : _o.Test.Type;\n    var _test = _o.Test == null ? 0 : MyGame.Example.AnyUnion.Pack(builder, _o.Test);\n    var _test4 = default(VectorOffset);\n    if (_o.Test4 != null) {\n      StartTest4Vector(builder, _o.Test4.Count);\n      for (var _j = _o.Test4.Count - 1; _j >= 0; --_j) { MyGame.Example.Test.Pack(builder, _o.Test4[_j]); }\n      _test4 = builder.EndVector();\n    }\n    var _testarrayofstring = default(VectorOffset);\n    if (_o.Testarrayofstring != null) {\n      var __testarrayofstring = new StringOffset[_o.Testarrayofstring.Count];\n      for (var _j = 0; _j < __testarrayofstring.Length; ++_j) { __testarrayofstring[_j] = builder.CreateString(_o.Testarrayofstring[_j]); }\n      _testarrayofstring = CreateTestarrayofstringVector(builder, __testarrayofstring);\n    }\n    var _testarrayoftables = default(VectorOffset);\n    if (_o.Testarrayoftables != null) {\n      var __testarrayoftables = new Offset<MyGame.Example.Monster>[_o.Testarrayoftables.Count];\n      for (var _j = 0; _j < __testarrayoftables.Length; ++_j) { __testarrayoftables[_j] = MyGame.Example.Monster.Pack(builder, _o.Testarrayoftables[_j]); }\n      _testarrayoftables = CreateTestarrayoftablesVector(builder, __testarrayoftables);\n    }\n    var _enemy = _o.Enemy == null ? default(Offset<MyGame.Example.Monster>) : MyGame.Example.Monster.Pack(builder, _o.Enemy);\n    var _testnestedflatbuffer = default(VectorOffset);\n    if (_o.Testnestedflatbuffer != null) {\n      var __testnestedflatbuffer = _o.Testnestedflatbuffer.ToArray();\n      _testnestedflatbuffer = CreateTestnestedflatbufferVector(builder, __testnestedflatbuffer);\n    }\n    var _testempty = _o.Testempty == null ? default(Offset<MyGame.Example.Stat>) : MyGame.Example.Stat.Pack(builder, _o.Testempty);\n    var _testarrayofbools = default(VectorOffset);\n    if (_o.Testarrayofbools != null) {\n      var __testarrayofbools = _o.Testarrayofbools.ToArray();\n      _testarrayofbools = CreateTestarrayofboolsVector(builder, __testarrayofbools);\n    }\n    var _testarrayofstring2 = default(VectorOffset);\n    if (_o.Testarrayofstring2 != null) {\n      var __testarrayofstring2 = new StringOffset[_o.Testarrayofstring2.Count];\n      for (var _j = 0; _j < __testarrayofstring2.Length; ++_j) { __testarrayofstring2[_j] = builder.CreateString(_o.Testarrayofstring2[_j]); }\n      _testarrayofstring2 = CreateTestarrayofstring2Vector(builder, __testarrayofstring2);\n    }\n    var _testarrayofsortedstruct = default(VectorOffset);\n    if (_o.Testarrayofsortedstruct != null) {\n      StartTestarrayofsortedstructVector(builder, _o.Testarrayofsortedstruct.Count);\n      for (var _j = _o.Testarrayofsortedstruct.Count - 1; _j >= 0; --_j) { MyGame.Example.Ability.Pack(builder, _o.Testarrayofsortedstruct[_j]); }\n      _testarrayofsortedstruct = builder.EndVector();\n    }\n    var _flex = default(VectorOffset);\n    if (_o.Flex != null) {\n      var __flex = _o.Flex.ToArray();\n      _flex = CreateFlexVector(builder, __flex);\n    }\n    var _test5 = default(VectorOffset);\n    if (_o.Test5 != null) {\n      StartTest5Vector(builder, _o.Test5.Count);\n      for (var _j = _o.Test5.Count - 1; _j >= 0; --_j) { MyGame.Example.Test.Pack(builder, _o.Test5[_j]); }\n      _test5 = builder.EndVector();\n    }\n    var _vector_of_longs = default(VectorOffset);\n    if (_o.VectorOfLongs != null) {\n      var __vector_of_longs = _o.VectorOfLongs.ToArray();\n      _vector_of_longs = CreateVectorOfLongsVector(builder, __vector_of_longs);\n    }\n    var _vector_of_doubles = default(VectorOffset);\n    if (_o.VectorOfDoubles != null) {\n      var __vector_of_doubles = _o.VectorOfDoubles.ToArray();\n      _vector_of_doubles = CreateVectorOfDoublesVector(builder, __vector_of_doubles);\n    }\n    var _parent_namespace_test = _o.ParentNamespaceTest == null ? default(Offset<MyGame.InParentNamespace>) : MyGame.InParentNamespace.Pack(builder, _o.ParentNamespaceTest);\n    var _vector_of_referrables = default(VectorOffset);\n    if (_o.VectorOfReferrables != null) {\n      var __vector_of_referrables = new Offset<MyGame.Example.Referrable>[_o.VectorOfReferrables.Count];\n      for (var _j = 0; _j < __vector_of_referrables.Length; ++_j) { __vector_of_referrables[_j] = MyGame.Example.Referrable.Pack(builder, _o.VectorOfReferrables[_j]); }\n      _vector_of_referrables = CreateVectorOfReferrablesVector(builder, __vector_of_referrables);\n    }\n    var _vector_of_weak_references = default(VectorOffset);\n    if (_o.VectorOfWeakReferences != null) {\n      var __vector_of_weak_references = _o.VectorOfWeakReferences.ToArray();\n      _vector_of_weak_references = CreateVectorOfWeakReferencesVector(builder, __vector_of_weak_references);\n    }\n    var _vector_of_strong_referrables = default(VectorOffset);\n    if (_o.VectorOfStrongReferrables != null) {\n      var __vector_of_strong_referrables = new Offset<MyGame.Example.Referrable>[_o.VectorOfStrongReferrables.Count];\n      for (var _j = 0; _j < __vector_of_strong_referrables.Length; ++_j) { __vector_of_strong_referrables[_j] = MyGame.Example.Referrable.Pack(builder, _o.VectorOfStrongReferrables[_j]); }\n      _vector_of_strong_referrables = CreateVectorOfStrongReferrablesVector(builder, __vector_of_strong_referrables);\n    }\n    var _vector_of_co_owning_references = default(VectorOffset);\n    if (_o.VectorOfCoOwningReferences != null) {\n      var __vector_of_co_owning_references = _o.VectorOfCoOwningReferences.ToArray();\n      _vector_of_co_owning_references = CreateVectorOfCoOwningReferencesVector(builder, __vector_of_co_owning_references);\n    }\n    var _vector_of_non_owning_references = default(VectorOffset);\n    if (_o.VectorOfNonOwningReferences != null) {\n      var __vector_of_non_owning_references = _o.VectorOfNonOwningReferences.ToArray();\n      _vector_of_non_owning_references = CreateVectorOfNonOwningReferencesVector(builder, __vector_of_non_owning_references);\n    }\n    var _any_unique_type = _o.AnyUnique == null ? MyGame.Example.AnyUniqueAliases.NONE : _o.AnyUnique.Type;\n    var _any_unique = _o.AnyUnique == null ? 0 : MyGame.Example.AnyUniqueAliasesUnion.Pack(builder, _o.AnyUnique);\n    var _any_ambiguous_type = _o.AnyAmbiguous == null ? MyGame.Example.AnyAmbiguousAliases.NONE : _o.AnyAmbiguous.Type;\n    var _any_ambiguous = _o.AnyAmbiguous == null ? 0 : MyGame.Example.AnyAmbiguousAliasesUnion.Pack(builder, _o.AnyAmbiguous);\n    var _vector_of_enums = default(VectorOffset);\n    if (_o.VectorOfEnums != null) {\n      var __vector_of_enums = _o.VectorOfEnums.ToArray();\n      _vector_of_enums = CreateVectorOfEnumsVector(builder, __vector_of_enums);\n    }\n    var _testrequirednestedflatbuffer = default(VectorOffset);\n    if (_o.Testrequirednestedflatbuffer != null) {\n      var __testrequirednestedflatbuffer = _o.Testrequirednestedflatbuffer.ToArray();\n      _testrequirednestedflatbuffer = CreateTestrequirednestedflatbufferVector(builder, __testrequirednestedflatbuffer);\n    }\n    var _scalar_key_sorted_tables = default(VectorOffset);\n    if (_o.ScalarKeySortedTables != null) {\n      var __scalar_key_sorted_tables = new Offset<MyGame.Example.Stat>[_o.ScalarKeySortedTables.Count];\n      for (var _j = 0; _j < __scalar_key_sorted_tables.Length; ++_j) { __scalar_key_sorted_tables[_j] = MyGame.Example.Stat.Pack(builder, _o.ScalarKeySortedTables[_j]); }\n      _scalar_key_sorted_tables = CreateScalarKeySortedTablesVector(builder, __scalar_key_sorted_tables);\n    }\n    return CreateMonster(\n      builder,\n      _o.Pos,\n      _o.Mana,\n      _o.Hp,\n      _name,\n      _inventory,\n      _o.Color,\n      _test_type,\n      _test,\n      _test4,\n      _testarrayofstring,\n      _testarrayoftables,\n      _enemy,\n      _testnestedflatbuffer,\n      _testempty,\n      _o.Testbool,\n      _o.Testhashs32Fnv1,\n      _o.Testhashu32Fnv1,\n      _o.Testhashs64Fnv1,\n      _o.Testhashu64Fnv1,\n      _o.Testhashs32Fnv1a,\n      _o.Testhashu32Fnv1a,\n      _o.Testhashs64Fnv1a,\n      _o.Testhashu64Fnv1a,\n      _testarrayofbools,\n      _o.Testf,\n      _o.Testf2,\n      _o.Testf3,\n      _testarrayofstring2,\n      _testarrayofsortedstruct,\n      _flex,\n      _test5,\n      _vector_of_longs,\n      _vector_of_doubles,\n      _parent_namespace_test,\n      _vector_of_referrables,\n      _o.SingleWeakReference,\n      _vector_of_weak_references,\n      _vector_of_strong_referrables,\n      _o.CoOwningReference,\n      _vector_of_co_owning_references,\n      _o.NonOwningReference,\n      _vector_of_non_owning_references,\n      _any_unique_type,\n      _any_unique,\n      _any_ambiguous_type,\n      _any_ambiguous,\n      _vector_of_enums,\n      _o.SignedEnum,\n      _testrequirednestedflatbuffer,\n      _scalar_key_sorted_tables,\n      _o.NativeInline,\n      _o.LongEnumNonEnumDefault,\n      _o.LongEnumNormalDefault,\n      _o.NanDefault,\n      _o.InfDefault,\n      _o.PositiveInfDefault,\n      _o.InfinityDefault,\n      _o.PositiveInfinityDefault,\n      _o.NegativeInfDefault,\n      _o.NegativeInfinityDefault,\n      _o.DoubleInfDefault);\n  }\n}\n\npublic class MonsterT\n{\n  [Newtonsoft.Json.JsonProperty(\"pos\")]\n  public MyGame.Example.Vec3T Pos { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"mana\")]\n  public short Mana { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"hp\")]\n  public short Hp { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"name\")]\n  public string Name { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"inventory\")]\n  public List<byte> Inventory { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"color\")]\n  public MyGame.Example.Color Color { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"test_type\")]\n  private MyGame.Example.Any TestType {\n    get {\n      return this.Test != null ? this.Test.Type : MyGame.Example.Any.NONE;\n    }\n    set {\n      this.Test = new MyGame.Example.AnyUnion();\n      this.Test.Type = value;\n    }\n  }\n  [Newtonsoft.Json.JsonProperty(\"test\")]\n  [Newtonsoft.Json.JsonConverter(typeof(MyGame.Example.AnyUnion_JsonConverter))]\n  public MyGame.Example.AnyUnion Test { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"test4\")]\n  public List<MyGame.Example.TestT> Test4 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"testarrayofstring\")]\n  public List<string> Testarrayofstring { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"testarrayoftables\")]\n  public List<MyGame.Example.MonsterT> Testarrayoftables { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"enemy\")]\n  public MyGame.Example.MonsterT Enemy { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"testnestedflatbuffer\")]\n  public List<byte> Testnestedflatbuffer { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"testempty\")]\n  public MyGame.Example.StatT Testempty { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"testbool\")]\n  public bool Testbool { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"testhashs32_fnv1\")]\n  [Newtonsoft.Json.JsonIgnore()]\n  public int Testhashs32Fnv1 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"testhashu32_fnv1\")]\n  [Newtonsoft.Json.JsonIgnore()]\n  public uint Testhashu32Fnv1 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"testhashs64_fnv1\")]\n  [Newtonsoft.Json.JsonIgnore()]\n  public long Testhashs64Fnv1 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"testhashu64_fnv1\")]\n  [Newtonsoft.Json.JsonIgnore()]\n  public ulong Testhashu64Fnv1 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"testhashs32_fnv1a\")]\n  [Newtonsoft.Json.JsonIgnore()]\n  public int Testhashs32Fnv1a { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"testhashu32_fnv1a\")]\n  [Newtonsoft.Json.JsonIgnore()]\n  public uint Testhashu32Fnv1a { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"testhashs64_fnv1a\")]\n  [Newtonsoft.Json.JsonIgnore()]\n  public long Testhashs64Fnv1a { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"testhashu64_fnv1a\")]\n  [Newtonsoft.Json.JsonIgnore()]\n  public ulong Testhashu64Fnv1a { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"testarrayofbools\")]\n  public List<bool> Testarrayofbools { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"testf\")]\n  public float Testf { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"testf2\")]\n  public float Testf2 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"testf3\")]\n  public float Testf3 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"testarrayofstring2\")]\n  public List<string> Testarrayofstring2 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"testarrayofsortedstruct\")]\n  public List<MyGame.Example.AbilityT> Testarrayofsortedstruct { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"flex\")]\n  public List<byte> Flex { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"test5\")]\n  public List<MyGame.Example.TestT> Test5 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"vector_of_longs\")]\n  public List<long> VectorOfLongs { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"vector_of_doubles\")]\n  public List<double> VectorOfDoubles { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"parent_namespace_test\")]\n  public MyGame.InParentNamespaceT ParentNamespaceTest { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"vector_of_referrables\")]\n  public List<MyGame.Example.ReferrableT> VectorOfReferrables { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"single_weak_reference\")]\n  [Newtonsoft.Json.JsonIgnore()]\n  public ulong SingleWeakReference { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"vector_of_weak_references\")]\n  [Newtonsoft.Json.JsonIgnore()]\n  public List<ulong> VectorOfWeakReferences { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"vector_of_strong_referrables\")]\n  public List<MyGame.Example.ReferrableT> VectorOfStrongReferrables { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"co_owning_reference\")]\n  [Newtonsoft.Json.JsonIgnore()]\n  public ulong CoOwningReference { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"vector_of_co_owning_references\")]\n  [Newtonsoft.Json.JsonIgnore()]\n  public List<ulong> VectorOfCoOwningReferences { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"non_owning_reference\")]\n  [Newtonsoft.Json.JsonIgnore()]\n  public ulong NonOwningReference { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"vector_of_non_owning_references\")]\n  [Newtonsoft.Json.JsonIgnore()]\n  public List<ulong> VectorOfNonOwningReferences { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"any_unique_type\")]\n  private MyGame.Example.AnyUniqueAliases AnyUniqueType {\n    get {\n      return this.AnyUnique != null ? this.AnyUnique.Type : MyGame.Example.AnyUniqueAliases.NONE;\n    }\n    set {\n      this.AnyUnique = new MyGame.Example.AnyUniqueAliasesUnion();\n      this.AnyUnique.Type = value;\n    }\n  }\n  [Newtonsoft.Json.JsonProperty(\"any_unique\")]\n  [Newtonsoft.Json.JsonConverter(typeof(MyGame.Example.AnyUniqueAliasesUnion_JsonConverter))]\n  public MyGame.Example.AnyUniqueAliasesUnion AnyUnique { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"any_ambiguous_type\")]\n  private MyGame.Example.AnyAmbiguousAliases AnyAmbiguousType {\n    get {\n      return this.AnyAmbiguous != null ? this.AnyAmbiguous.Type : MyGame.Example.AnyAmbiguousAliases.NONE;\n    }\n    set {\n      this.AnyAmbiguous = new MyGame.Example.AnyAmbiguousAliasesUnion();\n      this.AnyAmbiguous.Type = value;\n    }\n  }\n  [Newtonsoft.Json.JsonProperty(\"any_ambiguous\")]\n  [Newtonsoft.Json.JsonConverter(typeof(MyGame.Example.AnyAmbiguousAliasesUnion_JsonConverter))]\n  public MyGame.Example.AnyAmbiguousAliasesUnion AnyAmbiguous { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"vector_of_enums\")]\n  public List<MyGame.Example.Color> VectorOfEnums { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"signed_enum\")]\n  public MyGame.Example.Race SignedEnum { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"testrequirednestedflatbuffer\")]\n  public List<byte> Testrequirednestedflatbuffer { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"scalar_key_sorted_tables\")]\n  public List<MyGame.Example.StatT> ScalarKeySortedTables { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"native_inline\")]\n  public MyGame.Example.TestT NativeInline { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"long_enum_non_enum_default\")]\n  public MyGame.Example.LongEnum LongEnumNonEnumDefault { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"long_enum_normal_default\")]\n  public MyGame.Example.LongEnum LongEnumNormalDefault { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"nan_default\")]\n  public float NanDefault { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"inf_default\")]\n  public float InfDefault { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"positive_inf_default\")]\n  public float PositiveInfDefault { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"infinity_default\")]\n  public float InfinityDefault { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"positive_infinity_default\")]\n  public float PositiveInfinityDefault { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"negative_inf_default\")]\n  public float NegativeInfDefault { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"negative_infinity_default\")]\n  public float NegativeInfinityDefault { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"double_inf_default\")]\n  public double DoubleInfDefault { get; set; }\n\n  public MonsterT() {\n    this.Pos = new MyGame.Example.Vec3T();\n    this.Mana = 150;\n    this.Hp = 100;\n    this.Name = null;\n    this.Inventory = null;\n    this.Color = MyGame.Example.Color.Blue;\n    this.Test = null;\n    this.Test4 = null;\n    this.Testarrayofstring = null;\n    this.Testarrayoftables = null;\n    this.Enemy = null;\n    this.Testnestedflatbuffer = null;\n    this.Testempty = null;\n    this.Testbool = false;\n    this.Testhashs32Fnv1 = 0;\n    this.Testhashu32Fnv1 = 0;\n    this.Testhashs64Fnv1 = 0;\n    this.Testhashu64Fnv1 = 0;\n    this.Testhashs32Fnv1a = 0;\n    this.Testhashu32Fnv1a = 0;\n    this.Testhashs64Fnv1a = 0;\n    this.Testhashu64Fnv1a = 0;\n    this.Testarrayofbools = null;\n    this.Testf = 3.14159f;\n    this.Testf2 = 3.0f;\n    this.Testf3 = 0.0f;\n    this.Testarrayofstring2 = null;\n    this.Testarrayofsortedstruct = null;\n    this.Flex = null;\n    this.Test5 = null;\n    this.VectorOfLongs = null;\n    this.VectorOfDoubles = null;\n    this.ParentNamespaceTest = null;\n    this.VectorOfReferrables = null;\n    this.SingleWeakReference = 0;\n    this.VectorOfWeakReferences = null;\n    this.VectorOfStrongReferrables = null;\n    this.CoOwningReference = 0;\n    this.VectorOfCoOwningReferences = null;\n    this.NonOwningReference = 0;\n    this.VectorOfNonOwningReferences = null;\n    this.AnyUnique = null;\n    this.AnyAmbiguous = null;\n    this.VectorOfEnums = null;\n    this.SignedEnum = MyGame.Example.Race.None;\n    this.Testrequirednestedflatbuffer = null;\n    this.ScalarKeySortedTables = null;\n    this.NativeInline = new MyGame.Example.TestT();\n    this.LongEnumNonEnumDefault = 0;\n    this.LongEnumNormalDefault = MyGame.Example.LongEnum.LongOne;\n    this.NanDefault = Single.NaN;\n    this.InfDefault = Single.PositiveInfinity;\n    this.PositiveInfDefault = Single.PositiveInfinity;\n    this.InfinityDefault = Single.PositiveInfinity;\n    this.PositiveInfinityDefault = Single.PositiveInfinity;\n    this.NegativeInfDefault = Single.NegativeInfinity;\n    this.NegativeInfinityDefault = Single.NegativeInfinity;\n    this.DoubleInfDefault = Double.PositiveInfinity;\n  }\n\n  public static MonsterT DeserializeFromJson(string jsonText) {\n    return Newtonsoft.Json.JsonConvert.DeserializeObject<MonsterT>(jsonText);\n  }\n  public string SerializeToJson() {\n    return Newtonsoft.Json.JsonConvert.SerializeObject(this, Newtonsoft.Json.Formatting.Indented);\n  }\n  public static MonsterT DeserializeFromBinary(byte[] fbBuffer) {\n    return Monster.GetRootAsMonster(new ByteBuffer(fbBuffer)).UnPack();\n  }\n  public byte[] SerializeToBinary() {\n    var fbb = new FlatBufferBuilder(0x10000);\n    Monster.FinishMonsterBuffer(fbb, Monster.Pack(fbb, this));\n    return fbb.DataBuffer.ToSizedArray();\n  }\n}\n\n\nstatic public class MonsterVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos)\n  {\n    return verifier.VerifyTableStart(tablePos)\n      && verifier.VerifyField(tablePos, 4 /*Pos*/, 32 /*MyGame.Example.Vec3*/, 8, false)\n      && verifier.VerifyField(tablePos, 6 /*Mana*/, 2 /*short*/, 2, false)\n      && verifier.VerifyField(tablePos, 8 /*Hp*/, 2 /*short*/, 2, false)\n      && verifier.VerifyString(tablePos, 10 /*Name*/, true)\n      && verifier.VerifyVectorOfData(tablePos, 14 /*Inventory*/, 1 /*byte*/, false)\n      && verifier.VerifyField(tablePos, 16 /*Color*/, 1 /*MyGame.Example.Color*/, 1, false)\n      && verifier.VerifyField(tablePos, 18 /*TestType*/, 1 /*MyGame.Example.Any*/, 1, false)\n      && verifier.VerifyUnion(tablePos, 18, 20 /*Test*/, MyGame.Example.AnyVerify.Verify, false)\n      && verifier.VerifyVectorOfData(tablePos, 22 /*Test4*/, 4 /*MyGame.Example.Test*/, false)\n      && verifier.VerifyVectorOfStrings(tablePos, 24 /*Testarrayofstring*/, false)\n      && verifier.VerifyVectorOfTables(tablePos, 26 /*Testarrayoftables*/, MyGame.Example.MonsterVerify.Verify, false)\n      && verifier.VerifyTable(tablePos, 28 /*Enemy*/, MyGame.Example.MonsterVerify.Verify, false)\n      && verifier.VerifyNestedBuffer(tablePos, 30 /*Testnestedflatbuffer*/, MyGame.Example.MonsterVerify.Verify, false)\n      && verifier.VerifyTable(tablePos, 32 /*Testempty*/, MyGame.Example.StatVerify.Verify, false)\n      && verifier.VerifyField(tablePos, 34 /*Testbool*/, 1 /*bool*/, 1, false)\n      && verifier.VerifyField(tablePos, 36 /*Testhashs32Fnv1*/, 4 /*int*/, 4, false)\n      && verifier.VerifyField(tablePos, 38 /*Testhashu32Fnv1*/, 4 /*uint*/, 4, false)\n      && verifier.VerifyField(tablePos, 40 /*Testhashs64Fnv1*/, 8 /*long*/, 8, false)\n      && verifier.VerifyField(tablePos, 42 /*Testhashu64Fnv1*/, 8 /*ulong*/, 8, false)\n      && verifier.VerifyField(tablePos, 44 /*Testhashs32Fnv1a*/, 4 /*int*/, 4, false)\n      && verifier.VerifyField(tablePos, 46 /*Testhashu32Fnv1a*/, 4 /*uint*/, 4, false)\n      && verifier.VerifyField(tablePos, 48 /*Testhashs64Fnv1a*/, 8 /*long*/, 8, false)\n      && verifier.VerifyField(tablePos, 50 /*Testhashu64Fnv1a*/, 8 /*ulong*/, 8, false)\n      && verifier.VerifyVectorOfData(tablePos, 52 /*Testarrayofbools*/, 1 /*bool*/, false)\n      && verifier.VerifyField(tablePos, 54 /*Testf*/, 4 /*float*/, 4, false)\n      && verifier.VerifyField(tablePos, 56 /*Testf2*/, 4 /*float*/, 4, false)\n      && verifier.VerifyField(tablePos, 58 /*Testf3*/, 4 /*float*/, 4, false)\n      && verifier.VerifyVectorOfStrings(tablePos, 60 /*Testarrayofstring2*/, false)\n      && verifier.VerifyVectorOfData(tablePos, 62 /*Testarrayofsortedstruct*/, 8 /*MyGame.Example.Ability*/, false)\n      && verifier.VerifyNestedBuffer(tablePos, 64 /*Flex*/, null, false)\n      && verifier.VerifyVectorOfData(tablePos, 66 /*Test5*/, 4 /*MyGame.Example.Test*/, false)\n      && verifier.VerifyVectorOfData(tablePos, 68 /*VectorOfLongs*/, 8 /*long*/, false)\n      && verifier.VerifyVectorOfData(tablePos, 70 /*VectorOfDoubles*/, 8 /*double*/, false)\n      && verifier.VerifyTable(tablePos, 72 /*ParentNamespaceTest*/, MyGame.InParentNamespaceVerify.Verify, false)\n      && verifier.VerifyVectorOfTables(tablePos, 74 /*VectorOfReferrables*/, MyGame.Example.ReferrableVerify.Verify, false)\n      && verifier.VerifyField(tablePos, 76 /*SingleWeakReference*/, 8 /*ulong*/, 8, false)\n      && verifier.VerifyVectorOfData(tablePos, 78 /*VectorOfWeakReferences*/, 8 /*ulong*/, false)\n      && verifier.VerifyVectorOfTables(tablePos, 80 /*VectorOfStrongReferrables*/, MyGame.Example.ReferrableVerify.Verify, false)\n      && verifier.VerifyField(tablePos, 82 /*CoOwningReference*/, 8 /*ulong*/, 8, false)\n      && verifier.VerifyVectorOfData(tablePos, 84 /*VectorOfCoOwningReferences*/, 8 /*ulong*/, false)\n      && verifier.VerifyField(tablePos, 86 /*NonOwningReference*/, 8 /*ulong*/, 8, false)\n      && verifier.VerifyVectorOfData(tablePos, 88 /*VectorOfNonOwningReferences*/, 8 /*ulong*/, false)\n      && verifier.VerifyField(tablePos, 90 /*AnyUniqueType*/, 1 /*MyGame.Example.AnyUniqueAliases*/, 1, false)\n      && verifier.VerifyUnion(tablePos, 90, 92 /*AnyUnique*/, MyGame.Example.AnyUniqueAliasesVerify.Verify, false)\n      && verifier.VerifyField(tablePos, 94 /*AnyAmbiguousType*/, 1 /*MyGame.Example.AnyAmbiguousAliases*/, 1, false)\n      && verifier.VerifyUnion(tablePos, 94, 96 /*AnyAmbiguous*/, MyGame.Example.AnyAmbiguousAliasesVerify.Verify, false)\n      && verifier.VerifyVectorOfData(tablePos, 98 /*VectorOfEnums*/, 1 /*MyGame.Example.Color*/, false)\n      && verifier.VerifyField(tablePos, 100 /*SignedEnum*/, 1 /*MyGame.Example.Race*/, 1, false)\n      && verifier.VerifyNestedBuffer(tablePos, 102 /*Testrequirednestedflatbuffer*/, MyGame.Example.MonsterVerify.Verify, false)\n      && verifier.VerifyVectorOfTables(tablePos, 104 /*ScalarKeySortedTables*/, MyGame.Example.StatVerify.Verify, false)\n      && verifier.VerifyField(tablePos, 106 /*NativeInline*/, 4 /*MyGame.Example.Test*/, 2, false)\n      && verifier.VerifyField(tablePos, 108 /*LongEnumNonEnumDefault*/, 8 /*MyGame.Example.LongEnum*/, 8, false)\n      && verifier.VerifyField(tablePos, 110 /*LongEnumNormalDefault*/, 8 /*MyGame.Example.LongEnum*/, 8, false)\n      && verifier.VerifyField(tablePos, 112 /*NanDefault*/, 4 /*float*/, 4, false)\n      && verifier.VerifyField(tablePos, 114 /*InfDefault*/, 4 /*float*/, 4, false)\n      && verifier.VerifyField(tablePos, 116 /*PositiveInfDefault*/, 4 /*float*/, 4, false)\n      && verifier.VerifyField(tablePos, 118 /*InfinityDefault*/, 4 /*float*/, 4, false)\n      && verifier.VerifyField(tablePos, 120 /*PositiveInfinityDefault*/, 4 /*float*/, 4, false)\n      && verifier.VerifyField(tablePos, 122 /*NegativeInfDefault*/, 4 /*float*/, 4, false)\n      && verifier.VerifyField(tablePos, 124 /*NegativeInfinityDefault*/, 4 /*float*/, 4, false)\n      && verifier.VerifyField(tablePos, 126 /*DoubleInfDefault*/, 8 /*double*/, 8, false)\n      && verifier.VerifyTableEnd(tablePos);\n  }\n}\n\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Monster.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage Example\n\nimport (\n\t\"bytes\"\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n\t\"math\"\n\n\tMyGame \"MyGame\"\n)\n\n/// an example documentation comment: \"monster object\"\ntype MonsterT struct {\n\tPos *Vec3T `json:\"pos\"`\n\tMana int16 `json:\"mana\"`\n\tHp int16 `json:\"hp\"`\n\tName string `json:\"name\"`\n\tInventory []byte `json:\"inventory\"`\n\tColor Color `json:\"color\"`\n\tTest *AnyT `json:\"test\"`\n\tTest4 []*TestT `json:\"test4\"`\n\tTestarrayofstring []string `json:\"testarrayofstring\"`\n\tTestarrayoftables []*MonsterT `json:\"testarrayoftables\"`\n\tEnemy *MonsterT `json:\"enemy\"`\n\tTestnestedflatbuffer []byte `json:\"testnestedflatbuffer\"`\n\tTestempty *StatT `json:\"testempty\"`\n\tTestbool bool `json:\"testbool\"`\n\tTesthashs32Fnv1 int32 `json:\"testhashs32_fnv1\"`\n\tTesthashu32Fnv1 uint32 `json:\"testhashu32_fnv1\"`\n\tTesthashs64Fnv1 int64 `json:\"testhashs64_fnv1\"`\n\tTesthashu64Fnv1 uint64 `json:\"testhashu64_fnv1\"`\n\tTesthashs32Fnv1a int32 `json:\"testhashs32_fnv1a\"`\n\tTesthashu32Fnv1a uint32 `json:\"testhashu32_fnv1a\"`\n\tTesthashs64Fnv1a int64 `json:\"testhashs64_fnv1a\"`\n\tTesthashu64Fnv1a uint64 `json:\"testhashu64_fnv1a\"`\n\tTestarrayofbools []bool `json:\"testarrayofbools\"`\n\tTestf float32 `json:\"testf\"`\n\tTestf2 float32 `json:\"testf2\"`\n\tTestf3 float32 `json:\"testf3\"`\n\tTestarrayofstring2 []string `json:\"testarrayofstring2\"`\n\tTestarrayofsortedstruct []*AbilityT `json:\"testarrayofsortedstruct\"`\n\tFlex []byte `json:\"flex\"`\n\tTest5 []*TestT `json:\"test5\"`\n\tVectorOfLongs []int64 `json:\"vector_of_longs\"`\n\tVectorOfDoubles []float64 `json:\"vector_of_doubles\"`\n\tParentNamespaceTest *MyGame.InParentNamespaceT `json:\"parent_namespace_test\"`\n\tVectorOfReferrables []*ReferrableT `json:\"vector_of_referrables\"`\n\tSingleWeakReference uint64 `json:\"single_weak_reference\"`\n\tVectorOfWeakReferences []uint64 `json:\"vector_of_weak_references\"`\n\tVectorOfStrongReferrables []*ReferrableT `json:\"vector_of_strong_referrables\"`\n\tCoOwningReference uint64 `json:\"co_owning_reference\"`\n\tVectorOfCoOwningReferences []uint64 `json:\"vector_of_co_owning_references\"`\n\tNonOwningReference uint64 `json:\"non_owning_reference\"`\n\tVectorOfNonOwningReferences []uint64 `json:\"vector_of_non_owning_references\"`\n\tAnyUnique *AnyUniqueAliasesT `json:\"any_unique\"`\n\tAnyAmbiguous *AnyAmbiguousAliasesT `json:\"any_ambiguous\"`\n\tVectorOfEnums []Color `json:\"vector_of_enums\"`\n\tSignedEnum Race `json:\"signed_enum\"`\n\tTestrequirednestedflatbuffer []byte `json:\"testrequirednestedflatbuffer\"`\n\tScalarKeySortedTables []*StatT `json:\"scalar_key_sorted_tables\"`\n\tNativeInline *TestT `json:\"native_inline\"`\n\tLongEnumNonEnumDefault LongEnum `json:\"long_enum_non_enum_default\"`\n\tLongEnumNormalDefault LongEnum `json:\"long_enum_normal_default\"`\n\tNanDefault float32 `json:\"nan_default\"`\n\tInfDefault float32 `json:\"inf_default\"`\n\tPositiveInfDefault float32 `json:\"positive_inf_default\"`\n\tInfinityDefault float32 `json:\"infinity_default\"`\n\tPositiveInfinityDefault float32 `json:\"positive_infinity_default\"`\n\tNegativeInfDefault float32 `json:\"negative_inf_default\"`\n\tNegativeInfinityDefault float32 `json:\"negative_infinity_default\"`\n\tDoubleInfDefault float64 `json:\"double_inf_default\"`\n}\n\nfunc (t *MonsterT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\tif t == nil {\n\t\treturn 0\n\t}\n\tnameOffset := builder.CreateString(t.Name)\n\tinventoryOffset := flatbuffers.UOffsetT(0)\n\tif t.Inventory != nil {\n\t\tinventoryOffset = builder.CreateByteString(t.Inventory)\n\t}\n\ttestOffset := t.Test.Pack(builder)\n\n\ttest4Offset := flatbuffers.UOffsetT(0)\n\tif t.Test4 != nil {\n\t\ttest4Length := len(t.Test4)\n\t\tMonsterStartTest4Vector(builder, test4Length)\n\t\tfor j := test4Length - 1; j >= 0; j-- {\n\t\t\tt.Test4[j].Pack(builder)\n\t\t}\n\t\ttest4Offset = builder.EndVector(test4Length)\n\t}\n\ttestarrayofstringOffset := flatbuffers.UOffsetT(0)\n\tif t.Testarrayofstring != nil {\n\t\ttestarrayofstringLength := len(t.Testarrayofstring)\n\t\ttestarrayofstringOffsets := make([]flatbuffers.UOffsetT, testarrayofstringLength)\n\t\tfor j := 0; j < testarrayofstringLength; j++ {\n\t\t\ttestarrayofstringOffsets[j] = builder.CreateString(t.Testarrayofstring[j])\n\t\t}\n\t\tMonsterStartTestarrayofstringVector(builder, testarrayofstringLength)\n\t\tfor j := testarrayofstringLength - 1; j >= 0; j-- {\n\t\t\tbuilder.PrependUOffsetT(testarrayofstringOffsets[j])\n\t\t}\n\t\ttestarrayofstringOffset = builder.EndVector(testarrayofstringLength)\n\t}\n\ttestarrayoftablesOffset := flatbuffers.UOffsetT(0)\n\tif t.Testarrayoftables != nil {\n\t\ttestarrayoftablesLength := len(t.Testarrayoftables)\n\t\ttestarrayoftablesOffsets := make([]flatbuffers.UOffsetT, testarrayoftablesLength)\n\t\tfor j := 0; j < testarrayoftablesLength; j++ {\n\t\t\ttestarrayoftablesOffsets[j] = t.Testarrayoftables[j].Pack(builder)\n\t\t}\n\t\tMonsterStartTestarrayoftablesVector(builder, testarrayoftablesLength)\n\t\tfor j := testarrayoftablesLength - 1; j >= 0; j-- {\n\t\t\tbuilder.PrependUOffsetT(testarrayoftablesOffsets[j])\n\t\t}\n\t\ttestarrayoftablesOffset = builder.EndVector(testarrayoftablesLength)\n\t}\n\tenemyOffset := t.Enemy.Pack(builder)\n\ttestnestedflatbufferOffset := flatbuffers.UOffsetT(0)\n\tif t.Testnestedflatbuffer != nil {\n\t\ttestnestedflatbufferOffset = builder.CreateByteString(t.Testnestedflatbuffer)\n\t}\n\ttestemptyOffset := t.Testempty.Pack(builder)\n\ttestarrayofboolsOffset := flatbuffers.UOffsetT(0)\n\tif t.Testarrayofbools != nil {\n\t\ttestarrayofboolsLength := len(t.Testarrayofbools)\n\t\tMonsterStartTestarrayofboolsVector(builder, testarrayofboolsLength)\n\t\tfor j := testarrayofboolsLength - 1; j >= 0; j-- {\n\t\t\tbuilder.PrependBool(t.Testarrayofbools[j])\n\t\t}\n\t\ttestarrayofboolsOffset = builder.EndVector(testarrayofboolsLength)\n\t}\n\ttestarrayofstring2Offset := flatbuffers.UOffsetT(0)\n\tif t.Testarrayofstring2 != nil {\n\t\ttestarrayofstring2Length := len(t.Testarrayofstring2)\n\t\ttestarrayofstring2Offsets := make([]flatbuffers.UOffsetT, testarrayofstring2Length)\n\t\tfor j := 0; j < testarrayofstring2Length; j++ {\n\t\t\ttestarrayofstring2Offsets[j] = builder.CreateString(t.Testarrayofstring2[j])\n\t\t}\n\t\tMonsterStartTestarrayofstring2Vector(builder, testarrayofstring2Length)\n\t\tfor j := testarrayofstring2Length - 1; j >= 0; j-- {\n\t\t\tbuilder.PrependUOffsetT(testarrayofstring2Offsets[j])\n\t\t}\n\t\ttestarrayofstring2Offset = builder.EndVector(testarrayofstring2Length)\n\t}\n\ttestarrayofsortedstructOffset := flatbuffers.UOffsetT(0)\n\tif t.Testarrayofsortedstruct != nil {\n\t\ttestarrayofsortedstructLength := len(t.Testarrayofsortedstruct)\n\t\tMonsterStartTestarrayofsortedstructVector(builder, testarrayofsortedstructLength)\n\t\tfor j := testarrayofsortedstructLength - 1; j >= 0; j-- {\n\t\t\tt.Testarrayofsortedstruct[j].Pack(builder)\n\t\t}\n\t\ttestarrayofsortedstructOffset = builder.EndVector(testarrayofsortedstructLength)\n\t}\n\tflexOffset := flatbuffers.UOffsetT(0)\n\tif t.Flex != nil {\n\t\tflexOffset = builder.CreateByteString(t.Flex)\n\t}\n\ttest5Offset := flatbuffers.UOffsetT(0)\n\tif t.Test5 != nil {\n\t\ttest5Length := len(t.Test5)\n\t\tMonsterStartTest5Vector(builder, test5Length)\n\t\tfor j := test5Length - 1; j >= 0; j-- {\n\t\t\tt.Test5[j].Pack(builder)\n\t\t}\n\t\ttest5Offset = builder.EndVector(test5Length)\n\t}\n\tvectorOfLongsOffset := flatbuffers.UOffsetT(0)\n\tif t.VectorOfLongs != nil {\n\t\tvectorOfLongsLength := len(t.VectorOfLongs)\n\t\tMonsterStartVectorOfLongsVector(builder, vectorOfLongsLength)\n\t\tfor j := vectorOfLongsLength - 1; j >= 0; j-- {\n\t\t\tbuilder.PrependInt64(t.VectorOfLongs[j])\n\t\t}\n\t\tvectorOfLongsOffset = builder.EndVector(vectorOfLongsLength)\n\t}\n\tvectorOfDoublesOffset := flatbuffers.UOffsetT(0)\n\tif t.VectorOfDoubles != nil {\n\t\tvectorOfDoublesLength := len(t.VectorOfDoubles)\n\t\tMonsterStartVectorOfDoublesVector(builder, vectorOfDoublesLength)\n\t\tfor j := vectorOfDoublesLength - 1; j >= 0; j-- {\n\t\t\tbuilder.PrependFloat64(t.VectorOfDoubles[j])\n\t\t}\n\t\tvectorOfDoublesOffset = builder.EndVector(vectorOfDoublesLength)\n\t}\n\tparentNamespaceTestOffset := t.ParentNamespaceTest.Pack(builder)\n\tvectorOfReferrablesOffset := flatbuffers.UOffsetT(0)\n\tif t.VectorOfReferrables != nil {\n\t\tvectorOfReferrablesLength := len(t.VectorOfReferrables)\n\t\tvectorOfReferrablesOffsets := make([]flatbuffers.UOffsetT, vectorOfReferrablesLength)\n\t\tfor j := 0; j < vectorOfReferrablesLength; j++ {\n\t\t\tvectorOfReferrablesOffsets[j] = t.VectorOfReferrables[j].Pack(builder)\n\t\t}\n\t\tMonsterStartVectorOfReferrablesVector(builder, vectorOfReferrablesLength)\n\t\tfor j := vectorOfReferrablesLength - 1; j >= 0; j-- {\n\t\t\tbuilder.PrependUOffsetT(vectorOfReferrablesOffsets[j])\n\t\t}\n\t\tvectorOfReferrablesOffset = builder.EndVector(vectorOfReferrablesLength)\n\t}\n\tvectorOfWeakReferencesOffset := flatbuffers.UOffsetT(0)\n\tif t.VectorOfWeakReferences != nil {\n\t\tvectorOfWeakReferencesLength := len(t.VectorOfWeakReferences)\n\t\tMonsterStartVectorOfWeakReferencesVector(builder, vectorOfWeakReferencesLength)\n\t\tfor j := vectorOfWeakReferencesLength - 1; j >= 0; j-- {\n\t\t\tbuilder.PrependUint64(t.VectorOfWeakReferences[j])\n\t\t}\n\t\tvectorOfWeakReferencesOffset = builder.EndVector(vectorOfWeakReferencesLength)\n\t}\n\tvectorOfStrongReferrablesOffset := flatbuffers.UOffsetT(0)\n\tif t.VectorOfStrongReferrables != nil {\n\t\tvectorOfStrongReferrablesLength := len(t.VectorOfStrongReferrables)\n\t\tvectorOfStrongReferrablesOffsets := make([]flatbuffers.UOffsetT, vectorOfStrongReferrablesLength)\n\t\tfor j := 0; j < vectorOfStrongReferrablesLength; j++ {\n\t\t\tvectorOfStrongReferrablesOffsets[j] = t.VectorOfStrongReferrables[j].Pack(builder)\n\t\t}\n\t\tMonsterStartVectorOfStrongReferrablesVector(builder, vectorOfStrongReferrablesLength)\n\t\tfor j := vectorOfStrongReferrablesLength - 1; j >= 0; j-- {\n\t\t\tbuilder.PrependUOffsetT(vectorOfStrongReferrablesOffsets[j])\n\t\t}\n\t\tvectorOfStrongReferrablesOffset = builder.EndVector(vectorOfStrongReferrablesLength)\n\t}\n\tvectorOfCoOwningReferencesOffset := flatbuffers.UOffsetT(0)\n\tif t.VectorOfCoOwningReferences != nil {\n\t\tvectorOfCoOwningReferencesLength := len(t.VectorOfCoOwningReferences)\n\t\tMonsterStartVectorOfCoOwningReferencesVector(builder, vectorOfCoOwningReferencesLength)\n\t\tfor j := vectorOfCoOwningReferencesLength - 1; j >= 0; j-- {\n\t\t\tbuilder.PrependUint64(t.VectorOfCoOwningReferences[j])\n\t\t}\n\t\tvectorOfCoOwningReferencesOffset = builder.EndVector(vectorOfCoOwningReferencesLength)\n\t}\n\tvectorOfNonOwningReferencesOffset := flatbuffers.UOffsetT(0)\n\tif t.VectorOfNonOwningReferences != nil {\n\t\tvectorOfNonOwningReferencesLength := len(t.VectorOfNonOwningReferences)\n\t\tMonsterStartVectorOfNonOwningReferencesVector(builder, vectorOfNonOwningReferencesLength)\n\t\tfor j := vectorOfNonOwningReferencesLength - 1; j >= 0; j-- {\n\t\t\tbuilder.PrependUint64(t.VectorOfNonOwningReferences[j])\n\t\t}\n\t\tvectorOfNonOwningReferencesOffset = builder.EndVector(vectorOfNonOwningReferencesLength)\n\t}\n\tanyUniqueOffset := t.AnyUnique.Pack(builder)\n\n\tanyAmbiguousOffset := t.AnyAmbiguous.Pack(builder)\n\n\tvectorOfEnumsOffset := flatbuffers.UOffsetT(0)\n\tif t.VectorOfEnums != nil {\n\t\tvectorOfEnumsLength := len(t.VectorOfEnums)\n\t\tMonsterStartVectorOfEnumsVector(builder, vectorOfEnumsLength)\n\t\tfor j := vectorOfEnumsLength - 1; j >= 0; j-- {\n\t\t\tbuilder.PrependByte(byte(t.VectorOfEnums[j]))\n\t\t}\n\t\tvectorOfEnumsOffset = builder.EndVector(vectorOfEnumsLength)\n\t}\n\ttestrequirednestedflatbufferOffset := flatbuffers.UOffsetT(0)\n\tif t.Testrequirednestedflatbuffer != nil {\n\t\ttestrequirednestedflatbufferOffset = builder.CreateByteString(t.Testrequirednestedflatbuffer)\n\t}\n\tscalarKeySortedTablesOffset := flatbuffers.UOffsetT(0)\n\tif t.ScalarKeySortedTables != nil {\n\t\tscalarKeySortedTablesLength := len(t.ScalarKeySortedTables)\n\t\tscalarKeySortedTablesOffsets := make([]flatbuffers.UOffsetT, scalarKeySortedTablesLength)\n\t\tfor j := 0; j < scalarKeySortedTablesLength; j++ {\n\t\t\tscalarKeySortedTablesOffsets[j] = t.ScalarKeySortedTables[j].Pack(builder)\n\t\t}\n\t\tMonsterStartScalarKeySortedTablesVector(builder, scalarKeySortedTablesLength)\n\t\tfor j := scalarKeySortedTablesLength - 1; j >= 0; j-- {\n\t\t\tbuilder.PrependUOffsetT(scalarKeySortedTablesOffsets[j])\n\t\t}\n\t\tscalarKeySortedTablesOffset = builder.EndVector(scalarKeySortedTablesLength)\n\t}\n\tMonsterStart(builder)\n\tposOffset := t.Pos.Pack(builder)\n\tMonsterAddPos(builder, posOffset)\n\tMonsterAddMana(builder, t.Mana)\n\tMonsterAddHp(builder, t.Hp)\n\tMonsterAddName(builder, nameOffset)\n\tMonsterAddInventory(builder, inventoryOffset)\n\tMonsterAddColor(builder, t.Color)\n\tif t.Test != nil {\n\t\tMonsterAddTestType(builder, t.Test.Type)\n\t}\n\tMonsterAddTest(builder, testOffset)\n\tMonsterAddTest4(builder, test4Offset)\n\tMonsterAddTestarrayofstring(builder, testarrayofstringOffset)\n\tMonsterAddTestarrayoftables(builder, testarrayoftablesOffset)\n\tMonsterAddEnemy(builder, enemyOffset)\n\tMonsterAddTestnestedflatbuffer(builder, testnestedflatbufferOffset)\n\tMonsterAddTestempty(builder, testemptyOffset)\n\tMonsterAddTestbool(builder, t.Testbool)\n\tMonsterAddTesthashs32Fnv1(builder, t.Testhashs32Fnv1)\n\tMonsterAddTesthashu32Fnv1(builder, t.Testhashu32Fnv1)\n\tMonsterAddTesthashs64Fnv1(builder, t.Testhashs64Fnv1)\n\tMonsterAddTesthashu64Fnv1(builder, t.Testhashu64Fnv1)\n\tMonsterAddTesthashs32Fnv1a(builder, t.Testhashs32Fnv1a)\n\tMonsterAddTesthashu32Fnv1a(builder, t.Testhashu32Fnv1a)\n\tMonsterAddTesthashs64Fnv1a(builder, t.Testhashs64Fnv1a)\n\tMonsterAddTesthashu64Fnv1a(builder, t.Testhashu64Fnv1a)\n\tMonsterAddTestarrayofbools(builder, testarrayofboolsOffset)\n\tMonsterAddTestf(builder, t.Testf)\n\tMonsterAddTestf2(builder, t.Testf2)\n\tMonsterAddTestf3(builder, t.Testf3)\n\tMonsterAddTestarrayofstring2(builder, testarrayofstring2Offset)\n\tMonsterAddTestarrayofsortedstruct(builder, testarrayofsortedstructOffset)\n\tMonsterAddFlex(builder, flexOffset)\n\tMonsterAddTest5(builder, test5Offset)\n\tMonsterAddVectorOfLongs(builder, vectorOfLongsOffset)\n\tMonsterAddVectorOfDoubles(builder, vectorOfDoublesOffset)\n\tMonsterAddParentNamespaceTest(builder, parentNamespaceTestOffset)\n\tMonsterAddVectorOfReferrables(builder, vectorOfReferrablesOffset)\n\tMonsterAddSingleWeakReference(builder, t.SingleWeakReference)\n\tMonsterAddVectorOfWeakReferences(builder, vectorOfWeakReferencesOffset)\n\tMonsterAddVectorOfStrongReferrables(builder, vectorOfStrongReferrablesOffset)\n\tMonsterAddCoOwningReference(builder, t.CoOwningReference)\n\tMonsterAddVectorOfCoOwningReferences(builder, vectorOfCoOwningReferencesOffset)\n\tMonsterAddNonOwningReference(builder, t.NonOwningReference)\n\tMonsterAddVectorOfNonOwningReferences(builder, vectorOfNonOwningReferencesOffset)\n\tif t.AnyUnique != nil {\n\t\tMonsterAddAnyUniqueType(builder, t.AnyUnique.Type)\n\t}\n\tMonsterAddAnyUnique(builder, anyUniqueOffset)\n\tif t.AnyAmbiguous != nil {\n\t\tMonsterAddAnyAmbiguousType(builder, t.AnyAmbiguous.Type)\n\t}\n\tMonsterAddAnyAmbiguous(builder, anyAmbiguousOffset)\n\tMonsterAddVectorOfEnums(builder, vectorOfEnumsOffset)\n\tMonsterAddSignedEnum(builder, t.SignedEnum)\n\tMonsterAddTestrequirednestedflatbuffer(builder, testrequirednestedflatbufferOffset)\n\tMonsterAddScalarKeySortedTables(builder, scalarKeySortedTablesOffset)\n\tnativeInlineOffset := t.NativeInline.Pack(builder)\n\tMonsterAddNativeInline(builder, nativeInlineOffset)\n\tMonsterAddLongEnumNonEnumDefault(builder, t.LongEnumNonEnumDefault)\n\tMonsterAddLongEnumNormalDefault(builder, t.LongEnumNormalDefault)\n\tMonsterAddNanDefault(builder, t.NanDefault)\n\tMonsterAddInfDefault(builder, t.InfDefault)\n\tMonsterAddPositiveInfDefault(builder, t.PositiveInfDefault)\n\tMonsterAddInfinityDefault(builder, t.InfinityDefault)\n\tMonsterAddPositiveInfinityDefault(builder, t.PositiveInfinityDefault)\n\tMonsterAddNegativeInfDefault(builder, t.NegativeInfDefault)\n\tMonsterAddNegativeInfinityDefault(builder, t.NegativeInfinityDefault)\n\tMonsterAddDoubleInfDefault(builder, t.DoubleInfDefault)\n\treturn MonsterEnd(builder)\n}\n\nfunc (rcv *Monster) UnPackTo(t *MonsterT) {\n\tt.Pos = rcv.Pos(nil).UnPack()\n\tt.Mana = rcv.Mana()\n\tt.Hp = rcv.Hp()\n\tt.Name = string(rcv.Name())\n\tt.Inventory = rcv.InventoryBytes()\n\tt.Color = rcv.Color()\n\ttestTable := flatbuffers.Table{}\n\tif rcv.Test(&testTable) {\n\t\tt.Test = rcv.TestType().UnPack(testTable)\n\t}\n\ttest4Length := rcv.Test4Length()\n\tt.Test4 = make([]*TestT, test4Length)\n\tfor j := 0; j < test4Length; j++ {\n\t\tx := Test{}\n\t\trcv.Test4(&x, j)\n\t\tt.Test4[j] = x.UnPack()\n\t}\n\ttestarrayofstringLength := rcv.TestarrayofstringLength()\n\tt.Testarrayofstring = make([]string, testarrayofstringLength)\n\tfor j := 0; j < testarrayofstringLength; j++ {\n\t\tt.Testarrayofstring[j] = string(rcv.Testarrayofstring(j))\n\t}\n\ttestarrayoftablesLength := rcv.TestarrayoftablesLength()\n\tt.Testarrayoftables = make([]*MonsterT, testarrayoftablesLength)\n\tfor j := 0; j < testarrayoftablesLength; j++ {\n\t\tx := Monster{}\n\t\trcv.Testarrayoftables(&x, j)\n\t\tt.Testarrayoftables[j] = x.UnPack()\n\t}\n\tt.Enemy = rcv.Enemy(nil).UnPack()\n\tt.Testnestedflatbuffer = rcv.TestnestedflatbufferBytes()\n\tt.Testempty = rcv.Testempty(nil).UnPack()\n\tt.Testbool = rcv.Testbool()\n\tt.Testhashs32Fnv1 = rcv.Testhashs32Fnv1()\n\tt.Testhashu32Fnv1 = rcv.Testhashu32Fnv1()\n\tt.Testhashs64Fnv1 = rcv.Testhashs64Fnv1()\n\tt.Testhashu64Fnv1 = rcv.Testhashu64Fnv1()\n\tt.Testhashs32Fnv1a = rcv.Testhashs32Fnv1a()\n\tt.Testhashu32Fnv1a = rcv.Testhashu32Fnv1a()\n\tt.Testhashs64Fnv1a = rcv.Testhashs64Fnv1a()\n\tt.Testhashu64Fnv1a = rcv.Testhashu64Fnv1a()\n\ttestarrayofboolsLength := rcv.TestarrayofboolsLength()\n\tt.Testarrayofbools = make([]bool, testarrayofboolsLength)\n\tfor j := 0; j < testarrayofboolsLength; j++ {\n\t\tt.Testarrayofbools[j] = rcv.Testarrayofbools(j)\n\t}\n\tt.Testf = rcv.Testf()\n\tt.Testf2 = rcv.Testf2()\n\tt.Testf3 = rcv.Testf3()\n\ttestarrayofstring2Length := rcv.Testarrayofstring2Length()\n\tt.Testarrayofstring2 = make([]string, testarrayofstring2Length)\n\tfor j := 0; j < testarrayofstring2Length; j++ {\n\t\tt.Testarrayofstring2[j] = string(rcv.Testarrayofstring2(j))\n\t}\n\ttestarrayofsortedstructLength := rcv.TestarrayofsortedstructLength()\n\tt.Testarrayofsortedstruct = make([]*AbilityT, testarrayofsortedstructLength)\n\tfor j := 0; j < testarrayofsortedstructLength; j++ {\n\t\tx := Ability{}\n\t\trcv.Testarrayofsortedstruct(&x, j)\n\t\tt.Testarrayofsortedstruct[j] = x.UnPack()\n\t}\n\tt.Flex = rcv.FlexBytes()\n\ttest5Length := rcv.Test5Length()\n\tt.Test5 = make([]*TestT, test5Length)\n\tfor j := 0; j < test5Length; j++ {\n\t\tx := Test{}\n\t\trcv.Test5(&x, j)\n\t\tt.Test5[j] = x.UnPack()\n\t}\n\tvectorOfLongsLength := rcv.VectorOfLongsLength()\n\tt.VectorOfLongs = make([]int64, vectorOfLongsLength)\n\tfor j := 0; j < vectorOfLongsLength; j++ {\n\t\tt.VectorOfLongs[j] = rcv.VectorOfLongs(j)\n\t}\n\tvectorOfDoublesLength := rcv.VectorOfDoublesLength()\n\tt.VectorOfDoubles = make([]float64, vectorOfDoublesLength)\n\tfor j := 0; j < vectorOfDoublesLength; j++ {\n\t\tt.VectorOfDoubles[j] = rcv.VectorOfDoubles(j)\n\t}\n\tt.ParentNamespaceTest = rcv.ParentNamespaceTest(nil).UnPack()\n\tvectorOfReferrablesLength := rcv.VectorOfReferrablesLength()\n\tt.VectorOfReferrables = make([]*ReferrableT, vectorOfReferrablesLength)\n\tfor j := 0; j < vectorOfReferrablesLength; j++ {\n\t\tx := Referrable{}\n\t\trcv.VectorOfReferrables(&x, j)\n\t\tt.VectorOfReferrables[j] = x.UnPack()\n\t}\n\tt.SingleWeakReference = rcv.SingleWeakReference()\n\tvectorOfWeakReferencesLength := rcv.VectorOfWeakReferencesLength()\n\tt.VectorOfWeakReferences = make([]uint64, vectorOfWeakReferencesLength)\n\tfor j := 0; j < vectorOfWeakReferencesLength; j++ {\n\t\tt.VectorOfWeakReferences[j] = rcv.VectorOfWeakReferences(j)\n\t}\n\tvectorOfStrongReferrablesLength := rcv.VectorOfStrongReferrablesLength()\n\tt.VectorOfStrongReferrables = make([]*ReferrableT, vectorOfStrongReferrablesLength)\n\tfor j := 0; j < vectorOfStrongReferrablesLength; j++ {\n\t\tx := Referrable{}\n\t\trcv.VectorOfStrongReferrables(&x, j)\n\t\tt.VectorOfStrongReferrables[j] = x.UnPack()\n\t}\n\tt.CoOwningReference = rcv.CoOwningReference()\n\tvectorOfCoOwningReferencesLength := rcv.VectorOfCoOwningReferencesLength()\n\tt.VectorOfCoOwningReferences = make([]uint64, vectorOfCoOwningReferencesLength)\n\tfor j := 0; j < vectorOfCoOwningReferencesLength; j++ {\n\t\tt.VectorOfCoOwningReferences[j] = rcv.VectorOfCoOwningReferences(j)\n\t}\n\tt.NonOwningReference = rcv.NonOwningReference()\n\tvectorOfNonOwningReferencesLength := rcv.VectorOfNonOwningReferencesLength()\n\tt.VectorOfNonOwningReferences = make([]uint64, vectorOfNonOwningReferencesLength)\n\tfor j := 0; j < vectorOfNonOwningReferencesLength; j++ {\n\t\tt.VectorOfNonOwningReferences[j] = rcv.VectorOfNonOwningReferences(j)\n\t}\n\tanyUniqueTable := flatbuffers.Table{}\n\tif rcv.AnyUnique(&anyUniqueTable) {\n\t\tt.AnyUnique = rcv.AnyUniqueType().UnPack(anyUniqueTable)\n\t}\n\tanyAmbiguousTable := flatbuffers.Table{}\n\tif rcv.AnyAmbiguous(&anyAmbiguousTable) {\n\t\tt.AnyAmbiguous = rcv.AnyAmbiguousType().UnPack(anyAmbiguousTable)\n\t}\n\tvectorOfEnumsLength := rcv.VectorOfEnumsLength()\n\tt.VectorOfEnums = make([]Color, vectorOfEnumsLength)\n\tfor j := 0; j < vectorOfEnumsLength; j++ {\n\t\tt.VectorOfEnums[j] = rcv.VectorOfEnums(j)\n\t}\n\tt.SignedEnum = rcv.SignedEnum()\n\tt.Testrequirednestedflatbuffer = rcv.TestrequirednestedflatbufferBytes()\n\tscalarKeySortedTablesLength := rcv.ScalarKeySortedTablesLength()\n\tt.ScalarKeySortedTables = make([]*StatT, scalarKeySortedTablesLength)\n\tfor j := 0; j < scalarKeySortedTablesLength; j++ {\n\t\tx := Stat{}\n\t\trcv.ScalarKeySortedTables(&x, j)\n\t\tt.ScalarKeySortedTables[j] = x.UnPack()\n\t}\n\tt.NativeInline = rcv.NativeInline(nil).UnPack()\n\tt.LongEnumNonEnumDefault = rcv.LongEnumNonEnumDefault()\n\tt.LongEnumNormalDefault = rcv.LongEnumNormalDefault()\n\tt.NanDefault = rcv.NanDefault()\n\tt.InfDefault = rcv.InfDefault()\n\tt.PositiveInfDefault = rcv.PositiveInfDefault()\n\tt.InfinityDefault = rcv.InfinityDefault()\n\tt.PositiveInfinityDefault = rcv.PositiveInfinityDefault()\n\tt.NegativeInfDefault = rcv.NegativeInfDefault()\n\tt.NegativeInfinityDefault = rcv.NegativeInfinityDefault()\n\tt.DoubleInfDefault = rcv.DoubleInfDefault()\n}\n\nfunc (rcv *Monster) UnPack() *MonsterT {\n\tif rcv == nil {\n\t\treturn nil\n\t}\n\tt := &MonsterT{}\n\trcv.UnPackTo(t)\n\treturn t\n}\n\ntype Monster struct {\n\t_tab flatbuffers.Table\n}\n\nconst MonsterIdentifier = \"MONS\"\n\nfunc GetRootAsMonster(buf []byte, offset flatbuffers.UOffsetT) *Monster {\n\tn := flatbuffers.GetUOffsetT(buf[offset:])\n\tx := &Monster{}\n\tx.Init(buf, n+offset)\n\treturn x\n}\n\nfunc FinishMonsterBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {\n\tidentifierBytes := []byte(MonsterIdentifier)\n\tbuilder.FinishWithFileIdentifier(offset, identifierBytes)\n}\n\nfunc MonsterBufferHasIdentifier(buf []byte) bool {\n\treturn flatbuffers.BufferHasIdentifier(buf, MonsterIdentifier)\n}\n\nfunc GetSizePrefixedRootAsMonster(buf []byte, offset flatbuffers.UOffsetT) *Monster {\n\tn := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])\n\tx := &Monster{}\n\tx.Init(buf, n+offset+flatbuffers.SizeUint32)\n\treturn x\n}\n\nfunc FinishSizePrefixedMonsterBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {\n\tidentifierBytes := []byte(MonsterIdentifier)\n\tbuilder.FinishSizePrefixedWithFileIdentifier(offset, identifierBytes)\n}\n\nfunc SizePrefixedMonsterBufferHasIdentifier(buf []byte) bool {\n\treturn flatbuffers.SizePrefixedBufferHasIdentifier(buf, MonsterIdentifier)\n}\n\nfunc (rcv *Monster) Init(buf []byte, i flatbuffers.UOffsetT) {\n\trcv._tab.Bytes = buf\n\trcv._tab.Pos = i\n}\n\nfunc (rcv *Monster) Table() flatbuffers.Table {\n\treturn rcv._tab\n}\n\nfunc (rcv *Monster) Pos(obj *Vec3) *Vec3 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(4))\n\tif o != 0 {\n\t\tx := o + rcv._tab.Pos\n\t\tif obj == nil {\n\t\t\tobj = new(Vec3)\n\t\t}\n\t\tobj.Init(rcv._tab.Bytes, x)\n\t\treturn obj\n\t}\n\treturn nil\n}\n\nfunc (rcv *Monster) Mana() int16 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(6))\n\tif o != 0 {\n\t\treturn rcv._tab.GetInt16(o + rcv._tab.Pos)\n\t}\n\treturn 150\n}\n\nfunc (rcv *Monster) MutateMana(n int16) bool {\n\treturn rcv._tab.MutateInt16Slot(6, n)\n}\n\nfunc (rcv *Monster) Hp() int16 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(8))\n\tif o != 0 {\n\t\treturn rcv._tab.GetInt16(o + rcv._tab.Pos)\n\t}\n\treturn 100\n}\n\nfunc (rcv *Monster) MutateHp(n int16) bool {\n\treturn rcv._tab.MutateInt16Slot(8, n)\n}\n\nfunc (rcv *Monster) Name() []byte {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(10))\n\tif o != 0 {\n\t\treturn rcv._tab.ByteVector(o + rcv._tab.Pos)\n\t}\n\treturn nil\n}\n\nfunc MonsterKeyCompare(o1, o2 flatbuffers.UOffsetT, buf []byte) bool {\n\tobj1 := &Monster{}\n\tobj2 := &Monster{}\n\tobj1.Init(buf, flatbuffers.UOffsetT(len(buf))-o1)\n\tobj2.Init(buf, flatbuffers.UOffsetT(len(buf))-o2)\n\treturn string(obj1.Name()) < string(obj2.Name())\n}\n\nfunc (rcv *Monster) LookupByKey(key string, vectorLocation flatbuffers.UOffsetT, buf []byte) bool {\n\tspan := flatbuffers.GetUOffsetT(buf[vectorLocation-4:])\n\tstart := flatbuffers.UOffsetT(0)\n\tbKey := []byte(key)\n\tfor span != 0 {\n\t\tmiddle := span / 2\n\t\ttableOffset := flatbuffers.GetIndirectOffset(buf, vectorLocation+4*(start+middle))\n\t\tobj := &Monster{}\n\t\tobj.Init(buf, tableOffset)\n\t\tcomp := bytes.Compare(obj.Name(), bKey)\n\t\tif comp > 0 {\n\t\t\tspan = middle\n\t\t} else if comp < 0 {\n\t\t\tmiddle += 1\n\t\t\tstart += middle\n\t\t\tspan -= middle\n\t\t} else {\n\t\t\trcv.Init(buf, tableOffset)\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (rcv *Monster) Inventory(j int) byte {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(14))\n\tif o != 0 {\n\t\ta := rcv._tab.Vector(o)\n\t\treturn rcv._tab.GetByte(a + flatbuffers.UOffsetT(j*1))\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) InventoryLength() int {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(14))\n\tif o != 0 {\n\t\treturn rcv._tab.VectorLen(o)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) InventoryBytes() []byte {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(14))\n\tif o != 0 {\n\t\treturn rcv._tab.ByteVector(o + rcv._tab.Pos)\n\t}\n\treturn nil\n}\n\nfunc (rcv *Monster) MutateInventory(j int, n byte) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(14))\n\tif o != 0 {\n\t\ta := rcv._tab.Vector(o)\n\t\treturn rcv._tab.MutateByte(a+flatbuffers.UOffsetT(j*1), n)\n\t}\n\treturn false\n}\n\nfunc (rcv *Monster) Color() Color {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(16))\n\tif o != 0 {\n\t\treturn Color(rcv._tab.GetByte(o + rcv._tab.Pos))\n\t}\n\treturn 8\n}\n\nfunc (rcv *Monster) MutateColor(n Color) bool {\n\treturn rcv._tab.MutateByteSlot(16, byte(n))\n}\n\nfunc (rcv *Monster) TestType() Any {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(18))\n\tif o != 0 {\n\t\treturn Any(rcv._tab.GetByte(o + rcv._tab.Pos))\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) MutateTestType(n Any) bool {\n\treturn rcv._tab.MutateByteSlot(18, byte(n))\n}\n\nfunc (rcv *Monster) Test(obj *flatbuffers.Table) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(20))\n\tif o != 0 {\n\t\trcv._tab.Union(obj, o)\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (rcv *Monster) Test4(obj *Test, j int) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(22))\n\tif o != 0 {\n\t\tx := rcv._tab.Vector(o)\n\t\tx += flatbuffers.UOffsetT(j) * 4\n\t\tobj.Init(rcv._tab.Bytes, x)\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (rcv *Monster) Test4Length() int {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(22))\n\tif o != 0 {\n\t\treturn rcv._tab.VectorLen(o)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) Testarrayofstring(j int) []byte {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(24))\n\tif o != 0 {\n\t\ta := rcv._tab.Vector(o)\n\t\treturn rcv._tab.ByteVector(a + flatbuffers.UOffsetT(j*4))\n\t}\n\treturn nil\n}\n\nfunc (rcv *Monster) TestarrayofstringLength() int {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(24))\n\tif o != 0 {\n\t\treturn rcv._tab.VectorLen(o)\n\t}\n\treturn 0\n}\n\n/// an example documentation comment: this will end up in the generated code\n/// multiline too\nfunc (rcv *Monster) Testarrayoftables(obj *Monster, j int) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(26))\n\tif o != 0 {\n\t\tx := rcv._tab.Vector(o)\n\t\tx += flatbuffers.UOffsetT(j) * 4\n\t\tx = rcv._tab.Indirect(x)\n\t\tobj.Init(rcv._tab.Bytes, x)\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (rcv *Monster) TestarrayoftablesByKey(obj *Monster, key string) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(26))\n\tif o != 0 {\n\t\tx := rcv._tab.Vector(o)\n\t\treturn obj.LookupByKey(key, x, rcv._tab.Bytes)\n\t}\n\treturn false\n}\n\nfunc (rcv *Monster) TestarrayoftablesLength() int {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(26))\n\tif o != 0 {\n\t\treturn rcv._tab.VectorLen(o)\n\t}\n\treturn 0\n}\n\n/// an example documentation comment: this will end up in the generated code\n/// multiline too\nfunc (rcv *Monster) Enemy(obj *Monster) *Monster {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(28))\n\tif o != 0 {\n\t\tx := rcv._tab.Indirect(o + rcv._tab.Pos)\n\t\tif obj == nil {\n\t\t\tobj = new(Monster)\n\t\t}\n\t\tobj.Init(rcv._tab.Bytes, x)\n\t\treturn obj\n\t}\n\treturn nil\n}\n\nfunc (rcv *Monster) Testnestedflatbuffer(j int) byte {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(30))\n\tif o != 0 {\n\t\ta := rcv._tab.Vector(o)\n\t\treturn rcv._tab.GetByte(a + flatbuffers.UOffsetT(j*1))\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) TestnestedflatbufferLength() int {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(30))\n\tif o != 0 {\n\t\treturn rcv._tab.VectorLen(o)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) TestnestedflatbufferBytes() []byte {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(30))\n\tif o != 0 {\n\t\treturn rcv._tab.ByteVector(o + rcv._tab.Pos)\n\t}\n\treturn nil\n}\n\nfunc (rcv *Monster) MutateTestnestedflatbuffer(j int, n byte) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(30))\n\tif o != 0 {\n\t\ta := rcv._tab.Vector(o)\n\t\treturn rcv._tab.MutateByte(a+flatbuffers.UOffsetT(j*1), n)\n\t}\n\treturn false\n}\n\nfunc (rcv *Monster) Testempty(obj *Stat) *Stat {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(32))\n\tif o != 0 {\n\t\tx := rcv._tab.Indirect(o + rcv._tab.Pos)\n\t\tif obj == nil {\n\t\t\tobj = new(Stat)\n\t\t}\n\t\tobj.Init(rcv._tab.Bytes, x)\n\t\treturn obj\n\t}\n\treturn nil\n}\n\nfunc (rcv *Monster) Testbool() bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(34))\n\tif o != 0 {\n\t\treturn rcv._tab.GetBool(o + rcv._tab.Pos)\n\t}\n\treturn false\n}\n\nfunc (rcv *Monster) MutateTestbool(n bool) bool {\n\treturn rcv._tab.MutateBoolSlot(34, n)\n}\n\nfunc (rcv *Monster) Testhashs32Fnv1() int32 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(36))\n\tif o != 0 {\n\t\treturn rcv._tab.GetInt32(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) MutateTesthashs32Fnv1(n int32) bool {\n\treturn rcv._tab.MutateInt32Slot(36, n)\n}\n\nfunc (rcv *Monster) Testhashu32Fnv1() uint32 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(38))\n\tif o != 0 {\n\t\treturn rcv._tab.GetUint32(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) MutateTesthashu32Fnv1(n uint32) bool {\n\treturn rcv._tab.MutateUint32Slot(38, n)\n}\n\nfunc (rcv *Monster) Testhashs64Fnv1() int64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(40))\n\tif o != 0 {\n\t\treturn rcv._tab.GetInt64(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) MutateTesthashs64Fnv1(n int64) bool {\n\treturn rcv._tab.MutateInt64Slot(40, n)\n}\n\nfunc (rcv *Monster) Testhashu64Fnv1() uint64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(42))\n\tif o != 0 {\n\t\treturn rcv._tab.GetUint64(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) MutateTesthashu64Fnv1(n uint64) bool {\n\treturn rcv._tab.MutateUint64Slot(42, n)\n}\n\nfunc (rcv *Monster) Testhashs32Fnv1a() int32 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(44))\n\tif o != 0 {\n\t\treturn rcv._tab.GetInt32(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) MutateTesthashs32Fnv1a(n int32) bool {\n\treturn rcv._tab.MutateInt32Slot(44, n)\n}\n\nfunc (rcv *Monster) Testhashu32Fnv1a() uint32 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(46))\n\tif o != 0 {\n\t\treturn rcv._tab.GetUint32(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) MutateTesthashu32Fnv1a(n uint32) bool {\n\treturn rcv._tab.MutateUint32Slot(46, n)\n}\n\nfunc (rcv *Monster) Testhashs64Fnv1a() int64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(48))\n\tif o != 0 {\n\t\treturn rcv._tab.GetInt64(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) MutateTesthashs64Fnv1a(n int64) bool {\n\treturn rcv._tab.MutateInt64Slot(48, n)\n}\n\nfunc (rcv *Monster) Testhashu64Fnv1a() uint64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(50))\n\tif o != 0 {\n\t\treturn rcv._tab.GetUint64(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) MutateTesthashu64Fnv1a(n uint64) bool {\n\treturn rcv._tab.MutateUint64Slot(50, n)\n}\n\nfunc (rcv *Monster) Testarrayofbools(j int) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(52))\n\tif o != 0 {\n\t\ta := rcv._tab.Vector(o)\n\t\treturn rcv._tab.GetBool(a + flatbuffers.UOffsetT(j*1))\n\t}\n\treturn false\n}\n\nfunc (rcv *Monster) TestarrayofboolsLength() int {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(52))\n\tif o != 0 {\n\t\treturn rcv._tab.VectorLen(o)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) MutateTestarrayofbools(j int, n bool) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(52))\n\tif o != 0 {\n\t\ta := rcv._tab.Vector(o)\n\t\treturn rcv._tab.MutateBool(a+flatbuffers.UOffsetT(j*1), n)\n\t}\n\treturn false\n}\n\nfunc (rcv *Monster) Testf() float32 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(54))\n\tif o != 0 {\n\t\treturn rcv._tab.GetFloat32(o + rcv._tab.Pos)\n\t}\n\treturn 3.14159\n}\n\nfunc (rcv *Monster) MutateTestf(n float32) bool {\n\treturn rcv._tab.MutateFloat32Slot(54, n)\n}\n\nfunc (rcv *Monster) Testf2() float32 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(56))\n\tif o != 0 {\n\t\treturn rcv._tab.GetFloat32(o + rcv._tab.Pos)\n\t}\n\treturn 3.0\n}\n\nfunc (rcv *Monster) MutateTestf2(n float32) bool {\n\treturn rcv._tab.MutateFloat32Slot(56, n)\n}\n\nfunc (rcv *Monster) Testf3() float32 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(58))\n\tif o != 0 {\n\t\treturn rcv._tab.GetFloat32(o + rcv._tab.Pos)\n\t}\n\treturn 0.0\n}\n\nfunc (rcv *Monster) MutateTestf3(n float32) bool {\n\treturn rcv._tab.MutateFloat32Slot(58, n)\n}\n\nfunc (rcv *Monster) Testarrayofstring2(j int) []byte {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(60))\n\tif o != 0 {\n\t\ta := rcv._tab.Vector(o)\n\t\treturn rcv._tab.ByteVector(a + flatbuffers.UOffsetT(j*4))\n\t}\n\treturn nil\n}\n\nfunc (rcv *Monster) Testarrayofstring2Length() int {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(60))\n\tif o != 0 {\n\t\treturn rcv._tab.VectorLen(o)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) Testarrayofsortedstruct(obj *Ability, j int) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(62))\n\tif o != 0 {\n\t\tx := rcv._tab.Vector(o)\n\t\tx += flatbuffers.UOffsetT(j) * 8\n\t\tobj.Init(rcv._tab.Bytes, x)\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (rcv *Monster) TestarrayofsortedstructLength() int {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(62))\n\tif o != 0 {\n\t\treturn rcv._tab.VectorLen(o)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) Flex(j int) byte {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(64))\n\tif o != 0 {\n\t\ta := rcv._tab.Vector(o)\n\t\treturn rcv._tab.GetByte(a + flatbuffers.UOffsetT(j*1))\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) FlexLength() int {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(64))\n\tif o != 0 {\n\t\treturn rcv._tab.VectorLen(o)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) FlexBytes() []byte {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(64))\n\tif o != 0 {\n\t\treturn rcv._tab.ByteVector(o + rcv._tab.Pos)\n\t}\n\treturn nil\n}\n\nfunc (rcv *Monster) MutateFlex(j int, n byte) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(64))\n\tif o != 0 {\n\t\ta := rcv._tab.Vector(o)\n\t\treturn rcv._tab.MutateByte(a+flatbuffers.UOffsetT(j*1), n)\n\t}\n\treturn false\n}\n\nfunc (rcv *Monster) Test5(obj *Test, j int) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(66))\n\tif o != 0 {\n\t\tx := rcv._tab.Vector(o)\n\t\tx += flatbuffers.UOffsetT(j) * 4\n\t\tobj.Init(rcv._tab.Bytes, x)\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (rcv *Monster) Test5Length() int {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(66))\n\tif o != 0 {\n\t\treturn rcv._tab.VectorLen(o)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) VectorOfLongs(j int) int64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(68))\n\tif o != 0 {\n\t\ta := rcv._tab.Vector(o)\n\t\treturn rcv._tab.GetInt64(a + flatbuffers.UOffsetT(j*8))\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) VectorOfLongsLength() int {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(68))\n\tif o != 0 {\n\t\treturn rcv._tab.VectorLen(o)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) MutateVectorOfLongs(j int, n int64) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(68))\n\tif o != 0 {\n\t\ta := rcv._tab.Vector(o)\n\t\treturn rcv._tab.MutateInt64(a+flatbuffers.UOffsetT(j*8), n)\n\t}\n\treturn false\n}\n\nfunc (rcv *Monster) VectorOfDoubles(j int) float64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(70))\n\tif o != 0 {\n\t\ta := rcv._tab.Vector(o)\n\t\treturn rcv._tab.GetFloat64(a + flatbuffers.UOffsetT(j*8))\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) VectorOfDoublesLength() int {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(70))\n\tif o != 0 {\n\t\treturn rcv._tab.VectorLen(o)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) MutateVectorOfDoubles(j int, n float64) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(70))\n\tif o != 0 {\n\t\ta := rcv._tab.Vector(o)\n\t\treturn rcv._tab.MutateFloat64(a+flatbuffers.UOffsetT(j*8), n)\n\t}\n\treturn false\n}\n\nfunc (rcv *Monster) ParentNamespaceTest(obj *MyGame.InParentNamespace) *MyGame.InParentNamespace {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(72))\n\tif o != 0 {\n\t\tx := rcv._tab.Indirect(o + rcv._tab.Pos)\n\t\tif obj == nil {\n\t\t\tobj = new(MyGame.InParentNamespace)\n\t\t}\n\t\tobj.Init(rcv._tab.Bytes, x)\n\t\treturn obj\n\t}\n\treturn nil\n}\n\nfunc (rcv *Monster) VectorOfReferrables(obj *Referrable, j int) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(74))\n\tif o != 0 {\n\t\tx := rcv._tab.Vector(o)\n\t\tx += flatbuffers.UOffsetT(j) * 4\n\t\tx = rcv._tab.Indirect(x)\n\t\tobj.Init(rcv._tab.Bytes, x)\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (rcv *Monster) VectorOfReferrablesByKey(obj *Referrable, key uint64) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(74))\n\tif o != 0 {\n\t\tx := rcv._tab.Vector(o)\n\t\treturn obj.LookupByKey(key, x, rcv._tab.Bytes)\n\t}\n\treturn false\n}\n\nfunc (rcv *Monster) VectorOfReferrablesLength() int {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(74))\n\tif o != 0 {\n\t\treturn rcv._tab.VectorLen(o)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) SingleWeakReference() uint64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(76))\n\tif o != 0 {\n\t\treturn rcv._tab.GetUint64(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) MutateSingleWeakReference(n uint64) bool {\n\treturn rcv._tab.MutateUint64Slot(76, n)\n}\n\nfunc (rcv *Monster) VectorOfWeakReferences(j int) uint64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(78))\n\tif o != 0 {\n\t\ta := rcv._tab.Vector(o)\n\t\treturn rcv._tab.GetUint64(a + flatbuffers.UOffsetT(j*8))\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) VectorOfWeakReferencesLength() int {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(78))\n\tif o != 0 {\n\t\treturn rcv._tab.VectorLen(o)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) MutateVectorOfWeakReferences(j int, n uint64) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(78))\n\tif o != 0 {\n\t\ta := rcv._tab.Vector(o)\n\t\treturn rcv._tab.MutateUint64(a+flatbuffers.UOffsetT(j*8), n)\n\t}\n\treturn false\n}\n\nfunc (rcv *Monster) VectorOfStrongReferrables(obj *Referrable, j int) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(80))\n\tif o != 0 {\n\t\tx := rcv._tab.Vector(o)\n\t\tx += flatbuffers.UOffsetT(j) * 4\n\t\tx = rcv._tab.Indirect(x)\n\t\tobj.Init(rcv._tab.Bytes, x)\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (rcv *Monster) VectorOfStrongReferrablesByKey(obj *Referrable, key uint64) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(80))\n\tif o != 0 {\n\t\tx := rcv._tab.Vector(o)\n\t\treturn obj.LookupByKey(key, x, rcv._tab.Bytes)\n\t}\n\treturn false\n}\n\nfunc (rcv *Monster) VectorOfStrongReferrablesLength() int {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(80))\n\tif o != 0 {\n\t\treturn rcv._tab.VectorLen(o)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) CoOwningReference() uint64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(82))\n\tif o != 0 {\n\t\treturn rcv._tab.GetUint64(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) MutateCoOwningReference(n uint64) bool {\n\treturn rcv._tab.MutateUint64Slot(82, n)\n}\n\nfunc (rcv *Monster) VectorOfCoOwningReferences(j int) uint64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(84))\n\tif o != 0 {\n\t\ta := rcv._tab.Vector(o)\n\t\treturn rcv._tab.GetUint64(a + flatbuffers.UOffsetT(j*8))\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) VectorOfCoOwningReferencesLength() int {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(84))\n\tif o != 0 {\n\t\treturn rcv._tab.VectorLen(o)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) MutateVectorOfCoOwningReferences(j int, n uint64) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(84))\n\tif o != 0 {\n\t\ta := rcv._tab.Vector(o)\n\t\treturn rcv._tab.MutateUint64(a+flatbuffers.UOffsetT(j*8), n)\n\t}\n\treturn false\n}\n\nfunc (rcv *Monster) NonOwningReference() uint64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(86))\n\tif o != 0 {\n\t\treturn rcv._tab.GetUint64(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) MutateNonOwningReference(n uint64) bool {\n\treturn rcv._tab.MutateUint64Slot(86, n)\n}\n\nfunc (rcv *Monster) VectorOfNonOwningReferences(j int) uint64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(88))\n\tif o != 0 {\n\t\ta := rcv._tab.Vector(o)\n\t\treturn rcv._tab.GetUint64(a + flatbuffers.UOffsetT(j*8))\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) VectorOfNonOwningReferencesLength() int {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(88))\n\tif o != 0 {\n\t\treturn rcv._tab.VectorLen(o)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) MutateVectorOfNonOwningReferences(j int, n uint64) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(88))\n\tif o != 0 {\n\t\ta := rcv._tab.Vector(o)\n\t\treturn rcv._tab.MutateUint64(a+flatbuffers.UOffsetT(j*8), n)\n\t}\n\treturn false\n}\n\nfunc (rcv *Monster) AnyUniqueType() AnyUniqueAliases {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(90))\n\tif o != 0 {\n\t\treturn AnyUniqueAliases(rcv._tab.GetByte(o + rcv._tab.Pos))\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) MutateAnyUniqueType(n AnyUniqueAliases) bool {\n\treturn rcv._tab.MutateByteSlot(90, byte(n))\n}\n\nfunc (rcv *Monster) AnyUnique(obj *flatbuffers.Table) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(92))\n\tif o != 0 {\n\t\trcv._tab.Union(obj, o)\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (rcv *Monster) AnyAmbiguousType() AnyAmbiguousAliases {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(94))\n\tif o != 0 {\n\t\treturn AnyAmbiguousAliases(rcv._tab.GetByte(o + rcv._tab.Pos))\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) MutateAnyAmbiguousType(n AnyAmbiguousAliases) bool {\n\treturn rcv._tab.MutateByteSlot(94, byte(n))\n}\n\nfunc (rcv *Monster) AnyAmbiguous(obj *flatbuffers.Table) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(96))\n\tif o != 0 {\n\t\trcv._tab.Union(obj, o)\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (rcv *Monster) VectorOfEnums(j int) Color {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(98))\n\tif o != 0 {\n\t\ta := rcv._tab.Vector(o)\n\t\treturn Color(rcv._tab.GetByte(a + flatbuffers.UOffsetT(j*1)))\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) VectorOfEnumsLength() int {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(98))\n\tif o != 0 {\n\t\treturn rcv._tab.VectorLen(o)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) VectorOfEnumsBytes() []byte {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(98))\n\tif o != 0 {\n\t\treturn rcv._tab.ByteVector(o + rcv._tab.Pos)\n\t}\n\treturn nil\n}\n\nfunc (rcv *Monster) MutateVectorOfEnums(j int, n Color) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(98))\n\tif o != 0 {\n\t\ta := rcv._tab.Vector(o)\n\t\treturn rcv._tab.MutateByte(a+flatbuffers.UOffsetT(j*1), byte(n))\n\t}\n\treturn false\n}\n\nfunc (rcv *Monster) SignedEnum() Race {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(100))\n\tif o != 0 {\n\t\treturn Race(rcv._tab.GetInt8(o + rcv._tab.Pos))\n\t}\n\treturn -1\n}\n\nfunc (rcv *Monster) MutateSignedEnum(n Race) bool {\n\treturn rcv._tab.MutateInt8Slot(100, int8(n))\n}\n\nfunc (rcv *Monster) Testrequirednestedflatbuffer(j int) byte {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(102))\n\tif o != 0 {\n\t\ta := rcv._tab.Vector(o)\n\t\treturn rcv._tab.GetByte(a + flatbuffers.UOffsetT(j*1))\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) TestrequirednestedflatbufferLength() int {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(102))\n\tif o != 0 {\n\t\treturn rcv._tab.VectorLen(o)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) TestrequirednestedflatbufferBytes() []byte {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(102))\n\tif o != 0 {\n\t\treturn rcv._tab.ByteVector(o + rcv._tab.Pos)\n\t}\n\treturn nil\n}\n\nfunc (rcv *Monster) MutateTestrequirednestedflatbuffer(j int, n byte) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(102))\n\tif o != 0 {\n\t\ta := rcv._tab.Vector(o)\n\t\treturn rcv._tab.MutateByte(a+flatbuffers.UOffsetT(j*1), n)\n\t}\n\treturn false\n}\n\nfunc (rcv *Monster) ScalarKeySortedTables(obj *Stat, j int) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(104))\n\tif o != 0 {\n\t\tx := rcv._tab.Vector(o)\n\t\tx += flatbuffers.UOffsetT(j) * 4\n\t\tx = rcv._tab.Indirect(x)\n\t\tobj.Init(rcv._tab.Bytes, x)\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (rcv *Monster) ScalarKeySortedTablesByKey(obj *Stat, key uint16) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(104))\n\tif o != 0 {\n\t\tx := rcv._tab.Vector(o)\n\t\treturn obj.LookupByKey(key, x, rcv._tab.Bytes)\n\t}\n\treturn false\n}\n\nfunc (rcv *Monster) ScalarKeySortedTablesLength() int {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(104))\n\tif o != 0 {\n\t\treturn rcv._tab.VectorLen(o)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) NativeInline(obj *Test) *Test {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(106))\n\tif o != 0 {\n\t\tx := o + rcv._tab.Pos\n\t\tif obj == nil {\n\t\t\tobj = new(Test)\n\t\t}\n\t\tobj.Init(rcv._tab.Bytes, x)\n\t\treturn obj\n\t}\n\treturn nil\n}\n\nfunc (rcv *Monster) LongEnumNonEnumDefault() LongEnum {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(108))\n\tif o != 0 {\n\t\treturn LongEnum(rcv._tab.GetUint64(o + rcv._tab.Pos))\n\t}\n\treturn 0\n}\n\nfunc (rcv *Monster) MutateLongEnumNonEnumDefault(n LongEnum) bool {\n\treturn rcv._tab.MutateUint64Slot(108, uint64(n))\n}\n\nfunc (rcv *Monster) LongEnumNormalDefault() LongEnum {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(110))\n\tif o != 0 {\n\t\treturn LongEnum(rcv._tab.GetUint64(o + rcv._tab.Pos))\n\t}\n\treturn 2\n}\n\nfunc (rcv *Monster) MutateLongEnumNormalDefault(n LongEnum) bool {\n\treturn rcv._tab.MutateUint64Slot(110, uint64(n))\n}\n\nfunc (rcv *Monster) NanDefault() float32 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(112))\n\tif o != 0 {\n\t\treturn rcv._tab.GetFloat32(o + rcv._tab.Pos)\n\t}\n\treturn float32(math.NaN())\n}\n\nfunc (rcv *Monster) MutateNanDefault(n float32) bool {\n\treturn rcv._tab.MutateFloat32Slot(112, n)\n}\n\nfunc (rcv *Monster) InfDefault() float32 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(114))\n\tif o != 0 {\n\t\treturn rcv._tab.GetFloat32(o + rcv._tab.Pos)\n\t}\n\treturn float32(math.Inf(1))\n}\n\nfunc (rcv *Monster) MutateInfDefault(n float32) bool {\n\treturn rcv._tab.MutateFloat32Slot(114, n)\n}\n\nfunc (rcv *Monster) PositiveInfDefault() float32 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(116))\n\tif o != 0 {\n\t\treturn rcv._tab.GetFloat32(o + rcv._tab.Pos)\n\t}\n\treturn float32(math.Inf(1))\n}\n\nfunc (rcv *Monster) MutatePositiveInfDefault(n float32) bool {\n\treturn rcv._tab.MutateFloat32Slot(116, n)\n}\n\nfunc (rcv *Monster) InfinityDefault() float32 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(118))\n\tif o != 0 {\n\t\treturn rcv._tab.GetFloat32(o + rcv._tab.Pos)\n\t}\n\treturn float32(math.Inf(1))\n}\n\nfunc (rcv *Monster) MutateInfinityDefault(n float32) bool {\n\treturn rcv._tab.MutateFloat32Slot(118, n)\n}\n\nfunc (rcv *Monster) PositiveInfinityDefault() float32 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(120))\n\tif o != 0 {\n\t\treturn rcv._tab.GetFloat32(o + rcv._tab.Pos)\n\t}\n\treturn float32(math.Inf(1))\n}\n\nfunc (rcv *Monster) MutatePositiveInfinityDefault(n float32) bool {\n\treturn rcv._tab.MutateFloat32Slot(120, n)\n}\n\nfunc (rcv *Monster) NegativeInfDefault() float32 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(122))\n\tif o != 0 {\n\t\treturn rcv._tab.GetFloat32(o + rcv._tab.Pos)\n\t}\n\treturn float32(math.Inf(-1))\n}\n\nfunc (rcv *Monster) MutateNegativeInfDefault(n float32) bool {\n\treturn rcv._tab.MutateFloat32Slot(122, n)\n}\n\nfunc (rcv *Monster) NegativeInfinityDefault() float32 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(124))\n\tif o != 0 {\n\t\treturn rcv._tab.GetFloat32(o + rcv._tab.Pos)\n\t}\n\treturn float32(math.Inf(-1))\n}\n\nfunc (rcv *Monster) MutateNegativeInfinityDefault(n float32) bool {\n\treturn rcv._tab.MutateFloat32Slot(124, n)\n}\n\nfunc (rcv *Monster) DoubleInfDefault() float64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(126))\n\tif o != 0 {\n\t\treturn rcv._tab.GetFloat64(o + rcv._tab.Pos)\n\t}\n\treturn float64(math.Inf(1))\n}\n\nfunc (rcv *Monster) MutateDoubleInfDefault(n float64) bool {\n\treturn rcv._tab.MutateFloat64Slot(126, n)\n}\n\nfunc MonsterStart(builder *flatbuffers.Builder) {\n\tbuilder.StartObject(62)\n}\nfunc MonsterAddPos(builder *flatbuffers.Builder, pos flatbuffers.UOffsetT) {\n\tbuilder.PrependStructSlot(0, flatbuffers.UOffsetT(pos), 0)\n}\nfunc MonsterAddMana(builder *flatbuffers.Builder, mana int16) {\n\tbuilder.PrependInt16Slot(1, mana, 150)\n}\nfunc MonsterAddHp(builder *flatbuffers.Builder, hp int16) {\n\tbuilder.PrependInt16Slot(2, hp, 100)\n}\nfunc MonsterAddName(builder *flatbuffers.Builder, name flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(3, flatbuffers.UOffsetT(name), 0)\n}\nfunc MonsterAddInventory(builder *flatbuffers.Builder, inventory flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(5, flatbuffers.UOffsetT(inventory), 0)\n}\nfunc MonsterStartInventoryVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {\n\treturn builder.StartVector(1, numElems, 1)\n}\nfunc MonsterAddColor(builder *flatbuffers.Builder, color Color) {\n\tbuilder.PrependByteSlot(6, byte(color), 8)\n}\nfunc MonsterAddTestType(builder *flatbuffers.Builder, testType Any) {\n\tbuilder.PrependByteSlot(7, byte(testType), 0)\n}\nfunc MonsterAddTest(builder *flatbuffers.Builder, test flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(8, flatbuffers.UOffsetT(test), 0)\n}\nfunc MonsterAddTest4(builder *flatbuffers.Builder, test4 flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(9, flatbuffers.UOffsetT(test4), 0)\n}\nfunc MonsterStartTest4Vector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {\n\treturn builder.StartVector(4, numElems, 2)\n}\nfunc MonsterAddTestarrayofstring(builder *flatbuffers.Builder, testarrayofstring flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(10, flatbuffers.UOffsetT(testarrayofstring), 0)\n}\nfunc MonsterStartTestarrayofstringVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {\n\treturn builder.StartVector(4, numElems, 4)\n}\nfunc MonsterAddTestarrayoftables(builder *flatbuffers.Builder, testarrayoftables flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(11, flatbuffers.UOffsetT(testarrayoftables), 0)\n}\nfunc MonsterStartTestarrayoftablesVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {\n\treturn builder.StartVector(4, numElems, 4)\n}\nfunc MonsterAddEnemy(builder *flatbuffers.Builder, enemy flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(12, flatbuffers.UOffsetT(enemy), 0)\n}\nfunc MonsterAddTestnestedflatbuffer(builder *flatbuffers.Builder, testnestedflatbuffer flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(13, flatbuffers.UOffsetT(testnestedflatbuffer), 0)\n}\nfunc MonsterStartTestnestedflatbufferVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {\n\treturn builder.StartVector(1, numElems, 1)\n}\nfunc MonsterAddTestempty(builder *flatbuffers.Builder, testempty flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(14, flatbuffers.UOffsetT(testempty), 0)\n}\nfunc MonsterAddTestbool(builder *flatbuffers.Builder, testbool bool) {\n\tbuilder.PrependBoolSlot(15, testbool, false)\n}\nfunc MonsterAddTesthashs32Fnv1(builder *flatbuffers.Builder, testhashs32Fnv1 int32) {\n\tbuilder.PrependInt32Slot(16, testhashs32Fnv1, 0)\n}\nfunc MonsterAddTesthashu32Fnv1(builder *flatbuffers.Builder, testhashu32Fnv1 uint32) {\n\tbuilder.PrependUint32Slot(17, testhashu32Fnv1, 0)\n}\nfunc MonsterAddTesthashs64Fnv1(builder *flatbuffers.Builder, testhashs64Fnv1 int64) {\n\tbuilder.PrependInt64Slot(18, testhashs64Fnv1, 0)\n}\nfunc MonsterAddTesthashu64Fnv1(builder *flatbuffers.Builder, testhashu64Fnv1 uint64) {\n\tbuilder.PrependUint64Slot(19, testhashu64Fnv1, 0)\n}\nfunc MonsterAddTesthashs32Fnv1a(builder *flatbuffers.Builder, testhashs32Fnv1a int32) {\n\tbuilder.PrependInt32Slot(20, testhashs32Fnv1a, 0)\n}\nfunc MonsterAddTesthashu32Fnv1a(builder *flatbuffers.Builder, testhashu32Fnv1a uint32) {\n\tbuilder.PrependUint32Slot(21, testhashu32Fnv1a, 0)\n}\nfunc MonsterAddTesthashs64Fnv1a(builder *flatbuffers.Builder, testhashs64Fnv1a int64) {\n\tbuilder.PrependInt64Slot(22, testhashs64Fnv1a, 0)\n}\nfunc MonsterAddTesthashu64Fnv1a(builder *flatbuffers.Builder, testhashu64Fnv1a uint64) {\n\tbuilder.PrependUint64Slot(23, testhashu64Fnv1a, 0)\n}\nfunc MonsterAddTestarrayofbools(builder *flatbuffers.Builder, testarrayofbools flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(24, flatbuffers.UOffsetT(testarrayofbools), 0)\n}\nfunc MonsterStartTestarrayofboolsVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {\n\treturn builder.StartVector(1, numElems, 1)\n}\nfunc MonsterAddTestf(builder *flatbuffers.Builder, testf float32) {\n\tbuilder.PrependFloat32Slot(25, testf, 3.14159)\n}\nfunc MonsterAddTestf2(builder *flatbuffers.Builder, testf2 float32) {\n\tbuilder.PrependFloat32Slot(26, testf2, 3.0)\n}\nfunc MonsterAddTestf3(builder *flatbuffers.Builder, testf3 float32) {\n\tbuilder.PrependFloat32Slot(27, testf3, 0.0)\n}\nfunc MonsterAddTestarrayofstring2(builder *flatbuffers.Builder, testarrayofstring2 flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(28, flatbuffers.UOffsetT(testarrayofstring2), 0)\n}\nfunc MonsterStartTestarrayofstring2Vector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {\n\treturn builder.StartVector(4, numElems, 4)\n}\nfunc MonsterAddTestarrayofsortedstruct(builder *flatbuffers.Builder, testarrayofsortedstruct flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(29, flatbuffers.UOffsetT(testarrayofsortedstruct), 0)\n}\nfunc MonsterStartTestarrayofsortedstructVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {\n\treturn builder.StartVector(8, numElems, 4)\n}\nfunc MonsterAddFlex(builder *flatbuffers.Builder, flex flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(30, flatbuffers.UOffsetT(flex), 0)\n}\nfunc MonsterStartFlexVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {\n\treturn builder.StartVector(1, numElems, 1)\n}\nfunc MonsterAddTest5(builder *flatbuffers.Builder, test5 flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(31, flatbuffers.UOffsetT(test5), 0)\n}\nfunc MonsterStartTest5Vector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {\n\treturn builder.StartVector(4, numElems, 2)\n}\nfunc MonsterAddVectorOfLongs(builder *flatbuffers.Builder, vectorOfLongs flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(32, flatbuffers.UOffsetT(vectorOfLongs), 0)\n}\nfunc MonsterStartVectorOfLongsVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {\n\treturn builder.StartVector(8, numElems, 8)\n}\nfunc MonsterAddVectorOfDoubles(builder *flatbuffers.Builder, vectorOfDoubles flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(33, flatbuffers.UOffsetT(vectorOfDoubles), 0)\n}\nfunc MonsterStartVectorOfDoublesVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {\n\treturn builder.StartVector(8, numElems, 8)\n}\nfunc MonsterAddParentNamespaceTest(builder *flatbuffers.Builder, parentNamespaceTest flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(34, flatbuffers.UOffsetT(parentNamespaceTest), 0)\n}\nfunc MonsterAddVectorOfReferrables(builder *flatbuffers.Builder, vectorOfReferrables flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(35, flatbuffers.UOffsetT(vectorOfReferrables), 0)\n}\nfunc MonsterStartVectorOfReferrablesVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {\n\treturn builder.StartVector(4, numElems, 4)\n}\nfunc MonsterAddSingleWeakReference(builder *flatbuffers.Builder, singleWeakReference uint64) {\n\tbuilder.PrependUint64Slot(36, singleWeakReference, 0)\n}\nfunc MonsterAddVectorOfWeakReferences(builder *flatbuffers.Builder, vectorOfWeakReferences flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(37, flatbuffers.UOffsetT(vectorOfWeakReferences), 0)\n}\nfunc MonsterStartVectorOfWeakReferencesVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {\n\treturn builder.StartVector(8, numElems, 8)\n}\nfunc MonsterAddVectorOfStrongReferrables(builder *flatbuffers.Builder, vectorOfStrongReferrables flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(38, flatbuffers.UOffsetT(vectorOfStrongReferrables), 0)\n}\nfunc MonsterStartVectorOfStrongReferrablesVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {\n\treturn builder.StartVector(4, numElems, 4)\n}\nfunc MonsterAddCoOwningReference(builder *flatbuffers.Builder, coOwningReference uint64) {\n\tbuilder.PrependUint64Slot(39, coOwningReference, 0)\n}\nfunc MonsterAddVectorOfCoOwningReferences(builder *flatbuffers.Builder, vectorOfCoOwningReferences flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(40, flatbuffers.UOffsetT(vectorOfCoOwningReferences), 0)\n}\nfunc MonsterStartVectorOfCoOwningReferencesVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {\n\treturn builder.StartVector(8, numElems, 8)\n}\nfunc MonsterAddNonOwningReference(builder *flatbuffers.Builder, nonOwningReference uint64) {\n\tbuilder.PrependUint64Slot(41, nonOwningReference, 0)\n}\nfunc MonsterAddVectorOfNonOwningReferences(builder *flatbuffers.Builder, vectorOfNonOwningReferences flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(42, flatbuffers.UOffsetT(vectorOfNonOwningReferences), 0)\n}\nfunc MonsterStartVectorOfNonOwningReferencesVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {\n\treturn builder.StartVector(8, numElems, 8)\n}\nfunc MonsterAddAnyUniqueType(builder *flatbuffers.Builder, anyUniqueType AnyUniqueAliases) {\n\tbuilder.PrependByteSlot(43, byte(anyUniqueType), 0)\n}\nfunc MonsterAddAnyUnique(builder *flatbuffers.Builder, anyUnique flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(44, flatbuffers.UOffsetT(anyUnique), 0)\n}\nfunc MonsterAddAnyAmbiguousType(builder *flatbuffers.Builder, anyAmbiguousType AnyAmbiguousAliases) {\n\tbuilder.PrependByteSlot(45, byte(anyAmbiguousType), 0)\n}\nfunc MonsterAddAnyAmbiguous(builder *flatbuffers.Builder, anyAmbiguous flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(46, flatbuffers.UOffsetT(anyAmbiguous), 0)\n}\nfunc MonsterAddVectorOfEnums(builder *flatbuffers.Builder, vectorOfEnums flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(47, flatbuffers.UOffsetT(vectorOfEnums), 0)\n}\nfunc MonsterStartVectorOfEnumsVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {\n\treturn builder.StartVector(1, numElems, 1)\n}\nfunc MonsterAddSignedEnum(builder *flatbuffers.Builder, signedEnum Race) {\n\tbuilder.PrependInt8Slot(48, int8(signedEnum), -1)\n}\nfunc MonsterAddTestrequirednestedflatbuffer(builder *flatbuffers.Builder, testrequirednestedflatbuffer flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(49, flatbuffers.UOffsetT(testrequirednestedflatbuffer), 0)\n}\nfunc MonsterStartTestrequirednestedflatbufferVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {\n\treturn builder.StartVector(1, numElems, 1)\n}\nfunc MonsterAddScalarKeySortedTables(builder *flatbuffers.Builder, scalarKeySortedTables flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(50, flatbuffers.UOffsetT(scalarKeySortedTables), 0)\n}\nfunc MonsterStartScalarKeySortedTablesVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {\n\treturn builder.StartVector(4, numElems, 4)\n}\nfunc MonsterAddNativeInline(builder *flatbuffers.Builder, nativeInline flatbuffers.UOffsetT) {\n\tbuilder.PrependStructSlot(51, flatbuffers.UOffsetT(nativeInline), 0)\n}\nfunc MonsterAddLongEnumNonEnumDefault(builder *flatbuffers.Builder, longEnumNonEnumDefault LongEnum) {\n\tbuilder.PrependUint64Slot(52, uint64(longEnumNonEnumDefault), 0)\n}\nfunc MonsterAddLongEnumNormalDefault(builder *flatbuffers.Builder, longEnumNormalDefault LongEnum) {\n\tbuilder.PrependUint64Slot(53, uint64(longEnumNormalDefault), 2)\n}\nfunc MonsterAddNanDefault(builder *flatbuffers.Builder, nanDefault float32) {\n\tbuilder.PrependFloat32Slot(54, nanDefault, float32(math.NaN()))\n}\nfunc MonsterAddInfDefault(builder *flatbuffers.Builder, infDefault float32) {\n\tbuilder.PrependFloat32Slot(55, infDefault, float32(math.Inf(1)))\n}\nfunc MonsterAddPositiveInfDefault(builder *flatbuffers.Builder, positiveInfDefault float32) {\n\tbuilder.PrependFloat32Slot(56, positiveInfDefault, float32(math.Inf(1)))\n}\nfunc MonsterAddInfinityDefault(builder *flatbuffers.Builder, infinityDefault float32) {\n\tbuilder.PrependFloat32Slot(57, infinityDefault, float32(math.Inf(1)))\n}\nfunc MonsterAddPositiveInfinityDefault(builder *flatbuffers.Builder, positiveInfinityDefault float32) {\n\tbuilder.PrependFloat32Slot(58, positiveInfinityDefault, float32(math.Inf(1)))\n}\nfunc MonsterAddNegativeInfDefault(builder *flatbuffers.Builder, negativeInfDefault float32) {\n\tbuilder.PrependFloat32Slot(59, negativeInfDefault, float32(math.Inf(-1)))\n}\nfunc MonsterAddNegativeInfinityDefault(builder *flatbuffers.Builder, negativeInfinityDefault float32) {\n\tbuilder.PrependFloat32Slot(60, negativeInfinityDefault, float32(math.Inf(-1)))\n}\nfunc MonsterAddDoubleInfDefault(builder *flatbuffers.Builder, doubleInfDefault float64) {\n\tbuilder.PrependFloat64Slot(61, doubleInfDefault, float64(math.Inf(1)))\n}\nfunc MonsterEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\treturn builder.EndObject()\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Monster.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n/**\n * an example documentation comment: \"monster object\"\n */\n@SuppressWarnings(\"unused\")\npublic final class Monster extends com.google.flatbuffers.Table {\n  public static void ValidateVersion() { Constants.FLATBUFFERS_25_12_19(); }\n  public static Monster getRootAsMonster(ByteBuffer _bb) { return getRootAsMonster(_bb, new Monster()); }\n  public static Monster getRootAsMonster(ByteBuffer _bb, Monster obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }\n  public static boolean MonsterBufferHasIdentifier(ByteBuffer _bb) { return __has_identifier(_bb, \"MONS\"); }\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public Monster __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public MyGame.Example.Vec3 pos() { return pos(new MyGame.Example.Vec3()); }\n  public MyGame.Example.Vec3 pos(MyGame.Example.Vec3 obj) { int o = __offset(4); return o != 0 ? obj.__assign(o + bb_pos, bb) : null; }\n  public short mana() { int o = __offset(6); return o != 0 ? bb.getShort(o + bb_pos) : 150; }\n  public boolean mutateMana(short mana) { int o = __offset(6); if (o != 0) { bb.putShort(o + bb_pos, mana); return true; } else { return false; } }\n  public short hp() { int o = __offset(8); return o != 0 ? bb.getShort(o + bb_pos) : 100; }\n  public boolean mutateHp(short hp) { int o = __offset(8); if (o != 0) { bb.putShort(o + bb_pos, hp); return true; } else { return false; } }\n  public String name() { int o = __offset(10); return o != 0 ? __string(o + bb_pos) : null; }\n  public ByteBuffer nameAsByteBuffer() { return __vector_as_bytebuffer(10, 1); }\n  public ByteBuffer nameInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 10, 1); }\n  public int inventory(int j) { int o = __offset(14); return o != 0 ? bb.get(__vector(o) + j * 1) & 0xFF : 0; }\n  public int inventoryLength() { int o = __offset(14); return o != 0 ? __vector_len(o) : 0; }\n  public ByteVector inventoryVector() { return inventoryVector(new ByteVector()); }\n  public ByteVector inventoryVector(ByteVector obj) { int o = __offset(14); return o != 0 ? obj.__assign(__vector(o), bb) : null; }\n  public ByteBuffer inventoryAsByteBuffer() { return __vector_as_bytebuffer(14, 1); }\n  public ByteBuffer inventoryInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 14, 1); }\n  public boolean mutateInventory(int j, int inventory) { int o = __offset(14); if (o != 0) { bb.put(__vector(o) + j * 1, (byte) inventory); return true; } else { return false; } }\n  public int color() { int o = __offset(16); return o != 0 ? bb.get(o + bb_pos) & 0xFF : 8; }\n  public boolean mutateColor(int color) { int o = __offset(16); if (o != 0) { bb.put(o + bb_pos, (byte) color); return true; } else { return false; } }\n  public byte testType() { int o = __offset(18); return o != 0 ? bb.get(o + bb_pos) : 0; }\n  public com.google.flatbuffers.Table test(com.google.flatbuffers.Table obj) { int o = __offset(20); return o != 0 ? __union(obj, o + bb_pos) : null; }\n  public MyGame.Example.Test test4(int j) { return test4(new MyGame.Example.Test(), j); }\n  public MyGame.Example.Test test4(MyGame.Example.Test obj, int j) { int o = __offset(22); return o != 0 ? obj.__assign(__vector(o) + j * 4, bb) : null; }\n  public int test4Length() { int o = __offset(22); return o != 0 ? __vector_len(o) : 0; }\n  public MyGame.Example.Test.Vector test4Vector() { return test4Vector(new MyGame.Example.Test.Vector()); }\n  public MyGame.Example.Test.Vector test4Vector(MyGame.Example.Test.Vector obj) { int o = __offset(22); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n  public String testarrayofstring(int j) { int o = __offset(24); return o != 0 ? __string(__vector(o) + j * 4) : null; }\n  public int testarrayofstringLength() { int o = __offset(24); return o != 0 ? __vector_len(o) : 0; }\n  public StringVector testarrayofstringVector() { return testarrayofstringVector(new StringVector()); }\n  public StringVector testarrayofstringVector(StringVector obj) { int o = __offset(24); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n  /**\n   * an example documentation comment: this will end up in the generated code\n   * multiline too\n   */\n  public MyGame.Example.Monster testarrayoftables(int j) { return testarrayoftables(new MyGame.Example.Monster(), j); }\n  public MyGame.Example.Monster testarrayoftables(MyGame.Example.Monster obj, int j) { int o = __offset(26); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }\n  public int testarrayoftablesLength() { int o = __offset(26); return o != 0 ? __vector_len(o) : 0; }\n  public MyGame.Example.Monster testarrayoftablesByKey(String key) { int o = __offset(26); return o != 0 ? MyGame.Example.Monster.__lookup_by_key(null, __vector(o), key, bb) : null; }\n  public MyGame.Example.Monster testarrayoftablesByKey(MyGame.Example.Monster obj, String key) { int o = __offset(26); return o != 0 ? MyGame.Example.Monster.__lookup_by_key(obj, __vector(o), key, bb) : null; }\n  public MyGame.Example.Monster.Vector testarrayoftablesVector() { return testarrayoftablesVector(new MyGame.Example.Monster.Vector()); }\n  public MyGame.Example.Monster.Vector testarrayoftablesVector(MyGame.Example.Monster.Vector obj) { int o = __offset(26); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n  public MyGame.Example.Monster enemy() { return enemy(new MyGame.Example.Monster()); }\n  public MyGame.Example.Monster enemy(MyGame.Example.Monster obj) { int o = __offset(28); return o != 0 ? obj.__assign(__indirect(o + bb_pos), bb) : null; }\n  public int testnestedflatbuffer(int j) { int o = __offset(30); return o != 0 ? bb.get(__vector(o) + j * 1) & 0xFF : 0; }\n  public int testnestedflatbufferLength() { int o = __offset(30); return o != 0 ? __vector_len(o) : 0; }\n  public ByteVector testnestedflatbufferVector() { return testnestedflatbufferVector(new ByteVector()); }\n  public ByteVector testnestedflatbufferVector(ByteVector obj) { int o = __offset(30); return o != 0 ? obj.__assign(__vector(o), bb) : null; }\n  public ByteBuffer testnestedflatbufferAsByteBuffer() { return __vector_as_bytebuffer(30, 1); }\n  public ByteBuffer testnestedflatbufferInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 30, 1); }\n  public MyGame.Example.Monster testnestedflatbufferAsMonster() { return testnestedflatbufferAsMonster(new MyGame.Example.Monster()); }\n  public MyGame.Example.Monster testnestedflatbufferAsMonster(MyGame.Example.Monster obj) { int o = __offset(30); return o != 0 ? obj.__assign(__indirect(__vector(o)), bb) : null; }\n  public boolean mutateTestnestedflatbuffer(int j, int testnestedflatbuffer) { int o = __offset(30); if (o != 0) { bb.put(__vector(o) + j * 1, (byte) testnestedflatbuffer); return true; } else { return false; } }\n  public MyGame.Example.Stat testempty() { return testempty(new MyGame.Example.Stat()); }\n  public MyGame.Example.Stat testempty(MyGame.Example.Stat obj) { int o = __offset(32); return o != 0 ? obj.__assign(__indirect(o + bb_pos), bb) : null; }\n  public boolean testbool() { int o = __offset(34); return o != 0 ? 0!=bb.get(o + bb_pos) : false; }\n  public boolean mutateTestbool(boolean testbool) { int o = __offset(34); if (o != 0) { bb.put(o + bb_pos, (byte)(testbool ? 1 : 0)); return true; } else { return false; } }\n  public int testhashs32Fnv1() { int o = __offset(36); return o != 0 ? bb.getInt(o + bb_pos) : 0; }\n  public boolean mutateTesthashs32Fnv1(int testhashs32_fnv1) { int o = __offset(36); if (o != 0) { bb.putInt(o + bb_pos, testhashs32_fnv1); return true; } else { return false; } }\n  public long testhashu32Fnv1() { int o = __offset(38); return o != 0 ? (long)bb.getInt(o + bb_pos) & 0xFFFFFFFFL : 0L; }\n  public boolean mutateTesthashu32Fnv1(long testhashu32_fnv1) { int o = __offset(38); if (o != 0) { bb.putInt(o + bb_pos, (int) testhashu32_fnv1); return true; } else { return false; } }\n  public long testhashs64Fnv1() { int o = __offset(40); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }\n  public boolean mutateTesthashs64Fnv1(long testhashs64_fnv1) { int o = __offset(40); if (o != 0) { bb.putLong(o + bb_pos, testhashs64_fnv1); return true; } else { return false; } }\n  public long testhashu64Fnv1() { int o = __offset(42); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }\n  public boolean mutateTesthashu64Fnv1(long testhashu64_fnv1) { int o = __offset(42); if (o != 0) { bb.putLong(o + bb_pos, testhashu64_fnv1); return true; } else { return false; } }\n  public int testhashs32Fnv1a() { int o = __offset(44); return o != 0 ? bb.getInt(o + bb_pos) : 0; }\n  public boolean mutateTesthashs32Fnv1a(int testhashs32_fnv1a) { int o = __offset(44); if (o != 0) { bb.putInt(o + bb_pos, testhashs32_fnv1a); return true; } else { return false; } }\n  public long testhashu32Fnv1a() { int o = __offset(46); return o != 0 ? (long)bb.getInt(o + bb_pos) & 0xFFFFFFFFL : 0L; }\n  public boolean mutateTesthashu32Fnv1a(long testhashu32_fnv1a) { int o = __offset(46); if (o != 0) { bb.putInt(o + bb_pos, (int) testhashu32_fnv1a); return true; } else { return false; } }\n  public long testhashs64Fnv1a() { int o = __offset(48); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }\n  public boolean mutateTesthashs64Fnv1a(long testhashs64_fnv1a) { int o = __offset(48); if (o != 0) { bb.putLong(o + bb_pos, testhashs64_fnv1a); return true; } else { return false; } }\n  public long testhashu64Fnv1a() { int o = __offset(50); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }\n  public boolean mutateTesthashu64Fnv1a(long testhashu64_fnv1a) { int o = __offset(50); if (o != 0) { bb.putLong(o + bb_pos, testhashu64_fnv1a); return true; } else { return false; } }\n  public boolean testarrayofbools(int j) { int o = __offset(52); return o != 0 ? 0!=bb.get(__vector(o) + j * 1) : false; }\n  public int testarrayofboolsLength() { int o = __offset(52); return o != 0 ? __vector_len(o) : 0; }\n  public BooleanVector testarrayofboolsVector() { return testarrayofboolsVector(new BooleanVector()); }\n  public BooleanVector testarrayofboolsVector(BooleanVector obj) { int o = __offset(52); return o != 0 ? obj.__assign(__vector(o), bb) : null; }\n  public ByteBuffer testarrayofboolsAsByteBuffer() { return __vector_as_bytebuffer(52, 1); }\n  public ByteBuffer testarrayofboolsInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 52, 1); }\n  public boolean mutateTestarrayofbools(int j, boolean testarrayofbools) { int o = __offset(52); if (o != 0) { bb.put(__vector(o) + j * 1, (byte)(testarrayofbools ? 1 : 0)); return true; } else { return false; } }\n  public float testf() { int o = __offset(54); return o != 0 ? bb.getFloat(o + bb_pos) : 3.14159f; }\n  public boolean mutateTestf(float testf) { int o = __offset(54); if (o != 0) { bb.putFloat(o + bb_pos, testf); return true; } else { return false; } }\n  public float testf2() { int o = __offset(56); return o != 0 ? bb.getFloat(o + bb_pos) : 3.0f; }\n  public boolean mutateTestf2(float testf2) { int o = __offset(56); if (o != 0) { bb.putFloat(o + bb_pos, testf2); return true; } else { return false; } }\n  public float testf3() { int o = __offset(58); return o != 0 ? bb.getFloat(o + bb_pos) : 0.0f; }\n  public boolean mutateTestf3(float testf3) { int o = __offset(58); if (o != 0) { bb.putFloat(o + bb_pos, testf3); return true; } else { return false; } }\n  public String testarrayofstring2(int j) { int o = __offset(60); return o != 0 ? __string(__vector(o) + j * 4) : null; }\n  public int testarrayofstring2Length() { int o = __offset(60); return o != 0 ? __vector_len(o) : 0; }\n  public StringVector testarrayofstring2Vector() { return testarrayofstring2Vector(new StringVector()); }\n  public StringVector testarrayofstring2Vector(StringVector obj) { int o = __offset(60); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n  public MyGame.Example.Ability testarrayofsortedstruct(int j) { return testarrayofsortedstruct(new MyGame.Example.Ability(), j); }\n  public MyGame.Example.Ability testarrayofsortedstruct(MyGame.Example.Ability obj, int j) { int o = __offset(62); return o != 0 ? obj.__assign(__vector(o) + j * 8, bb) : null; }\n  public int testarrayofsortedstructLength() { int o = __offset(62); return o != 0 ? __vector_len(o) : 0; }\n  public MyGame.Example.Ability.Vector testarrayofsortedstructVector() { return testarrayofsortedstructVector(new MyGame.Example.Ability.Vector()); }\n  public MyGame.Example.Ability.Vector testarrayofsortedstructVector(MyGame.Example.Ability.Vector obj) { int o = __offset(62); return o != 0 ? obj.__assign(__vector(o), 8, bb) : null; }\n  public int flex(int j) { int o = __offset(64); return o != 0 ? bb.get(__vector(o) + j * 1) & 0xFF : 0; }\n  public int flexLength() { int o = __offset(64); return o != 0 ? __vector_len(o) : 0; }\n  public ByteVector flexVector() { return flexVector(new ByteVector()); }\n  public ByteVector flexVector(ByteVector obj) { int o = __offset(64); return o != 0 ? obj.__assign(__vector(o), bb) : null; }\n  public ByteBuffer flexAsByteBuffer() { return __vector_as_bytebuffer(64, 1); }\n  public ByteBuffer flexInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 64, 1); }\n  public boolean mutateFlex(int j, int flex) { int o = __offset(64); if (o != 0) { bb.put(__vector(o) + j * 1, (byte) flex); return true; } else { return false; } }\n  public MyGame.Example.Test test5(int j) { return test5(new MyGame.Example.Test(), j); }\n  public MyGame.Example.Test test5(MyGame.Example.Test obj, int j) { int o = __offset(66); return o != 0 ? obj.__assign(__vector(o) + j * 4, bb) : null; }\n  public int test5Length() { int o = __offset(66); return o != 0 ? __vector_len(o) : 0; }\n  public MyGame.Example.Test.Vector test5Vector() { return test5Vector(new MyGame.Example.Test.Vector()); }\n  public MyGame.Example.Test.Vector test5Vector(MyGame.Example.Test.Vector obj) { int o = __offset(66); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n  public long vectorOfLongs(int j) { int o = __offset(68); return o != 0 ? bb.getLong(__vector(o) + j * 8) : 0; }\n  public int vectorOfLongsLength() { int o = __offset(68); return o != 0 ? __vector_len(o) : 0; }\n  public LongVector vectorOfLongsVector() { return vectorOfLongsVector(new LongVector()); }\n  public LongVector vectorOfLongsVector(LongVector obj) { int o = __offset(68); return o != 0 ? obj.__assign(__vector(o), bb) : null; }\n  public ByteBuffer vectorOfLongsAsByteBuffer() { return __vector_as_bytebuffer(68, 8); }\n  public ByteBuffer vectorOfLongsInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 68, 8); }\n  public boolean mutateVectorOfLongs(int j, long vector_of_longs) { int o = __offset(68); if (o != 0) { bb.putLong(__vector(o) + j * 8, vector_of_longs); return true; } else { return false; } }\n  public double vectorOfDoubles(int j) { int o = __offset(70); return o != 0 ? bb.getDouble(__vector(o) + j * 8) : 0; }\n  public int vectorOfDoublesLength() { int o = __offset(70); return o != 0 ? __vector_len(o) : 0; }\n  public DoubleVector vectorOfDoublesVector() { return vectorOfDoublesVector(new DoubleVector()); }\n  public DoubleVector vectorOfDoublesVector(DoubleVector obj) { int o = __offset(70); return o != 0 ? obj.__assign(__vector(o), bb) : null; }\n  public ByteBuffer vectorOfDoublesAsByteBuffer() { return __vector_as_bytebuffer(70, 8); }\n  public ByteBuffer vectorOfDoublesInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 70, 8); }\n  public boolean mutateVectorOfDoubles(int j, double vector_of_doubles) { int o = __offset(70); if (o != 0) { bb.putDouble(__vector(o) + j * 8, vector_of_doubles); return true; } else { return false; } }\n  public MyGame.InParentNamespace parentNamespaceTest() { return parentNamespaceTest(new MyGame.InParentNamespace()); }\n  public MyGame.InParentNamespace parentNamespaceTest(MyGame.InParentNamespace obj) { int o = __offset(72); return o != 0 ? obj.__assign(__indirect(o + bb_pos), bb) : null; }\n  public MyGame.Example.Referrable vectorOfReferrables(int j) { return vectorOfReferrables(new MyGame.Example.Referrable(), j); }\n  public MyGame.Example.Referrable vectorOfReferrables(MyGame.Example.Referrable obj, int j) { int o = __offset(74); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }\n  public int vectorOfReferrablesLength() { int o = __offset(74); return o != 0 ? __vector_len(o) : 0; }\n  public MyGame.Example.Referrable vectorOfReferrablesByKey(long key) { int o = __offset(74); return o != 0 ? MyGame.Example.Referrable.__lookup_by_key(null, __vector(o), key, bb) : null; }\n  public MyGame.Example.Referrable vectorOfReferrablesByKey(MyGame.Example.Referrable obj, long key) { int o = __offset(74); return o != 0 ? MyGame.Example.Referrable.__lookup_by_key(obj, __vector(o), key, bb) : null; }\n  public MyGame.Example.Referrable.Vector vectorOfReferrablesVector() { return vectorOfReferrablesVector(new MyGame.Example.Referrable.Vector()); }\n  public MyGame.Example.Referrable.Vector vectorOfReferrablesVector(MyGame.Example.Referrable.Vector obj) { int o = __offset(74); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n  public long singleWeakReference() { int o = __offset(76); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }\n  public boolean mutateSingleWeakReference(long single_weak_reference) { int o = __offset(76); if (o != 0) { bb.putLong(o + bb_pos, single_weak_reference); return true; } else { return false; } }\n  public long vectorOfWeakReferences(int j) { int o = __offset(78); return o != 0 ? bb.getLong(__vector(o) + j * 8) : 0; }\n  public int vectorOfWeakReferencesLength() { int o = __offset(78); return o != 0 ? __vector_len(o) : 0; }\n  public LongVector vectorOfWeakReferencesVector() { return vectorOfWeakReferencesVector(new LongVector()); }\n  public LongVector vectorOfWeakReferencesVector(LongVector obj) { int o = __offset(78); return o != 0 ? obj.__assign(__vector(o), bb) : null; }\n  public ByteBuffer vectorOfWeakReferencesAsByteBuffer() { return __vector_as_bytebuffer(78, 8); }\n  public ByteBuffer vectorOfWeakReferencesInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 78, 8); }\n  public boolean mutateVectorOfWeakReferences(int j, long vector_of_weak_references) { int o = __offset(78); if (o != 0) { bb.putLong(__vector(o) + j * 8, vector_of_weak_references); return true; } else { return false; } }\n  public MyGame.Example.Referrable vectorOfStrongReferrables(int j) { return vectorOfStrongReferrables(new MyGame.Example.Referrable(), j); }\n  public MyGame.Example.Referrable vectorOfStrongReferrables(MyGame.Example.Referrable obj, int j) { int o = __offset(80); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }\n  public int vectorOfStrongReferrablesLength() { int o = __offset(80); return o != 0 ? __vector_len(o) : 0; }\n  public MyGame.Example.Referrable vectorOfStrongReferrablesByKey(long key) { int o = __offset(80); return o != 0 ? MyGame.Example.Referrable.__lookup_by_key(null, __vector(o), key, bb) : null; }\n  public MyGame.Example.Referrable vectorOfStrongReferrablesByKey(MyGame.Example.Referrable obj, long key) { int o = __offset(80); return o != 0 ? MyGame.Example.Referrable.__lookup_by_key(obj, __vector(o), key, bb) : null; }\n  public MyGame.Example.Referrable.Vector vectorOfStrongReferrablesVector() { return vectorOfStrongReferrablesVector(new MyGame.Example.Referrable.Vector()); }\n  public MyGame.Example.Referrable.Vector vectorOfStrongReferrablesVector(MyGame.Example.Referrable.Vector obj) { int o = __offset(80); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n  public long coOwningReference() { int o = __offset(82); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }\n  public boolean mutateCoOwningReference(long co_owning_reference) { int o = __offset(82); if (o != 0) { bb.putLong(o + bb_pos, co_owning_reference); return true; } else { return false; } }\n  public long vectorOfCoOwningReferences(int j) { int o = __offset(84); return o != 0 ? bb.getLong(__vector(o) + j * 8) : 0; }\n  public int vectorOfCoOwningReferencesLength() { int o = __offset(84); return o != 0 ? __vector_len(o) : 0; }\n  public LongVector vectorOfCoOwningReferencesVector() { return vectorOfCoOwningReferencesVector(new LongVector()); }\n  public LongVector vectorOfCoOwningReferencesVector(LongVector obj) { int o = __offset(84); return o != 0 ? obj.__assign(__vector(o), bb) : null; }\n  public ByteBuffer vectorOfCoOwningReferencesAsByteBuffer() { return __vector_as_bytebuffer(84, 8); }\n  public ByteBuffer vectorOfCoOwningReferencesInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 84, 8); }\n  public boolean mutateVectorOfCoOwningReferences(int j, long vector_of_co_owning_references) { int o = __offset(84); if (o != 0) { bb.putLong(__vector(o) + j * 8, vector_of_co_owning_references); return true; } else { return false; } }\n  public long nonOwningReference() { int o = __offset(86); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }\n  public boolean mutateNonOwningReference(long non_owning_reference) { int o = __offset(86); if (o != 0) { bb.putLong(o + bb_pos, non_owning_reference); return true; } else { return false; } }\n  public long vectorOfNonOwningReferences(int j) { int o = __offset(88); return o != 0 ? bb.getLong(__vector(o) + j * 8) : 0; }\n  public int vectorOfNonOwningReferencesLength() { int o = __offset(88); return o != 0 ? __vector_len(o) : 0; }\n  public LongVector vectorOfNonOwningReferencesVector() { return vectorOfNonOwningReferencesVector(new LongVector()); }\n  public LongVector vectorOfNonOwningReferencesVector(LongVector obj) { int o = __offset(88); return o != 0 ? obj.__assign(__vector(o), bb) : null; }\n  public ByteBuffer vectorOfNonOwningReferencesAsByteBuffer() { return __vector_as_bytebuffer(88, 8); }\n  public ByteBuffer vectorOfNonOwningReferencesInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 88, 8); }\n  public boolean mutateVectorOfNonOwningReferences(int j, long vector_of_non_owning_references) { int o = __offset(88); if (o != 0) { bb.putLong(__vector(o) + j * 8, vector_of_non_owning_references); return true; } else { return false; } }\n  public byte anyUniqueType() { int o = __offset(90); return o != 0 ? bb.get(o + bb_pos) : 0; }\n  public com.google.flatbuffers.Table anyUnique(com.google.flatbuffers.Table obj) { int o = __offset(92); return o != 0 ? __union(obj, o + bb_pos) : null; }\n  public byte anyAmbiguousType() { int o = __offset(94); return o != 0 ? bb.get(o + bb_pos) : 0; }\n  public com.google.flatbuffers.Table anyAmbiguous(com.google.flatbuffers.Table obj) { int o = __offset(96); return o != 0 ? __union(obj, o + bb_pos) : null; }\n  public int vectorOfEnums(int j) { int o = __offset(98); return o != 0 ? bb.get(__vector(o) + j * 1) & 0xFF : 0; }\n  public int vectorOfEnumsLength() { int o = __offset(98); return o != 0 ? __vector_len(o) : 0; }\n  public ByteVector vectorOfEnumsVector() { return vectorOfEnumsVector(new ByteVector()); }\n  public ByteVector vectorOfEnumsVector(ByteVector obj) { int o = __offset(98); return o != 0 ? obj.__assign(__vector(o), bb) : null; }\n  public ByteBuffer vectorOfEnumsAsByteBuffer() { return __vector_as_bytebuffer(98, 1); }\n  public ByteBuffer vectorOfEnumsInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 98, 1); }\n  public boolean mutateVectorOfEnums(int j, int vector_of_enums) { int o = __offset(98); if (o != 0) { bb.put(__vector(o) + j * 1, (byte) vector_of_enums); return true; } else { return false; } }\n  public byte signedEnum() { int o = __offset(100); return o != 0 ? bb.get(o + bb_pos) : -1; }\n  public boolean mutateSignedEnum(byte signed_enum) { int o = __offset(100); if (o != 0) { bb.put(o + bb_pos, signed_enum); return true; } else { return false; } }\n  public int testrequirednestedflatbuffer(int j) { int o = __offset(102); return o != 0 ? bb.get(__vector(o) + j * 1) & 0xFF : 0; }\n  public int testrequirednestedflatbufferLength() { int o = __offset(102); return o != 0 ? __vector_len(o) : 0; }\n  public ByteVector testrequirednestedflatbufferVector() { return testrequirednestedflatbufferVector(new ByteVector()); }\n  public ByteVector testrequirednestedflatbufferVector(ByteVector obj) { int o = __offset(102); return o != 0 ? obj.__assign(__vector(o), bb) : null; }\n  public ByteBuffer testrequirednestedflatbufferAsByteBuffer() { return __vector_as_bytebuffer(102, 1); }\n  public ByteBuffer testrequirednestedflatbufferInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 102, 1); }\n  public MyGame.Example.Monster testrequirednestedflatbufferAsMonster() { return testrequirednestedflatbufferAsMonster(new MyGame.Example.Monster()); }\n  public MyGame.Example.Monster testrequirednestedflatbufferAsMonster(MyGame.Example.Monster obj) { int o = __offset(102); return o != 0 ? obj.__assign(__indirect(__vector(o)), bb) : null; }\n  public boolean mutateTestrequirednestedflatbuffer(int j, int testrequirednestedflatbuffer) { int o = __offset(102); if (o != 0) { bb.put(__vector(o) + j * 1, (byte) testrequirednestedflatbuffer); return true; } else { return false; } }\n  public MyGame.Example.Stat scalarKeySortedTables(int j) { return scalarKeySortedTables(new MyGame.Example.Stat(), j); }\n  public MyGame.Example.Stat scalarKeySortedTables(MyGame.Example.Stat obj, int j) { int o = __offset(104); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }\n  public int scalarKeySortedTablesLength() { int o = __offset(104); return o != 0 ? __vector_len(o) : 0; }\n  public MyGame.Example.Stat scalarKeySortedTablesByKey(int key) { int o = __offset(104); return o != 0 ? MyGame.Example.Stat.__lookup_by_key(null, __vector(o), key, bb) : null; }\n  public MyGame.Example.Stat scalarKeySortedTablesByKey(MyGame.Example.Stat obj, int key) { int o = __offset(104); return o != 0 ? MyGame.Example.Stat.__lookup_by_key(obj, __vector(o), key, bb) : null; }\n  public MyGame.Example.Stat.Vector scalarKeySortedTablesVector() { return scalarKeySortedTablesVector(new MyGame.Example.Stat.Vector()); }\n  public MyGame.Example.Stat.Vector scalarKeySortedTablesVector(MyGame.Example.Stat.Vector obj) { int o = __offset(104); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n  public MyGame.Example.Test nativeInline() { return nativeInline(new MyGame.Example.Test()); }\n  public MyGame.Example.Test nativeInline(MyGame.Example.Test obj) { int o = __offset(106); return o != 0 ? obj.__assign(o + bb_pos, bb) : null; }\n  public long longEnumNonEnumDefault() { int o = __offset(108); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }\n  public boolean mutateLongEnumNonEnumDefault(long long_enum_non_enum_default) { int o = __offset(108); if (o != 0) { bb.putLong(o + bb_pos, long_enum_non_enum_default); return true; } else { return false; } }\n  public long longEnumNormalDefault() { int o = __offset(110); return o != 0 ? bb.getLong(o + bb_pos) : 2L; }\n  public boolean mutateLongEnumNormalDefault(long long_enum_normal_default) { int o = __offset(110); if (o != 0) { bb.putLong(o + bb_pos, long_enum_normal_default); return true; } else { return false; } }\n  public float nanDefault() { int o = __offset(112); return o != 0 ? bb.getFloat(o + bb_pos) : Float.NaN; }\n  public boolean mutateNanDefault(float nan_default) { int o = __offset(112); if (o != 0) { bb.putFloat(o + bb_pos, nan_default); return true; } else { return false; } }\n  public float infDefault() { int o = __offset(114); return o != 0 ? bb.getFloat(o + bb_pos) : Float.POSITIVE_INFINITY; }\n  public boolean mutateInfDefault(float inf_default) { int o = __offset(114); if (o != 0) { bb.putFloat(o + bb_pos, inf_default); return true; } else { return false; } }\n  public float positiveInfDefault() { int o = __offset(116); return o != 0 ? bb.getFloat(o + bb_pos) : Float.POSITIVE_INFINITY; }\n  public boolean mutatePositiveInfDefault(float positive_inf_default) { int o = __offset(116); if (o != 0) { bb.putFloat(o + bb_pos, positive_inf_default); return true; } else { return false; } }\n  public float infinityDefault() { int o = __offset(118); return o != 0 ? bb.getFloat(o + bb_pos) : Float.POSITIVE_INFINITY; }\n  public boolean mutateInfinityDefault(float infinity_default) { int o = __offset(118); if (o != 0) { bb.putFloat(o + bb_pos, infinity_default); return true; } else { return false; } }\n  public float positiveInfinityDefault() { int o = __offset(120); return o != 0 ? bb.getFloat(o + bb_pos) : Float.POSITIVE_INFINITY; }\n  public boolean mutatePositiveInfinityDefault(float positive_infinity_default) { int o = __offset(120); if (o != 0) { bb.putFloat(o + bb_pos, positive_infinity_default); return true; } else { return false; } }\n  public float negativeInfDefault() { int o = __offset(122); return o != 0 ? bb.getFloat(o + bb_pos) : Float.NEGATIVE_INFINITY; }\n  public boolean mutateNegativeInfDefault(float negative_inf_default) { int o = __offset(122); if (o != 0) { bb.putFloat(o + bb_pos, negative_inf_default); return true; } else { return false; } }\n  public float negativeInfinityDefault() { int o = __offset(124); return o != 0 ? bb.getFloat(o + bb_pos) : Float.NEGATIVE_INFINITY; }\n  public boolean mutateNegativeInfinityDefault(float negative_infinity_default) { int o = __offset(124); if (o != 0) { bb.putFloat(o + bb_pos, negative_infinity_default); return true; } else { return false; } }\n  public double doubleInfDefault() { int o = __offset(126); return o != 0 ? bb.getDouble(o + bb_pos) : Double.POSITIVE_INFINITY; }\n  public boolean mutateDoubleInfDefault(double double_inf_default) { int o = __offset(126); if (o != 0) { bb.putDouble(o + bb_pos, double_inf_default); return true; } else { return false; } }\n\n  public static void startMonster(FlatBufferBuilder builder) { builder.startTable(62); }\n  public static void addPos(FlatBufferBuilder builder, int posOffset) { builder.addStruct(0, posOffset, 0); }\n  public static void addMana(FlatBufferBuilder builder, short mana) { builder.addShort(1, mana, 150); }\n  public static void addHp(FlatBufferBuilder builder, short hp) { builder.addShort(2, hp, 100); }\n  public static void addName(FlatBufferBuilder builder, int nameOffset) { builder.addOffset(nameOffset); builder.slot(3); }\n  public static void addInventory(FlatBufferBuilder builder, int inventoryOffset) { builder.addOffset(5, inventoryOffset, 0); }\n  public static int createInventoryVector(FlatBufferBuilder builder, byte[] data) { return builder.createByteVector(data); }\n  public static int createInventoryVector(FlatBufferBuilder builder, ByteBuffer data) { return builder.createByteVector(data); }\n  public static void startInventoryVector(FlatBufferBuilder builder, int numElems) { builder.startVector(1, numElems, 1); }\n  public static void addColor(FlatBufferBuilder builder, int color) { builder.addByte(6, (byte) color, (byte) 8); }\n  public static void addTestType(FlatBufferBuilder builder, byte testType) { builder.addByte(7, testType, 0); }\n  public static void addTest(FlatBufferBuilder builder, int testOffset) { builder.addOffset(8, testOffset, 0); }\n  public static void addTest4(FlatBufferBuilder builder, int test4Offset) { builder.addOffset(9, test4Offset, 0); }\n  public static void startTest4Vector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 2); }\n  public static void addTestarrayofstring(FlatBufferBuilder builder, int testarrayofstringOffset) { builder.addOffset(10, testarrayofstringOffset, 0); }\n  public static int createTestarrayofstringVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }\n  public static void startTestarrayofstringVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static void addTestarrayoftables(FlatBufferBuilder builder, int testarrayoftablesOffset) { builder.addOffset(11, testarrayoftablesOffset, 0); }\n  public static int createTestarrayoftablesVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }\n  public static void startTestarrayoftablesVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static void addEnemy(FlatBufferBuilder builder, int enemyOffset) { builder.addOffset(12, enemyOffset, 0); }\n  public static void addTestnestedflatbuffer(FlatBufferBuilder builder, int testnestedflatbufferOffset) { builder.addOffset(13, testnestedflatbufferOffset, 0); }\n  public static int createTestnestedflatbufferVector(FlatBufferBuilder builder, byte[] data) { return builder.createByteVector(data); }\n  public static int createTestnestedflatbufferVector(FlatBufferBuilder builder, ByteBuffer data) { return builder.createByteVector(data); }\n  public static void startTestnestedflatbufferVector(FlatBufferBuilder builder, int numElems) { builder.startVector(1, numElems, 1); }\n  public static void addTestempty(FlatBufferBuilder builder, int testemptyOffset) { builder.addOffset(14, testemptyOffset, 0); }\n  public static void addTestbool(FlatBufferBuilder builder, boolean testbool) { builder.addBoolean(15, testbool, false); }\n  public static void addTesthashs32Fnv1(FlatBufferBuilder builder, int testhashs32Fnv1) { builder.addInt(16, testhashs32Fnv1, 0); }\n  public static void addTesthashu32Fnv1(FlatBufferBuilder builder, long testhashu32Fnv1) { builder.addInt(17, (int) testhashu32Fnv1, (int) 0L); }\n  public static void addTesthashs64Fnv1(FlatBufferBuilder builder, long testhashs64Fnv1) { builder.addLong(18, testhashs64Fnv1, 0L); }\n  public static void addTesthashu64Fnv1(FlatBufferBuilder builder, long testhashu64Fnv1) { builder.addLong(19, testhashu64Fnv1, 0L); }\n  public static void addTesthashs32Fnv1a(FlatBufferBuilder builder, int testhashs32Fnv1a) { builder.addInt(20, testhashs32Fnv1a, 0); }\n  public static void addTesthashu32Fnv1a(FlatBufferBuilder builder, long testhashu32Fnv1a) { builder.addInt(21, (int) testhashu32Fnv1a, (int) 0L); }\n  public static void addTesthashs64Fnv1a(FlatBufferBuilder builder, long testhashs64Fnv1a) { builder.addLong(22, testhashs64Fnv1a, 0L); }\n  public static void addTesthashu64Fnv1a(FlatBufferBuilder builder, long testhashu64Fnv1a) { builder.addLong(23, testhashu64Fnv1a, 0L); }\n  public static void addTestarrayofbools(FlatBufferBuilder builder, int testarrayofboolsOffset) { builder.addOffset(24, testarrayofboolsOffset, 0); }\n  public static int createTestarrayofboolsVector(FlatBufferBuilder builder, boolean[] data) { builder.startVector(1, data.length, 1); for (int i = data.length - 1; i >= 0; i--) builder.addBoolean(data[i]); return builder.endVector(); }\n  public static void startTestarrayofboolsVector(FlatBufferBuilder builder, int numElems) { builder.startVector(1, numElems, 1); }\n  public static void addTestf(FlatBufferBuilder builder, float testf) { builder.addFloat(25, testf, 3.14159f); }\n  public static void addTestf2(FlatBufferBuilder builder, float testf2) { builder.addFloat(26, testf2, 3.0f); }\n  public static void addTestf3(FlatBufferBuilder builder, float testf3) { builder.addFloat(27, testf3, 0.0f); }\n  public static void addTestarrayofstring2(FlatBufferBuilder builder, int testarrayofstring2Offset) { builder.addOffset(28, testarrayofstring2Offset, 0); }\n  public static int createTestarrayofstring2Vector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }\n  public static void startTestarrayofstring2Vector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static void addTestarrayofsortedstruct(FlatBufferBuilder builder, int testarrayofsortedstructOffset) { builder.addOffset(29, testarrayofsortedstructOffset, 0); }\n  public static void startTestarrayofsortedstructVector(FlatBufferBuilder builder, int numElems) { builder.startVector(8, numElems, 4); }\n  public static void addFlex(FlatBufferBuilder builder, int flexOffset) { builder.addOffset(30, flexOffset, 0); }\n  public static int createFlexVector(FlatBufferBuilder builder, byte[] data) { return builder.createByteVector(data); }\n  public static int createFlexVector(FlatBufferBuilder builder, ByteBuffer data) { return builder.createByteVector(data); }\n  public static void startFlexVector(FlatBufferBuilder builder, int numElems) { builder.startVector(1, numElems, 1); }\n  public static void addTest5(FlatBufferBuilder builder, int test5Offset) { builder.addOffset(31, test5Offset, 0); }\n  public static void startTest5Vector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 2); }\n  public static void addVectorOfLongs(FlatBufferBuilder builder, int vectorOfLongsOffset) { builder.addOffset(32, vectorOfLongsOffset, 0); }\n  public static int createVectorOfLongsVector(FlatBufferBuilder builder, long[] data) { builder.startVector(8, data.length, 8); for (int i = data.length - 1; i >= 0; i--) builder.addLong(data[i]); return builder.endVector(); }\n  public static void startVectorOfLongsVector(FlatBufferBuilder builder, int numElems) { builder.startVector(8, numElems, 8); }\n  public static void addVectorOfDoubles(FlatBufferBuilder builder, int vectorOfDoublesOffset) { builder.addOffset(33, vectorOfDoublesOffset, 0); }\n  public static int createVectorOfDoublesVector(FlatBufferBuilder builder, double[] data) { builder.startVector(8, data.length, 8); for (int i = data.length - 1; i >= 0; i--) builder.addDouble(data[i]); return builder.endVector(); }\n  public static void startVectorOfDoublesVector(FlatBufferBuilder builder, int numElems) { builder.startVector(8, numElems, 8); }\n  public static void addParentNamespaceTest(FlatBufferBuilder builder, int parentNamespaceTestOffset) { builder.addOffset(34, parentNamespaceTestOffset, 0); }\n  public static void addVectorOfReferrables(FlatBufferBuilder builder, int vectorOfReferrablesOffset) { builder.addOffset(35, vectorOfReferrablesOffset, 0); }\n  public static int createVectorOfReferrablesVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }\n  public static void startVectorOfReferrablesVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static void addSingleWeakReference(FlatBufferBuilder builder, long singleWeakReference) { builder.addLong(36, singleWeakReference, 0L); }\n  public static void addVectorOfWeakReferences(FlatBufferBuilder builder, int vectorOfWeakReferencesOffset) { builder.addOffset(37, vectorOfWeakReferencesOffset, 0); }\n  public static int createVectorOfWeakReferencesVector(FlatBufferBuilder builder, long[] data) { builder.startVector(8, data.length, 8); for (int i = data.length - 1; i >= 0; i--) builder.addLong(data[i]); return builder.endVector(); }\n  public static void startVectorOfWeakReferencesVector(FlatBufferBuilder builder, int numElems) { builder.startVector(8, numElems, 8); }\n  public static void addVectorOfStrongReferrables(FlatBufferBuilder builder, int vectorOfStrongReferrablesOffset) { builder.addOffset(38, vectorOfStrongReferrablesOffset, 0); }\n  public static int createVectorOfStrongReferrablesVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }\n  public static void startVectorOfStrongReferrablesVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static void addCoOwningReference(FlatBufferBuilder builder, long coOwningReference) { builder.addLong(39, coOwningReference, 0L); }\n  public static void addVectorOfCoOwningReferences(FlatBufferBuilder builder, int vectorOfCoOwningReferencesOffset) { builder.addOffset(40, vectorOfCoOwningReferencesOffset, 0); }\n  public static int createVectorOfCoOwningReferencesVector(FlatBufferBuilder builder, long[] data) { builder.startVector(8, data.length, 8); for (int i = data.length - 1; i >= 0; i--) builder.addLong(data[i]); return builder.endVector(); }\n  public static void startVectorOfCoOwningReferencesVector(FlatBufferBuilder builder, int numElems) { builder.startVector(8, numElems, 8); }\n  public static void addNonOwningReference(FlatBufferBuilder builder, long nonOwningReference) { builder.addLong(41, nonOwningReference, 0L); }\n  public static void addVectorOfNonOwningReferences(FlatBufferBuilder builder, int vectorOfNonOwningReferencesOffset) { builder.addOffset(42, vectorOfNonOwningReferencesOffset, 0); }\n  public static int createVectorOfNonOwningReferencesVector(FlatBufferBuilder builder, long[] data) { builder.startVector(8, data.length, 8); for (int i = data.length - 1; i >= 0; i--) builder.addLong(data[i]); return builder.endVector(); }\n  public static void startVectorOfNonOwningReferencesVector(FlatBufferBuilder builder, int numElems) { builder.startVector(8, numElems, 8); }\n  public static void addAnyUniqueType(FlatBufferBuilder builder, byte anyUniqueType) { builder.addByte(43, anyUniqueType, 0); }\n  public static void addAnyUnique(FlatBufferBuilder builder, int anyUniqueOffset) { builder.addOffset(44, anyUniqueOffset, 0); }\n  public static void addAnyAmbiguousType(FlatBufferBuilder builder, byte anyAmbiguousType) { builder.addByte(45, anyAmbiguousType, 0); }\n  public static void addAnyAmbiguous(FlatBufferBuilder builder, int anyAmbiguousOffset) { builder.addOffset(46, anyAmbiguousOffset, 0); }\n  public static void addVectorOfEnums(FlatBufferBuilder builder, int vectorOfEnumsOffset) { builder.addOffset(47, vectorOfEnumsOffset, 0); }\n  public static int createVectorOfEnumsVector(FlatBufferBuilder builder, byte[] data) { return builder.createByteVector(data); }\n  public static int createVectorOfEnumsVector(FlatBufferBuilder builder, ByteBuffer data) { return builder.createByteVector(data); }\n  public static void startVectorOfEnumsVector(FlatBufferBuilder builder, int numElems) { builder.startVector(1, numElems, 1); }\n  public static void addSignedEnum(FlatBufferBuilder builder, byte signedEnum) { builder.addByte(48, signedEnum, -1); }\n  public static void addTestrequirednestedflatbuffer(FlatBufferBuilder builder, int testrequirednestedflatbufferOffset) { builder.addOffset(49, testrequirednestedflatbufferOffset, 0); }\n  public static int createTestrequirednestedflatbufferVector(FlatBufferBuilder builder, byte[] data) { return builder.createByteVector(data); }\n  public static int createTestrequirednestedflatbufferVector(FlatBufferBuilder builder, ByteBuffer data) { return builder.createByteVector(data); }\n  public static void startTestrequirednestedflatbufferVector(FlatBufferBuilder builder, int numElems) { builder.startVector(1, numElems, 1); }\n  public static void addScalarKeySortedTables(FlatBufferBuilder builder, int scalarKeySortedTablesOffset) { builder.addOffset(50, scalarKeySortedTablesOffset, 0); }\n  public static int createScalarKeySortedTablesVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }\n  public static void startScalarKeySortedTablesVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static void addNativeInline(FlatBufferBuilder builder, int nativeInlineOffset) { builder.addStruct(51, nativeInlineOffset, 0); }\n  public static void addLongEnumNonEnumDefault(FlatBufferBuilder builder, long longEnumNonEnumDefault) { builder.addLong(52, longEnumNonEnumDefault, 0L); }\n  public static void addLongEnumNormalDefault(FlatBufferBuilder builder, long longEnumNormalDefault) { builder.addLong(53, longEnumNormalDefault, 2L); }\n  public static void addNanDefault(FlatBufferBuilder builder, float nanDefault) { builder.addFloat(54, nanDefault, Float.NaN); }\n  public static void addInfDefault(FlatBufferBuilder builder, float infDefault) { builder.addFloat(55, infDefault, Float.POSITIVE_INFINITY); }\n  public static void addPositiveInfDefault(FlatBufferBuilder builder, float positiveInfDefault) { builder.addFloat(56, positiveInfDefault, Float.POSITIVE_INFINITY); }\n  public static void addInfinityDefault(FlatBufferBuilder builder, float infinityDefault) { builder.addFloat(57, infinityDefault, Float.POSITIVE_INFINITY); }\n  public static void addPositiveInfinityDefault(FlatBufferBuilder builder, float positiveInfinityDefault) { builder.addFloat(58, positiveInfinityDefault, Float.POSITIVE_INFINITY); }\n  public static void addNegativeInfDefault(FlatBufferBuilder builder, float negativeInfDefault) { builder.addFloat(59, negativeInfDefault, Float.NEGATIVE_INFINITY); }\n  public static void addNegativeInfinityDefault(FlatBufferBuilder builder, float negativeInfinityDefault) { builder.addFloat(60, negativeInfinityDefault, Float.NEGATIVE_INFINITY); }\n  public static void addDoubleInfDefault(FlatBufferBuilder builder, double doubleInfDefault) { builder.addDouble(61, doubleInfDefault, Double.POSITIVE_INFINITY); }\n  public static int endMonster(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    builder.required(o, 10);  // name\n    return o;\n  }\n  public static void finishMonsterBuffer(FlatBufferBuilder builder, int offset) { builder.finish(offset, \"MONS\"); }\n  public static void finishSizePrefixedMonsterBuffer(FlatBufferBuilder builder, int offset) { builder.finishSizePrefixed(offset, \"MONS\"); }\n\n  @Override\n  protected int keysCompare(Integer o1, Integer o2, ByteBuffer _bb) { return compareStrings(__offset(10, o1, _bb), __offset(10, o2, _bb), _bb); }\n\n  public static Monster __lookup_by_key(Monster obj, int vectorLocation, String key, ByteBuffer bb) {\n    byte[] byteKey = key.getBytes(java.nio.charset.StandardCharsets.UTF_8);\n    int span = bb.getInt(vectorLocation - 4);\n    int start = 0;\n    while (span != 0) {\n      int middle = span / 2;\n      int tableOffset = __indirect(vectorLocation + 4 * (start + middle), bb);\n      int comp = compareStrings(__offset(10, bb.capacity() - tableOffset, bb), byteKey, bb);\n      if (comp > 0) {\n        span = middle;\n      } else if (comp < 0) {\n        middle++;\n        start += middle;\n        span -= middle;\n      } else {\n        return (obj == null ? new Monster() : obj).__assign(tableOffset, bb);\n      }\n    }\n    return null;\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public Monster get(int j) { return get(new Monster(), j); }\n    public Monster get(Monster obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); }\n    public Monster getByKey(String key) {  return __lookup_by_key(null, __vector(), key, bb); }\n    public Monster getByKey(Monster obj, String key) {  return __lookup_by_key(obj, __vector(), key, bb); }\n  }\n  public MonsterT unpack() {\n    MonsterT _o = new MonsterT();\n    unpackTo(_o);\n    return _o;\n  }\n  public void unpackTo(MonsterT _o) {\n    if (pos() != null) pos().unpackTo(_o.getPos());\n    else _o.setPos(null);\n    short _oMana = mana();\n    _o.setMana(_oMana);\n    short _oHp = hp();\n    _o.setHp(_oHp);\n    String _oName = name();\n    _o.setName(_oName);\n    int[] _oInventory = new int[inventoryLength()];\n    for (int _j = 0; _j < inventoryLength(); ++_j) {_oInventory[_j] = inventory(_j);}\n    _o.setInventory(_oInventory);\n    int _oColor = color();\n    _o.setColor(_oColor);\n    MyGame.Example.AnyUnion _oTest = new MyGame.Example.AnyUnion();\n    byte _oTestType = testType();\n    _oTest.setType(_oTestType);\n    com.google.flatbuffers.Table _oTestValue;\n    switch (_oTestType) {\n      case MyGame.Example.Any.Monster:\n        _oTestValue = test(new MyGame.Example.Monster());\n        _oTest.setValue(_oTestValue != null ? ((MyGame.Example.Monster) _oTestValue).unpack() : null);\n        break;\n      case MyGame.Example.Any.TestSimpleTableWithEnum:\n        _oTestValue = test(new MyGame.Example.TestSimpleTableWithEnum());\n        _oTest.setValue(_oTestValue != null ? ((MyGame.Example.TestSimpleTableWithEnum) _oTestValue).unpack() : null);\n        break;\n      case MyGame.Example.Any.MyGame_Example2_Monster:\n        _oTestValue = test(new MyGame.Example2.Monster());\n        _oTest.setValue(_oTestValue != null ? ((MyGame.Example2.Monster) _oTestValue).unpack() : null);\n        break;\n      default: break;\n    }\n    _o.setTest(_oTest);\n    MyGame.Example.TestT[] _oTest4 = new MyGame.Example.TestT[test4Length()];\n    for (int _j = 0; _j < test4Length(); ++_j) {_oTest4[_j] = (test4(_j) != null ? test4(_j).unpack() : null);}\n    _o.setTest4(_oTest4);\n    String[] _oTestarrayofstring = new String[testarrayofstringLength()];\n    for (int _j = 0; _j < testarrayofstringLength(); ++_j) {_oTestarrayofstring[_j] = testarrayofstring(_j);}\n    _o.setTestarrayofstring(_oTestarrayofstring);\n    MyGame.Example.MonsterT[] _oTestarrayoftables = new MyGame.Example.MonsterT[testarrayoftablesLength()];\n    for (int _j = 0; _j < testarrayoftablesLength(); ++_j) {_oTestarrayoftables[_j] = (testarrayoftables(_j) != null ? testarrayoftables(_j).unpack() : null);}\n    _o.setTestarrayoftables(_oTestarrayoftables);\n    if (enemy() != null) _o.setEnemy(enemy().unpack());\n    else _o.setEnemy(null);\n    int[] _oTestnestedflatbuffer = new int[testnestedflatbufferLength()];\n    for (int _j = 0; _j < testnestedflatbufferLength(); ++_j) {_oTestnestedflatbuffer[_j] = testnestedflatbuffer(_j);}\n    _o.setTestnestedflatbuffer(_oTestnestedflatbuffer);\n    if (testempty() != null) _o.setTestempty(testempty().unpack());\n    else _o.setTestempty(null);\n    boolean _oTestbool = testbool();\n    _o.setTestbool(_oTestbool);\n    int _oTesthashs32Fnv1 = testhashs32Fnv1();\n    _o.setTesthashs32Fnv1(_oTesthashs32Fnv1);\n    long _oTesthashu32Fnv1 = testhashu32Fnv1();\n    _o.setTesthashu32Fnv1(_oTesthashu32Fnv1);\n    long _oTesthashs64Fnv1 = testhashs64Fnv1();\n    _o.setTesthashs64Fnv1(_oTesthashs64Fnv1);\n    long _oTesthashu64Fnv1 = testhashu64Fnv1();\n    _o.setTesthashu64Fnv1(_oTesthashu64Fnv1);\n    int _oTesthashs32Fnv1a = testhashs32Fnv1a();\n    _o.setTesthashs32Fnv1a(_oTesthashs32Fnv1a);\n    long _oTesthashu32Fnv1a = testhashu32Fnv1a();\n    _o.setTesthashu32Fnv1a(_oTesthashu32Fnv1a);\n    long _oTesthashs64Fnv1a = testhashs64Fnv1a();\n    _o.setTesthashs64Fnv1a(_oTesthashs64Fnv1a);\n    long _oTesthashu64Fnv1a = testhashu64Fnv1a();\n    _o.setTesthashu64Fnv1a(_oTesthashu64Fnv1a);\n    boolean[] _oTestarrayofbools = new boolean[testarrayofboolsLength()];\n    for (int _j = 0; _j < testarrayofboolsLength(); ++_j) {_oTestarrayofbools[_j] = testarrayofbools(_j);}\n    _o.setTestarrayofbools(_oTestarrayofbools);\n    float _oTestf = testf();\n    _o.setTestf(_oTestf);\n    float _oTestf2 = testf2();\n    _o.setTestf2(_oTestf2);\n    float _oTestf3 = testf3();\n    _o.setTestf3(_oTestf3);\n    String[] _oTestarrayofstring2 = new String[testarrayofstring2Length()];\n    for (int _j = 0; _j < testarrayofstring2Length(); ++_j) {_oTestarrayofstring2[_j] = testarrayofstring2(_j);}\n    _o.setTestarrayofstring2(_oTestarrayofstring2);\n    MyGame.Example.AbilityT[] _oTestarrayofsortedstruct = new MyGame.Example.AbilityT[testarrayofsortedstructLength()];\n    for (int _j = 0; _j < testarrayofsortedstructLength(); ++_j) {_oTestarrayofsortedstruct[_j] = (testarrayofsortedstruct(_j) != null ? testarrayofsortedstruct(_j).unpack() : null);}\n    _o.setTestarrayofsortedstruct(_oTestarrayofsortedstruct);\n    int[] _oFlex = new int[flexLength()];\n    for (int _j = 0; _j < flexLength(); ++_j) {_oFlex[_j] = flex(_j);}\n    _o.setFlex(_oFlex);\n    MyGame.Example.TestT[] _oTest5 = new MyGame.Example.TestT[test5Length()];\n    for (int _j = 0; _j < test5Length(); ++_j) {_oTest5[_j] = (test5(_j) != null ? test5(_j).unpack() : null);}\n    _o.setTest5(_oTest5);\n    long[] _oVectorOfLongs = new long[vectorOfLongsLength()];\n    for (int _j = 0; _j < vectorOfLongsLength(); ++_j) {_oVectorOfLongs[_j] = vectorOfLongs(_j);}\n    _o.setVectorOfLongs(_oVectorOfLongs);\n    double[] _oVectorOfDoubles = new double[vectorOfDoublesLength()];\n    for (int _j = 0; _j < vectorOfDoublesLength(); ++_j) {_oVectorOfDoubles[_j] = vectorOfDoubles(_j);}\n    _o.setVectorOfDoubles(_oVectorOfDoubles);\n    if (parentNamespaceTest() != null) _o.setParentNamespaceTest(parentNamespaceTest().unpack());\n    else _o.setParentNamespaceTest(null);\n    MyGame.Example.ReferrableT[] _oVectorOfReferrables = new MyGame.Example.ReferrableT[vectorOfReferrablesLength()];\n    for (int _j = 0; _j < vectorOfReferrablesLength(); ++_j) {_oVectorOfReferrables[_j] = (vectorOfReferrables(_j) != null ? vectorOfReferrables(_j).unpack() : null);}\n    _o.setVectorOfReferrables(_oVectorOfReferrables);\n    long _oSingleWeakReference = singleWeakReference();\n    _o.setSingleWeakReference(_oSingleWeakReference);\n    long[] _oVectorOfWeakReferences = new long[vectorOfWeakReferencesLength()];\n    for (int _j = 0; _j < vectorOfWeakReferencesLength(); ++_j) {_oVectorOfWeakReferences[_j] = vectorOfWeakReferences(_j);}\n    _o.setVectorOfWeakReferences(_oVectorOfWeakReferences);\n    MyGame.Example.ReferrableT[] _oVectorOfStrongReferrables = new MyGame.Example.ReferrableT[vectorOfStrongReferrablesLength()];\n    for (int _j = 0; _j < vectorOfStrongReferrablesLength(); ++_j) {_oVectorOfStrongReferrables[_j] = (vectorOfStrongReferrables(_j) != null ? vectorOfStrongReferrables(_j).unpack() : null);}\n    _o.setVectorOfStrongReferrables(_oVectorOfStrongReferrables);\n    long _oCoOwningReference = coOwningReference();\n    _o.setCoOwningReference(_oCoOwningReference);\n    long[] _oVectorOfCoOwningReferences = new long[vectorOfCoOwningReferencesLength()];\n    for (int _j = 0; _j < vectorOfCoOwningReferencesLength(); ++_j) {_oVectorOfCoOwningReferences[_j] = vectorOfCoOwningReferences(_j);}\n    _o.setVectorOfCoOwningReferences(_oVectorOfCoOwningReferences);\n    long _oNonOwningReference = nonOwningReference();\n    _o.setNonOwningReference(_oNonOwningReference);\n    long[] _oVectorOfNonOwningReferences = new long[vectorOfNonOwningReferencesLength()];\n    for (int _j = 0; _j < vectorOfNonOwningReferencesLength(); ++_j) {_oVectorOfNonOwningReferences[_j] = vectorOfNonOwningReferences(_j);}\n    _o.setVectorOfNonOwningReferences(_oVectorOfNonOwningReferences);\n    MyGame.Example.AnyUniqueAliasesUnion _oAnyUnique = new MyGame.Example.AnyUniqueAliasesUnion();\n    byte _oAnyUniqueType = anyUniqueType();\n    _oAnyUnique.setType(_oAnyUniqueType);\n    com.google.flatbuffers.Table _oAnyUniqueValue;\n    switch (_oAnyUniqueType) {\n      case MyGame.Example.AnyUniqueAliases.M:\n        _oAnyUniqueValue = anyUnique(new MyGame.Example.Monster());\n        _oAnyUnique.setValue(_oAnyUniqueValue != null ? ((MyGame.Example.Monster) _oAnyUniqueValue).unpack() : null);\n        break;\n      case MyGame.Example.AnyUniqueAliases.TS:\n        _oAnyUniqueValue = anyUnique(new MyGame.Example.TestSimpleTableWithEnum());\n        _oAnyUnique.setValue(_oAnyUniqueValue != null ? ((MyGame.Example.TestSimpleTableWithEnum) _oAnyUniqueValue).unpack() : null);\n        break;\n      case MyGame.Example.AnyUniqueAliases.M2:\n        _oAnyUniqueValue = anyUnique(new MyGame.Example2.Monster());\n        _oAnyUnique.setValue(_oAnyUniqueValue != null ? ((MyGame.Example2.Monster) _oAnyUniqueValue).unpack() : null);\n        break;\n      default: break;\n    }\n    _o.setAnyUnique(_oAnyUnique);\n    MyGame.Example.AnyAmbiguousAliasesUnion _oAnyAmbiguous = new MyGame.Example.AnyAmbiguousAliasesUnion();\n    byte _oAnyAmbiguousType = anyAmbiguousType();\n    _oAnyAmbiguous.setType(_oAnyAmbiguousType);\n    com.google.flatbuffers.Table _oAnyAmbiguousValue;\n    switch (_oAnyAmbiguousType) {\n      case MyGame.Example.AnyAmbiguousAliases.M1:\n        _oAnyAmbiguousValue = anyAmbiguous(new MyGame.Example.Monster());\n        _oAnyAmbiguous.setValue(_oAnyAmbiguousValue != null ? ((MyGame.Example.Monster) _oAnyAmbiguousValue).unpack() : null);\n        break;\n      case MyGame.Example.AnyAmbiguousAliases.M2:\n        _oAnyAmbiguousValue = anyAmbiguous(new MyGame.Example.Monster());\n        _oAnyAmbiguous.setValue(_oAnyAmbiguousValue != null ? ((MyGame.Example.Monster) _oAnyAmbiguousValue).unpack() : null);\n        break;\n      case MyGame.Example.AnyAmbiguousAliases.M3:\n        _oAnyAmbiguousValue = anyAmbiguous(new MyGame.Example.Monster());\n        _oAnyAmbiguous.setValue(_oAnyAmbiguousValue != null ? ((MyGame.Example.Monster) _oAnyAmbiguousValue).unpack() : null);\n        break;\n      default: break;\n    }\n    _o.setAnyAmbiguous(_oAnyAmbiguous);\n    int[] _oVectorOfEnums = new int[vectorOfEnumsLength()];\n    for (int _j = 0; _j < vectorOfEnumsLength(); ++_j) {_oVectorOfEnums[_j] = vectorOfEnums(_j);}\n    _o.setVectorOfEnums(_oVectorOfEnums);\n    byte _oSignedEnum = signedEnum();\n    _o.setSignedEnum(_oSignedEnum);\n    int[] _oTestrequirednestedflatbuffer = new int[testrequirednestedflatbufferLength()];\n    for (int _j = 0; _j < testrequirednestedflatbufferLength(); ++_j) {_oTestrequirednestedflatbuffer[_j] = testrequirednestedflatbuffer(_j);}\n    _o.setTestrequirednestedflatbuffer(_oTestrequirednestedflatbuffer);\n    MyGame.Example.StatT[] _oScalarKeySortedTables = new MyGame.Example.StatT[scalarKeySortedTablesLength()];\n    for (int _j = 0; _j < scalarKeySortedTablesLength(); ++_j) {_oScalarKeySortedTables[_j] = (scalarKeySortedTables(_j) != null ? scalarKeySortedTables(_j).unpack() : null);}\n    _o.setScalarKeySortedTables(_oScalarKeySortedTables);\n    if (nativeInline() != null) nativeInline().unpackTo(_o.getNativeInline());\n    else _o.setNativeInline(null);\n    long _oLongEnumNonEnumDefault = longEnumNonEnumDefault();\n    _o.setLongEnumNonEnumDefault(_oLongEnumNonEnumDefault);\n    long _oLongEnumNormalDefault = longEnumNormalDefault();\n    _o.setLongEnumNormalDefault(_oLongEnumNormalDefault);\n    float _oNanDefault = nanDefault();\n    _o.setNanDefault(_oNanDefault);\n    float _oInfDefault = infDefault();\n    _o.setInfDefault(_oInfDefault);\n    float _oPositiveInfDefault = positiveInfDefault();\n    _o.setPositiveInfDefault(_oPositiveInfDefault);\n    float _oInfinityDefault = infinityDefault();\n    _o.setInfinityDefault(_oInfinityDefault);\n    float _oPositiveInfinityDefault = positiveInfinityDefault();\n    _o.setPositiveInfinityDefault(_oPositiveInfinityDefault);\n    float _oNegativeInfDefault = negativeInfDefault();\n    _o.setNegativeInfDefault(_oNegativeInfDefault);\n    float _oNegativeInfinityDefault = negativeInfinityDefault();\n    _o.setNegativeInfinityDefault(_oNegativeInfinityDefault);\n    double _oDoubleInfDefault = doubleInfDefault();\n    _o.setDoubleInfDefault(_oDoubleInfDefault);\n  }\n  public static int pack(FlatBufferBuilder builder, MonsterT _o) {\n    if (_o == null) return 0;\n    int _name = _o.getName() == null ? 0 : builder.createString(_o.getName());\n    int _inventory = 0;\n    if (_o.getInventory() != null) {\n      byte[] __inventory = new byte[_o.getInventory().length];\n      int _j = 0;\n      for (int _e : _o.getInventory()) { __inventory[_j] = (byte) _e; _j++;}\n      _inventory = createInventoryVector(builder, __inventory);\n    }\n    byte _testType = _o.getTest() == null ? MyGame.Example.Any.NONE : _o.getTest().getType();\n    int _test = _o.getTest() == null ? 0 : MyGame.Example.AnyUnion.pack(builder, _o.getTest());\n    int _test4 = 0;\n    MyGame.Example.TestT[] _oTest4 = _o.getTest4();\n    if (_oTest4 != null) {\n      int _unused_offset = 0;\n      startTest4Vector(builder, _oTest4.length);\n      for (int _j = _oTest4.length - 1; _j >=0; _j--) { _unused_offset = MyGame.Example.Test.pack(builder, _oTest4[_j]);}\n      _test4 = builder.endVector();\n    }\n    int _testarrayofstring = 0;\n    if (_o.getTestarrayofstring() != null) {\n      int[] __testarrayofstring = new int[_o.getTestarrayofstring().length];\n      int _j = 0;\n      for (String _e : _o.getTestarrayofstring()) { __testarrayofstring[_j] = builder.createString(_e); _j++;}\n      _testarrayofstring = createTestarrayofstringVector(builder, __testarrayofstring);\n    }\n    int _testarrayoftables = 0;\n    if (_o.getTestarrayoftables() != null) {\n      int[] __testarrayoftables = new int[_o.getTestarrayoftables().length];\n      int _j = 0;\n      for (MyGame.Example.MonsterT _e : _o.getTestarrayoftables()) { __testarrayoftables[_j] = MyGame.Example.Monster.pack(builder, _e); _j++;}\n      _testarrayoftables = createTestarrayoftablesVector(builder, __testarrayoftables);\n    }\n    int _enemy = _o.getEnemy() == null ? 0 : MyGame.Example.Monster.pack(builder, _o.getEnemy());\n    int _testnestedflatbuffer = 0;\n    if (_o.getTestnestedflatbuffer() != null) {\n      byte[] __testnestedflatbuffer = new byte[_o.getTestnestedflatbuffer().length];\n      int _j = 0;\n      for (int _e : _o.getTestnestedflatbuffer()) { __testnestedflatbuffer[_j] = (byte) _e; _j++;}\n      _testnestedflatbuffer = createTestnestedflatbufferVector(builder, __testnestedflatbuffer);\n    }\n    int _testempty = _o.getTestempty() == null ? 0 : MyGame.Example.Stat.pack(builder, _o.getTestempty());\n    int _testarrayofbools = 0;\n    if (_o.getTestarrayofbools() != null) {\n      _testarrayofbools = createTestarrayofboolsVector(builder, _o.getTestarrayofbools());\n    }\n    int _testarrayofstring2 = 0;\n    if (_o.getTestarrayofstring2() != null) {\n      int[] __testarrayofstring2 = new int[_o.getTestarrayofstring2().length];\n      int _j = 0;\n      for (String _e : _o.getTestarrayofstring2()) { __testarrayofstring2[_j] = builder.createString(_e); _j++;}\n      _testarrayofstring2 = createTestarrayofstring2Vector(builder, __testarrayofstring2);\n    }\n    int _testarrayofsortedstruct = 0;\n    MyGame.Example.AbilityT[] _oTestarrayofsortedstruct = _o.getTestarrayofsortedstruct();\n    if (_oTestarrayofsortedstruct != null) {\n      int _unused_offset = 0;\n      startTestarrayofsortedstructVector(builder, _oTestarrayofsortedstruct.length);\n      for (int _j = _oTestarrayofsortedstruct.length - 1; _j >=0; _j--) { _unused_offset = MyGame.Example.Ability.pack(builder, _oTestarrayofsortedstruct[_j]);}\n      _testarrayofsortedstruct = builder.endVector();\n    }\n    int _flex = 0;\n    if (_o.getFlex() != null) {\n      byte[] __flex = new byte[_o.getFlex().length];\n      int _j = 0;\n      for (int _e : _o.getFlex()) { __flex[_j] = (byte) _e; _j++;}\n      _flex = createFlexVector(builder, __flex);\n    }\n    int _test5 = 0;\n    MyGame.Example.TestT[] _oTest5 = _o.getTest5();\n    if (_oTest5 != null) {\n      int _unused_offset = 0;\n      startTest5Vector(builder, _oTest5.length);\n      for (int _j = _oTest5.length - 1; _j >=0; _j--) { _unused_offset = MyGame.Example.Test.pack(builder, _oTest5[_j]);}\n      _test5 = builder.endVector();\n    }\n    int _vectorOfLongs = 0;\n    if (_o.getVectorOfLongs() != null) {\n      _vectorOfLongs = createVectorOfLongsVector(builder, _o.getVectorOfLongs());\n    }\n    int _vectorOfDoubles = 0;\n    if (_o.getVectorOfDoubles() != null) {\n      _vectorOfDoubles = createVectorOfDoublesVector(builder, _o.getVectorOfDoubles());\n    }\n    int _parentNamespaceTest = _o.getParentNamespaceTest() == null ? 0 : MyGame.InParentNamespace.pack(builder, _o.getParentNamespaceTest());\n    int _vectorOfReferrables = 0;\n    if (_o.getVectorOfReferrables() != null) {\n      int[] __vectorOfReferrables = new int[_o.getVectorOfReferrables().length];\n      int _j = 0;\n      for (MyGame.Example.ReferrableT _e : _o.getVectorOfReferrables()) { __vectorOfReferrables[_j] = MyGame.Example.Referrable.pack(builder, _e); _j++;}\n      _vectorOfReferrables = createVectorOfReferrablesVector(builder, __vectorOfReferrables);\n    }\n    int _vectorOfWeakReferences = 0;\n    if (_o.getVectorOfWeakReferences() != null) {\n      _vectorOfWeakReferences = createVectorOfWeakReferencesVector(builder, _o.getVectorOfWeakReferences());\n    }\n    int _vectorOfStrongReferrables = 0;\n    if (_o.getVectorOfStrongReferrables() != null) {\n      int[] __vectorOfStrongReferrables = new int[_o.getVectorOfStrongReferrables().length];\n      int _j = 0;\n      for (MyGame.Example.ReferrableT _e : _o.getVectorOfStrongReferrables()) { __vectorOfStrongReferrables[_j] = MyGame.Example.Referrable.pack(builder, _e); _j++;}\n      _vectorOfStrongReferrables = createVectorOfStrongReferrablesVector(builder, __vectorOfStrongReferrables);\n    }\n    int _vectorOfCoOwningReferences = 0;\n    if (_o.getVectorOfCoOwningReferences() != null) {\n      _vectorOfCoOwningReferences = createVectorOfCoOwningReferencesVector(builder, _o.getVectorOfCoOwningReferences());\n    }\n    int _vectorOfNonOwningReferences = 0;\n    if (_o.getVectorOfNonOwningReferences() != null) {\n      _vectorOfNonOwningReferences = createVectorOfNonOwningReferencesVector(builder, _o.getVectorOfNonOwningReferences());\n    }\n    byte _anyUniqueType = _o.getAnyUnique() == null ? MyGame.Example.AnyUniqueAliases.NONE : _o.getAnyUnique().getType();\n    int _anyUnique = _o.getAnyUnique() == null ? 0 : MyGame.Example.AnyUniqueAliasesUnion.pack(builder, _o.getAnyUnique());\n    byte _anyAmbiguousType = _o.getAnyAmbiguous() == null ? MyGame.Example.AnyAmbiguousAliases.NONE : _o.getAnyAmbiguous().getType();\n    int _anyAmbiguous = _o.getAnyAmbiguous() == null ? 0 : MyGame.Example.AnyAmbiguousAliasesUnion.pack(builder, _o.getAnyAmbiguous());\n    int _vectorOfEnums = 0;\n    if (_o.getVectorOfEnums() != null) {\n      byte[] __vectorOfEnums = new byte[_o.getVectorOfEnums().length];\n      int _j = 0;\n      for (int _e : _o.getVectorOfEnums()) { __vectorOfEnums[_j] = (byte) _e; _j++;}\n      _vectorOfEnums = createVectorOfEnumsVector(builder, __vectorOfEnums);\n    }\n    int _testrequirednestedflatbuffer = 0;\n    if (_o.getTestrequirednestedflatbuffer() != null) {\n      byte[] __testrequirednestedflatbuffer = new byte[_o.getTestrequirednestedflatbuffer().length];\n      int _j = 0;\n      for (int _e : _o.getTestrequirednestedflatbuffer()) { __testrequirednestedflatbuffer[_j] = (byte) _e; _j++;}\n      _testrequirednestedflatbuffer = createTestrequirednestedflatbufferVector(builder, __testrequirednestedflatbuffer);\n    }\n    int _scalarKeySortedTables = 0;\n    if (_o.getScalarKeySortedTables() != null) {\n      int[] __scalarKeySortedTables = new int[_o.getScalarKeySortedTables().length];\n      int _j = 0;\n      for (MyGame.Example.StatT _e : _o.getScalarKeySortedTables()) { __scalarKeySortedTables[_j] = MyGame.Example.Stat.pack(builder, _e); _j++;}\n      _scalarKeySortedTables = createScalarKeySortedTablesVector(builder, __scalarKeySortedTables);\n    }\n    startMonster(builder);\n    addPos(builder, MyGame.Example.Vec3.pack(builder, _o.getPos()));\n    addMana(builder, _o.getMana());\n    addHp(builder, _o.getHp());\n    addName(builder, _name);\n    addInventory(builder, _inventory);\n    addColor(builder, _o.getColor());\n    addTestType(builder, _testType);\n    addTest(builder, _test);\n    addTest4(builder, _test4);\n    addTestarrayofstring(builder, _testarrayofstring);\n    addTestarrayoftables(builder, _testarrayoftables);\n    addEnemy(builder, _enemy);\n    addTestnestedflatbuffer(builder, _testnestedflatbuffer);\n    addTestempty(builder, _testempty);\n    addTestbool(builder, _o.getTestbool());\n    addTesthashs32Fnv1(builder, _o.getTesthashs32Fnv1());\n    addTesthashu32Fnv1(builder, _o.getTesthashu32Fnv1());\n    addTesthashs64Fnv1(builder, _o.getTesthashs64Fnv1());\n    addTesthashu64Fnv1(builder, _o.getTesthashu64Fnv1());\n    addTesthashs32Fnv1a(builder, _o.getTesthashs32Fnv1a());\n    addTesthashu32Fnv1a(builder, _o.getTesthashu32Fnv1a());\n    addTesthashs64Fnv1a(builder, _o.getTesthashs64Fnv1a());\n    addTesthashu64Fnv1a(builder, _o.getTesthashu64Fnv1a());\n    addTestarrayofbools(builder, _testarrayofbools);\n    addTestf(builder, _o.getTestf());\n    addTestf2(builder, _o.getTestf2());\n    addTestf3(builder, _o.getTestf3());\n    addTestarrayofstring2(builder, _testarrayofstring2);\n    addTestarrayofsortedstruct(builder, _testarrayofsortedstruct);\n    addFlex(builder, _flex);\n    addTest5(builder, _test5);\n    addVectorOfLongs(builder, _vectorOfLongs);\n    addVectorOfDoubles(builder, _vectorOfDoubles);\n    addParentNamespaceTest(builder, _parentNamespaceTest);\n    addVectorOfReferrables(builder, _vectorOfReferrables);\n    addSingleWeakReference(builder, _o.getSingleWeakReference());\n    addVectorOfWeakReferences(builder, _vectorOfWeakReferences);\n    addVectorOfStrongReferrables(builder, _vectorOfStrongReferrables);\n    addCoOwningReference(builder, _o.getCoOwningReference());\n    addVectorOfCoOwningReferences(builder, _vectorOfCoOwningReferences);\n    addNonOwningReference(builder, _o.getNonOwningReference());\n    addVectorOfNonOwningReferences(builder, _vectorOfNonOwningReferences);\n    addAnyUniqueType(builder, _anyUniqueType);\n    addAnyUnique(builder, _anyUnique);\n    addAnyAmbiguousType(builder, _anyAmbiguousType);\n    addAnyAmbiguous(builder, _anyAmbiguous);\n    addVectorOfEnums(builder, _vectorOfEnums);\n    addSignedEnum(builder, _o.getSignedEnum());\n    addTestrequirednestedflatbuffer(builder, _testrequirednestedflatbuffer);\n    addScalarKeySortedTables(builder, _scalarKeySortedTables);\n    addNativeInline(builder, MyGame.Example.Test.pack(builder, _o.getNativeInline()));\n    addLongEnumNonEnumDefault(builder, _o.getLongEnumNonEnumDefault());\n    addLongEnumNormalDefault(builder, _o.getLongEnumNormalDefault());\n    addNanDefault(builder, _o.getNanDefault());\n    addInfDefault(builder, _o.getInfDefault());\n    addPositiveInfDefault(builder, _o.getPositiveInfDefault());\n    addInfinityDefault(builder, _o.getInfinityDefault());\n    addPositiveInfinityDefault(builder, _o.getPositiveInfinityDefault());\n    addNegativeInfDefault(builder, _o.getNegativeInfDefault());\n    addNegativeInfinityDefault(builder, _o.getNegativeInfinityDefault());\n    addDoubleInfDefault(builder, _o.getDoubleInfDefault());\n    return endMonster(builder);\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/Monster.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example\n\nimport com.google.flatbuffers.BaseVector\nimport com.google.flatbuffers.BooleanVector\nimport com.google.flatbuffers.ByteVector\nimport com.google.flatbuffers.Constants\nimport com.google.flatbuffers.DoubleVector\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.FloatVector\nimport com.google.flatbuffers.LongVector\nimport com.google.flatbuffers.StringVector\nimport com.google.flatbuffers.Struct\nimport com.google.flatbuffers.Table\nimport com.google.flatbuffers.UnionVector\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport kotlin.math.sign\n\n/**\n * an example documentation comment: \"monster object\"\n */\n@Suppress(\"unused\")\nclass Monster : Table() {\n\n    fun __init(_i: Int, _bb: ByteBuffer)  {\n        __reset(_i, _bb)\n    }\n    fun __assign(_i: Int, _bb: ByteBuffer) : Monster {\n        __init(_i, _bb)\n        return this\n    }\n    val pos : MyGame.Example.Vec3? get() = pos(MyGame.Example.Vec3())\n    fun pos(obj: MyGame.Example.Vec3) : MyGame.Example.Vec3? {\n        val o = __offset(4)\n        return if (o != 0) {\n            obj.__assign(o + bb_pos, bb)\n        } else {\n            null\n        }\n    }\n    val mana : Short\n        get() {\n            val o = __offset(6)\n            return if(o != 0) bb.getShort(o + bb_pos) else 150\n        }\n    fun mutateMana(mana: Short) : Boolean {\n        val o = __offset(6)\n        return if (o != 0) {\n            bb.putShort(o + bb_pos, mana)\n            true\n        } else {\n            false\n        }\n    }\n    val hp : Short\n        get() {\n            val o = __offset(8)\n            return if(o != 0) bb.getShort(o + bb_pos) else 100\n        }\n    fun mutateHp(hp: Short) : Boolean {\n        val o = __offset(8)\n        return if (o != 0) {\n            bb.putShort(o + bb_pos, hp)\n            true\n        } else {\n            false\n        }\n    }\n    val name : String\n        get() {\n            val o = __offset(10)\n            return if (o != 0) {\n                __string(o + bb_pos)\n            } else {\n                throw AssertionError(\"No value for (required) field name\")\n            }\n        }\n    val nameAsByteBuffer : ByteBuffer get() = __vector_as_bytebuffer(10, 1)\n    fun nameInByteBuffer(_bb: ByteBuffer) : ByteBuffer = __vector_in_bytebuffer(_bb, 10, 1)\n    fun inventory(j: Int) : UByte {\n        val o = __offset(14)\n        return if (o != 0) {\n            bb.get(__vector(o) + j * 1).toUByte()\n        } else {\n            0u\n        }\n    }\n    val inventoryLength : Int\n        get() {\n            val o = __offset(14); return if (o != 0) __vector_len(o) else 0\n        }\n    val inventoryAsByteBuffer : ByteBuffer? get() = __vector_as_bytebuffer(14, 1)\n    fun inventoryInByteBuffer(_bb: ByteBuffer) : ByteBuffer? = __vector_in_bytebuffer(_bb, 14, 1)\n    fun mutateInventory(j: Int, inventory: UByte) : Boolean {\n        val o = __offset(14)\n        return if (o != 0) {\n            bb.put(__vector(o) + j * 1, inventory.toByte())\n            true\n        } else {\n            false\n        }\n    }\n    val color : UByte\n        get() {\n            val o = __offset(16)\n            return if(o != 0) bb.get(o + bb_pos).toUByte() else 8u\n        }\n    fun mutateColor(color: UByte) : Boolean {\n        val o = __offset(16)\n        return if (o != 0) {\n            bb.put(o + bb_pos, color.toByte())\n            true\n        } else {\n            false\n        }\n    }\n    val testType : UByte\n        get() {\n            val o = __offset(18)\n            return if(o != 0) bb.get(o + bb_pos).toUByte() else 0u\n        }\n    fun mutateTestType(testType: UByte) : Boolean {\n        val o = __offset(18)\n        return if (o != 0) {\n            bb.put(o + bb_pos, testType.toByte())\n            true\n        } else {\n            false\n        }\n    }\n    fun test(obj: Table) : Table? {\n        val o = __offset(20); return if (o != 0) __union(obj, o + bb_pos) else null\n    }\n    fun test4(j: Int) : MyGame.Example.Test? = test4(MyGame.Example.Test(), j)\n    fun test4(obj: MyGame.Example.Test, j: Int) : MyGame.Example.Test? {\n        val o = __offset(22)\n        return if (o != 0) {\n            obj.__assign(__vector(o) + j * 4, bb)\n        } else {\n            null\n        }\n    }\n    val test4Length : Int\n        get() {\n            val o = __offset(22); return if (o != 0) __vector_len(o) else 0\n        }\n    fun testarrayofstring(j: Int) : String? {\n        val o = __offset(24)\n        return if (o != 0) {\n            __string(__vector(o) + j * 4)\n        } else {\n            null\n        }\n    }\n    val testarrayofstringLength : Int\n        get() {\n            val o = __offset(24); return if (o != 0) __vector_len(o) else 0\n        }\n    /**\n     * an example documentation comment: this will end up in the generated code\n     * multiline too\n     */\n    fun testarrayoftables(j: Int) : MyGame.Example.Monster? = testarrayoftables(MyGame.Example.Monster(), j)\n    fun testarrayoftables(obj: MyGame.Example.Monster, j: Int) : MyGame.Example.Monster? {\n        val o = __offset(26)\n        return if (o != 0) {\n            obj.__assign(__indirect(__vector(o) + j * 4), bb)\n        } else {\n            null\n        }\n    }\n    val testarrayoftablesLength : Int\n        get() {\n            val o = __offset(26); return if (o != 0) __vector_len(o) else 0\n        }\n    fun testarrayoftablesByKey(key: String) : MyGame.Example.Monster? {\n        val o = __offset(26)\n        return if (o != 0) {\n            MyGame.Example.Monster.__lookup_by_key(null, __vector(o), key, bb)\n        } else {\n            null\n        }\n    }\n    fun testarrayoftablesByKey(obj: MyGame.Example.Monster, key: String) : MyGame.Example.Monster? {\n        val o = __offset(26)\n        return if (o != 0) {\n            MyGame.Example.Monster.__lookup_by_key(obj, __vector(o), key, bb)\n        } else {\n            null\n        }\n    }\n    val enemy : MyGame.Example.Monster? get() = enemy(MyGame.Example.Monster())\n    fun enemy(obj: MyGame.Example.Monster) : MyGame.Example.Monster? {\n        val o = __offset(28)\n        return if (o != 0) {\n            obj.__assign(__indirect(o + bb_pos), bb)\n        } else {\n            null\n        }\n    }\n    fun testnestedflatbuffer(j: Int) : UByte {\n        val o = __offset(30)\n        return if (o != 0) {\n            bb.get(__vector(o) + j * 1).toUByte()\n        } else {\n            0u\n        }\n    }\n    val testnestedflatbufferLength : Int\n        get() {\n            val o = __offset(30); return if (o != 0) __vector_len(o) else 0\n        }\n    val testnestedflatbufferAsByteBuffer : ByteBuffer? get() = __vector_as_bytebuffer(30, 1)\n    fun testnestedflatbufferInByteBuffer(_bb: ByteBuffer) : ByteBuffer? = __vector_in_bytebuffer(_bb, 30, 1)\n    val testnestedflatbufferAsMonster : MyGame.Example.Monster? get() = testnestedflatbufferAsMonster(MyGame.Example.Monster())\n    fun testnestedflatbufferAsMonster(obj: MyGame.Example.Monster) : MyGame.Example.Monster? {\n        val o = __offset(30)\n        return if (o != 0) {\n            obj.__assign(__indirect(__vector(o)), bb)\n        } else {\n            null\n        }\n    }\n    fun mutateTestnestedflatbuffer(j: Int, testnestedflatbuffer: UByte) : Boolean {\n        val o = __offset(30)\n        return if (o != 0) {\n            bb.put(__vector(o) + j * 1, testnestedflatbuffer.toByte())\n            true\n        } else {\n            false\n        }\n    }\n    val testempty : MyGame.Example.Stat? get() = testempty(MyGame.Example.Stat())\n    fun testempty(obj: MyGame.Example.Stat) : MyGame.Example.Stat? {\n        val o = __offset(32)\n        return if (o != 0) {\n            obj.__assign(__indirect(o + bb_pos), bb)\n        } else {\n            null\n        }\n    }\n    val testbool : Boolean\n        get() {\n            val o = __offset(34)\n            return if(o != 0) 0.toByte() != bb.get(o + bb_pos) else false\n        }\n    fun mutateTestbool(testbool: Boolean) : Boolean {\n        val o = __offset(34)\n        return if (o != 0) {\n            bb.put(o + bb_pos, (if(testbool) 1 else 0).toByte())\n            true\n        } else {\n            false\n        }\n    }\n    val testhashs32Fnv1 : Int\n        get() {\n            val o = __offset(36)\n            return if(o != 0) bb.getInt(o + bb_pos) else 0\n        }\n    fun mutateTesthashs32Fnv1(testhashs32Fnv1: Int) : Boolean {\n        val o = __offset(36)\n        return if (o != 0) {\n            bb.putInt(o + bb_pos, testhashs32Fnv1)\n            true\n        } else {\n            false\n        }\n    }\n    val testhashu32Fnv1 : UInt\n        get() {\n            val o = __offset(38)\n            return if(o != 0) bb.getInt(o + bb_pos).toUInt() else 0u\n        }\n    fun mutateTesthashu32Fnv1(testhashu32Fnv1: UInt) : Boolean {\n        val o = __offset(38)\n        return if (o != 0) {\n            bb.putInt(o + bb_pos, testhashu32Fnv1.toInt())\n            true\n        } else {\n            false\n        }\n    }\n    val testhashs64Fnv1 : Long\n        get() {\n            val o = __offset(40)\n            return if(o != 0) bb.getLong(o + bb_pos) else 0L\n        }\n    fun mutateTesthashs64Fnv1(testhashs64Fnv1: Long) : Boolean {\n        val o = __offset(40)\n        return if (o != 0) {\n            bb.putLong(o + bb_pos, testhashs64Fnv1)\n            true\n        } else {\n            false\n        }\n    }\n    val testhashu64Fnv1 : ULong\n        get() {\n            val o = __offset(42)\n            return if(o != 0) bb.getLong(o + bb_pos).toULong() else 0UL\n        }\n    fun mutateTesthashu64Fnv1(testhashu64Fnv1: ULong) : Boolean {\n        val o = __offset(42)\n        return if (o != 0) {\n            bb.putLong(o + bb_pos, testhashu64Fnv1.toLong())\n            true\n        } else {\n            false\n        }\n    }\n    val testhashs32Fnv1a : Int\n        get() {\n            val o = __offset(44)\n            return if(o != 0) bb.getInt(o + bb_pos) else 0\n        }\n    fun mutateTesthashs32Fnv1a(testhashs32Fnv1a: Int) : Boolean {\n        val o = __offset(44)\n        return if (o != 0) {\n            bb.putInt(o + bb_pos, testhashs32Fnv1a)\n            true\n        } else {\n            false\n        }\n    }\n    val testhashu32Fnv1a : UInt\n        get() {\n            val o = __offset(46)\n            return if(o != 0) bb.getInt(o + bb_pos).toUInt() else 0u\n        }\n    fun mutateTesthashu32Fnv1a(testhashu32Fnv1a: UInt) : Boolean {\n        val o = __offset(46)\n        return if (o != 0) {\n            bb.putInt(o + bb_pos, testhashu32Fnv1a.toInt())\n            true\n        } else {\n            false\n        }\n    }\n    val testhashs64Fnv1a : Long\n        get() {\n            val o = __offset(48)\n            return if(o != 0) bb.getLong(o + bb_pos) else 0L\n        }\n    fun mutateTesthashs64Fnv1a(testhashs64Fnv1a: Long) : Boolean {\n        val o = __offset(48)\n        return if (o != 0) {\n            bb.putLong(o + bb_pos, testhashs64Fnv1a)\n            true\n        } else {\n            false\n        }\n    }\n    val testhashu64Fnv1a : ULong\n        get() {\n            val o = __offset(50)\n            return if(o != 0) bb.getLong(o + bb_pos).toULong() else 0UL\n        }\n    fun mutateTesthashu64Fnv1a(testhashu64Fnv1a: ULong) : Boolean {\n        val o = __offset(50)\n        return if (o != 0) {\n            bb.putLong(o + bb_pos, testhashu64Fnv1a.toLong())\n            true\n        } else {\n            false\n        }\n    }\n    fun testarrayofbools(j: Int) : Boolean {\n        val o = __offset(52)\n        return if (o != 0) {\n            0.toByte() != bb.get(__vector(o) + j * 1)\n        } else {\n            false\n        }\n    }\n    val testarrayofboolsLength : Int\n        get() {\n            val o = __offset(52); return if (o != 0) __vector_len(o) else 0\n        }\n    val testarrayofboolsAsByteBuffer : ByteBuffer? get() = __vector_as_bytebuffer(52, 1)\n    fun testarrayofboolsInByteBuffer(_bb: ByteBuffer) : ByteBuffer? = __vector_in_bytebuffer(_bb, 52, 1)\n    fun mutateTestarrayofbools(j: Int, testarrayofbools: Boolean) : Boolean {\n        val o = __offset(52)\n        return if (o != 0) {\n            bb.put(__vector(o) + j * 1, (if(testarrayofbools) 1 else 0).toByte())\n            true\n        } else {\n            false\n        }\n    }\n    val testf : Float\n        get() {\n            val o = __offset(54)\n            return if(o != 0) bb.getFloat(o + bb_pos) else 3.14159f\n        }\n    fun mutateTestf(testf: Float) : Boolean {\n        val o = __offset(54)\n        return if (o != 0) {\n            bb.putFloat(o + bb_pos, testf)\n            true\n        } else {\n            false\n        }\n    }\n    val testf2 : Float\n        get() {\n            val o = __offset(56)\n            return if(o != 0) bb.getFloat(o + bb_pos) else 3.0f\n        }\n    fun mutateTestf2(testf2: Float) : Boolean {\n        val o = __offset(56)\n        return if (o != 0) {\n            bb.putFloat(o + bb_pos, testf2)\n            true\n        } else {\n            false\n        }\n    }\n    val testf3 : Float\n        get() {\n            val o = __offset(58)\n            return if(o != 0) bb.getFloat(o + bb_pos) else 0.0f\n        }\n    fun mutateTestf3(testf3: Float) : Boolean {\n        val o = __offset(58)\n        return if (o != 0) {\n            bb.putFloat(o + bb_pos, testf3)\n            true\n        } else {\n            false\n        }\n    }\n    fun testarrayofstring2(j: Int) : String? {\n        val o = __offset(60)\n        return if (o != 0) {\n            __string(__vector(o) + j * 4)\n        } else {\n            null\n        }\n    }\n    val testarrayofstring2Length : Int\n        get() {\n            val o = __offset(60); return if (o != 0) __vector_len(o) else 0\n        }\n    fun testarrayofsortedstruct(j: Int) : MyGame.Example.Ability? = testarrayofsortedstruct(MyGame.Example.Ability(), j)\n    fun testarrayofsortedstruct(obj: MyGame.Example.Ability, j: Int) : MyGame.Example.Ability? {\n        val o = __offset(62)\n        return if (o != 0) {\n            obj.__assign(__vector(o) + j * 8, bb)\n        } else {\n            null\n        }\n    }\n    val testarrayofsortedstructLength : Int\n        get() {\n            val o = __offset(62); return if (o != 0) __vector_len(o) else 0\n        }\n    fun flex(j: Int) : UByte {\n        val o = __offset(64)\n        return if (o != 0) {\n            bb.get(__vector(o) + j * 1).toUByte()\n        } else {\n            0u\n        }\n    }\n    val flexLength : Int\n        get() {\n            val o = __offset(64); return if (o != 0) __vector_len(o) else 0\n        }\n    val flexAsByteBuffer : ByteBuffer? get() = __vector_as_bytebuffer(64, 1)\n    fun flexInByteBuffer(_bb: ByteBuffer) : ByteBuffer? = __vector_in_bytebuffer(_bb, 64, 1)\n    fun mutateFlex(j: Int, flex: UByte) : Boolean {\n        val o = __offset(64)\n        return if (o != 0) {\n            bb.put(__vector(o) + j * 1, flex.toByte())\n            true\n        } else {\n            false\n        }\n    }\n    fun test5(j: Int) : MyGame.Example.Test? = test5(MyGame.Example.Test(), j)\n    fun test5(obj: MyGame.Example.Test, j: Int) : MyGame.Example.Test? {\n        val o = __offset(66)\n        return if (o != 0) {\n            obj.__assign(__vector(o) + j * 4, bb)\n        } else {\n            null\n        }\n    }\n    val test5Length : Int\n        get() {\n            val o = __offset(66); return if (o != 0) __vector_len(o) else 0\n        }\n    fun vectorOfLongs(j: Int) : Long {\n        val o = __offset(68)\n        return if (o != 0) {\n            bb.getLong(__vector(o) + j * 8)\n        } else {\n            0\n        }\n    }\n    val vectorOfLongsLength : Int\n        get() {\n            val o = __offset(68); return if (o != 0) __vector_len(o) else 0\n        }\n    val vectorOfLongsAsByteBuffer : ByteBuffer? get() = __vector_as_bytebuffer(68, 8)\n    fun vectorOfLongsInByteBuffer(_bb: ByteBuffer) : ByteBuffer? = __vector_in_bytebuffer(_bb, 68, 8)\n    fun mutateVectorOfLongs(j: Int, vectorOfLongs: Long) : Boolean {\n        val o = __offset(68)\n        return if (o != 0) {\n            bb.putLong(__vector(o) + j * 8, vectorOfLongs)\n            true\n        } else {\n            false\n        }\n    }\n    fun vectorOfDoubles(j: Int) : Double {\n        val o = __offset(70)\n        return if (o != 0) {\n            bb.getDouble(__vector(o) + j * 8)\n        } else {\n            0.0\n        }\n    }\n    val vectorOfDoublesLength : Int\n        get() {\n            val o = __offset(70); return if (o != 0) __vector_len(o) else 0\n        }\n    val vectorOfDoublesAsByteBuffer : ByteBuffer? get() = __vector_as_bytebuffer(70, 8)\n    fun vectorOfDoublesInByteBuffer(_bb: ByteBuffer) : ByteBuffer? = __vector_in_bytebuffer(_bb, 70, 8)\n    fun mutateVectorOfDoubles(j: Int, vectorOfDoubles: Double) : Boolean {\n        val o = __offset(70)\n        return if (o != 0) {\n            bb.putDouble(__vector(o) + j * 8, vectorOfDoubles)\n            true\n        } else {\n            false\n        }\n    }\n    val parentNamespaceTest : MyGame.InParentNamespace? get() = parentNamespaceTest(MyGame.InParentNamespace())\n    fun parentNamespaceTest(obj: MyGame.InParentNamespace) : MyGame.InParentNamespace? {\n        val o = __offset(72)\n        return if (o != 0) {\n            obj.__assign(__indirect(o + bb_pos), bb)\n        } else {\n            null\n        }\n    }\n    fun vectorOfReferrables(j: Int) : MyGame.Example.Referrable? = vectorOfReferrables(MyGame.Example.Referrable(), j)\n    fun vectorOfReferrables(obj: MyGame.Example.Referrable, j: Int) : MyGame.Example.Referrable? {\n        val o = __offset(74)\n        return if (o != 0) {\n            obj.__assign(__indirect(__vector(o) + j * 4), bb)\n        } else {\n            null\n        }\n    }\n    val vectorOfReferrablesLength : Int\n        get() {\n            val o = __offset(74); return if (o != 0) __vector_len(o) else 0\n        }\n    fun vectorOfReferrablesByKey(key: ULong) : MyGame.Example.Referrable? {\n        val o = __offset(74)\n        return if (o != 0) {\n            MyGame.Example.Referrable.__lookup_by_key(null, __vector(o), key, bb)\n        } else {\n            null\n        }\n    }\n    fun vectorOfReferrablesByKey(obj: MyGame.Example.Referrable, key: ULong) : MyGame.Example.Referrable? {\n        val o = __offset(74)\n        return if (o != 0) {\n            MyGame.Example.Referrable.__lookup_by_key(obj, __vector(o), key, bb)\n        } else {\n            null\n        }\n    }\n    val singleWeakReference : ULong\n        get() {\n            val o = __offset(76)\n            return if(o != 0) bb.getLong(o + bb_pos).toULong() else 0UL\n        }\n    fun mutateSingleWeakReference(singleWeakReference: ULong) : Boolean {\n        val o = __offset(76)\n        return if (o != 0) {\n            bb.putLong(o + bb_pos, singleWeakReference.toLong())\n            true\n        } else {\n            false\n        }\n    }\n    fun vectorOfWeakReferences(j: Int) : ULong {\n        val o = __offset(78)\n        return if (o != 0) {\n            bb.getLong(__vector(o) + j * 8).toULong()\n        } else {\n            0uL\n        }\n    }\n    val vectorOfWeakReferencesLength : Int\n        get() {\n            val o = __offset(78); return if (o != 0) __vector_len(o) else 0\n        }\n    val vectorOfWeakReferencesAsByteBuffer : ByteBuffer? get() = __vector_as_bytebuffer(78, 8)\n    fun vectorOfWeakReferencesInByteBuffer(_bb: ByteBuffer) : ByteBuffer? = __vector_in_bytebuffer(_bb, 78, 8)\n    fun mutateVectorOfWeakReferences(j: Int, vectorOfWeakReferences: ULong) : Boolean {\n        val o = __offset(78)\n        return if (o != 0) {\n            bb.putLong(__vector(o) + j * 8, vectorOfWeakReferences.toLong())\n            true\n        } else {\n            false\n        }\n    }\n    fun vectorOfStrongReferrables(j: Int) : MyGame.Example.Referrable? = vectorOfStrongReferrables(MyGame.Example.Referrable(), j)\n    fun vectorOfStrongReferrables(obj: MyGame.Example.Referrable, j: Int) : MyGame.Example.Referrable? {\n        val o = __offset(80)\n        return if (o != 0) {\n            obj.__assign(__indirect(__vector(o) + j * 4), bb)\n        } else {\n            null\n        }\n    }\n    val vectorOfStrongReferrablesLength : Int\n        get() {\n            val o = __offset(80); return if (o != 0) __vector_len(o) else 0\n        }\n    fun vectorOfStrongReferrablesByKey(key: ULong) : MyGame.Example.Referrable? {\n        val o = __offset(80)\n        return if (o != 0) {\n            MyGame.Example.Referrable.__lookup_by_key(null, __vector(o), key, bb)\n        } else {\n            null\n        }\n    }\n    fun vectorOfStrongReferrablesByKey(obj: MyGame.Example.Referrable, key: ULong) : MyGame.Example.Referrable? {\n        val o = __offset(80)\n        return if (o != 0) {\n            MyGame.Example.Referrable.__lookup_by_key(obj, __vector(o), key, bb)\n        } else {\n            null\n        }\n    }\n    val coOwningReference : ULong\n        get() {\n            val o = __offset(82)\n            return if(o != 0) bb.getLong(o + bb_pos).toULong() else 0UL\n        }\n    fun mutateCoOwningReference(coOwningReference: ULong) : Boolean {\n        val o = __offset(82)\n        return if (o != 0) {\n            bb.putLong(o + bb_pos, coOwningReference.toLong())\n            true\n        } else {\n            false\n        }\n    }\n    fun vectorOfCoOwningReferences(j: Int) : ULong {\n        val o = __offset(84)\n        return if (o != 0) {\n            bb.getLong(__vector(o) + j * 8).toULong()\n        } else {\n            0uL\n        }\n    }\n    val vectorOfCoOwningReferencesLength : Int\n        get() {\n            val o = __offset(84); return if (o != 0) __vector_len(o) else 0\n        }\n    val vectorOfCoOwningReferencesAsByteBuffer : ByteBuffer? get() = __vector_as_bytebuffer(84, 8)\n    fun vectorOfCoOwningReferencesInByteBuffer(_bb: ByteBuffer) : ByteBuffer? = __vector_in_bytebuffer(_bb, 84, 8)\n    fun mutateVectorOfCoOwningReferences(j: Int, vectorOfCoOwningReferences: ULong) : Boolean {\n        val o = __offset(84)\n        return if (o != 0) {\n            bb.putLong(__vector(o) + j * 8, vectorOfCoOwningReferences.toLong())\n            true\n        } else {\n            false\n        }\n    }\n    val nonOwningReference : ULong\n        get() {\n            val o = __offset(86)\n            return if(o != 0) bb.getLong(o + bb_pos).toULong() else 0UL\n        }\n    fun mutateNonOwningReference(nonOwningReference: ULong) : Boolean {\n        val o = __offset(86)\n        return if (o != 0) {\n            bb.putLong(o + bb_pos, nonOwningReference.toLong())\n            true\n        } else {\n            false\n        }\n    }\n    fun vectorOfNonOwningReferences(j: Int) : ULong {\n        val o = __offset(88)\n        return if (o != 0) {\n            bb.getLong(__vector(o) + j * 8).toULong()\n        } else {\n            0uL\n        }\n    }\n    val vectorOfNonOwningReferencesLength : Int\n        get() {\n            val o = __offset(88); return if (o != 0) __vector_len(o) else 0\n        }\n    val vectorOfNonOwningReferencesAsByteBuffer : ByteBuffer? get() = __vector_as_bytebuffer(88, 8)\n    fun vectorOfNonOwningReferencesInByteBuffer(_bb: ByteBuffer) : ByteBuffer? = __vector_in_bytebuffer(_bb, 88, 8)\n    fun mutateVectorOfNonOwningReferences(j: Int, vectorOfNonOwningReferences: ULong) : Boolean {\n        val o = __offset(88)\n        return if (o != 0) {\n            bb.putLong(__vector(o) + j * 8, vectorOfNonOwningReferences.toLong())\n            true\n        } else {\n            false\n        }\n    }\n    val anyUniqueType : UByte\n        get() {\n            val o = __offset(90)\n            return if(o != 0) bb.get(o + bb_pos).toUByte() else 0u\n        }\n    fun mutateAnyUniqueType(anyUniqueType: UByte) : Boolean {\n        val o = __offset(90)\n        return if (o != 0) {\n            bb.put(o + bb_pos, anyUniqueType.toByte())\n            true\n        } else {\n            false\n        }\n    }\n    fun anyUnique(obj: Table) : Table? {\n        val o = __offset(92); return if (o != 0) __union(obj, o + bb_pos) else null\n    }\n    val anyAmbiguousType : UByte\n        get() {\n            val o = __offset(94)\n            return if(o != 0) bb.get(o + bb_pos).toUByte() else 0u\n        }\n    fun mutateAnyAmbiguousType(anyAmbiguousType: UByte) : Boolean {\n        val o = __offset(94)\n        return if (o != 0) {\n            bb.put(o + bb_pos, anyAmbiguousType.toByte())\n            true\n        } else {\n            false\n        }\n    }\n    fun anyAmbiguous(obj: Table) : Table? {\n        val o = __offset(96); return if (o != 0) __union(obj, o + bb_pos) else null\n    }\n    fun vectorOfEnums(j: Int) : UByte {\n        val o = __offset(98)\n        return if (o != 0) {\n            bb.get(__vector(o) + j * 1).toUByte()\n        } else {\n            0u\n        }\n    }\n    val vectorOfEnumsLength : Int\n        get() {\n            val o = __offset(98); return if (o != 0) __vector_len(o) else 0\n        }\n    val vectorOfEnumsAsByteBuffer : ByteBuffer? get() = __vector_as_bytebuffer(98, 1)\n    fun vectorOfEnumsInByteBuffer(_bb: ByteBuffer) : ByteBuffer? = __vector_in_bytebuffer(_bb, 98, 1)\n    fun mutateVectorOfEnums(j: Int, vectorOfEnums: UByte) : Boolean {\n        val o = __offset(98)\n        return if (o != 0) {\n            bb.put(__vector(o) + j * 1, vectorOfEnums.toByte())\n            true\n        } else {\n            false\n        }\n    }\n    val signedEnum : Byte\n        get() {\n            val o = __offset(100)\n            return if(o != 0) bb.get(o + bb_pos) else -1\n        }\n    fun mutateSignedEnum(signedEnum: Byte) : Boolean {\n        val o = __offset(100)\n        return if (o != 0) {\n            bb.put(o + bb_pos, signedEnum)\n            true\n        } else {\n            false\n        }\n    }\n    fun testrequirednestedflatbuffer(j: Int) : UByte {\n        val o = __offset(102)\n        return if (o != 0) {\n            bb.get(__vector(o) + j * 1).toUByte()\n        } else {\n            0u\n        }\n    }\n    val testrequirednestedflatbufferLength : Int\n        get() {\n            val o = __offset(102); return if (o != 0) __vector_len(o) else 0\n        }\n    val testrequirednestedflatbufferAsByteBuffer : ByteBuffer? get() = __vector_as_bytebuffer(102, 1)\n    fun testrequirednestedflatbufferInByteBuffer(_bb: ByteBuffer) : ByteBuffer? = __vector_in_bytebuffer(_bb, 102, 1)\n    val testrequirednestedflatbufferAsMonster : MyGame.Example.Monster? get() = testrequirednestedflatbufferAsMonster(MyGame.Example.Monster())\n    fun testrequirednestedflatbufferAsMonster(obj: MyGame.Example.Monster) : MyGame.Example.Monster? {\n        val o = __offset(102)\n        return if (o != 0) {\n            obj.__assign(__indirect(__vector(o)), bb)\n        } else {\n            null\n        }\n    }\n    fun mutateTestrequirednestedflatbuffer(j: Int, testrequirednestedflatbuffer: UByte) : Boolean {\n        val o = __offset(102)\n        return if (o != 0) {\n            bb.put(__vector(o) + j * 1, testrequirednestedflatbuffer.toByte())\n            true\n        } else {\n            false\n        }\n    }\n    fun scalarKeySortedTables(j: Int) : MyGame.Example.Stat? = scalarKeySortedTables(MyGame.Example.Stat(), j)\n    fun scalarKeySortedTables(obj: MyGame.Example.Stat, j: Int) : MyGame.Example.Stat? {\n        val o = __offset(104)\n        return if (o != 0) {\n            obj.__assign(__indirect(__vector(o) + j * 4), bb)\n        } else {\n            null\n        }\n    }\n    val scalarKeySortedTablesLength : Int\n        get() {\n            val o = __offset(104); return if (o != 0) __vector_len(o) else 0\n        }\n    fun scalarKeySortedTablesByKey(key: UShort) : MyGame.Example.Stat? {\n        val o = __offset(104)\n        return if (o != 0) {\n            MyGame.Example.Stat.__lookup_by_key(null, __vector(o), key, bb)\n        } else {\n            null\n        }\n    }\n    fun scalarKeySortedTablesByKey(obj: MyGame.Example.Stat, key: UShort) : MyGame.Example.Stat? {\n        val o = __offset(104)\n        return if (o != 0) {\n            MyGame.Example.Stat.__lookup_by_key(obj, __vector(o), key, bb)\n        } else {\n            null\n        }\n    }\n    val nativeInline : MyGame.Example.Test? get() = nativeInline(MyGame.Example.Test())\n    fun nativeInline(obj: MyGame.Example.Test) : MyGame.Example.Test? {\n        val o = __offset(106)\n        return if (o != 0) {\n            obj.__assign(o + bb_pos, bb)\n        } else {\n            null\n        }\n    }\n    val longEnumNonEnumDefault : ULong\n        get() {\n            val o = __offset(108)\n            return if(o != 0) bb.getLong(o + bb_pos).toULong() else 0UL\n        }\n    fun mutateLongEnumNonEnumDefault(longEnumNonEnumDefault: ULong) : Boolean {\n        val o = __offset(108)\n        return if (o != 0) {\n            bb.putLong(o + bb_pos, longEnumNonEnumDefault.toLong())\n            true\n        } else {\n            false\n        }\n    }\n    val longEnumNormalDefault : ULong\n        get() {\n            val o = __offset(110)\n            return if(o != 0) bb.getLong(o + bb_pos).toULong() else 2UL\n        }\n    fun mutateLongEnumNormalDefault(longEnumNormalDefault: ULong) : Boolean {\n        val o = __offset(110)\n        return if (o != 0) {\n            bb.putLong(o + bb_pos, longEnumNormalDefault.toLong())\n            true\n        } else {\n            false\n        }\n    }\n    val nanDefault : Float\n        get() {\n            val o = __offset(112)\n            return if(o != 0) bb.getFloat(o + bb_pos) else Float.NaN\n        }\n    fun mutateNanDefault(nanDefault: Float) : Boolean {\n        val o = __offset(112)\n        return if (o != 0) {\n            bb.putFloat(o + bb_pos, nanDefault)\n            true\n        } else {\n            false\n        }\n    }\n    val infDefault : Float\n        get() {\n            val o = __offset(114)\n            return if(o != 0) bb.getFloat(o + bb_pos) else Float.POSITIVE_INFINITY\n        }\n    fun mutateInfDefault(infDefault: Float) : Boolean {\n        val o = __offset(114)\n        return if (o != 0) {\n            bb.putFloat(o + bb_pos, infDefault)\n            true\n        } else {\n            false\n        }\n    }\n    val positiveInfDefault : Float\n        get() {\n            val o = __offset(116)\n            return if(o != 0) bb.getFloat(o + bb_pos) else Float.POSITIVE_INFINITY\n        }\n    fun mutatePositiveInfDefault(positiveInfDefault: Float) : Boolean {\n        val o = __offset(116)\n        return if (o != 0) {\n            bb.putFloat(o + bb_pos, positiveInfDefault)\n            true\n        } else {\n            false\n        }\n    }\n    val infinityDefault : Float\n        get() {\n            val o = __offset(118)\n            return if(o != 0) bb.getFloat(o + bb_pos) else Float.POSITIVE_INFINITY\n        }\n    fun mutateInfinityDefault(infinityDefault: Float) : Boolean {\n        val o = __offset(118)\n        return if (o != 0) {\n            bb.putFloat(o + bb_pos, infinityDefault)\n            true\n        } else {\n            false\n        }\n    }\n    val positiveInfinityDefault : Float\n        get() {\n            val o = __offset(120)\n            return if(o != 0) bb.getFloat(o + bb_pos) else Float.POSITIVE_INFINITY\n        }\n    fun mutatePositiveInfinityDefault(positiveInfinityDefault: Float) : Boolean {\n        val o = __offset(120)\n        return if (o != 0) {\n            bb.putFloat(o + bb_pos, positiveInfinityDefault)\n            true\n        } else {\n            false\n        }\n    }\n    val negativeInfDefault : Float\n        get() {\n            val o = __offset(122)\n            return if(o != 0) bb.getFloat(o + bb_pos) else Float.NEGATIVE_INFINITY\n        }\n    fun mutateNegativeInfDefault(negativeInfDefault: Float) : Boolean {\n        val o = __offset(122)\n        return if (o != 0) {\n            bb.putFloat(o + bb_pos, negativeInfDefault)\n            true\n        } else {\n            false\n        }\n    }\n    val negativeInfinityDefault : Float\n        get() {\n            val o = __offset(124)\n            return if(o != 0) bb.getFloat(o + bb_pos) else Float.NEGATIVE_INFINITY\n        }\n    fun mutateNegativeInfinityDefault(negativeInfinityDefault: Float) : Boolean {\n        val o = __offset(124)\n        return if (o != 0) {\n            bb.putFloat(o + bb_pos, negativeInfinityDefault)\n            true\n        } else {\n            false\n        }\n    }\n    val doubleInfDefault : Double\n        get() {\n            val o = __offset(126)\n            return if(o != 0) bb.getDouble(o + bb_pos) else Double.POSITIVE_INFINITY\n        }\n    fun mutateDoubleInfDefault(doubleInfDefault: Double) : Boolean {\n        val o = __offset(126)\n        return if (o != 0) {\n            bb.putDouble(o + bb_pos, doubleInfDefault)\n            true\n        } else {\n            false\n        }\n    }\n    override fun keysCompare(o1: Int, o2: Int, _bb: ByteBuffer) : Int {\n         return compareStrings(__offset(10, o1, _bb), __offset(10, o2, _bb), _bb)\n    }\n    companion object {\n        fun validateVersion() = Constants.FLATBUFFERS_25_12_19()\n        fun getRootAsMonster(_bb: ByteBuffer): Monster = getRootAsMonster(_bb, Monster())\n        fun getRootAsMonster(_bb: ByteBuffer, obj: Monster): Monster {\n            _bb.order(ByteOrder.LITTLE_ENDIAN)\n            return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb))\n        }\n        fun MonsterBufferHasIdentifier(_bb: ByteBuffer) : Boolean = __has_identifier(_bb, \"MONS\")\n        fun startMonster(builder: FlatBufferBuilder) = builder.startTable(62)\n        fun addPos(builder: FlatBufferBuilder, pos: Int) = builder.addStruct(0, pos, 0)\n        fun addMana(builder: FlatBufferBuilder, mana: Short) = builder.addShort(1, mana, 150)\n        fun addHp(builder: FlatBufferBuilder, hp: Short) = builder.addShort(2, hp, 100)\n        fun addName(builder: FlatBufferBuilder, name: Int)  {\n            builder.addOffset(name)\n            builder.slot(3)\n        }\n        fun addInventory(builder: FlatBufferBuilder, inventory: Int) = builder.addOffset(5, inventory, 0)\n        @kotlin.ExperimentalUnsignedTypes\n        fun createInventoryVector(builder: FlatBufferBuilder, data: UByteArray) : Int {\n            builder.startVector(1, data.size, 1)\n            for (i in data.size - 1 downTo 0) {\n                builder.addByte(data[i].toByte())\n            }\n            return builder.endVector()\n        }\n        fun startInventoryVector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(1, numElems, 1)\n        fun addColor(builder: FlatBufferBuilder, color: UByte) = builder.addByte(6, color.toByte(), 8)\n        fun addTestType(builder: FlatBufferBuilder, testType: UByte) = builder.addByte(7, testType.toByte(), 0)\n        fun addTest(builder: FlatBufferBuilder, test: Int) = builder.addOffset(8, test, 0)\n        fun addTest4(builder: FlatBufferBuilder, test4: Int) = builder.addOffset(9, test4, 0)\n        fun startTest4Vector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(4, numElems, 2)\n        fun addTestarrayofstring(builder: FlatBufferBuilder, testarrayofstring: Int) = builder.addOffset(10, testarrayofstring, 0)\n        fun createTestarrayofstringVector(builder: FlatBufferBuilder, data: IntArray) : Int {\n            builder.startVector(4, data.size, 4)\n            for (i in data.size - 1 downTo 0) {\n                builder.addOffset(data[i])\n            }\n            return builder.endVector()\n        }\n        fun startTestarrayofstringVector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(4, numElems, 4)\n        fun addTestarrayoftables(builder: FlatBufferBuilder, testarrayoftables: Int) = builder.addOffset(11, testarrayoftables, 0)\n        fun createTestarrayoftablesVector(builder: FlatBufferBuilder, data: IntArray) : Int {\n            builder.startVector(4, data.size, 4)\n            for (i in data.size - 1 downTo 0) {\n                builder.addOffset(data[i])\n            }\n            return builder.endVector()\n        }\n        fun startTestarrayoftablesVector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(4, numElems, 4)\n        fun addEnemy(builder: FlatBufferBuilder, enemy: Int) = builder.addOffset(12, enemy, 0)\n        fun addTestnestedflatbuffer(builder: FlatBufferBuilder, testnestedflatbuffer: Int) = builder.addOffset(13, testnestedflatbuffer, 0)\n        @kotlin.ExperimentalUnsignedTypes\n        fun createTestnestedflatbufferVector(builder: FlatBufferBuilder, data: UByteArray) : Int {\n            builder.startVector(1, data.size, 1)\n            for (i in data.size - 1 downTo 0) {\n                builder.addByte(data[i].toByte())\n            }\n            return builder.endVector()\n        }\n        fun startTestnestedflatbufferVector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(1, numElems, 1)\n        fun addTestempty(builder: FlatBufferBuilder, testempty: Int) = builder.addOffset(14, testempty, 0)\n        fun addTestbool(builder: FlatBufferBuilder, testbool: Boolean) = builder.addBoolean(15, testbool, false)\n        fun addTesthashs32Fnv1(builder: FlatBufferBuilder, testhashs32Fnv1: Int) = builder.addInt(16, testhashs32Fnv1, 0)\n        fun addTesthashu32Fnv1(builder: FlatBufferBuilder, testhashu32Fnv1: UInt) = builder.addInt(17, testhashu32Fnv1.toInt(), 0)\n        fun addTesthashs64Fnv1(builder: FlatBufferBuilder, testhashs64Fnv1: Long) = builder.addLong(18, testhashs64Fnv1, 0L)\n        fun addTesthashu64Fnv1(builder: FlatBufferBuilder, testhashu64Fnv1: ULong) = builder.addLong(19, testhashu64Fnv1.toLong(), 0)\n        fun addTesthashs32Fnv1a(builder: FlatBufferBuilder, testhashs32Fnv1a: Int) = builder.addInt(20, testhashs32Fnv1a, 0)\n        fun addTesthashu32Fnv1a(builder: FlatBufferBuilder, testhashu32Fnv1a: UInt) = builder.addInt(21, testhashu32Fnv1a.toInt(), 0)\n        fun addTesthashs64Fnv1a(builder: FlatBufferBuilder, testhashs64Fnv1a: Long) = builder.addLong(22, testhashs64Fnv1a, 0L)\n        fun addTesthashu64Fnv1a(builder: FlatBufferBuilder, testhashu64Fnv1a: ULong) = builder.addLong(23, testhashu64Fnv1a.toLong(), 0)\n        fun addTestarrayofbools(builder: FlatBufferBuilder, testarrayofbools: Int) = builder.addOffset(24, testarrayofbools, 0)\n        fun createTestarrayofboolsVector(builder: FlatBufferBuilder, data: BooleanArray) : Int {\n            builder.startVector(1, data.size, 1)\n            for (i in data.size - 1 downTo 0) {\n                builder.addBoolean(data[i])\n            }\n            return builder.endVector()\n        }\n        fun startTestarrayofboolsVector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(1, numElems, 1)\n        fun addTestf(builder: FlatBufferBuilder, testf: Float) = builder.addFloat(25, testf, 3.14159)\n        fun addTestf2(builder: FlatBufferBuilder, testf2: Float) = builder.addFloat(26, testf2, 3.0)\n        fun addTestf3(builder: FlatBufferBuilder, testf3: Float) = builder.addFloat(27, testf3, 0.0)\n        fun addTestarrayofstring2(builder: FlatBufferBuilder, testarrayofstring2: Int) = builder.addOffset(28, testarrayofstring2, 0)\n        fun createTestarrayofstring2Vector(builder: FlatBufferBuilder, data: IntArray) : Int {\n            builder.startVector(4, data.size, 4)\n            for (i in data.size - 1 downTo 0) {\n                builder.addOffset(data[i])\n            }\n            return builder.endVector()\n        }\n        fun startTestarrayofstring2Vector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(4, numElems, 4)\n        fun addTestarrayofsortedstruct(builder: FlatBufferBuilder, testarrayofsortedstruct: Int) = builder.addOffset(29, testarrayofsortedstruct, 0)\n        fun startTestarrayofsortedstructVector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(8, numElems, 4)\n        fun addFlex(builder: FlatBufferBuilder, flex: Int) = builder.addOffset(30, flex, 0)\n        @kotlin.ExperimentalUnsignedTypes\n        fun createFlexVector(builder: FlatBufferBuilder, data: UByteArray) : Int {\n            builder.startVector(1, data.size, 1)\n            for (i in data.size - 1 downTo 0) {\n                builder.addByte(data[i].toByte())\n            }\n            return builder.endVector()\n        }\n        fun startFlexVector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(1, numElems, 1)\n        fun addTest5(builder: FlatBufferBuilder, test5: Int) = builder.addOffset(31, test5, 0)\n        fun startTest5Vector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(4, numElems, 2)\n        fun addVectorOfLongs(builder: FlatBufferBuilder, vectorOfLongs: Int) = builder.addOffset(32, vectorOfLongs, 0)\n        fun createVectorOfLongsVector(builder: FlatBufferBuilder, data: LongArray) : Int {\n            builder.startVector(8, data.size, 8)\n            for (i in data.size - 1 downTo 0) {\n                builder.addLong(data[i])\n            }\n            return builder.endVector()\n        }\n        fun startVectorOfLongsVector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(8, numElems, 8)\n        fun addVectorOfDoubles(builder: FlatBufferBuilder, vectorOfDoubles: Int) = builder.addOffset(33, vectorOfDoubles, 0)\n        fun createVectorOfDoublesVector(builder: FlatBufferBuilder, data: DoubleArray) : Int {\n            builder.startVector(8, data.size, 8)\n            for (i in data.size - 1 downTo 0) {\n                builder.addDouble(data[i])\n            }\n            return builder.endVector()\n        }\n        fun startVectorOfDoublesVector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(8, numElems, 8)\n        fun addParentNamespaceTest(builder: FlatBufferBuilder, parentNamespaceTest: Int) = builder.addOffset(34, parentNamespaceTest, 0)\n        fun addVectorOfReferrables(builder: FlatBufferBuilder, vectorOfReferrables: Int) = builder.addOffset(35, vectorOfReferrables, 0)\n        fun createVectorOfReferrablesVector(builder: FlatBufferBuilder, data: IntArray) : Int {\n            builder.startVector(4, data.size, 4)\n            for (i in data.size - 1 downTo 0) {\n                builder.addOffset(data[i])\n            }\n            return builder.endVector()\n        }\n        fun startVectorOfReferrablesVector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(4, numElems, 4)\n        fun addSingleWeakReference(builder: FlatBufferBuilder, singleWeakReference: ULong) = builder.addLong(36, singleWeakReference.toLong(), 0)\n        fun addVectorOfWeakReferences(builder: FlatBufferBuilder, vectorOfWeakReferences: Int) = builder.addOffset(37, vectorOfWeakReferences, 0)\n        @kotlin.ExperimentalUnsignedTypes\n        fun createVectorOfWeakReferencesVector(builder: FlatBufferBuilder, data: ULongArray) : Int {\n            builder.startVector(8, data.size, 8)\n            for (i in data.size - 1 downTo 0) {\n                builder.addLong(data[i].toLong())\n            }\n            return builder.endVector()\n        }\n        fun startVectorOfWeakReferencesVector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(8, numElems, 8)\n        fun addVectorOfStrongReferrables(builder: FlatBufferBuilder, vectorOfStrongReferrables: Int) = builder.addOffset(38, vectorOfStrongReferrables, 0)\n        fun createVectorOfStrongReferrablesVector(builder: FlatBufferBuilder, data: IntArray) : Int {\n            builder.startVector(4, data.size, 4)\n            for (i in data.size - 1 downTo 0) {\n                builder.addOffset(data[i])\n            }\n            return builder.endVector()\n        }\n        fun startVectorOfStrongReferrablesVector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(4, numElems, 4)\n        fun addCoOwningReference(builder: FlatBufferBuilder, coOwningReference: ULong) = builder.addLong(39, coOwningReference.toLong(), 0)\n        fun addVectorOfCoOwningReferences(builder: FlatBufferBuilder, vectorOfCoOwningReferences: Int) = builder.addOffset(40, vectorOfCoOwningReferences, 0)\n        @kotlin.ExperimentalUnsignedTypes\n        fun createVectorOfCoOwningReferencesVector(builder: FlatBufferBuilder, data: ULongArray) : Int {\n            builder.startVector(8, data.size, 8)\n            for (i in data.size - 1 downTo 0) {\n                builder.addLong(data[i].toLong())\n            }\n            return builder.endVector()\n        }\n        fun startVectorOfCoOwningReferencesVector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(8, numElems, 8)\n        fun addNonOwningReference(builder: FlatBufferBuilder, nonOwningReference: ULong) = builder.addLong(41, nonOwningReference.toLong(), 0)\n        fun addVectorOfNonOwningReferences(builder: FlatBufferBuilder, vectorOfNonOwningReferences: Int) = builder.addOffset(42, vectorOfNonOwningReferences, 0)\n        @kotlin.ExperimentalUnsignedTypes\n        fun createVectorOfNonOwningReferencesVector(builder: FlatBufferBuilder, data: ULongArray) : Int {\n            builder.startVector(8, data.size, 8)\n            for (i in data.size - 1 downTo 0) {\n                builder.addLong(data[i].toLong())\n            }\n            return builder.endVector()\n        }\n        fun startVectorOfNonOwningReferencesVector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(8, numElems, 8)\n        fun addAnyUniqueType(builder: FlatBufferBuilder, anyUniqueType: UByte) = builder.addByte(43, anyUniqueType.toByte(), 0)\n        fun addAnyUnique(builder: FlatBufferBuilder, anyUnique: Int) = builder.addOffset(44, anyUnique, 0)\n        fun addAnyAmbiguousType(builder: FlatBufferBuilder, anyAmbiguousType: UByte) = builder.addByte(45, anyAmbiguousType.toByte(), 0)\n        fun addAnyAmbiguous(builder: FlatBufferBuilder, anyAmbiguous: Int) = builder.addOffset(46, anyAmbiguous, 0)\n        fun addVectorOfEnums(builder: FlatBufferBuilder, vectorOfEnums: Int) = builder.addOffset(47, vectorOfEnums, 0)\n        @kotlin.ExperimentalUnsignedTypes\n        fun createVectorOfEnumsVector(builder: FlatBufferBuilder, data: UByteArray) : Int {\n            builder.startVector(1, data.size, 1)\n            for (i in data.size - 1 downTo 0) {\n                builder.addByte(data[i].toByte())\n            }\n            return builder.endVector()\n        }\n        fun startVectorOfEnumsVector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(1, numElems, 1)\n        fun addSignedEnum(builder: FlatBufferBuilder, signedEnum: Byte) = builder.addByte(48, signedEnum, -1)\n        fun addTestrequirednestedflatbuffer(builder: FlatBufferBuilder, testrequirednestedflatbuffer: Int) = builder.addOffset(49, testrequirednestedflatbuffer, 0)\n        @kotlin.ExperimentalUnsignedTypes\n        fun createTestrequirednestedflatbufferVector(builder: FlatBufferBuilder, data: UByteArray) : Int {\n            builder.startVector(1, data.size, 1)\n            for (i in data.size - 1 downTo 0) {\n                builder.addByte(data[i].toByte())\n            }\n            return builder.endVector()\n        }\n        fun startTestrequirednestedflatbufferVector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(1, numElems, 1)\n        fun addScalarKeySortedTables(builder: FlatBufferBuilder, scalarKeySortedTables: Int) = builder.addOffset(50, scalarKeySortedTables, 0)\n        fun createScalarKeySortedTablesVector(builder: FlatBufferBuilder, data: IntArray) : Int {\n            builder.startVector(4, data.size, 4)\n            for (i in data.size - 1 downTo 0) {\n                builder.addOffset(data[i])\n            }\n            return builder.endVector()\n        }\n        fun startScalarKeySortedTablesVector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(4, numElems, 4)\n        fun addNativeInline(builder: FlatBufferBuilder, nativeInline: Int) = builder.addStruct(51, nativeInline, 0)\n        fun addLongEnumNonEnumDefault(builder: FlatBufferBuilder, longEnumNonEnumDefault: ULong) = builder.addLong(52, longEnumNonEnumDefault.toLong(), 0)\n        fun addLongEnumNormalDefault(builder: FlatBufferBuilder, longEnumNormalDefault: ULong) = builder.addLong(53, longEnumNormalDefault.toLong(), 2)\n        fun addNanDefault(builder: FlatBufferBuilder, nanDefault: Float) = builder.addFloat(54, nanDefault, Double.NaN)\n        fun addInfDefault(builder: FlatBufferBuilder, infDefault: Float) = builder.addFloat(55, infDefault, Double.POSITIVE_INFINITY)\n        fun addPositiveInfDefault(builder: FlatBufferBuilder, positiveInfDefault: Float) = builder.addFloat(56, positiveInfDefault, Double.POSITIVE_INFINITY)\n        fun addInfinityDefault(builder: FlatBufferBuilder, infinityDefault: Float) = builder.addFloat(57, infinityDefault, Double.POSITIVE_INFINITY)\n        fun addPositiveInfinityDefault(builder: FlatBufferBuilder, positiveInfinityDefault: Float) = builder.addFloat(58, positiveInfinityDefault, Double.POSITIVE_INFINITY)\n        fun addNegativeInfDefault(builder: FlatBufferBuilder, negativeInfDefault: Float) = builder.addFloat(59, negativeInfDefault, Double.NEGATIVE_INFINITY)\n        fun addNegativeInfinityDefault(builder: FlatBufferBuilder, negativeInfinityDefault: Float) = builder.addFloat(60, negativeInfinityDefault, Double.NEGATIVE_INFINITY)\n        fun addDoubleInfDefault(builder: FlatBufferBuilder, doubleInfDefault: Double) = builder.addDouble(61, doubleInfDefault, Double.POSITIVE_INFINITY)\n        fun endMonster(builder: FlatBufferBuilder) : Int {\n            val o = builder.endTable()\n                builder.required(o, 10)\n            return o\n        }\n        fun finishMonsterBuffer(builder: FlatBufferBuilder, offset: Int) = builder.finish(offset, \"MONS\")\n        fun finishSizePrefixedMonsterBuffer(builder: FlatBufferBuilder, offset: Int) = builder.finishSizePrefixed(offset, \"MONS\")\n        fun __lookup_by_key(obj: Monster?, vectorLocation: Int, key: String, bb: ByteBuffer) : Monster? {\n            val byteKey = key.toByteArray(java.nio.charset.StandardCharsets.UTF_8)\n            var span = bb.getInt(vectorLocation - 4)\n            var start = 0\n            while (span != 0) {\n                var middle = span / 2\n                val tableOffset = __indirect(vectorLocation + 4 * (start + middle), bb)\n                val comp = compareStrings(__offset(10, bb.capacity() - tableOffset, bb), byteKey, bb)\n                when {\n                    comp > 0 -> span = middle\n                    comp < 0 -> {\n                        middle++\n                        start += middle\n                        span -= middle\n                    }\n                    else -> {\n                        return (obj ?: Monster()).__assign(tableOffset, bb)\n                    }\n                }\n            }\n            return null\n        }\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Monster.lua",
    "content": "--[[ MyGame.Example.Monster\n\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : //monster_test.fbs\n  Rooting type : MyGame.Example.Monster (//monster_test.fbs)\n\n--]]\n\nlocal __MyGame_Example_Ability = require('MyGame.Example.Ability')\nlocal __MyGame_Example_Referrable = require('MyGame.Example.Referrable')\nlocal __MyGame_Example_Stat = require('MyGame.Example.Stat')\nlocal __MyGame_Example_Test = require('MyGame.Example.Test')\nlocal __MyGame_Example_Vec3 = require('MyGame.Example.Vec3')\nlocal __MyGame_InParentNamespace = require('MyGame.InParentNamespace')\nlocal flatbuffers = require('flatbuffers')\n\n-- an example documentation comment: \"monster object\"\nlocal Monster = {}\nlocal mt = {}\n\nfunction Monster.New()\n  local o = {}\n  setmetatable(o, {__index = mt})\n  return o\nend\n\nlocal FileIdentifier = \"MONS\"\n\nfunction Monster.GetRootAsMonster(buf, offset)\n  if type(buf) == \"string\" then\n    buf = flatbuffers.binaryArray.New(buf)\n  end\n\n  local n = flatbuffers.N.UOffsetT:Unpack(buf, offset)\n  local o = Monster.New()\n  o:Init(buf, n + offset)\n  return o\nend\n\nfunction mt:Init(buf, pos)\n  self.view = flatbuffers.view.New(buf, pos)\nend\n\nfunction mt:Pos()\n  local o = self.view:Offset(4)\n  if o ~= 0 then\n    local x = self.view.pos + o\n    local obj = __MyGame_Example_Vec3.New()\n    obj:Init(self.view.bytes, x)\n    return obj\n  end\nend\n\nfunction mt:Mana()\n  local o = self.view:Offset(6)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Int16, self.view.pos + o)\n  end\n  return 150\nend\n\nfunction mt:Hp()\n  local o = self.view:Offset(8)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Int16, self.view.pos + o)\n  end\n  return 100\nend\n\nfunction mt:Name()\n  local o = self.view:Offset(10)\n  if o ~= 0 then\n    return self.view:String(self.view.pos + o)\n  end\nend\n\nfunction mt:Inventory(j)\n  local o = self.view:Offset(14)\n  if o ~= 0 then\n    local a = self.view:Vector(o)\n    return self.view:Get(flatbuffers.N.Uint8, a + ((j-1) * 1))\n  end\n  return 0\nend\n\nfunction mt:InventoryAsString(start, stop)\n  return self.view:VectorAsString(14, start, stop)\nend\n\nfunction mt:InventoryLength()\n  local o = self.view:Offset(14)\n  if o ~= 0 then\n    return self.view:VectorLen(o)\n  end\n  return 0\nend\n\nfunction mt:Color()\n  local o = self.view:Offset(16)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Uint8, self.view.pos + o)\n  end\n  return 8\nend\n\nfunction mt:TestType()\n  local o = self.view:Offset(18)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Uint8, self.view.pos + o)\n  end\n  return 0\nend\n\nfunction mt:Test()\n  local o = self.view:Offset(20)\n  if o ~= 0 then\n   local obj = flatbuffers.view.New(flatbuffers.binaryArray.New(0), 0)\n    self.view:Union(obj, o)\n    return obj\n  end\nend\n\nfunction mt:Test4(j)\n  local o = self.view:Offset(22)\n  if o ~= 0 then\n    local x = self.view:Vector(o)\n    x = x + ((j-1) * 4)\n    local obj = __MyGame_Example_Test.New()\n    obj:Init(self.view.bytes, x)\n    return obj\n  end\nend\n\nfunction mt:Test4Length()\n  local o = self.view:Offset(22)\n  if o ~= 0 then\n    return self.view:VectorLen(o)\n  end\n  return 0\nend\n\nfunction mt:Testarrayofstring(j)\n  local o = self.view:Offset(24)\n  if o ~= 0 then\n    local a = self.view:Vector(o)\n    return self.view:String(a + ((j-1) * 4))\n  end\n  return ''\nend\n\nfunction mt:TestarrayofstringLength()\n  local o = self.view:Offset(24)\n  if o ~= 0 then\n    return self.view:VectorLen(o)\n  end\n  return 0\nend\n\n-- an example documentation comment: this will end up in the generated code\n-- multiline too\nfunction mt:Testarrayoftables(j)\n  local o = self.view:Offset(26)\n  if o ~= 0 then\n    local x = self.view:Vector(o)\n    x = x + ((j-1) * 4)\n    x = self.view:Indirect(x)\n    local obj = Monster.New()\n    obj:Init(self.view.bytes, x)\n    return obj\n  end\nend\n\nfunction mt:TestarrayoftablesLength()\n  local o = self.view:Offset(26)\n  if o ~= 0 then\n    return self.view:VectorLen(o)\n  end\n  return 0\nend\n\nfunction mt:Enemy()\n  local o = self.view:Offset(28)\n  if o ~= 0 then\n    local x = self.view:Indirect(self.view.pos + o)\n    local obj = Monster.New()\n    obj:Init(self.view.bytes, x)\n    return obj\n  end\nend\n\nfunction mt:Testnestedflatbuffer(j)\n  local o = self.view:Offset(30)\n  if o ~= 0 then\n    local a = self.view:Vector(o)\n    return self.view:Get(flatbuffers.N.Uint8, a + ((j-1) * 1))\n  end\n  return 0\nend\n\nfunction mt:TestnestedflatbufferAsString(start, stop)\n  return self.view:VectorAsString(30, start, stop)\nend\n\nfunction mt:TestnestedflatbufferLength()\n  local o = self.view:Offset(30)\n  if o ~= 0 then\n    return self.view:VectorLen(o)\n  end\n  return 0\nend\n\nfunction mt:Testempty()\n  local o = self.view:Offset(32)\n  if o ~= 0 then\n    local x = self.view:Indirect(self.view.pos + o)\n    local obj = __MyGame_Example_Stat.New()\n    obj:Init(self.view.bytes, x)\n    return obj\n  end\nend\n\nfunction mt:Testbool()\n  local o = self.view:Offset(34)\n  if o ~= 0 then\n    return (self.view:Get(flatbuffers.N.Bool, self.view.pos + o) ~=0)\n  end\n  return false\nend\n\nfunction mt:Testhashs32Fnv1()\n  local o = self.view:Offset(36)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Int32, self.view.pos + o)\n  end\n  return 0\nend\n\nfunction mt:Testhashu32Fnv1()\n  local o = self.view:Offset(38)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Uint32, self.view.pos + o)\n  end\n  return 0\nend\n\nfunction mt:Testhashs64Fnv1()\n  local o = self.view:Offset(40)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Int64, self.view.pos + o)\n  end\n  return 0\nend\n\nfunction mt:Testhashu64Fnv1()\n  local o = self.view:Offset(42)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Uint64, self.view.pos + o)\n  end\n  return 0\nend\n\nfunction mt:Testhashs32Fnv1a()\n  local o = self.view:Offset(44)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Int32, self.view.pos + o)\n  end\n  return 0\nend\n\nfunction mt:Testhashu32Fnv1a()\n  local o = self.view:Offset(46)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Uint32, self.view.pos + o)\n  end\n  return 0\nend\n\nfunction mt:Testhashs64Fnv1a()\n  local o = self.view:Offset(48)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Int64, self.view.pos + o)\n  end\n  return 0\nend\n\nfunction mt:Testhashu64Fnv1a()\n  local o = self.view:Offset(50)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Uint64, self.view.pos + o)\n  end\n  return 0\nend\n\nfunction mt:Testarrayofbools(j)\n  local o = self.view:Offset(52)\n  if o ~= 0 then\n    local a = self.view:Vector(o)\n    return self.view:Get(flatbuffers.N.Bool, a + ((j-1) * 1))\n  end\n  return 0\nend\n\nfunction mt:TestarrayofboolsAsString(start, stop)\n  return self.view:VectorAsString(52, start, stop)\nend\n\nfunction mt:TestarrayofboolsLength()\n  local o = self.view:Offset(52)\n  if o ~= 0 then\n    return self.view:VectorLen(o)\n  end\n  return 0\nend\n\nfunction mt:Testf()\n  local o = self.view:Offset(54)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Float32, self.view.pos + o)\n  end\n  return 3.14159\nend\n\nfunction mt:Testf2()\n  local o = self.view:Offset(56)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Float32, self.view.pos + o)\n  end\n  return 3.0\nend\n\nfunction mt:Testf3()\n  local o = self.view:Offset(58)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Float32, self.view.pos + o)\n  end\n  return 0.0\nend\n\nfunction mt:Testarrayofstring2(j)\n  local o = self.view:Offset(60)\n  if o ~= 0 then\n    local a = self.view:Vector(o)\n    return self.view:String(a + ((j-1) * 4))\n  end\n  return ''\nend\n\nfunction mt:Testarrayofstring2Length()\n  local o = self.view:Offset(60)\n  if o ~= 0 then\n    return self.view:VectorLen(o)\n  end\n  return 0\nend\n\nfunction mt:Testarrayofsortedstruct(j)\n  local o = self.view:Offset(62)\n  if o ~= 0 then\n    local x = self.view:Vector(o)\n    x = x + ((j-1) * 8)\n    local obj = __MyGame_Example_Ability.New()\n    obj:Init(self.view.bytes, x)\n    return obj\n  end\nend\n\nfunction mt:TestarrayofsortedstructLength()\n  local o = self.view:Offset(62)\n  if o ~= 0 then\n    return self.view:VectorLen(o)\n  end\n  return 0\nend\n\nfunction mt:Flex(j)\n  local o = self.view:Offset(64)\n  if o ~= 0 then\n    local a = self.view:Vector(o)\n    return self.view:Get(flatbuffers.N.Uint8, a + ((j-1) * 1))\n  end\n  return 0\nend\n\nfunction mt:FlexAsString(start, stop)\n  return self.view:VectorAsString(64, start, stop)\nend\n\nfunction mt:FlexLength()\n  local o = self.view:Offset(64)\n  if o ~= 0 then\n    return self.view:VectorLen(o)\n  end\n  return 0\nend\n\nfunction mt:Test5(j)\n  local o = self.view:Offset(66)\n  if o ~= 0 then\n    local x = self.view:Vector(o)\n    x = x + ((j-1) * 4)\n    local obj = __MyGame_Example_Test.New()\n    obj:Init(self.view.bytes, x)\n    return obj\n  end\nend\n\nfunction mt:Test5Length()\n  local o = self.view:Offset(66)\n  if o ~= 0 then\n    return self.view:VectorLen(o)\n  end\n  return 0\nend\n\nfunction mt:VectorOfLongs(j)\n  local o = self.view:Offset(68)\n  if o ~= 0 then\n    local a = self.view:Vector(o)\n    return self.view:Get(flatbuffers.N.Int64, a + ((j-1) * 8))\n  end\n  return 0\nend\n\nfunction mt:VectorOfLongsLength()\n  local o = self.view:Offset(68)\n  if o ~= 0 then\n    return self.view:VectorLen(o)\n  end\n  return 0\nend\n\nfunction mt:VectorOfDoubles(j)\n  local o = self.view:Offset(70)\n  if o ~= 0 then\n    local a = self.view:Vector(o)\n    return self.view:Get(flatbuffers.N.Float64, a + ((j-1) * 8))\n  end\n  return 0\nend\n\nfunction mt:VectorOfDoublesLength()\n  local o = self.view:Offset(70)\n  if o ~= 0 then\n    return self.view:VectorLen(o)\n  end\n  return 0\nend\n\nfunction mt:ParentNamespaceTest()\n  local o = self.view:Offset(72)\n  if o ~= 0 then\n    local x = self.view:Indirect(self.view.pos + o)\n    local obj = __MyGame_InParentNamespace.New()\n    obj:Init(self.view.bytes, x)\n    return obj\n  end\nend\n\nfunction mt:VectorOfReferrables(j)\n  local o = self.view:Offset(74)\n  if o ~= 0 then\n    local x = self.view:Vector(o)\n    x = x + ((j-1) * 4)\n    x = self.view:Indirect(x)\n    local obj = __MyGame_Example_Referrable.New()\n    obj:Init(self.view.bytes, x)\n    return obj\n  end\nend\n\nfunction mt:VectorOfReferrablesLength()\n  local o = self.view:Offset(74)\n  if o ~= 0 then\n    return self.view:VectorLen(o)\n  end\n  return 0\nend\n\nfunction mt:SingleWeakReference()\n  local o = self.view:Offset(76)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Uint64, self.view.pos + o)\n  end\n  return 0\nend\n\nfunction mt:VectorOfWeakReferences(j)\n  local o = self.view:Offset(78)\n  if o ~= 0 then\n    local a = self.view:Vector(o)\n    return self.view:Get(flatbuffers.N.Uint64, a + ((j-1) * 8))\n  end\n  return 0\nend\n\nfunction mt:VectorOfWeakReferencesLength()\n  local o = self.view:Offset(78)\n  if o ~= 0 then\n    return self.view:VectorLen(o)\n  end\n  return 0\nend\n\nfunction mt:VectorOfStrongReferrables(j)\n  local o = self.view:Offset(80)\n  if o ~= 0 then\n    local x = self.view:Vector(o)\n    x = x + ((j-1) * 4)\n    x = self.view:Indirect(x)\n    local obj = __MyGame_Example_Referrable.New()\n    obj:Init(self.view.bytes, x)\n    return obj\n  end\nend\n\nfunction mt:VectorOfStrongReferrablesLength()\n  local o = self.view:Offset(80)\n  if o ~= 0 then\n    return self.view:VectorLen(o)\n  end\n  return 0\nend\n\nfunction mt:CoOwningReference()\n  local o = self.view:Offset(82)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Uint64, self.view.pos + o)\n  end\n  return 0\nend\n\nfunction mt:VectorOfCoOwningReferences(j)\n  local o = self.view:Offset(84)\n  if o ~= 0 then\n    local a = self.view:Vector(o)\n    return self.view:Get(flatbuffers.N.Uint64, a + ((j-1) * 8))\n  end\n  return 0\nend\n\nfunction mt:VectorOfCoOwningReferencesLength()\n  local o = self.view:Offset(84)\n  if o ~= 0 then\n    return self.view:VectorLen(o)\n  end\n  return 0\nend\n\nfunction mt:NonOwningReference()\n  local o = self.view:Offset(86)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Uint64, self.view.pos + o)\n  end\n  return 0\nend\n\nfunction mt:VectorOfNonOwningReferences(j)\n  local o = self.view:Offset(88)\n  if o ~= 0 then\n    local a = self.view:Vector(o)\n    return self.view:Get(flatbuffers.N.Uint64, a + ((j-1) * 8))\n  end\n  return 0\nend\n\nfunction mt:VectorOfNonOwningReferencesLength()\n  local o = self.view:Offset(88)\n  if o ~= 0 then\n    return self.view:VectorLen(o)\n  end\n  return 0\nend\n\nfunction mt:AnyUniqueType()\n  local o = self.view:Offset(90)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Uint8, self.view.pos + o)\n  end\n  return 0\nend\n\nfunction mt:AnyUnique()\n  local o = self.view:Offset(92)\n  if o ~= 0 then\n   local obj = flatbuffers.view.New(flatbuffers.binaryArray.New(0), 0)\n    self.view:Union(obj, o)\n    return obj\n  end\nend\n\nfunction mt:AnyAmbiguousType()\n  local o = self.view:Offset(94)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Uint8, self.view.pos + o)\n  end\n  return 0\nend\n\nfunction mt:AnyAmbiguous()\n  local o = self.view:Offset(96)\n  if o ~= 0 then\n   local obj = flatbuffers.view.New(flatbuffers.binaryArray.New(0), 0)\n    self.view:Union(obj, o)\n    return obj\n  end\nend\n\nfunction mt:VectorOfEnums(j)\n  local o = self.view:Offset(98)\n  if o ~= 0 then\n    local a = self.view:Vector(o)\n    return self.view:Get(flatbuffers.N.Uint8, a + ((j-1) * 1))\n  end\n  return 0\nend\n\nfunction mt:VectorOfEnumsAsString(start, stop)\n  return self.view:VectorAsString(98, start, stop)\nend\n\nfunction mt:VectorOfEnumsLength()\n  local o = self.view:Offset(98)\n  if o ~= 0 then\n    return self.view:VectorLen(o)\n  end\n  return 0\nend\n\nfunction mt:SignedEnum()\n  local o = self.view:Offset(100)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Int8, self.view.pos + o)\n  end\n  return -1\nend\n\nfunction mt:Testrequirednestedflatbuffer(j)\n  local o = self.view:Offset(102)\n  if o ~= 0 then\n    local a = self.view:Vector(o)\n    return self.view:Get(flatbuffers.N.Uint8, a + ((j-1) * 1))\n  end\n  return 0\nend\n\nfunction mt:TestrequirednestedflatbufferAsString(start, stop)\n  return self.view:VectorAsString(102, start, stop)\nend\n\nfunction mt:TestrequirednestedflatbufferLength()\n  local o = self.view:Offset(102)\n  if o ~= 0 then\n    return self.view:VectorLen(o)\n  end\n  return 0\nend\n\nfunction mt:ScalarKeySortedTables(j)\n  local o = self.view:Offset(104)\n  if o ~= 0 then\n    local x = self.view:Vector(o)\n    x = x + ((j-1) * 4)\n    x = self.view:Indirect(x)\n    local obj = __MyGame_Example_Stat.New()\n    obj:Init(self.view.bytes, x)\n    return obj\n  end\nend\n\nfunction mt:ScalarKeySortedTablesLength()\n  local o = self.view:Offset(104)\n  if o ~= 0 then\n    return self.view:VectorLen(o)\n  end\n  return 0\nend\n\nfunction mt:NativeInline()\n  local o = self.view:Offset(106)\n  if o ~= 0 then\n    local x = self.view.pos + o\n    local obj = __MyGame_Example_Test.New()\n    obj:Init(self.view.bytes, x)\n    return obj\n  end\nend\n\nfunction mt:LongEnumNonEnumDefault()\n  local o = self.view:Offset(108)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Uint64, self.view.pos + o)\n  end\n  return 0\nend\n\nfunction mt:LongEnumNormalDefault()\n  local o = self.view:Offset(110)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Uint64, self.view.pos + o)\n  end\n  return 2\nend\n\nfunction mt:NanDefault()\n  local o = self.view:Offset(112)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Float32, self.view.pos + o)\n  end\n  return nan\nend\n\nfunction mt:InfDefault()\n  local o = self.view:Offset(114)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Float32, self.view.pos + o)\n  end\n  return inf\nend\n\nfunction mt:PositiveInfDefault()\n  local o = self.view:Offset(116)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Float32, self.view.pos + o)\n  end\n  return inf\nend\n\nfunction mt:InfinityDefault()\n  local o = self.view:Offset(118)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Float32, self.view.pos + o)\n  end\n  return inf\nend\n\nfunction mt:PositiveInfinityDefault()\n  local o = self.view:Offset(120)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Float32, self.view.pos + o)\n  end\n  return inf\nend\n\nfunction mt:NegativeInfDefault()\n  local o = self.view:Offset(122)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Float32, self.view.pos + o)\n  end\n  return -inf\nend\n\nfunction mt:NegativeInfinityDefault()\n  local o = self.view:Offset(124)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Float32, self.view.pos + o)\n  end\n  return -inf\nend\n\nfunction mt:DoubleInfDefault()\n  local o = self.view:Offset(126)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Float64, self.view.pos + o)\n  end\n  return inf\nend\n\nfunction Monster.Start(builder)\n  builder:StartObject(62)\nend\n\nfunction Monster.AddPos(builder, pos)\n  builder:PrependStructSlot(0, pos, 0)\nend\n\nfunction Monster.AddMana(builder, mana)\n  builder:PrependInt16Slot(1, mana, 150)\nend\n\nfunction Monster.AddHp(builder, hp)\n  builder:PrependInt16Slot(2, hp, 100)\nend\n\nfunction Monster.AddName(builder, name)\n  builder:PrependUOffsetTRelativeSlot(3, name, 0)\nend\n\nfunction Monster.AddInventory(builder, inventory)\n  builder:PrependUOffsetTRelativeSlot(5, inventory, 0)\nend\n\nfunction Monster.StartInventoryVector(builder, numElems)\n  return builder:StartVector(1, numElems, 1)\nend\n\nfunction Monster.AddColor(builder, color)\n  builder:PrependUint8Slot(6, color, 8)\nend\n\nfunction Monster.AddTestType(builder, testType)\n  builder:PrependUint8Slot(7, testType, 0)\nend\n\nfunction Monster.AddTest(builder, test)\n  builder:PrependUOffsetTRelativeSlot(8, test, 0)\nend\n\nfunction Monster.AddTest4(builder, test4)\n  builder:PrependUOffsetTRelativeSlot(9, test4, 0)\nend\n\nfunction Monster.StartTest4Vector(builder, numElems)\n  return builder:StartVector(4, numElems, 2)\nend\n\nfunction Monster.AddTestarrayofstring(builder, testarrayofstring)\n  builder:PrependUOffsetTRelativeSlot(10, testarrayofstring, 0)\nend\n\nfunction Monster.StartTestarrayofstringVector(builder, numElems)\n  return builder:StartVector(4, numElems, 4)\nend\n\nfunction Monster.AddTestarrayoftables(builder, testarrayoftables)\n  builder:PrependUOffsetTRelativeSlot(11, testarrayoftables, 0)\nend\n\nfunction Monster.StartTestarrayoftablesVector(builder, numElems)\n  return builder:StartVector(4, numElems, 4)\nend\n\nfunction Monster.AddEnemy(builder, enemy)\n  builder:PrependStructSlot(12, enemy, 0)\nend\n\nfunction Monster.AddTestnestedflatbuffer(builder, testnestedflatbuffer)\n  builder:PrependUOffsetTRelativeSlot(13, testnestedflatbuffer, 0)\nend\n\nfunction Monster.StartTestnestedflatbufferVector(builder, numElems)\n  return builder:StartVector(1, numElems, 1)\nend\n\nfunction Monster.AddTestempty(builder, testempty)\n  builder:PrependStructSlot(14, testempty, 0)\nend\n\nfunction Monster.AddTestbool(builder, testbool)\n  builder:PrependBoolSlot(15, testbool, false)\nend\n\nfunction Monster.AddTesthashs32Fnv1(builder, testhashs32Fnv1)\n  builder:PrependInt32Slot(16, testhashs32Fnv1, 0)\nend\n\nfunction Monster.AddTesthashu32Fnv1(builder, testhashu32Fnv1)\n  builder:PrependUint32Slot(17, testhashu32Fnv1, 0)\nend\n\nfunction Monster.AddTesthashs64Fnv1(builder, testhashs64Fnv1)\n  builder:PrependInt64Slot(18, testhashs64Fnv1, 0)\nend\n\nfunction Monster.AddTesthashu64Fnv1(builder, testhashu64Fnv1)\n  builder:PrependUint64Slot(19, testhashu64Fnv1, 0)\nend\n\nfunction Monster.AddTesthashs32Fnv1a(builder, testhashs32Fnv1a)\n  builder:PrependInt32Slot(20, testhashs32Fnv1a, 0)\nend\n\nfunction Monster.AddTesthashu32Fnv1a(builder, testhashu32Fnv1a)\n  builder:PrependUint32Slot(21, testhashu32Fnv1a, 0)\nend\n\nfunction Monster.AddTesthashs64Fnv1a(builder, testhashs64Fnv1a)\n  builder:PrependInt64Slot(22, testhashs64Fnv1a, 0)\nend\n\nfunction Monster.AddTesthashu64Fnv1a(builder, testhashu64Fnv1a)\n  builder:PrependUint64Slot(23, testhashu64Fnv1a, 0)\nend\n\nfunction Monster.AddTestarrayofbools(builder, testarrayofbools)\n  builder:PrependUOffsetTRelativeSlot(24, testarrayofbools, 0)\nend\n\nfunction Monster.StartTestarrayofboolsVector(builder, numElems)\n  return builder:StartVector(1, numElems, 1)\nend\n\nfunction Monster.AddTestf(builder, testf)\n  builder:PrependFloat32Slot(25, testf, 3.14159)\nend\n\nfunction Monster.AddTestf2(builder, testf2)\n  builder:PrependFloat32Slot(26, testf2, 3.0)\nend\n\nfunction Monster.AddTestf3(builder, testf3)\n  builder:PrependFloat32Slot(27, testf3, 0.0)\nend\n\nfunction Monster.AddTestarrayofstring2(builder, testarrayofstring2)\n  builder:PrependUOffsetTRelativeSlot(28, testarrayofstring2, 0)\nend\n\nfunction Monster.StartTestarrayofstring2Vector(builder, numElems)\n  return builder:StartVector(4, numElems, 4)\nend\n\nfunction Monster.AddTestarrayofsortedstruct(builder, testarrayofsortedstruct)\n  builder:PrependUOffsetTRelativeSlot(29, testarrayofsortedstruct, 0)\nend\n\nfunction Monster.StartTestarrayofsortedstructVector(builder, numElems)\n  return builder:StartVector(8, numElems, 4)\nend\n\nfunction Monster.AddFlex(builder, flex)\n  builder:PrependUOffsetTRelativeSlot(30, flex, 0)\nend\n\nfunction Monster.StartFlexVector(builder, numElems)\n  return builder:StartVector(1, numElems, 1)\nend\n\nfunction Monster.AddTest5(builder, test5)\n  builder:PrependUOffsetTRelativeSlot(31, test5, 0)\nend\n\nfunction Monster.StartTest5Vector(builder, numElems)\n  return builder:StartVector(4, numElems, 2)\nend\n\nfunction Monster.AddVectorOfLongs(builder, vectorOfLongs)\n  builder:PrependUOffsetTRelativeSlot(32, vectorOfLongs, 0)\nend\n\nfunction Monster.StartVectorOfLongsVector(builder, numElems)\n  return builder:StartVector(8, numElems, 8)\nend\n\nfunction Monster.AddVectorOfDoubles(builder, vectorOfDoubles)\n  builder:PrependUOffsetTRelativeSlot(33, vectorOfDoubles, 0)\nend\n\nfunction Monster.StartVectorOfDoublesVector(builder, numElems)\n  return builder:StartVector(8, numElems, 8)\nend\n\nfunction Monster.AddParentNamespaceTest(builder, parentNamespaceTest)\n  builder:PrependStructSlot(34, parentNamespaceTest, 0)\nend\n\nfunction Monster.AddVectorOfReferrables(builder, vectorOfReferrables)\n  builder:PrependUOffsetTRelativeSlot(35, vectorOfReferrables, 0)\nend\n\nfunction Monster.StartVectorOfReferrablesVector(builder, numElems)\n  return builder:StartVector(4, numElems, 4)\nend\n\nfunction Monster.AddSingleWeakReference(builder, singleWeakReference)\n  builder:PrependUint64Slot(36, singleWeakReference, 0)\nend\n\nfunction Monster.AddVectorOfWeakReferences(builder, vectorOfWeakReferences)\n  builder:PrependUOffsetTRelativeSlot(37, vectorOfWeakReferences, 0)\nend\n\nfunction Monster.StartVectorOfWeakReferencesVector(builder, numElems)\n  return builder:StartVector(8, numElems, 8)\nend\n\nfunction Monster.AddVectorOfStrongReferrables(builder, vectorOfStrongReferrables)\n  builder:PrependUOffsetTRelativeSlot(38, vectorOfStrongReferrables, 0)\nend\n\nfunction Monster.StartVectorOfStrongReferrablesVector(builder, numElems)\n  return builder:StartVector(4, numElems, 4)\nend\n\nfunction Monster.AddCoOwningReference(builder, coOwningReference)\n  builder:PrependUint64Slot(39, coOwningReference, 0)\nend\n\nfunction Monster.AddVectorOfCoOwningReferences(builder, vectorOfCoOwningReferences)\n  builder:PrependUOffsetTRelativeSlot(40, vectorOfCoOwningReferences, 0)\nend\n\nfunction Monster.StartVectorOfCoOwningReferencesVector(builder, numElems)\n  return builder:StartVector(8, numElems, 8)\nend\n\nfunction Monster.AddNonOwningReference(builder, nonOwningReference)\n  builder:PrependUint64Slot(41, nonOwningReference, 0)\nend\n\nfunction Monster.AddVectorOfNonOwningReferences(builder, vectorOfNonOwningReferences)\n  builder:PrependUOffsetTRelativeSlot(42, vectorOfNonOwningReferences, 0)\nend\n\nfunction Monster.StartVectorOfNonOwningReferencesVector(builder, numElems)\n  return builder:StartVector(8, numElems, 8)\nend\n\nfunction Monster.AddAnyUniqueType(builder, anyUniqueType)\n  builder:PrependUint8Slot(43, anyUniqueType, 0)\nend\n\nfunction Monster.AddAnyUnique(builder, anyUnique)\n  builder:PrependUOffsetTRelativeSlot(44, anyUnique, 0)\nend\n\nfunction Monster.AddAnyAmbiguousType(builder, anyAmbiguousType)\n  builder:PrependUint8Slot(45, anyAmbiguousType, 0)\nend\n\nfunction Monster.AddAnyAmbiguous(builder, anyAmbiguous)\n  builder:PrependUOffsetTRelativeSlot(46, anyAmbiguous, 0)\nend\n\nfunction Monster.AddVectorOfEnums(builder, vectorOfEnums)\n  builder:PrependUOffsetTRelativeSlot(47, vectorOfEnums, 0)\nend\n\nfunction Monster.StartVectorOfEnumsVector(builder, numElems)\n  return builder:StartVector(1, numElems, 1)\nend\n\nfunction Monster.AddSignedEnum(builder, signedEnum)\n  builder:PrependInt8Slot(48, signedEnum, -1)\nend\n\nfunction Monster.AddTestrequirednestedflatbuffer(builder, testrequirednestedflatbuffer)\n  builder:PrependUOffsetTRelativeSlot(49, testrequirednestedflatbuffer, 0)\nend\n\nfunction Monster.StartTestrequirednestedflatbufferVector(builder, numElems)\n  return builder:StartVector(1, numElems, 1)\nend\n\nfunction Monster.AddScalarKeySortedTables(builder, scalarKeySortedTables)\n  builder:PrependUOffsetTRelativeSlot(50, scalarKeySortedTables, 0)\nend\n\nfunction Monster.StartScalarKeySortedTablesVector(builder, numElems)\n  return builder:StartVector(4, numElems, 4)\nend\n\nfunction Monster.AddNativeInline(builder, nativeInline)\n  builder:PrependStructSlot(51, nativeInline, 0)\nend\n\nfunction Monster.AddLongEnumNonEnumDefault(builder, longEnumNonEnumDefault)\n  builder:PrependUint64Slot(52, longEnumNonEnumDefault, 0)\nend\n\nfunction Monster.AddLongEnumNormalDefault(builder, longEnumNormalDefault)\n  builder:PrependUint64Slot(53, longEnumNormalDefault, 2)\nend\n\nfunction Monster.AddNanDefault(builder, nanDefault)\n  builder:PrependFloat32Slot(54, nanDefault, nan)\nend\n\nfunction Monster.AddInfDefault(builder, infDefault)\n  builder:PrependFloat32Slot(55, infDefault, inf)\nend\n\nfunction Monster.AddPositiveInfDefault(builder, positiveInfDefault)\n  builder:PrependFloat32Slot(56, positiveInfDefault, inf)\nend\n\nfunction Monster.AddInfinityDefault(builder, infinityDefault)\n  builder:PrependFloat32Slot(57, infinityDefault, inf)\nend\n\nfunction Monster.AddPositiveInfinityDefault(builder, positiveInfinityDefault)\n  builder:PrependFloat32Slot(58, positiveInfinityDefault, inf)\nend\n\nfunction Monster.AddNegativeInfDefault(builder, negativeInfDefault)\n  builder:PrependFloat32Slot(59, negativeInfDefault, -inf)\nend\n\nfunction Monster.AddNegativeInfinityDefault(builder, negativeInfinityDefault)\n  builder:PrependFloat32Slot(60, negativeInfinityDefault, -inf)\nend\n\nfunction Monster.AddDoubleInfDefault(builder, doubleInfDefault)\n  builder:PrependFloat64Slot(61, doubleInfDefault, inf)\nend\n\nfunction Monster.End(builder)\n  return builder:EndObject()\nend\n\nfunction Monster.FinishMonsterBuffer(builder, offset)\n  builder:FinishWithIdentifier(offset, FileIdentifier)\nend\n\nfunction Monster.FinishSizePrefixedMonsterBuffer(builder, offset)\n  builder:FinishSizePrefixedWithIdentifier(offset, FileIdentifier)\nend\n\nreturn Monster"
  },
  {
    "path": "tests/MyGame/Example/Monster.nim",
    "content": "#[ MyGame.Example.Monster\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : \n  Rooting type : MyGame.Example.Monster ()\n]#\n\nimport ../InParentNamespace as MyGame_InParentNamespace\nimport Ability as MyGame_Example_Ability\nimport Any as MyGame_Example_Any\nimport AnyAmbiguousAliases as MyGame_Example_AnyAmbiguousAliases\nimport AnyUniqueAliases as MyGame_Example_AnyUniqueAliases\nimport Color as MyGame_Example_Color\nimport LongEnum as MyGame_Example_LongEnum\nimport Race as MyGame_Example_Race\nimport Referrable as MyGame_Example_Referrable\nimport Stat as MyGame_Example_Stat\nimport Test as MyGame_Example_Test\nimport Vec3 as MyGame_Example_Vec3\nimport flatbuffers\nimport std/options\n\n#  an example documentation comment: \"monster object\"\ntype Monster* = object of FlatObj\nfunc pos*(self: Monster): Option[MyGame_Example_Vec3.Vec3] =\n  let o = self.tab.Offset(4)\n  if o != 0:\n    return some(MyGame_Example_Vec3.Vec3(tab: Vtable(Bytes: self.tab.Bytes, Pos: self.tab.Pos + o)))\nfunc mana*(self: Monster): int16 =\n  let o = self.tab.Offset(6)\n  if o != 0:\n    return Get[int16](self.tab, self.tab.Pos + o)\n  return 150\nfunc `mana=`*(self: var Monster, n: int16): bool =\n  return self.tab.MutateSlot(6, n)\nfunc hp*(self: Monster): int16 =\n  let o = self.tab.Offset(8)\n  if o != 0:\n    return Get[int16](self.tab, self.tab.Pos + o)\n  return 100\nfunc `hp=`*(self: var Monster, n: int16): bool =\n  return self.tab.MutateSlot(8, n)\nfunc name*(self: Monster): string =\n  let o = self.tab.Offset(10)\n  if o != 0:\n    return self.tab.String(self.tab.Pos + o)\n  return \"\"\nfunc inventoryLength*(self: Monster): int = \n  let o = self.tab.Offset(14)\n  if o != 0:\n    return self.tab.VectorLen(o)\nfunc inventory*(self: Monster, j: int): uint8 = \n  let o = self.tab.Offset(14)\n  if o != 0:\n    var x = self.tab.Vector(o)\n    x += j.uoffset * 1.uoffset\n    return Get[uint8](self.tab, x)\nfunc inventory*(self: Monster): seq[uint8] = \n  let len = self.inventoryLength\n  for i in countup(0, len - 1):\n    result.add(self.inventory(i))\nfunc color*(self: Monster): MyGame_Example_Color.Color =\n  let o = self.tab.Offset(16)\n  if o != 0:\n    return MyGame_Example_Color.Color(Get[uint8](self.tab, self.tab.Pos + o))\n  return type(result)(8)\nfunc `color=`*(self: var Monster, n: MyGame_Example_Color.Color): bool =\n  return self.tab.MutateSlot(16, n)\nfunc testType*(self: Monster): MyGame_Example_Any.Any =\n  let o = self.tab.Offset(18)\n  if o != 0:\n    return MyGame_Example_Any.Any(Get[uint8](self.tab, self.tab.Pos + o))\n  return type(result)(0)\nfunc `testType=`*(self: var Monster, n: MyGame_Example_Any.Any): bool =\n  return self.tab.MutateSlot(18, n)\nfunc test*(self: Monster): Option[Vtable] =\n  let o = self.tab.Offset(20)\n  if o != 0:\n    return some(self.tab.Union(o))\nfunc test4Length*(self: Monster): int = \n  let o = self.tab.Offset(22)\n  if o != 0:\n    return self.tab.VectorLen(o)\nfunc test4*(self: Monster, j: int): MyGame_Example_Test.Test = \n  let o = self.tab.Offset(22)\n  if o != 0:\n    var x = self.tab.Vector(o)\n    x += j.uoffset * 4.uoffset\n    return MyGame_Example_Test.Test(tab: Vtable(Bytes: self.tab.Bytes, Pos: x))\nfunc test4*(self: Monster): seq[MyGame_Example_Test.Test] = \n  let len = self.test4Length\n  for i in countup(0, len - 1):\n    result.add(self.test4(i))\nfunc testarrayofstringLength*(self: Monster): int = \n  let o = self.tab.Offset(24)\n  if o != 0:\n    return self.tab.VectorLen(o)\nfunc testarrayofstring*(self: Monster, j: int): string = \n  let o = self.tab.Offset(24)\n  if o != 0:\n    var x = self.tab.Vector(o)\n    x += j.uoffset * 4.uoffset\n    return self.tab.String(x)\nfunc testarrayofstring*(self: Monster): seq[string] = \n  let len = self.testarrayofstringLength\n  for i in countup(0, len - 1):\n    result.add(self.testarrayofstring(i))\nfunc testarrayoftablesLength*(self: Monster): int = \n  let o = self.tab.Offset(26)\n  if o != 0:\n    return self.tab.VectorLen(o)\nfunc testarrayoftables*(self: Monster, j: int): Monster = \n  let o = self.tab.Offset(26)\n  if o != 0:\n    var x = self.tab.Vector(o)\n    x += j.uoffset * 4.uoffset\n    return Monster(tab: Vtable(Bytes: self.tab.Bytes, Pos: x))\nfunc testarrayoftables*(self: Monster): seq[Monster] = \n  let len = self.testarrayoftablesLength\n  for i in countup(0, len - 1):\n    result.add(self.testarrayoftables(i))\nfunc enemy*(self: Monster): Option[Monster] =\n  let o = self.tab.Offset(28)\n  if o != 0:\n    return some(Monster(tab: Vtable(Bytes: self.tab.Bytes, Pos: self.tab.Pos + o)))\nfunc testnestedflatbufferLength*(self: Monster): int = \n  let o = self.tab.Offset(30)\n  if o != 0:\n    return self.tab.VectorLen(o)\nfunc testnestedflatbuffer*(self: Monster, j: int): uint8 = \n  let o = self.tab.Offset(30)\n  if o != 0:\n    var x = self.tab.Vector(o)\n    x += j.uoffset * 1.uoffset\n    return Get[uint8](self.tab, x)\nfunc testnestedflatbuffer*(self: Monster): seq[uint8] = \n  let len = self.testnestedflatbufferLength\n  for i in countup(0, len - 1):\n    result.add(self.testnestedflatbuffer(i))\nfunc testempty*(self: Monster): Option[MyGame_Example_Stat.Stat] =\n  let o = self.tab.Offset(32)\n  if o != 0:\n    return some(MyGame_Example_Stat.Stat(tab: Vtable(Bytes: self.tab.Bytes, Pos: self.tab.Pos + o)))\nfunc testbool*(self: Monster): bool =\n  let o = self.tab.Offset(34)\n  if o != 0:\n    return Get[bool](self.tab, self.tab.Pos + o)\n  return false\nfunc `testbool=`*(self: var Monster, n: bool): bool =\n  return self.tab.MutateSlot(34, n)\nfunc testhashs32Fnv1*(self: Monster): int32 =\n  let o = self.tab.Offset(36)\n  if o != 0:\n    return Get[int32](self.tab, self.tab.Pos + o)\n  return 0\nfunc `testhashs32Fnv1=`*(self: var Monster, n: int32): bool =\n  return self.tab.MutateSlot(36, n)\nfunc testhashu32Fnv1*(self: Monster): uint32 =\n  let o = self.tab.Offset(38)\n  if o != 0:\n    return Get[uint32](self.tab, self.tab.Pos + o)\n  return 0\nfunc `testhashu32Fnv1=`*(self: var Monster, n: uint32): bool =\n  return self.tab.MutateSlot(38, n)\nfunc testhashs64Fnv1*(self: Monster): int64 =\n  let o = self.tab.Offset(40)\n  if o != 0:\n    return Get[int64](self.tab, self.tab.Pos + o)\n  return 0\nfunc `testhashs64Fnv1=`*(self: var Monster, n: int64): bool =\n  return self.tab.MutateSlot(40, n)\nfunc testhashu64Fnv1*(self: Monster): uint64 =\n  let o = self.tab.Offset(42)\n  if o != 0:\n    return Get[uint64](self.tab, self.tab.Pos + o)\n  return 0\nfunc `testhashu64Fnv1=`*(self: var Monster, n: uint64): bool =\n  return self.tab.MutateSlot(42, n)\nfunc testhashs32Fnv1a*(self: Monster): int32 =\n  let o = self.tab.Offset(44)\n  if o != 0:\n    return Get[int32](self.tab, self.tab.Pos + o)\n  return 0\nfunc `testhashs32Fnv1a=`*(self: var Monster, n: int32): bool =\n  return self.tab.MutateSlot(44, n)\nfunc testhashu32Fnv1a*(self: Monster): uint32 =\n  let o = self.tab.Offset(46)\n  if o != 0:\n    return Get[uint32](self.tab, self.tab.Pos + o)\n  return 0\nfunc `testhashu32Fnv1a=`*(self: var Monster, n: uint32): bool =\n  return self.tab.MutateSlot(46, n)\nfunc testhashs64Fnv1a*(self: Monster): int64 =\n  let o = self.tab.Offset(48)\n  if o != 0:\n    return Get[int64](self.tab, self.tab.Pos + o)\n  return 0\nfunc `testhashs64Fnv1a=`*(self: var Monster, n: int64): bool =\n  return self.tab.MutateSlot(48, n)\nfunc testhashu64Fnv1a*(self: Monster): uint64 =\n  let o = self.tab.Offset(50)\n  if o != 0:\n    return Get[uint64](self.tab, self.tab.Pos + o)\n  return 0\nfunc `testhashu64Fnv1a=`*(self: var Monster, n: uint64): bool =\n  return self.tab.MutateSlot(50, n)\nfunc testarrayofboolsLength*(self: Monster): int = \n  let o = self.tab.Offset(52)\n  if o != 0:\n    return self.tab.VectorLen(o)\nfunc testarrayofbools*(self: Monster, j: int): bool = \n  let o = self.tab.Offset(52)\n  if o != 0:\n    var x = self.tab.Vector(o)\n    x += j.uoffset * 1.uoffset\n    return Get[bool](self.tab, x)\nfunc testarrayofbools*(self: Monster): seq[bool] = \n  let len = self.testarrayofboolsLength\n  for i in countup(0, len - 1):\n    result.add(self.testarrayofbools(i))\nfunc testf*(self: Monster): float32 =\n  let o = self.tab.Offset(54)\n  if o != 0:\n    return Get[float32](self.tab, self.tab.Pos + o)\n  return 3.14159\nfunc `testf=`*(self: var Monster, n: float32): bool =\n  return self.tab.MutateSlot(54, n)\nfunc testf2*(self: Monster): float32 =\n  let o = self.tab.Offset(56)\n  if o != 0:\n    return Get[float32](self.tab, self.tab.Pos + o)\n  return 3.0\nfunc `testf2=`*(self: var Monster, n: float32): bool =\n  return self.tab.MutateSlot(56, n)\nfunc testf3*(self: Monster): float32 =\n  let o = self.tab.Offset(58)\n  if o != 0:\n    return Get[float32](self.tab, self.tab.Pos + o)\n  return 0.0\nfunc `testf3=`*(self: var Monster, n: float32): bool =\n  return self.tab.MutateSlot(58, n)\nfunc testarrayofstring2Length*(self: Monster): int = \n  let o = self.tab.Offset(60)\n  if o != 0:\n    return self.tab.VectorLen(o)\nfunc testarrayofstring2*(self: Monster, j: int): string = \n  let o = self.tab.Offset(60)\n  if o != 0:\n    var x = self.tab.Vector(o)\n    x += j.uoffset * 4.uoffset\n    return self.tab.String(x)\nfunc testarrayofstring2*(self: Monster): seq[string] = \n  let len = self.testarrayofstring2Length\n  for i in countup(0, len - 1):\n    result.add(self.testarrayofstring2(i))\nfunc testarrayofsortedstructLength*(self: Monster): int = \n  let o = self.tab.Offset(62)\n  if o != 0:\n    return self.tab.VectorLen(o)\nfunc testarrayofsortedstruct*(self: Monster, j: int): MyGame_Example_Ability.Ability = \n  let o = self.tab.Offset(62)\n  if o != 0:\n    var x = self.tab.Vector(o)\n    x += j.uoffset * 8.uoffset\n    return MyGame_Example_Ability.Ability(tab: Vtable(Bytes: self.tab.Bytes, Pos: x))\nfunc testarrayofsortedstruct*(self: Monster): seq[MyGame_Example_Ability.Ability] = \n  let len = self.testarrayofsortedstructLength\n  for i in countup(0, len - 1):\n    result.add(self.testarrayofsortedstruct(i))\nfunc flexLength*(self: Monster): int = \n  let o = self.tab.Offset(64)\n  if o != 0:\n    return self.tab.VectorLen(o)\nfunc flex*(self: Monster, j: int): uint8 = \n  let o = self.tab.Offset(64)\n  if o != 0:\n    var x = self.tab.Vector(o)\n    x += j.uoffset * 1.uoffset\n    return Get[uint8](self.tab, x)\nfunc flex*(self: Monster): seq[uint8] = \n  let len = self.flexLength\n  for i in countup(0, len - 1):\n    result.add(self.flex(i))\nfunc test5Length*(self: Monster): int = \n  let o = self.tab.Offset(66)\n  if o != 0:\n    return self.tab.VectorLen(o)\nfunc test5*(self: Monster, j: int): MyGame_Example_Test.Test = \n  let o = self.tab.Offset(66)\n  if o != 0:\n    var x = self.tab.Vector(o)\n    x += j.uoffset * 4.uoffset\n    return MyGame_Example_Test.Test(tab: Vtable(Bytes: self.tab.Bytes, Pos: x))\nfunc test5*(self: Monster): seq[MyGame_Example_Test.Test] = \n  let len = self.test5Length\n  for i in countup(0, len - 1):\n    result.add(self.test5(i))\nfunc vectorOfLongsLength*(self: Monster): int = \n  let o = self.tab.Offset(68)\n  if o != 0:\n    return self.tab.VectorLen(o)\nfunc vectorOfLongs*(self: Monster, j: int): int64 = \n  let o = self.tab.Offset(68)\n  if o != 0:\n    var x = self.tab.Vector(o)\n    x += j.uoffset * 8.uoffset\n    return Get[int64](self.tab, x)\nfunc vectorOfLongs*(self: Monster): seq[int64] = \n  let len = self.vectorOfLongsLength\n  for i in countup(0, len - 1):\n    result.add(self.vectorOfLongs(i))\nfunc vectorOfDoublesLength*(self: Monster): int = \n  let o = self.tab.Offset(70)\n  if o != 0:\n    return self.tab.VectorLen(o)\nfunc vectorOfDoubles*(self: Monster, j: int): float64 = \n  let o = self.tab.Offset(70)\n  if o != 0:\n    var x = self.tab.Vector(o)\n    x += j.uoffset * 8.uoffset\n    return Get[float64](self.tab, x)\nfunc vectorOfDoubles*(self: Monster): seq[float64] = \n  let len = self.vectorOfDoublesLength\n  for i in countup(0, len - 1):\n    result.add(self.vectorOfDoubles(i))\nfunc parentNamespaceTest*(self: Monster): Option[MyGame_InParentNamespace.InParentNamespace] =\n  let o = self.tab.Offset(72)\n  if o != 0:\n    return some(MyGame_InParentNamespace.InParentNamespace(tab: Vtable(Bytes: self.tab.Bytes, Pos: self.tab.Pos + o)))\nfunc vectorOfReferrablesLength*(self: Monster): int = \n  let o = self.tab.Offset(74)\n  if o != 0:\n    return self.tab.VectorLen(o)\nfunc vectorOfReferrables*(self: Monster, j: int): MyGame_Example_Referrable.Referrable = \n  let o = self.tab.Offset(74)\n  if o != 0:\n    var x = self.tab.Vector(o)\n    x += j.uoffset * 4.uoffset\n    return MyGame_Example_Referrable.Referrable(tab: Vtable(Bytes: self.tab.Bytes, Pos: x))\nfunc vectorOfReferrables*(self: Monster): seq[MyGame_Example_Referrable.Referrable] = \n  let len = self.vectorOfReferrablesLength\n  for i in countup(0, len - 1):\n    result.add(self.vectorOfReferrables(i))\nfunc singleWeakReference*(self: Monster): uint64 =\n  let o = self.tab.Offset(76)\n  if o != 0:\n    return Get[uint64](self.tab, self.tab.Pos + o)\n  return 0\nfunc `singleWeakReference=`*(self: var Monster, n: uint64): bool =\n  return self.tab.MutateSlot(76, n)\nfunc vectorOfWeakReferencesLength*(self: Monster): int = \n  let o = self.tab.Offset(78)\n  if o != 0:\n    return self.tab.VectorLen(o)\nfunc vectorOfWeakReferences*(self: Monster, j: int): uint64 = \n  let o = self.tab.Offset(78)\n  if o != 0:\n    var x = self.tab.Vector(o)\n    x += j.uoffset * 8.uoffset\n    return Get[uint64](self.tab, x)\nfunc vectorOfWeakReferences*(self: Monster): seq[uint64] = \n  let len = self.vectorOfWeakReferencesLength\n  for i in countup(0, len - 1):\n    result.add(self.vectorOfWeakReferences(i))\nfunc vectorOfStrongReferrablesLength*(self: Monster): int = \n  let o = self.tab.Offset(80)\n  if o != 0:\n    return self.tab.VectorLen(o)\nfunc vectorOfStrongReferrables*(self: Monster, j: int): MyGame_Example_Referrable.Referrable = \n  let o = self.tab.Offset(80)\n  if o != 0:\n    var x = self.tab.Vector(o)\n    x += j.uoffset * 4.uoffset\n    return MyGame_Example_Referrable.Referrable(tab: Vtable(Bytes: self.tab.Bytes, Pos: x))\nfunc vectorOfStrongReferrables*(self: Monster): seq[MyGame_Example_Referrable.Referrable] = \n  let len = self.vectorOfStrongReferrablesLength\n  for i in countup(0, len - 1):\n    result.add(self.vectorOfStrongReferrables(i))\nfunc coOwningReference*(self: Monster): uint64 =\n  let o = self.tab.Offset(82)\n  if o != 0:\n    return Get[uint64](self.tab, self.tab.Pos + o)\n  return 0\nfunc `coOwningReference=`*(self: var Monster, n: uint64): bool =\n  return self.tab.MutateSlot(82, n)\nfunc vectorOfCoOwningReferencesLength*(self: Monster): int = \n  let o = self.tab.Offset(84)\n  if o != 0:\n    return self.tab.VectorLen(o)\nfunc vectorOfCoOwningReferences*(self: Monster, j: int): uint64 = \n  let o = self.tab.Offset(84)\n  if o != 0:\n    var x = self.tab.Vector(o)\n    x += j.uoffset * 8.uoffset\n    return Get[uint64](self.tab, x)\nfunc vectorOfCoOwningReferences*(self: Monster): seq[uint64] = \n  let len = self.vectorOfCoOwningReferencesLength\n  for i in countup(0, len - 1):\n    result.add(self.vectorOfCoOwningReferences(i))\nfunc nonOwningReference*(self: Monster): uint64 =\n  let o = self.tab.Offset(86)\n  if o != 0:\n    return Get[uint64](self.tab, self.tab.Pos + o)\n  return 0\nfunc `nonOwningReference=`*(self: var Monster, n: uint64): bool =\n  return self.tab.MutateSlot(86, n)\nfunc vectorOfNonOwningReferencesLength*(self: Monster): int = \n  let o = self.tab.Offset(88)\n  if o != 0:\n    return self.tab.VectorLen(o)\nfunc vectorOfNonOwningReferences*(self: Monster, j: int): uint64 = \n  let o = self.tab.Offset(88)\n  if o != 0:\n    var x = self.tab.Vector(o)\n    x += j.uoffset * 8.uoffset\n    return Get[uint64](self.tab, x)\nfunc vectorOfNonOwningReferences*(self: Monster): seq[uint64] = \n  let len = self.vectorOfNonOwningReferencesLength\n  for i in countup(0, len - 1):\n    result.add(self.vectorOfNonOwningReferences(i))\nfunc anyUniqueType*(self: Monster): MyGame_Example_AnyUniqueAliases.AnyUniqueAliases =\n  let o = self.tab.Offset(90)\n  if o != 0:\n    return MyGame_Example_AnyUniqueAliases.AnyUniqueAliases(Get[uint8](self.tab, self.tab.Pos + o))\n  return type(result)(0)\nfunc `anyUniqueType=`*(self: var Monster, n: MyGame_Example_AnyUniqueAliases.AnyUniqueAliases): bool =\n  return self.tab.MutateSlot(90, n)\nfunc anyUnique*(self: Monster): Option[Vtable] =\n  let o = self.tab.Offset(92)\n  if o != 0:\n    return some(self.tab.Union(o))\nfunc anyAmbiguousType*(self: Monster): MyGame_Example_AnyAmbiguousAliases.AnyAmbiguousAliases =\n  let o = self.tab.Offset(94)\n  if o != 0:\n    return MyGame_Example_AnyAmbiguousAliases.AnyAmbiguousAliases(Get[uint8](self.tab, self.tab.Pos + o))\n  return type(result)(0)\nfunc `anyAmbiguousType=`*(self: var Monster, n: MyGame_Example_AnyAmbiguousAliases.AnyAmbiguousAliases): bool =\n  return self.tab.MutateSlot(94, n)\nfunc anyAmbiguous*(self: Monster): Option[Vtable] =\n  let o = self.tab.Offset(96)\n  if o != 0:\n    return some(self.tab.Union(o))\nfunc vectorOfEnumsLength*(self: Monster): int = \n  let o = self.tab.Offset(98)\n  if o != 0:\n    return self.tab.VectorLen(o)\nfunc vectorOfEnums*(self: Monster, j: int): MyGame_Example_Color.Color = \n  let o = self.tab.Offset(98)\n  if o != 0:\n    var x = self.tab.Vector(o)\n    x += j.uoffset * 1.uoffset\n    return MyGame_Example_Color.Color(Get[uint8](self.tab, x))\nfunc vectorOfEnums*(self: Monster): seq[MyGame_Example_Color.Color] = \n  let len = self.vectorOfEnumsLength\n  for i in countup(0, len - 1):\n    result.add(self.vectorOfEnums(i))\nfunc signedEnum*(self: Monster): MyGame_Example_Race.Race =\n  let o = self.tab.Offset(100)\n  if o != 0:\n    return MyGame_Example_Race.Race(Get[int8](self.tab, self.tab.Pos + o))\n  return type(result)(-1)\nfunc `signedEnum=`*(self: var Monster, n: MyGame_Example_Race.Race): bool =\n  return self.tab.MutateSlot(100, n)\nfunc testrequirednestedflatbufferLength*(self: Monster): int = \n  let o = self.tab.Offset(102)\n  if o != 0:\n    return self.tab.VectorLen(o)\nfunc testrequirednestedflatbuffer*(self: Monster, j: int): uint8 = \n  let o = self.tab.Offset(102)\n  if o != 0:\n    var x = self.tab.Vector(o)\n    x += j.uoffset * 1.uoffset\n    return Get[uint8](self.tab, x)\nfunc testrequirednestedflatbuffer*(self: Monster): seq[uint8] = \n  let len = self.testrequirednestedflatbufferLength\n  for i in countup(0, len - 1):\n    result.add(self.testrequirednestedflatbuffer(i))\nfunc scalarKeySortedTablesLength*(self: Monster): int = \n  let o = self.tab.Offset(104)\n  if o != 0:\n    return self.tab.VectorLen(o)\nfunc scalarKeySortedTables*(self: Monster, j: int): MyGame_Example_Stat.Stat = \n  let o = self.tab.Offset(104)\n  if o != 0:\n    var x = self.tab.Vector(o)\n    x += j.uoffset * 4.uoffset\n    return MyGame_Example_Stat.Stat(tab: Vtable(Bytes: self.tab.Bytes, Pos: x))\nfunc scalarKeySortedTables*(self: Monster): seq[MyGame_Example_Stat.Stat] = \n  let len = self.scalarKeySortedTablesLength\n  for i in countup(0, len - 1):\n    result.add(self.scalarKeySortedTables(i))\nfunc nativeInline*(self: Monster): Option[MyGame_Example_Test.Test] =\n  let o = self.tab.Offset(106)\n  if o != 0:\n    return some(MyGame_Example_Test.Test(tab: Vtable(Bytes: self.tab.Bytes, Pos: self.tab.Pos + o)))\nfunc longEnumNonEnumDefault*(self: Monster): MyGame_Example_LongEnum.LongEnum =\n  let o = self.tab.Offset(108)\n  if o != 0:\n    return MyGame_Example_LongEnum.LongEnum(Get[uint64](self.tab, self.tab.Pos + o))\n  return type(result)(0)\nfunc `longEnumNonEnumDefault=`*(self: var Monster, n: MyGame_Example_LongEnum.LongEnum): bool =\n  return self.tab.MutateSlot(108, n)\nfunc longEnumNormalDefault*(self: Monster): MyGame_Example_LongEnum.LongEnum =\n  let o = self.tab.Offset(110)\n  if o != 0:\n    return MyGame_Example_LongEnum.LongEnum(Get[uint64](self.tab, self.tab.Pos + o))\n  return type(result)(2)\nfunc `longEnumNormalDefault=`*(self: var Monster, n: MyGame_Example_LongEnum.LongEnum): bool =\n  return self.tab.MutateSlot(110, n)\nfunc nanDefault*(self: Monster): float32 =\n  let o = self.tab.Offset(112)\n  if o != 0:\n    return Get[float32](self.tab, self.tab.Pos + o)\n  return NaN\nfunc `nanDefault=`*(self: var Monster, n: float32): bool =\n  return self.tab.MutateSlot(112, n)\nfunc infDefault*(self: Monster): float32 =\n  let o = self.tab.Offset(114)\n  if o != 0:\n    return Get[float32](self.tab, self.tab.Pos + o)\n  return Inf\nfunc `infDefault=`*(self: var Monster, n: float32): bool =\n  return self.tab.MutateSlot(114, n)\nfunc positiveInfDefault*(self: Monster): float32 =\n  let o = self.tab.Offset(116)\n  if o != 0:\n    return Get[float32](self.tab, self.tab.Pos + o)\n  return Inf\nfunc `positiveInfDefault=`*(self: var Monster, n: float32): bool =\n  return self.tab.MutateSlot(116, n)\nfunc infinityDefault*(self: Monster): float32 =\n  let o = self.tab.Offset(118)\n  if o != 0:\n    return Get[float32](self.tab, self.tab.Pos + o)\n  return Inf\nfunc `infinityDefault=`*(self: var Monster, n: float32): bool =\n  return self.tab.MutateSlot(118, n)\nfunc positiveInfinityDefault*(self: Monster): float32 =\n  let o = self.tab.Offset(120)\n  if o != 0:\n    return Get[float32](self.tab, self.tab.Pos + o)\n  return Inf\nfunc `positiveInfinityDefault=`*(self: var Monster, n: float32): bool =\n  return self.tab.MutateSlot(120, n)\nfunc negativeInfDefault*(self: Monster): float32 =\n  let o = self.tab.Offset(122)\n  if o != 0:\n    return Get[float32](self.tab, self.tab.Pos + o)\n  return -Inf\nfunc `negativeInfDefault=`*(self: var Monster, n: float32): bool =\n  return self.tab.MutateSlot(122, n)\nfunc negativeInfinityDefault*(self: Monster): float32 =\n  let o = self.tab.Offset(124)\n  if o != 0:\n    return Get[float32](self.tab, self.tab.Pos + o)\n  return -Inf\nfunc `negativeInfinityDefault=`*(self: var Monster, n: float32): bool =\n  return self.tab.MutateSlot(124, n)\nfunc doubleInfDefault*(self: Monster): float64 =\n  let o = self.tab.Offset(126)\n  if o != 0:\n    return Get[float64](self.tab, self.tab.Pos + o)\n  return Inf\nfunc `doubleInfDefault=`*(self: var Monster, n: float64): bool =\n  return self.tab.MutateSlot(126, n)\nproc MonsterStart*(builder: var Builder) =\n  builder.StartObject(62)\nproc MonsterAddpos*(builder: var Builder, pos: uoffset) =\n  builder.PrependStructSlot(0, pos, default(uoffset))\nproc MonsterAddmana*(builder: var Builder, mana: int16) =\n  builder.PrependSlot(1, mana, default(int16))\nproc MonsterAddhp*(builder: var Builder, hp: int16) =\n  builder.PrependSlot(2, hp, default(int16))\nproc MonsterAddname*(builder: var Builder, name: uoffset) =\n  builder.PrependSlot(3, name, default(uoffset))\nproc MonsterAddinventory*(builder: var Builder, inventory: uoffset) =\n  builder.PrependSlot(5, inventory, default(uoffset))\nproc MonsterStartinventoryVector*(builder: var Builder, numElems: uoffset) =\n  builder.StartVector(1, numElems, 1)\nproc MonsterAddcolor*(builder: var Builder, color: uint8) =\n  builder.PrependSlot(6, color, default(uint8))\nproc MonsterAddtestType*(builder: var Builder, testType: uint8) =\n  builder.PrependSlot(7, testType, default(uint8))\nproc MonsterAddtest*(builder: var Builder, test: uoffset) =\n  builder.PrependSlot(8, test, default(uoffset))\nproc MonsterAddtest4*(builder: var Builder, test4: uoffset) =\n  builder.PrependSlot(9, test4, default(uoffset))\nproc MonsterStarttest4Vector*(builder: var Builder, numElems: uoffset) =\n  builder.StartVector(4, numElems, 2)\nproc MonsterAddtestarrayofstring*(builder: var Builder, testarrayofstring: uoffset) =\n  builder.PrependSlot(10, testarrayofstring, default(uoffset))\nproc MonsterStarttestarrayofstringVector*(builder: var Builder, numElems: uoffset) =\n  builder.StartVector(4, numElems, 4)\nproc MonsterAddtestarrayoftables*(builder: var Builder, testarrayoftables: uoffset) =\n  builder.PrependSlot(11, testarrayoftables, default(uoffset))\nproc MonsterStarttestarrayoftablesVector*(builder: var Builder, numElems: uoffset) =\n  builder.StartVector(4, numElems, 4)\nproc MonsterAddenemy*(builder: var Builder, enemy: uoffset) =\n  builder.PrependStructSlot(12, enemy, default(uoffset))\nproc MonsterAddtestnestedflatbuffer*(builder: var Builder, testnestedflatbuffer: uoffset) =\n  builder.PrependSlot(13, testnestedflatbuffer, default(uoffset))\nproc MonsterStarttestnestedflatbufferVector*(builder: var Builder, numElems: uoffset) =\n  builder.StartVector(1, numElems, 1)\nproc MonsterAddtestempty*(builder: var Builder, testempty: uoffset) =\n  builder.PrependStructSlot(14, testempty, default(uoffset))\nproc MonsterAddtestbool*(builder: var Builder, testbool: bool) =\n  builder.PrependSlot(15, testbool, default(bool))\nproc MonsterAddtesthashs32Fnv1*(builder: var Builder, testhashs32Fnv1: int32) =\n  builder.PrependSlot(16, testhashs32Fnv1, default(int32))\nproc MonsterAddtesthashu32Fnv1*(builder: var Builder, testhashu32Fnv1: uint32) =\n  builder.PrependSlot(17, testhashu32Fnv1, default(uint32))\nproc MonsterAddtesthashs64Fnv1*(builder: var Builder, testhashs64Fnv1: int64) =\n  builder.PrependSlot(18, testhashs64Fnv1, default(int64))\nproc MonsterAddtesthashu64Fnv1*(builder: var Builder, testhashu64Fnv1: uint64) =\n  builder.PrependSlot(19, testhashu64Fnv1, default(uint64))\nproc MonsterAddtesthashs32Fnv1a*(builder: var Builder, testhashs32Fnv1a: int32) =\n  builder.PrependSlot(20, testhashs32Fnv1a, default(int32))\nproc MonsterAddtesthashu32Fnv1a*(builder: var Builder, testhashu32Fnv1a: uint32) =\n  builder.PrependSlot(21, testhashu32Fnv1a, default(uint32))\nproc MonsterAddtesthashs64Fnv1a*(builder: var Builder, testhashs64Fnv1a: int64) =\n  builder.PrependSlot(22, testhashs64Fnv1a, default(int64))\nproc MonsterAddtesthashu64Fnv1a*(builder: var Builder, testhashu64Fnv1a: uint64) =\n  builder.PrependSlot(23, testhashu64Fnv1a, default(uint64))\nproc MonsterAddtestarrayofbools*(builder: var Builder, testarrayofbools: uoffset) =\n  builder.PrependSlot(24, testarrayofbools, default(uoffset))\nproc MonsterStarttestarrayofboolsVector*(builder: var Builder, numElems: uoffset) =\n  builder.StartVector(1, numElems, 1)\nproc MonsterAddtestf*(builder: var Builder, testf: float32) =\n  builder.PrependSlot(25, testf, default(float32))\nproc MonsterAddtestf2*(builder: var Builder, testf2: float32) =\n  builder.PrependSlot(26, testf2, default(float32))\nproc MonsterAddtestf3*(builder: var Builder, testf3: float32) =\n  builder.PrependSlot(27, testf3, default(float32))\nproc MonsterAddtestarrayofstring2*(builder: var Builder, testarrayofstring2: uoffset) =\n  builder.PrependSlot(28, testarrayofstring2, default(uoffset))\nproc MonsterStarttestarrayofstring2Vector*(builder: var Builder, numElems: uoffset) =\n  builder.StartVector(4, numElems, 4)\nproc MonsterAddtestarrayofsortedstruct*(builder: var Builder, testarrayofsortedstruct: uoffset) =\n  builder.PrependSlot(29, testarrayofsortedstruct, default(uoffset))\nproc MonsterStarttestarrayofsortedstructVector*(builder: var Builder, numElems: uoffset) =\n  builder.StartVector(8, numElems, 4)\nproc MonsterAddflex*(builder: var Builder, flex: uoffset) =\n  builder.PrependSlot(30, flex, default(uoffset))\nproc MonsterStartflexVector*(builder: var Builder, numElems: uoffset) =\n  builder.StartVector(1, numElems, 1)\nproc MonsterAddtest5*(builder: var Builder, test5: uoffset) =\n  builder.PrependSlot(31, test5, default(uoffset))\nproc MonsterStarttest5Vector*(builder: var Builder, numElems: uoffset) =\n  builder.StartVector(4, numElems, 2)\nproc MonsterAddvectorOfLongs*(builder: var Builder, vectorOfLongs: uoffset) =\n  builder.PrependSlot(32, vectorOfLongs, default(uoffset))\nproc MonsterStartvectorOfLongsVector*(builder: var Builder, numElems: uoffset) =\n  builder.StartVector(8, numElems, 8)\nproc MonsterAddvectorOfDoubles*(builder: var Builder, vectorOfDoubles: uoffset) =\n  builder.PrependSlot(33, vectorOfDoubles, default(uoffset))\nproc MonsterStartvectorOfDoublesVector*(builder: var Builder, numElems: uoffset) =\n  builder.StartVector(8, numElems, 8)\nproc MonsterAddparentNamespaceTest*(builder: var Builder, parentNamespaceTest: uoffset) =\n  builder.PrependStructSlot(34, parentNamespaceTest, default(uoffset))\nproc MonsterAddvectorOfReferrables*(builder: var Builder, vectorOfReferrables: uoffset) =\n  builder.PrependSlot(35, vectorOfReferrables, default(uoffset))\nproc MonsterStartvectorOfReferrablesVector*(builder: var Builder, numElems: uoffset) =\n  builder.StartVector(4, numElems, 4)\nproc MonsterAddsingleWeakReference*(builder: var Builder, singleWeakReference: uint64) =\n  builder.PrependSlot(36, singleWeakReference, default(uint64))\nproc MonsterAddvectorOfWeakReferences*(builder: var Builder, vectorOfWeakReferences: uoffset) =\n  builder.PrependSlot(37, vectorOfWeakReferences, default(uoffset))\nproc MonsterStartvectorOfWeakReferencesVector*(builder: var Builder, numElems: uoffset) =\n  builder.StartVector(8, numElems, 8)\nproc MonsterAddvectorOfStrongReferrables*(builder: var Builder, vectorOfStrongReferrables: uoffset) =\n  builder.PrependSlot(38, vectorOfStrongReferrables, default(uoffset))\nproc MonsterStartvectorOfStrongReferrablesVector*(builder: var Builder, numElems: uoffset) =\n  builder.StartVector(4, numElems, 4)\nproc MonsterAddcoOwningReference*(builder: var Builder, coOwningReference: uint64) =\n  builder.PrependSlot(39, coOwningReference, default(uint64))\nproc MonsterAddvectorOfCoOwningReferences*(builder: var Builder, vectorOfCoOwningReferences: uoffset) =\n  builder.PrependSlot(40, vectorOfCoOwningReferences, default(uoffset))\nproc MonsterStartvectorOfCoOwningReferencesVector*(builder: var Builder, numElems: uoffset) =\n  builder.StartVector(8, numElems, 8)\nproc MonsterAddnonOwningReference*(builder: var Builder, nonOwningReference: uint64) =\n  builder.PrependSlot(41, nonOwningReference, default(uint64))\nproc MonsterAddvectorOfNonOwningReferences*(builder: var Builder, vectorOfNonOwningReferences: uoffset) =\n  builder.PrependSlot(42, vectorOfNonOwningReferences, default(uoffset))\nproc MonsterStartvectorOfNonOwningReferencesVector*(builder: var Builder, numElems: uoffset) =\n  builder.StartVector(8, numElems, 8)\nproc MonsterAddanyUniqueType*(builder: var Builder, anyUniqueType: uint8) =\n  builder.PrependSlot(43, anyUniqueType, default(uint8))\nproc MonsterAddanyUnique*(builder: var Builder, anyUnique: uoffset) =\n  builder.PrependSlot(44, anyUnique, default(uoffset))\nproc MonsterAddanyAmbiguousType*(builder: var Builder, anyAmbiguousType: uint8) =\n  builder.PrependSlot(45, anyAmbiguousType, default(uint8))\nproc MonsterAddanyAmbiguous*(builder: var Builder, anyAmbiguous: uoffset) =\n  builder.PrependSlot(46, anyAmbiguous, default(uoffset))\nproc MonsterAddvectorOfEnums*(builder: var Builder, vectorOfEnums: uoffset) =\n  builder.PrependSlot(47, vectorOfEnums, default(uoffset))\nproc MonsterStartvectorOfEnumsVector*(builder: var Builder, numElems: uoffset) =\n  builder.StartVector(1, numElems, 1)\nproc MonsterAddsignedEnum*(builder: var Builder, signedEnum: int8) =\n  builder.PrependSlot(48, signedEnum, default(int8))\nproc MonsterAddtestrequirednestedflatbuffer*(builder: var Builder, testrequirednestedflatbuffer: uoffset) =\n  builder.PrependSlot(49, testrequirednestedflatbuffer, default(uoffset))\nproc MonsterStarttestrequirednestedflatbufferVector*(builder: var Builder, numElems: uoffset) =\n  builder.StartVector(1, numElems, 1)\nproc MonsterAddscalarKeySortedTables*(builder: var Builder, scalarKeySortedTables: uoffset) =\n  builder.PrependSlot(50, scalarKeySortedTables, default(uoffset))\nproc MonsterStartscalarKeySortedTablesVector*(builder: var Builder, numElems: uoffset) =\n  builder.StartVector(4, numElems, 4)\nproc MonsterAddnativeInline*(builder: var Builder, nativeInline: uoffset) =\n  builder.PrependStructSlot(51, nativeInline, default(uoffset))\nproc MonsterAddlongEnumNonEnumDefault*(builder: var Builder, longEnumNonEnumDefault: uint64) =\n  builder.PrependSlot(52, longEnumNonEnumDefault, default(uint64))\nproc MonsterAddlongEnumNormalDefault*(builder: var Builder, longEnumNormalDefault: uint64) =\n  builder.PrependSlot(53, longEnumNormalDefault, default(uint64))\nproc MonsterAddnanDefault*(builder: var Builder, nanDefault: float32) =\n  builder.PrependSlot(54, nanDefault, default(float32))\nproc MonsterAddinfDefault*(builder: var Builder, infDefault: float32) =\n  builder.PrependSlot(55, infDefault, default(float32))\nproc MonsterAddpositiveInfDefault*(builder: var Builder, positiveInfDefault: float32) =\n  builder.PrependSlot(56, positiveInfDefault, default(float32))\nproc MonsterAddinfinityDefault*(builder: var Builder, infinityDefault: float32) =\n  builder.PrependSlot(57, infinityDefault, default(float32))\nproc MonsterAddpositiveInfinityDefault*(builder: var Builder, positiveInfinityDefault: float32) =\n  builder.PrependSlot(58, positiveInfinityDefault, default(float32))\nproc MonsterAddnegativeInfDefault*(builder: var Builder, negativeInfDefault: float32) =\n  builder.PrependSlot(59, negativeInfDefault, default(float32))\nproc MonsterAddnegativeInfinityDefault*(builder: var Builder, negativeInfinityDefault: float32) =\n  builder.PrependSlot(60, negativeInfinityDefault, default(float32))\nproc MonsterAdddoubleInfDefault*(builder: var Builder, doubleInfDefault: float64) =\n  builder.PrependSlot(61, doubleInfDefault, default(float64))\nproc MonsterEnd*(builder: var Builder): uoffset =\n  return builder.EndObject()\n"
  },
  {
    "path": "tests/MyGame/Example/Monster.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nnamespace MyGame\\Example;\n\nuse \\Google\\FlatBuffers\\Struct;\nuse \\Google\\FlatBuffers\\Table;\nuse \\Google\\FlatBuffers\\ByteBuffer;\nuse \\Google\\FlatBuffers\\FlatBufferBuilder;\n\n/// an example documentation comment: \"monster object\"\nclass Monster extends Table\n{\n    /**\n     * @param ByteBuffer $bb\n     * @return Monster\n     */\n    public static function getRootAsMonster(ByteBuffer $bb)\n    {\n        $obj = new Monster();\n        return ($obj->init($bb->getInt($bb->getPosition()) + $bb->getPosition(), $bb));\n    }\n\n    public static function MonsterIdentifier()\n    {\n        return \"MONS\";\n    }\n\n    public static function MonsterBufferHasIdentifier(ByteBuffer $buf)\n    {\n        return self::__has_identifier($buf, self::MonsterIdentifier());\n    }\n\n    public static function MonsterExtension()\n    {\n        return \"mon\";\n    }\n\n    /**\n     * @param int $_i offset\n     * @param ByteBuffer $_bb\n     * @return Monster\n     **/\n    public function init($_i, ByteBuffer $_bb)\n    {\n        $this->bb_pos = $_i;\n        $this->bb = $_bb;\n        return $this;\n    }\n\n    public function getPos()\n    {\n        $obj = new Vec3();\n        $o = $this->__offset(4);\n        return $o != 0 ? $obj->init($o + $this->bb_pos, $this->bb) : 0;\n    }\n\n    /**\n     * @return short\n     */\n    public function getMana()\n    {\n        $o = $this->__offset(6);\n        return $o != 0 ? $this->bb->getShort($o + $this->bb_pos) : 150;\n    }\n\n    /**\n     * @return short\n     */\n    public function getHp()\n    {\n        $o = $this->__offset(8);\n        return $o != 0 ? $this->bb->getShort($o + $this->bb_pos) : 100;\n    }\n\n    public function getName()\n    {\n        $o = $this->__offset(10);\n        return $o != 0 ? $this->__string($o + $this->bb_pos) : null;\n    }\n\n    /**\n     * @param int offset\n     * @return byte\n     */\n    public function getInventory($j)\n    {\n        $o = $this->__offset(14);\n        return $o != 0 ? $this->bb->getByte($this->__vector($o) + $j * 1) : 0;\n    }\n\n    /**\n     * @return int\n     */\n    public function getInventoryLength()\n    {\n        $o = $this->__offset(14);\n        return $o != 0 ? $this->__vector_len($o) : 0;\n    }\n\n    /**\n     * @return string\n     */\n    public function getInventoryBytes()\n    {\n        return $this->__vector_as_bytes(14);\n    }\n\n    /**\n     * @return byte\n     */\n    public function getColor()\n    {\n        $o = $this->__offset(16);\n        return $o != 0 ? $this->bb->getByte($o + $this->bb_pos) : \\MyGame\\Example\\Color::Blue;\n    }\n\n    /**\n     * @return byte\n     */\n    public function getTestType()\n    {\n        $o = $this->__offset(18);\n        return $o != 0 ? $this->bb->getByte($o + $this->bb_pos) : \\MyGame\\Example\\Any::NONE;\n    }\n\n    /**\n     * @returnint\n     */\n    public function getTest($obj)\n    {\n        $o = $this->__offset(20);\n        return $o != 0 ? $this->__union($obj, $o) : null;\n    }\n\n    /**\n     * @returnVectorOffset\n     */\n    public function getTest4($j)\n    {\n        $o = $this->__offset(22);\n        $obj = new Test();\n        return $o != 0 ? $obj->init($this->__vector($o) + $j *4, $this->bb) : null;\n    }\n\n    /**\n     * @return int\n     */\n    public function getTest4Length()\n    {\n        $o = $this->__offset(22);\n        return $o != 0 ? $this->__vector_len($o) : 0;\n    }\n\n    /**\n     * @param int offset\n     * @return string\n     */\n    public function getTestarrayofstring($j)\n    {\n        $o = $this->__offset(24);\n        return $o != 0 ? $this->__string($this->__vector($o) + $j * 4) : 0;\n    }\n\n    /**\n     * @return int\n     */\n    public function getTestarrayofstringLength()\n    {\n        $o = $this->__offset(24);\n        return $o != 0 ? $this->__vector_len($o) : 0;\n    }\n\n    /// an example documentation comment: this will end up in the generated code\n    /// multiline too\n    /**\n     * @returnVectorOffset\n     */\n    public function getTestarrayoftables($j)\n    {\n        $o = $this->__offset(26);\n        $obj = new Monster();\n        return $o != 0 ? $obj->init($this->__indirect($this->__vector($o) + $j * 4), $this->bb) : null;\n    }\n\n    /**\n     * @return int\n     */\n    public function getTestarrayoftablesLength()\n    {\n        $o = $this->__offset(26);\n        return $o != 0 ? $this->__vector_len($o) : 0;\n    }\n\n    public function getEnemy()\n    {\n        $obj = new Monster();\n        $o = $this->__offset(28);\n        return $o != 0 ? $obj->init($this->__indirect($o + $this->bb_pos), $this->bb) : 0;\n    }\n\n    /**\n     * @param int offset\n     * @return byte\n     */\n    public function getTestnestedflatbuffer($j)\n    {\n        $o = $this->__offset(30);\n        return $o != 0 ? $this->bb->getByte($this->__vector($o) + $j * 1) : 0;\n    }\n\n    /**\n     * @return int\n     */\n    public function getTestnestedflatbufferLength()\n    {\n        $o = $this->__offset(30);\n        return $o != 0 ? $this->__vector_len($o) : 0;\n    }\n\n    /**\n     * @return string\n     */\n    public function getTestnestedflatbufferBytes()\n    {\n        return $this->__vector_as_bytes(30);\n    }\n\n    public function getTestempty()\n    {\n        $obj = new Stat();\n        $o = $this->__offset(32);\n        return $o != 0 ? $obj->init($this->__indirect($o + $this->bb_pos), $this->bb) : 0;\n    }\n\n    /**\n     * @return bool\n     */\n    public function getTestbool()\n    {\n        $o = $this->__offset(34);\n        return $o != 0 ? $this->bb->getBool($o + $this->bb_pos) : false;\n    }\n\n    /**\n     * @return int\n     */\n    public function getTesthashs32Fnv1()\n    {\n        $o = $this->__offset(36);\n        return $o != 0 ? $this->bb->getInt($o + $this->bb_pos) : 0;\n    }\n\n    /**\n     * @return uint\n     */\n    public function getTesthashu32Fnv1()\n    {\n        $o = $this->__offset(38);\n        return $o != 0 ? $this->bb->getUint($o + $this->bb_pos) : 0;\n    }\n\n    /**\n     * @return long\n     */\n    public function getTesthashs64Fnv1()\n    {\n        $o = $this->__offset(40);\n        return $o != 0 ? $this->bb->getLong($o + $this->bb_pos) : 0;\n    }\n\n    /**\n     * @return ulong\n     */\n    public function getTesthashu64Fnv1()\n    {\n        $o = $this->__offset(42);\n        return $o != 0 ? $this->bb->getUlong($o + $this->bb_pos) : 0;\n    }\n\n    /**\n     * @return int\n     */\n    public function getTesthashs32Fnv1a()\n    {\n        $o = $this->__offset(44);\n        return $o != 0 ? $this->bb->getInt($o + $this->bb_pos) : 0;\n    }\n\n    /**\n     * @return uint\n     */\n    public function getTesthashu32Fnv1a()\n    {\n        $o = $this->__offset(46);\n        return $o != 0 ? $this->bb->getUint($o + $this->bb_pos) : 0;\n    }\n\n    /**\n     * @return long\n     */\n    public function getTesthashs64Fnv1a()\n    {\n        $o = $this->__offset(48);\n        return $o != 0 ? $this->bb->getLong($o + $this->bb_pos) : 0;\n    }\n\n    /**\n     * @return ulong\n     */\n    public function getTesthashu64Fnv1a()\n    {\n        $o = $this->__offset(50);\n        return $o != 0 ? $this->bb->getUlong($o + $this->bb_pos) : 0;\n    }\n\n    /**\n     * @param int offset\n     * @return bool\n     */\n    public function getTestarrayofbools($j)\n    {\n        $o = $this->__offset(52);\n        return $o != 0 ? $this->bb->getBool($this->__vector($o) + $j * 1) : 0;\n    }\n\n    /**\n     * @return int\n     */\n    public function getTestarrayofboolsLength()\n    {\n        $o = $this->__offset(52);\n        return $o != 0 ? $this->__vector_len($o) : 0;\n    }\n\n    /**\n     * @return float\n     */\n    public function getTestf()\n    {\n        $o = $this->__offset(54);\n        return $o != 0 ? $this->bb->getFloat($o + $this->bb_pos) : 3.14159;\n    }\n\n    /**\n     * @return float\n     */\n    public function getTestf2()\n    {\n        $o = $this->__offset(56);\n        return $o != 0 ? $this->bb->getFloat($o + $this->bb_pos) : 3.0;\n    }\n\n    /**\n     * @return float\n     */\n    public function getTestf3()\n    {\n        $o = $this->__offset(58);\n        return $o != 0 ? $this->bb->getFloat($o + $this->bb_pos) : 0.0;\n    }\n\n    /**\n     * @param int offset\n     * @return string\n     */\n    public function getTestarrayofstring2($j)\n    {\n        $o = $this->__offset(60);\n        return $o != 0 ? $this->__string($this->__vector($o) + $j * 4) : 0;\n    }\n\n    /**\n     * @return int\n     */\n    public function getTestarrayofstring2Length()\n    {\n        $o = $this->__offset(60);\n        return $o != 0 ? $this->__vector_len($o) : 0;\n    }\n\n    /**\n     * @returnVectorOffset\n     */\n    public function getTestarrayofsortedstruct($j)\n    {\n        $o = $this->__offset(62);\n        $obj = new Ability();\n        return $o != 0 ? $obj->init($this->__vector($o) + $j *8, $this->bb) : null;\n    }\n\n    /**\n     * @return int\n     */\n    public function getTestarrayofsortedstructLength()\n    {\n        $o = $this->__offset(62);\n        return $o != 0 ? $this->__vector_len($o) : 0;\n    }\n\n    /**\n     * @param int offset\n     * @return byte\n     */\n    public function getFlex($j)\n    {\n        $o = $this->__offset(64);\n        return $o != 0 ? $this->bb->getByte($this->__vector($o) + $j * 1) : 0;\n    }\n\n    /**\n     * @return int\n     */\n    public function getFlexLength()\n    {\n        $o = $this->__offset(64);\n        return $o != 0 ? $this->__vector_len($o) : 0;\n    }\n\n    /**\n     * @return string\n     */\n    public function getFlexBytes()\n    {\n        return $this->__vector_as_bytes(64);\n    }\n\n    /**\n     * @returnVectorOffset\n     */\n    public function getTest5($j)\n    {\n        $o = $this->__offset(66);\n        $obj = new Test();\n        return $o != 0 ? $obj->init($this->__vector($o) + $j *4, $this->bb) : null;\n    }\n\n    /**\n     * @return int\n     */\n    public function getTest5Length()\n    {\n        $o = $this->__offset(66);\n        return $o != 0 ? $this->__vector_len($o) : 0;\n    }\n\n    /**\n     * @param int offset\n     * @return long\n     */\n    public function getVectorOfLongs($j)\n    {\n        $o = $this->__offset(68);\n        return $o != 0 ? $this->bb->getLong($this->__vector($o) + $j * 8) : 0;\n    }\n\n    /**\n     * @return int\n     */\n    public function getVectorOfLongsLength()\n    {\n        $o = $this->__offset(68);\n        return $o != 0 ? $this->__vector_len($o) : 0;\n    }\n\n    /**\n     * @param int offset\n     * @return double\n     */\n    public function getVectorOfDoubles($j)\n    {\n        $o = $this->__offset(70);\n        return $o != 0 ? $this->bb->getDouble($this->__vector($o) + $j * 8) : 0;\n    }\n\n    /**\n     * @return int\n     */\n    public function getVectorOfDoublesLength()\n    {\n        $o = $this->__offset(70);\n        return $o != 0 ? $this->__vector_len($o) : 0;\n    }\n\n    public function getParentNamespaceTest()\n    {\n        $obj = new InParentNamespace();\n        $o = $this->__offset(72);\n        return $o != 0 ? $obj->init($this->__indirect($o + $this->bb_pos), $this->bb) : 0;\n    }\n\n    /**\n     * @returnVectorOffset\n     */\n    public function getVectorOfReferrables($j)\n    {\n        $o = $this->__offset(74);\n        $obj = new Referrable();\n        return $o != 0 ? $obj->init($this->__indirect($this->__vector($o) + $j * 4), $this->bb) : null;\n    }\n\n    /**\n     * @return int\n     */\n    public function getVectorOfReferrablesLength()\n    {\n        $o = $this->__offset(74);\n        return $o != 0 ? $this->__vector_len($o) : 0;\n    }\n\n    /**\n     * @return ulong\n     */\n    public function getSingleWeakReference()\n    {\n        $o = $this->__offset(76);\n        return $o != 0 ? $this->bb->getUlong($o + $this->bb_pos) : 0;\n    }\n\n    /**\n     * @param int offset\n     * @return ulong\n     */\n    public function getVectorOfWeakReferences($j)\n    {\n        $o = $this->__offset(78);\n        return $o != 0 ? $this->bb->getUlong($this->__vector($o) + $j * 8) : 0;\n    }\n\n    /**\n     * @return int\n     */\n    public function getVectorOfWeakReferencesLength()\n    {\n        $o = $this->__offset(78);\n        return $o != 0 ? $this->__vector_len($o) : 0;\n    }\n\n    /**\n     * @returnVectorOffset\n     */\n    public function getVectorOfStrongReferrables($j)\n    {\n        $o = $this->__offset(80);\n        $obj = new Referrable();\n        return $o != 0 ? $obj->init($this->__indirect($this->__vector($o) + $j * 4), $this->bb) : null;\n    }\n\n    /**\n     * @return int\n     */\n    public function getVectorOfStrongReferrablesLength()\n    {\n        $o = $this->__offset(80);\n        return $o != 0 ? $this->__vector_len($o) : 0;\n    }\n\n    /**\n     * @return ulong\n     */\n    public function getCoOwningReference()\n    {\n        $o = $this->__offset(82);\n        return $o != 0 ? $this->bb->getUlong($o + $this->bb_pos) : 0;\n    }\n\n    /**\n     * @param int offset\n     * @return ulong\n     */\n    public function getVectorOfCoOwningReferences($j)\n    {\n        $o = $this->__offset(84);\n        return $o != 0 ? $this->bb->getUlong($this->__vector($o) + $j * 8) : 0;\n    }\n\n    /**\n     * @return int\n     */\n    public function getVectorOfCoOwningReferencesLength()\n    {\n        $o = $this->__offset(84);\n        return $o != 0 ? $this->__vector_len($o) : 0;\n    }\n\n    /**\n     * @return ulong\n     */\n    public function getNonOwningReference()\n    {\n        $o = $this->__offset(86);\n        return $o != 0 ? $this->bb->getUlong($o + $this->bb_pos) : 0;\n    }\n\n    /**\n     * @param int offset\n     * @return ulong\n     */\n    public function getVectorOfNonOwningReferences($j)\n    {\n        $o = $this->__offset(88);\n        return $o != 0 ? $this->bb->getUlong($this->__vector($o) + $j * 8) : 0;\n    }\n\n    /**\n     * @return int\n     */\n    public function getVectorOfNonOwningReferencesLength()\n    {\n        $o = $this->__offset(88);\n        return $o != 0 ? $this->__vector_len($o) : 0;\n    }\n\n    /**\n     * @return byte\n     */\n    public function getAnyUniqueType()\n    {\n        $o = $this->__offset(90);\n        return $o != 0 ? $this->bb->getByte($o + $this->bb_pos) : \\MyGame\\Example\\AnyUniqueAliases::NONE;\n    }\n\n    /**\n     * @returnint\n     */\n    public function getAnyUnique($obj)\n    {\n        $o = $this->__offset(92);\n        return $o != 0 ? $this->__union($obj, $o) : null;\n    }\n\n    /**\n     * @return byte\n     */\n    public function getAnyAmbiguousType()\n    {\n        $o = $this->__offset(94);\n        return $o != 0 ? $this->bb->getByte($o + $this->bb_pos) : \\MyGame\\Example\\AnyAmbiguousAliases::NONE;\n    }\n\n    /**\n     * @returnint\n     */\n    public function getAnyAmbiguous($obj)\n    {\n        $o = $this->__offset(96);\n        return $o != 0 ? $this->__union($obj, $o) : null;\n    }\n\n    /**\n     * @param int offset\n     * @return byte\n     */\n    public function getVectorOfEnums($j)\n    {\n        $o = $this->__offset(98);\n        return $o != 0 ? $this->bb->getByte($this->__vector($o) + $j * 1) : 0;\n    }\n\n    /**\n     * @return int\n     */\n    public function getVectorOfEnumsLength()\n    {\n        $o = $this->__offset(98);\n        return $o != 0 ? $this->__vector_len($o) : 0;\n    }\n\n    /**\n     * @return string\n     */\n    public function getVectorOfEnumsBytes()\n    {\n        return $this->__vector_as_bytes(98);\n    }\n\n    /**\n     * @return sbyte\n     */\n    public function getSignedEnum()\n    {\n        $o = $this->__offset(100);\n        return $o != 0 ? $this->bb->getSbyte($o + $this->bb_pos) : \\MyGame\\Example\\Race::None;\n    }\n\n    /**\n     * @param int offset\n     * @return byte\n     */\n    public function getTestrequirednestedflatbuffer($j)\n    {\n        $o = $this->__offset(102);\n        return $o != 0 ? $this->bb->getByte($this->__vector($o) + $j * 1) : 0;\n    }\n\n    /**\n     * @return int\n     */\n    public function getTestrequirednestedflatbufferLength()\n    {\n        $o = $this->__offset(102);\n        return $o != 0 ? $this->__vector_len($o) : 0;\n    }\n\n    /**\n     * @return string\n     */\n    public function getTestrequirednestedflatbufferBytes()\n    {\n        return $this->__vector_as_bytes(102);\n    }\n\n    /**\n     * @returnVectorOffset\n     */\n    public function getScalarKeySortedTables($j)\n    {\n        $o = $this->__offset(104);\n        $obj = new Stat();\n        return $o != 0 ? $obj->init($this->__indirect($this->__vector($o) + $j * 4), $this->bb) : null;\n    }\n\n    /**\n     * @return int\n     */\n    public function getScalarKeySortedTablesLength()\n    {\n        $o = $this->__offset(104);\n        return $o != 0 ? $this->__vector_len($o) : 0;\n    }\n\n    public function getNativeInline()\n    {\n        $obj = new Test();\n        $o = $this->__offset(106);\n        return $o != 0 ? $obj->init($o + $this->bb_pos, $this->bb) : 0;\n    }\n\n    /**\n     * @return ulong\n     */\n    public function getLongEnumNonEnumDefault()\n    {\n        $o = $this->__offset(108);\n        return $o != 0 ? $this->bb->getUlong($o + $this->bb_pos) : 0;\n    }\n\n    /**\n     * @return ulong\n     */\n    public function getLongEnumNormalDefault()\n    {\n        $o = $this->__offset(110);\n        return $o != 0 ? $this->bb->getUlong($o + $this->bb_pos) : \\MyGame\\Example\\LongEnum::LongOne;\n    }\n\n    /**\n     * @return float\n     */\n    public function getNanDefault()\n    {\n        $o = $this->__offset(112);\n        return $o != 0 ? $this->bb->getFloat($o + $this->bb_pos) : nan;\n    }\n\n    /**\n     * @return float\n     */\n    public function getInfDefault()\n    {\n        $o = $this->__offset(114);\n        return $o != 0 ? $this->bb->getFloat($o + $this->bb_pos) : inf;\n    }\n\n    /**\n     * @return float\n     */\n    public function getPositiveInfDefault()\n    {\n        $o = $this->__offset(116);\n        return $o != 0 ? $this->bb->getFloat($o + $this->bb_pos) : +inf;\n    }\n\n    /**\n     * @return float\n     */\n    public function getInfinityDefault()\n    {\n        $o = $this->__offset(118);\n        return $o != 0 ? $this->bb->getFloat($o + $this->bb_pos) : infinity;\n    }\n\n    /**\n     * @return float\n     */\n    public function getPositiveInfinityDefault()\n    {\n        $o = $this->__offset(120);\n        return $o != 0 ? $this->bb->getFloat($o + $this->bb_pos) : +infinity;\n    }\n\n    /**\n     * @return float\n     */\n    public function getNegativeInfDefault()\n    {\n        $o = $this->__offset(122);\n        return $o != 0 ? $this->bb->getFloat($o + $this->bb_pos) : -inf;\n    }\n\n    /**\n     * @return float\n     */\n    public function getNegativeInfinityDefault()\n    {\n        $o = $this->__offset(124);\n        return $o != 0 ? $this->bb->getFloat($o + $this->bb_pos) : -infinity;\n    }\n\n    /**\n     * @return double\n     */\n    public function getDoubleInfDefault()\n    {\n        $o = $this->__offset(126);\n        return $o != 0 ? $this->bb->getDouble($o + $this->bb_pos) : inf;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return void\n     */\n    public static function startMonster(FlatBufferBuilder $builder)\n    {\n        $builder->StartObject(62);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return Monster\n     */\n    public static function createMonster(FlatBufferBuilder $builder, $pos, $mana, $hp, $name, $inventory, $color, $test_type, $test, $test4, $testarrayofstring, $testarrayoftables, $enemy, $testnestedflatbuffer, $testempty, $testbool, $testhashs32_fnv1, $testhashu32_fnv1, $testhashs64_fnv1, $testhashu64_fnv1, $testhashs32_fnv1a, $testhashu32_fnv1a, $testhashs64_fnv1a, $testhashu64_fnv1a, $testarrayofbools, $testf, $testf2, $testf3, $testarrayofstring2, $testarrayofsortedstruct, $flex, $test5, $vector_of_longs, $vector_of_doubles, $parent_namespace_test, $vector_of_referrables, $single_weak_reference, $vector_of_weak_references, $vector_of_strong_referrables, $co_owning_reference, $vector_of_co_owning_references, $non_owning_reference, $vector_of_non_owning_references, $any_unique_type, $any_unique, $any_ambiguous_type, $any_ambiguous, $vector_of_enums, $signed_enum, $testrequirednestedflatbuffer, $scalar_key_sorted_tables, $native_inline, $long_enum_non_enum_default, $long_enum_normal_default, $nan_default, $inf_default, $positive_inf_default, $infinity_default, $positive_infinity_default, $negative_inf_default, $negative_infinity_default, $double_inf_default)\n    {\n        $builder->startObject(62);\n        self::addPos($builder, $pos);\n        self::addMana($builder, $mana);\n        self::addHp($builder, $hp);\n        self::addName($builder, $name);\n        self::addInventory($builder, $inventory);\n        self::addColor($builder, $color);\n        self::addTestType($builder, $test_type);\n        self::addTest($builder, $test);\n        self::addTest4($builder, $test4);\n        self::addTestarrayofstring($builder, $testarrayofstring);\n        self::addTestarrayoftables($builder, $testarrayoftables);\n        self::addEnemy($builder, $enemy);\n        self::addTestnestedflatbuffer($builder, $testnestedflatbuffer);\n        self::addTestempty($builder, $testempty);\n        self::addTestbool($builder, $testbool);\n        self::addTesthashs32Fnv1($builder, $testhashs32_fnv1);\n        self::addTesthashu32Fnv1($builder, $testhashu32_fnv1);\n        self::addTesthashs64Fnv1($builder, $testhashs64_fnv1);\n        self::addTesthashu64Fnv1($builder, $testhashu64_fnv1);\n        self::addTesthashs32Fnv1a($builder, $testhashs32_fnv1a);\n        self::addTesthashu32Fnv1a($builder, $testhashu32_fnv1a);\n        self::addTesthashs64Fnv1a($builder, $testhashs64_fnv1a);\n        self::addTesthashu64Fnv1a($builder, $testhashu64_fnv1a);\n        self::addTestarrayofbools($builder, $testarrayofbools);\n        self::addTestf($builder, $testf);\n        self::addTestf2($builder, $testf2);\n        self::addTestf3($builder, $testf3);\n        self::addTestarrayofstring2($builder, $testarrayofstring2);\n        self::addTestarrayofsortedstruct($builder, $testarrayofsortedstruct);\n        self::addFlex($builder, $flex);\n        self::addTest5($builder, $test5);\n        self::addVectorOfLongs($builder, $vector_of_longs);\n        self::addVectorOfDoubles($builder, $vector_of_doubles);\n        self::addParentNamespaceTest($builder, $parent_namespace_test);\n        self::addVectorOfReferrables($builder, $vector_of_referrables);\n        self::addSingleWeakReference($builder, $single_weak_reference);\n        self::addVectorOfWeakReferences($builder, $vector_of_weak_references);\n        self::addVectorOfStrongReferrables($builder, $vector_of_strong_referrables);\n        self::addCoOwningReference($builder, $co_owning_reference);\n        self::addVectorOfCoOwningReferences($builder, $vector_of_co_owning_references);\n        self::addNonOwningReference($builder, $non_owning_reference);\n        self::addVectorOfNonOwningReferences($builder, $vector_of_non_owning_references);\n        self::addAnyUniqueType($builder, $any_unique_type);\n        self::addAnyUnique($builder, $any_unique);\n        self::addAnyAmbiguousType($builder, $any_ambiguous_type);\n        self::addAnyAmbiguous($builder, $any_ambiguous);\n        self::addVectorOfEnums($builder, $vector_of_enums);\n        self::addSignedEnum($builder, $signed_enum);\n        self::addTestrequirednestedflatbuffer($builder, $testrequirednestedflatbuffer);\n        self::addScalarKeySortedTables($builder, $scalar_key_sorted_tables);\n        self::addNativeInline($builder, $native_inline);\n        self::addLongEnumNonEnumDefault($builder, $long_enum_non_enum_default);\n        self::addLongEnumNormalDefault($builder, $long_enum_normal_default);\n        self::addNanDefault($builder, $nan_default);\n        self::addInfDefault($builder, $inf_default);\n        self::addPositiveInfDefault($builder, $positive_inf_default);\n        self::addInfinityDefault($builder, $infinity_default);\n        self::addPositiveInfinityDefault($builder, $positive_infinity_default);\n        self::addNegativeInfDefault($builder, $negative_inf_default);\n        self::addNegativeInfinityDefault($builder, $negative_infinity_default);\n        self::addDoubleInfDefault($builder, $double_inf_default);\n        $o = $builder->endObject();\n        $builder->required($o, 10);  // name\n        return $o;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addPos(FlatBufferBuilder $builder, $pos)\n    {\n        $builder->addStructX(0, $pos, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param short\n     * @return void\n     */\n    public static function addMana(FlatBufferBuilder $builder, $mana)\n    {\n        $builder->addShortX(1, $mana, 150);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param short\n     * @return void\n     */\n    public static function addHp(FlatBufferBuilder $builder, $hp)\n    {\n        $builder->addShortX(2, $hp, 100);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param StringOffset\n     * @return void\n     */\n    public static function addName(FlatBufferBuilder $builder, $name)\n    {\n        $builder->addOffsetX(3, $name, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addInventory(FlatBufferBuilder $builder, $inventory)\n    {\n        $builder->addOffsetX(5, $inventory, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param array offset array\n     * @return int vector offset\n     */\n    public static function createInventoryVector(FlatBufferBuilder $builder, array $data)\n    {\n        $builder->startVector(1, count($data), 1);\n        for ($i = count($data) - 1; $i >= 0; $i--) {\n            $builder->putByte($data[$i]);\n        }\n        return $builder->endVector();\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int $numElems\n     * @return void\n     */\n    public static function startInventoryVector(FlatBufferBuilder $builder, $numElems)\n    {\n        $builder->startVector(1, $numElems, 1);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param byte\n     * @return void\n     */\n    public static function addColor(FlatBufferBuilder $builder, $color)\n    {\n        $builder->addByteX(6, $color, 8);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param byte\n     * @return void\n     */\n    public static function addTestType(FlatBufferBuilder $builder, $testType)\n    {\n        $builder->addByteX(7, $testType, 0);\n    }\n\n    public static function addTest(FlatBufferBuilder $builder, $offset)\n    {\n        $builder->addOffsetX(8, $offset, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addTest4(FlatBufferBuilder $builder, $test4)\n    {\n        $builder->addOffsetX(9, $test4, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param array offset array\n     * @return int vector offset\n     */\n    public static function createTest4Vector(FlatBufferBuilder $builder, array $data)\n    {\n        $builder->startVector(4, count($data), 2);\n        for ($i = count($data) - 1; $i >= 0; $i--) {\n            $builder->putOffset($data[$i]);\n        }\n        return $builder->endVector();\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int $numElems\n     * @return void\n     */\n    public static function startTest4Vector(FlatBufferBuilder $builder, $numElems)\n    {\n        $builder->startVector(4, $numElems, 2);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addTestarrayofstring(FlatBufferBuilder $builder, $testarrayofstring)\n    {\n        $builder->addOffsetX(10, $testarrayofstring, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param array offset array\n     * @return int vector offset\n     */\n    public static function createTestarrayofstringVector(FlatBufferBuilder $builder, array $data)\n    {\n        $builder->startVector(4, count($data), 4);\n        for ($i = count($data) - 1; $i >= 0; $i--) {\n            $builder->putOffset($data[$i]);\n        }\n        return $builder->endVector();\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int $numElems\n     * @return void\n     */\n    public static function startTestarrayofstringVector(FlatBufferBuilder $builder, $numElems)\n    {\n        $builder->startVector(4, $numElems, 4);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addTestarrayoftables(FlatBufferBuilder $builder, $testarrayoftables)\n    {\n        $builder->addOffsetX(11, $testarrayoftables, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param array offset array\n     * @return int vector offset\n     */\n    public static function createTestarrayoftablesVector(FlatBufferBuilder $builder, array $data)\n    {\n        $builder->startVector(4, count($data), 4);\n        for ($i = count($data) - 1; $i >= 0; $i--) {\n            $builder->putOffset($data[$i]);\n        }\n        return $builder->endVector();\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int $numElems\n     * @return void\n     */\n    public static function startTestarrayoftablesVector(FlatBufferBuilder $builder, $numElems)\n    {\n        $builder->startVector(4, $numElems, 4);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addEnemy(FlatBufferBuilder $builder, $enemy)\n    {\n        $builder->addOffsetX(12, $enemy, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addTestnestedflatbuffer(FlatBufferBuilder $builder, $testnestedflatbuffer)\n    {\n        $builder->addOffsetX(13, $testnestedflatbuffer, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param array offset array\n     * @return int vector offset\n     */\n    public static function createTestnestedflatbufferVector(FlatBufferBuilder $builder, array $data)\n    {\n        $builder->startVector(1, count($data), 1);\n        for ($i = count($data) - 1; $i >= 0; $i--) {\n            $builder->putByte($data[$i]);\n        }\n        return $builder->endVector();\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int $numElems\n     * @return void\n     */\n    public static function startTestnestedflatbufferVector(FlatBufferBuilder $builder, $numElems)\n    {\n        $builder->startVector(1, $numElems, 1);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addTestempty(FlatBufferBuilder $builder, $testempty)\n    {\n        $builder->addOffsetX(14, $testempty, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param bool\n     * @return void\n     */\n    public static function addTestbool(FlatBufferBuilder $builder, $testbool)\n    {\n        $builder->addBoolX(15, $testbool, false);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int\n     * @return void\n     */\n    public static function addTesthashs32Fnv1(FlatBufferBuilder $builder, $testhashs32Fnv1)\n    {\n        $builder->addIntX(16, $testhashs32Fnv1, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param uint\n     * @return void\n     */\n    public static function addTesthashu32Fnv1(FlatBufferBuilder $builder, $testhashu32Fnv1)\n    {\n        $builder->addUintX(17, $testhashu32Fnv1, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param long\n     * @return void\n     */\n    public static function addTesthashs64Fnv1(FlatBufferBuilder $builder, $testhashs64Fnv1)\n    {\n        $builder->addLongX(18, $testhashs64Fnv1, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param ulong\n     * @return void\n     */\n    public static function addTesthashu64Fnv1(FlatBufferBuilder $builder, $testhashu64Fnv1)\n    {\n        $builder->addUlongX(19, $testhashu64Fnv1, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int\n     * @return void\n     */\n    public static function addTesthashs32Fnv1a(FlatBufferBuilder $builder, $testhashs32Fnv1a)\n    {\n        $builder->addIntX(20, $testhashs32Fnv1a, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param uint\n     * @return void\n     */\n    public static function addTesthashu32Fnv1a(FlatBufferBuilder $builder, $testhashu32Fnv1a)\n    {\n        $builder->addUintX(21, $testhashu32Fnv1a, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param long\n     * @return void\n     */\n    public static function addTesthashs64Fnv1a(FlatBufferBuilder $builder, $testhashs64Fnv1a)\n    {\n        $builder->addLongX(22, $testhashs64Fnv1a, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param ulong\n     * @return void\n     */\n    public static function addTesthashu64Fnv1a(FlatBufferBuilder $builder, $testhashu64Fnv1a)\n    {\n        $builder->addUlongX(23, $testhashu64Fnv1a, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addTestarrayofbools(FlatBufferBuilder $builder, $testarrayofbools)\n    {\n        $builder->addOffsetX(24, $testarrayofbools, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param array offset array\n     * @return int vector offset\n     */\n    public static function createTestarrayofboolsVector(FlatBufferBuilder $builder, array $data)\n    {\n        $builder->startVector(1, count($data), 1);\n        for ($i = count($data) - 1; $i >= 0; $i--) {\n            $builder->putBool($data[$i]);\n        }\n        return $builder->endVector();\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int $numElems\n     * @return void\n     */\n    public static function startTestarrayofboolsVector(FlatBufferBuilder $builder, $numElems)\n    {\n        $builder->startVector(1, $numElems, 1);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param float\n     * @return void\n     */\n    public static function addTestf(FlatBufferBuilder $builder, $testf)\n    {\n        $builder->addFloatX(25, $testf, 3.14159);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param float\n     * @return void\n     */\n    public static function addTestf2(FlatBufferBuilder $builder, $testf2)\n    {\n        $builder->addFloatX(26, $testf2, 3.0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param float\n     * @return void\n     */\n    public static function addTestf3(FlatBufferBuilder $builder, $testf3)\n    {\n        $builder->addFloatX(27, $testf3, 0.0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addTestarrayofstring2(FlatBufferBuilder $builder, $testarrayofstring2)\n    {\n        $builder->addOffsetX(28, $testarrayofstring2, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param array offset array\n     * @return int vector offset\n     */\n    public static function createTestarrayofstring2Vector(FlatBufferBuilder $builder, array $data)\n    {\n        $builder->startVector(4, count($data), 4);\n        for ($i = count($data) - 1; $i >= 0; $i--) {\n            $builder->putOffset($data[$i]);\n        }\n        return $builder->endVector();\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int $numElems\n     * @return void\n     */\n    public static function startTestarrayofstring2Vector(FlatBufferBuilder $builder, $numElems)\n    {\n        $builder->startVector(4, $numElems, 4);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addTestarrayofsortedstruct(FlatBufferBuilder $builder, $testarrayofsortedstruct)\n    {\n        $builder->addOffsetX(29, $testarrayofsortedstruct, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param array offset array\n     * @return int vector offset\n     */\n    public static function createTestarrayofsortedstructVector(FlatBufferBuilder $builder, array $data)\n    {\n        $builder->startVector(8, count($data), 4);\n        for ($i = count($data) - 1; $i >= 0; $i--) {\n            $builder->putOffset($data[$i]);\n        }\n        return $builder->endVector();\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int $numElems\n     * @return void\n     */\n    public static function startTestarrayofsortedstructVector(FlatBufferBuilder $builder, $numElems)\n    {\n        $builder->startVector(8, $numElems, 4);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addFlex(FlatBufferBuilder $builder, $flex)\n    {\n        $builder->addOffsetX(30, $flex, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param array offset array\n     * @return int vector offset\n     */\n    public static function createFlexVector(FlatBufferBuilder $builder, array $data)\n    {\n        $builder->startVector(1, count($data), 1);\n        for ($i = count($data) - 1; $i >= 0; $i--) {\n            $builder->putByte($data[$i]);\n        }\n        return $builder->endVector();\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int $numElems\n     * @return void\n     */\n    public static function startFlexVector(FlatBufferBuilder $builder, $numElems)\n    {\n        $builder->startVector(1, $numElems, 1);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addTest5(FlatBufferBuilder $builder, $test5)\n    {\n        $builder->addOffsetX(31, $test5, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param array offset array\n     * @return int vector offset\n     */\n    public static function createTest5Vector(FlatBufferBuilder $builder, array $data)\n    {\n        $builder->startVector(4, count($data), 2);\n        for ($i = count($data) - 1; $i >= 0; $i--) {\n            $builder->putOffset($data[$i]);\n        }\n        return $builder->endVector();\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int $numElems\n     * @return void\n     */\n    public static function startTest5Vector(FlatBufferBuilder $builder, $numElems)\n    {\n        $builder->startVector(4, $numElems, 2);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addVectorOfLongs(FlatBufferBuilder $builder, $vectorOfLongs)\n    {\n        $builder->addOffsetX(32, $vectorOfLongs, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param array offset array\n     * @return int vector offset\n     */\n    public static function createVectorOfLongsVector(FlatBufferBuilder $builder, array $data)\n    {\n        $builder->startVector(8, count($data), 8);\n        for ($i = count($data) - 1; $i >= 0; $i--) {\n            $builder->putLong($data[$i]);\n        }\n        return $builder->endVector();\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int $numElems\n     * @return void\n     */\n    public static function startVectorOfLongsVector(FlatBufferBuilder $builder, $numElems)\n    {\n        $builder->startVector(8, $numElems, 8);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addVectorOfDoubles(FlatBufferBuilder $builder, $vectorOfDoubles)\n    {\n        $builder->addOffsetX(33, $vectorOfDoubles, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param array offset array\n     * @return int vector offset\n     */\n    public static function createVectorOfDoublesVector(FlatBufferBuilder $builder, array $data)\n    {\n        $builder->startVector(8, count($data), 8);\n        for ($i = count($data) - 1; $i >= 0; $i--) {\n            $builder->putDouble($data[$i]);\n        }\n        return $builder->endVector();\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int $numElems\n     * @return void\n     */\n    public static function startVectorOfDoublesVector(FlatBufferBuilder $builder, $numElems)\n    {\n        $builder->startVector(8, $numElems, 8);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addParentNamespaceTest(FlatBufferBuilder $builder, $parentNamespaceTest)\n    {\n        $builder->addOffsetX(34, $parentNamespaceTest, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addVectorOfReferrables(FlatBufferBuilder $builder, $vectorOfReferrables)\n    {\n        $builder->addOffsetX(35, $vectorOfReferrables, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param array offset array\n     * @return int vector offset\n     */\n    public static function createVectorOfReferrablesVector(FlatBufferBuilder $builder, array $data)\n    {\n        $builder->startVector(4, count($data), 4);\n        for ($i = count($data) - 1; $i >= 0; $i--) {\n            $builder->putOffset($data[$i]);\n        }\n        return $builder->endVector();\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int $numElems\n     * @return void\n     */\n    public static function startVectorOfReferrablesVector(FlatBufferBuilder $builder, $numElems)\n    {\n        $builder->startVector(4, $numElems, 4);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param ulong\n     * @return void\n     */\n    public static function addSingleWeakReference(FlatBufferBuilder $builder, $singleWeakReference)\n    {\n        $builder->addUlongX(36, $singleWeakReference, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addVectorOfWeakReferences(FlatBufferBuilder $builder, $vectorOfWeakReferences)\n    {\n        $builder->addOffsetX(37, $vectorOfWeakReferences, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param array offset array\n     * @return int vector offset\n     */\n    public static function createVectorOfWeakReferencesVector(FlatBufferBuilder $builder, array $data)\n    {\n        $builder->startVector(8, count($data), 8);\n        for ($i = count($data) - 1; $i >= 0; $i--) {\n            $builder->putUlong($data[$i]);\n        }\n        return $builder->endVector();\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int $numElems\n     * @return void\n     */\n    public static function startVectorOfWeakReferencesVector(FlatBufferBuilder $builder, $numElems)\n    {\n        $builder->startVector(8, $numElems, 8);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addVectorOfStrongReferrables(FlatBufferBuilder $builder, $vectorOfStrongReferrables)\n    {\n        $builder->addOffsetX(38, $vectorOfStrongReferrables, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param array offset array\n     * @return int vector offset\n     */\n    public static function createVectorOfStrongReferrablesVector(FlatBufferBuilder $builder, array $data)\n    {\n        $builder->startVector(4, count($data), 4);\n        for ($i = count($data) - 1; $i >= 0; $i--) {\n            $builder->putOffset($data[$i]);\n        }\n        return $builder->endVector();\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int $numElems\n     * @return void\n     */\n    public static function startVectorOfStrongReferrablesVector(FlatBufferBuilder $builder, $numElems)\n    {\n        $builder->startVector(4, $numElems, 4);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param ulong\n     * @return void\n     */\n    public static function addCoOwningReference(FlatBufferBuilder $builder, $coOwningReference)\n    {\n        $builder->addUlongX(39, $coOwningReference, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addVectorOfCoOwningReferences(FlatBufferBuilder $builder, $vectorOfCoOwningReferences)\n    {\n        $builder->addOffsetX(40, $vectorOfCoOwningReferences, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param array offset array\n     * @return int vector offset\n     */\n    public static function createVectorOfCoOwningReferencesVector(FlatBufferBuilder $builder, array $data)\n    {\n        $builder->startVector(8, count($data), 8);\n        for ($i = count($data) - 1; $i >= 0; $i--) {\n            $builder->putUlong($data[$i]);\n        }\n        return $builder->endVector();\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int $numElems\n     * @return void\n     */\n    public static function startVectorOfCoOwningReferencesVector(FlatBufferBuilder $builder, $numElems)\n    {\n        $builder->startVector(8, $numElems, 8);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param ulong\n     * @return void\n     */\n    public static function addNonOwningReference(FlatBufferBuilder $builder, $nonOwningReference)\n    {\n        $builder->addUlongX(41, $nonOwningReference, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addVectorOfNonOwningReferences(FlatBufferBuilder $builder, $vectorOfNonOwningReferences)\n    {\n        $builder->addOffsetX(42, $vectorOfNonOwningReferences, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param array offset array\n     * @return int vector offset\n     */\n    public static function createVectorOfNonOwningReferencesVector(FlatBufferBuilder $builder, array $data)\n    {\n        $builder->startVector(8, count($data), 8);\n        for ($i = count($data) - 1; $i >= 0; $i--) {\n            $builder->putUlong($data[$i]);\n        }\n        return $builder->endVector();\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int $numElems\n     * @return void\n     */\n    public static function startVectorOfNonOwningReferencesVector(FlatBufferBuilder $builder, $numElems)\n    {\n        $builder->startVector(8, $numElems, 8);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param byte\n     * @return void\n     */\n    public static function addAnyUniqueType(FlatBufferBuilder $builder, $anyUniqueType)\n    {\n        $builder->addByteX(43, $anyUniqueType, 0);\n    }\n\n    public static function addAnyUnique(FlatBufferBuilder $builder, $offset)\n    {\n        $builder->addOffsetX(44, $offset, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param byte\n     * @return void\n     */\n    public static function addAnyAmbiguousType(FlatBufferBuilder $builder, $anyAmbiguousType)\n    {\n        $builder->addByteX(45, $anyAmbiguousType, 0);\n    }\n\n    public static function addAnyAmbiguous(FlatBufferBuilder $builder, $offset)\n    {\n        $builder->addOffsetX(46, $offset, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addVectorOfEnums(FlatBufferBuilder $builder, $vectorOfEnums)\n    {\n        $builder->addOffsetX(47, $vectorOfEnums, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param array offset array\n     * @return int vector offset\n     */\n    public static function createVectorOfEnumsVector(FlatBufferBuilder $builder, array $data)\n    {\n        $builder->startVector(1, count($data), 1);\n        for ($i = count($data) - 1; $i >= 0; $i--) {\n            $builder->putByte($data[$i]);\n        }\n        return $builder->endVector();\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int $numElems\n     * @return void\n     */\n    public static function startVectorOfEnumsVector(FlatBufferBuilder $builder, $numElems)\n    {\n        $builder->startVector(1, $numElems, 1);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param sbyte\n     * @return void\n     */\n    public static function addSignedEnum(FlatBufferBuilder $builder, $signedEnum)\n    {\n        $builder->addSbyteX(48, $signedEnum, -1);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addTestrequirednestedflatbuffer(FlatBufferBuilder $builder, $testrequirednestedflatbuffer)\n    {\n        $builder->addOffsetX(49, $testrequirednestedflatbuffer, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param array offset array\n     * @return int vector offset\n     */\n    public static function createTestrequirednestedflatbufferVector(FlatBufferBuilder $builder, array $data)\n    {\n        $builder->startVector(1, count($data), 1);\n        for ($i = count($data) - 1; $i >= 0; $i--) {\n            $builder->putByte($data[$i]);\n        }\n        return $builder->endVector();\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int $numElems\n     * @return void\n     */\n    public static function startTestrequirednestedflatbufferVector(FlatBufferBuilder $builder, $numElems)\n    {\n        $builder->startVector(1, $numElems, 1);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addScalarKeySortedTables(FlatBufferBuilder $builder, $scalarKeySortedTables)\n    {\n        $builder->addOffsetX(50, $scalarKeySortedTables, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param array offset array\n     * @return int vector offset\n     */\n    public static function createScalarKeySortedTablesVector(FlatBufferBuilder $builder, array $data)\n    {\n        $builder->startVector(4, count($data), 4);\n        for ($i = count($data) - 1; $i >= 0; $i--) {\n            $builder->putOffset($data[$i]);\n        }\n        return $builder->endVector();\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int $numElems\n     * @return void\n     */\n    public static function startScalarKeySortedTablesVector(FlatBufferBuilder $builder, $numElems)\n    {\n        $builder->startVector(4, $numElems, 4);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addNativeInline(FlatBufferBuilder $builder, $nativeInline)\n    {\n        $builder->addStructX(51, $nativeInline, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param ulong\n     * @return void\n     */\n    public static function addLongEnumNonEnumDefault(FlatBufferBuilder $builder, $longEnumNonEnumDefault)\n    {\n        $builder->addUlongX(52, $longEnumNonEnumDefault, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param ulong\n     * @return void\n     */\n    public static function addLongEnumNormalDefault(FlatBufferBuilder $builder, $longEnumNormalDefault)\n    {\n        $builder->addUlongX(53, $longEnumNormalDefault, 2);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param float\n     * @return void\n     */\n    public static function addNanDefault(FlatBufferBuilder $builder, $nanDefault)\n    {\n        $builder->addFloatX(54, $nanDefault, nan);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param float\n     * @return void\n     */\n    public static function addInfDefault(FlatBufferBuilder $builder, $infDefault)\n    {\n        $builder->addFloatX(55, $infDefault, inf);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param float\n     * @return void\n     */\n    public static function addPositiveInfDefault(FlatBufferBuilder $builder, $positiveInfDefault)\n    {\n        $builder->addFloatX(56, $positiveInfDefault, +inf);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param float\n     * @return void\n     */\n    public static function addInfinityDefault(FlatBufferBuilder $builder, $infinityDefault)\n    {\n        $builder->addFloatX(57, $infinityDefault, infinity);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param float\n     * @return void\n     */\n    public static function addPositiveInfinityDefault(FlatBufferBuilder $builder, $positiveInfinityDefault)\n    {\n        $builder->addFloatX(58, $positiveInfinityDefault, +infinity);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param float\n     * @return void\n     */\n    public static function addNegativeInfDefault(FlatBufferBuilder $builder, $negativeInfDefault)\n    {\n        $builder->addFloatX(59, $negativeInfDefault, -inf);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param float\n     * @return void\n     */\n    public static function addNegativeInfinityDefault(FlatBufferBuilder $builder, $negativeInfinityDefault)\n    {\n        $builder->addFloatX(60, $negativeInfinityDefault, -infinity);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param double\n     * @return void\n     */\n    public static function addDoubleInfDefault(FlatBufferBuilder $builder, $doubleInfDefault)\n    {\n        $builder->addDoubleX(61, $doubleInfDefault, inf);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return int table offset\n     */\n    public static function endMonster(FlatBufferBuilder $builder)\n    {\n        $o = $builder->endObject();\n        $builder->required($o, 10);  // name\n        return $o;\n    }\n\n    public static function finishMonsterBuffer(FlatBufferBuilder $builder, $offset)\n    {\n        $builder->finish($offset, \"MONS\");\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Monster.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: Example\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\n# an example documentation comment: \"monster object\"\nclass Monster(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = Monster()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsMonster(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    @classmethod\n    def MonsterBufferHasIdentifier(cls, buf, offset, size_prefixed=False):\n        return flatbuffers.util.BufferHasIdentifier(buf, offset, b\"\\x4D\\x4F\\x4E\\x53\", size_prefixed=size_prefixed)\n\n    # Monster\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # Monster\n    def Pos(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            x = o + self._tab.Pos\n            from MyGame.Example.Vec3 import Vec3\n            obj = Vec3()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Monster\n    def Mana(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int16Flags, o + self._tab.Pos)\n        return 150\n\n    # Monster\n    def Hp(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int16Flags, o + self._tab.Pos)\n        return 100\n\n    # Monster\n    def Name(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10))\n        if o != 0:\n            return self._tab.String(o + self._tab.Pos)\n        return None\n\n    # Monster\n    def Inventory(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1))\n        return 0\n\n    # Monster\n    def InventoryAsNumpy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))\n        if o != 0:\n            return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint8Flags, o)\n        return 0\n\n    # Monster\n    def InventoryLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def InventoryIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))\n        return o == 0\n\n    # Monster\n    def Color(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos)\n        return 8\n\n    # Monster\n    def TestType(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(18))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def Test(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(20))\n        if o != 0:\n            from flatbuffers.table import Table\n            obj = Table(bytearray(), 0)\n            self._tab.Union(obj, o)\n            return obj\n        return None\n\n    # Monster\n    def Test4(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(22))\n        if o != 0:\n            x = self._tab.Vector(o)\n            x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4\n            from MyGame.Example.Test import Test\n            obj = Test()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Monster\n    def Test4Length(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(22))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def Test4IsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(22))\n        return o == 0\n\n    # Monster\n    def Testarrayofstring(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(24))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.String(a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4))\n        return \"\"\n\n    # Monster\n    def TestarrayofstringLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(24))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def TestarrayofstringIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(24))\n        return o == 0\n\n    # an example documentation comment: this will end up in the generated code\n    # multiline too\n    # Monster\n    def Testarrayoftables(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(26))\n        if o != 0:\n            x = self._tab.Vector(o)\n            x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4\n            x = self._tab.Indirect(x)\n            from MyGame.Example.Monster import Monster\n            obj = Monster()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Monster\n    def TestarrayoftablesLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(26))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def TestarrayoftablesIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(26))\n        return o == 0\n\n    # Monster\n    def Enemy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(28))\n        if o != 0:\n            x = self._tab.Indirect(o + self._tab.Pos)\n            from MyGame.Example.Monster import Monster\n            obj = Monster()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Monster\n    def Testnestedflatbuffer(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(30))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1))\n        return 0\n\n    # Monster\n    def TestnestedflatbufferAsNumpy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(30))\n        if o != 0:\n            return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint8Flags, o)\n        return 0\n\n    # Monster\n    def TestnestedflatbufferNestedRoot(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(30))\n        if o != 0:\n            from MyGame.Example.Monster import Monster\n            return Monster.GetRootAs(self._tab.Bytes, self._tab.Vector(o))\n        return 0\n\n    # Monster\n    def TestnestedflatbufferLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(30))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def TestnestedflatbufferIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(30))\n        return o == 0\n\n    # Monster\n    def Testempty(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(32))\n        if o != 0:\n            x = self._tab.Indirect(o + self._tab.Pos)\n            from MyGame.Example.Stat import Stat\n            obj = Stat()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Monster\n    def Testbool(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(34))\n        if o != 0:\n            return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos))\n        return False\n\n    # Monster\n    def Testhashs32Fnv1(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(36))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def Testhashu32Fnv1(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(38))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint32Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def Testhashs64Fnv1(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(40))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int64Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def Testhashu64Fnv1(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(42))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def Testhashs32Fnv1a(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(44))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def Testhashu32Fnv1a(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(46))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint32Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def Testhashs64Fnv1a(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(48))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int64Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def Testhashu64Fnv1a(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(50))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def Testarrayofbools(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(52))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.Get(flatbuffers.number_types.BoolFlags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1))\n        return 0\n\n    # Monster\n    def TestarrayofboolsAsNumpy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(52))\n        if o != 0:\n            return self._tab.GetVectorAsNumpy(flatbuffers.number_types.BoolFlags, o)\n        return 0\n\n    # Monster\n    def TestarrayofboolsLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(52))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def TestarrayofboolsIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(52))\n        return o == 0\n\n    # Monster\n    def Testf(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(54))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos)\n        return 3.14159\n\n    # Monster\n    def Testf2(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(56))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos)\n        return 3.0\n\n    # Monster\n    def Testf3(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(58))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos)\n        return 0.0\n\n    # Monster\n    def Testarrayofstring2(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(60))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.String(a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4))\n        return \"\"\n\n    # Monster\n    def Testarrayofstring2Length(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(60))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def Testarrayofstring2IsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(60))\n        return o == 0\n\n    # Monster\n    def Testarrayofsortedstruct(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(62))\n        if o != 0:\n            x = self._tab.Vector(o)\n            x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 8\n            from MyGame.Example.Ability import Ability\n            obj = Ability()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Monster\n    def TestarrayofsortedstructLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(62))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def TestarrayofsortedstructIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(62))\n        return o == 0\n\n    # Monster\n    def Flex(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(64))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1))\n        return 0\n\n    # Monster\n    def FlexAsNumpy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(64))\n        if o != 0:\n            return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint8Flags, o)\n        return 0\n\n    # Monster\n    def FlexLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(64))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def FlexIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(64))\n        return o == 0\n\n    # Monster\n    def Test5(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(66))\n        if o != 0:\n            x = self._tab.Vector(o)\n            x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4\n            from MyGame.Example.Test import Test\n            obj = Test()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Monster\n    def Test5Length(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(66))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def Test5IsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(66))\n        return o == 0\n\n    # Monster\n    def VectorOfLongs(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(68))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.Get(flatbuffers.number_types.Int64Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 8))\n        return 0\n\n    # Monster\n    def VectorOfLongsAsNumpy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(68))\n        if o != 0:\n            return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Int64Flags, o)\n        return 0\n\n    # Monster\n    def VectorOfLongsLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(68))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def VectorOfLongsIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(68))\n        return o == 0\n\n    # Monster\n    def VectorOfDoubles(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(70))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.Get(flatbuffers.number_types.Float64Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 8))\n        return 0\n\n    # Monster\n    def VectorOfDoublesAsNumpy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(70))\n        if o != 0:\n            return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Float64Flags, o)\n        return 0\n\n    # Monster\n    def VectorOfDoublesLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(70))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def VectorOfDoublesIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(70))\n        return o == 0\n\n    # Monster\n    def ParentNamespaceTest(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(72))\n        if o != 0:\n            x = self._tab.Indirect(o + self._tab.Pos)\n            from MyGame.InParentNamespace import InParentNamespace\n            obj = InParentNamespace()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Monster\n    def VectorOfReferrables(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(74))\n        if o != 0:\n            x = self._tab.Vector(o)\n            x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4\n            x = self._tab.Indirect(x)\n            from MyGame.Example.Referrable import Referrable\n            obj = Referrable()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Monster\n    def VectorOfReferrablesLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(74))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def VectorOfReferrablesIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(74))\n        return o == 0\n\n    # Monster\n    def SingleWeakReference(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(76))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def VectorOfWeakReferences(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(78))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.Get(flatbuffers.number_types.Uint64Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 8))\n        return 0\n\n    # Monster\n    def VectorOfWeakReferencesAsNumpy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(78))\n        if o != 0:\n            return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint64Flags, o)\n        return 0\n\n    # Monster\n    def VectorOfWeakReferencesLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(78))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def VectorOfWeakReferencesIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(78))\n        return o == 0\n\n    # Monster\n    def VectorOfStrongReferrables(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(80))\n        if o != 0:\n            x = self._tab.Vector(o)\n            x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4\n            x = self._tab.Indirect(x)\n            from MyGame.Example.Referrable import Referrable\n            obj = Referrable()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Monster\n    def VectorOfStrongReferrablesLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(80))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def VectorOfStrongReferrablesIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(80))\n        return o == 0\n\n    # Monster\n    def CoOwningReference(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(82))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def VectorOfCoOwningReferences(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(84))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.Get(flatbuffers.number_types.Uint64Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 8))\n        return 0\n\n    # Monster\n    def VectorOfCoOwningReferencesAsNumpy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(84))\n        if o != 0:\n            return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint64Flags, o)\n        return 0\n\n    # Monster\n    def VectorOfCoOwningReferencesLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(84))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def VectorOfCoOwningReferencesIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(84))\n        return o == 0\n\n    # Monster\n    def NonOwningReference(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(86))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def VectorOfNonOwningReferences(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(88))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.Get(flatbuffers.number_types.Uint64Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 8))\n        return 0\n\n    # Monster\n    def VectorOfNonOwningReferencesAsNumpy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(88))\n        if o != 0:\n            return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint64Flags, o)\n        return 0\n\n    # Monster\n    def VectorOfNonOwningReferencesLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(88))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def VectorOfNonOwningReferencesIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(88))\n        return o == 0\n\n    # Monster\n    def AnyUniqueType(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(90))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def AnyUnique(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(92))\n        if o != 0:\n            from flatbuffers.table import Table\n            obj = Table(bytearray(), 0)\n            self._tab.Union(obj, o)\n            return obj\n        return None\n\n    # Monster\n    def AnyAmbiguousType(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(94))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def AnyAmbiguous(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(96))\n        if o != 0:\n            from flatbuffers.table import Table\n            obj = Table(bytearray(), 0)\n            self._tab.Union(obj, o)\n            return obj\n        return None\n\n    # Monster\n    def VectorOfEnums(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(98))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1))\n        return 0\n\n    # Monster\n    def VectorOfEnumsAsNumpy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(98))\n        if o != 0:\n            return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint8Flags, o)\n        return 0\n\n    # Monster\n    def VectorOfEnumsLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(98))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def VectorOfEnumsIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(98))\n        return o == 0\n\n    # Monster\n    def SignedEnum(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(100))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos)\n        return -1\n\n    # Monster\n    def Testrequirednestedflatbuffer(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(102))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1))\n        return 0\n\n    # Monster\n    def TestrequirednestedflatbufferAsNumpy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(102))\n        if o != 0:\n            return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint8Flags, o)\n        return 0\n\n    # Monster\n    def TestrequirednestedflatbufferNestedRoot(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(102))\n        if o != 0:\n            from MyGame.Example.Monster import Monster\n            return Monster.GetRootAs(self._tab.Bytes, self._tab.Vector(o))\n        return 0\n\n    # Monster\n    def TestrequirednestedflatbufferLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(102))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def TestrequirednestedflatbufferIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(102))\n        return o == 0\n\n    # Monster\n    def ScalarKeySortedTables(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(104))\n        if o != 0:\n            x = self._tab.Vector(o)\n            x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4\n            x = self._tab.Indirect(x)\n            from MyGame.Example.Stat import Stat\n            obj = Stat()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Monster\n    def ScalarKeySortedTablesLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(104))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def ScalarKeySortedTablesIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(104))\n        return o == 0\n\n    # Monster\n    def NativeInline(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(106))\n        if o != 0:\n            x = o + self._tab.Pos\n            from MyGame.Example.Test import Test\n            obj = Test()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Monster\n    def LongEnumNonEnumDefault(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(108))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def LongEnumNormalDefault(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(110))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos)\n        return 2\n\n    # Monster\n    def NanDefault(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(112))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos)\n        return float('nan')\n\n    # Monster\n    def InfDefault(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(114))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos)\n        return float('inf')\n\n    # Monster\n    def PositiveInfDefault(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(116))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos)\n        return float('inf')\n\n    # Monster\n    def InfinityDefault(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(118))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos)\n        return float('inf')\n\n    # Monster\n    def PositiveInfinityDefault(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(120))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos)\n        return float('inf')\n\n    # Monster\n    def NegativeInfDefault(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(122))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos)\n        return float('-inf')\n\n    # Monster\n    def NegativeInfinityDefault(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(124))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos)\n        return float('-inf')\n\n    # Monster\n    def DoubleInfDefault(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(126))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float64Flags, o + self._tab.Pos)\n        return float('inf')\n\ndef MonsterStart(builder):\n    builder.StartObject(62)\n\ndef Start(builder):\n    MonsterStart(builder)\n\ndef MonsterAddPos(builder, pos):\n    builder.PrependStructSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(pos), 0)\n\ndef AddPos(builder, pos):\n    MonsterAddPos(builder, pos)\n\ndef MonsterAddMana(builder, mana):\n    builder.PrependInt16Slot(1, mana, 150)\n\ndef AddMana(builder, mana):\n    MonsterAddMana(builder, mana)\n\ndef MonsterAddHp(builder, hp):\n    builder.PrependInt16Slot(2, hp, 100)\n\ndef AddHp(builder, hp):\n    MonsterAddHp(builder, hp)\n\ndef MonsterAddName(builder, name):\n    builder.PrependUOffsetTRelativeSlot(3, flatbuffers.number_types.UOffsetTFlags.py_type(name), 0)\n\ndef AddName(builder, name):\n    MonsterAddName(builder, name)\n\ndef MonsterAddInventory(builder, inventory):\n    builder.PrependUOffsetTRelativeSlot(5, flatbuffers.number_types.UOffsetTFlags.py_type(inventory), 0)\n\ndef AddInventory(builder, inventory):\n    MonsterAddInventory(builder, inventory)\n\ndef MonsterStartInventoryVector(builder, numElems):\n    return builder.StartVector(1, numElems, 1)\n\ndef StartInventoryVector(builder, numElems):\n    return MonsterStartInventoryVector(builder, numElems)\n\ndef MonsterCreateInventoryVector(builder, data):\n    data = list(data)\n    builder.StartVector(1, len(data), 1)\n    for item in reversed(data):\n        builder.PrependUint8(item)\n    return builder.EndVector()\n\ndef CreateInventoryVector(builder, data):\n    return MonsterCreateInventoryVector(builder, data)\n\ndef MonsterAddColor(builder, color):\n    builder.PrependUint8Slot(6, color, 8)\n\ndef AddColor(builder, color):\n    MonsterAddColor(builder, color)\n\ndef MonsterAddTestType(builder, testType):\n    builder.PrependUint8Slot(7, testType, 0)\n\ndef AddTestType(builder, testType):\n    MonsterAddTestType(builder, testType)\n\ndef MonsterAddTest(builder, test):\n    builder.PrependUOffsetTRelativeSlot(8, flatbuffers.number_types.UOffsetTFlags.py_type(test), 0)\n\ndef AddTest(builder, test):\n    MonsterAddTest(builder, test)\n\ndef MonsterAddTest4(builder, test4):\n    builder.PrependUOffsetTRelativeSlot(9, flatbuffers.number_types.UOffsetTFlags.py_type(test4), 0)\n\ndef AddTest4(builder, test4):\n    MonsterAddTest4(builder, test4)\n\ndef MonsterStartTest4Vector(builder, numElems):\n    return builder.StartVector(4, numElems, 2)\n\ndef StartTest4Vector(builder, numElems):\n    return MonsterStartTest4Vector(builder, numElems)\n\ndef MonsterCreateTest4Vector(builder, data):\n    data = list(data)\n    builder.StartVector(4, len(data), 2)\n    for item in reversed(data):\n        item.Pack(builder)\n    return builder.EndVector()\n\ndef CreateTest4Vector(builder, data):\n    return MonsterCreateTest4Vector(builder, data)\n\ndef MonsterAddTestarrayofstring(builder, testarrayofstring):\n    builder.PrependUOffsetTRelativeSlot(10, flatbuffers.number_types.UOffsetTFlags.py_type(testarrayofstring), 0)\n\ndef AddTestarrayofstring(builder, testarrayofstring):\n    MonsterAddTestarrayofstring(builder, testarrayofstring)\n\ndef MonsterStartTestarrayofstringVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef StartTestarrayofstringVector(builder, numElems):\n    return MonsterStartTestarrayofstringVector(builder, numElems)\n\ndef MonsterCreateTestarrayofstringVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef CreateTestarrayofstringVector(builder, data):\n    return MonsterCreateTestarrayofstringVector(builder, data)\n\ndef MonsterAddTestarrayoftables(builder, testarrayoftables):\n    builder.PrependUOffsetTRelativeSlot(11, flatbuffers.number_types.UOffsetTFlags.py_type(testarrayoftables), 0)\n\ndef AddTestarrayoftables(builder, testarrayoftables):\n    MonsterAddTestarrayoftables(builder, testarrayoftables)\n\ndef MonsterStartTestarrayoftablesVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef StartTestarrayoftablesVector(builder, numElems):\n    return MonsterStartTestarrayoftablesVector(builder, numElems)\n\ndef MonsterCreateTestarrayoftablesVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef CreateTestarrayoftablesVector(builder, data):\n    return MonsterCreateTestarrayoftablesVector(builder, data)\n\ndef MonsterAddEnemy(builder, enemy):\n    builder.PrependUOffsetTRelativeSlot(12, flatbuffers.number_types.UOffsetTFlags.py_type(enemy), 0)\n\ndef AddEnemy(builder, enemy):\n    MonsterAddEnemy(builder, enemy)\n\ndef MonsterAddTestnestedflatbuffer(builder, testnestedflatbuffer):\n    builder.PrependUOffsetTRelativeSlot(13, flatbuffers.number_types.UOffsetTFlags.py_type(testnestedflatbuffer), 0)\n\ndef AddTestnestedflatbuffer(builder, testnestedflatbuffer):\n    MonsterAddTestnestedflatbuffer(builder, testnestedflatbuffer)\n\ndef MonsterStartTestnestedflatbufferVector(builder, numElems):\n    return builder.StartVector(1, numElems, 1)\n\ndef StartTestnestedflatbufferVector(builder, numElems):\n    return MonsterStartTestnestedflatbufferVector(builder, numElems)\n\ndef MonsterCreateTestnestedflatbufferVector(builder, data):\n    data = list(data)\n    builder.StartVector(1, len(data), 1)\n    for item in reversed(data):\n        builder.PrependUint8(item)\n    return builder.EndVector()\n\ndef CreateTestnestedflatbufferVector(builder, data):\n    return MonsterCreateTestnestedflatbufferVector(builder, data)\n\ndef MonsterMakeTestnestedflatbufferVectorFromBytes(builder, bytes):\n    builder.StartVector(1, len(bytes), 1)\n    builder.head = builder.head - len(bytes)\n    builder.Bytes[builder.head : builder.head + len(bytes)] = bytes\n    return builder.EndVector()\ndef MakeTestnestedflatbufferVectorFromBytes(builder, bytes):\n    return MonsterMakeTestnestedflatbufferVectorFromBytes(builder, bytes)\ndef MonsterAddTestempty(builder, testempty):\n    builder.PrependUOffsetTRelativeSlot(14, flatbuffers.number_types.UOffsetTFlags.py_type(testempty), 0)\n\ndef AddTestempty(builder, testempty):\n    MonsterAddTestempty(builder, testempty)\n\ndef MonsterAddTestbool(builder, testbool):\n    builder.PrependBoolSlot(15, testbool, 0)\n\ndef AddTestbool(builder, testbool):\n    MonsterAddTestbool(builder, testbool)\n\ndef MonsterAddTesthashs32Fnv1(builder, testhashs32Fnv1):\n    builder.PrependInt32Slot(16, testhashs32Fnv1, 0)\n\ndef AddTesthashs32Fnv1(builder, testhashs32Fnv1):\n    MonsterAddTesthashs32Fnv1(builder, testhashs32Fnv1)\n\ndef MonsterAddTesthashu32Fnv1(builder, testhashu32Fnv1):\n    builder.PrependUint32Slot(17, testhashu32Fnv1, 0)\n\ndef AddTesthashu32Fnv1(builder, testhashu32Fnv1):\n    MonsterAddTesthashu32Fnv1(builder, testhashu32Fnv1)\n\ndef MonsterAddTesthashs64Fnv1(builder, testhashs64Fnv1):\n    builder.PrependInt64Slot(18, testhashs64Fnv1, 0)\n\ndef AddTesthashs64Fnv1(builder, testhashs64Fnv1):\n    MonsterAddTesthashs64Fnv1(builder, testhashs64Fnv1)\n\ndef MonsterAddTesthashu64Fnv1(builder, testhashu64Fnv1):\n    builder.PrependUint64Slot(19, testhashu64Fnv1, 0)\n\ndef AddTesthashu64Fnv1(builder, testhashu64Fnv1):\n    MonsterAddTesthashu64Fnv1(builder, testhashu64Fnv1)\n\ndef MonsterAddTesthashs32Fnv1a(builder, testhashs32Fnv1a):\n    builder.PrependInt32Slot(20, testhashs32Fnv1a, 0)\n\ndef AddTesthashs32Fnv1a(builder, testhashs32Fnv1a):\n    MonsterAddTesthashs32Fnv1a(builder, testhashs32Fnv1a)\n\ndef MonsterAddTesthashu32Fnv1a(builder, testhashu32Fnv1a):\n    builder.PrependUint32Slot(21, testhashu32Fnv1a, 0)\n\ndef AddTesthashu32Fnv1a(builder, testhashu32Fnv1a):\n    MonsterAddTesthashu32Fnv1a(builder, testhashu32Fnv1a)\n\ndef MonsterAddTesthashs64Fnv1a(builder, testhashs64Fnv1a):\n    builder.PrependInt64Slot(22, testhashs64Fnv1a, 0)\n\ndef AddTesthashs64Fnv1a(builder, testhashs64Fnv1a):\n    MonsterAddTesthashs64Fnv1a(builder, testhashs64Fnv1a)\n\ndef MonsterAddTesthashu64Fnv1a(builder, testhashu64Fnv1a):\n    builder.PrependUint64Slot(23, testhashu64Fnv1a, 0)\n\ndef AddTesthashu64Fnv1a(builder, testhashu64Fnv1a):\n    MonsterAddTesthashu64Fnv1a(builder, testhashu64Fnv1a)\n\ndef MonsterAddTestarrayofbools(builder, testarrayofbools):\n    builder.PrependUOffsetTRelativeSlot(24, flatbuffers.number_types.UOffsetTFlags.py_type(testarrayofbools), 0)\n\ndef AddTestarrayofbools(builder, testarrayofbools):\n    MonsterAddTestarrayofbools(builder, testarrayofbools)\n\ndef MonsterStartTestarrayofboolsVector(builder, numElems):\n    return builder.StartVector(1, numElems, 1)\n\ndef StartTestarrayofboolsVector(builder, numElems):\n    return MonsterStartTestarrayofboolsVector(builder, numElems)\n\ndef MonsterCreateTestarrayofboolsVector(builder, data):\n    data = list(data)\n    builder.StartVector(1, len(data), 1)\n    for item in reversed(data):\n        builder.PrependBool(item)\n    return builder.EndVector()\n\ndef CreateTestarrayofboolsVector(builder, data):\n    return MonsterCreateTestarrayofboolsVector(builder, data)\n\ndef MonsterAddTestf(builder, testf):\n    builder.PrependFloat32Slot(25, testf, 3.14159)\n\ndef AddTestf(builder, testf):\n    MonsterAddTestf(builder, testf)\n\ndef MonsterAddTestf2(builder, testf2):\n    builder.PrependFloat32Slot(26, testf2, 3.0)\n\ndef AddTestf2(builder, testf2):\n    MonsterAddTestf2(builder, testf2)\n\ndef MonsterAddTestf3(builder, testf3):\n    builder.PrependFloat32Slot(27, testf3, 0.0)\n\ndef AddTestf3(builder, testf3):\n    MonsterAddTestf3(builder, testf3)\n\ndef MonsterAddTestarrayofstring2(builder, testarrayofstring2):\n    builder.PrependUOffsetTRelativeSlot(28, flatbuffers.number_types.UOffsetTFlags.py_type(testarrayofstring2), 0)\n\ndef AddTestarrayofstring2(builder, testarrayofstring2):\n    MonsterAddTestarrayofstring2(builder, testarrayofstring2)\n\ndef MonsterStartTestarrayofstring2Vector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef StartTestarrayofstring2Vector(builder, numElems):\n    return MonsterStartTestarrayofstring2Vector(builder, numElems)\n\ndef MonsterCreateTestarrayofstring2Vector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef CreateTestarrayofstring2Vector(builder, data):\n    return MonsterCreateTestarrayofstring2Vector(builder, data)\n\ndef MonsterAddTestarrayofsortedstruct(builder, testarrayofsortedstruct):\n    builder.PrependUOffsetTRelativeSlot(29, flatbuffers.number_types.UOffsetTFlags.py_type(testarrayofsortedstruct), 0)\n\ndef AddTestarrayofsortedstruct(builder, testarrayofsortedstruct):\n    MonsterAddTestarrayofsortedstruct(builder, testarrayofsortedstruct)\n\ndef MonsterStartTestarrayofsortedstructVector(builder, numElems):\n    return builder.StartVector(8, numElems, 4)\n\ndef StartTestarrayofsortedstructVector(builder, numElems):\n    return MonsterStartTestarrayofsortedstructVector(builder, numElems)\n\ndef MonsterCreateTestarrayofsortedstructVector(builder, data):\n    data = list(data)\n    builder.StartVector(8, len(data), 4)\n    for item in reversed(data):\n        item.Pack(builder)\n    return builder.EndVector()\n\ndef CreateTestarrayofsortedstructVector(builder, data):\n    return MonsterCreateTestarrayofsortedstructVector(builder, data)\n\ndef MonsterAddFlex(builder, flex):\n    builder.PrependUOffsetTRelativeSlot(30, flatbuffers.number_types.UOffsetTFlags.py_type(flex), 0)\n\ndef AddFlex(builder, flex):\n    MonsterAddFlex(builder, flex)\n\ndef MonsterStartFlexVector(builder, numElems):\n    return builder.StartVector(1, numElems, 1)\n\ndef StartFlexVector(builder, numElems):\n    return MonsterStartFlexVector(builder, numElems)\n\ndef MonsterCreateFlexVector(builder, data):\n    data = list(data)\n    builder.StartVector(1, len(data), 1)\n    for item in reversed(data):\n        builder.PrependUint8(item)\n    return builder.EndVector()\n\ndef CreateFlexVector(builder, data):\n    return MonsterCreateFlexVector(builder, data)\n\ndef MonsterAddTest5(builder, test5):\n    builder.PrependUOffsetTRelativeSlot(31, flatbuffers.number_types.UOffsetTFlags.py_type(test5), 0)\n\ndef AddTest5(builder, test5):\n    MonsterAddTest5(builder, test5)\n\ndef MonsterStartTest5Vector(builder, numElems):\n    return builder.StartVector(4, numElems, 2)\n\ndef StartTest5Vector(builder, numElems):\n    return MonsterStartTest5Vector(builder, numElems)\n\ndef MonsterCreateTest5Vector(builder, data):\n    data = list(data)\n    builder.StartVector(4, len(data), 2)\n    for item in reversed(data):\n        item.Pack(builder)\n    return builder.EndVector()\n\ndef CreateTest5Vector(builder, data):\n    return MonsterCreateTest5Vector(builder, data)\n\ndef MonsterAddVectorOfLongs(builder, vectorOfLongs):\n    builder.PrependUOffsetTRelativeSlot(32, flatbuffers.number_types.UOffsetTFlags.py_type(vectorOfLongs), 0)\n\ndef AddVectorOfLongs(builder, vectorOfLongs):\n    MonsterAddVectorOfLongs(builder, vectorOfLongs)\n\ndef MonsterStartVectorOfLongsVector(builder, numElems):\n    return builder.StartVector(8, numElems, 8)\n\ndef StartVectorOfLongsVector(builder, numElems):\n    return MonsterStartVectorOfLongsVector(builder, numElems)\n\ndef MonsterCreateVectorOfLongsVector(builder, data):\n    data = list(data)\n    builder.StartVector(8, len(data), 8)\n    for item in reversed(data):\n        builder.PrependInt64(item)\n    return builder.EndVector()\n\ndef CreateVectorOfLongsVector(builder, data):\n    return MonsterCreateVectorOfLongsVector(builder, data)\n\ndef MonsterAddVectorOfDoubles(builder, vectorOfDoubles):\n    builder.PrependUOffsetTRelativeSlot(33, flatbuffers.number_types.UOffsetTFlags.py_type(vectorOfDoubles), 0)\n\ndef AddVectorOfDoubles(builder, vectorOfDoubles):\n    MonsterAddVectorOfDoubles(builder, vectorOfDoubles)\n\ndef MonsterStartVectorOfDoublesVector(builder, numElems):\n    return builder.StartVector(8, numElems, 8)\n\ndef StartVectorOfDoublesVector(builder, numElems):\n    return MonsterStartVectorOfDoublesVector(builder, numElems)\n\ndef MonsterCreateVectorOfDoublesVector(builder, data):\n    data = list(data)\n    builder.StartVector(8, len(data), 8)\n    for item in reversed(data):\n        builder.PrependFloat64(item)\n    return builder.EndVector()\n\ndef CreateVectorOfDoublesVector(builder, data):\n    return MonsterCreateVectorOfDoublesVector(builder, data)\n\ndef MonsterAddParentNamespaceTest(builder, parentNamespaceTest):\n    builder.PrependUOffsetTRelativeSlot(34, flatbuffers.number_types.UOffsetTFlags.py_type(parentNamespaceTest), 0)\n\ndef AddParentNamespaceTest(builder, parentNamespaceTest):\n    MonsterAddParentNamespaceTest(builder, parentNamespaceTest)\n\ndef MonsterAddVectorOfReferrables(builder, vectorOfReferrables):\n    builder.PrependUOffsetTRelativeSlot(35, flatbuffers.number_types.UOffsetTFlags.py_type(vectorOfReferrables), 0)\n\ndef AddVectorOfReferrables(builder, vectorOfReferrables):\n    MonsterAddVectorOfReferrables(builder, vectorOfReferrables)\n\ndef MonsterStartVectorOfReferrablesVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef StartVectorOfReferrablesVector(builder, numElems):\n    return MonsterStartVectorOfReferrablesVector(builder, numElems)\n\ndef MonsterCreateVectorOfReferrablesVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef CreateVectorOfReferrablesVector(builder, data):\n    return MonsterCreateVectorOfReferrablesVector(builder, data)\n\ndef MonsterAddSingleWeakReference(builder, singleWeakReference):\n    builder.PrependUint64Slot(36, singleWeakReference, 0)\n\ndef AddSingleWeakReference(builder, singleWeakReference):\n    MonsterAddSingleWeakReference(builder, singleWeakReference)\n\ndef MonsterAddVectorOfWeakReferences(builder, vectorOfWeakReferences):\n    builder.PrependUOffsetTRelativeSlot(37, flatbuffers.number_types.UOffsetTFlags.py_type(vectorOfWeakReferences), 0)\n\ndef AddVectorOfWeakReferences(builder, vectorOfWeakReferences):\n    MonsterAddVectorOfWeakReferences(builder, vectorOfWeakReferences)\n\ndef MonsterStartVectorOfWeakReferencesVector(builder, numElems):\n    return builder.StartVector(8, numElems, 8)\n\ndef StartVectorOfWeakReferencesVector(builder, numElems):\n    return MonsterStartVectorOfWeakReferencesVector(builder, numElems)\n\ndef MonsterCreateVectorOfWeakReferencesVector(builder, data):\n    data = list(data)\n    builder.StartVector(8, len(data), 8)\n    for item in reversed(data):\n        builder.PrependUint64(item)\n    return builder.EndVector()\n\ndef CreateVectorOfWeakReferencesVector(builder, data):\n    return MonsterCreateVectorOfWeakReferencesVector(builder, data)\n\ndef MonsterAddVectorOfStrongReferrables(builder, vectorOfStrongReferrables):\n    builder.PrependUOffsetTRelativeSlot(38, flatbuffers.number_types.UOffsetTFlags.py_type(vectorOfStrongReferrables), 0)\n\ndef AddVectorOfStrongReferrables(builder, vectorOfStrongReferrables):\n    MonsterAddVectorOfStrongReferrables(builder, vectorOfStrongReferrables)\n\ndef MonsterStartVectorOfStrongReferrablesVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef StartVectorOfStrongReferrablesVector(builder, numElems):\n    return MonsterStartVectorOfStrongReferrablesVector(builder, numElems)\n\ndef MonsterCreateVectorOfStrongReferrablesVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef CreateVectorOfStrongReferrablesVector(builder, data):\n    return MonsterCreateVectorOfStrongReferrablesVector(builder, data)\n\ndef MonsterAddCoOwningReference(builder, coOwningReference):\n    builder.PrependUint64Slot(39, coOwningReference, 0)\n\ndef AddCoOwningReference(builder, coOwningReference):\n    MonsterAddCoOwningReference(builder, coOwningReference)\n\ndef MonsterAddVectorOfCoOwningReferences(builder, vectorOfCoOwningReferences):\n    builder.PrependUOffsetTRelativeSlot(40, flatbuffers.number_types.UOffsetTFlags.py_type(vectorOfCoOwningReferences), 0)\n\ndef AddVectorOfCoOwningReferences(builder, vectorOfCoOwningReferences):\n    MonsterAddVectorOfCoOwningReferences(builder, vectorOfCoOwningReferences)\n\ndef MonsterStartVectorOfCoOwningReferencesVector(builder, numElems):\n    return builder.StartVector(8, numElems, 8)\n\ndef StartVectorOfCoOwningReferencesVector(builder, numElems):\n    return MonsterStartVectorOfCoOwningReferencesVector(builder, numElems)\n\ndef MonsterCreateVectorOfCoOwningReferencesVector(builder, data):\n    data = list(data)\n    builder.StartVector(8, len(data), 8)\n    for item in reversed(data):\n        builder.PrependUint64(item)\n    return builder.EndVector()\n\ndef CreateVectorOfCoOwningReferencesVector(builder, data):\n    return MonsterCreateVectorOfCoOwningReferencesVector(builder, data)\n\ndef MonsterAddNonOwningReference(builder, nonOwningReference):\n    builder.PrependUint64Slot(41, nonOwningReference, 0)\n\ndef AddNonOwningReference(builder, nonOwningReference):\n    MonsterAddNonOwningReference(builder, nonOwningReference)\n\ndef MonsterAddVectorOfNonOwningReferences(builder, vectorOfNonOwningReferences):\n    builder.PrependUOffsetTRelativeSlot(42, flatbuffers.number_types.UOffsetTFlags.py_type(vectorOfNonOwningReferences), 0)\n\ndef AddVectorOfNonOwningReferences(builder, vectorOfNonOwningReferences):\n    MonsterAddVectorOfNonOwningReferences(builder, vectorOfNonOwningReferences)\n\ndef MonsterStartVectorOfNonOwningReferencesVector(builder, numElems):\n    return builder.StartVector(8, numElems, 8)\n\ndef StartVectorOfNonOwningReferencesVector(builder, numElems):\n    return MonsterStartVectorOfNonOwningReferencesVector(builder, numElems)\n\ndef MonsterCreateVectorOfNonOwningReferencesVector(builder, data):\n    data = list(data)\n    builder.StartVector(8, len(data), 8)\n    for item in reversed(data):\n        builder.PrependUint64(item)\n    return builder.EndVector()\n\ndef CreateVectorOfNonOwningReferencesVector(builder, data):\n    return MonsterCreateVectorOfNonOwningReferencesVector(builder, data)\n\ndef MonsterAddAnyUniqueType(builder, anyUniqueType):\n    builder.PrependUint8Slot(43, anyUniqueType, 0)\n\ndef AddAnyUniqueType(builder, anyUniqueType):\n    MonsterAddAnyUniqueType(builder, anyUniqueType)\n\ndef MonsterAddAnyUnique(builder, anyUnique):\n    builder.PrependUOffsetTRelativeSlot(44, flatbuffers.number_types.UOffsetTFlags.py_type(anyUnique), 0)\n\ndef AddAnyUnique(builder, anyUnique):\n    MonsterAddAnyUnique(builder, anyUnique)\n\ndef MonsterAddAnyAmbiguousType(builder, anyAmbiguousType):\n    builder.PrependUint8Slot(45, anyAmbiguousType, 0)\n\ndef AddAnyAmbiguousType(builder, anyAmbiguousType):\n    MonsterAddAnyAmbiguousType(builder, anyAmbiguousType)\n\ndef MonsterAddAnyAmbiguous(builder, anyAmbiguous):\n    builder.PrependUOffsetTRelativeSlot(46, flatbuffers.number_types.UOffsetTFlags.py_type(anyAmbiguous), 0)\n\ndef AddAnyAmbiguous(builder, anyAmbiguous):\n    MonsterAddAnyAmbiguous(builder, anyAmbiguous)\n\ndef MonsterAddVectorOfEnums(builder, vectorOfEnums):\n    builder.PrependUOffsetTRelativeSlot(47, flatbuffers.number_types.UOffsetTFlags.py_type(vectorOfEnums), 0)\n\ndef AddVectorOfEnums(builder, vectorOfEnums):\n    MonsterAddVectorOfEnums(builder, vectorOfEnums)\n\ndef MonsterStartVectorOfEnumsVector(builder, numElems):\n    return builder.StartVector(1, numElems, 1)\n\ndef StartVectorOfEnumsVector(builder, numElems):\n    return MonsterStartVectorOfEnumsVector(builder, numElems)\n\ndef MonsterCreateVectorOfEnumsVector(builder, data):\n    data = list(data)\n    builder.StartVector(1, len(data), 1)\n    for item in reversed(data):\n        builder.PrependUint8(item)\n    return builder.EndVector()\n\ndef CreateVectorOfEnumsVector(builder, data):\n    return MonsterCreateVectorOfEnumsVector(builder, data)\n\ndef MonsterAddSignedEnum(builder, signedEnum):\n    builder.PrependInt8Slot(48, signedEnum, -1)\n\ndef AddSignedEnum(builder, signedEnum):\n    MonsterAddSignedEnum(builder, signedEnum)\n\ndef MonsterAddTestrequirednestedflatbuffer(builder, testrequirednestedflatbuffer):\n    builder.PrependUOffsetTRelativeSlot(49, flatbuffers.number_types.UOffsetTFlags.py_type(testrequirednestedflatbuffer), 0)\n\ndef AddTestrequirednestedflatbuffer(builder, testrequirednestedflatbuffer):\n    MonsterAddTestrequirednestedflatbuffer(builder, testrequirednestedflatbuffer)\n\ndef MonsterStartTestrequirednestedflatbufferVector(builder, numElems):\n    return builder.StartVector(1, numElems, 1)\n\ndef StartTestrequirednestedflatbufferVector(builder, numElems):\n    return MonsterStartTestrequirednestedflatbufferVector(builder, numElems)\n\ndef MonsterCreateTestrequirednestedflatbufferVector(builder, data):\n    data = list(data)\n    builder.StartVector(1, len(data), 1)\n    for item in reversed(data):\n        builder.PrependUint8(item)\n    return builder.EndVector()\n\ndef CreateTestrequirednestedflatbufferVector(builder, data):\n    return MonsterCreateTestrequirednestedflatbufferVector(builder, data)\n\ndef MonsterMakeTestrequirednestedflatbufferVectorFromBytes(builder, bytes):\n    builder.StartVector(1, len(bytes), 1)\n    builder.head = builder.head - len(bytes)\n    builder.Bytes[builder.head : builder.head + len(bytes)] = bytes\n    return builder.EndVector()\ndef MakeTestrequirednestedflatbufferVectorFromBytes(builder, bytes):\n    return MonsterMakeTestrequirednestedflatbufferVectorFromBytes(builder, bytes)\ndef MonsterAddScalarKeySortedTables(builder, scalarKeySortedTables):\n    builder.PrependUOffsetTRelativeSlot(50, flatbuffers.number_types.UOffsetTFlags.py_type(scalarKeySortedTables), 0)\n\ndef AddScalarKeySortedTables(builder, scalarKeySortedTables):\n    MonsterAddScalarKeySortedTables(builder, scalarKeySortedTables)\n\ndef MonsterStartScalarKeySortedTablesVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef StartScalarKeySortedTablesVector(builder, numElems):\n    return MonsterStartScalarKeySortedTablesVector(builder, numElems)\n\ndef MonsterCreateScalarKeySortedTablesVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef CreateScalarKeySortedTablesVector(builder, data):\n    return MonsterCreateScalarKeySortedTablesVector(builder, data)\n\ndef MonsterAddNativeInline(builder, nativeInline):\n    builder.PrependStructSlot(51, flatbuffers.number_types.UOffsetTFlags.py_type(nativeInline), 0)\n\ndef AddNativeInline(builder, nativeInline):\n    MonsterAddNativeInline(builder, nativeInline)\n\ndef MonsterAddLongEnumNonEnumDefault(builder, longEnumNonEnumDefault):\n    builder.PrependUint64Slot(52, longEnumNonEnumDefault, 0)\n\ndef AddLongEnumNonEnumDefault(builder, longEnumNonEnumDefault):\n    MonsterAddLongEnumNonEnumDefault(builder, longEnumNonEnumDefault)\n\ndef MonsterAddLongEnumNormalDefault(builder, longEnumNormalDefault):\n    builder.PrependUint64Slot(53, longEnumNormalDefault, 2)\n\ndef AddLongEnumNormalDefault(builder, longEnumNormalDefault):\n    MonsterAddLongEnumNormalDefault(builder, longEnumNormalDefault)\n\ndef MonsterAddNanDefault(builder, nanDefault):\n    builder.PrependFloat32Slot(54, nanDefault, float('nan'))\n\ndef AddNanDefault(builder, nanDefault):\n    MonsterAddNanDefault(builder, nanDefault)\n\ndef MonsterAddInfDefault(builder, infDefault):\n    builder.PrependFloat32Slot(55, infDefault, float('inf'))\n\ndef AddInfDefault(builder, infDefault):\n    MonsterAddInfDefault(builder, infDefault)\n\ndef MonsterAddPositiveInfDefault(builder, positiveInfDefault):\n    builder.PrependFloat32Slot(56, positiveInfDefault, float('inf'))\n\ndef AddPositiveInfDefault(builder, positiveInfDefault):\n    MonsterAddPositiveInfDefault(builder, positiveInfDefault)\n\ndef MonsterAddInfinityDefault(builder, infinityDefault):\n    builder.PrependFloat32Slot(57, infinityDefault, float('inf'))\n\ndef AddInfinityDefault(builder, infinityDefault):\n    MonsterAddInfinityDefault(builder, infinityDefault)\n\ndef MonsterAddPositiveInfinityDefault(builder, positiveInfinityDefault):\n    builder.PrependFloat32Slot(58, positiveInfinityDefault, float('inf'))\n\ndef AddPositiveInfinityDefault(builder, positiveInfinityDefault):\n    MonsterAddPositiveInfinityDefault(builder, positiveInfinityDefault)\n\ndef MonsterAddNegativeInfDefault(builder, negativeInfDefault):\n    builder.PrependFloat32Slot(59, negativeInfDefault, float('-inf'))\n\ndef AddNegativeInfDefault(builder, negativeInfDefault):\n    MonsterAddNegativeInfDefault(builder, negativeInfDefault)\n\ndef MonsterAddNegativeInfinityDefault(builder, negativeInfinityDefault):\n    builder.PrependFloat32Slot(60, negativeInfinityDefault, float('-inf'))\n\ndef AddNegativeInfinityDefault(builder, negativeInfinityDefault):\n    MonsterAddNegativeInfinityDefault(builder, negativeInfinityDefault)\n\ndef MonsterAddDoubleInfDefault(builder, doubleInfDefault):\n    builder.PrependFloat64Slot(61, doubleInfDefault, float('inf'))\n\ndef AddDoubleInfDefault(builder, doubleInfDefault):\n    MonsterAddDoubleInfDefault(builder, doubleInfDefault)\n\ndef MonsterEnd(builder):\n    return builder.EndObject()\n\ndef End(builder):\n    return MonsterEnd(builder)\n\nimport MyGame.Example.Ability\nimport MyGame.Example.Any\nimport MyGame.Example.AnyAmbiguousAliases\nimport MyGame.Example.AnyUniqueAliases\nimport MyGame.Example.Referrable\nimport MyGame.Example.Stat\nimport MyGame.Example.Test\nimport MyGame.Example.TestSimpleTableWithEnum\nimport MyGame.Example.Vec3\nimport MyGame.Example2.Monster\nimport MyGame.InParentNamespace\ntry:\n    from typing import List, Optional, Union\nexcept:\n    pass\n\nclass MonsterT(object):\n\n    # MonsterT\n    def __init__(\n        self,\n        pos = None,\n        mana = 150,\n        hp = 100,\n        name = None,\n        inventory = None,\n        color = 8,\n        testType = 0,\n        test = None,\n        test4 = None,\n        testarrayofstring = None,\n        testarrayoftables = None,\n        enemy = None,\n        testnestedflatbuffer = None,\n        testempty = None,\n        testbool = False,\n        testhashs32Fnv1 = 0,\n        testhashu32Fnv1 = 0,\n        testhashs64Fnv1 = 0,\n        testhashu64Fnv1 = 0,\n        testhashs32Fnv1a = 0,\n        testhashu32Fnv1a = 0,\n        testhashs64Fnv1a = 0,\n        testhashu64Fnv1a = 0,\n        testarrayofbools = None,\n        testf = 3.14159,\n        testf2 = 3.0,\n        testf3 = 0.0,\n        testarrayofstring2 = None,\n        testarrayofsortedstruct = None,\n        flex = None,\n        test5 = None,\n        vectorOfLongs = None,\n        vectorOfDoubles = None,\n        parentNamespaceTest = None,\n        vectorOfReferrables = None,\n        singleWeakReference = 0,\n        vectorOfWeakReferences = None,\n        vectorOfStrongReferrables = None,\n        coOwningReference = 0,\n        vectorOfCoOwningReferences = None,\n        nonOwningReference = 0,\n        vectorOfNonOwningReferences = None,\n        anyUniqueType = 0,\n        anyUnique = None,\n        anyAmbiguousType = 0,\n        anyAmbiguous = None,\n        vectorOfEnums = None,\n        signedEnum = -1,\n        testrequirednestedflatbuffer = None,\n        scalarKeySortedTables = None,\n        nativeInline = None,\n        longEnumNonEnumDefault = 0,\n        longEnumNormalDefault = 2,\n        nanDefault = float('nan'),\n        infDefault = float('inf'),\n        positiveInfDefault = float('inf'),\n        infinityDefault = float('inf'),\n        positiveInfinityDefault = float('inf'),\n        negativeInfDefault = float('-inf'),\n        negativeInfinityDefault = float('-inf'),\n        doubleInfDefault = float('inf'),\n    ):\n        self.pos = pos  # type: Optional[MyGame.Example.Vec3.Vec3T]\n        self.mana = mana  # type: int\n        self.hp = hp  # type: int\n        self.name = name  # type: Optional[str]\n        self.inventory = inventory  # type: Optional[List[int]]\n        self.color = color  # type: int\n        self.testType = testType  # type: int\n        self.test = test  # type: Union[None, 'MyGame.Example.Monster.MonsterT', 'MyGame.Example.TestSimpleTableWithEnum.TestSimpleTableWithEnumT', 'MyGame.Example2.Monster.MonsterT']\n        self.test4 = test4  # type: Optional[List[MyGame.Example.Test.TestT]]\n        self.testarrayofstring = testarrayofstring  # type: Optional[List[Optional[str]]]\n        self.testarrayoftables = testarrayoftables  # type: Optional[List[MyGame.Example.Monster.MonsterT]]\n        self.enemy = enemy  # type: Optional[MyGame.Example.Monster.MonsterT]\n        self.testnestedflatbuffer = testnestedflatbuffer  # type: Optional[List[int]]\n        self.testempty = testempty  # type: Optional[MyGame.Example.Stat.StatT]\n        self.testbool = testbool  # type: bool\n        self.testhashs32Fnv1 = testhashs32Fnv1  # type: int\n        self.testhashu32Fnv1 = testhashu32Fnv1  # type: int\n        self.testhashs64Fnv1 = testhashs64Fnv1  # type: int\n        self.testhashu64Fnv1 = testhashu64Fnv1  # type: int\n        self.testhashs32Fnv1a = testhashs32Fnv1a  # type: int\n        self.testhashu32Fnv1a = testhashu32Fnv1a  # type: int\n        self.testhashs64Fnv1a = testhashs64Fnv1a  # type: int\n        self.testhashu64Fnv1a = testhashu64Fnv1a  # type: int\n        self.testarrayofbools = testarrayofbools  # type: Optional[List[bool]]\n        self.testf = testf  # type: float\n        self.testf2 = testf2  # type: float\n        self.testf3 = testf3  # type: float\n        self.testarrayofstring2 = testarrayofstring2  # type: Optional[List[Optional[str]]]\n        self.testarrayofsortedstruct = testarrayofsortedstruct  # type: Optional[List[MyGame.Example.Ability.AbilityT]]\n        self.flex = flex  # type: Optional[List[int]]\n        self.test5 = test5  # type: Optional[List[MyGame.Example.Test.TestT]]\n        self.vectorOfLongs = vectorOfLongs  # type: Optional[List[int]]\n        self.vectorOfDoubles = vectorOfDoubles  # type: Optional[List[float]]\n        self.parentNamespaceTest = parentNamespaceTest  # type: Optional[MyGame.InParentNamespace.InParentNamespaceT]\n        self.vectorOfReferrables = vectorOfReferrables  # type: Optional[List[MyGame.Example.Referrable.ReferrableT]]\n        self.singleWeakReference = singleWeakReference  # type: int\n        self.vectorOfWeakReferences = vectorOfWeakReferences  # type: Optional[List[int]]\n        self.vectorOfStrongReferrables = vectorOfStrongReferrables  # type: Optional[List[MyGame.Example.Referrable.ReferrableT]]\n        self.coOwningReference = coOwningReference  # type: int\n        self.vectorOfCoOwningReferences = vectorOfCoOwningReferences  # type: Optional[List[int]]\n        self.nonOwningReference = nonOwningReference  # type: int\n        self.vectorOfNonOwningReferences = vectorOfNonOwningReferences  # type: Optional[List[int]]\n        self.anyUniqueType = anyUniqueType  # type: int\n        self.anyUnique = anyUnique  # type: Union[None, 'MyGame.Example.Monster.MonsterT', 'MyGame.Example.TestSimpleTableWithEnum.TestSimpleTableWithEnumT', 'MyGame.Example2.Monster.MonsterT']\n        self.anyAmbiguousType = anyAmbiguousType  # type: int\n        self.anyAmbiguous = anyAmbiguous  # type: Union[None, 'MyGame.Example.Monster.MonsterT', 'MyGame.Example.Monster.MonsterT', 'MyGame.Example.Monster.MonsterT']\n        self.vectorOfEnums = vectorOfEnums  # type: Optional[List[int]]\n        self.signedEnum = signedEnum  # type: int\n        self.testrequirednestedflatbuffer = testrequirednestedflatbuffer  # type: Optional[List[int]]\n        self.scalarKeySortedTables = scalarKeySortedTables  # type: Optional[List[MyGame.Example.Stat.StatT]]\n        self.nativeInline = nativeInline  # type: Optional[MyGame.Example.Test.TestT]\n        self.longEnumNonEnumDefault = longEnumNonEnumDefault  # type: int\n        self.longEnumNormalDefault = longEnumNormalDefault  # type: int\n        self.nanDefault = nanDefault  # type: float\n        self.infDefault = infDefault  # type: float\n        self.positiveInfDefault = positiveInfDefault  # type: float\n        self.infinityDefault = infinityDefault  # type: float\n        self.positiveInfinityDefault = positiveInfinityDefault  # type: float\n        self.negativeInfDefault = negativeInfDefault  # type: float\n        self.negativeInfinityDefault = negativeInfinityDefault  # type: float\n        self.doubleInfDefault = doubleInfDefault  # type: float\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        monster = Monster()\n        monster.Init(buf, pos)\n        return cls.InitFromObj(monster)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, monster):\n        x = MonsterT()\n        x._UnPack(monster)\n        return x\n\n    # MonsterT\n    def _UnPack(self, monster):\n        if monster is None:\n            return\n        if monster.Pos() is not None:\n            self.pos = MyGame.Example.Vec3.Vec3T.InitFromObj(monster.Pos())\n        self.mana = monster.Mana()\n        self.hp = monster.Hp()\n        self.name = monster.Name()\n        if not monster.InventoryIsNone():\n            if np is None:\n                self.inventory = []\n                for i in range(monster.InventoryLength()):\n                    self.inventory.append(monster.Inventory(i))\n            else:\n                self.inventory = monster.InventoryAsNumpy()\n        self.color = monster.Color()\n        self.testType = monster.TestType()\n        self.test = MyGame.Example.Any.AnyCreator(self.testType, monster.Test())\n        if not monster.Test4IsNone():\n            self.test4 = []\n            for i in range(monster.Test4Length()):\n                if monster.Test4(i) is None:\n                    self.test4.append(None)\n                else:\n                    test_ = MyGame.Example.Test.TestT.InitFromObj(monster.Test4(i))\n                    self.test4.append(test_)\n        if not monster.TestarrayofstringIsNone():\n            self.testarrayofstring = []\n            for i in range(monster.TestarrayofstringLength()):\n                self.testarrayofstring.append(monster.Testarrayofstring(i))\n        if not monster.TestarrayoftablesIsNone():\n            self.testarrayoftables = []\n            for i in range(monster.TestarrayoftablesLength()):\n                if monster.Testarrayoftables(i) is None:\n                    self.testarrayoftables.append(None)\n                else:\n                    monster_ = MyGame.Example.Monster.MonsterT.InitFromObj(monster.Testarrayoftables(i))\n                    self.testarrayoftables.append(monster_)\n        if monster.Enemy() is not None:\n            self.enemy = MyGame.Example.Monster.MonsterT.InitFromObj(monster.Enemy())\n        if not monster.TestnestedflatbufferIsNone():\n            if np is None:\n                self.testnestedflatbuffer = []\n                for i in range(monster.TestnestedflatbufferLength()):\n                    self.testnestedflatbuffer.append(monster.Testnestedflatbuffer(i))\n            else:\n                self.testnestedflatbuffer = monster.TestnestedflatbufferAsNumpy()\n        if monster.Testempty() is not None:\n            self.testempty = MyGame.Example.Stat.StatT.InitFromObj(monster.Testempty())\n        self.testbool = monster.Testbool()\n        self.testhashs32Fnv1 = monster.Testhashs32Fnv1()\n        self.testhashu32Fnv1 = monster.Testhashu32Fnv1()\n        self.testhashs64Fnv1 = monster.Testhashs64Fnv1()\n        self.testhashu64Fnv1 = monster.Testhashu64Fnv1()\n        self.testhashs32Fnv1a = monster.Testhashs32Fnv1a()\n        self.testhashu32Fnv1a = monster.Testhashu32Fnv1a()\n        self.testhashs64Fnv1a = monster.Testhashs64Fnv1a()\n        self.testhashu64Fnv1a = monster.Testhashu64Fnv1a()\n        if not monster.TestarrayofboolsIsNone():\n            if np is None:\n                self.testarrayofbools = []\n                for i in range(monster.TestarrayofboolsLength()):\n                    self.testarrayofbools.append(monster.Testarrayofbools(i))\n            else:\n                self.testarrayofbools = monster.TestarrayofboolsAsNumpy()\n        self.testf = monster.Testf()\n        self.testf2 = monster.Testf2()\n        self.testf3 = monster.Testf3()\n        if not monster.Testarrayofstring2IsNone():\n            self.testarrayofstring2 = []\n            for i in range(monster.Testarrayofstring2Length()):\n                self.testarrayofstring2.append(monster.Testarrayofstring2(i))\n        if not monster.TestarrayofsortedstructIsNone():\n            self.testarrayofsortedstruct = []\n            for i in range(monster.TestarrayofsortedstructLength()):\n                if monster.Testarrayofsortedstruct(i) is None:\n                    self.testarrayofsortedstruct.append(None)\n                else:\n                    ability_ = MyGame.Example.Ability.AbilityT.InitFromObj(monster.Testarrayofsortedstruct(i))\n                    self.testarrayofsortedstruct.append(ability_)\n        if not monster.FlexIsNone():\n            if np is None:\n                self.flex = []\n                for i in range(monster.FlexLength()):\n                    self.flex.append(monster.Flex(i))\n            else:\n                self.flex = monster.FlexAsNumpy()\n        if not monster.Test5IsNone():\n            self.test5 = []\n            for i in range(monster.Test5Length()):\n                if monster.Test5(i) is None:\n                    self.test5.append(None)\n                else:\n                    test_ = MyGame.Example.Test.TestT.InitFromObj(monster.Test5(i))\n                    self.test5.append(test_)\n        if not monster.VectorOfLongsIsNone():\n            if np is None:\n                self.vectorOfLongs = []\n                for i in range(monster.VectorOfLongsLength()):\n                    self.vectorOfLongs.append(monster.VectorOfLongs(i))\n            else:\n                self.vectorOfLongs = monster.VectorOfLongsAsNumpy()\n        if not monster.VectorOfDoublesIsNone():\n            if np is None:\n                self.vectorOfDoubles = []\n                for i in range(monster.VectorOfDoublesLength()):\n                    self.vectorOfDoubles.append(monster.VectorOfDoubles(i))\n            else:\n                self.vectorOfDoubles = monster.VectorOfDoublesAsNumpy()\n        if monster.ParentNamespaceTest() is not None:\n            self.parentNamespaceTest = MyGame.InParentNamespace.InParentNamespaceT.InitFromObj(monster.ParentNamespaceTest())\n        if not monster.VectorOfReferrablesIsNone():\n            self.vectorOfReferrables = []\n            for i in range(monster.VectorOfReferrablesLength()):\n                if monster.VectorOfReferrables(i) is None:\n                    self.vectorOfReferrables.append(None)\n                else:\n                    referrable_ = MyGame.Example.Referrable.ReferrableT.InitFromObj(monster.VectorOfReferrables(i))\n                    self.vectorOfReferrables.append(referrable_)\n        self.singleWeakReference = monster.SingleWeakReference()\n        if not monster.VectorOfWeakReferencesIsNone():\n            if np is None:\n                self.vectorOfWeakReferences = []\n                for i in range(monster.VectorOfWeakReferencesLength()):\n                    self.vectorOfWeakReferences.append(monster.VectorOfWeakReferences(i))\n            else:\n                self.vectorOfWeakReferences = monster.VectorOfWeakReferencesAsNumpy()\n        if not monster.VectorOfStrongReferrablesIsNone():\n            self.vectorOfStrongReferrables = []\n            for i in range(monster.VectorOfStrongReferrablesLength()):\n                if monster.VectorOfStrongReferrables(i) is None:\n                    self.vectorOfStrongReferrables.append(None)\n                else:\n                    referrable_ = MyGame.Example.Referrable.ReferrableT.InitFromObj(monster.VectorOfStrongReferrables(i))\n                    self.vectorOfStrongReferrables.append(referrable_)\n        self.coOwningReference = monster.CoOwningReference()\n        if not monster.VectorOfCoOwningReferencesIsNone():\n            if np is None:\n                self.vectorOfCoOwningReferences = []\n                for i in range(monster.VectorOfCoOwningReferencesLength()):\n                    self.vectorOfCoOwningReferences.append(monster.VectorOfCoOwningReferences(i))\n            else:\n                self.vectorOfCoOwningReferences = monster.VectorOfCoOwningReferencesAsNumpy()\n        self.nonOwningReference = monster.NonOwningReference()\n        if not monster.VectorOfNonOwningReferencesIsNone():\n            if np is None:\n                self.vectorOfNonOwningReferences = []\n                for i in range(monster.VectorOfNonOwningReferencesLength()):\n                    self.vectorOfNonOwningReferences.append(monster.VectorOfNonOwningReferences(i))\n            else:\n                self.vectorOfNonOwningReferences = monster.VectorOfNonOwningReferencesAsNumpy()\n        self.anyUniqueType = monster.AnyUniqueType()\n        self.anyUnique = MyGame.Example.AnyUniqueAliases.AnyUniqueAliasesCreator(self.anyUniqueType, monster.AnyUnique())\n        self.anyAmbiguousType = monster.AnyAmbiguousType()\n        self.anyAmbiguous = MyGame.Example.AnyAmbiguousAliases.AnyAmbiguousAliasesCreator(self.anyAmbiguousType, monster.AnyAmbiguous())\n        if not monster.VectorOfEnumsIsNone():\n            if np is None:\n                self.vectorOfEnums = []\n                for i in range(monster.VectorOfEnumsLength()):\n                    self.vectorOfEnums.append(monster.VectorOfEnums(i))\n            else:\n                self.vectorOfEnums = monster.VectorOfEnumsAsNumpy()\n        self.signedEnum = monster.SignedEnum()\n        if not monster.TestrequirednestedflatbufferIsNone():\n            if np is None:\n                self.testrequirednestedflatbuffer = []\n                for i in range(monster.TestrequirednestedflatbufferLength()):\n                    self.testrequirednestedflatbuffer.append(monster.Testrequirednestedflatbuffer(i))\n            else:\n                self.testrequirednestedflatbuffer = monster.TestrequirednestedflatbufferAsNumpy()\n        if not monster.ScalarKeySortedTablesIsNone():\n            self.scalarKeySortedTables = []\n            for i in range(monster.ScalarKeySortedTablesLength()):\n                if monster.ScalarKeySortedTables(i) is None:\n                    self.scalarKeySortedTables.append(None)\n                else:\n                    stat_ = MyGame.Example.Stat.StatT.InitFromObj(monster.ScalarKeySortedTables(i))\n                    self.scalarKeySortedTables.append(stat_)\n        if monster.NativeInline() is not None:\n            self.nativeInline = MyGame.Example.Test.TestT.InitFromObj(monster.NativeInline())\n        self.longEnumNonEnumDefault = monster.LongEnumNonEnumDefault()\n        self.longEnumNormalDefault = monster.LongEnumNormalDefault()\n        self.nanDefault = monster.NanDefault()\n        self.infDefault = monster.InfDefault()\n        self.positiveInfDefault = monster.PositiveInfDefault()\n        self.infinityDefault = monster.InfinityDefault()\n        self.positiveInfinityDefault = monster.PositiveInfinityDefault()\n        self.negativeInfDefault = monster.NegativeInfDefault()\n        self.negativeInfinityDefault = monster.NegativeInfinityDefault()\n        self.doubleInfDefault = monster.DoubleInfDefault()\n\n    # MonsterT\n    def Pack(self, builder):\n        if self.name is not None:\n            name = builder.CreateString(self.name)\n        if self.inventory is not None:\n            if np is not None and type(self.inventory) is np.ndarray:\n                inventory = builder.CreateNumpyVector(self.inventory)\n            else:\n                MonsterStartInventoryVector(builder, len(self.inventory))\n                for i in reversed(range(len(self.inventory))):\n                    builder.PrependUint8(self.inventory[i])\n                inventory = builder.EndVector()\n        if self.test is not None:\n            test = self.test.Pack(builder)\n        if self.test4 is not None:\n            MonsterStartTest4Vector(builder, len(self.test4))\n            for i in reversed(range(len(self.test4))):\n                self.test4[i].Pack(builder)\n            test4 = builder.EndVector()\n        if self.testarrayofstring is not None:\n            testarrayofstringlist = []\n            for i in range(len(self.testarrayofstring)):\n                testarrayofstringlist.append(builder.CreateString(self.testarrayofstring[i]))\n            MonsterStartTestarrayofstringVector(builder, len(self.testarrayofstring))\n            for i in reversed(range(len(self.testarrayofstring))):\n                builder.PrependUOffsetTRelative(testarrayofstringlist[i])\n            testarrayofstring = builder.EndVector()\n        if self.testarrayoftables is not None:\n            testarrayoftableslist = []\n            for i in range(len(self.testarrayoftables)):\n                testarrayoftableslist.append(self.testarrayoftables[i].Pack(builder))\n            MonsterStartTestarrayoftablesVector(builder, len(self.testarrayoftables))\n            for i in reversed(range(len(self.testarrayoftables))):\n                builder.PrependUOffsetTRelative(testarrayoftableslist[i])\n            testarrayoftables = builder.EndVector()\n        if self.enemy is not None:\n            enemy = self.enemy.Pack(builder)\n        if self.testnestedflatbuffer is not None:\n            if np is not None and type(self.testnestedflatbuffer) is np.ndarray:\n                testnestedflatbuffer = builder.CreateNumpyVector(self.testnestedflatbuffer)\n            else:\n                MonsterStartTestnestedflatbufferVector(builder, len(self.testnestedflatbuffer))\n                for i in reversed(range(len(self.testnestedflatbuffer))):\n                    builder.PrependUint8(self.testnestedflatbuffer[i])\n                testnestedflatbuffer = builder.EndVector()\n        if self.testempty is not None:\n            testempty = self.testempty.Pack(builder)\n        if self.testarrayofbools is not None:\n            if np is not None and type(self.testarrayofbools) is np.ndarray:\n                testarrayofbools = builder.CreateNumpyVector(self.testarrayofbools)\n            else:\n                MonsterStartTestarrayofboolsVector(builder, len(self.testarrayofbools))\n                for i in reversed(range(len(self.testarrayofbools))):\n                    builder.PrependBool(self.testarrayofbools[i])\n                testarrayofbools = builder.EndVector()\n        if self.testarrayofstring2 is not None:\n            testarrayofstring2list = []\n            for i in range(len(self.testarrayofstring2)):\n                testarrayofstring2list.append(builder.CreateString(self.testarrayofstring2[i]))\n            MonsterStartTestarrayofstring2Vector(builder, len(self.testarrayofstring2))\n            for i in reversed(range(len(self.testarrayofstring2))):\n                builder.PrependUOffsetTRelative(testarrayofstring2list[i])\n            testarrayofstring2 = builder.EndVector()\n        if self.testarrayofsortedstruct is not None:\n            MonsterStartTestarrayofsortedstructVector(builder, len(self.testarrayofsortedstruct))\n            for i in reversed(range(len(self.testarrayofsortedstruct))):\n                self.testarrayofsortedstruct[i].Pack(builder)\n            testarrayofsortedstruct = builder.EndVector()\n        if self.flex is not None:\n            if np is not None and type(self.flex) is np.ndarray:\n                flex = builder.CreateNumpyVector(self.flex)\n            else:\n                MonsterStartFlexVector(builder, len(self.flex))\n                for i in reversed(range(len(self.flex))):\n                    builder.PrependUint8(self.flex[i])\n                flex = builder.EndVector()\n        if self.test5 is not None:\n            MonsterStartTest5Vector(builder, len(self.test5))\n            for i in reversed(range(len(self.test5))):\n                self.test5[i].Pack(builder)\n            test5 = builder.EndVector()\n        if self.vectorOfLongs is not None:\n            if np is not None and type(self.vectorOfLongs) is np.ndarray:\n                vectorOfLongs = builder.CreateNumpyVector(self.vectorOfLongs)\n            else:\n                MonsterStartVectorOfLongsVector(builder, len(self.vectorOfLongs))\n                for i in reversed(range(len(self.vectorOfLongs))):\n                    builder.PrependInt64(self.vectorOfLongs[i])\n                vectorOfLongs = builder.EndVector()\n        if self.vectorOfDoubles is not None:\n            if np is not None and type(self.vectorOfDoubles) is np.ndarray:\n                vectorOfDoubles = builder.CreateNumpyVector(self.vectorOfDoubles)\n            else:\n                MonsterStartVectorOfDoublesVector(builder, len(self.vectorOfDoubles))\n                for i in reversed(range(len(self.vectorOfDoubles))):\n                    builder.PrependFloat64(self.vectorOfDoubles[i])\n                vectorOfDoubles = builder.EndVector()\n        if self.parentNamespaceTest is not None:\n            parentNamespaceTest = self.parentNamespaceTest.Pack(builder)\n        if self.vectorOfReferrables is not None:\n            vectorOfReferrableslist = []\n            for i in range(len(self.vectorOfReferrables)):\n                vectorOfReferrableslist.append(self.vectorOfReferrables[i].Pack(builder))\n            MonsterStartVectorOfReferrablesVector(builder, len(self.vectorOfReferrables))\n            for i in reversed(range(len(self.vectorOfReferrables))):\n                builder.PrependUOffsetTRelative(vectorOfReferrableslist[i])\n            vectorOfReferrables = builder.EndVector()\n        if self.vectorOfWeakReferences is not None:\n            if np is not None and type(self.vectorOfWeakReferences) is np.ndarray:\n                vectorOfWeakReferences = builder.CreateNumpyVector(self.vectorOfWeakReferences)\n            else:\n                MonsterStartVectorOfWeakReferencesVector(builder, len(self.vectorOfWeakReferences))\n                for i in reversed(range(len(self.vectorOfWeakReferences))):\n                    builder.PrependUint64(self.vectorOfWeakReferences[i])\n                vectorOfWeakReferences = builder.EndVector()\n        if self.vectorOfStrongReferrables is not None:\n            vectorOfStrongReferrableslist = []\n            for i in range(len(self.vectorOfStrongReferrables)):\n                vectorOfStrongReferrableslist.append(self.vectorOfStrongReferrables[i].Pack(builder))\n            MonsterStartVectorOfStrongReferrablesVector(builder, len(self.vectorOfStrongReferrables))\n            for i in reversed(range(len(self.vectorOfStrongReferrables))):\n                builder.PrependUOffsetTRelative(vectorOfStrongReferrableslist[i])\n            vectorOfStrongReferrables = builder.EndVector()\n        if self.vectorOfCoOwningReferences is not None:\n            if np is not None and type(self.vectorOfCoOwningReferences) is np.ndarray:\n                vectorOfCoOwningReferences = builder.CreateNumpyVector(self.vectorOfCoOwningReferences)\n            else:\n                MonsterStartVectorOfCoOwningReferencesVector(builder, len(self.vectorOfCoOwningReferences))\n                for i in reversed(range(len(self.vectorOfCoOwningReferences))):\n                    builder.PrependUint64(self.vectorOfCoOwningReferences[i])\n                vectorOfCoOwningReferences = builder.EndVector()\n        if self.vectorOfNonOwningReferences is not None:\n            if np is not None and type(self.vectorOfNonOwningReferences) is np.ndarray:\n                vectorOfNonOwningReferences = builder.CreateNumpyVector(self.vectorOfNonOwningReferences)\n            else:\n                MonsterStartVectorOfNonOwningReferencesVector(builder, len(self.vectorOfNonOwningReferences))\n                for i in reversed(range(len(self.vectorOfNonOwningReferences))):\n                    builder.PrependUint64(self.vectorOfNonOwningReferences[i])\n                vectorOfNonOwningReferences = builder.EndVector()\n        if self.anyUnique is not None:\n            anyUnique = self.anyUnique.Pack(builder)\n        if self.anyAmbiguous is not None:\n            anyAmbiguous = self.anyAmbiguous.Pack(builder)\n        if self.vectorOfEnums is not None:\n            if np is not None and type(self.vectorOfEnums) is np.ndarray:\n                vectorOfEnums = builder.CreateNumpyVector(self.vectorOfEnums)\n            else:\n                MonsterStartVectorOfEnumsVector(builder, len(self.vectorOfEnums))\n                for i in reversed(range(len(self.vectorOfEnums))):\n                    builder.PrependUint8(self.vectorOfEnums[i])\n                vectorOfEnums = builder.EndVector()\n        if self.testrequirednestedflatbuffer is not None:\n            if np is not None and type(self.testrequirednestedflatbuffer) is np.ndarray:\n                testrequirednestedflatbuffer = builder.CreateNumpyVector(self.testrequirednestedflatbuffer)\n            else:\n                MonsterStartTestrequirednestedflatbufferVector(builder, len(self.testrequirednestedflatbuffer))\n                for i in reversed(range(len(self.testrequirednestedflatbuffer))):\n                    builder.PrependUint8(self.testrequirednestedflatbuffer[i])\n                testrequirednestedflatbuffer = builder.EndVector()\n        if self.scalarKeySortedTables is not None:\n            scalarKeySortedTableslist = []\n            for i in range(len(self.scalarKeySortedTables)):\n                scalarKeySortedTableslist.append(self.scalarKeySortedTables[i].Pack(builder))\n            MonsterStartScalarKeySortedTablesVector(builder, len(self.scalarKeySortedTables))\n            for i in reversed(range(len(self.scalarKeySortedTables))):\n                builder.PrependUOffsetTRelative(scalarKeySortedTableslist[i])\n            scalarKeySortedTables = builder.EndVector()\n        MonsterStart(builder)\n        if self.pos is not None:\n            pos = self.pos.Pack(builder)\n            MonsterAddPos(builder, pos)\n        MonsterAddMana(builder, self.mana)\n        MonsterAddHp(builder, self.hp)\n        if self.name is not None:\n            MonsterAddName(builder, name)\n        if self.inventory is not None:\n            MonsterAddInventory(builder, inventory)\n        MonsterAddColor(builder, self.color)\n        MonsterAddTestType(builder, self.testType)\n        if self.test is not None:\n            MonsterAddTest(builder, test)\n        if self.test4 is not None:\n            MonsterAddTest4(builder, test4)\n        if self.testarrayofstring is not None:\n            MonsterAddTestarrayofstring(builder, testarrayofstring)\n        if self.testarrayoftables is not None:\n            MonsterAddTestarrayoftables(builder, testarrayoftables)\n        if self.enemy is not None:\n            MonsterAddEnemy(builder, enemy)\n        if self.testnestedflatbuffer is not None:\n            MonsterAddTestnestedflatbuffer(builder, testnestedflatbuffer)\n        if self.testempty is not None:\n            MonsterAddTestempty(builder, testempty)\n        MonsterAddTestbool(builder, self.testbool)\n        MonsterAddTesthashs32Fnv1(builder, self.testhashs32Fnv1)\n        MonsterAddTesthashu32Fnv1(builder, self.testhashu32Fnv1)\n        MonsterAddTesthashs64Fnv1(builder, self.testhashs64Fnv1)\n        MonsterAddTesthashu64Fnv1(builder, self.testhashu64Fnv1)\n        MonsterAddTesthashs32Fnv1a(builder, self.testhashs32Fnv1a)\n        MonsterAddTesthashu32Fnv1a(builder, self.testhashu32Fnv1a)\n        MonsterAddTesthashs64Fnv1a(builder, self.testhashs64Fnv1a)\n        MonsterAddTesthashu64Fnv1a(builder, self.testhashu64Fnv1a)\n        if self.testarrayofbools is not None:\n            MonsterAddTestarrayofbools(builder, testarrayofbools)\n        MonsterAddTestf(builder, self.testf)\n        MonsterAddTestf2(builder, self.testf2)\n        MonsterAddTestf3(builder, self.testf3)\n        if self.testarrayofstring2 is not None:\n            MonsterAddTestarrayofstring2(builder, testarrayofstring2)\n        if self.testarrayofsortedstruct is not None:\n            MonsterAddTestarrayofsortedstruct(builder, testarrayofsortedstruct)\n        if self.flex is not None:\n            MonsterAddFlex(builder, flex)\n        if self.test5 is not None:\n            MonsterAddTest5(builder, test5)\n        if self.vectorOfLongs is not None:\n            MonsterAddVectorOfLongs(builder, vectorOfLongs)\n        if self.vectorOfDoubles is not None:\n            MonsterAddVectorOfDoubles(builder, vectorOfDoubles)\n        if self.parentNamespaceTest is not None:\n            MonsterAddParentNamespaceTest(builder, parentNamespaceTest)\n        if self.vectorOfReferrables is not None:\n            MonsterAddVectorOfReferrables(builder, vectorOfReferrables)\n        MonsterAddSingleWeakReference(builder, self.singleWeakReference)\n        if self.vectorOfWeakReferences is not None:\n            MonsterAddVectorOfWeakReferences(builder, vectorOfWeakReferences)\n        if self.vectorOfStrongReferrables is not None:\n            MonsterAddVectorOfStrongReferrables(builder, vectorOfStrongReferrables)\n        MonsterAddCoOwningReference(builder, self.coOwningReference)\n        if self.vectorOfCoOwningReferences is not None:\n            MonsterAddVectorOfCoOwningReferences(builder, vectorOfCoOwningReferences)\n        MonsterAddNonOwningReference(builder, self.nonOwningReference)\n        if self.vectorOfNonOwningReferences is not None:\n            MonsterAddVectorOfNonOwningReferences(builder, vectorOfNonOwningReferences)\n        MonsterAddAnyUniqueType(builder, self.anyUniqueType)\n        if self.anyUnique is not None:\n            MonsterAddAnyUnique(builder, anyUnique)\n        MonsterAddAnyAmbiguousType(builder, self.anyAmbiguousType)\n        if self.anyAmbiguous is not None:\n            MonsterAddAnyAmbiguous(builder, anyAmbiguous)\n        if self.vectorOfEnums is not None:\n            MonsterAddVectorOfEnums(builder, vectorOfEnums)\n        MonsterAddSignedEnum(builder, self.signedEnum)\n        if self.testrequirednestedflatbuffer is not None:\n            MonsterAddTestrequirednestedflatbuffer(builder, testrequirednestedflatbuffer)\n        if self.scalarKeySortedTables is not None:\n            MonsterAddScalarKeySortedTables(builder, scalarKeySortedTables)\n        if self.nativeInline is not None:\n            nativeInline = self.nativeInline.Pack(builder)\n            MonsterAddNativeInline(builder, nativeInline)\n        MonsterAddLongEnumNonEnumDefault(builder, self.longEnumNonEnumDefault)\n        MonsterAddLongEnumNormalDefault(builder, self.longEnumNormalDefault)\n        MonsterAddNanDefault(builder, self.nanDefault)\n        MonsterAddInfDefault(builder, self.infDefault)\n        MonsterAddPositiveInfDefault(builder, self.positiveInfDefault)\n        MonsterAddInfinityDefault(builder, self.infinityDefault)\n        MonsterAddPositiveInfinityDefault(builder, self.positiveInfinityDefault)\n        MonsterAddNegativeInfDefault(builder, self.negativeInfDefault)\n        MonsterAddNegativeInfinityDefault(builder, self.negativeInfinityDefault)\n        MonsterAddDoubleInfDefault(builder, self.doubleInfDefault)\n        monster = MonsterEnd(builder)\n        return monster\n"
  },
  {
    "path": "tests/MyGame/Example/MonsterStorageGrpc.java",
    "content": "// Generated by flatc compiler (version 2.0.0)\n// If you make any local changes, they will be lost\n// source: monster_test.fbs\n\npackage MyGame.Example;\n\nimport static io.grpc.MethodDescriptor.generateFullMethodName;\nimport static io.grpc.stub.ClientCalls.asyncBidiStreamingCall;\nimport static io.grpc.stub.ClientCalls.asyncClientStreamingCall;\nimport static io.grpc.stub.ClientCalls.asyncServerStreamingCall;\nimport static io.grpc.stub.ClientCalls.asyncUnaryCall;\nimport static io.grpc.stub.ClientCalls.blockingServerStreamingCall;\nimport static io.grpc.stub.ClientCalls.blockingUnaryCall;\nimport static io.grpc.stub.ClientCalls.futureUnaryCall;\nimport static io.grpc.stub.ServerCalls.asyncBidiStreamingCall;\nimport static io.grpc.stub.ServerCalls.asyncClientStreamingCall;\nimport static io.grpc.stub.ServerCalls.asyncServerStreamingCall;\nimport static io.grpc.stub.ServerCalls.asyncUnaryCall;\nimport static io.grpc.stub.ServerCalls.asyncUnimplementedStreamingCall;\nimport static io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall;\n\nimport com.google.flatbuffers.grpc.FlatbuffersUtils;\nimport java.nio.ByteBuffer;\n\n/** */\n@javax.annotation.Generated(value = \"by gRPC proto compiler\", comments = \"Source: monster_test.fbs\")\npublic final class MonsterStorageGrpc {\n\n  private MonsterStorageGrpc() {}\n\n  public static final String SERVICE_NAME = \"MyGame.Example.MonsterStorage\";\n\n  // Static method descriptors that strictly reflect the proto.\n  @io.grpc.ExperimentalApi(\"https://github.com/grpc/grpc-java/issues/1901\")\n  @java.lang.Deprecated // Use {@link #getStoreMethod()} instead.\n  public static final io.grpc.MethodDescriptor<MyGame.Example.Monster, MyGame.Example.Stat>\n      METHOD_STORE = getStoreMethod();\n\n  private static volatile io.grpc.MethodDescriptor<MyGame.Example.Monster, MyGame.Example.Stat>\n      getStoreMethod;\n\n  private static volatile FlatbuffersUtils.FBExtactor<MyGame.Example.Monster> extractorOfMonster;\n\n  private static FlatbuffersUtils.FBExtactor<MyGame.Example.Monster> getExtractorOfMonster() {\n    if (extractorOfMonster != null) return extractorOfMonster;\n    synchronized (MonsterStorageGrpc.class) {\n      if (extractorOfMonster != null) return extractorOfMonster;\n      extractorOfMonster =\n          new FlatbuffersUtils.FBExtactor<MyGame.Example.Monster>() {\n            public MyGame.Example.Monster extract(ByteBuffer buffer) {\n              return MyGame.Example.Monster.getRootAsMonster(buffer);\n            }\n          };\n      return extractorOfMonster;\n    }\n  }\n\n  private static volatile FlatbuffersUtils.FBExtactor<MyGame.Example.Stat> extractorOfStat;\n\n  private static FlatbuffersUtils.FBExtactor<MyGame.Example.Stat> getExtractorOfStat() {\n    if (extractorOfStat != null) return extractorOfStat;\n    synchronized (MonsterStorageGrpc.class) {\n      if (extractorOfStat != null) return extractorOfStat;\n      extractorOfStat =\n          new FlatbuffersUtils.FBExtactor<MyGame.Example.Stat>() {\n            public MyGame.Example.Stat extract(ByteBuffer buffer) {\n              return MyGame.Example.Stat.getRootAsStat(buffer);\n            }\n          };\n      return extractorOfStat;\n    }\n  }\n\n  @io.grpc.ExperimentalApi(\"https://github.com/grpc/grpc-java/issues/1901\")\n  public static io.grpc.MethodDescriptor<MyGame.Example.Monster, MyGame.Example.Stat>\n      getStoreMethod() {\n    io.grpc.MethodDescriptor<MyGame.Example.Monster, MyGame.Example.Stat> getStoreMethod;\n    if ((getStoreMethod = MonsterStorageGrpc.getStoreMethod) == null) {\n      synchronized (MonsterStorageGrpc.class) {\n        if ((getStoreMethod = MonsterStorageGrpc.getStoreMethod) == null) {\n          MonsterStorageGrpc.getStoreMethod =\n              getStoreMethod =\n                  io.grpc.MethodDescriptor.<MyGame.Example.Monster, MyGame.Example.Stat>newBuilder()\n                      .setType(io.grpc.MethodDescriptor.MethodType.UNARY)\n                      .setFullMethodName(\n                          generateFullMethodName(\"MyGame.Example.MonsterStorage\", \"Store\"))\n                      .setSampledToLocalTracing(true)\n                      .setRequestMarshaller(\n                          FlatbuffersUtils.marshaller(\n                              MyGame.Example.Monster.class, getExtractorOfMonster()))\n                      .setResponseMarshaller(\n                          FlatbuffersUtils.marshaller(\n                              MyGame.Example.Stat.class, getExtractorOfStat()))\n                      .setSchemaDescriptor(null)\n                      .build();\n        }\n      }\n    }\n    return getStoreMethod;\n  }\n\n  @io.grpc.ExperimentalApi(\"https://github.com/grpc/grpc-java/issues/1901\")\n  @java.lang.Deprecated // Use {@link #getRetrieveMethod()} instead.\n  public static final io.grpc.MethodDescriptor<MyGame.Example.Stat, MyGame.Example.Monster>\n      METHOD_RETRIEVE = getRetrieveMethod();\n\n  private static volatile io.grpc.MethodDescriptor<MyGame.Example.Stat, MyGame.Example.Monster>\n      getRetrieveMethod;\n\n  @io.grpc.ExperimentalApi(\"https://github.com/grpc/grpc-java/issues/1901\")\n  public static io.grpc.MethodDescriptor<MyGame.Example.Stat, MyGame.Example.Monster>\n      getRetrieveMethod() {\n    io.grpc.MethodDescriptor<MyGame.Example.Stat, MyGame.Example.Monster> getRetrieveMethod;\n    if ((getRetrieveMethod = MonsterStorageGrpc.getRetrieveMethod) == null) {\n      synchronized (MonsterStorageGrpc.class) {\n        if ((getRetrieveMethod = MonsterStorageGrpc.getRetrieveMethod) == null) {\n          MonsterStorageGrpc.getRetrieveMethod =\n              getRetrieveMethod =\n                  io.grpc.MethodDescriptor.<MyGame.Example.Stat, MyGame.Example.Monster>newBuilder()\n                      .setType(io.grpc.MethodDescriptor.MethodType.SERVER_STREAMING)\n                      .setFullMethodName(\n                          generateFullMethodName(\"MyGame.Example.MonsterStorage\", \"Retrieve\"))\n                      .setSampledToLocalTracing(true)\n                      .setRequestMarshaller(\n                          FlatbuffersUtils.marshaller(\n                              MyGame.Example.Stat.class, getExtractorOfStat()))\n                      .setResponseMarshaller(\n                          FlatbuffersUtils.marshaller(\n                              MyGame.Example.Monster.class, getExtractorOfMonster()))\n                      .setSchemaDescriptor(null)\n                      .build();\n        }\n      }\n    }\n    return getRetrieveMethod;\n  }\n\n  @io.grpc.ExperimentalApi(\"https://github.com/grpc/grpc-java/issues/1901\")\n  @java.lang.Deprecated // Use {@link #getGetMaxHitPointMethod()} instead.\n  public static final io.grpc.MethodDescriptor<MyGame.Example.Monster, MyGame.Example.Stat>\n      METHOD_GET_MAX_HIT_POINT = getGetMaxHitPointMethod();\n\n  private static volatile io.grpc.MethodDescriptor<MyGame.Example.Monster, MyGame.Example.Stat>\n      getGetMaxHitPointMethod;\n\n  @io.grpc.ExperimentalApi(\"https://github.com/grpc/grpc-java/issues/1901\")\n  public static io.grpc.MethodDescriptor<MyGame.Example.Monster, MyGame.Example.Stat>\n      getGetMaxHitPointMethod() {\n    io.grpc.MethodDescriptor<MyGame.Example.Monster, MyGame.Example.Stat> getGetMaxHitPointMethod;\n    if ((getGetMaxHitPointMethod = MonsterStorageGrpc.getGetMaxHitPointMethod) == null) {\n      synchronized (MonsterStorageGrpc.class) {\n        if ((getGetMaxHitPointMethod = MonsterStorageGrpc.getGetMaxHitPointMethod) == null) {\n          MonsterStorageGrpc.getGetMaxHitPointMethod =\n              getGetMaxHitPointMethod =\n                  io.grpc.MethodDescriptor.<MyGame.Example.Monster, MyGame.Example.Stat>newBuilder()\n                      .setType(io.grpc.MethodDescriptor.MethodType.CLIENT_STREAMING)\n                      .setFullMethodName(\n                          generateFullMethodName(\"MyGame.Example.MonsterStorage\", \"GetMaxHitPoint\"))\n                      .setSampledToLocalTracing(true)\n                      .setRequestMarshaller(\n                          FlatbuffersUtils.marshaller(\n                              MyGame.Example.Monster.class, getExtractorOfMonster()))\n                      .setResponseMarshaller(\n                          FlatbuffersUtils.marshaller(\n                              MyGame.Example.Stat.class, getExtractorOfStat()))\n                      .setSchemaDescriptor(null)\n                      .build();\n        }\n      }\n    }\n    return getGetMaxHitPointMethod;\n  }\n\n  @io.grpc.ExperimentalApi(\"https://github.com/grpc/grpc-java/issues/1901\")\n  @java.lang.Deprecated // Use {@link #getGetMinMaxHitPointsMethod()} instead.\n  public static final io.grpc.MethodDescriptor<MyGame.Example.Monster, MyGame.Example.Stat>\n      METHOD_GET_MIN_MAX_HIT_POINTS = getGetMinMaxHitPointsMethod();\n\n  private static volatile io.grpc.MethodDescriptor<MyGame.Example.Monster, MyGame.Example.Stat>\n      getGetMinMaxHitPointsMethod;\n\n  @io.grpc.ExperimentalApi(\"https://github.com/grpc/grpc-java/issues/1901\")\n  public static io.grpc.MethodDescriptor<MyGame.Example.Monster, MyGame.Example.Stat>\n      getGetMinMaxHitPointsMethod() {\n    io.grpc.MethodDescriptor<MyGame.Example.Monster, MyGame.Example.Stat>\n        getGetMinMaxHitPointsMethod;\n    if ((getGetMinMaxHitPointsMethod = MonsterStorageGrpc.getGetMinMaxHitPointsMethod) == null) {\n      synchronized (MonsterStorageGrpc.class) {\n        if ((getGetMinMaxHitPointsMethod = MonsterStorageGrpc.getGetMinMaxHitPointsMethod)\n            == null) {\n          MonsterStorageGrpc.getGetMinMaxHitPointsMethod =\n              getGetMinMaxHitPointsMethod =\n                  io.grpc.MethodDescriptor.<MyGame.Example.Monster, MyGame.Example.Stat>newBuilder()\n                      .setType(io.grpc.MethodDescriptor.MethodType.BIDI_STREAMING)\n                      .setFullMethodName(\n                          generateFullMethodName(\n                              \"MyGame.Example.MonsterStorage\", \"GetMinMaxHitPoints\"))\n                      .setSampledToLocalTracing(true)\n                      .setRequestMarshaller(\n                          FlatbuffersUtils.marshaller(\n                              MyGame.Example.Monster.class, getExtractorOfMonster()))\n                      .setResponseMarshaller(\n                          FlatbuffersUtils.marshaller(\n                              MyGame.Example.Stat.class, getExtractorOfStat()))\n                      .setSchemaDescriptor(null)\n                      .build();\n        }\n      }\n    }\n    return getGetMinMaxHitPointsMethod;\n  }\n\n  /** Creates a new async stub that supports all call types for the service */\n  public static MonsterStorageStub newStub(io.grpc.Channel channel) {\n    return new MonsterStorageStub(channel);\n  }\n\n  /**\n   * Creates a new blocking-style stub that supports unary and streaming output calls on the service\n   */\n  public static MonsterStorageBlockingStub newBlockingStub(io.grpc.Channel channel) {\n    return new MonsterStorageBlockingStub(channel);\n  }\n\n  /** Creates a new ListenableFuture-style stub that supports unary calls on the service */\n  public static MonsterStorageFutureStub newFutureStub(io.grpc.Channel channel) {\n    return new MonsterStorageFutureStub(channel);\n  }\n\n  /** */\n  public abstract static class MonsterStorageImplBase implements io.grpc.BindableService {\n\n    /** */\n    public void store(\n        MyGame.Example.Monster request,\n        io.grpc.stub.StreamObserver<MyGame.Example.Stat> responseObserver) {\n      asyncUnimplementedUnaryCall(getStoreMethod(), responseObserver);\n    }\n\n    /** */\n    public void retrieve(\n        MyGame.Example.Stat request,\n        io.grpc.stub.StreamObserver<MyGame.Example.Monster> responseObserver) {\n      asyncUnimplementedUnaryCall(getRetrieveMethod(), responseObserver);\n    }\n\n    /** */\n    public io.grpc.stub.StreamObserver<MyGame.Example.Monster> getMaxHitPoint(\n        io.grpc.stub.StreamObserver<MyGame.Example.Stat> responseObserver) {\n      return asyncUnimplementedStreamingCall(getGetMaxHitPointMethod(), responseObserver);\n    }\n\n    /** */\n    public io.grpc.stub.StreamObserver<MyGame.Example.Monster> getMinMaxHitPoints(\n        io.grpc.stub.StreamObserver<MyGame.Example.Stat> responseObserver) {\n      return asyncUnimplementedStreamingCall(getGetMinMaxHitPointsMethod(), responseObserver);\n    }\n\n    @java.lang.Override\n    public final io.grpc.ServerServiceDefinition bindService() {\n      return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())\n          .addMethod(\n              getStoreMethod(),\n              asyncUnaryCall(\n                  new MethodHandlers<MyGame.Example.Monster, MyGame.Example.Stat>(\n                      this, METHODID_STORE)))\n          .addMethod(\n              getRetrieveMethod(),\n              asyncServerStreamingCall(\n                  new MethodHandlers<MyGame.Example.Stat, MyGame.Example.Monster>(\n                      this, METHODID_RETRIEVE)))\n          .addMethod(\n              getGetMaxHitPointMethod(),\n              asyncClientStreamingCall(\n                  new MethodHandlers<MyGame.Example.Monster, MyGame.Example.Stat>(\n                      this, METHODID_GET_MAX_HIT_POINT)))\n          .addMethod(\n              getGetMinMaxHitPointsMethod(),\n              asyncBidiStreamingCall(\n                  new MethodHandlers<MyGame.Example.Monster, MyGame.Example.Stat>(\n                      this, METHODID_GET_MIN_MAX_HIT_POINTS)))\n          .build();\n    }\n  }\n\n  /** */\n  public static final class MonsterStorageStub\n      extends io.grpc.stub.AbstractStub<MonsterStorageStub> {\n    private MonsterStorageStub(io.grpc.Channel channel) {\n      super(channel);\n    }\n\n    private MonsterStorageStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) {\n      super(channel, callOptions);\n    }\n\n    @java.lang.Override\n    protected MonsterStorageStub build(io.grpc.Channel channel, io.grpc.CallOptions callOptions) {\n      return new MonsterStorageStub(channel, callOptions);\n    }\n\n    /** */\n    public void store(\n        MyGame.Example.Monster request,\n        io.grpc.stub.StreamObserver<MyGame.Example.Stat> responseObserver) {\n      asyncUnaryCall(\n          getChannel().newCall(getStoreMethod(), getCallOptions()), request, responseObserver);\n    }\n\n    /** */\n    public void retrieve(\n        MyGame.Example.Stat request,\n        io.grpc.stub.StreamObserver<MyGame.Example.Monster> responseObserver) {\n      asyncServerStreamingCall(\n          getChannel().newCall(getRetrieveMethod(), getCallOptions()), request, responseObserver);\n    }\n\n    /** */\n    public io.grpc.stub.StreamObserver<MyGame.Example.Monster> getMaxHitPoint(\n        io.grpc.stub.StreamObserver<MyGame.Example.Stat> responseObserver) {\n      return asyncClientStreamingCall(\n          getChannel().newCall(getGetMaxHitPointMethod(), getCallOptions()), responseObserver);\n    }\n\n    /** */\n    public io.grpc.stub.StreamObserver<MyGame.Example.Monster> getMinMaxHitPoints(\n        io.grpc.stub.StreamObserver<MyGame.Example.Stat> responseObserver) {\n      return asyncBidiStreamingCall(\n          getChannel().newCall(getGetMinMaxHitPointsMethod(), getCallOptions()), responseObserver);\n    }\n  }\n\n  /** */\n  public static final class MonsterStorageBlockingStub\n      extends io.grpc.stub.AbstractStub<MonsterStorageBlockingStub> {\n    private MonsterStorageBlockingStub(io.grpc.Channel channel) {\n      super(channel);\n    }\n\n    private MonsterStorageBlockingStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) {\n      super(channel, callOptions);\n    }\n\n    @java.lang.Override\n    protected MonsterStorageBlockingStub build(\n        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {\n      return new MonsterStorageBlockingStub(channel, callOptions);\n    }\n\n    /** */\n    public MyGame.Example.Stat store(MyGame.Example.Monster request) {\n      return blockingUnaryCall(getChannel(), getStoreMethod(), getCallOptions(), request);\n    }\n\n    /** */\n    public java.util.Iterator<MyGame.Example.Monster> retrieve(MyGame.Example.Stat request) {\n      return blockingServerStreamingCall(\n          getChannel(), getRetrieveMethod(), getCallOptions(), request);\n    }\n  }\n\n  /** */\n  public static final class MonsterStorageFutureStub\n      extends io.grpc.stub.AbstractStub<MonsterStorageFutureStub> {\n    private MonsterStorageFutureStub(io.grpc.Channel channel) {\n      super(channel);\n    }\n\n    private MonsterStorageFutureStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) {\n      super(channel, callOptions);\n    }\n\n    @java.lang.Override\n    protected MonsterStorageFutureStub build(\n        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {\n      return new MonsterStorageFutureStub(channel, callOptions);\n    }\n\n    /** */\n    public com.google.common.util.concurrent.ListenableFuture<MyGame.Example.Stat> store(\n        MyGame.Example.Monster request) {\n      return futureUnaryCall(getChannel().newCall(getStoreMethod(), getCallOptions()), request);\n    }\n  }\n\n  private static final int METHODID_STORE = 0;\n  private static final int METHODID_RETRIEVE = 1;\n  private static final int METHODID_GET_MIN_MAX_HIT_POINTS = 2;\n  private static final int METHODID_GET_MAX_HIT_POINT = 3;\n\n  private static final class MethodHandlers<Req, Resp>\n      implements io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>,\n          io.grpc.stub.ServerCalls.ServerStreamingMethod<Req, Resp>,\n          io.grpc.stub.ServerCalls.ClientStreamingMethod<Req, Resp>,\n          io.grpc.stub.ServerCalls.BidiStreamingMethod<Req, Resp> {\n    private final MonsterStorageImplBase serviceImpl;\n    private final int methodId;\n\n    MethodHandlers(MonsterStorageImplBase serviceImpl, int methodId) {\n      this.serviceImpl = serviceImpl;\n      this.methodId = methodId;\n    }\n\n    @java.lang.Override\n    @java.lang.SuppressWarnings(\"unchecked\")\n    public void invoke(Req request, io.grpc.stub.StreamObserver<Resp> responseObserver) {\n      switch (methodId) {\n        case METHODID_STORE:\n          serviceImpl.store(\n              (MyGame.Example.Monster) request,\n              (io.grpc.stub.StreamObserver<MyGame.Example.Stat>) responseObserver);\n          break;\n        case METHODID_RETRIEVE:\n          serviceImpl.retrieve(\n              (MyGame.Example.Stat) request,\n              (io.grpc.stub.StreamObserver<MyGame.Example.Monster>) responseObserver);\n          break;\n        default:\n          throw new AssertionError();\n      }\n    }\n\n    @java.lang.Override\n    @java.lang.SuppressWarnings(\"unchecked\")\n    public io.grpc.stub.StreamObserver<Req> invoke(\n        io.grpc.stub.StreamObserver<Resp> responseObserver) {\n      switch (methodId) {\n        case METHODID_GET_MAX_HIT_POINT:\n          return (io.grpc.stub.StreamObserver<Req>)\n              serviceImpl.getMaxHitPoint(\n                  (io.grpc.stub.StreamObserver<MyGame.Example.Stat>) responseObserver);\n        case METHODID_GET_MIN_MAX_HIT_POINTS:\n          return (io.grpc.stub.StreamObserver<Req>)\n              serviceImpl.getMinMaxHitPoints(\n                  (io.grpc.stub.StreamObserver<MyGame.Example.Stat>) responseObserver);\n        default:\n          throw new AssertionError();\n      }\n    }\n  }\n\n  private static volatile io.grpc.ServiceDescriptor serviceDescriptor;\n\n  public static io.grpc.ServiceDescriptor getServiceDescriptor() {\n    io.grpc.ServiceDescriptor result = serviceDescriptor;\n    if (result == null) {\n      synchronized (MonsterStorageGrpc.class) {\n        result = serviceDescriptor;\n        if (result == null) {\n          serviceDescriptor =\n              result =\n                  io.grpc.ServiceDescriptor.newBuilder(SERVICE_NAME)\n                      .setSchemaDescriptor(null)\n                      .addMethod(getStoreMethod())\n                      .addMethod(getRetrieveMethod())\n                      .addMethod(getGetMaxHitPointMethod())\n                      .addMethod(getGetMinMaxHitPointsMethod())\n                      .build();\n        }\n      }\n    }\n    return result;\n  }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/MonsterStorage_grpc.go",
    "content": "//Generated by gRPC Go plugin\n//If you make any local changes, they will be lost\n//source: monster_test\n\npackage Example\n\nimport (\n\tcontext \"context\"\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n\tgrpc \"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/codes\"\n\t\"google.golang.org/grpc/status\"\n)\n\n// Client API for MonsterStorage service\ntype MonsterStorageClient interface {\n\tStore(ctx context.Context, in *flatbuffers.Builder,\n\t\topts ...grpc.CallOption) (*Stat, error)\n\tRetrieve(ctx context.Context, in *flatbuffers.Builder,\n\t\topts ...grpc.CallOption) (MonsterStorage_RetrieveClient, error)\n\tGetMaxHitPoint(ctx context.Context,\n\t\topts ...grpc.CallOption) (MonsterStorage_GetMaxHitPointClient, error)\n\tGetMinMaxHitPoints(ctx context.Context,\n\t\topts ...grpc.CallOption) (MonsterStorage_GetMinMaxHitPointsClient, error)\n}\n\ntype monsterStorageClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewMonsterStorageClient(cc grpc.ClientConnInterface) MonsterStorageClient {\n\treturn &monsterStorageClient{cc}\n}\n\nfunc (c *monsterStorageClient) Store(ctx context.Context, in *flatbuffers.Builder,\n\topts ...grpc.CallOption) (*Stat, error) {\n\tout := new(Stat)\n\terr := c.cc.Invoke(ctx, \"/MyGame.Example.MonsterStorage/Store\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *monsterStorageClient) Retrieve(ctx context.Context, in *flatbuffers.Builder,\n\topts ...grpc.CallOption) (MonsterStorage_RetrieveClient, error) {\n\tstream, err := c.cc.NewStream(ctx, &_MonsterStorage_serviceDesc.Streams[0], \"/MyGame.Example.MonsterStorage/Retrieve\", opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tx := &monsterStorageRetrieveClient{stream}\n\tif err := x.ClientStream.SendMsg(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := x.ClientStream.CloseSend(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn x, nil\n}\n\ntype MonsterStorage_RetrieveClient interface {\n\tRecv() (*Monster, error)\n\tgrpc.ClientStream\n}\n\ntype monsterStorageRetrieveClient struct {\n\tgrpc.ClientStream\n}\n\nfunc (x *monsterStorageRetrieveClient) Recv() (*Monster, error) {\n\tm := new(Monster)\n\tif err := x.ClientStream.RecvMsg(m); err != nil {\n\t\treturn nil, err\n\t}\n\treturn m, nil\n}\n\nfunc (c *monsterStorageClient) GetMaxHitPoint(ctx context.Context,\n\topts ...grpc.CallOption) (MonsterStorage_GetMaxHitPointClient, error) {\n\tstream, err := c.cc.NewStream(ctx, &_MonsterStorage_serviceDesc.Streams[1], \"/MyGame.Example.MonsterStorage/GetMaxHitPoint\", opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tx := &monsterStorageGetMaxHitPointClient{stream}\n\treturn x, nil\n}\n\ntype MonsterStorage_GetMaxHitPointClient interface {\n\tSend(*flatbuffers.Builder) error\n\tCloseAndRecv() (*Stat, error)\n\tgrpc.ClientStream\n}\n\ntype monsterStorageGetMaxHitPointClient struct {\n\tgrpc.ClientStream\n}\n\nfunc (x *monsterStorageGetMaxHitPointClient) Send(m *flatbuffers.Builder) error {\n\treturn x.ClientStream.SendMsg(m)\n}\n\nfunc (x *monsterStorageGetMaxHitPointClient) CloseAndRecv() (*Stat, error) {\n\tif err := x.ClientStream.CloseSend(); err != nil {\n\t\treturn nil, err\n\t}\n\tm := new(Stat)\n\tif err := x.ClientStream.RecvMsg(m); err != nil {\n\t\treturn nil, err\n\t}\n\treturn m, nil\n}\n\nfunc (c *monsterStorageClient) GetMinMaxHitPoints(ctx context.Context,\n\topts ...grpc.CallOption) (MonsterStorage_GetMinMaxHitPointsClient, error) {\n\tstream, err := c.cc.NewStream(ctx, &_MonsterStorage_serviceDesc.Streams[2], \"/MyGame.Example.MonsterStorage/GetMinMaxHitPoints\", opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tx := &monsterStorageGetMinMaxHitPointsClient{stream}\n\treturn x, nil\n}\n\ntype MonsterStorage_GetMinMaxHitPointsClient interface {\n\tSend(*flatbuffers.Builder) error\n\tRecv() (*Stat, error)\n\tgrpc.ClientStream\n}\n\ntype monsterStorageGetMinMaxHitPointsClient struct {\n\tgrpc.ClientStream\n}\n\nfunc (x *monsterStorageGetMinMaxHitPointsClient) Send(m *flatbuffers.Builder) error {\n\treturn x.ClientStream.SendMsg(m)\n}\n\nfunc (x *monsterStorageGetMinMaxHitPointsClient) Recv() (*Stat, error) {\n\tm := new(Stat)\n\tif err := x.ClientStream.RecvMsg(m); err != nil {\n\t\treturn nil, err\n\t}\n\treturn m, nil\n}\n\n// Server API for MonsterStorage service\ntype MonsterStorageServer interface {\n\tStore(context.Context, *Monster) (*flatbuffers.Builder, error)\n\tRetrieve(*Stat, MonsterStorage_RetrieveServer) error\n\tGetMaxHitPoint(MonsterStorage_GetMaxHitPointServer) error\n\tGetMinMaxHitPoints(MonsterStorage_GetMinMaxHitPointsServer) error\n\tmustEmbedUnimplementedMonsterStorageServer()\n}\n\ntype UnimplementedMonsterStorageServer struct {\n}\n\nfunc (UnimplementedMonsterStorageServer) Store(context.Context, *Monster) (*flatbuffers.Builder, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method Store not implemented\")\n}\n\nfunc (UnimplementedMonsterStorageServer) Retrieve(*Stat, MonsterStorage_RetrieveServer) error {\n\treturn status.Errorf(codes.Unimplemented, \"method Retrieve not implemented\")\n}\n\nfunc (UnimplementedMonsterStorageServer) GetMaxHitPoint(MonsterStorage_GetMaxHitPointServer) error {\n\treturn status.Errorf(codes.Unimplemented, \"method GetMaxHitPoint not implemented\")\n}\n\nfunc (UnimplementedMonsterStorageServer) GetMinMaxHitPoints(MonsterStorage_GetMinMaxHitPointsServer) error {\n\treturn status.Errorf(codes.Unimplemented, \"method GetMinMaxHitPoints not implemented\")\n}\n\nfunc (UnimplementedMonsterStorageServer) mustEmbedUnimplementedMonsterStorageServer() {}\n\ntype UnsafeMonsterStorageServer interface {\n\tmustEmbedUnimplementedMonsterStorageServer()\n}\n\nfunc RegisterMonsterStorageServer(s grpc.ServiceRegistrar, srv MonsterStorageServer) {\n\ts.RegisterService(&_MonsterStorage_serviceDesc, srv)\n}\n\nfunc _MonsterStorage_Store_Handler(srv interface{}, ctx context.Context,\n\tdec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(Monster)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(MonsterStorageServer).Store(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/MyGame.Example.MonsterStorage/Store\",\n\t}\n\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(MonsterStorageServer).Store(ctx, req.(*Monster))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\nfunc _MonsterStorage_Retrieve_Handler(srv interface{}, stream grpc.ServerStream) error {\n\tm := new(Stat)\n\tif err := stream.RecvMsg(m); err != nil {\n\t\treturn err\n\t}\n\treturn srv.(MonsterStorageServer).Retrieve(m, &monsterStorageRetrieveServer{stream})\n}\n\ntype MonsterStorage_RetrieveServer interface {\n\tSend(*flatbuffers.Builder) error\n\tgrpc.ServerStream\n}\n\ntype monsterStorageRetrieveServer struct {\n\tgrpc.ServerStream\n}\n\nfunc (x *monsterStorageRetrieveServer) Send(m *flatbuffers.Builder) error {\n\treturn x.ServerStream.SendMsg(m)\n}\n\nfunc _MonsterStorage_GetMaxHitPoint_Handler(srv interface{}, stream grpc.ServerStream) error {\n\treturn srv.(MonsterStorageServer).GetMaxHitPoint(&monsterStorageGetMaxHitPointServer{stream})\n}\n\ntype MonsterStorage_GetMaxHitPointServer interface {\n\tRecv() (*Monster, error)\n\tSendAndClose(*flatbuffers.Builder) error\n\tgrpc.ServerStream\n}\n\ntype monsterStorageGetMaxHitPointServer struct {\n\tgrpc.ServerStream\n}\n\nfunc (x *monsterStorageGetMaxHitPointServer) Recv() (*Monster, error) {\n\tm := new(Monster)\n\tif err := x.ServerStream.RecvMsg(m); err != nil {\n\t\treturn nil, err\n\t}\n\treturn m, nil\n}\n\nfunc (x *monsterStorageGetMaxHitPointServer) SendAndClose(m *flatbuffers.Builder) error {\n\treturn x.ServerStream.SendMsg(m)\n}\n\nfunc _MonsterStorage_GetMinMaxHitPoints_Handler(srv interface{}, stream grpc.ServerStream) error {\n\treturn srv.(MonsterStorageServer).GetMinMaxHitPoints(&monsterStorageGetMinMaxHitPointsServer{stream})\n}\n\ntype MonsterStorage_GetMinMaxHitPointsServer interface {\n\tSend(*flatbuffers.Builder) error\n\tRecv() (*Monster, error)\n\tgrpc.ServerStream\n}\n\ntype monsterStorageGetMinMaxHitPointsServer struct {\n\tgrpc.ServerStream\n}\n\nfunc (x *monsterStorageGetMinMaxHitPointsServer) Send(m *flatbuffers.Builder) error {\n\treturn x.ServerStream.SendMsg(m)\n}\n\nfunc (x *monsterStorageGetMinMaxHitPointsServer) Recv() (*Monster, error) {\n\tm := new(Monster)\n\tif err := x.ServerStream.RecvMsg(m); err != nil {\n\t\treturn nil, err\n\t}\n\treturn m, nil\n}\n\nvar _MonsterStorage_serviceDesc = grpc.ServiceDesc{\n\tServiceName: \"MyGame.Example.MonsterStorage\",\n\tHandlerType: (*MonsterStorageServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"Store\",\n\t\t\tHandler:    _MonsterStorage_Store_Handler,\n\t\t},\n\t},\n\tStreams: []grpc.StreamDesc{\n\t\t{\n\t\t\tStreamName:    \"Retrieve\",\n\t\t\tHandler:       _MonsterStorage_Retrieve_Handler,\n\t\t\tServerStreams: true,\n\t\t},\n\t\t{\n\t\t\tStreamName:    \"GetMaxHitPoint\",\n\t\t\tHandler:       _MonsterStorage_GetMaxHitPoint_Handler,\n\t\t\tClientStreams: true,\n\t\t},\n\t\t{\n\t\t\tStreamName:    \"GetMinMaxHitPoints\",\n\t\t\tHandler:       _MonsterStorage_GetMinMaxHitPoints_Handler,\n\t\t\tServerStreams: true,\n\t\t\tClientStreams: true,\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "tests/MyGame/Example/MonsterT.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\npublic class MonsterT {\n  private MyGame.Example.Vec3T pos;\n  private short mana;\n  private short hp;\n  private String name;\n  private int[] inventory;\n  private int color;\n  private MyGame.Example.AnyUnion test;\n  private MyGame.Example.TestT[] test4;\n  private String[] testarrayofstring;\n  private MyGame.Example.MonsterT[] testarrayoftables;\n  private MyGame.Example.MonsterT enemy;\n  private int[] testnestedflatbuffer;\n  private MyGame.Example.StatT testempty;\n  private boolean testbool;\n  private int testhashs32Fnv1;\n  private long testhashu32Fnv1;\n  private long testhashs64Fnv1;\n  private long testhashu64Fnv1;\n  private int testhashs32Fnv1a;\n  private long testhashu32Fnv1a;\n  private long testhashs64Fnv1a;\n  private long testhashu64Fnv1a;\n  private boolean[] testarrayofbools;\n  private float testf;\n  private float testf2;\n  private float testf3;\n  private String[] testarrayofstring2;\n  private MyGame.Example.AbilityT[] testarrayofsortedstruct;\n  private int[] flex;\n  private MyGame.Example.TestT[] test5;\n  private long[] vectorOfLongs;\n  private double[] vectorOfDoubles;\n  private MyGame.InParentNamespaceT parentNamespaceTest;\n  private MyGame.Example.ReferrableT[] vectorOfReferrables;\n  private long singleWeakReference;\n  private long[] vectorOfWeakReferences;\n  private MyGame.Example.ReferrableT[] vectorOfStrongReferrables;\n  private long coOwningReference;\n  private long[] vectorOfCoOwningReferences;\n  private long nonOwningReference;\n  private long[] vectorOfNonOwningReferences;\n  private MyGame.Example.AnyUniqueAliasesUnion anyUnique;\n  private MyGame.Example.AnyAmbiguousAliasesUnion anyAmbiguous;\n  private int[] vectorOfEnums;\n  private byte signedEnum;\n  private int[] testrequirednestedflatbuffer;\n  private MyGame.Example.StatT[] scalarKeySortedTables;\n  private MyGame.Example.TestT nativeInline;\n  private long longEnumNonEnumDefault;\n  private long longEnumNormalDefault;\n  private float nanDefault;\n  private float infDefault;\n  private float positiveInfDefault;\n  private float infinityDefault;\n  private float positiveInfinityDefault;\n  private float negativeInfDefault;\n  private float negativeInfinityDefault;\n  private double doubleInfDefault;\n\n  public MyGame.Example.Vec3T getPos() { return pos; }\n\n  public void setPos(MyGame.Example.Vec3T pos) { this.pos = pos; }\n\n  public short getMana() { return mana; }\n\n  public void setMana(short mana) { this.mana = mana; }\n\n  public short getHp() { return hp; }\n\n  public void setHp(short hp) { this.hp = hp; }\n\n  public String getName() { return name; }\n\n  public void setName(String name) { this.name = name; }\n\n  public int[] getInventory() { return inventory; }\n\n  public void setInventory(int[] inventory) { this.inventory = inventory; }\n\n  public int getColor() { return color; }\n\n  public void setColor(int color) { this.color = color; }\n\n  public MyGame.Example.AnyUnion getTest() { return test; }\n\n  public void setTest(MyGame.Example.AnyUnion test) { this.test = test; }\n\n  public MyGame.Example.TestT[] getTest4() { return test4; }\n\n  public void setTest4(MyGame.Example.TestT[] test4) { this.test4 = test4; }\n\n  public String[] getTestarrayofstring() { return testarrayofstring; }\n\n  public void setTestarrayofstring(String[] testarrayofstring) { this.testarrayofstring = testarrayofstring; }\n\n  public MyGame.Example.MonsterT[] getTestarrayoftables() { return testarrayoftables; }\n\n  public void setTestarrayoftables(MyGame.Example.MonsterT[] testarrayoftables) { this.testarrayoftables = testarrayoftables; }\n\n  public MyGame.Example.MonsterT getEnemy() { return enemy; }\n\n  public void setEnemy(MyGame.Example.MonsterT enemy) { this.enemy = enemy; }\n\n  public int[] getTestnestedflatbuffer() { return testnestedflatbuffer; }\n\n  public void setTestnestedflatbuffer(int[] testnestedflatbuffer) { this.testnestedflatbuffer = testnestedflatbuffer; }\n\n  public MyGame.Example.StatT getTestempty() { return testempty; }\n\n  public void setTestempty(MyGame.Example.StatT testempty) { this.testempty = testempty; }\n\n  public boolean getTestbool() { return testbool; }\n\n  public void setTestbool(boolean testbool) { this.testbool = testbool; }\n\n  public int getTesthashs32Fnv1() { return testhashs32Fnv1; }\n\n  public void setTesthashs32Fnv1(int testhashs32Fnv1) { this.testhashs32Fnv1 = testhashs32Fnv1; }\n\n  public long getTesthashu32Fnv1() { return testhashu32Fnv1; }\n\n  public void setTesthashu32Fnv1(long testhashu32Fnv1) { this.testhashu32Fnv1 = testhashu32Fnv1; }\n\n  public long getTesthashs64Fnv1() { return testhashs64Fnv1; }\n\n  public void setTesthashs64Fnv1(long testhashs64Fnv1) { this.testhashs64Fnv1 = testhashs64Fnv1; }\n\n  public long getTesthashu64Fnv1() { return testhashu64Fnv1; }\n\n  public void setTesthashu64Fnv1(long testhashu64Fnv1) { this.testhashu64Fnv1 = testhashu64Fnv1; }\n\n  public int getTesthashs32Fnv1a() { return testhashs32Fnv1a; }\n\n  public void setTesthashs32Fnv1a(int testhashs32Fnv1a) { this.testhashs32Fnv1a = testhashs32Fnv1a; }\n\n  public long getTesthashu32Fnv1a() { return testhashu32Fnv1a; }\n\n  public void setTesthashu32Fnv1a(long testhashu32Fnv1a) { this.testhashu32Fnv1a = testhashu32Fnv1a; }\n\n  public long getTesthashs64Fnv1a() { return testhashs64Fnv1a; }\n\n  public void setTesthashs64Fnv1a(long testhashs64Fnv1a) { this.testhashs64Fnv1a = testhashs64Fnv1a; }\n\n  public long getTesthashu64Fnv1a() { return testhashu64Fnv1a; }\n\n  public void setTesthashu64Fnv1a(long testhashu64Fnv1a) { this.testhashu64Fnv1a = testhashu64Fnv1a; }\n\n  public boolean[] getTestarrayofbools() { return testarrayofbools; }\n\n  public void setTestarrayofbools(boolean[] testarrayofbools) { this.testarrayofbools = testarrayofbools; }\n\n  public float getTestf() { return testf; }\n\n  public void setTestf(float testf) { this.testf = testf; }\n\n  public float getTestf2() { return testf2; }\n\n  public void setTestf2(float testf2) { this.testf2 = testf2; }\n\n  public float getTestf3() { return testf3; }\n\n  public void setTestf3(float testf3) { this.testf3 = testf3; }\n\n  public String[] getTestarrayofstring2() { return testarrayofstring2; }\n\n  public void setTestarrayofstring2(String[] testarrayofstring2) { this.testarrayofstring2 = testarrayofstring2; }\n\n  public MyGame.Example.AbilityT[] getTestarrayofsortedstruct() { return testarrayofsortedstruct; }\n\n  public void setTestarrayofsortedstruct(MyGame.Example.AbilityT[] testarrayofsortedstruct) { this.testarrayofsortedstruct = testarrayofsortedstruct; }\n\n  public int[] getFlex() { return flex; }\n\n  public void setFlex(int[] flex) { this.flex = flex; }\n\n  public MyGame.Example.TestT[] getTest5() { return test5; }\n\n  public void setTest5(MyGame.Example.TestT[] test5) { this.test5 = test5; }\n\n  public long[] getVectorOfLongs() { return vectorOfLongs; }\n\n  public void setVectorOfLongs(long[] vectorOfLongs) { this.vectorOfLongs = vectorOfLongs; }\n\n  public double[] getVectorOfDoubles() { return vectorOfDoubles; }\n\n  public void setVectorOfDoubles(double[] vectorOfDoubles) { this.vectorOfDoubles = vectorOfDoubles; }\n\n  public MyGame.InParentNamespaceT getParentNamespaceTest() { return parentNamespaceTest; }\n\n  public void setParentNamespaceTest(MyGame.InParentNamespaceT parentNamespaceTest) { this.parentNamespaceTest = parentNamespaceTest; }\n\n  public MyGame.Example.ReferrableT[] getVectorOfReferrables() { return vectorOfReferrables; }\n\n  public void setVectorOfReferrables(MyGame.Example.ReferrableT[] vectorOfReferrables) { this.vectorOfReferrables = vectorOfReferrables; }\n\n  public long getSingleWeakReference() { return singleWeakReference; }\n\n  public void setSingleWeakReference(long singleWeakReference) { this.singleWeakReference = singleWeakReference; }\n\n  public long[] getVectorOfWeakReferences() { return vectorOfWeakReferences; }\n\n  public void setVectorOfWeakReferences(long[] vectorOfWeakReferences) { this.vectorOfWeakReferences = vectorOfWeakReferences; }\n\n  public MyGame.Example.ReferrableT[] getVectorOfStrongReferrables() { return vectorOfStrongReferrables; }\n\n  public void setVectorOfStrongReferrables(MyGame.Example.ReferrableT[] vectorOfStrongReferrables) { this.vectorOfStrongReferrables = vectorOfStrongReferrables; }\n\n  public long getCoOwningReference() { return coOwningReference; }\n\n  public void setCoOwningReference(long coOwningReference) { this.coOwningReference = coOwningReference; }\n\n  public long[] getVectorOfCoOwningReferences() { return vectorOfCoOwningReferences; }\n\n  public void setVectorOfCoOwningReferences(long[] vectorOfCoOwningReferences) { this.vectorOfCoOwningReferences = vectorOfCoOwningReferences; }\n\n  public long getNonOwningReference() { return nonOwningReference; }\n\n  public void setNonOwningReference(long nonOwningReference) { this.nonOwningReference = nonOwningReference; }\n\n  public long[] getVectorOfNonOwningReferences() { return vectorOfNonOwningReferences; }\n\n  public void setVectorOfNonOwningReferences(long[] vectorOfNonOwningReferences) { this.vectorOfNonOwningReferences = vectorOfNonOwningReferences; }\n\n  public MyGame.Example.AnyUniqueAliasesUnion getAnyUnique() { return anyUnique; }\n\n  public void setAnyUnique(MyGame.Example.AnyUniqueAliasesUnion anyUnique) { this.anyUnique = anyUnique; }\n\n  public MyGame.Example.AnyAmbiguousAliasesUnion getAnyAmbiguous() { return anyAmbiguous; }\n\n  public void setAnyAmbiguous(MyGame.Example.AnyAmbiguousAliasesUnion anyAmbiguous) { this.anyAmbiguous = anyAmbiguous; }\n\n  public int[] getVectorOfEnums() { return vectorOfEnums; }\n\n  public void setVectorOfEnums(int[] vectorOfEnums) { this.vectorOfEnums = vectorOfEnums; }\n\n  public byte getSignedEnum() { return signedEnum; }\n\n  public void setSignedEnum(byte signedEnum) { this.signedEnum = signedEnum; }\n\n  public int[] getTestrequirednestedflatbuffer() { return testrequirednestedflatbuffer; }\n\n  public void setTestrequirednestedflatbuffer(int[] testrequirednestedflatbuffer) { this.testrequirednestedflatbuffer = testrequirednestedflatbuffer; }\n\n  public MyGame.Example.StatT[] getScalarKeySortedTables() { return scalarKeySortedTables; }\n\n  public void setScalarKeySortedTables(MyGame.Example.StatT[] scalarKeySortedTables) { this.scalarKeySortedTables = scalarKeySortedTables; }\n\n  public MyGame.Example.TestT getNativeInline() { return nativeInline; }\n\n  public void setNativeInline(MyGame.Example.TestT nativeInline) { this.nativeInline = nativeInline; }\n\n  public long getLongEnumNonEnumDefault() { return longEnumNonEnumDefault; }\n\n  public void setLongEnumNonEnumDefault(long longEnumNonEnumDefault) { this.longEnumNonEnumDefault = longEnumNonEnumDefault; }\n\n  public long getLongEnumNormalDefault() { return longEnumNormalDefault; }\n\n  public void setLongEnumNormalDefault(long longEnumNormalDefault) { this.longEnumNormalDefault = longEnumNormalDefault; }\n\n  public float getNanDefault() { return nanDefault; }\n\n  public void setNanDefault(float nanDefault) { this.nanDefault = nanDefault; }\n\n  public float getInfDefault() { return infDefault; }\n\n  public void setInfDefault(float infDefault) { this.infDefault = infDefault; }\n\n  public float getPositiveInfDefault() { return positiveInfDefault; }\n\n  public void setPositiveInfDefault(float positiveInfDefault) { this.positiveInfDefault = positiveInfDefault; }\n\n  public float getInfinityDefault() { return infinityDefault; }\n\n  public void setInfinityDefault(float infinityDefault) { this.infinityDefault = infinityDefault; }\n\n  public float getPositiveInfinityDefault() { return positiveInfinityDefault; }\n\n  public void setPositiveInfinityDefault(float positiveInfinityDefault) { this.positiveInfinityDefault = positiveInfinityDefault; }\n\n  public float getNegativeInfDefault() { return negativeInfDefault; }\n\n  public void setNegativeInfDefault(float negativeInfDefault) { this.negativeInfDefault = negativeInfDefault; }\n\n  public float getNegativeInfinityDefault() { return negativeInfinityDefault; }\n\n  public void setNegativeInfinityDefault(float negativeInfinityDefault) { this.negativeInfinityDefault = negativeInfinityDefault; }\n\n  public double getDoubleInfDefault() { return doubleInfDefault; }\n\n  public void setDoubleInfDefault(double doubleInfDefault) { this.doubleInfDefault = doubleInfDefault; }\n\n\n  public MonsterT() {\n    this.pos = new MyGame.Example.Vec3T();\n    this.mana = 150;\n    this.hp = 100;\n    this.name = null;\n    this.inventory = null;\n    this.color = 8;\n    this.test = null;\n    this.test4 = null;\n    this.testarrayofstring = null;\n    this.testarrayoftables = null;\n    this.enemy = null;\n    this.testnestedflatbuffer = null;\n    this.testempty = null;\n    this.testbool = false;\n    this.testhashs32Fnv1 = 0;\n    this.testhashu32Fnv1 = 0L;\n    this.testhashs64Fnv1 = 0L;\n    this.testhashu64Fnv1 = 0L;\n    this.testhashs32Fnv1a = 0;\n    this.testhashu32Fnv1a = 0L;\n    this.testhashs64Fnv1a = 0L;\n    this.testhashu64Fnv1a = 0L;\n    this.testarrayofbools = null;\n    this.testf = 3.14159f;\n    this.testf2 = 3.0f;\n    this.testf3 = 0.0f;\n    this.testarrayofstring2 = null;\n    this.testarrayofsortedstruct = null;\n    this.flex = null;\n    this.test5 = null;\n    this.vectorOfLongs = null;\n    this.vectorOfDoubles = null;\n    this.parentNamespaceTest = null;\n    this.vectorOfReferrables = null;\n    this.singleWeakReference = 0L;\n    this.vectorOfWeakReferences = null;\n    this.vectorOfStrongReferrables = null;\n    this.coOwningReference = 0L;\n    this.vectorOfCoOwningReferences = null;\n    this.nonOwningReference = 0L;\n    this.vectorOfNonOwningReferences = null;\n    this.anyUnique = null;\n    this.anyAmbiguous = null;\n    this.vectorOfEnums = null;\n    this.signedEnum = -1;\n    this.testrequirednestedflatbuffer = null;\n    this.scalarKeySortedTables = null;\n    this.nativeInline = new MyGame.Example.TestT();\n    this.longEnumNonEnumDefault = 0L;\n    this.longEnumNormalDefault = 2L;\n    this.nanDefault = Float.NaN;\n    this.infDefault = Float.POSITIVE_INFINITY;\n    this.positiveInfDefault = Float.POSITIVE_INFINITY;\n    this.infinityDefault = Float.POSITIVE_INFINITY;\n    this.positiveInfinityDefault = Float.POSITIVE_INFINITY;\n    this.negativeInfDefault = Float.NEGATIVE_INFINITY;\n    this.negativeInfinityDefault = Float.NEGATIVE_INFINITY;\n    this.doubleInfDefault = Double.POSITIVE_INFINITY;\n  }\n  public static MonsterT deserializeFromBinary(byte[] fbBuffer) {\n    return Monster.getRootAsMonster(ByteBuffer.wrap(fbBuffer)).unpack();\n  }\n  public byte[] serializeToBinary() {\n    FlatBufferBuilder fbb = new FlatBufferBuilder();\n    Monster.finishMonsterBuffer(fbb, Monster.pack(fbb, this));\n    return fbb.sizedByteArray();\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/NestedStruct.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace MyGame.Example\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct NestedStruct : IFlatbufferObject\n{\n  private Struct __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Struct(_i, _bb); }\n  public NestedStruct __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public int A(int j) { return __p.bb.GetInt(__p.bb_pos + 0 + j * 4); }\n  public const int ALength = 2;\n#if ENABLE_SPAN_T\n  public Span<int> GetABytes() { return System.Runtime.InteropServices.MemoryMarshal.Cast<byte, int>(__p.bb.ToSpan(__p.bb_pos + 0, 8)); }\n#else\n  public ArraySegment<byte>? GetABytes() { return __p.bb.ToArraySegment(__p.bb_pos + 0, 8);}\n#endif\n  public void MutateA(int j, int a) { __p.bb.PutInt(__p.bb_pos + 0 + j * 4, a); }\n  public MyGame.Example.TestEnum B { get { return (MyGame.Example.TestEnum)__p.bb.GetSbyte(__p.bb_pos + 8); } }\n  public void MutateB(MyGame.Example.TestEnum b) { __p.bb.PutSbyte(__p.bb_pos + 8, (sbyte)b); }\n  public MyGame.Example.TestEnum C(int j) { return (MyGame.Example.TestEnum)__p.bb.GetSbyte(__p.bb_pos + 9 + j * 1); }\n  public const int CLength = 2;\n#if ENABLE_SPAN_T\n  public Span<MyGame.Example.TestEnum> GetCBytes() { return System.Runtime.InteropServices.MemoryMarshal.Cast<byte, MyGame.Example.TestEnum>(__p.bb.ToSpan(__p.bb_pos + 9, 2)); }\n#else\n  public ArraySegment<byte>? GetCBytes() { return __p.bb.ToArraySegment(__p.bb_pos + 9, 2);}\n#endif\n  public void MutateC(int j, MyGame.Example.TestEnum c) { __p.bb.PutSbyte(__p.bb_pos + 9 + j * 1, (sbyte)c); }\n  public long D(int j) { return __p.bb.GetLong(__p.bb_pos + 16 + j * 8); }\n  public const int DLength = 2;\n#if ENABLE_SPAN_T\n  public Span<long> GetDBytes() { return System.Runtime.InteropServices.MemoryMarshal.Cast<byte, long>(__p.bb.ToSpan(__p.bb_pos + 16, 16)); }\n#else\n  public ArraySegment<byte>? GetDBytes() { return __p.bb.ToArraySegment(__p.bb_pos + 16, 16);}\n#endif\n  public void MutateD(int j, long d) { __p.bb.PutLong(__p.bb_pos + 16 + j * 8, d); }\n\n  public static Offset<MyGame.Example.NestedStruct> CreateNestedStruct(FlatBufferBuilder builder, int[] A, MyGame.Example.TestEnum B, MyGame.Example.TestEnum[] C, long[] D) {\n    builder.Prep(8, 32);\n    for (int _idx0 = 2; _idx0 > 0; _idx0--) {\n      builder.PutLong(D[_idx0-1]);\n    }\n    builder.Pad(5);\n    for (int _idx0 = 2; _idx0 > 0; _idx0--) {\n      builder.PutSbyte((sbyte)C[_idx0-1]);\n    }\n    builder.PutSbyte((sbyte)B);\n    for (int _idx0 = 2; _idx0 > 0; _idx0--) {\n      builder.PutInt(A[_idx0-1]);\n    }\n    return new Offset<MyGame.Example.NestedStruct>(builder.Offset);\n  }\n  public NestedStructT UnPack() {\n    var _o = new NestedStructT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(NestedStructT _o) {\n    _o.A = new int[2];\n    for (var _j = 0; _j < 2; ++_j) { _o.A[_j] = this.A(_j); }\n    _o.B = this.B;\n    _o.C = new MyGame.Example.TestEnum[2];\n    for (var _j = 0; _j < 2; ++_j) { _o.C[_j] = this.C(_j); }\n    _o.D = new long[2];\n    for (var _j = 0; _j < 2; ++_j) { _o.D[_j] = this.D(_j); }\n  }\n  public static Offset<MyGame.Example.NestedStruct> Pack(FlatBufferBuilder builder, NestedStructT _o) {\n    if (_o == null) return default(Offset<MyGame.Example.NestedStruct>);\n    var _a = _o.A;\n    var _c = _o.C;\n    var _d = _o.D;\n    return CreateNestedStruct(\n      builder,\n      _a,\n      _o.B,\n      _c,\n      _d);\n  }\n}\n\npublic class NestedStructT\n{\n  [Newtonsoft.Json.JsonProperty(\"a\")]\n  public int[] A { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"b\")]\n  public MyGame.Example.TestEnum B { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"c\")]\n  public MyGame.Example.TestEnum[] C { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"d\")]\n  public long[] D { get; set; }\n\n  public NestedStructT() {\n    this.A = new int[2];\n    this.B = MyGame.Example.TestEnum.A;\n    this.C = new MyGame.Example.TestEnum[2];\n    this.D = new long[2];\n  }\n}\n\n\n}\n"
  },
  {
    "path": "tests/MyGame/Example/NestedStruct.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class NestedStruct extends Struct {\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public NestedStruct __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public int a(int j) { return bb.getInt(bb_pos + 0 + j * 4); }\n  public void mutateA(int j, int a) { bb.putInt(bb_pos + 0 + j * 4, a); }\n  public byte b() { return bb.get(bb_pos + 8); }\n  public void mutateB(byte b) { bb.put(bb_pos + 8, b); }\n  public byte c(int j) { return bb.get(bb_pos + 9 + j * 1); }\n  public void mutateC(int j, byte c) { bb.put(bb_pos + 9 + j * 1, c); }\n  public long d(int j) { return bb.getLong(bb_pos + 16 + j * 8); }\n  public void mutateD(int j, long d) { bb.putLong(bb_pos + 16 + j * 8, d); }\n\n  public static int createNestedStruct(FlatBufferBuilder builder, int[] a, byte b, byte[] c, long[] d) {\n    builder.prep(8, 32);\n    for (int _idx0 = 2; _idx0 > 0; _idx0--) {\n      builder.putLong(d[_idx0-1]);\n    }\n    builder.pad(5);\n    for (int _idx0 = 2; _idx0 > 0; _idx0--) {\n      builder.putByte(c[_idx0-1]);\n    }\n    builder.putByte(b);\n    for (int _idx0 = 2; _idx0 > 0; _idx0--) {\n      builder.putInt(a[_idx0-1]);\n    }\n    return builder.offset();\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public NestedStruct get(int j) { return get(new NestedStruct(), j); }\n    public NestedStruct get(NestedStruct obj, int j) {  return obj.__assign(__element(j), bb); }\n  }\n  public NestedStructT unpack() {\n    NestedStructT _o = new NestedStructT();\n    unpackTo(_o);\n    return _o;\n  }\n  public void unpackTo(NestedStructT _o) {\n    int[] _oA = _o.getA();\n    for (int _j = 0; _j < 2; ++_j) { _oA[_j] = a(_j); }\n    byte _oB = b();\n    _o.setB(_oB);\n    byte[] _oC = _o.getC();\n    for (int _j = 0; _j < 2; ++_j) { _oC[_j] = c(_j); }\n    long[] _oD = _o.getD();\n    for (int _j = 0; _j < 2; ++_j) { _oD[_j] = d(_j); }\n  }\n  public static int pack(FlatBufferBuilder builder, NestedStructT _o) {\n    if (_o == null) return 0;\n    int[] _a = _o.getA();\n    byte[] _c = _o.getC();\n    long[] _d = _o.getD();\n    return createNestedStruct(\n      builder,\n      _a,\n      _o.getB(),\n      _c,\n      _d);\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/NestedStruct.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: Example\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nfrom typing import Any\nnp = import_numpy()\n\nclass NestedStruct(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def SizeOf(cls) -> int:\n        return 32\n\n    # NestedStruct\n    def Init(self, buf: bytes, pos: int):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # NestedStruct\n    def A(self, j = None):\n        if j is None:\n            return [self._tab.Get(flatbuffers.number_types.Int32Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(0 + i * 4)) for i in range(self.ALength())]\n        elif j >= 0 and j < self.ALength():\n            return self._tab.Get(flatbuffers.number_types.Int32Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(0 + j * 4))\n        else:\n            return None\n\n    # NestedStruct\n    def AAsNumpy(self):\n        return self._tab.GetArrayAsNumpy(flatbuffers.number_types.Int32Flags, self._tab.Pos + 0, self.ALength())\n\n    # NestedStruct\n    def ALength(self) -> int:\n        return 2\n\n    # NestedStruct\n    def AIsNone(self) -> bool:\n        return False\n\n    # NestedStruct\n    def B(self): return self._tab.Get(flatbuffers.number_types.Int8Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(8))\n    # NestedStruct\n    def C(self, j = None):\n        if j is None:\n            return [self._tab.Get(flatbuffers.number_types.Int8Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(9 + i * 1)) for i in range(self.CLength())]\n        elif j >= 0 and j < self.CLength():\n            return self._tab.Get(flatbuffers.number_types.Int8Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(9 + j * 1))\n        else:\n            return None\n\n    # NestedStruct\n    def CAsNumpy(self):\n        return self._tab.GetArrayAsNumpy(flatbuffers.number_types.Int8Flags, self._tab.Pos + 9, self.CLength())\n\n    # NestedStruct\n    def CLength(self) -> int:\n        return 2\n\n    # NestedStruct\n    def CIsNone(self) -> bool:\n        return False\n\n    # NestedStruct\n    def D(self, j = None):\n        if j is None:\n            return [self._tab.Get(flatbuffers.number_types.Int64Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(16 + i * 8)) for i in range(self.DLength())]\n        elif j >= 0 and j < self.DLength():\n            return self._tab.Get(flatbuffers.number_types.Int64Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(16 + j * 8))\n        else:\n            return None\n\n    # NestedStruct\n    def DAsNumpy(self):\n        return self._tab.GetArrayAsNumpy(flatbuffers.number_types.Int64Flags, self._tab.Pos + 16, self.DLength())\n\n    # NestedStruct\n    def DLength(self) -> int:\n        return 2\n\n    # NestedStruct\n    def DIsNone(self) -> bool:\n        return False\n\n\ndef CreateNestedStruct(builder, a, b, c, d):\n    builder.Prep(8, 32)\n    for _idx0 in range(2 , 0, -1):\n        builder.PrependInt64(d[_idx0-1])\n    builder.Pad(5)\n    for _idx0 in range(2 , 0, -1):\n        builder.PrependInt8(c[_idx0-1])\n    builder.PrependInt8(b)\n    for _idx0 in range(2 , 0, -1):\n        builder.PrependInt32(a[_idx0-1])\n    return builder.Offset()\n\ntry:\n    from typing import List\nexcept:\n    pass\n\nclass NestedStructT(object):\n\n    # NestedStructT\n    def __init__(\n        self,\n        a = None,\n        b = 0,\n        c = None,\n        d = None,\n    ):\n        self.a = a  # type: Optional[List[int]]\n        self.b = b  # type: int\n        self.c = c  # type: Optional[List[int]]\n        self.d = d  # type: Optional[List[int]]\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        nestedStruct = NestedStruct()\n        nestedStruct.Init(buf, pos)\n        return cls.InitFromObj(nestedStruct)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, nestedStruct):\n        x = NestedStructT()\n        x._UnPack(nestedStruct)\n        return x\n\n    # NestedStructT\n    def _UnPack(self, nestedStruct):\n        if nestedStruct is None:\n            return\n        if not nestedStruct.AIsNone():\n            if np is None:\n                self.a = []\n                for i in range(nestedStruct.ALength()):\n                    self.a.append(nestedStruct.A(i))\n            else:\n                self.a = nestedStruct.AAsNumpy()\n        self.b = nestedStruct.B()\n        if not nestedStruct.CIsNone():\n            if np is None:\n                self.c = []\n                for i in range(nestedStruct.CLength()):\n                    self.c.append(nestedStruct.C(i))\n            else:\n                self.c = nestedStruct.CAsNumpy()\n        if not nestedStruct.DIsNone():\n            if np is None:\n                self.d = []\n                for i in range(nestedStruct.DLength()):\n                    self.d.append(nestedStruct.D(i))\n            else:\n                self.d = nestedStruct.DAsNumpy()\n\n    # NestedStructT\n    def Pack(self, builder):\n        return CreateNestedStruct(builder, self.a, self.b, self.c, self.d)\n"
  },
  {
    "path": "tests/MyGame/Example/NestedStruct.pyi",
    "content": "from __future__ import annotations\n\nimport flatbuffers\nimport numpy as np\n\nimport typing\nfrom MyGame.Example.TestEnum import TestEnum\n\nuoffset: typing.TypeAlias = flatbuffers.number_types.UOffsetTFlags.py_type\n\nclass NestedStruct(object):\n  @classmethod\n  def SizeOf(cls) -> int: ...\n\n  def Init(self, buf: bytes, pos: int) -> None: ...\n  def A(self, i: int) -> typing.List[int]: ...\n  def AAsNumpy(self) -> np.ndarray: ...\n  def ALength(self) -> int: ...\n  def AIsNone(self) -> bool: ...\n  def B(self) -> typing.Literal[TestEnum.A, TestEnum.B, TestEnum.C]: ...\n  def C(self, i: int) -> typing.Literal[TestEnum.A, TestEnum.B, TestEnum.C]: ...\n  def CAsNumpy(self) -> np.ndarray: ...\n  def CLength(self) -> int: ...\n  def CIsNone(self) -> bool: ...\n  def D(self, i: int) -> typing.List[int]: ...\n  def DAsNumpy(self) -> np.ndarray: ...\n  def DLength(self) -> int: ...\n  def DIsNone(self) -> bool: ...\nclass NestedStructT(object):\n  a: typing.List[int]\n  b: typing.Literal[TestEnum.A, TestEnum.B, TestEnum.C]\n  c: typing.List[typing.Literal[TestEnum.A, TestEnum.B, TestEnum.C]]\n  d: typing.List[int]\n  def __init__(\n    self,\n    a: typing.List[int] | None = ...,\n    b: typing.Literal[TestEnum.A, TestEnum.B, TestEnum.C] = ...,\n    c: typing.List[typing.Literal[TestEnum.A, TestEnum.B, TestEnum.C]] | None = ...,\n    d: typing.List[int] | None = ...,\n  ) -> None: ...\n  @classmethod\n  def InitFromBuf(cls, buf: bytes, pos: int) -> NestedStructT: ...\n  @classmethod\n  def InitFromPackedBuf(cls, buf: bytes, pos: int = 0) -> NestedStructT: ...\n  @classmethod\n  def InitFromObj(cls, nestedStruct: NestedStruct) -> NestedStructT: ...\n  def _UnPack(self, nestedStruct: NestedStruct) -> None: ...\n  def Pack(self, builder: flatbuffers.Builder) -> None: ...\n\ndef CreateNestedStruct(builder: flatbuffers.Builder, a: int, b: typing.Literal[TestEnum.A, TestEnum.B, TestEnum.C], c: typing.Literal[TestEnum.A, TestEnum.B, TestEnum.C], d: int) -> uoffset: ...\n\n"
  },
  {
    "path": "tests/MyGame/Example/NestedStructT.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\npublic class NestedStructT {\n  private int[] a;\n  private byte b;\n  private byte[] c;\n  private long[] d;\n\n  public int[] getA() { return a; }\n\n  public void setA(int[] a) { if (a != null && a.length == 2) this.a = a; }\n\n  public byte getB() { return b; }\n\n  public void setB(byte b) { this.b = b; }\n\n  public byte[] getC() { return c; }\n\n  public void setC(byte[] c) { if (c != null && c.length == 2) this.c = c; }\n\n  public long[] getD() { return d; }\n\n  public void setD(long[] d) { if (d != null && d.length == 2) this.d = d; }\n\n\n  public NestedStructT() {\n    this.a = new int[2];\n    this.b = 0;\n    this.c = new byte[2];\n    this.d = new long[2];\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/NestedUnion/Any.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: NestedUnion\n\nclass Any(object):\n    NONE = 0\n    Vec3 = 1\n    TestSimpleTableWithEnum = 2\n\ndef AnyCreator(unionType, table):\n    from flatbuffers.table import Table\n    if not isinstance(table, Table):\n        return None\n    if unionType == Any.Vec3:\n        import MyGame.Example.NestedUnion.Vec3\n        return MyGame.Example.NestedUnion.Vec3.Vec3T.InitFromBuf(table.Bytes, table.Pos)\n    if unionType == Any.TestSimpleTableWithEnum:\n        import MyGame.Example.NestedUnion.TestSimpleTableWithEnum\n        return MyGame.Example.NestedUnion.TestSimpleTableWithEnum.TestSimpleTableWithEnumT.InitFromBuf(table.Bytes, table.Pos)\n    return None\n"
  },
  {
    "path": "tests/MyGame/Example/NestedUnion/Any.pyi",
    "content": "from __future__ import annotations\n\nimport flatbuffers\nimport numpy as np\n\nimport typing\nfrom MyGame.Example.NestedUnion.TestSimpleTableWithEnum import TestSimpleTableWithEnum\nfrom MyGame.Example.NestedUnion.Vec3 import Vec3\nfrom flatbuffers import table\nfrom typing import cast\n\nuoffset: typing.TypeAlias = flatbuffers.number_types.UOffsetTFlags.py_type\n\nclass Any(object):\n  NONE = cast(int, ...)\n  Vec3 = cast(int, ...)\n  TestSimpleTableWithEnum = cast(int, ...)\ndef AnyCreator(union_type: typing.Literal[Any.NONE, Any.Vec3, Any.TestSimpleTableWithEnum], table: table.Table) -> typing.Union[None, Vec3, TestSimpleTableWithEnum]: ...\n\n"
  },
  {
    "path": "tests/MyGame/Example/NestedUnion/Color.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: NestedUnion\n\n# Composite components of Monster color.\nclass Color(object):\n    Red = 1\n    # \\brief color Green\n    # Green is bit_flag with value (1u << 1)\n    Green = 2\n    # \\brief color Blue (1u << 3)\n    Blue = 8\n"
  },
  {
    "path": "tests/MyGame/Example/NestedUnion/Color.pyi",
    "content": "from __future__ import annotations\n\nimport flatbuffers\nimport numpy as np\n\nimport typing\nfrom typing import cast\n\nuoffset: typing.TypeAlias = flatbuffers.number_types.UOffsetTFlags.py_type\n\nclass Color(object):\n  Red = cast(int, ...)\n  Green = cast(int, ...)\n  Blue = cast(int, ...)\n\n"
  },
  {
    "path": "tests/MyGame/Example/NestedUnion/NestedUnionTest.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: NestedUnion\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nfrom typing import Any\nfrom flatbuffers.table import Table\nfrom typing import Optional\nnp = import_numpy()\n\nclass NestedUnionTest(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset: int = 0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = NestedUnionTest()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsNestedUnionTest(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    # NestedUnionTest\n    def Init(self, buf: bytes, pos: int):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # NestedUnionTest\n    def Name(self) -> Optional[str]:\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.String(o + self._tab.Pos)\n        return None\n\n    # NestedUnionTest\n    def DataType(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos)\n        return 0\n\n    # NestedUnionTest\n    def Data(self) -> Optional[flatbuffers.table.Table]:\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))\n        if o != 0:\n            obj = Table(bytearray(), 0)\n            self._tab.Union(obj, o)\n            return obj\n        return None\n\n    # NestedUnionTest\n    def Id(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int16Flags, o + self._tab.Pos)\n        return 0\n\ndef NestedUnionTestStart(builder: flatbuffers.Builder):\n    builder.StartObject(4)\n\ndef Start(builder: flatbuffers.Builder):\n    NestedUnionTestStart(builder)\n\ndef NestedUnionTestAddName(builder: flatbuffers.Builder, name: int):\n    builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(name), 0)\n\ndef AddName(builder: flatbuffers.Builder, name: int):\n    NestedUnionTestAddName(builder, name)\n\ndef NestedUnionTestAddDataType(builder: flatbuffers.Builder, dataType: int):\n    builder.PrependUint8Slot(1, dataType, 0)\n\ndef AddDataType(builder: flatbuffers.Builder, dataType: int):\n    NestedUnionTestAddDataType(builder, dataType)\n\ndef NestedUnionTestAddData(builder: flatbuffers.Builder, data: int):\n    builder.PrependUOffsetTRelativeSlot(2, flatbuffers.number_types.UOffsetTFlags.py_type(data), 0)\n\ndef AddData(builder: flatbuffers.Builder, data: int):\n    NestedUnionTestAddData(builder, data)\n\ndef NestedUnionTestAddId(builder: flatbuffers.Builder, id: int):\n    builder.PrependInt16Slot(3, id, 0)\n\ndef AddId(builder: flatbuffers.Builder, id: int):\n    NestedUnionTestAddId(builder, id)\n\ndef NestedUnionTestEnd(builder: flatbuffers.Builder) -> int:\n    return builder.EndObject()\n\ndef End(builder: flatbuffers.Builder) -> int:\n    return NestedUnionTestEnd(builder)\n\nimport MyGame.Example.NestedUnion.Any\nimport MyGame.Example.NestedUnion.TestSimpleTableWithEnum\nimport MyGame.Example.NestedUnion.Vec3\ntry:\n    from typing import Union\nexcept:\n    pass\n\nclass NestedUnionTestT(object):\n\n    # NestedUnionTestT\n    def __init__(\n        self,\n        name = None,\n        dataType = 0,\n        data = None,\n        id = 0,\n    ):\n        self.name = name  # type: Optional[str]\n        self.dataType = dataType  # type: int\n        self.data = data  # type: Union[None, 'MyGame.Example.NestedUnion.Vec3.Vec3T', 'MyGame.Example.NestedUnion.TestSimpleTableWithEnum.TestSimpleTableWithEnumT']\n        self.id = id  # type: int\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        nestedUnionTest = NestedUnionTest()\n        nestedUnionTest.Init(buf, pos)\n        return cls.InitFromObj(nestedUnionTest)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, nestedUnionTest):\n        x = NestedUnionTestT()\n        x._UnPack(nestedUnionTest)\n        return x\n\n    # NestedUnionTestT\n    def _UnPack(self, nestedUnionTest):\n        if nestedUnionTest is None:\n            return\n        self.name = nestedUnionTest.Name()\n        if self.name is not None:\n            self.name = self.name.decode('utf-8')\n        self.dataType = nestedUnionTest.DataType()\n        self.data = MyGame.Example.NestedUnion.Any.AnyCreator(self.dataType, nestedUnionTest.Data())\n        self.id = nestedUnionTest.Id()\n\n    # NestedUnionTestT\n    def Pack(self, builder):\n        if self.name is not None:\n            name = builder.CreateString(self.name)\n        if self.data is not None:\n            data = self.data.Pack(builder)\n        NestedUnionTestStart(builder)\n        if self.name is not None:\n            NestedUnionTestAddName(builder, name)\n        NestedUnionTestAddDataType(builder, self.dataType)\n        if self.data is not None:\n            NestedUnionTestAddData(builder, data)\n        NestedUnionTestAddId(builder, self.id)\n        nestedUnionTest = NestedUnionTestEnd(builder)\n        return nestedUnionTest\n"
  },
  {
    "path": "tests/MyGame/Example/NestedUnion/NestedUnionTest.pyi",
    "content": "from __future__ import annotations\n\nimport flatbuffers\nimport numpy as np\n\nimport typing\nfrom MyGame.Example.NestedUnion.Any import Any\nfrom MyGame.Example.NestedUnion.TestSimpleTableWithEnum import TestSimpleTableWithEnumT\nfrom MyGame.Example.NestedUnion.Vec3 import Vec3T\nfrom flatbuffers import table\n\nuoffset: typing.TypeAlias = flatbuffers.number_types.UOffsetTFlags.py_type\n\nclass NestedUnionTest(object):\n  @classmethod\n  def GetRootAs(cls, buf: bytes, offset: int) -> NestedUnionTest: ...\n  @classmethod\n  def GetRootAsNestedUnionTest(cls, buf: bytes, offset: int) -> NestedUnionTest: ...\n  def Init(self, buf: bytes, pos: int) -> None: ...\n  def Name(self) -> str | None: ...\n  def DataType(self) -> typing.Literal[Any.NONE, Any.Vec3, Any.TestSimpleTableWithEnum]: ...\n  def Data(self) -> table.Table | None: ...\n  def Id(self) -> int: ...\nclass NestedUnionTestT(object):\n  name: str | None\n  dataType: typing.Literal[Any.NONE, Any.Vec3, Any.TestSimpleTableWithEnum]\n  data: typing.Union[None, Vec3T, TestSimpleTableWithEnumT]\n  id: int\n  def __init__(\n    self,\n    name: str | None = ...,\n    dataType: typing.Literal[Any.NONE, Any.Vec3, Any.TestSimpleTableWithEnum] = ...,\n    data: typing.Union[None, Vec3T, TestSimpleTableWithEnumT] = ...,\n    id: int = ...,\n  ) -> None: ...\n  @classmethod\n  def InitFromBuf(cls, buf: bytes, pos: int) -> NestedUnionTestT: ...\n  @classmethod\n  def InitFromPackedBuf(cls, buf: bytes, pos: int = 0) -> NestedUnionTestT: ...\n  @classmethod\n  def InitFromObj(cls, nestedUnionTest: NestedUnionTest) -> NestedUnionTestT: ...\n  def _UnPack(self, nestedUnionTest: NestedUnionTest) -> None: ...\n  def Pack(self, builder: flatbuffers.Builder) -> None: ...\ndef NestedUnionTestStart(builder: flatbuffers.Builder) -> None: ...\ndef Start(builder: flatbuffers.Builder) -> None: ...\ndef NestedUnionTestAddName(builder: flatbuffers.Builder, name: uoffset) -> None: ...\ndef NestedUnionTestAddDataType(builder: flatbuffers.Builder, dataType: typing.Literal[Any.NONE, Any.Vec3, Any.TestSimpleTableWithEnum]) -> None: ...\ndef NestedUnionTestAddData(builder: flatbuffers.Builder, data: uoffset) -> None: ...\ndef NestedUnionTestAddId(builder: flatbuffers.Builder, id: int) -> None: ...\ndef NestedUnionTestEnd(builder: flatbuffers.Builder) -> uoffset: ...\ndef End(builder: flatbuffers.Builder) -> uoffset: ...\n\n"
  },
  {
    "path": "tests/MyGame/Example/NestedUnion/Test.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: NestedUnion\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nfrom typing import Any\nnp = import_numpy()\n\nclass Test(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def SizeOf(cls) -> int:\n        return 4\n\n    # Test\n    def Init(self, buf: bytes, pos: int):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # Test\n    def A(self): return self._tab.Get(flatbuffers.number_types.Int16Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(0))\n    # Test\n    def B(self): return self._tab.Get(flatbuffers.number_types.Int8Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(2))\n\ndef CreateTest(builder, a, b):\n    builder.Prep(2, 4)\n    builder.Pad(1)\n    builder.PrependInt8(b)\n    builder.PrependInt16(a)\n    return builder.Offset()\n\n\nclass TestT(object):\n\n    # TestT\n    def __init__(\n        self,\n        a = 0,\n        b = 0,\n    ):\n        self.a = a  # type: int\n        self.b = b  # type: int\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        test = Test()\n        test.Init(buf, pos)\n        return cls.InitFromObj(test)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, test):\n        x = TestT()\n        x._UnPack(test)\n        return x\n\n    # TestT\n    def _UnPack(self, test):\n        if test is None:\n            return\n        self.a = test.A()\n        self.b = test.B()\n\n    # TestT\n    def Pack(self, builder):\n        return CreateTest(builder, self.a, self.b)\n"
  },
  {
    "path": "tests/MyGame/Example/NestedUnion/Test.pyi",
    "content": "from __future__ import annotations\n\nimport flatbuffers\nimport numpy as np\n\nimport typing\n\nuoffset: typing.TypeAlias = flatbuffers.number_types.UOffsetTFlags.py_type\n\nclass Test(object):\n  @classmethod\n  def SizeOf(cls) -> int: ...\n\n  def Init(self, buf: bytes, pos: int) -> None: ...\n  def A(self) -> int: ...\n  def B(self) -> int: ...\nclass TestT(object):\n  a: int\n  b: int\n  def __init__(\n    self,\n    a: int = ...,\n    b: int = ...,\n  ) -> None: ...\n  @classmethod\n  def InitFromBuf(cls, buf: bytes, pos: int) -> TestT: ...\n  @classmethod\n  def InitFromPackedBuf(cls, buf: bytes, pos: int = 0) -> TestT: ...\n  @classmethod\n  def InitFromObj(cls, test: Test) -> TestT: ...\n  def _UnPack(self, test: Test) -> None: ...\n  def Pack(self, builder: flatbuffers.Builder) -> None: ...\n\ndef CreateTest(builder: flatbuffers.Builder, a: int, b: int) -> uoffset: ...\n\n"
  },
  {
    "path": "tests/MyGame/Example/NestedUnion/TestSimpleTableWithEnum.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: NestedUnion\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nfrom typing import Any\nnp = import_numpy()\n\nclass TestSimpleTableWithEnum(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset: int = 0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = TestSimpleTableWithEnum()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsTestSimpleTableWithEnum(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    # TestSimpleTableWithEnum\n    def Init(self, buf: bytes, pos: int):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # TestSimpleTableWithEnum\n    def Color(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos)\n        return 2\n\ndef TestSimpleTableWithEnumStart(builder: flatbuffers.Builder):\n    builder.StartObject(1)\n\ndef Start(builder: flatbuffers.Builder):\n    TestSimpleTableWithEnumStart(builder)\n\ndef TestSimpleTableWithEnumAddColor(builder: flatbuffers.Builder, color: int):\n    builder.PrependUint8Slot(0, color, 2)\n\ndef AddColor(builder: flatbuffers.Builder, color: int):\n    TestSimpleTableWithEnumAddColor(builder, color)\n\ndef TestSimpleTableWithEnumEnd(builder: flatbuffers.Builder) -> int:\n    return builder.EndObject()\n\ndef End(builder: flatbuffers.Builder) -> int:\n    return TestSimpleTableWithEnumEnd(builder)\n\n\nclass TestSimpleTableWithEnumT(object):\n\n    # TestSimpleTableWithEnumT\n    def __init__(\n        self,\n        color = 2,\n    ):\n        self.color = color  # type: int\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        testSimpleTableWithEnum = TestSimpleTableWithEnum()\n        testSimpleTableWithEnum.Init(buf, pos)\n        return cls.InitFromObj(testSimpleTableWithEnum)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, testSimpleTableWithEnum):\n        x = TestSimpleTableWithEnumT()\n        x._UnPack(testSimpleTableWithEnum)\n        return x\n\n    # TestSimpleTableWithEnumT\n    def _UnPack(self, testSimpleTableWithEnum):\n        if testSimpleTableWithEnum is None:\n            return\n        self.color = testSimpleTableWithEnum.Color()\n\n    # TestSimpleTableWithEnumT\n    def Pack(self, builder):\n        TestSimpleTableWithEnumStart(builder)\n        TestSimpleTableWithEnumAddColor(builder, self.color)\n        testSimpleTableWithEnum = TestSimpleTableWithEnumEnd(builder)\n        return testSimpleTableWithEnum\n"
  },
  {
    "path": "tests/MyGame/Example/NestedUnion/TestSimpleTableWithEnum.pyi",
    "content": "from __future__ import annotations\n\nimport flatbuffers\nimport numpy as np\n\nimport typing\nfrom MyGame.Example.NestedUnion.Color import Color\n\nuoffset: typing.TypeAlias = flatbuffers.number_types.UOffsetTFlags.py_type\n\nclass TestSimpleTableWithEnum(object):\n  @classmethod\n  def GetRootAs(cls, buf: bytes, offset: int) -> TestSimpleTableWithEnum: ...\n  @classmethod\n  def GetRootAsTestSimpleTableWithEnum(cls, buf: bytes, offset: int) -> TestSimpleTableWithEnum: ...\n  def Init(self, buf: bytes, pos: int) -> None: ...\n  def Color(self) -> typing.Literal[Color.Red, Color.Green, Color.Blue]: ...\nclass TestSimpleTableWithEnumT(object):\n  color: typing.Literal[Color.Red, Color.Green, Color.Blue]\n  def __init__(\n    self,\n    color: typing.Literal[Color.Red, Color.Green, Color.Blue] = ...,\n  ) -> None: ...\n  @classmethod\n  def InitFromBuf(cls, buf: bytes, pos: int) -> TestSimpleTableWithEnumT: ...\n  @classmethod\n  def InitFromPackedBuf(cls, buf: bytes, pos: int = 0) -> TestSimpleTableWithEnumT: ...\n  @classmethod\n  def InitFromObj(cls, testSimpleTableWithEnum: TestSimpleTableWithEnum) -> TestSimpleTableWithEnumT: ...\n  def _UnPack(self, testSimpleTableWithEnum: TestSimpleTableWithEnum) -> None: ...\n  def Pack(self, builder: flatbuffers.Builder) -> None: ...\ndef TestSimpleTableWithEnumStart(builder: flatbuffers.Builder) -> None: ...\ndef Start(builder: flatbuffers.Builder) -> None: ...\ndef TestSimpleTableWithEnumAddColor(builder: flatbuffers.Builder, color: typing.Literal[Color.Red, Color.Green, Color.Blue]) -> None: ...\ndef TestSimpleTableWithEnumEnd(builder: flatbuffers.Builder) -> uoffset: ...\ndef End(builder: flatbuffers.Builder) -> uoffset: ...\n\n"
  },
  {
    "path": "tests/MyGame/Example/NestedUnion/Vec3.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: NestedUnion\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nfrom typing import Any\nfrom MyGame.Example.NestedUnion.Test import Test\nfrom typing import Optional\nnp = import_numpy()\n\nclass Vec3(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset: int = 0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = Vec3()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsVec3(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    # Vec3\n    def Init(self, buf: bytes, pos: int):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # Vec3\n    def X(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float64Flags, o + self._tab.Pos)\n        return 0.0\n\n    # Vec3\n    def Y(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float64Flags, o + self._tab.Pos)\n        return 0.0\n\n    # Vec3\n    def Z(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float64Flags, o + self._tab.Pos)\n        return 0.0\n\n    # Vec3\n    def Test1(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float64Flags, o + self._tab.Pos)\n        return 0.0\n\n    # Vec3\n    def Test2(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos)\n        return 0\n\n    # Vec3\n    def Test3(self) -> Optional[Test]:\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))\n        if o != 0:\n            x = o + self._tab.Pos\n            obj = Test()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\ndef Vec3Start(builder: flatbuffers.Builder):\n    builder.StartObject(6)\n\ndef Start(builder: flatbuffers.Builder):\n    Vec3Start(builder)\n\ndef Vec3AddX(builder: flatbuffers.Builder, x: float):\n    builder.PrependFloat64Slot(0, x, 0.0)\n\ndef AddX(builder: flatbuffers.Builder, x: float):\n    Vec3AddX(builder, x)\n\ndef Vec3AddY(builder: flatbuffers.Builder, y: float):\n    builder.PrependFloat64Slot(1, y, 0.0)\n\ndef AddY(builder: flatbuffers.Builder, y: float):\n    Vec3AddY(builder, y)\n\ndef Vec3AddZ(builder: flatbuffers.Builder, z: float):\n    builder.PrependFloat64Slot(2, z, 0.0)\n\ndef AddZ(builder: flatbuffers.Builder, z: float):\n    Vec3AddZ(builder, z)\n\ndef Vec3AddTest1(builder: flatbuffers.Builder, test1: float):\n    builder.PrependFloat64Slot(3, test1, 0.0)\n\ndef AddTest1(builder: flatbuffers.Builder, test1: float):\n    Vec3AddTest1(builder, test1)\n\ndef Vec3AddTest2(builder: flatbuffers.Builder, test2: int):\n    builder.PrependUint8Slot(4, test2, 0)\n\ndef AddTest2(builder: flatbuffers.Builder, test2: int):\n    Vec3AddTest2(builder, test2)\n\ndef Vec3AddTest3(builder: flatbuffers.Builder, test3: Any):\n    builder.PrependStructSlot(5, flatbuffers.number_types.UOffsetTFlags.py_type(test3), 0)\n\ndef AddTest3(builder: flatbuffers.Builder, test3: Any):\n    Vec3AddTest3(builder, test3)\n\ndef Vec3End(builder: flatbuffers.Builder) -> int:\n    return builder.EndObject()\n\ndef End(builder: flatbuffers.Builder) -> int:\n    return Vec3End(builder)\n\nimport MyGame.Example.NestedUnion.Test\ntry:\n    from typing import Optional\nexcept:\n    pass\n\nclass Vec3T(object):\n\n    # Vec3T\n    def __init__(\n        self,\n        x = 0.0,\n        y = 0.0,\n        z = 0.0,\n        test1 = 0.0,\n        test2 = 0,\n        test3 = None,\n    ):\n        self.x = x  # type: float\n        self.y = y  # type: float\n        self.z = z  # type: float\n        self.test1 = test1  # type: float\n        self.test2 = test2  # type: int\n        self.test3 = test3  # type: Optional[MyGame.Example.NestedUnion.Test.TestT]\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        vec3 = Vec3()\n        vec3.Init(buf, pos)\n        return cls.InitFromObj(vec3)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, vec3):\n        x = Vec3T()\n        x._UnPack(vec3)\n        return x\n\n    # Vec3T\n    def _UnPack(self, vec3):\n        if vec3 is None:\n            return\n        self.x = vec3.X()\n        self.y = vec3.Y()\n        self.z = vec3.Z()\n        self.test1 = vec3.Test1()\n        self.test2 = vec3.Test2()\n        if vec3.Test3() is not None:\n            self.test3 = MyGame.Example.NestedUnion.Test.TestT.InitFromObj(vec3.Test3())\n\n    # Vec3T\n    def Pack(self, builder):\n        Vec3Start(builder)\n        Vec3AddX(builder, self.x)\n        Vec3AddY(builder, self.y)\n        Vec3AddZ(builder, self.z)\n        Vec3AddTest1(builder, self.test1)\n        Vec3AddTest2(builder, self.test2)\n        if self.test3 is not None:\n            test3 = self.test3.Pack(builder)\n            Vec3AddTest3(builder, test3)\n        vec3 = Vec3End(builder)\n        return vec3\n"
  },
  {
    "path": "tests/MyGame/Example/NestedUnion/Vec3.pyi",
    "content": "from __future__ import annotations\n\nimport flatbuffers\nimport numpy as np\n\nimport typing\nfrom MyGame.Example.NestedUnion.Color import Color\nfrom MyGame.Example.NestedUnion.Test import Test, TestT\n\nuoffset: typing.TypeAlias = flatbuffers.number_types.UOffsetTFlags.py_type\n\nclass Vec3(object):\n  @classmethod\n  def GetRootAs(cls, buf: bytes, offset: int) -> Vec3: ...\n  @classmethod\n  def GetRootAsVec3(cls, buf: bytes, offset: int) -> Vec3: ...\n  def Init(self, buf: bytes, pos: int) -> None: ...\n  def X(self) -> float: ...\n  def Y(self) -> float: ...\n  def Z(self) -> float: ...\n  def Test1(self) -> float: ...\n  def Test2(self) -> typing.Literal[Color.Red, Color.Green, Color.Blue]: ...\n  def Test3(self) -> Test | None: ...\nclass Vec3T(object):\n  x: float\n  y: float\n  z: float\n  test1: float\n  test2: typing.Literal[Color.Red, Color.Green, Color.Blue]\n  test3: TestT | None\n  def __init__(\n    self,\n    x: float = ...,\n    y: float = ...,\n    z: float = ...,\n    test1: float = ...,\n    test2: typing.Literal[Color.Red, Color.Green, Color.Blue] = ...,\n    test3: 'TestT' | None = ...,\n  ) -> None: ...\n  @classmethod\n  def InitFromBuf(cls, buf: bytes, pos: int) -> Vec3T: ...\n  @classmethod\n  def InitFromPackedBuf(cls, buf: bytes, pos: int = 0) -> Vec3T: ...\n  @classmethod\n  def InitFromObj(cls, vec3: Vec3) -> Vec3T: ...\n  def _UnPack(self, vec3: Vec3) -> None: ...\n  def Pack(self, builder: flatbuffers.Builder) -> None: ...\ndef Vec3Start(builder: flatbuffers.Builder) -> None: ...\ndef Start(builder: flatbuffers.Builder) -> None: ...\ndef Vec3AddX(builder: flatbuffers.Builder, x: float) -> None: ...\ndef Vec3AddY(builder: flatbuffers.Builder, y: float) -> None: ...\ndef Vec3AddZ(builder: flatbuffers.Builder, z: float) -> None: ...\ndef Vec3AddTest1(builder: flatbuffers.Builder, test1: float) -> None: ...\ndef Vec3AddTest2(builder: flatbuffers.Builder, test2: typing.Literal[Color.Red, Color.Green, Color.Blue]) -> None: ...\ndef Vec3AddTest3(builder: flatbuffers.Builder, test3: uoffset) -> None: ...\ndef Vec3End(builder: flatbuffers.Builder) -> uoffset: ...\ndef End(builder: flatbuffers.Builder) -> uoffset: ...\n\n"
  },
  {
    "path": "tests/MyGame/Example/NestedUnion/__init__.py",
    "content": ""
  },
  {
    "path": "tests/MyGame/Example/Race.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace MyGame.Example\n{\n\n[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]\npublic enum Race : sbyte\n{\n  None = -1,\n  Human = 0,\n  Dwarf = 1,\n  Elf = 2,\n};\n\n\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Race.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage Example\n\nimport \"strconv\"\n\ntype Race int8\n\nconst (\n\tRaceNone  Race = -1\n\tRaceHuman Race = 0\n\tRaceDwarf Race = 1\n\tRaceElf   Race = 2\n)\n\nvar EnumNamesRace = map[Race]string{\n\tRaceNone:  \"None\",\n\tRaceHuman: \"Human\",\n\tRaceDwarf: \"Dwarf\",\n\tRaceElf:   \"Elf\",\n}\n\nvar EnumValuesRace = map[string]Race{\n\t\"None\":  RaceNone,\n\t\"Human\": RaceHuman,\n\t\"Dwarf\": RaceDwarf,\n\t\"Elf\":   RaceElf,\n}\n\nfunc (v Race) String() string {\n\tif s, ok := EnumNamesRace[v]; ok {\n\t\treturn s\n\t}\n\treturn \"Race(\" + strconv.FormatInt(int64(v), 10) + \")\"\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Race.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\n@SuppressWarnings(\"unused\")\npublic final class Race {\n  private Race() { }\n  public static final byte None = -1;\n  public static final byte Human = 0;\n  public static final byte Dwarf = 1;\n  public static final byte Elf = 2;\n\n  public static final String[] names = { \"None\", \"Human\", \"Dwarf\", \"Elf\", };\n\n  public static String name(int e) { return names[e - None]; }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/Race.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example\n\n@Suppress(\"unused\")\nclass Race private constructor() {\n    companion object {\n        const val None: Byte = -1\n        const val Human: Byte = 0\n        const val Dwarf: Byte = 1\n        const val Elf: Byte = 2\n        val names : Array<String> = arrayOf(\"None\", \"Human\", \"Dwarf\", \"Elf\")\n        fun name(e: Int) : String = names[e - None.toInt()]\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Race.lua",
    "content": "--[[ MyGame.Example.Race\n\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : //monster_test.fbs\n  Rooting type : MyGame.Example.Monster (//monster_test.fbs)\n\n--]]\n\nlocal Race = {\n  None = -1,\n  Human = 0,\n  Dwarf = 1,\n  Elf = 2,\n}\n\nreturn Race"
  },
  {
    "path": "tests/MyGame/Example/Race.nim",
    "content": "#[ MyGame.Example.Race\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : \n  Rooting type : MyGame.Example.Monster ()\n]#\n\ntype Race*{.pure.} = enum\n  None = -1.int8,\n  Human = 0.int8,\n  Dwarf = 1.int8,\n  Elf = 2.int8,\n"
  },
  {
    "path": "tests/MyGame/Example/Race.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nnamespace MyGame\\Example;\n\nclass Race\n{\n    const None = -1;\n    const Human = 0;\n    const Dwarf = 1;\n    const Elf = 2;\n\n    private static $names = array(\n        Race::None=>\"None\",\n        Race::Human=>\"Human\",\n        Race::Dwarf=>\"Dwarf\",\n        Race::Elf=>\"Elf\",\n    );\n\n    public static function Name($e)\n    {\n        if (!isset(self::$names[$e])) {\n            throw new \\Exception();\n        }\n        return self::$names[$e];\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Race.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: Example\n\nclass Race(object):\n    None_ = -1\n    Human = 0\n    Dwarf = 1\n    Elf = 2\n"
  },
  {
    "path": "tests/MyGame/Example/Referrable.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace MyGame.Example\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct Referrable : IFlatbufferObject\n{\n  private Table __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_25_12_19(); }\n  public static Referrable GetRootAsReferrable(ByteBuffer _bb) { return GetRootAsReferrable(_bb, new Referrable()); }\n  public static Referrable GetRootAsReferrable(ByteBuffer _bb, Referrable obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }\n  public Referrable __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public ulong Id { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetUlong(o + __p.bb_pos) : (ulong)0; } }\n  public bool MutateId(ulong id) { int o = __p.__offset(4); if (o != 0) { __p.bb.PutUlong(o + __p.bb_pos, id); return true; } else { return false; } }\n\n  public static Offset<MyGame.Example.Referrable> CreateReferrable(FlatBufferBuilder builder,\n      ulong id = 0) {\n    builder.StartTable(1);\n    Referrable.AddId(builder, id);\n    return Referrable.EndReferrable(builder);\n  }\n\n  public static void StartReferrable(FlatBufferBuilder builder) { builder.StartTable(1); }\n  public static void AddId(FlatBufferBuilder builder, ulong id) { builder.AddUlong(0, id, 0); }\n  public static Offset<MyGame.Example.Referrable> EndReferrable(FlatBufferBuilder builder) {\n    int o = builder.EndTable();\n    return new Offset<MyGame.Example.Referrable>(o);\n  }\n\n  public static VectorOffset CreateSortedVectorOfReferrable(FlatBufferBuilder builder, Offset<Referrable>[] offsets) {\n    Array.Sort(offsets,\n      (Offset<Referrable> o1, Offset<Referrable> o2) =>\n        new Referrable().__assign(builder.DataBuffer.Length - o1.Value, builder.DataBuffer).Id.CompareTo(new Referrable().__assign(builder.DataBuffer.Length - o2.Value, builder.DataBuffer).Id));\n    return builder.CreateVectorOfTables(offsets);\n  }\n\n  public static Referrable? __lookup_by_key(int vectorLocation, ulong key, ByteBuffer bb) {\n    Referrable obj_ = new Referrable();\n    int span = bb.GetInt(vectorLocation - 4);\n    int start = 0;\n    while (span != 0) {\n      int middle = span / 2;\n      int tableOffset = Table.__indirect(vectorLocation + 4 * (start + middle), bb);\n      obj_.__assign(tableOffset, bb);\n      int comp = obj_.Id.CompareTo(key);\n      if (comp > 0) {\n        span = middle;\n      } else if (comp < 0) {\n        middle++;\n        start += middle;\n        span -= middle;\n      } else {\n        return obj_;\n      }\n    }\n    return null;\n  }\n  public ReferrableT UnPack() {\n    var _o = new ReferrableT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(ReferrableT _o) {\n    _o.Id = this.Id;\n  }\n  public static Offset<MyGame.Example.Referrable> Pack(FlatBufferBuilder builder, ReferrableT _o) {\n    if (_o == null) return default(Offset<MyGame.Example.Referrable>);\n    return CreateReferrable(\n      builder,\n      _o.Id);\n  }\n}\n\npublic class ReferrableT\n{\n  [Newtonsoft.Json.JsonProperty(\"id\")]\n  [Newtonsoft.Json.JsonIgnore()]\n  public ulong Id { get; set; }\n\n  public ReferrableT() {\n    this.Id = 0;\n  }\n}\n\n\nstatic public class ReferrableVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos)\n  {\n    return verifier.VerifyTableStart(tablePos)\n      && verifier.VerifyField(tablePos, 4 /*Id*/, 8 /*ulong*/, 8, false)\n      && verifier.VerifyTableEnd(tablePos);\n  }\n}\n\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Referrable.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage Example\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n)\n\ntype ReferrableT struct {\n\tId uint64 `json:\"id\"`\n}\n\nfunc (t *ReferrableT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\tif t == nil {\n\t\treturn 0\n\t}\n\tReferrableStart(builder)\n\tReferrableAddId(builder, t.Id)\n\treturn ReferrableEnd(builder)\n}\n\nfunc (rcv *Referrable) UnPackTo(t *ReferrableT) {\n\tt.Id = rcv.Id()\n}\n\nfunc (rcv *Referrable) UnPack() *ReferrableT {\n\tif rcv == nil {\n\t\treturn nil\n\t}\n\tt := &ReferrableT{}\n\trcv.UnPackTo(t)\n\treturn t\n}\n\ntype Referrable struct {\n\t_tab flatbuffers.Table\n}\n\nfunc GetRootAsReferrable(buf []byte, offset flatbuffers.UOffsetT) *Referrable {\n\tn := flatbuffers.GetUOffsetT(buf[offset:])\n\tx := &Referrable{}\n\tx.Init(buf, n+offset)\n\treturn x\n}\n\nfunc FinishReferrableBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {\n\tbuilder.Finish(offset)\n}\n\nfunc GetSizePrefixedRootAsReferrable(buf []byte, offset flatbuffers.UOffsetT) *Referrable {\n\tn := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])\n\tx := &Referrable{}\n\tx.Init(buf, n+offset+flatbuffers.SizeUint32)\n\treturn x\n}\n\nfunc FinishSizePrefixedReferrableBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {\n\tbuilder.FinishSizePrefixed(offset)\n}\n\nfunc (rcv *Referrable) Init(buf []byte, i flatbuffers.UOffsetT) {\n\trcv._tab.Bytes = buf\n\trcv._tab.Pos = i\n}\n\nfunc (rcv *Referrable) Table() flatbuffers.Table {\n\treturn rcv._tab\n}\n\nfunc (rcv *Referrable) Id() uint64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(4))\n\tif o != 0 {\n\t\treturn rcv._tab.GetUint64(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Referrable) MutateId(n uint64) bool {\n\treturn rcv._tab.MutateUint64Slot(4, n)\n}\n\nfunc ReferrableKeyCompare(o1, o2 flatbuffers.UOffsetT, buf []byte) bool {\n\tobj1 := &Referrable{}\n\tobj2 := &Referrable{}\n\tobj1.Init(buf, flatbuffers.UOffsetT(len(buf))-o1)\n\tobj2.Init(buf, flatbuffers.UOffsetT(len(buf))-o2)\n\treturn obj1.Id() < obj2.Id()\n}\n\nfunc (rcv *Referrable) LookupByKey(key uint64, vectorLocation flatbuffers.UOffsetT, buf []byte) bool {\n\tspan := flatbuffers.GetUOffsetT(buf[vectorLocation-4:])\n\tstart := flatbuffers.UOffsetT(0)\n\tfor span != 0 {\n\t\tmiddle := span / 2\n\t\ttableOffset := flatbuffers.GetIndirectOffset(buf, vectorLocation+4*(start+middle))\n\t\tobj := &Referrable{}\n\t\tobj.Init(buf, tableOffset)\n\t\tval := obj.Id()\n\t\tcomp := 0\n\t\tif val > key {\n\t\t\tcomp = 1\n\t\t} else if val < key {\n\t\t\tcomp = -1\n\t\t}\n\t\tif comp > 0 {\n\t\t\tspan = middle\n\t\t} else if comp < 0 {\n\t\t\tmiddle += 1\n\t\t\tstart += middle\n\t\t\tspan -= middle\n\t\t} else {\n\t\t\trcv.Init(buf, tableOffset)\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc ReferrableStart(builder *flatbuffers.Builder) {\n\tbuilder.StartObject(1)\n}\nfunc ReferrableAddId(builder *flatbuffers.Builder, id uint64) {\n\tbuilder.PrependUint64Slot(0, id, 0)\n}\nfunc ReferrableEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\treturn builder.EndObject()\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Referrable.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class Referrable extends com.google.flatbuffers.Table {\n  public static void ValidateVersion() { Constants.FLATBUFFERS_25_12_19(); }\n  public static Referrable getRootAsReferrable(ByteBuffer _bb) { return getRootAsReferrable(_bb, new Referrable()); }\n  public static Referrable getRootAsReferrable(ByteBuffer _bb, Referrable obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public Referrable __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public long id() { int o = __offset(4); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }\n  public boolean mutateId(long id) { int o = __offset(4); if (o != 0) { bb.putLong(o + bb_pos, id); return true; } else { return false; } }\n\n  public static int createReferrable(FlatBufferBuilder builder,\n      long id) {\n    builder.startTable(1);\n    Referrable.addId(builder, id);\n    return Referrable.endReferrable(builder);\n  }\n\n  public static void startReferrable(FlatBufferBuilder builder) { builder.startTable(1); }\n  public static void addId(FlatBufferBuilder builder, long id) { builder.addLong(id); builder.slot(0); }\n  public static int endReferrable(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    return o;\n  }\n\n  @Override\n  protected int keysCompare(Integer o1, Integer o2, ByteBuffer _bb) {\n    long val_1 = _bb.getLong(__offset(4, o1, _bb));\n    long val_2 = _bb.getLong(__offset(4, o2, _bb));\n    return val_1 > val_2 ? 1 : val_1 < val_2 ? -1 : 0;\n  }\n\n  public static Referrable __lookup_by_key(Referrable obj, int vectorLocation, long key, ByteBuffer bb) {\n    int span = bb.getInt(vectorLocation - 4);\n    int start = 0;\n    while (span != 0) {\n      int middle = span / 2;\n      int tableOffset = __indirect(vectorLocation + 4 * (start + middle), bb);\n      long val = bb.getLong(__offset(4, bb.capacity() - tableOffset, bb));\n      int comp = val > key ? 1 : val < key ? -1 : 0;\n      if (comp > 0) {\n        span = middle;\n      } else if (comp < 0) {\n        middle++;\n        start += middle;\n        span -= middle;\n      } else {\n        return (obj == null ? new Referrable() : obj).__assign(tableOffset, bb);\n      }\n    }\n    return null;\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public Referrable get(int j) { return get(new Referrable(), j); }\n    public Referrable get(Referrable obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); }\n    public Referrable getByKey(long key) {  return __lookup_by_key(null, __vector(), key, bb); }\n    public Referrable getByKey(Referrable obj, long key) {  return __lookup_by_key(obj, __vector(), key, bb); }\n  }\n  public ReferrableT unpack() {\n    ReferrableT _o = new ReferrableT();\n    unpackTo(_o);\n    return _o;\n  }\n  public void unpackTo(ReferrableT _o) {\n    long _oId = id();\n    _o.setId(_oId);\n  }\n  public static int pack(FlatBufferBuilder builder, ReferrableT _o) {\n    if (_o == null) return 0;\n    return createReferrable(\n      builder,\n      _o.getId());\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/Referrable.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example\n\nimport com.google.flatbuffers.BaseVector\nimport com.google.flatbuffers.BooleanVector\nimport com.google.flatbuffers.ByteVector\nimport com.google.flatbuffers.Constants\nimport com.google.flatbuffers.DoubleVector\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.FloatVector\nimport com.google.flatbuffers.LongVector\nimport com.google.flatbuffers.StringVector\nimport com.google.flatbuffers.Struct\nimport com.google.flatbuffers.Table\nimport com.google.flatbuffers.UnionVector\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport kotlin.math.sign\n\n@Suppress(\"unused\")\nclass Referrable : Table() {\n\n    fun __init(_i: Int, _bb: ByteBuffer)  {\n        __reset(_i, _bb)\n    }\n    fun __assign(_i: Int, _bb: ByteBuffer) : Referrable {\n        __init(_i, _bb)\n        return this\n    }\n    val id : ULong\n        get() {\n            val o = __offset(4)\n            return if(o != 0) bb.getLong(o + bb_pos).toULong() else 0UL\n        }\n    fun mutateId(id: ULong) : Boolean {\n        val o = __offset(4)\n        return if (o != 0) {\n            bb.putLong(o + bb_pos, id.toLong())\n            true\n        } else {\n            false\n        }\n    }\n    override fun keysCompare(o1: Int, o2: Int, _bb: ByteBuffer) : Int {\n        val val_1 = _bb.getLong(__offset(4, o1, _bb))\n        val val_2 = _bb.getLong(__offset(4, o2, _bb))\n        return (val_1 - val_2).sign\n    }\n    companion object {\n        fun validateVersion() = Constants.FLATBUFFERS_25_12_19()\n        fun getRootAsReferrable(_bb: ByteBuffer): Referrable = getRootAsReferrable(_bb, Referrable())\n        fun getRootAsReferrable(_bb: ByteBuffer, obj: Referrable): Referrable {\n            _bb.order(ByteOrder.LITTLE_ENDIAN)\n            return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb))\n        }\n        fun createReferrable(builder: FlatBufferBuilder, id: ULong) : Int {\n            builder.startTable(1)\n            addId(builder, id)\n            return endReferrable(builder)\n        }\n        fun startReferrable(builder: FlatBufferBuilder) = builder.startTable(1)\n        fun addId(builder: FlatBufferBuilder, id: ULong)  {\n            builder.addLong(id.toLong())\n            builder.slot(0)\n        }\n        fun endReferrable(builder: FlatBufferBuilder) : Int {\n            val o = builder.endTable()\n            return o\n        }\n        fun __lookup_by_key(obj: Referrable?, vectorLocation: Int, key: ULong, bb: ByteBuffer) : Referrable? {\n            var span = bb.getInt(vectorLocation - 4)\n            var start = 0\n            while (span != 0) {\n                var middle = span / 2\n                val tableOffset = __indirect(vectorLocation + 4 * (start + middle), bb)\n                val value = bb.getLong(__offset(4, bb.capacity() - tableOffset, bb)).toULong()\n                val comp = value.compareTo(key)\n                when {\n                    comp > 0 -> span = middle\n                    comp < 0 -> {\n                        middle++\n                        start += middle\n                        span -= middle\n                    }\n                    else -> {\n                        return (obj ?: Referrable()).__assign(tableOffset, bb)\n                    }\n                }\n            }\n            return null\n        }\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Referrable.lua",
    "content": "--[[ MyGame.Example.Referrable\n\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : //monster_test.fbs\n  Rooting type : MyGame.Example.Monster (//monster_test.fbs)\n\n--]]\n\nlocal flatbuffers = require('flatbuffers')\n\nlocal Referrable = {}\nlocal mt = {}\n\nfunction Referrable.New()\n  local o = {}\n  setmetatable(o, {__index = mt})\n  return o\nend\n\nfunction mt:Init(buf, pos)\n  self.view = flatbuffers.view.New(buf, pos)\nend\n\nfunction mt:Id()\n  local o = self.view:Offset(4)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Uint64, self.view.pos + o)\n  end\n  return 0\nend\n\nfunction Referrable.Start(builder)\n  builder:StartObject(1)\nend\n\nfunction Referrable.AddId(builder, id)\n  builder:PrependUint64Slot(0, id, 0)\nend\n\nfunction Referrable.End(builder)\n  return builder:EndObject()\nend\n\nreturn Referrable"
  },
  {
    "path": "tests/MyGame/Example/Referrable.nim",
    "content": "#[ MyGame.Example.Referrable\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : \n  Rooting type : MyGame.Example.Monster ()\n]#\n\nimport flatbuffers\n\ntype Referrable* = object of FlatObj\nfunc id*(self: Referrable): uint64 =\n  let o = self.tab.Offset(4)\n  if o != 0:\n    return Get[uint64](self.tab, self.tab.Pos + o)\n  return 0\nfunc `id=`*(self: var Referrable, n: uint64): bool =\n  return self.tab.MutateSlot(4, n)\nproc ReferrableStart*(builder: var Builder) =\n  builder.StartObject(1)\nproc ReferrableAddid*(builder: var Builder, id: uint64) =\n  builder.PrependSlot(0, id, default(uint64))\nproc ReferrableEnd*(builder: var Builder): uoffset =\n  return builder.EndObject()\n"
  },
  {
    "path": "tests/MyGame/Example/Referrable.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nnamespace MyGame\\Example;\n\nuse \\Google\\FlatBuffers\\Struct;\nuse \\Google\\FlatBuffers\\Table;\nuse \\Google\\FlatBuffers\\ByteBuffer;\nuse \\Google\\FlatBuffers\\FlatBufferBuilder;\n\nclass Referrable extends Table\n{\n    /**\n     * @param ByteBuffer $bb\n     * @return Referrable\n     */\n    public static function getRootAsReferrable(ByteBuffer $bb)\n    {\n        $obj = new Referrable();\n        return ($obj->init($bb->getInt($bb->getPosition()) + $bb->getPosition(), $bb));\n    }\n\n    public static function ReferrableIdentifier()\n    {\n        return \"MONS\";\n    }\n\n    public static function ReferrableBufferHasIdentifier(ByteBuffer $buf)\n    {\n        return self::__has_identifier($buf, self::ReferrableIdentifier());\n    }\n\n    public static function ReferrableExtension()\n    {\n        return \"mon\";\n    }\n\n    /**\n     * @param int $_i offset\n     * @param ByteBuffer $_bb\n     * @return Referrable\n     **/\n    public function init($_i, ByteBuffer $_bb)\n    {\n        $this->bb_pos = $_i;\n        $this->bb = $_bb;\n        return $this;\n    }\n\n    /**\n     * @return ulong\n     */\n    public function getId()\n    {\n        $o = $this->__offset(4);\n        return $o != 0 ? $this->bb->getUlong($o + $this->bb_pos) : 0;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return void\n     */\n    public static function startReferrable(FlatBufferBuilder $builder)\n    {\n        $builder->StartObject(1);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return Referrable\n     */\n    public static function createReferrable(FlatBufferBuilder $builder, $id)\n    {\n        $builder->startObject(1);\n        self::addId($builder, $id);\n        $o = $builder->endObject();\n        return $o;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param ulong\n     * @return void\n     */\n    public static function addId(FlatBufferBuilder $builder, $id)\n    {\n        $builder->addUlongX(0, $id, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return int table offset\n     */\n    public static function endReferrable(FlatBufferBuilder $builder)\n    {\n        $o = $builder->endObject();\n        return $o;\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Referrable.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: Example\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\nclass Referrable(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = Referrable()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsReferrable(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    @classmethod\n    def ReferrableBufferHasIdentifier(cls, buf, offset, size_prefixed=False):\n        return flatbuffers.util.BufferHasIdentifier(buf, offset, b\"\\x4D\\x4F\\x4E\\x53\", size_prefixed=size_prefixed)\n\n    # Referrable\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # Referrable\n    def Id(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos)\n        return 0\n\ndef ReferrableStart(builder):\n    builder.StartObject(1)\n\ndef Start(builder):\n    ReferrableStart(builder)\n\ndef ReferrableAddId(builder, id):\n    builder.PrependUint64Slot(0, id, 0)\n\ndef AddId(builder, id):\n    ReferrableAddId(builder, id)\n\ndef ReferrableEnd(builder):\n    return builder.EndObject()\n\ndef End(builder):\n    return ReferrableEnd(builder)\n\n\nclass ReferrableT(object):\n\n    # ReferrableT\n    def __init__(\n        self,\n        id = 0,\n    ):\n        self.id = id  # type: int\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        referrable = Referrable()\n        referrable.Init(buf, pos)\n        return cls.InitFromObj(referrable)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, referrable):\n        x = ReferrableT()\n        x._UnPack(referrable)\n        return x\n\n    # ReferrableT\n    def _UnPack(self, referrable):\n        if referrable is None:\n            return\n        self.id = referrable.Id()\n\n    # ReferrableT\n    def Pack(self, builder):\n        ReferrableStart(builder)\n        ReferrableAddId(builder, self.id)\n        referrable = ReferrableEnd(builder)\n        return referrable\n"
  },
  {
    "path": "tests/MyGame/Example/ReferrableT.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\npublic class ReferrableT {\n  private long id;\n\n  public long getId() { return id; }\n\n  public void setId(long id) { this.id = id; }\n\n\n  public ReferrableT() {\n    this.id = 0L;\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/Stat.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace MyGame.Example\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct Stat : IFlatbufferObject\n{\n  private Table __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_25_12_19(); }\n  public static Stat GetRootAsStat(ByteBuffer _bb) { return GetRootAsStat(_bb, new Stat()); }\n  public static Stat GetRootAsStat(ByteBuffer _bb, Stat obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }\n  public Stat __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public string Id { get { int o = __p.__offset(4); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } }\n#if ENABLE_SPAN_T\n  public Span<byte> GetIdBytes() { return __p.__vector_as_span<byte>(4, 1); }\n#else\n  public ArraySegment<byte>? GetIdBytes() { return __p.__vector_as_arraysegment(4); }\n#endif\n  public byte[] GetIdArray() { return __p.__vector_as_array<byte>(4); }\n  public long Val { get { int o = __p.__offset(6); return o != 0 ? __p.bb.GetLong(o + __p.bb_pos) : (long)0; } }\n  public bool MutateVal(long val) { int o = __p.__offset(6); if (o != 0) { __p.bb.PutLong(o + __p.bb_pos, val); return true; } else { return false; } }\n  public ushort Count { get { int o = __p.__offset(8); return o != 0 ? __p.bb.GetUshort(o + __p.bb_pos) : (ushort)0; } }\n  public bool MutateCount(ushort count) { int o = __p.__offset(8); if (o != 0) { __p.bb.PutUshort(o + __p.bb_pos, count); return true; } else { return false; } }\n\n  public static Offset<MyGame.Example.Stat> CreateStat(FlatBufferBuilder builder,\n      StringOffset idOffset = default(StringOffset),\n      long val = 0,\n      ushort count = 0) {\n    builder.StartTable(3);\n    Stat.AddVal(builder, val);\n    Stat.AddId(builder, idOffset);\n    Stat.AddCount(builder, count);\n    return Stat.EndStat(builder);\n  }\n\n  public static void StartStat(FlatBufferBuilder builder) { builder.StartTable(3); }\n  public static void AddId(FlatBufferBuilder builder, StringOffset idOffset) { builder.AddOffset(0, idOffset.Value, 0); }\n  public static void AddVal(FlatBufferBuilder builder, long val) { builder.AddLong(1, val, 0); }\n  public static void AddCount(FlatBufferBuilder builder, ushort count) { builder.AddUshort(2, count, 0); }\n  public static Offset<MyGame.Example.Stat> EndStat(FlatBufferBuilder builder) {\n    int o = builder.EndTable();\n    return new Offset<MyGame.Example.Stat>(o);\n  }\n\n  public static VectorOffset CreateSortedVectorOfStat(FlatBufferBuilder builder, Offset<Stat>[] offsets) {\n    Array.Sort(offsets,\n      (Offset<Stat> o1, Offset<Stat> o2) =>\n        new Stat().__assign(builder.DataBuffer.Length - o1.Value, builder.DataBuffer).Count.CompareTo(new Stat().__assign(builder.DataBuffer.Length - o2.Value, builder.DataBuffer).Count));\n    return builder.CreateVectorOfTables(offsets);\n  }\n\n  public static Stat? __lookup_by_key(int vectorLocation, ushort key, ByteBuffer bb) {\n    Stat obj_ = new Stat();\n    int span = bb.GetInt(vectorLocation - 4);\n    int start = 0;\n    while (span != 0) {\n      int middle = span / 2;\n      int tableOffset = Table.__indirect(vectorLocation + 4 * (start + middle), bb);\n      obj_.__assign(tableOffset, bb);\n      int comp = obj_.Count.CompareTo(key);\n      if (comp > 0) {\n        span = middle;\n      } else if (comp < 0) {\n        middle++;\n        start += middle;\n        span -= middle;\n      } else {\n        return obj_;\n      }\n    }\n    return null;\n  }\n  public StatT UnPack() {\n    var _o = new StatT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(StatT _o) {\n    _o.Id = this.Id;\n    _o.Val = this.Val;\n    _o.Count = this.Count;\n  }\n  public static Offset<MyGame.Example.Stat> Pack(FlatBufferBuilder builder, StatT _o) {\n    if (_o == null) return default(Offset<MyGame.Example.Stat>);\n    var _id = _o.Id == null ? default(StringOffset) : builder.CreateString(_o.Id);\n    return CreateStat(\n      builder,\n      _id,\n      _o.Val,\n      _o.Count);\n  }\n}\n\npublic class StatT\n{\n  [Newtonsoft.Json.JsonProperty(\"id\")]\n  public string Id { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"val\")]\n  public long Val { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"count\")]\n  public ushort Count { get; set; }\n\n  public StatT() {\n    this.Id = null;\n    this.Val = 0;\n    this.Count = 0;\n  }\n}\n\n\nstatic public class StatVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos)\n  {\n    return verifier.VerifyTableStart(tablePos)\n      && verifier.VerifyString(tablePos, 4 /*Id*/, false)\n      && verifier.VerifyField(tablePos, 6 /*Val*/, 8 /*long*/, 8, false)\n      && verifier.VerifyField(tablePos, 8 /*Count*/, 2 /*ushort*/, 2, false)\n      && verifier.VerifyTableEnd(tablePos);\n  }\n}\n\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Stat.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage Example\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n)\n\ntype StatT struct {\n\tId string `json:\"id\"`\n\tVal int64 `json:\"val\"`\n\tCount uint16 `json:\"count\"`\n}\n\nfunc (t *StatT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\tif t == nil {\n\t\treturn 0\n\t}\n\tidOffset := flatbuffers.UOffsetT(0)\n\tif t.Id != \"\" {\n\t\tidOffset = builder.CreateString(t.Id)\n\t}\n\tStatStart(builder)\n\tStatAddId(builder, idOffset)\n\tStatAddVal(builder, t.Val)\n\tStatAddCount(builder, t.Count)\n\treturn StatEnd(builder)\n}\n\nfunc (rcv *Stat) UnPackTo(t *StatT) {\n\tt.Id = string(rcv.Id())\n\tt.Val = rcv.Val()\n\tt.Count = rcv.Count()\n}\n\nfunc (rcv *Stat) UnPack() *StatT {\n\tif rcv == nil {\n\t\treturn nil\n\t}\n\tt := &StatT{}\n\trcv.UnPackTo(t)\n\treturn t\n}\n\ntype Stat struct {\n\t_tab flatbuffers.Table\n}\n\nfunc GetRootAsStat(buf []byte, offset flatbuffers.UOffsetT) *Stat {\n\tn := flatbuffers.GetUOffsetT(buf[offset:])\n\tx := &Stat{}\n\tx.Init(buf, n+offset)\n\treturn x\n}\n\nfunc FinishStatBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {\n\tbuilder.Finish(offset)\n}\n\nfunc GetSizePrefixedRootAsStat(buf []byte, offset flatbuffers.UOffsetT) *Stat {\n\tn := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])\n\tx := &Stat{}\n\tx.Init(buf, n+offset+flatbuffers.SizeUint32)\n\treturn x\n}\n\nfunc FinishSizePrefixedStatBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {\n\tbuilder.FinishSizePrefixed(offset)\n}\n\nfunc (rcv *Stat) Init(buf []byte, i flatbuffers.UOffsetT) {\n\trcv._tab.Bytes = buf\n\trcv._tab.Pos = i\n}\n\nfunc (rcv *Stat) Table() flatbuffers.Table {\n\treturn rcv._tab\n}\n\nfunc (rcv *Stat) Id() []byte {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(4))\n\tif o != 0 {\n\t\treturn rcv._tab.ByteVector(o + rcv._tab.Pos)\n\t}\n\treturn nil\n}\n\nfunc (rcv *Stat) Val() int64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(6))\n\tif o != 0 {\n\t\treturn rcv._tab.GetInt64(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Stat) MutateVal(n int64) bool {\n\treturn rcv._tab.MutateInt64Slot(6, n)\n}\n\nfunc (rcv *Stat) Count() uint16 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(8))\n\tif o != 0 {\n\t\treturn rcv._tab.GetUint16(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Stat) MutateCount(n uint16) bool {\n\treturn rcv._tab.MutateUint16Slot(8, n)\n}\n\nfunc StatKeyCompare(o1, o2 flatbuffers.UOffsetT, buf []byte) bool {\n\tobj1 := &Stat{}\n\tobj2 := &Stat{}\n\tobj1.Init(buf, flatbuffers.UOffsetT(len(buf))-o1)\n\tobj2.Init(buf, flatbuffers.UOffsetT(len(buf))-o2)\n\treturn obj1.Count() < obj2.Count()\n}\n\nfunc (rcv *Stat) LookupByKey(key uint16, vectorLocation flatbuffers.UOffsetT, buf []byte) bool {\n\tspan := flatbuffers.GetUOffsetT(buf[vectorLocation-4:])\n\tstart := flatbuffers.UOffsetT(0)\n\tfor span != 0 {\n\t\tmiddle := span / 2\n\t\ttableOffset := flatbuffers.GetIndirectOffset(buf, vectorLocation+4*(start+middle))\n\t\tobj := &Stat{}\n\t\tobj.Init(buf, tableOffset)\n\t\tval := obj.Count()\n\t\tcomp := 0\n\t\tif val > key {\n\t\t\tcomp = 1\n\t\t} else if val < key {\n\t\t\tcomp = -1\n\t\t}\n\t\tif comp > 0 {\n\t\t\tspan = middle\n\t\t} else if comp < 0 {\n\t\t\tmiddle += 1\n\t\t\tstart += middle\n\t\t\tspan -= middle\n\t\t} else {\n\t\t\trcv.Init(buf, tableOffset)\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc StatStart(builder *flatbuffers.Builder) {\n\tbuilder.StartObject(3)\n}\nfunc StatAddId(builder *flatbuffers.Builder, id flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(id), 0)\n}\nfunc StatAddVal(builder *flatbuffers.Builder, val int64) {\n\tbuilder.PrependInt64Slot(1, val, 0)\n}\nfunc StatAddCount(builder *flatbuffers.Builder, count uint16) {\n\tbuilder.PrependUint16Slot(2, count, 0)\n}\nfunc StatEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\treturn builder.EndObject()\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Stat.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class Stat extends com.google.flatbuffers.Table {\n  public static void ValidateVersion() { Constants.FLATBUFFERS_25_12_19(); }\n  public static Stat getRootAsStat(ByteBuffer _bb) { return getRootAsStat(_bb, new Stat()); }\n  public static Stat getRootAsStat(ByteBuffer _bb, Stat obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public Stat __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public String id() { int o = __offset(4); return o != 0 ? __string(o + bb_pos) : null; }\n  public ByteBuffer idAsByteBuffer() { return __vector_as_bytebuffer(4, 1); }\n  public ByteBuffer idInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 4, 1); }\n  public long val() { int o = __offset(6); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }\n  public boolean mutateVal(long val) { int o = __offset(6); if (o != 0) { bb.putLong(o + bb_pos, val); return true; } else { return false; } }\n  public int count() { int o = __offset(8); return o != 0 ? bb.getShort(o + bb_pos) & 0xFFFF : 0; }\n  public boolean mutateCount(int count) { int o = __offset(8); if (o != 0) { bb.putShort(o + bb_pos, (short) count); return true; } else { return false; } }\n\n  public static int createStat(FlatBufferBuilder builder,\n      int idOffset,\n      long val,\n      int count) {\n    builder.startTable(3);\n    Stat.addVal(builder, val);\n    Stat.addId(builder, idOffset);\n    Stat.addCount(builder, count);\n    return Stat.endStat(builder);\n  }\n\n  public static void startStat(FlatBufferBuilder builder) { builder.startTable(3); }\n  public static void addId(FlatBufferBuilder builder, int idOffset) { builder.addOffset(0, idOffset, 0); }\n  public static void addVal(FlatBufferBuilder builder, long val) { builder.addLong(1, val, 0L); }\n  public static void addCount(FlatBufferBuilder builder, int count) { builder.addShort((short) count); builder.slot(2); }\n  public static int endStat(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    return o;\n  }\n\n  @Override\n  protected int keysCompare(Integer o1, Integer o2, ByteBuffer _bb) {\n    int val_1 = _bb.getShort(__offset(8, o1, _bb)) & 0xFFFF;\n    int val_2 = _bb.getShort(__offset(8, o2, _bb)) & 0xFFFF;\n    return val_1 > val_2 ? 1 : val_1 < val_2 ? -1 : 0;\n  }\n\n  public static Stat __lookup_by_key(Stat obj, int vectorLocation, int key, ByteBuffer bb) {\n    int span = bb.getInt(vectorLocation - 4);\n    int start = 0;\n    while (span != 0) {\n      int middle = span / 2;\n      int tableOffset = __indirect(vectorLocation + 4 * (start + middle), bb);\n      int val = bb.getShort(__offset(8, bb.capacity() - tableOffset, bb)) & 0xFFFF;\n      int comp = val > key ? 1 : val < key ? -1 : 0;\n      if (comp > 0) {\n        span = middle;\n      } else if (comp < 0) {\n        middle++;\n        start += middle;\n        span -= middle;\n      } else {\n        return (obj == null ? new Stat() : obj).__assign(tableOffset, bb);\n      }\n    }\n    return null;\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public Stat get(int j) { return get(new Stat(), j); }\n    public Stat get(Stat obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); }\n    public Stat getByKey(int key) {  return __lookup_by_key(null, __vector(), key, bb); }\n    public Stat getByKey(Stat obj, int key) {  return __lookup_by_key(obj, __vector(), key, bb); }\n  }\n  public StatT unpack() {\n    StatT _o = new StatT();\n    unpackTo(_o);\n    return _o;\n  }\n  public void unpackTo(StatT _o) {\n    String _oId = id();\n    _o.setId(_oId);\n    long _oVal = val();\n    _o.setVal(_oVal);\n    int _oCount = count();\n    _o.setCount(_oCount);\n  }\n  public static int pack(FlatBufferBuilder builder, StatT _o) {\n    if (_o == null) return 0;\n    int _id = _o.getId() == null ? 0 : builder.createString(_o.getId());\n    return createStat(\n      builder,\n      _id,\n      _o.getVal(),\n      _o.getCount());\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/Stat.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example\n\nimport com.google.flatbuffers.BaseVector\nimport com.google.flatbuffers.BooleanVector\nimport com.google.flatbuffers.ByteVector\nimport com.google.flatbuffers.Constants\nimport com.google.flatbuffers.DoubleVector\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.FloatVector\nimport com.google.flatbuffers.LongVector\nimport com.google.flatbuffers.StringVector\nimport com.google.flatbuffers.Struct\nimport com.google.flatbuffers.Table\nimport com.google.flatbuffers.UnionVector\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport kotlin.math.sign\n\n@Suppress(\"unused\")\nclass Stat : Table() {\n\n    fun __init(_i: Int, _bb: ByteBuffer)  {\n        __reset(_i, _bb)\n    }\n    fun __assign(_i: Int, _bb: ByteBuffer) : Stat {\n        __init(_i, _bb)\n        return this\n    }\n    val id : String?\n        get() {\n            val o = __offset(4)\n            return if (o != 0) {\n                __string(o + bb_pos)\n            } else {\n                null\n            }\n        }\n    val idAsByteBuffer : ByteBuffer? get() = __vector_as_bytebuffer(4, 1)\n    fun idInByteBuffer(_bb: ByteBuffer) : ByteBuffer? = __vector_in_bytebuffer(_bb, 4, 1)\n    val val_ : Long\n        get() {\n            val o = __offset(6)\n            return if(o != 0) bb.getLong(o + bb_pos) else 0L\n        }\n    fun mutateVal_(val_: Long) : Boolean {\n        val o = __offset(6)\n        return if (o != 0) {\n            bb.putLong(o + bb_pos, val_)\n            true\n        } else {\n            false\n        }\n    }\n    val count : UShort\n        get() {\n            val o = __offset(8)\n            return if(o != 0) bb.getShort(o + bb_pos).toUShort() else 0u\n        }\n    fun mutateCount(count: UShort) : Boolean {\n        val o = __offset(8)\n        return if (o != 0) {\n            bb.putShort(o + bb_pos, count.toShort())\n            true\n        } else {\n            false\n        }\n    }\n    override fun keysCompare(o1: Int, o2: Int, _bb: ByteBuffer) : Int {\n        val val_1 = _bb.getShort(__offset(8, o1, _bb))\n        val val_2 = _bb.getShort(__offset(8, o2, _bb))\n        return (val_1 - val_2).sign\n    }\n    companion object {\n        fun validateVersion() = Constants.FLATBUFFERS_25_12_19()\n        fun getRootAsStat(_bb: ByteBuffer): Stat = getRootAsStat(_bb, Stat())\n        fun getRootAsStat(_bb: ByteBuffer, obj: Stat): Stat {\n            _bb.order(ByteOrder.LITTLE_ENDIAN)\n            return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb))\n        }\n        fun createStat(builder: FlatBufferBuilder, idOffset: Int, val_: Long, count: UShort) : Int {\n            builder.startTable(3)\n            addVal_(builder, val_)\n            addId(builder, idOffset)\n            addCount(builder, count)\n            return endStat(builder)\n        }\n        fun startStat(builder: FlatBufferBuilder) = builder.startTable(3)\n        fun addId(builder: FlatBufferBuilder, id: Int) = builder.addOffset(0, id, 0)\n        fun addVal_(builder: FlatBufferBuilder, val_: Long) = builder.addLong(1, val_, 0L)\n        fun addCount(builder: FlatBufferBuilder, count: UShort)  {\n            builder.addShort(count.toShort())\n            builder.slot(2)\n        }\n        fun endStat(builder: FlatBufferBuilder) : Int {\n            val o = builder.endTable()\n            return o\n        }\n        fun __lookup_by_key(obj: Stat?, vectorLocation: Int, key: UShort, bb: ByteBuffer) : Stat? {\n            var span = bb.getInt(vectorLocation - 4)\n            var start = 0\n            while (span != 0) {\n                var middle = span / 2\n                val tableOffset = __indirect(vectorLocation + 4 * (start + middle), bb)\n                val value = bb.getShort(__offset(8, bb.capacity() - tableOffset, bb)).toUShort()\n                val comp = value.compareTo(key)\n                when {\n                    comp > 0 -> span = middle\n                    comp < 0 -> {\n                        middle++\n                        start += middle\n                        span -= middle\n                    }\n                    else -> {\n                        return (obj ?: Stat()).__assign(tableOffset, bb)\n                    }\n                }\n            }\n            return null\n        }\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Stat.lua",
    "content": "--[[ MyGame.Example.Stat\n\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : //monster_test.fbs\n  Rooting type : MyGame.Example.Monster (//monster_test.fbs)\n\n--]]\n\nlocal flatbuffers = require('flatbuffers')\n\nlocal Stat = {}\nlocal mt = {}\n\nfunction Stat.New()\n  local o = {}\n  setmetatable(o, {__index = mt})\n  return o\nend\n\nfunction mt:Init(buf, pos)\n  self.view = flatbuffers.view.New(buf, pos)\nend\n\nfunction mt:Id()\n  local o = self.view:Offset(4)\n  if o ~= 0 then\n    return self.view:String(self.view.pos + o)\n  end\nend\n\nfunction mt:Val()\n  local o = self.view:Offset(6)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Int64, self.view.pos + o)\n  end\n  return 0\nend\n\nfunction mt:Count()\n  local o = self.view:Offset(8)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Uint16, self.view.pos + o)\n  end\n  return 0\nend\n\nfunction Stat.Start(builder)\n  builder:StartObject(3)\nend\n\nfunction Stat.AddId(builder, id)\n  builder:PrependUOffsetTRelativeSlot(0, id, 0)\nend\n\nfunction Stat.AddVal(builder, val)\n  builder:PrependInt64Slot(1, val, 0)\nend\n\nfunction Stat.AddCount(builder, count)\n  builder:PrependUint16Slot(2, count, 0)\nend\n\nfunction Stat.End(builder)\n  return builder:EndObject()\nend\n\nreturn Stat"
  },
  {
    "path": "tests/MyGame/Example/Stat.nim",
    "content": "#[ MyGame.Example.Stat\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : \n  Rooting type : MyGame.Example.Monster ()\n]#\n\nimport flatbuffers\nimport std/options\n\ntype Stat* = object of FlatObj\nfunc id*(self: Stat): Option[string] =\n  let o = self.tab.Offset(4)\n  if o != 0:\n    return some(self.tab.String(self.tab.Pos + o))\nfunc val*(self: Stat): int64 =\n  let o = self.tab.Offset(6)\n  if o != 0:\n    return Get[int64](self.tab, self.tab.Pos + o)\n  return 0\nfunc `val=`*(self: var Stat, n: int64): bool =\n  return self.tab.MutateSlot(6, n)\nfunc count*(self: Stat): uint16 =\n  let o = self.tab.Offset(8)\n  if o != 0:\n    return Get[uint16](self.tab, self.tab.Pos + o)\n  return 0\nfunc `count=`*(self: var Stat, n: uint16): bool =\n  return self.tab.MutateSlot(8, n)\nproc StatStart*(builder: var Builder) =\n  builder.StartObject(3)\nproc StatAddid*(builder: var Builder, id: uoffset) =\n  builder.PrependSlot(0, id, default(uoffset))\nproc StatAddval*(builder: var Builder, val: int64) =\n  builder.PrependSlot(1, val, default(int64))\nproc StatAddcount*(builder: var Builder, count: uint16) =\n  builder.PrependSlot(2, count, default(uint16))\nproc StatEnd*(builder: var Builder): uoffset =\n  return builder.EndObject()\n"
  },
  {
    "path": "tests/MyGame/Example/Stat.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nnamespace MyGame\\Example;\n\nuse \\Google\\FlatBuffers\\Struct;\nuse \\Google\\FlatBuffers\\Table;\nuse \\Google\\FlatBuffers\\ByteBuffer;\nuse \\Google\\FlatBuffers\\FlatBufferBuilder;\n\nclass Stat extends Table\n{\n    /**\n     * @param ByteBuffer $bb\n     * @return Stat\n     */\n    public static function getRootAsStat(ByteBuffer $bb)\n    {\n        $obj = new Stat();\n        return ($obj->init($bb->getInt($bb->getPosition()) + $bb->getPosition(), $bb));\n    }\n\n    public static function StatIdentifier()\n    {\n        return \"MONS\";\n    }\n\n    public static function StatBufferHasIdentifier(ByteBuffer $buf)\n    {\n        return self::__has_identifier($buf, self::StatIdentifier());\n    }\n\n    public static function StatExtension()\n    {\n        return \"mon\";\n    }\n\n    /**\n     * @param int $_i offset\n     * @param ByteBuffer $_bb\n     * @return Stat\n     **/\n    public function init($_i, ByteBuffer $_bb)\n    {\n        $this->bb_pos = $_i;\n        $this->bb = $_bb;\n        return $this;\n    }\n\n    public function getId()\n    {\n        $o = $this->__offset(4);\n        return $o != 0 ? $this->__string($o + $this->bb_pos) : null;\n    }\n\n    /**\n     * @return long\n     */\n    public function getVal()\n    {\n        $o = $this->__offset(6);\n        return $o != 0 ? $this->bb->getLong($o + $this->bb_pos) : 0;\n    }\n\n    /**\n     * @return ushort\n     */\n    public function getCount()\n    {\n        $o = $this->__offset(8);\n        return $o != 0 ? $this->bb->getUshort($o + $this->bb_pos) : 0;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return void\n     */\n    public static function startStat(FlatBufferBuilder $builder)\n    {\n        $builder->StartObject(3);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return Stat\n     */\n    public static function createStat(FlatBufferBuilder $builder, $id, $val, $count)\n    {\n        $builder->startObject(3);\n        self::addId($builder, $id);\n        self::addVal($builder, $val);\n        self::addCount($builder, $count);\n        $o = $builder->endObject();\n        return $o;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param StringOffset\n     * @return void\n     */\n    public static function addId(FlatBufferBuilder $builder, $id)\n    {\n        $builder->addOffsetX(0, $id, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param long\n     * @return void\n     */\n    public static function addVal(FlatBufferBuilder $builder, $val)\n    {\n        $builder->addLongX(1, $val, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param ushort\n     * @return void\n     */\n    public static function addCount(FlatBufferBuilder $builder, $count)\n    {\n        $builder->addUshortX(2, $count, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return int table offset\n     */\n    public static function endStat(FlatBufferBuilder $builder)\n    {\n        $o = $builder->endObject();\n        return $o;\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Stat.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: Example\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\nclass Stat(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = Stat()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsStat(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    @classmethod\n    def StatBufferHasIdentifier(cls, buf, offset, size_prefixed=False):\n        return flatbuffers.util.BufferHasIdentifier(buf, offset, b\"\\x4D\\x4F\\x4E\\x53\", size_prefixed=size_prefixed)\n\n    # Stat\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # Stat\n    def Id(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.String(o + self._tab.Pos)\n        return None\n\n    # Stat\n    def Val(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int64Flags, o + self._tab.Pos)\n        return 0\n\n    # Stat\n    def Count(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint16Flags, o + self._tab.Pos)\n        return 0\n\ndef StatStart(builder):\n    builder.StartObject(3)\n\ndef Start(builder):\n    StatStart(builder)\n\ndef StatAddId(builder, id):\n    builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(id), 0)\n\ndef AddId(builder, id):\n    StatAddId(builder, id)\n\ndef StatAddVal(builder, val):\n    builder.PrependInt64Slot(1, val, 0)\n\ndef AddVal(builder, val):\n    StatAddVal(builder, val)\n\ndef StatAddCount(builder, count):\n    builder.PrependUint16Slot(2, count, 0)\n\ndef AddCount(builder, count):\n    StatAddCount(builder, count)\n\ndef StatEnd(builder):\n    return builder.EndObject()\n\ndef End(builder):\n    return StatEnd(builder)\n\n\nclass StatT(object):\n\n    # StatT\n    def __init__(\n        self,\n        id = None,\n        val = 0,\n        count = 0,\n    ):\n        self.id = id  # type: Optional[str]\n        self.val = val  # type: int\n        self.count = count  # type: int\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        stat = Stat()\n        stat.Init(buf, pos)\n        return cls.InitFromObj(stat)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, stat):\n        x = StatT()\n        x._UnPack(stat)\n        return x\n\n    # StatT\n    def _UnPack(self, stat):\n        if stat is None:\n            return\n        self.id = stat.Id()\n        self.val = stat.Val()\n        self.count = stat.Count()\n\n    # StatT\n    def Pack(self, builder):\n        if self.id is not None:\n            id = builder.CreateString(self.id)\n        StatStart(builder)\n        if self.id is not None:\n            StatAddId(builder, id)\n        StatAddVal(builder, self.val)\n        StatAddCount(builder, self.count)\n        stat = StatEnd(builder)\n        return stat\n"
  },
  {
    "path": "tests/MyGame/Example/StatT.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\npublic class StatT {\n  private String id;\n  private long val;\n  private int count;\n\n  public String getId() { return id; }\n\n  public void setId(String id) { this.id = id; }\n\n  public long getVal() { return val; }\n\n  public void setVal(long val) { this.val = val; }\n\n  public int getCount() { return count; }\n\n  public void setCount(int count) { this.count = count; }\n\n\n  public StatT() {\n    this.id = null;\n    this.val = 0L;\n    this.count = 0;\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/StructOfStructs.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace MyGame.Example\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct StructOfStructs : IFlatbufferObject\n{\n  private Struct __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Struct(_i, _bb); }\n  public StructOfStructs __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public MyGame.Example.Ability A { get { return (new MyGame.Example.Ability()).__assign(__p.bb_pos + 0, __p.bb); } }\n  public MyGame.Example.Test B { get { return (new MyGame.Example.Test()).__assign(__p.bb_pos + 8, __p.bb); } }\n  public MyGame.Example.Ability C { get { return (new MyGame.Example.Ability()).__assign(__p.bb_pos + 12, __p.bb); } }\n\n  public static Offset<MyGame.Example.StructOfStructs> CreateStructOfStructs(FlatBufferBuilder builder, uint a_Id, uint a_Distance, short b_A, sbyte b_B, uint c_Id, uint c_Distance) {\n    builder.Prep(4, 20);\n    builder.Prep(4, 8);\n    builder.PutUint(c_Distance);\n    builder.PutUint(c_Id);\n    builder.Prep(2, 4);\n    builder.Pad(1);\n    builder.PutSbyte(b_B);\n    builder.PutShort(b_A);\n    builder.Prep(4, 8);\n    builder.PutUint(a_Distance);\n    builder.PutUint(a_Id);\n    return new Offset<MyGame.Example.StructOfStructs>(builder.Offset);\n  }\n  public StructOfStructsT UnPack() {\n    var _o = new StructOfStructsT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(StructOfStructsT _o) {\n    _o.A = this.A.UnPack();\n    _o.B = this.B.UnPack();\n    _o.C = this.C.UnPack();\n  }\n  public static Offset<MyGame.Example.StructOfStructs> Pack(FlatBufferBuilder builder, StructOfStructsT _o) {\n    if (_o == null) return default(Offset<MyGame.Example.StructOfStructs>);\n    var _a_id = _o.A.Id;\n    var _a_distance = _o.A.Distance;\n    var _b_a = _o.B.A;\n    var _b_b = _o.B.B;\n    var _c_id = _o.C.Id;\n    var _c_distance = _o.C.Distance;\n    return CreateStructOfStructs(\n      builder,\n      _a_id,\n      _a_distance,\n      _b_a,\n      _b_b,\n      _c_id,\n      _c_distance);\n  }\n}\n\npublic class StructOfStructsT\n{\n  [Newtonsoft.Json.JsonProperty(\"a\")]\n  public MyGame.Example.AbilityT A { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"b\")]\n  public MyGame.Example.TestT B { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"c\")]\n  public MyGame.Example.AbilityT C { get; set; }\n\n  public StructOfStructsT() {\n    this.A = new MyGame.Example.AbilityT();\n    this.B = new MyGame.Example.TestT();\n    this.C = new MyGame.Example.AbilityT();\n  }\n}\n\n\n}\n"
  },
  {
    "path": "tests/MyGame/Example/StructOfStructs.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage Example\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n)\n\ntype StructOfStructsT struct {\n\tA *AbilityT `json:\"a\"`\n\tB *TestT `json:\"b\"`\n\tC *AbilityT `json:\"c\"`\n}\n\nfunc (t *StructOfStructsT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\tif t == nil {\n\t\treturn 0\n\t}\n\treturn CreateStructOfStructs(builder, t.A.Id, t.A.Distance, t.B.A, t.B.B, t.C.Id, t.C.Distance)\n}\nfunc (rcv *StructOfStructs) UnPackTo(t *StructOfStructsT) {\n\tt.A = rcv.A(nil).UnPack()\n\tt.B = rcv.B(nil).UnPack()\n\tt.C = rcv.C(nil).UnPack()\n}\n\nfunc (rcv *StructOfStructs) UnPack() *StructOfStructsT {\n\tif rcv == nil {\n\t\treturn nil\n\t}\n\tt := &StructOfStructsT{}\n\trcv.UnPackTo(t)\n\treturn t\n}\n\ntype StructOfStructs struct {\n\t_tab flatbuffers.Struct\n}\n\nfunc (rcv *StructOfStructs) Init(buf []byte, i flatbuffers.UOffsetT) {\n\trcv._tab.Bytes = buf\n\trcv._tab.Pos = i\n}\n\nfunc (rcv *StructOfStructs) Table() flatbuffers.Table {\n\treturn rcv._tab.Table\n}\n\nfunc (rcv *StructOfStructs) A(obj *Ability) *Ability {\n\tif obj == nil {\n\t\tobj = new(Ability)\n\t}\n\tobj.Init(rcv._tab.Bytes, rcv._tab.Pos+0)\n\treturn obj\n}\nfunc (rcv *StructOfStructs) B(obj *Test) *Test {\n\tif obj == nil {\n\t\tobj = new(Test)\n\t}\n\tobj.Init(rcv._tab.Bytes, rcv._tab.Pos+8)\n\treturn obj\n}\nfunc (rcv *StructOfStructs) C(obj *Ability) *Ability {\n\tif obj == nil {\n\t\tobj = new(Ability)\n\t}\n\tobj.Init(rcv._tab.Bytes, rcv._tab.Pos+12)\n\treturn obj\n}\n\nfunc CreateStructOfStructs(builder *flatbuffers.Builder, a_id uint32, a_distance uint32, b_a int16, b_b int8, c_id uint32, c_distance uint32) flatbuffers.UOffsetT {\n\tbuilder.Prep(4, 20)\n\tbuilder.Prep(4, 8)\n\tbuilder.PrependUint32(c_distance)\n\tbuilder.PrependUint32(c_id)\n\tbuilder.Prep(2, 4)\n\tbuilder.Pad(1)\n\tbuilder.PrependInt8(b_b)\n\tbuilder.PrependInt16(b_a)\n\tbuilder.Prep(4, 8)\n\tbuilder.PrependUint32(a_distance)\n\tbuilder.PrependUint32(a_id)\n\treturn builder.Offset()\n}\n"
  },
  {
    "path": "tests/MyGame/Example/StructOfStructs.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class StructOfStructs extends Struct {\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public StructOfStructs __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public MyGame.Example.Ability a() { return a(new MyGame.Example.Ability()); }\n  public MyGame.Example.Ability a(MyGame.Example.Ability obj) { return obj.__assign(bb_pos + 0, bb); }\n  public MyGame.Example.Test b() { return b(new MyGame.Example.Test()); }\n  public MyGame.Example.Test b(MyGame.Example.Test obj) { return obj.__assign(bb_pos + 8, bb); }\n  public MyGame.Example.Ability c() { return c(new MyGame.Example.Ability()); }\n  public MyGame.Example.Ability c(MyGame.Example.Ability obj) { return obj.__assign(bb_pos + 12, bb); }\n\n  public static int createStructOfStructs(FlatBufferBuilder builder, long a_id, long a_distance, short b_a, byte b_b, long c_id, long c_distance) {\n    builder.prep(4, 20);\n    builder.prep(4, 8);\n    builder.putInt((int) c_distance);\n    builder.putInt((int) c_id);\n    builder.prep(2, 4);\n    builder.pad(1);\n    builder.putByte(b_b);\n    builder.putShort(b_a);\n    builder.prep(4, 8);\n    builder.putInt((int) a_distance);\n    builder.putInt((int) a_id);\n    return builder.offset();\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public StructOfStructs get(int j) { return get(new StructOfStructs(), j); }\n    public StructOfStructs get(StructOfStructs obj, int j) {  return obj.__assign(__element(j), bb); }\n  }\n  public StructOfStructsT unpack() {\n    StructOfStructsT _o = new StructOfStructsT();\n    unpackTo(_o);\n    return _o;\n  }\n  public void unpackTo(StructOfStructsT _o) {\n    a().unpackTo(_o.getA());\n    b().unpackTo(_o.getB());\n    c().unpackTo(_o.getC());\n  }\n  public static int pack(FlatBufferBuilder builder, StructOfStructsT _o) {\n    if (_o == null) return 0;\n    int _a_id = (int) _o.getA().getId();\n    int _a_distance = (int) _o.getA().getDistance();\n    short _b_a = _o.getB().getA();\n    byte _b_b = _o.getB().getB();\n    int _c_id = (int) _o.getC().getId();\n    int _c_distance = (int) _o.getC().getDistance();\n    return createStructOfStructs(\n      builder,\n      _a_id,\n      _a_distance,\n      _b_a,\n      _b_b,\n      _c_id,\n      _c_distance);\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/StructOfStructs.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example\n\nimport com.google.flatbuffers.BaseVector\nimport com.google.flatbuffers.BooleanVector\nimport com.google.flatbuffers.ByteVector\nimport com.google.flatbuffers.Constants\nimport com.google.flatbuffers.DoubleVector\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.FloatVector\nimport com.google.flatbuffers.LongVector\nimport com.google.flatbuffers.StringVector\nimport com.google.flatbuffers.Struct\nimport com.google.flatbuffers.Table\nimport com.google.flatbuffers.UnionVector\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport kotlin.math.sign\n\n@Suppress(\"unused\")\nclass StructOfStructs : Struct() {\n\n    fun __init(_i: Int, _bb: ByteBuffer)  {\n        __reset(_i, _bb)\n    }\n    fun __assign(_i: Int, _bb: ByteBuffer) : StructOfStructs {\n        __init(_i, _bb)\n        return this\n    }\n    val a : MyGame.Example.Ability? get() = a(MyGame.Example.Ability())\n    fun a(obj: MyGame.Example.Ability) : MyGame.Example.Ability? = obj.__assign(bb_pos + 0, bb)\n    val b : MyGame.Example.Test? get() = b(MyGame.Example.Test())\n    fun b(obj: MyGame.Example.Test) : MyGame.Example.Test? = obj.__assign(bb_pos + 8, bb)\n    val c : MyGame.Example.Ability? get() = c(MyGame.Example.Ability())\n    fun c(obj: MyGame.Example.Ability) : MyGame.Example.Ability? = obj.__assign(bb_pos + 12, bb)\n    companion object {\n        fun createStructOfStructs(builder: FlatBufferBuilder, a_id: UInt, a_distance: UInt, b_a: Short, b_b: Byte, c_id: UInt, c_distance: UInt) : Int {\n            builder.prep(4, 20)\n            builder.prep(4, 8)\n            builder.putInt(c_distance.toInt())\n            builder.putInt(c_id.toInt())\n            builder.prep(2, 4)\n            builder.pad(1)\n            builder.putByte(b_b)\n            builder.putShort(b_a)\n            builder.prep(4, 8)\n            builder.putInt(a_distance.toInt())\n            builder.putInt(a_id.toInt())\n            return builder.offset()\n        }\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/StructOfStructs.lua",
    "content": "--[[ MyGame.Example.StructOfStructs\n\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : //monster_test.fbs\n  Rooting type : MyGame.Example.Monster (//monster_test.fbs)\n\n--]]\n\nlocal flatbuffers = require('flatbuffers')\n\nlocal StructOfStructs = {}\nlocal mt = {}\n\nfunction StructOfStructs.New()\n  local o = {}\n  setmetatable(o, {__index = mt})\n  return o\nend\n\nfunction mt:Init(buf, pos)\n  self.view = flatbuffers.view.New(buf, pos)\nend\n\nfunction mt:A(obj)\n  obj:Init(self.view.bytes, self.view.pos + 0)\n  return obj\nend\n\nfunction mt:B(obj)\n  obj:Init(self.view.bytes, self.view.pos + 8)\n  return obj\nend\n\nfunction mt:C(obj)\n  obj:Init(self.view.bytes, self.view.pos + 12)\n  return obj\nend\n\nfunction StructOfStructs.CreateStructOfStructs(builder, a_id, a_distance, b_a, b_b, c_id, c_distance)\n  builder:Prep(4, 20)\n  builder:Prep(4, 8)\n  builder:PrependUint32(c_distance)\n  builder:PrependUint32(c_id)\n  builder:Prep(2, 4)\n  builder:Pad(1)\n  builder:PrependInt8(b_b)\n  builder:PrependInt16(b_a)\n  builder:Prep(4, 8)\n  builder:PrependUint32(a_distance)\n  builder:PrependUint32(a_id)\n  return builder:Offset()\nend\n\nreturn StructOfStructs"
  },
  {
    "path": "tests/MyGame/Example/StructOfStructs.nim",
    "content": "#[ MyGame.Example.StructOfStructs\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : \n  Rooting type : MyGame.Example.Monster ()\n]#\n\nimport Ability as MyGame_Example_Ability\nimport Test as MyGame_Example_Test\nimport flatbuffers\n\ntype StructOfStructs* = object of FlatObj\nfunc a*(self: StructOfStructs): MyGame_Example_Ability.Ability =\n  return MyGame_Example_Ability.Ability(tab: Vtable(Bytes: self.tab.Bytes, Pos: self.tab.Pos + 0))\nfunc b*(self: StructOfStructs): MyGame_Example_Test.Test =\n  return MyGame_Example_Test.Test(tab: Vtable(Bytes: self.tab.Bytes, Pos: self.tab.Pos + 8))\nfunc c*(self: StructOfStructs): MyGame_Example_Ability.Ability =\n  return MyGame_Example_Ability.Ability(tab: Vtable(Bytes: self.tab.Bytes, Pos: self.tab.Pos + 12))\nproc StructOfStructsCreate*(self: var Builder, a_id: uint32, a_distance: uint32, b_a: int16, b_b: int8, c_id: uint32, c_distance: uint32): uoffset =\n  self.Prep(4, 20)\n  self.Prep(4, 8)\n  self.Prepend(c_distance)\n  self.Prepend(c_id)\n  self.Prep(2, 4)\n  self.Pad(1)\n  self.Prepend(b_b)\n  self.Prepend(b_a)\n  self.Prep(4, 8)\n  self.Prepend(a_distance)\n  self.Prepend(a_id)\n  return self.Offset()\n"
  },
  {
    "path": "tests/MyGame/Example/StructOfStructs.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nnamespace MyGame\\Example;\n\nuse \\Google\\FlatBuffers\\Struct;\nuse \\Google\\FlatBuffers\\Table;\nuse \\Google\\FlatBuffers\\ByteBuffer;\nuse \\Google\\FlatBuffers\\FlatBufferBuilder;\n\nclass StructOfStructs extends Struct\n{\n    /**\n     * @param int $_i offset\n     * @param ByteBuffer $_bb\n     * @return StructOfStructs\n     **/\n    public function init($_i, ByteBuffer $_bb)\n    {\n        $this->bb_pos = $_i;\n        $this->bb = $_bb;\n        return $this;\n    }\n\n    /**\n     * @return Ability\n     */\n    public function getA()\n    {\n        $obj = new Ability();\n        $obj->init($this->bb_pos + 0, $this->bb);\n        return $obj;\n    }\n\n    /**\n     * @return Test\n     */\n    public function getB()\n    {\n        $obj = new Test();\n        $obj->init($this->bb_pos + 8, $this->bb);\n        return $obj;\n    }\n\n    /**\n     * @return Ability\n     */\n    public function getC()\n    {\n        $obj = new Ability();\n        $obj->init($this->bb_pos + 12, $this->bb);\n        return $obj;\n    }\n\n\n    /**\n     * @return int offset\n     */\n    public static function createStructOfStructs(FlatBufferBuilder $builder, $a_id, $a_distance, $b_a, $b_b, $c_id, $c_distance)\n    {\n        $builder->prep(4, 20);\n        $builder->prep(4, 8);\n        $builder->putUint($c_distance);\n        $builder->putUint($c_id);\n        $builder->prep(2, 4);\n        $builder->pad(1);\n        $builder->putSbyte($b_b);\n        $builder->putShort($b_a);\n        $builder->prep(4, 8);\n        $builder->putUint($a_distance);\n        $builder->putUint($a_id);\n        return $builder->offset();\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/StructOfStructs.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: Example\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\nclass StructOfStructs(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def SizeOf(cls):\n        return 20\n\n    # StructOfStructs\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # StructOfStructs\n    def A(self, obj):\n        obj.Init(self._tab.Bytes, self._tab.Pos + 0)\n        return obj\n\n    # StructOfStructs\n    def B(self, obj):\n        obj.Init(self._tab.Bytes, self._tab.Pos + 8)\n        return obj\n\n    # StructOfStructs\n    def C(self, obj):\n        obj.Init(self._tab.Bytes, self._tab.Pos + 12)\n        return obj\n\n\ndef CreateStructOfStructs(builder, a_id, a_distance, b_a, b_b, c_id, c_distance):\n    builder.Prep(4, 20)\n    builder.Prep(4, 8)\n    builder.PrependUint32(c_distance)\n    builder.PrependUint32(c_id)\n    builder.Prep(2, 4)\n    builder.Pad(1)\n    builder.PrependInt8(b_b)\n    builder.PrependInt16(b_a)\n    builder.Prep(4, 8)\n    builder.PrependUint32(a_distance)\n    builder.PrependUint32(a_id)\n    return builder.Offset()\n\nimport MyGame.Example.Ability\nimport MyGame.Example.Test\ntry:\n    from typing import Optional\nexcept:\n    pass\n\nclass StructOfStructsT(object):\n\n    # StructOfStructsT\n    def __init__(\n        self,\n        a = None,\n        b = None,\n        c = None,\n    ):\n        self.a = a  # type: Optional[MyGame.Example.Ability.AbilityT]\n        self.b = b  # type: Optional[MyGame.Example.Test.TestT]\n        self.c = c  # type: Optional[MyGame.Example.Ability.AbilityT]\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        structOfStructs = StructOfStructs()\n        structOfStructs.Init(buf, pos)\n        return cls.InitFromObj(structOfStructs)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, structOfStructs):\n        x = StructOfStructsT()\n        x._UnPack(structOfStructs)\n        return x\n\n    # StructOfStructsT\n    def _UnPack(self, structOfStructs):\n        if structOfStructs is None:\n            return\n        if structOfStructs.A(MyGame.Example.Ability.Ability()) is not None:\n            self.a = MyGame.Example.Ability.AbilityT.InitFromObj(structOfStructs.A(MyGame.Example.Ability.Ability()))\n        if structOfStructs.B(MyGame.Example.Test.Test()) is not None:\n            self.b = MyGame.Example.Test.TestT.InitFromObj(structOfStructs.B(MyGame.Example.Test.Test()))\n        if structOfStructs.C(MyGame.Example.Ability.Ability()) is not None:\n            self.c = MyGame.Example.Ability.AbilityT.InitFromObj(structOfStructs.C(MyGame.Example.Ability.Ability()))\n\n    # StructOfStructsT\n    def Pack(self, builder):\n        return CreateStructOfStructs(builder, self.a.id, self.a.distance, self.b.a, self.b.b, self.c.id, self.c.distance)\n"
  },
  {
    "path": "tests/MyGame/Example/StructOfStructsOfStructs.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace MyGame.Example\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct StructOfStructsOfStructs : IFlatbufferObject\n{\n  private Struct __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Struct(_i, _bb); }\n  public StructOfStructsOfStructs __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public MyGame.Example.StructOfStructs A { get { return (new MyGame.Example.StructOfStructs()).__assign(__p.bb_pos + 0, __p.bb); } }\n\n  public static Offset<MyGame.Example.StructOfStructsOfStructs> CreateStructOfStructsOfStructs(FlatBufferBuilder builder, uint a_a_Id, uint a_a_Distance, short a_b_A, sbyte a_b_B, uint a_c_Id, uint a_c_Distance) {\n    builder.Prep(4, 20);\n    builder.Prep(4, 20);\n    builder.Prep(4, 8);\n    builder.PutUint(a_c_Distance);\n    builder.PutUint(a_c_Id);\n    builder.Prep(2, 4);\n    builder.Pad(1);\n    builder.PutSbyte(a_b_B);\n    builder.PutShort(a_b_A);\n    builder.Prep(4, 8);\n    builder.PutUint(a_a_Distance);\n    builder.PutUint(a_a_Id);\n    return new Offset<MyGame.Example.StructOfStructsOfStructs>(builder.Offset);\n  }\n  public StructOfStructsOfStructsT UnPack() {\n    var _o = new StructOfStructsOfStructsT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(StructOfStructsOfStructsT _o) {\n    _o.A = this.A.UnPack();\n  }\n  public static Offset<MyGame.Example.StructOfStructsOfStructs> Pack(FlatBufferBuilder builder, StructOfStructsOfStructsT _o) {\n    if (_o == null) return default(Offset<MyGame.Example.StructOfStructsOfStructs>);\n    var _a_a_id = _o.A.A.Id;\n    var _a_a_distance = _o.A.A.Distance;\n    var _a_b_a = _o.A.B.A;\n    var _a_b_b = _o.A.B.B;\n    var _a_c_id = _o.A.C.Id;\n    var _a_c_distance = _o.A.C.Distance;\n    return CreateStructOfStructsOfStructs(\n      builder,\n      _a_a_id,\n      _a_a_distance,\n      _a_b_a,\n      _a_b_b,\n      _a_c_id,\n      _a_c_distance);\n  }\n}\n\npublic class StructOfStructsOfStructsT\n{\n  [Newtonsoft.Json.JsonProperty(\"a\")]\n  public MyGame.Example.StructOfStructsT A { get; set; }\n\n  public StructOfStructsOfStructsT() {\n    this.A = new MyGame.Example.StructOfStructsT();\n  }\n}\n\n\n}\n"
  },
  {
    "path": "tests/MyGame/Example/StructOfStructsOfStructs.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage Example\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n)\n\ntype StructOfStructsOfStructsT struct {\n\tA *StructOfStructsT `json:\"a\"`\n}\n\nfunc (t *StructOfStructsOfStructsT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\tif t == nil {\n\t\treturn 0\n\t}\n\treturn CreateStructOfStructsOfStructs(builder, t.A.A.Id, t.A.A.Distance, t.A.B.A, t.A.B.B, t.A.C.Id, t.A.C.Distance)\n}\nfunc (rcv *StructOfStructsOfStructs) UnPackTo(t *StructOfStructsOfStructsT) {\n\tt.A = rcv.A(nil).UnPack()\n}\n\nfunc (rcv *StructOfStructsOfStructs) UnPack() *StructOfStructsOfStructsT {\n\tif rcv == nil {\n\t\treturn nil\n\t}\n\tt := &StructOfStructsOfStructsT{}\n\trcv.UnPackTo(t)\n\treturn t\n}\n\ntype StructOfStructsOfStructs struct {\n\t_tab flatbuffers.Struct\n}\n\nfunc (rcv *StructOfStructsOfStructs) Init(buf []byte, i flatbuffers.UOffsetT) {\n\trcv._tab.Bytes = buf\n\trcv._tab.Pos = i\n}\n\nfunc (rcv *StructOfStructsOfStructs) Table() flatbuffers.Table {\n\treturn rcv._tab.Table\n}\n\nfunc (rcv *StructOfStructsOfStructs) A(obj *StructOfStructs) *StructOfStructs {\n\tif obj == nil {\n\t\tobj = new(StructOfStructs)\n\t}\n\tobj.Init(rcv._tab.Bytes, rcv._tab.Pos+0)\n\treturn obj\n}\n\nfunc CreateStructOfStructsOfStructs(builder *flatbuffers.Builder, a_a_id uint32, a_a_distance uint32, a_b_a int16, a_b_b int8, a_c_id uint32, a_c_distance uint32) flatbuffers.UOffsetT {\n\tbuilder.Prep(4, 20)\n\tbuilder.Prep(4, 20)\n\tbuilder.Prep(4, 8)\n\tbuilder.PrependUint32(a_c_distance)\n\tbuilder.PrependUint32(a_c_id)\n\tbuilder.Prep(2, 4)\n\tbuilder.Pad(1)\n\tbuilder.PrependInt8(a_b_b)\n\tbuilder.PrependInt16(a_b_a)\n\tbuilder.Prep(4, 8)\n\tbuilder.PrependUint32(a_a_distance)\n\tbuilder.PrependUint32(a_a_id)\n\treturn builder.Offset()\n}\n"
  },
  {
    "path": "tests/MyGame/Example/StructOfStructsOfStructs.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class StructOfStructsOfStructs extends Struct {\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public StructOfStructsOfStructs __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public MyGame.Example.StructOfStructs a() { return a(new MyGame.Example.StructOfStructs()); }\n  public MyGame.Example.StructOfStructs a(MyGame.Example.StructOfStructs obj) { return obj.__assign(bb_pos + 0, bb); }\n\n  public static int createStructOfStructsOfStructs(FlatBufferBuilder builder, long a_a_id, long a_a_distance, short a_b_a, byte a_b_b, long a_c_id, long a_c_distance) {\n    builder.prep(4, 20);\n    builder.prep(4, 20);\n    builder.prep(4, 8);\n    builder.putInt((int) a_c_distance);\n    builder.putInt((int) a_c_id);\n    builder.prep(2, 4);\n    builder.pad(1);\n    builder.putByte(a_b_b);\n    builder.putShort(a_b_a);\n    builder.prep(4, 8);\n    builder.putInt((int) a_a_distance);\n    builder.putInt((int) a_a_id);\n    return builder.offset();\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public StructOfStructsOfStructs get(int j) { return get(new StructOfStructsOfStructs(), j); }\n    public StructOfStructsOfStructs get(StructOfStructsOfStructs obj, int j) {  return obj.__assign(__element(j), bb); }\n  }\n  public StructOfStructsOfStructsT unpack() {\n    StructOfStructsOfStructsT _o = new StructOfStructsOfStructsT();\n    unpackTo(_o);\n    return _o;\n  }\n  public void unpackTo(StructOfStructsOfStructsT _o) {\n    a().unpackTo(_o.getA());\n  }\n  public static int pack(FlatBufferBuilder builder, StructOfStructsOfStructsT _o) {\n    if (_o == null) return 0;\n    int _a_a_id = (int) _o.getA().getA().getId();\n    int _a_a_distance = (int) _o.getA().getA().getDistance();\n    short _a_b_a = _o.getA().getB().getA();\n    byte _a_b_b = _o.getA().getB().getB();\n    int _a_c_id = (int) _o.getA().getC().getId();\n    int _a_c_distance = (int) _o.getA().getC().getDistance();\n    return createStructOfStructsOfStructs(\n      builder,\n      _a_a_id,\n      _a_a_distance,\n      _a_b_a,\n      _a_b_b,\n      _a_c_id,\n      _a_c_distance);\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/StructOfStructsOfStructs.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example\n\nimport com.google.flatbuffers.BaseVector\nimport com.google.flatbuffers.BooleanVector\nimport com.google.flatbuffers.ByteVector\nimport com.google.flatbuffers.Constants\nimport com.google.flatbuffers.DoubleVector\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.FloatVector\nimport com.google.flatbuffers.LongVector\nimport com.google.flatbuffers.StringVector\nimport com.google.flatbuffers.Struct\nimport com.google.flatbuffers.Table\nimport com.google.flatbuffers.UnionVector\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport kotlin.math.sign\n\n@Suppress(\"unused\")\nclass StructOfStructsOfStructs : Struct() {\n\n    fun __init(_i: Int, _bb: ByteBuffer)  {\n        __reset(_i, _bb)\n    }\n    fun __assign(_i: Int, _bb: ByteBuffer) : StructOfStructsOfStructs {\n        __init(_i, _bb)\n        return this\n    }\n    val a : MyGame.Example.StructOfStructs? get() = a(MyGame.Example.StructOfStructs())\n    fun a(obj: MyGame.Example.StructOfStructs) : MyGame.Example.StructOfStructs? = obj.__assign(bb_pos + 0, bb)\n    companion object {\n        fun createStructOfStructsOfStructs(builder: FlatBufferBuilder, a_a_id: UInt, a_a_distance: UInt, a_b_a: Short, a_b_b: Byte, a_c_id: UInt, a_c_distance: UInt) : Int {\n            builder.prep(4, 20)\n            builder.prep(4, 20)\n            builder.prep(4, 8)\n            builder.putInt(a_c_distance.toInt())\n            builder.putInt(a_c_id.toInt())\n            builder.prep(2, 4)\n            builder.pad(1)\n            builder.putByte(a_b_b)\n            builder.putShort(a_b_a)\n            builder.prep(4, 8)\n            builder.putInt(a_a_distance.toInt())\n            builder.putInt(a_a_id.toInt())\n            return builder.offset()\n        }\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/StructOfStructsOfStructs.lua",
    "content": "--[[ MyGame.Example.StructOfStructsOfStructs\n\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : //monster_test.fbs\n  Rooting type : MyGame.Example.Monster (//monster_test.fbs)\n\n--]]\n\nlocal flatbuffers = require('flatbuffers')\n\nlocal StructOfStructsOfStructs = {}\nlocal mt = {}\n\nfunction StructOfStructsOfStructs.New()\n  local o = {}\n  setmetatable(o, {__index = mt})\n  return o\nend\n\nfunction mt:Init(buf, pos)\n  self.view = flatbuffers.view.New(buf, pos)\nend\n\nfunction mt:A(obj)\n  obj:Init(self.view.bytes, self.view.pos + 0)\n  return obj\nend\n\nfunction StructOfStructsOfStructs.CreateStructOfStructsOfStructs(builder, a_a_id, a_a_distance, a_b_a, a_b_b, a_c_id, a_c_distance)\n  builder:Prep(4, 20)\n  builder:Prep(4, 20)\n  builder:Prep(4, 8)\n  builder:PrependUint32(a_c_distance)\n  builder:PrependUint32(a_c_id)\n  builder:Prep(2, 4)\n  builder:Pad(1)\n  builder:PrependInt8(a_b_b)\n  builder:PrependInt16(a_b_a)\n  builder:Prep(4, 8)\n  builder:PrependUint32(a_a_distance)\n  builder:PrependUint32(a_a_id)\n  return builder:Offset()\nend\n\nreturn StructOfStructsOfStructs"
  },
  {
    "path": "tests/MyGame/Example/StructOfStructsOfStructs.nim",
    "content": "#[ MyGame.Example.StructOfStructsOfStructs\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : \n  Rooting type : MyGame.Example.Monster ()\n]#\n\nimport StructOfStructs as MyGame_Example_StructOfStructs\nimport flatbuffers\n\ntype StructOfStructsOfStructs* = object of FlatObj\nfunc a*(self: StructOfStructsOfStructs): MyGame_Example_StructOfStructs.StructOfStructs =\n  return MyGame_Example_StructOfStructs.StructOfStructs(tab: Vtable(Bytes: self.tab.Bytes, Pos: self.tab.Pos + 0))\nproc StructOfStructsOfStructsCreate*(self: var Builder, a_a_id: uint32, a_a_distance: uint32, a_b_a: int16, a_b_b: int8, a_c_id: uint32, a_c_distance: uint32): uoffset =\n  self.Prep(4, 20)\n  self.Prep(4, 20)\n  self.Prep(4, 8)\n  self.Prepend(a_c_distance)\n  self.Prepend(a_c_id)\n  self.Prep(2, 4)\n  self.Pad(1)\n  self.Prepend(a_b_b)\n  self.Prepend(a_b_a)\n  self.Prep(4, 8)\n  self.Prepend(a_a_distance)\n  self.Prepend(a_a_id)\n  return self.Offset()\n"
  },
  {
    "path": "tests/MyGame/Example/StructOfStructsOfStructs.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nnamespace MyGame\\Example;\n\nuse \\Google\\FlatBuffers\\Struct;\nuse \\Google\\FlatBuffers\\Table;\nuse \\Google\\FlatBuffers\\ByteBuffer;\nuse \\Google\\FlatBuffers\\FlatBufferBuilder;\n\nclass StructOfStructsOfStructs extends Struct\n{\n    /**\n     * @param int $_i offset\n     * @param ByteBuffer $_bb\n     * @return StructOfStructsOfStructs\n     **/\n    public function init($_i, ByteBuffer $_bb)\n    {\n        $this->bb_pos = $_i;\n        $this->bb = $_bb;\n        return $this;\n    }\n\n    /**\n     * @return StructOfStructs\n     */\n    public function getA()\n    {\n        $obj = new StructOfStructs();\n        $obj->init($this->bb_pos + 0, $this->bb);\n        return $obj;\n    }\n\n\n    /**\n     * @return int offset\n     */\n    public static function createStructOfStructsOfStructs(FlatBufferBuilder $builder, $a_a_id, $a_a_distance, $a_b_a, $a_b_b, $a_c_id, $a_c_distance)\n    {\n        $builder->prep(4, 20);\n        $builder->prep(4, 20);\n        $builder->prep(4, 8);\n        $builder->putUint($a_c_distance);\n        $builder->putUint($a_c_id);\n        $builder->prep(2, 4);\n        $builder->pad(1);\n        $builder->putSbyte($a_b_b);\n        $builder->putShort($a_b_a);\n        $builder->prep(4, 8);\n        $builder->putUint($a_a_distance);\n        $builder->putUint($a_a_id);\n        return $builder->offset();\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/StructOfStructsOfStructs.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: Example\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\nclass StructOfStructsOfStructs(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def SizeOf(cls):\n        return 20\n\n    # StructOfStructsOfStructs\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # StructOfStructsOfStructs\n    def A(self, obj):\n        obj.Init(self._tab.Bytes, self._tab.Pos + 0)\n        return obj\n\n\ndef CreateStructOfStructsOfStructs(builder, a_a_id, a_a_distance, a_b_a, a_b_b, a_c_id, a_c_distance):\n    builder.Prep(4, 20)\n    builder.Prep(4, 20)\n    builder.Prep(4, 8)\n    builder.PrependUint32(a_c_distance)\n    builder.PrependUint32(a_c_id)\n    builder.Prep(2, 4)\n    builder.Pad(1)\n    builder.PrependInt8(a_b_b)\n    builder.PrependInt16(a_b_a)\n    builder.Prep(4, 8)\n    builder.PrependUint32(a_a_distance)\n    builder.PrependUint32(a_a_id)\n    return builder.Offset()\n\nimport MyGame.Example.StructOfStructs\ntry:\n    from typing import Optional\nexcept:\n    pass\n\nclass StructOfStructsOfStructsT(object):\n\n    # StructOfStructsOfStructsT\n    def __init__(\n        self,\n        a = None,\n    ):\n        self.a = a  # type: Optional[MyGame.Example.StructOfStructs.StructOfStructsT]\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        structOfStructsOfStructs = StructOfStructsOfStructs()\n        structOfStructsOfStructs.Init(buf, pos)\n        return cls.InitFromObj(structOfStructsOfStructs)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, structOfStructsOfStructs):\n        x = StructOfStructsOfStructsT()\n        x._UnPack(structOfStructsOfStructs)\n        return x\n\n    # StructOfStructsOfStructsT\n    def _UnPack(self, structOfStructsOfStructs):\n        if structOfStructsOfStructs is None:\n            return\n        if structOfStructsOfStructs.A(MyGame.Example.StructOfStructs.StructOfStructs()) is not None:\n            self.a = MyGame.Example.StructOfStructs.StructOfStructsT.InitFromObj(structOfStructsOfStructs.A(MyGame.Example.StructOfStructs.StructOfStructs()))\n\n    # StructOfStructsOfStructsT\n    def Pack(self, builder):\n        return CreateStructOfStructsOfStructs(builder, self.a.a.id, self.a.a.distance, self.a.b.a, self.a.b.b, self.a.c.id, self.a.c.distance)\n"
  },
  {
    "path": "tests/MyGame/Example/StructOfStructsOfStructsT.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\npublic class StructOfStructsOfStructsT {\n  private MyGame.Example.StructOfStructsT a;\n\n  public MyGame.Example.StructOfStructsT getA() { return a; }\n\n  public void setA(MyGame.Example.StructOfStructsT a) { this.a = a; }\n\n\n  public StructOfStructsOfStructsT() {\n    this.a = new MyGame.Example.StructOfStructsT();\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/StructOfStructsT.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\npublic class StructOfStructsT {\n  private MyGame.Example.AbilityT a;\n  private MyGame.Example.TestT b;\n  private MyGame.Example.AbilityT c;\n\n  public MyGame.Example.AbilityT getA() { return a; }\n\n  public void setA(MyGame.Example.AbilityT a) { this.a = a; }\n\n  public MyGame.Example.TestT getB() { return b; }\n\n  public void setB(MyGame.Example.TestT b) { this.b = b; }\n\n  public MyGame.Example.AbilityT getC() { return c; }\n\n  public void setC(MyGame.Example.AbilityT c) { this.c = c; }\n\n\n  public StructOfStructsT() {\n    this.a = new MyGame.Example.AbilityT();\n    this.b = new MyGame.Example.TestT();\n    this.c = new MyGame.Example.AbilityT();\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/Test.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace MyGame.Example\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct Test : IFlatbufferObject\n{\n  private Struct __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Struct(_i, _bb); }\n  public Test __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public short A { get { return __p.bb.GetShort(__p.bb_pos + 0); } }\n  public void MutateA(short a) { __p.bb.PutShort(__p.bb_pos + 0, a); }\n  public sbyte B { get { return __p.bb.GetSbyte(__p.bb_pos + 2); } }\n  public void MutateB(sbyte b) { __p.bb.PutSbyte(__p.bb_pos + 2, b); }\n\n  public static Offset<MyGame.Example.Test> CreateTest(FlatBufferBuilder builder, short A, sbyte B) {\n    builder.Prep(2, 4);\n    builder.Pad(1);\n    builder.PutSbyte(B);\n    builder.PutShort(A);\n    return new Offset<MyGame.Example.Test>(builder.Offset);\n  }\n  public TestT UnPack() {\n    var _o = new TestT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(TestT _o) {\n    _o.A = this.A;\n    _o.B = this.B;\n  }\n  public static Offset<MyGame.Example.Test> Pack(FlatBufferBuilder builder, TestT _o) {\n    if (_o == null) return default(Offset<MyGame.Example.Test>);\n    return CreateTest(\n      builder,\n      _o.A,\n      _o.B);\n  }\n}\n\npublic class TestT\n{\n  [Newtonsoft.Json.JsonProperty(\"a\")]\n  public short A { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"b\")]\n  public sbyte B { get; set; }\n\n  public TestT() {\n    this.A = 0;\n    this.B = 0;\n  }\n}\n\n\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Test.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage Example\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n)\n\ntype TestT struct {\n\tA int16 `json:\"a\"`\n\tB int8 `json:\"b\"`\n}\n\nfunc (t *TestT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\tif t == nil {\n\t\treturn 0\n\t}\n\treturn CreateTest(builder, t.A, t.B)\n}\nfunc (rcv *Test) UnPackTo(t *TestT) {\n\tt.A = rcv.A()\n\tt.B = rcv.B()\n}\n\nfunc (rcv *Test) UnPack() *TestT {\n\tif rcv == nil {\n\t\treturn nil\n\t}\n\tt := &TestT{}\n\trcv.UnPackTo(t)\n\treturn t\n}\n\ntype Test struct {\n\t_tab flatbuffers.Struct\n}\n\nfunc (rcv *Test) Init(buf []byte, i flatbuffers.UOffsetT) {\n\trcv._tab.Bytes = buf\n\trcv._tab.Pos = i\n}\n\nfunc (rcv *Test) Table() flatbuffers.Table {\n\treturn rcv._tab.Table\n}\n\nfunc (rcv *Test) A() int16 {\n\treturn rcv._tab.GetInt16(rcv._tab.Pos + flatbuffers.UOffsetT(0))\n}\nfunc (rcv *Test) MutateA(n int16) bool {\n\treturn rcv._tab.MutateInt16(rcv._tab.Pos+flatbuffers.UOffsetT(0), n)\n}\n\nfunc (rcv *Test) B() int8 {\n\treturn rcv._tab.GetInt8(rcv._tab.Pos + flatbuffers.UOffsetT(2))\n}\nfunc (rcv *Test) MutateB(n int8) bool {\n\treturn rcv._tab.MutateInt8(rcv._tab.Pos+flatbuffers.UOffsetT(2), n)\n}\n\nfunc CreateTest(builder *flatbuffers.Builder, a int16, b int8) flatbuffers.UOffsetT {\n\tbuilder.Prep(2, 4)\n\tbuilder.Pad(1)\n\tbuilder.PrependInt8(b)\n\tbuilder.PrependInt16(a)\n\treturn builder.Offset()\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Test.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class Test extends Struct {\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public Test __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public short a() { return bb.getShort(bb_pos + 0); }\n  public void mutateA(short a) { bb.putShort(bb_pos + 0, a); }\n  public byte b() { return bb.get(bb_pos + 2); }\n  public void mutateB(byte b) { bb.put(bb_pos + 2, b); }\n\n  public static int createTest(FlatBufferBuilder builder, short a, byte b) {\n    builder.prep(2, 4);\n    builder.pad(1);\n    builder.putByte(b);\n    builder.putShort(a);\n    return builder.offset();\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public Test get(int j) { return get(new Test(), j); }\n    public Test get(Test obj, int j) {  return obj.__assign(__element(j), bb); }\n  }\n  public TestT unpack() {\n    TestT _o = new TestT();\n    unpackTo(_o);\n    return _o;\n  }\n  public void unpackTo(TestT _o) {\n    short _oA = a();\n    _o.setA(_oA);\n    byte _oB = b();\n    _o.setB(_oB);\n  }\n  public static int pack(FlatBufferBuilder builder, TestT _o) {\n    if (_o == null) return 0;\n    return createTest(\n      builder,\n      _o.getA(),\n      _o.getB());\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/Test.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example\n\nimport com.google.flatbuffers.BaseVector\nimport com.google.flatbuffers.BooleanVector\nimport com.google.flatbuffers.ByteVector\nimport com.google.flatbuffers.Constants\nimport com.google.flatbuffers.DoubleVector\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.FloatVector\nimport com.google.flatbuffers.LongVector\nimport com.google.flatbuffers.StringVector\nimport com.google.flatbuffers.Struct\nimport com.google.flatbuffers.Table\nimport com.google.flatbuffers.UnionVector\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport kotlin.math.sign\n\n@Suppress(\"unused\")\nclass Test : Struct() {\n\n    fun __init(_i: Int, _bb: ByteBuffer)  {\n        __reset(_i, _bb)\n    }\n    fun __assign(_i: Int, _bb: ByteBuffer) : Test {\n        __init(_i, _bb)\n        return this\n    }\n    val a : Short get() = bb.getShort(bb_pos + 0)\n    fun mutateA(a: Short) : ByteBuffer = bb.putShort(bb_pos + 0, a)\n    val b : Byte get() = bb.get(bb_pos + 2)\n    fun mutateB(b: Byte) : ByteBuffer = bb.put(bb_pos + 2, b)\n    companion object {\n        fun createTest(builder: FlatBufferBuilder, a: Short, b: Byte) : Int {\n            builder.prep(2, 4)\n            builder.pad(1)\n            builder.putByte(b)\n            builder.putShort(a)\n            return builder.offset()\n        }\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Test.lua",
    "content": "--[[ MyGame.Example.Test\n\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : //monster_test.fbs\n  Rooting type : MyGame.Example.Monster (//monster_test.fbs)\n\n--]]\n\nlocal flatbuffers = require('flatbuffers')\n\nlocal Test = {}\nlocal mt = {}\n\nfunction Test.New()\n  local o = {}\n  setmetatable(o, {__index = mt})\n  return o\nend\n\nfunction mt:Init(buf, pos)\n  self.view = flatbuffers.view.New(buf, pos)\nend\n\nfunction mt:A()\n  return self.view:Get(flatbuffers.N.Int16, self.view.pos + 0)\nend\n\nfunction mt:B()\n  return self.view:Get(flatbuffers.N.Int8, self.view.pos + 2)\nend\n\nfunction Test.CreateTest(builder, a, b)\n  builder:Prep(2, 4)\n  builder:Pad(1)\n  builder:PrependInt8(b)\n  builder:PrependInt16(a)\n  return builder:Offset()\nend\n\nreturn Test"
  },
  {
    "path": "tests/MyGame/Example/Test.nim",
    "content": "#[ MyGame.Example.Test\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : \n  Rooting type : MyGame.Example.Monster ()\n]#\n\nimport flatbuffers\n\ntype Test* = object of FlatObj\nfunc a*(self: Test): int16 =\n  return Get[int16](self.tab, self.tab.Pos + 0)\nfunc `a=`*(self: var Test, n: int16): bool =\n  return self.tab.Mutate(self.tab.Pos + 0, n)\nfunc b*(self: Test): int8 =\n  return Get[int8](self.tab, self.tab.Pos + 2)\nfunc `b=`*(self: var Test, n: int8): bool =\n  return self.tab.Mutate(self.tab.Pos + 2, n)\nproc TestCreate*(self: var Builder, a: int16, b: int8): uoffset =\n  self.Prep(2, 4)\n  self.Pad(1)\n  self.Prepend(b)\n  self.Prepend(a)\n  return self.Offset()\n"
  },
  {
    "path": "tests/MyGame/Example/Test.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nnamespace MyGame\\Example;\n\nuse \\Google\\FlatBuffers\\Struct;\nuse \\Google\\FlatBuffers\\Table;\nuse \\Google\\FlatBuffers\\ByteBuffer;\nuse \\Google\\FlatBuffers\\FlatBufferBuilder;\n\nclass Test extends Struct\n{\n    /**\n     * @param int $_i offset\n     * @param ByteBuffer $_bb\n     * @return Test\n     **/\n    public function init($_i, ByteBuffer $_bb)\n    {\n        $this->bb_pos = $_i;\n        $this->bb = $_bb;\n        return $this;\n    }\n\n    /**\n     * @return short\n     */\n    public function GetA()\n    {\n        return $this->bb->getShort($this->bb_pos + 0);\n    }\n\n    /**\n     * @return sbyte\n     */\n    public function GetB()\n    {\n        return $this->bb->getSbyte($this->bb_pos + 2);\n    }\n\n\n    /**\n     * @return int offset\n     */\n    public static function createTest(FlatBufferBuilder $builder, $a, $b)\n    {\n        $builder->prep(2, 4);\n        $builder->pad(1);\n        $builder->putSbyte($b);\n        $builder->putShort($a);\n        return $builder->offset();\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Test.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: Example\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\nclass Test(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def SizeOf(cls):\n        return 4\n\n    # Test\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # Test\n    def A(self): return self._tab.Get(flatbuffers.number_types.Int16Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(0))\n    # Test\n    def B(self): return self._tab.Get(flatbuffers.number_types.Int8Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(2))\n\ndef CreateTest(builder, a, b):\n    builder.Prep(2, 4)\n    builder.Pad(1)\n    builder.PrependInt8(b)\n    builder.PrependInt16(a)\n    return builder.Offset()\n\n\nclass TestT(object):\n\n    # TestT\n    def __init__(\n        self,\n        a = 0,\n        b = 0,\n    ):\n        self.a = a  # type: int\n        self.b = b  # type: int\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        test = Test()\n        test.Init(buf, pos)\n        return cls.InitFromObj(test)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, test):\n        x = TestT()\n        x._UnPack(test)\n        return x\n\n    # TestT\n    def _UnPack(self, test):\n        if test is None:\n            return\n        self.a = test.A()\n        self.b = test.B()\n\n    # TestT\n    def Pack(self, builder):\n        return CreateTest(builder, self.a, self.b)\n"
  },
  {
    "path": "tests/MyGame/Example/TestEnum.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace MyGame.Example\n{\n\n[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]\npublic enum TestEnum : sbyte\n{\n  A = 0,\n  B = 1,\n  C = 2,\n};\n\n\n}\n"
  },
  {
    "path": "tests/MyGame/Example/TestEnum.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\n@SuppressWarnings(\"unused\")\npublic final class TestEnum {\n  private TestEnum() { }\n  public static final byte A = 0;\n  public static final byte B = 1;\n  public static final byte C = 2;\n\n  public static final String[] names = { \"A\", \"B\", \"C\", };\n\n  public static String name(int e) { return names[e]; }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/TestEnum.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example\n\n@Suppress(\"unused\")\nclass TestEnum private constructor() {\n  companion object {\n    const val A: Byte = 0\n    const val B: Byte = 1\n    const val C: Byte = 2\n    val names: Array<String> = arrayOf(\"A\", \"B\", \"C\")\n\n    fun name(e: Int): String = names[e]\n  }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/TestEnum.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: Example\n\nclass TestEnum(object):\n    A = 0\n    B = 1\n    C = 2\n"
  },
  {
    "path": "tests/MyGame/Example/TestEnum.pyi",
    "content": "from __future__ import annotations\n\nimport flatbuffers\nimport numpy as np\n\nimport typing\nfrom typing import cast\n\nuoffset: typing.TypeAlias = flatbuffers.number_types.UOffsetTFlags.py_type\n\nclass TestEnum(object):\n  A = cast(int, ...)\n  B = cast(int, ...)\n  C = cast(int, ...)\n\n"
  },
  {
    "path": "tests/MyGame/Example/TestSimpleTableWithEnum.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace MyGame.Example\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\ninternal partial struct TestSimpleTableWithEnum : IFlatbufferObject\n{\n  private Table __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_25_12_19(); }\n  public static TestSimpleTableWithEnum GetRootAsTestSimpleTableWithEnum(ByteBuffer _bb) { return GetRootAsTestSimpleTableWithEnum(_bb, new TestSimpleTableWithEnum()); }\n  public static TestSimpleTableWithEnum GetRootAsTestSimpleTableWithEnum(ByteBuffer _bb, TestSimpleTableWithEnum obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }\n  public TestSimpleTableWithEnum __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public MyGame.Example.Color Color { get { int o = __p.__offset(4); return o != 0 ? (MyGame.Example.Color)__p.bb.Get(o + __p.bb_pos) : MyGame.Example.Color.Green; } }\n  public bool MutateColor(MyGame.Example.Color color) { int o = __p.__offset(4); if (o != 0) { __p.bb.Put(o + __p.bb_pos, (byte)color); return true; } else { return false; } }\n\n  public static Offset<MyGame.Example.TestSimpleTableWithEnum> CreateTestSimpleTableWithEnum(FlatBufferBuilder builder,\n      MyGame.Example.Color color = MyGame.Example.Color.Green) {\n    builder.StartTable(1);\n    TestSimpleTableWithEnum.AddColor(builder, color);\n    return TestSimpleTableWithEnum.EndTestSimpleTableWithEnum(builder);\n  }\n\n  public static void StartTestSimpleTableWithEnum(FlatBufferBuilder builder) { builder.StartTable(1); }\n  public static void AddColor(FlatBufferBuilder builder, MyGame.Example.Color color) { builder.AddByte(0, (byte)color, 2); }\n  public static Offset<MyGame.Example.TestSimpleTableWithEnum> EndTestSimpleTableWithEnum(FlatBufferBuilder builder) {\n    int o = builder.EndTable();\n    return new Offset<MyGame.Example.TestSimpleTableWithEnum>(o);\n  }\n  public TestSimpleTableWithEnumT UnPack() {\n    var _o = new TestSimpleTableWithEnumT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(TestSimpleTableWithEnumT _o) {\n    _o.Color = this.Color;\n  }\n  public static Offset<MyGame.Example.TestSimpleTableWithEnum> Pack(FlatBufferBuilder builder, TestSimpleTableWithEnumT _o) {\n    if (_o == null) return default(Offset<MyGame.Example.TestSimpleTableWithEnum>);\n    return CreateTestSimpleTableWithEnum(\n      builder,\n      _o.Color);\n  }\n}\n\ninternal partial class TestSimpleTableWithEnumT\n{\n  [Newtonsoft.Json.JsonProperty(\"color\")]\n  public MyGame.Example.Color Color { get; set; }\n\n  public TestSimpleTableWithEnumT() {\n    this.Color = MyGame.Example.Color.Green;\n  }\n}\n\n\nstatic public class TestSimpleTableWithEnumVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos)\n  {\n    return verifier.VerifyTableStart(tablePos)\n      && verifier.VerifyField(tablePos, 4 /*Color*/, 1 /*MyGame.Example.Color*/, 1, false)\n      && verifier.VerifyTableEnd(tablePos);\n  }\n}\n\n}\n"
  },
  {
    "path": "tests/MyGame/Example/TestSimpleTableWithEnum.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage Example\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n)\n\ntype TestSimpleTableWithEnumT struct {\n\tColor Color `json:\"color\"`\n}\n\nfunc (t *TestSimpleTableWithEnumT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\tif t == nil {\n\t\treturn 0\n\t}\n\tTestSimpleTableWithEnumStart(builder)\n\tTestSimpleTableWithEnumAddColor(builder, t.Color)\n\treturn TestSimpleTableWithEnumEnd(builder)\n}\n\nfunc (rcv *TestSimpleTableWithEnum) UnPackTo(t *TestSimpleTableWithEnumT) {\n\tt.Color = rcv.Color()\n}\n\nfunc (rcv *TestSimpleTableWithEnum) UnPack() *TestSimpleTableWithEnumT {\n\tif rcv == nil {\n\t\treturn nil\n\t}\n\tt := &TestSimpleTableWithEnumT{}\n\trcv.UnPackTo(t)\n\treturn t\n}\n\ntype TestSimpleTableWithEnum struct {\n\t_tab flatbuffers.Table\n}\n\nfunc GetRootAsTestSimpleTableWithEnum(buf []byte, offset flatbuffers.UOffsetT) *TestSimpleTableWithEnum {\n\tn := flatbuffers.GetUOffsetT(buf[offset:])\n\tx := &TestSimpleTableWithEnum{}\n\tx.Init(buf, n+offset)\n\treturn x\n}\n\nfunc FinishTestSimpleTableWithEnumBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {\n\tbuilder.Finish(offset)\n}\n\nfunc GetSizePrefixedRootAsTestSimpleTableWithEnum(buf []byte, offset flatbuffers.UOffsetT) *TestSimpleTableWithEnum {\n\tn := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])\n\tx := &TestSimpleTableWithEnum{}\n\tx.Init(buf, n+offset+flatbuffers.SizeUint32)\n\treturn x\n}\n\nfunc FinishSizePrefixedTestSimpleTableWithEnumBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {\n\tbuilder.FinishSizePrefixed(offset)\n}\n\nfunc (rcv *TestSimpleTableWithEnum) Init(buf []byte, i flatbuffers.UOffsetT) {\n\trcv._tab.Bytes = buf\n\trcv._tab.Pos = i\n}\n\nfunc (rcv *TestSimpleTableWithEnum) Table() flatbuffers.Table {\n\treturn rcv._tab\n}\n\nfunc (rcv *TestSimpleTableWithEnum) Color() Color {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(4))\n\tif o != 0 {\n\t\treturn Color(rcv._tab.GetByte(o + rcv._tab.Pos))\n\t}\n\treturn 2\n}\n\nfunc (rcv *TestSimpleTableWithEnum) MutateColor(n Color) bool {\n\treturn rcv._tab.MutateByteSlot(4, byte(n))\n}\n\nfunc TestSimpleTableWithEnumStart(builder *flatbuffers.Builder) {\n\tbuilder.StartObject(1)\n}\nfunc TestSimpleTableWithEnumAddColor(builder *flatbuffers.Builder, color Color) {\n\tbuilder.PrependByteSlot(0, byte(color), 2)\n}\nfunc TestSimpleTableWithEnumEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\treturn builder.EndObject()\n}\n"
  },
  {
    "path": "tests/MyGame/Example/TestSimpleTableWithEnum.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\nfinal class TestSimpleTableWithEnum extends com.google.flatbuffers.Table {\n  public static void ValidateVersion() { Constants.FLATBUFFERS_25_12_19(); }\n  public static TestSimpleTableWithEnum getRootAsTestSimpleTableWithEnum(ByteBuffer _bb) { return getRootAsTestSimpleTableWithEnum(_bb, new TestSimpleTableWithEnum()); }\n  public static TestSimpleTableWithEnum getRootAsTestSimpleTableWithEnum(ByteBuffer _bb, TestSimpleTableWithEnum obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public TestSimpleTableWithEnum __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public int color() { int o = __offset(4); return o != 0 ? bb.get(o + bb_pos) & 0xFF : 2; }\n  public boolean mutateColor(int color) { int o = __offset(4); if (o != 0) { bb.put(o + bb_pos, (byte) color); return true; } else { return false; } }\n\n  public static int createTestSimpleTableWithEnum(FlatBufferBuilder builder,\n      int color) {\n    builder.startTable(1);\n    TestSimpleTableWithEnum.addColor(builder, color);\n    return TestSimpleTableWithEnum.endTestSimpleTableWithEnum(builder);\n  }\n\n  public static void startTestSimpleTableWithEnum(FlatBufferBuilder builder) { builder.startTable(1); }\n  public static void addColor(FlatBufferBuilder builder, int color) { builder.addByte(0, (byte) color, (byte) 2); }\n  public static int endTestSimpleTableWithEnum(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    return o;\n  }\n\n  static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public TestSimpleTableWithEnum get(int j) { return get(new TestSimpleTableWithEnum(), j); }\n    public TestSimpleTableWithEnum get(TestSimpleTableWithEnum obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); }\n  }\n  public TestSimpleTableWithEnumT unpack() {\n    TestSimpleTableWithEnumT _o = new TestSimpleTableWithEnumT();\n    unpackTo(_o);\n    return _o;\n  }\n  public void unpackTo(TestSimpleTableWithEnumT _o) {\n    int _oColor = color();\n    _o.setColor(_oColor);\n  }\n  public static int pack(FlatBufferBuilder builder, TestSimpleTableWithEnumT _o) {\n    if (_o == null) return 0;\n    return createTestSimpleTableWithEnum(\n      builder,\n      _o.getColor());\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/TestSimpleTableWithEnum.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example\n\nimport com.google.flatbuffers.BaseVector\nimport com.google.flatbuffers.BooleanVector\nimport com.google.flatbuffers.ByteVector\nimport com.google.flatbuffers.Constants\nimport com.google.flatbuffers.DoubleVector\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.FloatVector\nimport com.google.flatbuffers.LongVector\nimport com.google.flatbuffers.StringVector\nimport com.google.flatbuffers.Struct\nimport com.google.flatbuffers.Table\nimport com.google.flatbuffers.UnionVector\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport kotlin.math.sign\n\n@Suppress(\"unused\")\nclass TestSimpleTableWithEnum : Table() {\n\n    fun __init(_i: Int, _bb: ByteBuffer)  {\n        __reset(_i, _bb)\n    }\n    fun __assign(_i: Int, _bb: ByteBuffer) : TestSimpleTableWithEnum {\n        __init(_i, _bb)\n        return this\n    }\n    val color : UByte\n        get() {\n            val o = __offset(4)\n            return if(o != 0) bb.get(o + bb_pos).toUByte() else 2u\n        }\n    fun mutateColor(color: UByte) : Boolean {\n        val o = __offset(4)\n        return if (o != 0) {\n            bb.put(o + bb_pos, color.toByte())\n            true\n        } else {\n            false\n        }\n    }\n    companion object {\n        fun validateVersion() = Constants.FLATBUFFERS_25_12_19()\n        fun getRootAsTestSimpleTableWithEnum(_bb: ByteBuffer): TestSimpleTableWithEnum = getRootAsTestSimpleTableWithEnum(_bb, TestSimpleTableWithEnum())\n        fun getRootAsTestSimpleTableWithEnum(_bb: ByteBuffer, obj: TestSimpleTableWithEnum): TestSimpleTableWithEnum {\n            _bb.order(ByteOrder.LITTLE_ENDIAN)\n            return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb))\n        }\n        fun createTestSimpleTableWithEnum(builder: FlatBufferBuilder, color: UByte) : Int {\n            builder.startTable(1)\n            addColor(builder, color)\n            return endTestSimpleTableWithEnum(builder)\n        }\n        fun startTestSimpleTableWithEnum(builder: FlatBufferBuilder) = builder.startTable(1)\n        fun addColor(builder: FlatBufferBuilder, color: UByte) = builder.addByte(0, color.toByte(), 2)\n        fun endTestSimpleTableWithEnum(builder: FlatBufferBuilder) : Int {\n            val o = builder.endTable()\n            return o\n        }\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/TestSimpleTableWithEnum.lua",
    "content": "--[[ MyGame.Example.TestSimpleTableWithEnum\n\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : //monster_test.fbs\n  Rooting type : MyGame.Example.Monster (//monster_test.fbs)\n\n--]]\n\nlocal flatbuffers = require('flatbuffers')\n\nlocal TestSimpleTableWithEnum = {}\nlocal mt = {}\n\nfunction TestSimpleTableWithEnum.New()\n  local o = {}\n  setmetatable(o, {__index = mt})\n  return o\nend\n\nfunction mt:Init(buf, pos)\n  self.view = flatbuffers.view.New(buf, pos)\nend\n\nfunction mt:Color()\n  local o = self.view:Offset(4)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Uint8, self.view.pos + o)\n  end\n  return 2\nend\n\nfunction TestSimpleTableWithEnum.Start(builder)\n  builder:StartObject(1)\nend\n\nfunction TestSimpleTableWithEnum.AddColor(builder, color)\n  builder:PrependUint8Slot(0, color, 2)\nend\n\nfunction TestSimpleTableWithEnum.End(builder)\n  return builder:EndObject()\nend\n\nreturn TestSimpleTableWithEnum"
  },
  {
    "path": "tests/MyGame/Example/TestSimpleTableWithEnum.nim",
    "content": "#[ MyGame.Example.TestSimpleTableWithEnum\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : \n  Rooting type : MyGame.Example.Monster ()\n]#\n\nimport Color as MyGame_Example_Color\nimport flatbuffers\n\ntype TestSimpleTableWithEnum* = object of FlatObj\nfunc color*(self: TestSimpleTableWithEnum): MyGame_Example_Color.Color =\n  let o = self.tab.Offset(4)\n  if o != 0:\n    return MyGame_Example_Color.Color(Get[uint8](self.tab, self.tab.Pos + o))\n  return type(result)(2)\nfunc `color=`*(self: var TestSimpleTableWithEnum, n: MyGame_Example_Color.Color): bool =\n  return self.tab.MutateSlot(4, n)\nproc TestSimpleTableWithEnumStart*(builder: var Builder) =\n  builder.StartObject(1)\nproc TestSimpleTableWithEnumAddcolor*(builder: var Builder, color: uint8) =\n  builder.PrependSlot(0, color, default(uint8))\nproc TestSimpleTableWithEnumEnd*(builder: var Builder): uoffset =\n  return builder.EndObject()\n"
  },
  {
    "path": "tests/MyGame/Example/TestSimpleTableWithEnum.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nnamespace MyGame\\Example;\n\nuse \\Google\\FlatBuffers\\Struct;\nuse \\Google\\FlatBuffers\\Table;\nuse \\Google\\FlatBuffers\\ByteBuffer;\nuse \\Google\\FlatBuffers\\FlatBufferBuilder;\n\nclass TestSimpleTableWithEnum extends Table\n{\n    /**\n     * @param ByteBuffer $bb\n     * @return TestSimpleTableWithEnum\n     */\n    public static function getRootAsTestSimpleTableWithEnum(ByteBuffer $bb)\n    {\n        $obj = new TestSimpleTableWithEnum();\n        return ($obj->init($bb->getInt($bb->getPosition()) + $bb->getPosition(), $bb));\n    }\n\n    public static function TestSimpleTableWithEnumIdentifier()\n    {\n        return \"MONS\";\n    }\n\n    public static function TestSimpleTableWithEnumBufferHasIdentifier(ByteBuffer $buf)\n    {\n        return self::__has_identifier($buf, self::TestSimpleTableWithEnumIdentifier());\n    }\n\n    public static function TestSimpleTableWithEnumExtension()\n    {\n        return \"mon\";\n    }\n\n    /**\n     * @param int $_i offset\n     * @param ByteBuffer $_bb\n     * @return TestSimpleTableWithEnum\n     **/\n    public function init($_i, ByteBuffer $_bb)\n    {\n        $this->bb_pos = $_i;\n        $this->bb = $_bb;\n        return $this;\n    }\n\n    /**\n     * @return byte\n     */\n    public function getColor()\n    {\n        $o = $this->__offset(4);\n        return $o != 0 ? $this->bb->getByte($o + $this->bb_pos) : \\MyGame\\Example\\Color::Green;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return void\n     */\n    public static function startTestSimpleTableWithEnum(FlatBufferBuilder $builder)\n    {\n        $builder->StartObject(1);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return TestSimpleTableWithEnum\n     */\n    public static function createTestSimpleTableWithEnum(FlatBufferBuilder $builder, $color)\n    {\n        $builder->startObject(1);\n        self::addColor($builder, $color);\n        $o = $builder->endObject();\n        return $o;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param byte\n     * @return void\n     */\n    public static function addColor(FlatBufferBuilder $builder, $color)\n    {\n        $builder->addByteX(0, $color, 2);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return int table offset\n     */\n    public static function endTestSimpleTableWithEnum(FlatBufferBuilder $builder)\n    {\n        $o = $builder->endObject();\n        return $o;\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/TestSimpleTableWithEnum.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: Example\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\nclass TestSimpleTableWithEnum(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = TestSimpleTableWithEnum()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsTestSimpleTableWithEnum(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    @classmethod\n    def TestSimpleTableWithEnumBufferHasIdentifier(cls, buf, offset, size_prefixed=False):\n        return flatbuffers.util.BufferHasIdentifier(buf, offset, b\"\\x4D\\x4F\\x4E\\x53\", size_prefixed=size_prefixed)\n\n    # TestSimpleTableWithEnum\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # TestSimpleTableWithEnum\n    def Color(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos)\n        return 2\n\ndef TestSimpleTableWithEnumStart(builder):\n    builder.StartObject(1)\n\ndef Start(builder):\n    TestSimpleTableWithEnumStart(builder)\n\ndef TestSimpleTableWithEnumAddColor(builder, color):\n    builder.PrependUint8Slot(0, color, 2)\n\ndef AddColor(builder, color):\n    TestSimpleTableWithEnumAddColor(builder, color)\n\ndef TestSimpleTableWithEnumEnd(builder):\n    return builder.EndObject()\n\ndef End(builder):\n    return TestSimpleTableWithEnumEnd(builder)\n\n\nclass TestSimpleTableWithEnumT(object):\n\n    # TestSimpleTableWithEnumT\n    def __init__(\n        self,\n        color = 2,\n    ):\n        self.color = color  # type: int\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        testSimpleTableWithEnum = TestSimpleTableWithEnum()\n        testSimpleTableWithEnum.Init(buf, pos)\n        return cls.InitFromObj(testSimpleTableWithEnum)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, testSimpleTableWithEnum):\n        x = TestSimpleTableWithEnumT()\n        x._UnPack(testSimpleTableWithEnum)\n        return x\n\n    # TestSimpleTableWithEnumT\n    def _UnPack(self, testSimpleTableWithEnum):\n        if testSimpleTableWithEnum is None:\n            return\n        self.color = testSimpleTableWithEnum.Color()\n\n    # TestSimpleTableWithEnumT\n    def Pack(self, builder):\n        TestSimpleTableWithEnumStart(builder)\n        TestSimpleTableWithEnumAddColor(builder, self.color)\n        testSimpleTableWithEnum = TestSimpleTableWithEnumEnd(builder)\n        return testSimpleTableWithEnum\n"
  },
  {
    "path": "tests/MyGame/Example/TestSimpleTableWithEnumT.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\nclass TestSimpleTableWithEnumT {\n  private int color;\n\n  public int getColor() { return color; }\n\n  public void setColor(int color) { this.color = color; }\n\n\n  public TestSimpleTableWithEnumT() {\n    this.color = 2;\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/TestT.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\npublic class TestT {\n  private short a;\n  private byte b;\n\n  public short getA() { return a; }\n\n  public void setA(short a) { this.a = a; }\n\n  public byte getB() { return b; }\n\n  public void setB(byte b) { this.b = b; }\n\n\n  public TestT() {\n    this.a = 0;\n    this.b = 0;\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/TypeAliases.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace MyGame.Example\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct TypeAliases : IFlatbufferObject\n{\n  private Table __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_25_12_19(); }\n  public static TypeAliases GetRootAsTypeAliases(ByteBuffer _bb) { return GetRootAsTypeAliases(_bb, new TypeAliases()); }\n  public static TypeAliases GetRootAsTypeAliases(ByteBuffer _bb, TypeAliases obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }\n  public TypeAliases __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public sbyte I8 { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetSbyte(o + __p.bb_pos) : (sbyte)0; } }\n  public bool MutateI8(sbyte i8) { int o = __p.__offset(4); if (o != 0) { __p.bb.PutSbyte(o + __p.bb_pos, i8); return true; } else { return false; } }\n  public byte U8 { get { int o = __p.__offset(6); return o != 0 ? __p.bb.Get(o + __p.bb_pos) : (byte)0; } }\n  public bool MutateU8(byte u8) { int o = __p.__offset(6); if (o != 0) { __p.bb.Put(o + __p.bb_pos, u8); return true; } else { return false; } }\n  public short I16 { get { int o = __p.__offset(8); return o != 0 ? __p.bb.GetShort(o + __p.bb_pos) : (short)0; } }\n  public bool MutateI16(short i16) { int o = __p.__offset(8); if (o != 0) { __p.bb.PutShort(o + __p.bb_pos, i16); return true; } else { return false; } }\n  public ushort U16 { get { int o = __p.__offset(10); return o != 0 ? __p.bb.GetUshort(o + __p.bb_pos) : (ushort)0; } }\n  public bool MutateU16(ushort u16) { int o = __p.__offset(10); if (o != 0) { __p.bb.PutUshort(o + __p.bb_pos, u16); return true; } else { return false; } }\n  public int I32 { get { int o = __p.__offset(12); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } }\n  public bool MutateI32(int i32) { int o = __p.__offset(12); if (o != 0) { __p.bb.PutInt(o + __p.bb_pos, i32); return true; } else { return false; } }\n  public uint U32 { get { int o = __p.__offset(14); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }\n  public bool MutateU32(uint u32) { int o = __p.__offset(14); if (o != 0) { __p.bb.PutUint(o + __p.bb_pos, u32); return true; } else { return false; } }\n  public long I64 { get { int o = __p.__offset(16); return o != 0 ? __p.bb.GetLong(o + __p.bb_pos) : (long)0; } }\n  public bool MutateI64(long i64) { int o = __p.__offset(16); if (o != 0) { __p.bb.PutLong(o + __p.bb_pos, i64); return true; } else { return false; } }\n  public ulong U64 { get { int o = __p.__offset(18); return o != 0 ? __p.bb.GetUlong(o + __p.bb_pos) : (ulong)0; } }\n  public bool MutateU64(ulong u64) { int o = __p.__offset(18); if (o != 0) { __p.bb.PutUlong(o + __p.bb_pos, u64); return true; } else { return false; } }\n  public float F32 { get { int o = __p.__offset(20); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)0.0f; } }\n  public bool MutateF32(float f32) { int o = __p.__offset(20); if (o != 0) { __p.bb.PutFloat(o + __p.bb_pos, f32); return true; } else { return false; } }\n  public double F64 { get { int o = __p.__offset(22); return o != 0 ? __p.bb.GetDouble(o + __p.bb_pos) : (double)0.0; } }\n  public bool MutateF64(double f64) { int o = __p.__offset(22); if (o != 0) { __p.bb.PutDouble(o + __p.bb_pos, f64); return true; } else { return false; } }\n  public sbyte V8(int j) { int o = __p.__offset(24); return o != 0 ? __p.bb.GetSbyte(__p.__vector(o) + j * 1) : (sbyte)0; }\n  public int V8Length { get { int o = __p.__offset(24); return o != 0 ? __p.__vector_len(o) : 0; } }\n#if ENABLE_SPAN_T\n  public Span<sbyte> GetV8Bytes() { return __p.__vector_as_span<sbyte>(24, 1); }\n#else\n  public ArraySegment<byte>? GetV8Bytes() { return __p.__vector_as_arraysegment(24); }\n#endif\n  public sbyte[] GetV8Array() { return __p.__vector_as_array<sbyte>(24); }\n  public bool MutateV8(int j, sbyte v8) { int o = __p.__offset(24); if (o != 0) { __p.bb.PutSbyte(__p.__vector(o) + j * 1, v8); return true; } else { return false; } }\n  public double Vf64(int j) { int o = __p.__offset(26); return o != 0 ? __p.bb.GetDouble(__p.__vector(o) + j * 8) : (double)0; }\n  public int Vf64Length { get { int o = __p.__offset(26); return o != 0 ? __p.__vector_len(o) : 0; } }\n#if ENABLE_SPAN_T\n  public Span<double> GetVf64Bytes() { return __p.__vector_as_span<double>(26, 8); }\n#else\n  public ArraySegment<byte>? GetVf64Bytes() { return __p.__vector_as_arraysegment(26); }\n#endif\n  public double[] GetVf64Array() { return __p.__vector_as_array<double>(26); }\n  public bool MutateVf64(int j, double vf64) { int o = __p.__offset(26); if (o != 0) { __p.bb.PutDouble(__p.__vector(o) + j * 8, vf64); return true; } else { return false; } }\n\n  public static Offset<MyGame.Example.TypeAliases> CreateTypeAliases(FlatBufferBuilder builder,\n      sbyte i8 = 0,\n      byte u8 = 0,\n      short i16 = 0,\n      ushort u16 = 0,\n      int i32 = 0,\n      uint u32 = 0,\n      long i64 = 0,\n      ulong u64 = 0,\n      float f32 = 0.0f,\n      double f64 = 0.0,\n      VectorOffset v8Offset = default(VectorOffset),\n      VectorOffset vf64Offset = default(VectorOffset)) {\n    builder.StartTable(12);\n    TypeAliases.AddF64(builder, f64);\n    TypeAliases.AddU64(builder, u64);\n    TypeAliases.AddI64(builder, i64);\n    TypeAliases.AddVf64(builder, vf64Offset);\n    TypeAliases.AddV8(builder, v8Offset);\n    TypeAliases.AddF32(builder, f32);\n    TypeAliases.AddU32(builder, u32);\n    TypeAliases.AddI32(builder, i32);\n    TypeAliases.AddU16(builder, u16);\n    TypeAliases.AddI16(builder, i16);\n    TypeAliases.AddU8(builder, u8);\n    TypeAliases.AddI8(builder, i8);\n    return TypeAliases.EndTypeAliases(builder);\n  }\n\n  public static void StartTypeAliases(FlatBufferBuilder builder) { builder.StartTable(12); }\n  public static void AddI8(FlatBufferBuilder builder, sbyte i8) { builder.AddSbyte(0, i8, 0); }\n  public static void AddU8(FlatBufferBuilder builder, byte u8) { builder.AddByte(1, u8, 0); }\n  public static void AddI16(FlatBufferBuilder builder, short i16) { builder.AddShort(2, i16, 0); }\n  public static void AddU16(FlatBufferBuilder builder, ushort u16) { builder.AddUshort(3, u16, 0); }\n  public static void AddI32(FlatBufferBuilder builder, int i32) { builder.AddInt(4, i32, 0); }\n  public static void AddU32(FlatBufferBuilder builder, uint u32) { builder.AddUint(5, u32, 0); }\n  public static void AddI64(FlatBufferBuilder builder, long i64) { builder.AddLong(6, i64, 0); }\n  public static void AddU64(FlatBufferBuilder builder, ulong u64) { builder.AddUlong(7, u64, 0); }\n  public static void AddF32(FlatBufferBuilder builder, float f32) { builder.AddFloat(8, f32, 0.0f); }\n  public static void AddF64(FlatBufferBuilder builder, double f64) { builder.AddDouble(9, f64, 0.0); }\n  public static void AddV8(FlatBufferBuilder builder, VectorOffset v8Offset) { builder.AddOffset(10, v8Offset.Value, 0); }\n  public static VectorOffset CreateV8Vector(FlatBufferBuilder builder, sbyte[] data) { builder.StartVector(1, data.Length, 1); for (int i = data.Length - 1; i >= 0; i--) builder.AddSbyte(data[i]); return builder.EndVector(); }\n  public static VectorOffset CreateV8VectorBlock(FlatBufferBuilder builder, sbyte[] data) { builder.StartVector(1, data.Length, 1); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateV8VectorBlock(FlatBufferBuilder builder, ArraySegment<sbyte> data) { builder.StartVector(1, data.Count, 1); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateV8VectorBlock(FlatBufferBuilder builder, IntPtr dataPtr, int sizeInBytes) { builder.StartVector(1, sizeInBytes, 1); builder.Add<sbyte>(dataPtr, sizeInBytes); return builder.EndVector(); }\n  public static void StartV8Vector(FlatBufferBuilder builder, int numElems) { builder.StartVector(1, numElems, 1); }\n  public static void AddVf64(FlatBufferBuilder builder, VectorOffset vf64Offset) { builder.AddOffset(11, vf64Offset.Value, 0); }\n  public static VectorOffset CreateVf64Vector(FlatBufferBuilder builder, double[] data) { builder.StartVector(8, data.Length, 8); for (int i = data.Length - 1; i >= 0; i--) builder.AddDouble(data[i]); return builder.EndVector(); }\n  public static VectorOffset CreateVf64VectorBlock(FlatBufferBuilder builder, double[] data) { builder.StartVector(8, data.Length, 8); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateVf64VectorBlock(FlatBufferBuilder builder, ArraySegment<double> data) { builder.StartVector(8, data.Count, 8); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateVf64VectorBlock(FlatBufferBuilder builder, IntPtr dataPtr, int sizeInBytes) { builder.StartVector(1, sizeInBytes, 1); builder.Add<double>(dataPtr, sizeInBytes); return builder.EndVector(); }\n  public static void StartVf64Vector(FlatBufferBuilder builder, int numElems) { builder.StartVector(8, numElems, 8); }\n  public static Offset<MyGame.Example.TypeAliases> EndTypeAliases(FlatBufferBuilder builder) {\n    int o = builder.EndTable();\n    return new Offset<MyGame.Example.TypeAliases>(o);\n  }\n  public TypeAliasesT UnPack() {\n    var _o = new TypeAliasesT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(TypeAliasesT _o) {\n    _o.I8 = this.I8;\n    _o.U8 = this.U8;\n    _o.I16 = this.I16;\n    _o.U16 = this.U16;\n    _o.I32 = this.I32;\n    _o.U32 = this.U32;\n    _o.I64 = this.I64;\n    _o.U64 = this.U64;\n    _o.F32 = this.F32;\n    _o.F64 = this.F64;\n    _o.V8 = new List<sbyte>();\n    for (var _j = 0; _j < this.V8Length; ++_j) {_o.V8.Add(this.V8(_j));}\n    _o.Vf64 = new List<double>();\n    for (var _j = 0; _j < this.Vf64Length; ++_j) {_o.Vf64.Add(this.Vf64(_j));}\n  }\n  public static Offset<MyGame.Example.TypeAliases> Pack(FlatBufferBuilder builder, TypeAliasesT _o) {\n    if (_o == null) return default(Offset<MyGame.Example.TypeAliases>);\n    var _v8 = default(VectorOffset);\n    if (_o.V8 != null) {\n      var __v8 = _o.V8.ToArray();\n      _v8 = CreateV8Vector(builder, __v8);\n    }\n    var _vf64 = default(VectorOffset);\n    if (_o.Vf64 != null) {\n      var __vf64 = _o.Vf64.ToArray();\n      _vf64 = CreateVf64Vector(builder, __vf64);\n    }\n    return CreateTypeAliases(\n      builder,\n      _o.I8,\n      _o.U8,\n      _o.I16,\n      _o.U16,\n      _o.I32,\n      _o.U32,\n      _o.I64,\n      _o.U64,\n      _o.F32,\n      _o.F64,\n      _v8,\n      _vf64);\n  }\n}\n\npublic class TypeAliasesT\n{\n  [Newtonsoft.Json.JsonProperty(\"i8\")]\n  public sbyte I8 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"u8\")]\n  public byte U8 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"i16\")]\n  public short I16 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"u16\")]\n  public ushort U16 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"i32\")]\n  public int I32 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"u32\")]\n  public uint U32 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"i64\")]\n  public long I64 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"u64\")]\n  public ulong U64 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"f32\")]\n  public float F32 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"f64\")]\n  public double F64 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"v8\")]\n  public List<sbyte> V8 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"vf64\")]\n  public List<double> Vf64 { get; set; }\n\n  public TypeAliasesT() {\n    this.I8 = 0;\n    this.U8 = 0;\n    this.I16 = 0;\n    this.U16 = 0;\n    this.I32 = 0;\n    this.U32 = 0;\n    this.I64 = 0;\n    this.U64 = 0;\n    this.F32 = 0.0f;\n    this.F64 = 0.0;\n    this.V8 = null;\n    this.Vf64 = null;\n  }\n}\n\n\nstatic public class TypeAliasesVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos)\n  {\n    return verifier.VerifyTableStart(tablePos)\n      && verifier.VerifyField(tablePos, 4 /*I8*/, 1 /*sbyte*/, 1, false)\n      && verifier.VerifyField(tablePos, 6 /*U8*/, 1 /*byte*/, 1, false)\n      && verifier.VerifyField(tablePos, 8 /*I16*/, 2 /*short*/, 2, false)\n      && verifier.VerifyField(tablePos, 10 /*U16*/, 2 /*ushort*/, 2, false)\n      && verifier.VerifyField(tablePos, 12 /*I32*/, 4 /*int*/, 4, false)\n      && verifier.VerifyField(tablePos, 14 /*U32*/, 4 /*uint*/, 4, false)\n      && verifier.VerifyField(tablePos, 16 /*I64*/, 8 /*long*/, 8, false)\n      && verifier.VerifyField(tablePos, 18 /*U64*/, 8 /*ulong*/, 8, false)\n      && verifier.VerifyField(tablePos, 20 /*F32*/, 4 /*float*/, 4, false)\n      && verifier.VerifyField(tablePos, 22 /*F64*/, 8 /*double*/, 8, false)\n      && verifier.VerifyVectorOfData(tablePos, 24 /*V8*/, 1 /*sbyte*/, false)\n      && verifier.VerifyVectorOfData(tablePos, 26 /*Vf64*/, 8 /*double*/, false)\n      && verifier.VerifyTableEnd(tablePos);\n  }\n}\n\n}\n"
  },
  {
    "path": "tests/MyGame/Example/TypeAliases.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage Example\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n)\n\ntype TypeAliasesT struct {\n\tI8 int8 `json:\"i8\"`\n\tU8 byte `json:\"u8\"`\n\tI16 int16 `json:\"i16\"`\n\tU16 uint16 `json:\"u16\"`\n\tI32 int32 `json:\"i32\"`\n\tU32 uint32 `json:\"u32\"`\n\tI64 int64 `json:\"i64\"`\n\tU64 uint64 `json:\"u64\"`\n\tF32 float32 `json:\"f32\"`\n\tF64 float64 `json:\"f64\"`\n\tV8 []int8 `json:\"v8\"`\n\tVf64 []float64 `json:\"vf64\"`\n}\n\nfunc (t *TypeAliasesT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\tif t == nil {\n\t\treturn 0\n\t}\n\tv8Offset := flatbuffers.UOffsetT(0)\n\tif t.V8 != nil {\n\t\tv8Length := len(t.V8)\n\t\tTypeAliasesStartV8Vector(builder, v8Length)\n\t\tfor j := v8Length - 1; j >= 0; j-- {\n\t\t\tbuilder.PrependInt8(t.V8[j])\n\t\t}\n\t\tv8Offset = builder.EndVector(v8Length)\n\t}\n\tvf64Offset := flatbuffers.UOffsetT(0)\n\tif t.Vf64 != nil {\n\t\tvf64Length := len(t.Vf64)\n\t\tTypeAliasesStartVf64Vector(builder, vf64Length)\n\t\tfor j := vf64Length - 1; j >= 0; j-- {\n\t\t\tbuilder.PrependFloat64(t.Vf64[j])\n\t\t}\n\t\tvf64Offset = builder.EndVector(vf64Length)\n\t}\n\tTypeAliasesStart(builder)\n\tTypeAliasesAddI8(builder, t.I8)\n\tTypeAliasesAddU8(builder, t.U8)\n\tTypeAliasesAddI16(builder, t.I16)\n\tTypeAliasesAddU16(builder, t.U16)\n\tTypeAliasesAddI32(builder, t.I32)\n\tTypeAliasesAddU32(builder, t.U32)\n\tTypeAliasesAddI64(builder, t.I64)\n\tTypeAliasesAddU64(builder, t.U64)\n\tTypeAliasesAddF32(builder, t.F32)\n\tTypeAliasesAddF64(builder, t.F64)\n\tTypeAliasesAddV8(builder, v8Offset)\n\tTypeAliasesAddVf64(builder, vf64Offset)\n\treturn TypeAliasesEnd(builder)\n}\n\nfunc (rcv *TypeAliases) UnPackTo(t *TypeAliasesT) {\n\tt.I8 = rcv.I8()\n\tt.U8 = rcv.U8()\n\tt.I16 = rcv.I16()\n\tt.U16 = rcv.U16()\n\tt.I32 = rcv.I32()\n\tt.U32 = rcv.U32()\n\tt.I64 = rcv.I64()\n\tt.U64 = rcv.U64()\n\tt.F32 = rcv.F32()\n\tt.F64 = rcv.F64()\n\tv8Length := rcv.V8Length()\n\tt.V8 = make([]int8, v8Length)\n\tfor j := 0; j < v8Length; j++ {\n\t\tt.V8[j] = rcv.V8(j)\n\t}\n\tvf64Length := rcv.Vf64Length()\n\tt.Vf64 = make([]float64, vf64Length)\n\tfor j := 0; j < vf64Length; j++ {\n\t\tt.Vf64[j] = rcv.Vf64(j)\n\t}\n}\n\nfunc (rcv *TypeAliases) UnPack() *TypeAliasesT {\n\tif rcv == nil {\n\t\treturn nil\n\t}\n\tt := &TypeAliasesT{}\n\trcv.UnPackTo(t)\n\treturn t\n}\n\ntype TypeAliases struct {\n\t_tab flatbuffers.Table\n}\n\nfunc GetRootAsTypeAliases(buf []byte, offset flatbuffers.UOffsetT) *TypeAliases {\n\tn := flatbuffers.GetUOffsetT(buf[offset:])\n\tx := &TypeAliases{}\n\tx.Init(buf, n+offset)\n\treturn x\n}\n\nfunc FinishTypeAliasesBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {\n\tbuilder.Finish(offset)\n}\n\nfunc GetSizePrefixedRootAsTypeAliases(buf []byte, offset flatbuffers.UOffsetT) *TypeAliases {\n\tn := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])\n\tx := &TypeAliases{}\n\tx.Init(buf, n+offset+flatbuffers.SizeUint32)\n\treturn x\n}\n\nfunc FinishSizePrefixedTypeAliasesBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {\n\tbuilder.FinishSizePrefixed(offset)\n}\n\nfunc (rcv *TypeAliases) Init(buf []byte, i flatbuffers.UOffsetT) {\n\trcv._tab.Bytes = buf\n\trcv._tab.Pos = i\n}\n\nfunc (rcv *TypeAliases) Table() flatbuffers.Table {\n\treturn rcv._tab\n}\n\nfunc (rcv *TypeAliases) I8() int8 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(4))\n\tif o != 0 {\n\t\treturn rcv._tab.GetInt8(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *TypeAliases) MutateI8(n int8) bool {\n\treturn rcv._tab.MutateInt8Slot(4, n)\n}\n\nfunc (rcv *TypeAliases) U8() byte {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(6))\n\tif o != 0 {\n\t\treturn rcv._tab.GetByte(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *TypeAliases) MutateU8(n byte) bool {\n\treturn rcv._tab.MutateByteSlot(6, n)\n}\n\nfunc (rcv *TypeAliases) I16() int16 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(8))\n\tif o != 0 {\n\t\treturn rcv._tab.GetInt16(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *TypeAliases) MutateI16(n int16) bool {\n\treturn rcv._tab.MutateInt16Slot(8, n)\n}\n\nfunc (rcv *TypeAliases) U16() uint16 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(10))\n\tif o != 0 {\n\t\treturn rcv._tab.GetUint16(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *TypeAliases) MutateU16(n uint16) bool {\n\treturn rcv._tab.MutateUint16Slot(10, n)\n}\n\nfunc (rcv *TypeAliases) I32() int32 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(12))\n\tif o != 0 {\n\t\treturn rcv._tab.GetInt32(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *TypeAliases) MutateI32(n int32) bool {\n\treturn rcv._tab.MutateInt32Slot(12, n)\n}\n\nfunc (rcv *TypeAliases) U32() uint32 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(14))\n\tif o != 0 {\n\t\treturn rcv._tab.GetUint32(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *TypeAliases) MutateU32(n uint32) bool {\n\treturn rcv._tab.MutateUint32Slot(14, n)\n}\n\nfunc (rcv *TypeAliases) I64() int64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(16))\n\tif o != 0 {\n\t\treturn rcv._tab.GetInt64(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *TypeAliases) MutateI64(n int64) bool {\n\treturn rcv._tab.MutateInt64Slot(16, n)\n}\n\nfunc (rcv *TypeAliases) U64() uint64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(18))\n\tif o != 0 {\n\t\treturn rcv._tab.GetUint64(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *TypeAliases) MutateU64(n uint64) bool {\n\treturn rcv._tab.MutateUint64Slot(18, n)\n}\n\nfunc (rcv *TypeAliases) F32() float32 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(20))\n\tif o != 0 {\n\t\treturn rcv._tab.GetFloat32(o + rcv._tab.Pos)\n\t}\n\treturn 0.0\n}\n\nfunc (rcv *TypeAliases) MutateF32(n float32) bool {\n\treturn rcv._tab.MutateFloat32Slot(20, n)\n}\n\nfunc (rcv *TypeAliases) F64() float64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(22))\n\tif o != 0 {\n\t\treturn rcv._tab.GetFloat64(o + rcv._tab.Pos)\n\t}\n\treturn 0.0\n}\n\nfunc (rcv *TypeAliases) MutateF64(n float64) bool {\n\treturn rcv._tab.MutateFloat64Slot(22, n)\n}\n\nfunc (rcv *TypeAliases) V8(j int) int8 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(24))\n\tif o != 0 {\n\t\ta := rcv._tab.Vector(o)\n\t\treturn rcv._tab.GetInt8(a + flatbuffers.UOffsetT(j*1))\n\t}\n\treturn 0\n}\n\nfunc (rcv *TypeAliases) V8Length() int {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(24))\n\tif o != 0 {\n\t\treturn rcv._tab.VectorLen(o)\n\t}\n\treturn 0\n}\n\nfunc (rcv *TypeAliases) MutateV8(j int, n int8) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(24))\n\tif o != 0 {\n\t\ta := rcv._tab.Vector(o)\n\t\treturn rcv._tab.MutateInt8(a+flatbuffers.UOffsetT(j*1), n)\n\t}\n\treturn false\n}\n\nfunc (rcv *TypeAliases) Vf64(j int) float64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(26))\n\tif o != 0 {\n\t\ta := rcv._tab.Vector(o)\n\t\treturn rcv._tab.GetFloat64(a + flatbuffers.UOffsetT(j*8))\n\t}\n\treturn 0\n}\n\nfunc (rcv *TypeAliases) Vf64Length() int {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(26))\n\tif o != 0 {\n\t\treturn rcv._tab.VectorLen(o)\n\t}\n\treturn 0\n}\n\nfunc (rcv *TypeAliases) MutateVf64(j int, n float64) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(26))\n\tif o != 0 {\n\t\ta := rcv._tab.Vector(o)\n\t\treturn rcv._tab.MutateFloat64(a+flatbuffers.UOffsetT(j*8), n)\n\t}\n\treturn false\n}\n\nfunc TypeAliasesStart(builder *flatbuffers.Builder) {\n\tbuilder.StartObject(12)\n}\nfunc TypeAliasesAddI8(builder *flatbuffers.Builder, i8 int8) {\n\tbuilder.PrependInt8Slot(0, i8, 0)\n}\nfunc TypeAliasesAddU8(builder *flatbuffers.Builder, u8 byte) {\n\tbuilder.PrependByteSlot(1, u8, 0)\n}\nfunc TypeAliasesAddI16(builder *flatbuffers.Builder, i16 int16) {\n\tbuilder.PrependInt16Slot(2, i16, 0)\n}\nfunc TypeAliasesAddU16(builder *flatbuffers.Builder, u16 uint16) {\n\tbuilder.PrependUint16Slot(3, u16, 0)\n}\nfunc TypeAliasesAddI32(builder *flatbuffers.Builder, i32 int32) {\n\tbuilder.PrependInt32Slot(4, i32, 0)\n}\nfunc TypeAliasesAddU32(builder *flatbuffers.Builder, u32 uint32) {\n\tbuilder.PrependUint32Slot(5, u32, 0)\n}\nfunc TypeAliasesAddI64(builder *flatbuffers.Builder, i64 int64) {\n\tbuilder.PrependInt64Slot(6, i64, 0)\n}\nfunc TypeAliasesAddU64(builder *flatbuffers.Builder, u64 uint64) {\n\tbuilder.PrependUint64Slot(7, u64, 0)\n}\nfunc TypeAliasesAddF32(builder *flatbuffers.Builder, f32 float32) {\n\tbuilder.PrependFloat32Slot(8, f32, 0.0)\n}\nfunc TypeAliasesAddF64(builder *flatbuffers.Builder, f64 float64) {\n\tbuilder.PrependFloat64Slot(9, f64, 0.0)\n}\nfunc TypeAliasesAddV8(builder *flatbuffers.Builder, v8 flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(10, flatbuffers.UOffsetT(v8), 0)\n}\nfunc TypeAliasesStartV8Vector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {\n\treturn builder.StartVector(1, numElems, 1)\n}\nfunc TypeAliasesAddVf64(builder *flatbuffers.Builder, vf64 flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(11, flatbuffers.UOffsetT(vf64), 0)\n}\nfunc TypeAliasesStartVf64Vector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {\n\treturn builder.StartVector(8, numElems, 8)\n}\nfunc TypeAliasesEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\treturn builder.EndObject()\n}\n"
  },
  {
    "path": "tests/MyGame/Example/TypeAliases.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class TypeAliases extends com.google.flatbuffers.Table {\n  public static void ValidateVersion() { Constants.FLATBUFFERS_25_12_19(); }\n  public static TypeAliases getRootAsTypeAliases(ByteBuffer _bb) { return getRootAsTypeAliases(_bb, new TypeAliases()); }\n  public static TypeAliases getRootAsTypeAliases(ByteBuffer _bb, TypeAliases obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public TypeAliases __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public byte i8() { int o = __offset(4); return o != 0 ? bb.get(o + bb_pos) : 0; }\n  public boolean mutateI8(byte i8) { int o = __offset(4); if (o != 0) { bb.put(o + bb_pos, i8); return true; } else { return false; } }\n  public int u8() { int o = __offset(6); return o != 0 ? bb.get(o + bb_pos) & 0xFF : 0; }\n  public boolean mutateU8(int u8) { int o = __offset(6); if (o != 0) { bb.put(o + bb_pos, (byte) u8); return true; } else { return false; } }\n  public short i16() { int o = __offset(8); return o != 0 ? bb.getShort(o + bb_pos) : 0; }\n  public boolean mutateI16(short i16) { int o = __offset(8); if (o != 0) { bb.putShort(o + bb_pos, i16); return true; } else { return false; } }\n  public int u16() { int o = __offset(10); return o != 0 ? bb.getShort(o + bb_pos) & 0xFFFF : 0; }\n  public boolean mutateU16(int u16) { int o = __offset(10); if (o != 0) { bb.putShort(o + bb_pos, (short) u16); return true; } else { return false; } }\n  public int i32() { int o = __offset(12); return o != 0 ? bb.getInt(o + bb_pos) : 0; }\n  public boolean mutateI32(int i32) { int o = __offset(12); if (o != 0) { bb.putInt(o + bb_pos, i32); return true; } else { return false; } }\n  public long u32() { int o = __offset(14); return o != 0 ? (long)bb.getInt(o + bb_pos) & 0xFFFFFFFFL : 0L; }\n  public boolean mutateU32(long u32) { int o = __offset(14); if (o != 0) { bb.putInt(o + bb_pos, (int) u32); return true; } else { return false; } }\n  public long i64() { int o = __offset(16); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }\n  public boolean mutateI64(long i64) { int o = __offset(16); if (o != 0) { bb.putLong(o + bb_pos, i64); return true; } else { return false; } }\n  public long u64() { int o = __offset(18); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }\n  public boolean mutateU64(long u64) { int o = __offset(18); if (o != 0) { bb.putLong(o + bb_pos, u64); return true; } else { return false; } }\n  public float f32() { int o = __offset(20); return o != 0 ? bb.getFloat(o + bb_pos) : 0.0f; }\n  public boolean mutateF32(float f32) { int o = __offset(20); if (o != 0) { bb.putFloat(o + bb_pos, f32); return true; } else { return false; } }\n  public double f64() { int o = __offset(22); return o != 0 ? bb.getDouble(o + bb_pos) : 0.0; }\n  public boolean mutateF64(double f64) { int o = __offset(22); if (o != 0) { bb.putDouble(o + bb_pos, f64); return true; } else { return false; } }\n  public byte v8(int j) { int o = __offset(24); return o != 0 ? bb.get(__vector(o) + j * 1) : 0; }\n  public int v8Length() { int o = __offset(24); return o != 0 ? __vector_len(o) : 0; }\n  public ByteVector v8Vector() { return v8Vector(new ByteVector()); }\n  public ByteVector v8Vector(ByteVector obj) { int o = __offset(24); return o != 0 ? obj.__assign(__vector(o), bb) : null; }\n  public ByteBuffer v8AsByteBuffer() { return __vector_as_bytebuffer(24, 1); }\n  public ByteBuffer v8InByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 24, 1); }\n  public boolean mutateV8(int j, byte v8) { int o = __offset(24); if (o != 0) { bb.put(__vector(o) + j * 1, v8); return true; } else { return false; } }\n  public double vf64(int j) { int o = __offset(26); return o != 0 ? bb.getDouble(__vector(o) + j * 8) : 0; }\n  public int vf64Length() { int o = __offset(26); return o != 0 ? __vector_len(o) : 0; }\n  public DoubleVector vf64Vector() { return vf64Vector(new DoubleVector()); }\n  public DoubleVector vf64Vector(DoubleVector obj) { int o = __offset(26); return o != 0 ? obj.__assign(__vector(o), bb) : null; }\n  public ByteBuffer vf64AsByteBuffer() { return __vector_as_bytebuffer(26, 8); }\n  public ByteBuffer vf64InByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 26, 8); }\n  public boolean mutateVf64(int j, double vf64) { int o = __offset(26); if (o != 0) { bb.putDouble(__vector(o) + j * 8, vf64); return true; } else { return false; } }\n\n  public static int createTypeAliases(FlatBufferBuilder builder,\n      byte i8,\n      int u8,\n      short i16,\n      int u16,\n      int i32,\n      long u32,\n      long i64,\n      long u64,\n      float f32,\n      double f64,\n      int v8Offset,\n      int vf64Offset) {\n    builder.startTable(12);\n    TypeAliases.addF64(builder, f64);\n    TypeAliases.addU64(builder, u64);\n    TypeAliases.addI64(builder, i64);\n    TypeAliases.addVf64(builder, vf64Offset);\n    TypeAliases.addV8(builder, v8Offset);\n    TypeAliases.addF32(builder, f32);\n    TypeAliases.addU32(builder, u32);\n    TypeAliases.addI32(builder, i32);\n    TypeAliases.addU16(builder, u16);\n    TypeAliases.addI16(builder, i16);\n    TypeAliases.addU8(builder, u8);\n    TypeAliases.addI8(builder, i8);\n    return TypeAliases.endTypeAliases(builder);\n  }\n\n  public static void startTypeAliases(FlatBufferBuilder builder) { builder.startTable(12); }\n  public static void addI8(FlatBufferBuilder builder, byte i8) { builder.addByte(0, i8, 0); }\n  public static void addU8(FlatBufferBuilder builder, int u8) { builder.addByte(1, (byte) u8, (byte) 0); }\n  public static void addI16(FlatBufferBuilder builder, short i16) { builder.addShort(2, i16, 0); }\n  public static void addU16(FlatBufferBuilder builder, int u16) { builder.addShort(3, (short) u16, (short) 0); }\n  public static void addI32(FlatBufferBuilder builder, int i32) { builder.addInt(4, i32, 0); }\n  public static void addU32(FlatBufferBuilder builder, long u32) { builder.addInt(5, (int) u32, (int) 0L); }\n  public static void addI64(FlatBufferBuilder builder, long i64) { builder.addLong(6, i64, 0L); }\n  public static void addU64(FlatBufferBuilder builder, long u64) { builder.addLong(7, u64, 0L); }\n  public static void addF32(FlatBufferBuilder builder, float f32) { builder.addFloat(8, f32, 0.0f); }\n  public static void addF64(FlatBufferBuilder builder, double f64) { builder.addDouble(9, f64, 0.0); }\n  public static void addV8(FlatBufferBuilder builder, int v8Offset) { builder.addOffset(10, v8Offset, 0); }\n  public static int createV8Vector(FlatBufferBuilder builder, byte[] data) { return builder.createByteVector(data); }\n  public static int createV8Vector(FlatBufferBuilder builder, ByteBuffer data) { return builder.createByteVector(data); }\n  public static void startV8Vector(FlatBufferBuilder builder, int numElems) { builder.startVector(1, numElems, 1); }\n  public static void addVf64(FlatBufferBuilder builder, int vf64Offset) { builder.addOffset(11, vf64Offset, 0); }\n  public static int createVf64Vector(FlatBufferBuilder builder, double[] data) { builder.startVector(8, data.length, 8); for (int i = data.length - 1; i >= 0; i--) builder.addDouble(data[i]); return builder.endVector(); }\n  public static void startVf64Vector(FlatBufferBuilder builder, int numElems) { builder.startVector(8, numElems, 8); }\n  public static int endTypeAliases(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    return o;\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public TypeAliases get(int j) { return get(new TypeAliases(), j); }\n    public TypeAliases get(TypeAliases obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); }\n  }\n  public TypeAliasesT unpack() {\n    TypeAliasesT _o = new TypeAliasesT();\n    unpackTo(_o);\n    return _o;\n  }\n  public void unpackTo(TypeAliasesT _o) {\n    byte _oI8 = i8();\n    _o.setI8(_oI8);\n    int _oU8 = u8();\n    _o.setU8(_oU8);\n    short _oI16 = i16();\n    _o.setI16(_oI16);\n    int _oU16 = u16();\n    _o.setU16(_oU16);\n    int _oI32 = i32();\n    _o.setI32(_oI32);\n    long _oU32 = u32();\n    _o.setU32(_oU32);\n    long _oI64 = i64();\n    _o.setI64(_oI64);\n    long _oU64 = u64();\n    _o.setU64(_oU64);\n    float _oF32 = f32();\n    _o.setF32(_oF32);\n    double _oF64 = f64();\n    _o.setF64(_oF64);\n    byte[] _oV8 = new byte[v8Length()];\n    for (int _j = 0; _j < v8Length(); ++_j) {_oV8[_j] = v8(_j);}\n    _o.setV8(_oV8);\n    double[] _oVf64 = new double[vf64Length()];\n    for (int _j = 0; _j < vf64Length(); ++_j) {_oVf64[_j] = vf64(_j);}\n    _o.setVf64(_oVf64);\n  }\n  public static int pack(FlatBufferBuilder builder, TypeAliasesT _o) {\n    if (_o == null) return 0;\n    int _v8 = 0;\n    if (_o.getV8() != null) {\n      _v8 = createV8Vector(builder, _o.getV8());\n    }\n    int _vf64 = 0;\n    if (_o.getVf64() != null) {\n      _vf64 = createVf64Vector(builder, _o.getVf64());\n    }\n    return createTypeAliases(\n      builder,\n      _o.getI8(),\n      _o.getU8(),\n      _o.getI16(),\n      _o.getU16(),\n      _o.getI32(),\n      _o.getU32(),\n      _o.getI64(),\n      _o.getU64(),\n      _o.getF32(),\n      _o.getF64(),\n      _v8,\n      _vf64);\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/TypeAliases.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example\n\nimport com.google.flatbuffers.BaseVector\nimport com.google.flatbuffers.BooleanVector\nimport com.google.flatbuffers.ByteVector\nimport com.google.flatbuffers.Constants\nimport com.google.flatbuffers.DoubleVector\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.FloatVector\nimport com.google.flatbuffers.LongVector\nimport com.google.flatbuffers.StringVector\nimport com.google.flatbuffers.Struct\nimport com.google.flatbuffers.Table\nimport com.google.flatbuffers.UnionVector\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport kotlin.math.sign\n\n@Suppress(\"unused\")\nclass TypeAliases : Table() {\n\n    fun __init(_i: Int, _bb: ByteBuffer)  {\n        __reset(_i, _bb)\n    }\n    fun __assign(_i: Int, _bb: ByteBuffer) : TypeAliases {\n        __init(_i, _bb)\n        return this\n    }\n    val i8 : Byte\n        get() {\n            val o = __offset(4)\n            return if(o != 0) bb.get(o + bb_pos) else 0\n        }\n    fun mutateI8(i8: Byte) : Boolean {\n        val o = __offset(4)\n        return if (o != 0) {\n            bb.put(o + bb_pos, i8)\n            true\n        } else {\n            false\n        }\n    }\n    val u8 : UByte\n        get() {\n            val o = __offset(6)\n            return if(o != 0) bb.get(o + bb_pos).toUByte() else 0u\n        }\n    fun mutateU8(u8: UByte) : Boolean {\n        val o = __offset(6)\n        return if (o != 0) {\n            bb.put(o + bb_pos, u8.toByte())\n            true\n        } else {\n            false\n        }\n    }\n    val i16 : Short\n        get() {\n            val o = __offset(8)\n            return if(o != 0) bb.getShort(o + bb_pos) else 0\n        }\n    fun mutateI16(i16: Short) : Boolean {\n        val o = __offset(8)\n        return if (o != 0) {\n            bb.putShort(o + bb_pos, i16)\n            true\n        } else {\n            false\n        }\n    }\n    val u16 : UShort\n        get() {\n            val o = __offset(10)\n            return if(o != 0) bb.getShort(o + bb_pos).toUShort() else 0u\n        }\n    fun mutateU16(u16: UShort) : Boolean {\n        val o = __offset(10)\n        return if (o != 0) {\n            bb.putShort(o + bb_pos, u16.toShort())\n            true\n        } else {\n            false\n        }\n    }\n    val i32 : Int\n        get() {\n            val o = __offset(12)\n            return if(o != 0) bb.getInt(o + bb_pos) else 0\n        }\n    fun mutateI32(i32: Int) : Boolean {\n        val o = __offset(12)\n        return if (o != 0) {\n            bb.putInt(o + bb_pos, i32)\n            true\n        } else {\n            false\n        }\n    }\n    val u32 : UInt\n        get() {\n            val o = __offset(14)\n            return if(o != 0) bb.getInt(o + bb_pos).toUInt() else 0u\n        }\n    fun mutateU32(u32: UInt) : Boolean {\n        val o = __offset(14)\n        return if (o != 0) {\n            bb.putInt(o + bb_pos, u32.toInt())\n            true\n        } else {\n            false\n        }\n    }\n    val i64 : Long\n        get() {\n            val o = __offset(16)\n            return if(o != 0) bb.getLong(o + bb_pos) else 0L\n        }\n    fun mutateI64(i64: Long) : Boolean {\n        val o = __offset(16)\n        return if (o != 0) {\n            bb.putLong(o + bb_pos, i64)\n            true\n        } else {\n            false\n        }\n    }\n    val u64 : ULong\n        get() {\n            val o = __offset(18)\n            return if(o != 0) bb.getLong(o + bb_pos).toULong() else 0UL\n        }\n    fun mutateU64(u64: ULong) : Boolean {\n        val o = __offset(18)\n        return if (o != 0) {\n            bb.putLong(o + bb_pos, u64.toLong())\n            true\n        } else {\n            false\n        }\n    }\n    val f32 : Float\n        get() {\n            val o = __offset(20)\n            return if(o != 0) bb.getFloat(o + bb_pos) else 0.0f\n        }\n    fun mutateF32(f32: Float) : Boolean {\n        val o = __offset(20)\n        return if (o != 0) {\n            bb.putFloat(o + bb_pos, f32)\n            true\n        } else {\n            false\n        }\n    }\n    val f64 : Double\n        get() {\n            val o = __offset(22)\n            return if(o != 0) bb.getDouble(o + bb_pos) else 0.0\n        }\n    fun mutateF64(f64: Double) : Boolean {\n        val o = __offset(22)\n        return if (o != 0) {\n            bb.putDouble(o + bb_pos, f64)\n            true\n        } else {\n            false\n        }\n    }\n    fun v8(j: Int) : Byte {\n        val o = __offset(24)\n        return if (o != 0) {\n            bb.get(__vector(o) + j * 1)\n        } else {\n            0\n        }\n    }\n    val v8Length : Int\n        get() {\n            val o = __offset(24); return if (o != 0) __vector_len(o) else 0\n        }\n    val v8AsByteBuffer : ByteBuffer? get() = __vector_as_bytebuffer(24, 1)\n    fun v8InByteBuffer(_bb: ByteBuffer) : ByteBuffer? = __vector_in_bytebuffer(_bb, 24, 1)\n    fun mutateV8(j: Int, v8: Byte) : Boolean {\n        val o = __offset(24)\n        return if (o != 0) {\n            bb.put(__vector(o) + j * 1, v8)\n            true\n        } else {\n            false\n        }\n    }\n    fun vf64(j: Int) : Double {\n        val o = __offset(26)\n        return if (o != 0) {\n            bb.getDouble(__vector(o) + j * 8)\n        } else {\n            0.0\n        }\n    }\n    val vf64Length : Int\n        get() {\n            val o = __offset(26); return if (o != 0) __vector_len(o) else 0\n        }\n    val vf64AsByteBuffer : ByteBuffer? get() = __vector_as_bytebuffer(26, 8)\n    fun vf64InByteBuffer(_bb: ByteBuffer) : ByteBuffer? = __vector_in_bytebuffer(_bb, 26, 8)\n    fun mutateVf64(j: Int, vf64: Double) : Boolean {\n        val o = __offset(26)\n        return if (o != 0) {\n            bb.putDouble(__vector(o) + j * 8, vf64)\n            true\n        } else {\n            false\n        }\n    }\n    companion object {\n        fun validateVersion() = Constants.FLATBUFFERS_25_12_19()\n        fun getRootAsTypeAliases(_bb: ByteBuffer): TypeAliases = getRootAsTypeAliases(_bb, TypeAliases())\n        fun getRootAsTypeAliases(_bb: ByteBuffer, obj: TypeAliases): TypeAliases {\n            _bb.order(ByteOrder.LITTLE_ENDIAN)\n            return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb))\n        }\n        fun createTypeAliases(builder: FlatBufferBuilder, i8: Byte, u8: UByte, i16: Short, u16: UShort, i32: Int, u32: UInt, i64: Long, u64: ULong, f32: Float, f64: Double, v8Offset: Int, vf64Offset: Int) : Int {\n            builder.startTable(12)\n            addF64(builder, f64)\n            addU64(builder, u64)\n            addI64(builder, i64)\n            addVf64(builder, vf64Offset)\n            addV8(builder, v8Offset)\n            addF32(builder, f32)\n            addU32(builder, u32)\n            addI32(builder, i32)\n            addU16(builder, u16)\n            addI16(builder, i16)\n            addU8(builder, u8)\n            addI8(builder, i8)\n            return endTypeAliases(builder)\n        }\n        fun startTypeAliases(builder: FlatBufferBuilder) = builder.startTable(12)\n        fun addI8(builder: FlatBufferBuilder, i8: Byte) = builder.addByte(0, i8, 0)\n        fun addU8(builder: FlatBufferBuilder, u8: UByte) = builder.addByte(1, u8.toByte(), 0)\n        fun addI16(builder: FlatBufferBuilder, i16: Short) = builder.addShort(2, i16, 0)\n        fun addU16(builder: FlatBufferBuilder, u16: UShort) = builder.addShort(3, u16.toShort(), 0)\n        fun addI32(builder: FlatBufferBuilder, i32: Int) = builder.addInt(4, i32, 0)\n        fun addU32(builder: FlatBufferBuilder, u32: UInt) = builder.addInt(5, u32.toInt(), 0)\n        fun addI64(builder: FlatBufferBuilder, i64: Long) = builder.addLong(6, i64, 0L)\n        fun addU64(builder: FlatBufferBuilder, u64: ULong) = builder.addLong(7, u64.toLong(), 0)\n        fun addF32(builder: FlatBufferBuilder, f32: Float) = builder.addFloat(8, f32, 0.0)\n        fun addF64(builder: FlatBufferBuilder, f64: Double) = builder.addDouble(9, f64, 0.0)\n        fun addV8(builder: FlatBufferBuilder, v8: Int) = builder.addOffset(10, v8, 0)\n        fun createV8Vector(builder: FlatBufferBuilder, data: ByteArray) : Int {\n            builder.startVector(1, data.size, 1)\n            for (i in data.size - 1 downTo 0) {\n                builder.addByte(data[i])\n            }\n            return builder.endVector()\n        }\n        fun startV8Vector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(1, numElems, 1)\n        fun addVf64(builder: FlatBufferBuilder, vf64: Int) = builder.addOffset(11, vf64, 0)\n        fun createVf64Vector(builder: FlatBufferBuilder, data: DoubleArray) : Int {\n            builder.startVector(8, data.size, 8)\n            for (i in data.size - 1 downTo 0) {\n                builder.addDouble(data[i])\n            }\n            return builder.endVector()\n        }\n        fun startVf64Vector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(8, numElems, 8)\n        fun endTypeAliases(builder: FlatBufferBuilder) : Int {\n            val o = builder.endTable()\n            return o\n        }\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/TypeAliases.lua",
    "content": "--[[ MyGame.Example.TypeAliases\n\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : //monster_test.fbs\n  Rooting type : MyGame.Example.Monster (//monster_test.fbs)\n\n--]]\n\nlocal flatbuffers = require('flatbuffers')\n\nlocal TypeAliases = {}\nlocal mt = {}\n\nfunction TypeAliases.New()\n  local o = {}\n  setmetatable(o, {__index = mt})\n  return o\nend\n\nfunction mt:Init(buf, pos)\n  self.view = flatbuffers.view.New(buf, pos)\nend\n\nfunction mt:I8()\n  local o = self.view:Offset(4)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Int8, self.view.pos + o)\n  end\n  return 0\nend\n\nfunction mt:U8()\n  local o = self.view:Offset(6)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Uint8, self.view.pos + o)\n  end\n  return 0\nend\n\nfunction mt:I16()\n  local o = self.view:Offset(8)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Int16, self.view.pos + o)\n  end\n  return 0\nend\n\nfunction mt:U16()\n  local o = self.view:Offset(10)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Uint16, self.view.pos + o)\n  end\n  return 0\nend\n\nfunction mt:I32()\n  local o = self.view:Offset(12)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Int32, self.view.pos + o)\n  end\n  return 0\nend\n\nfunction mt:U32()\n  local o = self.view:Offset(14)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Uint32, self.view.pos + o)\n  end\n  return 0\nend\n\nfunction mt:I64()\n  local o = self.view:Offset(16)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Int64, self.view.pos + o)\n  end\n  return 0\nend\n\nfunction mt:U64()\n  local o = self.view:Offset(18)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Uint64, self.view.pos + o)\n  end\n  return 0\nend\n\nfunction mt:F32()\n  local o = self.view:Offset(20)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Float32, self.view.pos + o)\n  end\n  return 0.0\nend\n\nfunction mt:F64()\n  local o = self.view:Offset(22)\n  if o ~= 0 then\n    return self.view:Get(flatbuffers.N.Float64, self.view.pos + o)\n  end\n  return 0.0\nend\n\nfunction mt:V8(j)\n  local o = self.view:Offset(24)\n  if o ~= 0 then\n    local a = self.view:Vector(o)\n    return self.view:Get(flatbuffers.N.Int8, a + ((j-1) * 1))\n  end\n  return 0\nend\n\nfunction mt:V8AsString(start, stop)\n  return self.view:VectorAsString(24, start, stop)\nend\n\nfunction mt:V8Length()\n  local o = self.view:Offset(24)\n  if o ~= 0 then\n    return self.view:VectorLen(o)\n  end\n  return 0\nend\n\nfunction mt:Vf64(j)\n  local o = self.view:Offset(26)\n  if o ~= 0 then\n    local a = self.view:Vector(o)\n    return self.view:Get(flatbuffers.N.Float64, a + ((j-1) * 8))\n  end\n  return 0\nend\n\nfunction mt:Vf64Length()\n  local o = self.view:Offset(26)\n  if o ~= 0 then\n    return self.view:VectorLen(o)\n  end\n  return 0\nend\n\nfunction TypeAliases.Start(builder)\n  builder:StartObject(12)\nend\n\nfunction TypeAliases.AddI8(builder, i8)\n  builder:PrependInt8Slot(0, i8, 0)\nend\n\nfunction TypeAliases.AddU8(builder, u8)\n  builder:PrependUint8Slot(1, u8, 0)\nend\n\nfunction TypeAliases.AddI16(builder, i16)\n  builder:PrependInt16Slot(2, i16, 0)\nend\n\nfunction TypeAliases.AddU16(builder, u16)\n  builder:PrependUint16Slot(3, u16, 0)\nend\n\nfunction TypeAliases.AddI32(builder, i32)\n  builder:PrependInt32Slot(4, i32, 0)\nend\n\nfunction TypeAliases.AddU32(builder, u32)\n  builder:PrependUint32Slot(5, u32, 0)\nend\n\nfunction TypeAliases.AddI64(builder, i64)\n  builder:PrependInt64Slot(6, i64, 0)\nend\n\nfunction TypeAliases.AddU64(builder, u64)\n  builder:PrependUint64Slot(7, u64, 0)\nend\n\nfunction TypeAliases.AddF32(builder, f32)\n  builder:PrependFloat32Slot(8, f32, 0.0)\nend\n\nfunction TypeAliases.AddF64(builder, f64)\n  builder:PrependFloat64Slot(9, f64, 0.0)\nend\n\nfunction TypeAliases.AddV8(builder, v8)\n  builder:PrependUOffsetTRelativeSlot(10, v8, 0)\nend\n\nfunction TypeAliases.StartV8Vector(builder, numElems)\n  return builder:StartVector(1, numElems, 1)\nend\n\nfunction TypeAliases.AddVf64(builder, vf64)\n  builder:PrependUOffsetTRelativeSlot(11, vf64, 0)\nend\n\nfunction TypeAliases.StartVf64Vector(builder, numElems)\n  return builder:StartVector(8, numElems, 8)\nend\n\nfunction TypeAliases.End(builder)\n  return builder:EndObject()\nend\n\nreturn TypeAliases"
  },
  {
    "path": "tests/MyGame/Example/TypeAliases.nim",
    "content": "#[ MyGame.Example.TypeAliases\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : \n  Rooting type : MyGame.Example.Monster ()\n]#\n\nimport flatbuffers\nimport std/options\n\ntype TypeAliases* = object of FlatObj\nfunc i8*(self: TypeAliases): int8 =\n  let o = self.tab.Offset(4)\n  if o != 0:\n    return Get[int8](self.tab, self.tab.Pos + o)\n  return 0\nfunc `i8=`*(self: var TypeAliases, n: int8): bool =\n  return self.tab.MutateSlot(4, n)\nfunc u8*(self: TypeAliases): uint8 =\n  let o = self.tab.Offset(6)\n  if o != 0:\n    return Get[uint8](self.tab, self.tab.Pos + o)\n  return 0\nfunc `u8=`*(self: var TypeAliases, n: uint8): bool =\n  return self.tab.MutateSlot(6, n)\nfunc i16*(self: TypeAliases): int16 =\n  let o = self.tab.Offset(8)\n  if o != 0:\n    return Get[int16](self.tab, self.tab.Pos + o)\n  return 0\nfunc `i16=`*(self: var TypeAliases, n: int16): bool =\n  return self.tab.MutateSlot(8, n)\nfunc u16*(self: TypeAliases): uint16 =\n  let o = self.tab.Offset(10)\n  if o != 0:\n    return Get[uint16](self.tab, self.tab.Pos + o)\n  return 0\nfunc `u16=`*(self: var TypeAliases, n: uint16): bool =\n  return self.tab.MutateSlot(10, n)\nfunc i32*(self: TypeAliases): int32 =\n  let o = self.tab.Offset(12)\n  if o != 0:\n    return Get[int32](self.tab, self.tab.Pos + o)\n  return 0\nfunc `i32=`*(self: var TypeAliases, n: int32): bool =\n  return self.tab.MutateSlot(12, n)\nfunc u32*(self: TypeAliases): uint32 =\n  let o = self.tab.Offset(14)\n  if o != 0:\n    return Get[uint32](self.tab, self.tab.Pos + o)\n  return 0\nfunc `u32=`*(self: var TypeAliases, n: uint32): bool =\n  return self.tab.MutateSlot(14, n)\nfunc i64*(self: TypeAliases): int64 =\n  let o = self.tab.Offset(16)\n  if o != 0:\n    return Get[int64](self.tab, self.tab.Pos + o)\n  return 0\nfunc `i64=`*(self: var TypeAliases, n: int64): bool =\n  return self.tab.MutateSlot(16, n)\nfunc u64*(self: TypeAliases): uint64 =\n  let o = self.tab.Offset(18)\n  if o != 0:\n    return Get[uint64](self.tab, self.tab.Pos + o)\n  return 0\nfunc `u64=`*(self: var TypeAliases, n: uint64): bool =\n  return self.tab.MutateSlot(18, n)\nfunc f32*(self: TypeAliases): float32 =\n  let o = self.tab.Offset(20)\n  if o != 0:\n    return Get[float32](self.tab, self.tab.Pos + o)\n  return 0.0\nfunc `f32=`*(self: var TypeAliases, n: float32): bool =\n  return self.tab.MutateSlot(20, n)\nfunc f64*(self: TypeAliases): float64 =\n  let o = self.tab.Offset(22)\n  if o != 0:\n    return Get[float64](self.tab, self.tab.Pos + o)\n  return 0.0\nfunc `f64=`*(self: var TypeAliases, n: float64): bool =\n  return self.tab.MutateSlot(22, n)\nfunc v8Length*(self: TypeAliases): int = \n  let o = self.tab.Offset(24)\n  if o != 0:\n    return self.tab.VectorLen(o)\nfunc v8*(self: TypeAliases, j: int): int8 = \n  let o = self.tab.Offset(24)\n  if o != 0:\n    var x = self.tab.Vector(o)\n    x += j.uoffset * 1.uoffset\n    return Get[int8](self.tab, x)\nfunc v8*(self: TypeAliases): seq[int8] = \n  let len = self.v8Length\n  for i in countup(0, len - 1):\n    result.add(self.v8(i))\nfunc vf64Length*(self: TypeAliases): int = \n  let o = self.tab.Offset(26)\n  if o != 0:\n    return self.tab.VectorLen(o)\nfunc vf64*(self: TypeAliases, j: int): float64 = \n  let o = self.tab.Offset(26)\n  if o != 0:\n    var x = self.tab.Vector(o)\n    x += j.uoffset * 8.uoffset\n    return Get[float64](self.tab, x)\nfunc vf64*(self: TypeAliases): seq[float64] = \n  let len = self.vf64Length\n  for i in countup(0, len - 1):\n    result.add(self.vf64(i))\nproc TypeAliasesStart*(builder: var Builder) =\n  builder.StartObject(12)\nproc TypeAliasesAddi8*(builder: var Builder, i8: int8) =\n  builder.PrependSlot(0, i8, default(int8))\nproc TypeAliasesAddu8*(builder: var Builder, u8: uint8) =\n  builder.PrependSlot(1, u8, default(uint8))\nproc TypeAliasesAddi16*(builder: var Builder, i16: int16) =\n  builder.PrependSlot(2, i16, default(int16))\nproc TypeAliasesAddu16*(builder: var Builder, u16: uint16) =\n  builder.PrependSlot(3, u16, default(uint16))\nproc TypeAliasesAddi32*(builder: var Builder, i32: int32) =\n  builder.PrependSlot(4, i32, default(int32))\nproc TypeAliasesAddu32*(builder: var Builder, u32: uint32) =\n  builder.PrependSlot(5, u32, default(uint32))\nproc TypeAliasesAddi64*(builder: var Builder, i64: int64) =\n  builder.PrependSlot(6, i64, default(int64))\nproc TypeAliasesAddu64*(builder: var Builder, u64: uint64) =\n  builder.PrependSlot(7, u64, default(uint64))\nproc TypeAliasesAddf32*(builder: var Builder, f32: float32) =\n  builder.PrependSlot(8, f32, default(float32))\nproc TypeAliasesAddf64*(builder: var Builder, f64: float64) =\n  builder.PrependSlot(9, f64, default(float64))\nproc TypeAliasesAddv8*(builder: var Builder, v8: uoffset) =\n  builder.PrependSlot(10, v8, default(uoffset))\nproc TypeAliasesStartv8Vector*(builder: var Builder, numElems: uoffset) =\n  builder.StartVector(1, numElems, 1)\nproc TypeAliasesAddvf64*(builder: var Builder, vf64: uoffset) =\n  builder.PrependSlot(11, vf64, default(uoffset))\nproc TypeAliasesStartvf64Vector*(builder: var Builder, numElems: uoffset) =\n  builder.StartVector(8, numElems, 8)\nproc TypeAliasesEnd*(builder: var Builder): uoffset =\n  return builder.EndObject()\n"
  },
  {
    "path": "tests/MyGame/Example/TypeAliases.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nnamespace MyGame\\Example;\n\nuse \\Google\\FlatBuffers\\Struct;\nuse \\Google\\FlatBuffers\\Table;\nuse \\Google\\FlatBuffers\\ByteBuffer;\nuse \\Google\\FlatBuffers\\FlatBufferBuilder;\n\nclass TypeAliases extends Table\n{\n    /**\n     * @param ByteBuffer $bb\n     * @return TypeAliases\n     */\n    public static function getRootAsTypeAliases(ByteBuffer $bb)\n    {\n        $obj = new TypeAliases();\n        return ($obj->init($bb->getInt($bb->getPosition()) + $bb->getPosition(), $bb));\n    }\n\n    public static function TypeAliasesIdentifier()\n    {\n        return \"MONS\";\n    }\n\n    public static function TypeAliasesBufferHasIdentifier(ByteBuffer $buf)\n    {\n        return self::__has_identifier($buf, self::TypeAliasesIdentifier());\n    }\n\n    public static function TypeAliasesExtension()\n    {\n        return \"mon\";\n    }\n\n    /**\n     * @param int $_i offset\n     * @param ByteBuffer $_bb\n     * @return TypeAliases\n     **/\n    public function init($_i, ByteBuffer $_bb)\n    {\n        $this->bb_pos = $_i;\n        $this->bb = $_bb;\n        return $this;\n    }\n\n    /**\n     * @return sbyte\n     */\n    public function getI8()\n    {\n        $o = $this->__offset(4);\n        return $o != 0 ? $this->bb->getSbyte($o + $this->bb_pos) : 0;\n    }\n\n    /**\n     * @return byte\n     */\n    public function getU8()\n    {\n        $o = $this->__offset(6);\n        return $o != 0 ? $this->bb->getByte($o + $this->bb_pos) : 0;\n    }\n\n    /**\n     * @return short\n     */\n    public function getI16()\n    {\n        $o = $this->__offset(8);\n        return $o != 0 ? $this->bb->getShort($o + $this->bb_pos) : 0;\n    }\n\n    /**\n     * @return ushort\n     */\n    public function getU16()\n    {\n        $o = $this->__offset(10);\n        return $o != 0 ? $this->bb->getUshort($o + $this->bb_pos) : 0;\n    }\n\n    /**\n     * @return int\n     */\n    public function getI32()\n    {\n        $o = $this->__offset(12);\n        return $o != 0 ? $this->bb->getInt($o + $this->bb_pos) : 0;\n    }\n\n    /**\n     * @return uint\n     */\n    public function getU32()\n    {\n        $o = $this->__offset(14);\n        return $o != 0 ? $this->bb->getUint($o + $this->bb_pos) : 0;\n    }\n\n    /**\n     * @return long\n     */\n    public function getI64()\n    {\n        $o = $this->__offset(16);\n        return $o != 0 ? $this->bb->getLong($o + $this->bb_pos) : 0;\n    }\n\n    /**\n     * @return ulong\n     */\n    public function getU64()\n    {\n        $o = $this->__offset(18);\n        return $o != 0 ? $this->bb->getUlong($o + $this->bb_pos) : 0;\n    }\n\n    /**\n     * @return float\n     */\n    public function getF32()\n    {\n        $o = $this->__offset(20);\n        return $o != 0 ? $this->bb->getFloat($o + $this->bb_pos) : 0.0;\n    }\n\n    /**\n     * @return double\n     */\n    public function getF64()\n    {\n        $o = $this->__offset(22);\n        return $o != 0 ? $this->bb->getDouble($o + $this->bb_pos) : 0.0;\n    }\n\n    /**\n     * @param int offset\n     * @return sbyte\n     */\n    public function getV8($j)\n    {\n        $o = $this->__offset(24);\n        return $o != 0 ? $this->bb->getSbyte($this->__vector($o) + $j * 1) : 0;\n    }\n\n    /**\n     * @return int\n     */\n    public function getV8Length()\n    {\n        $o = $this->__offset(24);\n        return $o != 0 ? $this->__vector_len($o) : 0;\n    }\n\n    /**\n     * @param int offset\n     * @return double\n     */\n    public function getVf64($j)\n    {\n        $o = $this->__offset(26);\n        return $o != 0 ? $this->bb->getDouble($this->__vector($o) + $j * 8) : 0;\n    }\n\n    /**\n     * @return int\n     */\n    public function getVf64Length()\n    {\n        $o = $this->__offset(26);\n        return $o != 0 ? $this->__vector_len($o) : 0;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return void\n     */\n    public static function startTypeAliases(FlatBufferBuilder $builder)\n    {\n        $builder->StartObject(12);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return TypeAliases\n     */\n    public static function createTypeAliases(FlatBufferBuilder $builder, $i8, $u8, $i16, $u16, $i32, $u32, $i64, $u64, $f32, $f64, $v8, $vf64)\n    {\n        $builder->startObject(12);\n        self::addI8($builder, $i8);\n        self::addU8($builder, $u8);\n        self::addI16($builder, $i16);\n        self::addU16($builder, $u16);\n        self::addI32($builder, $i32);\n        self::addU32($builder, $u32);\n        self::addI64($builder, $i64);\n        self::addU64($builder, $u64);\n        self::addF32($builder, $f32);\n        self::addF64($builder, $f64);\n        self::addV8($builder, $v8);\n        self::addVf64($builder, $vf64);\n        $o = $builder->endObject();\n        return $o;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param sbyte\n     * @return void\n     */\n    public static function addI8(FlatBufferBuilder $builder, $i8)\n    {\n        $builder->addSbyteX(0, $i8, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param byte\n     * @return void\n     */\n    public static function addU8(FlatBufferBuilder $builder, $u8)\n    {\n        $builder->addByteX(1, $u8, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param short\n     * @return void\n     */\n    public static function addI16(FlatBufferBuilder $builder, $i16)\n    {\n        $builder->addShortX(2, $i16, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param ushort\n     * @return void\n     */\n    public static function addU16(FlatBufferBuilder $builder, $u16)\n    {\n        $builder->addUshortX(3, $u16, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int\n     * @return void\n     */\n    public static function addI32(FlatBufferBuilder $builder, $i32)\n    {\n        $builder->addIntX(4, $i32, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param uint\n     * @return void\n     */\n    public static function addU32(FlatBufferBuilder $builder, $u32)\n    {\n        $builder->addUintX(5, $u32, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param long\n     * @return void\n     */\n    public static function addI64(FlatBufferBuilder $builder, $i64)\n    {\n        $builder->addLongX(6, $i64, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param ulong\n     * @return void\n     */\n    public static function addU64(FlatBufferBuilder $builder, $u64)\n    {\n        $builder->addUlongX(7, $u64, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param float\n     * @return void\n     */\n    public static function addF32(FlatBufferBuilder $builder, $f32)\n    {\n        $builder->addFloatX(8, $f32, 0.0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param double\n     * @return void\n     */\n    public static function addF64(FlatBufferBuilder $builder, $f64)\n    {\n        $builder->addDoubleX(9, $f64, 0.0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addV8(FlatBufferBuilder $builder, $v8)\n    {\n        $builder->addOffsetX(10, $v8, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param array offset array\n     * @return int vector offset\n     */\n    public static function createV8Vector(FlatBufferBuilder $builder, array $data)\n    {\n        $builder->startVector(1, count($data), 1);\n        for ($i = count($data) - 1; $i >= 0; $i--) {\n            $builder->putSbyte($data[$i]);\n        }\n        return $builder->endVector();\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int $numElems\n     * @return void\n     */\n    public static function startV8Vector(FlatBufferBuilder $builder, $numElems)\n    {\n        $builder->startVector(1, $numElems, 1);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addVf64(FlatBufferBuilder $builder, $vf64)\n    {\n        $builder->addOffsetX(11, $vf64, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param array offset array\n     * @return int vector offset\n     */\n    public static function createVf64Vector(FlatBufferBuilder $builder, array $data)\n    {\n        $builder->startVector(8, count($data), 8);\n        for ($i = count($data) - 1; $i >= 0; $i--) {\n            $builder->putDouble($data[$i]);\n        }\n        return $builder->endVector();\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int $numElems\n     * @return void\n     */\n    public static function startVf64Vector(FlatBufferBuilder $builder, $numElems)\n    {\n        $builder->startVector(8, $numElems, 8);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return int table offset\n     */\n    public static function endTypeAliases(FlatBufferBuilder $builder)\n    {\n        $o = $builder->endObject();\n        return $o;\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/TypeAliases.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: Example\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\nclass TypeAliases(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = TypeAliases()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsTypeAliases(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    @classmethod\n    def TypeAliasesBufferHasIdentifier(cls, buf, offset, size_prefixed=False):\n        return flatbuffers.util.BufferHasIdentifier(buf, offset, b\"\\x4D\\x4F\\x4E\\x53\", size_prefixed=size_prefixed)\n\n    # TypeAliases\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # TypeAliases\n    def I8(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos)\n        return 0\n\n    # TypeAliases\n    def U8(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos)\n        return 0\n\n    # TypeAliases\n    def I16(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int16Flags, o + self._tab.Pos)\n        return 0\n\n    # TypeAliases\n    def U16(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint16Flags, o + self._tab.Pos)\n        return 0\n\n    # TypeAliases\n    def I32(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos)\n        return 0\n\n    # TypeAliases\n    def U32(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint32Flags, o + self._tab.Pos)\n        return 0\n\n    # TypeAliases\n    def I64(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int64Flags, o + self._tab.Pos)\n        return 0\n\n    # TypeAliases\n    def U64(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(18))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos)\n        return 0\n\n    # TypeAliases\n    def F32(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(20))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos)\n        return 0.0\n\n    # TypeAliases\n    def F64(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(22))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float64Flags, o + self._tab.Pos)\n        return 0.0\n\n    # TypeAliases\n    def V8(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(24))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.Get(flatbuffers.number_types.Int8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1))\n        return 0\n\n    # TypeAliases\n    def V8AsNumpy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(24))\n        if o != 0:\n            return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Int8Flags, o)\n        return 0\n\n    # TypeAliases\n    def V8Length(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(24))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # TypeAliases\n    def V8IsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(24))\n        return o == 0\n\n    # TypeAliases\n    def Vf64(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(26))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.Get(flatbuffers.number_types.Float64Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 8))\n        return 0\n\n    # TypeAliases\n    def Vf64AsNumpy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(26))\n        if o != 0:\n            return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Float64Flags, o)\n        return 0\n\n    # TypeAliases\n    def Vf64Length(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(26))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # TypeAliases\n    def Vf64IsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(26))\n        return o == 0\n\ndef TypeAliasesStart(builder):\n    builder.StartObject(12)\n\ndef Start(builder):\n    TypeAliasesStart(builder)\n\ndef TypeAliasesAddI8(builder, i8):\n    builder.PrependInt8Slot(0, i8, 0)\n\ndef AddI8(builder, i8):\n    TypeAliasesAddI8(builder, i8)\n\ndef TypeAliasesAddU8(builder, u8):\n    builder.PrependUint8Slot(1, u8, 0)\n\ndef AddU8(builder, u8):\n    TypeAliasesAddU8(builder, u8)\n\ndef TypeAliasesAddI16(builder, i16):\n    builder.PrependInt16Slot(2, i16, 0)\n\ndef AddI16(builder, i16):\n    TypeAliasesAddI16(builder, i16)\n\ndef TypeAliasesAddU16(builder, u16):\n    builder.PrependUint16Slot(3, u16, 0)\n\ndef AddU16(builder, u16):\n    TypeAliasesAddU16(builder, u16)\n\ndef TypeAliasesAddI32(builder, i32):\n    builder.PrependInt32Slot(4, i32, 0)\n\ndef AddI32(builder, i32):\n    TypeAliasesAddI32(builder, i32)\n\ndef TypeAliasesAddU32(builder, u32):\n    builder.PrependUint32Slot(5, u32, 0)\n\ndef AddU32(builder, u32):\n    TypeAliasesAddU32(builder, u32)\n\ndef TypeAliasesAddI64(builder, i64):\n    builder.PrependInt64Slot(6, i64, 0)\n\ndef AddI64(builder, i64):\n    TypeAliasesAddI64(builder, i64)\n\ndef TypeAliasesAddU64(builder, u64):\n    builder.PrependUint64Slot(7, u64, 0)\n\ndef AddU64(builder, u64):\n    TypeAliasesAddU64(builder, u64)\n\ndef TypeAliasesAddF32(builder, f32):\n    builder.PrependFloat32Slot(8, f32, 0.0)\n\ndef AddF32(builder, f32):\n    TypeAliasesAddF32(builder, f32)\n\ndef TypeAliasesAddF64(builder, f64):\n    builder.PrependFloat64Slot(9, f64, 0.0)\n\ndef AddF64(builder, f64):\n    TypeAliasesAddF64(builder, f64)\n\ndef TypeAliasesAddV8(builder, v8):\n    builder.PrependUOffsetTRelativeSlot(10, flatbuffers.number_types.UOffsetTFlags.py_type(v8), 0)\n\ndef AddV8(builder, v8):\n    TypeAliasesAddV8(builder, v8)\n\ndef TypeAliasesStartV8Vector(builder, numElems):\n    return builder.StartVector(1, numElems, 1)\n\ndef StartV8Vector(builder, numElems):\n    return TypeAliasesStartV8Vector(builder, numElems)\n\ndef TypeAliasesCreateV8Vector(builder, data):\n    data = list(data)\n    builder.StartVector(1, len(data), 1)\n    for item in reversed(data):\n        builder.PrependInt8(item)\n    return builder.EndVector()\n\ndef CreateV8Vector(builder, data):\n    return TypeAliasesCreateV8Vector(builder, data)\n\ndef TypeAliasesAddVf64(builder, vf64):\n    builder.PrependUOffsetTRelativeSlot(11, flatbuffers.number_types.UOffsetTFlags.py_type(vf64), 0)\n\ndef AddVf64(builder, vf64):\n    TypeAliasesAddVf64(builder, vf64)\n\ndef TypeAliasesStartVf64Vector(builder, numElems):\n    return builder.StartVector(8, numElems, 8)\n\ndef StartVf64Vector(builder, numElems):\n    return TypeAliasesStartVf64Vector(builder, numElems)\n\ndef TypeAliasesCreateVf64Vector(builder, data):\n    data = list(data)\n    builder.StartVector(8, len(data), 8)\n    for item in reversed(data):\n        builder.PrependFloat64(item)\n    return builder.EndVector()\n\ndef CreateVf64Vector(builder, data):\n    return TypeAliasesCreateVf64Vector(builder, data)\n\ndef TypeAliasesEnd(builder):\n    return builder.EndObject()\n\ndef End(builder):\n    return TypeAliasesEnd(builder)\n\ntry:\n    from typing import List\nexcept:\n    pass\n\nclass TypeAliasesT(object):\n\n    # TypeAliasesT\n    def __init__(\n        self,\n        i8 = 0,\n        u8 = 0,\n        i16 = 0,\n        u16 = 0,\n        i32 = 0,\n        u32 = 0,\n        i64 = 0,\n        u64 = 0,\n        f32 = 0.0,\n        f64 = 0.0,\n        v8 = None,\n        vf64 = None,\n    ):\n        self.i8 = i8  # type: int\n        self.u8 = u8  # type: int\n        self.i16 = i16  # type: int\n        self.u16 = u16  # type: int\n        self.i32 = i32  # type: int\n        self.u32 = u32  # type: int\n        self.i64 = i64  # type: int\n        self.u64 = u64  # type: int\n        self.f32 = f32  # type: float\n        self.f64 = f64  # type: float\n        self.v8 = v8  # type: Optional[List[int]]\n        self.vf64 = vf64  # type: Optional[List[float]]\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        typeAliases = TypeAliases()\n        typeAliases.Init(buf, pos)\n        return cls.InitFromObj(typeAliases)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, typeAliases):\n        x = TypeAliasesT()\n        x._UnPack(typeAliases)\n        return x\n\n    # TypeAliasesT\n    def _UnPack(self, typeAliases):\n        if typeAliases is None:\n            return\n        self.i8 = typeAliases.I8()\n        self.u8 = typeAliases.U8()\n        self.i16 = typeAliases.I16()\n        self.u16 = typeAliases.U16()\n        self.i32 = typeAliases.I32()\n        self.u32 = typeAliases.U32()\n        self.i64 = typeAliases.I64()\n        self.u64 = typeAliases.U64()\n        self.f32 = typeAliases.F32()\n        self.f64 = typeAliases.F64()\n        if not typeAliases.V8IsNone():\n            if np is None:\n                self.v8 = []\n                for i in range(typeAliases.V8Length()):\n                    self.v8.append(typeAliases.V8(i))\n            else:\n                self.v8 = typeAliases.V8AsNumpy()\n        if not typeAliases.Vf64IsNone():\n            if np is None:\n                self.vf64 = []\n                for i in range(typeAliases.Vf64Length()):\n                    self.vf64.append(typeAliases.Vf64(i))\n            else:\n                self.vf64 = typeAliases.Vf64AsNumpy()\n\n    # TypeAliasesT\n    def Pack(self, builder):\n        if self.v8 is not None:\n            if np is not None and type(self.v8) is np.ndarray:\n                v8 = builder.CreateNumpyVector(self.v8)\n            else:\n                TypeAliasesStartV8Vector(builder, len(self.v8))\n                for i in reversed(range(len(self.v8))):\n                    builder.PrependByte(self.v8[i])\n                v8 = builder.EndVector()\n        if self.vf64 is not None:\n            if np is not None and type(self.vf64) is np.ndarray:\n                vf64 = builder.CreateNumpyVector(self.vf64)\n            else:\n                TypeAliasesStartVf64Vector(builder, len(self.vf64))\n                for i in reversed(range(len(self.vf64))):\n                    builder.PrependFloat64(self.vf64[i])\n                vf64 = builder.EndVector()\n        TypeAliasesStart(builder)\n        TypeAliasesAddI8(builder, self.i8)\n        TypeAliasesAddU8(builder, self.u8)\n        TypeAliasesAddI16(builder, self.i16)\n        TypeAliasesAddU16(builder, self.u16)\n        TypeAliasesAddI32(builder, self.i32)\n        TypeAliasesAddU32(builder, self.u32)\n        TypeAliasesAddI64(builder, self.i64)\n        TypeAliasesAddU64(builder, self.u64)\n        TypeAliasesAddF32(builder, self.f32)\n        TypeAliasesAddF64(builder, self.f64)\n        if self.v8 is not None:\n            TypeAliasesAddV8(builder, v8)\n        if self.vf64 is not None:\n            TypeAliasesAddVf64(builder, vf64)\n        typeAliases = TypeAliasesEnd(builder)\n        return typeAliases\n"
  },
  {
    "path": "tests/MyGame/Example/TypeAliasesT.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\npublic class TypeAliasesT {\n  private byte i8;\n  private int u8;\n  private short i16;\n  private int u16;\n  private int i32;\n  private long u32;\n  private long i64;\n  private long u64;\n  private float f32;\n  private double f64;\n  private byte[] v8;\n  private double[] vf64;\n\n  public byte getI8() { return i8; }\n\n  public void setI8(byte i8) { this.i8 = i8; }\n\n  public int getU8() { return u8; }\n\n  public void setU8(int u8) { this.u8 = u8; }\n\n  public short getI16() { return i16; }\n\n  public void setI16(short i16) { this.i16 = i16; }\n\n  public int getU16() { return u16; }\n\n  public void setU16(int u16) { this.u16 = u16; }\n\n  public int getI32() { return i32; }\n\n  public void setI32(int i32) { this.i32 = i32; }\n\n  public long getU32() { return u32; }\n\n  public void setU32(long u32) { this.u32 = u32; }\n\n  public long getI64() { return i64; }\n\n  public void setI64(long i64) { this.i64 = i64; }\n\n  public long getU64() { return u64; }\n\n  public void setU64(long u64) { this.u64 = u64; }\n\n  public float getF32() { return f32; }\n\n  public void setF32(float f32) { this.f32 = f32; }\n\n  public double getF64() { return f64; }\n\n  public void setF64(double f64) { this.f64 = f64; }\n\n  public byte[] getV8() { return v8; }\n\n  public void setV8(byte[] v8) { this.v8 = v8; }\n\n  public double[] getVf64() { return vf64; }\n\n  public void setVf64(double[] vf64) { this.vf64 = vf64; }\n\n\n  public TypeAliasesT() {\n    this.i8 = 0;\n    this.u8 = 0;\n    this.i16 = 0;\n    this.u16 = 0;\n    this.i32 = 0;\n    this.u32 = 0L;\n    this.i64 = 0L;\n    this.u64 = 0L;\n    this.f32 = 0.0f;\n    this.f64 = 0.0;\n    this.v8 = null;\n    this.vf64 = null;\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/Vec3.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace MyGame.Example\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct Vec3 : IFlatbufferObject\n{\n  private Struct __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Struct(_i, _bb); }\n  public Vec3 __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public float X { get { return __p.bb.GetFloat(__p.bb_pos + 0); } }\n  public void MutateX(float x) { __p.bb.PutFloat(__p.bb_pos + 0, x); }\n  public float Y { get { return __p.bb.GetFloat(__p.bb_pos + 4); } }\n  public void MutateY(float y) { __p.bb.PutFloat(__p.bb_pos + 4, y); }\n  public float Z { get { return __p.bb.GetFloat(__p.bb_pos + 8); } }\n  public void MutateZ(float z) { __p.bb.PutFloat(__p.bb_pos + 8, z); }\n  public double Test1 { get { return __p.bb.GetDouble(__p.bb_pos + 16); } }\n  public void MutateTest1(double test1) { __p.bb.PutDouble(__p.bb_pos + 16, test1); }\n  public MyGame.Example.Color Test2 { get { return (MyGame.Example.Color)__p.bb.Get(__p.bb_pos + 24); } }\n  public void MutateTest2(MyGame.Example.Color test2) { __p.bb.Put(__p.bb_pos + 24, (byte)test2); }\n  public MyGame.Example.Test Test3 { get { return (new MyGame.Example.Test()).__assign(__p.bb_pos + 26, __p.bb); } }\n\n  public static Offset<MyGame.Example.Vec3> CreateVec3(FlatBufferBuilder builder, float X, float Y, float Z, double Test1, MyGame.Example.Color Test2, short test3_A, sbyte test3_B) {\n    builder.Prep(8, 32);\n    builder.Pad(2);\n    builder.Prep(2, 4);\n    builder.Pad(1);\n    builder.PutSbyte(test3_B);\n    builder.PutShort(test3_A);\n    builder.Pad(1);\n    builder.PutByte((byte)Test2);\n    builder.PutDouble(Test1);\n    builder.Pad(4);\n    builder.PutFloat(Z);\n    builder.PutFloat(Y);\n    builder.PutFloat(X);\n    return new Offset<MyGame.Example.Vec3>(builder.Offset);\n  }\n  public Vec3T UnPack() {\n    var _o = new Vec3T();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(Vec3T _o) {\n    _o.X = this.X;\n    _o.Y = this.Y;\n    _o.Z = this.Z;\n    _o.Test1 = this.Test1;\n    _o.Test2 = this.Test2;\n    _o.Test3 = this.Test3.UnPack();\n  }\n  public static Offset<MyGame.Example.Vec3> Pack(FlatBufferBuilder builder, Vec3T _o) {\n    if (_o == null) return default(Offset<MyGame.Example.Vec3>);\n    var _test3_a = _o.Test3.A;\n    var _test3_b = _o.Test3.B;\n    return CreateVec3(\n      builder,\n      _o.X,\n      _o.Y,\n      _o.Z,\n      _o.Test1,\n      _o.Test2,\n      _test3_a,\n      _test3_b);\n  }\n}\n\npublic class Vec3T\n{\n  [Newtonsoft.Json.JsonProperty(\"x\")]\n  public float X { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"y\")]\n  public float Y { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"z\")]\n  public float Z { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"test1\")]\n  public double Test1 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"test2\")]\n  public MyGame.Example.Color Test2 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"test3\")]\n  public MyGame.Example.TestT Test3 { get; set; }\n\n  public Vec3T() {\n    this.X = 0.0f;\n    this.Y = 0.0f;\n    this.Z = 0.0f;\n    this.Test1 = 0.0;\n    this.Test2 = 0;\n    this.Test3 = new MyGame.Example.TestT();\n  }\n}\n\n\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Vec3.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage Example\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n)\n\ntype Vec3T struct {\n\tX float32 `json:\"x\"`\n\tY float32 `json:\"y\"`\n\tZ float32 `json:\"z\"`\n\tTest1 float64 `json:\"test1\"`\n\tTest2 Color `json:\"test2\"`\n\tTest3 *TestT `json:\"test3\"`\n}\n\nfunc (t *Vec3T) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\tif t == nil {\n\t\treturn 0\n\t}\n\treturn CreateVec3(builder, t.X, t.Y, t.Z, t.Test1, t.Test2, t.Test3.A, t.Test3.B)\n}\nfunc (rcv *Vec3) UnPackTo(t *Vec3T) {\n\tt.X = rcv.X()\n\tt.Y = rcv.Y()\n\tt.Z = rcv.Z()\n\tt.Test1 = rcv.Test1()\n\tt.Test2 = rcv.Test2()\n\tt.Test3 = rcv.Test3(nil).UnPack()\n}\n\nfunc (rcv *Vec3) UnPack() *Vec3T {\n\tif rcv == nil {\n\t\treturn nil\n\t}\n\tt := &Vec3T{}\n\trcv.UnPackTo(t)\n\treturn t\n}\n\ntype Vec3 struct {\n\t_tab flatbuffers.Struct\n}\n\nfunc (rcv *Vec3) Init(buf []byte, i flatbuffers.UOffsetT) {\n\trcv._tab.Bytes = buf\n\trcv._tab.Pos = i\n}\n\nfunc (rcv *Vec3) Table() flatbuffers.Table {\n\treturn rcv._tab.Table\n}\n\nfunc (rcv *Vec3) X() float32 {\n\treturn rcv._tab.GetFloat32(rcv._tab.Pos + flatbuffers.UOffsetT(0))\n}\nfunc (rcv *Vec3) MutateX(n float32) bool {\n\treturn rcv._tab.MutateFloat32(rcv._tab.Pos+flatbuffers.UOffsetT(0), n)\n}\n\nfunc (rcv *Vec3) Y() float32 {\n\treturn rcv._tab.GetFloat32(rcv._tab.Pos + flatbuffers.UOffsetT(4))\n}\nfunc (rcv *Vec3) MutateY(n float32) bool {\n\treturn rcv._tab.MutateFloat32(rcv._tab.Pos+flatbuffers.UOffsetT(4), n)\n}\n\nfunc (rcv *Vec3) Z() float32 {\n\treturn rcv._tab.GetFloat32(rcv._tab.Pos + flatbuffers.UOffsetT(8))\n}\nfunc (rcv *Vec3) MutateZ(n float32) bool {\n\treturn rcv._tab.MutateFloat32(rcv._tab.Pos+flatbuffers.UOffsetT(8), n)\n}\n\nfunc (rcv *Vec3) Test1() float64 {\n\treturn rcv._tab.GetFloat64(rcv._tab.Pos + flatbuffers.UOffsetT(16))\n}\nfunc (rcv *Vec3) MutateTest1(n float64) bool {\n\treturn rcv._tab.MutateFloat64(rcv._tab.Pos+flatbuffers.UOffsetT(16), n)\n}\n\nfunc (rcv *Vec3) Test2() Color {\n\treturn Color(rcv._tab.GetByte(rcv._tab.Pos + flatbuffers.UOffsetT(24)))\n}\nfunc (rcv *Vec3) MutateTest2(n Color) bool {\n\treturn rcv._tab.MutateByte(rcv._tab.Pos+flatbuffers.UOffsetT(24), byte(n))\n}\n\nfunc (rcv *Vec3) Test3(obj *Test) *Test {\n\tif obj == nil {\n\t\tobj = new(Test)\n\t}\n\tobj.Init(rcv._tab.Bytes, rcv._tab.Pos+26)\n\treturn obj\n}\n\nfunc CreateVec3(builder *flatbuffers.Builder, x float32, y float32, z float32, test1 float64, test2 Color, test3_a int16, test3_b int8) flatbuffers.UOffsetT {\n\tbuilder.Prep(8, 32)\n\tbuilder.Pad(2)\n\tbuilder.Prep(2, 4)\n\tbuilder.Pad(1)\n\tbuilder.PrependInt8(test3_b)\n\tbuilder.PrependInt16(test3_a)\n\tbuilder.Pad(1)\n\tbuilder.PrependByte(byte(test2))\n\tbuilder.PrependFloat64(test1)\n\tbuilder.Pad(4)\n\tbuilder.PrependFloat32(z)\n\tbuilder.PrependFloat32(y)\n\tbuilder.PrependFloat32(x)\n\treturn builder.Offset()\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Vec3.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class Vec3 extends Struct {\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public Vec3 __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public float x() { return bb.getFloat(bb_pos + 0); }\n  public void mutateX(float x) { bb.putFloat(bb_pos + 0, x); }\n  public float y() { return bb.getFloat(bb_pos + 4); }\n  public void mutateY(float y) { bb.putFloat(bb_pos + 4, y); }\n  public float z() { return bb.getFloat(bb_pos + 8); }\n  public void mutateZ(float z) { bb.putFloat(bb_pos + 8, z); }\n  public double test1() { return bb.getDouble(bb_pos + 16); }\n  public void mutateTest1(double test1) { bb.putDouble(bb_pos + 16, test1); }\n  public int test2() { return bb.get(bb_pos + 24) & 0xFF; }\n  public void mutateTest2(int test2) { bb.put(bb_pos + 24, (byte) test2); }\n  public MyGame.Example.Test test3() { return test3(new MyGame.Example.Test()); }\n  public MyGame.Example.Test test3(MyGame.Example.Test obj) { return obj.__assign(bb_pos + 26, bb); }\n\n  public static int createVec3(FlatBufferBuilder builder, float x, float y, float z, double test1, int test2, short test3_a, byte test3_b) {\n    builder.prep(8, 32);\n    builder.pad(2);\n    builder.prep(2, 4);\n    builder.pad(1);\n    builder.putByte(test3_b);\n    builder.putShort(test3_a);\n    builder.pad(1);\n    builder.putByte((byte) test2);\n    builder.putDouble(test1);\n    builder.pad(4);\n    builder.putFloat(z);\n    builder.putFloat(y);\n    builder.putFloat(x);\n    return builder.offset();\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public Vec3 get(int j) { return get(new Vec3(), j); }\n    public Vec3 get(Vec3 obj, int j) {  return obj.__assign(__element(j), bb); }\n  }\n  public Vec3T unpack() {\n    Vec3T _o = new Vec3T();\n    unpackTo(_o);\n    return _o;\n  }\n  public void unpackTo(Vec3T _o) {\n    float _oX = x();\n    _o.setX(_oX);\n    float _oY = y();\n    _o.setY(_oY);\n    float _oZ = z();\n    _o.setZ(_oZ);\n    double _oTest1 = test1();\n    _o.setTest1(_oTest1);\n    int _oTest2 = test2();\n    _o.setTest2(_oTest2);\n    test3().unpackTo(_o.getTest3());\n  }\n  public static int pack(FlatBufferBuilder builder, Vec3T _o) {\n    if (_o == null) return 0;\n    short _test3_a = _o.getTest3().getA();\n    byte _test3_b = _o.getTest3().getB();\n    return createVec3(\n      builder,\n      _o.getX(),\n      _o.getY(),\n      _o.getZ(),\n      _o.getTest1(),\n      _o.getTest2(),\n      _test3_a,\n      _test3_b);\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/Vec3.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example\n\nimport com.google.flatbuffers.BaseVector\nimport com.google.flatbuffers.BooleanVector\nimport com.google.flatbuffers.ByteVector\nimport com.google.flatbuffers.Constants\nimport com.google.flatbuffers.DoubleVector\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.FloatVector\nimport com.google.flatbuffers.LongVector\nimport com.google.flatbuffers.StringVector\nimport com.google.flatbuffers.Struct\nimport com.google.flatbuffers.Table\nimport com.google.flatbuffers.UnionVector\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport kotlin.math.sign\n\n@Suppress(\"unused\")\nclass Vec3 : Struct() {\n\n    fun __init(_i: Int, _bb: ByteBuffer)  {\n        __reset(_i, _bb)\n    }\n    fun __assign(_i: Int, _bb: ByteBuffer) : Vec3 {\n        __init(_i, _bb)\n        return this\n    }\n    val x : Float get() = bb.getFloat(bb_pos + 0)\n    fun mutateX(x: Float) : ByteBuffer = bb.putFloat(bb_pos + 0, x)\n    val y : Float get() = bb.getFloat(bb_pos + 4)\n    fun mutateY(y: Float) : ByteBuffer = bb.putFloat(bb_pos + 4, y)\n    val z : Float get() = bb.getFloat(bb_pos + 8)\n    fun mutateZ(z: Float) : ByteBuffer = bb.putFloat(bb_pos + 8, z)\n    val test1 : Double get() = bb.getDouble(bb_pos + 16)\n    fun mutateTest1(test1: Double) : ByteBuffer = bb.putDouble(bb_pos + 16, test1)\n    val test2 : UByte get() = bb.get(bb_pos + 24).toUByte()\n    fun mutateTest2(test2: UByte) : ByteBuffer = bb.put(bb_pos + 24, test2.toByte())\n    val test3 : MyGame.Example.Test? get() = test3(MyGame.Example.Test())\n    fun test3(obj: MyGame.Example.Test) : MyGame.Example.Test? = obj.__assign(bb_pos + 26, bb)\n    companion object {\n        fun createVec3(builder: FlatBufferBuilder, x: Float, y: Float, z: Float, test1: Double, test2: UByte, test3_a: Short, test3_b: Byte) : Int {\n            builder.prep(8, 32)\n            builder.pad(2)\n            builder.prep(2, 4)\n            builder.pad(1)\n            builder.putByte(test3_b)\n            builder.putShort(test3_a)\n            builder.pad(1)\n            builder.putByte(test2.toByte())\n            builder.putDouble(test1)\n            builder.pad(4)\n            builder.putFloat(z)\n            builder.putFloat(y)\n            builder.putFloat(x)\n            return builder.offset()\n        }\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Vec3.lua",
    "content": "--[[ MyGame.Example.Vec3\n\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : //monster_test.fbs\n  Rooting type : MyGame.Example.Monster (//monster_test.fbs)\n\n--]]\n\nlocal flatbuffers = require('flatbuffers')\n\nlocal Vec3 = {}\nlocal mt = {}\n\nfunction Vec3.New()\n  local o = {}\n  setmetatable(o, {__index = mt})\n  return o\nend\n\nfunction mt:Init(buf, pos)\n  self.view = flatbuffers.view.New(buf, pos)\nend\n\nfunction mt:X()\n  return self.view:Get(flatbuffers.N.Float32, self.view.pos + 0)\nend\n\nfunction mt:Y()\n  return self.view:Get(flatbuffers.N.Float32, self.view.pos + 4)\nend\n\nfunction mt:Z()\n  return self.view:Get(flatbuffers.N.Float32, self.view.pos + 8)\nend\n\nfunction mt:Test1()\n  return self.view:Get(flatbuffers.N.Float64, self.view.pos + 16)\nend\n\nfunction mt:Test2()\n  return self.view:Get(flatbuffers.N.Uint8, self.view.pos + 24)\nend\n\nfunction mt:Test3(obj)\n  obj:Init(self.view.bytes, self.view.pos + 26)\n  return obj\nend\n\nfunction Vec3.CreateVec3(builder, x, y, z, test1, test2, test3_a, test3_b)\n  builder:Prep(8, 32)\n  builder:Pad(2)\n  builder:Prep(2, 4)\n  builder:Pad(1)\n  builder:PrependInt8(test3_b)\n  builder:PrependInt16(test3_a)\n  builder:Pad(1)\n  builder:PrependUint8(test2)\n  builder:PrependFloat64(test1)\n  builder:Pad(4)\n  builder:PrependFloat32(z)\n  builder:PrependFloat32(y)\n  builder:PrependFloat32(x)\n  return builder:Offset()\nend\n\nreturn Vec3"
  },
  {
    "path": "tests/MyGame/Example/Vec3.nim",
    "content": "#[ MyGame.Example.Vec3\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : \n  Rooting type : MyGame.Example.Monster ()\n]#\n\nimport Color as MyGame_Example_Color\nimport Test as MyGame_Example_Test\nimport flatbuffers\n\ntype Vec3* = object of FlatObj\nfunc x*(self: Vec3): float32 =\n  return Get[float32](self.tab, self.tab.Pos + 0)\nfunc `x=`*(self: var Vec3, n: float32): bool =\n  return self.tab.Mutate(self.tab.Pos + 0, n)\nfunc y*(self: Vec3): float32 =\n  return Get[float32](self.tab, self.tab.Pos + 4)\nfunc `y=`*(self: var Vec3, n: float32): bool =\n  return self.tab.Mutate(self.tab.Pos + 4, n)\nfunc z*(self: Vec3): float32 =\n  return Get[float32](self.tab, self.tab.Pos + 8)\nfunc `z=`*(self: var Vec3, n: float32): bool =\n  return self.tab.Mutate(self.tab.Pos + 8, n)\nfunc test1*(self: Vec3): float64 =\n  return Get[float64](self.tab, self.tab.Pos + 16)\nfunc `test1=`*(self: var Vec3, n: float64): bool =\n  return self.tab.Mutate(self.tab.Pos + 16, n)\nfunc test2*(self: Vec3): MyGame_Example_Color.Color =\n  return MyGame_Example_Color.Color(Get[uint8](self.tab, self.tab.Pos + 24))\nfunc `test2=`*(self: var Vec3, n: MyGame_Example_Color.Color): bool =\n  return self.tab.Mutate(self.tab.Pos + 24, n)\nfunc test3*(self: Vec3): MyGame_Example_Test.Test =\n  return MyGame_Example_Test.Test(tab: Vtable(Bytes: self.tab.Bytes, Pos: self.tab.Pos + 26))\nproc Vec3Create*(self: var Builder, x: float32, y: float32, z: float32, test1: float64, test2: MyGame_Example_Color.Color, test3_a: int16, test3_b: int8): uoffset =\n  self.Prep(8, 32)\n  self.Pad(2)\n  self.Prep(2, 4)\n  self.Pad(1)\n  self.Prepend(test3_b)\n  self.Prepend(test3_a)\n  self.Pad(1)\n  self.Prepend(test2)\n  self.Prepend(test1)\n  self.Pad(4)\n  self.Prepend(z)\n  self.Prepend(y)\n  self.Prepend(x)\n  return self.Offset()\n"
  },
  {
    "path": "tests/MyGame/Example/Vec3.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nnamespace MyGame\\Example;\n\nuse \\Google\\FlatBuffers\\Struct;\nuse \\Google\\FlatBuffers\\Table;\nuse \\Google\\FlatBuffers\\ByteBuffer;\nuse \\Google\\FlatBuffers\\FlatBufferBuilder;\n\nclass Vec3 extends Struct\n{\n    /**\n     * @param int $_i offset\n     * @param ByteBuffer $_bb\n     * @return Vec3\n     **/\n    public function init($_i, ByteBuffer $_bb)\n    {\n        $this->bb_pos = $_i;\n        $this->bb = $_bb;\n        return $this;\n    }\n\n    /**\n     * @return float\n     */\n    public function GetX()\n    {\n        return $this->bb->getFloat($this->bb_pos + 0);\n    }\n\n    /**\n     * @return float\n     */\n    public function GetY()\n    {\n        return $this->bb->getFloat($this->bb_pos + 4);\n    }\n\n    /**\n     * @return float\n     */\n    public function GetZ()\n    {\n        return $this->bb->getFloat($this->bb_pos + 8);\n    }\n\n    /**\n     * @return double\n     */\n    public function GetTest1()\n    {\n        return $this->bb->getDouble($this->bb_pos + 16);\n    }\n\n    /**\n     * @return byte\n     */\n    public function GetTest2()\n    {\n        return $this->bb->getByte($this->bb_pos + 24);\n    }\n\n    /**\n     * @return Test\n     */\n    public function getTest3()\n    {\n        $obj = new Test();\n        $obj->init($this->bb_pos + 26, $this->bb);\n        return $obj;\n    }\n\n\n    /**\n     * @return int offset\n     */\n    public static function createVec3(FlatBufferBuilder $builder, $x, $y, $z, $test1, $test2, $test3_a, $test3_b)\n    {\n        $builder->prep(8, 32);\n        $builder->pad(2);\n        $builder->prep(2, 4);\n        $builder->pad(1);\n        $builder->putSbyte($test3_b);\n        $builder->putShort($test3_a);\n        $builder->pad(1);\n        $builder->putByte($test2);\n        $builder->putDouble($test1);\n        $builder->pad(4);\n        $builder->putFloat($z);\n        $builder->putFloat($y);\n        $builder->putFloat($x);\n        return $builder->offset();\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example/Vec3.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: Example\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\nclass Vec3(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def SizeOf(cls):\n        return 32\n\n    # Vec3\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # Vec3\n    def X(self): return self._tab.Get(flatbuffers.number_types.Float32Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(0))\n    # Vec3\n    def Y(self): return self._tab.Get(flatbuffers.number_types.Float32Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(4))\n    # Vec3\n    def Z(self): return self._tab.Get(flatbuffers.number_types.Float32Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(8))\n    # Vec3\n    def Test1(self): return self._tab.Get(flatbuffers.number_types.Float64Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(16))\n    # Vec3\n    def Test2(self): return self._tab.Get(flatbuffers.number_types.Uint8Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(24))\n    # Vec3\n    def Test3(self, obj):\n        obj.Init(self._tab.Bytes, self._tab.Pos + 26)\n        return obj\n\n\ndef CreateVec3(builder, x, y, z, test1, test2, test3_a, test3_b):\n    builder.Prep(8, 32)\n    builder.Pad(2)\n    builder.Prep(2, 4)\n    builder.Pad(1)\n    builder.PrependInt8(test3_b)\n    builder.PrependInt16(test3_a)\n    builder.Pad(1)\n    builder.PrependUint8(test2)\n    builder.PrependFloat64(test1)\n    builder.Pad(4)\n    builder.PrependFloat32(z)\n    builder.PrependFloat32(y)\n    builder.PrependFloat32(x)\n    return builder.Offset()\n\nimport MyGame.Example.Test\ntry:\n    from typing import Optional\nexcept:\n    pass\n\nclass Vec3T(object):\n\n    # Vec3T\n    def __init__(\n        self,\n        x = 0.0,\n        y = 0.0,\n        z = 0.0,\n        test1 = 0.0,\n        test2 = 0,\n        test3 = None,\n    ):\n        self.x = x  # type: float\n        self.y = y  # type: float\n        self.z = z  # type: float\n        self.test1 = test1  # type: float\n        self.test2 = test2  # type: int\n        self.test3 = test3  # type: Optional[MyGame.Example.Test.TestT]\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        vec3 = Vec3()\n        vec3.Init(buf, pos)\n        return cls.InitFromObj(vec3)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, vec3):\n        x = Vec3T()\n        x._UnPack(vec3)\n        return x\n\n    # Vec3T\n    def _UnPack(self, vec3):\n        if vec3 is None:\n            return\n        self.x = vec3.X()\n        self.y = vec3.Y()\n        self.z = vec3.Z()\n        self.test1 = vec3.Test1()\n        self.test2 = vec3.Test2()\n        if vec3.Test3(MyGame.Example.Test.Test()) is not None:\n            self.test3 = MyGame.Example.Test.TestT.InitFromObj(vec3.Test3(MyGame.Example.Test.Test()))\n\n    # Vec3T\n    def Pack(self, builder):\n        return CreateVec3(builder, self.x, self.y, self.z, self.test1, self.test2, self.test3.a, self.test3.b)\n"
  },
  {
    "path": "tests/MyGame/Example/Vec3T.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\npublic class Vec3T {\n  private float x;\n  private float y;\n  private float z;\n  private double test1;\n  private int test2;\n  private MyGame.Example.TestT test3;\n\n  public float getX() { return x; }\n\n  public void setX(float x) { this.x = x; }\n\n  public float getY() { return y; }\n\n  public void setY(float y) { this.y = y; }\n\n  public float getZ() { return z; }\n\n  public void setZ(float z) { this.z = z; }\n\n  public double getTest1() { return test1; }\n\n  public void setTest1(double test1) { this.test1 = test1; }\n\n  public int getTest2() { return test2; }\n\n  public void setTest2(int test2) { this.test2 = test2; }\n\n  public MyGame.Example.TestT getTest3() { return test3; }\n\n  public void setTest3(MyGame.Example.TestT test3) { this.test3 = test3; }\n\n\n  public Vec3T() {\n    this.x = 0.0f;\n    this.y = 0.0f;\n    this.z = 0.0f;\n    this.test1 = 0.0;\n    this.test2 = 0;\n    this.test3 = new MyGame.Example.TestT();\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example/__init__.py",
    "content": ""
  },
  {
    "path": "tests/MyGame/Example/monster_test_grpc_fb.py",
    "content": "# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!\nimport grpc\n\n\nclass MonsterStorageStub(object):\n\n  def __init__(self, channel):\n    \"\"\"Constructor.\n\n    Args:\n      channel: A grpc.Channel.\n    \"\"\"\n    self.Store = channel.unary_unary(\n        '/MyGame.Example.MonsterStorage/Store',\n    )\n    self.Retrieve = channel.unary_stream(\n        '/MyGame.Example.MonsterStorage/Retrieve',\n    )\n    self.GetMaxHitPoint = channel.stream_unary(\n        '/MyGame.Example.MonsterStorage/GetMaxHitPoint',\n    )\n    self.GetMinMaxHitPoints = channel.unary_unary(\n        '/MyGame.Example.MonsterStorage/GetMinMaxHitPoints',\n    )\n\n\nclass MonsterStorageServicer(object):\n\n  def Store(self, request, context):\n    context.set_code(grpc.StatusCode.UNIMPLEMENTED)\n    context.set_details('Method not implemented!')\n    raise NotImplementedError('Method not implemented!')\n\n  def Retrieve(self, request, context):\n    context.set_code(grpc.StatusCode.UNIMPLEMENTED)\n    context.set_details('Method not implemented!')\n    raise NotImplementedError('Method not implemented!')\n\n  def GetMaxHitPoint(self, request_iterator, context):\n    context.set_code(grpc.StatusCode.UNIMPLEMENTED)\n    context.set_details('Method not implemented!')\n    raise NotImplementedError('Method not implemented!')\n\n  def GetMinMaxHitPoints(self, request, context):\n    context.set_code(grpc.StatusCode.UNIMPLEMENTED)\n    context.set_details('Method not implemented!')\n    raise NotImplementedError('Method not implemented!')\n\n\ndef add_MonsterStorageServicer_to_server(servicer, server):\n  rpc_method_handlers = {\n      'Store': grpc.unary_unary_rpc_method_handler(\n          servicer.Store,\n      ),\n      'Retrieve': grpc.unary_stream_rpc_method_handler(\n          servicer.Retrieve,\n      ),\n      'GetMaxHitPoint': grpc.stream_unary_rpc_method_handler(\n          servicer.GetMaxHitPoint,\n      ),\n      'GetMinMaxHitPoints': grpc.unary_unary_rpc_method_handler(\n          servicer.GetMinMaxHitPoints,\n      ),\n  }\n  generic_handler = grpc.method_handlers_generic_handler(\n      'MyGame.Example.MonsterStorage', rpc_method_handlers\n  )\n  server.add_generic_rpc_handlers((generic_handler,))\n\n\ntry:\n  # THESE ELEMENTS WILL BE DEPRECATED.\n  # Please use the generated *_pb2_grpc.py files instead.\n  import grpc\n  from grpc.beta import implementations as beta_implementations\n  from grpc.beta import interfaces as beta_interfaces\n  from grpc.framework.common import cardinality\n  from grpc.framework.interfaces.face import utilities as face_utilities\n\n  class MonsterStorageStub(object):\n\n    def __init__(self, channel):\n      \"\"\"Constructor.\n\n      Args:\n        channel: A grpc.Channel.\n      \"\"\"\n      self.Store = channel.unary_unary(\n          '/MyGame.Example.MonsterStorage/Store',\n      )\n      self.Retrieve = channel.unary_stream(\n          '/MyGame.Example.MonsterStorage/Retrieve',\n      )\n      self.GetMaxHitPoint = channel.stream_unary(\n          '/MyGame.Example.MonsterStorage/GetMaxHitPoint',\n      )\n      self.GetMinMaxHitPoints = channel.unary_unary(\n          '/MyGame.Example.MonsterStorage/GetMinMaxHitPoints',\n      )\n\n  class MonsterStorageServicer(object):\n\n    def Store(self, request, context):\n      context.set_code(grpc.StatusCode.UNIMPLEMENTED)\n      context.set_details('Method not implemented!')\n      raise NotImplementedError('Method not implemented!')\n\n    def Retrieve(self, request, context):\n      context.set_code(grpc.StatusCode.UNIMPLEMENTED)\n      context.set_details('Method not implemented!')\n      raise NotImplementedError('Method not implemented!')\n\n    def GetMaxHitPoint(self, request_iterator, context):\n      context.set_code(grpc.StatusCode.UNIMPLEMENTED)\n      context.set_details('Method not implemented!')\n      raise NotImplementedError('Method not implemented!')\n\n    def GetMinMaxHitPoints(self, request, context):\n      context.set_code(grpc.StatusCode.UNIMPLEMENTED)\n      context.set_details('Method not implemented!')\n      raise NotImplementedError('Method not implemented!')\n\n  def add_MonsterStorageServicer_to_server(servicer, server):\n    rpc_method_handlers = {\n        'Store': grpc.unary_unary_rpc_method_handler(\n            servicer.Store,\n        ),\n        'Retrieve': grpc.unary_stream_rpc_method_handler(\n            servicer.Retrieve,\n        ),\n        'GetMaxHitPoint': grpc.stream_unary_rpc_method_handler(\n            servicer.GetMaxHitPoint,\n        ),\n        'GetMinMaxHitPoints': grpc.unary_unary_rpc_method_handler(\n            servicer.GetMinMaxHitPoints,\n        ),\n    }\n    generic_handler = grpc.method_handlers_generic_handler(\n        'MyGame.Example.MonsterStorage', rpc_method_handlers\n    )\n    server.add_generic_rpc_handlers((generic_handler,))\n\n  class BetaMonsterStorageServicer(object):\n    \"\"\"The Beta API is deprecated for 0.15.0 and later.\n\n    It is recommended to use the GA API (classes and functions in this\n    file not marked beta) for all further purposes. This class was generated\n    only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0.\n    \"\"\"\n\n    def Store(self, request, context):\n      context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)\n\n    def Retrieve(self, request, context):\n      context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)\n\n    def GetMaxHitPoint(self, request_iterator, context):\n      context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)\n\n    def GetMinMaxHitPoints(self, request, context):\n      context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)\n\n  class BetaMonsterStorageStub(object):\n    \"\"\"The Beta API is deprecated for 0.15.0 and later.\n\n    It is recommended to use the GA API (classes and functions in this\n    file not marked beta) for all further purposes. This class was generated\n    only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0.\n    \"\"\"\n\n    def Store(\n        self,\n        request,\n        timeout,\n        metadata=None,\n        with_call=False,\n        protocol_options=None,\n    ):\n      raise NotImplementedError()\n\n    Store.future = None\n\n    def Retrieve(\n        self,\n        request,\n        timeout,\n        metadata=None,\n        with_call=False,\n        protocol_options=None,\n    ):\n      raise NotImplementedError()\n\n    def GetMaxHitPoint(\n        self,\n        request_iterator,\n        timeout,\n        metadata=None,\n        with_call=False,\n        protocol_options=None,\n    ):\n      raise NotImplementedError()\n\n    GetMaxHitPoint.future = None\n\n    def GetMinMaxHitPoints(\n        self,\n        request,\n        timeout,\n        metadata=None,\n        with_call=False,\n        protocol_options=None,\n    ):\n      raise NotImplementedError()\n\n    GetMinMaxHitPoints.future = None\n\n  def beta_create_MonsterStorage_server(\n      servicer,\n      pool=None,\n      pool_size=None,\n      default_timeout=None,\n      maximum_timeout=None,\n  ):\n    \"\"\"The Beta API is deprecated for 0.15.0 and later.\n\n    It is recommended to use the GA API (classes and functions in this\n    file not marked beta) for all further purposes. This function was\n    generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0\n    \"\"\"\n    method_implementations = {\n        (\n            'MyGame.Example.MonsterStorage',\n            'GetMaxHitPoint',\n        ): face_utilities.stream_unary_inline(servicer.GetMaxHitPoint),\n        (\n            'MyGame.Example.MonsterStorage',\n            'GetMinMaxHitPoints',\n        ): face_utilities.unary_unary_inline(servicer.GetMinMaxHitPoints),\n        (\n            'MyGame.Example.MonsterStorage',\n            'Retrieve',\n        ): face_utilities.unary_stream_inline(servicer.Retrieve),\n        (\n            'MyGame.Example.MonsterStorage',\n            'Store',\n        ): face_utilities.unary_unary_inline(servicer.Store),\n    }\n    server_options = beta_implementations.server_options(\n        thread_pool=pool,\n        thread_pool_size=pool_size,\n        default_timeout=default_timeout,\n        maximum_timeout=maximum_timeout,\n    )\n    return beta_implementations.server(\n        method_implementations, options=server_options\n    )\n\n  def beta_create_MonsterStorage_stub(\n      channel, host=None, metadata_transformer=None, pool=None, pool_size=None\n  ):\n    \"\"\"The Beta API is deprecated for 0.15.0 and later.\n\n    It is recommended to use the GA API (classes and functions in this\n    file not marked beta) for all further purposes. This function was\n    generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0\n    \"\"\"\n    cardinalities = {\n        'GetMaxHitPoint': cardinality.Cardinality.STREAM_UNARY,\n        'GetMinMaxHitPoints': cardinality.Cardinality.UNARY_UNARY,\n        'Retrieve': cardinality.Cardinality.UNARY_STREAM,\n        'Store': cardinality.Cardinality.UNARY_UNARY,\n    }\n    stub_options = beta_implementations.stub_options(\n        host=host,\n        metadata_transformer=metadata_transformer,\n        thread_pool=pool,\n        thread_pool_size=pool_size,\n    )\n    return beta_implementations.dynamic_stub(\n        channel,\n        'MyGame.Example.MonsterStorage',\n        cardinalities,\n        options=stub_options,\n    )\n\nexcept ImportError:\n  pass\n"
  },
  {
    "path": "tests/MyGame/Example2/Monster.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace MyGame.Example2\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct Monster : IFlatbufferObject\n{\n  private Table __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_25_12_19(); }\n  public static Monster GetRootAsMonster(ByteBuffer _bb) { return GetRootAsMonster(_bb, new Monster()); }\n  public static Monster GetRootAsMonster(ByteBuffer _bb, Monster obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }\n  public Monster __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n\n  public static void StartMonster(FlatBufferBuilder builder) { builder.StartTable(0); }\n  public static Offset<MyGame.Example2.Monster> EndMonster(FlatBufferBuilder builder) {\n    int o = builder.EndTable();\n    return new Offset<MyGame.Example2.Monster>(o);\n  }\n  public MonsterT UnPack() {\n    var _o = new MonsterT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(MonsterT _o) {\n  }\n  public static Offset<MyGame.Example2.Monster> Pack(FlatBufferBuilder builder, MonsterT _o) {\n    if (_o == null) return default(Offset<MyGame.Example2.Monster>);\n    StartMonster(builder);\n    return EndMonster(builder);\n  }\n}\n\npublic class MonsterT\n{\n\n  public MonsterT() {\n  }\n}\n\n\nstatic public class MonsterVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos)\n  {\n    return verifier.VerifyTableStart(tablePos)\n      && verifier.VerifyTableEnd(tablePos);\n  }\n}\n\n}\n"
  },
  {
    "path": "tests/MyGame/Example2/Monster.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage Example2\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n)\n\ntype MonsterT struct {\n}\n\nfunc (t *MonsterT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\tif t == nil {\n\t\treturn 0\n\t}\n\tMonsterStart(builder)\n\treturn MonsterEnd(builder)\n}\n\nfunc (rcv *Monster) UnPackTo(t *MonsterT) {\n}\n\nfunc (rcv *Monster) UnPack() *MonsterT {\n\tif rcv == nil {\n\t\treturn nil\n\t}\n\tt := &MonsterT{}\n\trcv.UnPackTo(t)\n\treturn t\n}\n\ntype Monster struct {\n\t_tab flatbuffers.Table\n}\n\nfunc GetRootAsMonster(buf []byte, offset flatbuffers.UOffsetT) *Monster {\n\tn := flatbuffers.GetUOffsetT(buf[offset:])\n\tx := &Monster{}\n\tx.Init(buf, n+offset)\n\treturn x\n}\n\nfunc FinishMonsterBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {\n\tbuilder.Finish(offset)\n}\n\nfunc GetSizePrefixedRootAsMonster(buf []byte, offset flatbuffers.UOffsetT) *Monster {\n\tn := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])\n\tx := &Monster{}\n\tx.Init(buf, n+offset+flatbuffers.SizeUint32)\n\treturn x\n}\n\nfunc FinishSizePrefixedMonsterBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {\n\tbuilder.FinishSizePrefixed(offset)\n}\n\nfunc (rcv *Monster) Init(buf []byte, i flatbuffers.UOffsetT) {\n\trcv._tab.Bytes = buf\n\trcv._tab.Pos = i\n}\n\nfunc (rcv *Monster) Table() flatbuffers.Table {\n\treturn rcv._tab\n}\n\nfunc MonsterStart(builder *flatbuffers.Builder) {\n\tbuilder.StartObject(0)\n}\nfunc MonsterEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\treturn builder.EndObject()\n}\n"
  },
  {
    "path": "tests/MyGame/Example2/Monster.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example2;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class Monster extends com.google.flatbuffers.Table {\n  public static void ValidateVersion() { Constants.FLATBUFFERS_25_12_19(); }\n  public static Monster getRootAsMonster(ByteBuffer _bb) { return getRootAsMonster(_bb, new Monster()); }\n  public static Monster getRootAsMonster(ByteBuffer _bb, Monster obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public Monster __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n\n  public static void startMonster(FlatBufferBuilder builder) { builder.startTable(0); }\n  public static int endMonster(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    return o;\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public Monster get(int j) { return get(new Monster(), j); }\n    public Monster get(Monster obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); }\n  }\n  public MonsterT unpack() {\n    MonsterT _o = new MonsterT();\n    unpackTo(_o);\n    return _o;\n  }\n  public void unpackTo(MonsterT _o) {\n  }\n  public static int pack(FlatBufferBuilder builder, MonsterT _o) {\n    if (_o == null) return 0;\n    startMonster(builder);\n    return endMonster(builder);\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example2/Monster.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example2\n\nimport com.google.flatbuffers.BaseVector\nimport com.google.flatbuffers.BooleanVector\nimport com.google.flatbuffers.ByteVector\nimport com.google.flatbuffers.Constants\nimport com.google.flatbuffers.DoubleVector\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.FloatVector\nimport com.google.flatbuffers.LongVector\nimport com.google.flatbuffers.StringVector\nimport com.google.flatbuffers.Struct\nimport com.google.flatbuffers.Table\nimport com.google.flatbuffers.UnionVector\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport kotlin.math.sign\n\n@Suppress(\"unused\")\nclass Monster : Table() {\n\n    fun __init(_i: Int, _bb: ByteBuffer)  {\n        __reset(_i, _bb)\n    }\n    fun __assign(_i: Int, _bb: ByteBuffer) : Monster {\n        __init(_i, _bb)\n        return this\n    }\n    companion object {\n        fun validateVersion() = Constants.FLATBUFFERS_25_12_19()\n        fun getRootAsMonster(_bb: ByteBuffer): Monster = getRootAsMonster(_bb, Monster())\n        fun getRootAsMonster(_bb: ByteBuffer, obj: Monster): Monster {\n            _bb.order(ByteOrder.LITTLE_ENDIAN)\n            return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb))\n        }\n        fun startMonster(builder: FlatBufferBuilder) = builder.startTable(0)\n        fun endMonster(builder: FlatBufferBuilder) : Int {\n            val o = builder.endTable()\n            return o\n        }\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example2/Monster.lua",
    "content": "--[[ MyGame.Example2.Monster\n\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : //monster_test.fbs\n  Rooting type : MyGame.Example.Monster (//monster_test.fbs)\n\n--]]\n\nlocal flatbuffers = require('flatbuffers')\n\nlocal Monster = {}\nlocal mt = {}\n\nfunction Monster.New()\n  local o = {}\n  setmetatable(o, {__index = mt})\n  return o\nend\n\nfunction mt:Init(buf, pos)\n  self.view = flatbuffers.view.New(buf, pos)\nend\n\nfunction Monster.Start(builder)\n  builder:StartObject(0)\nend\n\nfunction Monster.End(builder)\n  return builder:EndObject()\nend\n\nreturn Monster"
  },
  {
    "path": "tests/MyGame/Example2/Monster.nim",
    "content": "#[ MyGame.Example2.Monster\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : \n  Rooting type : MyGame.Example.Monster ()\n]#\n\nimport flatbuffers\n\ntype Monster* = object of FlatObj\nproc MonsterStart*(builder: var Builder) =\n  builder.StartObject(0)\nproc MonsterEnd*(builder: var Builder): uoffset =\n  return builder.EndObject()\n"
  },
  {
    "path": "tests/MyGame/Example2/Monster.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nnamespace MyGame\\Example2;\n\nuse \\Google\\FlatBuffers\\Struct;\nuse \\Google\\FlatBuffers\\Table;\nuse \\Google\\FlatBuffers\\ByteBuffer;\nuse \\Google\\FlatBuffers\\FlatBufferBuilder;\n\nclass Monster extends Table\n{\n    /**\n     * @param ByteBuffer $bb\n     * @return Monster\n     */\n    public static function getRootAsMonster(ByteBuffer $bb)\n    {\n        $obj = new Monster();\n        return ($obj->init($bb->getInt($bb->getPosition()) + $bb->getPosition(), $bb));\n    }\n\n    public static function MonsterIdentifier()\n    {\n        return \"MONS\";\n    }\n\n    public static function MonsterBufferHasIdentifier(ByteBuffer $buf)\n    {\n        return self::__has_identifier($buf, self::MonsterIdentifier());\n    }\n\n    public static function MonsterExtension()\n    {\n        return \"mon\";\n    }\n\n    /**\n     * @param int $_i offset\n     * @param ByteBuffer $_bb\n     * @return Monster\n     **/\n    public function init($_i, ByteBuffer $_bb)\n    {\n        $this->bb_pos = $_i;\n        $this->bb = $_bb;\n        return $this;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return void\n     */\n    public static function startMonster(FlatBufferBuilder $builder)\n    {\n        $builder->StartObject(0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return Monster\n     */\n    public static function createMonster(FlatBufferBuilder $builder, )\n    {\n        $builder->startObject(0);\n        $o = $builder->endObject();\n        return $o;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return int table offset\n     */\n    public static function endMonster(FlatBufferBuilder $builder)\n    {\n        $o = $builder->endObject();\n        return $o;\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/Example2/Monster.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: Example2\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\nclass Monster(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = Monster()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsMonster(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    @classmethod\n    def MonsterBufferHasIdentifier(cls, buf, offset, size_prefixed=False):\n        return flatbuffers.util.BufferHasIdentifier(buf, offset, b\"\\x4D\\x4F\\x4E\\x53\", size_prefixed=size_prefixed)\n\n    # Monster\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\ndef MonsterStart(builder):\n    builder.StartObject(0)\n\ndef Start(builder):\n    MonsterStart(builder)\n\ndef MonsterEnd(builder):\n    return builder.EndObject()\n\ndef End(builder):\n    return MonsterEnd(builder)\n\n\nclass MonsterT(object):\n\n    # MonsterT\n    def __init__(\n        self,\n    ):\n        pass\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        monster = Monster()\n        monster.Init(buf, pos)\n        return cls.InitFromObj(monster)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, monster):\n        x = MonsterT()\n        x._UnPack(monster)\n        return x\n\n    # MonsterT\n    def _UnPack(self, monster):\n        if monster is None:\n            return\n\n    # MonsterT\n    def Pack(self, builder):\n        MonsterStart(builder)\n        monster = MonsterEnd(builder)\n        return monster\n"
  },
  {
    "path": "tests/MyGame/Example2/MonsterT.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.Example2;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\npublic class MonsterT {\n\n\n  public MonsterT() {\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/Example2/__init__.py",
    "content": ""
  },
  {
    "path": "tests/MyGame/InParentNamespace.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace MyGame\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct InParentNamespace : IFlatbufferObject\n{\n  private Table __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_25_12_19(); }\n  public static InParentNamespace GetRootAsInParentNamespace(ByteBuffer _bb) { return GetRootAsInParentNamespace(_bb, new InParentNamespace()); }\n  public static InParentNamespace GetRootAsInParentNamespace(ByteBuffer _bb, InParentNamespace obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }\n  public InParentNamespace __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n\n  public static void StartInParentNamespace(FlatBufferBuilder builder) { builder.StartTable(0); }\n  public static Offset<MyGame.InParentNamespace> EndInParentNamespace(FlatBufferBuilder builder) {\n    int o = builder.EndTable();\n    return new Offset<MyGame.InParentNamespace>(o);\n  }\n  public InParentNamespaceT UnPack() {\n    var _o = new InParentNamespaceT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(InParentNamespaceT _o) {\n  }\n  public static Offset<MyGame.InParentNamespace> Pack(FlatBufferBuilder builder, InParentNamespaceT _o) {\n    if (_o == null) return default(Offset<MyGame.InParentNamespace>);\n    StartInParentNamespace(builder);\n    return EndInParentNamespace(builder);\n  }\n}\n\npublic class InParentNamespaceT\n{\n\n  public InParentNamespaceT() {\n  }\n}\n\n\nstatic public class InParentNamespaceVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos)\n  {\n    return verifier.VerifyTableStart(tablePos)\n      && verifier.VerifyTableEnd(tablePos);\n  }\n}\n\n}\n"
  },
  {
    "path": "tests/MyGame/InParentNamespace.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage MyGame\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n)\n\ntype InParentNamespaceT struct {\n}\n\nfunc (t *InParentNamespaceT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\tif t == nil {\n\t\treturn 0\n\t}\n\tInParentNamespaceStart(builder)\n\treturn InParentNamespaceEnd(builder)\n}\n\nfunc (rcv *InParentNamespace) UnPackTo(t *InParentNamespaceT) {\n}\n\nfunc (rcv *InParentNamespace) UnPack() *InParentNamespaceT {\n\tif rcv == nil {\n\t\treturn nil\n\t}\n\tt := &InParentNamespaceT{}\n\trcv.UnPackTo(t)\n\treturn t\n}\n\ntype InParentNamespace struct {\n\t_tab flatbuffers.Table\n}\n\nfunc GetRootAsInParentNamespace(buf []byte, offset flatbuffers.UOffsetT) *InParentNamespace {\n\tn := flatbuffers.GetUOffsetT(buf[offset:])\n\tx := &InParentNamespace{}\n\tx.Init(buf, n+offset)\n\treturn x\n}\n\nfunc FinishInParentNamespaceBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {\n\tbuilder.Finish(offset)\n}\n\nfunc GetSizePrefixedRootAsInParentNamespace(buf []byte, offset flatbuffers.UOffsetT) *InParentNamespace {\n\tn := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])\n\tx := &InParentNamespace{}\n\tx.Init(buf, n+offset+flatbuffers.SizeUint32)\n\treturn x\n}\n\nfunc FinishSizePrefixedInParentNamespaceBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {\n\tbuilder.FinishSizePrefixed(offset)\n}\n\nfunc (rcv *InParentNamespace) Init(buf []byte, i flatbuffers.UOffsetT) {\n\trcv._tab.Bytes = buf\n\trcv._tab.Pos = i\n}\n\nfunc (rcv *InParentNamespace) Table() flatbuffers.Table {\n\treturn rcv._tab\n}\n\nfunc InParentNamespaceStart(builder *flatbuffers.Builder) {\n\tbuilder.StartObject(0)\n}\nfunc InParentNamespaceEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\treturn builder.EndObject()\n}\n"
  },
  {
    "path": "tests/MyGame/InParentNamespace.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class InParentNamespace extends com.google.flatbuffers.Table {\n  public static void ValidateVersion() { Constants.FLATBUFFERS_25_12_19(); }\n  public static InParentNamespace getRootAsInParentNamespace(ByteBuffer _bb) { return getRootAsInParentNamespace(_bb, new InParentNamespace()); }\n  public static InParentNamespace getRootAsInParentNamespace(ByteBuffer _bb, InParentNamespace obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public InParentNamespace __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n\n  public static void startInParentNamespace(FlatBufferBuilder builder) { builder.startTable(0); }\n  public static int endInParentNamespace(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    return o;\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public InParentNamespace get(int j) { return get(new InParentNamespace(), j); }\n    public InParentNamespace get(InParentNamespace obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); }\n  }\n  public InParentNamespaceT unpack() {\n    InParentNamespaceT _o = new InParentNamespaceT();\n    unpackTo(_o);\n    return _o;\n  }\n  public void unpackTo(InParentNamespaceT _o) {\n  }\n  public static int pack(FlatBufferBuilder builder, InParentNamespaceT _o) {\n    if (_o == null) return 0;\n    startInParentNamespace(builder);\n    return endInParentNamespace(builder);\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/InParentNamespace.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame\n\nimport com.google.flatbuffers.BaseVector\nimport com.google.flatbuffers.BooleanVector\nimport com.google.flatbuffers.ByteVector\nimport com.google.flatbuffers.Constants\nimport com.google.flatbuffers.DoubleVector\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.FloatVector\nimport com.google.flatbuffers.LongVector\nimport com.google.flatbuffers.StringVector\nimport com.google.flatbuffers.Struct\nimport com.google.flatbuffers.Table\nimport com.google.flatbuffers.UnionVector\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport kotlin.math.sign\n\n@Suppress(\"unused\")\nclass InParentNamespace : Table() {\n\n    fun __init(_i: Int, _bb: ByteBuffer)  {\n        __reset(_i, _bb)\n    }\n    fun __assign(_i: Int, _bb: ByteBuffer) : InParentNamespace {\n        __init(_i, _bb)\n        return this\n    }\n    companion object {\n        fun validateVersion() = Constants.FLATBUFFERS_25_12_19()\n        fun getRootAsInParentNamespace(_bb: ByteBuffer): InParentNamespace = getRootAsInParentNamespace(_bb, InParentNamespace())\n        fun getRootAsInParentNamespace(_bb: ByteBuffer, obj: InParentNamespace): InParentNamespace {\n            _bb.order(ByteOrder.LITTLE_ENDIAN)\n            return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb))\n        }\n        fun startInParentNamespace(builder: FlatBufferBuilder) = builder.startTable(0)\n        fun endInParentNamespace(builder: FlatBufferBuilder) : Int {\n            val o = builder.endTable()\n            return o\n        }\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/InParentNamespace.lua",
    "content": "--[[ MyGame.InParentNamespace\n\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : //monster_test.fbs\n  Rooting type : MyGame.Example.Monster (//monster_test.fbs)\n\n--]]\n\nlocal flatbuffers = require('flatbuffers')\n\nlocal InParentNamespace = {}\nlocal mt = {}\n\nfunction InParentNamespace.New()\n  local o = {}\n  setmetatable(o, {__index = mt})\n  return o\nend\n\nfunction mt:Init(buf, pos)\n  self.view = flatbuffers.view.New(buf, pos)\nend\n\nfunction InParentNamespace.Start(builder)\n  builder:StartObject(0)\nend\n\nfunction InParentNamespace.End(builder)\n  return builder:EndObject()\nend\n\nreturn InParentNamespace"
  },
  {
    "path": "tests/MyGame/InParentNamespace.nim",
    "content": "#[ MyGame.InParentNamespace\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : \n  Rooting type : MyGame.Example.Monster ()\n]#\n\nimport flatbuffers\n\ntype InParentNamespace* = object of FlatObj\nproc InParentNamespaceStart*(builder: var Builder) =\n  builder.StartObject(0)\nproc InParentNamespaceEnd*(builder: var Builder): uoffset =\n  return builder.EndObject()\n"
  },
  {
    "path": "tests/MyGame/InParentNamespace.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nnamespace MyGame;\n\nuse \\Google\\FlatBuffers\\Struct;\nuse \\Google\\FlatBuffers\\Table;\nuse \\Google\\FlatBuffers\\ByteBuffer;\nuse \\Google\\FlatBuffers\\FlatBufferBuilder;\n\nclass InParentNamespace extends Table\n{\n    /**\n     * @param ByteBuffer $bb\n     * @return InParentNamespace\n     */\n    public static function getRootAsInParentNamespace(ByteBuffer $bb)\n    {\n        $obj = new InParentNamespace();\n        return ($obj->init($bb->getInt($bb->getPosition()) + $bb->getPosition(), $bb));\n    }\n\n    public static function InParentNamespaceIdentifier()\n    {\n        return \"MONS\";\n    }\n\n    public static function InParentNamespaceBufferHasIdentifier(ByteBuffer $buf)\n    {\n        return self::__has_identifier($buf, self::InParentNamespaceIdentifier());\n    }\n\n    public static function InParentNamespaceExtension()\n    {\n        return \"mon\";\n    }\n\n    /**\n     * @param int $_i offset\n     * @param ByteBuffer $_bb\n     * @return InParentNamespace\n     **/\n    public function init($_i, ByteBuffer $_bb)\n    {\n        $this->bb_pos = $_i;\n        $this->bb = $_bb;\n        return $this;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return void\n     */\n    public static function startInParentNamespace(FlatBufferBuilder $builder)\n    {\n        $builder->StartObject(0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return InParentNamespace\n     */\n    public static function createInParentNamespace(FlatBufferBuilder $builder, )\n    {\n        $builder->startObject(0);\n        $o = $builder->endObject();\n        return $o;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return int table offset\n     */\n    public static function endInParentNamespace(FlatBufferBuilder $builder)\n    {\n        $o = $builder->endObject();\n        return $o;\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/InParentNamespace.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: MyGame\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\nclass InParentNamespace(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = InParentNamespace()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsInParentNamespace(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    @classmethod\n    def InParentNamespaceBufferHasIdentifier(cls, buf, offset, size_prefixed=False):\n        return flatbuffers.util.BufferHasIdentifier(buf, offset, b\"\\x4D\\x4F\\x4E\\x53\", size_prefixed=size_prefixed)\n\n    # InParentNamespace\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\ndef InParentNamespaceStart(builder):\n    builder.StartObject(0)\n\ndef Start(builder):\n    InParentNamespaceStart(builder)\n\ndef InParentNamespaceEnd(builder):\n    return builder.EndObject()\n\ndef End(builder):\n    return InParentNamespaceEnd(builder)\n\n\nclass InParentNamespaceT(object):\n\n    # InParentNamespaceT\n    def __init__(\n        self,\n    ):\n        pass\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        inParentNamespace = InParentNamespace()\n        inParentNamespace.Init(buf, pos)\n        return cls.InitFromObj(inParentNamespace)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, inParentNamespace):\n        x = InParentNamespaceT()\n        x._UnPack(inParentNamespace)\n        return x\n\n    # InParentNamespaceT\n    def _UnPack(self, inParentNamespace):\n        if inParentNamespace is None:\n            return\n\n    # InParentNamespaceT\n    def Pack(self, builder):\n        InParentNamespaceStart(builder)\n        inParentNamespace = InParentNamespaceEnd(builder)\n        return inParentNamespace\n"
  },
  {
    "path": "tests/MyGame/InParentNamespaceT.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\npublic class InParentNamespaceT {\n\n\n  public InParentNamespaceT() {\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/MonsterExtra.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace MyGame\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct MonsterExtra : IFlatbufferObject\n{\n  private Table __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_25_12_19(); }\n  public static MonsterExtra GetRootAsMonsterExtra(ByteBuffer _bb) { return GetRootAsMonsterExtra(_bb, new MonsterExtra()); }\n  public static MonsterExtra GetRootAsMonsterExtra(ByteBuffer _bb, MonsterExtra obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }\n  public static bool MonsterExtraBufferHasIdentifier(ByteBuffer _bb) { return Table.__has_identifier(_bb, \"MONE\"); }\n  public static bool VerifyMonsterExtra(ByteBuffer _bb) {Google.FlatBuffers.Verifier verifier = new Google.FlatBuffers.Verifier(_bb); return verifier.VerifyBuffer(\"MONE\", false, MonsterExtraVerify.Verify); }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }\n  public MonsterExtra __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public double D0 { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetDouble(o + __p.bb_pos) : (double)Double.NaN; } }\n  public bool MutateD0(double d0) { int o = __p.__offset(4); if (o != 0) { __p.bb.PutDouble(o + __p.bb_pos, d0); return true; } else { return false; } }\n  public double D1 { get { int o = __p.__offset(6); return o != 0 ? __p.bb.GetDouble(o + __p.bb_pos) : (double)Double.NaN; } }\n  public bool MutateD1(double d1) { int o = __p.__offset(6); if (o != 0) { __p.bb.PutDouble(o + __p.bb_pos, d1); return true; } else { return false; } }\n  public double D2 { get { int o = __p.__offset(8); return o != 0 ? __p.bb.GetDouble(o + __p.bb_pos) : (double)Double.PositiveInfinity; } }\n  public bool MutateD2(double d2) { int o = __p.__offset(8); if (o != 0) { __p.bb.PutDouble(o + __p.bb_pos, d2); return true; } else { return false; } }\n  public double D3 { get { int o = __p.__offset(10); return o != 0 ? __p.bb.GetDouble(o + __p.bb_pos) : (double)Double.NegativeInfinity; } }\n  public bool MutateD3(double d3) { int o = __p.__offset(10); if (o != 0) { __p.bb.PutDouble(o + __p.bb_pos, d3); return true; } else { return false; } }\n  public float F0 { get { int o = __p.__offset(12); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)Single.NaN; } }\n  public bool MutateF0(float f0) { int o = __p.__offset(12); if (o != 0) { __p.bb.PutFloat(o + __p.bb_pos, f0); return true; } else { return false; } }\n  public float F1 { get { int o = __p.__offset(14); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)Single.NaN; } }\n  public bool MutateF1(float f1) { int o = __p.__offset(14); if (o != 0) { __p.bb.PutFloat(o + __p.bb_pos, f1); return true; } else { return false; } }\n  public float F2 { get { int o = __p.__offset(16); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)Single.PositiveInfinity; } }\n  public bool MutateF2(float f2) { int o = __p.__offset(16); if (o != 0) { __p.bb.PutFloat(o + __p.bb_pos, f2); return true; } else { return false; } }\n  public float F3 { get { int o = __p.__offset(18); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)Single.NegativeInfinity; } }\n  public bool MutateF3(float f3) { int o = __p.__offset(18); if (o != 0) { __p.bb.PutFloat(o + __p.bb_pos, f3); return true; } else { return false; } }\n  public double Dvec(int j) { int o = __p.__offset(20); return o != 0 ? __p.bb.GetDouble(__p.__vector(o) + j * 8) : (double)0; }\n  public int DvecLength { get { int o = __p.__offset(20); return o != 0 ? __p.__vector_len(o) : 0; } }\n#if ENABLE_SPAN_T\n  public Span<double> GetDvecBytes() { return __p.__vector_as_span<double>(20, 8); }\n#else\n  public ArraySegment<byte>? GetDvecBytes() { return __p.__vector_as_arraysegment(20); }\n#endif\n  public double[] GetDvecArray() { return __p.__vector_as_array<double>(20); }\n  public bool MutateDvec(int j, double dvec) { int o = __p.__offset(20); if (o != 0) { __p.bb.PutDouble(__p.__vector(o) + j * 8, dvec); return true; } else { return false; } }\n  public float Fvec(int j) { int o = __p.__offset(22); return o != 0 ? __p.bb.GetFloat(__p.__vector(o) + j * 4) : (float)0; }\n  public int FvecLength { get { int o = __p.__offset(22); return o != 0 ? __p.__vector_len(o) : 0; } }\n#if ENABLE_SPAN_T\n  public Span<float> GetFvecBytes() { return __p.__vector_as_span<float>(22, 4); }\n#else\n  public ArraySegment<byte>? GetFvecBytes() { return __p.__vector_as_arraysegment(22); }\n#endif\n  public float[] GetFvecArray() { return __p.__vector_as_array<float>(22); }\n  public bool MutateFvec(int j, float fvec) { int o = __p.__offset(22); if (o != 0) { __p.bb.PutFloat(__p.__vector(o) + j * 4, fvec); return true; } else { return false; } }\n\n  public static Offset<MyGame.MonsterExtra> CreateMonsterExtra(FlatBufferBuilder builder,\n      double d0 = Double.NaN,\n      double d1 = Double.NaN,\n      double d2 = Double.PositiveInfinity,\n      double d3 = Double.NegativeInfinity,\n      float f0 = Single.NaN,\n      float f1 = Single.NaN,\n      float f2 = Single.PositiveInfinity,\n      float f3 = Single.NegativeInfinity,\n      VectorOffset dvecOffset = default(VectorOffset),\n      VectorOffset fvecOffset = default(VectorOffset)) {\n    builder.StartTable(11);\n    MonsterExtra.AddD3(builder, d3);\n    MonsterExtra.AddD2(builder, d2);\n    MonsterExtra.AddD1(builder, d1);\n    MonsterExtra.AddD0(builder, d0);\n    MonsterExtra.AddFvec(builder, fvecOffset);\n    MonsterExtra.AddDvec(builder, dvecOffset);\n    MonsterExtra.AddF3(builder, f3);\n    MonsterExtra.AddF2(builder, f2);\n    MonsterExtra.AddF1(builder, f1);\n    MonsterExtra.AddF0(builder, f0);\n    return MonsterExtra.EndMonsterExtra(builder);\n  }\n\n  public static void StartMonsterExtra(FlatBufferBuilder builder) { builder.StartTable(11); }\n  public static void AddD0(FlatBufferBuilder builder, double d0) { builder.AddDouble(0, d0, Double.NaN); }\n  public static void AddD1(FlatBufferBuilder builder, double d1) { builder.AddDouble(1, d1, Double.NaN); }\n  public static void AddD2(FlatBufferBuilder builder, double d2) { builder.AddDouble(2, d2, Double.PositiveInfinity); }\n  public static void AddD3(FlatBufferBuilder builder, double d3) { builder.AddDouble(3, d3, Double.NegativeInfinity); }\n  public static void AddF0(FlatBufferBuilder builder, float f0) { builder.AddFloat(4, f0, Single.NaN); }\n  public static void AddF1(FlatBufferBuilder builder, float f1) { builder.AddFloat(5, f1, Single.NaN); }\n  public static void AddF2(FlatBufferBuilder builder, float f2) { builder.AddFloat(6, f2, Single.PositiveInfinity); }\n  public static void AddF3(FlatBufferBuilder builder, float f3) { builder.AddFloat(7, f3, Single.NegativeInfinity); }\n  public static void AddDvec(FlatBufferBuilder builder, VectorOffset dvecOffset) { builder.AddOffset(8, dvecOffset.Value, 0); }\n  public static VectorOffset CreateDvecVector(FlatBufferBuilder builder, double[] data) { builder.StartVector(8, data.Length, 8); for (int i = data.Length - 1; i >= 0; i--) builder.AddDouble(data[i]); return builder.EndVector(); }\n  public static VectorOffset CreateDvecVectorBlock(FlatBufferBuilder builder, double[] data) { builder.StartVector(8, data.Length, 8); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateDvecVectorBlock(FlatBufferBuilder builder, ArraySegment<double> data) { builder.StartVector(8, data.Count, 8); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateDvecVectorBlock(FlatBufferBuilder builder, IntPtr dataPtr, int sizeInBytes) { builder.StartVector(1, sizeInBytes, 1); builder.Add<double>(dataPtr, sizeInBytes); return builder.EndVector(); }\n  public static void StartDvecVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(8, numElems, 8); }\n  public static void AddFvec(FlatBufferBuilder builder, VectorOffset fvecOffset) { builder.AddOffset(9, fvecOffset.Value, 0); }\n  public static VectorOffset CreateFvecVector(FlatBufferBuilder builder, float[] data) { builder.StartVector(4, data.Length, 4); for (int i = data.Length - 1; i >= 0; i--) builder.AddFloat(data[i]); return builder.EndVector(); }\n  public static VectorOffset CreateFvecVectorBlock(FlatBufferBuilder builder, float[] data) { builder.StartVector(4, data.Length, 4); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateFvecVectorBlock(FlatBufferBuilder builder, ArraySegment<float> data) { builder.StartVector(4, data.Count, 4); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateFvecVectorBlock(FlatBufferBuilder builder, IntPtr dataPtr, int sizeInBytes) { builder.StartVector(1, sizeInBytes, 1); builder.Add<float>(dataPtr, sizeInBytes); return builder.EndVector(); }\n  public static void StartFvecVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 4); }\n  public static Offset<MyGame.MonsterExtra> EndMonsterExtra(FlatBufferBuilder builder) {\n    int o = builder.EndTable();\n    return new Offset<MyGame.MonsterExtra>(o);\n  }\n  public static void FinishMonsterExtraBuffer(FlatBufferBuilder builder, Offset<MyGame.MonsterExtra> offset) { builder.Finish(offset.Value, \"MONE\"); }\n  public static void FinishSizePrefixedMonsterExtraBuffer(FlatBufferBuilder builder, Offset<MyGame.MonsterExtra> offset) { builder.FinishSizePrefixed(offset.Value, \"MONE\"); }\n  public MonsterExtraT UnPack() {\n    var _o = new MonsterExtraT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(MonsterExtraT _o) {\n    _o.D0 = this.D0;\n    _o.D1 = this.D1;\n    _o.D2 = this.D2;\n    _o.D3 = this.D3;\n    _o.F0 = this.F0;\n    _o.F1 = this.F1;\n    _o.F2 = this.F2;\n    _o.F3 = this.F3;\n    _o.Dvec = new List<double>();\n    for (var _j = 0; _j < this.DvecLength; ++_j) {_o.Dvec.Add(this.Dvec(_j));}\n    _o.Fvec = new List<float>();\n    for (var _j = 0; _j < this.FvecLength; ++_j) {_o.Fvec.Add(this.Fvec(_j));}\n  }\n  public static Offset<MyGame.MonsterExtra> Pack(FlatBufferBuilder builder, MonsterExtraT _o) {\n    if (_o == null) return default(Offset<MyGame.MonsterExtra>);\n    var _dvec = default(VectorOffset);\n    if (_o.Dvec != null) {\n      var __dvec = _o.Dvec.ToArray();\n      _dvec = CreateDvecVector(builder, __dvec);\n    }\n    var _fvec = default(VectorOffset);\n    if (_o.Fvec != null) {\n      var __fvec = _o.Fvec.ToArray();\n      _fvec = CreateFvecVector(builder, __fvec);\n    }\n    return CreateMonsterExtra(\n      builder,\n      _o.D0,\n      _o.D1,\n      _o.D2,\n      _o.D3,\n      _o.F0,\n      _o.F1,\n      _o.F2,\n      _o.F3,\n      _dvec,\n      _fvec);\n  }\n}\n\npublic class MonsterExtraT\n{\n  [Newtonsoft.Json.JsonProperty(\"d0\")]\n  public double D0 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"d1\")]\n  public double D1 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"d2\")]\n  public double D2 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"d3\")]\n  public double D3 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"f0\")]\n  public float F0 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"f1\")]\n  public float F1 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"f2\")]\n  public float F2 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"f3\")]\n  public float F3 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"dvec\")]\n  public List<double> Dvec { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"fvec\")]\n  public List<float> Fvec { get; set; }\n\n  public MonsterExtraT() {\n    this.D0 = Double.NaN;\n    this.D1 = Double.NaN;\n    this.D2 = Double.PositiveInfinity;\n    this.D3 = Double.NegativeInfinity;\n    this.F0 = Single.NaN;\n    this.F1 = Single.NaN;\n    this.F2 = Single.PositiveInfinity;\n    this.F3 = Single.NegativeInfinity;\n    this.Dvec = null;\n    this.Fvec = null;\n  }\n\n  public static MonsterExtraT DeserializeFromJson(string jsonText) {\n    return Newtonsoft.Json.JsonConvert.DeserializeObject<MonsterExtraT>(jsonText);\n  }\n  public string SerializeToJson() {\n    return Newtonsoft.Json.JsonConvert.SerializeObject(this, Newtonsoft.Json.Formatting.Indented);\n  }\n  public static MonsterExtraT DeserializeFromBinary(byte[] fbBuffer) {\n    return MonsterExtra.GetRootAsMonsterExtra(new ByteBuffer(fbBuffer)).UnPack();\n  }\n  public byte[] SerializeToBinary() {\n    var fbb = new FlatBufferBuilder(0x10000);\n    MonsterExtra.FinishMonsterExtraBuffer(fbb, MonsterExtra.Pack(fbb, this));\n    return fbb.DataBuffer.ToSizedArray();\n  }\n}\n\n\nstatic public class MonsterExtraVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos)\n  {\n    return verifier.VerifyTableStart(tablePos)\n      && verifier.VerifyField(tablePos, 4 /*D0*/, 8 /*double*/, 8, false)\n      && verifier.VerifyField(tablePos, 6 /*D1*/, 8 /*double*/, 8, false)\n      && verifier.VerifyField(tablePos, 8 /*D2*/, 8 /*double*/, 8, false)\n      && verifier.VerifyField(tablePos, 10 /*D3*/, 8 /*double*/, 8, false)\n      && verifier.VerifyField(tablePos, 12 /*F0*/, 4 /*float*/, 4, false)\n      && verifier.VerifyField(tablePos, 14 /*F1*/, 4 /*float*/, 4, false)\n      && verifier.VerifyField(tablePos, 16 /*F2*/, 4 /*float*/, 4, false)\n      && verifier.VerifyField(tablePos, 18 /*F3*/, 4 /*float*/, 4, false)\n      && verifier.VerifyVectorOfData(tablePos, 20 /*Dvec*/, 8 /*double*/, false)\n      && verifier.VerifyVectorOfData(tablePos, 22 /*Fvec*/, 4 /*float*/, false)\n      && verifier.VerifyTableEnd(tablePos);\n  }\n}\n\n}\n"
  },
  {
    "path": "tests/MyGame/MonsterExtra.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class MonsterExtra extends com.google.flatbuffers.Table {\n  public static void ValidateVersion() { Constants.FLATBUFFERS_25_12_19(); }\n  public static MonsterExtra getRootAsMonsterExtra(ByteBuffer _bb) { return getRootAsMonsterExtra(_bb, new MonsterExtra()); }\n  public static MonsterExtra getRootAsMonsterExtra(ByteBuffer _bb, MonsterExtra obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }\n  public static boolean MonsterExtraBufferHasIdentifier(ByteBuffer _bb) { return __has_identifier(_bb, \"MONE\"); }\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public MonsterExtra __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public double d0() { int o = __offset(4); return o != 0 ? bb.getDouble(o + bb_pos) : Double.NaN; }\n  public boolean mutateD0(double d0) { int o = __offset(4); if (o != 0) { bb.putDouble(o + bb_pos, d0); return true; } else { return false; } }\n  public double d1() { int o = __offset(6); return o != 0 ? bb.getDouble(o + bb_pos) : Double.NaN; }\n  public boolean mutateD1(double d1) { int o = __offset(6); if (o != 0) { bb.putDouble(o + bb_pos, d1); return true; } else { return false; } }\n  public double d2() { int o = __offset(8); return o != 0 ? bb.getDouble(o + bb_pos) : Double.POSITIVE_INFINITY; }\n  public boolean mutateD2(double d2) { int o = __offset(8); if (o != 0) { bb.putDouble(o + bb_pos, d2); return true; } else { return false; } }\n  public double d3() { int o = __offset(10); return o != 0 ? bb.getDouble(o + bb_pos) : Double.NEGATIVE_INFINITY; }\n  public boolean mutateD3(double d3) { int o = __offset(10); if (o != 0) { bb.putDouble(o + bb_pos, d3); return true; } else { return false; } }\n  public float f0() { int o = __offset(12); return o != 0 ? bb.getFloat(o + bb_pos) : Float.NaN; }\n  public boolean mutateF0(float f0) { int o = __offset(12); if (o != 0) { bb.putFloat(o + bb_pos, f0); return true; } else { return false; } }\n  public float f1() { int o = __offset(14); return o != 0 ? bb.getFloat(o + bb_pos) : Float.NaN; }\n  public boolean mutateF1(float f1) { int o = __offset(14); if (o != 0) { bb.putFloat(o + bb_pos, f1); return true; } else { return false; } }\n  public float f2() { int o = __offset(16); return o != 0 ? bb.getFloat(o + bb_pos) : Float.POSITIVE_INFINITY; }\n  public boolean mutateF2(float f2) { int o = __offset(16); if (o != 0) { bb.putFloat(o + bb_pos, f2); return true; } else { return false; } }\n  public float f3() { int o = __offset(18); return o != 0 ? bb.getFloat(o + bb_pos) : Float.NEGATIVE_INFINITY; }\n  public boolean mutateF3(float f3) { int o = __offset(18); if (o != 0) { bb.putFloat(o + bb_pos, f3); return true; } else { return false; } }\n  public double dvec(int j) { int o = __offset(20); return o != 0 ? bb.getDouble(__vector(o) + j * 8) : 0; }\n  public int dvecLength() { int o = __offset(20); return o != 0 ? __vector_len(o) : 0; }\n  public DoubleVector dvecVector() { return dvecVector(new DoubleVector()); }\n  public DoubleVector dvecVector(DoubleVector obj) { int o = __offset(20); return o != 0 ? obj.__assign(__vector(o), bb) : null; }\n  public ByteBuffer dvecAsByteBuffer() { return __vector_as_bytebuffer(20, 8); }\n  public ByteBuffer dvecInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 20, 8); }\n  public boolean mutateDvec(int j, double dvec) { int o = __offset(20); if (o != 0) { bb.putDouble(__vector(o) + j * 8, dvec); return true; } else { return false; } }\n  public float fvec(int j) { int o = __offset(22); return o != 0 ? bb.getFloat(__vector(o) + j * 4) : 0; }\n  public int fvecLength() { int o = __offset(22); return o != 0 ? __vector_len(o) : 0; }\n  public FloatVector fvecVector() { return fvecVector(new FloatVector()); }\n  public FloatVector fvecVector(FloatVector obj) { int o = __offset(22); return o != 0 ? obj.__assign(__vector(o), bb) : null; }\n  public ByteBuffer fvecAsByteBuffer() { return __vector_as_bytebuffer(22, 4); }\n  public ByteBuffer fvecInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 22, 4); }\n  public boolean mutateFvec(int j, float fvec) { int o = __offset(22); if (o != 0) { bb.putFloat(__vector(o) + j * 4, fvec); return true; } else { return false; } }\n\n  public static int createMonsterExtra(FlatBufferBuilder builder,\n      double d0,\n      double d1,\n      double d2,\n      double d3,\n      float f0,\n      float f1,\n      float f2,\n      float f3,\n      int dvecOffset,\n      int fvecOffset) {\n    builder.startTable(11);\n    MonsterExtra.addD3(builder, d3);\n    MonsterExtra.addD2(builder, d2);\n    MonsterExtra.addD1(builder, d1);\n    MonsterExtra.addD0(builder, d0);\n    MonsterExtra.addFvec(builder, fvecOffset);\n    MonsterExtra.addDvec(builder, dvecOffset);\n    MonsterExtra.addF3(builder, f3);\n    MonsterExtra.addF2(builder, f2);\n    MonsterExtra.addF1(builder, f1);\n    MonsterExtra.addF0(builder, f0);\n    return MonsterExtra.endMonsterExtra(builder);\n  }\n\n  public static void startMonsterExtra(FlatBufferBuilder builder) { builder.startTable(11); }\n  public static void addD0(FlatBufferBuilder builder, double d0) { builder.addDouble(0, d0, Double.NaN); }\n  public static void addD1(FlatBufferBuilder builder, double d1) { builder.addDouble(1, d1, Double.NaN); }\n  public static void addD2(FlatBufferBuilder builder, double d2) { builder.addDouble(2, d2, Double.POSITIVE_INFINITY); }\n  public static void addD3(FlatBufferBuilder builder, double d3) { builder.addDouble(3, d3, Double.NEGATIVE_INFINITY); }\n  public static void addF0(FlatBufferBuilder builder, float f0) { builder.addFloat(4, f0, Float.NaN); }\n  public static void addF1(FlatBufferBuilder builder, float f1) { builder.addFloat(5, f1, Float.NaN); }\n  public static void addF2(FlatBufferBuilder builder, float f2) { builder.addFloat(6, f2, Float.POSITIVE_INFINITY); }\n  public static void addF3(FlatBufferBuilder builder, float f3) { builder.addFloat(7, f3, Float.NEGATIVE_INFINITY); }\n  public static void addDvec(FlatBufferBuilder builder, int dvecOffset) { builder.addOffset(8, dvecOffset, 0); }\n  public static int createDvecVector(FlatBufferBuilder builder, double[] data) { builder.startVector(8, data.length, 8); for (int i = data.length - 1; i >= 0; i--) builder.addDouble(data[i]); return builder.endVector(); }\n  public static void startDvecVector(FlatBufferBuilder builder, int numElems) { builder.startVector(8, numElems, 8); }\n  public static void addFvec(FlatBufferBuilder builder, int fvecOffset) { builder.addOffset(9, fvecOffset, 0); }\n  public static int createFvecVector(FlatBufferBuilder builder, float[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addFloat(data[i]); return builder.endVector(); }\n  public static void startFvecVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static int endMonsterExtra(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    return o;\n  }\n  public static void finishMonsterExtraBuffer(FlatBufferBuilder builder, int offset) { builder.finish(offset, \"MONE\"); }\n  public static void finishSizePrefixedMonsterExtraBuffer(FlatBufferBuilder builder, int offset) { builder.finishSizePrefixed(offset, \"MONE\"); }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public MonsterExtra get(int j) { return get(new MonsterExtra(), j); }\n    public MonsterExtra get(MonsterExtra obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); }\n  }\n  public MonsterExtraT unpack() {\n    MonsterExtraT _o = new MonsterExtraT();\n    unpackTo(_o);\n    return _o;\n  }\n  public void unpackTo(MonsterExtraT _o) {\n    double _oD0 = d0();\n    _o.setD0(_oD0);\n    double _oD1 = d1();\n    _o.setD1(_oD1);\n    double _oD2 = d2();\n    _o.setD2(_oD2);\n    double _oD3 = d3();\n    _o.setD3(_oD3);\n    float _oF0 = f0();\n    _o.setF0(_oF0);\n    float _oF1 = f1();\n    _o.setF1(_oF1);\n    float _oF2 = f2();\n    _o.setF2(_oF2);\n    float _oF3 = f3();\n    _o.setF3(_oF3);\n    double[] _oDvec = new double[dvecLength()];\n    for (int _j = 0; _j < dvecLength(); ++_j) {_oDvec[_j] = dvec(_j);}\n    _o.setDvec(_oDvec);\n    float[] _oFvec = new float[fvecLength()];\n    for (int _j = 0; _j < fvecLength(); ++_j) {_oFvec[_j] = fvec(_j);}\n    _o.setFvec(_oFvec);\n  }\n  public static int pack(FlatBufferBuilder builder, MonsterExtraT _o) {\n    if (_o == null) return 0;\n    int _dvec = 0;\n    if (_o.getDvec() != null) {\n      _dvec = createDvecVector(builder, _o.getDvec());\n    }\n    int _fvec = 0;\n    if (_o.getFvec() != null) {\n      _fvec = createFvecVector(builder, _o.getFvec());\n    }\n    return createMonsterExtra(\n      builder,\n      _o.getD0(),\n      _o.getD1(),\n      _o.getD2(),\n      _o.getD3(),\n      _o.getF0(),\n      _o.getF1(),\n      _o.getF2(),\n      _o.getF3(),\n      _dvec,\n      _fvec);\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/MonsterExtra.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame\n\nimport com.google.flatbuffers.BaseVector\nimport com.google.flatbuffers.BooleanVector\nimport com.google.flatbuffers.ByteVector\nimport com.google.flatbuffers.Constants\nimport com.google.flatbuffers.DoubleVector\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.FloatVector\nimport com.google.flatbuffers.LongVector\nimport com.google.flatbuffers.StringVector\nimport com.google.flatbuffers.Struct\nimport com.google.flatbuffers.Table\nimport com.google.flatbuffers.UnionVector\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport kotlin.math.sign\n\n@Suppress(\"unused\")\nclass MonsterExtra : Table() {\n\n    fun __init(_i: Int, _bb: ByteBuffer)  {\n        __reset(_i, _bb)\n    }\n    fun __assign(_i: Int, _bb: ByteBuffer) : MonsterExtra {\n        __init(_i, _bb)\n        return this\n    }\n    val d0 : Double\n        get() {\n            val o = __offset(4)\n            return if(o != 0) bb.getDouble(o + bb_pos) else Double.NaN\n        }\n    fun mutateD0(d0: Double) : Boolean {\n        val o = __offset(4)\n        return if (o != 0) {\n            bb.putDouble(o + bb_pos, d0)\n            true\n        } else {\n            false\n        }\n    }\n    val d1 : Double\n        get() {\n            val o = __offset(6)\n            return if(o != 0) bb.getDouble(o + bb_pos) else Double.NaN\n        }\n    fun mutateD1(d1: Double) : Boolean {\n        val o = __offset(6)\n        return if (o != 0) {\n            bb.putDouble(o + bb_pos, d1)\n            true\n        } else {\n            false\n        }\n    }\n    val d2 : Double\n        get() {\n            val o = __offset(8)\n            return if(o != 0) bb.getDouble(o + bb_pos) else Double.POSITIVE_INFINITY\n        }\n    fun mutateD2(d2: Double) : Boolean {\n        val o = __offset(8)\n        return if (o != 0) {\n            bb.putDouble(o + bb_pos, d2)\n            true\n        } else {\n            false\n        }\n    }\n    val d3 : Double\n        get() {\n            val o = __offset(10)\n            return if(o != 0) bb.getDouble(o + bb_pos) else Double.NEGATIVE_INFINITY\n        }\n    fun mutateD3(d3: Double) : Boolean {\n        val o = __offset(10)\n        return if (o != 0) {\n            bb.putDouble(o + bb_pos, d3)\n            true\n        } else {\n            false\n        }\n    }\n    val f0 : Float\n        get() {\n            val o = __offset(12)\n            return if(o != 0) bb.getFloat(o + bb_pos) else Float.NaN\n        }\n    fun mutateF0(f0: Float) : Boolean {\n        val o = __offset(12)\n        return if (o != 0) {\n            bb.putFloat(o + bb_pos, f0)\n            true\n        } else {\n            false\n        }\n    }\n    val f1 : Float\n        get() {\n            val o = __offset(14)\n            return if(o != 0) bb.getFloat(o + bb_pos) else Float.NaN\n        }\n    fun mutateF1(f1: Float) : Boolean {\n        val o = __offset(14)\n        return if (o != 0) {\n            bb.putFloat(o + bb_pos, f1)\n            true\n        } else {\n            false\n        }\n    }\n    val f2 : Float\n        get() {\n            val o = __offset(16)\n            return if(o != 0) bb.getFloat(o + bb_pos) else Float.POSITIVE_INFINITY\n        }\n    fun mutateF2(f2: Float) : Boolean {\n        val o = __offset(16)\n        return if (o != 0) {\n            bb.putFloat(o + bb_pos, f2)\n            true\n        } else {\n            false\n        }\n    }\n    val f3 : Float\n        get() {\n            val o = __offset(18)\n            return if(o != 0) bb.getFloat(o + bb_pos) else Float.NEGATIVE_INFINITY\n        }\n    fun mutateF3(f3: Float) : Boolean {\n        val o = __offset(18)\n        return if (o != 0) {\n            bb.putFloat(o + bb_pos, f3)\n            true\n        } else {\n            false\n        }\n    }\n    fun dvec(j: Int) : Double {\n        val o = __offset(20)\n        return if (o != 0) {\n            bb.getDouble(__vector(o) + j * 8)\n        } else {\n            0.0\n        }\n    }\n    val dvecLength : Int\n        get() {\n            val o = __offset(20); return if (o != 0) __vector_len(o) else 0\n        }\n    val dvecAsByteBuffer : ByteBuffer? get() = __vector_as_bytebuffer(20, 8)\n    fun dvecInByteBuffer(_bb: ByteBuffer) : ByteBuffer? = __vector_in_bytebuffer(_bb, 20, 8)\n    fun mutateDvec(j: Int, dvec: Double) : Boolean {\n        val o = __offset(20)\n        return if (o != 0) {\n            bb.putDouble(__vector(o) + j * 8, dvec)\n            true\n        } else {\n            false\n        }\n    }\n    fun fvec(j: Int) : Float {\n        val o = __offset(22)\n        return if (o != 0) {\n            bb.getFloat(__vector(o) + j * 4)\n        } else {\n            0.0f\n        }\n    }\n    val fvecLength : Int\n        get() {\n            val o = __offset(22); return if (o != 0) __vector_len(o) else 0\n        }\n    val fvecAsByteBuffer : ByteBuffer? get() = __vector_as_bytebuffer(22, 4)\n    fun fvecInByteBuffer(_bb: ByteBuffer) : ByteBuffer? = __vector_in_bytebuffer(_bb, 22, 4)\n    fun mutateFvec(j: Int, fvec: Float) : Boolean {\n        val o = __offset(22)\n        return if (o != 0) {\n            bb.putFloat(__vector(o) + j * 4, fvec)\n            true\n        } else {\n            false\n        }\n    }\n    companion object {\n        fun validateVersion() = Constants.FLATBUFFERS_25_12_19()\n        fun getRootAsMonsterExtra(_bb: ByteBuffer): MonsterExtra = getRootAsMonsterExtra(_bb, MonsterExtra())\n        fun getRootAsMonsterExtra(_bb: ByteBuffer, obj: MonsterExtra): MonsterExtra {\n            _bb.order(ByteOrder.LITTLE_ENDIAN)\n            return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb))\n        }\n        fun MonsterExtraBufferHasIdentifier(_bb: ByteBuffer) : Boolean = __has_identifier(_bb, \"MONE\")\n        fun createMonsterExtra(builder: FlatBufferBuilder, d0: Double, d1: Double, d2: Double, d3: Double, f0: Float, f1: Float, f2: Float, f3: Float, dvecOffset: Int, fvecOffset: Int) : Int {\n            builder.startTable(11)\n            addD3(builder, d3)\n            addD2(builder, d2)\n            addD1(builder, d1)\n            addD0(builder, d0)\n            addFvec(builder, fvecOffset)\n            addDvec(builder, dvecOffset)\n            addF3(builder, f3)\n            addF2(builder, f2)\n            addF1(builder, f1)\n            addF0(builder, f0)\n            return endMonsterExtra(builder)\n        }\n        fun startMonsterExtra(builder: FlatBufferBuilder) = builder.startTable(11)\n        fun addD0(builder: FlatBufferBuilder, d0: Double) = builder.addDouble(0, d0, Double.NaN)\n        fun addD1(builder: FlatBufferBuilder, d1: Double) = builder.addDouble(1, d1, Double.NaN)\n        fun addD2(builder: FlatBufferBuilder, d2: Double) = builder.addDouble(2, d2, Double.POSITIVE_INFINITY)\n        fun addD3(builder: FlatBufferBuilder, d3: Double) = builder.addDouble(3, d3, Double.NEGATIVE_INFINITY)\n        fun addF0(builder: FlatBufferBuilder, f0: Float) = builder.addFloat(4, f0, Double.NaN)\n        fun addF1(builder: FlatBufferBuilder, f1: Float) = builder.addFloat(5, f1, Double.NaN)\n        fun addF2(builder: FlatBufferBuilder, f2: Float) = builder.addFloat(6, f2, Double.POSITIVE_INFINITY)\n        fun addF3(builder: FlatBufferBuilder, f3: Float) = builder.addFloat(7, f3, Double.NEGATIVE_INFINITY)\n        fun addDvec(builder: FlatBufferBuilder, dvec: Int) = builder.addOffset(8, dvec, 0)\n        fun createDvecVector(builder: FlatBufferBuilder, data: DoubleArray) : Int {\n            builder.startVector(8, data.size, 8)\n            for (i in data.size - 1 downTo 0) {\n                builder.addDouble(data[i])\n            }\n            return builder.endVector()\n        }\n        fun startDvecVector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(8, numElems, 8)\n        fun addFvec(builder: FlatBufferBuilder, fvec: Int) = builder.addOffset(9, fvec, 0)\n        fun createFvecVector(builder: FlatBufferBuilder, data: FloatArray) : Int {\n            builder.startVector(4, data.size, 4)\n            for (i in data.size - 1 downTo 0) {\n                builder.addFloat(data[i])\n            }\n            return builder.endVector()\n        }\n        fun startFvecVector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(4, numElems, 4)\n        fun endMonsterExtra(builder: FlatBufferBuilder) : Int {\n            val o = builder.endTable()\n            return o\n        }\n        fun finishMonsterExtraBuffer(builder: FlatBufferBuilder, offset: Int) = builder.finish(offset, \"MONE\")\n        fun finishSizePrefixedMonsterExtraBuffer(builder: FlatBufferBuilder, offset: Int) = builder.finishSizePrefixed(offset, \"MONE\")\n    }\n}\n"
  },
  {
    "path": "tests/MyGame/MonsterExtra.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: MyGame\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nfrom typing import Any\nfrom typing import Iterable\nnp = import_numpy()\n\nclass MonsterExtra(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset: int = 0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = MonsterExtra()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsMonsterExtra(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    @classmethod\n    def MonsterExtraBufferHasIdentifier(cls, buf, offset, size_prefixed=False):\n        return flatbuffers.util.BufferHasIdentifier(buf, offset, b\"\\x4D\\x4F\\x4E\\x45\", size_prefixed=size_prefixed)\n\n    # MonsterExtra\n    def Init(self, buf: bytes, pos: int):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # MonsterExtra\n    def D0(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float64Flags, o + self._tab.Pos)\n        return float('nan')\n\n    # MonsterExtra\n    def D1(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float64Flags, o + self._tab.Pos)\n        return float('nan')\n\n    # MonsterExtra\n    def D2(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float64Flags, o + self._tab.Pos)\n        return float('inf')\n\n    # MonsterExtra\n    def D3(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float64Flags, o + self._tab.Pos)\n        return float('-inf')\n\n    # MonsterExtra\n    def F0(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos)\n        return float('nan')\n\n    # MonsterExtra\n    def F1(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos)\n        return float('nan')\n\n    # MonsterExtra\n    def F2(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos)\n        return float('inf')\n\n    # MonsterExtra\n    def F3(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(18))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos)\n        return float('-inf')\n\n    # MonsterExtra\n    def Dvec(self, j: int):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(20))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.Get(flatbuffers.number_types.Float64Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 8))\n        return 0\n\n    # MonsterExtra\n    def DvecAsNumpy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(20))\n        if o != 0:\n            return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Float64Flags, o)\n        return 0\n\n    # MonsterExtra\n    def DvecLength(self) -> int:\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(20))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # MonsterExtra\n    def DvecIsNone(self) -> bool:\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(20))\n        return o == 0\n\n    # MonsterExtra\n    def Fvec(self, j: int):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(22))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4))\n        return 0\n\n    # MonsterExtra\n    def FvecAsNumpy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(22))\n        if o != 0:\n            return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Float32Flags, o)\n        return 0\n\n    # MonsterExtra\n    def FvecLength(self) -> int:\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(22))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # MonsterExtra\n    def FvecIsNone(self) -> bool:\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(22))\n        return o == 0\n\ndef MonsterExtraStart(builder: flatbuffers.Builder):\n    builder.StartObject(11)\n\ndef Start(builder: flatbuffers.Builder):\n    MonsterExtraStart(builder)\n\ndef MonsterExtraAddD0(builder: flatbuffers.Builder, d0: float):\n    builder.PrependFloat64Slot(0, d0, float('nan'))\n\ndef AddD0(builder: flatbuffers.Builder, d0: float):\n    MonsterExtraAddD0(builder, d0)\n\ndef MonsterExtraAddD1(builder: flatbuffers.Builder, d1: float):\n    builder.PrependFloat64Slot(1, d1, float('nan'))\n\ndef AddD1(builder: flatbuffers.Builder, d1: float):\n    MonsterExtraAddD1(builder, d1)\n\ndef MonsterExtraAddD2(builder: flatbuffers.Builder, d2: float):\n    builder.PrependFloat64Slot(2, d2, float('inf'))\n\ndef AddD2(builder: flatbuffers.Builder, d2: float):\n    MonsterExtraAddD2(builder, d2)\n\ndef MonsterExtraAddD3(builder: flatbuffers.Builder, d3: float):\n    builder.PrependFloat64Slot(3, d3, float('-inf'))\n\ndef AddD3(builder: flatbuffers.Builder, d3: float):\n    MonsterExtraAddD3(builder, d3)\n\ndef MonsterExtraAddF0(builder: flatbuffers.Builder, f0: float):\n    builder.PrependFloat32Slot(4, f0, float('nan'))\n\ndef AddF0(builder: flatbuffers.Builder, f0: float):\n    MonsterExtraAddF0(builder, f0)\n\ndef MonsterExtraAddF1(builder: flatbuffers.Builder, f1: float):\n    builder.PrependFloat32Slot(5, f1, float('nan'))\n\ndef AddF1(builder: flatbuffers.Builder, f1: float):\n    MonsterExtraAddF1(builder, f1)\n\ndef MonsterExtraAddF2(builder: flatbuffers.Builder, f2: float):\n    builder.PrependFloat32Slot(6, f2, float('inf'))\n\ndef AddF2(builder: flatbuffers.Builder, f2: float):\n    MonsterExtraAddF2(builder, f2)\n\ndef MonsterExtraAddF3(builder: flatbuffers.Builder, f3: float):\n    builder.PrependFloat32Slot(7, f3, float('-inf'))\n\ndef AddF3(builder: flatbuffers.Builder, f3: float):\n    MonsterExtraAddF3(builder, f3)\n\ndef MonsterExtraAddDvec(builder: flatbuffers.Builder, dvec: int):\n    builder.PrependUOffsetTRelativeSlot(8, flatbuffers.number_types.UOffsetTFlags.py_type(dvec), 0)\n\ndef AddDvec(builder: flatbuffers.Builder, dvec: int):\n    MonsterExtraAddDvec(builder, dvec)\n\ndef MonsterExtraStartDvecVector(builder, numElems: int) -> int:\n    return builder.StartVector(8, numElems, 8)\n\ndef StartDvecVector(builder, numElems: int) -> int:\n    return MonsterExtraStartDvecVector(builder, numElems)\n\ndef MonsterExtraCreateDvecVector(builder: flatbuffers.Builder, data: Iterable[Any]) -> int:\n    data = list(data)\n    builder.StartVector(8, len(data), 8)\n    for item in reversed(data):\n        builder.PrependFloat64(item)\n    return builder.EndVector()\n\ndef CreateDvecVector(builder: flatbuffers.Builder, data: Iterable[Any]) -> int:\n    return MonsterExtraCreateDvecVector(builder, data)\n\ndef MonsterExtraAddFvec(builder: flatbuffers.Builder, fvec: int):\n    builder.PrependUOffsetTRelativeSlot(9, flatbuffers.number_types.UOffsetTFlags.py_type(fvec), 0)\n\ndef AddFvec(builder: flatbuffers.Builder, fvec: int):\n    MonsterExtraAddFvec(builder, fvec)\n\ndef MonsterExtraStartFvecVector(builder, numElems: int) -> int:\n    return builder.StartVector(4, numElems, 4)\n\ndef StartFvecVector(builder, numElems: int) -> int:\n    return MonsterExtraStartFvecVector(builder, numElems)\n\ndef MonsterExtraCreateFvecVector(builder: flatbuffers.Builder, data: Iterable[Any]) -> int:\n    data = list(data)\n    builder.StartVector(4, len(data), 4)\n    for item in reversed(data):\n        builder.PrependFloat32(item)\n    return builder.EndVector()\n\ndef CreateFvecVector(builder: flatbuffers.Builder, data: Iterable[Any]) -> int:\n    return MonsterExtraCreateFvecVector(builder, data)\n\ndef MonsterExtraEnd(builder: flatbuffers.Builder) -> int:\n    return builder.EndObject()\n\ndef End(builder: flatbuffers.Builder) -> int:\n    return MonsterExtraEnd(builder)\n\ntry:\n    from typing import List\nexcept:\n    pass\n\nclass MonsterExtraT(object):\n\n    # MonsterExtraT\n    def __init__(\n        self,\n        d0 = float('nan'),\n        d1 = float('nan'),\n        d2 = float('inf'),\n        d3 = float('-inf'),\n        f0 = float('nan'),\n        f1 = float('nan'),\n        f2 = float('inf'),\n        f3 = float('-inf'),\n        dvec = None,\n        fvec = None,\n    ):\n        self.d0 = d0  # type: float\n        self.d1 = d1  # type: float\n        self.d2 = d2  # type: float\n        self.d3 = d3  # type: float\n        self.f0 = f0  # type: float\n        self.f1 = f1  # type: float\n        self.f2 = f2  # type: float\n        self.f3 = f3  # type: float\n        self.dvec = dvec  # type: Optional[List[float]]\n        self.fvec = fvec  # type: Optional[List[float]]\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        monsterExtra = MonsterExtra()\n        monsterExtra.Init(buf, pos)\n        return cls.InitFromObj(monsterExtra)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, monsterExtra):\n        x = MonsterExtraT()\n        x._UnPack(monsterExtra)\n        return x\n\n    def __eq__(self, other):\n        return type(self) == type(other) and \\\n            self.d0 == other.d0 and \\\n            self.d1 == other.d1 and \\\n            self.d2 == other.d2 and \\\n            self.d3 == other.d3 and \\\n            self.f0 == other.f0 and \\\n            self.f1 == other.f1 and \\\n            self.f2 == other.f2 and \\\n            self.f3 == other.f3 and \\\n            np.array_equal(self.dvec, other.dvec) and \\\n            np.array_equal(self.fvec, other.fvec)\n\n    # MonsterExtraT\n    def _UnPack(self, monsterExtra):\n        if monsterExtra is None:\n            return\n        self.d0 = monsterExtra.D0()\n        self.d1 = monsterExtra.D1()\n        self.d2 = monsterExtra.D2()\n        self.d3 = monsterExtra.D3()\n        self.f0 = monsterExtra.F0()\n        self.f1 = monsterExtra.F1()\n        self.f2 = monsterExtra.F2()\n        self.f3 = monsterExtra.F3()\n        if not monsterExtra.DvecIsNone():\n            if np is None:\n                self.dvec = []\n                for i in range(monsterExtra.DvecLength()):\n                    self.dvec.append(monsterExtra.Dvec(i))\n            else:\n                self.dvec = monsterExtra.DvecAsNumpy()\n        if not monsterExtra.FvecIsNone():\n            if np is None:\n                self.fvec = []\n                for i in range(monsterExtra.FvecLength()):\n                    self.fvec.append(monsterExtra.Fvec(i))\n            else:\n                self.fvec = monsterExtra.FvecAsNumpy()\n\n    # MonsterExtraT\n    def Pack(self, builder):\n        if self.dvec is not None:\n            if np is not None and type(self.dvec) is np.ndarray:\n                dvec = builder.CreateNumpyVector(self.dvec)\n            else:\n                MonsterExtraStartDvecVector(builder, len(self.dvec))\n                for i in reversed(range(len(self.dvec))):\n                    builder.PrependFloat64(self.dvec[i])\n                dvec = builder.EndVector()\n        if self.fvec is not None:\n            if np is not None and type(self.fvec) is np.ndarray:\n                fvec = builder.CreateNumpyVector(self.fvec)\n            else:\n                MonsterExtraStartFvecVector(builder, len(self.fvec))\n                for i in reversed(range(len(self.fvec))):\n                    builder.PrependFloat32(self.fvec[i])\n                fvec = builder.EndVector()\n        MonsterExtraStart(builder)\n        MonsterExtraAddD0(builder, self.d0)\n        MonsterExtraAddD1(builder, self.d1)\n        MonsterExtraAddD2(builder, self.d2)\n        MonsterExtraAddD3(builder, self.d3)\n        MonsterExtraAddF0(builder, self.f0)\n        MonsterExtraAddF1(builder, self.f1)\n        MonsterExtraAddF2(builder, self.f2)\n        MonsterExtraAddF3(builder, self.f3)\n        if self.dvec is not None:\n            MonsterExtraAddDvec(builder, dvec)\n        if self.fvec is not None:\n            MonsterExtraAddFvec(builder, fvec)\n        monsterExtra = MonsterExtraEnd(builder)\n        return monsterExtra\n"
  },
  {
    "path": "tests/MyGame/MonsterExtra.pyi",
    "content": "from __future__ import annotations\n\nimport flatbuffers\nimport numpy as np\n\nimport typing\n\nuoffset: typing.TypeAlias = flatbuffers.number_types.UOffsetTFlags.py_type\n\nclass MonsterExtra(object):\n  @classmethod\n  def GetRootAs(cls, buf: bytes, offset: int) -> MonsterExtra: ...\n  @classmethod\n  def GetRootAsMonsterExtra(cls, buf: bytes, offset: int) -> MonsterExtra: ...\n  @classmethod\n  def MonsterExtraBufferHasIdentifier(cls, buf: bytes, offset: int, size_prefixed: bool) -> bool: ...\n  def Init(self, buf: bytes, pos: int) -> None: ...\n  def D0(self) -> float: ...\n  def D1(self) -> float: ...\n  def D2(self) -> float: ...\n  def D3(self) -> float: ...\n  def F0(self) -> float: ...\n  def F1(self) -> float: ...\n  def F2(self) -> float: ...\n  def F3(self) -> float: ...\n  def Dvec(self, i: int) -> typing.List[float]: ...\n  def DvecAsNumpy(self) -> np.ndarray: ...\n  def DvecLength(self) -> int: ...\n  def DvecIsNone(self) -> bool: ...\n  def Fvec(self, i: int) -> typing.List[float]: ...\n  def FvecAsNumpy(self) -> np.ndarray: ...\n  def FvecLength(self) -> int: ...\n  def FvecIsNone(self) -> bool: ...\nclass MonsterExtraT(object):\n  d0: float\n  d1: float\n  d2: float\n  d3: float\n  f0: float\n  f1: float\n  f2: float\n  f3: float\n  dvec: typing.List[float]\n  fvec: typing.List[float]\n  def __init__(\n    self,\n    d0: float = ...,\n    d1: float = ...,\n    d2: float = ...,\n    d3: float = ...,\n    f0: float = ...,\n    f1: float = ...,\n    f2: float = ...,\n    f3: float = ...,\n    dvec: typing.List[float] | None = ...,\n    fvec: typing.List[float] | None = ...,\n  ) -> None: ...\n  @classmethod\n  def InitFromBuf(cls, buf: bytes, pos: int) -> MonsterExtraT: ...\n  @classmethod\n  def InitFromPackedBuf(cls, buf: bytes, pos: int = 0) -> MonsterExtraT: ...\n  @classmethod\n  def InitFromObj(cls, monsterExtra: MonsterExtra) -> MonsterExtraT: ...\n  def _UnPack(self, monsterExtra: MonsterExtra) -> None: ...\n  def Pack(self, builder: flatbuffers.Builder) -> None: ...\n  def __eq__(self, other: MonsterExtraT) -> bool: ...\ndef MonsterExtraStart(builder: flatbuffers.Builder) -> None: ...\ndef Start(builder: flatbuffers.Builder) -> None: ...\ndef MonsterExtraAddD0(builder: flatbuffers.Builder, d0: float) -> None: ...\ndef MonsterExtraAddD1(builder: flatbuffers.Builder, d1: float) -> None: ...\ndef MonsterExtraAddD2(builder: flatbuffers.Builder, d2: float) -> None: ...\ndef MonsterExtraAddD3(builder: flatbuffers.Builder, d3: float) -> None: ...\ndef MonsterExtraAddF0(builder: flatbuffers.Builder, f0: float) -> None: ...\ndef MonsterExtraAddF1(builder: flatbuffers.Builder, f1: float) -> None: ...\ndef MonsterExtraAddF2(builder: flatbuffers.Builder, f2: float) -> None: ...\ndef MonsterExtraAddF3(builder: flatbuffers.Builder, f3: float) -> None: ...\ndef MonsterExtraAddDvec(builder: flatbuffers.Builder, dvec: uoffset) -> None: ...\ndef MonsterExtraStartDvecVector(builder: flatbuffers.Builder, num_elems: int) -> uoffset: ...\ndef StartDvecVector(builder: flatbuffers.Builder, num_elems: int) -> uoffset: ...\ndef MonsterExtraCreateDvecVector(builder: flatbuffers.Builder, data: typing.Iterable[typing.Any]) -> uoffset: ...\ndef CreateDvecVector(builder: flatbuffers.Builder, data: typing.Iterable[typing.Any]) -> uoffset: ...\ndef MonsterExtraAddFvec(builder: flatbuffers.Builder, fvec: uoffset) -> None: ...\ndef MonsterExtraStartFvecVector(builder: flatbuffers.Builder, num_elems: int) -> uoffset: ...\ndef StartFvecVector(builder: flatbuffers.Builder, num_elems: int) -> uoffset: ...\ndef MonsterExtraCreateFvecVector(builder: flatbuffers.Builder, data: typing.Iterable[typing.Any]) -> uoffset: ...\ndef CreateFvecVector(builder: flatbuffers.Builder, data: typing.Iterable[typing.Any]) -> uoffset: ...\ndef MonsterExtraEnd(builder: flatbuffers.Builder) -> uoffset: ...\ndef End(builder: flatbuffers.Builder) -> uoffset: ...\n\n"
  },
  {
    "path": "tests/MyGame/MonsterExtraT.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\npublic class MonsterExtraT {\n  private double d0;\n  private double d1;\n  private double d2;\n  private double d3;\n  private float f0;\n  private float f1;\n  private float f2;\n  private float f3;\n  private double[] dvec;\n  private float[] fvec;\n\n  public double getD0() { return d0; }\n\n  public void setD0(double d0) { this.d0 = d0; }\n\n  public double getD1() { return d1; }\n\n  public void setD1(double d1) { this.d1 = d1; }\n\n  public double getD2() { return d2; }\n\n  public void setD2(double d2) { this.d2 = d2; }\n\n  public double getD3() { return d3; }\n\n  public void setD3(double d3) { this.d3 = d3; }\n\n  public float getF0() { return f0; }\n\n  public void setF0(float f0) { this.f0 = f0; }\n\n  public float getF1() { return f1; }\n\n  public void setF1(float f1) { this.f1 = f1; }\n\n  public float getF2() { return f2; }\n\n  public void setF2(float f2) { this.f2 = f2; }\n\n  public float getF3() { return f3; }\n\n  public void setF3(float f3) { this.f3 = f3; }\n\n  public double[] getDvec() { return dvec; }\n\n  public void setDvec(double[] dvec) { this.dvec = dvec; }\n\n  public float[] getFvec() { return fvec; }\n\n  public void setFvec(float[] fvec) { this.fvec = fvec; }\n\n\n  public MonsterExtraT() {\n    this.d0 = Double.NaN;\n    this.d1 = Double.NaN;\n    this.d2 = Double.POSITIVE_INFINITY;\n    this.d3 = Double.NEGATIVE_INFINITY;\n    this.f0 = Float.NaN;\n    this.f1 = Float.NaN;\n    this.f2 = Float.POSITIVE_INFINITY;\n    this.f3 = Float.NEGATIVE_INFINITY;\n    this.dvec = null;\n    this.fvec = null;\n  }\n  public static MonsterExtraT deserializeFromBinary(byte[] fbBuffer) {\n    return MonsterExtra.getRootAsMonsterExtra(ByteBuffer.wrap(fbBuffer)).unpack();\n  }\n  public byte[] serializeToBinary() {\n    FlatBufferBuilder fbb = new FlatBufferBuilder();\n    MonsterExtra.finishMonsterExtraBuffer(fbb, MonsterExtra.pack(fbb, this));\n    return fbb.sizedByteArray();\n  }\n}\n\n"
  },
  {
    "path": "tests/MyGame/OtherNameSpace/FromInclude.lua",
    "content": "--[[ MyGame.OtherNameSpace.FromInclude\n\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : //include_test/sub/include_test2.fbs\n  Rooting type : MyGame.Example.Monster (//monster_test.fbs)\n\n--]]\n\nlocal FromInclude = {\n  IncludeVal = 0,\n}\n\nreturn FromInclude"
  },
  {
    "path": "tests/MyGame/OtherNameSpace/FromInclude.nim",
    "content": "#[ MyGame.OtherNameSpace.FromInclude\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : \n  Rooting type : MyGame.Example.Monster ()\n]#\n\ntype FromInclude*{.pure.} = enum\n  IncludeVal = 0.int64,\n"
  },
  {
    "path": "tests/MyGame/OtherNameSpace/TableB.lua",
    "content": "--[[ MyGame.OtherNameSpace.TableB\n\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : //include_test/sub/include_test2.fbs\n  Rooting type : MyGame.Example.Monster (//monster_test.fbs)\n\n--]]\n\nlocal __TableA = require('TableA')\nlocal flatbuffers = require('flatbuffers')\n\nlocal TableB = {}\nlocal mt = {}\n\nfunction TableB.New()\n  local o = {}\n  setmetatable(o, {__index = mt})\n  return o\nend\n\nfunction mt:Init(buf, pos)\n  self.view = flatbuffers.view.New(buf, pos)\nend\n\nfunction mt:A()\n  local o = self.view:Offset(4)\n  if o ~= 0 then\n    local x = self.view:Indirect(self.view.pos + o)\n    local obj = __TableA.New()\n    obj:Init(self.view.bytes, x)\n    return obj\n  end\nend\n\nfunction TableB.Start(builder)\n  builder:StartObject(1)\nend\n\nfunction TableB.AddA(builder, a)\n  builder:PrependStructSlot(0, a, 0)\nend\n\nfunction TableB.End(builder)\n  return builder:EndObject()\nend\n\nreturn TableB"
  },
  {
    "path": "tests/MyGame/OtherNameSpace/TableB.nim",
    "content": "#[ MyGame.OtherNameSpace.TableB\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : \n  Rooting type : MyGame.Example.Monster ()\n]#\n\nimport ../../TableA as TableA\nimport flatbuffers\nimport std/options\n\ntype TableB* = object of FlatObj\nfunc a*(self: TableB): Option[TableA.TableA] =\n  let o = self.tab.Offset(4)\n  if o != 0:\n    return some(TableA.TableA(tab: Vtable(Bytes: self.tab.Bytes, Pos: self.tab.Pos + o)))\nproc TableBstart*(builder: var Builder) =\n  builder.StartObject(1)\nproc TableBadda*(builder: var Builder, a: uoffset) =\n  builder.PrependStructSlot(0, a, default(uoffset))\nproc TableBend*(builder: var Builder): uoffset =\n  return builder.EndObject()\n"
  },
  {
    "path": "tests/MyGame/OtherNameSpace/TableBT.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.OtherNameSpace;\n\nimport com.google.flatbuffers.*;\nimport java.nio.*;\nimport java.util.*;\n\npublic class TableBT {\n  private TableAT a;\n\n  public TableAT getA() {\n    return a;\n  }\n\n  public void setA(TableAT a) {\n    this.a = a;\n  }\n\n  public TableBT() {\n    this.a = null;\n  }\n}\n"
  },
  {
    "path": "tests/MyGame/OtherNameSpace/Unused.lua",
    "content": "--[[ MyGame.OtherNameSpace.Unused\n\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : //include_test/sub/include_test2.fbs\n  Rooting type : MyGame.Example.Monster (//monster_test.fbs)\n\n--]]\n\nlocal flatbuffers = require('flatbuffers')\n\nlocal Unused = {}\nlocal mt = {}\n\nfunction Unused.New()\n  local o = {}\n  setmetatable(o, {__index = mt})\n  return o\nend\n\nfunction mt:Init(buf, pos)\n  self.view = flatbuffers.view.New(buf, pos)\nend\n\nfunction mt:A()\n  return self.view:Get(flatbuffers.N.Int32, self.view.pos + 0)\nend\n\nfunction Unused.CreateUnused(builder, a)\n  builder:Prep(4, 4)\n  builder:PrependInt32(a)\n  return builder:Offset()\nend\n\nreturn Unused"
  },
  {
    "path": "tests/MyGame/OtherNameSpace/Unused.nim",
    "content": "#[ MyGame.OtherNameSpace.Unused\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : \n  Rooting type : MyGame.Example.Monster ()\n]#\n\nimport flatbuffers\n\ntype Unused* = object of FlatObj\nfunc a*(self: Unused): int32 =\n  return Get[int32](self.tab, self.tab.Pos + 0)\nfunc `a=`*(self: var Unused, n: int32): bool =\n  return self.tab.Mutate(self.tab.Pos + 0, n)\nproc UnusedCreate*(self: var Builder, a: int32): uoffset =\n  self.Prep(4, 4)\n  self.Prepend(a)\n  return self.Offset()\n"
  },
  {
    "path": "tests/MyGame/OtherNameSpace/UnusedT.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage MyGame.OtherNameSpace;\n\nimport com.google.flatbuffers.*;\nimport java.nio.*;\nimport java.util.*;\n\npublic class UnusedT {\n  private int a;\n\n  public int getA() {\n    return a;\n  }\n\n  public void setA(int a) {\n    this.a = a;\n  }\n\n  public UnusedT() {\n    this.a = 0;\n  }\n}\n"
  },
  {
    "path": "tests/MyGame/__init__.py",
    "content": ""
  },
  {
    "path": "tests/Pizza.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage Pizza\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n)\n\ntype PizzaT struct {\n\tSize int32 `json:\"size\"`\n}\n\nfunc (t *PizzaT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\tif t == nil {\n\t\treturn 0\n\t}\n\tPizzaStart(builder)\n\tPizzaAddSize(builder, t.Size)\n\treturn PizzaEnd(builder)\n}\n\nfunc (rcv *Pizza) UnPackTo(t *PizzaT) {\n\tt.Size = rcv.Size()\n}\n\nfunc (rcv *Pizza) UnPack() *PizzaT {\n\tif rcv == nil {\n\t\treturn nil\n\t}\n\tt := &PizzaT{}\n\trcv.UnPackTo(t)\n\treturn t\n}\n\ntype Pizza struct {\n\t_tab flatbuffers.Table\n}\n\nfunc GetRootAsPizza(buf []byte, offset flatbuffers.UOffsetT) *Pizza {\n\tn := flatbuffers.GetUOffsetT(buf[offset:])\n\tx := &Pizza{}\n\tx.Init(buf, n+offset)\n\treturn x\n}\n\nfunc GetSizePrefixedRootAsPizza(buf []byte, offset flatbuffers.UOffsetT) *Pizza {\n\tn := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])\n\tx := &Pizza{}\n\tx.Init(buf, n+offset+flatbuffers.SizeUint32)\n\treturn x\n}\n\nfunc (rcv *Pizza) Init(buf []byte, i flatbuffers.UOffsetT) {\n\trcv._tab.Bytes = buf\n\trcv._tab.Pos = i\n}\n\nfunc (rcv *Pizza) Table() flatbuffers.Table {\n\treturn rcv._tab\n}\n\nfunc (rcv *Pizza) Size() int32 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(4))\n\tif o != 0 {\n\t\treturn rcv._tab.GetInt32(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *Pizza) MutateSize(n int32) bool {\n\treturn rcv._tab.MutateInt32Slot(4, n)\n}\n\nfunc PizzaStart(builder *flatbuffers.Builder) {\n\tbuilder.StartObject(1)\n}\nfunc PizzaAddSize(builder *flatbuffers.Builder, size int32) {\n\tbuilder.PrependInt32Slot(0, size, 0)\n}\nfunc PizzaEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\treturn builder.EndObject()\n}\n"
  },
  {
    "path": "tests/Property.nim",
    "content": "#[ Property\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : \n]#\n\nimport flatbuffers\n\ntype Property* = object of FlatObj\nfunc property*(self: Property): bool =\n  return Get[bool](self.tab, self.tab.Pos + 0)\nfunc `property=`*(self: var Property, n: bool): bool =\n  return self.tab.Mutate(self.tab.Pos + 0, n)\nproc PropertyCreate*(self: var Builder, property: bool): uoffset =\n  self.Prep(1, 1)\n  self.Prepend(property)\n  return self.Offset()\n"
  },
  {
    "path": "tests/PythonTest.sh",
    "content": "#!/bin/bash\n#\n# Copyright 2014 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -eu\n\npushd \"$(dirname $0)\" >/dev/null\ntest_dir=\"$(pwd)\"\ngen_code_path=${test_dir}\nruntime_library_dir=${test_dir}/../python\n\n# Emit Python code for the example schema in the test dir:\n${test_dir}/../flatc -p -o ${gen_code_path} -I include_test monster_test.fbs --gen-object-api\n${test_dir}/../flatc -p -o ${gen_code_path} -I include_test monster_test.fbs --gen-object-api --gen-onefile\n${test_dir}/../flatc -p -o ${gen_code_path} -I include_test monster_extra.fbs --gen-object-api --python-typing --gen-compare\n${test_dir}/../flatc -p -o ${gen_code_path} -I include_test arrays_test.fbs --gen-object-api --python-typing\n${test_dir}/../flatc -p -o ${gen_code_path} -I include_test nested_union_test.fbs --gen-object-api --python-typing --python-decode-obj-api-strings\n${test_dir}/../flatc -p -o ${gen_code_path} -I include_test service_test.fbs --grpc --grpc-python-typed-handlers --python-typing --no-python-gen-numpy --gen-onefile\n${test_dir}/../flatc -p -o ${gen_code_path} union_name_test.fbs --gen-object-api\n\n# Syntax: run_tests <interpreter> <benchmark vtable dedupes>\n#                   <benchmark read count> <benchmark build count>\ninterpreters_tested=()\nfunction run_tests() {\n  if $(which ${1} >/dev/null); then\n    echo \"Testing with interpreter: ${1}\"\n    PYTHONDONTWRITEBYTECODE=1 \\\n    JYTHONDONTWRITEBYTECODE=1 \\\n    PYTHONPATH=${runtime_library_dir}:${gen_code_path} \\\n    JYTHONPATH=${runtime_library_dir}:${gen_code_path} \\\n    COMPARE_GENERATED_TO_GO=0 \\\n    COMPARE_GENERATED_TO_JAVA=0 \\\n    $1 py_test.py $2 $3 $4 $5 $6\n    if [ $1 = python3 ]; then\n      PYTHONDONTWRITEBYTECODE=1 \\\n      PYTHONPATH=${runtime_library_dir}:${gen_code_path} \\\n      $1 py_flexbuffers_test.py\n    fi\n    interpreters_tested+=(${1})\n    echo\n  fi\n}\n\n# Run test suite with these interpreters. The arguments are benchmark counts.\nrun_tests python2.6 100 100 100 100 false\nrun_tests python2.7 100 100 100 100 false\nrun_tests python2.7 100 100 100 100 true\nrun_tests python3 100 100 100 100 false\nrun_tests python3 100 100 100 100 true\nrun_tests pypy 100 100 100 100 false\n\n# NOTE: We'd like to support python2.5 in the future.\n\n# NOTE: Jython 2.7.0 fails due to a bug in the stdlib `struct` library:\n#       http://bugs.jython.org/issue2188\n\nif [ ${#interpreters_tested[@]} -eq 0 ]; then\n  echo \"No Python interpeters found on this system, could not run tests.\"\n  exit 1\nfi\n\n# Run test suite with default python intereter.\n# (If the Python program `coverage` is available, it will be run, too.\n#  Install `coverage` with `pip install coverage`.)\nif $(which coverage >/dev/null); then\n  echo 'Found coverage utility, running coverage with default Python:'\n\n  PYTHONDONTWRITEBYTECODE=1 \\\n  PYTHONPATH=${runtime_library_dir}:${gen_code_path} \\\n  coverage run --source=flatbuffers,MyGame py_test.py 0 0 0 0 false > /dev/null\n\n  echo\n  cov_result=`coverage report --omit=\"*flatbuffers/vendor*,*py_test*\" \\\n              | tail -n 1 | awk ' { print $4 } '`\n  echo \"Code coverage: ${cov_result}\"\nelse\n  echo -n \"Did not find coverage utility for default Python, skipping. \"\n  echo \"Install with 'pip install coverage'.\"\nfi\n\necho\necho \"OK: all tests passed for ${#interpreters_tested[@]} interpreters: ${interpreters_tested[@]}.\"\n"
  },
  {
    "path": "tests/RustTest.bat",
    "content": "@echo off\nrem Copyright 2018 Google Inc. All rights reserved.\nrem\nrem Licensed under the Apache License, Version 2.0 (the \"License\");\nrem you may not use this file except in compliance with the License.\nrem You may obtain a copy of the License at\nrem\nrem     http://www.apache.org/licenses/LICENSE-2.0\nrem\nrem Unless required by applicable law or agreed to in writing, software\nrem distributed under the License is distributed on an \"AS IS\" BASIS,\nrem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nrem See the License for the specific language governing permissions and\nrem limitations under the License.\n\nrem Compile then run the Rust test.\n\ncd rust_serialize_test\ncargo run -- --quiet || exit /b 1\n\ncd ../rust_no_std_compilation_test\nrustup install nightly\nrustup component add rust-src --toolchain nightly\nrustup target add thumbv7m-none-eabi\ncargo +nightly build || exit /b 1\n\ncd ../rust_usage_test\ncargo test -- --quiet || exit /b 1\ncargo run --bin=flatbuffers_alloc_check || exit /b 1\ncargo run --bin=flexbuffers_alloc_check || exit /b 1\ncargo run --bin=monster_example || exit /b 1\ncd ..\n\n"
  },
  {
    "path": "tests/RustTest.sh",
    "content": "#!/bin/bash\nset -e\n#\n# Copyright 2018 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nif [[ \"$1\" == \"mips-unknown-linux-gnu\" ]]; then\n    TARGET_FLAG=\"--target mips-unknown-linux-gnu\"\n    export CARGO_TARGET_MIPS_UNKNOWN_LINUX_GNU_LINKER=mips-linux-gnu-gcc\n    export CARGO_TARGET_MIPS_UNKNOWN_LINUX_GNU_RUNNER=\"qemu-mips -L /usr/mips-linux-gnu\"\nfi\n\n\nfunction check_test_result() {\n    if [[ $? == 0 ]]; then\n        echo OK: $1 passed.\n    else\n        echo KO: $1 failed.\n        exit 1\n    fi\n}\n\ncd ./rust_serialize_test\ncargo run $TARGET_FLAG -- --quiet\ncheck_test_result \"Rust serde tests\"\n\ncd ../rust_no_std_compilation_test\nrustup install nightly\nrustup component add rust-src --toolchain nightly\nrustup target add thumbv7m-none-eabi\ncargo +nightly build\ncheck_test_result \"Rust flatbuffers test no_std compilation\"\n\ncd ../rust_usage_test\ncargo test $TARGET_FLAG -- --quiet\ncheck_test_result \"Rust tests\"\n\ncargo test $TARGET_FLAG --no-default-features -- --quiet\ncheck_test_result \"Rust tests (no_std)\"\n\ncargo run $TARGET_FLAG --bin=flatbuffers_alloc_check\ncheck_test_result \"Rust flatbuffers heap alloc test\"\n\ncargo run $TARGET_FLAG --bin=flexbuffers_alloc_check\ncheck_test_result \"Rust flexbuffers heap alloc test\"\n\nrustup component add clippy\ncargo clippy $TARGET_FLAG\ncheck_test_result \"No Cargo clippy lints test\"\n\ncargo bench $TARGET_FLAG\n\n# This test is dependent on flatc.\nif [[ -f ../../flatc ]]; then\n    cd outdir\n    cargo test\n    check_test_result \"Rust generated file in \\$OUT_DIR\"\n    cd ..\nfi\n\n# RUST_NIGHTLY environment variable set in dockerfile.\nif [[ $RUST_NIGHTLY == 1 ]]; then\n  rustup +nightly component add miri\n  MIRIFLAGS=\"-Zmiri-disable-isolation\" cargo +nightly miri test\nfi\n"
  },
  {
    "path": "tests/TableA.lua",
    "content": "--[[ TableA\n\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : //include_test/include_test1.fbs\n  Rooting type : MyGame.Example.Monster (//monster_test.fbs)\n\n--]]\n\nlocal __MyGame_OtherNameSpace_TableB = require('MyGame.OtherNameSpace.TableB')\nlocal flatbuffers = require('flatbuffers')\n\nlocal TableA = {}\nlocal mt = {}\n\nfunction TableA.New()\n  local o = {}\n  setmetatable(o, {__index = mt})\n  return o\nend\n\nfunction mt:Init(buf, pos)\n  self.view = flatbuffers.view.New(buf, pos)\nend\n\nfunction mt:B()\n  local o = self.view:Offset(4)\n  if o ~= 0 then\n    local x = self.view:Indirect(self.view.pos + o)\n    local obj = __MyGame_OtherNameSpace_TableB.New()\n    obj:Init(self.view.bytes, x)\n    return obj\n  end\nend\n\nfunction TableA.Start(builder)\n  builder:StartObject(1)\nend\n\nfunction TableA.AddB(builder, b)\n  builder:PrependStructSlot(0, b, 0)\nend\n\nfunction TableA.End(builder)\n  return builder:EndObject()\nend\n\nreturn TableA"
  },
  {
    "path": "tests/TableA.nim",
    "content": "#[ TableA\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : \n  Rooting type : MyGame.Example.Monster ()\n]#\n\nimport MyGame/OtherNameSpace/TableB as MyGame_OtherNameSpace_TableB\nimport flatbuffers\nimport std/options\n\ntype TableA* = object of FlatObj\nfunc b*(self: TableA): Option[MyGame_OtherNameSpace_TableB.TableB] =\n  let o = self.tab.Offset(4)\n  if o != 0:\n    return some(MyGame_OtherNameSpace_TableB.TableB(tab: Vtable(Bytes: self.tab.Bytes, Pos: self.tab.Pos + o)))\nproc TableAstart*(builder: var Builder) =\n  builder.StartObject(1)\nproc TableAaddb*(builder: var Builder, b: uoffset) =\n  builder.PrependStructSlot(0, b, default(uoffset))\nproc TableAend*(builder: var Builder): uoffset =\n  return builder.EndObject()\n"
  },
  {
    "path": "tests/TableAT.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\nimport com.google.flatbuffers.*;\nimport java.nio.*;\nimport java.util.*;\n\npublic class TableAT {\n  private MyGame.OtherNameSpace.TableBT b;\n\n  public MyGame.OtherNameSpace.TableBT getB() {\n    return b;\n  }\n\n  public void setB(MyGame.OtherNameSpace.TableBT b) {\n    this.b = b;\n  }\n\n  public TableAT() {\n    this.b = null;\n  }\n}\n"
  },
  {
    "path": "tests/TestAll.sh",
    "content": "echo \"************************ Java:\"\n\nsh JavaTest.sh\n\necho \"************************ Kotlin:\"\n\nsh KotlinTest.sh\n\necho \"************************ Go:\"\n\nsh GoTest.sh\n\necho \"************************ Python:\"\n\nsh PythonTest.sh\n\necho \"************************ TypeScript:\"\n\npython3 ts/TypeScriptTest.py\n\necho \"************************ C++:\"\n\ncd ..\n./flattests\ncd tests\n\necho \"************************ C#:\"\n\ncd FlatBuffers.Test\nsh NetTest.sh\ncd ..\n\necho \"************************ PHP:\"\n\nphp phpTest.php\nsh phpUnionVectorTest.sh\n\necho \"************************ Dart:\"\n\nsh DartTest.sh\n\necho \"************************ Rust:\"\n\nsh RustTest.sh\n\necho \"************************ Lobster:\"\n\n# TODO: test if available.\n# lobster lobstertest.lobster\n\necho \"************************ C:\"\n\necho \"(in a different repo)\"\n\necho \"************************ Swift:\"\n\ncd FlatBuffers.Test.Swift\nsh SwiftTest.sh\ncd ..\n"
  },
  {
    "path": "tests/TestMutatingBool.nim",
    "content": "#[ TestMutatingBool\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : \n]#\n\nimport Property as Property\nimport flatbuffers\nimport std/options\n\ntype TestMutatingBool* = object of FlatObj\nfunc b*(self: TestMutatingBool): Option[Property.Property] =\n  let o = self.tab.Offset(4)\n  if o != 0:\n    return some(Property.Property(tab: Vtable(Bytes: self.tab.Bytes, Pos: self.tab.Pos + o)))\nproc TestMutatingBoolStart*(builder: var Builder) =\n  builder.StartObject(1)\nproc TestMutatingBoolAddb*(builder: var Builder, b: uoffset) =\n  builder.PrependStructSlot(0, b, default(uoffset))\nproc TestMutatingBoolEnd*(builder: var Builder): uoffset =\n  return builder.EndObject()\n"
  },
  {
    "path": "tests/alignment_test.cpp",
    "content": "#include \"alignment_test.h\"\n\n#include \"flatbuffers/flatbuffer_builder.h\"\n#include \"flatbuffers/util.h\"\n#include \"test_assert.h\"\n#include \"tests/alignment_test_generated.h\"\n\nnamespace flatbuffers {\nnamespace tests {\n\nvoid AlignmentTest() {\n  FlatBufferBuilder builder;\n\n  BadAlignmentLarge large;\n  Offset<OuterLarge> outer_large = CreateOuterLarge(builder, &large);\n\n  BadAlignmentSmall* small;\n  Offset<Vector<const BadAlignmentSmall*>> small_offset =\n      builder.CreateUninitializedVectorOfStructs(9, &small);\n  (void)small;  // We do not have to write data to trigger the test failure\n\n  Offset<BadAlignmentRoot> root =\n      CreateBadAlignmentRoot(builder, outer_large, small_offset);\n\n  builder.Finish(root);\n\n  Verifier verifier(builder.GetBufferPointer(), builder.GetSize());\n  TEST_ASSERT(verifier.VerifyBuffer<BadAlignmentRoot>(nullptr));\n\n  // ============= Test Small Structs Vector misalignment ========\n\n  builder.Clear();\n\n  // creating 5 structs with 2 bytes each\n  // 10 bytes in total for Vector data is needed\n  std::vector<EvenSmallStruct> even_vector = {{2, 1}, {3, 1}, {4, 1}};\n  std::vector<OddSmallStruct> odd_vector = {{6, 5, 4}, {9, 8, 7}, {1, 2, 3}};\n  // CreateVectorOfStructs is used in the generated CreateSmallStructsDirect()\n  // method, but we test it directly\n  Offset<Vector<const EvenSmallStruct*>> even_structs_offset =\n      builder.CreateVectorOfStructs<EvenSmallStruct>(even_vector);\n  Offset<Vector<const OddSmallStruct*>> odd_structs_offset =\n      builder.CreateVectorOfStructs<OddSmallStruct>(odd_vector);\n  Offset<SmallStructs> small_structs_root =\n      CreateSmallStructs(builder, even_structs_offset, odd_structs_offset);\n\n  builder.Finish(small_structs_root);\n\n  // Save the binary that we later can annotate with `flatc --annotate` command\n  // NOTE: the conversion of the JSON data to --binary via `flatc --binary`\n  //       command is not changed with that fix and was always producing the\n  //       correct binary data.\n  // SaveFile(\"alignment_test_{before,after}_fix.bin\",\n  //          reinterpret_cast<char *>(builder.GetBufferPointer()),\n  //          builder.GetSize(), true);\n\n  Verifier verifier_small_structs(builder.GetBufferPointer(),\n                                  builder.GetSize());\n  TEST_ASSERT(verifier_small_structs.VerifyBuffer<SmallStructs>(nullptr));\n\n  // Reading SmallStructs vector values back and compare with original\n  auto root_msg =\n      flatbuffers::GetRoot<SmallStructs>(builder.GetBufferPointer());\n\n  TEST_EQ(root_msg->even_structs()->size(), even_vector.size());\n  for (flatbuffers::uoffset_t i = 0; i < root_msg->even_structs()->size();\n       ++i) {\n    TEST_EQ(even_vector[i].var_0(), root_msg->even_structs()->Get(i)->var_0());\n    TEST_EQ(even_vector[i].var_1(), root_msg->even_structs()->Get(i)->var_1());\n  }\n\n  TEST_EQ(root_msg->odd_structs()->size(), even_vector.size());\n  for (flatbuffers::uoffset_t i = 0; i < root_msg->odd_structs()->size(); ++i) {\n    TEST_EQ(odd_vector[i].var_0(), root_msg->odd_structs()->Get(i)->var_0());\n    TEST_EQ(odd_vector[i].var_1(), root_msg->odd_structs()->Get(i)->var_1());\n  }\n}\n\n}  // namespace tests\n}  // namespace flatbuffers\n"
  },
  {
    "path": "tests/alignment_test.fbs",
    "content": "// sizeof(BadAlignmentSmall) == 12\n// alignof(BadAlignmentSmall) == 4\nstruct BadAlignmentSmall {\n  var_0: uint;\n  var_1: uint;\n  var_2: uint;\n}\n\n// sizeof(BadAlignmentLarge) == 8\n// alignof(BadAlignmentLarge) == 8\nstruct BadAlignmentLarge {\n  var_0: ulong;\n}\n\ntable OuterLarge {\n  large: BadAlignmentLarge;\n}\n\ntable BadAlignmentRoot {\n  large: OuterLarge;\n  small: [BadAlignmentSmall];\n}\n\n// sizeof(EvenSmallStruct) == 2\n// alignof(EvenSmallStruct) == 1\nstruct EvenSmallStruct {\n  var_0: uint8;\n  var_1: uint8;\n}\n\n// sizeof(OddSmallStruct) == 3\n// alignof(OddSmallStruct) == 1\nstruct OddSmallStruct {\n  var_0: uint8;\n  var_1: uint8;\n  var_2: uint8;\n}\n\ntable SmallStructs {\n  even_structs: [EvenSmallStruct];\n  odd_structs: [OddSmallStruct];\n}\n\nroot_type SmallStructs;\n"
  },
  {
    "path": "tests/alignment_test.h",
    "content": "#ifndef TESTS_ALIGNMENT_TEST_H\n#define TESTS_ALIGNMENT_TEST_H\n\nnamespace flatbuffers {\nnamespace tests {\n\nvoid AlignmentTest();\n\n}  // namespace tests\n}  // namespace flatbuffers\n\n#endif\n"
  },
  {
    "path": "tests/alignment_test.json",
    "content": "{\n    \"small_structs\": [\n        {\n            \"var_0\": 2,\n            \"var_1\": 1\n        },\n        {\n            \"var_0\": 3,\n            \"var_1\": 1\n        },\n        {\n            \"var_0\": 4,\n            \"var_1\": 1\n        }\n    ]\n}"
  },
  {
    "path": "tests/alignment_test_after_fix.afb",
    "content": "// Annotated Flatbuffer Binary\n//\n// Schema file: alignment_test.fbs\n// Binary file: alignment_test_after_fix.bin\n\nheader:\n  +0x00 | 0C 00 00 00             | UOffset32  | 0x0000000C (12) Loc: 0x0C | offset to root table `SmallStructs`\n\npadding:\n  +0x04 | 00 00                   | uint8_t[2] | ..                        | padding\n\nvtable (SmallStructs):\n  +0x06 | 06 00                   | uint16_t   | 0x0006 (6)                | size of this vtable\n  +0x08 | 08 00                   | uint16_t   | 0x0008 (8)                | size of referring table\n  +0x0A | 04 00                   | VOffset16  | 0x0004 (4)                | offset to field `small_structs` (id: 0)\n\nroot_table (SmallStructs):\n  +0x0C | 06 00 00 00             | SOffset32  | 0x00000006 (6) Loc: 0x06  | offset to vtable\n  +0x10 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x14  | offset to field `small_structs` (vector)\n\nvector (SmallStructs.small_structs):\n  +0x14 | 03 00 00 00             | uint32_t   | 0x00000003 (3)            | length of vector (# items)\n  +0x18 | 02                      | uint8_t    | 0x02 (2)                  | struct field `[0].var_0` of 'JustSmallStruct' (UByte)\n  +0x19 | 01                      | uint8_t    | 0x01 (1)                  | struct field `[0].var_1` of 'JustSmallStruct' (UByte)\n  +0x1A | 03                      | uint8_t    | 0x03 (3)                  | struct field `[1].var_0` of 'JustSmallStruct' (UByte)\n  +0x1B | 01                      | uint8_t    | 0x01 (1)                  | struct field `[1].var_1` of 'JustSmallStruct' (UByte)\n  +0x1C | 04                      | uint8_t    | 0x04 (4)                  | struct field `[2].var_0` of 'JustSmallStruct' (UByte)\n  +0x1D | 01                      | uint8_t    | 0x01 (1)                  | struct field `[2].var_1` of 'JustSmallStruct' (UByte)\n\npadding:\n  +0x1E | 00 00                   | uint8_t[2] | ..                        | padding\n"
  },
  {
    "path": "tests/alignment_test_before_fix.afb",
    "content": "// Annotated Flatbuffer Binary\n//\n// Schema file: alignment_test.fbs\n// Binary file: alignment_test_before_fix.bin\n\nheader:\n  +0x00 | 0C 00 00 00             | UOffset32   | 0x0000000C (12) Loc: 0x0C | offset to root table `SmallStructs`\n\npadding:\n  +0x04 | 00 00                   | uint8_t[2]  | ..                        | padding\n\nvtable (SmallStructs):\n  +0x06 | 06 00                   | uint16_t    | 0x0006 (6)                | size of this vtable\n  +0x08 | 08 00                   | uint16_t    | 0x0008 (8)                | size of referring table\n  +0x0A | 04 00                   | VOffset16   | 0x0004 (4)                | offset to field `small_structs` (id: 0)\n\nroot_table (SmallStructs):\n  +0x0C | 06 00 00 00             | SOffset32   | 0x00000006 (6) Loc: 0x06  | offset to vtable\n  +0x10 | 04 00 00 00             | UOffset32   | 0x00000004 (4) Loc: 0x14  | offset to field `small_structs` (vector)\n\nvector (SmallStructs.small_structs):\n  +0x14 | 03 00 00 00             | uint32_t    | 0x00000003 (3)            | length of vector (# items)\n  +0x18 | 00                      | uint8_t     | 0x00 (0)                  | struct field `[0].var_0` of 'JustSmallStruct' (UByte)\n  +0x19 | 00                      | uint8_t     | 0x00 (0)                  | struct field `[0].var_1` of 'JustSmallStruct' (UByte)\n  +0x1A | 02                      | uint8_t     | 0x02 (2)                  | struct field `[1].var_0` of 'JustSmallStruct' (UByte)\n  +0x1B | 01                      | uint8_t     | 0x01 (1)                  | struct field `[1].var_1` of 'JustSmallStruct' (UByte)\n  +0x1C | 03                      | uint8_t     | 0x03 (3)                  | struct field `[2].var_0` of 'JustSmallStruct' (UByte)\n  +0x1D | 01                      | uint8_t     | 0x01 (1)                  | struct field `[2].var_1` of 'JustSmallStruct' (UByte)\n\nunknown (no known references):\n  +0x1E | 04 01                   | ?uint8_t[2] | ..                        | WARN: could be corrupted padding region.\n"
  },
  {
    "path": "tests/annotated_binary/README.md",
    "content": "# Annotated Flatbuffer Binary\n\nThis directory demonstrates the ability of flatc to annotate binary flatbuffers\nwith helpful annotations. The resulting annotated flatbuffer binary (afb)\ncontains all the binary data with line-by-line annotations.\n\n## Usage\n\nGiven a `schema` in either plain-text (.fbs) or already compiled to a binary\nschema (.bfbs) and `binary` file(s) that was created by the `schema`.\n\n```sh\nflatc --annotate {schema_file} -- {binary_file}...\n```\n\n### Example\n\nThe following command should produce `annotated_binary.afb` in this directory:\n\n```sh\ncd tests\\annotated_binary\n..\\..\\flatc --annotate annotated_binary.fbs -- annotated_binary.bin\n```\n\nThe `annotated_binary.bin` is the flatbufer binary of the data contained within\n `annotated_binary.json`, which was made by the following command:\n\n```sh\n..\\..\\flatc -b annotated_binary.fbs annotated_binary.json\n```\n\n## Text Format\n\nCurrently there is a built-in text-based format for outputting the annotations.\nThe `annotated_binary.afb` is an example of the text format of a binary\n`annotated_binary.bin` and the `annotated_binary.fbs` (or\n`annotated_binary.bfbs`) schema.\n\nThe file is ordered in increasing the offsets from the beginning of the binary.\nThe offset is the 1st column, expressed in hexadecimal format (e.g. `+0x003c`).\n\n### Binary Sections\n\nBinary sections are comprised of contigious [binary regions](#binary-regions)\nthat are logically grouped together. For example, a binary section may be a\nsingle instance of a flatbuffer `Table` or its `vtable`. The sections may be\nlabelled with the name of the associated type, as defined in the input schema.\n\nExample of a `vtable` Binary Section that is associated with the user-defined\n`AnnotateBinary.Bar` table.\n\n```\nvtable (AnnotatedBinary.Bar):\n  +0x00A0 | 08 00                   | uint16_t   | 0x0008 (8)                         | size of this vtable\n  +0x00A2 | 13 00                   | uint16_t   | 0x0013 (19)                        | size of referring table\n  +0x00A4 | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `a` (id: 0)\n  +0x00A6 | 04 00                   | VOffset16  | 0x0004 (4)                         | offset to field `b` (id: 1)\n```\n\n### Binary Regions\n\nBinary regions are contigious bytes regions that are grouped together to form\nsome sort of value, e.g. a `scalar` or an array of scalars. A binary region may\nbe split up over multiple text lines, if the size of the region is large.\n\nLooking at an example binary region:\n\n```\nvtable (AnnotatedBinary.Bar):\n  +0x00A0 | 08 00                   | uint16_t   | 0x0008 (8)                         | size of this vtable\n```\n\nThe first column (`+0x00A0`) is the offset to this region from the beginning of\nthe buffer.\n\nThe second column are the raw bytes (hexadecimal) that make up this\nregion. These are expressed in the little-endian format that flatbuffers uses\nfor the wire format.\n\nThe third column is the type to interpret the bytes as. Some types are special\nto flatbuffer internals (e.g. `SOffet32`, `Offset32`, and `VOffset16`) which are\nused by flatbuffers to point to various offsetes. The other types are specified\nas C++-like types which are the standard fix-width scalars. For the above\nexample, the type is `uint16_t` which is a 16-bit unsigned integer type.\n\nThe fourth column shows the raw bytes as a compacted, big-endian value. The raw\nbytes are duplicated in this fashion since it is more intutive to read the data\nin the big-endian format (e.g., `0x0008`). This value is followed by the decimal\nrepresentation of the value (e.g., `(8)`). (For strings, the raw string value\nis shown instead).\n\nThe fifth column is a textual comment on what the value is. As much metadata as\nknown is provided.\n\n#### Offsets\n\nIf the type in the 3rd column is of an absolute offset (`SOffet32` or\n`Offset32`), the fourth column also shows an `Loc: +0x025A` value which shows\nwhere in the binary this region is pointing to. These values are absolute from\nthe beginning of the file, their calculation from the raw value in the 4th\ncolumn depends on the context.\n"
  },
  {
    "path": "tests/annotated_binary/annotated_binary.afb",
    "content": "// Annotated Flatbuffer Binary\n//\n// Schema file: annotated_binary.fbs\n// Binary file: annotated_binary.bin\n\nheader:\n  +0x0000 | 44 00 00 00             | UOffset32  | 0x00000044 (68) Loc: 0x0044   | offset to root table `AnnotatedBinary.Foo`\n  +0x0004 | 41 4E 4E 4F             | char[4]    | ANNO                          | File Identifier\n\npadding:\n  +0x0008 | 00 00                   | uint8_t[2] | ..                            | padding\n\nvtable (AnnotatedBinary.Foo):\n  +0x000A | 3A 00                   | uint16_t   | 0x003A (58)                   | size of this vtable\n  +0x000C | 68 00                   | uint16_t   | 0x0068 (104)                  | size of referring table\n  +0x000E | 0C 00                   | VOffset16  | 0x000C (12)                   | offset to field `counter` (id: 0)\n  +0x0010 | 07 00                   | VOffset16  | 0x0007 (7)                    | offset to field `healthy` (id: 1)\n  +0x0012 | 00 00                   | VOffset16  | 0x0000 (0)                    | offset to field `level` (id: 2) <defaults to 99> (Long)\n  +0x0014 | 08 00                   | VOffset16  | 0x0008 (8)                    | offset to field `meal` (id: 3)\n  +0x0016 | 10 00                   | VOffset16  | 0x0010 (16)                   | offset to field `bar` (id: 4)\n  +0x0018 | 14 00                   | VOffset16  | 0x0014 (20)                   | offset to field `home` (id: 5)\n  +0x001A | 30 00                   | VOffset16  | 0x0030 (48)                   | offset to field `name` (id: 6)\n  +0x001C | 34 00                   | VOffset16  | 0x0034 (52)                   | offset to field `bars` (id: 7)\n  +0x001E | 09 00                   | VOffset16  | 0x0009 (9)                    | offset to field `bar_baz_type` (id: 8)\n  +0x0020 | 38 00                   | VOffset16  | 0x0038 (56)                   | offset to field `bar_baz` (id: 9)\n  +0x0022 | 3C 00                   | VOffset16  | 0x003C (60)                   | offset to field `accounts` (id: 10)\n  +0x0024 | 40 00                   | VOffset16  | 0x0040 (64)                   | offset to field `bob` (id: 11)\n  +0x0026 | 44 00                   | VOffset16  | 0x0044 (68)                   | offset to field `alice` (id: 12)\n  +0x0028 | 00 00                   | VOffset16  | 0x0000 (0)                    | offset to field `maybe_i32` (id: 13) <defaults to 0> (Int)\n  +0x002A | 00 00                   | VOffset16  | 0x0000 (0)                    | offset to field `default_i32` (id: 14) <defaults to 42> (Int)\n  +0x002C | 48 00                   | VOffset16  | 0x0048 (72)                   | offset to field `just_i32` (id: 15)\n  +0x002E | 4C 00                   | VOffset16  | 0x004C (76)                   | offset to field `names` (id: 16)\n  +0x0030 | 50 00                   | VOffset16  | 0x0050 (80)                   | offset to field `points_of_interest` (id: 17)\n  +0x0032 | 54 00                   | VOffset16  | 0x0054 (84)                   | offset to field `foobars_type` (id: 18)\n  +0x0034 | 58 00                   | VOffset16  | 0x0058 (88)                   | offset to field `foobars` (id: 19)\n  +0x0036 | 0A 00                   | VOffset16  | 0x000A (10)                   | offset to field `measurement_type` (id: 20)\n  +0x0038 | 5C 00                   | VOffset16  | 0x005C (92)                   | offset to field `measurement` (id: 21)\n  +0x003A | 0B 00                   | VOffset16  | 0x000B (11)                   | offset to field `anything_type` (id: 22)\n  +0x003C | 60 00                   | VOffset16  | 0x0060 (96)                   | offset to field `anything` (id: 23)\n  +0x003E | 00 00                   | VOffset16  | 0x0000 (0)                    | offset to field `temperature` (id: 24) <defaults to 98.600000> (Float)\n  +0x0040 | 00 00                   | VOffset16  | 0x0000 (0)                    | offset to field `teetotaler` (id: 25) <null> (Obj)\n  +0x0042 | 64 00                   | VOffset16  | 0x0064 (100)                  | offset to field `charlie` (id: 26)\n\nroot_table (AnnotatedBinary.Foo):\n  +0x0044 | 3A 00 00 00             | SOffset32  | 0x0000003A (58) Loc: 0x000A   | offset to vtable\n  +0x0048 | 00 00 00                | uint8_t[3] | ...                           | padding\n  +0x004B | 01                      | uint8_t    | 0x01 (1)                      | table field `healthy` (Bool)\n  +0x004C | 02                      | uint8_t    | 0x02 (2)                      | table field `meal` (Byte)\n  +0x004D | 02                      | UType8     | 0x02 (2)                      | table field `bar_baz_type` (UType)\n  +0x004E | 01                      | UType8     | 0x01 (1)                      | table field `measurement_type` (UType)\n  +0x004F | 01                      | UType8     | 0x01 (1)                      | table field `anything_type` (UType)\n  +0x0050 | D2 04 00 00             | uint32_t   | 0x000004D2 (1234)             | table field `counter` (Int)\n  +0x0054 | 28 02 00 00             | UOffset32  | 0x00000228 (552) Loc: 0x027C  | offset to field `bar` (table)\n  +0x0058 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                | struct field `home.floors` of 'AnnotatedBinary.Building' (Int)\n  +0x005C | 02 00 00 00             | uint32_t   | 0x00000002 (2)                | struct field `home.doors` of 'AnnotatedBinary.Building' (Int)\n  +0x0060 | 0C 00 00 00             | uint32_t   | 0x0000000C (12)               | struct field `home.windows` of 'AnnotatedBinary.Building' (Int)\n  +0x0064 | 0A 00 00 00             | uint32_t   | 0x0000000A (10)               | array field `home.dimensions.values`[0] of 'AnnotatedBinary.Dimension' (Int)\n  +0x0068 | 0C 00 00 00             | uint32_t   | 0x0000000C (12)               | array field `home.dimensions.values`[1] of 'AnnotatedBinary.Dimension' (Int)\n  +0x006C | 14 00 00 00             | uint32_t   | 0x00000014 (20)               | array field `home.dimensions.values`[2] of 'AnnotatedBinary.Dimension' (Int)\n  +0x0070 | 01                      | uint8_t    | 0x01 (1)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0071 | 02                      | uint8_t    | 0x02 (2)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0072 | 03                      | uint8_t    | 0x03 (3)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0073 | 00                      | uint8_t[1] | .                             | padding\n  +0x0074 | C8 01 00 00             | UOffset32  | 0x000001C8 (456) Loc: 0x023C  | offset to field `name` (string)\n  +0x0078 | 5C 01 00 00             | UOffset32  | 0x0000015C (348) Loc: 0x01D4  | offset to field `bars` (vector)\n  +0x007C | 50 01 00 00             | UOffset32  | 0x00000150 (336) Loc: 0x01CC  | offset to field `bar_baz` (union of type `Baz`)\n  +0x0080 | 34 01 00 00             | UOffset32  | 0x00000134 (308) Loc: 0x01B4  | offset to field `accounts` (vector)\n  +0x0084 | 24 01 00 00             | UOffset32  | 0x00000124 (292) Loc: 0x01A8  | offset to field `bob` (string)\n  +0x0088 | 14 01 00 00             | UOffset32  | 0x00000114 (276) Loc: 0x019C  | offset to field `alice` (string)\n  +0x008C | 0D 00 00 00             | uint32_t   | 0x0000000D (13)               | table field `just_i32` (Int)\n  +0x0090 | DC 00 00 00             | UOffset32  | 0x000000DC (220) Loc: 0x016C  | offset to field `names` (vector)\n  +0x0094 | A0 00 00 00             | UOffset32  | 0x000000A0 (160) Loc: 0x0134  | offset to field `points_of_interest` (vector)\n  +0x0098 | 94 00 00 00             | UOffset32  | 0x00000094 (148) Loc: 0x012C  | offset to field `foobars_type` (vector)\n  +0x009C | 38 00 00 00             | UOffset32  | 0x00000038 (56) Loc: 0x00D4   | offset to field `foobars` (vector)\n  +0x00A0 | 33 00 00 00             | UOffset32  | 0x00000033 (51) Loc: 0x00D3   | offset to field `measurement` (union of type `Tolerance`)\n  +0x00A4 | 1C 00 00 00             | UOffset32  | 0x0000001C (28) Loc: 0x00C0   | offset to field `anything` (union of type `Bar`)\n  +0x00A8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x00AC    | offset to field `charlie` (string)\n\nstring (AnnotatedBinary.Foo.charlie):\n  +0x00AC | 05 00 00 00             | uint32_t   | 0x00000005 (5)                | length of string\n  +0x00B0 | 61 6C 69 63 65          | char[5]    | alice                         | string literal\n  +0x00B5 | 00                      | char       | 0x00 (0)                      | string terminator\n\npadding:\n  +0x00B6 | 00 00                   | uint8_t[2] | ..                            | padding\n\nvtable (AnnotatedBinary.Bar):\n  +0x00B8 | 08 00                   | uint16_t   | 0x0008 (8)                    | size of this vtable\n  +0x00BA | 13 00                   | uint16_t   | 0x0013 (19)                   | size of referring table\n  +0x00BC | 08 00                   | VOffset16  | 0x0008 (8)                    | offset to field `a` (id: 0)\n  +0x00BE | 04 00                   | VOffset16  | 0x0004 (4)                    | offset to field `b` (id: 1)\n\ntable (AnnotatedBinary.Bar):\n  +0x00C0 | 08 00 00 00             | SOffset32  | 0x00000008 (8) Loc: 0x00B8    | offset to vtable\n  +0x00C4 | 00 80 23 44             | float      | 0x44238000 (654)              | table field `b` (Float)\n  +0x00C8 | 00 00 00 00 00 10 74 40 | double     | 0x4074100000000000 (321)      | table field `a` (Double)\n  +0x00D0 | 00 00 00                | uint8_t[3] | ...                           | padding\n\nunion (AnnotatedBinary.Tolerance.measurement):\n  +0x00D3 | 05                      | uint8_t    | 0x05 (5)                      | struct field `measurement.width` of 'AnnotatedBinary.Tolerance' (UByte)\n\nvector (AnnotatedBinary.Foo.foobars):\n  +0x00D4 | 03 00 00 00             | uint32_t   | 0x00000003 (3)                | length of vector (# items)\n  +0x00D8 | 34 00 00 00             | UOffset32  | 0x00000034 (52) Loc: 0x010C   | offset to union[0] (`Bar`)\n  +0x00DC | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x0108   | offset to union[1] (`Baz`)\n  +0x00E0 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x00E4    | offset to union[2] (`Bar`)\n\ntable (AnnotatedBinary.Bar):\n  +0x00E4 | D2 FE FF FF             | SOffset32  | 0xFFFFFED2 (-302) Loc: 0x0212 | offset to vtable\n  +0x00E8 | 00 80 23 44             | float      | 0x44238000 (654)              | table field `b` (Float)\n  +0x00EC | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x00FC   | offset to field `c` (table)\n  +0x00F0 | 00 00 00 00 00 D8 8E 40 | double     | 0x408ED80000000000 (987)      | table field `a` (Double)\n  +0x00F8 | 00 00 00 00             | uint8_t[4] | ....                          | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x00FC | 6A FE FF FF             | SOffset32  | 0xFFFFFE6A (-406) Loc: 0x0292 | offset to vtable\n  +0x0100 | 00 00 00                | uint8_t[3] | ...                           | padding\n  +0x0103 | 03                      | uint8_t    | 0x03 (3)                      | table field `meal` (Byte)\n\nvtable (AnnotatedBinary.Baz):\n  +0x0104 | 04 00                   | uint16_t   | 0x0004 (4)                    | size of this vtable\n  +0x0106 | 04 00                   | uint16_t   | 0x0004 (4)                    | size of referring table\n\ntable (AnnotatedBinary.Baz):\n  +0x0108 | 04 00 00 00             | SOffset32  | 0x00000004 (4) Loc: 0x0104    | offset to vtable\n\ntable (AnnotatedBinary.Bar):\n  +0x010C | FA FE FF FF             | SOffset32  | 0xFFFFFEFA (-262) Loc: 0x0212 | offset to vtable\n  +0x0110 | 00 00 E4 43             | float      | 0x43E40000 (456)              | table field `b` (Float)\n  +0x0114 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x0124   | offset to field `c` (table)\n  +0x0118 | 00 00 00 00 00 C0 5E 40 | double     | 0x405EC00000000000 (123)      | table field `a` (Double)\n  +0x0120 | 00 00 00 00             | uint8_t[4] | ....                          | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x0124 | 92 FE FF FF             | SOffset32  | 0xFFFFFE92 (-366) Loc: 0x0292 | offset to vtable\n  +0x0128 | 00 00 00                | uint8_t[3] | ...                           | padding\n  +0x012B | 01                      | uint8_t    | 0x01 (1)                      | table field `meal` (Byte)\n\nvector (AnnotatedBinary.Foo.foobars_type):\n  +0x012C | 03 00 00 00             | uint32_t   | 0x00000003 (3)                | length of vector (# items)\n  +0x0130 | 01                      | UType8     | 0x01 (1)                      | value[0]\n  +0x0131 | 02                      | UType8     | 0x02 (2)                      | value[1]\n  +0x0132 | 01                      | UType8     | 0x01 (1)                      | value[2]\n\nvector (AnnotatedBinary.Foo.points_of_interest):\n  +0x0134 | 03 00 00 00             | uint32_t   | 0x00000003 (3)                | length of vector (# items)\n  +0x0138 | 33 33 33 33 33 A3 45 40 | double     | 0x4045A33333333333 (43.275)   | struct field `[0].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0140 | 7E 57 04 FF 5B 87 53 C0 | double     | 0xC053875BFF04577E (-78.115)  | struct field `[0].longitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0148 | 8D F0 F6 20 04 B6 42 40 | double     | 0x4042B60420F6F08D (37.422)   | struct field `[1].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0150 | 9F 77 63 41 61 85 5E C0 | double     | 0xC05E85614163779F (-122.084) | struct field `[1].longitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0158 | 8F 35 23 83 DC 35 4B C0 | double     | 0xC04B35DC8323358F (-54.4208) | struct field `[2].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0160 | F6 97 DD 93 87 C5 0A 40 | double     | 0x400AC58793DD97F6 (3.34645)  | struct field `[2].longitude` of 'AnnotatedBinary.Location' (Double)\n\npadding:\n  +0x0168 | 00 00 00 00             | uint8_t[4] | ....                          | padding\n\nvector (AnnotatedBinary.Foo.names):\n  +0x016C | 03 00 00 00             | uint32_t   | 0x00000003 (3)                | length of vector (# items)\n  +0x0170 | 20 00 00 00             | UOffset32  | 0x00000020 (32) Loc: 0x0190   | offset to string[0]\n  +0x0174 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x0188   | offset to string[1]\n  +0x0178 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x017C    | offset to string[2]\n\nstring (AnnotatedBinary.Foo.names):\n  +0x017C | 07 00 00 00             | uint32_t   | 0x00000007 (7)                | length of string\n  +0x0180 | 63 68 61 72 6C 69 65    | char[7]    | charlie                       | string literal\n  +0x0187 | 00                      | char       | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.names):\n  +0x0188 | 03 00 00 00             | uint32_t   | 0x00000003 (3)                | length of string\n  +0x018C | 62 6F 62                | char[3]    | bob                           | string literal\n  +0x018F | 00                      | char       | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.names):\n  +0x0190 | 05 00 00 00             | uint32_t   | 0x00000005 (5)                | length of string\n  +0x0194 | 61 6C 69 63 65          | char[5]    | alice                         | string literal\n  +0x0199 | 00                      | char       | 0x00 (0)                      | string terminator\n\npadding:\n  +0x019A | 00 00                   | uint8_t[2] | ..                            | padding\n\nstring (AnnotatedBinary.Foo.alice):\n  +0x019C | 07 00 00 00             | uint32_t   | 0x00000007 (7)                | length of string\n  +0x01A0 | 63 68 61 72 6C 69 65    | char[7]    | charlie                       | string literal\n  +0x01A7 | 00                      | char       | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.bob):\n  +0x01A8 | 07 00 00 00             | uint32_t   | 0x00000007 (7)                | length of string\n  +0x01AC | 63 68 61 72 6C 69 65    | char[7]    | charlie                       | string literal\n  +0x01B3 | 00                      | char       | 0x00 (0)                      | string terminator\n\nvector (AnnotatedBinary.Foo.accounts):\n  +0x01B4 | 09 00 00 00             | uint32_t   | 0x00000009 (9)                | length of vector (# items)\n  +0x01B8 | 09 00                   | uint16_t   | 0x0009 (9)                    | value[0]\n  +0x01BA | 08 00                   | uint16_t   | 0x0008 (8)                    | value[1]\n  +0x01BC | 07 00                   | uint16_t   | 0x0007 (7)                    | value[2]\n  +0x01BE | 01 00                   | uint16_t   | 0x0001 (1)                    | value[3]\n  +0x01C0 | 02 00                   | uint16_t   | 0x0002 (2)                    | value[4]\n  +0x01C2 | 03 00                   | uint16_t   | 0x0003 (3)                    | value[5]\n  +0x01C4 | 06 00                   | uint16_t   | 0x0006 (6)                    | value[6]\n  +0x01C6 | 05 00                   | uint16_t   | 0x0005 (5)                    | value[7]\n  +0x01C8 | 04 00                   | uint16_t   | 0x0004 (4)                    | value[8]\n\npadding:\n  +0x01CA | 00 00                   | uint8_t[2] | ..                            | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x01CC | 3A FF FF FF             | SOffset32  | 0xFFFFFF3A (-198) Loc: 0x0292 | offset to vtable\n  +0x01D0 | 00 00 00                | uint8_t[3] | ...                           | padding\n  +0x01D3 | 03                      | uint8_t    | 0x03 (3)                      | table field `meal` (Byte)\n\nvector (AnnotatedBinary.Foo.bars):\n  +0x01D4 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                | length of vector (# items)\n  +0x01D8 | 44 00 00 00             | UOffset32  | 0x00000044 (68) Loc: 0x021C   | offset to table[0]\n  +0x01DC | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x01EC   | offset to table[1]\n\npadding:\n  +0x01E0 | 00 00                   | uint8_t[2] | ..                            | padding\n\nvtable (AnnotatedBinary.Bar):\n  +0x01E2 | 0A 00                   | uint16_t   | 0x000A (10)                   | size of this vtable\n  +0x01E4 | 1A 00                   | uint16_t   | 0x001A (26)                   | size of referring table\n  +0x01E6 | 0C 00                   | VOffset16  | 0x000C (12)                   | offset to field `a` (id: 0)\n  +0x01E8 | 04 00                   | VOffset16  | 0x0004 (4)                    | offset to field `b` (id: 1)\n  +0x01EA | 08 00                   | VOffset16  | 0x0008 (8)                    | offset to field `c` (id: 2)\n\ntable (AnnotatedBinary.Bar):\n  +0x01EC | 0A 00 00 00             | SOffset32  | 0x0000000A (10) Loc: 0x01E2   | offset to vtable\n  +0x01F0 | 00 80 23 44             | float      | 0x44238000 (654)              | table field `b` (Float)\n  +0x01F4 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x020C   | offset to field `c` (table)\n  +0x01F8 | 00 00 00 00 00 D8 8E 40 | double     | 0x408ED80000000000 (987)      | table field `a` (Double)\n  +0x0200 | 00 00 00 00 00 00       | uint8_t[6] | ......                        | padding\n\nvtable (AnnotatedBinary.Baz):\n  +0x0206 | 06 00                   | uint16_t   | 0x0006 (6)                    | size of this vtable\n  +0x0208 | 06 00                   | uint16_t   | 0x0006 (6)                    | size of referring table\n  +0x020A | 05 00                   | VOffset16  | 0x0005 (5)                    | offset to field `meal` (id: 0)\n\ntable (AnnotatedBinary.Baz):\n  +0x020C | 06 00 00 00             | SOffset32  | 0x00000006 (6) Loc: 0x0206    | offset to vtable\n  +0x0210 | 00                      | uint8_t[1] | .                             | padding\n  +0x0211 | 03                      | uint8_t    | 0x03 (3)                      | table field `meal` (Byte)\n\nvtable (AnnotatedBinary.Bar):\n  +0x0212 | 0A 00                   | uint16_t   | 0x000A (10)                   | size of this vtable\n  +0x0214 | 18 00                   | uint16_t   | 0x0018 (24)                   | size of referring table\n  +0x0216 | 0C 00                   | VOffset16  | 0x000C (12)                   | offset to field `a` (id: 0)\n  +0x0218 | 04 00                   | VOffset16  | 0x0004 (4)                    | offset to field `b` (id: 1)\n  +0x021A | 08 00                   | VOffset16  | 0x0008 (8)                    | offset to field `c` (id: 2)\n\ntable (AnnotatedBinary.Bar):\n  +0x021C | 0A 00 00 00             | SOffset32  | 0x0000000A (10) Loc: 0x0212   | offset to vtable\n  +0x0220 | 00 00 E4 43             | float      | 0x43E40000 (456)              | table field `b` (Float)\n  +0x0224 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x0234   | offset to field `c` (table)\n  +0x0228 | 00 00 00 00 00 C0 5E 40 | double     | 0x405EC00000000000 (123)      | table field `a` (Double)\n  +0x0230 | 00 00 00 00             | uint8_t[4] | ....                          | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x0234 | A2 FF FF FF             | SOffset32  | 0xFFFFFFA2 (-94) Loc: 0x0292  | offset to vtable\n  +0x0238 | 00 00 00                | uint8_t[3] | ...                           | padding\n  +0x023B | 01                      | uint8_t    | 0x01 (1)                      | table field `meal` (Byte)\n\nstring (AnnotatedBinary.Foo.name):\n  +0x023C | 2F 00 00 00             | uint32_t   | 0x0000002F (47)               | length of string\n  +0x0240 | 54 68 69 73 20 69 73 20 | char[47]   | This is                       | string literal\n  +0x0248 | 61 20 6C 6F 6E 67 20 73 |            | a long s\n  +0x0250 | 74 72 69 6E 67 20 74 6F |            | tring to\n  +0x0258 | 20 73 68 6F 77 20 68 6F |            |  show ho\n  +0x0260 | 77 20 69 74 20 62 72 65 |            | w it bre\n  +0x0268 | 61 6B 73 20 75 70 2E    |            | aks up.\n  +0x026F | 00                      | char       | 0x00 (0)                      | string terminator\n\npadding:\n  +0x0270 | 00 00                   | uint8_t[2] | ..                            | padding\n\nvtable (AnnotatedBinary.Bar):\n  +0x0272 | 0A 00                   | uint16_t   | 0x000A (10)                   | size of this vtable\n  +0x0274 | 16 00                   | uint16_t   | 0x0016 (22)                   | size of referring table\n  +0x0276 | 0C 00                   | VOffset16  | 0x000C (12)                   | offset to field `a` (id: 0)\n  +0x0278 | 04 00                   | VOffset16  | 0x0004 (4)                    | offset to field `b` (id: 1)\n  +0x027A | 08 00                   | VOffset16  | 0x0008 (8)                    | offset to field `c` (id: 2)\n\ntable (AnnotatedBinary.Bar):\n  +0x027C | 0A 00 00 00             | SOffset32  | 0x0000000A (10) Loc: 0x0272   | offset to vtable\n  +0x0280 | 65 20 71 49             | float      | 0x49712065 (987654)           | table field `b` (Float)\n  +0x0284 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x0298   | offset to field `c` (table)\n  +0x0288 | C9 76 BE 9F 0C 24 FE 40 | double     | 0x40FE240C9FBE76C9 (123457)   | table field `a` (Double)\n  +0x0290 | 00 00                   | uint8_t[2] | ..                            | padding\n\nvtable (AnnotatedBinary.Baz):\n  +0x0292 | 06 00                   | uint16_t   | 0x0006 (6)                    | size of this vtable\n  +0x0294 | 08 00                   | uint16_t   | 0x0008 (8)                    | size of referring table\n  +0x0296 | 07 00                   | VOffset16  | 0x0007 (7)                    | offset to field `meal` (id: 0)\n\ntable (AnnotatedBinary.Baz):\n  +0x0298 | 06 00 00 00             | SOffset32  | 0x00000006 (6) Loc: 0x0292    | offset to vtable\n  +0x029C | 00 00 00                | uint8_t[3] | ...                           | padding\n  +0x029F | 01                      | uint8_t    | 0x01 (1)                      | table field `meal` (Byte)\n"
  },
  {
    "path": "tests/annotated_binary/annotated_binary.fbs",
    "content": "namespace AnnotatedBinary;\n\nenum Food : byte {\n  None = 0,\n  Apple = 1,\n  Banana = 2,\n  Kiwi = 3,\n}\n\ntable Baz {\n  meal:Food = Banana;\n}\n\ntable Bar {\n  a:double = 3.14;\n  b:float = 1.68;\n  c:Baz;\n}\n\nunion BarBaz {\n  Bar, Baz\n}\n\nunion Measurement {\n  Tolerance, Dimension\n}\n\nstruct Tolerance {\n  width:uint8;\n}\n\nunion Any {\n  Bar, Tolerance\n}\n\nstruct Dimension {\n  values:[int:3];\n  tolerances:[Tolerance:3];\n}\n\nstruct Building {\n  floors:int;\n  doors:int;\n  windows:int;\n  dimensions:Dimension;\n}\n\nstruct Location {\n  latitude:double;\n  longitude:double;\n}\n\ntable Foo {\n  counter:int;\n  healthy:bool;\n  level:long = 99;\n  meal:Food = Apple;\n  bar:Bar;\n  home:Building;\n  name:string;\n  // Vector of tables\n  bars:[Bar];\n  // Union of tables\n  bar_baz:BarBaz;\n  // Vector of Scalars\n  accounts:[uint16];\n  bob:string;\n  alice:string;\n  // Optional Scalars\n  maybe_i32: int32 = null;\n  default_i32: int32 = 42;\n  just_i32: int32;\n  // Vector of strings\n  names:[string];\n  // Vector of structs\n  points_of_interest:[Location];\n  // Vector of unions\n  foobars:[BarBaz];\n  // Union of structs\n  measurement:Measurement;\n  // Union of struct/table\n  anything:Any;\n  // Default floating point\n  temperature:float=98.6;\n  // Not present object\n  teetotaler:Bar;\n  charlie:string;\n}\n\nfile_identifier \"ANNO\";\n\nroot_type Foo;"
  },
  {
    "path": "tests/annotated_binary/annotated_binary.json",
    "content": "{\n    \"counter\": 1234,\n    \"healthy\": true,\n    \"meal\": \"Banana\",\n    \"bar\": {\n        \"a\": 123456.789,\n        \"b\": 987654.321,\n        \"c\": {\n            \"meal\": \"Apple\"\n        }\n    },\n    \"home\": {\n        \"floors\": 1,\n        \"doors\": 2,\n        \"windows\": 12,\n        \"dimensions\": {\n            \"values\": [\n                10,\n                12,\n                20\n            ],\n            \"tolerances\": [\n                {\n                    \"width\": 1\n                },\n                {\n                    \"width\": 2\n                },\n                {\n                    \"width\": 3\n                }\n            ]\n        }\n    },\n    \"name\": \"This is a long string to show how it breaks up.\",\n    \"bars\": [\n        {\n            \"a\": 123,\n            \"b\": 456,\n            \"c\": {\n                \"meal\": \"Apple\"\n            }\n        },\n        {\n            \"a\": 987,\n            \"b\": 654,\n            \"c\": {\n                \"meal\": \"Kiwi\"\n            }\n        }\n    ],\n    \"bar_baz_type\": \"Baz\",\n    \"bar_baz\": {\n        \"meal\": \"Kiwi\"\n    },\n    \"accounts\": [\n        9,\n        8,\n        7,\n        1,\n        2,\n        3,\n        6,\n        5,\n        4,\n    ],\n    // Use the same string to show shared string support\n    \"bob\": \"charlie\",\n    \"alice\": \"charlie\",\n    \"just_i32\": 13,\n    \"names\": [\n        \"alice\",\n        \"bob\",\n        \"charlie\"\n    ],\n    \"points_of_interest\": [\n        {\n            \"latitude\": 43.275,\n            \"longitude\": -78.114990\n        },\n        {\n            \"latitude\": 37.422001,\n            \"longitude\": -122.084061\n        },\n        {\n            \"latitude\": -54.420792,\n            \"longitude\": 3.346450\n        }\n    ],\n    \"foobars_type\": [\n        \"Bar\",\n        \"Baz\",\n        \"Bar\"\n    ],\n    \"foobars\" : [\n        {\n            \"a\": 123,\n            \"b\": 456,\n            \"c\": {\n                \"meal\": \"Apple\"\n            }            \n        },\n        {\n        \"meal\": \"Banana\"\n        },\n        {\n            \"a\": 987,\n            \"b\": 654,\n            \"c\": {\n                \"meal\": \"Kiwi\"\n            }\n        }\n    ],\n    \"measurement_type\": \"Tolerance\",\n    \"measurement\": {\n        \"width\": 5\n    },\n    \"anything_type\": \"Bar\",\n    \"anything\":  {\n        \"a\": 321,\n        \"b\": 654\n    },\n    \"charlie\": \"alice\"\n}"
  },
  {
    "path": "tests/annotated_binary/annotated_binary_old.afb",
    "content": "// Annotated Flatbuffer Binary\n//\n// Schema file: annotated_binary_old.fbs\n// Binary file: annotated_binary.bin\n\nheader:\n  +0x0000 | 44 00 00 00             | UOffset32    | 0x00000044 (68) Loc: +0x0044       | offset to root table `AnnotatedBinary.Foo`\n  +0x0004 | 41 4E 4E 4F             | char[4]      | ANNO                               | File Identifier\n\npadding:\n  +0x0008 | 00 00                   | uint8_t[2]   | ..                                 | padding\n\nvtable (AnnotatedBinary.Foo):\n  +0x000A | 3A 00                   | uint16_t     | 0x003A (58)                        | size of this vtable\n  +0x000C | 68 00                   | uint16_t     | 0x0068 (104)                       | size of referring table\n  +0x000E | 0C 00                   | VOffset16    | 0x000C (12)                        | offset to field `counter` (id: 0)\n  +0x0010 | 07 00                   | VOffset16    | 0x0007 (7)                         | offset to field `healthy` (id: 1)\n  +0x0012 | 00 00                   | VOffset16    | 0x0000 (0)                         | offset to field `level` (id: 2) <defaults to 99> (Long)\n  +0x0014 | 08 00                   | VOffset16    | 0x0008 (8)                         | offset to field `meal` (id: 3)\n  +0x0016 | 10 00                   | VOffset16    | 0x0010 (16)                        | offset to field `bar` (id: 4)\n  +0x0018 | 14 00                   | VOffset16    | 0x0014 (20)                        | offset to field `home` (id: 5)\n  +0x001A | 30 00                   | VOffset16    | 0x0030 (48)                        | offset to field `name` (id: 6)\n  +0x001C | 34 00                   | VOffset16    | 0x0034 (52)                        | offset to field `bars` (id: 7)\n  +0x001E | 09 00                   | VOffset16    | 0x0009 (9)                         | offset to field `bar_baz_type` (id: 8)\n  +0x0020 | 38 00                   | VOffset16    | 0x0038 (56)                        | offset to field `bar_baz` (id: 9)\n  +0x0022 | 3C 00                   | VOffset16    | 0x003C (60)                        | offset to field `accounts` (id: 10)\n  +0x0024 | 40 00                   | VOffset16    | 0x0040 (64)                        | offset to field `bob` (id: 11)\n  +0x0026 | 44 00                   | VOffset16    | 0x0044 (68)                        | offset to field `alice` (id: 12)\n  +0x0028 | 00 00                   | VOffset16    | 0x0000 (0)                         | offset to field `maybe_i32` (id: 13) <defaults to 0> (Int)\n  +0x002A | 00 00                   | VOffset16    | 0x0000 (0)                         | offset to field `default_i32` (id: 14) <defaults to 42> (Int)\n  +0x002C | 48 00                   | VOffset16    | 0x0048 (72)                        | offset to field `just_i32` (id: 15)\n  +0x002E | 4C 00                   | VOffset16    | 0x004C (76)                        | offset to field `names` (id: 16)\n  +0x0030 | 50 00                   | VOffset16    | 0x0050 (80)                        | offset to field `points_of_interest` (id: 17)\n  +0x0032 | 54 00                   | VOffset16    | 0x0054 (84)                        | offset to field `foobars_type` (id: 18)\n  +0x0034 | 58 00                   | VOffset16    | 0x0058 (88)                        | offset to field `foobars` (id: 19)\n  +0x0036 | 0A 00                   | VOffset16    | 0x000A (10)                        | offset to field `measurement_type` (id: 20)\n  +0x0038 | 5C 00                   | VOffset16    | 0x005C (92)                        | offset to field `measurement` (id: 21)\n  +0x003A | 0B 00                   | VOffset16    | 0x000B (11)                        | offset to field `anything_type` (id: 22)\n  +0x003C | 60 00                   | VOffset16    | 0x0060 (96)                        | offset to field `anything` (id: 23)\n  +0x003E | 00 00                   | VOffset16    | 0x0000 (0)                         | offset to field `temperature` (id: 24) <defaults to 98.600000> (Float)\n  +0x0040 | 00 00                   | VOffset16    | 0x0000 (0)                         | offset to field `teetotaler` (id: 25) <null> (Obj)\n  +0x0042 | 64 00                   | VOffset16    | 0x0064 (100)                       | offset to unknown field (id: 26)\n\nroot_table (AnnotatedBinary.Foo):\n  +0x0044 | 3A 00 00 00             | SOffset32    | 0x0000003A (58) Loc: +0x000A       | offset to vtable\n  +0x0048 | 00 00 00                | uint8_t[3]   | ...                                | padding\n  +0x004B | 01                      | uint8_t      | 0x01 (1)                           | table field `healthy` (Bool)\n  +0x004C | 02                      | uint8_t      | 0x02 (2)                           | table field `meal` (Byte)\n  +0x004D | 02                      | uint8_t      | 0x02 (2)                           | table field `bar_baz_type` (UType)\n  +0x004E | 01                      | uint8_t      | 0x01 (1)                           | table field `measurement_type` (UType)\n  +0x004F | 01                      | uint8_t      | 0x01 (1)                           | table field `anything_type` (UType)\n  +0x0050 | D2 04 00 00             | uint32_t     | 0x000004D2 (1234)                  | table field `counter` (Int)\n  +0x0054 | 28 02 00 00             | UOffset32    | 0x00000228 (552) Loc: +0x027C      | offset to field `bar`\n  +0x0058 | 01 00 00 00             | uint32_t     | 0x00000001 (1)                     | struct field `AnnotatedBinary.Building.floors` (Int)\n  +0x005C | 02 00 00 00             | uint32_t     | 0x00000002 (2)                     | struct field `AnnotatedBinary.Building.doors` (Int)\n  +0x0060 | 0C 00 00 00             | uint32_t     | 0x0000000C (12)                    | struct field `AnnotatedBinary.Building.windows` (Int)\n  +0x0064 | 0A 00 00 00             | uint32_t     | 0x0000000A (10)                    | array field `AnnotatedBinary.Dimension.values[0]` (Int)\n  +0x0068 | 0C 00 00 00             | uint32_t     | 0x0000000C (12)                    | array field `AnnotatedBinary.Dimension.values[1]` (Int)\n  +0x006C | 14 00 00 00             | uint32_t     | 0x00000014 (20)                    | array field `AnnotatedBinary.Dimension.values[2]` (Int)\n  +0x0070 | 01                      | uint8_t      | 0x01 (1)                           | struct field `AnnotatedBinary.Tolerance.width` (UByte)\n  +0x0071 | 02                      | uint8_t      | 0x02 (2)                           | struct field `AnnotatedBinary.Tolerance.width` (UByte)\n  +0x0072 | 03                      | uint8_t      | 0x03 (3)                           | struct field `AnnotatedBinary.Tolerance.width` (UByte)\n  +0x0073 | 00                      | uint8_t[1]   | .                                  | padding\n  +0x0074 | C8 01 00 00             | UOffset32    | 0x000001C8 (456) Loc: +0x023C      | offset to field `name`\n  +0x0078 | 5C 01 00 00             | UOffset32    | 0x0000015C (348) Loc: +0x01D4      | offset to field `bars`\n  +0x007C | 50 01 00 00             | UOffset32    | 0x00000150 (336) Loc: +0x01CC      | offset to field `bar_baz` (union of type `Baz`)\n  +0x0080 | 34 01 00 00             | UOffset32    | 0x00000134 (308) Loc: +0x01B4      | offset to field `accounts`\n  +0x0084 | 24 01 00 00             | UOffset32    | 0x00000124 (292) Loc: +0x01A8      | offset to field `bob`\n  +0x0088 | 14 01 00 00             | UOffset32    | 0x00000114 (276) Loc: +0x019C      | offset to field `alice`\n  +0x008C | 0D 00 00 00             | uint32_t     | 0x0000000D (13)                    | table field `just_i32` (Int)\n  +0x0090 | DC 00 00 00             | UOffset32    | 0x000000DC (220) Loc: +0x016C      | offset to field `names`\n  +0x0094 | A0 00 00 00             | UOffset32    | 0x000000A0 (160) Loc: +0x0134      | offset to field `points_of_interest`\n  +0x0098 | 94 00 00 00             | UOffset32    | 0x00000094 (148) Loc: +0x012C      | offset to field `foobars_type`\n  +0x009C | 38 00 00 00             | UOffset32    | 0x00000038 (56) Loc: +0x00D4       | offset to field `foobars`\n  +0x00A0 | 33 00 00 00             | UOffset32    | 0x00000033 (51) Loc: +0x00D3       | offset to field `measurement` (union of type `Tolerance`)\n  +0x00A4 | 1C 00 00 00             | UOffset32    | 0x0000001C (28) Loc: +0x00C0       | offset to field `anything` (union of type `Bar`)\n  +0x00A8 | 04 00 00 00             | ?uint8_t[4]  | ....                               | Unknown field <possibly an offset? Check Loc: +0x000000AC>\n\nunknown (no known references):\n  +0x00AC | 05 00 00 00 61 6C 69 63 | ?uint8_t[12] | ....alic                           | WARN: nothing refers to this. Check if any `Unkown Field`s point to this.\n  +0x00B4 | 65 00 00 00             |              | e...\n\nvtable (AnnotatedBinary.Bar):\n  +0x00B8 | 08 00                   | uint16_t     | 0x0008 (8)                         | size of this vtable\n  +0x00BA | 13 00                   | uint16_t     | 0x0013 (19)                        | size of referring table\n  +0x00BC | 08 00                   | VOffset16    | 0x0008 (8)                         | offset to field `a` (id: 0)\n  +0x00BE | 04 00                   | VOffset16    | 0x0004 (4)                         | offset to field `b` (id: 1)\n\ntable (AnnotatedBinary.Bar):\n  +0x00C0 | 08 00 00 00             | SOffset32    | 0x00000008 (8) Loc: +0x00B8        | offset to vtable\n  +0x00C4 | 00 80 23 44             | float        | 0x44238000 (654.000000)            | table field `b` (Float)\n  +0x00C8 | 00 00 00 00 00 10 74 40 | double       | 0x4074100000000000 (321.000000)    | table field `a` (Double)\n  +0x00D0 | 00 00 00                | uint8_t[3]   | ...                                | padding\n\nunion (AnnotatedBinary.Tolerance.measurement):\n  +0x00D3 | 05                      | uint8_t      | 0x05 (5)                           | struct field `AnnotatedBinary.Tolerance.width` (UByte)\n\nvector (AnnotatedBinary.Foo.foobars):\n  +0x00D4 | 03 00 00 00             | uint32_t     | 0x00000003 (3)                     | length of vector (# items)\n  +0x00D8 | 34 00 00 00             | UOffset32    | 0x00000034 (52) Loc: +0x010C       | offset to union[0] (`Bar`)\n  +0x00DC | 2C 00 00 00             | UOffset32    | 0x0000002C (44) Loc: +0x0108       | offset to union[1] (`Baz`)\n  +0x00E0 | 04 00 00 00             | UOffset32    | 0x00000004 (4) Loc: +0x00E4        | offset to union[2] (`Bar`)\n\ntable (AnnotatedBinary.Bar):\n  +0x00E4 | D2 FE FF FF             | SOffset32    | 0xFFFFFED2 (-302) Loc: +0x0212     | offset to vtable\n  +0x00E8 | 00 80 23 44             | float        | 0x44238000 (654.000000)            | table field `b` (Float)\n  +0x00EC | 10 00 00 00             | UOffset32    | 0x00000010 (16) Loc: +0x00FC       | offset to field `c`\n  +0x00F0 | 00 00 00 00 00 D8 8E 40 | double       | 0x408ED80000000000 (987.000000)    | table field `a` (Double)\n  +0x00F8 | 00 00 00 00             | uint8_t[4]   | ....                               | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x00FC | 6A FE FF FF             | SOffset32    | 0xFFFFFE6A (-406) Loc: +0x0292     | offset to vtable\n  +0x0100 | 00 00 00                | uint8_t[3]   | ...                                | padding\n  +0x0103 | 03                      | uint8_t      | 0x03 (3)                           | table field `meal` (Byte)\n\nvtable (AnnotatedBinary.Baz):\n  +0x0104 | 04 00                   | uint16_t     | 0x0004 (4)                         | size of this vtable\n  +0x0106 | 04 00                   | uint16_t     | 0x0004 (4)                         | size of referring table\n\ntable (AnnotatedBinary.Baz):\n  +0x0108 | 04 00 00 00             | SOffset32    | 0x00000004 (4) Loc: +0x0104        | offset to vtable\n\ntable (AnnotatedBinary.Bar):\n  +0x010C | FA FE FF FF             | SOffset32    | 0xFFFFFEFA (-262) Loc: +0x0212     | offset to vtable\n  +0x0110 | 00 00 E4 43             | float        | 0x43E40000 (456.000000)            | table field `b` (Float)\n  +0x0114 | 10 00 00 00             | UOffset32    | 0x00000010 (16) Loc: +0x0124       | offset to field `c`\n  +0x0118 | 00 00 00 00 00 C0 5E 40 | double       | 0x405EC00000000000 (123.000000)    | table field `a` (Double)\n  +0x0120 | 00 00 00 00             | uint8_t[4]   | ....                               | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x0124 | 92 FE FF FF             | SOffset32    | 0xFFFFFE92 (-366) Loc: +0x0292     | offset to vtable\n  +0x0128 | 00 00 00                | uint8_t[3]   | ...                                | padding\n  +0x012B | 01                      | uint8_t      | 0x01 (1)                           | table field `meal` (Byte)\n\nvector (AnnotatedBinary.Foo.foobars_type):\n  +0x012C | 03 00 00 00             | uint32_t     | 0x00000003 (3)                     | length of vector (# items)\n  +0x0130 | 01                      | uint8_t      | 0x01 (1)                           | value[0]\n  +0x0131 | 02                      | uint8_t      | 0x02 (2)                           | value[1]\n  +0x0132 | 01                      | uint8_t      | 0x01 (1)                           | value[2]\n\nvector (AnnotatedBinary.Foo.points_of_interest):\n  +0x0134 | 03 00 00 00             | uint32_t     | 0x00000003 (3)                     | length of vector (# items)\n  +0x0138 | 33 33 33 33 33 A3 45 40 | double       | 0x4045A33333333333 (43.275000)     | struct field `AnnotatedBinary.Location.latitude` (Double)\n  +0x0140 | 7E 57 04 FF 5B 87 53 C0 | double       | 0xC053875BFF04577E (-78.114990)    | struct field `AnnotatedBinary.Location.longitude` (Double)\n  +0x0148 | 8D F0 F6 20 04 B6 42 40 | double       | 0x4042B60420F6F08D (37.422001)     | struct field `AnnotatedBinary.Location.latitude` (Double)\n  +0x0150 | 9F 77 63 41 61 85 5E C0 | double       | 0xC05E85614163779F (-122.084061)   | struct field `AnnotatedBinary.Location.longitude` (Double)\n  +0x0158 | 8F 35 23 83 DC 35 4B C0 | double       | 0xC04B35DC8323358F (-54.420792)    | struct field `AnnotatedBinary.Location.latitude` (Double)\n  +0x0160 | F6 97 DD 93 87 C5 0A 40 | double       | 0x400AC58793DD97F6 (3.346450)      | struct field `AnnotatedBinary.Location.longitude` (Double)\n\npadding:\n  +0x0168 | 00 00 00 00             | uint8_t[4]   | ....                               | padding\n\nvector (AnnotatedBinary.Foo.names):\n  +0x016C | 03 00 00 00             | uint32_t     | 0x00000003 (3)                     | length of vector (# items)\n  +0x0170 | 20 00 00 00             | UOffset32    | 0x00000020 (32) Loc: +0x0190       | offset to string[0]\n  +0x0174 | 14 00 00 00             | UOffset32    | 0x00000014 (20) Loc: +0x0188       | offset to string[1]\n  +0x0178 | 04 00 00 00             | UOffset32    | 0x00000004 (4) Loc: +0x017C        | offset to string[2]\n\nstring (AnnotatedBinary.Foo.names):\n  +0x017C | 07 00 00 00             | uint32_t     | 0x00000007 (7)                     | length of string\n  +0x0180 | 63 68 61 72 6C 69 65    | char[7]      | charlie                            \n  +0x0187 | 00                      | char         | 0x00 (0)                           | string terminator\n\nstring (AnnotatedBinary.Foo.names):\n  +0x0188 | 03 00 00 00             | uint32_t     | 0x00000003 (3)                     | length of string\n  +0x018C | 62 6F 62                | char[3]      | bob                                \n  +0x018F | 00                      | char         | 0x00 (0)                           | string terminator\n\nstring (AnnotatedBinary.Foo.names):\n  +0x0190 | 05 00 00 00             | uint32_t     | 0x00000005 (5)                     | length of string\n  +0x0194 | 61 6C 69 63 65          | char[5]      | alice                              \n  +0x0199 | 00                      | char         | 0x00 (0)                           | string terminator\n\npadding:\n  +0x019A | 00 00                   | uint8_t[2]   | ..                                 | padding\n\nstring (AnnotatedBinary.Foo.alice):\n  +0x019C | 07 00 00 00             | uint32_t     | 0x00000007 (7)                     | length of string\n  +0x01A0 | 63 68 61 72 6C 69 65    | char[7]      | charlie                            \n  +0x01A7 | 00                      | char         | 0x00 (0)                           | string terminator\n\nstring (AnnotatedBinary.Foo.bob):\n  +0x01A8 | 07 00 00 00             | uint32_t     | 0x00000007 (7)                     | length of string\n  +0x01AC | 63 68 61 72 6C 69 65    | char[7]      | charlie                            \n  +0x01B3 | 00                      | char         | 0x00 (0)                           | string terminator\n\nvector (AnnotatedBinary.Foo.accounts):\n  +0x01B4 | 09 00 00 00             | uint32_t     | 0x00000009 (9)                     | length of vector (# items)\n  +0x01B8 | 09 00                   | uint16_t     | 0x0009 (9)                         | value[0]\n  +0x01BA | 08 00                   | uint16_t     | 0x0008 (8)                         | value[1]\n  +0x01BC | 07 00                   | uint16_t     | 0x0007 (7)                         | value[2]\n  +0x01BE | 01 00                   | uint16_t     | 0x0001 (1)                         | value[3]\n  +0x01C0 | 02 00                   | uint16_t     | 0x0002 (2)                         | value[4]\n  +0x01C2 | 03 00                   | uint16_t     | 0x0003 (3)                         | value[5]\n  +0x01C4 | 06 00                   | uint16_t     | 0x0006 (6)                         | value[6]\n  +0x01C6 | 05 00                   | uint16_t     | 0x0005 (5)                         | value[7]\n  +0x01C8 | 04 00                   | uint16_t     | 0x0004 (4)                         | value[8]\n\npadding:\n  +0x01CA | 00 00                   | uint8_t[2]   | ..                                 | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x01CC | 3A FF FF FF             | SOffset32    | 0xFFFFFF3A (-198) Loc: +0x0292     | offset to vtable\n  +0x01D0 | 00 00 00                | uint8_t[3]   | ...                                | padding\n  +0x01D3 | 03                      | uint8_t      | 0x03 (3)                           | table field `meal` (Byte)\n\nvector (AnnotatedBinary.Foo.bars):\n  +0x01D4 | 02 00 00 00             | uint32_t     | 0x00000002 (2)                     | length of vector (# items)\n  +0x01D8 | 44 00 00 00             | UOffset32    | 0x00000044 (68) Loc: +0x021C       | offset to table[0]\n  +0x01DC | 10 00 00 00             | UOffset32    | 0x00000010 (16) Loc: +0x01EC       | offset to table[1]\n\npadding:\n  +0x01E0 | 00 00                   | uint8_t[2]   | ..                                 | padding\n\nvtable (AnnotatedBinary.Bar):\n  +0x01E2 | 0A 00                   | uint16_t     | 0x000A (10)                        | size of this vtable\n  +0x01E4 | 1A 00                   | uint16_t     | 0x001A (26)                        | size of referring table\n  +0x01E6 | 0C 00                   | VOffset16    | 0x000C (12)                        | offset to field `a` (id: 0)\n  +0x01E8 | 04 00                   | VOffset16    | 0x0004 (4)                         | offset to field `b` (id: 1)\n  +0x01EA | 08 00                   | VOffset16    | 0x0008 (8)                         | offset to field `c` (id: 2)\n\ntable (AnnotatedBinary.Bar):\n  +0x01EC | 0A 00 00 00             | SOffset32    | 0x0000000A (10) Loc: +0x01E2       | offset to vtable\n  +0x01F0 | 00 80 23 44             | float        | 0x44238000 (654.000000)            | table field `b` (Float)\n  +0x01F4 | 18 00 00 00             | UOffset32    | 0x00000018 (24) Loc: +0x020C       | offset to field `c`\n  +0x01F8 | 00 00 00 00 00 D8 8E 40 | double       | 0x408ED80000000000 (987.000000)    | table field `a` (Double)\n  +0x0200 | 00 00 00 00 00 00       | uint8_t[6]   | ......                             | padding\n\nvtable (AnnotatedBinary.Baz):\n  +0x0206 | 06 00                   | uint16_t     | 0x0006 (6)                         | size of this vtable\n  +0x0208 | 06 00                   | uint16_t     | 0x0006 (6)                         | size of referring table\n  +0x020A | 05 00                   | VOffset16    | 0x0005 (5)                         | offset to field `meal` (id: 0)\n\ntable (AnnotatedBinary.Baz):\n  +0x020C | 06 00 00 00             | SOffset32    | 0x00000006 (6) Loc: +0x0206        | offset to vtable\n  +0x0210 | 00                      | uint8_t[1]   | .                                  | padding\n  +0x0211 | 03                      | uint8_t      | 0x03 (3)                           | table field `meal` (Byte)\n\nvtable (AnnotatedBinary.Bar):\n  +0x0212 | 0A 00                   | uint16_t     | 0x000A (10)                        | size of this vtable\n  +0x0214 | 18 00                   | uint16_t     | 0x0018 (24)                        | size of referring table\n  +0x0216 | 0C 00                   | VOffset16    | 0x000C (12)                        | offset to field `a` (id: 0)\n  +0x0218 | 04 00                   | VOffset16    | 0x0004 (4)                         | offset to field `b` (id: 1)\n  +0x021A | 08 00                   | VOffset16    | 0x0008 (8)                         | offset to field `c` (id: 2)\n\ntable (AnnotatedBinary.Bar):\n  +0x021C | 0A 00 00 00             | SOffset32    | 0x0000000A (10) Loc: +0x0212       | offset to vtable\n  +0x0220 | 00 00 E4 43             | float        | 0x43E40000 (456.000000)            | table field `b` (Float)\n  +0x0224 | 10 00 00 00             | UOffset32    | 0x00000010 (16) Loc: +0x0234       | offset to field `c`\n  +0x0228 | 00 00 00 00 00 C0 5E 40 | double       | 0x405EC00000000000 (123.000000)    | table field `a` (Double)\n  +0x0230 | 00 00 00 00             | uint8_t[4]   | ....                               | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x0234 | A2 FF FF FF             | SOffset32    | 0xFFFFFFA2 (-94) Loc: +0x0292      | offset to vtable\n  +0x0238 | 00 00 00                | uint8_t[3]   | ...                                | padding\n  +0x023B | 01                      | uint8_t      | 0x01 (1)                           | table field `meal` (Byte)\n\nstring (AnnotatedBinary.Foo.name):\n  +0x023C | 2F 00 00 00             | uint32_t     | 0x0000002F (47)                    | length of string\n  +0x0240 | 54 68 69 73 20 69 73 20 | char[47]     | This is                            \n  +0x0248 | 61 20 6C 6F 6E 67 20 73 |              | a long s\n  +0x0250 | 74 72 69 6E 67 20 74 6F |              | tring to\n  +0x0258 | 20 73 68 6F 77 20 68 6F |              |  show ho\n  +0x0260 | 77 20 69 74 20 62 72 65 |              | w it bre\n  +0x0268 | 61 6B 73 20 75 70 2E    |              | aks up.\n  +0x026F | 00                      | char         | 0x00 (0)                           | string terminator\n\npadding:\n  +0x0270 | 00 00                   | uint8_t[2]   | ..                                 | padding\n\nvtable (AnnotatedBinary.Bar):\n  +0x0272 | 0A 00                   | uint16_t     | 0x000A (10)                        | size of this vtable\n  +0x0274 | 16 00                   | uint16_t     | 0x0016 (22)                        | size of referring table\n  +0x0276 | 0C 00                   | VOffset16    | 0x000C (12)                        | offset to field `a` (id: 0)\n  +0x0278 | 04 00                   | VOffset16    | 0x0004 (4)                         | offset to field `b` (id: 1)\n  +0x027A | 08 00                   | VOffset16    | 0x0008 (8)                         | offset to field `c` (id: 2)\n\ntable (AnnotatedBinary.Bar):\n  +0x027C | 0A 00 00 00             | SOffset32    | 0x0000000A (10) Loc: +0x0272       | offset to vtable\n  +0x0280 | 65 20 71 49             | float        | 0x49712065 (987654.312500)         | table field `b` (Float)\n  +0x0284 | 14 00 00 00             | UOffset32    | 0x00000014 (20) Loc: +0x0298       | offset to field `c`\n  +0x0288 | C9 76 BE 9F 0C 24 FE 40 | double       | 0x40FE240C9FBE76C9 (123456.789000) | table field `a` (Double)\n  +0x0290 | 00 00                   | uint8_t[2]   | ..                                 | padding\n\nvtable (AnnotatedBinary.Baz):\n  +0x0292 | 06 00                   | uint16_t     | 0x0006 (6)                         | size of this vtable\n  +0x0294 | 08 00                   | uint16_t     | 0x0008 (8)                         | size of referring table\n  +0x0296 | 07 00                   | VOffset16    | 0x0007 (7)                         | offset to field `meal` (id: 0)\n\ntable (AnnotatedBinary.Baz):\n  +0x0298 | 06 00 00 00             | SOffset32    | 0x00000006 (6) Loc: +0x0292        | offset to vtable\n  +0x029C | 00 00 00                | uint8_t[3]   | ...                                | padding\n  +0x029F | 01                      | uint8_t      | 0x01 (1)                           | table field `meal` (Byte)\n"
  },
  {
    "path": "tests/annotated_binary/annotated_binary_old.fbs",
    "content": "namespace AnnotatedBinary;\n\nenum Food : byte {\n  None = 0,\n  Apple = 1,\n  Banana = 2,\n  Kiwi = 3,\n}\n\ntable Baz {\n  meal:Food = Banana;\n}\n\ntable Bar {\n  a:double = 3.14;\n  b:float = 1.68;\n  c:Baz;\n}\n\nunion BarBaz {\n  Bar, Baz\n}\n\nunion Measurement {\n  Tolerance, Dimension\n}\n\nstruct Tolerance {\n  width:uint8;\n}\n\nunion Any {\n  Bar, Tolerance\n}\n\nstruct Dimension {\n  values:[int:3];\n  tolerances:[Tolerance:3];\n}\n\nstruct Building {\n  floors:int;\n  doors:int;\n  windows:int;\n  dimensions:Dimension;\n}\n\nstruct Location {\n  latitude:double;\n  longitude:double;\n}\n\ntable Foo {\n  counter:int;\n  healthy:bool;\n  level:long = 99;\n  meal:Food = Apple;\n  bar:Bar;\n  home:Building;\n  name:string;\n  // Vector of tables\n  bars:[Bar];\n  // Union of tables\n  bar_baz:BarBaz;\n  // Vector of Scalars\n  accounts:[uint16];\n  bob:string;\n  alice:string;\n  // Optional Scalars\n  maybe_i32: int32 = null;\n  default_i32: int32 = 42;\n  just_i32: int32;\n  // Vector of strings\n  names:[string];\n  // Vector of structs\n  points_of_interest:[Location];\n  // Vector of unions\n  foobars:[BarBaz];\n  // Union of structs\n  measurement:Measurement;\n  // Union of struct/table\n  anything:Any;\n  // Default floating point\n  temperature:float=98.6;\n  // Not present object\n  teetotaler:Bar;\n\n  // NOTE THIS IS A PURPOSELY OLD VERSION OF annotated_binary.fbs TO TEST \n  // PROCESSING OF NEWER BINARIES THAN THE SCHEMA. DO NOT ADD TO THIS.\n}\n\nfile_identifier \"ANNO\";\n\nroot_type Foo;"
  },
  {
    "path": "tests/annotated_binary/generate_annotations.py",
    "content": "#!/usr/bin/env python3\n#\n# Copyright 2021 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nfrom pathlib import Path\nimport platform\nimport subprocess\n\n# Get the path where this script is located so we can invoke the script from\n# any directory and have the paths work correctly.\nscript_path = Path(__file__).parent.resolve()\n\n# Get the root path as an absolute path, so all derived paths are absolute.\nroot_path = script_path.parent.parent.absolute()\n\n# Get the location of the flatc executable, reading from the first command line\n# argument or defaulting to default names.\nflatc_exe = Path(\n    (\"flatc\" if not platform.system() == \"Windows\" else \"flatc.exe\")\n)\n\n# Find and assert flatc compiler is present.\nif root_path in flatc_exe.parents:\n  flatc_exe = flatc_exe.relative_to(root_path)\nflatc_path = Path(root_path, flatc_exe)\nassert flatc_path.exists(), \"Cannot find the flatc compiler \" + str(flatc_path)\n\n# Specify the other paths that will be referenced\ntests_path = Path(script_path, \"tests\")\n\n\ndef flatc_annotate(schema, file, cwd=script_path):\n  cmd = [str(flatc_path), \"--annotate\", schema, file]\n  result = subprocess.run(cmd, cwd=str(cwd), check=True)\n\n\ntest_files = [\n    \"annotated_binary.bin\",\n    \"tests/invalid_root_offset.bin\",\n    \"tests/invalid_root_table_too_short.bin\",\n    \"tests/invalid_root_table_vtable_offset.bin\",\n    \"tests/invalid_string_length.bin\",\n    \"tests/invalid_string_length_cut_short.bin\",\n    \"tests/invalid_struct_array_field_cut_short.bin\",\n    \"tests/invalid_struct_field_cut_short.bin\",\n    \"tests/invalid_table_field_size.bin\",\n    \"tests/invalid_table_field_offset.bin\",\n    \"tests/invalid_union_type_value.bin\",\n    \"tests/invalid_vector_length_cut_short.bin\",\n    \"tests/invalid_vector_scalars_cut_short.bin\",\n    \"tests/invalid_vector_strings_cut_short.bin\",\n    \"tests/invalid_vector_structs_cut_short.bin\",\n    \"tests/invalid_vector_tables_cut_short.bin\",\n    \"tests/invalid_vector_unions_cut_short.bin\",\n    \"tests/invalid_vector_union_type_value.bin\",\n    \"tests/invalid_vtable_ref_table_size_short.bin\",\n    \"tests/invalid_vtable_ref_table_size.bin\",\n    \"tests/invalid_vtable_size_short.bin\",\n    \"tests/invalid_vtable_size.bin\",\n    \"tests/invalid_vtable_field_offset.bin\",\n]\n\nfor test_file in test_files:\n  flatc_annotate(\"annotated_binary.fbs\", test_file)\n"
  },
  {
    "path": "tests/annotated_binary/tests/README.md",
    "content": "# Tests for Annotated Binaries\n\n## Invalid Binary Tests\n\nThe following is a collection of manually corrupted binaries based off of\n`..\\annotated_binary.bin`. Each file changes some offset or length/size entry to\npoint so an invalid spot, and the generated annotated binaries demonstrate that\nthose corruptions can be spotted.\n\nEach of these files were ran with the following command:\n\n```sh\ncd .tests/annotated_binary\n../../flatc -annotate annotated_binary.fbs tests/{binary_file}...\n```\n\n### `invalid_root_offset.bin`\n\nChanged first two bytes from `4400` to `FFFF` which produces an offset larger\nthan the binary.\n\n### `invalid_root_table_vtable_offset.bin`\n\nChanged two bytes at 0x0044 from `3A00` to `FFFF` which points to an offset\noutside the binary.\n\n### `invalid_root_table_too_short.bin`\n\nTruncated the file to 0x46 bytes, as that cuts into the vtable offset field of\nthe root table.\n\n```sh\ntruncate annotated_binary.bin --size=70 >> invalid_root_table_too_short.bin\n```\n\n### `invalid_vtable_size.bin`\n\nChanged two bytes at 0x000A from `3A00` to `FFFF` which size is larger than the\nbinary.\n\n### `invalid_vtable_size_short.bin`\n\nChanged two bytes at 0x000A from `3A00` to `0100` which size is smaller than the\nminimum size of 4 bytes.\n\n### `invalid_vtable_ref_table_size.bin`\n\nChanged two bytes at 0x000C from `6800` to `FFFF` which size is larger than the\nbinary.\n\n### `invalid_vtable_ref_table_size_short.bin`\n\nChanged two bytes at 0x000C from `6800` to `0100` which size is smaller than\nthe minimum size of 4 bytes.\n\n### `invalid_vtable_field_offset.bin`\n\nChanged two bytes at 0x0016 from `1000` to `FFFF` which points to a field larger\nthan the binary.\n\n### `invalid_table_field_size.bin`\n\nTruncated the file to 0x52 bytes, as that cuts a Uint32t value in half.\n\n### `invalid_table_field_offset.bin`\n\nTruncated the file to 0x96 bytes, as that cuts a UOffset32 value in half. Also,\nchanged two bytes at 0x90 from `DC00` to `FFFF` which points to a section larger\nthan the binary.\n\n### `invalid_string_length_cut_short.bin`\n\nTruncated the file to 0xAD bytes, as that cuts string length Uint32t value in\nhalf.\n\n### `invalid_string_length.bin`\n\nChanged two bytes at 0x00AC from `0500` to `FFFF` which is a string length\nlarger than the binary.\n\n### `invalid_vector_length_cut_short.bin`\n\nTruncated the file to 0x0136 bytes, as that cuts vector length Uint32t value in\nhalf.\n\n### `invalid_struct_field_cut_short.bin`\n\nTruncated the file to 0x5d bytes, as that cuts struct field value in half.\n\n### `invalid_struct_array_field_cut_short.bin`\n\nTruncated the file to 0x6A bytes, as that cuts struct array field value in half.\n\n### `invalid_vector_structs_cut_short.bin`\n\nTruncated the file to 0x0154 bytes, as that cuts into a vector of structs.\n\n### `invalid_vector_tables_cut_short.bin`\n\nTruncated the file to 0x01DE bytes, as that cuts into a vector of table offsets.\n\n### `invalid_vector_strings_cut_short.bin`\n\nTruncated the file to 0x0176 bytes, as that cuts into a vector of string\noffsets.\n\n### `invalid_vector_scalars_cut_short.bin`\n\nTruncated the file to 0x01C1 bytes, as that cuts into a vector of scalars\nvalues.\n\n### `invalid_vector_unions_cut_short.bin`\n\nTruncated the file to 0x01DE bytes, as that cuts into a vector of union offset\nvalues.\n\n### `invalid_union_type_value.bin`\n\nChanged one byte at 0x004D from `02` to `FF` which is a union type value that is\nlarger than the enum.\n\n### `invalid_vector_union_type_value.bin`\n\nChanged one byte at 0x0131 from `02` to `FF` which is a vector union type value\nthat is larger than the enum.\n"
  },
  {
    "path": "tests/annotated_binary/tests/invalid_root_offset.afb",
    "content": "// Annotated Flatbuffer Binary\n//\n// Schema file: annotated_binary.fbs\n// Binary file: tests/invalid_root_offset.bin\n\nheader:\n  +0x0000 | FF FF 00 00             | UOffset32     | 0x0000FFFF (65535) Loc: 0xFFFF | ERROR: offset to root table `AnnotatedBinary.Foo`. Invalid offset, points outside the binary.\n  +0x0004 | 41 4E 4E 4F             | char[4]       | ANNO                           | File Identifier\n\nunknown (no known references):\n  +0x0008 | 00 00 3A 00 68 00 0C 00 | ?uint8_t[664] | ..:.h...                       | WARN: nothing refers to this section.\n  +0x0010 | 07 00 00 00 08 00 10 00 |               | ........\n  +0x0018 | 14 00 30 00 34 00 09 00 |               | ..0.4...\n  +0x0020 | 38 00 3C 00 40 00 44 00 |               | 8.<.@.D.\n  +0x0028 | 00 00 00 00 48 00 4C 00 |               | ....H.L.\n  +0x0030 | 50 00 54 00 58 00 0A 00 |               | P.T.X...\n  +0x0038 | 5C 00 0B 00 60 00 00 00 |               | \\...`...\n  +0x0040 | 00 00 64 00 3A 00 00 00 |               | ..d.:...\n  +0x0048 | 00 00 00 01 02 02 01 01 |               | ........\n  +0x0050 | D2 04 00 00 28 02 00 00 |               | ....(...\n  +0x0058 | 01 00 00 00 02 00 00 00 |               | ........\n  +0x0060 | 0C 00 00 00 0A 00 00 00 |               | ........\n  +0x0068 | 0C 00 00 00 14 00 00 00 |               | ........\n  +0x0070 | 01 02 03 00 C8 01 00 00 |               | ........\n  +0x0078 | 5C 01 00 00 50 01 00 00 |               | \\...P...\n  +0x0080 | 34 01 00 00 24 01 00 00 |               | 4...$...\n  +0x0088 | 14 01 00 00 0D 00 00 00 |               | ........\n  +0x0090 | DC 00 00 00 A0 00 00 00 |               | ........\n  +0x0098 | 94 00 00 00 38 00 00 00 |               | ....8...\n  +0x00A0 | 33 00 00 00 1C 00 00 00 |               | 3.......\n  +0x00A8 | 04 00 00 00 05 00 00 00 |               | ........\n  +0x00B0 | 61 6C 69 63 65 00 00 00 |               | alice...\n  +0x00B8 | 08 00 13 00 08 00 04 00 |               | ........\n  +0x00C0 | 08 00 00 00 00 80 23 44 |               | ......#D\n  +0x00C8 | 00 00 00 00 00 10 74 40 |               | ......t@\n  +0x00D0 | 00 00 00 05 03 00 00 00 |               | ........\n  +0x00D8 | 34 00 00 00 2C 00 00 00 |               | 4...,...\n  +0x00E0 | 04 00 00 00 D2 FE FF FF |               | ........\n  +0x00E8 | 00 80 23 44 10 00 00 00 |               | ..#D....\n  +0x00F0 | 00 00 00 00 00 D8 8E 40 |               | .......@\n  +0x00F8 | 00 00 00 00 6A FE FF FF |               | ....j...\n  +0x0100 | 00 00 00 03 04 00 04 00 |               | ........\n  +0x0108 | 04 00 00 00 FA FE FF FF |               | ........\n  +0x0110 | 00 00 E4 43 10 00 00 00 |               | ...C....\n  +0x0118 | 00 00 00 00 00 C0 5E 40 |               | ......^@\n  +0x0120 | 00 00 00 00 92 FE FF FF |               | ........\n  +0x0128 | 00 00 00 01 03 00 00 00 |               | ........\n  +0x0130 | 01 02 01 00 03 00 00 00 |               | ........\n  +0x0138 | 33 33 33 33 33 A3 45 40 |               | 33333.E@\n  +0x0140 | 7E 57 04 FF 5B 87 53 C0 |               | ~W..[.S.\n  +0x0148 | 8D F0 F6 20 04 B6 42 40 |               | ... ..B@\n  +0x0150 | 9F 77 63 41 61 85 5E C0 |               | .wcAa.^.\n  +0x0158 | 8F 35 23 83 DC 35 4B C0 |               | .5#..5K.\n  +0x0160 | F6 97 DD 93 87 C5 0A 40 |               | .......@\n  +0x0168 | 00 00 00 00 03 00 00 00 |               | ........\n  +0x0170 | 20 00 00 00 14 00 00 00 |               |  .......\n  +0x0178 | 04 00 00 00 07 00 00 00 |               | ........\n  +0x0180 | 63 68 61 72 6C 69 65 00 |               | charlie.\n  +0x0188 | 03 00 00 00 62 6F 62 00 |               | ....bob.\n  +0x0190 | 05 00 00 00 61 6C 69 63 |               | ....alic\n  +0x0198 | 65 00 00 00 07 00 00 00 |               | e.......\n  +0x01A0 | 63 68 61 72 6C 69 65 00 |               | charlie.\n  +0x01A8 | 07 00 00 00 63 68 61 72 |               | ....char\n  +0x01B0 | 6C 69 65 00 09 00 00 00 |               | lie.....\n  +0x01B8 | 09 00 08 00 07 00 01 00 |               | ........\n  +0x01C0 | 02 00 03 00 06 00 05 00 |               | ........\n  +0x01C8 | 04 00 00 00 3A FF FF FF |               | ....:...\n  +0x01D0 | 00 00 00 03 02 00 00 00 |               | ........\n  +0x01D8 | 44 00 00 00 10 00 00 00 |               | D.......\n  +0x01E0 | 00 00 0A 00 1A 00 0C 00 |               | ........\n  +0x01E8 | 04 00 08 00 0A 00 00 00 |               | ........\n  +0x01F0 | 00 80 23 44 18 00 00 00 |               | ..#D....\n  +0x01F8 | 00 00 00 00 00 D8 8E 40 |               | .......@\n  +0x0200 | 00 00 00 00 00 00 06 00 |               | ........\n  +0x0208 | 06 00 05 00 06 00 00 00 |               | ........\n  +0x0210 | 00 03 0A 00 18 00 0C 00 |               | ........\n  +0x0218 | 04 00 08 00 0A 00 00 00 |               | ........\n  +0x0220 | 00 00 E4 43 10 00 00 00 |               | ...C....\n  +0x0228 | 00 00 00 00 00 C0 5E 40 |               | ......^@\n  +0x0230 | 00 00 00 00 A2 FF FF FF |               | ........\n  +0x0238 | 00 00 00 01 2F 00 00 00 |               | ..../...\n  +0x0240 | 54 68 69 73 20 69 73 20 |               | This is \n  +0x0248 | 61 20 6C 6F 6E 67 20 73 |               | a long s\n  +0x0250 | 74 72 69 6E 67 20 74 6F |               | tring to\n  +0x0258 | 20 73 68 6F 77 20 68 6F |               |  show ho\n  +0x0260 | 77 20 69 74 20 62 72 65 |               | w it bre\n  +0x0268 | 61 6B 73 20 75 70 2E 00 |               | aks up..\n  +0x0270 | 00 00 0A 00 16 00 0C 00 |               | ........\n  +0x0278 | 04 00 08 00 0A 00 00 00 |               | ........\n  +0x0280 | 65 20 71 49 14 00 00 00 |               | e qI....\n  +0x0288 | C9 76 BE 9F 0C 24 FE 40 |               | .v...$.@\n  +0x0290 | 00 00 06 00 08 00 07 00 |               | ........\n  +0x0298 | 06 00 00 00 00 00 00 01 |               | ........\n"
  },
  {
    "path": "tests/annotated_binary/tests/invalid_root_table_too_short.afb",
    "content": "// Annotated Flatbuffer Binary\n//\n// Schema file: annotated_binary.fbs\n// Binary file: tests/invalid_root_table_too_short.bin\n\nheader:\n  +0x00 | 44 00 00 00             | UOffset32    | 0x00000044 (68) Loc: 0x44 | offset to root table `AnnotatedBinary.Foo`\n  +0x04 | 41 4E 4E 4F             | char[4]      | ANNO                      | File Identifier\n\nunknown (no known references):\n  +0x08 | 00 00 3A 00 68 00 0C 00 | ?uint8_t[60] | ..:.h...                  | WARN: nothing refers to this section.\n  +0x10 | 07 00 00 00 08 00 10 00 |              | ........\n  +0x18 | 14 00 30 00 34 00 09 00 |              | ..0.4...\n  +0x20 | 38 00 3C 00 40 00 44 00 |              | 8.<.@.D.\n  +0x28 | 00 00 00 00 48 00 4C 00 |              | ....H.L.\n  +0x30 | 50 00 54 00 58 00 0A 00 |              | P.T.X...\n  +0x38 | 5C 00 0B 00 60 00 00 00 |              | \\...`...\n  +0x40 | 00 00 64 00             |              | ..d.\n\nroot_table (AnnotatedBinary.Foo):\n  +0x44 | 3A 00                   | ?uint8_t[2]  | :.                        | ERROR: offset to vtable. Incomplete binary, expected to read 4 bytes.\n"
  },
  {
    "path": "tests/annotated_binary/tests/invalid_root_table_vtable_offset.afb",
    "content": "// Annotated Flatbuffer Binary\n//\n// Schema file: annotated_binary.fbs\n// Binary file: tests/invalid_root_table_vtable_offset.bin\n\nheader:\n  +0x0000 | 44 00 00 00             | UOffset32     | 0x00000044 (68) Loc: 0x0044                | offset to root table `AnnotatedBinary.Foo`\n  +0x0004 | 41 4E 4E 4F             | char[4]       | ANNO                                       | File Identifier\n\nunknown (no known references):\n  +0x0008 | 00 00 3A 00 68 00 0C 00 | ?uint8_t[60]  | ..:.h...                                   | WARN: nothing refers to this section.\n  +0x0010 | 07 00 00 00 08 00 10 00 |               | ........\n  +0x0018 | 14 00 30 00 34 00 09 00 |               | ..0.4...\n  +0x0020 | 38 00 3C 00 40 00 44 00 |               | 8.<.@.D.\n  +0x0028 | 00 00 00 00 48 00 4C 00 |               | ....H.L.\n  +0x0030 | 50 00 54 00 58 00 0A 00 |               | P.T.X...\n  +0x0038 | 5C 00 0B 00 60 00 00 00 |               | \\...`...\n  +0x0040 | 00 00 64 00             |               | ..d.\n\nroot_table (AnnotatedBinary.Foo):\n  +0x0044 | FF FF 00 00             | SOffset32     | 0x0000FFFF (65535) Loc: 0xFFFFFFFFFFFF0045 | ERROR: offset to vtable. Invalid offset, points outside the binary.\n\nunknown (no known references):\n  +0x0048 | 00 00 00 01 02 02 01 01 | ?uint8_t[600] | ........                                   | WARN: nothing refers to this section.\n  +0x0050 | D2 04 00 00 28 02 00 00 |               | ....(...\n  +0x0058 | 01 00 00 00 02 00 00 00 |               | ........\n  +0x0060 | 0C 00 00 00 0A 00 00 00 |               | ........\n  +0x0068 | 0C 00 00 00 14 00 00 00 |               | ........\n  +0x0070 | 01 02 03 00 C8 01 00 00 |               | ........\n  +0x0078 | 5C 01 00 00 50 01 00 00 |               | \\...P...\n  +0x0080 | 34 01 00 00 24 01 00 00 |               | 4...$...\n  +0x0088 | 14 01 00 00 0D 00 00 00 |               | ........\n  +0x0090 | DC 00 00 00 A0 00 00 00 |               | ........\n  +0x0098 | 94 00 00 00 38 00 00 00 |               | ....8...\n  +0x00A0 | 33 00 00 00 1C 00 00 00 |               | 3.......\n  +0x00A8 | 04 00 00 00 05 00 00 00 |               | ........\n  +0x00B0 | 61 6C 69 63 65 00 00 00 |               | alice...\n  +0x00B8 | 08 00 13 00 08 00 04 00 |               | ........\n  +0x00C0 | 08 00 00 00 00 80 23 44 |               | ......#D\n  +0x00C8 | 00 00 00 00 00 10 74 40 |               | ......t@\n  +0x00D0 | 00 00 00 05 03 00 00 00 |               | ........\n  +0x00D8 | 34 00 00 00 2C 00 00 00 |               | 4...,...\n  +0x00E0 | 04 00 00 00 D2 FE FF FF |               | ........\n  +0x00E8 | 00 80 23 44 10 00 00 00 |               | ..#D....\n  +0x00F0 | 00 00 00 00 00 D8 8E 40 |               | .......@\n  +0x00F8 | 00 00 00 00 6A FE FF FF |               | ....j...\n  +0x0100 | 00 00 00 03 04 00 04 00 |               | ........\n  +0x0108 | 04 00 00 00 FA FE FF FF |               | ........\n  +0x0110 | 00 00 E4 43 10 00 00 00 |               | ...C....\n  +0x0118 | 00 00 00 00 00 C0 5E 40 |               | ......^@\n  +0x0120 | 00 00 00 00 92 FE FF FF |               | ........\n  +0x0128 | 00 00 00 01 03 00 00 00 |               | ........\n  +0x0130 | 01 02 01 00 03 00 00 00 |               | ........\n  +0x0138 | 33 33 33 33 33 A3 45 40 |               | 33333.E@\n  +0x0140 | 7E 57 04 FF 5B 87 53 C0 |               | ~W..[.S.\n  +0x0148 | 8D F0 F6 20 04 B6 42 40 |               | ... ..B@\n  +0x0150 | 9F 77 63 41 61 85 5E C0 |               | .wcAa.^.\n  +0x0158 | 8F 35 23 83 DC 35 4B C0 |               | .5#..5K.\n  +0x0160 | F6 97 DD 93 87 C5 0A 40 |               | .......@\n  +0x0168 | 00 00 00 00 03 00 00 00 |               | ........\n  +0x0170 | 20 00 00 00 14 00 00 00 |               |  .......\n  +0x0178 | 04 00 00 00 07 00 00 00 |               | ........\n  +0x0180 | 63 68 61 72 6C 69 65 00 |               | charlie.\n  +0x0188 | 03 00 00 00 62 6F 62 00 |               | ....bob.\n  +0x0190 | 05 00 00 00 61 6C 69 63 |               | ....alic\n  +0x0198 | 65 00 00 00 07 00 00 00 |               | e.......\n  +0x01A0 | 63 68 61 72 6C 69 65 00 |               | charlie.\n  +0x01A8 | 07 00 00 00 63 68 61 72 |               | ....char\n  +0x01B0 | 6C 69 65 00 09 00 00 00 |               | lie.....\n  +0x01B8 | 09 00 08 00 07 00 01 00 |               | ........\n  +0x01C0 | 02 00 03 00 06 00 05 00 |               | ........\n  +0x01C8 | 04 00 00 00 3A FF FF FF |               | ....:...\n  +0x01D0 | 00 00 00 03 02 00 00 00 |               | ........\n  +0x01D8 | 44 00 00 00 10 00 00 00 |               | D.......\n  +0x01E0 | 00 00 0A 00 1A 00 0C 00 |               | ........\n  +0x01E8 | 04 00 08 00 0A 00 00 00 |               | ........\n  +0x01F0 | 00 80 23 44 18 00 00 00 |               | ..#D....\n  +0x01F8 | 00 00 00 00 00 D8 8E 40 |               | .......@\n  +0x0200 | 00 00 00 00 00 00 06 00 |               | ........\n  +0x0208 | 06 00 05 00 06 00 00 00 |               | ........\n  +0x0210 | 00 03 0A 00 18 00 0C 00 |               | ........\n  +0x0218 | 04 00 08 00 0A 00 00 00 |               | ........\n  +0x0220 | 00 00 E4 43 10 00 00 00 |               | ...C....\n  +0x0228 | 00 00 00 00 00 C0 5E 40 |               | ......^@\n  +0x0230 | 00 00 00 00 A2 FF FF FF |               | ........\n  +0x0238 | 00 00 00 01 2F 00 00 00 |               | ..../...\n  +0x0240 | 54 68 69 73 20 69 73 20 |               | This is \n  +0x0248 | 61 20 6C 6F 6E 67 20 73 |               | a long s\n  +0x0250 | 74 72 69 6E 67 20 74 6F |               | tring to\n  +0x0258 | 20 73 68 6F 77 20 68 6F |               |  show ho\n  +0x0260 | 77 20 69 74 20 62 72 65 |               | w it bre\n  +0x0268 | 61 6B 73 20 75 70 2E 00 |               | aks up..\n  +0x0270 | 00 00 0A 00 16 00 0C 00 |               | ........\n  +0x0278 | 04 00 08 00 0A 00 00 00 |               | ........\n  +0x0280 | 65 20 71 49 14 00 00 00 |               | e qI....\n  +0x0288 | C9 76 BE 9F 0C 24 FE 40 |               | .v...$.@\n  +0x0290 | 00 00 06 00 08 00 07 00 |               | ........\n  +0x0298 | 06 00 00 00 00 00 00 01 |               | ........\n"
  },
  {
    "path": "tests/annotated_binary/tests/invalid_string_length.afb",
    "content": "// Annotated Flatbuffer Binary\n//\n// Schema file: annotated_binary.fbs\n// Binary file: tests/invalid_string_length.bin\n\nheader:\n  +0x0000 | 44 00 00 00             | UOffset32   | 0x00000044 (68) Loc: 0x0044   | offset to root table `AnnotatedBinary.Foo`\n  +0x0004 | 41 4E 4E 4F             | char[4]     | ANNO                          | File Identifier\n\npadding:\n  +0x0008 | 00 00                   | uint8_t[2]  | ..                            | padding\n\nvtable (AnnotatedBinary.Foo):\n  +0x000A | 3A 00                   | uint16_t    | 0x003A (58)                   | size of this vtable\n  +0x000C | 68 00                   | uint16_t    | 0x0068 (104)                  | size of referring table\n  +0x000E | 0C 00                   | VOffset16   | 0x000C (12)                   | offset to field `counter` (id: 0)\n  +0x0010 | 07 00                   | VOffset16   | 0x0007 (7)                    | offset to field `healthy` (id: 1)\n  +0x0012 | 00 00                   | VOffset16   | 0x0000 (0)                    | offset to field `level` (id: 2) <defaults to 99> (Long)\n  +0x0014 | 08 00                   | VOffset16   | 0x0008 (8)                    | offset to field `meal` (id: 3)\n  +0x0016 | 10 00                   | VOffset16   | 0x0010 (16)                   | offset to field `bar` (id: 4)\n  +0x0018 | 14 00                   | VOffset16   | 0x0014 (20)                   | offset to field `home` (id: 5)\n  +0x001A | 30 00                   | VOffset16   | 0x0030 (48)                   | offset to field `name` (id: 6)\n  +0x001C | 34 00                   | VOffset16   | 0x0034 (52)                   | offset to field `bars` (id: 7)\n  +0x001E | 09 00                   | VOffset16   | 0x0009 (9)                    | offset to field `bar_baz_type` (id: 8)\n  +0x0020 | 38 00                   | VOffset16   | 0x0038 (56)                   | offset to field `bar_baz` (id: 9)\n  +0x0022 | 3C 00                   | VOffset16   | 0x003C (60)                   | offset to field `accounts` (id: 10)\n  +0x0024 | 40 00                   | VOffset16   | 0x0040 (64)                   | offset to field `bob` (id: 11)\n  +0x0026 | 44 00                   | VOffset16   | 0x0044 (68)                   | offset to field `alice` (id: 12)\n  +0x0028 | 00 00                   | VOffset16   | 0x0000 (0)                    | offset to field `maybe_i32` (id: 13) <defaults to 0> (Int)\n  +0x002A | 00 00                   | VOffset16   | 0x0000 (0)                    | offset to field `default_i32` (id: 14) <defaults to 42> (Int)\n  +0x002C | 48 00                   | VOffset16   | 0x0048 (72)                   | offset to field `just_i32` (id: 15)\n  +0x002E | 4C 00                   | VOffset16   | 0x004C (76)                   | offset to field `names` (id: 16)\n  +0x0030 | 50 00                   | VOffset16   | 0x0050 (80)                   | offset to field `points_of_interest` (id: 17)\n  +0x0032 | 54 00                   | VOffset16   | 0x0054 (84)                   | offset to field `foobars_type` (id: 18)\n  +0x0034 | 58 00                   | VOffset16   | 0x0058 (88)                   | offset to field `foobars` (id: 19)\n  +0x0036 | 0A 00                   | VOffset16   | 0x000A (10)                   | offset to field `measurement_type` (id: 20)\n  +0x0038 | 5C 00                   | VOffset16   | 0x005C (92)                   | offset to field `measurement` (id: 21)\n  +0x003A | 0B 00                   | VOffset16   | 0x000B (11)                   | offset to field `anything_type` (id: 22)\n  +0x003C | 60 00                   | VOffset16   | 0x0060 (96)                   | offset to field `anything` (id: 23)\n  +0x003E | 00 00                   | VOffset16   | 0x0000 (0)                    | offset to field `temperature` (id: 24) <defaults to 98.600000> (Float)\n  +0x0040 | 00 00                   | VOffset16   | 0x0000 (0)                    | offset to field `teetotaler` (id: 25) <null> (Obj)\n  +0x0042 | 64 00                   | VOffset16   | 0x0064 (100)                  | offset to field `charlie` (id: 26)\n\nroot_table (AnnotatedBinary.Foo):\n  +0x0044 | 3A 00 00 00             | SOffset32   | 0x0000003A (58) Loc: 0x000A   | offset to vtable\n  +0x0048 | 00 00 00                | uint8_t[3]  | ...                           | padding\n  +0x004B | 01                      | uint8_t     | 0x01 (1)                      | table field `healthy` (Bool)\n  +0x004C | 02                      | uint8_t     | 0x02 (2)                      | table field `meal` (Byte)\n  +0x004D | 02                      | UType8      | 0x02 (2)                      | table field `bar_baz_type` (UType)\n  +0x004E | 01                      | UType8      | 0x01 (1)                      | table field `measurement_type` (UType)\n  +0x004F | 01                      | UType8      | 0x01 (1)                      | table field `anything_type` (UType)\n  +0x0050 | D2 04 00 00             | uint32_t    | 0x000004D2 (1234)             | table field `counter` (Int)\n  +0x0054 | 28 02 00 00             | UOffset32   | 0x00000228 (552) Loc: 0x027C  | offset to field `bar` (table)\n  +0x0058 | 01 00 00 00             | uint32_t    | 0x00000001 (1)                | struct field `home.floors` of 'AnnotatedBinary.Building' (Int)\n  +0x005C | 02 00 00 00             | uint32_t    | 0x00000002 (2)                | struct field `home.doors` of 'AnnotatedBinary.Building' (Int)\n  +0x0060 | 0C 00 00 00             | uint32_t    | 0x0000000C (12)               | struct field `home.windows` of 'AnnotatedBinary.Building' (Int)\n  +0x0064 | 0A 00 00 00             | uint32_t    | 0x0000000A (10)               | array field `home.dimensions.values`[0] of 'AnnotatedBinary.Dimension' (Int)\n  +0x0068 | 0C 00 00 00             | uint32_t    | 0x0000000C (12)               | array field `home.dimensions.values`[1] of 'AnnotatedBinary.Dimension' (Int)\n  +0x006C | 14 00 00 00             | uint32_t    | 0x00000014 (20)               | array field `home.dimensions.values`[2] of 'AnnotatedBinary.Dimension' (Int)\n  +0x0070 | 01                      | uint8_t     | 0x01 (1)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0071 | 02                      | uint8_t     | 0x02 (2)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0072 | 03                      | uint8_t     | 0x03 (3)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0073 | 00                      | uint8_t[1]  | .                             | padding\n  +0x0074 | C8 01 00 00             | UOffset32   | 0x000001C8 (456) Loc: 0x023C  | offset to field `name` (string)\n  +0x0078 | 5C 01 00 00             | UOffset32   | 0x0000015C (348) Loc: 0x01D4  | offset to field `bars` (vector)\n  +0x007C | 50 01 00 00             | UOffset32   | 0x00000150 (336) Loc: 0x01CC  | offset to field `bar_baz` (union of type `Baz`)\n  +0x0080 | 34 01 00 00             | UOffset32   | 0x00000134 (308) Loc: 0x01B4  | offset to field `accounts` (vector)\n  +0x0084 | 24 01 00 00             | UOffset32   | 0x00000124 (292) Loc: 0x01A8  | offset to field `bob` (string)\n  +0x0088 | 14 01 00 00             | UOffset32   | 0x00000114 (276) Loc: 0x019C  | offset to field `alice` (string)\n  +0x008C | 0D 00 00 00             | uint32_t    | 0x0000000D (13)               | table field `just_i32` (Int)\n  +0x0090 | DC 00 00 00             | UOffset32   | 0x000000DC (220) Loc: 0x016C  | offset to field `names` (vector)\n  +0x0094 | A0 00 00 00             | UOffset32   | 0x000000A0 (160) Loc: 0x0134  | offset to field `points_of_interest` (vector)\n  +0x0098 | 94 00 00 00             | UOffset32   | 0x00000094 (148) Loc: 0x012C  | offset to field `foobars_type` (vector)\n  +0x009C | 38 00 00 00             | UOffset32   | 0x00000038 (56) Loc: 0x00D4   | offset to field `foobars` (vector)\n  +0x00A0 | 33 00 00 00             | UOffset32   | 0x00000033 (51) Loc: 0x00D3   | offset to field `measurement` (union of type `Tolerance`)\n  +0x00A4 | 1C 00 00 00             | UOffset32   | 0x0000001C (28) Loc: 0x00C0   | offset to field `anything` (union of type `Bar`)\n  +0x00A8 | 04 00 00 00             | UOffset32   | 0x00000004 (4) Loc: 0x00AC    | offset to field `charlie` (string)\n\nstring (AnnotatedBinary.Foo.charlie):\n  +0x00AC | FF FF 00 00             | uint32_t    | 0x0000FFFF (65535)            | ERROR: length of string. Longer than the binary.\n\nunknown (no known references):\n  +0x00B0 | 61 6C 69 63 65 00 00 00 | ?uint8_t[8] | alice...                      | WARN: nothing refers to this section.\n\nvtable (AnnotatedBinary.Bar):\n  +0x00B8 | 08 00                   | uint16_t    | 0x0008 (8)                    | size of this vtable\n  +0x00BA | 13 00                   | uint16_t    | 0x0013 (19)                   | size of referring table\n  +0x00BC | 08 00                   | VOffset16   | 0x0008 (8)                    | offset to field `a` (id: 0)\n  +0x00BE | 04 00                   | VOffset16   | 0x0004 (4)                    | offset to field `b` (id: 1)\n\ntable (AnnotatedBinary.Bar):\n  +0x00C0 | 08 00 00 00             | SOffset32   | 0x00000008 (8) Loc: 0x00B8    | offset to vtable\n  +0x00C4 | 00 80 23 44             | float       | 0x44238000 (654)              | table field `b` (Float)\n  +0x00C8 | 00 00 00 00 00 10 74 40 | double      | 0x4074100000000000 (321)      | table field `a` (Double)\n  +0x00D0 | 00 00 00                | uint8_t[3]  | ...                           | padding\n\nunion (AnnotatedBinary.Tolerance.measurement):\n  +0x00D3 | 05                      | uint8_t     | 0x05 (5)                      | struct field `measurement.width` of 'AnnotatedBinary.Tolerance' (UByte)\n\nvector (AnnotatedBinary.Foo.foobars):\n  +0x00D4 | 03 00 00 00             | uint32_t    | 0x00000003 (3)                | length of vector (# items)\n  +0x00D8 | 34 00 00 00             | UOffset32   | 0x00000034 (52) Loc: 0x010C   | offset to union[0] (`Bar`)\n  +0x00DC | 2C 00 00 00             | UOffset32   | 0x0000002C (44) Loc: 0x0108   | offset to union[1] (`Baz`)\n  +0x00E0 | 04 00 00 00             | UOffset32   | 0x00000004 (4) Loc: 0x00E4    | offset to union[2] (`Bar`)\n\ntable (AnnotatedBinary.Bar):\n  +0x00E4 | D2 FE FF FF             | SOffset32   | 0xFFFFFED2 (-302) Loc: 0x0212 | offset to vtable\n  +0x00E8 | 00 80 23 44             | float       | 0x44238000 (654)              | table field `b` (Float)\n  +0x00EC | 10 00 00 00             | UOffset32   | 0x00000010 (16) Loc: 0x00FC   | offset to field `c` (table)\n  +0x00F0 | 00 00 00 00 00 D8 8E 40 | double      | 0x408ED80000000000 (987)      | table field `a` (Double)\n  +0x00F8 | 00 00 00 00             | uint8_t[4]  | ....                          | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x00FC | 6A FE FF FF             | SOffset32   | 0xFFFFFE6A (-406) Loc: 0x0292 | offset to vtable\n  +0x0100 | 00 00 00                | uint8_t[3]  | ...                           | padding\n  +0x0103 | 03                      | uint8_t     | 0x03 (3)                      | table field `meal` (Byte)\n\nvtable (AnnotatedBinary.Baz):\n  +0x0104 | 04 00                   | uint16_t    | 0x0004 (4)                    | size of this vtable\n  +0x0106 | 04 00                   | uint16_t    | 0x0004 (4)                    | size of referring table\n\ntable (AnnotatedBinary.Baz):\n  +0x0108 | 04 00 00 00             | SOffset32   | 0x00000004 (4) Loc: 0x0104    | offset to vtable\n\ntable (AnnotatedBinary.Bar):\n  +0x010C | FA FE FF FF             | SOffset32   | 0xFFFFFEFA (-262) Loc: 0x0212 | offset to vtable\n  +0x0110 | 00 00 E4 43             | float       | 0x43E40000 (456)              | table field `b` (Float)\n  +0x0114 | 10 00 00 00             | UOffset32   | 0x00000010 (16) Loc: 0x0124   | offset to field `c` (table)\n  +0x0118 | 00 00 00 00 00 C0 5E 40 | double      | 0x405EC00000000000 (123)      | table field `a` (Double)\n  +0x0120 | 00 00 00 00             | uint8_t[4]  | ....                          | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x0124 | 92 FE FF FF             | SOffset32   | 0xFFFFFE92 (-366) Loc: 0x0292 | offset to vtable\n  +0x0128 | 00 00 00                | uint8_t[3]  | ...                           | padding\n  +0x012B | 01                      | uint8_t     | 0x01 (1)                      | table field `meal` (Byte)\n\nvector (AnnotatedBinary.Foo.foobars_type):\n  +0x012C | 03 00 00 00             | uint32_t    | 0x00000003 (3)                | length of vector (# items)\n  +0x0130 | 01                      | UType8      | 0x01 (1)                      | value[0]\n  +0x0131 | 02                      | UType8      | 0x02 (2)                      | value[1]\n  +0x0132 | 01                      | UType8      | 0x01 (1)                      | value[2]\n\nvector (AnnotatedBinary.Foo.points_of_interest):\n  +0x0134 | 03 00 00 00             | uint32_t    | 0x00000003 (3)                | length of vector (# items)\n  +0x0138 | 33 33 33 33 33 A3 45 40 | double      | 0x4045A33333333333 (43.275)   | struct field `[0].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0140 | 7E 57 04 FF 5B 87 53 C0 | double      | 0xC053875BFF04577E (-78.115)  | struct field `[0].longitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0148 | 8D F0 F6 20 04 B6 42 40 | double      | 0x4042B60420F6F08D (37.422)   | struct field `[1].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0150 | 9F 77 63 41 61 85 5E C0 | double      | 0xC05E85614163779F (-122.084) | struct field `[1].longitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0158 | 8F 35 23 83 DC 35 4B C0 | double      | 0xC04B35DC8323358F (-54.4208) | struct field `[2].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0160 | F6 97 DD 93 87 C5 0A 40 | double      | 0x400AC58793DD97F6 (3.34645)  | struct field `[2].longitude` of 'AnnotatedBinary.Location' (Double)\n\npadding:\n  +0x0168 | 00 00 00 00             | uint8_t[4]  | ....                          | padding\n\nvector (AnnotatedBinary.Foo.names):\n  +0x016C | 03 00 00 00             | uint32_t    | 0x00000003 (3)                | length of vector (# items)\n  +0x0170 | 20 00 00 00             | UOffset32   | 0x00000020 (32) Loc: 0x0190   | offset to string[0]\n  +0x0174 | 14 00 00 00             | UOffset32   | 0x00000014 (20) Loc: 0x0188   | offset to string[1]\n  +0x0178 | 04 00 00 00             | UOffset32   | 0x00000004 (4) Loc: 0x017C    | offset to string[2]\n\nstring (AnnotatedBinary.Foo.names):\n  +0x017C | 07 00 00 00             | uint32_t    | 0x00000007 (7)                | length of string\n  +0x0180 | 63 68 61 72 6C 69 65    | char[7]     | charlie                       | string literal\n  +0x0187 | 00                      | char        | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.names):\n  +0x0188 | 03 00 00 00             | uint32_t    | 0x00000003 (3)                | length of string\n  +0x018C | 62 6F 62                | char[3]     | bob                           | string literal\n  +0x018F | 00                      | char        | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.names):\n  +0x0190 | 05 00 00 00             | uint32_t    | 0x00000005 (5)                | length of string\n  +0x0194 | 61 6C 69 63 65          | char[5]     | alice                         | string literal\n  +0x0199 | 00                      | char        | 0x00 (0)                      | string terminator\n\npadding:\n  +0x019A | 00 00                   | uint8_t[2]  | ..                            | padding\n\nstring (AnnotatedBinary.Foo.alice):\n  +0x019C | 07 00 00 00             | uint32_t    | 0x00000007 (7)                | length of string\n  +0x01A0 | 63 68 61 72 6C 69 65    | char[7]     | charlie                       | string literal\n  +0x01A7 | 00                      | char        | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.bob):\n  +0x01A8 | 07 00 00 00             | uint32_t    | 0x00000007 (7)                | length of string\n  +0x01AC | 63 68 61 72 6C 69 65    | char[7]     | charlie                       | string literal\n  +0x01B3 | 00                      | char        | 0x00 (0)                      | string terminator\n\nvector (AnnotatedBinary.Foo.accounts):\n  +0x01B4 | 09 00 00 00             | uint32_t    | 0x00000009 (9)                | length of vector (# items)\n  +0x01B8 | 09 00                   | uint16_t    | 0x0009 (9)                    | value[0]\n  +0x01BA | 08 00                   | uint16_t    | 0x0008 (8)                    | value[1]\n  +0x01BC | 07 00                   | uint16_t    | 0x0007 (7)                    | value[2]\n  +0x01BE | 01 00                   | uint16_t    | 0x0001 (1)                    | value[3]\n  +0x01C0 | 02 00                   | uint16_t    | 0x0002 (2)                    | value[4]\n  +0x01C2 | 03 00                   | uint16_t    | 0x0003 (3)                    | value[5]\n  +0x01C4 | 06 00                   | uint16_t    | 0x0006 (6)                    | value[6]\n  +0x01C6 | 05 00                   | uint16_t    | 0x0005 (5)                    | value[7]\n  +0x01C8 | 04 00                   | uint16_t    | 0x0004 (4)                    | value[8]\n\npadding:\n  +0x01CA | 00 00                   | uint8_t[2]  | ..                            | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x01CC | 3A FF FF FF             | SOffset32   | 0xFFFFFF3A (-198) Loc: 0x0292 | offset to vtable\n  +0x01D0 | 00 00 00                | uint8_t[3]  | ...                           | padding\n  +0x01D3 | 03                      | uint8_t     | 0x03 (3)                      | table field `meal` (Byte)\n\nvector (AnnotatedBinary.Foo.bars):\n  +0x01D4 | 02 00 00 00             | uint32_t    | 0x00000002 (2)                | length of vector (# items)\n  +0x01D8 | 44 00 00 00             | UOffset32   | 0x00000044 (68) Loc: 0x021C   | offset to table[0]\n  +0x01DC | 10 00 00 00             | UOffset32   | 0x00000010 (16) Loc: 0x01EC   | offset to table[1]\n\npadding:\n  +0x01E0 | 00 00                   | uint8_t[2]  | ..                            | padding\n\nvtable (AnnotatedBinary.Bar):\n  +0x01E2 | 0A 00                   | uint16_t    | 0x000A (10)                   | size of this vtable\n  +0x01E4 | 1A 00                   | uint16_t    | 0x001A (26)                   | size of referring table\n  +0x01E6 | 0C 00                   | VOffset16   | 0x000C (12)                   | offset to field `a` (id: 0)\n  +0x01E8 | 04 00                   | VOffset16   | 0x0004 (4)                    | offset to field `b` (id: 1)\n  +0x01EA | 08 00                   | VOffset16   | 0x0008 (8)                    | offset to field `c` (id: 2)\n\ntable (AnnotatedBinary.Bar):\n  +0x01EC | 0A 00 00 00             | SOffset32   | 0x0000000A (10) Loc: 0x01E2   | offset to vtable\n  +0x01F0 | 00 80 23 44             | float       | 0x44238000 (654)              | table field `b` (Float)\n  +0x01F4 | 18 00 00 00             | UOffset32   | 0x00000018 (24) Loc: 0x020C   | offset to field `c` (table)\n  +0x01F8 | 00 00 00 00 00 D8 8E 40 | double      | 0x408ED80000000000 (987)      | table field `a` (Double)\n  +0x0200 | 00 00 00 00 00 00       | uint8_t[6]  | ......                        | padding\n\nvtable (AnnotatedBinary.Baz):\n  +0x0206 | 06 00                   | uint16_t    | 0x0006 (6)                    | size of this vtable\n  +0x0208 | 06 00                   | uint16_t    | 0x0006 (6)                    | size of referring table\n  +0x020A | 05 00                   | VOffset16   | 0x0005 (5)                    | offset to field `meal` (id: 0)\n\ntable (AnnotatedBinary.Baz):\n  +0x020C | 06 00 00 00             | SOffset32   | 0x00000006 (6) Loc: 0x0206    | offset to vtable\n  +0x0210 | 00                      | uint8_t[1]  | .                             | padding\n  +0x0211 | 03                      | uint8_t     | 0x03 (3)                      | table field `meal` (Byte)\n\nvtable (AnnotatedBinary.Bar):\n  +0x0212 | 0A 00                   | uint16_t    | 0x000A (10)                   | size of this vtable\n  +0x0214 | 18 00                   | uint16_t    | 0x0018 (24)                   | size of referring table\n  +0x0216 | 0C 00                   | VOffset16   | 0x000C (12)                   | offset to field `a` (id: 0)\n  +0x0218 | 04 00                   | VOffset16   | 0x0004 (4)                    | offset to field `b` (id: 1)\n  +0x021A | 08 00                   | VOffset16   | 0x0008 (8)                    | offset to field `c` (id: 2)\n\ntable (AnnotatedBinary.Bar):\n  +0x021C | 0A 00 00 00             | SOffset32   | 0x0000000A (10) Loc: 0x0212   | offset to vtable\n  +0x0220 | 00 00 E4 43             | float       | 0x43E40000 (456)              | table field `b` (Float)\n  +0x0224 | 10 00 00 00             | UOffset32   | 0x00000010 (16) Loc: 0x0234   | offset to field `c` (table)\n  +0x0228 | 00 00 00 00 00 C0 5E 40 | double      | 0x405EC00000000000 (123)      | table field `a` (Double)\n  +0x0230 | 00 00 00 00             | uint8_t[4]  | ....                          | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x0234 | A2 FF FF FF             | SOffset32   | 0xFFFFFFA2 (-94) Loc: 0x0292  | offset to vtable\n  +0x0238 | 00 00 00                | uint8_t[3]  | ...                           | padding\n  +0x023B | 01                      | uint8_t     | 0x01 (1)                      | table field `meal` (Byte)\n\nstring (AnnotatedBinary.Foo.name):\n  +0x023C | 2F 00 00 00             | uint32_t    | 0x0000002F (47)               | length of string\n  +0x0240 | 54 68 69 73 20 69 73 20 | char[47]    | This is                       | string literal\n  +0x0248 | 61 20 6C 6F 6E 67 20 73 |             | a long s\n  +0x0250 | 74 72 69 6E 67 20 74 6F |             | tring to\n  +0x0258 | 20 73 68 6F 77 20 68 6F |             |  show ho\n  +0x0260 | 77 20 69 74 20 62 72 65 |             | w it bre\n  +0x0268 | 61 6B 73 20 75 70 2E    |             | aks up.\n  +0x026F | 00                      | char        | 0x00 (0)                      | string terminator\n\npadding:\n  +0x0270 | 00 00                   | uint8_t[2]  | ..                            | padding\n\nvtable (AnnotatedBinary.Bar):\n  +0x0272 | 0A 00                   | uint16_t    | 0x000A (10)                   | size of this vtable\n  +0x0274 | 16 00                   | uint16_t    | 0x0016 (22)                   | size of referring table\n  +0x0276 | 0C 00                   | VOffset16   | 0x000C (12)                   | offset to field `a` (id: 0)\n  +0x0278 | 04 00                   | VOffset16   | 0x0004 (4)                    | offset to field `b` (id: 1)\n  +0x027A | 08 00                   | VOffset16   | 0x0008 (8)                    | offset to field `c` (id: 2)\n\ntable (AnnotatedBinary.Bar):\n  +0x027C | 0A 00 00 00             | SOffset32   | 0x0000000A (10) Loc: 0x0272   | offset to vtable\n  +0x0280 | 65 20 71 49             | float       | 0x49712065 (987654)           | table field `b` (Float)\n  +0x0284 | 14 00 00 00             | UOffset32   | 0x00000014 (20) Loc: 0x0298   | offset to field `c` (table)\n  +0x0288 | C9 76 BE 9F 0C 24 FE 40 | double      | 0x40FE240C9FBE76C9 (123457)   | table field `a` (Double)\n  +0x0290 | 00 00                   | uint8_t[2]  | ..                            | padding\n\nvtable (AnnotatedBinary.Baz):\n  +0x0292 | 06 00                   | uint16_t    | 0x0006 (6)                    | size of this vtable\n  +0x0294 | 08 00                   | uint16_t    | 0x0008 (8)                    | size of referring table\n  +0x0296 | 07 00                   | VOffset16   | 0x0007 (7)                    | offset to field `meal` (id: 0)\n\ntable (AnnotatedBinary.Baz):\n  +0x0298 | 06 00 00 00             | SOffset32   | 0x00000006 (6) Loc: 0x0292    | offset to vtable\n  +0x029C | 00 00 00                | uint8_t[3]  | ...                           | padding\n  +0x029F | 01                      | uint8_t     | 0x01 (1)                      | table field `meal` (Byte)\n"
  },
  {
    "path": "tests/annotated_binary/tests/invalid_string_length_cut_short.afb",
    "content": "// Annotated Flatbuffer Binary\n//\n// Schema file: annotated_binary.fbs\n// Binary file: tests/invalid_string_length_cut_short.bin\n\nheader:\n  +0x00 | 44 00 00 00             | UOffset32   | 0x00000044 (68) Loc: 0x44   | offset to root table `AnnotatedBinary.Foo`\n  +0x04 | 41 4E 4E 4F             | char[4]     | ANNO                        | File Identifier\n\npadding:\n  +0x08 | 00 00                   | uint8_t[2]  | ..                          | padding\n\nvtable (AnnotatedBinary.Foo):\n  +0x0A | 3A 00                   | uint16_t    | 0x003A (58)                 | size of this vtable\n  +0x0C | 68 00                   | uint16_t    | 0x0068 (104)                | size of referring table\n  +0x0E | 0C 00                   | VOffset16   | 0x000C (12)                 | offset to field `counter` (id: 0)\n  +0x10 | 07 00                   | VOffset16   | 0x0007 (7)                  | offset to field `healthy` (id: 1)\n  +0x12 | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to field `level` (id: 2) <defaults to 99> (Long)\n  +0x14 | 08 00                   | VOffset16   | 0x0008 (8)                  | offset to field `meal` (id: 3)\n  +0x16 | 10 00                   | VOffset16   | 0x0010 (16)                 | offset to field `bar` (id: 4)\n  +0x18 | 14 00                   | VOffset16   | 0x0014 (20)                 | offset to field `home` (id: 5)\n  +0x1A | 30 00                   | VOffset16   | 0x0030 (48)                 | offset to field `name` (id: 6)\n  +0x1C | 34 00                   | VOffset16   | 0x0034 (52)                 | offset to field `bars` (id: 7)\n  +0x1E | 09 00                   | VOffset16   | 0x0009 (9)                  | offset to field `bar_baz_type` (id: 8)\n  +0x20 | 38 00                   | VOffset16   | 0x0038 (56)                 | offset to field `bar_baz` (id: 9)\n  +0x22 | 3C 00                   | VOffset16   | 0x003C (60)                 | offset to field `accounts` (id: 10)\n  +0x24 | 40 00                   | VOffset16   | 0x0040 (64)                 | offset to field `bob` (id: 11)\n  +0x26 | 44 00                   | VOffset16   | 0x0044 (68)                 | offset to field `alice` (id: 12)\n  +0x28 | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to field `maybe_i32` (id: 13) <defaults to 0> (Int)\n  +0x2A | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to field `default_i32` (id: 14) <defaults to 42> (Int)\n  +0x2C | 48 00                   | VOffset16   | 0x0048 (72)                 | offset to field `just_i32` (id: 15)\n  +0x2E | 4C 00                   | VOffset16   | 0x004C (76)                 | offset to field `names` (id: 16)\n  +0x30 | 50 00                   | VOffset16   | 0x0050 (80)                 | offset to field `points_of_interest` (id: 17)\n  +0x32 | 54 00                   | VOffset16   | 0x0054 (84)                 | offset to field `foobars_type` (id: 18)\n  +0x34 | 58 00                   | VOffset16   | 0x0058 (88)                 | offset to field `foobars` (id: 19)\n  +0x36 | 0A 00                   | VOffset16   | 0x000A (10)                 | offset to field `measurement_type` (id: 20)\n  +0x38 | 5C 00                   | VOffset16   | 0x005C (92)                 | offset to field `measurement` (id: 21)\n  +0x3A | 0B 00                   | VOffset16   | 0x000B (11)                 | offset to field `anything_type` (id: 22)\n  +0x3C | 60 00                   | VOffset16   | 0x0060 (96)                 | offset to field `anything` (id: 23)\n  +0x3E | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to field `temperature` (id: 24) <defaults to 98.600000> (Float)\n  +0x40 | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to field `teetotaler` (id: 25) <null> (Obj)\n  +0x42 | 64 00                   | VOffset16   | 0x0064 (100)                | offset to field `charlie` (id: 26)\n\nroot_table (AnnotatedBinary.Foo):\n  +0x44 | 3A 00 00 00             | SOffset32   | 0x0000003A (58) Loc: 0x0A   | offset to vtable\n  +0x48 | 00 00 00                | uint8_t[3]  | ...                         | padding\n  +0x4B | 01                      | uint8_t     | 0x01 (1)                    | table field `healthy` (Bool)\n  +0x4C | 02                      | uint8_t     | 0x02 (2)                    | table field `meal` (Byte)\n  +0x4D | 02                      | UType8      | 0x02 (2)                    | table field `bar_baz_type` (UType)\n  +0x4E | 01                      | UType8      | 0x01 (1)                    | table field `measurement_type` (UType)\n  +0x4F | 01                      | UType8      | 0x01 (1)                    | table field `anything_type` (UType)\n  +0x50 | D2 04 00 00             | uint32_t    | 0x000004D2 (1234)           | table field `counter` (Int)\n  +0x54 | 28 02 00 00             | UOffset32   | 0x00000228 (552) Loc: 0x27C | ERROR: offset to field `bar`. Invalid offset, points outside the binary.\n  +0x58 | 01 00 00 00             | uint32_t    | 0x00000001 (1)              | struct field `home.floors` of 'AnnotatedBinary.Building' (Int)\n  +0x5C | 02 00 00 00             | uint32_t    | 0x00000002 (2)              | struct field `home.doors` of 'AnnotatedBinary.Building' (Int)\n  +0x60 | 0C 00 00 00             | uint32_t    | 0x0000000C (12)             | struct field `home.windows` of 'AnnotatedBinary.Building' (Int)\n  +0x64 | 0A 00 00 00             | uint32_t    | 0x0000000A (10)             | array field `home.dimensions.values`[0] of 'AnnotatedBinary.Dimension' (Int)\n  +0x68 | 0C 00 00 00             | uint32_t    | 0x0000000C (12)             | array field `home.dimensions.values`[1] of 'AnnotatedBinary.Dimension' (Int)\n  +0x6C | 14 00 00 00             | uint32_t    | 0x00000014 (20)             | array field `home.dimensions.values`[2] of 'AnnotatedBinary.Dimension' (Int)\n  +0x70 | 01                      | uint8_t     | 0x01 (1)                    | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x71 | 02                      | uint8_t     | 0x02 (2)                    | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x72 | 03                      | uint8_t     | 0x03 (3)                    | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x73 | 00                      | uint8_t[1]  | .                           | padding\n  +0x74 | C8 01 00 00             | UOffset32   | 0x000001C8 (456) Loc: 0x23C | ERROR: offset to field `name`. Invalid offset, points outside the binary.\n  +0x78 | 5C 01 00 00             | UOffset32   | 0x0000015C (348) Loc: 0x1D4 | ERROR: offset to field `bars`. Invalid offset, points outside the binary.\n  +0x7C | 50 01 00 00             | UOffset32   | 0x00000150 (336) Loc: 0x1CC | ERROR: offset to field `bar_baz`. Invalid offset, points outside the binary.\n  +0x80 | 34 01 00 00             | UOffset32   | 0x00000134 (308) Loc: 0x1B4 | ERROR: offset to field `accounts`. Invalid offset, points outside the binary.\n  +0x84 | 24 01 00 00             | UOffset32   | 0x00000124 (292) Loc: 0x1A8 | ERROR: offset to field `bob`. Invalid offset, points outside the binary.\n  +0x88 | 14 01 00 00             | UOffset32   | 0x00000114 (276) Loc: 0x19C | ERROR: offset to field `alice`. Invalid offset, points outside the binary.\n  +0x8C | 0D 00 00 00             | uint32_t    | 0x0000000D (13)             | table field `just_i32` (Int)\n  +0x90 | DC 00 00 00             | UOffset32   | 0x000000DC (220) Loc: 0x16C | ERROR: offset to field `names`. Invalid offset, points outside the binary.\n  +0x94 | A0 00 00 00             | UOffset32   | 0x000000A0 (160) Loc: 0x134 | ERROR: offset to field `points_of_interest`. Invalid offset, points outside the binary.\n  +0x98 | 94 00 00 00             | UOffset32   | 0x00000094 (148) Loc: 0x12C | ERROR: offset to field `foobars_type`. Invalid offset, points outside the binary.\n  +0x9C | 38 00 00 00             | UOffset32   | 0x00000038 (56) Loc: 0xD4   | ERROR: offset to field `foobars`. Invalid offset, points outside the binary.\n  +0xA0 | 33 00 00 00             | UOffset32   | 0x00000033 (51) Loc: 0xD3   | ERROR: offset to field `measurement`. Invalid offset, points outside the binary.\n  +0xA4 | 1C 00 00 00             | UOffset32   | 0x0000001C (28) Loc: 0xC0   | ERROR: offset to field `anything`. Invalid offset, points outside the binary.\n  +0xA8 | 04 00 00 00             | UOffset32   | 0x00000004 (4) Loc: 0xAC    | offset to field `charlie` (string)\n\nstring (AnnotatedBinary.Foo.charlie):\n  +0xAC | 05 00                   | ?uint8_t[2] | ..                          | ERROR: length of string. Incomplete binary, expected to read 4 bytes.\n"
  },
  {
    "path": "tests/annotated_binary/tests/invalid_struct_array_field_cut_short.afb",
    "content": "// Annotated Flatbuffer Binary\n//\n// Schema file: annotated_binary.fbs\n// Binary file: tests/invalid_struct_array_field_cut_short.bin\n\nheader:\n  +0x00 | 44 00 00 00             | UOffset32   | 0x00000044 (68) Loc: 0x44   | offset to root table `AnnotatedBinary.Foo`\n  +0x04 | 41 4E 4E 4F             | char[4]     | ANNO                        | File Identifier\n\npadding:\n  +0x08 | 00 00                   | uint8_t[2]  | ..                          | padding\n\nvtable (AnnotatedBinary.Foo):\n  +0x0A | 3A 00                   | uint16_t    | 0x003A (58)                 | size of this vtable\n  +0x0C | 68 00                   | uint16_t    | 0x0068 (104)                | ERROR: size of referring table. Longer than the binary.\n  +0x0E | 0C 00                   | VOffset16   | 0x000C (12)                 | offset to field `counter` (id: 0)\n  +0x10 | 07 00                   | VOffset16   | 0x0007 (7)                  | offset to field `healthy` (id: 1)\n  +0x12 | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to field `level` (id: 2) <defaults to 99> (Long)\n  +0x14 | 08 00                   | VOffset16   | 0x0008 (8)                  | offset to field `meal` (id: 3)\n  +0x16 | 10 00                   | VOffset16   | 0x0010 (16)                 | offset to field `bar` (id: 4)\n  +0x18 | 14 00                   | VOffset16   | 0x0014 (20)                 | offset to field `home` (id: 5)\n  +0x1A | 30 00                   | VOffset16   | 0x0030 (48)                 | ERROR: offset to field `name` (id: 6). Invalid offset, points outside the binary.\n  +0x1C | 34 00                   | VOffset16   | 0x0034 (52)                 | ERROR: offset to field `bars` (id: 7). Invalid offset, points outside the binary.\n  +0x1E | 09 00                   | VOffset16   | 0x0009 (9)                  | offset to field `bar_baz_type` (id: 8)\n  +0x20 | 38 00                   | VOffset16   | 0x0038 (56)                 | ERROR: offset to field `bar_baz` (id: 9). Invalid offset, points outside the binary.\n  +0x22 | 3C 00                   | VOffset16   | 0x003C (60)                 | ERROR: offset to field `accounts` (id: 10). Invalid offset, points outside the binary.\n  +0x24 | 40 00                   | VOffset16   | 0x0040 (64)                 | ERROR: offset to field `bob` (id: 11). Invalid offset, points outside the binary.\n  +0x26 | 44 00                   | VOffset16   | 0x0044 (68)                 | ERROR: offset to field `alice` (id: 12). Invalid offset, points outside the binary.\n  +0x28 | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to field `maybe_i32` (id: 13) <defaults to 0> (Int)\n  +0x2A | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to field `default_i32` (id: 14) <defaults to 42> (Int)\n  +0x2C | 48 00                   | VOffset16   | 0x0048 (72)                 | ERROR: offset to field `just_i32` (id: 15). Invalid offset, points outside the binary.\n  +0x2E | 4C 00                   | VOffset16   | 0x004C (76)                 | ERROR: offset to field `names` (id: 16). Invalid offset, points outside the binary.\n  +0x30 | 50 00                   | VOffset16   | 0x0050 (80)                 | ERROR: offset to field `points_of_interest` (id: 17). Invalid offset, points outside the binary.\n  +0x32 | 54 00                   | VOffset16   | 0x0054 (84)                 | ERROR: offset to field `foobars_type` (id: 18). Invalid offset, points outside the binary.\n  +0x34 | 58 00                   | VOffset16   | 0x0058 (88)                 | ERROR: offset to field `foobars` (id: 19). Invalid offset, points outside the binary.\n  +0x36 | 0A 00                   | VOffset16   | 0x000A (10)                 | offset to field `measurement_type` (id: 20)\n  +0x38 | 5C 00                   | VOffset16   | 0x005C (92)                 | ERROR: offset to field `measurement` (id: 21). Invalid offset, points outside the binary.\n  +0x3A | 0B 00                   | VOffset16   | 0x000B (11)                 | offset to field `anything_type` (id: 22)\n  +0x3C | 60 00                   | VOffset16   | 0x0060 (96)                 | ERROR: offset to field `anything` (id: 23). Invalid offset, points outside the binary.\n  +0x3E | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to field `temperature` (id: 24) <defaults to 98.600000> (Float)\n  +0x40 | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to field `teetotaler` (id: 25) <null> (Obj)\n  +0x42 | 64 00                   | VOffset16   | 0x0064 (100)                | ERROR: offset to field `charlie` (id: 26). Invalid offset, points outside the binary.\n  +0x28 | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to unknown field (id: 13)\n  +0x2A | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to unknown field (id: 14)\n  +0x2C | 48 00                   | VOffset16   | 0x0048 (72)                 | offset to unknown field (id: 15)\n  +0x2E | 4C 00                   | VOffset16   | 0x004C (76)                 | offset to unknown field (id: 16)\n  +0x30 | 50 00                   | VOffset16   | 0x0050 (80)                 | offset to unknown field (id: 17)\n  +0x32 | 54 00                   | VOffset16   | 0x0054 (84)                 | offset to unknown field (id: 18)\n  +0x34 | 58 00                   | VOffset16   | 0x0058 (88)                 | offset to unknown field (id: 19)\n  +0x36 | 0A 00                   | VOffset16   | 0x000A (10)                 | offset to unknown field (id: 20)\n  +0x38 | 5C 00                   | VOffset16   | 0x005C (92)                 | offset to unknown field (id: 21)\n  +0x3A | 0B 00                   | VOffset16   | 0x000B (11)                 | offset to unknown field (id: 22)\n  +0x3C | 60 00                   | VOffset16   | 0x0060 (96)                 | offset to unknown field (id: 23)\n  +0x3E | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to unknown field (id: 24)\n  +0x40 | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to unknown field (id: 25)\n  +0x42 | 64 00                   | VOffset16   | 0x0064 (100)                | offset to unknown field (id: 26)\n\nroot_table (AnnotatedBinary.Foo):\n  +0x44 | 3A 00 00 00             | SOffset32   | 0x0000003A (58) Loc: 0x0A   | offset to vtable\n  +0x48 | 00 00 00                | uint8_t[3]  | ...                         | padding\n  +0x4B | 01                      | uint8_t     | 0x01 (1)                    | table field `healthy` (Bool)\n  +0x4C | 02                      | uint8_t     | 0x02 (2)                    | table field `meal` (Byte)\n  +0x4D | 02                      | UType8      | 0x02 (2)                    | table field `bar_baz_type` (UType)\n  +0x4E | 01                      | UType8      | 0x01 (1)                    | table field `measurement_type` (UType)\n  +0x4F | 01                      | UType8      | 0x01 (1)                    | table field `anything_type` (UType)\n  +0x50 | D2 04 00 00             | uint32_t    | 0x000004D2 (1234)           | table field `counter` (Int)\n  +0x54 | 28 02 00 00             | UOffset32   | 0x00000228 (552) Loc: 0x27C | ERROR: offset to field `bar`. Invalid offset, points outside the binary.\n  +0x58 | 01 00 00 00             | uint32_t    | 0x00000001 (1)              | struct field `home.floors` of 'AnnotatedBinary.Building' (Int)\n  +0x5C | 02 00 00 00             | uint32_t    | 0x00000002 (2)              | struct field `home.doors` of 'AnnotatedBinary.Building' (Int)\n  +0x60 | 0C 00 00 00             | uint32_t    | 0x0000000C (12)             | struct field `home.windows` of 'AnnotatedBinary.Building' (Int)\n  +0x64 | 0A 00 00 00             | uint32_t    | 0x0000000A (10)             | array field `home.dimensions.values`[0] of 'AnnotatedBinary.Dimension' (Int)\n  +0x68 | 0C 00                   | ?uint8_t[2] | ..                          | ERROR: array field `home.dimensions.values`[1] of 'AnnotatedBinary.Dimension' (Int). Incomplete binary, expected to read 4 bytes.\n"
  },
  {
    "path": "tests/annotated_binary/tests/invalid_struct_field_cut_short.afb",
    "content": "// Annotated Flatbuffer Binary\n//\n// Schema file: annotated_binary.fbs\n// Binary file: tests/invalid_struct_field_cut_short.bin\n\nheader:\n  +0x00 | 44 00 00 00             | UOffset32   | 0x00000044 (68) Loc: 0x44   | offset to root table `AnnotatedBinary.Foo`\n  +0x04 | 41 4E 4E 4F             | char[4]     | ANNO                        | File Identifier\n\npadding:\n  +0x08 | 00 00                   | uint8_t[2]  | ..                          | padding\n\nvtable (AnnotatedBinary.Foo):\n  +0x0A | 3A 00                   | uint16_t    | 0x003A (58)                 | size of this vtable\n  +0x0C | 68 00                   | uint16_t    | 0x0068 (104)                | ERROR: size of referring table. Longer than the binary.\n  +0x0E | 0C 00                   | VOffset16   | 0x000C (12)                 | offset to field `counter` (id: 0)\n  +0x10 | 07 00                   | VOffset16   | 0x0007 (7)                  | offset to field `healthy` (id: 1)\n  +0x12 | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to field `level` (id: 2) <defaults to 99> (Long)\n  +0x14 | 08 00                   | VOffset16   | 0x0008 (8)                  | offset to field `meal` (id: 3)\n  +0x16 | 10 00                   | VOffset16   | 0x0010 (16)                 | offset to field `bar` (id: 4)\n  +0x18 | 14 00                   | VOffset16   | 0x0014 (20)                 | offset to field `home` (id: 5)\n  +0x1A | 30 00                   | VOffset16   | 0x0030 (48)                 | ERROR: offset to field `name` (id: 6). Invalid offset, points outside the binary.\n  +0x1C | 34 00                   | VOffset16   | 0x0034 (52)                 | ERROR: offset to field `bars` (id: 7). Invalid offset, points outside the binary.\n  +0x1E | 09 00                   | VOffset16   | 0x0009 (9)                  | offset to field `bar_baz_type` (id: 8)\n  +0x20 | 38 00                   | VOffset16   | 0x0038 (56)                 | ERROR: offset to field `bar_baz` (id: 9). Invalid offset, points outside the binary.\n  +0x22 | 3C 00                   | VOffset16   | 0x003C (60)                 | ERROR: offset to field `accounts` (id: 10). Invalid offset, points outside the binary.\n  +0x24 | 40 00                   | VOffset16   | 0x0040 (64)                 | ERROR: offset to field `bob` (id: 11). Invalid offset, points outside the binary.\n  +0x26 | 44 00                   | VOffset16   | 0x0044 (68)                 | ERROR: offset to field `alice` (id: 12). Invalid offset, points outside the binary.\n  +0x28 | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to field `maybe_i32` (id: 13) <defaults to 0> (Int)\n  +0x2A | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to field `default_i32` (id: 14) <defaults to 42> (Int)\n  +0x2C | 48 00                   | VOffset16   | 0x0048 (72)                 | ERROR: offset to field `just_i32` (id: 15). Invalid offset, points outside the binary.\n  +0x2E | 4C 00                   | VOffset16   | 0x004C (76)                 | ERROR: offset to field `names` (id: 16). Invalid offset, points outside the binary.\n  +0x30 | 50 00                   | VOffset16   | 0x0050 (80)                 | ERROR: offset to field `points_of_interest` (id: 17). Invalid offset, points outside the binary.\n  +0x32 | 54 00                   | VOffset16   | 0x0054 (84)                 | ERROR: offset to field `foobars_type` (id: 18). Invalid offset, points outside the binary.\n  +0x34 | 58 00                   | VOffset16   | 0x0058 (88)                 | ERROR: offset to field `foobars` (id: 19). Invalid offset, points outside the binary.\n  +0x36 | 0A 00                   | VOffset16   | 0x000A (10)                 | offset to field `measurement_type` (id: 20)\n  +0x38 | 5C 00                   | VOffset16   | 0x005C (92)                 | ERROR: offset to field `measurement` (id: 21). Invalid offset, points outside the binary.\n  +0x3A | 0B 00                   | VOffset16   | 0x000B (11)                 | offset to field `anything_type` (id: 22)\n  +0x3C | 60 00                   | VOffset16   | 0x0060 (96)                 | ERROR: offset to field `anything` (id: 23). Invalid offset, points outside the binary.\n  +0x3E | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to field `temperature` (id: 24) <defaults to 98.600000> (Float)\n  +0x40 | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to field `teetotaler` (id: 25) <null> (Obj)\n  +0x42 | 64 00                   | VOffset16   | 0x0064 (100)                | ERROR: offset to field `charlie` (id: 26). Invalid offset, points outside the binary.\n  +0x28 | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to unknown field (id: 13)\n  +0x2A | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to unknown field (id: 14)\n  +0x2C | 48 00                   | VOffset16   | 0x0048 (72)                 | offset to unknown field (id: 15)\n  +0x2E | 4C 00                   | VOffset16   | 0x004C (76)                 | offset to unknown field (id: 16)\n  +0x30 | 50 00                   | VOffset16   | 0x0050 (80)                 | offset to unknown field (id: 17)\n  +0x32 | 54 00                   | VOffset16   | 0x0054 (84)                 | offset to unknown field (id: 18)\n  +0x34 | 58 00                   | VOffset16   | 0x0058 (88)                 | offset to unknown field (id: 19)\n  +0x36 | 0A 00                   | VOffset16   | 0x000A (10)                 | offset to unknown field (id: 20)\n  +0x38 | 5C 00                   | VOffset16   | 0x005C (92)                 | offset to unknown field (id: 21)\n  +0x3A | 0B 00                   | VOffset16   | 0x000B (11)                 | offset to unknown field (id: 22)\n  +0x3C | 60 00                   | VOffset16   | 0x0060 (96)                 | offset to unknown field (id: 23)\n  +0x3E | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to unknown field (id: 24)\n  +0x40 | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to unknown field (id: 25)\n  +0x42 | 64 00                   | VOffset16   | 0x0064 (100)                | offset to unknown field (id: 26)\n\nroot_table (AnnotatedBinary.Foo):\n  +0x44 | 3A 00 00 00             | SOffset32   | 0x0000003A (58) Loc: 0x0A   | offset to vtable\n  +0x48 | 00 00 00                | uint8_t[3]  | ...                         | padding\n  +0x4B | 01                      | uint8_t     | 0x01 (1)                    | table field `healthy` (Bool)\n  +0x4C | 02                      | uint8_t     | 0x02 (2)                    | table field `meal` (Byte)\n  +0x4D | 02                      | UType8      | 0x02 (2)                    | table field `bar_baz_type` (UType)\n  +0x4E | 01                      | UType8      | 0x01 (1)                    | table field `measurement_type` (UType)\n  +0x4F | 01                      | UType8      | 0x01 (1)                    | table field `anything_type` (UType)\n  +0x50 | D2 04 00 00             | uint32_t    | 0x000004D2 (1234)           | table field `counter` (Int)\n  +0x54 | 28 02 00 00             | UOffset32   | 0x00000228 (552) Loc: 0x27C | ERROR: offset to field `bar`. Invalid offset, points outside the binary.\n  +0x58 | 01 00 00 00             | uint32_t    | 0x00000001 (1)              | struct field `home.floors` of 'AnnotatedBinary.Building' (Int)\n  +0x5C | 02 00                   | ?uint8_t[2] | ..                          | ERROR: struct field `home.doors` of 'AnnotatedBinary.Building' (Int). Incomplete binary, expected to read 4 bytes.\n"
  },
  {
    "path": "tests/annotated_binary/tests/invalid_table_field_offset.afb",
    "content": "// Annotated Flatbuffer Binary\n//\n// Schema file: annotated_binary.fbs\n// Binary file: tests/invalid_table_field_offset.bin\n\nheader:\n  +0x00 | 44 00 00 00             | UOffset32   | 0x00000044 (68) Loc: 0x44   | offset to root table `AnnotatedBinary.Foo`\n  +0x04 | 41 4E 4E 4F             | char[4]     | ANNO                        | File Identifier\n\npadding:\n  +0x08 | 00 00                   | uint8_t[2]  | ..                          | padding\n\nvtable (AnnotatedBinary.Foo):\n  +0x0A | 3A 00                   | uint16_t    | 0x003A (58)                 | size of this vtable\n  +0x0C | 68 00                   | uint16_t    | 0x0068 (104)                | ERROR: size of referring table. Longer than the binary.\n  +0x0E | 0C 00                   | VOffset16   | 0x000C (12)                 | offset to field `counter` (id: 0)\n  +0x10 | 07 00                   | VOffset16   | 0x0007 (7)                  | offset to field `healthy` (id: 1)\n  +0x12 | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to field `level` (id: 2) <defaults to 99> (Long)\n  +0x14 | 08 00                   | VOffset16   | 0x0008 (8)                  | offset to field `meal` (id: 3)\n  +0x16 | 10 00                   | VOffset16   | 0x0010 (16)                 | offset to field `bar` (id: 4)\n  +0x18 | 14 00                   | VOffset16   | 0x0014 (20)                 | offset to field `home` (id: 5)\n  +0x1A | 30 00                   | VOffset16   | 0x0030 (48)                 | offset to field `name` (id: 6)\n  +0x1C | 34 00                   | VOffset16   | 0x0034 (52)                 | offset to field `bars` (id: 7)\n  +0x1E | 09 00                   | VOffset16   | 0x0009 (9)                  | offset to field `bar_baz_type` (id: 8)\n  +0x20 | 38 00                   | VOffset16   | 0x0038 (56)                 | offset to field `bar_baz` (id: 9)\n  +0x22 | 3C 00                   | VOffset16   | 0x003C (60)                 | offset to field `accounts` (id: 10)\n  +0x24 | 40 00                   | VOffset16   | 0x0040 (64)                 | offset to field `bob` (id: 11)\n  +0x26 | 44 00                   | VOffset16   | 0x0044 (68)                 | offset to field `alice` (id: 12)\n  +0x28 | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to field `maybe_i32` (id: 13) <defaults to 0> (Int)\n  +0x2A | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to field `default_i32` (id: 14) <defaults to 42> (Int)\n  +0x2C | 48 00                   | VOffset16   | 0x0048 (72)                 | offset to field `just_i32` (id: 15)\n  +0x2E | 4C 00                   | VOffset16   | 0x004C (76)                 | offset to field `names` (id: 16)\n  +0x30 | 50 00                   | VOffset16   | 0x0050 (80)                 | offset to field `points_of_interest` (id: 17)\n  +0x32 | 54 00                   | VOffset16   | 0x0054 (84)                 | ERROR: offset to field `foobars_type` (id: 18). Invalid offset, points outside the binary.\n  +0x34 | 58 00                   | VOffset16   | 0x0058 (88)                 | ERROR: offset to field `foobars` (id: 19). Invalid offset, points outside the binary.\n  +0x36 | 0A 00                   | VOffset16   | 0x000A (10)                 | offset to field `measurement_type` (id: 20)\n  +0x38 | 5C 00                   | VOffset16   | 0x005C (92)                 | ERROR: offset to field `measurement` (id: 21). Invalid offset, points outside the binary.\n  +0x3A | 0B 00                   | VOffset16   | 0x000B (11)                 | offset to field `anything_type` (id: 22)\n  +0x3C | 60 00                   | VOffset16   | 0x0060 (96)                 | ERROR: offset to field `anything` (id: 23). Invalid offset, points outside the binary.\n  +0x3E | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to field `temperature` (id: 24) <defaults to 98.600000> (Float)\n  +0x40 | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to field `teetotaler` (id: 25) <null> (Obj)\n  +0x42 | 64 00                   | VOffset16   | 0x0064 (100)                | ERROR: offset to field `charlie` (id: 26). Invalid offset, points outside the binary.\n  +0x3A | 0B 00                   | VOffset16   | 0x000B (11)                 | offset to unknown field (id: 22)\n  +0x3C | 60 00                   | VOffset16   | 0x0060 (96)                 | offset to unknown field (id: 23)\n  +0x3E | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to unknown field (id: 24)\n  +0x40 | 00 00                   | VOffset16   | 0x0000 (0)                  | offset to unknown field (id: 25)\n  +0x42 | 64 00                   | VOffset16   | 0x0064 (100)                | offset to unknown field (id: 26)\n\nroot_table (AnnotatedBinary.Foo):\n  +0x44 | 3A 00 00 00             | SOffset32   | 0x0000003A (58) Loc: 0x0A   | offset to vtable\n  +0x48 | 00 00 00                | uint8_t[3]  | ...                         | padding\n  +0x4B | 01                      | uint8_t     | 0x01 (1)                    | table field `healthy` (Bool)\n  +0x4C | 02                      | uint8_t     | 0x02 (2)                    | table field `meal` (Byte)\n  +0x4D | 02                      | UType8      | 0x02 (2)                    | table field `bar_baz_type` (UType)\n  +0x4E | 01                      | UType8      | 0x01 (1)                    | table field `measurement_type` (UType)\n  +0x4F | 01                      | UType8      | 0x01 (1)                    | table field `anything_type` (UType)\n  +0x50 | D2 04 00 00             | uint32_t    | 0x000004D2 (1234)           | table field `counter` (Int)\n  +0x54 | 28 02 00 00             | UOffset32   | 0x00000228 (552) Loc: 0x27C | ERROR: offset to field `bar`. Invalid offset, points outside the binary.\n  +0x58 | 01 00 00 00             | uint32_t    | 0x00000001 (1)              | struct field `home.floors` of 'AnnotatedBinary.Building' (Int)\n  +0x5C | 02 00 00 00             | uint32_t    | 0x00000002 (2)              | struct field `home.doors` of 'AnnotatedBinary.Building' (Int)\n  +0x60 | 0C 00 00 00             | uint32_t    | 0x0000000C (12)             | struct field `home.windows` of 'AnnotatedBinary.Building' (Int)\n  +0x64 | 0A 00 00 00             | uint32_t    | 0x0000000A (10)             | array field `home.dimensions.values`[0] of 'AnnotatedBinary.Dimension' (Int)\n  +0x68 | 0C 00 00 00             | uint32_t    | 0x0000000C (12)             | array field `home.dimensions.values`[1] of 'AnnotatedBinary.Dimension' (Int)\n  +0x6C | 14 00 00 00             | uint32_t    | 0x00000014 (20)             | array field `home.dimensions.values`[2] of 'AnnotatedBinary.Dimension' (Int)\n  +0x70 | 01                      | uint8_t     | 0x01 (1)                    | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x71 | 02                      | uint8_t     | 0x02 (2)                    | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x72 | 03                      | uint8_t     | 0x03 (3)                    | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x73 | 00                      | uint8_t[1]  | .                           | padding\n  +0x74 | C8 01 00 00             | UOffset32   | 0x000001C8 (456) Loc: 0x23C | ERROR: offset to field `name`. Invalid offset, points outside the binary.\n  +0x78 | 5C 01 00 00             | UOffset32   | 0x0000015C (348) Loc: 0x1D4 | ERROR: offset to field `bars`. Invalid offset, points outside the binary.\n  +0x7C | 50 01 00 00             | UOffset32   | 0x00000150 (336) Loc: 0x1CC | ERROR: offset to field `bar_baz`. Invalid offset, points outside the binary.\n  +0x80 | 34 01 00 00             | UOffset32   | 0x00000134 (308) Loc: 0x1B4 | ERROR: offset to field `accounts`. Invalid offset, points outside the binary.\n  +0x84 | 24 01 00 00             | UOffset32   | 0x00000124 (292) Loc: 0x1A8 | ERROR: offset to field `bob`. Invalid offset, points outside the binary.\n  +0x88 | 14 01 00 00             | UOffset32   | 0x00000114 (276) Loc: 0x19C | ERROR: offset to field `alice`. Invalid offset, points outside the binary.\n  +0x8C | 0D 00 00 00             | uint32_t    | 0x0000000D (13)             | table field `just_i32` (Int)\n  +0x90 | DC 00 00 00             | UOffset32   | 0x000000DC (220) Loc: 0x16C | ERROR: offset to field `names`. Invalid offset, points outside the binary.\n  +0x94 | A0 00                   | ?uint8_t[2] | ..                          | ERROR: offset to field `points_of_interest`. Incomplete binary, expected to read 4 bytes.\n"
  },
  {
    "path": "tests/annotated_binary/tests/invalid_table_field_size.afb",
    "content": "// Annotated Flatbuffer Binary\n//\n// Schema file: annotated_binary.fbs\n// Binary file: tests/invalid_table_field_size.bin\n\nheader:\n  +0x00 | 44 00 00 00             | UOffset32   | 0x00000044 (68) Loc: 0x44 | offset to root table `AnnotatedBinary.Foo`\n  +0x04 | 41 4E 4E 4F             | char[4]     | ANNO                      | File Identifier\n\npadding:\n  +0x08 | 00 00                   | uint8_t[2]  | ..                        | padding\n\nvtable (AnnotatedBinary.Foo):\n  +0x0A | 3A 00                   | uint16_t    | 0x003A (58)               | size of this vtable\n  +0x0C | 68 00                   | uint16_t    | 0x0068 (104)              | ERROR: size of referring table. Longer than the binary.\n  +0x0E | 0C 00                   | VOffset16   | 0x000C (12)               | offset to field `counter` (id: 0)\n  +0x10 | 07 00                   | VOffset16   | 0x0007 (7)                | offset to field `healthy` (id: 1)\n  +0x12 | 00 00                   | VOffset16   | 0x0000 (0)                | offset to field `level` (id: 2) <defaults to 99> (Long)\n  +0x14 | 08 00                   | VOffset16   | 0x0008 (8)                | offset to field `meal` (id: 3)\n  +0x16 | 10 00                   | VOffset16   | 0x0010 (16)               | ERROR: offset to field `bar` (id: 4). Invalid offset, points outside the binary.\n  +0x18 | 14 00                   | VOffset16   | 0x0014 (20)               | ERROR: offset to field `home` (id: 5). Invalid offset, points outside the binary.\n  +0x1A | 30 00                   | VOffset16   | 0x0030 (48)               | ERROR: offset to field `name` (id: 6). Invalid offset, points outside the binary.\n  +0x1C | 34 00                   | VOffset16   | 0x0034 (52)               | ERROR: offset to field `bars` (id: 7). Invalid offset, points outside the binary.\n  +0x1E | 09 00                   | VOffset16   | 0x0009 (9)                | offset to field `bar_baz_type` (id: 8)\n  +0x20 | 38 00                   | VOffset16   | 0x0038 (56)               | ERROR: offset to field `bar_baz` (id: 9). Invalid offset, points outside the binary.\n  +0x22 | 3C 00                   | VOffset16   | 0x003C (60)               | ERROR: offset to field `accounts` (id: 10). Invalid offset, points outside the binary.\n  +0x24 | 40 00                   | VOffset16   | 0x0040 (64)               | ERROR: offset to field `bob` (id: 11). Invalid offset, points outside the binary.\n  +0x26 | 44 00                   | VOffset16   | 0x0044 (68)               | ERROR: offset to field `alice` (id: 12). Invalid offset, points outside the binary.\n  +0x28 | 00 00                   | VOffset16   | 0x0000 (0)                | offset to field `maybe_i32` (id: 13) <defaults to 0> (Int)\n  +0x2A | 00 00                   | VOffset16   | 0x0000 (0)                | offset to field `default_i32` (id: 14) <defaults to 42> (Int)\n  +0x2C | 48 00                   | VOffset16   | 0x0048 (72)               | ERROR: offset to field `just_i32` (id: 15). Invalid offset, points outside the binary.\n  +0x2E | 4C 00                   | VOffset16   | 0x004C (76)               | ERROR: offset to field `names` (id: 16). Invalid offset, points outside the binary.\n  +0x30 | 50 00                   | VOffset16   | 0x0050 (80)               | ERROR: offset to field `points_of_interest` (id: 17). Invalid offset, points outside the binary.\n  +0x32 | 54 00                   | VOffset16   | 0x0054 (84)               | ERROR: offset to field `foobars_type` (id: 18). Invalid offset, points outside the binary.\n  +0x34 | 58 00                   | VOffset16   | 0x0058 (88)               | ERROR: offset to field `foobars` (id: 19). Invalid offset, points outside the binary.\n  +0x36 | 0A 00                   | VOffset16   | 0x000A (10)               | offset to field `measurement_type` (id: 20)\n  +0x38 | 5C 00                   | VOffset16   | 0x005C (92)               | ERROR: offset to field `measurement` (id: 21). Invalid offset, points outside the binary.\n  +0x3A | 0B 00                   | VOffset16   | 0x000B (11)               | offset to field `anything_type` (id: 22)\n  +0x3C | 60 00                   | VOffset16   | 0x0060 (96)               | ERROR: offset to field `anything` (id: 23). Invalid offset, points outside the binary.\n  +0x3E | 00 00                   | VOffset16   | 0x0000 (0)                | offset to field `temperature` (id: 24) <defaults to 98.600000> (Float)\n  +0x40 | 00 00                   | VOffset16   | 0x0000 (0)                | offset to field `teetotaler` (id: 25) <null> (Obj)\n  +0x42 | 64 00                   | VOffset16   | 0x0064 (100)              | ERROR: offset to field `charlie` (id: 26). Invalid offset, points outside the binary.\n  +0x24 | 40 00                   | VOffset16   | 0x0040 (64)               | offset to unknown field (id: 11)\n  +0x26 | 44 00                   | VOffset16   | 0x0044 (68)               | offset to unknown field (id: 12)\n  +0x28 | 00 00                   | VOffset16   | 0x0000 (0)                | offset to unknown field (id: 13)\n  +0x2A | 00 00                   | VOffset16   | 0x0000 (0)                | offset to unknown field (id: 14)\n  +0x2C | 48 00                   | VOffset16   | 0x0048 (72)               | offset to unknown field (id: 15)\n  +0x2E | 4C 00                   | VOffset16   | 0x004C (76)               | offset to unknown field (id: 16)\n  +0x30 | 50 00                   | VOffset16   | 0x0050 (80)               | offset to unknown field (id: 17)\n  +0x32 | 54 00                   | VOffset16   | 0x0054 (84)               | offset to unknown field (id: 18)\n  +0x34 | 58 00                   | VOffset16   | 0x0058 (88)               | offset to unknown field (id: 19)\n  +0x36 | 0A 00                   | VOffset16   | 0x000A (10)               | offset to unknown field (id: 20)\n  +0x38 | 5C 00                   | VOffset16   | 0x005C (92)               | offset to unknown field (id: 21)\n  +0x3A | 0B 00                   | VOffset16   | 0x000B (11)               | offset to unknown field (id: 22)\n  +0x3C | 60 00                   | VOffset16   | 0x0060 (96)               | offset to unknown field (id: 23)\n  +0x3E | 00 00                   | VOffset16   | 0x0000 (0)                | offset to unknown field (id: 24)\n  +0x40 | 00 00                   | VOffset16   | 0x0000 (0)                | offset to unknown field (id: 25)\n  +0x42 | 64 00                   | VOffset16   | 0x0064 (100)              | offset to unknown field (id: 26)\n\nroot_table (AnnotatedBinary.Foo):\n  +0x44 | 3A 00 00 00             | SOffset32   | 0x0000003A (58) Loc: 0x0A | offset to vtable\n  +0x48 | 00 00 00                | uint8_t[3]  | ...                       | padding\n  +0x4B | 01                      | uint8_t     | 0x01 (1)                  | table field `healthy` (Bool)\n  +0x4C | 02                      | uint8_t     | 0x02 (2)                  | table field `meal` (Byte)\n  +0x4D | 02                      | UType8      | 0x02 (2)                  | table field `bar_baz_type` (UType)\n  +0x4E | 01                      | UType8      | 0x01 (1)                  | table field `measurement_type` (UType)\n  +0x4F | 01                      | UType8      | 0x01 (1)                  | table field `anything_type` (UType)\n  +0x50 | D2 04                   | ?uint8_t[2] | ..                        | ERROR: table field `counter` (Int). Incomplete binary, expected to read 4 bytes.\n"
  },
  {
    "path": "tests/annotated_binary/tests/invalid_union_type_value.afb",
    "content": "// Annotated Flatbuffer Binary\n//\n// Schema file: annotated_binary.fbs\n// Binary file: tests/invalid_union_type_value.bin\n\nheader:\n  +0x0000 | 44 00 00 00             | UOffset32    | 0x00000044 (68) Loc: 0x0044   | offset to root table `AnnotatedBinary.Foo`\n  +0x0004 | 41 4E 4E 4F             | char[4]      | ANNO                          | File Identifier\n\npadding:\n  +0x0008 | 00 00                   | uint8_t[2]   | ..                            | padding\n\nvtable (AnnotatedBinary.Foo):\n  +0x000A | 3A 00                   | uint16_t     | 0x003A (58)                   | size of this vtable\n  +0x000C | 68 00                   | uint16_t     | 0x0068 (104)                  | size of referring table\n  +0x000E | 0C 00                   | VOffset16    | 0x000C (12)                   | offset to field `counter` (id: 0)\n  +0x0010 | 07 00                   | VOffset16    | 0x0007 (7)                    | offset to field `healthy` (id: 1)\n  +0x0012 | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `level` (id: 2) <defaults to 99> (Long)\n  +0x0014 | 08 00                   | VOffset16    | 0x0008 (8)                    | offset to field `meal` (id: 3)\n  +0x0016 | 10 00                   | VOffset16    | 0x0010 (16)                   | offset to field `bar` (id: 4)\n  +0x0018 | 14 00                   | VOffset16    | 0x0014 (20)                   | offset to field `home` (id: 5)\n  +0x001A | 30 00                   | VOffset16    | 0x0030 (48)                   | offset to field `name` (id: 6)\n  +0x001C | 34 00                   | VOffset16    | 0x0034 (52)                   | offset to field `bars` (id: 7)\n  +0x001E | 09 00                   | VOffset16    | 0x0009 (9)                    | offset to field `bar_baz_type` (id: 8)\n  +0x0020 | 38 00                   | VOffset16    | 0x0038 (56)                   | offset to field `bar_baz` (id: 9)\n  +0x0022 | 3C 00                   | VOffset16    | 0x003C (60)                   | offset to field `accounts` (id: 10)\n  +0x0024 | 40 00                   | VOffset16    | 0x0040 (64)                   | offset to field `bob` (id: 11)\n  +0x0026 | 44 00                   | VOffset16    | 0x0044 (68)                   | offset to field `alice` (id: 12)\n  +0x0028 | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `maybe_i32` (id: 13) <defaults to 0> (Int)\n  +0x002A | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `default_i32` (id: 14) <defaults to 42> (Int)\n  +0x002C | 48 00                   | VOffset16    | 0x0048 (72)                   | offset to field `just_i32` (id: 15)\n  +0x002E | 4C 00                   | VOffset16    | 0x004C (76)                   | offset to field `names` (id: 16)\n  +0x0030 | 50 00                   | VOffset16    | 0x0050 (80)                   | offset to field `points_of_interest` (id: 17)\n  +0x0032 | 54 00                   | VOffset16    | 0x0054 (84)                   | offset to field `foobars_type` (id: 18)\n  +0x0034 | 58 00                   | VOffset16    | 0x0058 (88)                   | offset to field `foobars` (id: 19)\n  +0x0036 | 0A 00                   | VOffset16    | 0x000A (10)                   | offset to field `measurement_type` (id: 20)\n  +0x0038 | 5C 00                   | VOffset16    | 0x005C (92)                   | offset to field `measurement` (id: 21)\n  +0x003A | 0B 00                   | VOffset16    | 0x000B (11)                   | offset to field `anything_type` (id: 22)\n  +0x003C | 60 00                   | VOffset16    | 0x0060 (96)                   | offset to field `anything` (id: 23)\n  +0x003E | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `temperature` (id: 24) <defaults to 98.600000> (Float)\n  +0x0040 | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `teetotaler` (id: 25) <null> (Obj)\n  +0x0042 | 64 00                   | VOffset16    | 0x0064 (100)                  | offset to field `charlie` (id: 26)\n\nroot_table (AnnotatedBinary.Foo):\n  +0x0044 | 3A 00 00 00             | SOffset32    | 0x0000003A (58) Loc: 0x000A   | offset to vtable\n  +0x0048 | 00 00 00                | uint8_t[3]   | ...                           | padding\n  +0x004B | 01                      | uint8_t      | 0x01 (1)                      | table field `healthy` (Bool)\n  +0x004C | 02                      | uint8_t      | 0x02 (2)                      | table field `meal` (Byte)\n  +0x004D | FF                      | UType8       | 0xFF (255)                    | ERROR: table field `bar_baz_type` (UType). Invalid union type value.\n  +0x004E | 01                      | UType8       | 0x01 (1)                      | table field `measurement_type` (UType)\n  +0x004F | 01                      | UType8       | 0x01 (1)                      | table field `anything_type` (UType)\n  +0x0050 | D2 04 00 00             | uint32_t     | 0x000004D2 (1234)             | table field `counter` (Int)\n  +0x0054 | 28 02 00 00             | UOffset32    | 0x00000228 (552) Loc: 0x027C  | offset to field `bar` (table)\n  +0x0058 | 01 00 00 00             | uint32_t     | 0x00000001 (1)                | struct field `home.floors` of 'AnnotatedBinary.Building' (Int)\n  +0x005C | 02 00 00 00             | uint32_t     | 0x00000002 (2)                | struct field `home.doors` of 'AnnotatedBinary.Building' (Int)\n  +0x0060 | 0C 00 00 00             | uint32_t     | 0x0000000C (12)               | struct field `home.windows` of 'AnnotatedBinary.Building' (Int)\n  +0x0064 | 0A 00 00 00             | uint32_t     | 0x0000000A (10)               | array field `home.dimensions.values`[0] of 'AnnotatedBinary.Dimension' (Int)\n  +0x0068 | 0C 00 00 00             | uint32_t     | 0x0000000C (12)               | array field `home.dimensions.values`[1] of 'AnnotatedBinary.Dimension' (Int)\n  +0x006C | 14 00 00 00             | uint32_t     | 0x00000014 (20)               | array field `home.dimensions.values`[2] of 'AnnotatedBinary.Dimension' (Int)\n  +0x0070 | 01                      | uint8_t      | 0x01 (1)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0071 | 02                      | uint8_t      | 0x02 (2)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0072 | 03                      | uint8_t      | 0x03 (3)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0073 | 00                      | uint8_t[1]   | .                             | padding\n  +0x0074 | C8 01 00 00             | UOffset32    | 0x000001C8 (456) Loc: 0x023C  | offset to field `name` (string)\n  +0x0078 | 5C 01 00 00             | UOffset32    | 0x0000015C (348) Loc: 0x01D4  | offset to field `bars` (vector)\n  +0x007C | 50 01 00 00             | ?uint8_t[4]  | P...                          | WARN: nothing refers to this section.\n  +0x0080 | 34 01 00 00             | UOffset32    | 0x00000134 (308) Loc: 0x01B4  | offset to field `accounts` (vector)\n  +0x0084 | 24 01 00 00             | UOffset32    | 0x00000124 (292) Loc: 0x01A8  | offset to field `bob` (string)\n  +0x0088 | 14 01 00 00             | UOffset32    | 0x00000114 (276) Loc: 0x019C  | offset to field `alice` (string)\n  +0x008C | 0D 00 00 00             | uint32_t     | 0x0000000D (13)               | table field `just_i32` (Int)\n  +0x0090 | DC 00 00 00             | UOffset32    | 0x000000DC (220) Loc: 0x016C  | offset to field `names` (vector)\n  +0x0094 | A0 00 00 00             | UOffset32    | 0x000000A0 (160) Loc: 0x0134  | offset to field `points_of_interest` (vector)\n  +0x0098 | 94 00 00 00             | UOffset32    | 0x00000094 (148) Loc: 0x012C  | offset to field `foobars_type` (vector)\n  +0x009C | 38 00 00 00             | UOffset32    | 0x00000038 (56) Loc: 0x00D4   | offset to field `foobars` (vector)\n  +0x00A0 | 33 00 00 00             | UOffset32    | 0x00000033 (51) Loc: 0x00D3   | offset to field `measurement` (union of type `Tolerance`)\n  +0x00A4 | 1C 00 00 00             | UOffset32    | 0x0000001C (28) Loc: 0x00C0   | offset to field `anything` (union of type `Bar`)\n  +0x00A8 | 04 00 00 00             | UOffset32    | 0x00000004 (4) Loc: 0x00AC    | offset to field `charlie` (string)\n\nstring (AnnotatedBinary.Foo.charlie):\n  +0x00AC | 05 00 00 00             | uint32_t     | 0x00000005 (5)                | length of string\n  +0x00B0 | 61 6C 69 63 65          | char[5]      | alice                         | string literal\n  +0x00B5 | 00                      | char         | 0x00 (0)                      | string terminator\n\npadding:\n  +0x00B6 | 00 00                   | uint8_t[2]   | ..                            | padding\n\nvtable (AnnotatedBinary.Bar):\n  +0x00B8 | 08 00                   | uint16_t     | 0x0008 (8)                    | size of this vtable\n  +0x00BA | 13 00                   | uint16_t     | 0x0013 (19)                   | size of referring table\n  +0x00BC | 08 00                   | VOffset16    | 0x0008 (8)                    | offset to field `a` (id: 0)\n  +0x00BE | 04 00                   | VOffset16    | 0x0004 (4)                    | offset to field `b` (id: 1)\n\ntable (AnnotatedBinary.Bar):\n  +0x00C0 | 08 00 00 00             | SOffset32    | 0x00000008 (8) Loc: 0x00B8    | offset to vtable\n  +0x00C4 | 00 80 23 44             | float        | 0x44238000 (654)              | table field `b` (Float)\n  +0x00C8 | 00 00 00 00 00 10 74 40 | double       | 0x4074100000000000 (321)      | table field `a` (Double)\n  +0x00D0 | 00 00 00                | uint8_t[3]   | ...                           | padding\n\nunion (AnnotatedBinary.Tolerance.measurement):\n  +0x00D3 | 05                      | uint8_t      | 0x05 (5)                      | struct field `measurement.width` of 'AnnotatedBinary.Tolerance' (UByte)\n\nvector (AnnotatedBinary.Foo.foobars):\n  +0x00D4 | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x00D8 | 34 00 00 00             | UOffset32    | 0x00000034 (52) Loc: 0x010C   | offset to union[0] (`Bar`)\n  +0x00DC | 2C 00 00 00             | UOffset32    | 0x0000002C (44) Loc: 0x0108   | offset to union[1] (`Baz`)\n  +0x00E0 | 04 00 00 00             | UOffset32    | 0x00000004 (4) Loc: 0x00E4    | offset to union[2] (`Bar`)\n\ntable (AnnotatedBinary.Bar):\n  +0x00E4 | D2 FE FF FF             | SOffset32    | 0xFFFFFED2 (-302) Loc: 0x0212 | offset to vtable\n  +0x00E8 | 00 80 23 44             | float        | 0x44238000 (654)              | table field `b` (Float)\n  +0x00EC | 10 00 00 00             | UOffset32    | 0x00000010 (16) Loc: 0x00FC   | offset to field `c` (table)\n  +0x00F0 | 00 00 00 00 00 D8 8E 40 | double       | 0x408ED80000000000 (987)      | table field `a` (Double)\n  +0x00F8 | 00 00 00 00             | uint8_t[4]   | ....                          | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x00FC | 6A FE FF FF             | SOffset32    | 0xFFFFFE6A (-406) Loc: 0x0292 | offset to vtable\n  +0x0100 | 00 00 00                | uint8_t[3]   | ...                           | padding\n  +0x0103 | 03                      | uint8_t      | 0x03 (3)                      | table field `meal` (Byte)\n\nvtable (AnnotatedBinary.Baz):\n  +0x0104 | 04 00                   | uint16_t     | 0x0004 (4)                    | size of this vtable\n  +0x0106 | 04 00                   | uint16_t     | 0x0004 (4)                    | size of referring table\n\ntable (AnnotatedBinary.Baz):\n  +0x0108 | 04 00 00 00             | SOffset32    | 0x00000004 (4) Loc: 0x0104    | offset to vtable\n\ntable (AnnotatedBinary.Bar):\n  +0x010C | FA FE FF FF             | SOffset32    | 0xFFFFFEFA (-262) Loc: 0x0212 | offset to vtable\n  +0x0110 | 00 00 E4 43             | float        | 0x43E40000 (456)              | table field `b` (Float)\n  +0x0114 | 10 00 00 00             | UOffset32    | 0x00000010 (16) Loc: 0x0124   | offset to field `c` (table)\n  +0x0118 | 00 00 00 00 00 C0 5E 40 | double       | 0x405EC00000000000 (123)      | table field `a` (Double)\n  +0x0120 | 00 00 00 00             | uint8_t[4]   | ....                          | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x0124 | 92 FE FF FF             | SOffset32    | 0xFFFFFE92 (-366) Loc: 0x0292 | offset to vtable\n  +0x0128 | 00 00 00                | uint8_t[3]   | ...                           | padding\n  +0x012B | 01                      | uint8_t      | 0x01 (1)                      | table field `meal` (Byte)\n\nvector (AnnotatedBinary.Foo.foobars_type):\n  +0x012C | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x0130 | 01                      | UType8       | 0x01 (1)                      | value[0]\n  +0x0131 | 02                      | UType8       | 0x02 (2)                      | value[1]\n  +0x0132 | 01                      | UType8       | 0x01 (1)                      | value[2]\n\nvector (AnnotatedBinary.Foo.points_of_interest):\n  +0x0134 | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x0138 | 33 33 33 33 33 A3 45 40 | double       | 0x4045A33333333333 (43.275)   | struct field `[0].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0140 | 7E 57 04 FF 5B 87 53 C0 | double       | 0xC053875BFF04577E (-78.115)  | struct field `[0].longitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0148 | 8D F0 F6 20 04 B6 42 40 | double       | 0x4042B60420F6F08D (37.422)   | struct field `[1].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0150 | 9F 77 63 41 61 85 5E C0 | double       | 0xC05E85614163779F (-122.084) | struct field `[1].longitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0158 | 8F 35 23 83 DC 35 4B C0 | double       | 0xC04B35DC8323358F (-54.4208) | struct field `[2].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0160 | F6 97 DD 93 87 C5 0A 40 | double       | 0x400AC58793DD97F6 (3.34645)  | struct field `[2].longitude` of 'AnnotatedBinary.Location' (Double)\n\npadding:\n  +0x0168 | 00 00 00 00             | uint8_t[4]   | ....                          | padding\n\nvector (AnnotatedBinary.Foo.names):\n  +0x016C | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x0170 | 20 00 00 00             | UOffset32    | 0x00000020 (32) Loc: 0x0190   | offset to string[0]\n  +0x0174 | 14 00 00 00             | UOffset32    | 0x00000014 (20) Loc: 0x0188   | offset to string[1]\n  +0x0178 | 04 00 00 00             | UOffset32    | 0x00000004 (4) Loc: 0x017C    | offset to string[2]\n\nstring (AnnotatedBinary.Foo.names):\n  +0x017C | 07 00 00 00             | uint32_t     | 0x00000007 (7)                | length of string\n  +0x0180 | 63 68 61 72 6C 69 65    | char[7]      | charlie                       | string literal\n  +0x0187 | 00                      | char         | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.names):\n  +0x0188 | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of string\n  +0x018C | 62 6F 62                | char[3]      | bob                           | string literal\n  +0x018F | 00                      | char         | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.names):\n  +0x0190 | 05 00 00 00             | uint32_t     | 0x00000005 (5)                | length of string\n  +0x0194 | 61 6C 69 63 65          | char[5]      | alice                         | string literal\n  +0x0199 | 00                      | char         | 0x00 (0)                      | string terminator\n\npadding:\n  +0x019A | 00 00                   | uint8_t[2]   | ..                            | padding\n\nstring (AnnotatedBinary.Foo.alice):\n  +0x019C | 07 00 00 00             | uint32_t     | 0x00000007 (7)                | length of string\n  +0x01A0 | 63 68 61 72 6C 69 65    | char[7]      | charlie                       | string literal\n  +0x01A7 | 00                      | char         | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.bob):\n  +0x01A8 | 07 00 00 00             | uint32_t     | 0x00000007 (7)                | length of string\n  +0x01AC | 63 68 61 72 6C 69 65    | char[7]      | charlie                       | string literal\n  +0x01B3 | 00                      | char         | 0x00 (0)                      | string terminator\n\nvector (AnnotatedBinary.Foo.accounts):\n  +0x01B4 | 09 00 00 00             | uint32_t     | 0x00000009 (9)                | length of vector (# items)\n  +0x01B8 | 09 00                   | uint16_t     | 0x0009 (9)                    | value[0]\n  +0x01BA | 08 00                   | uint16_t     | 0x0008 (8)                    | value[1]\n  +0x01BC | 07 00                   | uint16_t     | 0x0007 (7)                    | value[2]\n  +0x01BE | 01 00                   | uint16_t     | 0x0001 (1)                    | value[3]\n  +0x01C0 | 02 00                   | uint16_t     | 0x0002 (2)                    | value[4]\n  +0x01C2 | 03 00                   | uint16_t     | 0x0003 (3)                    | value[5]\n  +0x01C4 | 06 00                   | uint16_t     | 0x0006 (6)                    | value[6]\n  +0x01C6 | 05 00                   | uint16_t     | 0x0005 (5)                    | value[7]\n  +0x01C8 | 04 00                   | uint16_t     | 0x0004 (4)                    | value[8]\n\nunknown (no known references):\n  +0x01CA | 00 00 3A FF FF FF 00 00 | ?uint8_t[10] | ..:.....                      | WARN: nothing refers to this section.\n  +0x01D2 | 00 03                   |              | ..\n\nvector (AnnotatedBinary.Foo.bars):\n  +0x01D4 | 02 00 00 00             | uint32_t     | 0x00000002 (2)                | length of vector (# items)\n  +0x01D8 | 44 00 00 00             | UOffset32    | 0x00000044 (68) Loc: 0x021C   | offset to table[0]\n  +0x01DC | 10 00 00 00             | UOffset32    | 0x00000010 (16) Loc: 0x01EC   | offset to table[1]\n\npadding:\n  +0x01E0 | 00 00                   | uint8_t[2]   | ..                            | padding\n\nvtable (AnnotatedBinary.Bar):\n  +0x01E2 | 0A 00                   | uint16_t     | 0x000A (10)                   | size of this vtable\n  +0x01E4 | 1A 00                   | uint16_t     | 0x001A (26)                   | size of referring table\n  +0x01E6 | 0C 00                   | VOffset16    | 0x000C (12)                   | offset to field `a` (id: 0)\n  +0x01E8 | 04 00                   | VOffset16    | 0x0004 (4)                    | offset to field `b` (id: 1)\n  +0x01EA | 08 00                   | VOffset16    | 0x0008 (8)                    | offset to field `c` (id: 2)\n\ntable (AnnotatedBinary.Bar):\n  +0x01EC | 0A 00 00 00             | SOffset32    | 0x0000000A (10) Loc: 0x01E2   | offset to vtable\n  +0x01F0 | 00 80 23 44             | float        | 0x44238000 (654)              | table field `b` (Float)\n  +0x01F4 | 18 00 00 00             | UOffset32    | 0x00000018 (24) Loc: 0x020C   | offset to field `c` (table)\n  +0x01F8 | 00 00 00 00 00 D8 8E 40 | double       | 0x408ED80000000000 (987)      | table field `a` (Double)\n  +0x0200 | 00 00 00 00 00 00       | uint8_t[6]   | ......                        | padding\n\nvtable (AnnotatedBinary.Baz):\n  +0x0206 | 06 00                   | uint16_t     | 0x0006 (6)                    | size of this vtable\n  +0x0208 | 06 00                   | uint16_t     | 0x0006 (6)                    | size of referring table\n  +0x020A | 05 00                   | VOffset16    | 0x0005 (5)                    | offset to field `meal` (id: 0)\n\ntable (AnnotatedBinary.Baz):\n  +0x020C | 06 00 00 00             | SOffset32    | 0x00000006 (6) Loc: 0x0206    | offset to vtable\n  +0x0210 | 00                      | uint8_t[1]   | .                             | padding\n  +0x0211 | 03                      | uint8_t      | 0x03 (3)                      | table field `meal` (Byte)\n\nvtable (AnnotatedBinary.Bar):\n  +0x0212 | 0A 00                   | uint16_t     | 0x000A (10)                   | size of this vtable\n  +0x0214 | 18 00                   | uint16_t     | 0x0018 (24)                   | size of referring table\n  +0x0216 | 0C 00                   | VOffset16    | 0x000C (12)                   | offset to field `a` (id: 0)\n  +0x0218 | 04 00                   | VOffset16    | 0x0004 (4)                    | offset to field `b` (id: 1)\n  +0x021A | 08 00                   | VOffset16    | 0x0008 (8)                    | offset to field `c` (id: 2)\n\ntable (AnnotatedBinary.Bar):\n  +0x021C | 0A 00 00 00             | SOffset32    | 0x0000000A (10) Loc: 0x0212   | offset to vtable\n  +0x0220 | 00 00 E4 43             | float        | 0x43E40000 (456)              | table field `b` (Float)\n  +0x0224 | 10 00 00 00             | UOffset32    | 0x00000010 (16) Loc: 0x0234   | offset to field `c` (table)\n  +0x0228 | 00 00 00 00 00 C0 5E 40 | double       | 0x405EC00000000000 (123)      | table field `a` (Double)\n  +0x0230 | 00 00 00 00             | uint8_t[4]   | ....                          | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x0234 | A2 FF FF FF             | SOffset32    | 0xFFFFFFA2 (-94) Loc: 0x0292  | offset to vtable\n  +0x0238 | 00 00 00                | uint8_t[3]   | ...                           | padding\n  +0x023B | 01                      | uint8_t      | 0x01 (1)                      | table field `meal` (Byte)\n\nstring (AnnotatedBinary.Foo.name):\n  +0x023C | 2F 00 00 00             | uint32_t     | 0x0000002F (47)               | length of string\n  +0x0240 | 54 68 69 73 20 69 73 20 | char[47]     | This is                       | string literal\n  +0x0248 | 61 20 6C 6F 6E 67 20 73 |              | a long s\n  +0x0250 | 74 72 69 6E 67 20 74 6F |              | tring to\n  +0x0258 | 20 73 68 6F 77 20 68 6F |              |  show ho\n  +0x0260 | 77 20 69 74 20 62 72 65 |              | w it bre\n  +0x0268 | 61 6B 73 20 75 70 2E    |              | aks up.\n  +0x026F | 00                      | char         | 0x00 (0)                      | string terminator\n\npadding:\n  +0x0270 | 00 00                   | uint8_t[2]   | ..                            | padding\n\nvtable (AnnotatedBinary.Bar):\n  +0x0272 | 0A 00                   | uint16_t     | 0x000A (10)                   | size of this vtable\n  +0x0274 | 16 00                   | uint16_t     | 0x0016 (22)                   | size of referring table\n  +0x0276 | 0C 00                   | VOffset16    | 0x000C (12)                   | offset to field `a` (id: 0)\n  +0x0278 | 04 00                   | VOffset16    | 0x0004 (4)                    | offset to field `b` (id: 1)\n  +0x027A | 08 00                   | VOffset16    | 0x0008 (8)                    | offset to field `c` (id: 2)\n\ntable (AnnotatedBinary.Bar):\n  +0x027C | 0A 00 00 00             | SOffset32    | 0x0000000A (10) Loc: 0x0272   | offset to vtable\n  +0x0280 | 65 20 71 49             | float        | 0x49712065 (987654)           | table field `b` (Float)\n  +0x0284 | 14 00 00 00             | UOffset32    | 0x00000014 (20) Loc: 0x0298   | offset to field `c` (table)\n  +0x0288 | C9 76 BE 9F 0C 24 FE 40 | double       | 0x40FE240C9FBE76C9 (123457)   | table field `a` (Double)\n  +0x0290 | 00 00                   | uint8_t[2]   | ..                            | padding\n\nvtable (AnnotatedBinary.Baz):\n  +0x0292 | 06 00                   | uint16_t     | 0x0006 (6)                    | size of this vtable\n  +0x0294 | 08 00                   | uint16_t     | 0x0008 (8)                    | size of referring table\n  +0x0296 | 07 00                   | VOffset16    | 0x0007 (7)                    | offset to field `meal` (id: 0)\n\ntable (AnnotatedBinary.Baz):\n  +0x0298 | 06 00 00 00             | SOffset32    | 0x00000006 (6) Loc: 0x0292    | offset to vtable\n  +0x029C | 00 00 00                | uint8_t[3]   | ...                           | padding\n  +0x029F | 01                      | uint8_t      | 0x01 (1)                      | table field `meal` (Byte)\n"
  },
  {
    "path": "tests/annotated_binary/tests/invalid_vector_length_cut_short.afb",
    "content": "// Annotated Flatbuffer Binary\n//\n// Schema file: annotated_binary.fbs\n// Binary file: tests/invalid_vector_length_cut_short.bin\n\nheader:\n  +0x0000 | 44 00 00 00             | UOffset32    | 0x00000044 (68) Loc: 0x0044   | offset to root table `AnnotatedBinary.Foo`\n  +0x0004 | 41 4E 4E 4F             | char[4]      | ANNO                          | File Identifier\n\npadding:\n  +0x0008 | 00 00                   | uint8_t[2]   | ..                            | padding\n\nvtable (AnnotatedBinary.Foo):\n  +0x000A | 3A 00                   | uint16_t     | 0x003A (58)                   | size of this vtable\n  +0x000C | 68 00                   | uint16_t     | 0x0068 (104)                  | size of referring table\n  +0x000E | 0C 00                   | VOffset16    | 0x000C (12)                   | offset to field `counter` (id: 0)\n  +0x0010 | 07 00                   | VOffset16    | 0x0007 (7)                    | offset to field `healthy` (id: 1)\n  +0x0012 | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `level` (id: 2) <defaults to 99> (Long)\n  +0x0014 | 08 00                   | VOffset16    | 0x0008 (8)                    | offset to field `meal` (id: 3)\n  +0x0016 | 10 00                   | VOffset16    | 0x0010 (16)                   | offset to field `bar` (id: 4)\n  +0x0018 | 14 00                   | VOffset16    | 0x0014 (20)                   | offset to field `home` (id: 5)\n  +0x001A | 30 00                   | VOffset16    | 0x0030 (48)                   | offset to field `name` (id: 6)\n  +0x001C | 34 00                   | VOffset16    | 0x0034 (52)                   | offset to field `bars` (id: 7)\n  +0x001E | 09 00                   | VOffset16    | 0x0009 (9)                    | offset to field `bar_baz_type` (id: 8)\n  +0x0020 | 38 00                   | VOffset16    | 0x0038 (56)                   | offset to field `bar_baz` (id: 9)\n  +0x0022 | 3C 00                   | VOffset16    | 0x003C (60)                   | offset to field `accounts` (id: 10)\n  +0x0024 | 40 00                   | VOffset16    | 0x0040 (64)                   | offset to field `bob` (id: 11)\n  +0x0026 | 44 00                   | VOffset16    | 0x0044 (68)                   | offset to field `alice` (id: 12)\n  +0x0028 | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `maybe_i32` (id: 13) <defaults to 0> (Int)\n  +0x002A | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `default_i32` (id: 14) <defaults to 42> (Int)\n  +0x002C | 48 00                   | VOffset16    | 0x0048 (72)                   | offset to field `just_i32` (id: 15)\n  +0x002E | 4C 00                   | VOffset16    | 0x004C (76)                   | offset to field `names` (id: 16)\n  +0x0030 | 50 00                   | VOffset16    | 0x0050 (80)                   | offset to field `points_of_interest` (id: 17)\n  +0x0032 | 54 00                   | VOffset16    | 0x0054 (84)                   | offset to field `foobars_type` (id: 18)\n  +0x0034 | 58 00                   | VOffset16    | 0x0058 (88)                   | offset to field `foobars` (id: 19)\n  +0x0036 | 0A 00                   | VOffset16    | 0x000A (10)                   | offset to field `measurement_type` (id: 20)\n  +0x0038 | 5C 00                   | VOffset16    | 0x005C (92)                   | offset to field `measurement` (id: 21)\n  +0x003A | 0B 00                   | VOffset16    | 0x000B (11)                   | offset to field `anything_type` (id: 22)\n  +0x003C | 60 00                   | VOffset16    | 0x0060 (96)                   | offset to field `anything` (id: 23)\n  +0x003E | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `temperature` (id: 24) <defaults to 98.600000> (Float)\n  +0x0040 | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `teetotaler` (id: 25) <null> (Obj)\n  +0x0042 | 64 00                   | VOffset16    | 0x0064 (100)                  | offset to field `charlie` (id: 26)\n\nroot_table (AnnotatedBinary.Foo):\n  +0x0044 | 3A 00 00 00             | SOffset32    | 0x0000003A (58) Loc: 0x000A   | offset to vtable\n  +0x0048 | 00 00 00                | uint8_t[3]   | ...                           | padding\n  +0x004B | 01                      | uint8_t      | 0x01 (1)                      | table field `healthy` (Bool)\n  +0x004C | 02                      | uint8_t      | 0x02 (2)                      | table field `meal` (Byte)\n  +0x004D | 02                      | UType8       | 0x02 (2)                      | table field `bar_baz_type` (UType)\n  +0x004E | 01                      | UType8       | 0x01 (1)                      | table field `measurement_type` (UType)\n  +0x004F | 01                      | UType8       | 0x01 (1)                      | table field `anything_type` (UType)\n  +0x0050 | D2 04 00 00             | uint32_t     | 0x000004D2 (1234)             | table field `counter` (Int)\n  +0x0054 | 28 02 00 00             | UOffset32    | 0x00000228 (552) Loc: 0x027C  | ERROR: offset to field `bar`. Invalid offset, points outside the binary.\n  +0x0058 | 01 00 00 00             | uint32_t     | 0x00000001 (1)                | struct field `home.floors` of 'AnnotatedBinary.Building' (Int)\n  +0x005C | 02 00 00 00             | uint32_t     | 0x00000002 (2)                | struct field `home.doors` of 'AnnotatedBinary.Building' (Int)\n  +0x0060 | 0C 00 00 00             | uint32_t     | 0x0000000C (12)               | struct field `home.windows` of 'AnnotatedBinary.Building' (Int)\n  +0x0064 | 0A 00 00 00             | uint32_t     | 0x0000000A (10)               | array field `home.dimensions.values`[0] of 'AnnotatedBinary.Dimension' (Int)\n  +0x0068 | 0C 00 00 00             | uint32_t     | 0x0000000C (12)               | array field `home.dimensions.values`[1] of 'AnnotatedBinary.Dimension' (Int)\n  +0x006C | 14 00 00 00             | uint32_t     | 0x00000014 (20)               | array field `home.dimensions.values`[2] of 'AnnotatedBinary.Dimension' (Int)\n  +0x0070 | 01                      | uint8_t      | 0x01 (1)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0071 | 02                      | uint8_t      | 0x02 (2)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0072 | 03                      | uint8_t      | 0x03 (3)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0073 | 00                      | uint8_t[1]   | .                             | padding\n  +0x0074 | C8 01 00 00             | UOffset32    | 0x000001C8 (456) Loc: 0x023C  | ERROR: offset to field `name`. Invalid offset, points outside the binary.\n  +0x0078 | 5C 01 00 00             | UOffset32    | 0x0000015C (348) Loc: 0x01D4  | ERROR: offset to field `bars`. Invalid offset, points outside the binary.\n  +0x007C | 50 01 00 00             | UOffset32    | 0x00000150 (336) Loc: 0x01CC  | ERROR: offset to field `bar_baz`. Invalid offset, points outside the binary.\n  +0x0080 | 34 01 00 00             | UOffset32    | 0x00000134 (308) Loc: 0x01B4  | ERROR: offset to field `accounts`. Invalid offset, points outside the binary.\n  +0x0084 | 24 01 00 00             | UOffset32    | 0x00000124 (292) Loc: 0x01A8  | ERROR: offset to field `bob`. Invalid offset, points outside the binary.\n  +0x0088 | 14 01 00 00             | UOffset32    | 0x00000114 (276) Loc: 0x019C  | ERROR: offset to field `alice`. Invalid offset, points outside the binary.\n  +0x008C | 0D 00 00 00             | uint32_t     | 0x0000000D (13)               | table field `just_i32` (Int)\n  +0x0090 | DC 00 00 00             | UOffset32    | 0x000000DC (220) Loc: 0x016C  | ERROR: offset to field `names`. Invalid offset, points outside the binary.\n  +0x0094 | A0 00 00 00             | UOffset32    | 0x000000A0 (160) Loc: 0x0134  | offset to field `points_of_interest` (vector)\n  +0x0098 | 94 00 00 00             | UOffset32    | 0x00000094 (148) Loc: 0x012C  | offset to field `foobars_type` (vector)\n  +0x009C | 38 00 00 00             | UOffset32    | 0x00000038 (56) Loc: 0x00D4   | offset to field `foobars` (vector)\n  +0x00A0 | 33 00 00 00             | UOffset32    | 0x00000033 (51) Loc: 0x00D3   | offset to field `measurement` (union of type `Tolerance`)\n  +0x00A4 | 1C 00 00 00             | UOffset32    | 0x0000001C (28) Loc: 0x00C0   | offset to field `anything` (union of type `Bar`)\n  +0x00A8 | 04 00 00 00             | UOffset32    | 0x00000004 (4) Loc: 0x00AC    | offset to field `charlie` (string)\n\nstring (AnnotatedBinary.Foo.charlie):\n  +0x00AC | 05 00 00 00             | uint32_t     | 0x00000005 (5)                | length of string\n  +0x00B0 | 61 6C 69 63 65          | char[5]      | alice                         | string literal\n  +0x00B5 | 00                      | char         | 0x00 (0)                      | string terminator\n\npadding:\n  +0x00B6 | 00 00                   | uint8_t[2]   | ..                            | padding\n\nvtable (AnnotatedBinary.Bar):\n  +0x00B8 | 08 00                   | uint16_t     | 0x0008 (8)                    | size of this vtable\n  +0x00BA | 13 00                   | uint16_t     | 0x0013 (19)                   | size of referring table\n  +0x00BC | 08 00                   | VOffset16    | 0x0008 (8)                    | offset to field `a` (id: 0)\n  +0x00BE | 04 00                   | VOffset16    | 0x0004 (4)                    | offset to field `b` (id: 1)\n\ntable (AnnotatedBinary.Bar):\n  +0x00C0 | 08 00 00 00             | SOffset32    | 0x00000008 (8) Loc: 0x00B8    | offset to vtable\n  +0x00C4 | 00 80 23 44             | float        | 0x44238000 (654)              | table field `b` (Float)\n  +0x00C8 | 00 00 00 00 00 10 74 40 | double       | 0x4074100000000000 (321)      | table field `a` (Double)\n  +0x00D0 | 00 00 00                | uint8_t[3]   | ...                           | padding\n\nunion (AnnotatedBinary.Tolerance.measurement):\n  +0x00D3 | 05                      | uint8_t      | 0x05 (5)                      | struct field `measurement.width` of 'AnnotatedBinary.Tolerance' (UByte)\n\nvector (AnnotatedBinary.Foo.foobars):\n  +0x00D4 | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x00D8 | 34 00 00 00             | UOffset32    | 0x00000034 (52) Loc: 0x010C   | offset to union[0] (`Bar`)\n  +0x00DC | 2C 00 00 00             | UOffset32    | 0x0000002C (44) Loc: 0x0108   | offset to union[1] (`Baz`)\n  +0x00E0 | 04 00 00 00             | UOffset32    | 0x00000004 (4) Loc: 0x00E4    | offset to union[2] (`Bar`)\n\ntable (AnnotatedBinary.Bar):\n  +0x00E4 | D2 FE FF FF             | SOffset32    | 0xFFFFFED2 (-302) Loc: 0x0212 | ERROR: offset to vtable. Invalid offset, points outside the binary.\n\nunknown (no known references):\n  +0x00E8 | 00 80 23 44 10 00 00 00 | ?uint8_t[28] | ..#D....                      | WARN: nothing refers to this section.\n  +0x00F0 | 00 00 00 00 00 D8 8E 40 |              | .......@\n  +0x00F8 | 00 00 00 00 6A FE FF FF |              | ....j...\n  +0x0100 | 00 00 00 03             |              | ....\n\nvtable (AnnotatedBinary.Baz):\n  +0x0104 | 04 00                   | uint16_t     | 0x0004 (4)                    | size of this vtable\n  +0x0106 | 04 00                   | uint16_t     | 0x0004 (4)                    | size of referring table\n\ntable (AnnotatedBinary.Baz):\n  +0x0108 | 04 00 00 00             | SOffset32    | 0x00000004 (4) Loc: 0x0104    | offset to vtable\n\ntable (AnnotatedBinary.Bar):\n  +0x010C | FA FE FF FF             | SOffset32    | 0xFFFFFEFA (-262) Loc: 0x0212 | ERROR: offset to vtable. Invalid offset, points outside the binary.\n\nunknown (no known references):\n  +0x0110 | 00 00 E4 43 10 00 00 00 | ?uint8_t[28] | ...C....                      | WARN: nothing refers to this section.\n  +0x0118 | 00 00 00 00 00 C0 5E 40 |              | ......^@\n  +0x0120 | 00 00 00 00 92 FE FF FF |              | ........\n  +0x0128 | 00 00 00 01             |              | ....\n\nvector (AnnotatedBinary.Foo.foobars_type):\n  +0x012C | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x0130 | 01                      | UType8       | 0x01 (1)                      | value[0]\n  +0x0131 | 02                      | UType8       | 0x02 (2)                      | value[1]\n  +0x0132 | 01                      | UType8       | 0x01 (1)                      | value[2]\n\nvector (AnnotatedBinary.Foo.points_of_interest):\n  +0x0134 | 03 00                   | ?uint8_t[2]  | ..                            | ERROR: length of vector (# items). Incomplete binary, expected to read 4 bytes.\n"
  },
  {
    "path": "tests/annotated_binary/tests/invalid_vector_scalars_cut_short.afb",
    "content": "// Annotated Flatbuffer Binary\n//\n// Schema file: annotated_binary.fbs\n// Binary file: tests/invalid_vector_scalars_cut_short.bin\n\nheader:\n  +0x0000 | 44 00 00 00             | UOffset32    | 0x00000044 (68) Loc: 0x0044   | offset to root table `AnnotatedBinary.Foo`\n  +0x0004 | 41 4E 4E 4F             | char[4]      | ANNO                          | File Identifier\n\npadding:\n  +0x0008 | 00 00                   | uint8_t[2]   | ..                            | padding\n\nvtable (AnnotatedBinary.Foo):\n  +0x000A | 3A 00                   | uint16_t     | 0x003A (58)                   | size of this vtable\n  +0x000C | 68 00                   | uint16_t     | 0x0068 (104)                  | size of referring table\n  +0x000E | 0C 00                   | VOffset16    | 0x000C (12)                   | offset to field `counter` (id: 0)\n  +0x0010 | 07 00                   | VOffset16    | 0x0007 (7)                    | offset to field `healthy` (id: 1)\n  +0x0012 | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `level` (id: 2) <defaults to 99> (Long)\n  +0x0014 | 08 00                   | VOffset16    | 0x0008 (8)                    | offset to field `meal` (id: 3)\n  +0x0016 | 10 00                   | VOffset16    | 0x0010 (16)                   | offset to field `bar` (id: 4)\n  +0x0018 | 14 00                   | VOffset16    | 0x0014 (20)                   | offset to field `home` (id: 5)\n  +0x001A | 30 00                   | VOffset16    | 0x0030 (48)                   | offset to field `name` (id: 6)\n  +0x001C | 34 00                   | VOffset16    | 0x0034 (52)                   | offset to field `bars` (id: 7)\n  +0x001E | 09 00                   | VOffset16    | 0x0009 (9)                    | offset to field `bar_baz_type` (id: 8)\n  +0x0020 | 38 00                   | VOffset16    | 0x0038 (56)                   | offset to field `bar_baz` (id: 9)\n  +0x0022 | 3C 00                   | VOffset16    | 0x003C (60)                   | offset to field `accounts` (id: 10)\n  +0x0024 | 40 00                   | VOffset16    | 0x0040 (64)                   | offset to field `bob` (id: 11)\n  +0x0026 | 44 00                   | VOffset16    | 0x0044 (68)                   | offset to field `alice` (id: 12)\n  +0x0028 | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `maybe_i32` (id: 13) <defaults to 0> (Int)\n  +0x002A | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `default_i32` (id: 14) <defaults to 42> (Int)\n  +0x002C | 48 00                   | VOffset16    | 0x0048 (72)                   | offset to field `just_i32` (id: 15)\n  +0x002E | 4C 00                   | VOffset16    | 0x004C (76)                   | offset to field `names` (id: 16)\n  +0x0030 | 50 00                   | VOffset16    | 0x0050 (80)                   | offset to field `points_of_interest` (id: 17)\n  +0x0032 | 54 00                   | VOffset16    | 0x0054 (84)                   | offset to field `foobars_type` (id: 18)\n  +0x0034 | 58 00                   | VOffset16    | 0x0058 (88)                   | offset to field `foobars` (id: 19)\n  +0x0036 | 0A 00                   | VOffset16    | 0x000A (10)                   | offset to field `measurement_type` (id: 20)\n  +0x0038 | 5C 00                   | VOffset16    | 0x005C (92)                   | offset to field `measurement` (id: 21)\n  +0x003A | 0B 00                   | VOffset16    | 0x000B (11)                   | offset to field `anything_type` (id: 22)\n  +0x003C | 60 00                   | VOffset16    | 0x0060 (96)                   | offset to field `anything` (id: 23)\n  +0x003E | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `temperature` (id: 24) <defaults to 98.600000> (Float)\n  +0x0040 | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `teetotaler` (id: 25) <null> (Obj)\n  +0x0042 | 64 00                   | VOffset16    | 0x0064 (100)                  | offset to field `charlie` (id: 26)\n\nroot_table (AnnotatedBinary.Foo):\n  +0x0044 | 3A 00 00 00             | SOffset32    | 0x0000003A (58) Loc: 0x000A   | offset to vtable\n  +0x0048 | 00 00 00                | uint8_t[3]   | ...                           | padding\n  +0x004B | 01                      | uint8_t      | 0x01 (1)                      | table field `healthy` (Bool)\n  +0x004C | 02                      | uint8_t      | 0x02 (2)                      | table field `meal` (Byte)\n  +0x004D | 02                      | UType8       | 0x02 (2)                      | table field `bar_baz_type` (UType)\n  +0x004E | 01                      | UType8       | 0x01 (1)                      | table field `measurement_type` (UType)\n  +0x004F | 01                      | UType8       | 0x01 (1)                      | table field `anything_type` (UType)\n  +0x0050 | D2 04 00 00             | uint32_t     | 0x000004D2 (1234)             | table field `counter` (Int)\n  +0x0054 | 28 02 00 00             | UOffset32    | 0x00000228 (552) Loc: 0x027C  | ERROR: offset to field `bar`. Invalid offset, points outside the binary.\n  +0x0058 | 01 00 00 00             | uint32_t     | 0x00000001 (1)                | struct field `home.floors` of 'AnnotatedBinary.Building' (Int)\n  +0x005C | 02 00 00 00             | uint32_t     | 0x00000002 (2)                | struct field `home.doors` of 'AnnotatedBinary.Building' (Int)\n  +0x0060 | 0C 00 00 00             | uint32_t     | 0x0000000C (12)               | struct field `home.windows` of 'AnnotatedBinary.Building' (Int)\n  +0x0064 | 0A 00 00 00             | uint32_t     | 0x0000000A (10)               | array field `home.dimensions.values`[0] of 'AnnotatedBinary.Dimension' (Int)\n  +0x0068 | 0C 00 00 00             | uint32_t     | 0x0000000C (12)               | array field `home.dimensions.values`[1] of 'AnnotatedBinary.Dimension' (Int)\n  +0x006C | 14 00 00 00             | uint32_t     | 0x00000014 (20)               | array field `home.dimensions.values`[2] of 'AnnotatedBinary.Dimension' (Int)\n  +0x0070 | 01                      | uint8_t      | 0x01 (1)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0071 | 02                      | uint8_t      | 0x02 (2)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0072 | 03                      | uint8_t      | 0x03 (3)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0073 | 00                      | uint8_t[1]   | .                             | padding\n  +0x0074 | C8 01 00 00             | UOffset32    | 0x000001C8 (456) Loc: 0x023C  | ERROR: offset to field `name`. Invalid offset, points outside the binary.\n  +0x0078 | 5C 01 00 00             | UOffset32    | 0x0000015C (348) Loc: 0x01D4  | ERROR: offset to field `bars`. Invalid offset, points outside the binary.\n  +0x007C | 50 01 00 00             | UOffset32    | 0x00000150 (336) Loc: 0x01CC  | ERROR: offset to field `bar_baz`. Invalid offset, points outside the binary.\n  +0x0080 | 34 01 00 00             | UOffset32    | 0x00000134 (308) Loc: 0x01B4  | offset to field `accounts` (vector)\n  +0x0084 | 24 01 00 00             | UOffset32    | 0x00000124 (292) Loc: 0x01A8  | offset to field `bob` (string)\n  +0x0088 | 14 01 00 00             | UOffset32    | 0x00000114 (276) Loc: 0x019C  | offset to field `alice` (string)\n  +0x008C | 0D 00 00 00             | uint32_t     | 0x0000000D (13)               | table field `just_i32` (Int)\n  +0x0090 | DC 00 00 00             | UOffset32    | 0x000000DC (220) Loc: 0x016C  | offset to field `names` (vector)\n  +0x0094 | A0 00 00 00             | UOffset32    | 0x000000A0 (160) Loc: 0x0134  | offset to field `points_of_interest` (vector)\n  +0x0098 | 94 00 00 00             | UOffset32    | 0x00000094 (148) Loc: 0x012C  | offset to field `foobars_type` (vector)\n  +0x009C | 38 00 00 00             | UOffset32    | 0x00000038 (56) Loc: 0x00D4   | offset to field `foobars` (vector)\n  +0x00A0 | 33 00 00 00             | UOffset32    | 0x00000033 (51) Loc: 0x00D3   | offset to field `measurement` (union of type `Tolerance`)\n  +0x00A4 | 1C 00 00 00             | UOffset32    | 0x0000001C (28) Loc: 0x00C0   | offset to field `anything` (union of type `Bar`)\n  +0x00A8 | 04 00 00 00             | UOffset32    | 0x00000004 (4) Loc: 0x00AC    | offset to field `charlie` (string)\n\nstring (AnnotatedBinary.Foo.charlie):\n  +0x00AC | 05 00 00 00             | uint32_t     | 0x00000005 (5)                | length of string\n  +0x00B0 | 61 6C 69 63 65          | char[5]      | alice                         | string literal\n  +0x00B5 | 00                      | char         | 0x00 (0)                      | string terminator\n\npadding:\n  +0x00B6 | 00 00                   | uint8_t[2]   | ..                            | padding\n\nvtable (AnnotatedBinary.Bar):\n  +0x00B8 | 08 00                   | uint16_t     | 0x0008 (8)                    | size of this vtable\n  +0x00BA | 13 00                   | uint16_t     | 0x0013 (19)                   | size of referring table\n  +0x00BC | 08 00                   | VOffset16    | 0x0008 (8)                    | offset to field `a` (id: 0)\n  +0x00BE | 04 00                   | VOffset16    | 0x0004 (4)                    | offset to field `b` (id: 1)\n\ntable (AnnotatedBinary.Bar):\n  +0x00C0 | 08 00 00 00             | SOffset32    | 0x00000008 (8) Loc: 0x00B8    | offset to vtable\n  +0x00C4 | 00 80 23 44             | float        | 0x44238000 (654)              | table field `b` (Float)\n  +0x00C8 | 00 00 00 00 00 10 74 40 | double       | 0x4074100000000000 (321)      | table field `a` (Double)\n  +0x00D0 | 00 00 00                | uint8_t[3]   | ...                           | padding\n\nunion (AnnotatedBinary.Tolerance.measurement):\n  +0x00D3 | 05                      | uint8_t      | 0x05 (5)                      | struct field `measurement.width` of 'AnnotatedBinary.Tolerance' (UByte)\n\nvector (AnnotatedBinary.Foo.foobars):\n  +0x00D4 | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x00D8 | 34 00 00 00             | UOffset32    | 0x00000034 (52) Loc: 0x010C   | offset to union[0] (`Bar`)\n  +0x00DC | 2C 00 00 00             | UOffset32    | 0x0000002C (44) Loc: 0x0108   | offset to union[1] (`Baz`)\n  +0x00E0 | 04 00 00 00             | UOffset32    | 0x00000004 (4) Loc: 0x00E4    | offset to union[2] (`Bar`)\n\ntable (AnnotatedBinary.Bar):\n  +0x00E4 | D2 FE FF FF             | SOffset32    | 0xFFFFFED2 (-302) Loc: 0x0212 | ERROR: offset to vtable. Invalid offset, points outside the binary.\n\nunknown (no known references):\n  +0x00E8 | 00 80 23 44 10 00 00 00 | ?uint8_t[28] | ..#D....                      | WARN: nothing refers to this section.\n  +0x00F0 | 00 00 00 00 00 D8 8E 40 |              | .......@\n  +0x00F8 | 00 00 00 00 6A FE FF FF |              | ....j...\n  +0x0100 | 00 00 00 03             |              | ....\n\nvtable (AnnotatedBinary.Baz):\n  +0x0104 | 04 00                   | uint16_t     | 0x0004 (4)                    | size of this vtable\n  +0x0106 | 04 00                   | uint16_t     | 0x0004 (4)                    | size of referring table\n\ntable (AnnotatedBinary.Baz):\n  +0x0108 | 04 00 00 00             | SOffset32    | 0x00000004 (4) Loc: 0x0104    | offset to vtable\n\ntable (AnnotatedBinary.Bar):\n  +0x010C | FA FE FF FF             | SOffset32    | 0xFFFFFEFA (-262) Loc: 0x0212 | ERROR: offset to vtable. Invalid offset, points outside the binary.\n\nunknown (no known references):\n  +0x0110 | 00 00 E4 43 10 00 00 00 | ?uint8_t[28] | ...C....                      | WARN: nothing refers to this section.\n  +0x0118 | 00 00 00 00 00 C0 5E 40 |              | ......^@\n  +0x0120 | 00 00 00 00 92 FE FF FF |              | ........\n  +0x0128 | 00 00 00 01             |              | ....\n\nvector (AnnotatedBinary.Foo.foobars_type):\n  +0x012C | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x0130 | 01                      | UType8       | 0x01 (1)                      | value[0]\n  +0x0131 | 02                      | UType8       | 0x02 (2)                      | value[1]\n  +0x0132 | 01                      | UType8       | 0x01 (1)                      | value[2]\n\nvector (AnnotatedBinary.Foo.points_of_interest):\n  +0x0134 | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x0138 | 33 33 33 33 33 A3 45 40 | double       | 0x4045A33333333333 (43.275)   | struct field `[0].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0140 | 7E 57 04 FF 5B 87 53 C0 | double       | 0xC053875BFF04577E (-78.115)  | struct field `[0].longitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0148 | 8D F0 F6 20 04 B6 42 40 | double       | 0x4042B60420F6F08D (37.422)   | struct field `[1].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0150 | 9F 77 63 41 61 85 5E C0 | double       | 0xC05E85614163779F (-122.084) | struct field `[1].longitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0158 | 8F 35 23 83 DC 35 4B C0 | double       | 0xC04B35DC8323358F (-54.4208) | struct field `[2].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0160 | F6 97 DD 93 87 C5 0A 40 | double       | 0x400AC58793DD97F6 (3.34645)  | struct field `[2].longitude` of 'AnnotatedBinary.Location' (Double)\n\npadding:\n  +0x0168 | 00 00 00 00             | uint8_t[4]   | ....                          | padding\n\nvector (AnnotatedBinary.Foo.names):\n  +0x016C | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x0170 | 20 00 00 00             | UOffset32    | 0x00000020 (32) Loc: 0x0190   | offset to string[0]\n  +0x0174 | 14 00 00 00             | UOffset32    | 0x00000014 (20) Loc: 0x0188   | offset to string[1]\n  +0x0178 | 04 00 00 00             | UOffset32    | 0x00000004 (4) Loc: 0x017C    | offset to string[2]\n\nstring (AnnotatedBinary.Foo.names):\n  +0x017C | 07 00 00 00             | uint32_t     | 0x00000007 (7)                | length of string\n  +0x0180 | 63 68 61 72 6C 69 65    | char[7]      | charlie                       | string literal\n  +0x0187 | 00                      | char         | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.names):\n  +0x0188 | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of string\n  +0x018C | 62 6F 62                | char[3]      | bob                           | string literal\n  +0x018F | 00                      | char         | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.names):\n  +0x0190 | 05 00 00 00             | uint32_t     | 0x00000005 (5)                | length of string\n  +0x0194 | 61 6C 69 63 65          | char[5]      | alice                         | string literal\n  +0x0199 | 00                      | char         | 0x00 (0)                      | string terminator\n\npadding:\n  +0x019A | 00 00                   | uint8_t[2]   | ..                            | padding\n\nstring (AnnotatedBinary.Foo.alice):\n  +0x019C | 07 00 00 00             | uint32_t     | 0x00000007 (7)                | length of string\n  +0x01A0 | 63 68 61 72 6C 69 65    | char[7]      | charlie                       | string literal\n  +0x01A7 | 00                      | char         | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.bob):\n  +0x01A8 | 07 00 00 00             | uint32_t     | 0x00000007 (7)                | length of string\n  +0x01AC | 63 68 61 72 6C 69 65    | char[7]      | charlie                       | string literal\n  +0x01B3 | 00                      | char         | 0x00 (0)                      | string terminator\n\nvector (AnnotatedBinary.Foo.accounts):\n  +0x01B4 | 09 00 00 00             | uint32_t     | 0x00000009 (9)                | ERROR: length of vector (# items). Longer than the binary.\n\nunknown (no known references):\n  +0x01B8 | 09 00 08 00 07 00 01 00 | ?uint8_t[9]  | ........                      | WARN: nothing refers to this section.\n  +0x01C0 | 02                      |              | .\n"
  },
  {
    "path": "tests/annotated_binary/tests/invalid_vector_strings_cut_short.afb",
    "content": "// Annotated Flatbuffer Binary\n//\n// Schema file: annotated_binary.fbs\n// Binary file: tests/invalid_vector_strings_cut_short.bin\n\nheader:\n  +0x0000 | 44 00 00 00             | UOffset32    | 0x00000044 (68) Loc: 0x0044   | offset to root table `AnnotatedBinary.Foo`\n  +0x0004 | 41 4E 4E 4F             | char[4]      | ANNO                          | File Identifier\n\npadding:\n  +0x0008 | 00 00                   | uint8_t[2]   | ..                            | padding\n\nvtable (AnnotatedBinary.Foo):\n  +0x000A | 3A 00                   | uint16_t     | 0x003A (58)                   | size of this vtable\n  +0x000C | 68 00                   | uint16_t     | 0x0068 (104)                  | size of referring table\n  +0x000E | 0C 00                   | VOffset16    | 0x000C (12)                   | offset to field `counter` (id: 0)\n  +0x0010 | 07 00                   | VOffset16    | 0x0007 (7)                    | offset to field `healthy` (id: 1)\n  +0x0012 | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `level` (id: 2) <defaults to 99> (Long)\n  +0x0014 | 08 00                   | VOffset16    | 0x0008 (8)                    | offset to field `meal` (id: 3)\n  +0x0016 | 10 00                   | VOffset16    | 0x0010 (16)                   | offset to field `bar` (id: 4)\n  +0x0018 | 14 00                   | VOffset16    | 0x0014 (20)                   | offset to field `home` (id: 5)\n  +0x001A | 30 00                   | VOffset16    | 0x0030 (48)                   | offset to field `name` (id: 6)\n  +0x001C | 34 00                   | VOffset16    | 0x0034 (52)                   | offset to field `bars` (id: 7)\n  +0x001E | 09 00                   | VOffset16    | 0x0009 (9)                    | offset to field `bar_baz_type` (id: 8)\n  +0x0020 | 38 00                   | VOffset16    | 0x0038 (56)                   | offset to field `bar_baz` (id: 9)\n  +0x0022 | 3C 00                   | VOffset16    | 0x003C (60)                   | offset to field `accounts` (id: 10)\n  +0x0024 | 40 00                   | VOffset16    | 0x0040 (64)                   | offset to field `bob` (id: 11)\n  +0x0026 | 44 00                   | VOffset16    | 0x0044 (68)                   | offset to field `alice` (id: 12)\n  +0x0028 | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `maybe_i32` (id: 13) <defaults to 0> (Int)\n  +0x002A | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `default_i32` (id: 14) <defaults to 42> (Int)\n  +0x002C | 48 00                   | VOffset16    | 0x0048 (72)                   | offset to field `just_i32` (id: 15)\n  +0x002E | 4C 00                   | VOffset16    | 0x004C (76)                   | offset to field `names` (id: 16)\n  +0x0030 | 50 00                   | VOffset16    | 0x0050 (80)                   | offset to field `points_of_interest` (id: 17)\n  +0x0032 | 54 00                   | VOffset16    | 0x0054 (84)                   | offset to field `foobars_type` (id: 18)\n  +0x0034 | 58 00                   | VOffset16    | 0x0058 (88)                   | offset to field `foobars` (id: 19)\n  +0x0036 | 0A 00                   | VOffset16    | 0x000A (10)                   | offset to field `measurement_type` (id: 20)\n  +0x0038 | 5C 00                   | VOffset16    | 0x005C (92)                   | offset to field `measurement` (id: 21)\n  +0x003A | 0B 00                   | VOffset16    | 0x000B (11)                   | offset to field `anything_type` (id: 22)\n  +0x003C | 60 00                   | VOffset16    | 0x0060 (96)                   | offset to field `anything` (id: 23)\n  +0x003E | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `temperature` (id: 24) <defaults to 98.600000> (Float)\n  +0x0040 | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `teetotaler` (id: 25) <null> (Obj)\n  +0x0042 | 64 00                   | VOffset16    | 0x0064 (100)                  | offset to field `charlie` (id: 26)\n\nroot_table (AnnotatedBinary.Foo):\n  +0x0044 | 3A 00 00 00             | SOffset32    | 0x0000003A (58) Loc: 0x000A   | offset to vtable\n  +0x0048 | 00 00 00                | uint8_t[3]   | ...                           | padding\n  +0x004B | 01                      | uint8_t      | 0x01 (1)                      | table field `healthy` (Bool)\n  +0x004C | 02                      | uint8_t      | 0x02 (2)                      | table field `meal` (Byte)\n  +0x004D | 02                      | UType8       | 0x02 (2)                      | table field `bar_baz_type` (UType)\n  +0x004E | 01                      | UType8       | 0x01 (1)                      | table field `measurement_type` (UType)\n  +0x004F | 01                      | UType8       | 0x01 (1)                      | table field `anything_type` (UType)\n  +0x0050 | D2 04 00 00             | uint32_t     | 0x000004D2 (1234)             | table field `counter` (Int)\n  +0x0054 | 28 02 00 00             | UOffset32    | 0x00000228 (552) Loc: 0x027C  | ERROR: offset to field `bar`. Invalid offset, points outside the binary.\n  +0x0058 | 01 00 00 00             | uint32_t     | 0x00000001 (1)                | struct field `home.floors` of 'AnnotatedBinary.Building' (Int)\n  +0x005C | 02 00 00 00             | uint32_t     | 0x00000002 (2)                | struct field `home.doors` of 'AnnotatedBinary.Building' (Int)\n  +0x0060 | 0C 00 00 00             | uint32_t     | 0x0000000C (12)               | struct field `home.windows` of 'AnnotatedBinary.Building' (Int)\n  +0x0064 | 0A 00 00 00             | uint32_t     | 0x0000000A (10)               | array field `home.dimensions.values`[0] of 'AnnotatedBinary.Dimension' (Int)\n  +0x0068 | 0C 00 00 00             | uint32_t     | 0x0000000C (12)               | array field `home.dimensions.values`[1] of 'AnnotatedBinary.Dimension' (Int)\n  +0x006C | 14 00 00 00             | uint32_t     | 0x00000014 (20)               | array field `home.dimensions.values`[2] of 'AnnotatedBinary.Dimension' (Int)\n  +0x0070 | 01                      | uint8_t      | 0x01 (1)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0071 | 02                      | uint8_t      | 0x02 (2)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0072 | 03                      | uint8_t      | 0x03 (3)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0073 | 00                      | uint8_t[1]   | .                             | padding\n  +0x0074 | C8 01 00 00             | UOffset32    | 0x000001C8 (456) Loc: 0x023C  | ERROR: offset to field `name`. Invalid offset, points outside the binary.\n  +0x0078 | 5C 01 00 00             | UOffset32    | 0x0000015C (348) Loc: 0x01D4  | ERROR: offset to field `bars`. Invalid offset, points outside the binary.\n  +0x007C | 50 01 00 00             | UOffset32    | 0x00000150 (336) Loc: 0x01CC  | ERROR: offset to field `bar_baz`. Invalid offset, points outside the binary.\n  +0x0080 | 34 01 00 00             | UOffset32    | 0x00000134 (308) Loc: 0x01B4  | ERROR: offset to field `accounts`. Invalid offset, points outside the binary.\n  +0x0084 | 24 01 00 00             | UOffset32    | 0x00000124 (292) Loc: 0x01A8  | ERROR: offset to field `bob`. Invalid offset, points outside the binary.\n  +0x0088 | 14 01 00 00             | UOffset32    | 0x00000114 (276) Loc: 0x019C  | ERROR: offset to field `alice`. Invalid offset, points outside the binary.\n  +0x008C | 0D 00 00 00             | uint32_t     | 0x0000000D (13)               | table field `just_i32` (Int)\n  +0x0090 | DC 00 00 00             | UOffset32    | 0x000000DC (220) Loc: 0x016C  | offset to field `names` (vector)\n  +0x0094 | A0 00 00 00             | UOffset32    | 0x000000A0 (160) Loc: 0x0134  | offset to field `points_of_interest` (vector)\n  +0x0098 | 94 00 00 00             | UOffset32    | 0x00000094 (148) Loc: 0x012C  | offset to field `foobars_type` (vector)\n  +0x009C | 38 00 00 00             | UOffset32    | 0x00000038 (56) Loc: 0x00D4   | offset to field `foobars` (vector)\n  +0x00A0 | 33 00 00 00             | UOffset32    | 0x00000033 (51) Loc: 0x00D3   | offset to field `measurement` (union of type `Tolerance`)\n  +0x00A4 | 1C 00 00 00             | UOffset32    | 0x0000001C (28) Loc: 0x00C0   | offset to field `anything` (union of type `Bar`)\n  +0x00A8 | 04 00 00 00             | UOffset32    | 0x00000004 (4) Loc: 0x00AC    | offset to field `charlie` (string)\n\nstring (AnnotatedBinary.Foo.charlie):\n  +0x00AC | 05 00 00 00             | uint32_t     | 0x00000005 (5)                | length of string\n  +0x00B0 | 61 6C 69 63 65          | char[5]      | alice                         | string literal\n  +0x00B5 | 00                      | char         | 0x00 (0)                      | string terminator\n\npadding:\n  +0x00B6 | 00 00                   | uint8_t[2]   | ..                            | padding\n\nvtable (AnnotatedBinary.Bar):\n  +0x00B8 | 08 00                   | uint16_t     | 0x0008 (8)                    | size of this vtable\n  +0x00BA | 13 00                   | uint16_t     | 0x0013 (19)                   | size of referring table\n  +0x00BC | 08 00                   | VOffset16    | 0x0008 (8)                    | offset to field `a` (id: 0)\n  +0x00BE | 04 00                   | VOffset16    | 0x0004 (4)                    | offset to field `b` (id: 1)\n\ntable (AnnotatedBinary.Bar):\n  +0x00C0 | 08 00 00 00             | SOffset32    | 0x00000008 (8) Loc: 0x00B8    | offset to vtable\n  +0x00C4 | 00 80 23 44             | float        | 0x44238000 (654)              | table field `b` (Float)\n  +0x00C8 | 00 00 00 00 00 10 74 40 | double       | 0x4074100000000000 (321)      | table field `a` (Double)\n  +0x00D0 | 00 00 00                | uint8_t[3]   | ...                           | padding\n\nunion (AnnotatedBinary.Tolerance.measurement):\n  +0x00D3 | 05                      | uint8_t      | 0x05 (5)                      | struct field `measurement.width` of 'AnnotatedBinary.Tolerance' (UByte)\n\nvector (AnnotatedBinary.Foo.foobars):\n  +0x00D4 | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x00D8 | 34 00 00 00             | UOffset32    | 0x00000034 (52) Loc: 0x010C   | offset to union[0] (`Bar`)\n  +0x00DC | 2C 00 00 00             | UOffset32    | 0x0000002C (44) Loc: 0x0108   | offset to union[1] (`Baz`)\n  +0x00E0 | 04 00 00 00             | UOffset32    | 0x00000004 (4) Loc: 0x00E4    | offset to union[2] (`Bar`)\n\ntable (AnnotatedBinary.Bar):\n  +0x00E4 | D2 FE FF FF             | SOffset32    | 0xFFFFFED2 (-302) Loc: 0x0212 | ERROR: offset to vtable. Invalid offset, points outside the binary.\n\nunknown (no known references):\n  +0x00E8 | 00 80 23 44 10 00 00 00 | ?uint8_t[28] | ..#D....                      | WARN: nothing refers to this section.\n  +0x00F0 | 00 00 00 00 00 D8 8E 40 |              | .......@\n  +0x00F8 | 00 00 00 00 6A FE FF FF |              | ....j...\n  +0x0100 | 00 00 00 03             |              | ....\n\nvtable (AnnotatedBinary.Baz):\n  +0x0104 | 04 00                   | uint16_t     | 0x0004 (4)                    | size of this vtable\n  +0x0106 | 04 00                   | uint16_t     | 0x0004 (4)                    | size of referring table\n\ntable (AnnotatedBinary.Baz):\n  +0x0108 | 04 00 00 00             | SOffset32    | 0x00000004 (4) Loc: 0x0104    | offset to vtable\n\ntable (AnnotatedBinary.Bar):\n  +0x010C | FA FE FF FF             | SOffset32    | 0xFFFFFEFA (-262) Loc: 0x0212 | ERROR: offset to vtable. Invalid offset, points outside the binary.\n\nunknown (no known references):\n  +0x0110 | 00 00 E4 43 10 00 00 00 | ?uint8_t[28] | ...C....                      | WARN: nothing refers to this section.\n  +0x0118 | 00 00 00 00 00 C0 5E 40 |              | ......^@\n  +0x0120 | 00 00 00 00 92 FE FF FF |              | ........\n  +0x0128 | 00 00 00 01             |              | ....\n\nvector (AnnotatedBinary.Foo.foobars_type):\n  +0x012C | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x0130 | 01                      | UType8       | 0x01 (1)                      | value[0]\n  +0x0131 | 02                      | UType8       | 0x02 (2)                      | value[1]\n  +0x0132 | 01                      | UType8       | 0x01 (1)                      | value[2]\n\nvector (AnnotatedBinary.Foo.points_of_interest):\n  +0x0134 | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x0138 | 33 33 33 33 33 A3 45 40 | double       | 0x4045A33333333333 (43.275)   | struct field `[0].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0140 | 7E 57 04 FF 5B 87 53 C0 | double       | 0xC053875BFF04577E (-78.115)  | struct field `[0].longitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0148 | 8D F0 F6 20 04 B6 42 40 | double       | 0x4042B60420F6F08D (37.422)   | struct field `[1].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0150 | 9F 77 63 41 61 85 5E C0 | double       | 0xC05E85614163779F (-122.084) | struct field `[1].longitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0158 | 8F 35 23 83 DC 35 4B C0 | double       | 0xC04B35DC8323358F (-54.4208) | struct field `[2].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0160 | F6 97 DD 93 87 C5 0A 40 | double       | 0x400AC58793DD97F6 (3.34645)  | struct field `[2].longitude` of 'AnnotatedBinary.Location' (Double)\n\npadding:\n  +0x0168 | 00 00 00 00             | uint8_t[4]   | ....                          | padding\n\nvector (AnnotatedBinary.Foo.names):\n  +0x016C | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | ERROR: length of vector (# items). Longer than the binary.\n\nunknown (no known references):\n  +0x0170 | 20 00 00 00 14 00       | ?uint8_t[6]  |  .....                        | WARN: could be corrupted padding region.\n"
  },
  {
    "path": "tests/annotated_binary/tests/invalid_vector_structs_cut_short.afb",
    "content": "// Annotated Flatbuffer Binary\n//\n// Schema file: annotated_binary.fbs\n// Binary file: tests/invalid_vector_structs_cut_short.bin\n\nheader:\n  +0x0000 | 44 00 00 00             | UOffset32    | 0x00000044 (68) Loc: 0x0044   | offset to root table `AnnotatedBinary.Foo`\n  +0x0004 | 41 4E 4E 4F             | char[4]      | ANNO                          | File Identifier\n\npadding:\n  +0x0008 | 00 00                   | uint8_t[2]   | ..                            | padding\n\nvtable (AnnotatedBinary.Foo):\n  +0x000A | 3A 00                   | uint16_t     | 0x003A (58)                   | size of this vtable\n  +0x000C | 68 00                   | uint16_t     | 0x0068 (104)                  | size of referring table\n  +0x000E | 0C 00                   | VOffset16    | 0x000C (12)                   | offset to field `counter` (id: 0)\n  +0x0010 | 07 00                   | VOffset16    | 0x0007 (7)                    | offset to field `healthy` (id: 1)\n  +0x0012 | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `level` (id: 2) <defaults to 99> (Long)\n  +0x0014 | 08 00                   | VOffset16    | 0x0008 (8)                    | offset to field `meal` (id: 3)\n  +0x0016 | 10 00                   | VOffset16    | 0x0010 (16)                   | offset to field `bar` (id: 4)\n  +0x0018 | 14 00                   | VOffset16    | 0x0014 (20)                   | offset to field `home` (id: 5)\n  +0x001A | 30 00                   | VOffset16    | 0x0030 (48)                   | offset to field `name` (id: 6)\n  +0x001C | 34 00                   | VOffset16    | 0x0034 (52)                   | offset to field `bars` (id: 7)\n  +0x001E | 09 00                   | VOffset16    | 0x0009 (9)                    | offset to field `bar_baz_type` (id: 8)\n  +0x0020 | 38 00                   | VOffset16    | 0x0038 (56)                   | offset to field `bar_baz` (id: 9)\n  +0x0022 | 3C 00                   | VOffset16    | 0x003C (60)                   | offset to field `accounts` (id: 10)\n  +0x0024 | 40 00                   | VOffset16    | 0x0040 (64)                   | offset to field `bob` (id: 11)\n  +0x0026 | 44 00                   | VOffset16    | 0x0044 (68)                   | offset to field `alice` (id: 12)\n  +0x0028 | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `maybe_i32` (id: 13) <defaults to 0> (Int)\n  +0x002A | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `default_i32` (id: 14) <defaults to 42> (Int)\n  +0x002C | 48 00                   | VOffset16    | 0x0048 (72)                   | offset to field `just_i32` (id: 15)\n  +0x002E | 4C 00                   | VOffset16    | 0x004C (76)                   | offset to field `names` (id: 16)\n  +0x0030 | 50 00                   | VOffset16    | 0x0050 (80)                   | offset to field `points_of_interest` (id: 17)\n  +0x0032 | 54 00                   | VOffset16    | 0x0054 (84)                   | offset to field `foobars_type` (id: 18)\n  +0x0034 | 58 00                   | VOffset16    | 0x0058 (88)                   | offset to field `foobars` (id: 19)\n  +0x0036 | 0A 00                   | VOffset16    | 0x000A (10)                   | offset to field `measurement_type` (id: 20)\n  +0x0038 | 5C 00                   | VOffset16    | 0x005C (92)                   | offset to field `measurement` (id: 21)\n  +0x003A | 0B 00                   | VOffset16    | 0x000B (11)                   | offset to field `anything_type` (id: 22)\n  +0x003C | 60 00                   | VOffset16    | 0x0060 (96)                   | offset to field `anything` (id: 23)\n  +0x003E | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `temperature` (id: 24) <defaults to 98.600000> (Float)\n  +0x0040 | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `teetotaler` (id: 25) <null> (Obj)\n  +0x0042 | 64 00                   | VOffset16    | 0x0064 (100)                  | offset to field `charlie` (id: 26)\n\nroot_table (AnnotatedBinary.Foo):\n  +0x0044 | 3A 00 00 00             | SOffset32    | 0x0000003A (58) Loc: 0x000A   | offset to vtable\n  +0x0048 | 00 00 00                | uint8_t[3]   | ...                           | padding\n  +0x004B | 01                      | uint8_t      | 0x01 (1)                      | table field `healthy` (Bool)\n  +0x004C | 02                      | uint8_t      | 0x02 (2)                      | table field `meal` (Byte)\n  +0x004D | 02                      | UType8       | 0x02 (2)                      | table field `bar_baz_type` (UType)\n  +0x004E | 01                      | UType8       | 0x01 (1)                      | table field `measurement_type` (UType)\n  +0x004F | 01                      | UType8       | 0x01 (1)                      | table field `anything_type` (UType)\n  +0x0050 | D2 04 00 00             | uint32_t     | 0x000004D2 (1234)             | table field `counter` (Int)\n  +0x0054 | 28 02 00 00             | UOffset32    | 0x00000228 (552) Loc: 0x027C  | ERROR: offset to field `bar`. Invalid offset, points outside the binary.\n  +0x0058 | 01 00 00 00             | uint32_t     | 0x00000001 (1)                | struct field `home.floors` of 'AnnotatedBinary.Building' (Int)\n  +0x005C | 02 00 00 00             | uint32_t     | 0x00000002 (2)                | struct field `home.doors` of 'AnnotatedBinary.Building' (Int)\n  +0x0060 | 0C 00 00 00             | uint32_t     | 0x0000000C (12)               | struct field `home.windows` of 'AnnotatedBinary.Building' (Int)\n  +0x0064 | 0A 00 00 00             | uint32_t     | 0x0000000A (10)               | array field `home.dimensions.values`[0] of 'AnnotatedBinary.Dimension' (Int)\n  +0x0068 | 0C 00 00 00             | uint32_t     | 0x0000000C (12)               | array field `home.dimensions.values`[1] of 'AnnotatedBinary.Dimension' (Int)\n  +0x006C | 14 00 00 00             | uint32_t     | 0x00000014 (20)               | array field `home.dimensions.values`[2] of 'AnnotatedBinary.Dimension' (Int)\n  +0x0070 | 01                      | uint8_t      | 0x01 (1)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0071 | 02                      | uint8_t      | 0x02 (2)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0072 | 03                      | uint8_t      | 0x03 (3)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0073 | 00                      | uint8_t[1]   | .                             | padding\n  +0x0074 | C8 01 00 00             | UOffset32    | 0x000001C8 (456) Loc: 0x023C  | ERROR: offset to field `name`. Invalid offset, points outside the binary.\n  +0x0078 | 5C 01 00 00             | UOffset32    | 0x0000015C (348) Loc: 0x01D4  | ERROR: offset to field `bars`. Invalid offset, points outside the binary.\n  +0x007C | 50 01 00 00             | UOffset32    | 0x00000150 (336) Loc: 0x01CC  | ERROR: offset to field `bar_baz`. Invalid offset, points outside the binary.\n  +0x0080 | 34 01 00 00             | UOffset32    | 0x00000134 (308) Loc: 0x01B4  | ERROR: offset to field `accounts`. Invalid offset, points outside the binary.\n  +0x0084 | 24 01 00 00             | UOffset32    | 0x00000124 (292) Loc: 0x01A8  | ERROR: offset to field `bob`. Invalid offset, points outside the binary.\n  +0x0088 | 14 01 00 00             | UOffset32    | 0x00000114 (276) Loc: 0x019C  | ERROR: offset to field `alice`. Invalid offset, points outside the binary.\n  +0x008C | 0D 00 00 00             | uint32_t     | 0x0000000D (13)               | table field `just_i32` (Int)\n  +0x0090 | DC 00 00 00             | UOffset32    | 0x000000DC (220) Loc: 0x016C  | ERROR: offset to field `names`. Invalid offset, points outside the binary.\n  +0x0094 | A0 00 00 00             | UOffset32    | 0x000000A0 (160) Loc: 0x0134  | offset to field `points_of_interest` (vector)\n  +0x0098 | 94 00 00 00             | UOffset32    | 0x00000094 (148) Loc: 0x012C  | offset to field `foobars_type` (vector)\n  +0x009C | 38 00 00 00             | UOffset32    | 0x00000038 (56) Loc: 0x00D4   | offset to field `foobars` (vector)\n  +0x00A0 | 33 00 00 00             | UOffset32    | 0x00000033 (51) Loc: 0x00D3   | offset to field `measurement` (union of type `Tolerance`)\n  +0x00A4 | 1C 00 00 00             | UOffset32    | 0x0000001C (28) Loc: 0x00C0   | offset to field `anything` (union of type `Bar`)\n  +0x00A8 | 04 00 00 00             | UOffset32    | 0x00000004 (4) Loc: 0x00AC    | offset to field `charlie` (string)\n\nstring (AnnotatedBinary.Foo.charlie):\n  +0x00AC | 05 00 00 00             | uint32_t     | 0x00000005 (5)                | length of string\n  +0x00B0 | 61 6C 69 63 65          | char[5]      | alice                         | string literal\n  +0x00B5 | 00                      | char         | 0x00 (0)                      | string terminator\n\npadding:\n  +0x00B6 | 00 00                   | uint8_t[2]   | ..                            | padding\n\nvtable (AnnotatedBinary.Bar):\n  +0x00B8 | 08 00                   | uint16_t     | 0x0008 (8)                    | size of this vtable\n  +0x00BA | 13 00                   | uint16_t     | 0x0013 (19)                   | size of referring table\n  +0x00BC | 08 00                   | VOffset16    | 0x0008 (8)                    | offset to field `a` (id: 0)\n  +0x00BE | 04 00                   | VOffset16    | 0x0004 (4)                    | offset to field `b` (id: 1)\n\ntable (AnnotatedBinary.Bar):\n  +0x00C0 | 08 00 00 00             | SOffset32    | 0x00000008 (8) Loc: 0x00B8    | offset to vtable\n  +0x00C4 | 00 80 23 44             | float        | 0x44238000 (654)              | table field `b` (Float)\n  +0x00C8 | 00 00 00 00 00 10 74 40 | double       | 0x4074100000000000 (321)      | table field `a` (Double)\n  +0x00D0 | 00 00 00                | uint8_t[3]   | ...                           | padding\n\nunion (AnnotatedBinary.Tolerance.measurement):\n  +0x00D3 | 05                      | uint8_t      | 0x05 (5)                      | struct field `measurement.width` of 'AnnotatedBinary.Tolerance' (UByte)\n\nvector (AnnotatedBinary.Foo.foobars):\n  +0x00D4 | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x00D8 | 34 00 00 00             | UOffset32    | 0x00000034 (52) Loc: 0x010C   | offset to union[0] (`Bar`)\n  +0x00DC | 2C 00 00 00             | UOffset32    | 0x0000002C (44) Loc: 0x0108   | offset to union[1] (`Baz`)\n  +0x00E0 | 04 00 00 00             | UOffset32    | 0x00000004 (4) Loc: 0x00E4    | offset to union[2] (`Bar`)\n\ntable (AnnotatedBinary.Bar):\n  +0x00E4 | D2 FE FF FF             | SOffset32    | 0xFFFFFED2 (-302) Loc: 0x0212 | ERROR: offset to vtable. Invalid offset, points outside the binary.\n\nunknown (no known references):\n  +0x00E8 | 00 80 23 44 10 00 00 00 | ?uint8_t[28] | ..#D....                      | WARN: nothing refers to this section.\n  +0x00F0 | 00 00 00 00 00 D8 8E 40 |              | .......@\n  +0x00F8 | 00 00 00 00 6A FE FF FF |              | ....j...\n  +0x0100 | 00 00 00 03             |              | ....\n\nvtable (AnnotatedBinary.Baz):\n  +0x0104 | 04 00                   | uint16_t     | 0x0004 (4)                    | size of this vtable\n  +0x0106 | 04 00                   | uint16_t     | 0x0004 (4)                    | size of referring table\n\ntable (AnnotatedBinary.Baz):\n  +0x0108 | 04 00 00 00             | SOffset32    | 0x00000004 (4) Loc: 0x0104    | offset to vtable\n\ntable (AnnotatedBinary.Bar):\n  +0x010C | FA FE FF FF             | SOffset32    | 0xFFFFFEFA (-262) Loc: 0x0212 | ERROR: offset to vtable. Invalid offset, points outside the binary.\n\nunknown (no known references):\n  +0x0110 | 00 00 E4 43 10 00 00 00 | ?uint8_t[28] | ...C....                      | WARN: nothing refers to this section.\n  +0x0118 | 00 00 00 00 00 C0 5E 40 |              | ......^@\n  +0x0120 | 00 00 00 00 92 FE FF FF |              | ........\n  +0x0128 | 00 00 00 01             |              | ....\n\nvector (AnnotatedBinary.Foo.foobars_type):\n  +0x012C | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x0130 | 01                      | UType8       | 0x01 (1)                      | value[0]\n  +0x0131 | 02                      | UType8       | 0x02 (2)                      | value[1]\n  +0x0132 | 01                      | UType8       | 0x01 (1)                      | value[2]\n\nvector (AnnotatedBinary.Foo.points_of_interest):\n  +0x0134 | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | ERROR: length of vector (# items). Longer than the binary.\n\nunknown (no known references):\n  +0x0138 | 33 33 33 33 33 A3 45 40 | ?uint8_t[28] | 33333.E@                      | WARN: nothing refers to this section.\n  +0x0140 | 7E 57 04 FF 5B 87 53 C0 |              | ~W..[.S.\n  +0x0148 | 8D F0 F6 20 04 B6 42 40 |              | ... ..B@\n  +0x0150 | 9F 77 63 41             |              | .wcA\n"
  },
  {
    "path": "tests/annotated_binary/tests/invalid_vector_tables_cut_short.afb",
    "content": "// Annotated Flatbuffer Binary\n//\n// Schema file: annotated_binary.fbs\n// Binary file: tests/invalid_vector_tables_cut_short.bin\n\nheader:\n  +0x0000 | 44 00 00 00             | UOffset32    | 0x00000044 (68) Loc: 0x0044   | offset to root table `AnnotatedBinary.Foo`\n  +0x0004 | 41 4E 4E 4F             | char[4]      | ANNO                          | File Identifier\n\npadding:\n  +0x0008 | 00 00                   | uint8_t[2]   | ..                            | padding\n\nvtable (AnnotatedBinary.Foo):\n  +0x000A | 3A 00                   | uint16_t     | 0x003A (58)                   | size of this vtable\n  +0x000C | 68 00                   | uint16_t     | 0x0068 (104)                  | size of referring table\n  +0x000E | 0C 00                   | VOffset16    | 0x000C (12)                   | offset to field `counter` (id: 0)\n  +0x0010 | 07 00                   | VOffset16    | 0x0007 (7)                    | offset to field `healthy` (id: 1)\n  +0x0012 | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `level` (id: 2) <defaults to 99> (Long)\n  +0x0014 | 08 00                   | VOffset16    | 0x0008 (8)                    | offset to field `meal` (id: 3)\n  +0x0016 | 10 00                   | VOffset16    | 0x0010 (16)                   | offset to field `bar` (id: 4)\n  +0x0018 | 14 00                   | VOffset16    | 0x0014 (20)                   | offset to field `home` (id: 5)\n  +0x001A | 30 00                   | VOffset16    | 0x0030 (48)                   | offset to field `name` (id: 6)\n  +0x001C | 34 00                   | VOffset16    | 0x0034 (52)                   | offset to field `bars` (id: 7)\n  +0x001E | 09 00                   | VOffset16    | 0x0009 (9)                    | offset to field `bar_baz_type` (id: 8)\n  +0x0020 | 38 00                   | VOffset16    | 0x0038 (56)                   | offset to field `bar_baz` (id: 9)\n  +0x0022 | 3C 00                   | VOffset16    | 0x003C (60)                   | offset to field `accounts` (id: 10)\n  +0x0024 | 40 00                   | VOffset16    | 0x0040 (64)                   | offset to field `bob` (id: 11)\n  +0x0026 | 44 00                   | VOffset16    | 0x0044 (68)                   | offset to field `alice` (id: 12)\n  +0x0028 | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `maybe_i32` (id: 13) <defaults to 0> (Int)\n  +0x002A | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `default_i32` (id: 14) <defaults to 42> (Int)\n  +0x002C | 48 00                   | VOffset16    | 0x0048 (72)                   | offset to field `just_i32` (id: 15)\n  +0x002E | 4C 00                   | VOffset16    | 0x004C (76)                   | offset to field `names` (id: 16)\n  +0x0030 | 50 00                   | VOffset16    | 0x0050 (80)                   | offset to field `points_of_interest` (id: 17)\n  +0x0032 | 54 00                   | VOffset16    | 0x0054 (84)                   | offset to field `foobars_type` (id: 18)\n  +0x0034 | 58 00                   | VOffset16    | 0x0058 (88)                   | offset to field `foobars` (id: 19)\n  +0x0036 | 0A 00                   | VOffset16    | 0x000A (10)                   | offset to field `measurement_type` (id: 20)\n  +0x0038 | 5C 00                   | VOffset16    | 0x005C (92)                   | offset to field `measurement` (id: 21)\n  +0x003A | 0B 00                   | VOffset16    | 0x000B (11)                   | offset to field `anything_type` (id: 22)\n  +0x003C | 60 00                   | VOffset16    | 0x0060 (96)                   | offset to field `anything` (id: 23)\n  +0x003E | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `temperature` (id: 24) <defaults to 98.600000> (Float)\n  +0x0040 | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `teetotaler` (id: 25) <null> (Obj)\n  +0x0042 | 64 00                   | VOffset16    | 0x0064 (100)                  | offset to field `charlie` (id: 26)\n\nroot_table (AnnotatedBinary.Foo):\n  +0x0044 | 3A 00 00 00             | SOffset32    | 0x0000003A (58) Loc: 0x000A   | offset to vtable\n  +0x0048 | 00 00 00                | uint8_t[3]   | ...                           | padding\n  +0x004B | 01                      | uint8_t      | 0x01 (1)                      | table field `healthy` (Bool)\n  +0x004C | 02                      | uint8_t      | 0x02 (2)                      | table field `meal` (Byte)\n  +0x004D | 02                      | UType8       | 0x02 (2)                      | table field `bar_baz_type` (UType)\n  +0x004E | 01                      | UType8       | 0x01 (1)                      | table field `measurement_type` (UType)\n  +0x004F | 01                      | UType8       | 0x01 (1)                      | table field `anything_type` (UType)\n  +0x0050 | D2 04 00 00             | uint32_t     | 0x000004D2 (1234)             | table field `counter` (Int)\n  +0x0054 | 28 02 00 00             | UOffset32    | 0x00000228 (552) Loc: 0x027C  | ERROR: offset to field `bar`. Invalid offset, points outside the binary.\n  +0x0058 | 01 00 00 00             | uint32_t     | 0x00000001 (1)                | struct field `home.floors` of 'AnnotatedBinary.Building' (Int)\n  +0x005C | 02 00 00 00             | uint32_t     | 0x00000002 (2)                | struct field `home.doors` of 'AnnotatedBinary.Building' (Int)\n  +0x0060 | 0C 00 00 00             | uint32_t     | 0x0000000C (12)               | struct field `home.windows` of 'AnnotatedBinary.Building' (Int)\n  +0x0064 | 0A 00 00 00             | uint32_t     | 0x0000000A (10)               | array field `home.dimensions.values`[0] of 'AnnotatedBinary.Dimension' (Int)\n  +0x0068 | 0C 00 00 00             | uint32_t     | 0x0000000C (12)               | array field `home.dimensions.values`[1] of 'AnnotatedBinary.Dimension' (Int)\n  +0x006C | 14 00 00 00             | uint32_t     | 0x00000014 (20)               | array field `home.dimensions.values`[2] of 'AnnotatedBinary.Dimension' (Int)\n  +0x0070 | 01                      | uint8_t      | 0x01 (1)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0071 | 02                      | uint8_t      | 0x02 (2)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0072 | 03                      | uint8_t      | 0x03 (3)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0073 | 00                      | uint8_t[1]   | .                             | padding\n  +0x0074 | C8 01 00 00             | UOffset32    | 0x000001C8 (456) Loc: 0x023C  | ERROR: offset to field `name`. Invalid offset, points outside the binary.\n  +0x0078 | 5C 01 00 00             | UOffset32    | 0x0000015C (348) Loc: 0x01D4  | offset to field `bars` (vector)\n  +0x007C | 50 01 00 00             | UOffset32    | 0x00000150 (336) Loc: 0x01CC  | offset to field `bar_baz` (union of type `Baz`)\n  +0x0080 | 34 01 00 00             | UOffset32    | 0x00000134 (308) Loc: 0x01B4  | offset to field `accounts` (vector)\n  +0x0084 | 24 01 00 00             | UOffset32    | 0x00000124 (292) Loc: 0x01A8  | offset to field `bob` (string)\n  +0x0088 | 14 01 00 00             | UOffset32    | 0x00000114 (276) Loc: 0x019C  | offset to field `alice` (string)\n  +0x008C | 0D 00 00 00             | uint32_t     | 0x0000000D (13)               | table field `just_i32` (Int)\n  +0x0090 | DC 00 00 00             | UOffset32    | 0x000000DC (220) Loc: 0x016C  | offset to field `names` (vector)\n  +0x0094 | A0 00 00 00             | UOffset32    | 0x000000A0 (160) Loc: 0x0134  | offset to field `points_of_interest` (vector)\n  +0x0098 | 94 00 00 00             | UOffset32    | 0x00000094 (148) Loc: 0x012C  | offset to field `foobars_type` (vector)\n  +0x009C | 38 00 00 00             | UOffset32    | 0x00000038 (56) Loc: 0x00D4   | offset to field `foobars` (vector)\n  +0x00A0 | 33 00 00 00             | UOffset32    | 0x00000033 (51) Loc: 0x00D3   | offset to field `measurement` (union of type `Tolerance`)\n  +0x00A4 | 1C 00 00 00             | UOffset32    | 0x0000001C (28) Loc: 0x00C0   | offset to field `anything` (union of type `Bar`)\n  +0x00A8 | 04 00 00 00             | UOffset32    | 0x00000004 (4) Loc: 0x00AC    | offset to field `charlie` (string)\n\nstring (AnnotatedBinary.Foo.charlie):\n  +0x00AC | 05 00 00 00             | uint32_t     | 0x00000005 (5)                | length of string\n  +0x00B0 | 61 6C 69 63 65          | char[5]      | alice                         | string literal\n  +0x00B5 | 00                      | char         | 0x00 (0)                      | string terminator\n\npadding:\n  +0x00B6 | 00 00                   | uint8_t[2]   | ..                            | padding\n\nvtable (AnnotatedBinary.Bar):\n  +0x00B8 | 08 00                   | uint16_t     | 0x0008 (8)                    | size of this vtable\n  +0x00BA | 13 00                   | uint16_t     | 0x0013 (19)                   | size of referring table\n  +0x00BC | 08 00                   | VOffset16    | 0x0008 (8)                    | offset to field `a` (id: 0)\n  +0x00BE | 04 00                   | VOffset16    | 0x0004 (4)                    | offset to field `b` (id: 1)\n\ntable (AnnotatedBinary.Bar):\n  +0x00C0 | 08 00 00 00             | SOffset32    | 0x00000008 (8) Loc: 0x00B8    | offset to vtable\n  +0x00C4 | 00 80 23 44             | float        | 0x44238000 (654)              | table field `b` (Float)\n  +0x00C8 | 00 00 00 00 00 10 74 40 | double       | 0x4074100000000000 (321)      | table field `a` (Double)\n  +0x00D0 | 00 00 00                | uint8_t[3]   | ...                           | padding\n\nunion (AnnotatedBinary.Tolerance.measurement):\n  +0x00D3 | 05                      | uint8_t      | 0x05 (5)                      | struct field `measurement.width` of 'AnnotatedBinary.Tolerance' (UByte)\n\nvector (AnnotatedBinary.Foo.foobars):\n  +0x00D4 | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x00D8 | 34 00 00 00             | UOffset32    | 0x00000034 (52) Loc: 0x010C   | offset to union[0] (`Bar`)\n  +0x00DC | 2C 00 00 00             | UOffset32    | 0x0000002C (44) Loc: 0x0108   | offset to union[1] (`Baz`)\n  +0x00E0 | 04 00 00 00             | UOffset32    | 0x00000004 (4) Loc: 0x00E4    | offset to union[2] (`Bar`)\n\ntable (AnnotatedBinary.Bar):\n  +0x00E4 | D2 FE FF FF             | SOffset32    | 0xFFFFFED2 (-302) Loc: 0x0212 | ERROR: offset to vtable. Invalid offset, points outside the binary.\n\nunknown (no known references):\n  +0x00E8 | 00 80 23 44 10 00 00 00 | ?uint8_t[28] | ..#D....                      | WARN: nothing refers to this section.\n  +0x00F0 | 00 00 00 00 00 D8 8E 40 |              | .......@\n  +0x00F8 | 00 00 00 00 6A FE FF FF |              | ....j...\n  +0x0100 | 00 00 00 03             |              | ....\n\nvtable (AnnotatedBinary.Baz):\n  +0x0104 | 04 00                   | uint16_t     | 0x0004 (4)                    | size of this vtable\n  +0x0106 | 04 00                   | uint16_t     | 0x0004 (4)                    | size of referring table\n\ntable (AnnotatedBinary.Baz):\n  +0x0108 | 04 00 00 00             | SOffset32    | 0x00000004 (4) Loc: 0x0104    | offset to vtable\n\ntable (AnnotatedBinary.Bar):\n  +0x010C | FA FE FF FF             | SOffset32    | 0xFFFFFEFA (-262) Loc: 0x0212 | ERROR: offset to vtable. Invalid offset, points outside the binary.\n\nunknown (no known references):\n  +0x0110 | 00 00 E4 43 10 00 00 00 | ?uint8_t[28] | ...C....                      | WARN: nothing refers to this section.\n  +0x0118 | 00 00 00 00 00 C0 5E 40 |              | ......^@\n  +0x0120 | 00 00 00 00 92 FE FF FF |              | ........\n  +0x0128 | 00 00 00 01             |              | ....\n\nvector (AnnotatedBinary.Foo.foobars_type):\n  +0x012C | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x0130 | 01                      | UType8       | 0x01 (1)                      | value[0]\n  +0x0131 | 02                      | UType8       | 0x02 (2)                      | value[1]\n  +0x0132 | 01                      | UType8       | 0x01 (1)                      | value[2]\n\nvector (AnnotatedBinary.Foo.points_of_interest):\n  +0x0134 | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x0138 | 33 33 33 33 33 A3 45 40 | double       | 0x4045A33333333333 (43.275)   | struct field `[0].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0140 | 7E 57 04 FF 5B 87 53 C0 | double       | 0xC053875BFF04577E (-78.115)  | struct field `[0].longitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0148 | 8D F0 F6 20 04 B6 42 40 | double       | 0x4042B60420F6F08D (37.422)   | struct field `[1].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0150 | 9F 77 63 41 61 85 5E C0 | double       | 0xC05E85614163779F (-122.084) | struct field `[1].longitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0158 | 8F 35 23 83 DC 35 4B C0 | double       | 0xC04B35DC8323358F (-54.4208) | struct field `[2].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0160 | F6 97 DD 93 87 C5 0A 40 | double       | 0x400AC58793DD97F6 (3.34645)  | struct field `[2].longitude` of 'AnnotatedBinary.Location' (Double)\n\npadding:\n  +0x0168 | 00 00 00 00             | uint8_t[4]   | ....                          | padding\n\nvector (AnnotatedBinary.Foo.names):\n  +0x016C | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x0170 | 20 00 00 00             | UOffset32    | 0x00000020 (32) Loc: 0x0190   | offset to string[0]\n  +0x0174 | 14 00 00 00             | UOffset32    | 0x00000014 (20) Loc: 0x0188   | offset to string[1]\n  +0x0178 | 04 00 00 00             | UOffset32    | 0x00000004 (4) Loc: 0x017C    | offset to string[2]\n\nstring (AnnotatedBinary.Foo.names):\n  +0x017C | 07 00 00 00             | uint32_t     | 0x00000007 (7)                | length of string\n  +0x0180 | 63 68 61 72 6C 69 65    | char[7]      | charlie                       | string literal\n  +0x0187 | 00                      | char         | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.names):\n  +0x0188 | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of string\n  +0x018C | 62 6F 62                | char[3]      | bob                           | string literal\n  +0x018F | 00                      | char         | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.names):\n  +0x0190 | 05 00 00 00             | uint32_t     | 0x00000005 (5)                | length of string\n  +0x0194 | 61 6C 69 63 65          | char[5]      | alice                         | string literal\n  +0x0199 | 00                      | char         | 0x00 (0)                      | string terminator\n\npadding:\n  +0x019A | 00 00                   | uint8_t[2]   | ..                            | padding\n\nstring (AnnotatedBinary.Foo.alice):\n  +0x019C | 07 00 00 00             | uint32_t     | 0x00000007 (7)                | length of string\n  +0x01A0 | 63 68 61 72 6C 69 65    | char[7]      | charlie                       | string literal\n  +0x01A7 | 00                      | char         | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.bob):\n  +0x01A8 | 07 00 00 00             | uint32_t     | 0x00000007 (7)                | length of string\n  +0x01AC | 63 68 61 72 6C 69 65    | char[7]      | charlie                       | string literal\n  +0x01B3 | 00                      | char         | 0x00 (0)                      | string terminator\n\nvector (AnnotatedBinary.Foo.accounts):\n  +0x01B4 | 09 00 00 00             | uint32_t     | 0x00000009 (9)                | length of vector (# items)\n  +0x01B8 | 09 00                   | uint16_t     | 0x0009 (9)                    | value[0]\n  +0x01BA | 08 00                   | uint16_t     | 0x0008 (8)                    | value[1]\n  +0x01BC | 07 00                   | uint16_t     | 0x0007 (7)                    | value[2]\n  +0x01BE | 01 00                   | uint16_t     | 0x0001 (1)                    | value[3]\n  +0x01C0 | 02 00                   | uint16_t     | 0x0002 (2)                    | value[4]\n  +0x01C2 | 03 00                   | uint16_t     | 0x0003 (3)                    | value[5]\n  +0x01C4 | 06 00                   | uint16_t     | 0x0006 (6)                    | value[6]\n  +0x01C6 | 05 00                   | uint16_t     | 0x0005 (5)                    | value[7]\n  +0x01C8 | 04 00                   | uint16_t     | 0x0004 (4)                    | value[8]\n\npadding:\n  +0x01CA | 00 00                   | uint8_t[2]   | ..                            | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x01CC | 3A FF FF FF             | SOffset32    | 0xFFFFFF3A (-198) Loc: 0x0292 | ERROR: offset to vtable. Invalid offset, points outside the binary.\n\nunknown (no known references):\n  +0x01D0 | 00 00 00 03             | ?uint8_t[4]  | ....                          | WARN: could be corrupted padding region.\n\nvector (AnnotatedBinary.Foo.bars):\n  +0x01D4 | 02 00 00 00             | uint32_t     | 0x00000002 (2)                | ERROR: length of vector (# items). Longer than the binary.\n\nunknown (no known references):\n  +0x01D8 | 44 00 00 00 10 00       | ?uint8_t[6]  | D.....                        | WARN: could be corrupted padding region.\n"
  },
  {
    "path": "tests/annotated_binary/tests/invalid_vector_union_type_value.afb",
    "content": "// Annotated Flatbuffer Binary\n//\n// Schema file: annotated_binary.fbs\n// Binary file: tests/invalid_vector_union_type_value.bin\n\nheader:\n  +0x0000 | 44 00 00 00             | UOffset32   | 0x00000044 (68) Loc: 0x0044   | offset to root table `AnnotatedBinary.Foo`\n  +0x0004 | 41 4E 4E 4F             | char[4]     | ANNO                          | File Identifier\n\npadding:\n  +0x0008 | 00 00                   | uint8_t[2]  | ..                            | padding\n\nvtable (AnnotatedBinary.Foo):\n  +0x000A | 3A 00                   | uint16_t    | 0x003A (58)                   | size of this vtable\n  +0x000C | 68 00                   | uint16_t    | 0x0068 (104)                  | size of referring table\n  +0x000E | 0C 00                   | VOffset16   | 0x000C (12)                   | offset to field `counter` (id: 0)\n  +0x0010 | 07 00                   | VOffset16   | 0x0007 (7)                    | offset to field `healthy` (id: 1)\n  +0x0012 | 00 00                   | VOffset16   | 0x0000 (0)                    | offset to field `level` (id: 2) <defaults to 99> (Long)\n  +0x0014 | 08 00                   | VOffset16   | 0x0008 (8)                    | offset to field `meal` (id: 3)\n  +0x0016 | 10 00                   | VOffset16   | 0x0010 (16)                   | offset to field `bar` (id: 4)\n  +0x0018 | 14 00                   | VOffset16   | 0x0014 (20)                   | offset to field `home` (id: 5)\n  +0x001A | 30 00                   | VOffset16   | 0x0030 (48)                   | offset to field `name` (id: 6)\n  +0x001C | 34 00                   | VOffset16   | 0x0034 (52)                   | offset to field `bars` (id: 7)\n  +0x001E | 09 00                   | VOffset16   | 0x0009 (9)                    | offset to field `bar_baz_type` (id: 8)\n  +0x0020 | 38 00                   | VOffset16   | 0x0038 (56)                   | offset to field `bar_baz` (id: 9)\n  +0x0022 | 3C 00                   | VOffset16   | 0x003C (60)                   | offset to field `accounts` (id: 10)\n  +0x0024 | 40 00                   | VOffset16   | 0x0040 (64)                   | offset to field `bob` (id: 11)\n  +0x0026 | 44 00                   | VOffset16   | 0x0044 (68)                   | offset to field `alice` (id: 12)\n  +0x0028 | 00 00                   | VOffset16   | 0x0000 (0)                    | offset to field `maybe_i32` (id: 13) <defaults to 0> (Int)\n  +0x002A | 00 00                   | VOffset16   | 0x0000 (0)                    | offset to field `default_i32` (id: 14) <defaults to 42> (Int)\n  +0x002C | 48 00                   | VOffset16   | 0x0048 (72)                   | offset to field `just_i32` (id: 15)\n  +0x002E | 4C 00                   | VOffset16   | 0x004C (76)                   | offset to field `names` (id: 16)\n  +0x0030 | 50 00                   | VOffset16   | 0x0050 (80)                   | offset to field `points_of_interest` (id: 17)\n  +0x0032 | 54 00                   | VOffset16   | 0x0054 (84)                   | offset to field `foobars_type` (id: 18)\n  +0x0034 | 58 00                   | VOffset16   | 0x0058 (88)                   | offset to field `foobars` (id: 19)\n  +0x0036 | 0A 00                   | VOffset16   | 0x000A (10)                   | offset to field `measurement_type` (id: 20)\n  +0x0038 | 5C 00                   | VOffset16   | 0x005C (92)                   | offset to field `measurement` (id: 21)\n  +0x003A | 0B 00                   | VOffset16   | 0x000B (11)                   | offset to field `anything_type` (id: 22)\n  +0x003C | 60 00                   | VOffset16   | 0x0060 (96)                   | offset to field `anything` (id: 23)\n  +0x003E | 00 00                   | VOffset16   | 0x0000 (0)                    | offset to field `temperature` (id: 24) <defaults to 98.600000> (Float)\n  +0x0040 | 00 00                   | VOffset16   | 0x0000 (0)                    | offset to field `teetotaler` (id: 25) <null> (Obj)\n  +0x0042 | 64 00                   | VOffset16   | 0x0064 (100)                  | offset to field `charlie` (id: 26)\n\nroot_table (AnnotatedBinary.Foo):\n  +0x0044 | 3A 00 00 00             | SOffset32   | 0x0000003A (58) Loc: 0x000A   | offset to vtable\n  +0x0048 | 00 00 00                | uint8_t[3]  | ...                           | padding\n  +0x004B | 01                      | uint8_t     | 0x01 (1)                      | table field `healthy` (Bool)\n  +0x004C | 02                      | uint8_t     | 0x02 (2)                      | table field `meal` (Byte)\n  +0x004D | 02                      | UType8      | 0x02 (2)                      | table field `bar_baz_type` (UType)\n  +0x004E | 01                      | UType8      | 0x01 (1)                      | table field `measurement_type` (UType)\n  +0x004F | 01                      | UType8      | 0x01 (1)                      | table field `anything_type` (UType)\n  +0x0050 | D2 04 00 00             | uint32_t    | 0x000004D2 (1234)             | table field `counter` (Int)\n  +0x0054 | 28 02 00 00             | UOffset32   | 0x00000228 (552) Loc: 0x027C  | offset to field `bar` (table)\n  +0x0058 | 01 00 00 00             | uint32_t    | 0x00000001 (1)                | struct field `home.floors` of 'AnnotatedBinary.Building' (Int)\n  +0x005C | 02 00 00 00             | uint32_t    | 0x00000002 (2)                | struct field `home.doors` of 'AnnotatedBinary.Building' (Int)\n  +0x0060 | 0C 00 00 00             | uint32_t    | 0x0000000C (12)               | struct field `home.windows` of 'AnnotatedBinary.Building' (Int)\n  +0x0064 | 0A 00 00 00             | uint32_t    | 0x0000000A (10)               | array field `home.dimensions.values`[0] of 'AnnotatedBinary.Dimension' (Int)\n  +0x0068 | 0C 00 00 00             | uint32_t    | 0x0000000C (12)               | array field `home.dimensions.values`[1] of 'AnnotatedBinary.Dimension' (Int)\n  +0x006C | 14 00 00 00             | uint32_t    | 0x00000014 (20)               | array field `home.dimensions.values`[2] of 'AnnotatedBinary.Dimension' (Int)\n  +0x0070 | 01                      | uint8_t     | 0x01 (1)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0071 | 02                      | uint8_t     | 0x02 (2)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0072 | 03                      | uint8_t     | 0x03 (3)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0073 | 00                      | uint8_t[1]  | .                             | padding\n  +0x0074 | C8 01 00 00             | UOffset32   | 0x000001C8 (456) Loc: 0x023C  | offset to field `name` (string)\n  +0x0078 | 5C 01 00 00             | UOffset32   | 0x0000015C (348) Loc: 0x01D4  | offset to field `bars` (vector)\n  +0x007C | 50 01 00 00             | UOffset32   | 0x00000150 (336) Loc: 0x01CC  | offset to field `bar_baz` (union of type `Baz`)\n  +0x0080 | 34 01 00 00             | UOffset32   | 0x00000134 (308) Loc: 0x01B4  | offset to field `accounts` (vector)\n  +0x0084 | 24 01 00 00             | UOffset32   | 0x00000124 (292) Loc: 0x01A8  | offset to field `bob` (string)\n  +0x0088 | 14 01 00 00             | UOffset32   | 0x00000114 (276) Loc: 0x019C  | offset to field `alice` (string)\n  +0x008C | 0D 00 00 00             | uint32_t    | 0x0000000D (13)               | table field `just_i32` (Int)\n  +0x0090 | DC 00 00 00             | UOffset32   | 0x000000DC (220) Loc: 0x016C  | offset to field `names` (vector)\n  +0x0094 | A0 00 00 00             | UOffset32   | 0x000000A0 (160) Loc: 0x0134  | offset to field `points_of_interest` (vector)\n  +0x0098 | 94 00 00 00             | UOffset32   | 0x00000094 (148) Loc: 0x012C  | offset to field `foobars_type` (vector)\n  +0x009C | 38 00 00 00             | UOffset32   | 0x00000038 (56) Loc: 0x00D4   | offset to field `foobars` (vector)\n  +0x00A0 | 33 00 00 00             | UOffset32   | 0x00000033 (51) Loc: 0x00D3   | offset to field `measurement` (union of type `Tolerance`)\n  +0x00A4 | 1C 00 00 00             | UOffset32   | 0x0000001C (28) Loc: 0x00C0   | offset to field `anything` (union of type `Bar`)\n  +0x00A8 | 04 00 00 00             | UOffset32   | 0x00000004 (4) Loc: 0x00AC    | offset to field `charlie` (string)\n\nstring (AnnotatedBinary.Foo.charlie):\n  +0x00AC | 05 00 00 00             | uint32_t    | 0x00000005 (5)                | length of string\n  +0x00B0 | 61 6C 69 63 65          | char[5]     | alice                         | string literal\n  +0x00B5 | 00                      | char        | 0x00 (0)                      | string terminator\n\npadding:\n  +0x00B6 | 00 00                   | uint8_t[2]  | ..                            | padding\n\nvtable (AnnotatedBinary.Bar):\n  +0x00B8 | 08 00                   | uint16_t    | 0x0008 (8)                    | size of this vtable\n  +0x00BA | 13 00                   | uint16_t    | 0x0013 (19)                   | size of referring table\n  +0x00BC | 08 00                   | VOffset16   | 0x0008 (8)                    | offset to field `a` (id: 0)\n  +0x00BE | 04 00                   | VOffset16   | 0x0004 (4)                    | offset to field `b` (id: 1)\n\ntable (AnnotatedBinary.Bar):\n  +0x00C0 | 08 00 00 00             | SOffset32   | 0x00000008 (8) Loc: 0x00B8    | offset to vtable\n  +0x00C4 | 00 80 23 44             | float       | 0x44238000 (654)              | table field `b` (Float)\n  +0x00C8 | 00 00 00 00 00 10 74 40 | double      | 0x4074100000000000 (321)      | table field `a` (Double)\n  +0x00D0 | 00 00 00                | uint8_t[3]  | ...                           | padding\n\nunion (AnnotatedBinary.Tolerance.measurement):\n  +0x00D3 | 05                      | uint8_t     | 0x05 (5)                      | struct field `measurement.width` of 'AnnotatedBinary.Tolerance' (UByte)\n\nvector (AnnotatedBinary.Foo.foobars):\n  +0x00D4 | 03 00 00 00             | uint32_t    | 0x00000003 (3)                | length of vector (# items)\n  +0x00D8 | 34 00 00 00             | UOffset32   | 0x00000034 (52) Loc: 0x010C   | offset to union[0] (`Bar`)\n  +0x00DC | 2C 00 00 00             | ?uint8_t[4] | ,...                          | WARN: nothing refers to this section.\n  +0x00E0 | 04 00 00 00             | UOffset32   | 0x00000004 (4) Loc: 0x00E4    | offset to union[2] (`Bar`)\n\ntable (AnnotatedBinary.Bar):\n  +0x00E4 | D2 FE FF FF             | SOffset32   | 0xFFFFFED2 (-302) Loc: 0x0212 | offset to vtable\n  +0x00E8 | 00 80 23 44             | float       | 0x44238000 (654)              | table field `b` (Float)\n  +0x00EC | 10 00 00 00             | UOffset32   | 0x00000010 (16) Loc: 0x00FC   | offset to field `c` (table)\n  +0x00F0 | 00 00 00 00 00 D8 8E 40 | double      | 0x408ED80000000000 (987)      | table field `a` (Double)\n  +0x00F8 | 00 00 00 00             | uint8_t[4]  | ....                          | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x00FC | 6A FE FF FF             | SOffset32   | 0xFFFFFE6A (-406) Loc: 0x0292 | offset to vtable\n  +0x0100 | 00 00 00                | uint8_t[3]  | ...                           | padding\n  +0x0103 | 03                      | uint8_t     | 0x03 (3)                      | table field `meal` (Byte)\n\nunknown (no known references):\n  +0x0104 | 04 00 04 00 04 00 00 00 | ?uint8_t[8] | ........                      | WARN: nothing refers to this section.\n\ntable (AnnotatedBinary.Bar):\n  +0x010C | FA FE FF FF             | SOffset32   | 0xFFFFFEFA (-262) Loc: 0x0212 | offset to vtable\n  +0x0110 | 00 00 E4 43             | float       | 0x43E40000 (456)              | table field `b` (Float)\n  +0x0114 | 10 00 00 00             | UOffset32   | 0x00000010 (16) Loc: 0x0124   | offset to field `c` (table)\n  +0x0118 | 00 00 00 00 00 C0 5E 40 | double      | 0x405EC00000000000 (123)      | table field `a` (Double)\n  +0x0120 | 00 00 00 00             | uint8_t[4]  | ....                          | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x0124 | 92 FE FF FF             | SOffset32   | 0xFFFFFE92 (-366) Loc: 0x0292 | offset to vtable\n  +0x0128 | 00 00 00                | uint8_t[3]  | ...                           | padding\n  +0x012B | 01                      | uint8_t     | 0x01 (1)                      | table field `meal` (Byte)\n\nvector (AnnotatedBinary.Foo.foobars_type):\n  +0x012C | 03 00 00 00             | uint32_t    | 0x00000003 (3)                | length of vector (# items)\n  +0x0130 | 01                      | UType8      | 0x01 (1)                      | value[0]\n  +0x0131 | FF                      | UType8      | 0xFF (255)                    | ERROR: value[1]. Invalid union type value.\n  +0x0132 | 01                      | UType8      | 0x01 (1)                      | value[2]\n\nvector (AnnotatedBinary.Foo.points_of_interest):\n  +0x0134 | 03 00 00 00             | uint32_t    | 0x00000003 (3)                | length of vector (# items)\n  +0x0138 | 33 33 33 33 33 A3 45 40 | double      | 0x4045A33333333333 (43.275)   | struct field `[0].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0140 | 7E 57 04 FF 5B 87 53 C0 | double      | 0xC053875BFF04577E (-78.115)  | struct field `[0].longitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0148 | 8D F0 F6 20 04 B6 42 40 | double      | 0x4042B60420F6F08D (37.422)   | struct field `[1].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0150 | 9F 77 63 41 61 85 5E C0 | double      | 0xC05E85614163779F (-122.084) | struct field `[1].longitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0158 | 8F 35 23 83 DC 35 4B C0 | double      | 0xC04B35DC8323358F (-54.4208) | struct field `[2].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0160 | F6 97 DD 93 87 C5 0A 40 | double      | 0x400AC58793DD97F6 (3.34645)  | struct field `[2].longitude` of 'AnnotatedBinary.Location' (Double)\n\npadding:\n  +0x0168 | 00 00 00 00             | uint8_t[4]  | ....                          | padding\n\nvector (AnnotatedBinary.Foo.names):\n  +0x016C | 03 00 00 00             | uint32_t    | 0x00000003 (3)                | length of vector (# items)\n  +0x0170 | 20 00 00 00             | UOffset32   | 0x00000020 (32) Loc: 0x0190   | offset to string[0]\n  +0x0174 | 14 00 00 00             | UOffset32   | 0x00000014 (20) Loc: 0x0188   | offset to string[1]\n  +0x0178 | 04 00 00 00             | UOffset32   | 0x00000004 (4) Loc: 0x017C    | offset to string[2]\n\nstring (AnnotatedBinary.Foo.names):\n  +0x017C | 07 00 00 00             | uint32_t    | 0x00000007 (7)                | length of string\n  +0x0180 | 63 68 61 72 6C 69 65    | char[7]     | charlie                       | string literal\n  +0x0187 | 00                      | char        | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.names):\n  +0x0188 | 03 00 00 00             | uint32_t    | 0x00000003 (3)                | length of string\n  +0x018C | 62 6F 62                | char[3]     | bob                           | string literal\n  +0x018F | 00                      | char        | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.names):\n  +0x0190 | 05 00 00 00             | uint32_t    | 0x00000005 (5)                | length of string\n  +0x0194 | 61 6C 69 63 65          | char[5]     | alice                         | string literal\n  +0x0199 | 00                      | char        | 0x00 (0)                      | string terminator\n\npadding:\n  +0x019A | 00 00                   | uint8_t[2]  | ..                            | padding\n\nstring (AnnotatedBinary.Foo.alice):\n  +0x019C | 07 00 00 00             | uint32_t    | 0x00000007 (7)                | length of string\n  +0x01A0 | 63 68 61 72 6C 69 65    | char[7]     | charlie                       | string literal\n  +0x01A7 | 00                      | char        | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.bob):\n  +0x01A8 | 07 00 00 00             | uint32_t    | 0x00000007 (7)                | length of string\n  +0x01AC | 63 68 61 72 6C 69 65    | char[7]     | charlie                       | string literal\n  +0x01B3 | 00                      | char        | 0x00 (0)                      | string terminator\n\nvector (AnnotatedBinary.Foo.accounts):\n  +0x01B4 | 09 00 00 00             | uint32_t    | 0x00000009 (9)                | length of vector (# items)\n  +0x01B8 | 09 00                   | uint16_t    | 0x0009 (9)                    | value[0]\n  +0x01BA | 08 00                   | uint16_t    | 0x0008 (8)                    | value[1]\n  +0x01BC | 07 00                   | uint16_t    | 0x0007 (7)                    | value[2]\n  +0x01BE | 01 00                   | uint16_t    | 0x0001 (1)                    | value[3]\n  +0x01C0 | 02 00                   | uint16_t    | 0x0002 (2)                    | value[4]\n  +0x01C2 | 03 00                   | uint16_t    | 0x0003 (3)                    | value[5]\n  +0x01C4 | 06 00                   | uint16_t    | 0x0006 (6)                    | value[6]\n  +0x01C6 | 05 00                   | uint16_t    | 0x0005 (5)                    | value[7]\n  +0x01C8 | 04 00                   | uint16_t    | 0x0004 (4)                    | value[8]\n\npadding:\n  +0x01CA | 00 00                   | uint8_t[2]  | ..                            | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x01CC | 3A FF FF FF             | SOffset32   | 0xFFFFFF3A (-198) Loc: 0x0292 | offset to vtable\n  +0x01D0 | 00 00 00                | uint8_t[3]  | ...                           | padding\n  +0x01D3 | 03                      | uint8_t     | 0x03 (3)                      | table field `meal` (Byte)\n\nvector (AnnotatedBinary.Foo.bars):\n  +0x01D4 | 02 00 00 00             | uint32_t    | 0x00000002 (2)                | length of vector (# items)\n  +0x01D8 | 44 00 00 00             | UOffset32   | 0x00000044 (68) Loc: 0x021C   | offset to table[0]\n  +0x01DC | 10 00 00 00             | UOffset32   | 0x00000010 (16) Loc: 0x01EC   | offset to table[1]\n\npadding:\n  +0x01E0 | 00 00                   | uint8_t[2]  | ..                            | padding\n\nvtable (AnnotatedBinary.Bar):\n  +0x01E2 | 0A 00                   | uint16_t    | 0x000A (10)                   | size of this vtable\n  +0x01E4 | 1A 00                   | uint16_t    | 0x001A (26)                   | size of referring table\n  +0x01E6 | 0C 00                   | VOffset16   | 0x000C (12)                   | offset to field `a` (id: 0)\n  +0x01E8 | 04 00                   | VOffset16   | 0x0004 (4)                    | offset to field `b` (id: 1)\n  +0x01EA | 08 00                   | VOffset16   | 0x0008 (8)                    | offset to field `c` (id: 2)\n\ntable (AnnotatedBinary.Bar):\n  +0x01EC | 0A 00 00 00             | SOffset32   | 0x0000000A (10) Loc: 0x01E2   | offset to vtable\n  +0x01F0 | 00 80 23 44             | float       | 0x44238000 (654)              | table field `b` (Float)\n  +0x01F4 | 18 00 00 00             | UOffset32   | 0x00000018 (24) Loc: 0x020C   | offset to field `c` (table)\n  +0x01F8 | 00 00 00 00 00 D8 8E 40 | double      | 0x408ED80000000000 (987)      | table field `a` (Double)\n  +0x0200 | 00 00 00 00 00 00       | uint8_t[6]  | ......                        | padding\n\nvtable (AnnotatedBinary.Baz):\n  +0x0206 | 06 00                   | uint16_t    | 0x0006 (6)                    | size of this vtable\n  +0x0208 | 06 00                   | uint16_t    | 0x0006 (6)                    | size of referring table\n  +0x020A | 05 00                   | VOffset16   | 0x0005 (5)                    | offset to field `meal` (id: 0)\n\ntable (AnnotatedBinary.Baz):\n  +0x020C | 06 00 00 00             | SOffset32   | 0x00000006 (6) Loc: 0x0206    | offset to vtable\n  +0x0210 | 00                      | uint8_t[1]  | .                             | padding\n  +0x0211 | 03                      | uint8_t     | 0x03 (3)                      | table field `meal` (Byte)\n\nvtable (AnnotatedBinary.Bar):\n  +0x0212 | 0A 00                   | uint16_t    | 0x000A (10)                   | size of this vtable\n  +0x0214 | 18 00                   | uint16_t    | 0x0018 (24)                   | size of referring table\n  +0x0216 | 0C 00                   | VOffset16   | 0x000C (12)                   | offset to field `a` (id: 0)\n  +0x0218 | 04 00                   | VOffset16   | 0x0004 (4)                    | offset to field `b` (id: 1)\n  +0x021A | 08 00                   | VOffset16   | 0x0008 (8)                    | offset to field `c` (id: 2)\n\ntable (AnnotatedBinary.Bar):\n  +0x021C | 0A 00 00 00             | SOffset32   | 0x0000000A (10) Loc: 0x0212   | offset to vtable\n  +0x0220 | 00 00 E4 43             | float       | 0x43E40000 (456)              | table field `b` (Float)\n  +0x0224 | 10 00 00 00             | UOffset32   | 0x00000010 (16) Loc: 0x0234   | offset to field `c` (table)\n  +0x0228 | 00 00 00 00 00 C0 5E 40 | double      | 0x405EC00000000000 (123)      | table field `a` (Double)\n  +0x0230 | 00 00 00 00             | uint8_t[4]  | ....                          | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x0234 | A2 FF FF FF             | SOffset32   | 0xFFFFFFA2 (-94) Loc: 0x0292  | offset to vtable\n  +0x0238 | 00 00 00                | uint8_t[3]  | ...                           | padding\n  +0x023B | 01                      | uint8_t     | 0x01 (1)                      | table field `meal` (Byte)\n\nstring (AnnotatedBinary.Foo.name):\n  +0x023C | 2F 00 00 00             | uint32_t    | 0x0000002F (47)               | length of string\n  +0x0240 | 54 68 69 73 20 69 73 20 | char[47]    | This is                       | string literal\n  +0x0248 | 61 20 6C 6F 6E 67 20 73 |             | a long s\n  +0x0250 | 74 72 69 6E 67 20 74 6F |             | tring to\n  +0x0258 | 20 73 68 6F 77 20 68 6F |             |  show ho\n  +0x0260 | 77 20 69 74 20 62 72 65 |             | w it bre\n  +0x0268 | 61 6B 73 20 75 70 2E    |             | aks up.\n  +0x026F | 00                      | char        | 0x00 (0)                      | string terminator\n\npadding:\n  +0x0270 | 00 00                   | uint8_t[2]  | ..                            | padding\n\nvtable (AnnotatedBinary.Bar):\n  +0x0272 | 0A 00                   | uint16_t    | 0x000A (10)                   | size of this vtable\n  +0x0274 | 16 00                   | uint16_t    | 0x0016 (22)                   | size of referring table\n  +0x0276 | 0C 00                   | VOffset16   | 0x000C (12)                   | offset to field `a` (id: 0)\n  +0x0278 | 04 00                   | VOffset16   | 0x0004 (4)                    | offset to field `b` (id: 1)\n  +0x027A | 08 00                   | VOffset16   | 0x0008 (8)                    | offset to field `c` (id: 2)\n\ntable (AnnotatedBinary.Bar):\n  +0x027C | 0A 00 00 00             | SOffset32   | 0x0000000A (10) Loc: 0x0272   | offset to vtable\n  +0x0280 | 65 20 71 49             | float       | 0x49712065 (987654)           | table field `b` (Float)\n  +0x0284 | 14 00 00 00             | UOffset32   | 0x00000014 (20) Loc: 0x0298   | offset to field `c` (table)\n  +0x0288 | C9 76 BE 9F 0C 24 FE 40 | double      | 0x40FE240C9FBE76C9 (123457)   | table field `a` (Double)\n  +0x0290 | 00 00                   | uint8_t[2]  | ..                            | padding\n\nvtable (AnnotatedBinary.Baz):\n  +0x0292 | 06 00                   | uint16_t    | 0x0006 (6)                    | size of this vtable\n  +0x0294 | 08 00                   | uint16_t    | 0x0008 (8)                    | size of referring table\n  +0x0296 | 07 00                   | VOffset16   | 0x0007 (7)                    | offset to field `meal` (id: 0)\n\ntable (AnnotatedBinary.Baz):\n  +0x0298 | 06 00 00 00             | SOffset32   | 0x00000006 (6) Loc: 0x0292    | offset to vtable\n  +0x029C | 00 00 00                | uint8_t[3]  | ...                           | padding\n  +0x029F | 01                      | uint8_t     | 0x01 (1)                      | table field `meal` (Byte)\n"
  },
  {
    "path": "tests/annotated_binary/tests/invalid_vector_unions_cut_short.afb",
    "content": "// Annotated Flatbuffer Binary\n//\n// Schema file: annotated_binary.fbs\n// Binary file: tests/invalid_vector_unions_cut_short.bin\n\nheader:\n  +0x0000 | 44 00 00 00             | UOffset32    | 0x00000044 (68) Loc: 0x0044   | offset to root table `AnnotatedBinary.Foo`\n  +0x0004 | 41 4E 4E 4F             | char[4]      | ANNO                          | File Identifier\n\npadding:\n  +0x0008 | 00 00                   | uint8_t[2]   | ..                            | padding\n\nvtable (AnnotatedBinary.Foo):\n  +0x000A | 3A 00                   | uint16_t     | 0x003A (58)                   | size of this vtable\n  +0x000C | 68 00                   | uint16_t     | 0x0068 (104)                  | size of referring table\n  +0x000E | 0C 00                   | VOffset16    | 0x000C (12)                   | offset to field `counter` (id: 0)\n  +0x0010 | 07 00                   | VOffset16    | 0x0007 (7)                    | offset to field `healthy` (id: 1)\n  +0x0012 | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `level` (id: 2) <defaults to 99> (Long)\n  +0x0014 | 08 00                   | VOffset16    | 0x0008 (8)                    | offset to field `meal` (id: 3)\n  +0x0016 | 10 00                   | VOffset16    | 0x0010 (16)                   | offset to field `bar` (id: 4)\n  +0x0018 | 14 00                   | VOffset16    | 0x0014 (20)                   | offset to field `home` (id: 5)\n  +0x001A | 30 00                   | VOffset16    | 0x0030 (48)                   | offset to field `name` (id: 6)\n  +0x001C | 34 00                   | VOffset16    | 0x0034 (52)                   | offset to field `bars` (id: 7)\n  +0x001E | 09 00                   | VOffset16    | 0x0009 (9)                    | offset to field `bar_baz_type` (id: 8)\n  +0x0020 | 38 00                   | VOffset16    | 0x0038 (56)                   | offset to field `bar_baz` (id: 9)\n  +0x0022 | 3C 00                   | VOffset16    | 0x003C (60)                   | offset to field `accounts` (id: 10)\n  +0x0024 | 40 00                   | VOffset16    | 0x0040 (64)                   | offset to field `bob` (id: 11)\n  +0x0026 | 44 00                   | VOffset16    | 0x0044 (68)                   | offset to field `alice` (id: 12)\n  +0x0028 | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `maybe_i32` (id: 13) <defaults to 0> (Int)\n  +0x002A | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `default_i32` (id: 14) <defaults to 42> (Int)\n  +0x002C | 48 00                   | VOffset16    | 0x0048 (72)                   | offset to field `just_i32` (id: 15)\n  +0x002E | 4C 00                   | VOffset16    | 0x004C (76)                   | offset to field `names` (id: 16)\n  +0x0030 | 50 00                   | VOffset16    | 0x0050 (80)                   | offset to field `points_of_interest` (id: 17)\n  +0x0032 | 54 00                   | VOffset16    | 0x0054 (84)                   | offset to field `foobars_type` (id: 18)\n  +0x0034 | 58 00                   | VOffset16    | 0x0058 (88)                   | offset to field `foobars` (id: 19)\n  +0x0036 | 0A 00                   | VOffset16    | 0x000A (10)                   | offset to field `measurement_type` (id: 20)\n  +0x0038 | 5C 00                   | VOffset16    | 0x005C (92)                   | offset to field `measurement` (id: 21)\n  +0x003A | 0B 00                   | VOffset16    | 0x000B (11)                   | offset to field `anything_type` (id: 22)\n  +0x003C | 60 00                   | VOffset16    | 0x0060 (96)                   | offset to field `anything` (id: 23)\n  +0x003E | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `temperature` (id: 24) <defaults to 98.600000> (Float)\n  +0x0040 | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `teetotaler` (id: 25) <null> (Obj)\n  +0x0042 | 64 00                   | VOffset16    | 0x0064 (100)                  | offset to field `charlie` (id: 26)\n\nroot_table (AnnotatedBinary.Foo):\n  +0x0044 | 3A 00 00 00             | SOffset32    | 0x0000003A (58) Loc: 0x000A   | offset to vtable\n  +0x0048 | 00 00 00                | uint8_t[3]   | ...                           | padding\n  +0x004B | 01                      | uint8_t      | 0x01 (1)                      | table field `healthy` (Bool)\n  +0x004C | 02                      | uint8_t      | 0x02 (2)                      | table field `meal` (Byte)\n  +0x004D | 02                      | UType8       | 0x02 (2)                      | table field `bar_baz_type` (UType)\n  +0x004E | 01                      | UType8       | 0x01 (1)                      | table field `measurement_type` (UType)\n  +0x004F | 01                      | UType8       | 0x01 (1)                      | table field `anything_type` (UType)\n  +0x0050 | D2 04 00 00             | uint32_t     | 0x000004D2 (1234)             | table field `counter` (Int)\n  +0x0054 | 28 02 00 00             | UOffset32    | 0x00000228 (552) Loc: 0x027C  | ERROR: offset to field `bar`. Invalid offset, points outside the binary.\n  +0x0058 | 01 00 00 00             | uint32_t     | 0x00000001 (1)                | struct field `home.floors` of 'AnnotatedBinary.Building' (Int)\n  +0x005C | 02 00 00 00             | uint32_t     | 0x00000002 (2)                | struct field `home.doors` of 'AnnotatedBinary.Building' (Int)\n  +0x0060 | 0C 00 00 00             | uint32_t     | 0x0000000C (12)               | struct field `home.windows` of 'AnnotatedBinary.Building' (Int)\n  +0x0064 | 0A 00 00 00             | uint32_t     | 0x0000000A (10)               | array field `home.dimensions.values`[0] of 'AnnotatedBinary.Dimension' (Int)\n  +0x0068 | 0C 00 00 00             | uint32_t     | 0x0000000C (12)               | array field `home.dimensions.values`[1] of 'AnnotatedBinary.Dimension' (Int)\n  +0x006C | 14 00 00 00             | uint32_t     | 0x00000014 (20)               | array field `home.dimensions.values`[2] of 'AnnotatedBinary.Dimension' (Int)\n  +0x0070 | 01                      | uint8_t      | 0x01 (1)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0071 | 02                      | uint8_t      | 0x02 (2)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0072 | 03                      | uint8_t      | 0x03 (3)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0073 | 00                      | uint8_t[1]   | .                             | padding\n  +0x0074 | C8 01 00 00             | UOffset32    | 0x000001C8 (456) Loc: 0x023C  | ERROR: offset to field `name`. Invalid offset, points outside the binary.\n  +0x0078 | 5C 01 00 00             | UOffset32    | 0x0000015C (348) Loc: 0x01D4  | offset to field `bars` (vector)\n  +0x007C | 50 01 00 00             | UOffset32    | 0x00000150 (336) Loc: 0x01CC  | offset to field `bar_baz` (union of type `Baz`)\n  +0x0080 | 34 01 00 00             | UOffset32    | 0x00000134 (308) Loc: 0x01B4  | offset to field `accounts` (vector)\n  +0x0084 | 24 01 00 00             | UOffset32    | 0x00000124 (292) Loc: 0x01A8  | offset to field `bob` (string)\n  +0x0088 | 14 01 00 00             | UOffset32    | 0x00000114 (276) Loc: 0x019C  | offset to field `alice` (string)\n  +0x008C | 0D 00 00 00             | uint32_t     | 0x0000000D (13)               | table field `just_i32` (Int)\n  +0x0090 | DC 00 00 00             | UOffset32    | 0x000000DC (220) Loc: 0x016C  | offset to field `names` (vector)\n  +0x0094 | A0 00 00 00             | UOffset32    | 0x000000A0 (160) Loc: 0x0134  | offset to field `points_of_interest` (vector)\n  +0x0098 | 94 00 00 00             | UOffset32    | 0x00000094 (148) Loc: 0x012C  | offset to field `foobars_type` (vector)\n  +0x009C | 38 00 00 00             | UOffset32    | 0x00000038 (56) Loc: 0x00D4   | offset to field `foobars` (vector)\n  +0x00A0 | 33 00 00 00             | UOffset32    | 0x00000033 (51) Loc: 0x00D3   | offset to field `measurement` (union of type `Tolerance`)\n  +0x00A4 | 1C 00 00 00             | UOffset32    | 0x0000001C (28) Loc: 0x00C0   | offset to field `anything` (union of type `Bar`)\n  +0x00A8 | 04 00 00 00             | UOffset32    | 0x00000004 (4) Loc: 0x00AC    | offset to field `charlie` (string)\n\nstring (AnnotatedBinary.Foo.charlie):\n  +0x00AC | 05 00 00 00             | uint32_t     | 0x00000005 (5)                | length of string\n  +0x00B0 | 61 6C 69 63 65          | char[5]      | alice                         | string literal\n  +0x00B5 | 00                      | char         | 0x00 (0)                      | string terminator\n\npadding:\n  +0x00B6 | 00 00                   | uint8_t[2]   | ..                            | padding\n\nvtable (AnnotatedBinary.Bar):\n  +0x00B8 | 08 00                   | uint16_t     | 0x0008 (8)                    | size of this vtable\n  +0x00BA | 13 00                   | uint16_t     | 0x0013 (19)                   | size of referring table\n  +0x00BC | 08 00                   | VOffset16    | 0x0008 (8)                    | offset to field `a` (id: 0)\n  +0x00BE | 04 00                   | VOffset16    | 0x0004 (4)                    | offset to field `b` (id: 1)\n\ntable (AnnotatedBinary.Bar):\n  +0x00C0 | 08 00 00 00             | SOffset32    | 0x00000008 (8) Loc: 0x00B8    | offset to vtable\n  +0x00C4 | 00 80 23 44             | float        | 0x44238000 (654)              | table field `b` (Float)\n  +0x00C8 | 00 00 00 00 00 10 74 40 | double       | 0x4074100000000000 (321)      | table field `a` (Double)\n  +0x00D0 | 00 00 00                | uint8_t[3]   | ...                           | padding\n\nunion (AnnotatedBinary.Tolerance.measurement):\n  +0x00D3 | 05                      | uint8_t      | 0x05 (5)                      | struct field `measurement.width` of 'AnnotatedBinary.Tolerance' (UByte)\n\nvector (AnnotatedBinary.Foo.foobars):\n  +0x00D4 | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x00D8 | 34 00 00 00             | UOffset32    | 0x00000034 (52) Loc: 0x010C   | offset to union[0] (`Bar`)\n  +0x00DC | 2C 00 00 00             | UOffset32    | 0x0000002C (44) Loc: 0x0108   | offset to union[1] (`Baz`)\n  +0x00E0 | 04 00 00 00             | UOffset32    | 0x00000004 (4) Loc: 0x00E4    | offset to union[2] (`Bar`)\n\ntable (AnnotatedBinary.Bar):\n  +0x00E4 | D2 FE FF FF             | SOffset32    | 0xFFFFFED2 (-302) Loc: 0x0212 | ERROR: offset to vtable. Invalid offset, points outside the binary.\n\nunknown (no known references):\n  +0x00E8 | 00 80 23 44 10 00 00 00 | ?uint8_t[28] | ..#D....                      | WARN: nothing refers to this section.\n  +0x00F0 | 00 00 00 00 00 D8 8E 40 |              | .......@\n  +0x00F8 | 00 00 00 00 6A FE FF FF |              | ....j...\n  +0x0100 | 00 00 00 03             |              | ....\n\nvtable (AnnotatedBinary.Baz):\n  +0x0104 | 04 00                   | uint16_t     | 0x0004 (4)                    | size of this vtable\n  +0x0106 | 04 00                   | uint16_t     | 0x0004 (4)                    | size of referring table\n\ntable (AnnotatedBinary.Baz):\n  +0x0108 | 04 00 00 00             | SOffset32    | 0x00000004 (4) Loc: 0x0104    | offset to vtable\n\ntable (AnnotatedBinary.Bar):\n  +0x010C | FA FE FF FF             | SOffset32    | 0xFFFFFEFA (-262) Loc: 0x0212 | ERROR: offset to vtable. Invalid offset, points outside the binary.\n\nunknown (no known references):\n  +0x0110 | 00 00 E4 43 10 00 00 00 | ?uint8_t[28] | ...C....                      | WARN: nothing refers to this section.\n  +0x0118 | 00 00 00 00 00 C0 5E 40 |              | ......^@\n  +0x0120 | 00 00 00 00 92 FE FF FF |              | ........\n  +0x0128 | 00 00 00 01             |              | ....\n\nvector (AnnotatedBinary.Foo.foobars_type):\n  +0x012C | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x0130 | 01                      | UType8       | 0x01 (1)                      | value[0]\n  +0x0131 | 02                      | UType8       | 0x02 (2)                      | value[1]\n  +0x0132 | 01                      | UType8       | 0x01 (1)                      | value[2]\n\nvector (AnnotatedBinary.Foo.points_of_interest):\n  +0x0134 | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x0138 | 33 33 33 33 33 A3 45 40 | double       | 0x4045A33333333333 (43.275)   | struct field `[0].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0140 | 7E 57 04 FF 5B 87 53 C0 | double       | 0xC053875BFF04577E (-78.115)  | struct field `[0].longitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0148 | 8D F0 F6 20 04 B6 42 40 | double       | 0x4042B60420F6F08D (37.422)   | struct field `[1].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0150 | 9F 77 63 41 61 85 5E C0 | double       | 0xC05E85614163779F (-122.084) | struct field `[1].longitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0158 | 8F 35 23 83 DC 35 4B C0 | double       | 0xC04B35DC8323358F (-54.4208) | struct field `[2].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0160 | F6 97 DD 93 87 C5 0A 40 | double       | 0x400AC58793DD97F6 (3.34645)  | struct field `[2].longitude` of 'AnnotatedBinary.Location' (Double)\n\npadding:\n  +0x0168 | 00 00 00 00             | uint8_t[4]   | ....                          | padding\n\nvector (AnnotatedBinary.Foo.names):\n  +0x016C | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x0170 | 20 00 00 00             | UOffset32    | 0x00000020 (32) Loc: 0x0190   | offset to string[0]\n  +0x0174 | 14 00 00 00             | UOffset32    | 0x00000014 (20) Loc: 0x0188   | offset to string[1]\n  +0x0178 | 04 00 00 00             | UOffset32    | 0x00000004 (4) Loc: 0x017C    | offset to string[2]\n\nstring (AnnotatedBinary.Foo.names):\n  +0x017C | 07 00 00 00             | uint32_t     | 0x00000007 (7)                | length of string\n  +0x0180 | 63 68 61 72 6C 69 65    | char[7]      | charlie                       | string literal\n  +0x0187 | 00                      | char         | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.names):\n  +0x0188 | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of string\n  +0x018C | 62 6F 62                | char[3]      | bob                           | string literal\n  +0x018F | 00                      | char         | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.names):\n  +0x0190 | 05 00 00 00             | uint32_t     | 0x00000005 (5)                | length of string\n  +0x0194 | 61 6C 69 63 65          | char[5]      | alice                         | string literal\n  +0x0199 | 00                      | char         | 0x00 (0)                      | string terminator\n\npadding:\n  +0x019A | 00 00                   | uint8_t[2]   | ..                            | padding\n\nstring (AnnotatedBinary.Foo.alice):\n  +0x019C | 07 00 00 00             | uint32_t     | 0x00000007 (7)                | length of string\n  +0x01A0 | 63 68 61 72 6C 69 65    | char[7]      | charlie                       | string literal\n  +0x01A7 | 00                      | char         | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.bob):\n  +0x01A8 | 07 00 00 00             | uint32_t     | 0x00000007 (7)                | length of string\n  +0x01AC | 63 68 61 72 6C 69 65    | char[7]      | charlie                       | string literal\n  +0x01B3 | 00                      | char         | 0x00 (0)                      | string terminator\n\nvector (AnnotatedBinary.Foo.accounts):\n  +0x01B4 | 09 00 00 00             | uint32_t     | 0x00000009 (9)                | length of vector (# items)\n  +0x01B8 | 09 00                   | uint16_t     | 0x0009 (9)                    | value[0]\n  +0x01BA | 08 00                   | uint16_t     | 0x0008 (8)                    | value[1]\n  +0x01BC | 07 00                   | uint16_t     | 0x0007 (7)                    | value[2]\n  +0x01BE | 01 00                   | uint16_t     | 0x0001 (1)                    | value[3]\n  +0x01C0 | 02 00                   | uint16_t     | 0x0002 (2)                    | value[4]\n  +0x01C2 | 03 00                   | uint16_t     | 0x0003 (3)                    | value[5]\n  +0x01C4 | 06 00                   | uint16_t     | 0x0006 (6)                    | value[6]\n  +0x01C6 | 05 00                   | uint16_t     | 0x0005 (5)                    | value[7]\n  +0x01C8 | 04 00                   | uint16_t     | 0x0004 (4)                    | value[8]\n\npadding:\n  +0x01CA | 00 00                   | uint8_t[2]   | ..                            | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x01CC | 3A FF FF FF             | SOffset32    | 0xFFFFFF3A (-198) Loc: 0x0292 | ERROR: offset to vtable. Invalid offset, points outside the binary.\n\nunknown (no known references):\n  +0x01D0 | 00 00 00 03             | ?uint8_t[4]  | ....                          | WARN: could be corrupted padding region.\n\nvector (AnnotatedBinary.Foo.bars):\n  +0x01D4 | 02 00 00 00             | uint32_t     | 0x00000002 (2)                | ERROR: length of vector (# items). Longer than the binary.\n\nunknown (no known references):\n  +0x01D8 | 44 00 00 00 10 00       | ?uint8_t[6]  | D.....                        | WARN: could be corrupted padding region.\n"
  },
  {
    "path": "tests/annotated_binary/tests/invalid_vtable_field_offset.afb",
    "content": "// Annotated Flatbuffer Binary\n//\n// Schema file: annotated_binary.fbs\n// Binary file: tests/invalid_vtable_field_offset.bin\n\nheader:\n  +0x0000 | 44 00 00 00             | UOffset32    | 0x00000044 (68) Loc: 0x0044   | offset to root table `AnnotatedBinary.Foo`\n  +0x0004 | 41 4E 4E 4F             | char[4]      | ANNO                          | File Identifier\n\npadding:\n  +0x0008 | 00 00                   | uint8_t[2]   | ..                            | padding\n\nvtable (AnnotatedBinary.Foo):\n  +0x000A | 3A 00                   | uint16_t     | 0x003A (58)                   | size of this vtable\n  +0x000C | 68 00                   | uint16_t     | 0x0068 (104)                  | size of referring table\n  +0x000E | 0C 00                   | VOffset16    | 0x000C (12)                   | offset to field `counter` (id: 0)\n  +0x0010 | 07 00                   | VOffset16    | 0x0007 (7)                    | offset to field `healthy` (id: 1)\n  +0x0012 | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `level` (id: 2) <defaults to 99> (Long)\n  +0x0014 | 08 00                   | VOffset16    | 0x0008 (8)                    | offset to field `meal` (id: 3)\n  +0x0016 | FF FF                   | VOffset16    | 0xFFFF (65535)                | ERROR: offset to field `bar` (id: 4). Invalid offset, points outside the binary.\n  +0x0018 | 14 00                   | VOffset16    | 0x0014 (20)                   | offset to field `home` (id: 5)\n  +0x001A | 30 00                   | VOffset16    | 0x0030 (48)                   | offset to field `name` (id: 6)\n  +0x001C | 34 00                   | VOffset16    | 0x0034 (52)                   | offset to field `bars` (id: 7)\n  +0x001E | 09 00                   | VOffset16    | 0x0009 (9)                    | offset to field `bar_baz_type` (id: 8)\n  +0x0020 | 38 00                   | VOffset16    | 0x0038 (56)                   | offset to field `bar_baz` (id: 9)\n  +0x0022 | 3C 00                   | VOffset16    | 0x003C (60)                   | offset to field `accounts` (id: 10)\n  +0x0024 | 40 00                   | VOffset16    | 0x0040 (64)                   | offset to field `bob` (id: 11)\n  +0x0026 | 44 00                   | VOffset16    | 0x0044 (68)                   | offset to field `alice` (id: 12)\n  +0x0028 | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `maybe_i32` (id: 13) <defaults to 0> (Int)\n  +0x002A | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `default_i32` (id: 14) <defaults to 42> (Int)\n  +0x002C | 48 00                   | VOffset16    | 0x0048 (72)                   | offset to field `just_i32` (id: 15)\n  +0x002E | 4C 00                   | VOffset16    | 0x004C (76)                   | offset to field `names` (id: 16)\n  +0x0030 | 50 00                   | VOffset16    | 0x0050 (80)                   | offset to field `points_of_interest` (id: 17)\n  +0x0032 | 54 00                   | VOffset16    | 0x0054 (84)                   | offset to field `foobars_type` (id: 18)\n  +0x0034 | 58 00                   | VOffset16    | 0x0058 (88)                   | offset to field `foobars` (id: 19)\n  +0x0036 | 0A 00                   | VOffset16    | 0x000A (10)                   | offset to field `measurement_type` (id: 20)\n  +0x0038 | 5C 00                   | VOffset16    | 0x005C (92)                   | offset to field `measurement` (id: 21)\n  +0x003A | 0B 00                   | VOffset16    | 0x000B (11)                   | offset to field `anything_type` (id: 22)\n  +0x003C | 60 00                   | VOffset16    | 0x0060 (96)                   | offset to field `anything` (id: 23)\n  +0x003E | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `temperature` (id: 24) <defaults to 98.600000> (Float)\n  +0x0040 | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `teetotaler` (id: 25) <null> (Obj)\n  +0x0042 | 64 00                   | VOffset16    | 0x0064 (100)                  | offset to field `charlie` (id: 26)\n  +0x0042 | 64 00                   | VOffset16    | 0x0064 (100)                  | offset to unknown field (id: 26)\n\nroot_table (AnnotatedBinary.Foo):\n  +0x0044 | 3A 00 00 00             | SOffset32    | 0x0000003A (58) Loc: 0x000A   | offset to vtable\n  +0x0048 | 00 00 00                | uint8_t[3]   | ...                           | padding\n  +0x004B | 01                      | uint8_t      | 0x01 (1)                      | table field `healthy` (Bool)\n  +0x004C | 02                      | uint8_t      | 0x02 (2)                      | table field `meal` (Byte)\n  +0x004D | 02                      | UType8       | 0x02 (2)                      | table field `bar_baz_type` (UType)\n  +0x004E | 01                      | UType8       | 0x01 (1)                      | table field `measurement_type` (UType)\n  +0x004F | 01                      | UType8       | 0x01 (1)                      | table field `anything_type` (UType)\n  +0x0050 | D2 04 00 00             | uint32_t     | 0x000004D2 (1234)             | table field `counter` (Int)\n  +0x0054 | 28 02 00 00             | ?uint8_t[4]  | (...                          | WARN: nothing refers to this section.\n  +0x0058 | 01 00 00 00             | uint32_t     | 0x00000001 (1)                | struct field `home.floors` of 'AnnotatedBinary.Building' (Int)\n  +0x005C | 02 00 00 00             | uint32_t     | 0x00000002 (2)                | struct field `home.doors` of 'AnnotatedBinary.Building' (Int)\n  +0x0060 | 0C 00 00 00             | uint32_t     | 0x0000000C (12)               | struct field `home.windows` of 'AnnotatedBinary.Building' (Int)\n  +0x0064 | 0A 00 00 00             | uint32_t     | 0x0000000A (10)               | array field `home.dimensions.values`[0] of 'AnnotatedBinary.Dimension' (Int)\n  +0x0068 | 0C 00 00 00             | uint32_t     | 0x0000000C (12)               | array field `home.dimensions.values`[1] of 'AnnotatedBinary.Dimension' (Int)\n  +0x006C | 14 00 00 00             | uint32_t     | 0x00000014 (20)               | array field `home.dimensions.values`[2] of 'AnnotatedBinary.Dimension' (Int)\n  +0x0070 | 01                      | uint8_t      | 0x01 (1)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0071 | 02                      | uint8_t      | 0x02 (2)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0072 | 03                      | uint8_t      | 0x03 (3)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0073 | 00                      | uint8_t[1]   | .                             | padding\n  +0x0074 | C8 01 00 00             | UOffset32    | 0x000001C8 (456) Loc: 0x023C  | offset to field `name` (string)\n  +0x0078 | 5C 01 00 00             | UOffset32    | 0x0000015C (348) Loc: 0x01D4  | offset to field `bars` (vector)\n  +0x007C | 50 01 00 00             | UOffset32    | 0x00000150 (336) Loc: 0x01CC  | offset to field `bar_baz` (union of type `Baz`)\n  +0x0080 | 34 01 00 00             | UOffset32    | 0x00000134 (308) Loc: 0x01B4  | offset to field `accounts` (vector)\n  +0x0084 | 24 01 00 00             | UOffset32    | 0x00000124 (292) Loc: 0x01A8  | offset to field `bob` (string)\n  +0x0088 | 14 01 00 00             | UOffset32    | 0x00000114 (276) Loc: 0x019C  | offset to field `alice` (string)\n  +0x008C | 0D 00 00 00             | uint32_t     | 0x0000000D (13)               | table field `just_i32` (Int)\n  +0x0090 | DC 00 00 00             | UOffset32    | 0x000000DC (220) Loc: 0x016C  | offset to field `names` (vector)\n  +0x0094 | A0 00 00 00             | UOffset32    | 0x000000A0 (160) Loc: 0x0134  | offset to field `points_of_interest` (vector)\n  +0x0098 | 94 00 00 00             | UOffset32    | 0x00000094 (148) Loc: 0x012C  | offset to field `foobars_type` (vector)\n  +0x009C | 38 00 00 00             | UOffset32    | 0x00000038 (56) Loc: 0x00D4   | offset to field `foobars` (vector)\n  +0x00A0 | 33 00 00 00             | UOffset32    | 0x00000033 (51) Loc: 0x00D3   | offset to field `measurement` (union of type `Tolerance`)\n  +0x00A4 | 1C 00 00 00             | UOffset32    | 0x0000001C (28) Loc: 0x00C0   | offset to field `anything` (union of type `Bar`)\n  +0x00A8 | 04 00 00 00             | UOffset32    | 0x00000004 (4) Loc: 0x00AC    | offset to field `charlie` (string)\n\nstring (AnnotatedBinary.Foo.charlie):\n  +0x00AC | 05 00 00 00             | uint32_t     | 0x00000005 (5)                | length of string\n  +0x00B0 | 61 6C 69 63 65          | char[5]      | alice                         | string literal\n  +0x00B5 | 00                      | char         | 0x00 (0)                      | string terminator\n\npadding:\n  +0x00B6 | 00 00                   | uint8_t[2]   | ..                            | padding\n\nvtable (AnnotatedBinary.Bar):\n  +0x00B8 | 08 00                   | uint16_t     | 0x0008 (8)                    | size of this vtable\n  +0x00BA | 13 00                   | uint16_t     | 0x0013 (19)                   | size of referring table\n  +0x00BC | 08 00                   | VOffset16    | 0x0008 (8)                    | offset to field `a` (id: 0)\n  +0x00BE | 04 00                   | VOffset16    | 0x0004 (4)                    | offset to field `b` (id: 1)\n\ntable (AnnotatedBinary.Bar):\n  +0x00C0 | 08 00 00 00             | SOffset32    | 0x00000008 (8) Loc: 0x00B8    | offset to vtable\n  +0x00C4 | 00 80 23 44             | float        | 0x44238000 (654)              | table field `b` (Float)\n  +0x00C8 | 00 00 00 00 00 10 74 40 | double       | 0x4074100000000000 (321)      | table field `a` (Double)\n  +0x00D0 | 00 00 00                | uint8_t[3]   | ...                           | padding\n\nunion (AnnotatedBinary.Tolerance.measurement):\n  +0x00D3 | 05                      | uint8_t      | 0x05 (5)                      | struct field `measurement.width` of 'AnnotatedBinary.Tolerance' (UByte)\n\nvector (AnnotatedBinary.Foo.foobars):\n  +0x00D4 | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x00D8 | 34 00 00 00             | UOffset32    | 0x00000034 (52) Loc: 0x010C   | offset to union[0] (`Bar`)\n  +0x00DC | 2C 00 00 00             | UOffset32    | 0x0000002C (44) Loc: 0x0108   | offset to union[1] (`Baz`)\n  +0x00E0 | 04 00 00 00             | UOffset32    | 0x00000004 (4) Loc: 0x00E4    | offset to union[2] (`Bar`)\n\ntable (AnnotatedBinary.Bar):\n  +0x00E4 | D2 FE FF FF             | SOffset32    | 0xFFFFFED2 (-302) Loc: 0x0212 | offset to vtable\n  +0x00E8 | 00 80 23 44             | float        | 0x44238000 (654)              | table field `b` (Float)\n  +0x00EC | 10 00 00 00             | UOffset32    | 0x00000010 (16) Loc: 0x00FC   | offset to field `c` (table)\n  +0x00F0 | 00 00 00 00 00 D8 8E 40 | double       | 0x408ED80000000000 (987)      | table field `a` (Double)\n  +0x00F8 | 00 00 00 00             | uint8_t[4]   | ....                          | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x00FC | 6A FE FF FF             | SOffset32    | 0xFFFFFE6A (-406) Loc: 0x0292 | offset to vtable\n  +0x0100 | 00 00 00                | uint8_t[3]   | ...                           | padding\n  +0x0103 | 03                      | uint8_t      | 0x03 (3)                      | table field `meal` (Byte)\n\nvtable (AnnotatedBinary.Baz):\n  +0x0104 | 04 00                   | uint16_t     | 0x0004 (4)                    | size of this vtable\n  +0x0106 | 04 00                   | uint16_t     | 0x0004 (4)                    | size of referring table\n\ntable (AnnotatedBinary.Baz):\n  +0x0108 | 04 00 00 00             | SOffset32    | 0x00000004 (4) Loc: 0x0104    | offset to vtable\n\ntable (AnnotatedBinary.Bar):\n  +0x010C | FA FE FF FF             | SOffset32    | 0xFFFFFEFA (-262) Loc: 0x0212 | offset to vtable\n  +0x0110 | 00 00 E4 43             | float        | 0x43E40000 (456)              | table field `b` (Float)\n  +0x0114 | 10 00 00 00             | UOffset32    | 0x00000010 (16) Loc: 0x0124   | offset to field `c` (table)\n  +0x0118 | 00 00 00 00 00 C0 5E 40 | double       | 0x405EC00000000000 (123)      | table field `a` (Double)\n  +0x0120 | 00 00 00 00             | uint8_t[4]   | ....                          | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x0124 | 92 FE FF FF             | SOffset32    | 0xFFFFFE92 (-366) Loc: 0x0292 | offset to vtable\n  +0x0128 | 00 00 00                | uint8_t[3]   | ...                           | padding\n  +0x012B | 01                      | uint8_t      | 0x01 (1)                      | table field `meal` (Byte)\n\nvector (AnnotatedBinary.Foo.foobars_type):\n  +0x012C | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x0130 | 01                      | UType8       | 0x01 (1)                      | value[0]\n  +0x0131 | 02                      | UType8       | 0x02 (2)                      | value[1]\n  +0x0132 | 01                      | UType8       | 0x01 (1)                      | value[2]\n\nvector (AnnotatedBinary.Foo.points_of_interest):\n  +0x0134 | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x0138 | 33 33 33 33 33 A3 45 40 | double       | 0x4045A33333333333 (43.275)   | struct field `[0].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0140 | 7E 57 04 FF 5B 87 53 C0 | double       | 0xC053875BFF04577E (-78.115)  | struct field `[0].longitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0148 | 8D F0 F6 20 04 B6 42 40 | double       | 0x4042B60420F6F08D (37.422)   | struct field `[1].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0150 | 9F 77 63 41 61 85 5E C0 | double       | 0xC05E85614163779F (-122.084) | struct field `[1].longitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0158 | 8F 35 23 83 DC 35 4B C0 | double       | 0xC04B35DC8323358F (-54.4208) | struct field `[2].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0160 | F6 97 DD 93 87 C5 0A 40 | double       | 0x400AC58793DD97F6 (3.34645)  | struct field `[2].longitude` of 'AnnotatedBinary.Location' (Double)\n\npadding:\n  +0x0168 | 00 00 00 00             | uint8_t[4]   | ....                          | padding\n\nvector (AnnotatedBinary.Foo.names):\n  +0x016C | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x0170 | 20 00 00 00             | UOffset32    | 0x00000020 (32) Loc: 0x0190   | offset to string[0]\n  +0x0174 | 14 00 00 00             | UOffset32    | 0x00000014 (20) Loc: 0x0188   | offset to string[1]\n  +0x0178 | 04 00 00 00             | UOffset32    | 0x00000004 (4) Loc: 0x017C    | offset to string[2]\n\nstring (AnnotatedBinary.Foo.names):\n  +0x017C | 07 00 00 00             | uint32_t     | 0x00000007 (7)                | length of string\n  +0x0180 | 63 68 61 72 6C 69 65    | char[7]      | charlie                       | string literal\n  +0x0187 | 00                      | char         | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.names):\n  +0x0188 | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of string\n  +0x018C | 62 6F 62                | char[3]      | bob                           | string literal\n  +0x018F | 00                      | char         | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.names):\n  +0x0190 | 05 00 00 00             | uint32_t     | 0x00000005 (5)                | length of string\n  +0x0194 | 61 6C 69 63 65          | char[5]      | alice                         | string literal\n  +0x0199 | 00                      | char         | 0x00 (0)                      | string terminator\n\npadding:\n  +0x019A | 00 00                   | uint8_t[2]   | ..                            | padding\n\nstring (AnnotatedBinary.Foo.alice):\n  +0x019C | 07 00 00 00             | uint32_t     | 0x00000007 (7)                | length of string\n  +0x01A0 | 63 68 61 72 6C 69 65    | char[7]      | charlie                       | string literal\n  +0x01A7 | 00                      | char         | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.bob):\n  +0x01A8 | 07 00 00 00             | uint32_t     | 0x00000007 (7)                | length of string\n  +0x01AC | 63 68 61 72 6C 69 65    | char[7]      | charlie                       | string literal\n  +0x01B3 | 00                      | char         | 0x00 (0)                      | string terminator\n\nvector (AnnotatedBinary.Foo.accounts):\n  +0x01B4 | 09 00 00 00             | uint32_t     | 0x00000009 (9)                | length of vector (# items)\n  +0x01B8 | 09 00                   | uint16_t     | 0x0009 (9)                    | value[0]\n  +0x01BA | 08 00                   | uint16_t     | 0x0008 (8)                    | value[1]\n  +0x01BC | 07 00                   | uint16_t     | 0x0007 (7)                    | value[2]\n  +0x01BE | 01 00                   | uint16_t     | 0x0001 (1)                    | value[3]\n  +0x01C0 | 02 00                   | uint16_t     | 0x0002 (2)                    | value[4]\n  +0x01C2 | 03 00                   | uint16_t     | 0x0003 (3)                    | value[5]\n  +0x01C4 | 06 00                   | uint16_t     | 0x0006 (6)                    | value[6]\n  +0x01C6 | 05 00                   | uint16_t     | 0x0005 (5)                    | value[7]\n  +0x01C8 | 04 00                   | uint16_t     | 0x0004 (4)                    | value[8]\n\npadding:\n  +0x01CA | 00 00                   | uint8_t[2]   | ..                            | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x01CC | 3A FF FF FF             | SOffset32    | 0xFFFFFF3A (-198) Loc: 0x0292 | offset to vtable\n  +0x01D0 | 00 00 00                | uint8_t[3]   | ...                           | padding\n  +0x01D3 | 03                      | uint8_t      | 0x03 (3)                      | table field `meal` (Byte)\n\nvector (AnnotatedBinary.Foo.bars):\n  +0x01D4 | 02 00 00 00             | uint32_t     | 0x00000002 (2)                | length of vector (# items)\n  +0x01D8 | 44 00 00 00             | UOffset32    | 0x00000044 (68) Loc: 0x021C   | offset to table[0]\n  +0x01DC | 10 00 00 00             | UOffset32    | 0x00000010 (16) Loc: 0x01EC   | offset to table[1]\n\npadding:\n  +0x01E0 | 00 00                   | uint8_t[2]   | ..                            | padding\n\nvtable (AnnotatedBinary.Bar):\n  +0x01E2 | 0A 00                   | uint16_t     | 0x000A (10)                   | size of this vtable\n  +0x01E4 | 1A 00                   | uint16_t     | 0x001A (26)                   | size of referring table\n  +0x01E6 | 0C 00                   | VOffset16    | 0x000C (12)                   | offset to field `a` (id: 0)\n  +0x01E8 | 04 00                   | VOffset16    | 0x0004 (4)                    | offset to field `b` (id: 1)\n  +0x01EA | 08 00                   | VOffset16    | 0x0008 (8)                    | offset to field `c` (id: 2)\n\ntable (AnnotatedBinary.Bar):\n  +0x01EC | 0A 00 00 00             | SOffset32    | 0x0000000A (10) Loc: 0x01E2   | offset to vtable\n  +0x01F0 | 00 80 23 44             | float        | 0x44238000 (654)              | table field `b` (Float)\n  +0x01F4 | 18 00 00 00             | UOffset32    | 0x00000018 (24) Loc: 0x020C   | offset to field `c` (table)\n  +0x01F8 | 00 00 00 00 00 D8 8E 40 | double       | 0x408ED80000000000 (987)      | table field `a` (Double)\n  +0x0200 | 00 00 00 00 00 00       | uint8_t[6]   | ......                        | padding\n\nvtable (AnnotatedBinary.Baz):\n  +0x0206 | 06 00                   | uint16_t     | 0x0006 (6)                    | size of this vtable\n  +0x0208 | 06 00                   | uint16_t     | 0x0006 (6)                    | size of referring table\n  +0x020A | 05 00                   | VOffset16    | 0x0005 (5)                    | offset to field `meal` (id: 0)\n\ntable (AnnotatedBinary.Baz):\n  +0x020C | 06 00 00 00             | SOffset32    | 0x00000006 (6) Loc: 0x0206    | offset to vtable\n  +0x0210 | 00                      | uint8_t[1]   | .                             | padding\n  +0x0211 | 03                      | uint8_t      | 0x03 (3)                      | table field `meal` (Byte)\n\nvtable (AnnotatedBinary.Bar):\n  +0x0212 | 0A 00                   | uint16_t     | 0x000A (10)                   | size of this vtable\n  +0x0214 | 18 00                   | uint16_t     | 0x0018 (24)                   | size of referring table\n  +0x0216 | 0C 00                   | VOffset16    | 0x000C (12)                   | offset to field `a` (id: 0)\n  +0x0218 | 04 00                   | VOffset16    | 0x0004 (4)                    | offset to field `b` (id: 1)\n  +0x021A | 08 00                   | VOffset16    | 0x0008 (8)                    | offset to field `c` (id: 2)\n\ntable (AnnotatedBinary.Bar):\n  +0x021C | 0A 00 00 00             | SOffset32    | 0x0000000A (10) Loc: 0x0212   | offset to vtable\n  +0x0220 | 00 00 E4 43             | float        | 0x43E40000 (456)              | table field `b` (Float)\n  +0x0224 | 10 00 00 00             | UOffset32    | 0x00000010 (16) Loc: 0x0234   | offset to field `c` (table)\n  +0x0228 | 00 00 00 00 00 C0 5E 40 | double       | 0x405EC00000000000 (123)      | table field `a` (Double)\n  +0x0230 | 00 00 00 00             | uint8_t[4]   | ....                          | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x0234 | A2 FF FF FF             | SOffset32    | 0xFFFFFFA2 (-94) Loc: 0x0292  | offset to vtable\n  +0x0238 | 00 00 00                | uint8_t[3]   | ...                           | padding\n  +0x023B | 01                      | uint8_t      | 0x01 (1)                      | table field `meal` (Byte)\n\nstring (AnnotatedBinary.Foo.name):\n  +0x023C | 2F 00 00 00             | uint32_t     | 0x0000002F (47)               | length of string\n  +0x0240 | 54 68 69 73 20 69 73 20 | char[47]     | This is                       | string literal\n  +0x0248 | 61 20 6C 6F 6E 67 20 73 |              | a long s\n  +0x0250 | 74 72 69 6E 67 20 74 6F |              | tring to\n  +0x0258 | 20 73 68 6F 77 20 68 6F |              |  show ho\n  +0x0260 | 77 20 69 74 20 62 72 65 |              | w it bre\n  +0x0268 | 61 6B 73 20 75 70 2E    |              | aks up.\n  +0x026F | 00                      | char         | 0x00 (0)                      | string terminator\n\nunknown (no known references):\n  +0x0270 | 00 00 0A 00 16 00 0C 00 | ?uint8_t[34] | ........                      | WARN: nothing refers to this section.\n  +0x0278 | 04 00 08 00 0A 00 00 00 |              | ........\n  +0x0280 | 65 20 71 49 14 00 00 00 |              | e qI....\n  +0x0288 | C9 76 BE 9F 0C 24 FE 40 |              | .v...$.@\n  +0x0290 | 00 00                   |              | ..\n\nvtable (AnnotatedBinary.Baz):\n  +0x0292 | 06 00                   | uint16_t     | 0x0006 (6)                    | size of this vtable\n  +0x0294 | 08 00                   | uint16_t     | 0x0008 (8)                    | size of referring table\n  +0x0296 | 07 00                   | VOffset16    | 0x0007 (7)                    | offset to field `meal` (id: 0)\n\nunknown (no known references):\n  +0x0298 | 06 00 00 00 00 00 00 01 | ?uint8_t[8]  | ........                      | WARN: nothing refers to this section.\n"
  },
  {
    "path": "tests/annotated_binary/tests/invalid_vtable_ref_table_size.afb",
    "content": "// Annotated Flatbuffer Binary\n//\n// Schema file: annotated_binary.fbs\n// Binary file: tests/invalid_vtable_ref_table_size.bin\n\nheader:\n  +0x0000 | 44 00 00 00             | UOffset32    | 0x00000044 (68) Loc: 0x0044   | offset to root table `AnnotatedBinary.Foo`\n  +0x0004 | 41 4E 4E 4F             | char[4]      | ANNO                          | File Identifier\n\npadding:\n  +0x0008 | 00 00                   | uint8_t[2]   | ..                            | padding\n\nvtable (AnnotatedBinary.Foo):\n  +0x000A | 3A 00                   | uint16_t     | 0x003A (58)                   | size of this vtable\n  +0x000C | FF FF                   | uint16_t     | 0xFFFF (65535)                | ERROR: size of referring table. Longer than the binary.\n  +0x000E | 0C 00                   | VOffset16    | 0x000C (12)                   | offset to field `counter` (id: 0)\n  +0x0010 | 07 00                   | VOffset16    | 0x0007 (7)                    | offset to field `healthy` (id: 1)\n  +0x0012 | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `level` (id: 2) <defaults to 99> (Long)\n  +0x0014 | 08 00                   | VOffset16    | 0x0008 (8)                    | offset to field `meal` (id: 3)\n  +0x0016 | 10 00                   | VOffset16    | 0x0010 (16)                   | offset to field `bar` (id: 4)\n  +0x0018 | 14 00                   | VOffset16    | 0x0014 (20)                   | offset to field `home` (id: 5)\n  +0x001A | 30 00                   | VOffset16    | 0x0030 (48)                   | offset to field `name` (id: 6)\n  +0x001C | 34 00                   | VOffset16    | 0x0034 (52)                   | offset to field `bars` (id: 7)\n  +0x001E | 09 00                   | VOffset16    | 0x0009 (9)                    | offset to field `bar_baz_type` (id: 8)\n  +0x0020 | 38 00                   | VOffset16    | 0x0038 (56)                   | offset to field `bar_baz` (id: 9)\n  +0x0022 | 3C 00                   | VOffset16    | 0x003C (60)                   | offset to field `accounts` (id: 10)\n  +0x0024 | 40 00                   | VOffset16    | 0x0040 (64)                   | offset to field `bob` (id: 11)\n  +0x0026 | 44 00                   | VOffset16    | 0x0044 (68)                   | offset to field `alice` (id: 12)\n  +0x0028 | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `maybe_i32` (id: 13) <defaults to 0> (Int)\n  +0x002A | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `default_i32` (id: 14) <defaults to 42> (Int)\n  +0x002C | 48 00                   | VOffset16    | 0x0048 (72)                   | offset to field `just_i32` (id: 15)\n  +0x002E | 4C 00                   | VOffset16    | 0x004C (76)                   | offset to field `names` (id: 16)\n  +0x0030 | 50 00                   | VOffset16    | 0x0050 (80)                   | offset to field `points_of_interest` (id: 17)\n  +0x0032 | 54 00                   | VOffset16    | 0x0054 (84)                   | offset to field `foobars_type` (id: 18)\n  +0x0034 | 58 00                   | VOffset16    | 0x0058 (88)                   | offset to field `foobars` (id: 19)\n  +0x0036 | 0A 00                   | VOffset16    | 0x000A (10)                   | offset to field `measurement_type` (id: 20)\n  +0x0038 | 5C 00                   | VOffset16    | 0x005C (92)                   | offset to field `measurement` (id: 21)\n  +0x003A | 0B 00                   | VOffset16    | 0x000B (11)                   | offset to field `anything_type` (id: 22)\n  +0x003C | 60 00                   | VOffset16    | 0x0060 (96)                   | offset to field `anything` (id: 23)\n  +0x003E | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `temperature` (id: 24) <defaults to 98.600000> (Float)\n  +0x0040 | 00 00                   | VOffset16    | 0x0000 (0)                    | offset to field `teetotaler` (id: 25) <null> (Obj)\n  +0x0042 | 64 00                   | VOffset16    | 0x0064 (100)                  | offset to field `charlie` (id: 26)\n\nroot_table (AnnotatedBinary.Foo):\n  +0x0044 | 3A 00 00 00             | SOffset32    | 0x0000003A (58) Loc: 0x000A   | offset to vtable\n  +0x0048 | 00 00 00                | uint8_t[3]   | ...                           | padding\n  +0x004B | 01                      | uint8_t      | 0x01 (1)                      | table field `healthy` (Bool)\n  +0x004C | 02                      | uint8_t      | 0x02 (2)                      | table field `meal` (Byte)\n  +0x004D | 02                      | UType8       | 0x02 (2)                      | table field `bar_baz_type` (UType)\n  +0x004E | 01                      | UType8       | 0x01 (1)                      | table field `measurement_type` (UType)\n  +0x004F | 01                      | UType8       | 0x01 (1)                      | table field `anything_type` (UType)\n  +0x0050 | D2 04 00 00             | uint32_t     | 0x000004D2 (1234)             | table field `counter` (Int)\n  +0x0054 | 28 02 00 00             | UOffset32    | 0x00000228 (552) Loc: 0x027C  | offset to field `bar` (table)\n  +0x0058 | 01 00 00 00             | uint32_t     | 0x00000001 (1)                | struct field `home.floors` of 'AnnotatedBinary.Building' (Int)\n  +0x005C | 02 00 00 00             | uint32_t     | 0x00000002 (2)                | struct field `home.doors` of 'AnnotatedBinary.Building' (Int)\n  +0x0060 | 0C 00 00 00             | uint32_t     | 0x0000000C (12)               | struct field `home.windows` of 'AnnotatedBinary.Building' (Int)\n  +0x0064 | 0A 00 00 00             | uint32_t     | 0x0000000A (10)               | array field `home.dimensions.values`[0] of 'AnnotatedBinary.Dimension' (Int)\n  +0x0068 | 0C 00 00 00             | uint32_t     | 0x0000000C (12)               | array field `home.dimensions.values`[1] of 'AnnotatedBinary.Dimension' (Int)\n  +0x006C | 14 00 00 00             | uint32_t     | 0x00000014 (20)               | array field `home.dimensions.values`[2] of 'AnnotatedBinary.Dimension' (Int)\n  +0x0070 | 01                      | uint8_t      | 0x01 (1)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0071 | 02                      | uint8_t      | 0x02 (2)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0072 | 03                      | uint8_t      | 0x03 (3)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0073 | 00                      | uint8_t[1]   | .                             | padding\n  +0x0074 | C8 01 00 00             | UOffset32    | 0x000001C8 (456) Loc: 0x023C  | offset to field `name` (string)\n  +0x0078 | 5C 01 00 00             | UOffset32    | 0x0000015C (348) Loc: 0x01D4  | offset to field `bars` (vector)\n  +0x007C | 50 01 00 00             | UOffset32    | 0x00000150 (336) Loc: 0x01CC  | offset to field `bar_baz` (union of type `Baz`)\n  +0x0080 | 34 01 00 00             | UOffset32    | 0x00000134 (308) Loc: 0x01B4  | offset to field `accounts` (vector)\n  +0x0084 | 24 01 00 00             | UOffset32    | 0x00000124 (292) Loc: 0x01A8  | offset to field `bob` (string)\n  +0x0088 | 14 01 00 00             | UOffset32    | 0x00000114 (276) Loc: 0x019C  | offset to field `alice` (string)\n  +0x008C | 0D 00 00 00             | uint32_t     | 0x0000000D (13)               | table field `just_i32` (Int)\n  +0x0090 | DC 00 00 00             | UOffset32    | 0x000000DC (220) Loc: 0x016C  | offset to field `names` (vector)\n  +0x0094 | A0 00 00 00             | UOffset32    | 0x000000A0 (160) Loc: 0x0134  | offset to field `points_of_interest` (vector)\n  +0x0098 | 94 00 00 00             | UOffset32    | 0x00000094 (148) Loc: 0x012C  | offset to field `foobars_type` (vector)\n  +0x009C | 38 00 00 00             | UOffset32    | 0x00000038 (56) Loc: 0x00D4   | offset to field `foobars` (vector)\n  +0x00A0 | 33 00 00 00             | UOffset32    | 0x00000033 (51) Loc: 0x00D3   | offset to field `measurement` (union of type `Tolerance`)\n  +0x00A4 | 1C 00 00 00             | UOffset32    | 0x0000001C (28) Loc: 0x00C0   | offset to field `anything` (union of type `Bar`)\n  +0x00A8 | 04 00 00 00             | UOffset32    | 0x00000004 (4) Loc: 0x00AC    | offset to field `charlie` (string)\n  +0x00AC | 05 00 00 00 61 6C 69 63 | uint8_t[500] | ....alic                      | padding\n  +0x00B4 | 65 00 00 00 08 00 13 00 |              | e.......\n  +0x00BC | 08 00 04 00 08 00 00 00 |              | ........\n  +0x00C4 | 00 80 23 44 00 00 00 00 |              | ..#D....\n  +0x00CC | 00 10 74 40 00 00 00 05 |              | ..t@....\n  +0x00D4 | 03 00 00 00 34 00 00 00 |              | ....4...\n  +0x00DC | 2C 00 00 00 04 00 00 00 |              | ,.......\n  +0x00E4 | D2 FE FF FF 00 80 23 44 |              | ......#D\n  +0x00EC | 10 00 00 00 00 00 00 00 |              | ........\n  +0x00F4 | 00 D8 8E 40 00 00 00 00 |              | ...@....\n  +0x00FC | 6A FE FF FF 00 00 00 03 |              | j.......\n  +0x0104 | 04 00 04 00 04 00 00 00 |              | ........\n  +0x010C | FA FE FF FF 00 00 E4 43 |              | .......C\n  +0x0114 | 10 00 00 00 00 00 00 00 |              | ........\n  +0x011C | 00 C0 5E 40 00 00 00 00 |              | ..^@....\n  +0x0124 | 92 FE FF FF 00 00 00 01 |              | ........\n  +0x012C | 03 00 00 00 01 02 01 00 |              | ........\n  +0x0134 | 03 00 00 00 33 33 33 33 |              | ....3333\n  +0x013C | 33 A3 45 40 7E 57 04 FF |              | 3.E@~W..\n  +0x0144 | 5B 87 53 C0 8D F0 F6 20 |              | [.S.... \n  +0x014C | 04 B6 42 40 9F 77 63 41 |              | ..B@.wcA\n  +0x0154 | 61 85 5E C0 8F 35 23 83 |              | a.^..5#.\n  +0x015C | DC 35 4B C0 F6 97 DD 93 |              | .5K.....\n  +0x0164 | 87 C5 0A 40 00 00 00 00 |              | ...@....\n  +0x016C | 03 00 00 00 20 00 00 00 |              | .... ...\n  +0x0174 | 14 00 00 00 04 00 00 00 |              | ........\n  +0x017C | 07 00 00 00 63 68 61 72 |              | ....char\n  +0x0184 | 6C 69 65 00 03 00 00 00 |              | lie.....\n  +0x018C | 62 6F 62 00 05 00 00 00 |              | bob.....\n  +0x0194 | 61 6C 69 63 65 00 00 00 |              | alice...\n  +0x019C | 07 00 00 00 63 68 61 72 |              | ....char\n  +0x01A4 | 6C 69 65 00 07 00 00 00 |              | lie.....\n  +0x01AC | 63 68 61 72 6C 69 65 00 |              | charlie.\n  +0x01B4 | 09 00 00 00 09 00 08 00 |              | ........\n  +0x01BC | 07 00 01 00 02 00 03 00 |              | ........\n  +0x01C4 | 06 00 05 00 04 00 00 00 |              | ........\n  +0x01CC | 3A FF FF FF 00 00 00 03 |              | :.......\n  +0x01D4 | 02 00 00 00 44 00 00 00 |              | ....D...\n  +0x01DC | 10 00 00 00 00 00 0A 00 |              | ........\n  +0x01E4 | 1A 00 0C 00 04 00 08 00 |              | ........\n  +0x01EC | 0A 00 00 00 00 80 23 44 |              | ......#D\n  +0x01F4 | 18 00 00 00 00 00 00 00 |              | ........\n  +0x01FC | 00 D8 8E 40 00 00 00 00 |              | ...@....\n  +0x0204 | 00 00 06 00 06 00 05 00 |              | ........\n  +0x020C | 06 00 00 00 00 03 0A 00 |              | ........\n  +0x0214 | 18 00 0C 00 04 00 08 00 |              | ........\n  +0x021C | 0A 00 00 00 00 00 E4 43 |              | .......C\n  +0x0224 | 10 00 00 00 00 00 00 00 |              | ........\n  +0x022C | 00 C0 5E 40 00 00 00 00 |              | ..^@....\n  +0x0234 | A2 FF FF FF 00 00 00 01 |              | ........\n  +0x023C | 2F 00 00 00 54 68 69 73 |              | /...This\n  +0x0244 | 20 69 73 20 61 20 6C 6F |              |  is a lo\n  +0x024C | 6E 67 20 73 74 72 69 6E |              | ng strin\n  +0x0254 | 67 20 74 6F 20 73 68 6F |              | g to sho\n  +0x025C | 77 20 68 6F 77 20 69 74 |              | w how it\n  +0x0264 | 20 62 72 65 61 6B 73 20 |              |  breaks \n  +0x026C | 75 70 2E 00 00 00 0A 00 |              | up......\n  +0x0274 | 16 00 0C 00 04 00 08 00 |              | ........\n  +0x027C | 0A 00 00 00 65 20 71 49 |              | ....e qI\n  +0x0284 | 14 00 00 00 C9 76 BE 9F |              | .....v..\n  +0x028C | 0C 24 FE 40 00 00 06 00 |              | .$.@....\n  +0x0294 | 08 00 07 00 06 00 00 00 |              | ........\n  +0x029C | 00 00 00 01             |              | ....\n\nstring (AnnotatedBinary.Foo.charlie):\n  +0x00AC | 05 00 00 00             | uint32_t     | 0x00000005 (5)                | length of string\n  +0x00B0 | 61 6C 69 63 65          | char[5]      | alice                         | string literal\n  +0x00B5 | 00                      | char         | 0x00 (0)                      | string terminator\n\npadding:\n  +0x00B6 | 00 00                   | uint8_t[2]   | ..                            | padding\n\nvtable (AnnotatedBinary.Bar):\n  +0x00B8 | 08 00                   | uint16_t     | 0x0008 (8)                    | size of this vtable\n  +0x00BA | 13 00                   | uint16_t     | 0x0013 (19)                   | size of referring table\n  +0x00BC | 08 00                   | VOffset16    | 0x0008 (8)                    | offset to field `a` (id: 0)\n  +0x00BE | 04 00                   | VOffset16    | 0x0004 (4)                    | offset to field `b` (id: 1)\n\ntable (AnnotatedBinary.Bar):\n  +0x00C0 | 08 00 00 00             | SOffset32    | 0x00000008 (8) Loc: 0x00B8    | offset to vtable\n  +0x00C4 | 00 80 23 44             | float        | 0x44238000 (654)              | table field `b` (Float)\n  +0x00C8 | 00 00 00 00 00 10 74 40 | double       | 0x4074100000000000 (321)      | table field `a` (Double)\n  +0x00D0 | 00 00 00                | uint8_t[3]   | ...                           | padding\n\nunion (AnnotatedBinary.Tolerance.measurement):\n  +0x00D3 | 05                      | uint8_t      | 0x05 (5)                      | struct field `measurement.width` of 'AnnotatedBinary.Tolerance' (UByte)\n\nvector (AnnotatedBinary.Foo.foobars):\n  +0x00D4 | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x00D8 | 34 00 00 00             | UOffset32    | 0x00000034 (52) Loc: 0x010C   | offset to union[0] (`Bar`)\n  +0x00DC | 2C 00 00 00             | UOffset32    | 0x0000002C (44) Loc: 0x0108   | offset to union[1] (`Baz`)\n  +0x00E0 | 04 00 00 00             | UOffset32    | 0x00000004 (4) Loc: 0x00E4    | offset to union[2] (`Bar`)\n\ntable (AnnotatedBinary.Bar):\n  +0x00E4 | D2 FE FF FF             | SOffset32    | 0xFFFFFED2 (-302) Loc: 0x0212 | offset to vtable\n  +0x00E8 | 00 80 23 44             | float        | 0x44238000 (654)              | table field `b` (Float)\n  +0x00EC | 10 00 00 00             | UOffset32    | 0x00000010 (16) Loc: 0x00FC   | offset to field `c` (table)\n  +0x00F0 | 00 00 00 00 00 D8 8E 40 | double       | 0x408ED80000000000 (987)      | table field `a` (Double)\n  +0x00F8 | 00 00 00 00             | uint8_t[4]   | ....                          | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x00FC | 6A FE FF FF             | SOffset32    | 0xFFFFFE6A (-406) Loc: 0x0292 | offset to vtable\n  +0x0100 | 00 00 00                | uint8_t[3]   | ...                           | padding\n  +0x0103 | 03                      | uint8_t      | 0x03 (3)                      | table field `meal` (Byte)\n\nvtable (AnnotatedBinary.Baz):\n  +0x0104 | 04 00                   | uint16_t     | 0x0004 (4)                    | size of this vtable\n  +0x0106 | 04 00                   | uint16_t     | 0x0004 (4)                    | size of referring table\n\ntable (AnnotatedBinary.Baz):\n  +0x0108 | 04 00 00 00             | SOffset32    | 0x00000004 (4) Loc: 0x0104    | offset to vtable\n\ntable (AnnotatedBinary.Bar):\n  +0x010C | FA FE FF FF             | SOffset32    | 0xFFFFFEFA (-262) Loc: 0x0212 | offset to vtable\n  +0x0110 | 00 00 E4 43             | float        | 0x43E40000 (456)              | table field `b` (Float)\n  +0x0114 | 10 00 00 00             | UOffset32    | 0x00000010 (16) Loc: 0x0124   | offset to field `c` (table)\n  +0x0118 | 00 00 00 00 00 C0 5E 40 | double       | 0x405EC00000000000 (123)      | table field `a` (Double)\n  +0x0120 | 00 00 00 00             | uint8_t[4]   | ....                          | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x0124 | 92 FE FF FF             | SOffset32    | 0xFFFFFE92 (-366) Loc: 0x0292 | offset to vtable\n  +0x0128 | 00 00 00                | uint8_t[3]   | ...                           | padding\n  +0x012B | 01                      | uint8_t      | 0x01 (1)                      | table field `meal` (Byte)\n\nvector (AnnotatedBinary.Foo.foobars_type):\n  +0x012C | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x0130 | 01                      | UType8       | 0x01 (1)                      | value[0]\n  +0x0131 | 02                      | UType8       | 0x02 (2)                      | value[1]\n  +0x0132 | 01                      | UType8       | 0x01 (1)                      | value[2]\n\nvector (AnnotatedBinary.Foo.points_of_interest):\n  +0x0134 | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x0138 | 33 33 33 33 33 A3 45 40 | double       | 0x4045A33333333333 (43.275)   | struct field `[0].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0140 | 7E 57 04 FF 5B 87 53 C0 | double       | 0xC053875BFF04577E (-78.115)  | struct field `[0].longitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0148 | 8D F0 F6 20 04 B6 42 40 | double       | 0x4042B60420F6F08D (37.422)   | struct field `[1].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0150 | 9F 77 63 41 61 85 5E C0 | double       | 0xC05E85614163779F (-122.084) | struct field `[1].longitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0158 | 8F 35 23 83 DC 35 4B C0 | double       | 0xC04B35DC8323358F (-54.4208) | struct field `[2].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0160 | F6 97 DD 93 87 C5 0A 40 | double       | 0x400AC58793DD97F6 (3.34645)  | struct field `[2].longitude` of 'AnnotatedBinary.Location' (Double)\n\npadding:\n  +0x0168 | 00 00 00 00             | uint8_t[4]   | ....                          | padding\n\nvector (AnnotatedBinary.Foo.names):\n  +0x016C | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of vector (# items)\n  +0x0170 | 20 00 00 00             | UOffset32    | 0x00000020 (32) Loc: 0x0190   | offset to string[0]\n  +0x0174 | 14 00 00 00             | UOffset32    | 0x00000014 (20) Loc: 0x0188   | offset to string[1]\n  +0x0178 | 04 00 00 00             | UOffset32    | 0x00000004 (4) Loc: 0x017C    | offset to string[2]\n\nstring (AnnotatedBinary.Foo.names):\n  +0x017C | 07 00 00 00             | uint32_t     | 0x00000007 (7)                | length of string\n  +0x0180 | 63 68 61 72 6C 69 65    | char[7]      | charlie                       | string literal\n  +0x0187 | 00                      | char         | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.names):\n  +0x0188 | 03 00 00 00             | uint32_t     | 0x00000003 (3)                | length of string\n  +0x018C | 62 6F 62                | char[3]      | bob                           | string literal\n  +0x018F | 00                      | char         | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.names):\n  +0x0190 | 05 00 00 00             | uint32_t     | 0x00000005 (5)                | length of string\n  +0x0194 | 61 6C 69 63 65          | char[5]      | alice                         | string literal\n  +0x0199 | 00                      | char         | 0x00 (0)                      | string terminator\n\npadding:\n  +0x019A | 00 00                   | uint8_t[2]   | ..                            | padding\n\nstring (AnnotatedBinary.Foo.alice):\n  +0x019C | 07 00 00 00             | uint32_t     | 0x00000007 (7)                | length of string\n  +0x01A0 | 63 68 61 72 6C 69 65    | char[7]      | charlie                       | string literal\n  +0x01A7 | 00                      | char         | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.bob):\n  +0x01A8 | 07 00 00 00             | uint32_t     | 0x00000007 (7)                | length of string\n  +0x01AC | 63 68 61 72 6C 69 65    | char[7]      | charlie                       | string literal\n  +0x01B3 | 00                      | char         | 0x00 (0)                      | string terminator\n\nvector (AnnotatedBinary.Foo.accounts):\n  +0x01B4 | 09 00 00 00             | uint32_t     | 0x00000009 (9)                | length of vector (# items)\n  +0x01B8 | 09 00                   | uint16_t     | 0x0009 (9)                    | value[0]\n  +0x01BA | 08 00                   | uint16_t     | 0x0008 (8)                    | value[1]\n  +0x01BC | 07 00                   | uint16_t     | 0x0007 (7)                    | value[2]\n  +0x01BE | 01 00                   | uint16_t     | 0x0001 (1)                    | value[3]\n  +0x01C0 | 02 00                   | uint16_t     | 0x0002 (2)                    | value[4]\n  +0x01C2 | 03 00                   | uint16_t     | 0x0003 (3)                    | value[5]\n  +0x01C4 | 06 00                   | uint16_t     | 0x0006 (6)                    | value[6]\n  +0x01C6 | 05 00                   | uint16_t     | 0x0005 (5)                    | value[7]\n  +0x01C8 | 04 00                   | uint16_t     | 0x0004 (4)                    | value[8]\n\npadding:\n  +0x01CA | 00 00                   | uint8_t[2]   | ..                            | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x01CC | 3A FF FF FF             | SOffset32    | 0xFFFFFF3A (-198) Loc: 0x0292 | offset to vtable\n  +0x01D0 | 00 00 00                | uint8_t[3]   | ...                           | padding\n  +0x01D3 | 03                      | uint8_t      | 0x03 (3)                      | table field `meal` (Byte)\n\nvector (AnnotatedBinary.Foo.bars):\n  +0x01D4 | 02 00 00 00             | uint32_t     | 0x00000002 (2)                | length of vector (# items)\n  +0x01D8 | 44 00 00 00             | UOffset32    | 0x00000044 (68) Loc: 0x021C   | offset to table[0]\n  +0x01DC | 10 00 00 00             | UOffset32    | 0x00000010 (16) Loc: 0x01EC   | offset to table[1]\n\npadding:\n  +0x01E0 | 00 00                   | uint8_t[2]   | ..                            | padding\n\nvtable (AnnotatedBinary.Bar):\n  +0x01E2 | 0A 00                   | uint16_t     | 0x000A (10)                   | size of this vtable\n  +0x01E4 | 1A 00                   | uint16_t     | 0x001A (26)                   | size of referring table\n  +0x01E6 | 0C 00                   | VOffset16    | 0x000C (12)                   | offset to field `a` (id: 0)\n  +0x01E8 | 04 00                   | VOffset16    | 0x0004 (4)                    | offset to field `b` (id: 1)\n  +0x01EA | 08 00                   | VOffset16    | 0x0008 (8)                    | offset to field `c` (id: 2)\n\ntable (AnnotatedBinary.Bar):\n  +0x01EC | 0A 00 00 00             | SOffset32    | 0x0000000A (10) Loc: 0x01E2   | offset to vtable\n  +0x01F0 | 00 80 23 44             | float        | 0x44238000 (654)              | table field `b` (Float)\n  +0x01F4 | 18 00 00 00             | UOffset32    | 0x00000018 (24) Loc: 0x020C   | offset to field `c` (table)\n  +0x01F8 | 00 00 00 00 00 D8 8E 40 | double       | 0x408ED80000000000 (987)      | table field `a` (Double)\n  +0x0200 | 00 00 00 00 00 00       | uint8_t[6]   | ......                        | padding\n\nvtable (AnnotatedBinary.Baz):\n  +0x0206 | 06 00                   | uint16_t     | 0x0006 (6)                    | size of this vtable\n  +0x0208 | 06 00                   | uint16_t     | 0x0006 (6)                    | size of referring table\n  +0x020A | 05 00                   | VOffset16    | 0x0005 (5)                    | offset to field `meal` (id: 0)\n\ntable (AnnotatedBinary.Baz):\n  +0x020C | 06 00 00 00             | SOffset32    | 0x00000006 (6) Loc: 0x0206    | offset to vtable\n  +0x0210 | 00                      | uint8_t[1]   | .                             | padding\n  +0x0211 | 03                      | uint8_t      | 0x03 (3)                      | table field `meal` (Byte)\n\nvtable (AnnotatedBinary.Bar):\n  +0x0212 | 0A 00                   | uint16_t     | 0x000A (10)                   | size of this vtable\n  +0x0214 | 18 00                   | uint16_t     | 0x0018 (24)                   | size of referring table\n  +0x0216 | 0C 00                   | VOffset16    | 0x000C (12)                   | offset to field `a` (id: 0)\n  +0x0218 | 04 00                   | VOffset16    | 0x0004 (4)                    | offset to field `b` (id: 1)\n  +0x021A | 08 00                   | VOffset16    | 0x0008 (8)                    | offset to field `c` (id: 2)\n\ntable (AnnotatedBinary.Bar):\n  +0x021C | 0A 00 00 00             | SOffset32    | 0x0000000A (10) Loc: 0x0212   | offset to vtable\n  +0x0220 | 00 00 E4 43             | float        | 0x43E40000 (456)              | table field `b` (Float)\n  +0x0224 | 10 00 00 00             | UOffset32    | 0x00000010 (16) Loc: 0x0234   | offset to field `c` (table)\n  +0x0228 | 00 00 00 00 00 C0 5E 40 | double       | 0x405EC00000000000 (123)      | table field `a` (Double)\n  +0x0230 | 00 00 00 00             | uint8_t[4]   | ....                          | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x0234 | A2 FF FF FF             | SOffset32    | 0xFFFFFFA2 (-94) Loc: 0x0292  | offset to vtable\n  +0x0238 | 00 00 00                | uint8_t[3]   | ...                           | padding\n  +0x023B | 01                      | uint8_t      | 0x01 (1)                      | table field `meal` (Byte)\n\nstring (AnnotatedBinary.Foo.name):\n  +0x023C | 2F 00 00 00             | uint32_t     | 0x0000002F (47)               | length of string\n  +0x0240 | 54 68 69 73 20 69 73 20 | char[47]     | This is                       | string literal\n  +0x0248 | 61 20 6C 6F 6E 67 20 73 |              | a long s\n  +0x0250 | 74 72 69 6E 67 20 74 6F |              | tring to\n  +0x0258 | 20 73 68 6F 77 20 68 6F |              |  show ho\n  +0x0260 | 77 20 69 74 20 62 72 65 |              | w it bre\n  +0x0268 | 61 6B 73 20 75 70 2E    |              | aks up.\n  +0x026F | 00                      | char         | 0x00 (0)                      | string terminator\n\npadding:\n  +0x0270 | 00 00                   | uint8_t[2]   | ..                            | padding\n\nvtable (AnnotatedBinary.Bar):\n  +0x0272 | 0A 00                   | uint16_t     | 0x000A (10)                   | size of this vtable\n  +0x0274 | 16 00                   | uint16_t     | 0x0016 (22)                   | size of referring table\n  +0x0276 | 0C 00                   | VOffset16    | 0x000C (12)                   | offset to field `a` (id: 0)\n  +0x0278 | 04 00                   | VOffset16    | 0x0004 (4)                    | offset to field `b` (id: 1)\n  +0x027A | 08 00                   | VOffset16    | 0x0008 (8)                    | offset to field `c` (id: 2)\n\ntable (AnnotatedBinary.Bar):\n  +0x027C | 0A 00 00 00             | SOffset32    | 0x0000000A (10) Loc: 0x0272   | offset to vtable\n  +0x0280 | 65 20 71 49             | float        | 0x49712065 (987654)           | table field `b` (Float)\n  +0x0284 | 14 00 00 00             | UOffset32    | 0x00000014 (20) Loc: 0x0298   | offset to field `c` (table)\n  +0x0288 | C9 76 BE 9F 0C 24 FE 40 | double       | 0x40FE240C9FBE76C9 (123457)   | table field `a` (Double)\n  +0x0290 | 00 00                   | uint8_t[2]   | ..                            | padding\n\nvtable (AnnotatedBinary.Baz):\n  +0x0292 | 06 00                   | uint16_t     | 0x0006 (6)                    | size of this vtable\n  +0x0294 | 08 00                   | uint16_t     | 0x0008 (8)                    | size of referring table\n  +0x0296 | 07 00                   | VOffset16    | 0x0007 (7)                    | offset to field `meal` (id: 0)\n\ntable (AnnotatedBinary.Baz):\n  +0x0298 | 06 00 00 00             | SOffset32    | 0x00000006 (6) Loc: 0x0292    | offset to vtable\n  +0x029C | 00 00 00                | uint8_t[3]   | ...                           | padding\n  +0x029F | 01                      | uint8_t      | 0x01 (1)                      | table field `meal` (Byte)\n"
  },
  {
    "path": "tests/annotated_binary/tests/invalid_vtable_ref_table_size_short.afb",
    "content": "// Annotated Flatbuffer Binary\n//\n// Schema file: annotated_binary.fbs\n// Binary file: tests/invalid_vtable_ref_table_size_short.bin\n\nheader:\n  +0x0000 | 44 00 00 00             | UOffset32  | 0x00000044 (68) Loc: 0x0044   | offset to root table `AnnotatedBinary.Foo`\n  +0x0004 | 41 4E 4E 4F             | char[4]    | ANNO                          | File Identifier\n\npadding:\n  +0x0008 | 00 00                   | uint8_t[2] | ..                            | padding\n\nvtable (AnnotatedBinary.Foo):\n  +0x000A | 3A 00                   | uint16_t   | 0x003A (58)                   | size of this vtable\n  +0x000C | 01 00                   | uint16_t   | 0x0001 (1)                    | ERROR: size of referring table. Shorter than the minimum length: \n  +0x000E | 0C 00                   | VOffset16  | 0x000C (12)                   | offset to field `counter` (id: 0)\n  +0x0010 | 07 00                   | VOffset16  | 0x0007 (7)                    | offset to field `healthy` (id: 1)\n  +0x0012 | 00 00                   | VOffset16  | 0x0000 (0)                    | offset to field `level` (id: 2) <defaults to 99> (Long)\n  +0x0014 | 08 00                   | VOffset16  | 0x0008 (8)                    | offset to field `meal` (id: 3)\n  +0x0016 | 10 00                   | VOffset16  | 0x0010 (16)                   | offset to field `bar` (id: 4)\n  +0x0018 | 14 00                   | VOffset16  | 0x0014 (20)                   | offset to field `home` (id: 5)\n  +0x001A | 30 00                   | VOffset16  | 0x0030 (48)                   | offset to field `name` (id: 6)\n  +0x001C | 34 00                   | VOffset16  | 0x0034 (52)                   | offset to field `bars` (id: 7)\n  +0x001E | 09 00                   | VOffset16  | 0x0009 (9)                    | offset to field `bar_baz_type` (id: 8)\n  +0x0020 | 38 00                   | VOffset16  | 0x0038 (56)                   | offset to field `bar_baz` (id: 9)\n  +0x0022 | 3C 00                   | VOffset16  | 0x003C (60)                   | offset to field `accounts` (id: 10)\n  +0x0024 | 40 00                   | VOffset16  | 0x0040 (64)                   | offset to field `bob` (id: 11)\n  +0x0026 | 44 00                   | VOffset16  | 0x0044 (68)                   | offset to field `alice` (id: 12)\n  +0x0028 | 00 00                   | VOffset16  | 0x0000 (0)                    | offset to field `maybe_i32` (id: 13) <defaults to 0> (Int)\n  +0x002A | 00 00                   | VOffset16  | 0x0000 (0)                    | offset to field `default_i32` (id: 14) <defaults to 42> (Int)\n  +0x002C | 48 00                   | VOffset16  | 0x0048 (72)                   | offset to field `just_i32` (id: 15)\n  +0x002E | 4C 00                   | VOffset16  | 0x004C (76)                   | offset to field `names` (id: 16)\n  +0x0030 | 50 00                   | VOffset16  | 0x0050 (80)                   | offset to field `points_of_interest` (id: 17)\n  +0x0032 | 54 00                   | VOffset16  | 0x0054 (84)                   | offset to field `foobars_type` (id: 18)\n  +0x0034 | 58 00                   | VOffset16  | 0x0058 (88)                   | offset to field `foobars` (id: 19)\n  +0x0036 | 0A 00                   | VOffset16  | 0x000A (10)                   | offset to field `measurement_type` (id: 20)\n  +0x0038 | 5C 00                   | VOffset16  | 0x005C (92)                   | offset to field `measurement` (id: 21)\n  +0x003A | 0B 00                   | VOffset16  | 0x000B (11)                   | offset to field `anything_type` (id: 22)\n  +0x003C | 60 00                   | VOffset16  | 0x0060 (96)                   | offset to field `anything` (id: 23)\n  +0x003E | 00 00                   | VOffset16  | 0x0000 (0)                    | offset to field `temperature` (id: 24) <defaults to 98.600000> (Float)\n  +0x0040 | 00 00                   | VOffset16  | 0x0000 (0)                    | offset to field `teetotaler` (id: 25) <null> (Obj)\n  +0x0042 | 64 00                   | VOffset16  | 0x0064 (100)                  | offset to field `charlie` (id: 26)\n\nroot_table (AnnotatedBinary.Foo):\n  +0x0044 | 3A 00 00 00             | SOffset32  | 0x0000003A (58) Loc: 0x000A   | offset to vtable\n  +0x0048 | 00 00 00                | uint8_t[3] | ...                           | padding\n  +0x004B | 01                      | uint8_t    | 0x01 (1)                      | table field `healthy` (Bool)\n  +0x004C | 02                      | uint8_t    | 0x02 (2)                      | table field `meal` (Byte)\n  +0x004D | 02                      | UType8     | 0x02 (2)                      | table field `bar_baz_type` (UType)\n  +0x004E | 01                      | UType8     | 0x01 (1)                      | table field `measurement_type` (UType)\n  +0x004F | 01                      | UType8     | 0x01 (1)                      | table field `anything_type` (UType)\n  +0x0050 | D2 04 00 00             | uint32_t   | 0x000004D2 (1234)             | table field `counter` (Int)\n  +0x0054 | 28 02 00 00             | UOffset32  | 0x00000228 (552) Loc: 0x027C  | offset to field `bar` (table)\n  +0x0058 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                | struct field `home.floors` of 'AnnotatedBinary.Building' (Int)\n  +0x005C | 02 00 00 00             | uint32_t   | 0x00000002 (2)                | struct field `home.doors` of 'AnnotatedBinary.Building' (Int)\n  +0x0060 | 0C 00 00 00             | uint32_t   | 0x0000000C (12)               | struct field `home.windows` of 'AnnotatedBinary.Building' (Int)\n  +0x0064 | 0A 00 00 00             | uint32_t   | 0x0000000A (10)               | array field `home.dimensions.values`[0] of 'AnnotatedBinary.Dimension' (Int)\n  +0x0068 | 0C 00 00 00             | uint32_t   | 0x0000000C (12)               | array field `home.dimensions.values`[1] of 'AnnotatedBinary.Dimension' (Int)\n  +0x006C | 14 00 00 00             | uint32_t   | 0x00000014 (20)               | array field `home.dimensions.values`[2] of 'AnnotatedBinary.Dimension' (Int)\n  +0x0070 | 01                      | uint8_t    | 0x01 (1)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0071 | 02                      | uint8_t    | 0x02 (2)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0072 | 03                      | uint8_t    | 0x03 (3)                      | struct field `home.dimensions.tolerances.width` of 'AnnotatedBinary.Tolerance' (UByte)\n  +0x0073 | 00                      | uint8_t[1] | .                             | padding\n  +0x0074 | C8 01 00 00             | UOffset32  | 0x000001C8 (456) Loc: 0x023C  | offset to field `name` (string)\n  +0x0078 | 5C 01 00 00             | UOffset32  | 0x0000015C (348) Loc: 0x01D4  | offset to field `bars` (vector)\n  +0x007C | 50 01 00 00             | UOffset32  | 0x00000150 (336) Loc: 0x01CC  | offset to field `bar_baz` (union of type `Baz`)\n  +0x0080 | 34 01 00 00             | UOffset32  | 0x00000134 (308) Loc: 0x01B4  | offset to field `accounts` (vector)\n  +0x0084 | 24 01 00 00             | UOffset32  | 0x00000124 (292) Loc: 0x01A8  | offset to field `bob` (string)\n  +0x0088 | 14 01 00 00             | UOffset32  | 0x00000114 (276) Loc: 0x019C  | offset to field `alice` (string)\n  +0x008C | 0D 00 00 00             | uint32_t   | 0x0000000D (13)               | table field `just_i32` (Int)\n  +0x0090 | DC 00 00 00             | UOffset32  | 0x000000DC (220) Loc: 0x016C  | offset to field `names` (vector)\n  +0x0094 | A0 00 00 00             | UOffset32  | 0x000000A0 (160) Loc: 0x0134  | offset to field `points_of_interest` (vector)\n  +0x0098 | 94 00 00 00             | UOffset32  | 0x00000094 (148) Loc: 0x012C  | offset to field `foobars_type` (vector)\n  +0x009C | 38 00 00 00             | UOffset32  | 0x00000038 (56) Loc: 0x00D4   | offset to field `foobars` (vector)\n  +0x00A0 | 33 00 00 00             | UOffset32  | 0x00000033 (51) Loc: 0x00D3   | offset to field `measurement` (union of type `Tolerance`)\n  +0x00A4 | 1C 00 00 00             | UOffset32  | 0x0000001C (28) Loc: 0x00C0   | offset to field `anything` (union of type `Bar`)\n  +0x00A8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x00AC    | offset to field `charlie` (string)\n\nstring (AnnotatedBinary.Foo.charlie):\n  +0x00AC | 05 00 00 00             | uint32_t   | 0x00000005 (5)                | length of string\n  +0x00B0 | 61 6C 69 63 65          | char[5]    | alice                         | string literal\n  +0x00B5 | 00                      | char       | 0x00 (0)                      | string terminator\n\npadding:\n  +0x00B6 | 00 00                   | uint8_t[2] | ..                            | padding\n\nvtable (AnnotatedBinary.Bar):\n  +0x00B8 | 08 00                   | uint16_t   | 0x0008 (8)                    | size of this vtable\n  +0x00BA | 13 00                   | uint16_t   | 0x0013 (19)                   | size of referring table\n  +0x00BC | 08 00                   | VOffset16  | 0x0008 (8)                    | offset to field `a` (id: 0)\n  +0x00BE | 04 00                   | VOffset16  | 0x0004 (4)                    | offset to field `b` (id: 1)\n\ntable (AnnotatedBinary.Bar):\n  +0x00C0 | 08 00 00 00             | SOffset32  | 0x00000008 (8) Loc: 0x00B8    | offset to vtable\n  +0x00C4 | 00 80 23 44             | float      | 0x44238000 (654)              | table field `b` (Float)\n  +0x00C8 | 00 00 00 00 00 10 74 40 | double     | 0x4074100000000000 (321)      | table field `a` (Double)\n  +0x00D0 | 00 00 00                | uint8_t[3] | ...                           | padding\n\nunion (AnnotatedBinary.Tolerance.measurement):\n  +0x00D3 | 05                      | uint8_t    | 0x05 (5)                      | struct field `measurement.width` of 'AnnotatedBinary.Tolerance' (UByte)\n\nvector (AnnotatedBinary.Foo.foobars):\n  +0x00D4 | 03 00 00 00             | uint32_t   | 0x00000003 (3)                | length of vector (# items)\n  +0x00D8 | 34 00 00 00             | UOffset32  | 0x00000034 (52) Loc: 0x010C   | offset to union[0] (`Bar`)\n  +0x00DC | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x0108   | offset to union[1] (`Baz`)\n  +0x00E0 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x00E4    | offset to union[2] (`Bar`)\n\ntable (AnnotatedBinary.Bar):\n  +0x00E4 | D2 FE FF FF             | SOffset32  | 0xFFFFFED2 (-302) Loc: 0x0212 | offset to vtable\n  +0x00E8 | 00 80 23 44             | float      | 0x44238000 (654)              | table field `b` (Float)\n  +0x00EC | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x00FC   | offset to field `c` (table)\n  +0x00F0 | 00 00 00 00 00 D8 8E 40 | double     | 0x408ED80000000000 (987)      | table field `a` (Double)\n  +0x00F8 | 00 00 00 00             | uint8_t[4] | ....                          | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x00FC | 6A FE FF FF             | SOffset32  | 0xFFFFFE6A (-406) Loc: 0x0292 | offset to vtable\n  +0x0100 | 00 00 00                | uint8_t[3] | ...                           | padding\n  +0x0103 | 03                      | uint8_t    | 0x03 (3)                      | table field `meal` (Byte)\n\nvtable (AnnotatedBinary.Baz):\n  +0x0104 | 04 00                   | uint16_t   | 0x0004 (4)                    | size of this vtable\n  +0x0106 | 04 00                   | uint16_t   | 0x0004 (4)                    | size of referring table\n\ntable (AnnotatedBinary.Baz):\n  +0x0108 | 04 00 00 00             | SOffset32  | 0x00000004 (4) Loc: 0x0104    | offset to vtable\n\ntable (AnnotatedBinary.Bar):\n  +0x010C | FA FE FF FF             | SOffset32  | 0xFFFFFEFA (-262) Loc: 0x0212 | offset to vtable\n  +0x0110 | 00 00 E4 43             | float      | 0x43E40000 (456)              | table field `b` (Float)\n  +0x0114 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x0124   | offset to field `c` (table)\n  +0x0118 | 00 00 00 00 00 C0 5E 40 | double     | 0x405EC00000000000 (123)      | table field `a` (Double)\n  +0x0120 | 00 00 00 00             | uint8_t[4] | ....                          | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x0124 | 92 FE FF FF             | SOffset32  | 0xFFFFFE92 (-366) Loc: 0x0292 | offset to vtable\n  +0x0128 | 00 00 00                | uint8_t[3] | ...                           | padding\n  +0x012B | 01                      | uint8_t    | 0x01 (1)                      | table field `meal` (Byte)\n\nvector (AnnotatedBinary.Foo.foobars_type):\n  +0x012C | 03 00 00 00             | uint32_t   | 0x00000003 (3)                | length of vector (# items)\n  +0x0130 | 01                      | UType8     | 0x01 (1)                      | value[0]\n  +0x0131 | 02                      | UType8     | 0x02 (2)                      | value[1]\n  +0x0132 | 01                      | UType8     | 0x01 (1)                      | value[2]\n\nvector (AnnotatedBinary.Foo.points_of_interest):\n  +0x0134 | 03 00 00 00             | uint32_t   | 0x00000003 (3)                | length of vector (# items)\n  +0x0138 | 33 33 33 33 33 A3 45 40 | double     | 0x4045A33333333333 (43.275)   | struct field `[0].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0140 | 7E 57 04 FF 5B 87 53 C0 | double     | 0xC053875BFF04577E (-78.115)  | struct field `[0].longitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0148 | 8D F0 F6 20 04 B6 42 40 | double     | 0x4042B60420F6F08D (37.422)   | struct field `[1].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0150 | 9F 77 63 41 61 85 5E C0 | double     | 0xC05E85614163779F (-122.084) | struct field `[1].longitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0158 | 8F 35 23 83 DC 35 4B C0 | double     | 0xC04B35DC8323358F (-54.4208) | struct field `[2].latitude` of 'AnnotatedBinary.Location' (Double)\n  +0x0160 | F6 97 DD 93 87 C5 0A 40 | double     | 0x400AC58793DD97F6 (3.34645)  | struct field `[2].longitude` of 'AnnotatedBinary.Location' (Double)\n\npadding:\n  +0x0168 | 00 00 00 00             | uint8_t[4] | ....                          | padding\n\nvector (AnnotatedBinary.Foo.names):\n  +0x016C | 03 00 00 00             | uint32_t   | 0x00000003 (3)                | length of vector (# items)\n  +0x0170 | 20 00 00 00             | UOffset32  | 0x00000020 (32) Loc: 0x0190   | offset to string[0]\n  +0x0174 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x0188   | offset to string[1]\n  +0x0178 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x017C    | offset to string[2]\n\nstring (AnnotatedBinary.Foo.names):\n  +0x017C | 07 00 00 00             | uint32_t   | 0x00000007 (7)                | length of string\n  +0x0180 | 63 68 61 72 6C 69 65    | char[7]    | charlie                       | string literal\n  +0x0187 | 00                      | char       | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.names):\n  +0x0188 | 03 00 00 00             | uint32_t   | 0x00000003 (3)                | length of string\n  +0x018C | 62 6F 62                | char[3]    | bob                           | string literal\n  +0x018F | 00                      | char       | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.names):\n  +0x0190 | 05 00 00 00             | uint32_t   | 0x00000005 (5)                | length of string\n  +0x0194 | 61 6C 69 63 65          | char[5]    | alice                         | string literal\n  +0x0199 | 00                      | char       | 0x00 (0)                      | string terminator\n\npadding:\n  +0x019A | 00 00                   | uint8_t[2] | ..                            | padding\n\nstring (AnnotatedBinary.Foo.alice):\n  +0x019C | 07 00 00 00             | uint32_t   | 0x00000007 (7)                | length of string\n  +0x01A0 | 63 68 61 72 6C 69 65    | char[7]    | charlie                       | string literal\n  +0x01A7 | 00                      | char       | 0x00 (0)                      | string terminator\n\nstring (AnnotatedBinary.Foo.bob):\n  +0x01A8 | 07 00 00 00             | uint32_t   | 0x00000007 (7)                | length of string\n  +0x01AC | 63 68 61 72 6C 69 65    | char[7]    | charlie                       | string literal\n  +0x01B3 | 00                      | char       | 0x00 (0)                      | string terminator\n\nvector (AnnotatedBinary.Foo.accounts):\n  +0x01B4 | 09 00 00 00             | uint32_t   | 0x00000009 (9)                | length of vector (# items)\n  +0x01B8 | 09 00                   | uint16_t   | 0x0009 (9)                    | value[0]\n  +0x01BA | 08 00                   | uint16_t   | 0x0008 (8)                    | value[1]\n  +0x01BC | 07 00                   | uint16_t   | 0x0007 (7)                    | value[2]\n  +0x01BE | 01 00                   | uint16_t   | 0x0001 (1)                    | value[3]\n  +0x01C0 | 02 00                   | uint16_t   | 0x0002 (2)                    | value[4]\n  +0x01C2 | 03 00                   | uint16_t   | 0x0003 (3)                    | value[5]\n  +0x01C4 | 06 00                   | uint16_t   | 0x0006 (6)                    | value[6]\n  +0x01C6 | 05 00                   | uint16_t   | 0x0005 (5)                    | value[7]\n  +0x01C8 | 04 00                   | uint16_t   | 0x0004 (4)                    | value[8]\n\npadding:\n  +0x01CA | 00 00                   | uint8_t[2] | ..                            | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x01CC | 3A FF FF FF             | SOffset32  | 0xFFFFFF3A (-198) Loc: 0x0292 | offset to vtable\n  +0x01D0 | 00 00 00                | uint8_t[3] | ...                           | padding\n  +0x01D3 | 03                      | uint8_t    | 0x03 (3)                      | table field `meal` (Byte)\n\nvector (AnnotatedBinary.Foo.bars):\n  +0x01D4 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                | length of vector (# items)\n  +0x01D8 | 44 00 00 00             | UOffset32  | 0x00000044 (68) Loc: 0x021C   | offset to table[0]\n  +0x01DC | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x01EC   | offset to table[1]\n\npadding:\n  +0x01E0 | 00 00                   | uint8_t[2] | ..                            | padding\n\nvtable (AnnotatedBinary.Bar):\n  +0x01E2 | 0A 00                   | uint16_t   | 0x000A (10)                   | size of this vtable\n  +0x01E4 | 1A 00                   | uint16_t   | 0x001A (26)                   | size of referring table\n  +0x01E6 | 0C 00                   | VOffset16  | 0x000C (12)                   | offset to field `a` (id: 0)\n  +0x01E8 | 04 00                   | VOffset16  | 0x0004 (4)                    | offset to field `b` (id: 1)\n  +0x01EA | 08 00                   | VOffset16  | 0x0008 (8)                    | offset to field `c` (id: 2)\n\ntable (AnnotatedBinary.Bar):\n  +0x01EC | 0A 00 00 00             | SOffset32  | 0x0000000A (10) Loc: 0x01E2   | offset to vtable\n  +0x01F0 | 00 80 23 44             | float      | 0x44238000 (654)              | table field `b` (Float)\n  +0x01F4 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x020C   | offset to field `c` (table)\n  +0x01F8 | 00 00 00 00 00 D8 8E 40 | double     | 0x408ED80000000000 (987)      | table field `a` (Double)\n  +0x0200 | 00 00 00 00 00 00       | uint8_t[6] | ......                        | padding\n\nvtable (AnnotatedBinary.Baz):\n  +0x0206 | 06 00                   | uint16_t   | 0x0006 (6)                    | size of this vtable\n  +0x0208 | 06 00                   | uint16_t   | 0x0006 (6)                    | size of referring table\n  +0x020A | 05 00                   | VOffset16  | 0x0005 (5)                    | offset to field `meal` (id: 0)\n\ntable (AnnotatedBinary.Baz):\n  +0x020C | 06 00 00 00             | SOffset32  | 0x00000006 (6) Loc: 0x0206    | offset to vtable\n  +0x0210 | 00                      | uint8_t[1] | .                             | padding\n  +0x0211 | 03                      | uint8_t    | 0x03 (3)                      | table field `meal` (Byte)\n\nvtable (AnnotatedBinary.Bar):\n  +0x0212 | 0A 00                   | uint16_t   | 0x000A (10)                   | size of this vtable\n  +0x0214 | 18 00                   | uint16_t   | 0x0018 (24)                   | size of referring table\n  +0x0216 | 0C 00                   | VOffset16  | 0x000C (12)                   | offset to field `a` (id: 0)\n  +0x0218 | 04 00                   | VOffset16  | 0x0004 (4)                    | offset to field `b` (id: 1)\n  +0x021A | 08 00                   | VOffset16  | 0x0008 (8)                    | offset to field `c` (id: 2)\n\ntable (AnnotatedBinary.Bar):\n  +0x021C | 0A 00 00 00             | SOffset32  | 0x0000000A (10) Loc: 0x0212   | offset to vtable\n  +0x0220 | 00 00 E4 43             | float      | 0x43E40000 (456)              | table field `b` (Float)\n  +0x0224 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x0234   | offset to field `c` (table)\n  +0x0228 | 00 00 00 00 00 C0 5E 40 | double     | 0x405EC00000000000 (123)      | table field `a` (Double)\n  +0x0230 | 00 00 00 00             | uint8_t[4] | ....                          | padding\n\ntable (AnnotatedBinary.Baz):\n  +0x0234 | A2 FF FF FF             | SOffset32  | 0xFFFFFFA2 (-94) Loc: 0x0292  | offset to vtable\n  +0x0238 | 00 00 00                | uint8_t[3] | ...                           | padding\n  +0x023B | 01                      | uint8_t    | 0x01 (1)                      | table field `meal` (Byte)\n\nstring (AnnotatedBinary.Foo.name):\n  +0x023C | 2F 00 00 00             | uint32_t   | 0x0000002F (47)               | length of string\n  +0x0240 | 54 68 69 73 20 69 73 20 | char[47]   | This is                       | string literal\n  +0x0248 | 61 20 6C 6F 6E 67 20 73 |            | a long s\n  +0x0250 | 74 72 69 6E 67 20 74 6F |            | tring to\n  +0x0258 | 20 73 68 6F 77 20 68 6F |            |  show ho\n  +0x0260 | 77 20 69 74 20 62 72 65 |            | w it bre\n  +0x0268 | 61 6B 73 20 75 70 2E    |            | aks up.\n  +0x026F | 00                      | char       | 0x00 (0)                      | string terminator\n\npadding:\n  +0x0270 | 00 00                   | uint8_t[2] | ..                            | padding\n\nvtable (AnnotatedBinary.Bar):\n  +0x0272 | 0A 00                   | uint16_t   | 0x000A (10)                   | size of this vtable\n  +0x0274 | 16 00                   | uint16_t   | 0x0016 (22)                   | size of referring table\n  +0x0276 | 0C 00                   | VOffset16  | 0x000C (12)                   | offset to field `a` (id: 0)\n  +0x0278 | 04 00                   | VOffset16  | 0x0004 (4)                    | offset to field `b` (id: 1)\n  +0x027A | 08 00                   | VOffset16  | 0x0008 (8)                    | offset to field `c` (id: 2)\n\ntable (AnnotatedBinary.Bar):\n  +0x027C | 0A 00 00 00             | SOffset32  | 0x0000000A (10) Loc: 0x0272   | offset to vtable\n  +0x0280 | 65 20 71 49             | float      | 0x49712065 (987654)           | table field `b` (Float)\n  +0x0284 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x0298   | offset to field `c` (table)\n  +0x0288 | C9 76 BE 9F 0C 24 FE 40 | double     | 0x40FE240C9FBE76C9 (123457)   | table field `a` (Double)\n  +0x0290 | 00 00                   | uint8_t[2] | ..                            | padding\n\nvtable (AnnotatedBinary.Baz):\n  +0x0292 | 06 00                   | uint16_t   | 0x0006 (6)                    | size of this vtable\n  +0x0294 | 08 00                   | uint16_t   | 0x0008 (8)                    | size of referring table\n  +0x0296 | 07 00                   | VOffset16  | 0x0007 (7)                    | offset to field `meal` (id: 0)\n\ntable (AnnotatedBinary.Baz):\n  +0x0298 | 06 00 00 00             | SOffset32  | 0x00000006 (6) Loc: 0x0292    | offset to vtable\n  +0x029C | 00 00 00                | uint8_t[3] | ...                           | padding\n  +0x029F | 01                      | uint8_t    | 0x01 (1)                      | table field `meal` (Byte)\n"
  },
  {
    "path": "tests/annotated_binary/tests/invalid_vtable_size.afb",
    "content": "// Annotated Flatbuffer Binary\n//\n// Schema file: annotated_binary.fbs\n// Binary file: tests/invalid_vtable_size.bin\n\nheader:\n  +0x0000 | 44 00 00 00             | UOffset32     | 0x00000044 (68) Loc: 0x0044 | offset to root table `AnnotatedBinary.Foo`\n  +0x0004 | 41 4E 4E 4F             | char[4]       | ANNO                        | File Identifier\n\npadding:\n  +0x0008 | 00 00                   | uint8_t[2]    | ..                          | padding\n\nvtable (AnnotatedBinary.Foo):\n  +0x000A | FF FF                   | uint16_t      | 0xFFFF (65535)              | ERROR: size of this vtable. Longer than the binary.\n\nunknown (no known references):\n  +0x000C | 68 00 0C 00 07 00 00 00 | ?uint8_t[660] | h.......                    | WARN: nothing refers to this section.\n  +0x0014 | 08 00 10 00 14 00 30 00 |               | ......0.\n  +0x001C | 34 00 09 00 38 00 3C 00 |               | 4...8.<.\n  +0x0024 | 40 00 44 00 00 00 00 00 |               | @.D.....\n  +0x002C | 48 00 4C 00 50 00 54 00 |               | H.L.P.T.\n  +0x0034 | 58 00 0A 00 5C 00 0B 00 |               | X...\\...\n  +0x003C | 60 00 00 00 00 00 64 00 |               | `.....d.\n  +0x0044 | 3A 00 00 00 00 00 00 01 |               | :.......\n  +0x004C | 02 02 01 01 D2 04 00 00 |               | ........\n  +0x0054 | 28 02 00 00 01 00 00 00 |               | (.......\n  +0x005C | 02 00 00 00 0C 00 00 00 |               | ........\n  +0x0064 | 0A 00 00 00 0C 00 00 00 |               | ........\n  +0x006C | 14 00 00 00 01 02 03 00 |               | ........\n  +0x0074 | C8 01 00 00 5C 01 00 00 |               | ....\\...\n  +0x007C | 50 01 00 00 34 01 00 00 |               | P...4...\n  +0x0084 | 24 01 00 00 14 01 00 00 |               | $.......\n  +0x008C | 0D 00 00 00 DC 00 00 00 |               | ........\n  +0x0094 | A0 00 00 00 94 00 00 00 |               | ........\n  +0x009C | 38 00 00 00 33 00 00 00 |               | 8...3...\n  +0x00A4 | 1C 00 00 00 04 00 00 00 |               | ........\n  +0x00AC | 05 00 00 00 61 6C 69 63 |               | ....alic\n  +0x00B4 | 65 00 00 00 08 00 13 00 |               | e.......\n  +0x00BC | 08 00 04 00 08 00 00 00 |               | ........\n  +0x00C4 | 00 80 23 44 00 00 00 00 |               | ..#D....\n  +0x00CC | 00 10 74 40 00 00 00 05 |               | ..t@....\n  +0x00D4 | 03 00 00 00 34 00 00 00 |               | ....4...\n  +0x00DC | 2C 00 00 00 04 00 00 00 |               | ,.......\n  +0x00E4 | D2 FE FF FF 00 80 23 44 |               | ......#D\n  +0x00EC | 10 00 00 00 00 00 00 00 |               | ........\n  +0x00F4 | 00 D8 8E 40 00 00 00 00 |               | ...@....\n  +0x00FC | 6A FE FF FF 00 00 00 03 |               | j.......\n  +0x0104 | 04 00 04 00 04 00 00 00 |               | ........\n  +0x010C | FA FE FF FF 00 00 E4 43 |               | .......C\n  +0x0114 | 10 00 00 00 00 00 00 00 |               | ........\n  +0x011C | 00 C0 5E 40 00 00 00 00 |               | ..^@....\n  +0x0124 | 92 FE FF FF 00 00 00 01 |               | ........\n  +0x012C | 03 00 00 00 01 02 01 00 |               | ........\n  +0x0134 | 03 00 00 00 33 33 33 33 |               | ....3333\n  +0x013C | 33 A3 45 40 7E 57 04 FF |               | 3.E@~W..\n  +0x0144 | 5B 87 53 C0 8D F0 F6 20 |               | [.S.... \n  +0x014C | 04 B6 42 40 9F 77 63 41 |               | ..B@.wcA\n  +0x0154 | 61 85 5E C0 8F 35 23 83 |               | a.^..5#.\n  +0x015C | DC 35 4B C0 F6 97 DD 93 |               | .5K.....\n  +0x0164 | 87 C5 0A 40 00 00 00 00 |               | ...@....\n  +0x016C | 03 00 00 00 20 00 00 00 |               | .... ...\n  +0x0174 | 14 00 00 00 04 00 00 00 |               | ........\n  +0x017C | 07 00 00 00 63 68 61 72 |               | ....char\n  +0x0184 | 6C 69 65 00 03 00 00 00 |               | lie.....\n  +0x018C | 62 6F 62 00 05 00 00 00 |               | bob.....\n  +0x0194 | 61 6C 69 63 65 00 00 00 |               | alice...\n  +0x019C | 07 00 00 00 63 68 61 72 |               | ....char\n  +0x01A4 | 6C 69 65 00 07 00 00 00 |               | lie.....\n  +0x01AC | 63 68 61 72 6C 69 65 00 |               | charlie.\n  +0x01B4 | 09 00 00 00 09 00 08 00 |               | ........\n  +0x01BC | 07 00 01 00 02 00 03 00 |               | ........\n  +0x01C4 | 06 00 05 00 04 00 00 00 |               | ........\n  +0x01CC | 3A FF FF FF 00 00 00 03 |               | :.......\n  +0x01D4 | 02 00 00 00 44 00 00 00 |               | ....D...\n  +0x01DC | 10 00 00 00 00 00 0A 00 |               | ........\n  +0x01E4 | 1A 00 0C 00 04 00 08 00 |               | ........\n  +0x01EC | 0A 00 00 00 00 80 23 44 |               | ......#D\n  +0x01F4 | 18 00 00 00 00 00 00 00 |               | ........\n  +0x01FC | 00 D8 8E 40 00 00 00 00 |               | ...@....\n  +0x0204 | 00 00 06 00 06 00 05 00 |               | ........\n  +0x020C | 06 00 00 00 00 03 0A 00 |               | ........\n  +0x0214 | 18 00 0C 00 04 00 08 00 |               | ........\n  +0x021C | 0A 00 00 00 00 00 E4 43 |               | .......C\n  +0x0224 | 10 00 00 00 00 00 00 00 |               | ........\n  +0x022C | 00 C0 5E 40 00 00 00 00 |               | ..^@....\n  +0x0234 | A2 FF FF FF 00 00 00 01 |               | ........\n  +0x023C | 2F 00 00 00 54 68 69 73 |               | /...This\n  +0x0244 | 20 69 73 20 61 20 6C 6F |               |  is a lo\n  +0x024C | 6E 67 20 73 74 72 69 6E |               | ng strin\n  +0x0254 | 67 20 74 6F 20 73 68 6F |               | g to sho\n  +0x025C | 77 20 68 6F 77 20 69 74 |               | w how it\n  +0x0264 | 20 62 72 65 61 6B 73 20 |               |  breaks \n  +0x026C | 75 70 2E 00 00 00 0A 00 |               | up......\n  +0x0274 | 16 00 0C 00 04 00 08 00 |               | ........\n  +0x027C | 0A 00 00 00 65 20 71 49 |               | ....e qI\n  +0x0284 | 14 00 00 00 C9 76 BE 9F |               | .....v..\n  +0x028C | 0C 24 FE 40 00 00 06 00 |               | .$.@....\n  +0x0294 | 08 00 07 00 06 00 00 00 |               | ........\n  +0x029C | 00 00 00 01             |               | ....\n"
  },
  {
    "path": "tests/annotated_binary/tests/invalid_vtable_size_short.afb",
    "content": "// Annotated Flatbuffer Binary\n//\n// Schema file: annotated_binary.fbs\n// Binary file: tests/invalid_vtable_size_short.bin\n\nheader:\n  +0x0000 | 44 00 00 00             | UOffset32     | 0x00000044 (68) Loc: 0x0044 | offset to root table `AnnotatedBinary.Foo`\n  +0x0004 | 41 4E 4E 4F             | char[4]       | ANNO                        | File Identifier\n\npadding:\n  +0x0008 | 00 00                   | uint8_t[2]    | ..                          | padding\n\nvtable (AnnotatedBinary.Foo):\n  +0x000A | 01 00                   | uint16_t      | 0x0001 (1)                  | ERROR: size of this vtable. Shorter than the minimum length: \n\nunknown (no known references):\n  +0x000C | 68 00 0C 00 07 00 00 00 | ?uint8_t[660] | h.......                    | WARN: nothing refers to this section.\n  +0x0014 | 08 00 10 00 14 00 30 00 |               | ......0.\n  +0x001C | 34 00 09 00 38 00 3C 00 |               | 4...8.<.\n  +0x0024 | 40 00 44 00 00 00 00 00 |               | @.D.....\n  +0x002C | 48 00 4C 00 50 00 54 00 |               | H.L.P.T.\n  +0x0034 | 58 00 0A 00 5C 00 0B 00 |               | X...\\...\n  +0x003C | 60 00 00 00 00 00 64 00 |               | `.....d.\n  +0x0044 | 3A 00 00 00 00 00 00 01 |               | :.......\n  +0x004C | 02 02 01 01 D2 04 00 00 |               | ........\n  +0x0054 | 28 02 00 00 01 00 00 00 |               | (.......\n  +0x005C | 02 00 00 00 0C 00 00 00 |               | ........\n  +0x0064 | 0A 00 00 00 0C 00 00 00 |               | ........\n  +0x006C | 14 00 00 00 01 02 03 00 |               | ........\n  +0x0074 | C8 01 00 00 5C 01 00 00 |               | ....\\...\n  +0x007C | 50 01 00 00 34 01 00 00 |               | P...4...\n  +0x0084 | 24 01 00 00 14 01 00 00 |               | $.......\n  +0x008C | 0D 00 00 00 DC 00 00 00 |               | ........\n  +0x0094 | A0 00 00 00 94 00 00 00 |               | ........\n  +0x009C | 38 00 00 00 33 00 00 00 |               | 8...3...\n  +0x00A4 | 1C 00 00 00 04 00 00 00 |               | ........\n  +0x00AC | 05 00 00 00 61 6C 69 63 |               | ....alic\n  +0x00B4 | 65 00 00 00 08 00 13 00 |               | e.......\n  +0x00BC | 08 00 04 00 08 00 00 00 |               | ........\n  +0x00C4 | 00 80 23 44 00 00 00 00 |               | ..#D....\n  +0x00CC | 00 10 74 40 00 00 00 05 |               | ..t@....\n  +0x00D4 | 03 00 00 00 34 00 00 00 |               | ....4...\n  +0x00DC | 2C 00 00 00 04 00 00 00 |               | ,.......\n  +0x00E4 | D2 FE FF FF 00 80 23 44 |               | ......#D\n  +0x00EC | 10 00 00 00 00 00 00 00 |               | ........\n  +0x00F4 | 00 D8 8E 40 00 00 00 00 |               | ...@....\n  +0x00FC | 6A FE FF FF 00 00 00 03 |               | j.......\n  +0x0104 | 04 00 04 00 04 00 00 00 |               | ........\n  +0x010C | FA FE FF FF 00 00 E4 43 |               | .......C\n  +0x0114 | 10 00 00 00 00 00 00 00 |               | ........\n  +0x011C | 00 C0 5E 40 00 00 00 00 |               | ..^@....\n  +0x0124 | 92 FE FF FF 00 00 00 01 |               | ........\n  +0x012C | 03 00 00 00 01 02 01 00 |               | ........\n  +0x0134 | 03 00 00 00 33 33 33 33 |               | ....3333\n  +0x013C | 33 A3 45 40 7E 57 04 FF |               | 3.E@~W..\n  +0x0144 | 5B 87 53 C0 8D F0 F6 20 |               | [.S.... \n  +0x014C | 04 B6 42 40 9F 77 63 41 |               | ..B@.wcA\n  +0x0154 | 61 85 5E C0 8F 35 23 83 |               | a.^..5#.\n  +0x015C | DC 35 4B C0 F6 97 DD 93 |               | .5K.....\n  +0x0164 | 87 C5 0A 40 00 00 00 00 |               | ...@....\n  +0x016C | 03 00 00 00 20 00 00 00 |               | .... ...\n  +0x0174 | 14 00 00 00 04 00 00 00 |               | ........\n  +0x017C | 07 00 00 00 63 68 61 72 |               | ....char\n  +0x0184 | 6C 69 65 00 03 00 00 00 |               | lie.....\n  +0x018C | 62 6F 62 00 05 00 00 00 |               | bob.....\n  +0x0194 | 61 6C 69 63 65 00 00 00 |               | alice...\n  +0x019C | 07 00 00 00 63 68 61 72 |               | ....char\n  +0x01A4 | 6C 69 65 00 07 00 00 00 |               | lie.....\n  +0x01AC | 63 68 61 72 6C 69 65 00 |               | charlie.\n  +0x01B4 | 09 00 00 00 09 00 08 00 |               | ........\n  +0x01BC | 07 00 01 00 02 00 03 00 |               | ........\n  +0x01C4 | 06 00 05 00 04 00 00 00 |               | ........\n  +0x01CC | 3A FF FF FF 00 00 00 03 |               | :.......\n  +0x01D4 | 02 00 00 00 44 00 00 00 |               | ....D...\n  +0x01DC | 10 00 00 00 00 00 0A 00 |               | ........\n  +0x01E4 | 1A 00 0C 00 04 00 08 00 |               | ........\n  +0x01EC | 0A 00 00 00 00 80 23 44 |               | ......#D\n  +0x01F4 | 18 00 00 00 00 00 00 00 |               | ........\n  +0x01FC | 00 D8 8E 40 00 00 00 00 |               | ...@....\n  +0x0204 | 00 00 06 00 06 00 05 00 |               | ........\n  +0x020C | 06 00 00 00 00 03 0A 00 |               | ........\n  +0x0214 | 18 00 0C 00 04 00 08 00 |               | ........\n  +0x021C | 0A 00 00 00 00 00 E4 43 |               | .......C\n  +0x0224 | 10 00 00 00 00 00 00 00 |               | ........\n  +0x022C | 00 C0 5E 40 00 00 00 00 |               | ..^@....\n  +0x0234 | A2 FF FF FF 00 00 00 01 |               | ........\n  +0x023C | 2F 00 00 00 54 68 69 73 |               | /...This\n  +0x0244 | 20 69 73 20 61 20 6C 6F |               |  is a lo\n  +0x024C | 6E 67 20 73 74 72 69 6E |               | ng strin\n  +0x0254 | 67 20 74 6F 20 73 68 6F |               | g to sho\n  +0x025C | 77 20 68 6F 77 20 69 74 |               | w how it\n  +0x0264 | 20 62 72 65 61 6B 73 20 |               |  breaks \n  +0x026C | 75 70 2E 00 00 00 0A 00 |               | up......\n  +0x0274 | 16 00 0C 00 04 00 08 00 |               | ........\n  +0x027C | 0A 00 00 00 65 20 71 49 |               | ....e qI\n  +0x0284 | 14 00 00 00 C9 76 BE 9F |               | .....v..\n  +0x028C | 0C 24 FE 40 00 00 06 00 |               | .$.@....\n  +0x0294 | 08 00 07 00 06 00 00 00 |               | ........\n  +0x029C | 00 00 00 01             |               | ....\n"
  },
  {
    "path": "tests/arrays_test/arrays_test_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\n\nextern crate alloc;\n\n#[allow(unused_imports, dead_code)]\npub mod my_game {\n\nextern crate alloc;\n#[allow(unused_imports, dead_code)]\npub mod example {\n\nextern crate alloc;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MIN_TEST_ENUM: i8 = 0;\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MAX_TEST_ENUM: i8 = 2;\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n#[allow(non_camel_case_types)]\npub const ENUM_VALUES_TEST_ENUM: [TestEnum; 3] = [\n  TestEnum::A,\n  TestEnum::B,\n  TestEnum::C,\n];\n\n#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n#[repr(transparent)]\npub struct TestEnum(pub i8);\n#[allow(non_upper_case_globals)]\nimpl TestEnum {\n  pub const A: Self = Self(0);\n  pub const B: Self = Self(1);\n  pub const C: Self = Self(2);\n\n  pub const ENUM_MIN: i8 = 0;\n  pub const ENUM_MAX: i8 = 2;\n  pub const ENUM_VALUES: &'static [Self] = &[\n    Self::A,\n    Self::B,\n    Self::C,\n  ];\n  /// Returns the variant's name or \"\" if unknown.\n  pub fn variant_name(self) -> Option<&'static str> {\n    match self {\n      Self::A => Some(\"A\"),\n      Self::B => Some(\"B\"),\n      Self::C => Some(\"C\"),\n      _ => None,\n    }\n  }\n}\nimpl ::core::fmt::Debug for TestEnum {\n  fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n    if let Some(name) = self.variant_name() {\n      f.write_str(name)\n    } else {\n      f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n    }\n  }\n}\nimpl<'a> ::flatbuffers::Follow<'a> for TestEnum {\n  type Inner = Self;\n  #[inline]\n  unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n    let b = unsafe { ::flatbuffers::read_scalar_at::<i8>(buf, loc) };\n    Self(b)\n  }\n}\n\nimpl ::flatbuffers::Push for TestEnum {\n    type Output = TestEnum;\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<i8>(dst, self.0) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for TestEnum {\n  type Scalar = i8;\n  #[inline]\n  fn to_little_endian(self) -> i8 {\n    self.0.to_le()\n  }\n  #[inline]\n  #[allow(clippy::wrong_self_convention)]\n  fn from_little_endian(v: i8) -> Self {\n    let b = i8::from_le(v);\n    Self(b)\n  }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for TestEnum {\n  #[inline]\n  fn run_verifier(\n    v: &mut ::flatbuffers::Verifier, pos: usize\n  ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n    i8::run_verifier(v, pos)\n  }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for TestEnum {}\n// struct NestedStruct, aligned to 8\n#[repr(transparent)]\n#[derive(Clone, Copy, PartialEq)]\npub struct NestedStruct(pub [u8; 32]);\nimpl Default for NestedStruct { \n  fn default() -> Self { \n    Self([0; 32])\n  }\n}\nimpl ::core::fmt::Debug for NestedStruct {\n  fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n    f.debug_struct(\"NestedStruct\")\n      .field(\"a\", &self.a())\n      .field(\"b\", &self.b())\n      .field(\"c\", &self.c())\n      .field(\"d\", &self.d())\n      .finish()\n  }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for NestedStruct {}\nimpl<'a> ::flatbuffers::Follow<'a> for NestedStruct {\n  type Inner = &'a NestedStruct;\n  #[inline]\n  unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n    unsafe { <&'a NestedStruct>::follow(buf, loc) }\n  }\n}\nimpl<'a> ::flatbuffers::Follow<'a> for &'a NestedStruct {\n  type Inner = &'a NestedStruct;\n  #[inline]\n  unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n    unsafe { ::flatbuffers::follow_cast_ref::<NestedStruct>(buf, loc) }\n  }\n}\nimpl<'b> ::flatbuffers::Push for NestedStruct {\n    type Output = NestedStruct;\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        let src = unsafe { ::core::slice::from_raw_parts(self as *const NestedStruct as *const u8, <Self as ::flatbuffers::Push>::size()) };\n        dst.copy_from_slice(src);\n    }\n    #[inline]\n    fn alignment() -> ::flatbuffers::PushAlignment {\n        ::flatbuffers::PushAlignment::new(8)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for NestedStruct {\n  #[inline]\n  fn run_verifier(\n    v: &mut ::flatbuffers::Verifier, pos: usize\n  ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n    v.in_buffer::<Self>(pos)\n  }\n}\n\nimpl<'a> NestedStruct {\n  #[allow(clippy::too_many_arguments)]\n  pub fn new(\n    a: &[i32; 2],\n    b: TestEnum,\n    c: &[TestEnum; 2],\n    d: &[i64; 2],\n  ) -> Self {\n    let mut s = Self([0; 32]);\n    s.set_a(a);\n    s.set_b(b);\n    s.set_c(c);\n    s.set_d(d);\n    s\n  }\n\n  pub fn a(&'a self) -> ::flatbuffers::Array<'a, i32, 2> {\n    // Safety:\n    // Created from a valid Table for this object\n    // Which contains a valid array in this slot\n    use ::flatbuffers::Follow;\n    unsafe { ::flatbuffers::Array::follow(&self.0, 0) }\n  }\n\n  pub fn set_a(&mut self, items: &[i32; 2]) {\n    // Safety:\n    // Created from a valid Table for this object\n    // Which contains a valid array in this slot\n    unsafe { ::flatbuffers::emplace_scalar_array(&mut self.0, 0, items) };\n  }\n\n  pub fn b(&self) -> TestEnum {\n    let mut mem = ::core::mem::MaybeUninit::<<TestEnum as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n    // Safety:\n    // Created from a valid Table for this object\n    // Which contains a valid value in this slot\n    ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n      ::core::ptr::copy_nonoverlapping(\n        self.0[8..].as_ptr(),\n        mem.as_mut_ptr() as *mut u8,\n        ::core::mem::size_of::<<TestEnum as ::flatbuffers::EndianScalar>::Scalar>(),\n      );\n      mem.assume_init()\n    })\n  }\n\n  pub fn set_b(&mut self, x: TestEnum) {\n    let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n    // Safety:\n    // Created from a valid Table for this object\n    // Which contains a valid value in this slot\n    unsafe {\n      ::core::ptr::copy_nonoverlapping(\n        &x_le as *const _ as *const u8,\n        self.0[8..].as_mut_ptr(),\n        ::core::mem::size_of::<<TestEnum as ::flatbuffers::EndianScalar>::Scalar>(),\n      );\n    }\n  }\n\n  pub fn c(&'a self) -> ::flatbuffers::Array<'a, TestEnum, 2> {\n    // Safety:\n    // Created from a valid Table for this object\n    // Which contains a valid array in this slot\n    use ::flatbuffers::Follow;\n    unsafe { ::flatbuffers::Array::follow(&self.0, 9) }\n  }\n\n  pub fn set_c(&mut self, x: &[TestEnum; 2]) {\n    // Safety:\n    // Created from a valid Table for this object\n    // Which contains a valid array in this slot\n    unsafe {\n      ::core::ptr::copy(\n        x.as_ptr() as *const u8,\n        self.0.as_mut_ptr().add(9),\n        2,\n      );\n    }\n  }\n\n  pub fn d(&'a self) -> ::flatbuffers::Array<'a, i64, 2> {\n    // Safety:\n    // Created from a valid Table for this object\n    // Which contains a valid array in this slot\n    use ::flatbuffers::Follow;\n    unsafe { ::flatbuffers::Array::follow(&self.0, 16) }\n  }\n\n  pub fn set_d(&mut self, items: &[i64; 2]) {\n    // Safety:\n    // Created from a valid Table for this object\n    // Which contains a valid array in this slot\n    unsafe { ::flatbuffers::emplace_scalar_array(&mut self.0, 16, items) };\n  }\n\n  pub fn unpack(&self) -> NestedStructT {\n    NestedStructT {\n      a: self.a().into(),\n      b: self.b(),\n      c: self.c().into(),\n      d: self.d().into(),\n    }\n  }\n}\n\n#[derive(Debug, Clone, PartialEq)]\npub struct NestedStructT {\n  pub a: [i32; 2],\n  pub b: TestEnum,\n  pub c: [TestEnum; 2],\n  pub d: [i64; 2],\n}\nimpl Default for NestedStructT {\n  fn default() -> Self {\n    Self {\n      a: [0; 2],\n      b: TestEnum::A,\n      c: ::flatbuffers::array_init(|_| Default::default()),\n      d: [0; 2],\n    }\n  }\n}\nimpl NestedStructT {\n  pub fn pack(&self) -> NestedStruct {\n    NestedStruct::new(\n      &self.a,\n      self.b,\n      &self.c,\n      &self.d,\n    )\n  }\n}\n\n// struct ArrayStruct, aligned to 8\n#[repr(transparent)]\n#[derive(Clone, Copy, PartialEq)]\npub struct ArrayStruct(pub [u8; 160]);\nimpl Default for ArrayStruct { \n  fn default() -> Self { \n    Self([0; 160])\n  }\n}\nimpl ::core::fmt::Debug for ArrayStruct {\n  fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n    f.debug_struct(\"ArrayStruct\")\n      .field(\"a\", &self.a())\n      .field(\"b\", &self.b())\n      .field(\"c\", &self.c())\n      .field(\"d\", &self.d())\n      .field(\"e\", &self.e())\n      .field(\"f\", &self.f())\n      .finish()\n  }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for ArrayStruct {}\nimpl<'a> ::flatbuffers::Follow<'a> for ArrayStruct {\n  type Inner = &'a ArrayStruct;\n  #[inline]\n  unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n    unsafe { <&'a ArrayStruct>::follow(buf, loc) }\n  }\n}\nimpl<'a> ::flatbuffers::Follow<'a> for &'a ArrayStruct {\n  type Inner = &'a ArrayStruct;\n  #[inline]\n  unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n    unsafe { ::flatbuffers::follow_cast_ref::<ArrayStruct>(buf, loc) }\n  }\n}\nimpl<'b> ::flatbuffers::Push for ArrayStruct {\n    type Output = ArrayStruct;\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        let src = unsafe { ::core::slice::from_raw_parts(self as *const ArrayStruct as *const u8, <Self as ::flatbuffers::Push>::size()) };\n        dst.copy_from_slice(src);\n    }\n    #[inline]\n    fn alignment() -> ::flatbuffers::PushAlignment {\n        ::flatbuffers::PushAlignment::new(8)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for ArrayStruct {\n  #[inline]\n  fn run_verifier(\n    v: &mut ::flatbuffers::Verifier, pos: usize\n  ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n    v.in_buffer::<Self>(pos)\n  }\n}\n\nimpl<'a> ArrayStruct {\n  #[allow(clippy::too_many_arguments)]\n  pub fn new(\n    a: f32,\n    b: &[i32; 15],\n    c: i8,\n    d: &[NestedStruct; 2],\n    e: i32,\n    f: &[i64; 2],\n  ) -> Self {\n    let mut s = Self([0; 160]);\n    s.set_a(a);\n    s.set_b(b);\n    s.set_c(c);\n    s.set_d(d);\n    s.set_e(e);\n    s.set_f(f);\n    s\n  }\n\n  pub fn a(&self) -> f32 {\n    let mut mem = ::core::mem::MaybeUninit::<<f32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n    // Safety:\n    // Created from a valid Table for this object\n    // Which contains a valid value in this slot\n    ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n      ::core::ptr::copy_nonoverlapping(\n        self.0[0..].as_ptr(),\n        mem.as_mut_ptr() as *mut u8,\n        ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n      );\n      mem.assume_init()\n    })\n  }\n\n  pub fn set_a(&mut self, x: f32) {\n    let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n    // Safety:\n    // Created from a valid Table for this object\n    // Which contains a valid value in this slot\n    unsafe {\n      ::core::ptr::copy_nonoverlapping(\n        &x_le as *const _ as *const u8,\n        self.0[0..].as_mut_ptr(),\n        ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n      );\n    }\n  }\n\n  pub fn b(&'a self) -> ::flatbuffers::Array<'a, i32, 15> {\n    // Safety:\n    // Created from a valid Table for this object\n    // Which contains a valid array in this slot\n    use ::flatbuffers::Follow;\n    unsafe { ::flatbuffers::Array::follow(&self.0, 4) }\n  }\n\n  pub fn set_b(&mut self, items: &[i32; 15]) {\n    // Safety:\n    // Created from a valid Table for this object\n    // Which contains a valid array in this slot\n    unsafe { ::flatbuffers::emplace_scalar_array(&mut self.0, 4, items) };\n  }\n\n  pub fn c(&self) -> i8 {\n    let mut mem = ::core::mem::MaybeUninit::<<i8 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n    // Safety:\n    // Created from a valid Table for this object\n    // Which contains a valid value in this slot\n    ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n      ::core::ptr::copy_nonoverlapping(\n        self.0[64..].as_ptr(),\n        mem.as_mut_ptr() as *mut u8,\n        ::core::mem::size_of::<<i8 as ::flatbuffers::EndianScalar>::Scalar>(),\n      );\n      mem.assume_init()\n    })\n  }\n\n  pub fn set_c(&mut self, x: i8) {\n    let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n    // Safety:\n    // Created from a valid Table for this object\n    // Which contains a valid value in this slot\n    unsafe {\n      ::core::ptr::copy_nonoverlapping(\n        &x_le as *const _ as *const u8,\n        self.0[64..].as_mut_ptr(),\n        ::core::mem::size_of::<<i8 as ::flatbuffers::EndianScalar>::Scalar>(),\n      );\n    }\n  }\n\n  pub fn d(&'a self) -> ::flatbuffers::Array<'a, NestedStruct, 2> {\n    // Safety:\n    // Created from a valid Table for this object\n    // Which contains a valid array in this slot\n    use ::flatbuffers::Follow;\n    unsafe { ::flatbuffers::Array::follow(&self.0, 72) }\n  }\n\n  pub fn set_d(&mut self, x: &[NestedStruct; 2]) {\n    // Safety:\n    // Created from a valid Table for this object\n    // Which contains a valid array in this slot\n    unsafe {\n      ::core::ptr::copy(\n        x.as_ptr() as *const u8,\n        self.0.as_mut_ptr().add(72),\n        64,\n      );\n    }\n  }\n\n  pub fn e(&self) -> i32 {\n    let mut mem = ::core::mem::MaybeUninit::<<i32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n    // Safety:\n    // Created from a valid Table for this object\n    // Which contains a valid value in this slot\n    ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n      ::core::ptr::copy_nonoverlapping(\n        self.0[136..].as_ptr(),\n        mem.as_mut_ptr() as *mut u8,\n        ::core::mem::size_of::<<i32 as ::flatbuffers::EndianScalar>::Scalar>(),\n      );\n      mem.assume_init()\n    })\n  }\n\n  pub fn set_e(&mut self, x: i32) {\n    let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n    // Safety:\n    // Created from a valid Table for this object\n    // Which contains a valid value in this slot\n    unsafe {\n      ::core::ptr::copy_nonoverlapping(\n        &x_le as *const _ as *const u8,\n        self.0[136..].as_mut_ptr(),\n        ::core::mem::size_of::<<i32 as ::flatbuffers::EndianScalar>::Scalar>(),\n      );\n    }\n  }\n\n  pub fn f(&'a self) -> ::flatbuffers::Array<'a, i64, 2> {\n    // Safety:\n    // Created from a valid Table for this object\n    // Which contains a valid array in this slot\n    use ::flatbuffers::Follow;\n    unsafe { ::flatbuffers::Array::follow(&self.0, 144) }\n  }\n\n  pub fn set_f(&mut self, items: &[i64; 2]) {\n    // Safety:\n    // Created from a valid Table for this object\n    // Which contains a valid array in this slot\n    unsafe { ::flatbuffers::emplace_scalar_array(&mut self.0, 144, items) };\n  }\n\n  pub fn unpack(&self) -> ArrayStructT {\n    ArrayStructT {\n      a: self.a(),\n      b: self.b().into(),\n      c: self.c(),\n      d: { let d = self.d(); ::flatbuffers::array_init(|i| d.get(i).unpack()) },\n      e: self.e(),\n      f: self.f().into(),\n    }\n  }\n}\n\n#[derive(Debug, Clone, PartialEq)]\npub struct ArrayStructT {\n  pub a: f32,\n  pub b: [i32; 15],\n  pub c: i8,\n  pub d: [NestedStructT; 2],\n  pub e: i32,\n  pub f: [i64; 2],\n}\nimpl Default for ArrayStructT {\n  fn default() -> Self {\n    Self {\n      a: 0.0,\n      b: [0; 15],\n      c: 0,\n      d: ::flatbuffers::array_init(|_| Default::default()),\n      e: 0,\n      f: [0; 2],\n    }\n  }\n}\nimpl ArrayStructT {\n  pub fn pack(&self) -> ArrayStruct {\n    ArrayStruct::new(\n      self.a,\n      &self.b,\n      self.c,\n      &::flatbuffers::array_init(|i| self.d[i].pack()),\n      self.e,\n      &self.f,\n    )\n  }\n}\n\n// struct LargeArrayStruct, aligned to 4\n#[repr(transparent)]\n#[derive(Clone, Copy, PartialEq)]\npub struct LargeArrayStruct(pub [u8; 384]);\nimpl Default for LargeArrayStruct { \n  fn default() -> Self { \n    Self([0; 384])\n  }\n}\nimpl ::core::fmt::Debug for LargeArrayStruct {\n  fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n    f.debug_struct(\"LargeArrayStruct\")\n      .field(\"d\", &self.d())\n      .field(\"e\", &self.e())\n      .field(\"f\", &self.f())\n      .finish()\n  }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for LargeArrayStruct {}\nimpl<'a> ::flatbuffers::Follow<'a> for LargeArrayStruct {\n  type Inner = &'a LargeArrayStruct;\n  #[inline]\n  unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n    unsafe { <&'a LargeArrayStruct>::follow(buf, loc) }\n  }\n}\nimpl<'a> ::flatbuffers::Follow<'a> for &'a LargeArrayStruct {\n  type Inner = &'a LargeArrayStruct;\n  #[inline]\n  unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n    unsafe { ::flatbuffers::follow_cast_ref::<LargeArrayStruct>(buf, loc) }\n  }\n}\nimpl<'b> ::flatbuffers::Push for LargeArrayStruct {\n    type Output = LargeArrayStruct;\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        let src = unsafe { ::core::slice::from_raw_parts(self as *const LargeArrayStruct as *const u8, <Self as ::flatbuffers::Push>::size()) };\n        dst.copy_from_slice(src);\n    }\n    #[inline]\n    fn alignment() -> ::flatbuffers::PushAlignment {\n        ::flatbuffers::PushAlignment::new(4)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for LargeArrayStruct {\n  #[inline]\n  fn run_verifier(\n    v: &mut ::flatbuffers::Verifier, pos: usize\n  ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n    v.in_buffer::<Self>(pos)\n  }\n}\n\nimpl<'a> LargeArrayStruct {\n  #[allow(clippy::too_many_arguments)]\n  pub fn new(\n    d: &[u8; 64],\n    e: &[f32; 64],\n    f: &[bool; 64],\n  ) -> Self {\n    let mut s = Self([0; 384]);\n    s.set_d(d);\n    s.set_e(e);\n    s.set_f(f);\n    s\n  }\n\n  pub fn d(&'a self) -> ::flatbuffers::Array<'a, u8, 64> {\n    // Safety:\n    // Created from a valid Table for this object\n    // Which contains a valid array in this slot\n    use ::flatbuffers::Follow;\n    unsafe { ::flatbuffers::Array::follow(&self.0, 0) }\n  }\n\n  pub fn set_d(&mut self, items: &[u8; 64]) {\n    // Safety:\n    // Created from a valid Table for this object\n    // Which contains a valid array in this slot\n    unsafe { ::flatbuffers::emplace_scalar_array(&mut self.0, 0, items) };\n  }\n\n  pub fn e(&'a self) -> ::flatbuffers::Array<'a, f32, 64> {\n    // Safety:\n    // Created from a valid Table for this object\n    // Which contains a valid array in this slot\n    use ::flatbuffers::Follow;\n    unsafe { ::flatbuffers::Array::follow(&self.0, 64) }\n  }\n\n  pub fn set_e(&mut self, items: &[f32; 64]) {\n    // Safety:\n    // Created from a valid Table for this object\n    // Which contains a valid array in this slot\n    unsafe { ::flatbuffers::emplace_scalar_array(&mut self.0, 64, items) };\n  }\n\n  pub fn f(&'a self) -> ::flatbuffers::Array<'a, bool, 64> {\n    // Safety:\n    // Created from a valid Table for this object\n    // Which contains a valid array in this slot\n    use ::flatbuffers::Follow;\n    unsafe { ::flatbuffers::Array::follow(&self.0, 320) }\n  }\n\n  pub fn set_f(&mut self, items: &[bool; 64]) {\n    // Safety:\n    // Created from a valid Table for this object\n    // Which contains a valid array in this slot\n    unsafe { ::flatbuffers::emplace_scalar_array(&mut self.0, 320, items) };\n  }\n\n  pub fn unpack(&self) -> LargeArrayStructT {\n    LargeArrayStructT {\n      d: self.d().into(),\n      e: self.e().into(),\n      f: self.f().into(),\n    }\n  }\n}\n\n#[derive(Debug, Clone, PartialEq)]\npub struct LargeArrayStructT {\n  pub d: [u8; 64],\n  pub e: [f32; 64],\n  pub f: [bool; 64],\n}\nimpl Default for LargeArrayStructT {\n  fn default() -> Self {\n    Self {\n      d: [0; 64],\n      e: [0.0; 64],\n      f: [false; 64],\n    }\n  }\n}\nimpl LargeArrayStructT {\n  pub fn pack(&self) -> LargeArrayStruct {\n    LargeArrayStruct::new(\n      &self.d,\n      &self.e,\n      &self.f,\n    )\n  }\n}\n\npub enum ArrayTableOffset {}\n#[derive(Copy, Clone, PartialEq)]\n\npub struct ArrayTable<'a> {\n  pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for ArrayTable<'a> {\n  type Inner = ArrayTable<'a>;\n  #[inline]\n  unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n    Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n  }\n}\n\nimpl<'a> ArrayTable<'a> {\n  pub const VT_A: ::flatbuffers::VOffsetT = 4;\n\n  #[inline]\n  pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n    ArrayTable { _tab: table }\n  }\n  #[allow(unused_mut)]\n  pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n    _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n    args: &'args ArrayTableArgs<'args>\n  ) -> ::flatbuffers::WIPOffset<ArrayTable<'bldr>> {\n    let mut builder = ArrayTableBuilder::new(_fbb);\n    if let Some(x) = args.a { builder.add_a(x); }\n    builder.finish()\n  }\n\n  pub fn unpack(&self) -> ArrayTableT {\n    let a = self.a().map(|x| {\n      x.unpack()\n    });\n    ArrayTableT {\n      a,\n    }\n  }\n\n  #[inline]\n  pub fn a(&self) -> Option<&'a ArrayStruct> {\n    // Safety:\n    // Created from valid Table for this object\n    // which contains a valid value in this slot\n    unsafe { self._tab.get::<ArrayStruct>(ArrayTable::VT_A, None)}\n  }\n}\n\nimpl ::flatbuffers::Verifiable for ArrayTable<'_> {\n  #[inline]\n  fn run_verifier(\n    v: &mut ::flatbuffers::Verifier, pos: usize\n  ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n    v.visit_table(pos)?\n     .visit_field::<ArrayStruct>(\"a\", Self::VT_A, false)?\n     .finish();\n    Ok(())\n  }\n}\npub struct ArrayTableArgs<'a> {\n    pub a: Option<&'a ArrayStruct>,\n}\nimpl<'a> Default for ArrayTableArgs<'a> {\n  #[inline]\n  fn default() -> Self {\n    ArrayTableArgs {\n      a: None,\n    }\n  }\n}\n\npub struct ArrayTableBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n  fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n  start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> ArrayTableBuilder<'a, 'b, A> {\n  #[inline]\n  pub fn add_a(&mut self, a: &ArrayStruct) {\n    self.fbb_.push_slot_always::<&ArrayStruct>(ArrayTable::VT_A, a);\n  }\n  #[inline]\n  pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> ArrayTableBuilder<'a, 'b, A> {\n    let start = _fbb.start_table();\n    ArrayTableBuilder {\n      fbb_: _fbb,\n      start_: start,\n    }\n  }\n  #[inline]\n  pub fn finish(self) -> ::flatbuffers::WIPOffset<ArrayTable<'a>> {\n    let o = self.fbb_.end_table(self.start_);\n    ::flatbuffers::WIPOffset::new(o.value())\n  }\n}\n\nimpl ::core::fmt::Debug for ArrayTable<'_> {\n  fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n    let mut ds = f.debug_struct(\"ArrayTable\");\n      ds.field(\"a\", &self.a());\n      ds.finish()\n  }\n}\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct ArrayTableT {\n  pub a: Option<ArrayStructT>,\n}\nimpl Default for ArrayTableT {\n  fn default() -> Self {\n    Self {\n      a: None,\n    }\n  }\n}\nimpl ArrayTableT {\n  pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n    &self,\n    _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n  ) -> ::flatbuffers::WIPOffset<ArrayTable<'b>> {\n    let a_tmp = self.a.as_ref().map(|x| x.pack());\n    let a = a_tmp.as_ref();\n    ArrayTable::create(_fbb, &ArrayTableArgs{\n      a,\n    })\n  }\n}\n#[inline]\n/// Verifies that a buffer of bytes contains a `ArrayTable`\n/// and returns it.\n/// Note that verification is still experimental and may not\n/// catch every error, or be maximally performant. For the\n/// previous, unchecked, behavior use\n/// `root_as_array_table_unchecked`.\npub fn root_as_array_table(buf: &[u8]) -> Result<ArrayTable<'_>, ::flatbuffers::InvalidFlatbuffer> {\n  ::flatbuffers::root::<ArrayTable>(buf)\n}\n#[inline]\n/// Verifies that a buffer of bytes contains a size prefixed\n/// `ArrayTable` and returns it.\n/// Note that verification is still experimental and may not\n/// catch every error, or be maximally performant. For the\n/// previous, unchecked, behavior use\n/// `size_prefixed_root_as_array_table_unchecked`.\npub fn size_prefixed_root_as_array_table(buf: &[u8]) -> Result<ArrayTable<'_>, ::flatbuffers::InvalidFlatbuffer> {\n  ::flatbuffers::size_prefixed_root::<ArrayTable>(buf)\n}\n#[inline]\n/// Verifies, with the given options, that a buffer of bytes\n/// contains a `ArrayTable` and returns it.\n/// Note that verification is still experimental and may not\n/// catch every error, or be maximally performant. For the\n/// previous, unchecked, behavior use\n/// `root_as_array_table_unchecked`.\npub fn root_as_array_table_with_opts<'b, 'o>(\n  opts: &'o ::flatbuffers::VerifierOptions,\n  buf: &'b [u8],\n) -> Result<ArrayTable<'b>, ::flatbuffers::InvalidFlatbuffer> {\n  ::flatbuffers::root_with_opts::<ArrayTable<'b>>(opts, buf)\n}\n#[inline]\n/// Verifies, with the given verifier options, that a buffer of\n/// bytes contains a size prefixed `ArrayTable` and returns\n/// it. Note that verification is still experimental and may not\n/// catch every error, or be maximally performant. For the\n/// previous, unchecked, behavior use\n/// `root_as_array_table_unchecked`.\npub fn size_prefixed_root_as_array_table_with_opts<'b, 'o>(\n  opts: &'o ::flatbuffers::VerifierOptions,\n  buf: &'b [u8],\n) -> Result<ArrayTable<'b>, ::flatbuffers::InvalidFlatbuffer> {\n  ::flatbuffers::size_prefixed_root_with_opts::<ArrayTable<'b>>(opts, buf)\n}\n#[inline]\n/// Assumes, without verification, that a buffer of bytes contains a ArrayTable and returns it.\n/// # Safety\n/// Callers must trust the given bytes do indeed contain a valid `ArrayTable`.\npub unsafe fn root_as_array_table_unchecked(buf: &[u8]) -> ArrayTable<'_> {\n  unsafe { ::flatbuffers::root_unchecked::<ArrayTable>(buf) }\n}\n#[inline]\n/// Assumes, without verification, that a buffer of bytes contains a size prefixed ArrayTable and returns it.\n/// # Safety\n/// Callers must trust the given bytes do indeed contain a valid size prefixed `ArrayTable`.\npub unsafe fn size_prefixed_root_as_array_table_unchecked(buf: &[u8]) -> ArrayTable<'_> {\n  unsafe { ::flatbuffers::size_prefixed_root_unchecked::<ArrayTable>(buf) }\n}\npub const ARRAY_TABLE_IDENTIFIER: &str = \"ARRT\";\n\n#[inline]\npub fn array_table_buffer_has_identifier(buf: &[u8]) -> bool {\n  ::flatbuffers::buffer_has_identifier(buf, ARRAY_TABLE_IDENTIFIER, false)\n}\n\n#[inline]\npub fn array_table_size_prefixed_buffer_has_identifier(buf: &[u8]) -> bool {\n  ::flatbuffers::buffer_has_identifier(buf, ARRAY_TABLE_IDENTIFIER, true)\n}\n\npub const ARRAY_TABLE_EXTENSION: &str = \"mon\";\n\n#[inline]\npub fn finish_array_table_buffer<'a, 'b, A: ::flatbuffers::Allocator + 'a>(\n    fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    root: ::flatbuffers::WIPOffset<ArrayTable<'a>>) {\n  fbb.finish(root, Some(ARRAY_TABLE_IDENTIFIER));\n}\n\n#[inline]\npub fn finish_size_prefixed_array_table_buffer<'a, 'b, A: ::flatbuffers::Allocator + 'a>(fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>, root: ::flatbuffers::WIPOffset<ArrayTable<'a>>) {\n  fbb.finish_size_prefixed(root, Some(ARRAY_TABLE_IDENTIFIER));\n}\n}  // pub mod Example\n}  // pub mod MyGame\n\n"
  },
  {
    "path": "tests/arrays_test/mod.rs",
    "content": "// Automatically generated by the Flatbuffers compiler. Do not modify.\n// @generated\npub mod my_game {\n    use super::*;\n    pub mod example {\n        use super::*;\n        mod test_enum_generated;\n        pub use self::test_enum_generated::*;\n        mod nested_struct_generated;\n        pub use self::nested_struct_generated::*;\n        mod array_struct_generated;\n        pub use self::array_struct_generated::*;\n        mod large_array_struct_generated;\n        pub use self::large_array_struct_generated::*;\n        mod array_table_generated;\n        pub use self::array_table_generated::*;\n    } // example\n} // my_game\n"
  },
  {
    "path": "tests/arrays_test/my_game/example/array_struct_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n// struct ArrayStruct, aligned to 8\n#[repr(transparent)]\n#[derive(Clone, Copy, PartialEq)]\npub struct ArrayStruct(pub [u8; 160]);\n\nimpl Default for ArrayStruct {\n    fn default() -> Self {\n        Self([0; 160])\n    }\n}\n\nimpl ::core::fmt::Debug for ArrayStruct {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        f.debug_struct(\"ArrayStruct\")\n            .field(\"a\", &self.a())\n            .field(\"b\", &self.b())\n            .field(\"c\", &self.c())\n            .field(\"d\", &self.d())\n            .field(\"e\", &self.e())\n            .field(\"f\", &self.f())\n            .finish()\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for ArrayStruct {}\n\nimpl<'a> ::flatbuffers::Follow<'a> for ArrayStruct {\n    type Inner = &'a ArrayStruct;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { <&'a ArrayStruct>::follow(buf, loc) }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for &'a ArrayStruct {\n    type Inner = &'a ArrayStruct;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { ::flatbuffers::follow_cast_ref::<ArrayStruct>(buf, loc) }\n    }\n}\n\nimpl<'b> ::flatbuffers::Push for ArrayStruct {\n    type Output = ArrayStruct;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        let src = unsafe { ::core::slice::from_raw_parts(self as *const ArrayStruct as *const u8, <Self as ::flatbuffers::Push>::size()) };\n        dst.copy_from_slice(src);\n    }\n\n    #[inline]\n    fn alignment() -> ::flatbuffers::PushAlignment {\n        ::flatbuffers::PushAlignment::new(8)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for ArrayStruct {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.in_buffer::<Self>(pos)\n    }\n}\n\nimpl<'a> ArrayStruct {\n    #[allow(clippy::too_many_arguments)]\n    pub fn new(\n        a: f32,\n        b: &[i32; 15],\n        c: i8,\n        d: &[NestedStruct; 2],\n        e: i32,\n        f: &[i64; 2],\n    ) -> Self {\n        let mut s = Self([0; 160]);\n        s.set_a(a);\n        s.set_b(b);\n        s.set_c(c);\n        s.set_d(d);\n        s.set_e(e);\n        s.set_f(f);\n        s\n    }\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.Example.ArrayStruct\"\n    }\n\n    pub fn a(&self) -> f32 {\n        let mut mem = ::core::mem::MaybeUninit::<<f32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[0..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_a(&mut self, x: f32) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[0..].as_mut_ptr(),\n                ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn b(&'a self) -> ::flatbuffers::Array<'a, i32, 15> {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid array in this slot\n        use ::flatbuffers::Follow;\n        unsafe { ::flatbuffers::Array::follow(&self.0, 4) }\n    }\n\n    pub fn set_b(&mut self, items: &[i32; 15]) {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid array in this slot\n        unsafe { ::flatbuffers::emplace_scalar_array(&mut self.0, 4, items) };\n    }\n\n    pub fn c(&self) -> i8 {\n        let mut mem = ::core::mem::MaybeUninit::<<i8 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[64..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<i8 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_c(&mut self, x: i8) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[64..].as_mut_ptr(),\n                ::core::mem::size_of::<<i8 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn d(&'a self) -> ::flatbuffers::Array<'a, NestedStruct, 2> {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid array in this slot\n        use ::flatbuffers::Follow;\n        unsafe { ::flatbuffers::Array::follow(&self.0, 72) }\n    }\n\n    pub fn set_d(&mut self, x: &[NestedStruct; 2]) {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid array in this slot\n        unsafe {\n            ::core::ptr::copy(\n                x.as_ptr() as *const u8,\n                self.0.as_mut_ptr().add(72),\n                64,\n            );\n        }\n    }\n\n    pub fn e(&self) -> i32 {\n        let mut mem = ::core::mem::MaybeUninit::<<i32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[136..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<i32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_e(&mut self, x: i32) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[136..].as_mut_ptr(),\n                ::core::mem::size_of::<<i32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn f(&'a self) -> ::flatbuffers::Array<'a, i64, 2> {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid array in this slot\n        use ::flatbuffers::Follow;\n        unsafe { ::flatbuffers::Array::follow(&self.0, 144) }\n    }\n\n    pub fn set_f(&mut self, items: &[i64; 2]) {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid array in this slot\n        unsafe { ::flatbuffers::emplace_scalar_array(&mut self.0, 144, items) };\n    }\n\n    pub fn unpack(&self) -> ArrayStructT {\n        ArrayStructT {\n            a: self.a(),\n            b: self.b().into(),\n            c: self.c(),\n        d: { let d = self.d(); ::flatbuffers::array_init(|i| d.get(i).unpack()) },\n            e: self.e(),\n            f: self.f().into(),\n        }\n    }\n}\n\n#[derive(Debug, Clone, PartialEq)]\npub struct ArrayStructT {\n    pub a: f32,\n    pub b: [i32; 15],\n    pub c: i8,\n    pub d: [NestedStructT; 2],\n    pub e: i32,\n    pub f: [i64; 2],\n}\nimpl Default for ArrayStructT {\n    fn default() -> Self {\n        Self {\n            a: 0.0,\n            b: [0; 15],\n            c: 0,\n            d: ::flatbuffers::array_init(|_| Default::default()),\n            e: 0,\n            f: [0; 2],\n        }\n    }\n}\n\nimpl ArrayStructT {\n    pub fn pack(&self) -> ArrayStruct {\n        ArrayStruct::new(\n            self.a,\n            &self.b,\n            self.c,\n            &::flatbuffers::array_init(|i| self.d[i].pack()),\n            self.e,\n            &self.f,\n        )\n    }\n}\n"
  },
  {
    "path": "tests/arrays_test/my_game/example/array_table_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum ArrayTableOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct ArrayTable<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for ArrayTable<'a> {\n    type Inner = ArrayTable<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> ArrayTable<'a> {\n    pub const VT_A: ::flatbuffers::VOffsetT = 4;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.Example.ArrayTable\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        ArrayTable { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args ArrayTableArgs<'args>\n    ) -> ::flatbuffers::WIPOffset<ArrayTable<'bldr>> {\n        let mut builder = ArrayTableBuilder::new(_fbb);\n        if let Some(x) = args.a { builder.add_a(x); }\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> ArrayTableT {\n        let a = self.a().map(|x| {\n            x.unpack()\n        });\n        ArrayTableT {\n            a,\n        }\n    }\n\n    #[inline]\n    pub fn a(&self) -> Option<&'a ArrayStruct> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<ArrayStruct>(ArrayTable::VT_A, None)}\n    }\n}\n\nimpl ::flatbuffers::Verifiable for ArrayTable<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<ArrayStruct>(\"a\", Self::VT_A, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct ArrayTableArgs<'a> {\n    pub a: Option<&'a ArrayStruct>,\n}\n\nimpl<'a> Default for ArrayTableArgs<'a> {\n    #[inline]\n    fn default() -> Self {\n        ArrayTableArgs {\n            a: None,\n        }\n    }\n}\n\npub struct ArrayTableBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> ArrayTableBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_a(&mut self, a: &ArrayStruct) {\n        self.fbb_.push_slot_always::<&ArrayStruct>(ArrayTable::VT_A, a);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> ArrayTableBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        ArrayTableBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<ArrayTable<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for ArrayTable<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"ArrayTable\");\n        ds.field(\"a\", &self.a());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct ArrayTableT {\n    pub a: Option<ArrayStructT>,\n}\n\nimpl Default for ArrayTableT {\n    fn default() -> Self {\n        Self {\n            a: None,\n        }\n    }\n}\n\nimpl ArrayTableT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<ArrayTable<'b>> {\n        let a_tmp = self.a.as_ref().map(|x| x.pack());\n        let a = a_tmp.as_ref();\n        ArrayTable::create(_fbb, &ArrayTableArgs{\n            a,\n        })\n    }\n}\n\n/// Verifies that a buffer of bytes contains a `ArrayTable`\n/// and returns it.\n/// Note that verification is still experimental and may not\n/// catch every error, or be maximally performant. For the\n/// previous, unchecked, behavior use\n/// `root_as_array_table_unchecked`.\n#[inline]\npub fn root_as_array_table(buf: &[u8]) -> Result<ArrayTable<'_>, ::flatbuffers::InvalidFlatbuffer> {\n    ::flatbuffers::root::<ArrayTable>(buf)\n}\n\n/// Verifies that a buffer of bytes contains a size prefixed\n/// `ArrayTable` and returns it.\n/// Note that verification is still experimental and may not\n/// catch every error, or be maximally performant. For the\n/// previous, unchecked, behavior use\n/// `size_prefixed_root_as_array_table_unchecked`.\n#[inline]\npub fn size_prefixed_root_as_array_table(buf: &[u8]) -> Result<ArrayTable<'_>, ::flatbuffers::InvalidFlatbuffer> {\n    ::flatbuffers::size_prefixed_root::<ArrayTable>(buf)\n}\n\n/// Verifies, with the given options, that a buffer of bytes\n/// contains a `ArrayTable` and returns it.\n/// Note that verification is still experimental and may not\n/// catch every error, or be maximally performant. For the\n/// previous, unchecked, behavior use\n/// `root_as_array_table_unchecked`.\n#[inline]\npub fn root_as_array_table_with_opts<'b, 'o>(\n    opts: &'o ::flatbuffers::VerifierOptions,\n    buf: &'b [u8],\n) -> Result<ArrayTable<'b>, ::flatbuffers::InvalidFlatbuffer> {\n    ::flatbuffers::root_with_opts::<ArrayTable<'b>>(opts, buf)\n}\n\n/// Verifies, with the given verifier options, that a buffer of\n/// bytes contains a size prefixed `ArrayTable` and returns\n/// it. Note that verification is still experimental and may not\n/// catch every error, or be maximally performant. For the\n/// previous, unchecked, behavior use\n/// `root_as_array_table_unchecked`.\n#[inline]\npub fn size_prefixed_root_as_array_table_with_opts<'b, 'o>(\n    opts: &'o ::flatbuffers::VerifierOptions,\n    buf: &'b [u8],\n) -> Result<ArrayTable<'b>, ::flatbuffers::InvalidFlatbuffer> {\n    ::flatbuffers::size_prefixed_root_with_opts::<ArrayTable<'b>>(opts, buf)\n}\n\n/// Assumes, without verification, that a buffer of bytes contains a ArrayTable and returns it.\n/// # Safety\n/// Callers must trust the given bytes do indeed contain a valid `ArrayTable`.\n#[inline]\npub unsafe fn root_as_array_table_unchecked(buf: &[u8]) -> ArrayTable<'_> {\n    unsafe { ::flatbuffers::root_unchecked::<ArrayTable>(buf) }\n}\n\n/// Assumes, without verification, that a buffer of bytes contains a size prefixed ArrayTable and returns it.\n/// # Safety\n/// Callers must trust the given bytes do indeed contain a valid size prefixed `ArrayTable`.\n#[inline]\npub unsafe fn size_prefixed_root_as_array_table_unchecked(buf: &[u8]) -> ArrayTable<'_> {\n    unsafe { ::flatbuffers::size_prefixed_root_unchecked::<ArrayTable>(buf) }\n}\n\npub const ARRAY_TABLE_IDENTIFIER: &str = \"ARRT\";\n\n#[inline]\npub fn array_table_buffer_has_identifier(buf: &[u8]) -> bool {\n    ::flatbuffers::buffer_has_identifier(buf, ARRAY_TABLE_IDENTIFIER, false)\n}\n\n#[inline]\npub fn array_table_size_prefixed_buffer_has_identifier(buf: &[u8]) -> bool {\n    ::flatbuffers::buffer_has_identifier(buf, ARRAY_TABLE_IDENTIFIER, true)\n}\n\npub const ARRAY_TABLE_EXTENSION: &str = \"mon\";\n\n#[inline]\npub fn finish_array_table_buffer<'a, 'b, A: ::flatbuffers::Allocator + 'a>(\n    fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    root: ::flatbuffers::WIPOffset<ArrayTable<'a>>\n) {\n    fbb.finish(root, Some(ARRAY_TABLE_IDENTIFIER));\n}\n\n#[inline]\npub fn finish_size_prefixed_array_table_buffer<'a, 'b, A: ::flatbuffers::Allocator + 'a>(\n    fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    root: ::flatbuffers::WIPOffset<ArrayTable<'a>>\n) {\n    fbb.finish_size_prefixed(root, Some(ARRAY_TABLE_IDENTIFIER));\n}\n"
  },
  {
    "path": "tests/arrays_test/my_game/example/large_array_struct_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n// struct LargeArrayStruct, aligned to 8\n#[repr(transparent)]\n#[derive(Clone, Copy, PartialEq)]\npub struct LargeArrayStruct(pub [u8; 2496]);\n\nimpl Default for LargeArrayStruct {\n    fn default() -> Self {\n        Self([0; 2496])\n    }\n}\n\nimpl ::core::fmt::Debug for LargeArrayStruct {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        f.debug_struct(\"LargeArrayStruct\")\n            .field(\"d\", &self.d())\n            .field(\"e\", &self.e())\n            .field(\"f\", &self.f())\n            .field(\"g\", &self.g())\n            .field(\"h\", &self.h())\n            .finish()\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for LargeArrayStruct {}\n\nimpl<'a> ::flatbuffers::Follow<'a> for LargeArrayStruct {\n    type Inner = &'a LargeArrayStruct;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { <&'a LargeArrayStruct>::follow(buf, loc) }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for &'a LargeArrayStruct {\n    type Inner = &'a LargeArrayStruct;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { ::flatbuffers::follow_cast_ref::<LargeArrayStruct>(buf, loc) }\n    }\n}\n\nimpl<'b> ::flatbuffers::Push for LargeArrayStruct {\n    type Output = LargeArrayStruct;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        let src = unsafe { ::core::slice::from_raw_parts(self as *const LargeArrayStruct as *const u8, <Self as ::flatbuffers::Push>::size()) };\n        dst.copy_from_slice(src);\n    }\n\n    #[inline]\n    fn alignment() -> ::flatbuffers::PushAlignment {\n        ::flatbuffers::PushAlignment::new(8)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for LargeArrayStruct {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.in_buffer::<Self>(pos)\n    }\n}\n\nimpl<'a> LargeArrayStruct {\n    #[allow(clippy::too_many_arguments)]\n    pub fn new(\n        d: &[u8; 64],\n        e: &[f32; 64],\n        f: &[bool; 64],\n        g: &[NestedStruct; 64],\n        h: &[TestEnum; 64],\n    ) -> Self {\n        let mut s = Self([0; 2496]);\n        s.set_d(d);\n        s.set_e(e);\n        s.set_f(f);\n        s.set_g(g);\n        s.set_h(h);\n        s\n    }\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.Example.LargeArrayStruct\"\n    }\n\n    pub fn d(&'a self) -> ::flatbuffers::Array<'a, u8, 64> {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid array in this slot\n        use ::flatbuffers::Follow;\n        unsafe { ::flatbuffers::Array::follow(&self.0, 0) }\n    }\n\n    pub fn set_d(&mut self, items: &[u8; 64]) {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid array in this slot\n        unsafe { ::flatbuffers::emplace_scalar_array(&mut self.0, 0, items) };\n    }\n\n    pub fn e(&'a self) -> ::flatbuffers::Array<'a, f32, 64> {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid array in this slot\n        use ::flatbuffers::Follow;\n        unsafe { ::flatbuffers::Array::follow(&self.0, 64) }\n    }\n\n    pub fn set_e(&mut self, items: &[f32; 64]) {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid array in this slot\n        unsafe { ::flatbuffers::emplace_scalar_array(&mut self.0, 64, items) };\n    }\n\n    pub fn f(&'a self) -> ::flatbuffers::Array<'a, bool, 64> {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid array in this slot\n        use ::flatbuffers::Follow;\n        unsafe { ::flatbuffers::Array::follow(&self.0, 320) }\n    }\n\n    pub fn set_f(&mut self, items: &[bool; 64]) {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid array in this slot\n        unsafe { ::flatbuffers::emplace_scalar_array(&mut self.0, 320, items) };\n    }\n\n    pub fn g(&'a self) -> ::flatbuffers::Array<'a, NestedStruct, 64> {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid array in this slot\n        use ::flatbuffers::Follow;\n        unsafe { ::flatbuffers::Array::follow(&self.0, 384) }\n    }\n\n    pub fn set_g(&mut self, x: &[NestedStruct; 64]) {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid array in this slot\n        unsafe {\n            ::core::ptr::copy(\n                x.as_ptr() as *const u8,\n                self.0.as_mut_ptr().add(384),\n                2048,\n            );\n        }\n    }\n\n    pub fn h(&'a self) -> ::flatbuffers::Array<'a, TestEnum, 64> {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid array in this slot\n        use ::flatbuffers::Follow;\n        unsafe { ::flatbuffers::Array::follow(&self.0, 2432) }\n    }\n\n    pub fn set_h(&mut self, x: &[TestEnum; 64]) {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid array in this slot\n        unsafe {\n            ::core::ptr::copy(\n                x.as_ptr() as *const u8,\n                self.0.as_mut_ptr().add(2432),\n                64,\n            );\n        }\n    }\n\n    pub fn unpack(&self) -> LargeArrayStructT {\n        LargeArrayStructT {\n            d: self.d().into(),\n            e: self.e().into(),\n            f: self.f().into(),\n        g: { let g = self.g(); ::flatbuffers::array_init(|i| g.get(i).unpack()) },\n            h: self.h().into(),\n        }\n    }\n}\n\n#[derive(Debug, Clone, PartialEq)]\npub struct LargeArrayStructT {\n    pub d: [u8; 64],\n    pub e: [f32; 64],\n    pub f: [bool; 64],\n    pub g: [NestedStructT; 64],\n    pub h: [TestEnum; 64],\n}\nimpl Default for LargeArrayStructT {\n    fn default() -> Self {\n        Self {\n            d: [0; 64],\n            e: [0.0; 64],\n            f: [false; 64],\n            g: ::flatbuffers::array_init(|_| Default::default()),\n            h: ::flatbuffers::array_init(|_| Default::default()),\n        }\n    }\n}\n\nimpl LargeArrayStructT {\n    pub fn pack(&self) -> LargeArrayStruct {\n        LargeArrayStruct::new(\n            &self.d,\n            &self.e,\n            &self.f,\n            &::flatbuffers::array_init(|i| self.g[i].pack()),\n            &self.h,\n        )\n    }\n}\n"
  },
  {
    "path": "tests/arrays_test/my_game/example/nested_struct_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n// struct NestedStruct, aligned to 8\n#[repr(transparent)]\n#[derive(Clone, Copy, PartialEq)]\npub struct NestedStruct(pub [u8; 32]);\n\nimpl Default for NestedStruct {\n    fn default() -> Self {\n        Self([0; 32])\n    }\n}\n\nimpl ::core::fmt::Debug for NestedStruct {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        f.debug_struct(\"NestedStruct\")\n            .field(\"a\", &self.a())\n            .field(\"b\", &self.b())\n            .field(\"c\", &self.c())\n            .field(\"d\", &self.d())\n            .finish()\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for NestedStruct {}\n\nimpl<'a> ::flatbuffers::Follow<'a> for NestedStruct {\n    type Inner = &'a NestedStruct;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { <&'a NestedStruct>::follow(buf, loc) }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for &'a NestedStruct {\n    type Inner = &'a NestedStruct;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { ::flatbuffers::follow_cast_ref::<NestedStruct>(buf, loc) }\n    }\n}\n\nimpl<'b> ::flatbuffers::Push for NestedStruct {\n    type Output = NestedStruct;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        let src = unsafe { ::core::slice::from_raw_parts(self as *const NestedStruct as *const u8, <Self as ::flatbuffers::Push>::size()) };\n        dst.copy_from_slice(src);\n    }\n\n    #[inline]\n    fn alignment() -> ::flatbuffers::PushAlignment {\n        ::flatbuffers::PushAlignment::new(8)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for NestedStruct {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.in_buffer::<Self>(pos)\n    }\n}\n\nimpl<'a> NestedStruct {\n    #[allow(clippy::too_many_arguments)]\n    pub fn new(\n        a: &[i32; 2],\n        b: TestEnum,\n        c: &[TestEnum; 2],\n        d: &[i64; 2],\n    ) -> Self {\n        let mut s = Self([0; 32]);\n        s.set_a(a);\n        s.set_b(b);\n        s.set_c(c);\n        s.set_d(d);\n        s\n    }\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.Example.NestedStruct\"\n    }\n\n    pub fn a(&'a self) -> ::flatbuffers::Array<'a, i32, 2> {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid array in this slot\n        use ::flatbuffers::Follow;\n        unsafe { ::flatbuffers::Array::follow(&self.0, 0) }\n    }\n\n    pub fn set_a(&mut self, items: &[i32; 2]) {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid array in this slot\n        unsafe { ::flatbuffers::emplace_scalar_array(&mut self.0, 0, items) };\n    }\n\n    pub fn b(&self) -> TestEnum {\n        let mut mem = ::core::mem::MaybeUninit::<<TestEnum as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[8..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<TestEnum as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_b(&mut self, x: TestEnum) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[8..].as_mut_ptr(),\n                ::core::mem::size_of::<<TestEnum as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn c(&'a self) -> ::flatbuffers::Array<'a, TestEnum, 2> {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid array in this slot\n        use ::flatbuffers::Follow;\n        unsafe { ::flatbuffers::Array::follow(&self.0, 9) }\n    }\n\n    pub fn set_c(&mut self, x: &[TestEnum; 2]) {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid array in this slot\n        unsafe {\n            ::core::ptr::copy(\n                x.as_ptr() as *const u8,\n                self.0.as_mut_ptr().add(9),\n                2,\n            );\n        }\n    }\n\n    pub fn d(&'a self) -> ::flatbuffers::Array<'a, i64, 2> {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid array in this slot\n        use ::flatbuffers::Follow;\n        unsafe { ::flatbuffers::Array::follow(&self.0, 16) }\n    }\n\n    pub fn set_d(&mut self, items: &[i64; 2]) {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid array in this slot\n        unsafe { ::flatbuffers::emplace_scalar_array(&mut self.0, 16, items) };\n    }\n\n    pub fn unpack(&self) -> NestedStructT {\n        NestedStructT {\n            a: self.a().into(),\n            b: self.b(),\n            c: self.c().into(),\n            d: self.d().into(),\n        }\n    }\n}\n\n#[derive(Debug, Clone, PartialEq)]\npub struct NestedStructT {\n    pub a: [i32; 2],\n    pub b: TestEnum,\n    pub c: [TestEnum; 2],\n    pub d: [i64; 2],\n}\nimpl Default for NestedStructT {\n    fn default() -> Self {\n        Self {\n            a: [0; 2],\n            b: TestEnum::A,\n            c: ::flatbuffers::array_init(|_| Default::default()),\n            d: [0; 2],\n        }\n    }\n}\n\nimpl NestedStructT {\n    pub fn pack(&self) -> NestedStruct {\n        NestedStruct::new(\n            &self.a,\n            self.b,\n            &self.c,\n            &self.d,\n        )\n    }\n}\n"
  },
  {
    "path": "tests/arrays_test/my_game/example/test_enum_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MIN_TEST_ENUM: i8 = 0;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MAX_TEST_ENUM: i8 = 2;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n#[allow(non_camel_case_types)]\npub const ENUM_VALUES_TEST_ENUM: [TestEnum; 3] = [\n    TestEnum::A,\n    TestEnum::B,\n    TestEnum::C,\n];\n\n#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n#[repr(transparent)]\npub struct TestEnum(pub i8);\n\n#[allow(non_upper_case_globals)]\nimpl TestEnum {\n    pub const A: Self = Self(0);\n    pub const B: Self = Self(1);\n    pub const C: Self = Self(2);\n\n    pub const ENUM_MIN: i8 = 0;\n    pub const ENUM_MAX: i8 = 2;\n    pub const ENUM_VALUES: &'static [Self] = &[\n        Self::A,\n        Self::B,\n        Self::C,\n    ];\n\n    /// Returns the variant's name or \"\" if unknown.\n    pub fn variant_name(self) -> Option<&'static str> {\n        match self {\n            Self::A => Some(\"A\"),\n            Self::B => Some(\"B\"),\n            Self::C => Some(\"C\"),\n            _ => None,\n        }\n    }\n}\n\nimpl ::core::fmt::Debug for TestEnum {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        if let Some(name) = self.variant_name() {\n            f.write_str(name)\n        } else {\n            f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n        }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for TestEnum {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<i8>(buf, loc) };\n        Self(b)\n    }\n}\n\nimpl ::flatbuffers::Push for TestEnum {\n    type Output = TestEnum;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<i8>(dst, self.0) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for TestEnum {\n    type Scalar = i8;\n\n    #[inline]\n    fn to_little_endian(self) -> i8 {\n        self.0.to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: i8) -> Self {\n        let b = i8::from_le(v);\n        Self(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for TestEnum {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        i8::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for TestEnum {}\n"
  },
  {
    "path": "tests/arrays_test.fbs",
    "content": "namespace MyGame.Example;\n\nenum TestEnum : byte { A, B, C }\n\nstruct NestedStruct{\n  a:[int:2];\n  b:TestEnum;\n  c:[TestEnum:2];\n  d:[int64:2];\n}\n\nstruct ArrayStruct{\n  a:float;\n  b:[int:0xF];\n  c:byte;\n  d:[NestedStruct:2];\n  e:int32;\n  f:[int64:2];\n}\n\nstruct LargeArrayStruct {\n  d:[ubyte:64];\n  e:[float:64];\n  f:[bool:64];\n  g:[NestedStruct:64];\n  h:[TestEnum:64];\n}\n\ntable ArrayTable{\n  a:ArrayStruct;\n}\n\nroot_type ArrayTable;\nfile_identifier \"ARRT\";\nfile_extension \"mon\";\n"
  },
  {
    "path": "tests/arrays_test.golden",
    "content": "{\n  a : {\n    a: 12.34,\n    b: [1,2,3,4,5,6,7,8,9,0xA,0xB,0xC,0xD,0xE,0xF],\n    c: -127,\n    d: [\n      {\n        a : [-1,2],\n        b : A,\n        c : [C, B],\n        d : [0x1122334455667788, -0x1122334455667788]\n      },\n      {\n        a : [3,-4],\n        b : B,\n        c : [B, A],\n        d : [-0x1122334455667788, 0x1122334455667788]\n      }\n    ],\n    e: 1,\n    f: [-0x8000000000000000, 0x7FFFFFFFFFFFFFFF]\n  }\n}"
  },
  {
    "path": "tests/arrays_test.schema.json",
    "content": "{\n  \"$schema\": \"https://json-schema.org/draft/2019-09/schema\",\n  \"definitions\": {\n    \"MyGame_Example_TestEnum\" : {\n      \"type\" : \"string\",\n      \"enum\": [\"A\", \"B\", \"C\"]\n    },\n    \"MyGame_Example_NestedStruct\" : {\n      \"type\" : \"object\",\n      \"properties\" : {\n        \"a\" : {\n                \"type\" : \"array\", \"items\" : {\"type\" : \"integer\", \"minimum\" : -2147483648, \"maximum\" : 2147483647},\n                \"minItems\": 2,\n                \"maxItems\": 2\n              },\n        \"b\" : {\n                \"$ref\" : \"#/definitions/MyGame_Example_TestEnum\"\n              },\n        \"c\" : {\n                \"type\" : \"array\", \"items\" : {\"$ref\" : \"#/definitions/MyGame_Example_TestEnum\"},\n                \"minItems\": 2,\n                \"maxItems\": 2\n              },\n        \"d\" : {\n                \"type\" : \"array\", \"items\" : {\"type\" : \"integer\", \"minimum\" : -9223372036854775808, \"maximum\" : 9223372036854775807},\n                \"minItems\": 2,\n                \"maxItems\": 2\n              }\n      },\n      \"additionalProperties\" : false\n    },\n    \"MyGame_Example_ArrayStruct\" : {\n      \"type\" : \"object\",\n      \"properties\" : {\n        \"a\" : {\n                \"type\" : \"number\"\n              },\n        \"b\" : {\n                \"type\" : \"array\", \"items\" : {\"type\" : \"integer\", \"minimum\" : -2147483648, \"maximum\" : 2147483647},\n                \"minItems\": 15,\n                \"maxItems\": 15\n              },\n        \"c\" : {\n                \"type\" : \"integer\", \"minimum\" : -128, \"maximum\" : 127\n              },\n        \"d\" : {\n                \"type\" : \"array\", \"items\" : {\"$ref\" : \"#/definitions/MyGame_Example_NestedStruct\"},\n                \"minItems\": 2,\n                \"maxItems\": 2\n              },\n        \"e\" : {\n                \"type\" : \"integer\", \"minimum\" : -2147483648, \"maximum\" : 2147483647\n              },\n        \"f\" : {\n                \"type\" : \"array\", \"items\" : {\"type\" : \"integer\", \"minimum\" : -9223372036854775808, \"maximum\" : 9223372036854775807},\n                \"minItems\": 2,\n                \"maxItems\": 2\n              }\n      },\n      \"additionalProperties\" : false\n    },\n    \"MyGame_Example_LargeArrayStruct\" : {\n      \"type\" : \"object\",\n      \"properties\" : {\n        \"d\" : {\n                \"type\" : \"array\", \"items\" : {\"type\" : \"integer\", \"minimum\" : 0, \"maximum\" :255},\n                \"minItems\": 64,\n                \"maxItems\": 64\n              },\n        \"e\" : {\n                \"type\" : \"array\", \"items\" : {\"type\" : \"number\"},\n                \"minItems\": 64,\n                \"maxItems\": 64\n              },\n        \"f\" : {\n                \"type\" : \"array\", \"items\" : {\"type\" : \"boolean\"},\n                \"minItems\": 64,\n                \"maxItems\": 64\n              },\n        \"g\" : {\n                \"type\" : \"array\", \"items\" : {\"$ref\" : \"#/definitions/MyGame_Example_NestedStruct\"},\n                \"minItems\": 64,\n                \"maxItems\": 64\n              },\n        \"h\" : {\n                \"type\" : \"array\", \"items\" : {\"$ref\" : \"#/definitions/MyGame_Example_TestEnum\"},\n                \"minItems\": 64,\n                \"maxItems\": 64\n              }\n      },\n      \"additionalProperties\" : false\n    },\n    \"MyGame_Example_ArrayTable\" : {\n      \"type\" : \"object\",\n      \"properties\" : {\n        \"a\" : {\n                \"$ref\" : \"#/definitions/MyGame_Example_ArrayStruct\"\n              }\n      },\n      \"additionalProperties\" : false\n    }\n  },\n  \"$ref\" : \"#/definitions/MyGame_Example_ArrayTable\"\n}\n"
  },
  {
    "path": "tests/bazel_repository_test_dir/.bazelrc",
    "content": "build --symlink_prefix=/\n"
  },
  {
    "path": "tests/bazel_repository_test_dir/.gitignore",
    "content": "bazel-*\n"
  },
  {
    "path": "tests/bazel_repository_test_dir/BUILD",
    "content": "load(\"@rules_cc//cc:defs.bzl\", \"cc_test\")\n\n# This test doesn't actually make use of the flatbuffers library. It's just\n# here to make sure we can link the library properly when it comes from an\n# external repository.  You're welcome to expand this test to do more.\ncc_test(\n    name = \"pulls_in_flatbuffers_test\",\n    srcs = [\"pulls_in_flatbuffers_test.cpp\"],\n    deps = [\n        \"@com_github_google_flatbuffers//:flatbuffers\",\n    ],\n)\n"
  },
  {
    "path": "tests/bazel_repository_test_dir/MODULE.bazel",
    "content": "module(name = \"bazel_repository_test\")\n\nbazel_dep(name = \"flatbuffers\", repo_name = \"com_github_google_flatbuffers\")\nlocal_path_override(\n    module_name = \"flatbuffers\",\n    path = \"../../\",\n)\n\nbazel_dep(\n    name = \"rules_cc\",\n    version = \"0.0.16\",\n)\n"
  },
  {
    "path": "tests/bazel_repository_test_dir/README.md",
    "content": "This directory is not intended to be used independently of the flatbuffers\nrepository. Instead, this whole directory serves as a unit test for the\nC++ integration in the flatbuffers repo.\n"
  },
  {
    "path": "tests/bazel_repository_test_dir/pulls_in_flatbuffers_test.cpp",
    "content": "int main() { return 0; }\n"
  },
  {
    "path": "tests/cpp17/stringify_util.h",
    "content": "/*\n * Copyright 2020 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// This contains some utilities/examples for how to leverage the static reflec-\n// tion features of tables and structs in the C++17 code generation to recur-\n// sively produce a string representation of any Flatbuffer table or struct use\n// compile-time iteration over the fields. Note that this code is completely\n// generic in that it makes no reference to any particular Flatbuffer type.\n\n#include <optional>\n#include <string>\n#include <type_traits>\n#include <utility>\n#include <vector>\n\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/util.h\"\n\nnamespace cpp17 {\n\n// User calls this; need to forward declare it since it is called recursively.\ntemplate <typename T>\nstd::optional<std::string> StringifyFlatbufferValue(\n    T&& val, const std::string& indent = \"\");\n\nnamespace detail {\n\n/*******************************************************************************\n** Metaprogramming helpers for detecting Flatbuffers Tables, Structs, & Vectors.\n*******************************************************************************/\ntemplate <typename FBS, typename = void>\nstruct is_flatbuffers_table_or_struct : std::false_type {};\n\n// We know it's a table or struct when it has a Traits subclass.\ntemplate <typename FBS>\nstruct is_flatbuffers_table_or_struct<FBS, std::void_t<typename FBS::Traits>>\n    : std::true_type {};\n\ntemplate <typename FBS>\ninline constexpr bool is_flatbuffers_table_or_struct_v =\n    is_flatbuffers_table_or_struct<FBS>::value;\n\ntemplate <typename T>\nstruct is_flatbuffers_vector : std::false_type {};\n\ntemplate <typename T>\nstruct is_flatbuffers_vector<flatbuffers::Vector<T>> : std::true_type {};\n\ntemplate <typename T>\ninline constexpr bool is_flatbuffers_vector_v = is_flatbuffers_vector<T>::value;\n\n/*******************************************************************************\n** Compile-time Iteration & Recursive Stringification over Flatbuffers types.\n*******************************************************************************/\ntemplate <size_t Index, typename FBS>\nstd::string AddStringifiedField(const FBS& fbs, const std::string& indent) {\n  auto value_string =\n      StringifyFlatbufferValue(fbs.template get_field<Index>(), indent);\n  if (!value_string) {\n    return \"\";\n  }\n  return indent + FBS::Traits::field_names[Index] + \" = \" + *value_string +\n         \"\\n\";\n}\n\ntemplate <typename FBS, size_t... Indexes>\nstd::string StringifyTableOrStructImpl(const FBS& fbs,\n                                       const std::string& indent,\n                                       std::index_sequence<Indexes...>) {\n  // This line is where the compile-time iteration happens!\n  return (AddStringifiedField<Indexes>(fbs, indent) + ...);\n}\n\ntemplate <typename FBS>\nstd::string StringifyTableOrStruct(const FBS& fbs, const std::string& indent) {\n  (void)fbs;\n  (void)indent;\n  static constexpr size_t field_count = FBS::Traits::fields_number;\n  std::string out;\n  if constexpr (field_count > 0) {\n    out = std::string(FBS::Traits::fully_qualified_name) + \"{\\n\" +\n          StringifyTableOrStructImpl(fbs, indent + \"  \",\n                                     std::make_index_sequence<field_count>{}) +\n          indent + '}';\n  }\n  return out;\n}\n\ntemplate <typename T>\nstd::string StringifyVector(const flatbuffers::Vector<T>& vec,\n                            const std::string& indent) {\n  const auto prologue = indent + std::string(\"  \");\n  const auto epilogue = std::string(\",\\n\");\n  std::string text;\n  text += \"[\\n\";\n  for (auto it = vec.cbegin(), end = vec.cend(); it != end; ++it) {\n    text += prologue;\n    text += StringifyFlatbufferValue(*it).value_or(\"(field absent)\");\n    text += epilogue;\n  }\n  if (vec.cbegin() != vec.cend()) {\n    text.resize(text.size() - epilogue.size());\n  }\n  text += '\\n' + indent + ']';\n  return text;\n}\n\ntemplate <typename T>\nstd::string StringifyArithmeticType(T val) {\n  return flatbuffers::NumToString(val);\n}\n\n}  // namespace detail\n\n/*******************************************************************************\n** Take any flatbuffer type (table, struct, Vector, int...) and stringify it.\n*******************************************************************************/\ntemplate <typename T>\nstd::optional<std::string> StringifyFlatbufferValue(T&& val,\n                                                    const std::string& indent) {\n  (void)indent;\n  constexpr bool is_pointer = std::is_pointer_v<std::remove_reference_t<T>>;\n  if constexpr (is_pointer) {\n    if (val == nullptr) return std::nullopt;  // Field is absent.\n  }\n  using decayed =\n      std::decay_t<std::remove_pointer_t<std::remove_reference_t<T>>>;\n\n  // Is it a Flatbuffers Table or Struct?\n  if constexpr (detail::is_flatbuffers_table_or_struct_v<decayed>) {\n    // We have a nested table or struct; use recursion!\n    if constexpr (is_pointer)\n      return detail::StringifyTableOrStruct(*val, indent);\n    else\n      return detail::StringifyTableOrStruct(val, indent);\n  }\n\n  // Is it an 8-bit number?  If so, print it like an int (not char).\n  else if constexpr (std::is_same_v<decayed, int8_t> ||\n                     std::is_same_v<decayed, uint8_t>) {\n    return detail::StringifyArithmeticType(static_cast<int>(val));\n  }\n\n  // Is it an enum? If so, print it like an int, since Flatbuffers doesn't yet\n  // have type-based reflection for enums, so we can't print the enum's name :(\n  else if constexpr (std::is_enum_v<decayed>) {\n    return StringifyFlatbufferValue(\n        static_cast<std::underlying_type_t<decayed>>(val), indent);\n  }\n\n  // Is it an int, double, float, uint32_t, etc.?\n  else if constexpr (std::is_arithmetic_v<decayed>) {\n    return detail::StringifyArithmeticType(val);\n  }\n\n  // Is it a Flatbuffers string?\n  else if constexpr (std::is_same_v<decayed, flatbuffers::String>) {\n    return '\"' + val->str() + '\"';\n  }\n\n  // Is it a Flatbuffers Vector?\n  else if constexpr (detail::is_flatbuffers_vector_v<decayed>) {\n    return detail::StringifyVector(*val, indent);\n  }\n\n  // Is it a void pointer?\n  else if constexpr (std::is_same_v<decayed, void>) {\n    // Can't format it.\n    return std::nullopt;\n  }\n\n  else {\n    // Not sure how to format this type, whatever it is.\n    static_assert(sizeof(T) != sizeof(T),\n                  \"Do not know how to format this type T (the compiler error \"\n                  \"should tell you nearby what T is).\");\n  }\n}\n\n}  // namespace cpp17\n"
  },
  {
    "path": "tests/cpp17/test_cpp17.cpp",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// This is a sandbox for modeling C++17 code generator.\n// C++17 code generator: \"flatc --cpp-std c++17\".\n// Warning:\n// This is an experimental feature and could change at any time.\n\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/flex_flat_util.h\"\n#include \"flatbuffers/flexbuffers.h\"\n#include \"flatbuffers/idl.h\"\n#include \"flatbuffers/minireflect.h\"\n#include \"flatbuffers/registry.h\"\n#include \"flatbuffers/util.h\"\n#include \"stringify_util.h\"\n#include \"test_assert.h\"\n\n// Embed generated code into an isolated namespace.\nnamespace cpp17 {\n#include \"generated_cpp17/monster_test_generated.h\"\n#include \"generated_cpp17/optional_scalars_generated.h\"\n#include \"generated_cpp17/union_vector_generated.h\"\n}  // namespace cpp17\n\nnamespace cpp11 {\n#include \"../monster_test_generated.h\"\n#include \"../optional_scalars_generated.h\"\n}  // namespace cpp11\n\nusing ::cpp17::MyGame::Example::Monster;\nusing ::cpp17::MyGame::Example::Vec3;\n\n/*******************************************************************************\n** Build some FB objects.\n*******************************************************************************/\nnamespace {\nconst Monster* BuildMonster(flatbuffers::FlatBufferBuilder& fbb) {\n  using ::cpp17::MyGame::Example::Color;\n  using ::cpp17::MyGame::Example::MonsterBuilder;\n  using ::cpp17::MyGame::Example::Test;\n  auto name = fbb.CreateString(\"my_monster\");\n  auto inventory = fbb.CreateVector(std::vector<uint8_t>{4, 5, 6, 7});\n  MonsterBuilder builder(fbb);\n  auto vec3 = Vec3{/*x=*/1.1f,\n                   /*y=*/2.2f,\n                   /*z=*/3.3f,\n                   /*test1=*/6.6,\n                   /*test2=*/Color::Green,\n                   /*test3=*/\n                   Test(\n                       /*a=*/11,\n                       /*b=*/90)};\n  builder.add_pos(&vec3);\n  builder.add_name(name);\n  builder.add_mana(1);\n  builder.add_hp(2);\n  builder.add_testbool(true);\n  builder.add_testhashs32_fnv1(4);\n  builder.add_testhashu32_fnv1(5);\n  builder.add_testhashs64_fnv1(6);\n  builder.add_testhashu64_fnv1(7);\n  builder.add_testhashs32_fnv1a(8);\n  builder.add_testhashu32_fnv1a(9);\n  builder.add_testhashs64_fnv1a(10);\n  builder.add_testhashu64_fnv1a(11);\n  builder.add_testf(12.1f);\n  builder.add_testf2(13.1f);\n  builder.add_testf3(14.1f);\n  builder.add_single_weak_reference(15);\n  builder.add_co_owning_reference(16);\n  builder.add_non_owning_reference(17);\n  builder.add_inventory(inventory);\n  fbb.Finish(builder.Finish());\n  const Monster* monster =\n      flatbuffers::GetRoot<Monster>(fbb.GetBufferPointer());\n  return monster;\n}\n\n/*******************************************************************************\n** Test Case: Static Field Reflection Traits for Table & Structs.\n*******************************************************************************/\n// This test tests & demonstrates the power of the static reflection. Using it,\n// we can given any Flatbuffer type to a generic function and it will be able to\n// produce is full recursive string representation of it.\n//\n// This test covers all types: primitive types, structs, tables, Vectors, etc.\n//\nvoid StringifyAnyFlatbuffersTypeTest() {\n  flatbuffers::FlatBufferBuilder fbb;\n  // We are using a Monster here, but we could have used any type, because the\n  // code that follows is totally generic!\n  const auto* monster = BuildMonster(fbb);\n\n  std::string expected = R\"(MyGame.Example.Monster{\n        pos = MyGame.Example.Vec3{\n          x = 1.1\n          y = 2.2\n          z = 3.3\n          test1 = 6.6\n          test2 = 2\n          test3 = MyGame.Example.Test{\n            a = 11\n            b = 90\n          }\n        }\n        mana = 1\n        hp = 2\n        name = \"my_monster\"\n        inventory = [\n          4,\n          5,\n          6,\n          7\n        ]\n        color = 8\n        test_type = 0\n        testbool = 1\n        testhashs32_fnv1 = 4\n        testhashu32_fnv1 = 5\n        testhashs64_fnv1 = 6\n        testhashu64_fnv1 = 7\n        testhashs32_fnv1a = 8\n        testhashu32_fnv1a = 9\n        testhashs64_fnv1a = 10\n        testhashu64_fnv1a = 11\n        testf = 12.1\n        testf2 = 13.1\n        testf3 = 14.1\n        single_weak_reference = 15\n        co_owning_reference = 16\n        non_owning_reference = 17\n        any_unique_type = 0\n        any_ambiguous_type = 0\n        signed_enum = -1\n        long_enum_non_enum_default = 0\n        long_enum_normal_default = 2\n        nan_default = nan\n        inf_default = inf\n        positive_inf_default = inf\n        infinity_default = inf\n        positive_infinity_default = inf\n        negative_inf_default = -inf\n        negative_infinity_default = -inf\n        double_inf_default = inf\n      })\";\n\n  // Call a generic function that has no specific knowledge of the flatbuffer we\n  // are passing in; it should use only static reflection to produce a string\n  // representations of the field names and values recursively. We give it an\n  // initial indentation so that the result can be compared with our raw string\n  // above, which we wanted to indent so that it will look nicer in this code.\n  //\n  // A note about JSON: as can be seen from the string above, this produces a\n  // JSON-like notation, but we are not using any of Flatbuffers' JSON infra to\n  // produce this! It is produced entirely using compile-time reflection, and\n  // thus does not require any runtime access to the *.fbs definition files!\n  std::optional<std::string> result =\n      cpp17::StringifyFlatbufferValue(*monster, /*indent=*/\"      \");\n\n  TEST_ASSERT(result.has_value());\n  TEST_EQ_STR(expected.c_str(), result->c_str());\n}\n\n/*******************************************************************************\n** Test Traits::FieldType\n*******************************************************************************/\nusing pos_type = Monster::Traits::FieldType<0>;\nstatic_assert(std::is_same_v<pos_type, const Vec3*>);\n\nusing mana_type = Monster::Traits::FieldType<1>;\nstatic_assert(std::is_same_v<mana_type, int16_t>);\n\nusing name_type = Monster::Traits::FieldType<3>;\nstatic_assert(std::is_same_v<name_type, const flatbuffers::String*>);\n\n/*******************************************************************************\n** Generic Create Function Test.\n*******************************************************************************/\nvoid CreateTableByTypeTest() {\n  flatbuffers::FlatBufferBuilder builder;\n\n  // We will create an object of this type using only the type.\n  using type_to_create_t = cpp17::MyGame::Example::Stat;\n\n  [&builder] {\n    auto id_str = builder.CreateString(\"my_id\");\n    auto table = type_to_create_t::Traits::Create(builder, id_str, 42, 7);\n    // Be sure that the correct return type was inferred.\n    static_assert(\n        std::is_same_v<decltype(table), flatbuffers::Offset<type_to_create_t>>);\n    builder.Finish(table);\n  }();\n\n  // Access it.\n  auto stat =\n      flatbuffers::GetRoot<type_to_create_t>(builder.GetBufferPointer());\n  TEST_EQ_STR(stat->id()->c_str(), \"my_id\");\n  TEST_EQ(stat->val(), 42);\n  TEST_EQ(stat->count(), 7);\n}\n\nvoid OptionalScalarsTest() {\n  static_assert(\n      std::is_same<flatbuffers::Optional<float>, std::optional<float>>::value);\n  static_assert(std::is_same<flatbuffers::nullopt_t, std::nullopt_t>::value);\n\n  // test C++ nullable\n  flatbuffers::FlatBufferBuilder fbb;\n  FinishScalarStuffBuffer(fbb, cpp17::optional_scalars::CreateScalarStuff(\n                                   fbb, 1, static_cast<int8_t>(2)));\n  auto opts =\n      cpp17::optional_scalars::GetMutableScalarStuff(fbb.GetBufferPointer());\n  TEST_ASSERT(!opts->maybe_bool());\n  TEST_ASSERT(!opts->maybe_f32().has_value());\n  TEST_ASSERT(opts->maybe_i8().has_value());\n  TEST_EQ(opts->maybe_i8().value(), 2);\n  TEST_ASSERT(opts->mutate_maybe_i8(3));\n  TEST_ASSERT(opts->maybe_i8().has_value());\n  TEST_EQ(opts->maybe_i8().value(), 3);\n  TEST_ASSERT(!opts->mutate_maybe_i16(-10));\n\n  cpp17::optional_scalars::ScalarStuffT obj;\n  opts->UnPackTo(&obj);\n  TEST_ASSERT(!obj.maybe_bool);\n  TEST_ASSERT(!obj.maybe_f32.has_value());\n  TEST_ASSERT(obj.maybe_i8.has_value() && obj.maybe_i8.value() == 3);\n  TEST_ASSERT(obj.maybe_i8 && *obj.maybe_i8 == 3);\n  obj.maybe_i32 = -1;\n\n  fbb.Clear();\n  FinishScalarStuffBuffer(\n      fbb, cpp17::optional_scalars::ScalarStuff::Pack(fbb, &obj));\n  opts = cpp17::optional_scalars::GetMutableScalarStuff(fbb.GetBufferPointer());\n  TEST_ASSERT(opts->maybe_i8().has_value());\n  TEST_EQ(opts->maybe_i8().value(), 3);\n  TEST_ASSERT(opts->maybe_i32().has_value());\n  TEST_EQ(opts->maybe_i32().value(), -1);\n\n  TEST_EQ(std::optional<int32_t>(opts->maybe_i32()).value(), -1);\n  TEST_EQ(std::optional<int64_t>(opts->maybe_i32()).value(), -1);\n  TEST_ASSERT(opts->maybe_i32() == std::optional<int64_t>(-1));\n}\n\nint FlatBufferCpp17Tests() {\n  CreateTableByTypeTest();\n  OptionalScalarsTest();\n  StringifyAnyFlatbuffersTypeTest();\n  return 0;\n}\n}  // namespace\n\nint main(int /*argc*/, const char* /*argv*/[]) {\n  InitTestEngine();\n\n  FlatBufferCpp17Tests();\n\n  if (!testing_fails) {\n    TEST_OUTPUT_LINE(\"C++17: ALL TESTS PASSED\");\n  } else {\n    TEST_OUTPUT_LINE(\"C++17: %d FAILED TESTS\", testing_fails);\n  }\n  return CloseTestEngine();\n}\n"
  },
  {
    "path": "tests/cross_namespace_pack_test.fbs",
    "content": "// Test for cross-namespace Pack() code generation (issue #8948).\n// Verifies that Create* calls in Pack() are properly namespace-qualified\n// when referencing tables from different namespaces.\n\nnamespace native;\n\ntable TableWithNative {\n  value: int;\n}\n\nnamespace foo;\n\ntable Consumer {\n  c1: native.TableWithNative;\n  c2: [native.TableWithNative];\n}\n\nroot_type Consumer;\n"
  },
  {
    "path": "tests/default_vectors_strings_test.cpp",
    "content": "#include \"tests/default_vectors_strings_test.h\"\n\n#include <cstdint>\n#include <vector>\n\n#include \"include/flatbuffers/buffer.h\"\n#include \"include/flatbuffers/flatbuffer_builder.h\"\n#include \"include/flatbuffers/string.h\"\n#include \"include/flatbuffers/vector.h\"\n#include \"include/flatbuffers/verifier.h\"\n#include \"tests/default_vectors_strings_test.fbs.h\"\n#include \"tests/test_assert.h\"\n\nnamespace flatbuffers {\nnamespace tests {\n\nusing flatbuffers::FlatBufferBuilder64;\nusing flatbuffers::Offset;\nusing flatbuffers::String;\nusing flatbuffers::Verifier;\n\nvoid DefaultVectorsStringsTest_EmptyOnDefault_Const() {\n  FlatBufferBuilder64 builder;\n\n  // Create table without providing the fields with defaults.\n  DefaultVectorsStringsTest::TableWithDefaultVectorsBuilder tbl_builder(\n      builder);\n  tbl_builder.add_regular_int(100);\n  auto offset = tbl_builder.Finish();\n  builder.Finish(offset);\n\n  Verifier verifier(builder.GetBufferPointer(), builder.GetSize());\n  TEST_ASSERT(\n      DefaultVectorsStringsTest::VerifyTableWithDefaultVectorsBuffer(verifier));\n\n  const auto* table = DefaultVectorsStringsTest::GetTableWithDefaultVectors(\n      builder.GetBufferPointer());\n  TEST_NOTNULL(table);\n\n  // Verify default scalar vectors.\n  TEST_NOTNULL(table->int_vec());\n  TEST_EQ(table->int_vec()->size(), 0);\n  TEST_NOTNULL(table->bool_vec());\n  TEST_EQ(table->bool_vec()->size(), 0);\n  TEST_NOTNULL(table->char_vec());\n  TEST_EQ(table->char_vec()->size(), 0);\n  TEST_NOTNULL(table->uchar_vec());\n  TEST_EQ(table->uchar_vec()->size(), 0);\n  TEST_NOTNULL(table->short_vec());\n  TEST_EQ(table->short_vec()->size(), 0);\n  TEST_NOTNULL(table->ushort_vec());\n  TEST_EQ(table->ushort_vec()->size(), 0);\n  TEST_NOTNULL(table->uint_vec());\n  TEST_EQ(table->uint_vec()->size(), 0);\n  TEST_NOTNULL(table->long_vec());\n  TEST_EQ(table->long_vec()->size(), 0);\n  TEST_NOTNULL(table->ulong_vec());\n  TEST_EQ(table->ulong_vec()->size(), 0);\n  TEST_NOTNULL(table->float_vec());\n  TEST_EQ(table->float_vec()->size(), 0);\n  TEST_NOTNULL(table->double_vec());\n  TEST_EQ(table->double_vec()->size(), 0);\n\n  // Verify default string_vec.\n  TEST_NOTNULL(table->string_vec());\n  TEST_EQ(table->string_vec()->size(), 0);\n\n  // Verify default string fields.\n  TEST_NOTNULL(table->empty_string());\n  TEST_EQ_STR(table->empty_string()->c_str(), \"\");\n  TEST_NOTNULL(table->some_string());\n  TEST_EQ_STR(table->some_string()->c_str(), \"some\");\n\n  // Verify default struct_vec.\n  TEST_NOTNULL(table->struct_vec());\n  TEST_EQ(table->struct_vec()->size(), 0);\n\n  // Verify default table_vec.\n  TEST_NOTNULL(table->table_vec());\n  TEST_EQ(table->table_vec()->size(), 0);\n\n  // Verify default enum_vec.\n  TEST_NOTNULL(table->enum_vec());\n  TEST_EQ(table->enum_vec()->size(), 0);\n\n  // Verify non-default vector field.\n  TEST_NULL(table->regular_int_vec());\n\n  // Verify pointer and offset64 combinations.\n  TEST_NOTNULL(table->int_vec64());\n  TEST_EQ(table->int_vec64()->size(), 0);\n  TEST_NOTNULL(table->int_vec_offset64());\n  TEST_EQ(table->int_vec_offset64()->size(), 0);\n\n  // Verify non-default field.\n  TEST_EQ(table->regular_int(), 100);\n}\n\nvoid DefaultVectorsStringsTest_EmptyOnDefault_Mutable() {\n  FlatBufferBuilder64 builder;\n\n  // Create table without providing the fields with defaults.\n  DefaultVectorsStringsTest::TableWithDefaultVectorsBuilder tbl_builder(\n      builder);\n  tbl_builder.add_regular_int(100);\n  auto offset = tbl_builder.Finish();\n  builder.Finish(offset);\n\n  Verifier verifier(builder.GetBufferPointer(), builder.GetSize());\n  TEST_ASSERT(\n      DefaultVectorsStringsTest::VerifyTableWithDefaultVectorsBuffer(verifier));\n\n  auto* mutable_table =\n      DefaultVectorsStringsTest::GetMutableTableWithDefaultVectors(\n          builder.GetBufferPointer());\n  TEST_NOTNULL(mutable_table);\n\n  // Verify default scalar vectors.\n  TEST_NOTNULL(mutable_table->mutable_int_vec());\n  TEST_EQ(mutable_table->mutable_int_vec()->size(), 0);\n  TEST_NOTNULL(mutable_table->mutable_bool_vec());\n  TEST_EQ(mutable_table->mutable_bool_vec()->size(), 0);\n  TEST_NOTNULL(mutable_table->mutable_char_vec());\n  TEST_EQ(mutable_table->mutable_char_vec()->size(), 0);\n  TEST_NOTNULL(mutable_table->mutable_uchar_vec());\n  TEST_EQ(mutable_table->mutable_uchar_vec()->size(), 0);\n  TEST_NOTNULL(mutable_table->mutable_short_vec());\n  TEST_EQ(mutable_table->mutable_short_vec()->size(), 0);\n  TEST_NOTNULL(mutable_table->mutable_ushort_vec());\n  TEST_EQ(mutable_table->mutable_ushort_vec()->size(), 0);\n  TEST_NOTNULL(mutable_table->mutable_uint_vec());\n  TEST_EQ(mutable_table->mutable_uint_vec()->size(), 0);\n  TEST_NOTNULL(mutable_table->mutable_long_vec());\n  TEST_EQ(mutable_table->mutable_long_vec()->size(), 0);\n  TEST_NOTNULL(mutable_table->mutable_ulong_vec());\n  TEST_EQ(mutable_table->mutable_ulong_vec()->size(), 0);\n  TEST_NOTNULL(mutable_table->mutable_float_vec());\n  TEST_EQ(mutable_table->mutable_float_vec()->size(), 0);\n  TEST_NOTNULL(mutable_table->mutable_double_vec());\n  TEST_EQ(mutable_table->mutable_double_vec()->size(), 0);\n\n  // Verify default struct_vec.\n  TEST_NOTNULL(mutable_table->mutable_struct_vec());\n  TEST_EQ(mutable_table->mutable_struct_vec()->size(), 0);\n\n  // Verify default table_vec.\n  TEST_NOTNULL(mutable_table->mutable_table_vec());\n  TEST_EQ(mutable_table->mutable_table_vec()->size(), 0);\n\n  // Verify default enum_vec.\n  TEST_NOTNULL(mutable_table->mutable_enum_vec());\n  TEST_EQ(mutable_table->mutable_enum_vec()->size(), 0);\n\n  // Verify non-default vector field.\n  TEST_NULL(mutable_table->mutable_regular_int_vec());\n\n  // Verify pointer and offset64 combinations.\n  TEST_NOTNULL(mutable_table->mutable_int_vec64());\n  TEST_EQ(mutable_table->mutable_int_vec64()->size(), 0);\n  TEST_NOTNULL(mutable_table->mutable_int_vec_offset64());\n  TEST_EQ(mutable_table->mutable_int_vec_offset64()->size(), 0);\n}\n\nvoid DefaultVectorsStringsTest_WithValues() {\n  // Create a table with values for the defaulted vector fields.\n  FlatBufferBuilder64 builder;\n  auto int_vec64 = builder.CreateVector64(std::vector<int>({30, 40}));\n  auto int_vec_offset64 =\n      builder.CreateVector64<flatbuffers::Vector>(std::vector<int>({50, 60}));\n  auto int_vec = builder.CreateVector(std::vector<int>({1, 2}));\n  auto bool_vec = builder.CreateVector(std::vector<uint8_t>({true, false}));\n  auto string_vec = builder.CreateVector(std::vector<Offset<String>>(\n      {builder.CreateString(\"a\"), builder.CreateString(\"b\")}));\n  auto empty_string = builder.CreateString(\"not empty\");\n  auto some_string = builder.CreateString(\"not some\");\n  DefaultVectorsStringsTest::MyStruct structs[] = {\n      DefaultVectorsStringsTest::MyStruct(1, 2),\n      DefaultVectorsStringsTest::MyStruct(3, 4)};\n  auto struct_vec = builder.CreateVectorOfStructs(structs, 2);\n  auto regular_int_vec = builder.CreateVector(std::vector<int>({10, 20}));\n\n  DefaultVectorsStringsTest::TableWithDefaultVectorsBuilder tbl_builder(\n      builder);\n  tbl_builder.add_int_vec(int_vec);\n  tbl_builder.add_int_vec64(int_vec64);\n  tbl_builder.add_int_vec_offset64(int_vec_offset64);\n\n  tbl_builder.add_bool_vec(bool_vec);\n  tbl_builder.add_string_vec(string_vec);\n  tbl_builder.add_empty_string(empty_string);\n  tbl_builder.add_some_string(some_string);\n  tbl_builder.add_struct_vec(struct_vec);\n  tbl_builder.add_regular_int_vec(regular_int_vec);\n  auto offset = tbl_builder.Finish();\n  builder.Finish(offset);\n\n  Verifier verifier(builder.GetBufferPointer(), builder.GetSize());\n  TEST_ASSERT(\n      DefaultVectorsStringsTest::VerifyTableWithDefaultVectorsBuffer(verifier));\n\n  const auto* table = DefaultVectorsStringsTest::GetTableWithDefaultVectors(\n      builder.GetBufferPointer());\n\n  TEST_EQ(table->int_vec()->size(), 2);\n  TEST_EQ(table->int_vec()->Get(1), 2);\n  TEST_EQ(table->bool_vec()->size(), 2);\n  TEST_EQ(table->bool_vec()->Get(0), true);\n  TEST_EQ(table->string_vec()->size(), 2);\n  TEST_EQ_STR(table->string_vec()->Get(1)->c_str(), \"b\");\n  TEST_EQ_STR(table->empty_string()->c_str(), \"not empty\");\n  TEST_EQ_STR(table->some_string()->c_str(), \"not some\");\n  TEST_EQ(table->struct_vec()->size(), 2);\n  TEST_EQ(table->struct_vec()->Get(1)->b(), 4);\n  TEST_EQ(table->regular_int_vec()->size(), 2);\n  TEST_EQ(table->regular_int_vec()->Get(1), 20);\n\n  TEST_EQ(table->int_vec64()->size(), 2);\n  TEST_EQ(table->int_vec64()->Get(1), 40);\n  TEST_EQ(table->int_vec_offset64()->size(), 2);\n  TEST_EQ(table->int_vec_offset64()->Get(1), 60);\n}\n\nvoid DefaultVectorsStringsTest_BufferSize() {\n  FlatBufferBuilder64 builder;\n  // Create a table where all fields with default values are omitted.\n  DefaultVectorsStringsTest::TableWithDefaultVectorsBuilder tbl_builder(\n      builder);\n  auto offset = tbl_builder.Finish();\n  builder.Finish(offset);\n\n  Verifier verifier(builder.GetBufferPointer(), builder.GetSize());\n  TEST_ASSERT(\n      DefaultVectorsStringsTest::VerifyTableWithDefaultVectorsBuffer(verifier));\n\n  // The buffer should be small when only defaults are used.\n  // This value can be adjusted if the schema changes.\n  constexpr unsigned int buffer_size_threshold_in_bytes = 12;\n  TEST_ASSERT(builder.GetSize() <= buffer_size_threshold_in_bytes);\n}\n\nvoid DefaultVectorsStringsTest() {\n  DefaultVectorsStringsTest_EmptyOnDefault_Const();\n  DefaultVectorsStringsTest_EmptyOnDefault_Mutable();\n  DefaultVectorsStringsTest_WithValues();\n  DefaultVectorsStringsTest_BufferSize();\n}\n\n}  // namespace tests\n}  // namespace flatbuffers\n"
  },
  {
    "path": "tests/default_vectors_strings_test.fbs",
    "content": "// C++ Only Schema for Default Vectors Test\nnamespace DefaultVectorsStringsTest;\n\nstruct MyStruct {\n  a:int;\n  b:int;\n}\n\ntable MyTable {\n  a:int;\n}\n\nenum MyEnum:byte { A, B }\n\ntable TableWithDefaultVectors {\n  int_vec:[int] = [];\n  bool_vec:[bool] = [];\n  char_vec:[byte] = [];\n  uchar_vec:[ubyte] = [];\n  short_vec:[short] = [];\n  ushort_vec:[ushort] = [];\n  uint_vec:[uint] = [];\n  long_vec:[long] = [];\n  ulong_vec:[ulong] = [];\n  float_vec:[float] = [];\n  double_vec:[double] = [];\n  string_vec:[string] = [];\n  empty_string:string = \"\";\n  some_string:string = \"some\";\n  struct_vec:[MyStruct] = [];\n  table_vec:[MyTable] = [];\n  enum_vec:[MyEnum] = [];\n  regular_int_vec:[int];\n  regular_int:int;\n  int_vec_offset64:[int] = [] (offset64);\n  int_vec64:[int]= [] (vector64);\n}\n\nroot_type TableWithDefaultVectors;"
  },
  {
    "path": "tests/default_vectors_strings_test.h",
    "content": "#ifndef THIRDPARTY_FLATBUFFERS_TESTS_DEFAULT_VECTORS_STRINGS_TEST_H_\n#define THIRDPARTY_FLATBUFFERS_TESTS_DEFAULT_VECTORS_STRINGS_TEST_H_\n\nnamespace flatbuffers {\nnamespace tests {\n\nvoid DefaultVectorsStringsTest_EmptyOnDefault_Const();\nvoid DefaultVectorsStringsTest_EmptyOnDefault_Mutable();\nvoid DefaultVectorsStringsTest_EmptyOnDefault();\nvoid DefaultVectorsStringsTest_WithValues();\nvoid DefaultVectorsStringsTest_BufferSize();\nvoid DefaultVectorsStringsTest();\n\n}  // namespace tests\n}  // namespace flatbuffers\n\n#endif  // THIRDPARTY_FLATBUFFERS_TESTS_DEFAULT_VECTORS_STRINGS_TEST_H_\n"
  },
  {
    "path": "tests/dictionary_lookup.fbs",
    "content": "namespace DictionaryLookup;\n\ntable LongFloatEntry {\n  key: long (key);\n  value: float;\n}\n\ntable LongFloatMap {\n  entries: [LongFloatEntry];\n}\nroot_type LongFloatMap;\n"
  },
  {
    "path": "tests/docker/Dockerfile.testing.build_flatc_debian_stretch",
    "content": "FROM debian:9.6-slim as base\nRUN apt -qq update >/dev/null\nRUN apt -qq install -y cmake make build-essential >/dev/null\nFROM base\nWORKDIR /code\nADD . .\nRUN cmake -G \"Unix Makefiles\"\nRUN make flatc\nRUN ls flatc\n"
  },
  {
    "path": "tests/docker/Dockerfile.testing.cpp.debian_buster",
    "content": "FROM debian:10.1-slim as base\nRUN apt -qq update >/dev/null\nRUN apt -qq install -y cmake make build-essential >/dev/null\nRUN apt -qq install -y autoconf git libtool >/dev/null\nRUN apt -qq install -y clang >/dev/null\nFROM base\n# Travis machines have 2 cores. Can be redefined with 'run --env PAR_JOBS=N'.\nENV JOBS=2\nWORKDIR /flatbuffers\nADD . .\n"
  },
  {
    "path": "tests/docker/TODO.Dockerfile.testing.php.hhvm_2019_01_16",
    "content": "# This does not pass tests due to the following error:\n#\n# Fatal error: Uncaught exception 'InvalidArgumentException' with message 'Google\\FlatBuffers\\ByteBuffer::getX() expects parameter 1 by reference, but the call was not annotated with '&'. in /code/php/FlatbufferBuilder.php:971\n# Stack trace:\n# #0 /code/tests/phpTest.php(277): Google\\FlatBuffers\\FlatbufferBuilder->sizedByteArray()\n# #1 /code/tests/phpTest.php(79): fuzzTest1()\n# #2 /code/tests/phpTest.php(86): main()\n# #3 {main}\n#   thrown in in /code/php/FlatbufferBuilder.php:971\nFROM hhvm/hhvm:2019.01.16 as base\nWORKDIR /code\nADD . .\nRUN cp flatc_debian_stretch flatc\nWORKDIR /code/tests\nRUN hhvm --version\nRUN hhvm phpTest.php\nRUN ../flatc --php -o php union_vector/union_vector.fbs\nRUN hhvm phpUnionVectorTest.php\n"
  },
  {
    "path": "tests/docker/TODO.Dockerfile.testing.python.cpython_with_conda",
    "content": ""
  },
  {
    "path": "tests/docker/TODO.Dockerfile.testing.python.cpython_with_numpy",
    "content": ""
  },
  {
    "path": "tests/docker/TODO.Dockerfile.testing.python.pypy_6_0_0_py2",
    "content": "FROM pypy:2-6.0.0-slim as base\nWORKDIR /code\nADD . .\nRUN cp flatc_debian_stretch flatc\nWORKDIR /code/tests\nRUN pypy --version\nRUN ./PythonTest.sh\n"
  },
  {
    "path": "tests/docker/TODO.Dockerfile.testing.python.pypy_6_0_0_py3",
    "content": "FROM pypy:3-6.0.0-slim as base\nWORKDIR /code\nADD . .\nRUN cp flatc_debian_stretch flatc\nWORKDIR /code/tests\nRUN pypy --version\nRUN ./PythonTest.sh\n"
  },
  {
    "path": "tests/docker/build_flatc.run.sh",
    "content": "set -e\n\nJOBS=${JOBS:-1}\nconfig=$1\necho \"\"\necho \"Build 'flatc' compiler for '$config'\"\n\ncmake . -DCMAKE_BUILD_TYPE=$config \\\n  -DFLATBUFFERS_BUILD_FLATC=1 -DFLATBUFFERS_STATIC_FLATC=1 \\\n  -DFLATBUFFERS_BUILD_TESTS=0 -DFLATBUFFERS_INSTALL=0\ncmake --build . --target flatc --clean-first -- -j$JOBS\n\necho \"Checking generated code\"\nscripts/check_generate_code.py\necho \"Done\"\n"
  },
  {
    "path": "tests/docker/cpp_test.run.sh",
    "content": "set -e\n\nJOBS=${JOBS:-1}\nexport UBSAN_OPTIONS=halt_on_error=1\nexport ASAN_OPTIONS=halt_on_error=1\nexport MAKEFLAGS=\"-j$JOBS\"\n\nconfig=$1\necho \"\"\necho \"Build Flatbuffers project for '$config' with jobs=$JOBS\"\n\ncmake . -DCMAKE_BUILD_TYPE=$config \\\n  -DFLATBUFFERS_BUILD_TESTS=ON -DFLATBUFFERS_CODE_SANITIZE=ON\ncmake --build . --target all --clean-first -- -j$JOBS\nctest --extra-verbose --output-on-failure -j$JOBS\n\necho \"Checking generated code\"\nscripts/check_generate_code.py\n\necho \"C++ tests done\"\n"
  },
  {
    "path": "tests/docker/languages/Dockerfile.testing.csharp.mono_5_18",
    "content": "FROM mono:5.18 as base\nWORKDIR /code\nADD . .\nRUN cp flatc_debian_stretch flatc\nWORKDIR /code/tests\nRUN mono --version\nWORKDIR /code/tests/FlatBuffers.Test\nRUN sh NetTest.sh\n"
  },
  {
    "path": "tests/docker/languages/Dockerfile.testing.golang.1_11",
    "content": "FROM golang:1.11-stretch as base\nWORKDIR /code\nADD . .\nRUN cp flatc_debian_stretch flatc\nWORKDIR /code/tests\nRUN go version\nRUN ./GoTest.sh\n"
  },
  {
    "path": "tests/docker/languages/Dockerfile.testing.java.openjdk_10_0_2",
    "content": "FROM openjdk:10.0.2-jdk-slim-sid as base\nWORKDIR /code\nADD . .\nRUN cp flatc_debian_stretch flatc\nWORKDIR /code/tests\nRUN java -version\nRUN ./JavaTest.sh\n"
  },
  {
    "path": "tests/docker/languages/Dockerfile.testing.java.openjdk_11_0_1",
    "content": "FROM openjdk:11.0.1-jdk-slim-sid as base\nWORKDIR /code\nADD . .\nRUN cp flatc_debian_stretch flatc\nWORKDIR /code/tests\nRUN java -version\nRUN ./JavaTest.sh\n"
  },
  {
    "path": "tests/docker/languages/Dockerfile.testing.node.12_20_1",
    "content": "FROM node:12.20.1-stretch as base\nWORKDIR /code\nADD . .\nRUN cp flatc_debian_stretch flatc\nRUN npm install\nRUN npm test\n"
  },
  {
    "path": "tests/docker/languages/Dockerfile.testing.node.14_15_4",
    "content": "FROM node:14.15.4-stretch as base\nWORKDIR /code\nADD . .\nRUN cp flatc_debian_stretch flatc\nRUN npm install\nRUN npm test\n"
  },
  {
    "path": "tests/docker/languages/Dockerfile.testing.php.zend_7_3",
    "content": "FROM php:7.3-cli-stretch as base\nWORKDIR /code\nADD . .\nRUN cp flatc_debian_stretch flatc\nWORKDIR /code/tests\nRUN php --version\nRUN php phpTest.php\nRUN sh phpUnionVectorTest.sh\n"
  },
  {
    "path": "tests/docker/languages/Dockerfile.testing.python.cpython_2_7_15",
    "content": "FROM python:2.7.15-slim-stretch as base\nWORKDIR /code\nADD . .\nRUN cp flatc_debian_stretch flatc\nWORKDIR /code/tests\nRUN python --version\nRUN pip install coverage\nRUN ./PythonTest.sh\n"
  },
  {
    "path": "tests/docker/languages/Dockerfile.testing.python.cpython_3_7_1",
    "content": "FROM python:3.7.1-slim-stretch as base\nWORKDIR /code\nADD . .\nRUN cp flatc_debian_stretch flatc\nWORKDIR /code/tests\nRUN python --version\nRUN pip install coverage\nRUN ./PythonTest.sh\n"
  },
  {
    "path": "tests/docker/languages/Dockerfile.testing.python.numpy.cpython_2_7_15",
    "content": "FROM python:2.7.15-slim-stretch as base\nWORKDIR /code\nADD . .\nRUN cp flatc_debian_stretch flatc\nWORKDIR /code/tests\nRUN python --version\nRUN pip install numpy\nRUN pip install coverage\nRUN ./PythonTest.sh\n"
  },
  {
    "path": "tests/docker/languages/Dockerfile.testing.python.numpy.cpython_3_7_1",
    "content": "FROM python:3.7.1-slim-stretch as base\nWORKDIR /code\nADD . .\nRUN cp flatc_debian_stretch flatc\nWORKDIR /code/tests\nRUN python --version\nRUN pip install numpy\nRUN pip install coverage\nRUN ./PythonTest.sh\n"
  },
  {
    "path": "tests/docker/languages/Dockerfile.testing.rust.1_51_0",
    "content": "FROM rust:1.51.0-slim as base\nWORKDIR /code\nADD . .\nRUN cp flatc_debian_stretch flatc\nWORKDIR /code/tests\nRUN rustc --version\nRUN ./RustTest.sh\n"
  },
  {
    "path": "tests/docker/languages/Dockerfile.testing.rust.big_endian.1_51_0",
    "content": "FROM rust:1.51.0-slim as base\nRUN apt -qq update -y && apt -qq install -y \\\n    gcc-mips-linux-gnu \\\n    libexpat1 \\\n    libmagic1 \\\n    libmpdec2 \\\n    libreadline7 \\\n    qemu-user\nRUN rustup target add mips-unknown-linux-gnu\nWORKDIR /code\nADD . .\nRUN cp flatc_debian_stretch flatc\nWORKDIR /code/tests\nRUN rustc --version\nRUN ./RustTest.sh mips-unknown-linux-gnu\n"
  },
  {
    "path": "tests/docker/languages/Dockerfile.testing.rust.nightly",
    "content": "FROM rustlang/rust:nightly-stretch-slim as base\nWORKDIR /code\nADD . .\nRUN cp flatc_debian_stretch flatc\nWORKDIR /code/tests\nRUN rustc --version\nRUN export RUST_NIGHTLY=1\nRUN ./RustTest.sh\n"
  },
  {
    "path": "tests/docker/languages/Dockerfile.testing.swift_5_2",
    "content": "FROM swift:5.2\nWORKDIR /code\nADD . .\nRUN cp flatc_debian_stretch flatc\nWORKDIR /code/tests\nRUN swift --version\nWORKDIR /code/tests/swift/tests/\nRUN sh SwiftTest.sh\n"
  },
  {
    "path": "tests/even_more_defaults.fbs",
    "content": "\nenum ABC: int { A, B, C }\n\nstruct EvenMoreStruct {\n  g:[int64:2];\n}\n\ntable EvenMoreDefaults {\n  str: EvenMoreStruct;\n  ints: [int] = [];\n  floats: [float] = [     ];\n  float_optional: [float];\n  bytes_optional: [ubyte];\n  floats_required: [float] (required);\n  empty_string: string = \"\";\n  some_string: string = \"some\";\n  zero_string: string = \"0\";\n  a_string:string (key);\n  required_string: string (required);\n  abcs: [ABC] = [];\n  bools: [bool] = [];\n  one_bool: bool = true;\n}\n"
  },
  {
    "path": "tests/evolution_test/evolution_v1.fbs",
    "content": "namespace Evolution.V1;\n\ntable TableA {\n    a:float;\n    b:int;\n}\n\ntable TableB {\n    a:int;\n}\n\nenum Enum : byte {\n    King,\n    Queen\n}\n\nunion Union {\n    TableA,\n    TableB\n}\n\nstruct Struct {\n    a:int;\n    b:double;\n}\n\ntable Root {\n    a:int;\n    b:bool;\n    c:Union;\n    d:Enum;\n    e:TableA;\n    f:Struct;\n    g:[int];\n    h:[TableB];\n    i:int = 1234;\n    j:Union;\n}\n\nroot_type Root;\n"
  },
  {
    "path": "tests/evolution_test/evolution_v1.json",
    "content": "{\n  \"a\": 42,\n  \"b\": true,\n  \"c_type\": \"TableB\",\n  \"c\": {\n    \"a\": 15\n  },\n  \"d\": \"King\",\n  \"e\": {\n    \"a\": 3.1452,\n    \"b\": 325\n  },\n  \"f\":{\n    \"a\": 16,\n    \"b\": 243.980943\n  },\n  \"g\": [ 7, 8, 9],\n  \"h\": [\n    {\n      \"a\": 212\n    },\n    {\n      \"a\": 459\n    }\n  ],\n  \"j\": {\n    \"a\": 984\n  }\n}\n"
  },
  {
    "path": "tests/evolution_test/evolution_v2.fbs",
    "content": "namespace Evolution.V2;\n\ntable TableA {\n    b:int (id: 1);      // swapped with 'a'\n    a:float (id: 0);    // swapped with 'b'\n    c:string (id: 2);   // new in v2\n}\n\ntable TableB {\n    a:int;\n}\n\ntable TableC {          // new in v2\n    a:double;\n    b:string;\n}\n\nenum Enum : byte {\n    King,\n    Queen,\n    Rook,               // new in v2\n    Bishop              // new in v2\n}\n\nunion Union {\n    TableA,\n    TableB,\n    TableC\n}\n\nstruct Struct {\n    a:int;\n    b:double;\n}\n\ntable Root {\n    a:int (deprecated); // deprecated in v2\n    b:bool;\n    c:Union;\n    d:Enum;\n    e:TableA;\n    ff:Struct;          // renamed from 'f' in v1\n    g:[int];\n    h:[TableB];\n    i:uint = 1234;\n    j:Union (deprecated); // deprecated in v2\n    k:TableC;           // new in v2\n    l:uint8 = 56;       // new in v2\n}\n\nroot_type Root;\n"
  },
  {
    "path": "tests/evolution_test/evolution_v2.json",
    "content": "{\n  \"b\": false,\n  \"c_type\": \"TableC\",\n  \"c\": {\n    \"a\": 984.2494\n  },\n  \"d\": \"Bishop\",\n  \"e\": {\n    \"a\": 3.1452,\n    \"b\": 435,\n    \"c\": \"yummy yummy fig bar bar\"\n  },\n  \"ff\":{\n    \"a\": 35,\n    \"b\": 243.980943\n  },\n  \"g\": [ 7, 8, 10],\n  \"h\": [\n    {\n      \"a\": 212\n    },\n    {\n      \"a\": 459\n    },\n    {\n      \"a\": 333\n    }\n  ],\n  \"i\": 4321,\n  \"k\": {\n    \"a\": 9874.342,\n    \"b\": \"more please\"\n  }\n}\n"
  },
  {
    "path": "tests/evolution_test.cpp",
    "content": "#include \"evolution_test.h\"\n\n#include \"evolution_test/evolution_v1_generated.h\"\n#include \"evolution_test/evolution_v2_generated.h\"\n#include \"flatbuffers/idl.h\"\n#include \"test_assert.h\"\n\nnamespace flatbuffers {\nnamespace tests {\n\nvoid EvolutionTest(const std::string& tests_data_path) {\n  // VS10 does not support typed enums, exclude from tests\n#if !defined(_MSC_VER) || _MSC_VER >= 1700\n  const int NUM_VERSIONS = 2;\n  std::string schemas[NUM_VERSIONS];\n  std::string jsonfiles[NUM_VERSIONS];\n  std::vector<uint8_t> binaries[NUM_VERSIONS];\n\n  flatbuffers::IDLOptions idl_opts;\n  idl_opts.lang_to_generate |= flatbuffers::IDLOptions::kBinary;\n  flatbuffers::Parser parser(idl_opts);\n\n  // Load all the schema versions and their associated data.\n  for (int i = 0; i < NUM_VERSIONS; ++i) {\n    std::string schema = tests_data_path + \"evolution_test/evolution_v\" +\n                         flatbuffers::NumToString(i + 1) + \".fbs\";\n    TEST_ASSERT(flatbuffers::LoadFile(schema.c_str(), false, &schemas[i]));\n    std::string json = tests_data_path + \"evolution_test/evolution_v\" +\n                       flatbuffers::NumToString(i + 1) + \".json\";\n    TEST_ASSERT(flatbuffers::LoadFile(json.c_str(), false, &jsonfiles[i]));\n\n    TEST_ASSERT(parser.Parse(schemas[i].c_str()));\n    TEST_ASSERT(parser.Parse(jsonfiles[i].c_str()));\n\n    auto bufLen = parser.builder_.GetSize();\n    auto buf = parser.builder_.GetBufferPointer();\n    binaries[i].reserve(bufLen);\n    std::copy(buf, buf + bufLen, std::back_inserter(binaries[i]));\n  }\n\n  // Assert that all the verifiers for the different schema versions properly\n  // verify any version data.\n  for (int i = 0; i < NUM_VERSIONS; ++i) {\n    flatbuffers::Verifier verifier(&binaries[i].front(), binaries[i].size());\n    TEST_ASSERT(Evolution::V1::VerifyRootBuffer(verifier));\n    TEST_ASSERT(Evolution::V2::VerifyRootBuffer(verifier));\n  }\n\n  // Test backwards compatibility by reading old data with an evolved schema.\n  auto root_v1_viewed_from_v2 = Evolution::V2::GetRoot(&binaries[0].front());\n  // field 'k' is new in version 2, so it should be null.\n  TEST_ASSERT(nullptr == root_v1_viewed_from_v2->k());\n  // field 'l' is new in version 2 with a default of 56.\n  TEST_EQ(root_v1_viewed_from_v2->l(), 56);\n  // field 'c' of 'TableA' is new in version 2, so it should be null.\n  TEST_ASSERT(nullptr == root_v1_viewed_from_v2->e()->c());\n  // 'TableC' was added to field 'c' union in version 2, so it should be null.\n  TEST_ASSERT(nullptr == root_v1_viewed_from_v2->c_as_TableC());\n  // The field 'c' union should be of type 'TableB' regardless of schema version\n  TEST_ASSERT(root_v1_viewed_from_v2->c_type() == Evolution::V2::Union::TableB);\n  // The field 'f' was renamed to 'ff' in version 2, it should still be\n  // readable.\n  TEST_EQ(root_v1_viewed_from_v2->ff()->a(), 16);\n\n  // Test forwards compatibility by reading new data with an old schema.\n  auto root_v2_viewed_from_v1 = Evolution::V1::GetRoot(&binaries[1].front());\n  // The field 'c' union in version 2 is a new table (index = 3) and should\n  // still be accessible, but not interpretable.\n  TEST_EQ(static_cast<uint8_t>(root_v2_viewed_from_v1->c_type()), 3);\n  TEST_NOTNULL(root_v2_viewed_from_v1->c());\n  // The field 'd' enum in verison 2 has new members and should still be\n  // accessible, but not interpretable.\n  TEST_EQ(static_cast<int8_t>(root_v2_viewed_from_v1->d()), 3);\n  // The field 'a' in version 2 is deprecated and should return the default\n  // value (0) instead of the value stored in the in the buffer (42).\n  TEST_EQ(root_v2_viewed_from_v1->a(), 0);\n  // The field 'ff' was originally named 'f' in version 1, it should still be\n  // readable.\n  TEST_EQ(root_v2_viewed_from_v1->f()->a(), 35);\n#endif\n}\n\nvoid ConformTest() {\n  const char ref[] = \"table T { A:int; } enum E:byte { A }\";\n\n  auto test_conform = [](const char* ref, const char* test,\n                         const char* expected_err) {\n    flatbuffers::Parser parser1;\n    TEST_EQ(parser1.Parse(ref), true);\n    flatbuffers::Parser parser2;\n    TEST_EQ(parser2.Parse(test), true);\n    auto err = parser2.ConformTo(parser1);\n    if (*expected_err == '\\0') {\n      TEST_EQ_STR(err.c_str(), expected_err);\n    } else {\n      TEST_NOTNULL(strstr(err.c_str(), expected_err));\n    }\n  };\n\n  test_conform(ref, \"table T { A:byte; }\", \"types differ for field: T.A\");\n  test_conform(ref, \"table T { B:int; A:int; }\",\n               \"offsets differ for field: T.A\");\n  test_conform(ref, \"table T { A:int = 1; }\", \"defaults differ for field: T.A\");\n  test_conform(ref, \"table T { B:float; }\",\n               \"field renamed to different type: T.B (renamed from T.A)\");\n  test_conform(ref, \"enum E:byte { B, A }\", \"values differ for enum: A\");\n  test_conform(ref, \"table T { }\", \"field deleted: T.A\");\n  test_conform(ref, \"table T { B:int; }\", \"\");  // renaming a field is allowed\n\n  const char ref2[] = \"enum E:byte { A } table T2 { f:E; } \";\n  test_conform(ref2, \"enum E:int32 { A } table T2 { df:byte; f:E; }\",\n               \"field renamed to different type: T2.df (renamed from T2.f)\");\n\n  // Check enum underlying type changes.\n  test_conform(\"enum E:int32 {A}\", \"enum E: byte {A}\",\n               \"underlying type differ for enum: E\");\n\n  // Check union underlying type changes.\n  const char ref3[] = \"table A {} table B {} union C {A, B}\";\n  test_conform(ref3, \"table A {} table B {} union C:int32 {A, B}\",\n               \"underlying type differ for union: C\");\n\n  // Check conformity for Offset64-related changes.\n  {\n    const char ref[] = \"table T { a:[uint8]; b:string; }\";\n\n    // Adding a 'vector64' changes the type.\n    test_conform(ref, \"table T { a:[uint8] (vector64); b:string; }\",\n                 \"types differ for field: T.a\");\n\n    // Adding a 'offset64' to the vector changes the type.\n    test_conform(ref, \"table T { a:[uint8] (offset64); b:string; }\",\n                 \"offset types differ for field: T.a\");\n\n    // Adding a 'offset64' to the string also changes the type.\n    test_conform(ref, \"table T { a:[uint8]; b:string (offset64); }\",\n                 \"offset types differ for field: T.b\");\n\n    // Now try the opposite direction of removing an attribute from an existing\n    // field.\n\n    // Removing a 'vector64' changes the type.\n    test_conform(\"table T { a:[uint8] (vector64); b:string; }\", ref,\n                 \"types differ for field: T.a\");\n\n    // Removing a 'offset64' to the string also changes the type.\n    test_conform(\"table T { a:[uint8] (offset64); b:string; }\", ref,\n                 \"offset types differ for field: T.a\");\n\n    // Remove a 'offset64' to the string also changes the type.\n    test_conform(\"table T { a:[uint8]; b:string (offset64); }\", ref,\n                 \"offset types differ for field: T.b\");\n  }\n}\n\nvoid UnionDeprecationTest(const std::string& tests_data_path) {\n  const int NUM_VERSIONS = 2;\n  std::string schemas[NUM_VERSIONS];\n  std::string jsonfiles[NUM_VERSIONS];\n  std::vector<uint8_t> binaries[NUM_VERSIONS];\n\n  flatbuffers::IDLOptions idl_opts;\n  idl_opts.lang_to_generate |= flatbuffers::IDLOptions::kBinary;\n  flatbuffers::Parser parser(idl_opts);\n\n  // Load all the schema versions and their associated data.\n  for (int i = 0; i < NUM_VERSIONS; ++i) {\n    std::string schema = tests_data_path + \"evolution_test/evolution_v\" +\n                         flatbuffers::NumToString(i + 1) + \".fbs\";\n    TEST_ASSERT(flatbuffers::LoadFile(schema.c_str(), false, &schemas[i]));\n    std::string json = tests_data_path + \"evolution_test/evolution_v\" +\n                       flatbuffers::NumToString(i + 1) + \".json\";\n    TEST_ASSERT(flatbuffers::LoadFile(json.c_str(), false, &jsonfiles[i]));\n\n    TEST_ASSERT(parser.Parse(schemas[i].c_str()));\n    TEST_ASSERT(parser.Parse(jsonfiles[i].c_str()));\n\n    auto bufLen = parser.builder_.GetSize();\n    auto buf = parser.builder_.GetBufferPointer();\n    binaries[i].reserve(bufLen);\n    std::copy(buf, buf + bufLen, std::back_inserter(binaries[i]));\n  }\n\n  auto v2 = parser.LookupStruct(\"Evolution.V2.Root\");\n  TEST_NOTNULL(v2);\n  auto j_type_field = v2->fields.Lookup(\"j_type\");\n  TEST_NOTNULL(j_type_field);\n  TEST_ASSERT(j_type_field->deprecated);\n}\n\n}  // namespace tests\n}  // namespace flatbuffers\n"
  },
  {
    "path": "tests/evolution_test.h",
    "content": "#ifndef TESTS_EVOLUTION_TEST_H\n#define TESTS_EVOLUTION_TEST_H\n\n#include <string>\n\nnamespace flatbuffers {\nnamespace tests {\n\nvoid EvolutionTest(const std::string& tests_data_path);\nvoid ConformTest();\nvoid UnionDeprecationTest(const std::string& tests_data_path);\n\n}  // namespace tests\n}  // namespace flatbuffers\n\n#endif\n"
  },
  {
    "path": "tests/flexbuffers_test.cpp",
    "content": "#include \"flexbuffers_test.h\"\n\n#include <limits>\n\n#include \"flatbuffers/flexbuffers.h\"\n#include \"flatbuffers/idl.h\"\n#include \"is_quiet_nan.h\"\n#include \"test_assert.h\"\n\nnamespace flatbuffers {\nnamespace tests {\n\n// Shortcuts for the infinity.\nstatic const auto infinity_d = std::numeric_limits<double>::infinity();\n\nvoid FlexBuffersTest() {\n  flexbuffers::Builder slb(512,\n                           flexbuffers::BUILDER_FLAG_SHARE_KEYS_AND_STRINGS);\n\n  // Write the equivalent of:\n  // { vec: [ -100, \"Fred\", 4.0, false ], bar: [ 1, 2, 3 ], bar3: [ 1, 2, 3 ],\n  // foo: 100, bool: true, mymap: { foo: \"Fred\" } }\n\n  // It's possible to do this without std::function support as well.\n  slb.Map([&]() {\n    slb.Vector(\"vec\", [&]() {\n      slb += -100;  // Equivalent to slb.Add(-100) or slb.Int(-100);\n      slb += \"Fred\";\n      slb.IndirectFloat(4.0f);\n      auto i_f = slb.LastValue();\n      uint8_t blob[] = {77};\n      slb.Blob(blob, 1);\n      slb += false;\n      slb.ReuseValue(i_f);\n    });\n    int ints[] = {1, 2, 3};\n    slb.Vector(\"bar\", ints, 3);\n    slb.FixedTypedVector(\"bar3\", ints, 3);\n    bool bools[] = {true, false, true, false};\n    slb.Vector(\"bools\", bools, 4);\n    slb.Bool(\"bool\", true);\n    slb.Double(\"foo\", 100);\n    slb.Map(\"mymap\", [&]() {\n      slb.String(\"foo\", \"Fred\");  // Testing key and string reuse.\n    });\n  });\n  slb.Finish();\n\n  // clang-format off\n  #ifdef FLATBUFFERS_TEST_VERBOSE\n    for (size_t i = 0; i < slb.GetBuffer().size(); i++)\n      printf(\"%d \", slb.GetBuffer().data()[i]);\n    printf(\"\\n\");\n  #endif\n  // clang-format on\n\n  std::vector<uint8_t> reuse_tracker;\n  TEST_EQ(flexbuffers::VerifyBuffer(slb.GetBuffer().data(),\n                                    slb.GetBuffer().size(), &reuse_tracker),\n          true);\n\n  auto map = flexbuffers::GetRoot(slb.GetBuffer()).AsMap();\n  TEST_EQ(map.size(), 7);\n  auto vec = map[\"vec\"].AsVector();\n  TEST_EQ(vec.size(), 6);\n  TEST_EQ(vec[0].AsInt64(), -100);\n  TEST_EQ_STR(vec[1].AsString().c_str(), \"Fred\");\n  TEST_EQ(vec[1].AsInt64(), 0);  // Number parsing failed.\n  TEST_EQ(vec[2].AsDouble(), 4.0);\n  TEST_EQ(vec[2].AsString().IsTheEmptyString(), true);  // Wrong Type.\n  TEST_EQ_STR(vec[2].AsString().c_str(), \"\");     // This still works though.\n  TEST_EQ_STR(vec[2].ToString().c_str(), \"4.0\");  // Or have it converted.\n  // Few tests for templated version of As.\n  TEST_EQ(vec[0].As<int64_t>(), -100);\n  TEST_EQ_STR(vec[1].As<std::string>().c_str(), \"Fred\");\n  TEST_EQ(vec[1].As<int64_t>(), 0);  // Number parsing failed.\n  TEST_EQ(vec[2].As<double>(), 4.0);\n  // Test that the blob can be accessed.\n  TEST_EQ(vec[3].IsBlob(), true);\n  auto blob = vec[3].AsBlob();\n  TEST_EQ(blob.size(), 1);\n  TEST_EQ(blob.data()[0], 77);\n  TEST_EQ(vec[4].IsBool(), true);   // Check if type is a bool\n  TEST_EQ(vec[4].AsBool(), false);  // Check if value is false\n  TEST_EQ(vec[5].AsDouble(), 4.0);  // This is shared with vec[2] !\n  auto tvec = map[\"bar\"].AsTypedVector();\n  TEST_EQ(tvec.size(), 3);\n  TEST_EQ(tvec[2].AsInt8(), 3);\n  auto tvec3 = map[\"bar3\"].AsFixedTypedVector();\n  TEST_EQ(tvec3.size(), 3);\n  TEST_EQ(tvec3[2].AsInt8(), 3);\n  TEST_EQ(map[\"bool\"].AsBool(), true);\n  auto tvecb = map[\"bools\"].AsTypedVector();\n  TEST_EQ(tvecb.ElementType(), flexbuffers::FBT_BOOL);\n  TEST_EQ(map[\"foo\"].AsUInt8(), 100);\n  TEST_EQ(map[\"unknown\"].IsNull(), true);\n  auto mymap = map[\"mymap\"].AsMap();\n  // These should be equal by pointer equality, since key and value are shared.\n  TEST_EQ(mymap.Keys()[0].AsKey(), map.Keys()[4].AsKey());\n  TEST_EQ(mymap.Values()[0].AsString().c_str(), vec[1].AsString().c_str());\n  // We can mutate values in the buffer.\n  TEST_EQ(vec[0].MutateInt(-99), true);\n  TEST_EQ(vec[0].AsInt64(), -99);\n  TEST_EQ(vec[1].MutateString(\"John\"), true);  // Size must match.\n  TEST_EQ_STR(vec[1].AsString().c_str(), \"John\");\n  TEST_EQ(vec[1].MutateString(\"Alfred\"), false);  // Too long.\n  TEST_EQ(vec[2].MutateFloat(2.0f), true);\n  TEST_EQ(vec[2].AsFloat(), 2.0f);\n  TEST_EQ(vec[2].MutateFloat(3.14159), false);  // Double does not fit in float.\n  TEST_EQ(vec[4].AsBool(), false);              // Is false before change\n  TEST_EQ(vec[4].MutateBool(true), true);       // Can change a bool\n  TEST_EQ(vec[4].AsBool(), true);               // Changed bool is now true\n\n  // Parse from JSON:\n  flatbuffers::Parser parser;\n  slb.Clear();\n  auto jsontest = \"{ a: [ 123, 456.0 ], b: \\\"hello\\\", c: true, d: false }\";\n  TEST_EQ(parser.ParseFlexBuffer(jsontest, nullptr, &slb), true);\n  TEST_EQ(flexbuffers::VerifyBuffer(slb.GetBuffer().data(),\n                                    slb.GetBuffer().size(), &reuse_tracker),\n          true);\n  auto jroot = flexbuffers::GetRoot(slb.GetBuffer());\n  auto jmap = jroot.AsMap();\n  auto jvec = jmap[\"a\"].AsVector();\n  TEST_EQ(jvec[0].AsInt64(), 123);\n  TEST_EQ(jvec[1].AsDouble(), 456.0);\n  TEST_EQ_STR(jmap[\"b\"].AsString().c_str(), \"hello\");\n  TEST_EQ(jmap[\"c\"].IsBool(), true);   // Parsed correctly to a bool\n  TEST_EQ(jmap[\"c\"].AsBool(), true);   // Parsed correctly to true\n  TEST_EQ(jmap[\"d\"].IsBool(), true);   // Parsed correctly to a bool\n  TEST_EQ(jmap[\"d\"].AsBool(), false);  // Parsed correctly to false\n  // And from FlexBuffer back to JSON:\n  auto jsonback = jroot.ToString();\n  TEST_EQ_STR(jsontest, jsonback.c_str());\n  // With indentation:\n  std::string jsonback_indented;\n  jroot.ToString(true, false, jsonback_indented, true, 0, \"  \");\n  auto jsontest_indented =\n      \"{\\n  a: [\\n    123,\\n    456.0\\n  ],\\n  b: \\\"hello\\\",\\n  c: true,\\n  d: \"\n      \"false\\n}\";\n  TEST_EQ_STR(jsontest_indented, jsonback_indented.c_str());\n\n  slb.Clear();\n  slb.Vector([&]() {\n    for (int i = 0; i < 130; ++i) slb.Add(static_cast<uint8_t>(255));\n    slb.Vector([&]() {\n      for (int i = 0; i < 130; ++i) slb.Add(static_cast<uint8_t>(255));\n      slb.Vector([] {});\n    });\n  });\n  slb.Finish();\n  TEST_EQ(slb.GetSize(), 664);\n}\n\nvoid FlexBuffersReuseBugTest() {\n  flexbuffers::Builder slb;\n  slb.Map([&]() {\n    slb.Vector(\"vec\", [&]() {});\n    slb.Bool(\"bool\", true);\n  });\n  slb.Finish();\n  std::vector<uint8_t> reuse_tracker;\n  // This would fail before, since the reuse_tracker would use the address of\n  // the vector reference to check for reuse, but in this case we have an empty\n  // vector, and since the size field is before the pointer, its address is the\n  // same as thing after it, the key \"bool\".\n  // We fix this by using the address of the size field for tracking reuse.\n  TEST_EQ(flexbuffers::VerifyBuffer(slb.GetBuffer().data(),\n                                    slb.GetBuffer().size(), &reuse_tracker),\n          true);\n}\n\nvoid FlexBuffersFloatingPointTest() {\n#if defined(FLATBUFFERS_HAS_NEW_STRTOD) && (FLATBUFFERS_HAS_NEW_STRTOD > 0)\n  flexbuffers::Builder slb(512,\n                           flexbuffers::BUILDER_FLAG_SHARE_KEYS_AND_STRINGS);\n  // Parse floating-point values from JSON:\n  flatbuffers::Parser parser;\n  slb.Clear();\n  auto jsontest =\n      \"{ a: [1.0, nan, inf, infinity, -inf, +inf, -infinity, 8.0] }\";\n  TEST_EQ(parser.ParseFlexBuffer(jsontest, nullptr, &slb), true);\n  auto jroot = flexbuffers::GetRoot(slb.GetBuffer());\n  TEST_EQ(flexbuffers::VerifyBuffer(slb.GetBuffer().data(),\n                                    slb.GetBuffer().size(), nullptr),\n          true);\n  auto jmap = jroot.AsMap();\n  auto jvec = jmap[\"a\"].AsVector();\n  TEST_EQ(8, jvec.size());\n  TEST_EQ(1.0, jvec[0].AsDouble());\n  TEST_ASSERT(is_quiet_nan(jvec[1].AsDouble()));\n  TEST_EQ(infinity_d, jvec[2].AsDouble());\n  TEST_EQ(infinity_d, jvec[3].AsDouble());\n  TEST_EQ(-infinity_d, jvec[4].AsDouble());\n  TEST_EQ(+infinity_d, jvec[5].AsDouble());\n  TEST_EQ(-infinity_d, jvec[6].AsDouble());\n  TEST_EQ(8.0, jvec[7].AsDouble());\n#endif\n}\n\nvoid FlexBuffersDeprecatedTest() {\n  // FlexBuffers as originally designed had a flaw involving the\n  // FBT_VECTOR_STRING datatype, and this test documents/tests the fix for it.\n  // Discussion: https://github.com/google/flatbuffers/issues/5627\n  flexbuffers::Builder slb;\n  // FBT_VECTOR_* are \"typed vectors\" where all elements are of the same type.\n  // Problem is, when storing FBT_STRING elements, it relies on that type to\n  // get the bit-width for the size field of the string, which in this case\n  // isn't present, and instead defaults to 8-bit. This means that any strings\n  // stored inside such a vector, when accessed thru the old API that returns\n  // a String reference, will appear to be truncated if the string stored is\n  // actually >=256 bytes.\n  std::string test_data(300, 'A');\n  auto start = slb.StartVector();\n  // This one will have a 16-bit size field.\n  slb.String(test_data);\n  // This one will have an 8-bit size field.\n  slb.String(\"hello\");\n  // We're asking this to be serialized as a typed vector (true), but not\n  // fixed size (false). The type will be FBT_VECTOR_STRING with a bit-width\n  // of whatever the offsets in the vector need, the bit-widths of the strings\n  // are not stored(!) <- the actual design flaw.\n  // Note that even in the fixed code, we continue to serialize the elements of\n  // FBT_VECTOR_STRING as FBT_STRING, since there may be old code out there\n  // reading new data that we want to continue to function.\n  // Thus, FBT_VECTOR_STRING, while deprecated, will always be represented the\n  // same way, the fix lies on the reading side.\n  slb.EndVector(start, true, false);\n  slb.Finish();\n  // Verify because why not.\n  TEST_EQ(flexbuffers::VerifyBuffer(slb.GetBuffer().data(),\n                                    slb.GetBuffer().size(), nullptr),\n          true);\n  // So now lets read this data back.\n  // For existing data, since we have no way of knowing what the actual\n  // bit-width of the size field of the string is, we are going to ignore this\n  // field, and instead treat these strings as FBT_KEY (null-terminated), so we\n  // can deal with strings of arbitrary length. This of course truncates strings\n  // with embedded nulls, but we think that that is preferrable over truncating\n  // strings >= 256 bytes.\n  auto vec = flexbuffers::GetRoot(slb.GetBuffer()).AsTypedVector();\n  // Even though this was serialized as FBT_VECTOR_STRING, it is read as\n  // FBT_VECTOR_KEY:\n  TEST_EQ(vec.ElementType(), flexbuffers::FBT_KEY);\n  // Access the long string. Previously, this would return a string of size 1,\n  // since it would read the high-byte of the 16-bit length.\n  // This should now correctly test the full 300 bytes, using AsKey():\n  TEST_EQ_STR(vec[0].AsKey(), test_data.c_str());\n  // Old code that called AsString will continue to work, as the String\n  // accessor objects now use a cached size that can come from a key as well.\n  TEST_EQ_STR(vec[0].AsString().c_str(), test_data.c_str());\n  // Short strings work as before:\n  TEST_EQ_STR(vec[1].AsKey(), \"hello\");\n  TEST_EQ_STR(vec[1].AsString().c_str(), \"hello\");\n  // So, while existing code and data mostly \"just work\" with the fixes applied\n  // to AsTypedVector and AsString, what do you do going forward?\n  // Code accessing existing data doesn't necessarily need to change, though\n  // you could consider using AsKey instead of AsString for a) documenting\n  // that you are accessing keys, or b) a speedup if you don't actually use\n  // the string size.\n  // For new data, or data that doesn't need to be backwards compatible,\n  // instead serialize as FBT_VECTOR (call EndVector with typed = false, then\n  // read elements with AsString), or, for maximum compactness, use\n  // FBT_VECTOR_KEY (call slb.Key above instead, read with AsKey or AsString).\n}\n\nvoid ParseFlexbuffersFromJsonWithNullTest() {\n  // Test nulls are handled appropriately through flexbuffers to exercise other\n  // code paths of ParseSingleValue in the optional scalars change.\n  // TODO(cneo): Json -> Flatbuffers test once some language can generate code\n  // with optional scalars.\n  {\n    char json[] = \"{\\\"opt_field\\\": 123 }\";\n    flatbuffers::Parser parser;\n    flexbuffers::Builder flexbuild;\n    parser.ParseFlexBuffer(json, nullptr, &flexbuild);\n    auto root = flexbuffers::GetRoot(flexbuild.GetBuffer());\n    TEST_EQ(root.AsMap()[\"opt_field\"].AsInt64(), 123);\n  }\n  {\n    char json[] = \"{\\\"opt_field\\\": 123.4 }\";\n    flatbuffers::Parser parser;\n    flexbuffers::Builder flexbuild;\n    parser.ParseFlexBuffer(json, nullptr, &flexbuild);\n    auto root = flexbuffers::GetRoot(flexbuild.GetBuffer());\n    TEST_EQ(root.AsMap()[\"opt_field\"].AsDouble(), 123.4);\n  }\n  {\n    char json[] = \"{\\\"opt_field\\\": null }\";\n    flatbuffers::Parser parser;\n    flexbuffers::Builder flexbuild;\n    parser.ParseFlexBuffer(json, nullptr, &flexbuild);\n    auto root = flexbuffers::GetRoot(flexbuild.GetBuffer());\n    TEST_ASSERT(!root.AsMap().IsTheEmptyMap());\n    TEST_ASSERT(root.AsMap()[\"opt_field\"].IsNull());\n    TEST_EQ(root.ToString(), std::string(\"{ opt_field: null }\"));\n  }\n}\n\n}  // namespace tests\n}  // namespace flatbuffers\n"
  },
  {
    "path": "tests/flexbuffers_test.h",
    "content": "#ifndef TESTS_FLEXBUFFERS_TEST_H\n#define TESTS_FLEXBUFFERS_TEST_H\n\nnamespace flatbuffers {\nnamespace tests {\n\nvoid FlexBuffersTest();\nvoid FlexBuffersReuseBugTest();\nvoid FlexBuffersFloatingPointTest();\nvoid FlexBuffersDeprecatedTest();\nvoid ParseFlexbuffersFromJsonWithNullTest();\n\n}  // namespace tests\n}  // namespace flatbuffers\n\n#endif  // TESTS_FLEXBUFFERS_TEST_H\n"
  },
  {
    "path": "tests/fuzz_test.cpp",
    "content": "#include \"fuzz_test.h\"\n\n#include <algorithm>\n\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/idl.h\"\n#include \"test_assert.h\"\n\nnamespace flatbuffers {\nnamespace tests {\nnamespace {\n\n// Include simple random number generator to ensure results will be the\n// same cross platform.\n// http://en.wikipedia.org/wiki/Park%E2%80%93Miller_random_number_generator\nuint32_t lcg_seed = 48271;\nuint32_t lcg_rand() {\n  return lcg_seed =\n             (static_cast<uint64_t>(lcg_seed) * 279470273UL) % 4294967291UL;\n}\nvoid lcg_reset() { lcg_seed = 48271; }\n\ntemplate <typename T>\nstatic void CompareTableFieldValue(flatbuffers::Table* table,\n                                   flatbuffers::voffset_t voffset, T val) {\n  T read = table->GetField(voffset, static_cast<T>(0));\n  TEST_EQ(read, val);\n}\n\n}  // namespace\n\n// Low level stress/fuzz test: serialize/deserialize a variety of\n// different kinds of data in different combinations\nvoid FuzzTest1() {\n  // Values we're testing against: chosen to ensure no bits get chopped\n  // off anywhere, and also be different from eachother.\n  const uint8_t bool_val = true;\n  const int8_t char_val = -127;  // 0x81\n  const uint8_t uchar_val = 0xFF;\n  const int16_t short_val = -32222;  // 0x8222;\n  const uint16_t ushort_val = 0xFEEE;\n  const int32_t int_val = 0x83333333;\n  const uint32_t uint_val = 0xFDDDDDDD;\n  const int64_t long_val = 0x8444444444444444LL;\n  const uint64_t ulong_val = 0xFCCCCCCCCCCCCCCCULL;\n  const float float_val = 3.14159f;\n  const double double_val = 3.14159265359;\n\n  const int test_values_max = 11;\n  const flatbuffers::voffset_t fields_per_object = 4;\n  const int num_fuzz_objects = 10000;  // The higher, the more thorough :)\n\n  flatbuffers::FlatBufferBuilder builder;\n\n  lcg_reset();  // Keep it deterministic.\n\n  flatbuffers::uoffset_t objects[num_fuzz_objects];\n\n  // Generate num_fuzz_objects random objects each consisting of\n  // fields_per_object fields, each of a random type.\n  for (int i = 0; i < num_fuzz_objects; i++) {\n    auto start = builder.StartTable();\n    for (flatbuffers::voffset_t f = 0; f < fields_per_object; f++) {\n      int choice = lcg_rand() % test_values_max;\n      auto off = flatbuffers::FieldIndexToOffset(f);\n      switch (choice) {\n        case 0:\n          builder.AddElement<uint8_t>(off, bool_val, 0);\n          break;\n        case 1:\n          builder.AddElement<int8_t>(off, char_val, 0);\n          break;\n        case 2:\n          builder.AddElement<uint8_t>(off, uchar_val, 0);\n          break;\n        case 3:\n          builder.AddElement<int16_t>(off, short_val, 0);\n          break;\n        case 4:\n          builder.AddElement<uint16_t>(off, ushort_val, 0);\n          break;\n        case 5:\n          builder.AddElement<int32_t>(off, int_val, 0);\n          break;\n        case 6:\n          builder.AddElement<uint32_t>(off, uint_val, 0);\n          break;\n        case 7:\n          builder.AddElement<int64_t>(off, long_val, 0);\n          break;\n        case 8:\n          builder.AddElement<uint64_t>(off, ulong_val, 0);\n          break;\n        case 9:\n          builder.AddElement<float>(off, float_val, 0);\n          break;\n        case 10:\n          builder.AddElement<double>(off, double_val, 0);\n          break;\n      }\n    }\n    objects[i] = builder.EndTable(start);\n  }\n  builder.PreAlign<flatbuffers::largest_scalar_t>(0);  // Align whole buffer.\n\n  lcg_reset();  // Reset.\n\n  uint8_t* eob = builder.GetCurrentBufferPointer() + builder.GetSize();\n\n  // Test that all objects we generated are readable and return the\n  // expected values. We generate random objects in the same order\n  // so this is deterministic.\n  for (int i = 0; i < num_fuzz_objects; i++) {\n    auto table = reinterpret_cast<flatbuffers::Table*>(eob - objects[i]);\n    for (flatbuffers::voffset_t f = 0; f < fields_per_object; f++) {\n      int choice = lcg_rand() % test_values_max;\n      flatbuffers::voffset_t off = flatbuffers::FieldIndexToOffset(f);\n      switch (choice) {\n        case 0:\n          CompareTableFieldValue(table, off, bool_val);\n          break;\n        case 1:\n          CompareTableFieldValue(table, off, char_val);\n          break;\n        case 2:\n          CompareTableFieldValue(table, off, uchar_val);\n          break;\n        case 3:\n          CompareTableFieldValue(table, off, short_val);\n          break;\n        case 4:\n          CompareTableFieldValue(table, off, ushort_val);\n          break;\n        case 5:\n          CompareTableFieldValue(table, off, int_val);\n          break;\n        case 6:\n          CompareTableFieldValue(table, off, uint_val);\n          break;\n        case 7:\n          CompareTableFieldValue(table, off, long_val);\n          break;\n        case 8:\n          CompareTableFieldValue(table, off, ulong_val);\n          break;\n        case 9:\n          CompareTableFieldValue(table, off, float_val);\n          break;\n        case 10:\n          CompareTableFieldValue(table, off, double_val);\n          break;\n      }\n    }\n  }\n}\n\n// High level stress/fuzz test: generate a big schema and\n// matching json data in random combinations, then parse both,\n// generate json back from the binary, and compare with the original.\nvoid FuzzTest2() {\n  lcg_reset();  // Keep it deterministic.\n\n  const int num_definitions = 30;\n  const int num_struct_definitions = 5;  // Subset of num_definitions.\n  const int fields_per_definition = 15;\n  const int instances_per_definition = 5;\n  const int deprecation_rate = 10;  // 1 in deprecation_rate fields will\n                                    // be deprecated.\n\n  std::string schema = \"namespace test;\\n\\n\";\n\n  struct RndDef {\n    std::string instances[instances_per_definition];\n\n    // Since we're generating schema and corresponding data in tandem,\n    // this convenience function adds strings to both at once.\n    static void Add(RndDef (&definitions_l)[num_definitions],\n                    std::string& schema_l, const int instances_per_definition_l,\n                    const char* schema_add, const char* instance_add,\n                    int definition) {\n      schema_l += schema_add;\n      for (int i = 0; i < instances_per_definition_l; i++)\n        definitions_l[definition].instances[i] += instance_add;\n    }\n  };\n\n  // clang-format off\n  #define AddToSchemaAndInstances(schema_add, instance_add) \\\n    RndDef::Add(definitions, schema, instances_per_definition, \\\n                schema_add, instance_add, definition)\n\n  #define Dummy() \\\n    RndDef::Add(definitions, schema, instances_per_definition, \\\n                \"byte\", \"1\", definition)\n  // clang-format on\n\n  RndDef definitions[num_definitions];\n\n  // We are going to generate num_definitions, the first\n  // num_struct_definitions will be structs, the rest tables. For each\n  // generate random fields, some of which may be struct/table types\n  // referring to previously generated structs/tables.\n  // Simultanenously, we generate instances_per_definition JSON data\n  // definitions, which will have identical structure to the schema\n  // being generated. We generate multiple instances such that when creating\n  // hierarchy, we get some variety by picking one randomly.\n  for (int definition = 0; definition < num_definitions; definition++) {\n    std::string definition_name = \"D\" + flatbuffers::NumToString(definition);\n\n    bool is_struct = definition < num_struct_definitions;\n\n    AddToSchemaAndInstances(\n        ((is_struct ? \"struct \" : \"table \") + definition_name + \" {\\n\").c_str(),\n        \"{\\n\");\n\n    for (int field = 0; field < fields_per_definition; field++) {\n      const bool is_last_field = field == fields_per_definition - 1;\n\n      // Deprecate 1 in deprecation_rate fields. Only table fields can be\n      // deprecated.\n      // Don't deprecate the last field to avoid dangling commas in JSON.\n      const bool deprecated =\n          !is_struct && !is_last_field && (lcg_rand() % deprecation_rate == 0);\n\n      std::string field_name = \"f\" + flatbuffers::NumToString(field);\n      AddToSchemaAndInstances((\"  \" + field_name + \":\").c_str(),\n                              deprecated ? \"\" : (field_name + \": \").c_str());\n      // Pick random type:\n      auto base_type = static_cast<flatbuffers::BaseType>(\n          lcg_rand() % (flatbuffers::BASE_TYPE_UNION + 1));\n      switch (base_type) {\n        case flatbuffers::BASE_TYPE_STRING:\n          if (is_struct) {\n            Dummy();  // No strings in structs.\n          } else {\n            AddToSchemaAndInstances(\"string\", deprecated ? \"\" : \"\\\"hi\\\"\");\n          }\n          break;\n        case flatbuffers::BASE_TYPE_VECTOR:\n          if (is_struct) {\n            Dummy();  // No vectors in structs.\n          } else {\n            AddToSchemaAndInstances(\"[ubyte]\",\n                                    deprecated ? \"\" : \"[\\n0,\\n1,\\n255\\n]\");\n          }\n          break;\n        case flatbuffers::BASE_TYPE_NONE:\n        case flatbuffers::BASE_TYPE_UTYPE:\n        case flatbuffers::BASE_TYPE_STRUCT:\n        case flatbuffers::BASE_TYPE_UNION:\n          if (definition) {\n            // Pick a random previous definition and random data instance of\n            // that definition.\n            int defref = lcg_rand() % definition;\n            int instance = lcg_rand() % instances_per_definition;\n            AddToSchemaAndInstances(\n                (\"D\" + flatbuffers::NumToString(defref)).c_str(),\n                deprecated ? \"\"\n                           : definitions[defref].instances[instance].c_str());\n          } else {\n            // If this is the first definition, we have no definition we can\n            // refer to.\n            Dummy();\n          }\n          break;\n        case flatbuffers::BASE_TYPE_BOOL:\n          AddToSchemaAndInstances(\n              \"bool\", deprecated ? \"\" : (lcg_rand() % 2 ? \"true\" : \"false\"));\n          break;\n        case flatbuffers::BASE_TYPE_ARRAY:\n          if (!is_struct) {\n            AddToSchemaAndInstances(\n                \"ubyte\",\n                deprecated ? \"\" : \"255\");  // No fixed-length arrays in tables.\n          } else {\n            AddToSchemaAndInstances(\"[int:3]\", deprecated ? \"\" : \"[\\n,\\n,\\n]\");\n          }\n          break;\n        default:\n          // All the scalar types.\n          schema += flatbuffers::TypeName(base_type);\n\n          if (!deprecated) {\n            // We want each instance to use its own random value.\n            for (int inst = 0; inst < instances_per_definition; inst++)\n              definitions[definition].instances[inst] +=\n                  flatbuffers::IsFloat(base_type)\n                      ? flatbuffers::NumToString<double>(lcg_rand() % 128)\n                            .c_str()\n                      : flatbuffers::NumToString<int>(lcg_rand() % 128).c_str();\n          }\n      }\n      AddToSchemaAndInstances(deprecated ? \"(deprecated);\\n\" : \";\\n\",\n                              deprecated      ? \"\"\n                              : is_last_field ? \"\\n\"\n                                              : \",\\n\");\n    }\n    AddToSchemaAndInstances(\"}\\n\\n\", \"}\");\n  }\n\n  schema += \"root_type D\" + flatbuffers::NumToString(num_definitions - 1);\n  schema += \";\\n\";\n\n  flatbuffers::Parser parser;\n\n  // Will not compare against the original if we don't write defaults\n  parser.builder_.ForceDefaults(true);\n\n  // Parse the schema, parse the generated data, then generate text back\n  // from the binary and compare against the original.\n  TEST_EQ(parser.Parse(schema.c_str()), true);\n\n  const std::string& json =\n      definitions[num_definitions - 1].instances[0] + \"\\n\";\n\n  TEST_EQ(parser.Parse(json.c_str()), true);\n\n  std::string jsongen;\n  parser.opts.indent_step = 0;\n  auto result = GenText(parser, parser.builder_.GetBufferPointer(), &jsongen);\n  TEST_NULL(result);\n\n  if (jsongen != json) {\n    // These strings are larger than a megabyte, so we show the bytes around\n    // the first bytes that are different rather than the whole string.\n    size_t len = std::min(json.length(), jsongen.length());\n    for (size_t i = 0; i < len; i++) {\n      if (json[i] != jsongen[i]) {\n        i -= std::min(static_cast<size_t>(10), i);  // show some context;\n        size_t end = std::min(len, i + 20);\n        for (; i < end; i++)\n          TEST_OUTPUT_LINE(\"at %d: found \\\"%c\\\", expected \\\"%c\\\"\\n\",\n                           static_cast<int>(i), jsongen[i], json[i]);\n        break;\n      }\n    }\n    TEST_NOTNULL(nullptr);  //-V501 (this comment suppresses CWE-570 warning)\n  }\n\n  // clang-format off\n  #ifdef FLATBUFFERS_TEST_VERBOSE\n    TEST_OUTPUT_LINE(\"%dk schema tested with %dk of json\\n\",\n                     static_cast<int>(schema.length() / 1024),\n                     static_cast<int>(json.length() / 1024));\n  #endif\n  // clang-format on\n}\n\n}  // namespace tests\n}  // namespace flatbuffers\n"
  },
  {
    "path": "tests/fuzz_test.h",
    "content": "#ifndef TESTS_FUZZ_TEST_H\n#define TESTS_FUZZ_TEST_H\n\nnamespace flatbuffers {\nnamespace tests {\n\nvoid FuzzTest1();\nvoid FuzzTest2();\n\n}  // namespace tests\n}  // namespace flatbuffers\n\n#endif\n"
  },
  {
    "path": "tests/fuzzer/.gitignore",
    "content": "# The generated fuzzers\n*_fuzzer\n\n# Findings from the fuzzers\noom-*\nslow-unit-*\ncrash-*\n\n# Individual fuzzer logs if job=N\nfuzz-*.log\n\n.clangd/\n\n# These are copied from tests/annotated_binary/ and should use the latest ones.\nannotated_binary.bfbs\nannotated_binary.bin\n\ntest_64bit.bin\n\nmonster_test.bfbs"
  },
  {
    "path": "tests/fuzzer/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.9)\n\nset(CMAKE_VERBOSE_MAKEFILE ON)\nset(CMAKE_EXPORT_COMPILE_COMMANDS ON)\nset(CMAKE_POSITION_INDEPENDENT_CODE ON)\n\nproject(FlatBuffersFuzzerTests)\n\noption(BUILD_DEBUGGER \"Compile a debugger with main() and without libFuzzer\" OFF)\n\nif(NOT DEFINED FLATBUFFERS_MAX_PARSING_DEPTH)\n  # Force checking of RecursionError in the test\n  set(FLATBUFFERS_MAX_PARSING_DEPTH 24)\nendif()\nmessage(STATUS \"FLATBUFFERS_MAX_PARSING_DEPTH: ${FLATBUFFERS_MAX_PARSING_DEPTH}\")\n\n# Usage '-fsanitize=address' doesn't allowed with '-fsanitize=memory'.\n# MemorySanitizer will not work out-of-the-box, and will instead report false\n# positives coming from uninstrumented code. Need to re-build both C++ standard\n# library: https://github.com/google/sanitizers/wiki/MemorySanitizerLibcxxHowTo\noption(USE_ASAN \"Use fuzzers with ASASN\" OFF)\noption(USE_MSAN \"Use fuzzers with MSASN\" OFF)\noption(OSS_FUZZ \"Set this option to use flags by oss-fuzz\" OFF)\n\n# Use Clang linker.\nset(CMAKE_EXE_LINKER_FLAGS \"${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=lld\")\n\n# add_link_options(-stdlib=libc++)\n\nadd_compile_options(\n  # -stdlib=libc++ # Use Clang libc++ instead of GNU.\n  -std=c++17\n  -Wall\n  -pedantic\n  -Werror\n  -Wextra\n  -Wno-unused-parameter\n  -fsigned-char\n  -fno-omit-frame-pointer\n  -g # Generate source-level debug information\n  # -flto # enable link-time optimisation\n)\n\n# https://llvm.org/docs/Passes.html save IR to see call graph make one bitcode\n# file:> llvm-link *.bc -o out.bc print call-graph:> opt out.bc -analyze -print-\n# callgraph &> callgraph.txt set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -save-temps\n# -flto\")\n\n# A special target with fuzzer+sanitizer flags.\nadd_library(fuzzer_config INTERFACE)\n\ntarget_compile_options(\n  fuzzer_config\n  INTERFACE\n    $<$<NOT:$<BOOL:${OSS_FUZZ}>>:\n      -fsanitize-coverage=trace-cmp\n    >\n    $<$<BOOL:${USE_ASAN}>:\n      -fsanitize=fuzzer,undefined,address\n    >\n    $<$<BOOL:${USE_MSAN}>:\n      -fsanitize=fuzzer,undefined,memory\n      -fsanitize-memory-track-origins=2\n    >\n    $<$<BOOL:${OSS_FUZZ}>:\n      ${CXX}\n      ${CXXFLAGS}\n    >\n)\n\ntarget_link_libraries(\n  fuzzer_config\n  INTERFACE\n    $<$<BOOL:${USE_ASAN}>:\n      -fsanitize=fuzzer,undefined,address\n    >\n    $<$<BOOL:${USE_MSAN}>:\n      -fsanitize=fuzzer,undefined,memory\n    >\n    $<$<BOOL:${OSS_FUZZ}>:\n      $ENV{LIB_FUZZING_ENGINE}\n    >\n)\n\nset(FLATBUFFERS_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/../../\")\n\nset(FlatBuffers_Library_SRCS\n    ${FLATBUFFERS_DIR}/include/flatbuffers/allocator.h\n    ${FLATBUFFERS_DIR}/include/flatbuffers/array.h\n    ${FLATBUFFERS_DIR}/include/flatbuffers/base.h\n    ${FLATBUFFERS_DIR}/include/flatbuffers/buffer.h\n    ${FLATBUFFERS_DIR}/include/flatbuffers/buffer_ref.h\n    ${FLATBUFFERS_DIR}/include/flatbuffers/default_allocator.h\n    ${FLATBUFFERS_DIR}/include/flatbuffers/detached_buffer.h\n    ${FLATBUFFERS_DIR}/include/flatbuffers/flatbuffer_builder.h\n    ${FLATBUFFERS_DIR}/include/flatbuffers/flatbuffers.h\n    ${FLATBUFFERS_DIR}/include/flatbuffers/flexbuffers.h\n    ${FLATBUFFERS_DIR}/include/flatbuffers/flex_flat_util.h\n    ${FLATBUFFERS_DIR}/include/flatbuffers/hash.h\n    ${FLATBUFFERS_DIR}/include/flatbuffers/idl.h\n    ${FLATBUFFERS_DIR}/include/flatbuffers/minireflect.h\n    ${FLATBUFFERS_DIR}/include/flatbuffers/reflection.h\n    ${FLATBUFFERS_DIR}/include/flatbuffers/reflection_generated.h\n    ${FLATBUFFERS_DIR}/include/flatbuffers/registry.h\n    ${FLATBUFFERS_DIR}/include/flatbuffers/stl_emulation.h\n    ${FLATBUFFERS_DIR}/include/flatbuffers/string.h\n    ${FLATBUFFERS_DIR}/include/flatbuffers/struct.h\n    ${FLATBUFFERS_DIR}/include/flatbuffers/table.h\n    ${FLATBUFFERS_DIR}/include/flatbuffers/util.h\n    ${FLATBUFFERS_DIR}/include/flatbuffers/vector.h\n    ${FLATBUFFERS_DIR}/include/flatbuffers/vector_downward.h\n    ${FLATBUFFERS_DIR}/include/flatbuffers/verifier.h\n    ${FLATBUFFERS_DIR}/src/file_manager.cpp\n    ${FLATBUFFERS_DIR}/src/file_name_manager.cpp\n    ${FLATBUFFERS_DIR}/src/idl_parser.cpp\n    ${FLATBUFFERS_DIR}/src/idl_gen_text.cpp\n    ${FLATBUFFERS_DIR}/src/reflection.cpp\n    ${FLATBUFFERS_DIR}/src/binary_annotator.h\n    ${FLATBUFFERS_DIR}/src/binary_annotator.cpp\n    ${FLATBUFFERS_DIR}/src/util.cpp\n    ${FLATBUFFERS_DIR}/tests/test_assert.cpp\n    ${FLATBUFFERS_DIR}/tests/64bit/test_64bit_bfbs_generated.h\n)\n\nset(FlatBuffers_Compiler_SRCS\n  ${FLATBUFFERS_DIR}/src/idl_gen_binary.cpp\n  ${FLATBUFFERS_DIR}/src/idl_gen_text.cpp\n  ${FLATBUFFERS_DIR}/src/idl_gen_cpp.cpp\n  ${FLATBUFFERS_DIR}/src/idl_gen_csharp.cpp\n  ${FLATBUFFERS_DIR}/src/idl_gen_dart.cpp\n  ${FLATBUFFERS_DIR}/src/idl_gen_kotlin.cpp\n  ${FLATBUFFERS_DIR}/src/idl_gen_kotlin_kmp.cpp\n  ${FLATBUFFERS_DIR}/src/idl_gen_go.cpp\n  ${FLATBUFFERS_DIR}/src/idl_gen_java.cpp\n  ${FLATBUFFERS_DIR}/src/idl_gen_ts.cpp\n  ${FLATBUFFERS_DIR}/src/idl_gen_php.cpp\n  ${FLATBUFFERS_DIR}/src/idl_gen_python.cpp\n  ${FLATBUFFERS_DIR}/src/idl_gen_lobster.cpp\n  ${FLATBUFFERS_DIR}/src/idl_gen_rust.cpp\n  ${FLATBUFFERS_DIR}/src/idl_gen_fbs.cpp\n  ${FLATBUFFERS_DIR}/src/idl_gen_grpc.cpp\n  ${FLATBUFFERS_DIR}/src/idl_gen_json_schema.cpp\n  ${FLATBUFFERS_DIR}/src/idl_gen_swift.cpp\n  ${FLATBUFFERS_DIR}/src/file_manager.cpp\n  ${FLATBUFFERS_DIR}/src/file_name_manager.cpp\n  ${FLATBUFFERS_DIR}/src/idl_namer.h\n  ${FLATBUFFERS_DIR}/src/namer.h\n  ${FLATBUFFERS_DIR}/src/flatc.cpp\n  # ${FLATBUFFERS_DIR}/src/flatc_main.cpp\n  ${FLATBUFFERS_DIR}/src/bfbs_gen.h\n  ${FLATBUFFERS_DIR}/src/bfbs_gen_lua.h\n  ${FLATBUFFERS_DIR}/src/bfbs_gen_nim.h\n  ${FLATBUFFERS_DIR}/src/bfbs_namer.h\n  ${FLATBUFFERS_DIR}/include/codegen/idl_namer.h\n  ${FLATBUFFERS_DIR}/include/codegen/namer.h\n  ${FLATBUFFERS_DIR}/include/codegen/python.h\n  ${FLATBUFFERS_DIR}/include/codegen/python.cc\n  ${FLATBUFFERS_DIR}/include/flatbuffers/code_generators.h\n  ${FLATBUFFERS_DIR}/src/binary_annotator.h\n  ${FLATBUFFERS_DIR}/src/binary_annotator.cpp\n  ${FLATBUFFERS_DIR}/src/annotated_binary_text_gen.h\n  ${FLATBUFFERS_DIR}/src/annotated_binary_text_gen.cpp\n  ${FLATBUFFERS_DIR}/src/bfbs_gen_lua.cpp\n  ${FLATBUFFERS_DIR}/src/bfbs_gen_nim.cpp\n  ${FLATBUFFERS_DIR}/src/code_generators.cpp\n  ${FLATBUFFERS_DIR}/grpc/src/compiler/schema_interface.h\n  ${FLATBUFFERS_DIR}/grpc/src/compiler/cpp_generator.h\n  ${FLATBUFFERS_DIR}/grpc/src/compiler/cpp_generator.cc\n  ${FLATBUFFERS_DIR}/grpc/src/compiler/go_generator.h\n  ${FLATBUFFERS_DIR}/grpc/src/compiler/go_generator.cc\n  ${FLATBUFFERS_DIR}/grpc/src/compiler/java_generator.h\n  ${FLATBUFFERS_DIR}/grpc/src/compiler/java_generator.cc\n  ${FLATBUFFERS_DIR}/grpc/src/compiler/python_generator.h\n  ${FLATBUFFERS_DIR}/grpc/src/compiler/python_generator.cc\n  ${FLATBUFFERS_DIR}/grpc/src/compiler/swift_generator.h\n  ${FLATBUFFERS_DIR}/grpc/src/compiler/swift_generator.cc\n  ${FLATBUFFERS_DIR}/grpc/src/compiler/ts_generator.h\n  ${FLATBUFFERS_DIR}/grpc/src/compiler/ts_generator.cc\n)\n\ninclude_directories(${FLATBUFFERS_DIR}/include)\ninclude_directories(${FLATBUFFERS_DIR}/tests)\ninclude_directories(${FLATBUFFERS_DIR}/src)\ninclude_directories(${FLATBUFFERS_DIR}/grpc)\n\nadd_library(flatbuffers_fuzzed STATIC ${FlatBuffers_Library_SRCS})\n# Use PUBLIC to force 'fuzzer_config' for all dependent targets\ntarget_link_libraries(flatbuffers_fuzzed PUBLIC fuzzer_config)\n\n# FLATBUFFERS_ASSERT should assert in Release as well. Redefine\n# FLATBUFFERS_ASSERT macro definition. Declare as PUBLIC to cover asserts in all\n# included header files.\ntarget_compile_definitions(\n  flatbuffers_fuzzed\n  PUBLIC\n    FLATBUFFERS_ASSERT=fuzzer_assert_impl\n    FLATBUFFERS_ASSERT_INCLUDE=\"${CMAKE_CURRENT_SOURCE_DIR}/fuzzer_assert.h\"\n  PRIVATE\n    FLATBUFFERS_MAX_PARSING_DEPTH=${FLATBUFFERS_MAX_PARSING_DEPTH}\n)\n\n# Setup fuzzer tests.\n\nadd_executable(scalar_fuzzer flatbuffers_scalar_fuzzer.cc)\ntarget_link_libraries(scalar_fuzzer PRIVATE flatbuffers_fuzzed)\n\nadd_executable(parser_fuzzer flatbuffers_parser_fuzzer.cc)\ntarget_link_libraries(parser_fuzzer PRIVATE flatbuffers_fuzzed)\n\nadd_executable(verifier_fuzzer flatbuffers_verifier_fuzzer.cc)\ntarget_link_libraries(verifier_fuzzer PRIVATE flatbuffers_fuzzed)\n\nadd_executable(flexverifier_fuzzer flexbuffers_verifier_fuzzer.cc)\ntarget_link_libraries(flexverifier_fuzzer PRIVATE flatbuffers_fuzzed)\n\nadd_executable(monster_fuzzer flatbuffers_monster_fuzzer.cc)\ntarget_link_libraries(monster_fuzzer PRIVATE flatbuffers_fuzzed)\n\nadd_executable(codegen_fuzzer flatbuffers_codegen_fuzzer.cc ${FlatBuffers_Compiler_SRCS})\ntarget_link_libraries(codegen_fuzzer PRIVATE flatbuffers_fuzzed)\ntarget_compile_definitions(codegen_fuzzer PRIVATE assert=fuzzer_assert_impl)\n\nadd_custom_command(\n  TARGET monster_fuzzer PRE_BUILD\n  COMMAND ${CMAKE_COMMAND} -E copy\n  ${CMAKE_SOURCE_DIR}/../monster_test.bfbs\n  ${CMAKE_CURRENT_BINARY_DIR}/monster_test.bfbs)\n\nadd_executable(annotator_fuzzer flatbuffers_annotator_fuzzer.cc)\ntarget_link_libraries(annotator_fuzzer PRIVATE flatbuffers_fuzzed)\nadd_custom_command(\n  TARGET annotator_fuzzer PRE_BUILD\n\n  COMMAND ${CMAKE_COMMAND} -E copy\n  ${CMAKE_SOURCE_DIR}/../annotated_binary/annotated_binary.bfbs\n  ${CMAKE_CURRENT_BINARY_DIR}/annotated_binary.bfbs\n\n  COMMAND ${CMAKE_COMMAND} -E copy\n  ${CMAKE_SOURCE_DIR}/../annotated_binary/annotated_binary.bin\n  ${CMAKE_CURRENT_BINARY_DIR}/seed_annotator/annotated_binary.bin\n)\n\nadd_executable(64bit_fuzzer flatbuffers_64bit_fuzzer.cc)\ntarget_link_libraries(64bit_fuzzer PRIVATE flatbuffers_fuzzed)\nadd_custom_command(\n  TARGET 64bit_fuzzer PRE_BUILD\n\n  COMMAND ${CMAKE_COMMAND} -E copy\n  ${CMAKE_SOURCE_DIR}/../64bit/test_64bit.bin\n  ${CMAKE_CURRENT_BINARY_DIR}/seed_64bit/test_64bit.bin\n)\n\n# Build debugger for weird cases found with fuzzer.\nif(BUILD_DEBUGGER)\n  add_library(flatbuffers_nonfuzz STATIC ${FlatBuffers_Library_SRCS})\n  target_compile_options(\n    flatbuffers_nonfuzz\n    PUBLIC\n      $<$<BOOL:${USE_ASAN}>:\n        -fsanitize=undefined,address\n      >\n      -fno-limit-debug-info\n  )\n\n  target_link_libraries(\n    flatbuffers_nonfuzz\n    PUBLIC\n      $<$<BOOL:${USE_ASAN}>:\n        -fsanitize=undefined,address\n      >\n  )\n\n  target_compile_definitions(\n    flatbuffers_nonfuzz\n    PUBLIC\n      FLATBUFFERS_ASSERT=fuzzer_assert_impl\n      FLATBUFFERS_ASSERT_INCLUDE=\"${CMAKE_CURRENT_SOURCE_DIR}/fuzzer_assert.h\"\n    PRIVATE\n      FLATBUFFERS_MAX_PARSING_DEPTH=${FLATBUFFERS_MAX_PARSING_DEPTH}\n  )\n  add_executable(scalar_debug\n    flatbuffers_scalar_fuzzer.cc\n    scalar_debug.cpp\n  )\n  target_link_libraries(scalar_debug PRIVATE flatbuffers_nonfuzz)\n\n  add_executable(monster_debug\n    flatbuffers_monster_fuzzer.cc\n    monster_debug.cpp\n  )\n  target_link_libraries(monster_debug PRIVATE flatbuffers_nonfuzz)\n  add_custom_command(\n    TARGET monster_debug PRE_BUILD\n    COMMAND ${CMAKE_COMMAND} -E copy\n    ${CMAKE_SOURCE_DIR}/../monster_test.bfbs\n    ${CMAKE_CURRENT_BINARY_DIR}/monster_test.bfbs)\n\nendif(BUILD_DEBUGGER)\n"
  },
  {
    "path": "tests/fuzzer/codegen_json.dict",
    "content": "\"struct\"\n\"table\"\n\"enum\"\n\"union\"\n\"include\"\n\"namespace\"\n\"attribute\"\n\"null\"\n\"NULL\"\n\"byte\"\n\"int8\"\n\"ubyte\"\n\"uint8\"\n\"bool\"\n\"short\"\n\"int16\"\n\"ushort\"\n\"uint16\"\n\"int\"\n\"int32\"\n\"uint\"\n\"uint32\"\n\"float\"\n\"float32\"\n\"long\"\n\"int64\"\n\"ulong\"\n\"uint64\"\n\"double\"\n\"float64\"\n\"root_type\"\n\"file_identifier\"\n\"file_extension\"\n\"rpc_service\"\n\"streaming\"\n\"idempotent\"\n\"key\"\n\"hash\"\n\"fnv1_32\"\n\"fnv1_64\"\n\"fnv1a_32\"\n\"fnv1a_64\"\n\"deprecated\"\n\"required\"\n\"nested_flatbuffer\"\n\"flexbuffer\"\n\"native_inline\"\n\"force_align\"\n\"bit_flags\"\n\"csharp_partial\"\n\"private\"\n\"cpp_type\"\n\"cpp_ptr_type\"\n\"cpp_ptr_type_get\"\n\"{\"\n\"}\"\n\"[\"\n\"]\"\n\"\\\"\"\n\"'\"\n\"\\\\\"\n\"//\"\n\":\"\n\",\"\n\" \"\n\"\\\\n\"\n\"\\\\r\"\n\"/*\"\n\"*/\"\n\"true\"\n\"false\"\n\"null\"\n\"\\\\u\"\n\"\\\\b\"\n\"\\\\f\"\n\"\\\\t\"\n\".\"\n\"e\"\n\"e+\"\n\"e-\"\n\"E\"\n\"E+\"\n\"E-\"\n\"0x\"\n\"p\"\n\"a\"\n\"b\"\n\"Monster\"\n\"pos\"\n\"hp\"\n\"name\"\n\"weapons\"\n\"damage\"\n\"equipped_type\"\n\"equipped\"\n\"inventory\"\n\"vector_of_longs\"\n\"vector_of_doubles\"\n\"test_type\"\n\"test\"\n\"test1\"\n\"test2\"\n\"test4\"\n\"test3\"\n\"test5\"\n\"enemy\"\n\"Weapon\"\n\"Green\"\n\"Red\"\n\"Blue\"\n\"testarrayofstring\"\n\"testarrayofbools\"\n\"testbool\"\n\"flex\"\n\"Color\"\n\"Vec3\"\n\"Stat\"\n\"Referrable\"\n\"Any\"\n\"TestSimpleTableWithEnum\"\n\"Race\"\n\"LongEnum\"\n\"Test\"\n\"Ability\"\n\"StructOfStructs\"\n\"StructOfStructsOfStructs\"\n\"TypeAliases\"\n\"MonsterStorage\"\n\"Store\"\n\"Retrieve\"\n\"GetMaxHitPoint\"\n\"GetMinMaxHitPoints\""
  },
  {
    "path": "tests/fuzzer/flatbuffers_64bit_fuzzer.cc",
    "content": "#include <cstdint>\n#include <filesystem>\n#include <type_traits>\n\n#include \"64bit/test_64bit_bfbs_generated.h\"\n#include \"64bit/test_64bit_generated.h\"\n#include \"flatbuffers/base.h\"\n#include \"flatbuffers/flatbuffer_builder.h\"\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/reflection.h\"\n#include \"flatbuffers/verifier.h\"\n#include \"test_assert.h\"\n#include \"test_init.h\"\n\nOneTimeTestInit OneTimeTestInit::one_time_init_;\n\nstatic RootTableBinarySchema schema;\n\nstatic constexpr uint8_t flags_sized_prefixed = 0b00000001;\n\nstatic const uint64_t kFnvPrime = 0x00000100000001b3ULL;\nstatic const uint64_t kOffsetBasis = 0xcbf29ce484222645ULL;\n\nnamespace flatbuffers {\n\ntemplate <typename T, typename = std::enable_if_t<std::is_integral_v<T>>>\nuint64_t Hash(T value, uint64_t hash) {\n  return (hash * kFnvPrime) ^ value;\n}\n\nuint64_t Hash(double value, uint64_t hash) {\n  static_assert(sizeof(double) == sizeof(uint64_t));\n  return (hash * kFnvPrime) ^ static_cast<uint64_t>(value);\n}\n\nuint64_t Hash(const flatbuffers::String* value, uint64_t hash) {\n  if (value == nullptr) {\n    return hash * kFnvPrime;\n  }\n  for (auto& c : value->str()) {\n    hash = Hash(static_cast<uint8_t>(c), hash);\n  }\n  return hash;\n}\n\nuint64_t Hash(const LeafStruct* value, uint64_t hash) {\n  if (value == nullptr) {\n    return hash * kFnvPrime;\n  }\n  hash = Hash(value->a(), hash);\n  hash = Hash(value->b(), hash);\n  return hash;\n}\n\ntemplate <typename T>\nuint64_t Hash(const Vector<T>* value, uint64_t hash) {\n  if (value == nullptr) {\n    return hash * kFnvPrime;\n  }\n  for (const T c : *value) {\n    hash = Hash(c, hash);\n  }\n  return hash;\n}\n\ntemplate <typename T>\nuint64_t Hash(const Vector64<T>* value, uint64_t hash) {\n  if (value == nullptr) {\n    return hash * kFnvPrime;\n  }\n  for (const T c : *value) {\n    hash = Hash(c, hash);\n  }\n  return hash;\n}\n\nuint64_t Hash(const RootTable* value, uint64_t hash) {\n  if (value == nullptr) {\n    return hash * kFnvPrime;\n  }\n  // Hash all the fields so we can exercise all parts of the code.\n  hash = Hash(value->far_vector(), hash);\n  hash = Hash(value->a(), hash);\n  hash = Hash(value->far_string(), hash);\n  hash = Hash(value->big_vector(), hash);\n  hash = Hash(value->near_string(), hash);\n  hash = Hash(value->nested_root(), hash);\n  hash = Hash(value->far_struct_vector(), hash);\n  hash = Hash(value->big_struct_vector(), hash);\n  return hash;\n}\n\nstatic int AccessBuffer(const uint8_t* data, size_t size,\n                        bool is_size_prefixed) {\n  const RootTable* root_table =\n      is_size_prefixed ? GetSizePrefixedRootTable(data) : GetRootTable(data);\n  TEST_NOTNULL(root_table);\n\n  uint64_t hash = kOffsetBasis;\n  hash = Hash(root_table, hash);\n  hash = Hash(root_table->nested_root_nested_root(), hash);\n\n  return 0;\n}\n\nextern \"C\" int LLVMFuzzerInitialize(int*, char*** argv) {\n  Verifier verifier(schema.begin(), schema.size());\n  TEST_EQ(true, reflection::VerifySchemaBuffer(verifier));\n\n  return 0;\n}\n\nextern \"C\" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {\n  if (size < FLATBUFFERS_MIN_BUFFER_SIZE) {\n    return 0;\n  }\n\n  // Take the first bit of data as a flag to control things.\n  const uint8_t flags = data[0];\n  data++;\n  size--;\n\n  Verifier::Options options;\n  options.assert = true;\n  options.check_alignment = true;\n  options.check_nested_flatbuffers = true;\n\n  Verifier verifier(data, size, options);\n\n  const bool is_size_prefixed = flags & flags_sized_prefixed;\n\n  // Filter out data that isn't valid.\n  if ((is_size_prefixed && !VerifySizePrefixedRootTableBuffer(verifier)) ||\n      !VerifyRootTableBuffer(verifier)) {\n    return 0;\n  }\n\n  return AccessBuffer(data, size, is_size_prefixed);\n}\n\n}  // namespace flatbuffers"
  },
  {
    "path": "tests/fuzzer/flatbuffers_annotator_fuzzer.cc",
    "content": "\n#include <filesystem>\n#include <string>\n\n#include \"binary_annotator.h\"\n#include \"test_init.h\"\n\nstatic std::filesystem::path exe_path_;\nstatic const uint8_t* schema_bfbs_;\nstatic size_t schema_bfbs_length_;\n\nbool TestFileExists(std::filesystem::path file_path) {\n  if (file_path.has_filename() && std::filesystem::exists(file_path))\n    return true;\n\n  TEST_OUTPUT_LINE(\"@DEBUG: file '%s' not found\", file_path.string().c_str());\n  for (const auto& entry :\n       std::filesystem::directory_iterator(file_path.parent_path())) {\n    TEST_OUTPUT_LINE(\"@DEBUG: parent path entry: '%s'\",\n                     entry.path().string().c_str());\n  }\n  return false;\n}\n\nstd::string LoadBinarySchema(const char* file_name) {\n  const auto file_path = exe_path_.parent_path() / file_name;\n  TEST_EQ(true, TestFileExists(file_path));\n  std::string schemafile;\n  TEST_EQ(true,\n          flatbuffers::LoadFile(file_path.string().c_str(), true, &schemafile));\n\n  flatbuffers::Verifier verifier(\n      reinterpret_cast<const uint8_t*>(schemafile.c_str()), schemafile.size());\n  TEST_EQ(true, reflection::VerifySchemaBuffer(verifier));\n  return schemafile;\n}\n\nextern \"C\" int LLVMFuzzerInitialize(int*, char*** argv) {\n  exe_path_ = (*argv)[0];\n  static const std::string schema_file =\n      LoadBinarySchema(\"annotated_binary.bfbs\");\n  schema_bfbs_ = reinterpret_cast<const uint8_t*>(schema_file.c_str());\n  schema_bfbs_length_ = schema_file.size();\n  return 0;\n}\n\nextern \"C\" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {\n  flatbuffers::BinaryAnnotator annotator(schema_bfbs_, schema_bfbs_length_,\n                                         data, size, false);\n\n  annotator.Annotate();\n  return 0;\n}"
  },
  {
    "path": "tests/fuzzer/flatbuffers_codegen_fuzzer.cc",
    "content": "#include <bfbs_gen_lua.h>\n#include <bfbs_gen_nim.h>\n#include <flatbuffers/flatc.h>\n#include <idl_gen_binary.h>\n#include <idl_gen_csharp.h>\n#include <idl_gen_dart.h>\n#include <idl_gen_fbs.h>\n#include <idl_gen_go.h>\n#include <idl_gen_java.h>\n#include <idl_gen_json_schema.h>\n#include <idl_gen_kotlin.h>\n#include <idl_gen_lobster.h>\n#include <idl_gen_php.h>\n#include <idl_gen_python.h>\n#include <idl_gen_rust.h>\n#include <idl_gen_swift.h>\n#include <idl_gen_text.h>\n#include <idl_gen_ts.h>\n#include <stddef.h>\n#include <stdint.h>\n\n#include <iostream>\n#include <memory>\n#include <string>\n\n#include \"flatbuffers/code_generator.h\"\n#include \"flatbuffers/idl.h\"  // For Parser and generation functions\n#include \"idl_gen_cpp.h\"      // For C++ generator\n#include \"test_init.h\"\n\nstatic constexpr size_t kMinInputLength = 1;\nstatic constexpr size_t kMaxInputLength = 16384;\n\nstatic constexpr uint8_t flags_strict_json = 0x80;\nstatic constexpr uint8_t flags_skip_unexpected_fields_in_json = 0x40;\nstatic constexpr uint8_t flags_allow_non_utf8 = 0x20;\n\n// Utility for test run.\nOneTimeTestInit OneTimeTestInit::one_time_init_;\n\nstatic const char* g_program_name = nullptr;\n\nstatic void Warn(const flatbuffers::FlatCompiler* flatc,\n                 const std::string& warn, bool show_exe_name) {\n  (void)flatc;\n  if (show_exe_name) {\n    printf(\"%s: \", g_program_name);\n  }\n  fprintf(stderr, \"\\nwarning:\\n  %s\\n\\n\", warn.c_str());\n}\n\nstatic void Error(const flatbuffers::FlatCompiler* flatc,\n                  const std::string& err, bool usage, bool show_exe_name) {\n  if (show_exe_name) {\n    printf(\"%s: \", g_program_name);\n  }\n  if (usage && flatc) {\n    fprintf(stderr, \"%s\\n\", flatc->GetShortUsageString(g_program_name).c_str());\n  }\n  fprintf(stderr, \"\\nerror:\\n  %s\\n\\n\", err.c_str());\n  exit(1);\n}\n\nnamespace flatbuffers {\nvoid LogCompilerWarn(const std::string& warn) {\n  Warn(static_cast<const flatbuffers::FlatCompiler*>(nullptr), warn, true);\n}\nvoid LogCompilerError(const std::string& err) {\n  Error(static_cast<const flatbuffers::FlatCompiler*>(nullptr), err, false,\n        true);\n}\n}  // namespace flatbuffers\n\nextern \"C\" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {\n  // Reserve one byte for Parser flags and one byte for repetition counter.\n  if (size < 3) return 0;\n  const uint8_t flags = data[0];\n  (void)data[1];  //  reserved\n  data += 2;\n  size -= 2;  // bypass\n\n  const std::string original(reinterpret_cast<const char*>(data), size);\n  auto input = std::string(original.c_str());  // until '\\0'\n  if (input.size() < kMinInputLength || input.size() > kMaxInputLength)\n    return 0;\n\n  flatbuffers::IDLOptions opts;\n  opts.strict_json = (flags & flags_strict_json);\n  opts.skip_unexpected_fields_in_json =\n      (flags & flags_skip_unexpected_fields_in_json);\n  opts.allow_non_utf8 = (flags & flags_allow_non_utf8);\n\n  flatbuffers::Parser parser(opts);\n\n  // Guarantee 0-termination in the input.\n  auto parse_input = input.c_str();\n\n  // Parse the input schema\n  if (parser.Parse(parse_input)) {\n    parser.Serialize();\n    const uint8_t* buf = parser.builder_.GetBufferPointer();\n    flatbuffers::Verifier verifier(buf, parser.builder_.GetSize());\n    TEST_EQ(true, reflection::VerifySchemaBuffer(verifier));\n\n    auto root = flatbuffers::GetRoot<flatbuffers::Table>(buf);\n    if (verifier.VerifyTableStart(buf) && root->VerifyTableStart(verifier)) {\n      if (parser.root_struct_def_) {\n        std::string json_output;\n        flatbuffers::GenText(parser, parser.builder_.GetBufferPointer(),\n                             &json_output);\n      }\n    }\n\n    std::string temp_filename = \"fuzzer_generated\";\n\n    const std::string flatbuffers_version(flatbuffers::FLATBUFFERS_VERSION());\n    std::vector<std::unique_ptr<flatbuffers::CodeGenerator>> generators;\n    generators.emplace_back(flatbuffers::NewBinaryCodeGenerator());\n    generators.emplace_back(flatbuffers::NewCppCodeGenerator());\n    generators.emplace_back(flatbuffers::NewCSharpCodeGenerator());\n    generators.emplace_back(flatbuffers::NewDartCodeGenerator());\n    generators.emplace_back(flatbuffers::NewFBSCodeGenerator());\n    generators.emplace_back(flatbuffers::NewGoCodeGenerator());\n    generators.emplace_back(flatbuffers::NewJavaCodeGenerator());\n    generators.emplace_back(flatbuffers::NewJsonSchemaCodeGenerator());\n    generators.emplace_back(flatbuffers::NewKotlinCodeGenerator());\n    generators.emplace_back(flatbuffers::NewKotlinKMPCodeGenerator());\n    generators.emplace_back(flatbuffers::NewLobsterCodeGenerator());\n    generators.emplace_back(\n        flatbuffers::NewLuaBfbsGenerator(flatbuffers_version));\n    generators.emplace_back(\n        flatbuffers::NewNimBfbsGenerator(flatbuffers_version));\n    generators.emplace_back(flatbuffers::NewPythonCodeGenerator());\n    generators.emplace_back(flatbuffers::NewPhpCodeGenerator());\n    generators.emplace_back(flatbuffers::NewRustCodeGenerator());\n    generators.emplace_back(flatbuffers::NewTextCodeGenerator());\n    generators.emplace_back(flatbuffers::NewSwiftCodeGenerator());\n    generators.emplace_back(flatbuffers::NewTsCodeGenerator());\n\n    for (auto& gen : generators) {\n      auto p = gen.get();\n      std::string temp_path = \"/tmp/\";\n      auto status = p->GenerateCode(parser, temp_path, \"fuzzer_generated\");\n      if (status != flatbuffers::CodeGenerator::Status::OK) {\n        TEST_OUTPUT_LINE(\"GenerateCode failed %d\", status);\n      }\n\n      // test gRPC code generation\n      auto grpc_status =\n          p->GenerateGrpcCode(parser, temp_path, \"fuzzer_generated\");\n      if (grpc_status != flatbuffers::CodeGenerator::Status::OK) {\n        TEST_OUTPUT_LINE(\"GenerateGrpcCode failed %d\", grpc_status);\n      }\n    }\n  }\n\n  return 0;\n}\n"
  },
  {
    "path": "tests/fuzzer/flatbuffers_monster_fuzzer.cc",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include <stddef.h>\n#include <stdint.h>\n\n#include <clocale>\n#include <filesystem>\n#include <string>\n\n#include \"cpp17/generated_cpp17/monster_test_generated.h\"\n#include \"flatbuffers/idl.h\"\n#include \"test_assert.h\"\n#include \"test_init.h\"\n\nnamespace fs = std::filesystem;\n\n// Utility for test run.\nOneTimeTestInit OneTimeTestInit::one_time_init_;\n// The current executable path (see LLVMFuzzerInitialize).\nstatic fs::path exe_path_;\n\nstatic flatbuffers::Parser parser_;\n\nnamespace {\n\nstatic constexpr size_t kMinInputLength = 1;\nstatic constexpr size_t kMaxInputLength = 16384;\n\nstatic constexpr uint8_t flags_strict_json = 0x80;\nstatic constexpr uint8_t flags_skip_unexpected_fields_in_json = 0x40;\nstatic constexpr uint8_t flags_allow_non_utf8 = 0x20;\n\nbool TestFileExists(fs::path file_path) {\n  if (file_path.has_filename() && fs::exists(file_path)) return true;\n\n  TEST_OUTPUT_LINE(\"@DEBUG: file '%s' not found\", file_path.string().c_str());\n  for (const auto& entry : fs::directory_iterator(file_path.parent_path())) {\n    TEST_OUTPUT_LINE(\"@DEBUG: parent path entry: '%s'\",\n                     entry.path().string().c_str());\n  }\n  return false;\n}\n\nstd::string LoadBinarySchema(const char* file_name) {\n  const auto file_path = exe_path_.parent_path() / file_name;\n  TEST_EQ(true, TestFileExists(file_path));\n  std::string schemafile;\n  TEST_EQ(true,\n          flatbuffers::LoadFile(file_path.string().c_str(), true, &schemafile));\n\n  flatbuffers::Verifier verifier(\n      reinterpret_cast<const uint8_t*>(schemafile.c_str()), schemafile.size());\n  TEST_EQ(true, reflection::VerifySchemaBuffer(verifier));\n  return schemafile;\n}\n\nstd::string do_test(const flatbuffers::IDLOptions& opts,\n                    const std::string input_json, const bool check_parser) {\n  // (re)define parser options\n  parser_.opts = opts;\n\n  std::string jsongen;\n  if (parser_.ParseJson(input_json.c_str())) {\n    flatbuffers::Verifier verifier(parser_.builder_.GetBufferPointer(),\n                                   parser_.builder_.GetSize());\n    TEST_EQ(true, MyGame::Example::VerifyMonsterBuffer(verifier));\n    TEST_NULL(GenText(parser_, parser_.builder_.GetBufferPointer(), &jsongen));\n  } else if (check_parser) {\n    TEST_OUTPUT_LINE(\"parser failed with JSON:\\n%s\", input_json.c_str());\n    TEST_EQ_STR(\"\", parser_.error_.c_str());\n    TEST_ASSERT(false);\n  }\n  return jsongen;\n};\n}  // namespace\n\n// https://google.github.io/oss-fuzz/further-reading/fuzzer-environment/\n// Current working directory\n// You should not make any assumptions about the current working directory of\n// your fuzz target. If you need to load data files, please use argv[0] to get\n// the directory where your fuzz target executable is located.\n// You must not modify argv[0].\nextern \"C\" int LLVMFuzzerInitialize(int* argc, char*** argv) {\n  (void)argc;\n  exe_path_ = (*argv)[0];\n\n  static const std::string schemafile = LoadBinarySchema(\"monster_test.bfbs\");\n  // parse schema first, so we can use it to parse the data after\n  parser_.Deserialize(reinterpret_cast<const uint8_t*>(schemafile.c_str()),\n                      schemafile.size());\n  return 0;\n}\n\nextern \"C\" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {\n  // Reserve one byte for Parser flags and one byte for repetition counter.\n  if (size < 3) return 0;\n  const uint8_t flags = data[0];\n  (void)data[1];  //  reserved\n  data += 2;\n  size -= 2;  // bypass\n\n  const std::string original(reinterpret_cast<const char*>(data), size);\n  auto input = std::string(original.c_str());  // until '\\0'\n  if (input.size() < kMinInputLength || input.size() > kMaxInputLength)\n    return 0;\n\n  flatbuffers::IDLOptions opts;\n  opts.strict_json = (flags & flags_strict_json);\n  opts.skip_unexpected_fields_in_json =\n      (flags & flags_skip_unexpected_fields_in_json);\n  opts.allow_non_utf8 = (flags & flags_allow_non_utf8);\n\n  do {\n    const std::string jsongen_1 = do_test(opts, input, false);\n    if (!jsongen_1.empty()) {\n      const std::string jsongen_2 = do_test(opts, jsongen_1, true);\n      if (jsongen_1 != jsongen_2 && !opts.output_default_scalars_in_json) {\n        // This gets tricky when the jsongen_1 includes a default-value, as the\n        // generated jsongen_2 doesn't emit default-values. So enable default\n        // scalars and re-run it.\n        opts.output_default_scalars_in_json = true;\n        continue;\n      }\n      TEST_EQ(jsongen_1, jsongen_2);\n    }\n  } while (0);\n\n  return 0;\n}\n"
  },
  {
    "path": "tests/fuzzer/flatbuffers_parser_fuzzer.cc",
    "content": "// Copyright 2015 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n#include <stddef.h>\n#include <stdint.h>\n\n#include <clocale>\n#include <string>\n\n#include \"flatbuffers/idl.h\"\n#include \"test_init.h\"\n\nstatic constexpr size_t kMinInputLength = 1;\nstatic constexpr size_t kMaxInputLength = 16384;\n\nstatic constexpr uint8_t flags_strict_json = 0x80;\nstatic constexpr uint8_t flags_skip_unexpected_fields_in_json = 0x40;\nstatic constexpr uint8_t flags_allow_non_utf8 = 0x20;\n\n// Utility for test run.\nOneTimeTestInit OneTimeTestInit::one_time_init_;\n\nextern \"C\" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {\n  // Reserve one byte for Parser flags and one byte for repetition counter.\n  if (size < 3) return 0;\n  const uint8_t flags = data[0];\n  (void)data[1];  //  reserved\n  data += 2;\n  size -= 2;  // bypass\n\n  const std::string original(reinterpret_cast<const char*>(data), size);\n  auto input = std::string(original.c_str());  // until '\\0'\n  if (input.size() < kMinInputLength || input.size() > kMaxInputLength)\n    return 0;\n\n  flatbuffers::IDLOptions opts;\n  opts.strict_json = (flags & flags_strict_json);\n  opts.skip_unexpected_fields_in_json =\n      (flags & flags_skip_unexpected_fields_in_json);\n  opts.allow_non_utf8 = (flags & flags_allow_non_utf8);\n\n  flatbuffers::Parser parser(opts);\n\n  // Guarantee 0-termination in the input.\n  auto parse_input = input.c_str();\n\n  // Check Parser.\n  auto result = parser.Parse(parse_input);\n  if (result) {\n    parser.Serialize();\n    const uint8_t* buf = parser.builder_.GetBufferPointer();\n    flatbuffers::Verifier verifier(buf, parser.builder_.GetSize());\n    TEST_EQ(true, reflection::VerifySchemaBuffer(verifier));\n\n    auto root = flatbuffers::GetRoot<flatbuffers::Table>(buf);\n    if (verifier.VerifyTableStart(buf) && root->VerifyTableStart(verifier)) {\n      if (parser.root_struct_def_) {\n        std::string json_output;\n        flatbuffers::GenText(parser, buf, &json_output);\n      }\n    }\n  }\n  return 0;\n}\n"
  },
  {
    "path": "tests/fuzzer/flatbuffers_scalar_fuzzer.cc",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include <assert.h>\n#include <stddef.h>\n#include <stdint.h>\n\n#include <algorithm>\n#include <clocale>\n#include <memory>\n#include <regex>\n#include <string>\n\n#include \"flatbuffers/idl.h\"\n#include \"test_init.h\"\n\nstatic constexpr size_t kMinInputLength = 1;\nstatic constexpr size_t kMaxInputLength = 3000;\n\nstatic constexpr uint8_t flags_scalar_type = 0x0F;  // type of scalar value\nstatic constexpr uint8_t flags_quotes_kind = 0x10;  // quote \" or '\n// reserved for future: json {named} or [unnamed]\n// static constexpr uint8_t flags_json_bracer = 0x20;\n\n// Find all 'subj' sub-strings and replace first character of sub-string.\n// BreakSequence(\"testest\",\"tes\", 'X') -> \"XesXest\".\n// BreakSequence(\"xxx\",\"xx\", 'Y') -> \"YYx\".\nstatic void BreakSequence(std::string& s, const char* subj, char repl) {\n  size_t pos = 0;\n  while (pos = s.find(subj, pos), pos != std::string::npos) {\n    s.at(pos) = repl;\n    pos++;\n  }\n}\n\n// Remove all leading and trailing symbols matched with pattern set.\n// StripString(\"xy{xy}y\", \"xy\") -> \"{xy}\"\nstatic std::string StripString(const std::string& s, const char* pattern,\n                               size_t* pos = nullptr) {\n  if (pos) *pos = 0;\n  // leading\n  auto first = s.find_first_not_of(pattern);\n  if (std::string::npos == first) return \"\";\n  if (pos) *pos = first;\n  // trailing\n  auto last = s.find_last_not_of(pattern);\n  assert(last < s.length());\n  assert(first <= last);\n  return s.substr(first, last - first + 1);\n}\n\nclass RegexMatcher {\n protected:\n  virtual bool MatchNumber(const std::string& input) const = 0;\n\n public:\n  virtual ~RegexMatcher() = default;\n\n  struct MatchResult {\n    size_t pos{0};\n    size_t len{0};\n    bool res{false};\n    bool quoted{false};\n  };\n\n  MatchResult Match(const std::string& input) const {\n    MatchResult r;\n    // strip leading and trailing \"spaces\" accepted by flatbuffer\n    auto test = StripString(input, \"\\t\\r\\n \", &r.pos);\n    r.len = test.size();\n    // check quotes\n    if (test.size() >= 2) {\n      auto fch = test.front();\n      auto lch = test.back();\n      r.quoted = (fch == lch) && (fch == '\\'' || fch == '\\\"');\n      if (r.quoted) {\n        // remove quotes for regex test\n        test = test.substr(1, test.size() - 2);\n      }\n    }\n    // Fast check:\n    if (test.empty()) return r;\n    // A string with a valid scalar shouldn't have non-ascii or non-printable\n    // symbols.\n    for (auto c : test) {\n      if ((c < ' ') || (c > '~')) return r;\n    }\n    // Check with regex\n    r.res = MatchNumber(test);\n    return r;\n  }\n\n  bool MatchRegexList(const std::string& input,\n                      const std::vector<std::regex>& re_list) const {\n    auto str = StripString(input, \" \");\n    if (str.empty()) return false;\n    for (auto& re : re_list) {\n      std::smatch match;\n      if (std::regex_match(str, match, re)) return true;\n    }\n    return false;\n  }\n};\n\nclass IntegerRegex : public RegexMatcher {\n protected:\n  bool MatchNumber(const std::string& input) const override {\n    static const std::vector<std::regex> re_list = {\n        std::regex{R\"(^[-+]?[0-9]+$)\", std::regex_constants::optimize},\n\n        std::regex{R\"(^[-+]?0[xX][0-9a-fA-F]+$)\",\n                   std::regex_constants::optimize}};\n    return MatchRegexList(input, re_list);\n  }\n\n public:\n  IntegerRegex() = default;\n  virtual ~IntegerRegex() = default;\n};\n\nclass UIntegerRegex : public RegexMatcher {\n protected:\n  bool MatchNumber(const std::string& input) const override {\n    static const std::vector<std::regex> re_list = {\n        std::regex{R\"(^[+]?[0-9]+$)\", std::regex_constants::optimize},\n        std::regex{R\"(^[+]?0[xX][0-9a-fA-F]+$)\",\n                   std::regex_constants::optimize},\n        // accept -0 number\n        std::regex{R\"(^[-](?:0[xX])?0+$)\", std::regex_constants::optimize}};\n    return MatchRegexList(input, re_list);\n  }\n\n public:\n  UIntegerRegex() = default;\n  virtual ~UIntegerRegex() = default;\n};\n\nclass BooleanRegex : public IntegerRegex {\n protected:\n  bool MatchNumber(const std::string& input) const override {\n    if (input == \"true\" || input == \"false\") return true;\n    return IntegerRegex::MatchNumber(input);\n  }\n\n public:\n  BooleanRegex() = default;\n  virtual ~BooleanRegex() = default;\n};\n\nclass FloatRegex : public RegexMatcher {\n protected:\n  bool MatchNumber(const std::string& input) const override {\n    static const std::vector<std::regex> re_list = {\n        // hex-float\n        std::regex{\n            R\"(^[-+]?0[xX](?:(?:[.][0-9a-fA-F]+)|(?:[0-9a-fA-F]+[.][0-9a-fA-F]*)|(?:[0-9a-fA-F]+))[pP][-+]?[0-9]+$)\",\n            std::regex_constants::optimize},\n        // dec-float\n        std::regex{\n            R\"(^[-+]?(?:(?:[.][0-9]+)|(?:[0-9]+[.][0-9]*)|(?:[0-9]+))(?:[eE][-+]?[0-9]+)?$)\",\n            std::regex_constants::optimize},\n\n        std::regex{\n            R\"(^[-+]?(?:nan|inf|infinity)$)\",\n            std::regex_constants::optimize | std::regex_constants::icase}};\n    return MatchRegexList(input, re_list);\n  }\n\n public:\n  FloatRegex() = default;\n  virtual ~FloatRegex() = default;\n};\n\nclass ScalarReferenceResult {\n private:\n  ScalarReferenceResult(const char* _type, RegexMatcher::MatchResult _matched)\n      : type(_type), matched(_matched) {}\n\n public:\n  // Decode scalar type and check if the input string satisfies the scalar type.\n  static ScalarReferenceResult Check(uint8_t code, const std::string& input) {\n    switch (code) {\n      case 0x0:\n        return {\"double\", FloatRegex().Match(input)};\n      case 0x1:\n        return {\"float\", FloatRegex().Match(input)};\n      case 0x2:\n        return {\"int8\", IntegerRegex().Match(input)};\n      case 0x3:\n        return {\"int16\", IntegerRegex().Match(input)};\n      case 0x4:\n        return {\"int32\", IntegerRegex().Match(input)};\n      case 0x5:\n        return {\"int64\", IntegerRegex().Match(input)};\n      case 0x6:\n        return {\"uint8\", UIntegerRegex().Match(input)};\n      case 0x7:\n        return {\"uint16\", UIntegerRegex().Match(input)};\n      case 0x8:\n        return {\"uint32\", UIntegerRegex().Match(input)};\n      case 0x9:\n        return {\"uint64\", UIntegerRegex().Match(input)};\n      case 0xA:\n        return {\"bool\", BooleanRegex().Match(input)};\n      default:\n        return {\"float\", FloatRegex().Match(input)};\n    };\n  }\n\n  const char* type;\n  const RegexMatcher::MatchResult matched;\n};\n\nbool Parse(flatbuffers::Parser& parser, const std::string& json,\n           std::string* _text) {\n  auto done = parser.ParseJson(json.c_str());\n  if (done) {\n    TEST_NULL(GenText(parser, parser.builder_.GetBufferPointer(), _text));\n  } else {\n    *_text = parser.error_;\n  }\n  return done;\n}\n\n// Utility for test run.\nOneTimeTestInit OneTimeTestInit::one_time_init_;\n\n// llvm std::regex have problem with stack overflow, limit maximum length.\n// ./scalar_fuzzer -max_len=3000\nextern \"C\" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {\n  // Reserve one byte for Parser flags and one byte for repetition counter.\n  if (size < 3) return 0;\n  const uint8_t flags = data[0];\n  // normalize to ascii alphabet\n  const int extra_rep_number =\n      std::max(5, (data[1] > '0' ? (data[1] - '0') : 0));\n  data += 2;\n  size -= 2;  // bypass\n\n  // Guarantee 0-termination.\n  const std::string original(reinterpret_cast<const char*>(data), size);\n  auto input = std::string(original.c_str());  // until '\\0'\n  if (input.size() < kMinInputLength || input.size() > kMaxInputLength)\n    return 0;\n\n  // Break comments in json to avoid complexity with regex matcher.\n  // The string \" 12345 /* text */\" will be accepted if insert it to string\n  // expression: \"table X { Y: \" + \" 12345 /* text */\" + \"; }.\n  // But strings like this will complicate regex matcher.\n  // We reject this by transform \"/* text */ 12345\" to \"@* text */ 12345\".\n  BreakSequence(input, \"//\", '@');  // \"//\" -> \"@/\"\n  BreakSequence(input, \"/*\", '@');  // \"/*\" -> \"@*\"\n  // { \"$schema: \"text\" } is exceptional case.\n  // This key:value ignored by the parser. Numbers can not have $.\n  BreakSequence(input, \"$schema\", '@');  // \"$schema\" -> \"@schema\"\n  // Break all known scalar functions (todo: add them to regex?):\n  for (auto f : {\"deg\", \"rad\", \"sin\", \"cos\", \"tan\", \"asin\", \"acos\", \"atan\"}) {\n    BreakSequence(input, f, '_');  // ident -> ident\n  }\n\n  // Extract type of scalar from 'flags' and check if the input string satisfies\n  // the scalar type.\n  const auto ref_res =\n      ScalarReferenceResult::Check(flags & flags_scalar_type, input);\n  auto& recheck = ref_res.matched;\n\n  // Create parser\n  flatbuffers::IDLOptions opts;\n  opts.force_defaults = true;\n  opts.output_default_scalars_in_json = true;\n  opts.indent_step = -1;\n  opts.strict_json = true;\n\n  flatbuffers::Parser parser(opts);\n  auto schema =\n      \"table X { Y: \" + std::string(ref_res.type) + \"; } root_type X;\";\n  TEST_EQ_FUNC(parser.Parse(schema.c_str()), true);\n\n  // The fuzzer can adjust the number repetition if a side-effects have found.\n  // Each test should pass at least two times to ensure that the parser doesn't\n  // have any hidden-states or locale-depended effects.\n  for (auto cnt = 0; cnt < (extra_rep_number + 2); cnt++) {\n    // Each even run (0,2,4..) will test locale independed code.\n    auto use_locale = !!OneTimeTestInit::test_locale() && (0 == (cnt % 2));\n    // Set new locale.\n    if (use_locale) {\n      FLATBUFFERS_ASSERT(setlocale(LC_ALL, OneTimeTestInit::test_locale()));\n    }\n\n    // Parse original input as-is.\n    auto orig_scalar = \"{\\\"Y\\\" : \" + input + \"}\";\n    std::string orig_back;\n    auto orig_done = Parse(parser, orig_scalar, &orig_back);\n\n    if (recheck.res != orig_done) {\n      // look for \"does not fit\" or \"doesn't fit\" or \"out of range\"\n      auto not_fit =\n          (true == recheck.res)\n              ? ((orig_back.find(\"does not fit\") != std::string::npos) ||\n                 (orig_back.find(\"out of range\") != std::string::npos))\n              : false;\n\n      if (false == not_fit) {\n        TEST_OUTPUT_LINE(\"Stage 1 failed: Parser(%d) != Regex(%d)\", orig_done,\n                         recheck.res);\n        TEST_EQ_STR(orig_back.c_str(),\n                    input.substr(recheck.pos, recheck.len).c_str());\n        TEST_EQ_FUNC(orig_done, recheck.res);\n      }\n    }\n\n    // Try to make quoted string and test it.\n    std::string qouted_input;\n    if (true == recheck.quoted) {\n      // we can't simply remove quotes, they may be nested \"'12'\".\n      // Original string \"\\'12\\'\" converted to \"'12'\".\n      // The string can be an invalid string by JSON rules, but after quotes\n      // removed can transform to valid.\n      assert(recheck.len >= 2);\n    } else {\n      const auto quote = (flags & flags_quotes_kind) ? '\\\"' : '\\'';\n      qouted_input = input;  // copy\n      qouted_input.insert(recheck.pos + recheck.len, 1, quote);\n      qouted_input.insert(recheck.pos, 1, quote);\n    }\n\n    // Test quoted version of the string\n    if (!qouted_input.empty()) {\n      auto fix_scalar = \"{\\\"Y\\\" : \" + qouted_input + \"}\";\n      std::string fix_back;\n      auto fix_done = Parse(parser, fix_scalar, &fix_back);\n\n      if (orig_done != fix_done) {\n        TEST_OUTPUT_LINE(\"Stage 2 failed: Parser(%d) != Regex(%d)\", fix_done,\n                         orig_done);\n        TEST_EQ_STR(fix_back.c_str(), orig_back.c_str());\n      }\n      if (orig_done) {\n        TEST_EQ_STR(fix_back.c_str(), orig_back.c_str());\n      }\n      TEST_EQ_FUNC(fix_done, orig_done);\n    }\n\n    // Create new parser and test default value\n    if (true == orig_done) {\n      flatbuffers::Parser def_parser(opts);  // re-use options\n      auto def_schema = \"table X { Y: \" + std::string(ref_res.type) + \" = \" +\n                        input + \"; } root_type X;\" +\n                        \"{}\";  // <- with empty json {}!\n\n      auto def_done = def_parser.Parse(def_schema.c_str());\n      if (false == def_done) {\n        TEST_OUTPUT_LINE(\"Stage 3.1 failed with _error = %s\",\n                         def_parser.error_.c_str());\n        FLATBUFFERS_ASSERT(false);\n      }\n      // Compare with print.\n      std::string ref_string, def_string;\n      FLATBUFFERS_ASSERT(\n          !GenText(parser, parser.builder_.GetBufferPointer(), &ref_string));\n      FLATBUFFERS_ASSERT(!GenText(\n          def_parser, def_parser.builder_.GetBufferPointer(), &def_string));\n      if (ref_string != def_string) {\n        TEST_OUTPUT_LINE(\"Stage 3.2 failed: '%s' != '%s'\", def_string.c_str(),\n                         ref_string.c_str());\n        FLATBUFFERS_ASSERT(false);\n      }\n    }\n\n    // Restore locale.\n    if (use_locale) {\n      FLATBUFFERS_ASSERT(setlocale(LC_ALL, \"C\"));\n    }\n  }\n  return 0;\n}\n"
  },
  {
    "path": "tests/fuzzer/flatbuffers_verifier_fuzzer.cc",
    "content": "// Copyright 2015 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n#include <stddef.h>\n#include <stdint.h>\n\n#include <string>\n\n#include \"cpp17/generated_cpp17/monster_test_generated.h\"\n\nextern \"C\" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {\n  flatbuffers::Verifier verifier(data, size);\n  MyGame::Example::VerifyMonsterBuffer(verifier);\n  flatbuffers::SizeVerifier size_verifier(data, size);\n  MyGame::Example::VerifyMonsterBuffer(size_verifier);\n  return 0;\n}\n"
  },
  {
    "path": "tests/fuzzer/flexbuffers_verifier_fuzzer.cc",
    "content": "// Copyright 2015 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n#include <stddef.h>\n#include <stdint.h>\n\n#include <string>\n\n#include \"flatbuffers/flexbuffers.h\"\n\nextern \"C\" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {\n  std::vector<uint8_t> reuse_tracker;\n  // Check both with and without reuse tracker paths.\n  flexbuffers::VerifyBuffer(data, size, &reuse_tracker);\n  // FIXME: we can't really verify this path, because the fuzzer will\n  // construct buffers that time out.\n  // Add a simple #define to bound the number of steps just for the fuzzer?\n  // flexbuffers::VerifyBuffer(data, size, nullptr);\n  return 0;\n}\n"
  },
  {
    "path": "tests/fuzzer/fuzzer_assert.h",
    "content": "#ifndef FUZZER_ASSERT_IMPL_H_\n#define FUZZER_ASSERT_IMPL_H_\n\n#if defined(_MSC_VER)\nextern \"C\" void __debugbreak();\n#define __builtin_trap __debugbreak\n#else  // Clang\nextern \"C\" void __builtin_trap(void);\n#endif\n\n// Declare Debug/Release independed assert macro.\n#define fuzzer_assert_impl(x) (!!(x) ? static_cast<void>(0) : __builtin_trap())\n\n#endif  // !FUZZER_ASSERT_IMPL_H_\n"
  },
  {
    "path": "tests/fuzzer/monster_debug.cpp",
    "content": "#include <assert.h>\n\n#include <iostream>\n\n#include \"flatbuffers/util.h\"\n\nextern \"C\" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size);\n\nint main(int argc, char* argv[]) {\n  if (argc < 2) {\n    std::cerr << \"Usage: monster_debug <path to fuzzer crash file>\\n\";\n    return 0;\n  }\n  std::string crash_file_name(argv[1]);\n  std::string crash_file_data;\n  auto done =\n      flatbuffers::LoadFile(crash_file_name.c_str(), true, &crash_file_data);\n  if (!done) {\n    std::cerr << \"Can not load file: '\" << crash_file_name << \"'\";\n    return -1;\n  }\n  if (crash_file_data.size() < 3) {\n    std::cerr << \"Invalid file data: '\" << crash_file_data << \"'\";\n    return -2;\n  }\n  auto rc = LLVMFuzzerTestOneInput(\n      reinterpret_cast<const uint8_t*>(crash_file_data.data()),\n      crash_file_data.size());\n  std::cout << \"LLVMFuzzerTestOneInput finished with code \" << rc << \"\\n\\n\";\n  return rc;\n}\n"
  },
  {
    "path": "tests/fuzzer/monster_fuzzer.dict",
    "content": "\"{\"\n\"}\"\n\"[\"\n\"]\"\n\"\\\"\"\n\"'\"\n\"\\\\\"\n\"//\"\n\":\"\n\",\"\n\" \"\n\"\\\\n\"\n\"\\\\r\"\n\"/*\"\n\"*/\"\n\"true\"\n\"false\"\n\"null\"\n\"\\\\u\"\n\"\\\\b\"\n\"\\\\f\"\n\"\\\\t\"\n\".\"\n\"e\"\n\"e+\"\n\"e-\"\n\"E\"\n\"E+\"\n\"E-\"\n\"0x\"\n\"p\"\n\"a\"\n\"b\"\n\"Monster\"\n\"pos\"\n\"hp\"\n\"name\"\n\"weapons\"\n\"damage\"\n\"equipped_type\"\n\"equipped\"\n\"inventory\"\n\"vector_of_longs\"\n\"vector_of_doubles\"\n\"test_type\"\n\"test\"\n\"test1\"\n\"test2\"\n\"test4\"\n\"test3\"\n\"test5\"\n\"enemy\"\n\"Weapon\"\n\"Green\"\n\"Red\"\n\"Blue\"\n\"testarrayofstring\"\n\"testarrayofbools\"\n\"testbool\"\n\"flex\"\n"
  },
  {
    "path": "tests/fuzzer/parser_fuzzer.dict",
    "content": "\"struct\"\n\"table\"\n\"enum\"\n\"union\"\n\"include\"\n\"namespace\"\n\"attribute\"\n\"null\"\n\"NULL\"\n\"byte\"\n\"int8\"\n\"ubyte\"\n\"uint8\"\n\"bool\"\n\"short\"\n\"int16\"\n\"ushort\"\n\"uint16\"\n\"int\"\n\"int32\"\n\"uint\"\n\"uint32\"\n\"float\"\n\"float32\"\n\"long\"\n\"int64\"\n\"ulong\"\n\"uint64\"\n\"double\"\n\"float64\"\n\"root_type\"\n\"file_identifier\"\n\"file_extension\"\n\"{\"\n\"}\"\n\"[\"\n\"]\"\n\"\\\"\"\n\"'\"\n\"\\\\\"\n\"//\"\n\":\"\n\",\"\n\" \"\n\"\\\\n\"\n\"\\\\r\"\n\"/*\"\n\"*/\"\n\"true\"\n\"false\"\n\"null\"\n\"\\\\u\"\n\"\\\\b\"\n\"\\\\f\"\n\"\\\\t\"\n\".\"\n\"e\"\n\"e+\"\n\"e-\"\n\"E\"\n\"E+\"\n\"E-\"\n\"0x\"\n\"p\"\n\"a\"\n\"b\"\n\"Monster\"\n\"pos\"\n\"hp\"\n\"name\"\n\"weapons\"\n\"damage\"\n\"equipped_type\"\n\"equipped\"\n\"inventory\"\n\"vector_of_longs\"\n\"vector_of_doubles\"\n\"test_type\"\n\"test\"\n\"test1\"\n\"test2\"\n\"test4\"\n\"test3\"\n\"test5\"\n\"enemy\"\n\"Weapon\"\n\"Green\"\n\"Red\"\n\"Blue\"\n\"testarrayofstring\"\n\"testarrayofbools\"\n\"testbool\"\n\"testhashs32_fnv1\"\n\"testhashu32_fnv1\"\n\"testhashs64_fnv1\"\n\"testhashu64_fnv1\"\n\"testhashs32_fnv1a\"\n\"testhashu32_fnv1a\"\n\"testhashs64_fnv1a\"\n\"testhashu64_fnv1a\"\n\"flex\"\n"
  },
  {
    "path": "tests/fuzzer/readme.md",
    "content": "# Test Flatbuffers library with help of libFuzzer\nTest suite of Flatbuffers library has fuzzer section with tests are based on libFuzzer library.\n\n> LibFuzzer is in-process, coverage-guided, evolutionary fuzzing engine.\nLibFuzzer is linked with the library under test, and feeds fuzzed inputs to the library via a specific fuzzing entrypoint (aka “target function”);\nthe fuzzer then tracks which areas of the code are reached, and generates mutations on the corpus of input data in order to maximize the code coverage.\nThe code coverage information for libFuzzer is provided by LLVM’s SanitizerCoverage instrumentation.\n\nFor details about **libFuzzer** see: https://llvm.org/docs/LibFuzzer.html\n\nTo build and run these tests LLVM compiler (with clang frontend) and CMake should be installed before.\n\nThe fuzzer section include four tests:\n- `annotator_fuzzer` checks that inputs given to the flatc --annotate are always parsable;\n- `verifier_fuzzer` checks stability of deserialization engine for `Monster` schema;\n- `parser_fuzzer` checks stability of schema and json parser under various inputs;\n- `scalar_parser` focused on validation of the parser while parse numeric scalars in schema and/or json files;\n- `flexverifier_fuzzer` checks stability of deserialization engine for FlexBuffers only;\n\n## Build\n```sh\ncd tests/fuzzer\nCC=clang CXX=clang++ cmake . -DCMAKE_BUILD_TYPE=Debug -DUSE_ASAN=ON\n```\n\n## Run tests with a specific locale\nThe grammar of the Flatbuffers library is based on printable-ASCII characters.\nBy design, the Flatbuffers library should be independent of the global or thread locales used by an end-user application.\nSet environment variable `FLATBUFFERS_TEST_LOCALE` to run a fuzzer with a specific C-locale:\n```sh\n>FLATBUFFERS_TEST_LOCALE=\"\" ./scalar_parser\n>FLATBUFFERS_TEST_LOCALE=\"ru_RU.CP1251\" ./parser_fuzzer\n```\n\n## Run fuzzer\nThese are examples of running a fuzzer.\nFlags may vary and depend on a version of the libFuzzer library.\nFor details, run a fuzzer with `-help` flag: `./parser_fuzzer -help=1`\n\n`./verifier_fuzzer ../.corpus_verifier/ ../.seed_verifier/`\n\n`./parser_fuzzer -only_ascii=1  -max_len=500 -dict=../parser_fbs.dict ../.corpus_parser/ ../.seed_parser/`\n\n`./monster_fuzzer -only_ascii=1 -max_len=500 -dict=../monster_json.dict ../.corpus_monster/ ../.seed_monster/`\n\n`./scalar_fuzzer -use_value_profile=1 -max_len=500 -dict=../scalar_json.dict ../.corpus_scalar/ ../.seed_scalar/`\n\nFlag `-only_ascii=1` is useful for fast number-compatibility checking while run `scalar_fuzzer`.\n\nRun with a specific C-locale:\n`FLATBUFFERS_TEST_LOCALE=\"ru_RU.CP1251\" ./scalar_fuzzer -reduce_depth=1 -use_value_profile=1 -shrink=1 -max_len=3000 -timeout=10 -rss_limit_mb=2048 ../.corpus_parser/ ../.seed_parser/`\n\n\n## Merge (minimize) corpus\nThe **libFuzzer** allow to filter (minimize) corpus with help of `-merge` flag:\n> -merge\n    If set to 1, any corpus inputs from the 2nd, 3rd etc. corpus directories that trigger new code coverage will be merged into the first corpus directory.\n    Defaults to 0. This flag can be used to minimize a corpus.\n\nMerge several corpuses to a seed directory (a new collected corpus to the seed collection, for example):\n`./verifier_fuzzer -merge=1 ../.seed_verifier/ ../.corpus_verifier/`\n`./parser_fuzzer -merge=1 ../.seed_parser/ ../.corpus_parser/`\n`./monster_fuzzer -merge=1 ../.seed_monster/ ../.corpus_monster/`\n`./scalar_fuzzer -merge=1 ../.seed_scalar/ ../.corpus_scalar/`\n\n## Know limitations\n- LLVM 7.0 std::regex library has problem with stack overflow, maximum length of input for `scalar_fuzzer` run should be limited to 3000.\n  Example: `./scalar_fuzzer -max_len=3000`\n\n# Fuzzing control\n\n## Set timeout or memory limit\n\n`-timeout=10 -rss_limit_mb=2048 -jobs=4 -workers=4`.\n\n## Force stop on first UBSAN error\n\n- `export UBSAN_OPTIONS=halt_on_error=1`\n- `export ASAN_OPTIONS=halt_on_error=1`\n"
  },
  {
    "path": "tests/fuzzer/scalar_debug.cpp",
    "content": "#include <iostream>\n\n#include \"flatbuffers/util.h\"\n\nextern \"C\" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size);\n\nint main(int argc, char* argv[]) {\n  if (argc < 2) {\n    std::cerr << \"Usage: scalar_debug <path to fuzzer crash file>\\n\";\n    return 0;\n  }\n  std::string crash_file_name(argv[1]);\n  std::string crash_file_data;\n  auto done =\n      flatbuffers::LoadFile(crash_file_name.c_str(), true, &crash_file_data);\n  if (!done) {\n    std::cerr << \"Can not load file: '\" << crash_file_name << \"'\";\n    return -1;\n  }\n  if (crash_file_data.size() < 3) {\n    std::cerr << \"Invalid file data: '\" << crash_file_data << \"'\";\n    return -2;\n  }\n  auto rc = LLVMFuzzerTestOneInput(\n      reinterpret_cast<const uint8_t*>(crash_file_data.data()),\n      crash_file_data.size());\n  std::cout << \"LLVMFuzzerTestOneInput finished with code \" << rc << \"\\n\\n\";\n  return rc;\n}\n"
  },
  {
    "path": "tests/fuzzer/scalar_fuzzer.dict",
    "content": "\"-\"\n\"+\"\n\".\"\n\"e\"\n\"e+\"\n\"e-\"\n\"E\"\n\"E+\"\n\"E-\"\n\"0x\"\n\"-0x\"\n\"p\"\n\"0\"\n\"1\"\n\"2\"\n\"3\"\n\"4\"\n\"5\"\n\"6\"\n\"7\"\n\"8\"\n\"9\"\n\"a\"\n\"b\"\n\"c\"\n\"d\"\n\"e\"\n\"f\"\n\"nan\"\n\"-nan\"\n\"+nan\"\n\"inf\"\n\"+inf\"\n\"-inf\"\n\"infinity\"\n\"+infinity\"\n\"-infinity\"\n"
  },
  {
    "path": "tests/fuzzer/seed_codegen/attributes_test",
    "content": "attribute \"csharp_namespace\";\n\nnamespace Test;\n\ntable Data (csharp_partial) {\n  value:int;\n}\n\nroot_type Data;\n\nfile_identifier \"TEST\";"
  },
  {
    "path": "tests/fuzzer/seed_codegen/complex_schema",
    "content": "namespace Example;\n\nenum Status:byte { Active, Inactive, Pending }\n\nstruct Point {\n  x:int;\n  y:int;\n}\n\ntable User {\n  id:uint;\n  name:string;\n  points:[Point];\n  status:Status = Active;\n  metadata:[string];\n}\n\ntable Group {\n  name:string;\n  users:[User];\n  leader:User;\n}\n\nroot_type Group;"
  },
  {
    "path": "tests/fuzzer/seed_codegen/empty_namespace",
    "content": "table Person {\n  name:string;\n  age:int;\n}\n\nroot_type Person;"
  },
  {
    "path": "tests/fuzzer/seed_codegen/enum_test",
    "content": "enum Color:byte { Red, Green, Blue }\n\ntable Item {\n  name:string;\n  color:Color;\n}\n\nroot_type Item;"
  },
  {
    "path": "tests/fuzzer/seed_codegen/monster_sample",
    "content": "// Example IDL file for our monster's schema.\n\nnamespace MyGame.Sample;\n\nenum Color:byte { Red = 0, Green, Blue = 2 }\n\nunion Equipment { Weapon } // Optionally add more tables.\n\nstruct Vec3 {\n  x:float;\n  y:float;\n  z:float;\n}\n\ntable Monster {\n  pos:Vec3;\n  mana:short = 150;\n  hp:short = 100;\n  name:string;\n  friendly:bool = false (deprecated);\n  inventory:[ubyte];\n  color:Color = Blue;\n  weapons:[Weapon];\n  equipped:Equipment;\n  path:[Vec3];\n}\n\ntable Weapon {\n  name:string;\n  damage:short;\n}\n\nroot_type Monster;"
  },
  {
    "path": "tests/fuzzer/seed_codegen/rpc_test",
    "content": "table Request {\n  id:int;\n  message:string;\n}\n\ntable Response {\n  result:string;\n}\n\nrpc_service MyService {\n  DoSomething(Request):Response;\n}\n\nroot_type Request;"
  },
  {
    "path": "tests/fuzzer/seed_codegen/struct_test",
    "content": "struct Vec2 {\n  x:float;\n  y:float;\n}\n\ntable Object {\n  position:Vec2;\n  id:int;\n}\n\nroot_type Object;"
  },
  {
    "path": "tests/fuzzer/seed_codegen/test_union",
    "content": "namespace Test;\n\nunion Shape {\n  Circle,\n  Square,\n}\n\ntable Circle {\n  radius: float;\n}\n\ntable Square {\n  side: float;\n}\n\ntable Root {\n  shape: Shape;\n}\n\nroot_type Root;"
  },
  {
    "path": "tests/fuzzer/test_init.h",
    "content": "\n#ifndef FUZZER_TEST_INIT_H_\n#define FUZZER_TEST_INIT_H_\n\n#include \"fuzzer_assert.h\"\n#include \"test_assert.h\"\n\n// Utility for test run.\nstruct OneTimeTestInit {\n  // Declare trap for the Flatbuffers test engine.\n  // This hook terminate program both in Debug and Release.\n  static bool TestFailListener(const char* expval, const char* val,\n                               const char* exp, const char* file, int line,\n                               const char* func = nullptr) {\n    (void)expval;\n    (void)val;\n    (void)exp;\n    (void)file;\n    (void)line;\n    (void)func;\n    // FLATBUFFERS_ASSERT redefined to be fully independent of the Flatbuffers\n    // library implementation (see test_assert.h for details).\n    fuzzer_assert_impl(false);  // terminate\n    return false;\n  }\n\n  OneTimeTestInit() : has_locale_(false) {\n    // Fuzzer test should be independent of the test engine implementation.\n    // This hook will terminate test if TEST_EQ/TEST_ASSERT asserted.\n    InitTestEngine(OneTimeTestInit::TestFailListener);\n\n    // Read a locale for the test.\n    if (flatbuffers::ReadEnvironmentVariable(\"FLATBUFFERS_TEST_LOCALE\",\n                                             &test_locale_)) {\n      TEST_OUTPUT_LINE(\"The environment variable FLATBUFFERS_TEST_LOCALE=%s\",\n                       test_locale_.c_str());\n      test_locale_ = flatbuffers::RemoveStringQuotes(test_locale_);\n      has_locale_ = true;\n    }\n  }\n\n  static const char* test_locale() {\n    return one_time_init_.has_locale_ ? nullptr\n                                      : one_time_init_.test_locale_.c_str();\n  }\n\n  bool has_locale_;\n  std::string test_locale_;\n  static OneTimeTestInit one_time_init_;\n};\n\n#endif  // !FUZZER_TEST_INIT_H_\n"
  },
  {
    "path": "tests/go_test.go",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage main\n\nimport (\n\tmygame \"MyGame\"          // refers to generated code\n\texample \"MyGame/Example\" // refers to generated code\n\tpizza \"Pizza\"\n\t\"encoding/json\"\n\toptional_scalars \"optional_scalars\" // refers to generated code\n\torder \"order\"\n\trequired_strings \"required_strings\" // refers to generated code\n\n\t\"bytes\"\n\t\"flag\"\n\t\"fmt\"\n\t\"os\"\n\t\"reflect\"\n\t\"sort\"\n\t\"testing\"\n\t\"testing/quick\"\n\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n)\n\nvar (\n\tcppData, javaData, outData string\n\tfuzz                       bool\n\tfuzzFields, fuzzObjects    int\n)\n\nfunc init() {\n\tflag.StringVar(&cppData, \"cpp_data\", \"\",\n\t\t\"location of monsterdata_test.mon to verify against (required)\")\n\tflag.StringVar(&javaData, \"java_data\", \"\",\n\t\t\"location of monsterdata_java_wire.mon to verify against (optional)\")\n\tflag.StringVar(&outData, \"out_data\", \"\",\n\t\t\"location to write generated Go data\")\n\tflag.BoolVar(&fuzz, \"fuzz\", false, \"perform fuzzing\")\n\tflag.IntVar(&fuzzFields, \"fuzz_fields\", 4, \"fields per fuzzer object\")\n\tflag.IntVar(&fuzzObjects, \"fuzz_objects\", 10000,\n\t\t\"number of fuzzer objects (higher is slower and more thorough\")\n}\n\n// Store specific byte patterns in these variables for the fuzzer. These\n// values are taken verbatim from the C++ function FuzzTest1.\nvar (\n\toverflowingInt32Val = flatbuffers.GetInt32([]byte{0x83, 0x33, 0x33, 0x33})\n\toverflowingInt64Val = flatbuffers.GetInt64([]byte{0x84, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44})\n)\n\nfunc TestMain(m *testing.M) {\n\tflag.Parse()\n\tif cppData == \"\" {\n\t\tfmt.Fprintf(os.Stderr, \"cpp_data argument is required\\n\")\n\t\tos.Exit(1)\n\t}\n\tos.Exit(m.Run())\n}\n\n// TestTextParsing test if text parsing works with object API.\nfunc TestTextParsing(t *testing.T) {\n\texpectedMonster := example.MonsterT{\n\t\tMana:                  42,\n\t\tName:                  \"foo\",\n\t\tLongEnumNormalDefault: example.LongEnumLongTwo,\n\t}\n\n\tbuf := new(bytes.Buffer)\n\tif err := json.NewEncoder(buf).Encode(expectedMonster); err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tvar monster example.MonsterT\n\tif err := json.NewDecoder(buf).Decode(&monster); err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tif monster.Mana != expectedMonster.Mana {\n\t\tt.Fatal(\"wrong mana:\", monster.Mana)\n\t}\n\tif monster.Name != expectedMonster.Name {\n\t\tt.Fatal(\"wrong name:\", monster.Name)\n\t}\n\tif monster.LongEnumNormalDefault != expectedMonster.LongEnumNormalDefault {\n\t\tt.Fatal(\"wrong enum:\", monster.LongEnumNormalDefault)\n\t}\n}\n\nfunc CheckNoNamespaceImport(fail func(string, ...interface{})) {\n\tconst size = 13\n\t// Order a pizza with specific size\n\tbuilder := flatbuffers.NewBuilder(0)\n\tordered_pizza := pizza.PizzaT{Size: size}\n\tfood := order.FoodT{Pizza: &ordered_pizza}\n\tbuilder.Finish(food.Pack(builder))\n\n\t// Receive order\n\treceived_food := order.GetRootAsFood(builder.FinishedBytes(), 0)\n\treceived_pizza := received_food.Pizza(nil).UnPack()\n\n\t// Check if received pizza is equal to ordered pizza\n\tif !reflect.DeepEqual(ordered_pizza, *received_pizza) {\n\t\tfail(FailString(\"no namespace import\", ordered_pizza, received_pizza))\n\t}\n}\n\n// TestAll runs all checks, failing if any errors occur.\nfunc TestAll(t *testing.T) {\n\t// Verify that the Go FlatBuffers runtime library generates the\n\t// expected bytes (does not use any schema):\n\tCheckByteLayout(t.Fatalf)\n\tCheckMutateMethods(t.Fatalf)\n\n\t// Verify that panics are raised during exceptional conditions:\n\tCheckNotInObjectError(t.Fatalf)\n\tCheckStringIsNestedError(t.Fatalf)\n\tCheckByteStringIsNestedError(t.Fatalf)\n\tCheckStructIsNotInlineError(t.Fatalf)\n\tCheckFinishedBytesError(t.Fatalf)\n\n\t// Verify bounds checking\n\tCheckByteVectorBoundsChecking(t.Fatalf)\n\n\tCheckSharedStrings(t.Fatalf)\n\tCheckEmptiedBuilder(t.Fatalf)\n\n\t// Verify that GetRootAs works for non-root tables\n\tCheckGetRootAsForNonRootTable(t.Fatalf)\n\tCheckTableAccessors(t.Fatalf)\n\n\t// Verify that using the generated Go code builds a buffer without\n\t// returning errors:\n\tgenerated, off := CheckGeneratedBuild(false, false, t.Fatalf)\n\n\t// Verify that the buffer generated by Go code is readable by the\n\t// generated Go code:\n\tCheckReadBuffer(generated, off, false, t.Fatalf)\n\tCheckMutateBuffer(generated, off, false, t.Fatalf)\n\tCheckObjectAPI(generated, off, false, t.Fatalf)\n\n\t// Generate the buffer again, with file identifier.\n\tgenerated, off = CheckGeneratedBuild(false, true, t.Fatalf)\n\n\t// Check that this buffer with file identifier is usable\n\t// and that the file identifier is correct.\n\tCheckReadBuffer(generated, off, false, t.Fatalf)\n\tCheckMutateBuffer(generated, off, false, t.Fatalf)\n\tCheckObjectAPI(generated, off, false, t.Fatalf)\n\tCheckFileIdentifier(generated, off, false, t.Fatalf)\n\n\t// Verify that the buffer generated by C++ code is readable by the\n\t// generated Go code:\n\tmonsterDataCpp, err := os.ReadFile(cppData)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tCheckReadBuffer(monsterDataCpp, 0, false, t.Fatalf)\n\tCheckMutateBuffer(monsterDataCpp, 0, false, t.Fatalf)\n\tCheckObjectAPI(monsterDataCpp, 0, false, t.Fatalf)\n\tCheckFileIdentifier(monsterDataCpp, 0, false, t.Fatalf)\n\n\t// Verify that vtables are deduplicated when written:\n\tCheckVtableDeduplication(t.Fatalf)\n\n\t// Verify the enum names\n\tCheckEnumNames(t.Fatalf)\n\n\t// Verify enum String methods\n\tCheckEnumString(t.Fatalf)\n\n\t// Verify the enum values maps\n\tCheckEnumValues(t.Fatalf)\n\n\t// Verify that the Go code used in FlatBuffers documentation passes\n\t// some sanity checks:\n\tCheckDocExample(generated, off, t.Fatalf)\n\n\t// Check Builder.CreateByteVector\n\tCheckCreateByteVector(t.Fatalf)\n\n\t// Check a parent namespace import\n\tCheckParentNamespace(t.Fatalf)\n\n\t// Check a no namespace import\n\tCheckNoNamespaceImport(t.Fatalf)\n\n\t// Check size-prefixed flatbuffers\n\tCheckSizePrefixedBuffer(t.Fatalf)\n\n\t// Check that optional scalars works\n\tCheckOptionalScalars(t.Fatalf)\n\n\t// Check that default required string fields are placed in the buffer\n\t// using Object API\n\tCheckRequiredStrings(t.Fatalf)\n\n\t// Check that getting vector element by key works\n\tCheckByKey(t.Fatalf)\n\n\t// If the filename of the FlatBuffers file generated by the Java test\n\t// is given, check that Go code can read it, and that Go code\n\t// generates an identical buffer when used to create the example data:\n\tif javaData != \"\" {\n\t\tmonsterDataJava, err := os.ReadFile(javaData)\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tCheckReadBuffer(monsterDataJava, 0, false, t.Fatalf)\n\t\tCheckByteEquality(generated[off:], monsterDataJava, t.Fatalf)\n\t}\n\n\t// Verify that various fuzzing scenarios produce a valid FlatBuffer.\n\tif fuzz {\n\t\tcheckFuzz(fuzzFields, fuzzObjects, t.Fatalf)\n\t}\n\n\t// Write the generated buffer out to a file:\n\terr = os.WriteFile(outData, generated[off:], os.FileMode(0644))\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n}\n\n// CheckReadBuffer checks that the given buffer is evaluated correctly\n// as the example Monster.\nfunc CheckReadBuffer(buf []byte, offset flatbuffers.UOffsetT, sizePrefix bool, fail func(string, ...interface{})) {\n\t// try the two ways of generating a monster\n\tvar monster1 *example.Monster\n\tmonster2 := &example.Monster{}\n\n\tif sizePrefix {\n\t\tmonster1 = example.GetSizePrefixedRootAsMonster(buf, offset)\n\t\tflatbuffers.GetSizePrefixedRootAs(buf, offset, monster2)\n\t} else {\n\t\tmonster1 = example.GetRootAsMonster(buf, offset)\n\t\tflatbuffers.GetRootAs(buf, offset, monster2)\n\t}\n\n\tfor _, monster := range []*example.Monster{monster1, monster2} {\n\t\tif got := monster.Hp(); 80 != got {\n\t\t\tfail(FailString(\"hp\", 80, got))\n\t\t}\n\n\t\t// default\n\t\tif got := monster.Mana(); 150 != got {\n\t\t\tfail(FailString(\"mana\", 150, got))\n\t\t}\n\n\t\tif got := monster.Name(); !bytes.Equal([]byte(\"MyMonster\"), got) {\n\t\t\tfail(FailString(\"name\", \"MyMonster\", got))\n\t\t}\n\n\t\tif got := monster.Color(); example.ColorBlue != got {\n\t\t\tfail(FailString(\"color\", example.ColorBlue, got))\n\t\t}\n\n\t\tif got := monster.Testbool(); true != got {\n\t\t\tfail(FailString(\"testbool\", true, got))\n\t\t}\n\n\t\t// initialize a Vec3 from Pos()\n\t\tvec := new(example.Vec3)\n\t\tvec = monster.Pos(vec)\n\t\tif vec == nil {\n\t\t\tfail(\"vec3 initialization failed\")\n\t\t}\n\n\t\t// check that new allocs equal given ones:\n\t\tvec2 := monster.Pos(nil)\n\t\tif !reflect.DeepEqual(vec, vec2) {\n\t\t\tfail(\"fresh allocation failed\")\n\t\t}\n\n\t\t// verify the properties of the Vec3\n\t\tif got := vec.X(); float32(1.0) != got {\n\t\t\tfail(FailString(\"Pos.X\", float32(1.0), got))\n\t\t}\n\n\t\tif got := vec.Y(); float32(2.0) != got {\n\t\t\tfail(FailString(\"Pos.Y\", float32(2.0), got))\n\t\t}\n\n\t\tif got := vec.Z(); float32(3.0) != got {\n\t\t\tfail(FailString(\"Pos.Z\", float32(3.0), got))\n\t\t}\n\n\t\tif got := vec.Test1(); float64(3.0) != got {\n\t\t\tfail(FailString(\"Pos.Test1\", float64(3.0), got))\n\t\t}\n\n\t\tif got := vec.Test2(); example.ColorGreen != got {\n\t\t\tfail(FailString(\"Pos.Test2\", example.ColorGreen, got))\n\t\t}\n\n\t\t// initialize a Test from Test3(...)\n\t\tt := new(example.Test)\n\t\tt = vec.Test3(t)\n\t\tif t == nil {\n\t\t\tfail(\"vec.Test3(&t) failed\")\n\t\t}\n\n\t\t// check that new allocs equal given ones:\n\t\tt2 := vec.Test3(nil)\n\t\tif !reflect.DeepEqual(t, t2) {\n\t\t\tfail(\"fresh allocation failed\")\n\t\t}\n\n\t\t// verify the properties of the Test\n\t\tif got := t.A(); int16(5) != got {\n\t\t\tfail(FailString(\"t.A()\", int16(5), got))\n\t\t}\n\n\t\tif got := t.B(); int8(6) != got {\n\t\t\tfail(FailString(\"t.B()\", int8(6), got))\n\t\t}\n\n\t\tif got := monster.TestType(); example.AnyMonster != got {\n\t\t\tfail(FailString(\"monster.TestType()\", example.AnyMonster, got))\n\t\t}\n\n\t\t// initialize a Table from a union field Test(...)\n\t\tvar table2 flatbuffers.Table\n\t\tif ok := monster.Test(&table2); !ok {\n\t\t\tfail(\"monster.Test(&monster2) failed\")\n\t\t}\n\n\t\t// initialize a Monster from the Table from the union\n\t\tvar monster2 example.Monster\n\t\tmonster2.Init(table2.Bytes, table2.Pos)\n\n\t\tif got := monster2.Name(); !bytes.Equal([]byte(\"Fred\"), got) {\n\t\t\tfail(FailString(\"monster2.Name()\", \"Fred\", got))\n\t\t}\n\n\t\tinventorySlice := monster.InventoryBytes()\n\t\tif len(inventorySlice) != monster.InventoryLength() {\n\t\t\tfail(FailString(\"len(monster.InventoryBytes) != monster.InventoryLength\", len(inventorySlice), monster.InventoryLength()))\n\t\t}\n\n\t\tif got := monster.InventoryLength(); 5 != got {\n\t\t\tfail(FailString(\"monster.InventoryLength\", 5, got))\n\t\t}\n\n\t\tinvsum := 0\n\t\tl := monster.InventoryLength()\n\t\tfor i := 0; i < l; i++ {\n\t\t\tv := monster.Inventory(i)\n\t\t\tif v != inventorySlice[i] {\n\t\t\t\tfail(FailString(\"monster inventory slice[i] != Inventory(i)\", v, inventorySlice[i]))\n\t\t\t}\n\t\t\tinvsum += int(v)\n\t\t}\n\t\tif invsum != 10 {\n\t\t\tfail(FailString(\"monster inventory sum\", 10, invsum))\n\t\t}\n\n\t\tif got := monster.Test4Length(); 2 != got {\n\t\t\tfail(FailString(\"monster.Test4Length()\", 2, got))\n\t\t}\n\n\t\tvar test0 example.Test\n\t\tok := monster.Test4(&test0, 0)\n\t\tif !ok {\n\t\t\tfail(FailString(\"monster.Test4(&test0, 0)\", true, ok))\n\t\t}\n\n\t\tvar test1 example.Test\n\t\tok = monster.Test4(&test1, 1)\n\t\tif !ok {\n\t\t\tfail(FailString(\"monster.Test4(&test1, 1)\", true, ok))\n\t\t}\n\n\t\t// the position of test0 and test1 are swapped in monsterdata_java_wire\n\t\t// and monsterdata_test_wire, so ignore ordering\n\t\tv0 := test0.A()\n\t\tv1 := test0.B()\n\t\tv2 := test1.A()\n\t\tv3 := test1.B()\n\t\tsum := int(v0) + int(v1) + int(v2) + int(v3)\n\n\t\tif 100 != sum {\n\t\t\tfail(FailString(\"test0 and test1 sum\", 100, sum))\n\t\t}\n\n\t\tif got := monster.TestarrayofstringLength(); 2 != got {\n\t\t\tfail(FailString(\"Testarrayofstring length\", 2, got))\n\t\t}\n\n\t\tif got := monster.Testarrayofstring(0); !bytes.Equal([]byte(\"test1\"), got) {\n\t\t\tfail(FailString(\"Testarrayofstring(0)\", \"test1\", got))\n\t\t}\n\n\t\tif got := monster.Testarrayofstring(1); !bytes.Equal([]byte(\"test2\"), got) {\n\t\t\tfail(FailString(\"Testarrayofstring(1)\", \"test2\", got))\n\t\t}\n\t}\n}\n\n// CheckFileIdentifier checks the \"MONS\" file identifier\nfunc CheckFileIdentifier(buf []byte, offset flatbuffers.UOffsetT, sizePrefix bool, fail func(string, ...interface{})) {\n\t// Strip offset\n\tbuf = buf[offset:]\n\n\tvar fileIdentifier string\n\tvar hasFileIdentifier bool\n\n\tif sizePrefix {\n\t\tfileIdentifier = flatbuffers.GetSizePrefixedBufferIdentifier(buf)\n\t\thasFileIdentifier = example.SizePrefixedMonsterBufferHasIdentifier(buf)\n\t} else {\n\t\tfileIdentifier = flatbuffers.GetBufferIdentifier(buf)\n\t\thasFileIdentifier = example.MonsterBufferHasIdentifier(buf)\n\t}\n\n\texpectedFileIdentifier := \"MONS\"\n\tif fileIdentifier != expectedFileIdentifier {\n\t\tfail(\"expected file identifier %q, got %q\", expectedFileIdentifier, fileIdentifier)\n\t}\n\tif !hasFileIdentifier {\n\t\tfail(\"did not find file identifier\")\n\t}\n}\n\n// CheckMutateBuffer checks that the given buffer can be mutated correctly\n// as the example Monster. Only available scalar values are mutated.\nfunc CheckMutateBuffer(org []byte, offset flatbuffers.UOffsetT, sizePrefix bool, fail func(string, ...interface{})) {\n\t// make a copy to mutate\n\tbuf := make([]byte, len(org))\n\tcopy(buf, org)\n\n\t// load monster data from the buffer\n\tvar monster *example.Monster\n\tif sizePrefix {\n\t\tmonster = example.GetSizePrefixedRootAsMonster(buf, offset)\n\t} else {\n\t\tmonster = example.GetRootAsMonster(buf, offset)\n\t}\n\n\t// test case struct\n\ttype testcase struct {\n\t\tfield  string\n\t\ttestfn func() bool\n\t}\n\n\ttestForOriginalValues := []testcase{\n\t\ttestcase{\"Hp\", func() bool { return monster.Hp() == 80 }},\n\t\ttestcase{\"Mana\", func() bool { return monster.Mana() == 150 }},\n\t\ttestcase{\"Testbool\", func() bool { return monster.Testbool() == true }},\n\t\ttestcase{\"Pos.X'\", func() bool { return monster.Pos(nil).X() == float32(1.0) }},\n\t\ttestcase{\"Pos.Y'\", func() bool { return monster.Pos(nil).Y() == float32(2.0) }},\n\t\ttestcase{\"Pos.Z'\", func() bool { return monster.Pos(nil).Z() == float32(3.0) }},\n\t\ttestcase{\"Pos.Test1'\", func() bool { return monster.Pos(nil).Test1() == float64(3.0) }},\n\t\ttestcase{\"Pos.Test2'\", func() bool { return monster.Pos(nil).Test2() == example.ColorGreen }},\n\t\ttestcase{\"Pos.Test3.A\", func() bool { return monster.Pos(nil).Test3(nil).A() == int16(5) }},\n\t\ttestcase{\"Pos.Test3.B\", func() bool { return monster.Pos(nil).Test3(nil).B() == int8(6) }},\n\t\ttestcase{\"Inventory[2]\", func() bool { return monster.Inventory(2) == byte(2) }},\n\t}\n\n\ttestMutability := []testcase{\n\t\ttestcase{\"Hp\", func() bool { return monster.MutateHp(70) }},\n\t\ttestcase{\"Mana\", func() bool { return !monster.MutateMana(140) }},\n\t\ttestcase{\"Testbool\", func() bool { return monster.MutateTestbool(false) }},\n\t\ttestcase{\"Pos.X\", func() bool { return monster.Pos(nil).MutateX(10.0) }},\n\t\ttestcase{\"Pos.Y\", func() bool { return monster.Pos(nil).MutateY(20.0) }},\n\t\ttestcase{\"Pos.Z\", func() bool { return monster.Pos(nil).MutateZ(30.0) }},\n\t\ttestcase{\"Pos.Test1\", func() bool { return monster.Pos(nil).MutateTest1(30.0) }},\n\t\ttestcase{\"Pos.Test2\", func() bool { return monster.Pos(nil).MutateTest2(example.ColorBlue) }},\n\t\ttestcase{\"Pos.Test3.A\", func() bool { return monster.Pos(nil).Test3(nil).MutateA(50) }},\n\t\ttestcase{\"Pos.Test3.B\", func() bool { return monster.Pos(nil).Test3(nil).MutateB(60) }},\n\t\ttestcase{\"Inventory[2]\", func() bool { return monster.MutateInventory(2, 200) }},\n\t}\n\n\ttestForMutatedValues := []testcase{\n\t\ttestcase{\"Hp\", func() bool { return monster.Hp() == 70 }},\n\t\ttestcase{\"Mana\", func() bool { return monster.Mana() == 150 }},\n\t\ttestcase{\"Testbool\", func() bool { return monster.Testbool() == false }},\n\t\ttestcase{\"Pos.X'\", func() bool { return monster.Pos(nil).X() == float32(10.0) }},\n\t\ttestcase{\"Pos.Y'\", func() bool { return monster.Pos(nil).Y() == float32(20.0) }},\n\t\ttestcase{\"Pos.Z'\", func() bool { return monster.Pos(nil).Z() == float32(30.0) }},\n\t\ttestcase{\"Pos.Test1'\", func() bool { return monster.Pos(nil).Test1() == float64(30.0) }},\n\t\ttestcase{\"Pos.Test2'\", func() bool { return monster.Pos(nil).Test2() == example.ColorBlue }},\n\t\ttestcase{\"Pos.Test3.A\", func() bool { return monster.Pos(nil).Test3(nil).A() == int16(50) }},\n\t\ttestcase{\"Pos.Test3.B\", func() bool { return monster.Pos(nil).Test3(nil).B() == int8(60) }},\n\t\ttestcase{\"Inventory[2]\", func() bool { return monster.Inventory(2) == byte(200) }},\n\t}\n\n\ttestInvalidEnumValues := []testcase{\n\t\ttestcase{\"Pos.Test2\", func() bool { return monster.Pos(nil).MutateTest2(example.Color(20)) }},\n\t\ttestcase{\"Pos.Test2\", func() bool { return monster.Pos(nil).Test2() == example.Color(20) }},\n\t}\n\n\t// make sure original values are okay\n\tfor _, t := range testForOriginalValues {\n\t\tif !t.testfn() {\n\t\t\tfail(\"field '\" + t.field + \"' doesn't have the expected original value\")\n\t\t}\n\t}\n\n\t// try to mutate fields and check mutability\n\tfor _, t := range testMutability {\n\t\tif !t.testfn() {\n\t\t\tfail(FailString(\"field '\"+t.field+\"' failed mutability test\", true, false))\n\t\t}\n\t}\n\n\t// test whether values have changed\n\tfor _, t := range testForMutatedValues {\n\t\tif !t.testfn() {\n\t\t\tfail(\"field '\" + t.field + \"' doesn't have the expected mutated value\")\n\t\t}\n\t}\n\n\t// make sure the buffer has changed\n\tif reflect.DeepEqual(buf, org) {\n\t\tfail(\"mutate buffer failed\")\n\t}\n\n\t// To make sure the buffer has changed accordingly\n\t// Read data from the buffer and verify all fields\n\tif sizePrefix {\n\t\tmonster = example.GetSizePrefixedRootAsMonster(buf, offset)\n\t} else {\n\t\tmonster = example.GetRootAsMonster(buf, offset)\n\t}\n\n\tfor _, t := range testForMutatedValues {\n\t\tif !t.testfn() {\n\t\t\tfail(\"field '\" + t.field + \"' doesn't have the expected mutated value\")\n\t\t}\n\t}\n\n\t// a couple extra tests for \"invalid\" enum values, which don't correspond to\n\t// anything in the schema, but are allowed\n\tfor _, t := range testInvalidEnumValues {\n\t\tif !t.testfn() {\n\t\t\tfail(\"field '\" + t.field + \"' doesn't work with an invalid enum value\")\n\t\t}\n\t}\n\n\t// reverting all fields to original values should\n\t// re-create the original buffer. Mutate all fields\n\t// back to their original values and compare buffers.\n\t// This test is done to make sure mutations do not do\n\t// any unnecessary changes to the buffer.\n\tif sizePrefix {\n\t\tmonster = example.GetSizePrefixedRootAsMonster(buf, offset)\n\t} else {\n\t\tmonster = example.GetRootAsMonster(buf, offset)\n\t}\n\n\tmonster.MutateHp(80)\n\tmonster.MutateTestbool(true)\n\tmonster.Pos(nil).MutateX(1.0)\n\tmonster.Pos(nil).MutateY(2.0)\n\tmonster.Pos(nil).MutateZ(3.0)\n\tmonster.Pos(nil).MutateTest1(3.0)\n\tmonster.Pos(nil).MutateTest2(example.ColorGreen)\n\tmonster.Pos(nil).Test3(nil).MutateA(5)\n\tmonster.Pos(nil).Test3(nil).MutateB(6)\n\tmonster.MutateInventory(2, 2)\n\n\tfor _, t := range testForOriginalValues {\n\t\tif !t.testfn() {\n\t\t\tfail(\"field '\" + t.field + \"' doesn't have the expected original value\")\n\t\t}\n\t}\n\n\t// buffer should have original values\n\tif !reflect.DeepEqual(buf, org) {\n\t\tfail(\"revert changes failed\")\n\t}\n}\n\nfunc CheckObjectAPI(buf []byte, offset flatbuffers.UOffsetT, sizePrefix bool, fail func(string, ...interface{})) {\n\tvar monster *example.MonsterT\n\n\tif sizePrefix {\n\t\tmonster = example.GetSizePrefixedRootAsMonster(buf, offset).UnPack()\n\t} else {\n\t\tmonster = example.GetRootAsMonster(buf, offset).UnPack()\n\t}\n\n\tif got := monster.Hp; 80 != got {\n\t\tfail(FailString(\"hp\", 80, got))\n\t}\n\n\t// default\n\tif got := monster.Mana; 150 != got {\n\t\tfail(FailString(\"mana\", 150, got))\n\t}\n\n\tif monster.Test != nil && monster.Test.Type == example.AnyMonster {\n\t\tmonster.Test.Value.(*example.MonsterT).NanDefault = 0.0\n\t}\n\tif monster.Enemy != nil {\n\t\tmonster.Enemy.NanDefault = 0.0\n\t}\n\tmonster.NanDefault = 0.0\n\n\tbuilder := flatbuffers.NewBuilder(0)\n\tbuilder.Finish(monster.Pack(builder))\n\tmonster2 := example.GetRootAsMonster(builder.FinishedBytes(), 0).UnPack()\n\tif !reflect.DeepEqual(monster, monster2) {\n\t\tfail(FailString(\"Pack/Unpack()\", monster, monster2))\n\t}\n}\n\n// Low level stress/fuzz test: serialize/deserialize a variety of\n// different kinds of data in different combinations\nfunc checkFuzz(fuzzFields, fuzzObjects int, fail func(string, ...interface{})) {\n\n\t// Values we're testing against: chosen to ensure no bits get chopped\n\t// off anywhere, and also be different from eachother.\n\tboolVal := true\n\tint8Val := int8(-127) // 0x81\n\tuint8Val := uint8(0xFF)\n\tint16Val := int16(-32222) // 0x8222\n\tuint16Val := uint16(0xFEEE)\n\tint32Val := int32(overflowingInt32Val)\n\tuint32Val := uint32(0xFDDDDDDD)\n\tint64Val := int64(overflowingInt64Val)\n\tuint64Val := uint64(0xFCCCCCCCCCCCCCCC)\n\tfloat32Val := float32(3.14159)\n\tfloat64Val := float64(3.14159265359)\n\n\ttestValuesMax := 11 // hardcoded to the number of scalar types\n\n\tbuilder := flatbuffers.NewBuilder(0)\n\tl := NewLCG()\n\n\tobjects := make([]flatbuffers.UOffsetT, fuzzObjects)\n\n\t// Generate fuzzObjects random objects each consisting of\n\t// fuzzFields fields, each of a random type.\n\tfor i := 0; i < fuzzObjects; i++ {\n\t\tbuilder.StartObject(fuzzFields)\n\n\t\tfor f := 0; f < fuzzFields; f++ {\n\t\t\tchoice := l.Next() % uint32(testValuesMax)\n\t\t\tswitch choice {\n\t\t\tcase 0:\n\t\t\t\tbuilder.PrependBoolSlot(int(f), boolVal, false)\n\t\t\tcase 1:\n\t\t\t\tbuilder.PrependInt8Slot(int(f), int8Val, 0)\n\t\t\tcase 2:\n\t\t\t\tbuilder.PrependUint8Slot(int(f), uint8Val, 0)\n\t\t\tcase 3:\n\t\t\t\tbuilder.PrependInt16Slot(int(f), int16Val, 0)\n\t\t\tcase 4:\n\t\t\t\tbuilder.PrependUint16Slot(int(f), uint16Val, 0)\n\t\t\tcase 5:\n\t\t\t\tbuilder.PrependInt32Slot(int(f), int32Val, 0)\n\t\t\tcase 6:\n\t\t\t\tbuilder.PrependUint32Slot(int(f), uint32Val, 0)\n\t\t\tcase 7:\n\t\t\t\tbuilder.PrependInt64Slot(int(f), int64Val, 0)\n\t\t\tcase 8:\n\t\t\t\tbuilder.PrependUint64Slot(int(f), uint64Val, 0)\n\t\t\tcase 9:\n\t\t\t\tbuilder.PrependFloat32Slot(int(f), float32Val, 0)\n\t\t\tcase 10:\n\t\t\t\tbuilder.PrependFloat64Slot(int(f), float64Val, 0)\n\t\t\t}\n\t\t}\n\n\t\toff := builder.EndObject()\n\n\t\t// store the offset from the end of the builder buffer,\n\t\t// since it will keep growing:\n\t\tobjects[i] = off\n\t}\n\n\t// Do some bookkeeping to generate stats on fuzzes:\n\tstats := map[string]int{}\n\tcheck := func(desc string, want, got interface{}) {\n\t\tstats[desc]++\n\t\tif want != got {\n\t\t\tfail(\"%s want %v got %v\", desc, want, got)\n\t\t}\n\t}\n\n\tl = NewLCG() // Reset.\n\n\t// Test that all objects we generated are readable and return the\n\t// expected values. We generate random objects in the same order\n\t// so this is deterministic.\n\tfor i := 0; i < fuzzObjects; i++ {\n\n\t\ttable := &flatbuffers.Table{\n\t\t\tBytes: builder.Bytes,\n\t\t\tPos:   flatbuffers.UOffsetT(len(builder.Bytes)) - objects[i],\n\t\t}\n\n\t\tfor j := 0; j < fuzzFields; j++ {\n\t\t\tf := flatbuffers.VOffsetT((flatbuffers.VtableMetadataFields + j) * flatbuffers.SizeVOffsetT)\n\t\t\tchoice := l.Next() % uint32(testValuesMax)\n\n\t\t\tswitch choice {\n\t\t\tcase 0:\n\t\t\t\tcheck(\"bool\", boolVal, table.GetBoolSlot(f, false))\n\t\t\tcase 1:\n\t\t\t\tcheck(\"int8\", int8Val, table.GetInt8Slot(f, 0))\n\t\t\tcase 2:\n\t\t\t\tcheck(\"uint8\", uint8Val, table.GetUint8Slot(f, 0))\n\t\t\tcase 3:\n\t\t\t\tcheck(\"int16\", int16Val, table.GetInt16Slot(f, 0))\n\t\t\tcase 4:\n\t\t\t\tcheck(\"uint16\", uint16Val, table.GetUint16Slot(f, 0))\n\t\t\tcase 5:\n\t\t\t\tcheck(\"int32\", int32Val, table.GetInt32Slot(f, 0))\n\t\t\tcase 6:\n\t\t\t\tcheck(\"uint32\", uint32Val, table.GetUint32Slot(f, 0))\n\t\t\tcase 7:\n\t\t\t\tcheck(\"int64\", int64Val, table.GetInt64Slot(f, 0))\n\t\t\tcase 8:\n\t\t\t\tcheck(\"uint64\", uint64Val, table.GetUint64Slot(f, 0))\n\t\t\tcase 9:\n\t\t\t\tcheck(\"float32\", float32Val, table.GetFloat32Slot(f, 0))\n\t\t\tcase 10:\n\t\t\t\tcheck(\"float64\", float64Val, table.GetFloat64Slot(f, 0))\n\t\t\t}\n\t\t}\n\t}\n\n\t// If enough checks were made, verify that all scalar types were used:\n\tif fuzzFields*fuzzObjects >= testValuesMax {\n\t\tif len(stats) != testValuesMax {\n\t\t\tfail(\"fuzzing failed to test all scalar types\")\n\t\t}\n\t}\n\n\t// Print some counts, if needed:\n\tif testing.Verbose() {\n\t\tif fuzzFields == 0 || fuzzObjects == 0 {\n\t\t\tfmt.Printf(\"fuzz\\tfields: %d\\tobjects: %d\\t[none]\\t%d\\n\",\n\t\t\t\tfuzzFields, fuzzObjects, 0)\n\t\t} else {\n\t\t\tkeys := make([]string, 0, len(stats))\n\t\t\tfor k := range stats {\n\t\t\t\tkeys = append(keys, k)\n\t\t\t}\n\t\t\tsort.Strings(keys)\n\t\t\tfor _, k := range keys {\n\t\t\t\tfmt.Printf(\"fuzz\\tfields: %d\\tobjects: %d\\t%s\\t%d\\n\",\n\t\t\t\t\tfuzzFields, fuzzObjects, k, stats[k])\n\t\t\t}\n\t\t}\n\t}\n\n\treturn\n}\n\n// FailString makes a message for when expectations differ from reality.\nfunc FailString(name string, want, got interface{}) string {\n\treturn fmt.Sprintf(\"bad %s: want %#v got %#v\", name, want, got)\n}\n\n// CheckByteLayout verifies the bytes of a Builder in various scenarios.\nfunc CheckByteLayout(fail func(string, ...interface{})) {\n\tvar b *flatbuffers.Builder\n\n\tvar i int\n\tcheck := func(want []byte) {\n\t\ti++\n\t\tgot := b.Bytes[b.Head():]\n\t\tif !bytes.Equal(want, got) {\n\t\t\tfail(\"case %d: want\\n%v\\nbut got\\n%v\\n\", i, want, got)\n\t\t}\n\t}\n\n\t// test 1: numbers\n\n\tb = flatbuffers.NewBuilder(0)\n\tcheck([]byte{})\n\tb.PrependBool(true)\n\tcheck([]byte{1})\n\tb.PrependInt8(-127)\n\tcheck([]byte{129, 1})\n\tb.PrependUint8(255)\n\tcheck([]byte{255, 129, 1})\n\tb.PrependInt16(-32222)\n\tcheck([]byte{0x22, 0x82, 0, 255, 129, 1}) // first pad\n\tb.PrependUint16(0xFEEE)\n\tcheck([]byte{0xEE, 0xFE, 0x22, 0x82, 0, 255, 129, 1}) // no pad this time\n\tb.PrependInt32(-53687092)\n\tcheck([]byte{204, 204, 204, 252, 0xEE, 0xFE, 0x22, 0x82, 0, 255, 129, 1})\n\tb.PrependUint32(0x98765432)\n\tcheck([]byte{0x32, 0x54, 0x76, 0x98, 204, 204, 204, 252, 0xEE, 0xFE, 0x22, 0x82, 0, 255, 129, 1})\n\n\t// test 1b: numbers 2\n\n\tb = flatbuffers.NewBuilder(0)\n\tb.PrependUint64(0x1122334455667788)\n\tcheck([]byte{0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11})\n\n\t// test 2: 1xbyte vector\n\n\tb = flatbuffers.NewBuilder(0)\n\tcheck([]byte{})\n\tb.StartVector(flatbuffers.SizeByte, 1, 1)\n\tcheck([]byte{0, 0, 0}) // align to 4bytes\n\tb.PrependByte(1)\n\tcheck([]byte{1, 0, 0, 0})\n\tb.EndVector(1)\n\tcheck([]byte{1, 0, 0, 0, 1, 0, 0, 0}) // padding\n\n\t// test 3: 2xbyte vector\n\n\tb = flatbuffers.NewBuilder(0)\n\tb.StartVector(flatbuffers.SizeByte, 2, 1)\n\tcheck([]byte{0, 0}) // align to 4bytes\n\tb.PrependByte(1)\n\tcheck([]byte{1, 0, 0})\n\tb.PrependByte(2)\n\tcheck([]byte{2, 1, 0, 0})\n\tb.EndVector(2)\n\tcheck([]byte{2, 0, 0, 0, 2, 1, 0, 0}) // padding\n\n\t// test 3b: 11xbyte vector matches builder size\n\n\tb = flatbuffers.NewBuilder(12)\n\tb.StartVector(flatbuffers.SizeByte, 8, 1)\n\tstart := []byte{}\n\tcheck(start)\n\tfor i := 1; i < 12; i++ {\n\t\tb.PrependByte(byte(i))\n\t\tstart = append([]byte{byte(i)}, start...)\n\t\tcheck(start)\n\t}\n\tb.EndVector(8)\n\tcheck(append([]byte{8, 0, 0, 0}, start...))\n\n\t// test 4: 1xuint16 vector\n\n\tb = flatbuffers.NewBuilder(0)\n\tb.StartVector(flatbuffers.SizeUint16, 1, 1)\n\tcheck([]byte{0, 0}) // align to 4bytes\n\tb.PrependUint16(1)\n\tcheck([]byte{1, 0, 0, 0})\n\tb.EndVector(1)\n\tcheck([]byte{1, 0, 0, 0, 1, 0, 0, 0}) // padding\n\n\t// test 5: 2xuint16 vector\n\n\tb = flatbuffers.NewBuilder(0)\n\tb.StartVector(flatbuffers.SizeUint16, 2, 1)\n\tcheck([]byte{}) // align to 4bytes\n\tb.PrependUint16(0xABCD)\n\tcheck([]byte{0xCD, 0xAB})\n\tb.PrependUint16(0xDCBA)\n\tcheck([]byte{0xBA, 0xDC, 0xCD, 0xAB})\n\tb.EndVector(2)\n\tcheck([]byte{2, 0, 0, 0, 0xBA, 0xDC, 0xCD, 0xAB})\n\n\t// test 6: CreateString\n\n\tb = flatbuffers.NewBuilder(0)\n\tb.CreateString(\"foo\")\n\tcheck([]byte{3, 0, 0, 0, 'f', 'o', 'o', 0}) // 0-terminated, no pad\n\tb.CreateString(\"moop\")\n\tcheck([]byte{4, 0, 0, 0, 'm', 'o', 'o', 'p', 0, 0, 0, 0, // 0-terminated, 3-byte pad\n\t\t3, 0, 0, 0, 'f', 'o', 'o', 0})\n\n\t// test 6b: CreateString unicode\n\n\tb = flatbuffers.NewBuilder(0)\n\t// These characters are chinese from blog.golang.org/strings\n\t// We use escape codes here so that editors without unicode support\n\t// aren't bothered:\n\tuni_str := \"\\u65e5\\u672c\\u8a9e\"\n\tb.CreateString(uni_str)\n\tcheck([]byte{9, 0, 0, 0, 230, 151, 165, 230, 156, 172, 232, 170, 158, 0, //  null-terminated, 2-byte pad\n\t\t0, 0})\n\n\t// test 6c: CreateByteString\n\n\tb = flatbuffers.NewBuilder(0)\n\tb.CreateByteString([]byte(\"foo\"))\n\tcheck([]byte{3, 0, 0, 0, 'f', 'o', 'o', 0}) // 0-terminated, no pad\n\tb.CreateByteString([]byte(\"moop\"))\n\tcheck([]byte{4, 0, 0, 0, 'm', 'o', 'o', 'p', 0, 0, 0, 0, // 0-terminated, 3-byte pad\n\t\t3, 0, 0, 0, 'f', 'o', 'o', 0})\n\n\t// test 7: empty vtable\n\tb = flatbuffers.NewBuilder(0)\n\tb.StartObject(0)\n\tcheck([]byte{})\n\tb.EndObject()\n\tcheck([]byte{4, 0, 4, 0, 4, 0, 0, 0})\n\n\t// test 8: vtable with one true bool\n\tb = flatbuffers.NewBuilder(0)\n\tcheck([]byte{})\n\tb.StartObject(1)\n\tcheck([]byte{})\n\tb.PrependBoolSlot(0, true, false)\n\tb.EndObject()\n\tcheck([]byte{\n\t\t6, 0, // vtable bytes\n\t\t8, 0, // length of object including vtable offset\n\t\t7, 0, // start of bool value\n\t\t6, 0, 0, 0, // offset for start of vtable (int32)\n\t\t0, 0, 0, // padded to 4 bytes\n\t\t1, // bool value\n\t})\n\n\t// test 9: vtable with one default bool\n\tb = flatbuffers.NewBuilder(0)\n\tcheck([]byte{})\n\tb.StartObject(1)\n\tcheck([]byte{})\n\tb.PrependBoolSlot(0, false, false)\n\tb.EndObject()\n\tcheck([]byte{\n\t\t4, 0, // vtable bytes\n\t\t4, 0, // end of object from here\n\t\t// entry 1 is zero and not stored.\n\t\t4, 0, 0, 0, // offset for start of vtable (int32)\n\t})\n\n\t// test 10: vtable with one int16\n\tb = flatbuffers.NewBuilder(0)\n\tb.StartObject(1)\n\tb.PrependInt16Slot(0, 0x789A, 0)\n\tb.EndObject()\n\tcheck([]byte{\n\t\t6, 0, // vtable bytes\n\t\t8, 0, // end of object from here\n\t\t6, 0, // offset to value\n\t\t6, 0, 0, 0, // offset for start of vtable (int32)\n\t\t0, 0, // padding to 4 bytes\n\t\t0x9A, 0x78,\n\t})\n\n\t// test 11: vtable with two int16\n\tb = flatbuffers.NewBuilder(0)\n\tb.StartObject(2)\n\tb.PrependInt16Slot(0, 0x3456, 0)\n\tb.PrependInt16Slot(1, 0x789A, 0)\n\tb.EndObject()\n\tcheck([]byte{\n\t\t8, 0, // vtable bytes\n\t\t8, 0, // end of object from here\n\t\t6, 0, // offset to value 0\n\t\t4, 0, // offset to value 1\n\t\t8, 0, 0, 0, // offset for start of vtable (int32)\n\t\t0x9A, 0x78, // value 1\n\t\t0x56, 0x34, // value 0\n\t})\n\n\t// test 12: vtable with int16 and bool\n\tb = flatbuffers.NewBuilder(0)\n\tb.StartObject(2)\n\tb.PrependInt16Slot(0, 0x3456, 0)\n\tb.PrependBoolSlot(1, true, false)\n\tb.EndObject()\n\tcheck([]byte{\n\t\t8, 0, // vtable bytes\n\t\t8, 0, // end of object from here\n\t\t6, 0, // offset to value 0\n\t\t5, 0, // offset to value 1\n\t\t8, 0, 0, 0, // offset for start of vtable (int32)\n\t\t0,          // padding\n\t\t1,          // value 1\n\t\t0x56, 0x34, // value 0\n\t})\n\n\t// test 12: vtable with empty vector\n\tb = flatbuffers.NewBuilder(0)\n\tb.StartVector(flatbuffers.SizeByte, 0, 1)\n\tvecend := b.EndVector(0)\n\tb.StartObject(1)\n\tb.PrependUOffsetTSlot(0, vecend, 0)\n\tb.EndObject()\n\tcheck([]byte{\n\t\t6, 0, // vtable bytes\n\t\t8, 0,\n\t\t4, 0, // offset to vector offset\n\t\t6, 0, 0, 0, // offset for start of vtable (int32)\n\t\t4, 0, 0, 0,\n\t\t0, 0, 0, 0, // length of vector (not in struct)\n\t})\n\n\t// test 12b: vtable with empty vector of byte and some scalars\n\tb = flatbuffers.NewBuilder(0)\n\tb.StartVector(flatbuffers.SizeByte, 0, 1)\n\tvecend = b.EndVector(0)\n\tb.StartObject(2)\n\tb.PrependInt16Slot(0, 55, 0)\n\tb.PrependUOffsetTSlot(1, vecend, 0)\n\tb.EndObject()\n\tcheck([]byte{\n\t\t8, 0, // vtable bytes\n\t\t12, 0,\n\t\t10, 0, // offset to value 0\n\t\t4, 0, // offset to vector offset\n\t\t8, 0, 0, 0, // vtable loc\n\t\t8, 0, 0, 0, // value 1\n\t\t0, 0, 55, 0, // value 0\n\n\t\t0, 0, 0, 0, // length of vector (not in struct)\n\t})\n\n\t// test 13: vtable with 1 int16 and 2-vector of int16\n\tb = flatbuffers.NewBuilder(0)\n\tb.StartVector(flatbuffers.SizeInt16, 2, 1)\n\tb.PrependInt16(0x1234)\n\tb.PrependInt16(0x5678)\n\tvecend = b.EndVector(2)\n\tb.StartObject(2)\n\tb.PrependUOffsetTSlot(1, vecend, 0)\n\tb.PrependInt16Slot(0, 55, 0)\n\tb.EndObject()\n\tcheck([]byte{\n\t\t8, 0, // vtable bytes\n\t\t12, 0, // length of object\n\t\t6, 0, // start of value 0 from end of vtable\n\t\t8, 0, // start of value 1 from end of buffer\n\t\t8, 0, 0, 0, // offset for start of vtable (int32)\n\t\t0, 0, // padding\n\t\t55, 0, // value 0\n\t\t4, 0, 0, 0, // vector position from here\n\t\t2, 0, 0, 0, // length of vector (uint32)\n\t\t0x78, 0x56, // vector value 1\n\t\t0x34, 0x12, // vector value 0\n\t})\n\n\t// test 14: vtable with 1 struct of 1 int8, 1 int16, 1 int32\n\tb = flatbuffers.NewBuilder(0)\n\tb.StartObject(1)\n\tb.Prep(4+4+4, 0)\n\tb.PrependInt8(55)\n\tb.Pad(3)\n\tb.PrependInt16(0x1234)\n\tb.Pad(2)\n\tb.PrependInt32(0x12345678)\n\tstructStart := b.Offset()\n\tb.PrependStructSlot(0, structStart, 0)\n\tb.EndObject()\n\tcheck([]byte{\n\t\t6, 0, // vtable bytes\n\t\t16, 0, // end of object from here\n\t\t4, 0, // start of struct from here\n\t\t6, 0, 0, 0, // offset for start of vtable (int32)\n\t\t0x78, 0x56, 0x34, 0x12, // value 2\n\t\t0, 0, // padding\n\t\t0x34, 0x12, // value 1\n\t\t0, 0, 0, // padding\n\t\t55, // value 0\n\t})\n\n\t// test 15: vtable with 1 vector of 2 struct of 2 int8\n\tb = flatbuffers.NewBuilder(0)\n\tb.StartVector(flatbuffers.SizeInt8*2, 2, 1)\n\tb.PrependInt8(33)\n\tb.PrependInt8(44)\n\tb.PrependInt8(55)\n\tb.PrependInt8(66)\n\tvecend = b.EndVector(2)\n\tb.StartObject(1)\n\tb.PrependUOffsetTSlot(0, vecend, 0)\n\tb.EndObject()\n\tcheck([]byte{\n\t\t6, 0, // vtable bytes\n\t\t8, 0,\n\t\t4, 0, // offset of vector offset\n\t\t6, 0, 0, 0, // offset for start of vtable (int32)\n\t\t4, 0, 0, 0, // vector start offset\n\n\t\t2, 0, 0, 0, // vector length\n\t\t66, // vector value 1,1\n\t\t55, // vector value 1,0\n\t\t44, // vector value 0,1\n\t\t33, // vector value 0,0\n\t})\n\n\t// test 16: table with some elements\n\tb = flatbuffers.NewBuilder(0)\n\tb.StartObject(2)\n\tb.PrependInt8Slot(0, 33, 0)\n\tb.PrependInt16Slot(1, 66, 0)\n\toff := b.EndObject()\n\tb.Finish(off)\n\n\tcheck([]byte{\n\t\t12, 0, 0, 0, // root of table: points to vtable offset\n\n\t\t8, 0, // vtable bytes\n\t\t8, 0, // end of object from here\n\t\t7, 0, // start of value 0\n\t\t4, 0, // start of value 1\n\n\t\t8, 0, 0, 0, // offset for start of vtable (int32)\n\n\t\t66, 0, // value 1\n\t\t0,  // padding\n\t\t33, // value 0\n\t})\n\n\t// test 16b: same as test 16, size prefixed\n\tb = flatbuffers.NewBuilder(0)\n\tb.StartObject(2)\n\tb.PrependInt8Slot(0, 33, 0)\n\tb.PrependInt16Slot(1, 66, 0)\n\toff = b.EndObject()\n\tb.FinishSizePrefixed(off)\n\n\tcheck([]byte{\n\t\t20, 0, 0, 0, // size prefix\n\t\t12, 0, 0, 0, // root of table: points to vtable offset\n\n\t\t8, 0, // vtable bytes\n\t\t8, 0, // end of object from here\n\t\t7, 0, // start of value 0\n\t\t4, 0, // start of value 1\n\n\t\t8, 0, 0, 0, // offset for start of vtable (int32)\n\n\t\t66, 0, // value 1\n\t\t0,  // padding\n\t\t33, // value 0\n\t})\n\n\t// test 16c: same as test 16, with file identifier\n\tb = flatbuffers.NewBuilder(0)\n\tb.StartObject(2)\n\tb.PrependInt8Slot(0, 33, 0)\n\tb.PrependInt16Slot(1, 66, 0)\n\toff = b.EndObject()\n\tb.FinishWithFileIdentifier(off, []byte(\"TEST\"))\n\n\tcheck([]byte{\n\t\t16, 0, 0, 0, // root of table: points to vtable offset\n\t\t'T', 'E', 'S', 'T', // file identifier\n\n\t\t8, 0, // vtable bytes\n\t\t8, 0, // end of object from here\n\t\t7, 0, // start of value 0\n\t\t4, 0, // start of value 1\n\n\t\t8, 0, 0, 0, // offset for start of vtable (int32)\n\n\t\t66, 0, // value 1\n\t\t0,  // padding\n\t\t33, // value 0\n\t})\n\n\t// test 16d: same as test 16, size prefixed with file identifier\n\tb = flatbuffers.NewBuilder(0)\n\tb.StartObject(2)\n\tb.PrependInt8Slot(0, 33, 0)\n\tb.PrependInt16Slot(1, 66, 0)\n\toff = b.EndObject()\n\tb.FinishSizePrefixedWithFileIdentifier(off, []byte(\"TEST\"))\n\n\tcheck([]byte{\n\t\t24, 0, 0, 0, // size prefix\n\t\t16, 0, 0, 0, // root of table: points to vtable offset\n\t\t'T', 'E', 'S', 'T', // file identifier\n\n\t\t8, 0, // vtable bytes\n\t\t8, 0, // end of object from here\n\t\t7, 0, // start of value 0\n\t\t4, 0, // start of value 1\n\n\t\t8, 0, 0, 0, // offset for start of vtable (int32)\n\n\t\t66, 0, // value 1\n\t\t0,  // padding\n\t\t33, // value 0\n\t})\n\n\t// test 17: one unfinished table and one finished table\n\tb = flatbuffers.NewBuilder(0)\n\tb.StartObject(2)\n\tb.PrependInt8Slot(0, 33, 0)\n\tb.PrependInt8Slot(1, 44, 0)\n\toff = b.EndObject()\n\tb.Finish(off)\n\n\tb.StartObject(3)\n\tb.PrependInt8Slot(0, 55, 0)\n\tb.PrependInt8Slot(1, 66, 0)\n\tb.PrependInt8Slot(2, 77, 0)\n\toff = b.EndObject()\n\tb.Finish(off)\n\n\tcheck([]byte{\n\t\t16, 0, 0, 0, // root of table: points to object\n\t\t0, 0, // padding\n\n\t\t10, 0, // vtable bytes\n\t\t8, 0, // size of object\n\t\t7, 0, // start of value 0\n\t\t6, 0, // start of value 1\n\t\t5, 0, // start of value 2\n\t\t10, 0, 0, 0, // offset for start of vtable (int32)\n\t\t0,  // padding\n\t\t77, // value 2\n\t\t66, // value 1\n\t\t55, // value 0\n\n\t\t12, 0, 0, 0, // root of table: points to object\n\n\t\t8, 0, // vtable bytes\n\t\t8, 0, // size of object\n\t\t7, 0, // start of value 0\n\t\t6, 0, // start of value 1\n\t\t8, 0, 0, 0, // offset for start of vtable (int32)\n\t\t0, 0, // padding\n\t\t44, // value 1\n\t\t33, // value 0\n\t})\n\n\t// test 18: a bunch of bools\n\tb = flatbuffers.NewBuilder(0)\n\tb.StartObject(8)\n\tb.PrependBoolSlot(0, true, false)\n\tb.PrependBoolSlot(1, true, false)\n\tb.PrependBoolSlot(2, true, false)\n\tb.PrependBoolSlot(3, true, false)\n\tb.PrependBoolSlot(4, true, false)\n\tb.PrependBoolSlot(5, true, false)\n\tb.PrependBoolSlot(6, true, false)\n\tb.PrependBoolSlot(7, true, false)\n\toff = b.EndObject()\n\tb.Finish(off)\n\n\tcheck([]byte{\n\t\t24, 0, 0, 0, // root of table: points to vtable offset\n\n\t\t20, 0, // vtable bytes\n\t\t12, 0, // size of object\n\t\t11, 0, // start of value 0\n\t\t10, 0, // start of value 1\n\t\t9, 0, // start of value 2\n\t\t8, 0, // start of value 3\n\t\t7, 0, // start of value 4\n\t\t6, 0, // start of value 5\n\t\t5, 0, // start of value 6\n\t\t4, 0, // start of value 7\n\t\t20, 0, 0, 0, // vtable offset\n\n\t\t1, // value 7\n\t\t1, // value 6\n\t\t1, // value 5\n\t\t1, // value 4\n\t\t1, // value 3\n\t\t1, // value 2\n\t\t1, // value 1\n\t\t1, // value 0\n\t})\n\n\t// test 19: three bools\n\tb = flatbuffers.NewBuilder(0)\n\tb.StartObject(3)\n\tb.PrependBoolSlot(0, true, false)\n\tb.PrependBoolSlot(1, true, false)\n\tb.PrependBoolSlot(2, true, false)\n\toff = b.EndObject()\n\tb.Finish(off)\n\n\tcheck([]byte{\n\t\t16, 0, 0, 0, // root of table: points to vtable offset\n\n\t\t0, 0, // padding\n\n\t\t10, 0, // vtable bytes\n\t\t8, 0, // size of object\n\t\t7, 0, // start of value 0\n\t\t6, 0, // start of value 1\n\t\t5, 0, // start of value 2\n\t\t10, 0, 0, 0, // vtable offset from here\n\n\t\t0, // padding\n\t\t1, // value 2\n\t\t1, // value 1\n\t\t1, // value 0\n\t})\n\n\t// test 20: some floats\n\tb = flatbuffers.NewBuilder(0)\n\tb.StartObject(1)\n\tb.PrependFloat32Slot(0, 1.0, 0.0)\n\toff = b.EndObject()\n\n\tcheck([]byte{\n\t\t6, 0, // vtable bytes\n\t\t8, 0, // size of object\n\t\t4, 0, // start of value 0\n\t\t6, 0, 0, 0, // vtable offset\n\n\t\t0, 0, 128, 63, // value 0\n\t})\n}\n\n// CheckManualBuild builds a Monster manually.\nfunc CheckManualBuild(fail func(string, ...interface{})) ([]byte, flatbuffers.UOffsetT) {\n\tb := flatbuffers.NewBuilder(0)\n\tstr := b.CreateString(\"MyMonster\")\n\n\tb.StartVector(1, 5, 1)\n\tb.PrependByte(4)\n\tb.PrependByte(3)\n\tb.PrependByte(2)\n\tb.PrependByte(1)\n\tb.PrependByte(0)\n\tinv := b.EndVector(5)\n\n\tb.StartObject(13)\n\tb.PrependInt16Slot(2, 20, 100)\n\tmon2 := b.EndObject()\n\n\t// Test4Vector\n\tb.StartVector(4, 2, 1)\n\n\t// Test 0\n\tb.Prep(2, 4)\n\tb.Pad(1)\n\tb.PlaceInt8(20)\n\tb.PlaceInt16(10)\n\n\t// Test 1\n\tb.Prep(2, 4)\n\tb.Pad(1)\n\tb.PlaceInt8(40)\n\tb.PlaceInt16(30)\n\n\t// end testvector\n\ttest4 := b.EndVector(2)\n\n\tb.StartObject(13)\n\n\t// a vec3\n\tb.Prep(16, 32)\n\tb.Pad(2)\n\tb.Prep(2, 4)\n\tb.Pad(1)\n\tb.PlaceByte(6)\n\tb.PlaceInt16(5)\n\tb.Pad(1)\n\tb.PlaceByte(4)\n\tb.PlaceFloat64(3.0)\n\tb.Pad(4)\n\tb.PlaceFloat32(3.0)\n\tb.PlaceFloat32(2.0)\n\tb.PlaceFloat32(1.0)\n\tvec3Loc := b.Offset()\n\t// end vec3\n\n\tb.PrependStructSlot(0, vec3Loc, 0) // vec3. noop\n\tb.PrependInt16Slot(2, 80, 100)     // hp\n\tb.PrependUOffsetTSlot(3, str, 0)\n\tb.PrependUOffsetTSlot(5, inv, 0) // inventory\n\tb.PrependByteSlot(7, 1, 0)\n\tb.PrependUOffsetTSlot(8, mon2, 0)\n\tb.PrependUOffsetTSlot(9, test4, 0)\n\tmon := b.EndObject()\n\n\tb.Finish(mon)\n\n\treturn b.Bytes, b.Head()\n}\n\nfunc CheckGetRootAsForNonRootTable(fail func(string, ...interface{})) {\n\tb := flatbuffers.NewBuilder(0)\n\tstr := b.CreateString(\"MyStat\")\n\texample.StatStart(b)\n\texample.StatAddId(b, str)\n\texample.StatAddVal(b, 12345678)\n\texample.StatAddCount(b, 12345)\n\tstat_end := example.StatEnd(b)\n\tb.Finish(stat_end)\n\n\tstat := example.GetRootAsStat(b.Bytes, b.Head())\n\n\tif got := stat.Id(); !bytes.Equal([]byte(\"MyStat\"), got) {\n\t\tfail(FailString(\"stat.Id()\", \"MyStat\", got))\n\t}\n\n\tif got := stat.Val(); 12345678 != got {\n\t\tfail(FailString(\"stat.Val()\", 12345678, got))\n\t}\n\n\tif got := stat.Count(); 12345 != got {\n\t\tfail(FailString(\"stat.Count()\", 12345, got))\n\t}\n}\n\n// CheckGeneratedBuild uses generated code to build the example Monster.\nfunc CheckGeneratedBuild(sizePrefix, fileIdentifier bool, fail func(string, ...interface{})) ([]byte, flatbuffers.UOffsetT) {\n\tb := flatbuffers.NewBuilder(0)\n\tstr := b.CreateString(\"MyMonster\")\n\ttest1 := b.CreateString(\"test1\")\n\ttest2 := b.CreateString(\"test2\")\n\tfred := b.CreateString(\"Fred\")\n\n\texample.MonsterStartInventoryVector(b, 5)\n\tb.PrependByte(4)\n\tb.PrependByte(3)\n\tb.PrependByte(2)\n\tb.PrependByte(1)\n\tb.PrependByte(0)\n\tinv := b.EndVector(5)\n\n\texample.MonsterStart(b)\n\texample.MonsterAddName(b, fred)\n\tmon2 := example.MonsterEnd(b)\n\n\texample.MonsterStartTest4Vector(b, 2)\n\texample.CreateTest(b, 10, 20)\n\texample.CreateTest(b, 30, 40)\n\ttest4 := b.EndVector(2)\n\n\texample.MonsterStartTestarrayofstringVector(b, 2)\n\tb.PrependUOffsetT(test2)\n\tb.PrependUOffsetT(test1)\n\ttestArrayOfString := b.EndVector(2)\n\n\texample.MonsterStart(b)\n\n\tpos := example.CreateVec3(b, 1.0, 2.0, 3.0, 3.0, example.ColorGreen, 5, 6)\n\texample.MonsterAddPos(b, pos)\n\n\texample.MonsterAddHp(b, 80)\n\texample.MonsterAddName(b, str)\n\texample.MonsterAddTestbool(b, true)\n\texample.MonsterAddInventory(b, inv)\n\texample.MonsterAddTestType(b, 1)\n\texample.MonsterAddTest(b, mon2)\n\texample.MonsterAddTest4(b, test4)\n\texample.MonsterAddTestarrayofstring(b, testArrayOfString)\n\tmon := example.MonsterEnd(b)\n\n\tif fileIdentifier {\n\t\tif sizePrefix {\n\t\t\texample.FinishSizePrefixedMonsterBuffer(b, mon)\n\t\t} else {\n\t\t\texample.FinishMonsterBuffer(b, mon)\n\t\t}\n\t} else {\n\t\tif sizePrefix {\n\t\t\tb.FinishSizePrefixed(mon)\n\t\t} else {\n\t\t\tb.Finish(mon)\n\t\t}\n\t}\n\n\treturn b.Bytes, b.Head()\n}\n\n// CheckTableAccessors checks that the table accessors work as expected.\nfunc CheckTableAccessors(fail func(string, ...interface{})) {\n\t// test struct accessor\n\tb := flatbuffers.NewBuilder(0)\n\tpos := example.CreateVec3(b, 1.0, 2.0, 3.0, 3.0, 4, 5, 6)\n\tb.Finish(pos)\n\tvec3Bytes := b.FinishedBytes()\n\tvec3 := &example.Vec3{}\n\tflatbuffers.GetRootAs(vec3Bytes, 0, vec3)\n\n\tif bytes.Compare(vec3Bytes, vec3.Table().Bytes) != 0 {\n\t\tfail(\"invalid vec3 table\")\n\t}\n\n\t// test table accessor\n\tb = flatbuffers.NewBuilder(0)\n\tstr := b.CreateString(\"MyStat\")\n\texample.StatStart(b)\n\texample.StatAddId(b, str)\n\texample.StatAddVal(b, 12345678)\n\texample.StatAddCount(b, 12345)\n\tpos = example.StatEnd(b)\n\tb.Finish(pos)\n\tstatBytes := b.FinishedBytes()\n\tstat := &example.Stat{}\n\tflatbuffers.GetRootAs(statBytes, 0, stat)\n\n\tif bytes.Compare(statBytes, stat.Table().Bytes) != 0 {\n\t\tfail(\"invalid stat table\")\n\t}\n}\n\n// CheckVtableDeduplication verifies that vtables are deduplicated.\nfunc CheckVtableDeduplication(fail func(string, ...interface{})) {\n\tb := flatbuffers.NewBuilder(0)\n\n\tb.StartObject(4)\n\tb.PrependByteSlot(0, 0, 0)\n\tb.PrependByteSlot(1, 11, 0)\n\tb.PrependByteSlot(2, 22, 0)\n\tb.PrependInt16Slot(3, 33, 0)\n\tobj0 := b.EndObject()\n\n\tb.StartObject(4)\n\tb.PrependByteSlot(0, 0, 0)\n\tb.PrependByteSlot(1, 44, 0)\n\tb.PrependByteSlot(2, 55, 0)\n\tb.PrependInt16Slot(3, 66, 0)\n\tobj1 := b.EndObject()\n\n\tb.StartObject(4)\n\tb.PrependByteSlot(0, 0, 0)\n\tb.PrependByteSlot(1, 77, 0)\n\tb.PrependByteSlot(2, 88, 0)\n\tb.PrependInt16Slot(3, 99, 0)\n\tobj2 := b.EndObject()\n\n\tgot := b.Bytes[b.Head():]\n\n\twant := []byte{\n\t\t240, 255, 255, 255, // == -12. offset to dedupped vtable.\n\t\t99, 0,\n\t\t88,\n\t\t77,\n\t\t248, 255, 255, 255, // == -8. offset to dedupped vtable.\n\t\t66, 0,\n\t\t55,\n\t\t44,\n\t\t12, 0,\n\t\t8, 0,\n\t\t0, 0,\n\t\t7, 0,\n\t\t6, 0,\n\t\t4, 0,\n\t\t12, 0, 0, 0,\n\t\t33, 0,\n\t\t22,\n\t\t11,\n\t}\n\n\tif !bytes.Equal(want, got) {\n\t\tfail(\"testVtableDeduplication want:\\n%d %v\\nbut got:\\n%d %v\\n\",\n\t\t\tlen(want), want, len(got), got)\n\t}\n\n\ttable0 := &flatbuffers.Table{Bytes: b.Bytes, Pos: flatbuffers.UOffsetT(len(b.Bytes)) - obj0}\n\ttable1 := &flatbuffers.Table{Bytes: b.Bytes, Pos: flatbuffers.UOffsetT(len(b.Bytes)) - obj1}\n\ttable2 := &flatbuffers.Table{Bytes: b.Bytes, Pos: flatbuffers.UOffsetT(len(b.Bytes)) - obj2}\n\n\ttestTable := func(tab *flatbuffers.Table, a flatbuffers.VOffsetT, b, c, d byte) {\n\t\t// vtable size\n\t\tif got := tab.GetVOffsetTSlot(0, 0); 12 != got {\n\t\t\tfail(\"failed 0, 0: %d\", got)\n\t\t}\n\t\t// object size\n\t\tif got := tab.GetVOffsetTSlot(2, 0); 8 != got {\n\t\t\tfail(\"failed 2, 0: %d\", got)\n\t\t}\n\t\t// default value\n\t\tif got := tab.GetVOffsetTSlot(4, 0); a != got {\n\t\t\tfail(\"failed 4, 0: %d\", got)\n\t\t}\n\t\tif got := tab.GetByteSlot(6, 0); b != got {\n\t\t\tfail(\"failed 6, 0: %d\", got)\n\t\t}\n\t\tif val := tab.GetByteSlot(8, 0); c != val {\n\t\t\tfail(\"failed 8, 0: %d\", got)\n\t\t}\n\t\tif got := tab.GetByteSlot(10, 0); d != got {\n\t\t\tfail(\"failed 10, 0: %d\", got)\n\t\t}\n\t}\n\n\ttestTable(table0, 0, 11, 22, 33)\n\ttestTable(table1, 0, 44, 55, 66)\n\ttestTable(table2, 0, 77, 88, 99)\n}\n\n// CheckNotInObjectError verifies that `EndObject` fails if not inside an\n// object.\nfunc CheckNotInObjectError(fail func(string, ...interface{})) {\n\tb := flatbuffers.NewBuilder(0)\n\n\tdefer func() {\n\t\tr := recover()\n\t\tif r == nil {\n\t\t\tfail(\"expected panic in CheckNotInObjectError\")\n\t\t}\n\t}()\n\tb.EndObject()\n}\n\n// CheckStringIsNestedError verifies that a string can not be created inside\n// another object.\nfunc CheckStringIsNestedError(fail func(string, ...interface{})) {\n\tb := flatbuffers.NewBuilder(0)\n\tb.StartObject(0)\n\tdefer func() {\n\t\tr := recover()\n\t\tif r == nil {\n\t\t\tfail(\"expected panic in CheckStringIsNestedError\")\n\t\t}\n\t}()\n\tb.CreateString(\"foo\")\n}\n\nfunc CheckEmptiedBuilder(fail func(string, ...interface{})) {\n\tf := func(a, b string) bool {\n\t\tif a == b {\n\t\t\treturn true\n\t\t}\n\n\t\tbuilder := flatbuffers.NewBuilder(0)\n\n\t\ta1 := builder.CreateSharedString(a)\n\t\tb1 := builder.CreateSharedString(b)\n\t\tbuilder.Reset()\n\t\tb2 := builder.CreateSharedString(b)\n\t\ta2 := builder.CreateSharedString(a)\n\n\t\treturn !(a1 == a2 || b1 == b2)\n\t}\n\tif err := quick.Check(f, nil); err != nil {\n\t\tfail(\"expected different offset\")\n\t}\n}\n\nfunc CheckSharedStrings(fail func(string, ...interface{})) {\n\tf := func(strings []string) bool {\n\t\tb := flatbuffers.NewBuilder(0)\n\t\tfor _, s1 := range strings {\n\t\t\tfor _, s2 := range strings {\n\t\t\t\toff1 := b.CreateSharedString(s1)\n\t\t\t\toff2 := b.CreateSharedString(s2)\n\n\t\t\t\tif (s1 == s2) && (off1 != off2) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\tif (s1 != s2) && (off1 == off2) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn true\n\t}\n\tif err := quick.Check(f, nil); err != nil {\n\t\tfail(\"expected same offset\")\n\t}\n}\n\n// CheckByteStringIsNestedError verifies that a bytestring can not be created\n// inside another object.\nfunc CheckByteStringIsNestedError(fail func(string, ...interface{})) {\n\tb := flatbuffers.NewBuilder(0)\n\tb.StartObject(0)\n\tdefer func() {\n\t\tr := recover()\n\t\tif r == nil {\n\t\t\tfail(\"expected panic in CheckByteStringIsNestedError\")\n\t\t}\n\t}()\n\tb.CreateByteString([]byte(\"foo\"))\n}\n\n// CheckStructIsNotInlineError verifies that writing a struct in a location\n// away from where it is used will cause a panic.\nfunc CheckStructIsNotInlineError(fail func(string, ...interface{})) {\n\tb := flatbuffers.NewBuilder(0)\n\tb.StartObject(0)\n\tdefer func() {\n\t\tr := recover()\n\t\tif r == nil {\n\t\t\tfail(\"expected panic in CheckStructIsNotInlineError\")\n\t\t}\n\t}()\n\tb.PrependStructSlot(0, 1, 0)\n}\n\n// CheckFinishedBytesError verifies that `FinishedBytes` panics if the table\n// is not finished.\nfunc CheckFinishedBytesError(fail func(string, ...interface{})) {\n\tb := flatbuffers.NewBuilder(0)\n\n\tdefer func() {\n\t\tr := recover()\n\t\tif r == nil {\n\t\t\tfail(\"expected panic in CheckFinishedBytesError\")\n\t\t}\n\t}()\n\tb.FinishedBytes()\n}\n\n// CheckEnumNames checks that the generated enum names are correct.\nfunc CheckEnumNames(fail func(string, ...interface{})) {\n\t{\n\t\twant := map[example.Any]string{\n\t\t\texample.AnyNONE:                    \"NONE\",\n\t\t\texample.AnyMonster:                 \"Monster\",\n\t\t\texample.AnyTestSimpleTableWithEnum: \"TestSimpleTableWithEnum\",\n\t\t\texample.AnyMyGame_Example2_Monster: \"MyGame_Example2_Monster\",\n\t\t}\n\t\tgot := example.EnumNamesAny\n\t\tif !reflect.DeepEqual(got, want) {\n\t\t\tfail(\"enum name is not equal\")\n\t\t}\n\t}\n\t{\n\t\twant := map[example.Color]string{\n\t\t\texample.ColorRed:   \"Red\",\n\t\t\texample.ColorGreen: \"Green\",\n\t\t\texample.ColorBlue:  \"Blue\",\n\t\t}\n\t\tgot := example.EnumNamesColor\n\t\tif !reflect.DeepEqual(got, want) {\n\t\t\tfail(\"enum name is not equal\")\n\t\t}\n\t}\n}\n\n// CheckEnumString checks the String method on generated enum types.\nfunc CheckEnumString(fail func(string, ...interface{})) {\n\tif got := example.AnyMonster.String(); got != \"Monster\" {\n\t\tfail(\"Monster.String: %q != %q\", got, \"Monster\")\n\t}\n\tif got := fmt.Sprintf(\"color: %s\", example.ColorGreen); got != \"color: Green\" {\n\t\tfail(\"color.String: %q != %q\", got, \"color: Green\")\n\t}\n}\n\n// CheckEnumValues checks that the generated enum values maps are correct.\nfunc CheckEnumValues(fail func(string, ...interface{})) {\n\t{\n\t\twant := map[string]example.Any{\n\t\t\t\"NONE\":                    example.AnyNONE,\n\t\t\t\"Monster\":                 example.AnyMonster,\n\t\t\t\"TestSimpleTableWithEnum\": example.AnyTestSimpleTableWithEnum,\n\t\t\t\"MyGame_Example2_Monster\": example.AnyMyGame_Example2_Monster,\n\t\t}\n\t\tgot := example.EnumValuesAny\n\t\tif !reflect.DeepEqual(got, want) {\n\t\t\tfail(\"enum name is not equal\")\n\t\t}\n\t}\n\t{\n\t\twant := map[string]example.Color{\n\t\t\t\"Red\":   example.ColorRed,\n\t\t\t\"Green\": example.ColorGreen,\n\t\t\t\"Blue\":  example.ColorBlue,\n\t\t}\n\t\tgot := example.EnumValuesColor\n\t\tif !reflect.DeepEqual(got, want) {\n\t\t\tfail(\"enum name is not equal\")\n\t\t}\n\t}\n}\n\n// CheckDocExample checks that the code given in FlatBuffers documentation\n// is syntactically correct.\nfunc CheckDocExample(buf []byte, off flatbuffers.UOffsetT, fail func(string, ...interface{})) {\n\tmonster := example.GetRootAsMonster(buf, off)\n\t_ = monster.Hp()\n\t_ = monster.Pos(nil)\n\tfor i := 0; i < monster.InventoryLength(); i++ {\n\t\t_ = monster.Inventory(i) // do something here\n\t}\n\n\tbuilder := flatbuffers.NewBuilder(0)\n\n\texample.MonsterStartInventoryVector(builder, 5)\n\tfor i := 4; i >= 0; i-- {\n\t\tbuilder.PrependByte(byte(i))\n\t}\n\tinv := builder.EndVector(5)\n\n\tstr := builder.CreateString(\"MyMonster\")\n\texample.MonsterStart(builder)\n\texample.MonsterAddPos(builder, example.CreateVec3(builder, 1.0, 2.0, 3.0, 3.0, example.Color(4), 5, 6))\n\texample.MonsterAddHp(builder, 80)\n\texample.MonsterAddName(builder, str)\n\texample.MonsterAddInventory(builder, inv)\n\texample.MonsterAddTestType(builder, 1)\n\texample.MonsterAddColor(builder, example.ColorRed)\n\t// example.MonsterAddTest(builder, mon2)\n\t// example.MonsterAddTest4(builder, test4s)\n\t_ = example.MonsterEnd(builder)\n}\n\nfunc CheckCreateByteVector(fail func(string, ...interface{})) {\n\traw := [30]byte{}\n\tfor i := 0; i < len(raw); i++ {\n\t\traw[i] = byte(i)\n\t}\n\n\tfor size := 0; size < len(raw); size++ {\n\t\tb1 := flatbuffers.NewBuilder(0)\n\t\tb2 := flatbuffers.NewBuilder(0)\n\t\tb1.StartVector(1, size, 1)\n\t\tfor i := size - 1; i >= 0; i-- {\n\t\t\tb1.PrependByte(raw[i])\n\t\t}\n\t\tb1.EndVector(size)\n\t\tb2.CreateByteVector(raw[:size])\n\t\tCheckByteEquality(b1.Bytes, b2.Bytes, fail)\n\t}\n}\n\nfunc CheckParentNamespace(fail func(string, ...interface{})) {\n\tvar empty, nonempty []byte\n\n\t// create monster with an empty parent namespace field\n\t{\n\t\tbuilder := flatbuffers.NewBuilder(0)\n\n\t\texample.MonsterStart(builder)\n\t\tm := example.MonsterEnd(builder)\n\t\tbuilder.Finish(m)\n\n\t\tempty = make([]byte, len(builder.FinishedBytes()))\n\t\tcopy(empty, builder.FinishedBytes())\n\t}\n\n\t// create monster with a non-empty parent namespace field\n\t{\n\t\tbuilder := flatbuffers.NewBuilder(0)\n\t\tmygame.InParentNamespaceStart(builder)\n\t\tpn := mygame.InParentNamespaceEnd(builder)\n\n\t\texample.MonsterStart(builder)\n\t\texample.MonsterAddParentNamespaceTest(builder, pn)\n\t\tm := example.MonsterEnd(builder)\n\n\t\tbuilder.Finish(m)\n\n\t\tnonempty = make([]byte, len(builder.FinishedBytes()))\n\t\tcopy(nonempty, builder.FinishedBytes())\n\t}\n\n\t// read monster with empty parent namespace field\n\t{\n\t\tm := example.GetRootAsMonster(empty, 0)\n\t\tif m.ParentNamespaceTest(nil) != nil {\n\t\t\tfail(\"expected nil ParentNamespaceTest for empty field\")\n\t\t}\n\t}\n\n\t// read monster with non-empty parent namespace field\n\t{\n\t\tm := example.GetRootAsMonster(nonempty, 0)\n\t\tif m.ParentNamespaceTest(nil) == nil {\n\t\t\tfail(\"expected non-nil ParentNamespaceTest for non-empty field\")\n\t\t}\n\t}\n}\n\nfunc CheckSizePrefixedBuffer(fail func(string, ...interface{})) {\n\t// Generate a size-prefixed flatbuffer, first without file identifier\n\tgenerated, off := CheckGeneratedBuild(true, false, fail)\n\n\t// Check that the buffer can be used as expected\n\tCheckReadBuffer(generated, off, true, fail)\n\tCheckMutateBuffer(generated, off, true, fail)\n\tCheckObjectAPI(generated, off, true, fail)\n\n\t// Now generate a size-prefixed flatbuffer with file identifier\n\tgenerated, off = CheckGeneratedBuild(true, true, fail)\n\n\t// Check that the size prefix is the size of monsterdata_go_wire.mon,\n\t// plus 4 bytes for padding\n\tsize := flatbuffers.GetSizePrefix(generated, off)\n\texpectedSize := uint32(228)\n\tif size != expectedSize {\n\t\tfail(\"mismatch between size prefix (%d) and expected size (%d)\", size, expectedSize)\n\t}\n\n\t// Check that the buffer can be used as expected\n\tCheckReadBuffer(generated, off, true, fail)\n\tCheckMutateBuffer(generated, off, true, fail)\n\tCheckObjectAPI(generated, off, true, fail)\n\tCheckFileIdentifier(generated, off, true, fail)\n\n\t// Write generated buffer out to a file\n\tif err := os.WriteFile(outData+\".sp\", generated[off:], os.FileMode(0644)); err != nil {\n\t\tfail(\"failed to write file: %s\", err)\n\t}\n}\n\n// Include simple random number generator to ensure results will be the\n// same cross platform.\n// http://en.wikipedia.org/wiki/Park%E2%80%93Miller_random_number_generator\ntype LCG uint32\n\nconst InitialLCGSeed = 48271\n\nfunc NewLCG() *LCG {\n\tn := uint32(InitialLCGSeed)\n\tl := LCG(n)\n\treturn &l\n}\n\nfunc (lcg *LCG) Reset() {\n\t*lcg = InitialLCGSeed\n}\n\nfunc (lcg *LCG) Next() uint32 {\n\tn := uint32((uint64(*lcg) * uint64(279470273)) % uint64(4294967291))\n\t*lcg = LCG(n)\n\treturn n\n}\n\n// CheckByteEquality verifies that two byte buffers are the same.\nfunc CheckByteEquality(a, b []byte, fail func(string, ...interface{})) {\n\tif !bytes.Equal(a, b) {\n\t\tfail(\"objects are not byte-wise equal\")\n\t}\n}\n\n// CheckMutateMethods checks all mutate methods one by one\nfunc CheckMutateMethods(fail func(string, ...interface{})) {\n\tb := flatbuffers.NewBuilder(0)\n\tb.StartObject(15)\n\tb.PrependBoolSlot(0, true, false)\n\tb.PrependByteSlot(1, 1, 0)\n\tb.PrependUint8Slot(2, 2, 0)\n\tb.PrependUint16Slot(3, 3, 0)\n\tb.PrependUint32Slot(4, 4, 0)\n\tb.PrependUint64Slot(5, 5, 0)\n\tb.PrependInt8Slot(6, 6, 0)\n\tb.PrependInt16Slot(7, 7, 0)\n\tb.PrependInt32Slot(8, 8, 0)\n\tb.PrependInt64Slot(9, 9, 0)\n\tb.PrependFloat32Slot(10, 10, 0)\n\tb.PrependFloat64Slot(11, 11, 0)\n\n\tb.PrependUOffsetTSlot(12, 12, 0)\n\tuoVal := b.Offset() - 12\n\n\tb.PrependVOffsetT(13)\n\tb.Slot(13)\n\n\tb.PrependSOffsetT(14)\n\tb.Slot(14)\n\tsoVal := flatbuffers.SOffsetT(b.Offset() - 14)\n\n\toffset := b.EndObject()\n\n\tt := &flatbuffers.Table{\n\t\tBytes: b.Bytes,\n\t\tPos:   flatbuffers.UOffsetT(len(b.Bytes)) - offset,\n\t}\n\n\tcalcVOffsetT := func(slot int) (vtableOffset flatbuffers.VOffsetT) {\n\t\treturn flatbuffers.VOffsetT((flatbuffers.VtableMetadataFields + slot) * flatbuffers.SizeVOffsetT)\n\t}\n\tcalcUOffsetT := func(vtableOffset flatbuffers.VOffsetT) (valueOffset flatbuffers.UOffsetT) {\n\t\treturn t.Pos + flatbuffers.UOffsetT(t.Offset(vtableOffset))\n\t}\n\n\ttype testcase struct {\n\t\tfield  string\n\t\ttestfn func() bool\n\t}\n\n\ttestForOriginalValues := []testcase{\n\t\ttestcase{\"BoolSlot\", func() bool { return t.GetBoolSlot(calcVOffsetT(0), true) == true }},\n\t\ttestcase{\"ByteSlot\", func() bool { return t.GetByteSlot(calcVOffsetT(1), 1) == 1 }},\n\t\ttestcase{\"Uint8Slot\", func() bool { return t.GetUint8Slot(calcVOffsetT(2), 2) == 2 }},\n\t\ttestcase{\"Uint16Slot\", func() bool { return t.GetUint16Slot(calcVOffsetT(3), 3) == 3 }},\n\t\ttestcase{\"Uint32Slot\", func() bool { return t.GetUint32Slot(calcVOffsetT(4), 4) == 4 }},\n\t\ttestcase{\"Uint64Slot\", func() bool { return t.GetUint64Slot(calcVOffsetT(5), 5) == 5 }},\n\t\ttestcase{\"Int8Slot\", func() bool { return t.GetInt8Slot(calcVOffsetT(6), 6) == 6 }},\n\t\ttestcase{\"Int16Slot\", func() bool { return t.GetInt16Slot(calcVOffsetT(7), 7) == 7 }},\n\t\ttestcase{\"Int32Slot\", func() bool { return t.GetInt32Slot(calcVOffsetT(8), 8) == 8 }},\n\t\ttestcase{\"Int64Slot\", func() bool { return t.GetInt64Slot(calcVOffsetT(9), 9) == 9 }},\n\t\ttestcase{\"Float32Slot\", func() bool { return t.GetFloat32Slot(calcVOffsetT(10), 10) == 10 }},\n\t\ttestcase{\"Float64Slot\", func() bool { return t.GetFloat64Slot(calcVOffsetT(11), 11) == 11 }},\n\t\ttestcase{\"UOffsetTSlot\", func() bool { return t.GetUOffsetT(calcUOffsetT(calcVOffsetT(12))) == uoVal }},\n\t\ttestcase{\"VOffsetTSlot\", func() bool { return t.GetVOffsetT(calcUOffsetT(calcVOffsetT(13))) == 13 }},\n\t\ttestcase{\"SOffsetTSlot\", func() bool { return t.GetSOffsetT(calcUOffsetT(calcVOffsetT(14))) == soVal }},\n\t}\n\n\ttestMutability := []testcase{\n\t\ttestcase{\"BoolSlot\", func() bool { return t.MutateBoolSlot(calcVOffsetT(0), false) }},\n\t\ttestcase{\"ByteSlot\", func() bool { return t.MutateByteSlot(calcVOffsetT(1), 2) }},\n\t\ttestcase{\"Uint8Slot\", func() bool { return t.MutateUint8Slot(calcVOffsetT(2), 4) }},\n\t\ttestcase{\"Uint16Slot\", func() bool { return t.MutateUint16Slot(calcVOffsetT(3), 6) }},\n\t\ttestcase{\"Uint32Slot\", func() bool { return t.MutateUint32Slot(calcVOffsetT(4), 8) }},\n\t\ttestcase{\"Uint64Slot\", func() bool { return t.MutateUint64Slot(calcVOffsetT(5), 10) }},\n\t\ttestcase{\"Int8Slot\", func() bool { return t.MutateInt8Slot(calcVOffsetT(6), 12) }},\n\t\ttestcase{\"Int16Slot\", func() bool { return t.MutateInt16Slot(calcVOffsetT(7), 14) }},\n\t\ttestcase{\"Int32Slot\", func() bool { return t.MutateInt32Slot(calcVOffsetT(8), 16) }},\n\t\ttestcase{\"Int64Slot\", func() bool { return t.MutateInt64Slot(calcVOffsetT(9), 18) }},\n\t\ttestcase{\"Float32Slot\", func() bool { return t.MutateFloat32Slot(calcVOffsetT(10), 20) }},\n\t\ttestcase{\"Float64Slot\", func() bool { return t.MutateFloat64Slot(calcVOffsetT(11), 22) }},\n\t\ttestcase{\"UOffsetTSlot\", func() bool { return t.MutateUOffsetT(calcUOffsetT(calcVOffsetT(12)), 24) }},\n\t\ttestcase{\"VOffsetTSlot\", func() bool { return t.MutateVOffsetT(calcUOffsetT(calcVOffsetT(13)), 26) }},\n\t\ttestcase{\"SOffsetTSlot\", func() bool { return t.MutateSOffsetT(calcUOffsetT(calcVOffsetT(14)), 28) }},\n\t}\n\n\ttestMutabilityWithoutSlot := []testcase{\n\t\ttestcase{\"BoolSlot\", func() bool { return t.MutateBoolSlot(calcVOffsetT(16), false) }},\n\t\ttestcase{\"ByteSlot\", func() bool { return t.MutateByteSlot(calcVOffsetT(16), 2) }},\n\t\ttestcase{\"Uint8Slot\", func() bool { return t.MutateUint8Slot(calcVOffsetT(16), 2) }},\n\t\ttestcase{\"Uint16Slot\", func() bool { return t.MutateUint16Slot(calcVOffsetT(16), 2) }},\n\t\ttestcase{\"Uint32Slot\", func() bool { return t.MutateUint32Slot(calcVOffsetT(16), 2) }},\n\t\ttestcase{\"Uint64Slot\", func() bool { return t.MutateUint64Slot(calcVOffsetT(16), 2) }},\n\t\ttestcase{\"Int8Slot\", func() bool { return t.MutateInt8Slot(calcVOffsetT(16), 2) }},\n\t\ttestcase{\"Int16Slot\", func() bool { return t.MutateInt16Slot(calcVOffsetT(16), 2) }},\n\t\ttestcase{\"Int32Slot\", func() bool { return t.MutateInt32Slot(calcVOffsetT(16), 2) }},\n\t\ttestcase{\"Int64Slot\", func() bool { return t.MutateInt64Slot(calcVOffsetT(16), 2) }},\n\t\ttestcase{\"Float32Slot\", func() bool { return t.MutateFloat32Slot(calcVOffsetT(16), 2) }},\n\t\ttestcase{\"Float64Slot\", func() bool { return t.MutateFloat64Slot(calcVOffsetT(16), 2) }},\n\t}\n\n\ttestForMutatedValues := []testcase{\n\t\ttestcase{\"BoolSlot\", func() bool { return t.GetBoolSlot(calcVOffsetT(0), true) == false }},\n\t\ttestcase{\"ByteSlot\", func() bool { return t.GetByteSlot(calcVOffsetT(1), 1) == 2 }},\n\t\ttestcase{\"Uint8Slot\", func() bool { return t.GetUint8Slot(calcVOffsetT(2), 1) == 4 }},\n\t\ttestcase{\"Uint16Slot\", func() bool { return t.GetUint16Slot(calcVOffsetT(3), 1) == 6 }},\n\t\ttestcase{\"Uint32Slot\", func() bool { return t.GetUint32Slot(calcVOffsetT(4), 1) == 8 }},\n\t\ttestcase{\"Uint64Slot\", func() bool { return t.GetUint64Slot(calcVOffsetT(5), 1) == 10 }},\n\t\ttestcase{\"Int8Slot\", func() bool { return t.GetInt8Slot(calcVOffsetT(6), 1) == 12 }},\n\t\ttestcase{\"Int16Slot\", func() bool { return t.GetInt16Slot(calcVOffsetT(7), 1) == 14 }},\n\t\ttestcase{\"Int32Slot\", func() bool { return t.GetInt32Slot(calcVOffsetT(8), 1) == 16 }},\n\t\ttestcase{\"Int64Slot\", func() bool { return t.GetInt64Slot(calcVOffsetT(9), 1) == 18 }},\n\t\ttestcase{\"Float32Slot\", func() bool { return t.GetFloat32Slot(calcVOffsetT(10), 1) == 20 }},\n\t\ttestcase{\"Float64Slot\", func() bool { return t.GetFloat64Slot(calcVOffsetT(11), 1) == 22 }},\n\t\ttestcase{\"UOffsetTSlot\", func() bool { return t.GetUOffsetT(calcUOffsetT(calcVOffsetT(12))) == 24 }},\n\t\ttestcase{\"VOffsetTSlot\", func() bool { return t.GetVOffsetT(calcUOffsetT(calcVOffsetT(13))) == 26 }},\n\t\ttestcase{\"SOffsetTSlot\", func() bool { return t.GetSOffsetT(calcUOffsetT(calcVOffsetT(14))) == 28 }},\n\t}\n\n\t// make sure original values are okay\n\tfor _, t := range testForOriginalValues {\n\t\tif !t.testfn() {\n\t\t\tfail(t.field + \"' field doesn't have the expected original value\")\n\t\t}\n\t}\n\n\t// try to mutate fields and check mutability\n\tfor _, t := range testMutability {\n\t\tif !t.testfn() {\n\t\t\tfail(FailString(t.field+\"' field failed mutability test\", \"passed\", \"failed\"))\n\t\t}\n\t}\n\n\t// try to mutate fields and check mutability\n\t// these have wrong slots so should fail\n\tfor _, t := range testMutabilityWithoutSlot {\n\t\tif t.testfn() {\n\t\t\tfail(FailString(t.field+\"' field failed no slot mutability test\", \"failed\", \"passed\"))\n\t\t}\n\t}\n\n\t// test whether values have changed\n\tfor _, t := range testForMutatedValues {\n\t\tif !t.testfn() {\n\t\t\tfail(t.field + \"' field doesn't have the expected mutated value\")\n\t\t}\n\t}\n}\n\n// CheckOptionalScalars verifies against the ScalarStuff schema.\nfunc CheckOptionalScalars(fail func(string, ...interface{})) {\n\ttype testCase struct {\n\t\twhat           string\n\t\tresult, expect interface{}\n\t}\n\n\tmakeDefaultTestCases := func(s *optional_scalars.ScalarStuff) []testCase {\n\t\treturn []testCase{\n\t\t\t{\"justI8\", s.JustI8(), int8(0)},\n\t\t\t{\"maybeI8\", s.MaybeI8(), (*int8)(nil)},\n\t\t\t{\"defaultI8\", s.DefaultI8(), int8(42)},\n\t\t\t{\"justU8\", s.JustU8(), byte(0)},\n\t\t\t{\"maybeU8\", s.MaybeU8(), (*byte)(nil)},\n\t\t\t{\"defaultU8\", s.DefaultU8(), byte(42)},\n\t\t\t{\"justI16\", s.JustI16(), int16(0)},\n\t\t\t{\"maybeI16\", s.MaybeI16(), (*int16)(nil)},\n\t\t\t{\"defaultI16\", s.DefaultI16(), int16(42)},\n\t\t\t{\"justU16\", s.JustU16(), uint16(0)},\n\t\t\t{\"maybeU16\", s.MaybeU16(), (*uint16)(nil)},\n\t\t\t{\"defaultU16\", s.DefaultU16(), uint16(42)},\n\t\t\t{\"justI32\", s.JustI32(), int32(0)},\n\t\t\t{\"maybeI32\", s.MaybeI32(), (*int32)(nil)},\n\t\t\t{\"defaultI32\", s.DefaultI32(), int32(42)},\n\t\t\t{\"justU32\", s.JustU32(), uint32(0)},\n\t\t\t{\"maybeU32\", s.MaybeU32(), (*uint32)(nil)},\n\t\t\t{\"defaultU32\", s.DefaultU32(), uint32(42)},\n\t\t\t{\"justI64\", s.JustI64(), int64(0)},\n\t\t\t{\"maybeI64\", s.MaybeI64(), (*int64)(nil)},\n\t\t\t{\"defaultI64\", s.DefaultI64(), int64(42)},\n\t\t\t{\"justU64\", s.JustU64(), uint64(0)},\n\t\t\t{\"maybeU64\", s.MaybeU64(), (*uint64)(nil)},\n\t\t\t{\"defaultU64\", s.DefaultU64(), uint64(42)},\n\t\t\t{\"justF32\", s.JustF32(), float32(0)},\n\t\t\t{\"maybeF32\", s.MaybeF32(), (*float32)(nil)},\n\t\t\t{\"defaultF32\", s.DefaultF32(), float32(42)},\n\t\t\t{\"justF64\", s.JustF64(), float64(0)},\n\t\t\t{\"maybeF64\", s.MaybeF64(), (*float64)(nil)},\n\t\t\t{\"defaultF64\", s.DefaultF64(), float64(42)},\n\t\t\t{\"justBool\", s.JustBool(), false},\n\t\t\t{\"maybeBool\", s.MaybeBool(), (*bool)(nil)},\n\t\t\t{\"defaultBool\", s.DefaultBool(), true},\n\t\t\t{\"justEnum\", s.JustEnum(), optional_scalars.OptionalByte(0)},\n\t\t\t{\"maybeEnum\", s.MaybeEnum(), (*optional_scalars.OptionalByte)(nil)},\n\t\t\t{\"defaultEnum\", s.DefaultEnum(), optional_scalars.OptionalByteOne},\n\t\t}\n\t}\n\n\tmakeAssignedTestCases := func(s *optional_scalars.ScalarStuff) []testCase {\n\t\treturn []testCase{\n\t\t\t{\"justI8\", s.JustI8(), int8(5)},\n\t\t\t{\"maybeI8\", s.MaybeI8(), int8(5)},\n\t\t\t{\"defaultI8\", s.DefaultI8(), int8(5)},\n\t\t\t{\"justU8\", s.JustU8(), byte(6)},\n\t\t\t{\"maybeU8\", s.MaybeU8(), byte(6)},\n\t\t\t{\"defaultU8\", s.DefaultU8(), byte(6)},\n\t\t\t{\"justI16\", s.JustI16(), int16(7)},\n\t\t\t{\"maybeI16\", s.MaybeI16(), int16(7)},\n\t\t\t{\"defaultI16\", s.DefaultI16(), int16(7)},\n\t\t\t{\"justU16\", s.JustU16(), uint16(8)},\n\t\t\t{\"maybeU16\", s.MaybeU16(), uint16(8)},\n\t\t\t{\"defaultU16\", s.DefaultU16(), uint16(8)},\n\t\t\t{\"justI32\", s.JustI32(), int32(9)},\n\t\t\t{\"maybeI32\", s.MaybeI32(), int32(9)},\n\t\t\t{\"defaultI32\", s.DefaultI32(), int32(9)},\n\t\t\t{\"justU32\", s.JustU32(), uint32(10)},\n\t\t\t{\"maybeU32\", s.MaybeU32(), uint32(10)},\n\t\t\t{\"defaultU32\", s.DefaultU32(), uint32(10)},\n\t\t\t{\"justI64\", s.JustI64(), int64(11)},\n\t\t\t{\"maybeI64\", s.MaybeI64(), int64(11)},\n\t\t\t{\"defaultI64\", s.DefaultI64(), int64(11)},\n\t\t\t{\"justU64\", s.JustU64(), uint64(12)},\n\t\t\t{\"maybeU64\", s.MaybeU64(), uint64(12)},\n\t\t\t{\"defaultU64\", s.DefaultU64(), uint64(12)},\n\t\t\t{\"justF32\", s.JustF32(), float32(13)},\n\t\t\t{\"maybeF32\", s.MaybeF32(), float32(13)},\n\t\t\t{\"defaultF32\", s.DefaultF32(), float32(13)},\n\t\t\t{\"justF64\", s.JustF64(), float64(14)},\n\t\t\t{\"maybeF64\", s.MaybeF64(), float64(14)},\n\t\t\t{\"defaultF64\", s.DefaultF64(), float64(14)},\n\t\t\t{\"justBool\", s.JustBool(), true},\n\t\t\t{\"maybeBool\", s.MaybeBool(), true},\n\t\t\t{\"defaultBool\", s.DefaultBool(), false},\n\t\t\t{\"justEnum\", s.JustEnum(), optional_scalars.OptionalByteTwo},\n\t\t\t{\"maybeEnum\", s.MaybeEnum(), optional_scalars.OptionalByteTwo},\n\t\t\t{\"defaultEnum\", s.DefaultEnum(), optional_scalars.OptionalByteTwo},\n\t\t}\n\t}\n\n\tresolvePointer := func(v interface{}) interface{} {\n\t\tswitch v := v.(type) {\n\t\tcase *int8:\n\t\t\treturn *v\n\t\tcase *byte:\n\t\t\treturn *v\n\t\tcase *int16:\n\t\t\treturn *v\n\t\tcase *uint16:\n\t\t\treturn *v\n\t\tcase *int32:\n\t\t\treturn *v\n\t\tcase *uint32:\n\t\t\treturn *v\n\t\tcase *int64:\n\t\t\treturn *v\n\t\tcase *uint64:\n\t\t\treturn *v\n\t\tcase *float32:\n\t\t\treturn *v\n\t\tcase *float64:\n\t\t\treturn *v\n\t\tcase *bool:\n\t\t\treturn *v\n\t\tcase *optional_scalars.OptionalByte:\n\t\t\treturn *v\n\t\tdefault:\n\t\t\treturn v\n\t\t}\n\t}\n\n\tbuildAssignedTable := func(b *flatbuffers.Builder) *optional_scalars.ScalarStuff {\n\t\toptional_scalars.ScalarStuffStart(b)\n\t\toptional_scalars.ScalarStuffAddJustI8(b, int8(5))\n\t\toptional_scalars.ScalarStuffAddMaybeI8(b, int8(5))\n\t\toptional_scalars.ScalarStuffAddDefaultI8(b, int8(5))\n\t\toptional_scalars.ScalarStuffAddJustU8(b, byte(6))\n\t\toptional_scalars.ScalarStuffAddMaybeU8(b, byte(6))\n\t\toptional_scalars.ScalarStuffAddDefaultU8(b, byte(6))\n\t\toptional_scalars.ScalarStuffAddJustI16(b, int16(7))\n\t\toptional_scalars.ScalarStuffAddMaybeI16(b, int16(7))\n\t\toptional_scalars.ScalarStuffAddDefaultI16(b, int16(7))\n\t\toptional_scalars.ScalarStuffAddJustU16(b, uint16(8))\n\t\toptional_scalars.ScalarStuffAddMaybeU16(b, uint16(8))\n\t\toptional_scalars.ScalarStuffAddDefaultU16(b, uint16(8))\n\t\toptional_scalars.ScalarStuffAddJustI32(b, int32(9))\n\t\toptional_scalars.ScalarStuffAddMaybeI32(b, int32(9))\n\t\toptional_scalars.ScalarStuffAddDefaultI32(b, int32(9))\n\t\toptional_scalars.ScalarStuffAddJustU32(b, uint32(10))\n\t\toptional_scalars.ScalarStuffAddMaybeU32(b, uint32(10))\n\t\toptional_scalars.ScalarStuffAddDefaultU32(b, uint32(10))\n\t\toptional_scalars.ScalarStuffAddJustI64(b, int64(11))\n\t\toptional_scalars.ScalarStuffAddMaybeI64(b, int64(11))\n\t\toptional_scalars.ScalarStuffAddDefaultI64(b, int64(11))\n\t\toptional_scalars.ScalarStuffAddJustU64(b, uint64(12))\n\t\toptional_scalars.ScalarStuffAddMaybeU64(b, uint64(12))\n\t\toptional_scalars.ScalarStuffAddDefaultU64(b, uint64(12))\n\t\toptional_scalars.ScalarStuffAddJustF32(b, float32(13))\n\t\toptional_scalars.ScalarStuffAddMaybeF32(b, float32(13))\n\t\toptional_scalars.ScalarStuffAddDefaultF32(b, float32(13))\n\t\toptional_scalars.ScalarStuffAddJustF64(b, float64(14))\n\t\toptional_scalars.ScalarStuffAddMaybeF64(b, float64(14))\n\t\toptional_scalars.ScalarStuffAddDefaultF64(b, float64(14))\n\t\toptional_scalars.ScalarStuffAddJustBool(b, true)\n\t\toptional_scalars.ScalarStuffAddMaybeBool(b, true)\n\t\toptional_scalars.ScalarStuffAddDefaultBool(b, false)\n\t\toptional_scalars.ScalarStuffAddJustEnum(b, optional_scalars.OptionalByteTwo)\n\t\toptional_scalars.ScalarStuffAddMaybeEnum(b, optional_scalars.OptionalByteTwo)\n\t\toptional_scalars.ScalarStuffAddDefaultEnum(b, optional_scalars.OptionalByteTwo)\n\t\tb.Finish(optional_scalars.ScalarStuffEnd(b))\n\t\treturn optional_scalars.GetRootAsScalarStuff(b.FinishedBytes(), 0)\n\t}\n\n\t// test default values\n\n\tfbb := flatbuffers.NewBuilder(1)\n\toptional_scalars.ScalarStuffStart(fbb)\n\tfbb.Finish(optional_scalars.ScalarStuffEnd(fbb))\n\tss := optional_scalars.GetRootAsScalarStuff(fbb.FinishedBytes(), 0)\n\tfor _, tc := range makeDefaultTestCases(ss) {\n\t\tif tc.result != tc.expect {\n\t\t\tfail(FailString(\"Default ScalarStuff: \"+tc.what, tc.expect, tc.result))\n\t\t}\n\t}\n\n\t// test assigned values\n\tfbb.Reset()\n\tss = buildAssignedTable(fbb)\n\tfor _, tc := range makeAssignedTestCases(ss) {\n\t\tif resolvePointer(tc.result) != tc.expect {\n\t\t\tfail(FailString(\"Assigned ScalarStuff: \"+tc.what, tc.expect, tc.result))\n\t\t}\n\t}\n\n\t// test native object pack\n\tfbb.Reset()\n\ti8 := int8(5)\n\tu8 := byte(6)\n\ti16 := int16(7)\n\tu16 := uint16(8)\n\ti32 := int32(9)\n\tu32 := uint32(10)\n\ti64 := int64(11)\n\tu64 := uint64(12)\n\tf32 := float32(13)\n\tf64 := float64(14)\n\tb := true\n\tenum := optional_scalars.OptionalByteTwo\n\tobj := optional_scalars.ScalarStuffT{\n\t\tJustI8:      5,\n\t\tMaybeI8:     &i8,\n\t\tDefaultI8:   5,\n\t\tJustU8:      6,\n\t\tMaybeU8:     &u8,\n\t\tDefaultU8:   6,\n\t\tJustI16:     7,\n\t\tMaybeI16:    &i16,\n\t\tDefaultI16:  7,\n\t\tJustU16:     8,\n\t\tMaybeU16:    &u16,\n\t\tDefaultU16:  8,\n\t\tJustI32:     9,\n\t\tMaybeI32:    &i32,\n\t\tDefaultI32:  9,\n\t\tJustU32:     10,\n\t\tMaybeU32:    &u32,\n\t\tDefaultU32:  10,\n\t\tJustI64:     11,\n\t\tMaybeI64:    &i64,\n\t\tDefaultI64:  11,\n\t\tJustU64:     12,\n\t\tMaybeU64:    &u64,\n\t\tDefaultU64:  12,\n\t\tJustF32:     13,\n\t\tMaybeF32:    &f32,\n\t\tDefaultF32:  13,\n\t\tJustF64:     14,\n\t\tMaybeF64:    &f64,\n\t\tDefaultF64:  14,\n\t\tJustBool:    true,\n\t\tMaybeBool:   &b,\n\t\tDefaultBool: false,\n\t\tJustEnum:    optional_scalars.OptionalByteTwo,\n\t\tMaybeEnum:   &enum,\n\t\tDefaultEnum: optional_scalars.OptionalByteTwo,\n\t}\n\tfbb.Finish(obj.Pack(fbb))\n\tss = optional_scalars.GetRootAsScalarStuff(fbb.FinishedBytes(), 0)\n\tfor _, tc := range makeAssignedTestCases(ss) {\n\t\tif resolvePointer(tc.result) != tc.expect {\n\t\t\tfail(FailString(\"Native Object ScalarStuff: \"+tc.what, tc.expect, tc.result))\n\t\t}\n\t}\n\n\t// test native object unpack\n\tfbb.Reset()\n\tss = buildAssignedTable(fbb)\n\tss.UnPackTo(&obj)\n\texpectEq := func(what string, a, b interface{}) {\n\t\tif resolvePointer(a) != b {\n\t\t\tfail(FailString(\"Native Object Unpack ScalarStuff: \"+what, b, a))\n\t\t}\n\t}\n\texpectEq(\"justI8\", obj.JustI8, int8(5))\n\texpectEq(\"maybeI8\", obj.MaybeI8, int8(5))\n\texpectEq(\"defaultI8\", obj.DefaultI8, int8(5))\n\texpectEq(\"justU8\", obj.JustU8, byte(6))\n\texpectEq(\"maybeU8\", obj.MaybeU8, byte(6))\n\texpectEq(\"defaultU8\", obj.DefaultU8, byte(6))\n\texpectEq(\"justI16\", obj.JustI16, int16(7))\n\texpectEq(\"maybeI16\", obj.MaybeI16, int16(7))\n\texpectEq(\"defaultI16\", obj.DefaultI16, int16(7))\n\texpectEq(\"justU16\", obj.JustU16, uint16(8))\n\texpectEq(\"maybeU16\", obj.MaybeU16, uint16(8))\n\texpectEq(\"defaultU16\", obj.DefaultU16, uint16(8))\n\texpectEq(\"justI32\", obj.JustI32, int32(9))\n\texpectEq(\"maybeI32\", obj.MaybeI32, int32(9))\n\texpectEq(\"defaultI32\", obj.DefaultI32, int32(9))\n\texpectEq(\"justU32\", obj.JustU32, uint32(10))\n\texpectEq(\"maybeU32\", obj.MaybeU32, uint32(10))\n\texpectEq(\"defaultU32\", obj.DefaultU32, uint32(10))\n\texpectEq(\"justI64\", obj.JustI64, int64(11))\n\texpectEq(\"maybeI64\", obj.MaybeI64, int64(11))\n\texpectEq(\"defaultI64\", obj.DefaultI64, int64(11))\n\texpectEq(\"justU64\", obj.JustU64, uint64(12))\n\texpectEq(\"maybeU64\", obj.MaybeU64, uint64(12))\n\texpectEq(\"defaultU64\", obj.DefaultU64, uint64(12))\n\texpectEq(\"justF32\", obj.JustF32, float32(13))\n\texpectEq(\"maybeF32\", obj.MaybeF32, float32(13))\n\texpectEq(\"defaultF32\", obj.DefaultF32, float32(13))\n\texpectEq(\"justF64\", obj.JustF64, float64(14))\n\texpectEq(\"maybeF64\", obj.MaybeF64, float64(14))\n\texpectEq(\"defaultF64\", obj.DefaultF64, float64(14))\n\texpectEq(\"justBool\", obj.JustBool, true)\n\texpectEq(\"maybeBool\", obj.MaybeBool, true)\n\texpectEq(\"defaultBool\", obj.DefaultBool, false)\n\texpectEq(\"justEnum\", obj.JustEnum, optional_scalars.OptionalByteTwo)\n\texpectEq(\"maybeEnum\", obj.MaybeEnum, optional_scalars.OptionalByteTwo)\n\texpectEq(\"defaultEnum\", obj.DefaultEnum, optional_scalars.OptionalByteTwo)\n}\n\nfunc CheckRequiredStrings(fail func(string, ...interface{})) {\n\tequalContent := func(strValue *string, bytesValue []byte) bool {\n\t\treturn (strValue == nil && bytesValue == nil) ||\n\t\t\t(strValue != nil && bytesValue != nil && *strValue == string(bytesValue))\n\t}\n\n\texpectSucceeds := func(obj *required_strings.FooT, strA, strB *string) {\n\t\tbuilder := flatbuffers.NewBuilder(0)\n\t\tbuilder.Finish(obj.Pack(builder))\n\n\t\t// Check fields are correctly set\n\t\tfoo := required_strings.GetRootAsFoo(builder.FinishedBytes(), 0)\n\t\tif got := foo.StrA(); !equalContent(strA, got) {\n\t\t\tfail(FailString(\"StrA\", strA, got))\n\t\t}\n\t\tif got := foo.StrB(); !equalContent(strB, got) {\n\t\t\tfail(FailString(\"StrB\", strB, got))\n\t\t}\n\n\t\t// Check unpack gives the original object\n\t\tobj2 := foo.UnPack()\n\t\tif !reflect.DeepEqual(obj, obj2) {\n\t\t\tfail(FailString(\"Pack/Unpack()\", obj, obj2))\n\t\t}\n\t}\n\n\tvalueA := \"value a\"\n\tvalueB := \"value b\"\n\tempty := \"\"\n\n\texpectSucceeds(&required_strings.FooT{\n\t\tStrA: valueA,\n\t}, &valueA, &empty)\n\n\texpectSucceeds(&required_strings.FooT{\n\t\tStrB: valueB,\n\t}, &empty, &valueB)\n\n\texpectSucceeds(&required_strings.FooT{\n\t\tStrA: valueA,\n\t\tStrB: valueB,\n\t}, &valueA, &valueB)\n\n\texpectSucceeds(&required_strings.FooT{\n\t\tStrA: empty,\n\t}, &empty, &empty)\n}\n\nfunc CheckByKey(fail func(string, ...interface{})) {\n\texpectEq := func(what string, a, b interface{}) {\n\t\tif a != b {\n\t\t\tfail(FailString(\"Lookup by key: \"+what, b, a))\n\t\t}\n\t}\n\n\tb := flatbuffers.NewBuilder(0)\n\tname := b.CreateString(\"Boss\")\n\n\tslime := &example.MonsterT{Name: \"Slime\"}\n\tpig := &example.MonsterT{Name: \"Pig\"}\n\tslimeBoss := &example.MonsterT{Name: \"SlimeBoss\"}\n\tmushroom := &example.MonsterT{Name: \"Mushroom\"}\n\tironPig := &example.MonsterT{Name: \"Iron Pig\"}\n\n\tmonsterOffsets := make([]flatbuffers.UOffsetT, 5)\n\tmonsterOffsets[0] = slime.Pack(b)\n\tmonsterOffsets[1] = pig.Pack(b)\n\tmonsterOffsets[2] = slimeBoss.Pack(b)\n\tmonsterOffsets[3] = mushroom.Pack(b)\n\tmonsterOffsets[4] = ironPig.Pack(b)\n\ttestarrayoftables := b.CreateVectorOfSortedTables(monsterOffsets, example.MonsterKeyCompare)\n\n\tstr := &example.StatT{Id: \"Strength\", Count: 42}\n\tluk := &example.StatT{Id: \"Luck\", Count: 51}\n\thp := &example.StatT{Id: \"Health\", Count: 12}\n\t// Test default count value of 0\n\tmp := &example.StatT{Id: \"Mana\"}\n\n\tstatOffsets := make([]flatbuffers.UOffsetT, 4)\n\tstatOffsets[0] = str.Pack(b)\n\tstatOffsets[1] = luk.Pack(b)\n\tstatOffsets[2] = hp.Pack(b)\n\tstatOffsets[3] = mp.Pack(b)\n\tscalarKeySortedTablesOffset := b.CreateVectorOfSortedTables(statOffsets, example.StatKeyCompare)\n\n\texample.MonsterStart(b)\n\texample.MonsterAddName(b, name)\n\texample.MonsterAddTestarrayoftables(b, testarrayoftables)\n\texample.MonsterAddScalarKeySortedTables(b, scalarKeySortedTablesOffset)\n\tmoff := example.MonsterEnd(b)\n\tb.Finish(moff)\n\n\tmonster := example.GetRootAsMonster(b.Bytes, b.Head())\n\tslimeMon := &example.Monster{}\n\tmonster.TestarrayoftablesByKey(slimeMon, slime.Name)\n\tmushroomMon := &example.Monster{}\n\tmonster.TestarrayoftablesByKey(mushroomMon, mushroom.Name)\n\tslimeBossMon := &example.Monster{}\n\tmonster.TestarrayoftablesByKey(slimeBossMon, slimeBoss.Name)\n\n\tstrStat := &example.Stat{}\n\tmonster.ScalarKeySortedTablesByKey(strStat, str.Count)\n\tlukStat := &example.Stat{}\n\tmonster.ScalarKeySortedTablesByKey(lukStat, luk.Count)\n\tmpStat := &example.Stat{}\n\tmonster.ScalarKeySortedTablesByKey(mpStat, mp.Count)\n\n\texpectEq(\"Boss name\", string(monster.Name()), \"Boss\")\n\texpectEq(\"Slime name\", string(slimeMon.Name()), slime.Name)\n\texpectEq(\"Mushroom name\", string(mushroomMon.Name()), mushroom.Name)\n\texpectEq(\"SlimeBoss name\", string(slimeBossMon.Name()), slimeBoss.Name)\n\texpectEq(\"Strength Id\", string(strStat.Id()), str.Id)\n\texpectEq(\"Strength Count\", strStat.Count(), str.Count)\n\texpectEq(\"Luck Id\", string(lukStat.Id()), luk.Id)\n\texpectEq(\"Luck Count\", lukStat.Count(), luk.Count)\n\texpectEq(\"Mana Id\", string(mpStat.Id()), mp.Id)\n\t// Use default count value as key\n\texpectEq(\"Mana Count\", mpStat.Count(), uint16(0))\n}\n\n// CheckByteVectorBoundsChecking ensures ByteVector handles malformed input safely.\nfunc CheckByteVectorBoundsChecking(fail func(string, ...interface{})) {\n\t// Test case 1: Offset beyond buffer size\n\ttable := &flatbuffers.Table{\n\t\tBytes: []byte{0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00}, // Small buffer\n\t\tPos:   0,\n\t}\n\tresult := table.ByteVector(100) // Offset way beyond buffer\n\tif result != nil {\n\t\tfail(\"ByteVector should return nil for offset beyond buffer\")\n\t}\n\n\t// Test case 2: Malicious length field\n\t// Construct: [relative offset: 4] [vector length: 0xFFFFFFFF] [data...]\n\tmaliciousBytes := make([]byte, 20)\n\t// At position 0, set relative offset to point to position 4\n\tmaliciousBytes[0] = 4\n\tmaliciousBytes[1] = 0\n\tmaliciousBytes[2] = 0\n\tmaliciousBytes[3] = 0\n\t// At position 4, set malicious vector length\n\tmaliciousBytes[4] = 0xFF\n\tmaliciousBytes[5] = 0xFF\n\tmaliciousBytes[6] = 0xFF\n\tmaliciousBytes[7] = 0xFF\n\n\ttable = &flatbuffers.Table{Bytes: maliciousBytes, Pos: 0}\n\tresult = table.ByteVector(0)\n\tif result != nil {\n\t\tfail(\"ByteVector should return nil for malicious length field\")\n\t}\n\n\t// Test case 3: Valid case should still work\n\t// Construct: [relative offset: 4] [vector length: 3] [data: 'a', 'b', 'c']\n\tvalidBytes := []byte{\n\t\t4, 0, 0, 0, // relative offset to vector data (at position 4)\n\t\t3, 0, 0, 0, // vector length (3 bytes)\n\t\t'a', 'b', 'c', // actual vector data\n\t}\n\ttable = &flatbuffers.Table{Bytes: validBytes, Pos: 0}\n\tresult = table.ByteVector(0)\n\tif result == nil || !bytes.Equal(result, []byte(\"abc\")) {\n\t\tfail(\"ByteVector should work correctly for valid data\")\n\t}\n}\n\n// BenchmarkVtableDeduplication measures the speed of vtable deduplication\n// by creating prePop vtables, then populating b.N objects with a\n// different single vtable.\n//\n// When b.N is large (as in long benchmarks), memory usage may be high.\nfunc BenchmarkVtableDeduplication(b *testing.B) {\n\tprePop := 10\n\tbuilder := flatbuffers.NewBuilder(0)\n\n\t// pre-populate some vtables:\n\tfor i := 0; i < prePop; i++ {\n\t\tbuilder.StartObject(i)\n\t\tfor j := 0; j < i; j++ {\n\t\t\tbuilder.PrependInt16Slot(j, int16(j), 0)\n\t\t}\n\t\tbuilder.EndObject()\n\t}\n\n\t// benchmark deduplication of a new vtable:\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\tlim := prePop\n\n\t\tbuilder.StartObject(lim)\n\t\tfor j := 0; j < lim; j++ {\n\t\t\tbuilder.PrependInt16Slot(j, int16(j), 0)\n\t\t}\n\t\tbuilder.EndObject()\n\t}\n}\n\n// BenchmarkParseGold measures the speed of parsing the 'gold' data\n// used throughout this test suite.\nfunc BenchmarkParseGold(b *testing.B) {\n\tbuf, offset := CheckGeneratedBuild(false, false, b.Fatalf)\n\tmonster := example.GetRootAsMonster(buf, offset)\n\n\t// use these to prevent allocations:\n\treuse_pos := example.Vec3{}\n\treuse_test3 := example.Test{}\n\treuse_table2 := flatbuffers.Table{}\n\treuse_monster2 := example.Monster{}\n\treuse_test4_0 := example.Test{}\n\treuse_test4_1 := example.Test{}\n\n\tb.SetBytes(int64(len(buf[offset:])))\n\tb.ReportAllocs()\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\tmonster.Hp()\n\t\tmonster.Mana()\n\t\tname := monster.Name()\n\t\t_ = name[0]\n\t\t_ = name[len(name)-1]\n\n\t\tmonster.Pos(&reuse_pos)\n\t\treuse_pos.X()\n\t\treuse_pos.Y()\n\t\treuse_pos.Z()\n\t\treuse_pos.Test1()\n\t\treuse_pos.Test2()\n\t\treuse_pos.Test3(&reuse_test3)\n\t\treuse_test3.A()\n\t\treuse_test3.B()\n\t\tmonster.TestType()\n\t\tmonster.Test(&reuse_table2)\n\t\treuse_monster2.Init(reuse_table2.Bytes, reuse_table2.Pos)\n\t\tname2 := reuse_monster2.Name()\n\t\t_ = name2[0]\n\t\t_ = name2[len(name2)-1]\n\t\tmonster.InventoryLength()\n\t\tl := monster.InventoryLength()\n\t\tfor i := 0; i < l; i++ {\n\t\t\tmonster.Inventory(i)\n\t\t}\n\t\tmonster.Test4Length()\n\t\tmonster.Test4(&reuse_test4_0, 0)\n\t\tmonster.Test4(&reuse_test4_1, 1)\n\n\t\treuse_test4_0.A()\n\t\treuse_test4_0.B()\n\t\treuse_test4_1.A()\n\t\treuse_test4_1.B()\n\n\t\tmonster.TestarrayofstringLength()\n\t\tstr0 := monster.Testarrayofstring(0)\n\t\t_ = str0[0]\n\t\t_ = str0[len(str0)-1]\n\t\tstr1 := monster.Testarrayofstring(1)\n\t\t_ = str1[0]\n\t\t_ = str1[len(str1)-1]\n\t}\n}\n\n// BenchmarkBuildGold uses generated code to build the example Monster.\nfunc BenchmarkBuildGold(b *testing.B) {\n\tbuf, offset := CheckGeneratedBuild(false, false, b.Fatalf)\n\tbytes_length := int64(len(buf[offset:]))\n\n\treuse_str := \"MyMonster\"\n\treuse_test1 := \"test1\"\n\treuse_test2 := \"test2\"\n\treuse_fred := \"Fred\"\n\n\tb.SetBytes(bytes_length)\n\tbldr := flatbuffers.NewBuilder(0)\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\tfor i := 0; i < b.N; i++ {\n\t\tbldr.Reset()\n\n\t\tstr := bldr.CreateString(reuse_str)\n\t\ttest1 := bldr.CreateString(reuse_test1)\n\t\ttest2 := bldr.CreateString(reuse_test2)\n\t\tfred := bldr.CreateString(reuse_fred)\n\n\t\texample.MonsterStartInventoryVector(bldr, 5)\n\t\tbldr.PrependByte(4)\n\t\tbldr.PrependByte(3)\n\t\tbldr.PrependByte(2)\n\t\tbldr.PrependByte(1)\n\t\tbldr.PrependByte(0)\n\t\tinv := bldr.EndVector(5)\n\n\t\texample.MonsterStart(bldr)\n\t\texample.MonsterAddName(bldr, fred)\n\t\tmon2 := example.MonsterEnd(bldr)\n\n\t\texample.MonsterStartTest4Vector(bldr, 2)\n\t\texample.CreateTest(bldr, 10, 20)\n\t\texample.CreateTest(bldr, 30, 40)\n\t\ttest4 := bldr.EndVector(2)\n\n\t\texample.MonsterStartTestarrayofstringVector(bldr, 2)\n\t\tbldr.PrependUOffsetT(test2)\n\t\tbldr.PrependUOffsetT(test1)\n\t\ttestArrayOfString := bldr.EndVector(2)\n\n\t\texample.MonsterStart(bldr)\n\n\t\tpos := example.CreateVec3(bldr, 1.0, 2.0, 3.0, 3.0, example.ColorGreen, 5, 6)\n\t\texample.MonsterAddPos(bldr, pos)\n\n\t\texample.MonsterAddHp(bldr, 80)\n\t\texample.MonsterAddName(bldr, str)\n\t\texample.MonsterAddInventory(bldr, inv)\n\t\texample.MonsterAddTestType(bldr, 1)\n\t\texample.MonsterAddTest(bldr, mon2)\n\t\texample.MonsterAddTest4(bldr, test4)\n\t\texample.MonsterAddTestarrayofstring(bldr, testArrayOfString)\n\t\tmon := example.MonsterEnd(bldr)\n\n\t\tbldr.Finish(mon)\n\t}\n}\n\n// Benchmark adding 130 bytes, one by one.\n// Unlike BenchmarkBuildGold, we create a new builder every time,\n// to test the performance of growing the buffer.\nfunc BenchmarkBuildAllocations(b *testing.B) {\n\tb.SetBytes(130)\n\tb.ReportAllocs()\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\tbldr := flatbuffers.NewBuilder(0)\n\t\tfor j := 0; j < 130; j++ {\n\t\t\tbldr.PrependByte(byte(j))\n\t\t}\n\t\tif len(bldr.Bytes) != 256 {\n\t\t\tb.Fatalf(\"expected buffer size=256, got %d\", len(bldr.Bytes))\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "tests/include_build_test.cc",
    "content": "#include \"tests/includer_test_generated.h\"\n"
  },
  {
    "path": "tests/include_test/include_test1.fbs",
    "content": "include \"sub/include_test2.fbs\";\ninclude \"sub/include_test2.fbs\";  // should be skipped\ninclude \"include_test1.fbs\";  // should be skipped\n\ntable TableA {\n  b:MyGame.OtherNameSpace.TableB;\n}\n"
  },
  {
    "path": "tests/include_test/order.fbs",
    "content": "include \"no_namespace.fbs\";\n\nnamespace order;\n\ntable Food {\n  pizza: Pizza (id: 0);\n  pizza_test:Pizza(id:1);\n}\n"
  },
  {
    "path": "tests/include_test/sub/include_test2.fbs",
    "content": "include \"include_test1.fbs\";\ninclude \"sub/include_test2.fbs\";    // should be skipped\n\nnamespace MyGame.OtherNameSpace;\n\nenum FromInclude:long { IncludeVal }\n\nstruct Unused { a:int; }\n\ntable TableB {\n  a:TableA;\n}\n"
  },
  {
    "path": "tests/include_test/sub/no_namespace.fbs",
    "content": "table Pizza {\n  size: int;\n}\n"
  },
  {
    "path": "tests/include_test1/mod.rs",
    "content": "// Automatically generated by the Flatbuffers compiler. Do not modify.\n// @generated\npub mod my_game {\n    use super::*;\n    pub mod other_name_space {\n        use super::*;\n        mod from_include_generated;\n        pub use self::from_include_generated::*;\n        mod unused_generated;\n        pub use self::unused_generated::*;\n        mod table_b_generated;\n        pub use self::table_b_generated::*;\n    } // other_name_space\n} // my_game\nmod table_a_generated;\npub use self::table_a_generated::*;\n"
  },
  {
    "path": "tests/include_test1/my_game/other_name_space/from_include_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MIN_FROM_INCLUDE: i64 = 0;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MAX_FROM_INCLUDE: i64 = 0;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n#[allow(non_camel_case_types)]\npub const ENUM_VALUES_FROM_INCLUDE: [FromInclude; 1] = [\n    FromInclude::IncludeVal,\n];\n\n#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n#[repr(transparent)]\npub struct FromInclude(pub i64);\n\n#[allow(non_upper_case_globals)]\nimpl FromInclude {\n    pub const IncludeVal: Self = Self(0);\n\n    pub const ENUM_MIN: i64 = 0;\n    pub const ENUM_MAX: i64 = 0;\n    pub const ENUM_VALUES: &'static [Self] = &[\n        Self::IncludeVal,\n    ];\n\n    /// Returns the variant's name or \"\" if unknown.\n    pub fn variant_name(self) -> Option<&'static str> {\n        match self {\n            Self::IncludeVal => Some(\"IncludeVal\"),\n            _ => None,\n        }\n    }\n}\n\nimpl ::core::fmt::Debug for FromInclude {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        if let Some(name) = self.variant_name() {\n            f.write_str(name)\n        } else {\n            f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n        }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for FromInclude {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<i64>(buf, loc) };\n        Self(b)\n    }\n}\n\nimpl ::flatbuffers::Push for FromInclude {\n    type Output = FromInclude;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<i64>(dst, self.0) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for FromInclude {\n    type Scalar = i64;\n\n    #[inline]\n    fn to_little_endian(self) -> i64 {\n        self.0.to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: i64) -> Self {\n        let b = i64::from_le(v);\n        Self(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for FromInclude {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        i64::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for FromInclude {}\n"
  },
  {
    "path": "tests/include_test1/my_game/other_name_space/table_b_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum TableBOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct TableB<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for TableB<'a> {\n    type Inner = TableB<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> TableB<'a> {\n    pub const VT_A: ::flatbuffers::VOffsetT = 4;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.OtherNameSpace.TableB\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        TableB { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args TableBArgs<'args>\n    ) -> ::flatbuffers::WIPOffset<TableB<'bldr>> {\n        let mut builder = TableBBuilder::new(_fbb);\n        if let Some(x) = args.a { builder.add_a(x); }\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> TableBT {\n        let a = self.a().map(|x| {\n            alloc::boxed::Box::new(x.unpack())\n        });\n        TableBT {\n            a,\n        }\n    }\n\n    #[inline]\n    pub fn a(&self) -> Option<super::super::TableA<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<super::super::TableA>>(TableB::VT_A, None)}\n    }\n}\n\nimpl ::flatbuffers::Verifiable for TableB<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<super::super::TableA>>(\"a\", Self::VT_A, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct TableBArgs<'a> {\n    pub a: Option<::flatbuffers::WIPOffset<super::super::TableA<'a>>>,\n}\n\nimpl<'a> Default for TableBArgs<'a> {\n    #[inline]\n    fn default() -> Self {\n        TableBArgs {\n            a: None,\n        }\n    }\n}\n\npub struct TableBBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> TableBBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_a(&mut self, a: ::flatbuffers::WIPOffset<super::super::TableA<'b >>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<super::super::TableA>>(TableB::VT_A, a);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> TableBBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        TableBBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<TableB<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for TableB<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"TableB\");\n        ds.field(\"a\", &self.a());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct TableBT {\n    pub a: Option<alloc::boxed::Box<super::super::TableAT>>,\n}\n\nimpl Default for TableBT {\n    fn default() -> Self {\n        Self {\n            a: None,\n        }\n    }\n}\n\nimpl TableBT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<TableB<'b>> {\n        let a = self.a.as_ref().map(|x|{\n            x.pack(_fbb)\n        });\n        TableB::create(_fbb, &TableBArgs{\n            a,\n        })\n    }\n}\n"
  },
  {
    "path": "tests/include_test1/my_game/other_name_space/unused_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n// struct Unused, aligned to 4\n#[repr(transparent)]\n#[derive(Clone, Copy, PartialEq)]\npub struct Unused(pub [u8; 4]);\n\nimpl Default for Unused {\n    fn default() -> Self {\n        Self([0; 4])\n    }\n}\n\nimpl ::core::fmt::Debug for Unused {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        f.debug_struct(\"Unused\")\n            .field(\"a\", &self.a())\n            .finish()\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for Unused {}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Unused {\n    type Inner = &'a Unused;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { <&'a Unused>::follow(buf, loc) }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for &'a Unused {\n    type Inner = &'a Unused;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { ::flatbuffers::follow_cast_ref::<Unused>(buf, loc) }\n    }\n}\n\nimpl<'b> ::flatbuffers::Push for Unused {\n    type Output = Unused;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        let src = unsafe { ::core::slice::from_raw_parts(self as *const Unused as *const u8, <Self as ::flatbuffers::Push>::size()) };\n        dst.copy_from_slice(src);\n    }\n\n    #[inline]\n    fn alignment() -> ::flatbuffers::PushAlignment {\n        ::flatbuffers::PushAlignment::new(4)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for Unused {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.in_buffer::<Self>(pos)\n    }\n}\n\nimpl<'a> Unused {\n    #[allow(clippy::too_many_arguments)]\n    pub fn new(\n        a: i32,\n    ) -> Self {\n        let mut s = Self([0; 4]);\n        s.set_a(a);\n        s\n    }\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.OtherNameSpace.Unused\"\n    }\n\n    pub fn a(&self) -> i32 {\n        let mut mem = ::core::mem::MaybeUninit::<<i32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[0..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<i32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_a(&mut self, x: i32) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[0..].as_mut_ptr(),\n                ::core::mem::size_of::<<i32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn unpack(&self) -> UnusedT {\n        UnusedT {\n            a: self.a(),\n        }\n    }\n}\n\n#[derive(Debug, Clone, PartialEq)]\npub struct UnusedT {\n    pub a: i32,\n}\nimpl Default for UnusedT {\n    fn default() -> Self {\n        Self {\n            a: 0,\n        }\n    }\n}\n\nimpl UnusedT {\n    pub fn pack(&self) -> Unused {\n        Unused::new(\n            self.a,\n        )\n    }\n}\n"
  },
  {
    "path": "tests/include_test1/table_a_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum TableAOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct TableA<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for TableA<'a> {\n    type Inner = TableA<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> TableA<'a> {\n    pub const VT_B: ::flatbuffers::VOffsetT = 4;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"TableA\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        TableA { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args TableAArgs<'args>\n    ) -> ::flatbuffers::WIPOffset<TableA<'bldr>> {\n        let mut builder = TableABuilder::new(_fbb);\n        if let Some(x) = args.b { builder.add_b(x); }\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> TableAT {\n        let b = self.b().map(|x| {\n            alloc::boxed::Box::new(x.unpack())\n        });\n        TableAT {\n            b,\n        }\n    }\n\n    #[inline]\n    pub fn b(&self) -> Option<my_game::other_name_space::TableB<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<my_game::other_name_space::TableB>>(TableA::VT_B, None)}\n    }\n}\n\nimpl ::flatbuffers::Verifiable for TableA<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<my_game::other_name_space::TableB>>(\"b\", Self::VT_B, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct TableAArgs<'a> {\n    pub b: Option<::flatbuffers::WIPOffset<my_game::other_name_space::TableB<'a>>>,\n}\n\nimpl<'a> Default for TableAArgs<'a> {\n    #[inline]\n    fn default() -> Self {\n        TableAArgs {\n            b: None,\n        }\n    }\n}\n\npub struct TableABuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> TableABuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_b(&mut self, b: ::flatbuffers::WIPOffset<my_game::other_name_space::TableB<'b >>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<my_game::other_name_space::TableB>>(TableA::VT_B, b);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> TableABuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        TableABuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<TableA<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for TableA<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"TableA\");\n        ds.field(\"b\", &self.b());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct TableAT {\n    pub b: Option<alloc::boxed::Box<my_game::other_name_space::TableBT>>,\n}\n\nimpl Default for TableAT {\n    fn default() -> Self {\n        Self {\n            b: None,\n        }\n    }\n}\n\nimpl TableAT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<TableA<'b>> {\n        let b = self.b.as_ref().map(|x|{\n            x.pack(_fbb)\n        });\n        TableA::create(_fbb, &TableAArgs{\n            b,\n        })\n    }\n}\n"
  },
  {
    "path": "tests/include_test1_generated.dart",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable, constant_identifier_names\n\nimport 'dart:typed_data' show Uint8List;\nimport 'package:flat_buffers/flat_buffers.dart' as fb;\n\n\nimport './include_test2_my_game.other_name_space_generated.dart' as my_game_other_name_space;\n\nclass TableA {\n  TableA._(this._bc, this._bcOffset);\n  factory TableA(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<TableA> reader = _TableAReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  my_game_other_name_space.TableB? get b => my_game_other_name_space.TableB.reader.vTableGetNullable(_bc, _bcOffset, 4);\n\n  @override\n  String toString() {\n    return 'TableA{b: ${b}}';\n  }\n\n  TableAT unpack() => TableAT(\n      b: b?.unpack());\n\n  static int pack(fb.Builder fbBuilder, TableAT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass TableAT implements fb.Packable {\n  my_game_other_name_space.TableBT? b;\n\n  TableAT({\n      this.b});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    final int? bOffset = b?.pack(fbBuilder);\n    fbBuilder.startTable(1);\n    fbBuilder.addOffset(0, bOffset);\n    return fbBuilder.endTable();\n  }\n\n  @override\n  String toString() {\n    return 'TableAT{b: ${b}}';\n  }\n}\n\nclass _TableAReader extends fb.TableReader<TableA> {\n  const _TableAReader();\n\n  @override\n  TableA createObject(fb.BufferContext bc, int offset) => \n    TableA._(bc, offset);\n}\n\nclass TableABuilder {\n  TableABuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  void begin() {\n    fbBuilder.startTable(1);\n  }\n\n  int addBOffset(int? offset) {\n    fbBuilder.addOffset(0, offset);\n    return fbBuilder.offset;\n  }\n\n  int finish() {\n    return fbBuilder.endTable();\n  }\n}\n\nclass TableAObjectBuilder extends fb.ObjectBuilder {\n  final my_game_other_name_space.TableBObjectBuilder? _b;\n\n  TableAObjectBuilder({\n    my_game_other_name_space.TableBObjectBuilder? b,\n  })\n      : _b = b;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    final int? bOffset = _b?.getOrCreateOffset(fbBuilder);\n    fbBuilder.startTable(1);\n    fbBuilder.addOffset(0, bOffset);\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n"
  },
  {
    "path": "tests/include_test1_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\n\npub enum TableAOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct TableA<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for TableA<'a> {\n    type Inner = TableA<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> TableA<'a> {\n    pub const VT_B: ::flatbuffers::VOffsetT = 4;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"TableA\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        TableA { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args TableAArgs<'args>\n    ) -> ::flatbuffers::WIPOffset<TableA<'bldr>> {\n        let mut builder = TableABuilder::new(_fbb);\n        if let Some(x) = args.b { builder.add_b(x); }\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> TableAT {\n        let b = self.b().map(|x| {\n            alloc::boxed::Box::new(x.unpack())\n        });\n        TableAT {\n            b,\n        }\n    }\n\n    #[inline]\n    pub fn b(&self) -> Option<my_game::other_name_space::TableB<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<my_game::other_name_space::TableB>>(TableA::VT_B, None)}\n    }\n}\n\nimpl ::flatbuffers::Verifiable for TableA<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<my_game::other_name_space::TableB>>(\"b\", Self::VT_B, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct TableAArgs<'a> {\n    pub b: Option<::flatbuffers::WIPOffset<my_game::other_name_space::TableB<'a>>>,\n}\n\nimpl<'a> Default for TableAArgs<'a> {\n    #[inline]\n    fn default() -> Self {\n        TableAArgs {\n            b: None,\n        }\n    }\n}\n\npub struct TableABuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> TableABuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_b(&mut self, b: ::flatbuffers::WIPOffset<my_game::other_name_space::TableB<'b >>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<my_game::other_name_space::TableB>>(TableA::VT_B, b);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> TableABuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        TableABuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<TableA<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for TableA<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"TableA\");\n        ds.field(\"b\", &self.b());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct TableAT {\n    pub b: Option<alloc::boxed::Box<my_game::other_name_space::TableBT>>,\n}\n\nimpl Default for TableAT {\n    fn default() -> Self {\n        Self {\n            b: None,\n        }\n    }\n}\n\nimpl TableAT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<TableA<'b>> {\n        let b = self.b.as_ref().map(|x|{\n            x.pack(_fbb)\n        });\n        TableA::create(_fbb, &TableAArgs{\n            b,\n        })\n    }\n}\n\n#[allow(unused_imports, dead_code)]\npub mod my_game {\n    extern crate alloc;\n\n    #[allow(unused_imports, dead_code)]\n    pub mod other_name_space {\n        extern crate alloc;\n\n        #[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n        pub const ENUM_MIN_FROM_INCLUDE: i64 = 0;\n\n        #[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n        pub const ENUM_MAX_FROM_INCLUDE: i64 = 0;\n\n        #[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n        #[allow(non_camel_case_types)]\n        pub const ENUM_VALUES_FROM_INCLUDE: [FromInclude; 1] = [\n            FromInclude::IncludeVal,\n        ];\n\n        #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n        #[repr(transparent)]\n        pub struct FromInclude(pub i64);\n\n        #[allow(non_upper_case_globals)]\n        impl FromInclude {\n            pub const IncludeVal: Self = Self(0);\n\n            pub const ENUM_MIN: i64 = 0;\n            pub const ENUM_MAX: i64 = 0;\n            pub const ENUM_VALUES: &'static [Self] = &[\n                Self::IncludeVal,\n            ];\n\n            /// Returns the variant's name or \"\" if unknown.\n            pub fn variant_name(self) -> Option<&'static str> {\n                match self {\n                    Self::IncludeVal => Some(\"IncludeVal\"),\n                    _ => None,\n                }\n            }\n        }\n\n        impl ::core::fmt::Debug for FromInclude {\n            fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n                if let Some(name) = self.variant_name() {\n                    f.write_str(name)\n                } else {\n                    f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n                }\n            }\n        }\n\n        impl<'a> ::flatbuffers::Follow<'a> for FromInclude {\n            type Inner = Self;\n\n            #[inline]\n            unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n                let b = unsafe { ::flatbuffers::read_scalar_at::<i64>(buf, loc) };\n                Self(b)\n            }\n        }\n\n        impl ::flatbuffers::Push for FromInclude {\n            type Output = FromInclude;\n\n            #[inline]\n            unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n                unsafe { ::flatbuffers::emplace_scalar::<i64>(dst, self.0) };\n            }\n        }\n\n        impl ::flatbuffers::EndianScalar for FromInclude {\n            type Scalar = i64;\n\n            #[inline]\n            fn to_little_endian(self) -> i64 {\n                self.0.to_le()\n            }\n\n            #[inline]\n            #[allow(clippy::wrong_self_convention)]\n            fn from_little_endian(v: i64) -> Self {\n                let b = i64::from_le(v);\n                Self(b)\n            }\n        }\n\n        impl<'a> ::flatbuffers::Verifiable for FromInclude {\n            #[inline]\n            fn run_verifier(\n                v: &mut ::flatbuffers::Verifier, pos: usize\n            ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n                i64::run_verifier(v, pos)\n            }\n        }\n\n        impl ::flatbuffers::SimpleToVerifyInSlice for FromInclude {}\n\n        // struct Unused, aligned to 4\n        #[repr(transparent)]\n        #[derive(Clone, Copy, PartialEq)]\n        pub struct Unused(pub [u8; 4]);\n\n        impl Default for Unused {\n            fn default() -> Self {\n                Self([0; 4])\n            }\n        }\n\n        impl ::core::fmt::Debug for Unused {\n            fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n                f.debug_struct(\"Unused\")\n                    .field(\"a\", &self.a())\n                    .finish()\n            }\n        }\n\n        impl ::flatbuffers::SimpleToVerifyInSlice for Unused {}\n\n        impl<'a> ::flatbuffers::Follow<'a> for Unused {\n            type Inner = &'a Unused;\n\n            #[inline]\n            unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n                unsafe { <&'a Unused>::follow(buf, loc) }\n            }\n        }\n\n        impl<'a> ::flatbuffers::Follow<'a> for &'a Unused {\n            type Inner = &'a Unused;\n\n            #[inline]\n            unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n                unsafe { ::flatbuffers::follow_cast_ref::<Unused>(buf, loc) }\n            }\n        }\n\n        impl<'b> ::flatbuffers::Push for Unused {\n            type Output = Unused;\n\n            #[inline]\n            unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n                let src = unsafe { ::core::slice::from_raw_parts(self as *const Unused as *const u8, <Self as ::flatbuffers::Push>::size()) };\n                dst.copy_from_slice(src);\n            }\n\n            #[inline]\n            fn alignment() -> ::flatbuffers::PushAlignment {\n                ::flatbuffers::PushAlignment::new(4)\n            }\n        }\n\n        impl<'a> ::flatbuffers::Verifiable for Unused {\n            #[inline]\n            fn run_verifier(\n                v: &mut ::flatbuffers::Verifier, pos: usize\n            ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n                v.in_buffer::<Self>(pos)\n            }\n        }\n\n        impl<'a> Unused {\n            #[allow(clippy::too_many_arguments)]\n            pub fn new(\n                a: i32,\n            ) -> Self {\n                let mut s = Self([0; 4]);\n                s.set_a(a);\n                s\n            }\n\n            pub const fn get_fully_qualified_name() -> &'static str {\n                \"MyGame.OtherNameSpace.Unused\"\n            }\n\n            pub fn a(&self) -> i32 {\n                let mut mem = ::core::mem::MaybeUninit::<<i32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid value in this slot\n                ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n                    ::core::ptr::copy_nonoverlapping(\n                        self.0[0..].as_ptr(),\n                        mem.as_mut_ptr() as *mut u8,\n                        ::core::mem::size_of::<<i32 as ::flatbuffers::EndianScalar>::Scalar>(),\n                    );\n                    mem.assume_init()\n                })\n            }\n\n            pub fn set_a(&mut self, x: i32) {\n                let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid value in this slot\n                unsafe {\n                    ::core::ptr::copy_nonoverlapping(\n                        &x_le as *const _ as *const u8,\n                        self.0[0..].as_mut_ptr(),\n                        ::core::mem::size_of::<<i32 as ::flatbuffers::EndianScalar>::Scalar>(),\n                    );\n                }\n            }\n\n            pub fn unpack(&self) -> UnusedT {\n                UnusedT {\n                    a: self.a(),\n                }\n            }\n        }\n\n        #[derive(Debug, Clone, PartialEq)]\n        pub struct UnusedT {\n            pub a: i32,\n        }\n        impl Default for UnusedT {\n            fn default() -> Self {\n                Self {\n                    a: 0,\n                }\n            }\n        }\n\n        impl UnusedT {\n            pub fn pack(&self) -> Unused {\n                Unused::new(\n                    self.a,\n                )\n            }\n        }\n\n        pub enum TableBOffset {}\n\n        #[derive(Copy, Clone, PartialEq)]\n        pub struct TableB<'a> {\n            pub _tab: ::flatbuffers::Table<'a>,\n        }\n\n        impl<'a> ::flatbuffers::Follow<'a> for TableB<'a> {\n            type Inner = TableB<'a>;\n\n            #[inline]\n            unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n                Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n            }\n        }\n\n        impl<'a> TableB<'a> {\n            pub const VT_A: ::flatbuffers::VOffsetT = 4;\n\n            pub const fn get_fully_qualified_name() -> &'static str {\n                \"MyGame.OtherNameSpace.TableB\"\n            }\n\n            #[inline]\n            pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n                TableB { _tab: table }\n            }\n\n            #[allow(unused_mut)]\n            pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n                _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n                args: &'args TableBArgs<'args>\n            ) -> ::flatbuffers::WIPOffset<TableB<'bldr>> {\n                let mut builder = TableBBuilder::new(_fbb);\n                if let Some(x) = args.a { builder.add_a(x); }\n                builder.finish()\n            }\n\n            pub fn unpack(&self) -> TableBT {\n                let a = self.a().map(|x| {\n                    alloc::boxed::Box::new(x.unpack())\n                });\n                TableBT {\n                    a,\n                }\n            }\n\n            #[inline]\n            pub fn a(&self) -> Option<super::super::TableA<'a>> {\n                // Safety:\n                // Created from valid Table for this object\n                // which contains a valid value in this slot\n                unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<super::super::TableA>>(TableB::VT_A, None)}\n            }\n        }\n\n        impl ::flatbuffers::Verifiable for TableB<'_> {\n            #[inline]\n            fn run_verifier(\n                v: &mut ::flatbuffers::Verifier, pos: usize\n            ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n                v.visit_table(pos)?\n                    .visit_field::<::flatbuffers::ForwardsUOffset<super::super::TableA>>(\"a\", Self::VT_A, false)?\n                    .finish();\n                Ok(())\n            }\n        }\n\n        pub struct TableBArgs<'a> {\n            pub a: Option<::flatbuffers::WIPOffset<super::super::TableA<'a>>>,\n        }\n\n        impl<'a> Default for TableBArgs<'a> {\n            #[inline]\n            fn default() -> Self {\n                TableBArgs {\n                    a: None,\n                }\n            }\n        }\n\n        pub struct TableBBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n            fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n            start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n        }\n\n        impl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> TableBBuilder<'a, 'b, A> {\n            #[inline]\n            pub fn add_a(&mut self, a: ::flatbuffers::WIPOffset<super::super::TableA<'b >>) {\n                self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<super::super::TableA>>(TableB::VT_A, a);\n            }\n\n            #[inline]\n            pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> TableBBuilder<'a, 'b, A> {\n                let start = _fbb.start_table();\n                TableBBuilder {\n                    fbb_: _fbb,\n                    start_: start,\n                }\n            }\n\n            #[inline]\n            pub fn finish(self) -> ::flatbuffers::WIPOffset<TableB<'a>> {\n                let o = self.fbb_.end_table(self.start_);\n                ::flatbuffers::WIPOffset::new(o.value())\n            }\n        }\n\n        impl ::core::fmt::Debug for TableB<'_> {\n            fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n                let mut ds = f.debug_struct(\"TableB\");\n                ds.field(\"a\", &self.a());\n                ds.finish()\n            }\n        }\n\n        #[non_exhaustive]\n        #[derive(Debug, Clone, PartialEq)]\n        pub struct TableBT {\n            pub a: Option<alloc::boxed::Box<super::super::TableAT>>,\n        }\n\n        impl Default for TableBT {\n            fn default() -> Self {\n                Self {\n                    a: None,\n                }\n            }\n        }\n\n        impl TableBT {\n            pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n                &self,\n                _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n            ) -> ::flatbuffers::WIPOffset<TableB<'b>> {\n                let a = self.a.as_ref().map(|x|{\n                    x.pack(_fbb)\n                });\n                TableB::create(_fbb, &TableBArgs{\n                    a,\n                })\n            }\n        }\n    } // pub mod OtherNameSpace\n} // pub mod MyGame\n"
  },
  {
    "path": "tests/include_test2/mod.rs",
    "content": "// Automatically generated by the Flatbuffers compiler. Do not modify.\n// @generated\npub mod my_game {\n    use super::*;\n    pub mod other_name_space {\n        use super::*;\n        mod from_include_generated;\n        pub use self::from_include_generated::*;\n        mod unused_generated;\n        pub use self::unused_generated::*;\n        mod table_b_generated;\n        pub use self::table_b_generated::*;\n    } // other_name_space\n} // my_game\nmod table_a_generated;\npub use self::table_a_generated::*;\n"
  },
  {
    "path": "tests/include_test2/my_game/other_name_space/from_include_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MIN_FROM_INCLUDE: i64 = 0;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MAX_FROM_INCLUDE: i64 = 0;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n#[allow(non_camel_case_types)]\npub const ENUM_VALUES_FROM_INCLUDE: [FromInclude; 1] = [\n    FromInclude::IncludeVal,\n];\n\n#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n#[repr(transparent)]\npub struct FromInclude(pub i64);\n\n#[allow(non_upper_case_globals)]\nimpl FromInclude {\n    pub const IncludeVal: Self = Self(0);\n\n    pub const ENUM_MIN: i64 = 0;\n    pub const ENUM_MAX: i64 = 0;\n    pub const ENUM_VALUES: &'static [Self] = &[\n        Self::IncludeVal,\n    ];\n\n    /// Returns the variant's name or \"\" if unknown.\n    pub fn variant_name(self) -> Option<&'static str> {\n        match self {\n            Self::IncludeVal => Some(\"IncludeVal\"),\n            _ => None,\n        }\n    }\n}\n\nimpl ::core::fmt::Debug for FromInclude {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        if let Some(name) = self.variant_name() {\n            f.write_str(name)\n        } else {\n            f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n        }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for FromInclude {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<i64>(buf, loc) };\n        Self(b)\n    }\n}\n\nimpl ::flatbuffers::Push for FromInclude {\n    type Output = FromInclude;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<i64>(dst, self.0) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for FromInclude {\n    type Scalar = i64;\n\n    #[inline]\n    fn to_little_endian(self) -> i64 {\n        self.0.to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: i64) -> Self {\n        let b = i64::from_le(v);\n        Self(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for FromInclude {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        i64::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for FromInclude {}\n"
  },
  {
    "path": "tests/include_test2/my_game/other_name_space/table_b_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum TableBOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct TableB<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for TableB<'a> {\n    type Inner = TableB<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> TableB<'a> {\n    pub const VT_A: ::flatbuffers::VOffsetT = 4;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.OtherNameSpace.TableB\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        TableB { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args TableBArgs<'args>\n    ) -> ::flatbuffers::WIPOffset<TableB<'bldr>> {\n        let mut builder = TableBBuilder::new(_fbb);\n        if let Some(x) = args.a { builder.add_a(x); }\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> TableBT {\n        let a = self.a().map(|x| {\n            alloc::boxed::Box::new(x.unpack())\n        });\n        TableBT {\n            a,\n        }\n    }\n\n    #[inline]\n    pub fn a(&self) -> Option<super::super::TableA<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<super::super::TableA>>(TableB::VT_A, None)}\n    }\n}\n\nimpl ::flatbuffers::Verifiable for TableB<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<super::super::TableA>>(\"a\", Self::VT_A, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct TableBArgs<'a> {\n    pub a: Option<::flatbuffers::WIPOffset<super::super::TableA<'a>>>,\n}\n\nimpl<'a> Default for TableBArgs<'a> {\n    #[inline]\n    fn default() -> Self {\n        TableBArgs {\n            a: None,\n        }\n    }\n}\n\npub struct TableBBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> TableBBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_a(&mut self, a: ::flatbuffers::WIPOffset<super::super::TableA<'b >>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<super::super::TableA>>(TableB::VT_A, a);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> TableBBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        TableBBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<TableB<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for TableB<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"TableB\");\n        ds.field(\"a\", &self.a());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct TableBT {\n    pub a: Option<alloc::boxed::Box<super::super::TableAT>>,\n}\n\nimpl Default for TableBT {\n    fn default() -> Self {\n        Self {\n            a: None,\n        }\n    }\n}\n\nimpl TableBT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<TableB<'b>> {\n        let a = self.a.as_ref().map(|x|{\n            x.pack(_fbb)\n        });\n        TableB::create(_fbb, &TableBArgs{\n            a,\n        })\n    }\n}\n"
  },
  {
    "path": "tests/include_test2/my_game/other_name_space/unused_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n// struct Unused, aligned to 4\n#[repr(transparent)]\n#[derive(Clone, Copy, PartialEq)]\npub struct Unused(pub [u8; 4]);\n\nimpl Default for Unused {\n    fn default() -> Self {\n        Self([0; 4])\n    }\n}\n\nimpl ::core::fmt::Debug for Unused {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        f.debug_struct(\"Unused\")\n            .field(\"a\", &self.a())\n            .finish()\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for Unused {}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Unused {\n    type Inner = &'a Unused;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { <&'a Unused>::follow(buf, loc) }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for &'a Unused {\n    type Inner = &'a Unused;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { ::flatbuffers::follow_cast_ref::<Unused>(buf, loc) }\n    }\n}\n\nimpl<'b> ::flatbuffers::Push for Unused {\n    type Output = Unused;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        let src = unsafe { ::core::slice::from_raw_parts(self as *const Unused as *const u8, <Self as ::flatbuffers::Push>::size()) };\n        dst.copy_from_slice(src);\n    }\n\n    #[inline]\n    fn alignment() -> ::flatbuffers::PushAlignment {\n        ::flatbuffers::PushAlignment::new(4)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for Unused {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.in_buffer::<Self>(pos)\n    }\n}\n\nimpl<'a> Unused {\n    #[allow(clippy::too_many_arguments)]\n    pub fn new(\n        a: i32,\n    ) -> Self {\n        let mut s = Self([0; 4]);\n        s.set_a(a);\n        s\n    }\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.OtherNameSpace.Unused\"\n    }\n\n    pub fn a(&self) -> i32 {\n        let mut mem = ::core::mem::MaybeUninit::<<i32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[0..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<i32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_a(&mut self, x: i32) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[0..].as_mut_ptr(),\n                ::core::mem::size_of::<<i32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn unpack(&self) -> UnusedT {\n        UnusedT {\n            a: self.a(),\n        }\n    }\n}\n\n#[derive(Debug, Clone, PartialEq)]\npub struct UnusedT {\n    pub a: i32,\n}\nimpl Default for UnusedT {\n    fn default() -> Self {\n        Self {\n            a: 0,\n        }\n    }\n}\n\nimpl UnusedT {\n    pub fn pack(&self) -> Unused {\n        Unused::new(\n            self.a,\n        )\n    }\n}\n"
  },
  {
    "path": "tests/include_test2/table_a_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum TableAOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct TableA<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for TableA<'a> {\n    type Inner = TableA<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> TableA<'a> {\n    pub const VT_B: ::flatbuffers::VOffsetT = 4;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"TableA\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        TableA { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args TableAArgs<'args>\n    ) -> ::flatbuffers::WIPOffset<TableA<'bldr>> {\n        let mut builder = TableABuilder::new(_fbb);\n        if let Some(x) = args.b { builder.add_b(x); }\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> TableAT {\n        let b = self.b().map(|x| {\n            alloc::boxed::Box::new(x.unpack())\n        });\n        TableAT {\n            b,\n        }\n    }\n\n    #[inline]\n    pub fn b(&self) -> Option<my_game::other_name_space::TableB<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<my_game::other_name_space::TableB>>(TableA::VT_B, None)}\n    }\n}\n\nimpl ::flatbuffers::Verifiable for TableA<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<my_game::other_name_space::TableB>>(\"b\", Self::VT_B, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct TableAArgs<'a> {\n    pub b: Option<::flatbuffers::WIPOffset<my_game::other_name_space::TableB<'a>>>,\n}\n\nimpl<'a> Default for TableAArgs<'a> {\n    #[inline]\n    fn default() -> Self {\n        TableAArgs {\n            b: None,\n        }\n    }\n}\n\npub struct TableABuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> TableABuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_b(&mut self, b: ::flatbuffers::WIPOffset<my_game::other_name_space::TableB<'b >>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<my_game::other_name_space::TableB>>(TableA::VT_B, b);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> TableABuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        TableABuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<TableA<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for TableA<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"TableA\");\n        ds.field(\"b\", &self.b());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct TableAT {\n    pub b: Option<alloc::boxed::Box<my_game::other_name_space::TableBT>>,\n}\n\nimpl Default for TableAT {\n    fn default() -> Self {\n        Self {\n            b: None,\n        }\n    }\n}\n\nimpl TableAT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<TableA<'b>> {\n        let b = self.b.as_ref().map(|x|{\n            x.pack(_fbb)\n        });\n        TableA::create(_fbb, &TableAArgs{\n            b,\n        })\n    }\n}\n"
  },
  {
    "path": "tests/include_test2_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\n\npub enum TableAOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct TableA<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for TableA<'a> {\n    type Inner = TableA<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> TableA<'a> {\n    pub const VT_B: ::flatbuffers::VOffsetT = 4;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"TableA\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        TableA { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args TableAArgs<'args>\n    ) -> ::flatbuffers::WIPOffset<TableA<'bldr>> {\n        let mut builder = TableABuilder::new(_fbb);\n        if let Some(x) = args.b { builder.add_b(x); }\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> TableAT {\n        let b = self.b().map(|x| {\n            alloc::boxed::Box::new(x.unpack())\n        });\n        TableAT {\n            b,\n        }\n    }\n\n    #[inline]\n    pub fn b(&self) -> Option<my_game::other_name_space::TableB<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<my_game::other_name_space::TableB>>(TableA::VT_B, None)}\n    }\n}\n\nimpl ::flatbuffers::Verifiable for TableA<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<my_game::other_name_space::TableB>>(\"b\", Self::VT_B, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct TableAArgs<'a> {\n    pub b: Option<::flatbuffers::WIPOffset<my_game::other_name_space::TableB<'a>>>,\n}\n\nimpl<'a> Default for TableAArgs<'a> {\n    #[inline]\n    fn default() -> Self {\n        TableAArgs {\n            b: None,\n        }\n    }\n}\n\npub struct TableABuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> TableABuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_b(&mut self, b: ::flatbuffers::WIPOffset<my_game::other_name_space::TableB<'b >>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<my_game::other_name_space::TableB>>(TableA::VT_B, b);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> TableABuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        TableABuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<TableA<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for TableA<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"TableA\");\n        ds.field(\"b\", &self.b());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct TableAT {\n    pub b: Option<alloc::boxed::Box<my_game::other_name_space::TableBT>>,\n}\n\nimpl Default for TableAT {\n    fn default() -> Self {\n        Self {\n            b: None,\n        }\n    }\n}\n\nimpl TableAT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<TableA<'b>> {\n        let b = self.b.as_ref().map(|x|{\n            x.pack(_fbb)\n        });\n        TableA::create(_fbb, &TableAArgs{\n            b,\n        })\n    }\n}\n\n#[allow(unused_imports, dead_code)]\npub mod my_game {\n    extern crate alloc;\n\n    #[allow(unused_imports, dead_code)]\n    pub mod other_name_space {\n        extern crate alloc;\n\n        #[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n        pub const ENUM_MIN_FROM_INCLUDE: i64 = 0;\n\n        #[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n        pub const ENUM_MAX_FROM_INCLUDE: i64 = 0;\n\n        #[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n        #[allow(non_camel_case_types)]\n        pub const ENUM_VALUES_FROM_INCLUDE: [FromInclude; 1] = [\n            FromInclude::IncludeVal,\n        ];\n\n        #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n        #[repr(transparent)]\n        pub struct FromInclude(pub i64);\n\n        #[allow(non_upper_case_globals)]\n        impl FromInclude {\n            pub const IncludeVal: Self = Self(0);\n\n            pub const ENUM_MIN: i64 = 0;\n            pub const ENUM_MAX: i64 = 0;\n            pub const ENUM_VALUES: &'static [Self] = &[\n                Self::IncludeVal,\n            ];\n\n            /// Returns the variant's name or \"\" if unknown.\n            pub fn variant_name(self) -> Option<&'static str> {\n                match self {\n                    Self::IncludeVal => Some(\"IncludeVal\"),\n                    _ => None,\n                }\n            }\n        }\n\n        impl ::core::fmt::Debug for FromInclude {\n            fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n                if let Some(name) = self.variant_name() {\n                    f.write_str(name)\n                } else {\n                    f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n                }\n            }\n        }\n\n        impl<'a> ::flatbuffers::Follow<'a> for FromInclude {\n            type Inner = Self;\n\n            #[inline]\n            unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n                let b = unsafe { ::flatbuffers::read_scalar_at::<i64>(buf, loc) };\n                Self(b)\n            }\n        }\n\n        impl ::flatbuffers::Push for FromInclude {\n            type Output = FromInclude;\n\n            #[inline]\n            unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n                unsafe { ::flatbuffers::emplace_scalar::<i64>(dst, self.0) };\n            }\n        }\n\n        impl ::flatbuffers::EndianScalar for FromInclude {\n            type Scalar = i64;\n\n            #[inline]\n            fn to_little_endian(self) -> i64 {\n                self.0.to_le()\n            }\n\n            #[inline]\n            #[allow(clippy::wrong_self_convention)]\n            fn from_little_endian(v: i64) -> Self {\n                let b = i64::from_le(v);\n                Self(b)\n            }\n        }\n\n        impl<'a> ::flatbuffers::Verifiable for FromInclude {\n            #[inline]\n            fn run_verifier(\n                v: &mut ::flatbuffers::Verifier, pos: usize\n            ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n                i64::run_verifier(v, pos)\n            }\n        }\n\n        impl ::flatbuffers::SimpleToVerifyInSlice for FromInclude {}\n\n        // struct Unused, aligned to 4\n        #[repr(transparent)]\n        #[derive(Clone, Copy, PartialEq)]\n        pub struct Unused(pub [u8; 4]);\n\n        impl Default for Unused {\n            fn default() -> Self {\n                Self([0; 4])\n            }\n        }\n\n        impl ::core::fmt::Debug for Unused {\n            fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n                f.debug_struct(\"Unused\")\n                    .field(\"a\", &self.a())\n                    .finish()\n            }\n        }\n\n        impl ::flatbuffers::SimpleToVerifyInSlice for Unused {}\n\n        impl<'a> ::flatbuffers::Follow<'a> for Unused {\n            type Inner = &'a Unused;\n\n            #[inline]\n            unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n                unsafe { <&'a Unused>::follow(buf, loc) }\n            }\n        }\n\n        impl<'a> ::flatbuffers::Follow<'a> for &'a Unused {\n            type Inner = &'a Unused;\n\n            #[inline]\n            unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n                unsafe { ::flatbuffers::follow_cast_ref::<Unused>(buf, loc) }\n            }\n        }\n\n        impl<'b> ::flatbuffers::Push for Unused {\n            type Output = Unused;\n\n            #[inline]\n            unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n                let src = unsafe { ::core::slice::from_raw_parts(self as *const Unused as *const u8, <Self as ::flatbuffers::Push>::size()) };\n                dst.copy_from_slice(src);\n            }\n\n            #[inline]\n            fn alignment() -> ::flatbuffers::PushAlignment {\n                ::flatbuffers::PushAlignment::new(4)\n            }\n        }\n\n        impl<'a> ::flatbuffers::Verifiable for Unused {\n            #[inline]\n            fn run_verifier(\n                v: &mut ::flatbuffers::Verifier, pos: usize\n            ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n                v.in_buffer::<Self>(pos)\n            }\n        }\n\n        impl<'a> Unused {\n            #[allow(clippy::too_many_arguments)]\n            pub fn new(\n                a: i32,\n            ) -> Self {\n                let mut s = Self([0; 4]);\n                s.set_a(a);\n                s\n            }\n\n            pub const fn get_fully_qualified_name() -> &'static str {\n                \"MyGame.OtherNameSpace.Unused\"\n            }\n\n            pub fn a(&self) -> i32 {\n                let mut mem = ::core::mem::MaybeUninit::<<i32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid value in this slot\n                ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n                    ::core::ptr::copy_nonoverlapping(\n                        self.0[0..].as_ptr(),\n                        mem.as_mut_ptr() as *mut u8,\n                        ::core::mem::size_of::<<i32 as ::flatbuffers::EndianScalar>::Scalar>(),\n                    );\n                    mem.assume_init()\n                })\n            }\n\n            pub fn set_a(&mut self, x: i32) {\n                let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid value in this slot\n                unsafe {\n                    ::core::ptr::copy_nonoverlapping(\n                        &x_le as *const _ as *const u8,\n                        self.0[0..].as_mut_ptr(),\n                        ::core::mem::size_of::<<i32 as ::flatbuffers::EndianScalar>::Scalar>(),\n                    );\n                }\n            }\n\n            pub fn unpack(&self) -> UnusedT {\n                UnusedT {\n                    a: self.a(),\n                }\n            }\n        }\n\n        #[derive(Debug, Clone, PartialEq)]\n        pub struct UnusedT {\n            pub a: i32,\n        }\n        impl Default for UnusedT {\n            fn default() -> Self {\n                Self {\n                    a: 0,\n                }\n            }\n        }\n\n        impl UnusedT {\n            pub fn pack(&self) -> Unused {\n                Unused::new(\n                    self.a,\n                )\n            }\n        }\n\n        pub enum TableBOffset {}\n\n        #[derive(Copy, Clone, PartialEq)]\n        pub struct TableB<'a> {\n            pub _tab: ::flatbuffers::Table<'a>,\n        }\n\n        impl<'a> ::flatbuffers::Follow<'a> for TableB<'a> {\n            type Inner = TableB<'a>;\n\n            #[inline]\n            unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n                Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n            }\n        }\n\n        impl<'a> TableB<'a> {\n            pub const VT_A: ::flatbuffers::VOffsetT = 4;\n\n            pub const fn get_fully_qualified_name() -> &'static str {\n                \"MyGame.OtherNameSpace.TableB\"\n            }\n\n            #[inline]\n            pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n                TableB { _tab: table }\n            }\n\n            #[allow(unused_mut)]\n            pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n                _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n                args: &'args TableBArgs<'args>\n            ) -> ::flatbuffers::WIPOffset<TableB<'bldr>> {\n                let mut builder = TableBBuilder::new(_fbb);\n                if let Some(x) = args.a { builder.add_a(x); }\n                builder.finish()\n            }\n\n            pub fn unpack(&self) -> TableBT {\n                let a = self.a().map(|x| {\n                    alloc::boxed::Box::new(x.unpack())\n                });\n                TableBT {\n                    a,\n                }\n            }\n\n            #[inline]\n            pub fn a(&self) -> Option<super::super::TableA<'a>> {\n                // Safety:\n                // Created from valid Table for this object\n                // which contains a valid value in this slot\n                unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<super::super::TableA>>(TableB::VT_A, None)}\n            }\n        }\n\n        impl ::flatbuffers::Verifiable for TableB<'_> {\n            #[inline]\n            fn run_verifier(\n                v: &mut ::flatbuffers::Verifier, pos: usize\n            ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n                v.visit_table(pos)?\n                    .visit_field::<::flatbuffers::ForwardsUOffset<super::super::TableA>>(\"a\", Self::VT_A, false)?\n                    .finish();\n                Ok(())\n            }\n        }\n\n        pub struct TableBArgs<'a> {\n            pub a: Option<::flatbuffers::WIPOffset<super::super::TableA<'a>>>,\n        }\n\n        impl<'a> Default for TableBArgs<'a> {\n            #[inline]\n            fn default() -> Self {\n                TableBArgs {\n                    a: None,\n                }\n            }\n        }\n\n        pub struct TableBBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n            fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n            start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n        }\n\n        impl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> TableBBuilder<'a, 'b, A> {\n            #[inline]\n            pub fn add_a(&mut self, a: ::flatbuffers::WIPOffset<super::super::TableA<'b >>) {\n                self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<super::super::TableA>>(TableB::VT_A, a);\n            }\n\n            #[inline]\n            pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> TableBBuilder<'a, 'b, A> {\n                let start = _fbb.start_table();\n                TableBBuilder {\n                    fbb_: _fbb,\n                    start_: start,\n                }\n            }\n\n            #[inline]\n            pub fn finish(self) -> ::flatbuffers::WIPOffset<TableB<'a>> {\n                let o = self.fbb_.end_table(self.start_);\n                ::flatbuffers::WIPOffset::new(o.value())\n            }\n        }\n\n        impl ::core::fmt::Debug for TableB<'_> {\n            fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n                let mut ds = f.debug_struct(\"TableB\");\n                ds.field(\"a\", &self.a());\n                ds.finish()\n            }\n        }\n\n        #[non_exhaustive]\n        #[derive(Debug, Clone, PartialEq)]\n        pub struct TableBT {\n            pub a: Option<alloc::boxed::Box<super::super::TableAT>>,\n        }\n\n        impl Default for TableBT {\n            fn default() -> Self {\n                Self {\n                    a: None,\n                }\n            }\n        }\n\n        impl TableBT {\n            pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n                &self,\n                _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n            ) -> ::flatbuffers::WIPOffset<TableB<'b>> {\n                let a = self.a.as_ref().map(|x|{\n                    x.pack(_fbb)\n                });\n                TableB::create(_fbb, &TableBArgs{\n                    a,\n                })\n            }\n        }\n    } // pub mod OtherNameSpace\n} // pub mod MyGame\n"
  },
  {
    "path": "tests/include_test2_my_game.other_name_space_generated.dart",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable, constant_identifier_names\n\nlibrary my_game.other_name_space;\n\nimport 'dart:typed_data' show Uint8List;\nimport 'package:flat_buffers/flat_buffers.dart' as fb;\n\n\nimport './include_test1_generated.dart';\n\nenum FromInclude {\n  IncludeVal(0);\n\n  final int value;\n  const FromInclude(this.value);\n\n  factory FromInclude.fromValue(int value) {\n    switch (value) {\n      case 0: return FromInclude.IncludeVal;\n      default: throw StateError('Invalid value $value for bit flag enum');\n    }\n  }\n\n  static FromInclude? _createOrNull(int? value) =>\n      value == null ? null : FromInclude.fromValue(value);\n\n  static const int minValue = 0;\n  static const int maxValue = 0;\n  static const fb.Reader<FromInclude> reader = _FromIncludeReader();\n}\n\nclass _FromIncludeReader extends fb.Reader<FromInclude> {\n  const _FromIncludeReader();\n\n  @override\n  int get size => 8;\n\n  @override\n  FromInclude read(fb.BufferContext bc, int offset) =>\n      FromInclude.fromValue(const fb.Int64Reader().read(bc, offset));\n}\n\nclass Unused {\n  Unused._(this._bc, this._bcOffset);\n\n  static const fb.Reader<Unused> reader = _UnusedReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  int get a => const fb.Int32Reader().read(_bc, _bcOffset + 0);\n\n  @override\n  String toString() {\n    return 'Unused{a: ${a}}';\n  }\n\n  UnusedT unpack() => UnusedT(\n      a: a);\n\n  static int pack(fb.Builder fbBuilder, UnusedT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass UnusedT implements fb.Packable {\n  int a;\n\n  UnusedT({\n      required this.a});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    fbBuilder.putInt32(a);\n    return fbBuilder.offset;\n  }\n\n  @override\n  String toString() {\n    return 'UnusedT{a: ${a}}';\n  }\n}\n\nclass _UnusedReader extends fb.StructReader<Unused> {\n  const _UnusedReader();\n\n  @override\n  int get size => 4;\n\n  @override\n  Unused createObject(fb.BufferContext bc, int offset) => \n    Unused._(bc, offset);\n}\n\nclass UnusedBuilder {\n  UnusedBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  int finish(int a) {\n    fbBuilder.putInt32(a);\n    return fbBuilder.offset;\n  }\n\n}\n\nclass UnusedObjectBuilder extends fb.ObjectBuilder {\n  final int _a;\n\n  UnusedObjectBuilder({\n    required int a,\n  })\n      : _a = a;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    fbBuilder.putInt32(_a);\n    return fbBuilder.offset;\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\nclass TableB {\n  TableB._(this._bc, this._bcOffset);\n  factory TableB(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<TableB> reader = _TableBReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  TableA? get a => TableA.reader.vTableGetNullable(_bc, _bcOffset, 4);\n\n  @override\n  String toString() {\n    return 'TableB{a: ${a}}';\n  }\n\n  TableBT unpack() => TableBT(\n      a: a?.unpack());\n\n  static int pack(fb.Builder fbBuilder, TableBT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass TableBT implements fb.Packable {\n  TableAT? a;\n\n  TableBT({\n      this.a});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    final int? aOffset = a?.pack(fbBuilder);\n    fbBuilder.startTable(1);\n    fbBuilder.addOffset(0, aOffset);\n    return fbBuilder.endTable();\n  }\n\n  @override\n  String toString() {\n    return 'TableBT{a: ${a}}';\n  }\n}\n\nclass _TableBReader extends fb.TableReader<TableB> {\n  const _TableBReader();\n\n  @override\n  TableB createObject(fb.BufferContext bc, int offset) => \n    TableB._(bc, offset);\n}\n\nclass TableBBuilder {\n  TableBBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  void begin() {\n    fbBuilder.startTable(1);\n  }\n\n  int addAOffset(int? offset) {\n    fbBuilder.addOffset(0, offset);\n    return fbBuilder.offset;\n  }\n\n  int finish() {\n    return fbBuilder.endTable();\n  }\n}\n\nclass TableBObjectBuilder extends fb.ObjectBuilder {\n  final TableAObjectBuilder? _a;\n\n  TableBObjectBuilder({\n    TableAObjectBuilder? a,\n  })\n      : _a = a;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    final int? aOffset = _a?.getOrCreateOffset(fbBuilder);\n    fbBuilder.startTable(1);\n    fbBuilder.addOffset(0, aOffset);\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n"
  },
  {
    "path": "tests/included_test.fbs",
    "content": "table Wrapped {\n  a:double;\n}\n"
  },
  {
    "path": "tests/includer_test.fbs",
    "content": "include \"tests/included_test.fbs\";\n\ntable Wrapper {\n  a:Wrapped;\n}\n"
  },
  {
    "path": "tests/is_quiet_nan.h",
    "content": "#ifndef TESTS_IS_QUIET_NAN_H\n#define TESTS_IS_QUIET_NAN_H\n\nnamespace flatbuffers {\nnamespace tests {\n\n#if defined(FLATBUFFERS_HAS_NEW_STRTOD) && (FLATBUFFERS_HAS_NEW_STRTOD > 0)\n// The IEEE-754 quiet_NaN is not simple binary constant.\n// All binary NaN bit strings have all the bits of the biased exponent field E\n// set to 1. A quiet NaN bit string should be encoded with the first bit d[1]\n// of the trailing significand field T being 1 (d[0] is implicit bit).\n// It is assumed that endianness of floating-point is same as integer.\ntemplate <typename T, typename U, U qnan_base>\nbool is_quiet_nan_impl(T v) {\n  static_assert(sizeof(T) == sizeof(U), \"unexpected\");\n  U b = 0;\n  std::memcpy(&b, &v, sizeof(T));\n  return ((b & qnan_base) == qnan_base);\n}\n#if defined(__mips__) || defined(__hppa__)\ninline bool is_quiet_nan(float v) {\n  return is_quiet_nan_impl<float, uint32_t, 0x7FC00000u>(v) ||\n         is_quiet_nan_impl<float, uint32_t, 0x7FBFFFFFu>(v);\n}\ninline bool is_quiet_nan(double v) {\n  return is_quiet_nan_impl<double, uint64_t, 0x7FF8000000000000ul>(v) ||\n         is_quiet_nan_impl<double, uint64_t, 0x7FF7FFFFFFFFFFFFu>(v);\n}\n#else\ninline bool is_quiet_nan(float v) {\n  return is_quiet_nan_impl<float, uint32_t, 0x7FC00000u>(v);\n}\ninline bool is_quiet_nan(double v) {\n  return is_quiet_nan_impl<double, uint64_t, 0x7FF8000000000000ul>(v);\n}\n#endif\n#endif\n\n}  // namespace tests\n}  // namespace flatbuffers\n\n#endif  // TESTS_IS_QUIET_NAN_H\n"
  },
  {
    "path": "tests/json_test.cpp",
    "content": "#include \"json_test.h\"\n\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/idl.h\"\n#include \"monster_test_bfbs_generated.h\"\n#include \"monster_test_generated.h\"\n#include \"optional_scalars_generated.h\"\n#include \"test_assert.h\"\n\nnamespace flatbuffers {\nnamespace tests {\n\nusing namespace MyGame::Example;\n\n// Check stringify of an default enum value to json\nvoid JsonDefaultTest(const std::string& tests_data_path) {\n  // load FlatBuffer schema (.fbs) from disk\n  std::string schemafile;\n  TEST_EQ(flatbuffers::LoadFile((tests_data_path + \"monster_test.fbs\").c_str(),\n                                false, &schemafile),\n          true);\n  // parse schema first, so we can use it to parse the data after\n  flatbuffers::Parser parser;\n  auto include_test_path =\n      flatbuffers::ConCatPathFileName(tests_data_path, \"include_test\");\n  const char* include_directories[] = {tests_data_path.c_str(),\n                                       include_test_path.c_str(), nullptr};\n\n  TEST_EQ(parser.Parse(schemafile.c_str(), include_directories), true);\n  // create incomplete monster and store to json\n  parser.opts.output_default_scalars_in_json = true;\n  parser.opts.output_enum_identifiers = true;\n  flatbuffers::FlatBufferBuilder builder;\n  auto name = builder.CreateString(\"default_enum\");\n  MonsterBuilder color_monster(builder);\n  color_monster.add_name(name);\n  FinishMonsterBuffer(builder, color_monster.Finish());\n  std::string jsongen;\n  auto result = GenText(parser, builder.GetBufferPointer(), &jsongen);\n  TEST_NULL(result);\n  // default value of the \"color\" field is Blue\n  TEST_EQ(std::string::npos != jsongen.find(\"color: \\\"Blue\\\"\"), true);\n  // default value of the \"testf\" field is 3.14159\n  TEST_EQ(std::string::npos != jsongen.find(\"testf: 3.14159\"), true);\n}\n\nvoid JsonEnumsTest(const std::string& tests_data_path) {\n  // load FlatBuffer schema (.fbs) from disk\n  std::string schemafile;\n  TEST_EQ(flatbuffers::LoadFile((tests_data_path + \"monster_test.fbs\").c_str(),\n                                false, &schemafile),\n          true);\n  // parse schema first, so we can use it to parse the data after\n  flatbuffers::Parser parser;\n  auto include_test_path =\n      flatbuffers::ConCatPathFileName(tests_data_path, \"include_test\");\n  const char* include_directories[] = {tests_data_path.c_str(),\n                                       include_test_path.c_str(), nullptr};\n  parser.opts.output_enum_identifiers = true;\n  TEST_EQ(parser.Parse(schemafile.c_str(), include_directories), true);\n  flatbuffers::FlatBufferBuilder builder;\n  auto name = builder.CreateString(\"bitflag_enum\");\n  MonsterBuilder color_monster(builder);\n  color_monster.add_name(name);\n  color_monster.add_color(Color(Color_Blue | Color_Red));\n  FinishMonsterBuffer(builder, color_monster.Finish());\n  std::string jsongen;\n  auto result = GenText(parser, builder.GetBufferPointer(), &jsongen);\n  TEST_NULL(result);\n  TEST_EQ(std::string::npos != jsongen.find(\"color: \\\"Red Blue\\\"\"), true);\n  // Test forward compatibility with 'output_enum_identifiers = true'.\n  // Current Color doesn't have '(1u << 2)' field, let's add it.\n  builder.Clear();\n  std::string future_json;\n  auto future_name = builder.CreateString(\"future bitflag_enum\");\n  MonsterBuilder future_color(builder);\n  future_color.add_name(future_name);\n  future_color.add_color(\n      static_cast<Color>((1u << 2) | Color_Blue | Color_Red));\n  FinishMonsterBuffer(builder, future_color.Finish());\n  result = GenText(parser, builder.GetBufferPointer(), &future_json);\n  TEST_NULL(result);\n  TEST_EQ(std::string::npos != future_json.find(\"color: 13\"), true);\n}\n\nvoid JsonOptionalTest(const std::string& tests_data_path,\n                      bool default_scalars) {\n  // load FlatBuffer schema (.fbs) and JSON from disk\n  std::string schemafile;\n  std::string jsonfile;\n  TEST_EQ(\n      flatbuffers::LoadFile((tests_data_path + \"optional_scalars.fbs\").c_str(),\n                            false, &schemafile),\n      true);\n  TEST_EQ(flatbuffers::LoadFile((tests_data_path + \"optional_scalars\" +\n                                 (default_scalars ? \"_defaults\" : \"\") + \".json\")\n                                    .c_str(),\n                                false, &jsonfile),\n          true);\n\n  auto include_test_path =\n      flatbuffers::ConCatPathFileName(tests_data_path, \"include_test\");\n  const char* include_directories[] = {tests_data_path.c_str(),\n                                       include_test_path.c_str(), nullptr};\n\n  // parse schema first, so we can use it to parse the data after\n  flatbuffers::Parser parser;\n  parser.opts.output_default_scalars_in_json = default_scalars;\n  TEST_EQ(parser.Parse(schemafile.c_str(), include_directories), true);\n  TEST_EQ(parser.ParseJson(jsonfile.c_str()), true);\n\n  // here, parser.builder_ contains a binary buffer that is the parsed data.\n\n  // First, verify it, just in case:\n  flatbuffers::Verifier verifier(parser.builder_.GetBufferPointer(),\n                                 parser.builder_.GetSize());\n  TEST_EQ(optional_scalars::VerifyScalarStuffBuffer(verifier), true);\n\n  // to ensure it is correct, we now generate text back from the binary,\n  // and compare the two:\n  std::string jsongen;\n  auto result = GenText(parser, parser.builder_.GetBufferPointer(), &jsongen);\n  TEST_NULL(result);\n  TEST_EQ_STR(jsongen.c_str(), jsonfile.c_str());\n}\n\nvoid ParseIncorrectMonsterJsonTest(const std::string& tests_data_path) {\n  std::string schemafile;\n  TEST_EQ(flatbuffers::LoadFile((tests_data_path + \"monster_test.bfbs\").c_str(),\n                                true, &schemafile),\n          true);\n  flatbuffers::Parser parser;\n  flatbuffers::Verifier verifier(\n      reinterpret_cast<const uint8_t*>(schemafile.c_str()), schemafile.size());\n  TEST_EQ(reflection::VerifySchemaBuffer(verifier), true);\n  TEST_EQ(\n      parser.Deserialize(reinterpret_cast<const uint8_t*>(schemafile.c_str()),\n                         schemafile.size()),\n      true);\n  TEST_EQ(parser.ParseJson(\"{name:\\\"monster\\\"}\"), true);\n  TEST_EQ(parser.ParseJson(\"\"), false);\n  TEST_EQ(parser.ParseJson(\"{name: 1}\"), false);\n  TEST_EQ(parser.ParseJson(\"{name:+1}\"), false);\n  TEST_EQ(parser.ParseJson(\"{name:-1}\"), false);\n  TEST_EQ(parser.ParseJson(\"{name:-f}\"), false);\n  TEST_EQ(parser.ParseJson(\"{name:+f}\"), false);\n}\n\nvoid JsonUnsortedArrayTest() {\n  flatbuffers::Parser parser;\n  TEST_EQ(parser.Deserialize(MyGame::Example::MonsterBinarySchema::data(),\n                             MyGame::Example::MonsterBinarySchema::size()),\n          true);\n  auto jsonStr = R\"(\n  {\n    \"name\": \"lookupTest\",\n    \"testarrayoftables\": [\n      { \"name\": \"aaa\" },\n      { \"name\": \"ccc\" },\n      { \"name\": \"bbb\" }\n    ]\n  }\n  )\";\n  TEST_EQ(parser.ParseJson(jsonStr), true);\n  auto monster = flatbuffers::GetRoot<MyGame::Example::Monster>(\n      parser.builder_.GetBufferPointer());\n\n  TEST_NOTNULL(monster->testarrayoftables()->LookupByKey(\"aaa\"));\n  TEST_NOTNULL(monster->testarrayoftables()->LookupByKey(\"bbb\"));\n  TEST_NOTNULL(monster->testarrayoftables()->LookupByKey(\"ccc\"));\n}\n\nvoid JsonUnionStructTest() {\n  // schema to parse data\n  auto schema = R\"(\nstruct MyStruct { field: int; }\nunion UnionWithStruct { MyStruct }\ntable JsonUnionStructTest { union_with_struct: UnionWithStruct; }\nroot_type JsonUnionStructTest;\n)\";\n  // source text to parse and expected result of generation text back\n  auto json_source = R\"({\n  union_with_struct_type: \"MyStruct\",\n  union_with_struct: {\n    field: 12345\n  }\n}\n)\";\n\n  flatbuffers::Parser parser;\n  // set output language to JSON, so we assure that is supported\n  parser.opts.lang_to_generate = IDLOptions::kJson;\n  // parse schema first, so we assure that output language is supported\n  // and can use it to parse the data after\n  TEST_EQ(true, parser.Parse(schema));\n  TEST_EQ(true, parser.ParseJson(json_source));\n\n  // now generate text back from the binary, and compare the two:\n  std::string json_generated;\n  auto generate_result =\n      GenText(parser, parser.builder_.GetBufferPointer(), &json_generated);\n  TEST_NULL(generate_result);\n  TEST_EQ_STR(json_source, json_generated.c_str());\n}\n\n}  // namespace tests\n}  // namespace flatbuffers\n"
  },
  {
    "path": "tests/json_test.h",
    "content": "#ifndef TESTS_JSON_TEST_H\n#define TESTS_JSON_TEST_H\n\n#include <string>\n\nnamespace flatbuffers {\nnamespace tests {\n\nvoid JsonDefaultTest(const std::string& tests_data_path);\nvoid JsonEnumsTest(const std::string& tests_data_path);\nvoid JsonOptionalTest(const std::string& tests_data_path, bool default_scalars);\nvoid ParseIncorrectMonsterJsonTest(const std::string& tests_data_path);\nvoid JsonUnsortedArrayTest();\nvoid JsonUnionStructTest();\n\n}  // namespace tests\n}  // namespace flatbuffers\n\n#endif\n"
  },
  {
    "path": "tests/key_field/key_field_sample.fbs",
    "content": "namespace keyfield.sample;\n\nstruct Baz {\n  a: [uint8:4] (key); // A fixed-sized array of uint8 as a Key\n  b: uint8 ;\n}\n\nstruct Bar {\n  a: [float:3] (key); // A fixed-sized array of float as a Key\n  b: uint8;\n}\n\nstruct Color {\n  rgb: [float:3] (key);\n  tag: uint8;\n}\n\nstruct Apple {\n  tag: uint8;\n  color: Color(key);\n}\n\nstruct Fruit {\n  a: Apple (key);\n  b: uint8;\n}\n\nstruct Rice {\n  origin: [uint8:3];\n  quantity: uint32;\n}\n\nstruct Grain {\n  a: [Rice:3] (key);\n  tag: uint8;\n}\n\ntable FooTable {\n  a: int;\n  b: int;\n  c: string (key);\n  d: [Baz];\n  e: [Bar];\n  f: [Apple];\n  g: [Fruit];\n  h: [Grain];\n}\nroot_type FooTable;\n\n"
  },
  {
    "path": "tests/key_field_test.cpp",
    "content": "#include \"key_field_test.h\"\n\n#include <iostream>\n\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/idl.h\"\n#include \"key_field/key_field_sample_generated.h\"\n#include \"test_assert.h\"\n\nnamespace flatbuffers {\nnamespace tests {\n\nusing namespace keyfield::sample;\n\nvoid FixedSizedScalarKeyInStructTest() {\n  flatbuffers::FlatBufferBuilder fbb;\n  std::vector<Baz> bazs;\n  uint8_t test_array1[4] = {8, 2, 3, 0};\n  uint8_t test_array2[4] = {1, 2, 3, 4};\n  uint8_t test_array3[4] = {2, 2, 3, 4};\n  uint8_t test_array4[4] = {3, 2, 3, 4};\n  bazs.push_back(Baz(flatbuffers::make_span(test_array1), 4));\n  bazs.push_back(Baz(flatbuffers::make_span(test_array2), 1));\n  bazs.push_back(Baz(flatbuffers::make_span(test_array3), 2));\n  bazs.push_back(Baz(flatbuffers::make_span(test_array4), 3));\n  auto baz_vec = fbb.CreateVectorOfSortedStructs(&bazs);\n\n  auto test_string = fbb.CreateString(\"TEST\");\n\n  float test_float_array1[3] = {1.5, 2.5, 0};\n  float test_float_array2[3] = {7.5, 2.5, 0};\n  float test_float_array3[3] = {1.5, 2.5, -1};\n  float test_float_array4[3] = {-1.5, 2.5, 0};\n  std::vector<Bar> bars;\n  bars.push_back(Bar(flatbuffers::make_span(test_float_array1), 3));\n  bars.push_back(Bar(flatbuffers::make_span(test_float_array2), 4));\n  bars.push_back(Bar(flatbuffers::make_span(test_float_array3), 2));\n  bars.push_back(Bar(flatbuffers::make_span(test_float_array4), 1));\n  auto bar_vec = fbb.CreateVectorOfSortedStructs(&bars);\n\n  auto t = CreateFooTable(fbb, 1, 2, test_string, baz_vec, bar_vec);\n\n  fbb.Finish(t);\n\n  uint8_t* buf = fbb.GetBufferPointer();\n  auto foo_table = GetFooTable(buf);\n\n  auto sorted_baz_vec = foo_table->d();\n  TEST_EQ(sorted_baz_vec->Get(0)->b(), 1);\n  TEST_EQ(sorted_baz_vec->Get(3)->b(), 4);\n\n  uint8_t test_array[4];\n  auto* key_array = &flatbuffers::CastToArray(test_array);\n  key_array->CopyFromSpan(flatbuffers::make_span(test_array1));\n\n  TEST_NOTNULL(sorted_baz_vec->LookupByKey(key_array));\n  TEST_EQ(sorted_baz_vec->LookupByKey(key_array)->b(), 4);\n  uint8_t array_int[4] = {7, 2, 3, 0};\n  key_array->CopyFromSpan(flatbuffers::make_span(array_int));\n  TEST_EQ(sorted_baz_vec->LookupByKey(key_array),\n          static_cast<const Baz*>(nullptr));\n\n  auto sorted_bar_vec = foo_table->e();\n  TEST_EQ(sorted_bar_vec->Get(0)->b(), 1);\n  TEST_EQ(sorted_bar_vec->Get(3)->b(), 4);\n\n  float test_float_array[3];\n  auto* key_float_array = &flatbuffers::CastToArray(test_float_array);\n  key_float_array->CopyFromSpan(flatbuffers::make_span(test_float_array1));\n  TEST_NOTNULL(sorted_bar_vec->LookupByKey(key_float_array));\n  TEST_EQ(sorted_bar_vec->LookupByKey(key_float_array)->b(), 3);\n  float array_float[3] = {-1, -2, -3};\n  key_float_array->CopyFromSpan(flatbuffers::make_span(array_float));\n  TEST_EQ(sorted_bar_vec->LookupByKey(key_float_array),\n          static_cast<const Bar*>(nullptr));\n}\n\nvoid StructKeyInStructTest() {\n  flatbuffers::FlatBufferBuilder fbb;\n  std::vector<Apple> apples;\n  float test_float_array1[3] = {1.5, 2.5, 0};\n  float test_float_array2[3] = {7.5, 2.5, 0};\n  float test_float_array3[3] = {1.5, 2.5, -1};\n  apples.push_back(\n      Apple(2, Color(flatbuffers::make_span(test_float_array1), 3)));\n  apples.push_back(\n      Apple(3, Color(flatbuffers::make_span(test_float_array2), 3)));\n  apples.push_back(\n      Apple(1, Color(flatbuffers::make_span(test_float_array3), 1)));\n\n  auto apples_vec = fbb.CreateVectorOfSortedStructs(&apples);\n  auto test_string = fbb.CreateString(\"TEST\");\n\n  FooTableBuilder foo_builder(fbb);\n  foo_builder.add_a(1);\n  foo_builder.add_c(test_string);\n\n  foo_builder.add_f(apples_vec);\n\n  auto orc = foo_builder.Finish();\n  fbb.Finish(orc);\n\n  uint8_t* buf = fbb.GetBufferPointer();\n  auto foo_table = GetFooTable(buf);\n\n  auto sorted_apple_vec = foo_table->f();\n  TEST_EQ(sorted_apple_vec->Get(0)->tag(), 1);\n  TEST_EQ(sorted_apple_vec->Get(1)->tag(), 2);\n  TEST_EQ(sorted_apple_vec->Get(2)->tag(), 3);\n  TEST_EQ(sorted_apple_vec\n              ->LookupByKey(Color(flatbuffers::make_span(test_float_array1), 3))\n              ->tag(),\n          2);\n  TEST_EQ(sorted_apple_vec->LookupByKey(\n              Color(flatbuffers::make_span(test_float_array1), 0)),\n          static_cast<const Apple*>(nullptr));\n}\n\nvoid NestedStructKeyInStructTest() {\n  flatbuffers::FlatBufferBuilder fbb;\n  std::vector<Fruit> fruits;\n  float test_float_array1[3] = {1.5, 2.5, 0};\n  float test_float_array2[3] = {1.5, 2.5, 0};\n  float test_float_array3[3] = {1.5, 2.5, -1};\n\n  fruits.push_back(\n      Fruit(Apple(2, Color(flatbuffers::make_span(test_float_array1), 2)), 2));\n  fruits.push_back(\n      Fruit(Apple(2, Color(flatbuffers::make_span(test_float_array2), 1)), 1));\n  fruits.push_back(\n      Fruit(Apple(2, Color(flatbuffers::make_span(test_float_array3), 3)), 3));\n\n  auto test_string = fbb.CreateString(\"TEST\");\n  auto fruits_vec = fbb.CreateVectorOfSortedStructs(&fruits);\n\n  FooTableBuilder foo_builder(fbb);\n  foo_builder.add_a(1);\n  foo_builder.add_c(test_string);\n  foo_builder.add_g(fruits_vec);\n\n  auto orc = foo_builder.Finish();\n  fbb.Finish(orc);\n  uint8_t* buf = fbb.GetBufferPointer();\n  auto foo_table = GetFooTable(buf);\n\n  auto sorted_fruit_vec = foo_table->g();\n  TEST_EQ(sorted_fruit_vec->Get(0)->b(), 3);\n  TEST_EQ(sorted_fruit_vec->Get(1)->b(), 1);\n  TEST_EQ(sorted_fruit_vec->Get(2)->b(), 2);\n  TEST_EQ(sorted_fruit_vec\n              ->LookupByKey(\n                  Apple(2, Color(flatbuffers::make_span(test_float_array2), 1)))\n              ->b(),\n          1);\n  TEST_EQ(sorted_fruit_vec->LookupByKey(\n              Apple(1, Color(flatbuffers::make_span(test_float_array2), 1))),\n          static_cast<const Fruit*>(nullptr));\n}\n\nvoid FixedSizedStructArrayKeyInStructTest() {\n  flatbuffers::FlatBufferBuilder fbb;\n  std::vector<Grain> grains;\n  uint8_t test_char_array1[3] = {'u', 's', 'a'};\n  uint8_t test_char_array2[3] = {'c', 'h', 'n'};\n  uint8_t test_char_array3[3] = {'c', 'h', 'l'};\n  uint8_t test_char_array4[3] = {'f', 'r', 'a'};\n  uint8_t test_char_array5[3] = {'i', 'n', 'd'};\n  uint8_t test_char_array6[3] = {'i', 't', 'a'};\n\n  Rice test_rice_array1[3] = {\n      Rice(flatbuffers::make_span(test_char_array1), 2),\n      Rice(flatbuffers::make_span(test_char_array2), 1),\n      Rice(flatbuffers::make_span(test_char_array3), 2)};\n  Rice test_rice_array2[3] = {\n      Rice(flatbuffers::make_span(test_char_array4), 2),\n      Rice(flatbuffers::make_span(test_char_array5), 1),\n      Rice(flatbuffers::make_span(test_char_array6), 2)};\n  Rice test_rice_array3[3] = {\n      Rice(flatbuffers::make_span(test_char_array4), 2),\n      Rice(flatbuffers::make_span(test_char_array6), 1),\n      Rice(flatbuffers::make_span(test_char_array1), 2)};\n\n  grains.push_back(Grain(flatbuffers::make_span(test_rice_array1), 3));\n  grains.push_back(Grain(flatbuffers::make_span(test_rice_array2), 1));\n  grains.push_back(Grain(flatbuffers::make_span(test_rice_array3), 2));\n\n  auto test_string = fbb.CreateString(\"TEST\");\n  auto grains_vec = fbb.CreateVectorOfSortedStructs(&grains);\n  FooTableBuilder foo_builder(fbb);\n  foo_builder.add_a(1);\n  foo_builder.add_c(test_string);\n  foo_builder.add_h(grains_vec);\n\n  auto orc = foo_builder.Finish();\n  fbb.Finish(orc);\n  uint8_t* buf = fbb.GetBufferPointer();\n  auto foo_table = GetFooTable(buf);\n\n  auto sorted_grain_vec = foo_table->h();\n  TEST_EQ(sorted_grain_vec->Get(0)->tag(), 1);\n  TEST_EQ(sorted_grain_vec->Get(1)->tag(), 2);\n  TEST_EQ(sorted_grain_vec->Get(2)->tag(), 3);\n  TEST_EQ(\n      sorted_grain_vec->LookupByKey(&flatbuffers::CastToArray(test_rice_array1))\n          ->tag(),\n      3);\n  Rice test_rice_array[3] = {Rice(flatbuffers::make_span(test_char_array3), 2),\n                             Rice(flatbuffers::make_span(test_char_array2), 1),\n                             Rice(flatbuffers::make_span(test_char_array1), 2)};\n  TEST_EQ(\n      sorted_grain_vec->LookupByKey(&flatbuffers::CastToArray(test_rice_array)),\n      static_cast<const Grain*>(nullptr));\n  TEST_EQ(\n      sorted_grain_vec->LookupByKey(&flatbuffers::CastToArray(test_rice_array1))\n          ->tag(),\n      3);\n}\n\n}  // namespace tests\n}  // namespace flatbuffers\n"
  },
  {
    "path": "tests/key_field_test.h",
    "content": "#ifndef TESTS_KEY_FIELD_TEST_H\n#define TESTS_KEY_FIELD_TEST_H\n\nnamespace flatbuffers {\nnamespace tests {\n\nvoid FixedSizedScalarKeyInStructTest();\nvoid StructKeyInStructTest();\nvoid NestedStructKeyInStructTest();\nvoid FixedSizedStructArrayKeyInStructTest();\n\n}  // namespace tests\n}  // namespace flatbuffers\n\n#endif\n"
  },
  {
    "path": "tests/keyword_test/keyword_test/abc_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MIN_ABC: i32 = 0;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MAX_ABC: i32 = 2;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n#[allow(non_camel_case_types)]\npub const ENUM_VALUES_ABC: [ABC; 3] = [\n    ABC::void,\n    ABC::where_,\n    ABC::stackalloc,\n];\n\n#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n#[repr(transparent)]\npub struct ABC(pub i32);\n\n#[allow(non_upper_case_globals)]\nimpl ABC {\n    pub const void: Self = Self(0);\n    pub const where_: Self = Self(1);\n    pub const stackalloc: Self = Self(2);\n\n    pub const ENUM_MIN: i32 = 0;\n    pub const ENUM_MAX: i32 = 2;\n    pub const ENUM_VALUES: &'static [Self] = &[\n        Self::void,\n        Self::where_,\n        Self::stackalloc,\n    ];\n\n    /// Returns the variant's name or \"\" if unknown.\n    pub fn variant_name(self) -> Option<&'static str> {\n        match self {\n            Self::void => Some(\"void\"),\n            Self::where_ => Some(\"where_\"),\n            Self::stackalloc => Some(\"stackalloc\"),\n            _ => None,\n        }\n    }\n}\n\nimpl ::core::fmt::Debug for ABC {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        if let Some(name) = self.variant_name() {\n            f.write_str(name)\n        } else {\n            f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n        }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for ABC {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<i32>(buf, loc) };\n        Self(b)\n    }\n}\n\nimpl ::flatbuffers::Push for ABC {\n    type Output = ABC;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<i32>(dst, self.0) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for ABC {\n    type Scalar = i32;\n\n    #[inline]\n    fn to_little_endian(self) -> i32 {\n        self.0.to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: i32) -> Self {\n        let b = i32::from_le(v);\n        Self(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for ABC {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        i32::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for ABC {}\n"
  },
  {
    "path": "tests/keyword_test/keyword_test/keywords_in_table_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum KeywordsInTableOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct KeywordsInTable<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for KeywordsInTable<'a> {\n    type Inner = KeywordsInTable<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> KeywordsInTable<'a> {\n    pub const VT_IS: ::flatbuffers::VOffsetT = 4;\n    pub const VT_PRIVATE: ::flatbuffers::VOffsetT = 6;\n    pub const VT_TYPE_: ::flatbuffers::VOffsetT = 8;\n    pub const VT_DEFAULT: ::flatbuffers::VOffsetT = 10;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"KeywordTest.KeywordsInTable\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        KeywordsInTable { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args KeywordsInTableArgs\n    ) -> ::flatbuffers::WIPOffset<KeywordsInTable<'bldr>> {\n        let mut builder = KeywordsInTableBuilder::new(_fbb);\n        builder.add_type_(args.type_);\n        builder.add_private(args.private);\n        builder.add_is(args.is);\n        builder.add_default(args.default);\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> KeywordsInTableT {\n        let is = self.is();\n        let private = self.private();\n        let type_ = self.type_();\n        let default = self.default();\n        KeywordsInTableT {\n            is,\n            private,\n            type_,\n            default,\n        }\n    }\n\n    #[inline]\n    pub fn is(&self) -> ABC {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<ABC>(KeywordsInTable::VT_IS, Some(ABC::void)).unwrap()}\n    }\n\n    #[inline]\n    pub fn private(&self) -> public {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<public>(KeywordsInTable::VT_PRIVATE, Some(public::NONE)).unwrap()}\n    }\n\n    #[inline]\n    pub fn type_(&self) -> i32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i32>(KeywordsInTable::VT_TYPE_, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn default(&self) -> bool {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<bool>(KeywordsInTable::VT_DEFAULT, Some(false)).unwrap()}\n    }\n}\n\nimpl ::flatbuffers::Verifiable for KeywordsInTable<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<ABC>(\"is\", Self::VT_IS, false)?\n            .visit_field::<public>(\"private\", Self::VT_PRIVATE, false)?\n            .visit_field::<i32>(\"type_\", Self::VT_TYPE_, false)?\n            .visit_field::<bool>(\"default\", Self::VT_DEFAULT, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct KeywordsInTableArgs {\n    pub is: ABC,\n    pub private: public,\n    pub type_: i32,\n    pub default: bool,\n}\n\nimpl<'a> Default for KeywordsInTableArgs {\n    #[inline]\n    fn default() -> Self {\n        KeywordsInTableArgs {\n            is: ABC::void,\n            private: public::NONE,\n            type_: 0,\n            default: false,\n        }\n    }\n}\n\npub struct KeywordsInTableBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> KeywordsInTableBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_is(&mut self, is: ABC) {\n        self.fbb_.push_slot::<ABC>(KeywordsInTable::VT_IS, is, ABC::void);\n    }\n\n    #[inline]\n    pub fn add_private(&mut self, private: public) {\n        self.fbb_.push_slot::<public>(KeywordsInTable::VT_PRIVATE, private, public::NONE);\n    }\n\n    #[inline]\n    pub fn add_type_(&mut self, type_: i32) {\n        self.fbb_.push_slot::<i32>(KeywordsInTable::VT_TYPE_, type_, 0);\n    }\n\n    #[inline]\n    pub fn add_default(&mut self, default: bool) {\n        self.fbb_.push_slot::<bool>(KeywordsInTable::VT_DEFAULT, default, false);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> KeywordsInTableBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        KeywordsInTableBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<KeywordsInTable<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for KeywordsInTable<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"KeywordsInTable\");\n        ds.field(\"is\", &self.is());\n        ds.field(\"private\", &self.private());\n        ds.field(\"type_\", &self.type_());\n        ds.field(\"default\", &self.default());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct KeywordsInTableT {\n    pub is: ABC,\n    pub private: public,\n    pub type_: i32,\n    pub default: bool,\n}\n\nimpl Default for KeywordsInTableT {\n    fn default() -> Self {\n        Self {\n            is: ABC::void,\n            private: public::NONE,\n            type_: 0,\n            default: false,\n        }\n    }\n}\n\nimpl KeywordsInTableT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<KeywordsInTable<'b>> {\n        let is = self.is;\n        let private = self.private;\n        let type_ = self.type_;\n        let default = self.default;\n        KeywordsInTable::create(_fbb, &KeywordsInTableArgs{\n            is,\n            private,\n            type_,\n            default,\n        })\n    }\n}\n"
  },
  {
    "path": "tests/keyword_test/keyword_test/keywords_in_union_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MIN_KEYWORDS_IN_UNION: u8 = 0;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MAX_KEYWORDS_IN_UNION: u8 = 2;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n#[allow(non_camel_case_types)]\npub const ENUM_VALUES_KEYWORDS_IN_UNION: [KeywordsInUnion; 3] = [\n    KeywordsInUnion::NONE,\n    KeywordsInUnion::static_,\n    KeywordsInUnion::internal,\n];\n\n#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n#[repr(transparent)]\npub struct KeywordsInUnion(pub u8);\n\n#[allow(non_upper_case_globals)]\nimpl KeywordsInUnion {\n    pub const NONE: Self = Self(0);\n    pub const static_: Self = Self(1);\n    pub const internal: Self = Self(2);\n\n    pub const ENUM_MIN: u8 = 0;\n    pub const ENUM_MAX: u8 = 2;\n    pub const ENUM_VALUES: &'static [Self] = &[\n        Self::NONE,\n        Self::static_,\n        Self::internal,\n    ];\n\n    /// Returns the variant's name or \"\" if unknown.\n    pub fn variant_name(self) -> Option<&'static str> {\n        match self {\n            Self::NONE => Some(\"NONE\"),\n            Self::static_ => Some(\"static_\"),\n            Self::internal => Some(\"internal\"),\n            _ => None,\n        }\n    }\n}\n\nimpl ::core::fmt::Debug for KeywordsInUnion {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        if let Some(name) = self.variant_name() {\n            f.write_str(name)\n        } else {\n            f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n        }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for KeywordsInUnion {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<u8>(buf, loc) };\n        Self(b)\n    }\n}\n\nimpl ::flatbuffers::Push for KeywordsInUnion {\n    type Output = KeywordsInUnion;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<u8>(dst, self.0) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for KeywordsInUnion {\n    type Scalar = u8;\n\n    #[inline]\n    fn to_little_endian(self) -> u8 {\n        self.0.to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: u8) -> Self {\n        let b = u8::from_le(v);\n        Self(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for KeywordsInUnion {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        u8::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for KeywordsInUnion {}\n\npub struct KeywordsInUnionUnionTableOffset {}\n\n#[allow(clippy::upper_case_acronyms)]\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub enum KeywordsInUnionT {\n    NONE,\n    Static_(alloc::boxed::Box<KeywordsInTableT>),\n    Internal(alloc::boxed::Box<KeywordsInTableT>),\n}\n\nimpl Default for KeywordsInUnionT {\n    fn default() -> Self {\n        Self::NONE\n    }\n}\n\nimpl KeywordsInUnionT {\n    pub fn keywords_in_union_type(&self) -> KeywordsInUnion {\n        match self {\n            Self::NONE => KeywordsInUnion::NONE,\n            Self::Static_(_) => KeywordsInUnion::static_,\n            Self::Internal(_) => KeywordsInUnion::internal,\n        }\n    }\n\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(&self, fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>) -> Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>> {\n        match self {\n            Self::NONE => None,\n            Self::Static_(v) => Some(v.pack(fbb).as_union_value()),\n            Self::Internal(v) => Some(v.pack(fbb).as_union_value()),\n        }\n    }\n\n    /// If the union variant matches, return the owned KeywordsInTableT, setting the union to NONE.\n    pub fn take_static_(&mut self) -> Option<alloc::boxed::Box<KeywordsInTableT>> {\n        if let Self::Static_(_) = self {\n            let v = ::core::mem::replace(self, Self::NONE);\n            if let Self::Static_(w) = v {\n                Some(w)\n            } else {\n                unreachable!()\n            }\n        } else {\n            None\n        }\n    }\n\n    /// If the union variant matches, return a reference to the KeywordsInTableT.\n    pub fn as_static_(&self) -> Option<&KeywordsInTableT> {\n        if let Self::Static_(v) = self { Some(v.as_ref()) } else { None }\n    }\n\n    /// If the union variant matches, return a mutable reference to the KeywordsInTableT.\n    pub fn as_static__mut(&mut self) -> Option<&mut KeywordsInTableT> {\n        if let Self::Static_(v) = self { Some(v.as_mut()) } else { None }\n    }\n\n    /// If the union variant matches, return the owned KeywordsInTableT, setting the union to NONE.\n    pub fn take_internal(&mut self) -> Option<alloc::boxed::Box<KeywordsInTableT>> {\n        if let Self::Internal(_) = self {\n            let v = ::core::mem::replace(self, Self::NONE);\n            if let Self::Internal(w) = v {\n                Some(w)\n            } else {\n                unreachable!()\n            }\n        } else {\n            None\n        }\n    }\n\n    /// If the union variant matches, return a reference to the KeywordsInTableT.\n    pub fn as_internal(&self) -> Option<&KeywordsInTableT> {\n        if let Self::Internal(v) = self { Some(v.as_ref()) } else { None }\n    }\n\n    /// If the union variant matches, return a mutable reference to the KeywordsInTableT.\n    pub fn as_internal_mut(&mut self) -> Option<&mut KeywordsInTableT> {\n        if let Self::Internal(v) = self { Some(v.as_mut()) } else { None }\n    }\n}\n\n"
  },
  {
    "path": "tests/keyword_test/keyword_test/public_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MIN_PUBLIC: i32 = 0;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MAX_PUBLIC: i32 = 0;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n#[allow(non_camel_case_types)]\npub const ENUM_VALUES_PUBLIC: [public; 1] = [\n    public::NONE,\n];\n\n#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n#[repr(transparent)]\npub struct public(pub i32);\n\n#[allow(non_upper_case_globals)]\nimpl public {\n    pub const NONE: Self = Self(0);\n\n    pub const ENUM_MIN: i32 = 0;\n    pub const ENUM_MAX: i32 = 0;\n    pub const ENUM_VALUES: &'static [Self] = &[\n        Self::NONE,\n    ];\n\n    /// Returns the variant's name or \"\" if unknown.\n    pub fn variant_name(self) -> Option<&'static str> {\n        match self {\n            Self::NONE => Some(\"NONE\"),\n            _ => None,\n        }\n    }\n}\n\nimpl ::core::fmt::Debug for public {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        if let Some(name) = self.variant_name() {\n            f.write_str(name)\n        } else {\n            f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n        }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for public {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<i32>(buf, loc) };\n        Self(b)\n    }\n}\n\nimpl ::flatbuffers::Push for public {\n    type Output = public;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<i32>(dst, self.0) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for public {\n    type Scalar = i32;\n\n    #[inline]\n    fn to_little_endian(self) -> i32 {\n        self.0.to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: i32) -> Self {\n        let b = i32::from_le(v);\n        Self(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for public {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        i32::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for public {}\n"
  },
  {
    "path": "tests/keyword_test/keyword_test/table_2_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum Table2Offset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct Table2<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Table2<'a> {\n    type Inner = Table2<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> Table2<'a> {\n    pub const VT_TYPE_TYPE: ::flatbuffers::VOffsetT = 4;\n    pub const VT_TYPE_: ::flatbuffers::VOffsetT = 6;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"KeywordTest.Table2\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        Table2 { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args Table2Args\n    ) -> ::flatbuffers::WIPOffset<Table2<'bldr>> {\n        let mut builder = Table2Builder::new(_fbb);\n        if let Some(x) = args.type_ { builder.add_type_(x); }\n        builder.add_type_type(args.type_type);\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> Table2T {\n        let type_ = match self.type_type() {\n            KeywordsInUnion::NONE => KeywordsInUnionT::NONE,\n            KeywordsInUnion::static_ => KeywordsInUnionT::Static_(alloc::boxed::Box::new(\n                self.type__as_static_()\n                    .expect(\"Invalid union table, expected `KeywordsInUnion::static_`.\")\n                    .unpack()\n            )),\n            KeywordsInUnion::internal => KeywordsInUnionT::Internal(alloc::boxed::Box::new(\n                self.type__as_internal()\n                    .expect(\"Invalid union table, expected `KeywordsInUnion::internal`.\")\n                    .unpack()\n            )),\n            _ => KeywordsInUnionT::NONE,\n        };\n        Table2T {\n            type_,\n        }\n    }\n\n    #[inline]\n    pub fn type_type(&self) -> KeywordsInUnion {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<KeywordsInUnion>(Table2::VT_TYPE_TYPE, Some(KeywordsInUnion::NONE)).unwrap()}\n    }\n\n    #[inline]\n    pub fn type_(&self) -> Option<::flatbuffers::Table<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Table<'a>>>(Table2::VT_TYPE_, None)}\n    }\n\n    #[inline]\n    #[allow(non_snake_case)]\n    pub fn type__as_static_(&self) -> Option<KeywordsInTable<'a>> {\n        if self.type_type() == KeywordsInUnion::static_ {\n            self.type_().map(|t| {\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid union in this slot\n                unsafe { KeywordsInTable::init_from_table(t) }\n            })\n        } else {\n            None\n        }\n    }\n\n    #[inline]\n    #[allow(non_snake_case)]\n    pub fn type__as_internal(&self) -> Option<KeywordsInTable<'a>> {\n        if self.type_type() == KeywordsInUnion::internal {\n            self.type_().map(|t| {\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid union in this slot\n                unsafe { KeywordsInTable::init_from_table(t) }\n            })\n        } else {\n            None\n        }\n    }\n}\n\nimpl ::flatbuffers::Verifiable for Table2<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_union::<KeywordsInUnion, _>(\"type_type\", Self::VT_TYPE_TYPE, \"type_\", Self::VT_TYPE_, false, |key, v, pos| {\n                match key {\n                    KeywordsInUnion::static_ => v.verify_union_variant::<::flatbuffers::ForwardsUOffset<KeywordsInTable>>(\"KeywordsInUnion::static_\", pos),\n                    KeywordsInUnion::internal => v.verify_union_variant::<::flatbuffers::ForwardsUOffset<KeywordsInTable>>(\"KeywordsInUnion::internal\", pos),\n                    _ => Ok(()),\n                }\n            })?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct Table2Args {\n    pub type_type: KeywordsInUnion,\n    pub type_: Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>>,\n}\n\nimpl<'a> Default for Table2Args {\n    #[inline]\n    fn default() -> Self {\n        Table2Args {\n            type_type: KeywordsInUnion::NONE,\n            type_: None,\n        }\n    }\n}\n\npub struct Table2Builder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> Table2Builder<'a, 'b, A> {\n    #[inline]\n    pub fn add_type_type(&mut self, type_type: KeywordsInUnion) {\n        self.fbb_.push_slot::<KeywordsInUnion>(Table2::VT_TYPE_TYPE, type_type, KeywordsInUnion::NONE);\n    }\n\n    #[inline]\n    pub fn add_type_(&mut self, type_: ::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Table2::VT_TYPE_, type_);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> Table2Builder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        Table2Builder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<Table2<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for Table2<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"Table2\");\n        ds.field(\"type_type\", &self.type_type());\n        match self.type_type() {\n            KeywordsInUnion::static_ => {\n                if let Some(x) = self.type__as_static_() {\n                    ds.field(\"type_\", &x)\n                } else {\n                    ds.field(\"type_\", &\"InvalidFlatbuffer: Union discriminant does not match value.\")\n                }\n            },\n            KeywordsInUnion::internal => {\n                if let Some(x) = self.type__as_internal() {\n                    ds.field(\"type_\", &x)\n                } else {\n                    ds.field(\"type_\", &\"InvalidFlatbuffer: Union discriminant does not match value.\")\n                }\n            },\n            _ => {\n                let x: Option<()> = None;\n                ds.field(\"type_\", &x)\n            },\n        };\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct Table2T {\n    pub type_: KeywordsInUnionT,\n}\n\nimpl Default for Table2T {\n    fn default() -> Self {\n        Self {\n            type_: KeywordsInUnionT::NONE,\n        }\n    }\n}\n\nimpl Table2T {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<Table2<'b>> {\n        let type_type = self.type_.keywords_in_union_type();\n        let type_ = self.type_.pack(_fbb);\n        Table2::create(_fbb, &Table2Args{\n            type_type,\n            type_,\n        })\n    }\n}\n"
  },
  {
    "path": "tests/keyword_test/mod.rs",
    "content": "// Automatically generated by the Flatbuffers compiler. Do not modify.\n// @generated\npub mod keyword_test {\n    use super::*;\n    mod abc_generated;\n    pub use self::abc_generated::*;\n    mod public_generated;\n    pub use self::public_generated::*;\n    mod keywords_in_union_generated;\n    pub use self::keywords_in_union_generated::*;\n    mod keywords_in_table_generated;\n    pub use self::keywords_in_table_generated::*;\n    mod table_2_generated;\n    pub use self::table_2_generated::*;\n} // keyword_test\n"
  },
  {
    "path": "tests/keyword_test.fbs",
    "content": "namespace KeywordTest;\n\nenum ABC: int { void, where, stackalloc }\n\nenum public: int { }\n\ntable KeywordsInTable {\n  is: ABC = void;\n  private: public;\n  type: int;\n  default: bool = false;\n}\n\nunion KeywordsInUnion {\n  static: KeywordsInTable,\n  internal: KeywordsInTable,\n}\n\ntable Table2 {\n  type: KeywordsInUnion;\n}\n"
  },
  {
    "path": "tests/lobstertest.lobster",
    "content": "// Copyright 2018 Google Inc. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport from \"../lobster/\"\nimport monster_test_generated\nimport optional_scalars_generated\n\ndef check_read_buffer(buf):\n    // Check that the given buffer is evaluated correctly as the example Monster.\n    assert flatbuffers.has_identifier(buf, \"MONS\")\n\n    let monster = MyGame.Example.GetRootAsMonster(buf)\n\n    assert monster.hp == 80\n    assert monster.mana == 150\n    assert monster.name == \"MyMonster\"\n\n    let vec = monster.pos\n    assert vec\n    assert vec.x == 1.0\n    assert vec.y == 2.0\n    assert vec.z == 3.0\n    assert vec.test1 == 3.0\n    assert vec.test2 == 2\n\n    let t = vec.test3\n    assert t\n    assert t.a == 5\n    assert t.b == 6\n\n    assert monster.test_type == MyGame.Example.Any_Monster\n    assert monster.test_as_Monster.name == \"Fred\"\n\n    assert monster.inventory_length == 5\n    assert sum(map(monster.inventory_length) i: monster.inventory(i)) == 10\n\n    for(5) i:\n        assert monster.vector_of_longs(i) == pow(10, i * 2)\n\n    assert equal([-1.7976931348623157e+308, 0.0, 1.7976931348623157e+308],\n                 (map(monster.vector_of_doubles_length) i: monster.vector_of_doubles(i)))\n\n    assert monster.test4_length == 2\n    let test0 = monster.test4(0)\n    let test1 = monster.test4(1)\n    assert test0.a + test0.b + test1.a + test1.b == 100\n\n    assert monster.testarrayofstring_length == 2\n    assert monster.testarrayofstring(0) == \"test1\"\n    assert monster.testarrayofstring(1) == \"test2\"\n\n    assert monster.testarrayoftables_length == 0\n    assert monster.testnestedflatbuffer_length == 0\n    assert not monster.testempty()\n\ndef make_monster_from_generated_code():\n    // Use generated code to build the example Monster.\n    let b = flatbuffers.builder {}\n\n    let name = b.CreateString(\"MyMonster\")\n    let fred = b.CreateString(\"Fred\")\n\n    let inv = b.MyGame.Example.MonsterCreateInventoryVector([ 0, 1, 2, 3, 4 ])\n\n    let mon2 = MyGame.Example.MonsterBuilder { b }\n        .start()\n        .add_name(fred)\n        .end()\n\n    b.MyGame.Example.MonsterStartTest4Vector(2)\n    b.MyGame.Example.CreateTest(10, 20)\n    b.MyGame.Example.CreateTest(30, 40)\n    let test4 = b.EndVector(2)\n\n    let test_array_of_string = b.MyGame.Example.MonsterCreateTestarrayofstringVector(\n                                   [ b.CreateString(\"test1\"), b.CreateString(\"test2\") ])\n\n    let vector_of_longs = b.MyGame.Example.MonsterCreateVectorOfLongsVector(\n                              [ 1, 100, 10000, 1000000, 100000000 ])\n\n    let vector_of_doubles = b.MyGame.Example.MonsterCreateVectorOfDoublesVector(\n                                [ -1.7976931348623157e+308, 0.0, 1.7976931348623157e+308 ])\n\n    let mon = MyGame.Example.MonsterBuilder { b }\n        .start()\n        .add_pos(b.MyGame.Example.CreateVec3(1.0, 2.0, 3.0, 3.0,\n                 MyGame.Example.Color_Green, 5, 6))\n        .add_hp(80)\n        .add_name(name)\n        .add_inventory(inv)\n        .add_test_type(MyGame.Example.Any_Monster)\n        .add_test(mon2)\n        .add_test4(test4)\n        .add_testarrayofstring(test_array_of_string)\n        .add_vector_of_longs(vector_of_longs)\n        .add_vector_of_doubles(vector_of_doubles)\n        .end()\n\n    b.Finish(mon, \"MONS\")\n\n    return b.SizedCopy()\n\ndef test_optional_scalars():\n    def build(add_fields):\n        let b = flatbuffers.builder {}\n        let ss = optional_scalars.ScalarStuffBuilder { b }.start()\n        if add_fields:\n            ss.add_just_i8(1)\n            ss.add_maybe_i8(1)\n            ss.add_default_i8(1)\n            ss.add_just_f64(1.0)\n            ss.add_maybe_f64(1.0)\n            ss.add_default_f64(1.0)\n            ss.add_just_bool(true)\n            ss.add_maybe_bool(true)\n            ss.add_default_bool(true)\n            ss.add_just_enum(optional_scalars.OptionalByte_Two)\n            ss.add_maybe_enum(optional_scalars.OptionalByte_Two)\n            ss.add_default_enum(optional_scalars.OptionalByte_Two)\n        b.Finish(ss.end(), \"NULL\")\n        let buf = b.SizedCopy()\n        assert flatbuffers.has_identifier(buf, \"NULL\")\n        return optional_scalars.GetRootAsScalarStuff(buf)\n\n    var root = build(true)\n\n    assert root.just_i8() == 1 and root.default_i8() == 1\n    var maybe_val_i8, maybe_present_i8 = root.maybe_i8()\n    assert maybe_val_i8 == 1 and maybe_present_i8 == true\n\n    assert root.just_f64() == 1.0 and root.default_f64() == 1.0\n    var maybe_val_f64, maybe_present_f64 = root.maybe_f64()\n    assert maybe_val_f64 == 1.0 and maybe_present_f64 == true\n\n    assert root.just_bool() == true and root.default_bool() == true\n    var maybe_val_bool, maybe_present_bool = root.maybe_bool()\n    assert maybe_val_bool == true and maybe_present_bool == true\n\n    assert root.just_enum() == optional_scalars.OptionalByte_Two and root.default_enum() == optional_scalars.OptionalByte_Two\n    var maybe_val_enum, maybe_present_enum = root.maybe_enum()\n    assert maybe_val_enum == optional_scalars.OptionalByte_Two and maybe_present_enum == true\n\n    root = build(false)\n\n    assert root.just_i8() == 0 and root.default_i8() == 42\n    maybe_val_i8, maybe_present_i8 = root.maybe_i8()\n    assert maybe_val_i8 == 0 and maybe_present_i8 == false\n\n    assert root.just_f64() == 0.0 and root.default_f64() == 42.0\n    maybe_val_f64, maybe_present_f64 = root.maybe_f64()\n    assert maybe_val_f64 == 0.0 and maybe_present_f64 == false\n\n    assert root.just_bool() == false and root.default_bool() == true\n    maybe_val_bool, maybe_present_bool = root.maybe_bool()\n    assert maybe_val_bool == false and maybe_present_bool == false\n\n    assert root.just_enum() == optional_scalars.OptionalByte_None and root.default_enum() == optional_scalars.OptionalByte_One\n    maybe_val_enum, maybe_present_enum = root.maybe_enum()\n    assert maybe_val_enum == optional_scalars.OptionalByte_None and maybe_present_enum == false\n\n\n// Verify that the canonical flatbuffer file (produced by the C++ implementation)\n// is readable by the generated Lobster code.\nlet fb2 = read_file(\"monsterdata_test.mon\")\nassert fb2\ncheck_read_buffer(fb2)\n\n// Verify that using the generated Lobster code builds a buffer without\n// returning errors, and is interpreted correctly.\nlet fb1 = make_monster_from_generated_code()\ncheck_read_buffer(fb1)\n// Write the result to file for no good reason.\nwrite_file(\"monsterdata_lobster_wire.mon\", fb1)\n\n// Test converting the buffer to JSON and parsing the JSON back again.\nlet schema = read_file(\"monster_test.fbs\")\nassert schema\nlet includedirs = [ \"include_test\" ]\n// Convert binary to JSON:\nlet json, err1 = flatbuffers.binary_to_json(schema, fb1, includedirs)\nassert not err1\n// Parse JSON back to binary:\nlet fb3, err2 = flatbuffers.json_to_binary(schema, json, includedirs)\nassert not err2\n// Check the resulting binary again (full roundtrip test):\ncheck_read_buffer(fb3)\n\n// Additional tests.\ntest_optional_scalars()\n\nprint \"Lobster test successful!\"\n"
  },
  {
    "path": "tests/long_namespace.fbs",
    "content": "namespace com.company.test;\n\ntable Person {\n  name:string;\n  age:short;\n}\nroot_type Person;"
  },
  {
    "path": "tests/longer_namespace.fbs",
    "content": "namespace longer_namespace.a.b.c;\n\ntable Person {\n  name:string;\n  age:short;\n}\nroot_type Person;"
  },
  {
    "path": "tests/luatest.lua",
    "content": "package.path = string.format(\"../lua/?.lua;./?.lua;%s\",package.path)\nlocal compat = require(\"flatbuffers.compat\")\n\nlocal performBenchmarkTests = false\n\nif #arg > 1 then\n    print(\"usage: lua luatests [benchmark]\");\n    return\nelseif #arg > 0 then \n    if(arg[1] == \"benchmark\") then\n        performBenchmarkTests = true\n    end \nend\n\nlocal function checkReadBuffer(buf, offset, sizePrefix)\n    offset = offset or 0\n    \n    if type(buf) == \"string\" then\n        buf = flatbuffers.binaryArray.New(buf)\n    end\n    \n    if sizePrefix then               \n        local size = flatbuffers.N.Int32:Unpack(buf, offset)\n        assert(size == buf.size - offset - 4)\n        offset = offset + flatbuffers.N.Int32.bytewidth\n    end    \n    \n    local mon = monster.GetRootAsMonster(buf, offset)\n    assert(mon:Hp() == 80, \"Monster Hp is not 80\")\n    assert(mon:Mana() == 150, \"Monster Mana is not 150\")\n    assert(mon:Name() == \"MyMonster\", \"Monster Name is not MyMonster\")\n    assert(mon:Testbool() == true)\n    \n    local vec = assert(mon:Pos(), \"Monster Position is nil\")\n    assert(vec:X() == 1.0)\n    assert(vec:Y() == 2.0)\n    assert(vec:Z() == 3.0)\n    assert(vec:Test1() == 3.0)\n    assert(vec:Test2() == 2)\n    \n    local t = require(\"MyGame.Example.Test\").New()\n    t = assert(vec:Test3(t))\n    \n    assert(t:A() == 5)\n    assert(t:B() == 6)\n    \n    local ut = require(\"MyGame.Example.Any\")\n    assert(mon:TestType() == ut.Monster)\n    \n    local table2 = mon:Test()\n    assert(getmetatable(table2) == \"flatbuffers.view.mt\")\n    \n    local mon2 = monster.New()\n    mon2:Init(table2.bytes, table2.pos)\n    \n    assert(mon2:Name() == \"Fred\")\n    \n    assert(mon:InventoryLength() == 5)\n    local invsum = 0\n    for i=1,mon:InventoryLength() do\n        local v = mon:Inventory(i)\n        invsum = invsum + v\n    end\n    assert(invsum == 10)\n    \n    for i=1,5 do\n        assert(mon:VectorOfLongs(i) == 10^((i-1)*2))\n    end\n    \n    local dbls = { -1.7976931348623157e+308, 0, 1.7976931348623157e+308}\n    for i=1,mon:VectorOfDoublesLength() do\n        assert(mon:VectorOfDoubles(i) == dbls[i])\n    end\n    \n    assert(mon:Test4Length() == 2)\n    \n    local test0 = mon:Test4(1)\n    local test1 = mon:Test4(2)\n    \n    local v0 = test0:A()\n    local v1 = test0:B()\n    local v2 = test1:A()\n    local v3 = test1:B()\n    \n    local sumtest12 = v0 + v1 + v2 + v3\n    assert(sumtest12 == 100)\n    \n    assert(mon:TestarrayofstringLength() == 2)\n    assert(mon:Testarrayofstring(1) == \"test1\")\n    assert(mon:Testarrayofstring(2) == \"test2\")\n    \n    assert(mon:TestarrayoftablesLength() == 0)\n    assert(mon:TestnestedflatbufferLength() == 0)\n    assert(mon:Testempty() == nil)\nend\n\nlocal function generateMonster(sizePrefix, b)\n    if b then b:Clear() end\n    b = b or flatbuffers.Builder(0)\n    local str = b:CreateString(\"MyMonster\")\n    local test1 = b:CreateString(\"test1\")\n    local test2 = b:CreateString(\"test2\")\n    local fred = b:CreateString(\"Fred\")\n    \n    monster.StartInventoryVector(b, 5)\n    b:PrependByte(4)\n    b:PrependByte(3)\n    b:PrependByte(2)\n    b:PrependByte(1)\n    b:PrependByte(0)\n    local inv = b:EndVector(5)\n    \n    monster.Start(b)\n    monster.AddName(b, fred)\n    local mon2 = monster.End(b)\n    \n    monster.StartTest4Vector(b, 2)\n    test.CreateTest(b, 10, 20)\n    test.CreateTest(b, 30, 40)\n    local test4 = b:EndVector(2)\n    \n    monster.StartTestarrayofstringVector(b, 2)\n    b:PrependUOffsetTRelative(test2)\n    b:PrependUOffsetTRelative(test1)\n    local testArrayOfString = b:EndVector(2)\n    \n    monster.StartVectorOfLongsVector(b, 5)\n    b:PrependInt64(100000000)\n    b:PrependInt64(1000000)\n    b:PrependInt64(10000)\n    b:PrependInt64(100)\n    b:PrependInt64(1)\n    local vectorOfLongs = b:EndVector(5)\n    \n    monster.StartVectorOfDoublesVector(b, 3)\n    b:PrependFloat64(1.7976931348623157e+308)\n    b:PrependFloat64(0)\n    b:PrependFloat64(-1.7976931348623157e+308)\n    local vectorOfDoubles = b:EndVector(3)\n    \n    monster.Start(b)\n    local pos = vec3.CreateVec3(b, 1.0, 2.0, 3.0, 3.0, 2, 5, 6)\n    monster.AddPos(b, pos)\n    \n    monster.AddHp(b, 80)\n    monster.AddName(b, str)\n    monster.AddInventory(b, inv)\n    monster.AddTestType(b, 1)\n    monster.AddTest(b, mon2)\n    monster.AddTest4(b, test4)\n    monster.AddTestbool(b, true)\n    monster.AddTestbool(b, false)\n    monster.AddTestbool(b, null)\n    monster.AddTestbool(b,\"true\")\n    monster.AddTestarrayofstring(b, testArrayOfString)\n    monster.AddVectorOfLongs(b, vectorOfLongs)\n    monster.AddVectorOfDoubles(b, vectorOfDoubles)\n    local mon = monster.End(b)\n    \n    if sizePrefix then\n        b:FinishSizePrefixed(mon)\n    else\n        b:Finish(mon)\n    end\n    return b:Output(true), b:Head()\nend\n\nlocal function sizePrefix(sizePrefix)\n    local buf,offset = generateMonster(sizePrefix)\n    checkReadBuffer(buf, offset, sizePrefix)\nend\n\nlocal function fbbClear()\n    -- Generate a builder that will be 'cleared' and reused to create two different objects.\n    local fbb = flatbuffers.Builder(0)\n\n    -- First use the builder to read the normal monster data and verify it works\n    local buf, offset = generateMonster(false, fbb)\n    checkReadBuffer(buf, offset, false)\n\n    -- Then clear the builder to be used again\n    fbb:Clear()\n\n    -- Storage for the built monsters\n    local monsters = {}\n    local lastBuf\n\n    -- Make another builder that will be use identically to the 'cleared' one so outputs can be compared. Build both the\n    -- Cleared builder and new builder in the exact same way, so we can compare their results\n    for i, builder in ipairs({fbb, flatbuffers.Builder(0)}) do\n        local strOffset = builder:CreateString(\"Hi there\")\n        monster.Start(builder)\n        monster.AddPos(builder, vec3.CreateVec3(builder, 3.0, 2.0, 1.0, 17.0, 3, 100, 123))\n        monster.AddName(builder, strOffset)\n        monster.AddMana(builder, 123)\n        builder:Finish(monster.End(builder))\n        local buf = builder:Output(false)\n        if not lastBuf then\n            lastBuf = buf\n        else\n            -- the output, sized-buffer should be identical\n            assert(lastBuf == buf, \"Monster output buffers are not identical\")\n        end\n        monsters[i] = monster.GetRootAsMonster(flatbuffers.binaryArray.New(buf), 0)\n    end\n\n    -- Check that all the fields for the generated monsters are as we expect\n    for i, monster in ipairs(monsters) do\n        assert(monster:Name() == \"Hi there\", \"Monster Name is not 'Hi There' for monster \"..i)\n        -- HP is default to 100 in the schema, but we change it in generateMonster to 80, so this is a good test to\n        -- see if the cleared builder really clears the data.\n        assert(monster:Hp() == 100, \"HP doesn't equal the default value for monster \"..i)\n        assert(monster:Mana() == 123, \"Monster Mana is not '123' for monster \"..i)\n        assert(monster:Pos():X() == 3.0, \"Monster vec3.X is not '3' for monster \"..i)\n    end\nend\n\nlocal function testCanonicalData()\n    local f = assert(io.open('monsterdata_test.mon', 'rb'))\n    local wireData = f:read(\"*a\")\n    f:close()    \n    checkReadBuffer(wireData)  \nend    \n    \nlocal function testCreateEmptyString()\n    local b = flatbuffers.Builder(0)\n    local str = b:CreateString(\"\")\n    monster.Start(b)\n    monster.AddName(b, str)\n    b:Finish(monster.End(b))\n    local s = b:Output()\n    local data = flatbuffers.binaryArray.New(s)\n    local mon = monster.GetRootAsMonster(data, 0)\n    assert(mon:Name() == \"\")\nend\n\nlocal function benchmarkMakeMonster(count, reuseBuilder)\n    local fbb = reuseBuilder and flatbuffers.Builder(0)\n    local length = #(generateMonster(false, fbb))\n\n    local s = os.clock()\n    for i=1,count do\n        generateMonster(false, fbb)\n    end\n    local e = os.clock()    \n\n    local dur = (e - s)\n    local rate = count / (dur * 1000)\n    local data = (length * count) / (1024 * 1024)\n    local dataRate = data / dur\n    \n    print(string.format('built %d %d-byte flatbuffers in %.2fsec: %.2f/msec, %.2fMB/sec',\n        count, length, dur, rate, dataRate))\nend\n\nlocal function benchmarkReadBuffer(count)\n    local f = assert(io.open('monsterdata_test.mon', 'rb'))\n    local buf = f:read(\"*a\")\n    f:close()    \n        \n    local s = os.clock()\n    for i=1,count do\n        checkReadBuffer(buf)\n    end\n    local e = os.clock()\n        \n    local dur = (e - s)\n    local rate = count / (dur * 1000)\n    local data = (#buf * count) / (1024 * 1024)\n    local dataRate = data / dur\n    \n    print(string.format('traversed %d %d-byte flatbuffers in %.2fsec: %.2f/msec, %.2fMB/sec',\n        count, #buf, dur, rate, dataRate))\nend\n\nlocal function getRootAs_canAcceptString()\n    local f = assert(io.open('monsterdata_test.mon', 'rb'))\n    local wireData = f:read(\"*a\")\n    f:close() \n    assert(type(wireData) == \"string\", \"Data is not a string\");\n    local mon = monster.GetRootAsMonster(wireData, 0)\n    assert(mon:Hp() == 80, \"Monster Hp is not 80\")\nend\n    \nlocal function testAccessByteVectorAsString()\n    local f = assert(io.open('monsterdata_test.mon', 'rb'))\n    local wireData = f:read(\"*a\")\n    f:close()\n    local mon = monster.GetRootAsMonster(wireData, 0)\n    -- the data of byte array Inventory is [0, 1, 2, 3, 4]\n    local s = mon:InventoryAsString(1, 3)\n    assert(#s == 3)\n    for i = 1, #s do\n        assert(string.byte(s, i) == i - 1)\n    end\n\n    local s = mon:InventoryAsString(2, 5)\n    assert(#s == 4)\n    for i = 1, #s do\n        assert(string.byte(s, i) == i)\n    end\n\n    local s = mon:InventoryAsString(5, 5)\n    assert(#s == 1)\n    assert(string.byte(s, 1) == 4)\n\n    local s = mon:InventoryAsString(2)\n    assert(#s == 4)\n    for i = 1, #s do\n        assert(string.byte(s, i) == i)\n    end\n\n    local s = mon:InventoryAsString()\n    assert(#s == 5)\n    for i = 1, #s do\n        assert(string.byte(s, i) == i - 1)\n    end\nend\n\nlocal tests = \n{ \n    {   \n        f = sizePrefix, \n        d = \"Test size prefix\",\n        args = {{true}, {false}}\n    },\n    {\n        f = fbbClear,\n        d = \"FlatBufferBuilder Clear\",\n    },\n    {   \n        f = testCanonicalData, \n        d = \"Tests Canonical flatbuffer file included in repo\"       \n    },\n    {\n        f = testCreateEmptyString,\n        d = \"Avoid infinite loop when creating empty string\"\n    },\n    {\n        f = getRootAs_canAcceptString,\n        d = \"Tests that GetRootAs<type>() generated methods accept strings\"\n    },\n    {\n        f = testAccessByteVectorAsString,\n        d = \"Access byte vector as string\"\n    },\n}\n\nlocal benchmarks = \n{\n    {\n        f = benchmarkMakeMonster,\n        d = \"Benchmark making monsters\",\n        args = {\n            {100}, \n            {1000},\n            {10000},\n            {10000, true}\n        }\n    },   \n    {\n        f = benchmarkReadBuffer,\n        d = \"Benchmark reading monsters\",\n        args = {\n            {100}, \n            {1000},\n            {10000},\n            -- uncomment following to run 1 million to compare. \n            -- Took ~141 seconds on my machine\n            --{1000000},\n        }\n    }, \n}\n\nlocal result, err = xpcall(function()\n    flatbuffers = assert(require(\"flatbuffers\"))\n    monster = assert(require(\"MyGame.Example.Monster\"))  \n    test = assert(require(\"MyGame.Example.Test\"))\n    vec3 = assert(require(\"MyGame.Example.Vec3\"))\n    \n    local function buildArgList(tbl)\n        local s = \"\"\n        for _,item in ipairs(tbl) do\n            s = s .. tostring(item) .. \",\"          \n        end\n        return s:sub(1,-2)\n    end\n    \n    if performBenchmarkTests then\n        for _,benchmark in ipairs(benchmarks) do\n            table.insert(tests, benchmark)\n        end\n    end\n\n    local testsPassed, testsFailed = 0,0\n    for _,test in ipairs(tests) do\n        local allargs = test.args or {{}}\n        for _,args in ipairs(allargs) do\n            local results, err = xpcall(test.f,debug.traceback, table.unpack(args))        \n            if results then\n                testsPassed = testsPassed + 1\n            else\n                testsFailed = testsFailed + 1\n                print(string.format(\" Test [%s](%s) failed: \\n\\t%s\", \n                        test.d or \"\", \n                        buildArgList(args),\n                        err)) \n            end\n        end\n    end\n    \n    local totalTests = testsPassed + testsFailed\n    print(string.format(\"# of test passed: %d / %d (%.2f%%)\",\n        testsPassed, \n        totalTests, \n        totalTests ~= 0 \n            and 100 * (testsPassed / totalTests) \n            or 0)\n        )\n    \n    return 0\nend, debug.traceback)\n\nif not result then\n    print(\"Unable to run tests due to test framework error: \",err)\nend\n\nos.exit(result and 0 or -1)\n"
  },
  {
    "path": "tests/minified_enums/enums.fbs",
    "content": "enum Color : int {Red = 1, Blue, Orange}\n\nenum Size: int {Small = 10, Large = 100, Medium = 1000}"
  },
  {
    "path": "tests/monster_extra.fbs",
    "content": "namespace MyGame;\n\n// Not all programming languages support this extra table.\ntable MonsterExtra {\n  // Float-point values with NaN and Inf defaults.\n  d0:double = nan;\n  d1:double = -nan; // parser must ignore sign of NaN\n  d2:double = +inf;\n  d3:double = -inf;\n  f0:float = -nan; // parser must ignore sign of NaN\n  f1:float = +nan;\n  f2:float = +inf;\n  f3:float = -inf;\n  dvec : [double];\n  fvec : [float];\n  deprec:int (deprecated);\n}\n\nroot_type MonsterExtra;\n\nfile_identifier \"MONE\";\nfile_extension \"mon\";\n"
  },
  {
    "path": "tests/monster_extra_my_game_generated.dart",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable, constant_identifier_names\n\nlibrary my_game;\n\nimport 'dart:typed_data' show Uint8List;\nimport 'package:flat_buffers/flat_buffers.dart' as fb;\n\n\n\nclass MonsterExtra {\n  MonsterExtra._(this._bc, this._bcOffset);\n  factory MonsterExtra(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<MonsterExtra> reader = _MonsterExtraReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  double get d0 => const fb.Float64Reader().vTableGet(_bc, _bcOffset, 4, double.nan);\n  double get d1 => const fb.Float64Reader().vTableGet(_bc, _bcOffset, 6, double.nan);\n  double get d2 => const fb.Float64Reader().vTableGet(_bc, _bcOffset, 8, double.infinity);\n  double get d3 => const fb.Float64Reader().vTableGet(_bc, _bcOffset, 10, double.negativeInfinity);\n  double get f0 => const fb.Float32Reader().vTableGet(_bc, _bcOffset, 12, double.nan);\n  double get f1 => const fb.Float32Reader().vTableGet(_bc, _bcOffset, 14, double.nan);\n  double get f2 => const fb.Float32Reader().vTableGet(_bc, _bcOffset, 16, double.infinity);\n  double get f3 => const fb.Float32Reader().vTableGet(_bc, _bcOffset, 18, double.negativeInfinity);\n  List<double>? get dvec => const fb.ListReader<double>(fb.Float64Reader()).vTableGetNullable(_bc, _bcOffset, 20);\n  List<double>? get fvec => const fb.ListReader<double>(fb.Float32Reader()).vTableGetNullable(_bc, _bcOffset, 22);\n\n  @override\n  String toString() {\n    return 'MonsterExtra{d0: ${d0}, d1: ${d1}, d2: ${d2}, d3: ${d3}, f0: ${f0}, f1: ${f1}, f2: ${f2}, f3: ${f3}, dvec: ${dvec}, fvec: ${fvec}}';\n  }\n\n  MonsterExtraT unpack() => MonsterExtraT(\n      d0: d0,\n      d1: d1,\n      d2: d2,\n      d3: d3,\n      f0: f0,\n      f1: f1,\n      f2: f2,\n      f3: f3,\n      dvec: dvec?.toList(),\n      fvec: fvec?.toList());\n\n  static int pack(fb.Builder fbBuilder, MonsterExtraT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass MonsterExtraT implements fb.Packable {\n  double d0;\n  double d1;\n  double d2;\n  double d3;\n  double f0;\n  double f1;\n  double f2;\n  double f3;\n  List<double>? dvec;\n  List<double>? fvec;\n\n  MonsterExtraT({\n      this.d0 = double.nan,\n      this.d1 = double.nan,\n      this.d2 = double.infinity,\n      this.d3 = double.negativeInfinity,\n      this.f0 = double.nan,\n      this.f1 = double.nan,\n      this.f2 = double.infinity,\n      this.f3 = double.negativeInfinity,\n      this.dvec,\n      this.fvec});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    final int? dvecOffset = dvec == null ? null\n        : fbBuilder.writeListFloat64(dvec!);\n    final int? fvecOffset = fvec == null ? null\n        : fbBuilder.writeListFloat32(fvec!);\n    fbBuilder.startTable(11);\n    fbBuilder.addFloat64(0, d0);\n    fbBuilder.addFloat64(1, d1);\n    fbBuilder.addFloat64(2, d2);\n    fbBuilder.addFloat64(3, d3);\n    fbBuilder.addFloat32(4, f0);\n    fbBuilder.addFloat32(5, f1);\n    fbBuilder.addFloat32(6, f2);\n    fbBuilder.addFloat32(7, f3);\n    fbBuilder.addOffset(8, dvecOffset);\n    fbBuilder.addOffset(9, fvecOffset);\n    return fbBuilder.endTable();\n  }\n\n  @override\n  String toString() {\n    return 'MonsterExtraT{d0: ${d0}, d1: ${d1}, d2: ${d2}, d3: ${d3}, f0: ${f0}, f1: ${f1}, f2: ${f2}, f3: ${f3}, dvec: ${dvec}, fvec: ${fvec}}';\n  }\n}\n\nclass _MonsterExtraReader extends fb.TableReader<MonsterExtra> {\n  const _MonsterExtraReader();\n\n  @override\n  MonsterExtra createObject(fb.BufferContext bc, int offset) => \n    MonsterExtra._(bc, offset);\n}\n\nclass MonsterExtraBuilder {\n  MonsterExtraBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  void begin() {\n    fbBuilder.startTable(11);\n  }\n\n  int addD0(double? d0) {\n    fbBuilder.addFloat64(0, d0);\n    return fbBuilder.offset;\n  }\n  int addD1(double? d1) {\n    fbBuilder.addFloat64(1, d1);\n    return fbBuilder.offset;\n  }\n  int addD2(double? d2) {\n    fbBuilder.addFloat64(2, d2);\n    return fbBuilder.offset;\n  }\n  int addD3(double? d3) {\n    fbBuilder.addFloat64(3, d3);\n    return fbBuilder.offset;\n  }\n  int addF0(double? f0) {\n    fbBuilder.addFloat32(4, f0);\n    return fbBuilder.offset;\n  }\n  int addF1(double? f1) {\n    fbBuilder.addFloat32(5, f1);\n    return fbBuilder.offset;\n  }\n  int addF2(double? f2) {\n    fbBuilder.addFloat32(6, f2);\n    return fbBuilder.offset;\n  }\n  int addF3(double? f3) {\n    fbBuilder.addFloat32(7, f3);\n    return fbBuilder.offset;\n  }\n  int addDvecOffset(int? offset) {\n    fbBuilder.addOffset(8, offset);\n    return fbBuilder.offset;\n  }\n  int addFvecOffset(int? offset) {\n    fbBuilder.addOffset(9, offset);\n    return fbBuilder.offset;\n  }\n\n  int finish() {\n    return fbBuilder.endTable();\n  }\n}\n\nclass MonsterExtraObjectBuilder extends fb.ObjectBuilder {\n  final double? _d0;\n  final double? _d1;\n  final double? _d2;\n  final double? _d3;\n  final double? _f0;\n  final double? _f1;\n  final double? _f2;\n  final double? _f3;\n  final List<double>? _dvec;\n  final List<double>? _fvec;\n\n  MonsterExtraObjectBuilder({\n    double? d0,\n    double? d1,\n    double? d2,\n    double? d3,\n    double? f0,\n    double? f1,\n    double? f2,\n    double? f3,\n    List<double>? dvec,\n    List<double>? fvec,\n  })\n      : _d0 = d0,\n        _d1 = d1,\n        _d2 = d2,\n        _d3 = d3,\n        _f0 = f0,\n        _f1 = f1,\n        _f2 = f2,\n        _f3 = f3,\n        _dvec = dvec,\n        _fvec = fvec;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    final int? dvecOffset = _dvec == null ? null\n        : fbBuilder.writeListFloat64(_dvec!);\n    final int? fvecOffset = _fvec == null ? null\n        : fbBuilder.writeListFloat32(_fvec!);\n    fbBuilder.startTable(11);\n    fbBuilder.addFloat64(0, _d0);\n    fbBuilder.addFloat64(1, _d1);\n    fbBuilder.addFloat64(2, _d2);\n    fbBuilder.addFloat64(3, _d3);\n    fbBuilder.addFloat32(4, _f0);\n    fbBuilder.addFloat32(5, _f1);\n    fbBuilder.addFloat32(6, _f2);\n    fbBuilder.addFloat32(7, _f3);\n    fbBuilder.addOffset(8, dvecOffset);\n    fbBuilder.addOffset(9, fvecOffset);\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n"
  },
  {
    "path": "tests/monster_test/mod.rs",
    "content": "// Automatically generated by the Flatbuffers compiler. Do not modify.\n// @generated\npub mod my_game {\n    use super::*;\n    pub mod example {\n        use super::*;\n        mod color_generated;\n        pub use self::color_generated::*;\n        mod race_generated;\n        pub use self::race_generated::*;\n        mod long_enum_generated;\n        pub use self::long_enum_generated::*;\n        mod any_generated;\n        pub use self::any_generated::*;\n        mod any_unique_aliases_generated;\n        pub use self::any_unique_aliases_generated::*;\n        mod any_ambiguous_aliases_generated;\n        pub use self::any_ambiguous_aliases_generated::*;\n        mod test_generated;\n        pub use self::test_generated::*;\n        mod test_simple_table_with_enum_generated;\n        pub use self::test_simple_table_with_enum_generated::*;\n        mod vec_3_generated;\n        pub use self::vec_3_generated::*;\n        mod ability_generated;\n        pub use self::ability_generated::*;\n        mod struct_of_structs_generated;\n        pub use self::struct_of_structs_generated::*;\n        mod struct_of_structs_of_structs_generated;\n        pub use self::struct_of_structs_of_structs_generated::*;\n        mod stat_generated;\n        pub use self::stat_generated::*;\n        mod referrable_generated;\n        pub use self::referrable_generated::*;\n        mod monster_generated;\n        pub use self::monster_generated::*;\n        mod type_aliases_generated;\n        pub use self::type_aliases_generated::*;\n    } // example\n    pub mod example_2 {\n        use super::*;\n        mod monster_generated;\n        pub use self::monster_generated::*;\n    } // example_2\n    pub mod other_name_space {\n        use super::*;\n        mod from_include_generated;\n        pub use self::from_include_generated::*;\n        mod unused_generated;\n        pub use self::unused_generated::*;\n        mod table_b_generated;\n        pub use self::table_b_generated::*;\n    } // other_name_space\n    mod in_parent_namespace_generated;\n    pub use self::in_parent_namespace_generated::*;\n} // my_game\nmod table_a_generated;\npub use self::table_a_generated::*;\n"
  },
  {
    "path": "tests/monster_test/my_game/example/ability_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n// struct Ability, aligned to 4\n#[repr(transparent)]\n#[derive(Clone, Copy, PartialEq)]\npub struct Ability(pub [u8; 8]);\n\nimpl Default for Ability {\n    fn default() -> Self {\n        Self([0; 8])\n    }\n}\n\nimpl ::core::fmt::Debug for Ability {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        f.debug_struct(\"Ability\")\n            .field(\"id\", &self.id())\n            .field(\"distance\", &self.distance())\n            .finish()\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for Ability {}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Ability {\n    type Inner = &'a Ability;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { <&'a Ability>::follow(buf, loc) }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for &'a Ability {\n    type Inner = &'a Ability;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { ::flatbuffers::follow_cast_ref::<Ability>(buf, loc) }\n    }\n}\n\nimpl<'b> ::flatbuffers::Push for Ability {\n    type Output = Ability;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        let src = unsafe { ::core::slice::from_raw_parts(self as *const Ability as *const u8, <Self as ::flatbuffers::Push>::size()) };\n        dst.copy_from_slice(src);\n    }\n\n    #[inline]\n    fn alignment() -> ::flatbuffers::PushAlignment {\n        ::flatbuffers::PushAlignment::new(4)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for Ability {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.in_buffer::<Self>(pos)\n    }\n}\n\nimpl<'a> Ability {\n    #[allow(clippy::too_many_arguments)]\n    pub fn new(\n        id: u32,\n        distance: u32,\n    ) -> Self {\n        let mut s = Self([0; 8]);\n        s.set_id(id);\n        s.set_distance(distance);\n        s\n    }\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.Example.Ability\"\n    }\n\n    pub fn id(&self) -> u32 {\n        let mut mem = ::core::mem::MaybeUninit::<<u32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[0..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<u32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_id(&mut self, x: u32) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[0..].as_mut_ptr(),\n                ::core::mem::size_of::<<u32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n\n    #[inline]\n    pub fn key_compare_less_than(&self, o: &Ability) -> bool {\n        self.id() < o.id()\n    }\n\n    #[inline]\n    pub fn key_compare_with_value(&self, val: u32) -> ::core::cmp::Ordering {\n        let key = self.id();\n        key.cmp(&val)\n    }\n    pub fn distance(&self) -> u32 {\n        let mut mem = ::core::mem::MaybeUninit::<<u32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[4..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<u32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_distance(&mut self, x: u32) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[4..].as_mut_ptr(),\n                ::core::mem::size_of::<<u32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn unpack(&self) -> AbilityT {\n        AbilityT {\n            id: self.id(),\n            distance: self.distance(),\n        }\n    }\n}\n\n#[derive(Debug, Clone, PartialEq)]\npub struct AbilityT {\n    pub id: u32,\n    pub distance: u32,\n}\nimpl Default for AbilityT {\n    fn default() -> Self {\n        Self {\n            id: 0,\n            distance: 0,\n        }\n    }\n}\n\nimpl AbilityT {\n    pub fn pack(&self) -> Ability {\n        Ability::new(\n            self.id,\n            self.distance,\n        )\n    }\n}\n"
  },
  {
    "path": "tests/monster_test/my_game/example/any_ambiguous_aliases_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MIN_ANY_AMBIGUOUS_ALIASES: u8 = 0;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MAX_ANY_AMBIGUOUS_ALIASES: u8 = 3;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n#[allow(non_camel_case_types)]\npub const ENUM_VALUES_ANY_AMBIGUOUS_ALIASES: [AnyAmbiguousAliases; 4] = [\n    AnyAmbiguousAliases::NONE,\n    AnyAmbiguousAliases::M1,\n    AnyAmbiguousAliases::M2,\n    AnyAmbiguousAliases::M3,\n];\n\n#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n#[repr(transparent)]\npub struct AnyAmbiguousAliases(pub u8);\n\n#[allow(non_upper_case_globals)]\nimpl AnyAmbiguousAliases {\n    pub const NONE: Self = Self(0);\n    pub const M1: Self = Self(1);\n    pub const M2: Self = Self(2);\n    pub const M3: Self = Self(3);\n\n    pub const ENUM_MIN: u8 = 0;\n    pub const ENUM_MAX: u8 = 3;\n    pub const ENUM_VALUES: &'static [Self] = &[\n        Self::NONE,\n        Self::M1,\n        Self::M2,\n        Self::M3,\n    ];\n\n    /// Returns the variant's name or \"\" if unknown.\n    pub fn variant_name(self) -> Option<&'static str> {\n        match self {\n            Self::NONE => Some(\"NONE\"),\n            Self::M1 => Some(\"M1\"),\n            Self::M2 => Some(\"M2\"),\n            Self::M3 => Some(\"M3\"),\n            _ => None,\n        }\n    }\n}\n\nimpl ::core::fmt::Debug for AnyAmbiguousAliases {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        if let Some(name) = self.variant_name() {\n            f.write_str(name)\n        } else {\n            f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n        }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for AnyAmbiguousAliases {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<u8>(buf, loc) };\n        Self(b)\n    }\n}\n\nimpl ::flatbuffers::Push for AnyAmbiguousAliases {\n    type Output = AnyAmbiguousAliases;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<u8>(dst, self.0) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for AnyAmbiguousAliases {\n    type Scalar = u8;\n\n    #[inline]\n    fn to_little_endian(self) -> u8 {\n        self.0.to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: u8) -> Self {\n        let b = u8::from_le(v);\n        Self(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for AnyAmbiguousAliases {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        u8::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for AnyAmbiguousAliases {}\n\npub struct AnyAmbiguousAliasesUnionTableOffset {}\n\n#[allow(clippy::upper_case_acronyms)]\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub enum AnyAmbiguousAliasesT {\n    NONE,\n    M1(alloc::boxed::Box<MonsterT>),\n    M2(alloc::boxed::Box<MonsterT>),\n    M3(alloc::boxed::Box<MonsterT>),\n}\n\nimpl Default for AnyAmbiguousAliasesT {\n    fn default() -> Self {\n        Self::NONE\n    }\n}\n\nimpl AnyAmbiguousAliasesT {\n    pub fn any_ambiguous_aliases_type(&self) -> AnyAmbiguousAliases {\n        match self {\n            Self::NONE => AnyAmbiguousAliases::NONE,\n            Self::M1(_) => AnyAmbiguousAliases::M1,\n            Self::M2(_) => AnyAmbiguousAliases::M2,\n            Self::M3(_) => AnyAmbiguousAliases::M3,\n        }\n    }\n\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(&self, fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>) -> Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>> {\n        match self {\n            Self::NONE => None,\n            Self::M1(v) => Some(v.pack(fbb).as_union_value()),\n            Self::M2(v) => Some(v.pack(fbb).as_union_value()),\n            Self::M3(v) => Some(v.pack(fbb).as_union_value()),\n        }\n    }\n\n    /// If the union variant matches, return the owned MonsterT, setting the union to NONE.\n    pub fn take_m1(&mut self) -> Option<alloc::boxed::Box<MonsterT>> {\n        if let Self::M1(_) = self {\n            let v = ::core::mem::replace(self, Self::NONE);\n            if let Self::M1(w) = v {\n                Some(w)\n            } else {\n                unreachable!()\n            }\n        } else {\n            None\n        }\n    }\n\n    /// If the union variant matches, return a reference to the MonsterT.\n    pub fn as_m1(&self) -> Option<&MonsterT> {\n        if let Self::M1(v) = self { Some(v.as_ref()) } else { None }\n    }\n\n    /// If the union variant matches, return a mutable reference to the MonsterT.\n    pub fn as_m1_mut(&mut self) -> Option<&mut MonsterT> {\n        if let Self::M1(v) = self { Some(v.as_mut()) } else { None }\n    }\n\n    /// If the union variant matches, return the owned MonsterT, setting the union to NONE.\n    pub fn take_m2(&mut self) -> Option<alloc::boxed::Box<MonsterT>> {\n        if let Self::M2(_) = self {\n            let v = ::core::mem::replace(self, Self::NONE);\n            if let Self::M2(w) = v {\n                Some(w)\n            } else {\n                unreachable!()\n            }\n        } else {\n            None\n        }\n    }\n\n    /// If the union variant matches, return a reference to the MonsterT.\n    pub fn as_m2(&self) -> Option<&MonsterT> {\n        if let Self::M2(v) = self { Some(v.as_ref()) } else { None }\n    }\n\n    /// If the union variant matches, return a mutable reference to the MonsterT.\n    pub fn as_m2_mut(&mut self) -> Option<&mut MonsterT> {\n        if let Self::M2(v) = self { Some(v.as_mut()) } else { None }\n    }\n\n    /// If the union variant matches, return the owned MonsterT, setting the union to NONE.\n    pub fn take_m3(&mut self) -> Option<alloc::boxed::Box<MonsterT>> {\n        if let Self::M3(_) = self {\n            let v = ::core::mem::replace(self, Self::NONE);\n            if let Self::M3(w) = v {\n                Some(w)\n            } else {\n                unreachable!()\n            }\n        } else {\n            None\n        }\n    }\n\n    /// If the union variant matches, return a reference to the MonsterT.\n    pub fn as_m3(&self) -> Option<&MonsterT> {\n        if let Self::M3(v) = self { Some(v.as_ref()) } else { None }\n    }\n\n    /// If the union variant matches, return a mutable reference to the MonsterT.\n    pub fn as_m3_mut(&mut self) -> Option<&mut MonsterT> {\n        if let Self::M3(v) = self { Some(v.as_mut()) } else { None }\n    }\n}\n\n"
  },
  {
    "path": "tests/monster_test/my_game/example/any_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MIN_ANY: u8 = 0;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MAX_ANY: u8 = 3;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n#[allow(non_camel_case_types)]\npub const ENUM_VALUES_ANY: [Any; 4] = [\n    Any::NONE,\n    Any::Monster,\n    Any::TestSimpleTableWithEnum,\n    Any::MyGame_Example2_Monster,\n];\n\n#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n#[repr(transparent)]\npub struct Any(pub u8);\n\n#[allow(non_upper_case_globals)]\nimpl Any {\n    pub const NONE: Self = Self(0);\n    pub const Monster: Self = Self(1);\n    pub const TestSimpleTableWithEnum: Self = Self(2);\n    pub const MyGame_Example2_Monster: Self = Self(3);\n\n    pub const ENUM_MIN: u8 = 0;\n    pub const ENUM_MAX: u8 = 3;\n    pub const ENUM_VALUES: &'static [Self] = &[\n        Self::NONE,\n        Self::Monster,\n        Self::TestSimpleTableWithEnum,\n        Self::MyGame_Example2_Monster,\n    ];\n\n    /// Returns the variant's name or \"\" if unknown.\n    pub fn variant_name(self) -> Option<&'static str> {\n        match self {\n            Self::NONE => Some(\"NONE\"),\n            Self::Monster => Some(\"Monster\"),\n            Self::TestSimpleTableWithEnum => Some(\"TestSimpleTableWithEnum\"),\n            Self::MyGame_Example2_Monster => Some(\"MyGame_Example2_Monster\"),\n            _ => None,\n        }\n    }\n}\n\nimpl ::core::fmt::Debug for Any {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        if let Some(name) = self.variant_name() {\n            f.write_str(name)\n        } else {\n            f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n        }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Any {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<u8>(buf, loc) };\n        Self(b)\n    }\n}\n\nimpl ::flatbuffers::Push for Any {\n    type Output = Any;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<u8>(dst, self.0) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for Any {\n    type Scalar = u8;\n\n    #[inline]\n    fn to_little_endian(self) -> u8 {\n        self.0.to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: u8) -> Self {\n        let b = u8::from_le(v);\n        Self(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for Any {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        u8::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for Any {}\n\npub struct AnyUnionTableOffset {}\n\n#[allow(clippy::upper_case_acronyms)]\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub enum AnyT {\n    NONE,\n    Monster(alloc::boxed::Box<MonsterT>),\n    TestSimpleTableWithEnum(alloc::boxed::Box<TestSimpleTableWithEnumT>),\n    MyGameExample2Monster(alloc::boxed::Box<super::example_2::MonsterT>),\n}\n\nimpl Default for AnyT {\n    fn default() -> Self {\n        Self::NONE\n    }\n}\n\nimpl AnyT {\n    pub fn any_type(&self) -> Any {\n        match self {\n            Self::NONE => Any::NONE,\n            Self::Monster(_) => Any::Monster,\n            Self::TestSimpleTableWithEnum(_) => Any::TestSimpleTableWithEnum,\n            Self::MyGameExample2Monster(_) => Any::MyGame_Example2_Monster,\n        }\n    }\n\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(&self, fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>) -> Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>> {\n        match self {\n            Self::NONE => None,\n            Self::Monster(v) => Some(v.pack(fbb).as_union_value()),\n            Self::TestSimpleTableWithEnum(v) => Some(v.pack(fbb).as_union_value()),\n            Self::MyGameExample2Monster(v) => Some(v.pack(fbb).as_union_value()),\n        }\n    }\n\n    /// If the union variant matches, return the owned MonsterT, setting the union to NONE.\n    pub fn take_monster(&mut self) -> Option<alloc::boxed::Box<MonsterT>> {\n        if let Self::Monster(_) = self {\n            let v = ::core::mem::replace(self, Self::NONE);\n            if let Self::Monster(w) = v {\n                Some(w)\n            } else {\n                unreachable!()\n            }\n        } else {\n            None\n        }\n    }\n\n    /// If the union variant matches, return a reference to the MonsterT.\n    pub fn as_monster(&self) -> Option<&MonsterT> {\n        if let Self::Monster(v) = self { Some(v.as_ref()) } else { None }\n    }\n\n    /// If the union variant matches, return a mutable reference to the MonsterT.\n    pub fn as_monster_mut(&mut self) -> Option<&mut MonsterT> {\n        if let Self::Monster(v) = self { Some(v.as_mut()) } else { None }\n    }\n\n    /// If the union variant matches, return the owned TestSimpleTableWithEnumT, setting the union to NONE.\n    pub fn take_test_simple_table_with_enum(&mut self) -> Option<alloc::boxed::Box<TestSimpleTableWithEnumT>> {\n        if let Self::TestSimpleTableWithEnum(_) = self {\n            let v = ::core::mem::replace(self, Self::NONE);\n            if let Self::TestSimpleTableWithEnum(w) = v {\n                Some(w)\n            } else {\n                unreachable!()\n            }\n        } else {\n            None\n        }\n    }\n\n    /// If the union variant matches, return a reference to the TestSimpleTableWithEnumT.\n    pub fn as_test_simple_table_with_enum(&self) -> Option<&TestSimpleTableWithEnumT> {\n        if let Self::TestSimpleTableWithEnum(v) = self { Some(v.as_ref()) } else { None }\n    }\n\n    /// If the union variant matches, return a mutable reference to the TestSimpleTableWithEnumT.\n    pub fn as_test_simple_table_with_enum_mut(&mut self) -> Option<&mut TestSimpleTableWithEnumT> {\n        if let Self::TestSimpleTableWithEnum(v) = self { Some(v.as_mut()) } else { None }\n    }\n\n    /// If the union variant matches, return the owned super::example_2::MonsterT, setting the union to NONE.\n    pub fn take_my_game_example_2_monster(&mut self) -> Option<alloc::boxed::Box<super::example_2::MonsterT>> {\n        if let Self::MyGameExample2Monster(_) = self {\n            let v = ::core::mem::replace(self, Self::NONE);\n            if let Self::MyGameExample2Monster(w) = v {\n                Some(w)\n            } else {\n                unreachable!()\n            }\n        } else {\n            None\n        }\n    }\n\n    /// If the union variant matches, return a reference to the super::example_2::MonsterT.\n    pub fn as_my_game_example_2_monster(&self) -> Option<&super::example_2::MonsterT> {\n        if let Self::MyGameExample2Monster(v) = self { Some(v.as_ref()) } else { None }\n    }\n\n    /// If the union variant matches, return a mutable reference to the super::example_2::MonsterT.\n    pub fn as_my_game_example_2_monster_mut(&mut self) -> Option<&mut super::example_2::MonsterT> {\n        if let Self::MyGameExample2Monster(v) = self { Some(v.as_mut()) } else { None }\n    }\n}\n\n"
  },
  {
    "path": "tests/monster_test/my_game/example/any_unique_aliases_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MIN_ANY_UNIQUE_ALIASES: u8 = 0;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MAX_ANY_UNIQUE_ALIASES: u8 = 3;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n#[allow(non_camel_case_types)]\npub const ENUM_VALUES_ANY_UNIQUE_ALIASES: [AnyUniqueAliases; 4] = [\n    AnyUniqueAliases::NONE,\n    AnyUniqueAliases::M,\n    AnyUniqueAliases::TS,\n    AnyUniqueAliases::M2,\n];\n\n#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n#[repr(transparent)]\npub struct AnyUniqueAliases(pub u8);\n\n#[allow(non_upper_case_globals)]\nimpl AnyUniqueAliases {\n    pub const NONE: Self = Self(0);\n    pub const M: Self = Self(1);\n    pub const TS: Self = Self(2);\n    pub const M2: Self = Self(3);\n\n    pub const ENUM_MIN: u8 = 0;\n    pub const ENUM_MAX: u8 = 3;\n    pub const ENUM_VALUES: &'static [Self] = &[\n        Self::NONE,\n        Self::M,\n        Self::TS,\n        Self::M2,\n    ];\n\n    /// Returns the variant's name or \"\" if unknown.\n    pub fn variant_name(self) -> Option<&'static str> {\n        match self {\n            Self::NONE => Some(\"NONE\"),\n            Self::M => Some(\"M\"),\n            Self::TS => Some(\"TS\"),\n            Self::M2 => Some(\"M2\"),\n            _ => None,\n        }\n    }\n}\n\nimpl ::core::fmt::Debug for AnyUniqueAliases {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        if let Some(name) = self.variant_name() {\n            f.write_str(name)\n        } else {\n            f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n        }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for AnyUniqueAliases {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<u8>(buf, loc) };\n        Self(b)\n    }\n}\n\nimpl ::flatbuffers::Push for AnyUniqueAliases {\n    type Output = AnyUniqueAliases;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<u8>(dst, self.0) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for AnyUniqueAliases {\n    type Scalar = u8;\n\n    #[inline]\n    fn to_little_endian(self) -> u8 {\n        self.0.to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: u8) -> Self {\n        let b = u8::from_le(v);\n        Self(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for AnyUniqueAliases {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        u8::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for AnyUniqueAliases {}\n\npub struct AnyUniqueAliasesUnionTableOffset {}\n\n#[allow(clippy::upper_case_acronyms)]\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub enum AnyUniqueAliasesT {\n    NONE,\n    M(alloc::boxed::Box<MonsterT>),\n    TS(alloc::boxed::Box<TestSimpleTableWithEnumT>),\n    M2(alloc::boxed::Box<super::example_2::MonsterT>),\n}\n\nimpl Default for AnyUniqueAliasesT {\n    fn default() -> Self {\n        Self::NONE\n    }\n}\n\nimpl AnyUniqueAliasesT {\n    pub fn any_unique_aliases_type(&self) -> AnyUniqueAliases {\n        match self {\n            Self::NONE => AnyUniqueAliases::NONE,\n            Self::M(_) => AnyUniqueAliases::M,\n            Self::TS(_) => AnyUniqueAliases::TS,\n            Self::M2(_) => AnyUniqueAliases::M2,\n        }\n    }\n\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(&self, fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>) -> Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>> {\n        match self {\n            Self::NONE => None,\n            Self::M(v) => Some(v.pack(fbb).as_union_value()),\n            Self::TS(v) => Some(v.pack(fbb).as_union_value()),\n            Self::M2(v) => Some(v.pack(fbb).as_union_value()),\n        }\n    }\n\n    /// If the union variant matches, return the owned MonsterT, setting the union to NONE.\n    pub fn take_m(&mut self) -> Option<alloc::boxed::Box<MonsterT>> {\n        if let Self::M(_) = self {\n            let v = ::core::mem::replace(self, Self::NONE);\n            if let Self::M(w) = v {\n                Some(w)\n            } else {\n                unreachable!()\n            }\n        } else {\n            None\n        }\n    }\n\n    /// If the union variant matches, return a reference to the MonsterT.\n    pub fn as_m(&self) -> Option<&MonsterT> {\n        if let Self::M(v) = self { Some(v.as_ref()) } else { None }\n    }\n\n    /// If the union variant matches, return a mutable reference to the MonsterT.\n    pub fn as_m_mut(&mut self) -> Option<&mut MonsterT> {\n        if let Self::M(v) = self { Some(v.as_mut()) } else { None }\n    }\n\n    /// If the union variant matches, return the owned TestSimpleTableWithEnumT, setting the union to NONE.\n    pub fn take_ts(&mut self) -> Option<alloc::boxed::Box<TestSimpleTableWithEnumT>> {\n        if let Self::TS(_) = self {\n            let v = ::core::mem::replace(self, Self::NONE);\n            if let Self::TS(w) = v {\n                Some(w)\n            } else {\n                unreachable!()\n            }\n        } else {\n            None\n        }\n    }\n\n    /// If the union variant matches, return a reference to the TestSimpleTableWithEnumT.\n    pub fn as_ts(&self) -> Option<&TestSimpleTableWithEnumT> {\n        if let Self::TS(v) = self { Some(v.as_ref()) } else { None }\n    }\n\n    /// If the union variant matches, return a mutable reference to the TestSimpleTableWithEnumT.\n    pub fn as_ts_mut(&mut self) -> Option<&mut TestSimpleTableWithEnumT> {\n        if let Self::TS(v) = self { Some(v.as_mut()) } else { None }\n    }\n\n    /// If the union variant matches, return the owned super::example_2::MonsterT, setting the union to NONE.\n    pub fn take_m2(&mut self) -> Option<alloc::boxed::Box<super::example_2::MonsterT>> {\n        if let Self::M2(_) = self {\n            let v = ::core::mem::replace(self, Self::NONE);\n            if let Self::M2(w) = v {\n                Some(w)\n            } else {\n                unreachable!()\n            }\n        } else {\n            None\n        }\n    }\n\n    /// If the union variant matches, return a reference to the super::example_2::MonsterT.\n    pub fn as_m2(&self) -> Option<&super::example_2::MonsterT> {\n        if let Self::M2(v) = self { Some(v.as_ref()) } else { None }\n    }\n\n    /// If the union variant matches, return a mutable reference to the super::example_2::MonsterT.\n    pub fn as_m2_mut(&mut self) -> Option<&mut super::example_2::MonsterT> {\n        if let Self::M2(v) = self { Some(v.as_mut()) } else { None }\n    }\n}\n\n"
  },
  {
    "path": "tests/monster_test/my_game/example/color_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n#[allow(non_upper_case_globals)]\nmod bitflags_color {\n    ::flatbuffers::bitflags::bitflags! {\n        /// Composite components of Monster color.\n        #[derive(Default, Debug, Clone, Copy, PartialEq)]\n        pub struct Color: u8 {\n            const Red = 1;\n            /// \\brief color Green\n            /// Green is bit_flag with value (1u << 1)\n            const Green = 2;\n            /// \\brief color Blue (1u << 3)\n            const Blue = 8;\n        }\n    }\n}\n\npub use self::bitflags_color::Color;\n\nimpl<'a> ::flatbuffers::Follow<'a> for Color {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<u8>(buf, loc) };\n        Self::from_bits_retain(b)\n    }\n}\n\nimpl ::flatbuffers::Push for Color {\n    type Output = Color;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<u8>(dst, self.bits()) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for Color {\n    type Scalar = u8;\n\n    #[inline]\n    fn to_little_endian(self) -> u8 {\n        self.bits().to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: u8) -> Self {\n        let b = u8::from_le(v);\n        Self::from_bits_retain(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for Color {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        u8::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for Color {}\n"
  },
  {
    "path": "tests/monster_test/my_game/example/long_enum_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n#[allow(non_upper_case_globals)]\nmod bitflags_long_enum {\n    ::flatbuffers::bitflags::bitflags! {\n        #[derive(Default, Debug, Clone, Copy, PartialEq)]\n        pub struct LongEnum: u64 {\n            const LongOne = 2;\n            const LongTwo = 4;\n            const LongBig = 1099511627776;\n        }\n    }\n}\n\npub use self::bitflags_long_enum::LongEnum;\n\nimpl<'a> ::flatbuffers::Follow<'a> for LongEnum {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<u64>(buf, loc) };\n        Self::from_bits_retain(b)\n    }\n}\n\nimpl ::flatbuffers::Push for LongEnum {\n    type Output = LongEnum;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<u64>(dst, self.bits()) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for LongEnum {\n    type Scalar = u64;\n\n    #[inline]\n    fn to_little_endian(self) -> u64 {\n        self.bits().to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: u64) -> Self {\n        let b = u64::from_le(v);\n        Self::from_bits_retain(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for LongEnum {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        u64::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for LongEnum {}\n"
  },
  {
    "path": "tests/monster_test/my_game/example/monster_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum MonsterOffset {}\n\n/// an example documentation comment: \"monster object\"\n#[derive(Copy, Clone, PartialEq)]\npub struct Monster<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Monster<'a> {\n    type Inner = Monster<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> Monster<'a> {\n    pub const VT_POS: ::flatbuffers::VOffsetT = 4;\n    pub const VT_MANA: ::flatbuffers::VOffsetT = 6;\n    pub const VT_HP: ::flatbuffers::VOffsetT = 8;\n    pub const VT_NAME: ::flatbuffers::VOffsetT = 10;\n    pub const VT_INVENTORY: ::flatbuffers::VOffsetT = 14;\n    pub const VT_COLOR: ::flatbuffers::VOffsetT = 16;\n    pub const VT_TEST_TYPE: ::flatbuffers::VOffsetT = 18;\n    pub const VT_TEST: ::flatbuffers::VOffsetT = 20;\n    pub const VT_TEST4: ::flatbuffers::VOffsetT = 22;\n    pub const VT_TESTARRAYOFSTRING: ::flatbuffers::VOffsetT = 24;\n    pub const VT_TESTARRAYOFTABLES: ::flatbuffers::VOffsetT = 26;\n    pub const VT_ENEMY: ::flatbuffers::VOffsetT = 28;\n    pub const VT_TESTNESTEDFLATBUFFER: ::flatbuffers::VOffsetT = 30;\n    pub const VT_TESTEMPTY: ::flatbuffers::VOffsetT = 32;\n    pub const VT_TESTBOOL: ::flatbuffers::VOffsetT = 34;\n    pub const VT_TESTHASHS32_FNV1: ::flatbuffers::VOffsetT = 36;\n    pub const VT_TESTHASHU32_FNV1: ::flatbuffers::VOffsetT = 38;\n    pub const VT_TESTHASHS64_FNV1: ::flatbuffers::VOffsetT = 40;\n    pub const VT_TESTHASHU64_FNV1: ::flatbuffers::VOffsetT = 42;\n    pub const VT_TESTHASHS32_FNV1A: ::flatbuffers::VOffsetT = 44;\n    pub const VT_TESTHASHU32_FNV1A: ::flatbuffers::VOffsetT = 46;\n    pub const VT_TESTHASHS64_FNV1A: ::flatbuffers::VOffsetT = 48;\n    pub const VT_TESTHASHU64_FNV1A: ::flatbuffers::VOffsetT = 50;\n    pub const VT_TESTARRAYOFBOOLS: ::flatbuffers::VOffsetT = 52;\n    pub const VT_TESTF: ::flatbuffers::VOffsetT = 54;\n    pub const VT_TESTF2: ::flatbuffers::VOffsetT = 56;\n    pub const VT_TESTF3: ::flatbuffers::VOffsetT = 58;\n    pub const VT_TESTARRAYOFSTRING2: ::flatbuffers::VOffsetT = 60;\n    pub const VT_TESTARRAYOFSORTEDSTRUCT: ::flatbuffers::VOffsetT = 62;\n    pub const VT_FLEX: ::flatbuffers::VOffsetT = 64;\n    pub const VT_TEST5: ::flatbuffers::VOffsetT = 66;\n    pub const VT_VECTOR_OF_LONGS: ::flatbuffers::VOffsetT = 68;\n    pub const VT_VECTOR_OF_DOUBLES: ::flatbuffers::VOffsetT = 70;\n    pub const VT_PARENT_NAMESPACE_TEST: ::flatbuffers::VOffsetT = 72;\n    pub const VT_VECTOR_OF_REFERRABLES: ::flatbuffers::VOffsetT = 74;\n    pub const VT_SINGLE_WEAK_REFERENCE: ::flatbuffers::VOffsetT = 76;\n    pub const VT_VECTOR_OF_WEAK_REFERENCES: ::flatbuffers::VOffsetT = 78;\n    pub const VT_VECTOR_OF_STRONG_REFERRABLES: ::flatbuffers::VOffsetT = 80;\n    pub const VT_CO_OWNING_REFERENCE: ::flatbuffers::VOffsetT = 82;\n    pub const VT_VECTOR_OF_CO_OWNING_REFERENCES: ::flatbuffers::VOffsetT = 84;\n    pub const VT_NON_OWNING_REFERENCE: ::flatbuffers::VOffsetT = 86;\n    pub const VT_VECTOR_OF_NON_OWNING_REFERENCES: ::flatbuffers::VOffsetT = 88;\n    pub const VT_ANY_UNIQUE_TYPE: ::flatbuffers::VOffsetT = 90;\n    pub const VT_ANY_UNIQUE: ::flatbuffers::VOffsetT = 92;\n    pub const VT_ANY_AMBIGUOUS_TYPE: ::flatbuffers::VOffsetT = 94;\n    pub const VT_ANY_AMBIGUOUS: ::flatbuffers::VOffsetT = 96;\n    pub const VT_VECTOR_OF_ENUMS: ::flatbuffers::VOffsetT = 98;\n    pub const VT_SIGNED_ENUM: ::flatbuffers::VOffsetT = 100;\n    pub const VT_TESTREQUIREDNESTEDFLATBUFFER: ::flatbuffers::VOffsetT = 102;\n    pub const VT_SCALAR_KEY_SORTED_TABLES: ::flatbuffers::VOffsetT = 104;\n    pub const VT_NATIVE_INLINE: ::flatbuffers::VOffsetT = 106;\n    pub const VT_LONG_ENUM_NON_ENUM_DEFAULT: ::flatbuffers::VOffsetT = 108;\n    pub const VT_LONG_ENUM_NORMAL_DEFAULT: ::flatbuffers::VOffsetT = 110;\n    pub const VT_NAN_DEFAULT: ::flatbuffers::VOffsetT = 112;\n    pub const VT_INF_DEFAULT: ::flatbuffers::VOffsetT = 114;\n    pub const VT_POSITIVE_INF_DEFAULT: ::flatbuffers::VOffsetT = 116;\n    pub const VT_INFINITY_DEFAULT: ::flatbuffers::VOffsetT = 118;\n    pub const VT_POSITIVE_INFINITY_DEFAULT: ::flatbuffers::VOffsetT = 120;\n    pub const VT_NEGATIVE_INF_DEFAULT: ::flatbuffers::VOffsetT = 122;\n    pub const VT_NEGATIVE_INFINITY_DEFAULT: ::flatbuffers::VOffsetT = 124;\n    pub const VT_DOUBLE_INF_DEFAULT: ::flatbuffers::VOffsetT = 126;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.Example.Monster\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        Monster { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args MonsterArgs<'args>\n    ) -> ::flatbuffers::WIPOffset<Monster<'bldr>> {\n        let mut builder = MonsterBuilder::new(_fbb);\n        builder.add_double_inf_default(args.double_inf_default);\n        builder.add_long_enum_normal_default(args.long_enum_normal_default);\n        builder.add_long_enum_non_enum_default(args.long_enum_non_enum_default);\n        builder.add_non_owning_reference(args.non_owning_reference);\n        builder.add_co_owning_reference(args.co_owning_reference);\n        builder.add_single_weak_reference(args.single_weak_reference);\n        builder.add_testhashu64_fnv1a(args.testhashu64_fnv1a);\n        builder.add_testhashs64_fnv1a(args.testhashs64_fnv1a);\n        builder.add_testhashu64_fnv1(args.testhashu64_fnv1);\n        builder.add_testhashs64_fnv1(args.testhashs64_fnv1);\n        builder.add_negative_infinity_default(args.negative_infinity_default);\n        builder.add_negative_inf_default(args.negative_inf_default);\n        builder.add_positive_infinity_default(args.positive_infinity_default);\n        builder.add_infinity_default(args.infinity_default);\n        builder.add_positive_inf_default(args.positive_inf_default);\n        builder.add_inf_default(args.inf_default);\n        builder.add_nan_default(args.nan_default);\n        if let Some(x) = args.native_inline { builder.add_native_inline(x); }\n        if let Some(x) = args.scalar_key_sorted_tables { builder.add_scalar_key_sorted_tables(x); }\n        if let Some(x) = args.testrequirednestedflatbuffer { builder.add_testrequirednestedflatbuffer(x); }\n        if let Some(x) = args.vector_of_enums { builder.add_vector_of_enums(x); }\n        if let Some(x) = args.any_ambiguous { builder.add_any_ambiguous(x); }\n        if let Some(x) = args.any_unique { builder.add_any_unique(x); }\n        if let Some(x) = args.vector_of_non_owning_references { builder.add_vector_of_non_owning_references(x); }\n        if let Some(x) = args.vector_of_co_owning_references { builder.add_vector_of_co_owning_references(x); }\n        if let Some(x) = args.vector_of_strong_referrables { builder.add_vector_of_strong_referrables(x); }\n        if let Some(x) = args.vector_of_weak_references { builder.add_vector_of_weak_references(x); }\n        if let Some(x) = args.vector_of_referrables { builder.add_vector_of_referrables(x); }\n        if let Some(x) = args.parent_namespace_test { builder.add_parent_namespace_test(x); }\n        if let Some(x) = args.vector_of_doubles { builder.add_vector_of_doubles(x); }\n        if let Some(x) = args.vector_of_longs { builder.add_vector_of_longs(x); }\n        if let Some(x) = args.test5 { builder.add_test5(x); }\n        if let Some(x) = args.flex { builder.add_flex(x); }\n        if let Some(x) = args.testarrayofsortedstruct { builder.add_testarrayofsortedstruct(x); }\n        if let Some(x) = args.testarrayofstring2 { builder.add_testarrayofstring2(x); }\n        builder.add_testf3(args.testf3);\n        builder.add_testf2(args.testf2);\n        builder.add_testf(args.testf);\n        if let Some(x) = args.testarrayofbools { builder.add_testarrayofbools(x); }\n        builder.add_testhashu32_fnv1a(args.testhashu32_fnv1a);\n        builder.add_testhashs32_fnv1a(args.testhashs32_fnv1a);\n        builder.add_testhashu32_fnv1(args.testhashu32_fnv1);\n        builder.add_testhashs32_fnv1(args.testhashs32_fnv1);\n        if let Some(x) = args.testempty { builder.add_testempty(x); }\n        if let Some(x) = args.testnestedflatbuffer { builder.add_testnestedflatbuffer(x); }\n        if let Some(x) = args.enemy { builder.add_enemy(x); }\n        if let Some(x) = args.testarrayoftables { builder.add_testarrayoftables(x); }\n        if let Some(x) = args.testarrayofstring { builder.add_testarrayofstring(x); }\n        if let Some(x) = args.test4 { builder.add_test4(x); }\n        if let Some(x) = args.test { builder.add_test(x); }\n        if let Some(x) = args.inventory { builder.add_inventory(x); }\n        if let Some(x) = args.name { builder.add_name(x); }\n        if let Some(x) = args.pos { builder.add_pos(x); }\n        builder.add_hp(args.hp);\n        builder.add_mana(args.mana);\n        builder.add_signed_enum(args.signed_enum);\n        builder.add_any_ambiguous_type(args.any_ambiguous_type);\n        builder.add_any_unique_type(args.any_unique_type);\n        builder.add_testbool(args.testbool);\n        builder.add_test_type(args.test_type);\n        builder.add_color(args.color);\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> MonsterT {\n        let pos = self.pos().map(|x| {\n            x.unpack()\n        });\n        let mana = self.mana();\n        let hp = self.hp();\n        let name = {\n            let x = self.name();\n            alloc::string::ToString::to_string(x)\n        };\n        let inventory = self.inventory().map(|x| {\n            x.into_iter().collect()\n        });\n        let color = self.color();\n        let test = match self.test_type() {\n            Any::NONE => AnyT::NONE,\n            Any::Monster => AnyT::Monster(alloc::boxed::Box::new(\n                self.test_as_monster()\n                    .expect(\"Invalid union table, expected `Any::Monster`.\")\n                    .unpack()\n            )),\n            Any::TestSimpleTableWithEnum => AnyT::TestSimpleTableWithEnum(alloc::boxed::Box::new(\n                self.test_as_test_simple_table_with_enum()\n                    .expect(\"Invalid union table, expected `Any::TestSimpleTableWithEnum`.\")\n                    .unpack()\n            )),\n            Any::MyGame_Example2_Monster => AnyT::MyGameExample2Monster(alloc::boxed::Box::new(\n                self.test_as_my_game_example_2_monster()\n                    .expect(\"Invalid union table, expected `Any::MyGame_Example2_Monster`.\")\n                    .unpack()\n            )),\n            _ => AnyT::NONE,\n        };\n        let test4 = self.test4().map(|x| {\n            x.iter().map(|t| t.unpack()).collect()\n        });\n        let testarrayofstring = self.testarrayofstring().map(|x| {\n            x.iter().map(|s| alloc::string::ToString::to_string(s)).collect()\n        });\n        let testarrayoftables = self.testarrayoftables().map(|x| {\n            x.iter().map(|t| t.unpack()).collect()\n        });\n        let enemy = self.enemy().map(|x| {\n            alloc::boxed::Box::new(x.unpack())\n        });\n        let testnestedflatbuffer = self.testnestedflatbuffer().map(|x| {\n            x.into_iter().collect()\n        });\n        let testempty = self.testempty().map(|x| {\n            alloc::boxed::Box::new(x.unpack())\n        });\n        let testbool = self.testbool();\n        let testhashs32_fnv1 = self.testhashs32_fnv1();\n        let testhashu32_fnv1 = self.testhashu32_fnv1();\n        let testhashs64_fnv1 = self.testhashs64_fnv1();\n        let testhashu64_fnv1 = self.testhashu64_fnv1();\n        let testhashs32_fnv1a = self.testhashs32_fnv1a();\n        let testhashu32_fnv1a = self.testhashu32_fnv1a();\n        let testhashs64_fnv1a = self.testhashs64_fnv1a();\n        let testhashu64_fnv1a = self.testhashu64_fnv1a();\n        let testarrayofbools = self.testarrayofbools().map(|x| {\n            x.into_iter().collect()\n        });\n        let testf = self.testf();\n        let testf2 = self.testf2();\n        let testf3 = self.testf3();\n        let testarrayofstring2 = self.testarrayofstring2().map(|x| {\n            x.iter().map(|s| alloc::string::ToString::to_string(s)).collect()\n        });\n        let testarrayofsortedstruct = self.testarrayofsortedstruct().map(|x| {\n            x.iter().map(|t| t.unpack()).collect()\n        });\n        let flex = self.flex().map(|x| {\n            x.into_iter().collect()\n        });\n        let test5 = self.test5().map(|x| {\n            x.iter().map(|t| t.unpack()).collect()\n        });\n        let vector_of_longs = self.vector_of_longs().map(|x| {\n            x.into_iter().collect()\n        });\n        let vector_of_doubles = self.vector_of_doubles().map(|x| {\n            x.into_iter().collect()\n        });\n        let parent_namespace_test = self.parent_namespace_test().map(|x| {\n            alloc::boxed::Box::new(x.unpack())\n        });\n        let vector_of_referrables = self.vector_of_referrables().map(|x| {\n            x.iter().map(|t| t.unpack()).collect()\n        });\n        let single_weak_reference = self.single_weak_reference();\n        let vector_of_weak_references = self.vector_of_weak_references().map(|x| {\n            x.into_iter().collect()\n        });\n        let vector_of_strong_referrables = self.vector_of_strong_referrables().map(|x| {\n            x.iter().map(|t| t.unpack()).collect()\n        });\n        let co_owning_reference = self.co_owning_reference();\n        let vector_of_co_owning_references = self.vector_of_co_owning_references().map(|x| {\n            x.into_iter().collect()\n        });\n        let non_owning_reference = self.non_owning_reference();\n        let vector_of_non_owning_references = self.vector_of_non_owning_references().map(|x| {\n            x.into_iter().collect()\n        });\n        let any_unique = match self.any_unique_type() {\n            AnyUniqueAliases::NONE => AnyUniqueAliasesT::NONE,\n            AnyUniqueAliases::M => AnyUniqueAliasesT::M(alloc::boxed::Box::new(\n                self.any_unique_as_m()\n                    .expect(\"Invalid union table, expected `AnyUniqueAliases::M`.\")\n                    .unpack()\n            )),\n            AnyUniqueAliases::TS => AnyUniqueAliasesT::TS(alloc::boxed::Box::new(\n                self.any_unique_as_ts()\n                    .expect(\"Invalid union table, expected `AnyUniqueAliases::TS`.\")\n                    .unpack()\n            )),\n            AnyUniqueAliases::M2 => AnyUniqueAliasesT::M2(alloc::boxed::Box::new(\n                self.any_unique_as_m2()\n                    .expect(\"Invalid union table, expected `AnyUniqueAliases::M2`.\")\n                    .unpack()\n            )),\n            _ => AnyUniqueAliasesT::NONE,\n        };\n        let any_ambiguous = match self.any_ambiguous_type() {\n            AnyAmbiguousAliases::NONE => AnyAmbiguousAliasesT::NONE,\n            AnyAmbiguousAliases::M1 => AnyAmbiguousAliasesT::M1(alloc::boxed::Box::new(\n                self.any_ambiguous_as_m1()\n                    .expect(\"Invalid union table, expected `AnyAmbiguousAliases::M1`.\")\n                    .unpack()\n            )),\n            AnyAmbiguousAliases::M2 => AnyAmbiguousAliasesT::M2(alloc::boxed::Box::new(\n                self.any_ambiguous_as_m2()\n                    .expect(\"Invalid union table, expected `AnyAmbiguousAliases::M2`.\")\n                    .unpack()\n            )),\n            AnyAmbiguousAliases::M3 => AnyAmbiguousAliasesT::M3(alloc::boxed::Box::new(\n                self.any_ambiguous_as_m3()\n                    .expect(\"Invalid union table, expected `AnyAmbiguousAliases::M3`.\")\n                    .unpack()\n            )),\n            _ => AnyAmbiguousAliasesT::NONE,\n        };\n        let vector_of_enums = self.vector_of_enums().map(|x| {\n            x.into_iter().collect()\n        });\n        let signed_enum = self.signed_enum();\n        let testrequirednestedflatbuffer = self.testrequirednestedflatbuffer().map(|x| {\n            x.into_iter().collect()\n        });\n        let scalar_key_sorted_tables = self.scalar_key_sorted_tables().map(|x| {\n            x.iter().map(|t| t.unpack()).collect()\n        });\n        let native_inline = self.native_inline().map(|x| {\n            x.unpack()\n        });\n        let long_enum_non_enum_default = self.long_enum_non_enum_default();\n        let long_enum_normal_default = self.long_enum_normal_default();\n        let nan_default = self.nan_default();\n        let inf_default = self.inf_default();\n        let positive_inf_default = self.positive_inf_default();\n        let infinity_default = self.infinity_default();\n        let positive_infinity_default = self.positive_infinity_default();\n        let negative_inf_default = self.negative_inf_default();\n        let negative_infinity_default = self.negative_infinity_default();\n        let double_inf_default = self.double_inf_default();\n        MonsterT {\n            pos,\n            mana,\n            hp,\n            name,\n            inventory,\n            color,\n            test,\n            test4,\n            testarrayofstring,\n            testarrayoftables,\n            enemy,\n            testnestedflatbuffer,\n            testempty,\n            testbool,\n            testhashs32_fnv1,\n            testhashu32_fnv1,\n            testhashs64_fnv1,\n            testhashu64_fnv1,\n            testhashs32_fnv1a,\n            testhashu32_fnv1a,\n            testhashs64_fnv1a,\n            testhashu64_fnv1a,\n            testarrayofbools,\n            testf,\n            testf2,\n            testf3,\n            testarrayofstring2,\n            testarrayofsortedstruct,\n            flex,\n            test5,\n            vector_of_longs,\n            vector_of_doubles,\n            parent_namespace_test,\n            vector_of_referrables,\n            single_weak_reference,\n            vector_of_weak_references,\n            vector_of_strong_referrables,\n            co_owning_reference,\n            vector_of_co_owning_references,\n            non_owning_reference,\n            vector_of_non_owning_references,\n            any_unique,\n            any_ambiguous,\n            vector_of_enums,\n            signed_enum,\n            testrequirednestedflatbuffer,\n            scalar_key_sorted_tables,\n            native_inline,\n            long_enum_non_enum_default,\n            long_enum_normal_default,\n            nan_default,\n            inf_default,\n            positive_inf_default,\n            infinity_default,\n            positive_infinity_default,\n            negative_inf_default,\n            negative_infinity_default,\n            double_inf_default,\n        }\n    }\n\n    #[inline]\n    pub fn pos(&self) -> Option<&'a Vec3> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<Vec3>(Monster::VT_POS, None)}\n    }\n\n    #[inline]\n    pub fn mana(&self) -> i16 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i16>(Monster::VT_MANA, Some(150)).unwrap()}\n    }\n\n    #[inline]\n    pub fn hp(&self) -> i16 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i16>(Monster::VT_HP, Some(100)).unwrap()}\n    }\n\n    #[inline]\n    pub fn name(&self) -> &'a str {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<&str>>(Monster::VT_NAME, None).unwrap()}\n    }\n\n    #[inline]\n    pub fn key_compare_less_than(&self, o: &Monster) -> bool {\n        self.name() < o.name()\n    }\n\n    #[inline]\n    pub fn key_compare_with_value(&self, val: & str) -> ::core::cmp::Ordering {\n        let key = self.name();\n        key.cmp(val)\n    }\n\n    #[inline]\n    pub fn inventory(&self) -> Option<::flatbuffers::Vector<'a, u8>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, u8>>>(Monster::VT_INVENTORY, None)}\n    }\n\n    #[inline]\n    pub fn color(&self) -> Color {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<Color>(Monster::VT_COLOR, Some(Color::Blue)).unwrap()}\n    }\n\n    #[inline]\n    pub fn test_type(&self) -> Any {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<Any>(Monster::VT_TEST_TYPE, Some(Any::NONE)).unwrap()}\n    }\n\n    #[inline]\n    pub fn test(&self) -> Option<::flatbuffers::Table<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Table<'a>>>(Monster::VT_TEST, None)}\n    }\n\n    #[inline]\n    pub fn test4(&self) -> Option<::flatbuffers::Vector<'a, Test>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, Test>>>(Monster::VT_TEST4, None)}\n    }\n\n    #[inline]\n    pub fn testarrayofstring(&self) -> Option<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<&'a str>>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<&'a str>>>>(Monster::VT_TESTARRAYOFSTRING, None)}\n    }\n\n    /// an example documentation comment: this will end up in the generated code\n    /// multiline too\n    #[inline]\n    pub fn testarrayoftables(&self) -> Option<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Monster<'a>>>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Monster>>>>(Monster::VT_TESTARRAYOFTABLES, None)}\n    }\n\n    #[inline]\n    pub fn enemy(&self) -> Option<Monster<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<Monster>>(Monster::VT_ENEMY, None)}\n    }\n\n    #[inline]\n    pub fn testnestedflatbuffer(&self) -> Option<::flatbuffers::Vector<'a, u8>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, u8>>>(Monster::VT_TESTNESTEDFLATBUFFER, None)}\n    }\n\n    pub fn testnestedflatbuffer_nested_flatbuffer(&'a self) -> Option<Monster<'a>> {\n        self.testnestedflatbuffer().map(|data| {\n            use ::flatbuffers::Follow;\n            // Safety:\n            // Created from a valid Table for this object\n            // Which contains a valid flatbuffer in this slot\n            unsafe { <::flatbuffers::ForwardsUOffset<Monster<'a>>>::follow(data.bytes(), 0) }\n        })\n    }\n\n    #[inline]\n    pub fn testempty(&self) -> Option<Stat<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<Stat>>(Monster::VT_TESTEMPTY, None)}\n    }\n\n    #[inline]\n    pub fn testbool(&self) -> bool {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<bool>(Monster::VT_TESTBOOL, Some(false)).unwrap()}\n    }\n\n    #[inline]\n    pub fn testhashs32_fnv1(&self) -> i32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i32>(Monster::VT_TESTHASHS32_FNV1, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn testhashu32_fnv1(&self) -> u32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u32>(Monster::VT_TESTHASHU32_FNV1, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn testhashs64_fnv1(&self) -> i64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i64>(Monster::VT_TESTHASHS64_FNV1, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn testhashu64_fnv1(&self) -> u64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u64>(Monster::VT_TESTHASHU64_FNV1, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn testhashs32_fnv1a(&self) -> i32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i32>(Monster::VT_TESTHASHS32_FNV1A, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn testhashu32_fnv1a(&self) -> u32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u32>(Monster::VT_TESTHASHU32_FNV1A, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn testhashs64_fnv1a(&self) -> i64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i64>(Monster::VT_TESTHASHS64_FNV1A, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn testhashu64_fnv1a(&self) -> u64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u64>(Monster::VT_TESTHASHU64_FNV1A, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn testarrayofbools(&self) -> Option<::flatbuffers::Vector<'a, bool>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, bool>>>(Monster::VT_TESTARRAYOFBOOLS, None)}\n    }\n\n    #[inline]\n    pub fn testf(&self) -> f32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f32>(Monster::VT_TESTF, Some(3.14159)).unwrap()}\n    }\n\n    #[inline]\n    pub fn testf2(&self) -> f32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f32>(Monster::VT_TESTF2, Some(3.0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn testf3(&self) -> f32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f32>(Monster::VT_TESTF3, Some(0.0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn testarrayofstring2(&self) -> Option<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<&'a str>>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<&'a str>>>>(Monster::VT_TESTARRAYOFSTRING2, None)}\n    }\n\n    #[inline]\n    pub fn testarrayofsortedstruct(&self) -> Option<::flatbuffers::Vector<'a, Ability>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, Ability>>>(Monster::VT_TESTARRAYOFSORTEDSTRUCT, None)}\n    }\n\n    #[inline]\n    pub fn flex(&self) -> Option<::flatbuffers::Vector<'a, u8>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, u8>>>(Monster::VT_FLEX, None)}\n    }\n\n    #[inline]\n    pub fn test5(&self) -> Option<::flatbuffers::Vector<'a, Test>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, Test>>>(Monster::VT_TEST5, None)}\n    }\n\n    #[inline]\n    pub fn vector_of_longs(&self) -> Option<::flatbuffers::Vector<'a, i64>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, i64>>>(Monster::VT_VECTOR_OF_LONGS, None)}\n    }\n\n    #[inline]\n    pub fn vector_of_doubles(&self) -> Option<::flatbuffers::Vector<'a, f64>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, f64>>>(Monster::VT_VECTOR_OF_DOUBLES, None)}\n    }\n\n    #[inline]\n    pub fn parent_namespace_test(&self) -> Option<super::InParentNamespace<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<super::InParentNamespace>>(Monster::VT_PARENT_NAMESPACE_TEST, None)}\n    }\n\n    #[inline]\n    pub fn vector_of_referrables(&self) -> Option<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Referrable<'a>>>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Referrable>>>>(Monster::VT_VECTOR_OF_REFERRABLES, None)}\n    }\n\n    #[inline]\n    pub fn single_weak_reference(&self) -> u64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u64>(Monster::VT_SINGLE_WEAK_REFERENCE, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn vector_of_weak_references(&self) -> Option<::flatbuffers::Vector<'a, u64>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, u64>>>(Monster::VT_VECTOR_OF_WEAK_REFERENCES, None)}\n    }\n\n    #[inline]\n    pub fn vector_of_strong_referrables(&self) -> Option<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Referrable<'a>>>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Referrable>>>>(Monster::VT_VECTOR_OF_STRONG_REFERRABLES, None)}\n    }\n\n    #[inline]\n    pub fn co_owning_reference(&self) -> u64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u64>(Monster::VT_CO_OWNING_REFERENCE, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn vector_of_co_owning_references(&self) -> Option<::flatbuffers::Vector<'a, u64>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, u64>>>(Monster::VT_VECTOR_OF_CO_OWNING_REFERENCES, None)}\n    }\n\n    #[inline]\n    pub fn non_owning_reference(&self) -> u64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u64>(Monster::VT_NON_OWNING_REFERENCE, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn vector_of_non_owning_references(&self) -> Option<::flatbuffers::Vector<'a, u64>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, u64>>>(Monster::VT_VECTOR_OF_NON_OWNING_REFERENCES, None)}\n    }\n\n    #[inline]\n    pub fn any_unique_type(&self) -> AnyUniqueAliases {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<AnyUniqueAliases>(Monster::VT_ANY_UNIQUE_TYPE, Some(AnyUniqueAliases::NONE)).unwrap()}\n    }\n\n    #[inline]\n    pub fn any_unique(&self) -> Option<::flatbuffers::Table<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Table<'a>>>(Monster::VT_ANY_UNIQUE, None)}\n    }\n\n    #[inline]\n    pub fn any_ambiguous_type(&self) -> AnyAmbiguousAliases {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<AnyAmbiguousAliases>(Monster::VT_ANY_AMBIGUOUS_TYPE, Some(AnyAmbiguousAliases::NONE)).unwrap()}\n    }\n\n    #[inline]\n    pub fn any_ambiguous(&self) -> Option<::flatbuffers::Table<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Table<'a>>>(Monster::VT_ANY_AMBIGUOUS, None)}\n    }\n\n    #[inline]\n    pub fn vector_of_enums(&self) -> Option<::flatbuffers::Vector<'a, Color>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, Color>>>(Monster::VT_VECTOR_OF_ENUMS, None)}\n    }\n\n    #[inline]\n    pub fn signed_enum(&self) -> Race {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<Race>(Monster::VT_SIGNED_ENUM, Some(Race::None)).unwrap()}\n    }\n\n    #[inline]\n    pub fn testrequirednestedflatbuffer(&self) -> Option<::flatbuffers::Vector<'a, u8>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, u8>>>(Monster::VT_TESTREQUIREDNESTEDFLATBUFFER, None)}\n    }\n\n    pub fn testrequirednestedflatbuffer_nested_flatbuffer(&'a self) -> Option<Monster<'a>> {\n        self.testrequirednestedflatbuffer().map(|data| {\n            use ::flatbuffers::Follow;\n            // Safety:\n            // Created from a valid Table for this object\n            // Which contains a valid flatbuffer in this slot\n            unsafe { <::flatbuffers::ForwardsUOffset<Monster<'a>>>::follow(data.bytes(), 0) }\n        })\n    }\n\n    #[inline]\n    pub fn scalar_key_sorted_tables(&self) -> Option<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Stat<'a>>>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Stat>>>>(Monster::VT_SCALAR_KEY_SORTED_TABLES, None)}\n    }\n\n    #[inline]\n    pub fn native_inline(&self) -> Option<&'a Test> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<Test>(Monster::VT_NATIVE_INLINE, None)}\n    }\n\n    #[inline]\n    pub fn long_enum_non_enum_default(&self) -> LongEnum {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<LongEnum>(Monster::VT_LONG_ENUM_NON_ENUM_DEFAULT, Some(Default::default())).unwrap()}\n    }\n\n    #[inline]\n    pub fn long_enum_normal_default(&self) -> LongEnum {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<LongEnum>(Monster::VT_LONG_ENUM_NORMAL_DEFAULT, Some(LongEnum::LongOne)).unwrap()}\n    }\n\n    #[inline]\n    pub fn nan_default(&self) -> f32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f32>(Monster::VT_NAN_DEFAULT, Some(f32::NAN)).unwrap()}\n    }\n\n    #[inline]\n    pub fn inf_default(&self) -> f32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f32>(Monster::VT_INF_DEFAULT, Some(f32::INFINITY)).unwrap()}\n    }\n\n    #[inline]\n    pub fn positive_inf_default(&self) -> f32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f32>(Monster::VT_POSITIVE_INF_DEFAULT, Some(f32::INFINITY)).unwrap()}\n    }\n\n    #[inline]\n    pub fn infinity_default(&self) -> f32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f32>(Monster::VT_INFINITY_DEFAULT, Some(f32::INFINITY)).unwrap()}\n    }\n\n    #[inline]\n    pub fn positive_infinity_default(&self) -> f32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f32>(Monster::VT_POSITIVE_INFINITY_DEFAULT, Some(f32::INFINITY)).unwrap()}\n    }\n\n    #[inline]\n    pub fn negative_inf_default(&self) -> f32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f32>(Monster::VT_NEGATIVE_INF_DEFAULT, Some(f32::NEG_INFINITY)).unwrap()}\n    }\n\n    #[inline]\n    pub fn negative_infinity_default(&self) -> f32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f32>(Monster::VT_NEGATIVE_INFINITY_DEFAULT, Some(f32::NEG_INFINITY)).unwrap()}\n    }\n\n    #[inline]\n    pub fn double_inf_default(&self) -> f64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f64>(Monster::VT_DOUBLE_INF_DEFAULT, Some(f64::INFINITY)).unwrap()}\n    }\n\n    #[inline]\n    #[allow(non_snake_case)]\n    pub fn test_as_monster(&self) -> Option<Monster<'a>> {\n        if self.test_type() == Any::Monster {\n            self.test().map(|t| {\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid union in this slot\n                unsafe { Monster::init_from_table(t) }\n            })\n        } else {\n            None\n        }\n    }\n\n    #[inline]\n    #[allow(non_snake_case)]\n    pub fn test_as_test_simple_table_with_enum(&self) -> Option<TestSimpleTableWithEnum<'a>> {\n        if self.test_type() == Any::TestSimpleTableWithEnum {\n            self.test().map(|t| {\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid union in this slot\n                unsafe { TestSimpleTableWithEnum::init_from_table(t) }\n            })\n        } else {\n            None\n        }\n    }\n\n    #[inline]\n    #[allow(non_snake_case)]\n    pub fn test_as_my_game_example_2_monster(&self) -> Option<super::example_2::Monster<'a>> {\n        if self.test_type() == Any::MyGame_Example2_Monster {\n            self.test().map(|t| {\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid union in this slot\n                unsafe { super::example_2::Monster::init_from_table(t) }\n            })\n        } else {\n            None\n        }\n    }\n\n    #[inline]\n    #[allow(non_snake_case)]\n    pub fn any_unique_as_m(&self) -> Option<Monster<'a>> {\n        if self.any_unique_type() == AnyUniqueAliases::M {\n            self.any_unique().map(|t| {\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid union in this slot\n                unsafe { Monster::init_from_table(t) }\n            })\n        } else {\n            None\n        }\n    }\n\n    #[inline]\n    #[allow(non_snake_case)]\n    pub fn any_unique_as_ts(&self) -> Option<TestSimpleTableWithEnum<'a>> {\n        if self.any_unique_type() == AnyUniqueAliases::TS {\n            self.any_unique().map(|t| {\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid union in this slot\n                unsafe { TestSimpleTableWithEnum::init_from_table(t) }\n            })\n        } else {\n            None\n        }\n    }\n\n    #[inline]\n    #[allow(non_snake_case)]\n    pub fn any_unique_as_m2(&self) -> Option<super::example_2::Monster<'a>> {\n        if self.any_unique_type() == AnyUniqueAliases::M2 {\n            self.any_unique().map(|t| {\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid union in this slot\n                unsafe { super::example_2::Monster::init_from_table(t) }\n            })\n        } else {\n            None\n        }\n    }\n\n    #[inline]\n    #[allow(non_snake_case)]\n    pub fn any_ambiguous_as_m1(&self) -> Option<Monster<'a>> {\n        if self.any_ambiguous_type() == AnyAmbiguousAliases::M1 {\n            self.any_ambiguous().map(|t| {\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid union in this slot\n                unsafe { Monster::init_from_table(t) }\n            })\n        } else {\n            None\n        }\n    }\n\n    #[inline]\n    #[allow(non_snake_case)]\n    pub fn any_ambiguous_as_m2(&self) -> Option<Monster<'a>> {\n        if self.any_ambiguous_type() == AnyAmbiguousAliases::M2 {\n            self.any_ambiguous().map(|t| {\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid union in this slot\n                unsafe { Monster::init_from_table(t) }\n            })\n        } else {\n            None\n        }\n    }\n\n    #[inline]\n    #[allow(non_snake_case)]\n    pub fn any_ambiguous_as_m3(&self) -> Option<Monster<'a>> {\n        if self.any_ambiguous_type() == AnyAmbiguousAliases::M3 {\n            self.any_ambiguous().map(|t| {\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid union in this slot\n                unsafe { Monster::init_from_table(t) }\n            })\n        } else {\n            None\n        }\n    }\n}\n\nimpl ::flatbuffers::Verifiable for Monster<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<Vec3>(\"pos\", Self::VT_POS, false)?\n            .visit_field::<i16>(\"mana\", Self::VT_MANA, false)?\n            .visit_field::<i16>(\"hp\", Self::VT_HP, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<&str>>(\"name\", Self::VT_NAME, true)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, u8>>>(\"inventory\", Self::VT_INVENTORY, false)?\n            .visit_field::<Color>(\"color\", Self::VT_COLOR, false)?\n            .visit_union::<Any, _>(\"test_type\", Self::VT_TEST_TYPE, \"test\", Self::VT_TEST, false, |key, v, pos| {\n                match key {\n                    Any::Monster => v.verify_union_variant::<::flatbuffers::ForwardsUOffset<Monster>>(\"Any::Monster\", pos),\n                    Any::TestSimpleTableWithEnum => v.verify_union_variant::<::flatbuffers::ForwardsUOffset<TestSimpleTableWithEnum>>(\"Any::TestSimpleTableWithEnum\", pos),\n                    Any::MyGame_Example2_Monster => v.verify_union_variant::<::flatbuffers::ForwardsUOffset<super::example_2::Monster>>(\"Any::MyGame_Example2_Monster\", pos),\n                    _ => Ok(()),\n                }\n            })?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, Test>>>(\"test4\", Self::VT_TEST4, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, ::flatbuffers::ForwardsUOffset<&'_ str>>>>(\"testarrayofstring\", Self::VT_TESTARRAYOFSTRING, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, ::flatbuffers::ForwardsUOffset<Monster>>>>(\"testarrayoftables\", Self::VT_TESTARRAYOFTABLES, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<Monster>>(\"enemy\", Self::VT_ENEMY, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, u8>>>(\"testnestedflatbuffer\", Self::VT_TESTNESTEDFLATBUFFER, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<Stat>>(\"testempty\", Self::VT_TESTEMPTY, false)?\n            .visit_field::<bool>(\"testbool\", Self::VT_TESTBOOL, false)?\n            .visit_field::<i32>(\"testhashs32_fnv1\", Self::VT_TESTHASHS32_FNV1, false)?\n            .visit_field::<u32>(\"testhashu32_fnv1\", Self::VT_TESTHASHU32_FNV1, false)?\n            .visit_field::<i64>(\"testhashs64_fnv1\", Self::VT_TESTHASHS64_FNV1, false)?\n            .visit_field::<u64>(\"testhashu64_fnv1\", Self::VT_TESTHASHU64_FNV1, false)?\n            .visit_field::<i32>(\"testhashs32_fnv1a\", Self::VT_TESTHASHS32_FNV1A, false)?\n            .visit_field::<u32>(\"testhashu32_fnv1a\", Self::VT_TESTHASHU32_FNV1A, false)?\n            .visit_field::<i64>(\"testhashs64_fnv1a\", Self::VT_TESTHASHS64_FNV1A, false)?\n            .visit_field::<u64>(\"testhashu64_fnv1a\", Self::VT_TESTHASHU64_FNV1A, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, bool>>>(\"testarrayofbools\", Self::VT_TESTARRAYOFBOOLS, false)?\n            .visit_field::<f32>(\"testf\", Self::VT_TESTF, false)?\n            .visit_field::<f32>(\"testf2\", Self::VT_TESTF2, false)?\n            .visit_field::<f32>(\"testf3\", Self::VT_TESTF3, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, ::flatbuffers::ForwardsUOffset<&'_ str>>>>(\"testarrayofstring2\", Self::VT_TESTARRAYOFSTRING2, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, Ability>>>(\"testarrayofsortedstruct\", Self::VT_TESTARRAYOFSORTEDSTRUCT, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, u8>>>(\"flex\", Self::VT_FLEX, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, Test>>>(\"test5\", Self::VT_TEST5, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, i64>>>(\"vector_of_longs\", Self::VT_VECTOR_OF_LONGS, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, f64>>>(\"vector_of_doubles\", Self::VT_VECTOR_OF_DOUBLES, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<super::InParentNamespace>>(\"parent_namespace_test\", Self::VT_PARENT_NAMESPACE_TEST, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, ::flatbuffers::ForwardsUOffset<Referrable>>>>(\"vector_of_referrables\", Self::VT_VECTOR_OF_REFERRABLES, false)?\n            .visit_field::<u64>(\"single_weak_reference\", Self::VT_SINGLE_WEAK_REFERENCE, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, u64>>>(\"vector_of_weak_references\", Self::VT_VECTOR_OF_WEAK_REFERENCES, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, ::flatbuffers::ForwardsUOffset<Referrable>>>>(\"vector_of_strong_referrables\", Self::VT_VECTOR_OF_STRONG_REFERRABLES, false)?\n            .visit_field::<u64>(\"co_owning_reference\", Self::VT_CO_OWNING_REFERENCE, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, u64>>>(\"vector_of_co_owning_references\", Self::VT_VECTOR_OF_CO_OWNING_REFERENCES, false)?\n            .visit_field::<u64>(\"non_owning_reference\", Self::VT_NON_OWNING_REFERENCE, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, u64>>>(\"vector_of_non_owning_references\", Self::VT_VECTOR_OF_NON_OWNING_REFERENCES, false)?\n            .visit_union::<AnyUniqueAliases, _>(\"any_unique_type\", Self::VT_ANY_UNIQUE_TYPE, \"any_unique\", Self::VT_ANY_UNIQUE, false, |key, v, pos| {\n                match key {\n                    AnyUniqueAliases::M => v.verify_union_variant::<::flatbuffers::ForwardsUOffset<Monster>>(\"AnyUniqueAliases::M\", pos),\n                    AnyUniqueAliases::TS => v.verify_union_variant::<::flatbuffers::ForwardsUOffset<TestSimpleTableWithEnum>>(\"AnyUniqueAliases::TS\", pos),\n                    AnyUniqueAliases::M2 => v.verify_union_variant::<::flatbuffers::ForwardsUOffset<super::example_2::Monster>>(\"AnyUniqueAliases::M2\", pos),\n                    _ => Ok(()),\n                }\n            })?\n            .visit_union::<AnyAmbiguousAliases, _>(\"any_ambiguous_type\", Self::VT_ANY_AMBIGUOUS_TYPE, \"any_ambiguous\", Self::VT_ANY_AMBIGUOUS, false, |key, v, pos| {\n                match key {\n                    AnyAmbiguousAliases::M1 => v.verify_union_variant::<::flatbuffers::ForwardsUOffset<Monster>>(\"AnyAmbiguousAliases::M1\", pos),\n                    AnyAmbiguousAliases::M2 => v.verify_union_variant::<::flatbuffers::ForwardsUOffset<Monster>>(\"AnyAmbiguousAliases::M2\", pos),\n                    AnyAmbiguousAliases::M3 => v.verify_union_variant::<::flatbuffers::ForwardsUOffset<Monster>>(\"AnyAmbiguousAliases::M3\", pos),\n                    _ => Ok(()),\n                }\n            })?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, Color>>>(\"vector_of_enums\", Self::VT_VECTOR_OF_ENUMS, false)?\n            .visit_field::<Race>(\"signed_enum\", Self::VT_SIGNED_ENUM, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, u8>>>(\"testrequirednestedflatbuffer\", Self::VT_TESTREQUIREDNESTEDFLATBUFFER, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, ::flatbuffers::ForwardsUOffset<Stat>>>>(\"scalar_key_sorted_tables\", Self::VT_SCALAR_KEY_SORTED_TABLES, false)?\n            .visit_field::<Test>(\"native_inline\", Self::VT_NATIVE_INLINE, false)?\n            .visit_field::<LongEnum>(\"long_enum_non_enum_default\", Self::VT_LONG_ENUM_NON_ENUM_DEFAULT, false)?\n            .visit_field::<LongEnum>(\"long_enum_normal_default\", Self::VT_LONG_ENUM_NORMAL_DEFAULT, false)?\n            .visit_field::<f32>(\"nan_default\", Self::VT_NAN_DEFAULT, false)?\n            .visit_field::<f32>(\"inf_default\", Self::VT_INF_DEFAULT, false)?\n            .visit_field::<f32>(\"positive_inf_default\", Self::VT_POSITIVE_INF_DEFAULT, false)?\n            .visit_field::<f32>(\"infinity_default\", Self::VT_INFINITY_DEFAULT, false)?\n            .visit_field::<f32>(\"positive_infinity_default\", Self::VT_POSITIVE_INFINITY_DEFAULT, false)?\n            .visit_field::<f32>(\"negative_inf_default\", Self::VT_NEGATIVE_INF_DEFAULT, false)?\n            .visit_field::<f32>(\"negative_infinity_default\", Self::VT_NEGATIVE_INFINITY_DEFAULT, false)?\n            .visit_field::<f64>(\"double_inf_default\", Self::VT_DOUBLE_INF_DEFAULT, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct MonsterArgs<'a> {\n    pub pos: Option<&'a Vec3>,\n    pub mana: i16,\n    pub hp: i16,\n    pub name: Option<::flatbuffers::WIPOffset<&'a str>>,\n    pub inventory: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, u8>>>,\n    pub color: Color,\n    pub test_type: Any,\n    pub test: Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>>,\n    pub test4: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, Test>>>,\n    pub testarrayofstring: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<&'a str>>>>,\n    pub testarrayoftables: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Monster<'a>>>>>,\n    pub enemy: Option<::flatbuffers::WIPOffset<Monster<'a>>>,\n    pub testnestedflatbuffer: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, u8>>>,\n    pub testempty: Option<::flatbuffers::WIPOffset<Stat<'a>>>,\n    pub testbool: bool,\n    pub testhashs32_fnv1: i32,\n    pub testhashu32_fnv1: u32,\n    pub testhashs64_fnv1: i64,\n    pub testhashu64_fnv1: u64,\n    pub testhashs32_fnv1a: i32,\n    pub testhashu32_fnv1a: u32,\n    pub testhashs64_fnv1a: i64,\n    pub testhashu64_fnv1a: u64,\n    pub testarrayofbools: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, bool>>>,\n    pub testf: f32,\n    pub testf2: f32,\n    pub testf3: f32,\n    pub testarrayofstring2: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<&'a str>>>>,\n    pub testarrayofsortedstruct: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, Ability>>>,\n    pub flex: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, u8>>>,\n    pub test5: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, Test>>>,\n    pub vector_of_longs: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, i64>>>,\n    pub vector_of_doubles: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, f64>>>,\n    pub parent_namespace_test: Option<::flatbuffers::WIPOffset<super::InParentNamespace<'a>>>,\n    pub vector_of_referrables: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Referrable<'a>>>>>,\n    pub single_weak_reference: u64,\n    pub vector_of_weak_references: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, u64>>>,\n    pub vector_of_strong_referrables: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Referrable<'a>>>>>,\n    pub co_owning_reference: u64,\n    pub vector_of_co_owning_references: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, u64>>>,\n    pub non_owning_reference: u64,\n    pub vector_of_non_owning_references: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, u64>>>,\n    pub any_unique_type: AnyUniqueAliases,\n    pub any_unique: Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>>,\n    pub any_ambiguous_type: AnyAmbiguousAliases,\n    pub any_ambiguous: Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>>,\n    pub vector_of_enums: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, Color>>>,\n    pub signed_enum: Race,\n    pub testrequirednestedflatbuffer: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, u8>>>,\n    pub scalar_key_sorted_tables: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Stat<'a>>>>>,\n    pub native_inline: Option<&'a Test>,\n    pub long_enum_non_enum_default: LongEnum,\n    pub long_enum_normal_default: LongEnum,\n    pub nan_default: f32,\n    pub inf_default: f32,\n    pub positive_inf_default: f32,\n    pub infinity_default: f32,\n    pub positive_infinity_default: f32,\n    pub negative_inf_default: f32,\n    pub negative_infinity_default: f32,\n    pub double_inf_default: f64,\n}\n\nimpl<'a> Default for MonsterArgs<'a> {\n    #[inline]\n    fn default() -> Self {\n        MonsterArgs {\n            pos: None,\n            mana: 150,\n            hp: 100,\n            name: None, // required field\n            inventory: None,\n            color: Color::Blue,\n            test_type: Any::NONE,\n            test: None,\n            test4: None,\n            testarrayofstring: None,\n            testarrayoftables: None,\n            enemy: None,\n            testnestedflatbuffer: None,\n            testempty: None,\n            testbool: false,\n            testhashs32_fnv1: 0,\n            testhashu32_fnv1: 0,\n            testhashs64_fnv1: 0,\n            testhashu64_fnv1: 0,\n            testhashs32_fnv1a: 0,\n            testhashu32_fnv1a: 0,\n            testhashs64_fnv1a: 0,\n            testhashu64_fnv1a: 0,\n            testarrayofbools: None,\n            testf: 3.14159,\n            testf2: 3.0,\n            testf3: 0.0,\n            testarrayofstring2: None,\n            testarrayofsortedstruct: None,\n            flex: None,\n            test5: None,\n            vector_of_longs: None,\n            vector_of_doubles: None,\n            parent_namespace_test: None,\n            vector_of_referrables: None,\n            single_weak_reference: 0,\n            vector_of_weak_references: None,\n            vector_of_strong_referrables: None,\n            co_owning_reference: 0,\n            vector_of_co_owning_references: None,\n            non_owning_reference: 0,\n            vector_of_non_owning_references: None,\n            any_unique_type: AnyUniqueAliases::NONE,\n            any_unique: None,\n            any_ambiguous_type: AnyAmbiguousAliases::NONE,\n            any_ambiguous: None,\n            vector_of_enums: None,\n            signed_enum: Race::None,\n            testrequirednestedflatbuffer: None,\n            scalar_key_sorted_tables: None,\n            native_inline: None,\n            long_enum_non_enum_default: Default::default(),\n            long_enum_normal_default: LongEnum::LongOne,\n            nan_default: f32::NAN,\n            inf_default: f32::INFINITY,\n            positive_inf_default: f32::INFINITY,\n            infinity_default: f32::INFINITY,\n            positive_infinity_default: f32::INFINITY,\n            negative_inf_default: f32::NEG_INFINITY,\n            negative_infinity_default: f32::NEG_INFINITY,\n            double_inf_default: f64::INFINITY,\n        }\n    }\n}\n\npub struct MonsterBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> MonsterBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_pos(&mut self, pos: &Vec3) {\n        self.fbb_.push_slot_always::<&Vec3>(Monster::VT_POS, pos);\n    }\n\n    #[inline]\n    pub fn add_mana(&mut self, mana: i16) {\n        self.fbb_.push_slot::<i16>(Monster::VT_MANA, mana, 150);\n    }\n\n    #[inline]\n    pub fn add_hp(&mut self, hp: i16) {\n        self.fbb_.push_slot::<i16>(Monster::VT_HP, hp, 100);\n    }\n\n    #[inline]\n    pub fn add_name(&mut self, name: ::flatbuffers::WIPOffset<&'b  str>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_NAME, name);\n    }\n\n    #[inline]\n    pub fn add_inventory(&mut self, inventory: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , u8>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_INVENTORY, inventory);\n    }\n\n    #[inline]\n    pub fn add_color(&mut self, color: Color) {\n        self.fbb_.push_slot::<Color>(Monster::VT_COLOR, color, Color::Blue);\n    }\n\n    #[inline]\n    pub fn add_test_type(&mut self, test_type: Any) {\n        self.fbb_.push_slot::<Any>(Monster::VT_TEST_TYPE, test_type, Any::NONE);\n    }\n\n    #[inline]\n    pub fn add_test(&mut self, test: ::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_TEST, test);\n    }\n\n    #[inline]\n    pub fn add_test4(&mut self, test4: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , Test>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_TEST4, test4);\n    }\n\n    #[inline]\n    pub fn add_testarrayofstring(&mut self, testarrayofstring: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , ::flatbuffers::ForwardsUOffset<&'b  str>>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_TESTARRAYOFSTRING, testarrayofstring);\n    }\n\n    #[inline]\n    pub fn add_testarrayoftables(&mut self, testarrayoftables: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , ::flatbuffers::ForwardsUOffset<Monster<'b >>>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_TESTARRAYOFTABLES, testarrayoftables);\n    }\n\n    #[inline]\n    pub fn add_enemy(&mut self, enemy: ::flatbuffers::WIPOffset<Monster<'b >>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<Monster>>(Monster::VT_ENEMY, enemy);\n    }\n\n    #[inline]\n    pub fn add_testnestedflatbuffer(&mut self, testnestedflatbuffer: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , u8>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_TESTNESTEDFLATBUFFER, testnestedflatbuffer);\n    }\n\n    #[inline]\n    pub fn add_testempty(&mut self, testempty: ::flatbuffers::WIPOffset<Stat<'b >>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<Stat>>(Monster::VT_TESTEMPTY, testempty);\n    }\n\n    #[inline]\n    pub fn add_testbool(&mut self, testbool: bool) {\n        self.fbb_.push_slot::<bool>(Monster::VT_TESTBOOL, testbool, false);\n    }\n\n    #[inline]\n    pub fn add_testhashs32_fnv1(&mut self, testhashs32_fnv1: i32) {\n        self.fbb_.push_slot::<i32>(Monster::VT_TESTHASHS32_FNV1, testhashs32_fnv1, 0);\n    }\n\n    #[inline]\n    pub fn add_testhashu32_fnv1(&mut self, testhashu32_fnv1: u32) {\n        self.fbb_.push_slot::<u32>(Monster::VT_TESTHASHU32_FNV1, testhashu32_fnv1, 0);\n    }\n\n    #[inline]\n    pub fn add_testhashs64_fnv1(&mut self, testhashs64_fnv1: i64) {\n        self.fbb_.push_slot::<i64>(Monster::VT_TESTHASHS64_FNV1, testhashs64_fnv1, 0);\n    }\n\n    #[inline]\n    pub fn add_testhashu64_fnv1(&mut self, testhashu64_fnv1: u64) {\n        self.fbb_.push_slot::<u64>(Monster::VT_TESTHASHU64_FNV1, testhashu64_fnv1, 0);\n    }\n\n    #[inline]\n    pub fn add_testhashs32_fnv1a(&mut self, testhashs32_fnv1a: i32) {\n        self.fbb_.push_slot::<i32>(Monster::VT_TESTHASHS32_FNV1A, testhashs32_fnv1a, 0);\n    }\n\n    #[inline]\n    pub fn add_testhashu32_fnv1a(&mut self, testhashu32_fnv1a: u32) {\n        self.fbb_.push_slot::<u32>(Monster::VT_TESTHASHU32_FNV1A, testhashu32_fnv1a, 0);\n    }\n\n    #[inline]\n    pub fn add_testhashs64_fnv1a(&mut self, testhashs64_fnv1a: i64) {\n        self.fbb_.push_slot::<i64>(Monster::VT_TESTHASHS64_FNV1A, testhashs64_fnv1a, 0);\n    }\n\n    #[inline]\n    pub fn add_testhashu64_fnv1a(&mut self, testhashu64_fnv1a: u64) {\n        self.fbb_.push_slot::<u64>(Monster::VT_TESTHASHU64_FNV1A, testhashu64_fnv1a, 0);\n    }\n\n    #[inline]\n    pub fn add_testarrayofbools(&mut self, testarrayofbools: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , bool>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_TESTARRAYOFBOOLS, testarrayofbools);\n    }\n\n    #[inline]\n    pub fn add_testf(&mut self, testf: f32) {\n        self.fbb_.push_slot::<f32>(Monster::VT_TESTF, testf, 3.14159);\n    }\n\n    #[inline]\n    pub fn add_testf2(&mut self, testf2: f32) {\n        self.fbb_.push_slot::<f32>(Monster::VT_TESTF2, testf2, 3.0);\n    }\n\n    #[inline]\n    pub fn add_testf3(&mut self, testf3: f32) {\n        self.fbb_.push_slot::<f32>(Monster::VT_TESTF3, testf3, 0.0);\n    }\n\n    #[inline]\n    pub fn add_testarrayofstring2(&mut self, testarrayofstring2: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , ::flatbuffers::ForwardsUOffset<&'b  str>>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_TESTARRAYOFSTRING2, testarrayofstring2);\n    }\n\n    #[inline]\n    pub fn add_testarrayofsortedstruct(&mut self, testarrayofsortedstruct: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , Ability>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_TESTARRAYOFSORTEDSTRUCT, testarrayofsortedstruct);\n    }\n\n    #[inline]\n    pub fn add_flex(&mut self, flex: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , u8>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_FLEX, flex);\n    }\n\n    #[inline]\n    pub fn add_test5(&mut self, test5: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , Test>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_TEST5, test5);\n    }\n\n    #[inline]\n    pub fn add_vector_of_longs(&mut self, vector_of_longs: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , i64>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_VECTOR_OF_LONGS, vector_of_longs);\n    }\n\n    #[inline]\n    pub fn add_vector_of_doubles(&mut self, vector_of_doubles: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , f64>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_VECTOR_OF_DOUBLES, vector_of_doubles);\n    }\n\n    #[inline]\n    pub fn add_parent_namespace_test(&mut self, parent_namespace_test: ::flatbuffers::WIPOffset<super::InParentNamespace<'b >>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<super::InParentNamespace>>(Monster::VT_PARENT_NAMESPACE_TEST, parent_namespace_test);\n    }\n\n    #[inline]\n    pub fn add_vector_of_referrables(&mut self, vector_of_referrables: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , ::flatbuffers::ForwardsUOffset<Referrable<'b >>>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_VECTOR_OF_REFERRABLES, vector_of_referrables);\n    }\n\n    #[inline]\n    pub fn add_single_weak_reference(&mut self, single_weak_reference: u64) {\n        self.fbb_.push_slot::<u64>(Monster::VT_SINGLE_WEAK_REFERENCE, single_weak_reference, 0);\n    }\n\n    #[inline]\n    pub fn add_vector_of_weak_references(&mut self, vector_of_weak_references: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , u64>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_VECTOR_OF_WEAK_REFERENCES, vector_of_weak_references);\n    }\n\n    #[inline]\n    pub fn add_vector_of_strong_referrables(&mut self, vector_of_strong_referrables: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , ::flatbuffers::ForwardsUOffset<Referrable<'b >>>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_VECTOR_OF_STRONG_REFERRABLES, vector_of_strong_referrables);\n    }\n\n    #[inline]\n    pub fn add_co_owning_reference(&mut self, co_owning_reference: u64) {\n        self.fbb_.push_slot::<u64>(Monster::VT_CO_OWNING_REFERENCE, co_owning_reference, 0);\n    }\n\n    #[inline]\n    pub fn add_vector_of_co_owning_references(&mut self, vector_of_co_owning_references: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , u64>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_VECTOR_OF_CO_OWNING_REFERENCES, vector_of_co_owning_references);\n    }\n\n    #[inline]\n    pub fn add_non_owning_reference(&mut self, non_owning_reference: u64) {\n        self.fbb_.push_slot::<u64>(Monster::VT_NON_OWNING_REFERENCE, non_owning_reference, 0);\n    }\n\n    #[inline]\n    pub fn add_vector_of_non_owning_references(&mut self, vector_of_non_owning_references: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , u64>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_VECTOR_OF_NON_OWNING_REFERENCES, vector_of_non_owning_references);\n    }\n\n    #[inline]\n    pub fn add_any_unique_type(&mut self, any_unique_type: AnyUniqueAliases) {\n        self.fbb_.push_slot::<AnyUniqueAliases>(Monster::VT_ANY_UNIQUE_TYPE, any_unique_type, AnyUniqueAliases::NONE);\n    }\n\n    #[inline]\n    pub fn add_any_unique(&mut self, any_unique: ::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_ANY_UNIQUE, any_unique);\n    }\n\n    #[inline]\n    pub fn add_any_ambiguous_type(&mut self, any_ambiguous_type: AnyAmbiguousAliases) {\n        self.fbb_.push_slot::<AnyAmbiguousAliases>(Monster::VT_ANY_AMBIGUOUS_TYPE, any_ambiguous_type, AnyAmbiguousAliases::NONE);\n    }\n\n    #[inline]\n    pub fn add_any_ambiguous(&mut self, any_ambiguous: ::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_ANY_AMBIGUOUS, any_ambiguous);\n    }\n\n    #[inline]\n    pub fn add_vector_of_enums(&mut self, vector_of_enums: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , Color>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_VECTOR_OF_ENUMS, vector_of_enums);\n    }\n\n    #[inline]\n    pub fn add_signed_enum(&mut self, signed_enum: Race) {\n        self.fbb_.push_slot::<Race>(Monster::VT_SIGNED_ENUM, signed_enum, Race::None);\n    }\n\n    #[inline]\n    pub fn add_testrequirednestedflatbuffer(&mut self, testrequirednestedflatbuffer: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , u8>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_TESTREQUIREDNESTEDFLATBUFFER, testrequirednestedflatbuffer);\n    }\n\n    #[inline]\n    pub fn add_scalar_key_sorted_tables(&mut self, scalar_key_sorted_tables: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , ::flatbuffers::ForwardsUOffset<Stat<'b >>>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_SCALAR_KEY_SORTED_TABLES, scalar_key_sorted_tables);\n    }\n\n    #[inline]\n    pub fn add_native_inline(&mut self, native_inline: &Test) {\n        self.fbb_.push_slot_always::<&Test>(Monster::VT_NATIVE_INLINE, native_inline);\n    }\n\n    #[inline]\n    pub fn add_long_enum_non_enum_default(&mut self, long_enum_non_enum_default: LongEnum) {\n        self.fbb_.push_slot::<LongEnum>(Monster::VT_LONG_ENUM_NON_ENUM_DEFAULT, long_enum_non_enum_default, Default::default());\n    }\n\n    #[inline]\n    pub fn add_long_enum_normal_default(&mut self, long_enum_normal_default: LongEnum) {\n        self.fbb_.push_slot::<LongEnum>(Monster::VT_LONG_ENUM_NORMAL_DEFAULT, long_enum_normal_default, LongEnum::LongOne);\n    }\n\n    #[inline]\n    pub fn add_nan_default(&mut self, nan_default: f32) {\n        self.fbb_.push_slot::<f32>(Monster::VT_NAN_DEFAULT, nan_default, f32::NAN);\n    }\n\n    #[inline]\n    pub fn add_inf_default(&mut self, inf_default: f32) {\n        self.fbb_.push_slot::<f32>(Monster::VT_INF_DEFAULT, inf_default, f32::INFINITY);\n    }\n\n    #[inline]\n    pub fn add_positive_inf_default(&mut self, positive_inf_default: f32) {\n        self.fbb_.push_slot::<f32>(Monster::VT_POSITIVE_INF_DEFAULT, positive_inf_default, f32::INFINITY);\n    }\n\n    #[inline]\n    pub fn add_infinity_default(&mut self, infinity_default: f32) {\n        self.fbb_.push_slot::<f32>(Monster::VT_INFINITY_DEFAULT, infinity_default, f32::INFINITY);\n    }\n\n    #[inline]\n    pub fn add_positive_infinity_default(&mut self, positive_infinity_default: f32) {\n        self.fbb_.push_slot::<f32>(Monster::VT_POSITIVE_INFINITY_DEFAULT, positive_infinity_default, f32::INFINITY);\n    }\n\n    #[inline]\n    pub fn add_negative_inf_default(&mut self, negative_inf_default: f32) {\n        self.fbb_.push_slot::<f32>(Monster::VT_NEGATIVE_INF_DEFAULT, negative_inf_default, f32::NEG_INFINITY);\n    }\n\n    #[inline]\n    pub fn add_negative_infinity_default(&mut self, negative_infinity_default: f32) {\n        self.fbb_.push_slot::<f32>(Monster::VT_NEGATIVE_INFINITY_DEFAULT, negative_infinity_default, f32::NEG_INFINITY);\n    }\n\n    #[inline]\n    pub fn add_double_inf_default(&mut self, double_inf_default: f64) {\n        self.fbb_.push_slot::<f64>(Monster::VT_DOUBLE_INF_DEFAULT, double_inf_default, f64::INFINITY);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> MonsterBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        MonsterBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<Monster<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        self.fbb_.required(o, Monster::VT_NAME,\"name\");\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for Monster<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"Monster\");\n        ds.field(\"pos\", &self.pos());\n        ds.field(\"mana\", &self.mana());\n        ds.field(\"hp\", &self.hp());\n        ds.field(\"name\", &self.name());\n        ds.field(\"inventory\", &self.inventory());\n        ds.field(\"color\", &self.color());\n        ds.field(\"test_type\", &self.test_type());\n        match self.test_type() {\n            Any::Monster => {\n                if let Some(x) = self.test_as_monster() {\n                    ds.field(\"test\", &x)\n                } else {\n                    ds.field(\"test\", &\"InvalidFlatbuffer: Union discriminant does not match value.\")\n                }\n            },\n            Any::TestSimpleTableWithEnum => {\n                if let Some(x) = self.test_as_test_simple_table_with_enum() {\n                    ds.field(\"test\", &x)\n                } else {\n                    ds.field(\"test\", &\"InvalidFlatbuffer: Union discriminant does not match value.\")\n                }\n            },\n            Any::MyGame_Example2_Monster => {\n                if let Some(x) = self.test_as_my_game_example_2_monster() {\n                    ds.field(\"test\", &x)\n                } else {\n                    ds.field(\"test\", &\"InvalidFlatbuffer: Union discriminant does not match value.\")\n                }\n            },\n            _ => {\n                let x: Option<()> = None;\n                ds.field(\"test\", &x)\n            },\n        };\n        ds.field(\"test4\", &self.test4());\n        ds.field(\"testarrayofstring\", &self.testarrayofstring());\n        ds.field(\"testarrayoftables\", &self.testarrayoftables());\n        ds.field(\"enemy\", &self.enemy());\n        ds.field(\"testnestedflatbuffer\", &self.testnestedflatbuffer());\n        ds.field(\"testempty\", &self.testempty());\n        ds.field(\"testbool\", &self.testbool());\n        ds.field(\"testhashs32_fnv1\", &self.testhashs32_fnv1());\n        ds.field(\"testhashu32_fnv1\", &self.testhashu32_fnv1());\n        ds.field(\"testhashs64_fnv1\", &self.testhashs64_fnv1());\n        ds.field(\"testhashu64_fnv1\", &self.testhashu64_fnv1());\n        ds.field(\"testhashs32_fnv1a\", &self.testhashs32_fnv1a());\n        ds.field(\"testhashu32_fnv1a\", &self.testhashu32_fnv1a());\n        ds.field(\"testhashs64_fnv1a\", &self.testhashs64_fnv1a());\n        ds.field(\"testhashu64_fnv1a\", &self.testhashu64_fnv1a());\n        ds.field(\"testarrayofbools\", &self.testarrayofbools());\n        ds.field(\"testf\", &self.testf());\n        ds.field(\"testf2\", &self.testf2());\n        ds.field(\"testf3\", &self.testf3());\n        ds.field(\"testarrayofstring2\", &self.testarrayofstring2());\n        ds.field(\"testarrayofsortedstruct\", &self.testarrayofsortedstruct());\n        ds.field(\"flex\", &self.flex());\n        ds.field(\"test5\", &self.test5());\n        ds.field(\"vector_of_longs\", &self.vector_of_longs());\n        ds.field(\"vector_of_doubles\", &self.vector_of_doubles());\n        ds.field(\"parent_namespace_test\", &self.parent_namespace_test());\n        ds.field(\"vector_of_referrables\", &self.vector_of_referrables());\n        ds.field(\"single_weak_reference\", &self.single_weak_reference());\n        ds.field(\"vector_of_weak_references\", &self.vector_of_weak_references());\n        ds.field(\"vector_of_strong_referrables\", &self.vector_of_strong_referrables());\n        ds.field(\"co_owning_reference\", &self.co_owning_reference());\n        ds.field(\"vector_of_co_owning_references\", &self.vector_of_co_owning_references());\n        ds.field(\"non_owning_reference\", &self.non_owning_reference());\n        ds.field(\"vector_of_non_owning_references\", &self.vector_of_non_owning_references());\n        ds.field(\"any_unique_type\", &self.any_unique_type());\n        match self.any_unique_type() {\n            AnyUniqueAliases::M => {\n                if let Some(x) = self.any_unique_as_m() {\n                    ds.field(\"any_unique\", &x)\n                } else {\n                    ds.field(\"any_unique\", &\"InvalidFlatbuffer: Union discriminant does not match value.\")\n                }\n            },\n            AnyUniqueAliases::TS => {\n                if let Some(x) = self.any_unique_as_ts() {\n                    ds.field(\"any_unique\", &x)\n                } else {\n                    ds.field(\"any_unique\", &\"InvalidFlatbuffer: Union discriminant does not match value.\")\n                }\n            },\n            AnyUniqueAliases::M2 => {\n                if let Some(x) = self.any_unique_as_m2() {\n                    ds.field(\"any_unique\", &x)\n                } else {\n                    ds.field(\"any_unique\", &\"InvalidFlatbuffer: Union discriminant does not match value.\")\n                }\n            },\n            _ => {\n                let x: Option<()> = None;\n                ds.field(\"any_unique\", &x)\n            },\n        };\n        ds.field(\"any_ambiguous_type\", &self.any_ambiguous_type());\n        match self.any_ambiguous_type() {\n            AnyAmbiguousAliases::M1 => {\n                if let Some(x) = self.any_ambiguous_as_m1() {\n                    ds.field(\"any_ambiguous\", &x)\n                } else {\n                    ds.field(\"any_ambiguous\", &\"InvalidFlatbuffer: Union discriminant does not match value.\")\n                }\n            },\n            AnyAmbiguousAliases::M2 => {\n                if let Some(x) = self.any_ambiguous_as_m2() {\n                    ds.field(\"any_ambiguous\", &x)\n                } else {\n                    ds.field(\"any_ambiguous\", &\"InvalidFlatbuffer: Union discriminant does not match value.\")\n                }\n            },\n            AnyAmbiguousAliases::M3 => {\n                if let Some(x) = self.any_ambiguous_as_m3() {\n                    ds.field(\"any_ambiguous\", &x)\n                } else {\n                    ds.field(\"any_ambiguous\", &\"InvalidFlatbuffer: Union discriminant does not match value.\")\n                }\n            },\n            _ => {\n                let x: Option<()> = None;\n                ds.field(\"any_ambiguous\", &x)\n            },\n        };\n        ds.field(\"vector_of_enums\", &self.vector_of_enums());\n        ds.field(\"signed_enum\", &self.signed_enum());\n        ds.field(\"testrequirednestedflatbuffer\", &self.testrequirednestedflatbuffer());\n        ds.field(\"scalar_key_sorted_tables\", &self.scalar_key_sorted_tables());\n        ds.field(\"native_inline\", &self.native_inline());\n        ds.field(\"long_enum_non_enum_default\", &self.long_enum_non_enum_default());\n        ds.field(\"long_enum_normal_default\", &self.long_enum_normal_default());\n        ds.field(\"nan_default\", &self.nan_default());\n        ds.field(\"inf_default\", &self.inf_default());\n        ds.field(\"positive_inf_default\", &self.positive_inf_default());\n        ds.field(\"infinity_default\", &self.infinity_default());\n        ds.field(\"positive_infinity_default\", &self.positive_infinity_default());\n        ds.field(\"negative_inf_default\", &self.negative_inf_default());\n        ds.field(\"negative_infinity_default\", &self.negative_infinity_default());\n        ds.field(\"double_inf_default\", &self.double_inf_default());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct MonsterT {\n    pub pos: Option<Vec3T>,\n    pub mana: i16,\n    pub hp: i16,\n    pub name: alloc::string::String,\n    pub inventory: Option<alloc::vec::Vec<u8>>,\n    pub color: Color,\n    pub test: AnyT,\n    pub test4: Option<alloc::vec::Vec<TestT>>,\n    pub testarrayofstring: Option<alloc::vec::Vec<alloc::string::String>>,\n    pub testarrayoftables: Option<alloc::vec::Vec<MonsterT>>,\n    pub enemy: Option<alloc::boxed::Box<MonsterT>>,\n    pub testnestedflatbuffer: Option<alloc::vec::Vec<u8>>,\n    pub testempty: Option<alloc::boxed::Box<StatT>>,\n    pub testbool: bool,\n    pub testhashs32_fnv1: i32,\n    pub testhashu32_fnv1: u32,\n    pub testhashs64_fnv1: i64,\n    pub testhashu64_fnv1: u64,\n    pub testhashs32_fnv1a: i32,\n    pub testhashu32_fnv1a: u32,\n    pub testhashs64_fnv1a: i64,\n    pub testhashu64_fnv1a: u64,\n    pub testarrayofbools: Option<alloc::vec::Vec<bool>>,\n    pub testf: f32,\n    pub testf2: f32,\n    pub testf3: f32,\n    pub testarrayofstring2: Option<alloc::vec::Vec<alloc::string::String>>,\n    pub testarrayofsortedstruct: Option<alloc::vec::Vec<AbilityT>>,\n    pub flex: Option<alloc::vec::Vec<u8>>,\n    pub test5: Option<alloc::vec::Vec<TestT>>,\n    pub vector_of_longs: Option<alloc::vec::Vec<i64>>,\n    pub vector_of_doubles: Option<alloc::vec::Vec<f64>>,\n    pub parent_namespace_test: Option<alloc::boxed::Box<super::InParentNamespaceT>>,\n    pub vector_of_referrables: Option<alloc::vec::Vec<ReferrableT>>,\n    pub single_weak_reference: u64,\n    pub vector_of_weak_references: Option<alloc::vec::Vec<u64>>,\n    pub vector_of_strong_referrables: Option<alloc::vec::Vec<ReferrableT>>,\n    pub co_owning_reference: u64,\n    pub vector_of_co_owning_references: Option<alloc::vec::Vec<u64>>,\n    pub non_owning_reference: u64,\n    pub vector_of_non_owning_references: Option<alloc::vec::Vec<u64>>,\n    pub any_unique: AnyUniqueAliasesT,\n    pub any_ambiguous: AnyAmbiguousAliasesT,\n    pub vector_of_enums: Option<alloc::vec::Vec<Color>>,\n    pub signed_enum: Race,\n    pub testrequirednestedflatbuffer: Option<alloc::vec::Vec<u8>>,\n    pub scalar_key_sorted_tables: Option<alloc::vec::Vec<StatT>>,\n    pub native_inline: Option<TestT>,\n    pub long_enum_non_enum_default: LongEnum,\n    pub long_enum_normal_default: LongEnum,\n    pub nan_default: f32,\n    pub inf_default: f32,\n    pub positive_inf_default: f32,\n    pub infinity_default: f32,\n    pub positive_infinity_default: f32,\n    pub negative_inf_default: f32,\n    pub negative_infinity_default: f32,\n    pub double_inf_default: f64,\n}\n\nimpl Default for MonsterT {\n    fn default() -> Self {\n        Self {\n            pos: None,\n            mana: 150,\n            hp: 100,\n            name: alloc::string::ToString::to_string(\"\"),\n            inventory: None,\n            color: Color::Blue,\n            test: AnyT::NONE,\n            test4: None,\n            testarrayofstring: None,\n            testarrayoftables: None,\n            enemy: None,\n            testnestedflatbuffer: None,\n            testempty: None,\n            testbool: false,\n            testhashs32_fnv1: 0,\n            testhashu32_fnv1: 0,\n            testhashs64_fnv1: 0,\n            testhashu64_fnv1: 0,\n            testhashs32_fnv1a: 0,\n            testhashu32_fnv1a: 0,\n            testhashs64_fnv1a: 0,\n            testhashu64_fnv1a: 0,\n            testarrayofbools: None,\n            testf: 3.14159,\n            testf2: 3.0,\n            testf3: 0.0,\n            testarrayofstring2: None,\n            testarrayofsortedstruct: None,\n            flex: None,\n            test5: None,\n            vector_of_longs: None,\n            vector_of_doubles: None,\n            parent_namespace_test: None,\n            vector_of_referrables: None,\n            single_weak_reference: 0,\n            vector_of_weak_references: None,\n            vector_of_strong_referrables: None,\n            co_owning_reference: 0,\n            vector_of_co_owning_references: None,\n            non_owning_reference: 0,\n            vector_of_non_owning_references: None,\n            any_unique: AnyUniqueAliasesT::NONE,\n            any_ambiguous: AnyAmbiguousAliasesT::NONE,\n            vector_of_enums: None,\n            signed_enum: Race::None,\n            testrequirednestedflatbuffer: None,\n            scalar_key_sorted_tables: None,\n            native_inline: None,\n            long_enum_non_enum_default: Default::default(),\n            long_enum_normal_default: LongEnum::LongOne,\n            nan_default: f32::NAN,\n            inf_default: f32::INFINITY,\n            positive_inf_default: f32::INFINITY,\n            infinity_default: f32::INFINITY,\n            positive_infinity_default: f32::INFINITY,\n            negative_inf_default: f32::NEG_INFINITY,\n            negative_infinity_default: f32::NEG_INFINITY,\n            double_inf_default: f64::INFINITY,\n        }\n    }\n}\n\nimpl MonsterT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<Monster<'b>> {\n        let pos_tmp = self.pos.as_ref().map(|x| x.pack());\n        let pos = pos_tmp.as_ref();\n        let mana = self.mana;\n        let hp = self.hp;\n        let name = Some({\n            let x = &self.name;\n            _fbb.create_string(x)\n        });\n        let inventory = self.inventory.as_ref().map(|x|{\n            _fbb.create_vector(x)\n        });\n        let color = self.color;\n        let test_type = self.test.any_type();\n        let test = self.test.pack(_fbb);\n        let test4 = self.test4.as_ref().map(|x|{\n            let w: alloc::vec::Vec<_> = x.iter().map(|t| t.pack()).collect();_fbb.create_vector(&w)\n        });\n        let testarrayofstring = self.testarrayofstring.as_ref().map(|x|{\n            let w: alloc::vec::Vec<_> = x.iter().map(|s| _fbb.create_string(s)).collect();_fbb.create_vector(&w)\n        });\n        let testarrayoftables = self.testarrayoftables.as_ref().map(|x|{\n            let w: alloc::vec::Vec<_> = x.iter().map(|t| t.pack(_fbb)).collect();_fbb.create_vector(&w)\n        });\n        let enemy = self.enemy.as_ref().map(|x|{\n            x.pack(_fbb)\n        });\n        let testnestedflatbuffer = self.testnestedflatbuffer.as_ref().map(|x|{\n            _fbb.create_vector(x)\n        });\n        let testempty = self.testempty.as_ref().map(|x|{\n            x.pack(_fbb)\n        });\n        let testbool = self.testbool;\n        let testhashs32_fnv1 = self.testhashs32_fnv1;\n        let testhashu32_fnv1 = self.testhashu32_fnv1;\n        let testhashs64_fnv1 = self.testhashs64_fnv1;\n        let testhashu64_fnv1 = self.testhashu64_fnv1;\n        let testhashs32_fnv1a = self.testhashs32_fnv1a;\n        let testhashu32_fnv1a = self.testhashu32_fnv1a;\n        let testhashs64_fnv1a = self.testhashs64_fnv1a;\n        let testhashu64_fnv1a = self.testhashu64_fnv1a;\n        let testarrayofbools = self.testarrayofbools.as_ref().map(|x|{\n            _fbb.create_vector(x)\n        });\n        let testf = self.testf;\n        let testf2 = self.testf2;\n        let testf3 = self.testf3;\n        let testarrayofstring2 = self.testarrayofstring2.as_ref().map(|x|{\n            let w: alloc::vec::Vec<_> = x.iter().map(|s| _fbb.create_string(s)).collect();_fbb.create_vector(&w)\n        });\n        let testarrayofsortedstruct = self.testarrayofsortedstruct.as_ref().map(|x|{\n            let w: alloc::vec::Vec<_> = x.iter().map(|t| t.pack()).collect();_fbb.create_vector(&w)\n        });\n        let flex = self.flex.as_ref().map(|x|{\n            _fbb.create_vector(x)\n        });\n        let test5 = self.test5.as_ref().map(|x|{\n            let w: alloc::vec::Vec<_> = x.iter().map(|t| t.pack()).collect();_fbb.create_vector(&w)\n        });\n        let vector_of_longs = self.vector_of_longs.as_ref().map(|x|{\n            _fbb.create_vector(x)\n        });\n        let vector_of_doubles = self.vector_of_doubles.as_ref().map(|x|{\n            _fbb.create_vector(x)\n        });\n        let parent_namespace_test = self.parent_namespace_test.as_ref().map(|x|{\n            x.pack(_fbb)\n        });\n        let vector_of_referrables = self.vector_of_referrables.as_ref().map(|x|{\n            let w: alloc::vec::Vec<_> = x.iter().map(|t| t.pack(_fbb)).collect();_fbb.create_vector(&w)\n        });\n        let single_weak_reference = self.single_weak_reference;\n        let vector_of_weak_references = self.vector_of_weak_references.as_ref().map(|x|{\n            _fbb.create_vector(x)\n        });\n        let vector_of_strong_referrables = self.vector_of_strong_referrables.as_ref().map(|x|{\n            let w: alloc::vec::Vec<_> = x.iter().map(|t| t.pack(_fbb)).collect();_fbb.create_vector(&w)\n        });\n        let co_owning_reference = self.co_owning_reference;\n        let vector_of_co_owning_references = self.vector_of_co_owning_references.as_ref().map(|x|{\n            _fbb.create_vector(x)\n        });\n        let non_owning_reference = self.non_owning_reference;\n        let vector_of_non_owning_references = self.vector_of_non_owning_references.as_ref().map(|x|{\n            _fbb.create_vector(x)\n        });\n        let any_unique_type = self.any_unique.any_unique_aliases_type();\n        let any_unique = self.any_unique.pack(_fbb);\n        let any_ambiguous_type = self.any_ambiguous.any_ambiguous_aliases_type();\n        let any_ambiguous = self.any_ambiguous.pack(_fbb);\n        let vector_of_enums = self.vector_of_enums.as_ref().map(|x|{\n            _fbb.create_vector(x)\n        });\n        let signed_enum = self.signed_enum;\n        let testrequirednestedflatbuffer = self.testrequirednestedflatbuffer.as_ref().map(|x|{\n            _fbb.create_vector(x)\n        });\n        let scalar_key_sorted_tables = self.scalar_key_sorted_tables.as_ref().map(|x|{\n            let w: alloc::vec::Vec<_> = x.iter().map(|t| t.pack(_fbb)).collect();_fbb.create_vector(&w)\n        });\n        let native_inline_tmp = self.native_inline.as_ref().map(|x| x.pack());\n        let native_inline = native_inline_tmp.as_ref();\n        let long_enum_non_enum_default = self.long_enum_non_enum_default;\n        let long_enum_normal_default = self.long_enum_normal_default;\n        let nan_default = self.nan_default;\n        let inf_default = self.inf_default;\n        let positive_inf_default = self.positive_inf_default;\n        let infinity_default = self.infinity_default;\n        let positive_infinity_default = self.positive_infinity_default;\n        let negative_inf_default = self.negative_inf_default;\n        let negative_infinity_default = self.negative_infinity_default;\n        let double_inf_default = self.double_inf_default;\n        Monster::create(_fbb, &MonsterArgs{\n            pos,\n            mana,\n            hp,\n            name,\n            inventory,\n            color,\n            test_type,\n            test,\n            test4,\n            testarrayofstring,\n            testarrayoftables,\n            enemy,\n            testnestedflatbuffer,\n            testempty,\n            testbool,\n            testhashs32_fnv1,\n            testhashu32_fnv1,\n            testhashs64_fnv1,\n            testhashu64_fnv1,\n            testhashs32_fnv1a,\n            testhashu32_fnv1a,\n            testhashs64_fnv1a,\n            testhashu64_fnv1a,\n            testarrayofbools,\n            testf,\n            testf2,\n            testf3,\n            testarrayofstring2,\n            testarrayofsortedstruct,\n            flex,\n            test5,\n            vector_of_longs,\n            vector_of_doubles,\n            parent_namespace_test,\n            vector_of_referrables,\n            single_weak_reference,\n            vector_of_weak_references,\n            vector_of_strong_referrables,\n            co_owning_reference,\n            vector_of_co_owning_references,\n            non_owning_reference,\n            vector_of_non_owning_references,\n            any_unique_type,\n            any_unique,\n            any_ambiguous_type,\n            any_ambiguous,\n            vector_of_enums,\n            signed_enum,\n            testrequirednestedflatbuffer,\n            scalar_key_sorted_tables,\n            native_inline,\n            long_enum_non_enum_default,\n            long_enum_normal_default,\n            nan_default,\n            inf_default,\n            positive_inf_default,\n            infinity_default,\n            positive_infinity_default,\n            negative_inf_default,\n            negative_infinity_default,\n            double_inf_default,\n        })\n    }\n}\n\n/// Verifies that a buffer of bytes contains a `Monster`\n/// and returns it.\n/// Note that verification is still experimental and may not\n/// catch every error, or be maximally performant. For the\n/// previous, unchecked, behavior use\n/// `root_as_monster_unchecked`.\n#[inline]\npub fn root_as_monster(buf: &[u8]) -> Result<Monster<'_>, ::flatbuffers::InvalidFlatbuffer> {\n    ::flatbuffers::root::<Monster>(buf)\n}\n\n/// Verifies that a buffer of bytes contains a size prefixed\n/// `Monster` and returns it.\n/// Note that verification is still experimental and may not\n/// catch every error, or be maximally performant. For the\n/// previous, unchecked, behavior use\n/// `size_prefixed_root_as_monster_unchecked`.\n#[inline]\npub fn size_prefixed_root_as_monster(buf: &[u8]) -> Result<Monster<'_>, ::flatbuffers::InvalidFlatbuffer> {\n    ::flatbuffers::size_prefixed_root::<Monster>(buf)\n}\n\n/// Verifies, with the given options, that a buffer of bytes\n/// contains a `Monster` and returns it.\n/// Note that verification is still experimental and may not\n/// catch every error, or be maximally performant. For the\n/// previous, unchecked, behavior use\n/// `root_as_monster_unchecked`.\n#[inline]\npub fn root_as_monster_with_opts<'b, 'o>(\n    opts: &'o ::flatbuffers::VerifierOptions,\n    buf: &'b [u8],\n) -> Result<Monster<'b>, ::flatbuffers::InvalidFlatbuffer> {\n    ::flatbuffers::root_with_opts::<Monster<'b>>(opts, buf)\n}\n\n/// Verifies, with the given verifier options, that a buffer of\n/// bytes contains a size prefixed `Monster` and returns\n/// it. Note that verification is still experimental and may not\n/// catch every error, or be maximally performant. For the\n/// previous, unchecked, behavior use\n/// `root_as_monster_unchecked`.\n#[inline]\npub fn size_prefixed_root_as_monster_with_opts<'b, 'o>(\n    opts: &'o ::flatbuffers::VerifierOptions,\n    buf: &'b [u8],\n) -> Result<Monster<'b>, ::flatbuffers::InvalidFlatbuffer> {\n    ::flatbuffers::size_prefixed_root_with_opts::<Monster<'b>>(opts, buf)\n}\n\n/// Assumes, without verification, that a buffer of bytes contains a Monster and returns it.\n/// # Safety\n/// Callers must trust the given bytes do indeed contain a valid `Monster`.\n#[inline]\npub unsafe fn root_as_monster_unchecked(buf: &[u8]) -> Monster<'_> {\n    unsafe { ::flatbuffers::root_unchecked::<Monster>(buf) }\n}\n\n/// Assumes, without verification, that a buffer of bytes contains a size prefixed Monster and returns it.\n/// # Safety\n/// Callers must trust the given bytes do indeed contain a valid size prefixed `Monster`.\n#[inline]\npub unsafe fn size_prefixed_root_as_monster_unchecked(buf: &[u8]) -> Monster<'_> {\n    unsafe { ::flatbuffers::size_prefixed_root_unchecked::<Monster>(buf) }\n}\n\npub const MONSTER_IDENTIFIER: &str = \"MONS\";\n\n#[inline]\npub fn monster_buffer_has_identifier(buf: &[u8]) -> bool {\n    ::flatbuffers::buffer_has_identifier(buf, MONSTER_IDENTIFIER, false)\n}\n\n#[inline]\npub fn monster_size_prefixed_buffer_has_identifier(buf: &[u8]) -> bool {\n    ::flatbuffers::buffer_has_identifier(buf, MONSTER_IDENTIFIER, true)\n}\n\npub const MONSTER_EXTENSION: &str = \"mon\";\n\n#[inline]\npub fn finish_monster_buffer<'a, 'b, A: ::flatbuffers::Allocator + 'a>(\n    fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    root: ::flatbuffers::WIPOffset<Monster<'a>>\n) {\n    fbb.finish(root, Some(MONSTER_IDENTIFIER));\n}\n\n#[inline]\npub fn finish_size_prefixed_monster_buffer<'a, 'b, A: ::flatbuffers::Allocator + 'a>(\n    fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    root: ::flatbuffers::WIPOffset<Monster<'a>>\n) {\n    fbb.finish_size_prefixed(root, Some(MONSTER_IDENTIFIER));\n}\n"
  },
  {
    "path": "tests/monster_test/my_game/example/race_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MIN_RACE: i8 = -1;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MAX_RACE: i8 = 2;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n#[allow(non_camel_case_types)]\npub const ENUM_VALUES_RACE: [Race; 4] = [\n    Race::None,\n    Race::Human,\n    Race::Dwarf,\n    Race::Elf,\n];\n\n#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n#[repr(transparent)]\npub struct Race(pub i8);\n\n#[allow(non_upper_case_globals)]\nimpl Race {\n    pub const None: Self = Self(-1);\n    pub const Human: Self = Self(0);\n    pub const Dwarf: Self = Self(1);\n    pub const Elf: Self = Self(2);\n\n    pub const ENUM_MIN: i8 = -1;\n    pub const ENUM_MAX: i8 = 2;\n    pub const ENUM_VALUES: &'static [Self] = &[\n        Self::None,\n        Self::Human,\n        Self::Dwarf,\n        Self::Elf,\n    ];\n\n    /// Returns the variant's name or \"\" if unknown.\n    pub fn variant_name(self) -> Option<&'static str> {\n        match self {\n            Self::None => Some(\"None\"),\n            Self::Human => Some(\"Human\"),\n            Self::Dwarf => Some(\"Dwarf\"),\n            Self::Elf => Some(\"Elf\"),\n            _ => None,\n        }\n    }\n}\n\nimpl ::core::fmt::Debug for Race {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        if let Some(name) = self.variant_name() {\n            f.write_str(name)\n        } else {\n            f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n        }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Race {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<i8>(buf, loc) };\n        Self(b)\n    }\n}\n\nimpl ::flatbuffers::Push for Race {\n    type Output = Race;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<i8>(dst, self.0) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for Race {\n    type Scalar = i8;\n\n    #[inline]\n    fn to_little_endian(self) -> i8 {\n        self.0.to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: i8) -> Self {\n        let b = i8::from_le(v);\n        Self(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for Race {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        i8::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for Race {}\n"
  },
  {
    "path": "tests/monster_test/my_game/example/referrable_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum ReferrableOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct Referrable<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Referrable<'a> {\n    type Inner = Referrable<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> Referrable<'a> {\n    pub const VT_ID: ::flatbuffers::VOffsetT = 4;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.Example.Referrable\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        Referrable { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args ReferrableArgs\n    ) -> ::flatbuffers::WIPOffset<Referrable<'bldr>> {\n        let mut builder = ReferrableBuilder::new(_fbb);\n        builder.add_id(args.id);\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> ReferrableT {\n        let id = self.id();\n        ReferrableT {\n            id,\n        }\n    }\n\n    #[inline]\n    pub fn id(&self) -> u64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u64>(Referrable::VT_ID, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn key_compare_less_than(&self, o: &Referrable) -> bool {\n        self.id() < o.id()\n    }\n\n    #[inline]\n    pub fn key_compare_with_value(&self, val: u64) -> ::core::cmp::Ordering {\n        let key = self.id();\n        key.cmp(&val)\n    }\n}\n\nimpl ::flatbuffers::Verifiable for Referrable<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<u64>(\"id\", Self::VT_ID, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct ReferrableArgs {\n    pub id: u64,\n}\n\nimpl<'a> Default for ReferrableArgs {\n    #[inline]\n    fn default() -> Self {\n        ReferrableArgs {\n            id: 0,\n        }\n    }\n}\n\npub struct ReferrableBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> ReferrableBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_id(&mut self, id: u64) {\n        self.fbb_.push_slot::<u64>(Referrable::VT_ID, id, 0);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> ReferrableBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        ReferrableBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<Referrable<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for Referrable<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"Referrable\");\n        ds.field(\"id\", &self.id());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct ReferrableT {\n    pub id: u64,\n}\n\nimpl Default for ReferrableT {\n    fn default() -> Self {\n        Self {\n            id: 0,\n        }\n    }\n}\n\nimpl ReferrableT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<Referrable<'b>> {\n        let id = self.id;\n        Referrable::create(_fbb, &ReferrableArgs{\n            id,\n        })\n    }\n}\n"
  },
  {
    "path": "tests/monster_test/my_game/example/stat_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum StatOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct Stat<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Stat<'a> {\n    type Inner = Stat<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> Stat<'a> {\n    pub const VT_ID: ::flatbuffers::VOffsetT = 4;\n    pub const VT_VAL: ::flatbuffers::VOffsetT = 6;\n    pub const VT_COUNT: ::flatbuffers::VOffsetT = 8;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.Example.Stat\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        Stat { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args StatArgs<'args>\n    ) -> ::flatbuffers::WIPOffset<Stat<'bldr>> {\n        let mut builder = StatBuilder::new(_fbb);\n        builder.add_val(args.val);\n        if let Some(x) = args.id { builder.add_id(x); }\n        builder.add_count(args.count);\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> StatT {\n        let id = self.id().map(|x| {\n            alloc::string::ToString::to_string(x)\n        });\n        let val = self.val();\n        let count = self.count();\n        StatT {\n            id,\n            val,\n            count,\n        }\n    }\n\n    #[inline]\n    pub fn id(&self) -> Option<&'a str> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<&str>>(Stat::VT_ID, None)}\n    }\n\n    #[inline]\n    pub fn val(&self) -> i64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i64>(Stat::VT_VAL, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn count(&self) -> u16 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u16>(Stat::VT_COUNT, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn key_compare_less_than(&self, o: &Stat) -> bool {\n        self.count() < o.count()\n    }\n\n    #[inline]\n    pub fn key_compare_with_value(&self, val: u16) -> ::core::cmp::Ordering {\n        let key = self.count();\n        key.cmp(&val)\n    }\n}\n\nimpl ::flatbuffers::Verifiable for Stat<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<&str>>(\"id\", Self::VT_ID, false)?\n            .visit_field::<i64>(\"val\", Self::VT_VAL, false)?\n            .visit_field::<u16>(\"count\", Self::VT_COUNT, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct StatArgs<'a> {\n    pub id: Option<::flatbuffers::WIPOffset<&'a str>>,\n    pub val: i64,\n    pub count: u16,\n}\n\nimpl<'a> Default for StatArgs<'a> {\n    #[inline]\n    fn default() -> Self {\n        StatArgs {\n            id: None,\n            val: 0,\n            count: 0,\n        }\n    }\n}\n\npub struct StatBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> StatBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_id(&mut self, id: ::flatbuffers::WIPOffset<&'b  str>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Stat::VT_ID, id);\n    }\n\n    #[inline]\n    pub fn add_val(&mut self, val: i64) {\n        self.fbb_.push_slot::<i64>(Stat::VT_VAL, val, 0);\n    }\n\n    #[inline]\n    pub fn add_count(&mut self, count: u16) {\n        self.fbb_.push_slot::<u16>(Stat::VT_COUNT, count, 0);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> StatBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        StatBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<Stat<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for Stat<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"Stat\");\n        ds.field(\"id\", &self.id());\n        ds.field(\"val\", &self.val());\n        ds.field(\"count\", &self.count());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct StatT {\n    pub id: Option<alloc::string::String>,\n    pub val: i64,\n    pub count: u16,\n}\n\nimpl Default for StatT {\n    fn default() -> Self {\n        Self {\n            id: None,\n            val: 0,\n            count: 0,\n        }\n    }\n}\n\nimpl StatT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<Stat<'b>> {\n        let id = self.id.as_ref().map(|x|{\n            _fbb.create_string(x)\n        });\n        let val = self.val;\n        let count = self.count;\n        Stat::create(_fbb, &StatArgs{\n            id,\n            val,\n            count,\n        })\n    }\n}\n"
  },
  {
    "path": "tests/monster_test/my_game/example/struct_of_structs_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n// struct StructOfStructs, aligned to 4\n#[repr(transparent)]\n#[derive(Clone, Copy, PartialEq)]\npub struct StructOfStructs(pub [u8; 20]);\n\nimpl Default for StructOfStructs {\n    fn default() -> Self {\n        Self([0; 20])\n    }\n}\n\nimpl ::core::fmt::Debug for StructOfStructs {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        f.debug_struct(\"StructOfStructs\")\n            .field(\"a\", &self.a())\n            .field(\"b\", &self.b())\n            .field(\"c\", &self.c())\n            .finish()\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for StructOfStructs {}\n\nimpl<'a> ::flatbuffers::Follow<'a> for StructOfStructs {\n    type Inner = &'a StructOfStructs;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { <&'a StructOfStructs>::follow(buf, loc) }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for &'a StructOfStructs {\n    type Inner = &'a StructOfStructs;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { ::flatbuffers::follow_cast_ref::<StructOfStructs>(buf, loc) }\n    }\n}\n\nimpl<'b> ::flatbuffers::Push for StructOfStructs {\n    type Output = StructOfStructs;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        let src = unsafe { ::core::slice::from_raw_parts(self as *const StructOfStructs as *const u8, <Self as ::flatbuffers::Push>::size()) };\n        dst.copy_from_slice(src);\n    }\n\n    #[inline]\n    fn alignment() -> ::flatbuffers::PushAlignment {\n        ::flatbuffers::PushAlignment::new(4)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for StructOfStructs {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.in_buffer::<Self>(pos)\n    }\n}\n\nimpl<'a> StructOfStructs {\n    #[allow(clippy::too_many_arguments)]\n    pub fn new(\n        a: &Ability,\n        b: &Test,\n        c: &Ability,\n    ) -> Self {\n        let mut s = Self([0; 20]);\n        s.set_a(a);\n        s.set_b(b);\n        s.set_c(c);\n        s\n    }\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.Example.StructOfStructs\"\n    }\n\n    pub fn a(&self) -> &Ability {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid struct in this slot\n        unsafe { &*(self.0[0..].as_ptr() as *const Ability) }\n    }\n\n    #[allow(clippy::identity_op)]\n    pub fn set_a(&mut self, x: &Ability) {\n        self.0[0..0 + 8].copy_from_slice(&x.0)\n    }\n\n    pub fn b(&self) -> &Test {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid struct in this slot\n        unsafe { &*(self.0[8..].as_ptr() as *const Test) }\n    }\n\n    #[allow(clippy::identity_op)]\n    pub fn set_b(&mut self, x: &Test) {\n        self.0[8..8 + 4].copy_from_slice(&x.0)\n    }\n\n    pub fn c(&self) -> &Ability {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid struct in this slot\n        unsafe { &*(self.0[12..].as_ptr() as *const Ability) }\n    }\n\n    #[allow(clippy::identity_op)]\n    pub fn set_c(&mut self, x: &Ability) {\n        self.0[12..12 + 8].copy_from_slice(&x.0)\n    }\n\n    pub fn unpack(&self) -> StructOfStructsT {\n        StructOfStructsT {\n            a: self.a().unpack(),\n            b: self.b().unpack(),\n            c: self.c().unpack(),\n        }\n    }\n}\n\n#[derive(Debug, Clone, PartialEq)]\npub struct StructOfStructsT {\n    pub a: AbilityT,\n    pub b: TestT,\n    pub c: AbilityT,\n}\nimpl Default for StructOfStructsT {\n    fn default() -> Self {\n        Self {\n            a: Default::default(),\n            b: Default::default(),\n            c: Default::default(),\n        }\n    }\n}\n\nimpl StructOfStructsT {\n    pub fn pack(&self) -> StructOfStructs {\n        StructOfStructs::new(\n            &self.a.pack(),\n            &self.b.pack(),\n            &self.c.pack(),\n        )\n    }\n}\n"
  },
  {
    "path": "tests/monster_test/my_game/example/struct_of_structs_of_structs_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n// struct StructOfStructsOfStructs, aligned to 4\n#[repr(transparent)]\n#[derive(Clone, Copy, PartialEq)]\npub struct StructOfStructsOfStructs(pub [u8; 20]);\n\nimpl Default for StructOfStructsOfStructs {\n    fn default() -> Self {\n        Self([0; 20])\n    }\n}\n\nimpl ::core::fmt::Debug for StructOfStructsOfStructs {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        f.debug_struct(\"StructOfStructsOfStructs\")\n            .field(\"a\", &self.a())\n            .finish()\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for StructOfStructsOfStructs {}\n\nimpl<'a> ::flatbuffers::Follow<'a> for StructOfStructsOfStructs {\n    type Inner = &'a StructOfStructsOfStructs;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { <&'a StructOfStructsOfStructs>::follow(buf, loc) }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for &'a StructOfStructsOfStructs {\n    type Inner = &'a StructOfStructsOfStructs;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { ::flatbuffers::follow_cast_ref::<StructOfStructsOfStructs>(buf, loc) }\n    }\n}\n\nimpl<'b> ::flatbuffers::Push for StructOfStructsOfStructs {\n    type Output = StructOfStructsOfStructs;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        let src = unsafe { ::core::slice::from_raw_parts(self as *const StructOfStructsOfStructs as *const u8, <Self as ::flatbuffers::Push>::size()) };\n        dst.copy_from_slice(src);\n    }\n\n    #[inline]\n    fn alignment() -> ::flatbuffers::PushAlignment {\n        ::flatbuffers::PushAlignment::new(4)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for StructOfStructsOfStructs {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.in_buffer::<Self>(pos)\n    }\n}\n\nimpl<'a> StructOfStructsOfStructs {\n    #[allow(clippy::too_many_arguments)]\n    pub fn new(\n        a: &StructOfStructs,\n    ) -> Self {\n        let mut s = Self([0; 20]);\n        s.set_a(a);\n        s\n    }\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.Example.StructOfStructsOfStructs\"\n    }\n\n    pub fn a(&self) -> &StructOfStructs {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid struct in this slot\n        unsafe { &*(self.0[0..].as_ptr() as *const StructOfStructs) }\n    }\n\n    #[allow(clippy::identity_op)]\n    pub fn set_a(&mut self, x: &StructOfStructs) {\n        self.0[0..0 + 20].copy_from_slice(&x.0)\n    }\n\n    pub fn unpack(&self) -> StructOfStructsOfStructsT {\n        StructOfStructsOfStructsT {\n            a: self.a().unpack(),\n        }\n    }\n}\n\n#[derive(Debug, Clone, PartialEq)]\npub struct StructOfStructsOfStructsT {\n    pub a: StructOfStructsT,\n}\nimpl Default for StructOfStructsOfStructsT {\n    fn default() -> Self {\n        Self {\n            a: Default::default(),\n        }\n    }\n}\n\nimpl StructOfStructsOfStructsT {\n    pub fn pack(&self) -> StructOfStructsOfStructs {\n        StructOfStructsOfStructs::new(\n            &self.a.pack(),\n        )\n    }\n}\n"
  },
  {
    "path": "tests/monster_test/my_game/example/test_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n// struct Test, aligned to 2\n#[repr(transparent)]\n#[derive(Clone, Copy, PartialEq)]\npub struct Test(pub [u8; 4]);\n\nimpl Default for Test {\n    fn default() -> Self {\n        Self([0; 4])\n    }\n}\n\nimpl ::core::fmt::Debug for Test {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        f.debug_struct(\"Test\")\n            .field(\"a\", &self.a())\n            .field(\"b\", &self.b())\n            .finish()\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for Test {}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Test {\n    type Inner = &'a Test;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { <&'a Test>::follow(buf, loc) }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for &'a Test {\n    type Inner = &'a Test;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { ::flatbuffers::follow_cast_ref::<Test>(buf, loc) }\n    }\n}\n\nimpl<'b> ::flatbuffers::Push for Test {\n    type Output = Test;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        let src = unsafe { ::core::slice::from_raw_parts(self as *const Test as *const u8, <Self as ::flatbuffers::Push>::size()) };\n        dst.copy_from_slice(src);\n    }\n\n    #[inline]\n    fn alignment() -> ::flatbuffers::PushAlignment {\n        ::flatbuffers::PushAlignment::new(2)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for Test {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.in_buffer::<Self>(pos)\n    }\n}\n\nimpl<'a> Test {\n    #[allow(clippy::too_many_arguments)]\n    pub fn new(\n        a: i16,\n        b: i8,\n    ) -> Self {\n        let mut s = Self([0; 4]);\n        s.set_a(a);\n        s.set_b(b);\n        s\n    }\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.Example.Test\"\n    }\n\n    pub fn a(&self) -> i16 {\n        let mut mem = ::core::mem::MaybeUninit::<<i16 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[0..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<i16 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_a(&mut self, x: i16) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[0..].as_mut_ptr(),\n                ::core::mem::size_of::<<i16 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn b(&self) -> i8 {\n        let mut mem = ::core::mem::MaybeUninit::<<i8 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[2..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<i8 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_b(&mut self, x: i8) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[2..].as_mut_ptr(),\n                ::core::mem::size_of::<<i8 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn unpack(&self) -> TestT {\n        TestT {\n            a: self.a(),\n            b: self.b(),\n        }\n    }\n}\n\n#[derive(Debug, Clone, PartialEq)]\npub struct TestT {\n    pub a: i16,\n    pub b: i8,\n}\nimpl Default for TestT {\n    fn default() -> Self {\n        Self {\n            a: 0,\n            b: 0,\n        }\n    }\n}\n\nimpl TestT {\n    pub fn pack(&self) -> Test {\n        Test::new(\n            self.a,\n            self.b,\n        )\n    }\n}\n"
  },
  {
    "path": "tests/monster_test/my_game/example/test_simple_table_with_enum_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum TestSimpleTableWithEnumOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct TestSimpleTableWithEnum<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for TestSimpleTableWithEnum<'a> {\n    type Inner = TestSimpleTableWithEnum<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> TestSimpleTableWithEnum<'a> {\n    pub const VT_COLOR: ::flatbuffers::VOffsetT = 4;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.Example.TestSimpleTableWithEnum\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        TestSimpleTableWithEnum { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args TestSimpleTableWithEnumArgs\n    ) -> ::flatbuffers::WIPOffset<TestSimpleTableWithEnum<'bldr>> {\n        let mut builder = TestSimpleTableWithEnumBuilder::new(_fbb);\n        builder.add_color(args.color);\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> TestSimpleTableWithEnumT {\n        let color = self.color();\n        TestSimpleTableWithEnumT {\n            color,\n        }\n    }\n\n    #[inline]\n    pub fn color(&self) -> Color {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<Color>(TestSimpleTableWithEnum::VT_COLOR, Some(Color::Green)).unwrap()}\n    }\n}\n\nimpl ::flatbuffers::Verifiable for TestSimpleTableWithEnum<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<Color>(\"color\", Self::VT_COLOR, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct TestSimpleTableWithEnumArgs {\n    pub color: Color,\n}\n\nimpl<'a> Default for TestSimpleTableWithEnumArgs {\n    #[inline]\n    fn default() -> Self {\n        TestSimpleTableWithEnumArgs {\n            color: Color::Green,\n        }\n    }\n}\n\npub struct TestSimpleTableWithEnumBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> TestSimpleTableWithEnumBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_color(&mut self, color: Color) {\n        self.fbb_.push_slot::<Color>(TestSimpleTableWithEnum::VT_COLOR, color, Color::Green);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> TestSimpleTableWithEnumBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        TestSimpleTableWithEnumBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<TestSimpleTableWithEnum<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for TestSimpleTableWithEnum<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"TestSimpleTableWithEnum\");\n        ds.field(\"color\", &self.color());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct TestSimpleTableWithEnumT {\n    pub color: Color,\n}\n\nimpl Default for TestSimpleTableWithEnumT {\n    fn default() -> Self {\n        Self {\n            color: Color::Green,\n        }\n    }\n}\n\nimpl TestSimpleTableWithEnumT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<TestSimpleTableWithEnum<'b>> {\n        let color = self.color;\n        TestSimpleTableWithEnum::create(_fbb, &TestSimpleTableWithEnumArgs{\n            color,\n        })\n    }\n}\n"
  },
  {
    "path": "tests/monster_test/my_game/example/type_aliases_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum TypeAliasesOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct TypeAliases<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for TypeAliases<'a> {\n    type Inner = TypeAliases<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> TypeAliases<'a> {\n    pub const VT_I8_: ::flatbuffers::VOffsetT = 4;\n    pub const VT_U8_: ::flatbuffers::VOffsetT = 6;\n    pub const VT_I16_: ::flatbuffers::VOffsetT = 8;\n    pub const VT_U16_: ::flatbuffers::VOffsetT = 10;\n    pub const VT_I32_: ::flatbuffers::VOffsetT = 12;\n    pub const VT_U32_: ::flatbuffers::VOffsetT = 14;\n    pub const VT_I64_: ::flatbuffers::VOffsetT = 16;\n    pub const VT_U64_: ::flatbuffers::VOffsetT = 18;\n    pub const VT_F32_: ::flatbuffers::VOffsetT = 20;\n    pub const VT_F64_: ::flatbuffers::VOffsetT = 22;\n    pub const VT_V8: ::flatbuffers::VOffsetT = 24;\n    pub const VT_VF64: ::flatbuffers::VOffsetT = 26;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.Example.TypeAliases\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        TypeAliases { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args TypeAliasesArgs<'args>\n    ) -> ::flatbuffers::WIPOffset<TypeAliases<'bldr>> {\n        let mut builder = TypeAliasesBuilder::new(_fbb);\n        builder.add_f64_(args.f64_);\n        builder.add_u64_(args.u64_);\n        builder.add_i64_(args.i64_);\n        if let Some(x) = args.vf64 { builder.add_vf64(x); }\n        if let Some(x) = args.v8 { builder.add_v8(x); }\n        builder.add_f32_(args.f32_);\n        builder.add_u32_(args.u32_);\n        builder.add_i32_(args.i32_);\n        builder.add_u16_(args.u16_);\n        builder.add_i16_(args.i16_);\n        builder.add_u8_(args.u8_);\n        builder.add_i8_(args.i8_);\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> TypeAliasesT {\n        let i8_ = self.i8_();\n        let u8_ = self.u8_();\n        let i16_ = self.i16_();\n        let u16_ = self.u16_();\n        let i32_ = self.i32_();\n        let u32_ = self.u32_();\n        let i64_ = self.i64_();\n        let u64_ = self.u64_();\n        let f32_ = self.f32_();\n        let f64_ = self.f64_();\n        let v8 = self.v8().map(|x| {\n            x.into_iter().collect()\n        });\n        let vf64 = self.vf64().map(|x| {\n            x.into_iter().collect()\n        });\n        TypeAliasesT {\n            i8_,\n            u8_,\n            i16_,\n            u16_,\n            i32_,\n            u32_,\n            i64_,\n            u64_,\n            f32_,\n            f64_,\n            v8,\n            vf64,\n        }\n    }\n\n    #[inline]\n    pub fn i8_(&self) -> i8 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i8>(TypeAliases::VT_I8_, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn u8_(&self) -> u8 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u8>(TypeAliases::VT_U8_, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn i16_(&self) -> i16 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i16>(TypeAliases::VT_I16_, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn u16_(&self) -> u16 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u16>(TypeAliases::VT_U16_, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn i32_(&self) -> i32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i32>(TypeAliases::VT_I32_, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn u32_(&self) -> u32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u32>(TypeAliases::VT_U32_, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn i64_(&self) -> i64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i64>(TypeAliases::VT_I64_, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn u64_(&self) -> u64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u64>(TypeAliases::VT_U64_, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn f32_(&self) -> f32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f32>(TypeAliases::VT_F32_, Some(0.0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn f64_(&self) -> f64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f64>(TypeAliases::VT_F64_, Some(0.0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn v8(&self) -> Option<::flatbuffers::Vector<'a, i8>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, i8>>>(TypeAliases::VT_V8, None)}\n    }\n\n    #[inline]\n    pub fn vf64(&self) -> Option<::flatbuffers::Vector<'a, f64>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, f64>>>(TypeAliases::VT_VF64, None)}\n    }\n}\n\nimpl ::flatbuffers::Verifiable for TypeAliases<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<i8>(\"i8_\", Self::VT_I8_, false)?\n            .visit_field::<u8>(\"u8_\", Self::VT_U8_, false)?\n            .visit_field::<i16>(\"i16_\", Self::VT_I16_, false)?\n            .visit_field::<u16>(\"u16_\", Self::VT_U16_, false)?\n            .visit_field::<i32>(\"i32_\", Self::VT_I32_, false)?\n            .visit_field::<u32>(\"u32_\", Self::VT_U32_, false)?\n            .visit_field::<i64>(\"i64_\", Self::VT_I64_, false)?\n            .visit_field::<u64>(\"u64_\", Self::VT_U64_, false)?\n            .visit_field::<f32>(\"f32_\", Self::VT_F32_, false)?\n            .visit_field::<f64>(\"f64_\", Self::VT_F64_, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, i8>>>(\"v8\", Self::VT_V8, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, f64>>>(\"vf64\", Self::VT_VF64, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct TypeAliasesArgs<'a> {\n    pub i8_: i8,\n    pub u8_: u8,\n    pub i16_: i16,\n    pub u16_: u16,\n    pub i32_: i32,\n    pub u32_: u32,\n    pub i64_: i64,\n    pub u64_: u64,\n    pub f32_: f32,\n    pub f64_: f64,\n    pub v8: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, i8>>>,\n    pub vf64: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, f64>>>,\n}\n\nimpl<'a> Default for TypeAliasesArgs<'a> {\n    #[inline]\n    fn default() -> Self {\n        TypeAliasesArgs {\n            i8_: 0,\n            u8_: 0,\n            i16_: 0,\n            u16_: 0,\n            i32_: 0,\n            u32_: 0,\n            i64_: 0,\n            u64_: 0,\n            f32_: 0.0,\n            f64_: 0.0,\n            v8: None,\n            vf64: None,\n        }\n    }\n}\n\npub struct TypeAliasesBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> TypeAliasesBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_i8_(&mut self, i8_: i8) {\n        self.fbb_.push_slot::<i8>(TypeAliases::VT_I8_, i8_, 0);\n    }\n\n    #[inline]\n    pub fn add_u8_(&mut self, u8_: u8) {\n        self.fbb_.push_slot::<u8>(TypeAliases::VT_U8_, u8_, 0);\n    }\n\n    #[inline]\n    pub fn add_i16_(&mut self, i16_: i16) {\n        self.fbb_.push_slot::<i16>(TypeAliases::VT_I16_, i16_, 0);\n    }\n\n    #[inline]\n    pub fn add_u16_(&mut self, u16_: u16) {\n        self.fbb_.push_slot::<u16>(TypeAliases::VT_U16_, u16_, 0);\n    }\n\n    #[inline]\n    pub fn add_i32_(&mut self, i32_: i32) {\n        self.fbb_.push_slot::<i32>(TypeAliases::VT_I32_, i32_, 0);\n    }\n\n    #[inline]\n    pub fn add_u32_(&mut self, u32_: u32) {\n        self.fbb_.push_slot::<u32>(TypeAliases::VT_U32_, u32_, 0);\n    }\n\n    #[inline]\n    pub fn add_i64_(&mut self, i64_: i64) {\n        self.fbb_.push_slot::<i64>(TypeAliases::VT_I64_, i64_, 0);\n    }\n\n    #[inline]\n    pub fn add_u64_(&mut self, u64_: u64) {\n        self.fbb_.push_slot::<u64>(TypeAliases::VT_U64_, u64_, 0);\n    }\n\n    #[inline]\n    pub fn add_f32_(&mut self, f32_: f32) {\n        self.fbb_.push_slot::<f32>(TypeAliases::VT_F32_, f32_, 0.0);\n    }\n\n    #[inline]\n    pub fn add_f64_(&mut self, f64_: f64) {\n        self.fbb_.push_slot::<f64>(TypeAliases::VT_F64_, f64_, 0.0);\n    }\n\n    #[inline]\n    pub fn add_v8(&mut self, v8: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , i8>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(TypeAliases::VT_V8, v8);\n    }\n\n    #[inline]\n    pub fn add_vf64(&mut self, vf64: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , f64>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(TypeAliases::VT_VF64, vf64);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> TypeAliasesBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        TypeAliasesBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<TypeAliases<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for TypeAliases<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"TypeAliases\");\n        ds.field(\"i8_\", &self.i8_());\n        ds.field(\"u8_\", &self.u8_());\n        ds.field(\"i16_\", &self.i16_());\n        ds.field(\"u16_\", &self.u16_());\n        ds.field(\"i32_\", &self.i32_());\n        ds.field(\"u32_\", &self.u32_());\n        ds.field(\"i64_\", &self.i64_());\n        ds.field(\"u64_\", &self.u64_());\n        ds.field(\"f32_\", &self.f32_());\n        ds.field(\"f64_\", &self.f64_());\n        ds.field(\"v8\", &self.v8());\n        ds.field(\"vf64\", &self.vf64());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct TypeAliasesT {\n    pub i8_: i8,\n    pub u8_: u8,\n    pub i16_: i16,\n    pub u16_: u16,\n    pub i32_: i32,\n    pub u32_: u32,\n    pub i64_: i64,\n    pub u64_: u64,\n    pub f32_: f32,\n    pub f64_: f64,\n    pub v8: Option<alloc::vec::Vec<i8>>,\n    pub vf64: Option<alloc::vec::Vec<f64>>,\n}\n\nimpl Default for TypeAliasesT {\n    fn default() -> Self {\n        Self {\n            i8_: 0,\n            u8_: 0,\n            i16_: 0,\n            u16_: 0,\n            i32_: 0,\n            u32_: 0,\n            i64_: 0,\n            u64_: 0,\n            f32_: 0.0,\n            f64_: 0.0,\n            v8: None,\n            vf64: None,\n        }\n    }\n}\n\nimpl TypeAliasesT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<TypeAliases<'b>> {\n        let i8_ = self.i8_;\n        let u8_ = self.u8_;\n        let i16_ = self.i16_;\n        let u16_ = self.u16_;\n        let i32_ = self.i32_;\n        let u32_ = self.u32_;\n        let i64_ = self.i64_;\n        let u64_ = self.u64_;\n        let f32_ = self.f32_;\n        let f64_ = self.f64_;\n        let v8 = self.v8.as_ref().map(|x|{\n            _fbb.create_vector(x)\n        });\n        let vf64 = self.vf64.as_ref().map(|x|{\n            _fbb.create_vector(x)\n        });\n        TypeAliases::create(_fbb, &TypeAliasesArgs{\n            i8_,\n            u8_,\n            i16_,\n            u16_,\n            i32_,\n            u32_,\n            i64_,\n            u64_,\n            f32_,\n            f64_,\n            v8,\n            vf64,\n        })\n    }\n}\n"
  },
  {
    "path": "tests/monster_test/my_game/example/vec_3_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n// struct Vec3, aligned to 8\n#[repr(transparent)]\n#[derive(Clone, Copy, PartialEq)]\npub struct Vec3(pub [u8; 32]);\n\nimpl Default for Vec3 {\n    fn default() -> Self {\n        Self([0; 32])\n    }\n}\n\nimpl ::core::fmt::Debug for Vec3 {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        f.debug_struct(\"Vec3\")\n            .field(\"x\", &self.x())\n            .field(\"y\", &self.y())\n            .field(\"z\", &self.z())\n            .field(\"test1\", &self.test1())\n            .field(\"test2\", &self.test2())\n            .field(\"test3\", &self.test3())\n            .finish()\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for Vec3 {}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Vec3 {\n    type Inner = &'a Vec3;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { <&'a Vec3>::follow(buf, loc) }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for &'a Vec3 {\n    type Inner = &'a Vec3;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { ::flatbuffers::follow_cast_ref::<Vec3>(buf, loc) }\n    }\n}\n\nimpl<'b> ::flatbuffers::Push for Vec3 {\n    type Output = Vec3;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        let src = unsafe { ::core::slice::from_raw_parts(self as *const Vec3 as *const u8, <Self as ::flatbuffers::Push>::size()) };\n        dst.copy_from_slice(src);\n    }\n\n    #[inline]\n    fn alignment() -> ::flatbuffers::PushAlignment {\n        ::flatbuffers::PushAlignment::new(8)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for Vec3 {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.in_buffer::<Self>(pos)\n    }\n}\n\nimpl<'a> Vec3 {\n    #[allow(clippy::too_many_arguments)]\n    pub fn new(\n        x: f32,\n        y: f32,\n        z: f32,\n        test1: f64,\n        test2: Color,\n        test3: &Test,\n    ) -> Self {\n        let mut s = Self([0; 32]);\n        s.set_x(x);\n        s.set_y(y);\n        s.set_z(z);\n        s.set_test1(test1);\n        s.set_test2(test2);\n        s.set_test3(test3);\n        s\n    }\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.Example.Vec3\"\n    }\n\n    pub fn x(&self) -> f32 {\n        let mut mem = ::core::mem::MaybeUninit::<<f32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[0..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_x(&mut self, x: f32) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[0..].as_mut_ptr(),\n                ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn y(&self) -> f32 {\n        let mut mem = ::core::mem::MaybeUninit::<<f32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[4..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_y(&mut self, x: f32) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[4..].as_mut_ptr(),\n                ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn z(&self) -> f32 {\n        let mut mem = ::core::mem::MaybeUninit::<<f32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[8..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_z(&mut self, x: f32) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[8..].as_mut_ptr(),\n                ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn test1(&self) -> f64 {\n        let mut mem = ::core::mem::MaybeUninit::<<f64 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[16..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<f64 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_test1(&mut self, x: f64) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[16..].as_mut_ptr(),\n                ::core::mem::size_of::<<f64 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn test2(&self) -> Color {\n        let mut mem = ::core::mem::MaybeUninit::<<Color as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[24..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<Color as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_test2(&mut self, x: Color) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[24..].as_mut_ptr(),\n                ::core::mem::size_of::<<Color as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn test3(&self) -> &Test {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid struct in this slot\n        unsafe { &*(self.0[26..].as_ptr() as *const Test) }\n    }\n\n    #[allow(clippy::identity_op)]\n    pub fn set_test3(&mut self, x: &Test) {\n        self.0[26..26 + 4].copy_from_slice(&x.0)\n    }\n\n    pub fn unpack(&self) -> Vec3T {\n        Vec3T {\n            x: self.x(),\n            y: self.y(),\n            z: self.z(),\n            test1: self.test1(),\n            test2: self.test2(),\n            test3: self.test3().unpack(),\n        }\n    }\n}\n\n#[derive(Debug, Clone, PartialEq)]\npub struct Vec3T {\n    pub x: f32,\n    pub y: f32,\n    pub z: f32,\n    pub test1: f64,\n    pub test2: Color,\n    pub test3: TestT,\n}\nimpl Default for Vec3T {\n    fn default() -> Self {\n        Self {\n            x: 0.0,\n            y: 0.0,\n            z: 0.0,\n            test1: 0.0,\n            test2: Default::default(),\n            test3: Default::default(),\n        }\n    }\n}\n\nimpl Vec3T {\n    pub fn pack(&self) -> Vec3 {\n        Vec3::new(\n            self.x,\n            self.y,\n            self.z,\n            self.test1,\n            self.test2,\n            &self.test3.pack(),\n        )\n    }\n}\n"
  },
  {
    "path": "tests/monster_test/my_game/example_2/monster_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum MonsterOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct Monster<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Monster<'a> {\n    type Inner = Monster<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> Monster<'a> {\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.Example2.Monster\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        Monster { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        _args: &'args MonsterArgs\n    ) -> ::flatbuffers::WIPOffset<Monster<'bldr>> {\n        let mut builder = MonsterBuilder::new(_fbb);\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> MonsterT {\n        MonsterT {\n        }\n    }\n}\n\nimpl ::flatbuffers::Verifiable for Monster<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct MonsterArgs {\n}\n\nimpl<'a> Default for MonsterArgs {\n    #[inline]\n    fn default() -> Self {\n        MonsterArgs {\n        }\n    }\n}\n\npub struct MonsterBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> MonsterBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> MonsterBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        MonsterBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<Monster<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for Monster<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"Monster\");\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct MonsterT {\n}\n\nimpl Default for MonsterT {\n    fn default() -> Self {\n        Self {\n        }\n    }\n}\n\nimpl MonsterT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<Monster<'b>> {\n        Monster::create(_fbb, &MonsterArgs{\n        })\n    }\n}\n"
  },
  {
    "path": "tests/monster_test/my_game/in_parent_namespace_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum InParentNamespaceOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct InParentNamespace<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for InParentNamespace<'a> {\n    type Inner = InParentNamespace<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> InParentNamespace<'a> {\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.InParentNamespace\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        InParentNamespace { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        _args: &'args InParentNamespaceArgs\n    ) -> ::flatbuffers::WIPOffset<InParentNamespace<'bldr>> {\n        let mut builder = InParentNamespaceBuilder::new(_fbb);\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> InParentNamespaceT {\n        InParentNamespaceT {\n        }\n    }\n}\n\nimpl ::flatbuffers::Verifiable for InParentNamespace<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct InParentNamespaceArgs {\n}\n\nimpl<'a> Default for InParentNamespaceArgs {\n    #[inline]\n    fn default() -> Self {\n        InParentNamespaceArgs {\n        }\n    }\n}\n\npub struct InParentNamespaceBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> InParentNamespaceBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> InParentNamespaceBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        InParentNamespaceBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<InParentNamespace<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for InParentNamespace<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"InParentNamespace\");\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct InParentNamespaceT {\n}\n\nimpl Default for InParentNamespaceT {\n    fn default() -> Self {\n        Self {\n        }\n    }\n}\n\nimpl InParentNamespaceT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<InParentNamespace<'b>> {\n        InParentNamespace::create(_fbb, &InParentNamespaceArgs{\n        })\n    }\n}\n"
  },
  {
    "path": "tests/monster_test/my_game/other_name_space/from_include_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MIN_FROM_INCLUDE: i64 = 0;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MAX_FROM_INCLUDE: i64 = 0;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n#[allow(non_camel_case_types)]\npub const ENUM_VALUES_FROM_INCLUDE: [FromInclude; 1] = [\n    FromInclude::IncludeVal,\n];\n\n#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n#[repr(transparent)]\npub struct FromInclude(pub i64);\n\n#[allow(non_upper_case_globals)]\nimpl FromInclude {\n    pub const IncludeVal: Self = Self(0);\n\n    pub const ENUM_MIN: i64 = 0;\n    pub const ENUM_MAX: i64 = 0;\n    pub const ENUM_VALUES: &'static [Self] = &[\n        Self::IncludeVal,\n    ];\n\n    /// Returns the variant's name or \"\" if unknown.\n    pub fn variant_name(self) -> Option<&'static str> {\n        match self {\n            Self::IncludeVal => Some(\"IncludeVal\"),\n            _ => None,\n        }\n    }\n}\n\nimpl ::core::fmt::Debug for FromInclude {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        if let Some(name) = self.variant_name() {\n            f.write_str(name)\n        } else {\n            f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n        }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for FromInclude {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<i64>(buf, loc) };\n        Self(b)\n    }\n}\n\nimpl ::flatbuffers::Push for FromInclude {\n    type Output = FromInclude;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<i64>(dst, self.0) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for FromInclude {\n    type Scalar = i64;\n\n    #[inline]\n    fn to_little_endian(self) -> i64 {\n        self.0.to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: i64) -> Self {\n        let b = i64::from_le(v);\n        Self(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for FromInclude {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        i64::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for FromInclude {}\n"
  },
  {
    "path": "tests/monster_test/my_game/other_name_space/table_b_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum TableBOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct TableB<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for TableB<'a> {\n    type Inner = TableB<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> TableB<'a> {\n    pub const VT_A: ::flatbuffers::VOffsetT = 4;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.OtherNameSpace.TableB\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        TableB { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args TableBArgs<'args>\n    ) -> ::flatbuffers::WIPOffset<TableB<'bldr>> {\n        let mut builder = TableBBuilder::new(_fbb);\n        if let Some(x) = args.a { builder.add_a(x); }\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> TableBT {\n        let a = self.a().map(|x| {\n            alloc::boxed::Box::new(x.unpack())\n        });\n        TableBT {\n            a,\n        }\n    }\n\n    #[inline]\n    pub fn a(&self) -> Option<super::super::TableA<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<super::super::TableA>>(TableB::VT_A, None)}\n    }\n}\n\nimpl ::flatbuffers::Verifiable for TableB<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<super::super::TableA>>(\"a\", Self::VT_A, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct TableBArgs<'a> {\n    pub a: Option<::flatbuffers::WIPOffset<super::super::TableA<'a>>>,\n}\n\nimpl<'a> Default for TableBArgs<'a> {\n    #[inline]\n    fn default() -> Self {\n        TableBArgs {\n            a: None,\n        }\n    }\n}\n\npub struct TableBBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> TableBBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_a(&mut self, a: ::flatbuffers::WIPOffset<super::super::TableA<'b >>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<super::super::TableA>>(TableB::VT_A, a);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> TableBBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        TableBBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<TableB<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for TableB<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"TableB\");\n        ds.field(\"a\", &self.a());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct TableBT {\n    pub a: Option<alloc::boxed::Box<super::super::TableAT>>,\n}\n\nimpl Default for TableBT {\n    fn default() -> Self {\n        Self {\n            a: None,\n        }\n    }\n}\n\nimpl TableBT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<TableB<'b>> {\n        let a = self.a.as_ref().map(|x|{\n            x.pack(_fbb)\n        });\n        TableB::create(_fbb, &TableBArgs{\n            a,\n        })\n    }\n}\n"
  },
  {
    "path": "tests/monster_test/my_game/other_name_space/unused_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n// struct Unused, aligned to 4\n#[repr(transparent)]\n#[derive(Clone, Copy, PartialEq)]\npub struct Unused(pub [u8; 4]);\n\nimpl Default for Unused {\n    fn default() -> Self {\n        Self([0; 4])\n    }\n}\n\nimpl ::core::fmt::Debug for Unused {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        f.debug_struct(\"Unused\")\n            .field(\"a\", &self.a())\n            .finish()\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for Unused {}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Unused {\n    type Inner = &'a Unused;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { <&'a Unused>::follow(buf, loc) }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for &'a Unused {\n    type Inner = &'a Unused;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { ::flatbuffers::follow_cast_ref::<Unused>(buf, loc) }\n    }\n}\n\nimpl<'b> ::flatbuffers::Push for Unused {\n    type Output = Unused;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        let src = unsafe { ::core::slice::from_raw_parts(self as *const Unused as *const u8, <Self as ::flatbuffers::Push>::size()) };\n        dst.copy_from_slice(src);\n    }\n\n    #[inline]\n    fn alignment() -> ::flatbuffers::PushAlignment {\n        ::flatbuffers::PushAlignment::new(4)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for Unused {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.in_buffer::<Self>(pos)\n    }\n}\n\nimpl<'a> Unused {\n    #[allow(clippy::too_many_arguments)]\n    pub fn new(\n        a: i32,\n    ) -> Self {\n        let mut s = Self([0; 4]);\n        s.set_a(a);\n        s\n    }\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.OtherNameSpace.Unused\"\n    }\n\n    pub fn a(&self) -> i32 {\n        let mut mem = ::core::mem::MaybeUninit::<<i32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[0..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<i32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_a(&mut self, x: i32) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[0..].as_mut_ptr(),\n                ::core::mem::size_of::<<i32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn unpack(&self) -> UnusedT {\n        UnusedT {\n            a: self.a(),\n        }\n    }\n}\n\n#[derive(Debug, Clone, PartialEq)]\npub struct UnusedT {\n    pub a: i32,\n}\nimpl Default for UnusedT {\n    fn default() -> Self {\n        Self {\n            a: 0,\n        }\n    }\n}\n\nimpl UnusedT {\n    pub fn pack(&self) -> Unused {\n        Unused::new(\n            self.a,\n        )\n    }\n}\n"
  },
  {
    "path": "tests/monster_test/table_a_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum TableAOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct TableA<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for TableA<'a> {\n    type Inner = TableA<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> TableA<'a> {\n    pub const VT_B: ::flatbuffers::VOffsetT = 4;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"TableA\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        TableA { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args TableAArgs<'args>\n    ) -> ::flatbuffers::WIPOffset<TableA<'bldr>> {\n        let mut builder = TableABuilder::new(_fbb);\n        if let Some(x) = args.b { builder.add_b(x); }\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> TableAT {\n        let b = self.b().map(|x| {\n            alloc::boxed::Box::new(x.unpack())\n        });\n        TableAT {\n            b,\n        }\n    }\n\n    #[inline]\n    pub fn b(&self) -> Option<my_game::other_name_space::TableB<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<my_game::other_name_space::TableB>>(TableA::VT_B, None)}\n    }\n}\n\nimpl ::flatbuffers::Verifiable for TableA<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<my_game::other_name_space::TableB>>(\"b\", Self::VT_B, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct TableAArgs<'a> {\n    pub b: Option<::flatbuffers::WIPOffset<my_game::other_name_space::TableB<'a>>>,\n}\n\nimpl<'a> Default for TableAArgs<'a> {\n    #[inline]\n    fn default() -> Self {\n        TableAArgs {\n            b: None,\n        }\n    }\n}\n\npub struct TableABuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> TableABuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_b(&mut self, b: ::flatbuffers::WIPOffset<my_game::other_name_space::TableB<'b >>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<my_game::other_name_space::TableB>>(TableA::VT_B, b);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> TableABuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        TableABuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<TableA<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for TableA<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"TableA\");\n        ds.field(\"b\", &self.b());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct TableAT {\n    pub b: Option<alloc::boxed::Box<my_game::other_name_space::TableBT>>,\n}\n\nimpl Default for TableAT {\n    fn default() -> Self {\n        Self {\n            b: None,\n        }\n    }\n}\n\nimpl TableAT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<TableA<'b>> {\n        let b = self.b.as_ref().map(|x|{\n            x.pack(_fbb)\n        });\n        TableA::create(_fbb, &TableAArgs{\n            b,\n        })\n    }\n}\n"
  },
  {
    "path": "tests/monster_test.afb",
    "content": "// Annotated Flatbuffer Binary\n//\n// Schema file: ../reflection/reflection.fbs\n// Binary file: monster_test.bfbs\n\nheader:\n  +0x0000 | 20 00 00 00             | UOffset32  | 0x00000020 (32) Loc: 0x0020        | offset to root table `reflection.Schema`\n  +0x0004 | 42 46 42 53             | char[4]    | BFBS                               | File Identifier\n\npadding:\n  +0x0008 | 00 00 00 00             | uint8_t[4] | ....                               | padding\n\nvtable (reflection.Schema):\n  +0x000C | 14 00                   | uint16_t   | 0x0014 (20)                        | size of this vtable\n  +0x000E | 20 00                   | uint16_t   | 0x0020 (32)                        | size of referring table\n  +0x0010 | 04 00                   | VOffset16  | 0x0004 (4)                         | offset to field `objects` (id: 0)\n  +0x0012 | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `enums` (id: 1)\n  +0x0014 | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `file_ident` (id: 2)\n  +0x0016 | 10 00                   | VOffset16  | 0x0010 (16)                        | offset to field `file_ext` (id: 3)\n  +0x0018 | 14 00                   | VOffset16  | 0x0014 (20)                        | offset to field `root_table` (id: 4)\n  +0x001A | 18 00                   | VOffset16  | 0x0018 (24)                        | offset to field `services` (id: 5)\n  +0x001C | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `advanced_features` (id: 6) <defaults to 0> (ULong)\n  +0x001E | 1C 00                   | VOffset16  | 0x001C (28)                        | offset to field `fbs_files` (id: 7)\n\nroot_table (reflection.Schema):\n  +0x0020 | 14 00 00 00             | SOffset32  | 0x00000014 (20) Loc: 0x000C        | offset to vtable\n  +0x0024 | 58 00 00 00             | UOffset32  | 0x00000058 (88) Loc: 0x007C        | offset to field `objects` (vector)\n  +0x0028 | 34 00 00 00             | UOffset32  | 0x00000034 (52) Loc: 0x005C        | offset to field `enums` (vector)\n  +0x002C | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x0050        | offset to field `file_ident` (string)\n  +0x0030 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x0048        | offset to field `file_ext` (string)\n  +0x0034 | 70 0D 00 00             | UOffset32  | 0x00000D70 (3440) Loc: 0x0DA4      | offset to field `root_table` (table)\n  +0x0038 | 08 00 00 00             | UOffset32  | 0x00000008 (8) Loc: 0x0040         | offset to field `services` (vector)\n  +0x003C | 80 00 00 00             | UOffset32  | 0x00000080 (128) Loc: 0x00BC       | offset to field `fbs_files` (vector)\n\nvector (reflection.Schema.services):\n  +0x0040 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x0044 | DC 00 00 00             | UOffset32  | 0x000000DC (220) Loc: 0x0120       | offset to table[0]\n\nstring (reflection.Schema.file_ext):\n  +0x0048 | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | length of string\n  +0x004C | 6D 6F 6E                | char[3]    | mon                                | string literal\n  +0x004F | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.Schema.file_ident):\n  +0x0050 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of string\n  +0x0054 | 4D 4F 4E 53             | char[4]    | MONS                               | string literal\n  +0x0058 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x0059 | 00 00 00                | uint8_t[3] | ...                                | padding\n\nvector (reflection.Schema.enums):\n  +0x005C | 07 00 00 00             | uint32_t   | 0x00000007 (7)                     | length of vector (# items)\n  +0x0060 | D4 04 00 00             | UOffset32  | 0x000004D4 (1236) Loc: 0x0534      | offset to table[0]\n  +0x0064 | 90 02 00 00             | UOffset32  | 0x00000290 (656) Loc: 0x02F4       | offset to table[1]\n  +0x0068 | A8 03 00 00             | UOffset32  | 0x000003A8 (936) Loc: 0x0410       | offset to table[2]\n  +0x006C | 30 08 00 00             | UOffset32  | 0x00000830 (2096) Loc: 0x089C      | offset to table[3]\n  +0x0070 | 00 06 00 00             | UOffset32  | 0x00000600 (1536) Loc: 0x0670      | offset to table[4]\n  +0x0074 | 0C 07 00 00             | UOffset32  | 0x0000070C (1804) Loc: 0x0780      | offset to table[5]\n  +0x0078 | 14 0A 00 00             | UOffset32  | 0x00000A14 (2580) Loc: 0x0A8C      | offset to table[6]\n\nvector (reflection.Schema.objects):\n  +0x007C | 0F 00 00 00             | uint32_t   | 0x0000000F (15)                    | length of vector (# items)\n  +0x0080 | 94 31 00 00             | UOffset32  | 0x00003194 (12692) Loc: 0x3214     | offset to table[0]\n  +0x0084 | 20 0D 00 00             | UOffset32  | 0x00000D20 (3360) Loc: 0x0DA4      | offset to table[1]\n  +0x0088 | 8C 2E 00 00             | UOffset32  | 0x00002E8C (11916) Loc: 0x2F14     | offset to table[2]\n  +0x008C | 58 2F 00 00             | UOffset32  | 0x00002F58 (12120) Loc: 0x2FE4     | offset to table[3]\n  +0x0090 | C0 30 00 00             | UOffset32  | 0x000030C0 (12480) Loc: 0x3150     | offset to table[4]\n  +0x0094 | 48 30 00 00             | UOffset32  | 0x00003048 (12360) Loc: 0x30DC     | offset to table[5]\n  +0x0098 | FC 34 00 00             | UOffset32  | 0x000034FC (13564) Loc: 0x3594     | offset to table[6]\n  +0x009C | FC 33 00 00             | UOffset32  | 0x000033FC (13308) Loc: 0x3498     | offset to table[7]\n  +0x00A0 | 88 0A 00 00             | UOffset32  | 0x00000A88 (2696) Loc: 0x0B28      | offset to table[8]\n  +0x00A4 | 58 32 00 00             | UOffset32  | 0x00003258 (12888) Loc: 0x32FC     | offset to table[9]\n  +0x00A8 | AC 35 00 00             | UOffset32  | 0x000035AC (13740) Loc: 0x3654     | offset to table[10]\n  +0x00AC | DC 35 00 00             | UOffset32  | 0x000035DC (13788) Loc: 0x3688     | offset to table[11]\n  +0x00B0 | B4 36 00 00             | UOffset32  | 0x000036B4 (14004) Loc: 0x3764     | offset to table[12]\n  +0x00B4 | 58 37 00 00             | UOffset32  | 0x00003758 (14168) Loc: 0x380C     | offset to table[13]\n  +0x00B8 | 20 36 00 00             | UOffset32  | 0x00003620 (13856) Loc: 0x36D8     | offset to table[14]\n\nvector (reflection.Schema.fbs_files):\n  +0x00BC | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | length of vector (# items)\n  +0x00C0 | 38 00 00 00             | UOffset32  | 0x00000038 (56) Loc: 0x00F8        | offset to table[0]\n  +0x00C4 | 1C 00 00 00             | UOffset32  | 0x0000001C (28) Loc: 0x00E0        | offset to table[1]\n  +0x00C8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x00CC         | offset to table[2]\n\ntable (reflection.SchemaFile):\n  +0x00CC | 4C C8 FF FF             | SOffset32  | 0xFFFFC84C (-14260) Loc: 0x3880    | offset to vtable\n  +0x00D0 | CC 35 00 00             | UOffset32  | 0x000035CC (13772) Loc: 0x369C     | offset to field `filename` (string)\n  +0x00D4 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x00D8         | offset to field `included_filenames` (vector)\n\nvector (reflection.SchemaFile.included_filenames):\n  +0x00D8 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x00DC | 10 36 00 00             | UOffset32  | 0x00003610 (13840) Loc: 0x36EC     | offset to string[0]\n\ntable (reflection.SchemaFile):\n  +0x00E0 | 60 C8 FF FF             | SOffset32  | 0xFFFFC860 (-14240) Loc: 0x3880    | offset to vtable\n  +0x00E4 | 44 37 00 00             | UOffset32  | 0x00003744 (14148) Loc: 0x3828     | offset to field `filename` (string)\n  +0x00E8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x00EC         | offset to field `included_filenames` (vector)\n\nvector (reflection.SchemaFile.included_filenames):\n  +0x00EC | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of vector (# items)\n  +0x00F0 | FC 35 00 00             | UOffset32  | 0x000035FC (13820) Loc: 0x36EC     | offset to string[0]\n  +0x00F4 | 34 37 00 00             | UOffset32  | 0x00003734 (14132) Loc: 0x3828     | offset to string[1]\n\ntable (reflection.SchemaFile):\n  +0x00F8 | 78 C8 FF FF             | SOffset32  | 0xFFFFC878 (-14216) Loc: 0x3880    | offset to vtable\n  +0x00FC | F0 35 00 00             | UOffset32  | 0x000035F0 (13808) Loc: 0x36EC     | offset to field `filename` (string)\n  +0x0100 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0104         | offset to field `included_filenames` (vector)\n\nvector (reflection.SchemaFile.included_filenames):\n  +0x0104 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of vector (# items)\n  +0x0108 | E4 35 00 00             | UOffset32  | 0x000035E4 (13796) Loc: 0x36EC     | offset to string[0]\n  +0x010C | 1C 37 00 00             | UOffset32  | 0x0000371C (14108) Loc: 0x3828     | offset to string[1]\n\npadding:\n  +0x0110 | 00 00                   | uint8_t[2] | ..                                 | padding\n\nvtable (reflection.Service):\n  +0x0112 | 0E 00                   | uint16_t   | 0x000E (14)                        | size of this vtable\n  +0x0114 | 10 00                   | uint16_t   | 0x0010 (16)                        | size of referring table\n  +0x0116 | 04 00                   | VOffset16  | 0x0004 (4)                         | offset to field `name` (id: 0)\n  +0x0118 | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `calls` (id: 1)\n  +0x011A | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `attributes` (id: 2) <null> (Vector)\n  +0x011C | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `documentation` (id: 3) <null> (Vector)\n  +0x011E | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `declaration_file` (id: 4)\n\ntable (reflection.Service):\n  +0x0120 | 0E 00 00 00             | SOffset32  | 0x0000000E (14) Loc: 0x0112        | offset to vtable\n  +0x0124 | 20 00 00 00             | UOffset32  | 0x00000020 (32) Loc: 0x0144        | offset to field `name` (string)\n  +0x0128 | 08 00 00 00             | UOffset32  | 0x00000008 (8) Loc: 0x0130         | offset to field `calls` (vector)\n  +0x012C | 70 35 00 00             | UOffset32  | 0x00003570 (13680) Loc: 0x369C     | offset to field `declaration_file` (string)\n\nvector (reflection.Service.calls):\n  +0x0130 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of vector (# items)\n  +0x0134 | 70 01 00 00             | UOffset32  | 0x00000170 (368) Loc: 0x02A4       | offset to table[0]\n  +0x0138 | E4 00 00 00             | UOffset32  | 0x000000E4 (228) Loc: 0x021C       | offset to table[1]\n  +0x013C | 88 00 00 00             | UOffset32  | 0x00000088 (136) Loc: 0x01C4       | offset to table[2]\n  +0x0140 | 28 00 00 00             | UOffset32  | 0x00000028 (40) Loc: 0x0168        | offset to table[3]\n\nstring (reflection.Service.name):\n  +0x0144 | 1D 00 00 00             | uint32_t   | 0x0000001D (29)                    | length of string\n  +0x0148 | 4D 79 47 61 6D 65 2E 45 | char[29]   | MyGame.E                           | string literal\n  +0x0150 | 78 61 6D 70 6C 65 2E 4D |            | xample.M\n  +0x0158 | 6F 6E 73 74 65 72 53 74 |            | onsterSt\n  +0x0160 | 6F 72 61 67 65          |            | orage\n  +0x0165 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x0166 | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.RPCCall):\n  +0x0168 | D0 FE FF FF             | SOffset32  | 0xFFFFFED0 (-304) Loc: 0x0298      | offset to vtable\n  +0x016C | 40 00 00 00             | UOffset32  | 0x00000040 (64) Loc: 0x01AC        | offset to field `name` (string)\n  +0x0170 | 34 0C 00 00             | UOffset32  | 0x00000C34 (3124) Loc: 0x0DA4      | offset to field `request` (table)\n  +0x0174 | 70 2E 00 00             | UOffset32  | 0x00002E70 (11888) Loc: 0x2FE4     | offset to field `response` (table)\n  +0x0178 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x017C         | offset to field `attributes` (vector)\n\nvector (reflection.RPCCall.attributes):\n  +0x017C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x0180 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0184         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x0184 | 04 C9 FF FF             | SOffset32  | 0xFFFFC904 (-14076) Loc: 0x3880    | offset to vtable\n  +0x0188 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x019C        | offset to field `key` (string)\n  +0x018C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0190         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x0190 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of string\n  +0x0194 | 62 69 64 69             | char[4]    | bidi                               | string literal\n  +0x0198 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x0199 | 00 00 00                | uint8_t[3] | ...                                | padding\n\nstring (reflection.KeyValue.key):\n  +0x019C | 09 00 00 00             | uint32_t   | 0x00000009 (9)                     | length of string\n  +0x01A0 | 73 74 72 65 61 6D 69 6E | char[9]    | streamin                           | string literal\n  +0x01A8 | 67                      |            | g\n  +0x01A9 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x01AA | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.RPCCall.name):\n  +0x01AC | 12 00 00 00             | uint32_t   | 0x00000012 (18)                    | length of string\n  +0x01B0 | 47 65 74 4D 69 6E 4D 61 | char[18]   | GetMinMa                           | string literal\n  +0x01B8 | 78 48 69 74 50 6F 69 6E |            | xHitPoin\n  +0x01C0 | 74 73                   |            | ts\n  +0x01C2 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.RPCCall):\n  +0x01C4 | 2C FF FF FF             | SOffset32  | 0xFFFFFF2C (-212) Loc: 0x0298      | offset to vtable\n  +0x01C8 | 40 00 00 00             | UOffset32  | 0x00000040 (64) Loc: 0x0208        | offset to field `name` (string)\n  +0x01CC | D8 0B 00 00             | UOffset32  | 0x00000BD8 (3032) Loc: 0x0DA4      | offset to field `request` (table)\n  +0x01D0 | 14 2E 00 00             | UOffset32  | 0x00002E14 (11796) Loc: 0x2FE4     | offset to field `response` (table)\n  +0x01D4 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x01D8         | offset to field `attributes` (vector)\n\nvector (reflection.RPCCall.attributes):\n  +0x01D8 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x01DC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x01E0         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x01E0 | 60 C9 FF FF             | SOffset32  | 0xFFFFC960 (-13984) Loc: 0x3880    | offset to vtable\n  +0x01E4 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x01F8        | offset to field `key` (string)\n  +0x01E8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x01EC         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x01EC | 06 00 00 00             | uint32_t   | 0x00000006 (6)                     | length of string\n  +0x01F0 | 63 6C 69 65 6E 74       | char[6]    | client                             | string literal\n  +0x01F6 | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x01F8 | 09 00 00 00             | uint32_t   | 0x00000009 (9)                     | length of string\n  +0x01FC | 73 74 72 65 61 6D 69 6E | char[9]    | streamin                           | string literal\n  +0x0204 | 67                      |            | g\n  +0x0205 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x0206 | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.RPCCall.name):\n  +0x0208 | 0E 00 00 00             | uint32_t   | 0x0000000E (14)                    | length of string\n  +0x020C | 47 65 74 4D 61 78 48 69 | char[14]   | GetMaxHi                           | string literal\n  +0x0214 | 74 50 6F 69 6E 74       |            | tPoint\n  +0x021A | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.RPCCall):\n  +0x021C | 84 FF FF FF             | SOffset32  | 0xFFFFFF84 (-124) Loc: 0x0298      | offset to vtable\n  +0x0220 | 68 00 00 00             | UOffset32  | 0x00000068 (104) Loc: 0x0288       | offset to field `name` (string)\n  +0x0224 | C0 2D 00 00             | UOffset32  | 0x00002DC0 (11712) Loc: 0x2FE4     | offset to field `request` (table)\n  +0x0228 | 7C 0B 00 00             | UOffset32  | 0x00000B7C (2940) Loc: 0x0DA4      | offset to field `response` (table)\n  +0x022C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0230         | offset to field `attributes` (vector)\n\nvector (reflection.RPCCall.attributes):\n  +0x0230 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of vector (# items)\n  +0x0234 | 30 00 00 00             | UOffset32  | 0x00000030 (48) Loc: 0x0264        | offset to table[0]\n  +0x0238 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x023C         | offset to table[1]\n\ntable (reflection.KeyValue):\n  +0x023C | BC C9 FF FF             | SOffset32  | 0xFFFFC9BC (-13892) Loc: 0x3880    | offset to vtable\n  +0x0240 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x0254        | offset to field `key` (string)\n  +0x0244 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0248         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x0248 | 06 00 00 00             | uint32_t   | 0x00000006 (6)                     | length of string\n  +0x024C | 73 65 72 76 65 72       | char[6]    | server                             | string literal\n  +0x0252 | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x0254 | 09 00 00 00             | uint32_t   | 0x00000009 (9)                     | length of string\n  +0x0258 | 73 74 72 65 61 6D 69 6E | char[9]    | streamin                           | string literal\n  +0x0260 | 67                      |            | g\n  +0x0261 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x0262 | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.KeyValue):\n  +0x0264 | E4 C9 FF FF             | SOffset32  | 0xFFFFC9E4 (-13852) Loc: 0x3880    | offset to vtable\n  +0x0268 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x0278        | offset to field `key` (string)\n  +0x026C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0270         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x0270 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x0274 | 30                      | char[1]    | 0                                  | string literal\n  +0x0275 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x0276 | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x0278 | 0A 00 00 00             | uint32_t   | 0x0000000A (10)                    | length of string\n  +0x027C | 69 64 65 6D 70 6F 74 65 | char[10]   | idempote                           | string literal\n  +0x0284 | 6E 74                   |            | nt\n  +0x0286 | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.RPCCall.name):\n  +0x0288 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | length of string\n  +0x028C | 52 65 74 72 69 65 76 65 | char[8]    | Retrieve                           | string literal\n  +0x0294 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x0295 | 00 00 00                | uint8_t[3] | ...                                | padding\n\nvtable (reflection.RPCCall):\n  +0x0298 | 0C 00                   | uint16_t   | 0x000C (12)                        | size of this vtable\n  +0x029A | 14 00                   | uint16_t   | 0x0014 (20)                        | size of referring table\n  +0x029C | 04 00                   | VOffset16  | 0x0004 (4)                         | offset to field `name` (id: 0)\n  +0x029E | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `request` (id: 1)\n  +0x02A0 | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `response` (id: 2)\n  +0x02A2 | 10 00                   | VOffset16  | 0x0010 (16)                        | offset to field `attributes` (id: 3)\n\ntable (reflection.RPCCall):\n  +0x02A4 | 0C 00 00 00             | SOffset32  | 0x0000000C (12) Loc: 0x0298        | offset to vtable\n  +0x02A8 | 40 00 00 00             | UOffset32  | 0x00000040 (64) Loc: 0x02E8        | offset to field `name` (string)\n  +0x02AC | F8 0A 00 00             | UOffset32  | 0x00000AF8 (2808) Loc: 0x0DA4      | offset to field `request` (table)\n  +0x02B0 | 34 2D 00 00             | UOffset32  | 0x00002D34 (11572) Loc: 0x2FE4     | offset to field `response` (table)\n  +0x02B4 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x02B8         | offset to field `attributes` (vector)\n\nvector (reflection.RPCCall.attributes):\n  +0x02B8 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x02BC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x02C0         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x02C0 | 40 CA FF FF             | SOffset32  | 0xFFFFCA40 (-13760) Loc: 0x3880    | offset to vtable\n  +0x02C4 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x02D8        | offset to field `key` (string)\n  +0x02C8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x02CC         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x02CC | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of string\n  +0x02D0 | 6E 6F 6E 65             | char[4]    | none                               | string literal\n  +0x02D4 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x02D5 | 00 00 00                | uint8_t[3] | ...                                | padding\n\nstring (reflection.KeyValue.key):\n  +0x02D8 | 09 00 00 00             | uint32_t   | 0x00000009 (9)                     | length of string\n  +0x02DC | 73 74 72 65 61 6D 69 6E | char[9]    | streamin                           | string literal\n  +0x02E4 | 67                      |            | g\n  +0x02E5 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x02E6 | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.RPCCall.name):\n  +0x02E8 | 05 00 00 00             | uint32_t   | 0x00000005 (5)                     | length of string\n  +0x02EC | 53 74 6F 72 65          | char[5]    | Store                              | string literal\n  +0x02F1 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x02F2 | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Enum):\n  +0x02F4 | D2 FD FF FF             | SOffset32  | 0xFFFFFDD2 (-558) Loc: 0x0522      | offset to vtable\n  +0x02F8 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x02FB | 01                      | uint8_t    | 0x01 (1)                           | table field `is_union` (Bool)\n  +0x02FC | 38 00 00 00             | UOffset32  | 0x00000038 (56) Loc: 0x0334        | offset to field `name` (string)\n  +0x0300 | 20 00 00 00             | UOffset32  | 0x00000020 (32) Loc: 0x0320        | offset to field `values` (vector)\n  +0x0304 | 08 00 00 00             | UOffset32  | 0x00000008 (8) Loc: 0x030C         | offset to field `underlying_type` (table)\n  +0x0308 | 94 33 00 00             | UOffset32  | 0x00003394 (13204) Loc: 0x369C     | offset to field `declaration_file` (string)\n\ntable (reflection.Type):\n  +0x030C | A8 CD FF FF             | SOffset32  | 0xFFFFCDA8 (-12888) Loc: 0x3564    | offset to vtable\n  +0x0310 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x0313 | 01                      | uint8_t    | 0x01 (1)                           | table field `base_type` (Byte)\n  +0x0314 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `index` (Int)\n  +0x0318 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x031C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nvector (reflection.Enum.values):\n  +0x0320 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of vector (# items)\n  +0x0324 | C8 00 00 00             | UOffset32  | 0x000000C8 (200) Loc: 0x03EC       | offset to table[0]\n  +0x0328 | 94 00 00 00             | UOffset32  | 0x00000094 (148) Loc: 0x03BC       | offset to table[1]\n  +0x032C | 60 00 00 00             | UOffset32  | 0x00000060 (96) Loc: 0x038C        | offset to table[2]\n  +0x0330 | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x035C        | offset to table[3]\n\nstring (reflection.Enum.name):\n  +0x0334 | 22 00 00 00             | uint32_t   | 0x00000022 (34)                    | length of string\n  +0x0338 | 4D 79 47 61 6D 65 2E 45 | char[34]   | MyGame.E                           | string literal\n  +0x0340 | 78 61 6D 70 6C 65 2E 41 |            | xample.A\n  +0x0348 | 6E 79 41 6D 62 69 67 75 |            | nyAmbigu\n  +0x0350 | 6F 75 73 41 6C 69 61 73 |            | ousAlias\n  +0x0358 | 65 73                   |            | es\n  +0x035A | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.EnumVal):\n  +0x035C | 1C F9 FF FF             | SOffset32  | 0xFFFFF91C (-1764) Loc: 0x0A40     | offset to vtable\n  +0x0360 | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x0384        | offset to field `name` (string)\n  +0x0364 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x0374        | offset to field `union_type` (table)\n  +0x0368 | 03 00 00 00 00 00 00 00 | int64_t    | 0x0000000000000003 (3)             | table field `value` (Long)\n  +0x0370 | 00 00 00 00             | uint8_t[4] | ....                               | padding\n\ntable (reflection.Type):\n  +0x0374 | A4 CB FF FF             | SOffset32  | 0xFFFFCBA4 (-13404) Loc: 0x37D0    | offset to vtable\n  +0x0378 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x037B | 0F                      | uint8_t    | 0x0F (15)                          | table field `base_type` (Byte)\n  +0x037C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `index` (Int)\n  +0x0380 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.EnumVal.name):\n  +0x0384 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x0388 | 4D 33                   | char[2]    | M3                                 | string literal\n  +0x038A | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.EnumVal):\n  +0x038C | 4C F9 FF FF             | SOffset32  | 0xFFFFF94C (-1716) Loc: 0x0A40     | offset to vtable\n  +0x0390 | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x03B4        | offset to field `name` (string)\n  +0x0394 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x03A4        | offset to field `union_type` (table)\n  +0x0398 | 02 00 00 00 00 00 00 00 | int64_t    | 0x0000000000000002 (2)             | table field `value` (Long)\n  +0x03A0 | 00 00 00 00             | uint8_t[4] | ....                               | padding\n\ntable (reflection.Type):\n  +0x03A4 | D4 CB FF FF             | SOffset32  | 0xFFFFCBD4 (-13356) Loc: 0x37D0    | offset to vtable\n  +0x03A8 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x03AB | 0F                      | uint8_t    | 0x0F (15)                          | table field `base_type` (Byte)\n  +0x03AC | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `index` (Int)\n  +0x03B0 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.EnumVal.name):\n  +0x03B4 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x03B8 | 4D 32                   | char[2]    | M2                                 | string literal\n  +0x03BA | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.EnumVal):\n  +0x03BC | 7C F9 FF FF             | SOffset32  | 0xFFFFF97C (-1668) Loc: 0x0A40     | offset to vtable\n  +0x03C0 | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x03E4        | offset to field `name` (string)\n  +0x03C4 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x03D4        | offset to field `union_type` (table)\n  +0x03C8 | 01 00 00 00 00 00 00 00 | int64_t    | 0x0000000000000001 (1)             | table field `value` (Long)\n  +0x03D0 | 00 00 00 00             | uint8_t[4] | ....                               | padding\n\ntable (reflection.Type):\n  +0x03D4 | 04 CC FF FF             | SOffset32  | 0xFFFFCC04 (-13308) Loc: 0x37D0    | offset to vtable\n  +0x03D8 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x03DB | 0F                      | uint8_t    | 0x0F (15)                          | table field `base_type` (Byte)\n  +0x03DC | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `index` (Int)\n  +0x03E0 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.EnumVal.name):\n  +0x03E4 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x03E8 | 4D 31                   | char[2]    | M1                                 | string literal\n  +0x03EA | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.EnumVal):\n  +0x03EC | 08 F9 FF FF             | SOffset32  | 0xFFFFF908 (-1784) Loc: 0x0AE4     | offset to vtable\n  +0x03F0 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x0404        | offset to field `name` (string)\n  +0x03F4 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x03F8         | offset to field `union_type` (table)\n\ntable (reflection.Type):\n  +0x03F8 | FC F8 FF FF             | SOffset32  | 0xFFFFF8FC (-1796) Loc: 0x0AFC     | offset to vtable\n  +0x03FC | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x0400 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.EnumVal.name):\n  +0x0404 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of string\n  +0x0408 | 4E 4F 4E 45             | char[4]    | NONE                               | string literal\n  +0x040C | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x040D | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Enum):\n  +0x0410 | EE FE FF FF             | SOffset32  | 0xFFFFFEEE (-274) Loc: 0x0522      | offset to vtable\n  +0x0414 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x0417 | 01                      | uint8_t    | 0x01 (1)                           | table field `is_union` (Bool)\n  +0x0418 | 38 00 00 00             | UOffset32  | 0x00000038 (56) Loc: 0x0450        | offset to field `name` (string)\n  +0x041C | 20 00 00 00             | UOffset32  | 0x00000020 (32) Loc: 0x043C        | offset to field `values` (vector)\n  +0x0420 | 08 00 00 00             | UOffset32  | 0x00000008 (8) Loc: 0x0428         | offset to field `underlying_type` (table)\n  +0x0424 | 78 32 00 00             | UOffset32  | 0x00003278 (12920) Loc: 0x369C     | offset to field `declaration_file` (string)\n\ntable (reflection.Type):\n  +0x0428 | C4 CE FF FF             | SOffset32  | 0xFFFFCEC4 (-12604) Loc: 0x3564    | offset to vtable\n  +0x042C | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x042F | 01                      | uint8_t    | 0x01 (1)                           | table field `base_type` (Byte)\n  +0x0430 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | table field `index` (Int)\n  +0x0434 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x0438 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nvector (reflection.Enum.values):\n  +0x043C | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of vector (# items)\n  +0x0440 | C0 00 00 00             | UOffset32  | 0x000000C0 (192) Loc: 0x0500       | offset to table[0]\n  +0x0444 | 90 00 00 00             | UOffset32  | 0x00000090 (144) Loc: 0x04D4       | offset to table[1]\n  +0x0448 | 5C 00 00 00             | UOffset32  | 0x0000005C (92) Loc: 0x04A4        | offset to table[2]\n  +0x044C | 28 00 00 00             | UOffset32  | 0x00000028 (40) Loc: 0x0474        | offset to table[3]\n\nstring (reflection.Enum.name):\n  +0x0450 | 1F 00 00 00             | uint32_t   | 0x0000001F (31)                    | length of string\n  +0x0454 | 4D 79 47 61 6D 65 2E 45 | char[31]   | MyGame.E                           | string literal\n  +0x045C | 78 61 6D 70 6C 65 2E 41 |            | xample.A\n  +0x0464 | 6E 79 55 6E 69 71 75 65 |            | nyUnique\n  +0x046C | 41 6C 69 61 73 65 73    |            | Aliases\n  +0x0473 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.EnumVal):\n  +0x0474 | 34 FA FF FF             | SOffset32  | 0xFFFFFA34 (-1484) Loc: 0x0A40     | offset to vtable\n  +0x0478 | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x049C        | offset to field `name` (string)\n  +0x047C | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x048C        | offset to field `union_type` (table)\n  +0x0480 | 03 00 00 00 00 00 00 00 | int64_t    | 0x0000000000000003 (3)             | table field `value` (Long)\n  +0x0488 | 00 00 00 00             | uint8_t[4] | ....                               | padding\n\ntable (reflection.Type):\n  +0x048C | BC CC FF FF             | SOffset32  | 0xFFFFCCBC (-13124) Loc: 0x37D0    | offset to vtable\n  +0x0490 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x0493 | 0F                      | uint8_t    | 0x0F (15)                          | table field `base_type` (Byte)\n  +0x0494 | 0A 00 00 00             | uint32_t   | 0x0000000A (10)                    | table field `index` (Int)\n  +0x0498 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.EnumVal.name):\n  +0x049C | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x04A0 | 4D 32                   | char[2]    | M2                                 | string literal\n  +0x04A2 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.EnumVal):\n  +0x04A4 | 64 FA FF FF             | SOffset32  | 0xFFFFFA64 (-1436) Loc: 0x0A40     | offset to vtable\n  +0x04A8 | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x04CC        | offset to field `name` (string)\n  +0x04AC | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x04BC        | offset to field `union_type` (table)\n  +0x04B0 | 02 00 00 00 00 00 00 00 | int64_t    | 0x0000000000000002 (2)             | table field `value` (Long)\n  +0x04B8 | 00 00 00 00             | uint8_t[4] | ....                               | padding\n\ntable (reflection.Type):\n  +0x04BC | EC CC FF FF             | SOffset32  | 0xFFFFCCEC (-13076) Loc: 0x37D0    | offset to vtable\n  +0x04C0 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x04C3 | 0F                      | uint8_t    | 0x0F (15)                          | table field `base_type` (Byte)\n  +0x04C4 | 07 00 00 00             | uint32_t   | 0x00000007 (7)                     | table field `index` (Int)\n  +0x04C8 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.EnumVal.name):\n  +0x04CC | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x04D0 | 54 53                   | char[2]    | TS                                 | string literal\n  +0x04D2 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.EnumVal):\n  +0x04D4 | D4 FC FF FF             | SOffset32  | 0xFFFFFCD4 (-812) Loc: 0x0800      | offset to vtable\n  +0x04D8 | 20 00 00 00             | UOffset32  | 0x00000020 (32) Loc: 0x04F8        | offset to field `name` (string)\n  +0x04DC | 0C 00 00 00             | UOffset32  | 0x0000000C (12) Loc: 0x04E8        | offset to field `union_type` (table)\n  +0x04E0 | 01 00 00 00 00 00 00 00 | int64_t    | 0x0000000000000001 (1)             | table field `value` (Long)\n\ntable (reflection.Type):\n  +0x04E8 | 18 CD FF FF             | SOffset32  | 0xFFFFCD18 (-13032) Loc: 0x37D0    | offset to vtable\n  +0x04EC | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x04EF | 0F                      | uint8_t    | 0x0F (15)                          | table field `base_type` (Byte)\n  +0x04F0 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `index` (Int)\n  +0x04F4 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.EnumVal.name):\n  +0x04F8 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x04FC | 4D                      | char[1]    | M                                  | string literal\n  +0x04FD | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x04FE | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.EnumVal):\n  +0x0500 | 1C FA FF FF             | SOffset32  | 0xFFFFFA1C (-1508) Loc: 0x0AE4     | offset to vtable\n  +0x0504 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x0518        | offset to field `name` (string)\n  +0x0508 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x050C         | offset to field `union_type` (table)\n\ntable (reflection.Type):\n  +0x050C | 10 FA FF FF             | SOffset32  | 0xFFFFFA10 (-1520) Loc: 0x0AFC     | offset to vtable\n  +0x0510 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x0514 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.EnumVal.name):\n  +0x0518 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of string\n  +0x051C | 4E 4F 4E 45             | char[4]    | NONE                               | string literal\n  +0x0520 | 00                      | char       | 0x00 (0)                           | string terminator\n\nvtable (reflection.Enum):\n  +0x0522 | 12 00                   | uint16_t   | 0x0012 (18)                        | size of this vtable\n  +0x0524 | 18 00                   | uint16_t   | 0x0018 (24)                        | size of referring table\n  +0x0526 | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `name` (id: 0)\n  +0x0528 | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `values` (id: 1)\n  +0x052A | 07 00                   | VOffset16  | 0x0007 (7)                         | offset to field `is_union` (id: 2)\n  +0x052C | 10 00                   | VOffset16  | 0x0010 (16)                        | offset to field `underlying_type` (id: 3)\n  +0x052E | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `attributes` (id: 4) <null> (Vector)\n  +0x0530 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `documentation` (id: 5) <null> (Vector)\n  +0x0532 | 14 00                   | VOffset16  | 0x0014 (20)                        | offset to field `declaration_file` (id: 6)\n\ntable (reflection.Enum):\n  +0x0534 | 12 00 00 00             | SOffset32  | 0x00000012 (18) Loc: 0x0522        | offset to vtable\n  +0x0538 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x053B | 01                      | uint8_t    | 0x01 (1)                           | table field `is_union` (Bool)\n  +0x053C | 38 00 00 00             | UOffset32  | 0x00000038 (56) Loc: 0x0574        | offset to field `name` (string)\n  +0x0540 | 20 00 00 00             | UOffset32  | 0x00000020 (32) Loc: 0x0560        | offset to field `values` (vector)\n  +0x0544 | 08 00 00 00             | UOffset32  | 0x00000008 (8) Loc: 0x054C         | offset to field `underlying_type` (table)\n  +0x0548 | 54 31 00 00             | UOffset32  | 0x00003154 (12628) Loc: 0x369C     | offset to field `declaration_file` (string)\n\ntable (reflection.Type):\n  +0x054C | E8 CF FF FF             | SOffset32  | 0xFFFFCFE8 (-12312) Loc: 0x3564    | offset to vtable\n  +0x0550 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x0553 | 01                      | uint8_t    | 0x01 (1)                           | table field `base_type` (Byte)\n  +0x0554 | 00 00 00 00             | uint32_t   | 0x00000000 (0)                     | table field `index` (Int)\n  +0x0558 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x055C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nvector (reflection.Enum.values):\n  +0x0560 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of vector (# items)\n  +0x0564 | D8 00 00 00             | UOffset32  | 0x000000D8 (216) Loc: 0x063C       | offset to table[0]\n  +0x0568 | A4 00 00 00             | UOffset32  | 0x000000A4 (164) Loc: 0x060C       | offset to table[1]\n  +0x056C | 60 00 00 00             | UOffset32  | 0x00000060 (96) Loc: 0x05CC        | offset to table[2]\n  +0x0570 | 1C 00 00 00             | UOffset32  | 0x0000001C (28) Loc: 0x058C        | offset to table[3]\n\nstring (reflection.Enum.name):\n  +0x0574 | 12 00 00 00             | uint32_t   | 0x00000012 (18)                    | length of string\n  +0x0578 | 4D 79 47 61 6D 65 2E 45 | char[18]   | MyGame.E                           | string literal\n  +0x0580 | 78 61 6D 70 6C 65 2E 41 |            | xample.A\n  +0x0588 | 6E 79                   |            | ny\n  +0x058A | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.EnumVal):\n  +0x058C | 8C FD FF FF             | SOffset32  | 0xFFFFFD8C (-628) Loc: 0x0800      | offset to vtable\n  +0x0590 | 20 00 00 00             | UOffset32  | 0x00000020 (32) Loc: 0x05B0        | offset to field `name` (string)\n  +0x0594 | 0C 00 00 00             | UOffset32  | 0x0000000C (12) Loc: 0x05A0        | offset to field `union_type` (table)\n  +0x0598 | 03 00 00 00 00 00 00 00 | int64_t    | 0x0000000000000003 (3)             | table field `value` (Long)\n\ntable (reflection.Type):\n  +0x05A0 | D0 CD FF FF             | SOffset32  | 0xFFFFCDD0 (-12848) Loc: 0x37D0    | offset to vtable\n  +0x05A4 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x05A7 | 0F                      | uint8_t    | 0x0F (15)                          | table field `base_type` (Byte)\n  +0x05A8 | 0A 00 00 00             | uint32_t   | 0x0000000A (10)                    | table field `index` (Int)\n  +0x05AC | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.EnumVal.name):\n  +0x05B0 | 17 00 00 00             | uint32_t   | 0x00000017 (23)                    | length of string\n  +0x05B4 | 4D 79 47 61 6D 65 5F 45 | char[23]   | MyGame_E                           | string literal\n  +0x05BC | 78 61 6D 70 6C 65 32 5F |            | xample2_\n  +0x05C4 | 4D 6F 6E 73 74 65 72    |            | Monster\n  +0x05CB | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.EnumVal):\n  +0x05CC | CC FD FF FF             | SOffset32  | 0xFFFFFDCC (-564) Loc: 0x0800      | offset to vtable\n  +0x05D0 | 20 00 00 00             | UOffset32  | 0x00000020 (32) Loc: 0x05F0        | offset to field `name` (string)\n  +0x05D4 | 0C 00 00 00             | UOffset32  | 0x0000000C (12) Loc: 0x05E0        | offset to field `union_type` (table)\n  +0x05D8 | 02 00 00 00 00 00 00 00 | int64_t    | 0x0000000000000002 (2)             | table field `value` (Long)\n\ntable (reflection.Type):\n  +0x05E0 | 10 CE FF FF             | SOffset32  | 0xFFFFCE10 (-12784) Loc: 0x37D0    | offset to vtable\n  +0x05E4 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x05E7 | 0F                      | uint8_t    | 0x0F (15)                          | table field `base_type` (Byte)\n  +0x05E8 | 07 00 00 00             | uint32_t   | 0x00000007 (7)                     | table field `index` (Int)\n  +0x05EC | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.EnumVal.name):\n  +0x05F0 | 17 00 00 00             | uint32_t   | 0x00000017 (23)                    | length of string\n  +0x05F4 | 54 65 73 74 53 69 6D 70 | char[23]   | TestSimp                           | string literal\n  +0x05FC | 6C 65 54 61 62 6C 65 57 |            | leTableW\n  +0x0604 | 69 74 68 45 6E 75 6D    |            | ithEnum\n  +0x060B | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.EnumVal):\n  +0x060C | 0C FE FF FF             | SOffset32  | 0xFFFFFE0C (-500) Loc: 0x0800      | offset to vtable\n  +0x0610 | 20 00 00 00             | UOffset32  | 0x00000020 (32) Loc: 0x0630        | offset to field `name` (string)\n  +0x0614 | 0C 00 00 00             | UOffset32  | 0x0000000C (12) Loc: 0x0620        | offset to field `union_type` (table)\n  +0x0618 | 01 00 00 00 00 00 00 00 | int64_t    | 0x0000000000000001 (1)             | table field `value` (Long)\n\ntable (reflection.Type):\n  +0x0620 | 50 CE FF FF             | SOffset32  | 0xFFFFCE50 (-12720) Loc: 0x37D0    | offset to vtable\n  +0x0624 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x0627 | 0F                      | uint8_t    | 0x0F (15)                          | table field `base_type` (Byte)\n  +0x0628 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `index` (Int)\n  +0x062C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.EnumVal.name):\n  +0x0630 | 07 00 00 00             | uint32_t   | 0x00000007 (7)                     | length of string\n  +0x0634 | 4D 6F 6E 73 74 65 72    | char[7]    | Monster                            | string literal\n  +0x063B | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.EnumVal):\n  +0x063C | 58 FB FF FF             | SOffset32  | 0xFFFFFB58 (-1192) Loc: 0x0AE4     | offset to vtable\n  +0x0640 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x0654        | offset to field `name` (string)\n  +0x0644 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0648         | offset to field `union_type` (table)\n\ntable (reflection.Type):\n  +0x0648 | 4C FB FF FF             | SOffset32  | 0xFFFFFB4C (-1204) Loc: 0x0AFC     | offset to vtable\n  +0x064C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x0650 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.EnumVal.name):\n  +0x0654 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of string\n  +0x0658 | 4E 4F 4E 45             | char[4]    | NONE                               | string literal\n  +0x065C | 00                      | char       | 0x00 (0)                           | string terminator\n\nvtable (reflection.Enum):\n  +0x065E | 12 00                   | uint16_t   | 0x0012 (18)                        | size of this vtable\n  +0x0660 | 18 00                   | uint16_t   | 0x0018 (24)                        | size of referring table\n  +0x0662 | 04 00                   | VOffset16  | 0x0004 (4)                         | offset to field `name` (id: 0)\n  +0x0664 | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `values` (id: 1)\n  +0x0666 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `is_union` (id: 2) <defaults to 0> (Bool)\n  +0x0668 | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `underlying_type` (id: 3)\n  +0x066A | 10 00                   | VOffset16  | 0x0010 (16)                        | offset to field `attributes` (id: 4)\n  +0x066C | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `documentation` (id: 5) <null> (Vector)\n  +0x066E | 14 00                   | VOffset16  | 0x0014 (20)                        | offset to field `declaration_file` (id: 6)\n\ntable (reflection.Enum):\n  +0x0670 | 12 00 00 00             | SOffset32  | 0x00000012 (18) Loc: 0x065E        | offset to vtable\n  +0x0674 | 64 00 00 00             | UOffset32  | 0x00000064 (100) Loc: 0x06D8       | offset to field `name` (string)\n  +0x0678 | 50 00 00 00             | UOffset32  | 0x00000050 (80) Loc: 0x06C8        | offset to field `values` (vector)\n  +0x067C | 38 00 00 00             | UOffset32  | 0x00000038 (56) Loc: 0x06B4        | offset to field `underlying_type` (table)\n  +0x0680 | 08 00 00 00             | UOffset32  | 0x00000008 (8) Loc: 0x0688         | offset to field `attributes` (vector)\n  +0x0684 | 18 30 00 00             | UOffset32  | 0x00003018 (12312) Loc: 0x369C     | offset to field `declaration_file` (string)\n\nvector (reflection.Enum.attributes):\n  +0x0688 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x068C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0690         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x0690 | 10 CE FF FF             | SOffset32  | 0xFFFFCE10 (-12784) Loc: 0x3880    | offset to vtable\n  +0x0694 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x06A4        | offset to field `key` (string)\n  +0x0698 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x069C         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x069C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x06A0 | 30                      | char[1]    | 0                                  | string literal\n  +0x06A1 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x06A2 | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x06A4 | 09 00 00 00             | uint32_t   | 0x00000009 (9)                     | length of string\n  +0x06A8 | 62 69 74 5F 66 6C 61 67 | char[9]    | bit_flag                           | string literal\n  +0x06B0 | 73                      |            | s\n  +0x06B1 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x06B2 | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Type):\n  +0x06B4 | 50 D1 FF FF             | SOffset32  | 0xFFFFD150 (-11952) Loc: 0x3564    | offset to vtable\n  +0x06B8 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x06BB | 0A                      | uint8_t    | 0x0A (10)                          | table field `base_type` (Byte)\n  +0x06BC | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | table field `index` (Int)\n  +0x06C0 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | table field `base_size` (UInt)\n  +0x06C4 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nvector (reflection.Enum.values):\n  +0x06C8 | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | length of vector (# items)\n  +0x06CC | 88 00 00 00             | UOffset32  | 0x00000088 (136) Loc: 0x0754       | offset to table[0]\n  +0x06D0 | 54 00 00 00             | UOffset32  | 0x00000054 (84) Loc: 0x0724        | offset to table[1]\n  +0x06D4 | 20 00 00 00             | UOffset32  | 0x00000020 (32) Loc: 0x06F4        | offset to table[2]\n\nstring (reflection.Enum.name):\n  +0x06D8 | 17 00 00 00             | uint32_t   | 0x00000017 (23)                    | length of string\n  +0x06DC | 4D 79 47 61 6D 65 2E 45 | char[23]   | MyGame.E                           | string literal\n  +0x06E4 | 78 61 6D 70 6C 65 2E 4C |            | xample.L\n  +0x06EC | 6F 6E 67 45 6E 75 6D    |            | ongEnum\n  +0x06F3 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.EnumVal):\n  +0x06F4 | B4 FC FF FF             | SOffset32  | 0xFFFFFCB4 (-844) Loc: 0x0A40      | offset to vtable\n  +0x06F8 | 20 00 00 00             | UOffset32  | 0x00000020 (32) Loc: 0x0718        | offset to field `name` (string)\n  +0x06FC | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x070C        | offset to field `union_type` (table)\n  +0x0700 | 00 00 00 00 00 01 00 00 | int64_t    | 0x0000010000000000 (1099511627776) | table field `value` (Long)\n  +0x0708 | 00 00 00 00             | uint8_t[4] | ....                               | padding\n\ntable (reflection.Type):\n  +0x070C | 10 FC FF FF             | SOffset32  | 0xFFFFFC10 (-1008) Loc: 0x0AFC     | offset to vtable\n  +0x0710 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x0714 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.EnumVal.name):\n  +0x0718 | 07 00 00 00             | uint32_t   | 0x00000007 (7)                     | length of string\n  +0x071C | 4C 6F 6E 67 42 69 67    | char[7]    | LongBig                            | string literal\n  +0x0723 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.EnumVal):\n  +0x0724 | E4 FC FF FF             | SOffset32  | 0xFFFFFCE4 (-796) Loc: 0x0A40      | offset to vtable\n  +0x0728 | 20 00 00 00             | UOffset32  | 0x00000020 (32) Loc: 0x0748        | offset to field `name` (string)\n  +0x072C | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x073C        | offset to field `union_type` (table)\n  +0x0730 | 04 00 00 00 00 00 00 00 | int64_t    | 0x0000000000000004 (4)             | table field `value` (Long)\n  +0x0738 | 00 00 00 00             | uint8_t[4] | ....                               | padding\n\ntable (reflection.Type):\n  +0x073C | 40 FC FF FF             | SOffset32  | 0xFFFFFC40 (-960) Loc: 0x0AFC      | offset to vtable\n  +0x0740 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x0744 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.EnumVal.name):\n  +0x0748 | 07 00 00 00             | uint32_t   | 0x00000007 (7)                     | length of string\n  +0x074C | 4C 6F 6E 67 54 77 6F    | char[7]    | LongTwo                            | string literal\n  +0x0753 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.EnumVal):\n  +0x0754 | 54 FF FF FF             | SOffset32  | 0xFFFFFF54 (-172) Loc: 0x0800      | offset to vtable\n  +0x0758 | 1C 00 00 00             | UOffset32  | 0x0000001C (28) Loc: 0x0774        | offset to field `name` (string)\n  +0x075C | 0C 00 00 00             | UOffset32  | 0x0000000C (12) Loc: 0x0768        | offset to field `union_type` (table)\n  +0x0760 | 02 00 00 00 00 00 00 00 | int64_t    | 0x0000000000000002 (2)             | table field `value` (Long)\n\ntable (reflection.Type):\n  +0x0768 | 6C FC FF FF             | SOffset32  | 0xFFFFFC6C (-916) Loc: 0x0AFC      | offset to vtable\n  +0x076C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x0770 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.EnumVal.name):\n  +0x0774 | 07 00 00 00             | uint32_t   | 0x00000007 (7)                     | length of string\n  +0x0778 | 4C 6F 6E 67 4F 6E 65    | char[7]    | LongOne                            | string literal\n  +0x077F | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Enum):\n  +0x0780 | 06 FD FF FF             | SOffset32  | 0xFFFFFD06 (-762) Loc: 0x0A7A      | offset to vtable\n  +0x0784 | 38 00 00 00             | UOffset32  | 0x00000038 (56) Loc: 0x07BC        | offset to field `name` (string)\n  +0x0788 | 20 00 00 00             | UOffset32  | 0x00000020 (32) Loc: 0x07A8        | offset to field `values` (vector)\n  +0x078C | 08 00 00 00             | UOffset32  | 0x00000008 (8) Loc: 0x0794         | offset to field `underlying_type` (table)\n  +0x0790 | 0C 2F 00 00             | UOffset32  | 0x00002F0C (12044) Loc: 0x369C     | offset to field `declaration_file` (string)\n\ntable (reflection.Type):\n  +0x0794 | 30 D2 FF FF             | SOffset32  | 0xFFFFD230 (-11728) Loc: 0x3564    | offset to vtable\n  +0x0798 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x079B | 03                      | uint8_t    | 0x03 (3)                           | table field `base_type` (Byte)\n  +0x079C | 05 00 00 00             | uint32_t   | 0x00000005 (5)                     | table field `index` (Int)\n  +0x07A0 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x07A4 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nvector (reflection.Enum.values):\n  +0x07A8 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of vector (# items)\n  +0x07AC | B0 00 00 00             | UOffset32  | 0x000000B0 (176) Loc: 0x085C       | offset to table[0]\n  +0x07B0 | 88 00 00 00             | UOffset32  | 0x00000088 (136) Loc: 0x0838       | offset to table[1]\n  +0x07B4 | 58 00 00 00             | UOffset32  | 0x00000058 (88) Loc: 0x080C        | offset to table[2]\n  +0x07B8 | 1C 00 00 00             | UOffset32  | 0x0000001C (28) Loc: 0x07D4        | offset to table[3]\n\nstring (reflection.Enum.name):\n  +0x07BC | 13 00 00 00             | uint32_t   | 0x00000013 (19)                    | length of string\n  +0x07C0 | 4D 79 47 61 6D 65 2E 45 | char[19]   | MyGame.E                           | string literal\n  +0x07C8 | 78 61 6D 70 6C 65 2E 52 |            | xample.R\n  +0x07D0 | 61 63 65                |            | ace\n  +0x07D3 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.EnumVal):\n  +0x07D4 | 94 FD FF FF             | SOffset32  | 0xFFFFFD94 (-620) Loc: 0x0A40      | offset to vtable\n  +0x07D8 | 20 00 00 00             | UOffset32  | 0x00000020 (32) Loc: 0x07F8        | offset to field `name` (string)\n  +0x07DC | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x07EC        | offset to field `union_type` (table)\n  +0x07E0 | 02 00 00 00 00 00 00 00 | int64_t    | 0x0000000000000002 (2)             | table field `value` (Long)\n  +0x07E8 | 00 00 00 00             | uint8_t[4] | ....                               | padding\n\ntable (reflection.Type):\n  +0x07EC | F0 FC FF FF             | SOffset32  | 0xFFFFFCF0 (-784) Loc: 0x0AFC      | offset to vtable\n  +0x07F0 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x07F4 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.EnumVal.name):\n  +0x07F8 | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | length of string\n  +0x07FC | 45 6C 66                | char[3]    | Elf                                | string literal\n  +0x07FF | 00                      | char       | 0x00 (0)                           | string terminator\n\nvtable (reflection.EnumVal):\n  +0x0800 | 0C 00                   | uint16_t   | 0x000C (12)                        | size of this vtable\n  +0x0802 | 14 00                   | uint16_t   | 0x0014 (20)                        | size of referring table\n  +0x0804 | 04 00                   | VOffset16  | 0x0004 (4)                         | offset to field `name` (id: 0)\n  +0x0806 | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `value` (id: 1)\n  +0x0808 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `object` (id: 2) <null> (Obj)\n  +0x080A | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `union_type` (id: 3)\n\ntable (reflection.EnumVal):\n  +0x080C | 0C 00 00 00             | SOffset32  | 0x0000000C (12) Loc: 0x0800        | offset to vtable\n  +0x0810 | 1C 00 00 00             | UOffset32  | 0x0000001C (28) Loc: 0x082C        | offset to field `name` (string)\n  +0x0814 | 0C 00 00 00             | UOffset32  | 0x0000000C (12) Loc: 0x0820        | offset to field `union_type` (table)\n  +0x0818 | 01 00 00 00 00 00 00 00 | int64_t    | 0x0000000000000001 (1)             | table field `value` (Long)\n\ntable (reflection.Type):\n  +0x0820 | 24 FD FF FF             | SOffset32  | 0xFFFFFD24 (-732) Loc: 0x0AFC      | offset to vtable\n  +0x0824 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x0828 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.EnumVal.name):\n  +0x082C | 05 00 00 00             | uint32_t   | 0x00000005 (5)                     | length of string\n  +0x0830 | 44 77 61 72 66          | char[5]    | Dwarf                              | string literal\n  +0x0835 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x0836 | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.EnumVal):\n  +0x0838 | 54 FD FF FF             | SOffset32  | 0xFFFFFD54 (-684) Loc: 0x0AE4      | offset to vtable\n  +0x083C | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x0850        | offset to field `name` (string)\n  +0x0840 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0844         | offset to field `union_type` (table)\n\ntable (reflection.Type):\n  +0x0844 | 48 FD FF FF             | SOffset32  | 0xFFFFFD48 (-696) Loc: 0x0AFC      | offset to vtable\n  +0x0848 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x084C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.EnumVal.name):\n  +0x0850 | 05 00 00 00             | uint32_t   | 0x00000005 (5)                     | length of string\n  +0x0854 | 48 75 6D 61 6E          | char[5]    | Human                              | string literal\n  +0x0859 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x085A | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.EnumVal):\n  +0x085C | 1C FE FF FF             | SOffset32  | 0xFFFFFE1C (-484) Loc: 0x0A40      | offset to vtable\n  +0x0860 | 20 00 00 00             | UOffset32  | 0x00000020 (32) Loc: 0x0880        | offset to field `name` (string)\n  +0x0864 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x0874        | offset to field `union_type` (table)\n  +0x0868 | FF FF FF FF FF FF FF FF | int64_t    | 0xFFFFFFFFFFFFFFFF (-1)            | table field `value` (Long)\n  +0x0870 | 00 00 00 00             | uint8_t[4] | ....                               | padding\n\ntable (reflection.Type):\n  +0x0874 | 78 FD FF FF             | SOffset32  | 0xFFFFFD78 (-648) Loc: 0x0AFC      | offset to vtable\n  +0x0878 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x087C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.EnumVal.name):\n  +0x0880 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of string\n  +0x0884 | 4E 6F 6E 65             | char[4]    | None                               | string literal\n  +0x0888 | 00                      | char       | 0x00 (0)                           | string terminator\n\nvtable (reflection.Enum):\n  +0x088A | 12 00                   | uint16_t   | 0x0012 (18)                        | size of this vtable\n  +0x088C | 1C 00                   | uint16_t   | 0x001C (28)                        | size of referring table\n  +0x088E | 04 00                   | VOffset16  | 0x0004 (4)                         | offset to field `name` (id: 0)\n  +0x0890 | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `values` (id: 1)\n  +0x0892 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `is_union` (id: 2) <defaults to 0> (Bool)\n  +0x0894 | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `underlying_type` (id: 3)\n  +0x0896 | 10 00                   | VOffset16  | 0x0010 (16)                        | offset to field `attributes` (id: 4)\n  +0x0898 | 14 00                   | VOffset16  | 0x0014 (20)                        | offset to field `documentation` (id: 5)\n  +0x089A | 18 00                   | VOffset16  | 0x0018 (24)                        | offset to field `declaration_file` (id: 6)\n\ntable (reflection.Enum):\n  +0x089C | 12 00 00 00             | SOffset32  | 0x00000012 (18) Loc: 0x088A        | offset to vtable\n  +0x08A0 | 9C 00 00 00             | UOffset32  | 0x0000009C (156) Loc: 0x093C       | offset to field `name` (string)\n  +0x08A4 | 88 00 00 00             | UOffset32  | 0x00000088 (136) Loc: 0x092C       | offset to field `values` (vector)\n  +0x08A8 | 70 00 00 00             | UOffset32  | 0x00000070 (112) Loc: 0x0918       | offset to field `underlying_type` (table)\n  +0x08AC | 40 00 00 00             | UOffset32  | 0x00000040 (64) Loc: 0x08EC        | offset to field `attributes` (vector)\n  +0x08B0 | 08 00 00 00             | UOffset32  | 0x00000008 (8) Loc: 0x08B8         | offset to field `documentation` (vector)\n  +0x08B4 | E8 2D 00 00             | UOffset32  | 0x00002DE8 (11752) Loc: 0x369C     | offset to field `declaration_file` (string)\n\nvector (reflection.Enum.documentation):\n  +0x08B8 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x08BC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x08C0         | offset to string[0]\n\nstring (reflection.Enum.documentation):\n  +0x08C0 | 27 00 00 00             | uint32_t   | 0x00000027 (39)                    | length of string\n  +0x08C4 | 20 43 6F 6D 70 6F 73 69 | char[39]   |  Composi                           | string literal\n  +0x08CC | 74 65 20 63 6F 6D 70 6F |            | te compo\n  +0x08D4 | 6E 65 6E 74 73 20 6F 66 |            | nents of\n  +0x08DC | 20 4D 6F 6E 73 74 65 72 |            |  Monster\n  +0x08E4 | 20 63 6F 6C 6F 72 2E    |            |  color.\n  +0x08EB | 00                      | char       | 0x00 (0)                           | string terminator\n\nvector (reflection.Enum.attributes):\n  +0x08EC | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x08F0 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x08F4         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x08F4 | 74 D0 FF FF             | SOffset32  | 0xFFFFD074 (-12172) Loc: 0x3880    | offset to vtable\n  +0x08F8 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x0908        | offset to field `key` (string)\n  +0x08FC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0900         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x0900 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x0904 | 30                      | char[1]    | 0                                  | string literal\n  +0x0905 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x0906 | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x0908 | 09 00 00 00             | uint32_t   | 0x00000009 (9)                     | length of string\n  +0x090C | 62 69 74 5F 66 6C 61 67 | char[9]    | bit_flag                           | string literal\n  +0x0914 | 73                      |            | s\n  +0x0915 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x0916 | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Type):\n  +0x0918 | B4 D3 FF FF             | SOffset32  | 0xFFFFD3B4 (-11340) Loc: 0x3564    | offset to vtable\n  +0x091C | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x091F | 04                      | uint8_t    | 0x04 (4)                           | table field `base_type` (Byte)\n  +0x0920 | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | table field `index` (Int)\n  +0x0924 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x0928 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nvector (reflection.Enum.values):\n  +0x092C | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | length of vector (# items)\n  +0x0930 | 1C 01 00 00             | UOffset32  | 0x0000011C (284) Loc: 0x0A4C       | offset to table[0]\n  +0x0934 | 8C 00 00 00             | UOffset32  | 0x0000008C (140) Loc: 0x09C0       | offset to table[1]\n  +0x0938 | 20 00 00 00             | UOffset32  | 0x00000020 (32) Loc: 0x0958        | offset to table[2]\n\nstring (reflection.Enum.name):\n  +0x093C | 14 00 00 00             | uint32_t   | 0x00000014 (20)                    | length of string\n  +0x0940 | 4D 79 47 61 6D 65 2E 45 | char[20]   | MyGame.E                           | string literal\n  +0x0948 | 78 61 6D 70 6C 65 2E 43 |            | xample.C\n  +0x0950 | 6F 6C 6F 72             |            | olor\n  +0x0954 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x0955 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.EnumVal):\n  +0x0958 | A6 FF FF FF             | SOffset32  | 0xFFFFFFA6 (-90) Loc: 0x09B2       | offset to vtable\n  +0x095C | 4C 00 00 00             | UOffset32  | 0x0000004C (76) Loc: 0x09A8        | offset to field `name` (string)\n  +0x0960 | 3C 00 00 00             | UOffset32  | 0x0000003C (60) Loc: 0x099C        | offset to field `union_type` (table)\n  +0x0964 | 0C 00 00 00             | UOffset32  | 0x0000000C (12) Loc: 0x0970        | offset to field `documentation` (vector)\n  +0x0968 | 08 00 00 00 00 00 00 00 | int64_t    | 0x0000000000000008 (8)             | table field `value` (Long)\n\nvector (reflection.EnumVal.documentation):\n  +0x0970 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x0974 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0978         | offset to string[0]\n\nstring (reflection.EnumVal.documentation):\n  +0x0978 | 1C 00 00 00             | uint32_t   | 0x0000001C (28)                    | length of string\n  +0x097C | 20 5C 62 72 69 65 66 20 | char[28]   |  \\brief                            | string literal\n  +0x0984 | 63 6F 6C 6F 72 20 42 6C |            | color Bl\n  +0x098C | 75 65 20 28 31 75 20 3C |            | ue (1u <\n  +0x0994 | 3C 20 33 29             |            | < 3)\n  +0x0998 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x0999 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Type):\n  +0x099C | A0 FE FF FF             | SOffset32  | 0xFFFFFEA0 (-352) Loc: 0x0AFC      | offset to vtable\n  +0x09A0 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x09A4 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.EnumVal.name):\n  +0x09A8 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of string\n  +0x09AC | 42 6C 75 65             | char[4]    | Blue                               | string literal\n  +0x09B0 | 00                      | char       | 0x00 (0)                           | string terminator\n\nvtable (reflection.EnumVal):\n  +0x09B2 | 0E 00                   | uint16_t   | 0x000E (14)                        | size of this vtable\n  +0x09B4 | 18 00                   | uint16_t   | 0x0018 (24)                        | size of referring table\n  +0x09B6 | 04 00                   | VOffset16  | 0x0004 (4)                         | offset to field `name` (id: 0)\n  +0x09B8 | 10 00                   | VOffset16  | 0x0010 (16)                        | offset to field `value` (id: 1)\n  +0x09BA | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `object` (id: 2) <null> (Obj)\n  +0x09BC | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `union_type` (id: 3)\n  +0x09BE | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `documentation` (id: 4)\n\ntable (reflection.EnumVal):\n  +0x09C0 | 0E 00 00 00             | SOffset32  | 0x0000000E (14) Loc: 0x09B2        | offset to vtable\n  +0x09C4 | 70 00 00 00             | UOffset32  | 0x00000070 (112) Loc: 0x0A34       | offset to field `name` (string)\n  +0x09C8 | 60 00 00 00             | UOffset32  | 0x00000060 (96) Loc: 0x0A28        | offset to field `union_type` (table)\n  +0x09CC | 0C 00 00 00             | UOffset32  | 0x0000000C (12) Loc: 0x09D8        | offset to field `documentation` (vector)\n  +0x09D0 | 02 00 00 00 00 00 00 00 | int64_t    | 0x0000000000000002 (2)             | table field `value` (Long)\n\nvector (reflection.EnumVal.documentation):\n  +0x09D8 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of vector (# items)\n  +0x09DC | 34 00 00 00             | UOffset32  | 0x00000034 (52) Loc: 0x0A10        | offset to string[0]\n  +0x09E0 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x09E4         | offset to string[1]\n\nstring (reflection.EnumVal.documentation):\n  +0x09E4 | 27 00 00 00             | uint32_t   | 0x00000027 (39)                    | length of string\n  +0x09E8 | 20 47 72 65 65 6E 20 69 | char[39]   |  Green i                           | string literal\n  +0x09F0 | 73 20 62 69 74 5F 66 6C |            | s bit_fl\n  +0x09F8 | 61 67 20 77 69 74 68 20 |            | ag with \n  +0x0A00 | 76 61 6C 75 65 20 28 31 |            | value (1\n  +0x0A08 | 75 20 3C 3C 20 31 29    |            | u << 1)\n  +0x0A0F | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.EnumVal.documentation):\n  +0x0A10 | 13 00 00 00             | uint32_t   | 0x00000013 (19)                    | length of string\n  +0x0A14 | 20 5C 62 72 69 65 66 20 | char[19]   |  \\brief                            | string literal\n  +0x0A1C | 63 6F 6C 6F 72 20 47 72 |            | color Gr\n  +0x0A24 | 65 65 6E                |            | een\n  +0x0A27 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x0A28 | 2C FF FF FF             | SOffset32  | 0xFFFFFF2C (-212) Loc: 0x0AFC      | offset to vtable\n  +0x0A2C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x0A30 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.EnumVal.name):\n  +0x0A34 | 05 00 00 00             | uint32_t   | 0x00000005 (5)                     | length of string\n  +0x0A38 | 47 72 65 65 6E          | char[5]    | Green                              | string literal\n  +0x0A3D | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x0A3E | 00 00                   | uint8_t[2] | ..                                 | padding\n\nvtable (reflection.EnumVal):\n  +0x0A40 | 0C 00                   | uint16_t   | 0x000C (12)                        | size of this vtable\n  +0x0A42 | 18 00                   | uint16_t   | 0x0018 (24)                        | size of referring table\n  +0x0A44 | 04 00                   | VOffset16  | 0x0004 (4)                         | offset to field `name` (id: 0)\n  +0x0A46 | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `value` (id: 1)\n  +0x0A48 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `object` (id: 2) <null> (Obj)\n  +0x0A4A | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `union_type` (id: 3)\n\ntable (reflection.EnumVal):\n  +0x0A4C | 0C 00 00 00             | SOffset32  | 0x0000000C (12) Loc: 0x0A40        | offset to vtable\n  +0x0A50 | 20 00 00 00             | UOffset32  | 0x00000020 (32) Loc: 0x0A70        | offset to field `name` (string)\n  +0x0A54 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x0A64        | offset to field `union_type` (table)\n  +0x0A58 | 01 00 00 00 00 00 00 00 | int64_t    | 0x0000000000000001 (1)             | table field `value` (Long)\n  +0x0A60 | 00 00 00 00             | uint8_t[4] | ....                               | padding\n\ntable (reflection.Type):\n  +0x0A64 | 68 FF FF FF             | SOffset32  | 0xFFFFFF68 (-152) Loc: 0x0AFC      | offset to vtable\n  +0x0A68 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x0A6C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.EnumVal.name):\n  +0x0A70 | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | length of string\n  +0x0A74 | 52 65 64                | char[3]    | Red                                | string literal\n  +0x0A77 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x0A78 | 00 00                   | uint8_t[2] | ..                                 | padding\n\nvtable (reflection.Enum):\n  +0x0A7A | 12 00                   | uint16_t   | 0x0012 (18)                        | size of this vtable\n  +0x0A7C | 14 00                   | uint16_t   | 0x0014 (20)                        | size of referring table\n  +0x0A7E | 04 00                   | VOffset16  | 0x0004 (4)                         | offset to field `name` (id: 0)\n  +0x0A80 | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `values` (id: 1)\n  +0x0A82 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `is_union` (id: 2) <defaults to 0> (Bool)\n  +0x0A84 | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `underlying_type` (id: 3)\n  +0x0A86 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `attributes` (id: 4) <null> (Vector)\n  +0x0A88 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `documentation` (id: 5) <null> (Vector)\n  +0x0A8A | 10 00                   | VOffset16  | 0x0010 (16)                        | offset to field `declaration_file` (id: 6)\n\ntable (reflection.Enum):\n  +0x0A8C | 12 00 00 00             | SOffset32  | 0x00000012 (18) Loc: 0x0A7A        | offset to vtable\n  +0x0A90 | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x0ABC        | offset to field `name` (string)\n  +0x0A94 | 20 00 00 00             | UOffset32  | 0x00000020 (32) Loc: 0x0AB4        | offset to field `values` (vector)\n  +0x0A98 | 08 00 00 00             | UOffset32  | 0x00000008 (8) Loc: 0x0AA0         | offset to field `underlying_type` (table)\n  +0x0A9C | 8C 2D 00 00             | UOffset32  | 0x00002D8C (11660) Loc: 0x3828     | offset to field `declaration_file` (string)\n\ntable (reflection.Type):\n  +0x0AA0 | 3C D5 FF FF             | SOffset32  | 0xFFFFD53C (-10948) Loc: 0x3564    | offset to vtable\n  +0x0AA4 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x0AA7 | 09                      | uint8_t    | 0x09 (9)                           | table field `base_type` (Byte)\n  +0x0AA8 | 06 00 00 00             | uint32_t   | 0x00000006 (6)                     | table field `index` (Int)\n  +0x0AAC | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | table field `base_size` (UInt)\n  +0x0AB0 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nvector (reflection.Enum.values):\n  +0x0AB4 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x0AB8 | 38 00 00 00             | UOffset32  | 0x00000038 (56) Loc: 0x0AF0        | offset to table[0]\n\nstring (reflection.Enum.name):\n  +0x0ABC | 21 00 00 00             | uint32_t   | 0x00000021 (33)                    | length of string\n  +0x0AC0 | 4D 79 47 61 6D 65 2E 4F | char[33]   | MyGame.O                           | string literal\n  +0x0AC8 | 74 68 65 72 4E 61 6D 65 |            | therName\n  +0x0AD0 | 53 70 61 63 65 2E 46 72 |            | Space.Fr\n  +0x0AD8 | 6F 6D 49 6E 63 6C 75 64 |            | omInclud\n  +0x0AE0 | 65                      |            | e\n  +0x0AE1 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x0AE2 | 00 00                   | uint8_t[2] | ..                                 | padding\n\nvtable (reflection.EnumVal):\n  +0x0AE4 | 0C 00                   | uint16_t   | 0x000C (12)                        | size of this vtable\n  +0x0AE6 | 0C 00                   | uint16_t   | 0x000C (12)                        | size of referring table\n  +0x0AE8 | 04 00                   | VOffset16  | 0x0004 (4)                         | offset to field `name` (id: 0)\n  +0x0AEA | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `value` (id: 1) <defaults to 0> (Long)\n  +0x0AEC | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `object` (id: 2) <null> (Obj)\n  +0x0AEE | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `union_type` (id: 3)\n\ntable (reflection.EnumVal):\n  +0x0AF0 | 0C 00 00 00             | SOffset32  | 0x0000000C (12) Loc: 0x0AE4        | offset to vtable\n  +0x0AF4 | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x0B18        | offset to field `name` (string)\n  +0x0AF8 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x0B0C        | offset to field `union_type` (table)\n\nvtable (reflection.Type):\n  +0x0AFC | 10 00                   | uint16_t   | 0x0010 (16)                        | size of this vtable\n  +0x0AFE | 0C 00                   | uint16_t   | 0x000C (12)                        | size of referring table\n  +0x0B00 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `base_type` (id: 0) <defaults to 0> (Byte)\n  +0x0B02 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `element` (id: 1) <defaults to 0> (Byte)\n  +0x0B04 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `index` (id: 2) <defaults to -1> (Int)\n  +0x0B06 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `fixed_length` (id: 3) <defaults to 0> (UShort)\n  +0x0B08 | 04 00                   | VOffset16  | 0x0004 (4)                         | offset to field `base_size` (id: 4)\n  +0x0B0A | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `element_size` (id: 5)\n\ntable (reflection.Type):\n  +0x0B0C | 10 00 00 00             | SOffset32  | 0x00000010 (16) Loc: 0x0AFC        | offset to vtable\n  +0x0B10 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x0B14 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.EnumVal.name):\n  +0x0B18 | 0A 00 00 00             | uint32_t   | 0x0000000A (10)                    | length of string\n  +0x0B1C | 49 6E 63 6C 75 64 65 56 | char[10]   | IncludeV                           | string literal\n  +0x0B24 | 61 6C                   |            | al\n  +0x0B26 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Object):\n  +0x0B28 | D8 D3 FF FF             | SOffset32  | 0xFFFFD3D8 (-11304) Loc: 0x3750    | offset to vtable\n  +0x0B2C | 44 00 00 00             | UOffset32  | 0x00000044 (68) Loc: 0x0B70        | offset to field `name` (string)\n  +0x0B30 | 0C 00 00 00             | UOffset32  | 0x0000000C (12) Loc: 0x0B3C        | offset to field `fields` (vector)\n  +0x0B34 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `minalign` (Int)\n  +0x0B38 | 64 2B 00 00             | UOffset32  | 0x00002B64 (11108) Loc: 0x369C     | offset to field `declaration_file` (string)\n\nvector (reflection.Object.fields):\n  +0x0B3C | 0C 00 00 00             | uint32_t   | 0x0000000C (12)                    | length of vector (# items)\n  +0x0B40 | E8 00 00 00             | UOffset32  | 0x000000E8 (232) Loc: 0x0C28       | offset to table[0]\n  +0x0B44 | BC 00 00 00             | UOffset32  | 0x000000BC (188) Loc: 0x0C00       | offset to table[1]\n  +0x0B48 | C4 01 00 00             | UOffset32  | 0x000001C4 (452) Loc: 0x0D0C       | offset to table[2]\n  +0x0B4C | 74 01 00 00             | UOffset32  | 0x00000174 (372) Loc: 0x0CC0       | offset to table[3]\n  +0x0B50 | 24 01 00 00             | UOffset32  | 0x00000124 (292) Loc: 0x0C74       | offset to table[4]\n  +0x0B54 | 14 02 00 00             | UOffset32  | 0x00000214 (532) Loc: 0x0D68       | offset to table[5]\n  +0x0B58 | 8C 01 00 00             | UOffset32  | 0x0000018C (396) Loc: 0x0CE4       | offset to table[6]\n  +0x0B5C | 40 01 00 00             | UOffset32  | 0x00000140 (320) Loc: 0x0C9C       | offset to table[7]\n  +0x0B60 | EC 00 00 00             | UOffset32  | 0x000000EC (236) Loc: 0x0C4C       | offset to table[8]\n  +0x0B64 | D0 01 00 00             | UOffset32  | 0x000001D0 (464) Loc: 0x0D34       | offset to table[9]\n  +0x0B68 | 70 00 00 00             | UOffset32  | 0x00000070 (112) Loc: 0x0BD8       | offset to table[10]\n  +0x0B6C | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x0B90        | offset to table[11]\n\nstring (reflection.Object.name):\n  +0x0B70 | 1A 00 00 00             | uint32_t   | 0x0000001A (26)                    | length of string\n  +0x0B74 | 4D 79 47 61 6D 65 2E 45 | char[26]   | MyGame.E                           | string literal\n  +0x0B7C | 78 61 6D 70 6C 65 2E 54 |            | xample.T\n  +0x0B84 | 79 70 65 41 6C 69 61 73 |            | ypeAlias\n  +0x0B8C | 65 73                   |            | es\n  +0x0B8E | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x0B90 | D4 FF FF FF             | SOffset32  | 0xFFFFFFD4 (-44) Loc: 0x0BBC       | offset to vtable\n  +0x0B94 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x0B97 | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x0B98 | 0B 00                   | uint16_t   | 0x000B (11)                        | table field `id` (UShort)\n  +0x0B9A | 1A 00                   | uint16_t   | 0x001A (26)                        | table field `offset` (UShort)\n  +0x0B9C | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x0BB0        | offset to field `name` (string)\n  +0x0BA0 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0BA4         | offset to field `type` (table)\n\ntable (reflection.Type):\n  +0x0BA4 | 44 DF FF FF             | SOffset32  | 0xFFFFDF44 (-8380) Loc: 0x2C60     | offset to vtable\n  +0x0BA8 | 00 00                   | uint8_t[2] | ..                                 | padding\n  +0x0BAA | 0E                      | uint8_t    | 0x0E (14)                          | table field `base_type` (Byte)\n  +0x0BAB | 0C                      | uint8_t    | 0x0C (12)                          | table field `element` (Byte)\n  +0x0BAC | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x0BB0 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of string\n  +0x0BB4 | 76 66 36 34             | char[4]    | vf64                               | string literal\n  +0x0BB8 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x0BB9 | 00 00 00                | uint8_t[3] | ...                                | padding\n\nvtable (reflection.Field):\n  +0x0BBC | 1C 00                   | uint16_t   | 0x001C (28)                        | size of this vtable\n  +0x0BBE | 14 00                   | uint16_t   | 0x0014 (20)                        | size of referring table\n  +0x0BC0 | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `name` (id: 0)\n  +0x0BC2 | 10 00                   | VOffset16  | 0x0010 (16)                        | offset to field `type` (id: 1)\n  +0x0BC4 | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `id` (id: 2)\n  +0x0BC6 | 0A 00                   | VOffset16  | 0x000A (10)                        | offset to field `offset` (id: 3)\n  +0x0BC8 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `default_integer` (id: 4) <defaults to 0> (Long)\n  +0x0BCA | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `default_real` (id: 5) <defaults to 0.000000> (Double)\n  +0x0BCC | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `deprecated` (id: 6) <defaults to 0> (Bool)\n  +0x0BCE | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `required` (id: 7) <defaults to 0> (Bool)\n  +0x0BD0 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `key` (id: 8) <defaults to 0> (Bool)\n  +0x0BD2 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `attributes` (id: 9) <null> (Vector)\n  +0x0BD4 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `documentation` (id: 10) <null> (Vector)\n  +0x0BD6 | 07 00                   | VOffset16  | 0x0007 (7)                         | offset to field `optional` (id: 11)\n\ntable (reflection.Field):\n  +0x0BD8 | 1C 00 00 00             | SOffset32  | 0x0000001C (28) Loc: 0x0BBC        | offset to vtable\n  +0x0BDC | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x0BDF | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x0BE0 | 0A 00                   | uint16_t   | 0x000A (10)                        | table field `id` (UShort)\n  +0x0BE2 | 18 00                   | uint16_t   | 0x0018 (24)                        | table field `offset` (UShort)\n  +0x0BE4 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x0BF8        | offset to field `name` (string)\n  +0x0BE8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0BEC         | offset to field `type` (table)\n\ntable (reflection.Type):\n  +0x0BEC | 8C DF FF FF             | SOffset32  | 0xFFFFDF8C (-8308) Loc: 0x2C60     | offset to vtable\n  +0x0BF0 | 00 00                   | uint8_t[2] | ..                                 | padding\n  +0x0BF2 | 0E                      | uint8_t    | 0x0E (14)                          | table field `base_type` (Byte)\n  +0x0BF3 | 03                      | uint8_t    | 0x03 (3)                           | table field `element` (Byte)\n  +0x0BF4 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x0BF8 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x0BFC | 76 38                   | char[2]    | v8                                 | string literal\n  +0x0BFE | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x0C00 | CC D7 FF FF             | SOffset32  | 0xFFFFD7CC (-10292) Loc: 0x3434    | offset to vtable\n  +0x0C04 | 09 00                   | uint16_t   | 0x0009 (9)                         | table field `id` (UShort)\n  +0x0C06 | 16 00                   | uint16_t   | 0x0016 (22)                        | table field `offset` (UShort)\n  +0x0C08 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x0C20        | offset to field `name` (string)\n  +0x0C0C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0C10         | offset to field `type` (table)\n\ntable (reflection.Type):\n  +0x0C10 | E4 D5 FF FF             | SOffset32  | 0xFFFFD5E4 (-10780) Loc: 0x362C    | offset to vtable\n  +0x0C14 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x0C17 | 0C                      | uint8_t    | 0x0C (12)                          | table field `base_type` (Byte)\n  +0x0C18 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | table field `base_size` (UInt)\n  +0x0C1C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x0C20 | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | length of string\n  +0x0C24 | 66 36 34                | char[3]    | f64                                | string literal\n  +0x0C27 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x0C28 | F4 D7 FF FF             | SOffset32  | 0xFFFFD7F4 (-10252) Loc: 0x3434    | offset to vtable\n  +0x0C2C | 08 00                   | uint16_t   | 0x0008 (8)                         | table field `id` (UShort)\n  +0x0C2E | 14 00                   | uint16_t   | 0x0014 (20)                        | table field `offset` (UShort)\n  +0x0C30 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x0C44        | offset to field `name` (string)\n  +0x0C34 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0C38         | offset to field `type` (table)\n\ntable (reflection.Type):\n  +0x0C38 | A4 D3 FF FF             | SOffset32  | 0xFFFFD3A4 (-11356) Loc: 0x3894    | offset to vtable\n  +0x0C3C | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x0C3F | 0B                      | uint8_t    | 0x0B (11)                          | table field `base_type` (Byte)\n  +0x0C40 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x0C44 | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | length of string\n  +0x0C48 | 66 33 32                | char[3]    | f32                                | string literal\n  +0x0C4B | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x0C4C | 18 D8 FF FF             | SOffset32  | 0xFFFFD818 (-10216) Loc: 0x3434    | offset to vtable\n  +0x0C50 | 07 00                   | uint16_t   | 0x0007 (7)                         | table field `id` (UShort)\n  +0x0C52 | 12 00                   | uint16_t   | 0x0012 (18)                        | table field `offset` (UShort)\n  +0x0C54 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x0C6C        | offset to field `name` (string)\n  +0x0C58 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0C5C         | offset to field `type` (table)\n\ntable (reflection.Type):\n  +0x0C5C | 30 D6 FF FF             | SOffset32  | 0xFFFFD630 (-10704) Loc: 0x362C    | offset to vtable\n  +0x0C60 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x0C63 | 0A                      | uint8_t    | 0x0A (10)                          | table field `base_type` (Byte)\n  +0x0C64 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | table field `base_size` (UInt)\n  +0x0C68 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x0C6C | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | length of string\n  +0x0C70 | 75 36 34                | char[3]    | u64                                | string literal\n  +0x0C73 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x0C74 | 40 D8 FF FF             | SOffset32  | 0xFFFFD840 (-10176) Loc: 0x3434    | offset to vtable\n  +0x0C78 | 06 00                   | uint16_t   | 0x0006 (6)                         | table field `id` (UShort)\n  +0x0C7A | 10 00                   | uint16_t   | 0x0010 (16)                        | table field `offset` (UShort)\n  +0x0C7C | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x0C94        | offset to field `name` (string)\n  +0x0C80 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0C84         | offset to field `type` (table)\n\ntable (reflection.Type):\n  +0x0C84 | 58 D6 FF FF             | SOffset32  | 0xFFFFD658 (-10664) Loc: 0x362C    | offset to vtable\n  +0x0C88 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x0C8B | 09                      | uint8_t    | 0x09 (9)                           | table field `base_type` (Byte)\n  +0x0C8C | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | table field `base_size` (UInt)\n  +0x0C90 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x0C94 | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | length of string\n  +0x0C98 | 69 36 34                | char[3]    | i64                                | string literal\n  +0x0C9B | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x0C9C | 68 D8 FF FF             | SOffset32  | 0xFFFFD868 (-10136) Loc: 0x3434    | offset to vtable\n  +0x0CA0 | 05 00                   | uint16_t   | 0x0005 (5)                         | table field `id` (UShort)\n  +0x0CA2 | 0E 00                   | uint16_t   | 0x000E (14)                        | table field `offset` (UShort)\n  +0x0CA4 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x0CB8        | offset to field `name` (string)\n  +0x0CA8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0CAC         | offset to field `type` (table)\n\ntable (reflection.Type):\n  +0x0CAC | 18 D4 FF FF             | SOffset32  | 0xFFFFD418 (-11240) Loc: 0x3894    | offset to vtable\n  +0x0CB0 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x0CB3 | 08                      | uint8_t    | 0x08 (8)                           | table field `base_type` (Byte)\n  +0x0CB4 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x0CB8 | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | length of string\n  +0x0CBC | 75 33 32                | char[3]    | u32                                | string literal\n  +0x0CBF | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x0CC0 | 8C D8 FF FF             | SOffset32  | 0xFFFFD88C (-10100) Loc: 0x3434    | offset to vtable\n  +0x0CC4 | 04 00                   | uint16_t   | 0x0004 (4)                         | table field `id` (UShort)\n  +0x0CC6 | 0C 00                   | uint16_t   | 0x000C (12)                        | table field `offset` (UShort)\n  +0x0CC8 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x0CDC        | offset to field `name` (string)\n  +0x0CCC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0CD0         | offset to field `type` (table)\n\ntable (reflection.Type):\n  +0x0CD0 | 3C D4 FF FF             | SOffset32  | 0xFFFFD43C (-11204) Loc: 0x3894    | offset to vtable\n  +0x0CD4 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x0CD7 | 07                      | uint8_t    | 0x07 (7)                           | table field `base_type` (Byte)\n  +0x0CD8 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x0CDC | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | length of string\n  +0x0CE0 | 69 33 32                | char[3]    | i32                                | string literal\n  +0x0CE3 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x0CE4 | B0 D8 FF FF             | SOffset32  | 0xFFFFD8B0 (-10064) Loc: 0x3434    | offset to vtable\n  +0x0CE8 | 03 00                   | uint16_t   | 0x0003 (3)                         | table field `id` (UShort)\n  +0x0CEA | 0A 00                   | uint16_t   | 0x000A (10)                        | table field `offset` (UShort)\n  +0x0CEC | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x0D04        | offset to field `name` (string)\n  +0x0CF0 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0CF4         | offset to field `type` (table)\n\ntable (reflection.Type):\n  +0x0CF4 | C8 D6 FF FF             | SOffset32  | 0xFFFFD6C8 (-10552) Loc: 0x362C    | offset to vtable\n  +0x0CF8 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x0CFB | 06                      | uint8_t    | 0x06 (6)                           | table field `base_type` (Byte)\n  +0x0CFC | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | table field `base_size` (UInt)\n  +0x0D00 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x0D04 | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | length of string\n  +0x0D08 | 75 31 36                | char[3]    | u16                                | string literal\n  +0x0D0B | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x0D0C | D8 D8 FF FF             | SOffset32  | 0xFFFFD8D8 (-10024) Loc: 0x3434    | offset to vtable\n  +0x0D10 | 02 00                   | uint16_t   | 0x0002 (2)                         | table field `id` (UShort)\n  +0x0D12 | 08 00                   | uint16_t   | 0x0008 (8)                         | table field `offset` (UShort)\n  +0x0D14 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x0D2C        | offset to field `name` (string)\n  +0x0D18 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0D1C         | offset to field `type` (table)\n\ntable (reflection.Type):\n  +0x0D1C | F0 D6 FF FF             | SOffset32  | 0xFFFFD6F0 (-10512) Loc: 0x362C    | offset to vtable\n  +0x0D20 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x0D23 | 05                      | uint8_t    | 0x05 (5)                           | table field `base_type` (Byte)\n  +0x0D24 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | table field `base_size` (UInt)\n  +0x0D28 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x0D2C | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | length of string\n  +0x0D30 | 69 31 36                | char[3]    | i16                                | string literal\n  +0x0D33 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x0D34 | 00 D9 FF FF             | SOffset32  | 0xFFFFD900 (-9984) Loc: 0x3434     | offset to vtable\n  +0x0D38 | 01 00                   | uint16_t   | 0x0001 (1)                         | table field `id` (UShort)\n  +0x0D3A | 06 00                   | uint16_t   | 0x0006 (6)                         | table field `offset` (UShort)\n  +0x0D3C | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x0D54        | offset to field `name` (string)\n  +0x0D40 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0D44         | offset to field `type` (table)\n\ntable (reflection.Type):\n  +0x0D44 | 18 D7 FF FF             | SOffset32  | 0xFFFFD718 (-10472) Loc: 0x362C    | offset to vtable\n  +0x0D48 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x0D4B | 04                      | uint8_t    | 0x04 (4)                           | table field `base_type` (Byte)\n  +0x0D4C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x0D50 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x0D54 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x0D58 | 75 38                   | char[2]    | u8                                 | string literal\n  +0x0D5A | 00                      | char       | 0x00 (0)                           | string terminator\n\nvtable (reflection.Field):\n  +0x0D5C | 0C 00                   | uint16_t   | 0x000C (12)                        | size of this vtable\n  +0x0D5E | 10 00                   | uint16_t   | 0x0010 (16)                        | size of referring table\n  +0x0D60 | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `name` (id: 0)\n  +0x0D62 | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `type` (id: 1)\n  +0x0D64 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `id` (id: 2) <defaults to 0> (UShort)\n  +0x0D66 | 06 00                   | VOffset16  | 0x0006 (6)                         | offset to field `offset` (id: 3)\n\ntable (reflection.Field):\n  +0x0D68 | 0C 00 00 00             | SOffset32  | 0x0000000C (12) Loc: 0x0D5C        | offset to vtable\n  +0x0D6C | 00 00                   | uint8_t[2] | ..                                 | padding\n  +0x0D6E | 04 00                   | uint16_t   | 0x0004 (4)                         | table field `offset` (UShort)\n  +0x0D70 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x0D88        | offset to field `name` (string)\n  +0x0D74 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0D78         | offset to field `type` (table)\n\ntable (reflection.Type):\n  +0x0D78 | 4C D7 FF FF             | SOffset32  | 0xFFFFD74C (-10420) Loc: 0x362C    | offset to vtable\n  +0x0D7C | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x0D7F | 03                      | uint8_t    | 0x03 (3)                           | table field `base_type` (Byte)\n  +0x0D80 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x0D84 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x0D88 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x0D8C | 69 38                   | char[2]    | i8                                 | string literal\n  +0x0D8E | 00                      | char       | 0x00 (0)                           | string terminator\n\nvtable (reflection.Object):\n  +0x0D90 | 14 00                   | uint16_t   | 0x0014 (20)                        | size of this vtable\n  +0x0D92 | 18 00                   | uint16_t   | 0x0018 (24)                        | size of referring table\n  +0x0D94 | 04 00                   | VOffset16  | 0x0004 (4)                         | offset to field `name` (id: 0)\n  +0x0D96 | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `fields` (id: 1)\n  +0x0D98 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `is_struct` (id: 2) <defaults to 0> (Bool)\n  +0x0D9A | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `minalign` (id: 3)\n  +0x0D9C | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `bytesize` (id: 4) <defaults to 0> (Int)\n  +0x0D9E | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `attributes` (id: 5) <null> (Vector)\n  +0x0DA0 | 10 00                   | VOffset16  | 0x0010 (16)                        | offset to field `documentation` (id: 6)\n  +0x0DA2 | 14 00                   | VOffset16  | 0x0014 (20)                        | offset to field `declaration_file` (id: 7)\n\ntable (reflection.Object):\n  +0x0DA4 | 14 00 00 00             | SOffset32  | 0x00000014 (20) Loc: 0x0D90        | offset to vtable\n  +0x0DA8 | 50 01 00 00             | UOffset32  | 0x00000150 (336) Loc: 0x0EF8       | offset to field `name` (string)\n  +0x0DAC | 50 00 00 00             | UOffset32  | 0x00000050 (80) Loc: 0x0DFC        | offset to field `fields` (vector)\n  +0x0DB0 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `minalign` (Int)\n  +0x0DB4 | 08 00 00 00             | UOffset32  | 0x00000008 (8) Loc: 0x0DBC         | offset to field `documentation` (vector)\n  +0x0DB8 | E4 28 00 00             | UOffset32  | 0x000028E4 (10468) Loc: 0x369C     | offset to field `declaration_file` (string)\n\nvector (reflection.Object.documentation):\n  +0x0DBC | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x0DC0 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0DC4         | offset to string[0]\n\nstring (reflection.Object.documentation):\n  +0x0DC4 | 33 00 00 00             | uint32_t   | 0x00000033 (51)                    | length of string\n  +0x0DC8 | 20 61 6E 20 65 78 61 6D | char[51]   |  an exam                           | string literal\n  +0x0DD0 | 70 6C 65 20 64 6F 63 75 |            | ple docu\n  +0x0DD8 | 6D 65 6E 74 61 74 69 6F |            | mentatio\n  +0x0DE0 | 6E 20 63 6F 6D 6D 65 6E |            | n commen\n  +0x0DE8 | 74 3A 20 22 6D 6F 6E 73 |            | t: \"mons\n  +0x0DF0 | 74 65 72 20 6F 62 6A 65 |            | ter obje\n  +0x0DF8 | 63 74 22                |            | ct\"\n  +0x0DFB | 00                      | char       | 0x00 (0)                           | string terminator\n\nvector (reflection.Object.fields):\n  +0x0DFC | 3E 00 00 00             | uint32_t   | 0x0000003E (62)                    | length of vector (# items)\n  +0x0E00 | A8 07 00 00             | UOffset32  | 0x000007A8 (1960) Loc: 0x15A8      | offset to table[0]\n  +0x0E04 | 04 08 00 00             | UOffset32  | 0x00000804 (2052) Loc: 0x1608      | offset to table[1]\n  +0x0E08 | 64 08 00 00             | UOffset32  | 0x00000864 (2148) Loc: 0x166C      | offset to table[2]\n  +0x0E0C | BC 08 00 00             | UOffset32  | 0x000008BC (2236) Loc: 0x16C8      | offset to table[3]\n  +0x0E10 | 98 0C 00 00             | UOffset32  | 0x00000C98 (3224) Loc: 0x1AA8      | offset to table[4]\n  +0x0E14 | 90 1D 00 00             | UOffset32  | 0x00001D90 (7568) Loc: 0x2BA4      | offset to table[5]\n  +0x0E18 | FC 00 00 00             | UOffset32  | 0x000000FC (252) Loc: 0x0F14       | offset to table[6]\n  +0x0E1C | 90 1A 00 00             | UOffset32  | 0x00001A90 (6800) Loc: 0x28AC      | offset to table[7]\n  +0x0E20 | E8 11 00 00             | UOffset32  | 0x000011E8 (4584) Loc: 0x2008      | offset to table[8]\n  +0x0E24 | 80 1E 00 00             | UOffset32  | 0x00001E80 (7808) Loc: 0x2CA4      | offset to table[9]\n  +0x0E28 | B4 1F 00 00             | UOffset32  | 0x00001FB4 (8116) Loc: 0x2DDC      | offset to table[10]\n  +0x0E2C | 68 03 00 00             | UOffset32  | 0x00000368 (872) Loc: 0x1194       | offset to table[11]\n  +0x0E30 | 94 02 00 00             | UOffset32  | 0x00000294 (660) Loc: 0x10C4       | offset to table[12]\n  +0x0E34 | F0 1D 00 00             | UOffset32  | 0x00001DF0 (7664) Loc: 0x2C24      | offset to table[13]\n  +0x0E38 | A8 04 00 00             | UOffset32  | 0x000004A8 (1192) Loc: 0x12E0      | offset to table[14]\n  +0x0E3C | 30 04 00 00             | UOffset32  | 0x00000430 (1072) Loc: 0x126C      | offset to table[15]\n  +0x0E40 | 0C 20 00 00             | UOffset32  | 0x0000200C (8204) Loc: 0x2E4C      | offset to table[16]\n  +0x0E44 | 24 1F 00 00             | UOffset32  | 0x00001F24 (7972) Loc: 0x2D68      | offset to table[17]\n  +0x0E48 | C4 03 00 00             | UOffset32  | 0x000003C4 (964) Loc: 0x120C       | offset to table[18]\n  +0x0E4C | 00 05 00 00             | UOffset32  | 0x00000500 (1280) Loc: 0x134C      | offset to table[19]\n  +0x0E50 | 9C 01 00 00             | UOffset32  | 0x0000019C (412) Loc: 0x0FEC       | offset to table[20]\n  +0x0E54 | 28 01 00 00             | UOffset32  | 0x00000128 (296) Loc: 0x0F7C       | offset to table[21]\n  +0x0E58 | F8 09 00 00             | UOffset32  | 0x000009F8 (2552) Loc: 0x1850      | offset to table[22]\n  +0x0E5C | 30 10 00 00             | UOffset32  | 0x00001030 (4144) Loc: 0x1E8C      | offset to table[23]\n  +0x0E60 | 64 20 00 00             | UOffset32  | 0x00002064 (8292) Loc: 0x2EC4      | offset to table[24]\n  +0x0E64 | C8 02 00 00             | UOffset32  | 0x000002C8 (712) Loc: 0x112C       | offset to table[25]\n  +0x0E68 | EC 01 00 00             | UOffset32  | 0x000001EC (492) Loc: 0x1054       | offset to table[26]\n  +0x0E6C | 6C 05 00 00             | UOffset32  | 0x0000056C (1388) Loc: 0x13D8      | offset to table[27]\n  +0x0E70 | 74 06 00 00             | UOffset32  | 0x00000674 (1652) Loc: 0x14E4      | offset to table[28]\n  +0x0E74 | C0 0E 00 00             | UOffset32  | 0x00000EC0 (3776) Loc: 0x1D34      | offset to table[29]\n  +0x0E78 | 48 1C 00 00             | UOffset32  | 0x00001C48 (7240) Loc: 0x2AC0      | offset to table[30]\n  +0x0E7C | DC 1B 00 00             | UOffset32  | 0x00001BDC (7132) Loc: 0x2A58      | offset to table[31]\n  +0x0E80 | 30 11 00 00             | UOffset32  | 0x00001130 (4400) Loc: 0x1FB0      | offset to table[32]\n  +0x0E84 | AC 1C 00 00             | UOffset32  | 0x00001CAC (7340) Loc: 0x2B30      | offset to table[33]\n  +0x0E88 | DC 13 00 00             | UOffset32  | 0x000013DC (5084) Loc: 0x2264      | offset to table[34]\n  +0x0E8C | F8 11 00 00             | UOffset32  | 0x000011F8 (4600) Loc: 0x2084      | offset to table[35]\n  +0x0E90 | 68 1B 00 00             | UOffset32  | 0x00001B68 (7016) Loc: 0x29F8      | offset to table[36]\n  +0x0E94 | 58 12 00 00             | UOffset32  | 0x00001258 (4696) Loc: 0x20EC      | offset to table[37]\n  +0x0E98 | 88 1A 00 00             | UOffset32  | 0x00001A88 (6792) Loc: 0x2920      | offset to table[38]\n  +0x0E9C | C4 18 00 00             | UOffset32  | 0x000018C4 (6340) Loc: 0x2760      | offset to table[39]\n  +0x0EA0 | 18 19 00 00             | UOffset32  | 0x00001918 (6424) Loc: 0x27B8      | offset to table[40]\n  +0x0EA4 | 68 13 00 00             | UOffset32  | 0x00001368 (4968) Loc: 0x220C      | offset to table[41]\n  +0x0EA8 | F4 12 00 00             | UOffset32  | 0x000012F4 (4852) Loc: 0x219C      | offset to table[42]\n  +0x0EAC | A0 12 00 00             | UOffset32  | 0x000012A0 (4768) Loc: 0x214C      | offset to table[43]\n  +0x0EB0 | 2C 18 00 00             | UOffset32  | 0x0000182C (6188) Loc: 0x26DC      | offset to table[44]\n  +0x0EB4 | 0C 16 00 00             | UOffset32  | 0x0000160C (5644) Loc: 0x24C0      | offset to table[45]\n  +0x0EB8 | 18 17 00 00             | UOffset32  | 0x00001718 (5912) Loc: 0x25D0      | offset to table[46]\n  +0x0EBC | 94 14 00 00             | UOffset32  | 0x00001494 (5268) Loc: 0x2350      | offset to table[47]\n  +0x0EC0 | 98 17 00 00             | UOffset32  | 0x00001798 (6040) Loc: 0x2658      | offset to table[48]\n  +0x0EC4 | 18 15 00 00             | UOffset32  | 0x00001518 (5400) Loc: 0x23DC      | offset to table[49]\n  +0x0EC8 | 80 16 00 00             | UOffset32  | 0x00001680 (5760) Loc: 0x2548      | offset to table[50]\n  +0x0ECC | F8 13 00 00             | UOffset32  | 0x000013F8 (5112) Loc: 0x22C4      | offset to table[51]\n  +0x0ED0 | 44 19 00 00             | UOffset32  | 0x00001944 (6468) Loc: 0x2814      | offset to table[52]\n  +0x0ED4 | 70 05 00 00             | UOffset32  | 0x00000570 (1392) Loc: 0x1444      | offset to table[53]\n  +0x0ED8 | 98 0A 00 00             | UOffset32  | 0x00000A98 (2712) Loc: 0x1970      | offset to table[54]\n  +0x0EDC | 18 10 00 00             | UOffset32  | 0x00001018 (4120) Loc: 0x1EF4      | offset to table[55]\n  +0x0EE0 | 68 06 00 00             | UOffset32  | 0x00000668 (1640) Loc: 0x1548      | offset to table[56]\n  +0x0EE4 | 70 10 00 00             | UOffset32  | 0x00001070 (4208) Loc: 0x1F54      | offset to table[57]\n  +0x0EE8 | 40 08 00 00             | UOffset32  | 0x00000840 (2112) Loc: 0x1728      | offset to table[58]\n  +0x0EEC | 38 0F 00 00             | UOffset32  | 0x00000F38 (3896) Loc: 0x1E24      | offset to table[59]\n  +0x0EF0 | A4 0C 00 00             | UOffset32  | 0x00000CA4 (3236) Loc: 0x1B94      | offset to table[60]\n  +0x0EF4 | 4C 0D 00 00             | UOffset32  | 0x00000D4C (3404) Loc: 0x1C40      | offset to table[61]\n\nstring (reflection.Object.name):\n  +0x0EF8 | 16 00 00 00             | uint32_t   | 0x00000016 (22)                    | length of string\n  +0x0EFC | 4D 79 47 61 6D 65 2E 45 | char[22]   | MyGame.E                           | string literal\n  +0x0F04 | 78 61 6D 70 6C 65 2E 4D |            | xample.M\n  +0x0F0C | 6F 6E 73 74 65 72       |            | onster\n  +0x0F12 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x0F14 | 20 ED FF FF             | SOffset32  | 0xFFFFED20 (-4832) Loc: 0x21F4     | offset to vtable\n  +0x0F18 | 3D 00                   | uint16_t   | 0x003D (61)                        | table field `id` (UShort)\n  +0x0F1A | 7E 00                   | uint16_t   | 0x007E (126)                       | table field `offset` (UShort)\n  +0x0F1C | 48 00 00 00             | UOffset32  | 0x00000048 (72) Loc: 0x0F64        | offset to field `name` (string)\n  +0x0F20 | 34 00 00 00             | UOffset32  | 0x00000034 (52) Loc: 0x0F54        | offset to field `type` (table)\n  +0x0F24 | 0C 00 00 00             | UOffset32  | 0x0000000C (12) Loc: 0x0F30        | offset to field `attributes` (vector)\n  +0x0F28 | 00 00 00 00 00 00 F0 7F | double     | 0x7FF0000000000000 (inf)           | table field `default_real` (Double)\n\nvector (reflection.Field.attributes):\n  +0x0F30 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x0F34 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0F38         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x0F38 | B8 D6 FF FF             | SOffset32  | 0xFFFFD6B8 (-10568) Loc: 0x3880    | offset to vtable\n  +0x0F3C | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x0F4C        | offset to field `key` (string)\n  +0x0F40 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0F44         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x0F44 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x0F48 | 36 31                   | char[2]    | 61                                 | string literal\n  +0x0F4A | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x0F4C | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x0F50 | 69 64                   | char[2]    | id                                 | string literal\n  +0x0F52 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x0F54 | 28 D9 FF FF             | SOffset32  | 0xFFFFD928 (-9944) Loc: 0x362C     | offset to vtable\n  +0x0F58 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x0F5B | 0C                      | uint8_t    | 0x0C (12)                          | table field `base_type` (Byte)\n  +0x0F5C | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | table field `base_size` (UInt)\n  +0x0F60 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x0F64 | 12 00 00 00             | uint32_t   | 0x00000012 (18)                    | length of string\n  +0x0F68 | 64 6F 75 62 6C 65 5F 69 | char[18]   | double_i                           | string literal\n  +0x0F70 | 6E 66 5F 64 65 66 61 75 |            | nf_defau\n  +0x0F78 | 6C 74                   |            | lt\n  +0x0F7A | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x0F7C | 88 FD FF FF             | SOffset32  | 0xFFFFFD88 (-632) Loc: 0x11F4      | offset to vtable\n  +0x0F80 | 3C 00                   | uint16_t   | 0x003C (60)                        | table field `id` (UShort)\n  +0x0F82 | 7C 00                   | uint16_t   | 0x007C (124)                       | table field `offset` (UShort)\n  +0x0F84 | 48 00 00 00             | UOffset32  | 0x00000048 (72) Loc: 0x0FCC        | offset to field `name` (string)\n  +0x0F88 | 38 00 00 00             | UOffset32  | 0x00000038 (56) Loc: 0x0FC0        | offset to field `type` (table)\n  +0x0F8C | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x0F9C        | offset to field `attributes` (vector)\n  +0x0F90 | 00 00 00 00 00 00 F0 FF | double     | 0xFFF0000000000000 (-inf)          | table field `default_real` (Double)\n  +0x0F98 | 00 00 00 00             | uint8_t[4] | ....                               | padding\n\nvector (reflection.Field.attributes):\n  +0x0F9C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x0FA0 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0FA4         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x0FA4 | 24 D7 FF FF             | SOffset32  | 0xFFFFD724 (-10460) Loc: 0x3880    | offset to vtable\n  +0x0FA8 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x0FB8        | offset to field `key` (string)\n  +0x0FAC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0FB0         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x0FB0 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x0FB4 | 36 30                   | char[2]    | 60                                 | string literal\n  +0x0FB6 | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x0FB8 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x0FBC | 69 64                   | char[2]    | id                                 | string literal\n  +0x0FBE | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x0FC0 | 2C D7 FF FF             | SOffset32  | 0xFFFFD72C (-10452) Loc: 0x3894    | offset to vtable\n  +0x0FC4 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x0FC7 | 0B                      | uint8_t    | 0x0B (11)                          | table field `base_type` (Byte)\n  +0x0FC8 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x0FCC | 19 00 00 00             | uint32_t   | 0x00000019 (25)                    | length of string\n  +0x0FD0 | 6E 65 67 61 74 69 76 65 | char[25]   | negative                           | string literal\n  +0x0FD8 | 5F 69 6E 66 69 6E 69 74 |            | _infinit\n  +0x0FE0 | 79 5F 64 65 66 61 75 6C |            | y_defaul\n  +0x0FE8 | 74                      |            | t\n  +0x0FE9 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x0FEA | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Field):\n  +0x0FEC | F8 ED FF FF             | SOffset32  | 0xFFFFEDF8 (-4616) Loc: 0x21F4     | offset to vtable\n  +0x0FF0 | 3B 00                   | uint16_t   | 0x003B (59)                        | table field `id` (UShort)\n  +0x0FF2 | 7A 00                   | uint16_t   | 0x007A (122)                       | table field `offset` (UShort)\n  +0x0FF4 | 44 00 00 00             | UOffset32  | 0x00000044 (68) Loc: 0x1038        | offset to field `name` (string)\n  +0x0FF8 | 34 00 00 00             | UOffset32  | 0x00000034 (52) Loc: 0x102C        | offset to field `type` (table)\n  +0x0FFC | 0C 00 00 00             | UOffset32  | 0x0000000C (12) Loc: 0x1008        | offset to field `attributes` (vector)\n  +0x1000 | 00 00 00 00 00 00 F0 FF | double     | 0xFFF0000000000000 (-inf)          | table field `default_real` (Double)\n\nvector (reflection.Field.attributes):\n  +0x1008 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x100C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1010         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x1010 | 90 D7 FF FF             | SOffset32  | 0xFFFFD790 (-10352) Loc: 0x3880    | offset to vtable\n  +0x1014 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x1024        | offset to field `key` (string)\n  +0x1018 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x101C         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x101C | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1020 | 35 39                   | char[2]    | 59                                 | string literal\n  +0x1022 | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x1024 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1028 | 69 64                   | char[2]    | id                                 | string literal\n  +0x102A | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x102C | 98 D7 FF FF             | SOffset32  | 0xFFFFD798 (-10344) Loc: 0x3894    | offset to vtable\n  +0x1030 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x1033 | 0B                      | uint8_t    | 0x0B (11)                          | table field `base_type` (Byte)\n  +0x1034 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x1038 | 14 00 00 00             | uint32_t   | 0x00000014 (20)                    | length of string\n  +0x103C | 6E 65 67 61 74 69 76 65 | char[20]   | negative                           | string literal\n  +0x1044 | 5F 69 6E 66 5F 64 65 66 |            | _inf_def\n  +0x104C | 61 75 6C 74             |            | ault\n  +0x1050 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1051 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Field):\n  +0x1054 | 60 FE FF FF             | SOffset32  | 0xFFFFFE60 (-416) Loc: 0x11F4      | offset to vtable\n  +0x1058 | 3A 00                   | uint16_t   | 0x003A (58)                        | table field `id` (UShort)\n  +0x105A | 78 00                   | uint16_t   | 0x0078 (120)                       | table field `offset` (UShort)\n  +0x105C | 48 00 00 00             | UOffset32  | 0x00000048 (72) Loc: 0x10A4        | offset to field `name` (string)\n  +0x1060 | 38 00 00 00             | UOffset32  | 0x00000038 (56) Loc: 0x1098        | offset to field `type` (table)\n  +0x1064 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x1074        | offset to field `attributes` (vector)\n  +0x1068 | 00 00 00 00 00 00 F0 7F | double     | 0x7FF0000000000000 (inf)           | table field `default_real` (Double)\n  +0x1070 | 00 00 00 00             | uint8_t[4] | ....                               | padding\n\nvector (reflection.Field.attributes):\n  +0x1074 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x1078 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x107C         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x107C | FC D7 FF FF             | SOffset32  | 0xFFFFD7FC (-10244) Loc: 0x3880    | offset to vtable\n  +0x1080 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x1090        | offset to field `key` (string)\n  +0x1084 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1088         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1088 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x108C | 35 38                   | char[2]    | 58                                 | string literal\n  +0x108E | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x1090 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1094 | 69 64                   | char[2]    | id                                 | string literal\n  +0x1096 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x1098 | 04 D8 FF FF             | SOffset32  | 0xFFFFD804 (-10236) Loc: 0x3894    | offset to vtable\n  +0x109C | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x109F | 0B                      | uint8_t    | 0x0B (11)                          | table field `base_type` (Byte)\n  +0x10A0 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x10A4 | 19 00 00 00             | uint32_t   | 0x00000019 (25)                    | length of string\n  +0x10A8 | 70 6F 73 69 74 69 76 65 | char[25]   | positive                           | string literal\n  +0x10B0 | 5F 69 6E 66 69 6E 69 74 |            | _infinit\n  +0x10B8 | 79 5F 64 65 66 61 75 6C |            | y_defaul\n  +0x10C0 | 74                      |            | t\n  +0x10C1 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x10C2 | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Field):\n  +0x10C4 | D0 FE FF FF             | SOffset32  | 0xFFFFFED0 (-304) Loc: 0x11F4      | offset to vtable\n  +0x10C8 | 39 00                   | uint16_t   | 0x0039 (57)                        | table field `id` (UShort)\n  +0x10CA | 76 00                   | uint16_t   | 0x0076 (118)                       | table field `offset` (UShort)\n  +0x10CC | 48 00 00 00             | UOffset32  | 0x00000048 (72) Loc: 0x1114        | offset to field `name` (string)\n  +0x10D0 | 38 00 00 00             | UOffset32  | 0x00000038 (56) Loc: 0x1108        | offset to field `type` (table)\n  +0x10D4 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x10E4        | offset to field `attributes` (vector)\n  +0x10D8 | 00 00 00 00 00 00 F0 7F | double     | 0x7FF0000000000000 (inf)           | table field `default_real` (Double)\n  +0x10E0 | 00 00 00 00             | uint8_t[4] | ....                               | padding\n\nvector (reflection.Field.attributes):\n  +0x10E4 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x10E8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x10EC         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x10EC | 6C D8 FF FF             | SOffset32  | 0xFFFFD86C (-10132) Loc: 0x3880    | offset to vtable\n  +0x10F0 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x1100        | offset to field `key` (string)\n  +0x10F4 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x10F8         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x10F8 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x10FC | 35 37                   | char[2]    | 57                                 | string literal\n  +0x10FE | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x1100 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1104 | 69 64                   | char[2]    | id                                 | string literal\n  +0x1106 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x1108 | 74 D8 FF FF             | SOffset32  | 0xFFFFD874 (-10124) Loc: 0x3894    | offset to vtable\n  +0x110C | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x110F | 0B                      | uint8_t    | 0x0B (11)                          | table field `base_type` (Byte)\n  +0x1110 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x1114 | 10 00 00 00             | uint32_t   | 0x00000010 (16)                    | length of string\n  +0x1118 | 69 6E 66 69 6E 69 74 79 | char[16]   | infinity                           | string literal\n  +0x1120 | 5F 64 65 66 61 75 6C 74 |            | _default\n  +0x1128 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1129 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Field):\n  +0x112C | 38 EF FF FF             | SOffset32  | 0xFFFFEF38 (-4296) Loc: 0x21F4     | offset to vtable\n  +0x1130 | 38 00                   | uint16_t   | 0x0038 (56)                        | table field `id` (UShort)\n  +0x1132 | 74 00                   | uint16_t   | 0x0074 (116)                       | table field `offset` (UShort)\n  +0x1134 | 44 00 00 00             | UOffset32  | 0x00000044 (68) Loc: 0x1178        | offset to field `name` (string)\n  +0x1138 | 34 00 00 00             | UOffset32  | 0x00000034 (52) Loc: 0x116C        | offset to field `type` (table)\n  +0x113C | 0C 00 00 00             | UOffset32  | 0x0000000C (12) Loc: 0x1148        | offset to field `attributes` (vector)\n  +0x1140 | 00 00 00 00 00 00 F0 7F | double     | 0x7FF0000000000000 (inf)           | table field `default_real` (Double)\n\nvector (reflection.Field.attributes):\n  +0x1148 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x114C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1150         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x1150 | D0 D8 FF FF             | SOffset32  | 0xFFFFD8D0 (-10032) Loc: 0x3880    | offset to vtable\n  +0x1154 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x1164        | offset to field `key` (string)\n  +0x1158 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x115C         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x115C | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1160 | 35 36                   | char[2]    | 56                                 | string literal\n  +0x1162 | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x1164 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1168 | 69 64                   | char[2]    | id                                 | string literal\n  +0x116A | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x116C | D8 D8 FF FF             | SOffset32  | 0xFFFFD8D8 (-10024) Loc: 0x3894    | offset to vtable\n  +0x1170 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x1173 | 0B                      | uint8_t    | 0x0B (11)                          | table field `base_type` (Byte)\n  +0x1174 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x1178 | 14 00 00 00             | uint32_t   | 0x00000014 (20)                    | length of string\n  +0x117C | 70 6F 73 69 74 69 76 65 | char[20]   | positive                           | string literal\n  +0x1184 | 5F 69 6E 66 5F 64 65 66 |            | _inf_def\n  +0x118C | 61 75 6C 74             |            | ault\n  +0x1190 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1191 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Field):\n  +0x1194 | A0 FF FF FF             | SOffset32  | 0xFFFFFFA0 (-96) Loc: 0x11F4       | offset to vtable\n  +0x1198 | 37 00                   | uint16_t   | 0x0037 (55)                        | table field `id` (UShort)\n  +0x119A | 72 00                   | uint16_t   | 0x0072 (114)                       | table field `offset` (UShort)\n  +0x119C | 48 00 00 00             | UOffset32  | 0x00000048 (72) Loc: 0x11E4        | offset to field `name` (string)\n  +0x11A0 | 38 00 00 00             | UOffset32  | 0x00000038 (56) Loc: 0x11D8        | offset to field `type` (table)\n  +0x11A4 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x11B4        | offset to field `attributes` (vector)\n  +0x11A8 | 00 00 00 00 00 00 F0 7F | double     | 0x7FF0000000000000 (inf)           | table field `default_real` (Double)\n  +0x11B0 | 00 00 00 00             | uint8_t[4] | ....                               | padding\n\nvector (reflection.Field.attributes):\n  +0x11B4 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x11B8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x11BC         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x11BC | 3C D9 FF FF             | SOffset32  | 0xFFFFD93C (-9924) Loc: 0x3880     | offset to vtable\n  +0x11C0 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x11D0        | offset to field `key` (string)\n  +0x11C4 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x11C8         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x11C8 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x11CC | 35 35                   | char[2]    | 55                                 | string literal\n  +0x11CE | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x11D0 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x11D4 | 69 64                   | char[2]    | id                                 | string literal\n  +0x11D6 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x11D8 | 44 D9 FF FF             | SOffset32  | 0xFFFFD944 (-9916) Loc: 0x3894     | offset to vtable\n  +0x11DC | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x11DF | 0B                      | uint8_t    | 0x0B (11)                          | table field `base_type` (Byte)\n  +0x11E0 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x11E4 | 0B 00 00 00             | uint32_t   | 0x0000000B (11)                    | length of string\n  +0x11E8 | 69 6E 66 5F 64 65 66 61 | char[11]   | inf_defa                           | string literal\n  +0x11F0 | 75 6C 74                |            | ult\n  +0x11F3 | 00                      | char       | 0x00 (0)                           | string terminator\n\nvtable (reflection.Field):\n  +0x11F4 | 18 00                   | uint16_t   | 0x0018 (24)                        | size of this vtable\n  +0x11F6 | 20 00                   | uint16_t   | 0x0020 (32)                        | size of referring table\n  +0x11F8 | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `name` (id: 0)\n  +0x11FA | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `type` (id: 1)\n  +0x11FC | 04 00                   | VOffset16  | 0x0004 (4)                         | offset to field `id` (id: 2)\n  +0x11FE | 06 00                   | VOffset16  | 0x0006 (6)                         | offset to field `offset` (id: 3)\n  +0x1200 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `default_integer` (id: 4) <defaults to 0> (Long)\n  +0x1202 | 14 00                   | VOffset16  | 0x0014 (20)                        | offset to field `default_real` (id: 5)\n  +0x1204 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `deprecated` (id: 6) <defaults to 0> (Bool)\n  +0x1206 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `required` (id: 7) <defaults to 0> (Bool)\n  +0x1208 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `key` (id: 8) <defaults to 0> (Bool)\n  +0x120A | 10 00                   | VOffset16  | 0x0010 (16)                        | offset to field `attributes` (id: 9)\n\ntable (reflection.Field):\n  +0x120C | 18 00 00 00             | SOffset32  | 0x00000018 (24) Loc: 0x11F4        | offset to vtable\n  +0x1210 | 36 00                   | uint16_t   | 0x0036 (54)                        | table field `id` (UShort)\n  +0x1212 | 70 00                   | uint16_t   | 0x0070 (112)                       | table field `offset` (UShort)\n  +0x1214 | 48 00 00 00             | UOffset32  | 0x00000048 (72) Loc: 0x125C        | offset to field `name` (string)\n  +0x1218 | 38 00 00 00             | UOffset32  | 0x00000038 (56) Loc: 0x1250        | offset to field `type` (table)\n  +0x121C | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x122C        | offset to field `attributes` (vector)\n  +0x1220 | 00 00 00 00 00 00 F8 7F | double     | 0x7FF8000000000000 (nan)           | table field `default_real` (Double)\n  +0x1228 | 00 00 00 00             | uint8_t[4] | ....                               | padding\n\nvector (reflection.Field.attributes):\n  +0x122C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x1230 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1234         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x1234 | B4 D9 FF FF             | SOffset32  | 0xFFFFD9B4 (-9804) Loc: 0x3880     | offset to vtable\n  +0x1238 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x1248        | offset to field `key` (string)\n  +0x123C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1240         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1240 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1244 | 35 34                   | char[2]    | 54                                 | string literal\n  +0x1246 | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x1248 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x124C | 69 64                   | char[2]    | id                                 | string literal\n  +0x124E | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x1250 | BC D9 FF FF             | SOffset32  | 0xFFFFD9BC (-9796) Loc: 0x3894     | offset to vtable\n  +0x1254 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x1257 | 0B                      | uint8_t    | 0x0B (11)                          | table field `base_type` (Byte)\n  +0x1258 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x125C | 0B 00 00 00             | uint32_t   | 0x0000000B (11)                    | length of string\n  +0x1260 | 6E 61 6E 5F 64 65 66 61 | char[11]   | nan_defa                           | string literal\n  +0x1268 | 75 6C 74                |            | ult\n  +0x126B | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x126C | 38 E4 FF FF             | SOffset32  | 0xFFFFE438 (-7112) Loc: 0x2E34     | offset to vtable\n  +0x1270 | 35 00                   | uint16_t   | 0x0035 (53)                        | table field `id` (UShort)\n  +0x1272 | 6E 00                   | uint16_t   | 0x006E (110)                       | table field `offset` (UShort)\n  +0x1274 | 4C 00 00 00             | UOffset32  | 0x0000004C (76) Loc: 0x12C0        | offset to field `name` (string)\n  +0x1278 | 34 00 00 00             | UOffset32  | 0x00000034 (52) Loc: 0x12AC        | offset to field `type` (table)\n  +0x127C | 0C 00 00 00             | UOffset32  | 0x0000000C (12) Loc: 0x1288        | offset to field `attributes` (vector)\n  +0x1280 | 02 00 00 00 00 00 00 00 | int64_t    | 0x0000000000000002 (2)             | table field `default_integer` (Long)\n\nvector (reflection.Field.attributes):\n  +0x1288 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x128C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1290         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x1290 | 10 DA FF FF             | SOffset32  | 0xFFFFDA10 (-9712) Loc: 0x3880     | offset to vtable\n  +0x1294 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x12A4        | offset to field `key` (string)\n  +0x1298 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x129C         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x129C | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x12A0 | 35 33                   | char[2]    | 53                                 | string literal\n  +0x12A2 | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x12A4 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x12A8 | 69 64                   | char[2]    | id                                 | string literal\n  +0x12AA | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x12AC | 48 DD FF FF             | SOffset32  | 0xFFFFDD48 (-8888) Loc: 0x3564     | offset to vtable\n  +0x12B0 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x12B3 | 0A                      | uint8_t    | 0x0A (10)                          | table field `base_type` (Byte)\n  +0x12B4 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | table field `index` (Int)\n  +0x12B8 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | table field `base_size` (UInt)\n  +0x12BC | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x12C0 | 18 00 00 00             | uint32_t   | 0x00000018 (24)                    | length of string\n  +0x12C4 | 6C 6F 6E 67 5F 65 6E 75 | char[24]   | long_enu                           | string literal\n  +0x12CC | 6D 5F 6E 6F 72 6D 61 6C |            | m_normal\n  +0x12D4 | 5F 64 65 66 61 75 6C 74 |            | _default\n  +0x12DC | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x12DD | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Field):\n  +0x12E0 | C8 E7 FF FF             | SOffset32  | 0xFFFFE7C8 (-6200) Loc: 0x2B18     | offset to vtable\n  +0x12E4 | 34 00                   | uint16_t   | 0x0034 (52)                        | table field `id` (UShort)\n  +0x12E6 | 6C 00                   | uint16_t   | 0x006C (108)                       | table field `offset` (UShort)\n  +0x12E8 | 44 00 00 00             | UOffset32  | 0x00000044 (68) Loc: 0x132C        | offset to field `name` (string)\n  +0x12EC | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x1318        | offset to field `type` (table)\n  +0x12F0 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x12F4         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x12F4 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x12F8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x12FC         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x12FC | 7C DA FF FF             | SOffset32  | 0xFFFFDA7C (-9604) Loc: 0x3880     | offset to vtable\n  +0x1300 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x1310        | offset to field `key` (string)\n  +0x1304 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1308         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1308 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x130C | 35 32                   | char[2]    | 52                                 | string literal\n  +0x130E | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x1310 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1314 | 69 64                   | char[2]    | id                                 | string literal\n  +0x1316 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x1318 | B4 DD FF FF             | SOffset32  | 0xFFFFDDB4 (-8780) Loc: 0x3564     | offset to vtable\n  +0x131C | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x131F | 0A                      | uint8_t    | 0x0A (10)                          | table field `base_type` (Byte)\n  +0x1320 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | table field `index` (Int)\n  +0x1324 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | table field `base_size` (UInt)\n  +0x1328 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x132C | 1A 00 00 00             | uint32_t   | 0x0000001A (26)                    | length of string\n  +0x1330 | 6C 6F 6E 67 5F 65 6E 75 | char[26]   | long_enu                           | string literal\n  +0x1338 | 6D 5F 6E 6F 6E 5F 65 6E |            | m_non_en\n  +0x1340 | 75 6D 5F 64 65 66 61 75 |            | um_defau\n  +0x1348 | 6C 74                   |            | lt\n  +0x134A | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x134C | 44 E7 FF FF             | SOffset32  | 0xFFFFE744 (-6332) Loc: 0x2C08     | offset to vtable\n  +0x1350 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x1353 | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x1354 | 33 00                   | uint16_t   | 0x0033 (51)                        | table field `id` (UShort)\n  +0x1356 | 6A 00                   | uint16_t   | 0x006A (106)                       | table field `offset` (UShort)\n  +0x1358 | 6C 00 00 00             | UOffset32  | 0x0000006C (108) Loc: 0x13C4       | offset to field `name` (string)\n  +0x135C | 58 00 00 00             | UOffset32  | 0x00000058 (88) Loc: 0x13B4        | offset to field `type` (table)\n  +0x1360 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1364         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x1364 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of vector (# items)\n  +0x1368 | 30 00 00 00             | UOffset32  | 0x00000030 (48) Loc: 0x1398        | offset to table[0]\n  +0x136C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1370         | offset to table[1]\n\ntable (reflection.KeyValue):\n  +0x1370 | F0 DA FF FF             | SOffset32  | 0xFFFFDAF0 (-9488) Loc: 0x3880     | offset to vtable\n  +0x1374 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x1384        | offset to field `key` (string)\n  +0x1378 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x137C         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x137C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x1380 | 30                      | char[1]    | 0                                  | string literal\n  +0x1381 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1382 | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x1384 | 0D 00 00 00             | uint32_t   | 0x0000000D (13)                    | length of string\n  +0x1388 | 6E 61 74 69 76 65 5F 69 | char[13]   | native_i                           | string literal\n  +0x1390 | 6E 6C 69 6E 65          |            | nline\n  +0x1395 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1396 | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.KeyValue):\n  +0x1398 | 18 DB FF FF             | SOffset32  | 0xFFFFDB18 (-9448) Loc: 0x3880     | offset to vtable\n  +0x139C | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x13AC        | offset to field `key` (string)\n  +0x13A0 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x13A4         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x13A4 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x13A8 | 35 31                   | char[2]    | 51                                 | string literal\n  +0x13AA | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x13AC | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x13B0 | 69 64                   | char[2]    | id                                 | string literal\n  +0x13B2 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x13B4 | E4 DB FF FF             | SOffset32  | 0xFFFFDBE4 (-9244) Loc: 0x37D0     | offset to vtable\n  +0x13B8 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x13BB | 0F                      | uint8_t    | 0x0F (15)                          | table field `base_type` (Byte)\n  +0x13BC | 06 00 00 00             | uint32_t   | 0x00000006 (6)                     | table field `index` (Int)\n  +0x13C0 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x13C4 | 0D 00 00 00             | uint32_t   | 0x0000000D (13)                    | length of string\n  +0x13C8 | 6E 61 74 69 76 65 5F 69 | char[13]   | native_i                           | string literal\n  +0x13D0 | 6E 6C 69 6E 65          |            | nline\n  +0x13D5 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x13D6 | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Field):\n  +0x13D8 | D0 E7 FF FF             | SOffset32  | 0xFFFFE7D0 (-6192) Loc: 0x2C08     | offset to vtable\n  +0x13DC | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x13DF | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x13E0 | 32 00                   | uint16_t   | 0x0032 (50)                        | table field `id` (UShort)\n  +0x13E2 | 68 00                   | uint16_t   | 0x0068 (104)                       | table field `offset` (UShort)\n  +0x13E4 | 40 00 00 00             | UOffset32  | 0x00000040 (64) Loc: 0x1424        | offset to field `name` (string)\n  +0x13E8 | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x1414        | offset to field `type` (table)\n  +0x13EC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x13F0         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x13F0 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x13F4 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x13F8         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x13F8 | 78 DB FF FF             | SOffset32  | 0xFFFFDB78 (-9352) Loc: 0x3880     | offset to vtable\n  +0x13FC | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x140C        | offset to field `key` (string)\n  +0x1400 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1404         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1404 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1408 | 35 30                   | char[2]    | 50                                 | string literal\n  +0x140A | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x140C | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1410 | 69 64                   | char[2]    | id                                 | string literal\n  +0x1412 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x1414 | 80 E9 FF FF             | SOffset32  | 0xFFFFE980 (-5760) Loc: 0x2A94     | offset to vtable\n  +0x1418 | 00 00                   | uint8_t[2] | ..                                 | padding\n  +0x141A | 0E                      | uint8_t    | 0x0E (14)                          | table field `base_type` (Byte)\n  +0x141B | 0F                      | uint8_t    | 0x0F (15)                          | table field `element` (Byte)\n  +0x141C | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | table field `index` (Int)\n  +0x1420 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x1424 | 18 00 00 00             | uint32_t   | 0x00000018 (24)                    | length of string\n  +0x1428 | 73 63 61 6C 61 72 5F 6B | char[24]   | scalar_k                           | string literal\n  +0x1430 | 65 79 5F 73 6F 72 74 65 |            | ey_sorte\n  +0x1438 | 64 5F 74 61 62 6C 65 73 |            | d_tables\n  +0x1440 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1441 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Field):\n  +0x1444 | 3C E8 FF FF             | SOffset32  | 0xFFFFE83C (-6084) Loc: 0x2C08     | offset to vtable\n  +0x1448 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x144B | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x144C | 31 00                   | uint16_t   | 0x0031 (49)                        | table field `id` (UShort)\n  +0x144E | 66 00                   | uint16_t   | 0x0066 (102)                       | table field `offset` (UShort)\n  +0x1450 | 70 00 00 00             | UOffset32  | 0x00000070 (112) Loc: 0x14C0       | offset to field `name` (string)\n  +0x1454 | 60 00 00 00             | UOffset32  | 0x00000060 (96) Loc: 0x14B4        | offset to field `type` (table)\n  +0x1458 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x145C         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x145C | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of vector (# items)\n  +0x1460 | 38 00 00 00             | UOffset32  | 0x00000038 (56) Loc: 0x1498        | offset to table[0]\n  +0x1464 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1468         | offset to table[1]\n\ntable (reflection.KeyValue):\n  +0x1468 | E8 DB FF FF             | SOffset32  | 0xFFFFDBE8 (-9240) Loc: 0x3880     | offset to vtable\n  +0x146C | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x1480        | offset to field `key` (string)\n  +0x1470 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1474         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1474 | 07 00 00 00             | uint32_t   | 0x00000007 (7)                     | length of string\n  +0x1478 | 4D 6F 6E 73 74 65 72    | char[7]    | Monster                            | string literal\n  +0x147F | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x1480 | 11 00 00 00             | uint32_t   | 0x00000011 (17)                    | length of string\n  +0x1484 | 6E 65 73 74 65 64 5F 66 | char[17]   | nested_f                           | string literal\n  +0x148C | 6C 61 74 62 75 66 66 65 |            | latbuffe\n  +0x1494 | 72                      |            | r\n  +0x1495 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1496 | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.KeyValue):\n  +0x1498 | 18 DC FF FF             | SOffset32  | 0xFFFFDC18 (-9192) Loc: 0x3880     | offset to vtable\n  +0x149C | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x14AC        | offset to field `key` (string)\n  +0x14A0 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x14A4         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x14A4 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x14A8 | 34 39                   | char[2]    | 49                                 | string literal\n  +0x14AA | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x14AC | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x14B0 | 69 64                   | char[2]    | id                                 | string literal\n  +0x14B2 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x14B4 | 54 E8 FF FF             | SOffset32  | 0xFFFFE854 (-6060) Loc: 0x2C60     | offset to vtable\n  +0x14B8 | 00 00                   | uint8_t[2] | ..                                 | padding\n  +0x14BA | 0E                      | uint8_t    | 0x0E (14)                          | table field `base_type` (Byte)\n  +0x14BB | 04                      | uint8_t    | 0x04 (4)                           | table field `element` (Byte)\n  +0x14BC | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x14C0 | 1C 00 00 00             | uint32_t   | 0x0000001C (28)                    | length of string\n  +0x14C4 | 74 65 73 74 72 65 71 75 | char[28]   | testrequ                           | string literal\n  +0x14CC | 69 72 65 64 6E 65 73 74 |            | irednest\n  +0x14D4 | 65 64 66 6C 61 74 62 75 |            | edflatbu\n  +0x14DC | 66 66 65 72             |            | ffer\n  +0x14E0 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x14E1 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Field):\n  +0x14E4 | B0 E6 FF FF             | SOffset32  | 0xFFFFE6B0 (-6480) Loc: 0x2E34     | offset to vtable\n  +0x14E8 | 30 00                   | uint16_t   | 0x0030 (48)                        | table field `id` (UShort)\n  +0x14EA | 64 00                   | uint16_t   | 0x0064 (100)                       | table field `offset` (UShort)\n  +0x14EC | 4C 00 00 00             | UOffset32  | 0x0000004C (76) Loc: 0x1538        | offset to field `name` (string)\n  +0x14F0 | 34 00 00 00             | UOffset32  | 0x00000034 (52) Loc: 0x1524        | offset to field `type` (table)\n  +0x14F4 | 0C 00 00 00             | UOffset32  | 0x0000000C (12) Loc: 0x1500        | offset to field `attributes` (vector)\n  +0x14F8 | FF FF FF FF FF FF FF FF | int64_t    | 0xFFFFFFFFFFFFFFFF (-1)            | table field `default_integer` (Long)\n\nvector (reflection.Field.attributes):\n  +0x1500 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x1504 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1508         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x1508 | 88 DC FF FF             | SOffset32  | 0xFFFFDC88 (-9080) Loc: 0x3880     | offset to vtable\n  +0x150C | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x151C        | offset to field `key` (string)\n  +0x1510 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1514         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1514 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1518 | 34 38                   | char[2]    | 48                                 | string literal\n  +0x151A | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x151C | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1520 | 69 64                   | char[2]    | id                                 | string literal\n  +0x1522 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x1524 | C0 DF FF FF             | SOffset32  | 0xFFFFDFC0 (-8256) Loc: 0x3564     | offset to vtable\n  +0x1528 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x152B | 03                      | uint8_t    | 0x03 (3)                           | table field `base_type` (Byte)\n  +0x152C | 05 00 00 00             | uint32_t   | 0x00000005 (5)                     | table field `index` (Int)\n  +0x1530 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x1534 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x1538 | 0B 00 00 00             | uint32_t   | 0x0000000B (11)                    | length of string\n  +0x153C | 73 69 67 6E 65 64 5F 65 | char[11]   | signed_e                           | string literal\n  +0x1544 | 6E 75 6D                |            | num\n  +0x1547 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x1548 | 40 E9 FF FF             | SOffset32  | 0xFFFFE940 (-5824) Loc: 0x2C08     | offset to vtable\n  +0x154C | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x154F | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x1550 | 2F 00                   | uint16_t   | 0x002F (47)                        | table field `id` (UShort)\n  +0x1552 | 62 00                   | uint16_t   | 0x0062 (98)                        | table field `offset` (UShort)\n  +0x1554 | 40 00 00 00             | UOffset32  | 0x00000040 (64) Loc: 0x1594        | offset to field `name` (string)\n  +0x1558 | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x1584        | offset to field `type` (table)\n  +0x155C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1560         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x1560 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x1564 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1568         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x1568 | E8 DC FF FF             | SOffset32  | 0xFFFFDCE8 (-8984) Loc: 0x3880     | offset to vtable\n  +0x156C | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x157C        | offset to field `key` (string)\n  +0x1570 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1574         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1574 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1578 | 34 37                   | char[2]    | 47                                 | string literal\n  +0x157A | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x157C | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1580 | 69 64                   | char[2]    | id                                 | string literal\n  +0x1582 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x1584 | F0 EA FF FF             | SOffset32  | 0xFFFFEAF0 (-5392) Loc: 0x2A94     | offset to vtable\n  +0x1588 | 00 00                   | uint8_t[2] | ..                                 | padding\n  +0x158A | 0E                      | uint8_t    | 0x0E (14)                          | table field `base_type` (Byte)\n  +0x158B | 04                      | uint8_t    | 0x04 (4)                           | table field `element` (Byte)\n  +0x158C | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | table field `index` (Int)\n  +0x1590 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x1594 | 0F 00 00 00             | uint32_t   | 0x0000000F (15)                    | length of string\n  +0x1598 | 76 65 63 74 6F 72 5F 6F | char[15]   | vector_o                           | string literal\n  +0x15A0 | 66 5F 65 6E 75 6D 73    |            | f_enums\n  +0x15A7 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x15A8 | A0 E9 FF FF             | SOffset32  | 0xFFFFE9A0 (-5728) Loc: 0x2C08     | offset to vtable\n  +0x15AC | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x15AF | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x15B0 | 2E 00                   | uint16_t   | 0x002E (46)                        | table field `id` (UShort)\n  +0x15B2 | 60 00                   | uint16_t   | 0x0060 (96)                        | table field `offset` (UShort)\n  +0x15B4 | 40 00 00 00             | UOffset32  | 0x00000040 (64) Loc: 0x15F4        | offset to field `name` (string)\n  +0x15B8 | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x15E4        | offset to field `type` (table)\n  +0x15BC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x15C0         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x15C0 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x15C4 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x15C8         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x15C8 | 48 DD FF FF             | SOffset32  | 0xFFFFDD48 (-8888) Loc: 0x3880     | offset to vtable\n  +0x15CC | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x15DC        | offset to field `key` (string)\n  +0x15D0 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x15D4         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x15D4 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x15D8 | 34 36                   | char[2]    | 46                                 | string literal\n  +0x15DA | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x15DC | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x15E0 | 69 64                   | char[2]    | id                                 | string literal\n  +0x15E2 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x15E4 | 14 DE FF FF             | SOffset32  | 0xFFFFDE14 (-8684) Loc: 0x37D0     | offset to vtable\n  +0x15E8 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x15EB | 10                      | uint8_t    | 0x10 (16)                          | table field `base_type` (Byte)\n  +0x15EC | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `index` (Int)\n  +0x15F0 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x15F4 | 0D 00 00 00             | uint32_t   | 0x0000000D (13)                    | length of string\n  +0x15F8 | 61 6E 79 5F 61 6D 62 69 | char[13]   | any_ambi                           | string literal\n  +0x1600 | 67 75 6F 75 73          |            | guous\n  +0x1605 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1606 | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Field):\n  +0x1608 | F0 EA FF FF             | SOffset32  | 0xFFFFEAF0 (-5392) Loc: 0x2B18     | offset to vtable\n  +0x160C | 2D 00                   | uint16_t   | 0x002D (45)                        | table field `id` (UShort)\n  +0x160E | 5E 00                   | uint16_t   | 0x005E (94)                        | table field `offset` (UShort)\n  +0x1610 | 44 00 00 00             | UOffset32  | 0x00000044 (68) Loc: 0x1654        | offset to field `name` (string)\n  +0x1614 | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x1640        | offset to field `type` (table)\n  +0x1618 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x161C         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x161C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x1620 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1624         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x1624 | A4 DD FF FF             | SOffset32  | 0xFFFFDDA4 (-8796) Loc: 0x3880     | offset to vtable\n  +0x1628 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x1638        | offset to field `key` (string)\n  +0x162C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1630         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1630 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1634 | 34 35                   | char[2]    | 45                                 | string literal\n  +0x1636 | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x1638 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x163C | 69 64                   | char[2]    | id                                 | string literal\n  +0x163E | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x1640 | DC E0 FF FF             | SOffset32  | 0xFFFFE0DC (-7972) Loc: 0x3564     | offset to vtable\n  +0x1644 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x1647 | 01                      | uint8_t    | 0x01 (1)                           | table field `base_type` (Byte)\n  +0x1648 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `index` (Int)\n  +0x164C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x1650 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x1654 | 12 00 00 00             | uint32_t   | 0x00000012 (18)                    | length of string\n  +0x1658 | 61 6E 79 5F 61 6D 62 69 | char[18]   | any_ambi                           | string literal\n  +0x1660 | 67 75 6F 75 73 5F 74 79 |            | guous_ty\n  +0x1668 | 70 65                   |            | pe\n  +0x166A | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x166C | 64 EA FF FF             | SOffset32  | 0xFFFFEA64 (-5532) Loc: 0x2C08     | offset to vtable\n  +0x1670 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x1673 | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x1674 | 2C 00                   | uint16_t   | 0x002C (44)                        | table field `id` (UShort)\n  +0x1676 | 5C 00                   | uint16_t   | 0x005C (92)                        | table field `offset` (UShort)\n  +0x1678 | 40 00 00 00             | UOffset32  | 0x00000040 (64) Loc: 0x16B8        | offset to field `name` (string)\n  +0x167C | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x16A8        | offset to field `type` (table)\n  +0x1680 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1684         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x1684 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x1688 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x168C         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x168C | 0C DE FF FF             | SOffset32  | 0xFFFFDE0C (-8692) Loc: 0x3880     | offset to vtable\n  +0x1690 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x16A0        | offset to field `key` (string)\n  +0x1694 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1698         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1698 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x169C | 34 34                   | char[2]    | 44                                 | string literal\n  +0x169E | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x16A0 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x16A4 | 69 64                   | char[2]    | id                                 | string literal\n  +0x16A6 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x16A8 | D8 DE FF FF             | SOffset32  | 0xFFFFDED8 (-8488) Loc: 0x37D0     | offset to vtable\n  +0x16AC | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x16AF | 10                      | uint8_t    | 0x10 (16)                          | table field `base_type` (Byte)\n  +0x16B0 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | table field `index` (Int)\n  +0x16B4 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x16B8 | 0A 00 00 00             | uint32_t   | 0x0000000A (10)                    | length of string\n  +0x16BC | 61 6E 79 5F 75 6E 69 71 | char[10]   | any_uniq                           | string literal\n  +0x16C4 | 75 65                   |            | ue\n  +0x16C6 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x16C8 | B0 EB FF FF             | SOffset32  | 0xFFFFEBB0 (-5200) Loc: 0x2B18     | offset to vtable\n  +0x16CC | 2B 00                   | uint16_t   | 0x002B (43)                        | table field `id` (UShort)\n  +0x16CE | 5A 00                   | uint16_t   | 0x005A (90)                        | table field `offset` (UShort)\n  +0x16D0 | 44 00 00 00             | UOffset32  | 0x00000044 (68) Loc: 0x1714        | offset to field `name` (string)\n  +0x16D4 | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x1700        | offset to field `type` (table)\n  +0x16D8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x16DC         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x16DC | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x16E0 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x16E4         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x16E4 | 64 DE FF FF             | SOffset32  | 0xFFFFDE64 (-8604) Loc: 0x3880     | offset to vtable\n  +0x16E8 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x16F8        | offset to field `key` (string)\n  +0x16EC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x16F0         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x16F0 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x16F4 | 34 33                   | char[2]    | 43                                 | string literal\n  +0x16F6 | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x16F8 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x16FC | 69 64                   | char[2]    | id                                 | string literal\n  +0x16FE | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x1700 | 9C E1 FF FF             | SOffset32  | 0xFFFFE19C (-7780) Loc: 0x3564     | offset to vtable\n  +0x1704 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x1707 | 01                      | uint8_t    | 0x01 (1)                           | table field `base_type` (Byte)\n  +0x1708 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | table field `index` (Int)\n  +0x170C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x1710 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x1714 | 0F 00 00 00             | uint32_t   | 0x0000000F (15)                    | length of string\n  +0x1718 | 61 6E 79 5F 75 6E 69 71 | char[15]   | any_uniq                           | string literal\n  +0x1720 | 75 65 5F 74 79 70 65    |            | ue_type\n  +0x1727 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x1728 | 20 EB FF FF             | SOffset32  | 0xFFFFEB20 (-5344) Loc: 0x2C08     | offset to vtable\n  +0x172C | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x172F | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x1730 | 2A 00                   | uint16_t   | 0x002A (42)                        | table field `id` (UShort)\n  +0x1732 | 58 00                   | uint16_t   | 0x0058 (88)                        | table field `offset` (UShort)\n  +0x1734 | F8 00 00 00             | UOffset32  | 0x000000F8 (248) Loc: 0x182C       | offset to field `name` (string)\n  +0x1738 | E8 00 00 00             | UOffset32  | 0x000000E8 (232) Loc: 0x1820       | offset to field `type` (table)\n  +0x173C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1740         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x1740 | 05 00 00 00             | uint32_t   | 0x00000005 (5)                     | length of vector (# items)\n  +0x1744 | B0 00 00 00             | UOffset32  | 0x000000B0 (176) Loc: 0x17F4       | offset to table[0]\n  +0x1748 | 80 00 00 00             | UOffset32  | 0x00000080 (128) Loc: 0x17C8       | offset to table[1]\n  +0x174C | 50 00 00 00             | UOffset32  | 0x00000050 (80) Loc: 0x179C        | offset to table[2]\n  +0x1750 | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x1774        | offset to table[3]\n  +0x1754 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1758         | offset to table[4]\n\ntable (reflection.KeyValue):\n  +0x1758 | D8 DE FF FF             | SOffset32  | 0xFFFFDED8 (-8488) Loc: 0x3880     | offset to vtable\n  +0x175C | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x176C        | offset to field `key` (string)\n  +0x1760 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1764         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1764 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1768 | 34 32                   | char[2]    | 42                                 | string literal\n  +0x176A | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x176C | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1770 | 69 64                   | char[2]    | id                                 | string literal\n  +0x1772 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.KeyValue):\n  +0x1774 | F4 DE FF FF             | SOffset32  | 0xFFFFDEF4 (-8460) Loc: 0x3880     | offset to vtable\n  +0x1778 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x1790        | offset to field `key` (string)\n  +0x177C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1780         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1780 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | length of string\n  +0x1784 | 66 6E 76 31 61 5F 36 34 | char[8]    | fnv1a_64                           | string literal\n  +0x178C | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x178D | 00 00 00                | uint8_t[3] | ...                                | padding\n\nstring (reflection.KeyValue.key):\n  +0x1790 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of string\n  +0x1794 | 68 61 73 68             | char[4]    | hash                               | string literal\n  +0x1798 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1799 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.KeyValue):\n  +0x179C | 1C DF FF FF             | SOffset32  | 0xFFFFDF1C (-8420) Loc: 0x3880     | offset to vtable\n  +0x17A0 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x17B8        | offset to field `key` (string)\n  +0x17A4 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x17A8         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x17A8 | 0B 00 00 00             | uint32_t   | 0x0000000B (11)                    | length of string\n  +0x17AC | 52 65 66 65 72 72 61 62 | char[11]   | Referrab                           | string literal\n  +0x17B4 | 6C 65 54                |            | leT\n  +0x17B7 | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x17B8 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | length of string\n  +0x17BC | 63 70 70 5F 74 79 70 65 | char[8]    | cpp_type                           | string literal\n  +0x17C4 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x17C5 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.KeyValue):\n  +0x17C8 | 48 DF FF FF             | SOffset32  | 0xFFFFDF48 (-8376) Loc: 0x3880     | offset to vtable\n  +0x17CC | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x17DC        | offset to field `key` (string)\n  +0x17D0 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x17D4         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x17D4 | 00 00 00 00             | uint32_t   | 0x00000000 (0)                     | length of string\n  +0x17D8 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x17D9 | 00 00 00                | uint8_t[3] | ...                                | padding\n\nstring (reflection.KeyValue.key):\n  +0x17DC | 10 00 00 00             | uint32_t   | 0x00000010 (16)                    | length of string\n  +0x17E0 | 63 70 70 5F 70 74 72 5F | char[16]   | cpp_ptr_                           | string literal\n  +0x17E8 | 74 79 70 65 5F 67 65 74 |            | type_get\n  +0x17F0 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x17F1 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.KeyValue):\n  +0x17F4 | 74 DF FF FF             | SOffset32  | 0xFFFFDF74 (-8332) Loc: 0x3880     | offset to vtable\n  +0x17F8 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x180C        | offset to field `key` (string)\n  +0x17FC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1800         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1800 | 05 00 00 00             | uint32_t   | 0x00000005 (5)                     | length of string\n  +0x1804 | 6E 61 6B 65 64          | char[5]    | naked                              | string literal\n  +0x1809 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x180A | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x180C | 0C 00 00 00             | uint32_t   | 0x0000000C (12)                    | length of string\n  +0x1810 | 63 70 70 5F 70 74 72 5F | char[12]   | cpp_ptr_                           | string literal\n  +0x1818 | 74 79 70 65             |            | type\n  +0x181C | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x181D | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Type):\n  +0x1820 | C0 EB FF FF             | SOffset32  | 0xFFFFEBC0 (-5184) Loc: 0x2C60     | offset to vtable\n  +0x1824 | 00 00                   | uint8_t[2] | ..                                 | padding\n  +0x1826 | 0E                      | uint8_t    | 0x0E (14)                          | table field `base_type` (Byte)\n  +0x1827 | 0A                      | uint8_t    | 0x0A (10)                          | table field `element` (Byte)\n  +0x1828 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x182C | 1F 00 00 00             | uint32_t   | 0x0000001F (31)                    | length of string\n  +0x1830 | 76 65 63 74 6F 72 5F 6F | char[31]   | vector_o                           | string literal\n  +0x1838 | 66 5F 6E 6F 6E 5F 6F 77 |            | f_non_ow\n  +0x1840 | 6E 69 6E 67 5F 72 65 66 |            | ning_ref\n  +0x1848 | 65 72 65 6E 63 65 73    |            | erences\n  +0x184F | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x1850 | 38 ED FF FF             | SOffset32  | 0xFFFFED38 (-4808) Loc: 0x2B18     | offset to vtable\n  +0x1854 | 29 00                   | uint16_t   | 0x0029 (41)                        | table field `id` (UShort)\n  +0x1856 | 56 00                   | uint16_t   | 0x0056 (86)                        | table field `offset` (UShort)\n  +0x1858 | FC 00 00 00             | UOffset32  | 0x000000FC (252) Loc: 0x1954       | offset to field `name` (string)\n  +0x185C | E8 00 00 00             | UOffset32  | 0x000000E8 (232) Loc: 0x1944       | offset to field `type` (table)\n  +0x1860 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1864         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x1864 | 05 00 00 00             | uint32_t   | 0x00000005 (5)                     | length of vector (# items)\n  +0x1868 | B0 00 00 00             | UOffset32  | 0x000000B0 (176) Loc: 0x1918       | offset to table[0]\n  +0x186C | 80 00 00 00             | UOffset32  | 0x00000080 (128) Loc: 0x18EC       | offset to table[1]\n  +0x1870 | 50 00 00 00             | UOffset32  | 0x00000050 (80) Loc: 0x18C0        | offset to table[2]\n  +0x1874 | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x1898        | offset to table[3]\n  +0x1878 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x187C         | offset to table[4]\n\ntable (reflection.KeyValue):\n  +0x187C | FC DF FF FF             | SOffset32  | 0xFFFFDFFC (-8196) Loc: 0x3880     | offset to vtable\n  +0x1880 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x1890        | offset to field `key` (string)\n  +0x1884 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1888         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1888 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x188C | 34 31                   | char[2]    | 41                                 | string literal\n  +0x188E | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x1890 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1894 | 69 64                   | char[2]    | id                                 | string literal\n  +0x1896 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.KeyValue):\n  +0x1898 | 18 E0 FF FF             | SOffset32  | 0xFFFFE018 (-8168) Loc: 0x3880     | offset to vtable\n  +0x189C | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x18B4        | offset to field `key` (string)\n  +0x18A0 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x18A4         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x18A4 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | length of string\n  +0x18A8 | 66 6E 76 31 61 5F 36 34 | char[8]    | fnv1a_64                           | string literal\n  +0x18B0 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x18B1 | 00 00 00                | uint8_t[3] | ...                                | padding\n\nstring (reflection.KeyValue.key):\n  +0x18B4 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of string\n  +0x18B8 | 68 61 73 68             | char[4]    | hash                               | string literal\n  +0x18BC | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x18BD | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.KeyValue):\n  +0x18C0 | 40 E0 FF FF             | SOffset32  | 0xFFFFE040 (-8128) Loc: 0x3880     | offset to vtable\n  +0x18C4 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x18DC        | offset to field `key` (string)\n  +0x18C8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x18CC         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x18CC | 0B 00 00 00             | uint32_t   | 0x0000000B (11)                    | length of string\n  +0x18D0 | 52 65 66 65 72 72 61 62 | char[11]   | Referrab                           | string literal\n  +0x18D8 | 6C 65 54                |            | leT\n  +0x18DB | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x18DC | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | length of string\n  +0x18E0 | 63 70 70 5F 74 79 70 65 | char[8]    | cpp_type                           | string literal\n  +0x18E8 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x18E9 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.KeyValue):\n  +0x18EC | 6C E0 FF FF             | SOffset32  | 0xFFFFE06C (-8084) Loc: 0x3880     | offset to vtable\n  +0x18F0 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x1900        | offset to field `key` (string)\n  +0x18F4 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x18F8         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x18F8 | 00 00 00 00             | uint32_t   | 0x00000000 (0)                     | length of string\n  +0x18FC | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x18FD | 00 00 00                | uint8_t[3] | ...                                | padding\n\nstring (reflection.KeyValue.key):\n  +0x1900 | 10 00 00 00             | uint32_t   | 0x00000010 (16)                    | length of string\n  +0x1904 | 63 70 70 5F 70 74 72 5F | char[16]   | cpp_ptr_                           | string literal\n  +0x190C | 74 79 70 65 5F 67 65 74 |            | type_get\n  +0x1914 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1915 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.KeyValue):\n  +0x1918 | 98 E0 FF FF             | SOffset32  | 0xFFFFE098 (-8040) Loc: 0x3880     | offset to vtable\n  +0x191C | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x1930        | offset to field `key` (string)\n  +0x1920 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1924         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1924 | 05 00 00 00             | uint32_t   | 0x00000005 (5)                     | length of string\n  +0x1928 | 6E 61 6B 65 64          | char[5]    | naked                              | string literal\n  +0x192D | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x192E | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x1930 | 0C 00 00 00             | uint32_t   | 0x0000000C (12)                    | length of string\n  +0x1934 | 63 70 70 5F 70 74 72 5F | char[12]   | cpp_ptr_                           | string literal\n  +0x193C | 74 79 70 65             |            | type\n  +0x1940 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1941 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Type):\n  +0x1944 | 18 E3 FF FF             | SOffset32  | 0xFFFFE318 (-7400) Loc: 0x362C     | offset to vtable\n  +0x1948 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x194B | 0A                      | uint8_t    | 0x0A (10)                          | table field `base_type` (Byte)\n  +0x194C | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | table field `base_size` (UInt)\n  +0x1950 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x1954 | 14 00 00 00             | uint32_t   | 0x00000014 (20)                    | length of string\n  +0x1958 | 6E 6F 6E 5F 6F 77 6E 69 | char[20]   | non_owni                           | string literal\n  +0x1960 | 6E 67 5F 72 65 66 65 72 |            | ng_refer\n  +0x1968 | 65 6E 63 65             |            | ence\n  +0x196C | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x196D | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Field):\n  +0x1970 | 68 ED FF FF             | SOffset32  | 0xFFFFED68 (-4760) Loc: 0x2C08     | offset to vtable\n  +0x1974 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x1977 | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x1978 | 28 00                   | uint16_t   | 0x0028 (40)                        | table field `id` (UShort)\n  +0x197A | 54 00                   | uint16_t   | 0x0054 (84)                        | table field `offset` (UShort)\n  +0x197C | 08 01 00 00             | UOffset32  | 0x00000108 (264) Loc: 0x1A84       | offset to field `name` (string)\n  +0x1980 | F8 00 00 00             | UOffset32  | 0x000000F8 (248) Loc: 0x1A78       | offset to field `type` (table)\n  +0x1984 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1988         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x1988 | 05 00 00 00             | uint32_t   | 0x00000005 (5)                     | length of vector (# items)\n  +0x198C | B4 00 00 00             | UOffset32  | 0x000000B4 (180) Loc: 0x1A40       | offset to table[0]\n  +0x1990 | 80 00 00 00             | UOffset32  | 0x00000080 (128) Loc: 0x1A10       | offset to table[1]\n  +0x1994 | 50 00 00 00             | UOffset32  | 0x00000050 (80) Loc: 0x19E4        | offset to table[2]\n  +0x1998 | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x19BC        | offset to table[3]\n  +0x199C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x19A0         | offset to table[4]\n\ntable (reflection.KeyValue):\n  +0x19A0 | 20 E1 FF FF             | SOffset32  | 0xFFFFE120 (-7904) Loc: 0x3880     | offset to vtable\n  +0x19A4 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x19B4        | offset to field `key` (string)\n  +0x19A8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x19AC         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x19AC | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x19B0 | 34 30                   | char[2]    | 40                                 | string literal\n  +0x19B2 | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x19B4 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x19B8 | 69 64                   | char[2]    | id                                 | string literal\n  +0x19BA | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.KeyValue):\n  +0x19BC | 3C E1 FF FF             | SOffset32  | 0xFFFFE13C (-7876) Loc: 0x3880     | offset to vtable\n  +0x19C0 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x19D8        | offset to field `key` (string)\n  +0x19C4 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x19C8         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x19C8 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | length of string\n  +0x19CC | 66 6E 76 31 61 5F 36 34 | char[8]    | fnv1a_64                           | string literal\n  +0x19D4 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x19D5 | 00 00 00                | uint8_t[3] | ...                                | padding\n\nstring (reflection.KeyValue.key):\n  +0x19D8 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of string\n  +0x19DC | 68 61 73 68             | char[4]    | hash                               | string literal\n  +0x19E0 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x19E1 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.KeyValue):\n  +0x19E4 | 64 E1 FF FF             | SOffset32  | 0xFFFFE164 (-7836) Loc: 0x3880     | offset to vtable\n  +0x19E8 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x1A00        | offset to field `key` (string)\n  +0x19EC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x19F0         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x19F0 | 0B 00 00 00             | uint32_t   | 0x0000000B (11)                    | length of string\n  +0x19F4 | 52 65 66 65 72 72 61 62 | char[11]   | Referrab                           | string literal\n  +0x19FC | 6C 65 54                |            | leT\n  +0x19FF | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x1A00 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | length of string\n  +0x1A04 | 63 70 70 5F 74 79 70 65 | char[8]    | cpp_type                           | string literal\n  +0x1A0C | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1A0D | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.KeyValue):\n  +0x1A10 | 90 E1 FF FF             | SOffset32  | 0xFFFFE190 (-7792) Loc: 0x3880     | offset to vtable\n  +0x1A14 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x1A28        | offset to field `key` (string)\n  +0x1A18 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1A1C         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1A1C | 06 00 00 00             | uint32_t   | 0x00000006 (6)                     | length of string\n  +0x1A20 | 2E 67 65 74 28 29       | char[6]    | .get()                             | string literal\n  +0x1A26 | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x1A28 | 10 00 00 00             | uint32_t   | 0x00000010 (16)                    | length of string\n  +0x1A2C | 63 70 70 5F 70 74 72 5F | char[16]   | cpp_ptr_                           | string literal\n  +0x1A34 | 74 79 70 65 5F 67 65 74 |            | type_get\n  +0x1A3C | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1A3D | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.KeyValue):\n  +0x1A40 | C0 E1 FF FF             | SOffset32  | 0xFFFFE1C0 (-7744) Loc: 0x3880     | offset to vtable\n  +0x1A44 | 20 00 00 00             | UOffset32  | 0x00000020 (32) Loc: 0x1A64        | offset to field `key` (string)\n  +0x1A48 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1A4C         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1A4C | 10 00 00 00             | uint32_t   | 0x00000010 (16)                    | length of string\n  +0x1A50 | 64 65 66 61 75 6C 74 5F | char[16]   | default_                           | string literal\n  +0x1A58 | 70 74 72 5F 74 79 70 65 |            | ptr_type\n  +0x1A60 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1A61 | 00 00 00                | uint8_t[3] | ...                                | padding\n\nstring (reflection.KeyValue.key):\n  +0x1A64 | 0C 00 00 00             | uint32_t   | 0x0000000C (12)                    | length of string\n  +0x1A68 | 63 70 70 5F 70 74 72 5F | char[12]   | cpp_ptr_                           | string literal\n  +0x1A70 | 74 79 70 65             |            | type\n  +0x1A74 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1A75 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Type):\n  +0x1A78 | 18 EE FF FF             | SOffset32  | 0xFFFFEE18 (-4584) Loc: 0x2C60     | offset to vtable\n  +0x1A7C | 00 00                   | uint8_t[2] | ..                                 | padding\n  +0x1A7E | 0E                      | uint8_t    | 0x0E (14)                          | table field `base_type` (Byte)\n  +0x1A7F | 0A                      | uint8_t    | 0x0A (10)                          | table field `element` (Byte)\n  +0x1A80 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x1A84 | 1E 00 00 00             | uint32_t   | 0x0000001E (30)                    | length of string\n  +0x1A88 | 76 65 63 74 6F 72 5F 6F | char[30]   | vector_o                           | string literal\n  +0x1A90 | 66 5F 63 6F 5F 6F 77 6E |            | f_co_own\n  +0x1A98 | 69 6E 67 5F 72 65 66 65 |            | ing_refe\n  +0x1AA0 | 72 65 6E 63 65 73       |            | rences\n  +0x1AA6 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x1AA8 | 90 EF FF FF             | SOffset32  | 0xFFFFEF90 (-4208) Loc: 0x2B18     | offset to vtable\n  +0x1AAC | 27 00                   | uint16_t   | 0x0027 (39)                        | table field `id` (UShort)\n  +0x1AAE | 52 00                   | uint16_t   | 0x0052 (82)                        | table field `offset` (UShort)\n  +0x1AB0 | CC 00 00 00             | UOffset32  | 0x000000CC (204) Loc: 0x1B7C       | offset to field `name` (string)\n  +0x1AB4 | B8 00 00 00             | UOffset32  | 0x000000B8 (184) Loc: 0x1B6C       | offset to field `type` (table)\n  +0x1AB8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1ABC         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x1ABC | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of vector (# items)\n  +0x1AC0 | 80 00 00 00             | UOffset32  | 0x00000080 (128) Loc: 0x1B40       | offset to table[0]\n  +0x1AC4 | 50 00 00 00             | UOffset32  | 0x00000050 (80) Loc: 0x1B14        | offset to table[1]\n  +0x1AC8 | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x1AEC        | offset to table[2]\n  +0x1ACC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1AD0         | offset to table[3]\n\ntable (reflection.KeyValue):\n  +0x1AD0 | 50 E2 FF FF             | SOffset32  | 0xFFFFE250 (-7600) Loc: 0x3880     | offset to vtable\n  +0x1AD4 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x1AE4        | offset to field `key` (string)\n  +0x1AD8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1ADC         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1ADC | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1AE0 | 33 39                   | char[2]    | 39                                 | string literal\n  +0x1AE2 | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x1AE4 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1AE8 | 69 64                   | char[2]    | id                                 | string literal\n  +0x1AEA | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.KeyValue):\n  +0x1AEC | 6C E2 FF FF             | SOffset32  | 0xFFFFE26C (-7572) Loc: 0x3880     | offset to vtable\n  +0x1AF0 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x1B08        | offset to field `key` (string)\n  +0x1AF4 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1AF8         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1AF8 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | length of string\n  +0x1AFC | 66 6E 76 31 61 5F 36 34 | char[8]    | fnv1a_64                           | string literal\n  +0x1B04 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1B05 | 00 00 00                | uint8_t[3] | ...                                | padding\n\nstring (reflection.KeyValue.key):\n  +0x1B08 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of string\n  +0x1B0C | 68 61 73 68             | char[4]    | hash                               | string literal\n  +0x1B10 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1B11 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.KeyValue):\n  +0x1B14 | 94 E2 FF FF             | SOffset32  | 0xFFFFE294 (-7532) Loc: 0x3880     | offset to vtable\n  +0x1B18 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x1B30        | offset to field `key` (string)\n  +0x1B1C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1B20         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1B20 | 0B 00 00 00             | uint32_t   | 0x0000000B (11)                    | length of string\n  +0x1B24 | 52 65 66 65 72 72 61 62 | char[11]   | Referrab                           | string literal\n  +0x1B2C | 6C 65 54                |            | leT\n  +0x1B2F | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x1B30 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | length of string\n  +0x1B34 | 63 70 70 5F 74 79 70 65 | char[8]    | cpp_type                           | string literal\n  +0x1B3C | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1B3D | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.KeyValue):\n  +0x1B40 | C0 E2 FF FF             | SOffset32  | 0xFFFFE2C0 (-7488) Loc: 0x3880     | offset to vtable\n  +0x1B44 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x1B58        | offset to field `key` (string)\n  +0x1B48 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1B4C         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1B4C | 05 00 00 00             | uint32_t   | 0x00000005 (5)                     | length of string\n  +0x1B50 | 6E 61 6B 65 64          | char[5]    | naked                              | string literal\n  +0x1B55 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1B56 | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x1B58 | 0C 00 00 00             | uint32_t   | 0x0000000C (12)                    | length of string\n  +0x1B5C | 63 70 70 5F 70 74 72 5F | char[12]   | cpp_ptr_                           | string literal\n  +0x1B64 | 74 79 70 65             |            | type\n  +0x1B68 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1B69 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Type):\n  +0x1B6C | 40 E5 FF FF             | SOffset32  | 0xFFFFE540 (-6848) Loc: 0x362C     | offset to vtable\n  +0x1B70 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x1B73 | 0A                      | uint8_t    | 0x0A (10)                          | table field `base_type` (Byte)\n  +0x1B74 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | table field `base_size` (UInt)\n  +0x1B78 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x1B7C | 13 00 00 00             | uint32_t   | 0x00000013 (19)                    | length of string\n  +0x1B80 | 63 6F 5F 6F 77 6E 69 6E | char[19]   | co_ownin                           | string literal\n  +0x1B88 | 67 5F 72 65 66 65 72 65 |            | g_refere\n  +0x1B90 | 6E 63 65                |            | nce\n  +0x1B93 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x1B94 | 8C EF FF FF             | SOffset32  | 0xFFFFEF8C (-4212) Loc: 0x2C08     | offset to vtable\n  +0x1B98 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x1B9B | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x1B9C | 26 00                   | uint16_t   | 0x0026 (38)                        | table field `id` (UShort)\n  +0x1B9E | 50 00                   | uint16_t   | 0x0050 (80)                        | table field `offset` (UShort)\n  +0x1BA0 | 7C 00 00 00             | UOffset32  | 0x0000007C (124) Loc: 0x1C1C       | offset to field `name` (string)\n  +0x1BA4 | 68 00 00 00             | UOffset32  | 0x00000068 (104) Loc: 0x1C0C       | offset to field `type` (table)\n  +0x1BA8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1BAC         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x1BAC | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of vector (# items)\n  +0x1BB0 | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x1BD4        | offset to table[0]\n  +0x1BB4 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1BB8         | offset to table[1]\n\ntable (reflection.KeyValue):\n  +0x1BB8 | 38 E3 FF FF             | SOffset32  | 0xFFFFE338 (-7368) Loc: 0x3880     | offset to vtable\n  +0x1BBC | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x1BCC        | offset to field `key` (string)\n  +0x1BC0 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1BC4         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1BC4 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1BC8 | 33 38                   | char[2]    | 38                                 | string literal\n  +0x1BCA | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x1BCC | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1BD0 | 69 64                   | char[2]    | id                                 | string literal\n  +0x1BD2 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.KeyValue):\n  +0x1BD4 | 54 E3 FF FF             | SOffset32  | 0xFFFFE354 (-7340) Loc: 0x3880     | offset to vtable\n  +0x1BD8 | 20 00 00 00             | UOffset32  | 0x00000020 (32) Loc: 0x1BF8        | offset to field `key` (string)\n  +0x1BDC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1BE0         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1BE0 | 10 00 00 00             | uint32_t   | 0x00000010 (16)                    | length of string\n  +0x1BE4 | 64 65 66 61 75 6C 74 5F | char[16]   | default_                           | string literal\n  +0x1BEC | 70 74 72 5F 74 79 70 65 |            | ptr_type\n  +0x1BF4 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1BF5 | 00 00 00                | uint8_t[3] | ...                                | padding\n\nstring (reflection.KeyValue.key):\n  +0x1BF8 | 0C 00 00 00             | uint32_t   | 0x0000000C (12)                    | length of string\n  +0x1BFC | 63 70 70 5F 70 74 72 5F | char[12]   | cpp_ptr_                           | string literal\n  +0x1C04 | 74 79 70 65             |            | type\n  +0x1C08 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1C09 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Type):\n  +0x1C0C | 78 F1 FF FF             | SOffset32  | 0xFFFFF178 (-3720) Loc: 0x2A94     | offset to vtable\n  +0x1C10 | 00 00                   | uint8_t[2] | ..                                 | padding\n  +0x1C12 | 0E                      | uint8_t    | 0x0E (14)                          | table field `base_type` (Byte)\n  +0x1C13 | 0F                      | uint8_t    | 0x0F (15)                          | table field `element` (Byte)\n  +0x1C14 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | table field `index` (Int)\n  +0x1C18 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x1C1C | 1C 00 00 00             | uint32_t   | 0x0000001C (28)                    | length of string\n  +0x1C20 | 76 65 63 74 6F 72 5F 6F | char[28]   | vector_o                           | string literal\n  +0x1C28 | 66 5F 73 74 72 6F 6E 67 |            | f_strong\n  +0x1C30 | 5F 72 65 66 65 72 72 61 |            | _referra\n  +0x1C38 | 62 6C 65 73             |            | bles\n  +0x1C3C | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1C3D | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Field):\n  +0x1C40 | 38 F0 FF FF             | SOffset32  | 0xFFFFF038 (-4040) Loc: 0x2C08     | offset to vtable\n  +0x1C44 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x1C47 | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x1C48 | 25 00                   | uint16_t   | 0x0025 (37)                        | table field `id` (UShort)\n  +0x1C4A | 4E 00                   | uint16_t   | 0x004E (78)                        | table field `offset` (UShort)\n  +0x1C4C | C8 00 00 00             | UOffset32  | 0x000000C8 (200) Loc: 0x1D14       | offset to field `name` (string)\n  +0x1C50 | B8 00 00 00             | UOffset32  | 0x000000B8 (184) Loc: 0x1D08       | offset to field `type` (table)\n  +0x1C54 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1C58         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x1C58 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of vector (# items)\n  +0x1C5C | 80 00 00 00             | UOffset32  | 0x00000080 (128) Loc: 0x1CDC       | offset to table[0]\n  +0x1C60 | 50 00 00 00             | UOffset32  | 0x00000050 (80) Loc: 0x1CB0        | offset to table[1]\n  +0x1C64 | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x1C88        | offset to table[2]\n  +0x1C68 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1C6C         | offset to table[3]\n\ntable (reflection.KeyValue):\n  +0x1C6C | EC E3 FF FF             | SOffset32  | 0xFFFFE3EC (-7188) Loc: 0x3880     | offset to vtable\n  +0x1C70 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x1C80        | offset to field `key` (string)\n  +0x1C74 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1C78         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1C78 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1C7C | 33 37                   | char[2]    | 37                                 | string literal\n  +0x1C7E | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x1C80 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1C84 | 69 64                   | char[2]    | id                                 | string literal\n  +0x1C86 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.KeyValue):\n  +0x1C88 | 08 E4 FF FF             | SOffset32  | 0xFFFFE408 (-7160) Loc: 0x3880     | offset to vtable\n  +0x1C8C | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x1CA4        | offset to field `key` (string)\n  +0x1C90 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1C94         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1C94 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | length of string\n  +0x1C98 | 66 6E 76 31 61 5F 36 34 | char[8]    | fnv1a_64                           | string literal\n  +0x1CA0 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1CA1 | 00 00 00                | uint8_t[3] | ...                                | padding\n\nstring (reflection.KeyValue.key):\n  +0x1CA4 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of string\n  +0x1CA8 | 68 61 73 68             | char[4]    | hash                               | string literal\n  +0x1CAC | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1CAD | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.KeyValue):\n  +0x1CB0 | 30 E4 FF FF             | SOffset32  | 0xFFFFE430 (-7120) Loc: 0x3880     | offset to vtable\n  +0x1CB4 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x1CCC        | offset to field `key` (string)\n  +0x1CB8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1CBC         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1CBC | 0B 00 00 00             | uint32_t   | 0x0000000B (11)                    | length of string\n  +0x1CC0 | 52 65 66 65 72 72 61 62 | char[11]   | Referrab                           | string literal\n  +0x1CC8 | 6C 65 54                |            | leT\n  +0x1CCB | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x1CCC | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | length of string\n  +0x1CD0 | 63 70 70 5F 74 79 70 65 | char[8]    | cpp_type                           | string literal\n  +0x1CD8 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1CD9 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.KeyValue):\n  +0x1CDC | 5C E4 FF FF             | SOffset32  | 0xFFFFE45C (-7076) Loc: 0x3880     | offset to vtable\n  +0x1CE0 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x1CF4        | offset to field `key` (string)\n  +0x1CE4 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1CE8         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1CE8 | 05 00 00 00             | uint32_t   | 0x00000005 (5)                     | length of string\n  +0x1CEC | 6E 61 6B 65 64          | char[5]    | naked                              | string literal\n  +0x1CF1 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1CF2 | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x1CF4 | 0C 00 00 00             | uint32_t   | 0x0000000C (12)                    | length of string\n  +0x1CF8 | 63 70 70 5F 70 74 72 5F | char[12]   | cpp_ptr_                           | string literal\n  +0x1D00 | 74 79 70 65             |            | type\n  +0x1D04 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1D05 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Type):\n  +0x1D08 | A8 F0 FF FF             | SOffset32  | 0xFFFFF0A8 (-3928) Loc: 0x2C60     | offset to vtable\n  +0x1D0C | 00 00                   | uint8_t[2] | ..                                 | padding\n  +0x1D0E | 0E                      | uint8_t    | 0x0E (14)                          | table field `base_type` (Byte)\n  +0x1D0F | 0A                      | uint8_t    | 0x0A (10)                          | table field `element` (Byte)\n  +0x1D10 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x1D14 | 19 00 00 00             | uint32_t   | 0x00000019 (25)                    | length of string\n  +0x1D18 | 76 65 63 74 6F 72 5F 6F | char[25]   | vector_o                           | string literal\n  +0x1D20 | 66 5F 77 65 61 6B 5F 72 |            | f_weak_r\n  +0x1D28 | 65 66 65 72 65 6E 63 65 |            | eference\n  +0x1D30 | 73                      |            | s\n  +0x1D31 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1D32 | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Field):\n  +0x1D34 | 1C F2 FF FF             | SOffset32  | 0xFFFFF21C (-3556) Loc: 0x2B18     | offset to vtable\n  +0x1D38 | 24 00                   | uint16_t   | 0x0024 (36)                        | table field `id` (UShort)\n  +0x1D3A | 4C 00                   | uint16_t   | 0x004C (76)                        | table field `offset` (UShort)\n  +0x1D3C | CC 00 00 00             | UOffset32  | 0x000000CC (204) Loc: 0x1E08       | offset to field `name` (string)\n  +0x1D40 | B8 00 00 00             | UOffset32  | 0x000000B8 (184) Loc: 0x1DF8       | offset to field `type` (table)\n  +0x1D44 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1D48         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x1D48 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of vector (# items)\n  +0x1D4C | 80 00 00 00             | UOffset32  | 0x00000080 (128) Loc: 0x1DCC       | offset to table[0]\n  +0x1D50 | 50 00 00 00             | UOffset32  | 0x00000050 (80) Loc: 0x1DA0        | offset to table[1]\n  +0x1D54 | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x1D78        | offset to table[2]\n  +0x1D58 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1D5C         | offset to table[3]\n\ntable (reflection.KeyValue):\n  +0x1D5C | DC E4 FF FF             | SOffset32  | 0xFFFFE4DC (-6948) Loc: 0x3880     | offset to vtable\n  +0x1D60 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x1D70        | offset to field `key` (string)\n  +0x1D64 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1D68         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1D68 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1D6C | 33 36                   | char[2]    | 36                                 | string literal\n  +0x1D6E | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x1D70 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1D74 | 69 64                   | char[2]    | id                                 | string literal\n  +0x1D76 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.KeyValue):\n  +0x1D78 | F8 E4 FF FF             | SOffset32  | 0xFFFFE4F8 (-6920) Loc: 0x3880     | offset to vtable\n  +0x1D7C | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x1D94        | offset to field `key` (string)\n  +0x1D80 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1D84         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1D84 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | length of string\n  +0x1D88 | 66 6E 76 31 61 5F 36 34 | char[8]    | fnv1a_64                           | string literal\n  +0x1D90 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1D91 | 00 00 00                | uint8_t[3] | ...                                | padding\n\nstring (reflection.KeyValue.key):\n  +0x1D94 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of string\n  +0x1D98 | 68 61 73 68             | char[4]    | hash                               | string literal\n  +0x1D9C | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1D9D | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.KeyValue):\n  +0x1DA0 | 20 E5 FF FF             | SOffset32  | 0xFFFFE520 (-6880) Loc: 0x3880     | offset to vtable\n  +0x1DA4 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x1DBC        | offset to field `key` (string)\n  +0x1DA8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1DAC         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1DAC | 0B 00 00 00             | uint32_t   | 0x0000000B (11)                    | length of string\n  +0x1DB0 | 52 65 66 65 72 72 61 62 | char[11]   | Referrab                           | string literal\n  +0x1DB8 | 6C 65 54                |            | leT\n  +0x1DBB | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x1DBC | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | length of string\n  +0x1DC0 | 63 70 70 5F 74 79 70 65 | char[8]    | cpp_type                           | string literal\n  +0x1DC8 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1DC9 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.KeyValue):\n  +0x1DCC | 4C E5 FF FF             | SOffset32  | 0xFFFFE54C (-6836) Loc: 0x3880     | offset to vtable\n  +0x1DD0 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x1DE4        | offset to field `key` (string)\n  +0x1DD4 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1DD8         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1DD8 | 05 00 00 00             | uint32_t   | 0x00000005 (5)                     | length of string\n  +0x1DDC | 6E 61 6B 65 64          | char[5]    | naked                              | string literal\n  +0x1DE1 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1DE2 | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x1DE4 | 0C 00 00 00             | uint32_t   | 0x0000000C (12)                    | length of string\n  +0x1DE8 | 63 70 70 5F 70 74 72 5F | char[12]   | cpp_ptr_                           | string literal\n  +0x1DF0 | 74 79 70 65             |            | type\n  +0x1DF4 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1DF5 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Type):\n  +0x1DF8 | CC E7 FF FF             | SOffset32  | 0xFFFFE7CC (-6196) Loc: 0x362C     | offset to vtable\n  +0x1DFC | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x1DFF | 0A                      | uint8_t    | 0x0A (10)                          | table field `base_type` (Byte)\n  +0x1E00 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | table field `base_size` (UInt)\n  +0x1E04 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x1E08 | 15 00 00 00             | uint32_t   | 0x00000015 (21)                    | length of string\n  +0x1E0C | 73 69 6E 67 6C 65 5F 77 | char[21]   | single_w                           | string literal\n  +0x1E14 | 65 61 6B 5F 72 65 66 65 |            | eak_refe\n  +0x1E1C | 72 65 6E 63 65          |            | rence\n  +0x1E21 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1E22 | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Field):\n  +0x1E24 | 1C F2 FF FF             | SOffset32  | 0xFFFFF21C (-3556) Loc: 0x2C08     | offset to vtable\n  +0x1E28 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x1E2B | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x1E2C | 23 00                   | uint16_t   | 0x0023 (35)                        | table field `id` (UShort)\n  +0x1E2E | 4A 00                   | uint16_t   | 0x004A (74)                        | table field `offset` (UShort)\n  +0x1E30 | 40 00 00 00             | UOffset32  | 0x00000040 (64) Loc: 0x1E70        | offset to field `name` (string)\n  +0x1E34 | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x1E60        | offset to field `type` (table)\n  +0x1E38 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1E3C         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x1E3C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x1E40 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1E44         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x1E44 | C4 E5 FF FF             | SOffset32  | 0xFFFFE5C4 (-6716) Loc: 0x3880     | offset to vtable\n  +0x1E48 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x1E58        | offset to field `key` (string)\n  +0x1E4C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1E50         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1E50 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1E54 | 33 35                   | char[2]    | 35                                 | string literal\n  +0x1E56 | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x1E58 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1E5C | 69 64                   | char[2]    | id                                 | string literal\n  +0x1E5E | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x1E60 | CC F3 FF FF             | SOffset32  | 0xFFFFF3CC (-3124) Loc: 0x2A94     | offset to vtable\n  +0x1E64 | 00 00                   | uint8_t[2] | ..                                 | padding\n  +0x1E66 | 0E                      | uint8_t    | 0x0E (14)                          | table field `base_type` (Byte)\n  +0x1E67 | 0F                      | uint8_t    | 0x0F (15)                          | table field `element` (Byte)\n  +0x1E68 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | table field `index` (Int)\n  +0x1E6C | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x1E70 | 15 00 00 00             | uint32_t   | 0x00000015 (21)                    | length of string\n  +0x1E74 | 76 65 63 74 6F 72 5F 6F | char[21]   | vector_o                           | string literal\n  +0x1E7C | 66 5F 72 65 66 65 72 72 |            | f_referr\n  +0x1E84 | 61 62 6C 65 73          |            | ables\n  +0x1E89 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1E8A | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Field):\n  +0x1E8C | 84 F2 FF FF             | SOffset32  | 0xFFFFF284 (-3452) Loc: 0x2C08     | offset to vtable\n  +0x1E90 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x1E93 | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x1E94 | 22 00                   | uint16_t   | 0x0022 (34)                        | table field `id` (UShort)\n  +0x1E96 | 48 00                   | uint16_t   | 0x0048 (72)                        | table field `offset` (UShort)\n  +0x1E98 | 40 00 00 00             | UOffset32  | 0x00000040 (64) Loc: 0x1ED8        | offset to field `name` (string)\n  +0x1E9C | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x1EC8        | offset to field `type` (table)\n  +0x1EA0 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1EA4         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x1EA4 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x1EA8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1EAC         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x1EAC | 2C E6 FF FF             | SOffset32  | 0xFFFFE62C (-6612) Loc: 0x3880     | offset to vtable\n  +0x1EB0 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x1EC0        | offset to field `key` (string)\n  +0x1EB4 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1EB8         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1EB8 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1EBC | 33 34                   | char[2]    | 34                                 | string literal\n  +0x1EBE | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x1EC0 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1EC4 | 69 64                   | char[2]    | id                                 | string literal\n  +0x1EC6 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x1EC8 | F8 E6 FF FF             | SOffset32  | 0xFFFFE6F8 (-6408) Loc: 0x37D0     | offset to vtable\n  +0x1ECC | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x1ECF | 0F                      | uint8_t    | 0x0F (15)                          | table field `base_type` (Byte)\n  +0x1ED0 | 0B 00 00 00             | uint32_t   | 0x0000000B (11)                    | table field `index` (Int)\n  +0x1ED4 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x1ED8 | 15 00 00 00             | uint32_t   | 0x00000015 (21)                    | length of string\n  +0x1EDC | 70 61 72 65 6E 74 5F 6E | char[21]   | parent_n                           | string literal\n  +0x1EE4 | 61 6D 65 73 70 61 63 65 |            | amespace\n  +0x1EEC | 5F 74 65 73 74          |            | _test\n  +0x1EF1 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1EF2 | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Field):\n  +0x1EF4 | EC F2 FF FF             | SOffset32  | 0xFFFFF2EC (-3348) Loc: 0x2C08     | offset to vtable\n  +0x1EF8 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x1EFB | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x1EFC | 21 00                   | uint16_t   | 0x0021 (33)                        | table field `id` (UShort)\n  +0x1EFE | 46 00                   | uint16_t   | 0x0046 (70)                        | table field `offset` (UShort)\n  +0x1F00 | 3C 00 00 00             | UOffset32  | 0x0000003C (60) Loc: 0x1F3C        | offset to field `name` (string)\n  +0x1F04 | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x1F30        | offset to field `type` (table)\n  +0x1F08 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1F0C         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x1F0C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x1F10 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1F14         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x1F14 | 94 E6 FF FF             | SOffset32  | 0xFFFFE694 (-6508) Loc: 0x3880     | offset to vtable\n  +0x1F18 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x1F28        | offset to field `key` (string)\n  +0x1F1C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1F20         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1F20 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1F24 | 33 33                   | char[2]    | 33                                 | string literal\n  +0x1F26 | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x1F28 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1F2C | 69 64                   | char[2]    | id                                 | string literal\n  +0x1F2E | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x1F30 | D0 F2 FF FF             | SOffset32  | 0xFFFFF2D0 (-3376) Loc: 0x2C60     | offset to vtable\n  +0x1F34 | 00 00                   | uint8_t[2] | ..                                 | padding\n  +0x1F36 | 0E                      | uint8_t    | 0x0E (14)                          | table field `base_type` (Byte)\n  +0x1F37 | 0C                      | uint8_t    | 0x0C (12)                          | table field `element` (Byte)\n  +0x1F38 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x1F3C | 11 00 00 00             | uint32_t   | 0x00000011 (17)                    | length of string\n  +0x1F40 | 76 65 63 74 6F 72 5F 6F | char[17]   | vector_o                           | string literal\n  +0x1F48 | 66 5F 64 6F 75 62 6C 65 |            | f_double\n  +0x1F50 | 73                      |            | s\n  +0x1F51 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x1F52 | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Field):\n  +0x1F54 | 4C F3 FF FF             | SOffset32  | 0xFFFFF34C (-3252) Loc: 0x2C08     | offset to vtable\n  +0x1F58 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x1F5B | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x1F5C | 20 00                   | uint16_t   | 0x0020 (32)                        | table field `id` (UShort)\n  +0x1F5E | 44 00                   | uint16_t   | 0x0044 (68)                        | table field `offset` (UShort)\n  +0x1F60 | 3C 00 00 00             | UOffset32  | 0x0000003C (60) Loc: 0x1F9C        | offset to field `name` (string)\n  +0x1F64 | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x1F90        | offset to field `type` (table)\n  +0x1F68 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1F6C         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x1F6C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x1F70 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1F74         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x1F74 | F4 E6 FF FF             | SOffset32  | 0xFFFFE6F4 (-6412) Loc: 0x3880     | offset to vtable\n  +0x1F78 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x1F88        | offset to field `key` (string)\n  +0x1F7C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1F80         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1F80 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1F84 | 33 32                   | char[2]    | 32                                 | string literal\n  +0x1F86 | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x1F88 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1F8C | 69 64                   | char[2]    | id                                 | string literal\n  +0x1F8E | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x1F90 | 30 F3 FF FF             | SOffset32  | 0xFFFFF330 (-3280) Loc: 0x2C60     | offset to vtable\n  +0x1F94 | 00 00                   | uint8_t[2] | ..                                 | padding\n  +0x1F96 | 0E                      | uint8_t    | 0x0E (14)                          | table field `base_type` (Byte)\n  +0x1F97 | 09                      | uint8_t    | 0x09 (9)                           | table field `element` (Byte)\n  +0x1F98 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x1F9C | 0F 00 00 00             | uint32_t   | 0x0000000F (15)                    | length of string\n  +0x1FA0 | 76 65 63 74 6F 72 5F 6F | char[15]   | vector_o                           | string literal\n  +0x1FA8 | 66 5F 6C 6F 6E 67 73    |            | f_longs\n  +0x1FAF | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x1FB0 | A8 F3 FF FF             | SOffset32  | 0xFFFFF3A8 (-3160) Loc: 0x2C08     | offset to vtable\n  +0x1FB4 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x1FB7 | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x1FB8 | 1F 00                   | uint16_t   | 0x001F (31)                        | table field `id` (UShort)\n  +0x1FBA | 42 00                   | uint16_t   | 0x0042 (66)                        | table field `offset` (UShort)\n  +0x1FBC | 40 00 00 00             | UOffset32  | 0x00000040 (64) Loc: 0x1FFC        | offset to field `name` (string)\n  +0x1FC0 | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x1FEC        | offset to field `type` (table)\n  +0x1FC4 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1FC8         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x1FC8 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x1FCC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1FD0         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x1FD0 | 50 E7 FF FF             | SOffset32  | 0xFFFFE750 (-6320) Loc: 0x3880     | offset to vtable\n  +0x1FD4 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x1FE4        | offset to field `key` (string)\n  +0x1FD8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x1FDC         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x1FDC | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1FE0 | 33 31                   | char[2]    | 31                                 | string literal\n  +0x1FE2 | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x1FE4 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x1FE8 | 69 64                   | char[2]    | id                                 | string literal\n  +0x1FEA | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x1FEC | 58 F5 FF FF             | SOffset32  | 0xFFFFF558 (-2728) Loc: 0x2A94     | offset to vtable\n  +0x1FF0 | 00 00                   | uint8_t[2] | ..                                 | padding\n  +0x1FF2 | 0E                      | uint8_t    | 0x0E (14)                          | table field `base_type` (Byte)\n  +0x1FF3 | 0F                      | uint8_t    | 0x0F (15)                          | table field `element` (Byte)\n  +0x1FF4 | 06 00 00 00             | uint32_t   | 0x00000006 (6)                     | table field `index` (Int)\n  +0x1FF8 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x1FFC | 05 00 00 00             | uint32_t   | 0x00000005 (5)                     | length of string\n  +0x2000 | 74 65 73 74 35          | char[5]    | test5                              | string literal\n  +0x2005 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2006 | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Field):\n  +0x2008 | 00 F4 FF FF             | SOffset32  | 0xFFFFF400 (-3072) Loc: 0x2C08     | offset to vtable\n  +0x200C | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x200F | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x2010 | 1E 00                   | uint16_t   | 0x001E (30)                        | table field `id` (UShort)\n  +0x2012 | 40 00                   | uint16_t   | 0x0040 (64)                        | table field `offset` (UShort)\n  +0x2014 | 64 00 00 00             | UOffset32  | 0x00000064 (100) Loc: 0x2078       | offset to field `name` (string)\n  +0x2018 | 54 00 00 00             | UOffset32  | 0x00000054 (84) Loc: 0x206C        | offset to field `type` (table)\n  +0x201C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2020         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x2020 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of vector (# items)\n  +0x2024 | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x2048        | offset to table[0]\n  +0x2028 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x202C         | offset to table[1]\n\ntable (reflection.KeyValue):\n  +0x202C | AC E7 FF FF             | SOffset32  | 0xFFFFE7AC (-6228) Loc: 0x3880     | offset to vtable\n  +0x2030 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x2040        | offset to field `key` (string)\n  +0x2034 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2038         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2038 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x203C | 33 30                   | char[2]    | 30                                 | string literal\n  +0x203E | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x2040 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2044 | 69 64                   | char[2]    | id                                 | string literal\n  +0x2046 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.KeyValue):\n  +0x2048 | C8 E7 FF FF             | SOffset32  | 0xFFFFE7C8 (-6200) Loc: 0x3880     | offset to vtable\n  +0x204C | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x205C        | offset to field `key` (string)\n  +0x2050 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2054         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2054 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x2058 | 30                      | char[1]    | 0                                  | string literal\n  +0x2059 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x205A | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x205C | 0A 00 00 00             | uint32_t   | 0x0000000A (10)                    | length of string\n  +0x2060 | 66 6C 65 78 62 75 66 66 | char[10]   | flexbuff                           | string literal\n  +0x2068 | 65 72                   |            | er\n  +0x206A | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x206C | 0C F4 FF FF             | SOffset32  | 0xFFFFF40C (-3060) Loc: 0x2C60     | offset to vtable\n  +0x2070 | 00 00                   | uint8_t[2] | ..                                 | padding\n  +0x2072 | 0E                      | uint8_t    | 0x0E (14)                          | table field `base_type` (Byte)\n  +0x2073 | 04                      | uint8_t    | 0x04 (4)                           | table field `element` (Byte)\n  +0x2074 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x2078 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of string\n  +0x207C | 66 6C 65 78             | char[4]    | flex                               | string literal\n  +0x2080 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2081 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Field):\n  +0x2084 | 7C F4 FF FF             | SOffset32  | 0xFFFFF47C (-2948) Loc: 0x2C08     | offset to vtable\n  +0x2088 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x208B | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x208C | 1D 00                   | uint16_t   | 0x001D (29)                        | table field `id` (UShort)\n  +0x208E | 3E 00                   | uint16_t   | 0x003E (62)                        | table field `offset` (UShort)\n  +0x2090 | 40 00 00 00             | UOffset32  | 0x00000040 (64) Loc: 0x20D0        | offset to field `name` (string)\n  +0x2094 | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x20C0        | offset to field `type` (table)\n  +0x2098 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x209C         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x209C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x20A0 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x20A4         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x20A4 | 24 E8 FF FF             | SOffset32  | 0xFFFFE824 (-6108) Loc: 0x3880     | offset to vtable\n  +0x20A8 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x20B8        | offset to field `key` (string)\n  +0x20AC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x20B0         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x20B0 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x20B4 | 32 39                   | char[2]    | 29                                 | string literal\n  +0x20B6 | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x20B8 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x20BC | 69 64                   | char[2]    | id                                 | string literal\n  +0x20BE | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x20C0 | 2C F6 FF FF             | SOffset32  | 0xFFFFF62C (-2516) Loc: 0x2A94     | offset to vtable\n  +0x20C4 | 00 00                   | uint8_t[2] | ..                                 | padding\n  +0x20C6 | 0E                      | uint8_t    | 0x0E (14)                          | table field `base_type` (Byte)\n  +0x20C7 | 0F                      | uint8_t    | 0x0F (15)                          | table field `element` (Byte)\n  +0x20C8 | 00 00 00 00             | uint32_t   | 0x00000000 (0)                     | table field `index` (Int)\n  +0x20CC | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x20D0 | 17 00 00 00             | uint32_t   | 0x00000017 (23)                    | length of string\n  +0x20D4 | 74 65 73 74 61 72 72 61 | char[23]   | testarra                           | string literal\n  +0x20DC | 79 6F 66 73 6F 72 74 65 |            | yofsorte\n  +0x20E4 | 64 73 74 72 75 63 74    |            | dstruct\n  +0x20EB | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x20EC | E4 F4 FF FF             | SOffset32  | 0xFFFFF4E4 (-2844) Loc: 0x2C08     | offset to vtable\n  +0x20F0 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x20F3 | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x20F4 | 1C 00                   | uint16_t   | 0x001C (28)                        | table field `id` (UShort)\n  +0x20F6 | 3C 00                   | uint16_t   | 0x003C (60)                        | table field `offset` (UShort)\n  +0x20F8 | 3C 00 00 00             | UOffset32  | 0x0000003C (60) Loc: 0x2134        | offset to field `name` (string)\n  +0x20FC | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x2128        | offset to field `type` (table)\n  +0x2100 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2104         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x2104 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x2108 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x210C         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x210C | 8C E8 FF FF             | SOffset32  | 0xFFFFE88C (-6004) Loc: 0x3880     | offset to vtable\n  +0x2110 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x2120        | offset to field `key` (string)\n  +0x2114 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2118         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2118 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x211C | 32 38                   | char[2]    | 28                                 | string literal\n  +0x211E | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x2120 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2124 | 69 64                   | char[2]    | id                                 | string literal\n  +0x2126 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x2128 | C8 F4 FF FF             | SOffset32  | 0xFFFFF4C8 (-2872) Loc: 0x2C60     | offset to vtable\n  +0x212C | 00 00                   | uint8_t[2] | ..                                 | padding\n  +0x212E | 0E                      | uint8_t    | 0x0E (14)                          | table field `base_type` (Byte)\n  +0x212F | 0D                      | uint8_t    | 0x0D (13)                          | table field `element` (Byte)\n  +0x2130 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x2134 | 12 00 00 00             | uint32_t   | 0x00000012 (18)                    | length of string\n  +0x2138 | 74 65 73 74 61 72 72 61 | char[18]   | testarra                           | string literal\n  +0x2140 | 79 6F 66 73 74 72 69 6E |            | yofstrin\n  +0x2148 | 67 32                   |            | g2\n  +0x214A | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x214C | 34 F6 FF FF             | SOffset32  | 0xFFFFF634 (-2508) Loc: 0x2B18     | offset to vtable\n  +0x2150 | 1B 00                   | uint16_t   | 0x001B (27)                        | table field `id` (UShort)\n  +0x2152 | 3A 00                   | uint16_t   | 0x003A (58)                        | table field `offset` (UShort)\n  +0x2154 | 3C 00 00 00             | UOffset32  | 0x0000003C (60) Loc: 0x2190        | offset to field `name` (string)\n  +0x2158 | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x2184        | offset to field `type` (table)\n  +0x215C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2160         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x2160 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x2164 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2168         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x2168 | E8 E8 FF FF             | SOffset32  | 0xFFFFE8E8 (-5912) Loc: 0x3880     | offset to vtable\n  +0x216C | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x217C        | offset to field `key` (string)\n  +0x2170 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2174         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2174 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2178 | 32 37                   | char[2]    | 27                                 | string literal\n  +0x217A | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x217C | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2180 | 69 64                   | char[2]    | id                                 | string literal\n  +0x2182 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x2184 | F0 E8 FF FF             | SOffset32  | 0xFFFFE8F0 (-5904) Loc: 0x3894     | offset to vtable\n  +0x2188 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x218B | 0B                      | uint8_t    | 0x0B (11)                          | table field `base_type` (Byte)\n  +0x218C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x2190 | 06 00 00 00             | uint32_t   | 0x00000006 (6)                     | length of string\n  +0x2194 | 74 65 73 74 66 33       | char[6]    | testf3                             | string literal\n  +0x219A | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x219C | A8 FF FF FF             | SOffset32  | 0xFFFFFFA8 (-88) Loc: 0x21F4       | offset to vtable\n  +0x21A0 | 1A 00                   | uint16_t   | 0x001A (26)                        | table field `id` (UShort)\n  +0x21A2 | 38 00                   | uint16_t   | 0x0038 (56)                        | table field `offset` (UShort)\n  +0x21A4 | 44 00 00 00             | UOffset32  | 0x00000044 (68) Loc: 0x21E8        | offset to field `name` (string)\n  +0x21A8 | 34 00 00 00             | UOffset32  | 0x00000034 (52) Loc: 0x21DC        | offset to field `type` (table)\n  +0x21AC | 0C 00 00 00             | UOffset32  | 0x0000000C (12) Loc: 0x21B8        | offset to field `attributes` (vector)\n  +0x21B0 | 00 00 00 00 00 00 08 40 | double     | 0x4008000000000000 (3)             | table field `default_real` (Double)\n\nvector (reflection.Field.attributes):\n  +0x21B8 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x21BC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x21C0         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x21C0 | 40 E9 FF FF             | SOffset32  | 0xFFFFE940 (-5824) Loc: 0x3880     | offset to vtable\n  +0x21C4 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x21D4        | offset to field `key` (string)\n  +0x21C8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x21CC         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x21CC | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x21D0 | 32 36                   | char[2]    | 26                                 | string literal\n  +0x21D2 | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x21D4 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x21D8 | 69 64                   | char[2]    | id                                 | string literal\n  +0x21DA | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x21DC | 48 E9 FF FF             | SOffset32  | 0xFFFFE948 (-5816) Loc: 0x3894     | offset to vtable\n  +0x21E0 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x21E3 | 0B                      | uint8_t    | 0x0B (11)                          | table field `base_type` (Byte)\n  +0x21E4 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x21E8 | 06 00 00 00             | uint32_t   | 0x00000006 (6)                     | length of string\n  +0x21EC | 74 65 73 74 66 32       | char[6]    | testf2                             | string literal\n  +0x21F2 | 00                      | char       | 0x00 (0)                           | string terminator\n\nvtable (reflection.Field):\n  +0x21F4 | 18 00                   | uint16_t   | 0x0018 (24)                        | size of this vtable\n  +0x21F6 | 1C 00                   | uint16_t   | 0x001C (28)                        | size of referring table\n  +0x21F8 | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `name` (id: 0)\n  +0x21FA | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `type` (id: 1)\n  +0x21FC | 04 00                   | VOffset16  | 0x0004 (4)                         | offset to field `id` (id: 2)\n  +0x21FE | 06 00                   | VOffset16  | 0x0006 (6)                         | offset to field `offset` (id: 3)\n  +0x2200 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `default_integer` (id: 4) <defaults to 0> (Long)\n  +0x2202 | 14 00                   | VOffset16  | 0x0014 (20)                        | offset to field `default_real` (id: 5)\n  +0x2204 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `deprecated` (id: 6) <defaults to 0> (Bool)\n  +0x2206 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `required` (id: 7) <defaults to 0> (Bool)\n  +0x2208 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `key` (id: 8) <defaults to 0> (Bool)\n  +0x220A | 10 00                   | VOffset16  | 0x0010 (16)                        | offset to field `attributes` (id: 9)\n\ntable (reflection.Field):\n  +0x220C | 18 00 00 00             | SOffset32  | 0x00000018 (24) Loc: 0x21F4        | offset to vtable\n  +0x2210 | 19 00                   | uint16_t   | 0x0019 (25)                        | table field `id` (UShort)\n  +0x2212 | 36 00                   | uint16_t   | 0x0036 (54)                        | table field `offset` (UShort)\n  +0x2214 | 44 00 00 00             | UOffset32  | 0x00000044 (68) Loc: 0x2258        | offset to field `name` (string)\n  +0x2218 | 34 00 00 00             | UOffset32  | 0x00000034 (52) Loc: 0x224C        | offset to field `type` (table)\n  +0x221C | 0C 00 00 00             | UOffset32  | 0x0000000C (12) Loc: 0x2228        | offset to field `attributes` (vector)\n  +0x2220 | 6E 86 1B F0 F9 21 09 40 | double     | 0x400921F9F01B866E (3.14159)       | table field `default_real` (Double)\n\nvector (reflection.Field.attributes):\n  +0x2228 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x222C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2230         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x2230 | B0 E9 FF FF             | SOffset32  | 0xFFFFE9B0 (-5712) Loc: 0x3880     | offset to vtable\n  +0x2234 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x2244        | offset to field `key` (string)\n  +0x2238 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x223C         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x223C | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2240 | 32 35                   | char[2]    | 25                                 | string literal\n  +0x2242 | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x2244 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2248 | 69 64                   | char[2]    | id                                 | string literal\n  +0x224A | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x224C | B8 E9 FF FF             | SOffset32  | 0xFFFFE9B8 (-5704) Loc: 0x3894     | offset to vtable\n  +0x2250 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x2253 | 0B                      | uint8_t    | 0x0B (11)                          | table field `base_type` (Byte)\n  +0x2254 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x2258 | 05 00 00 00             | uint32_t   | 0x00000005 (5)                     | length of string\n  +0x225C | 74 65 73 74 66          | char[5]    | testf                              | string literal\n  +0x2261 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2262 | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Field):\n  +0x2264 | 5C F6 FF FF             | SOffset32  | 0xFFFFF65C (-2468) Loc: 0x2C08     | offset to vtable\n  +0x2268 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x226B | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x226C | 18 00                   | uint16_t   | 0x0018 (24)                        | table field `id` (UShort)\n  +0x226E | 34 00                   | uint16_t   | 0x0034 (52)                        | table field `offset` (UShort)\n  +0x2270 | 3C 00 00 00             | UOffset32  | 0x0000003C (60) Loc: 0x22AC        | offset to field `name` (string)\n  +0x2274 | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x22A0        | offset to field `type` (table)\n  +0x2278 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x227C         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x227C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x2280 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2284         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x2284 | 04 EA FF FF             | SOffset32  | 0xFFFFEA04 (-5628) Loc: 0x3880     | offset to vtable\n  +0x2288 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x2298        | offset to field `key` (string)\n  +0x228C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2290         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2290 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2294 | 32 34                   | char[2]    | 24                                 | string literal\n  +0x2296 | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x2298 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x229C | 69 64                   | char[2]    | id                                 | string literal\n  +0x229E | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x22A0 | 40 F6 FF FF             | SOffset32  | 0xFFFFF640 (-2496) Loc: 0x2C60     | offset to vtable\n  +0x22A4 | 00 00                   | uint8_t[2] | ..                                 | padding\n  +0x22A6 | 0E                      | uint8_t    | 0x0E (14)                          | table field `base_type` (Byte)\n  +0x22A7 | 02                      | uint8_t    | 0x02 (2)                           | table field `element` (Byte)\n  +0x22A8 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x22AC | 10 00 00 00             | uint32_t   | 0x00000010 (16)                    | length of string\n  +0x22B0 | 74 65 73 74 61 72 72 61 | char[16]   | testarra                           | string literal\n  +0x22B8 | 79 6F 66 62 6F 6F 6C 73 |            | yofbools\n  +0x22C0 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x22C1 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Field):\n  +0x22C4 | AC F7 FF FF             | SOffset32  | 0xFFFFF7AC (-2132) Loc: 0x2B18     | offset to vtable\n  +0x22C8 | 17 00                   | uint16_t   | 0x0017 (23)                        | table field `id` (UShort)\n  +0x22CA | 32 00                   | uint16_t   | 0x0032 (50)                        | table field `offset` (UShort)\n  +0x22CC | 6C 00 00 00             | UOffset32  | 0x0000006C (108) Loc: 0x2338       | offset to field `name` (string)\n  +0x22D0 | 58 00 00 00             | UOffset32  | 0x00000058 (88) Loc: 0x2328        | offset to field `type` (table)\n  +0x22D4 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x22D8         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x22D8 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of vector (# items)\n  +0x22DC | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x2300        | offset to table[0]\n  +0x22E0 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x22E4         | offset to table[1]\n\ntable (reflection.KeyValue):\n  +0x22E4 | 64 EA FF FF             | SOffset32  | 0xFFFFEA64 (-5532) Loc: 0x3880     | offset to vtable\n  +0x22E8 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x22F8        | offset to field `key` (string)\n  +0x22EC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x22F0         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x22F0 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x22F4 | 32 33                   | char[2]    | 23                                 | string literal\n  +0x22F6 | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x22F8 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x22FC | 69 64                   | char[2]    | id                                 | string literal\n  +0x22FE | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.KeyValue):\n  +0x2300 | 80 EA FF FF             | SOffset32  | 0xFFFFEA80 (-5504) Loc: 0x3880     | offset to vtable\n  +0x2304 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x231C        | offset to field `key` (string)\n  +0x2308 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x230C         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x230C | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | length of string\n  +0x2310 | 66 6E 76 31 61 5F 36 34 | char[8]    | fnv1a_64                           | string literal\n  +0x2318 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2319 | 00 00 00                | uint8_t[3] | ...                                | padding\n\nstring (reflection.KeyValue.key):\n  +0x231C | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of string\n  +0x2320 | 68 61 73 68             | char[4]    | hash                               | string literal\n  +0x2324 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2325 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Type):\n  +0x2328 | FC EC FF FF             | SOffset32  | 0xFFFFECFC (-4868) Loc: 0x362C     | offset to vtable\n  +0x232C | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x232F | 0A                      | uint8_t    | 0x0A (10)                          | table field `base_type` (Byte)\n  +0x2330 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | table field `base_size` (UInt)\n  +0x2334 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x2338 | 11 00 00 00             | uint32_t   | 0x00000011 (17)                    | length of string\n  +0x233C | 74 65 73 74 68 61 73 68 | char[17]   | testhash                           | string literal\n  +0x2344 | 75 36 34 5F 66 6E 76 31 |            | u64_fnv1\n  +0x234C | 61                      |            | a\n  +0x234D | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x234E | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Field):\n  +0x2350 | 38 F8 FF FF             | SOffset32  | 0xFFFFF838 (-1992) Loc: 0x2B18     | offset to vtable\n  +0x2354 | 16 00                   | uint16_t   | 0x0016 (22)                        | table field `id` (UShort)\n  +0x2356 | 30 00                   | uint16_t   | 0x0030 (48)                        | table field `offset` (UShort)\n  +0x2358 | 6C 00 00 00             | UOffset32  | 0x0000006C (108) Loc: 0x23C4       | offset to field `name` (string)\n  +0x235C | 58 00 00 00             | UOffset32  | 0x00000058 (88) Loc: 0x23B4        | offset to field `type` (table)\n  +0x2360 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2364         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x2364 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of vector (# items)\n  +0x2368 | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x238C        | offset to table[0]\n  +0x236C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2370         | offset to table[1]\n\ntable (reflection.KeyValue):\n  +0x2370 | F0 EA FF FF             | SOffset32  | 0xFFFFEAF0 (-5392) Loc: 0x3880     | offset to vtable\n  +0x2374 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x2384        | offset to field `key` (string)\n  +0x2378 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x237C         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x237C | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2380 | 32 32                   | char[2]    | 22                                 | string literal\n  +0x2382 | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x2384 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2388 | 69 64                   | char[2]    | id                                 | string literal\n  +0x238A | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.KeyValue):\n  +0x238C | 0C EB FF FF             | SOffset32  | 0xFFFFEB0C (-5364) Loc: 0x3880     | offset to vtable\n  +0x2390 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x23A8        | offset to field `key` (string)\n  +0x2394 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2398         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2398 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | length of string\n  +0x239C | 66 6E 76 31 61 5F 36 34 | char[8]    | fnv1a_64                           | string literal\n  +0x23A4 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x23A5 | 00 00 00                | uint8_t[3] | ...                                | padding\n\nstring (reflection.KeyValue.key):\n  +0x23A8 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of string\n  +0x23AC | 68 61 73 68             | char[4]    | hash                               | string literal\n  +0x23B0 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x23B1 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Type):\n  +0x23B4 | 88 ED FF FF             | SOffset32  | 0xFFFFED88 (-4728) Loc: 0x362C     | offset to vtable\n  +0x23B8 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x23BB | 09                      | uint8_t    | 0x09 (9)                           | table field `base_type` (Byte)\n  +0x23BC | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | table field `base_size` (UInt)\n  +0x23C0 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x23C4 | 11 00 00 00             | uint32_t   | 0x00000011 (17)                    | length of string\n  +0x23C8 | 74 65 73 74 68 61 73 68 | char[17]   | testhash                           | string literal\n  +0x23D0 | 73 36 34 5F 66 6E 76 31 |            | s64_fnv1\n  +0x23D8 | 61                      |            | a\n  +0x23D9 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x23DA | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Field):\n  +0x23DC | C4 F8 FF FF             | SOffset32  | 0xFFFFF8C4 (-1852) Loc: 0x2B18     | offset to vtable\n  +0x23E0 | 15 00                   | uint16_t   | 0x0015 (21)                        | table field `id` (UShort)\n  +0x23E2 | 2E 00                   | uint16_t   | 0x002E (46)                        | table field `offset` (UShort)\n  +0x23E4 | C4 00 00 00             | UOffset32  | 0x000000C4 (196) Loc: 0x24A8       | offset to field `name` (string)\n  +0x23E8 | B4 00 00 00             | UOffset32  | 0x000000B4 (180) Loc: 0x249C       | offset to field `type` (table)\n  +0x23EC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x23F0         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x23F0 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of vector (# items)\n  +0x23F4 | 7C 00 00 00             | UOffset32  | 0x0000007C (124) Loc: 0x2470       | offset to table[0]\n  +0x23F8 | 50 00 00 00             | UOffset32  | 0x00000050 (80) Loc: 0x2448        | offset to table[1]\n  +0x23FC | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x2420        | offset to table[2]\n  +0x2400 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2404         | offset to table[3]\n\ntable (reflection.KeyValue):\n  +0x2404 | 84 EB FF FF             | SOffset32  | 0xFFFFEB84 (-5244) Loc: 0x3880     | offset to vtable\n  +0x2408 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x2418        | offset to field `key` (string)\n  +0x240C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2410         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2410 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2414 | 32 31                   | char[2]    | 21                                 | string literal\n  +0x2416 | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x2418 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x241C | 69 64                   | char[2]    | id                                 | string literal\n  +0x241E | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.KeyValue):\n  +0x2420 | A0 EB FF FF             | SOffset32  | 0xFFFFEBA0 (-5216) Loc: 0x3880     | offset to vtable\n  +0x2424 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x243C        | offset to field `key` (string)\n  +0x2428 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x242C         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x242C | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | length of string\n  +0x2430 | 66 6E 76 31 61 5F 33 32 | char[8]    | fnv1a_32                           | string literal\n  +0x2438 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2439 | 00 00 00                | uint8_t[3] | ...                                | padding\n\nstring (reflection.KeyValue.key):\n  +0x243C | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of string\n  +0x2440 | 68 61 73 68             | char[4]    | hash                               | string literal\n  +0x2444 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2445 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.KeyValue):\n  +0x2448 | C8 EB FF FF             | SOffset32  | 0xFFFFEBC8 (-5176) Loc: 0x3880     | offset to vtable\n  +0x244C | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x2460        | offset to field `key` (string)\n  +0x2450 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2454         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2454 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of string\n  +0x2458 | 53 74 61 74             | char[4]    | Stat                               | string literal\n  +0x245C | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x245D | 00 00 00                | uint8_t[3] | ...                                | padding\n\nstring (reflection.KeyValue.key):\n  +0x2460 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | length of string\n  +0x2464 | 63 70 70 5F 74 79 70 65 | char[8]    | cpp_type                           | string literal\n  +0x246C | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x246D | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.KeyValue):\n  +0x2470 | F0 EB FF FF             | SOffset32  | 0xFFFFEBF0 (-5136) Loc: 0x3880     | offset to vtable\n  +0x2474 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x2488        | offset to field `key` (string)\n  +0x2478 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x247C         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x247C | 05 00 00 00             | uint32_t   | 0x00000005 (5)                     | length of string\n  +0x2480 | 6E 61 6B 65 64          | char[5]    | naked                              | string literal\n  +0x2485 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2486 | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x2488 | 0C 00 00 00             | uint32_t   | 0x0000000C (12)                    | length of string\n  +0x248C | 63 70 70 5F 70 74 72 5F | char[12]   | cpp_ptr_                           | string literal\n  +0x2494 | 74 79 70 65             |            | type\n  +0x2498 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2499 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Type):\n  +0x249C | 08 EC FF FF             | SOffset32  | 0xFFFFEC08 (-5112) Loc: 0x3894     | offset to vtable\n  +0x24A0 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x24A3 | 08                      | uint8_t    | 0x08 (8)                           | table field `base_type` (Byte)\n  +0x24A4 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x24A8 | 11 00 00 00             | uint32_t   | 0x00000011 (17)                    | length of string\n  +0x24AC | 74 65 73 74 68 61 73 68 | char[17]   | testhash                           | string literal\n  +0x24B4 | 75 33 32 5F 66 6E 76 31 |            | u32_fnv1\n  +0x24BC | 61                      |            | a\n  +0x24BD | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x24BE | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Field):\n  +0x24C0 | A8 F9 FF FF             | SOffset32  | 0xFFFFF9A8 (-1624) Loc: 0x2B18     | offset to vtable\n  +0x24C4 | 14 00                   | uint16_t   | 0x0014 (20)                        | table field `id` (UShort)\n  +0x24C6 | 2C 00                   | uint16_t   | 0x002C (44)                        | table field `offset` (UShort)\n  +0x24C8 | 68 00 00 00             | UOffset32  | 0x00000068 (104) Loc: 0x2530       | offset to field `name` (string)\n  +0x24CC | 58 00 00 00             | UOffset32  | 0x00000058 (88) Loc: 0x2524        | offset to field `type` (table)\n  +0x24D0 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x24D4         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x24D4 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of vector (# items)\n  +0x24D8 | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x24FC        | offset to table[0]\n  +0x24DC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x24E0         | offset to table[1]\n\ntable (reflection.KeyValue):\n  +0x24E0 | 60 EC FF FF             | SOffset32  | 0xFFFFEC60 (-5024) Loc: 0x3880     | offset to vtable\n  +0x24E4 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x24F4        | offset to field `key` (string)\n  +0x24E8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x24EC         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x24EC | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x24F0 | 32 30                   | char[2]    | 20                                 | string literal\n  +0x24F2 | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x24F4 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x24F8 | 69 64                   | char[2]    | id                                 | string literal\n  +0x24FA | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.KeyValue):\n  +0x24FC | 7C EC FF FF             | SOffset32  | 0xFFFFEC7C (-4996) Loc: 0x3880     | offset to vtable\n  +0x2500 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x2518        | offset to field `key` (string)\n  +0x2504 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2508         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2508 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | length of string\n  +0x250C | 66 6E 76 31 61 5F 33 32 | char[8]    | fnv1a_32                           | string literal\n  +0x2514 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2515 | 00 00 00                | uint8_t[3] | ...                                | padding\n\nstring (reflection.KeyValue.key):\n  +0x2518 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of string\n  +0x251C | 68 61 73 68             | char[4]    | hash                               | string literal\n  +0x2520 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2521 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Type):\n  +0x2524 | 90 EC FF FF             | SOffset32  | 0xFFFFEC90 (-4976) Loc: 0x3894     | offset to vtable\n  +0x2528 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x252B | 07                      | uint8_t    | 0x07 (7)                           | table field `base_type` (Byte)\n  +0x252C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x2530 | 11 00 00 00             | uint32_t   | 0x00000011 (17)                    | length of string\n  +0x2534 | 74 65 73 74 68 61 73 68 | char[17]   | testhash                           | string literal\n  +0x253C | 73 33 32 5F 66 6E 76 31 |            | s32_fnv1\n  +0x2544 | 61                      |            | a\n  +0x2545 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2546 | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Field):\n  +0x2548 | 30 FA FF FF             | SOffset32  | 0xFFFFFA30 (-1488) Loc: 0x2B18     | offset to vtable\n  +0x254C | 13 00                   | uint16_t   | 0x0013 (19)                        | table field `id` (UShort)\n  +0x254E | 2A 00                   | uint16_t   | 0x002A (42)                        | table field `offset` (UShort)\n  +0x2550 | 68 00 00 00             | UOffset32  | 0x00000068 (104) Loc: 0x25B8       | offset to field `name` (string)\n  +0x2554 | 54 00 00 00             | UOffset32  | 0x00000054 (84) Loc: 0x25A8        | offset to field `type` (table)\n  +0x2558 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x255C         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x255C | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of vector (# items)\n  +0x2560 | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x2584        | offset to table[0]\n  +0x2564 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2568         | offset to table[1]\n\ntable (reflection.KeyValue):\n  +0x2568 | E8 EC FF FF             | SOffset32  | 0xFFFFECE8 (-4888) Loc: 0x3880     | offset to vtable\n  +0x256C | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x257C        | offset to field `key` (string)\n  +0x2570 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2574         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2574 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2578 | 31 39                   | char[2]    | 19                                 | string literal\n  +0x257A | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x257C | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2580 | 69 64                   | char[2]    | id                                 | string literal\n  +0x2582 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.KeyValue):\n  +0x2584 | 04 ED FF FF             | SOffset32  | 0xFFFFED04 (-4860) Loc: 0x3880     | offset to vtable\n  +0x2588 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x259C        | offset to field `key` (string)\n  +0x258C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2590         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2590 | 07 00 00 00             | uint32_t   | 0x00000007 (7)                     | length of string\n  +0x2594 | 66 6E 76 31 5F 36 34    | char[7]    | fnv1_64                            | string literal\n  +0x259B | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x259C | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of string\n  +0x25A0 | 68 61 73 68             | char[4]    | hash                               | string literal\n  +0x25A4 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x25A5 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Type):\n  +0x25A8 | 7C EF FF FF             | SOffset32  | 0xFFFFEF7C (-4228) Loc: 0x362C     | offset to vtable\n  +0x25AC | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x25AF | 0A                      | uint8_t    | 0x0A (10)                          | table field `base_type` (Byte)\n  +0x25B0 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | table field `base_size` (UInt)\n  +0x25B4 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x25B8 | 10 00 00 00             | uint32_t   | 0x00000010 (16)                    | length of string\n  +0x25BC | 74 65 73 74 68 61 73 68 | char[16]   | testhash                           | string literal\n  +0x25C4 | 75 36 34 5F 66 6E 76 31 |            | u64_fnv1\n  +0x25CC | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x25CD | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Field):\n  +0x25D0 | B8 FA FF FF             | SOffset32  | 0xFFFFFAB8 (-1352) Loc: 0x2B18     | offset to vtable\n  +0x25D4 | 12 00                   | uint16_t   | 0x0012 (18)                        | table field `id` (UShort)\n  +0x25D6 | 28 00                   | uint16_t   | 0x0028 (40)                        | table field `offset` (UShort)\n  +0x25D8 | 68 00 00 00             | UOffset32  | 0x00000068 (104) Loc: 0x2640       | offset to field `name` (string)\n  +0x25DC | 54 00 00 00             | UOffset32  | 0x00000054 (84) Loc: 0x2630        | offset to field `type` (table)\n  +0x25E0 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x25E4         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x25E4 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of vector (# items)\n  +0x25E8 | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x260C        | offset to table[0]\n  +0x25EC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x25F0         | offset to table[1]\n\ntable (reflection.KeyValue):\n  +0x25F0 | 70 ED FF FF             | SOffset32  | 0xFFFFED70 (-4752) Loc: 0x3880     | offset to vtable\n  +0x25F4 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x2604        | offset to field `key` (string)\n  +0x25F8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x25FC         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x25FC | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2600 | 31 38                   | char[2]    | 18                                 | string literal\n  +0x2602 | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x2604 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2608 | 69 64                   | char[2]    | id                                 | string literal\n  +0x260A | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.KeyValue):\n  +0x260C | 8C ED FF FF             | SOffset32  | 0xFFFFED8C (-4724) Loc: 0x3880     | offset to vtable\n  +0x2610 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x2624        | offset to field `key` (string)\n  +0x2614 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2618         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2618 | 07 00 00 00             | uint32_t   | 0x00000007 (7)                     | length of string\n  +0x261C | 66 6E 76 31 5F 36 34    | char[7]    | fnv1_64                            | string literal\n  +0x2623 | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x2624 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of string\n  +0x2628 | 68 61 73 68             | char[4]    | hash                               | string literal\n  +0x262C | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x262D | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Type):\n  +0x2630 | 04 F0 FF FF             | SOffset32  | 0xFFFFF004 (-4092) Loc: 0x362C     | offset to vtable\n  +0x2634 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x2637 | 09                      | uint8_t    | 0x09 (9)                           | table field `base_type` (Byte)\n  +0x2638 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | table field `base_size` (UInt)\n  +0x263C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x2640 | 10 00 00 00             | uint32_t   | 0x00000010 (16)                    | length of string\n  +0x2644 | 74 65 73 74 68 61 73 68 | char[16]   | testhash                           | string literal\n  +0x264C | 73 36 34 5F 66 6E 76 31 |            | s64_fnv1\n  +0x2654 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2655 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Field):\n  +0x2658 | 40 FB FF FF             | SOffset32  | 0xFFFFFB40 (-1216) Loc: 0x2B18     | offset to vtable\n  +0x265C | 11 00                   | uint16_t   | 0x0011 (17)                        | table field `id` (UShort)\n  +0x265E | 26 00                   | uint16_t   | 0x0026 (38)                        | table field `offset` (UShort)\n  +0x2660 | 64 00 00 00             | UOffset32  | 0x00000064 (100) Loc: 0x26C4       | offset to field `name` (string)\n  +0x2664 | 54 00 00 00             | UOffset32  | 0x00000054 (84) Loc: 0x26B8        | offset to field `type` (table)\n  +0x2668 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x266C         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x266C | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of vector (# items)\n  +0x2670 | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x2694        | offset to table[0]\n  +0x2674 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2678         | offset to table[1]\n\ntable (reflection.KeyValue):\n  +0x2678 | F8 ED FF FF             | SOffset32  | 0xFFFFEDF8 (-4616) Loc: 0x3880     | offset to vtable\n  +0x267C | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x268C        | offset to field `key` (string)\n  +0x2680 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2684         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2684 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2688 | 31 37                   | char[2]    | 17                                 | string literal\n  +0x268A | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x268C | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2690 | 69 64                   | char[2]    | id                                 | string literal\n  +0x2692 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.KeyValue):\n  +0x2694 | 14 EE FF FF             | SOffset32  | 0xFFFFEE14 (-4588) Loc: 0x3880     | offset to vtable\n  +0x2698 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x26AC        | offset to field `key` (string)\n  +0x269C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x26A0         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x26A0 | 07 00 00 00             | uint32_t   | 0x00000007 (7)                     | length of string\n  +0x26A4 | 66 6E 76 31 5F 33 32    | char[7]    | fnv1_32                            | string literal\n  +0x26AB | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x26AC | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of string\n  +0x26B0 | 68 61 73 68             | char[4]    | hash                               | string literal\n  +0x26B4 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x26B5 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Type):\n  +0x26B8 | 24 EE FF FF             | SOffset32  | 0xFFFFEE24 (-4572) Loc: 0x3894     | offset to vtable\n  +0x26BC | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x26BF | 08                      | uint8_t    | 0x08 (8)                           | table field `base_type` (Byte)\n  +0x26C0 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x26C4 | 10 00 00 00             | uint32_t   | 0x00000010 (16)                    | length of string\n  +0x26C8 | 74 65 73 74 68 61 73 68 | char[16]   | testhash                           | string literal\n  +0x26D0 | 75 33 32 5F 66 6E 76 31 |            | u32_fnv1\n  +0x26D8 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x26D9 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Field):\n  +0x26DC | C4 FB FF FF             | SOffset32  | 0xFFFFFBC4 (-1084) Loc: 0x2B18     | offset to vtable\n  +0x26E0 | 10 00                   | uint16_t   | 0x0010 (16)                        | table field `id` (UShort)\n  +0x26E2 | 24 00                   | uint16_t   | 0x0024 (36)                        | table field `offset` (UShort)\n  +0x26E4 | 64 00 00 00             | UOffset32  | 0x00000064 (100) Loc: 0x2748       | offset to field `name` (string)\n  +0x26E8 | 54 00 00 00             | UOffset32  | 0x00000054 (84) Loc: 0x273C        | offset to field `type` (table)\n  +0x26EC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x26F0         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x26F0 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of vector (# items)\n  +0x26F4 | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x2718        | offset to table[0]\n  +0x26F8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x26FC         | offset to table[1]\n\ntable (reflection.KeyValue):\n  +0x26FC | 7C EE FF FF             | SOffset32  | 0xFFFFEE7C (-4484) Loc: 0x3880     | offset to vtable\n  +0x2700 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x2710        | offset to field `key` (string)\n  +0x2704 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2708         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2708 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x270C | 31 36                   | char[2]    | 16                                 | string literal\n  +0x270E | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x2710 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2714 | 69 64                   | char[2]    | id                                 | string literal\n  +0x2716 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.KeyValue):\n  +0x2718 | 98 EE FF FF             | SOffset32  | 0xFFFFEE98 (-4456) Loc: 0x3880     | offset to vtable\n  +0x271C | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x2730        | offset to field `key` (string)\n  +0x2720 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2724         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2724 | 07 00 00 00             | uint32_t   | 0x00000007 (7)                     | length of string\n  +0x2728 | 66 6E 76 31 5F 33 32    | char[7]    | fnv1_32                            | string literal\n  +0x272F | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x2730 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of string\n  +0x2734 | 68 61 73 68             | char[4]    | hash                               | string literal\n  +0x2738 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2739 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Type):\n  +0x273C | A8 EE FF FF             | SOffset32  | 0xFFFFEEA8 (-4440) Loc: 0x3894     | offset to vtable\n  +0x2740 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x2743 | 07                      | uint8_t    | 0x07 (7)                           | table field `base_type` (Byte)\n  +0x2744 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x2748 | 10 00 00 00             | uint32_t   | 0x00000010 (16)                    | length of string\n  +0x274C | 74 65 73 74 68 61 73 68 | char[16]   | testhash                           | string literal\n  +0x2754 | 73 33 32 5F 66 6E 76 31 |            | s32_fnv1\n  +0x275C | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x275D | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Field):\n  +0x2760 | 48 FC FF FF             | SOffset32  | 0xFFFFFC48 (-952) Loc: 0x2B18      | offset to vtable\n  +0x2764 | 0F 00                   | uint16_t   | 0x000F (15)                        | table field `id` (UShort)\n  +0x2766 | 22 00                   | uint16_t   | 0x0022 (34)                        | table field `offset` (UShort)\n  +0x2768 | 40 00 00 00             | UOffset32  | 0x00000040 (64) Loc: 0x27A8        | offset to field `name` (string)\n  +0x276C | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x2798        | offset to field `type` (table)\n  +0x2770 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2774         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x2774 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x2778 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x277C         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x277C | FC EE FF FF             | SOffset32  | 0xFFFFEEFC (-4356) Loc: 0x3880     | offset to vtable\n  +0x2780 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x2790        | offset to field `key` (string)\n  +0x2784 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2788         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2788 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x278C | 31 35                   | char[2]    | 15                                 | string literal\n  +0x278E | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x2790 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2794 | 69 64                   | char[2]    | id                                 | string literal\n  +0x2796 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x2798 | 6C F1 FF FF             | SOffset32  | 0xFFFFF16C (-3732) Loc: 0x362C     | offset to vtable\n  +0x279C | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x279F | 02                      | uint8_t    | 0x02 (2)                           | table field `base_type` (Byte)\n  +0x27A0 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x27A4 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x27A8 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | length of string\n  +0x27AC | 74 65 73 74 62 6F 6F 6C | char[8]    | testbool                           | string literal\n  +0x27B4 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x27B5 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Field):\n  +0x27B8 | B0 FB FF FF             | SOffset32  | 0xFFFFFBB0 (-1104) Loc: 0x2C08     | offset to vtable\n  +0x27BC | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x27BF | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x27C0 | 0E 00                   | uint16_t   | 0x000E (14)                        | table field `id` (UShort)\n  +0x27C2 | 20 00                   | uint16_t   | 0x0020 (32)                        | table field `offset` (UShort)\n  +0x27C4 | 40 00 00 00             | UOffset32  | 0x00000040 (64) Loc: 0x2804        | offset to field `name` (string)\n  +0x27C8 | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x27F4        | offset to field `type` (table)\n  +0x27CC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x27D0         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x27D0 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x27D4 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x27D8         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x27D8 | 58 EF FF FF             | SOffset32  | 0xFFFFEF58 (-4264) Loc: 0x3880     | offset to vtable\n  +0x27DC | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x27EC        | offset to field `key` (string)\n  +0x27E0 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x27E4         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x27E4 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x27E8 | 31 34                   | char[2]    | 14                                 | string literal\n  +0x27EA | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x27EC | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x27F0 | 69 64                   | char[2]    | id                                 | string literal\n  +0x27F2 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x27F4 | 24 F0 FF FF             | SOffset32  | 0xFFFFF024 (-4060) Loc: 0x37D0     | offset to vtable\n  +0x27F8 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x27FB | 0F                      | uint8_t    | 0x0F (15)                          | table field `base_type` (Byte)\n  +0x27FC | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | table field `index` (Int)\n  +0x2800 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x2804 | 09 00 00 00             | uint32_t   | 0x00000009 (9)                     | length of string\n  +0x2808 | 74 65 73 74 65 6D 70 74 | char[9]    | testempt                           | string literal\n  +0x2810 | 79                      |            | y\n  +0x2811 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2812 | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Field):\n  +0x2814 | 0C FC FF FF             | SOffset32  | 0xFFFFFC0C (-1012) Loc: 0x2C08     | offset to vtable\n  +0x2818 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x281B | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x281C | 0D 00                   | uint16_t   | 0x000D (13)                        | table field `id` (UShort)\n  +0x281E | 1E 00                   | uint16_t   | 0x001E (30)                        | table field `offset` (UShort)\n  +0x2820 | 70 00 00 00             | UOffset32  | 0x00000070 (112) Loc: 0x2890       | offset to field `name` (string)\n  +0x2824 | 60 00 00 00             | UOffset32  | 0x00000060 (96) Loc: 0x2884        | offset to field `type` (table)\n  +0x2828 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x282C         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x282C | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of vector (# items)\n  +0x2830 | 38 00 00 00             | UOffset32  | 0x00000038 (56) Loc: 0x2868        | offset to table[0]\n  +0x2834 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2838         | offset to table[1]\n\ntable (reflection.KeyValue):\n  +0x2838 | B8 EF FF FF             | SOffset32  | 0xFFFFEFB8 (-4168) Loc: 0x3880     | offset to vtable\n  +0x283C | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x2850        | offset to field `key` (string)\n  +0x2840 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2844         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2844 | 07 00 00 00             | uint32_t   | 0x00000007 (7)                     | length of string\n  +0x2848 | 4D 6F 6E 73 74 65 72    | char[7]    | Monster                            | string literal\n  +0x284F | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x2850 | 11 00 00 00             | uint32_t   | 0x00000011 (17)                    | length of string\n  +0x2854 | 6E 65 73 74 65 64 5F 66 | char[17]   | nested_f                           | string literal\n  +0x285C | 6C 61 74 62 75 66 66 65 |            | latbuffe\n  +0x2864 | 72                      |            | r\n  +0x2865 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2866 | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.KeyValue):\n  +0x2868 | E8 EF FF FF             | SOffset32  | 0xFFFFEFE8 (-4120) Loc: 0x3880     | offset to vtable\n  +0x286C | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x287C        | offset to field `key` (string)\n  +0x2870 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2874         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2874 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2878 | 31 33                   | char[2]    | 13                                 | string literal\n  +0x287A | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x287C | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2880 | 69 64                   | char[2]    | id                                 | string literal\n  +0x2882 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x2884 | 24 FC FF FF             | SOffset32  | 0xFFFFFC24 (-988) Loc: 0x2C60      | offset to vtable\n  +0x2888 | 00 00                   | uint8_t[2] | ..                                 | padding\n  +0x288A | 0E                      | uint8_t    | 0x0E (14)                          | table field `base_type` (Byte)\n  +0x288B | 04                      | uint8_t    | 0x04 (4)                           | table field `element` (Byte)\n  +0x288C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x2890 | 14 00 00 00             | uint32_t   | 0x00000014 (20)                    | length of string\n  +0x2894 | 74 65 73 74 6E 65 73 74 | char[20]   | testnest                           | string literal\n  +0x289C | 65 64 66 6C 61 74 62 75 |            | edflatbu\n  +0x28A4 | 66 66 65 72             |            | ffer\n  +0x28A8 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x28A9 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Field):\n  +0x28AC | A4 FC FF FF             | SOffset32  | 0xFFFFFCA4 (-860) Loc: 0x2C08      | offset to vtable\n  +0x28B0 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x28B3 | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x28B4 | 0C 00                   | uint16_t   | 0x000C (12)                        | table field `id` (UShort)\n  +0x28B6 | 1C 00                   | uint16_t   | 0x001C (28)                        | table field `offset` (UShort)\n  +0x28B8 | 40 00 00 00             | UOffset32  | 0x00000040 (64) Loc: 0x28F8        | offset to field `name` (string)\n  +0x28BC | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x28E8        | offset to field `type` (table)\n  +0x28C0 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x28C4         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x28C4 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x28C8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x28CC         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x28CC | 4C F0 FF FF             | SOffset32  | 0xFFFFF04C (-4020) Loc: 0x3880     | offset to vtable\n  +0x28D0 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x28E0        | offset to field `key` (string)\n  +0x28D4 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x28D8         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x28D8 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x28DC | 31 32                   | char[2]    | 12                                 | string literal\n  +0x28DE | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x28E0 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x28E4 | 69 64                   | char[2]    | id                                 | string literal\n  +0x28E6 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x28E8 | 18 F1 FF FF             | SOffset32  | 0xFFFFF118 (-3816) Loc: 0x37D0     | offset to vtable\n  +0x28EC | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x28EF | 0F                      | uint8_t    | 0x0F (15)                          | table field `base_type` (Byte)\n  +0x28F0 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `index` (Int)\n  +0x28F4 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x28F8 | 05 00 00 00             | uint32_t   | 0x00000005 (5)                     | length of string\n  +0x28FC | 65 6E 65 6D 79          | char[5]    | enemy                              | string literal\n  +0x2901 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2902 | 00 00                   | uint8_t[2] | ..                                 | padding\n\nvtable (reflection.Field):\n  +0x2904 | 1C 00                   | uint16_t   | 0x001C (28)                        | size of this vtable\n  +0x2906 | 1C 00                   | uint16_t   | 0x001C (28)                        | size of referring table\n  +0x2908 | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `name` (id: 0)\n  +0x290A | 10 00                   | VOffset16  | 0x0010 (16)                        | offset to field `type` (id: 1)\n  +0x290C | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `id` (id: 2)\n  +0x290E | 0A 00                   | VOffset16  | 0x000A (10)                        | offset to field `offset` (id: 3)\n  +0x2910 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `default_integer` (id: 4) <defaults to 0> (Long)\n  +0x2912 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `default_real` (id: 5) <defaults to 0.000000> (Double)\n  +0x2914 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `deprecated` (id: 6) <defaults to 0> (Bool)\n  +0x2916 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `required` (id: 7) <defaults to 0> (Bool)\n  +0x2918 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `key` (id: 8) <defaults to 0> (Bool)\n  +0x291A | 14 00                   | VOffset16  | 0x0014 (20)                        | offset to field `attributes` (id: 9)\n  +0x291C | 18 00                   | VOffset16  | 0x0018 (24)                        | offset to field `documentation` (id: 10)\n  +0x291E | 07 00                   | VOffset16  | 0x0007 (7)                         | offset to field `optional` (id: 11)\n\ntable (reflection.Field):\n  +0x2920 | 1C 00 00 00             | SOffset32  | 0x0000001C (28) Loc: 0x2904        | offset to vtable\n  +0x2924 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x2927 | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x2928 | 0B 00                   | uint16_t   | 0x000B (11)                        | table field `id` (UShort)\n  +0x292A | 1A 00                   | uint16_t   | 0x001A (26)                        | table field `offset` (UShort)\n  +0x292C | B4 00 00 00             | UOffset32  | 0x000000B4 (180) Loc: 0x29E0       | offset to field `name` (string)\n  +0x2930 | A0 00 00 00             | UOffset32  | 0x000000A0 (160) Loc: 0x29D0       | offset to field `type` (table)\n  +0x2934 | 78 00 00 00             | UOffset32  | 0x00000078 (120) Loc: 0x29AC       | offset to field `attributes` (vector)\n  +0x2938 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x293C         | offset to field `documentation` (vector)\n\nvector (reflection.Field.documentation):\n  +0x293C | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of vector (# items)\n  +0x2940 | 1C 00 00 00             | UOffset32  | 0x0000001C (28) Loc: 0x295C        | offset to string[0]\n  +0x2944 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2948         | offset to string[1]\n\nstring (reflection.Field.documentation):\n  +0x2948 | 0E 00 00 00             | uint32_t   | 0x0000000E (14)                    | length of string\n  +0x294C | 20 6D 75 6C 74 69 6C 69 | char[14]   |  multili                           | string literal\n  +0x2954 | 6E 65 20 74 6F 6F       |            | ne too\n  +0x295A | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.Field.documentation):\n  +0x295C | 49 00 00 00             | uint32_t   | 0x00000049 (73)                    | length of string\n  +0x2960 | 20 61 6E 20 65 78 61 6D | char[73]   |  an exam                           | string literal\n  +0x2968 | 70 6C 65 20 64 6F 63 75 |            | ple docu\n  +0x2970 | 6D 65 6E 74 61 74 69 6F |            | mentatio\n  +0x2978 | 6E 20 63 6F 6D 6D 65 6E |            | n commen\n  +0x2980 | 74 3A 20 74 68 69 73 20 |            | t: this \n  +0x2988 | 77 69 6C 6C 20 65 6E 64 |            | will end\n  +0x2990 | 20 75 70 20 69 6E 20 74 |            |  up in t\n  +0x2998 | 68 65 20 67 65 6E 65 72 |            | he gener\n  +0x29A0 | 61 74 65 64 20 63 6F 64 |            | ated cod\n  +0x29A8 | 65                      |            | e\n  +0x29A9 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x29AA | 00 00                   | uint8_t[2] | ..                                 | padding\n\nvector (reflection.Field.attributes):\n  +0x29AC | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x29B0 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x29B4         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x29B4 | 34 F1 FF FF             | SOffset32  | 0xFFFFF134 (-3788) Loc: 0x3880     | offset to vtable\n  +0x29B8 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x29C8        | offset to field `key` (string)\n  +0x29BC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x29C0         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x29C0 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x29C4 | 31 31                   | char[2]    | 11                                 | string literal\n  +0x29C6 | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x29C8 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x29CC | 69 64                   | char[2]    | id                                 | string literal\n  +0x29CE | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x29D0 | 3C FF FF FF             | SOffset32  | 0xFFFFFF3C (-196) Loc: 0x2A94      | offset to vtable\n  +0x29D4 | 00 00                   | uint8_t[2] | ..                                 | padding\n  +0x29D6 | 0E                      | uint8_t    | 0x0E (14)                          | table field `base_type` (Byte)\n  +0x29D7 | 0F                      | uint8_t    | 0x0F (15)                          | table field `element` (Byte)\n  +0x29D8 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `index` (Int)\n  +0x29DC | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x29E0 | 11 00 00 00             | uint32_t   | 0x00000011 (17)                    | length of string\n  +0x29E4 | 74 65 73 74 61 72 72 61 | char[17]   | testarra                           | string literal\n  +0x29EC | 79 6F 66 74 61 62 6C 65 |            | yoftable\n  +0x29F4 | 73                      |            | s\n  +0x29F5 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x29F6 | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Field):\n  +0x29F8 | F0 FD FF FF             | SOffset32  | 0xFFFFFDF0 (-528) Loc: 0x2C08      | offset to vtable\n  +0x29FC | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x29FF | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x2A00 | 0A 00                   | uint16_t   | 0x000A (10)                        | table field `id` (UShort)\n  +0x2A02 | 18 00                   | uint16_t   | 0x0018 (24)                        | table field `offset` (UShort)\n  +0x2A04 | 3C 00 00 00             | UOffset32  | 0x0000003C (60) Loc: 0x2A40        | offset to field `name` (string)\n  +0x2A08 | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x2A34        | offset to field `type` (table)\n  +0x2A0C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2A10         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x2A10 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x2A14 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2A18         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x2A18 | 98 F1 FF FF             | SOffset32  | 0xFFFFF198 (-3688) Loc: 0x3880     | offset to vtable\n  +0x2A1C | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x2A2C        | offset to field `key` (string)\n  +0x2A20 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2A24         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2A24 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2A28 | 31 30                   | char[2]    | 10                                 | string literal\n  +0x2A2A | 00                      | char       | 0x00 (0)                           | string terminator\n\nstring (reflection.KeyValue.key):\n  +0x2A2C | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2A30 | 69 64                   | char[2]    | id                                 | string literal\n  +0x2A32 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x2A34 | D4 FD FF FF             | SOffset32  | 0xFFFFFDD4 (-556) Loc: 0x2C60      | offset to vtable\n  +0x2A38 | 00 00                   | uint8_t[2] | ..                                 | padding\n  +0x2A3A | 0E                      | uint8_t    | 0x0E (14)                          | table field `base_type` (Byte)\n  +0x2A3B | 0D                      | uint8_t    | 0x0D (13)                          | table field `element` (Byte)\n  +0x2A3C | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x2A40 | 11 00 00 00             | uint32_t   | 0x00000011 (17)                    | length of string\n  +0x2A44 | 74 65 73 74 61 72 72 61 | char[17]   | testarra                           | string literal\n  +0x2A4C | 79 6F 66 73 74 72 69 6E |            | yofstrin\n  +0x2A54 | 67                      |            | g\n  +0x2A55 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2A56 | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Field):\n  +0x2A58 | 50 FE FF FF             | SOffset32  | 0xFFFFFE50 (-432) Loc: 0x2C08      | offset to vtable\n  +0x2A5C | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x2A5F | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x2A60 | 09 00                   | uint16_t   | 0x0009 (9)                         | table field `id` (UShort)\n  +0x2A62 | 16 00                   | uint16_t   | 0x0016 (22)                        | table field `offset` (UShort)\n  +0x2A64 | 50 00 00 00             | UOffset32  | 0x00000050 (80) Loc: 0x2AB4        | offset to field `name` (string)\n  +0x2A68 | 3C 00 00 00             | UOffset32  | 0x0000003C (60) Loc: 0x2AA4        | offset to field `type` (table)\n  +0x2A6C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2A70         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x2A70 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x2A74 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2A78         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x2A78 | F8 F1 FF FF             | SOffset32  | 0xFFFFF1F8 (-3592) Loc: 0x3880     | offset to vtable\n  +0x2A7C | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x2A8C        | offset to field `key` (string)\n  +0x2A80 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2A84         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2A84 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x2A88 | 39                      | char[1]    | 9                                  | string literal\n  +0x2A89 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2A8A | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x2A8C | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2A90 | 69 64                   | char[2]    | id                                 | string literal\n  +0x2A92 | 00                      | char       | 0x00 (0)                           | string terminator\n\nvtable (reflection.Type):\n  +0x2A94 | 10 00                   | uint16_t   | 0x0010 (16)                        | size of this vtable\n  +0x2A96 | 10 00                   | uint16_t   | 0x0010 (16)                        | size of referring table\n  +0x2A98 | 06 00                   | VOffset16  | 0x0006 (6)                         | offset to field `base_type` (id: 0)\n  +0x2A9A | 07 00                   | VOffset16  | 0x0007 (7)                         | offset to field `element` (id: 1)\n  +0x2A9C | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `index` (id: 2)\n  +0x2A9E | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `fixed_length` (id: 3) <defaults to 0> (UShort)\n  +0x2AA0 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `base_size` (id: 4) <defaults to 4> (UInt)\n  +0x2AA2 | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `element_size` (id: 5)\n\ntable (reflection.Type):\n  +0x2AA4 | 10 00 00 00             | SOffset32  | 0x00000010 (16) Loc: 0x2A94        | offset to vtable\n  +0x2AA8 | 00 00                   | uint8_t[2] | ..                                 | padding\n  +0x2AAA | 0E                      | uint8_t    | 0x0E (14)                          | table field `base_type` (Byte)\n  +0x2AAB | 0F                      | uint8_t    | 0x0F (15)                          | table field `element` (Byte)\n  +0x2AAC | 06 00 00 00             | uint32_t   | 0x00000006 (6)                     | table field `index` (Int)\n  +0x2AB0 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x2AB4 | 05 00 00 00             | uint32_t   | 0x00000005 (5)                     | length of string\n  +0x2AB8 | 74 65 73 74 34          | char[5]    | test4                              | string literal\n  +0x2ABD | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2ABE | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Field):\n  +0x2AC0 | B8 FE FF FF             | SOffset32  | 0xFFFFFEB8 (-328) Loc: 0x2C08      | offset to vtable\n  +0x2AC4 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x2AC7 | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x2AC8 | 08 00                   | uint16_t   | 0x0008 (8)                         | table field `id` (UShort)\n  +0x2ACA | 14 00                   | uint16_t   | 0x0014 (20)                        | table field `offset` (UShort)\n  +0x2ACC | 40 00 00 00             | UOffset32  | 0x00000040 (64) Loc: 0x2B0C        | offset to field `name` (string)\n  +0x2AD0 | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x2AFC        | offset to field `type` (table)\n  +0x2AD4 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2AD8         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x2AD8 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x2ADC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2AE0         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x2AE0 | 60 F2 FF FF             | SOffset32  | 0xFFFFF260 (-3488) Loc: 0x3880     | offset to vtable\n  +0x2AE4 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x2AF4        | offset to field `key` (string)\n  +0x2AE8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2AEC         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2AEC | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x2AF0 | 38                      | char[1]    | 8                                  | string literal\n  +0x2AF1 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2AF2 | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x2AF4 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2AF8 | 69 64                   | char[2]    | id                                 | string literal\n  +0x2AFA | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x2AFC | 2C F3 FF FF             | SOffset32  | 0xFFFFF32C (-3284) Loc: 0x37D0     | offset to vtable\n  +0x2B00 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x2B03 | 10                      | uint8_t    | 0x10 (16)                          | table field `base_type` (Byte)\n  +0x2B04 | 00 00 00 00             | uint32_t   | 0x00000000 (0)                     | table field `index` (Int)\n  +0x2B08 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x2B0C | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of string\n  +0x2B10 | 74 65 73 74             | char[4]    | test                               | string literal\n  +0x2B14 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2B15 | 00 00 00                | uint8_t[3] | ...                                | padding\n\nvtable (reflection.Field):\n  +0x2B18 | 18 00                   | uint16_t   | 0x0018 (24)                        | size of this vtable\n  +0x2B1A | 14 00                   | uint16_t   | 0x0014 (20)                        | size of referring table\n  +0x2B1C | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `name` (id: 0)\n  +0x2B1E | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `type` (id: 1)\n  +0x2B20 | 04 00                   | VOffset16  | 0x0004 (4)                         | offset to field `id` (id: 2)\n  +0x2B22 | 06 00                   | VOffset16  | 0x0006 (6)                         | offset to field `offset` (id: 3)\n  +0x2B24 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `default_integer` (id: 4) <defaults to 0> (Long)\n  +0x2B26 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `default_real` (id: 5) <defaults to 0.000000> (Double)\n  +0x2B28 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `deprecated` (id: 6) <defaults to 0> (Bool)\n  +0x2B2A | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `required` (id: 7) <defaults to 0> (Bool)\n  +0x2B2C | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `key` (id: 8) <defaults to 0> (Bool)\n  +0x2B2E | 10 00                   | VOffset16  | 0x0010 (16)                        | offset to field `attributes` (id: 9)\n\ntable (reflection.Field):\n  +0x2B30 | 18 00 00 00             | SOffset32  | 0x00000018 (24) Loc: 0x2B18        | offset to vtable\n  +0x2B34 | 07 00                   | uint16_t   | 0x0007 (7)                         | table field `id` (UShort)\n  +0x2B36 | 12 00                   | uint16_t   | 0x0012 (18)                        | table field `offset` (UShort)\n  +0x2B38 | 44 00 00 00             | UOffset32  | 0x00000044 (68) Loc: 0x2B7C        | offset to field `name` (string)\n  +0x2B3C | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x2B68        | offset to field `type` (table)\n  +0x2B40 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2B44         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x2B44 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x2B48 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2B4C         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x2B4C | CC F2 FF FF             | SOffset32  | 0xFFFFF2CC (-3380) Loc: 0x3880     | offset to vtable\n  +0x2B50 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x2B60        | offset to field `key` (string)\n  +0x2B54 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2B58         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2B58 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x2B5C | 37                      | char[1]    | 7                                  | string literal\n  +0x2B5D | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2B5E | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x2B60 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2B64 | 69 64                   | char[2]    | id                                 | string literal\n  +0x2B66 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x2B68 | 04 F6 FF FF             | SOffset32  | 0xFFFFF604 (-2556) Loc: 0x3564     | offset to vtable\n  +0x2B6C | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x2B6F | 01                      | uint8_t    | 0x01 (1)                           | table field `base_type` (Byte)\n  +0x2B70 | 00 00 00 00             | uint32_t   | 0x00000000 (0)                     | table field `index` (Int)\n  +0x2B74 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x2B78 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x2B7C | 09 00 00 00             | uint32_t   | 0x00000009 (9)                     | length of string\n  +0x2B80 | 74 65 73 74 5F 74 79 70 | char[9]    | test_typ                           | string literal\n  +0x2B88 | 65                      |            | e\n  +0x2B89 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2B8A | 00 00                   | uint8_t[2] | ..                                 | padding\n\nvtable (reflection.Field):\n  +0x2B8C | 18 00                   | uint16_t   | 0x0018 (24)                        | size of this vtable\n  +0x2B8E | 20 00                   | uint16_t   | 0x0020 (32)                        | size of referring table\n  +0x2B90 | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `name` (id: 0)\n  +0x2B92 | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `type` (id: 1)\n  +0x2B94 | 04 00                   | VOffset16  | 0x0004 (4)                         | offset to field `id` (id: 2)\n  +0x2B96 | 06 00                   | VOffset16  | 0x0006 (6)                         | offset to field `offset` (id: 3)\n  +0x2B98 | 14 00                   | VOffset16  | 0x0014 (20)                        | offset to field `default_integer` (id: 4)\n  +0x2B9A | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `default_real` (id: 5) <defaults to 0.000000> (Double)\n  +0x2B9C | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `deprecated` (id: 6) <defaults to 0> (Bool)\n  +0x2B9E | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `required` (id: 7) <defaults to 0> (Bool)\n  +0x2BA0 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `key` (id: 8) <defaults to 0> (Bool)\n  +0x2BA2 | 10 00                   | VOffset16  | 0x0010 (16)                        | offset to field `attributes` (id: 9)\n\ntable (reflection.Field):\n  +0x2BA4 | 18 00 00 00             | SOffset32  | 0x00000018 (24) Loc: 0x2B8C        | offset to vtable\n  +0x2BA8 | 06 00                   | uint16_t   | 0x0006 (6)                         | table field `id` (UShort)\n  +0x2BAA | 10 00                   | uint16_t   | 0x0010 (16)                        | table field `offset` (UShort)\n  +0x2BAC | 50 00 00 00             | UOffset32  | 0x00000050 (80) Loc: 0x2BFC        | offset to field `name` (string)\n  +0x2BB0 | 38 00 00 00             | UOffset32  | 0x00000038 (56) Loc: 0x2BE8        | offset to field `type` (table)\n  +0x2BB4 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x2BC4        | offset to field `attributes` (vector)\n  +0x2BB8 | 08 00 00 00 00 00 00 00 | int64_t    | 0x0000000000000008 (8)             | table field `default_integer` (Long)\n  +0x2BC0 | 00 00 00 00             | uint8_t[4] | ....                               | padding\n\nvector (reflection.Field.attributes):\n  +0x2BC4 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x2BC8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2BCC         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x2BCC | 4C F3 FF FF             | SOffset32  | 0xFFFFF34C (-3252) Loc: 0x3880     | offset to vtable\n  +0x2BD0 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x2BE0        | offset to field `key` (string)\n  +0x2BD4 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2BD8         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2BD8 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x2BDC | 36                      | char[1]    | 6                                  | string literal\n  +0x2BDD | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2BDE | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x2BE0 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2BE4 | 69 64                   | char[2]    | id                                 | string literal\n  +0x2BE6 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x2BE8 | 84 F6 FF FF             | SOffset32  | 0xFFFFF684 (-2428) Loc: 0x3564     | offset to vtable\n  +0x2BEC | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x2BEF | 04                      | uint8_t    | 0x04 (4)                           | table field `base_type` (Byte)\n  +0x2BF0 | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | table field `index` (Int)\n  +0x2BF4 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x2BF8 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x2BFC | 05 00 00 00             | uint32_t   | 0x00000005 (5)                     | length of string\n  +0x2C00 | 63 6F 6C 6F 72          | char[5]    | color                              | string literal\n  +0x2C05 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2C06 | 00 00                   | uint8_t[2] | ..                                 | padding\n\nvtable (reflection.Field):\n  +0x2C08 | 1C 00                   | uint16_t   | 0x001C (28)                        | size of this vtable\n  +0x2C0A | 18 00                   | uint16_t   | 0x0018 (24)                        | size of referring table\n  +0x2C0C | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `name` (id: 0)\n  +0x2C0E | 10 00                   | VOffset16  | 0x0010 (16)                        | offset to field `type` (id: 1)\n  +0x2C10 | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `id` (id: 2)\n  +0x2C12 | 0A 00                   | VOffset16  | 0x000A (10)                        | offset to field `offset` (id: 3)\n  +0x2C14 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `default_integer` (id: 4) <defaults to 0> (Long)\n  +0x2C16 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `default_real` (id: 5) <defaults to 0.000000> (Double)\n  +0x2C18 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `deprecated` (id: 6) <defaults to 0> (Bool)\n  +0x2C1A | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `required` (id: 7) <defaults to 0> (Bool)\n  +0x2C1C | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `key` (id: 8) <defaults to 0> (Bool)\n  +0x2C1E | 14 00                   | VOffset16  | 0x0014 (20)                        | offset to field `attributes` (id: 9)\n  +0x2C20 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `documentation` (id: 10) <null> (Vector)\n  +0x2C22 | 07 00                   | VOffset16  | 0x0007 (7)                         | offset to field `optional` (id: 11)\n\ntable (reflection.Field):\n  +0x2C24 | 1C 00 00 00             | SOffset32  | 0x0000001C (28) Loc: 0x2C08        | offset to vtable\n  +0x2C28 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x2C2B | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x2C2C | 05 00                   | uint16_t   | 0x0005 (5)                         | table field `id` (UShort)\n  +0x2C2E | 0E 00                   | uint16_t   | 0x000E (14)                        | table field `offset` (UShort)\n  +0x2C30 | 4C 00 00 00             | UOffset32  | 0x0000004C (76) Loc: 0x2C7C        | offset to field `name` (string)\n  +0x2C34 | 3C 00 00 00             | UOffset32  | 0x0000003C (60) Loc: 0x2C70        | offset to field `type` (table)\n  +0x2C38 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2C3C         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x2C3C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x2C40 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2C44         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x2C44 | C4 F3 FF FF             | SOffset32  | 0xFFFFF3C4 (-3132) Loc: 0x3880     | offset to vtable\n  +0x2C48 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x2C58        | offset to field `key` (string)\n  +0x2C4C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2C50         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2C50 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x2C54 | 35                      | char[1]    | 5                                  | string literal\n  +0x2C55 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2C56 | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x2C58 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2C5C | 69 64                   | char[2]    | id                                 | string literal\n  +0x2C5E | 00                      | char       | 0x00 (0)                           | string terminator\n\nvtable (reflection.Type):\n  +0x2C60 | 10 00                   | uint16_t   | 0x0010 (16)                        | size of this vtable\n  +0x2C62 | 0C 00                   | uint16_t   | 0x000C (12)                        | size of referring table\n  +0x2C64 | 06 00                   | VOffset16  | 0x0006 (6)                         | offset to field `base_type` (id: 0)\n  +0x2C66 | 07 00                   | VOffset16  | 0x0007 (7)                         | offset to field `element` (id: 1)\n  +0x2C68 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `index` (id: 2) <defaults to -1> (Int)\n  +0x2C6A | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `fixed_length` (id: 3) <defaults to 0> (UShort)\n  +0x2C6C | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `base_size` (id: 4) <defaults to 4> (UInt)\n  +0x2C6E | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `element_size` (id: 5)\n\ntable (reflection.Type):\n  +0x2C70 | 10 00 00 00             | SOffset32  | 0x00000010 (16) Loc: 0x2C60        | offset to vtable\n  +0x2C74 | 00 00                   | uint8_t[2] | ..                                 | padding\n  +0x2C76 | 0E                      | uint8_t    | 0x0E (14)                          | table field `base_type` (Byte)\n  +0x2C77 | 04                      | uint8_t    | 0x04 (4)                           | table field `element` (Byte)\n  +0x2C78 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x2C7C | 09 00 00 00             | uint32_t   | 0x00000009 (9)                     | length of string\n  +0x2C80 | 69 6E 76 65 6E 74 6F 72 | char[9]    | inventor                           | string literal\n  +0x2C88 | 79                      |            | y\n  +0x2C89 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2C8A | 00 00                   | uint8_t[2] | ..                                 | padding\n\nvtable (reflection.Field):\n  +0x2C8C | 18 00                   | uint16_t   | 0x0018 (24)                        | size of this vtable\n  +0x2C8E | 18 00                   | uint16_t   | 0x0018 (24)                        | size of referring table\n  +0x2C90 | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `name` (id: 0)\n  +0x2C92 | 10 00                   | VOffset16  | 0x0010 (16)                        | offset to field `type` (id: 1)\n  +0x2C94 | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `id` (id: 2)\n  +0x2C96 | 0A 00                   | VOffset16  | 0x000A (10)                        | offset to field `offset` (id: 3)\n  +0x2C98 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `default_integer` (id: 4) <defaults to 0> (Long)\n  +0x2C9A | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `default_real` (id: 5) <defaults to 0.000000> (Double)\n  +0x2C9C | 07 00                   | VOffset16  | 0x0007 (7)                         | offset to field `deprecated` (id: 6)\n  +0x2C9E | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `required` (id: 7) <defaults to 0> (Bool)\n  +0x2CA0 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `key` (id: 8) <defaults to 0> (Bool)\n  +0x2CA2 | 14 00                   | VOffset16  | 0x0014 (20)                        | offset to field `attributes` (id: 9)\n\ntable (reflection.Field):\n  +0x2CA4 | 18 00 00 00             | SOffset32  | 0x00000018 (24) Loc: 0x2C8C        | offset to vtable\n  +0x2CA8 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x2CAB | 01                      | uint8_t    | 0x01 (1)                           | table field `deprecated` (Bool)\n  +0x2CAC | 04 00                   | uint16_t   | 0x0004 (4)                         | table field `id` (UShort)\n  +0x2CAE | 0C 00                   | uint16_t   | 0x000C (12)                        | table field `offset` (UShort)\n  +0x2CB0 | 90 00 00 00             | UOffset32  | 0x00000090 (144) Loc: 0x2D40       | offset to field `name` (string)\n  +0x2CB4 | 7C 00 00 00             | UOffset32  | 0x0000007C (124) Loc: 0x2D30       | offset to field `type` (table)\n  +0x2CB8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2CBC         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x2CBC | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | length of vector (# items)\n  +0x2CC0 | 4C 00 00 00             | UOffset32  | 0x0000004C (76) Loc: 0x2D0C        | offset to table[0]\n  +0x2CC4 | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x2CF0        | offset to table[1]\n  +0x2CC8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2CCC         | offset to table[2]\n\ntable (reflection.KeyValue):\n  +0x2CCC | 4C F4 FF FF             | SOffset32  | 0xFFFFF44C (-2996) Loc: 0x3880     | offset to vtable\n  +0x2CD0 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x2CE0        | offset to field `key` (string)\n  +0x2CD4 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2CD8         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2CD8 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x2CDC | 31                      | char[1]    | 1                                  | string literal\n  +0x2CDD | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2CDE | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x2CE0 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | length of string\n  +0x2CE4 | 70 72 69 6F 72 69 74 79 | char[8]    | priority                           | string literal\n  +0x2CEC | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2CED | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.KeyValue):\n  +0x2CF0 | 70 F4 FF FF             | SOffset32  | 0xFFFFF470 (-2960) Loc: 0x3880     | offset to vtable\n  +0x2CF4 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x2D04        | offset to field `key` (string)\n  +0x2CF8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2CFC         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2CFC | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x2D00 | 34                      | char[1]    | 4                                  | string literal\n  +0x2D01 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2D02 | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x2D04 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2D08 | 69 64                   | char[2]    | id                                 | string literal\n  +0x2D0A | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.KeyValue):\n  +0x2D0C | 8C F4 FF FF             | SOffset32  | 0xFFFFF48C (-2932) Loc: 0x3880     | offset to vtable\n  +0x2D10 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x2D20        | offset to field `key` (string)\n  +0x2D14 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2D18         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2D18 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x2D1C | 30                      | char[1]    | 0                                  | string literal\n  +0x2D1D | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2D1E | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x2D20 | 0A 00 00 00             | uint32_t   | 0x0000000A (10)                    | length of string\n  +0x2D24 | 64 65 70 72 65 63 61 74 | char[10]   | deprecat                           | string literal\n  +0x2D2C | 65 64                   |            | ed\n  +0x2D2E | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x2D30 | 04 F7 FF FF             | SOffset32  | 0xFFFFF704 (-2300) Loc: 0x362C     | offset to vtable\n  +0x2D34 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x2D37 | 02                      | uint8_t    | 0x02 (2)                           | table field `base_type` (Byte)\n  +0x2D38 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x2D3C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x2D40 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | length of string\n  +0x2D44 | 66 72 69 65 6E 64 6C 79 | char[8]    | friendly                           | string literal\n  +0x2D4C | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2D4D | 00 00 00                | uint8_t[3] | ...                                | padding\n\nvtable (reflection.Field):\n  +0x2D50 | 18 00                   | uint16_t   | 0x0018 (24)                        | size of this vtable\n  +0x2D52 | 18 00                   | uint16_t   | 0x0018 (24)                        | size of referring table\n  +0x2D54 | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `name` (id: 0)\n  +0x2D56 | 10 00                   | VOffset16  | 0x0010 (16)                        | offset to field `type` (id: 1)\n  +0x2D58 | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `id` (id: 2)\n  +0x2D5A | 0A 00                   | VOffset16  | 0x000A (10)                        | offset to field `offset` (id: 3)\n  +0x2D5C | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `default_integer` (id: 4) <defaults to 0> (Long)\n  +0x2D5E | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `default_real` (id: 5) <defaults to 0.000000> (Double)\n  +0x2D60 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `deprecated` (id: 6) <defaults to 0> (Bool)\n  +0x2D62 | 06 00                   | VOffset16  | 0x0006 (6)                         | offset to field `required` (id: 7)\n  +0x2D64 | 07 00                   | VOffset16  | 0x0007 (7)                         | offset to field `key` (id: 8)\n  +0x2D66 | 14 00                   | VOffset16  | 0x0014 (20)                        | offset to field `attributes` (id: 9)\n\ntable (reflection.Field):\n  +0x2D68 | 18 00 00 00             | SOffset32  | 0x00000018 (24) Loc: 0x2D50        | offset to vtable\n  +0x2D6C | 00 00                   | uint8_t[2] | ..                                 | padding\n  +0x2D6E | 01                      | uint8_t    | 0x01 (1)                           | table field `required` (Bool)\n  +0x2D6F | 01                      | uint8_t    | 0x01 (1)                           | table field `key` (Bool)\n  +0x2D70 | 03 00                   | uint16_t   | 0x0003 (3)                         | table field `id` (UShort)\n  +0x2D72 | 0A 00                   | uint16_t   | 0x000A (10)                        | table field `offset` (UShort)\n  +0x2D74 | 5C 00 00 00             | UOffset32  | 0x0000005C (92) Loc: 0x2DD0        | offset to field `name` (string)\n  +0x2D78 | 4C 00 00 00             | UOffset32  | 0x0000004C (76) Loc: 0x2DC4        | offset to field `type` (table)\n  +0x2D7C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2D80         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x2D80 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of vector (# items)\n  +0x2D84 | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x2DA8        | offset to table[0]\n  +0x2D88 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2D8C         | offset to table[1]\n\ntable (reflection.KeyValue):\n  +0x2D8C | 0C F5 FF FF             | SOffset32  | 0xFFFFF50C (-2804) Loc: 0x3880     | offset to vtable\n  +0x2D90 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x2DA0        | offset to field `key` (string)\n  +0x2D94 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2D98         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2D98 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x2D9C | 30                      | char[1]    | 0                                  | string literal\n  +0x2D9D | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2D9E | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x2DA0 | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | length of string\n  +0x2DA4 | 6B 65 79                | char[3]    | key                                | string literal\n  +0x2DA7 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.KeyValue):\n  +0x2DA8 | 28 F5 FF FF             | SOffset32  | 0xFFFFF528 (-2776) Loc: 0x3880     | offset to vtable\n  +0x2DAC | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x2DBC        | offset to field `key` (string)\n  +0x2DB0 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2DB4         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2DB4 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x2DB8 | 33                      | char[1]    | 3                                  | string literal\n  +0x2DB9 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2DBA | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x2DBC | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2DC0 | 69 64                   | char[2]    | id                                 | string literal\n  +0x2DC2 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x2DC4 | 30 F5 FF FF             | SOffset32  | 0xFFFFF530 (-2768) Loc: 0x3894     | offset to vtable\n  +0x2DC8 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x2DCB | 0D                      | uint8_t    | 0x0D (13)                          | table field `base_type` (Byte)\n  +0x2DCC | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x2DD0 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of string\n  +0x2DD4 | 6E 61 6D 65             | char[4]    | name                               | string literal\n  +0x2DD8 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2DD9 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Field):\n  +0x2DDC | A8 FF FF FF             | SOffset32  | 0xFFFFFFA8 (-88) Loc: 0x2E34       | offset to vtable\n  +0x2DE0 | 02 00                   | uint16_t   | 0x0002 (2)                         | table field `id` (UShort)\n  +0x2DE2 | 08 00                   | uint16_t   | 0x0008 (8)                         | table field `offset` (UShort)\n  +0x2DE4 | 48 00 00 00             | UOffset32  | 0x00000048 (72) Loc: 0x2E2C        | offset to field `name` (string)\n  +0x2DE8 | 34 00 00 00             | UOffset32  | 0x00000034 (52) Loc: 0x2E1C        | offset to field `type` (table)\n  +0x2DEC | 0C 00 00 00             | UOffset32  | 0x0000000C (12) Loc: 0x2DF8        | offset to field `attributes` (vector)\n  +0x2DF0 | 64 00 00 00 00 00 00 00 | int64_t    | 0x0000000000000064 (100)           | table field `default_integer` (Long)\n\nvector (reflection.Field.attributes):\n  +0x2DF8 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x2DFC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2E00         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x2E00 | 80 F5 FF FF             | SOffset32  | 0xFFFFF580 (-2688) Loc: 0x3880     | offset to vtable\n  +0x2E04 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x2E14        | offset to field `key` (string)\n  +0x2E08 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2E0C         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2E0C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x2E10 | 32                      | char[1]    | 2                                  | string literal\n  +0x2E11 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2E12 | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x2E14 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2E18 | 69 64                   | char[2]    | id                                 | string literal\n  +0x2E1A | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x2E1C | F0 F7 FF FF             | SOffset32  | 0xFFFFF7F0 (-2064) Loc: 0x362C     | offset to vtable\n  +0x2E20 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x2E23 | 05                      | uint8_t    | 0x05 (5)                           | table field `base_type` (Byte)\n  +0x2E24 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | table field `base_size` (UInt)\n  +0x2E28 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x2E2C | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2E30 | 68 70                   | char[2]    | hp                                 | string literal\n  +0x2E32 | 00                      | char       | 0x00 (0)                           | string terminator\n\nvtable (reflection.Field):\n  +0x2E34 | 18 00                   | uint16_t   | 0x0018 (24)                        | size of this vtable\n  +0x2E36 | 1C 00                   | uint16_t   | 0x001C (28)                        | size of referring table\n  +0x2E38 | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `name` (id: 0)\n  +0x2E3A | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `type` (id: 1)\n  +0x2E3C | 04 00                   | VOffset16  | 0x0004 (4)                         | offset to field `id` (id: 2)\n  +0x2E3E | 06 00                   | VOffset16  | 0x0006 (6)                         | offset to field `offset` (id: 3)\n  +0x2E40 | 14 00                   | VOffset16  | 0x0014 (20)                        | offset to field `default_integer` (id: 4)\n  +0x2E42 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `default_real` (id: 5) <defaults to 0.000000> (Double)\n  +0x2E44 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `deprecated` (id: 6) <defaults to 0> (Bool)\n  +0x2E46 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `required` (id: 7) <defaults to 0> (Bool)\n  +0x2E48 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `key` (id: 8) <defaults to 0> (Bool)\n  +0x2E4A | 10 00                   | VOffset16  | 0x0010 (16)                        | offset to field `attributes` (id: 9)\n\ntable (reflection.Field):\n  +0x2E4C | 18 00 00 00             | SOffset32  | 0x00000018 (24) Loc: 0x2E34        | offset to vtable\n  +0x2E50 | 01 00                   | uint16_t   | 0x0001 (1)                         | table field `id` (UShort)\n  +0x2E52 | 06 00                   | uint16_t   | 0x0006 (6)                         | table field `offset` (UShort)\n  +0x2E54 | 48 00 00 00             | UOffset32  | 0x00000048 (72) Loc: 0x2E9C        | offset to field `name` (string)\n  +0x2E58 | 34 00 00 00             | UOffset32  | 0x00000034 (52) Loc: 0x2E8C        | offset to field `type` (table)\n  +0x2E5C | 0C 00 00 00             | UOffset32  | 0x0000000C (12) Loc: 0x2E68        | offset to field `attributes` (vector)\n  +0x2E60 | 96 00 00 00 00 00 00 00 | int64_t    | 0x0000000000000096 (150)           | table field `default_integer` (Long)\n\nvector (reflection.Field.attributes):\n  +0x2E68 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x2E6C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2E70         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x2E70 | F0 F5 FF FF             | SOffset32  | 0xFFFFF5F0 (-2576) Loc: 0x3880     | offset to vtable\n  +0x2E74 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x2E84        | offset to field `key` (string)\n  +0x2E78 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2E7C         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2E7C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x2E80 | 31                      | char[1]    | 1                                  | string literal\n  +0x2E81 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2E82 | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x2E84 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2E88 | 69 64                   | char[2]    | id                                 | string literal\n  +0x2E8A | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x2E8C | 60 F8 FF FF             | SOffset32  | 0xFFFFF860 (-1952) Loc: 0x362C     | offset to vtable\n  +0x2E90 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x2E93 | 05                      | uint8_t    | 0x05 (5)                           | table field `base_type` (Byte)\n  +0x2E94 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | table field `base_size` (UInt)\n  +0x2E98 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x2E9C | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of string\n  +0x2EA0 | 6D 61 6E 61             | char[4]    | mana                               | string literal\n  +0x2EA4 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2EA5 | 00 00 00                | uint8_t[3] | ...                                | padding\n\nvtable (reflection.Field):\n  +0x2EA8 | 1C 00                   | uint16_t   | 0x001C (28)                        | size of this vtable\n  +0x2EAA | 14 00                   | uint16_t   | 0x0014 (20)                        | size of referring table\n  +0x2EAC | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `name` (id: 0)\n  +0x2EAE | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `type` (id: 1)\n  +0x2EB0 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `id` (id: 2) <defaults to 0> (UShort)\n  +0x2EB2 | 06 00                   | VOffset16  | 0x0006 (6)                         | offset to field `offset` (id: 3)\n  +0x2EB4 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `default_integer` (id: 4) <defaults to 0> (Long)\n  +0x2EB6 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `default_real` (id: 5) <defaults to 0.000000> (Double)\n  +0x2EB8 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `deprecated` (id: 6) <defaults to 0> (Bool)\n  +0x2EBA | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `required` (id: 7) <defaults to 0> (Bool)\n  +0x2EBC | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `key` (id: 8) <defaults to 0> (Bool)\n  +0x2EBE | 10 00                   | VOffset16  | 0x0010 (16)                        | offset to field `attributes` (id: 9)\n  +0x2EC0 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `documentation` (id: 10) <null> (Vector)\n  +0x2EC2 | 05 00                   | VOffset16  | 0x0005 (5)                         | offset to field `optional` (id: 11)\n\ntable (reflection.Field):\n  +0x2EC4 | 1C 00 00 00             | SOffset32  | 0x0000001C (28) Loc: 0x2EA8        | offset to vtable\n  +0x2EC8 | 00                      | uint8_t[1] | .                                  | padding\n  +0x2EC9 | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x2ECA | 04 00                   | uint16_t   | 0x0004 (4)                         | table field `offset` (UShort)\n  +0x2ECC | 40 00 00 00             | UOffset32  | 0x00000040 (64) Loc: 0x2F0C        | offset to field `name` (string)\n  +0x2ED0 | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x2EFC        | offset to field `type` (table)\n  +0x2ED4 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2ED8         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x2ED8 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x2EDC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2EE0         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x2EE0 | 60 F6 FF FF             | SOffset32  | 0xFFFFF660 (-2464) Loc: 0x3880     | offset to vtable\n  +0x2EE4 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x2EF4        | offset to field `key` (string)\n  +0x2EE8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2EEC         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2EEC | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x2EF0 | 30                      | char[1]    | 0                                  | string literal\n  +0x2EF1 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2EF2 | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x2EF4 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2EF8 | 69 64                   | char[2]    | id                                 | string literal\n  +0x2EFA | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x2EFC | 2C F7 FF FF             | SOffset32  | 0xFFFFF72C (-2260) Loc: 0x37D0     | offset to vtable\n  +0x2F00 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x2F03 | 0F                      | uint8_t    | 0x0F (15)                          | table field `base_type` (Byte)\n  +0x2F04 | 09 00 00 00             | uint32_t   | 0x00000009 (9)                     | table field `index` (Int)\n  +0x2F08 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x2F0C | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | length of string\n  +0x2F10 | 70 6F 73                | char[3]    | pos                                | string literal\n  +0x2F13 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Object):\n  +0x2F14 | C4 F7 FF FF             | SOffset32  | 0xFFFFF7C4 (-2108) Loc: 0x3750     | offset to vtable\n  +0x2F18 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x2F30        | offset to field `name` (string)\n  +0x2F1C | 0C 00 00 00             | UOffset32  | 0x0000000C (12) Loc: 0x2F28        | offset to field `fields` (vector)\n  +0x2F20 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `minalign` (Int)\n  +0x2F24 | 78 07 00 00             | UOffset32  | 0x00000778 (1912) Loc: 0x369C      | offset to field `declaration_file` (string)\n\nvector (reflection.Object.fields):\n  +0x2F28 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x2F2C | 3C 00 00 00             | UOffset32  | 0x0000003C (60) Loc: 0x2F68        | offset to table[0]\n\nstring (reflection.Object.name):\n  +0x2F30 | 19 00 00 00             | uint32_t   | 0x00000019 (25)                    | length of string\n  +0x2F34 | 4D 79 47 61 6D 65 2E 45 | char[25]   | MyGame.E                           | string literal\n  +0x2F3C | 78 61 6D 70 6C 65 2E 52 |            | xample.R\n  +0x2F44 | 65 66 65 72 72 61 62 6C |            | eferrabl\n  +0x2F4C | 65                      |            | e\n  +0x2F4D | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2F4E | 00 00                   | uint8_t[2] | ..                                 | padding\n\nvtable (reflection.Field):\n  +0x2F50 | 18 00                   | uint16_t   | 0x0018 (24)                        | size of this vtable\n  +0x2F52 | 14 00                   | uint16_t   | 0x0014 (20)                        | size of referring table\n  +0x2F54 | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `name` (id: 0)\n  +0x2F56 | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `type` (id: 1)\n  +0x2F58 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `id` (id: 2) <defaults to 0> (UShort)\n  +0x2F5A | 06 00                   | VOffset16  | 0x0006 (6)                         | offset to field `offset` (id: 3)\n  +0x2F5C | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `default_integer` (id: 4) <defaults to 0> (Long)\n  +0x2F5E | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `default_real` (id: 5) <defaults to 0.000000> (Double)\n  +0x2F60 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `deprecated` (id: 6) <defaults to 0> (Bool)\n  +0x2F62 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `required` (id: 7) <defaults to 0> (Bool)\n  +0x2F64 | 05 00                   | VOffset16  | 0x0005 (5)                         | offset to field `key` (id: 8)\n  +0x2F66 | 10 00                   | VOffset16  | 0x0010 (16)                        | offset to field `attributes` (id: 9)\n\ntable (reflection.Field):\n  +0x2F68 | 18 00 00 00             | SOffset32  | 0x00000018 (24) Loc: 0x2F50        | offset to vtable\n  +0x2F6C | 00                      | uint8_t[1] | .                                  | padding\n  +0x2F6D | 01                      | uint8_t    | 0x01 (1)                           | table field `key` (Bool)\n  +0x2F6E | 04 00                   | uint16_t   | 0x0004 (4)                         | table field `offset` (UShort)\n  +0x2F70 | 6C 00 00 00             | UOffset32  | 0x0000006C (108) Loc: 0x2FDC       | offset to field `name` (string)\n  +0x2F74 | 58 00 00 00             | UOffset32  | 0x00000058 (88) Loc: 0x2FCC        | offset to field `type` (table)\n  +0x2F78 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2F7C         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x2F7C | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of vector (# items)\n  +0x2F80 | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x2FA4        | offset to table[0]\n  +0x2F84 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2F88         | offset to table[1]\n\ntable (reflection.KeyValue):\n  +0x2F88 | 08 F7 FF FF             | SOffset32  | 0xFFFFF708 (-2296) Loc: 0x3880     | offset to vtable\n  +0x2F8C | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x2F9C        | offset to field `key` (string)\n  +0x2F90 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2F94         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2F94 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x2F98 | 30                      | char[1]    | 0                                  | string literal\n  +0x2F99 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2F9A | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x2F9C | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | length of string\n  +0x2FA0 | 6B 65 79                | char[3]    | key                                | string literal\n  +0x2FA3 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.KeyValue):\n  +0x2FA4 | 24 F7 FF FF             | SOffset32  | 0xFFFFF724 (-2268) Loc: 0x3880     | offset to vtable\n  +0x2FA8 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x2FC0        | offset to field `key` (string)\n  +0x2FAC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x2FB0         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x2FB0 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | length of string\n  +0x2FB4 | 66 6E 76 31 61 5F 36 34 | char[8]    | fnv1a_64                           | string literal\n  +0x2FBC | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2FBD | 00 00 00                | uint8_t[3] | ...                                | padding\n\nstring (reflection.KeyValue.key):\n  +0x2FC0 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | length of string\n  +0x2FC4 | 68 61 73 68             | char[4]    | hash                               | string literal\n  +0x2FC8 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x2FC9 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Type):\n  +0x2FCC | A0 F9 FF FF             | SOffset32  | 0xFFFFF9A0 (-1632) Loc: 0x362C     | offset to vtable\n  +0x2FD0 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x2FD3 | 0A                      | uint8_t    | 0x0A (10)                          | table field `base_type` (Byte)\n  +0x2FD4 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | table field `base_size` (UInt)\n  +0x2FD8 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x2FDC | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x2FE0 | 69 64                   | char[2]    | id                                 | string literal\n  +0x2FE2 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Object):\n  +0x2FE4 | 94 F8 FF FF             | SOffset32  | 0xFFFFF894 (-1900) Loc: 0x3750     | offset to vtable\n  +0x2FE8 | 20 00 00 00             | UOffset32  | 0x00000020 (32) Loc: 0x3008        | offset to field `name` (string)\n  +0x2FEC | 0C 00 00 00             | UOffset32  | 0x0000000C (12) Loc: 0x2FF8        | offset to field `fields` (vector)\n  +0x2FF0 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `minalign` (Int)\n  +0x2FF4 | A8 06 00 00             | UOffset32  | 0x000006A8 (1704) Loc: 0x369C      | offset to field `declaration_file` (string)\n\nvector (reflection.Object.fields):\n  +0x2FF8 | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | length of vector (# items)\n  +0x2FFC | 3C 00 00 00             | UOffset32  | 0x0000003C (60) Loc: 0x3038        | offset to table[0]\n  +0x3000 | B8 00 00 00             | UOffset32  | 0x000000B8 (184) Loc: 0x30B8       | offset to table[1]\n  +0x3004 | 8C 00 00 00             | UOffset32  | 0x0000008C (140) Loc: 0x3090       | offset to table[2]\n\nstring (reflection.Object.name):\n  +0x3008 | 13 00 00 00             | uint32_t   | 0x00000013 (19)                    | length of string\n  +0x300C | 4D 79 47 61 6D 65 2E 45 | char[19]   | MyGame.E                           | string literal\n  +0x3014 | 78 61 6D 70 6C 65 2E 53 |            | xample.S\n  +0x301C | 74 61 74                |            | tat\n  +0x301F | 00                      | char       | 0x00 (0)                           | string terminator\n\nvtable (reflection.Field):\n  +0x3020 | 18 00                   | uint16_t   | 0x0018 (24)                        | size of this vtable\n  +0x3022 | 18 00                   | uint16_t   | 0x0018 (24)                        | size of referring table\n  +0x3024 | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `name` (id: 0)\n  +0x3026 | 10 00                   | VOffset16  | 0x0010 (16)                        | offset to field `type` (id: 1)\n  +0x3028 | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `id` (id: 2)\n  +0x302A | 0A 00                   | VOffset16  | 0x000A (10)                        | offset to field `offset` (id: 3)\n  +0x302C | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `default_integer` (id: 4) <defaults to 0> (Long)\n  +0x302E | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `default_real` (id: 5) <defaults to 0.000000> (Double)\n  +0x3030 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `deprecated` (id: 6) <defaults to 0> (Bool)\n  +0x3032 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `required` (id: 7) <defaults to 0> (Bool)\n  +0x3034 | 07 00                   | VOffset16  | 0x0007 (7)                         | offset to field `key` (id: 8)\n  +0x3036 | 14 00                   | VOffset16  | 0x0014 (20)                        | offset to field `attributes` (id: 9)\n\ntable (reflection.Field):\n  +0x3038 | 18 00 00 00             | SOffset32  | 0x00000018 (24) Loc: 0x3020        | offset to vtable\n  +0x303C | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x303F | 01                      | uint8_t    | 0x01 (1)                           | table field `key` (Bool)\n  +0x3040 | 02 00                   | uint16_t   | 0x0002 (2)                         | table field `id` (UShort)\n  +0x3042 | 08 00                   | uint16_t   | 0x0008 (8)                         | table field `offset` (UShort)\n  +0x3044 | 40 00 00 00             | UOffset32  | 0x00000040 (64) Loc: 0x3084        | offset to field `name` (string)\n  +0x3048 | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x3074        | offset to field `type` (table)\n  +0x304C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x3050         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x3050 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x3054 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x3058         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x3058 | D8 F7 FF FF             | SOffset32  | 0xFFFFF7D8 (-2088) Loc: 0x3880     | offset to vtable\n  +0x305C | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x306C        | offset to field `key` (string)\n  +0x3060 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x3064         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x3064 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x3068 | 30                      | char[1]    | 0                                  | string literal\n  +0x3069 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x306A | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x306C | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | length of string\n  +0x3070 | 6B 65 79                | char[3]    | key                                | string literal\n  +0x3073 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x3074 | 48 FA FF FF             | SOffset32  | 0xFFFFFA48 (-1464) Loc: 0x362C     | offset to vtable\n  +0x3078 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x307B | 06                      | uint8_t    | 0x06 (6)                           | table field `base_type` (Byte)\n  +0x307C | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | table field `base_size` (UInt)\n  +0x3080 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x3084 | 05 00 00 00             | uint32_t   | 0x00000005 (5)                     | length of string\n  +0x3088 | 63 6F 75 6E 74          | char[5]    | count                              | string literal\n  +0x308D | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x308E | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Field):\n  +0x3090 | 5C FC FF FF             | SOffset32  | 0xFFFFFC5C (-932) Loc: 0x3434      | offset to vtable\n  +0x3094 | 01 00                   | uint16_t   | 0x0001 (1)                         | table field `id` (UShort)\n  +0x3096 | 06 00                   | uint16_t   | 0x0006 (6)                         | table field `offset` (UShort)\n  +0x3098 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x30B0        | offset to field `name` (string)\n  +0x309C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x30A0         | offset to field `type` (table)\n\ntable (reflection.Type):\n  +0x30A0 | 74 FA FF FF             | SOffset32  | 0xFFFFFA74 (-1420) Loc: 0x362C     | offset to vtable\n  +0x30A4 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x30A7 | 09                      | uint8_t    | 0x09 (9)                           | table field `base_type` (Byte)\n  +0x30A8 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | table field `base_size` (UInt)\n  +0x30AC | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x30B0 | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | length of string\n  +0x30B4 | 76 61 6C                | char[3]    | val                                | string literal\n  +0x30B7 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x30B8 | 14 F9 FF FF             | SOffset32  | 0xFFFFF914 (-1772) Loc: 0x37A4     | offset to vtable\n  +0x30BC | 00                      | uint8_t[1] | .                                  | padding\n  +0x30BD | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x30BE | 04 00                   | uint16_t   | 0x0004 (4)                         | table field `offset` (UShort)\n  +0x30C0 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x30D4        | offset to field `name` (string)\n  +0x30C4 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x30C8         | offset to field `type` (table)\n\ntable (reflection.Type):\n  +0x30C8 | 34 F8 FF FF             | SOffset32  | 0xFFFFF834 (-1996) Loc: 0x3894     | offset to vtable\n  +0x30CC | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x30CF | 0D                      | uint8_t    | 0x0D (13)                          | table field `base_type` (Byte)\n  +0x30D0 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x30D4 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x30D8 | 69 64                   | char[2]    | id                                 | string literal\n  +0x30DA | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Object):\n  +0x30DC | E4 F8 FF FF             | SOffset32  | 0xFFFFF8E4 (-1820) Loc: 0x37F8     | offset to vtable\n  +0x30E0 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x30E3 | 01                      | uint8_t    | 0x01 (1)                           | table field `is_struct` (Bool)\n  +0x30E4 | 1C 00 00 00             | UOffset32  | 0x0000001C (28) Loc: 0x3100        | offset to field `name` (string)\n  +0x30E8 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x30F8        | offset to field `fields` (vector)\n  +0x30EC | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | table field `minalign` (Int)\n  +0x30F0 | 14 00 00 00             | uint32_t   | 0x00000014 (20)                    | table field `bytesize` (Int)\n  +0x30F4 | A8 05 00 00             | UOffset32  | 0x000005A8 (1448) Loc: 0x369C      | offset to field `declaration_file` (string)\n\nvector (reflection.Object.fields):\n  +0x30F8 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x30FC | 30 00 00 00             | UOffset32  | 0x00000030 (48) Loc: 0x312C        | offset to table[0]\n\nstring (reflection.Object.name):\n  +0x3100 | 27 00 00 00             | uint32_t   | 0x00000027 (39)                    | length of string\n  +0x3104 | 4D 79 47 61 6D 65 2E 45 | char[39]   | MyGame.E                           | string literal\n  +0x310C | 78 61 6D 70 6C 65 2E 53 |            | xample.S\n  +0x3114 | 74 72 75 63 74 4F 66 53 |            | tructOfS\n  +0x311C | 74 72 75 63 74 73 4F 66 |            | tructsOf\n  +0x3124 | 53 74 72 75 63 74 73    |            | Structs\n  +0x312B | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x312C | AC F8 FF FF             | SOffset32  | 0xFFFFF8AC (-1876) Loc: 0x3880     | offset to vtable\n  +0x3130 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x3148        | offset to field `name` (string)\n  +0x3134 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x3138         | offset to field `type` (table)\n\ntable (reflection.Type):\n  +0x3138 | 68 F9 FF FF             | SOffset32  | 0xFFFFF968 (-1688) Loc: 0x37D0     | offset to vtable\n  +0x313C | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x313F | 0F                      | uint8_t    | 0x0F (15)                          | table field `base_type` (Byte)\n  +0x3140 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | table field `index` (Int)\n  +0x3144 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x3148 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x314C | 61                      | char[1]    | a                                  | string literal\n  +0x314D | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x314E | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Object):\n  +0x3150 | 58 F9 FF FF             | SOffset32  | 0xFFFFF958 (-1704) Loc: 0x37F8     | offset to vtable\n  +0x3154 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x3157 | 01                      | uint8_t    | 0x01 (1)                           | table field `is_struct` (Bool)\n  +0x3158 | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x317C        | offset to field `name` (string)\n  +0x315C | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x316C        | offset to field `fields` (vector)\n  +0x3160 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | table field `minalign` (Int)\n  +0x3164 | 14 00 00 00             | uint32_t   | 0x00000014 (20)                    | table field `bytesize` (Int)\n  +0x3168 | 34 05 00 00             | UOffset32  | 0x00000534 (1332) Loc: 0x369C      | offset to field `declaration_file` (string)\n\nvector (reflection.Object.fields):\n  +0x316C | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | length of vector (# items)\n  +0x3170 | 80 00 00 00             | UOffset32  | 0x00000080 (128) Loc: 0x31F0       | offset to table[0]\n  +0x3174 | 54 00 00 00             | UOffset32  | 0x00000054 (84) Loc: 0x31C8        | offset to table[1]\n  +0x3178 | 28 00 00 00             | UOffset32  | 0x00000028 (40) Loc: 0x31A0        | offset to table[2]\n\nstring (reflection.Object.name):\n  +0x317C | 1E 00 00 00             | uint32_t   | 0x0000001E (30)                    | length of string\n  +0x3180 | 4D 79 47 61 6D 65 2E 45 | char[30]   | MyGame.E                           | string literal\n  +0x3188 | 78 61 6D 70 6C 65 2E 53 |            | xample.S\n  +0x3190 | 74 72 75 63 74 4F 66 53 |            | tructOfS\n  +0x3198 | 74 72 75 63 74 73       |            | tructs\n  +0x319E | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x31A0 | 6C FD FF FF             | SOffset32  | 0xFFFFFD6C (-660) Loc: 0x3434      | offset to vtable\n  +0x31A4 | 02 00                   | uint16_t   | 0x0002 (2)                         | table field `id` (UShort)\n  +0x31A6 | 0C 00                   | uint16_t   | 0x000C (12)                        | table field `offset` (UShort)\n  +0x31A8 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x31C0        | offset to field `name` (string)\n  +0x31AC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x31B0         | offset to field `type` (table)\n\ntable (reflection.Type):\n  +0x31B0 | E0 F9 FF FF             | SOffset32  | 0xFFFFF9E0 (-1568) Loc: 0x37D0     | offset to vtable\n  +0x31B4 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x31B7 | 0F                      | uint8_t    | 0x0F (15)                          | table field `base_type` (Byte)\n  +0x31B8 | 00 00 00 00             | uint32_t   | 0x00000000 (0)                     | table field `index` (Int)\n  +0x31BC | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x31C0 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x31C4 | 63                      | char[1]    | c                                  | string literal\n  +0x31C5 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x31C6 | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Field):\n  +0x31C8 | 94 FD FF FF             | SOffset32  | 0xFFFFFD94 (-620) Loc: 0x3434      | offset to vtable\n  +0x31CC | 01 00                   | uint16_t   | 0x0001 (1)                         | table field `id` (UShort)\n  +0x31CE | 08 00                   | uint16_t   | 0x0008 (8)                         | table field `offset` (UShort)\n  +0x31D0 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x31E8        | offset to field `name` (string)\n  +0x31D4 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x31D8         | offset to field `type` (table)\n\ntable (reflection.Type):\n  +0x31D8 | 08 FA FF FF             | SOffset32  | 0xFFFFFA08 (-1528) Loc: 0x37D0     | offset to vtable\n  +0x31DC | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x31DF | 0F                      | uint8_t    | 0x0F (15)                          | table field `base_type` (Byte)\n  +0x31E0 | 06 00 00 00             | uint32_t   | 0x00000006 (6)                     | table field `index` (Int)\n  +0x31E4 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x31E8 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x31EC | 62                      | char[1]    | b                                  | string literal\n  +0x31ED | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x31EE | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Field):\n  +0x31F0 | 70 F9 FF FF             | SOffset32  | 0xFFFFF970 (-1680) Loc: 0x3880     | offset to vtable\n  +0x31F4 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x320C        | offset to field `name` (string)\n  +0x31F8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x31FC         | offset to field `type` (table)\n\ntable (reflection.Type):\n  +0x31FC | 2C FA FF FF             | SOffset32  | 0xFFFFFA2C (-1492) Loc: 0x37D0     | offset to vtable\n  +0x3200 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x3203 | 0F                      | uint8_t    | 0x0F (15)                          | table field `base_type` (Byte)\n  +0x3204 | 00 00 00 00             | uint32_t   | 0x00000000 (0)                     | table field `index` (Int)\n  +0x3208 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x320C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x3210 | 61                      | char[1]    | a                                  | string literal\n  +0x3211 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x3212 | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Object):\n  +0x3214 | 1C FA FF FF             | SOffset32  | 0xFFFFFA1C (-1508) Loc: 0x37F8     | offset to vtable\n  +0x3218 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x321B | 01                      | uint8_t    | 0x01 (1)                           | table field `is_struct` (Bool)\n  +0x321C | 20 00 00 00             | UOffset32  | 0x00000020 (32) Loc: 0x323C        | offset to field `name` (string)\n  +0x3220 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x3230        | offset to field `fields` (vector)\n  +0x3224 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | table field `minalign` (Int)\n  +0x3228 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | table field `bytesize` (Int)\n  +0x322C | 70 04 00 00             | UOffset32  | 0x00000470 (1136) Loc: 0x369C      | offset to field `declaration_file` (string)\n\nvector (reflection.Object.fields):\n  +0x3230 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of vector (# items)\n  +0x3234 | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x3258        | offset to table[0]\n  +0x3238 | 64 00 00 00             | UOffset32  | 0x00000064 (100) Loc: 0x329C       | offset to table[1]\n\nstring (reflection.Object.name):\n  +0x323C | 16 00 00 00             | uint32_t   | 0x00000016 (22)                    | length of string\n  +0x3240 | 4D 79 47 61 6D 65 2E 45 | char[22]   | MyGame.E                           | string literal\n  +0x3248 | 78 61 6D 70 6C 65 2E 41 |            | xample.A\n  +0x3250 | 62 69 6C 69 74 79       |            | bility\n  +0x3256 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x3258 | 24 FE FF FF             | SOffset32  | 0xFFFFFE24 (-476) Loc: 0x3434      | offset to vtable\n  +0x325C | 01 00                   | uint16_t   | 0x0001 (1)                         | table field `id` (UShort)\n  +0x325E | 04 00                   | uint16_t   | 0x0004 (4)                         | table field `offset` (UShort)\n  +0x3260 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x3274        | offset to field `name` (string)\n  +0x3264 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x3268         | offset to field `type` (table)\n\ntable (reflection.Type):\n  +0x3268 | D4 F9 FF FF             | SOffset32  | 0xFFFFF9D4 (-1580) Loc: 0x3894     | offset to vtable\n  +0x326C | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x326F | 08                      | uint8_t    | 0x08 (8)                           | table field `base_type` (Byte)\n  +0x3270 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x3274 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | length of string\n  +0x3278 | 64 69 73 74 61 6E 63 65 | char[8]    | distance                           | string literal\n  +0x3280 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x3281 | 00 00 00                | uint8_t[3] | ...                                | padding\n\nvtable (reflection.Field):\n  +0x3284 | 18 00                   | uint16_t   | 0x0018 (24)                        | size of this vtable\n  +0x3286 | 14 00                   | uint16_t   | 0x0014 (20)                        | size of referring table\n  +0x3288 | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `name` (id: 0)\n  +0x328A | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `type` (id: 1)\n  +0x328C | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `id` (id: 2) <defaults to 0> (UShort)\n  +0x328E | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `offset` (id: 3) <defaults to 0> (UShort)\n  +0x3290 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `default_integer` (id: 4) <defaults to 0> (Long)\n  +0x3292 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `default_real` (id: 5) <defaults to 0.000000> (Double)\n  +0x3294 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `deprecated` (id: 6) <defaults to 0> (Bool)\n  +0x3296 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `required` (id: 7) <defaults to 0> (Bool)\n  +0x3298 | 07 00                   | VOffset16  | 0x0007 (7)                         | offset to field `key` (id: 8)\n  +0x329A | 10 00                   | VOffset16  | 0x0010 (16)                        | offset to field `attributes` (id: 9)\n\ntable (reflection.Field):\n  +0x329C | 18 00 00 00             | SOffset32  | 0x00000018 (24) Loc: 0x3284        | offset to vtable\n  +0x32A0 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x32A3 | 01                      | uint8_t    | 0x01 (1)                           | table field `key` (Bool)\n  +0x32A4 | 3C 00 00 00             | UOffset32  | 0x0000003C (60) Loc: 0x32E0        | offset to field `name` (string)\n  +0x32A8 | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x32D4        | offset to field `type` (table)\n  +0x32AC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x32B0         | offset to field `attributes` (vector)\n\nvector (reflection.Field.attributes):\n  +0x32B0 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x32B4 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x32B8         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x32B8 | 38 FA FF FF             | SOffset32  | 0xFFFFFA38 (-1480) Loc: 0x3880     | offset to vtable\n  +0x32BC | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x32CC        | offset to field `key` (string)\n  +0x32C0 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x32C4         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x32C4 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x32C8 | 30                      | char[1]    | 0                                  | string literal\n  +0x32C9 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x32CA | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x32CC | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | length of string\n  +0x32D0 | 6B 65 79                | char[3]    | key                                | string literal\n  +0x32D3 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Type):\n  +0x32D4 | 40 FA FF FF             | SOffset32  | 0xFFFFFA40 (-1472) Loc: 0x3894     | offset to vtable\n  +0x32D8 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x32DB | 08                      | uint8_t    | 0x08 (8)                           | table field `base_type` (Byte)\n  +0x32DC | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x32E0 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of string\n  +0x32E4 | 69 64                   | char[2]    | id                                 | string literal\n  +0x32E6 | 00                      | char       | 0x00 (0)                           | string terminator\n\nvtable (reflection.Object):\n  +0x32E8 | 14 00                   | uint16_t   | 0x0014 (20)                        | size of this vtable\n  +0x32EA | 20 00                   | uint16_t   | 0x0020 (32)                        | size of referring table\n  +0x32EC | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `name` (id: 0)\n  +0x32EE | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `fields` (id: 1)\n  +0x32F0 | 07 00                   | VOffset16  | 0x0007 (7)                         | offset to field `is_struct` (id: 2)\n  +0x32F2 | 10 00                   | VOffset16  | 0x0010 (16)                        | offset to field `minalign` (id: 3)\n  +0x32F4 | 14 00                   | VOffset16  | 0x0014 (20)                        | offset to field `bytesize` (id: 4)\n  +0x32F6 | 18 00                   | VOffset16  | 0x0018 (24)                        | offset to field `attributes` (id: 5)\n  +0x32F8 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `documentation` (id: 6) <null> (Vector)\n  +0x32FA | 1C 00                   | VOffset16  | 0x001C (28)                        | offset to field `declaration_file` (id: 7)\n\ntable (reflection.Object):\n  +0x32FC | 14 00 00 00             | SOffset32  | 0x00000014 (20) Loc: 0x32E8        | offset to vtable\n  +0x3300 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x3303 | 01                      | uint8_t    | 0x01 (1)                           | table field `is_struct` (Bool)\n  +0x3304 | 60 00 00 00             | UOffset32  | 0x00000060 (96) Loc: 0x3364        | offset to field `name` (string)\n  +0x3308 | 40 00 00 00             | UOffset32  | 0x00000040 (64) Loc: 0x3348        | offset to field `fields` (vector)\n  +0x330C | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | table field `minalign` (Int)\n  +0x3310 | 20 00 00 00             | uint32_t   | 0x00000020 (32)                    | table field `bytesize` (Int)\n  +0x3314 | 08 00 00 00             | UOffset32  | 0x00000008 (8) Loc: 0x331C         | offset to field `attributes` (vector)\n  +0x3318 | 84 03 00 00             | UOffset32  | 0x00000384 (900) Loc: 0x369C       | offset to field `declaration_file` (string)\n\nvector (reflection.Object.attributes):\n  +0x331C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x3320 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x3324         | offset to table[0]\n\ntable (reflection.KeyValue):\n  +0x3324 | A4 FA FF FF             | SOffset32  | 0xFFFFFAA4 (-1372) Loc: 0x3880     | offset to vtable\n  +0x3328 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x3338        | offset to field `key` (string)\n  +0x332C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x3330         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x3330 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x3334 | 38                      | char[1]    | 8                                  | string literal\n  +0x3335 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x3336 | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x3338 | 0B 00 00 00             | uint32_t   | 0x0000000B (11)                    | length of string\n  +0x333C | 66 6F 72 63 65 5F 61 6C | char[11]   | force_al                           | string literal\n  +0x3344 | 69 67 6E                |            | ign\n  +0x3347 | 00                      | char       | 0x00 (0)                           | string terminator\n\nvector (reflection.Object.fields):\n  +0x3348 | 06 00 00 00             | uint32_t   | 0x00000006 (6)                     | length of vector (# items)\n  +0x334C | 94 00 00 00             | UOffset32  | 0x00000094 (148) Loc: 0x33E0       | offset to table[0]\n  +0x3350 | 5C 00 00 00             | UOffset32  | 0x0000005C (92) Loc: 0x33AC        | offset to table[1]\n  +0x3354 | 28 00 00 00             | UOffset32  | 0x00000028 (40) Loc: 0x337C        | offset to table[2]\n  +0x3358 | 0C 01 00 00             | UOffset32  | 0x0000010C (268) Loc: 0x3464       | offset to table[3]\n  +0x335C | E4 00 00 00             | UOffset32  | 0x000000E4 (228) Loc: 0x3440       | offset to table[4]\n  +0x3360 | AC 00 00 00             | UOffset32  | 0x000000AC (172) Loc: 0x340C       | offset to table[5]\n\nstring (reflection.Object.name):\n  +0x3364 | 13 00 00 00             | uint32_t   | 0x00000013 (19)                    | length of string\n  +0x3368 | 4D 79 47 61 6D 65 2E 45 | char[19]   | MyGame.E                           | string literal\n  +0x3370 | 78 61 6D 70 6C 65 2E 56 |            | xample.V\n  +0x3378 | 65 63 33                |            | ec3\n  +0x337B | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x337C | A6 FD FF FF             | SOffset32  | 0xFFFFFDA6 (-602) Loc: 0x35D6      | offset to vtable\n  +0x3380 | 00 00                   | uint8_t[2] | ..                                 | padding\n  +0x3382 | 05 00                   | uint16_t   | 0x0005 (5)                         | table field `id` (UShort)\n  +0x3384 | 1A 00                   | uint16_t   | 0x001A (26)                        | table field `offset` (UShort)\n  +0x3386 | 02 00                   | uint16_t   | 0x0002 (2)                         | table field `padding` (UShort)\n  +0x3388 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x33A0        | offset to field `name` (string)\n  +0x338C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x3390         | offset to field `type` (table)\n\ntable (reflection.Type):\n  +0x3390 | C0 FB FF FF             | SOffset32  | 0xFFFFFBC0 (-1088) Loc: 0x37D0     | offset to vtable\n  +0x3394 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x3397 | 0F                      | uint8_t    | 0x0F (15)                          | table field `base_type` (Byte)\n  +0x3398 | 06 00 00 00             | uint32_t   | 0x00000006 (6)                     | table field `index` (Int)\n  +0x339C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x33A0 | 05 00 00 00             | uint32_t   | 0x00000005 (5)                     | length of string\n  +0x33A4 | 74 65 73 74 33          | char[5]    | test3                              | string literal\n  +0x33A9 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x33AA | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Field):\n  +0x33AC | D6 FD FF FF             | SOffset32  | 0xFFFFFDD6 (-554) Loc: 0x35D6      | offset to vtable\n  +0x33B0 | 00 00                   | uint8_t[2] | ..                                 | padding\n  +0x33B2 | 04 00                   | uint16_t   | 0x0004 (4)                         | table field `id` (UShort)\n  +0x33B4 | 18 00                   | uint16_t   | 0x0018 (24)                        | table field `offset` (UShort)\n  +0x33B6 | 01 00                   | uint16_t   | 0x0001 (1)                         | table field `padding` (UShort)\n  +0x33B8 | 1C 00 00 00             | UOffset32  | 0x0000001C (28) Loc: 0x33D4        | offset to field `name` (string)\n  +0x33BC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x33C0         | offset to field `type` (table)\n\ntable (reflection.Type):\n  +0x33C0 | 5C FE FF FF             | SOffset32  | 0xFFFFFE5C (-420) Loc: 0x3564      | offset to vtable\n  +0x33C4 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x33C7 | 04                      | uint8_t    | 0x04 (4)                           | table field `base_type` (Byte)\n  +0x33C8 | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | table field `index` (Int)\n  +0x33CC | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x33D0 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x33D4 | 05 00 00 00             | uint32_t   | 0x00000005 (5)                     | length of string\n  +0x33D8 | 74 65 73 74 32          | char[5]    | test2                              | string literal\n  +0x33DD | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x33DE | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Field):\n  +0x33E0 | AC FF FF FF             | SOffset32  | 0xFFFFFFAC (-84) Loc: 0x3434       | offset to vtable\n  +0x33E4 | 03 00                   | uint16_t   | 0x0003 (3)                         | table field `id` (UShort)\n  +0x33E6 | 10 00                   | uint16_t   | 0x0010 (16)                        | table field `offset` (UShort)\n  +0x33E8 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x3400        | offset to field `name` (string)\n  +0x33EC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x33F0         | offset to field `type` (table)\n\ntable (reflection.Type):\n  +0x33F0 | C4 FD FF FF             | SOffset32  | 0xFFFFFDC4 (-572) Loc: 0x362C      | offset to vtable\n  +0x33F4 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x33F7 | 0C                      | uint8_t    | 0x0C (12)                          | table field `base_type` (Byte)\n  +0x33F8 | 08 00 00 00             | uint32_t   | 0x00000008 (8)                     | table field `base_size` (UInt)\n  +0x33FC | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x3400 | 05 00 00 00             | uint32_t   | 0x00000005 (5)                     | length of string\n  +0x3404 | 74 65 73 74 31          | char[5]    | test1                              | string literal\n  +0x3409 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x340A | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Field):\n  +0x340C | 36 FE FF FF             | SOffset32  | 0xFFFFFE36 (-458) Loc: 0x35D6      | offset to vtable\n  +0x3410 | 00 00                   | uint8_t[2] | ..                                 | padding\n  +0x3412 | 02 00                   | uint16_t   | 0x0002 (2)                         | table field `id` (UShort)\n  +0x3414 | 08 00                   | uint16_t   | 0x0008 (8)                         | table field `offset` (UShort)\n  +0x3416 | 04 00                   | uint16_t   | 0x0004 (4)                         | table field `padding` (UShort)\n  +0x3418 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x342C        | offset to field `name` (string)\n  +0x341C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x3420         | offset to field `type` (table)\n\ntable (reflection.Type):\n  +0x3420 | 8C FB FF FF             | SOffset32  | 0xFFFFFB8C (-1140) Loc: 0x3894     | offset to vtable\n  +0x3424 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x3427 | 0B                      | uint8_t    | 0x0B (11)                          | table field `base_type` (Byte)\n  +0x3428 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x342C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x3430 | 7A                      | char[1]    | z                                  | string literal\n  +0x3431 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x3432 | 00 00                   | uint8_t[2] | ..                                 | padding\n\nvtable (reflection.Field):\n  +0x3434 | 0C 00                   | uint16_t   | 0x000C (12)                        | size of this vtable\n  +0x3436 | 10 00                   | uint16_t   | 0x0010 (16)                        | size of referring table\n  +0x3438 | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `name` (id: 0)\n  +0x343A | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `type` (id: 1)\n  +0x343C | 04 00                   | VOffset16  | 0x0004 (4)                         | offset to field `id` (id: 2)\n  +0x343E | 06 00                   | VOffset16  | 0x0006 (6)                         | offset to field `offset` (id: 3)\n\ntable (reflection.Field):\n  +0x3440 | 0C 00 00 00             | SOffset32  | 0x0000000C (12) Loc: 0x3434        | offset to vtable\n  +0x3444 | 01 00                   | uint16_t   | 0x0001 (1)                         | table field `id` (UShort)\n  +0x3446 | 04 00                   | uint16_t   | 0x0004 (4)                         | table field `offset` (UShort)\n  +0x3448 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x345C        | offset to field `name` (string)\n  +0x344C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x3450         | offset to field `type` (table)\n\ntable (reflection.Type):\n  +0x3450 | BC FB FF FF             | SOffset32  | 0xFFFFFBBC (-1092) Loc: 0x3894     | offset to vtable\n  +0x3454 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x3457 | 0B                      | uint8_t    | 0x0B (11)                          | table field `base_type` (Byte)\n  +0x3458 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x345C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x3460 | 79                      | char[1]    | y                                  | string literal\n  +0x3461 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x3462 | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Field):\n  +0x3464 | E4 FB FF FF             | SOffset32  | 0xFFFFFBE4 (-1052) Loc: 0x3880     | offset to vtable\n  +0x3468 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x347C        | offset to field `name` (string)\n  +0x346C | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x3470         | offset to field `type` (table)\n\ntable (reflection.Type):\n  +0x3470 | DC FB FF FF             | SOffset32  | 0xFFFFFBDC (-1060) Loc: 0x3894     | offset to vtable\n  +0x3474 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x3477 | 0B                      | uint8_t    | 0x0B (11)                          | table field `base_type` (Byte)\n  +0x3478 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x347C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x3480 | 78                      | char[1]    | x                                  | string literal\n  +0x3481 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x3482 | 00 00                   | uint8_t[2] | ..                                 | padding\n\nvtable (reflection.Object):\n  +0x3484 | 14 00                   | uint16_t   | 0x0014 (20)                        | size of this vtable\n  +0x3486 | 18 00                   | uint16_t   | 0x0018 (24)                        | size of referring table\n  +0x3488 | 04 00                   | VOffset16  | 0x0004 (4)                         | offset to field `name` (id: 0)\n  +0x348A | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `fields` (id: 1)\n  +0x348C | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `is_struct` (id: 2) <defaults to 0> (Bool)\n  +0x348E | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `minalign` (id: 3)\n  +0x3490 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `bytesize` (id: 4) <defaults to 0> (Int)\n  +0x3492 | 10 00                   | VOffset16  | 0x0010 (16)                        | offset to field `attributes` (id: 5)\n  +0x3494 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `documentation` (id: 6) <null> (Vector)\n  +0x3496 | 14 00                   | VOffset16  | 0x0014 (20)                        | offset to field `declaration_file` (id: 7)\n\ntable (reflection.Object):\n  +0x3498 | 14 00 00 00             | SOffset32  | 0x00000014 (20) Loc: 0x3484        | offset to vtable\n  +0x349C | 70 00 00 00             | UOffset32  | 0x00000070 (112) Loc: 0x350C       | offset to field `name` (string)\n  +0x34A0 | 64 00 00 00             | UOffset32  | 0x00000064 (100) Loc: 0x3504       | offset to field `fields` (vector)\n  +0x34A4 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `minalign` (Int)\n  +0x34A8 | 08 00 00 00             | UOffset32  | 0x00000008 (8) Loc: 0x34B0         | offset to field `attributes` (vector)\n  +0x34AC | F0 01 00 00             | UOffset32  | 0x000001F0 (496) Loc: 0x369C       | offset to field `declaration_file` (string)\n\nvector (reflection.Object.attributes):\n  +0x34B0 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of vector (# items)\n  +0x34B4 | 28 00 00 00             | UOffset32  | 0x00000028 (40) Loc: 0x34DC        | offset to table[0]\n  +0x34B8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x34BC         | offset to table[1]\n\ntable (reflection.KeyValue):\n  +0x34BC | 3C FC FF FF             | SOffset32  | 0xFFFFFC3C (-964) Loc: 0x3880      | offset to vtable\n  +0x34C0 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x34D0        | offset to field `key` (string)\n  +0x34C4 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x34C8         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x34C8 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x34CC | 30                      | char[1]    | 0                                  | string literal\n  +0x34CD | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x34CE | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x34D0 | 07 00 00 00             | uint32_t   | 0x00000007 (7)                     | length of string\n  +0x34D4 | 70 72 69 76 61 74 65    | char[7]    | private                            | string literal\n  +0x34DB | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.KeyValue):\n  +0x34DC | 5C FC FF FF             | SOffset32  | 0xFFFFFC5C (-932) Loc: 0x3880      | offset to vtable\n  +0x34E0 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x34F0        | offset to field `key` (string)\n  +0x34E4 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x34E8         | offset to field `value` (string)\n\nstring (reflection.KeyValue.value):\n  +0x34E8 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x34EC | 30                      | char[1]    | 0                                  | string literal\n  +0x34ED | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x34EE | 00 00                   | uint8_t[2] | ..                                 | padding\n\nstring (reflection.KeyValue.key):\n  +0x34F0 | 0E 00 00 00             | uint32_t   | 0x0000000E (14)                    | length of string\n  +0x34F4 | 63 73 68 61 72 70 5F 70 | char[14]   | csharp_p                           | string literal\n  +0x34FC | 61 72 74 69 61 6C       |            | artial\n  +0x3502 | 00                      | char       | 0x00 (0)                           | string terminator\n\nvector (reflection.Object.fields):\n  +0x3504 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x3508 | 40 00 00 00             | UOffset32  | 0x00000040 (64) Loc: 0x3548        | offset to table[0]\n\nstring (reflection.Object.name):\n  +0x350C | 26 00 00 00             | uint32_t   | 0x00000026 (38)                    | length of string\n  +0x3510 | 4D 79 47 61 6D 65 2E 45 | char[38]   | MyGame.E                           | string literal\n  +0x3518 | 78 61 6D 70 6C 65 2E 54 |            | xample.T\n  +0x3520 | 65 73 74 53 69 6D 70 6C |            | estSimpl\n  +0x3528 | 65 54 61 62 6C 65 57 69 |            | eTableWi\n  +0x3530 | 74 68 45 6E 75 6D       |            | thEnum\n  +0x3536 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x3537 | 00 00 00                | uint8_t[3] | ...                                | padding\n\nvtable (reflection.Field):\n  +0x353A | 0E 00                   | uint16_t   | 0x000E (14)                        | size of this vtable\n  +0x353C | 1C 00                   | uint16_t   | 0x001C (28)                        | size of referring table\n  +0x353E | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `name` (id: 0)\n  +0x3540 | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `type` (id: 1)\n  +0x3542 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `id` (id: 2) <defaults to 0> (UShort)\n  +0x3544 | 06 00                   | VOffset16  | 0x0006 (6)                         | offset to field `offset` (id: 3)\n  +0x3546 | 10 00                   | VOffset16  | 0x0010 (16)                        | offset to field `default_integer` (id: 4)\n\ntable (reflection.Field):\n  +0x3548 | 0E 00 00 00             | SOffset32  | 0x0000000E (14) Loc: 0x353A        | offset to vtable\n  +0x354C | 00 00                   | uint8_t[2] | ..                                 | padding\n  +0x354E | 04 00                   | uint16_t   | 0x0004 (4)                         | table field `offset` (UShort)\n  +0x3550 | 38 00 00 00             | UOffset32  | 0x00000038 (56) Loc: 0x3588        | offset to field `name` (string)\n  +0x3554 | 20 00 00 00             | UOffset32  | 0x00000020 (32) Loc: 0x3574        | offset to field `type` (table)\n  +0x3558 | 02 00 00 00 00 00 00 00 | int64_t    | 0x0000000000000002 (2)             | table field `default_integer` (Long)\n  +0x3560 | 00 00 00 00             | uint8_t[4] | ....                               | padding\n\nvtable (reflection.Type):\n  +0x3564 | 10 00                   | uint16_t   | 0x0010 (16)                        | size of this vtable\n  +0x3566 | 14 00                   | uint16_t   | 0x0014 (20)                        | size of referring table\n  +0x3568 | 07 00                   | VOffset16  | 0x0007 (7)                         | offset to field `base_type` (id: 0)\n  +0x356A | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `element` (id: 1) <defaults to 0> (Byte)\n  +0x356C | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `index` (id: 2)\n  +0x356E | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `fixed_length` (id: 3) <defaults to 0> (UShort)\n  +0x3570 | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `base_size` (id: 4)\n  +0x3572 | 10 00                   | VOffset16  | 0x0010 (16)                        | offset to field `element_size` (id: 5)\n\ntable (reflection.Type):\n  +0x3574 | 10 00 00 00             | SOffset32  | 0x00000010 (16) Loc: 0x3564        | offset to vtable\n  +0x3578 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x357B | 04                      | uint8_t    | 0x04 (4)                           | table field `base_type` (Byte)\n  +0x357C | 03 00 00 00             | uint32_t   | 0x00000003 (3)                     | table field `index` (Int)\n  +0x3580 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x3584 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x3588 | 05 00 00 00             | uint32_t   | 0x00000005 (5)                     | length of string\n  +0x358C | 63 6F 6C 6F 72          | char[5]    | color                              | string literal\n  +0x3591 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x3592 | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Object):\n  +0x3594 | 9C FD FF FF             | SOffset32  | 0xFFFFFD9C (-612) Loc: 0x37F8      | offset to vtable\n  +0x3598 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x359B | 01                      | uint8_t    | 0x01 (1)                           | table field `is_struct` (Bool)\n  +0x359C | 20 00 00 00             | UOffset32  | 0x00000020 (32) Loc: 0x35BC        | offset to field `name` (string)\n  +0x35A0 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x35B0        | offset to field `fields` (vector)\n  +0x35A4 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | table field `minalign` (Int)\n  +0x35A8 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | table field `bytesize` (Int)\n  +0x35AC | F0 00 00 00             | UOffset32  | 0x000000F0 (240) Loc: 0x369C       | offset to field `declaration_file` (string)\n\nvector (reflection.Object.fields):\n  +0x35B0 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | length of vector (# items)\n  +0x35B4 | 6C 00 00 00             | UOffset32  | 0x0000006C (108) Loc: 0x3620       | offset to table[0]\n  +0x35B8 | 3C 00 00 00             | UOffset32  | 0x0000003C (60) Loc: 0x35F4        | offset to table[1]\n\nstring (reflection.Object.name):\n  +0x35BC | 13 00 00 00             | uint32_t   | 0x00000013 (19)                    | length of string\n  +0x35C0 | 4D 79 47 61 6D 65 2E 45 | char[19]   | MyGame.E                           | string literal\n  +0x35C8 | 78 61 6D 70 6C 65 2E 54 |            | xample.T\n  +0x35D0 | 65 73 74                |            | est\n  +0x35D3 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x35D4 | 00 00                   | uint8_t[2] | ..                                 | padding\n\nvtable (reflection.Field):\n  +0x35D6 | 1E 00                   | uint16_t   | 0x001E (30)                        | size of this vtable\n  +0x35D8 | 14 00                   | uint16_t   | 0x0014 (20)                        | size of referring table\n  +0x35DA | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `name` (id: 0)\n  +0x35DC | 10 00                   | VOffset16  | 0x0010 (16)                        | offset to field `type` (id: 1)\n  +0x35DE | 06 00                   | VOffset16  | 0x0006 (6)                         | offset to field `id` (id: 2)\n  +0x35E0 | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `offset` (id: 3)\n  +0x35E2 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `default_integer` (id: 4) <defaults to 0> (Long)\n  +0x35E4 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `default_real` (id: 5) <defaults to 0.000000> (Double)\n  +0x35E6 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `deprecated` (id: 6) <defaults to 0> (Bool)\n  +0x35E8 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `required` (id: 7) <defaults to 0> (Bool)\n  +0x35EA | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `key` (id: 8) <defaults to 0> (Bool)\n  +0x35EC | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `attributes` (id: 9) <null> (Vector)\n  +0x35EE | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `documentation` (id: 10) <null> (Vector)\n  +0x35F0 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `optional` (id: 11) <defaults to 0> (Bool)\n  +0x35F2 | 0A 00                   | VOffset16  | 0x000A (10)                        | offset to field `padding` (id: 12)\n\ntable (reflection.Field):\n  +0x35F4 | 1E 00 00 00             | SOffset32  | 0x0000001E (30) Loc: 0x35D6        | offset to vtable\n  +0x35F8 | 00 00                   | uint8_t[2] | ..                                 | padding\n  +0x35FA | 01 00                   | uint16_t   | 0x0001 (1)                         | table field `id` (UShort)\n  +0x35FC | 02 00                   | uint16_t   | 0x0002 (2)                         | table field `offset` (UShort)\n  +0x35FE | 01 00                   | uint16_t   | 0x0001 (1)                         | table field `padding` (UShort)\n  +0x3600 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x3618        | offset to field `name` (string)\n  +0x3604 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x3608         | offset to field `type` (table)\n\ntable (reflection.Type):\n  +0x3608 | DC FF FF FF             | SOffset32  | 0xFFFFFFDC (-36) Loc: 0x362C       | offset to vtable\n  +0x360C | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x360F | 03                      | uint8_t    | 0x03 (3)                           | table field `base_type` (Byte)\n  +0x3610 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `base_size` (UInt)\n  +0x3614 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x3618 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x361C | 62                      | char[1]    | b                                  | string literal\n  +0x361D | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x361E | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Field):\n  +0x3620 | A0 FD FF FF             | SOffset32  | 0xFFFFFDA0 (-608) Loc: 0x3880      | offset to vtable\n  +0x3624 | 28 00 00 00             | UOffset32  | 0x00000028 (40) Loc: 0x364C        | offset to field `name` (string)\n  +0x3628 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x363C        | offset to field `type` (table)\n\nvtable (reflection.Type):\n  +0x362C | 10 00                   | uint16_t   | 0x0010 (16)                        | size of this vtable\n  +0x362E | 10 00                   | uint16_t   | 0x0010 (16)                        | size of referring table\n  +0x3630 | 07 00                   | VOffset16  | 0x0007 (7)                         | offset to field `base_type` (id: 0)\n  +0x3632 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `element` (id: 1) <defaults to 0> (Byte)\n  +0x3634 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `index` (id: 2) <defaults to -1> (Int)\n  +0x3636 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `fixed_length` (id: 3) <defaults to 0> (UShort)\n  +0x3638 | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `base_size` (id: 4)\n  +0x363A | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `element_size` (id: 5)\n\ntable (reflection.Type):\n  +0x363C | 10 00 00 00             | SOffset32  | 0x00000010 (16) Loc: 0x362C        | offset to vtable\n  +0x3640 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x3643 | 05                      | uint8_t    | 0x05 (5)                           | table field `base_type` (Byte)\n  +0x3644 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                     | table field `base_size` (UInt)\n  +0x3648 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x364C | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x3650 | 61                      | char[1]    | a                                  | string literal\n  +0x3651 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x3652 | 00 00                   | uint8_t[2] | ..                                 | padding\n\ntable (reflection.Object):\n  +0x3654 | 04 FF FF FF             | SOffset32  | 0xFFFFFF04 (-252) Loc: 0x3750      | offset to vtable\n  +0x3658 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x366C        | offset to field `name` (string)\n  +0x365C | 0C 00 00 00             | UOffset32  | 0x0000000C (12) Loc: 0x3668        | offset to field `fields` (vector)\n  +0x3660 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `minalign` (Int)\n  +0x3664 | 38 00 00 00             | UOffset32  | 0x00000038 (56) Loc: 0x369C        | offset to field `declaration_file` (string)\n\nvector (reflection.Object.fields):\n  +0x3668 | 00 00 00 00             | uint32_t   | 0x00000000 (0)                     | length of vector (# items)\n\nstring (reflection.Object.name):\n  +0x366C | 17 00 00 00             | uint32_t   | 0x00000017 (23)                    | length of string\n  +0x3670 | 4D 79 47 61 6D 65 2E 45 | char[23]   | MyGame.E                           | string literal\n  +0x3678 | 78 61 6D 70 6C 65 32 2E |            | xample2.\n  +0x3680 | 4D 6F 6E 73 74 65 72    |            | Monster\n  +0x3687 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Object):\n  +0x3688 | 38 FF FF FF             | SOffset32  | 0xFFFFFF38 (-200) Loc: 0x3750      | offset to vtable\n  +0x368C | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x36B8        | offset to field `name` (string)\n  +0x3690 | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x36B4        | offset to field `fields` (vector)\n  +0x3694 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `minalign` (Int)\n  +0x3698 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x369C         | offset to field `declaration_file` (string)\n\nstring (reflection.Object.declaration_file):\n  +0x369C | 12 00 00 00             | uint32_t   | 0x00000012 (18)                    | length of string\n  +0x36A0 | 2F 2F 6D 6F 6E 73 74 65 | char[18]   | //monste                           | string literal\n  +0x36A8 | 72 5F 74 65 73 74 2E 66 |            | r_test.f\n  +0x36B0 | 62 73                   |            | bs\n  +0x36B2 | 00                      | char       | 0x00 (0)                           | string terminator\n\nvector (reflection.Object.fields):\n  +0x36B4 | 00 00 00 00             | uint32_t   | 0x00000000 (0)                     | length of vector (# items)\n\nstring (reflection.Object.name):\n  +0x36B8 | 18 00 00 00             | uint32_t   | 0x00000018 (24)                    | length of string\n  +0x36BC | 4D 79 47 61 6D 65 2E 49 | char[24]   | MyGame.I                           | string literal\n  +0x36C4 | 6E 50 61 72 65 6E 74 4E |            | nParentN\n  +0x36CC | 61 6D 65 73 70 61 63 65 |            | amespace\n  +0x36D4 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x36D5 | 00 00 00                | uint8_t[3] | ...                                | padding\n\ntable (reflection.Object):\n  +0x36D8 | 88 FF FF FF             | SOffset32  | 0xFFFFFF88 (-120) Loc: 0x3750      | offset to vtable\n  +0x36DC | 40 00 00 00             | UOffset32  | 0x00000040 (64) Loc: 0x371C        | offset to field `name` (string)\n  +0x36E0 | 34 00 00 00             | UOffset32  | 0x00000034 (52) Loc: 0x3714        | offset to field `fields` (vector)\n  +0x36E4 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `minalign` (Int)\n  +0x36E8 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x36EC         | offset to field `declaration_file` (string)\n\nstring (reflection.Object.declaration_file):\n  +0x36EC | 20 00 00 00             | uint32_t   | 0x00000020 (32)                    | length of string\n  +0x36F0 | 2F 2F 69 6E 63 6C 75 64 | char[32]   | //includ                           | string literal\n  +0x36F8 | 65 5F 74 65 73 74 2F 69 |            | e_test/i\n  +0x3700 | 6E 63 6C 75 64 65 5F 74 |            | nclude_t\n  +0x3708 | 65 73 74 31 2E 66 62 73 |            | est1.fbs\n  +0x3710 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x3711 | 00 00 00                | uint8_t[3] | ...                                | padding\n\nvector (reflection.Object.fields):\n  +0x3714 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x3718 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x3728        | offset to table[0]\n\nstring (reflection.Object.name):\n  +0x371C | 06 00 00 00             | uint32_t   | 0x00000006 (6)                     | length of string\n  +0x3720 | 54 61 62 6C 65 41       | char[6]    | TableA                             | string literal\n  +0x3726 | 00                      | char       | 0x00 (0)                           | string terminator\n\ntable (reflection.Field):\n  +0x3728 | 84 FF FF FF             | SOffset32  | 0xFFFFFF84 (-124) Loc: 0x37A4      | offset to vtable\n  +0x372C | 00                      | uint8_t[1] | .                                  | padding\n  +0x372D | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x372E | 04 00                   | uint16_t   | 0x0004 (4)                         | table field `offset` (UShort)\n  +0x3730 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x3748        | offset to field `name` (string)\n  +0x3734 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x3738         | offset to field `type` (table)\n\ntable (reflection.Type):\n  +0x3738 | 68 FF FF FF             | SOffset32  | 0xFFFFFF68 (-152) Loc: 0x37D0      | offset to vtable\n  +0x373C | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x373F | 0F                      | uint8_t    | 0x0F (15)                          | table field `base_type` (Byte)\n  +0x3740 | 0C 00 00 00             | uint32_t   | 0x0000000C (12)                    | table field `index` (Int)\n  +0x3744 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x3748 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x374C | 62                      | char[1]    | b                                  | string literal\n  +0x374D | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x374E | 00 00                   | uint8_t[2] | ..                                 | padding\n\nvtable (reflection.Object):\n  +0x3750 | 14 00                   | uint16_t   | 0x0014 (20)                        | size of this vtable\n  +0x3752 | 14 00                   | uint16_t   | 0x0014 (20)                        | size of referring table\n  +0x3754 | 04 00                   | VOffset16  | 0x0004 (4)                         | offset to field `name` (id: 0)\n  +0x3756 | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `fields` (id: 1)\n  +0x3758 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `is_struct` (id: 2) <defaults to 0> (Bool)\n  +0x375A | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `minalign` (id: 3)\n  +0x375C | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `bytesize` (id: 4) <defaults to 0> (Int)\n  +0x375E | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `attributes` (id: 5) <null> (Vector)\n  +0x3760 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `documentation` (id: 6) <null> (Vector)\n  +0x3762 | 10 00                   | VOffset16  | 0x0010 (16)                        | offset to field `declaration_file` (id: 7)\n\ntable (reflection.Object):\n  +0x3764 | 14 00 00 00             | SOffset32  | 0x00000014 (20) Loc: 0x3750        | offset to vtable\n  +0x3768 | 18 00 00 00             | UOffset32  | 0x00000018 (24) Loc: 0x3780        | offset to field `name` (string)\n  +0x376C | 0C 00 00 00             | UOffset32  | 0x0000000C (12) Loc: 0x3778        | offset to field `fields` (vector)\n  +0x3770 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `minalign` (Int)\n  +0x3774 | B4 00 00 00             | UOffset32  | 0x000000B4 (180) Loc: 0x3828       | offset to field `declaration_file` (string)\n\nvector (reflection.Object.fields):\n  +0x3778 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x377C | 44 00 00 00             | UOffset32  | 0x00000044 (68) Loc: 0x37C0        | offset to table[0]\n\nstring (reflection.Object.name):\n  +0x3780 | 1C 00 00 00             | uint32_t   | 0x0000001C (28)                    | length of string\n  +0x3784 | 4D 79 47 61 6D 65 2E 4F | char[28]   | MyGame.O                           | string literal\n  +0x378C | 74 68 65 72 4E 61 6D 65 |            | therName\n  +0x3794 | 53 70 61 63 65 2E 54 61 |            | Space.Ta\n  +0x379C | 62 6C 65 42             |            | bleB\n  +0x37A0 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x37A1 | 00 00 00                | uint8_t[3] | ...                                | padding\n\nvtable (reflection.Field):\n  +0x37A4 | 1C 00                   | uint16_t   | 0x001C (28)                        | size of this vtable\n  +0x37A6 | 10 00                   | uint16_t   | 0x0010 (16)                        | size of referring table\n  +0x37A8 | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `name` (id: 0)\n  +0x37AA | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `type` (id: 1)\n  +0x37AC | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `id` (id: 2) <defaults to 0> (UShort)\n  +0x37AE | 06 00                   | VOffset16  | 0x0006 (6)                         | offset to field `offset` (id: 3)\n  +0x37B0 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `default_integer` (id: 4) <defaults to 0> (Long)\n  +0x37B2 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `default_real` (id: 5) <defaults to 0.000000> (Double)\n  +0x37B4 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `deprecated` (id: 6) <defaults to 0> (Bool)\n  +0x37B6 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `required` (id: 7) <defaults to 0> (Bool)\n  +0x37B8 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `key` (id: 8) <defaults to 0> (Bool)\n  +0x37BA | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `attributes` (id: 9) <null> (Vector)\n  +0x37BC | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `documentation` (id: 10) <null> (Vector)\n  +0x37BE | 05 00                   | VOffset16  | 0x0005 (5)                         | offset to field `optional` (id: 11)\n\ntable (reflection.Field):\n  +0x37C0 | 1C 00 00 00             | SOffset32  | 0x0000001C (28) Loc: 0x37A4        | offset to vtable\n  +0x37C4 | 00                      | uint8_t[1] | .                                  | padding\n  +0x37C5 | 01                      | uint8_t    | 0x01 (1)                           | table field `optional` (Bool)\n  +0x37C6 | 04 00                   | uint16_t   | 0x0004 (4)                         | table field `offset` (UShort)\n  +0x37C8 | 28 00 00 00             | UOffset32  | 0x00000028 (40) Loc: 0x37F0        | offset to field `name` (string)\n  +0x37CC | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x37E0        | offset to field `type` (table)\n\nvtable (reflection.Type):\n  +0x37D0 | 10 00                   | uint16_t   | 0x0010 (16)                        | size of this vtable\n  +0x37D2 | 10 00                   | uint16_t   | 0x0010 (16)                        | size of referring table\n  +0x37D4 | 07 00                   | VOffset16  | 0x0007 (7)                         | offset to field `base_type` (id: 0)\n  +0x37D6 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `element` (id: 1) <defaults to 0> (Byte)\n  +0x37D8 | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `index` (id: 2)\n  +0x37DA | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `fixed_length` (id: 3) <defaults to 0> (UShort)\n  +0x37DC | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `base_size` (id: 4) <defaults to 4> (UInt)\n  +0x37DE | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `element_size` (id: 5)\n\ntable (reflection.Type):\n  +0x37E0 | 10 00 00 00             | SOffset32  | 0x00000010 (16) Loc: 0x37D0        | offset to vtable\n  +0x37E4 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x37E7 | 0F                      | uint8_t    | 0x0F (15)                          | table field `base_type` (Byte)\n  +0x37E8 | 0E 00 00 00             | uint32_t   | 0x0000000E (14)                    | table field `index` (Int)\n  +0x37EC | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x37F0 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x37F4 | 61                      | char[1]    | a                                  | string literal\n  +0x37F5 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x37F6 | 00 00                   | uint8_t[2] | ..                                 | padding\n\nvtable (reflection.Object):\n  +0x37F8 | 14 00                   | uint16_t   | 0x0014 (20)                        | size of this vtable\n  +0x37FA | 1C 00                   | uint16_t   | 0x001C (28)                        | size of referring table\n  +0x37FC | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `name` (id: 0)\n  +0x37FE | 0C 00                   | VOffset16  | 0x000C (12)                        | offset to field `fields` (id: 1)\n  +0x3800 | 07 00                   | VOffset16  | 0x0007 (7)                         | offset to field `is_struct` (id: 2)\n  +0x3802 | 10 00                   | VOffset16  | 0x0010 (16)                        | offset to field `minalign` (id: 3)\n  +0x3804 | 14 00                   | VOffset16  | 0x0014 (20)                        | offset to field `bytesize` (id: 4)\n  +0x3806 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `attributes` (id: 5) <null> (Vector)\n  +0x3808 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `documentation` (id: 6) <null> (Vector)\n  +0x380A | 18 00                   | VOffset16  | 0x0018 (24)                        | offset to field `declaration_file` (id: 7)\n\ntable (reflection.Object):\n  +0x380C | 14 00 00 00             | SOffset32  | 0x00000014 (20) Loc: 0x37F8        | offset to vtable\n  +0x3810 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x3813 | 01                      | uint8_t    | 0x01 (1)                           | table field `is_struct` (Bool)\n  +0x3814 | 48 00 00 00             | UOffset32  | 0x00000048 (72) Loc: 0x385C        | offset to field `name` (string)\n  +0x3818 | 3C 00 00 00             | UOffset32  | 0x0000003C (60) Loc: 0x3854        | offset to field `fields` (vector)\n  +0x381C | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | table field `minalign` (Int)\n  +0x3820 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                     | table field `bytesize` (Int)\n  +0x3824 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x3828         | offset to field `declaration_file` (string)\n\nstring (reflection.Object.declaration_file):\n  +0x3828 | 24 00 00 00             | uint32_t   | 0x00000024 (36)                    | length of string\n  +0x382C | 2F 2F 69 6E 63 6C 75 64 | char[36]   | //includ                           | string literal\n  +0x3834 | 65 5F 74 65 73 74 2F 73 |            | e_test/s\n  +0x383C | 75 62 2F 69 6E 63 6C 75 |            | ub/inclu\n  +0x3844 | 64 65 5F 74 65 73 74 32 |            | de_test2\n  +0x384C | 2E 66 62 73             |            | .fbs\n  +0x3850 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x3851 | 00 00 00                | uint8_t[3] | ...                                | padding\n\nvector (reflection.Object.fields):\n  +0x3854 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of vector (# items)\n  +0x3858 | 30 00 00 00             | UOffset32  | 0x00000030 (48) Loc: 0x3888        | offset to table[0]\n\nstring (reflection.Object.name):\n  +0x385C | 1C 00 00 00             | uint32_t   | 0x0000001C (28)                    | length of string\n  +0x3860 | 4D 79 47 61 6D 65 2E 4F | char[28]   | MyGame.O                           | string literal\n  +0x3868 | 74 68 65 72 4E 61 6D 65 |            | therName\n  +0x3870 | 53 70 61 63 65 2E 55 6E |            | Space.Un\n  +0x3878 | 75 73 65 64             |            | used\n  +0x387C | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x387D | 00 00 00                | uint8_t[3] | ...                                | padding\n\nvtable (reflection.KeyValue, reflection.Field, reflection.SchemaFile):\n  +0x3880 | 08 00                   | uint16_t   | 0x0008 (8)                         | size of this vtable\n  +0x3882 | 0C 00                   | uint16_t   | 0x000C (12)                        | size of referring table\n  +0x3884 | 04 00                   | VOffset16  | 0x0004 (4)                         | offset to field `key` (id: 0)\n  +0x3886 | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `value` (id: 1)\n\ntable (reflection.Field):\n  +0x3888 | 08 00 00 00             | SOffset32  | 0x00000008 (8) Loc: 0x3880         | offset to vtable\n  +0x388C | 24 00 00 00             | UOffset32  | 0x00000024 (36) Loc: 0x38B0        | offset to field `name` (string)\n  +0x3890 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x38A4        | offset to field `type` (table)\n\nvtable (reflection.Type):\n  +0x3894 | 10 00                   | uint16_t   | 0x0010 (16)                        | size of this vtable\n  +0x3896 | 0C 00                   | uint16_t   | 0x000C (12)                        | size of referring table\n  +0x3898 | 07 00                   | VOffset16  | 0x0007 (7)                         | offset to field `base_type` (id: 0)\n  +0x389A | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `element` (id: 1) <defaults to 0> (Byte)\n  +0x389C | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `index` (id: 2) <defaults to -1> (Int)\n  +0x389E | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `fixed_length` (id: 3) <defaults to 0> (UShort)\n  +0x38A0 | 00 00                   | VOffset16  | 0x0000 (0)                         | offset to field `base_size` (id: 4) <defaults to 4> (UInt)\n  +0x38A2 | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `element_size` (id: 5)\n\ntable (reflection.Type):\n  +0x38A4 | 10 00 00 00             | SOffset32  | 0x00000010 (16) Loc: 0x3894        | offset to vtable\n  +0x38A8 | 00 00 00                | uint8_t[3] | ...                                | padding\n  +0x38AB | 07                      | uint8_t    | 0x07 (7)                           | table field `base_type` (Byte)\n  +0x38AC | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | table field `element_size` (UInt)\n\nstring (reflection.Field.name):\n  +0x38B0 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                     | length of string\n  +0x38B4 | 61                      | char[1]    | a                                  | string literal\n  +0x38B5 | 00                      | char       | 0x00 (0)                           | string terminator\n\npadding:\n  +0x38B6 | 00 00                   | uint8_t[2] | ..                                 | padding\n"
  },
  {
    "path": "tests/monster_test.cpp",
    "content": "#include \"monster_test.h\"\n\n#include <limits>\n#include <vector>\n\n#include \"flatbuffers/base.h\"\n#include \"flatbuffers/flatbuffer_builder.h\"\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/idl.h\"\n#include \"flatbuffers/registry.h\"\n#include \"flatbuffers/verifier.h\"\n#include \"is_quiet_nan.h\"\n#include \"monster_extra_generated.h\"\n#include \"monster_test_generated.h\"\n#include \"test_assert.h\"\n\nnamespace flatbuffers {\nnamespace tests {\n\n// Shortcuts for the infinity.\nstatic const auto infinity_f = std::numeric_limits<float>::infinity();\nstatic const auto infinity_d = std::numeric_limits<double>::infinity();\n\nusing namespace MyGame::Example;\n\n// example of how to build up a serialized buffer algorithmically:\nflatbuffers::DetachedBuffer CreateFlatBufferTest(std::string& buffer) {\n  flatbuffers::FlatBufferBuilder builder;\n\n  auto vec = Vec3(1, 2, 3, 0, Color_Red, Test(10, 20));\n\n  auto name = builder.CreateString(\"MyMonster\");\n\n  // Use the initializer_list specialization of CreateVector.\n  auto inventory =\n      builder.CreateVector<uint8_t>({0, 1, 2, 3, 4, 5, 6, 7, 8, 9});\n\n  // Alternatively, create the vector first, and fill in data later:\n  // unsigned char *inv_buf = nullptr;\n  // auto inventory = builder.CreateUninitializedVector<unsigned char>(\n  //                                                              10, &inv_buf);\n  // memcpy(inv_buf, inv_data, 10);\n\n  Test tests[] = {Test(10, 20), Test(30, 40)};\n  auto testv = builder.CreateVectorOfStructs(tests, 2);\n\n  // Create a vector of structures from a lambda.\n  auto testv2 = builder.CreateVectorOfStructs<Test>(\n      2, [&](size_t i, Test* s) -> void { *s = tests[i]; });\n\n  // create monster with very few fields set:\n  // (same functionality as CreateMonster below, but sets fields manually)\n  flatbuffers::Offset<Monster> mlocs[3];\n  auto fred = builder.CreateString(\"Fred\");\n  auto barney = builder.CreateString(\"Barney\");\n  auto wilma = builder.CreateString(\"Wilma\");\n  MonsterBuilder mb1(builder);\n  mb1.add_name(fred);\n  mlocs[0] = mb1.Finish();\n  MonsterBuilder mb2(builder);\n  mb2.add_name(barney);\n  mb2.add_hp(1000);\n  mlocs[1] = mb2.Finish();\n  MonsterBuilder mb3(builder);\n  mb3.add_name(wilma);\n  mlocs[2] = mb3.Finish();\n\n  // Create an array of strings. Also test string pooling, and lambdas.\n  auto vecofstrings =\n      builder.CreateVector<flatbuffers::Offset<flatbuffers::String>>(\n          4,\n          [](size_t i, flatbuffers::FlatBufferBuilder* b)\n              -> flatbuffers::Offset<flatbuffers::String> {\n            static const char* names[] = {\"bob\", \"fred\", \"bob\", \"fred\"};\n            return b->CreateSharedString(names[i]);\n          },\n          &builder);\n\n  // Creating vectors of strings in one convenient call.\n  std::vector<std::string> names2;\n  names2.push_back(\"jane\");\n  names2.push_back(\"mary\");\n  auto vecofstrings2 = builder.CreateVectorOfStrings(names2);\n\n  // Creating vectors from types that are different from std::string\n  std::vector<const char*> names3;\n  names3.push_back(\"foo\");\n  names3.push_back(\"bar\");\n  builder.CreateVectorOfStrings(names3);  // Also an accepted type\n\n#ifdef FLATBUFFERS_HAS_STRING_VIEW\n  std::vector<flatbuffers::string_view> names4;\n  names3.push_back(\"baz\");\n  names3.push_back(\"quux\");\n  builder.CreateVectorOfStrings(names4);  // Also an accepted type\n#endif\n\n  // Make sure the template deduces an initializer as std::vector<std::string>\n  builder.CreateVectorOfStrings({\"hello\", \"world\"});\n\n  // Create many vectors of strings\n  std::vector<std::string> manyNames;\n  for (auto i = 0; i < 100; i++) {\n    manyNames.push_back(\"john_doe\");\n  }\n  auto manyNamesVec = builder.CreateVectorOfStrings(manyNames);\n  TEST_EQ(false, manyNamesVec.IsNull());\n  auto manyNamesVec2 =\n      builder.CreateVectorOfStrings(manyNames.cbegin(), manyNames.cend());\n  TEST_EQ(false, manyNamesVec2.IsNull());\n\n  // Create an array of sorted tables, can be used with binary search when read:\n  auto vecoftables = builder.CreateVectorOfSortedTables(mlocs, 3);\n\n  // Create an array of sorted structs,\n  // can be used with binary search when read:\n  std::vector<Ability> abilities;\n  abilities.push_back(Ability(4, 40));\n  abilities.push_back(Ability(3, 30));\n  abilities.push_back(Ability(2, 20));\n  abilities.push_back(Ability(0, 0));\n  auto vecofstructs = builder.CreateVectorOfSortedStructs(&abilities);\n\n  flatbuffers::Offset<Stat> mlocs_stats[1];\n  auto miss = builder.CreateString(\"miss\");\n  StatBuilder mb_miss(builder);\n  mb_miss.add_id(miss);\n  mb_miss.add_val(0);\n  mb_miss.add_count(0);  // key\n  mlocs_stats[0] = mb_miss.Finish();\n  auto vec_of_stats = builder.CreateVectorOfSortedTables(mlocs_stats, 1);\n\n  // Create a nested FlatBuffer.\n  // Nested FlatBuffers are stored in a ubyte vector, which can be convenient\n  // since they can be memcpy'd around much easier than other FlatBuffer\n  // values. They have little overhead compared to storing the table directly.\n  // As a test, create a mostly empty Monster buffer:\n  flatbuffers::FlatBufferBuilder nested_builder;\n  auto nmloc = CreateMonster(nested_builder, nullptr, 0, 0,\n                             nested_builder.CreateString(\"NestedMonster\"));\n  FinishMonsterBuffer(nested_builder, nmloc);\n  // Now we can store the buffer in the parent. Note that by default, vectors\n  // are only aligned to their elements or size field, so in this case if the\n  // buffer contains 64-bit elements, they may not be correctly aligned. We fix\n  // that with:\n  builder.ForceVectorAlignment(nested_builder.GetSize(), sizeof(uint8_t),\n                               nested_builder.GetBufferMinAlignment());\n  // If for whatever reason you don't have the nested_builder available, you\n  // can substitute flatbuffers::largest_scalar_t (64-bit) for the alignment, or\n  // the largest force_align value in your schema if you're using it.\n  auto nested_flatbuffer_vector = builder.CreateVector(\n      nested_builder.GetBufferPointer(), nested_builder.GetSize());\n\n  // Test a nested FlexBuffer:\n  flexbuffers::Builder flexbuild;\n  flexbuild.Int(1234);\n  flexbuild.Finish();\n  auto flex = builder.CreateVector(flexbuild.GetBuffer());\n  // Test vector of enums.\n  Color colors[] = {Color_Blue, Color_Green};\n  // We use this special creation function because we have an array of\n  // pre-C++11 (enum class) enums whose size likely is int, yet its declared\n  // type in the schema is byte.\n  auto vecofcolors = builder.CreateVectorScalarCast<uint8_t, Color>(colors, 2);\n\n  // shortcut for creating monster with all fields set:\n  auto mloc = CreateMonster(\n      builder, &vec, 150, 80, name, inventory, Color_Blue, Any_Monster,\n      mlocs[1].Union(),  // Store a union.\n      testv, vecofstrings, vecoftables, 0, nested_flatbuffer_vector, 0, false,\n      0, 0, 0, 0, 0, 0, 0, 0, 0, 3.14159f, 3.0f, 0.0f, vecofstrings2,\n      vecofstructs, flex, testv2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n      AnyUniqueAliases_NONE, 0, AnyAmbiguousAliases_NONE, 0, vecofcolors,\n      MyGame::Example::Race_None, 0, vec_of_stats);\n\n  FinishMonsterBuffer(builder, mloc);\n\n  // clang-format off\n  #ifdef FLATBUFFERS_TEST_VERBOSE\n  // print byte data for debugging:\n  auto p = builder.GetBufferPointer();\n  for (flatbuffers::uoffset_t i = 0; i < builder.GetSize(); i++)\n    printf(\"%d \", p[i]);\n  #endif\n  // clang-format on\n\n  // return the buffer for the caller to use.\n  auto bufferpointer =\n      reinterpret_cast<const char*>(builder.GetBufferPointer());\n  buffer.assign(bufferpointer, bufferpointer + builder.GetSize());\n\n  return builder.Release();\n}\n\n//  example of accessing a buffer loaded in memory:\nvoid AccessFlatBufferTest(const uint8_t* flatbuf, size_t length, bool pooled) {\n  // First, verify the buffers integrity (optional)\n  flatbuffers::Verifier verifier(flatbuf, length);\n  std::vector<uint8_t> flex_reuse_tracker;\n  verifier.SetFlexReuseTracker(&flex_reuse_tracker);\n  TEST_EQ(VerifyMonsterBuffer(verifier), true);\n\n  // clang-format off\n  #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE\n    std::vector<uint8_t> test_buff;\n    test_buff.resize(length * 2);\n    std::memcpy(&test_buff[0], flatbuf, length);\n    std::memcpy(&test_buff[length], flatbuf, length);\n\n    flatbuffers::Verifier verifier1(&test_buff[0], length);\n    TEST_EQ(VerifyMonsterBuffer(verifier1), true);\n    TEST_EQ(verifier1.GetComputedSize(), length);\n\n    flatbuffers::Verifier verifier2(&test_buff[length], length);\n    TEST_EQ(VerifyMonsterBuffer(verifier2), true);\n    TEST_EQ(verifier2.GetComputedSize(), length);\n  #endif\n  // clang-format on\n\n  TEST_EQ(strcmp(MonsterIdentifier(), \"MONS\"), 0);\n  TEST_EQ(MonsterBufferHasIdentifier(flatbuf), true);\n  TEST_EQ(strcmp(MonsterExtension(), \"mon\"), 0);\n\n  // Access the buffer from the root.\n  auto monster = GetMonster(flatbuf);\n\n  TEST_EQ(monster->hp(), 80);\n  TEST_EQ(monster->mana(), 150);  // default\n  TEST_EQ_STR(monster->name()->c_str(), \"MyMonster\");\n  // Can't access the following field, it is deprecated in the schema,\n  // which means accessors are not generated:\n  // monster.friendly()\n\n  auto pos = monster->pos();\n  TEST_NOTNULL(pos);\n  TEST_EQ(pos->z(), 3);\n  TEST_EQ(pos->test3().a(), 10);\n  TEST_EQ(pos->test3().b(), 20);\n\n  auto inventory = monster->inventory();\n  TEST_EQ(VectorLength(inventory), 10UL);  // Works even if inventory is null.\n  TEST_NOTNULL(inventory);\n  unsigned char inv_data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};\n  // Check compatibilty of iterators with STL.\n  std::vector<unsigned char> inv_vec(inventory->begin(), inventory->end());\n  size_t n = 0;\n  for (auto it = inventory->begin(); it != inventory->end(); ++it, ++n) {\n    auto indx = it - inventory->begin();\n    TEST_EQ(*it, inv_vec.at(indx));  // Use bounds-check.\n    TEST_EQ(*it, inv_data[indx]);\n  }\n  TEST_EQ(n, inv_vec.size());\n\n  n = 0;\n  for (auto it = inventory->cbegin(); it != inventory->cend(); ++it, ++n) {\n    auto indx = it - inventory->cbegin();\n    TEST_EQ(*it, inv_vec.at(indx));  // Use bounds-check.\n    TEST_EQ(*it, inv_data[indx]);\n  }\n  TEST_EQ(n, inv_vec.size());\n\n  n = 0;\n  for (auto it = inventory->rbegin(); it != inventory->rend(); ++it, ++n) {\n    auto indx = inventory->rend() - it - 1;\n    TEST_EQ(*it, inv_vec.at(indx));  // Use bounds-check.\n    TEST_EQ(*it, inv_data[indx]);\n  }\n  TEST_EQ(n, inv_vec.size());\n\n  n = 0;\n  for (auto it = inventory->crbegin(); it != inventory->crend(); ++it, ++n) {\n    auto indx = inventory->crend() - it - 1;\n    TEST_EQ(*it, inv_vec.at(indx));  // Use bounds-check.\n    TEST_EQ(*it, inv_data[indx]);\n  }\n  TEST_EQ(n, inv_vec.size());\n\n  TEST_EQ(monster->color(), Color_Blue);\n\n  // Example of accessing a union:\n  TEST_EQ(monster->test_type(), Any_Monster);  // First make sure which it is.\n  auto monster2 = reinterpret_cast<const Monster*>(monster->test());\n  TEST_NOTNULL(monster2);\n  TEST_EQ_STR(monster2->name()->c_str(), \"Fred\");\n\n  // Example of accessing a vector of strings:\n  auto vecofstrings = monster->testarrayofstring();\n  TEST_EQ(vecofstrings->size(), 4U);\n  TEST_EQ_STR(vecofstrings->Get(0)->c_str(), \"bob\");\n  TEST_EQ_STR(vecofstrings->Get(1)->c_str(), \"fred\");\n  if (pooled) {\n    // These should have pointer equality because of string pooling.\n    TEST_EQ(vecofstrings->Get(0)->c_str(), vecofstrings->Get(2)->c_str());\n    TEST_EQ(vecofstrings->Get(1)->c_str(), vecofstrings->Get(3)->c_str());\n  }\n\n  auto vecofstrings2 = monster->testarrayofstring2();\n  if (vecofstrings2) {\n    TEST_EQ(vecofstrings2->size(), 2U);\n    TEST_EQ_STR(vecofstrings2->Get(0)->c_str(), \"jane\");\n    TEST_EQ_STR(vecofstrings2->Get(1)->c_str(), \"mary\");\n  }\n\n  // Example of accessing a vector of tables:\n  auto vecoftables = monster->testarrayoftables();\n  TEST_EQ(vecoftables->size(), 3U);\n  for (auto it = vecoftables->begin(); it != vecoftables->end(); ++it) {\n    TEST_EQ(strlen(it->name()->c_str()) >= 4, true);\n  }\n  TEST_EQ_STR(vecoftables->Get(0)->name()->c_str(), \"Barney\");\n  TEST_EQ(vecoftables->Get(0)->hp(), 1000);\n  TEST_EQ_STR(vecoftables->Get(1)->name()->c_str(), \"Fred\");\n  TEST_EQ_STR(vecoftables->Get(2)->name()->c_str(), \"Wilma\");\n  TEST_NOTNULL(vecoftables->LookupByKey(\"Barney\"));\n  TEST_NOTNULL(vecoftables->LookupByKey(\"Fred\"));\n  TEST_NOTNULL(vecoftables->LookupByKey(\"Wilma\"));\n\n  // Verify the same objects are returned for char*-based and string-based\n  // lookups.\n  TEST_EQ(vecoftables->LookupByKey(\"Barney\"),\n          vecoftables->LookupByKey(std::string(\"Barney\")));\n  TEST_EQ(vecoftables->LookupByKey(\"Fred\"),\n          vecoftables->LookupByKey(std::string(\"Fred\")));\n  TEST_EQ(vecoftables->LookupByKey(\"Wilma\"),\n          vecoftables->LookupByKey(std::string(\"Wilma\")));\n\n#ifdef FLATBUFFERS_HAS_STRING_VIEW\n  // Tests for LookupByKey with a key that is a truncated\n  // version of a longer, invalid key.\n  const std::string invalid_key = \"Barney123\";\n  std::string_view valid_truncated_key = invalid_key;\n  valid_truncated_key.remove_suffix(3);  // \"Barney\"\n  TEST_NOTNULL(vecoftables->LookupByKey(valid_truncated_key));\n  TEST_EQ(vecoftables->LookupByKey(\"Barney\"),\n          vecoftables->LookupByKey(valid_truncated_key));\n\n  // Tests for LookupByKey with a key that is a truncated\n  // version of a longer, valid key.\n  const std::string valid_key = \"Barney\";\n  std::string_view invalid_truncated_key = valid_key;\n  invalid_truncated_key.remove_suffix(3);  // \"Bar\"\n  TEST_NULL(vecoftables->LookupByKey(invalid_truncated_key));\n#endif  // FLATBUFFERS_HAS_STRING_VIEW\n\n  // Test accessing a vector of sorted structs\n  auto vecofstructs = monster->testarrayofsortedstruct();\n  if (vecofstructs) {  // not filled in monster_test.bfbs\n    for (flatbuffers::uoffset_t i = 0; i < vecofstructs->size() - 1; i++) {\n      auto left = vecofstructs->Get(i);\n      auto right = vecofstructs->Get(i + 1);\n      TEST_EQ(true, (left->KeyCompareLessThan(right)));\n    }\n    TEST_NOTNULL(vecofstructs->LookupByKey(0));  // test default value\n    TEST_NOTNULL(vecofstructs->LookupByKey(3));\n    TEST_EQ(static_cast<const Ability*>(nullptr), vecofstructs->LookupByKey(5));\n  }\n\n  if (auto vec_of_stat = monster->scalar_key_sorted_tables()) {\n    auto stat_0 = vec_of_stat->LookupByKey(static_cast<uint16_t>(0u));\n    TEST_NOTNULL(stat_0);\n    TEST_NOTNULL(stat_0->id());\n    TEST_EQ(0, stat_0->count());\n    TEST_EQ_STR(\"miss\", stat_0->id()->c_str());\n  }\n\n  // Test nested FlatBuffers if available:\n  auto nested_buffer = monster->testnestedflatbuffer();\n  if (nested_buffer) {\n    // nested_buffer is a vector of bytes you can memcpy. However, if you\n    // actually want to access the nested data, this is a convenient\n    // accessor that directly gives you the root table:\n    auto nested_monster = monster->testnestedflatbuffer_nested_root();\n    TEST_EQ_STR(nested_monster->name()->c_str(), \"NestedMonster\");\n  }\n\n  // Test flexbuffer if available:\n  auto flex = monster->flex();\n  // flex is a vector of bytes you can memcpy etc.\n  TEST_EQ(flex->size(), 4);  // Encoded FlexBuffer bytes.\n  // However, if you actually want to access the nested data, this is a\n  // convenient accessor that directly gives you the root value:\n  TEST_EQ(monster->flex_flexbuffer_root().AsInt16(), 1234);\n\n  // Test vector of enums:\n  auto colors = monster->vector_of_enums();\n  if (colors) {\n    TEST_EQ(colors->size(), 2);\n    TEST_EQ(colors->Get(0), Color_Blue);\n    TEST_EQ(colors->Get(1), Color_Green);\n  }\n\n  // Since Flatbuffers uses explicit mechanisms to override the default\n  // compiler alignment, double check that the compiler indeed obeys them:\n  // (Test consists of a short and byte):\n  TEST_EQ(flatbuffers::AlignOf<Test>(), 2UL);\n  TEST_EQ(sizeof(Test), 4UL);\n\n  const flatbuffers::Vector<const Test*>* tests_array[] = {\n      monster->test4(),\n      monster->test5(),\n  };\n  for (size_t i = 0; i < sizeof(tests_array) / sizeof(tests_array[0]); ++i) {\n    auto tests = tests_array[i];\n    TEST_NOTNULL(tests);\n    auto test_0 = tests->Get(0);\n    auto test_1 = tests->Get(1);\n    TEST_EQ(test_0->a(), 10);\n    TEST_EQ(test_0->b(), 20);\n    TEST_EQ(test_1->a(), 30);\n    TEST_EQ(test_1->b(), 40);\n    for (auto it = tests->begin(); it != tests->end(); ++it) {\n      TEST_EQ(it->a() == 10 || it->a() == 30, true);  // Just testing iterators.\n    }\n  }\n\n  // Checking for presence of fields:\n  TEST_EQ(flatbuffers::IsFieldPresent(monster, Monster::VT_HP), true);\n  TEST_EQ(flatbuffers::IsFieldPresent(monster, Monster::VT_MANA), false);\n\n  // Obtaining a buffer from a root:\n  TEST_EQ(GetBufferStartFromRootPointer(monster), flatbuf);\n}\n\n// Change a FlatBuffer in-place, after it has been constructed.\nvoid MutateFlatBuffersTest(uint8_t* flatbuf, std::size_t length) {\n  // Get non-const pointer to root.\n  auto monster = GetMutableMonster(flatbuf);\n\n  // Each of these tests mutates, then tests, then set back to the original,\n  // so we can test that the buffer in the end still passes our original test.\n  auto hp_ok = monster->mutate_hp(10);\n  TEST_EQ(hp_ok, true);  // Field was present.\n  TEST_EQ(monster->hp(), 10);\n  // Mutate to default value\n  auto hp_ok_default = monster->mutate_hp(100);\n  TEST_EQ(hp_ok_default, true);  // Field was present.\n  TEST_EQ(monster->hp(), 100);\n  // Test that mutate to default above keeps field valid for further mutations\n  auto hp_ok_2 = monster->mutate_hp(20);\n  TEST_EQ(hp_ok_2, true);\n  TEST_EQ(monster->hp(), 20);\n  monster->mutate_hp(80);\n\n  // Monster originally at 150 mana (default value)\n  auto mana_default_ok = monster->mutate_mana(150);  // Mutate to default value.\n  TEST_EQ(mana_default_ok,\n          true);  // Mutation should succeed, because default value.\n  TEST_EQ(monster->mana(), 150);\n  auto mana_ok = monster->mutate_mana(10);\n  TEST_EQ(mana_ok, false);  // Field was NOT present, because default value.\n  TEST_EQ(monster->mana(), 150);\n\n  // Mutate structs.\n  auto pos = monster->mutable_pos();\n  auto& test3 = pos->mutable_test3();  // Struct inside a struct.\n  test3.mutate_a(50);                  // Struct fields never fail.\n  TEST_EQ(test3.a(), 50);\n  test3.mutate_a(10);\n\n  // Mutate vectors.\n  auto inventory = monster->mutable_inventory();\n  inventory->Mutate(9, 100);\n  TEST_EQ(inventory->Get(9), 100);\n  inventory->Mutate(9, 9);\n\n  auto tables = monster->mutable_testarrayoftables();\n  auto first = tables->GetMutableObject(0);\n  TEST_EQ(first->hp(), 1000);\n  first->mutate_hp(0);\n  TEST_EQ(first->hp(), 0);\n  first->mutate_hp(1000);\n\n  // Test for each loop over mutable entries\n  for (auto item : *tables) {\n    TEST_EQ(item->hp(), 1000);\n    item->mutate_hp(0);\n    TEST_EQ(item->hp(), 0);\n    item->mutate_hp(1000);\n    break;  // one iteration is enough, just testing compilation\n  }\n\n  // Mutate via LookupByKey\n  TEST_NOTNULL(tables->MutableLookupByKey(\"Barney\"));\n  TEST_EQ(static_cast<Monster*>(nullptr),\n          tables->MutableLookupByKey(\"DoesntExist\"));\n  TEST_EQ(tables->MutableLookupByKey(\"Barney\")->hp(), 1000);\n  TEST_EQ(tables->MutableLookupByKey(\"Barney\")->mutate_hp(0), true);\n  TEST_EQ(tables->LookupByKey(\"Barney\")->hp(), 0);\n  TEST_EQ(tables->MutableLookupByKey(\"Barney\")->mutate_hp(1000), true);\n\n  // Run the verifier and the regular test to make sure we didn't trample on\n  // anything.\n  AccessFlatBufferTest(flatbuf, length);\n}\n\n// Unpack a FlatBuffer into objects.\nvoid ObjectFlatBuffersTest(uint8_t* flatbuf) {\n  // Optional: we can specify resolver and rehasher functions to turn hashed\n  // strings into object pointers and back, to implement remote references\n  // and such.\n  auto resolver = flatbuffers::resolver_function_t(\n      [](void** pointer_adr, flatbuffers::hash_value_t hash) {\n        (void)pointer_adr;\n        (void)hash;\n        // Don't actually do anything, leave variable null.\n      });\n  auto rehasher = flatbuffers::rehasher_function_t(\n      [](void* pointer) -> flatbuffers::hash_value_t {\n        (void)pointer;\n        return 0;\n      });\n\n  // Turn a buffer into C++ objects.\n  auto monster1 = UnPackMonster(flatbuf, &resolver);\n\n  // Re-serialize the data.\n  flatbuffers::FlatBufferBuilder fbb1;\n  fbb1.Finish(CreateMonster(fbb1, monster1.get(), &rehasher),\n              MonsterIdentifier());\n\n  // Unpack again, and re-serialize again.\n  auto monster2 = UnPackMonster(fbb1.GetBufferPointer(), &resolver);\n  flatbuffers::FlatBufferBuilder fbb2;\n  fbb2.Finish(CreateMonster(fbb2, monster2.get(), &rehasher),\n              MonsterIdentifier());\n\n  // Now we've gone full round-trip, the two buffers should match.\n  const auto len1 = fbb1.GetSize();\n  const auto len2 = fbb2.GetSize();\n  TEST_EQ(len1, len2);\n  TEST_EQ(memcmp(fbb1.GetBufferPointer(), fbb2.GetBufferPointer(), len1), 0);\n\n  // Test it with the original buffer test to make sure all data survived.\n  AccessFlatBufferTest(fbb2.GetBufferPointer(), len2, false);\n\n  // Test accessing fields, similar to AccessFlatBufferTest above.\n  CheckMonsterObject(monster2.get());\n\n  // Test object copy.\n  MonsterT monster3 = *monster2;\n  flatbuffers::FlatBufferBuilder fbb3;\n  fbb3.Finish(CreateMonster(fbb3, &monster3, &rehasher), MonsterIdentifier());\n  const auto len3 = fbb3.GetSize();\n  TEST_EQ(len2, len3);\n  TEST_EQ(memcmp(fbb2.GetBufferPointer(), fbb3.GetBufferPointer(), len2), 0);\n  // Delete monster1 and monster2, then test accessing fields in monster3.\n  monster1.reset();\n  monster2.reset();\n  CheckMonsterObject(&monster3);\n}\n\n// Utility function to check a Monster object.\nvoid CheckMonsterObject(MonsterT* monster2) {\n  TEST_EQ(monster2->hp, 80);\n  TEST_EQ(monster2->mana, 150);  // default\n  TEST_EQ_STR(monster2->name.c_str(), \"MyMonster\");\n\n  auto& pos = monster2->pos;\n  TEST_NOTNULL(pos);\n  TEST_EQ(pos->z(), 3);\n  TEST_EQ(pos->test3().a(), 10);\n  TEST_EQ(pos->test3().b(), 20);\n\n  auto& inventory = monster2->inventory;\n  TEST_EQ(inventory.size(), 10UL);\n  unsigned char inv_data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};\n  for (auto it = inventory.begin(); it != inventory.end(); ++it)\n    TEST_EQ(*it, inv_data[it - inventory.begin()]);\n\n  TEST_EQ(monster2->color, Color_Blue);\n\n  auto monster3 = monster2->test.AsMonster();\n  TEST_NOTNULL(monster3);\n  TEST_EQ_STR(monster3->name.c_str(), \"Fred\");\n\n  auto& vecofstrings = monster2->testarrayofstring;\n  TEST_EQ(vecofstrings.size(), 4U);\n  TEST_EQ_STR(vecofstrings[0].c_str(), \"bob\");\n  TEST_EQ_STR(vecofstrings[1].c_str(), \"fred\");\n\n  auto& vecofstrings2 = monster2->testarrayofstring2;\n  TEST_EQ(vecofstrings2.size(), 2U);\n  TEST_EQ_STR(vecofstrings2[0].c_str(), \"jane\");\n  TEST_EQ_STR(vecofstrings2[1].c_str(), \"mary\");\n\n  auto& vecoftables = monster2->testarrayoftables;\n  TEST_EQ(vecoftables.size(), 3U);\n  TEST_EQ_STR(vecoftables[0]->name.c_str(), \"Barney\");\n  TEST_EQ(vecoftables[0]->hp, 1000);\n  TEST_EQ_STR(vecoftables[1]->name.c_str(), \"Fred\");\n  TEST_EQ_STR(vecoftables[2]->name.c_str(), \"Wilma\");\n\n  auto& tests = monster2->test4;\n  TEST_EQ(tests[0].a(), 10);\n  TEST_EQ(tests[0].b(), 20);\n  TEST_EQ(tests[1].a(), 30);\n  TEST_EQ(tests[1].b(), 40);\n}\n\n// Prefix a FlatBuffer with a size field.\nvoid SizePrefixedTest() {\n  // Create size prefixed buffer.\n  flatbuffers::FlatBufferBuilder fbb;\n  FinishSizePrefixedMonsterBuffer(\n      fbb, CreateMonster(fbb, nullptr, 200, 300, fbb.CreateString(\"bob\")));\n\n  // Verify it.\n  flatbuffers::Verifier verifier(fbb.GetBufferPointer(), fbb.GetSize());\n  TEST_EQ(VerifySizePrefixedMonsterBuffer(verifier), true);\n\n  // The prefixed size doesn't include itself, so substract the size of the\n  // prefix\n  TEST_EQ(GetPrefixedSize(fbb.GetBufferPointer()),\n          fbb.GetSize() - sizeof(uoffset_t));\n\n  // Getting the buffer length does include the prefix size, so it should be the\n  // full lenght.\n  TEST_EQ(GetSizePrefixedBufferLength(fbb.GetBufferPointer()), fbb.GetSize());\n\n  // Access it.\n  auto m = GetSizePrefixedMonster(fbb.GetBufferPointer());\n  TEST_EQ(m->mana(), 200);\n  TEST_EQ(m->hp(), 300);\n  TEST_EQ_STR(m->name()->c_str(), \"bob\");\n\n  {\n    // Verify that passing a larger size is OK, but not a smaller\n    flatbuffers::Verifier verifier_larger(fbb.GetBufferPointer(),\n                                          fbb.GetSize() + 10);\n    TEST_EQ(VerifySizePrefixedMonsterBuffer(verifier_larger), true);\n\n    flatbuffers::Verifier verifier_smaller(fbb.GetBufferPointer(),\n                                           fbb.GetSize() - 10);\n    TEST_EQ(VerifySizePrefixedMonsterBuffer(verifier_smaller), false);\n  }\n}\n\nvoid TestMonsterExtraFloats(const std::string& tests_data_path) {\n#if defined(FLATBUFFERS_HAS_NEW_STRTOD) && (FLATBUFFERS_HAS_NEW_STRTOD > 0)\n  TEST_EQ(is_quiet_nan(1.0), false);\n  TEST_EQ(is_quiet_nan(infinity_d), false);\n  TEST_EQ(is_quiet_nan(-infinity_f), false);\n  TEST_EQ(is_quiet_nan(std::numeric_limits<float>::quiet_NaN()), true);\n  TEST_EQ(is_quiet_nan(std::numeric_limits<double>::quiet_NaN()), true);\n\n  using namespace flatbuffers;\n  using namespace MyGame;\n  // Load FlatBuffer schema (.fbs) from disk.\n  std::string schemafile;\n  TEST_EQ(LoadFile((tests_data_path + \"monster_extra.fbs\").c_str(), false,\n                   &schemafile),\n          true);\n  // Parse schema first, so we can use it to parse the data after.\n  Parser parser;\n  auto include_test_path = ConCatPathFileName(tests_data_path, \"include_test\");\n  const char* include_directories[] = {tests_data_path.c_str(),\n                                       include_test_path.c_str(), nullptr};\n  TEST_EQ(parser.Parse(schemafile.c_str(), include_directories), true);\n  // Create empty extra and store to json.\n  parser.opts.output_default_scalars_in_json = true;\n  parser.opts.output_enum_identifiers = true;\n  FlatBufferBuilder builder;\n  const auto def_root = MonsterExtraBuilder(builder).Finish();\n  FinishMonsterExtraBuffer(builder, def_root);\n  const auto def_obj = builder.GetBufferPointer();\n  const auto def_extra = GetMonsterExtra(def_obj);\n  TEST_NOTNULL(def_extra);\n  TEST_EQ(is_quiet_nan(def_extra->f0()), true);\n  TEST_EQ(is_quiet_nan(def_extra->f1()), true);\n  TEST_EQ(def_extra->f2(), +infinity_f);\n  TEST_EQ(def_extra->f3(), -infinity_f);\n  TEST_EQ(is_quiet_nan(def_extra->d0()), true);\n  TEST_EQ(is_quiet_nan(def_extra->d1()), true);\n  TEST_EQ(def_extra->d2(), +infinity_d);\n  TEST_EQ(def_extra->d3(), -infinity_d);\n  std::string jsongen;\n  auto result = GenText(parser, def_obj, &jsongen);\n  TEST_NULL(result);\n  // Check expected default values.\n  TEST_EQ(std::string::npos != jsongen.find(\"f0: nan\"), true);\n  TEST_EQ(std::string::npos != jsongen.find(\"f1: nan\"), true);\n  TEST_EQ(std::string::npos != jsongen.find(\"f2: inf\"), true);\n  TEST_EQ(std::string::npos != jsongen.find(\"f3: -inf\"), true);\n  TEST_EQ(std::string::npos != jsongen.find(\"d0: nan\"), true);\n  TEST_EQ(std::string::npos != jsongen.find(\"d1: nan\"), true);\n  TEST_EQ(std::string::npos != jsongen.find(\"d2: inf\"), true);\n  TEST_EQ(std::string::npos != jsongen.find(\"d3: -inf\"), true);\n  // Parse 'mosterdata_extra.json'.\n  const auto extra_base = tests_data_path + \"monsterdata_extra\";\n  jsongen = \"\";\n  TEST_EQ(LoadFile((extra_base + \".json\").c_str(), false, &jsongen), true);\n  TEST_EQ(parser.Parse(jsongen.c_str()), true);\n  const auto test_file = parser.builder_.GetBufferPointer();\n  const auto test_size = parser.builder_.GetSize();\n  Verifier verifier(test_file, test_size);\n  TEST_ASSERT(VerifyMonsterExtraBuffer(verifier));\n  const auto extra = GetMonsterExtra(test_file);\n  TEST_NOTNULL(extra);\n  TEST_EQ(is_quiet_nan(extra->f0()), true);\n  TEST_EQ(is_quiet_nan(extra->f1()), true);\n  TEST_EQ(extra->f2(), +infinity_f);\n  TEST_EQ(extra->f3(), -infinity_f);\n  TEST_EQ(is_quiet_nan(extra->d0()), true);\n  TEST_EQ(extra->d1(), +infinity_d);\n  TEST_EQ(extra->d2(), -infinity_d);\n  TEST_EQ(is_quiet_nan(extra->d3()), true);\n  TEST_NOTNULL(extra->fvec());\n  TEST_EQ(extra->fvec()->size(), 4);\n  TEST_EQ(extra->fvec()->Get(0), 1.0f);\n  TEST_EQ(extra->fvec()->Get(1), -infinity_f);\n  TEST_EQ(extra->fvec()->Get(2), +infinity_f);\n  TEST_EQ(is_quiet_nan(extra->fvec()->Get(3)), true);\n  TEST_NOTNULL(extra->dvec());\n  TEST_EQ(extra->dvec()->size(), 4);\n  TEST_EQ(extra->dvec()->Get(0), 2.0);\n  TEST_EQ(extra->dvec()->Get(1), +infinity_d);\n  TEST_EQ(extra->dvec()->Get(2), -infinity_d);\n  TEST_EQ(is_quiet_nan(extra->dvec()->Get(3)), true);\n#endif\n}\n\nvoid EnumNamesTest() {\n  TEST_EQ_STR(\"Red\", EnumNameColor(Color_Red));\n  TEST_EQ_STR(\"Green\", EnumNameColor(Color_Green));\n  TEST_EQ_STR(\"Blue\", EnumNameColor(Color_Blue));\n  // Check that Color to string don't crash while decode a mixture of Colors.\n  // 1) Example::Color enum is enum with unfixed underlying type.\n  // 2) Valid enum range: [0; 2^(ceil(log2(Color_ANY))) - 1].\n  // Consequence: A value is out of this range will lead to UB (since C++17).\n  // For details see C++17 standard or explanation on the SO:\n  // stackoverflow.com/questions/18195312/what-happens-if-you-static-cast-invalid-value-to-enum-class\n  TEST_EQ_STR(\"\", EnumNameColor(static_cast<Color>(0)));\n  TEST_EQ_STR(\"\", EnumNameColor(static_cast<Color>(Color_ANY - 1)));\n  TEST_EQ_STR(\"\", EnumNameColor(static_cast<Color>(Color_ANY + 1)));\n}\n\nvoid TypeAliasesTest() {\n  flatbuffers::FlatBufferBuilder builder;\n\n  builder.Finish(CreateTypeAliases(\n      builder, flatbuffers::numeric_limits<int8_t>::min(),\n      flatbuffers::numeric_limits<uint8_t>::max(),\n      flatbuffers::numeric_limits<int16_t>::min(),\n      flatbuffers::numeric_limits<uint16_t>::max(),\n      flatbuffers::numeric_limits<int32_t>::min(),\n      flatbuffers::numeric_limits<uint32_t>::max(),\n      flatbuffers::numeric_limits<int64_t>::min(),\n      flatbuffers::numeric_limits<uint64_t>::max(), 2.3f, 2.3));\n\n  auto p = builder.GetBufferPointer();\n  auto ta = flatbuffers::GetRoot<TypeAliases>(p);\n\n  TEST_EQ(ta->i8(), flatbuffers::numeric_limits<int8_t>::min());\n  TEST_EQ(ta->u8(), flatbuffers::numeric_limits<uint8_t>::max());\n  TEST_EQ(ta->i16(), flatbuffers::numeric_limits<int16_t>::min());\n  TEST_EQ(ta->u16(), flatbuffers::numeric_limits<uint16_t>::max());\n  TEST_EQ(ta->i32(), flatbuffers::numeric_limits<int32_t>::min());\n  TEST_EQ(ta->u32(), flatbuffers::numeric_limits<uint32_t>::max());\n  TEST_EQ(ta->i64(), flatbuffers::numeric_limits<int64_t>::min());\n  TEST_EQ(ta->u64(), flatbuffers::numeric_limits<uint64_t>::max());\n  TEST_EQ(ta->f32(), 2.3f);\n  TEST_EQ(ta->f64(), 2.3);\n  using namespace flatbuffers;  // is_same\n  static_assert(is_same<decltype(ta->i8()), int8_t>::value, \"invalid type\");\n  static_assert(is_same<decltype(ta->i16()), int16_t>::value, \"invalid type\");\n  static_assert(is_same<decltype(ta->i32()), int32_t>::value, \"invalid type\");\n  static_assert(is_same<decltype(ta->i64()), int64_t>::value, \"invalid type\");\n  static_assert(is_same<decltype(ta->u8()), uint8_t>::value, \"invalid type\");\n  static_assert(is_same<decltype(ta->u16()), uint16_t>::value, \"invalid type\");\n  static_assert(is_same<decltype(ta->u32()), uint32_t>::value, \"invalid type\");\n  static_assert(is_same<decltype(ta->u64()), uint64_t>::value, \"invalid type\");\n  static_assert(is_same<decltype(ta->f32()), float>::value, \"invalid type\");\n  static_assert(is_same<decltype(ta->f64()), double>::value, \"invalid type\");\n}\n\n// example of parsing text straight into a buffer, and generating\n// text back from it:\nvoid ParseAndGenerateTextTest(const std::string& tests_data_path, bool binary) {\n  // load FlatBuffer schema (.fbs) and JSON from disk\n  std::string schemafile;\n  std::string jsonfile;\n  TEST_EQ(flatbuffers::LoadFile(\n              (tests_data_path + \"monster_test.\" + (binary ? \"bfbs\" : \"fbs\"))\n                  .c_str(),\n              binary, &schemafile),\n          true);\n  TEST_EQ(flatbuffers::LoadFile(\n              (tests_data_path + \"monsterdata_test.golden\").c_str(), false,\n              &jsonfile),\n          true);\n\n  auto include_test_path =\n      flatbuffers::ConCatPathFileName(tests_data_path, \"include_test\");\n  const char* include_directories[] = {tests_data_path.c_str(),\n                                       include_test_path.c_str(), nullptr};\n\n  // parse schema first, so we can use it to parse the data after\n  flatbuffers::Parser parser;\n  if (binary) {\n    flatbuffers::Verifier verifier(\n        reinterpret_cast<const uint8_t*>(schemafile.c_str()),\n        schemafile.size());\n    TEST_EQ(reflection::VerifySchemaBuffer(verifier), true);\n    // auto schema = reflection::GetSchema(schemafile.c_str());\n    TEST_EQ(\n        parser.Deserialize(reinterpret_cast<const uint8_t*>(schemafile.c_str()),\n                           schemafile.size()),\n        true);\n  } else {\n    TEST_EQ(parser.Parse(schemafile.c_str(), include_directories), true);\n  }\n  TEST_EQ(parser.ParseJson(jsonfile.c_str()), true);\n\n  // here, parser.builder_ contains a binary buffer that is the parsed data.\n\n  // First, verify it, just in case:\n  flatbuffers::Verifier verifier(parser.builder_.GetBufferPointer(),\n                                 parser.builder_.GetSize());\n  TEST_EQ(VerifyMonsterBuffer(verifier), true);\n\n  AccessFlatBufferTest(parser.builder_.GetBufferPointer(),\n                       parser.builder_.GetSize(), false);\n\n  // to ensure it is correct, we now generate text back from the binary,\n  // and compare the two:\n  std::string jsongen;\n  auto result = GenText(parser, parser.builder_.GetBufferPointer(), &jsongen);\n  TEST_NULL(result);\n  TEST_EQ_STR(jsongen.c_str(), jsonfile.c_str());\n\n  // We can also do the above using the convenient Registry that knows about\n  // a set of file_identifiers mapped to schemas.\n  flatbuffers::Registry registry;\n  // Make sure schemas can find their includes.\n  registry.AddIncludeDirectory(tests_data_path.c_str());\n  registry.AddIncludeDirectory(include_test_path.c_str());\n  // Call this with many schemas if possible.\n  registry.Register(MonsterIdentifier(),\n                    (tests_data_path + \"monster_test.fbs\").c_str());\n  // Now we got this set up, we can parse by just specifying the identifier,\n  // the correct schema will be loaded on the fly:\n  auto buf = registry.TextToFlatBuffer(jsonfile.c_str(), MonsterIdentifier());\n  // If this fails, check registry.lasterror_.\n  TEST_NOTNULL(buf.data());\n  // Test the buffer, to be sure:\n  AccessFlatBufferTest(buf.data(), buf.size(), false);\n  // We can use the registry to turn this back into text, in this case it\n  // will get the file_identifier from the binary:\n  std::string text;\n  auto ok = registry.FlatBufferToText(buf.data(), buf.size(), &text);\n  // If this fails, check registry.lasterror_.\n  TEST_EQ(ok, true);\n  TEST_EQ_STR(text.c_str(), jsonfile.c_str());\n\n  // Generate text for UTF-8 strings without escapes.\n  std::string jsonfile_utf8;\n  TEST_EQ(flatbuffers::LoadFile((tests_data_path + \"unicode_test.json\").c_str(),\n                                false, &jsonfile_utf8),\n          true);\n  TEST_EQ(parser.Parse(jsonfile_utf8.c_str(), include_directories), true);\n  // To ensure it is correct, generate utf-8 text back from the binary.\n  std::string jsongen_utf8;\n  // request natural printing for utf-8 strings\n  parser.opts.natural_utf8 = true;\n  parser.opts.strict_json = true;\n  TEST_NULL(GenText(parser, parser.builder_.GetBufferPointer(), &jsongen_utf8));\n  TEST_EQ_STR(jsongen_utf8.c_str(), jsonfile_utf8.c_str());\n}\n\nvoid UnPackTo(const uint8_t* flatbuf) {\n  // Get a monster that has a name and no enemy\n  auto orig_monster = GetMonster(flatbuf);\n  TEST_EQ_STR(orig_monster->name()->c_str(), \"MyMonster\");\n  TEST_ASSERT(orig_monster->enemy() == nullptr);\n\n  // Create an enemy\n  MonsterT* enemy = new MonsterT();\n  enemy->name = \"Enemy\";\n\n  // And create another monster owning the enemy,\n  MonsterT mon;\n  mon.name = \"I'm monster 1\";\n  mon.enemy.reset(enemy);\n  TEST_ASSERT(mon.enemy != nullptr);\n\n  // Assert that all the Monster objects are correct.\n  TEST_EQ_STR(mon.name.c_str(), \"I'm monster 1\");\n  TEST_EQ_STR(enemy->name.c_str(), \"Enemy\");\n  TEST_EQ_STR(mon.enemy->name.c_str(), \"Enemy\");\n\n  // Now unpack monster (\"MyMonster\") into monster\n  orig_monster->UnPackTo(&mon);\n\n  // Monster name should be from monster\n  TEST_EQ_STR(mon.name.c_str(), \"MyMonster\");\n\n  // The monster shouldn't have any enemies, because monster didn't.\n  TEST_ASSERT(mon.enemy == nullptr);\n}\n\n}  // namespace tests\n}  // namespace flatbuffers\n"
  },
  {
    "path": "tests/monster_test.fbs",
    "content": "// test schema file\n\ninclude \"include_test1.fbs\";\n\nnamespace MyGame;\n\ntable InParentNamespace {}\n\nnamespace MyGame.Example2;\n\ntable Monster {}  // Test having same name as below, but in different namespace.\n\nnamespace MyGame.Example;\n\nattribute \"priority\";\n\n/// Composite components of Monster color.\nenum Color:ubyte (bit_flags) {\n  Red = 0, // color Red = (1u << 0)\n  /// \\brief color Green\n  /// Green is bit_flag with value (1u << 1)\n  Green,\n  /// \\brief color Blue (1u << 3)\n  Blue = 3,\n}\n\nenum Race:byte {\n  None = -1,\n  Human = 0,\n  Dwarf,\n  Elf,\n}\n\nenum LongEnum:ulong (bit_flags) {\n  LongOne = 1,\n  LongTwo = 2,\n  // Because this is a bitflag, 40 will be out of range of a 32-bit integer,\n  // allowing us to exercise any logic special to big numbers.\n  LongBig = 40,\n}\n\nunion Any { Monster, TestSimpleTableWithEnum, MyGame.Example2.Monster }\n\nunion AnyUniqueAliases { M: Monster, TS: TestSimpleTableWithEnum, M2: MyGame.Example2.Monster }\nunion AnyAmbiguousAliases { M1: Monster, M2: Monster, M3: Monster }\n\nstruct Test { a:short; b:byte; }\n\ntable TestSimpleTableWithEnum (csharp_partial, private) {\n  color: Color = Green;\n}\n\nstruct Vec3 (force_align: 8) {\n  x:float;\n  y:float;\n  z:float;\n  test1:double;\n  test2:Color;\n  test3:Test;\n}\n\nstruct Ability {\n  id:uint(key);\n  distance:uint;\n}\n\nstruct StructOfStructs {\n  a: Ability;\n  b: Test;\n  c: Ability;\n}\n\nstruct StructOfStructsOfStructs {\n a: StructOfStructs;\n}\n\ntable Stat {\n  id:string;\n  val:long;\n  count:ushort (key);\n}\n\ntable Referrable {\n  id:ulong(key, hash:\"fnv1a_64\");\n}\n\n/// an example documentation comment: \"monster object\"\ntable Monster {\n  pos:Vec3 (id: 0);\n  hp:short = 100 (id: 2);\n  mana:short = 150 (id: 1);\n  name:string (id: 3, key);\n  color:Color = Blue (id: 6);\n  inventory:[ubyte] (id: 5);\n  friendly:bool = false (deprecated, priority: 1, id: 4);\n  /// an example documentation comment: this will end up in the generated code\n  /// multiline too\n  testarrayoftables:[Monster] (id: 11);\n  testarrayofstring:[string] (id: 10);\n  testarrayofstring2:[string] (id: 28);\n  testarrayofbools:[bool] (id: 24);\n  testarrayofsortedstruct:[Ability] (id: 29);\n  enemy:MyGame.Example.Monster (id:12);  // Test referring by full namespace.\n  test:Any (id: 8);\n  test4:[Test] (id: 9);\n  test5:[Test] (id: 31);\n  testnestedflatbuffer:[ubyte] (id:13, nested_flatbuffer: \"Monster\");\n  testempty:Stat (id:14);\n  testbool:bool (id:15);\n  testhashs32_fnv1:int (id:16, hash:\"fnv1_32\");\n  testhashu32_fnv1:uint (id:17, hash:\"fnv1_32\");\n  testhashs64_fnv1:long (id:18, hash:\"fnv1_64\");\n  testhashu64_fnv1:ulong (id:19, hash:\"fnv1_64\");\n  testhashs32_fnv1a:int (id:20, hash:\"fnv1a_32\");\n  testhashu32_fnv1a:uint (id:21, hash:\"fnv1a_32\", cpp_type:\"Stat\");\n  testhashs64_fnv1a:long (id:22, hash:\"fnv1a_64\");\n  testhashu64_fnv1a:ulong (id:23, hash:\"fnv1a_64\");\n  testf:float = 3.14159 (id:25);\n  testf2:float = 3 (id:26);\n  testf3:float (id:27);\n  flex:[ubyte] (id:30, flexbuffer);\n  vector_of_longs:[long] (id:32);\n  vector_of_doubles:[double] (id:33);\n  parent_namespace_test:InParentNamespace (id:34);\n  vector_of_referrables:[Referrable](id:35);\n  single_weak_reference:ulong(id:36, hash:\"fnv1a_64\", cpp_type:\"ReferrableT\");\n  vector_of_weak_references:[ulong](id:37, hash:\"fnv1a_64\", cpp_type:\"ReferrableT\");\n  vector_of_strong_referrables:[Referrable](id:38, cpp_ptr_type:\"default_ptr_type\");                 //was shared_ptr\n  co_owning_reference:ulong(id:39, hash:\"fnv1a_64\", cpp_type:\"ReferrableT\", cpp_ptr_type:\"naked\");  //was shared_ptr as well\n  vector_of_co_owning_references:[ulong](id:40, hash:\"fnv1a_64\", cpp_type:\"ReferrableT\", cpp_ptr_type:\"default_ptr_type\", cpp_ptr_type_get:\".get()\");  //was shared_ptr\n  non_owning_reference:ulong(id:41, hash:\"fnv1a_64\", cpp_type:\"ReferrableT\", cpp_ptr_type:\"naked\", cpp_ptr_type_get:\"\");                              //was weak_ptr\n  vector_of_non_owning_references:[ulong](id:42, hash:\"fnv1a_64\", cpp_type:\"ReferrableT\", cpp_ptr_type:\"naked\", cpp_ptr_type_get:\"\");                 //was weak_ptr\n  any_unique:AnyUniqueAliases(id:44);\n  any_ambiguous:AnyAmbiguousAliases (id:46);\n  vector_of_enums:[Color] (id:47);\n  signed_enum:Race = None (id:48);\n  testrequirednestedflatbuffer:[ubyte] (id:49, nested_flatbuffer: \"Monster\");\n  scalar_key_sorted_tables:[Stat] (id: 50);\n  native_inline:Test (id: 51, native_inline);\n  // The default value of this enum will be a numeric zero, which isn't a valid\n  // enum value.\n  long_enum_non_enum_default:LongEnum (id: 52);\n  long_enum_normal_default:LongEnum = LongOne (id: 53);\n  // Test that default values nan and +/-inf work.\n  nan_default:float = nan (id: 54);\n  inf_default:float = inf (id: 55);\n  positive_inf_default:float = +inf (id: 56);\n  infinity_default:float = infinity (id: 57);\n  positive_infinity_default:float = +infinity (id: 58);\n  negative_inf_default:float = -inf (id: 59);\n  negative_infinity_default:float = -infinity (id: 60);\n  double_inf_default:double = inf (id: 61);\n}\n\ntable TypeAliases {\n    i8:int8;\n    u8:uint8;\n    i16:int16;\n    u16:uint16;\n    i32:int32;\n    u32:uint32;\n    i64:int64;\n    u64:uint64;\n    f32:float32;\n    f64:float64;\n    v8:[int8];\n    vf64:[float64];\n}\n\nrpc_service MonsterStorage {\n  Store(Monster):Stat (streaming: \"none\");\n  Retrieve(Stat):Monster (streaming: \"server\", idempotent);\n  GetMaxHitPoint(Monster):Stat (streaming: \"client\");\n  GetMinMaxHitPoints(Monster):Stat (streaming: \"bidi\");\n}\n\nroot_type Monster;\n\nfile_identifier \"MONS\";\nfile_extension \"mon\";\n"
  },
  {
    "path": "tests/monster_test.grpc.fb.cc",
    "content": "// Generated by the gRPC C++ plugin.\n// FlatBuffers modified generator: native gRPC callback client API enabled when --grpc-callback-api.\n// source: monster_test\n\n#include \"monster_test_generated.h\"\n#include \"monster_test.grpc.fb.h\"\n\n#include <grpcpp/impl/codegen/async_stream.h>\n#include <grpcpp/impl/codegen/async_unary_call.h>\n#include <grpcpp/impl/codegen/channel_interface.h>\n#include <grpcpp/impl/codegen/client_unary_call.h>\n#include <grpcpp/impl/codegen/method_handler.h>\n#include <grpcpp/impl/codegen/rpc_service_method.h>\n#include <grpcpp/impl/codegen/service_type.h>\n#include <grpcpp/impl/codegen/sync_stream.h>\n#include <grpcpp/impl/codegen/callback_common.h>\n#include <grpcpp/impl/codegen/server_callback_handlers.h>\n#include <grpcpp/support/client_callback.h>\nnamespace MyGame {\nnamespace Example {\n\nstatic const char* MonsterStorage_method_names[] = {\n  \"/MyGame.Example.MonsterStorage/Store\",\n  \"/MyGame.Example.MonsterStorage/Retrieve\",\n  \"/MyGame.Example.MonsterStorage/GetMaxHitPoint\",\n  \"/MyGame.Example.MonsterStorage/GetMinMaxHitPoints\",\n};\n\nstd::unique_ptr< MonsterStorage::Stub> MonsterStorage::NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& /*options*/) {\n  std::unique_ptr< MonsterStorage::Stub> stub(new MonsterStorage::Stub(channel));\n  return stub;\n}\n\nMonsterStorage::Stub::Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel)\n  : channel_(channel)  , rpcmethod_Store_(MonsterStorage_method_names[0], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)\n  , rpcmethod_Retrieve_(MonsterStorage_method_names[1], ::grpc::internal::RpcMethod::SERVER_STREAMING, channel)\n  , rpcmethod_GetMaxHitPoint_(MonsterStorage_method_names[2], ::grpc::internal::RpcMethod::CLIENT_STREAMING, channel)\n  , rpcmethod_GetMinMaxHitPoints_(MonsterStorage_method_names[3], ::grpc::internal::RpcMethod::BIDI_STREAMING, channel)\n  {}\n  \n::grpc::Status MonsterStorage::Stub::Store(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, flatbuffers::grpc::Message<Stat>* response) {\n  return ::grpc::internal::BlockingUnaryCall(channel_.get(), rpcmethod_Store_, context, request, response);\n}\n\nvoid MonsterStorage::Stub::async_Store(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, flatbuffers::grpc::Message<Stat>* response, std::function<void(::grpc::Status)> on_done) {\n  ::grpc::internal::CallbackUnaryCall(channel_.get(), rpcmethod_Store_, context, &request, response, std::move(on_done));\n}\n\nvoid MonsterStorage::Stub::async_Store(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, flatbuffers::grpc::Message<Stat>* response, ::grpc::ClientUnaryReactor* reactor) {\n  ::grpc::internal::ClientCallbackUnaryFactory::Create(channel_.get(), rpcmethod_Store_, context, &request, response, reactor);\n}\n\n::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>* MonsterStorage::Stub::AsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {\n  return ::grpc::internal::ClientAsyncResponseReaderFactory< flatbuffers::grpc::Message<Stat>>::Create(channel_.get(), cq, rpcmethod_Store_, context, request, true);\n}\n\n::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>* MonsterStorage::Stub::PrepareAsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {\n  return ::grpc::internal::ClientAsyncResponseReaderFactory< flatbuffers::grpc::Message<Stat>>::Create(channel_.get(), cq, rpcmethod_Store_, context, request, false);\n}\n\n::grpc::ClientReader< flatbuffers::grpc::Message<Monster>>* MonsterStorage::Stub::RetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) {\n  return ::grpc::internal::ClientReaderFactory< flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), rpcmethod_Retrieve_, context, request);\n}\n\nvoid MonsterStorage::Stub::async_Retrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::ClientReadReactor< flatbuffers::grpc::Message<Monster> >* reactor) {\n  ::grpc::internal::ClientCallbackReaderFactory< flatbuffers::grpc::Message<Monster> >::Create(channel_.get(), rpcmethod_Retrieve_, context, &request, reactor);\n}\n\n::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>* MonsterStorage::Stub::AsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) {\n  return ::grpc::internal::ClientAsyncReaderFactory< flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), cq, rpcmethod_Retrieve_, context, request, true, tag);\n}\n\n::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>* MonsterStorage::Stub::PrepareAsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq) {\n  return ::grpc::internal::ClientAsyncReaderFactory< flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), cq, rpcmethod_Retrieve_, context, request, false, nullptr);\n}\n\n::grpc::ClientWriter< flatbuffers::grpc::Message<Monster>>* MonsterStorage::Stub::GetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response) {\n  return ::grpc::internal::ClientWriterFactory< flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), rpcmethod_GetMaxHitPoint_, context, response);\n}\n\nvoid MonsterStorage::Stub::async_GetMaxHitPoint(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::ClientWriteReactor< flatbuffers::grpc::Message<Monster> >* reactor) {\n  ::grpc::internal::ClientCallbackWriterFactory< flatbuffers::grpc::Message<Monster> >::Create(channel_.get(), rpcmethod_GetMaxHitPoint_, context, response, reactor);\n}\n\n::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>* MonsterStorage::Stub::AsyncGetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq, void* tag) {\n  return ::grpc::internal::ClientAsyncWriterFactory< flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), cq, rpcmethod_GetMaxHitPoint_, context, response, true, tag);\n}\n\n::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>* MonsterStorage::Stub::PrepareAsyncGetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq) {\n  return ::grpc::internal::ClientAsyncWriterFactory< flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), cq, rpcmethod_GetMaxHitPoint_, context, response, false, nullptr);\n}\n\n::grpc::ClientReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* MonsterStorage::Stub::GetMinMaxHitPointsRaw(::grpc::ClientContext* context) {\n  return ::grpc::internal::ClientReaderWriterFactory< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>::Create(channel_.get(), rpcmethod_GetMinMaxHitPoints_, context);\n}\n\nvoid MonsterStorage::Stub::async_GetMinMaxHitPoints(::grpc::ClientContext* context, ::grpc::ClientBidiReactor< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat> >* reactor) {\n  ::grpc::internal::ClientCallbackReaderWriterFactory< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat> >::Create(channel_.get(), rpcmethod_GetMinMaxHitPoints_, context, reactor);\n}\n\n::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* MonsterStorage::Stub::AsyncGetMinMaxHitPointsRaw(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq, void* tag) {\n  return ::grpc::internal::ClientAsyncReaderWriterFactory< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>::Create(channel_.get(), cq, rpcmethod_GetMinMaxHitPoints_, context, true, tag);\n}\n\n::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* MonsterStorage::Stub::PrepareAsyncGetMinMaxHitPointsRaw(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq) {\n  return ::grpc::internal::ClientAsyncReaderWriterFactory< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>::Create(channel_.get(), cq, rpcmethod_GetMinMaxHitPoints_, context, false, nullptr);\n}\n\nMonsterStorage::Service::Service() {\n  AddMethod(new ::grpc::internal::RpcServiceMethod(\n      MonsterStorage_method_names[0],\n      ::grpc::internal::RpcMethod::NORMAL_RPC,\n      new ::grpc::internal::RpcMethodHandler< MonsterStorage::Service, flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>(\n          std::mem_fn(&MonsterStorage::Service::Store), this)));\n  AddMethod(new ::grpc::internal::RpcServiceMethod(\n      MonsterStorage_method_names[1],\n      ::grpc::internal::RpcMethod::SERVER_STREAMING,\n      new ::grpc::internal::ServerStreamingHandler< MonsterStorage::Service, flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>(\n          std::mem_fn(&MonsterStorage::Service::Retrieve), this)));\n  AddMethod(new ::grpc::internal::RpcServiceMethod(\n      MonsterStorage_method_names[2],\n      ::grpc::internal::RpcMethod::CLIENT_STREAMING,\n      new ::grpc::internal::ClientStreamingHandler< MonsterStorage::Service, flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>(\n          std::mem_fn(&MonsterStorage::Service::GetMaxHitPoint), this)));\n  AddMethod(new ::grpc::internal::RpcServiceMethod(\n      MonsterStorage_method_names[3],\n      ::grpc::internal::RpcMethod::BIDI_STREAMING,\n      new ::grpc::internal::BidiStreamingHandler< MonsterStorage::Service, flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>(\n          std::mem_fn(&MonsterStorage::Service::GetMinMaxHitPoints), this)));\n}\n\nMonsterStorage::Service::~Service() {\n}\n\n::grpc::Status MonsterStorage::Service::Store(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Monster>* /*request*/, flatbuffers::grpc::Message<Stat>* /*response*/) {\n  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n}\n\n::grpc::Status MonsterStorage::Service::Retrieve(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Stat>* /*request*/, ::grpc::ServerWriter< flatbuffers::grpc::Message<Monster>>* /*writer*/) {\n  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n}\n\n::grpc::Status MonsterStorage::Service::GetMaxHitPoint(::grpc::ServerContext* /*context*/, ::grpc::ServerReader< flatbuffers::grpc::Message<Monster>>* /*reader*/, flatbuffers::grpc::Message<Stat>* /*response*/) {\n  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n}\n\n::grpc::Status MonsterStorage::Service::GetMinMaxHitPoints(::grpc::ServerContext* /*context*/, ::grpc::ServerReaderWriter< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>* /*stream*/) {\n  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n}\n\n#if defined(GRPC_CALLBACK_API_NONEXPERIMENTAL)\nMonsterStorage::CallbackService::CallbackService() {\n  AddMethod(new ::grpc::internal::RpcServiceMethod(\n      MonsterStorage_method_names[0],\n      ::grpc::internal::RpcMethod::NORMAL_RPC,\n      new ::grpc::internal::CallbackUnaryHandler<flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>(\n        [this](::grpc::CallbackServerContext* ctx, const flatbuffers::grpc::Message<Monster>* req, flatbuffers::grpc::Message<Stat>* resp) {\n          return this->Store(ctx, req, resp);\n        })));\n  AddMethod(new ::grpc::internal::RpcServiceMethod(\n      MonsterStorage_method_names[1],\n      ::grpc::internal::RpcMethod::SERVER_STREAMING,\n      new ::grpc::internal::CallbackServerStreamingHandler<flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>(\n        [this](::grpc::CallbackServerContext* ctx, const flatbuffers::grpc::Message<Stat>* req) {\n          return this->Retrieve(ctx, req);\n        })));\n  AddMethod(new ::grpc::internal::RpcServiceMethod(\n      MonsterStorage_method_names[2],\n      ::grpc::internal::RpcMethod::CLIENT_STREAMING,\n      new ::grpc::internal::CallbackClientStreamingHandler<flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>(\n        [this](::grpc::CallbackServerContext* ctx, flatbuffers::grpc::Message<Stat>* resp) {\n          return this->GetMaxHitPoint(ctx, resp);\n        })));\n  AddMethod(new ::grpc::internal::RpcServiceMethod(\n      MonsterStorage_method_names[3],\n      ::grpc::internal::RpcMethod::BIDI_STREAMING,\n      new ::grpc::internal::CallbackBidiHandler<flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>(\n        [this](::grpc::CallbackServerContext* ctx) {\n          return this->GetMinMaxHitPoints(ctx);\n        })));\n}\n\nMonsterStorage::CallbackService::~CallbackService() {}\n\n::grpc::ServerUnaryReactor* MonsterStorage::CallbackService::Store(::grpc::CallbackServerContext* /*context*/, const flatbuffers::grpc::Message<Monster>* /*request*/, flatbuffers::grpc::Message<Stat>* /*response*/) {\n  return nullptr; // user must override\n}\n\n::grpc::ServerWriteReactor<flatbuffers::grpc::Message<Monster>>* MonsterStorage::CallbackService::Retrieve(::grpc::CallbackServerContext* /*context*/, const flatbuffers::grpc::Message<Stat>* /*request*/) {\n  return nullptr; // user must override\n}\n\n::grpc::ServerReadReactor<flatbuffers::grpc::Message<Monster>>* MonsterStorage::CallbackService::GetMaxHitPoint(::grpc::CallbackServerContext* /*context*/, flatbuffers::grpc::Message<Stat>* /*response*/) {\n  return nullptr; // user must override\n}\n\n::grpc::ServerBidiReactor<flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* MonsterStorage::CallbackService::GetMinMaxHitPoints(::grpc::CallbackServerContext* /*context*/) {\n  return nullptr; // user must override\n}\n\n#endif // GRPC_CALLBACK_API_NONEXPERIMENTAL\n\n}  // namespace MyGame\n}  // namespace Example\n\n"
  },
  {
    "path": "tests/monster_test.grpc.fb.h",
    "content": "// Generated by the gRPC C++ plugin.\n// If you make any local change, they will be lost.\n// source: monster_test\n#ifndef GRPC_monster_5ftest__INCLUDED\n#define GRPC_monster_5ftest__INCLUDED\n\n#include \"monster_test_generated.h\"\n#include \"flatbuffers/grpc.h\"\n\n#include <grpcpp/impl/codegen/async_stream.h>\n#include <grpcpp/impl/codegen/async_unary_call.h>\n#include <grpcpp/impl/codegen/method_handler.h>\n#include <grpcpp/impl/codegen/proto_utils.h>\n#include <grpcpp/impl/codegen/rpc_method.h>\n#include <grpcpp/impl/codegen/service_type.h>\n#include <grpcpp/impl/codegen/status.h>\n#include <grpcpp/impl/codegen/stub_options.h>\n#include <grpcpp/impl/codegen/sync_stream.h>\n#include <grpcpp/impl/codegen/callback_common.h>\n#include <grpcpp/impl/codegen/server_callback_handlers.h>\n#include <grpcpp/support/client_callback.h>\n\nnamespace grpc {\nclass CompletionQueue;\nclass Channel;\nclass ServerCompletionQueue;\nclass ServerContext;\n}  // namespace grpc\n\nnamespace MyGame {\nnamespace Example {\n\nclass MonsterStorage final {\n public:\n  static constexpr char const* service_full_name() {\n    return \"MyGame.Example.MonsterStorage\";\n  }\n  class StubInterface {\n   public:\n    virtual ~StubInterface() {}\n    virtual ::grpc::Status Store(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, flatbuffers::grpc::Message<Stat>* response) = 0;\n    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>> AsyncStore(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>>(AsyncStoreRaw(context, request, cq));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>> PrepareAsyncStore(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>>(PrepareAsyncStoreRaw(context, request, cq));\n    }\n    std::unique_ptr< ::grpc::ClientReaderInterface< flatbuffers::grpc::Message<Monster>>> Retrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) {\n      return std::unique_ptr< ::grpc::ClientReaderInterface< flatbuffers::grpc::Message<Monster>>>(RetrieveRaw(context, request));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>> AsyncRetrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr< ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>>(AsyncRetrieveRaw(context, request, cq, tag));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>> PrepareAsyncRetrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>>(PrepareAsyncRetrieveRaw(context, request, cq));\n    }\n    std::unique_ptr< ::grpc::ClientWriterInterface< flatbuffers::grpc::Message<Monster>>> GetMaxHitPoint(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response) {\n      return std::unique_ptr< ::grpc::ClientWriterInterface< flatbuffers::grpc::Message<Monster>>>(GetMaxHitPointRaw(context, response));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncWriterInterface< flatbuffers::grpc::Message<Monster>>> AsyncGetMaxHitPoint(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr< ::grpc::ClientAsyncWriterInterface< flatbuffers::grpc::Message<Monster>>>(AsyncGetMaxHitPointRaw(context, response, cq, tag));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncWriterInterface< flatbuffers::grpc::Message<Monster>>> PrepareAsyncGetMaxHitPoint(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncWriterInterface< flatbuffers::grpc::Message<Monster>>>(PrepareAsyncGetMaxHitPointRaw(context, response, cq));\n    }\n    std::unique_ptr< ::grpc::ClientReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>> GetMinMaxHitPoints(::grpc::ClientContext* context) {\n      return std::unique_ptr< ::grpc::ClientReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>(GetMinMaxHitPointsRaw(context));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>> AsyncGetMinMaxHitPoints(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr< ::grpc::ClientAsyncReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>(AsyncGetMinMaxHitPointsRaw(context, cq, tag));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>> PrepareAsyncGetMinMaxHitPoints(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>(PrepareAsyncGetMinMaxHitPointsRaw(context, cq));\n    }\n  private:\n    virtual ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>* AsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) = 0;\n    virtual ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>* PrepareAsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) = 0;\n    virtual ::grpc::ClientReaderInterface< flatbuffers::grpc::Message<Monster>>* RetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) = 0;\n    virtual ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>* AsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) = 0;\n    virtual ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>* PrepareAsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq) = 0;\n    virtual ::grpc::ClientWriterInterface< flatbuffers::grpc::Message<Monster>>* GetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response) = 0;\n    virtual ::grpc::ClientAsyncWriterInterface< flatbuffers::grpc::Message<Monster>>* AsyncGetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq, void* tag) = 0;\n    virtual ::grpc::ClientAsyncWriterInterface< flatbuffers::grpc::Message<Monster>>* PrepareAsyncGetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq) = 0;\n    virtual ::grpc::ClientReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* GetMinMaxHitPointsRaw(::grpc::ClientContext* context) = 0;\n    virtual ::grpc::ClientAsyncReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* AsyncGetMinMaxHitPointsRaw(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq, void* tag) = 0;\n    virtual ::grpc::ClientAsyncReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* PrepareAsyncGetMinMaxHitPointsRaw(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq) = 0;\n  class CallbackService;\n  };\n  class Stub final : public StubInterface {\n   public:\n    Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel);\n    ::grpc::Status Store(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, flatbuffers::grpc::Message<Stat>* response) override;\n    // Callback unary (function form). Request/response must outlive callback.\n    void async_Store(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, flatbuffers::grpc::Message<Stat>* response, std::function<void(::grpc::Status)> on_done);\n    // Callback unary (reactor form).\n    void async_Store(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, flatbuffers::grpc::Message<Stat>* response, ::grpc::ClientUnaryReactor* reactor);\n    std::unique_ptr< ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>> AsyncStore(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>>(AsyncStoreRaw(context, request, cq));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>> PrepareAsyncStore(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>>(PrepareAsyncStoreRaw(context, request, cq));\n    }\n    std::unique_ptr< ::grpc::ClientReader< flatbuffers::grpc::Message<Monster>>> Retrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) {\n      return std::unique_ptr< ::grpc::ClientReader< flatbuffers::grpc::Message<Monster>>>(RetrieveRaw(context, request));\n    }\n    // Server streaming callback reactor entry.\n    void async_Retrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::ClientReadReactor< flatbuffers::grpc::Message<Monster> >* reactor);\n    std::unique_ptr< ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>> AsyncRetrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr< ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>>(AsyncRetrieveRaw(context, request, cq, tag));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>> PrepareAsyncRetrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>>(PrepareAsyncRetrieveRaw(context, request, cq));\n    }\n    std::unique_ptr< ::grpc::ClientWriter< flatbuffers::grpc::Message<Monster>>> GetMaxHitPoint(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response) {\n      return std::unique_ptr< ::grpc::ClientWriter< flatbuffers::grpc::Message<Monster>>>(GetMaxHitPointRaw(context, response));\n    }\n    // Client streaming callback reactor entry.\n    void async_GetMaxHitPoint(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::ClientWriteReactor< flatbuffers::grpc::Message<Monster> >* reactor);\n    std::unique_ptr< ::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>> AsyncGetMaxHitPoint(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr< ::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>>(AsyncGetMaxHitPointRaw(context, response, cq, tag));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>> PrepareAsyncGetMaxHitPoint(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>>(PrepareAsyncGetMaxHitPointRaw(context, response, cq));\n    }\n    std::unique_ptr< ::grpc::ClientReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>> GetMinMaxHitPoints(::grpc::ClientContext* context) {\n      return std::unique_ptr< ::grpc::ClientReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>(GetMinMaxHitPointsRaw(context));\n    }\n    // Bidirectional streaming callback reactor entry.\n    void async_GetMinMaxHitPoints(::grpc::ClientContext* context, ::grpc::ClientBidiReactor< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat> >* reactor);\n    std::unique_ptr<  ::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>> AsyncGetMinMaxHitPoints(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr< ::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>(AsyncGetMinMaxHitPointsRaw(context, cq, tag));\n    }\n    std::unique_ptr<  ::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>> PrepareAsyncGetMinMaxHitPoints(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>(PrepareAsyncGetMinMaxHitPointsRaw(context, cq));\n    }\n  \n   private:\n    std::shared_ptr< ::grpc::ChannelInterface> channel_;\n    ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>* AsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) override;\n    ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>* PrepareAsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) override;\n    ::grpc::ClientReader< flatbuffers::grpc::Message<Monster>>* RetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) override;\n    ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>* AsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) override;\n    ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>* PrepareAsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq) override;\n    ::grpc::ClientWriter< flatbuffers::grpc::Message<Monster>>* GetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response) override;\n    ::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>* AsyncGetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq, void* tag) override;\n    ::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>* PrepareAsyncGetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq) override;\n    ::grpc::ClientReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* GetMinMaxHitPointsRaw(::grpc::ClientContext* context) override;\n    ::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* AsyncGetMinMaxHitPointsRaw(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq, void* tag) override;\n    ::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* PrepareAsyncGetMinMaxHitPointsRaw(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq) override;\n    const ::grpc::internal::RpcMethod rpcmethod_Store_;\n    const ::grpc::internal::RpcMethod rpcmethod_Retrieve_;\n    const ::grpc::internal::RpcMethod rpcmethod_GetMaxHitPoint_;\n    const ::grpc::internal::RpcMethod rpcmethod_GetMinMaxHitPoints_;\n  };\n  static std::unique_ptr<Stub> NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options = ::grpc::StubOptions());\n  \n  class Service : public ::grpc::Service {\n   public:\n    Service();\n    virtual ~Service();\n    virtual ::grpc::Status Store(::grpc::ServerContext* context, const flatbuffers::grpc::Message<Monster>* request, flatbuffers::grpc::Message<Stat>* response);\n    virtual ::grpc::Status Retrieve(::grpc::ServerContext* context, const flatbuffers::grpc::Message<Stat>* request, ::grpc::ServerWriter< flatbuffers::grpc::Message<Monster>>* writer);\n    virtual ::grpc::Status GetMaxHitPoint(::grpc::ServerContext* context, ::grpc::ServerReader< flatbuffers::grpc::Message<Monster>>* reader, flatbuffers::grpc::Message<Stat>* response);\n    virtual ::grpc::Status GetMinMaxHitPoints(::grpc::ServerContext* context, ::grpc::ServerReaderWriter< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>* stream);\n  };\n  template <class BaseClass>\n  class WithAsyncMethod_Store : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithAsyncMethod_Store() {\n      ::grpc::Service::MarkMethodAsync(0);\n    }\n    ~WithAsyncMethod_Store() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status Store(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Monster>* /*request*/, flatbuffers::grpc::Message<Stat>* /*response*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    void RequestStore(::grpc::ServerContext* context, flatbuffers::grpc::Message<Monster>* request, ::grpc::ServerAsyncResponseWriter< flatbuffers::grpc::Message<Stat>>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n      ::grpc::Service::RequestAsyncUnary(0, context, request, response, new_call_cq, notification_cq, tag);\n    }\n  };\n  template <class BaseClass>\n  class WithAsyncMethod_Retrieve : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithAsyncMethod_Retrieve() {\n      ::grpc::Service::MarkMethodAsync(1);\n    }\n    ~WithAsyncMethod_Retrieve() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status Retrieve(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Stat>* /*request*/, ::grpc::ServerWriter< flatbuffers::grpc::Message<Monster>>* /*writer*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    void RequestRetrieve(::grpc::ServerContext* context, flatbuffers::grpc::Message<Stat>* request, ::grpc::ServerAsyncWriter< flatbuffers::grpc::Message<Monster>>* writer, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n      ::grpc::Service::RequestAsyncServerStreaming(1, context, request, writer, new_call_cq, notification_cq, tag);\n    }\n  };\n  template <class BaseClass>\n  class WithAsyncMethod_GetMaxHitPoint : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithAsyncMethod_GetMaxHitPoint() {\n      ::grpc::Service::MarkMethodAsync(2);\n    }\n    ~WithAsyncMethod_GetMaxHitPoint() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status GetMaxHitPoint(::grpc::ServerContext* /*context*/, ::grpc::ServerReader< flatbuffers::grpc::Message<Monster>>* /*reader*/, flatbuffers::grpc::Message<Stat>* /*response*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    void RequestGetMaxHitPoint(::grpc::ServerContext* context, ::grpc::ServerAsyncReader< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>* reader, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n      ::grpc::Service::RequestAsyncClientStreaming(2, context, reader, new_call_cq, notification_cq, tag);\n    }\n  };\n  template <class BaseClass>\n  class WithAsyncMethod_GetMinMaxHitPoints : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithAsyncMethod_GetMinMaxHitPoints() {\n      ::grpc::Service::MarkMethodAsync(3);\n    }\n    ~WithAsyncMethod_GetMinMaxHitPoints() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status GetMinMaxHitPoints(::grpc::ServerContext* /*context*/, ::grpc::ServerReaderWriter< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>* /*stream*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    void RequestGetMinMaxHitPoints(::grpc::ServerContext* context, ::grpc::ServerAsyncReaderWriter< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>* stream, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n      ::grpc::Service::RequestAsyncBidiStreaming(3, context, stream, new_call_cq, notification_cq, tag);\n    }\n  };\n  typedef   WithAsyncMethod_Store<  WithAsyncMethod_Retrieve<  WithAsyncMethod_GetMaxHitPoint<  WithAsyncMethod_GetMinMaxHitPoints<  Service   >   >   >   >   AsyncService;\n  template <class BaseClass>\n  class WithGenericMethod_Store : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithGenericMethod_Store() {\n      ::grpc::Service::MarkMethodGeneric(0);\n    }\n    ~WithGenericMethod_Store() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status Store(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Monster>* /*request*/, flatbuffers::grpc::Message<Stat>* /*response*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n  };\n  template <class BaseClass>\n  class WithGenericMethod_Retrieve : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithGenericMethod_Retrieve() {\n      ::grpc::Service::MarkMethodGeneric(1);\n    }\n    ~WithGenericMethod_Retrieve() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status Retrieve(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Stat>* /*request*/, ::grpc::ServerWriter< flatbuffers::grpc::Message<Monster>>* /*writer*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n  };\n  template <class BaseClass>\n  class WithGenericMethod_GetMaxHitPoint : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithGenericMethod_GetMaxHitPoint() {\n      ::grpc::Service::MarkMethodGeneric(2);\n    }\n    ~WithGenericMethod_GetMaxHitPoint() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status GetMaxHitPoint(::grpc::ServerContext* /*context*/, ::grpc::ServerReader< flatbuffers::grpc::Message<Monster>>* /*reader*/, flatbuffers::grpc::Message<Stat>* /*response*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n  };\n  template <class BaseClass>\n  class WithGenericMethod_GetMinMaxHitPoints : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithGenericMethod_GetMinMaxHitPoints() {\n      ::grpc::Service::MarkMethodGeneric(3);\n    }\n    ~WithGenericMethod_GetMinMaxHitPoints() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status GetMinMaxHitPoints(::grpc::ServerContext* /*context*/, ::grpc::ServerReaderWriter< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>* /*stream*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n  };\n  template <class BaseClass>\n  class WithStreamedUnaryMethod_Store : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithStreamedUnaryMethod_Store() {\n      ::grpc::Service::MarkMethodStreamed(0,\n        new ::grpc::internal::StreamedUnaryHandler< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>(std::bind(&WithStreamedUnaryMethod_Store<BaseClass>::StreamedStore, this, std::placeholders::_1, std::placeholders::_2)));\n    }\n    ~WithStreamedUnaryMethod_Store() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable regular version of this method\n    ::grpc::Status Store(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Monster>* /*request*/, flatbuffers::grpc::Message<Stat>* /*response*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    // replace default version of method with streamed unary\n    virtual ::grpc::Status StreamedStore(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< flatbuffers::grpc::Message<Monster>,flatbuffers::grpc::Message<Stat>>* server_unary_streamer) = 0;\n  };\n  typedef   WithStreamedUnaryMethod_Store<  Service   >   StreamedUnaryService;\n  template <class BaseClass>\n  class WithSplitStreamingMethod_Retrieve : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) { }\n   public:\n    WithSplitStreamingMethod_Retrieve() {\n      ::grpc::Service::MarkMethodStreamed(1,\n        new ::grpc::internal::SplitServerStreamingHandler< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>(std::bind(&WithSplitStreamingMethod_Retrieve<BaseClass>::StreamedRetrieve, this, std::placeholders::_1, std::placeholders::_2)));\n    }\n    ~WithSplitStreamingMethod_Retrieve() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable regular version of this method\n    ::grpc::Status Retrieve(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Stat>* /*request*/, ::grpc::ServerWriter< flatbuffers::grpc::Message<Monster>>* /*writer*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    // replace default version of method with split streamed\n    virtual ::grpc::Status StreamedRetrieve(::grpc::ServerContext* context, ::grpc::ServerSplitStreamer< flatbuffers::grpc::Message<Stat>,flatbuffers::grpc::Message<Monster>>* server_split_streamer) = 0;\n  };\n  typedef   WithSplitStreamingMethod_Retrieve<  Service   >   SplitStreamedService;\n  typedef   WithStreamedUnaryMethod_Store<  WithSplitStreamingMethod_Retrieve<  Service   >   >   StreamedService;\n};\n\n#if defined(GRPC_CALLBACK_API_NONEXPERIMENTAL)\nclass MonsterStorage::CallbackService : public ::grpc::Service {\n public:\n  CallbackService();\n  virtual ~CallbackService();\n  virtual ::grpc::ServerUnaryReactor* Store(::grpc::CallbackServerContext* context, const flatbuffers::grpc::Message<Monster>* request, flatbuffers::grpc::Message<Stat>* response);\n  virtual ::grpc::ServerWriteReactor<flatbuffers::grpc::Message<Monster>>* Retrieve(::grpc::CallbackServerContext* context, const flatbuffers::grpc::Message<Stat>* request);\n  virtual ::grpc::ServerReadReactor<flatbuffers::grpc::Message<Monster>>* GetMaxHitPoint(::grpc::CallbackServerContext* context, flatbuffers::grpc::Message<Stat>* response);\n  virtual ::grpc::ServerBidiReactor<flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* GetMinMaxHitPoints(::grpc::CallbackServerContext* context);\n};\n#else\n// Callback API requested but not available in this gRPC version.\n#endif // GRPC_CALLBACK_API_NONEXPERIMENTAL\n\n// FlatBuffers: Callback API code generated.\n#define FLATBUFFERS_GENERATED_GRPC_CALLBACK_API 1\n\n}  // namespace Example\n}  // namespace MyGame\n\n\n#endif  // GRPC_monster_5ftest__INCLUDED\n"
  },
  {
    "path": "tests/monster_test.h",
    "content": "#ifndef TESTS_MONSTER_TEST_H\n#define TESTS_MONSTER_TEST_H\n\n#include <string>\n\n#include \"flatbuffers/detached_buffer.h\"\n#include \"monster_test_generated.h\"\n\nnamespace flatbuffers {\nnamespace tests {\n\nflatbuffers::DetachedBuffer CreateFlatBufferTest(std::string& buffer);\n\nvoid AccessFlatBufferTest(const uint8_t* flatbuf, size_t length,\n                          bool pooled = true);\n\nvoid MutateFlatBuffersTest(uint8_t* flatbuf, std::size_t length);\n\nvoid ObjectFlatBuffersTest(uint8_t* flatbuf);\n\nvoid CheckMonsterObject(MyGame::Example::MonsterT* monster2);\n\nvoid SizePrefixedTest();\n\nvoid TestMonsterExtraFloats(const std::string& tests_data_path);\n\nvoid EnumNamesTest();\n\nvoid TypeAliasesTest();\n\nvoid ParseAndGenerateTextTest(const std::string& tests_data_path, bool binary);\n\nvoid UnPackTo(const uint8_t* flatbuf);\n\n}  // namespace tests\n}  // namespace flatbuffers\n\n#endif\n"
  },
  {
    "path": "tests/monster_test.schema.json",
    "content": "{\n  \"$schema\": \"https://json-schema.org/draft/2019-09/schema\",\n  \"definitions\": {\n    \"MyGame_OtherNameSpace_FromInclude\" : {\n      \"type\" : \"string\",\n      \"enum\": [\"IncludeVal\"]\n    },\n    \"MyGame_Example_Color\" : {\n      \"type\" : \"string\",\n      \"enum\": [\"Red\", \"Green\", \"Blue\"]\n    },\n    \"MyGame_Example_Race\" : {\n      \"type\" : \"string\",\n      \"enum\": [\"None\", \"Human\", \"Dwarf\", \"Elf\"]\n    },\n    \"MyGame_Example_LongEnum\" : {\n      \"type\" : \"string\",\n      \"enum\": [\"LongOne\", \"LongTwo\", \"LongBig\"]\n    },\n    \"MyGame_Example_Any\" : {\n      \"type\" : \"string\",\n      \"enum\": [\"NONE\", \"Monster\", \"TestSimpleTableWithEnum\", \"MyGame_Example2_Monster\"]\n    },\n    \"MyGame_Example_AnyUniqueAliases\" : {\n      \"type\" : \"string\",\n      \"enum\": [\"NONE\", \"M\", \"TS\", \"M2\"]\n    },\n    \"MyGame_Example_AnyAmbiguousAliases\" : {\n      \"type\" : \"string\",\n      \"enum\": [\"NONE\", \"M1\", \"M2\", \"M3\"]\n    },\n    \"MyGame_OtherNameSpace_Unused\" : {\n      \"type\" : \"object\",\n      \"properties\" : {\n        \"a\" : {\n                \"type\" : \"integer\", \"minimum\" : -2147483648, \"maximum\" : 2147483647\n              }\n      },\n      \"additionalProperties\" : false\n    },\n    \"MyGame_OtherNameSpace_TableB\" : {\n      \"type\" : \"object\",\n      \"properties\" : {\n        \"a\" : {\n                \"$ref\" : \"#/definitions/TableA\"\n              }\n      },\n      \"additionalProperties\" : false\n    },\n    \"TableA\" : {\n      \"type\" : \"object\",\n      \"properties\" : {\n        \"b\" : {\n                \"$ref\" : \"#/definitions/MyGame_OtherNameSpace_TableB\"\n              }\n      },\n      \"additionalProperties\" : false\n    },\n    \"MyGame_InParentNamespace\" : {\n      \"type\" : \"object\",\n      \"properties\" : {\n      },\n      \"additionalProperties\" : false\n    },\n    \"MyGame_Example2_Monster\" : {\n      \"type\" : \"object\",\n      \"properties\" : {\n      },\n      \"additionalProperties\" : false\n    },\n    \"MyGame_Example_Test\" : {\n      \"type\" : \"object\",\n      \"properties\" : {\n        \"a\" : {\n                \"type\" : \"integer\", \"minimum\" : -32768, \"maximum\" : 32767\n              },\n        \"b\" : {\n                \"type\" : \"integer\", \"minimum\" : -128, \"maximum\" : 127\n              }\n      },\n      \"additionalProperties\" : false\n    },\n    \"MyGame_Example_TestSimpleTableWithEnum\" : {\n      \"type\" : \"object\",\n      \"properties\" : {\n        \"color\" : {\n                \"$ref\" : \"#/definitions/MyGame_Example_Color\"\n              }\n      },\n      \"additionalProperties\" : false\n    },\n    \"MyGame_Example_Vec3\" : {\n      \"type\" : \"object\",\n      \"properties\" : {\n        \"x\" : {\n                \"type\" : \"number\"\n              },\n        \"y\" : {\n                \"type\" : \"number\"\n              },\n        \"z\" : {\n                \"type\" : \"number\"\n              },\n        \"test1\" : {\n                \"type\" : \"number\"\n              },\n        \"test2\" : {\n                \"$ref\" : \"#/definitions/MyGame_Example_Color\"\n              },\n        \"test3\" : {\n                \"$ref\" : \"#/definitions/MyGame_Example_Test\"\n              }\n      },\n      \"additionalProperties\" : false\n    },\n    \"MyGame_Example_Ability\" : {\n      \"type\" : \"object\",\n      \"properties\" : {\n        \"id\" : {\n                \"type\" : \"integer\", \"minimum\" : 0, \"maximum\" : 4294967295\n              },\n        \"distance\" : {\n                \"type\" : \"integer\", \"minimum\" : 0, \"maximum\" : 4294967295\n              }\n      },\n      \"additionalProperties\" : false\n    },\n    \"MyGame_Example_StructOfStructs\" : {\n      \"type\" : \"object\",\n      \"properties\" : {\n        \"a\" : {\n                \"$ref\" : \"#/definitions/MyGame_Example_Ability\"\n              },\n        \"b\" : {\n                \"$ref\" : \"#/definitions/MyGame_Example_Test\"\n              },\n        \"c\" : {\n                \"$ref\" : \"#/definitions/MyGame_Example_Ability\"\n              }\n      },\n      \"additionalProperties\" : false\n    },\n    \"MyGame_Example_StructOfStructsOfStructs\" : {\n      \"type\" : \"object\",\n      \"properties\" : {\n        \"a\" : {\n                \"$ref\" : \"#/definitions/MyGame_Example_StructOfStructs\"\n              }\n      },\n      \"additionalProperties\" : false\n    },\n    \"MyGame_Example_Stat\" : {\n      \"type\" : \"object\",\n      \"properties\" : {\n        \"id\" : {\n                \"type\" : \"string\"\n              },\n        \"val\" : {\n                \"type\" : \"integer\", \"minimum\" : -9223372036854775808, \"maximum\" : 9223372036854775807\n              },\n        \"count\" : {\n                \"type\" : \"integer\", \"minimum\" : 0, \"maximum\" : 65535\n              }\n      },\n      \"additionalProperties\" : false\n    },\n    \"MyGame_Example_Referrable\" : {\n      \"type\" : \"object\",\n      \"properties\" : {\n        \"id\" : {\n                \"type\" : \"integer\", \"minimum\" : 0, \"maximum\" : 18446744073709551615\n              }\n      },\n      \"additionalProperties\" : false\n    },\n    \"MyGame_Example_Monster\" : {\n      \"type\" : \"object\",\n      \"description\" : \"an example documentation comment: \\\"monster object\\\"\",\n      \"properties\" : {\n        \"pos\" : {\n                \"$ref\" : \"#/definitions/MyGame_Example_Vec3\"\n              },\n        \"mana\" : {\n                \"type\" : \"integer\", \"minimum\" : -32768, \"maximum\" : 32767\n              },\n        \"hp\" : {\n                \"type\" : \"integer\", \"minimum\" : -32768, \"maximum\" : 32767\n              },\n        \"name\" : {\n                \"type\" : \"string\"\n              },\n        \"friendly\" : {\n                \"type\" : \"boolean\",\n                \"deprecated\" : true\n              },\n        \"inventory\" : {\n                \"type\" : \"array\", \"items\" : {\"type\" : \"integer\", \"minimum\" : 0, \"maximum\" :255}\n              },\n        \"color\" : {\n                \"$ref\" : \"#/definitions/MyGame_Example_Color\"\n              },\n        \"test_type\" : {\n                \"$ref\" : \"#/definitions/MyGame_Example_Any\"\n              },\n        \"test\" : {\n                \"anyOf\": [{ \"$ref\" : \"#/definitions/MyGame_Example_Monster\" },{ \"$ref\" : \"#/definitions/MyGame_Example_TestSimpleTableWithEnum\" },{ \"$ref\" : \"#/definitions/MyGame_Example2_Monster\" }]\n              },\n        \"test4\" : {\n                \"type\" : \"array\", \"items\" : {\"$ref\" : \"#/definitions/MyGame_Example_Test\"}\n              },\n        \"testarrayofstring\" : {\n                \"type\" : \"array\", \"items\" : {\"type\" : \"string\"}\n              },\n        \"testarrayoftables\" : {\n                \"type\" : \"array\", \"items\" : {\"$ref\" : \"#/definitions/MyGame_Example_Monster\"},\n                \"description\" : \"an example documentation comment: this will end up in the generated code\\nmultiline too\"\n              },\n        \"enemy\" : {\n                \"$ref\" : \"#/definitions/MyGame_Example_Monster\"\n              },\n        \"testnestedflatbuffer\" : {\n                \"type\" : \"array\", \"items\" : {\"type\" : \"integer\", \"minimum\" : 0, \"maximum\" :255}\n              },\n        \"testempty\" : {\n                \"$ref\" : \"#/definitions/MyGame_Example_Stat\"\n              },\n        \"testbool\" : {\n                \"type\" : \"boolean\"\n              },\n        \"testhashs32_fnv1\" : {\n                \"type\" : \"integer\", \"minimum\" : -2147483648, \"maximum\" : 2147483647\n              },\n        \"testhashu32_fnv1\" : {\n                \"type\" : \"integer\", \"minimum\" : 0, \"maximum\" : 4294967295\n              },\n        \"testhashs64_fnv1\" : {\n                \"type\" : \"integer\", \"minimum\" : -9223372036854775808, \"maximum\" : 9223372036854775807\n              },\n        \"testhashu64_fnv1\" : {\n                \"type\" : \"integer\", \"minimum\" : 0, \"maximum\" : 18446744073709551615\n              },\n        \"testhashs32_fnv1a\" : {\n                \"type\" : \"integer\", \"minimum\" : -2147483648, \"maximum\" : 2147483647\n              },\n        \"testhashu32_fnv1a\" : {\n                \"type\" : \"integer\", \"minimum\" : 0, \"maximum\" : 4294967295\n              },\n        \"testhashs64_fnv1a\" : {\n                \"type\" : \"integer\", \"minimum\" : -9223372036854775808, \"maximum\" : 9223372036854775807\n              },\n        \"testhashu64_fnv1a\" : {\n                \"type\" : \"integer\", \"minimum\" : 0, \"maximum\" : 18446744073709551615\n              },\n        \"testarrayofbools\" : {\n                \"type\" : \"array\", \"items\" : {\"type\" : \"boolean\"}\n              },\n        \"testf\" : {\n                \"type\" : \"number\"\n              },\n        \"testf2\" : {\n                \"type\" : \"number\"\n              },\n        \"testf3\" : {\n                \"type\" : \"number\"\n              },\n        \"testarrayofstring2\" : {\n                \"type\" : \"array\", \"items\" : {\"type\" : \"string\"}\n              },\n        \"testarrayofsortedstruct\" : {\n                \"type\" : \"array\", \"items\" : {\"$ref\" : \"#/definitions/MyGame_Example_Ability\"}\n              },\n        \"flex\" : {\n                \"type\" : \"array\", \"items\" : {\"type\" : \"integer\", \"minimum\" : 0, \"maximum\" :255}\n              },\n        \"test5\" : {\n                \"type\" : \"array\", \"items\" : {\"$ref\" : \"#/definitions/MyGame_Example_Test\"}\n              },\n        \"vector_of_longs\" : {\n                \"type\" : \"array\", \"items\" : {\"type\" : \"integer\", \"minimum\" : -9223372036854775808, \"maximum\" : 9223372036854775807}\n              },\n        \"vector_of_doubles\" : {\n                \"type\" : \"array\", \"items\" : {\"type\" : \"number\"}\n              },\n        \"parent_namespace_test\" : {\n                \"$ref\" : \"#/definitions/MyGame_InParentNamespace\"\n              },\n        \"vector_of_referrables\" : {\n                \"type\" : \"array\", \"items\" : {\"$ref\" : \"#/definitions/MyGame_Example_Referrable\"}\n              },\n        \"single_weak_reference\" : {\n                \"type\" : \"integer\", \"minimum\" : 0, \"maximum\" : 18446744073709551615\n              },\n        \"vector_of_weak_references\" : {\n                \"type\" : \"array\", \"items\" : {\"type\" : \"integer\", \"minimum\" : 0, \"maximum\" : 18446744073709551615}\n              },\n        \"vector_of_strong_referrables\" : {\n                \"type\" : \"array\", \"items\" : {\"$ref\" : \"#/definitions/MyGame_Example_Referrable\"}\n              },\n        \"co_owning_reference\" : {\n                \"type\" : \"integer\", \"minimum\" : 0, \"maximum\" : 18446744073709551615\n              },\n        \"vector_of_co_owning_references\" : {\n                \"type\" : \"array\", \"items\" : {\"type\" : \"integer\", \"minimum\" : 0, \"maximum\" : 18446744073709551615}\n              },\n        \"non_owning_reference\" : {\n                \"type\" : \"integer\", \"minimum\" : 0, \"maximum\" : 18446744073709551615\n              },\n        \"vector_of_non_owning_references\" : {\n                \"type\" : \"array\", \"items\" : {\"type\" : \"integer\", \"minimum\" : 0, \"maximum\" : 18446744073709551615}\n              },\n        \"any_unique_type\" : {\n                \"$ref\" : \"#/definitions/MyGame_Example_AnyUniqueAliases\"\n              },\n        \"any_unique\" : {\n                \"anyOf\": [{ \"$ref\" : \"#/definitions/MyGame_Example_Monster\" },{ \"$ref\" : \"#/definitions/MyGame_Example_TestSimpleTableWithEnum\" },{ \"$ref\" : \"#/definitions/MyGame_Example2_Monster\" }]\n              },\n        \"any_ambiguous_type\" : {\n                \"$ref\" : \"#/definitions/MyGame_Example_AnyAmbiguousAliases\"\n              },\n        \"any_ambiguous\" : {\n                \"anyOf\": [{ \"$ref\" : \"#/definitions/MyGame_Example_Monster\" },{ \"$ref\" : \"#/definitions/MyGame_Example_Monster\" },{ \"$ref\" : \"#/definitions/MyGame_Example_Monster\" }]\n              },\n        \"vector_of_enums\" : {\n                \"type\" : \"array\", \"items\" : {\"$ref\" : \"#/definitions/MyGame_Example_Color\"}\n              },\n        \"signed_enum\" : {\n                \"$ref\" : \"#/definitions/MyGame_Example_Race\"\n              },\n        \"testrequirednestedflatbuffer\" : {\n                \"type\" : \"array\", \"items\" : {\"type\" : \"integer\", \"minimum\" : 0, \"maximum\" :255}\n              },\n        \"scalar_key_sorted_tables\" : {\n                \"type\" : \"array\", \"items\" : {\"$ref\" : \"#/definitions/MyGame_Example_Stat\"}\n              },\n        \"native_inline\" : {\n                \"$ref\" : \"#/definitions/MyGame_Example_Test\"\n              },\n        \"long_enum_non_enum_default\" : {\n                \"$ref\" : \"#/definitions/MyGame_Example_LongEnum\"\n              },\n        \"long_enum_normal_default\" : {\n                \"$ref\" : \"#/definitions/MyGame_Example_LongEnum\"\n              },\n        \"nan_default\" : {\n                \"type\" : \"number\"\n              },\n        \"inf_default\" : {\n                \"type\" : \"number\"\n              },\n        \"positive_inf_default\" : {\n                \"type\" : \"number\"\n              },\n        \"infinity_default\" : {\n                \"type\" : \"number\"\n              },\n        \"positive_infinity_default\" : {\n                \"type\" : \"number\"\n              },\n        \"negative_inf_default\" : {\n                \"type\" : \"number\"\n              },\n        \"negative_infinity_default\" : {\n                \"type\" : \"number\"\n              },\n        \"double_inf_default\" : {\n                \"type\" : \"number\"\n              }\n      },\n      \"required\" : [\"name\"],\n      \"additionalProperties\" : false\n    },\n    \"MyGame_Example_TypeAliases\" : {\n      \"type\" : \"object\",\n      \"properties\" : {\n        \"i8\" : {\n                \"type\" : \"integer\", \"minimum\" : -128, \"maximum\" : 127\n              },\n        \"u8\" : {\n                \"type\" : \"integer\", \"minimum\" : 0, \"maximum\" :255\n              },\n        \"i16\" : {\n                \"type\" : \"integer\", \"minimum\" : -32768, \"maximum\" : 32767\n              },\n        \"u16\" : {\n                \"type\" : \"integer\", \"minimum\" : 0, \"maximum\" : 65535\n              },\n        \"i32\" : {\n                \"type\" : \"integer\", \"minimum\" : -2147483648, \"maximum\" : 2147483647\n              },\n        \"u32\" : {\n                \"type\" : \"integer\", \"minimum\" : 0, \"maximum\" : 4294967295\n              },\n        \"i64\" : {\n                \"type\" : \"integer\", \"minimum\" : -9223372036854775808, \"maximum\" : 9223372036854775807\n              },\n        \"u64\" : {\n                \"type\" : \"integer\", \"minimum\" : 0, \"maximum\" : 18446744073709551615\n              },\n        \"f32\" : {\n                \"type\" : \"number\"\n              },\n        \"f64\" : {\n                \"type\" : \"number\"\n              },\n        \"v8\" : {\n                \"type\" : \"array\", \"items\" : {\"type\" : \"integer\", \"minimum\" : -128, \"maximum\" : 127}\n              },\n        \"vf64\" : {\n                \"type\" : \"array\", \"items\" : {\"type\" : \"number\"}\n              }\n      },\n      \"additionalProperties\" : false\n    }\n  },\n  \"$ref\" : \"#/definitions/MyGame_Example_Monster\"\n}\n"
  },
  {
    "path": "tests/monster_test_callback.grpc.fb.cc",
    "content": "// Callback variant source references primary generated implementation.\n#include \"monster_test_callback.grpc.fb.h\"\n"
  },
  {
    "path": "tests/monster_test_callback.grpc.fb.h",
    "content": "// Callback variant copy of monster_test.grpc.fb.h generated with\n// --grpc-callback-api (kept separate as a golden for callback API feature\n// evolution)\n#include \"monster_test.grpc.fb.h\"\n"
  },
  {
    "path": "tests/monster_test_generated.grpc.fb.cc",
    "content": "// Generated by the gRPC C++ plugin.\n// FlatBuffers modified generator: native gRPC callback client API enabled when\n// --grpc-callback-api. source: monster_test\n\n#include \"monster_test_generated.h\"\n\n#include <grpcpp/impl/codegen/async_stream.h>\n#include <grpcpp/impl/codegen/async_unary_call.h>\n#include <grpcpp/impl/codegen/channel_interface.h>\n#include <grpcpp/impl/codegen/client_unary_call.h>\n#include <grpcpp/impl/codegen/method_handler.h>\n#include <grpcpp/impl/codegen/rpc_service_method.h>\n#include <grpcpp/impl/codegen/service_type.h>\n#include <grpcpp/impl/codegen/sync_stream.h>\n\n#include \"monster_test.grpc.fb.h\"\nnamespace MyGame {\nnamespace Example {\n\nstatic const char* MonsterStorage_method_names[] = {\n    \"/MyGame.Example.MonsterStorage/Store\",\n    \"/MyGame.Example.MonsterStorage/Retrieve\",\n    \"/MyGame.Example.MonsterStorage/GetMaxHitPoint\",\n    \"/MyGame.Example.MonsterStorage/GetMinMaxHitPoints\",\n};\n\nstd::unique_ptr<MonsterStorage::Stub> MonsterStorage::NewStub(\n    const std::shared_ptr<::grpc::ChannelInterface>& channel,\n    const ::grpc::StubOptions& /*options*/) {\n  std::unique_ptr<MonsterStorage::Stub> stub(new MonsterStorage::Stub(channel));\n  return stub;\n}\n\nMonsterStorage::Stub::Stub(\n    const std::shared_ptr<::grpc::ChannelInterface>& channel)\n    : channel_(channel),\n      rpcmethod_Store_(MonsterStorage_method_names[0],\n                       ::grpc::internal::RpcMethod::NORMAL_RPC, channel),\n      rpcmethod_Retrieve_(MonsterStorage_method_names[1],\n                          ::grpc::internal::RpcMethod::SERVER_STREAMING,\n                          channel),\n      rpcmethod_GetMaxHitPoint_(MonsterStorage_method_names[2],\n                                ::grpc::internal::RpcMethod::CLIENT_STREAMING,\n                                channel),\n      rpcmethod_GetMinMaxHitPoints_(MonsterStorage_method_names[3],\n                                    ::grpc::internal::RpcMethod::BIDI_STREAMING,\n                                    channel) {}\n\n::grpc::Status MonsterStorage::Stub::Store(\n    ::grpc::ClientContext* context,\n    const flatbuffers::grpc::Message<Monster>& request,\n    flatbuffers::grpc::Message<Stat>* response) {\n  return ::grpc::internal::BlockingUnaryCall(channel_.get(), rpcmethod_Store_,\n                                             context, request, response);\n}\n\n::grpc::ClientAsyncResponseReader<flatbuffers::grpc::Message<Stat>>*\nMonsterStorage::Stub::AsyncStoreRaw(\n    ::grpc::ClientContext* context,\n    const flatbuffers::grpc::Message<Monster>& request,\n    ::grpc::CompletionQueue* cq) {\n  return ::grpc::internal::ClientAsyncResponseReaderFactory<\n      flatbuffers::grpc::Message<Stat>>::Create(channel_.get(), cq,\n                                                rpcmethod_Store_, context,\n                                                request, true);\n}\n\n::grpc::ClientAsyncResponseReader<flatbuffers::grpc::Message<Stat>>*\nMonsterStorage::Stub::PrepareAsyncStoreRaw(\n    ::grpc::ClientContext* context,\n    const flatbuffers::grpc::Message<Monster>& request,\n    ::grpc::CompletionQueue* cq) {\n  return ::grpc::internal::ClientAsyncResponseReaderFactory<\n      flatbuffers::grpc::Message<Stat>>::Create(channel_.get(), cq,\n                                                rpcmethod_Store_, context,\n                                                request, false);\n}\n\n::grpc::ClientReader<flatbuffers::grpc::Message<Monster>>*\nMonsterStorage::Stub::RetrieveRaw(\n    ::grpc::ClientContext* context,\n    const flatbuffers::grpc::Message<Stat>& request) {\n  return ::grpc::internal::ClientReaderFactory<\n      flatbuffers::grpc::Message<Monster>>::Create(channel_.get(),\n                                                   rpcmethod_Retrieve_, context,\n                                                   request);\n}\n\n::grpc::ClientAsyncReader<flatbuffers::grpc::Message<Monster>>*\nMonsterStorage::Stub::AsyncRetrieveRaw(\n    ::grpc::ClientContext* context,\n    const flatbuffers::grpc::Message<Stat>& request,\n    ::grpc::CompletionQueue* cq, void* tag) {\n  return ::grpc::internal::ClientAsyncReaderFactory<\n      flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), cq,\n                                                   rpcmethod_Retrieve_, context,\n                                                   request, true, tag);\n}\n\n::grpc::ClientAsyncReader<flatbuffers::grpc::Message<Monster>>*\nMonsterStorage::Stub::PrepareAsyncRetrieveRaw(\n    ::grpc::ClientContext* context,\n    const flatbuffers::grpc::Message<Stat>& request,\n    ::grpc::CompletionQueue* cq) {\n  return ::grpc::internal::ClientAsyncReaderFactory<\n      flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), cq,\n                                                   rpcmethod_Retrieve_, context,\n                                                   request, false, nullptr);\n}\n\n::grpc::ClientWriter<flatbuffers::grpc::Message<Monster>>*\nMonsterStorage::Stub::GetMaxHitPointRaw(\n    ::grpc::ClientContext* context,\n    flatbuffers::grpc::Message<Stat>* response) {\n  return ::grpc::internal::ClientWriterFactory<\n      flatbuffers::grpc::Message<Monster>>::Create(channel_.get(),\n                                                   rpcmethod_GetMaxHitPoint_,\n                                                   context, response);\n}\n\n::grpc::ClientAsyncWriter<flatbuffers::grpc::Message<Monster>>*\nMonsterStorage::Stub::AsyncGetMaxHitPointRaw(\n    ::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response,\n    ::grpc::CompletionQueue* cq, void* tag) {\n  return ::grpc::internal::ClientAsyncWriterFactory<\n      flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), cq,\n                                                   rpcmethod_GetMaxHitPoint_,\n                                                   context, response, true,\n                                                   tag);\n}\n\n::grpc::ClientAsyncWriter<flatbuffers::grpc::Message<Monster>>*\nMonsterStorage::Stub::PrepareAsyncGetMaxHitPointRaw(\n    ::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response,\n    ::grpc::CompletionQueue* cq) {\n  return ::grpc::internal::ClientAsyncWriterFactory<\n      flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), cq,\n                                                   rpcmethod_GetMaxHitPoint_,\n                                                   context, response, false,\n                                                   nullptr);\n}\n\n::grpc::ClientReaderWriter<flatbuffers::grpc::Message<Monster>,\n                           flatbuffers::grpc::Message<Stat>>*\nMonsterStorage::Stub::GetMinMaxHitPointsRaw(::grpc::ClientContext* context) {\n  return ::grpc::internal::ClientReaderWriterFactory<\n      flatbuffers::grpc::Message<Monster>,\n      flatbuffers::grpc::Message<Stat>>::Create(channel_.get(),\n                                                rpcmethod_GetMinMaxHitPoints_,\n                                                context);\n}\n\n::grpc::ClientAsyncReaderWriter<flatbuffers::grpc::Message<Monster>,\n                                flatbuffers::grpc::Message<Stat>>*\nMonsterStorage::Stub::AsyncGetMinMaxHitPointsRaw(::grpc::ClientContext* context,\n                                                 ::grpc::CompletionQueue* cq,\n                                                 void* tag) {\n  return ::grpc::internal::ClientAsyncReaderWriterFactory<\n      flatbuffers::grpc::Message<Monster>,\n      flatbuffers::grpc::Message<Stat>>::Create(channel_.get(), cq,\n                                                rpcmethod_GetMinMaxHitPoints_,\n                                                context, true, tag);\n}\n\n::grpc::ClientAsyncReaderWriter<flatbuffers::grpc::Message<Monster>,\n                                flatbuffers::grpc::Message<Stat>>*\nMonsterStorage::Stub::PrepareAsyncGetMinMaxHitPointsRaw(\n    ::grpc::ClientContext* context, ::grpc::CompletionQueue* cq) {\n  return ::grpc::internal::ClientAsyncReaderWriterFactory<\n      flatbuffers::grpc::Message<Monster>,\n      flatbuffers::grpc::Message<Stat>>::Create(channel_.get(), cq,\n                                                rpcmethod_GetMinMaxHitPoints_,\n                                                context, false, nullptr);\n}\n\nMonsterStorage::Service::Service() {\n  AddMethod(new ::grpc::internal::RpcServiceMethod(\n      MonsterStorage_method_names[0], ::grpc::internal::RpcMethod::NORMAL_RPC,\n      new ::grpc::internal::RpcMethodHandler<\n          MonsterStorage::Service, flatbuffers::grpc::Message<Monster>,\n          flatbuffers::grpc::Message<Stat>>(\n          std::mem_fn(&MonsterStorage::Service::Store), this)));\n  AddMethod(new ::grpc::internal::RpcServiceMethod(\n      MonsterStorage_method_names[1],\n      ::grpc::internal::RpcMethod::SERVER_STREAMING,\n      new ::grpc::internal::ServerStreamingHandler<\n          MonsterStorage::Service, flatbuffers::grpc::Message<Stat>,\n          flatbuffers::grpc::Message<Monster>>(\n          std::mem_fn(&MonsterStorage::Service::Retrieve), this)));\n  AddMethod(new ::grpc::internal::RpcServiceMethod(\n      MonsterStorage_method_names[2],\n      ::grpc::internal::RpcMethod::CLIENT_STREAMING,\n      new ::grpc::internal::ClientStreamingHandler<\n          MonsterStorage::Service, flatbuffers::grpc::Message<Monster>,\n          flatbuffers::grpc::Message<Stat>>(\n          std::mem_fn(&MonsterStorage::Service::GetMaxHitPoint), this)));\n  AddMethod(new ::grpc::internal::RpcServiceMethod(\n      MonsterStorage_method_names[3],\n      ::grpc::internal::RpcMethod::BIDI_STREAMING,\n      new ::grpc::internal::BidiStreamingHandler<\n          MonsterStorage::Service, flatbuffers::grpc::Message<Monster>,\n          flatbuffers::grpc::Message<Stat>>(\n          std::mem_fn(&MonsterStorage::Service::GetMinMaxHitPoints), this)));\n}\n\nMonsterStorage::Service::~Service() {}\n\n::grpc::Status MonsterStorage::Service::Store(\n    ::grpc::ServerContext* /*context*/,\n    const flatbuffers::grpc::Message<Monster>* /*request*/,\n    flatbuffers::grpc::Message<Stat>* /*response*/) {\n  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n}\n\n::grpc::Status MonsterStorage::Service::Retrieve(\n    ::grpc::ServerContext* /*context*/,\n    const flatbuffers::grpc::Message<Stat>* /*request*/,\n    ::grpc::ServerWriter<flatbuffers::grpc::Message<Monster>>* /*writer*/) {\n  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n}\n\n::grpc::Status MonsterStorage::Service::GetMaxHitPoint(\n    ::grpc::ServerContext* /*context*/,\n    ::grpc::ServerReader<flatbuffers::grpc::Message<Monster>>* /*reader*/,\n    flatbuffers::grpc::Message<Stat>* /*response*/) {\n  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n}\n\n::grpc::Status MonsterStorage::Service::GetMinMaxHitPoints(\n    ::grpc::ServerContext* /*context*/,\n    ::grpc::ServerReaderWriter<\n        flatbuffers::grpc::Message<Stat>,\n        flatbuffers::grpc::Message<Monster>>* /*stream*/) {\n  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n}\n\n}  // namespace Example\n}  // namespace MyGame\n"
  },
  {
    "path": "tests/monster_test_generated.grpc.fb.h",
    "content": "// Generated by the gRPC C++ plugin.\n// If you make any local change, they will be lost.\n// source: monster_test\n#ifndef GRPC_monster_5ftest__INCLUDED\n#define GRPC_monster_5ftest__INCLUDED\n\n#include <grpcpp/impl/codegen/async_stream.h>\n#include <grpcpp/impl/codegen/async_unary_call.h>\n#include <grpcpp/impl/codegen/method_handler.h>\n#include <grpcpp/impl/codegen/proto_utils.h>\n#include <grpcpp/impl/codegen/rpc_method.h>\n#include <grpcpp/impl/codegen/service_type.h>\n#include <grpcpp/impl/codegen/status.h>\n#include <grpcpp/impl/codegen/stub_options.h>\n#include <grpcpp/impl/codegen/sync_stream.h>\n\n#include \"flatbuffers/grpc.h\"\n#include \"monster_test_generated.h\"\n\nnamespace grpc {\nclass CompletionQueue;\nclass Channel;\nclass ServerCompletionQueue;\nclass ServerContext;\n}  // namespace grpc\n\nnamespace MyGame {\nnamespace Example {\n\nclass MonsterStorage final {\n public:\n  static constexpr char const* service_full_name() {\n    return \"MyGame.Example.MonsterStorage\";\n  }\n  class StubInterface {\n   public:\n    virtual ~StubInterface() {}\n    virtual ::grpc::Status Store(\n        ::grpc::ClientContext* context,\n        const flatbuffers::grpc::Message<Monster>& request,\n        flatbuffers::grpc::Message<Stat>* response) = 0;\n    std::unique_ptr<::grpc::ClientAsyncResponseReaderInterface<\n        flatbuffers::grpc::Message<Stat>>>\n    AsyncStore(::grpc::ClientContext* context,\n               const flatbuffers::grpc::Message<Monster>& request,\n               ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr<::grpc::ClientAsyncResponseReaderInterface<\n          flatbuffers::grpc::Message<Stat>>>(\n          AsyncStoreRaw(context, request, cq));\n    }\n    std::unique_ptr<::grpc::ClientAsyncResponseReaderInterface<\n        flatbuffers::grpc::Message<Stat>>>\n    PrepareAsyncStore(::grpc::ClientContext* context,\n                      const flatbuffers::grpc::Message<Monster>& request,\n                      ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr<::grpc::ClientAsyncResponseReaderInterface<\n          flatbuffers::grpc::Message<Stat>>>(\n          PrepareAsyncStoreRaw(context, request, cq));\n    }\n    std::unique_ptr<\n        ::grpc::ClientReaderInterface<flatbuffers::grpc::Message<Monster>>>\n    Retrieve(::grpc::ClientContext* context,\n             const flatbuffers::grpc::Message<Stat>& request) {\n      return std::unique_ptr<\n          ::grpc::ClientReaderInterface<flatbuffers::grpc::Message<Monster>>>(\n          RetrieveRaw(context, request));\n    }\n    std::unique_ptr<\n        ::grpc::ClientAsyncReaderInterface<flatbuffers::grpc::Message<Monster>>>\n    AsyncRetrieve(::grpc::ClientContext* context,\n                  const flatbuffers::grpc::Message<Stat>& request,\n                  ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr<::grpc::ClientAsyncReaderInterface<\n          flatbuffers::grpc::Message<Monster>>>(\n          AsyncRetrieveRaw(context, request, cq, tag));\n    }\n    std::unique_ptr<\n        ::grpc::ClientAsyncReaderInterface<flatbuffers::grpc::Message<Monster>>>\n    PrepareAsyncRetrieve(::grpc::ClientContext* context,\n                         const flatbuffers::grpc::Message<Stat>& request,\n                         ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr<::grpc::ClientAsyncReaderInterface<\n          flatbuffers::grpc::Message<Monster>>>(\n          PrepareAsyncRetrieveRaw(context, request, cq));\n    }\n    std::unique_ptr<\n        ::grpc::ClientWriterInterface<flatbuffers::grpc::Message<Monster>>>\n    GetMaxHitPoint(::grpc::ClientContext* context,\n                   flatbuffers::grpc::Message<Stat>* response) {\n      return std::unique_ptr<\n          ::grpc::ClientWriterInterface<flatbuffers::grpc::Message<Monster>>>(\n          GetMaxHitPointRaw(context, response));\n    }\n    std::unique_ptr<\n        ::grpc::ClientAsyncWriterInterface<flatbuffers::grpc::Message<Monster>>>\n    AsyncGetMaxHitPoint(::grpc::ClientContext* context,\n                        flatbuffers::grpc::Message<Stat>* response,\n                        ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr<::grpc::ClientAsyncWriterInterface<\n          flatbuffers::grpc::Message<Monster>>>(\n          AsyncGetMaxHitPointRaw(context, response, cq, tag));\n    }\n    std::unique_ptr<\n        ::grpc::ClientAsyncWriterInterface<flatbuffers::grpc::Message<Monster>>>\n    PrepareAsyncGetMaxHitPoint(::grpc::ClientContext* context,\n                               flatbuffers::grpc::Message<Stat>* response,\n                               ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr<::grpc::ClientAsyncWriterInterface<\n          flatbuffers::grpc::Message<Monster>>>(\n          PrepareAsyncGetMaxHitPointRaw(context, response, cq));\n    }\n    std::unique_ptr<::grpc::ClientReaderWriterInterface<\n        flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>\n    GetMinMaxHitPoints(::grpc::ClientContext* context) {\n      return std::unique_ptr<::grpc::ClientReaderWriterInterface<\n          flatbuffers::grpc::Message<Monster>,\n          flatbuffers::grpc::Message<Stat>>>(GetMinMaxHitPointsRaw(context));\n    }\n    std::unique_ptr<::grpc::ClientAsyncReaderWriterInterface<\n        flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>\n    AsyncGetMinMaxHitPoints(::grpc::ClientContext* context,\n                            ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr<::grpc::ClientAsyncReaderWriterInterface<\n          flatbuffers::grpc::Message<Monster>,\n          flatbuffers::grpc::Message<Stat>>>(\n          AsyncGetMinMaxHitPointsRaw(context, cq, tag));\n    }\n    std::unique_ptr<::grpc::ClientAsyncReaderWriterInterface<\n        flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>\n    PrepareAsyncGetMinMaxHitPoints(::grpc::ClientContext* context,\n                                   ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr<::grpc::ClientAsyncReaderWriterInterface<\n          flatbuffers::grpc::Message<Monster>,\n          flatbuffers::grpc::Message<Stat>>>(\n          PrepareAsyncGetMinMaxHitPointsRaw(context, cq));\n    }\n\n   private:\n    virtual ::grpc::ClientAsyncResponseReaderInterface<\n        flatbuffers::grpc::Message<Stat>>*\n    AsyncStoreRaw(::grpc::ClientContext* context,\n                  const flatbuffers::grpc::Message<Monster>& request,\n                  ::grpc::CompletionQueue* cq) = 0;\n    virtual ::grpc::ClientAsyncResponseReaderInterface<\n        flatbuffers::grpc::Message<Stat>>*\n    PrepareAsyncStoreRaw(::grpc::ClientContext* context,\n                         const flatbuffers::grpc::Message<Monster>& request,\n                         ::grpc::CompletionQueue* cq) = 0;\n    virtual ::grpc::ClientReaderInterface<flatbuffers::grpc::Message<Monster>>*\n    RetrieveRaw(::grpc::ClientContext* context,\n                const flatbuffers::grpc::Message<Stat>& request) = 0;\n    virtual ::grpc::ClientAsyncReaderInterface<\n        flatbuffers::grpc::Message<Monster>>*\n    AsyncRetrieveRaw(::grpc::ClientContext* context,\n                     const flatbuffers::grpc::Message<Stat>& request,\n                     ::grpc::CompletionQueue* cq, void* tag) = 0;\n    virtual ::grpc::ClientAsyncReaderInterface<\n        flatbuffers::grpc::Message<Monster>>*\n    PrepareAsyncRetrieveRaw(::grpc::ClientContext* context,\n                            const flatbuffers::grpc::Message<Stat>& request,\n                            ::grpc::CompletionQueue* cq) = 0;\n    virtual ::grpc::ClientWriterInterface<flatbuffers::grpc::Message<Monster>>*\n    GetMaxHitPointRaw(::grpc::ClientContext* context,\n                      flatbuffers::grpc::Message<Stat>* response) = 0;\n    virtual ::grpc::ClientAsyncWriterInterface<\n        flatbuffers::grpc::Message<Monster>>*\n    AsyncGetMaxHitPointRaw(::grpc::ClientContext* context,\n                           flatbuffers::grpc::Message<Stat>* response,\n                           ::grpc::CompletionQueue* cq, void* tag) = 0;\n    virtual ::grpc::ClientAsyncWriterInterface<\n        flatbuffers::grpc::Message<Monster>>*\n    PrepareAsyncGetMaxHitPointRaw(::grpc::ClientContext* context,\n                                  flatbuffers::grpc::Message<Stat>* response,\n                                  ::grpc::CompletionQueue* cq) = 0;\n    virtual ::grpc::ClientReaderWriterInterface<\n        flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>*\n    GetMinMaxHitPointsRaw(::grpc::ClientContext* context) = 0;\n    virtual ::grpc::ClientAsyncReaderWriterInterface<\n        flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>*\n    AsyncGetMinMaxHitPointsRaw(::grpc::ClientContext* context,\n                               ::grpc::CompletionQueue* cq, void* tag) = 0;\n    virtual ::grpc::ClientAsyncReaderWriterInterface<\n        flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>*\n    PrepareAsyncGetMinMaxHitPointsRaw(::grpc::ClientContext* context,\n                                      ::grpc::CompletionQueue* cq) = 0;\n  };\n  class Stub final : public StubInterface {\n   public:\n    Stub(const std::shared_ptr<::grpc::ChannelInterface>& channel);\n    ::grpc::Status Store(::grpc::ClientContext* context,\n                         const flatbuffers::grpc::Message<Monster>& request,\n                         flatbuffers::grpc::Message<Stat>* response) override;\n    std::unique_ptr<\n        ::grpc::ClientAsyncResponseReader<flatbuffers::grpc::Message<Stat>>>\n    AsyncStore(::grpc::ClientContext* context,\n               const flatbuffers::grpc::Message<Monster>& request,\n               ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr<\n          ::grpc::ClientAsyncResponseReader<flatbuffers::grpc::Message<Stat>>>(\n          AsyncStoreRaw(context, request, cq));\n    }\n    std::unique_ptr<\n        ::grpc::ClientAsyncResponseReader<flatbuffers::grpc::Message<Stat>>>\n    PrepareAsyncStore(::grpc::ClientContext* context,\n                      const flatbuffers::grpc::Message<Monster>& request,\n                      ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr<\n          ::grpc::ClientAsyncResponseReader<flatbuffers::grpc::Message<Stat>>>(\n          PrepareAsyncStoreRaw(context, request, cq));\n    }\n    std::unique_ptr<::grpc::ClientReader<flatbuffers::grpc::Message<Monster>>>\n    Retrieve(::grpc::ClientContext* context,\n             const flatbuffers::grpc::Message<Stat>& request) {\n      return std::unique_ptr<\n          ::grpc::ClientReader<flatbuffers::grpc::Message<Monster>>>(\n          RetrieveRaw(context, request));\n    }\n    std::unique_ptr<\n        ::grpc::ClientAsyncReader<flatbuffers::grpc::Message<Monster>>>\n    AsyncRetrieve(::grpc::ClientContext* context,\n                  const flatbuffers::grpc::Message<Stat>& request,\n                  ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr<\n          ::grpc::ClientAsyncReader<flatbuffers::grpc::Message<Monster>>>(\n          AsyncRetrieveRaw(context, request, cq, tag));\n    }\n    std::unique_ptr<\n        ::grpc::ClientAsyncReader<flatbuffers::grpc::Message<Monster>>>\n    PrepareAsyncRetrieve(::grpc::ClientContext* context,\n                         const flatbuffers::grpc::Message<Stat>& request,\n                         ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr<\n          ::grpc::ClientAsyncReader<flatbuffers::grpc::Message<Monster>>>(\n          PrepareAsyncRetrieveRaw(context, request, cq));\n    }\n    std::unique_ptr<::grpc::ClientWriter<flatbuffers::grpc::Message<Monster>>>\n    GetMaxHitPoint(::grpc::ClientContext* context,\n                   flatbuffers::grpc::Message<Stat>* response) {\n      return std::unique_ptr<\n          ::grpc::ClientWriter<flatbuffers::grpc::Message<Monster>>>(\n          GetMaxHitPointRaw(context, response));\n    }\n    std::unique_ptr<\n        ::grpc::ClientAsyncWriter<flatbuffers::grpc::Message<Monster>>>\n    AsyncGetMaxHitPoint(::grpc::ClientContext* context,\n                        flatbuffers::grpc::Message<Stat>* response,\n                        ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr<\n          ::grpc::ClientAsyncWriter<flatbuffers::grpc::Message<Monster>>>(\n          AsyncGetMaxHitPointRaw(context, response, cq, tag));\n    }\n    std::unique_ptr<\n        ::grpc::ClientAsyncWriter<flatbuffers::grpc::Message<Monster>>>\n    PrepareAsyncGetMaxHitPoint(::grpc::ClientContext* context,\n                               flatbuffers::grpc::Message<Stat>* response,\n                               ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr<\n          ::grpc::ClientAsyncWriter<flatbuffers::grpc::Message<Monster>>>(\n          PrepareAsyncGetMaxHitPointRaw(context, response, cq));\n    }\n    std::unique_ptr<::grpc::ClientReaderWriter<\n        flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>\n    GetMinMaxHitPoints(::grpc::ClientContext* context) {\n      return std::unique_ptr<\n          ::grpc::ClientReaderWriter<flatbuffers::grpc::Message<Monster>,\n                                     flatbuffers::grpc::Message<Stat>>>(\n          GetMinMaxHitPointsRaw(context));\n    }\n    std::unique_ptr<::grpc::ClientAsyncReaderWriter<\n        flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>\n    AsyncGetMinMaxHitPoints(::grpc::ClientContext* context,\n                            ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr<\n          ::grpc::ClientAsyncReaderWriter<flatbuffers::grpc::Message<Monster>,\n                                          flatbuffers::grpc::Message<Stat>>>(\n          AsyncGetMinMaxHitPointsRaw(context, cq, tag));\n    }\n    std::unique_ptr<::grpc::ClientAsyncReaderWriter<\n        flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>\n    PrepareAsyncGetMinMaxHitPoints(::grpc::ClientContext* context,\n                                   ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr<\n          ::grpc::ClientAsyncReaderWriter<flatbuffers::grpc::Message<Monster>,\n                                          flatbuffers::grpc::Message<Stat>>>(\n          PrepareAsyncGetMinMaxHitPointsRaw(context, cq));\n    }\n\n   private:\n    std::shared_ptr<::grpc::ChannelInterface> channel_;\n    ::grpc::ClientAsyncResponseReader<flatbuffers::grpc::Message<Stat>>*\n    AsyncStoreRaw(::grpc::ClientContext* context,\n                  const flatbuffers::grpc::Message<Monster>& request,\n                  ::grpc::CompletionQueue* cq) override;\n    ::grpc::ClientAsyncResponseReader<flatbuffers::grpc::Message<Stat>>*\n    PrepareAsyncStoreRaw(::grpc::ClientContext* context,\n                         const flatbuffers::grpc::Message<Monster>& request,\n                         ::grpc::CompletionQueue* cq) override;\n    ::grpc::ClientReader<flatbuffers::grpc::Message<Monster>>* RetrieveRaw(\n        ::grpc::ClientContext* context,\n        const flatbuffers::grpc::Message<Stat>& request) override;\n    ::grpc::ClientAsyncReader<flatbuffers::grpc::Message<Monster>>*\n    AsyncRetrieveRaw(::grpc::ClientContext* context,\n                     const flatbuffers::grpc::Message<Stat>& request,\n                     ::grpc::CompletionQueue* cq, void* tag) override;\n    ::grpc::ClientAsyncReader<flatbuffers::grpc::Message<Monster>>*\n    PrepareAsyncRetrieveRaw(::grpc::ClientContext* context,\n                            const flatbuffers::grpc::Message<Stat>& request,\n                            ::grpc::CompletionQueue* cq) override;\n    ::grpc::ClientWriter<flatbuffers::grpc::Message<Monster>>*\n    GetMaxHitPointRaw(::grpc::ClientContext* context,\n                      flatbuffers::grpc::Message<Stat>* response) override;\n    ::grpc::ClientAsyncWriter<flatbuffers::grpc::Message<Monster>>*\n    AsyncGetMaxHitPointRaw(::grpc::ClientContext* context,\n                           flatbuffers::grpc::Message<Stat>* response,\n                           ::grpc::CompletionQueue* cq, void* tag) override;\n    ::grpc::ClientAsyncWriter<flatbuffers::grpc::Message<Monster>>*\n    PrepareAsyncGetMaxHitPointRaw(::grpc::ClientContext* context,\n                                  flatbuffers::grpc::Message<Stat>* response,\n                                  ::grpc::CompletionQueue* cq) override;\n    ::grpc::ClientReaderWriter<flatbuffers::grpc::Message<Monster>,\n                               flatbuffers::grpc::Message<Stat>>*\n    GetMinMaxHitPointsRaw(::grpc::ClientContext* context) override;\n    ::grpc::ClientAsyncReaderWriter<flatbuffers::grpc::Message<Monster>,\n                                    flatbuffers::grpc::Message<Stat>>*\n    AsyncGetMinMaxHitPointsRaw(::grpc::ClientContext* context,\n                               ::grpc::CompletionQueue* cq, void* tag) override;\n    ::grpc::ClientAsyncReaderWriter<flatbuffers::grpc::Message<Monster>,\n                                    flatbuffers::grpc::Message<Stat>>*\n    PrepareAsyncGetMinMaxHitPointsRaw(::grpc::ClientContext* context,\n                                      ::grpc::CompletionQueue* cq) override;\n    const ::grpc::internal::RpcMethod rpcmethod_Store_;\n    const ::grpc::internal::RpcMethod rpcmethod_Retrieve_;\n    const ::grpc::internal::RpcMethod rpcmethod_GetMaxHitPoint_;\n    const ::grpc::internal::RpcMethod rpcmethod_GetMinMaxHitPoints_;\n  };\n  static std::unique_ptr<Stub> NewStub(\n      const std::shared_ptr<::grpc::ChannelInterface>& channel,\n      const ::grpc::StubOptions& options = ::grpc::StubOptions());\n\n  class Service : public ::grpc::Service {\n   public:\n    Service();\n    virtual ~Service();\n    virtual ::grpc::Status Store(\n        ::grpc::ServerContext* context,\n        const flatbuffers::grpc::Message<Monster>* request,\n        flatbuffers::grpc::Message<Stat>* response);\n    virtual ::grpc::Status Retrieve(\n        ::grpc::ServerContext* context,\n        const flatbuffers::grpc::Message<Stat>* request,\n        ::grpc::ServerWriter<flatbuffers::grpc::Message<Monster>>* writer);\n    virtual ::grpc::Status GetMaxHitPoint(\n        ::grpc::ServerContext* context,\n        ::grpc::ServerReader<flatbuffers::grpc::Message<Monster>>* reader,\n        flatbuffers::grpc::Message<Stat>* response);\n    virtual ::grpc::Status GetMinMaxHitPoints(\n        ::grpc::ServerContext* context,\n        ::grpc::ServerReaderWriter<flatbuffers::grpc::Message<Stat>,\n                                   flatbuffers::grpc::Message<Monster>>*\n            stream);\n  };\n  template <class BaseClass>\n  class WithAsyncMethod_Store : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}\n\n   public:\n    WithAsyncMethod_Store() { ::grpc::Service::MarkMethodAsync(0); }\n    ~WithAsyncMethod_Store() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status Store(\n        ::grpc::ServerContext* /*context*/,\n        const flatbuffers::grpc::Message<Monster>* /*request*/,\n        flatbuffers::grpc::Message<Stat>* /*response*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    void RequestStore(\n        ::grpc::ServerContext* context,\n        flatbuffers::grpc::Message<Monster>* request,\n        ::grpc::ServerAsyncResponseWriter<flatbuffers::grpc::Message<Stat>>*\n            response,\n        ::grpc::CompletionQueue* new_call_cq,\n        ::grpc::ServerCompletionQueue* notification_cq, void* tag) {\n      ::grpc::Service::RequestAsyncUnary(0, context, request, response,\n                                         new_call_cq, notification_cq, tag);\n    }\n  };\n  template <class BaseClass>\n  class WithAsyncMethod_Retrieve : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}\n\n   public:\n    WithAsyncMethod_Retrieve() { ::grpc::Service::MarkMethodAsync(1); }\n    ~WithAsyncMethod_Retrieve() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status Retrieve(\n        ::grpc::ServerContext* /*context*/,\n        const flatbuffers::grpc::Message<Stat>* /*request*/,\n        ::grpc::ServerWriter<flatbuffers::grpc::Message<Monster>>* /*writer*/)\n        final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    void RequestRetrieve(\n        ::grpc::ServerContext* context,\n        flatbuffers::grpc::Message<Stat>* request,\n        ::grpc::ServerAsyncWriter<flatbuffers::grpc::Message<Monster>>* writer,\n        ::grpc::CompletionQueue* new_call_cq,\n        ::grpc::ServerCompletionQueue* notification_cq, void* tag) {\n      ::grpc::Service::RequestAsyncServerStreaming(\n          1, context, request, writer, new_call_cq, notification_cq, tag);\n    }\n  };\n  template <class BaseClass>\n  class WithAsyncMethod_GetMaxHitPoint : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}\n\n   public:\n    WithAsyncMethod_GetMaxHitPoint() { ::grpc::Service::MarkMethodAsync(2); }\n    ~WithAsyncMethod_GetMaxHitPoint() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status GetMaxHitPoint(\n        ::grpc::ServerContext* /*context*/,\n        ::grpc::ServerReader<flatbuffers::grpc::Message<Monster>>* /*reader*/,\n        flatbuffers::grpc::Message<Stat>* /*response*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    void RequestGetMaxHitPoint(\n        ::grpc::ServerContext* context,\n        ::grpc::ServerAsyncReader<flatbuffers::grpc::Message<Stat>,\n                                  flatbuffers::grpc::Message<Monster>>* reader,\n        ::grpc::CompletionQueue* new_call_cq,\n        ::grpc::ServerCompletionQueue* notification_cq, void* tag) {\n      ::grpc::Service::RequestAsyncClientStreaming(\n          2, context, reader, new_call_cq, notification_cq, tag);\n    }\n  };\n  template <class BaseClass>\n  class WithAsyncMethod_GetMinMaxHitPoints : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}\n\n   public:\n    WithAsyncMethod_GetMinMaxHitPoints() {\n      ::grpc::Service::MarkMethodAsync(3);\n    }\n    ~WithAsyncMethod_GetMinMaxHitPoints() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status GetMinMaxHitPoints(\n        ::grpc::ServerContext* /*context*/,\n        ::grpc::ServerReaderWriter<\n            flatbuffers::grpc::Message<Stat>,\n            flatbuffers::grpc::Message<Monster>>* /*stream*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    void RequestGetMinMaxHitPoints(\n        ::grpc::ServerContext* context,\n        ::grpc::ServerAsyncReaderWriter<flatbuffers::grpc::Message<Stat>,\n                                        flatbuffers::grpc::Message<Monster>>*\n            stream,\n        ::grpc::CompletionQueue* new_call_cq,\n        ::grpc::ServerCompletionQueue* notification_cq, void* tag) {\n      ::grpc::Service::RequestAsyncBidiStreaming(\n          3, context, stream, new_call_cq, notification_cq, tag);\n    }\n  };\n  typedef WithAsyncMethod_Store<\n      WithAsyncMethod_Retrieve<WithAsyncMethod_GetMaxHitPoint<\n          WithAsyncMethod_GetMinMaxHitPoints<Service>>>>\n      AsyncService;\n  template <class BaseClass>\n  class WithGenericMethod_Store : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}\n\n   public:\n    WithGenericMethod_Store() { ::grpc::Service::MarkMethodGeneric(0); }\n    ~WithGenericMethod_Store() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status Store(\n        ::grpc::ServerContext* /*context*/,\n        const flatbuffers::grpc::Message<Monster>* /*request*/,\n        flatbuffers::grpc::Message<Stat>* /*response*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n  };\n  template <class BaseClass>\n  class WithGenericMethod_Retrieve : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}\n\n   public:\n    WithGenericMethod_Retrieve() { ::grpc::Service::MarkMethodGeneric(1); }\n    ~WithGenericMethod_Retrieve() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status Retrieve(\n        ::grpc::ServerContext* /*context*/,\n        const flatbuffers::grpc::Message<Stat>* /*request*/,\n        ::grpc::ServerWriter<flatbuffers::grpc::Message<Monster>>* /*writer*/)\n        final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n  };\n  template <class BaseClass>\n  class WithGenericMethod_GetMaxHitPoint : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}\n\n   public:\n    WithGenericMethod_GetMaxHitPoint() {\n      ::grpc::Service::MarkMethodGeneric(2);\n    }\n    ~WithGenericMethod_GetMaxHitPoint() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status GetMaxHitPoint(\n        ::grpc::ServerContext* /*context*/,\n        ::grpc::ServerReader<flatbuffers::grpc::Message<Monster>>* /*reader*/,\n        flatbuffers::grpc::Message<Stat>* /*response*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n  };\n  template <class BaseClass>\n  class WithGenericMethod_GetMinMaxHitPoints : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}\n\n   public:\n    WithGenericMethod_GetMinMaxHitPoints() {\n      ::grpc::Service::MarkMethodGeneric(3);\n    }\n    ~WithGenericMethod_GetMinMaxHitPoints() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status GetMinMaxHitPoints(\n        ::grpc::ServerContext* /*context*/,\n        ::grpc::ServerReaderWriter<\n            flatbuffers::grpc::Message<Stat>,\n            flatbuffers::grpc::Message<Monster>>* /*stream*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n  };\n  template <class BaseClass>\n  class WithStreamedUnaryMethod_Store : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}\n\n   public:\n    WithStreamedUnaryMethod_Store() {\n      ::grpc::Service::MarkMethodStreamed(\n          0, new ::grpc::internal::StreamedUnaryHandler<\n                 flatbuffers::grpc::Message<Monster>,\n                 flatbuffers::grpc::Message<Stat>>(std::bind(\n                 &WithStreamedUnaryMethod_Store<BaseClass>::StreamedStore, this,\n                 std::placeholders::_1, std::placeholders::_2)));\n    }\n    ~WithStreamedUnaryMethod_Store() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable regular version of this method\n    ::grpc::Status Store(\n        ::grpc::ServerContext* /*context*/,\n        const flatbuffers::grpc::Message<Monster>* /*request*/,\n        flatbuffers::grpc::Message<Stat>* /*response*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    // replace default version of method with streamed unary\n    virtual ::grpc::Status StreamedStore(\n        ::grpc::ServerContext* context,\n        ::grpc::ServerUnaryStreamer<flatbuffers::grpc::Message<Monster>,\n                                    flatbuffers::grpc::Message<Stat>>*\n            server_unary_streamer) = 0;\n  };\n  typedef WithStreamedUnaryMethod_Store<Service> StreamedUnaryService;\n  template <class BaseClass>\n  class WithSplitStreamingMethod_Retrieve : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}\n\n   public:\n    WithSplitStreamingMethod_Retrieve() {\n      ::grpc::Service::MarkMethodStreamed(\n          1,\n          new ::grpc::internal::SplitServerStreamingHandler<\n              flatbuffers::grpc::Message<Stat>,\n              flatbuffers::grpc::Message<Monster>>(std::bind(\n              &WithSplitStreamingMethod_Retrieve<BaseClass>::StreamedRetrieve,\n              this, std::placeholders::_1, std::placeholders::_2)));\n    }\n    ~WithSplitStreamingMethod_Retrieve() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable regular version of this method\n    ::grpc::Status Retrieve(\n        ::grpc::ServerContext* /*context*/,\n        const flatbuffers::grpc::Message<Stat>* /*request*/,\n        ::grpc::ServerWriter<flatbuffers::grpc::Message<Monster>>* /*writer*/)\n        final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    // replace default version of method with split streamed\n    virtual ::grpc::Status StreamedRetrieve(\n        ::grpc::ServerContext* context,\n        ::grpc::ServerSplitStreamer<flatbuffers::grpc::Message<Stat>,\n                                    flatbuffers::grpc::Message<Monster>>*\n            server_split_streamer) = 0;\n  };\n  typedef WithSplitStreamingMethod_Retrieve<Service> SplitStreamedService;\n  typedef WithStreamedUnaryMethod_Store<\n      WithSplitStreamingMethod_Retrieve<Service>>\n      StreamedService;\n};\n\n}  // namespace Example\n}  // namespace MyGame\n\n#endif  // GRPC_monster_5ftest__INCLUDED\n"
  },
  {
    "path": "tests/monster_test_generated.lobster",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\nimport flatbuffers\n\nnamespace MyGame.Example\n\n/// Composite components of Monster color.\nenum Color:\n    Color_Red = 1\n    /// \\brief color Green\n    /// Green is bit_flag with value (1u << 1)\n    Color_Green = 2\n    /// \\brief color Blue (1u << 3)\n    Color_Blue = 8\n\nenum Race:\n    Race_None = -1\n    Race_Human = 0\n    Race_Dwarf = 1\n    Race_Elf = 2\n\nenum LongEnum:\n    LongEnum_LongOne = 2\n    LongEnum_LongTwo = 4\n    LongEnum_LongBig = 1099511627776\n\nenum Any:\n    Any_NONE = 0\n    Any_Monster = 1\n    Any_TestSimpleTableWithEnum = 2\n    Any_MyGame_Example2_Monster = 3\n\nenum AnyUniqueAliases:\n    AnyUniqueAliases_NONE = 0\n    AnyUniqueAliases_M = 1\n    AnyUniqueAliases_TS = 2\n    AnyUniqueAliases_M2 = 3\n\nenum AnyAmbiguousAliases:\n    AnyAmbiguousAliases_NONE = 0\n    AnyAmbiguousAliases_M1 = 1\n    AnyAmbiguousAliases_M2 = 2\n    AnyAmbiguousAliases_M3 = 3\n\nnamespace MyGame\n\nclass InParentNamespace\n\nnamespace MyGame.Example2\n\nclass Monster\n\nnamespace MyGame.Example\n\nclass Test\n\nclass TestSimpleTableWithEnum\n\nclass Vec3\n\nclass Ability\n\nclass StructOfStructs\n\nclass StructOfStructsOfStructs\n\nclass Stat\n\nclass Referrable\n\nclass Monster\n\nclass TypeAliases\n\nnamespace MyGame\n\nclass InParentNamespace : flatbuffers.handle\n\ndef GetRootAsInParentNamespace(buf:string): return InParentNamespace { buf, flatbuffers.indirect(buf, 0) }\n\nstruct InParentNamespaceBuilder:\n    b_:flatbuffers.builder\n    def start():\n        b_.StartObject(0)\n        return this\n    def end():\n        return b_.EndObject()\n\nnamespace MyGame.Example2\n\nclass Monster : flatbuffers.handle\n\ndef GetRootAsMonster(buf:string): return Monster { buf, flatbuffers.indirect(buf, 0) }\n\nstruct MonsterBuilder:\n    b_:flatbuffers.builder\n    def start():\n        b_.StartObject(0)\n        return this\n    def end():\n        return b_.EndObject()\n\nnamespace MyGame.Example\n\nclass Test : flatbuffers.handle\n    def a() -> int:\n        return buf_.read_int16_le(pos_ + 0)\n    def b() -> int:\n        return buf_.read_int8_le(pos_ + 2)\n\ndef CreateTest(b_:flatbuffers.builder, a:int, b:int):\n    b_.Prep(2, 4)\n    b_.Pad(1)\n    b_.PrependInt8(b)\n    b_.PrependInt16(a)\n    return b_.Offset()\n\nclass TestSimpleTableWithEnum : flatbuffers.handle\n    def color() -> Color:\n        return Color(flatbuffers.field_uint8(buf_, pos_, 4, 2))\n\ndef GetRootAsTestSimpleTableWithEnum(buf:string): return TestSimpleTableWithEnum { buf, flatbuffers.indirect(buf, 0) }\n\nstruct TestSimpleTableWithEnumBuilder:\n    b_:flatbuffers.builder\n    def start():\n        b_.StartObject(1)\n        return this\n    def add_color(color:Color):\n        b_.PrependUint8Slot(0, color, 2)\n        return this\n    def end():\n        return b_.EndObject()\n\nclass Vec3 : flatbuffers.handle\n    def x() -> float:\n        return buf_.read_float32_le(pos_ + 0)\n    def y() -> float:\n        return buf_.read_float32_le(pos_ + 4)\n    def z() -> float:\n        return buf_.read_float32_le(pos_ + 8)\n    def test1() -> float:\n        return buf_.read_float64_le(pos_ + 16)\n    def test2() -> Color:\n        return Color(buf_.read_uint8_le(pos_ + 24))\n    def test3() -> MyGame.Example.Test:\n        return MyGame.Example.Test{ buf_, pos_ + 26 }\n\ndef CreateVec3(b_:flatbuffers.builder, x:float, y:float, z:float, test1:float, test2:Color, test3_a:int, test3_b:int):\n    b_.Prep(8, 32)\n    b_.Pad(2)\n    b_.Prep(2, 4)\n    b_.Pad(1)\n    b_.PrependInt8(test3_b)\n    b_.PrependInt16(test3_a)\n    b_.Pad(1)\n    b_.PrependUint8(test2)\n    b_.PrependFloat64(test1)\n    b_.Pad(4)\n    b_.PrependFloat32(z)\n    b_.PrependFloat32(y)\n    b_.PrependFloat32(x)\n    return b_.Offset()\n\nclass Ability : flatbuffers.handle\n    def id() -> int:\n        return buf_.read_uint32_le(pos_ + 0)\n    def distance() -> int:\n        return buf_.read_uint32_le(pos_ + 4)\n\ndef CreateAbility(b_:flatbuffers.builder, id:int, distance:int):\n    b_.Prep(4, 8)\n    b_.PrependUint32(distance)\n    b_.PrependUint32(id)\n    return b_.Offset()\n\nclass StructOfStructs : flatbuffers.handle\n    def a() -> MyGame.Example.Ability:\n        return MyGame.Example.Ability{ buf_, pos_ + 0 }\n    def b() -> MyGame.Example.Test:\n        return MyGame.Example.Test{ buf_, pos_ + 8 }\n    def c() -> MyGame.Example.Ability:\n        return MyGame.Example.Ability{ buf_, pos_ + 12 }\n\ndef CreateStructOfStructs(b_:flatbuffers.builder, a_id:int, a_distance:int, b_a:int, b_b:int, c_id:int, c_distance:int):\n    b_.Prep(4, 20)\n    b_.Prep(4, 8)\n    b_.PrependUint32(c_distance)\n    b_.PrependUint32(c_id)\n    b_.Prep(2, 4)\n    b_.Pad(1)\n    b_.PrependInt8(b_b)\n    b_.PrependInt16(b_a)\n    b_.Prep(4, 8)\n    b_.PrependUint32(a_distance)\n    b_.PrependUint32(a_id)\n    return b_.Offset()\n\nclass StructOfStructsOfStructs : flatbuffers.handle\n    def a() -> MyGame.Example.StructOfStructs:\n        return MyGame.Example.StructOfStructs{ buf_, pos_ + 0 }\n\ndef CreateStructOfStructsOfStructs(b_:flatbuffers.builder, a_a_id:int, a_a_distance:int, a_b_a:int, a_b_b:int, a_c_id:int, a_c_distance:int):\n    b_.Prep(4, 20)\n    b_.Prep(4, 20)\n    b_.Prep(4, 8)\n    b_.PrependUint32(a_c_distance)\n    b_.PrependUint32(a_c_id)\n    b_.Prep(2, 4)\n    b_.Pad(1)\n    b_.PrependInt8(a_b_b)\n    b_.PrependInt16(a_b_a)\n    b_.Prep(4, 8)\n    b_.PrependUint32(a_a_distance)\n    b_.PrependUint32(a_a_id)\n    return b_.Offset()\n\nclass Stat : flatbuffers.handle\n    def id() -> string:\n        return flatbuffers.field_string(buf_, pos_, 4)\n    def val() -> int:\n        return flatbuffers.field_int64(buf_, pos_, 6, 0)\n    def count() -> int:\n        return flatbuffers.field_uint16(buf_, pos_, 8, 0)\n\ndef GetRootAsStat(buf:string): return Stat { buf, flatbuffers.indirect(buf, 0) }\n\nstruct StatBuilder:\n    b_:flatbuffers.builder\n    def start():\n        b_.StartObject(3)\n        return this\n    def add_id(id:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(0, id)\n        return this\n    def add_val(val:int):\n        b_.PrependInt64Slot(1, val, 0)\n        return this\n    def add_count(count:int):\n        b_.PrependUint16Slot(2, count, 0)\n        return this\n    def end():\n        return b_.EndObject()\n\nclass Referrable : flatbuffers.handle\n    def id() -> int:\n        return flatbuffers.field_uint64(buf_, pos_, 4, 0)\n\ndef GetRootAsReferrable(buf:string): return Referrable { buf, flatbuffers.indirect(buf, 0) }\n\nstruct ReferrableBuilder:\n    b_:flatbuffers.builder\n    def start():\n        b_.StartObject(1)\n        return this\n    def add_id(id:int):\n        b_.PrependUint64Slot(0, id, 0)\n        return this\n    def end():\n        return b_.EndObject()\n\n/// an example documentation comment: \"monster object\"\nclass Monster : flatbuffers.handle\n    def pos() -> MyGame.Example.Vec3?:\n        let o = flatbuffers.field_struct(buf_, pos_, 4)\n        return if o: MyGame.Example.Vec3 { buf_, o } else: nil\n    def mana() -> int:\n        return flatbuffers.field_int16(buf_, pos_, 6, 150)\n    def hp() -> int:\n        return flatbuffers.field_int16(buf_, pos_, 8, 100)\n    def name() -> string:\n        return flatbuffers.field_string(buf_, pos_, 10)\n    def inventory(i:int) -> int:\n        return read_uint8_le(buf_, buf_.flatbuffers.field_vector(pos_, 14) + i * 1)\n    def inventory_length() -> int:\n        return flatbuffers.field_vector_len(buf_, pos_, 14)\n    def color() -> Color:\n        return Color(flatbuffers.field_uint8(buf_, pos_, 16, 8))\n    def test_type() -> Any:\n        return Any(flatbuffers.field_uint8(buf_, pos_, 18, 0))\n    def test_as_Monster():\n        return MyGame.Example.Monster { buf_, flatbuffers.field_table(buf_, pos_, 20) }\n    def test_as_TestSimpleTableWithEnum():\n        return MyGame.Example.TestSimpleTableWithEnum { buf_, flatbuffers.field_table(buf_, pos_, 20) }\n    def test_as_MyGame_Example2_Monster():\n        return MyGame.Example2.Monster { buf_, flatbuffers.field_table(buf_, pos_, 20) }\n    def test4(i:int) -> MyGame.Example.Test:\n        return MyGame.Example.Test { buf_, flatbuffers.field_vector(buf_, pos_, 22) + i * 4 }\n    def test4_length() -> int:\n        return flatbuffers.field_vector_len(buf_, pos_, 22)\n    def testarrayofstring(i:int) -> string:\n        return flatbuffers.string(buf_, buf_.flatbuffers.field_vector(pos_, 24) + i * 4)\n    def testarrayofstring_length() -> int:\n        return flatbuffers.field_vector_len(buf_, pos_, 24)\n    /// an example documentation comment: this will end up in the generated code\n    /// multiline too\n    def testarrayoftables(i:int) -> MyGame.Example.Monster:\n        return MyGame.Example.Monster { buf_, flatbuffers.indirect(buf_, flatbuffers.field_vector(buf_, pos_, 26) + i * 4) }\n    def testarrayoftables_length() -> int:\n        return flatbuffers.field_vector_len(buf_, pos_, 26)\n    def enemy() -> MyGame.Example.Monster?:\n        let o = flatbuffers.field_table(buf_, pos_, 28)\n        return if o: MyGame.Example.Monster { buf_, o } else: nil\n    def testnestedflatbuffer(i:int) -> int:\n        return read_uint8_le(buf_, buf_.flatbuffers.field_vector(pos_, 30) + i * 1)\n    def testnestedflatbuffer_length() -> int:\n        return flatbuffers.field_vector_len(buf_, pos_, 30)\n    def testempty() -> MyGame.Example.Stat?:\n        let o = flatbuffers.field_table(buf_, pos_, 32)\n        return if o: MyGame.Example.Stat { buf_, o } else: nil\n    def testbool() -> bool:\n        return bool(flatbuffers.field_int8(buf_, pos_, 34, 0))\n    def testhashs32_fnv1() -> int:\n        return flatbuffers.field_int32(buf_, pos_, 36, 0)\n    def testhashu32_fnv1() -> int:\n        return flatbuffers.field_uint32(buf_, pos_, 38, 0)\n    def testhashs64_fnv1() -> int:\n        return flatbuffers.field_int64(buf_, pos_, 40, 0)\n    def testhashu64_fnv1() -> int:\n        return flatbuffers.field_uint64(buf_, pos_, 42, 0)\n    def testhashs32_fnv1a() -> int:\n        return flatbuffers.field_int32(buf_, pos_, 44, 0)\n    def testhashu32_fnv1a() -> int:\n        return flatbuffers.field_uint32(buf_, pos_, 46, 0)\n    def testhashs64_fnv1a() -> int:\n        return flatbuffers.field_int64(buf_, pos_, 48, 0)\n    def testhashu64_fnv1a() -> int:\n        return flatbuffers.field_uint64(buf_, pos_, 50, 0)\n    def testarrayofbools(i:int) -> bool:\n        return read_int8_le(buf_, buf_.flatbuffers.field_vector(pos_, 52) + i * 1)\n    def testarrayofbools_length() -> int:\n        return flatbuffers.field_vector_len(buf_, pos_, 52)\n    def testf() -> float:\n        return flatbuffers.field_float32(buf_, pos_, 54, 3.14159)\n    def testf2() -> float:\n        return flatbuffers.field_float32(buf_, pos_, 56, 3.0)\n    def testf3() -> float:\n        return flatbuffers.field_float32(buf_, pos_, 58, 0.0)\n    def testarrayofstring2(i:int) -> string:\n        return flatbuffers.string(buf_, buf_.flatbuffers.field_vector(pos_, 60) + i * 4)\n    def testarrayofstring2_length() -> int:\n        return flatbuffers.field_vector_len(buf_, pos_, 60)\n    def testarrayofsortedstruct(i:int) -> MyGame.Example.Ability:\n        return MyGame.Example.Ability { buf_, flatbuffers.field_vector(buf_, pos_, 62) + i * 8 }\n    def testarrayofsortedstruct_length() -> int:\n        return flatbuffers.field_vector_len(buf_, pos_, 62)\n    def flex(i:int) -> int:\n        return read_uint8_le(buf_, buf_.flatbuffers.field_vector(pos_, 64) + i * 1)\n    def flex_length() -> int:\n        return flatbuffers.field_vector_len(buf_, pos_, 64)\n    def test5(i:int) -> MyGame.Example.Test:\n        return MyGame.Example.Test { buf_, flatbuffers.field_vector(buf_, pos_, 66) + i * 4 }\n    def test5_length() -> int:\n        return flatbuffers.field_vector_len(buf_, pos_, 66)\n    def vector_of_longs(i:int) -> int:\n        return read_int64_le(buf_, buf_.flatbuffers.field_vector(pos_, 68) + i * 8)\n    def vector_of_longs_length() -> int:\n        return flatbuffers.field_vector_len(buf_, pos_, 68)\n    def vector_of_doubles(i:int) -> float:\n        return read_float64_le(buf_, buf_.flatbuffers.field_vector(pos_, 70) + i * 8)\n    def vector_of_doubles_length() -> int:\n        return flatbuffers.field_vector_len(buf_, pos_, 70)\n    def parent_namespace_test() -> MyGame.InParentNamespace?:\n        let o = flatbuffers.field_table(buf_, pos_, 72)\n        return if o: MyGame.InParentNamespace { buf_, o } else: nil\n    def vector_of_referrables(i:int) -> MyGame.Example.Referrable:\n        return MyGame.Example.Referrable { buf_, flatbuffers.indirect(buf_, flatbuffers.field_vector(buf_, pos_, 74) + i * 4) }\n    def vector_of_referrables_length() -> int:\n        return flatbuffers.field_vector_len(buf_, pos_, 74)\n    def single_weak_reference() -> int:\n        return flatbuffers.field_uint64(buf_, pos_, 76, 0)\n    def vector_of_weak_references(i:int) -> int:\n        return read_uint64_le(buf_, buf_.flatbuffers.field_vector(pos_, 78) + i * 8)\n    def vector_of_weak_references_length() -> int:\n        return flatbuffers.field_vector_len(buf_, pos_, 78)\n    def vector_of_strong_referrables(i:int) -> MyGame.Example.Referrable:\n        return MyGame.Example.Referrable { buf_, flatbuffers.indirect(buf_, flatbuffers.field_vector(buf_, pos_, 80) + i * 4) }\n    def vector_of_strong_referrables_length() -> int:\n        return flatbuffers.field_vector_len(buf_, pos_, 80)\n    def co_owning_reference() -> int:\n        return flatbuffers.field_uint64(buf_, pos_, 82, 0)\n    def vector_of_co_owning_references(i:int) -> int:\n        return read_uint64_le(buf_, buf_.flatbuffers.field_vector(pos_, 84) + i * 8)\n    def vector_of_co_owning_references_length() -> int:\n        return flatbuffers.field_vector_len(buf_, pos_, 84)\n    def non_owning_reference() -> int:\n        return flatbuffers.field_uint64(buf_, pos_, 86, 0)\n    def vector_of_non_owning_references(i:int) -> int:\n        return read_uint64_le(buf_, buf_.flatbuffers.field_vector(pos_, 88) + i * 8)\n    def vector_of_non_owning_references_length() -> int:\n        return flatbuffers.field_vector_len(buf_, pos_, 88)\n    def any_unique_type() -> AnyUniqueAliases:\n        return AnyUniqueAliases(flatbuffers.field_uint8(buf_, pos_, 90, 0))\n    def any_unique_as_M():\n        return MyGame.Example.Monster { buf_, flatbuffers.field_table(buf_, pos_, 92) }\n    def any_unique_as_TS():\n        return MyGame.Example.TestSimpleTableWithEnum { buf_, flatbuffers.field_table(buf_, pos_, 92) }\n    def any_unique_as_M2():\n        return MyGame.Example2.Monster { buf_, flatbuffers.field_table(buf_, pos_, 92) }\n    def any_ambiguous_type() -> AnyAmbiguousAliases:\n        return AnyAmbiguousAliases(flatbuffers.field_uint8(buf_, pos_, 94, 0))\n    def any_ambiguous_as_M1():\n        return MyGame.Example.Monster { buf_, flatbuffers.field_table(buf_, pos_, 96) }\n    def any_ambiguous_as_M2():\n        return MyGame.Example.Monster { buf_, flatbuffers.field_table(buf_, pos_, 96) }\n    def any_ambiguous_as_M3():\n        return MyGame.Example.Monster { buf_, flatbuffers.field_table(buf_, pos_, 96) }\n    def vector_of_enums(i:int) -> Color:\n        return read_uint8_le(buf_, buf_.flatbuffers.field_vector(pos_, 98) + i * 1)\n    def vector_of_enums_length() -> int:\n        return flatbuffers.field_vector_len(buf_, pos_, 98)\n    def signed_enum() -> Race:\n        return Race(flatbuffers.field_int8(buf_, pos_, 100, -1))\n    def testrequirednestedflatbuffer(i:int) -> int:\n        return read_uint8_le(buf_, buf_.flatbuffers.field_vector(pos_, 102) + i * 1)\n    def testrequirednestedflatbuffer_length() -> int:\n        return flatbuffers.field_vector_len(buf_, pos_, 102)\n    def scalar_key_sorted_tables(i:int) -> MyGame.Example.Stat:\n        return MyGame.Example.Stat { buf_, flatbuffers.indirect(buf_, flatbuffers.field_vector(buf_, pos_, 104) + i * 4) }\n    def scalar_key_sorted_tables_length() -> int:\n        return flatbuffers.field_vector_len(buf_, pos_, 104)\n    def native_inline() -> MyGame.Example.Test?:\n        let o = flatbuffers.field_struct(buf_, pos_, 106)\n        return if o: MyGame.Example.Test { buf_, o } else: nil\n    def long_enum_non_enum_default() -> LongEnum:\n        return LongEnum(flatbuffers.field_uint64(buf_, pos_, 108, 0))\n    def long_enum_normal_default() -> LongEnum:\n        return LongEnum(flatbuffers.field_uint64(buf_, pos_, 110, 2))\n    def nan_default() -> float:\n        return flatbuffers.field_float32(buf_, pos_, 112, nan)\n    def inf_default() -> float:\n        return flatbuffers.field_float32(buf_, pos_, 114, inf)\n    def positive_inf_default() -> float:\n        return flatbuffers.field_float32(buf_, pos_, 116, +inf)\n    def infinity_default() -> float:\n        return flatbuffers.field_float32(buf_, pos_, 118, infinity)\n    def positive_infinity_default() -> float:\n        return flatbuffers.field_float32(buf_, pos_, 120, +infinity)\n    def negative_inf_default() -> float:\n        return flatbuffers.field_float32(buf_, pos_, 122, -inf)\n    def negative_infinity_default() -> float:\n        return flatbuffers.field_float32(buf_, pos_, 124, -infinity)\n    def double_inf_default() -> float:\n        return flatbuffers.field_float64(buf_, pos_, 126, inf)\n\ndef GetRootAsMonster(buf:string): return Monster { buf, flatbuffers.indirect(buf, 0) }\n\nstruct MonsterBuilder:\n    b_:flatbuffers.builder\n    def start():\n        b_.StartObject(62)\n        return this\n    def add_pos(pos:flatbuffers.offset):\n        b_.PrependStructSlot(0, pos)\n        return this\n    def add_mana(mana:int):\n        b_.PrependInt16Slot(1, mana, 150)\n        return this\n    def add_hp(hp:int):\n        b_.PrependInt16Slot(2, hp, 100)\n        return this\n    def add_name(name:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(3, name)\n        return this\n    def add_inventory(inventory:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(5, inventory)\n        return this\n    def add_color(color:Color):\n        b_.PrependUint8Slot(6, color, 8)\n        return this\n    def add_test_type(test_type:Any):\n        b_.PrependUint8Slot(7, test_type, 0)\n        return this\n    def add_test(test:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(8, test)\n        return this\n    def add_test4(test4:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(9, test4)\n        return this\n    def add_testarrayofstring(testarrayofstring:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(10, testarrayofstring)\n        return this\n    def add_testarrayoftables(testarrayoftables:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(11, testarrayoftables)\n        return this\n    def add_enemy(enemy:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(12, enemy)\n        return this\n    def add_testnestedflatbuffer(testnestedflatbuffer:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(13, testnestedflatbuffer)\n        return this\n    def add_testempty(testempty:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(14, testempty)\n        return this\n    def add_testbool(testbool:bool):\n        b_.PrependBoolSlot(15, testbool, 0)\n        return this\n    def add_testhashs32_fnv1(testhashs32_fnv1:int):\n        b_.PrependInt32Slot(16, testhashs32_fnv1, 0)\n        return this\n    def add_testhashu32_fnv1(testhashu32_fnv1:int):\n        b_.PrependUint32Slot(17, testhashu32_fnv1, 0)\n        return this\n    def add_testhashs64_fnv1(testhashs64_fnv1:int):\n        b_.PrependInt64Slot(18, testhashs64_fnv1, 0)\n        return this\n    def add_testhashu64_fnv1(testhashu64_fnv1:int):\n        b_.PrependUint64Slot(19, testhashu64_fnv1, 0)\n        return this\n    def add_testhashs32_fnv1a(testhashs32_fnv1a:int):\n        b_.PrependInt32Slot(20, testhashs32_fnv1a, 0)\n        return this\n    def add_testhashu32_fnv1a(testhashu32_fnv1a:int):\n        b_.PrependUint32Slot(21, testhashu32_fnv1a, 0)\n        return this\n    def add_testhashs64_fnv1a(testhashs64_fnv1a:int):\n        b_.PrependInt64Slot(22, testhashs64_fnv1a, 0)\n        return this\n    def add_testhashu64_fnv1a(testhashu64_fnv1a:int):\n        b_.PrependUint64Slot(23, testhashu64_fnv1a, 0)\n        return this\n    def add_testarrayofbools(testarrayofbools:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(24, testarrayofbools)\n        return this\n    def add_testf(testf:float):\n        b_.PrependFloat32Slot(25, testf, 3.14159)\n        return this\n    def add_testf2(testf2:float):\n        b_.PrependFloat32Slot(26, testf2, 3.0)\n        return this\n    def add_testf3(testf3:float):\n        b_.PrependFloat32Slot(27, testf3, 0.0)\n        return this\n    def add_testarrayofstring2(testarrayofstring2:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(28, testarrayofstring2)\n        return this\n    def add_testarrayofsortedstruct(testarrayofsortedstruct:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(29, testarrayofsortedstruct)\n        return this\n    def add_flex(flex:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(30, flex)\n        return this\n    def add_test5(test5:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(31, test5)\n        return this\n    def add_vector_of_longs(vector_of_longs:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(32, vector_of_longs)\n        return this\n    def add_vector_of_doubles(vector_of_doubles:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(33, vector_of_doubles)\n        return this\n    def add_parent_namespace_test(parent_namespace_test:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(34, parent_namespace_test)\n        return this\n    def add_vector_of_referrables(vector_of_referrables:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(35, vector_of_referrables)\n        return this\n    def add_single_weak_reference(single_weak_reference:int):\n        b_.PrependUint64Slot(36, single_weak_reference, 0)\n        return this\n    def add_vector_of_weak_references(vector_of_weak_references:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(37, vector_of_weak_references)\n        return this\n    def add_vector_of_strong_referrables(vector_of_strong_referrables:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(38, vector_of_strong_referrables)\n        return this\n    def add_co_owning_reference(co_owning_reference:int):\n        b_.PrependUint64Slot(39, co_owning_reference, 0)\n        return this\n    def add_vector_of_co_owning_references(vector_of_co_owning_references:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(40, vector_of_co_owning_references)\n        return this\n    def add_non_owning_reference(non_owning_reference:int):\n        b_.PrependUint64Slot(41, non_owning_reference, 0)\n        return this\n    def add_vector_of_non_owning_references(vector_of_non_owning_references:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(42, vector_of_non_owning_references)\n        return this\n    def add_any_unique_type(any_unique_type:AnyUniqueAliases):\n        b_.PrependUint8Slot(43, any_unique_type, 0)\n        return this\n    def add_any_unique(any_unique:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(44, any_unique)\n        return this\n    def add_any_ambiguous_type(any_ambiguous_type:AnyAmbiguousAliases):\n        b_.PrependUint8Slot(45, any_ambiguous_type, 0)\n        return this\n    def add_any_ambiguous(any_ambiguous:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(46, any_ambiguous)\n        return this\n    def add_vector_of_enums(vector_of_enums:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(47, vector_of_enums)\n        return this\n    def add_signed_enum(signed_enum:Race):\n        b_.PrependInt8Slot(48, signed_enum, -1)\n        return this\n    def add_testrequirednestedflatbuffer(testrequirednestedflatbuffer:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(49, testrequirednestedflatbuffer)\n        return this\n    def add_scalar_key_sorted_tables(scalar_key_sorted_tables:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(50, scalar_key_sorted_tables)\n        return this\n    def add_native_inline(native_inline:flatbuffers.offset):\n        b_.PrependStructSlot(51, native_inline)\n        return this\n    def add_long_enum_non_enum_default(long_enum_non_enum_default:LongEnum):\n        b_.PrependUint64Slot(52, long_enum_non_enum_default, 0)\n        return this\n    def add_long_enum_normal_default(long_enum_normal_default:LongEnum):\n        b_.PrependUint64Slot(53, long_enum_normal_default, 2)\n        return this\n    def add_nan_default(nan_default:float):\n        b_.PrependFloat32Slot(54, nan_default, nan)\n        return this\n    def add_inf_default(inf_default:float):\n        b_.PrependFloat32Slot(55, inf_default, inf)\n        return this\n    def add_positive_inf_default(positive_inf_default:float):\n        b_.PrependFloat32Slot(56, positive_inf_default, +inf)\n        return this\n    def add_infinity_default(infinity_default:float):\n        b_.PrependFloat32Slot(57, infinity_default, infinity)\n        return this\n    def add_positive_infinity_default(positive_infinity_default:float):\n        b_.PrependFloat32Slot(58, positive_infinity_default, +infinity)\n        return this\n    def add_negative_inf_default(negative_inf_default:float):\n        b_.PrependFloat32Slot(59, negative_inf_default, -inf)\n        return this\n    def add_negative_infinity_default(negative_infinity_default:float):\n        b_.PrependFloat32Slot(60, negative_infinity_default, -infinity)\n        return this\n    def add_double_inf_default(double_inf_default:float):\n        b_.PrependFloat64Slot(61, double_inf_default, inf)\n        return this\n    def end():\n        return b_.EndObject()\n\ndef MonsterStartInventoryVector(b_:flatbuffers.builder, n_:int):\n    b_.StartVector(1, n_, 1)\ndef MonsterCreateInventoryVector(b_:flatbuffers.builder, v_:[int]):\n    b_.StartVector(1, v_.length, 1)\n    reverse(v_) e_: b_.PrependUint8(e_)\n    return b_.EndVector(v_.length)\n\ndef MonsterStartTest4Vector(b_:flatbuffers.builder, n_:int):\n    b_.StartVector(4, n_, 2)\n\ndef MonsterStartTestarrayofstringVector(b_:flatbuffers.builder, n_:int):\n    b_.StartVector(4, n_, 4)\ndef MonsterCreateTestarrayofstringVector(b_:flatbuffers.builder, v_:[flatbuffers.offset]):\n    b_.StartVector(4, v_.length, 4)\n    reverse(v_) e_: b_.PrependUOffsetTRelative(e_)\n    return b_.EndVector(v_.length)\n\ndef MonsterStartTestarrayoftablesVector(b_:flatbuffers.builder, n_:int):\n    b_.StartVector(4, n_, 4)\ndef MonsterCreateTestarrayoftablesVector(b_:flatbuffers.builder, v_:[flatbuffers.offset]):\n    b_.StartVector(4, v_.length, 4)\n    reverse(v_) e_: b_.PrependUOffsetTRelative(e_)\n    return b_.EndVector(v_.length)\n\ndef MonsterStartTestnestedflatbufferVector(b_:flatbuffers.builder, n_:int):\n    b_.StartVector(1, n_, 1)\ndef MonsterCreateTestnestedflatbufferVector(b_:flatbuffers.builder, v_:[int]):\n    b_.StartVector(1, v_.length, 1)\n    reverse(v_) e_: b_.PrependUint8(e_)\n    return b_.EndVector(v_.length)\n\ndef MonsterStartTestarrayofboolsVector(b_:flatbuffers.builder, n_:int):\n    b_.StartVector(1, n_, 1)\ndef MonsterCreateTestarrayofboolsVector(b_:flatbuffers.builder, v_:[bool]):\n    b_.StartVector(1, v_.length, 1)\n    reverse(v_) e_: b_.PrependBool(e_)\n    return b_.EndVector(v_.length)\n\ndef MonsterStartTestarrayofstring2Vector(b_:flatbuffers.builder, n_:int):\n    b_.StartVector(4, n_, 4)\ndef MonsterCreateTestarrayofstring2Vector(b_:flatbuffers.builder, v_:[flatbuffers.offset]):\n    b_.StartVector(4, v_.length, 4)\n    reverse(v_) e_: b_.PrependUOffsetTRelative(e_)\n    return b_.EndVector(v_.length)\n\ndef MonsterStartTestarrayofsortedstructVector(b_:flatbuffers.builder, n_:int):\n    b_.StartVector(8, n_, 4)\n\ndef MonsterStartFlexVector(b_:flatbuffers.builder, n_:int):\n    b_.StartVector(1, n_, 1)\ndef MonsterCreateFlexVector(b_:flatbuffers.builder, v_:[int]):\n    b_.StartVector(1, v_.length, 1)\n    reverse(v_) e_: b_.PrependUint8(e_)\n    return b_.EndVector(v_.length)\n\ndef MonsterStartTest5Vector(b_:flatbuffers.builder, n_:int):\n    b_.StartVector(4, n_, 2)\n\ndef MonsterStartVectorOfLongsVector(b_:flatbuffers.builder, n_:int):\n    b_.StartVector(8, n_, 8)\ndef MonsterCreateVectorOfLongsVector(b_:flatbuffers.builder, v_:[int]):\n    b_.StartVector(8, v_.length, 8)\n    reverse(v_) e_: b_.PrependInt64(e_)\n    return b_.EndVector(v_.length)\n\ndef MonsterStartVectorOfDoublesVector(b_:flatbuffers.builder, n_:int):\n    b_.StartVector(8, n_, 8)\ndef MonsterCreateVectorOfDoublesVector(b_:flatbuffers.builder, v_:[float]):\n    b_.StartVector(8, v_.length, 8)\n    reverse(v_) e_: b_.PrependFloat64(e_)\n    return b_.EndVector(v_.length)\n\ndef MonsterStartVectorOfReferrablesVector(b_:flatbuffers.builder, n_:int):\n    b_.StartVector(4, n_, 4)\ndef MonsterCreateVectorOfReferrablesVector(b_:flatbuffers.builder, v_:[flatbuffers.offset]):\n    b_.StartVector(4, v_.length, 4)\n    reverse(v_) e_: b_.PrependUOffsetTRelative(e_)\n    return b_.EndVector(v_.length)\n\ndef MonsterStartVectorOfWeakReferencesVector(b_:flatbuffers.builder, n_:int):\n    b_.StartVector(8, n_, 8)\ndef MonsterCreateVectorOfWeakReferencesVector(b_:flatbuffers.builder, v_:[int]):\n    b_.StartVector(8, v_.length, 8)\n    reverse(v_) e_: b_.PrependUint64(e_)\n    return b_.EndVector(v_.length)\n\ndef MonsterStartVectorOfStrongReferrablesVector(b_:flatbuffers.builder, n_:int):\n    b_.StartVector(4, n_, 4)\ndef MonsterCreateVectorOfStrongReferrablesVector(b_:flatbuffers.builder, v_:[flatbuffers.offset]):\n    b_.StartVector(4, v_.length, 4)\n    reverse(v_) e_: b_.PrependUOffsetTRelative(e_)\n    return b_.EndVector(v_.length)\n\ndef MonsterStartVectorOfCoOwningReferencesVector(b_:flatbuffers.builder, n_:int):\n    b_.StartVector(8, n_, 8)\ndef MonsterCreateVectorOfCoOwningReferencesVector(b_:flatbuffers.builder, v_:[int]):\n    b_.StartVector(8, v_.length, 8)\n    reverse(v_) e_: b_.PrependUint64(e_)\n    return b_.EndVector(v_.length)\n\ndef MonsterStartVectorOfNonOwningReferencesVector(b_:flatbuffers.builder, n_:int):\n    b_.StartVector(8, n_, 8)\ndef MonsterCreateVectorOfNonOwningReferencesVector(b_:flatbuffers.builder, v_:[int]):\n    b_.StartVector(8, v_.length, 8)\n    reverse(v_) e_: b_.PrependUint64(e_)\n    return b_.EndVector(v_.length)\n\ndef MonsterStartVectorOfEnumsVector(b_:flatbuffers.builder, n_:int):\n    b_.StartVector(1, n_, 1)\ndef MonsterCreateVectorOfEnumsVector(b_:flatbuffers.builder, v_:[Color]):\n    b_.StartVector(1, v_.length, 1)\n    reverse(v_) e_: b_.PrependUint8(e_)\n    return b_.EndVector(v_.length)\n\ndef MonsterStartTestrequirednestedflatbufferVector(b_:flatbuffers.builder, n_:int):\n    b_.StartVector(1, n_, 1)\ndef MonsterCreateTestrequirednestedflatbufferVector(b_:flatbuffers.builder, v_:[int]):\n    b_.StartVector(1, v_.length, 1)\n    reverse(v_) e_: b_.PrependUint8(e_)\n    return b_.EndVector(v_.length)\n\ndef MonsterStartScalarKeySortedTablesVector(b_:flatbuffers.builder, n_:int):\n    b_.StartVector(4, n_, 4)\ndef MonsterCreateScalarKeySortedTablesVector(b_:flatbuffers.builder, v_:[flatbuffers.offset]):\n    b_.StartVector(4, v_.length, 4)\n    reverse(v_) e_: b_.PrependUOffsetTRelative(e_)\n    return b_.EndVector(v_.length)\n\nclass TypeAliases : flatbuffers.handle\n    def i8() -> int:\n        return flatbuffers.field_int8(buf_, pos_, 4, 0)\n    def u8() -> int:\n        return flatbuffers.field_uint8(buf_, pos_, 6, 0)\n    def i16() -> int:\n        return flatbuffers.field_int16(buf_, pos_, 8, 0)\n    def u16() -> int:\n        return flatbuffers.field_uint16(buf_, pos_, 10, 0)\n    def i32() -> int:\n        return flatbuffers.field_int32(buf_, pos_, 12, 0)\n    def u32() -> int:\n        return flatbuffers.field_uint32(buf_, pos_, 14, 0)\n    def i64() -> int:\n        return flatbuffers.field_int64(buf_, pos_, 16, 0)\n    def u64() -> int:\n        return flatbuffers.field_uint64(buf_, pos_, 18, 0)\n    def f32() -> float:\n        return flatbuffers.field_float32(buf_, pos_, 20, 0.0)\n    def f64() -> float:\n        return flatbuffers.field_float64(buf_, pos_, 22, 0.0)\n    def v8(i:int) -> int:\n        return read_int8_le(buf_, buf_.flatbuffers.field_vector(pos_, 24) + i * 1)\n    def v8_length() -> int:\n        return flatbuffers.field_vector_len(buf_, pos_, 24)\n    def vf64(i:int) -> float:\n        return read_float64_le(buf_, buf_.flatbuffers.field_vector(pos_, 26) + i * 8)\n    def vf64_length() -> int:\n        return flatbuffers.field_vector_len(buf_, pos_, 26)\n\ndef GetRootAsTypeAliases(buf:string): return TypeAliases { buf, flatbuffers.indirect(buf, 0) }\n\nstruct TypeAliasesBuilder:\n    b_:flatbuffers.builder\n    def start():\n        b_.StartObject(12)\n        return this\n    def add_i8(i8:int):\n        b_.PrependInt8Slot(0, i8, 0)\n        return this\n    def add_u8(u8:int):\n        b_.PrependUint8Slot(1, u8, 0)\n        return this\n    def add_i16(i16:int):\n        b_.PrependInt16Slot(2, i16, 0)\n        return this\n    def add_u16(u16:int):\n        b_.PrependUint16Slot(3, u16, 0)\n        return this\n    def add_i32(i32:int):\n        b_.PrependInt32Slot(4, i32, 0)\n        return this\n    def add_u32(u32:int):\n        b_.PrependUint32Slot(5, u32, 0)\n        return this\n    def add_i64(i64:int):\n        b_.PrependInt64Slot(6, i64, 0)\n        return this\n    def add_u64(u64:int):\n        b_.PrependUint64Slot(7, u64, 0)\n        return this\n    def add_f32(f32:float):\n        b_.PrependFloat32Slot(8, f32, 0.0)\n        return this\n    def add_f64(f64:float):\n        b_.PrependFloat64Slot(9, f64, 0.0)\n        return this\n    def add_v8(v8:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(10, v8)\n        return this\n    def add_vf64(vf64:flatbuffers.offset):\n        b_.PrependUOffsetTRelativeSlot(11, vf64)\n        return this\n    def end():\n        return b_.EndObject()\n\ndef TypeAliasesStartV8Vector(b_:flatbuffers.builder, n_:int):\n    b_.StartVector(1, n_, 1)\ndef TypeAliasesCreateV8Vector(b_:flatbuffers.builder, v_:[int]):\n    b_.StartVector(1, v_.length, 1)\n    reverse(v_) e_: b_.PrependInt8(e_)\n    return b_.EndVector(v_.length)\n\ndef TypeAliasesStartVf64Vector(b_:flatbuffers.builder, n_:int):\n    b_.StartVector(8, n_, 8)\ndef TypeAliasesCreateVf64Vector(b_:flatbuffers.builder, v_:[float]):\n    b_.StartVector(8, v_.length, 8)\n    reverse(v_) e_: b_.PrependFloat64(e_)\n    return b_.EndVector(v_.length)\n\n"
  },
  {
    "path": "tests/monster_test_generated.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: Example\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\n# Composite components of Monster color.\nclass Color(object):\n    Red = 1\n    # \\brief color Green\n    # Green is bit_flag with value (1u << 1)\n    Green = 2\n    # \\brief color Blue (1u << 3)\n    Blue = 8\n\n\nclass Race(object):\n    None_ = -1\n    Human = 0\n    Dwarf = 1\n    Elf = 2\n\n\nclass LongEnum(object):\n    LongOne = 2\n    LongTwo = 4\n    LongBig = 1099511627776\n\n\nclass Any(object):\n    NONE = 0\n    Monster = 1\n    TestSimpleTableWithEnum = 2\n    MyGame_Example2_Monster = 3\n\ndef AnyCreator(unionType, table):\n    from flatbuffers.table import Table\n    if not isinstance(table, Table):\n        return None\n    if unionType == Any.Monster:\n        return MonsterT.InitFromBuf(table.Bytes, table.Pos)\n    if unionType == Any.TestSimpleTableWithEnum:\n        return TestSimpleTableWithEnumT.InitFromBuf(table.Bytes, table.Pos)\n    if unionType == Any.MyGame_Example2_Monster:\n        return MonsterT.InitFromBuf(table.Bytes, table.Pos)\n    return None\n\n\nclass AnyUniqueAliases(object):\n    NONE = 0\n    M = 1\n    TS = 2\n    M2 = 3\n\ndef AnyUniqueAliasesCreator(unionType, table):\n    from flatbuffers.table import Table\n    if not isinstance(table, Table):\n        return None\n    if unionType == AnyUniqueAliases.M:\n        return MonsterT.InitFromBuf(table.Bytes, table.Pos)\n    if unionType == AnyUniqueAliases.TS:\n        return TestSimpleTableWithEnumT.InitFromBuf(table.Bytes, table.Pos)\n    if unionType == AnyUniqueAliases.M2:\n        return MonsterT.InitFromBuf(table.Bytes, table.Pos)\n    return None\n\n\nclass AnyAmbiguousAliases(object):\n    NONE = 0\n    M1 = 1\n    M2 = 2\n    M3 = 3\n\ndef AnyAmbiguousAliasesCreator(unionType, table):\n    from flatbuffers.table import Table\n    if not isinstance(table, Table):\n        return None\n    if unionType == AnyAmbiguousAliases.M1:\n        return MonsterT.InitFromBuf(table.Bytes, table.Pos)\n    if unionType == AnyAmbiguousAliases.M2:\n        return MonsterT.InitFromBuf(table.Bytes, table.Pos)\n    if unionType == AnyAmbiguousAliases.M3:\n        return MonsterT.InitFromBuf(table.Bytes, table.Pos)\n    return None\n\n\nclass InParentNamespace(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = InParentNamespace()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsInParentNamespace(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    @classmethod\n    def InParentNamespaceBufferHasIdentifier(cls, buf, offset, size_prefixed=False):\n        return flatbuffers.util.BufferHasIdentifier(buf, offset, b\"\\x4D\\x4F\\x4E\\x53\", size_prefixed=size_prefixed)\n\n    # InParentNamespace\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\ndef InParentNamespaceStart(builder):\n    builder.StartObject(0)\n\ndef InParentNamespaceEnd(builder):\n    return builder.EndObject()\n\n\n\nclass InParentNamespaceT(object):\n\n    # InParentNamespaceT\n    def __init__(\n        self,\n    ):\n        pass\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        inParentNamespace = InParentNamespace()\n        inParentNamespace.Init(buf, pos)\n        return cls.InitFromObj(inParentNamespace)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, inParentNamespace):\n        x = InParentNamespaceT()\n        x._UnPack(inParentNamespace)\n        return x\n\n    # InParentNamespaceT\n    def _UnPack(self, inParentNamespace):\n        if inParentNamespace is None:\n            return\n\n    # InParentNamespaceT\n    def Pack(self, builder):\n        InParentNamespaceStart(builder)\n        inParentNamespace = InParentNamespaceEnd(builder)\n        return inParentNamespace\n\n\nclass Monster(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = Monster()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsMonster(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    @classmethod\n    def MonsterBufferHasIdentifier(cls, buf, offset, size_prefixed=False):\n        return flatbuffers.util.BufferHasIdentifier(buf, offset, b\"\\x4D\\x4F\\x4E\\x53\", size_prefixed=size_prefixed)\n\n    # Monster\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\ndef MonsterStart(builder):\n    builder.StartObject(0)\n\ndef MonsterEnd(builder):\n    return builder.EndObject()\n\n\n\nclass MonsterT(object):\n\n    # MonsterT\n    def __init__(\n        self,\n    ):\n        pass\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        monster = Monster()\n        monster.Init(buf, pos)\n        return cls.InitFromObj(monster)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, monster):\n        x = MonsterT()\n        x._UnPack(monster)\n        return x\n\n    # MonsterT\n    def _UnPack(self, monster):\n        if monster is None:\n            return\n\n    # MonsterT\n    def Pack(self, builder):\n        MonsterStart(builder)\n        monster = MonsterEnd(builder)\n        return monster\n\n\nclass Test(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def SizeOf(cls):\n        return 4\n\n    # Test\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # Test\n    def A(self): return self._tab.Get(flatbuffers.number_types.Int16Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(0))\n    # Test\n    def B(self): return self._tab.Get(flatbuffers.number_types.Int8Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(2))\n\ndef CreateTest(builder, a, b):\n    builder.Prep(2, 4)\n    builder.Pad(1)\n    builder.PrependInt8(b)\n    builder.PrependInt16(a)\n    return builder.Offset()\n\n\nclass TestT(object):\n\n    # TestT\n    def __init__(\n        self,\n        a = 0,\n        b = 0,\n    ):\n        self.a = a  # type: int\n        self.b = b  # type: int\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        test = Test()\n        test.Init(buf, pos)\n        return cls.InitFromObj(test)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, test):\n        x = TestT()\n        x._UnPack(test)\n        return x\n\n    # TestT\n    def _UnPack(self, test):\n        if test is None:\n            return\n        self.a = test.A()\n        self.b = test.B()\n\n    # TestT\n    def Pack(self, builder):\n        return CreateTest(builder, self.a, self.b)\n\n\nclass TestSimpleTableWithEnum(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = TestSimpleTableWithEnum()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsTestSimpleTableWithEnum(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    @classmethod\n    def TestSimpleTableWithEnumBufferHasIdentifier(cls, buf, offset, size_prefixed=False):\n        return flatbuffers.util.BufferHasIdentifier(buf, offset, b\"\\x4D\\x4F\\x4E\\x53\", size_prefixed=size_prefixed)\n\n    # TestSimpleTableWithEnum\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # TestSimpleTableWithEnum\n    def Color(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos)\n        return 2\n\ndef TestSimpleTableWithEnumStart(builder):\n    builder.StartObject(1)\n\ndef TestSimpleTableWithEnumAddColor(builder, color):\n    builder.PrependUint8Slot(0, color, 2)\n\ndef TestSimpleTableWithEnumEnd(builder):\n    return builder.EndObject()\n\n\n\nclass TestSimpleTableWithEnumT(object):\n\n    # TestSimpleTableWithEnumT\n    def __init__(\n        self,\n        color = 2,\n    ):\n        self.color = color  # type: int\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        testSimpleTableWithEnum = TestSimpleTableWithEnum()\n        testSimpleTableWithEnum.Init(buf, pos)\n        return cls.InitFromObj(testSimpleTableWithEnum)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, testSimpleTableWithEnum):\n        x = TestSimpleTableWithEnumT()\n        x._UnPack(testSimpleTableWithEnum)\n        return x\n\n    # TestSimpleTableWithEnumT\n    def _UnPack(self, testSimpleTableWithEnum):\n        if testSimpleTableWithEnum is None:\n            return\n        self.color = testSimpleTableWithEnum.Color()\n\n    # TestSimpleTableWithEnumT\n    def Pack(self, builder):\n        TestSimpleTableWithEnumStart(builder)\n        TestSimpleTableWithEnumAddColor(builder, self.color)\n        testSimpleTableWithEnum = TestSimpleTableWithEnumEnd(builder)\n        return testSimpleTableWithEnum\n\n\nclass Vec3(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def SizeOf(cls):\n        return 32\n\n    # Vec3\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # Vec3\n    def X(self): return self._tab.Get(flatbuffers.number_types.Float32Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(0))\n    # Vec3\n    def Y(self): return self._tab.Get(flatbuffers.number_types.Float32Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(4))\n    # Vec3\n    def Z(self): return self._tab.Get(flatbuffers.number_types.Float32Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(8))\n    # Vec3\n    def Test1(self): return self._tab.Get(flatbuffers.number_types.Float64Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(16))\n    # Vec3\n    def Test2(self): return self._tab.Get(flatbuffers.number_types.Uint8Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(24))\n    # Vec3\n    def Test3(self, obj):\n        obj.Init(self._tab.Bytes, self._tab.Pos + 26)\n        return obj\n\n\ndef CreateVec3(builder, x, y, z, test1, test2, test3_a, test3_b):\n    builder.Prep(8, 32)\n    builder.Pad(2)\n    builder.Prep(2, 4)\n    builder.Pad(1)\n    builder.PrependInt8(test3_b)\n    builder.PrependInt16(test3_a)\n    builder.Pad(1)\n    builder.PrependUint8(test2)\n    builder.PrependFloat64(test1)\n    builder.Pad(4)\n    builder.PrependFloat32(z)\n    builder.PrependFloat32(y)\n    builder.PrependFloat32(x)\n    return builder.Offset()\n\ntry:\n    from typing import Optional\nexcept:\n    pass\n\nclass Vec3T(object):\n\n    # Vec3T\n    def __init__(\n        self,\n        x = 0.0,\n        y = 0.0,\n        z = 0.0,\n        test1 = 0.0,\n        test2 = 0,\n        test3 = None,\n    ):\n        self.x = x  # type: float\n        self.y = y  # type: float\n        self.z = z  # type: float\n        self.test1 = test1  # type: float\n        self.test2 = test2  # type: int\n        self.test3 = test3  # type: Optional[TestT]\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        vec3 = Vec3()\n        vec3.Init(buf, pos)\n        return cls.InitFromObj(vec3)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, vec3):\n        x = Vec3T()\n        x._UnPack(vec3)\n        return x\n\n    # Vec3T\n    def _UnPack(self, vec3):\n        if vec3 is None:\n            return\n        self.x = vec3.X()\n        self.y = vec3.Y()\n        self.z = vec3.Z()\n        self.test1 = vec3.Test1()\n        self.test2 = vec3.Test2()\n        if vec3.Test3(Test()) is not None:\n            self.test3 = TestT.InitFromObj(vec3.Test3(Test()))\n\n    # Vec3T\n    def Pack(self, builder):\n        return CreateVec3(builder, self.x, self.y, self.z, self.test1, self.test2, self.test3.a, self.test3.b)\n\n\nclass Ability(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def SizeOf(cls):\n        return 8\n\n    # Ability\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # Ability\n    def Id(self): return self._tab.Get(flatbuffers.number_types.Uint32Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(0))\n    # Ability\n    def Distance(self): return self._tab.Get(flatbuffers.number_types.Uint32Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(4))\n\ndef CreateAbility(builder, id, distance):\n    builder.Prep(4, 8)\n    builder.PrependUint32(distance)\n    builder.PrependUint32(id)\n    return builder.Offset()\n\n\nclass AbilityT(object):\n\n    # AbilityT\n    def __init__(\n        self,\n        id = 0,\n        distance = 0,\n    ):\n        self.id = id  # type: int\n        self.distance = distance  # type: int\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        ability = Ability()\n        ability.Init(buf, pos)\n        return cls.InitFromObj(ability)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, ability):\n        x = AbilityT()\n        x._UnPack(ability)\n        return x\n\n    # AbilityT\n    def _UnPack(self, ability):\n        if ability is None:\n            return\n        self.id = ability.Id()\n        self.distance = ability.Distance()\n\n    # AbilityT\n    def Pack(self, builder):\n        return CreateAbility(builder, self.id, self.distance)\n\n\nclass StructOfStructs(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def SizeOf(cls):\n        return 20\n\n    # StructOfStructs\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # StructOfStructs\n    def A(self, obj):\n        obj.Init(self._tab.Bytes, self._tab.Pos + 0)\n        return obj\n\n    # StructOfStructs\n    def B(self, obj):\n        obj.Init(self._tab.Bytes, self._tab.Pos + 8)\n        return obj\n\n    # StructOfStructs\n    def C(self, obj):\n        obj.Init(self._tab.Bytes, self._tab.Pos + 12)\n        return obj\n\n\ndef CreateStructOfStructs(builder, a_id, a_distance, b_a, b_b, c_id, c_distance):\n    builder.Prep(4, 20)\n    builder.Prep(4, 8)\n    builder.PrependUint32(c_distance)\n    builder.PrependUint32(c_id)\n    builder.Prep(2, 4)\n    builder.Pad(1)\n    builder.PrependInt8(b_b)\n    builder.PrependInt16(b_a)\n    builder.Prep(4, 8)\n    builder.PrependUint32(a_distance)\n    builder.PrependUint32(a_id)\n    return builder.Offset()\n\ntry:\n    from typing import Optional\nexcept:\n    pass\n\nclass StructOfStructsT(object):\n\n    # StructOfStructsT\n    def __init__(\n        self,\n        a = None,\n        b = None,\n        c = None,\n    ):\n        self.a = a  # type: Optional[AbilityT]\n        self.b = b  # type: Optional[TestT]\n        self.c = c  # type: Optional[AbilityT]\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        structOfStructs = StructOfStructs()\n        structOfStructs.Init(buf, pos)\n        return cls.InitFromObj(structOfStructs)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, structOfStructs):\n        x = StructOfStructsT()\n        x._UnPack(structOfStructs)\n        return x\n\n    # StructOfStructsT\n    def _UnPack(self, structOfStructs):\n        if structOfStructs is None:\n            return\n        if structOfStructs.A(Ability()) is not None:\n            self.a = AbilityT.InitFromObj(structOfStructs.A(Ability()))\n        if structOfStructs.B(Test()) is not None:\n            self.b = TestT.InitFromObj(structOfStructs.B(Test()))\n        if structOfStructs.C(Ability()) is not None:\n            self.c = AbilityT.InitFromObj(structOfStructs.C(Ability()))\n\n    # StructOfStructsT\n    def Pack(self, builder):\n        return CreateStructOfStructs(builder, self.a.id, self.a.distance, self.b.a, self.b.b, self.c.id, self.c.distance)\n\n\nclass StructOfStructsOfStructs(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def SizeOf(cls):\n        return 20\n\n    # StructOfStructsOfStructs\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # StructOfStructsOfStructs\n    def A(self, obj):\n        obj.Init(self._tab.Bytes, self._tab.Pos + 0)\n        return obj\n\n\ndef CreateStructOfStructsOfStructs(builder, a_a_id, a_a_distance, a_b_a, a_b_b, a_c_id, a_c_distance):\n    builder.Prep(4, 20)\n    builder.Prep(4, 20)\n    builder.Prep(4, 8)\n    builder.PrependUint32(a_c_distance)\n    builder.PrependUint32(a_c_id)\n    builder.Prep(2, 4)\n    builder.Pad(1)\n    builder.PrependInt8(a_b_b)\n    builder.PrependInt16(a_b_a)\n    builder.Prep(4, 8)\n    builder.PrependUint32(a_a_distance)\n    builder.PrependUint32(a_a_id)\n    return builder.Offset()\n\ntry:\n    from typing import Optional\nexcept:\n    pass\n\nclass StructOfStructsOfStructsT(object):\n\n    # StructOfStructsOfStructsT\n    def __init__(\n        self,\n        a = None,\n    ):\n        self.a = a  # type: Optional[StructOfStructsT]\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        structOfStructsOfStructs = StructOfStructsOfStructs()\n        structOfStructsOfStructs.Init(buf, pos)\n        return cls.InitFromObj(structOfStructsOfStructs)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, structOfStructsOfStructs):\n        x = StructOfStructsOfStructsT()\n        x._UnPack(structOfStructsOfStructs)\n        return x\n\n    # StructOfStructsOfStructsT\n    def _UnPack(self, structOfStructsOfStructs):\n        if structOfStructsOfStructs is None:\n            return\n        if structOfStructsOfStructs.A(StructOfStructs()) is not None:\n            self.a = StructOfStructsT.InitFromObj(structOfStructsOfStructs.A(StructOfStructs()))\n\n    # StructOfStructsOfStructsT\n    def Pack(self, builder):\n        return CreateStructOfStructsOfStructs(builder, self.a.a.id, self.a.a.distance, self.a.b.a, self.a.b.b, self.a.c.id, self.a.c.distance)\n\n\nclass Stat(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = Stat()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsStat(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    @classmethod\n    def StatBufferHasIdentifier(cls, buf, offset, size_prefixed=False):\n        return flatbuffers.util.BufferHasIdentifier(buf, offset, b\"\\x4D\\x4F\\x4E\\x53\", size_prefixed=size_prefixed)\n\n    # Stat\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # Stat\n    def Id(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.String(o + self._tab.Pos)\n        return None\n\n    # Stat\n    def Val(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int64Flags, o + self._tab.Pos)\n        return 0\n\n    # Stat\n    def Count(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint16Flags, o + self._tab.Pos)\n        return 0\n\ndef StatStart(builder):\n    builder.StartObject(3)\n\ndef StatAddId(builder, id):\n    builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(id), 0)\n\ndef StatAddVal(builder, val):\n    builder.PrependInt64Slot(1, val, 0)\n\ndef StatAddCount(builder, count):\n    builder.PrependUint16Slot(2, count, 0)\n\ndef StatEnd(builder):\n    return builder.EndObject()\n\n\n\nclass StatT(object):\n\n    # StatT\n    def __init__(\n        self,\n        id = None,\n        val = 0,\n        count = 0,\n    ):\n        self.id = id  # type: Optional[str]\n        self.val = val  # type: int\n        self.count = count  # type: int\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        stat = Stat()\n        stat.Init(buf, pos)\n        return cls.InitFromObj(stat)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, stat):\n        x = StatT()\n        x._UnPack(stat)\n        return x\n\n    # StatT\n    def _UnPack(self, stat):\n        if stat is None:\n            return\n        self.id = stat.Id()\n        self.val = stat.Val()\n        self.count = stat.Count()\n\n    # StatT\n    def Pack(self, builder):\n        if self.id is not None:\n            id = builder.CreateString(self.id)\n        StatStart(builder)\n        if self.id is not None:\n            StatAddId(builder, id)\n        StatAddVal(builder, self.val)\n        StatAddCount(builder, self.count)\n        stat = StatEnd(builder)\n        return stat\n\n\nclass Referrable(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = Referrable()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsReferrable(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    @classmethod\n    def ReferrableBufferHasIdentifier(cls, buf, offset, size_prefixed=False):\n        return flatbuffers.util.BufferHasIdentifier(buf, offset, b\"\\x4D\\x4F\\x4E\\x53\", size_prefixed=size_prefixed)\n\n    # Referrable\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # Referrable\n    def Id(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos)\n        return 0\n\ndef ReferrableStart(builder):\n    builder.StartObject(1)\n\ndef ReferrableAddId(builder, id):\n    builder.PrependUint64Slot(0, id, 0)\n\ndef ReferrableEnd(builder):\n    return builder.EndObject()\n\n\n\nclass ReferrableT(object):\n\n    # ReferrableT\n    def __init__(\n        self,\n        id = 0,\n    ):\n        self.id = id  # type: int\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        referrable = Referrable()\n        referrable.Init(buf, pos)\n        return cls.InitFromObj(referrable)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, referrable):\n        x = ReferrableT()\n        x._UnPack(referrable)\n        return x\n\n    # ReferrableT\n    def _UnPack(self, referrable):\n        if referrable is None:\n            return\n        self.id = referrable.Id()\n\n    # ReferrableT\n    def Pack(self, builder):\n        ReferrableStart(builder)\n        ReferrableAddId(builder, self.id)\n        referrable = ReferrableEnd(builder)\n        return referrable\n\n\n# an example documentation comment: \"monster object\"\nclass Monster(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = Monster()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsMonster(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    @classmethod\n    def MonsterBufferHasIdentifier(cls, buf, offset, size_prefixed=False):\n        return flatbuffers.util.BufferHasIdentifier(buf, offset, b\"\\x4D\\x4F\\x4E\\x53\", size_prefixed=size_prefixed)\n\n    # Monster\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # Monster\n    def Pos(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            x = o + self._tab.Pos\n            obj = Vec3()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Monster\n    def Mana(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int16Flags, o + self._tab.Pos)\n        return 150\n\n    # Monster\n    def Hp(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int16Flags, o + self._tab.Pos)\n        return 100\n\n    # Monster\n    def Name(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10))\n        if o != 0:\n            return self._tab.String(o + self._tab.Pos)\n        return None\n\n    # Monster\n    def Inventory(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1))\n        return 0\n\n    # Monster\n    def InventoryAsNumpy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))\n        if o != 0:\n            return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint8Flags, o)\n        return 0\n\n    # Monster\n    def InventoryLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def InventoryIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))\n        return o == 0\n\n    # Monster\n    def Color(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos)\n        return 8\n\n    # Monster\n    def TestType(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(18))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def Test(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(20))\n        if o != 0:\n            from flatbuffers.table import Table\n            obj = Table(bytearray(), 0)\n            self._tab.Union(obj, o)\n            return obj\n        return None\n\n    # Monster\n    def Test4(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(22))\n        if o != 0:\n            x = self._tab.Vector(o)\n            x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4\n            obj = Test()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Monster\n    def Test4Length(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(22))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def Test4IsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(22))\n        return o == 0\n\n    # Monster\n    def Testarrayofstring(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(24))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.String(a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4))\n        return \"\"\n\n    # Monster\n    def TestarrayofstringLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(24))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def TestarrayofstringIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(24))\n        return o == 0\n\n    # an example documentation comment: this will end up in the generated code\n    # multiline too\n    # Monster\n    def Testarrayoftables(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(26))\n        if o != 0:\n            x = self._tab.Vector(o)\n            x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4\n            x = self._tab.Indirect(x)\n            obj = Monster()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Monster\n    def TestarrayoftablesLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(26))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def TestarrayoftablesIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(26))\n        return o == 0\n\n    # Monster\n    def Enemy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(28))\n        if o != 0:\n            x = self._tab.Indirect(o + self._tab.Pos)\n            obj = Monster()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Monster\n    def Testnestedflatbuffer(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(30))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1))\n        return 0\n\n    # Monster\n    def TestnestedflatbufferAsNumpy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(30))\n        if o != 0:\n            return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint8Flags, o)\n        return 0\n\n    # Monster\n    def TestnestedflatbufferNestedRoot(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(30))\n        if o != 0:\n            from MyGame.Example.Monster import Monster\n            return Monster.GetRootAs(self._tab.Bytes, self._tab.Vector(o))\n        return 0\n\n    # Monster\n    def TestnestedflatbufferLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(30))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def TestnestedflatbufferIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(30))\n        return o == 0\n\n    # Monster\n    def Testempty(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(32))\n        if o != 0:\n            x = self._tab.Indirect(o + self._tab.Pos)\n            obj = Stat()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Monster\n    def Testbool(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(34))\n        if o != 0:\n            return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos))\n        return False\n\n    # Monster\n    def Testhashs32Fnv1(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(36))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def Testhashu32Fnv1(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(38))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint32Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def Testhashs64Fnv1(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(40))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int64Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def Testhashu64Fnv1(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(42))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def Testhashs32Fnv1a(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(44))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def Testhashu32Fnv1a(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(46))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint32Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def Testhashs64Fnv1a(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(48))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int64Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def Testhashu64Fnv1a(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(50))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def Testarrayofbools(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(52))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.Get(flatbuffers.number_types.BoolFlags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1))\n        return 0\n\n    # Monster\n    def TestarrayofboolsAsNumpy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(52))\n        if o != 0:\n            return self._tab.GetVectorAsNumpy(flatbuffers.number_types.BoolFlags, o)\n        return 0\n\n    # Monster\n    def TestarrayofboolsLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(52))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def TestarrayofboolsIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(52))\n        return o == 0\n\n    # Monster\n    def Testf(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(54))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos)\n        return 3.14159\n\n    # Monster\n    def Testf2(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(56))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos)\n        return 3.0\n\n    # Monster\n    def Testf3(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(58))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos)\n        return 0.0\n\n    # Monster\n    def Testarrayofstring2(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(60))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.String(a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4))\n        return \"\"\n\n    # Monster\n    def Testarrayofstring2Length(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(60))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def Testarrayofstring2IsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(60))\n        return o == 0\n\n    # Monster\n    def Testarrayofsortedstruct(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(62))\n        if o != 0:\n            x = self._tab.Vector(o)\n            x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 8\n            obj = Ability()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Monster\n    def TestarrayofsortedstructLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(62))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def TestarrayofsortedstructIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(62))\n        return o == 0\n\n    # Monster\n    def Flex(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(64))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1))\n        return 0\n\n    # Monster\n    def FlexAsNumpy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(64))\n        if o != 0:\n            return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint8Flags, o)\n        return 0\n\n    # Monster\n    def FlexLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(64))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def FlexIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(64))\n        return o == 0\n\n    # Monster\n    def Test5(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(66))\n        if o != 0:\n            x = self._tab.Vector(o)\n            x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4\n            obj = Test()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Monster\n    def Test5Length(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(66))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def Test5IsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(66))\n        return o == 0\n\n    # Monster\n    def VectorOfLongs(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(68))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.Get(flatbuffers.number_types.Int64Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 8))\n        return 0\n\n    # Monster\n    def VectorOfLongsAsNumpy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(68))\n        if o != 0:\n            return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Int64Flags, o)\n        return 0\n\n    # Monster\n    def VectorOfLongsLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(68))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def VectorOfLongsIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(68))\n        return o == 0\n\n    # Monster\n    def VectorOfDoubles(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(70))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.Get(flatbuffers.number_types.Float64Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 8))\n        return 0\n\n    # Monster\n    def VectorOfDoublesAsNumpy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(70))\n        if o != 0:\n            return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Float64Flags, o)\n        return 0\n\n    # Monster\n    def VectorOfDoublesLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(70))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def VectorOfDoublesIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(70))\n        return o == 0\n\n    # Monster\n    def ParentNamespaceTest(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(72))\n        if o != 0:\n            x = self._tab.Indirect(o + self._tab.Pos)\n            obj = InParentNamespace()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Monster\n    def VectorOfReferrables(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(74))\n        if o != 0:\n            x = self._tab.Vector(o)\n            x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4\n            x = self._tab.Indirect(x)\n            obj = Referrable()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Monster\n    def VectorOfReferrablesLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(74))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def VectorOfReferrablesIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(74))\n        return o == 0\n\n    # Monster\n    def SingleWeakReference(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(76))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def VectorOfWeakReferences(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(78))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.Get(flatbuffers.number_types.Uint64Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 8))\n        return 0\n\n    # Monster\n    def VectorOfWeakReferencesAsNumpy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(78))\n        if o != 0:\n            return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint64Flags, o)\n        return 0\n\n    # Monster\n    def VectorOfWeakReferencesLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(78))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def VectorOfWeakReferencesIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(78))\n        return o == 0\n\n    # Monster\n    def VectorOfStrongReferrables(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(80))\n        if o != 0:\n            x = self._tab.Vector(o)\n            x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4\n            x = self._tab.Indirect(x)\n            obj = Referrable()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Monster\n    def VectorOfStrongReferrablesLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(80))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def VectorOfStrongReferrablesIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(80))\n        return o == 0\n\n    # Monster\n    def CoOwningReference(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(82))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def VectorOfCoOwningReferences(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(84))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.Get(flatbuffers.number_types.Uint64Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 8))\n        return 0\n\n    # Monster\n    def VectorOfCoOwningReferencesAsNumpy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(84))\n        if o != 0:\n            return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint64Flags, o)\n        return 0\n\n    # Monster\n    def VectorOfCoOwningReferencesLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(84))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def VectorOfCoOwningReferencesIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(84))\n        return o == 0\n\n    # Monster\n    def NonOwningReference(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(86))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def VectorOfNonOwningReferences(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(88))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.Get(flatbuffers.number_types.Uint64Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 8))\n        return 0\n\n    # Monster\n    def VectorOfNonOwningReferencesAsNumpy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(88))\n        if o != 0:\n            return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint64Flags, o)\n        return 0\n\n    # Monster\n    def VectorOfNonOwningReferencesLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(88))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def VectorOfNonOwningReferencesIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(88))\n        return o == 0\n\n    # Monster\n    def AnyUniqueType(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(90))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def AnyUnique(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(92))\n        if o != 0:\n            from flatbuffers.table import Table\n            obj = Table(bytearray(), 0)\n            self._tab.Union(obj, o)\n            return obj\n        return None\n\n    # Monster\n    def AnyAmbiguousType(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(94))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def AnyAmbiguous(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(96))\n        if o != 0:\n            from flatbuffers.table import Table\n            obj = Table(bytearray(), 0)\n            self._tab.Union(obj, o)\n            return obj\n        return None\n\n    # Monster\n    def VectorOfEnums(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(98))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1))\n        return 0\n\n    # Monster\n    def VectorOfEnumsAsNumpy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(98))\n        if o != 0:\n            return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint8Flags, o)\n        return 0\n\n    # Monster\n    def VectorOfEnumsLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(98))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def VectorOfEnumsIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(98))\n        return o == 0\n\n    # Monster\n    def SignedEnum(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(100))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos)\n        return -1\n\n    # Monster\n    def Testrequirednestedflatbuffer(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(102))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1))\n        return 0\n\n    # Monster\n    def TestrequirednestedflatbufferAsNumpy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(102))\n        if o != 0:\n            return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint8Flags, o)\n        return 0\n\n    # Monster\n    def TestrequirednestedflatbufferNestedRoot(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(102))\n        if o != 0:\n            from MyGame.Example.Monster import Monster\n            return Monster.GetRootAs(self._tab.Bytes, self._tab.Vector(o))\n        return 0\n\n    # Monster\n    def TestrequirednestedflatbufferLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(102))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def TestrequirednestedflatbufferIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(102))\n        return o == 0\n\n    # Monster\n    def ScalarKeySortedTables(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(104))\n        if o != 0:\n            x = self._tab.Vector(o)\n            x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4\n            x = self._tab.Indirect(x)\n            obj = Stat()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Monster\n    def ScalarKeySortedTablesLength(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(104))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # Monster\n    def ScalarKeySortedTablesIsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(104))\n        return o == 0\n\n    # Monster\n    def NativeInline(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(106))\n        if o != 0:\n            x = o + self._tab.Pos\n            obj = Test()\n            obj.Init(self._tab.Bytes, x)\n            return obj\n        return None\n\n    # Monster\n    def LongEnumNonEnumDefault(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(108))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos)\n        return 0\n\n    # Monster\n    def LongEnumNormalDefault(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(110))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos)\n        return 2\n\n    # Monster\n    def NanDefault(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(112))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos)\n        return float('nan')\n\n    # Monster\n    def InfDefault(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(114))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos)\n        return float('inf')\n\n    # Monster\n    def PositiveInfDefault(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(116))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos)\n        return float('inf')\n\n    # Monster\n    def InfinityDefault(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(118))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos)\n        return float('inf')\n\n    # Monster\n    def PositiveInfinityDefault(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(120))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos)\n        return float('inf')\n\n    # Monster\n    def NegativeInfDefault(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(122))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos)\n        return float('-inf')\n\n    # Monster\n    def NegativeInfinityDefault(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(124))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos)\n        return float('-inf')\n\n    # Monster\n    def DoubleInfDefault(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(126))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float64Flags, o + self._tab.Pos)\n        return float('inf')\n\ndef MonsterStart(builder):\n    builder.StartObject(62)\n\ndef MonsterAddPos(builder, pos):\n    builder.PrependStructSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(pos), 0)\n\ndef MonsterAddMana(builder, mana):\n    builder.PrependInt16Slot(1, mana, 150)\n\ndef MonsterAddHp(builder, hp):\n    builder.PrependInt16Slot(2, hp, 100)\n\ndef MonsterAddName(builder, name):\n    builder.PrependUOffsetTRelativeSlot(3, flatbuffers.number_types.UOffsetTFlags.py_type(name), 0)\n\ndef MonsterAddInventory(builder, inventory):\n    builder.PrependUOffsetTRelativeSlot(5, flatbuffers.number_types.UOffsetTFlags.py_type(inventory), 0)\n\ndef MonsterStartInventoryVector(builder, numElems):\n    return builder.StartVector(1, numElems, 1)\n\ndef MonsterCreateInventoryVector(builder, data):\n    data = list(data)\n    builder.StartVector(1, len(data), 1)\n    for item in reversed(data):\n        builder.PrependUint8(item)\n    return builder.EndVector()\n\ndef MonsterAddColor(builder, color):\n    builder.PrependUint8Slot(6, color, 8)\n\ndef MonsterAddTestType(builder, testType):\n    builder.PrependUint8Slot(7, testType, 0)\n\ndef MonsterAddTest(builder, test):\n    builder.PrependUOffsetTRelativeSlot(8, flatbuffers.number_types.UOffsetTFlags.py_type(test), 0)\n\ndef MonsterAddTest4(builder, test4):\n    builder.PrependUOffsetTRelativeSlot(9, flatbuffers.number_types.UOffsetTFlags.py_type(test4), 0)\n\ndef MonsterStartTest4Vector(builder, numElems):\n    return builder.StartVector(4, numElems, 2)\n\ndef MonsterCreateTest4Vector(builder, data):\n    data = list(data)\n    builder.StartVector(4, len(data), 2)\n    for item in reversed(data):\n        item.Pack(builder)\n    return builder.EndVector()\n\ndef MonsterAddTestarrayofstring(builder, testarrayofstring):\n    builder.PrependUOffsetTRelativeSlot(10, flatbuffers.number_types.UOffsetTFlags.py_type(testarrayofstring), 0)\n\ndef MonsterStartTestarrayofstringVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef MonsterCreateTestarrayofstringVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef MonsterAddTestarrayoftables(builder, testarrayoftables):\n    builder.PrependUOffsetTRelativeSlot(11, flatbuffers.number_types.UOffsetTFlags.py_type(testarrayoftables), 0)\n\ndef MonsterStartTestarrayoftablesVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef MonsterCreateTestarrayoftablesVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef MonsterAddEnemy(builder, enemy):\n    builder.PrependUOffsetTRelativeSlot(12, flatbuffers.number_types.UOffsetTFlags.py_type(enemy), 0)\n\ndef MonsterAddTestnestedflatbuffer(builder, testnestedflatbuffer):\n    builder.PrependUOffsetTRelativeSlot(13, flatbuffers.number_types.UOffsetTFlags.py_type(testnestedflatbuffer), 0)\n\ndef MonsterStartTestnestedflatbufferVector(builder, numElems):\n    return builder.StartVector(1, numElems, 1)\n\ndef MonsterCreateTestnestedflatbufferVector(builder, data):\n    data = list(data)\n    builder.StartVector(1, len(data), 1)\n    for item in reversed(data):\n        builder.PrependUint8(item)\n    return builder.EndVector()\n\ndef MonsterMakeTestnestedflatbufferVectorFromBytes(builder, bytes):\n    builder.StartVector(1, len(bytes), 1)\n    builder.head = builder.head - len(bytes)\n    builder.Bytes[builder.head : builder.head + len(bytes)] = bytes\n    return builder.EndVector()\ndef MonsterAddTestempty(builder, testempty):\n    builder.PrependUOffsetTRelativeSlot(14, flatbuffers.number_types.UOffsetTFlags.py_type(testempty), 0)\n\ndef MonsterAddTestbool(builder, testbool):\n    builder.PrependBoolSlot(15, testbool, 0)\n\ndef MonsterAddTesthashs32Fnv1(builder, testhashs32Fnv1):\n    builder.PrependInt32Slot(16, testhashs32Fnv1, 0)\n\ndef MonsterAddTesthashu32Fnv1(builder, testhashu32Fnv1):\n    builder.PrependUint32Slot(17, testhashu32Fnv1, 0)\n\ndef MonsterAddTesthashs64Fnv1(builder, testhashs64Fnv1):\n    builder.PrependInt64Slot(18, testhashs64Fnv1, 0)\n\ndef MonsterAddTesthashu64Fnv1(builder, testhashu64Fnv1):\n    builder.PrependUint64Slot(19, testhashu64Fnv1, 0)\n\ndef MonsterAddTesthashs32Fnv1a(builder, testhashs32Fnv1a):\n    builder.PrependInt32Slot(20, testhashs32Fnv1a, 0)\n\ndef MonsterAddTesthashu32Fnv1a(builder, testhashu32Fnv1a):\n    builder.PrependUint32Slot(21, testhashu32Fnv1a, 0)\n\ndef MonsterAddTesthashs64Fnv1a(builder, testhashs64Fnv1a):\n    builder.PrependInt64Slot(22, testhashs64Fnv1a, 0)\n\ndef MonsterAddTesthashu64Fnv1a(builder, testhashu64Fnv1a):\n    builder.PrependUint64Slot(23, testhashu64Fnv1a, 0)\n\ndef MonsterAddTestarrayofbools(builder, testarrayofbools):\n    builder.PrependUOffsetTRelativeSlot(24, flatbuffers.number_types.UOffsetTFlags.py_type(testarrayofbools), 0)\n\ndef MonsterStartTestarrayofboolsVector(builder, numElems):\n    return builder.StartVector(1, numElems, 1)\n\ndef MonsterCreateTestarrayofboolsVector(builder, data):\n    data = list(data)\n    builder.StartVector(1, len(data), 1)\n    for item in reversed(data):\n        builder.PrependBool(item)\n    return builder.EndVector()\n\ndef MonsterAddTestf(builder, testf):\n    builder.PrependFloat32Slot(25, testf, 3.14159)\n\ndef MonsterAddTestf2(builder, testf2):\n    builder.PrependFloat32Slot(26, testf2, 3.0)\n\ndef MonsterAddTestf3(builder, testf3):\n    builder.PrependFloat32Slot(27, testf3, 0.0)\n\ndef MonsterAddTestarrayofstring2(builder, testarrayofstring2):\n    builder.PrependUOffsetTRelativeSlot(28, flatbuffers.number_types.UOffsetTFlags.py_type(testarrayofstring2), 0)\n\ndef MonsterStartTestarrayofstring2Vector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef MonsterCreateTestarrayofstring2Vector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef MonsterAddTestarrayofsortedstruct(builder, testarrayofsortedstruct):\n    builder.PrependUOffsetTRelativeSlot(29, flatbuffers.number_types.UOffsetTFlags.py_type(testarrayofsortedstruct), 0)\n\ndef MonsterStartTestarrayofsortedstructVector(builder, numElems):\n    return builder.StartVector(8, numElems, 4)\n\ndef MonsterCreateTestarrayofsortedstructVector(builder, data):\n    data = list(data)\n    builder.StartVector(8, len(data), 4)\n    for item in reversed(data):\n        item.Pack(builder)\n    return builder.EndVector()\n\ndef MonsterAddFlex(builder, flex):\n    builder.PrependUOffsetTRelativeSlot(30, flatbuffers.number_types.UOffsetTFlags.py_type(flex), 0)\n\ndef MonsterStartFlexVector(builder, numElems):\n    return builder.StartVector(1, numElems, 1)\n\ndef MonsterCreateFlexVector(builder, data):\n    data = list(data)\n    builder.StartVector(1, len(data), 1)\n    for item in reversed(data):\n        builder.PrependUint8(item)\n    return builder.EndVector()\n\ndef MonsterAddTest5(builder, test5):\n    builder.PrependUOffsetTRelativeSlot(31, flatbuffers.number_types.UOffsetTFlags.py_type(test5), 0)\n\ndef MonsterStartTest5Vector(builder, numElems):\n    return builder.StartVector(4, numElems, 2)\n\ndef MonsterCreateTest5Vector(builder, data):\n    data = list(data)\n    builder.StartVector(4, len(data), 2)\n    for item in reversed(data):\n        item.Pack(builder)\n    return builder.EndVector()\n\ndef MonsterAddVectorOfLongs(builder, vectorOfLongs):\n    builder.PrependUOffsetTRelativeSlot(32, flatbuffers.number_types.UOffsetTFlags.py_type(vectorOfLongs), 0)\n\ndef MonsterStartVectorOfLongsVector(builder, numElems):\n    return builder.StartVector(8, numElems, 8)\n\ndef MonsterCreateVectorOfLongsVector(builder, data):\n    data = list(data)\n    builder.StartVector(8, len(data), 8)\n    for item in reversed(data):\n        builder.PrependInt64(item)\n    return builder.EndVector()\n\ndef MonsterAddVectorOfDoubles(builder, vectorOfDoubles):\n    builder.PrependUOffsetTRelativeSlot(33, flatbuffers.number_types.UOffsetTFlags.py_type(vectorOfDoubles), 0)\n\ndef MonsterStartVectorOfDoublesVector(builder, numElems):\n    return builder.StartVector(8, numElems, 8)\n\ndef MonsterCreateVectorOfDoublesVector(builder, data):\n    data = list(data)\n    builder.StartVector(8, len(data), 8)\n    for item in reversed(data):\n        builder.PrependFloat64(item)\n    return builder.EndVector()\n\ndef MonsterAddParentNamespaceTest(builder, parentNamespaceTest):\n    builder.PrependUOffsetTRelativeSlot(34, flatbuffers.number_types.UOffsetTFlags.py_type(parentNamespaceTest), 0)\n\ndef MonsterAddVectorOfReferrables(builder, vectorOfReferrables):\n    builder.PrependUOffsetTRelativeSlot(35, flatbuffers.number_types.UOffsetTFlags.py_type(vectorOfReferrables), 0)\n\ndef MonsterStartVectorOfReferrablesVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef MonsterCreateVectorOfReferrablesVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef MonsterAddSingleWeakReference(builder, singleWeakReference):\n    builder.PrependUint64Slot(36, singleWeakReference, 0)\n\ndef MonsterAddVectorOfWeakReferences(builder, vectorOfWeakReferences):\n    builder.PrependUOffsetTRelativeSlot(37, flatbuffers.number_types.UOffsetTFlags.py_type(vectorOfWeakReferences), 0)\n\ndef MonsterStartVectorOfWeakReferencesVector(builder, numElems):\n    return builder.StartVector(8, numElems, 8)\n\ndef MonsterCreateVectorOfWeakReferencesVector(builder, data):\n    data = list(data)\n    builder.StartVector(8, len(data), 8)\n    for item in reversed(data):\n        builder.PrependUint64(item)\n    return builder.EndVector()\n\ndef MonsterAddVectorOfStrongReferrables(builder, vectorOfStrongReferrables):\n    builder.PrependUOffsetTRelativeSlot(38, flatbuffers.number_types.UOffsetTFlags.py_type(vectorOfStrongReferrables), 0)\n\ndef MonsterStartVectorOfStrongReferrablesVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef MonsterCreateVectorOfStrongReferrablesVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef MonsterAddCoOwningReference(builder, coOwningReference):\n    builder.PrependUint64Slot(39, coOwningReference, 0)\n\ndef MonsterAddVectorOfCoOwningReferences(builder, vectorOfCoOwningReferences):\n    builder.PrependUOffsetTRelativeSlot(40, flatbuffers.number_types.UOffsetTFlags.py_type(vectorOfCoOwningReferences), 0)\n\ndef MonsterStartVectorOfCoOwningReferencesVector(builder, numElems):\n    return builder.StartVector(8, numElems, 8)\n\ndef MonsterCreateVectorOfCoOwningReferencesVector(builder, data):\n    data = list(data)\n    builder.StartVector(8, len(data), 8)\n    for item in reversed(data):\n        builder.PrependUint64(item)\n    return builder.EndVector()\n\ndef MonsterAddNonOwningReference(builder, nonOwningReference):\n    builder.PrependUint64Slot(41, nonOwningReference, 0)\n\ndef MonsterAddVectorOfNonOwningReferences(builder, vectorOfNonOwningReferences):\n    builder.PrependUOffsetTRelativeSlot(42, flatbuffers.number_types.UOffsetTFlags.py_type(vectorOfNonOwningReferences), 0)\n\ndef MonsterStartVectorOfNonOwningReferencesVector(builder, numElems):\n    return builder.StartVector(8, numElems, 8)\n\ndef MonsterCreateVectorOfNonOwningReferencesVector(builder, data):\n    data = list(data)\n    builder.StartVector(8, len(data), 8)\n    for item in reversed(data):\n        builder.PrependUint64(item)\n    return builder.EndVector()\n\ndef MonsterAddAnyUniqueType(builder, anyUniqueType):\n    builder.PrependUint8Slot(43, anyUniqueType, 0)\n\ndef MonsterAddAnyUnique(builder, anyUnique):\n    builder.PrependUOffsetTRelativeSlot(44, flatbuffers.number_types.UOffsetTFlags.py_type(anyUnique), 0)\n\ndef MonsterAddAnyAmbiguousType(builder, anyAmbiguousType):\n    builder.PrependUint8Slot(45, anyAmbiguousType, 0)\n\ndef MonsterAddAnyAmbiguous(builder, anyAmbiguous):\n    builder.PrependUOffsetTRelativeSlot(46, flatbuffers.number_types.UOffsetTFlags.py_type(anyAmbiguous), 0)\n\ndef MonsterAddVectorOfEnums(builder, vectorOfEnums):\n    builder.PrependUOffsetTRelativeSlot(47, flatbuffers.number_types.UOffsetTFlags.py_type(vectorOfEnums), 0)\n\ndef MonsterStartVectorOfEnumsVector(builder, numElems):\n    return builder.StartVector(1, numElems, 1)\n\ndef MonsterCreateVectorOfEnumsVector(builder, data):\n    data = list(data)\n    builder.StartVector(1, len(data), 1)\n    for item in reversed(data):\n        builder.PrependUint8(item)\n    return builder.EndVector()\n\ndef MonsterAddSignedEnum(builder, signedEnum):\n    builder.PrependInt8Slot(48, signedEnum, -1)\n\ndef MonsterAddTestrequirednestedflatbuffer(builder, testrequirednestedflatbuffer):\n    builder.PrependUOffsetTRelativeSlot(49, flatbuffers.number_types.UOffsetTFlags.py_type(testrequirednestedflatbuffer), 0)\n\ndef MonsterStartTestrequirednestedflatbufferVector(builder, numElems):\n    return builder.StartVector(1, numElems, 1)\n\ndef MonsterCreateTestrequirednestedflatbufferVector(builder, data):\n    data = list(data)\n    builder.StartVector(1, len(data), 1)\n    for item in reversed(data):\n        builder.PrependUint8(item)\n    return builder.EndVector()\n\ndef MonsterMakeTestrequirednestedflatbufferVectorFromBytes(builder, bytes):\n    builder.StartVector(1, len(bytes), 1)\n    builder.head = builder.head - len(bytes)\n    builder.Bytes[builder.head : builder.head + len(bytes)] = bytes\n    return builder.EndVector()\ndef MonsterAddScalarKeySortedTables(builder, scalarKeySortedTables):\n    builder.PrependUOffsetTRelativeSlot(50, flatbuffers.number_types.UOffsetTFlags.py_type(scalarKeySortedTables), 0)\n\ndef MonsterStartScalarKeySortedTablesVector(builder, numElems):\n    return builder.StartVector(4, numElems, 4)\n\ndef MonsterCreateScalarKeySortedTablesVector(builder, data):\n    return builder.CreateVectorOfTables(data)\n\ndef MonsterAddNativeInline(builder, nativeInline):\n    builder.PrependStructSlot(51, flatbuffers.number_types.UOffsetTFlags.py_type(nativeInline), 0)\n\ndef MonsterAddLongEnumNonEnumDefault(builder, longEnumNonEnumDefault):\n    builder.PrependUint64Slot(52, longEnumNonEnumDefault, 0)\n\ndef MonsterAddLongEnumNormalDefault(builder, longEnumNormalDefault):\n    builder.PrependUint64Slot(53, longEnumNormalDefault, 2)\n\ndef MonsterAddNanDefault(builder, nanDefault):\n    builder.PrependFloat32Slot(54, nanDefault, float('nan'))\n\ndef MonsterAddInfDefault(builder, infDefault):\n    builder.PrependFloat32Slot(55, infDefault, float('inf'))\n\ndef MonsterAddPositiveInfDefault(builder, positiveInfDefault):\n    builder.PrependFloat32Slot(56, positiveInfDefault, float('inf'))\n\ndef MonsterAddInfinityDefault(builder, infinityDefault):\n    builder.PrependFloat32Slot(57, infinityDefault, float('inf'))\n\ndef MonsterAddPositiveInfinityDefault(builder, positiveInfinityDefault):\n    builder.PrependFloat32Slot(58, positiveInfinityDefault, float('inf'))\n\ndef MonsterAddNegativeInfDefault(builder, negativeInfDefault):\n    builder.PrependFloat32Slot(59, negativeInfDefault, float('-inf'))\n\ndef MonsterAddNegativeInfinityDefault(builder, negativeInfinityDefault):\n    builder.PrependFloat32Slot(60, negativeInfinityDefault, float('-inf'))\n\ndef MonsterAddDoubleInfDefault(builder, doubleInfDefault):\n    builder.PrependFloat64Slot(61, doubleInfDefault, float('inf'))\n\ndef MonsterEnd(builder):\n    return builder.EndObject()\n\n\ntry:\n    from typing import List, Optional, Union\nexcept:\n    pass\n\nclass MonsterT(object):\n\n    # MonsterT\n    def __init__(\n        self,\n        pos = None,\n        mana = 150,\n        hp = 100,\n        name = None,\n        inventory = None,\n        color = 8,\n        testType = 0,\n        test = None,\n        test4 = None,\n        testarrayofstring = None,\n        testarrayoftables = None,\n        enemy = None,\n        testnestedflatbuffer = None,\n        testempty = None,\n        testbool = False,\n        testhashs32Fnv1 = 0,\n        testhashu32Fnv1 = 0,\n        testhashs64Fnv1 = 0,\n        testhashu64Fnv1 = 0,\n        testhashs32Fnv1a = 0,\n        testhashu32Fnv1a = 0,\n        testhashs64Fnv1a = 0,\n        testhashu64Fnv1a = 0,\n        testarrayofbools = None,\n        testf = 3.14159,\n        testf2 = 3.0,\n        testf3 = 0.0,\n        testarrayofstring2 = None,\n        testarrayofsortedstruct = None,\n        flex = None,\n        test5 = None,\n        vectorOfLongs = None,\n        vectorOfDoubles = None,\n        parentNamespaceTest = None,\n        vectorOfReferrables = None,\n        singleWeakReference = 0,\n        vectorOfWeakReferences = None,\n        vectorOfStrongReferrables = None,\n        coOwningReference = 0,\n        vectorOfCoOwningReferences = None,\n        nonOwningReference = 0,\n        vectorOfNonOwningReferences = None,\n        anyUniqueType = 0,\n        anyUnique = None,\n        anyAmbiguousType = 0,\n        anyAmbiguous = None,\n        vectorOfEnums = None,\n        signedEnum = -1,\n        testrequirednestedflatbuffer = None,\n        scalarKeySortedTables = None,\n        nativeInline = None,\n        longEnumNonEnumDefault = 0,\n        longEnumNormalDefault = 2,\n        nanDefault = float('nan'),\n        infDefault = float('inf'),\n        positiveInfDefault = float('inf'),\n        infinityDefault = float('inf'),\n        positiveInfinityDefault = float('inf'),\n        negativeInfDefault = float('-inf'),\n        negativeInfinityDefault = float('-inf'),\n        doubleInfDefault = float('inf'),\n    ):\n        self.pos = pos  # type: Optional[Vec3T]\n        self.mana = mana  # type: int\n        self.hp = hp  # type: int\n        self.name = name  # type: Optional[str]\n        self.inventory = inventory  # type: Optional[List[int]]\n        self.color = color  # type: int\n        self.testType = testType  # type: int\n        self.test = test  # type: Union[None, 'MonsterT', 'TestSimpleTableWithEnumT', 'MonsterT']\n        self.test4 = test4  # type: Optional[List[TestT]]\n        self.testarrayofstring = testarrayofstring  # type: Optional[List[Optional[str]]]\n        self.testarrayoftables = testarrayoftables  # type: Optional[List[MonsterT]]\n        self.enemy = enemy  # type: Optional[MonsterT]\n        self.testnestedflatbuffer = testnestedflatbuffer  # type: Optional[List[int]]\n        self.testempty = testempty  # type: Optional[StatT]\n        self.testbool = testbool  # type: bool\n        self.testhashs32Fnv1 = testhashs32Fnv1  # type: int\n        self.testhashu32Fnv1 = testhashu32Fnv1  # type: int\n        self.testhashs64Fnv1 = testhashs64Fnv1  # type: int\n        self.testhashu64Fnv1 = testhashu64Fnv1  # type: int\n        self.testhashs32Fnv1a = testhashs32Fnv1a  # type: int\n        self.testhashu32Fnv1a = testhashu32Fnv1a  # type: int\n        self.testhashs64Fnv1a = testhashs64Fnv1a  # type: int\n        self.testhashu64Fnv1a = testhashu64Fnv1a  # type: int\n        self.testarrayofbools = testarrayofbools  # type: Optional[List[bool]]\n        self.testf = testf  # type: float\n        self.testf2 = testf2  # type: float\n        self.testf3 = testf3  # type: float\n        self.testarrayofstring2 = testarrayofstring2  # type: Optional[List[Optional[str]]]\n        self.testarrayofsortedstruct = testarrayofsortedstruct  # type: Optional[List[AbilityT]]\n        self.flex = flex  # type: Optional[List[int]]\n        self.test5 = test5  # type: Optional[List[TestT]]\n        self.vectorOfLongs = vectorOfLongs  # type: Optional[List[int]]\n        self.vectorOfDoubles = vectorOfDoubles  # type: Optional[List[float]]\n        self.parentNamespaceTest = parentNamespaceTest  # type: Optional[InParentNamespaceT]\n        self.vectorOfReferrables = vectorOfReferrables  # type: Optional[List[ReferrableT]]\n        self.singleWeakReference = singleWeakReference  # type: int\n        self.vectorOfWeakReferences = vectorOfWeakReferences  # type: Optional[List[int]]\n        self.vectorOfStrongReferrables = vectorOfStrongReferrables  # type: Optional[List[ReferrableT]]\n        self.coOwningReference = coOwningReference  # type: int\n        self.vectorOfCoOwningReferences = vectorOfCoOwningReferences  # type: Optional[List[int]]\n        self.nonOwningReference = nonOwningReference  # type: int\n        self.vectorOfNonOwningReferences = vectorOfNonOwningReferences  # type: Optional[List[int]]\n        self.anyUniqueType = anyUniqueType  # type: int\n        self.anyUnique = anyUnique  # type: Union[None, 'MonsterT', 'TestSimpleTableWithEnumT', 'MonsterT']\n        self.anyAmbiguousType = anyAmbiguousType  # type: int\n        self.anyAmbiguous = anyAmbiguous  # type: Union[None, 'MonsterT', 'MonsterT', 'MonsterT']\n        self.vectorOfEnums = vectorOfEnums  # type: Optional[List[int]]\n        self.signedEnum = signedEnum  # type: int\n        self.testrequirednestedflatbuffer = testrequirednestedflatbuffer  # type: Optional[List[int]]\n        self.scalarKeySortedTables = scalarKeySortedTables  # type: Optional[List[StatT]]\n        self.nativeInline = nativeInline  # type: Optional[TestT]\n        self.longEnumNonEnumDefault = longEnumNonEnumDefault  # type: int\n        self.longEnumNormalDefault = longEnumNormalDefault  # type: int\n        self.nanDefault = nanDefault  # type: float\n        self.infDefault = infDefault  # type: float\n        self.positiveInfDefault = positiveInfDefault  # type: float\n        self.infinityDefault = infinityDefault  # type: float\n        self.positiveInfinityDefault = positiveInfinityDefault  # type: float\n        self.negativeInfDefault = negativeInfDefault  # type: float\n        self.negativeInfinityDefault = negativeInfinityDefault  # type: float\n        self.doubleInfDefault = doubleInfDefault  # type: float\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        monster = Monster()\n        monster.Init(buf, pos)\n        return cls.InitFromObj(monster)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, monster):\n        x = MonsterT()\n        x._UnPack(monster)\n        return x\n\n    # MonsterT\n    def _UnPack(self, monster):\n        if monster is None:\n            return\n        if monster.Pos() is not None:\n            self.pos = Vec3T.InitFromObj(monster.Pos())\n        self.mana = monster.Mana()\n        self.hp = monster.Hp()\n        self.name = monster.Name()\n        if not monster.InventoryIsNone():\n            if np is None:\n                self.inventory = []\n                for i in range(monster.InventoryLength()):\n                    self.inventory.append(monster.Inventory(i))\n            else:\n                self.inventory = monster.InventoryAsNumpy()\n        self.color = monster.Color()\n        self.testType = monster.TestType()\n        self.test = AnyCreator(self.testType, monster.Test())\n        if not monster.Test4IsNone():\n            self.test4 = []\n            for i in range(monster.Test4Length()):\n                if monster.Test4(i) is None:\n                    self.test4.append(None)\n                else:\n                    test_ = TestT.InitFromObj(monster.Test4(i))\n                    self.test4.append(test_)\n        if not monster.TestarrayofstringIsNone():\n            self.testarrayofstring = []\n            for i in range(monster.TestarrayofstringLength()):\n                self.testarrayofstring.append(monster.Testarrayofstring(i))\n        if not monster.TestarrayoftablesIsNone():\n            self.testarrayoftables = []\n            for i in range(monster.TestarrayoftablesLength()):\n                if monster.Testarrayoftables(i) is None:\n                    self.testarrayoftables.append(None)\n                else:\n                    monster_ = MonsterT.InitFromObj(monster.Testarrayoftables(i))\n                    self.testarrayoftables.append(monster_)\n        if monster.Enemy() is not None:\n            self.enemy = MonsterT.InitFromObj(monster.Enemy())\n        if not monster.TestnestedflatbufferIsNone():\n            if np is None:\n                self.testnestedflatbuffer = []\n                for i in range(monster.TestnestedflatbufferLength()):\n                    self.testnestedflatbuffer.append(monster.Testnestedflatbuffer(i))\n            else:\n                self.testnestedflatbuffer = monster.TestnestedflatbufferAsNumpy()\n        if monster.Testempty() is not None:\n            self.testempty = StatT.InitFromObj(monster.Testempty())\n        self.testbool = monster.Testbool()\n        self.testhashs32Fnv1 = monster.Testhashs32Fnv1()\n        self.testhashu32Fnv1 = monster.Testhashu32Fnv1()\n        self.testhashs64Fnv1 = monster.Testhashs64Fnv1()\n        self.testhashu64Fnv1 = monster.Testhashu64Fnv1()\n        self.testhashs32Fnv1a = monster.Testhashs32Fnv1a()\n        self.testhashu32Fnv1a = monster.Testhashu32Fnv1a()\n        self.testhashs64Fnv1a = monster.Testhashs64Fnv1a()\n        self.testhashu64Fnv1a = monster.Testhashu64Fnv1a()\n        if not monster.TestarrayofboolsIsNone():\n            if np is None:\n                self.testarrayofbools = []\n                for i in range(monster.TestarrayofboolsLength()):\n                    self.testarrayofbools.append(monster.Testarrayofbools(i))\n            else:\n                self.testarrayofbools = monster.TestarrayofboolsAsNumpy()\n        self.testf = monster.Testf()\n        self.testf2 = monster.Testf2()\n        self.testf3 = monster.Testf3()\n        if not monster.Testarrayofstring2IsNone():\n            self.testarrayofstring2 = []\n            for i in range(monster.Testarrayofstring2Length()):\n                self.testarrayofstring2.append(monster.Testarrayofstring2(i))\n        if not monster.TestarrayofsortedstructIsNone():\n            self.testarrayofsortedstruct = []\n            for i in range(monster.TestarrayofsortedstructLength()):\n                if monster.Testarrayofsortedstruct(i) is None:\n                    self.testarrayofsortedstruct.append(None)\n                else:\n                    ability_ = AbilityT.InitFromObj(monster.Testarrayofsortedstruct(i))\n                    self.testarrayofsortedstruct.append(ability_)\n        if not monster.FlexIsNone():\n            if np is None:\n                self.flex = []\n                for i in range(monster.FlexLength()):\n                    self.flex.append(monster.Flex(i))\n            else:\n                self.flex = monster.FlexAsNumpy()\n        if not monster.Test5IsNone():\n            self.test5 = []\n            for i in range(monster.Test5Length()):\n                if monster.Test5(i) is None:\n                    self.test5.append(None)\n                else:\n                    test_ = TestT.InitFromObj(monster.Test5(i))\n                    self.test5.append(test_)\n        if not monster.VectorOfLongsIsNone():\n            if np is None:\n                self.vectorOfLongs = []\n                for i in range(monster.VectorOfLongsLength()):\n                    self.vectorOfLongs.append(monster.VectorOfLongs(i))\n            else:\n                self.vectorOfLongs = monster.VectorOfLongsAsNumpy()\n        if not monster.VectorOfDoublesIsNone():\n            if np is None:\n                self.vectorOfDoubles = []\n                for i in range(monster.VectorOfDoublesLength()):\n                    self.vectorOfDoubles.append(monster.VectorOfDoubles(i))\n            else:\n                self.vectorOfDoubles = monster.VectorOfDoublesAsNumpy()\n        if monster.ParentNamespaceTest() is not None:\n            self.parentNamespaceTest = InParentNamespaceT.InitFromObj(monster.ParentNamespaceTest())\n        if not monster.VectorOfReferrablesIsNone():\n            self.vectorOfReferrables = []\n            for i in range(monster.VectorOfReferrablesLength()):\n                if monster.VectorOfReferrables(i) is None:\n                    self.vectorOfReferrables.append(None)\n                else:\n                    referrable_ = ReferrableT.InitFromObj(monster.VectorOfReferrables(i))\n                    self.vectorOfReferrables.append(referrable_)\n        self.singleWeakReference = monster.SingleWeakReference()\n        if not monster.VectorOfWeakReferencesIsNone():\n            if np is None:\n                self.vectorOfWeakReferences = []\n                for i in range(monster.VectorOfWeakReferencesLength()):\n                    self.vectorOfWeakReferences.append(monster.VectorOfWeakReferences(i))\n            else:\n                self.vectorOfWeakReferences = monster.VectorOfWeakReferencesAsNumpy()\n        if not monster.VectorOfStrongReferrablesIsNone():\n            self.vectorOfStrongReferrables = []\n            for i in range(monster.VectorOfStrongReferrablesLength()):\n                if monster.VectorOfStrongReferrables(i) is None:\n                    self.vectorOfStrongReferrables.append(None)\n                else:\n                    referrable_ = ReferrableT.InitFromObj(monster.VectorOfStrongReferrables(i))\n                    self.vectorOfStrongReferrables.append(referrable_)\n        self.coOwningReference = monster.CoOwningReference()\n        if not monster.VectorOfCoOwningReferencesIsNone():\n            if np is None:\n                self.vectorOfCoOwningReferences = []\n                for i in range(monster.VectorOfCoOwningReferencesLength()):\n                    self.vectorOfCoOwningReferences.append(monster.VectorOfCoOwningReferences(i))\n            else:\n                self.vectorOfCoOwningReferences = monster.VectorOfCoOwningReferencesAsNumpy()\n        self.nonOwningReference = monster.NonOwningReference()\n        if not monster.VectorOfNonOwningReferencesIsNone():\n            if np is None:\n                self.vectorOfNonOwningReferences = []\n                for i in range(monster.VectorOfNonOwningReferencesLength()):\n                    self.vectorOfNonOwningReferences.append(monster.VectorOfNonOwningReferences(i))\n            else:\n                self.vectorOfNonOwningReferences = monster.VectorOfNonOwningReferencesAsNumpy()\n        self.anyUniqueType = monster.AnyUniqueType()\n        self.anyUnique = AnyUniqueAliasesCreator(self.anyUniqueType, monster.AnyUnique())\n        self.anyAmbiguousType = monster.AnyAmbiguousType()\n        self.anyAmbiguous = AnyAmbiguousAliasesCreator(self.anyAmbiguousType, monster.AnyAmbiguous())\n        if not monster.VectorOfEnumsIsNone():\n            if np is None:\n                self.vectorOfEnums = []\n                for i in range(monster.VectorOfEnumsLength()):\n                    self.vectorOfEnums.append(monster.VectorOfEnums(i))\n            else:\n                self.vectorOfEnums = monster.VectorOfEnumsAsNumpy()\n        self.signedEnum = monster.SignedEnum()\n        if not monster.TestrequirednestedflatbufferIsNone():\n            if np is None:\n                self.testrequirednestedflatbuffer = []\n                for i in range(monster.TestrequirednestedflatbufferLength()):\n                    self.testrequirednestedflatbuffer.append(monster.Testrequirednestedflatbuffer(i))\n            else:\n                self.testrequirednestedflatbuffer = monster.TestrequirednestedflatbufferAsNumpy()\n        if not monster.ScalarKeySortedTablesIsNone():\n            self.scalarKeySortedTables = []\n            for i in range(monster.ScalarKeySortedTablesLength()):\n                if monster.ScalarKeySortedTables(i) is None:\n                    self.scalarKeySortedTables.append(None)\n                else:\n                    stat_ = StatT.InitFromObj(monster.ScalarKeySortedTables(i))\n                    self.scalarKeySortedTables.append(stat_)\n        if monster.NativeInline() is not None:\n            self.nativeInline = TestT.InitFromObj(monster.NativeInline())\n        self.longEnumNonEnumDefault = monster.LongEnumNonEnumDefault()\n        self.longEnumNormalDefault = monster.LongEnumNormalDefault()\n        self.nanDefault = monster.NanDefault()\n        self.infDefault = monster.InfDefault()\n        self.positiveInfDefault = monster.PositiveInfDefault()\n        self.infinityDefault = monster.InfinityDefault()\n        self.positiveInfinityDefault = monster.PositiveInfinityDefault()\n        self.negativeInfDefault = monster.NegativeInfDefault()\n        self.negativeInfinityDefault = monster.NegativeInfinityDefault()\n        self.doubleInfDefault = monster.DoubleInfDefault()\n\n    # MonsterT\n    def Pack(self, builder):\n        if self.name is not None:\n            name = builder.CreateString(self.name)\n        if self.inventory is not None:\n            if np is not None and type(self.inventory) is np.ndarray:\n                inventory = builder.CreateNumpyVector(self.inventory)\n            else:\n                MonsterStartInventoryVector(builder, len(self.inventory))\n                for i in reversed(range(len(self.inventory))):\n                    builder.PrependUint8(self.inventory[i])\n                inventory = builder.EndVector()\n        if self.test is not None:\n            test = self.test.Pack(builder)\n        if self.test4 is not None:\n            MonsterStartTest4Vector(builder, len(self.test4))\n            for i in reversed(range(len(self.test4))):\n                self.test4[i].Pack(builder)\n            test4 = builder.EndVector()\n        if self.testarrayofstring is not None:\n            testarrayofstringlist = []\n            for i in range(len(self.testarrayofstring)):\n                testarrayofstringlist.append(builder.CreateString(self.testarrayofstring[i]))\n            MonsterStartTestarrayofstringVector(builder, len(self.testarrayofstring))\n            for i in reversed(range(len(self.testarrayofstring))):\n                builder.PrependUOffsetTRelative(testarrayofstringlist[i])\n            testarrayofstring = builder.EndVector()\n        if self.testarrayoftables is not None:\n            testarrayoftableslist = []\n            for i in range(len(self.testarrayoftables)):\n                testarrayoftableslist.append(self.testarrayoftables[i].Pack(builder))\n            MonsterStartTestarrayoftablesVector(builder, len(self.testarrayoftables))\n            for i in reversed(range(len(self.testarrayoftables))):\n                builder.PrependUOffsetTRelative(testarrayoftableslist[i])\n            testarrayoftables = builder.EndVector()\n        if self.enemy is not None:\n            enemy = self.enemy.Pack(builder)\n        if self.testnestedflatbuffer is not None:\n            if np is not None and type(self.testnestedflatbuffer) is np.ndarray:\n                testnestedflatbuffer = builder.CreateNumpyVector(self.testnestedflatbuffer)\n            else:\n                MonsterStartTestnestedflatbufferVector(builder, len(self.testnestedflatbuffer))\n                for i in reversed(range(len(self.testnestedflatbuffer))):\n                    builder.PrependUint8(self.testnestedflatbuffer[i])\n                testnestedflatbuffer = builder.EndVector()\n        if self.testempty is not None:\n            testempty = self.testempty.Pack(builder)\n        if self.testarrayofbools is not None:\n            if np is not None and type(self.testarrayofbools) is np.ndarray:\n                testarrayofbools = builder.CreateNumpyVector(self.testarrayofbools)\n            else:\n                MonsterStartTestarrayofboolsVector(builder, len(self.testarrayofbools))\n                for i in reversed(range(len(self.testarrayofbools))):\n                    builder.PrependBool(self.testarrayofbools[i])\n                testarrayofbools = builder.EndVector()\n        if self.testarrayofstring2 is not None:\n            testarrayofstring2list = []\n            for i in range(len(self.testarrayofstring2)):\n                testarrayofstring2list.append(builder.CreateString(self.testarrayofstring2[i]))\n            MonsterStartTestarrayofstring2Vector(builder, len(self.testarrayofstring2))\n            for i in reversed(range(len(self.testarrayofstring2))):\n                builder.PrependUOffsetTRelative(testarrayofstring2list[i])\n            testarrayofstring2 = builder.EndVector()\n        if self.testarrayofsortedstruct is not None:\n            MonsterStartTestarrayofsortedstructVector(builder, len(self.testarrayofsortedstruct))\n            for i in reversed(range(len(self.testarrayofsortedstruct))):\n                self.testarrayofsortedstruct[i].Pack(builder)\n            testarrayofsortedstruct = builder.EndVector()\n        if self.flex is not None:\n            if np is not None and type(self.flex) is np.ndarray:\n                flex = builder.CreateNumpyVector(self.flex)\n            else:\n                MonsterStartFlexVector(builder, len(self.flex))\n                for i in reversed(range(len(self.flex))):\n                    builder.PrependUint8(self.flex[i])\n                flex = builder.EndVector()\n        if self.test5 is not None:\n            MonsterStartTest5Vector(builder, len(self.test5))\n            for i in reversed(range(len(self.test5))):\n                self.test5[i].Pack(builder)\n            test5 = builder.EndVector()\n        if self.vectorOfLongs is not None:\n            if np is not None and type(self.vectorOfLongs) is np.ndarray:\n                vectorOfLongs = builder.CreateNumpyVector(self.vectorOfLongs)\n            else:\n                MonsterStartVectorOfLongsVector(builder, len(self.vectorOfLongs))\n                for i in reversed(range(len(self.vectorOfLongs))):\n                    builder.PrependInt64(self.vectorOfLongs[i])\n                vectorOfLongs = builder.EndVector()\n        if self.vectorOfDoubles is not None:\n            if np is not None and type(self.vectorOfDoubles) is np.ndarray:\n                vectorOfDoubles = builder.CreateNumpyVector(self.vectorOfDoubles)\n            else:\n                MonsterStartVectorOfDoublesVector(builder, len(self.vectorOfDoubles))\n                for i in reversed(range(len(self.vectorOfDoubles))):\n                    builder.PrependFloat64(self.vectorOfDoubles[i])\n                vectorOfDoubles = builder.EndVector()\n        if self.parentNamespaceTest is not None:\n            parentNamespaceTest = self.parentNamespaceTest.Pack(builder)\n        if self.vectorOfReferrables is not None:\n            vectorOfReferrableslist = []\n            for i in range(len(self.vectorOfReferrables)):\n                vectorOfReferrableslist.append(self.vectorOfReferrables[i].Pack(builder))\n            MonsterStartVectorOfReferrablesVector(builder, len(self.vectorOfReferrables))\n            for i in reversed(range(len(self.vectorOfReferrables))):\n                builder.PrependUOffsetTRelative(vectorOfReferrableslist[i])\n            vectorOfReferrables = builder.EndVector()\n        if self.vectorOfWeakReferences is not None:\n            if np is not None and type(self.vectorOfWeakReferences) is np.ndarray:\n                vectorOfWeakReferences = builder.CreateNumpyVector(self.vectorOfWeakReferences)\n            else:\n                MonsterStartVectorOfWeakReferencesVector(builder, len(self.vectorOfWeakReferences))\n                for i in reversed(range(len(self.vectorOfWeakReferences))):\n                    builder.PrependUint64(self.vectorOfWeakReferences[i])\n                vectorOfWeakReferences = builder.EndVector()\n        if self.vectorOfStrongReferrables is not None:\n            vectorOfStrongReferrableslist = []\n            for i in range(len(self.vectorOfStrongReferrables)):\n                vectorOfStrongReferrableslist.append(self.vectorOfStrongReferrables[i].Pack(builder))\n            MonsterStartVectorOfStrongReferrablesVector(builder, len(self.vectorOfStrongReferrables))\n            for i in reversed(range(len(self.vectorOfStrongReferrables))):\n                builder.PrependUOffsetTRelative(vectorOfStrongReferrableslist[i])\n            vectorOfStrongReferrables = builder.EndVector()\n        if self.vectorOfCoOwningReferences is not None:\n            if np is not None and type(self.vectorOfCoOwningReferences) is np.ndarray:\n                vectorOfCoOwningReferences = builder.CreateNumpyVector(self.vectorOfCoOwningReferences)\n            else:\n                MonsterStartVectorOfCoOwningReferencesVector(builder, len(self.vectorOfCoOwningReferences))\n                for i in reversed(range(len(self.vectorOfCoOwningReferences))):\n                    builder.PrependUint64(self.vectorOfCoOwningReferences[i])\n                vectorOfCoOwningReferences = builder.EndVector()\n        if self.vectorOfNonOwningReferences is not None:\n            if np is not None and type(self.vectorOfNonOwningReferences) is np.ndarray:\n                vectorOfNonOwningReferences = builder.CreateNumpyVector(self.vectorOfNonOwningReferences)\n            else:\n                MonsterStartVectorOfNonOwningReferencesVector(builder, len(self.vectorOfNonOwningReferences))\n                for i in reversed(range(len(self.vectorOfNonOwningReferences))):\n                    builder.PrependUint64(self.vectorOfNonOwningReferences[i])\n                vectorOfNonOwningReferences = builder.EndVector()\n        if self.anyUnique is not None:\n            anyUnique = self.anyUnique.Pack(builder)\n        if self.anyAmbiguous is not None:\n            anyAmbiguous = self.anyAmbiguous.Pack(builder)\n        if self.vectorOfEnums is not None:\n            if np is not None and type(self.vectorOfEnums) is np.ndarray:\n                vectorOfEnums = builder.CreateNumpyVector(self.vectorOfEnums)\n            else:\n                MonsterStartVectorOfEnumsVector(builder, len(self.vectorOfEnums))\n                for i in reversed(range(len(self.vectorOfEnums))):\n                    builder.PrependUint8(self.vectorOfEnums[i])\n                vectorOfEnums = builder.EndVector()\n        if self.testrequirednestedflatbuffer is not None:\n            if np is not None and type(self.testrequirednestedflatbuffer) is np.ndarray:\n                testrequirednestedflatbuffer = builder.CreateNumpyVector(self.testrequirednestedflatbuffer)\n            else:\n                MonsterStartTestrequirednestedflatbufferVector(builder, len(self.testrequirednestedflatbuffer))\n                for i in reversed(range(len(self.testrequirednestedflatbuffer))):\n                    builder.PrependUint8(self.testrequirednestedflatbuffer[i])\n                testrequirednestedflatbuffer = builder.EndVector()\n        if self.scalarKeySortedTables is not None:\n            scalarKeySortedTableslist = []\n            for i in range(len(self.scalarKeySortedTables)):\n                scalarKeySortedTableslist.append(self.scalarKeySortedTables[i].Pack(builder))\n            MonsterStartScalarKeySortedTablesVector(builder, len(self.scalarKeySortedTables))\n            for i in reversed(range(len(self.scalarKeySortedTables))):\n                builder.PrependUOffsetTRelative(scalarKeySortedTableslist[i])\n            scalarKeySortedTables = builder.EndVector()\n        MonsterStart(builder)\n        if self.pos is not None:\n            pos = self.pos.Pack(builder)\n            MonsterAddPos(builder, pos)\n        MonsterAddMana(builder, self.mana)\n        MonsterAddHp(builder, self.hp)\n        if self.name is not None:\n            MonsterAddName(builder, name)\n        if self.inventory is not None:\n            MonsterAddInventory(builder, inventory)\n        MonsterAddColor(builder, self.color)\n        MonsterAddTestType(builder, self.testType)\n        if self.test is not None:\n            MonsterAddTest(builder, test)\n        if self.test4 is not None:\n            MonsterAddTest4(builder, test4)\n        if self.testarrayofstring is not None:\n            MonsterAddTestarrayofstring(builder, testarrayofstring)\n        if self.testarrayoftables is not None:\n            MonsterAddTestarrayoftables(builder, testarrayoftables)\n        if self.enemy is not None:\n            MonsterAddEnemy(builder, enemy)\n        if self.testnestedflatbuffer is not None:\n            MonsterAddTestnestedflatbuffer(builder, testnestedflatbuffer)\n        if self.testempty is not None:\n            MonsterAddTestempty(builder, testempty)\n        MonsterAddTestbool(builder, self.testbool)\n        MonsterAddTesthashs32Fnv1(builder, self.testhashs32Fnv1)\n        MonsterAddTesthashu32Fnv1(builder, self.testhashu32Fnv1)\n        MonsterAddTesthashs64Fnv1(builder, self.testhashs64Fnv1)\n        MonsterAddTesthashu64Fnv1(builder, self.testhashu64Fnv1)\n        MonsterAddTesthashs32Fnv1a(builder, self.testhashs32Fnv1a)\n        MonsterAddTesthashu32Fnv1a(builder, self.testhashu32Fnv1a)\n        MonsterAddTesthashs64Fnv1a(builder, self.testhashs64Fnv1a)\n        MonsterAddTesthashu64Fnv1a(builder, self.testhashu64Fnv1a)\n        if self.testarrayofbools is not None:\n            MonsterAddTestarrayofbools(builder, testarrayofbools)\n        MonsterAddTestf(builder, self.testf)\n        MonsterAddTestf2(builder, self.testf2)\n        MonsterAddTestf3(builder, self.testf3)\n        if self.testarrayofstring2 is not None:\n            MonsterAddTestarrayofstring2(builder, testarrayofstring2)\n        if self.testarrayofsortedstruct is not None:\n            MonsterAddTestarrayofsortedstruct(builder, testarrayofsortedstruct)\n        if self.flex is not None:\n            MonsterAddFlex(builder, flex)\n        if self.test5 is not None:\n            MonsterAddTest5(builder, test5)\n        if self.vectorOfLongs is not None:\n            MonsterAddVectorOfLongs(builder, vectorOfLongs)\n        if self.vectorOfDoubles is not None:\n            MonsterAddVectorOfDoubles(builder, vectorOfDoubles)\n        if self.parentNamespaceTest is not None:\n            MonsterAddParentNamespaceTest(builder, parentNamespaceTest)\n        if self.vectorOfReferrables is not None:\n            MonsterAddVectorOfReferrables(builder, vectorOfReferrables)\n        MonsterAddSingleWeakReference(builder, self.singleWeakReference)\n        if self.vectorOfWeakReferences is not None:\n            MonsterAddVectorOfWeakReferences(builder, vectorOfWeakReferences)\n        if self.vectorOfStrongReferrables is not None:\n            MonsterAddVectorOfStrongReferrables(builder, vectorOfStrongReferrables)\n        MonsterAddCoOwningReference(builder, self.coOwningReference)\n        if self.vectorOfCoOwningReferences is not None:\n            MonsterAddVectorOfCoOwningReferences(builder, vectorOfCoOwningReferences)\n        MonsterAddNonOwningReference(builder, self.nonOwningReference)\n        if self.vectorOfNonOwningReferences is not None:\n            MonsterAddVectorOfNonOwningReferences(builder, vectorOfNonOwningReferences)\n        MonsterAddAnyUniqueType(builder, self.anyUniqueType)\n        if self.anyUnique is not None:\n            MonsterAddAnyUnique(builder, anyUnique)\n        MonsterAddAnyAmbiguousType(builder, self.anyAmbiguousType)\n        if self.anyAmbiguous is not None:\n            MonsterAddAnyAmbiguous(builder, anyAmbiguous)\n        if self.vectorOfEnums is not None:\n            MonsterAddVectorOfEnums(builder, vectorOfEnums)\n        MonsterAddSignedEnum(builder, self.signedEnum)\n        if self.testrequirednestedflatbuffer is not None:\n            MonsterAddTestrequirednestedflatbuffer(builder, testrequirednestedflatbuffer)\n        if self.scalarKeySortedTables is not None:\n            MonsterAddScalarKeySortedTables(builder, scalarKeySortedTables)\n        if self.nativeInline is not None:\n            nativeInline = self.nativeInline.Pack(builder)\n            MonsterAddNativeInline(builder, nativeInline)\n        MonsterAddLongEnumNonEnumDefault(builder, self.longEnumNonEnumDefault)\n        MonsterAddLongEnumNormalDefault(builder, self.longEnumNormalDefault)\n        MonsterAddNanDefault(builder, self.nanDefault)\n        MonsterAddInfDefault(builder, self.infDefault)\n        MonsterAddPositiveInfDefault(builder, self.positiveInfDefault)\n        MonsterAddInfinityDefault(builder, self.infinityDefault)\n        MonsterAddPositiveInfinityDefault(builder, self.positiveInfinityDefault)\n        MonsterAddNegativeInfDefault(builder, self.negativeInfDefault)\n        MonsterAddNegativeInfinityDefault(builder, self.negativeInfinityDefault)\n        MonsterAddDoubleInfDefault(builder, self.doubleInfDefault)\n        monster = MonsterEnd(builder)\n        return monster\n\n\nclass TypeAliases(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = TypeAliases()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsTypeAliases(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    @classmethod\n    def TypeAliasesBufferHasIdentifier(cls, buf, offset, size_prefixed=False):\n        return flatbuffers.util.BufferHasIdentifier(buf, offset, b\"\\x4D\\x4F\\x4E\\x53\", size_prefixed=size_prefixed)\n\n    # TypeAliases\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # TypeAliases\n    def I8(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos)\n        return 0\n\n    # TypeAliases\n    def U8(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos)\n        return 0\n\n    # TypeAliases\n    def I16(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int16Flags, o + self._tab.Pos)\n        return 0\n\n    # TypeAliases\n    def U16(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint16Flags, o + self._tab.Pos)\n        return 0\n\n    # TypeAliases\n    def I32(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos)\n        return 0\n\n    # TypeAliases\n    def U32(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint32Flags, o + self._tab.Pos)\n        return 0\n\n    # TypeAliases\n    def I64(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int64Flags, o + self._tab.Pos)\n        return 0\n\n    # TypeAliases\n    def U64(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(18))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos)\n        return 0\n\n    # TypeAliases\n    def F32(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(20))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos)\n        return 0.0\n\n    # TypeAliases\n    def F64(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(22))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float64Flags, o + self._tab.Pos)\n        return 0.0\n\n    # TypeAliases\n    def V8(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(24))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.Get(flatbuffers.number_types.Int8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1))\n        return 0\n\n    # TypeAliases\n    def V8AsNumpy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(24))\n        if o != 0:\n            return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Int8Flags, o)\n        return 0\n\n    # TypeAliases\n    def V8Length(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(24))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # TypeAliases\n    def V8IsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(24))\n        return o == 0\n\n    # TypeAliases\n    def Vf64(self, j):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(26))\n        if o != 0:\n            a = self._tab.Vector(o)\n            return self._tab.Get(flatbuffers.number_types.Float64Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 8))\n        return 0\n\n    # TypeAliases\n    def Vf64AsNumpy(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(26))\n        if o != 0:\n            return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Float64Flags, o)\n        return 0\n\n    # TypeAliases\n    def Vf64Length(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(26))\n        if o != 0:\n            return self._tab.VectorLen(o)\n        return 0\n\n    # TypeAliases\n    def Vf64IsNone(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(26))\n        return o == 0\n\ndef TypeAliasesStart(builder):\n    builder.StartObject(12)\n\ndef TypeAliasesAddI8(builder, i8):\n    builder.PrependInt8Slot(0, i8, 0)\n\ndef TypeAliasesAddU8(builder, u8):\n    builder.PrependUint8Slot(1, u8, 0)\n\ndef TypeAliasesAddI16(builder, i16):\n    builder.PrependInt16Slot(2, i16, 0)\n\ndef TypeAliasesAddU16(builder, u16):\n    builder.PrependUint16Slot(3, u16, 0)\n\ndef TypeAliasesAddI32(builder, i32):\n    builder.PrependInt32Slot(4, i32, 0)\n\ndef TypeAliasesAddU32(builder, u32):\n    builder.PrependUint32Slot(5, u32, 0)\n\ndef TypeAliasesAddI64(builder, i64):\n    builder.PrependInt64Slot(6, i64, 0)\n\ndef TypeAliasesAddU64(builder, u64):\n    builder.PrependUint64Slot(7, u64, 0)\n\ndef TypeAliasesAddF32(builder, f32):\n    builder.PrependFloat32Slot(8, f32, 0.0)\n\ndef TypeAliasesAddF64(builder, f64):\n    builder.PrependFloat64Slot(9, f64, 0.0)\n\ndef TypeAliasesAddV8(builder, v8):\n    builder.PrependUOffsetTRelativeSlot(10, flatbuffers.number_types.UOffsetTFlags.py_type(v8), 0)\n\ndef TypeAliasesStartV8Vector(builder, numElems):\n    return builder.StartVector(1, numElems, 1)\n\ndef TypeAliasesCreateV8Vector(builder, data):\n    data = list(data)\n    builder.StartVector(1, len(data), 1)\n    for item in reversed(data):\n        builder.PrependInt8(item)\n    return builder.EndVector()\n\ndef TypeAliasesAddVf64(builder, vf64):\n    builder.PrependUOffsetTRelativeSlot(11, flatbuffers.number_types.UOffsetTFlags.py_type(vf64), 0)\n\ndef TypeAliasesStartVf64Vector(builder, numElems):\n    return builder.StartVector(8, numElems, 8)\n\ndef TypeAliasesCreateVf64Vector(builder, data):\n    data = list(data)\n    builder.StartVector(8, len(data), 8)\n    for item in reversed(data):\n        builder.PrependFloat64(item)\n    return builder.EndVector()\n\ndef TypeAliasesEnd(builder):\n    return builder.EndObject()\n\n\ntry:\n    from typing import List\nexcept:\n    pass\n\nclass TypeAliasesT(object):\n\n    # TypeAliasesT\n    def __init__(\n        self,\n        i8 = 0,\n        u8 = 0,\n        i16 = 0,\n        u16 = 0,\n        i32 = 0,\n        u32 = 0,\n        i64 = 0,\n        u64 = 0,\n        f32 = 0.0,\n        f64 = 0.0,\n        v8 = None,\n        vf64 = None,\n    ):\n        self.i8 = i8  # type: int\n        self.u8 = u8  # type: int\n        self.i16 = i16  # type: int\n        self.u16 = u16  # type: int\n        self.i32 = i32  # type: int\n        self.u32 = u32  # type: int\n        self.i64 = i64  # type: int\n        self.u64 = u64  # type: int\n        self.f32 = f32  # type: float\n        self.f64 = f64  # type: float\n        self.v8 = v8  # type: Optional[List[int]]\n        self.vf64 = vf64  # type: Optional[List[float]]\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        typeAliases = TypeAliases()\n        typeAliases.Init(buf, pos)\n        return cls.InitFromObj(typeAliases)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, typeAliases):\n        x = TypeAliasesT()\n        x._UnPack(typeAliases)\n        return x\n\n    # TypeAliasesT\n    def _UnPack(self, typeAliases):\n        if typeAliases is None:\n            return\n        self.i8 = typeAliases.I8()\n        self.u8 = typeAliases.U8()\n        self.i16 = typeAliases.I16()\n        self.u16 = typeAliases.U16()\n        self.i32 = typeAliases.I32()\n        self.u32 = typeAliases.U32()\n        self.i64 = typeAliases.I64()\n        self.u64 = typeAliases.U64()\n        self.f32 = typeAliases.F32()\n        self.f64 = typeAliases.F64()\n        if not typeAliases.V8IsNone():\n            if np is None:\n                self.v8 = []\n                for i in range(typeAliases.V8Length()):\n                    self.v8.append(typeAliases.V8(i))\n            else:\n                self.v8 = typeAliases.V8AsNumpy()\n        if not typeAliases.Vf64IsNone():\n            if np is None:\n                self.vf64 = []\n                for i in range(typeAliases.Vf64Length()):\n                    self.vf64.append(typeAliases.Vf64(i))\n            else:\n                self.vf64 = typeAliases.Vf64AsNumpy()\n\n    # TypeAliasesT\n    def Pack(self, builder):\n        if self.v8 is not None:\n            if np is not None and type(self.v8) is np.ndarray:\n                v8 = builder.CreateNumpyVector(self.v8)\n            else:\n                TypeAliasesStartV8Vector(builder, len(self.v8))\n                for i in reversed(range(len(self.v8))):\n                    builder.PrependByte(self.v8[i])\n                v8 = builder.EndVector()\n        if self.vf64 is not None:\n            if np is not None and type(self.vf64) is np.ndarray:\n                vf64 = builder.CreateNumpyVector(self.vf64)\n            else:\n                TypeAliasesStartVf64Vector(builder, len(self.vf64))\n                for i in reversed(range(len(self.vf64))):\n                    builder.PrependFloat64(self.vf64[i])\n                vf64 = builder.EndVector()\n        TypeAliasesStart(builder)\n        TypeAliasesAddI8(builder, self.i8)\n        TypeAliasesAddU8(builder, self.u8)\n        TypeAliasesAddI16(builder, self.i16)\n        TypeAliasesAddU16(builder, self.u16)\n        TypeAliasesAddI32(builder, self.i32)\n        TypeAliasesAddU32(builder, self.u32)\n        TypeAliasesAddI64(builder, self.i64)\n        TypeAliasesAddU64(builder, self.u64)\n        TypeAliasesAddF32(builder, self.f32)\n        TypeAliasesAddF64(builder, self.f64)\n        if self.v8 is not None:\n            TypeAliasesAddV8(builder, v8)\n        if self.vf64 is not None:\n            TypeAliasesAddVf64(builder, vf64)\n        typeAliases = TypeAliasesEnd(builder)\n        return typeAliases\n\n\n"
  },
  {
    "path": "tests/monster_test_generated.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\nexport {Ability, AbilityT} from './my-game/example/ability';\nexport {Any, unionListToAny, unionToAny} from './my-game/example/any';\nexport {\n  AnyAmbiguousAliases,\n  unionListToAnyAmbiguousAliases,\n  unionToAnyAmbiguousAliases,\n} from './my-game/example/any-ambiguous-aliases';\nexport {\n  AnyUniqueAliases,\n  unionListToAnyUniqueAliases,\n  unionToAnyUniqueAliases,\n} from './my-game/example/any-unique-aliases';\nexport {Color} from './my-game/example/color';\nexport {Monster, MonsterT} from './my-game/example/monster';\nexport {Race} from './my-game/example/race';\nexport {Referrable, ReferrableT} from './my-game/example/referrable';\nexport {Stat, StatT} from './my-game/example/stat';\nexport {\n  StructOfStructs,\n  StructOfStructsT,\n} from './my-game/example/struct-of-structs';\nexport {\n  StructOfStructsOfStructs,\n  StructOfStructsOfStructsT,\n} from './my-game/example/struct-of-structs-of-structs';\nexport {Test, TestT} from './my-game/example/test';\nexport {\n  TestSimpleTableWithEnum,\n  TestSimpleTableWithEnumT,\n} from './my-game/example/test-simple-table-with-enum';\nexport {TypeAliases, TypeAliasesT} from './my-game/example/type-aliases';\nexport {Vec3, Vec3T} from './my-game/example/vec3';\nexport {\n  Monster as MyGame_Example2_Monster,\n  MonsterT as MyGame_Example2_MonsterT,\n} from './my-game/example2/monster';\nexport {\n  InParentNamespace,\n  InParentNamespaceT,\n} from './my-game/in-parent-namespace';\n"
  },
  {
    "path": "tests/monster_test_my_game.example2_generated.dart",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable, constant_identifier_names\n\nlibrary my_game.example2;\n\nimport 'dart:typed_data' show Uint8List;\nimport 'package:flat_buffers/flat_buffers.dart' as fb;\n\nimport './monster_test_my_game_generated.dart' as my_game;\nimport './monster_test_my_game.example_generated.dart' as my_game_example;\n\nimport './include_test1_generated.dart';\n\nclass Monster {\n  Monster._(this._bc, this._bcOffset);\n  factory Monster(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<Monster> reader = _MonsterReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n\n  @override\n  String toString() {\n    return 'Monster{}';\n  }\n\n  MonsterT unpack() => MonsterT();\n\n  static int pack(fb.Builder fbBuilder, MonsterT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass MonsterT implements fb.Packable {\n  @override\n  int pack(fb.Builder fbBuilder) {\n    fbBuilder.startTable(0);\n    return fbBuilder.endTable();\n  }\n\n  @override\n  String toString() {\n    return 'MonsterT{}';\n  }\n}\n\nclass _MonsterReader extends fb.TableReader<Monster> {\n  const _MonsterReader();\n\n  @override\n  Monster createObject(fb.BufferContext bc, int offset) => \n    Monster._(bc, offset);\n}\n\nclass MonsterObjectBuilder extends fb.ObjectBuilder {\n\n  MonsterObjectBuilder();\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    fbBuilder.startTable(0);\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n"
  },
  {
    "path": "tests/monster_test_my_game.example_generated.dart",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable, constant_identifier_names\n\nlibrary my_game.example;\n\nimport 'dart:typed_data' show Uint8List;\nimport 'package:flat_buffers/flat_buffers.dart' as fb;\n\nimport './monster_test_my_game_generated.dart' as my_game;\nimport './monster_test_my_game.example2_generated.dart' as my_game_example2;\n\nimport './include_test1_generated.dart';\n\n///  Composite components of Monster color.\nenum Color {\n  Red(1),\n  Green(2),\n  Blue(8),\n  _default(0);\n\n  final int value;\n  const Color(this.value);\n\n  factory Color.fromValue(int value) {\n    switch (value) {\n      case 1: return Color.Red;\n      case 2: return Color.Green;\n      case 8: return Color.Blue;\n      case 0: return Color._default;\n      default: throw StateError('Invalid value $value for bit flag enum');\n    }\n  }\n\n  static Color? _createOrNull(int? value) =>\n      value == null ? null : Color.fromValue(value);\n\n  static const fb.Reader<Color> reader = _ColorReader();\n}\n\nclass _ColorReader extends fb.Reader<Color> {\n  const _ColorReader();\n\n  @override\n  int get size => 1;\n\n  @override\n  Color read(fb.BufferContext bc, int offset) =>\n      Color.fromValue(const fb.Uint8Reader().read(bc, offset));\n}\n\nenum Race {\n  None(-1),\n  Human(0),\n  Dwarf(1),\n  Elf(2);\n\n  final int value;\n  const Race(this.value);\n\n  factory Race.fromValue(int value) {\n    switch (value) {\n      case -1: return Race.None;\n      case 0: return Race.Human;\n      case 1: return Race.Dwarf;\n      case 2: return Race.Elf;\n      default: throw StateError('Invalid value $value for bit flag enum');\n    }\n  }\n\n  static Race? _createOrNull(int? value) =>\n      value == null ? null : Race.fromValue(value);\n\n  static const int minValue = -1;\n  static const int maxValue = 2;\n  static const fb.Reader<Race> reader = _RaceReader();\n}\n\nclass _RaceReader extends fb.Reader<Race> {\n  const _RaceReader();\n\n  @override\n  int get size => 1;\n\n  @override\n  Race read(fb.BufferContext bc, int offset) =>\n      Race.fromValue(const fb.Int8Reader().read(bc, offset));\n}\n\nenum LongEnum {\n  LongOne(2),\n  LongTwo(4),\n  LongBig(1099511627776),\n  _default(0);\n\n  final int value;\n  const LongEnum(this.value);\n\n  factory LongEnum.fromValue(int value) {\n    switch (value) {\n      case 2: return LongEnum.LongOne;\n      case 4: return LongEnum.LongTwo;\n      case 1099511627776: return LongEnum.LongBig;\n      case 0: return LongEnum._default;\n      default: throw StateError('Invalid value $value for bit flag enum');\n    }\n  }\n\n  static LongEnum? _createOrNull(int? value) =>\n      value == null ? null : LongEnum.fromValue(value);\n\n  static const fb.Reader<LongEnum> reader = _LongEnumReader();\n}\n\nclass _LongEnumReader extends fb.Reader<LongEnum> {\n  const _LongEnumReader();\n\n  @override\n  int get size => 8;\n\n  @override\n  LongEnum read(fb.BufferContext bc, int offset) =>\n      LongEnum.fromValue(const fb.Uint64Reader().read(bc, offset));\n}\n\nenum AnyTypeId {\n  NONE(0),\n  Monster(1),\n  TestSimpleTableWithEnum(2),\n  MyGame_Example2_Monster(3);\n\n  final int value;\n  const AnyTypeId(this.value);\n\n  factory AnyTypeId.fromValue(int value) {\n    switch (value) {\n      case 0: return AnyTypeId.NONE;\n      case 1: return AnyTypeId.Monster;\n      case 2: return AnyTypeId.TestSimpleTableWithEnum;\n      case 3: return AnyTypeId.MyGame_Example2_Monster;\n      default: throw StateError('Invalid value $value for bit flag enum');\n    }\n  }\n\n  static AnyTypeId? _createOrNull(int? value) =>\n      value == null ? null : AnyTypeId.fromValue(value);\n\n  static const int minValue = 0;\n  static const int maxValue = 3;\n  static const fb.Reader<AnyTypeId> reader = _AnyTypeIdReader();\n}\n\nclass _AnyTypeIdReader extends fb.Reader<AnyTypeId> {\n  const _AnyTypeIdReader();\n\n  @override\n  int get size => 1;\n\n  @override\n  AnyTypeId read(fb.BufferContext bc, int offset) =>\n      AnyTypeId.fromValue(const fb.Uint8Reader().read(bc, offset));\n}\n\nenum AnyUniqueAliasesTypeId {\n  NONE(0),\n  M(1),\n  TS(2),\n  M2(3);\n\n  final int value;\n  const AnyUniqueAliasesTypeId(this.value);\n\n  factory AnyUniqueAliasesTypeId.fromValue(int value) {\n    switch (value) {\n      case 0: return AnyUniqueAliasesTypeId.NONE;\n      case 1: return AnyUniqueAliasesTypeId.M;\n      case 2: return AnyUniqueAliasesTypeId.TS;\n      case 3: return AnyUniqueAliasesTypeId.M2;\n      default: throw StateError('Invalid value $value for bit flag enum');\n    }\n  }\n\n  static AnyUniqueAliasesTypeId? _createOrNull(int? value) =>\n      value == null ? null : AnyUniqueAliasesTypeId.fromValue(value);\n\n  static const int minValue = 0;\n  static const int maxValue = 3;\n  static const fb.Reader<AnyUniqueAliasesTypeId> reader = _AnyUniqueAliasesTypeIdReader();\n}\n\nclass _AnyUniqueAliasesTypeIdReader extends fb.Reader<AnyUniqueAliasesTypeId> {\n  const _AnyUniqueAliasesTypeIdReader();\n\n  @override\n  int get size => 1;\n\n  @override\n  AnyUniqueAliasesTypeId read(fb.BufferContext bc, int offset) =>\n      AnyUniqueAliasesTypeId.fromValue(const fb.Uint8Reader().read(bc, offset));\n}\n\nenum AnyAmbiguousAliasesTypeId {\n  NONE(0),\n  M1(1),\n  M2(2),\n  M3(3);\n\n  final int value;\n  const AnyAmbiguousAliasesTypeId(this.value);\n\n  factory AnyAmbiguousAliasesTypeId.fromValue(int value) {\n    switch (value) {\n      case 0: return AnyAmbiguousAliasesTypeId.NONE;\n      case 1: return AnyAmbiguousAliasesTypeId.M1;\n      case 2: return AnyAmbiguousAliasesTypeId.M2;\n      case 3: return AnyAmbiguousAliasesTypeId.M3;\n      default: throw StateError('Invalid value $value for bit flag enum');\n    }\n  }\n\n  static AnyAmbiguousAliasesTypeId? _createOrNull(int? value) =>\n      value == null ? null : AnyAmbiguousAliasesTypeId.fromValue(value);\n\n  static const int minValue = 0;\n  static const int maxValue = 3;\n  static const fb.Reader<AnyAmbiguousAliasesTypeId> reader = _AnyAmbiguousAliasesTypeIdReader();\n}\n\nclass _AnyAmbiguousAliasesTypeIdReader extends fb.Reader<AnyAmbiguousAliasesTypeId> {\n  const _AnyAmbiguousAliasesTypeIdReader();\n\n  @override\n  int get size => 1;\n\n  @override\n  AnyAmbiguousAliasesTypeId read(fb.BufferContext bc, int offset) =>\n      AnyAmbiguousAliasesTypeId.fromValue(const fb.Uint8Reader().read(bc, offset));\n}\n\nclass Test {\n  Test._(this._bc, this._bcOffset);\n\n  static const fb.Reader<Test> reader = _TestReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  int get a => const fb.Int16Reader().read(_bc, _bcOffset + 0);\n  int get b => const fb.Int8Reader().read(_bc, _bcOffset + 2);\n\n  @override\n  String toString() {\n    return 'Test{a: ${a}, b: ${b}}';\n  }\n\n  TestT unpack() => TestT(\n      a: a,\n      b: b);\n\n  static int pack(fb.Builder fbBuilder, TestT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass TestT implements fb.Packable {\n  int a;\n  int b;\n\n  TestT({\n      required this.a,\n      required this.b});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    fbBuilder.pad(1);\n    fbBuilder.putInt8(b);\n    fbBuilder.putInt16(a);\n    return fbBuilder.offset;\n  }\n\n  @override\n  String toString() {\n    return 'TestT{a: ${a}, b: ${b}}';\n  }\n}\n\nclass _TestReader extends fb.StructReader<Test> {\n  const _TestReader();\n\n  @override\n  int get size => 4;\n\n  @override\n  Test createObject(fb.BufferContext bc, int offset) => \n    Test._(bc, offset);\n}\n\nclass TestBuilder {\n  TestBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  int finish(int a, int b) {\n    fbBuilder.pad(1);\n    fbBuilder.putInt8(b);\n    fbBuilder.putInt16(a);\n    return fbBuilder.offset;\n  }\n\n}\n\nclass TestObjectBuilder extends fb.ObjectBuilder {\n  final int _a;\n  final int _b;\n\n  TestObjectBuilder({\n    required int a,\n    required int b,\n  })\n      : _a = a,\n        _b = b;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    fbBuilder.pad(1);\n    fbBuilder.putInt8(_b);\n    fbBuilder.putInt16(_a);\n    return fbBuilder.offset;\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\nclass TestSimpleTableWithEnum {\n  TestSimpleTableWithEnum._(this._bc, this._bcOffset);\n  factory TestSimpleTableWithEnum(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<TestSimpleTableWithEnum> reader = _TestSimpleTableWithEnumReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  Color get color => Color.fromValue(const fb.Uint8Reader().vTableGet(_bc, _bcOffset, 4, 2));\n\n  @override\n  String toString() {\n    return 'TestSimpleTableWithEnum{color: ${color}}';\n  }\n\n  TestSimpleTableWithEnumT unpack() => TestSimpleTableWithEnumT(\n      color: color);\n\n  static int pack(fb.Builder fbBuilder, TestSimpleTableWithEnumT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass TestSimpleTableWithEnumT implements fb.Packable {\n  Color color;\n\n  TestSimpleTableWithEnumT({\n      this.color = Color.Green});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    fbBuilder.startTable(1);\n    fbBuilder.addUint8(0, color.value);\n    return fbBuilder.endTable();\n  }\n\n  @override\n  String toString() {\n    return 'TestSimpleTableWithEnumT{color: ${color}}';\n  }\n}\n\nclass _TestSimpleTableWithEnumReader extends fb.TableReader<TestSimpleTableWithEnum> {\n  const _TestSimpleTableWithEnumReader();\n\n  @override\n  TestSimpleTableWithEnum createObject(fb.BufferContext bc, int offset) => \n    TestSimpleTableWithEnum._(bc, offset);\n}\n\nclass TestSimpleTableWithEnumBuilder {\n  TestSimpleTableWithEnumBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  void begin() {\n    fbBuilder.startTable(1);\n  }\n\n  int addColor(Color? color) {\n    fbBuilder.addUint8(0, color?.value);\n    return fbBuilder.offset;\n  }\n\n  int finish() {\n    return fbBuilder.endTable();\n  }\n}\n\nclass TestSimpleTableWithEnumObjectBuilder extends fb.ObjectBuilder {\n  final Color? _color;\n\n  TestSimpleTableWithEnumObjectBuilder({\n    Color? color,\n  })\n      : _color = color;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    fbBuilder.startTable(1);\n    fbBuilder.addUint8(0, _color?.value);\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\nclass Vec3 {\n  Vec3._(this._bc, this._bcOffset);\n\n  static const fb.Reader<Vec3> reader = _Vec3Reader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  double get x => const fb.Float32Reader().read(_bc, _bcOffset + 0);\n  double get y => const fb.Float32Reader().read(_bc, _bcOffset + 4);\n  double get z => const fb.Float32Reader().read(_bc, _bcOffset + 8);\n  double get test1 => const fb.Float64Reader().read(_bc, _bcOffset + 16);\n  Color get test2 => Color.fromValue(const fb.Uint8Reader().read(_bc, _bcOffset + 24));\n  Test get test3 => Test.reader.read(_bc, _bcOffset + 26);\n\n  @override\n  String toString() {\n    return 'Vec3{x: ${x}, y: ${y}, z: ${z}, test1: ${test1}, test2: ${test2}, test3: ${test3}}';\n  }\n\n  Vec3T unpack() => Vec3T(\n      x: x,\n      y: y,\n      z: z,\n      test1: test1,\n      test2: test2,\n      test3: test3.unpack());\n\n  static int pack(fb.Builder fbBuilder, Vec3T? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass Vec3T implements fb.Packable {\n  double x;\n  double y;\n  double z;\n  double test1;\n  Color test2;\n  TestT test3;\n\n  Vec3T({\n      required this.x,\n      required this.y,\n      required this.z,\n      required this.test1,\n      required this.test2,\n      required this.test3});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    fbBuilder.pad(2);\n    test3.pack(fbBuilder);\n    fbBuilder.pad(1);\n    fbBuilder.putUint8(test2.value);\n    fbBuilder.putFloat64(test1);\n    fbBuilder.pad(4);\n    fbBuilder.putFloat32(z);\n    fbBuilder.putFloat32(y);\n    fbBuilder.putFloat32(x);\n    return fbBuilder.offset;\n  }\n\n  @override\n  String toString() {\n    return 'Vec3T{x: ${x}, y: ${y}, z: ${z}, test1: ${test1}, test2: ${test2}, test3: ${test3}}';\n  }\n}\n\nclass _Vec3Reader extends fb.StructReader<Vec3> {\n  const _Vec3Reader();\n\n  @override\n  int get size => 32;\n\n  @override\n  Vec3 createObject(fb.BufferContext bc, int offset) => \n    Vec3._(bc, offset);\n}\n\nclass Vec3Builder {\n  Vec3Builder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  int finish(double x, double y, double z, double test1, Color test2, fb.StructBuilder test3) {\n    fbBuilder.pad(2);\n    test3();\n    fbBuilder.pad(1);\n    fbBuilder.putUint8(test2.value);\n    fbBuilder.putFloat64(test1);\n    fbBuilder.pad(4);\n    fbBuilder.putFloat32(z);\n    fbBuilder.putFloat32(y);\n    fbBuilder.putFloat32(x);\n    return fbBuilder.offset;\n  }\n\n}\n\nclass Vec3ObjectBuilder extends fb.ObjectBuilder {\n  final double _x;\n  final double _y;\n  final double _z;\n  final double _test1;\n  final Color _test2;\n  final TestObjectBuilder _test3;\n\n  Vec3ObjectBuilder({\n    required double x,\n    required double y,\n    required double z,\n    required double test1,\n    required Color test2,\n    required TestObjectBuilder test3,\n  })\n      : _x = x,\n        _y = y,\n        _z = z,\n        _test1 = test1,\n        _test2 = test2,\n        _test3 = test3;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    fbBuilder.pad(2);\n    _test3.finish(fbBuilder);\n    fbBuilder.pad(1);\n    fbBuilder.putUint8(_test2.value);\n    fbBuilder.putFloat64(_test1);\n    fbBuilder.pad(4);\n    fbBuilder.putFloat32(_z);\n    fbBuilder.putFloat32(_y);\n    fbBuilder.putFloat32(_x);\n    return fbBuilder.offset;\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\nclass Ability {\n  Ability._(this._bc, this._bcOffset);\n\n  static const fb.Reader<Ability> reader = _AbilityReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  int get id => const fb.Uint32Reader().read(_bc, _bcOffset + 0);\n  int get distance => const fb.Uint32Reader().read(_bc, _bcOffset + 4);\n\n  @override\n  String toString() {\n    return 'Ability{id: ${id}, distance: ${distance}}';\n  }\n\n  AbilityT unpack() => AbilityT(\n      id: id,\n      distance: distance);\n\n  static int pack(fb.Builder fbBuilder, AbilityT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass AbilityT implements fb.Packable {\n  int id;\n  int distance;\n\n  AbilityT({\n      required this.id,\n      required this.distance});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    fbBuilder.putUint32(distance);\n    fbBuilder.putUint32(id);\n    return fbBuilder.offset;\n  }\n\n  @override\n  String toString() {\n    return 'AbilityT{id: ${id}, distance: ${distance}}';\n  }\n}\n\nclass _AbilityReader extends fb.StructReader<Ability> {\n  const _AbilityReader();\n\n  @override\n  int get size => 8;\n\n  @override\n  Ability createObject(fb.BufferContext bc, int offset) => \n    Ability._(bc, offset);\n}\n\nclass AbilityBuilder {\n  AbilityBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  int finish(int id, int distance) {\n    fbBuilder.putUint32(distance);\n    fbBuilder.putUint32(id);\n    return fbBuilder.offset;\n  }\n\n}\n\nclass AbilityObjectBuilder extends fb.ObjectBuilder {\n  final int _id;\n  final int _distance;\n\n  AbilityObjectBuilder({\n    required int id,\n    required int distance,\n  })\n      : _id = id,\n        _distance = distance;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    fbBuilder.putUint32(_distance);\n    fbBuilder.putUint32(_id);\n    return fbBuilder.offset;\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\nclass StructOfStructs {\n  StructOfStructs._(this._bc, this._bcOffset);\n\n  static const fb.Reader<StructOfStructs> reader = _StructOfStructsReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  Ability get a => Ability.reader.read(_bc, _bcOffset + 0);\n  Test get b => Test.reader.read(_bc, _bcOffset + 8);\n  Ability get c => Ability.reader.read(_bc, _bcOffset + 12);\n\n  @override\n  String toString() {\n    return 'StructOfStructs{a: ${a}, b: ${b}, c: ${c}}';\n  }\n\n  StructOfStructsT unpack() => StructOfStructsT(\n      a: a.unpack(),\n      b: b.unpack(),\n      c: c.unpack());\n\n  static int pack(fb.Builder fbBuilder, StructOfStructsT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass StructOfStructsT implements fb.Packable {\n  AbilityT a;\n  TestT b;\n  AbilityT c;\n\n  StructOfStructsT({\n      required this.a,\n      required this.b,\n      required this.c});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    c.pack(fbBuilder);\n    b.pack(fbBuilder);\n    a.pack(fbBuilder);\n    return fbBuilder.offset;\n  }\n\n  @override\n  String toString() {\n    return 'StructOfStructsT{a: ${a}, b: ${b}, c: ${c}}';\n  }\n}\n\nclass _StructOfStructsReader extends fb.StructReader<StructOfStructs> {\n  const _StructOfStructsReader();\n\n  @override\n  int get size => 20;\n\n  @override\n  StructOfStructs createObject(fb.BufferContext bc, int offset) => \n    StructOfStructs._(bc, offset);\n}\n\nclass StructOfStructsBuilder {\n  StructOfStructsBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  int finish(fb.StructBuilder a, fb.StructBuilder b, fb.StructBuilder c) {\n    c();\n    b();\n    a();\n    return fbBuilder.offset;\n  }\n\n}\n\nclass StructOfStructsObjectBuilder extends fb.ObjectBuilder {\n  final AbilityObjectBuilder _a;\n  final TestObjectBuilder _b;\n  final AbilityObjectBuilder _c;\n\n  StructOfStructsObjectBuilder({\n    required AbilityObjectBuilder a,\n    required TestObjectBuilder b,\n    required AbilityObjectBuilder c,\n  })\n      : _a = a,\n        _b = b,\n        _c = c;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    _c.finish(fbBuilder);\n    _b.finish(fbBuilder);\n    _a.finish(fbBuilder);\n    return fbBuilder.offset;\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\nclass StructOfStructsOfStructs {\n  StructOfStructsOfStructs._(this._bc, this._bcOffset);\n\n  static const fb.Reader<StructOfStructsOfStructs> reader = _StructOfStructsOfStructsReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  StructOfStructs get a => StructOfStructs.reader.read(_bc, _bcOffset + 0);\n\n  @override\n  String toString() {\n    return 'StructOfStructsOfStructs{a: ${a}}';\n  }\n\n  StructOfStructsOfStructsT unpack() => StructOfStructsOfStructsT(\n      a: a.unpack());\n\n  static int pack(fb.Builder fbBuilder, StructOfStructsOfStructsT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass StructOfStructsOfStructsT implements fb.Packable {\n  StructOfStructsT a;\n\n  StructOfStructsOfStructsT({\n      required this.a});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    a.pack(fbBuilder);\n    return fbBuilder.offset;\n  }\n\n  @override\n  String toString() {\n    return 'StructOfStructsOfStructsT{a: ${a}}';\n  }\n}\n\nclass _StructOfStructsOfStructsReader extends fb.StructReader<StructOfStructsOfStructs> {\n  const _StructOfStructsOfStructsReader();\n\n  @override\n  int get size => 20;\n\n  @override\n  StructOfStructsOfStructs createObject(fb.BufferContext bc, int offset) => \n    StructOfStructsOfStructs._(bc, offset);\n}\n\nclass StructOfStructsOfStructsBuilder {\n  StructOfStructsOfStructsBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  int finish(fb.StructBuilder a) {\n    a();\n    return fbBuilder.offset;\n  }\n\n}\n\nclass StructOfStructsOfStructsObjectBuilder extends fb.ObjectBuilder {\n  final StructOfStructsObjectBuilder _a;\n\n  StructOfStructsOfStructsObjectBuilder({\n    required StructOfStructsObjectBuilder a,\n  })\n      : _a = a;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    _a.finish(fbBuilder);\n    return fbBuilder.offset;\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\nclass Stat {\n  Stat._(this._bc, this._bcOffset);\n  factory Stat(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<Stat> reader = _StatReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  String? get id => const fb.StringReader().vTableGetNullable(_bc, _bcOffset, 4);\n  int get val => const fb.Int64Reader().vTableGet(_bc, _bcOffset, 6, 0);\n  int get count => const fb.Uint16Reader().vTableGet(_bc, _bcOffset, 8, 0);\n\n  @override\n  String toString() {\n    return 'Stat{id: ${id}, val: ${val}, count: ${count}}';\n  }\n\n  StatT unpack() => StatT(\n      id: id,\n      val: val,\n      count: count);\n\n  static int pack(fb.Builder fbBuilder, StatT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass StatT implements fb.Packable {\n  String? id;\n  int val;\n  int count;\n\n  StatT({\n      this.id,\n      this.val = 0,\n      this.count = 0});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    final int? idOffset = id == null ? null\n        : fbBuilder.writeString(id!);\n    fbBuilder.startTable(3);\n    fbBuilder.addOffset(0, idOffset);\n    fbBuilder.addInt64(1, val);\n    fbBuilder.addUint16(2, count);\n    return fbBuilder.endTable();\n  }\n\n  @override\n  String toString() {\n    return 'StatT{id: ${id}, val: ${val}, count: ${count}}';\n  }\n}\n\nclass _StatReader extends fb.TableReader<Stat> {\n  const _StatReader();\n\n  @override\n  Stat createObject(fb.BufferContext bc, int offset) => \n    Stat._(bc, offset);\n}\n\nclass StatBuilder {\n  StatBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  void begin() {\n    fbBuilder.startTable(3);\n  }\n\n  int addIdOffset(int? offset) {\n    fbBuilder.addOffset(0, offset);\n    return fbBuilder.offset;\n  }\n  int addVal(int? val) {\n    fbBuilder.addInt64(1, val);\n    return fbBuilder.offset;\n  }\n  int addCount(int? count) {\n    fbBuilder.addUint16(2, count);\n    return fbBuilder.offset;\n  }\n\n  int finish() {\n    return fbBuilder.endTable();\n  }\n}\n\nclass StatObjectBuilder extends fb.ObjectBuilder {\n  final String? _id;\n  final int? _val;\n  final int? _count;\n\n  StatObjectBuilder({\n    String? id,\n    int? val,\n    int? count,\n  })\n      : _id = id,\n        _val = val,\n        _count = count;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    final int? idOffset = _id == null ? null\n        : fbBuilder.writeString(_id!);\n    fbBuilder.startTable(3);\n    fbBuilder.addOffset(0, idOffset);\n    fbBuilder.addInt64(1, _val);\n    fbBuilder.addUint16(2, _count);\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\nclass Referrable {\n  Referrable._(this._bc, this._bcOffset);\n  factory Referrable(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<Referrable> reader = _ReferrableReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  int get id => const fb.Uint64Reader().vTableGet(_bc, _bcOffset, 4, 0);\n\n  @override\n  String toString() {\n    return 'Referrable{id: ${id}}';\n  }\n\n  ReferrableT unpack() => ReferrableT(\n      id: id);\n\n  static int pack(fb.Builder fbBuilder, ReferrableT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass ReferrableT implements fb.Packable {\n  int id;\n\n  ReferrableT({\n      this.id = 0});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    fbBuilder.startTable(1);\n    fbBuilder.addUint64(0, id);\n    return fbBuilder.endTable();\n  }\n\n  @override\n  String toString() {\n    return 'ReferrableT{id: ${id}}';\n  }\n}\n\nclass _ReferrableReader extends fb.TableReader<Referrable> {\n  const _ReferrableReader();\n\n  @override\n  Referrable createObject(fb.BufferContext bc, int offset) => \n    Referrable._(bc, offset);\n}\n\nclass ReferrableBuilder {\n  ReferrableBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  void begin() {\n    fbBuilder.startTable(1);\n  }\n\n  int addId(int? id) {\n    fbBuilder.addUint64(0, id);\n    return fbBuilder.offset;\n  }\n\n  int finish() {\n    return fbBuilder.endTable();\n  }\n}\n\nclass ReferrableObjectBuilder extends fb.ObjectBuilder {\n  final int? _id;\n\n  ReferrableObjectBuilder({\n    int? id,\n  })\n      : _id = id;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    fbBuilder.startTable(1);\n    fbBuilder.addUint64(0, _id);\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n///  an example documentation comment: \"monster object\"\nclass Monster {\n  Monster._(this._bc, this._bcOffset);\n  factory Monster(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<Monster> reader = _MonsterReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  Vec3? get pos => Vec3.reader.vTableGetNullable(_bc, _bcOffset, 4);\n  int get mana => const fb.Int16Reader().vTableGet(_bc, _bcOffset, 6, 150);\n  int get hp => const fb.Int16Reader().vTableGet(_bc, _bcOffset, 8, 100);\n  String? get name => const fb.StringReader().vTableGetNullable(_bc, _bcOffset, 10);\n  List<int>? get inventory => const fb.Uint8ListReader().vTableGetNullable(_bc, _bcOffset, 14);\n  Color get color => Color.fromValue(const fb.Uint8Reader().vTableGet(_bc, _bcOffset, 16, 8));\n  AnyTypeId? get testType => AnyTypeId._createOrNull(const fb.Uint8Reader().vTableGetNullable(_bc, _bcOffset, 18));\n  dynamic get test {\n    switch (testType?.value) {\n      case 1: return Monster.reader.vTableGetNullable(_bc, _bcOffset, 20);\n      case 2: return TestSimpleTableWithEnum.reader.vTableGetNullable(_bc, _bcOffset, 20);\n      case 3: return my_game_example2.Monster.reader.vTableGetNullable(_bc, _bcOffset, 20);\n      default: return null;\n    }\n  }\n  List<Test>? get test4 => const fb.ListReader<Test>(Test.reader).vTableGetNullable(_bc, _bcOffset, 22);\n  List<String>? get testarrayofstring => const fb.ListReader<String>(fb.StringReader()).vTableGetNullable(_bc, _bcOffset, 24);\n  ///  an example documentation comment: this will end up in the generated code\n  ///  multiline too\n  List<Monster>? get testarrayoftables => const fb.ListReader<Monster>(Monster.reader).vTableGetNullable(_bc, _bcOffset, 26);\n  Monster? get enemy => Monster.reader.vTableGetNullable(_bc, _bcOffset, 28);\n  List<int>? get testnestedflatbuffer => const fb.Uint8ListReader().vTableGetNullable(_bc, _bcOffset, 30);\n  Stat? get testempty => Stat.reader.vTableGetNullable(_bc, _bcOffset, 32);\n  bool get testbool => const fb.BoolReader().vTableGet(_bc, _bcOffset, 34, false);\n  int get testhashs32Fnv1 => const fb.Int32Reader().vTableGet(_bc, _bcOffset, 36, 0);\n  int get testhashu32Fnv1 => const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 38, 0);\n  int get testhashs64Fnv1 => const fb.Int64Reader().vTableGet(_bc, _bcOffset, 40, 0);\n  int get testhashu64Fnv1 => const fb.Uint64Reader().vTableGet(_bc, _bcOffset, 42, 0);\n  int get testhashs32Fnv1a => const fb.Int32Reader().vTableGet(_bc, _bcOffset, 44, 0);\n  int get testhashu32Fnv1a => const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 46, 0);\n  int get testhashs64Fnv1a => const fb.Int64Reader().vTableGet(_bc, _bcOffset, 48, 0);\n  int get testhashu64Fnv1a => const fb.Uint64Reader().vTableGet(_bc, _bcOffset, 50, 0);\n  List<bool>? get testarrayofbools => const fb.ListReader<bool>(fb.BoolReader()).vTableGetNullable(_bc, _bcOffset, 52);\n  double get testf => const fb.Float32Reader().vTableGet(_bc, _bcOffset, 54, 3.14159);\n  double get testf2 => const fb.Float32Reader().vTableGet(_bc, _bcOffset, 56, 3.0);\n  double get testf3 => const fb.Float32Reader().vTableGet(_bc, _bcOffset, 58, 0.0);\n  List<String>? get testarrayofstring2 => const fb.ListReader<String>(fb.StringReader()).vTableGetNullable(_bc, _bcOffset, 60);\n  List<Ability>? get testarrayofsortedstruct => const fb.ListReader<Ability>(Ability.reader).vTableGetNullable(_bc, _bcOffset, 62);\n  List<int>? get flex => const fb.Uint8ListReader().vTableGetNullable(_bc, _bcOffset, 64);\n  List<Test>? get test5 => const fb.ListReader<Test>(Test.reader).vTableGetNullable(_bc, _bcOffset, 66);\n  List<int>? get vectorOfLongs => const fb.ListReader<int>(fb.Int64Reader()).vTableGetNullable(_bc, _bcOffset, 68);\n  List<double>? get vectorOfDoubles => const fb.ListReader<double>(fb.Float64Reader()).vTableGetNullable(_bc, _bcOffset, 70);\n  my_game.InParentNamespace? get parentNamespaceTest => my_game.InParentNamespace.reader.vTableGetNullable(_bc, _bcOffset, 72);\n  List<Referrable>? get vectorOfReferrables => const fb.ListReader<Referrable>(Referrable.reader).vTableGetNullable(_bc, _bcOffset, 74);\n  int get singleWeakReference => const fb.Uint64Reader().vTableGet(_bc, _bcOffset, 76, 0);\n  List<int>? get vectorOfWeakReferences => const fb.ListReader<int>(fb.Uint64Reader()).vTableGetNullable(_bc, _bcOffset, 78);\n  List<Referrable>? get vectorOfStrongReferrables => const fb.ListReader<Referrable>(Referrable.reader).vTableGetNullable(_bc, _bcOffset, 80);\n  int get coOwningReference => const fb.Uint64Reader().vTableGet(_bc, _bcOffset, 82, 0);\n  List<int>? get vectorOfCoOwningReferences => const fb.ListReader<int>(fb.Uint64Reader()).vTableGetNullable(_bc, _bcOffset, 84);\n  int get nonOwningReference => const fb.Uint64Reader().vTableGet(_bc, _bcOffset, 86, 0);\n  List<int>? get vectorOfNonOwningReferences => const fb.ListReader<int>(fb.Uint64Reader()).vTableGetNullable(_bc, _bcOffset, 88);\n  AnyUniqueAliasesTypeId? get anyUniqueType => AnyUniqueAliasesTypeId._createOrNull(const fb.Uint8Reader().vTableGetNullable(_bc, _bcOffset, 90));\n  dynamic get anyUnique {\n    switch (anyUniqueType?.value) {\n      case 1: return Monster.reader.vTableGetNullable(_bc, _bcOffset, 92);\n      case 2: return TestSimpleTableWithEnum.reader.vTableGetNullable(_bc, _bcOffset, 92);\n      case 3: return my_game_example2.Monster.reader.vTableGetNullable(_bc, _bcOffset, 92);\n      default: return null;\n    }\n  }\n  AnyAmbiguousAliasesTypeId? get anyAmbiguousType => AnyAmbiguousAliasesTypeId._createOrNull(const fb.Uint8Reader().vTableGetNullable(_bc, _bcOffset, 94));\n  dynamic get anyAmbiguous {\n    switch (anyAmbiguousType?.value) {\n      case 1: return Monster.reader.vTableGetNullable(_bc, _bcOffset, 96);\n      case 2: return Monster.reader.vTableGetNullable(_bc, _bcOffset, 96);\n      case 3: return Monster.reader.vTableGetNullable(_bc, _bcOffset, 96);\n      default: return null;\n    }\n  }\n  List<Color>? get vectorOfEnums => const fb.ListReader<Color>(Color.reader).vTableGetNullable(_bc, _bcOffset, 98);\n  Race get signedEnum => Race.fromValue(const fb.Int8Reader().vTableGet(_bc, _bcOffset, 100, -1));\n  List<int>? get testrequirednestedflatbuffer => const fb.Uint8ListReader().vTableGetNullable(_bc, _bcOffset, 102);\n  List<Stat>? get scalarKeySortedTables => const fb.ListReader<Stat>(Stat.reader).vTableGetNullable(_bc, _bcOffset, 104);\n  Test? get nativeInline => Test.reader.vTableGetNullable(_bc, _bcOffset, 106);\n  LongEnum get longEnumNonEnumDefault => LongEnum.fromValue(const fb.Uint64Reader().vTableGet(_bc, _bcOffset, 108, 0));\n  LongEnum get longEnumNormalDefault => LongEnum.fromValue(const fb.Uint64Reader().vTableGet(_bc, _bcOffset, 110, 2));\n  double get nanDefault => const fb.Float32Reader().vTableGet(_bc, _bcOffset, 112, double.nan);\n  double get infDefault => const fb.Float32Reader().vTableGet(_bc, _bcOffset, 114, double.infinity);\n  double get positiveInfDefault => const fb.Float32Reader().vTableGet(_bc, _bcOffset, 116, double.infinity);\n  double get infinityDefault => const fb.Float32Reader().vTableGet(_bc, _bcOffset, 118, double.infinity);\n  double get positiveInfinityDefault => const fb.Float32Reader().vTableGet(_bc, _bcOffset, 120, double.infinity);\n  double get negativeInfDefault => const fb.Float32Reader().vTableGet(_bc, _bcOffset, 122, double.negativeInfinity);\n  double get negativeInfinityDefault => const fb.Float32Reader().vTableGet(_bc, _bcOffset, 124, double.negativeInfinity);\n  double get doubleInfDefault => const fb.Float64Reader().vTableGet(_bc, _bcOffset, 126, double.infinity);\n\n  @override\n  String toString() {\n    return 'Monster{pos: ${pos}, mana: ${mana}, hp: ${hp}, name: ${name}, inventory: ${inventory}, color: ${color}, testType: ${testType}, test: ${test}, test4: ${test4}, testarrayofstring: ${testarrayofstring}, testarrayoftables: ${testarrayoftables}, enemy: ${enemy}, testnestedflatbuffer: ${testnestedflatbuffer}, testempty: ${testempty}, testbool: ${testbool}, testhashs32Fnv1: ${testhashs32Fnv1}, testhashu32Fnv1: ${testhashu32Fnv1}, testhashs64Fnv1: ${testhashs64Fnv1}, testhashu64Fnv1: ${testhashu64Fnv1}, testhashs32Fnv1a: ${testhashs32Fnv1a}, testhashu32Fnv1a: ${testhashu32Fnv1a}, testhashs64Fnv1a: ${testhashs64Fnv1a}, testhashu64Fnv1a: ${testhashu64Fnv1a}, testarrayofbools: ${testarrayofbools}, testf: ${testf}, testf2: ${testf2}, testf3: ${testf3}, testarrayofstring2: ${testarrayofstring2}, testarrayofsortedstruct: ${testarrayofsortedstruct}, flex: ${flex}, test5: ${test5}, vectorOfLongs: ${vectorOfLongs}, vectorOfDoubles: ${vectorOfDoubles}, parentNamespaceTest: ${parentNamespaceTest}, vectorOfReferrables: ${vectorOfReferrables}, singleWeakReference: ${singleWeakReference}, vectorOfWeakReferences: ${vectorOfWeakReferences}, vectorOfStrongReferrables: ${vectorOfStrongReferrables}, coOwningReference: ${coOwningReference}, vectorOfCoOwningReferences: ${vectorOfCoOwningReferences}, nonOwningReference: ${nonOwningReference}, vectorOfNonOwningReferences: ${vectorOfNonOwningReferences}, anyUniqueType: ${anyUniqueType}, anyUnique: ${anyUnique}, anyAmbiguousType: ${anyAmbiguousType}, anyAmbiguous: ${anyAmbiguous}, vectorOfEnums: ${vectorOfEnums}, signedEnum: ${signedEnum}, testrequirednestedflatbuffer: ${testrequirednestedflatbuffer}, scalarKeySortedTables: ${scalarKeySortedTables}, nativeInline: ${nativeInline}, longEnumNonEnumDefault: ${longEnumNonEnumDefault}, longEnumNormalDefault: ${longEnumNormalDefault}, nanDefault: ${nanDefault}, infDefault: ${infDefault}, positiveInfDefault: ${positiveInfDefault}, infinityDefault: ${infinityDefault}, positiveInfinityDefault: ${positiveInfinityDefault}, negativeInfDefault: ${negativeInfDefault}, negativeInfinityDefault: ${negativeInfinityDefault}, doubleInfDefault: ${doubleInfDefault}}';\n  }\n\n  MonsterT unpack() => MonsterT(\n      pos: pos?.unpack(),\n      mana: mana,\n      hp: hp,\n      name: name,\n      inventory: inventory?.toList(),\n      color: color,\n      testType: testType,\n      test: test?.unpack(),\n      test4: test4?.map((e) => e.unpack()).toList(),\n      testarrayofstring: testarrayofstring?.toList(),\n      testarrayoftables: testarrayoftables?.map((e) => e.unpack()).toList(),\n      enemy: enemy?.unpack(),\n      testnestedflatbuffer: testnestedflatbuffer?.toList(),\n      testempty: testempty?.unpack(),\n      testbool: testbool,\n      testhashs32Fnv1: testhashs32Fnv1,\n      testhashu32Fnv1: testhashu32Fnv1,\n      testhashs64Fnv1: testhashs64Fnv1,\n      testhashu64Fnv1: testhashu64Fnv1,\n      testhashs32Fnv1a: testhashs32Fnv1a,\n      testhashu32Fnv1a: testhashu32Fnv1a,\n      testhashs64Fnv1a: testhashs64Fnv1a,\n      testhashu64Fnv1a: testhashu64Fnv1a,\n      testarrayofbools: testarrayofbools?.toList(),\n      testf: testf,\n      testf2: testf2,\n      testf3: testf3,\n      testarrayofstring2: testarrayofstring2?.toList(),\n      testarrayofsortedstruct: testarrayofsortedstruct?.map((e) => e.unpack()).toList(),\n      flex: flex?.toList(),\n      test5: test5?.map((e) => e.unpack()).toList(),\n      vectorOfLongs: vectorOfLongs?.toList(),\n      vectorOfDoubles: vectorOfDoubles?.toList(),\n      parentNamespaceTest: parentNamespaceTest?.unpack(),\n      vectorOfReferrables: vectorOfReferrables?.map((e) => e.unpack()).toList(),\n      singleWeakReference: singleWeakReference,\n      vectorOfWeakReferences: vectorOfWeakReferences?.toList(),\n      vectorOfStrongReferrables: vectorOfStrongReferrables?.map((e) => e.unpack()).toList(),\n      coOwningReference: coOwningReference,\n      vectorOfCoOwningReferences: vectorOfCoOwningReferences?.toList(),\n      nonOwningReference: nonOwningReference,\n      vectorOfNonOwningReferences: vectorOfNonOwningReferences?.toList(),\n      anyUniqueType: anyUniqueType,\n      anyUnique: anyUnique?.unpack(),\n      anyAmbiguousType: anyAmbiguousType,\n      anyAmbiguous: anyAmbiguous?.unpack(),\n      vectorOfEnums: vectorOfEnums?.toList(),\n      signedEnum: signedEnum,\n      testrequirednestedflatbuffer: testrequirednestedflatbuffer?.toList(),\n      scalarKeySortedTables: scalarKeySortedTables?.map((e) => e.unpack()).toList(),\n      nativeInline: nativeInline?.unpack(),\n      longEnumNonEnumDefault: longEnumNonEnumDefault,\n      longEnumNormalDefault: longEnumNormalDefault,\n      nanDefault: nanDefault,\n      infDefault: infDefault,\n      positiveInfDefault: positiveInfDefault,\n      infinityDefault: infinityDefault,\n      positiveInfinityDefault: positiveInfinityDefault,\n      negativeInfDefault: negativeInfDefault,\n      negativeInfinityDefault: negativeInfinityDefault,\n      doubleInfDefault: doubleInfDefault);\n\n  static int pack(fb.Builder fbBuilder, MonsterT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\n///  an example documentation comment: \"monster object\"\nclass MonsterT implements fb.Packable {\n  Vec3T? pos;\n  int mana;\n  int hp;\n  String? name;\n  List<int>? inventory;\n  Color color;\n  AnyTypeId? testType;\n  dynamic test;\n  List<TestT>? test4;\n  List<String>? testarrayofstring;\n  ///  an example documentation comment: this will end up in the generated code\n  ///  multiline too\n  List<MonsterT>? testarrayoftables;\n  MonsterT? enemy;\n  List<int>? testnestedflatbuffer;\n  StatT? testempty;\n  bool testbool;\n  int testhashs32Fnv1;\n  int testhashu32Fnv1;\n  int testhashs64Fnv1;\n  int testhashu64Fnv1;\n  int testhashs32Fnv1a;\n  int testhashu32Fnv1a;\n  int testhashs64Fnv1a;\n  int testhashu64Fnv1a;\n  List<bool>? testarrayofbools;\n  double testf;\n  double testf2;\n  double testf3;\n  List<String>? testarrayofstring2;\n  List<AbilityT>? testarrayofsortedstruct;\n  List<int>? flex;\n  List<TestT>? test5;\n  List<int>? vectorOfLongs;\n  List<double>? vectorOfDoubles;\n  my_game.InParentNamespaceT? parentNamespaceTest;\n  List<ReferrableT>? vectorOfReferrables;\n  int singleWeakReference;\n  List<int>? vectorOfWeakReferences;\n  List<ReferrableT>? vectorOfStrongReferrables;\n  int coOwningReference;\n  List<int>? vectorOfCoOwningReferences;\n  int nonOwningReference;\n  List<int>? vectorOfNonOwningReferences;\n  AnyUniqueAliasesTypeId? anyUniqueType;\n  dynamic anyUnique;\n  AnyAmbiguousAliasesTypeId? anyAmbiguousType;\n  dynamic anyAmbiguous;\n  List<Color>? vectorOfEnums;\n  Race signedEnum;\n  List<int>? testrequirednestedflatbuffer;\n  List<StatT>? scalarKeySortedTables;\n  TestT? nativeInline;\n  LongEnum longEnumNonEnumDefault;\n  LongEnum longEnumNormalDefault;\n  double nanDefault;\n  double infDefault;\n  double positiveInfDefault;\n  double infinityDefault;\n  double positiveInfinityDefault;\n  double negativeInfDefault;\n  double negativeInfinityDefault;\n  double doubleInfDefault;\n\n  MonsterT({\n      this.pos,\n      this.mana = 150,\n      this.hp = 100,\n      this.name,\n      this.inventory,\n      this.color = Color.Blue,\n      this.testType,\n      this.test,\n      this.test4,\n      this.testarrayofstring,\n      this.testarrayoftables,\n      this.enemy,\n      this.testnestedflatbuffer,\n      this.testempty,\n      this.testbool = false,\n      this.testhashs32Fnv1 = 0,\n      this.testhashu32Fnv1 = 0,\n      this.testhashs64Fnv1 = 0,\n      this.testhashu64Fnv1 = 0,\n      this.testhashs32Fnv1a = 0,\n      this.testhashu32Fnv1a = 0,\n      this.testhashs64Fnv1a = 0,\n      this.testhashu64Fnv1a = 0,\n      this.testarrayofbools,\n      this.testf = 3.14159,\n      this.testf2 = 3.0,\n      this.testf3 = 0.0,\n      this.testarrayofstring2,\n      this.testarrayofsortedstruct,\n      this.flex,\n      this.test5,\n      this.vectorOfLongs,\n      this.vectorOfDoubles,\n      this.parentNamespaceTest,\n      this.vectorOfReferrables,\n      this.singleWeakReference = 0,\n      this.vectorOfWeakReferences,\n      this.vectorOfStrongReferrables,\n      this.coOwningReference = 0,\n      this.vectorOfCoOwningReferences,\n      this.nonOwningReference = 0,\n      this.vectorOfNonOwningReferences,\n      this.anyUniqueType,\n      this.anyUnique,\n      this.anyAmbiguousType,\n      this.anyAmbiguous,\n      this.vectorOfEnums,\n      this.signedEnum = Race.None,\n      this.testrequirednestedflatbuffer,\n      this.scalarKeySortedTables,\n      this.nativeInline,\n      this.longEnumNonEnumDefault = LongEnum._default,\n      this.longEnumNormalDefault = LongEnum.LongOne,\n      this.nanDefault = double.nan,\n      this.infDefault = double.infinity,\n      this.positiveInfDefault = double.infinity,\n      this.infinityDefault = double.infinity,\n      this.positiveInfinityDefault = double.infinity,\n      this.negativeInfDefault = double.negativeInfinity,\n      this.negativeInfinityDefault = double.negativeInfinity,\n      this.doubleInfDefault = double.infinity});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    final int? nameOffset = name == null ? null\n        : fbBuilder.writeString(name!);\n    final int? inventoryOffset = inventory == null ? null\n        : fbBuilder.writeListUint8(inventory!);\n    final int? testOffset = test?.pack(fbBuilder);\n    int? test4Offset;\n    if (test4 != null) {\n      for (var e in test4!.reversed) { e.pack(fbBuilder); }\n      test4Offset = fbBuilder.endStructVector(test4!.length);\n    }\n    final int? testarrayofstringOffset = testarrayofstring == null ? null\n        : fbBuilder.writeList(testarrayofstring!.map(fbBuilder.writeString).toList());\n    final int? testarrayoftablesOffset = testarrayoftables == null ? null\n        : fbBuilder.writeList(testarrayoftables!.map((b) => b.pack(fbBuilder)).toList());\n    final int? enemyOffset = enemy?.pack(fbBuilder);\n    final int? testnestedflatbufferOffset = testnestedflatbuffer == null ? null\n        : fbBuilder.writeListUint8(testnestedflatbuffer!);\n    final int? testemptyOffset = testempty?.pack(fbBuilder);\n    final int? testarrayofboolsOffset = testarrayofbools == null ? null\n        : fbBuilder.writeListBool(testarrayofbools!);\n    final int? testarrayofstring2Offset = testarrayofstring2 == null ? null\n        : fbBuilder.writeList(testarrayofstring2!.map(fbBuilder.writeString).toList());\n    int? testarrayofsortedstructOffset;\n    if (testarrayofsortedstruct != null) {\n      for (var e in testarrayofsortedstruct!.reversed) { e.pack(fbBuilder); }\n      testarrayofsortedstructOffset = fbBuilder.endStructVector(testarrayofsortedstruct!.length);\n    }\n    final int? flexOffset = flex == null ? null\n        : fbBuilder.writeListUint8(flex!);\n    int? test5Offset;\n    if (test5 != null) {\n      for (var e in test5!.reversed) { e.pack(fbBuilder); }\n      test5Offset = fbBuilder.endStructVector(test5!.length);\n    }\n    final int? vectorOfLongsOffset = vectorOfLongs == null ? null\n        : fbBuilder.writeListInt64(vectorOfLongs!);\n    final int? vectorOfDoublesOffset = vectorOfDoubles == null ? null\n        : fbBuilder.writeListFloat64(vectorOfDoubles!);\n    final int? parentNamespaceTestOffset = parentNamespaceTest?.pack(fbBuilder);\n    final int? vectorOfReferrablesOffset = vectorOfReferrables == null ? null\n        : fbBuilder.writeList(vectorOfReferrables!.map((b) => b.pack(fbBuilder)).toList());\n    final int? vectorOfWeakReferencesOffset = vectorOfWeakReferences == null ? null\n        : fbBuilder.writeListUint64(vectorOfWeakReferences!);\n    final int? vectorOfStrongReferrablesOffset = vectorOfStrongReferrables == null ? null\n        : fbBuilder.writeList(vectorOfStrongReferrables!.map((b) => b.pack(fbBuilder)).toList());\n    final int? vectorOfCoOwningReferencesOffset = vectorOfCoOwningReferences == null ? null\n        : fbBuilder.writeListUint64(vectorOfCoOwningReferences!);\n    final int? vectorOfNonOwningReferencesOffset = vectorOfNonOwningReferences == null ? null\n        : fbBuilder.writeListUint64(vectorOfNonOwningReferences!);\n    final int? anyUniqueOffset = anyUnique?.pack(fbBuilder);\n    final int? anyAmbiguousOffset = anyAmbiguous?.pack(fbBuilder);\n    final int? vectorOfEnumsOffset = vectorOfEnums == null ? null\n        : fbBuilder.writeListUint8(vectorOfEnums!.map((f) => f.value).toList());\n    final int? testrequirednestedflatbufferOffset = testrequirednestedflatbuffer == null ? null\n        : fbBuilder.writeListUint8(testrequirednestedflatbuffer!);\n    final int? scalarKeySortedTablesOffset = scalarKeySortedTables == null ? null\n        : fbBuilder.writeList(scalarKeySortedTables!.map((b) => b.pack(fbBuilder)).toList());\n    fbBuilder.startTable(62);\n    if (pos != null) {\n      fbBuilder.addStruct(0, pos!.pack(fbBuilder));\n    }\n    fbBuilder.addInt16(1, mana);\n    fbBuilder.addInt16(2, hp);\n    fbBuilder.addOffset(3, nameOffset);\n    fbBuilder.addOffset(5, inventoryOffset);\n    fbBuilder.addUint8(6, color.value);\n    fbBuilder.addUint8(7, testType?.value);\n    fbBuilder.addOffset(8, testOffset);\n    fbBuilder.addOffset(9, test4Offset);\n    fbBuilder.addOffset(10, testarrayofstringOffset);\n    fbBuilder.addOffset(11, testarrayoftablesOffset);\n    fbBuilder.addOffset(12, enemyOffset);\n    fbBuilder.addOffset(13, testnestedflatbufferOffset);\n    fbBuilder.addOffset(14, testemptyOffset);\n    fbBuilder.addBool(15, testbool);\n    fbBuilder.addInt32(16, testhashs32Fnv1);\n    fbBuilder.addUint32(17, testhashu32Fnv1);\n    fbBuilder.addInt64(18, testhashs64Fnv1);\n    fbBuilder.addUint64(19, testhashu64Fnv1);\n    fbBuilder.addInt32(20, testhashs32Fnv1a);\n    fbBuilder.addUint32(21, testhashu32Fnv1a);\n    fbBuilder.addInt64(22, testhashs64Fnv1a);\n    fbBuilder.addUint64(23, testhashu64Fnv1a);\n    fbBuilder.addOffset(24, testarrayofboolsOffset);\n    fbBuilder.addFloat32(25, testf);\n    fbBuilder.addFloat32(26, testf2);\n    fbBuilder.addFloat32(27, testf3);\n    fbBuilder.addOffset(28, testarrayofstring2Offset);\n    fbBuilder.addOffset(29, testarrayofsortedstructOffset);\n    fbBuilder.addOffset(30, flexOffset);\n    fbBuilder.addOffset(31, test5Offset);\n    fbBuilder.addOffset(32, vectorOfLongsOffset);\n    fbBuilder.addOffset(33, vectorOfDoublesOffset);\n    fbBuilder.addOffset(34, parentNamespaceTestOffset);\n    fbBuilder.addOffset(35, vectorOfReferrablesOffset);\n    fbBuilder.addUint64(36, singleWeakReference);\n    fbBuilder.addOffset(37, vectorOfWeakReferencesOffset);\n    fbBuilder.addOffset(38, vectorOfStrongReferrablesOffset);\n    fbBuilder.addUint64(39, coOwningReference);\n    fbBuilder.addOffset(40, vectorOfCoOwningReferencesOffset);\n    fbBuilder.addUint64(41, nonOwningReference);\n    fbBuilder.addOffset(42, vectorOfNonOwningReferencesOffset);\n    fbBuilder.addUint8(43, anyUniqueType?.value);\n    fbBuilder.addOffset(44, anyUniqueOffset);\n    fbBuilder.addUint8(45, anyAmbiguousType?.value);\n    fbBuilder.addOffset(46, anyAmbiguousOffset);\n    fbBuilder.addOffset(47, vectorOfEnumsOffset);\n    fbBuilder.addInt8(48, signedEnum.value);\n    fbBuilder.addOffset(49, testrequirednestedflatbufferOffset);\n    fbBuilder.addOffset(50, scalarKeySortedTablesOffset);\n    if (nativeInline != null) {\n      fbBuilder.addStruct(51, nativeInline!.pack(fbBuilder));\n    }\n    fbBuilder.addUint64(52, longEnumNonEnumDefault.value);\n    fbBuilder.addUint64(53, longEnumNormalDefault.value);\n    fbBuilder.addFloat32(54, nanDefault);\n    fbBuilder.addFloat32(55, infDefault);\n    fbBuilder.addFloat32(56, positiveInfDefault);\n    fbBuilder.addFloat32(57, infinityDefault);\n    fbBuilder.addFloat32(58, positiveInfinityDefault);\n    fbBuilder.addFloat32(59, negativeInfDefault);\n    fbBuilder.addFloat32(60, negativeInfinityDefault);\n    fbBuilder.addFloat64(61, doubleInfDefault);\n    return fbBuilder.endTable();\n  }\n\n  @override\n  String toString() {\n    return 'MonsterT{pos: ${pos}, mana: ${mana}, hp: ${hp}, name: ${name}, inventory: ${inventory}, color: ${color}, testType: ${testType}, test: ${test}, test4: ${test4}, testarrayofstring: ${testarrayofstring}, testarrayoftables: ${testarrayoftables}, enemy: ${enemy}, testnestedflatbuffer: ${testnestedflatbuffer}, testempty: ${testempty}, testbool: ${testbool}, testhashs32Fnv1: ${testhashs32Fnv1}, testhashu32Fnv1: ${testhashu32Fnv1}, testhashs64Fnv1: ${testhashs64Fnv1}, testhashu64Fnv1: ${testhashu64Fnv1}, testhashs32Fnv1a: ${testhashs32Fnv1a}, testhashu32Fnv1a: ${testhashu32Fnv1a}, testhashs64Fnv1a: ${testhashs64Fnv1a}, testhashu64Fnv1a: ${testhashu64Fnv1a}, testarrayofbools: ${testarrayofbools}, testf: ${testf}, testf2: ${testf2}, testf3: ${testf3}, testarrayofstring2: ${testarrayofstring2}, testarrayofsortedstruct: ${testarrayofsortedstruct}, flex: ${flex}, test5: ${test5}, vectorOfLongs: ${vectorOfLongs}, vectorOfDoubles: ${vectorOfDoubles}, parentNamespaceTest: ${parentNamespaceTest}, vectorOfReferrables: ${vectorOfReferrables}, singleWeakReference: ${singleWeakReference}, vectorOfWeakReferences: ${vectorOfWeakReferences}, vectorOfStrongReferrables: ${vectorOfStrongReferrables}, coOwningReference: ${coOwningReference}, vectorOfCoOwningReferences: ${vectorOfCoOwningReferences}, nonOwningReference: ${nonOwningReference}, vectorOfNonOwningReferences: ${vectorOfNonOwningReferences}, anyUniqueType: ${anyUniqueType}, anyUnique: ${anyUnique}, anyAmbiguousType: ${anyAmbiguousType}, anyAmbiguous: ${anyAmbiguous}, vectorOfEnums: ${vectorOfEnums}, signedEnum: ${signedEnum}, testrequirednestedflatbuffer: ${testrequirednestedflatbuffer}, scalarKeySortedTables: ${scalarKeySortedTables}, nativeInline: ${nativeInline}, longEnumNonEnumDefault: ${longEnumNonEnumDefault}, longEnumNormalDefault: ${longEnumNormalDefault}, nanDefault: ${nanDefault}, infDefault: ${infDefault}, positiveInfDefault: ${positiveInfDefault}, infinityDefault: ${infinityDefault}, positiveInfinityDefault: ${positiveInfinityDefault}, negativeInfDefault: ${negativeInfDefault}, negativeInfinityDefault: ${negativeInfinityDefault}, doubleInfDefault: ${doubleInfDefault}}';\n  }\n}\n\nclass _MonsterReader extends fb.TableReader<Monster> {\n  const _MonsterReader();\n\n  @override\n  Monster createObject(fb.BufferContext bc, int offset) => \n    Monster._(bc, offset);\n}\n\nclass MonsterBuilder {\n  MonsterBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  void begin() {\n    fbBuilder.startTable(62);\n  }\n\n  int addPos(int offset) {\n    fbBuilder.addStruct(0, offset);\n    return fbBuilder.offset;\n  }\n  int addMana(int? mana) {\n    fbBuilder.addInt16(1, mana);\n    return fbBuilder.offset;\n  }\n  int addHp(int? hp) {\n    fbBuilder.addInt16(2, hp);\n    return fbBuilder.offset;\n  }\n  int addNameOffset(int? offset) {\n    fbBuilder.addOffset(3, offset);\n    return fbBuilder.offset;\n  }\n  int addInventoryOffset(int? offset) {\n    fbBuilder.addOffset(5, offset);\n    return fbBuilder.offset;\n  }\n  int addColor(Color? color) {\n    fbBuilder.addUint8(6, color?.value);\n    return fbBuilder.offset;\n  }\n  int addTestType(AnyTypeId? testType) {\n    fbBuilder.addUint8(7, testType?.value);\n    return fbBuilder.offset;\n  }\n  int addTestOffset(int? offset) {\n    fbBuilder.addOffset(8, offset);\n    return fbBuilder.offset;\n  }\n  int addTest4Offset(int? offset) {\n    fbBuilder.addOffset(9, offset);\n    return fbBuilder.offset;\n  }\n  int addTestarrayofstringOffset(int? offset) {\n    fbBuilder.addOffset(10, offset);\n    return fbBuilder.offset;\n  }\n  int addTestarrayoftablesOffset(int? offset) {\n    fbBuilder.addOffset(11, offset);\n    return fbBuilder.offset;\n  }\n  int addEnemyOffset(int? offset) {\n    fbBuilder.addOffset(12, offset);\n    return fbBuilder.offset;\n  }\n  int addTestnestedflatbufferOffset(int? offset) {\n    fbBuilder.addOffset(13, offset);\n    return fbBuilder.offset;\n  }\n  int addTestemptyOffset(int? offset) {\n    fbBuilder.addOffset(14, offset);\n    return fbBuilder.offset;\n  }\n  int addTestbool(bool? testbool) {\n    fbBuilder.addBool(15, testbool);\n    return fbBuilder.offset;\n  }\n  int addTesthashs32Fnv1(int? testhashs32Fnv1) {\n    fbBuilder.addInt32(16, testhashs32Fnv1);\n    return fbBuilder.offset;\n  }\n  int addTesthashu32Fnv1(int? testhashu32Fnv1) {\n    fbBuilder.addUint32(17, testhashu32Fnv1);\n    return fbBuilder.offset;\n  }\n  int addTesthashs64Fnv1(int? testhashs64Fnv1) {\n    fbBuilder.addInt64(18, testhashs64Fnv1);\n    return fbBuilder.offset;\n  }\n  int addTesthashu64Fnv1(int? testhashu64Fnv1) {\n    fbBuilder.addUint64(19, testhashu64Fnv1);\n    return fbBuilder.offset;\n  }\n  int addTesthashs32Fnv1a(int? testhashs32Fnv1a) {\n    fbBuilder.addInt32(20, testhashs32Fnv1a);\n    return fbBuilder.offset;\n  }\n  int addTesthashu32Fnv1a(int? testhashu32Fnv1a) {\n    fbBuilder.addUint32(21, testhashu32Fnv1a);\n    return fbBuilder.offset;\n  }\n  int addTesthashs64Fnv1a(int? testhashs64Fnv1a) {\n    fbBuilder.addInt64(22, testhashs64Fnv1a);\n    return fbBuilder.offset;\n  }\n  int addTesthashu64Fnv1a(int? testhashu64Fnv1a) {\n    fbBuilder.addUint64(23, testhashu64Fnv1a);\n    return fbBuilder.offset;\n  }\n  int addTestarrayofboolsOffset(int? offset) {\n    fbBuilder.addOffset(24, offset);\n    return fbBuilder.offset;\n  }\n  int addTestf(double? testf) {\n    fbBuilder.addFloat32(25, testf);\n    return fbBuilder.offset;\n  }\n  int addTestf2(double? testf2) {\n    fbBuilder.addFloat32(26, testf2);\n    return fbBuilder.offset;\n  }\n  int addTestf3(double? testf3) {\n    fbBuilder.addFloat32(27, testf3);\n    return fbBuilder.offset;\n  }\n  int addTestarrayofstring2Offset(int? offset) {\n    fbBuilder.addOffset(28, offset);\n    return fbBuilder.offset;\n  }\n  int addTestarrayofsortedstructOffset(int? offset) {\n    fbBuilder.addOffset(29, offset);\n    return fbBuilder.offset;\n  }\n  int addFlexOffset(int? offset) {\n    fbBuilder.addOffset(30, offset);\n    return fbBuilder.offset;\n  }\n  int addTest5Offset(int? offset) {\n    fbBuilder.addOffset(31, offset);\n    return fbBuilder.offset;\n  }\n  int addVectorOfLongsOffset(int? offset) {\n    fbBuilder.addOffset(32, offset);\n    return fbBuilder.offset;\n  }\n  int addVectorOfDoublesOffset(int? offset) {\n    fbBuilder.addOffset(33, offset);\n    return fbBuilder.offset;\n  }\n  int addParentNamespaceTestOffset(int? offset) {\n    fbBuilder.addOffset(34, offset);\n    return fbBuilder.offset;\n  }\n  int addVectorOfReferrablesOffset(int? offset) {\n    fbBuilder.addOffset(35, offset);\n    return fbBuilder.offset;\n  }\n  int addSingleWeakReference(int? singleWeakReference) {\n    fbBuilder.addUint64(36, singleWeakReference);\n    return fbBuilder.offset;\n  }\n  int addVectorOfWeakReferencesOffset(int? offset) {\n    fbBuilder.addOffset(37, offset);\n    return fbBuilder.offset;\n  }\n  int addVectorOfStrongReferrablesOffset(int? offset) {\n    fbBuilder.addOffset(38, offset);\n    return fbBuilder.offset;\n  }\n  int addCoOwningReference(int? coOwningReference) {\n    fbBuilder.addUint64(39, coOwningReference);\n    return fbBuilder.offset;\n  }\n  int addVectorOfCoOwningReferencesOffset(int? offset) {\n    fbBuilder.addOffset(40, offset);\n    return fbBuilder.offset;\n  }\n  int addNonOwningReference(int? nonOwningReference) {\n    fbBuilder.addUint64(41, nonOwningReference);\n    return fbBuilder.offset;\n  }\n  int addVectorOfNonOwningReferencesOffset(int? offset) {\n    fbBuilder.addOffset(42, offset);\n    return fbBuilder.offset;\n  }\n  int addAnyUniqueType(AnyUniqueAliasesTypeId? anyUniqueType) {\n    fbBuilder.addUint8(43, anyUniqueType?.value);\n    return fbBuilder.offset;\n  }\n  int addAnyUniqueOffset(int? offset) {\n    fbBuilder.addOffset(44, offset);\n    return fbBuilder.offset;\n  }\n  int addAnyAmbiguousType(AnyAmbiguousAliasesTypeId? anyAmbiguousType) {\n    fbBuilder.addUint8(45, anyAmbiguousType?.value);\n    return fbBuilder.offset;\n  }\n  int addAnyAmbiguousOffset(int? offset) {\n    fbBuilder.addOffset(46, offset);\n    return fbBuilder.offset;\n  }\n  int addVectorOfEnumsOffset(int? offset) {\n    fbBuilder.addOffset(47, offset);\n    return fbBuilder.offset;\n  }\n  int addSignedEnum(Race? signedEnum) {\n    fbBuilder.addInt8(48, signedEnum?.value);\n    return fbBuilder.offset;\n  }\n  int addTestrequirednestedflatbufferOffset(int? offset) {\n    fbBuilder.addOffset(49, offset);\n    return fbBuilder.offset;\n  }\n  int addScalarKeySortedTablesOffset(int? offset) {\n    fbBuilder.addOffset(50, offset);\n    return fbBuilder.offset;\n  }\n  int addNativeInline(int offset) {\n    fbBuilder.addStruct(51, offset);\n    return fbBuilder.offset;\n  }\n  int addLongEnumNonEnumDefault(LongEnum? longEnumNonEnumDefault) {\n    fbBuilder.addUint64(52, longEnumNonEnumDefault?.value);\n    return fbBuilder.offset;\n  }\n  int addLongEnumNormalDefault(LongEnum? longEnumNormalDefault) {\n    fbBuilder.addUint64(53, longEnumNormalDefault?.value);\n    return fbBuilder.offset;\n  }\n  int addNanDefault(double? nanDefault) {\n    fbBuilder.addFloat32(54, nanDefault);\n    return fbBuilder.offset;\n  }\n  int addInfDefault(double? infDefault) {\n    fbBuilder.addFloat32(55, infDefault);\n    return fbBuilder.offset;\n  }\n  int addPositiveInfDefault(double? positiveInfDefault) {\n    fbBuilder.addFloat32(56, positiveInfDefault);\n    return fbBuilder.offset;\n  }\n  int addInfinityDefault(double? infinityDefault) {\n    fbBuilder.addFloat32(57, infinityDefault);\n    return fbBuilder.offset;\n  }\n  int addPositiveInfinityDefault(double? positiveInfinityDefault) {\n    fbBuilder.addFloat32(58, positiveInfinityDefault);\n    return fbBuilder.offset;\n  }\n  int addNegativeInfDefault(double? negativeInfDefault) {\n    fbBuilder.addFloat32(59, negativeInfDefault);\n    return fbBuilder.offset;\n  }\n  int addNegativeInfinityDefault(double? negativeInfinityDefault) {\n    fbBuilder.addFloat32(60, negativeInfinityDefault);\n    return fbBuilder.offset;\n  }\n  int addDoubleInfDefault(double? doubleInfDefault) {\n    fbBuilder.addFloat64(61, doubleInfDefault);\n    return fbBuilder.offset;\n  }\n\n  int finish() {\n    return fbBuilder.endTable();\n  }\n}\n\nclass MonsterObjectBuilder extends fb.ObjectBuilder {\n  final Vec3ObjectBuilder? _pos;\n  final int? _mana;\n  final int? _hp;\n  final String? _name;\n  final List<int>? _inventory;\n  final Color? _color;\n  final AnyTypeId? _testType;\n  final dynamic _test;\n  final List<TestObjectBuilder>? _test4;\n  final List<String>? _testarrayofstring;\n  final List<MonsterObjectBuilder>? _testarrayoftables;\n  final MonsterObjectBuilder? _enemy;\n  final List<int>? _testnestedflatbuffer;\n  final StatObjectBuilder? _testempty;\n  final bool? _testbool;\n  final int? _testhashs32Fnv1;\n  final int? _testhashu32Fnv1;\n  final int? _testhashs64Fnv1;\n  final int? _testhashu64Fnv1;\n  final int? _testhashs32Fnv1a;\n  final int? _testhashu32Fnv1a;\n  final int? _testhashs64Fnv1a;\n  final int? _testhashu64Fnv1a;\n  final List<bool>? _testarrayofbools;\n  final double? _testf;\n  final double? _testf2;\n  final double? _testf3;\n  final List<String>? _testarrayofstring2;\n  final List<AbilityObjectBuilder>? _testarrayofsortedstruct;\n  final List<int>? _flex;\n  final List<TestObjectBuilder>? _test5;\n  final List<int>? _vectorOfLongs;\n  final List<double>? _vectorOfDoubles;\n  final my_game.InParentNamespaceObjectBuilder? _parentNamespaceTest;\n  final List<ReferrableObjectBuilder>? _vectorOfReferrables;\n  final int? _singleWeakReference;\n  final List<int>? _vectorOfWeakReferences;\n  final List<ReferrableObjectBuilder>? _vectorOfStrongReferrables;\n  final int? _coOwningReference;\n  final List<int>? _vectorOfCoOwningReferences;\n  final int? _nonOwningReference;\n  final List<int>? _vectorOfNonOwningReferences;\n  final AnyUniqueAliasesTypeId? _anyUniqueType;\n  final dynamic _anyUnique;\n  final AnyAmbiguousAliasesTypeId? _anyAmbiguousType;\n  final dynamic _anyAmbiguous;\n  final List<Color>? _vectorOfEnums;\n  final Race? _signedEnum;\n  final List<int>? _testrequirednestedflatbuffer;\n  final List<StatObjectBuilder>? _scalarKeySortedTables;\n  final TestObjectBuilder? _nativeInline;\n  final LongEnum? _longEnumNonEnumDefault;\n  final LongEnum? _longEnumNormalDefault;\n  final double? _nanDefault;\n  final double? _infDefault;\n  final double? _positiveInfDefault;\n  final double? _infinityDefault;\n  final double? _positiveInfinityDefault;\n  final double? _negativeInfDefault;\n  final double? _negativeInfinityDefault;\n  final double? _doubleInfDefault;\n\n  MonsterObjectBuilder({\n    Vec3ObjectBuilder? pos,\n    int? mana,\n    int? hp,\n    String? name,\n    List<int>? inventory,\n    Color? color,\n    AnyTypeId? testType,\n    dynamic test,\n    List<TestObjectBuilder>? test4,\n    List<String>? testarrayofstring,\n    List<MonsterObjectBuilder>? testarrayoftables,\n    MonsterObjectBuilder? enemy,\n    List<int>? testnestedflatbuffer,\n    StatObjectBuilder? testempty,\n    bool? testbool,\n    int? testhashs32Fnv1,\n    int? testhashu32Fnv1,\n    int? testhashs64Fnv1,\n    int? testhashu64Fnv1,\n    int? testhashs32Fnv1a,\n    int? testhashu32Fnv1a,\n    int? testhashs64Fnv1a,\n    int? testhashu64Fnv1a,\n    List<bool>? testarrayofbools,\n    double? testf,\n    double? testf2,\n    double? testf3,\n    List<String>? testarrayofstring2,\n    List<AbilityObjectBuilder>? testarrayofsortedstruct,\n    List<int>? flex,\n    List<TestObjectBuilder>? test5,\n    List<int>? vectorOfLongs,\n    List<double>? vectorOfDoubles,\n    my_game.InParentNamespaceObjectBuilder? parentNamespaceTest,\n    List<ReferrableObjectBuilder>? vectorOfReferrables,\n    int? singleWeakReference,\n    List<int>? vectorOfWeakReferences,\n    List<ReferrableObjectBuilder>? vectorOfStrongReferrables,\n    int? coOwningReference,\n    List<int>? vectorOfCoOwningReferences,\n    int? nonOwningReference,\n    List<int>? vectorOfNonOwningReferences,\n    AnyUniqueAliasesTypeId? anyUniqueType,\n    dynamic anyUnique,\n    AnyAmbiguousAliasesTypeId? anyAmbiguousType,\n    dynamic anyAmbiguous,\n    List<Color>? vectorOfEnums,\n    Race? signedEnum,\n    List<int>? testrequirednestedflatbuffer,\n    List<StatObjectBuilder>? scalarKeySortedTables,\n    TestObjectBuilder? nativeInline,\n    LongEnum? longEnumNonEnumDefault,\n    LongEnum? longEnumNormalDefault,\n    double? nanDefault,\n    double? infDefault,\n    double? positiveInfDefault,\n    double? infinityDefault,\n    double? positiveInfinityDefault,\n    double? negativeInfDefault,\n    double? negativeInfinityDefault,\n    double? doubleInfDefault,\n  })\n      : _pos = pos,\n        _mana = mana,\n        _hp = hp,\n        _name = name,\n        _inventory = inventory,\n        _color = color,\n        _testType = testType,\n        _test = test,\n        _test4 = test4,\n        _testarrayofstring = testarrayofstring,\n        _testarrayoftables = testarrayoftables,\n        _enemy = enemy,\n        _testnestedflatbuffer = testnestedflatbuffer,\n        _testempty = testempty,\n        _testbool = testbool,\n        _testhashs32Fnv1 = testhashs32Fnv1,\n        _testhashu32Fnv1 = testhashu32Fnv1,\n        _testhashs64Fnv1 = testhashs64Fnv1,\n        _testhashu64Fnv1 = testhashu64Fnv1,\n        _testhashs32Fnv1a = testhashs32Fnv1a,\n        _testhashu32Fnv1a = testhashu32Fnv1a,\n        _testhashs64Fnv1a = testhashs64Fnv1a,\n        _testhashu64Fnv1a = testhashu64Fnv1a,\n        _testarrayofbools = testarrayofbools,\n        _testf = testf,\n        _testf2 = testf2,\n        _testf3 = testf3,\n        _testarrayofstring2 = testarrayofstring2,\n        _testarrayofsortedstruct = testarrayofsortedstruct,\n        _flex = flex,\n        _test5 = test5,\n        _vectorOfLongs = vectorOfLongs,\n        _vectorOfDoubles = vectorOfDoubles,\n        _parentNamespaceTest = parentNamespaceTest,\n        _vectorOfReferrables = vectorOfReferrables,\n        _singleWeakReference = singleWeakReference,\n        _vectorOfWeakReferences = vectorOfWeakReferences,\n        _vectorOfStrongReferrables = vectorOfStrongReferrables,\n        _coOwningReference = coOwningReference,\n        _vectorOfCoOwningReferences = vectorOfCoOwningReferences,\n        _nonOwningReference = nonOwningReference,\n        _vectorOfNonOwningReferences = vectorOfNonOwningReferences,\n        _anyUniqueType = anyUniqueType,\n        _anyUnique = anyUnique,\n        _anyAmbiguousType = anyAmbiguousType,\n        _anyAmbiguous = anyAmbiguous,\n        _vectorOfEnums = vectorOfEnums,\n        _signedEnum = signedEnum,\n        _testrequirednestedflatbuffer = testrequirednestedflatbuffer,\n        _scalarKeySortedTables = scalarKeySortedTables,\n        _nativeInline = nativeInline,\n        _longEnumNonEnumDefault = longEnumNonEnumDefault,\n        _longEnumNormalDefault = longEnumNormalDefault,\n        _nanDefault = nanDefault,\n        _infDefault = infDefault,\n        _positiveInfDefault = positiveInfDefault,\n        _infinityDefault = infinityDefault,\n        _positiveInfinityDefault = positiveInfinityDefault,\n        _negativeInfDefault = negativeInfDefault,\n        _negativeInfinityDefault = negativeInfinityDefault,\n        _doubleInfDefault = doubleInfDefault;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    final int? nameOffset = _name == null ? null\n        : fbBuilder.writeString(_name!);\n    final int? inventoryOffset = _inventory == null ? null\n        : fbBuilder.writeListUint8(_inventory!);\n    final int? testOffset = _test?.getOrCreateOffset(fbBuilder);\n    final int? test4Offset = _test4 == null ? null\n        : fbBuilder.writeListOfStructs(_test4!);\n    final int? testarrayofstringOffset = _testarrayofstring == null ? null\n        : fbBuilder.writeList(_testarrayofstring!.map(fbBuilder.writeString).toList());\n    final int? testarrayoftablesOffset = _testarrayoftables == null ? null\n        : fbBuilder.writeList(_testarrayoftables!.map((b) => b.getOrCreateOffset(fbBuilder)).toList());\n    final int? enemyOffset = _enemy?.getOrCreateOffset(fbBuilder);\n    final int? testnestedflatbufferOffset = _testnestedflatbuffer == null ? null\n        : fbBuilder.writeListUint8(_testnestedflatbuffer!);\n    final int? testemptyOffset = _testempty?.getOrCreateOffset(fbBuilder);\n    final int? testarrayofboolsOffset = _testarrayofbools == null ? null\n        : fbBuilder.writeListBool(_testarrayofbools!);\n    final int? testarrayofstring2Offset = _testarrayofstring2 == null ? null\n        : fbBuilder.writeList(_testarrayofstring2!.map(fbBuilder.writeString).toList());\n    final int? testarrayofsortedstructOffset = _testarrayofsortedstruct == null ? null\n        : fbBuilder.writeListOfStructs(_testarrayofsortedstruct!);\n    final int? flexOffset = _flex == null ? null\n        : fbBuilder.writeListUint8(_flex!);\n    final int? test5Offset = _test5 == null ? null\n        : fbBuilder.writeListOfStructs(_test5!);\n    final int? vectorOfLongsOffset = _vectorOfLongs == null ? null\n        : fbBuilder.writeListInt64(_vectorOfLongs!);\n    final int? vectorOfDoublesOffset = _vectorOfDoubles == null ? null\n        : fbBuilder.writeListFloat64(_vectorOfDoubles!);\n    final int? parentNamespaceTestOffset = _parentNamespaceTest?.getOrCreateOffset(fbBuilder);\n    final int? vectorOfReferrablesOffset = _vectorOfReferrables == null ? null\n        : fbBuilder.writeList(_vectorOfReferrables!.map((b) => b.getOrCreateOffset(fbBuilder)).toList());\n    final int? vectorOfWeakReferencesOffset = _vectorOfWeakReferences == null ? null\n        : fbBuilder.writeListUint64(_vectorOfWeakReferences!);\n    final int? vectorOfStrongReferrablesOffset = _vectorOfStrongReferrables == null ? null\n        : fbBuilder.writeList(_vectorOfStrongReferrables!.map((b) => b.getOrCreateOffset(fbBuilder)).toList());\n    final int? vectorOfCoOwningReferencesOffset = _vectorOfCoOwningReferences == null ? null\n        : fbBuilder.writeListUint64(_vectorOfCoOwningReferences!);\n    final int? vectorOfNonOwningReferencesOffset = _vectorOfNonOwningReferences == null ? null\n        : fbBuilder.writeListUint64(_vectorOfNonOwningReferences!);\n    final int? anyUniqueOffset = _anyUnique?.getOrCreateOffset(fbBuilder);\n    final int? anyAmbiguousOffset = _anyAmbiguous?.getOrCreateOffset(fbBuilder);\n    final int? vectorOfEnumsOffset = _vectorOfEnums == null ? null\n        : fbBuilder.writeListUint8(_vectorOfEnums!.map((f) => f.value).toList());\n    final int? testrequirednestedflatbufferOffset = _testrequirednestedflatbuffer == null ? null\n        : fbBuilder.writeListUint8(_testrequirednestedflatbuffer!);\n    final int? scalarKeySortedTablesOffset = _scalarKeySortedTables == null ? null\n        : fbBuilder.writeList(_scalarKeySortedTables!.map((b) => b.getOrCreateOffset(fbBuilder)).toList());\n    fbBuilder.startTable(62);\n    if (_pos != null) {\n      fbBuilder.addStruct(0, _pos!.finish(fbBuilder));\n    }\n    fbBuilder.addInt16(1, _mana);\n    fbBuilder.addInt16(2, _hp);\n    fbBuilder.addOffset(3, nameOffset);\n    fbBuilder.addOffset(5, inventoryOffset);\n    fbBuilder.addUint8(6, _color?.value);\n    fbBuilder.addUint8(7, _testType?.value);\n    fbBuilder.addOffset(8, testOffset);\n    fbBuilder.addOffset(9, test4Offset);\n    fbBuilder.addOffset(10, testarrayofstringOffset);\n    fbBuilder.addOffset(11, testarrayoftablesOffset);\n    fbBuilder.addOffset(12, enemyOffset);\n    fbBuilder.addOffset(13, testnestedflatbufferOffset);\n    fbBuilder.addOffset(14, testemptyOffset);\n    fbBuilder.addBool(15, _testbool);\n    fbBuilder.addInt32(16, _testhashs32Fnv1);\n    fbBuilder.addUint32(17, _testhashu32Fnv1);\n    fbBuilder.addInt64(18, _testhashs64Fnv1);\n    fbBuilder.addUint64(19, _testhashu64Fnv1);\n    fbBuilder.addInt32(20, _testhashs32Fnv1a);\n    fbBuilder.addUint32(21, _testhashu32Fnv1a);\n    fbBuilder.addInt64(22, _testhashs64Fnv1a);\n    fbBuilder.addUint64(23, _testhashu64Fnv1a);\n    fbBuilder.addOffset(24, testarrayofboolsOffset);\n    fbBuilder.addFloat32(25, _testf);\n    fbBuilder.addFloat32(26, _testf2);\n    fbBuilder.addFloat32(27, _testf3);\n    fbBuilder.addOffset(28, testarrayofstring2Offset);\n    fbBuilder.addOffset(29, testarrayofsortedstructOffset);\n    fbBuilder.addOffset(30, flexOffset);\n    fbBuilder.addOffset(31, test5Offset);\n    fbBuilder.addOffset(32, vectorOfLongsOffset);\n    fbBuilder.addOffset(33, vectorOfDoublesOffset);\n    fbBuilder.addOffset(34, parentNamespaceTestOffset);\n    fbBuilder.addOffset(35, vectorOfReferrablesOffset);\n    fbBuilder.addUint64(36, _singleWeakReference);\n    fbBuilder.addOffset(37, vectorOfWeakReferencesOffset);\n    fbBuilder.addOffset(38, vectorOfStrongReferrablesOffset);\n    fbBuilder.addUint64(39, _coOwningReference);\n    fbBuilder.addOffset(40, vectorOfCoOwningReferencesOffset);\n    fbBuilder.addUint64(41, _nonOwningReference);\n    fbBuilder.addOffset(42, vectorOfNonOwningReferencesOffset);\n    fbBuilder.addUint8(43, _anyUniqueType?.value);\n    fbBuilder.addOffset(44, anyUniqueOffset);\n    fbBuilder.addUint8(45, _anyAmbiguousType?.value);\n    fbBuilder.addOffset(46, anyAmbiguousOffset);\n    fbBuilder.addOffset(47, vectorOfEnumsOffset);\n    fbBuilder.addInt8(48, _signedEnum?.value);\n    fbBuilder.addOffset(49, testrequirednestedflatbufferOffset);\n    fbBuilder.addOffset(50, scalarKeySortedTablesOffset);\n    if (_nativeInline != null) {\n      fbBuilder.addStruct(51, _nativeInline!.finish(fbBuilder));\n    }\n    fbBuilder.addUint64(52, _longEnumNonEnumDefault?.value);\n    fbBuilder.addUint64(53, _longEnumNormalDefault?.value);\n    fbBuilder.addFloat32(54, _nanDefault);\n    fbBuilder.addFloat32(55, _infDefault);\n    fbBuilder.addFloat32(56, _positiveInfDefault);\n    fbBuilder.addFloat32(57, _infinityDefault);\n    fbBuilder.addFloat32(58, _positiveInfinityDefault);\n    fbBuilder.addFloat32(59, _negativeInfDefault);\n    fbBuilder.addFloat32(60, _negativeInfinityDefault);\n    fbBuilder.addFloat64(61, _doubleInfDefault);\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\nclass TypeAliases {\n  TypeAliases._(this._bc, this._bcOffset);\n  factory TypeAliases(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<TypeAliases> reader = _TypeAliasesReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  int get i8 => const fb.Int8Reader().vTableGet(_bc, _bcOffset, 4, 0);\n  int get u8 => const fb.Uint8Reader().vTableGet(_bc, _bcOffset, 6, 0);\n  int get i16 => const fb.Int16Reader().vTableGet(_bc, _bcOffset, 8, 0);\n  int get u16 => const fb.Uint16Reader().vTableGet(_bc, _bcOffset, 10, 0);\n  int get i32 => const fb.Int32Reader().vTableGet(_bc, _bcOffset, 12, 0);\n  int get u32 => const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 14, 0);\n  int get i64 => const fb.Int64Reader().vTableGet(_bc, _bcOffset, 16, 0);\n  int get u64 => const fb.Uint64Reader().vTableGet(_bc, _bcOffset, 18, 0);\n  double get f32 => const fb.Float32Reader().vTableGet(_bc, _bcOffset, 20, 0.0);\n  double get f64 => const fb.Float64Reader().vTableGet(_bc, _bcOffset, 22, 0.0);\n  List<int>? get v8 => const fb.Int8ListReader().vTableGetNullable(_bc, _bcOffset, 24);\n  List<double>? get vf64 => const fb.ListReader<double>(fb.Float64Reader()).vTableGetNullable(_bc, _bcOffset, 26);\n\n  @override\n  String toString() {\n    return 'TypeAliases{i8: ${i8}, u8: ${u8}, i16: ${i16}, u16: ${u16}, i32: ${i32}, u32: ${u32}, i64: ${i64}, u64: ${u64}, f32: ${f32}, f64: ${f64}, v8: ${v8}, vf64: ${vf64}}';\n  }\n\n  TypeAliasesT unpack() => TypeAliasesT(\n      i8: i8,\n      u8: u8,\n      i16: i16,\n      u16: u16,\n      i32: i32,\n      u32: u32,\n      i64: i64,\n      u64: u64,\n      f32: f32,\n      f64: f64,\n      v8: v8?.toList(),\n      vf64: vf64?.toList());\n\n  static int pack(fb.Builder fbBuilder, TypeAliasesT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass TypeAliasesT implements fb.Packable {\n  int i8;\n  int u8;\n  int i16;\n  int u16;\n  int i32;\n  int u32;\n  int i64;\n  int u64;\n  double f32;\n  double f64;\n  List<int>? v8;\n  List<double>? vf64;\n\n  TypeAliasesT({\n      this.i8 = 0,\n      this.u8 = 0,\n      this.i16 = 0,\n      this.u16 = 0,\n      this.i32 = 0,\n      this.u32 = 0,\n      this.i64 = 0,\n      this.u64 = 0,\n      this.f32 = 0.0,\n      this.f64 = 0.0,\n      this.v8,\n      this.vf64});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    final int? v8Offset = v8 == null ? null\n        : fbBuilder.writeListInt8(v8!);\n    final int? vf64Offset = vf64 == null ? null\n        : fbBuilder.writeListFloat64(vf64!);\n    fbBuilder.startTable(12);\n    fbBuilder.addInt8(0, i8);\n    fbBuilder.addUint8(1, u8);\n    fbBuilder.addInt16(2, i16);\n    fbBuilder.addUint16(3, u16);\n    fbBuilder.addInt32(4, i32);\n    fbBuilder.addUint32(5, u32);\n    fbBuilder.addInt64(6, i64);\n    fbBuilder.addUint64(7, u64);\n    fbBuilder.addFloat32(8, f32);\n    fbBuilder.addFloat64(9, f64);\n    fbBuilder.addOffset(10, v8Offset);\n    fbBuilder.addOffset(11, vf64Offset);\n    return fbBuilder.endTable();\n  }\n\n  @override\n  String toString() {\n    return 'TypeAliasesT{i8: ${i8}, u8: ${u8}, i16: ${i16}, u16: ${u16}, i32: ${i32}, u32: ${u32}, i64: ${i64}, u64: ${u64}, f32: ${f32}, f64: ${f64}, v8: ${v8}, vf64: ${vf64}}';\n  }\n}\n\nclass _TypeAliasesReader extends fb.TableReader<TypeAliases> {\n  const _TypeAliasesReader();\n\n  @override\n  TypeAliases createObject(fb.BufferContext bc, int offset) => \n    TypeAliases._(bc, offset);\n}\n\nclass TypeAliasesBuilder {\n  TypeAliasesBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  void begin() {\n    fbBuilder.startTable(12);\n  }\n\n  int addI8(int? i8) {\n    fbBuilder.addInt8(0, i8);\n    return fbBuilder.offset;\n  }\n  int addU8(int? u8) {\n    fbBuilder.addUint8(1, u8);\n    return fbBuilder.offset;\n  }\n  int addI16(int? i16) {\n    fbBuilder.addInt16(2, i16);\n    return fbBuilder.offset;\n  }\n  int addU16(int? u16) {\n    fbBuilder.addUint16(3, u16);\n    return fbBuilder.offset;\n  }\n  int addI32(int? i32) {\n    fbBuilder.addInt32(4, i32);\n    return fbBuilder.offset;\n  }\n  int addU32(int? u32) {\n    fbBuilder.addUint32(5, u32);\n    return fbBuilder.offset;\n  }\n  int addI64(int? i64) {\n    fbBuilder.addInt64(6, i64);\n    return fbBuilder.offset;\n  }\n  int addU64(int? u64) {\n    fbBuilder.addUint64(7, u64);\n    return fbBuilder.offset;\n  }\n  int addF32(double? f32) {\n    fbBuilder.addFloat32(8, f32);\n    return fbBuilder.offset;\n  }\n  int addF64(double? f64) {\n    fbBuilder.addFloat64(9, f64);\n    return fbBuilder.offset;\n  }\n  int addV8Offset(int? offset) {\n    fbBuilder.addOffset(10, offset);\n    return fbBuilder.offset;\n  }\n  int addVf64Offset(int? offset) {\n    fbBuilder.addOffset(11, offset);\n    return fbBuilder.offset;\n  }\n\n  int finish() {\n    return fbBuilder.endTable();\n  }\n}\n\nclass TypeAliasesObjectBuilder extends fb.ObjectBuilder {\n  final int? _i8;\n  final int? _u8;\n  final int? _i16;\n  final int? _u16;\n  final int? _i32;\n  final int? _u32;\n  final int? _i64;\n  final int? _u64;\n  final double? _f32;\n  final double? _f64;\n  final List<int>? _v8;\n  final List<double>? _vf64;\n\n  TypeAliasesObjectBuilder({\n    int? i8,\n    int? u8,\n    int? i16,\n    int? u16,\n    int? i32,\n    int? u32,\n    int? i64,\n    int? u64,\n    double? f32,\n    double? f64,\n    List<int>? v8,\n    List<double>? vf64,\n  })\n      : _i8 = i8,\n        _u8 = u8,\n        _i16 = i16,\n        _u16 = u16,\n        _i32 = i32,\n        _u32 = u32,\n        _i64 = i64,\n        _u64 = u64,\n        _f32 = f32,\n        _f64 = f64,\n        _v8 = v8,\n        _vf64 = vf64;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    final int? v8Offset = _v8 == null ? null\n        : fbBuilder.writeListInt8(_v8!);\n    final int? vf64Offset = _vf64 == null ? null\n        : fbBuilder.writeListFloat64(_vf64!);\n    fbBuilder.startTable(12);\n    fbBuilder.addInt8(0, _i8);\n    fbBuilder.addUint8(1, _u8);\n    fbBuilder.addInt16(2, _i16);\n    fbBuilder.addUint16(3, _u16);\n    fbBuilder.addInt32(4, _i32);\n    fbBuilder.addUint32(5, _u32);\n    fbBuilder.addInt64(6, _i64);\n    fbBuilder.addUint64(7, _u64);\n    fbBuilder.addFloat32(8, _f32);\n    fbBuilder.addFloat64(9, _f64);\n    fbBuilder.addOffset(10, v8Offset);\n    fbBuilder.addOffset(11, vf64Offset);\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n"
  },
  {
    "path": "tests/monster_test_my_game_generated.dart",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable, constant_identifier_names\n\nlibrary my_game;\n\nimport 'dart:typed_data' show Uint8List;\nimport 'package:flat_buffers/flat_buffers.dart' as fb;\n\nimport './monster_test_my_game.example_generated.dart' as my_game_example;\nimport './monster_test_my_game.example2_generated.dart' as my_game_example2;\n\nimport './include_test1_generated.dart';\n\nclass InParentNamespace {\n  InParentNamespace._(this._bc, this._bcOffset);\n  factory InParentNamespace(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<InParentNamespace> reader = _InParentNamespaceReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n\n  @override\n  String toString() {\n    return 'InParentNamespace{}';\n  }\n\n  InParentNamespaceT unpack() => InParentNamespaceT();\n\n  static int pack(fb.Builder fbBuilder, InParentNamespaceT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass InParentNamespaceT implements fb.Packable {\n  @override\n  int pack(fb.Builder fbBuilder) {\n    fbBuilder.startTable(0);\n    return fbBuilder.endTable();\n  }\n\n  @override\n  String toString() {\n    return 'InParentNamespaceT{}';\n  }\n}\n\nclass _InParentNamespaceReader extends fb.TableReader<InParentNamespace> {\n  const _InParentNamespaceReader();\n\n  @override\n  InParentNamespace createObject(fb.BufferContext bc, int offset) => \n    InParentNamespace._(bc, offset);\n}\n\nclass InParentNamespaceObjectBuilder extends fb.ObjectBuilder {\n\n  InParentNamespaceObjectBuilder();\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    fbBuilder.startTable(0);\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n"
  },
  {
    "path": "tests/monster_test_serialize/mod.rs",
    "content": "// Automatically generated by the Flatbuffers compiler. Do not modify.\n// @generated\npub mod my_game {\n    use super::*;\n    pub mod example {\n        use super::*;\n        mod color_generated;\n        pub use self::color_generated::*;\n        mod race_generated;\n        pub use self::race_generated::*;\n        mod long_enum_generated;\n        pub use self::long_enum_generated::*;\n        mod any_generated;\n        pub use self::any_generated::*;\n        mod any_unique_aliases_generated;\n        pub use self::any_unique_aliases_generated::*;\n        mod any_ambiguous_aliases_generated;\n        pub use self::any_ambiguous_aliases_generated::*;\n        mod test_generated;\n        pub use self::test_generated::*;\n        mod test_simple_table_with_enum_generated;\n        pub use self::test_simple_table_with_enum_generated::*;\n        mod vec_3_generated;\n        pub use self::vec_3_generated::*;\n        mod ability_generated;\n        pub use self::ability_generated::*;\n        mod struct_of_structs_generated;\n        pub use self::struct_of_structs_generated::*;\n        mod struct_of_structs_of_structs_generated;\n        pub use self::struct_of_structs_of_structs_generated::*;\n        mod stat_generated;\n        pub use self::stat_generated::*;\n        mod referrable_generated;\n        pub use self::referrable_generated::*;\n        mod monster_generated;\n        pub use self::monster_generated::*;\n        mod type_aliases_generated;\n        pub use self::type_aliases_generated::*;\n    } // example\n    pub mod example_2 {\n        use super::*;\n        mod monster_generated;\n        pub use self::monster_generated::*;\n    } // example_2\n    pub mod other_name_space {\n        use super::*;\n        mod from_include_generated;\n        pub use self::from_include_generated::*;\n        mod unused_generated;\n        pub use self::unused_generated::*;\n        mod table_b_generated;\n        pub use self::table_b_generated::*;\n    } // other_name_space\n    mod in_parent_namespace_generated;\n    pub use self::in_parent_namespace_generated::*;\n} // my_game\nmod table_a_generated;\npub use self::table_a_generated::*;\n"
  },
  {
    "path": "tests/monster_test_serialize/my_game/example/ability_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nextern crate serde;\nuse self::serde::ser::{Serialize, Serializer, SerializeStruct};\nuse super::*;\n\n// struct Ability, aligned to 4\n#[repr(transparent)]\n#[derive(Clone, Copy, PartialEq)]\npub struct Ability(pub [u8; 8]);\n\nimpl Default for Ability {\n    fn default() -> Self {\n        Self([0; 8])\n    }\n}\n\nimpl ::core::fmt::Debug for Ability {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        f.debug_struct(\"Ability\")\n            .field(\"id\", &self.id())\n            .field(\"distance\", &self.distance())\n            .finish()\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for Ability {}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Ability {\n    type Inner = &'a Ability;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { <&'a Ability>::follow(buf, loc) }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for &'a Ability {\n    type Inner = &'a Ability;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { ::flatbuffers::follow_cast_ref::<Ability>(buf, loc) }\n    }\n}\n\nimpl<'b> ::flatbuffers::Push for Ability {\n    type Output = Ability;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        let src = unsafe { ::core::slice::from_raw_parts(self as *const Ability as *const u8, <Self as ::flatbuffers::Push>::size()) };\n        dst.copy_from_slice(src);\n    }\n\n    #[inline]\n    fn alignment() -> ::flatbuffers::PushAlignment {\n        ::flatbuffers::PushAlignment::new(4)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for Ability {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.in_buffer::<Self>(pos)\n    }\n}\n\nimpl Serialize for Ability {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n    let mut s = serializer.serialize_struct(\"Ability\", 2)?;\n        s.serialize_field(\"id\", &self.id())?;\n        s.serialize_field(\"distance\", &self.distance())?;\n        s.end()\n    }\n}\n\nimpl<'a> Ability {\n    #[allow(clippy::too_many_arguments)]\n    pub fn new(\n        id: u32,\n        distance: u32,\n    ) -> Self {\n        let mut s = Self([0; 8]);\n        s.set_id(id);\n        s.set_distance(distance);\n        s\n    }\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.Example.Ability\"\n    }\n\n    pub fn id(&self) -> u32 {\n        let mut mem = ::core::mem::MaybeUninit::<<u32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[0..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<u32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_id(&mut self, x: u32) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[0..].as_mut_ptr(),\n                ::core::mem::size_of::<<u32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n\n    #[inline]\n    pub fn key_compare_less_than(&self, o: &Ability) -> bool {\n        self.id() < o.id()\n    }\n\n    #[inline]\n    pub fn key_compare_with_value(&self, val: u32) -> ::core::cmp::Ordering {\n        let key = self.id();\n        key.cmp(&val)\n    }\n    pub fn distance(&self) -> u32 {\n        let mut mem = ::core::mem::MaybeUninit::<<u32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[4..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<u32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_distance(&mut self, x: u32) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[4..].as_mut_ptr(),\n                ::core::mem::size_of::<<u32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn unpack(&self) -> AbilityT {\n        AbilityT {\n            id: self.id(),\n            distance: self.distance(),\n        }\n    }\n}\n\n#[derive(Debug, Clone, PartialEq)]\npub struct AbilityT {\n    pub id: u32,\n    pub distance: u32,\n}\nimpl Default for AbilityT {\n    fn default() -> Self {\n        Self {\n            id: 0,\n            distance: 0,\n        }\n    }\n}\n\nimpl AbilityT {\n    pub fn pack(&self) -> Ability {\n        Ability::new(\n            self.id,\n            self.distance,\n        )\n    }\n}\n"
  },
  {
    "path": "tests/monster_test_serialize/my_game/example/any_ambiguous_aliases_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nextern crate serde;\nuse self::serde::ser::{Serialize, Serializer, SerializeStruct};\nuse super::*;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MIN_ANY_AMBIGUOUS_ALIASES: u8 = 0;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MAX_ANY_AMBIGUOUS_ALIASES: u8 = 3;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n#[allow(non_camel_case_types)]\npub const ENUM_VALUES_ANY_AMBIGUOUS_ALIASES: [AnyAmbiguousAliases; 4] = [\n    AnyAmbiguousAliases::NONE,\n    AnyAmbiguousAliases::M1,\n    AnyAmbiguousAliases::M2,\n    AnyAmbiguousAliases::M3,\n];\n\n#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n#[repr(transparent)]\npub struct AnyAmbiguousAliases(pub u8);\n\n#[allow(non_upper_case_globals)]\nimpl AnyAmbiguousAliases {\n    pub const NONE: Self = Self(0);\n    pub const M1: Self = Self(1);\n    pub const M2: Self = Self(2);\n    pub const M3: Self = Self(3);\n\n    pub const ENUM_MIN: u8 = 0;\n    pub const ENUM_MAX: u8 = 3;\n    pub const ENUM_VALUES: &'static [Self] = &[\n        Self::NONE,\n        Self::M1,\n        Self::M2,\n        Self::M3,\n    ];\n\n    /// Returns the variant's name or \"\" if unknown.\n    pub fn variant_name(self) -> Option<&'static str> {\n        match self {\n            Self::NONE => Some(\"NONE\"),\n            Self::M1 => Some(\"M1\"),\n            Self::M2 => Some(\"M2\"),\n            Self::M3 => Some(\"M3\"),\n            _ => None,\n        }\n    }\n}\n\nimpl ::core::fmt::Debug for AnyAmbiguousAliases {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        if let Some(name) = self.variant_name() {\n            f.write_str(name)\n        } else {\n            f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n        }\n    }\n}\n\nimpl Serialize for AnyAmbiguousAliases {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        serializer.serialize_unit_variant(\"AnyAmbiguousAliases\", self.0 as u32, self.variant_name().unwrap())\n    }\n}\n\nimpl<'de> serde::Deserialize<'de> for AnyAmbiguousAliases {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: serde::Deserializer<'de>,\n    {\n        let s = String::deserialize(deserializer)?;\n        for item in AnyAmbiguousAliases::ENUM_VALUES {\n            if let Some(item_name) = item.variant_name() {\n                if item_name == s {\n                    return Ok(item.clone());\n                }\n            }\n        }\n        Err(serde::de::Error::custom(format!(\n            \"Unknown AnyAmbiguousAliases variant: {s}\"\n        )))\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for AnyAmbiguousAliases {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<u8>(buf, loc) };\n        Self(b)\n    }\n}\n\nimpl ::flatbuffers::Push for AnyAmbiguousAliases {\n    type Output = AnyAmbiguousAliases;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<u8>(dst, self.0) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for AnyAmbiguousAliases {\n    type Scalar = u8;\n\n    #[inline]\n    fn to_little_endian(self) -> u8 {\n        self.0.to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: u8) -> Self {\n        let b = u8::from_le(v);\n        Self(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for AnyAmbiguousAliases {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        u8::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for AnyAmbiguousAliases {}\n\npub struct AnyAmbiguousAliasesUnionTableOffset {}\n\n#[allow(clippy::upper_case_acronyms)]\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub enum AnyAmbiguousAliasesT {\n    NONE,\n    M1(alloc::boxed::Box<MonsterT>),\n    M2(alloc::boxed::Box<MonsterT>),\n    M3(alloc::boxed::Box<MonsterT>),\n}\n\nimpl Default for AnyAmbiguousAliasesT {\n    fn default() -> Self {\n        Self::NONE\n    }\n}\n\nimpl AnyAmbiguousAliasesT {\n    pub fn any_ambiguous_aliases_type(&self) -> AnyAmbiguousAliases {\n        match self {\n            Self::NONE => AnyAmbiguousAliases::NONE,\n            Self::M1(_) => AnyAmbiguousAliases::M1,\n            Self::M2(_) => AnyAmbiguousAliases::M2,\n            Self::M3(_) => AnyAmbiguousAliases::M3,\n        }\n    }\n\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(&self, fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>) -> Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>> {\n        match self {\n            Self::NONE => None,\n            Self::M1(v) => Some(v.pack(fbb).as_union_value()),\n            Self::M2(v) => Some(v.pack(fbb).as_union_value()),\n            Self::M3(v) => Some(v.pack(fbb).as_union_value()),\n        }\n    }\n\n    /// If the union variant matches, return the owned MonsterT, setting the union to NONE.\n    pub fn take_m1(&mut self) -> Option<alloc::boxed::Box<MonsterT>> {\n        if let Self::M1(_) = self {\n            let v = ::core::mem::replace(self, Self::NONE);\n            if let Self::M1(w) = v {\n                Some(w)\n            } else {\n                unreachable!()\n            }\n        } else {\n            None\n        }\n    }\n\n    /// If the union variant matches, return a reference to the MonsterT.\n    pub fn as_m1(&self) -> Option<&MonsterT> {\n        if let Self::M1(v) = self { Some(v.as_ref()) } else { None }\n    }\n\n    /// If the union variant matches, return a mutable reference to the MonsterT.\n    pub fn as_m1_mut(&mut self) -> Option<&mut MonsterT> {\n        if let Self::M1(v) = self { Some(v.as_mut()) } else { None }\n    }\n\n    /// If the union variant matches, return the owned MonsterT, setting the union to NONE.\n    pub fn take_m2(&mut self) -> Option<alloc::boxed::Box<MonsterT>> {\n        if let Self::M2(_) = self {\n            let v = ::core::mem::replace(self, Self::NONE);\n            if let Self::M2(w) = v {\n                Some(w)\n            } else {\n                unreachable!()\n            }\n        } else {\n            None\n        }\n    }\n\n    /// If the union variant matches, return a reference to the MonsterT.\n    pub fn as_m2(&self) -> Option<&MonsterT> {\n        if let Self::M2(v) = self { Some(v.as_ref()) } else { None }\n    }\n\n    /// If the union variant matches, return a mutable reference to the MonsterT.\n    pub fn as_m2_mut(&mut self) -> Option<&mut MonsterT> {\n        if let Self::M2(v) = self { Some(v.as_mut()) } else { None }\n    }\n\n    /// If the union variant matches, return the owned MonsterT, setting the union to NONE.\n    pub fn take_m3(&mut self) -> Option<alloc::boxed::Box<MonsterT>> {\n        if let Self::M3(_) = self {\n            let v = ::core::mem::replace(self, Self::NONE);\n            if let Self::M3(w) = v {\n                Some(w)\n            } else {\n                unreachable!()\n            }\n        } else {\n            None\n        }\n    }\n\n    /// If the union variant matches, return a reference to the MonsterT.\n    pub fn as_m3(&self) -> Option<&MonsterT> {\n        if let Self::M3(v) = self { Some(v.as_ref()) } else { None }\n    }\n\n    /// If the union variant matches, return a mutable reference to the MonsterT.\n    pub fn as_m3_mut(&mut self) -> Option<&mut MonsterT> {\n        if let Self::M3(v) = self { Some(v.as_mut()) } else { None }\n    }\n}\n\n"
  },
  {
    "path": "tests/monster_test_serialize/my_game/example/any_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nextern crate serde;\nuse self::serde::ser::{Serialize, Serializer, SerializeStruct};\nuse super::*;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MIN_ANY: u8 = 0;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MAX_ANY: u8 = 3;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n#[allow(non_camel_case_types)]\npub const ENUM_VALUES_ANY: [Any; 4] = [\n    Any::NONE,\n    Any::Monster,\n    Any::TestSimpleTableWithEnum,\n    Any::MyGame_Example2_Monster,\n];\n\n#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n#[repr(transparent)]\npub struct Any(pub u8);\n\n#[allow(non_upper_case_globals)]\nimpl Any {\n    pub const NONE: Self = Self(0);\n    pub const Monster: Self = Self(1);\n    pub const TestSimpleTableWithEnum: Self = Self(2);\n    pub const MyGame_Example2_Monster: Self = Self(3);\n\n    pub const ENUM_MIN: u8 = 0;\n    pub const ENUM_MAX: u8 = 3;\n    pub const ENUM_VALUES: &'static [Self] = &[\n        Self::NONE,\n        Self::Monster,\n        Self::TestSimpleTableWithEnum,\n        Self::MyGame_Example2_Monster,\n    ];\n\n    /// Returns the variant's name or \"\" if unknown.\n    pub fn variant_name(self) -> Option<&'static str> {\n        match self {\n            Self::NONE => Some(\"NONE\"),\n            Self::Monster => Some(\"Monster\"),\n            Self::TestSimpleTableWithEnum => Some(\"TestSimpleTableWithEnum\"),\n            Self::MyGame_Example2_Monster => Some(\"MyGame_Example2_Monster\"),\n            _ => None,\n        }\n    }\n}\n\nimpl ::core::fmt::Debug for Any {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        if let Some(name) = self.variant_name() {\n            f.write_str(name)\n        } else {\n            f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n        }\n    }\n}\n\nimpl Serialize for Any {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        serializer.serialize_unit_variant(\"Any\", self.0 as u32, self.variant_name().unwrap())\n    }\n}\n\nimpl<'de> serde::Deserialize<'de> for Any {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: serde::Deserializer<'de>,\n    {\n        let s = String::deserialize(deserializer)?;\n        for item in Any::ENUM_VALUES {\n            if let Some(item_name) = item.variant_name() {\n                if item_name == s {\n                    return Ok(item.clone());\n                }\n            }\n        }\n        Err(serde::de::Error::custom(format!(\n            \"Unknown Any variant: {s}\"\n        )))\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Any {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<u8>(buf, loc) };\n        Self(b)\n    }\n}\n\nimpl ::flatbuffers::Push for Any {\n    type Output = Any;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<u8>(dst, self.0) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for Any {\n    type Scalar = u8;\n\n    #[inline]\n    fn to_little_endian(self) -> u8 {\n        self.0.to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: u8) -> Self {\n        let b = u8::from_le(v);\n        Self(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for Any {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        u8::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for Any {}\n\npub struct AnyUnionTableOffset {}\n\n#[allow(clippy::upper_case_acronyms)]\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub enum AnyT {\n    NONE,\n    Monster(alloc::boxed::Box<MonsterT>),\n    TestSimpleTableWithEnum(alloc::boxed::Box<TestSimpleTableWithEnumT>),\n    MyGameExample2Monster(alloc::boxed::Box<super::example_2::MonsterT>),\n}\n\nimpl Default for AnyT {\n    fn default() -> Self {\n        Self::NONE\n    }\n}\n\nimpl AnyT {\n    pub fn any_type(&self) -> Any {\n        match self {\n            Self::NONE => Any::NONE,\n            Self::Monster(_) => Any::Monster,\n            Self::TestSimpleTableWithEnum(_) => Any::TestSimpleTableWithEnum,\n            Self::MyGameExample2Monster(_) => Any::MyGame_Example2_Monster,\n        }\n    }\n\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(&self, fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>) -> Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>> {\n        match self {\n            Self::NONE => None,\n            Self::Monster(v) => Some(v.pack(fbb).as_union_value()),\n            Self::TestSimpleTableWithEnum(v) => Some(v.pack(fbb).as_union_value()),\n            Self::MyGameExample2Monster(v) => Some(v.pack(fbb).as_union_value()),\n        }\n    }\n\n    /// If the union variant matches, return the owned MonsterT, setting the union to NONE.\n    pub fn take_monster(&mut self) -> Option<alloc::boxed::Box<MonsterT>> {\n        if let Self::Monster(_) = self {\n            let v = ::core::mem::replace(self, Self::NONE);\n            if let Self::Monster(w) = v {\n                Some(w)\n            } else {\n                unreachable!()\n            }\n        } else {\n            None\n        }\n    }\n\n    /// If the union variant matches, return a reference to the MonsterT.\n    pub fn as_monster(&self) -> Option<&MonsterT> {\n        if let Self::Monster(v) = self { Some(v.as_ref()) } else { None }\n    }\n\n    /// If the union variant matches, return a mutable reference to the MonsterT.\n    pub fn as_monster_mut(&mut self) -> Option<&mut MonsterT> {\n        if let Self::Monster(v) = self { Some(v.as_mut()) } else { None }\n    }\n\n    /// If the union variant matches, return the owned TestSimpleTableWithEnumT, setting the union to NONE.\n    pub fn take_test_simple_table_with_enum(&mut self) -> Option<alloc::boxed::Box<TestSimpleTableWithEnumT>> {\n        if let Self::TestSimpleTableWithEnum(_) = self {\n            let v = ::core::mem::replace(self, Self::NONE);\n            if let Self::TestSimpleTableWithEnum(w) = v {\n                Some(w)\n            } else {\n                unreachable!()\n            }\n        } else {\n            None\n        }\n    }\n\n    /// If the union variant matches, return a reference to the TestSimpleTableWithEnumT.\n    pub fn as_test_simple_table_with_enum(&self) -> Option<&TestSimpleTableWithEnumT> {\n        if let Self::TestSimpleTableWithEnum(v) = self { Some(v.as_ref()) } else { None }\n    }\n\n    /// If the union variant matches, return a mutable reference to the TestSimpleTableWithEnumT.\n    pub fn as_test_simple_table_with_enum_mut(&mut self) -> Option<&mut TestSimpleTableWithEnumT> {\n        if let Self::TestSimpleTableWithEnum(v) = self { Some(v.as_mut()) } else { None }\n    }\n\n    /// If the union variant matches, return the owned super::example_2::MonsterT, setting the union to NONE.\n    pub fn take_my_game_example_2_monster(&mut self) -> Option<alloc::boxed::Box<super::example_2::MonsterT>> {\n        if let Self::MyGameExample2Monster(_) = self {\n            let v = ::core::mem::replace(self, Self::NONE);\n            if let Self::MyGameExample2Monster(w) = v {\n                Some(w)\n            } else {\n                unreachable!()\n            }\n        } else {\n            None\n        }\n    }\n\n    /// If the union variant matches, return a reference to the super::example_2::MonsterT.\n    pub fn as_my_game_example_2_monster(&self) -> Option<&super::example_2::MonsterT> {\n        if let Self::MyGameExample2Monster(v) = self { Some(v.as_ref()) } else { None }\n    }\n\n    /// If the union variant matches, return a mutable reference to the super::example_2::MonsterT.\n    pub fn as_my_game_example_2_monster_mut(&mut self) -> Option<&mut super::example_2::MonsterT> {\n        if let Self::MyGameExample2Monster(v) = self { Some(v.as_mut()) } else { None }\n    }\n}\n\n"
  },
  {
    "path": "tests/monster_test_serialize/my_game/example/any_unique_aliases_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nextern crate serde;\nuse self::serde::ser::{Serialize, Serializer, SerializeStruct};\nuse super::*;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MIN_ANY_UNIQUE_ALIASES: u8 = 0;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MAX_ANY_UNIQUE_ALIASES: u8 = 3;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n#[allow(non_camel_case_types)]\npub const ENUM_VALUES_ANY_UNIQUE_ALIASES: [AnyUniqueAliases; 4] = [\n    AnyUniqueAliases::NONE,\n    AnyUniqueAliases::M,\n    AnyUniqueAliases::TS,\n    AnyUniqueAliases::M2,\n];\n\n#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n#[repr(transparent)]\npub struct AnyUniqueAliases(pub u8);\n\n#[allow(non_upper_case_globals)]\nimpl AnyUniqueAliases {\n    pub const NONE: Self = Self(0);\n    pub const M: Self = Self(1);\n    pub const TS: Self = Self(2);\n    pub const M2: Self = Self(3);\n\n    pub const ENUM_MIN: u8 = 0;\n    pub const ENUM_MAX: u8 = 3;\n    pub const ENUM_VALUES: &'static [Self] = &[\n        Self::NONE,\n        Self::M,\n        Self::TS,\n        Self::M2,\n    ];\n\n    /// Returns the variant's name or \"\" if unknown.\n    pub fn variant_name(self) -> Option<&'static str> {\n        match self {\n            Self::NONE => Some(\"NONE\"),\n            Self::M => Some(\"M\"),\n            Self::TS => Some(\"TS\"),\n            Self::M2 => Some(\"M2\"),\n            _ => None,\n        }\n    }\n}\n\nimpl ::core::fmt::Debug for AnyUniqueAliases {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        if let Some(name) = self.variant_name() {\n            f.write_str(name)\n        } else {\n            f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n        }\n    }\n}\n\nimpl Serialize for AnyUniqueAliases {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        serializer.serialize_unit_variant(\"AnyUniqueAliases\", self.0 as u32, self.variant_name().unwrap())\n    }\n}\n\nimpl<'de> serde::Deserialize<'de> for AnyUniqueAliases {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: serde::Deserializer<'de>,\n    {\n        let s = String::deserialize(deserializer)?;\n        for item in AnyUniqueAliases::ENUM_VALUES {\n            if let Some(item_name) = item.variant_name() {\n                if item_name == s {\n                    return Ok(item.clone());\n                }\n            }\n        }\n        Err(serde::de::Error::custom(format!(\n            \"Unknown AnyUniqueAliases variant: {s}\"\n        )))\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for AnyUniqueAliases {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<u8>(buf, loc) };\n        Self(b)\n    }\n}\n\nimpl ::flatbuffers::Push for AnyUniqueAliases {\n    type Output = AnyUniqueAliases;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<u8>(dst, self.0) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for AnyUniqueAliases {\n    type Scalar = u8;\n\n    #[inline]\n    fn to_little_endian(self) -> u8 {\n        self.0.to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: u8) -> Self {\n        let b = u8::from_le(v);\n        Self(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for AnyUniqueAliases {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        u8::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for AnyUniqueAliases {}\n\npub struct AnyUniqueAliasesUnionTableOffset {}\n\n#[allow(clippy::upper_case_acronyms)]\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub enum AnyUniqueAliasesT {\n    NONE,\n    M(alloc::boxed::Box<MonsterT>),\n    TS(alloc::boxed::Box<TestSimpleTableWithEnumT>),\n    M2(alloc::boxed::Box<super::example_2::MonsterT>),\n}\n\nimpl Default for AnyUniqueAliasesT {\n    fn default() -> Self {\n        Self::NONE\n    }\n}\n\nimpl AnyUniqueAliasesT {\n    pub fn any_unique_aliases_type(&self) -> AnyUniqueAliases {\n        match self {\n            Self::NONE => AnyUniqueAliases::NONE,\n            Self::M(_) => AnyUniqueAliases::M,\n            Self::TS(_) => AnyUniqueAliases::TS,\n            Self::M2(_) => AnyUniqueAliases::M2,\n        }\n    }\n\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(&self, fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>) -> Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>> {\n        match self {\n            Self::NONE => None,\n            Self::M(v) => Some(v.pack(fbb).as_union_value()),\n            Self::TS(v) => Some(v.pack(fbb).as_union_value()),\n            Self::M2(v) => Some(v.pack(fbb).as_union_value()),\n        }\n    }\n\n    /// If the union variant matches, return the owned MonsterT, setting the union to NONE.\n    pub fn take_m(&mut self) -> Option<alloc::boxed::Box<MonsterT>> {\n        if let Self::M(_) = self {\n            let v = ::core::mem::replace(self, Self::NONE);\n            if let Self::M(w) = v {\n                Some(w)\n            } else {\n                unreachable!()\n            }\n        } else {\n            None\n        }\n    }\n\n    /// If the union variant matches, return a reference to the MonsterT.\n    pub fn as_m(&self) -> Option<&MonsterT> {\n        if let Self::M(v) = self { Some(v.as_ref()) } else { None }\n    }\n\n    /// If the union variant matches, return a mutable reference to the MonsterT.\n    pub fn as_m_mut(&mut self) -> Option<&mut MonsterT> {\n        if let Self::M(v) = self { Some(v.as_mut()) } else { None }\n    }\n\n    /// If the union variant matches, return the owned TestSimpleTableWithEnumT, setting the union to NONE.\n    pub fn take_ts(&mut self) -> Option<alloc::boxed::Box<TestSimpleTableWithEnumT>> {\n        if let Self::TS(_) = self {\n            let v = ::core::mem::replace(self, Self::NONE);\n            if let Self::TS(w) = v {\n                Some(w)\n            } else {\n                unreachable!()\n            }\n        } else {\n            None\n        }\n    }\n\n    /// If the union variant matches, return a reference to the TestSimpleTableWithEnumT.\n    pub fn as_ts(&self) -> Option<&TestSimpleTableWithEnumT> {\n        if let Self::TS(v) = self { Some(v.as_ref()) } else { None }\n    }\n\n    /// If the union variant matches, return a mutable reference to the TestSimpleTableWithEnumT.\n    pub fn as_ts_mut(&mut self) -> Option<&mut TestSimpleTableWithEnumT> {\n        if let Self::TS(v) = self { Some(v.as_mut()) } else { None }\n    }\n\n    /// If the union variant matches, return the owned super::example_2::MonsterT, setting the union to NONE.\n    pub fn take_m2(&mut self) -> Option<alloc::boxed::Box<super::example_2::MonsterT>> {\n        if let Self::M2(_) = self {\n            let v = ::core::mem::replace(self, Self::NONE);\n            if let Self::M2(w) = v {\n                Some(w)\n            } else {\n                unreachable!()\n            }\n        } else {\n            None\n        }\n    }\n\n    /// If the union variant matches, return a reference to the super::example_2::MonsterT.\n    pub fn as_m2(&self) -> Option<&super::example_2::MonsterT> {\n        if let Self::M2(v) = self { Some(v.as_ref()) } else { None }\n    }\n\n    /// If the union variant matches, return a mutable reference to the super::example_2::MonsterT.\n    pub fn as_m2_mut(&mut self) -> Option<&mut super::example_2::MonsterT> {\n        if let Self::M2(v) = self { Some(v.as_mut()) } else { None }\n    }\n}\n\n"
  },
  {
    "path": "tests/monster_test_serialize/my_game/example/color_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nextern crate serde;\nuse self::serde::ser::{Serialize, Serializer, SerializeStruct};\nuse super::*;\n\n#[allow(non_upper_case_globals)]\nmod bitflags_color {\n    ::flatbuffers::bitflags::bitflags! {\n        /// Composite components of Monster color.\n        #[derive(Default, Debug, Clone, Copy, PartialEq)]\n        pub struct Color: u8 {\n            const Red = 1;\n            /// \\brief color Green\n            /// Green is bit_flag with value (1u << 1)\n            const Green = 2;\n            /// \\brief color Blue (1u << 3)\n            const Blue = 8;\n        }\n    }\n}\n\npub use self::bitflags_color::Color;\n\nimpl Serialize for Color {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        serializer.serialize_u32(self.bits() as u32)\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Color {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<u8>(buf, loc) };\n        Self::from_bits_retain(b)\n    }\n}\n\nimpl ::flatbuffers::Push for Color {\n    type Output = Color;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<u8>(dst, self.bits()) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for Color {\n    type Scalar = u8;\n\n    #[inline]\n    fn to_little_endian(self) -> u8 {\n        self.bits().to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: u8) -> Self {\n        let b = u8::from_le(v);\n        Self::from_bits_retain(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for Color {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        u8::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for Color {}\n"
  },
  {
    "path": "tests/monster_test_serialize/my_game/example/long_enum_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nextern crate serde;\nuse self::serde::ser::{Serialize, Serializer, SerializeStruct};\nuse super::*;\n\n#[allow(non_upper_case_globals)]\nmod bitflags_long_enum {\n    ::flatbuffers::bitflags::bitflags! {\n        #[derive(Default, Debug, Clone, Copy, PartialEq)]\n        pub struct LongEnum: u64 {\n            const LongOne = 2;\n            const LongTwo = 4;\n            const LongBig = 1099511627776;\n        }\n    }\n}\n\npub use self::bitflags_long_enum::LongEnum;\n\nimpl Serialize for LongEnum {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        serializer.serialize_u32(self.bits() as u32)\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for LongEnum {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<u64>(buf, loc) };\n        Self::from_bits_retain(b)\n    }\n}\n\nimpl ::flatbuffers::Push for LongEnum {\n    type Output = LongEnum;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<u64>(dst, self.bits()) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for LongEnum {\n    type Scalar = u64;\n\n    #[inline]\n    fn to_little_endian(self) -> u64 {\n        self.bits().to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: u64) -> Self {\n        let b = u64::from_le(v);\n        Self::from_bits_retain(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for LongEnum {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        u64::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for LongEnum {}\n"
  },
  {
    "path": "tests/monster_test_serialize/my_game/example/monster_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nextern crate serde;\nuse self::serde::ser::{Serialize, Serializer, SerializeStruct};\nuse super::*;\n\npub enum MonsterOffset {}\n\n/// an example documentation comment: \"monster object\"\n#[derive(Copy, Clone, PartialEq)]\npub struct Monster<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Monster<'a> {\n    type Inner = Monster<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> Monster<'a> {\n    pub const VT_POS: ::flatbuffers::VOffsetT = 4;\n    pub const VT_MANA: ::flatbuffers::VOffsetT = 6;\n    pub const VT_HP: ::flatbuffers::VOffsetT = 8;\n    pub const VT_NAME: ::flatbuffers::VOffsetT = 10;\n    pub const VT_INVENTORY: ::flatbuffers::VOffsetT = 14;\n    pub const VT_COLOR: ::flatbuffers::VOffsetT = 16;\n    pub const VT_TEST_TYPE: ::flatbuffers::VOffsetT = 18;\n    pub const VT_TEST: ::flatbuffers::VOffsetT = 20;\n    pub const VT_TEST4: ::flatbuffers::VOffsetT = 22;\n    pub const VT_TESTARRAYOFSTRING: ::flatbuffers::VOffsetT = 24;\n    pub const VT_TESTARRAYOFTABLES: ::flatbuffers::VOffsetT = 26;\n    pub const VT_ENEMY: ::flatbuffers::VOffsetT = 28;\n    pub const VT_TESTNESTEDFLATBUFFER: ::flatbuffers::VOffsetT = 30;\n    pub const VT_TESTEMPTY: ::flatbuffers::VOffsetT = 32;\n    pub const VT_TESTBOOL: ::flatbuffers::VOffsetT = 34;\n    pub const VT_TESTHASHS32_FNV1: ::flatbuffers::VOffsetT = 36;\n    pub const VT_TESTHASHU32_FNV1: ::flatbuffers::VOffsetT = 38;\n    pub const VT_TESTHASHS64_FNV1: ::flatbuffers::VOffsetT = 40;\n    pub const VT_TESTHASHU64_FNV1: ::flatbuffers::VOffsetT = 42;\n    pub const VT_TESTHASHS32_FNV1A: ::flatbuffers::VOffsetT = 44;\n    pub const VT_TESTHASHU32_FNV1A: ::flatbuffers::VOffsetT = 46;\n    pub const VT_TESTHASHS64_FNV1A: ::flatbuffers::VOffsetT = 48;\n    pub const VT_TESTHASHU64_FNV1A: ::flatbuffers::VOffsetT = 50;\n    pub const VT_TESTARRAYOFBOOLS: ::flatbuffers::VOffsetT = 52;\n    pub const VT_TESTF: ::flatbuffers::VOffsetT = 54;\n    pub const VT_TESTF2: ::flatbuffers::VOffsetT = 56;\n    pub const VT_TESTF3: ::flatbuffers::VOffsetT = 58;\n    pub const VT_TESTARRAYOFSTRING2: ::flatbuffers::VOffsetT = 60;\n    pub const VT_TESTARRAYOFSORTEDSTRUCT: ::flatbuffers::VOffsetT = 62;\n    pub const VT_FLEX: ::flatbuffers::VOffsetT = 64;\n    pub const VT_TEST5: ::flatbuffers::VOffsetT = 66;\n    pub const VT_VECTOR_OF_LONGS: ::flatbuffers::VOffsetT = 68;\n    pub const VT_VECTOR_OF_DOUBLES: ::flatbuffers::VOffsetT = 70;\n    pub const VT_PARENT_NAMESPACE_TEST: ::flatbuffers::VOffsetT = 72;\n    pub const VT_VECTOR_OF_REFERRABLES: ::flatbuffers::VOffsetT = 74;\n    pub const VT_SINGLE_WEAK_REFERENCE: ::flatbuffers::VOffsetT = 76;\n    pub const VT_VECTOR_OF_WEAK_REFERENCES: ::flatbuffers::VOffsetT = 78;\n    pub const VT_VECTOR_OF_STRONG_REFERRABLES: ::flatbuffers::VOffsetT = 80;\n    pub const VT_CO_OWNING_REFERENCE: ::flatbuffers::VOffsetT = 82;\n    pub const VT_VECTOR_OF_CO_OWNING_REFERENCES: ::flatbuffers::VOffsetT = 84;\n    pub const VT_NON_OWNING_REFERENCE: ::flatbuffers::VOffsetT = 86;\n    pub const VT_VECTOR_OF_NON_OWNING_REFERENCES: ::flatbuffers::VOffsetT = 88;\n    pub const VT_ANY_UNIQUE_TYPE: ::flatbuffers::VOffsetT = 90;\n    pub const VT_ANY_UNIQUE: ::flatbuffers::VOffsetT = 92;\n    pub const VT_ANY_AMBIGUOUS_TYPE: ::flatbuffers::VOffsetT = 94;\n    pub const VT_ANY_AMBIGUOUS: ::flatbuffers::VOffsetT = 96;\n    pub const VT_VECTOR_OF_ENUMS: ::flatbuffers::VOffsetT = 98;\n    pub const VT_SIGNED_ENUM: ::flatbuffers::VOffsetT = 100;\n    pub const VT_TESTREQUIREDNESTEDFLATBUFFER: ::flatbuffers::VOffsetT = 102;\n    pub const VT_SCALAR_KEY_SORTED_TABLES: ::flatbuffers::VOffsetT = 104;\n    pub const VT_NATIVE_INLINE: ::flatbuffers::VOffsetT = 106;\n    pub const VT_LONG_ENUM_NON_ENUM_DEFAULT: ::flatbuffers::VOffsetT = 108;\n    pub const VT_LONG_ENUM_NORMAL_DEFAULT: ::flatbuffers::VOffsetT = 110;\n    pub const VT_NAN_DEFAULT: ::flatbuffers::VOffsetT = 112;\n    pub const VT_INF_DEFAULT: ::flatbuffers::VOffsetT = 114;\n    pub const VT_POSITIVE_INF_DEFAULT: ::flatbuffers::VOffsetT = 116;\n    pub const VT_INFINITY_DEFAULT: ::flatbuffers::VOffsetT = 118;\n    pub const VT_POSITIVE_INFINITY_DEFAULT: ::flatbuffers::VOffsetT = 120;\n    pub const VT_NEGATIVE_INF_DEFAULT: ::flatbuffers::VOffsetT = 122;\n    pub const VT_NEGATIVE_INFINITY_DEFAULT: ::flatbuffers::VOffsetT = 124;\n    pub const VT_DOUBLE_INF_DEFAULT: ::flatbuffers::VOffsetT = 126;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.Example.Monster\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        Monster { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args MonsterArgs<'args>\n    ) -> ::flatbuffers::WIPOffset<Monster<'bldr>> {\n        let mut builder = MonsterBuilder::new(_fbb);\n        builder.add_double_inf_default(args.double_inf_default);\n        builder.add_long_enum_normal_default(args.long_enum_normal_default);\n        builder.add_long_enum_non_enum_default(args.long_enum_non_enum_default);\n        builder.add_non_owning_reference(args.non_owning_reference);\n        builder.add_co_owning_reference(args.co_owning_reference);\n        builder.add_single_weak_reference(args.single_weak_reference);\n        builder.add_testhashu64_fnv1a(args.testhashu64_fnv1a);\n        builder.add_testhashs64_fnv1a(args.testhashs64_fnv1a);\n        builder.add_testhashu64_fnv1(args.testhashu64_fnv1);\n        builder.add_testhashs64_fnv1(args.testhashs64_fnv1);\n        builder.add_negative_infinity_default(args.negative_infinity_default);\n        builder.add_negative_inf_default(args.negative_inf_default);\n        builder.add_positive_infinity_default(args.positive_infinity_default);\n        builder.add_infinity_default(args.infinity_default);\n        builder.add_positive_inf_default(args.positive_inf_default);\n        builder.add_inf_default(args.inf_default);\n        builder.add_nan_default(args.nan_default);\n        if let Some(x) = args.native_inline { builder.add_native_inline(x); }\n        if let Some(x) = args.scalar_key_sorted_tables { builder.add_scalar_key_sorted_tables(x); }\n        if let Some(x) = args.testrequirednestedflatbuffer { builder.add_testrequirednestedflatbuffer(x); }\n        if let Some(x) = args.vector_of_enums { builder.add_vector_of_enums(x); }\n        if let Some(x) = args.any_ambiguous { builder.add_any_ambiguous(x); }\n        if let Some(x) = args.any_unique { builder.add_any_unique(x); }\n        if let Some(x) = args.vector_of_non_owning_references { builder.add_vector_of_non_owning_references(x); }\n        if let Some(x) = args.vector_of_co_owning_references { builder.add_vector_of_co_owning_references(x); }\n        if let Some(x) = args.vector_of_strong_referrables { builder.add_vector_of_strong_referrables(x); }\n        if let Some(x) = args.vector_of_weak_references { builder.add_vector_of_weak_references(x); }\n        if let Some(x) = args.vector_of_referrables { builder.add_vector_of_referrables(x); }\n        if let Some(x) = args.parent_namespace_test { builder.add_parent_namespace_test(x); }\n        if let Some(x) = args.vector_of_doubles { builder.add_vector_of_doubles(x); }\n        if let Some(x) = args.vector_of_longs { builder.add_vector_of_longs(x); }\n        if let Some(x) = args.test5 { builder.add_test5(x); }\n        if let Some(x) = args.flex { builder.add_flex(x); }\n        if let Some(x) = args.testarrayofsortedstruct { builder.add_testarrayofsortedstruct(x); }\n        if let Some(x) = args.testarrayofstring2 { builder.add_testarrayofstring2(x); }\n        builder.add_testf3(args.testf3);\n        builder.add_testf2(args.testf2);\n        builder.add_testf(args.testf);\n        if let Some(x) = args.testarrayofbools { builder.add_testarrayofbools(x); }\n        builder.add_testhashu32_fnv1a(args.testhashu32_fnv1a);\n        builder.add_testhashs32_fnv1a(args.testhashs32_fnv1a);\n        builder.add_testhashu32_fnv1(args.testhashu32_fnv1);\n        builder.add_testhashs32_fnv1(args.testhashs32_fnv1);\n        if let Some(x) = args.testempty { builder.add_testempty(x); }\n        if let Some(x) = args.testnestedflatbuffer { builder.add_testnestedflatbuffer(x); }\n        if let Some(x) = args.enemy { builder.add_enemy(x); }\n        if let Some(x) = args.testarrayoftables { builder.add_testarrayoftables(x); }\n        if let Some(x) = args.testarrayofstring { builder.add_testarrayofstring(x); }\n        if let Some(x) = args.test4 { builder.add_test4(x); }\n        if let Some(x) = args.test { builder.add_test(x); }\n        if let Some(x) = args.inventory { builder.add_inventory(x); }\n        if let Some(x) = args.name { builder.add_name(x); }\n        if let Some(x) = args.pos { builder.add_pos(x); }\n        builder.add_hp(args.hp);\n        builder.add_mana(args.mana);\n        builder.add_signed_enum(args.signed_enum);\n        builder.add_any_ambiguous_type(args.any_ambiguous_type);\n        builder.add_any_unique_type(args.any_unique_type);\n        builder.add_testbool(args.testbool);\n        builder.add_test_type(args.test_type);\n        builder.add_color(args.color);\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> MonsterT {\n        let pos = self.pos().map(|x| {\n            x.unpack()\n        });\n        let mana = self.mana();\n        let hp = self.hp();\n        let name = {\n            let x = self.name();\n            alloc::string::ToString::to_string(x)\n        };\n        let inventory = self.inventory().map(|x| {\n            x.into_iter().collect()\n        });\n        let color = self.color();\n        let test = match self.test_type() {\n            Any::NONE => AnyT::NONE,\n            Any::Monster => AnyT::Monster(alloc::boxed::Box::new(\n                self.test_as_monster()\n                    .expect(\"Invalid union table, expected `Any::Monster`.\")\n                    .unpack()\n            )),\n            Any::TestSimpleTableWithEnum => AnyT::TestSimpleTableWithEnum(alloc::boxed::Box::new(\n                self.test_as_test_simple_table_with_enum()\n                    .expect(\"Invalid union table, expected `Any::TestSimpleTableWithEnum`.\")\n                    .unpack()\n            )),\n            Any::MyGame_Example2_Monster => AnyT::MyGameExample2Monster(alloc::boxed::Box::new(\n                self.test_as_my_game_example_2_monster()\n                    .expect(\"Invalid union table, expected `Any::MyGame_Example2_Monster`.\")\n                    .unpack()\n            )),\n            _ => AnyT::NONE,\n        };\n        let test4 = self.test4().map(|x| {\n            x.iter().map(|t| t.unpack()).collect()\n        });\n        let testarrayofstring = self.testarrayofstring().map(|x| {\n            x.iter().map(|s| alloc::string::ToString::to_string(s)).collect()\n        });\n        let testarrayoftables = self.testarrayoftables().map(|x| {\n            x.iter().map(|t| t.unpack()).collect()\n        });\n        let enemy = self.enemy().map(|x| {\n            alloc::boxed::Box::new(x.unpack())\n        });\n        let testnestedflatbuffer = self.testnestedflatbuffer().map(|x| {\n            x.into_iter().collect()\n        });\n        let testempty = self.testempty().map(|x| {\n            alloc::boxed::Box::new(x.unpack())\n        });\n        let testbool = self.testbool();\n        let testhashs32_fnv1 = self.testhashs32_fnv1();\n        let testhashu32_fnv1 = self.testhashu32_fnv1();\n        let testhashs64_fnv1 = self.testhashs64_fnv1();\n        let testhashu64_fnv1 = self.testhashu64_fnv1();\n        let testhashs32_fnv1a = self.testhashs32_fnv1a();\n        let testhashu32_fnv1a = self.testhashu32_fnv1a();\n        let testhashs64_fnv1a = self.testhashs64_fnv1a();\n        let testhashu64_fnv1a = self.testhashu64_fnv1a();\n        let testarrayofbools = self.testarrayofbools().map(|x| {\n            x.into_iter().collect()\n        });\n        let testf = self.testf();\n        let testf2 = self.testf2();\n        let testf3 = self.testf3();\n        let testarrayofstring2 = self.testarrayofstring2().map(|x| {\n            x.iter().map(|s| alloc::string::ToString::to_string(s)).collect()\n        });\n        let testarrayofsortedstruct = self.testarrayofsortedstruct().map(|x| {\n            x.iter().map(|t| t.unpack()).collect()\n        });\n        let flex = self.flex().map(|x| {\n            x.into_iter().collect()\n        });\n        let test5 = self.test5().map(|x| {\n            x.iter().map(|t| t.unpack()).collect()\n        });\n        let vector_of_longs = self.vector_of_longs().map(|x| {\n            x.into_iter().collect()\n        });\n        let vector_of_doubles = self.vector_of_doubles().map(|x| {\n            x.into_iter().collect()\n        });\n        let parent_namespace_test = self.parent_namespace_test().map(|x| {\n            alloc::boxed::Box::new(x.unpack())\n        });\n        let vector_of_referrables = self.vector_of_referrables().map(|x| {\n            x.iter().map(|t| t.unpack()).collect()\n        });\n        let single_weak_reference = self.single_weak_reference();\n        let vector_of_weak_references = self.vector_of_weak_references().map(|x| {\n            x.into_iter().collect()\n        });\n        let vector_of_strong_referrables = self.vector_of_strong_referrables().map(|x| {\n            x.iter().map(|t| t.unpack()).collect()\n        });\n        let co_owning_reference = self.co_owning_reference();\n        let vector_of_co_owning_references = self.vector_of_co_owning_references().map(|x| {\n            x.into_iter().collect()\n        });\n        let non_owning_reference = self.non_owning_reference();\n        let vector_of_non_owning_references = self.vector_of_non_owning_references().map(|x| {\n            x.into_iter().collect()\n        });\n        let any_unique = match self.any_unique_type() {\n            AnyUniqueAliases::NONE => AnyUniqueAliasesT::NONE,\n            AnyUniqueAliases::M => AnyUniqueAliasesT::M(alloc::boxed::Box::new(\n                self.any_unique_as_m()\n                    .expect(\"Invalid union table, expected `AnyUniqueAliases::M`.\")\n                    .unpack()\n            )),\n            AnyUniqueAliases::TS => AnyUniqueAliasesT::TS(alloc::boxed::Box::new(\n                self.any_unique_as_ts()\n                    .expect(\"Invalid union table, expected `AnyUniqueAliases::TS`.\")\n                    .unpack()\n            )),\n            AnyUniqueAliases::M2 => AnyUniqueAliasesT::M2(alloc::boxed::Box::new(\n                self.any_unique_as_m2()\n                    .expect(\"Invalid union table, expected `AnyUniqueAliases::M2`.\")\n                    .unpack()\n            )),\n            _ => AnyUniqueAliasesT::NONE,\n        };\n        let any_ambiguous = match self.any_ambiguous_type() {\n            AnyAmbiguousAliases::NONE => AnyAmbiguousAliasesT::NONE,\n            AnyAmbiguousAliases::M1 => AnyAmbiguousAliasesT::M1(alloc::boxed::Box::new(\n                self.any_ambiguous_as_m1()\n                    .expect(\"Invalid union table, expected `AnyAmbiguousAliases::M1`.\")\n                    .unpack()\n            )),\n            AnyAmbiguousAliases::M2 => AnyAmbiguousAliasesT::M2(alloc::boxed::Box::new(\n                self.any_ambiguous_as_m2()\n                    .expect(\"Invalid union table, expected `AnyAmbiguousAliases::M2`.\")\n                    .unpack()\n            )),\n            AnyAmbiguousAliases::M3 => AnyAmbiguousAliasesT::M3(alloc::boxed::Box::new(\n                self.any_ambiguous_as_m3()\n                    .expect(\"Invalid union table, expected `AnyAmbiguousAliases::M3`.\")\n                    .unpack()\n            )),\n            _ => AnyAmbiguousAliasesT::NONE,\n        };\n        let vector_of_enums = self.vector_of_enums().map(|x| {\n            x.into_iter().collect()\n        });\n        let signed_enum = self.signed_enum();\n        let testrequirednestedflatbuffer = self.testrequirednestedflatbuffer().map(|x| {\n            x.into_iter().collect()\n        });\n        let scalar_key_sorted_tables = self.scalar_key_sorted_tables().map(|x| {\n            x.iter().map(|t| t.unpack()).collect()\n        });\n        let native_inline = self.native_inline().map(|x| {\n            x.unpack()\n        });\n        let long_enum_non_enum_default = self.long_enum_non_enum_default();\n        let long_enum_normal_default = self.long_enum_normal_default();\n        let nan_default = self.nan_default();\n        let inf_default = self.inf_default();\n        let positive_inf_default = self.positive_inf_default();\n        let infinity_default = self.infinity_default();\n        let positive_infinity_default = self.positive_infinity_default();\n        let negative_inf_default = self.negative_inf_default();\n        let negative_infinity_default = self.negative_infinity_default();\n        let double_inf_default = self.double_inf_default();\n        MonsterT {\n            pos,\n            mana,\n            hp,\n            name,\n            inventory,\n            color,\n            test,\n            test4,\n            testarrayofstring,\n            testarrayoftables,\n            enemy,\n            testnestedflatbuffer,\n            testempty,\n            testbool,\n            testhashs32_fnv1,\n            testhashu32_fnv1,\n            testhashs64_fnv1,\n            testhashu64_fnv1,\n            testhashs32_fnv1a,\n            testhashu32_fnv1a,\n            testhashs64_fnv1a,\n            testhashu64_fnv1a,\n            testarrayofbools,\n            testf,\n            testf2,\n            testf3,\n            testarrayofstring2,\n            testarrayofsortedstruct,\n            flex,\n            test5,\n            vector_of_longs,\n            vector_of_doubles,\n            parent_namespace_test,\n            vector_of_referrables,\n            single_weak_reference,\n            vector_of_weak_references,\n            vector_of_strong_referrables,\n            co_owning_reference,\n            vector_of_co_owning_references,\n            non_owning_reference,\n            vector_of_non_owning_references,\n            any_unique,\n            any_ambiguous,\n            vector_of_enums,\n            signed_enum,\n            testrequirednestedflatbuffer,\n            scalar_key_sorted_tables,\n            native_inline,\n            long_enum_non_enum_default,\n            long_enum_normal_default,\n            nan_default,\n            inf_default,\n            positive_inf_default,\n            infinity_default,\n            positive_infinity_default,\n            negative_inf_default,\n            negative_infinity_default,\n            double_inf_default,\n        }\n    }\n\n    #[inline]\n    pub fn pos(&self) -> Option<&'a Vec3> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<Vec3>(Monster::VT_POS, None)}\n    }\n\n    #[inline]\n    pub fn mana(&self) -> i16 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i16>(Monster::VT_MANA, Some(150)).unwrap()}\n    }\n\n    #[inline]\n    pub fn hp(&self) -> i16 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i16>(Monster::VT_HP, Some(100)).unwrap()}\n    }\n\n    #[inline]\n    pub fn name(&self) -> &'a str {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<&str>>(Monster::VT_NAME, None).unwrap()}\n    }\n\n    #[inline]\n    pub fn key_compare_less_than(&self, o: &Monster) -> bool {\n        self.name() < o.name()\n    }\n\n    #[inline]\n    pub fn key_compare_with_value(&self, val: & str) -> ::core::cmp::Ordering {\n        let key = self.name();\n        key.cmp(val)\n    }\n\n    #[inline]\n    pub fn inventory(&self) -> Option<::flatbuffers::Vector<'a, u8>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, u8>>>(Monster::VT_INVENTORY, None)}\n    }\n\n    #[inline]\n    pub fn color(&self) -> Color {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<Color>(Monster::VT_COLOR, Some(Color::Blue)).unwrap()}\n    }\n\n    #[inline]\n    pub fn test_type(&self) -> Any {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<Any>(Monster::VT_TEST_TYPE, Some(Any::NONE)).unwrap()}\n    }\n\n    #[inline]\n    pub fn test(&self) -> Option<::flatbuffers::Table<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Table<'a>>>(Monster::VT_TEST, None)}\n    }\n\n    #[inline]\n    pub fn test4(&self) -> Option<::flatbuffers::Vector<'a, Test>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, Test>>>(Monster::VT_TEST4, None)}\n    }\n\n    #[inline]\n    pub fn testarrayofstring(&self) -> Option<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<&'a str>>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<&'a str>>>>(Monster::VT_TESTARRAYOFSTRING, None)}\n    }\n\n    /// an example documentation comment: this will end up in the generated code\n    /// multiline too\n    #[inline]\n    pub fn testarrayoftables(&self) -> Option<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Monster<'a>>>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Monster>>>>(Monster::VT_TESTARRAYOFTABLES, None)}\n    }\n\n    #[inline]\n    pub fn enemy(&self) -> Option<Monster<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<Monster>>(Monster::VT_ENEMY, None)}\n    }\n\n    #[inline]\n    pub fn testnestedflatbuffer(&self) -> Option<::flatbuffers::Vector<'a, u8>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, u8>>>(Monster::VT_TESTNESTEDFLATBUFFER, None)}\n    }\n\n    pub fn testnestedflatbuffer_nested_flatbuffer(&'a self) -> Option<Monster<'a>> {\n        self.testnestedflatbuffer().map(|data| {\n            use ::flatbuffers::Follow;\n            // Safety:\n            // Created from a valid Table for this object\n            // Which contains a valid flatbuffer in this slot\n            unsafe { <::flatbuffers::ForwardsUOffset<Monster<'a>>>::follow(data.bytes(), 0) }\n        })\n    }\n\n    #[inline]\n    pub fn testempty(&self) -> Option<Stat<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<Stat>>(Monster::VT_TESTEMPTY, None)}\n    }\n\n    #[inline]\n    pub fn testbool(&self) -> bool {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<bool>(Monster::VT_TESTBOOL, Some(false)).unwrap()}\n    }\n\n    #[inline]\n    pub fn testhashs32_fnv1(&self) -> i32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i32>(Monster::VT_TESTHASHS32_FNV1, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn testhashu32_fnv1(&self) -> u32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u32>(Monster::VT_TESTHASHU32_FNV1, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn testhashs64_fnv1(&self) -> i64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i64>(Monster::VT_TESTHASHS64_FNV1, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn testhashu64_fnv1(&self) -> u64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u64>(Monster::VT_TESTHASHU64_FNV1, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn testhashs32_fnv1a(&self) -> i32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i32>(Monster::VT_TESTHASHS32_FNV1A, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn testhashu32_fnv1a(&self) -> u32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u32>(Monster::VT_TESTHASHU32_FNV1A, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn testhashs64_fnv1a(&self) -> i64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i64>(Monster::VT_TESTHASHS64_FNV1A, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn testhashu64_fnv1a(&self) -> u64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u64>(Monster::VT_TESTHASHU64_FNV1A, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn testarrayofbools(&self) -> Option<::flatbuffers::Vector<'a, bool>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, bool>>>(Monster::VT_TESTARRAYOFBOOLS, None)}\n    }\n\n    #[inline]\n    pub fn testf(&self) -> f32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f32>(Monster::VT_TESTF, Some(3.14159)).unwrap()}\n    }\n\n    #[inline]\n    pub fn testf2(&self) -> f32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f32>(Monster::VT_TESTF2, Some(3.0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn testf3(&self) -> f32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f32>(Monster::VT_TESTF3, Some(0.0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn testarrayofstring2(&self) -> Option<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<&'a str>>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<&'a str>>>>(Monster::VT_TESTARRAYOFSTRING2, None)}\n    }\n\n    #[inline]\n    pub fn testarrayofsortedstruct(&self) -> Option<::flatbuffers::Vector<'a, Ability>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, Ability>>>(Monster::VT_TESTARRAYOFSORTEDSTRUCT, None)}\n    }\n\n    #[inline]\n    pub fn flex(&self) -> Option<::flatbuffers::Vector<'a, u8>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, u8>>>(Monster::VT_FLEX, None)}\n    }\n\n    #[inline]\n    pub fn test5(&self) -> Option<::flatbuffers::Vector<'a, Test>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, Test>>>(Monster::VT_TEST5, None)}\n    }\n\n    #[inline]\n    pub fn vector_of_longs(&self) -> Option<::flatbuffers::Vector<'a, i64>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, i64>>>(Monster::VT_VECTOR_OF_LONGS, None)}\n    }\n\n    #[inline]\n    pub fn vector_of_doubles(&self) -> Option<::flatbuffers::Vector<'a, f64>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, f64>>>(Monster::VT_VECTOR_OF_DOUBLES, None)}\n    }\n\n    #[inline]\n    pub fn parent_namespace_test(&self) -> Option<super::InParentNamespace<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<super::InParentNamespace>>(Monster::VT_PARENT_NAMESPACE_TEST, None)}\n    }\n\n    #[inline]\n    pub fn vector_of_referrables(&self) -> Option<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Referrable<'a>>>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Referrable>>>>(Monster::VT_VECTOR_OF_REFERRABLES, None)}\n    }\n\n    #[inline]\n    pub fn single_weak_reference(&self) -> u64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u64>(Monster::VT_SINGLE_WEAK_REFERENCE, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn vector_of_weak_references(&self) -> Option<::flatbuffers::Vector<'a, u64>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, u64>>>(Monster::VT_VECTOR_OF_WEAK_REFERENCES, None)}\n    }\n\n    #[inline]\n    pub fn vector_of_strong_referrables(&self) -> Option<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Referrable<'a>>>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Referrable>>>>(Monster::VT_VECTOR_OF_STRONG_REFERRABLES, None)}\n    }\n\n    #[inline]\n    pub fn co_owning_reference(&self) -> u64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u64>(Monster::VT_CO_OWNING_REFERENCE, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn vector_of_co_owning_references(&self) -> Option<::flatbuffers::Vector<'a, u64>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, u64>>>(Monster::VT_VECTOR_OF_CO_OWNING_REFERENCES, None)}\n    }\n\n    #[inline]\n    pub fn non_owning_reference(&self) -> u64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u64>(Monster::VT_NON_OWNING_REFERENCE, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn vector_of_non_owning_references(&self) -> Option<::flatbuffers::Vector<'a, u64>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, u64>>>(Monster::VT_VECTOR_OF_NON_OWNING_REFERENCES, None)}\n    }\n\n    #[inline]\n    pub fn any_unique_type(&self) -> AnyUniqueAliases {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<AnyUniqueAliases>(Monster::VT_ANY_UNIQUE_TYPE, Some(AnyUniqueAliases::NONE)).unwrap()}\n    }\n\n    #[inline]\n    pub fn any_unique(&self) -> Option<::flatbuffers::Table<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Table<'a>>>(Monster::VT_ANY_UNIQUE, None)}\n    }\n\n    #[inline]\n    pub fn any_ambiguous_type(&self) -> AnyAmbiguousAliases {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<AnyAmbiguousAliases>(Monster::VT_ANY_AMBIGUOUS_TYPE, Some(AnyAmbiguousAliases::NONE)).unwrap()}\n    }\n\n    #[inline]\n    pub fn any_ambiguous(&self) -> Option<::flatbuffers::Table<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Table<'a>>>(Monster::VT_ANY_AMBIGUOUS, None)}\n    }\n\n    #[inline]\n    pub fn vector_of_enums(&self) -> Option<::flatbuffers::Vector<'a, Color>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, Color>>>(Monster::VT_VECTOR_OF_ENUMS, None)}\n    }\n\n    #[inline]\n    pub fn signed_enum(&self) -> Race {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<Race>(Monster::VT_SIGNED_ENUM, Some(Race::None)).unwrap()}\n    }\n\n    #[inline]\n    pub fn testrequirednestedflatbuffer(&self) -> Option<::flatbuffers::Vector<'a, u8>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, u8>>>(Monster::VT_TESTREQUIREDNESTEDFLATBUFFER, None)}\n    }\n\n    pub fn testrequirednestedflatbuffer_nested_flatbuffer(&'a self) -> Option<Monster<'a>> {\n        self.testrequirednestedflatbuffer().map(|data| {\n            use ::flatbuffers::Follow;\n            // Safety:\n            // Created from a valid Table for this object\n            // Which contains a valid flatbuffer in this slot\n            unsafe { <::flatbuffers::ForwardsUOffset<Monster<'a>>>::follow(data.bytes(), 0) }\n        })\n    }\n\n    #[inline]\n    pub fn scalar_key_sorted_tables(&self) -> Option<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Stat<'a>>>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Stat>>>>(Monster::VT_SCALAR_KEY_SORTED_TABLES, None)}\n    }\n\n    #[inline]\n    pub fn native_inline(&self) -> Option<&'a Test> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<Test>(Monster::VT_NATIVE_INLINE, None)}\n    }\n\n    #[inline]\n    pub fn long_enum_non_enum_default(&self) -> LongEnum {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<LongEnum>(Monster::VT_LONG_ENUM_NON_ENUM_DEFAULT, Some(Default::default())).unwrap()}\n    }\n\n    #[inline]\n    pub fn long_enum_normal_default(&self) -> LongEnum {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<LongEnum>(Monster::VT_LONG_ENUM_NORMAL_DEFAULT, Some(LongEnum::LongOne)).unwrap()}\n    }\n\n    #[inline]\n    pub fn nan_default(&self) -> f32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f32>(Monster::VT_NAN_DEFAULT, Some(f32::NAN)).unwrap()}\n    }\n\n    #[inline]\n    pub fn inf_default(&self) -> f32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f32>(Monster::VT_INF_DEFAULT, Some(f32::INFINITY)).unwrap()}\n    }\n\n    #[inline]\n    pub fn positive_inf_default(&self) -> f32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f32>(Monster::VT_POSITIVE_INF_DEFAULT, Some(f32::INFINITY)).unwrap()}\n    }\n\n    #[inline]\n    pub fn infinity_default(&self) -> f32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f32>(Monster::VT_INFINITY_DEFAULT, Some(f32::INFINITY)).unwrap()}\n    }\n\n    #[inline]\n    pub fn positive_infinity_default(&self) -> f32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f32>(Monster::VT_POSITIVE_INFINITY_DEFAULT, Some(f32::INFINITY)).unwrap()}\n    }\n\n    #[inline]\n    pub fn negative_inf_default(&self) -> f32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f32>(Monster::VT_NEGATIVE_INF_DEFAULT, Some(f32::NEG_INFINITY)).unwrap()}\n    }\n\n    #[inline]\n    pub fn negative_infinity_default(&self) -> f32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f32>(Monster::VT_NEGATIVE_INFINITY_DEFAULT, Some(f32::NEG_INFINITY)).unwrap()}\n    }\n\n    #[inline]\n    pub fn double_inf_default(&self) -> f64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f64>(Monster::VT_DOUBLE_INF_DEFAULT, Some(f64::INFINITY)).unwrap()}\n    }\n\n    #[inline]\n    #[allow(non_snake_case)]\n    pub fn test_as_monster(&self) -> Option<Monster<'a>> {\n        if self.test_type() == Any::Monster {\n            self.test().map(|t| {\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid union in this slot\n                unsafe { Monster::init_from_table(t) }\n            })\n        } else {\n            None\n        }\n    }\n\n    #[inline]\n    #[allow(non_snake_case)]\n    pub fn test_as_test_simple_table_with_enum(&self) -> Option<TestSimpleTableWithEnum<'a>> {\n        if self.test_type() == Any::TestSimpleTableWithEnum {\n            self.test().map(|t| {\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid union in this slot\n                unsafe { TestSimpleTableWithEnum::init_from_table(t) }\n            })\n        } else {\n            None\n        }\n    }\n\n    #[inline]\n    #[allow(non_snake_case)]\n    pub fn test_as_my_game_example_2_monster(&self) -> Option<super::example_2::Monster<'a>> {\n        if self.test_type() == Any::MyGame_Example2_Monster {\n            self.test().map(|t| {\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid union in this slot\n                unsafe { super::example_2::Monster::init_from_table(t) }\n            })\n        } else {\n            None\n        }\n    }\n\n    #[inline]\n    #[allow(non_snake_case)]\n    pub fn any_unique_as_m(&self) -> Option<Monster<'a>> {\n        if self.any_unique_type() == AnyUniqueAliases::M {\n            self.any_unique().map(|t| {\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid union in this slot\n                unsafe { Monster::init_from_table(t) }\n            })\n        } else {\n            None\n        }\n    }\n\n    #[inline]\n    #[allow(non_snake_case)]\n    pub fn any_unique_as_ts(&self) -> Option<TestSimpleTableWithEnum<'a>> {\n        if self.any_unique_type() == AnyUniqueAliases::TS {\n            self.any_unique().map(|t| {\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid union in this slot\n                unsafe { TestSimpleTableWithEnum::init_from_table(t) }\n            })\n        } else {\n            None\n        }\n    }\n\n    #[inline]\n    #[allow(non_snake_case)]\n    pub fn any_unique_as_m2(&self) -> Option<super::example_2::Monster<'a>> {\n        if self.any_unique_type() == AnyUniqueAliases::M2 {\n            self.any_unique().map(|t| {\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid union in this slot\n                unsafe { super::example_2::Monster::init_from_table(t) }\n            })\n        } else {\n            None\n        }\n    }\n\n    #[inline]\n    #[allow(non_snake_case)]\n    pub fn any_ambiguous_as_m1(&self) -> Option<Monster<'a>> {\n        if self.any_ambiguous_type() == AnyAmbiguousAliases::M1 {\n            self.any_ambiguous().map(|t| {\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid union in this slot\n                unsafe { Monster::init_from_table(t) }\n            })\n        } else {\n            None\n        }\n    }\n\n    #[inline]\n    #[allow(non_snake_case)]\n    pub fn any_ambiguous_as_m2(&self) -> Option<Monster<'a>> {\n        if self.any_ambiguous_type() == AnyAmbiguousAliases::M2 {\n            self.any_ambiguous().map(|t| {\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid union in this slot\n                unsafe { Monster::init_from_table(t) }\n            })\n        } else {\n            None\n        }\n    }\n\n    #[inline]\n    #[allow(non_snake_case)]\n    pub fn any_ambiguous_as_m3(&self) -> Option<Monster<'a>> {\n        if self.any_ambiguous_type() == AnyAmbiguousAliases::M3 {\n            self.any_ambiguous().map(|t| {\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid union in this slot\n                unsafe { Monster::init_from_table(t) }\n            })\n        } else {\n            None\n        }\n    }\n}\n\nimpl ::flatbuffers::Verifiable for Monster<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<Vec3>(\"pos\", Self::VT_POS, false)?\n            .visit_field::<i16>(\"mana\", Self::VT_MANA, false)?\n            .visit_field::<i16>(\"hp\", Self::VT_HP, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<&str>>(\"name\", Self::VT_NAME, true)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, u8>>>(\"inventory\", Self::VT_INVENTORY, false)?\n            .visit_field::<Color>(\"color\", Self::VT_COLOR, false)?\n            .visit_union::<Any, _>(\"test_type\", Self::VT_TEST_TYPE, \"test\", Self::VT_TEST, false, |key, v, pos| {\n                match key {\n                    Any::Monster => v.verify_union_variant::<::flatbuffers::ForwardsUOffset<Monster>>(\"Any::Monster\", pos),\n                    Any::TestSimpleTableWithEnum => v.verify_union_variant::<::flatbuffers::ForwardsUOffset<TestSimpleTableWithEnum>>(\"Any::TestSimpleTableWithEnum\", pos),\n                    Any::MyGame_Example2_Monster => v.verify_union_variant::<::flatbuffers::ForwardsUOffset<super::example_2::Monster>>(\"Any::MyGame_Example2_Monster\", pos),\n                    _ => Ok(()),\n                }\n            })?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, Test>>>(\"test4\", Self::VT_TEST4, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, ::flatbuffers::ForwardsUOffset<&'_ str>>>>(\"testarrayofstring\", Self::VT_TESTARRAYOFSTRING, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, ::flatbuffers::ForwardsUOffset<Monster>>>>(\"testarrayoftables\", Self::VT_TESTARRAYOFTABLES, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<Monster>>(\"enemy\", Self::VT_ENEMY, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, u8>>>(\"testnestedflatbuffer\", Self::VT_TESTNESTEDFLATBUFFER, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<Stat>>(\"testempty\", Self::VT_TESTEMPTY, false)?\n            .visit_field::<bool>(\"testbool\", Self::VT_TESTBOOL, false)?\n            .visit_field::<i32>(\"testhashs32_fnv1\", Self::VT_TESTHASHS32_FNV1, false)?\n            .visit_field::<u32>(\"testhashu32_fnv1\", Self::VT_TESTHASHU32_FNV1, false)?\n            .visit_field::<i64>(\"testhashs64_fnv1\", Self::VT_TESTHASHS64_FNV1, false)?\n            .visit_field::<u64>(\"testhashu64_fnv1\", Self::VT_TESTHASHU64_FNV1, false)?\n            .visit_field::<i32>(\"testhashs32_fnv1a\", Self::VT_TESTHASHS32_FNV1A, false)?\n            .visit_field::<u32>(\"testhashu32_fnv1a\", Self::VT_TESTHASHU32_FNV1A, false)?\n            .visit_field::<i64>(\"testhashs64_fnv1a\", Self::VT_TESTHASHS64_FNV1A, false)?\n            .visit_field::<u64>(\"testhashu64_fnv1a\", Self::VT_TESTHASHU64_FNV1A, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, bool>>>(\"testarrayofbools\", Self::VT_TESTARRAYOFBOOLS, false)?\n            .visit_field::<f32>(\"testf\", Self::VT_TESTF, false)?\n            .visit_field::<f32>(\"testf2\", Self::VT_TESTF2, false)?\n            .visit_field::<f32>(\"testf3\", Self::VT_TESTF3, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, ::flatbuffers::ForwardsUOffset<&'_ str>>>>(\"testarrayofstring2\", Self::VT_TESTARRAYOFSTRING2, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, Ability>>>(\"testarrayofsortedstruct\", Self::VT_TESTARRAYOFSORTEDSTRUCT, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, u8>>>(\"flex\", Self::VT_FLEX, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, Test>>>(\"test5\", Self::VT_TEST5, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, i64>>>(\"vector_of_longs\", Self::VT_VECTOR_OF_LONGS, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, f64>>>(\"vector_of_doubles\", Self::VT_VECTOR_OF_DOUBLES, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<super::InParentNamespace>>(\"parent_namespace_test\", Self::VT_PARENT_NAMESPACE_TEST, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, ::flatbuffers::ForwardsUOffset<Referrable>>>>(\"vector_of_referrables\", Self::VT_VECTOR_OF_REFERRABLES, false)?\n            .visit_field::<u64>(\"single_weak_reference\", Self::VT_SINGLE_WEAK_REFERENCE, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, u64>>>(\"vector_of_weak_references\", Self::VT_VECTOR_OF_WEAK_REFERENCES, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, ::flatbuffers::ForwardsUOffset<Referrable>>>>(\"vector_of_strong_referrables\", Self::VT_VECTOR_OF_STRONG_REFERRABLES, false)?\n            .visit_field::<u64>(\"co_owning_reference\", Self::VT_CO_OWNING_REFERENCE, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, u64>>>(\"vector_of_co_owning_references\", Self::VT_VECTOR_OF_CO_OWNING_REFERENCES, false)?\n            .visit_field::<u64>(\"non_owning_reference\", Self::VT_NON_OWNING_REFERENCE, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, u64>>>(\"vector_of_non_owning_references\", Self::VT_VECTOR_OF_NON_OWNING_REFERENCES, false)?\n            .visit_union::<AnyUniqueAliases, _>(\"any_unique_type\", Self::VT_ANY_UNIQUE_TYPE, \"any_unique\", Self::VT_ANY_UNIQUE, false, |key, v, pos| {\n                match key {\n                    AnyUniqueAliases::M => v.verify_union_variant::<::flatbuffers::ForwardsUOffset<Monster>>(\"AnyUniqueAliases::M\", pos),\n                    AnyUniqueAliases::TS => v.verify_union_variant::<::flatbuffers::ForwardsUOffset<TestSimpleTableWithEnum>>(\"AnyUniqueAliases::TS\", pos),\n                    AnyUniqueAliases::M2 => v.verify_union_variant::<::flatbuffers::ForwardsUOffset<super::example_2::Monster>>(\"AnyUniqueAliases::M2\", pos),\n                    _ => Ok(()),\n                }\n            })?\n            .visit_union::<AnyAmbiguousAliases, _>(\"any_ambiguous_type\", Self::VT_ANY_AMBIGUOUS_TYPE, \"any_ambiguous\", Self::VT_ANY_AMBIGUOUS, false, |key, v, pos| {\n                match key {\n                    AnyAmbiguousAliases::M1 => v.verify_union_variant::<::flatbuffers::ForwardsUOffset<Monster>>(\"AnyAmbiguousAliases::M1\", pos),\n                    AnyAmbiguousAliases::M2 => v.verify_union_variant::<::flatbuffers::ForwardsUOffset<Monster>>(\"AnyAmbiguousAliases::M2\", pos),\n                    AnyAmbiguousAliases::M3 => v.verify_union_variant::<::flatbuffers::ForwardsUOffset<Monster>>(\"AnyAmbiguousAliases::M3\", pos),\n                    _ => Ok(()),\n                }\n            })?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, Color>>>(\"vector_of_enums\", Self::VT_VECTOR_OF_ENUMS, false)?\n            .visit_field::<Race>(\"signed_enum\", Self::VT_SIGNED_ENUM, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, u8>>>(\"testrequirednestedflatbuffer\", Self::VT_TESTREQUIREDNESTEDFLATBUFFER, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, ::flatbuffers::ForwardsUOffset<Stat>>>>(\"scalar_key_sorted_tables\", Self::VT_SCALAR_KEY_SORTED_TABLES, false)?\n            .visit_field::<Test>(\"native_inline\", Self::VT_NATIVE_INLINE, false)?\n            .visit_field::<LongEnum>(\"long_enum_non_enum_default\", Self::VT_LONG_ENUM_NON_ENUM_DEFAULT, false)?\n            .visit_field::<LongEnum>(\"long_enum_normal_default\", Self::VT_LONG_ENUM_NORMAL_DEFAULT, false)?\n            .visit_field::<f32>(\"nan_default\", Self::VT_NAN_DEFAULT, false)?\n            .visit_field::<f32>(\"inf_default\", Self::VT_INF_DEFAULT, false)?\n            .visit_field::<f32>(\"positive_inf_default\", Self::VT_POSITIVE_INF_DEFAULT, false)?\n            .visit_field::<f32>(\"infinity_default\", Self::VT_INFINITY_DEFAULT, false)?\n            .visit_field::<f32>(\"positive_infinity_default\", Self::VT_POSITIVE_INFINITY_DEFAULT, false)?\n            .visit_field::<f32>(\"negative_inf_default\", Self::VT_NEGATIVE_INF_DEFAULT, false)?\n            .visit_field::<f32>(\"negative_infinity_default\", Self::VT_NEGATIVE_INFINITY_DEFAULT, false)?\n            .visit_field::<f64>(\"double_inf_default\", Self::VT_DOUBLE_INF_DEFAULT, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct MonsterArgs<'a> {\n    pub pos: Option<&'a Vec3>,\n    pub mana: i16,\n    pub hp: i16,\n    pub name: Option<::flatbuffers::WIPOffset<&'a str>>,\n    pub inventory: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, u8>>>,\n    pub color: Color,\n    pub test_type: Any,\n    pub test: Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>>,\n    pub test4: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, Test>>>,\n    pub testarrayofstring: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<&'a str>>>>,\n    pub testarrayoftables: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Monster<'a>>>>>,\n    pub enemy: Option<::flatbuffers::WIPOffset<Monster<'a>>>,\n    pub testnestedflatbuffer: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, u8>>>,\n    pub testempty: Option<::flatbuffers::WIPOffset<Stat<'a>>>,\n    pub testbool: bool,\n    pub testhashs32_fnv1: i32,\n    pub testhashu32_fnv1: u32,\n    pub testhashs64_fnv1: i64,\n    pub testhashu64_fnv1: u64,\n    pub testhashs32_fnv1a: i32,\n    pub testhashu32_fnv1a: u32,\n    pub testhashs64_fnv1a: i64,\n    pub testhashu64_fnv1a: u64,\n    pub testarrayofbools: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, bool>>>,\n    pub testf: f32,\n    pub testf2: f32,\n    pub testf3: f32,\n    pub testarrayofstring2: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<&'a str>>>>,\n    pub testarrayofsortedstruct: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, Ability>>>,\n    pub flex: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, u8>>>,\n    pub test5: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, Test>>>,\n    pub vector_of_longs: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, i64>>>,\n    pub vector_of_doubles: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, f64>>>,\n    pub parent_namespace_test: Option<::flatbuffers::WIPOffset<super::InParentNamespace<'a>>>,\n    pub vector_of_referrables: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Referrable<'a>>>>>,\n    pub single_weak_reference: u64,\n    pub vector_of_weak_references: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, u64>>>,\n    pub vector_of_strong_referrables: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Referrable<'a>>>>>,\n    pub co_owning_reference: u64,\n    pub vector_of_co_owning_references: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, u64>>>,\n    pub non_owning_reference: u64,\n    pub vector_of_non_owning_references: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, u64>>>,\n    pub any_unique_type: AnyUniqueAliases,\n    pub any_unique: Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>>,\n    pub any_ambiguous_type: AnyAmbiguousAliases,\n    pub any_ambiguous: Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>>,\n    pub vector_of_enums: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, Color>>>,\n    pub signed_enum: Race,\n    pub testrequirednestedflatbuffer: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, u8>>>,\n    pub scalar_key_sorted_tables: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Stat<'a>>>>>,\n    pub native_inline: Option<&'a Test>,\n    pub long_enum_non_enum_default: LongEnum,\n    pub long_enum_normal_default: LongEnum,\n    pub nan_default: f32,\n    pub inf_default: f32,\n    pub positive_inf_default: f32,\n    pub infinity_default: f32,\n    pub positive_infinity_default: f32,\n    pub negative_inf_default: f32,\n    pub negative_infinity_default: f32,\n    pub double_inf_default: f64,\n}\n\nimpl<'a> Default for MonsterArgs<'a> {\n    #[inline]\n    fn default() -> Self {\n        MonsterArgs {\n            pos: None,\n            mana: 150,\n            hp: 100,\n            name: None, // required field\n            inventory: None,\n            color: Color::Blue,\n            test_type: Any::NONE,\n            test: None,\n            test4: None,\n            testarrayofstring: None,\n            testarrayoftables: None,\n            enemy: None,\n            testnestedflatbuffer: None,\n            testempty: None,\n            testbool: false,\n            testhashs32_fnv1: 0,\n            testhashu32_fnv1: 0,\n            testhashs64_fnv1: 0,\n            testhashu64_fnv1: 0,\n            testhashs32_fnv1a: 0,\n            testhashu32_fnv1a: 0,\n            testhashs64_fnv1a: 0,\n            testhashu64_fnv1a: 0,\n            testarrayofbools: None,\n            testf: 3.14159,\n            testf2: 3.0,\n            testf3: 0.0,\n            testarrayofstring2: None,\n            testarrayofsortedstruct: None,\n            flex: None,\n            test5: None,\n            vector_of_longs: None,\n            vector_of_doubles: None,\n            parent_namespace_test: None,\n            vector_of_referrables: None,\n            single_weak_reference: 0,\n            vector_of_weak_references: None,\n            vector_of_strong_referrables: None,\n            co_owning_reference: 0,\n            vector_of_co_owning_references: None,\n            non_owning_reference: 0,\n            vector_of_non_owning_references: None,\n            any_unique_type: AnyUniqueAliases::NONE,\n            any_unique: None,\n            any_ambiguous_type: AnyAmbiguousAliases::NONE,\n            any_ambiguous: None,\n            vector_of_enums: None,\n            signed_enum: Race::None,\n            testrequirednestedflatbuffer: None,\n            scalar_key_sorted_tables: None,\n            native_inline: None,\n            long_enum_non_enum_default: Default::default(),\n            long_enum_normal_default: LongEnum::LongOne,\n            nan_default: f32::NAN,\n            inf_default: f32::INFINITY,\n            positive_inf_default: f32::INFINITY,\n            infinity_default: f32::INFINITY,\n            positive_infinity_default: f32::INFINITY,\n            negative_inf_default: f32::NEG_INFINITY,\n            negative_infinity_default: f32::NEG_INFINITY,\n            double_inf_default: f64::INFINITY,\n        }\n    }\n}\n\nimpl Serialize for Monster<'_> {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        let mut s = serializer.serialize_struct(\"Monster\", 62)?;\n        if let Some(f) = self.pos() {\n            s.serialize_field(\"pos\", &f)?;\n        } else {\n            s.skip_field(\"pos\")?;\n        }\n        s.serialize_field(\"mana\", &self.mana())?;\n        s.serialize_field(\"hp\", &self.hp())?;\n        s.serialize_field(\"name\", &self.name())?;\n        if let Some(f) = self.inventory() {\n            s.serialize_field(\"inventory\", &f)?;\n        } else {\n            s.skip_field(\"inventory\")?;\n        }\n        s.serialize_field(\"color\", &self.color())?;\n        s.serialize_field(\"test_type\", &self.test_type())?;\n        match self.test_type() {\n            Any::NONE => (),\n                Any::Monster => {\n                    let f = self.test_as_monster()\n                        .expect(\"Invalid union table, expected `Any::Monster`.\");\n                    s.serialize_field(\"test\", &f)?;\n                }\n                Any::TestSimpleTableWithEnum => {\n                    let f = self.test_as_test_simple_table_with_enum()\n                        .expect(\"Invalid union table, expected `Any::TestSimpleTableWithEnum`.\");\n                    s.serialize_field(\"test\", &f)?;\n                }\n                Any::MyGame_Example2_Monster => {\n                    let f = self.test_as_my_game_example_2_monster()\n                        .expect(\"Invalid union table, expected `Any::MyGame_Example2_Monster`.\");\n                    s.serialize_field(\"test\", &f)?;\n                }\n            _ => unimplemented!(),\n        }\n        if let Some(f) = self.test4() {\n            s.serialize_field(\"test4\", &f)?;\n        } else {\n            s.skip_field(\"test4\")?;\n        }\n        if let Some(f) = self.testarrayofstring() {\n            s.serialize_field(\"testarrayofstring\", &f)?;\n        } else {\n            s.skip_field(\"testarrayofstring\")?;\n        }\n        if let Some(f) = self.testarrayoftables() {\n            s.serialize_field(\"testarrayoftables\", &f)?;\n        } else {\n            s.skip_field(\"testarrayoftables\")?;\n        }\n        if let Some(f) = self.enemy() {\n            s.serialize_field(\"enemy\", &f)?;\n        } else {\n            s.skip_field(\"enemy\")?;\n        }\n        if let Some(f) = self.testnestedflatbuffer() {\n            s.serialize_field(\"testnestedflatbuffer\", &f)?;\n        } else {\n            s.skip_field(\"testnestedflatbuffer\")?;\n        }\n        if let Some(f) = self.testempty() {\n            s.serialize_field(\"testempty\", &f)?;\n        } else {\n            s.skip_field(\"testempty\")?;\n        }\n        s.serialize_field(\"testbool\", &self.testbool())?;\n        s.serialize_field(\"testhashs32_fnv1\", &self.testhashs32_fnv1())?;\n        s.serialize_field(\"testhashu32_fnv1\", &self.testhashu32_fnv1())?;\n        s.serialize_field(\"testhashs64_fnv1\", &self.testhashs64_fnv1())?;\n        s.serialize_field(\"testhashu64_fnv1\", &self.testhashu64_fnv1())?;\n        s.serialize_field(\"testhashs32_fnv1a\", &self.testhashs32_fnv1a())?;\n        s.serialize_field(\"testhashu32_fnv1a\", &self.testhashu32_fnv1a())?;\n        s.serialize_field(\"testhashs64_fnv1a\", &self.testhashs64_fnv1a())?;\n        s.serialize_field(\"testhashu64_fnv1a\", &self.testhashu64_fnv1a())?;\n        if let Some(f) = self.testarrayofbools() {\n            s.serialize_field(\"testarrayofbools\", &f)?;\n        } else {\n            s.skip_field(\"testarrayofbools\")?;\n        }\n        s.serialize_field(\"testf\", &self.testf())?;\n        s.serialize_field(\"testf2\", &self.testf2())?;\n        s.serialize_field(\"testf3\", &self.testf3())?;\n        if let Some(f) = self.testarrayofstring2() {\n            s.serialize_field(\"testarrayofstring2\", &f)?;\n        } else {\n            s.skip_field(\"testarrayofstring2\")?;\n        }\n        if let Some(f) = self.testarrayofsortedstruct() {\n            s.serialize_field(\"testarrayofsortedstruct\", &f)?;\n        } else {\n            s.skip_field(\"testarrayofsortedstruct\")?;\n        }\n        if let Some(f) = self.flex() {\n            s.serialize_field(\"flex\", &f)?;\n        } else {\n            s.skip_field(\"flex\")?;\n        }\n        if let Some(f) = self.test5() {\n            s.serialize_field(\"test5\", &f)?;\n        } else {\n            s.skip_field(\"test5\")?;\n        }\n        if let Some(f) = self.vector_of_longs() {\n            s.serialize_field(\"vector_of_longs\", &f)?;\n        } else {\n            s.skip_field(\"vector_of_longs\")?;\n        }\n        if let Some(f) = self.vector_of_doubles() {\n            s.serialize_field(\"vector_of_doubles\", &f)?;\n        } else {\n            s.skip_field(\"vector_of_doubles\")?;\n        }\n        if let Some(f) = self.parent_namespace_test() {\n            s.serialize_field(\"parent_namespace_test\", &f)?;\n        } else {\n            s.skip_field(\"parent_namespace_test\")?;\n        }\n        if let Some(f) = self.vector_of_referrables() {\n            s.serialize_field(\"vector_of_referrables\", &f)?;\n        } else {\n            s.skip_field(\"vector_of_referrables\")?;\n        }\n        s.serialize_field(\"single_weak_reference\", &self.single_weak_reference())?;\n        if let Some(f) = self.vector_of_weak_references() {\n            s.serialize_field(\"vector_of_weak_references\", &f)?;\n        } else {\n            s.skip_field(\"vector_of_weak_references\")?;\n        }\n        if let Some(f) = self.vector_of_strong_referrables() {\n            s.serialize_field(\"vector_of_strong_referrables\", &f)?;\n        } else {\n            s.skip_field(\"vector_of_strong_referrables\")?;\n        }\n        s.serialize_field(\"co_owning_reference\", &self.co_owning_reference())?;\n        if let Some(f) = self.vector_of_co_owning_references() {\n            s.serialize_field(\"vector_of_co_owning_references\", &f)?;\n        } else {\n            s.skip_field(\"vector_of_co_owning_references\")?;\n        }\n        s.serialize_field(\"non_owning_reference\", &self.non_owning_reference())?;\n        if let Some(f) = self.vector_of_non_owning_references() {\n            s.serialize_field(\"vector_of_non_owning_references\", &f)?;\n        } else {\n            s.skip_field(\"vector_of_non_owning_references\")?;\n        }\n        s.serialize_field(\"any_unique_type\", &self.any_unique_type())?;\n        match self.any_unique_type() {\n            AnyUniqueAliases::NONE => (),\n                AnyUniqueAliases::M => {\n                    let f = self.any_unique_as_m()\n                        .expect(\"Invalid union table, expected `AnyUniqueAliases::M`.\");\n                    s.serialize_field(\"any_unique\", &f)?;\n                }\n                AnyUniqueAliases::TS => {\n                    let f = self.any_unique_as_ts()\n                        .expect(\"Invalid union table, expected `AnyUniqueAliases::TS`.\");\n                    s.serialize_field(\"any_unique\", &f)?;\n                }\n                AnyUniqueAliases::M2 => {\n                    let f = self.any_unique_as_m2()\n                        .expect(\"Invalid union table, expected `AnyUniqueAliases::M2`.\");\n                    s.serialize_field(\"any_unique\", &f)?;\n                }\n            _ => unimplemented!(),\n        }\n        s.serialize_field(\"any_ambiguous_type\", &self.any_ambiguous_type())?;\n        match self.any_ambiguous_type() {\n            AnyAmbiguousAliases::NONE => (),\n                AnyAmbiguousAliases::M1 => {\n                    let f = self.any_ambiguous_as_m1()\n                        .expect(\"Invalid union table, expected `AnyAmbiguousAliases::M1`.\");\n                    s.serialize_field(\"any_ambiguous\", &f)?;\n                }\n                AnyAmbiguousAliases::M2 => {\n                    let f = self.any_ambiguous_as_m2()\n                        .expect(\"Invalid union table, expected `AnyAmbiguousAliases::M2`.\");\n                    s.serialize_field(\"any_ambiguous\", &f)?;\n                }\n                AnyAmbiguousAliases::M3 => {\n                    let f = self.any_ambiguous_as_m3()\n                        .expect(\"Invalid union table, expected `AnyAmbiguousAliases::M3`.\");\n                    s.serialize_field(\"any_ambiguous\", &f)?;\n                }\n            _ => unimplemented!(),\n        }\n        if let Some(f) = self.vector_of_enums() {\n            s.serialize_field(\"vector_of_enums\", &f)?;\n        } else {\n            s.skip_field(\"vector_of_enums\")?;\n        }\n        s.serialize_field(\"signed_enum\", &self.signed_enum())?;\n        if let Some(f) = self.testrequirednestedflatbuffer() {\n            s.serialize_field(\"testrequirednestedflatbuffer\", &f)?;\n        } else {\n            s.skip_field(\"testrequirednestedflatbuffer\")?;\n        }\n        if let Some(f) = self.scalar_key_sorted_tables() {\n            s.serialize_field(\"scalar_key_sorted_tables\", &f)?;\n        } else {\n            s.skip_field(\"scalar_key_sorted_tables\")?;\n        }\n        if let Some(f) = self.native_inline() {\n            s.serialize_field(\"native_inline\", &f)?;\n        } else {\n            s.skip_field(\"native_inline\")?;\n        }\n        s.serialize_field(\"long_enum_non_enum_default\", &self.long_enum_non_enum_default())?;\n        s.serialize_field(\"long_enum_normal_default\", &self.long_enum_normal_default())?;\n        s.serialize_field(\"nan_default\", &self.nan_default())?;\n        s.serialize_field(\"inf_default\", &self.inf_default())?;\n        s.serialize_field(\"positive_inf_default\", &self.positive_inf_default())?;\n        s.serialize_field(\"infinity_default\", &self.infinity_default())?;\n        s.serialize_field(\"positive_infinity_default\", &self.positive_infinity_default())?;\n        s.serialize_field(\"negative_inf_default\", &self.negative_inf_default())?;\n        s.serialize_field(\"negative_infinity_default\", &self.negative_infinity_default())?;\n        s.serialize_field(\"double_inf_default\", &self.double_inf_default())?;\n        s.end()\n    }\n}\n\npub struct MonsterBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> MonsterBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_pos(&mut self, pos: &Vec3) {\n        self.fbb_.push_slot_always::<&Vec3>(Monster::VT_POS, pos);\n    }\n\n    #[inline]\n    pub fn add_mana(&mut self, mana: i16) {\n        self.fbb_.push_slot::<i16>(Monster::VT_MANA, mana, 150);\n    }\n\n    #[inline]\n    pub fn add_hp(&mut self, hp: i16) {\n        self.fbb_.push_slot::<i16>(Monster::VT_HP, hp, 100);\n    }\n\n    #[inline]\n    pub fn add_name(&mut self, name: ::flatbuffers::WIPOffset<&'b  str>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_NAME, name);\n    }\n\n    #[inline]\n    pub fn add_inventory(&mut self, inventory: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , u8>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_INVENTORY, inventory);\n    }\n\n    #[inline]\n    pub fn add_color(&mut self, color: Color) {\n        self.fbb_.push_slot::<Color>(Monster::VT_COLOR, color, Color::Blue);\n    }\n\n    #[inline]\n    pub fn add_test_type(&mut self, test_type: Any) {\n        self.fbb_.push_slot::<Any>(Monster::VT_TEST_TYPE, test_type, Any::NONE);\n    }\n\n    #[inline]\n    pub fn add_test(&mut self, test: ::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_TEST, test);\n    }\n\n    #[inline]\n    pub fn add_test4(&mut self, test4: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , Test>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_TEST4, test4);\n    }\n\n    #[inline]\n    pub fn add_testarrayofstring(&mut self, testarrayofstring: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , ::flatbuffers::ForwardsUOffset<&'b  str>>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_TESTARRAYOFSTRING, testarrayofstring);\n    }\n\n    #[inline]\n    pub fn add_testarrayoftables(&mut self, testarrayoftables: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , ::flatbuffers::ForwardsUOffset<Monster<'b >>>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_TESTARRAYOFTABLES, testarrayoftables);\n    }\n\n    #[inline]\n    pub fn add_enemy(&mut self, enemy: ::flatbuffers::WIPOffset<Monster<'b >>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<Monster>>(Monster::VT_ENEMY, enemy);\n    }\n\n    #[inline]\n    pub fn add_testnestedflatbuffer(&mut self, testnestedflatbuffer: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , u8>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_TESTNESTEDFLATBUFFER, testnestedflatbuffer);\n    }\n\n    #[inline]\n    pub fn add_testempty(&mut self, testempty: ::flatbuffers::WIPOffset<Stat<'b >>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<Stat>>(Monster::VT_TESTEMPTY, testempty);\n    }\n\n    #[inline]\n    pub fn add_testbool(&mut self, testbool: bool) {\n        self.fbb_.push_slot::<bool>(Monster::VT_TESTBOOL, testbool, false);\n    }\n\n    #[inline]\n    pub fn add_testhashs32_fnv1(&mut self, testhashs32_fnv1: i32) {\n        self.fbb_.push_slot::<i32>(Monster::VT_TESTHASHS32_FNV1, testhashs32_fnv1, 0);\n    }\n\n    #[inline]\n    pub fn add_testhashu32_fnv1(&mut self, testhashu32_fnv1: u32) {\n        self.fbb_.push_slot::<u32>(Monster::VT_TESTHASHU32_FNV1, testhashu32_fnv1, 0);\n    }\n\n    #[inline]\n    pub fn add_testhashs64_fnv1(&mut self, testhashs64_fnv1: i64) {\n        self.fbb_.push_slot::<i64>(Monster::VT_TESTHASHS64_FNV1, testhashs64_fnv1, 0);\n    }\n\n    #[inline]\n    pub fn add_testhashu64_fnv1(&mut self, testhashu64_fnv1: u64) {\n        self.fbb_.push_slot::<u64>(Monster::VT_TESTHASHU64_FNV1, testhashu64_fnv1, 0);\n    }\n\n    #[inline]\n    pub fn add_testhashs32_fnv1a(&mut self, testhashs32_fnv1a: i32) {\n        self.fbb_.push_slot::<i32>(Monster::VT_TESTHASHS32_FNV1A, testhashs32_fnv1a, 0);\n    }\n\n    #[inline]\n    pub fn add_testhashu32_fnv1a(&mut self, testhashu32_fnv1a: u32) {\n        self.fbb_.push_slot::<u32>(Monster::VT_TESTHASHU32_FNV1A, testhashu32_fnv1a, 0);\n    }\n\n    #[inline]\n    pub fn add_testhashs64_fnv1a(&mut self, testhashs64_fnv1a: i64) {\n        self.fbb_.push_slot::<i64>(Monster::VT_TESTHASHS64_FNV1A, testhashs64_fnv1a, 0);\n    }\n\n    #[inline]\n    pub fn add_testhashu64_fnv1a(&mut self, testhashu64_fnv1a: u64) {\n        self.fbb_.push_slot::<u64>(Monster::VT_TESTHASHU64_FNV1A, testhashu64_fnv1a, 0);\n    }\n\n    #[inline]\n    pub fn add_testarrayofbools(&mut self, testarrayofbools: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , bool>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_TESTARRAYOFBOOLS, testarrayofbools);\n    }\n\n    #[inline]\n    pub fn add_testf(&mut self, testf: f32) {\n        self.fbb_.push_slot::<f32>(Monster::VT_TESTF, testf, 3.14159);\n    }\n\n    #[inline]\n    pub fn add_testf2(&mut self, testf2: f32) {\n        self.fbb_.push_slot::<f32>(Monster::VT_TESTF2, testf2, 3.0);\n    }\n\n    #[inline]\n    pub fn add_testf3(&mut self, testf3: f32) {\n        self.fbb_.push_slot::<f32>(Monster::VT_TESTF3, testf3, 0.0);\n    }\n\n    #[inline]\n    pub fn add_testarrayofstring2(&mut self, testarrayofstring2: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , ::flatbuffers::ForwardsUOffset<&'b  str>>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_TESTARRAYOFSTRING2, testarrayofstring2);\n    }\n\n    #[inline]\n    pub fn add_testarrayofsortedstruct(&mut self, testarrayofsortedstruct: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , Ability>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_TESTARRAYOFSORTEDSTRUCT, testarrayofsortedstruct);\n    }\n\n    #[inline]\n    pub fn add_flex(&mut self, flex: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , u8>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_FLEX, flex);\n    }\n\n    #[inline]\n    pub fn add_test5(&mut self, test5: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , Test>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_TEST5, test5);\n    }\n\n    #[inline]\n    pub fn add_vector_of_longs(&mut self, vector_of_longs: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , i64>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_VECTOR_OF_LONGS, vector_of_longs);\n    }\n\n    #[inline]\n    pub fn add_vector_of_doubles(&mut self, vector_of_doubles: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , f64>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_VECTOR_OF_DOUBLES, vector_of_doubles);\n    }\n\n    #[inline]\n    pub fn add_parent_namespace_test(&mut self, parent_namespace_test: ::flatbuffers::WIPOffset<super::InParentNamespace<'b >>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<super::InParentNamespace>>(Monster::VT_PARENT_NAMESPACE_TEST, parent_namespace_test);\n    }\n\n    #[inline]\n    pub fn add_vector_of_referrables(&mut self, vector_of_referrables: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , ::flatbuffers::ForwardsUOffset<Referrable<'b >>>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_VECTOR_OF_REFERRABLES, vector_of_referrables);\n    }\n\n    #[inline]\n    pub fn add_single_weak_reference(&mut self, single_weak_reference: u64) {\n        self.fbb_.push_slot::<u64>(Monster::VT_SINGLE_WEAK_REFERENCE, single_weak_reference, 0);\n    }\n\n    #[inline]\n    pub fn add_vector_of_weak_references(&mut self, vector_of_weak_references: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , u64>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_VECTOR_OF_WEAK_REFERENCES, vector_of_weak_references);\n    }\n\n    #[inline]\n    pub fn add_vector_of_strong_referrables(&mut self, vector_of_strong_referrables: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , ::flatbuffers::ForwardsUOffset<Referrable<'b >>>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_VECTOR_OF_STRONG_REFERRABLES, vector_of_strong_referrables);\n    }\n\n    #[inline]\n    pub fn add_co_owning_reference(&mut self, co_owning_reference: u64) {\n        self.fbb_.push_slot::<u64>(Monster::VT_CO_OWNING_REFERENCE, co_owning_reference, 0);\n    }\n\n    #[inline]\n    pub fn add_vector_of_co_owning_references(&mut self, vector_of_co_owning_references: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , u64>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_VECTOR_OF_CO_OWNING_REFERENCES, vector_of_co_owning_references);\n    }\n\n    #[inline]\n    pub fn add_non_owning_reference(&mut self, non_owning_reference: u64) {\n        self.fbb_.push_slot::<u64>(Monster::VT_NON_OWNING_REFERENCE, non_owning_reference, 0);\n    }\n\n    #[inline]\n    pub fn add_vector_of_non_owning_references(&mut self, vector_of_non_owning_references: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , u64>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_VECTOR_OF_NON_OWNING_REFERENCES, vector_of_non_owning_references);\n    }\n\n    #[inline]\n    pub fn add_any_unique_type(&mut self, any_unique_type: AnyUniqueAliases) {\n        self.fbb_.push_slot::<AnyUniqueAliases>(Monster::VT_ANY_UNIQUE_TYPE, any_unique_type, AnyUniqueAliases::NONE);\n    }\n\n    #[inline]\n    pub fn add_any_unique(&mut self, any_unique: ::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_ANY_UNIQUE, any_unique);\n    }\n\n    #[inline]\n    pub fn add_any_ambiguous_type(&mut self, any_ambiguous_type: AnyAmbiguousAliases) {\n        self.fbb_.push_slot::<AnyAmbiguousAliases>(Monster::VT_ANY_AMBIGUOUS_TYPE, any_ambiguous_type, AnyAmbiguousAliases::NONE);\n    }\n\n    #[inline]\n    pub fn add_any_ambiguous(&mut self, any_ambiguous: ::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_ANY_AMBIGUOUS, any_ambiguous);\n    }\n\n    #[inline]\n    pub fn add_vector_of_enums(&mut self, vector_of_enums: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , Color>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_VECTOR_OF_ENUMS, vector_of_enums);\n    }\n\n    #[inline]\n    pub fn add_signed_enum(&mut self, signed_enum: Race) {\n        self.fbb_.push_slot::<Race>(Monster::VT_SIGNED_ENUM, signed_enum, Race::None);\n    }\n\n    #[inline]\n    pub fn add_testrequirednestedflatbuffer(&mut self, testrequirednestedflatbuffer: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , u8>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_TESTREQUIREDNESTEDFLATBUFFER, testrequirednestedflatbuffer);\n    }\n\n    #[inline]\n    pub fn add_scalar_key_sorted_tables(&mut self, scalar_key_sorted_tables: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , ::flatbuffers::ForwardsUOffset<Stat<'b >>>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_SCALAR_KEY_SORTED_TABLES, scalar_key_sorted_tables);\n    }\n\n    #[inline]\n    pub fn add_native_inline(&mut self, native_inline: &Test) {\n        self.fbb_.push_slot_always::<&Test>(Monster::VT_NATIVE_INLINE, native_inline);\n    }\n\n    #[inline]\n    pub fn add_long_enum_non_enum_default(&mut self, long_enum_non_enum_default: LongEnum) {\n        self.fbb_.push_slot::<LongEnum>(Monster::VT_LONG_ENUM_NON_ENUM_DEFAULT, long_enum_non_enum_default, Default::default());\n    }\n\n    #[inline]\n    pub fn add_long_enum_normal_default(&mut self, long_enum_normal_default: LongEnum) {\n        self.fbb_.push_slot::<LongEnum>(Monster::VT_LONG_ENUM_NORMAL_DEFAULT, long_enum_normal_default, LongEnum::LongOne);\n    }\n\n    #[inline]\n    pub fn add_nan_default(&mut self, nan_default: f32) {\n        self.fbb_.push_slot::<f32>(Monster::VT_NAN_DEFAULT, nan_default, f32::NAN);\n    }\n\n    #[inline]\n    pub fn add_inf_default(&mut self, inf_default: f32) {\n        self.fbb_.push_slot::<f32>(Monster::VT_INF_DEFAULT, inf_default, f32::INFINITY);\n    }\n\n    #[inline]\n    pub fn add_positive_inf_default(&mut self, positive_inf_default: f32) {\n        self.fbb_.push_slot::<f32>(Monster::VT_POSITIVE_INF_DEFAULT, positive_inf_default, f32::INFINITY);\n    }\n\n    #[inline]\n    pub fn add_infinity_default(&mut self, infinity_default: f32) {\n        self.fbb_.push_slot::<f32>(Monster::VT_INFINITY_DEFAULT, infinity_default, f32::INFINITY);\n    }\n\n    #[inline]\n    pub fn add_positive_infinity_default(&mut self, positive_infinity_default: f32) {\n        self.fbb_.push_slot::<f32>(Monster::VT_POSITIVE_INFINITY_DEFAULT, positive_infinity_default, f32::INFINITY);\n    }\n\n    #[inline]\n    pub fn add_negative_inf_default(&mut self, negative_inf_default: f32) {\n        self.fbb_.push_slot::<f32>(Monster::VT_NEGATIVE_INF_DEFAULT, negative_inf_default, f32::NEG_INFINITY);\n    }\n\n    #[inline]\n    pub fn add_negative_infinity_default(&mut self, negative_infinity_default: f32) {\n        self.fbb_.push_slot::<f32>(Monster::VT_NEGATIVE_INFINITY_DEFAULT, negative_infinity_default, f32::NEG_INFINITY);\n    }\n\n    #[inline]\n    pub fn add_double_inf_default(&mut self, double_inf_default: f64) {\n        self.fbb_.push_slot::<f64>(Monster::VT_DOUBLE_INF_DEFAULT, double_inf_default, f64::INFINITY);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> MonsterBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        MonsterBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<Monster<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        self.fbb_.required(o, Monster::VT_NAME,\"name\");\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for Monster<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"Monster\");\n        ds.field(\"pos\", &self.pos());\n        ds.field(\"mana\", &self.mana());\n        ds.field(\"hp\", &self.hp());\n        ds.field(\"name\", &self.name());\n        ds.field(\"inventory\", &self.inventory());\n        ds.field(\"color\", &self.color());\n        ds.field(\"test_type\", &self.test_type());\n        match self.test_type() {\n            Any::Monster => {\n                if let Some(x) = self.test_as_monster() {\n                    ds.field(\"test\", &x)\n                } else {\n                    ds.field(\"test\", &\"InvalidFlatbuffer: Union discriminant does not match value.\")\n                }\n            },\n            Any::TestSimpleTableWithEnum => {\n                if let Some(x) = self.test_as_test_simple_table_with_enum() {\n                    ds.field(\"test\", &x)\n                } else {\n                    ds.field(\"test\", &\"InvalidFlatbuffer: Union discriminant does not match value.\")\n                }\n            },\n            Any::MyGame_Example2_Monster => {\n                if let Some(x) = self.test_as_my_game_example_2_monster() {\n                    ds.field(\"test\", &x)\n                } else {\n                    ds.field(\"test\", &\"InvalidFlatbuffer: Union discriminant does not match value.\")\n                }\n            },\n            _ => {\n                let x: Option<()> = None;\n                ds.field(\"test\", &x)\n            },\n        };\n        ds.field(\"test4\", &self.test4());\n        ds.field(\"testarrayofstring\", &self.testarrayofstring());\n        ds.field(\"testarrayoftables\", &self.testarrayoftables());\n        ds.field(\"enemy\", &self.enemy());\n        ds.field(\"testnestedflatbuffer\", &self.testnestedflatbuffer());\n        ds.field(\"testempty\", &self.testempty());\n        ds.field(\"testbool\", &self.testbool());\n        ds.field(\"testhashs32_fnv1\", &self.testhashs32_fnv1());\n        ds.field(\"testhashu32_fnv1\", &self.testhashu32_fnv1());\n        ds.field(\"testhashs64_fnv1\", &self.testhashs64_fnv1());\n        ds.field(\"testhashu64_fnv1\", &self.testhashu64_fnv1());\n        ds.field(\"testhashs32_fnv1a\", &self.testhashs32_fnv1a());\n        ds.field(\"testhashu32_fnv1a\", &self.testhashu32_fnv1a());\n        ds.field(\"testhashs64_fnv1a\", &self.testhashs64_fnv1a());\n        ds.field(\"testhashu64_fnv1a\", &self.testhashu64_fnv1a());\n        ds.field(\"testarrayofbools\", &self.testarrayofbools());\n        ds.field(\"testf\", &self.testf());\n        ds.field(\"testf2\", &self.testf2());\n        ds.field(\"testf3\", &self.testf3());\n        ds.field(\"testarrayofstring2\", &self.testarrayofstring2());\n        ds.field(\"testarrayofsortedstruct\", &self.testarrayofsortedstruct());\n        ds.field(\"flex\", &self.flex());\n        ds.field(\"test5\", &self.test5());\n        ds.field(\"vector_of_longs\", &self.vector_of_longs());\n        ds.field(\"vector_of_doubles\", &self.vector_of_doubles());\n        ds.field(\"parent_namespace_test\", &self.parent_namespace_test());\n        ds.field(\"vector_of_referrables\", &self.vector_of_referrables());\n        ds.field(\"single_weak_reference\", &self.single_weak_reference());\n        ds.field(\"vector_of_weak_references\", &self.vector_of_weak_references());\n        ds.field(\"vector_of_strong_referrables\", &self.vector_of_strong_referrables());\n        ds.field(\"co_owning_reference\", &self.co_owning_reference());\n        ds.field(\"vector_of_co_owning_references\", &self.vector_of_co_owning_references());\n        ds.field(\"non_owning_reference\", &self.non_owning_reference());\n        ds.field(\"vector_of_non_owning_references\", &self.vector_of_non_owning_references());\n        ds.field(\"any_unique_type\", &self.any_unique_type());\n        match self.any_unique_type() {\n            AnyUniqueAliases::M => {\n                if let Some(x) = self.any_unique_as_m() {\n                    ds.field(\"any_unique\", &x)\n                } else {\n                    ds.field(\"any_unique\", &\"InvalidFlatbuffer: Union discriminant does not match value.\")\n                }\n            },\n            AnyUniqueAliases::TS => {\n                if let Some(x) = self.any_unique_as_ts() {\n                    ds.field(\"any_unique\", &x)\n                } else {\n                    ds.field(\"any_unique\", &\"InvalidFlatbuffer: Union discriminant does not match value.\")\n                }\n            },\n            AnyUniqueAliases::M2 => {\n                if let Some(x) = self.any_unique_as_m2() {\n                    ds.field(\"any_unique\", &x)\n                } else {\n                    ds.field(\"any_unique\", &\"InvalidFlatbuffer: Union discriminant does not match value.\")\n                }\n            },\n            _ => {\n                let x: Option<()> = None;\n                ds.field(\"any_unique\", &x)\n            },\n        };\n        ds.field(\"any_ambiguous_type\", &self.any_ambiguous_type());\n        match self.any_ambiguous_type() {\n            AnyAmbiguousAliases::M1 => {\n                if let Some(x) = self.any_ambiguous_as_m1() {\n                    ds.field(\"any_ambiguous\", &x)\n                } else {\n                    ds.field(\"any_ambiguous\", &\"InvalidFlatbuffer: Union discriminant does not match value.\")\n                }\n            },\n            AnyAmbiguousAliases::M2 => {\n                if let Some(x) = self.any_ambiguous_as_m2() {\n                    ds.field(\"any_ambiguous\", &x)\n                } else {\n                    ds.field(\"any_ambiguous\", &\"InvalidFlatbuffer: Union discriminant does not match value.\")\n                }\n            },\n            AnyAmbiguousAliases::M3 => {\n                if let Some(x) = self.any_ambiguous_as_m3() {\n                    ds.field(\"any_ambiguous\", &x)\n                } else {\n                    ds.field(\"any_ambiguous\", &\"InvalidFlatbuffer: Union discriminant does not match value.\")\n                }\n            },\n            _ => {\n                let x: Option<()> = None;\n                ds.field(\"any_ambiguous\", &x)\n            },\n        };\n        ds.field(\"vector_of_enums\", &self.vector_of_enums());\n        ds.field(\"signed_enum\", &self.signed_enum());\n        ds.field(\"testrequirednestedflatbuffer\", &self.testrequirednestedflatbuffer());\n        ds.field(\"scalar_key_sorted_tables\", &self.scalar_key_sorted_tables());\n        ds.field(\"native_inline\", &self.native_inline());\n        ds.field(\"long_enum_non_enum_default\", &self.long_enum_non_enum_default());\n        ds.field(\"long_enum_normal_default\", &self.long_enum_normal_default());\n        ds.field(\"nan_default\", &self.nan_default());\n        ds.field(\"inf_default\", &self.inf_default());\n        ds.field(\"positive_inf_default\", &self.positive_inf_default());\n        ds.field(\"infinity_default\", &self.infinity_default());\n        ds.field(\"positive_infinity_default\", &self.positive_infinity_default());\n        ds.field(\"negative_inf_default\", &self.negative_inf_default());\n        ds.field(\"negative_infinity_default\", &self.negative_infinity_default());\n        ds.field(\"double_inf_default\", &self.double_inf_default());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct MonsterT {\n    pub pos: Option<Vec3T>,\n    pub mana: i16,\n    pub hp: i16,\n    pub name: alloc::string::String,\n    pub inventory: Option<alloc::vec::Vec<u8>>,\n    pub color: Color,\n    pub test: AnyT,\n    pub test4: Option<alloc::vec::Vec<TestT>>,\n    pub testarrayofstring: Option<alloc::vec::Vec<alloc::string::String>>,\n    pub testarrayoftables: Option<alloc::vec::Vec<MonsterT>>,\n    pub enemy: Option<alloc::boxed::Box<MonsterT>>,\n    pub testnestedflatbuffer: Option<alloc::vec::Vec<u8>>,\n    pub testempty: Option<alloc::boxed::Box<StatT>>,\n    pub testbool: bool,\n    pub testhashs32_fnv1: i32,\n    pub testhashu32_fnv1: u32,\n    pub testhashs64_fnv1: i64,\n    pub testhashu64_fnv1: u64,\n    pub testhashs32_fnv1a: i32,\n    pub testhashu32_fnv1a: u32,\n    pub testhashs64_fnv1a: i64,\n    pub testhashu64_fnv1a: u64,\n    pub testarrayofbools: Option<alloc::vec::Vec<bool>>,\n    pub testf: f32,\n    pub testf2: f32,\n    pub testf3: f32,\n    pub testarrayofstring2: Option<alloc::vec::Vec<alloc::string::String>>,\n    pub testarrayofsortedstruct: Option<alloc::vec::Vec<AbilityT>>,\n    pub flex: Option<alloc::vec::Vec<u8>>,\n    pub test5: Option<alloc::vec::Vec<TestT>>,\n    pub vector_of_longs: Option<alloc::vec::Vec<i64>>,\n    pub vector_of_doubles: Option<alloc::vec::Vec<f64>>,\n    pub parent_namespace_test: Option<alloc::boxed::Box<super::InParentNamespaceT>>,\n    pub vector_of_referrables: Option<alloc::vec::Vec<ReferrableT>>,\n    pub single_weak_reference: u64,\n    pub vector_of_weak_references: Option<alloc::vec::Vec<u64>>,\n    pub vector_of_strong_referrables: Option<alloc::vec::Vec<ReferrableT>>,\n    pub co_owning_reference: u64,\n    pub vector_of_co_owning_references: Option<alloc::vec::Vec<u64>>,\n    pub non_owning_reference: u64,\n    pub vector_of_non_owning_references: Option<alloc::vec::Vec<u64>>,\n    pub any_unique: AnyUniqueAliasesT,\n    pub any_ambiguous: AnyAmbiguousAliasesT,\n    pub vector_of_enums: Option<alloc::vec::Vec<Color>>,\n    pub signed_enum: Race,\n    pub testrequirednestedflatbuffer: Option<alloc::vec::Vec<u8>>,\n    pub scalar_key_sorted_tables: Option<alloc::vec::Vec<StatT>>,\n    pub native_inline: Option<TestT>,\n    pub long_enum_non_enum_default: LongEnum,\n    pub long_enum_normal_default: LongEnum,\n    pub nan_default: f32,\n    pub inf_default: f32,\n    pub positive_inf_default: f32,\n    pub infinity_default: f32,\n    pub positive_infinity_default: f32,\n    pub negative_inf_default: f32,\n    pub negative_infinity_default: f32,\n    pub double_inf_default: f64,\n}\n\nimpl Default for MonsterT {\n    fn default() -> Self {\n        Self {\n            pos: None,\n            mana: 150,\n            hp: 100,\n            name: alloc::string::ToString::to_string(\"\"),\n            inventory: None,\n            color: Color::Blue,\n            test: AnyT::NONE,\n            test4: None,\n            testarrayofstring: None,\n            testarrayoftables: None,\n            enemy: None,\n            testnestedflatbuffer: None,\n            testempty: None,\n            testbool: false,\n            testhashs32_fnv1: 0,\n            testhashu32_fnv1: 0,\n            testhashs64_fnv1: 0,\n            testhashu64_fnv1: 0,\n            testhashs32_fnv1a: 0,\n            testhashu32_fnv1a: 0,\n            testhashs64_fnv1a: 0,\n            testhashu64_fnv1a: 0,\n            testarrayofbools: None,\n            testf: 3.14159,\n            testf2: 3.0,\n            testf3: 0.0,\n            testarrayofstring2: None,\n            testarrayofsortedstruct: None,\n            flex: None,\n            test5: None,\n            vector_of_longs: None,\n            vector_of_doubles: None,\n            parent_namespace_test: None,\n            vector_of_referrables: None,\n            single_weak_reference: 0,\n            vector_of_weak_references: None,\n            vector_of_strong_referrables: None,\n            co_owning_reference: 0,\n            vector_of_co_owning_references: None,\n            non_owning_reference: 0,\n            vector_of_non_owning_references: None,\n            any_unique: AnyUniqueAliasesT::NONE,\n            any_ambiguous: AnyAmbiguousAliasesT::NONE,\n            vector_of_enums: None,\n            signed_enum: Race::None,\n            testrequirednestedflatbuffer: None,\n            scalar_key_sorted_tables: None,\n            native_inline: None,\n            long_enum_non_enum_default: Default::default(),\n            long_enum_normal_default: LongEnum::LongOne,\n            nan_default: f32::NAN,\n            inf_default: f32::INFINITY,\n            positive_inf_default: f32::INFINITY,\n            infinity_default: f32::INFINITY,\n            positive_infinity_default: f32::INFINITY,\n            negative_inf_default: f32::NEG_INFINITY,\n            negative_infinity_default: f32::NEG_INFINITY,\n            double_inf_default: f64::INFINITY,\n        }\n    }\n}\n\nimpl MonsterT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<Monster<'b>> {\n        let pos_tmp = self.pos.as_ref().map(|x| x.pack());\n        let pos = pos_tmp.as_ref();\n        let mana = self.mana;\n        let hp = self.hp;\n        let name = Some({\n            let x = &self.name;\n            _fbb.create_string(x)\n        });\n        let inventory = self.inventory.as_ref().map(|x|{\n            _fbb.create_vector(x)\n        });\n        let color = self.color;\n        let test_type = self.test.any_type();\n        let test = self.test.pack(_fbb);\n        let test4 = self.test4.as_ref().map(|x|{\n            let w: alloc::vec::Vec<_> = x.iter().map(|t| t.pack()).collect();_fbb.create_vector(&w)\n        });\n        let testarrayofstring = self.testarrayofstring.as_ref().map(|x|{\n            let w: alloc::vec::Vec<_> = x.iter().map(|s| _fbb.create_string(s)).collect();_fbb.create_vector(&w)\n        });\n        let testarrayoftables = self.testarrayoftables.as_ref().map(|x|{\n            let w: alloc::vec::Vec<_> = x.iter().map(|t| t.pack(_fbb)).collect();_fbb.create_vector(&w)\n        });\n        let enemy = self.enemy.as_ref().map(|x|{\n            x.pack(_fbb)\n        });\n        let testnestedflatbuffer = self.testnestedflatbuffer.as_ref().map(|x|{\n            _fbb.create_vector(x)\n        });\n        let testempty = self.testempty.as_ref().map(|x|{\n            x.pack(_fbb)\n        });\n        let testbool = self.testbool;\n        let testhashs32_fnv1 = self.testhashs32_fnv1;\n        let testhashu32_fnv1 = self.testhashu32_fnv1;\n        let testhashs64_fnv1 = self.testhashs64_fnv1;\n        let testhashu64_fnv1 = self.testhashu64_fnv1;\n        let testhashs32_fnv1a = self.testhashs32_fnv1a;\n        let testhashu32_fnv1a = self.testhashu32_fnv1a;\n        let testhashs64_fnv1a = self.testhashs64_fnv1a;\n        let testhashu64_fnv1a = self.testhashu64_fnv1a;\n        let testarrayofbools = self.testarrayofbools.as_ref().map(|x|{\n            _fbb.create_vector(x)\n        });\n        let testf = self.testf;\n        let testf2 = self.testf2;\n        let testf3 = self.testf3;\n        let testarrayofstring2 = self.testarrayofstring2.as_ref().map(|x|{\n            let w: alloc::vec::Vec<_> = x.iter().map(|s| _fbb.create_string(s)).collect();_fbb.create_vector(&w)\n        });\n        let testarrayofsortedstruct = self.testarrayofsortedstruct.as_ref().map(|x|{\n            let w: alloc::vec::Vec<_> = x.iter().map(|t| t.pack()).collect();_fbb.create_vector(&w)\n        });\n        let flex = self.flex.as_ref().map(|x|{\n            _fbb.create_vector(x)\n        });\n        let test5 = self.test5.as_ref().map(|x|{\n            let w: alloc::vec::Vec<_> = x.iter().map(|t| t.pack()).collect();_fbb.create_vector(&w)\n        });\n        let vector_of_longs = self.vector_of_longs.as_ref().map(|x|{\n            _fbb.create_vector(x)\n        });\n        let vector_of_doubles = self.vector_of_doubles.as_ref().map(|x|{\n            _fbb.create_vector(x)\n        });\n        let parent_namespace_test = self.parent_namespace_test.as_ref().map(|x|{\n            x.pack(_fbb)\n        });\n        let vector_of_referrables = self.vector_of_referrables.as_ref().map(|x|{\n            let w: alloc::vec::Vec<_> = x.iter().map(|t| t.pack(_fbb)).collect();_fbb.create_vector(&w)\n        });\n        let single_weak_reference = self.single_weak_reference;\n        let vector_of_weak_references = self.vector_of_weak_references.as_ref().map(|x|{\n            _fbb.create_vector(x)\n        });\n        let vector_of_strong_referrables = self.vector_of_strong_referrables.as_ref().map(|x|{\n            let w: alloc::vec::Vec<_> = x.iter().map(|t| t.pack(_fbb)).collect();_fbb.create_vector(&w)\n        });\n        let co_owning_reference = self.co_owning_reference;\n        let vector_of_co_owning_references = self.vector_of_co_owning_references.as_ref().map(|x|{\n            _fbb.create_vector(x)\n        });\n        let non_owning_reference = self.non_owning_reference;\n        let vector_of_non_owning_references = self.vector_of_non_owning_references.as_ref().map(|x|{\n            _fbb.create_vector(x)\n        });\n        let any_unique_type = self.any_unique.any_unique_aliases_type();\n        let any_unique = self.any_unique.pack(_fbb);\n        let any_ambiguous_type = self.any_ambiguous.any_ambiguous_aliases_type();\n        let any_ambiguous = self.any_ambiguous.pack(_fbb);\n        let vector_of_enums = self.vector_of_enums.as_ref().map(|x|{\n            _fbb.create_vector(x)\n        });\n        let signed_enum = self.signed_enum;\n        let testrequirednestedflatbuffer = self.testrequirednestedflatbuffer.as_ref().map(|x|{\n            _fbb.create_vector(x)\n        });\n        let scalar_key_sorted_tables = self.scalar_key_sorted_tables.as_ref().map(|x|{\n            let w: alloc::vec::Vec<_> = x.iter().map(|t| t.pack(_fbb)).collect();_fbb.create_vector(&w)\n        });\n        let native_inline_tmp = self.native_inline.as_ref().map(|x| x.pack());\n        let native_inline = native_inline_tmp.as_ref();\n        let long_enum_non_enum_default = self.long_enum_non_enum_default;\n        let long_enum_normal_default = self.long_enum_normal_default;\n        let nan_default = self.nan_default;\n        let inf_default = self.inf_default;\n        let positive_inf_default = self.positive_inf_default;\n        let infinity_default = self.infinity_default;\n        let positive_infinity_default = self.positive_infinity_default;\n        let negative_inf_default = self.negative_inf_default;\n        let negative_infinity_default = self.negative_infinity_default;\n        let double_inf_default = self.double_inf_default;\n        Monster::create(_fbb, &MonsterArgs{\n            pos,\n            mana,\n            hp,\n            name,\n            inventory,\n            color,\n            test_type,\n            test,\n            test4,\n            testarrayofstring,\n            testarrayoftables,\n            enemy,\n            testnestedflatbuffer,\n            testempty,\n            testbool,\n            testhashs32_fnv1,\n            testhashu32_fnv1,\n            testhashs64_fnv1,\n            testhashu64_fnv1,\n            testhashs32_fnv1a,\n            testhashu32_fnv1a,\n            testhashs64_fnv1a,\n            testhashu64_fnv1a,\n            testarrayofbools,\n            testf,\n            testf2,\n            testf3,\n            testarrayofstring2,\n            testarrayofsortedstruct,\n            flex,\n            test5,\n            vector_of_longs,\n            vector_of_doubles,\n            parent_namespace_test,\n            vector_of_referrables,\n            single_weak_reference,\n            vector_of_weak_references,\n            vector_of_strong_referrables,\n            co_owning_reference,\n            vector_of_co_owning_references,\n            non_owning_reference,\n            vector_of_non_owning_references,\n            any_unique_type,\n            any_unique,\n            any_ambiguous_type,\n            any_ambiguous,\n            vector_of_enums,\n            signed_enum,\n            testrequirednestedflatbuffer,\n            scalar_key_sorted_tables,\n            native_inline,\n            long_enum_non_enum_default,\n            long_enum_normal_default,\n            nan_default,\n            inf_default,\n            positive_inf_default,\n            infinity_default,\n            positive_infinity_default,\n            negative_inf_default,\n            negative_infinity_default,\n            double_inf_default,\n        })\n    }\n}\n\n/// Verifies that a buffer of bytes contains a `Monster`\n/// and returns it.\n/// Note that verification is still experimental and may not\n/// catch every error, or be maximally performant. For the\n/// previous, unchecked, behavior use\n/// `root_as_monster_unchecked`.\n#[inline]\npub fn root_as_monster(buf: &[u8]) -> Result<Monster<'_>, ::flatbuffers::InvalidFlatbuffer> {\n    ::flatbuffers::root::<Monster>(buf)\n}\n\n/// Verifies that a buffer of bytes contains a size prefixed\n/// `Monster` and returns it.\n/// Note that verification is still experimental and may not\n/// catch every error, or be maximally performant. For the\n/// previous, unchecked, behavior use\n/// `size_prefixed_root_as_monster_unchecked`.\n#[inline]\npub fn size_prefixed_root_as_monster(buf: &[u8]) -> Result<Monster<'_>, ::flatbuffers::InvalidFlatbuffer> {\n    ::flatbuffers::size_prefixed_root::<Monster>(buf)\n}\n\n/// Verifies, with the given options, that a buffer of bytes\n/// contains a `Monster` and returns it.\n/// Note that verification is still experimental and may not\n/// catch every error, or be maximally performant. For the\n/// previous, unchecked, behavior use\n/// `root_as_monster_unchecked`.\n#[inline]\npub fn root_as_monster_with_opts<'b, 'o>(\n    opts: &'o ::flatbuffers::VerifierOptions,\n    buf: &'b [u8],\n) -> Result<Monster<'b>, ::flatbuffers::InvalidFlatbuffer> {\n    ::flatbuffers::root_with_opts::<Monster<'b>>(opts, buf)\n}\n\n/// Verifies, with the given verifier options, that a buffer of\n/// bytes contains a size prefixed `Monster` and returns\n/// it. Note that verification is still experimental and may not\n/// catch every error, or be maximally performant. For the\n/// previous, unchecked, behavior use\n/// `root_as_monster_unchecked`.\n#[inline]\npub fn size_prefixed_root_as_monster_with_opts<'b, 'o>(\n    opts: &'o ::flatbuffers::VerifierOptions,\n    buf: &'b [u8],\n) -> Result<Monster<'b>, ::flatbuffers::InvalidFlatbuffer> {\n    ::flatbuffers::size_prefixed_root_with_opts::<Monster<'b>>(opts, buf)\n}\n\n/// Assumes, without verification, that a buffer of bytes contains a Monster and returns it.\n/// # Safety\n/// Callers must trust the given bytes do indeed contain a valid `Monster`.\n#[inline]\npub unsafe fn root_as_monster_unchecked(buf: &[u8]) -> Monster<'_> {\n    unsafe { ::flatbuffers::root_unchecked::<Monster>(buf) }\n}\n\n/// Assumes, without verification, that a buffer of bytes contains a size prefixed Monster and returns it.\n/// # Safety\n/// Callers must trust the given bytes do indeed contain a valid size prefixed `Monster`.\n#[inline]\npub unsafe fn size_prefixed_root_as_monster_unchecked(buf: &[u8]) -> Monster<'_> {\n    unsafe { ::flatbuffers::size_prefixed_root_unchecked::<Monster>(buf) }\n}\n\npub const MONSTER_IDENTIFIER: &str = \"MONS\";\n\n#[inline]\npub fn monster_buffer_has_identifier(buf: &[u8]) -> bool {\n    ::flatbuffers::buffer_has_identifier(buf, MONSTER_IDENTIFIER, false)\n}\n\n#[inline]\npub fn monster_size_prefixed_buffer_has_identifier(buf: &[u8]) -> bool {\n    ::flatbuffers::buffer_has_identifier(buf, MONSTER_IDENTIFIER, true)\n}\n\npub const MONSTER_EXTENSION: &str = \"mon\";\n\n#[inline]\npub fn finish_monster_buffer<'a, 'b, A: ::flatbuffers::Allocator + 'a>(\n    fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    root: ::flatbuffers::WIPOffset<Monster<'a>>\n) {\n    fbb.finish(root, Some(MONSTER_IDENTIFIER));\n}\n\n#[inline]\npub fn finish_size_prefixed_monster_buffer<'a, 'b, A: ::flatbuffers::Allocator + 'a>(\n    fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    root: ::flatbuffers::WIPOffset<Monster<'a>>\n) {\n    fbb.finish_size_prefixed(root, Some(MONSTER_IDENTIFIER));\n}\n"
  },
  {
    "path": "tests/monster_test_serialize/my_game/example/race_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nextern crate serde;\nuse self::serde::ser::{Serialize, Serializer, SerializeStruct};\nuse super::*;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MIN_RACE: i8 = -1;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MAX_RACE: i8 = 2;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n#[allow(non_camel_case_types)]\npub const ENUM_VALUES_RACE: [Race; 4] = [\n    Race::None,\n    Race::Human,\n    Race::Dwarf,\n    Race::Elf,\n];\n\n#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n#[repr(transparent)]\npub struct Race(pub i8);\n\n#[allow(non_upper_case_globals)]\nimpl Race {\n    pub const None: Self = Self(-1);\n    pub const Human: Self = Self(0);\n    pub const Dwarf: Self = Self(1);\n    pub const Elf: Self = Self(2);\n\n    pub const ENUM_MIN: i8 = -1;\n    pub const ENUM_MAX: i8 = 2;\n    pub const ENUM_VALUES: &'static [Self] = &[\n        Self::None,\n        Self::Human,\n        Self::Dwarf,\n        Self::Elf,\n    ];\n\n    /// Returns the variant's name or \"\" if unknown.\n    pub fn variant_name(self) -> Option<&'static str> {\n        match self {\n            Self::None => Some(\"None\"),\n            Self::Human => Some(\"Human\"),\n            Self::Dwarf => Some(\"Dwarf\"),\n            Self::Elf => Some(\"Elf\"),\n            _ => None,\n        }\n    }\n}\n\nimpl ::core::fmt::Debug for Race {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        if let Some(name) = self.variant_name() {\n            f.write_str(name)\n        } else {\n            f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n        }\n    }\n}\n\nimpl Serialize for Race {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        serializer.serialize_unit_variant(\"Race\", self.0 as u32, self.variant_name().unwrap())\n    }\n}\n\nimpl<'de> serde::Deserialize<'de> for Race {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: serde::Deserializer<'de>,\n    {\n        let s = String::deserialize(deserializer)?;\n        for item in Race::ENUM_VALUES {\n            if let Some(item_name) = item.variant_name() {\n                if item_name == s {\n                    return Ok(item.clone());\n                }\n            }\n        }\n        Err(serde::de::Error::custom(format!(\n            \"Unknown Race variant: {s}\"\n        )))\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Race {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<i8>(buf, loc) };\n        Self(b)\n    }\n}\n\nimpl ::flatbuffers::Push for Race {\n    type Output = Race;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<i8>(dst, self.0) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for Race {\n    type Scalar = i8;\n\n    #[inline]\n    fn to_little_endian(self) -> i8 {\n        self.0.to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: i8) -> Self {\n        let b = i8::from_le(v);\n        Self(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for Race {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        i8::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for Race {}\n"
  },
  {
    "path": "tests/monster_test_serialize/my_game/example/referrable_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nextern crate serde;\nuse self::serde::ser::{Serialize, Serializer, SerializeStruct};\nuse super::*;\n\npub enum ReferrableOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct Referrable<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Referrable<'a> {\n    type Inner = Referrable<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> Referrable<'a> {\n    pub const VT_ID: ::flatbuffers::VOffsetT = 4;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.Example.Referrable\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        Referrable { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args ReferrableArgs\n    ) -> ::flatbuffers::WIPOffset<Referrable<'bldr>> {\n        let mut builder = ReferrableBuilder::new(_fbb);\n        builder.add_id(args.id);\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> ReferrableT {\n        let id = self.id();\n        ReferrableT {\n            id,\n        }\n    }\n\n    #[inline]\n    pub fn id(&self) -> u64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u64>(Referrable::VT_ID, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn key_compare_less_than(&self, o: &Referrable) -> bool {\n        self.id() < o.id()\n    }\n\n    #[inline]\n    pub fn key_compare_with_value(&self, val: u64) -> ::core::cmp::Ordering {\n        let key = self.id();\n        key.cmp(&val)\n    }\n}\n\nimpl ::flatbuffers::Verifiable for Referrable<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<u64>(\"id\", Self::VT_ID, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct ReferrableArgs {\n    pub id: u64,\n}\n\nimpl<'a> Default for ReferrableArgs {\n    #[inline]\n    fn default() -> Self {\n        ReferrableArgs {\n            id: 0,\n        }\n    }\n}\n\nimpl Serialize for Referrable<'_> {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        let mut s = serializer.serialize_struct(\"Referrable\", 1)?;\n        s.serialize_field(\"id\", &self.id())?;\n        s.end()\n    }\n}\n\npub struct ReferrableBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> ReferrableBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_id(&mut self, id: u64) {\n        self.fbb_.push_slot::<u64>(Referrable::VT_ID, id, 0);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> ReferrableBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        ReferrableBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<Referrable<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for Referrable<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"Referrable\");\n        ds.field(\"id\", &self.id());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct ReferrableT {\n    pub id: u64,\n}\n\nimpl Default for ReferrableT {\n    fn default() -> Self {\n        Self {\n            id: 0,\n        }\n    }\n}\n\nimpl ReferrableT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<Referrable<'b>> {\n        let id = self.id;\n        Referrable::create(_fbb, &ReferrableArgs{\n            id,\n        })\n    }\n}\n"
  },
  {
    "path": "tests/monster_test_serialize/my_game/example/stat_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nextern crate serde;\nuse self::serde::ser::{Serialize, Serializer, SerializeStruct};\nuse super::*;\n\npub enum StatOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct Stat<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Stat<'a> {\n    type Inner = Stat<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> Stat<'a> {\n    pub const VT_ID: ::flatbuffers::VOffsetT = 4;\n    pub const VT_VAL: ::flatbuffers::VOffsetT = 6;\n    pub const VT_COUNT: ::flatbuffers::VOffsetT = 8;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.Example.Stat\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        Stat { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args StatArgs<'args>\n    ) -> ::flatbuffers::WIPOffset<Stat<'bldr>> {\n        let mut builder = StatBuilder::new(_fbb);\n        builder.add_val(args.val);\n        if let Some(x) = args.id { builder.add_id(x); }\n        builder.add_count(args.count);\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> StatT {\n        let id = self.id().map(|x| {\n            alloc::string::ToString::to_string(x)\n        });\n        let val = self.val();\n        let count = self.count();\n        StatT {\n            id,\n            val,\n            count,\n        }\n    }\n\n    #[inline]\n    pub fn id(&self) -> Option<&'a str> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<&str>>(Stat::VT_ID, None)}\n    }\n\n    #[inline]\n    pub fn val(&self) -> i64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i64>(Stat::VT_VAL, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn count(&self) -> u16 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u16>(Stat::VT_COUNT, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn key_compare_less_than(&self, o: &Stat) -> bool {\n        self.count() < o.count()\n    }\n\n    #[inline]\n    pub fn key_compare_with_value(&self, val: u16) -> ::core::cmp::Ordering {\n        let key = self.count();\n        key.cmp(&val)\n    }\n}\n\nimpl ::flatbuffers::Verifiable for Stat<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<&str>>(\"id\", Self::VT_ID, false)?\n            .visit_field::<i64>(\"val\", Self::VT_VAL, false)?\n            .visit_field::<u16>(\"count\", Self::VT_COUNT, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct StatArgs<'a> {\n    pub id: Option<::flatbuffers::WIPOffset<&'a str>>,\n    pub val: i64,\n    pub count: u16,\n}\n\nimpl<'a> Default for StatArgs<'a> {\n    #[inline]\n    fn default() -> Self {\n        StatArgs {\n            id: None,\n            val: 0,\n            count: 0,\n        }\n    }\n}\n\nimpl Serialize for Stat<'_> {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        let mut s = serializer.serialize_struct(\"Stat\", 3)?;\n        if let Some(f) = self.id() {\n            s.serialize_field(\"id\", &f)?;\n        } else {\n            s.skip_field(\"id\")?;\n        }\n        s.serialize_field(\"val\", &self.val())?;\n        s.serialize_field(\"count\", &self.count())?;\n        s.end()\n    }\n}\n\npub struct StatBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> StatBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_id(&mut self, id: ::flatbuffers::WIPOffset<&'b  str>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Stat::VT_ID, id);\n    }\n\n    #[inline]\n    pub fn add_val(&mut self, val: i64) {\n        self.fbb_.push_slot::<i64>(Stat::VT_VAL, val, 0);\n    }\n\n    #[inline]\n    pub fn add_count(&mut self, count: u16) {\n        self.fbb_.push_slot::<u16>(Stat::VT_COUNT, count, 0);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> StatBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        StatBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<Stat<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for Stat<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"Stat\");\n        ds.field(\"id\", &self.id());\n        ds.field(\"val\", &self.val());\n        ds.field(\"count\", &self.count());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct StatT {\n    pub id: Option<alloc::string::String>,\n    pub val: i64,\n    pub count: u16,\n}\n\nimpl Default for StatT {\n    fn default() -> Self {\n        Self {\n            id: None,\n            val: 0,\n            count: 0,\n        }\n    }\n}\n\nimpl StatT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<Stat<'b>> {\n        let id = self.id.as_ref().map(|x|{\n            _fbb.create_string(x)\n        });\n        let val = self.val;\n        let count = self.count;\n        Stat::create(_fbb, &StatArgs{\n            id,\n            val,\n            count,\n        })\n    }\n}\n"
  },
  {
    "path": "tests/monster_test_serialize/my_game/example/struct_of_structs_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nextern crate serde;\nuse self::serde::ser::{Serialize, Serializer, SerializeStruct};\nuse super::*;\n\n// struct StructOfStructs, aligned to 4\n#[repr(transparent)]\n#[derive(Clone, Copy, PartialEq)]\npub struct StructOfStructs(pub [u8; 20]);\n\nimpl Default for StructOfStructs {\n    fn default() -> Self {\n        Self([0; 20])\n    }\n}\n\nimpl ::core::fmt::Debug for StructOfStructs {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        f.debug_struct(\"StructOfStructs\")\n            .field(\"a\", &self.a())\n            .field(\"b\", &self.b())\n            .field(\"c\", &self.c())\n            .finish()\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for StructOfStructs {}\n\nimpl<'a> ::flatbuffers::Follow<'a> for StructOfStructs {\n    type Inner = &'a StructOfStructs;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { <&'a StructOfStructs>::follow(buf, loc) }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for &'a StructOfStructs {\n    type Inner = &'a StructOfStructs;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { ::flatbuffers::follow_cast_ref::<StructOfStructs>(buf, loc) }\n    }\n}\n\nimpl<'b> ::flatbuffers::Push for StructOfStructs {\n    type Output = StructOfStructs;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        let src = unsafe { ::core::slice::from_raw_parts(self as *const StructOfStructs as *const u8, <Self as ::flatbuffers::Push>::size()) };\n        dst.copy_from_slice(src);\n    }\n\n    #[inline]\n    fn alignment() -> ::flatbuffers::PushAlignment {\n        ::flatbuffers::PushAlignment::new(4)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for StructOfStructs {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.in_buffer::<Self>(pos)\n    }\n}\n\nimpl Serialize for StructOfStructs {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n    let mut s = serializer.serialize_struct(\"StructOfStructs\", 3)?;\n        s.serialize_field(\"a\", &self.a())?;\n        s.serialize_field(\"b\", &self.b())?;\n        s.serialize_field(\"c\", &self.c())?;\n        s.end()\n    }\n}\n\nimpl<'a> StructOfStructs {\n    #[allow(clippy::too_many_arguments)]\n    pub fn new(\n        a: &Ability,\n        b: &Test,\n        c: &Ability,\n    ) -> Self {\n        let mut s = Self([0; 20]);\n        s.set_a(a);\n        s.set_b(b);\n        s.set_c(c);\n        s\n    }\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.Example.StructOfStructs\"\n    }\n\n    pub fn a(&self) -> &Ability {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid struct in this slot\n        unsafe { &*(self.0[0..].as_ptr() as *const Ability) }\n    }\n\n    #[allow(clippy::identity_op)]\n    pub fn set_a(&mut self, x: &Ability) {\n        self.0[0..0 + 8].copy_from_slice(&x.0)\n    }\n\n    pub fn b(&self) -> &Test {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid struct in this slot\n        unsafe { &*(self.0[8..].as_ptr() as *const Test) }\n    }\n\n    #[allow(clippy::identity_op)]\n    pub fn set_b(&mut self, x: &Test) {\n        self.0[8..8 + 4].copy_from_slice(&x.0)\n    }\n\n    pub fn c(&self) -> &Ability {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid struct in this slot\n        unsafe { &*(self.0[12..].as_ptr() as *const Ability) }\n    }\n\n    #[allow(clippy::identity_op)]\n    pub fn set_c(&mut self, x: &Ability) {\n        self.0[12..12 + 8].copy_from_slice(&x.0)\n    }\n\n    pub fn unpack(&self) -> StructOfStructsT {\n        StructOfStructsT {\n            a: self.a().unpack(),\n            b: self.b().unpack(),\n            c: self.c().unpack(),\n        }\n    }\n}\n\n#[derive(Debug, Clone, PartialEq)]\npub struct StructOfStructsT {\n    pub a: AbilityT,\n    pub b: TestT,\n    pub c: AbilityT,\n}\nimpl Default for StructOfStructsT {\n    fn default() -> Self {\n        Self {\n            a: Default::default(),\n            b: Default::default(),\n            c: Default::default(),\n        }\n    }\n}\n\nimpl StructOfStructsT {\n    pub fn pack(&self) -> StructOfStructs {\n        StructOfStructs::new(\n            &self.a.pack(),\n            &self.b.pack(),\n            &self.c.pack(),\n        )\n    }\n}\n"
  },
  {
    "path": "tests/monster_test_serialize/my_game/example/struct_of_structs_of_structs_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nextern crate serde;\nuse self::serde::ser::{Serialize, Serializer, SerializeStruct};\nuse super::*;\n\n// struct StructOfStructsOfStructs, aligned to 4\n#[repr(transparent)]\n#[derive(Clone, Copy, PartialEq)]\npub struct StructOfStructsOfStructs(pub [u8; 20]);\n\nimpl Default for StructOfStructsOfStructs {\n    fn default() -> Self {\n        Self([0; 20])\n    }\n}\n\nimpl ::core::fmt::Debug for StructOfStructsOfStructs {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        f.debug_struct(\"StructOfStructsOfStructs\")\n            .field(\"a\", &self.a())\n            .finish()\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for StructOfStructsOfStructs {}\n\nimpl<'a> ::flatbuffers::Follow<'a> for StructOfStructsOfStructs {\n    type Inner = &'a StructOfStructsOfStructs;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { <&'a StructOfStructsOfStructs>::follow(buf, loc) }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for &'a StructOfStructsOfStructs {\n    type Inner = &'a StructOfStructsOfStructs;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { ::flatbuffers::follow_cast_ref::<StructOfStructsOfStructs>(buf, loc) }\n    }\n}\n\nimpl<'b> ::flatbuffers::Push for StructOfStructsOfStructs {\n    type Output = StructOfStructsOfStructs;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        let src = unsafe { ::core::slice::from_raw_parts(self as *const StructOfStructsOfStructs as *const u8, <Self as ::flatbuffers::Push>::size()) };\n        dst.copy_from_slice(src);\n    }\n\n    #[inline]\n    fn alignment() -> ::flatbuffers::PushAlignment {\n        ::flatbuffers::PushAlignment::new(4)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for StructOfStructsOfStructs {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.in_buffer::<Self>(pos)\n    }\n}\n\nimpl Serialize for StructOfStructsOfStructs {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n    let mut s = serializer.serialize_struct(\"StructOfStructsOfStructs\", 1)?;\n        s.serialize_field(\"a\", &self.a())?;\n        s.end()\n    }\n}\n\nimpl<'a> StructOfStructsOfStructs {\n    #[allow(clippy::too_many_arguments)]\n    pub fn new(\n        a: &StructOfStructs,\n    ) -> Self {\n        let mut s = Self([0; 20]);\n        s.set_a(a);\n        s\n    }\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.Example.StructOfStructsOfStructs\"\n    }\n\n    pub fn a(&self) -> &StructOfStructs {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid struct in this slot\n        unsafe { &*(self.0[0..].as_ptr() as *const StructOfStructs) }\n    }\n\n    #[allow(clippy::identity_op)]\n    pub fn set_a(&mut self, x: &StructOfStructs) {\n        self.0[0..0 + 20].copy_from_slice(&x.0)\n    }\n\n    pub fn unpack(&self) -> StructOfStructsOfStructsT {\n        StructOfStructsOfStructsT {\n            a: self.a().unpack(),\n        }\n    }\n}\n\n#[derive(Debug, Clone, PartialEq)]\npub struct StructOfStructsOfStructsT {\n    pub a: StructOfStructsT,\n}\nimpl Default for StructOfStructsOfStructsT {\n    fn default() -> Self {\n        Self {\n            a: Default::default(),\n        }\n    }\n}\n\nimpl StructOfStructsOfStructsT {\n    pub fn pack(&self) -> StructOfStructsOfStructs {\n        StructOfStructsOfStructs::new(\n            &self.a.pack(),\n        )\n    }\n}\n"
  },
  {
    "path": "tests/monster_test_serialize/my_game/example/test_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nextern crate serde;\nuse self::serde::ser::{Serialize, Serializer, SerializeStruct};\nuse super::*;\n\n// struct Test, aligned to 2\n#[repr(transparent)]\n#[derive(Clone, Copy, PartialEq)]\npub struct Test(pub [u8; 4]);\n\nimpl Default for Test {\n    fn default() -> Self {\n        Self([0; 4])\n    }\n}\n\nimpl ::core::fmt::Debug for Test {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        f.debug_struct(\"Test\")\n            .field(\"a\", &self.a())\n            .field(\"b\", &self.b())\n            .finish()\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for Test {}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Test {\n    type Inner = &'a Test;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { <&'a Test>::follow(buf, loc) }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for &'a Test {\n    type Inner = &'a Test;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { ::flatbuffers::follow_cast_ref::<Test>(buf, loc) }\n    }\n}\n\nimpl<'b> ::flatbuffers::Push for Test {\n    type Output = Test;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        let src = unsafe { ::core::slice::from_raw_parts(self as *const Test as *const u8, <Self as ::flatbuffers::Push>::size()) };\n        dst.copy_from_slice(src);\n    }\n\n    #[inline]\n    fn alignment() -> ::flatbuffers::PushAlignment {\n        ::flatbuffers::PushAlignment::new(2)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for Test {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.in_buffer::<Self>(pos)\n    }\n}\n\nimpl Serialize for Test {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n    let mut s = serializer.serialize_struct(\"Test\", 2)?;\n        s.serialize_field(\"a\", &self.a())?;\n        s.serialize_field(\"b\", &self.b())?;\n        s.end()\n    }\n}\n\nimpl<'a> Test {\n    #[allow(clippy::too_many_arguments)]\n    pub fn new(\n        a: i16,\n        b: i8,\n    ) -> Self {\n        let mut s = Self([0; 4]);\n        s.set_a(a);\n        s.set_b(b);\n        s\n    }\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.Example.Test\"\n    }\n\n    pub fn a(&self) -> i16 {\n        let mut mem = ::core::mem::MaybeUninit::<<i16 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[0..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<i16 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_a(&mut self, x: i16) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[0..].as_mut_ptr(),\n                ::core::mem::size_of::<<i16 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn b(&self) -> i8 {\n        let mut mem = ::core::mem::MaybeUninit::<<i8 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[2..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<i8 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_b(&mut self, x: i8) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[2..].as_mut_ptr(),\n                ::core::mem::size_of::<<i8 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn unpack(&self) -> TestT {\n        TestT {\n            a: self.a(),\n            b: self.b(),\n        }\n    }\n}\n\n#[derive(Debug, Clone, PartialEq)]\npub struct TestT {\n    pub a: i16,\n    pub b: i8,\n}\nimpl Default for TestT {\n    fn default() -> Self {\n        Self {\n            a: 0,\n            b: 0,\n        }\n    }\n}\n\nimpl TestT {\n    pub fn pack(&self) -> Test {\n        Test::new(\n            self.a,\n            self.b,\n        )\n    }\n}\n"
  },
  {
    "path": "tests/monster_test_serialize/my_game/example/test_simple_table_with_enum_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nextern crate serde;\nuse self::serde::ser::{Serialize, Serializer, SerializeStruct};\nuse super::*;\n\npub enum TestSimpleTableWithEnumOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct TestSimpleTableWithEnum<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for TestSimpleTableWithEnum<'a> {\n    type Inner = TestSimpleTableWithEnum<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> TestSimpleTableWithEnum<'a> {\n    pub const VT_COLOR: ::flatbuffers::VOffsetT = 4;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.Example.TestSimpleTableWithEnum\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        TestSimpleTableWithEnum { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args TestSimpleTableWithEnumArgs\n    ) -> ::flatbuffers::WIPOffset<TestSimpleTableWithEnum<'bldr>> {\n        let mut builder = TestSimpleTableWithEnumBuilder::new(_fbb);\n        builder.add_color(args.color);\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> TestSimpleTableWithEnumT {\n        let color = self.color();\n        TestSimpleTableWithEnumT {\n            color,\n        }\n    }\n\n    #[inline]\n    pub fn color(&self) -> Color {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<Color>(TestSimpleTableWithEnum::VT_COLOR, Some(Color::Green)).unwrap()}\n    }\n}\n\nimpl ::flatbuffers::Verifiable for TestSimpleTableWithEnum<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<Color>(\"color\", Self::VT_COLOR, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct TestSimpleTableWithEnumArgs {\n    pub color: Color,\n}\n\nimpl<'a> Default for TestSimpleTableWithEnumArgs {\n    #[inline]\n    fn default() -> Self {\n        TestSimpleTableWithEnumArgs {\n            color: Color::Green,\n        }\n    }\n}\n\nimpl Serialize for TestSimpleTableWithEnum<'_> {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        let mut s = serializer.serialize_struct(\"TestSimpleTableWithEnum\", 1)?;\n        s.serialize_field(\"color\", &self.color())?;\n        s.end()\n    }\n}\n\npub struct TestSimpleTableWithEnumBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> TestSimpleTableWithEnumBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_color(&mut self, color: Color) {\n        self.fbb_.push_slot::<Color>(TestSimpleTableWithEnum::VT_COLOR, color, Color::Green);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> TestSimpleTableWithEnumBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        TestSimpleTableWithEnumBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<TestSimpleTableWithEnum<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for TestSimpleTableWithEnum<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"TestSimpleTableWithEnum\");\n        ds.field(\"color\", &self.color());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct TestSimpleTableWithEnumT {\n    pub color: Color,\n}\n\nimpl Default for TestSimpleTableWithEnumT {\n    fn default() -> Self {\n        Self {\n            color: Color::Green,\n        }\n    }\n}\n\nimpl TestSimpleTableWithEnumT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<TestSimpleTableWithEnum<'b>> {\n        let color = self.color;\n        TestSimpleTableWithEnum::create(_fbb, &TestSimpleTableWithEnumArgs{\n            color,\n        })\n    }\n}\n"
  },
  {
    "path": "tests/monster_test_serialize/my_game/example/type_aliases_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nextern crate serde;\nuse self::serde::ser::{Serialize, Serializer, SerializeStruct};\nuse super::*;\n\npub enum TypeAliasesOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct TypeAliases<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for TypeAliases<'a> {\n    type Inner = TypeAliases<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> TypeAliases<'a> {\n    pub const VT_I8_: ::flatbuffers::VOffsetT = 4;\n    pub const VT_U8_: ::flatbuffers::VOffsetT = 6;\n    pub const VT_I16_: ::flatbuffers::VOffsetT = 8;\n    pub const VT_U16_: ::flatbuffers::VOffsetT = 10;\n    pub const VT_I32_: ::flatbuffers::VOffsetT = 12;\n    pub const VT_U32_: ::flatbuffers::VOffsetT = 14;\n    pub const VT_I64_: ::flatbuffers::VOffsetT = 16;\n    pub const VT_U64_: ::flatbuffers::VOffsetT = 18;\n    pub const VT_F32_: ::flatbuffers::VOffsetT = 20;\n    pub const VT_F64_: ::flatbuffers::VOffsetT = 22;\n    pub const VT_V8: ::flatbuffers::VOffsetT = 24;\n    pub const VT_VF64: ::flatbuffers::VOffsetT = 26;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.Example.TypeAliases\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        TypeAliases { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args TypeAliasesArgs<'args>\n    ) -> ::flatbuffers::WIPOffset<TypeAliases<'bldr>> {\n        let mut builder = TypeAliasesBuilder::new(_fbb);\n        builder.add_f64_(args.f64_);\n        builder.add_u64_(args.u64_);\n        builder.add_i64_(args.i64_);\n        if let Some(x) = args.vf64 { builder.add_vf64(x); }\n        if let Some(x) = args.v8 { builder.add_v8(x); }\n        builder.add_f32_(args.f32_);\n        builder.add_u32_(args.u32_);\n        builder.add_i32_(args.i32_);\n        builder.add_u16_(args.u16_);\n        builder.add_i16_(args.i16_);\n        builder.add_u8_(args.u8_);\n        builder.add_i8_(args.i8_);\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> TypeAliasesT {\n        let i8_ = self.i8_();\n        let u8_ = self.u8_();\n        let i16_ = self.i16_();\n        let u16_ = self.u16_();\n        let i32_ = self.i32_();\n        let u32_ = self.u32_();\n        let i64_ = self.i64_();\n        let u64_ = self.u64_();\n        let f32_ = self.f32_();\n        let f64_ = self.f64_();\n        let v8 = self.v8().map(|x| {\n            x.into_iter().collect()\n        });\n        let vf64 = self.vf64().map(|x| {\n            x.into_iter().collect()\n        });\n        TypeAliasesT {\n            i8_,\n            u8_,\n            i16_,\n            u16_,\n            i32_,\n            u32_,\n            i64_,\n            u64_,\n            f32_,\n            f64_,\n            v8,\n            vf64,\n        }\n    }\n\n    #[inline]\n    pub fn i8_(&self) -> i8 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i8>(TypeAliases::VT_I8_, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn u8_(&self) -> u8 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u8>(TypeAliases::VT_U8_, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn i16_(&self) -> i16 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i16>(TypeAliases::VT_I16_, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn u16_(&self) -> u16 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u16>(TypeAliases::VT_U16_, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn i32_(&self) -> i32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i32>(TypeAliases::VT_I32_, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn u32_(&self) -> u32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u32>(TypeAliases::VT_U32_, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn i64_(&self) -> i64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i64>(TypeAliases::VT_I64_, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn u64_(&self) -> u64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u64>(TypeAliases::VT_U64_, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn f32_(&self) -> f32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f32>(TypeAliases::VT_F32_, Some(0.0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn f64_(&self) -> f64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f64>(TypeAliases::VT_F64_, Some(0.0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn v8(&self) -> Option<::flatbuffers::Vector<'a, i8>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, i8>>>(TypeAliases::VT_V8, None)}\n    }\n\n    #[inline]\n    pub fn vf64(&self) -> Option<::flatbuffers::Vector<'a, f64>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, f64>>>(TypeAliases::VT_VF64, None)}\n    }\n}\n\nimpl ::flatbuffers::Verifiable for TypeAliases<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<i8>(\"i8_\", Self::VT_I8_, false)?\n            .visit_field::<u8>(\"u8_\", Self::VT_U8_, false)?\n            .visit_field::<i16>(\"i16_\", Self::VT_I16_, false)?\n            .visit_field::<u16>(\"u16_\", Self::VT_U16_, false)?\n            .visit_field::<i32>(\"i32_\", Self::VT_I32_, false)?\n            .visit_field::<u32>(\"u32_\", Self::VT_U32_, false)?\n            .visit_field::<i64>(\"i64_\", Self::VT_I64_, false)?\n            .visit_field::<u64>(\"u64_\", Self::VT_U64_, false)?\n            .visit_field::<f32>(\"f32_\", Self::VT_F32_, false)?\n            .visit_field::<f64>(\"f64_\", Self::VT_F64_, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, i8>>>(\"v8\", Self::VT_V8, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, f64>>>(\"vf64\", Self::VT_VF64, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct TypeAliasesArgs<'a> {\n    pub i8_: i8,\n    pub u8_: u8,\n    pub i16_: i16,\n    pub u16_: u16,\n    pub i32_: i32,\n    pub u32_: u32,\n    pub i64_: i64,\n    pub u64_: u64,\n    pub f32_: f32,\n    pub f64_: f64,\n    pub v8: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, i8>>>,\n    pub vf64: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, f64>>>,\n}\n\nimpl<'a> Default for TypeAliasesArgs<'a> {\n    #[inline]\n    fn default() -> Self {\n        TypeAliasesArgs {\n            i8_: 0,\n            u8_: 0,\n            i16_: 0,\n            u16_: 0,\n            i32_: 0,\n            u32_: 0,\n            i64_: 0,\n            u64_: 0,\n            f32_: 0.0,\n            f64_: 0.0,\n            v8: None,\n            vf64: None,\n        }\n    }\n}\n\nimpl Serialize for TypeAliases<'_> {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        let mut s = serializer.serialize_struct(\"TypeAliases\", 12)?;\n        s.serialize_field(\"i8_\", &self.i8_())?;\n        s.serialize_field(\"u8_\", &self.u8_())?;\n        s.serialize_field(\"i16_\", &self.i16_())?;\n        s.serialize_field(\"u16_\", &self.u16_())?;\n        s.serialize_field(\"i32_\", &self.i32_())?;\n        s.serialize_field(\"u32_\", &self.u32_())?;\n        s.serialize_field(\"i64_\", &self.i64_())?;\n        s.serialize_field(\"u64_\", &self.u64_())?;\n        s.serialize_field(\"f32_\", &self.f32_())?;\n        s.serialize_field(\"f64_\", &self.f64_())?;\n        if let Some(f) = self.v8() {\n            s.serialize_field(\"v8\", &f)?;\n        } else {\n            s.skip_field(\"v8\")?;\n        }\n        if let Some(f) = self.vf64() {\n            s.serialize_field(\"vf64\", &f)?;\n        } else {\n            s.skip_field(\"vf64\")?;\n        }\n        s.end()\n    }\n}\n\npub struct TypeAliasesBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> TypeAliasesBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_i8_(&mut self, i8_: i8) {\n        self.fbb_.push_slot::<i8>(TypeAliases::VT_I8_, i8_, 0);\n    }\n\n    #[inline]\n    pub fn add_u8_(&mut self, u8_: u8) {\n        self.fbb_.push_slot::<u8>(TypeAliases::VT_U8_, u8_, 0);\n    }\n\n    #[inline]\n    pub fn add_i16_(&mut self, i16_: i16) {\n        self.fbb_.push_slot::<i16>(TypeAliases::VT_I16_, i16_, 0);\n    }\n\n    #[inline]\n    pub fn add_u16_(&mut self, u16_: u16) {\n        self.fbb_.push_slot::<u16>(TypeAliases::VT_U16_, u16_, 0);\n    }\n\n    #[inline]\n    pub fn add_i32_(&mut self, i32_: i32) {\n        self.fbb_.push_slot::<i32>(TypeAliases::VT_I32_, i32_, 0);\n    }\n\n    #[inline]\n    pub fn add_u32_(&mut self, u32_: u32) {\n        self.fbb_.push_slot::<u32>(TypeAliases::VT_U32_, u32_, 0);\n    }\n\n    #[inline]\n    pub fn add_i64_(&mut self, i64_: i64) {\n        self.fbb_.push_slot::<i64>(TypeAliases::VT_I64_, i64_, 0);\n    }\n\n    #[inline]\n    pub fn add_u64_(&mut self, u64_: u64) {\n        self.fbb_.push_slot::<u64>(TypeAliases::VT_U64_, u64_, 0);\n    }\n\n    #[inline]\n    pub fn add_f32_(&mut self, f32_: f32) {\n        self.fbb_.push_slot::<f32>(TypeAliases::VT_F32_, f32_, 0.0);\n    }\n\n    #[inline]\n    pub fn add_f64_(&mut self, f64_: f64) {\n        self.fbb_.push_slot::<f64>(TypeAliases::VT_F64_, f64_, 0.0);\n    }\n\n    #[inline]\n    pub fn add_v8(&mut self, v8: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , i8>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(TypeAliases::VT_V8, v8);\n    }\n\n    #[inline]\n    pub fn add_vf64(&mut self, vf64: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , f64>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(TypeAliases::VT_VF64, vf64);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> TypeAliasesBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        TypeAliasesBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<TypeAliases<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for TypeAliases<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"TypeAliases\");\n        ds.field(\"i8_\", &self.i8_());\n        ds.field(\"u8_\", &self.u8_());\n        ds.field(\"i16_\", &self.i16_());\n        ds.field(\"u16_\", &self.u16_());\n        ds.field(\"i32_\", &self.i32_());\n        ds.field(\"u32_\", &self.u32_());\n        ds.field(\"i64_\", &self.i64_());\n        ds.field(\"u64_\", &self.u64_());\n        ds.field(\"f32_\", &self.f32_());\n        ds.field(\"f64_\", &self.f64_());\n        ds.field(\"v8\", &self.v8());\n        ds.field(\"vf64\", &self.vf64());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct TypeAliasesT {\n    pub i8_: i8,\n    pub u8_: u8,\n    pub i16_: i16,\n    pub u16_: u16,\n    pub i32_: i32,\n    pub u32_: u32,\n    pub i64_: i64,\n    pub u64_: u64,\n    pub f32_: f32,\n    pub f64_: f64,\n    pub v8: Option<alloc::vec::Vec<i8>>,\n    pub vf64: Option<alloc::vec::Vec<f64>>,\n}\n\nimpl Default for TypeAliasesT {\n    fn default() -> Self {\n        Self {\n            i8_: 0,\n            u8_: 0,\n            i16_: 0,\n            u16_: 0,\n            i32_: 0,\n            u32_: 0,\n            i64_: 0,\n            u64_: 0,\n            f32_: 0.0,\n            f64_: 0.0,\n            v8: None,\n            vf64: None,\n        }\n    }\n}\n\nimpl TypeAliasesT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<TypeAliases<'b>> {\n        let i8_ = self.i8_;\n        let u8_ = self.u8_;\n        let i16_ = self.i16_;\n        let u16_ = self.u16_;\n        let i32_ = self.i32_;\n        let u32_ = self.u32_;\n        let i64_ = self.i64_;\n        let u64_ = self.u64_;\n        let f32_ = self.f32_;\n        let f64_ = self.f64_;\n        let v8 = self.v8.as_ref().map(|x|{\n            _fbb.create_vector(x)\n        });\n        let vf64 = self.vf64.as_ref().map(|x|{\n            _fbb.create_vector(x)\n        });\n        TypeAliases::create(_fbb, &TypeAliasesArgs{\n            i8_,\n            u8_,\n            i16_,\n            u16_,\n            i32_,\n            u32_,\n            i64_,\n            u64_,\n            f32_,\n            f64_,\n            v8,\n            vf64,\n        })\n    }\n}\n"
  },
  {
    "path": "tests/monster_test_serialize/my_game/example/vec_3_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nextern crate serde;\nuse self::serde::ser::{Serialize, Serializer, SerializeStruct};\nuse super::*;\n\n// struct Vec3, aligned to 8\n#[repr(transparent)]\n#[derive(Clone, Copy, PartialEq)]\npub struct Vec3(pub [u8; 32]);\n\nimpl Default for Vec3 {\n    fn default() -> Self {\n        Self([0; 32])\n    }\n}\n\nimpl ::core::fmt::Debug for Vec3 {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        f.debug_struct(\"Vec3\")\n            .field(\"x\", &self.x())\n            .field(\"y\", &self.y())\n            .field(\"z\", &self.z())\n            .field(\"test1\", &self.test1())\n            .field(\"test2\", &self.test2())\n            .field(\"test3\", &self.test3())\n            .finish()\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for Vec3 {}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Vec3 {\n    type Inner = &'a Vec3;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { <&'a Vec3>::follow(buf, loc) }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for &'a Vec3 {\n    type Inner = &'a Vec3;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { ::flatbuffers::follow_cast_ref::<Vec3>(buf, loc) }\n    }\n}\n\nimpl<'b> ::flatbuffers::Push for Vec3 {\n    type Output = Vec3;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        let src = unsafe { ::core::slice::from_raw_parts(self as *const Vec3 as *const u8, <Self as ::flatbuffers::Push>::size()) };\n        dst.copy_from_slice(src);\n    }\n\n    #[inline]\n    fn alignment() -> ::flatbuffers::PushAlignment {\n        ::flatbuffers::PushAlignment::new(8)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for Vec3 {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.in_buffer::<Self>(pos)\n    }\n}\n\nimpl Serialize for Vec3 {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n    let mut s = serializer.serialize_struct(\"Vec3\", 6)?;\n        s.serialize_field(\"x\", &self.x())?;\n        s.serialize_field(\"y\", &self.y())?;\n        s.serialize_field(\"z\", &self.z())?;\n        s.serialize_field(\"test1\", &self.test1())?;\n        s.serialize_field(\"test2\", &self.test2())?;\n        s.serialize_field(\"test3\", &self.test3())?;\n        s.end()\n    }\n}\n\nimpl<'a> Vec3 {\n    #[allow(clippy::too_many_arguments)]\n    pub fn new(\n        x: f32,\n        y: f32,\n        z: f32,\n        test1: f64,\n        test2: Color,\n        test3: &Test,\n    ) -> Self {\n        let mut s = Self([0; 32]);\n        s.set_x(x);\n        s.set_y(y);\n        s.set_z(z);\n        s.set_test1(test1);\n        s.set_test2(test2);\n        s.set_test3(test3);\n        s\n    }\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.Example.Vec3\"\n    }\n\n    pub fn x(&self) -> f32 {\n        let mut mem = ::core::mem::MaybeUninit::<<f32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[0..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_x(&mut self, x: f32) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[0..].as_mut_ptr(),\n                ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn y(&self) -> f32 {\n        let mut mem = ::core::mem::MaybeUninit::<<f32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[4..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_y(&mut self, x: f32) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[4..].as_mut_ptr(),\n                ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn z(&self) -> f32 {\n        let mut mem = ::core::mem::MaybeUninit::<<f32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[8..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_z(&mut self, x: f32) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[8..].as_mut_ptr(),\n                ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn test1(&self) -> f64 {\n        let mut mem = ::core::mem::MaybeUninit::<<f64 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[16..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<f64 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_test1(&mut self, x: f64) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[16..].as_mut_ptr(),\n                ::core::mem::size_of::<<f64 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn test2(&self) -> Color {\n        let mut mem = ::core::mem::MaybeUninit::<<Color as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[24..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<Color as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_test2(&mut self, x: Color) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[24..].as_mut_ptr(),\n                ::core::mem::size_of::<<Color as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn test3(&self) -> &Test {\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid struct in this slot\n        unsafe { &*(self.0[26..].as_ptr() as *const Test) }\n    }\n\n    #[allow(clippy::identity_op)]\n    pub fn set_test3(&mut self, x: &Test) {\n        self.0[26..26 + 4].copy_from_slice(&x.0)\n    }\n\n    pub fn unpack(&self) -> Vec3T {\n        Vec3T {\n            x: self.x(),\n            y: self.y(),\n            z: self.z(),\n            test1: self.test1(),\n            test2: self.test2(),\n            test3: self.test3().unpack(),\n        }\n    }\n}\n\n#[derive(Debug, Clone, PartialEq)]\npub struct Vec3T {\n    pub x: f32,\n    pub y: f32,\n    pub z: f32,\n    pub test1: f64,\n    pub test2: Color,\n    pub test3: TestT,\n}\nimpl Default for Vec3T {\n    fn default() -> Self {\n        Self {\n            x: 0.0,\n            y: 0.0,\n            z: 0.0,\n            test1: 0.0,\n            test2: Default::default(),\n            test3: Default::default(),\n        }\n    }\n}\n\nimpl Vec3T {\n    pub fn pack(&self) -> Vec3 {\n        Vec3::new(\n            self.x,\n            self.y,\n            self.z,\n            self.test1,\n            self.test2,\n            &self.test3.pack(),\n        )\n    }\n}\n"
  },
  {
    "path": "tests/monster_test_serialize/my_game/example_2/monster_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nextern crate serde;\nuse self::serde::ser::{Serialize, Serializer, SerializeStruct};\nuse super::*;\n\npub enum MonsterOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct Monster<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Monster<'a> {\n    type Inner = Monster<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> Monster<'a> {\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.Example2.Monster\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        Monster { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        _args: &'args MonsterArgs\n    ) -> ::flatbuffers::WIPOffset<Monster<'bldr>> {\n        let mut builder = MonsterBuilder::new(_fbb);\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> MonsterT {\n        MonsterT {\n        }\n    }\n}\n\nimpl ::flatbuffers::Verifiable for Monster<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct MonsterArgs {\n}\n\nimpl<'a> Default for MonsterArgs {\n    #[inline]\n    fn default() -> Self {\n        MonsterArgs {\n        }\n    }\n}\n\nimpl Serialize for Monster<'_> {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        let s = serializer.serialize_struct(\"Monster\", 0)?;\n        s.end()\n    }\n}\n\npub struct MonsterBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> MonsterBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> MonsterBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        MonsterBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<Monster<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for Monster<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"Monster\");\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct MonsterT {\n}\n\nimpl Default for MonsterT {\n    fn default() -> Self {\n        Self {\n        }\n    }\n}\n\nimpl MonsterT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<Monster<'b>> {\n        Monster::create(_fbb, &MonsterArgs{\n        })\n    }\n}\n"
  },
  {
    "path": "tests/monster_test_serialize/my_game/in_parent_namespace_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nextern crate serde;\nuse self::serde::ser::{Serialize, Serializer, SerializeStruct};\nuse super::*;\n\npub enum InParentNamespaceOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct InParentNamespace<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for InParentNamespace<'a> {\n    type Inner = InParentNamespace<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> InParentNamespace<'a> {\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.InParentNamespace\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        InParentNamespace { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        _args: &'args InParentNamespaceArgs\n    ) -> ::flatbuffers::WIPOffset<InParentNamespace<'bldr>> {\n        let mut builder = InParentNamespaceBuilder::new(_fbb);\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> InParentNamespaceT {\n        InParentNamespaceT {\n        }\n    }\n}\n\nimpl ::flatbuffers::Verifiable for InParentNamespace<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct InParentNamespaceArgs {\n}\n\nimpl<'a> Default for InParentNamespaceArgs {\n    #[inline]\n    fn default() -> Self {\n        InParentNamespaceArgs {\n        }\n    }\n}\n\nimpl Serialize for InParentNamespace<'_> {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        let s = serializer.serialize_struct(\"InParentNamespace\", 0)?;\n        s.end()\n    }\n}\n\npub struct InParentNamespaceBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> InParentNamespaceBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> InParentNamespaceBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        InParentNamespaceBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<InParentNamespace<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for InParentNamespace<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"InParentNamespace\");\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct InParentNamespaceT {\n}\n\nimpl Default for InParentNamespaceT {\n    fn default() -> Self {\n        Self {\n        }\n    }\n}\n\nimpl InParentNamespaceT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<InParentNamespace<'b>> {\n        InParentNamespace::create(_fbb, &InParentNamespaceArgs{\n        })\n    }\n}\n"
  },
  {
    "path": "tests/monster_test_serialize/my_game/other_name_space/from_include_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nextern crate serde;\nuse self::serde::ser::{Serialize, Serializer, SerializeStruct};\nuse super::*;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MIN_FROM_INCLUDE: i64 = 0;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MAX_FROM_INCLUDE: i64 = 0;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n#[allow(non_camel_case_types)]\npub const ENUM_VALUES_FROM_INCLUDE: [FromInclude; 1] = [\n    FromInclude::IncludeVal,\n];\n\n#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n#[repr(transparent)]\npub struct FromInclude(pub i64);\n\n#[allow(non_upper_case_globals)]\nimpl FromInclude {\n    pub const IncludeVal: Self = Self(0);\n\n    pub const ENUM_MIN: i64 = 0;\n    pub const ENUM_MAX: i64 = 0;\n    pub const ENUM_VALUES: &'static [Self] = &[\n        Self::IncludeVal,\n    ];\n\n    /// Returns the variant's name or \"\" if unknown.\n    pub fn variant_name(self) -> Option<&'static str> {\n        match self {\n            Self::IncludeVal => Some(\"IncludeVal\"),\n            _ => None,\n        }\n    }\n}\n\nimpl ::core::fmt::Debug for FromInclude {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        if let Some(name) = self.variant_name() {\n            f.write_str(name)\n        } else {\n            f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n        }\n    }\n}\n\nimpl Serialize for FromInclude {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        serializer.serialize_unit_variant(\"FromInclude\", self.0 as u32, self.variant_name().unwrap())\n    }\n}\n\nimpl<'de> serde::Deserialize<'de> for FromInclude {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: serde::Deserializer<'de>,\n    {\n        let s = String::deserialize(deserializer)?;\n        for item in FromInclude::ENUM_VALUES {\n            if let Some(item_name) = item.variant_name() {\n                if item_name == s {\n                    return Ok(item.clone());\n                }\n            }\n        }\n        Err(serde::de::Error::custom(format!(\n            \"Unknown FromInclude variant: {s}\"\n        )))\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for FromInclude {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<i64>(buf, loc) };\n        Self(b)\n    }\n}\n\nimpl ::flatbuffers::Push for FromInclude {\n    type Output = FromInclude;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<i64>(dst, self.0) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for FromInclude {\n    type Scalar = i64;\n\n    #[inline]\n    fn to_little_endian(self) -> i64 {\n        self.0.to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: i64) -> Self {\n        let b = i64::from_le(v);\n        Self(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for FromInclude {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        i64::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for FromInclude {}\n"
  },
  {
    "path": "tests/monster_test_serialize/my_game/other_name_space/table_b_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nextern crate serde;\nuse self::serde::ser::{Serialize, Serializer, SerializeStruct};\nuse super::*;\n\npub enum TableBOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct TableB<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for TableB<'a> {\n    type Inner = TableB<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> TableB<'a> {\n    pub const VT_A: ::flatbuffers::VOffsetT = 4;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.OtherNameSpace.TableB\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        TableB { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args TableBArgs<'args>\n    ) -> ::flatbuffers::WIPOffset<TableB<'bldr>> {\n        let mut builder = TableBBuilder::new(_fbb);\n        if let Some(x) = args.a { builder.add_a(x); }\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> TableBT {\n        let a = self.a().map(|x| {\n            alloc::boxed::Box::new(x.unpack())\n        });\n        TableBT {\n            a,\n        }\n    }\n\n    #[inline]\n    pub fn a(&self) -> Option<super::super::TableA<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<super::super::TableA>>(TableB::VT_A, None)}\n    }\n}\n\nimpl ::flatbuffers::Verifiable for TableB<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<super::super::TableA>>(\"a\", Self::VT_A, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct TableBArgs<'a> {\n    pub a: Option<::flatbuffers::WIPOffset<super::super::TableA<'a>>>,\n}\n\nimpl<'a> Default for TableBArgs<'a> {\n    #[inline]\n    fn default() -> Self {\n        TableBArgs {\n            a: None,\n        }\n    }\n}\n\nimpl Serialize for TableB<'_> {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        let mut s = serializer.serialize_struct(\"TableB\", 1)?;\n        if let Some(f) = self.a() {\n            s.serialize_field(\"a\", &f)?;\n        } else {\n            s.skip_field(\"a\")?;\n        }\n        s.end()\n    }\n}\n\npub struct TableBBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> TableBBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_a(&mut self, a: ::flatbuffers::WIPOffset<super::super::TableA<'b >>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<super::super::TableA>>(TableB::VT_A, a);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> TableBBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        TableBBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<TableB<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for TableB<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"TableB\");\n        ds.field(\"a\", &self.a());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct TableBT {\n    pub a: Option<alloc::boxed::Box<super::super::TableAT>>,\n}\n\nimpl Default for TableBT {\n    fn default() -> Self {\n        Self {\n            a: None,\n        }\n    }\n}\n\nimpl TableBT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<TableB<'b>> {\n        let a = self.a.as_ref().map(|x|{\n            x.pack(_fbb)\n        });\n        TableB::create(_fbb, &TableBArgs{\n            a,\n        })\n    }\n}\n"
  },
  {
    "path": "tests/monster_test_serialize/my_game/other_name_space/unused_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nextern crate serde;\nuse self::serde::ser::{Serialize, Serializer, SerializeStruct};\nuse super::*;\n\n// struct Unused, aligned to 4\n#[repr(transparent)]\n#[derive(Clone, Copy, PartialEq)]\npub struct Unused(pub [u8; 4]);\n\nimpl Default for Unused {\n    fn default() -> Self {\n        Self([0; 4])\n    }\n}\n\nimpl ::core::fmt::Debug for Unused {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        f.debug_struct(\"Unused\")\n            .field(\"a\", &self.a())\n            .finish()\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for Unused {}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Unused {\n    type Inner = &'a Unused;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { <&'a Unused>::follow(buf, loc) }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for &'a Unused {\n    type Inner = &'a Unused;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { ::flatbuffers::follow_cast_ref::<Unused>(buf, loc) }\n    }\n}\n\nimpl<'b> ::flatbuffers::Push for Unused {\n    type Output = Unused;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        let src = unsafe { ::core::slice::from_raw_parts(self as *const Unused as *const u8, <Self as ::flatbuffers::Push>::size()) };\n        dst.copy_from_slice(src);\n    }\n\n    #[inline]\n    fn alignment() -> ::flatbuffers::PushAlignment {\n        ::flatbuffers::PushAlignment::new(4)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for Unused {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.in_buffer::<Self>(pos)\n    }\n}\n\nimpl Serialize for Unused {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n    let mut s = serializer.serialize_struct(\"Unused\", 1)?;\n        s.serialize_field(\"a\", &self.a())?;\n        s.end()\n    }\n}\n\nimpl<'a> Unused {\n    #[allow(clippy::too_many_arguments)]\n    pub fn new(\n        a: i32,\n    ) -> Self {\n        let mut s = Self([0; 4]);\n        s.set_a(a);\n        s\n    }\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MyGame.OtherNameSpace.Unused\"\n    }\n\n    pub fn a(&self) -> i32 {\n        let mut mem = ::core::mem::MaybeUninit::<<i32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[0..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<i32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_a(&mut self, x: i32) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[0..].as_mut_ptr(),\n                ::core::mem::size_of::<<i32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn unpack(&self) -> UnusedT {\n        UnusedT {\n            a: self.a(),\n        }\n    }\n}\n\n#[derive(Debug, Clone, PartialEq)]\npub struct UnusedT {\n    pub a: i32,\n}\nimpl Default for UnusedT {\n    fn default() -> Self {\n        Self {\n            a: 0,\n        }\n    }\n}\n\nimpl UnusedT {\n    pub fn pack(&self) -> Unused {\n        Unused::new(\n            self.a,\n        )\n    }\n}\n"
  },
  {
    "path": "tests/monster_test_serialize/table_a_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nextern crate serde;\nuse self::serde::ser::{Serialize, Serializer, SerializeStruct};\nuse super::*;\n\npub enum TableAOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct TableA<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for TableA<'a> {\n    type Inner = TableA<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> TableA<'a> {\n    pub const VT_B: ::flatbuffers::VOffsetT = 4;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"TableA\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        TableA { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args TableAArgs<'args>\n    ) -> ::flatbuffers::WIPOffset<TableA<'bldr>> {\n        let mut builder = TableABuilder::new(_fbb);\n        if let Some(x) = args.b { builder.add_b(x); }\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> TableAT {\n        let b = self.b().map(|x| {\n            alloc::boxed::Box::new(x.unpack())\n        });\n        TableAT {\n            b,\n        }\n    }\n\n    #[inline]\n    pub fn b(&self) -> Option<my_game::other_name_space::TableB<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<my_game::other_name_space::TableB>>(TableA::VT_B, None)}\n    }\n}\n\nimpl ::flatbuffers::Verifiable for TableA<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<my_game::other_name_space::TableB>>(\"b\", Self::VT_B, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct TableAArgs<'a> {\n    pub b: Option<::flatbuffers::WIPOffset<my_game::other_name_space::TableB<'a>>>,\n}\n\nimpl<'a> Default for TableAArgs<'a> {\n    #[inline]\n    fn default() -> Self {\n        TableAArgs {\n            b: None,\n        }\n    }\n}\n\nimpl Serialize for TableA<'_> {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        let mut s = serializer.serialize_struct(\"TableA\", 1)?;\n        if let Some(f) = self.b() {\n            s.serialize_field(\"b\", &f)?;\n        } else {\n            s.skip_field(\"b\")?;\n        }\n        s.end()\n    }\n}\n\npub struct TableABuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> TableABuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_b(&mut self, b: ::flatbuffers::WIPOffset<my_game::other_name_space::TableB<'b >>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<my_game::other_name_space::TableB>>(TableA::VT_B, b);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> TableABuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        TableABuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<TableA<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for TableA<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"TableA\");\n        ds.field(\"b\", &self.b());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct TableAT {\n    pub b: Option<alloc::boxed::Box<my_game::other_name_space::TableBT>>,\n}\n\nimpl Default for TableAT {\n    fn default() -> Self {\n        Self {\n            b: None,\n        }\n    }\n}\n\nimpl TableAT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<TableA<'b>> {\n        let b = self.b.as_ref().map(|x|{\n            x.pack(_fbb)\n        });\n        TableA::create(_fbb, &TableAArgs{\n            b,\n        })\n    }\n}\n"
  },
  {
    "path": "tests/monster_test_suffix/ext_only/monster_test.grpc.fb.cc",
    "content": "// Generated by the gRPC C++ plugin.\n// FlatBuffers modified generator: native gRPC callback client API enabled when --grpc-callback-api.\n// source: monster_test\n\n#include \"monster_test_generated.hpp\"\n#include \"monster_test.grpc.fb.h\"\n\n#include <grpcpp/impl/codegen/async_stream.h>\n#include <grpcpp/impl/codegen/async_unary_call.h>\n#include <grpcpp/impl/codegen/channel_interface.h>\n#include <grpcpp/impl/codegen/client_unary_call.h>\n#include <grpcpp/impl/codegen/method_handler.h>\n#include <grpcpp/impl/codegen/rpc_service_method.h>\n#include <grpcpp/impl/codegen/service_type.h>\n#include <grpcpp/impl/codegen/sync_stream.h>\nnamespace MyGame {\nnamespace Example {\n\nstatic const char* MonsterStorage_method_names[] = {\n  \"/MyGame.Example.MonsterStorage/Store\",\n  \"/MyGame.Example.MonsterStorage/Retrieve\",\n  \"/MyGame.Example.MonsterStorage/GetMaxHitPoint\",\n  \"/MyGame.Example.MonsterStorage/GetMinMaxHitPoints\",\n};\n\nstd::unique_ptr< MonsterStorage::Stub> MonsterStorage::NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& /*options*/) {\n  std::unique_ptr< MonsterStorage::Stub> stub(new MonsterStorage::Stub(channel));\n  return stub;\n}\n\nMonsterStorage::Stub::Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel)\n  : channel_(channel)  , rpcmethod_Store_(MonsterStorage_method_names[0], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)\n  , rpcmethod_Retrieve_(MonsterStorage_method_names[1], ::grpc::internal::RpcMethod::SERVER_STREAMING, channel)\n  , rpcmethod_GetMaxHitPoint_(MonsterStorage_method_names[2], ::grpc::internal::RpcMethod::CLIENT_STREAMING, channel)\n  , rpcmethod_GetMinMaxHitPoints_(MonsterStorage_method_names[3], ::grpc::internal::RpcMethod::BIDI_STREAMING, channel)\n  {}\n  \n::grpc::Status MonsterStorage::Stub::Store(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, flatbuffers::grpc::Message<Stat>* response) {\n  return ::grpc::internal::BlockingUnaryCall(channel_.get(), rpcmethod_Store_, context, request, response);\n}\n\n::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>* MonsterStorage::Stub::AsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {\n  return ::grpc::internal::ClientAsyncResponseReaderFactory< flatbuffers::grpc::Message<Stat>>::Create(channel_.get(), cq, rpcmethod_Store_, context, request, true);\n}\n\n::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>* MonsterStorage::Stub::PrepareAsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {\n  return ::grpc::internal::ClientAsyncResponseReaderFactory< flatbuffers::grpc::Message<Stat>>::Create(channel_.get(), cq, rpcmethod_Store_, context, request, false);\n}\n\n::grpc::ClientReader< flatbuffers::grpc::Message<Monster>>* MonsterStorage::Stub::RetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) {\n  return ::grpc::internal::ClientReaderFactory< flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), rpcmethod_Retrieve_, context, request);\n}\n\n::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>* MonsterStorage::Stub::AsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) {\n  return ::grpc::internal::ClientAsyncReaderFactory< flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), cq, rpcmethod_Retrieve_, context, request, true, tag);\n}\n\n::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>* MonsterStorage::Stub::PrepareAsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq) {\n  return ::grpc::internal::ClientAsyncReaderFactory< flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), cq, rpcmethod_Retrieve_, context, request, false, nullptr);\n}\n\n::grpc::ClientWriter< flatbuffers::grpc::Message<Monster>>* MonsterStorage::Stub::GetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response) {\n  return ::grpc::internal::ClientWriterFactory< flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), rpcmethod_GetMaxHitPoint_, context, response);\n}\n\n::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>* MonsterStorage::Stub::AsyncGetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq, void* tag) {\n  return ::grpc::internal::ClientAsyncWriterFactory< flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), cq, rpcmethod_GetMaxHitPoint_, context, response, true, tag);\n}\n\n::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>* MonsterStorage::Stub::PrepareAsyncGetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq) {\n  return ::grpc::internal::ClientAsyncWriterFactory< flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), cq, rpcmethod_GetMaxHitPoint_, context, response, false, nullptr);\n}\n\n::grpc::ClientReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* MonsterStorage::Stub::GetMinMaxHitPointsRaw(::grpc::ClientContext* context) {\n  return ::grpc::internal::ClientReaderWriterFactory< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>::Create(channel_.get(), rpcmethod_GetMinMaxHitPoints_, context);\n}\n\n::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* MonsterStorage::Stub::AsyncGetMinMaxHitPointsRaw(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq, void* tag) {\n  return ::grpc::internal::ClientAsyncReaderWriterFactory< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>::Create(channel_.get(), cq, rpcmethod_GetMinMaxHitPoints_, context, true, tag);\n}\n\n::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* MonsterStorage::Stub::PrepareAsyncGetMinMaxHitPointsRaw(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq) {\n  return ::grpc::internal::ClientAsyncReaderWriterFactory< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>::Create(channel_.get(), cq, rpcmethod_GetMinMaxHitPoints_, context, false, nullptr);\n}\n\nMonsterStorage::Service::Service() {\n  AddMethod(new ::grpc::internal::RpcServiceMethod(\n      MonsterStorage_method_names[0],\n      ::grpc::internal::RpcMethod::NORMAL_RPC,\n      new ::grpc::internal::RpcMethodHandler< MonsterStorage::Service, flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>(\n          std::mem_fn(&MonsterStorage::Service::Store), this)));\n  AddMethod(new ::grpc::internal::RpcServiceMethod(\n      MonsterStorage_method_names[1],\n      ::grpc::internal::RpcMethod::SERVER_STREAMING,\n      new ::grpc::internal::ServerStreamingHandler< MonsterStorage::Service, flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>(\n          std::mem_fn(&MonsterStorage::Service::Retrieve), this)));\n  AddMethod(new ::grpc::internal::RpcServiceMethod(\n      MonsterStorage_method_names[2],\n      ::grpc::internal::RpcMethod::CLIENT_STREAMING,\n      new ::grpc::internal::ClientStreamingHandler< MonsterStorage::Service, flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>(\n          std::mem_fn(&MonsterStorage::Service::GetMaxHitPoint), this)));\n  AddMethod(new ::grpc::internal::RpcServiceMethod(\n      MonsterStorage_method_names[3],\n      ::grpc::internal::RpcMethod::BIDI_STREAMING,\n      new ::grpc::internal::BidiStreamingHandler< MonsterStorage::Service, flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>(\n          std::mem_fn(&MonsterStorage::Service::GetMinMaxHitPoints), this)));\n}\n\nMonsterStorage::Service::~Service() {\n}\n\n::grpc::Status MonsterStorage::Service::Store(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Monster>* /*request*/, flatbuffers::grpc::Message<Stat>* /*response*/) {\n  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n}\n\n::grpc::Status MonsterStorage::Service::Retrieve(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Stat>* /*request*/, ::grpc::ServerWriter< flatbuffers::grpc::Message<Monster>>* /*writer*/) {\n  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n}\n\n::grpc::Status MonsterStorage::Service::GetMaxHitPoint(::grpc::ServerContext* /*context*/, ::grpc::ServerReader< flatbuffers::grpc::Message<Monster>>* /*reader*/, flatbuffers::grpc::Message<Stat>* /*response*/) {\n  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n}\n\n::grpc::Status MonsterStorage::Service::GetMinMaxHitPoints(::grpc::ServerContext* /*context*/, ::grpc::ServerReaderWriter< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>* /*stream*/) {\n  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n}\n\n\n}  // namespace MyGame\n}  // namespace Example\n\n"
  },
  {
    "path": "tests/monster_test_suffix/ext_only/monster_test.grpc.fb.h",
    "content": "// Generated by the gRPC C++ plugin.\n// If you make any local change, they will be lost.\n// source: monster_test\n#ifndef GRPC_monster_5ftest__INCLUDED\n#define GRPC_monster_5ftest__INCLUDED\n\n#include \"monster_test_generated.hpp\"\n#include \"flatbuffers/grpc.h\"\n\n#include <grpcpp/impl/codegen/async_stream.h>\n#include <grpcpp/impl/codegen/async_unary_call.h>\n#include <grpcpp/impl/codegen/method_handler.h>\n#include <grpcpp/impl/codegen/proto_utils.h>\n#include <grpcpp/impl/codegen/rpc_method.h>\n#include <grpcpp/impl/codegen/service_type.h>\n#include <grpcpp/impl/codegen/status.h>\n#include <grpcpp/impl/codegen/stub_options.h>\n#include <grpcpp/impl/codegen/sync_stream.h>\n\nnamespace grpc {\nclass CompletionQueue;\nclass Channel;\nclass ServerCompletionQueue;\nclass ServerContext;\n}  // namespace grpc\n\nnamespace MyGame {\nnamespace Example {\n\nclass MonsterStorage final {\n public:\n  static constexpr char const* service_full_name() {\n    return \"MyGame.Example.MonsterStorage\";\n  }\n  class StubInterface {\n   public:\n    virtual ~StubInterface() {}\n    virtual ::grpc::Status Store(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, flatbuffers::grpc::Message<Stat>* response) = 0;\n    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>> AsyncStore(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>>(AsyncStoreRaw(context, request, cq));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>> PrepareAsyncStore(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>>(PrepareAsyncStoreRaw(context, request, cq));\n    }\n    std::unique_ptr< ::grpc::ClientReaderInterface< flatbuffers::grpc::Message<Monster>>> Retrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) {\n      return std::unique_ptr< ::grpc::ClientReaderInterface< flatbuffers::grpc::Message<Monster>>>(RetrieveRaw(context, request));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>> AsyncRetrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr< ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>>(AsyncRetrieveRaw(context, request, cq, tag));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>> PrepareAsyncRetrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>>(PrepareAsyncRetrieveRaw(context, request, cq));\n    }\n    std::unique_ptr< ::grpc::ClientWriterInterface< flatbuffers::grpc::Message<Monster>>> GetMaxHitPoint(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response) {\n      return std::unique_ptr< ::grpc::ClientWriterInterface< flatbuffers::grpc::Message<Monster>>>(GetMaxHitPointRaw(context, response));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncWriterInterface< flatbuffers::grpc::Message<Monster>>> AsyncGetMaxHitPoint(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr< ::grpc::ClientAsyncWriterInterface< flatbuffers::grpc::Message<Monster>>>(AsyncGetMaxHitPointRaw(context, response, cq, tag));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncWriterInterface< flatbuffers::grpc::Message<Monster>>> PrepareAsyncGetMaxHitPoint(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncWriterInterface< flatbuffers::grpc::Message<Monster>>>(PrepareAsyncGetMaxHitPointRaw(context, response, cq));\n    }\n    std::unique_ptr< ::grpc::ClientReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>> GetMinMaxHitPoints(::grpc::ClientContext* context) {\n      return std::unique_ptr< ::grpc::ClientReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>(GetMinMaxHitPointsRaw(context));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>> AsyncGetMinMaxHitPoints(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr< ::grpc::ClientAsyncReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>(AsyncGetMinMaxHitPointsRaw(context, cq, tag));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>> PrepareAsyncGetMinMaxHitPoints(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>(PrepareAsyncGetMinMaxHitPointsRaw(context, cq));\n    }\n  private:\n    virtual ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>* AsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) = 0;\n    virtual ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>* PrepareAsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) = 0;\n    virtual ::grpc::ClientReaderInterface< flatbuffers::grpc::Message<Monster>>* RetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) = 0;\n    virtual ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>* AsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) = 0;\n    virtual ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>* PrepareAsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq) = 0;\n    virtual ::grpc::ClientWriterInterface< flatbuffers::grpc::Message<Monster>>* GetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response) = 0;\n    virtual ::grpc::ClientAsyncWriterInterface< flatbuffers::grpc::Message<Monster>>* AsyncGetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq, void* tag) = 0;\n    virtual ::grpc::ClientAsyncWriterInterface< flatbuffers::grpc::Message<Monster>>* PrepareAsyncGetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq) = 0;\n    virtual ::grpc::ClientReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* GetMinMaxHitPointsRaw(::grpc::ClientContext* context) = 0;\n    virtual ::grpc::ClientAsyncReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* AsyncGetMinMaxHitPointsRaw(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq, void* tag) = 0;\n    virtual ::grpc::ClientAsyncReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* PrepareAsyncGetMinMaxHitPointsRaw(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq) = 0;\n  };\n  class Stub final : public StubInterface {\n   public:\n    Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel);\n    ::grpc::Status Store(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, flatbuffers::grpc::Message<Stat>* response) override;\n    std::unique_ptr< ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>> AsyncStore(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>>(AsyncStoreRaw(context, request, cq));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>> PrepareAsyncStore(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>>(PrepareAsyncStoreRaw(context, request, cq));\n    }\n    std::unique_ptr< ::grpc::ClientReader< flatbuffers::grpc::Message<Monster>>> Retrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) {\n      return std::unique_ptr< ::grpc::ClientReader< flatbuffers::grpc::Message<Monster>>>(RetrieveRaw(context, request));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>> AsyncRetrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr< ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>>(AsyncRetrieveRaw(context, request, cq, tag));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>> PrepareAsyncRetrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>>(PrepareAsyncRetrieveRaw(context, request, cq));\n    }\n    std::unique_ptr< ::grpc::ClientWriter< flatbuffers::grpc::Message<Monster>>> GetMaxHitPoint(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response) {\n      return std::unique_ptr< ::grpc::ClientWriter< flatbuffers::grpc::Message<Monster>>>(GetMaxHitPointRaw(context, response));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>> AsyncGetMaxHitPoint(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr< ::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>>(AsyncGetMaxHitPointRaw(context, response, cq, tag));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>> PrepareAsyncGetMaxHitPoint(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>>(PrepareAsyncGetMaxHitPointRaw(context, response, cq));\n    }\n    std::unique_ptr< ::grpc::ClientReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>> GetMinMaxHitPoints(::grpc::ClientContext* context) {\n      return std::unique_ptr< ::grpc::ClientReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>(GetMinMaxHitPointsRaw(context));\n    }\n    std::unique_ptr<  ::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>> AsyncGetMinMaxHitPoints(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr< ::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>(AsyncGetMinMaxHitPointsRaw(context, cq, tag));\n    }\n    std::unique_ptr<  ::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>> PrepareAsyncGetMinMaxHitPoints(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>(PrepareAsyncGetMinMaxHitPointsRaw(context, cq));\n    }\n  \n   private:\n    std::shared_ptr< ::grpc::ChannelInterface> channel_;\n    ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>* AsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) override;\n    ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>* PrepareAsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) override;\n    ::grpc::ClientReader< flatbuffers::grpc::Message<Monster>>* RetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) override;\n    ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>* AsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) override;\n    ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>* PrepareAsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq) override;\n    ::grpc::ClientWriter< flatbuffers::grpc::Message<Monster>>* GetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response) override;\n    ::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>* AsyncGetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq, void* tag) override;\n    ::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>* PrepareAsyncGetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq) override;\n    ::grpc::ClientReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* GetMinMaxHitPointsRaw(::grpc::ClientContext* context) override;\n    ::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* AsyncGetMinMaxHitPointsRaw(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq, void* tag) override;\n    ::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* PrepareAsyncGetMinMaxHitPointsRaw(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq) override;\n    const ::grpc::internal::RpcMethod rpcmethod_Store_;\n    const ::grpc::internal::RpcMethod rpcmethod_Retrieve_;\n    const ::grpc::internal::RpcMethod rpcmethod_GetMaxHitPoint_;\n    const ::grpc::internal::RpcMethod rpcmethod_GetMinMaxHitPoints_;\n  };\n  static std::unique_ptr<Stub> NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options = ::grpc::StubOptions());\n  \n  class Service : public ::grpc::Service {\n   public:\n    Service();\n    virtual ~Service();\n    virtual ::grpc::Status Store(::grpc::ServerContext* context, const flatbuffers::grpc::Message<Monster>* request, flatbuffers::grpc::Message<Stat>* response);\n    virtual ::grpc::Status Retrieve(::grpc::ServerContext* context, const flatbuffers::grpc::Message<Stat>* request, ::grpc::ServerWriter< flatbuffers::grpc::Message<Monster>>* writer);\n    virtual ::grpc::Status GetMaxHitPoint(::grpc::ServerContext* context, ::grpc::ServerReader< flatbuffers::grpc::Message<Monster>>* reader, flatbuffers::grpc::Message<Stat>* response);\n    virtual ::grpc::Status GetMinMaxHitPoints(::grpc::ServerContext* context, ::grpc::ServerReaderWriter< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>* stream);\n  };\n  template <class BaseClass>\n  class WithAsyncMethod_Store : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithAsyncMethod_Store() {\n      ::grpc::Service::MarkMethodAsync(0);\n    }\n    ~WithAsyncMethod_Store() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status Store(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Monster>* /*request*/, flatbuffers::grpc::Message<Stat>* /*response*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    void RequestStore(::grpc::ServerContext* context, flatbuffers::grpc::Message<Monster>* request, ::grpc::ServerAsyncResponseWriter< flatbuffers::grpc::Message<Stat>>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n      ::grpc::Service::RequestAsyncUnary(0, context, request, response, new_call_cq, notification_cq, tag);\n    }\n  };\n  template <class BaseClass>\n  class WithAsyncMethod_Retrieve : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithAsyncMethod_Retrieve() {\n      ::grpc::Service::MarkMethodAsync(1);\n    }\n    ~WithAsyncMethod_Retrieve() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status Retrieve(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Stat>* /*request*/, ::grpc::ServerWriter< flatbuffers::grpc::Message<Monster>>* /*writer*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    void RequestRetrieve(::grpc::ServerContext* context, flatbuffers::grpc::Message<Stat>* request, ::grpc::ServerAsyncWriter< flatbuffers::grpc::Message<Monster>>* writer, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n      ::grpc::Service::RequestAsyncServerStreaming(1, context, request, writer, new_call_cq, notification_cq, tag);\n    }\n  };\n  template <class BaseClass>\n  class WithAsyncMethod_GetMaxHitPoint : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithAsyncMethod_GetMaxHitPoint() {\n      ::grpc::Service::MarkMethodAsync(2);\n    }\n    ~WithAsyncMethod_GetMaxHitPoint() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status GetMaxHitPoint(::grpc::ServerContext* /*context*/, ::grpc::ServerReader< flatbuffers::grpc::Message<Monster>>* /*reader*/, flatbuffers::grpc::Message<Stat>* /*response*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    void RequestGetMaxHitPoint(::grpc::ServerContext* context, ::grpc::ServerAsyncReader< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>* reader, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n      ::grpc::Service::RequestAsyncClientStreaming(2, context, reader, new_call_cq, notification_cq, tag);\n    }\n  };\n  template <class BaseClass>\n  class WithAsyncMethod_GetMinMaxHitPoints : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithAsyncMethod_GetMinMaxHitPoints() {\n      ::grpc::Service::MarkMethodAsync(3);\n    }\n    ~WithAsyncMethod_GetMinMaxHitPoints() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status GetMinMaxHitPoints(::grpc::ServerContext* /*context*/, ::grpc::ServerReaderWriter< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>* /*stream*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    void RequestGetMinMaxHitPoints(::grpc::ServerContext* context, ::grpc::ServerAsyncReaderWriter< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>* stream, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n      ::grpc::Service::RequestAsyncBidiStreaming(3, context, stream, new_call_cq, notification_cq, tag);\n    }\n  };\n  typedef   WithAsyncMethod_Store<  WithAsyncMethod_Retrieve<  WithAsyncMethod_GetMaxHitPoint<  WithAsyncMethod_GetMinMaxHitPoints<  Service   >   >   >   >   AsyncService;\n  template <class BaseClass>\n  class WithGenericMethod_Store : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithGenericMethod_Store() {\n      ::grpc::Service::MarkMethodGeneric(0);\n    }\n    ~WithGenericMethod_Store() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status Store(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Monster>* /*request*/, flatbuffers::grpc::Message<Stat>* /*response*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n  };\n  template <class BaseClass>\n  class WithGenericMethod_Retrieve : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithGenericMethod_Retrieve() {\n      ::grpc::Service::MarkMethodGeneric(1);\n    }\n    ~WithGenericMethod_Retrieve() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status Retrieve(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Stat>* /*request*/, ::grpc::ServerWriter< flatbuffers::grpc::Message<Monster>>* /*writer*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n  };\n  template <class BaseClass>\n  class WithGenericMethod_GetMaxHitPoint : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithGenericMethod_GetMaxHitPoint() {\n      ::grpc::Service::MarkMethodGeneric(2);\n    }\n    ~WithGenericMethod_GetMaxHitPoint() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status GetMaxHitPoint(::grpc::ServerContext* /*context*/, ::grpc::ServerReader< flatbuffers::grpc::Message<Monster>>* /*reader*/, flatbuffers::grpc::Message<Stat>* /*response*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n  };\n  template <class BaseClass>\n  class WithGenericMethod_GetMinMaxHitPoints : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithGenericMethod_GetMinMaxHitPoints() {\n      ::grpc::Service::MarkMethodGeneric(3);\n    }\n    ~WithGenericMethod_GetMinMaxHitPoints() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status GetMinMaxHitPoints(::grpc::ServerContext* /*context*/, ::grpc::ServerReaderWriter< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>* /*stream*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n  };\n  template <class BaseClass>\n  class WithStreamedUnaryMethod_Store : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithStreamedUnaryMethod_Store() {\n      ::grpc::Service::MarkMethodStreamed(0,\n        new ::grpc::internal::StreamedUnaryHandler< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>(std::bind(&WithStreamedUnaryMethod_Store<BaseClass>::StreamedStore, this, std::placeholders::_1, std::placeholders::_2)));\n    }\n    ~WithStreamedUnaryMethod_Store() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable regular version of this method\n    ::grpc::Status Store(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Monster>* /*request*/, flatbuffers::grpc::Message<Stat>* /*response*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    // replace default version of method with streamed unary\n    virtual ::grpc::Status StreamedStore(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< flatbuffers::grpc::Message<Monster>,flatbuffers::grpc::Message<Stat>>* server_unary_streamer) = 0;\n  };\n  typedef   WithStreamedUnaryMethod_Store<  Service   >   StreamedUnaryService;\n  template <class BaseClass>\n  class WithSplitStreamingMethod_Retrieve : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) { }\n   public:\n    WithSplitStreamingMethod_Retrieve() {\n      ::grpc::Service::MarkMethodStreamed(1,\n        new ::grpc::internal::SplitServerStreamingHandler< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>(std::bind(&WithSplitStreamingMethod_Retrieve<BaseClass>::StreamedRetrieve, this, std::placeholders::_1, std::placeholders::_2)));\n    }\n    ~WithSplitStreamingMethod_Retrieve() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable regular version of this method\n    ::grpc::Status Retrieve(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Stat>* /*request*/, ::grpc::ServerWriter< flatbuffers::grpc::Message<Monster>>* /*writer*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    // replace default version of method with split streamed\n    virtual ::grpc::Status StreamedRetrieve(::grpc::ServerContext* context, ::grpc::ServerSplitStreamer< flatbuffers::grpc::Message<Stat>,flatbuffers::grpc::Message<Monster>>* server_split_streamer) = 0;\n  };\n  typedef   WithSplitStreamingMethod_Retrieve<  Service   >   SplitStreamedService;\n  typedef   WithStreamedUnaryMethod_Store<  WithSplitStreamingMethod_Retrieve<  Service   >   >   StreamedService;\n};\n\n}  // namespace Example\n}  // namespace MyGame\n\n\n#endif  // GRPC_monster_5ftest__INCLUDED\n"
  },
  {
    "path": "tests/monster_test_suffix/ext_only/monster_test_generated.hpp",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n\n#ifndef FLATBUFFERS_GENERATED_MONSTERTEST_MYGAME_EXAMPLE_H_\n#define FLATBUFFERS_GENERATED_MONSTERTEST_MYGAME_EXAMPLE_H_\n\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/flexbuffers.h\"\n#include \"flatbuffers/flex_flat_util.h\"\n\n// Ensure the included flatbuffers.h is the same version as when this file was\n// generated, otherwise it may not be compatible.\nstatic_assert(FLATBUFFERS_VERSION_MAJOR == 25 &&\n              FLATBUFFERS_VERSION_MINOR == 12 &&\n              FLATBUFFERS_VERSION_REVISION == 19,\n             \"Non-compatible flatbuffers version included\");\n\nnamespace MyGame {\n\nstruct InParentNamespace;\nstruct InParentNamespaceBuilder;\nstruct InParentNamespaceT;\n\nnamespace Example2 {\n\nstruct Monster;\nstruct MonsterBuilder;\nstruct MonsterT;\n\n}  // namespace Example2\n\nnamespace Example {\n\nstruct Test;\n\nstruct TestSimpleTableWithEnum;\nstruct TestSimpleTableWithEnumBuilder;\nstruct TestSimpleTableWithEnumT;\n\nstruct Vec3;\n\nstruct Ability;\n\nstruct StructOfStructs;\n\nstruct StructOfStructsOfStructs;\n\nstruct Stat;\nstruct StatBuilder;\nstruct StatT;\n\nstruct Referrable;\nstruct ReferrableBuilder;\nstruct ReferrableT;\n\nstruct Monster;\nstruct MonsterBuilder;\nstruct MonsterT;\n\nstruct TypeAliases;\nstruct TypeAliasesBuilder;\nstruct TypeAliasesT;\n\n}  // namespace Example\n\nbool operator==(const InParentNamespaceT &lhs, const InParentNamespaceT &rhs);\nbool operator!=(const InParentNamespaceT &lhs, const InParentNamespaceT &rhs);\nnamespace Example2 {\n\nbool operator==(const MonsterT &lhs, const MonsterT &rhs);\nbool operator!=(const MonsterT &lhs, const MonsterT &rhs);\n}  // namespace Example2\n\nnamespace Example {\n\nbool operator==(const Test &lhs, const Test &rhs);\nbool operator!=(const Test &lhs, const Test &rhs);\nbool operator==(const TestSimpleTableWithEnumT &lhs, const TestSimpleTableWithEnumT &rhs);\nbool operator!=(const TestSimpleTableWithEnumT &lhs, const TestSimpleTableWithEnumT &rhs);\nbool operator==(const Vec3 &lhs, const Vec3 &rhs);\nbool operator!=(const Vec3 &lhs, const Vec3 &rhs);\nbool operator==(const Ability &lhs, const Ability &rhs);\nbool operator!=(const Ability &lhs, const Ability &rhs);\nbool operator==(const StructOfStructs &lhs, const StructOfStructs &rhs);\nbool operator!=(const StructOfStructs &lhs, const StructOfStructs &rhs);\nbool operator==(const StructOfStructsOfStructs &lhs, const StructOfStructsOfStructs &rhs);\nbool operator!=(const StructOfStructsOfStructs &lhs, const StructOfStructsOfStructs &rhs);\nbool operator==(const StatT &lhs, const StatT &rhs);\nbool operator!=(const StatT &lhs, const StatT &rhs);\nbool operator==(const ReferrableT &lhs, const ReferrableT &rhs);\nbool operator!=(const ReferrableT &lhs, const ReferrableT &rhs);\nbool operator==(const MonsterT &lhs, const MonsterT &rhs);\nbool operator!=(const MonsterT &lhs, const MonsterT &rhs);\nbool operator==(const TypeAliasesT &lhs, const TypeAliasesT &rhs);\nbool operator!=(const TypeAliasesT &lhs, const TypeAliasesT &rhs);\n\n}  // namespace Example\n\ninline const ::flatbuffers::TypeTable *InParentNamespaceTypeTable();\n\nnamespace Example2 {\n\ninline const ::flatbuffers::TypeTable *MonsterTypeTable();\n\n}  // namespace Example2\n\nnamespace Example {\n\ninline const ::flatbuffers::TypeTable *TestTypeTable();\n\ninline const ::flatbuffers::TypeTable *TestSimpleTableWithEnumTypeTable();\n\ninline const ::flatbuffers::TypeTable *Vec3TypeTable();\n\ninline const ::flatbuffers::TypeTable *AbilityTypeTable();\n\ninline const ::flatbuffers::TypeTable *StructOfStructsTypeTable();\n\ninline const ::flatbuffers::TypeTable *StructOfStructsOfStructsTypeTable();\n\ninline const ::flatbuffers::TypeTable *StatTypeTable();\n\ninline const ::flatbuffers::TypeTable *ReferrableTypeTable();\n\ninline const ::flatbuffers::TypeTable *MonsterTypeTable();\n\ninline const ::flatbuffers::TypeTable *TypeAliasesTypeTable();\n\n/// Composite components of Monster color.\nenum Color : uint8_t {\n  Color_Red = 1,\n  /// \\brief color Green\n  /// Green is bit_flag with value (1u << 1)\n  Color_Green = 2,\n  /// \\brief color Blue (1u << 3)\n  Color_Blue = 8,\n  Color_NONE = 0,\n  Color_ANY = 11\n};\n\ninline const Color (&EnumValuesColor())[3] {\n  static const Color values[] = {\n    Color_Red,\n    Color_Green,\n    Color_Blue\n  };\n  return values;\n}\n\ninline const char * const *EnumNamesColor() {\n  static const char * const names[9] = {\n    \"Red\",\n    \"Green\",\n    \"\",\n    \"\",\n    \"\",\n    \"\",\n    \"\",\n    \"Blue\",\n    nullptr\n  };\n  return names;\n}\n\ninline const char *EnumNameColor(Color e) {\n  if (::flatbuffers::IsOutRange(e, Color_Red, Color_Blue)) return \"\";\n  const size_t index = static_cast<size_t>(e) - static_cast<size_t>(Color_Red);\n  return EnumNamesColor()[index];\n}\n\nenum Race : int8_t {\n  Race_None = -1,\n  Race_Human = 0,\n  Race_Dwarf = 1,\n  Race_Elf = 2,\n  Race_MIN = Race_None,\n  Race_MAX = Race_Elf\n};\n\ninline const Race (&EnumValuesRace())[4] {\n  static const Race values[] = {\n    Race_None,\n    Race_Human,\n    Race_Dwarf,\n    Race_Elf\n  };\n  return values;\n}\n\ninline const char * const *EnumNamesRace() {\n  static const char * const names[5] = {\n    \"None\",\n    \"Human\",\n    \"Dwarf\",\n    \"Elf\",\n    nullptr\n  };\n  return names;\n}\n\ninline const char *EnumNameRace(Race e) {\n  if (::flatbuffers::IsOutRange(e, Race_None, Race_Elf)) return \"\";\n  const size_t index = static_cast<size_t>(e) - static_cast<size_t>(Race_None);\n  return EnumNamesRace()[index];\n}\n\nenum LongEnum : uint64_t {\n  LongEnum_LongOne = 2ULL,\n  LongEnum_LongTwo = 4ULL,\n  LongEnum_LongBig = 1099511627776ULL,\n  LongEnum_NONE = 0,\n  LongEnum_ANY = 1099511627782ULL\n};\n\ninline const LongEnum (&EnumValuesLongEnum())[3] {\n  static const LongEnum values[] = {\n    LongEnum_LongOne,\n    LongEnum_LongTwo,\n    LongEnum_LongBig\n  };\n  return values;\n}\n\ninline const char *EnumNameLongEnum(LongEnum e) {\n  switch (e) {\n    case LongEnum_LongOne: return \"LongOne\";\n    case LongEnum_LongTwo: return \"LongTwo\";\n    case LongEnum_LongBig: return \"LongBig\";\n    default: return \"\";\n  }\n}\n\nenum Any : uint8_t {\n  Any_NONE = 0,\n  Any_Monster = 1,\n  Any_TestSimpleTableWithEnum = 2,\n  Any_MyGame_Example2_Monster = 3,\n  Any_MIN = Any_NONE,\n  Any_MAX = Any_MyGame_Example2_Monster\n};\n\ninline const Any (&EnumValuesAny())[4] {\n  static const Any values[] = {\n    Any_NONE,\n    Any_Monster,\n    Any_TestSimpleTableWithEnum,\n    Any_MyGame_Example2_Monster\n  };\n  return values;\n}\n\ninline const char * const *EnumNamesAny() {\n  static const char * const names[5] = {\n    \"NONE\",\n    \"Monster\",\n    \"TestSimpleTableWithEnum\",\n    \"MyGame_Example2_Monster\",\n    nullptr\n  };\n  return names;\n}\n\ninline const char *EnumNameAny(Any e) {\n  if (::flatbuffers::IsOutRange(e, Any_NONE, Any_MyGame_Example2_Monster)) return \"\";\n  const size_t index = static_cast<size_t>(e);\n  return EnumNamesAny()[index];\n}\n\ntemplate<typename T> struct AnyTraits {\n  static const Any enum_value = Any_NONE;\n};\n\ntemplate<> struct AnyTraits<MyGame::Example::Monster> {\n  static const Any enum_value = Any_Monster;\n};\n\ntemplate<> struct AnyTraits<MyGame::Example::TestSimpleTableWithEnum> {\n  static const Any enum_value = Any_TestSimpleTableWithEnum;\n};\n\ntemplate<> struct AnyTraits<MyGame::Example2::Monster> {\n  static const Any enum_value = Any_MyGame_Example2_Monster;\n};\n\ntemplate<typename T> struct AnyUnionTraits {\n  static const Any enum_value = Any_NONE;\n};\n\ntemplate<> struct AnyUnionTraits<MyGame::Example::MonsterT> {\n  static const Any enum_value = Any_Monster;\n};\n\ntemplate<> struct AnyUnionTraits<MyGame::Example::TestSimpleTableWithEnumT> {\n  static const Any enum_value = Any_TestSimpleTableWithEnum;\n};\n\ntemplate<> struct AnyUnionTraits<MyGame::Example2::MonsterT> {\n  static const Any enum_value = Any_MyGame_Example2_Monster;\n};\n\nstruct AnyUnion {\n  Any type;\n  void *value;\n\n  AnyUnion() : type(Any_NONE), value(nullptr) {}\n  AnyUnion(AnyUnion&& u) FLATBUFFERS_NOEXCEPT :\n    type(Any_NONE), value(nullptr)\n    { std::swap(type, u.type); std::swap(value, u.value); }\n  AnyUnion(const AnyUnion &);\n  AnyUnion &operator=(const AnyUnion &u)\n    { AnyUnion t(u); std::swap(type, t.type); std::swap(value, t.value); return *this; }\n  AnyUnion &operator=(AnyUnion &&u) FLATBUFFERS_NOEXCEPT\n    { std::swap(type, u.type); std::swap(value, u.value); return *this; }\n  ~AnyUnion() { Reset(); }\n\n  void Reset();\n\n  template <typename T>\n  void Set(T&& val) {\n    typedef typename std::remove_reference<T>::type RT;\n    Reset();\n    type = AnyUnionTraits<RT>::enum_value;\n    if (type != Any_NONE) {\n      value = new RT(std::forward<T>(val));\n    }\n  }\n\n  static void *UnPack(const void *obj, Any type, const ::flatbuffers::resolver_function_t *resolver);\n  ::flatbuffers::Offset<void> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr) const;\n\n  MyGame::Example::MonsterT *AsMonster() {\n    return type == Any_Monster ?\n      reinterpret_cast<MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n  const MyGame::Example::MonsterT *AsMonster() const {\n    return type == Any_Monster ?\n      reinterpret_cast<const MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n  MyGame::Example::TestSimpleTableWithEnumT *AsTestSimpleTableWithEnum() {\n    return type == Any_TestSimpleTableWithEnum ?\n      reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(value) : nullptr;\n  }\n  const MyGame::Example::TestSimpleTableWithEnumT *AsTestSimpleTableWithEnum() const {\n    return type == Any_TestSimpleTableWithEnum ?\n      reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(value) : nullptr;\n  }\n  MyGame::Example2::MonsterT *AsMyGame_Example2_Monster() {\n    return type == Any_MyGame_Example2_Monster ?\n      reinterpret_cast<MyGame::Example2::MonsterT *>(value) : nullptr;\n  }\n  const MyGame::Example2::MonsterT *AsMyGame_Example2_Monster() const {\n    return type == Any_MyGame_Example2_Monster ?\n      reinterpret_cast<const MyGame::Example2::MonsterT *>(value) : nullptr;\n  }\n};\n\n\ninline bool operator==(const AnyUnion &lhs, const AnyUnion &rhs) {\n  if (lhs.type != rhs.type) return false;\n  switch (lhs.type) {\n    case Any_NONE: {\n      return true;\n    }\n    case Any_Monster: {\n      return *(reinterpret_cast<const MyGame::Example::MonsterT *>(lhs.value)) ==\n             *(reinterpret_cast<const MyGame::Example::MonsterT *>(rhs.value));\n    }\n    case Any_TestSimpleTableWithEnum: {\n      return *(reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(lhs.value)) ==\n             *(reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(rhs.value));\n    }\n    case Any_MyGame_Example2_Monster: {\n      return *(reinterpret_cast<const MyGame::Example2::MonsterT *>(lhs.value)) ==\n             *(reinterpret_cast<const MyGame::Example2::MonsterT *>(rhs.value));\n    }\n    default: {\n      return false;\n    }\n  }\n}\n\ninline bool operator!=(const AnyUnion &lhs, const AnyUnion &rhs) {\n    return !(lhs == rhs);\n}\n\ntemplate <bool B = false>\nbool VerifyAny(::flatbuffers::VerifierTemplate<B> &verifier, const void *obj, Any type);\ntemplate <bool B = false>\nbool VerifyAnyVector(::flatbuffers::VerifierTemplate<B> &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types);\n\nenum AnyUniqueAliases : uint8_t {\n  AnyUniqueAliases_NONE = 0,\n  AnyUniqueAliases_M = 1,\n  AnyUniqueAliases_TS = 2,\n  AnyUniqueAliases_M2 = 3,\n  AnyUniqueAliases_MIN = AnyUniqueAliases_NONE,\n  AnyUniqueAliases_MAX = AnyUniqueAliases_M2\n};\n\ninline const AnyUniqueAliases (&EnumValuesAnyUniqueAliases())[4] {\n  static const AnyUniqueAliases values[] = {\n    AnyUniqueAliases_NONE,\n    AnyUniqueAliases_M,\n    AnyUniqueAliases_TS,\n    AnyUniqueAliases_M2\n  };\n  return values;\n}\n\ninline const char * const *EnumNamesAnyUniqueAliases() {\n  static const char * const names[5] = {\n    \"NONE\",\n    \"M\",\n    \"TS\",\n    \"M2\",\n    nullptr\n  };\n  return names;\n}\n\ninline const char *EnumNameAnyUniqueAliases(AnyUniqueAliases e) {\n  if (::flatbuffers::IsOutRange(e, AnyUniqueAliases_NONE, AnyUniqueAliases_M2)) return \"\";\n  const size_t index = static_cast<size_t>(e);\n  return EnumNamesAnyUniqueAliases()[index];\n}\n\ntemplate<typename T> struct AnyUniqueAliasesTraits {\n  static const AnyUniqueAliases enum_value = AnyUniqueAliases_NONE;\n};\n\ntemplate<> struct AnyUniqueAliasesTraits<MyGame::Example::Monster> {\n  static const AnyUniqueAliases enum_value = AnyUniqueAliases_M;\n};\n\ntemplate<> struct AnyUniqueAliasesTraits<MyGame::Example::TestSimpleTableWithEnum> {\n  static const AnyUniqueAliases enum_value = AnyUniqueAliases_TS;\n};\n\ntemplate<> struct AnyUniqueAliasesTraits<MyGame::Example2::Monster> {\n  static const AnyUniqueAliases enum_value = AnyUniqueAliases_M2;\n};\n\ntemplate<typename T> struct AnyUniqueAliasesUnionTraits {\n  static const AnyUniqueAliases enum_value = AnyUniqueAliases_NONE;\n};\n\ntemplate<> struct AnyUniqueAliasesUnionTraits<MyGame::Example::MonsterT> {\n  static const AnyUniqueAliases enum_value = AnyUniqueAliases_M;\n};\n\ntemplate<> struct AnyUniqueAliasesUnionTraits<MyGame::Example::TestSimpleTableWithEnumT> {\n  static const AnyUniqueAliases enum_value = AnyUniqueAliases_TS;\n};\n\ntemplate<> struct AnyUniqueAliasesUnionTraits<MyGame::Example2::MonsterT> {\n  static const AnyUniqueAliases enum_value = AnyUniqueAliases_M2;\n};\n\nstruct AnyUniqueAliasesUnion {\n  AnyUniqueAliases type;\n  void *value;\n\n  AnyUniqueAliasesUnion() : type(AnyUniqueAliases_NONE), value(nullptr) {}\n  AnyUniqueAliasesUnion(AnyUniqueAliasesUnion&& u) FLATBUFFERS_NOEXCEPT :\n    type(AnyUniqueAliases_NONE), value(nullptr)\n    { std::swap(type, u.type); std::swap(value, u.value); }\n  AnyUniqueAliasesUnion(const AnyUniqueAliasesUnion &);\n  AnyUniqueAliasesUnion &operator=(const AnyUniqueAliasesUnion &u)\n    { AnyUniqueAliasesUnion t(u); std::swap(type, t.type); std::swap(value, t.value); return *this; }\n  AnyUniqueAliasesUnion &operator=(AnyUniqueAliasesUnion &&u) FLATBUFFERS_NOEXCEPT\n    { std::swap(type, u.type); std::swap(value, u.value); return *this; }\n  ~AnyUniqueAliasesUnion() { Reset(); }\n\n  void Reset();\n\n  template <typename T>\n  void Set(T&& val) {\n    typedef typename std::remove_reference<T>::type RT;\n    Reset();\n    type = AnyUniqueAliasesUnionTraits<RT>::enum_value;\n    if (type != AnyUniqueAliases_NONE) {\n      value = new RT(std::forward<T>(val));\n    }\n  }\n\n  static void *UnPack(const void *obj, AnyUniqueAliases type, const ::flatbuffers::resolver_function_t *resolver);\n  ::flatbuffers::Offset<void> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr) const;\n\n  MyGame::Example::MonsterT *AsM() {\n    return type == AnyUniqueAliases_M ?\n      reinterpret_cast<MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n  const MyGame::Example::MonsterT *AsM() const {\n    return type == AnyUniqueAliases_M ?\n      reinterpret_cast<const MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n  MyGame::Example::TestSimpleTableWithEnumT *AsTS() {\n    return type == AnyUniqueAliases_TS ?\n      reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(value) : nullptr;\n  }\n  const MyGame::Example::TestSimpleTableWithEnumT *AsTS() const {\n    return type == AnyUniqueAliases_TS ?\n      reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(value) : nullptr;\n  }\n  MyGame::Example2::MonsterT *AsM2() {\n    return type == AnyUniqueAliases_M2 ?\n      reinterpret_cast<MyGame::Example2::MonsterT *>(value) : nullptr;\n  }\n  const MyGame::Example2::MonsterT *AsM2() const {\n    return type == AnyUniqueAliases_M2 ?\n      reinterpret_cast<const MyGame::Example2::MonsterT *>(value) : nullptr;\n  }\n};\n\n\ninline bool operator==(const AnyUniqueAliasesUnion &lhs, const AnyUniqueAliasesUnion &rhs) {\n  if (lhs.type != rhs.type) return false;\n  switch (lhs.type) {\n    case AnyUniqueAliases_NONE: {\n      return true;\n    }\n    case AnyUniqueAliases_M: {\n      return *(reinterpret_cast<const MyGame::Example::MonsterT *>(lhs.value)) ==\n             *(reinterpret_cast<const MyGame::Example::MonsterT *>(rhs.value));\n    }\n    case AnyUniqueAliases_TS: {\n      return *(reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(lhs.value)) ==\n             *(reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(rhs.value));\n    }\n    case AnyUniqueAliases_M2: {\n      return *(reinterpret_cast<const MyGame::Example2::MonsterT *>(lhs.value)) ==\n             *(reinterpret_cast<const MyGame::Example2::MonsterT *>(rhs.value));\n    }\n    default: {\n      return false;\n    }\n  }\n}\n\ninline bool operator!=(const AnyUniqueAliasesUnion &lhs, const AnyUniqueAliasesUnion &rhs) {\n    return !(lhs == rhs);\n}\n\ntemplate <bool B = false>\nbool VerifyAnyUniqueAliases(::flatbuffers::VerifierTemplate<B> &verifier, const void *obj, AnyUniqueAliases type);\ntemplate <bool B = false>\nbool VerifyAnyUniqueAliasesVector(::flatbuffers::VerifierTemplate<B> &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types);\n\nenum AnyAmbiguousAliases : uint8_t {\n  AnyAmbiguousAliases_NONE = 0,\n  AnyAmbiguousAliases_M1 = 1,\n  AnyAmbiguousAliases_M2 = 2,\n  AnyAmbiguousAliases_M3 = 3,\n  AnyAmbiguousAliases_MIN = AnyAmbiguousAliases_NONE,\n  AnyAmbiguousAliases_MAX = AnyAmbiguousAliases_M3\n};\n\ninline const AnyAmbiguousAliases (&EnumValuesAnyAmbiguousAliases())[4] {\n  static const AnyAmbiguousAliases values[] = {\n    AnyAmbiguousAliases_NONE,\n    AnyAmbiguousAliases_M1,\n    AnyAmbiguousAliases_M2,\n    AnyAmbiguousAliases_M3\n  };\n  return values;\n}\n\ninline const char * const *EnumNamesAnyAmbiguousAliases() {\n  static const char * const names[5] = {\n    \"NONE\",\n    \"M1\",\n    \"M2\",\n    \"M3\",\n    nullptr\n  };\n  return names;\n}\n\ninline const char *EnumNameAnyAmbiguousAliases(AnyAmbiguousAliases e) {\n  if (::flatbuffers::IsOutRange(e, AnyAmbiguousAliases_NONE, AnyAmbiguousAliases_M3)) return \"\";\n  const size_t index = static_cast<size_t>(e);\n  return EnumNamesAnyAmbiguousAliases()[index];\n}\n\nstruct AnyAmbiguousAliasesUnion {\n  AnyAmbiguousAliases type;\n  void *value;\n\n  AnyAmbiguousAliasesUnion() : type(AnyAmbiguousAliases_NONE), value(nullptr) {}\n  AnyAmbiguousAliasesUnion(AnyAmbiguousAliasesUnion&& u) FLATBUFFERS_NOEXCEPT :\n    type(AnyAmbiguousAliases_NONE), value(nullptr)\n    { std::swap(type, u.type); std::swap(value, u.value); }\n  AnyAmbiguousAliasesUnion(const AnyAmbiguousAliasesUnion &);\n  AnyAmbiguousAliasesUnion &operator=(const AnyAmbiguousAliasesUnion &u)\n    { AnyAmbiguousAliasesUnion t(u); std::swap(type, t.type); std::swap(value, t.value); return *this; }\n  AnyAmbiguousAliasesUnion &operator=(AnyAmbiguousAliasesUnion &&u) FLATBUFFERS_NOEXCEPT\n    { std::swap(type, u.type); std::swap(value, u.value); return *this; }\n  ~AnyAmbiguousAliasesUnion() { Reset(); }\n\n  void Reset();\n\n  static void *UnPack(const void *obj, AnyAmbiguousAliases type, const ::flatbuffers::resolver_function_t *resolver);\n  ::flatbuffers::Offset<void> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr) const;\n\n  MyGame::Example::MonsterT *AsM1() {\n    return type == AnyAmbiguousAliases_M1 ?\n      reinterpret_cast<MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n  const MyGame::Example::MonsterT *AsM1() const {\n    return type == AnyAmbiguousAliases_M1 ?\n      reinterpret_cast<const MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n  MyGame::Example::MonsterT *AsM2() {\n    return type == AnyAmbiguousAliases_M2 ?\n      reinterpret_cast<MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n  const MyGame::Example::MonsterT *AsM2() const {\n    return type == AnyAmbiguousAliases_M2 ?\n      reinterpret_cast<const MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n  MyGame::Example::MonsterT *AsM3() {\n    return type == AnyAmbiguousAliases_M3 ?\n      reinterpret_cast<MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n  const MyGame::Example::MonsterT *AsM3() const {\n    return type == AnyAmbiguousAliases_M3 ?\n      reinterpret_cast<const MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n};\n\n\ninline bool operator==(const AnyAmbiguousAliasesUnion &lhs, const AnyAmbiguousAliasesUnion &rhs) {\n  if (lhs.type != rhs.type) return false;\n  switch (lhs.type) {\n    case AnyAmbiguousAliases_NONE: {\n      return true;\n    }\n    case AnyAmbiguousAliases_M1: {\n      return *(reinterpret_cast<const MyGame::Example::MonsterT *>(lhs.value)) ==\n             *(reinterpret_cast<const MyGame::Example::MonsterT *>(rhs.value));\n    }\n    case AnyAmbiguousAliases_M2: {\n      return *(reinterpret_cast<const MyGame::Example::MonsterT *>(lhs.value)) ==\n             *(reinterpret_cast<const MyGame::Example::MonsterT *>(rhs.value));\n    }\n    case AnyAmbiguousAliases_M3: {\n      return *(reinterpret_cast<const MyGame::Example::MonsterT *>(lhs.value)) ==\n             *(reinterpret_cast<const MyGame::Example::MonsterT *>(rhs.value));\n    }\n    default: {\n      return false;\n    }\n  }\n}\n\ninline bool operator!=(const AnyAmbiguousAliasesUnion &lhs, const AnyAmbiguousAliasesUnion &rhs) {\n    return !(lhs == rhs);\n}\n\ntemplate <bool B = false>\nbool VerifyAnyAmbiguousAliases(::flatbuffers::VerifierTemplate<B> &verifier, const void *obj, AnyAmbiguousAliases type);\ntemplate <bool B = false>\nbool VerifyAnyAmbiguousAliasesVector(::flatbuffers::VerifierTemplate<B> &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types);\n\nFLATBUFFERS_MANUALLY_ALIGNED_STRUCT(2) Test FLATBUFFERS_FINAL_CLASS {\n private:\n  int16_t a_;\n  int8_t b_;\n  int8_t padding0__;\n\n public:\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return TestTypeTable();\n  }\n  Test()\n      : a_(0),\n        b_(0),\n        padding0__(0) {\n    (void)padding0__;\n  }\n  Test(int16_t _a, int8_t _b)\n      : a_(::flatbuffers::EndianScalar(_a)),\n        b_(::flatbuffers::EndianScalar(_b)),\n        padding0__(0) {\n    (void)padding0__;\n  }\n  int16_t a() const {\n    return ::flatbuffers::EndianScalar(a_);\n  }\n  void mutate_a(int16_t _a) {\n    ::flatbuffers::WriteScalar(&a_, _a);\n  }\n  int8_t b() const {\n    return ::flatbuffers::EndianScalar(b_);\n  }\n  void mutate_b(int8_t _b) {\n    ::flatbuffers::WriteScalar(&b_, _b);\n  }\n};\nFLATBUFFERS_STRUCT_END(Test, 4);\n\ninline bool operator==(const Test &lhs, const Test &rhs) {\n  return\n      (lhs.a() == rhs.a()) &&\n      (lhs.b() == rhs.b());\n}\n\ninline bool operator!=(const Test &lhs, const Test &rhs) {\n    return !(lhs == rhs);\n}\n\ntemplate <typename H>\ninline H AbslHashValue(H h, const Test &obj) {\n  return H::combine(std::move(h), obj.a(), obj.b());\n}\n\nFLATBUFFERS_MANUALLY_ALIGNED_STRUCT(8) Vec3 FLATBUFFERS_FINAL_CLASS {\n private:\n  float x_;\n  float y_;\n  float z_;\n  int32_t padding0__;\n  double test1_;\n  uint8_t test2_;\n  int8_t padding1__;\n  MyGame::Example::Test test3_;\n  int16_t padding2__;\n\n public:\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return Vec3TypeTable();\n  }\n  Vec3()\n      : x_(0),\n        y_(0),\n        z_(0),\n        padding0__(0),\n        test1_(0),\n        test2_(0),\n        padding1__(0),\n        test3_(),\n        padding2__(0) {\n    (void)padding0__;\n    (void)padding1__;\n    (void)padding2__;\n  }\n  Vec3(float _x, float _y, float _z, double _test1, MyGame::Example::Color _test2, const MyGame::Example::Test &_test3)\n      : x_(::flatbuffers::EndianScalar(_x)),\n        y_(::flatbuffers::EndianScalar(_y)),\n        z_(::flatbuffers::EndianScalar(_z)),\n        padding0__(0),\n        test1_(::flatbuffers::EndianScalar(_test1)),\n        test2_(::flatbuffers::EndianScalar(static_cast<uint8_t>(_test2))),\n        padding1__(0),\n        test3_(_test3),\n        padding2__(0) {\n    (void)padding0__;\n    (void)padding1__;\n    (void)padding2__;\n  }\n  float x() const {\n    return ::flatbuffers::EndianScalar(x_);\n  }\n  void mutate_x(float _x) {\n    ::flatbuffers::WriteScalar(&x_, _x);\n  }\n  float y() const {\n    return ::flatbuffers::EndianScalar(y_);\n  }\n  void mutate_y(float _y) {\n    ::flatbuffers::WriteScalar(&y_, _y);\n  }\n  float z() const {\n    return ::flatbuffers::EndianScalar(z_);\n  }\n  void mutate_z(float _z) {\n    ::flatbuffers::WriteScalar(&z_, _z);\n  }\n  double test1() const {\n    return ::flatbuffers::EndianScalar(test1_);\n  }\n  void mutate_test1(double _test1) {\n    ::flatbuffers::WriteScalar(&test1_, _test1);\n  }\n  MyGame::Example::Color test2() const {\n    return static_cast<MyGame::Example::Color>(::flatbuffers::EndianScalar(test2_));\n  }\n  void mutate_test2(MyGame::Example::Color _test2) {\n    ::flatbuffers::WriteScalar(&test2_, static_cast<uint8_t>(_test2));\n  }\n  const MyGame::Example::Test &test3() const {\n    return test3_;\n  }\n  MyGame::Example::Test &mutable_test3() {\n    return test3_;\n  }\n};\nFLATBUFFERS_STRUCT_END(Vec3, 32);\n\ninline bool operator==(const Vec3 &lhs, const Vec3 &rhs) {\n  return\n      (lhs.x() == rhs.x()) &&\n      (lhs.y() == rhs.y()) &&\n      (lhs.z() == rhs.z()) &&\n      (lhs.test1() == rhs.test1()) &&\n      (lhs.test2() == rhs.test2()) &&\n      (lhs.test3() == rhs.test3());\n}\n\ninline bool operator!=(const Vec3 &lhs, const Vec3 &rhs) {\n    return !(lhs == rhs);\n}\n\ntemplate <typename H>\ninline H AbslHashValue(H h, const Vec3 &obj) {\n  return H::combine(std::move(h), obj.x(), obj.y(), obj.z(), obj.test1(), obj.test2(), obj.test3());\n}\n\nFLATBUFFERS_MANUALLY_ALIGNED_STRUCT(4) Ability FLATBUFFERS_FINAL_CLASS {\n private:\n  uint32_t id_;\n  uint32_t distance_;\n\n public:\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return AbilityTypeTable();\n  }\n  Ability()\n      : id_(0),\n        distance_(0) {\n  }\n  Ability(uint32_t _id, uint32_t _distance)\n      : id_(::flatbuffers::EndianScalar(_id)),\n        distance_(::flatbuffers::EndianScalar(_distance)) {\n  }\n  uint32_t id() const {\n    return ::flatbuffers::EndianScalar(id_);\n  }\n  void mutate_id(uint32_t _id) {\n    ::flatbuffers::WriteScalar(&id_, _id);\n  }\n  bool KeyCompareLessThan(const Ability * const o) const {\n    return id() < o->id();\n  }\n  int KeyCompareWithValue(uint32_t _id) const {\n    return static_cast<int>(id() > _id) - static_cast<int>(id() < _id);\n  }\n  uint32_t distance() const {\n    return ::flatbuffers::EndianScalar(distance_);\n  }\n  void mutate_distance(uint32_t _distance) {\n    ::flatbuffers::WriteScalar(&distance_, _distance);\n  }\n};\nFLATBUFFERS_STRUCT_END(Ability, 8);\n\ninline bool operator==(const Ability &lhs, const Ability &rhs) {\n  return\n      (lhs.id() == rhs.id()) &&\n      (lhs.distance() == rhs.distance());\n}\n\ninline bool operator!=(const Ability &lhs, const Ability &rhs) {\n    return !(lhs == rhs);\n}\n\ntemplate <typename H>\ninline H AbslHashValue(H h, const Ability &obj) {\n  return H::combine(std::move(h), obj.id(), obj.distance());\n}\n\nFLATBUFFERS_MANUALLY_ALIGNED_STRUCT(4) StructOfStructs FLATBUFFERS_FINAL_CLASS {\n private:\n  MyGame::Example::Ability a_;\n  MyGame::Example::Test b_;\n  MyGame::Example::Ability c_;\n\n public:\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return StructOfStructsTypeTable();\n  }\n  StructOfStructs()\n      : a_(),\n        b_(),\n        c_() {\n  }\n  StructOfStructs(const MyGame::Example::Ability &_a, const MyGame::Example::Test &_b, const MyGame::Example::Ability &_c)\n      : a_(_a),\n        b_(_b),\n        c_(_c) {\n  }\n  const MyGame::Example::Ability &a() const {\n    return a_;\n  }\n  MyGame::Example::Ability &mutable_a() {\n    return a_;\n  }\n  const MyGame::Example::Test &b() const {\n    return b_;\n  }\n  MyGame::Example::Test &mutable_b() {\n    return b_;\n  }\n  const MyGame::Example::Ability &c() const {\n    return c_;\n  }\n  MyGame::Example::Ability &mutable_c() {\n    return c_;\n  }\n};\nFLATBUFFERS_STRUCT_END(StructOfStructs, 20);\n\ninline bool operator==(const StructOfStructs &lhs, const StructOfStructs &rhs) {\n  return\n      (lhs.a() == rhs.a()) &&\n      (lhs.b() == rhs.b()) &&\n      (lhs.c() == rhs.c());\n}\n\ninline bool operator!=(const StructOfStructs &lhs, const StructOfStructs &rhs) {\n    return !(lhs == rhs);\n}\n\ntemplate <typename H>\ninline H AbslHashValue(H h, const StructOfStructs &obj) {\n  return H::combine(std::move(h), obj.a(), obj.b(), obj.c());\n}\n\nFLATBUFFERS_MANUALLY_ALIGNED_STRUCT(4) StructOfStructsOfStructs FLATBUFFERS_FINAL_CLASS {\n private:\n  MyGame::Example::StructOfStructs a_;\n\n public:\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return StructOfStructsOfStructsTypeTable();\n  }\n  StructOfStructsOfStructs()\n      : a_() {\n  }\n  StructOfStructsOfStructs(const MyGame::Example::StructOfStructs &_a)\n      : a_(_a) {\n  }\n  const MyGame::Example::StructOfStructs &a() const {\n    return a_;\n  }\n  MyGame::Example::StructOfStructs &mutable_a() {\n    return a_;\n  }\n};\nFLATBUFFERS_STRUCT_END(StructOfStructsOfStructs, 20);\n\ninline bool operator==(const StructOfStructsOfStructs &lhs, const StructOfStructsOfStructs &rhs) {\n  return\n      (lhs.a() == rhs.a());\n}\n\ninline bool operator!=(const StructOfStructsOfStructs &lhs, const StructOfStructsOfStructs &rhs) {\n    return !(lhs == rhs);\n}\n\ntemplate <typename H>\ninline H AbslHashValue(H h, const StructOfStructsOfStructs &obj) {\n  return H::combine(std::move(h), obj.a());\n}\n\n}  // namespace Example\n\nstruct InParentNamespaceT : public ::flatbuffers::NativeTable {\n  typedef InParentNamespace TableType;\n};\n\nstruct InParentNamespace FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef InParentNamespaceT NativeTableType;\n  typedef InParentNamespaceBuilder Builder;\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return InParentNamespaceTypeTable();\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           verifier.EndTable();\n  }\n  InParentNamespaceT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  void UnPackTo(InParentNamespaceT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  static ::flatbuffers::Offset<InParentNamespace> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const InParentNamespaceT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n};\n\nstruct InParentNamespaceBuilder {\n  typedef InParentNamespace Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  explicit InParentNamespaceBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<InParentNamespace> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<InParentNamespace>(end);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<InParentNamespace> CreateInParentNamespace(\n    ::flatbuffers::FlatBufferBuilder &_fbb) {\n  InParentNamespaceBuilder builder_(_fbb);\n  return builder_.Finish();\n}\n\n::flatbuffers::Offset<InParentNamespace> CreateInParentNamespace(::flatbuffers::FlatBufferBuilder &_fbb, const InParentNamespaceT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n\nnamespace Example2 {\n\nstruct MonsterT : public ::flatbuffers::NativeTable {\n  typedef Monster TableType;\n};\n\nstruct Monster FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef MonsterT NativeTableType;\n  typedef MonsterBuilder Builder;\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return MonsterTypeTable();\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           verifier.EndTable();\n  }\n  MonsterT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  void UnPackTo(MonsterT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  static ::flatbuffers::Offset<Monster> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n};\n\nstruct MonsterBuilder {\n  typedef Monster Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  explicit MonsterBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<Monster> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<Monster>(end);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<Monster> CreateMonster(\n    ::flatbuffers::FlatBufferBuilder &_fbb) {\n  MonsterBuilder builder_(_fbb);\n  return builder_.Finish();\n}\n\n::flatbuffers::Offset<Monster> CreateMonster(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n\n}  // namespace Example2\n\nnamespace Example {\n\nstruct TestSimpleTableWithEnumT : public ::flatbuffers::NativeTable {\n  typedef TestSimpleTableWithEnum TableType;\n  MyGame::Example::Color color = MyGame::Example::Color_Green;\n};\n\nstruct TestSimpleTableWithEnum FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef TestSimpleTableWithEnumT NativeTableType;\n  typedef TestSimpleTableWithEnumBuilder Builder;\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return TestSimpleTableWithEnumTypeTable();\n  }\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_COLOR = 4\n  };\n  MyGame::Example::Color color() const {\n    return static_cast<MyGame::Example::Color>(GetField<uint8_t>(VT_COLOR, 2));\n  }\n  bool mutate_color(MyGame::Example::Color _color = static_cast<MyGame::Example::Color>(2)) {\n    return SetField<uint8_t>(VT_COLOR, static_cast<uint8_t>(_color), 2);\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyField<uint8_t>(verifier, VT_COLOR, 1) &&\n           verifier.EndTable();\n  }\n  TestSimpleTableWithEnumT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  void UnPackTo(TestSimpleTableWithEnumT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  static ::flatbuffers::Offset<TestSimpleTableWithEnum> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const TestSimpleTableWithEnumT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n};\n\nstruct TestSimpleTableWithEnumBuilder {\n  typedef TestSimpleTableWithEnum Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_color(MyGame::Example::Color color) {\n    fbb_.AddElement<uint8_t>(TestSimpleTableWithEnum::VT_COLOR, static_cast<uint8_t>(color), 2);\n  }\n  explicit TestSimpleTableWithEnumBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<TestSimpleTableWithEnum> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<TestSimpleTableWithEnum>(end);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<TestSimpleTableWithEnum> CreateTestSimpleTableWithEnum(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    MyGame::Example::Color color = MyGame::Example::Color_Green) {\n  TestSimpleTableWithEnumBuilder builder_(_fbb);\n  builder_.add_color(color);\n  return builder_.Finish();\n}\n\n::flatbuffers::Offset<TestSimpleTableWithEnum> CreateTestSimpleTableWithEnum(::flatbuffers::FlatBufferBuilder &_fbb, const TestSimpleTableWithEnumT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n\nstruct StatT : public ::flatbuffers::NativeTable {\n  typedef Stat TableType;\n  std::string id{};\n  int64_t val = 0;\n  uint16_t count = 0;\n};\n\nstruct Stat FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef StatT NativeTableType;\n  typedef StatBuilder Builder;\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return StatTypeTable();\n  }\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_ID = 4,\n    VT_VAL = 6,\n    VT_COUNT = 8\n  };\n  const ::flatbuffers::String *id() const {\n    return GetPointer<const ::flatbuffers::String *>(VT_ID);\n  }\n  ::flatbuffers::String *mutable_id() {\n    return GetPointer<::flatbuffers::String *>(VT_ID);\n  }\n  int64_t val() const {\n    return GetField<int64_t>(VT_VAL, 0);\n  }\n  bool mutate_val(int64_t _val = 0) {\n    return SetField<int64_t>(VT_VAL, _val, 0);\n  }\n  uint16_t count() const {\n    return GetField<uint16_t>(VT_COUNT, 0);\n  }\n  bool mutate_count(uint16_t _count = 0) {\n    return SetField<uint16_t>(VT_COUNT, _count, 0);\n  }\n  bool KeyCompareLessThan(const Stat * const o) const {\n    return count() < o->count();\n  }\n  int KeyCompareWithValue(uint16_t _count) const {\n    return static_cast<int>(count() > _count) - static_cast<int>(count() < _count);\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyOffset(verifier, VT_ID) &&\n           verifier.VerifyString(id()) &&\n           VerifyField<int64_t>(verifier, VT_VAL, 8) &&\n           VerifyField<uint16_t>(verifier, VT_COUNT, 2) &&\n           verifier.EndTable();\n  }\n  StatT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  void UnPackTo(StatT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  static ::flatbuffers::Offset<Stat> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const StatT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n};\n\nstruct StatBuilder {\n  typedef Stat Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_id(::flatbuffers::Offset<::flatbuffers::String> id) {\n    fbb_.AddOffset(Stat::VT_ID, id);\n  }\n  void add_val(int64_t val) {\n    fbb_.AddElement<int64_t>(Stat::VT_VAL, val, 0);\n  }\n  void add_count(uint16_t count) {\n    fbb_.AddElement<uint16_t>(Stat::VT_COUNT, count, 0);\n  }\n  explicit StatBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<Stat> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<Stat>(end);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<Stat> CreateStat(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    ::flatbuffers::Offset<::flatbuffers::String> id = 0,\n    int64_t val = 0,\n    uint16_t count = 0) {\n  StatBuilder builder_(_fbb);\n  builder_.add_val(val);\n  builder_.add_id(id);\n  builder_.add_count(count);\n  return builder_.Finish();\n}\n\ninline ::flatbuffers::Offset<Stat> CreateStatDirect(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    const char *id = nullptr,\n    int64_t val = 0,\n    uint16_t count = 0) {\n  auto id__ = id ? _fbb.CreateString(id) : 0;\n  return MyGame::Example::CreateStat(\n      _fbb,\n      id__,\n      val,\n      count);\n}\n\n::flatbuffers::Offset<Stat> CreateStat(::flatbuffers::FlatBufferBuilder &_fbb, const StatT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n\nstruct ReferrableT : public ::flatbuffers::NativeTable {\n  typedef Referrable TableType;\n  uint64_t id = 0;\n};\n\nstruct Referrable FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef ReferrableT NativeTableType;\n  typedef ReferrableBuilder Builder;\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return ReferrableTypeTable();\n  }\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_ID = 4\n  };\n  uint64_t id() const {\n    return GetField<uint64_t>(VT_ID, 0);\n  }\n  bool mutate_id(uint64_t _id = 0) {\n    return SetField<uint64_t>(VT_ID, _id, 0);\n  }\n  bool KeyCompareLessThan(const Referrable * const o) const {\n    return id() < o->id();\n  }\n  int KeyCompareWithValue(uint64_t _id) const {\n    return static_cast<int>(id() > _id) - static_cast<int>(id() < _id);\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyField<uint64_t>(verifier, VT_ID, 8) &&\n           verifier.EndTable();\n  }\n  ReferrableT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  void UnPackTo(ReferrableT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  static ::flatbuffers::Offset<Referrable> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ReferrableT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n};\n\nstruct ReferrableBuilder {\n  typedef Referrable Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_id(uint64_t id) {\n    fbb_.AddElement<uint64_t>(Referrable::VT_ID, id, 0);\n  }\n  explicit ReferrableBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<Referrable> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<Referrable>(end);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<Referrable> CreateReferrable(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    uint64_t id = 0) {\n  ReferrableBuilder builder_(_fbb);\n  builder_.add_id(id);\n  return builder_.Finish();\n}\n\n::flatbuffers::Offset<Referrable> CreateReferrable(::flatbuffers::FlatBufferBuilder &_fbb, const ReferrableT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n\nstruct MonsterT : public ::flatbuffers::NativeTable {\n  typedef Monster TableType;\n  std::unique_ptr<MyGame::Example::Vec3> pos{};\n  int16_t mana = 150;\n  int16_t hp = 100;\n  std::string name{};\n  std::vector<uint8_t> inventory{};\n  MyGame::Example::Color color = MyGame::Example::Color_Blue;\n  MyGame::Example::AnyUnion test{};\n  std::vector<MyGame::Example::Test> test4{};\n  std::vector<std::string> testarrayofstring{};\n  std::vector<std::unique_ptr<MyGame::Example::MonsterT>> testarrayoftables{};\n  std::unique_ptr<MyGame::Example::MonsterT> enemy{};\n  std::vector<uint8_t> testnestedflatbuffer{};\n  std::unique_ptr<MyGame::Example::StatT> testempty{};\n  bool testbool = false;\n  int32_t testhashs32_fnv1 = 0;\n  uint32_t testhashu32_fnv1 = 0;\n  int64_t testhashs64_fnv1 = 0;\n  uint64_t testhashu64_fnv1 = 0;\n  int32_t testhashs32_fnv1a = 0;\n  Stat *testhashu32_fnv1a = nullptr;\n  int64_t testhashs64_fnv1a = 0;\n  uint64_t testhashu64_fnv1a = 0;\n  std::vector<bool> testarrayofbools{};\n  float testf = 3.14159f;\n  float testf2 = 3.0f;\n  float testf3 = 0.0f;\n  std::vector<std::string> testarrayofstring2{};\n  std::vector<MyGame::Example::Ability> testarrayofsortedstruct{};\n  std::vector<uint8_t> flex{};\n  std::vector<MyGame::Example::Test> test5{};\n  std::vector<int64_t> vector_of_longs{};\n  std::vector<double> vector_of_doubles{};\n  std::unique_ptr<MyGame::InParentNamespaceT> parent_namespace_test{};\n  std::vector<std::unique_ptr<MyGame::Example::ReferrableT>> vector_of_referrables{};\n  ReferrableT *single_weak_reference = nullptr;\n  std::vector<ReferrableT *> vector_of_weak_references{};\n  std::vector<std::unique_ptr<MyGame::Example::ReferrableT>> vector_of_strong_referrables{};\n  ReferrableT *co_owning_reference = nullptr;\n  std::vector<std::unique_ptr<ReferrableT>> vector_of_co_owning_references{};\n  ReferrableT *non_owning_reference = nullptr;\n  std::vector<ReferrableT *> vector_of_non_owning_references{};\n  MyGame::Example::AnyUniqueAliasesUnion any_unique{};\n  MyGame::Example::AnyAmbiguousAliasesUnion any_ambiguous{};\n  std::vector<MyGame::Example::Color> vector_of_enums{};\n  MyGame::Example::Race signed_enum = MyGame::Example::Race_None;\n  std::vector<uint8_t> testrequirednestedflatbuffer{};\n  std::vector<std::unique_ptr<MyGame::Example::StatT>> scalar_key_sorted_tables{};\n  MyGame::Example::Test native_inline{};\n  MyGame::Example::LongEnum long_enum_non_enum_default = static_cast<MyGame::Example::LongEnum>(0);\n  MyGame::Example::LongEnum long_enum_normal_default = MyGame::Example::LongEnum_LongOne;\n  float nan_default = std::numeric_limits<float>::quiet_NaN();\n  float inf_default = std::numeric_limits<float>::infinity();\n  float positive_inf_default = std::numeric_limits<float>::infinity();\n  float infinity_default = std::numeric_limits<float>::infinity();\n  float positive_infinity_default = std::numeric_limits<float>::infinity();\n  float negative_inf_default = -std::numeric_limits<float>::infinity();\n  float negative_infinity_default = -std::numeric_limits<float>::infinity();\n  double double_inf_default = std::numeric_limits<double>::infinity();\n  MonsterT() = default;\n  MonsterT(const MonsterT &o);\n  MonsterT(MonsterT&&) FLATBUFFERS_NOEXCEPT = default;\n  MonsterT &operator=(MonsterT o) FLATBUFFERS_NOEXCEPT;\n};\n\n/// an example documentation comment: \"monster object\"\nstruct Monster FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef MonsterT NativeTableType;\n  typedef MonsterBuilder Builder;\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return MonsterTypeTable();\n  }\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_POS = 4,\n    VT_MANA = 6,\n    VT_HP = 8,\n    VT_NAME = 10,\n    VT_INVENTORY = 14,\n    VT_COLOR = 16,\n    VT_TEST_TYPE = 18,\n    VT_TEST = 20,\n    VT_TEST4 = 22,\n    VT_TESTARRAYOFSTRING = 24,\n    VT_TESTARRAYOFTABLES = 26,\n    VT_ENEMY = 28,\n    VT_TESTNESTEDFLATBUFFER = 30,\n    VT_TESTEMPTY = 32,\n    VT_TESTBOOL = 34,\n    VT_TESTHASHS32_FNV1 = 36,\n    VT_TESTHASHU32_FNV1 = 38,\n    VT_TESTHASHS64_FNV1 = 40,\n    VT_TESTHASHU64_FNV1 = 42,\n    VT_TESTHASHS32_FNV1A = 44,\n    VT_TESTHASHU32_FNV1A = 46,\n    VT_TESTHASHS64_FNV1A = 48,\n    VT_TESTHASHU64_FNV1A = 50,\n    VT_TESTARRAYOFBOOLS = 52,\n    VT_TESTF = 54,\n    VT_TESTF2 = 56,\n    VT_TESTF3 = 58,\n    VT_TESTARRAYOFSTRING2 = 60,\n    VT_TESTARRAYOFSORTEDSTRUCT = 62,\n    VT_FLEX = 64,\n    VT_TEST5 = 66,\n    VT_VECTOR_OF_LONGS = 68,\n    VT_VECTOR_OF_DOUBLES = 70,\n    VT_PARENT_NAMESPACE_TEST = 72,\n    VT_VECTOR_OF_REFERRABLES = 74,\n    VT_SINGLE_WEAK_REFERENCE = 76,\n    VT_VECTOR_OF_WEAK_REFERENCES = 78,\n    VT_VECTOR_OF_STRONG_REFERRABLES = 80,\n    VT_CO_OWNING_REFERENCE = 82,\n    VT_VECTOR_OF_CO_OWNING_REFERENCES = 84,\n    VT_NON_OWNING_REFERENCE = 86,\n    VT_VECTOR_OF_NON_OWNING_REFERENCES = 88,\n    VT_ANY_UNIQUE_TYPE = 90,\n    VT_ANY_UNIQUE = 92,\n    VT_ANY_AMBIGUOUS_TYPE = 94,\n    VT_ANY_AMBIGUOUS = 96,\n    VT_VECTOR_OF_ENUMS = 98,\n    VT_SIGNED_ENUM = 100,\n    VT_TESTREQUIREDNESTEDFLATBUFFER = 102,\n    VT_SCALAR_KEY_SORTED_TABLES = 104,\n    VT_NATIVE_INLINE = 106,\n    VT_LONG_ENUM_NON_ENUM_DEFAULT = 108,\n    VT_LONG_ENUM_NORMAL_DEFAULT = 110,\n    VT_NAN_DEFAULT = 112,\n    VT_INF_DEFAULT = 114,\n    VT_POSITIVE_INF_DEFAULT = 116,\n    VT_INFINITY_DEFAULT = 118,\n    VT_POSITIVE_INFINITY_DEFAULT = 120,\n    VT_NEGATIVE_INF_DEFAULT = 122,\n    VT_NEGATIVE_INFINITY_DEFAULT = 124,\n    VT_DOUBLE_INF_DEFAULT = 126\n  };\n  const MyGame::Example::Vec3 *pos() const {\n    return GetStruct<const MyGame::Example::Vec3 *>(VT_POS);\n  }\n  MyGame::Example::Vec3 *mutable_pos() {\n    return GetStruct<MyGame::Example::Vec3 *>(VT_POS);\n  }\n  int16_t mana() const {\n    return GetField<int16_t>(VT_MANA, 150);\n  }\n  bool mutate_mana(int16_t _mana = 150) {\n    return SetField<int16_t>(VT_MANA, _mana, 150);\n  }\n  int16_t hp() const {\n    return GetField<int16_t>(VT_HP, 100);\n  }\n  bool mutate_hp(int16_t _hp = 100) {\n    return SetField<int16_t>(VT_HP, _hp, 100);\n  }\n  const ::flatbuffers::String *name() const {\n    return GetPointer<const ::flatbuffers::String *>(VT_NAME);\n  }\n  ::flatbuffers::String *mutable_name() {\n    return GetPointer<::flatbuffers::String *>(VT_NAME);\n  }\n  bool KeyCompareLessThan(const Monster * const o) const {\n    return *name() < *o->name();\n  }\n  int KeyCompareWithValue(const char *_name) const {\n    return strcmp(name()->c_str(), _name);\n  }\n  template<typename StringType>\n  int KeyCompareWithValue(const StringType& _name) const {\n    if (name()->c_str() < _name) return -1;\n    if (_name < name()->c_str()) return 1;\n    return 0;\n  }\n  const ::flatbuffers::Vector<uint8_t> *inventory() const {\n    return GetPointer<const ::flatbuffers::Vector<uint8_t> *>(VT_INVENTORY);\n  }\n  ::flatbuffers::Vector<uint8_t> *mutable_inventory() {\n    return GetPointer<::flatbuffers::Vector<uint8_t> *>(VT_INVENTORY);\n  }\n  MyGame::Example::Color color() const {\n    return static_cast<MyGame::Example::Color>(GetField<uint8_t>(VT_COLOR, 8));\n  }\n  bool mutate_color(MyGame::Example::Color _color = static_cast<MyGame::Example::Color>(8)) {\n    return SetField<uint8_t>(VT_COLOR, static_cast<uint8_t>(_color), 8);\n  }\n  MyGame::Example::Any test_type() const {\n    return static_cast<MyGame::Example::Any>(GetField<uint8_t>(VT_TEST_TYPE, 0));\n  }\n  const void *test() const {\n    return GetPointer<const void *>(VT_TEST);\n  }\n  template<typename T> const T *test_as() const;\n  const MyGame::Example::Monster *test_as_Monster() const {\n    return test_type() == MyGame::Example::Any_Monster ? static_cast<const MyGame::Example::Monster *>(test()) : nullptr;\n  }\n  const MyGame::Example::TestSimpleTableWithEnum *test_as_TestSimpleTableWithEnum() const {\n    return test_type() == MyGame::Example::Any_TestSimpleTableWithEnum ? static_cast<const MyGame::Example::TestSimpleTableWithEnum *>(test()) : nullptr;\n  }\n  const MyGame::Example2::Monster *test_as_MyGame_Example2_Monster() const {\n    return test_type() == MyGame::Example::Any_MyGame_Example2_Monster ? static_cast<const MyGame::Example2::Monster *>(test()) : nullptr;\n  }\n  template<typename T> T *mutable_test_as();\n  MyGame::Example::Monster *mutable_test_as_Monster() {\n    return test_type() == MyGame::Example::Any_Monster ? static_cast<MyGame::Example::Monster *>(mutable_test()) : nullptr;\n  }\n  MyGame::Example::TestSimpleTableWithEnum *mutable_test_as_TestSimpleTableWithEnum() {\n    return test_type() == MyGame::Example::Any_TestSimpleTableWithEnum ? static_cast<MyGame::Example::TestSimpleTableWithEnum *>(mutable_test()) : nullptr;\n  }\n  MyGame::Example2::Monster *mutable_test_as_MyGame_Example2_Monster() {\n    return test_type() == MyGame::Example::Any_MyGame_Example2_Monster ? static_cast<MyGame::Example2::Monster *>(mutable_test()) : nullptr;\n  }\n  void *mutable_test() {\n    return GetPointer<void *>(VT_TEST);\n  }\n  const ::flatbuffers::Vector<const MyGame::Example::Test *> *test4() const {\n    return GetPointer<const ::flatbuffers::Vector<const MyGame::Example::Test *> *>(VT_TEST4);\n  }\n  ::flatbuffers::Vector<const MyGame::Example::Test *> *mutable_test4() {\n    return GetPointer<::flatbuffers::Vector<const MyGame::Example::Test *> *>(VT_TEST4);\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *testarrayofstring() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_TESTARRAYOFSTRING);\n  }\n  ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *mutable_testarrayofstring() {\n    return GetPointer<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_TESTARRAYOFSTRING);\n  }\n  /// an example documentation comment: this will end up in the generated code\n  /// multiline too\n  const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Monster>> *testarrayoftables() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Monster>> *>(VT_TESTARRAYOFTABLES);\n  }\n  ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Monster>> *mutable_testarrayoftables() {\n    return GetPointer<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Monster>> *>(VT_TESTARRAYOFTABLES);\n  }\n  const MyGame::Example::Monster *enemy() const {\n    return GetPointer<const MyGame::Example::Monster *>(VT_ENEMY);\n  }\n  MyGame::Example::Monster *mutable_enemy() {\n    return GetPointer<MyGame::Example::Monster *>(VT_ENEMY);\n  }\n  const ::flatbuffers::Vector<uint8_t> *testnestedflatbuffer() const {\n    return GetPointer<const ::flatbuffers::Vector<uint8_t> *>(VT_TESTNESTEDFLATBUFFER);\n  }\n  ::flatbuffers::Vector<uint8_t> *mutable_testnestedflatbuffer() {\n    return GetPointer<::flatbuffers::Vector<uint8_t> *>(VT_TESTNESTEDFLATBUFFER);\n  }\n  const MyGame::Example::Monster *testnestedflatbuffer_nested_root() const {\n    const auto _f = testnestedflatbuffer();\n    return _f ? ::flatbuffers::GetRoot<MyGame::Example::Monster>(_f->Data())\n              : nullptr;\n  }\n  const MyGame::Example::Stat *testempty() const {\n    return GetPointer<const MyGame::Example::Stat *>(VT_TESTEMPTY);\n  }\n  MyGame::Example::Stat *mutable_testempty() {\n    return GetPointer<MyGame::Example::Stat *>(VT_TESTEMPTY);\n  }\n  bool testbool() const {\n    return GetField<uint8_t>(VT_TESTBOOL, 0) != 0;\n  }\n  bool mutate_testbool(bool _testbool = 0) {\n    return SetField<uint8_t>(VT_TESTBOOL, static_cast<uint8_t>(_testbool), 0);\n  }\n  int32_t testhashs32_fnv1() const {\n    return GetField<int32_t>(VT_TESTHASHS32_FNV1, 0);\n  }\n  bool mutate_testhashs32_fnv1(int32_t _testhashs32_fnv1 = 0) {\n    return SetField<int32_t>(VT_TESTHASHS32_FNV1, _testhashs32_fnv1, 0);\n  }\n  uint32_t testhashu32_fnv1() const {\n    return GetField<uint32_t>(VT_TESTHASHU32_FNV1, 0);\n  }\n  bool mutate_testhashu32_fnv1(uint32_t _testhashu32_fnv1 = 0) {\n    return SetField<uint32_t>(VT_TESTHASHU32_FNV1, _testhashu32_fnv1, 0);\n  }\n  int64_t testhashs64_fnv1() const {\n    return GetField<int64_t>(VT_TESTHASHS64_FNV1, 0);\n  }\n  bool mutate_testhashs64_fnv1(int64_t _testhashs64_fnv1 = 0) {\n    return SetField<int64_t>(VT_TESTHASHS64_FNV1, _testhashs64_fnv1, 0);\n  }\n  uint64_t testhashu64_fnv1() const {\n    return GetField<uint64_t>(VT_TESTHASHU64_FNV1, 0);\n  }\n  bool mutate_testhashu64_fnv1(uint64_t _testhashu64_fnv1 = 0) {\n    return SetField<uint64_t>(VT_TESTHASHU64_FNV1, _testhashu64_fnv1, 0);\n  }\n  int32_t testhashs32_fnv1a() const {\n    return GetField<int32_t>(VT_TESTHASHS32_FNV1A, 0);\n  }\n  bool mutate_testhashs32_fnv1a(int32_t _testhashs32_fnv1a = 0) {\n    return SetField<int32_t>(VT_TESTHASHS32_FNV1A, _testhashs32_fnv1a, 0);\n  }\n  uint32_t testhashu32_fnv1a() const {\n    return GetField<uint32_t>(VT_TESTHASHU32_FNV1A, 0);\n  }\n  bool mutate_testhashu32_fnv1a(uint32_t _testhashu32_fnv1a = 0) {\n    return SetField<uint32_t>(VT_TESTHASHU32_FNV1A, _testhashu32_fnv1a, 0);\n  }\n  int64_t testhashs64_fnv1a() const {\n    return GetField<int64_t>(VT_TESTHASHS64_FNV1A, 0);\n  }\n  bool mutate_testhashs64_fnv1a(int64_t _testhashs64_fnv1a = 0) {\n    return SetField<int64_t>(VT_TESTHASHS64_FNV1A, _testhashs64_fnv1a, 0);\n  }\n  uint64_t testhashu64_fnv1a() const {\n    return GetField<uint64_t>(VT_TESTHASHU64_FNV1A, 0);\n  }\n  bool mutate_testhashu64_fnv1a(uint64_t _testhashu64_fnv1a = 0) {\n    return SetField<uint64_t>(VT_TESTHASHU64_FNV1A, _testhashu64_fnv1a, 0);\n  }\n  const ::flatbuffers::Vector<uint8_t> *testarrayofbools() const {\n    return GetPointer<const ::flatbuffers::Vector<uint8_t> *>(VT_TESTARRAYOFBOOLS);\n  }\n  ::flatbuffers::Vector<uint8_t> *mutable_testarrayofbools() {\n    return GetPointer<::flatbuffers::Vector<uint8_t> *>(VT_TESTARRAYOFBOOLS);\n  }\n  float testf() const {\n    return GetField<float>(VT_TESTF, 3.14159f);\n  }\n  bool mutate_testf(float _testf = 3.14159f) {\n    return SetField<float>(VT_TESTF, _testf, 3.14159f);\n  }\n  float testf2() const {\n    return GetField<float>(VT_TESTF2, 3.0f);\n  }\n  bool mutate_testf2(float _testf2 = 3.0f) {\n    return SetField<float>(VT_TESTF2, _testf2, 3.0f);\n  }\n  float testf3() const {\n    return GetField<float>(VT_TESTF3, 0.0f);\n  }\n  bool mutate_testf3(float _testf3 = 0.0f) {\n    return SetField<float>(VT_TESTF3, _testf3, 0.0f);\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *testarrayofstring2() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_TESTARRAYOFSTRING2);\n  }\n  ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *mutable_testarrayofstring2() {\n    return GetPointer<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_TESTARRAYOFSTRING2);\n  }\n  const ::flatbuffers::Vector<const MyGame::Example::Ability *> *testarrayofsortedstruct() const {\n    return GetPointer<const ::flatbuffers::Vector<const MyGame::Example::Ability *> *>(VT_TESTARRAYOFSORTEDSTRUCT);\n  }\n  ::flatbuffers::Vector<const MyGame::Example::Ability *> *mutable_testarrayofsortedstruct() {\n    return GetPointer<::flatbuffers::Vector<const MyGame::Example::Ability *> *>(VT_TESTARRAYOFSORTEDSTRUCT);\n  }\n  const ::flatbuffers::Vector<uint8_t> *flex() const {\n    return GetPointer<const ::flatbuffers::Vector<uint8_t> *>(VT_FLEX);\n  }\n  ::flatbuffers::Vector<uint8_t> *mutable_flex() {\n    return GetPointer<::flatbuffers::Vector<uint8_t> *>(VT_FLEX);\n  }\n  flexbuffers::Reference flex_flexbuffer_root() const {\n    const auto _f = flex();\n    return _f ? flexbuffers::GetRoot(_f->Data(), _f->size())\n              : flexbuffers::Reference();\n  }\n  const ::flatbuffers::Vector<const MyGame::Example::Test *> *test5() const {\n    return GetPointer<const ::flatbuffers::Vector<const MyGame::Example::Test *> *>(VT_TEST5);\n  }\n  ::flatbuffers::Vector<const MyGame::Example::Test *> *mutable_test5() {\n    return GetPointer<::flatbuffers::Vector<const MyGame::Example::Test *> *>(VT_TEST5);\n  }\n  const ::flatbuffers::Vector<int64_t> *vector_of_longs() const {\n    return GetPointer<const ::flatbuffers::Vector<int64_t> *>(VT_VECTOR_OF_LONGS);\n  }\n  ::flatbuffers::Vector<int64_t> *mutable_vector_of_longs() {\n    return GetPointer<::flatbuffers::Vector<int64_t> *>(VT_VECTOR_OF_LONGS);\n  }\n  const ::flatbuffers::Vector<double> *vector_of_doubles() const {\n    return GetPointer<const ::flatbuffers::Vector<double> *>(VT_VECTOR_OF_DOUBLES);\n  }\n  ::flatbuffers::Vector<double> *mutable_vector_of_doubles() {\n    return GetPointer<::flatbuffers::Vector<double> *>(VT_VECTOR_OF_DOUBLES);\n  }\n  const MyGame::InParentNamespace *parent_namespace_test() const {\n    return GetPointer<const MyGame::InParentNamespace *>(VT_PARENT_NAMESPACE_TEST);\n  }\n  MyGame::InParentNamespace *mutable_parent_namespace_test() {\n    return GetPointer<MyGame::InParentNamespace *>(VT_PARENT_NAMESPACE_TEST);\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *vector_of_referrables() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *>(VT_VECTOR_OF_REFERRABLES);\n  }\n  ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *mutable_vector_of_referrables() {\n    return GetPointer<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *>(VT_VECTOR_OF_REFERRABLES);\n  }\n  uint64_t single_weak_reference() const {\n    return GetField<uint64_t>(VT_SINGLE_WEAK_REFERENCE, 0);\n  }\n  bool mutate_single_weak_reference(uint64_t _single_weak_reference = 0) {\n    return SetField<uint64_t>(VT_SINGLE_WEAK_REFERENCE, _single_weak_reference, 0);\n  }\n  const ::flatbuffers::Vector<uint64_t> *vector_of_weak_references() const {\n    return GetPointer<const ::flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_WEAK_REFERENCES);\n  }\n  ::flatbuffers::Vector<uint64_t> *mutable_vector_of_weak_references() {\n    return GetPointer<::flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_WEAK_REFERENCES);\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *vector_of_strong_referrables() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *>(VT_VECTOR_OF_STRONG_REFERRABLES);\n  }\n  ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *mutable_vector_of_strong_referrables() {\n    return GetPointer<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *>(VT_VECTOR_OF_STRONG_REFERRABLES);\n  }\n  uint64_t co_owning_reference() const {\n    return GetField<uint64_t>(VT_CO_OWNING_REFERENCE, 0);\n  }\n  bool mutate_co_owning_reference(uint64_t _co_owning_reference = 0) {\n    return SetField<uint64_t>(VT_CO_OWNING_REFERENCE, _co_owning_reference, 0);\n  }\n  const ::flatbuffers::Vector<uint64_t> *vector_of_co_owning_references() const {\n    return GetPointer<const ::flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_CO_OWNING_REFERENCES);\n  }\n  ::flatbuffers::Vector<uint64_t> *mutable_vector_of_co_owning_references() {\n    return GetPointer<::flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_CO_OWNING_REFERENCES);\n  }\n  uint64_t non_owning_reference() const {\n    return GetField<uint64_t>(VT_NON_OWNING_REFERENCE, 0);\n  }\n  bool mutate_non_owning_reference(uint64_t _non_owning_reference = 0) {\n    return SetField<uint64_t>(VT_NON_OWNING_REFERENCE, _non_owning_reference, 0);\n  }\n  const ::flatbuffers::Vector<uint64_t> *vector_of_non_owning_references() const {\n    return GetPointer<const ::flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_NON_OWNING_REFERENCES);\n  }\n  ::flatbuffers::Vector<uint64_t> *mutable_vector_of_non_owning_references() {\n    return GetPointer<::flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_NON_OWNING_REFERENCES);\n  }\n  MyGame::Example::AnyUniqueAliases any_unique_type() const {\n    return static_cast<MyGame::Example::AnyUniqueAliases>(GetField<uint8_t>(VT_ANY_UNIQUE_TYPE, 0));\n  }\n  const void *any_unique() const {\n    return GetPointer<const void *>(VT_ANY_UNIQUE);\n  }\n  template<typename T> const T *any_unique_as() const;\n  const MyGame::Example::Monster *any_unique_as_M() const {\n    return any_unique_type() == MyGame::Example::AnyUniqueAliases_M ? static_cast<const MyGame::Example::Monster *>(any_unique()) : nullptr;\n  }\n  const MyGame::Example::TestSimpleTableWithEnum *any_unique_as_TS() const {\n    return any_unique_type() == MyGame::Example::AnyUniqueAliases_TS ? static_cast<const MyGame::Example::TestSimpleTableWithEnum *>(any_unique()) : nullptr;\n  }\n  const MyGame::Example2::Monster *any_unique_as_M2() const {\n    return any_unique_type() == MyGame::Example::AnyUniqueAliases_M2 ? static_cast<const MyGame::Example2::Monster *>(any_unique()) : nullptr;\n  }\n  template<typename T> T *mutable_any_unique_as();\n  MyGame::Example::Monster *mutable_any_unique_as_M() {\n    return any_unique_type() == MyGame::Example::AnyUniqueAliases_M ? static_cast<MyGame::Example::Monster *>(mutable_any_unique()) : nullptr;\n  }\n  MyGame::Example::TestSimpleTableWithEnum *mutable_any_unique_as_TS() {\n    return any_unique_type() == MyGame::Example::AnyUniqueAliases_TS ? static_cast<MyGame::Example::TestSimpleTableWithEnum *>(mutable_any_unique()) : nullptr;\n  }\n  MyGame::Example2::Monster *mutable_any_unique_as_M2() {\n    return any_unique_type() == MyGame::Example::AnyUniqueAliases_M2 ? static_cast<MyGame::Example2::Monster *>(mutable_any_unique()) : nullptr;\n  }\n  void *mutable_any_unique() {\n    return GetPointer<void *>(VT_ANY_UNIQUE);\n  }\n  MyGame::Example::AnyAmbiguousAliases any_ambiguous_type() const {\n    return static_cast<MyGame::Example::AnyAmbiguousAliases>(GetField<uint8_t>(VT_ANY_AMBIGUOUS_TYPE, 0));\n  }\n  const void *any_ambiguous() const {\n    return GetPointer<const void *>(VT_ANY_AMBIGUOUS);\n  }\n  const MyGame::Example::Monster *any_ambiguous_as_M1() const {\n    return any_ambiguous_type() == MyGame::Example::AnyAmbiguousAliases_M1 ? static_cast<const MyGame::Example::Monster *>(any_ambiguous()) : nullptr;\n  }\n  const MyGame::Example::Monster *any_ambiguous_as_M2() const {\n    return any_ambiguous_type() == MyGame::Example::AnyAmbiguousAliases_M2 ? static_cast<const MyGame::Example::Monster *>(any_ambiguous()) : nullptr;\n  }\n  const MyGame::Example::Monster *any_ambiguous_as_M3() const {\n    return any_ambiguous_type() == MyGame::Example::AnyAmbiguousAliases_M3 ? static_cast<const MyGame::Example::Monster *>(any_ambiguous()) : nullptr;\n  }\n  MyGame::Example::Monster *mutable_any_ambiguous_as_M1() {\n    return any_ambiguous_type() == MyGame::Example::AnyAmbiguousAliases_M1 ? static_cast<MyGame::Example::Monster *>(mutable_any_ambiguous()) : nullptr;\n  }\n  MyGame::Example::Monster *mutable_any_ambiguous_as_M2() {\n    return any_ambiguous_type() == MyGame::Example::AnyAmbiguousAliases_M2 ? static_cast<MyGame::Example::Monster *>(mutable_any_ambiguous()) : nullptr;\n  }\n  MyGame::Example::Monster *mutable_any_ambiguous_as_M3() {\n    return any_ambiguous_type() == MyGame::Example::AnyAmbiguousAliases_M3 ? static_cast<MyGame::Example::Monster *>(mutable_any_ambiguous()) : nullptr;\n  }\n  void *mutable_any_ambiguous() {\n    return GetPointer<void *>(VT_ANY_AMBIGUOUS);\n  }\n  const ::flatbuffers::Vector<uint8_t> *vector_of_enums() const {\n    return GetPointer<const ::flatbuffers::Vector<uint8_t> *>(VT_VECTOR_OF_ENUMS);\n  }\n  ::flatbuffers::Vector<uint8_t> *mutable_vector_of_enums() {\n    return GetPointer<::flatbuffers::Vector<uint8_t> *>(VT_VECTOR_OF_ENUMS);\n  }\n  MyGame::Example::Race signed_enum() const {\n    return static_cast<MyGame::Example::Race>(GetField<int8_t>(VT_SIGNED_ENUM, -1));\n  }\n  bool mutate_signed_enum(MyGame::Example::Race _signed_enum = static_cast<MyGame::Example::Race>(-1)) {\n    return SetField<int8_t>(VT_SIGNED_ENUM, static_cast<int8_t>(_signed_enum), -1);\n  }\n  const ::flatbuffers::Vector<uint8_t> *testrequirednestedflatbuffer() const {\n    return GetPointer<const ::flatbuffers::Vector<uint8_t> *>(VT_TESTREQUIREDNESTEDFLATBUFFER);\n  }\n  ::flatbuffers::Vector<uint8_t> *mutable_testrequirednestedflatbuffer() {\n    return GetPointer<::flatbuffers::Vector<uint8_t> *>(VT_TESTREQUIREDNESTEDFLATBUFFER);\n  }\n  const MyGame::Example::Monster *testrequirednestedflatbuffer_nested_root() const {\n    const auto _f = testrequirednestedflatbuffer();\n    return _f ? ::flatbuffers::GetRoot<MyGame::Example::Monster>(_f->Data())\n              : nullptr;\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Stat>> *scalar_key_sorted_tables() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Stat>> *>(VT_SCALAR_KEY_SORTED_TABLES);\n  }\n  ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Stat>> *mutable_scalar_key_sorted_tables() {\n    return GetPointer<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Stat>> *>(VT_SCALAR_KEY_SORTED_TABLES);\n  }\n  const MyGame::Example::Test *native_inline() const {\n    return GetStruct<const MyGame::Example::Test *>(VT_NATIVE_INLINE);\n  }\n  MyGame::Example::Test *mutable_native_inline() {\n    return GetStruct<MyGame::Example::Test *>(VT_NATIVE_INLINE);\n  }\n  MyGame::Example::LongEnum long_enum_non_enum_default() const {\n    return static_cast<MyGame::Example::LongEnum>(GetField<uint64_t>(VT_LONG_ENUM_NON_ENUM_DEFAULT, 0));\n  }\n  bool mutate_long_enum_non_enum_default(MyGame::Example::LongEnum _long_enum_non_enum_default = static_cast<MyGame::Example::LongEnum>(0)) {\n    return SetField<uint64_t>(VT_LONG_ENUM_NON_ENUM_DEFAULT, static_cast<uint64_t>(_long_enum_non_enum_default), 0);\n  }\n  MyGame::Example::LongEnum long_enum_normal_default() const {\n    return static_cast<MyGame::Example::LongEnum>(GetField<uint64_t>(VT_LONG_ENUM_NORMAL_DEFAULT, 2ULL));\n  }\n  bool mutate_long_enum_normal_default(MyGame::Example::LongEnum _long_enum_normal_default = static_cast<MyGame::Example::LongEnum>(2ULL)) {\n    return SetField<uint64_t>(VT_LONG_ENUM_NORMAL_DEFAULT, static_cast<uint64_t>(_long_enum_normal_default), 2ULL);\n  }\n  float nan_default() const {\n    return GetField<float>(VT_NAN_DEFAULT, std::numeric_limits<float>::quiet_NaN());\n  }\n  bool mutate_nan_default(float _nan_default = std::numeric_limits<float>::quiet_NaN()) {\n    return SetField<float>(VT_NAN_DEFAULT, _nan_default, std::numeric_limits<float>::quiet_NaN());\n  }\n  float inf_default() const {\n    return GetField<float>(VT_INF_DEFAULT, std::numeric_limits<float>::infinity());\n  }\n  bool mutate_inf_default(float _inf_default = std::numeric_limits<float>::infinity()) {\n    return SetField<float>(VT_INF_DEFAULT, _inf_default, std::numeric_limits<float>::infinity());\n  }\n  float positive_inf_default() const {\n    return GetField<float>(VT_POSITIVE_INF_DEFAULT, std::numeric_limits<float>::infinity());\n  }\n  bool mutate_positive_inf_default(float _positive_inf_default = std::numeric_limits<float>::infinity()) {\n    return SetField<float>(VT_POSITIVE_INF_DEFAULT, _positive_inf_default, std::numeric_limits<float>::infinity());\n  }\n  float infinity_default() const {\n    return GetField<float>(VT_INFINITY_DEFAULT, std::numeric_limits<float>::infinity());\n  }\n  bool mutate_infinity_default(float _infinity_default = std::numeric_limits<float>::infinity()) {\n    return SetField<float>(VT_INFINITY_DEFAULT, _infinity_default, std::numeric_limits<float>::infinity());\n  }\n  float positive_infinity_default() const {\n    return GetField<float>(VT_POSITIVE_INFINITY_DEFAULT, std::numeric_limits<float>::infinity());\n  }\n  bool mutate_positive_infinity_default(float _positive_infinity_default = std::numeric_limits<float>::infinity()) {\n    return SetField<float>(VT_POSITIVE_INFINITY_DEFAULT, _positive_infinity_default, std::numeric_limits<float>::infinity());\n  }\n  float negative_inf_default() const {\n    return GetField<float>(VT_NEGATIVE_INF_DEFAULT, -std::numeric_limits<float>::infinity());\n  }\n  bool mutate_negative_inf_default(float _negative_inf_default = -std::numeric_limits<float>::infinity()) {\n    return SetField<float>(VT_NEGATIVE_INF_DEFAULT, _negative_inf_default, -std::numeric_limits<float>::infinity());\n  }\n  float negative_infinity_default() const {\n    return GetField<float>(VT_NEGATIVE_INFINITY_DEFAULT, -std::numeric_limits<float>::infinity());\n  }\n  bool mutate_negative_infinity_default(float _negative_infinity_default = -std::numeric_limits<float>::infinity()) {\n    return SetField<float>(VT_NEGATIVE_INFINITY_DEFAULT, _negative_infinity_default, -std::numeric_limits<float>::infinity());\n  }\n  double double_inf_default() const {\n    return GetField<double>(VT_DOUBLE_INF_DEFAULT, std::numeric_limits<double>::infinity());\n  }\n  bool mutate_double_inf_default(double _double_inf_default = std::numeric_limits<double>::infinity()) {\n    return SetField<double>(VT_DOUBLE_INF_DEFAULT, _double_inf_default, std::numeric_limits<double>::infinity());\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyField<MyGame::Example::Vec3>(verifier, VT_POS, 8) &&\n           VerifyField<int16_t>(verifier, VT_MANA, 2) &&\n           VerifyField<int16_t>(verifier, VT_HP, 2) &&\n           VerifyOffsetRequired(verifier, VT_NAME) &&\n           verifier.VerifyString(name()) &&\n           VerifyOffset(verifier, VT_INVENTORY) &&\n           verifier.VerifyVector(inventory()) &&\n           VerifyField<uint8_t>(verifier, VT_COLOR, 1) &&\n           VerifyField<uint8_t>(verifier, VT_TEST_TYPE, 1) &&\n           VerifyOffset(verifier, VT_TEST) &&\n           VerifyAny(verifier, test(), test_type()) &&\n           VerifyOffset(verifier, VT_TEST4) &&\n           verifier.VerifyVector(test4()) &&\n           VerifyOffset(verifier, VT_TESTARRAYOFSTRING) &&\n           verifier.VerifyVector(testarrayofstring()) &&\n           verifier.VerifyVectorOfStrings(testarrayofstring()) &&\n           VerifyOffset(verifier, VT_TESTARRAYOFTABLES) &&\n           verifier.VerifyVector(testarrayoftables()) &&\n           verifier.VerifyVectorOfTables(testarrayoftables()) &&\n           VerifyOffset(verifier, VT_ENEMY) &&\n           verifier.VerifyTable(enemy()) &&\n           VerifyOffset(verifier, VT_TESTNESTEDFLATBUFFER) &&\n           verifier.VerifyVector(testnestedflatbuffer()) &&\n           verifier.template VerifyNestedFlatBuffer<MyGame::Example::Monster>(testnestedflatbuffer(), nullptr) &&\n           VerifyOffset(verifier, VT_TESTEMPTY) &&\n           verifier.VerifyTable(testempty()) &&\n           VerifyField<uint8_t>(verifier, VT_TESTBOOL, 1) &&\n           VerifyField<int32_t>(verifier, VT_TESTHASHS32_FNV1, 4) &&\n           VerifyField<uint32_t>(verifier, VT_TESTHASHU32_FNV1, 4) &&\n           VerifyField<int64_t>(verifier, VT_TESTHASHS64_FNV1, 8) &&\n           VerifyField<uint64_t>(verifier, VT_TESTHASHU64_FNV1, 8) &&\n           VerifyField<int32_t>(verifier, VT_TESTHASHS32_FNV1A, 4) &&\n           VerifyField<uint32_t>(verifier, VT_TESTHASHU32_FNV1A, 4) &&\n           VerifyField<int64_t>(verifier, VT_TESTHASHS64_FNV1A, 8) &&\n           VerifyField<uint64_t>(verifier, VT_TESTHASHU64_FNV1A, 8) &&\n           VerifyOffset(verifier, VT_TESTARRAYOFBOOLS) &&\n           verifier.VerifyVector(testarrayofbools()) &&\n           VerifyField<float>(verifier, VT_TESTF, 4) &&\n           VerifyField<float>(verifier, VT_TESTF2, 4) &&\n           VerifyField<float>(verifier, VT_TESTF3, 4) &&\n           VerifyOffset(verifier, VT_TESTARRAYOFSTRING2) &&\n           verifier.VerifyVector(testarrayofstring2()) &&\n           verifier.VerifyVectorOfStrings(testarrayofstring2()) &&\n           VerifyOffset(verifier, VT_TESTARRAYOFSORTEDSTRUCT) &&\n           verifier.VerifyVector(testarrayofsortedstruct()) &&\n           VerifyOffset(verifier, VT_FLEX) &&\n           verifier.VerifyVector(flex()) &&\n           flexbuffers::VerifyNestedFlexBuffer(flex(), verifier) &&\n           VerifyOffset(verifier, VT_TEST5) &&\n           verifier.VerifyVector(test5()) &&\n           VerifyOffset(verifier, VT_VECTOR_OF_LONGS) &&\n           verifier.VerifyVector(vector_of_longs()) &&\n           VerifyOffset(verifier, VT_VECTOR_OF_DOUBLES) &&\n           verifier.VerifyVector(vector_of_doubles()) &&\n           VerifyOffset(verifier, VT_PARENT_NAMESPACE_TEST) &&\n           verifier.VerifyTable(parent_namespace_test()) &&\n           VerifyOffset(verifier, VT_VECTOR_OF_REFERRABLES) &&\n           verifier.VerifyVector(vector_of_referrables()) &&\n           verifier.VerifyVectorOfTables(vector_of_referrables()) &&\n           VerifyField<uint64_t>(verifier, VT_SINGLE_WEAK_REFERENCE, 8) &&\n           VerifyOffset(verifier, VT_VECTOR_OF_WEAK_REFERENCES) &&\n           verifier.VerifyVector(vector_of_weak_references()) &&\n           VerifyOffset(verifier, VT_VECTOR_OF_STRONG_REFERRABLES) &&\n           verifier.VerifyVector(vector_of_strong_referrables()) &&\n           verifier.VerifyVectorOfTables(vector_of_strong_referrables()) &&\n           VerifyField<uint64_t>(verifier, VT_CO_OWNING_REFERENCE, 8) &&\n           VerifyOffset(verifier, VT_VECTOR_OF_CO_OWNING_REFERENCES) &&\n           verifier.VerifyVector(vector_of_co_owning_references()) &&\n           VerifyField<uint64_t>(verifier, VT_NON_OWNING_REFERENCE, 8) &&\n           VerifyOffset(verifier, VT_VECTOR_OF_NON_OWNING_REFERENCES) &&\n           verifier.VerifyVector(vector_of_non_owning_references()) &&\n           VerifyField<uint8_t>(verifier, VT_ANY_UNIQUE_TYPE, 1) &&\n           VerifyOffset(verifier, VT_ANY_UNIQUE) &&\n           VerifyAnyUniqueAliases(verifier, any_unique(), any_unique_type()) &&\n           VerifyField<uint8_t>(verifier, VT_ANY_AMBIGUOUS_TYPE, 1) &&\n           VerifyOffset(verifier, VT_ANY_AMBIGUOUS) &&\n           VerifyAnyAmbiguousAliases(verifier, any_ambiguous(), any_ambiguous_type()) &&\n           VerifyOffset(verifier, VT_VECTOR_OF_ENUMS) &&\n           verifier.VerifyVector(vector_of_enums()) &&\n           VerifyField<int8_t>(verifier, VT_SIGNED_ENUM, 1) &&\n           VerifyOffset(verifier, VT_TESTREQUIREDNESTEDFLATBUFFER) &&\n           verifier.VerifyVector(testrequirednestedflatbuffer()) &&\n           verifier.template VerifyNestedFlatBuffer<MyGame::Example::Monster>(testrequirednestedflatbuffer(), nullptr) &&\n           VerifyOffset(verifier, VT_SCALAR_KEY_SORTED_TABLES) &&\n           verifier.VerifyVector(scalar_key_sorted_tables()) &&\n           verifier.VerifyVectorOfTables(scalar_key_sorted_tables()) &&\n           VerifyField<MyGame::Example::Test>(verifier, VT_NATIVE_INLINE, 2) &&\n           VerifyField<uint64_t>(verifier, VT_LONG_ENUM_NON_ENUM_DEFAULT, 8) &&\n           VerifyField<uint64_t>(verifier, VT_LONG_ENUM_NORMAL_DEFAULT, 8) &&\n           VerifyField<float>(verifier, VT_NAN_DEFAULT, 4) &&\n           VerifyField<float>(verifier, VT_INF_DEFAULT, 4) &&\n           VerifyField<float>(verifier, VT_POSITIVE_INF_DEFAULT, 4) &&\n           VerifyField<float>(verifier, VT_INFINITY_DEFAULT, 4) &&\n           VerifyField<float>(verifier, VT_POSITIVE_INFINITY_DEFAULT, 4) &&\n           VerifyField<float>(verifier, VT_NEGATIVE_INF_DEFAULT, 4) &&\n           VerifyField<float>(verifier, VT_NEGATIVE_INFINITY_DEFAULT, 4) &&\n           VerifyField<double>(verifier, VT_DOUBLE_INF_DEFAULT, 8) &&\n           verifier.EndTable();\n  }\n  MonsterT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  void UnPackTo(MonsterT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  static ::flatbuffers::Offset<Monster> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n};\n\ntemplate<> inline const MyGame::Example::Monster *Monster::test_as<MyGame::Example::Monster>() const {\n  return test_as_Monster();\n}\n\ntemplate<> inline MyGame::Example::Monster *Monster::mutable_test_as<MyGame::Example::Monster>() {\n  return mutable_test_as_Monster();\n}\n\ntemplate<> inline const MyGame::Example::TestSimpleTableWithEnum *Monster::test_as<MyGame::Example::TestSimpleTableWithEnum>() const {\n  return test_as_TestSimpleTableWithEnum();\n}\n\ntemplate<> inline MyGame::Example::TestSimpleTableWithEnum *Monster::mutable_test_as<MyGame::Example::TestSimpleTableWithEnum>() {\n  return mutable_test_as_TestSimpleTableWithEnum();\n}\n\ntemplate<> inline const MyGame::Example2::Monster *Monster::test_as<MyGame::Example2::Monster>() const {\n  return test_as_MyGame_Example2_Monster();\n}\n\ntemplate<> inline MyGame::Example2::Monster *Monster::mutable_test_as<MyGame::Example2::Monster>() {\n  return mutable_test_as_MyGame_Example2_Monster();\n}\n\ntemplate<> inline const MyGame::Example::Monster *Monster::any_unique_as<MyGame::Example::Monster>() const {\n  return any_unique_as_M();\n}\n\ntemplate<> inline MyGame::Example::Monster *Monster::mutable_any_unique_as<MyGame::Example::Monster>() {\n  return mutable_any_unique_as_M();\n}\n\ntemplate<> inline const MyGame::Example::TestSimpleTableWithEnum *Monster::any_unique_as<MyGame::Example::TestSimpleTableWithEnum>() const {\n  return any_unique_as_TS();\n}\n\ntemplate<> inline MyGame::Example::TestSimpleTableWithEnum *Monster::mutable_any_unique_as<MyGame::Example::TestSimpleTableWithEnum>() {\n  return mutable_any_unique_as_TS();\n}\n\ntemplate<> inline const MyGame::Example2::Monster *Monster::any_unique_as<MyGame::Example2::Monster>() const {\n  return any_unique_as_M2();\n}\n\ntemplate<> inline MyGame::Example2::Monster *Monster::mutable_any_unique_as<MyGame::Example2::Monster>() {\n  return mutable_any_unique_as_M2();\n}\n\nstruct MonsterBuilder {\n  typedef Monster Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_pos(const MyGame::Example::Vec3 *pos) {\n    fbb_.AddStruct(Monster::VT_POS, pos);\n  }\n  void add_mana(int16_t mana) {\n    fbb_.AddElement<int16_t>(Monster::VT_MANA, mana, 150);\n  }\n  void add_hp(int16_t hp) {\n    fbb_.AddElement<int16_t>(Monster::VT_HP, hp, 100);\n  }\n  void add_name(::flatbuffers::Offset<::flatbuffers::String> name) {\n    fbb_.AddOffset(Monster::VT_NAME, name);\n  }\n  void add_inventory(::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> inventory) {\n    fbb_.AddOffset(Monster::VT_INVENTORY, inventory);\n  }\n  void add_color(MyGame::Example::Color color) {\n    fbb_.AddElement<uint8_t>(Monster::VT_COLOR, static_cast<uint8_t>(color), 8);\n  }\n  void add_test_type(MyGame::Example::Any test_type) {\n    fbb_.AddElement<uint8_t>(Monster::VT_TEST_TYPE, static_cast<uint8_t>(test_type), 0);\n  }\n  void add_test(::flatbuffers::Offset<void> test) {\n    fbb_.AddOffset(Monster::VT_TEST, test);\n  }\n  void add_test4(::flatbuffers::Offset<::flatbuffers::Vector<const MyGame::Example::Test *>> test4) {\n    fbb_.AddOffset(Monster::VT_TEST4, test4);\n  }\n  void add_testarrayofstring(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> testarrayofstring) {\n    fbb_.AddOffset(Monster::VT_TESTARRAYOFSTRING, testarrayofstring);\n  }\n  void add_testarrayoftables(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Monster>>> testarrayoftables) {\n    fbb_.AddOffset(Monster::VT_TESTARRAYOFTABLES, testarrayoftables);\n  }\n  void add_enemy(::flatbuffers::Offset<MyGame::Example::Monster> enemy) {\n    fbb_.AddOffset(Monster::VT_ENEMY, enemy);\n  }\n  void add_testnestedflatbuffer(::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> testnestedflatbuffer) {\n    fbb_.AddOffset(Monster::VT_TESTNESTEDFLATBUFFER, testnestedflatbuffer);\n  }\n  void add_testempty(::flatbuffers::Offset<MyGame::Example::Stat> testempty) {\n    fbb_.AddOffset(Monster::VT_TESTEMPTY, testempty);\n  }\n  void add_testbool(bool testbool) {\n    fbb_.AddElement<uint8_t>(Monster::VT_TESTBOOL, static_cast<uint8_t>(testbool), 0);\n  }\n  void add_testhashs32_fnv1(int32_t testhashs32_fnv1) {\n    fbb_.AddElement<int32_t>(Monster::VT_TESTHASHS32_FNV1, testhashs32_fnv1, 0);\n  }\n  void add_testhashu32_fnv1(uint32_t testhashu32_fnv1) {\n    fbb_.AddElement<uint32_t>(Monster::VT_TESTHASHU32_FNV1, testhashu32_fnv1, 0);\n  }\n  void add_testhashs64_fnv1(int64_t testhashs64_fnv1) {\n    fbb_.AddElement<int64_t>(Monster::VT_TESTHASHS64_FNV1, testhashs64_fnv1, 0);\n  }\n  void add_testhashu64_fnv1(uint64_t testhashu64_fnv1) {\n    fbb_.AddElement<uint64_t>(Monster::VT_TESTHASHU64_FNV1, testhashu64_fnv1, 0);\n  }\n  void add_testhashs32_fnv1a(int32_t testhashs32_fnv1a) {\n    fbb_.AddElement<int32_t>(Monster::VT_TESTHASHS32_FNV1A, testhashs32_fnv1a, 0);\n  }\n  void add_testhashu32_fnv1a(uint32_t testhashu32_fnv1a) {\n    fbb_.AddElement<uint32_t>(Monster::VT_TESTHASHU32_FNV1A, testhashu32_fnv1a, 0);\n  }\n  void add_testhashs64_fnv1a(int64_t testhashs64_fnv1a) {\n    fbb_.AddElement<int64_t>(Monster::VT_TESTHASHS64_FNV1A, testhashs64_fnv1a, 0);\n  }\n  void add_testhashu64_fnv1a(uint64_t testhashu64_fnv1a) {\n    fbb_.AddElement<uint64_t>(Monster::VT_TESTHASHU64_FNV1A, testhashu64_fnv1a, 0);\n  }\n  void add_testarrayofbools(::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> testarrayofbools) {\n    fbb_.AddOffset(Monster::VT_TESTARRAYOFBOOLS, testarrayofbools);\n  }\n  void add_testf(float testf) {\n    fbb_.AddElement<float>(Monster::VT_TESTF, testf, 3.14159f);\n  }\n  void add_testf2(float testf2) {\n    fbb_.AddElement<float>(Monster::VT_TESTF2, testf2, 3.0f);\n  }\n  void add_testf3(float testf3) {\n    fbb_.AddElement<float>(Monster::VT_TESTF3, testf3, 0.0f);\n  }\n  void add_testarrayofstring2(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> testarrayofstring2) {\n    fbb_.AddOffset(Monster::VT_TESTARRAYOFSTRING2, testarrayofstring2);\n  }\n  void add_testarrayofsortedstruct(::flatbuffers::Offset<::flatbuffers::Vector<const MyGame::Example::Ability *>> testarrayofsortedstruct) {\n    fbb_.AddOffset(Monster::VT_TESTARRAYOFSORTEDSTRUCT, testarrayofsortedstruct);\n  }\n  void add_flex(::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> flex) {\n    fbb_.AddOffset(Monster::VT_FLEX, flex);\n  }\n  void add_test5(::flatbuffers::Offset<::flatbuffers::Vector<const MyGame::Example::Test *>> test5) {\n    fbb_.AddOffset(Monster::VT_TEST5, test5);\n  }\n  void add_vector_of_longs(::flatbuffers::Offset<::flatbuffers::Vector<int64_t>> vector_of_longs) {\n    fbb_.AddOffset(Monster::VT_VECTOR_OF_LONGS, vector_of_longs);\n  }\n  void add_vector_of_doubles(::flatbuffers::Offset<::flatbuffers::Vector<double>> vector_of_doubles) {\n    fbb_.AddOffset(Monster::VT_VECTOR_OF_DOUBLES, vector_of_doubles);\n  }\n  void add_parent_namespace_test(::flatbuffers::Offset<MyGame::InParentNamespace> parent_namespace_test) {\n    fbb_.AddOffset(Monster::VT_PARENT_NAMESPACE_TEST, parent_namespace_test);\n  }\n  void add_vector_of_referrables(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>>> vector_of_referrables) {\n    fbb_.AddOffset(Monster::VT_VECTOR_OF_REFERRABLES, vector_of_referrables);\n  }\n  void add_single_weak_reference(uint64_t single_weak_reference) {\n    fbb_.AddElement<uint64_t>(Monster::VT_SINGLE_WEAK_REFERENCE, single_weak_reference, 0);\n  }\n  void add_vector_of_weak_references(::flatbuffers::Offset<::flatbuffers::Vector<uint64_t>> vector_of_weak_references) {\n    fbb_.AddOffset(Monster::VT_VECTOR_OF_WEAK_REFERENCES, vector_of_weak_references);\n  }\n  void add_vector_of_strong_referrables(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>>> vector_of_strong_referrables) {\n    fbb_.AddOffset(Monster::VT_VECTOR_OF_STRONG_REFERRABLES, vector_of_strong_referrables);\n  }\n  void add_co_owning_reference(uint64_t co_owning_reference) {\n    fbb_.AddElement<uint64_t>(Monster::VT_CO_OWNING_REFERENCE, co_owning_reference, 0);\n  }\n  void add_vector_of_co_owning_references(::flatbuffers::Offset<::flatbuffers::Vector<uint64_t>> vector_of_co_owning_references) {\n    fbb_.AddOffset(Monster::VT_VECTOR_OF_CO_OWNING_REFERENCES, vector_of_co_owning_references);\n  }\n  void add_non_owning_reference(uint64_t non_owning_reference) {\n    fbb_.AddElement<uint64_t>(Monster::VT_NON_OWNING_REFERENCE, non_owning_reference, 0);\n  }\n  void add_vector_of_non_owning_references(::flatbuffers::Offset<::flatbuffers::Vector<uint64_t>> vector_of_non_owning_references) {\n    fbb_.AddOffset(Monster::VT_VECTOR_OF_NON_OWNING_REFERENCES, vector_of_non_owning_references);\n  }\n  void add_any_unique_type(MyGame::Example::AnyUniqueAliases any_unique_type) {\n    fbb_.AddElement<uint8_t>(Monster::VT_ANY_UNIQUE_TYPE, static_cast<uint8_t>(any_unique_type), 0);\n  }\n  void add_any_unique(::flatbuffers::Offset<void> any_unique) {\n    fbb_.AddOffset(Monster::VT_ANY_UNIQUE, any_unique);\n  }\n  void add_any_ambiguous_type(MyGame::Example::AnyAmbiguousAliases any_ambiguous_type) {\n    fbb_.AddElement<uint8_t>(Monster::VT_ANY_AMBIGUOUS_TYPE, static_cast<uint8_t>(any_ambiguous_type), 0);\n  }\n  void add_any_ambiguous(::flatbuffers::Offset<void> any_ambiguous) {\n    fbb_.AddOffset(Monster::VT_ANY_AMBIGUOUS, any_ambiguous);\n  }\n  void add_vector_of_enums(::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> vector_of_enums) {\n    fbb_.AddOffset(Monster::VT_VECTOR_OF_ENUMS, vector_of_enums);\n  }\n  void add_signed_enum(MyGame::Example::Race signed_enum) {\n    fbb_.AddElement<int8_t>(Monster::VT_SIGNED_ENUM, static_cast<int8_t>(signed_enum), -1);\n  }\n  void add_testrequirednestedflatbuffer(::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> testrequirednestedflatbuffer) {\n    fbb_.AddOffset(Monster::VT_TESTREQUIREDNESTEDFLATBUFFER, testrequirednestedflatbuffer);\n  }\n  void add_scalar_key_sorted_tables(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Stat>>> scalar_key_sorted_tables) {\n    fbb_.AddOffset(Monster::VT_SCALAR_KEY_SORTED_TABLES, scalar_key_sorted_tables);\n  }\n  void add_native_inline(const MyGame::Example::Test *native_inline) {\n    fbb_.AddStruct(Monster::VT_NATIVE_INLINE, native_inline);\n  }\n  void add_long_enum_non_enum_default(MyGame::Example::LongEnum long_enum_non_enum_default) {\n    fbb_.AddElement<uint64_t>(Monster::VT_LONG_ENUM_NON_ENUM_DEFAULT, static_cast<uint64_t>(long_enum_non_enum_default), 0);\n  }\n  void add_long_enum_normal_default(MyGame::Example::LongEnum long_enum_normal_default) {\n    fbb_.AddElement<uint64_t>(Monster::VT_LONG_ENUM_NORMAL_DEFAULT, static_cast<uint64_t>(long_enum_normal_default), 2ULL);\n  }\n  void add_nan_default(float nan_default) {\n    fbb_.AddElement<float>(Monster::VT_NAN_DEFAULT, nan_default, std::numeric_limits<float>::quiet_NaN());\n  }\n  void add_inf_default(float inf_default) {\n    fbb_.AddElement<float>(Monster::VT_INF_DEFAULT, inf_default, std::numeric_limits<float>::infinity());\n  }\n  void add_positive_inf_default(float positive_inf_default) {\n    fbb_.AddElement<float>(Monster::VT_POSITIVE_INF_DEFAULT, positive_inf_default, std::numeric_limits<float>::infinity());\n  }\n  void add_infinity_default(float infinity_default) {\n    fbb_.AddElement<float>(Monster::VT_INFINITY_DEFAULT, infinity_default, std::numeric_limits<float>::infinity());\n  }\n  void add_positive_infinity_default(float positive_infinity_default) {\n    fbb_.AddElement<float>(Monster::VT_POSITIVE_INFINITY_DEFAULT, positive_infinity_default, std::numeric_limits<float>::infinity());\n  }\n  void add_negative_inf_default(float negative_inf_default) {\n    fbb_.AddElement<float>(Monster::VT_NEGATIVE_INF_DEFAULT, negative_inf_default, -std::numeric_limits<float>::infinity());\n  }\n  void add_negative_infinity_default(float negative_infinity_default) {\n    fbb_.AddElement<float>(Monster::VT_NEGATIVE_INFINITY_DEFAULT, negative_infinity_default, -std::numeric_limits<float>::infinity());\n  }\n  void add_double_inf_default(double double_inf_default) {\n    fbb_.AddElement<double>(Monster::VT_DOUBLE_INF_DEFAULT, double_inf_default, std::numeric_limits<double>::infinity());\n  }\n  explicit MonsterBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<Monster> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<Monster>(end);\n    fbb_.Required(o, Monster::VT_NAME);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<Monster> CreateMonster(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    const MyGame::Example::Vec3 *pos = nullptr,\n    int16_t mana = 150,\n    int16_t hp = 100,\n    ::flatbuffers::Offset<::flatbuffers::String> name = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> inventory = 0,\n    MyGame::Example::Color color = MyGame::Example::Color_Blue,\n    MyGame::Example::Any test_type = MyGame::Example::Any_NONE,\n    ::flatbuffers::Offset<void> test = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<const MyGame::Example::Test *>> test4 = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> testarrayofstring = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Monster>>> testarrayoftables = 0,\n    ::flatbuffers::Offset<MyGame::Example::Monster> enemy = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> testnestedflatbuffer = 0,\n    ::flatbuffers::Offset<MyGame::Example::Stat> testempty = 0,\n    bool testbool = false,\n    int32_t testhashs32_fnv1 = 0,\n    uint32_t testhashu32_fnv1 = 0,\n    int64_t testhashs64_fnv1 = 0,\n    uint64_t testhashu64_fnv1 = 0,\n    int32_t testhashs32_fnv1a = 0,\n    uint32_t testhashu32_fnv1a = 0,\n    int64_t testhashs64_fnv1a = 0,\n    uint64_t testhashu64_fnv1a = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> testarrayofbools = 0,\n    float testf = 3.14159f,\n    float testf2 = 3.0f,\n    float testf3 = 0.0f,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> testarrayofstring2 = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<const MyGame::Example::Ability *>> testarrayofsortedstruct = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> flex = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<const MyGame::Example::Test *>> test5 = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<int64_t>> vector_of_longs = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<double>> vector_of_doubles = 0,\n    ::flatbuffers::Offset<MyGame::InParentNamespace> parent_namespace_test = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>>> vector_of_referrables = 0,\n    uint64_t single_weak_reference = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<uint64_t>> vector_of_weak_references = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>>> vector_of_strong_referrables = 0,\n    uint64_t co_owning_reference = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<uint64_t>> vector_of_co_owning_references = 0,\n    uint64_t non_owning_reference = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<uint64_t>> vector_of_non_owning_references = 0,\n    MyGame::Example::AnyUniqueAliases any_unique_type = MyGame::Example::AnyUniqueAliases_NONE,\n    ::flatbuffers::Offset<void> any_unique = 0,\n    MyGame::Example::AnyAmbiguousAliases any_ambiguous_type = MyGame::Example::AnyAmbiguousAliases_NONE,\n    ::flatbuffers::Offset<void> any_ambiguous = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> vector_of_enums = 0,\n    MyGame::Example::Race signed_enum = MyGame::Example::Race_None,\n    ::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> testrequirednestedflatbuffer = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Stat>>> scalar_key_sorted_tables = 0,\n    const MyGame::Example::Test *native_inline = nullptr,\n    MyGame::Example::LongEnum long_enum_non_enum_default = static_cast<MyGame::Example::LongEnum>(0),\n    MyGame::Example::LongEnum long_enum_normal_default = MyGame::Example::LongEnum_LongOne,\n    float nan_default = std::numeric_limits<float>::quiet_NaN(),\n    float inf_default = std::numeric_limits<float>::infinity(),\n    float positive_inf_default = std::numeric_limits<float>::infinity(),\n    float infinity_default = std::numeric_limits<float>::infinity(),\n    float positive_infinity_default = std::numeric_limits<float>::infinity(),\n    float negative_inf_default = -std::numeric_limits<float>::infinity(),\n    float negative_infinity_default = -std::numeric_limits<float>::infinity(),\n    double double_inf_default = std::numeric_limits<double>::infinity()) {\n  MonsterBuilder builder_(_fbb);\n  builder_.add_double_inf_default(double_inf_default);\n  builder_.add_long_enum_normal_default(long_enum_normal_default);\n  builder_.add_long_enum_non_enum_default(long_enum_non_enum_default);\n  builder_.add_non_owning_reference(non_owning_reference);\n  builder_.add_co_owning_reference(co_owning_reference);\n  builder_.add_single_weak_reference(single_weak_reference);\n  builder_.add_testhashu64_fnv1a(testhashu64_fnv1a);\n  builder_.add_testhashs64_fnv1a(testhashs64_fnv1a);\n  builder_.add_testhashu64_fnv1(testhashu64_fnv1);\n  builder_.add_testhashs64_fnv1(testhashs64_fnv1);\n  builder_.add_negative_infinity_default(negative_infinity_default);\n  builder_.add_negative_inf_default(negative_inf_default);\n  builder_.add_positive_infinity_default(positive_infinity_default);\n  builder_.add_infinity_default(infinity_default);\n  builder_.add_positive_inf_default(positive_inf_default);\n  builder_.add_inf_default(inf_default);\n  builder_.add_nan_default(nan_default);\n  builder_.add_native_inline(native_inline);\n  builder_.add_scalar_key_sorted_tables(scalar_key_sorted_tables);\n  builder_.add_testrequirednestedflatbuffer(testrequirednestedflatbuffer);\n  builder_.add_vector_of_enums(vector_of_enums);\n  builder_.add_any_ambiguous(any_ambiguous);\n  builder_.add_any_unique(any_unique);\n  builder_.add_vector_of_non_owning_references(vector_of_non_owning_references);\n  builder_.add_vector_of_co_owning_references(vector_of_co_owning_references);\n  builder_.add_vector_of_strong_referrables(vector_of_strong_referrables);\n  builder_.add_vector_of_weak_references(vector_of_weak_references);\n  builder_.add_vector_of_referrables(vector_of_referrables);\n  builder_.add_parent_namespace_test(parent_namespace_test);\n  builder_.add_vector_of_doubles(vector_of_doubles);\n  builder_.add_vector_of_longs(vector_of_longs);\n  builder_.add_test5(test5);\n  builder_.add_flex(flex);\n  builder_.add_testarrayofsortedstruct(testarrayofsortedstruct);\n  builder_.add_testarrayofstring2(testarrayofstring2);\n  builder_.add_testf3(testf3);\n  builder_.add_testf2(testf2);\n  builder_.add_testf(testf);\n  builder_.add_testarrayofbools(testarrayofbools);\n  builder_.add_testhashu32_fnv1a(testhashu32_fnv1a);\n  builder_.add_testhashs32_fnv1a(testhashs32_fnv1a);\n  builder_.add_testhashu32_fnv1(testhashu32_fnv1);\n  builder_.add_testhashs32_fnv1(testhashs32_fnv1);\n  builder_.add_testempty(testempty);\n  builder_.add_testnestedflatbuffer(testnestedflatbuffer);\n  builder_.add_enemy(enemy);\n  builder_.add_testarrayoftables(testarrayoftables);\n  builder_.add_testarrayofstring(testarrayofstring);\n  builder_.add_test4(test4);\n  builder_.add_test(test);\n  builder_.add_inventory(inventory);\n  builder_.add_name(name);\n  builder_.add_pos(pos);\n  builder_.add_hp(hp);\n  builder_.add_mana(mana);\n  builder_.add_signed_enum(signed_enum);\n  builder_.add_any_ambiguous_type(any_ambiguous_type);\n  builder_.add_any_unique_type(any_unique_type);\n  builder_.add_testbool(testbool);\n  builder_.add_test_type(test_type);\n  builder_.add_color(color);\n  return builder_.Finish();\n}\n\ninline ::flatbuffers::Offset<Monster> CreateMonsterDirect(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    const MyGame::Example::Vec3 *pos = nullptr,\n    int16_t mana = 150,\n    int16_t hp = 100,\n    const char *name = nullptr,\n    const std::vector<uint8_t> *inventory = nullptr,\n    MyGame::Example::Color color = MyGame::Example::Color_Blue,\n    MyGame::Example::Any test_type = MyGame::Example::Any_NONE,\n    ::flatbuffers::Offset<void> test = 0,\n    const std::vector<MyGame::Example::Test> *test4 = nullptr,\n    const std::vector<::flatbuffers::Offset<::flatbuffers::String>> *testarrayofstring = nullptr,\n    std::vector<::flatbuffers::Offset<MyGame::Example::Monster>> *testarrayoftables = nullptr,\n    ::flatbuffers::Offset<MyGame::Example::Monster> enemy = 0,\n    const std::vector<uint8_t> *testnestedflatbuffer = nullptr,\n    ::flatbuffers::Offset<MyGame::Example::Stat> testempty = 0,\n    bool testbool = false,\n    int32_t testhashs32_fnv1 = 0,\n    uint32_t testhashu32_fnv1 = 0,\n    int64_t testhashs64_fnv1 = 0,\n    uint64_t testhashu64_fnv1 = 0,\n    int32_t testhashs32_fnv1a = 0,\n    uint32_t testhashu32_fnv1a = 0,\n    int64_t testhashs64_fnv1a = 0,\n    uint64_t testhashu64_fnv1a = 0,\n    const std::vector<uint8_t> *testarrayofbools = nullptr,\n    float testf = 3.14159f,\n    float testf2 = 3.0f,\n    float testf3 = 0.0f,\n    const std::vector<::flatbuffers::Offset<::flatbuffers::String>> *testarrayofstring2 = nullptr,\n    std::vector<MyGame::Example::Ability> *testarrayofsortedstruct = nullptr,\n    const std::vector<uint8_t> *flex = nullptr,\n    const std::vector<MyGame::Example::Test> *test5 = nullptr,\n    const std::vector<int64_t> *vector_of_longs = nullptr,\n    const std::vector<double> *vector_of_doubles = nullptr,\n    ::flatbuffers::Offset<MyGame::InParentNamespace> parent_namespace_test = 0,\n    std::vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *vector_of_referrables = nullptr,\n    uint64_t single_weak_reference = 0,\n    const std::vector<uint64_t> *vector_of_weak_references = nullptr,\n    std::vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *vector_of_strong_referrables = nullptr,\n    uint64_t co_owning_reference = 0,\n    const std::vector<uint64_t> *vector_of_co_owning_references = nullptr,\n    uint64_t non_owning_reference = 0,\n    const std::vector<uint64_t> *vector_of_non_owning_references = nullptr,\n    MyGame::Example::AnyUniqueAliases any_unique_type = MyGame::Example::AnyUniqueAliases_NONE,\n    ::flatbuffers::Offset<void> any_unique = 0,\n    MyGame::Example::AnyAmbiguousAliases any_ambiguous_type = MyGame::Example::AnyAmbiguousAliases_NONE,\n    ::flatbuffers::Offset<void> any_ambiguous = 0,\n    const std::vector<uint8_t> *vector_of_enums = nullptr,\n    MyGame::Example::Race signed_enum = MyGame::Example::Race_None,\n    const std::vector<uint8_t> *testrequirednestedflatbuffer = nullptr,\n    std::vector<::flatbuffers::Offset<MyGame::Example::Stat>> *scalar_key_sorted_tables = nullptr,\n    const MyGame::Example::Test *native_inline = nullptr,\n    MyGame::Example::LongEnum long_enum_non_enum_default = static_cast<MyGame::Example::LongEnum>(0),\n    MyGame::Example::LongEnum long_enum_normal_default = MyGame::Example::LongEnum_LongOne,\n    float nan_default = std::numeric_limits<float>::quiet_NaN(),\n    float inf_default = std::numeric_limits<float>::infinity(),\n    float positive_inf_default = std::numeric_limits<float>::infinity(),\n    float infinity_default = std::numeric_limits<float>::infinity(),\n    float positive_infinity_default = std::numeric_limits<float>::infinity(),\n    float negative_inf_default = -std::numeric_limits<float>::infinity(),\n    float negative_infinity_default = -std::numeric_limits<float>::infinity(),\n    double double_inf_default = std::numeric_limits<double>::infinity()) {\n  auto name__ = name ? _fbb.CreateString(name) : 0;\n  auto inventory__ = inventory ? _fbb.CreateVector<uint8_t>(*inventory) : 0;\n  auto test4__ = test4 ? _fbb.CreateVectorOfStructs<MyGame::Example::Test>(*test4) : 0;\n  auto testarrayofstring__ = testarrayofstring ? _fbb.CreateVector<::flatbuffers::Offset<::flatbuffers::String>>(*testarrayofstring) : 0;\n  auto testarrayoftables__ = testarrayoftables ? _fbb.CreateVectorOfSortedTables<MyGame::Example::Monster>(testarrayoftables) : 0;\n  auto testnestedflatbuffer__ = testnestedflatbuffer ? _fbb.CreateVector<uint8_t>(*testnestedflatbuffer) : 0;\n  auto testarrayofbools__ = testarrayofbools ? _fbb.CreateVector<uint8_t>(*testarrayofbools) : 0;\n  auto testarrayofstring2__ = testarrayofstring2 ? _fbb.CreateVector<::flatbuffers::Offset<::flatbuffers::String>>(*testarrayofstring2) : 0;\n  auto testarrayofsortedstruct__ = testarrayofsortedstruct ? _fbb.CreateVectorOfSortedStructs<MyGame::Example::Ability>(testarrayofsortedstruct) : 0;\n  auto flex__ = flex ? _fbb.CreateVector<uint8_t>(*flex) : 0;\n  auto test5__ = test5 ? _fbb.CreateVectorOfStructs<MyGame::Example::Test>(*test5) : 0;\n  auto vector_of_longs__ = vector_of_longs ? _fbb.CreateVector<int64_t>(*vector_of_longs) : 0;\n  auto vector_of_doubles__ = vector_of_doubles ? _fbb.CreateVector<double>(*vector_of_doubles) : 0;\n  auto vector_of_referrables__ = vector_of_referrables ? _fbb.CreateVectorOfSortedTables<MyGame::Example::Referrable>(vector_of_referrables) : 0;\n  auto vector_of_weak_references__ = vector_of_weak_references ? _fbb.CreateVector<uint64_t>(*vector_of_weak_references) : 0;\n  auto vector_of_strong_referrables__ = vector_of_strong_referrables ? _fbb.CreateVectorOfSortedTables<MyGame::Example::Referrable>(vector_of_strong_referrables) : 0;\n  auto vector_of_co_owning_references__ = vector_of_co_owning_references ? _fbb.CreateVector<uint64_t>(*vector_of_co_owning_references) : 0;\n  auto vector_of_non_owning_references__ = vector_of_non_owning_references ? _fbb.CreateVector<uint64_t>(*vector_of_non_owning_references) : 0;\n  auto vector_of_enums__ = vector_of_enums ? _fbb.CreateVector<uint8_t>(*vector_of_enums) : 0;\n  auto testrequirednestedflatbuffer__ = testrequirednestedflatbuffer ? _fbb.CreateVector<uint8_t>(*testrequirednestedflatbuffer) : 0;\n  auto scalar_key_sorted_tables__ = scalar_key_sorted_tables ? _fbb.CreateVectorOfSortedTables<MyGame::Example::Stat>(scalar_key_sorted_tables) : 0;\n  return MyGame::Example::CreateMonster(\n      _fbb,\n      pos,\n      mana,\n      hp,\n      name__,\n      inventory__,\n      color,\n      test_type,\n      test,\n      test4__,\n      testarrayofstring__,\n      testarrayoftables__,\n      enemy,\n      testnestedflatbuffer__,\n      testempty,\n      testbool,\n      testhashs32_fnv1,\n      testhashu32_fnv1,\n      testhashs64_fnv1,\n      testhashu64_fnv1,\n      testhashs32_fnv1a,\n      testhashu32_fnv1a,\n      testhashs64_fnv1a,\n      testhashu64_fnv1a,\n      testarrayofbools__,\n      testf,\n      testf2,\n      testf3,\n      testarrayofstring2__,\n      testarrayofsortedstruct__,\n      flex__,\n      test5__,\n      vector_of_longs__,\n      vector_of_doubles__,\n      parent_namespace_test,\n      vector_of_referrables__,\n      single_weak_reference,\n      vector_of_weak_references__,\n      vector_of_strong_referrables__,\n      co_owning_reference,\n      vector_of_co_owning_references__,\n      non_owning_reference,\n      vector_of_non_owning_references__,\n      any_unique_type,\n      any_unique,\n      any_ambiguous_type,\n      any_ambiguous,\n      vector_of_enums__,\n      signed_enum,\n      testrequirednestedflatbuffer__,\n      scalar_key_sorted_tables__,\n      native_inline,\n      long_enum_non_enum_default,\n      long_enum_normal_default,\n      nan_default,\n      inf_default,\n      positive_inf_default,\n      infinity_default,\n      positive_infinity_default,\n      negative_inf_default,\n      negative_infinity_default,\n      double_inf_default);\n}\n\n::flatbuffers::Offset<Monster> CreateMonster(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n\nstruct TypeAliasesT : public ::flatbuffers::NativeTable {\n  typedef TypeAliases TableType;\n  int8_t i8 = 0;\n  uint8_t u8 = 0;\n  int16_t i16 = 0;\n  uint16_t u16 = 0;\n  int32_t i32 = 0;\n  uint32_t u32 = 0;\n  int64_t i64 = 0;\n  uint64_t u64 = 0;\n  float f32 = 0.0f;\n  double f64 = 0.0;\n  std::vector<int8_t> v8{};\n  std::vector<double> vf64{};\n};\n\nstruct TypeAliases FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef TypeAliasesT NativeTableType;\n  typedef TypeAliasesBuilder Builder;\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return TypeAliasesTypeTable();\n  }\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_I8 = 4,\n    VT_U8 = 6,\n    VT_I16 = 8,\n    VT_U16 = 10,\n    VT_I32 = 12,\n    VT_U32 = 14,\n    VT_I64 = 16,\n    VT_U64 = 18,\n    VT_F32 = 20,\n    VT_F64 = 22,\n    VT_V8 = 24,\n    VT_VF64 = 26\n  };\n  int8_t i8() const {\n    return GetField<int8_t>(VT_I8, 0);\n  }\n  bool mutate_i8(int8_t _i8 = 0) {\n    return SetField<int8_t>(VT_I8, _i8, 0);\n  }\n  uint8_t u8() const {\n    return GetField<uint8_t>(VT_U8, 0);\n  }\n  bool mutate_u8(uint8_t _u8 = 0) {\n    return SetField<uint8_t>(VT_U8, _u8, 0);\n  }\n  int16_t i16() const {\n    return GetField<int16_t>(VT_I16, 0);\n  }\n  bool mutate_i16(int16_t _i16 = 0) {\n    return SetField<int16_t>(VT_I16, _i16, 0);\n  }\n  uint16_t u16() const {\n    return GetField<uint16_t>(VT_U16, 0);\n  }\n  bool mutate_u16(uint16_t _u16 = 0) {\n    return SetField<uint16_t>(VT_U16, _u16, 0);\n  }\n  int32_t i32() const {\n    return GetField<int32_t>(VT_I32, 0);\n  }\n  bool mutate_i32(int32_t _i32 = 0) {\n    return SetField<int32_t>(VT_I32, _i32, 0);\n  }\n  uint32_t u32() const {\n    return GetField<uint32_t>(VT_U32, 0);\n  }\n  bool mutate_u32(uint32_t _u32 = 0) {\n    return SetField<uint32_t>(VT_U32, _u32, 0);\n  }\n  int64_t i64() const {\n    return GetField<int64_t>(VT_I64, 0);\n  }\n  bool mutate_i64(int64_t _i64 = 0) {\n    return SetField<int64_t>(VT_I64, _i64, 0);\n  }\n  uint64_t u64() const {\n    return GetField<uint64_t>(VT_U64, 0);\n  }\n  bool mutate_u64(uint64_t _u64 = 0) {\n    return SetField<uint64_t>(VT_U64, _u64, 0);\n  }\n  float f32() const {\n    return GetField<float>(VT_F32, 0.0f);\n  }\n  bool mutate_f32(float _f32 = 0.0f) {\n    return SetField<float>(VT_F32, _f32, 0.0f);\n  }\n  double f64() const {\n    return GetField<double>(VT_F64, 0.0);\n  }\n  bool mutate_f64(double _f64 = 0.0) {\n    return SetField<double>(VT_F64, _f64, 0.0);\n  }\n  const ::flatbuffers::Vector<int8_t> *v8() const {\n    return GetPointer<const ::flatbuffers::Vector<int8_t> *>(VT_V8);\n  }\n  ::flatbuffers::Vector<int8_t> *mutable_v8() {\n    return GetPointer<::flatbuffers::Vector<int8_t> *>(VT_V8);\n  }\n  const ::flatbuffers::Vector<double> *vf64() const {\n    return GetPointer<const ::flatbuffers::Vector<double> *>(VT_VF64);\n  }\n  ::flatbuffers::Vector<double> *mutable_vf64() {\n    return GetPointer<::flatbuffers::Vector<double> *>(VT_VF64);\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyField<int8_t>(verifier, VT_I8, 1) &&\n           VerifyField<uint8_t>(verifier, VT_U8, 1) &&\n           VerifyField<int16_t>(verifier, VT_I16, 2) &&\n           VerifyField<uint16_t>(verifier, VT_U16, 2) &&\n           VerifyField<int32_t>(verifier, VT_I32, 4) &&\n           VerifyField<uint32_t>(verifier, VT_U32, 4) &&\n           VerifyField<int64_t>(verifier, VT_I64, 8) &&\n           VerifyField<uint64_t>(verifier, VT_U64, 8) &&\n           VerifyField<float>(verifier, VT_F32, 4) &&\n           VerifyField<double>(verifier, VT_F64, 8) &&\n           VerifyOffset(verifier, VT_V8) &&\n           verifier.VerifyVector(v8()) &&\n           VerifyOffset(verifier, VT_VF64) &&\n           verifier.VerifyVector(vf64()) &&\n           verifier.EndTable();\n  }\n  TypeAliasesT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  void UnPackTo(TypeAliasesT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  static ::flatbuffers::Offset<TypeAliases> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const TypeAliasesT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n};\n\nstruct TypeAliasesBuilder {\n  typedef TypeAliases Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_i8(int8_t i8) {\n    fbb_.AddElement<int8_t>(TypeAliases::VT_I8, i8, 0);\n  }\n  void add_u8(uint8_t u8) {\n    fbb_.AddElement<uint8_t>(TypeAliases::VT_U8, u8, 0);\n  }\n  void add_i16(int16_t i16) {\n    fbb_.AddElement<int16_t>(TypeAliases::VT_I16, i16, 0);\n  }\n  void add_u16(uint16_t u16) {\n    fbb_.AddElement<uint16_t>(TypeAliases::VT_U16, u16, 0);\n  }\n  void add_i32(int32_t i32) {\n    fbb_.AddElement<int32_t>(TypeAliases::VT_I32, i32, 0);\n  }\n  void add_u32(uint32_t u32) {\n    fbb_.AddElement<uint32_t>(TypeAliases::VT_U32, u32, 0);\n  }\n  void add_i64(int64_t i64) {\n    fbb_.AddElement<int64_t>(TypeAliases::VT_I64, i64, 0);\n  }\n  void add_u64(uint64_t u64) {\n    fbb_.AddElement<uint64_t>(TypeAliases::VT_U64, u64, 0);\n  }\n  void add_f32(float f32) {\n    fbb_.AddElement<float>(TypeAliases::VT_F32, f32, 0.0f);\n  }\n  void add_f64(double f64) {\n    fbb_.AddElement<double>(TypeAliases::VT_F64, f64, 0.0);\n  }\n  void add_v8(::flatbuffers::Offset<::flatbuffers::Vector<int8_t>> v8) {\n    fbb_.AddOffset(TypeAliases::VT_V8, v8);\n  }\n  void add_vf64(::flatbuffers::Offset<::flatbuffers::Vector<double>> vf64) {\n    fbb_.AddOffset(TypeAliases::VT_VF64, vf64);\n  }\n  explicit TypeAliasesBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<TypeAliases> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<TypeAliases>(end);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<TypeAliases> CreateTypeAliases(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    int8_t i8 = 0,\n    uint8_t u8 = 0,\n    int16_t i16 = 0,\n    uint16_t u16 = 0,\n    int32_t i32 = 0,\n    uint32_t u32 = 0,\n    int64_t i64 = 0,\n    uint64_t u64 = 0,\n    float f32 = 0.0f,\n    double f64 = 0.0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<int8_t>> v8 = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<double>> vf64 = 0) {\n  TypeAliasesBuilder builder_(_fbb);\n  builder_.add_f64(f64);\n  builder_.add_u64(u64);\n  builder_.add_i64(i64);\n  builder_.add_vf64(vf64);\n  builder_.add_v8(v8);\n  builder_.add_f32(f32);\n  builder_.add_u32(u32);\n  builder_.add_i32(i32);\n  builder_.add_u16(u16);\n  builder_.add_i16(i16);\n  builder_.add_u8(u8);\n  builder_.add_i8(i8);\n  return builder_.Finish();\n}\n\ninline ::flatbuffers::Offset<TypeAliases> CreateTypeAliasesDirect(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    int8_t i8 = 0,\n    uint8_t u8 = 0,\n    int16_t i16 = 0,\n    uint16_t u16 = 0,\n    int32_t i32 = 0,\n    uint32_t u32 = 0,\n    int64_t i64 = 0,\n    uint64_t u64 = 0,\n    float f32 = 0.0f,\n    double f64 = 0.0,\n    const std::vector<int8_t> *v8 = nullptr,\n    const std::vector<double> *vf64 = nullptr) {\n  auto v8__ = v8 ? _fbb.CreateVector<int8_t>(*v8) : 0;\n  auto vf64__ = vf64 ? _fbb.CreateVector<double>(*vf64) : 0;\n  return MyGame::Example::CreateTypeAliases(\n      _fbb,\n      i8,\n      u8,\n      i16,\n      u16,\n      i32,\n      u32,\n      i64,\n      u64,\n      f32,\n      f64,\n      v8__,\n      vf64__);\n}\n\n::flatbuffers::Offset<TypeAliases> CreateTypeAliases(::flatbuffers::FlatBufferBuilder &_fbb, const TypeAliasesT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n\n}  // namespace Example\n\n\ninline bool operator==(const InParentNamespaceT &, const InParentNamespaceT &) {\n  return true;\n}\n\ninline bool operator!=(const InParentNamespaceT &lhs, const InParentNamespaceT &rhs) {\n    return !(lhs == rhs);\n}\n\n\ninline InParentNamespaceT *InParentNamespace::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {\n  auto _o = std::unique_ptr<InParentNamespaceT>(new InParentNamespaceT());\n  UnPackTo(_o.get(), _resolver);\n  return _o.release();\n}\n\ninline void InParentNamespace::UnPackTo(InParentNamespaceT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {\n  (void)_o;\n  (void)_resolver;\n}\n\ninline ::flatbuffers::Offset<InParentNamespace> CreateInParentNamespace(::flatbuffers::FlatBufferBuilder &_fbb, const InParentNamespaceT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  return InParentNamespace::Pack(_fbb, _o, _rehasher);\n}\n\ninline ::flatbuffers::Offset<InParentNamespace> InParentNamespace::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const InParentNamespaceT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  (void)_rehasher;\n  (void)_o;\n  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const InParentNamespaceT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;\n  return MyGame::CreateInParentNamespace(\n      _fbb);\n}\n\nnamespace Example2 {\n\n\ninline bool operator==(const MonsterT &, const MonsterT &) {\n  return true;\n}\n\ninline bool operator!=(const MonsterT &lhs, const MonsterT &rhs) {\n    return !(lhs == rhs);\n}\n\n\ninline MonsterT *Monster::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {\n  auto _o = std::unique_ptr<MonsterT>(new MonsterT());\n  UnPackTo(_o.get(), _resolver);\n  return _o.release();\n}\n\ninline void Monster::UnPackTo(MonsterT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {\n  (void)_o;\n  (void)_resolver;\n}\n\ninline ::flatbuffers::Offset<Monster> CreateMonster(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  return Monster::Pack(_fbb, _o, _rehasher);\n}\n\ninline ::flatbuffers::Offset<Monster> Monster::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  (void)_rehasher;\n  (void)_o;\n  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const MonsterT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;\n  return MyGame::Example2::CreateMonster(\n      _fbb);\n}\n\n}  // namespace Example2\n\nnamespace Example {\n\n\ninline bool operator==(const TestSimpleTableWithEnumT &lhs, const TestSimpleTableWithEnumT &rhs) {\n  return\n      (lhs.color == rhs.color);\n}\n\ninline bool operator!=(const TestSimpleTableWithEnumT &lhs, const TestSimpleTableWithEnumT &rhs) {\n    return !(lhs == rhs);\n}\n\n\ninline TestSimpleTableWithEnumT *TestSimpleTableWithEnum::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {\n  auto _o = std::unique_ptr<TestSimpleTableWithEnumT>(new TestSimpleTableWithEnumT());\n  UnPackTo(_o.get(), _resolver);\n  return _o.release();\n}\n\ninline void TestSimpleTableWithEnum::UnPackTo(TestSimpleTableWithEnumT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {\n  (void)_o;\n  (void)_resolver;\n  { auto _e = color(); _o->color = _e; }\n}\n\ninline ::flatbuffers::Offset<TestSimpleTableWithEnum> CreateTestSimpleTableWithEnum(::flatbuffers::FlatBufferBuilder &_fbb, const TestSimpleTableWithEnumT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  return TestSimpleTableWithEnum::Pack(_fbb, _o, _rehasher);\n}\n\ninline ::flatbuffers::Offset<TestSimpleTableWithEnum> TestSimpleTableWithEnum::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const TestSimpleTableWithEnumT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  (void)_rehasher;\n  (void)_o;\n  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const TestSimpleTableWithEnumT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;\n  auto _color = _o->color;\n  return MyGame::Example::CreateTestSimpleTableWithEnum(\n      _fbb,\n      _color);\n}\n\n\ninline bool operator==(const StatT &lhs, const StatT &rhs) {\n  return\n      (lhs.id == rhs.id) &&\n      (lhs.val == rhs.val) &&\n      (lhs.count == rhs.count);\n}\n\ninline bool operator!=(const StatT &lhs, const StatT &rhs) {\n    return !(lhs == rhs);\n}\n\n\ninline StatT *Stat::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {\n  auto _o = std::unique_ptr<StatT>(new StatT());\n  UnPackTo(_o.get(), _resolver);\n  return _o.release();\n}\n\ninline void Stat::UnPackTo(StatT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {\n  (void)_o;\n  (void)_resolver;\n  { auto _e = id(); if (_e) _o->id = _e->str(); }\n  { auto _e = val(); _o->val = _e; }\n  { auto _e = count(); _o->count = _e; }\n}\n\ninline ::flatbuffers::Offset<Stat> CreateStat(::flatbuffers::FlatBufferBuilder &_fbb, const StatT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  return Stat::Pack(_fbb, _o, _rehasher);\n}\n\ninline ::flatbuffers::Offset<Stat> Stat::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const StatT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  (void)_rehasher;\n  (void)_o;\n  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const StatT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;\n  auto _id = _o->id.empty() ? 0 : _fbb.CreateString(_o->id);\n  auto _val = _o->val;\n  auto _count = _o->count;\n  return MyGame::Example::CreateStat(\n      _fbb,\n      _id,\n      _val,\n      _count);\n}\n\n\ninline bool operator==(const ReferrableT &lhs, const ReferrableT &rhs) {\n  return\n      (lhs.id == rhs.id);\n}\n\ninline bool operator!=(const ReferrableT &lhs, const ReferrableT &rhs) {\n    return !(lhs == rhs);\n}\n\n\ninline ReferrableT *Referrable::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {\n  auto _o = std::unique_ptr<ReferrableT>(new ReferrableT());\n  UnPackTo(_o.get(), _resolver);\n  return _o.release();\n}\n\ninline void Referrable::UnPackTo(ReferrableT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {\n  (void)_o;\n  (void)_resolver;\n  { auto _e = id(); _o->id = _e; }\n}\n\ninline ::flatbuffers::Offset<Referrable> CreateReferrable(::flatbuffers::FlatBufferBuilder &_fbb, const ReferrableT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  return Referrable::Pack(_fbb, _o, _rehasher);\n}\n\ninline ::flatbuffers::Offset<Referrable> Referrable::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ReferrableT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  (void)_rehasher;\n  (void)_o;\n  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const ReferrableT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;\n  auto _id = _o->id;\n  return MyGame::Example::CreateReferrable(\n      _fbb,\n      _id);\n}\n\n\ninline bool operator==(const MonsterT &lhs, const MonsterT &rhs) {\n  return\n      ((lhs.pos == rhs.pos) || (lhs.pos && rhs.pos && *lhs.pos == *rhs.pos)) &&\n      (lhs.mana == rhs.mana) &&\n      (lhs.hp == rhs.hp) &&\n      (lhs.name == rhs.name) &&\n      (lhs.inventory == rhs.inventory) &&\n      (lhs.color == rhs.color) &&\n      (lhs.test == rhs.test) &&\n      (lhs.test4 == rhs.test4) &&\n      (lhs.testarrayofstring == rhs.testarrayofstring) &&\n      (lhs.testarrayoftables.size() == rhs.testarrayoftables.size() && std::equal(lhs.testarrayoftables.cbegin(), lhs.testarrayoftables.cend(), rhs.testarrayoftables.cbegin(), [](std::unique_ptr<MyGame::Example::MonsterT> const &a, std::unique_ptr<MyGame::Example::MonsterT> const &b) { return (a == b) || (a && b && *a == *b); })) &&\n      ((lhs.enemy == rhs.enemy) || (lhs.enemy && rhs.enemy && *lhs.enemy == *rhs.enemy)) &&\n      (lhs.testnestedflatbuffer == rhs.testnestedflatbuffer) &&\n      ((lhs.testempty == rhs.testempty) || (lhs.testempty && rhs.testempty && *lhs.testempty == *rhs.testempty)) &&\n      (lhs.testbool == rhs.testbool) &&\n      (lhs.testhashs32_fnv1 == rhs.testhashs32_fnv1) &&\n      (lhs.testhashu32_fnv1 == rhs.testhashu32_fnv1) &&\n      (lhs.testhashs64_fnv1 == rhs.testhashs64_fnv1) &&\n      (lhs.testhashu64_fnv1 == rhs.testhashu64_fnv1) &&\n      (lhs.testhashs32_fnv1a == rhs.testhashs32_fnv1a) &&\n      (lhs.testhashu32_fnv1a == rhs.testhashu32_fnv1a) &&\n      (lhs.testhashs64_fnv1a == rhs.testhashs64_fnv1a) &&\n      (lhs.testhashu64_fnv1a == rhs.testhashu64_fnv1a) &&\n      (lhs.testarrayofbools == rhs.testarrayofbools) &&\n      (lhs.testf == rhs.testf) &&\n      (lhs.testf2 == rhs.testf2) &&\n      (lhs.testf3 == rhs.testf3) &&\n      (lhs.testarrayofstring2 == rhs.testarrayofstring2) &&\n      (lhs.testarrayofsortedstruct == rhs.testarrayofsortedstruct) &&\n      (lhs.flex == rhs.flex) &&\n      (lhs.test5 == rhs.test5) &&\n      (lhs.vector_of_longs == rhs.vector_of_longs) &&\n      (lhs.vector_of_doubles == rhs.vector_of_doubles) &&\n      ((lhs.parent_namespace_test == rhs.parent_namespace_test) || (lhs.parent_namespace_test && rhs.parent_namespace_test && *lhs.parent_namespace_test == *rhs.parent_namespace_test)) &&\n      (lhs.vector_of_referrables.size() == rhs.vector_of_referrables.size() && std::equal(lhs.vector_of_referrables.cbegin(), lhs.vector_of_referrables.cend(), rhs.vector_of_referrables.cbegin(), [](std::unique_ptr<MyGame::Example::ReferrableT> const &a, std::unique_ptr<MyGame::Example::ReferrableT> const &b) { return (a == b) || (a && b && *a == *b); })) &&\n      (lhs.single_weak_reference == rhs.single_weak_reference) &&\n      (lhs.vector_of_weak_references == rhs.vector_of_weak_references) &&\n      (lhs.vector_of_strong_referrables.size() == rhs.vector_of_strong_referrables.size() && std::equal(lhs.vector_of_strong_referrables.cbegin(), lhs.vector_of_strong_referrables.cend(), rhs.vector_of_strong_referrables.cbegin(), [](std::unique_ptr<MyGame::Example::ReferrableT> const &a, std::unique_ptr<MyGame::Example::ReferrableT> const &b) { return (a == b) || (a && b && *a == *b); })) &&\n      (lhs.co_owning_reference == rhs.co_owning_reference) &&\n      (lhs.vector_of_co_owning_references == rhs.vector_of_co_owning_references) &&\n      (lhs.non_owning_reference == rhs.non_owning_reference) &&\n      (lhs.vector_of_non_owning_references == rhs.vector_of_non_owning_references) &&\n      (lhs.any_unique == rhs.any_unique) &&\n      (lhs.any_ambiguous == rhs.any_ambiguous) &&\n      (lhs.vector_of_enums == rhs.vector_of_enums) &&\n      (lhs.signed_enum == rhs.signed_enum) &&\n      (lhs.testrequirednestedflatbuffer == rhs.testrequirednestedflatbuffer) &&\n      (lhs.scalar_key_sorted_tables.size() == rhs.scalar_key_sorted_tables.size() && std::equal(lhs.scalar_key_sorted_tables.cbegin(), lhs.scalar_key_sorted_tables.cend(), rhs.scalar_key_sorted_tables.cbegin(), [](std::unique_ptr<MyGame::Example::StatT> const &a, std::unique_ptr<MyGame::Example::StatT> const &b) { return (a == b) || (a && b && *a == *b); })) &&\n      (lhs.native_inline == rhs.native_inline) &&\n      (lhs.long_enum_non_enum_default == rhs.long_enum_non_enum_default) &&\n      (lhs.long_enum_normal_default == rhs.long_enum_normal_default) &&\n      (lhs.nan_default == rhs.nan_default) &&\n      (lhs.inf_default == rhs.inf_default) &&\n      (lhs.positive_inf_default == rhs.positive_inf_default) &&\n      (lhs.infinity_default == rhs.infinity_default) &&\n      (lhs.positive_infinity_default == rhs.positive_infinity_default) &&\n      (lhs.negative_inf_default == rhs.negative_inf_default) &&\n      (lhs.negative_infinity_default == rhs.negative_infinity_default) &&\n      (lhs.double_inf_default == rhs.double_inf_default);\n}\n\ninline bool operator!=(const MonsterT &lhs, const MonsterT &rhs) {\n    return !(lhs == rhs);\n}\n\n\ninline MonsterT::MonsterT(const MonsterT &o)\n      : pos((o.pos) ? new MyGame::Example::Vec3(*o.pos) : nullptr),\n        mana(o.mana),\n        hp(o.hp),\n        name(o.name),\n        inventory(o.inventory),\n        color(o.color),\n        test(o.test),\n        test4(o.test4),\n        testarrayofstring(o.testarrayofstring),\n        enemy((o.enemy) ? new MyGame::Example::MonsterT(*o.enemy) : nullptr),\n        testnestedflatbuffer(o.testnestedflatbuffer),\n        testempty((o.testempty) ? new MyGame::Example::StatT(*o.testempty) : nullptr),\n        testbool(o.testbool),\n        testhashs32_fnv1(o.testhashs32_fnv1),\n        testhashu32_fnv1(o.testhashu32_fnv1),\n        testhashs64_fnv1(o.testhashs64_fnv1),\n        testhashu64_fnv1(o.testhashu64_fnv1),\n        testhashs32_fnv1a(o.testhashs32_fnv1a),\n        testhashu32_fnv1a(o.testhashu32_fnv1a),\n        testhashs64_fnv1a(o.testhashs64_fnv1a),\n        testhashu64_fnv1a(o.testhashu64_fnv1a),\n        testarrayofbools(o.testarrayofbools),\n        testf(o.testf),\n        testf2(o.testf2),\n        testf3(o.testf3),\n        testarrayofstring2(o.testarrayofstring2),\n        testarrayofsortedstruct(o.testarrayofsortedstruct),\n        flex(o.flex),\n        test5(o.test5),\n        vector_of_longs(o.vector_of_longs),\n        vector_of_doubles(o.vector_of_doubles),\n        parent_namespace_test((o.parent_namespace_test) ? new MyGame::InParentNamespaceT(*o.parent_namespace_test) : nullptr),\n        single_weak_reference(o.single_weak_reference),\n        vector_of_weak_references(o.vector_of_weak_references),\n        co_owning_reference(o.co_owning_reference),\n        non_owning_reference(o.non_owning_reference),\n        vector_of_non_owning_references(o.vector_of_non_owning_references),\n        any_unique(o.any_unique),\n        any_ambiguous(o.any_ambiguous),\n        vector_of_enums(o.vector_of_enums),\n        signed_enum(o.signed_enum),\n        testrequirednestedflatbuffer(o.testrequirednestedflatbuffer),\n        native_inline(o.native_inline),\n        long_enum_non_enum_default(o.long_enum_non_enum_default),\n        long_enum_normal_default(o.long_enum_normal_default),\n        nan_default(o.nan_default),\n        inf_default(o.inf_default),\n        positive_inf_default(o.positive_inf_default),\n        infinity_default(o.infinity_default),\n        positive_infinity_default(o.positive_infinity_default),\n        negative_inf_default(o.negative_inf_default),\n        negative_infinity_default(o.negative_infinity_default),\n        double_inf_default(o.double_inf_default) {\n  testarrayoftables.reserve(o.testarrayoftables.size());\n  for (const auto &testarrayoftables_ : o.testarrayoftables) { testarrayoftables.emplace_back((testarrayoftables_) ? new MyGame::Example::MonsterT(*testarrayoftables_) : nullptr); }\n  vector_of_referrables.reserve(o.vector_of_referrables.size());\n  for (const auto &vector_of_referrables_ : o.vector_of_referrables) { vector_of_referrables.emplace_back((vector_of_referrables_) ? new MyGame::Example::ReferrableT(*vector_of_referrables_) : nullptr); }\n  vector_of_strong_referrables.reserve(o.vector_of_strong_referrables.size());\n  for (const auto &vector_of_strong_referrables_ : o.vector_of_strong_referrables) { vector_of_strong_referrables.emplace_back((vector_of_strong_referrables_) ? new MyGame::Example::ReferrableT(*vector_of_strong_referrables_) : nullptr); }\n  vector_of_co_owning_references.reserve(o.vector_of_co_owning_references.size());\n  for (const auto &vector_of_co_owning_references_ : o.vector_of_co_owning_references) { vector_of_co_owning_references.emplace_back((vector_of_co_owning_references_) ? new ReferrableT(*vector_of_co_owning_references_) : nullptr); }\n  scalar_key_sorted_tables.reserve(o.scalar_key_sorted_tables.size());\n  for (const auto &scalar_key_sorted_tables_ : o.scalar_key_sorted_tables) { scalar_key_sorted_tables.emplace_back((scalar_key_sorted_tables_) ? new MyGame::Example::StatT(*scalar_key_sorted_tables_) : nullptr); }\n}\n\ninline MonsterT &MonsterT::operator=(MonsterT o) FLATBUFFERS_NOEXCEPT {\n  std::swap(pos, o.pos);\n  std::swap(mana, o.mana);\n  std::swap(hp, o.hp);\n  std::swap(name, o.name);\n  std::swap(inventory, o.inventory);\n  std::swap(color, o.color);\n  std::swap(test, o.test);\n  std::swap(test4, o.test4);\n  std::swap(testarrayofstring, o.testarrayofstring);\n  std::swap(testarrayoftables, o.testarrayoftables);\n  std::swap(enemy, o.enemy);\n  std::swap(testnestedflatbuffer, o.testnestedflatbuffer);\n  std::swap(testempty, o.testempty);\n  std::swap(testbool, o.testbool);\n  std::swap(testhashs32_fnv1, o.testhashs32_fnv1);\n  std::swap(testhashu32_fnv1, o.testhashu32_fnv1);\n  std::swap(testhashs64_fnv1, o.testhashs64_fnv1);\n  std::swap(testhashu64_fnv1, o.testhashu64_fnv1);\n  std::swap(testhashs32_fnv1a, o.testhashs32_fnv1a);\n  std::swap(testhashu32_fnv1a, o.testhashu32_fnv1a);\n  std::swap(testhashs64_fnv1a, o.testhashs64_fnv1a);\n  std::swap(testhashu64_fnv1a, o.testhashu64_fnv1a);\n  std::swap(testarrayofbools, o.testarrayofbools);\n  std::swap(testf, o.testf);\n  std::swap(testf2, o.testf2);\n  std::swap(testf3, o.testf3);\n  std::swap(testarrayofstring2, o.testarrayofstring2);\n  std::swap(testarrayofsortedstruct, o.testarrayofsortedstruct);\n  std::swap(flex, o.flex);\n  std::swap(test5, o.test5);\n  std::swap(vector_of_longs, o.vector_of_longs);\n  std::swap(vector_of_doubles, o.vector_of_doubles);\n  std::swap(parent_namespace_test, o.parent_namespace_test);\n  std::swap(vector_of_referrables, o.vector_of_referrables);\n  std::swap(single_weak_reference, o.single_weak_reference);\n  std::swap(vector_of_weak_references, o.vector_of_weak_references);\n  std::swap(vector_of_strong_referrables, o.vector_of_strong_referrables);\n  std::swap(co_owning_reference, o.co_owning_reference);\n  std::swap(vector_of_co_owning_references, o.vector_of_co_owning_references);\n  std::swap(non_owning_reference, o.non_owning_reference);\n  std::swap(vector_of_non_owning_references, o.vector_of_non_owning_references);\n  std::swap(any_unique, o.any_unique);\n  std::swap(any_ambiguous, o.any_ambiguous);\n  std::swap(vector_of_enums, o.vector_of_enums);\n  std::swap(signed_enum, o.signed_enum);\n  std::swap(testrequirednestedflatbuffer, o.testrequirednestedflatbuffer);\n  std::swap(scalar_key_sorted_tables, o.scalar_key_sorted_tables);\n  std::swap(native_inline, o.native_inline);\n  std::swap(long_enum_non_enum_default, o.long_enum_non_enum_default);\n  std::swap(long_enum_normal_default, o.long_enum_normal_default);\n  std::swap(nan_default, o.nan_default);\n  std::swap(inf_default, o.inf_default);\n  std::swap(positive_inf_default, o.positive_inf_default);\n  std::swap(infinity_default, o.infinity_default);\n  std::swap(positive_infinity_default, o.positive_infinity_default);\n  std::swap(negative_inf_default, o.negative_inf_default);\n  std::swap(negative_infinity_default, o.negative_infinity_default);\n  std::swap(double_inf_default, o.double_inf_default);\n  return *this;\n}\n\ninline MonsterT *Monster::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {\n  auto _o = std::unique_ptr<MonsterT>(new MonsterT());\n  UnPackTo(_o.get(), _resolver);\n  return _o.release();\n}\n\ninline void Monster::UnPackTo(MonsterT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {\n  (void)_o;\n  (void)_resolver;\n  { auto _e = pos(); if (_e) _o->pos = std::unique_ptr<MyGame::Example::Vec3>(new MyGame::Example::Vec3(*_e)); }\n  { auto _e = mana(); _o->mana = _e; }\n  { auto _e = hp(); _o->hp = _e; }\n  { auto _e = name(); if (_e) _o->name = _e->str(); }\n  { auto _e = inventory(); if (_e) { _o->inventory.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->inventory.begin()); } }\n  { auto _e = color(); _o->color = _e; }\n  { auto _e = test_type(); _o->test.type = _e; }\n  { auto _e = test(); if (_e) _o->test.value = MyGame::Example::AnyUnion::UnPack(_e, test_type(), _resolver); }\n  { auto _e = test4(); if (_e) { _o->test4.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->test4[_i] = *_e->Get(_i); } } else { _o->test4.resize(0); } }\n  { auto _e = testarrayofstring(); if (_e) { _o->testarrayofstring.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testarrayofstring[_i] = _e->Get(_i)->str(); } } else { _o->testarrayofstring.resize(0); } }\n  { auto _e = testarrayoftables(); if (_e) { _o->testarrayoftables.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { if(_o->testarrayoftables[_i]) { _e->Get(_i)->UnPackTo(_o->testarrayoftables[_i].get(), _resolver); } else { _o->testarrayoftables[_i] = std::unique_ptr<MyGame::Example::MonsterT>(_e->Get(_i)->UnPack(_resolver)); } } } else { _o->testarrayoftables.resize(0); } }\n  { auto _e = enemy(); if (_e) { if(_o->enemy) { _e->UnPackTo(_o->enemy.get(), _resolver); } else { _o->enemy = std::unique_ptr<MyGame::Example::MonsterT>(_e->UnPack(_resolver)); } } else if (_o->enemy) { _o->enemy.reset(); } }\n  { auto _e = testnestedflatbuffer(); if (_e) { _o->testnestedflatbuffer.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->testnestedflatbuffer.begin()); } }\n  { auto _e = testempty(); if (_e) { if(_o->testempty) { _e->UnPackTo(_o->testempty.get(), _resolver); } else { _o->testempty = std::unique_ptr<MyGame::Example::StatT>(_e->UnPack(_resolver)); } } else if (_o->testempty) { _o->testempty.reset(); } }\n  { auto _e = testbool(); _o->testbool = _e; }\n  { auto _e = testhashs32_fnv1(); _o->testhashs32_fnv1 = _e; }\n  { auto _e = testhashu32_fnv1(); _o->testhashu32_fnv1 = _e; }\n  { auto _e = testhashs64_fnv1(); _o->testhashs64_fnv1 = _e; }\n  { auto _e = testhashu64_fnv1(); _o->testhashu64_fnv1 = _e; }\n  { auto _e = testhashs32_fnv1a(); _o->testhashs32_fnv1a = _e; }\n  { auto _e = testhashu32_fnv1a(); /*scalar resolver, naked*/ if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->testhashu32_fnv1a), static_cast<::flatbuffers::hash_value_t>(_e)); else _o->testhashu32_fnv1a = nullptr; }\n  { auto _e = testhashs64_fnv1a(); _o->testhashs64_fnv1a = _e; }\n  { auto _e = testhashu64_fnv1a(); _o->testhashu64_fnv1a = _e; }\n  { auto _e = testarrayofbools(); if (_e) { _o->testarrayofbools.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testarrayofbools[_i] = _e->Get(_i) != 0; } } else { _o->testarrayofbools.resize(0); } }\n  { auto _e = testf(); _o->testf = _e; }\n  { auto _e = testf2(); _o->testf2 = _e; }\n  { auto _e = testf3(); _o->testf3 = _e; }\n  { auto _e = testarrayofstring2(); if (_e) { _o->testarrayofstring2.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testarrayofstring2[_i] = _e->Get(_i)->str(); } } else { _o->testarrayofstring2.resize(0); } }\n  { auto _e = testarrayofsortedstruct(); if (_e) { _o->testarrayofsortedstruct.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testarrayofsortedstruct[_i] = *_e->Get(_i); } } else { _o->testarrayofsortedstruct.resize(0); } }\n  { auto _e = flex(); if (_e) { _o->flex.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->flex.begin()); } }\n  { auto _e = test5(); if (_e) { _o->test5.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->test5[_i] = *_e->Get(_i); } } else { _o->test5.resize(0); } }\n  { auto _e = vector_of_longs(); if (_e) { _o->vector_of_longs.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vector_of_longs[_i] = _e->Get(_i); } } else { _o->vector_of_longs.resize(0); } }\n  { auto _e = vector_of_doubles(); if (_e) { _o->vector_of_doubles.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vector_of_doubles[_i] = _e->Get(_i); } } else { _o->vector_of_doubles.resize(0); } }\n  { auto _e = parent_namespace_test(); if (_e) { if(_o->parent_namespace_test) { _e->UnPackTo(_o->parent_namespace_test.get(), _resolver); } else { _o->parent_namespace_test = std::unique_ptr<MyGame::InParentNamespaceT>(_e->UnPack(_resolver)); } } else if (_o->parent_namespace_test) { _o->parent_namespace_test.reset(); } }\n  { auto _e = vector_of_referrables(); if (_e) { _o->vector_of_referrables.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { if(_o->vector_of_referrables[_i]) { _e->Get(_i)->UnPackTo(_o->vector_of_referrables[_i].get(), _resolver); } else { _o->vector_of_referrables[_i] = std::unique_ptr<MyGame::Example::ReferrableT>(_e->Get(_i)->UnPack(_resolver)); } } } else { _o->vector_of_referrables.resize(0); } }\n  { auto _e = single_weak_reference(); /*scalar resolver, naked*/ if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->single_weak_reference), static_cast<::flatbuffers::hash_value_t>(_e)); else _o->single_weak_reference = nullptr; }\n  { auto _e = vector_of_weak_references(); if (_e) { _o->vector_of_weak_references.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { /*vector resolver, naked*/ if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->vector_of_weak_references[_i]), static_cast<::flatbuffers::hash_value_t>(_e->Get(_i))); else _o->vector_of_weak_references[_i] = nullptr; } } else { _o->vector_of_weak_references.resize(0); } }\n  { auto _e = vector_of_strong_referrables(); if (_e) { _o->vector_of_strong_referrables.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { if(_o->vector_of_strong_referrables[_i]) { _e->Get(_i)->UnPackTo(_o->vector_of_strong_referrables[_i].get(), _resolver); } else { _o->vector_of_strong_referrables[_i] = std::unique_ptr<MyGame::Example::ReferrableT>(_e->Get(_i)->UnPack(_resolver)); } } } else { _o->vector_of_strong_referrables.resize(0); } }\n  { auto _e = co_owning_reference(); /*scalar resolver, naked*/ if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->co_owning_reference), static_cast<::flatbuffers::hash_value_t>(_e)); else _o->co_owning_reference = nullptr; }\n  { auto _e = vector_of_co_owning_references(); if (_e) { _o->vector_of_co_owning_references.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { /*vector resolver, default_ptr_type*/ if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->vector_of_co_owning_references[_i]), static_cast<::flatbuffers::hash_value_t>(_e->Get(_i)));/* else do nothing */} } else { _o->vector_of_co_owning_references.resize(0); } }\n  { auto _e = non_owning_reference(); /*scalar resolver, naked*/ if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->non_owning_reference), static_cast<::flatbuffers::hash_value_t>(_e)); else _o->non_owning_reference = nullptr; }\n  { auto _e = vector_of_non_owning_references(); if (_e) { _o->vector_of_non_owning_references.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { /*vector resolver, naked*/ if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->vector_of_non_owning_references[_i]), static_cast<::flatbuffers::hash_value_t>(_e->Get(_i))); else _o->vector_of_non_owning_references[_i] = nullptr; } } else { _o->vector_of_non_owning_references.resize(0); } }\n  { auto _e = any_unique_type(); _o->any_unique.type = _e; }\n  { auto _e = any_unique(); if (_e) _o->any_unique.value = MyGame::Example::AnyUniqueAliasesUnion::UnPack(_e, any_unique_type(), _resolver); }\n  { auto _e = any_ambiguous_type(); _o->any_ambiguous.type = _e; }\n  { auto _e = any_ambiguous(); if (_e) _o->any_ambiguous.value = MyGame::Example::AnyAmbiguousAliasesUnion::UnPack(_e, any_ambiguous_type(), _resolver); }\n  { auto _e = vector_of_enums(); if (_e) { _o->vector_of_enums.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vector_of_enums[_i] = static_cast<MyGame::Example::Color>(_e->Get(_i)); } } else { _o->vector_of_enums.resize(0); } }\n  { auto _e = signed_enum(); _o->signed_enum = _e; }\n  { auto _e = testrequirednestedflatbuffer(); if (_e) { _o->testrequirednestedflatbuffer.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->testrequirednestedflatbuffer.begin()); } }\n  { auto _e = scalar_key_sorted_tables(); if (_e) { _o->scalar_key_sorted_tables.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { if(_o->scalar_key_sorted_tables[_i]) { _e->Get(_i)->UnPackTo(_o->scalar_key_sorted_tables[_i].get(), _resolver); } else { _o->scalar_key_sorted_tables[_i] = std::unique_ptr<MyGame::Example::StatT>(_e->Get(_i)->UnPack(_resolver)); } } } else { _o->scalar_key_sorted_tables.resize(0); } }\n  { auto _e = native_inline(); if (_e) _o->native_inline = *_e; }\n  { auto _e = long_enum_non_enum_default(); _o->long_enum_non_enum_default = _e; }\n  { auto _e = long_enum_normal_default(); _o->long_enum_normal_default = _e; }\n  { auto _e = nan_default(); _o->nan_default = _e; }\n  { auto _e = inf_default(); _o->inf_default = _e; }\n  { auto _e = positive_inf_default(); _o->positive_inf_default = _e; }\n  { auto _e = infinity_default(); _o->infinity_default = _e; }\n  { auto _e = positive_infinity_default(); _o->positive_infinity_default = _e; }\n  { auto _e = negative_inf_default(); _o->negative_inf_default = _e; }\n  { auto _e = negative_infinity_default(); _o->negative_infinity_default = _e; }\n  { auto _e = double_inf_default(); _o->double_inf_default = _e; }\n}\n\ninline ::flatbuffers::Offset<Monster> CreateMonster(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  return Monster::Pack(_fbb, _o, _rehasher);\n}\n\ninline ::flatbuffers::Offset<Monster> Monster::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  (void)_rehasher;\n  (void)_o;\n  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const MonsterT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;\n  auto _pos = _o->pos ? _o->pos.get() : nullptr;\n  auto _mana = _o->mana;\n  auto _hp = _o->hp;\n  auto _name = _fbb.CreateString(_o->name);\n  auto _inventory = _o->inventory.size() ? _fbb.CreateVector(_o->inventory) : 0;\n  auto _color = _o->color;\n  auto _test_type = _o->test.type;\n  auto _test = _o->test.Pack(_fbb);\n  auto _test4 = _o->test4.size() ? _fbb.CreateVectorOfStructs(_o->test4) : 0;\n  auto _testarrayofstring = _o->testarrayofstring.size() ? _fbb.CreateVectorOfStrings(_o->testarrayofstring) : 0;\n  auto _testarrayoftables = _o->testarrayoftables.size() ? _fbb.CreateVector<::flatbuffers::Offset<MyGame::Example::Monster>> (_o->testarrayoftables.size(), [](size_t i, _VectorArgs *__va) { return MyGame::Example::CreateMonster(*__va->__fbb, __va->__o->testarrayoftables[i].get(), __va->__rehasher); }, &_va ) : 0;\n  auto _enemy = _o->enemy ? MyGame::Example::CreateMonster(_fbb, _o->enemy.get(), _rehasher) : 0;\n  auto _testnestedflatbuffer = _o->testnestedflatbuffer.size() ? _fbb.CreateVector(_o->testnestedflatbuffer) : 0;\n  auto _testempty = _o->testempty ? MyGame::Example::CreateStat(_fbb, _o->testempty.get(), _rehasher) : 0;\n  auto _testbool = _o->testbool;\n  auto _testhashs32_fnv1 = _o->testhashs32_fnv1;\n  auto _testhashu32_fnv1 = _o->testhashu32_fnv1;\n  auto _testhashs64_fnv1 = _o->testhashs64_fnv1;\n  auto _testhashu64_fnv1 = _o->testhashu64_fnv1;\n  auto _testhashs32_fnv1a = _o->testhashs32_fnv1a;\n  auto _testhashu32_fnv1a = _rehasher ? static_cast<uint32_t>((*_rehasher)(_o->testhashu32_fnv1a)) : 0;\n  auto _testhashs64_fnv1a = _o->testhashs64_fnv1a;\n  auto _testhashu64_fnv1a = _o->testhashu64_fnv1a;\n  auto _testarrayofbools = _o->testarrayofbools.size() ? _fbb.CreateVector(_o->testarrayofbools) : 0;\n  auto _testf = _o->testf;\n  auto _testf2 = _o->testf2;\n  auto _testf3 = _o->testf3;\n  auto _testarrayofstring2 = _o->testarrayofstring2.size() ? _fbb.CreateVectorOfStrings(_o->testarrayofstring2) : 0;\n  auto _testarrayofsortedstruct = _o->testarrayofsortedstruct.size() ? _fbb.CreateVectorOfStructs(_o->testarrayofsortedstruct) : 0;\n  auto _flex = _o->flex.size() ? _fbb.CreateVector(_o->flex) : 0;\n  auto _test5 = _o->test5.size() ? _fbb.CreateVectorOfStructs(_o->test5) : 0;\n  auto _vector_of_longs = _o->vector_of_longs.size() ? _fbb.CreateVector(_o->vector_of_longs) : 0;\n  auto _vector_of_doubles = _o->vector_of_doubles.size() ? _fbb.CreateVector(_o->vector_of_doubles) : 0;\n  auto _parent_namespace_test = _o->parent_namespace_test ? MyGame::CreateInParentNamespace(_fbb, _o->parent_namespace_test.get(), _rehasher) : 0;\n  auto _vector_of_referrables = _o->vector_of_referrables.size() ? _fbb.CreateVector<::flatbuffers::Offset<MyGame::Example::Referrable>> (_o->vector_of_referrables.size(), [](size_t i, _VectorArgs *__va) { return MyGame::Example::CreateReferrable(*__va->__fbb, __va->__o->vector_of_referrables[i].get(), __va->__rehasher); }, &_va ) : 0;\n  auto _single_weak_reference = _rehasher ? static_cast<uint64_t>((*_rehasher)(_o->single_weak_reference)) : 0;\n  auto _vector_of_weak_references = _o->vector_of_weak_references.size() ? _fbb.CreateVector<uint64_t>(_o->vector_of_weak_references.size(), [](size_t i, _VectorArgs *__va) { return __va->__rehasher ? static_cast<uint64_t>((*__va->__rehasher)(__va->__o->vector_of_weak_references[i])) : 0; }, &_va ) : 0;\n  auto _vector_of_strong_referrables = _o->vector_of_strong_referrables.size() ? _fbb.CreateVector<::flatbuffers::Offset<MyGame::Example::Referrable>> (_o->vector_of_strong_referrables.size(), [](size_t i, _VectorArgs *__va) { return MyGame::Example::CreateReferrable(*__va->__fbb, __va->__o->vector_of_strong_referrables[i].get(), __va->__rehasher); }, &_va ) : 0;\n  auto _co_owning_reference = _rehasher ? static_cast<uint64_t>((*_rehasher)(_o->co_owning_reference)) : 0;\n  auto _vector_of_co_owning_references = _o->vector_of_co_owning_references.size() ? _fbb.CreateVector<uint64_t>(_o->vector_of_co_owning_references.size(), [](size_t i, _VectorArgs *__va) { return __va->__rehasher ? static_cast<uint64_t>((*__va->__rehasher)(__va->__o->vector_of_co_owning_references[i].get())) : 0; }, &_va ) : 0;\n  auto _non_owning_reference = _rehasher ? static_cast<uint64_t>((*_rehasher)(_o->non_owning_reference)) : 0;\n  auto _vector_of_non_owning_references = _o->vector_of_non_owning_references.size() ? _fbb.CreateVector<uint64_t>(_o->vector_of_non_owning_references.size(), [](size_t i, _VectorArgs *__va) { return __va->__rehasher ? static_cast<uint64_t>((*__va->__rehasher)(__va->__o->vector_of_non_owning_references[i])) : 0; }, &_va ) : 0;\n  auto _any_unique_type = _o->any_unique.type;\n  auto _any_unique = _o->any_unique.Pack(_fbb);\n  auto _any_ambiguous_type = _o->any_ambiguous.type;\n  auto _any_ambiguous = _o->any_ambiguous.Pack(_fbb);\n  auto _vector_of_enums = _o->vector_of_enums.size() ? _fbb.CreateVectorScalarCast<uint8_t>(::flatbuffers::data(_o->vector_of_enums), _o->vector_of_enums.size()) : 0;\n  auto _signed_enum = _o->signed_enum;\n  auto _testrequirednestedflatbuffer = _o->testrequirednestedflatbuffer.size() ? _fbb.CreateVector(_o->testrequirednestedflatbuffer) : 0;\n  auto _scalar_key_sorted_tables = _o->scalar_key_sorted_tables.size() ? _fbb.CreateVector<::flatbuffers::Offset<MyGame::Example::Stat>> (_o->scalar_key_sorted_tables.size(), [](size_t i, _VectorArgs *__va) { return MyGame::Example::CreateStat(*__va->__fbb, __va->__o->scalar_key_sorted_tables[i].get(), __va->__rehasher); }, &_va ) : 0;\n  auto _native_inline = &_o->native_inline;\n  auto _long_enum_non_enum_default = _o->long_enum_non_enum_default;\n  auto _long_enum_normal_default = _o->long_enum_normal_default;\n  auto _nan_default = _o->nan_default;\n  auto _inf_default = _o->inf_default;\n  auto _positive_inf_default = _o->positive_inf_default;\n  auto _infinity_default = _o->infinity_default;\n  auto _positive_infinity_default = _o->positive_infinity_default;\n  auto _negative_inf_default = _o->negative_inf_default;\n  auto _negative_infinity_default = _o->negative_infinity_default;\n  auto _double_inf_default = _o->double_inf_default;\n  return MyGame::Example::CreateMonster(\n      _fbb,\n      _pos,\n      _mana,\n      _hp,\n      _name,\n      _inventory,\n      _color,\n      _test_type,\n      _test,\n      _test4,\n      _testarrayofstring,\n      _testarrayoftables,\n      _enemy,\n      _testnestedflatbuffer,\n      _testempty,\n      _testbool,\n      _testhashs32_fnv1,\n      _testhashu32_fnv1,\n      _testhashs64_fnv1,\n      _testhashu64_fnv1,\n      _testhashs32_fnv1a,\n      _testhashu32_fnv1a,\n      _testhashs64_fnv1a,\n      _testhashu64_fnv1a,\n      _testarrayofbools,\n      _testf,\n      _testf2,\n      _testf3,\n      _testarrayofstring2,\n      _testarrayofsortedstruct,\n      _flex,\n      _test5,\n      _vector_of_longs,\n      _vector_of_doubles,\n      _parent_namespace_test,\n      _vector_of_referrables,\n      _single_weak_reference,\n      _vector_of_weak_references,\n      _vector_of_strong_referrables,\n      _co_owning_reference,\n      _vector_of_co_owning_references,\n      _non_owning_reference,\n      _vector_of_non_owning_references,\n      _any_unique_type,\n      _any_unique,\n      _any_ambiguous_type,\n      _any_ambiguous,\n      _vector_of_enums,\n      _signed_enum,\n      _testrequirednestedflatbuffer,\n      _scalar_key_sorted_tables,\n      _native_inline,\n      _long_enum_non_enum_default,\n      _long_enum_normal_default,\n      _nan_default,\n      _inf_default,\n      _positive_inf_default,\n      _infinity_default,\n      _positive_infinity_default,\n      _negative_inf_default,\n      _negative_infinity_default,\n      _double_inf_default);\n}\n\n\ninline bool operator==(const TypeAliasesT &lhs, const TypeAliasesT &rhs) {\n  return\n      (lhs.i8 == rhs.i8) &&\n      (lhs.u8 == rhs.u8) &&\n      (lhs.i16 == rhs.i16) &&\n      (lhs.u16 == rhs.u16) &&\n      (lhs.i32 == rhs.i32) &&\n      (lhs.u32 == rhs.u32) &&\n      (lhs.i64 == rhs.i64) &&\n      (lhs.u64 == rhs.u64) &&\n      (lhs.f32 == rhs.f32) &&\n      (lhs.f64 == rhs.f64) &&\n      (lhs.v8 == rhs.v8) &&\n      (lhs.vf64 == rhs.vf64);\n}\n\ninline bool operator!=(const TypeAliasesT &lhs, const TypeAliasesT &rhs) {\n    return !(lhs == rhs);\n}\n\n\ninline TypeAliasesT *TypeAliases::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {\n  auto _o = std::unique_ptr<TypeAliasesT>(new TypeAliasesT());\n  UnPackTo(_o.get(), _resolver);\n  return _o.release();\n}\n\ninline void TypeAliases::UnPackTo(TypeAliasesT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {\n  (void)_o;\n  (void)_resolver;\n  { auto _e = i8(); _o->i8 = _e; }\n  { auto _e = u8(); _o->u8 = _e; }\n  { auto _e = i16(); _o->i16 = _e; }\n  { auto _e = u16(); _o->u16 = _e; }\n  { auto _e = i32(); _o->i32 = _e; }\n  { auto _e = u32(); _o->u32 = _e; }\n  { auto _e = i64(); _o->i64 = _e; }\n  { auto _e = u64(); _o->u64 = _e; }\n  { auto _e = f32(); _o->f32 = _e; }\n  { auto _e = f64(); _o->f64 = _e; }\n  { auto _e = v8(); if (_e) { _o->v8.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->v8.begin()); } }\n  { auto _e = vf64(); if (_e) { _o->vf64.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vf64[_i] = _e->Get(_i); } } else { _o->vf64.resize(0); } }\n}\n\ninline ::flatbuffers::Offset<TypeAliases> CreateTypeAliases(::flatbuffers::FlatBufferBuilder &_fbb, const TypeAliasesT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  return TypeAliases::Pack(_fbb, _o, _rehasher);\n}\n\ninline ::flatbuffers::Offset<TypeAliases> TypeAliases::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const TypeAliasesT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  (void)_rehasher;\n  (void)_o;\n  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const TypeAliasesT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;\n  auto _i8 = _o->i8;\n  auto _u8 = _o->u8;\n  auto _i16 = _o->i16;\n  auto _u16 = _o->u16;\n  auto _i32 = _o->i32;\n  auto _u32 = _o->u32;\n  auto _i64 = _o->i64;\n  auto _u64 = _o->u64;\n  auto _f32 = _o->f32;\n  auto _f64 = _o->f64;\n  auto _v8 = _o->v8.size() ? _fbb.CreateVector(_o->v8) : 0;\n  auto _vf64 = _o->vf64.size() ? _fbb.CreateVector(_o->vf64) : 0;\n  return MyGame::Example::CreateTypeAliases(\n      _fbb,\n      _i8,\n      _u8,\n      _i16,\n      _u16,\n      _i32,\n      _u32,\n      _i64,\n      _u64,\n      _f32,\n      _f64,\n      _v8,\n      _vf64);\n}\n\ntemplate <bool B>\ninline bool VerifyAny(::flatbuffers::VerifierTemplate<B> &verifier, const void *obj, Any type) {\n  switch (type) {\n    case Any_NONE: {\n      return true;\n    }\n    case Any_Monster: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return verifier.VerifyTable(ptr);\n    }\n    case Any_TestSimpleTableWithEnum: {\n      auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnum *>(obj);\n      return verifier.VerifyTable(ptr);\n    }\n    case Any_MyGame_Example2_Monster: {\n      auto ptr = reinterpret_cast<const MyGame::Example2::Monster *>(obj);\n      return verifier.VerifyTable(ptr);\n    }\n    default: return true;\n  }\n}\n\ntemplate <bool B>\ninline bool VerifyAnyVector(::flatbuffers::VerifierTemplate<B> &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types) {\n  if (!values || !types) return !values && !types;\n  if (values->size() != types->size()) return false;\n  for (::flatbuffers::uoffset_t i = 0; i < values->size(); ++i) {\n    if (!VerifyAny(\n        verifier,  values->Get(i), types->GetEnum<Any>(i))) {\n      return false;\n    }\n  }\n  return true;\n}\n\ninline void *AnyUnion::UnPack(const void *obj, Any type, const ::flatbuffers::resolver_function_t *resolver) {\n  (void)resolver;\n  switch (type) {\n    case Any_Monster: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return ptr->UnPack(resolver);\n    }\n    case Any_TestSimpleTableWithEnum: {\n      auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnum *>(obj);\n      return ptr->UnPack(resolver);\n    }\n    case Any_MyGame_Example2_Monster: {\n      auto ptr = reinterpret_cast<const MyGame::Example2::Monster *>(obj);\n      return ptr->UnPack(resolver);\n    }\n    default: return nullptr;\n  }\n}\n\ninline ::flatbuffers::Offset<void> AnyUnion::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ::flatbuffers::rehasher_function_t *_rehasher) const {\n  (void)_rehasher;\n  switch (type) {\n    case Any_Monster: {\n      auto ptr = reinterpret_cast<const MyGame::Example::MonsterT *>(value);\n      return CreateMonster(_fbb, ptr, _rehasher).Union();\n    }\n    case Any_TestSimpleTableWithEnum: {\n      auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(value);\n      return CreateTestSimpleTableWithEnum(_fbb, ptr, _rehasher).Union();\n    }\n    case Any_MyGame_Example2_Monster: {\n      auto ptr = reinterpret_cast<const MyGame::Example2::MonsterT *>(value);\n      return CreateMonster(_fbb, ptr, _rehasher).Union();\n    }\n    default: return 0;\n  }\n}\n\ninline AnyUnion::AnyUnion(const AnyUnion &u) : type(u.type), value(nullptr) {\n  switch (type) {\n    case Any_Monster: {\n      value = new MyGame::Example::MonsterT(*reinterpret_cast<MyGame::Example::MonsterT *>(u.value));\n      break;\n    }\n    case Any_TestSimpleTableWithEnum: {\n      value = new MyGame::Example::TestSimpleTableWithEnumT(*reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(u.value));\n      break;\n    }\n    case Any_MyGame_Example2_Monster: {\n      value = new MyGame::Example2::MonsterT(*reinterpret_cast<MyGame::Example2::MonsterT *>(u.value));\n      break;\n    }\n    default:\n      break;\n  }\n}\n\ninline void AnyUnion::Reset() {\n  switch (type) {\n    case Any_Monster: {\n      auto ptr = reinterpret_cast<MyGame::Example::MonsterT *>(value);\n      delete ptr;\n      break;\n    }\n    case Any_TestSimpleTableWithEnum: {\n      auto ptr = reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(value);\n      delete ptr;\n      break;\n    }\n    case Any_MyGame_Example2_Monster: {\n      auto ptr = reinterpret_cast<MyGame::Example2::MonsterT *>(value);\n      delete ptr;\n      break;\n    }\n    default: break;\n  }\n  value = nullptr;\n  type = Any_NONE;\n}\n\ntemplate <bool B>\ninline bool VerifyAnyUniqueAliases(::flatbuffers::VerifierTemplate<B> &verifier, const void *obj, AnyUniqueAliases type) {\n  switch (type) {\n    case AnyUniqueAliases_NONE: {\n      return true;\n    }\n    case AnyUniqueAliases_M: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return verifier.VerifyTable(ptr);\n    }\n    case AnyUniqueAliases_TS: {\n      auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnum *>(obj);\n      return verifier.VerifyTable(ptr);\n    }\n    case AnyUniqueAliases_M2: {\n      auto ptr = reinterpret_cast<const MyGame::Example2::Monster *>(obj);\n      return verifier.VerifyTable(ptr);\n    }\n    default: return true;\n  }\n}\n\ntemplate <bool B>\ninline bool VerifyAnyUniqueAliasesVector(::flatbuffers::VerifierTemplate<B> &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types) {\n  if (!values || !types) return !values && !types;\n  if (values->size() != types->size()) return false;\n  for (::flatbuffers::uoffset_t i = 0; i < values->size(); ++i) {\n    if (!VerifyAnyUniqueAliases(\n        verifier,  values->Get(i), types->GetEnum<AnyUniqueAliases>(i))) {\n      return false;\n    }\n  }\n  return true;\n}\n\ninline void *AnyUniqueAliasesUnion::UnPack(const void *obj, AnyUniqueAliases type, const ::flatbuffers::resolver_function_t *resolver) {\n  (void)resolver;\n  switch (type) {\n    case AnyUniqueAliases_M: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return ptr->UnPack(resolver);\n    }\n    case AnyUniqueAliases_TS: {\n      auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnum *>(obj);\n      return ptr->UnPack(resolver);\n    }\n    case AnyUniqueAliases_M2: {\n      auto ptr = reinterpret_cast<const MyGame::Example2::Monster *>(obj);\n      return ptr->UnPack(resolver);\n    }\n    default: return nullptr;\n  }\n}\n\ninline ::flatbuffers::Offset<void> AnyUniqueAliasesUnion::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ::flatbuffers::rehasher_function_t *_rehasher) const {\n  (void)_rehasher;\n  switch (type) {\n    case AnyUniqueAliases_M: {\n      auto ptr = reinterpret_cast<const MyGame::Example::MonsterT *>(value);\n      return CreateMonster(_fbb, ptr, _rehasher).Union();\n    }\n    case AnyUniqueAliases_TS: {\n      auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(value);\n      return CreateTestSimpleTableWithEnum(_fbb, ptr, _rehasher).Union();\n    }\n    case AnyUniqueAliases_M2: {\n      auto ptr = reinterpret_cast<const MyGame::Example2::MonsterT *>(value);\n      return CreateMonster(_fbb, ptr, _rehasher).Union();\n    }\n    default: return 0;\n  }\n}\n\ninline AnyUniqueAliasesUnion::AnyUniqueAliasesUnion(const AnyUniqueAliasesUnion &u) : type(u.type), value(nullptr) {\n  switch (type) {\n    case AnyUniqueAliases_M: {\n      value = new MyGame::Example::MonsterT(*reinterpret_cast<MyGame::Example::MonsterT *>(u.value));\n      break;\n    }\n    case AnyUniqueAliases_TS: {\n      value = new MyGame::Example::TestSimpleTableWithEnumT(*reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(u.value));\n      break;\n    }\n    case AnyUniqueAliases_M2: {\n      value = new MyGame::Example2::MonsterT(*reinterpret_cast<MyGame::Example2::MonsterT *>(u.value));\n      break;\n    }\n    default:\n      break;\n  }\n}\n\ninline void AnyUniqueAliasesUnion::Reset() {\n  switch (type) {\n    case AnyUniqueAliases_M: {\n      auto ptr = reinterpret_cast<MyGame::Example::MonsterT *>(value);\n      delete ptr;\n      break;\n    }\n    case AnyUniqueAliases_TS: {\n      auto ptr = reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(value);\n      delete ptr;\n      break;\n    }\n    case AnyUniqueAliases_M2: {\n      auto ptr = reinterpret_cast<MyGame::Example2::MonsterT *>(value);\n      delete ptr;\n      break;\n    }\n    default: break;\n  }\n  value = nullptr;\n  type = AnyUniqueAliases_NONE;\n}\n\ntemplate <bool B>\ninline bool VerifyAnyAmbiguousAliases(::flatbuffers::VerifierTemplate<B> &verifier, const void *obj, AnyAmbiguousAliases type) {\n  switch (type) {\n    case AnyAmbiguousAliases_NONE: {\n      return true;\n    }\n    case AnyAmbiguousAliases_M1: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return verifier.VerifyTable(ptr);\n    }\n    case AnyAmbiguousAliases_M2: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return verifier.VerifyTable(ptr);\n    }\n    case AnyAmbiguousAliases_M3: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return verifier.VerifyTable(ptr);\n    }\n    default: return true;\n  }\n}\n\ntemplate <bool B>\ninline bool VerifyAnyAmbiguousAliasesVector(::flatbuffers::VerifierTemplate<B> &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types) {\n  if (!values || !types) return !values && !types;\n  if (values->size() != types->size()) return false;\n  for (::flatbuffers::uoffset_t i = 0; i < values->size(); ++i) {\n    if (!VerifyAnyAmbiguousAliases(\n        verifier,  values->Get(i), types->GetEnum<AnyAmbiguousAliases>(i))) {\n      return false;\n    }\n  }\n  return true;\n}\n\ninline void *AnyAmbiguousAliasesUnion::UnPack(const void *obj, AnyAmbiguousAliases type, const ::flatbuffers::resolver_function_t *resolver) {\n  (void)resolver;\n  switch (type) {\n    case AnyAmbiguousAliases_M1: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return ptr->UnPack(resolver);\n    }\n    case AnyAmbiguousAliases_M2: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return ptr->UnPack(resolver);\n    }\n    case AnyAmbiguousAliases_M3: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return ptr->UnPack(resolver);\n    }\n    default: return nullptr;\n  }\n}\n\ninline ::flatbuffers::Offset<void> AnyAmbiguousAliasesUnion::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ::flatbuffers::rehasher_function_t *_rehasher) const {\n  (void)_rehasher;\n  switch (type) {\n    case AnyAmbiguousAliases_M1: {\n      auto ptr = reinterpret_cast<const MyGame::Example::MonsterT *>(value);\n      return CreateMonster(_fbb, ptr, _rehasher).Union();\n    }\n    case AnyAmbiguousAliases_M2: {\n      auto ptr = reinterpret_cast<const MyGame::Example::MonsterT *>(value);\n      return CreateMonster(_fbb, ptr, _rehasher).Union();\n    }\n    case AnyAmbiguousAliases_M3: {\n      auto ptr = reinterpret_cast<const MyGame::Example::MonsterT *>(value);\n      return CreateMonster(_fbb, ptr, _rehasher).Union();\n    }\n    default: return 0;\n  }\n}\n\ninline AnyAmbiguousAliasesUnion::AnyAmbiguousAliasesUnion(const AnyAmbiguousAliasesUnion &u) : type(u.type), value(nullptr) {\n  switch (type) {\n    case AnyAmbiguousAliases_M1: {\n      value = new MyGame::Example::MonsterT(*reinterpret_cast<MyGame::Example::MonsterT *>(u.value));\n      break;\n    }\n    case AnyAmbiguousAliases_M2: {\n      value = new MyGame::Example::MonsterT(*reinterpret_cast<MyGame::Example::MonsterT *>(u.value));\n      break;\n    }\n    case AnyAmbiguousAliases_M3: {\n      value = new MyGame::Example::MonsterT(*reinterpret_cast<MyGame::Example::MonsterT *>(u.value));\n      break;\n    }\n    default:\n      break;\n  }\n}\n\ninline void AnyAmbiguousAliasesUnion::Reset() {\n  switch (type) {\n    case AnyAmbiguousAliases_M1: {\n      auto ptr = reinterpret_cast<MyGame::Example::MonsterT *>(value);\n      delete ptr;\n      break;\n    }\n    case AnyAmbiguousAliases_M2: {\n      auto ptr = reinterpret_cast<MyGame::Example::MonsterT *>(value);\n      delete ptr;\n      break;\n    }\n    case AnyAmbiguousAliases_M3: {\n      auto ptr = reinterpret_cast<MyGame::Example::MonsterT *>(value);\n      delete ptr;\n      break;\n    }\n    default: break;\n  }\n  value = nullptr;\n  type = AnyAmbiguousAliases_NONE;\n}\n\ninline const ::flatbuffers::TypeTable *ColorTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_UCHAR, 0, 0 },\n    { ::flatbuffers::ET_UCHAR, 0, 0 },\n    { ::flatbuffers::ET_UCHAR, 0, 0 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::ColorTypeTable\n  };\n  static const int64_t values[] = { 1, 2, 8 };\n  static const char * const names[] = {\n    \"Red\",\n    \"Green\",\n    \"Blue\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_ENUM, 3, type_codes, type_refs, nullptr, values, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *RaceTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_CHAR, 0, 0 },\n    { ::flatbuffers::ET_CHAR, 0, 0 },\n    { ::flatbuffers::ET_CHAR, 0, 0 },\n    { ::flatbuffers::ET_CHAR, 0, 0 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::RaceTypeTable\n  };\n  static const int64_t values[] = { -1, 0, 1, 2 };\n  static const char * const names[] = {\n    \"None\",\n    \"Human\",\n    \"Dwarf\",\n    \"Elf\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_ENUM, 4, type_codes, type_refs, nullptr, values, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *LongEnumTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_ULONG, 0, 0 },\n    { ::flatbuffers::ET_ULONG, 0, 0 },\n    { ::flatbuffers::ET_ULONG, 0, 0 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::LongEnumTypeTable\n  };\n  static const int64_t values[] = { 2ULL, 4ULL, 1099511627776ULL };\n  static const char * const names[] = {\n    \"LongOne\",\n    \"LongTwo\",\n    \"LongBig\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_ENUM, 3, type_codes, type_refs, nullptr, values, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *AnyTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_SEQUENCE, 0, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 0 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 1 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 2 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::MonsterTypeTable,\n    MyGame::Example::TestSimpleTableWithEnumTypeTable,\n    MyGame::Example2::MonsterTypeTable\n  };\n  static const char * const names[] = {\n    \"NONE\",\n    \"Monster\",\n    \"TestSimpleTableWithEnum\",\n    \"MyGame_Example2_Monster\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, nullptr, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *AnyUniqueAliasesTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_SEQUENCE, 0, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 0 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 1 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 2 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::MonsterTypeTable,\n    MyGame::Example::TestSimpleTableWithEnumTypeTable,\n    MyGame::Example2::MonsterTypeTable\n  };\n  static const char * const names[] = {\n    \"NONE\",\n    \"M\",\n    \"TS\",\n    \"M2\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, nullptr, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *AnyAmbiguousAliasesTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_SEQUENCE, 0, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 0 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 0 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 0 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::MonsterTypeTable\n  };\n  static const char * const names[] = {\n    \"NONE\",\n    \"M1\",\n    \"M2\",\n    \"M3\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, nullptr, names\n  };\n  return &tt;\n}\n\n}  // namespace Example\n\ninline const ::flatbuffers::TypeTable *InParentNamespaceTypeTable() {\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_TABLE, 0, nullptr, nullptr, nullptr, nullptr, nullptr\n  };\n  return &tt;\n}\n\nnamespace Example2 {\n\ninline const ::flatbuffers::TypeTable *MonsterTypeTable() {\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_TABLE, 0, nullptr, nullptr, nullptr, nullptr, nullptr\n  };\n  return &tt;\n}\n\n}  // namespace Example2\n\nnamespace Example {\n\ninline const ::flatbuffers::TypeTable *TestTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_SHORT, 0, -1 },\n    { ::flatbuffers::ET_CHAR, 0, -1 }\n  };\n  static const int64_t values[] = { 0, 2, 4 };\n  static const char * const names[] = {\n    \"a\",\n    \"b\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_STRUCT, 2, type_codes, nullptr, nullptr, values, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *TestSimpleTableWithEnumTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_UCHAR, 0, 0 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::ColorTypeTable\n  };\n  static const char * const names[] = {\n    \"color\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_TABLE, 1, type_codes, type_refs, nullptr, nullptr, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *Vec3TypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_DOUBLE, 0, -1 },\n    { ::flatbuffers::ET_UCHAR, 0, 0 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 1 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::ColorTypeTable,\n    MyGame::Example::TestTypeTable\n  };\n  static const int64_t values[] = { 0, 4, 8, 16, 24, 26, 32 };\n  static const char * const names[] = {\n    \"x\",\n    \"y\",\n    \"z\",\n    \"test1\",\n    \"test2\",\n    \"test3\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_STRUCT, 6, type_codes, type_refs, nullptr, values, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *AbilityTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_UINT, 0, -1 },\n    { ::flatbuffers::ET_UINT, 0, -1 }\n  };\n  static const int64_t values[] = { 0, 4, 8 };\n  static const char * const names[] = {\n    \"id\",\n    \"distance\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_STRUCT, 2, type_codes, nullptr, nullptr, values, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *StructOfStructsTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_SEQUENCE, 0, 0 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 1 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 0 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::AbilityTypeTable,\n    MyGame::Example::TestTypeTable\n  };\n  static const int64_t values[] = { 0, 8, 12, 20 };\n  static const char * const names[] = {\n    \"a\",\n    \"b\",\n    \"c\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_STRUCT, 3, type_codes, type_refs, nullptr, values, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *StructOfStructsOfStructsTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_SEQUENCE, 0, 0 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::StructOfStructsTypeTable\n  };\n  static const int64_t values[] = { 0, 20 };\n  static const char * const names[] = {\n    \"a\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_STRUCT, 1, type_codes, type_refs, nullptr, values, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *StatTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_STRING, 0, -1 },\n    { ::flatbuffers::ET_LONG, 0, -1 },\n    { ::flatbuffers::ET_USHORT, 0, -1 }\n  };\n  static const char * const names[] = {\n    \"id\",\n    \"val\",\n    \"count\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_TABLE, 3, type_codes, nullptr, nullptr, nullptr, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *ReferrableTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_ULONG, 0, -1 }\n  };\n  static const char * const names[] = {\n    \"id\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_TABLE, 1, type_codes, nullptr, nullptr, nullptr, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *MonsterTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_SEQUENCE, 0, 0 },\n    { ::flatbuffers::ET_SHORT, 0, -1 },\n    { ::flatbuffers::ET_SHORT, 0, -1 },\n    { ::flatbuffers::ET_STRING, 0, -1 },\n    { ::flatbuffers::ET_BOOL, 0, -1 },\n    { ::flatbuffers::ET_UCHAR, 1, -1 },\n    { ::flatbuffers::ET_UCHAR, 0, 1 },\n    { ::flatbuffers::ET_UTYPE, 0, 2 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 2 },\n    { ::flatbuffers::ET_SEQUENCE, 1, 3 },\n    { ::flatbuffers::ET_STRING, 1, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 1, 4 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 4 },\n    { ::flatbuffers::ET_UCHAR, 1, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 5 },\n    { ::flatbuffers::ET_BOOL, 0, -1 },\n    { ::flatbuffers::ET_INT, 0, -1 },\n    { ::flatbuffers::ET_UINT, 0, -1 },\n    { ::flatbuffers::ET_LONG, 0, -1 },\n    { ::flatbuffers::ET_ULONG, 0, -1 },\n    { ::flatbuffers::ET_INT, 0, -1 },\n    { ::flatbuffers::ET_UINT, 0, -1 },\n    { ::flatbuffers::ET_LONG, 0, -1 },\n    { ::flatbuffers::ET_ULONG, 0, -1 },\n    { ::flatbuffers::ET_BOOL, 1, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_STRING, 1, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 1, 6 },\n    { ::flatbuffers::ET_UCHAR, 1, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 1, 3 },\n    { ::flatbuffers::ET_LONG, 1, -1 },\n    { ::flatbuffers::ET_DOUBLE, 1, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 7 },\n    { ::flatbuffers::ET_SEQUENCE, 1, 8 },\n    { ::flatbuffers::ET_ULONG, 0, -1 },\n    { ::flatbuffers::ET_ULONG, 1, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 1, 8 },\n    { ::flatbuffers::ET_ULONG, 0, -1 },\n    { ::flatbuffers::ET_ULONG, 1, -1 },\n    { ::flatbuffers::ET_ULONG, 0, -1 },\n    { ::flatbuffers::ET_ULONG, 1, -1 },\n    { ::flatbuffers::ET_UTYPE, 0, 9 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 9 },\n    { ::flatbuffers::ET_UTYPE, 0, 10 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 10 },\n    { ::flatbuffers::ET_UCHAR, 1, 1 },\n    { ::flatbuffers::ET_CHAR, 0, 11 },\n    { ::flatbuffers::ET_UCHAR, 1, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 1, 5 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 3 },\n    { ::flatbuffers::ET_ULONG, 0, 12 },\n    { ::flatbuffers::ET_ULONG, 0, 12 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_DOUBLE, 0, -1 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::Vec3TypeTable,\n    MyGame::Example::ColorTypeTable,\n    MyGame::Example::AnyTypeTable,\n    MyGame::Example::TestTypeTable,\n    MyGame::Example::MonsterTypeTable,\n    MyGame::Example::StatTypeTable,\n    MyGame::Example::AbilityTypeTable,\n    MyGame::InParentNamespaceTypeTable,\n    MyGame::Example::ReferrableTypeTable,\n    MyGame::Example::AnyUniqueAliasesTypeTable,\n    MyGame::Example::AnyAmbiguousAliasesTypeTable,\n    MyGame::Example::RaceTypeTable,\n    MyGame::Example::LongEnumTypeTable\n  };\n  static const char * const names[] = {\n    \"pos\",\n    \"mana\",\n    \"hp\",\n    \"name\",\n    \"friendly\",\n    \"inventory\",\n    \"color\",\n    \"test_type\",\n    \"test\",\n    \"test4\",\n    \"testarrayofstring\",\n    \"testarrayoftables\",\n    \"enemy\",\n    \"testnestedflatbuffer\",\n    \"testempty\",\n    \"testbool\",\n    \"testhashs32_fnv1\",\n    \"testhashu32_fnv1\",\n    \"testhashs64_fnv1\",\n    \"testhashu64_fnv1\",\n    \"testhashs32_fnv1a\",\n    \"testhashu32_fnv1a\",\n    \"testhashs64_fnv1a\",\n    \"testhashu64_fnv1a\",\n    \"testarrayofbools\",\n    \"testf\",\n    \"testf2\",\n    \"testf3\",\n    \"testarrayofstring2\",\n    \"testarrayofsortedstruct\",\n    \"flex\",\n    \"test5\",\n    \"vector_of_longs\",\n    \"vector_of_doubles\",\n    \"parent_namespace_test\",\n    \"vector_of_referrables\",\n    \"single_weak_reference\",\n    \"vector_of_weak_references\",\n    \"vector_of_strong_referrables\",\n    \"co_owning_reference\",\n    \"vector_of_co_owning_references\",\n    \"non_owning_reference\",\n    \"vector_of_non_owning_references\",\n    \"any_unique_type\",\n    \"any_unique\",\n    \"any_ambiguous_type\",\n    \"any_ambiguous\",\n    \"vector_of_enums\",\n    \"signed_enum\",\n    \"testrequirednestedflatbuffer\",\n    \"scalar_key_sorted_tables\",\n    \"native_inline\",\n    \"long_enum_non_enum_default\",\n    \"long_enum_normal_default\",\n    \"nan_default\",\n    \"inf_default\",\n    \"positive_inf_default\",\n    \"infinity_default\",\n    \"positive_infinity_default\",\n    \"negative_inf_default\",\n    \"negative_infinity_default\",\n    \"double_inf_default\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_TABLE, 62, type_codes, type_refs, nullptr, nullptr, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *TypeAliasesTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_CHAR, 0, -1 },\n    { ::flatbuffers::ET_UCHAR, 0, -1 },\n    { ::flatbuffers::ET_SHORT, 0, -1 },\n    { ::flatbuffers::ET_USHORT, 0, -1 },\n    { ::flatbuffers::ET_INT, 0, -1 },\n    { ::flatbuffers::ET_UINT, 0, -1 },\n    { ::flatbuffers::ET_LONG, 0, -1 },\n    { ::flatbuffers::ET_ULONG, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_DOUBLE, 0, -1 },\n    { ::flatbuffers::ET_CHAR, 1, -1 },\n    { ::flatbuffers::ET_DOUBLE, 1, -1 }\n  };\n  static const char * const names[] = {\n    \"i8\",\n    \"u8\",\n    \"i16\",\n    \"u16\",\n    \"i32\",\n    \"u32\",\n    \"i64\",\n    \"u64\",\n    \"f32\",\n    \"f64\",\n    \"v8\",\n    \"vf64\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_TABLE, 12, type_codes, nullptr, nullptr, nullptr, names\n  };\n  return &tt;\n}\n\ninline const MyGame::Example::Monster *GetMonster(const void *buf) {\n  return ::flatbuffers::GetRoot<MyGame::Example::Monster>(buf);\n}\n\ninline const MyGame::Example::Monster *GetSizePrefixedMonster(const void *buf) {\n  return ::flatbuffers::GetSizePrefixedRoot<MyGame::Example::Monster>(buf);\n}\n\ninline Monster *GetMutableMonster(void *buf) {\n  return ::flatbuffers::GetMutableRoot<Monster>(buf);\n}\n\ninline MyGame::Example::Monster *GetMutableSizePrefixedMonster(void *buf) {\n  return ::flatbuffers::GetMutableSizePrefixedRoot<MyGame::Example::Monster>(buf);\n}\n\ninline const char *MonsterIdentifier() {\n  return \"MONS\";\n}\n\ninline bool MonsterBufferHasIdentifier(const void *buf) {\n  return ::flatbuffers::BufferHasIdentifier(\n      buf, MonsterIdentifier());\n}\n\ninline bool SizePrefixedMonsterBufferHasIdentifier(const void *buf) {\n  return ::flatbuffers::BufferHasIdentifier(\n      buf, MonsterIdentifier(), true);\n}\n\ntemplate <bool B = false>\ninline bool VerifyMonsterBuffer(\n    ::flatbuffers::VerifierTemplate<B> &verifier) {\n  return verifier.template VerifyBuffer<MyGame::Example::Monster>(MonsterIdentifier());\n}\n\ntemplate <bool B = false>\ninline bool VerifySizePrefixedMonsterBuffer(\n    ::flatbuffers::VerifierTemplate<B> &verifier) {\n  return verifier.template VerifySizePrefixedBuffer<MyGame::Example::Monster>(MonsterIdentifier());\n}\n\ninline const char *MonsterExtension() {\n  return \"mon\";\n}\n\ninline void FinishMonsterBuffer(\n    ::flatbuffers::FlatBufferBuilder &fbb,\n    ::flatbuffers::Offset<MyGame::Example::Monster> root) {\n  fbb.Finish(root, MonsterIdentifier());\n}\n\ninline void FinishSizePrefixedMonsterBuffer(\n    ::flatbuffers::FlatBufferBuilder &fbb,\n    ::flatbuffers::Offset<MyGame::Example::Monster> root) {\n  fbb.FinishSizePrefixed(root, MonsterIdentifier());\n}\n\ninline std::unique_ptr<MyGame::Example::MonsterT> UnPackMonster(\n    const void *buf,\n    const ::flatbuffers::resolver_function_t *res = nullptr) {\n  return std::unique_ptr<MyGame::Example::MonsterT>(GetMonster(buf)->UnPack(res));\n}\n\ninline std::unique_ptr<MyGame::Example::MonsterT> UnPackSizePrefixedMonster(\n    const void *buf,\n    const ::flatbuffers::resolver_function_t *res = nullptr) {\n  return std::unique_ptr<MyGame::Example::MonsterT>(GetSizePrefixedMonster(buf)->UnPack(res));\n}\n\n}  // namespace Example\n}  // namespace MyGame\n\n#endif  // FLATBUFFERS_GENERATED_MONSTERTEST_MYGAME_EXAMPLE_H_\n"
  },
  {
    "path": "tests/monster_test_suffix/filesuffix_only/monster_test.grpc.fb.cc",
    "content": "// Generated by the gRPC C++ plugin.\n// FlatBuffers modified generator: native gRPC callback client API enabled when --grpc-callback-api.\n// source: monster_test\n\n#include \"monster_test_suffix.h\"\n#include \"monster_test.grpc.fb.h\"\n\n#include <grpcpp/impl/codegen/async_stream.h>\n#include <grpcpp/impl/codegen/async_unary_call.h>\n#include <grpcpp/impl/codegen/channel_interface.h>\n#include <grpcpp/impl/codegen/client_unary_call.h>\n#include <grpcpp/impl/codegen/method_handler.h>\n#include <grpcpp/impl/codegen/rpc_service_method.h>\n#include <grpcpp/impl/codegen/service_type.h>\n#include <grpcpp/impl/codegen/sync_stream.h>\nnamespace MyGame {\nnamespace Example {\n\nstatic const char* MonsterStorage_method_names[] = {\n  \"/MyGame.Example.MonsterStorage/Store\",\n  \"/MyGame.Example.MonsterStorage/Retrieve\",\n  \"/MyGame.Example.MonsterStorage/GetMaxHitPoint\",\n  \"/MyGame.Example.MonsterStorage/GetMinMaxHitPoints\",\n};\n\nstd::unique_ptr< MonsterStorage::Stub> MonsterStorage::NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& /*options*/) {\n  std::unique_ptr< MonsterStorage::Stub> stub(new MonsterStorage::Stub(channel));\n  return stub;\n}\n\nMonsterStorage::Stub::Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel)\n  : channel_(channel)  , rpcmethod_Store_(MonsterStorage_method_names[0], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)\n  , rpcmethod_Retrieve_(MonsterStorage_method_names[1], ::grpc::internal::RpcMethod::SERVER_STREAMING, channel)\n  , rpcmethod_GetMaxHitPoint_(MonsterStorage_method_names[2], ::grpc::internal::RpcMethod::CLIENT_STREAMING, channel)\n  , rpcmethod_GetMinMaxHitPoints_(MonsterStorage_method_names[3], ::grpc::internal::RpcMethod::BIDI_STREAMING, channel)\n  {}\n  \n::grpc::Status MonsterStorage::Stub::Store(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, flatbuffers::grpc::Message<Stat>* response) {\n  return ::grpc::internal::BlockingUnaryCall(channel_.get(), rpcmethod_Store_, context, request, response);\n}\n\n::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>* MonsterStorage::Stub::AsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {\n  return ::grpc::internal::ClientAsyncResponseReaderFactory< flatbuffers::grpc::Message<Stat>>::Create(channel_.get(), cq, rpcmethod_Store_, context, request, true);\n}\n\n::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>* MonsterStorage::Stub::PrepareAsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {\n  return ::grpc::internal::ClientAsyncResponseReaderFactory< flatbuffers::grpc::Message<Stat>>::Create(channel_.get(), cq, rpcmethod_Store_, context, request, false);\n}\n\n::grpc::ClientReader< flatbuffers::grpc::Message<Monster>>* MonsterStorage::Stub::RetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) {\n  return ::grpc::internal::ClientReaderFactory< flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), rpcmethod_Retrieve_, context, request);\n}\n\n::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>* MonsterStorage::Stub::AsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) {\n  return ::grpc::internal::ClientAsyncReaderFactory< flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), cq, rpcmethod_Retrieve_, context, request, true, tag);\n}\n\n::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>* MonsterStorage::Stub::PrepareAsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq) {\n  return ::grpc::internal::ClientAsyncReaderFactory< flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), cq, rpcmethod_Retrieve_, context, request, false, nullptr);\n}\n\n::grpc::ClientWriter< flatbuffers::grpc::Message<Monster>>* MonsterStorage::Stub::GetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response) {\n  return ::grpc::internal::ClientWriterFactory< flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), rpcmethod_GetMaxHitPoint_, context, response);\n}\n\n::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>* MonsterStorage::Stub::AsyncGetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq, void* tag) {\n  return ::grpc::internal::ClientAsyncWriterFactory< flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), cq, rpcmethod_GetMaxHitPoint_, context, response, true, tag);\n}\n\n::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>* MonsterStorage::Stub::PrepareAsyncGetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq) {\n  return ::grpc::internal::ClientAsyncWriterFactory< flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), cq, rpcmethod_GetMaxHitPoint_, context, response, false, nullptr);\n}\n\n::grpc::ClientReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* MonsterStorage::Stub::GetMinMaxHitPointsRaw(::grpc::ClientContext* context) {\n  return ::grpc::internal::ClientReaderWriterFactory< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>::Create(channel_.get(), rpcmethod_GetMinMaxHitPoints_, context);\n}\n\n::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* MonsterStorage::Stub::AsyncGetMinMaxHitPointsRaw(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq, void* tag) {\n  return ::grpc::internal::ClientAsyncReaderWriterFactory< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>::Create(channel_.get(), cq, rpcmethod_GetMinMaxHitPoints_, context, true, tag);\n}\n\n::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* MonsterStorage::Stub::PrepareAsyncGetMinMaxHitPointsRaw(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq) {\n  return ::grpc::internal::ClientAsyncReaderWriterFactory< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>::Create(channel_.get(), cq, rpcmethod_GetMinMaxHitPoints_, context, false, nullptr);\n}\n\nMonsterStorage::Service::Service() {\n  AddMethod(new ::grpc::internal::RpcServiceMethod(\n      MonsterStorage_method_names[0],\n      ::grpc::internal::RpcMethod::NORMAL_RPC,\n      new ::grpc::internal::RpcMethodHandler< MonsterStorage::Service, flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>(\n          std::mem_fn(&MonsterStorage::Service::Store), this)));\n  AddMethod(new ::grpc::internal::RpcServiceMethod(\n      MonsterStorage_method_names[1],\n      ::grpc::internal::RpcMethod::SERVER_STREAMING,\n      new ::grpc::internal::ServerStreamingHandler< MonsterStorage::Service, flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>(\n          std::mem_fn(&MonsterStorage::Service::Retrieve), this)));\n  AddMethod(new ::grpc::internal::RpcServiceMethod(\n      MonsterStorage_method_names[2],\n      ::grpc::internal::RpcMethod::CLIENT_STREAMING,\n      new ::grpc::internal::ClientStreamingHandler< MonsterStorage::Service, flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>(\n          std::mem_fn(&MonsterStorage::Service::GetMaxHitPoint), this)));\n  AddMethod(new ::grpc::internal::RpcServiceMethod(\n      MonsterStorage_method_names[3],\n      ::grpc::internal::RpcMethod::BIDI_STREAMING,\n      new ::grpc::internal::BidiStreamingHandler< MonsterStorage::Service, flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>(\n          std::mem_fn(&MonsterStorage::Service::GetMinMaxHitPoints), this)));\n}\n\nMonsterStorage::Service::~Service() {\n}\n\n::grpc::Status MonsterStorage::Service::Store(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Monster>* /*request*/, flatbuffers::grpc::Message<Stat>* /*response*/) {\n  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n}\n\n::grpc::Status MonsterStorage::Service::Retrieve(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Stat>* /*request*/, ::grpc::ServerWriter< flatbuffers::grpc::Message<Monster>>* /*writer*/) {\n  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n}\n\n::grpc::Status MonsterStorage::Service::GetMaxHitPoint(::grpc::ServerContext* /*context*/, ::grpc::ServerReader< flatbuffers::grpc::Message<Monster>>* /*reader*/, flatbuffers::grpc::Message<Stat>* /*response*/) {\n  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n}\n\n::grpc::Status MonsterStorage::Service::GetMinMaxHitPoints(::grpc::ServerContext* /*context*/, ::grpc::ServerReaderWriter< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>* /*stream*/) {\n  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n}\n\n\n}  // namespace MyGame\n}  // namespace Example\n\n"
  },
  {
    "path": "tests/monster_test_suffix/filesuffix_only/monster_test.grpc.fb.h",
    "content": "// Generated by the gRPC C++ plugin.\n// If you make any local change, they will be lost.\n// source: monster_test\n#ifndef GRPC_monster_5ftest__INCLUDED\n#define GRPC_monster_5ftest__INCLUDED\n\n#include \"monster_test_suffix.h\"\n#include \"flatbuffers/grpc.h\"\n\n#include <grpcpp/impl/codegen/async_stream.h>\n#include <grpcpp/impl/codegen/async_unary_call.h>\n#include <grpcpp/impl/codegen/method_handler.h>\n#include <grpcpp/impl/codegen/proto_utils.h>\n#include <grpcpp/impl/codegen/rpc_method.h>\n#include <grpcpp/impl/codegen/service_type.h>\n#include <grpcpp/impl/codegen/status.h>\n#include <grpcpp/impl/codegen/stub_options.h>\n#include <grpcpp/impl/codegen/sync_stream.h>\n\nnamespace grpc {\nclass CompletionQueue;\nclass Channel;\nclass ServerCompletionQueue;\nclass ServerContext;\n}  // namespace grpc\n\nnamespace MyGame {\nnamespace Example {\n\nclass MonsterStorage final {\n public:\n  static constexpr char const* service_full_name() {\n    return \"MyGame.Example.MonsterStorage\";\n  }\n  class StubInterface {\n   public:\n    virtual ~StubInterface() {}\n    virtual ::grpc::Status Store(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, flatbuffers::grpc::Message<Stat>* response) = 0;\n    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>> AsyncStore(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>>(AsyncStoreRaw(context, request, cq));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>> PrepareAsyncStore(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>>(PrepareAsyncStoreRaw(context, request, cq));\n    }\n    std::unique_ptr< ::grpc::ClientReaderInterface< flatbuffers::grpc::Message<Monster>>> Retrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) {\n      return std::unique_ptr< ::grpc::ClientReaderInterface< flatbuffers::grpc::Message<Monster>>>(RetrieveRaw(context, request));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>> AsyncRetrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr< ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>>(AsyncRetrieveRaw(context, request, cq, tag));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>> PrepareAsyncRetrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>>(PrepareAsyncRetrieveRaw(context, request, cq));\n    }\n    std::unique_ptr< ::grpc::ClientWriterInterface< flatbuffers::grpc::Message<Monster>>> GetMaxHitPoint(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response) {\n      return std::unique_ptr< ::grpc::ClientWriterInterface< flatbuffers::grpc::Message<Monster>>>(GetMaxHitPointRaw(context, response));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncWriterInterface< flatbuffers::grpc::Message<Monster>>> AsyncGetMaxHitPoint(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr< ::grpc::ClientAsyncWriterInterface< flatbuffers::grpc::Message<Monster>>>(AsyncGetMaxHitPointRaw(context, response, cq, tag));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncWriterInterface< flatbuffers::grpc::Message<Monster>>> PrepareAsyncGetMaxHitPoint(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncWriterInterface< flatbuffers::grpc::Message<Monster>>>(PrepareAsyncGetMaxHitPointRaw(context, response, cq));\n    }\n    std::unique_ptr< ::grpc::ClientReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>> GetMinMaxHitPoints(::grpc::ClientContext* context) {\n      return std::unique_ptr< ::grpc::ClientReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>(GetMinMaxHitPointsRaw(context));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>> AsyncGetMinMaxHitPoints(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr< ::grpc::ClientAsyncReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>(AsyncGetMinMaxHitPointsRaw(context, cq, tag));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>> PrepareAsyncGetMinMaxHitPoints(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>(PrepareAsyncGetMinMaxHitPointsRaw(context, cq));\n    }\n  private:\n    virtual ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>* AsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) = 0;\n    virtual ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>* PrepareAsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) = 0;\n    virtual ::grpc::ClientReaderInterface< flatbuffers::grpc::Message<Monster>>* RetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) = 0;\n    virtual ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>* AsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) = 0;\n    virtual ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>* PrepareAsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq) = 0;\n    virtual ::grpc::ClientWriterInterface< flatbuffers::grpc::Message<Monster>>* GetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response) = 0;\n    virtual ::grpc::ClientAsyncWriterInterface< flatbuffers::grpc::Message<Monster>>* AsyncGetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq, void* tag) = 0;\n    virtual ::grpc::ClientAsyncWriterInterface< flatbuffers::grpc::Message<Monster>>* PrepareAsyncGetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq) = 0;\n    virtual ::grpc::ClientReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* GetMinMaxHitPointsRaw(::grpc::ClientContext* context) = 0;\n    virtual ::grpc::ClientAsyncReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* AsyncGetMinMaxHitPointsRaw(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq, void* tag) = 0;\n    virtual ::grpc::ClientAsyncReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* PrepareAsyncGetMinMaxHitPointsRaw(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq) = 0;\n  };\n  class Stub final : public StubInterface {\n   public:\n    Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel);\n    ::grpc::Status Store(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, flatbuffers::grpc::Message<Stat>* response) override;\n    std::unique_ptr< ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>> AsyncStore(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>>(AsyncStoreRaw(context, request, cq));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>> PrepareAsyncStore(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>>(PrepareAsyncStoreRaw(context, request, cq));\n    }\n    std::unique_ptr< ::grpc::ClientReader< flatbuffers::grpc::Message<Monster>>> Retrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) {\n      return std::unique_ptr< ::grpc::ClientReader< flatbuffers::grpc::Message<Monster>>>(RetrieveRaw(context, request));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>> AsyncRetrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr< ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>>(AsyncRetrieveRaw(context, request, cq, tag));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>> PrepareAsyncRetrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>>(PrepareAsyncRetrieveRaw(context, request, cq));\n    }\n    std::unique_ptr< ::grpc::ClientWriter< flatbuffers::grpc::Message<Monster>>> GetMaxHitPoint(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response) {\n      return std::unique_ptr< ::grpc::ClientWriter< flatbuffers::grpc::Message<Monster>>>(GetMaxHitPointRaw(context, response));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>> AsyncGetMaxHitPoint(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr< ::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>>(AsyncGetMaxHitPointRaw(context, response, cq, tag));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>> PrepareAsyncGetMaxHitPoint(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>>(PrepareAsyncGetMaxHitPointRaw(context, response, cq));\n    }\n    std::unique_ptr< ::grpc::ClientReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>> GetMinMaxHitPoints(::grpc::ClientContext* context) {\n      return std::unique_ptr< ::grpc::ClientReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>(GetMinMaxHitPointsRaw(context));\n    }\n    std::unique_ptr<  ::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>> AsyncGetMinMaxHitPoints(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr< ::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>(AsyncGetMinMaxHitPointsRaw(context, cq, tag));\n    }\n    std::unique_ptr<  ::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>> PrepareAsyncGetMinMaxHitPoints(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>(PrepareAsyncGetMinMaxHitPointsRaw(context, cq));\n    }\n  \n   private:\n    std::shared_ptr< ::grpc::ChannelInterface> channel_;\n    ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>* AsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) override;\n    ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>* PrepareAsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) override;\n    ::grpc::ClientReader< flatbuffers::grpc::Message<Monster>>* RetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) override;\n    ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>* AsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) override;\n    ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>* PrepareAsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq) override;\n    ::grpc::ClientWriter< flatbuffers::grpc::Message<Monster>>* GetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response) override;\n    ::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>* AsyncGetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq, void* tag) override;\n    ::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>* PrepareAsyncGetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq) override;\n    ::grpc::ClientReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* GetMinMaxHitPointsRaw(::grpc::ClientContext* context) override;\n    ::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* AsyncGetMinMaxHitPointsRaw(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq, void* tag) override;\n    ::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* PrepareAsyncGetMinMaxHitPointsRaw(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq) override;\n    const ::grpc::internal::RpcMethod rpcmethod_Store_;\n    const ::grpc::internal::RpcMethod rpcmethod_Retrieve_;\n    const ::grpc::internal::RpcMethod rpcmethod_GetMaxHitPoint_;\n    const ::grpc::internal::RpcMethod rpcmethod_GetMinMaxHitPoints_;\n  };\n  static std::unique_ptr<Stub> NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options = ::grpc::StubOptions());\n  \n  class Service : public ::grpc::Service {\n   public:\n    Service();\n    virtual ~Service();\n    virtual ::grpc::Status Store(::grpc::ServerContext* context, const flatbuffers::grpc::Message<Monster>* request, flatbuffers::grpc::Message<Stat>* response);\n    virtual ::grpc::Status Retrieve(::grpc::ServerContext* context, const flatbuffers::grpc::Message<Stat>* request, ::grpc::ServerWriter< flatbuffers::grpc::Message<Monster>>* writer);\n    virtual ::grpc::Status GetMaxHitPoint(::grpc::ServerContext* context, ::grpc::ServerReader< flatbuffers::grpc::Message<Monster>>* reader, flatbuffers::grpc::Message<Stat>* response);\n    virtual ::grpc::Status GetMinMaxHitPoints(::grpc::ServerContext* context, ::grpc::ServerReaderWriter< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>* stream);\n  };\n  template <class BaseClass>\n  class WithAsyncMethod_Store : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithAsyncMethod_Store() {\n      ::grpc::Service::MarkMethodAsync(0);\n    }\n    ~WithAsyncMethod_Store() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status Store(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Monster>* /*request*/, flatbuffers::grpc::Message<Stat>* /*response*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    void RequestStore(::grpc::ServerContext* context, flatbuffers::grpc::Message<Monster>* request, ::grpc::ServerAsyncResponseWriter< flatbuffers::grpc::Message<Stat>>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n      ::grpc::Service::RequestAsyncUnary(0, context, request, response, new_call_cq, notification_cq, tag);\n    }\n  };\n  template <class BaseClass>\n  class WithAsyncMethod_Retrieve : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithAsyncMethod_Retrieve() {\n      ::grpc::Service::MarkMethodAsync(1);\n    }\n    ~WithAsyncMethod_Retrieve() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status Retrieve(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Stat>* /*request*/, ::grpc::ServerWriter< flatbuffers::grpc::Message<Monster>>* /*writer*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    void RequestRetrieve(::grpc::ServerContext* context, flatbuffers::grpc::Message<Stat>* request, ::grpc::ServerAsyncWriter< flatbuffers::grpc::Message<Monster>>* writer, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n      ::grpc::Service::RequestAsyncServerStreaming(1, context, request, writer, new_call_cq, notification_cq, tag);\n    }\n  };\n  template <class BaseClass>\n  class WithAsyncMethod_GetMaxHitPoint : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithAsyncMethod_GetMaxHitPoint() {\n      ::grpc::Service::MarkMethodAsync(2);\n    }\n    ~WithAsyncMethod_GetMaxHitPoint() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status GetMaxHitPoint(::grpc::ServerContext* /*context*/, ::grpc::ServerReader< flatbuffers::grpc::Message<Monster>>* /*reader*/, flatbuffers::grpc::Message<Stat>* /*response*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    void RequestGetMaxHitPoint(::grpc::ServerContext* context, ::grpc::ServerAsyncReader< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>* reader, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n      ::grpc::Service::RequestAsyncClientStreaming(2, context, reader, new_call_cq, notification_cq, tag);\n    }\n  };\n  template <class BaseClass>\n  class WithAsyncMethod_GetMinMaxHitPoints : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithAsyncMethod_GetMinMaxHitPoints() {\n      ::grpc::Service::MarkMethodAsync(3);\n    }\n    ~WithAsyncMethod_GetMinMaxHitPoints() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status GetMinMaxHitPoints(::grpc::ServerContext* /*context*/, ::grpc::ServerReaderWriter< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>* /*stream*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    void RequestGetMinMaxHitPoints(::grpc::ServerContext* context, ::grpc::ServerAsyncReaderWriter< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>* stream, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n      ::grpc::Service::RequestAsyncBidiStreaming(3, context, stream, new_call_cq, notification_cq, tag);\n    }\n  };\n  typedef   WithAsyncMethod_Store<  WithAsyncMethod_Retrieve<  WithAsyncMethod_GetMaxHitPoint<  WithAsyncMethod_GetMinMaxHitPoints<  Service   >   >   >   >   AsyncService;\n  template <class BaseClass>\n  class WithGenericMethod_Store : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithGenericMethod_Store() {\n      ::grpc::Service::MarkMethodGeneric(0);\n    }\n    ~WithGenericMethod_Store() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status Store(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Monster>* /*request*/, flatbuffers::grpc::Message<Stat>* /*response*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n  };\n  template <class BaseClass>\n  class WithGenericMethod_Retrieve : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithGenericMethod_Retrieve() {\n      ::grpc::Service::MarkMethodGeneric(1);\n    }\n    ~WithGenericMethod_Retrieve() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status Retrieve(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Stat>* /*request*/, ::grpc::ServerWriter< flatbuffers::grpc::Message<Monster>>* /*writer*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n  };\n  template <class BaseClass>\n  class WithGenericMethod_GetMaxHitPoint : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithGenericMethod_GetMaxHitPoint() {\n      ::grpc::Service::MarkMethodGeneric(2);\n    }\n    ~WithGenericMethod_GetMaxHitPoint() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status GetMaxHitPoint(::grpc::ServerContext* /*context*/, ::grpc::ServerReader< flatbuffers::grpc::Message<Monster>>* /*reader*/, flatbuffers::grpc::Message<Stat>* /*response*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n  };\n  template <class BaseClass>\n  class WithGenericMethod_GetMinMaxHitPoints : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithGenericMethod_GetMinMaxHitPoints() {\n      ::grpc::Service::MarkMethodGeneric(3);\n    }\n    ~WithGenericMethod_GetMinMaxHitPoints() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status GetMinMaxHitPoints(::grpc::ServerContext* /*context*/, ::grpc::ServerReaderWriter< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>* /*stream*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n  };\n  template <class BaseClass>\n  class WithStreamedUnaryMethod_Store : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithStreamedUnaryMethod_Store() {\n      ::grpc::Service::MarkMethodStreamed(0,\n        new ::grpc::internal::StreamedUnaryHandler< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>(std::bind(&WithStreamedUnaryMethod_Store<BaseClass>::StreamedStore, this, std::placeholders::_1, std::placeholders::_2)));\n    }\n    ~WithStreamedUnaryMethod_Store() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable regular version of this method\n    ::grpc::Status Store(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Monster>* /*request*/, flatbuffers::grpc::Message<Stat>* /*response*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    // replace default version of method with streamed unary\n    virtual ::grpc::Status StreamedStore(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< flatbuffers::grpc::Message<Monster>,flatbuffers::grpc::Message<Stat>>* server_unary_streamer) = 0;\n  };\n  typedef   WithStreamedUnaryMethod_Store<  Service   >   StreamedUnaryService;\n  template <class BaseClass>\n  class WithSplitStreamingMethod_Retrieve : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) { }\n   public:\n    WithSplitStreamingMethod_Retrieve() {\n      ::grpc::Service::MarkMethodStreamed(1,\n        new ::grpc::internal::SplitServerStreamingHandler< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>(std::bind(&WithSplitStreamingMethod_Retrieve<BaseClass>::StreamedRetrieve, this, std::placeholders::_1, std::placeholders::_2)));\n    }\n    ~WithSplitStreamingMethod_Retrieve() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable regular version of this method\n    ::grpc::Status Retrieve(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Stat>* /*request*/, ::grpc::ServerWriter< flatbuffers::grpc::Message<Monster>>* /*writer*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    // replace default version of method with split streamed\n    virtual ::grpc::Status StreamedRetrieve(::grpc::ServerContext* context, ::grpc::ServerSplitStreamer< flatbuffers::grpc::Message<Stat>,flatbuffers::grpc::Message<Monster>>* server_split_streamer) = 0;\n  };\n  typedef   WithSplitStreamingMethod_Retrieve<  Service   >   SplitStreamedService;\n  typedef   WithStreamedUnaryMethod_Store<  WithSplitStreamingMethod_Retrieve<  Service   >   >   StreamedService;\n};\n\n}  // namespace Example\n}  // namespace MyGame\n\n\n#endif  // GRPC_monster_5ftest__INCLUDED\n"
  },
  {
    "path": "tests/monster_test_suffix/filesuffix_only/monster_test_suffix.h",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n\n#ifndef FLATBUFFERS_GENERATED_MONSTERTEST_MYGAME_EXAMPLE_H_\n#define FLATBUFFERS_GENERATED_MONSTERTEST_MYGAME_EXAMPLE_H_\n\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/flexbuffers.h\"\n#include \"flatbuffers/flex_flat_util.h\"\n\n// Ensure the included flatbuffers.h is the same version as when this file was\n// generated, otherwise it may not be compatible.\nstatic_assert(FLATBUFFERS_VERSION_MAJOR == 25 &&\n              FLATBUFFERS_VERSION_MINOR == 12 &&\n              FLATBUFFERS_VERSION_REVISION == 19,\n             \"Non-compatible flatbuffers version included\");\n\nnamespace MyGame {\n\nstruct InParentNamespace;\nstruct InParentNamespaceBuilder;\nstruct InParentNamespaceT;\n\nnamespace Example2 {\n\nstruct Monster;\nstruct MonsterBuilder;\nstruct MonsterT;\n\n}  // namespace Example2\n\nnamespace Example {\n\nstruct Test;\n\nstruct TestSimpleTableWithEnum;\nstruct TestSimpleTableWithEnumBuilder;\nstruct TestSimpleTableWithEnumT;\n\nstruct Vec3;\n\nstruct Ability;\n\nstruct StructOfStructs;\n\nstruct StructOfStructsOfStructs;\n\nstruct Stat;\nstruct StatBuilder;\nstruct StatT;\n\nstruct Referrable;\nstruct ReferrableBuilder;\nstruct ReferrableT;\n\nstruct Monster;\nstruct MonsterBuilder;\nstruct MonsterT;\n\nstruct TypeAliases;\nstruct TypeAliasesBuilder;\nstruct TypeAliasesT;\n\n}  // namespace Example\n\nbool operator==(const InParentNamespaceT &lhs, const InParentNamespaceT &rhs);\nbool operator!=(const InParentNamespaceT &lhs, const InParentNamespaceT &rhs);\nnamespace Example2 {\n\nbool operator==(const MonsterT &lhs, const MonsterT &rhs);\nbool operator!=(const MonsterT &lhs, const MonsterT &rhs);\n}  // namespace Example2\n\nnamespace Example {\n\nbool operator==(const Test &lhs, const Test &rhs);\nbool operator!=(const Test &lhs, const Test &rhs);\nbool operator==(const TestSimpleTableWithEnumT &lhs, const TestSimpleTableWithEnumT &rhs);\nbool operator!=(const TestSimpleTableWithEnumT &lhs, const TestSimpleTableWithEnumT &rhs);\nbool operator==(const Vec3 &lhs, const Vec3 &rhs);\nbool operator!=(const Vec3 &lhs, const Vec3 &rhs);\nbool operator==(const Ability &lhs, const Ability &rhs);\nbool operator!=(const Ability &lhs, const Ability &rhs);\nbool operator==(const StructOfStructs &lhs, const StructOfStructs &rhs);\nbool operator!=(const StructOfStructs &lhs, const StructOfStructs &rhs);\nbool operator==(const StructOfStructsOfStructs &lhs, const StructOfStructsOfStructs &rhs);\nbool operator!=(const StructOfStructsOfStructs &lhs, const StructOfStructsOfStructs &rhs);\nbool operator==(const StatT &lhs, const StatT &rhs);\nbool operator!=(const StatT &lhs, const StatT &rhs);\nbool operator==(const ReferrableT &lhs, const ReferrableT &rhs);\nbool operator!=(const ReferrableT &lhs, const ReferrableT &rhs);\nbool operator==(const MonsterT &lhs, const MonsterT &rhs);\nbool operator!=(const MonsterT &lhs, const MonsterT &rhs);\nbool operator==(const TypeAliasesT &lhs, const TypeAliasesT &rhs);\nbool operator!=(const TypeAliasesT &lhs, const TypeAliasesT &rhs);\n\n}  // namespace Example\n\ninline const ::flatbuffers::TypeTable *InParentNamespaceTypeTable();\n\nnamespace Example2 {\n\ninline const ::flatbuffers::TypeTable *MonsterTypeTable();\n\n}  // namespace Example2\n\nnamespace Example {\n\ninline const ::flatbuffers::TypeTable *TestTypeTable();\n\ninline const ::flatbuffers::TypeTable *TestSimpleTableWithEnumTypeTable();\n\ninline const ::flatbuffers::TypeTable *Vec3TypeTable();\n\ninline const ::flatbuffers::TypeTable *AbilityTypeTable();\n\ninline const ::flatbuffers::TypeTable *StructOfStructsTypeTable();\n\ninline const ::flatbuffers::TypeTable *StructOfStructsOfStructsTypeTable();\n\ninline const ::flatbuffers::TypeTable *StatTypeTable();\n\ninline const ::flatbuffers::TypeTable *ReferrableTypeTable();\n\ninline const ::flatbuffers::TypeTable *MonsterTypeTable();\n\ninline const ::flatbuffers::TypeTable *TypeAliasesTypeTable();\n\n/// Composite components of Monster color.\nenum Color : uint8_t {\n  Color_Red = 1,\n  /// \\brief color Green\n  /// Green is bit_flag with value (1u << 1)\n  Color_Green = 2,\n  /// \\brief color Blue (1u << 3)\n  Color_Blue = 8,\n  Color_NONE = 0,\n  Color_ANY = 11\n};\n\ninline const Color (&EnumValuesColor())[3] {\n  static const Color values[] = {\n    Color_Red,\n    Color_Green,\n    Color_Blue\n  };\n  return values;\n}\n\ninline const char * const *EnumNamesColor() {\n  static const char * const names[9] = {\n    \"Red\",\n    \"Green\",\n    \"\",\n    \"\",\n    \"\",\n    \"\",\n    \"\",\n    \"Blue\",\n    nullptr\n  };\n  return names;\n}\n\ninline const char *EnumNameColor(Color e) {\n  if (::flatbuffers::IsOutRange(e, Color_Red, Color_Blue)) return \"\";\n  const size_t index = static_cast<size_t>(e) - static_cast<size_t>(Color_Red);\n  return EnumNamesColor()[index];\n}\n\nenum Race : int8_t {\n  Race_None = -1,\n  Race_Human = 0,\n  Race_Dwarf = 1,\n  Race_Elf = 2,\n  Race_MIN = Race_None,\n  Race_MAX = Race_Elf\n};\n\ninline const Race (&EnumValuesRace())[4] {\n  static const Race values[] = {\n    Race_None,\n    Race_Human,\n    Race_Dwarf,\n    Race_Elf\n  };\n  return values;\n}\n\ninline const char * const *EnumNamesRace() {\n  static const char * const names[5] = {\n    \"None\",\n    \"Human\",\n    \"Dwarf\",\n    \"Elf\",\n    nullptr\n  };\n  return names;\n}\n\ninline const char *EnumNameRace(Race e) {\n  if (::flatbuffers::IsOutRange(e, Race_None, Race_Elf)) return \"\";\n  const size_t index = static_cast<size_t>(e) - static_cast<size_t>(Race_None);\n  return EnumNamesRace()[index];\n}\n\nenum LongEnum : uint64_t {\n  LongEnum_LongOne = 2ULL,\n  LongEnum_LongTwo = 4ULL,\n  LongEnum_LongBig = 1099511627776ULL,\n  LongEnum_NONE = 0,\n  LongEnum_ANY = 1099511627782ULL\n};\n\ninline const LongEnum (&EnumValuesLongEnum())[3] {\n  static const LongEnum values[] = {\n    LongEnum_LongOne,\n    LongEnum_LongTwo,\n    LongEnum_LongBig\n  };\n  return values;\n}\n\ninline const char *EnumNameLongEnum(LongEnum e) {\n  switch (e) {\n    case LongEnum_LongOne: return \"LongOne\";\n    case LongEnum_LongTwo: return \"LongTwo\";\n    case LongEnum_LongBig: return \"LongBig\";\n    default: return \"\";\n  }\n}\n\nenum Any : uint8_t {\n  Any_NONE = 0,\n  Any_Monster = 1,\n  Any_TestSimpleTableWithEnum = 2,\n  Any_MyGame_Example2_Monster = 3,\n  Any_MIN = Any_NONE,\n  Any_MAX = Any_MyGame_Example2_Monster\n};\n\ninline const Any (&EnumValuesAny())[4] {\n  static const Any values[] = {\n    Any_NONE,\n    Any_Monster,\n    Any_TestSimpleTableWithEnum,\n    Any_MyGame_Example2_Monster\n  };\n  return values;\n}\n\ninline const char * const *EnumNamesAny() {\n  static const char * const names[5] = {\n    \"NONE\",\n    \"Monster\",\n    \"TestSimpleTableWithEnum\",\n    \"MyGame_Example2_Monster\",\n    nullptr\n  };\n  return names;\n}\n\ninline const char *EnumNameAny(Any e) {\n  if (::flatbuffers::IsOutRange(e, Any_NONE, Any_MyGame_Example2_Monster)) return \"\";\n  const size_t index = static_cast<size_t>(e);\n  return EnumNamesAny()[index];\n}\n\ntemplate<typename T> struct AnyTraits {\n  static const Any enum_value = Any_NONE;\n};\n\ntemplate<> struct AnyTraits<MyGame::Example::Monster> {\n  static const Any enum_value = Any_Monster;\n};\n\ntemplate<> struct AnyTraits<MyGame::Example::TestSimpleTableWithEnum> {\n  static const Any enum_value = Any_TestSimpleTableWithEnum;\n};\n\ntemplate<> struct AnyTraits<MyGame::Example2::Monster> {\n  static const Any enum_value = Any_MyGame_Example2_Monster;\n};\n\ntemplate<typename T> struct AnyUnionTraits {\n  static const Any enum_value = Any_NONE;\n};\n\ntemplate<> struct AnyUnionTraits<MyGame::Example::MonsterT> {\n  static const Any enum_value = Any_Monster;\n};\n\ntemplate<> struct AnyUnionTraits<MyGame::Example::TestSimpleTableWithEnumT> {\n  static const Any enum_value = Any_TestSimpleTableWithEnum;\n};\n\ntemplate<> struct AnyUnionTraits<MyGame::Example2::MonsterT> {\n  static const Any enum_value = Any_MyGame_Example2_Monster;\n};\n\nstruct AnyUnion {\n  Any type;\n  void *value;\n\n  AnyUnion() : type(Any_NONE), value(nullptr) {}\n  AnyUnion(AnyUnion&& u) FLATBUFFERS_NOEXCEPT :\n    type(Any_NONE), value(nullptr)\n    { std::swap(type, u.type); std::swap(value, u.value); }\n  AnyUnion(const AnyUnion &);\n  AnyUnion &operator=(const AnyUnion &u)\n    { AnyUnion t(u); std::swap(type, t.type); std::swap(value, t.value); return *this; }\n  AnyUnion &operator=(AnyUnion &&u) FLATBUFFERS_NOEXCEPT\n    { std::swap(type, u.type); std::swap(value, u.value); return *this; }\n  ~AnyUnion() { Reset(); }\n\n  void Reset();\n\n  template <typename T>\n  void Set(T&& val) {\n    typedef typename std::remove_reference<T>::type RT;\n    Reset();\n    type = AnyUnionTraits<RT>::enum_value;\n    if (type != Any_NONE) {\n      value = new RT(std::forward<T>(val));\n    }\n  }\n\n  static void *UnPack(const void *obj, Any type, const ::flatbuffers::resolver_function_t *resolver);\n  ::flatbuffers::Offset<void> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr) const;\n\n  MyGame::Example::MonsterT *AsMonster() {\n    return type == Any_Monster ?\n      reinterpret_cast<MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n  const MyGame::Example::MonsterT *AsMonster() const {\n    return type == Any_Monster ?\n      reinterpret_cast<const MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n  MyGame::Example::TestSimpleTableWithEnumT *AsTestSimpleTableWithEnum() {\n    return type == Any_TestSimpleTableWithEnum ?\n      reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(value) : nullptr;\n  }\n  const MyGame::Example::TestSimpleTableWithEnumT *AsTestSimpleTableWithEnum() const {\n    return type == Any_TestSimpleTableWithEnum ?\n      reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(value) : nullptr;\n  }\n  MyGame::Example2::MonsterT *AsMyGame_Example2_Monster() {\n    return type == Any_MyGame_Example2_Monster ?\n      reinterpret_cast<MyGame::Example2::MonsterT *>(value) : nullptr;\n  }\n  const MyGame::Example2::MonsterT *AsMyGame_Example2_Monster() const {\n    return type == Any_MyGame_Example2_Monster ?\n      reinterpret_cast<const MyGame::Example2::MonsterT *>(value) : nullptr;\n  }\n};\n\n\ninline bool operator==(const AnyUnion &lhs, const AnyUnion &rhs) {\n  if (lhs.type != rhs.type) return false;\n  switch (lhs.type) {\n    case Any_NONE: {\n      return true;\n    }\n    case Any_Monster: {\n      return *(reinterpret_cast<const MyGame::Example::MonsterT *>(lhs.value)) ==\n             *(reinterpret_cast<const MyGame::Example::MonsterT *>(rhs.value));\n    }\n    case Any_TestSimpleTableWithEnum: {\n      return *(reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(lhs.value)) ==\n             *(reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(rhs.value));\n    }\n    case Any_MyGame_Example2_Monster: {\n      return *(reinterpret_cast<const MyGame::Example2::MonsterT *>(lhs.value)) ==\n             *(reinterpret_cast<const MyGame::Example2::MonsterT *>(rhs.value));\n    }\n    default: {\n      return false;\n    }\n  }\n}\n\ninline bool operator!=(const AnyUnion &lhs, const AnyUnion &rhs) {\n    return !(lhs == rhs);\n}\n\ntemplate <bool B = false>\nbool VerifyAny(::flatbuffers::VerifierTemplate<B> &verifier, const void *obj, Any type);\ntemplate <bool B = false>\nbool VerifyAnyVector(::flatbuffers::VerifierTemplate<B> &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types);\n\nenum AnyUniqueAliases : uint8_t {\n  AnyUniqueAliases_NONE = 0,\n  AnyUniqueAliases_M = 1,\n  AnyUniqueAliases_TS = 2,\n  AnyUniqueAliases_M2 = 3,\n  AnyUniqueAliases_MIN = AnyUniqueAliases_NONE,\n  AnyUniqueAliases_MAX = AnyUniqueAliases_M2\n};\n\ninline const AnyUniqueAliases (&EnumValuesAnyUniqueAliases())[4] {\n  static const AnyUniqueAliases values[] = {\n    AnyUniqueAliases_NONE,\n    AnyUniqueAliases_M,\n    AnyUniqueAliases_TS,\n    AnyUniqueAliases_M2\n  };\n  return values;\n}\n\ninline const char * const *EnumNamesAnyUniqueAliases() {\n  static const char * const names[5] = {\n    \"NONE\",\n    \"M\",\n    \"TS\",\n    \"M2\",\n    nullptr\n  };\n  return names;\n}\n\ninline const char *EnumNameAnyUniqueAliases(AnyUniqueAliases e) {\n  if (::flatbuffers::IsOutRange(e, AnyUniqueAliases_NONE, AnyUniqueAliases_M2)) return \"\";\n  const size_t index = static_cast<size_t>(e);\n  return EnumNamesAnyUniqueAliases()[index];\n}\n\ntemplate<typename T> struct AnyUniqueAliasesTraits {\n  static const AnyUniqueAliases enum_value = AnyUniqueAliases_NONE;\n};\n\ntemplate<> struct AnyUniqueAliasesTraits<MyGame::Example::Monster> {\n  static const AnyUniqueAliases enum_value = AnyUniqueAliases_M;\n};\n\ntemplate<> struct AnyUniqueAliasesTraits<MyGame::Example::TestSimpleTableWithEnum> {\n  static const AnyUniqueAliases enum_value = AnyUniqueAliases_TS;\n};\n\ntemplate<> struct AnyUniqueAliasesTraits<MyGame::Example2::Monster> {\n  static const AnyUniqueAliases enum_value = AnyUniqueAliases_M2;\n};\n\ntemplate<typename T> struct AnyUniqueAliasesUnionTraits {\n  static const AnyUniqueAliases enum_value = AnyUniqueAliases_NONE;\n};\n\ntemplate<> struct AnyUniqueAliasesUnionTraits<MyGame::Example::MonsterT> {\n  static const AnyUniqueAliases enum_value = AnyUniqueAliases_M;\n};\n\ntemplate<> struct AnyUniqueAliasesUnionTraits<MyGame::Example::TestSimpleTableWithEnumT> {\n  static const AnyUniqueAliases enum_value = AnyUniqueAliases_TS;\n};\n\ntemplate<> struct AnyUniqueAliasesUnionTraits<MyGame::Example2::MonsterT> {\n  static const AnyUniqueAliases enum_value = AnyUniqueAliases_M2;\n};\n\nstruct AnyUniqueAliasesUnion {\n  AnyUniqueAliases type;\n  void *value;\n\n  AnyUniqueAliasesUnion() : type(AnyUniqueAliases_NONE), value(nullptr) {}\n  AnyUniqueAliasesUnion(AnyUniqueAliasesUnion&& u) FLATBUFFERS_NOEXCEPT :\n    type(AnyUniqueAliases_NONE), value(nullptr)\n    { std::swap(type, u.type); std::swap(value, u.value); }\n  AnyUniqueAliasesUnion(const AnyUniqueAliasesUnion &);\n  AnyUniqueAliasesUnion &operator=(const AnyUniqueAliasesUnion &u)\n    { AnyUniqueAliasesUnion t(u); std::swap(type, t.type); std::swap(value, t.value); return *this; }\n  AnyUniqueAliasesUnion &operator=(AnyUniqueAliasesUnion &&u) FLATBUFFERS_NOEXCEPT\n    { std::swap(type, u.type); std::swap(value, u.value); return *this; }\n  ~AnyUniqueAliasesUnion() { Reset(); }\n\n  void Reset();\n\n  template <typename T>\n  void Set(T&& val) {\n    typedef typename std::remove_reference<T>::type RT;\n    Reset();\n    type = AnyUniqueAliasesUnionTraits<RT>::enum_value;\n    if (type != AnyUniqueAliases_NONE) {\n      value = new RT(std::forward<T>(val));\n    }\n  }\n\n  static void *UnPack(const void *obj, AnyUniqueAliases type, const ::flatbuffers::resolver_function_t *resolver);\n  ::flatbuffers::Offset<void> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr) const;\n\n  MyGame::Example::MonsterT *AsM() {\n    return type == AnyUniqueAliases_M ?\n      reinterpret_cast<MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n  const MyGame::Example::MonsterT *AsM() const {\n    return type == AnyUniqueAliases_M ?\n      reinterpret_cast<const MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n  MyGame::Example::TestSimpleTableWithEnumT *AsTS() {\n    return type == AnyUniqueAliases_TS ?\n      reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(value) : nullptr;\n  }\n  const MyGame::Example::TestSimpleTableWithEnumT *AsTS() const {\n    return type == AnyUniqueAliases_TS ?\n      reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(value) : nullptr;\n  }\n  MyGame::Example2::MonsterT *AsM2() {\n    return type == AnyUniqueAliases_M2 ?\n      reinterpret_cast<MyGame::Example2::MonsterT *>(value) : nullptr;\n  }\n  const MyGame::Example2::MonsterT *AsM2() const {\n    return type == AnyUniqueAliases_M2 ?\n      reinterpret_cast<const MyGame::Example2::MonsterT *>(value) : nullptr;\n  }\n};\n\n\ninline bool operator==(const AnyUniqueAliasesUnion &lhs, const AnyUniqueAliasesUnion &rhs) {\n  if (lhs.type != rhs.type) return false;\n  switch (lhs.type) {\n    case AnyUniqueAliases_NONE: {\n      return true;\n    }\n    case AnyUniqueAliases_M: {\n      return *(reinterpret_cast<const MyGame::Example::MonsterT *>(lhs.value)) ==\n             *(reinterpret_cast<const MyGame::Example::MonsterT *>(rhs.value));\n    }\n    case AnyUniqueAliases_TS: {\n      return *(reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(lhs.value)) ==\n             *(reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(rhs.value));\n    }\n    case AnyUniqueAliases_M2: {\n      return *(reinterpret_cast<const MyGame::Example2::MonsterT *>(lhs.value)) ==\n             *(reinterpret_cast<const MyGame::Example2::MonsterT *>(rhs.value));\n    }\n    default: {\n      return false;\n    }\n  }\n}\n\ninline bool operator!=(const AnyUniqueAliasesUnion &lhs, const AnyUniqueAliasesUnion &rhs) {\n    return !(lhs == rhs);\n}\n\ntemplate <bool B = false>\nbool VerifyAnyUniqueAliases(::flatbuffers::VerifierTemplate<B> &verifier, const void *obj, AnyUniqueAliases type);\ntemplate <bool B = false>\nbool VerifyAnyUniqueAliasesVector(::flatbuffers::VerifierTemplate<B> &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types);\n\nenum AnyAmbiguousAliases : uint8_t {\n  AnyAmbiguousAliases_NONE = 0,\n  AnyAmbiguousAliases_M1 = 1,\n  AnyAmbiguousAliases_M2 = 2,\n  AnyAmbiguousAliases_M3 = 3,\n  AnyAmbiguousAliases_MIN = AnyAmbiguousAliases_NONE,\n  AnyAmbiguousAliases_MAX = AnyAmbiguousAliases_M3\n};\n\ninline const AnyAmbiguousAliases (&EnumValuesAnyAmbiguousAliases())[4] {\n  static const AnyAmbiguousAliases values[] = {\n    AnyAmbiguousAliases_NONE,\n    AnyAmbiguousAliases_M1,\n    AnyAmbiguousAliases_M2,\n    AnyAmbiguousAliases_M3\n  };\n  return values;\n}\n\ninline const char * const *EnumNamesAnyAmbiguousAliases() {\n  static const char * const names[5] = {\n    \"NONE\",\n    \"M1\",\n    \"M2\",\n    \"M3\",\n    nullptr\n  };\n  return names;\n}\n\ninline const char *EnumNameAnyAmbiguousAliases(AnyAmbiguousAliases e) {\n  if (::flatbuffers::IsOutRange(e, AnyAmbiguousAliases_NONE, AnyAmbiguousAliases_M3)) return \"\";\n  const size_t index = static_cast<size_t>(e);\n  return EnumNamesAnyAmbiguousAliases()[index];\n}\n\nstruct AnyAmbiguousAliasesUnion {\n  AnyAmbiguousAliases type;\n  void *value;\n\n  AnyAmbiguousAliasesUnion() : type(AnyAmbiguousAliases_NONE), value(nullptr) {}\n  AnyAmbiguousAliasesUnion(AnyAmbiguousAliasesUnion&& u) FLATBUFFERS_NOEXCEPT :\n    type(AnyAmbiguousAliases_NONE), value(nullptr)\n    { std::swap(type, u.type); std::swap(value, u.value); }\n  AnyAmbiguousAliasesUnion(const AnyAmbiguousAliasesUnion &);\n  AnyAmbiguousAliasesUnion &operator=(const AnyAmbiguousAliasesUnion &u)\n    { AnyAmbiguousAliasesUnion t(u); std::swap(type, t.type); std::swap(value, t.value); return *this; }\n  AnyAmbiguousAliasesUnion &operator=(AnyAmbiguousAliasesUnion &&u) FLATBUFFERS_NOEXCEPT\n    { std::swap(type, u.type); std::swap(value, u.value); return *this; }\n  ~AnyAmbiguousAliasesUnion() { Reset(); }\n\n  void Reset();\n\n  static void *UnPack(const void *obj, AnyAmbiguousAliases type, const ::flatbuffers::resolver_function_t *resolver);\n  ::flatbuffers::Offset<void> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr) const;\n\n  MyGame::Example::MonsterT *AsM1() {\n    return type == AnyAmbiguousAliases_M1 ?\n      reinterpret_cast<MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n  const MyGame::Example::MonsterT *AsM1() const {\n    return type == AnyAmbiguousAliases_M1 ?\n      reinterpret_cast<const MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n  MyGame::Example::MonsterT *AsM2() {\n    return type == AnyAmbiguousAliases_M2 ?\n      reinterpret_cast<MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n  const MyGame::Example::MonsterT *AsM2() const {\n    return type == AnyAmbiguousAliases_M2 ?\n      reinterpret_cast<const MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n  MyGame::Example::MonsterT *AsM3() {\n    return type == AnyAmbiguousAliases_M3 ?\n      reinterpret_cast<MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n  const MyGame::Example::MonsterT *AsM3() const {\n    return type == AnyAmbiguousAliases_M3 ?\n      reinterpret_cast<const MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n};\n\n\ninline bool operator==(const AnyAmbiguousAliasesUnion &lhs, const AnyAmbiguousAliasesUnion &rhs) {\n  if (lhs.type != rhs.type) return false;\n  switch (lhs.type) {\n    case AnyAmbiguousAliases_NONE: {\n      return true;\n    }\n    case AnyAmbiguousAliases_M1: {\n      return *(reinterpret_cast<const MyGame::Example::MonsterT *>(lhs.value)) ==\n             *(reinterpret_cast<const MyGame::Example::MonsterT *>(rhs.value));\n    }\n    case AnyAmbiguousAliases_M2: {\n      return *(reinterpret_cast<const MyGame::Example::MonsterT *>(lhs.value)) ==\n             *(reinterpret_cast<const MyGame::Example::MonsterT *>(rhs.value));\n    }\n    case AnyAmbiguousAliases_M3: {\n      return *(reinterpret_cast<const MyGame::Example::MonsterT *>(lhs.value)) ==\n             *(reinterpret_cast<const MyGame::Example::MonsterT *>(rhs.value));\n    }\n    default: {\n      return false;\n    }\n  }\n}\n\ninline bool operator!=(const AnyAmbiguousAliasesUnion &lhs, const AnyAmbiguousAliasesUnion &rhs) {\n    return !(lhs == rhs);\n}\n\ntemplate <bool B = false>\nbool VerifyAnyAmbiguousAliases(::flatbuffers::VerifierTemplate<B> &verifier, const void *obj, AnyAmbiguousAliases type);\ntemplate <bool B = false>\nbool VerifyAnyAmbiguousAliasesVector(::flatbuffers::VerifierTemplate<B> &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types);\n\nFLATBUFFERS_MANUALLY_ALIGNED_STRUCT(2) Test FLATBUFFERS_FINAL_CLASS {\n private:\n  int16_t a_;\n  int8_t b_;\n  int8_t padding0__;\n\n public:\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return TestTypeTable();\n  }\n  Test()\n      : a_(0),\n        b_(0),\n        padding0__(0) {\n    (void)padding0__;\n  }\n  Test(int16_t _a, int8_t _b)\n      : a_(::flatbuffers::EndianScalar(_a)),\n        b_(::flatbuffers::EndianScalar(_b)),\n        padding0__(0) {\n    (void)padding0__;\n  }\n  int16_t a() const {\n    return ::flatbuffers::EndianScalar(a_);\n  }\n  void mutate_a(int16_t _a) {\n    ::flatbuffers::WriteScalar(&a_, _a);\n  }\n  int8_t b() const {\n    return ::flatbuffers::EndianScalar(b_);\n  }\n  void mutate_b(int8_t _b) {\n    ::flatbuffers::WriteScalar(&b_, _b);\n  }\n};\nFLATBUFFERS_STRUCT_END(Test, 4);\n\ninline bool operator==(const Test &lhs, const Test &rhs) {\n  return\n      (lhs.a() == rhs.a()) &&\n      (lhs.b() == rhs.b());\n}\n\ninline bool operator!=(const Test &lhs, const Test &rhs) {\n    return !(lhs == rhs);\n}\n\ntemplate <typename H>\ninline H AbslHashValue(H h, const Test &obj) {\n  return H::combine(std::move(h), obj.a(), obj.b());\n}\n\nFLATBUFFERS_MANUALLY_ALIGNED_STRUCT(8) Vec3 FLATBUFFERS_FINAL_CLASS {\n private:\n  float x_;\n  float y_;\n  float z_;\n  int32_t padding0__;\n  double test1_;\n  uint8_t test2_;\n  int8_t padding1__;\n  MyGame::Example::Test test3_;\n  int16_t padding2__;\n\n public:\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return Vec3TypeTable();\n  }\n  Vec3()\n      : x_(0),\n        y_(0),\n        z_(0),\n        padding0__(0),\n        test1_(0),\n        test2_(0),\n        padding1__(0),\n        test3_(),\n        padding2__(0) {\n    (void)padding0__;\n    (void)padding1__;\n    (void)padding2__;\n  }\n  Vec3(float _x, float _y, float _z, double _test1, MyGame::Example::Color _test2, const MyGame::Example::Test &_test3)\n      : x_(::flatbuffers::EndianScalar(_x)),\n        y_(::flatbuffers::EndianScalar(_y)),\n        z_(::flatbuffers::EndianScalar(_z)),\n        padding0__(0),\n        test1_(::flatbuffers::EndianScalar(_test1)),\n        test2_(::flatbuffers::EndianScalar(static_cast<uint8_t>(_test2))),\n        padding1__(0),\n        test3_(_test3),\n        padding2__(0) {\n    (void)padding0__;\n    (void)padding1__;\n    (void)padding2__;\n  }\n  float x() const {\n    return ::flatbuffers::EndianScalar(x_);\n  }\n  void mutate_x(float _x) {\n    ::flatbuffers::WriteScalar(&x_, _x);\n  }\n  float y() const {\n    return ::flatbuffers::EndianScalar(y_);\n  }\n  void mutate_y(float _y) {\n    ::flatbuffers::WriteScalar(&y_, _y);\n  }\n  float z() const {\n    return ::flatbuffers::EndianScalar(z_);\n  }\n  void mutate_z(float _z) {\n    ::flatbuffers::WriteScalar(&z_, _z);\n  }\n  double test1() const {\n    return ::flatbuffers::EndianScalar(test1_);\n  }\n  void mutate_test1(double _test1) {\n    ::flatbuffers::WriteScalar(&test1_, _test1);\n  }\n  MyGame::Example::Color test2() const {\n    return static_cast<MyGame::Example::Color>(::flatbuffers::EndianScalar(test2_));\n  }\n  void mutate_test2(MyGame::Example::Color _test2) {\n    ::flatbuffers::WriteScalar(&test2_, static_cast<uint8_t>(_test2));\n  }\n  const MyGame::Example::Test &test3() const {\n    return test3_;\n  }\n  MyGame::Example::Test &mutable_test3() {\n    return test3_;\n  }\n};\nFLATBUFFERS_STRUCT_END(Vec3, 32);\n\ninline bool operator==(const Vec3 &lhs, const Vec3 &rhs) {\n  return\n      (lhs.x() == rhs.x()) &&\n      (lhs.y() == rhs.y()) &&\n      (lhs.z() == rhs.z()) &&\n      (lhs.test1() == rhs.test1()) &&\n      (lhs.test2() == rhs.test2()) &&\n      (lhs.test3() == rhs.test3());\n}\n\ninline bool operator!=(const Vec3 &lhs, const Vec3 &rhs) {\n    return !(lhs == rhs);\n}\n\ntemplate <typename H>\ninline H AbslHashValue(H h, const Vec3 &obj) {\n  return H::combine(std::move(h), obj.x(), obj.y(), obj.z(), obj.test1(), obj.test2(), obj.test3());\n}\n\nFLATBUFFERS_MANUALLY_ALIGNED_STRUCT(4) Ability FLATBUFFERS_FINAL_CLASS {\n private:\n  uint32_t id_;\n  uint32_t distance_;\n\n public:\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return AbilityTypeTable();\n  }\n  Ability()\n      : id_(0),\n        distance_(0) {\n  }\n  Ability(uint32_t _id, uint32_t _distance)\n      : id_(::flatbuffers::EndianScalar(_id)),\n        distance_(::flatbuffers::EndianScalar(_distance)) {\n  }\n  uint32_t id() const {\n    return ::flatbuffers::EndianScalar(id_);\n  }\n  void mutate_id(uint32_t _id) {\n    ::flatbuffers::WriteScalar(&id_, _id);\n  }\n  bool KeyCompareLessThan(const Ability * const o) const {\n    return id() < o->id();\n  }\n  int KeyCompareWithValue(uint32_t _id) const {\n    return static_cast<int>(id() > _id) - static_cast<int>(id() < _id);\n  }\n  uint32_t distance() const {\n    return ::flatbuffers::EndianScalar(distance_);\n  }\n  void mutate_distance(uint32_t _distance) {\n    ::flatbuffers::WriteScalar(&distance_, _distance);\n  }\n};\nFLATBUFFERS_STRUCT_END(Ability, 8);\n\ninline bool operator==(const Ability &lhs, const Ability &rhs) {\n  return\n      (lhs.id() == rhs.id()) &&\n      (lhs.distance() == rhs.distance());\n}\n\ninline bool operator!=(const Ability &lhs, const Ability &rhs) {\n    return !(lhs == rhs);\n}\n\ntemplate <typename H>\ninline H AbslHashValue(H h, const Ability &obj) {\n  return H::combine(std::move(h), obj.id(), obj.distance());\n}\n\nFLATBUFFERS_MANUALLY_ALIGNED_STRUCT(4) StructOfStructs FLATBUFFERS_FINAL_CLASS {\n private:\n  MyGame::Example::Ability a_;\n  MyGame::Example::Test b_;\n  MyGame::Example::Ability c_;\n\n public:\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return StructOfStructsTypeTable();\n  }\n  StructOfStructs()\n      : a_(),\n        b_(),\n        c_() {\n  }\n  StructOfStructs(const MyGame::Example::Ability &_a, const MyGame::Example::Test &_b, const MyGame::Example::Ability &_c)\n      : a_(_a),\n        b_(_b),\n        c_(_c) {\n  }\n  const MyGame::Example::Ability &a() const {\n    return a_;\n  }\n  MyGame::Example::Ability &mutable_a() {\n    return a_;\n  }\n  const MyGame::Example::Test &b() const {\n    return b_;\n  }\n  MyGame::Example::Test &mutable_b() {\n    return b_;\n  }\n  const MyGame::Example::Ability &c() const {\n    return c_;\n  }\n  MyGame::Example::Ability &mutable_c() {\n    return c_;\n  }\n};\nFLATBUFFERS_STRUCT_END(StructOfStructs, 20);\n\ninline bool operator==(const StructOfStructs &lhs, const StructOfStructs &rhs) {\n  return\n      (lhs.a() == rhs.a()) &&\n      (lhs.b() == rhs.b()) &&\n      (lhs.c() == rhs.c());\n}\n\ninline bool operator!=(const StructOfStructs &lhs, const StructOfStructs &rhs) {\n    return !(lhs == rhs);\n}\n\ntemplate <typename H>\ninline H AbslHashValue(H h, const StructOfStructs &obj) {\n  return H::combine(std::move(h), obj.a(), obj.b(), obj.c());\n}\n\nFLATBUFFERS_MANUALLY_ALIGNED_STRUCT(4) StructOfStructsOfStructs FLATBUFFERS_FINAL_CLASS {\n private:\n  MyGame::Example::StructOfStructs a_;\n\n public:\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return StructOfStructsOfStructsTypeTable();\n  }\n  StructOfStructsOfStructs()\n      : a_() {\n  }\n  StructOfStructsOfStructs(const MyGame::Example::StructOfStructs &_a)\n      : a_(_a) {\n  }\n  const MyGame::Example::StructOfStructs &a() const {\n    return a_;\n  }\n  MyGame::Example::StructOfStructs &mutable_a() {\n    return a_;\n  }\n};\nFLATBUFFERS_STRUCT_END(StructOfStructsOfStructs, 20);\n\ninline bool operator==(const StructOfStructsOfStructs &lhs, const StructOfStructsOfStructs &rhs) {\n  return\n      (lhs.a() == rhs.a());\n}\n\ninline bool operator!=(const StructOfStructsOfStructs &lhs, const StructOfStructsOfStructs &rhs) {\n    return !(lhs == rhs);\n}\n\ntemplate <typename H>\ninline H AbslHashValue(H h, const StructOfStructsOfStructs &obj) {\n  return H::combine(std::move(h), obj.a());\n}\n\n}  // namespace Example\n\nstruct InParentNamespaceT : public ::flatbuffers::NativeTable {\n  typedef InParentNamespace TableType;\n};\n\nstruct InParentNamespace FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef InParentNamespaceT NativeTableType;\n  typedef InParentNamespaceBuilder Builder;\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return InParentNamespaceTypeTable();\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           verifier.EndTable();\n  }\n  InParentNamespaceT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  void UnPackTo(InParentNamespaceT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  static ::flatbuffers::Offset<InParentNamespace> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const InParentNamespaceT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n};\n\nstruct InParentNamespaceBuilder {\n  typedef InParentNamespace Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  explicit InParentNamespaceBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<InParentNamespace> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<InParentNamespace>(end);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<InParentNamespace> CreateInParentNamespace(\n    ::flatbuffers::FlatBufferBuilder &_fbb) {\n  InParentNamespaceBuilder builder_(_fbb);\n  return builder_.Finish();\n}\n\n::flatbuffers::Offset<InParentNamespace> CreateInParentNamespace(::flatbuffers::FlatBufferBuilder &_fbb, const InParentNamespaceT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n\nnamespace Example2 {\n\nstruct MonsterT : public ::flatbuffers::NativeTable {\n  typedef Monster TableType;\n};\n\nstruct Monster FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef MonsterT NativeTableType;\n  typedef MonsterBuilder Builder;\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return MonsterTypeTable();\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           verifier.EndTable();\n  }\n  MonsterT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  void UnPackTo(MonsterT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  static ::flatbuffers::Offset<Monster> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n};\n\nstruct MonsterBuilder {\n  typedef Monster Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  explicit MonsterBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<Monster> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<Monster>(end);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<Monster> CreateMonster(\n    ::flatbuffers::FlatBufferBuilder &_fbb) {\n  MonsterBuilder builder_(_fbb);\n  return builder_.Finish();\n}\n\n::flatbuffers::Offset<Monster> CreateMonster(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n\n}  // namespace Example2\n\nnamespace Example {\n\nstruct TestSimpleTableWithEnumT : public ::flatbuffers::NativeTable {\n  typedef TestSimpleTableWithEnum TableType;\n  MyGame::Example::Color color = MyGame::Example::Color_Green;\n};\n\nstruct TestSimpleTableWithEnum FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef TestSimpleTableWithEnumT NativeTableType;\n  typedef TestSimpleTableWithEnumBuilder Builder;\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return TestSimpleTableWithEnumTypeTable();\n  }\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_COLOR = 4\n  };\n  MyGame::Example::Color color() const {\n    return static_cast<MyGame::Example::Color>(GetField<uint8_t>(VT_COLOR, 2));\n  }\n  bool mutate_color(MyGame::Example::Color _color = static_cast<MyGame::Example::Color>(2)) {\n    return SetField<uint8_t>(VT_COLOR, static_cast<uint8_t>(_color), 2);\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyField<uint8_t>(verifier, VT_COLOR, 1) &&\n           verifier.EndTable();\n  }\n  TestSimpleTableWithEnumT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  void UnPackTo(TestSimpleTableWithEnumT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  static ::flatbuffers::Offset<TestSimpleTableWithEnum> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const TestSimpleTableWithEnumT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n};\n\nstruct TestSimpleTableWithEnumBuilder {\n  typedef TestSimpleTableWithEnum Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_color(MyGame::Example::Color color) {\n    fbb_.AddElement<uint8_t>(TestSimpleTableWithEnum::VT_COLOR, static_cast<uint8_t>(color), 2);\n  }\n  explicit TestSimpleTableWithEnumBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<TestSimpleTableWithEnum> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<TestSimpleTableWithEnum>(end);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<TestSimpleTableWithEnum> CreateTestSimpleTableWithEnum(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    MyGame::Example::Color color = MyGame::Example::Color_Green) {\n  TestSimpleTableWithEnumBuilder builder_(_fbb);\n  builder_.add_color(color);\n  return builder_.Finish();\n}\n\n::flatbuffers::Offset<TestSimpleTableWithEnum> CreateTestSimpleTableWithEnum(::flatbuffers::FlatBufferBuilder &_fbb, const TestSimpleTableWithEnumT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n\nstruct StatT : public ::flatbuffers::NativeTable {\n  typedef Stat TableType;\n  std::string id{};\n  int64_t val = 0;\n  uint16_t count = 0;\n};\n\nstruct Stat FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef StatT NativeTableType;\n  typedef StatBuilder Builder;\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return StatTypeTable();\n  }\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_ID = 4,\n    VT_VAL = 6,\n    VT_COUNT = 8\n  };\n  const ::flatbuffers::String *id() const {\n    return GetPointer<const ::flatbuffers::String *>(VT_ID);\n  }\n  ::flatbuffers::String *mutable_id() {\n    return GetPointer<::flatbuffers::String *>(VT_ID);\n  }\n  int64_t val() const {\n    return GetField<int64_t>(VT_VAL, 0);\n  }\n  bool mutate_val(int64_t _val = 0) {\n    return SetField<int64_t>(VT_VAL, _val, 0);\n  }\n  uint16_t count() const {\n    return GetField<uint16_t>(VT_COUNT, 0);\n  }\n  bool mutate_count(uint16_t _count = 0) {\n    return SetField<uint16_t>(VT_COUNT, _count, 0);\n  }\n  bool KeyCompareLessThan(const Stat * const o) const {\n    return count() < o->count();\n  }\n  int KeyCompareWithValue(uint16_t _count) const {\n    return static_cast<int>(count() > _count) - static_cast<int>(count() < _count);\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyOffset(verifier, VT_ID) &&\n           verifier.VerifyString(id()) &&\n           VerifyField<int64_t>(verifier, VT_VAL, 8) &&\n           VerifyField<uint16_t>(verifier, VT_COUNT, 2) &&\n           verifier.EndTable();\n  }\n  StatT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  void UnPackTo(StatT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  static ::flatbuffers::Offset<Stat> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const StatT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n};\n\nstruct StatBuilder {\n  typedef Stat Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_id(::flatbuffers::Offset<::flatbuffers::String> id) {\n    fbb_.AddOffset(Stat::VT_ID, id);\n  }\n  void add_val(int64_t val) {\n    fbb_.AddElement<int64_t>(Stat::VT_VAL, val, 0);\n  }\n  void add_count(uint16_t count) {\n    fbb_.AddElement<uint16_t>(Stat::VT_COUNT, count, 0);\n  }\n  explicit StatBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<Stat> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<Stat>(end);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<Stat> CreateStat(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    ::flatbuffers::Offset<::flatbuffers::String> id = 0,\n    int64_t val = 0,\n    uint16_t count = 0) {\n  StatBuilder builder_(_fbb);\n  builder_.add_val(val);\n  builder_.add_id(id);\n  builder_.add_count(count);\n  return builder_.Finish();\n}\n\ninline ::flatbuffers::Offset<Stat> CreateStatDirect(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    const char *id = nullptr,\n    int64_t val = 0,\n    uint16_t count = 0) {\n  auto id__ = id ? _fbb.CreateString(id) : 0;\n  return MyGame::Example::CreateStat(\n      _fbb,\n      id__,\n      val,\n      count);\n}\n\n::flatbuffers::Offset<Stat> CreateStat(::flatbuffers::FlatBufferBuilder &_fbb, const StatT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n\nstruct ReferrableT : public ::flatbuffers::NativeTable {\n  typedef Referrable TableType;\n  uint64_t id = 0;\n};\n\nstruct Referrable FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef ReferrableT NativeTableType;\n  typedef ReferrableBuilder Builder;\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return ReferrableTypeTable();\n  }\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_ID = 4\n  };\n  uint64_t id() const {\n    return GetField<uint64_t>(VT_ID, 0);\n  }\n  bool mutate_id(uint64_t _id = 0) {\n    return SetField<uint64_t>(VT_ID, _id, 0);\n  }\n  bool KeyCompareLessThan(const Referrable * const o) const {\n    return id() < o->id();\n  }\n  int KeyCompareWithValue(uint64_t _id) const {\n    return static_cast<int>(id() > _id) - static_cast<int>(id() < _id);\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyField<uint64_t>(verifier, VT_ID, 8) &&\n           verifier.EndTable();\n  }\n  ReferrableT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  void UnPackTo(ReferrableT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  static ::flatbuffers::Offset<Referrable> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ReferrableT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n};\n\nstruct ReferrableBuilder {\n  typedef Referrable Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_id(uint64_t id) {\n    fbb_.AddElement<uint64_t>(Referrable::VT_ID, id, 0);\n  }\n  explicit ReferrableBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<Referrable> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<Referrable>(end);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<Referrable> CreateReferrable(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    uint64_t id = 0) {\n  ReferrableBuilder builder_(_fbb);\n  builder_.add_id(id);\n  return builder_.Finish();\n}\n\n::flatbuffers::Offset<Referrable> CreateReferrable(::flatbuffers::FlatBufferBuilder &_fbb, const ReferrableT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n\nstruct MonsterT : public ::flatbuffers::NativeTable {\n  typedef Monster TableType;\n  std::unique_ptr<MyGame::Example::Vec3> pos{};\n  int16_t mana = 150;\n  int16_t hp = 100;\n  std::string name{};\n  std::vector<uint8_t> inventory{};\n  MyGame::Example::Color color = MyGame::Example::Color_Blue;\n  MyGame::Example::AnyUnion test{};\n  std::vector<MyGame::Example::Test> test4{};\n  std::vector<std::string> testarrayofstring{};\n  std::vector<std::unique_ptr<MyGame::Example::MonsterT>> testarrayoftables{};\n  std::unique_ptr<MyGame::Example::MonsterT> enemy{};\n  std::vector<uint8_t> testnestedflatbuffer{};\n  std::unique_ptr<MyGame::Example::StatT> testempty{};\n  bool testbool = false;\n  int32_t testhashs32_fnv1 = 0;\n  uint32_t testhashu32_fnv1 = 0;\n  int64_t testhashs64_fnv1 = 0;\n  uint64_t testhashu64_fnv1 = 0;\n  int32_t testhashs32_fnv1a = 0;\n  Stat *testhashu32_fnv1a = nullptr;\n  int64_t testhashs64_fnv1a = 0;\n  uint64_t testhashu64_fnv1a = 0;\n  std::vector<bool> testarrayofbools{};\n  float testf = 3.14159f;\n  float testf2 = 3.0f;\n  float testf3 = 0.0f;\n  std::vector<std::string> testarrayofstring2{};\n  std::vector<MyGame::Example::Ability> testarrayofsortedstruct{};\n  std::vector<uint8_t> flex{};\n  std::vector<MyGame::Example::Test> test5{};\n  std::vector<int64_t> vector_of_longs{};\n  std::vector<double> vector_of_doubles{};\n  std::unique_ptr<MyGame::InParentNamespaceT> parent_namespace_test{};\n  std::vector<std::unique_ptr<MyGame::Example::ReferrableT>> vector_of_referrables{};\n  ReferrableT *single_weak_reference = nullptr;\n  std::vector<ReferrableT *> vector_of_weak_references{};\n  std::vector<std::unique_ptr<MyGame::Example::ReferrableT>> vector_of_strong_referrables{};\n  ReferrableT *co_owning_reference = nullptr;\n  std::vector<std::unique_ptr<ReferrableT>> vector_of_co_owning_references{};\n  ReferrableT *non_owning_reference = nullptr;\n  std::vector<ReferrableT *> vector_of_non_owning_references{};\n  MyGame::Example::AnyUniqueAliasesUnion any_unique{};\n  MyGame::Example::AnyAmbiguousAliasesUnion any_ambiguous{};\n  std::vector<MyGame::Example::Color> vector_of_enums{};\n  MyGame::Example::Race signed_enum = MyGame::Example::Race_None;\n  std::vector<uint8_t> testrequirednestedflatbuffer{};\n  std::vector<std::unique_ptr<MyGame::Example::StatT>> scalar_key_sorted_tables{};\n  MyGame::Example::Test native_inline{};\n  MyGame::Example::LongEnum long_enum_non_enum_default = static_cast<MyGame::Example::LongEnum>(0);\n  MyGame::Example::LongEnum long_enum_normal_default = MyGame::Example::LongEnum_LongOne;\n  float nan_default = std::numeric_limits<float>::quiet_NaN();\n  float inf_default = std::numeric_limits<float>::infinity();\n  float positive_inf_default = std::numeric_limits<float>::infinity();\n  float infinity_default = std::numeric_limits<float>::infinity();\n  float positive_infinity_default = std::numeric_limits<float>::infinity();\n  float negative_inf_default = -std::numeric_limits<float>::infinity();\n  float negative_infinity_default = -std::numeric_limits<float>::infinity();\n  double double_inf_default = std::numeric_limits<double>::infinity();\n  MonsterT() = default;\n  MonsterT(const MonsterT &o);\n  MonsterT(MonsterT&&) FLATBUFFERS_NOEXCEPT = default;\n  MonsterT &operator=(MonsterT o) FLATBUFFERS_NOEXCEPT;\n};\n\n/// an example documentation comment: \"monster object\"\nstruct Monster FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef MonsterT NativeTableType;\n  typedef MonsterBuilder Builder;\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return MonsterTypeTable();\n  }\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_POS = 4,\n    VT_MANA = 6,\n    VT_HP = 8,\n    VT_NAME = 10,\n    VT_INVENTORY = 14,\n    VT_COLOR = 16,\n    VT_TEST_TYPE = 18,\n    VT_TEST = 20,\n    VT_TEST4 = 22,\n    VT_TESTARRAYOFSTRING = 24,\n    VT_TESTARRAYOFTABLES = 26,\n    VT_ENEMY = 28,\n    VT_TESTNESTEDFLATBUFFER = 30,\n    VT_TESTEMPTY = 32,\n    VT_TESTBOOL = 34,\n    VT_TESTHASHS32_FNV1 = 36,\n    VT_TESTHASHU32_FNV1 = 38,\n    VT_TESTHASHS64_FNV1 = 40,\n    VT_TESTHASHU64_FNV1 = 42,\n    VT_TESTHASHS32_FNV1A = 44,\n    VT_TESTHASHU32_FNV1A = 46,\n    VT_TESTHASHS64_FNV1A = 48,\n    VT_TESTHASHU64_FNV1A = 50,\n    VT_TESTARRAYOFBOOLS = 52,\n    VT_TESTF = 54,\n    VT_TESTF2 = 56,\n    VT_TESTF3 = 58,\n    VT_TESTARRAYOFSTRING2 = 60,\n    VT_TESTARRAYOFSORTEDSTRUCT = 62,\n    VT_FLEX = 64,\n    VT_TEST5 = 66,\n    VT_VECTOR_OF_LONGS = 68,\n    VT_VECTOR_OF_DOUBLES = 70,\n    VT_PARENT_NAMESPACE_TEST = 72,\n    VT_VECTOR_OF_REFERRABLES = 74,\n    VT_SINGLE_WEAK_REFERENCE = 76,\n    VT_VECTOR_OF_WEAK_REFERENCES = 78,\n    VT_VECTOR_OF_STRONG_REFERRABLES = 80,\n    VT_CO_OWNING_REFERENCE = 82,\n    VT_VECTOR_OF_CO_OWNING_REFERENCES = 84,\n    VT_NON_OWNING_REFERENCE = 86,\n    VT_VECTOR_OF_NON_OWNING_REFERENCES = 88,\n    VT_ANY_UNIQUE_TYPE = 90,\n    VT_ANY_UNIQUE = 92,\n    VT_ANY_AMBIGUOUS_TYPE = 94,\n    VT_ANY_AMBIGUOUS = 96,\n    VT_VECTOR_OF_ENUMS = 98,\n    VT_SIGNED_ENUM = 100,\n    VT_TESTREQUIREDNESTEDFLATBUFFER = 102,\n    VT_SCALAR_KEY_SORTED_TABLES = 104,\n    VT_NATIVE_INLINE = 106,\n    VT_LONG_ENUM_NON_ENUM_DEFAULT = 108,\n    VT_LONG_ENUM_NORMAL_DEFAULT = 110,\n    VT_NAN_DEFAULT = 112,\n    VT_INF_DEFAULT = 114,\n    VT_POSITIVE_INF_DEFAULT = 116,\n    VT_INFINITY_DEFAULT = 118,\n    VT_POSITIVE_INFINITY_DEFAULT = 120,\n    VT_NEGATIVE_INF_DEFAULT = 122,\n    VT_NEGATIVE_INFINITY_DEFAULT = 124,\n    VT_DOUBLE_INF_DEFAULT = 126\n  };\n  const MyGame::Example::Vec3 *pos() const {\n    return GetStruct<const MyGame::Example::Vec3 *>(VT_POS);\n  }\n  MyGame::Example::Vec3 *mutable_pos() {\n    return GetStruct<MyGame::Example::Vec3 *>(VT_POS);\n  }\n  int16_t mana() const {\n    return GetField<int16_t>(VT_MANA, 150);\n  }\n  bool mutate_mana(int16_t _mana = 150) {\n    return SetField<int16_t>(VT_MANA, _mana, 150);\n  }\n  int16_t hp() const {\n    return GetField<int16_t>(VT_HP, 100);\n  }\n  bool mutate_hp(int16_t _hp = 100) {\n    return SetField<int16_t>(VT_HP, _hp, 100);\n  }\n  const ::flatbuffers::String *name() const {\n    return GetPointer<const ::flatbuffers::String *>(VT_NAME);\n  }\n  ::flatbuffers::String *mutable_name() {\n    return GetPointer<::flatbuffers::String *>(VT_NAME);\n  }\n  bool KeyCompareLessThan(const Monster * const o) const {\n    return *name() < *o->name();\n  }\n  int KeyCompareWithValue(const char *_name) const {\n    return strcmp(name()->c_str(), _name);\n  }\n  template<typename StringType>\n  int KeyCompareWithValue(const StringType& _name) const {\n    if (name()->c_str() < _name) return -1;\n    if (_name < name()->c_str()) return 1;\n    return 0;\n  }\n  const ::flatbuffers::Vector<uint8_t> *inventory() const {\n    return GetPointer<const ::flatbuffers::Vector<uint8_t> *>(VT_INVENTORY);\n  }\n  ::flatbuffers::Vector<uint8_t> *mutable_inventory() {\n    return GetPointer<::flatbuffers::Vector<uint8_t> *>(VT_INVENTORY);\n  }\n  MyGame::Example::Color color() const {\n    return static_cast<MyGame::Example::Color>(GetField<uint8_t>(VT_COLOR, 8));\n  }\n  bool mutate_color(MyGame::Example::Color _color = static_cast<MyGame::Example::Color>(8)) {\n    return SetField<uint8_t>(VT_COLOR, static_cast<uint8_t>(_color), 8);\n  }\n  MyGame::Example::Any test_type() const {\n    return static_cast<MyGame::Example::Any>(GetField<uint8_t>(VT_TEST_TYPE, 0));\n  }\n  const void *test() const {\n    return GetPointer<const void *>(VT_TEST);\n  }\n  template<typename T> const T *test_as() const;\n  const MyGame::Example::Monster *test_as_Monster() const {\n    return test_type() == MyGame::Example::Any_Monster ? static_cast<const MyGame::Example::Monster *>(test()) : nullptr;\n  }\n  const MyGame::Example::TestSimpleTableWithEnum *test_as_TestSimpleTableWithEnum() const {\n    return test_type() == MyGame::Example::Any_TestSimpleTableWithEnum ? static_cast<const MyGame::Example::TestSimpleTableWithEnum *>(test()) : nullptr;\n  }\n  const MyGame::Example2::Monster *test_as_MyGame_Example2_Monster() const {\n    return test_type() == MyGame::Example::Any_MyGame_Example2_Monster ? static_cast<const MyGame::Example2::Monster *>(test()) : nullptr;\n  }\n  template<typename T> T *mutable_test_as();\n  MyGame::Example::Monster *mutable_test_as_Monster() {\n    return test_type() == MyGame::Example::Any_Monster ? static_cast<MyGame::Example::Monster *>(mutable_test()) : nullptr;\n  }\n  MyGame::Example::TestSimpleTableWithEnum *mutable_test_as_TestSimpleTableWithEnum() {\n    return test_type() == MyGame::Example::Any_TestSimpleTableWithEnum ? static_cast<MyGame::Example::TestSimpleTableWithEnum *>(mutable_test()) : nullptr;\n  }\n  MyGame::Example2::Monster *mutable_test_as_MyGame_Example2_Monster() {\n    return test_type() == MyGame::Example::Any_MyGame_Example2_Monster ? static_cast<MyGame::Example2::Monster *>(mutable_test()) : nullptr;\n  }\n  void *mutable_test() {\n    return GetPointer<void *>(VT_TEST);\n  }\n  const ::flatbuffers::Vector<const MyGame::Example::Test *> *test4() const {\n    return GetPointer<const ::flatbuffers::Vector<const MyGame::Example::Test *> *>(VT_TEST4);\n  }\n  ::flatbuffers::Vector<const MyGame::Example::Test *> *mutable_test4() {\n    return GetPointer<::flatbuffers::Vector<const MyGame::Example::Test *> *>(VT_TEST4);\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *testarrayofstring() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_TESTARRAYOFSTRING);\n  }\n  ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *mutable_testarrayofstring() {\n    return GetPointer<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_TESTARRAYOFSTRING);\n  }\n  /// an example documentation comment: this will end up in the generated code\n  /// multiline too\n  const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Monster>> *testarrayoftables() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Monster>> *>(VT_TESTARRAYOFTABLES);\n  }\n  ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Monster>> *mutable_testarrayoftables() {\n    return GetPointer<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Monster>> *>(VT_TESTARRAYOFTABLES);\n  }\n  const MyGame::Example::Monster *enemy() const {\n    return GetPointer<const MyGame::Example::Monster *>(VT_ENEMY);\n  }\n  MyGame::Example::Monster *mutable_enemy() {\n    return GetPointer<MyGame::Example::Monster *>(VT_ENEMY);\n  }\n  const ::flatbuffers::Vector<uint8_t> *testnestedflatbuffer() const {\n    return GetPointer<const ::flatbuffers::Vector<uint8_t> *>(VT_TESTNESTEDFLATBUFFER);\n  }\n  ::flatbuffers::Vector<uint8_t> *mutable_testnestedflatbuffer() {\n    return GetPointer<::flatbuffers::Vector<uint8_t> *>(VT_TESTNESTEDFLATBUFFER);\n  }\n  const MyGame::Example::Monster *testnestedflatbuffer_nested_root() const {\n    const auto _f = testnestedflatbuffer();\n    return _f ? ::flatbuffers::GetRoot<MyGame::Example::Monster>(_f->Data())\n              : nullptr;\n  }\n  const MyGame::Example::Stat *testempty() const {\n    return GetPointer<const MyGame::Example::Stat *>(VT_TESTEMPTY);\n  }\n  MyGame::Example::Stat *mutable_testempty() {\n    return GetPointer<MyGame::Example::Stat *>(VT_TESTEMPTY);\n  }\n  bool testbool() const {\n    return GetField<uint8_t>(VT_TESTBOOL, 0) != 0;\n  }\n  bool mutate_testbool(bool _testbool = 0) {\n    return SetField<uint8_t>(VT_TESTBOOL, static_cast<uint8_t>(_testbool), 0);\n  }\n  int32_t testhashs32_fnv1() const {\n    return GetField<int32_t>(VT_TESTHASHS32_FNV1, 0);\n  }\n  bool mutate_testhashs32_fnv1(int32_t _testhashs32_fnv1 = 0) {\n    return SetField<int32_t>(VT_TESTHASHS32_FNV1, _testhashs32_fnv1, 0);\n  }\n  uint32_t testhashu32_fnv1() const {\n    return GetField<uint32_t>(VT_TESTHASHU32_FNV1, 0);\n  }\n  bool mutate_testhashu32_fnv1(uint32_t _testhashu32_fnv1 = 0) {\n    return SetField<uint32_t>(VT_TESTHASHU32_FNV1, _testhashu32_fnv1, 0);\n  }\n  int64_t testhashs64_fnv1() const {\n    return GetField<int64_t>(VT_TESTHASHS64_FNV1, 0);\n  }\n  bool mutate_testhashs64_fnv1(int64_t _testhashs64_fnv1 = 0) {\n    return SetField<int64_t>(VT_TESTHASHS64_FNV1, _testhashs64_fnv1, 0);\n  }\n  uint64_t testhashu64_fnv1() const {\n    return GetField<uint64_t>(VT_TESTHASHU64_FNV1, 0);\n  }\n  bool mutate_testhashu64_fnv1(uint64_t _testhashu64_fnv1 = 0) {\n    return SetField<uint64_t>(VT_TESTHASHU64_FNV1, _testhashu64_fnv1, 0);\n  }\n  int32_t testhashs32_fnv1a() const {\n    return GetField<int32_t>(VT_TESTHASHS32_FNV1A, 0);\n  }\n  bool mutate_testhashs32_fnv1a(int32_t _testhashs32_fnv1a = 0) {\n    return SetField<int32_t>(VT_TESTHASHS32_FNV1A, _testhashs32_fnv1a, 0);\n  }\n  uint32_t testhashu32_fnv1a() const {\n    return GetField<uint32_t>(VT_TESTHASHU32_FNV1A, 0);\n  }\n  bool mutate_testhashu32_fnv1a(uint32_t _testhashu32_fnv1a = 0) {\n    return SetField<uint32_t>(VT_TESTHASHU32_FNV1A, _testhashu32_fnv1a, 0);\n  }\n  int64_t testhashs64_fnv1a() const {\n    return GetField<int64_t>(VT_TESTHASHS64_FNV1A, 0);\n  }\n  bool mutate_testhashs64_fnv1a(int64_t _testhashs64_fnv1a = 0) {\n    return SetField<int64_t>(VT_TESTHASHS64_FNV1A, _testhashs64_fnv1a, 0);\n  }\n  uint64_t testhashu64_fnv1a() const {\n    return GetField<uint64_t>(VT_TESTHASHU64_FNV1A, 0);\n  }\n  bool mutate_testhashu64_fnv1a(uint64_t _testhashu64_fnv1a = 0) {\n    return SetField<uint64_t>(VT_TESTHASHU64_FNV1A, _testhashu64_fnv1a, 0);\n  }\n  const ::flatbuffers::Vector<uint8_t> *testarrayofbools() const {\n    return GetPointer<const ::flatbuffers::Vector<uint8_t> *>(VT_TESTARRAYOFBOOLS);\n  }\n  ::flatbuffers::Vector<uint8_t> *mutable_testarrayofbools() {\n    return GetPointer<::flatbuffers::Vector<uint8_t> *>(VT_TESTARRAYOFBOOLS);\n  }\n  float testf() const {\n    return GetField<float>(VT_TESTF, 3.14159f);\n  }\n  bool mutate_testf(float _testf = 3.14159f) {\n    return SetField<float>(VT_TESTF, _testf, 3.14159f);\n  }\n  float testf2() const {\n    return GetField<float>(VT_TESTF2, 3.0f);\n  }\n  bool mutate_testf2(float _testf2 = 3.0f) {\n    return SetField<float>(VT_TESTF2, _testf2, 3.0f);\n  }\n  float testf3() const {\n    return GetField<float>(VT_TESTF3, 0.0f);\n  }\n  bool mutate_testf3(float _testf3 = 0.0f) {\n    return SetField<float>(VT_TESTF3, _testf3, 0.0f);\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *testarrayofstring2() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_TESTARRAYOFSTRING2);\n  }\n  ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *mutable_testarrayofstring2() {\n    return GetPointer<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_TESTARRAYOFSTRING2);\n  }\n  const ::flatbuffers::Vector<const MyGame::Example::Ability *> *testarrayofsortedstruct() const {\n    return GetPointer<const ::flatbuffers::Vector<const MyGame::Example::Ability *> *>(VT_TESTARRAYOFSORTEDSTRUCT);\n  }\n  ::flatbuffers::Vector<const MyGame::Example::Ability *> *mutable_testarrayofsortedstruct() {\n    return GetPointer<::flatbuffers::Vector<const MyGame::Example::Ability *> *>(VT_TESTARRAYOFSORTEDSTRUCT);\n  }\n  const ::flatbuffers::Vector<uint8_t> *flex() const {\n    return GetPointer<const ::flatbuffers::Vector<uint8_t> *>(VT_FLEX);\n  }\n  ::flatbuffers::Vector<uint8_t> *mutable_flex() {\n    return GetPointer<::flatbuffers::Vector<uint8_t> *>(VT_FLEX);\n  }\n  flexbuffers::Reference flex_flexbuffer_root() const {\n    const auto _f = flex();\n    return _f ? flexbuffers::GetRoot(_f->Data(), _f->size())\n              : flexbuffers::Reference();\n  }\n  const ::flatbuffers::Vector<const MyGame::Example::Test *> *test5() const {\n    return GetPointer<const ::flatbuffers::Vector<const MyGame::Example::Test *> *>(VT_TEST5);\n  }\n  ::flatbuffers::Vector<const MyGame::Example::Test *> *mutable_test5() {\n    return GetPointer<::flatbuffers::Vector<const MyGame::Example::Test *> *>(VT_TEST5);\n  }\n  const ::flatbuffers::Vector<int64_t> *vector_of_longs() const {\n    return GetPointer<const ::flatbuffers::Vector<int64_t> *>(VT_VECTOR_OF_LONGS);\n  }\n  ::flatbuffers::Vector<int64_t> *mutable_vector_of_longs() {\n    return GetPointer<::flatbuffers::Vector<int64_t> *>(VT_VECTOR_OF_LONGS);\n  }\n  const ::flatbuffers::Vector<double> *vector_of_doubles() const {\n    return GetPointer<const ::flatbuffers::Vector<double> *>(VT_VECTOR_OF_DOUBLES);\n  }\n  ::flatbuffers::Vector<double> *mutable_vector_of_doubles() {\n    return GetPointer<::flatbuffers::Vector<double> *>(VT_VECTOR_OF_DOUBLES);\n  }\n  const MyGame::InParentNamespace *parent_namespace_test() const {\n    return GetPointer<const MyGame::InParentNamespace *>(VT_PARENT_NAMESPACE_TEST);\n  }\n  MyGame::InParentNamespace *mutable_parent_namespace_test() {\n    return GetPointer<MyGame::InParentNamespace *>(VT_PARENT_NAMESPACE_TEST);\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *vector_of_referrables() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *>(VT_VECTOR_OF_REFERRABLES);\n  }\n  ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *mutable_vector_of_referrables() {\n    return GetPointer<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *>(VT_VECTOR_OF_REFERRABLES);\n  }\n  uint64_t single_weak_reference() const {\n    return GetField<uint64_t>(VT_SINGLE_WEAK_REFERENCE, 0);\n  }\n  bool mutate_single_weak_reference(uint64_t _single_weak_reference = 0) {\n    return SetField<uint64_t>(VT_SINGLE_WEAK_REFERENCE, _single_weak_reference, 0);\n  }\n  const ::flatbuffers::Vector<uint64_t> *vector_of_weak_references() const {\n    return GetPointer<const ::flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_WEAK_REFERENCES);\n  }\n  ::flatbuffers::Vector<uint64_t> *mutable_vector_of_weak_references() {\n    return GetPointer<::flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_WEAK_REFERENCES);\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *vector_of_strong_referrables() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *>(VT_VECTOR_OF_STRONG_REFERRABLES);\n  }\n  ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *mutable_vector_of_strong_referrables() {\n    return GetPointer<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *>(VT_VECTOR_OF_STRONG_REFERRABLES);\n  }\n  uint64_t co_owning_reference() const {\n    return GetField<uint64_t>(VT_CO_OWNING_REFERENCE, 0);\n  }\n  bool mutate_co_owning_reference(uint64_t _co_owning_reference = 0) {\n    return SetField<uint64_t>(VT_CO_OWNING_REFERENCE, _co_owning_reference, 0);\n  }\n  const ::flatbuffers::Vector<uint64_t> *vector_of_co_owning_references() const {\n    return GetPointer<const ::flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_CO_OWNING_REFERENCES);\n  }\n  ::flatbuffers::Vector<uint64_t> *mutable_vector_of_co_owning_references() {\n    return GetPointer<::flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_CO_OWNING_REFERENCES);\n  }\n  uint64_t non_owning_reference() const {\n    return GetField<uint64_t>(VT_NON_OWNING_REFERENCE, 0);\n  }\n  bool mutate_non_owning_reference(uint64_t _non_owning_reference = 0) {\n    return SetField<uint64_t>(VT_NON_OWNING_REFERENCE, _non_owning_reference, 0);\n  }\n  const ::flatbuffers::Vector<uint64_t> *vector_of_non_owning_references() const {\n    return GetPointer<const ::flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_NON_OWNING_REFERENCES);\n  }\n  ::flatbuffers::Vector<uint64_t> *mutable_vector_of_non_owning_references() {\n    return GetPointer<::flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_NON_OWNING_REFERENCES);\n  }\n  MyGame::Example::AnyUniqueAliases any_unique_type() const {\n    return static_cast<MyGame::Example::AnyUniqueAliases>(GetField<uint8_t>(VT_ANY_UNIQUE_TYPE, 0));\n  }\n  const void *any_unique() const {\n    return GetPointer<const void *>(VT_ANY_UNIQUE);\n  }\n  template<typename T> const T *any_unique_as() const;\n  const MyGame::Example::Monster *any_unique_as_M() const {\n    return any_unique_type() == MyGame::Example::AnyUniqueAliases_M ? static_cast<const MyGame::Example::Monster *>(any_unique()) : nullptr;\n  }\n  const MyGame::Example::TestSimpleTableWithEnum *any_unique_as_TS() const {\n    return any_unique_type() == MyGame::Example::AnyUniqueAliases_TS ? static_cast<const MyGame::Example::TestSimpleTableWithEnum *>(any_unique()) : nullptr;\n  }\n  const MyGame::Example2::Monster *any_unique_as_M2() const {\n    return any_unique_type() == MyGame::Example::AnyUniqueAliases_M2 ? static_cast<const MyGame::Example2::Monster *>(any_unique()) : nullptr;\n  }\n  template<typename T> T *mutable_any_unique_as();\n  MyGame::Example::Monster *mutable_any_unique_as_M() {\n    return any_unique_type() == MyGame::Example::AnyUniqueAliases_M ? static_cast<MyGame::Example::Monster *>(mutable_any_unique()) : nullptr;\n  }\n  MyGame::Example::TestSimpleTableWithEnum *mutable_any_unique_as_TS() {\n    return any_unique_type() == MyGame::Example::AnyUniqueAliases_TS ? static_cast<MyGame::Example::TestSimpleTableWithEnum *>(mutable_any_unique()) : nullptr;\n  }\n  MyGame::Example2::Monster *mutable_any_unique_as_M2() {\n    return any_unique_type() == MyGame::Example::AnyUniqueAliases_M2 ? static_cast<MyGame::Example2::Monster *>(mutable_any_unique()) : nullptr;\n  }\n  void *mutable_any_unique() {\n    return GetPointer<void *>(VT_ANY_UNIQUE);\n  }\n  MyGame::Example::AnyAmbiguousAliases any_ambiguous_type() const {\n    return static_cast<MyGame::Example::AnyAmbiguousAliases>(GetField<uint8_t>(VT_ANY_AMBIGUOUS_TYPE, 0));\n  }\n  const void *any_ambiguous() const {\n    return GetPointer<const void *>(VT_ANY_AMBIGUOUS);\n  }\n  const MyGame::Example::Monster *any_ambiguous_as_M1() const {\n    return any_ambiguous_type() == MyGame::Example::AnyAmbiguousAliases_M1 ? static_cast<const MyGame::Example::Monster *>(any_ambiguous()) : nullptr;\n  }\n  const MyGame::Example::Monster *any_ambiguous_as_M2() const {\n    return any_ambiguous_type() == MyGame::Example::AnyAmbiguousAliases_M2 ? static_cast<const MyGame::Example::Monster *>(any_ambiguous()) : nullptr;\n  }\n  const MyGame::Example::Monster *any_ambiguous_as_M3() const {\n    return any_ambiguous_type() == MyGame::Example::AnyAmbiguousAliases_M3 ? static_cast<const MyGame::Example::Monster *>(any_ambiguous()) : nullptr;\n  }\n  MyGame::Example::Monster *mutable_any_ambiguous_as_M1() {\n    return any_ambiguous_type() == MyGame::Example::AnyAmbiguousAliases_M1 ? static_cast<MyGame::Example::Monster *>(mutable_any_ambiguous()) : nullptr;\n  }\n  MyGame::Example::Monster *mutable_any_ambiguous_as_M2() {\n    return any_ambiguous_type() == MyGame::Example::AnyAmbiguousAliases_M2 ? static_cast<MyGame::Example::Monster *>(mutable_any_ambiguous()) : nullptr;\n  }\n  MyGame::Example::Monster *mutable_any_ambiguous_as_M3() {\n    return any_ambiguous_type() == MyGame::Example::AnyAmbiguousAliases_M3 ? static_cast<MyGame::Example::Monster *>(mutable_any_ambiguous()) : nullptr;\n  }\n  void *mutable_any_ambiguous() {\n    return GetPointer<void *>(VT_ANY_AMBIGUOUS);\n  }\n  const ::flatbuffers::Vector<uint8_t> *vector_of_enums() const {\n    return GetPointer<const ::flatbuffers::Vector<uint8_t> *>(VT_VECTOR_OF_ENUMS);\n  }\n  ::flatbuffers::Vector<uint8_t> *mutable_vector_of_enums() {\n    return GetPointer<::flatbuffers::Vector<uint8_t> *>(VT_VECTOR_OF_ENUMS);\n  }\n  MyGame::Example::Race signed_enum() const {\n    return static_cast<MyGame::Example::Race>(GetField<int8_t>(VT_SIGNED_ENUM, -1));\n  }\n  bool mutate_signed_enum(MyGame::Example::Race _signed_enum = static_cast<MyGame::Example::Race>(-1)) {\n    return SetField<int8_t>(VT_SIGNED_ENUM, static_cast<int8_t>(_signed_enum), -1);\n  }\n  const ::flatbuffers::Vector<uint8_t> *testrequirednestedflatbuffer() const {\n    return GetPointer<const ::flatbuffers::Vector<uint8_t> *>(VT_TESTREQUIREDNESTEDFLATBUFFER);\n  }\n  ::flatbuffers::Vector<uint8_t> *mutable_testrequirednestedflatbuffer() {\n    return GetPointer<::flatbuffers::Vector<uint8_t> *>(VT_TESTREQUIREDNESTEDFLATBUFFER);\n  }\n  const MyGame::Example::Monster *testrequirednestedflatbuffer_nested_root() const {\n    const auto _f = testrequirednestedflatbuffer();\n    return _f ? ::flatbuffers::GetRoot<MyGame::Example::Monster>(_f->Data())\n              : nullptr;\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Stat>> *scalar_key_sorted_tables() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Stat>> *>(VT_SCALAR_KEY_SORTED_TABLES);\n  }\n  ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Stat>> *mutable_scalar_key_sorted_tables() {\n    return GetPointer<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Stat>> *>(VT_SCALAR_KEY_SORTED_TABLES);\n  }\n  const MyGame::Example::Test *native_inline() const {\n    return GetStruct<const MyGame::Example::Test *>(VT_NATIVE_INLINE);\n  }\n  MyGame::Example::Test *mutable_native_inline() {\n    return GetStruct<MyGame::Example::Test *>(VT_NATIVE_INLINE);\n  }\n  MyGame::Example::LongEnum long_enum_non_enum_default() const {\n    return static_cast<MyGame::Example::LongEnum>(GetField<uint64_t>(VT_LONG_ENUM_NON_ENUM_DEFAULT, 0));\n  }\n  bool mutate_long_enum_non_enum_default(MyGame::Example::LongEnum _long_enum_non_enum_default = static_cast<MyGame::Example::LongEnum>(0)) {\n    return SetField<uint64_t>(VT_LONG_ENUM_NON_ENUM_DEFAULT, static_cast<uint64_t>(_long_enum_non_enum_default), 0);\n  }\n  MyGame::Example::LongEnum long_enum_normal_default() const {\n    return static_cast<MyGame::Example::LongEnum>(GetField<uint64_t>(VT_LONG_ENUM_NORMAL_DEFAULT, 2ULL));\n  }\n  bool mutate_long_enum_normal_default(MyGame::Example::LongEnum _long_enum_normal_default = static_cast<MyGame::Example::LongEnum>(2ULL)) {\n    return SetField<uint64_t>(VT_LONG_ENUM_NORMAL_DEFAULT, static_cast<uint64_t>(_long_enum_normal_default), 2ULL);\n  }\n  float nan_default() const {\n    return GetField<float>(VT_NAN_DEFAULT, std::numeric_limits<float>::quiet_NaN());\n  }\n  bool mutate_nan_default(float _nan_default = std::numeric_limits<float>::quiet_NaN()) {\n    return SetField<float>(VT_NAN_DEFAULT, _nan_default, std::numeric_limits<float>::quiet_NaN());\n  }\n  float inf_default() const {\n    return GetField<float>(VT_INF_DEFAULT, std::numeric_limits<float>::infinity());\n  }\n  bool mutate_inf_default(float _inf_default = std::numeric_limits<float>::infinity()) {\n    return SetField<float>(VT_INF_DEFAULT, _inf_default, std::numeric_limits<float>::infinity());\n  }\n  float positive_inf_default() const {\n    return GetField<float>(VT_POSITIVE_INF_DEFAULT, std::numeric_limits<float>::infinity());\n  }\n  bool mutate_positive_inf_default(float _positive_inf_default = std::numeric_limits<float>::infinity()) {\n    return SetField<float>(VT_POSITIVE_INF_DEFAULT, _positive_inf_default, std::numeric_limits<float>::infinity());\n  }\n  float infinity_default() const {\n    return GetField<float>(VT_INFINITY_DEFAULT, std::numeric_limits<float>::infinity());\n  }\n  bool mutate_infinity_default(float _infinity_default = std::numeric_limits<float>::infinity()) {\n    return SetField<float>(VT_INFINITY_DEFAULT, _infinity_default, std::numeric_limits<float>::infinity());\n  }\n  float positive_infinity_default() const {\n    return GetField<float>(VT_POSITIVE_INFINITY_DEFAULT, std::numeric_limits<float>::infinity());\n  }\n  bool mutate_positive_infinity_default(float _positive_infinity_default = std::numeric_limits<float>::infinity()) {\n    return SetField<float>(VT_POSITIVE_INFINITY_DEFAULT, _positive_infinity_default, std::numeric_limits<float>::infinity());\n  }\n  float negative_inf_default() const {\n    return GetField<float>(VT_NEGATIVE_INF_DEFAULT, -std::numeric_limits<float>::infinity());\n  }\n  bool mutate_negative_inf_default(float _negative_inf_default = -std::numeric_limits<float>::infinity()) {\n    return SetField<float>(VT_NEGATIVE_INF_DEFAULT, _negative_inf_default, -std::numeric_limits<float>::infinity());\n  }\n  float negative_infinity_default() const {\n    return GetField<float>(VT_NEGATIVE_INFINITY_DEFAULT, -std::numeric_limits<float>::infinity());\n  }\n  bool mutate_negative_infinity_default(float _negative_infinity_default = -std::numeric_limits<float>::infinity()) {\n    return SetField<float>(VT_NEGATIVE_INFINITY_DEFAULT, _negative_infinity_default, -std::numeric_limits<float>::infinity());\n  }\n  double double_inf_default() const {\n    return GetField<double>(VT_DOUBLE_INF_DEFAULT, std::numeric_limits<double>::infinity());\n  }\n  bool mutate_double_inf_default(double _double_inf_default = std::numeric_limits<double>::infinity()) {\n    return SetField<double>(VT_DOUBLE_INF_DEFAULT, _double_inf_default, std::numeric_limits<double>::infinity());\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyField<MyGame::Example::Vec3>(verifier, VT_POS, 8) &&\n           VerifyField<int16_t>(verifier, VT_MANA, 2) &&\n           VerifyField<int16_t>(verifier, VT_HP, 2) &&\n           VerifyOffsetRequired(verifier, VT_NAME) &&\n           verifier.VerifyString(name()) &&\n           VerifyOffset(verifier, VT_INVENTORY) &&\n           verifier.VerifyVector(inventory()) &&\n           VerifyField<uint8_t>(verifier, VT_COLOR, 1) &&\n           VerifyField<uint8_t>(verifier, VT_TEST_TYPE, 1) &&\n           VerifyOffset(verifier, VT_TEST) &&\n           VerifyAny(verifier, test(), test_type()) &&\n           VerifyOffset(verifier, VT_TEST4) &&\n           verifier.VerifyVector(test4()) &&\n           VerifyOffset(verifier, VT_TESTARRAYOFSTRING) &&\n           verifier.VerifyVector(testarrayofstring()) &&\n           verifier.VerifyVectorOfStrings(testarrayofstring()) &&\n           VerifyOffset(verifier, VT_TESTARRAYOFTABLES) &&\n           verifier.VerifyVector(testarrayoftables()) &&\n           verifier.VerifyVectorOfTables(testarrayoftables()) &&\n           VerifyOffset(verifier, VT_ENEMY) &&\n           verifier.VerifyTable(enemy()) &&\n           VerifyOffset(verifier, VT_TESTNESTEDFLATBUFFER) &&\n           verifier.VerifyVector(testnestedflatbuffer()) &&\n           verifier.template VerifyNestedFlatBuffer<MyGame::Example::Monster>(testnestedflatbuffer(), nullptr) &&\n           VerifyOffset(verifier, VT_TESTEMPTY) &&\n           verifier.VerifyTable(testempty()) &&\n           VerifyField<uint8_t>(verifier, VT_TESTBOOL, 1) &&\n           VerifyField<int32_t>(verifier, VT_TESTHASHS32_FNV1, 4) &&\n           VerifyField<uint32_t>(verifier, VT_TESTHASHU32_FNV1, 4) &&\n           VerifyField<int64_t>(verifier, VT_TESTHASHS64_FNV1, 8) &&\n           VerifyField<uint64_t>(verifier, VT_TESTHASHU64_FNV1, 8) &&\n           VerifyField<int32_t>(verifier, VT_TESTHASHS32_FNV1A, 4) &&\n           VerifyField<uint32_t>(verifier, VT_TESTHASHU32_FNV1A, 4) &&\n           VerifyField<int64_t>(verifier, VT_TESTHASHS64_FNV1A, 8) &&\n           VerifyField<uint64_t>(verifier, VT_TESTHASHU64_FNV1A, 8) &&\n           VerifyOffset(verifier, VT_TESTARRAYOFBOOLS) &&\n           verifier.VerifyVector(testarrayofbools()) &&\n           VerifyField<float>(verifier, VT_TESTF, 4) &&\n           VerifyField<float>(verifier, VT_TESTF2, 4) &&\n           VerifyField<float>(verifier, VT_TESTF3, 4) &&\n           VerifyOffset(verifier, VT_TESTARRAYOFSTRING2) &&\n           verifier.VerifyVector(testarrayofstring2()) &&\n           verifier.VerifyVectorOfStrings(testarrayofstring2()) &&\n           VerifyOffset(verifier, VT_TESTARRAYOFSORTEDSTRUCT) &&\n           verifier.VerifyVector(testarrayofsortedstruct()) &&\n           VerifyOffset(verifier, VT_FLEX) &&\n           verifier.VerifyVector(flex()) &&\n           flexbuffers::VerifyNestedFlexBuffer(flex(), verifier) &&\n           VerifyOffset(verifier, VT_TEST5) &&\n           verifier.VerifyVector(test5()) &&\n           VerifyOffset(verifier, VT_VECTOR_OF_LONGS) &&\n           verifier.VerifyVector(vector_of_longs()) &&\n           VerifyOffset(verifier, VT_VECTOR_OF_DOUBLES) &&\n           verifier.VerifyVector(vector_of_doubles()) &&\n           VerifyOffset(verifier, VT_PARENT_NAMESPACE_TEST) &&\n           verifier.VerifyTable(parent_namespace_test()) &&\n           VerifyOffset(verifier, VT_VECTOR_OF_REFERRABLES) &&\n           verifier.VerifyVector(vector_of_referrables()) &&\n           verifier.VerifyVectorOfTables(vector_of_referrables()) &&\n           VerifyField<uint64_t>(verifier, VT_SINGLE_WEAK_REFERENCE, 8) &&\n           VerifyOffset(verifier, VT_VECTOR_OF_WEAK_REFERENCES) &&\n           verifier.VerifyVector(vector_of_weak_references()) &&\n           VerifyOffset(verifier, VT_VECTOR_OF_STRONG_REFERRABLES) &&\n           verifier.VerifyVector(vector_of_strong_referrables()) &&\n           verifier.VerifyVectorOfTables(vector_of_strong_referrables()) &&\n           VerifyField<uint64_t>(verifier, VT_CO_OWNING_REFERENCE, 8) &&\n           VerifyOffset(verifier, VT_VECTOR_OF_CO_OWNING_REFERENCES) &&\n           verifier.VerifyVector(vector_of_co_owning_references()) &&\n           VerifyField<uint64_t>(verifier, VT_NON_OWNING_REFERENCE, 8) &&\n           VerifyOffset(verifier, VT_VECTOR_OF_NON_OWNING_REFERENCES) &&\n           verifier.VerifyVector(vector_of_non_owning_references()) &&\n           VerifyField<uint8_t>(verifier, VT_ANY_UNIQUE_TYPE, 1) &&\n           VerifyOffset(verifier, VT_ANY_UNIQUE) &&\n           VerifyAnyUniqueAliases(verifier, any_unique(), any_unique_type()) &&\n           VerifyField<uint8_t>(verifier, VT_ANY_AMBIGUOUS_TYPE, 1) &&\n           VerifyOffset(verifier, VT_ANY_AMBIGUOUS) &&\n           VerifyAnyAmbiguousAliases(verifier, any_ambiguous(), any_ambiguous_type()) &&\n           VerifyOffset(verifier, VT_VECTOR_OF_ENUMS) &&\n           verifier.VerifyVector(vector_of_enums()) &&\n           VerifyField<int8_t>(verifier, VT_SIGNED_ENUM, 1) &&\n           VerifyOffset(verifier, VT_TESTREQUIREDNESTEDFLATBUFFER) &&\n           verifier.VerifyVector(testrequirednestedflatbuffer()) &&\n           verifier.template VerifyNestedFlatBuffer<MyGame::Example::Monster>(testrequirednestedflatbuffer(), nullptr) &&\n           VerifyOffset(verifier, VT_SCALAR_KEY_SORTED_TABLES) &&\n           verifier.VerifyVector(scalar_key_sorted_tables()) &&\n           verifier.VerifyVectorOfTables(scalar_key_sorted_tables()) &&\n           VerifyField<MyGame::Example::Test>(verifier, VT_NATIVE_INLINE, 2) &&\n           VerifyField<uint64_t>(verifier, VT_LONG_ENUM_NON_ENUM_DEFAULT, 8) &&\n           VerifyField<uint64_t>(verifier, VT_LONG_ENUM_NORMAL_DEFAULT, 8) &&\n           VerifyField<float>(verifier, VT_NAN_DEFAULT, 4) &&\n           VerifyField<float>(verifier, VT_INF_DEFAULT, 4) &&\n           VerifyField<float>(verifier, VT_POSITIVE_INF_DEFAULT, 4) &&\n           VerifyField<float>(verifier, VT_INFINITY_DEFAULT, 4) &&\n           VerifyField<float>(verifier, VT_POSITIVE_INFINITY_DEFAULT, 4) &&\n           VerifyField<float>(verifier, VT_NEGATIVE_INF_DEFAULT, 4) &&\n           VerifyField<float>(verifier, VT_NEGATIVE_INFINITY_DEFAULT, 4) &&\n           VerifyField<double>(verifier, VT_DOUBLE_INF_DEFAULT, 8) &&\n           verifier.EndTable();\n  }\n  MonsterT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  void UnPackTo(MonsterT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  static ::flatbuffers::Offset<Monster> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n};\n\ntemplate<> inline const MyGame::Example::Monster *Monster::test_as<MyGame::Example::Monster>() const {\n  return test_as_Monster();\n}\n\ntemplate<> inline MyGame::Example::Monster *Monster::mutable_test_as<MyGame::Example::Monster>() {\n  return mutable_test_as_Monster();\n}\n\ntemplate<> inline const MyGame::Example::TestSimpleTableWithEnum *Monster::test_as<MyGame::Example::TestSimpleTableWithEnum>() const {\n  return test_as_TestSimpleTableWithEnum();\n}\n\ntemplate<> inline MyGame::Example::TestSimpleTableWithEnum *Monster::mutable_test_as<MyGame::Example::TestSimpleTableWithEnum>() {\n  return mutable_test_as_TestSimpleTableWithEnum();\n}\n\ntemplate<> inline const MyGame::Example2::Monster *Monster::test_as<MyGame::Example2::Monster>() const {\n  return test_as_MyGame_Example2_Monster();\n}\n\ntemplate<> inline MyGame::Example2::Monster *Monster::mutable_test_as<MyGame::Example2::Monster>() {\n  return mutable_test_as_MyGame_Example2_Monster();\n}\n\ntemplate<> inline const MyGame::Example::Monster *Monster::any_unique_as<MyGame::Example::Monster>() const {\n  return any_unique_as_M();\n}\n\ntemplate<> inline MyGame::Example::Monster *Monster::mutable_any_unique_as<MyGame::Example::Monster>() {\n  return mutable_any_unique_as_M();\n}\n\ntemplate<> inline const MyGame::Example::TestSimpleTableWithEnum *Monster::any_unique_as<MyGame::Example::TestSimpleTableWithEnum>() const {\n  return any_unique_as_TS();\n}\n\ntemplate<> inline MyGame::Example::TestSimpleTableWithEnum *Monster::mutable_any_unique_as<MyGame::Example::TestSimpleTableWithEnum>() {\n  return mutable_any_unique_as_TS();\n}\n\ntemplate<> inline const MyGame::Example2::Monster *Monster::any_unique_as<MyGame::Example2::Monster>() const {\n  return any_unique_as_M2();\n}\n\ntemplate<> inline MyGame::Example2::Monster *Monster::mutable_any_unique_as<MyGame::Example2::Monster>() {\n  return mutable_any_unique_as_M2();\n}\n\nstruct MonsterBuilder {\n  typedef Monster Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_pos(const MyGame::Example::Vec3 *pos) {\n    fbb_.AddStruct(Monster::VT_POS, pos);\n  }\n  void add_mana(int16_t mana) {\n    fbb_.AddElement<int16_t>(Monster::VT_MANA, mana, 150);\n  }\n  void add_hp(int16_t hp) {\n    fbb_.AddElement<int16_t>(Monster::VT_HP, hp, 100);\n  }\n  void add_name(::flatbuffers::Offset<::flatbuffers::String> name) {\n    fbb_.AddOffset(Monster::VT_NAME, name);\n  }\n  void add_inventory(::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> inventory) {\n    fbb_.AddOffset(Monster::VT_INVENTORY, inventory);\n  }\n  void add_color(MyGame::Example::Color color) {\n    fbb_.AddElement<uint8_t>(Monster::VT_COLOR, static_cast<uint8_t>(color), 8);\n  }\n  void add_test_type(MyGame::Example::Any test_type) {\n    fbb_.AddElement<uint8_t>(Monster::VT_TEST_TYPE, static_cast<uint8_t>(test_type), 0);\n  }\n  void add_test(::flatbuffers::Offset<void> test) {\n    fbb_.AddOffset(Monster::VT_TEST, test);\n  }\n  void add_test4(::flatbuffers::Offset<::flatbuffers::Vector<const MyGame::Example::Test *>> test4) {\n    fbb_.AddOffset(Monster::VT_TEST4, test4);\n  }\n  void add_testarrayofstring(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> testarrayofstring) {\n    fbb_.AddOffset(Monster::VT_TESTARRAYOFSTRING, testarrayofstring);\n  }\n  void add_testarrayoftables(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Monster>>> testarrayoftables) {\n    fbb_.AddOffset(Monster::VT_TESTARRAYOFTABLES, testarrayoftables);\n  }\n  void add_enemy(::flatbuffers::Offset<MyGame::Example::Monster> enemy) {\n    fbb_.AddOffset(Monster::VT_ENEMY, enemy);\n  }\n  void add_testnestedflatbuffer(::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> testnestedflatbuffer) {\n    fbb_.AddOffset(Monster::VT_TESTNESTEDFLATBUFFER, testnestedflatbuffer);\n  }\n  void add_testempty(::flatbuffers::Offset<MyGame::Example::Stat> testempty) {\n    fbb_.AddOffset(Monster::VT_TESTEMPTY, testempty);\n  }\n  void add_testbool(bool testbool) {\n    fbb_.AddElement<uint8_t>(Monster::VT_TESTBOOL, static_cast<uint8_t>(testbool), 0);\n  }\n  void add_testhashs32_fnv1(int32_t testhashs32_fnv1) {\n    fbb_.AddElement<int32_t>(Monster::VT_TESTHASHS32_FNV1, testhashs32_fnv1, 0);\n  }\n  void add_testhashu32_fnv1(uint32_t testhashu32_fnv1) {\n    fbb_.AddElement<uint32_t>(Monster::VT_TESTHASHU32_FNV1, testhashu32_fnv1, 0);\n  }\n  void add_testhashs64_fnv1(int64_t testhashs64_fnv1) {\n    fbb_.AddElement<int64_t>(Monster::VT_TESTHASHS64_FNV1, testhashs64_fnv1, 0);\n  }\n  void add_testhashu64_fnv1(uint64_t testhashu64_fnv1) {\n    fbb_.AddElement<uint64_t>(Monster::VT_TESTHASHU64_FNV1, testhashu64_fnv1, 0);\n  }\n  void add_testhashs32_fnv1a(int32_t testhashs32_fnv1a) {\n    fbb_.AddElement<int32_t>(Monster::VT_TESTHASHS32_FNV1A, testhashs32_fnv1a, 0);\n  }\n  void add_testhashu32_fnv1a(uint32_t testhashu32_fnv1a) {\n    fbb_.AddElement<uint32_t>(Monster::VT_TESTHASHU32_FNV1A, testhashu32_fnv1a, 0);\n  }\n  void add_testhashs64_fnv1a(int64_t testhashs64_fnv1a) {\n    fbb_.AddElement<int64_t>(Monster::VT_TESTHASHS64_FNV1A, testhashs64_fnv1a, 0);\n  }\n  void add_testhashu64_fnv1a(uint64_t testhashu64_fnv1a) {\n    fbb_.AddElement<uint64_t>(Monster::VT_TESTHASHU64_FNV1A, testhashu64_fnv1a, 0);\n  }\n  void add_testarrayofbools(::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> testarrayofbools) {\n    fbb_.AddOffset(Monster::VT_TESTARRAYOFBOOLS, testarrayofbools);\n  }\n  void add_testf(float testf) {\n    fbb_.AddElement<float>(Monster::VT_TESTF, testf, 3.14159f);\n  }\n  void add_testf2(float testf2) {\n    fbb_.AddElement<float>(Monster::VT_TESTF2, testf2, 3.0f);\n  }\n  void add_testf3(float testf3) {\n    fbb_.AddElement<float>(Monster::VT_TESTF3, testf3, 0.0f);\n  }\n  void add_testarrayofstring2(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> testarrayofstring2) {\n    fbb_.AddOffset(Monster::VT_TESTARRAYOFSTRING2, testarrayofstring2);\n  }\n  void add_testarrayofsortedstruct(::flatbuffers::Offset<::flatbuffers::Vector<const MyGame::Example::Ability *>> testarrayofsortedstruct) {\n    fbb_.AddOffset(Monster::VT_TESTARRAYOFSORTEDSTRUCT, testarrayofsortedstruct);\n  }\n  void add_flex(::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> flex) {\n    fbb_.AddOffset(Monster::VT_FLEX, flex);\n  }\n  void add_test5(::flatbuffers::Offset<::flatbuffers::Vector<const MyGame::Example::Test *>> test5) {\n    fbb_.AddOffset(Monster::VT_TEST5, test5);\n  }\n  void add_vector_of_longs(::flatbuffers::Offset<::flatbuffers::Vector<int64_t>> vector_of_longs) {\n    fbb_.AddOffset(Monster::VT_VECTOR_OF_LONGS, vector_of_longs);\n  }\n  void add_vector_of_doubles(::flatbuffers::Offset<::flatbuffers::Vector<double>> vector_of_doubles) {\n    fbb_.AddOffset(Monster::VT_VECTOR_OF_DOUBLES, vector_of_doubles);\n  }\n  void add_parent_namespace_test(::flatbuffers::Offset<MyGame::InParentNamespace> parent_namespace_test) {\n    fbb_.AddOffset(Monster::VT_PARENT_NAMESPACE_TEST, parent_namespace_test);\n  }\n  void add_vector_of_referrables(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>>> vector_of_referrables) {\n    fbb_.AddOffset(Monster::VT_VECTOR_OF_REFERRABLES, vector_of_referrables);\n  }\n  void add_single_weak_reference(uint64_t single_weak_reference) {\n    fbb_.AddElement<uint64_t>(Monster::VT_SINGLE_WEAK_REFERENCE, single_weak_reference, 0);\n  }\n  void add_vector_of_weak_references(::flatbuffers::Offset<::flatbuffers::Vector<uint64_t>> vector_of_weak_references) {\n    fbb_.AddOffset(Monster::VT_VECTOR_OF_WEAK_REFERENCES, vector_of_weak_references);\n  }\n  void add_vector_of_strong_referrables(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>>> vector_of_strong_referrables) {\n    fbb_.AddOffset(Monster::VT_VECTOR_OF_STRONG_REFERRABLES, vector_of_strong_referrables);\n  }\n  void add_co_owning_reference(uint64_t co_owning_reference) {\n    fbb_.AddElement<uint64_t>(Monster::VT_CO_OWNING_REFERENCE, co_owning_reference, 0);\n  }\n  void add_vector_of_co_owning_references(::flatbuffers::Offset<::flatbuffers::Vector<uint64_t>> vector_of_co_owning_references) {\n    fbb_.AddOffset(Monster::VT_VECTOR_OF_CO_OWNING_REFERENCES, vector_of_co_owning_references);\n  }\n  void add_non_owning_reference(uint64_t non_owning_reference) {\n    fbb_.AddElement<uint64_t>(Monster::VT_NON_OWNING_REFERENCE, non_owning_reference, 0);\n  }\n  void add_vector_of_non_owning_references(::flatbuffers::Offset<::flatbuffers::Vector<uint64_t>> vector_of_non_owning_references) {\n    fbb_.AddOffset(Monster::VT_VECTOR_OF_NON_OWNING_REFERENCES, vector_of_non_owning_references);\n  }\n  void add_any_unique_type(MyGame::Example::AnyUniqueAliases any_unique_type) {\n    fbb_.AddElement<uint8_t>(Monster::VT_ANY_UNIQUE_TYPE, static_cast<uint8_t>(any_unique_type), 0);\n  }\n  void add_any_unique(::flatbuffers::Offset<void> any_unique) {\n    fbb_.AddOffset(Monster::VT_ANY_UNIQUE, any_unique);\n  }\n  void add_any_ambiguous_type(MyGame::Example::AnyAmbiguousAliases any_ambiguous_type) {\n    fbb_.AddElement<uint8_t>(Monster::VT_ANY_AMBIGUOUS_TYPE, static_cast<uint8_t>(any_ambiguous_type), 0);\n  }\n  void add_any_ambiguous(::flatbuffers::Offset<void> any_ambiguous) {\n    fbb_.AddOffset(Monster::VT_ANY_AMBIGUOUS, any_ambiguous);\n  }\n  void add_vector_of_enums(::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> vector_of_enums) {\n    fbb_.AddOffset(Monster::VT_VECTOR_OF_ENUMS, vector_of_enums);\n  }\n  void add_signed_enum(MyGame::Example::Race signed_enum) {\n    fbb_.AddElement<int8_t>(Monster::VT_SIGNED_ENUM, static_cast<int8_t>(signed_enum), -1);\n  }\n  void add_testrequirednestedflatbuffer(::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> testrequirednestedflatbuffer) {\n    fbb_.AddOffset(Monster::VT_TESTREQUIREDNESTEDFLATBUFFER, testrequirednestedflatbuffer);\n  }\n  void add_scalar_key_sorted_tables(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Stat>>> scalar_key_sorted_tables) {\n    fbb_.AddOffset(Monster::VT_SCALAR_KEY_SORTED_TABLES, scalar_key_sorted_tables);\n  }\n  void add_native_inline(const MyGame::Example::Test *native_inline) {\n    fbb_.AddStruct(Monster::VT_NATIVE_INLINE, native_inline);\n  }\n  void add_long_enum_non_enum_default(MyGame::Example::LongEnum long_enum_non_enum_default) {\n    fbb_.AddElement<uint64_t>(Monster::VT_LONG_ENUM_NON_ENUM_DEFAULT, static_cast<uint64_t>(long_enum_non_enum_default), 0);\n  }\n  void add_long_enum_normal_default(MyGame::Example::LongEnum long_enum_normal_default) {\n    fbb_.AddElement<uint64_t>(Monster::VT_LONG_ENUM_NORMAL_DEFAULT, static_cast<uint64_t>(long_enum_normal_default), 2ULL);\n  }\n  void add_nan_default(float nan_default) {\n    fbb_.AddElement<float>(Monster::VT_NAN_DEFAULT, nan_default, std::numeric_limits<float>::quiet_NaN());\n  }\n  void add_inf_default(float inf_default) {\n    fbb_.AddElement<float>(Monster::VT_INF_DEFAULT, inf_default, std::numeric_limits<float>::infinity());\n  }\n  void add_positive_inf_default(float positive_inf_default) {\n    fbb_.AddElement<float>(Monster::VT_POSITIVE_INF_DEFAULT, positive_inf_default, std::numeric_limits<float>::infinity());\n  }\n  void add_infinity_default(float infinity_default) {\n    fbb_.AddElement<float>(Monster::VT_INFINITY_DEFAULT, infinity_default, std::numeric_limits<float>::infinity());\n  }\n  void add_positive_infinity_default(float positive_infinity_default) {\n    fbb_.AddElement<float>(Monster::VT_POSITIVE_INFINITY_DEFAULT, positive_infinity_default, std::numeric_limits<float>::infinity());\n  }\n  void add_negative_inf_default(float negative_inf_default) {\n    fbb_.AddElement<float>(Monster::VT_NEGATIVE_INF_DEFAULT, negative_inf_default, -std::numeric_limits<float>::infinity());\n  }\n  void add_negative_infinity_default(float negative_infinity_default) {\n    fbb_.AddElement<float>(Monster::VT_NEGATIVE_INFINITY_DEFAULT, negative_infinity_default, -std::numeric_limits<float>::infinity());\n  }\n  void add_double_inf_default(double double_inf_default) {\n    fbb_.AddElement<double>(Monster::VT_DOUBLE_INF_DEFAULT, double_inf_default, std::numeric_limits<double>::infinity());\n  }\n  explicit MonsterBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<Monster> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<Monster>(end);\n    fbb_.Required(o, Monster::VT_NAME);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<Monster> CreateMonster(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    const MyGame::Example::Vec3 *pos = nullptr,\n    int16_t mana = 150,\n    int16_t hp = 100,\n    ::flatbuffers::Offset<::flatbuffers::String> name = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> inventory = 0,\n    MyGame::Example::Color color = MyGame::Example::Color_Blue,\n    MyGame::Example::Any test_type = MyGame::Example::Any_NONE,\n    ::flatbuffers::Offset<void> test = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<const MyGame::Example::Test *>> test4 = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> testarrayofstring = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Monster>>> testarrayoftables = 0,\n    ::flatbuffers::Offset<MyGame::Example::Monster> enemy = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> testnestedflatbuffer = 0,\n    ::flatbuffers::Offset<MyGame::Example::Stat> testempty = 0,\n    bool testbool = false,\n    int32_t testhashs32_fnv1 = 0,\n    uint32_t testhashu32_fnv1 = 0,\n    int64_t testhashs64_fnv1 = 0,\n    uint64_t testhashu64_fnv1 = 0,\n    int32_t testhashs32_fnv1a = 0,\n    uint32_t testhashu32_fnv1a = 0,\n    int64_t testhashs64_fnv1a = 0,\n    uint64_t testhashu64_fnv1a = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> testarrayofbools = 0,\n    float testf = 3.14159f,\n    float testf2 = 3.0f,\n    float testf3 = 0.0f,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> testarrayofstring2 = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<const MyGame::Example::Ability *>> testarrayofsortedstruct = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> flex = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<const MyGame::Example::Test *>> test5 = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<int64_t>> vector_of_longs = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<double>> vector_of_doubles = 0,\n    ::flatbuffers::Offset<MyGame::InParentNamespace> parent_namespace_test = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>>> vector_of_referrables = 0,\n    uint64_t single_weak_reference = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<uint64_t>> vector_of_weak_references = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>>> vector_of_strong_referrables = 0,\n    uint64_t co_owning_reference = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<uint64_t>> vector_of_co_owning_references = 0,\n    uint64_t non_owning_reference = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<uint64_t>> vector_of_non_owning_references = 0,\n    MyGame::Example::AnyUniqueAliases any_unique_type = MyGame::Example::AnyUniqueAliases_NONE,\n    ::flatbuffers::Offset<void> any_unique = 0,\n    MyGame::Example::AnyAmbiguousAliases any_ambiguous_type = MyGame::Example::AnyAmbiguousAliases_NONE,\n    ::flatbuffers::Offset<void> any_ambiguous = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> vector_of_enums = 0,\n    MyGame::Example::Race signed_enum = MyGame::Example::Race_None,\n    ::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> testrequirednestedflatbuffer = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Stat>>> scalar_key_sorted_tables = 0,\n    const MyGame::Example::Test *native_inline = nullptr,\n    MyGame::Example::LongEnum long_enum_non_enum_default = static_cast<MyGame::Example::LongEnum>(0),\n    MyGame::Example::LongEnum long_enum_normal_default = MyGame::Example::LongEnum_LongOne,\n    float nan_default = std::numeric_limits<float>::quiet_NaN(),\n    float inf_default = std::numeric_limits<float>::infinity(),\n    float positive_inf_default = std::numeric_limits<float>::infinity(),\n    float infinity_default = std::numeric_limits<float>::infinity(),\n    float positive_infinity_default = std::numeric_limits<float>::infinity(),\n    float negative_inf_default = -std::numeric_limits<float>::infinity(),\n    float negative_infinity_default = -std::numeric_limits<float>::infinity(),\n    double double_inf_default = std::numeric_limits<double>::infinity()) {\n  MonsterBuilder builder_(_fbb);\n  builder_.add_double_inf_default(double_inf_default);\n  builder_.add_long_enum_normal_default(long_enum_normal_default);\n  builder_.add_long_enum_non_enum_default(long_enum_non_enum_default);\n  builder_.add_non_owning_reference(non_owning_reference);\n  builder_.add_co_owning_reference(co_owning_reference);\n  builder_.add_single_weak_reference(single_weak_reference);\n  builder_.add_testhashu64_fnv1a(testhashu64_fnv1a);\n  builder_.add_testhashs64_fnv1a(testhashs64_fnv1a);\n  builder_.add_testhashu64_fnv1(testhashu64_fnv1);\n  builder_.add_testhashs64_fnv1(testhashs64_fnv1);\n  builder_.add_negative_infinity_default(negative_infinity_default);\n  builder_.add_negative_inf_default(negative_inf_default);\n  builder_.add_positive_infinity_default(positive_infinity_default);\n  builder_.add_infinity_default(infinity_default);\n  builder_.add_positive_inf_default(positive_inf_default);\n  builder_.add_inf_default(inf_default);\n  builder_.add_nan_default(nan_default);\n  builder_.add_native_inline(native_inline);\n  builder_.add_scalar_key_sorted_tables(scalar_key_sorted_tables);\n  builder_.add_testrequirednestedflatbuffer(testrequirednestedflatbuffer);\n  builder_.add_vector_of_enums(vector_of_enums);\n  builder_.add_any_ambiguous(any_ambiguous);\n  builder_.add_any_unique(any_unique);\n  builder_.add_vector_of_non_owning_references(vector_of_non_owning_references);\n  builder_.add_vector_of_co_owning_references(vector_of_co_owning_references);\n  builder_.add_vector_of_strong_referrables(vector_of_strong_referrables);\n  builder_.add_vector_of_weak_references(vector_of_weak_references);\n  builder_.add_vector_of_referrables(vector_of_referrables);\n  builder_.add_parent_namespace_test(parent_namespace_test);\n  builder_.add_vector_of_doubles(vector_of_doubles);\n  builder_.add_vector_of_longs(vector_of_longs);\n  builder_.add_test5(test5);\n  builder_.add_flex(flex);\n  builder_.add_testarrayofsortedstruct(testarrayofsortedstruct);\n  builder_.add_testarrayofstring2(testarrayofstring2);\n  builder_.add_testf3(testf3);\n  builder_.add_testf2(testf2);\n  builder_.add_testf(testf);\n  builder_.add_testarrayofbools(testarrayofbools);\n  builder_.add_testhashu32_fnv1a(testhashu32_fnv1a);\n  builder_.add_testhashs32_fnv1a(testhashs32_fnv1a);\n  builder_.add_testhashu32_fnv1(testhashu32_fnv1);\n  builder_.add_testhashs32_fnv1(testhashs32_fnv1);\n  builder_.add_testempty(testempty);\n  builder_.add_testnestedflatbuffer(testnestedflatbuffer);\n  builder_.add_enemy(enemy);\n  builder_.add_testarrayoftables(testarrayoftables);\n  builder_.add_testarrayofstring(testarrayofstring);\n  builder_.add_test4(test4);\n  builder_.add_test(test);\n  builder_.add_inventory(inventory);\n  builder_.add_name(name);\n  builder_.add_pos(pos);\n  builder_.add_hp(hp);\n  builder_.add_mana(mana);\n  builder_.add_signed_enum(signed_enum);\n  builder_.add_any_ambiguous_type(any_ambiguous_type);\n  builder_.add_any_unique_type(any_unique_type);\n  builder_.add_testbool(testbool);\n  builder_.add_test_type(test_type);\n  builder_.add_color(color);\n  return builder_.Finish();\n}\n\ninline ::flatbuffers::Offset<Monster> CreateMonsterDirect(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    const MyGame::Example::Vec3 *pos = nullptr,\n    int16_t mana = 150,\n    int16_t hp = 100,\n    const char *name = nullptr,\n    const std::vector<uint8_t> *inventory = nullptr,\n    MyGame::Example::Color color = MyGame::Example::Color_Blue,\n    MyGame::Example::Any test_type = MyGame::Example::Any_NONE,\n    ::flatbuffers::Offset<void> test = 0,\n    const std::vector<MyGame::Example::Test> *test4 = nullptr,\n    const std::vector<::flatbuffers::Offset<::flatbuffers::String>> *testarrayofstring = nullptr,\n    std::vector<::flatbuffers::Offset<MyGame::Example::Monster>> *testarrayoftables = nullptr,\n    ::flatbuffers::Offset<MyGame::Example::Monster> enemy = 0,\n    const std::vector<uint8_t> *testnestedflatbuffer = nullptr,\n    ::flatbuffers::Offset<MyGame::Example::Stat> testempty = 0,\n    bool testbool = false,\n    int32_t testhashs32_fnv1 = 0,\n    uint32_t testhashu32_fnv1 = 0,\n    int64_t testhashs64_fnv1 = 0,\n    uint64_t testhashu64_fnv1 = 0,\n    int32_t testhashs32_fnv1a = 0,\n    uint32_t testhashu32_fnv1a = 0,\n    int64_t testhashs64_fnv1a = 0,\n    uint64_t testhashu64_fnv1a = 0,\n    const std::vector<uint8_t> *testarrayofbools = nullptr,\n    float testf = 3.14159f,\n    float testf2 = 3.0f,\n    float testf3 = 0.0f,\n    const std::vector<::flatbuffers::Offset<::flatbuffers::String>> *testarrayofstring2 = nullptr,\n    std::vector<MyGame::Example::Ability> *testarrayofsortedstruct = nullptr,\n    const std::vector<uint8_t> *flex = nullptr,\n    const std::vector<MyGame::Example::Test> *test5 = nullptr,\n    const std::vector<int64_t> *vector_of_longs = nullptr,\n    const std::vector<double> *vector_of_doubles = nullptr,\n    ::flatbuffers::Offset<MyGame::InParentNamespace> parent_namespace_test = 0,\n    std::vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *vector_of_referrables = nullptr,\n    uint64_t single_weak_reference = 0,\n    const std::vector<uint64_t> *vector_of_weak_references = nullptr,\n    std::vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *vector_of_strong_referrables = nullptr,\n    uint64_t co_owning_reference = 0,\n    const std::vector<uint64_t> *vector_of_co_owning_references = nullptr,\n    uint64_t non_owning_reference = 0,\n    const std::vector<uint64_t> *vector_of_non_owning_references = nullptr,\n    MyGame::Example::AnyUniqueAliases any_unique_type = MyGame::Example::AnyUniqueAliases_NONE,\n    ::flatbuffers::Offset<void> any_unique = 0,\n    MyGame::Example::AnyAmbiguousAliases any_ambiguous_type = MyGame::Example::AnyAmbiguousAliases_NONE,\n    ::flatbuffers::Offset<void> any_ambiguous = 0,\n    const std::vector<uint8_t> *vector_of_enums = nullptr,\n    MyGame::Example::Race signed_enum = MyGame::Example::Race_None,\n    const std::vector<uint8_t> *testrequirednestedflatbuffer = nullptr,\n    std::vector<::flatbuffers::Offset<MyGame::Example::Stat>> *scalar_key_sorted_tables = nullptr,\n    const MyGame::Example::Test *native_inline = nullptr,\n    MyGame::Example::LongEnum long_enum_non_enum_default = static_cast<MyGame::Example::LongEnum>(0),\n    MyGame::Example::LongEnum long_enum_normal_default = MyGame::Example::LongEnum_LongOne,\n    float nan_default = std::numeric_limits<float>::quiet_NaN(),\n    float inf_default = std::numeric_limits<float>::infinity(),\n    float positive_inf_default = std::numeric_limits<float>::infinity(),\n    float infinity_default = std::numeric_limits<float>::infinity(),\n    float positive_infinity_default = std::numeric_limits<float>::infinity(),\n    float negative_inf_default = -std::numeric_limits<float>::infinity(),\n    float negative_infinity_default = -std::numeric_limits<float>::infinity(),\n    double double_inf_default = std::numeric_limits<double>::infinity()) {\n  auto name__ = name ? _fbb.CreateString(name) : 0;\n  auto inventory__ = inventory ? _fbb.CreateVector<uint8_t>(*inventory) : 0;\n  auto test4__ = test4 ? _fbb.CreateVectorOfStructs<MyGame::Example::Test>(*test4) : 0;\n  auto testarrayofstring__ = testarrayofstring ? _fbb.CreateVector<::flatbuffers::Offset<::flatbuffers::String>>(*testarrayofstring) : 0;\n  auto testarrayoftables__ = testarrayoftables ? _fbb.CreateVectorOfSortedTables<MyGame::Example::Monster>(testarrayoftables) : 0;\n  auto testnestedflatbuffer__ = testnestedflatbuffer ? _fbb.CreateVector<uint8_t>(*testnestedflatbuffer) : 0;\n  auto testarrayofbools__ = testarrayofbools ? _fbb.CreateVector<uint8_t>(*testarrayofbools) : 0;\n  auto testarrayofstring2__ = testarrayofstring2 ? _fbb.CreateVector<::flatbuffers::Offset<::flatbuffers::String>>(*testarrayofstring2) : 0;\n  auto testarrayofsortedstruct__ = testarrayofsortedstruct ? _fbb.CreateVectorOfSortedStructs<MyGame::Example::Ability>(testarrayofsortedstruct) : 0;\n  auto flex__ = flex ? _fbb.CreateVector<uint8_t>(*flex) : 0;\n  auto test5__ = test5 ? _fbb.CreateVectorOfStructs<MyGame::Example::Test>(*test5) : 0;\n  auto vector_of_longs__ = vector_of_longs ? _fbb.CreateVector<int64_t>(*vector_of_longs) : 0;\n  auto vector_of_doubles__ = vector_of_doubles ? _fbb.CreateVector<double>(*vector_of_doubles) : 0;\n  auto vector_of_referrables__ = vector_of_referrables ? _fbb.CreateVectorOfSortedTables<MyGame::Example::Referrable>(vector_of_referrables) : 0;\n  auto vector_of_weak_references__ = vector_of_weak_references ? _fbb.CreateVector<uint64_t>(*vector_of_weak_references) : 0;\n  auto vector_of_strong_referrables__ = vector_of_strong_referrables ? _fbb.CreateVectorOfSortedTables<MyGame::Example::Referrable>(vector_of_strong_referrables) : 0;\n  auto vector_of_co_owning_references__ = vector_of_co_owning_references ? _fbb.CreateVector<uint64_t>(*vector_of_co_owning_references) : 0;\n  auto vector_of_non_owning_references__ = vector_of_non_owning_references ? _fbb.CreateVector<uint64_t>(*vector_of_non_owning_references) : 0;\n  auto vector_of_enums__ = vector_of_enums ? _fbb.CreateVector<uint8_t>(*vector_of_enums) : 0;\n  auto testrequirednestedflatbuffer__ = testrequirednestedflatbuffer ? _fbb.CreateVector<uint8_t>(*testrequirednestedflatbuffer) : 0;\n  auto scalar_key_sorted_tables__ = scalar_key_sorted_tables ? _fbb.CreateVectorOfSortedTables<MyGame::Example::Stat>(scalar_key_sorted_tables) : 0;\n  return MyGame::Example::CreateMonster(\n      _fbb,\n      pos,\n      mana,\n      hp,\n      name__,\n      inventory__,\n      color,\n      test_type,\n      test,\n      test4__,\n      testarrayofstring__,\n      testarrayoftables__,\n      enemy,\n      testnestedflatbuffer__,\n      testempty,\n      testbool,\n      testhashs32_fnv1,\n      testhashu32_fnv1,\n      testhashs64_fnv1,\n      testhashu64_fnv1,\n      testhashs32_fnv1a,\n      testhashu32_fnv1a,\n      testhashs64_fnv1a,\n      testhashu64_fnv1a,\n      testarrayofbools__,\n      testf,\n      testf2,\n      testf3,\n      testarrayofstring2__,\n      testarrayofsortedstruct__,\n      flex__,\n      test5__,\n      vector_of_longs__,\n      vector_of_doubles__,\n      parent_namespace_test,\n      vector_of_referrables__,\n      single_weak_reference,\n      vector_of_weak_references__,\n      vector_of_strong_referrables__,\n      co_owning_reference,\n      vector_of_co_owning_references__,\n      non_owning_reference,\n      vector_of_non_owning_references__,\n      any_unique_type,\n      any_unique,\n      any_ambiguous_type,\n      any_ambiguous,\n      vector_of_enums__,\n      signed_enum,\n      testrequirednestedflatbuffer__,\n      scalar_key_sorted_tables__,\n      native_inline,\n      long_enum_non_enum_default,\n      long_enum_normal_default,\n      nan_default,\n      inf_default,\n      positive_inf_default,\n      infinity_default,\n      positive_infinity_default,\n      negative_inf_default,\n      negative_infinity_default,\n      double_inf_default);\n}\n\n::flatbuffers::Offset<Monster> CreateMonster(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n\nstruct TypeAliasesT : public ::flatbuffers::NativeTable {\n  typedef TypeAliases TableType;\n  int8_t i8 = 0;\n  uint8_t u8 = 0;\n  int16_t i16 = 0;\n  uint16_t u16 = 0;\n  int32_t i32 = 0;\n  uint32_t u32 = 0;\n  int64_t i64 = 0;\n  uint64_t u64 = 0;\n  float f32 = 0.0f;\n  double f64 = 0.0;\n  std::vector<int8_t> v8{};\n  std::vector<double> vf64{};\n};\n\nstruct TypeAliases FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef TypeAliasesT NativeTableType;\n  typedef TypeAliasesBuilder Builder;\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return TypeAliasesTypeTable();\n  }\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_I8 = 4,\n    VT_U8 = 6,\n    VT_I16 = 8,\n    VT_U16 = 10,\n    VT_I32 = 12,\n    VT_U32 = 14,\n    VT_I64 = 16,\n    VT_U64 = 18,\n    VT_F32 = 20,\n    VT_F64 = 22,\n    VT_V8 = 24,\n    VT_VF64 = 26\n  };\n  int8_t i8() const {\n    return GetField<int8_t>(VT_I8, 0);\n  }\n  bool mutate_i8(int8_t _i8 = 0) {\n    return SetField<int8_t>(VT_I8, _i8, 0);\n  }\n  uint8_t u8() const {\n    return GetField<uint8_t>(VT_U8, 0);\n  }\n  bool mutate_u8(uint8_t _u8 = 0) {\n    return SetField<uint8_t>(VT_U8, _u8, 0);\n  }\n  int16_t i16() const {\n    return GetField<int16_t>(VT_I16, 0);\n  }\n  bool mutate_i16(int16_t _i16 = 0) {\n    return SetField<int16_t>(VT_I16, _i16, 0);\n  }\n  uint16_t u16() const {\n    return GetField<uint16_t>(VT_U16, 0);\n  }\n  bool mutate_u16(uint16_t _u16 = 0) {\n    return SetField<uint16_t>(VT_U16, _u16, 0);\n  }\n  int32_t i32() const {\n    return GetField<int32_t>(VT_I32, 0);\n  }\n  bool mutate_i32(int32_t _i32 = 0) {\n    return SetField<int32_t>(VT_I32, _i32, 0);\n  }\n  uint32_t u32() const {\n    return GetField<uint32_t>(VT_U32, 0);\n  }\n  bool mutate_u32(uint32_t _u32 = 0) {\n    return SetField<uint32_t>(VT_U32, _u32, 0);\n  }\n  int64_t i64() const {\n    return GetField<int64_t>(VT_I64, 0);\n  }\n  bool mutate_i64(int64_t _i64 = 0) {\n    return SetField<int64_t>(VT_I64, _i64, 0);\n  }\n  uint64_t u64() const {\n    return GetField<uint64_t>(VT_U64, 0);\n  }\n  bool mutate_u64(uint64_t _u64 = 0) {\n    return SetField<uint64_t>(VT_U64, _u64, 0);\n  }\n  float f32() const {\n    return GetField<float>(VT_F32, 0.0f);\n  }\n  bool mutate_f32(float _f32 = 0.0f) {\n    return SetField<float>(VT_F32, _f32, 0.0f);\n  }\n  double f64() const {\n    return GetField<double>(VT_F64, 0.0);\n  }\n  bool mutate_f64(double _f64 = 0.0) {\n    return SetField<double>(VT_F64, _f64, 0.0);\n  }\n  const ::flatbuffers::Vector<int8_t> *v8() const {\n    return GetPointer<const ::flatbuffers::Vector<int8_t> *>(VT_V8);\n  }\n  ::flatbuffers::Vector<int8_t> *mutable_v8() {\n    return GetPointer<::flatbuffers::Vector<int8_t> *>(VT_V8);\n  }\n  const ::flatbuffers::Vector<double> *vf64() const {\n    return GetPointer<const ::flatbuffers::Vector<double> *>(VT_VF64);\n  }\n  ::flatbuffers::Vector<double> *mutable_vf64() {\n    return GetPointer<::flatbuffers::Vector<double> *>(VT_VF64);\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyField<int8_t>(verifier, VT_I8, 1) &&\n           VerifyField<uint8_t>(verifier, VT_U8, 1) &&\n           VerifyField<int16_t>(verifier, VT_I16, 2) &&\n           VerifyField<uint16_t>(verifier, VT_U16, 2) &&\n           VerifyField<int32_t>(verifier, VT_I32, 4) &&\n           VerifyField<uint32_t>(verifier, VT_U32, 4) &&\n           VerifyField<int64_t>(verifier, VT_I64, 8) &&\n           VerifyField<uint64_t>(verifier, VT_U64, 8) &&\n           VerifyField<float>(verifier, VT_F32, 4) &&\n           VerifyField<double>(verifier, VT_F64, 8) &&\n           VerifyOffset(verifier, VT_V8) &&\n           verifier.VerifyVector(v8()) &&\n           VerifyOffset(verifier, VT_VF64) &&\n           verifier.VerifyVector(vf64()) &&\n           verifier.EndTable();\n  }\n  TypeAliasesT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  void UnPackTo(TypeAliasesT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  static ::flatbuffers::Offset<TypeAliases> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const TypeAliasesT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n};\n\nstruct TypeAliasesBuilder {\n  typedef TypeAliases Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_i8(int8_t i8) {\n    fbb_.AddElement<int8_t>(TypeAliases::VT_I8, i8, 0);\n  }\n  void add_u8(uint8_t u8) {\n    fbb_.AddElement<uint8_t>(TypeAliases::VT_U8, u8, 0);\n  }\n  void add_i16(int16_t i16) {\n    fbb_.AddElement<int16_t>(TypeAliases::VT_I16, i16, 0);\n  }\n  void add_u16(uint16_t u16) {\n    fbb_.AddElement<uint16_t>(TypeAliases::VT_U16, u16, 0);\n  }\n  void add_i32(int32_t i32) {\n    fbb_.AddElement<int32_t>(TypeAliases::VT_I32, i32, 0);\n  }\n  void add_u32(uint32_t u32) {\n    fbb_.AddElement<uint32_t>(TypeAliases::VT_U32, u32, 0);\n  }\n  void add_i64(int64_t i64) {\n    fbb_.AddElement<int64_t>(TypeAliases::VT_I64, i64, 0);\n  }\n  void add_u64(uint64_t u64) {\n    fbb_.AddElement<uint64_t>(TypeAliases::VT_U64, u64, 0);\n  }\n  void add_f32(float f32) {\n    fbb_.AddElement<float>(TypeAliases::VT_F32, f32, 0.0f);\n  }\n  void add_f64(double f64) {\n    fbb_.AddElement<double>(TypeAliases::VT_F64, f64, 0.0);\n  }\n  void add_v8(::flatbuffers::Offset<::flatbuffers::Vector<int8_t>> v8) {\n    fbb_.AddOffset(TypeAliases::VT_V8, v8);\n  }\n  void add_vf64(::flatbuffers::Offset<::flatbuffers::Vector<double>> vf64) {\n    fbb_.AddOffset(TypeAliases::VT_VF64, vf64);\n  }\n  explicit TypeAliasesBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<TypeAliases> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<TypeAliases>(end);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<TypeAliases> CreateTypeAliases(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    int8_t i8 = 0,\n    uint8_t u8 = 0,\n    int16_t i16 = 0,\n    uint16_t u16 = 0,\n    int32_t i32 = 0,\n    uint32_t u32 = 0,\n    int64_t i64 = 0,\n    uint64_t u64 = 0,\n    float f32 = 0.0f,\n    double f64 = 0.0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<int8_t>> v8 = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<double>> vf64 = 0) {\n  TypeAliasesBuilder builder_(_fbb);\n  builder_.add_f64(f64);\n  builder_.add_u64(u64);\n  builder_.add_i64(i64);\n  builder_.add_vf64(vf64);\n  builder_.add_v8(v8);\n  builder_.add_f32(f32);\n  builder_.add_u32(u32);\n  builder_.add_i32(i32);\n  builder_.add_u16(u16);\n  builder_.add_i16(i16);\n  builder_.add_u8(u8);\n  builder_.add_i8(i8);\n  return builder_.Finish();\n}\n\ninline ::flatbuffers::Offset<TypeAliases> CreateTypeAliasesDirect(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    int8_t i8 = 0,\n    uint8_t u8 = 0,\n    int16_t i16 = 0,\n    uint16_t u16 = 0,\n    int32_t i32 = 0,\n    uint32_t u32 = 0,\n    int64_t i64 = 0,\n    uint64_t u64 = 0,\n    float f32 = 0.0f,\n    double f64 = 0.0,\n    const std::vector<int8_t> *v8 = nullptr,\n    const std::vector<double> *vf64 = nullptr) {\n  auto v8__ = v8 ? _fbb.CreateVector<int8_t>(*v8) : 0;\n  auto vf64__ = vf64 ? _fbb.CreateVector<double>(*vf64) : 0;\n  return MyGame::Example::CreateTypeAliases(\n      _fbb,\n      i8,\n      u8,\n      i16,\n      u16,\n      i32,\n      u32,\n      i64,\n      u64,\n      f32,\n      f64,\n      v8__,\n      vf64__);\n}\n\n::flatbuffers::Offset<TypeAliases> CreateTypeAliases(::flatbuffers::FlatBufferBuilder &_fbb, const TypeAliasesT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n\n}  // namespace Example\n\n\ninline bool operator==(const InParentNamespaceT &, const InParentNamespaceT &) {\n  return true;\n}\n\ninline bool operator!=(const InParentNamespaceT &lhs, const InParentNamespaceT &rhs) {\n    return !(lhs == rhs);\n}\n\n\ninline InParentNamespaceT *InParentNamespace::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {\n  auto _o = std::unique_ptr<InParentNamespaceT>(new InParentNamespaceT());\n  UnPackTo(_o.get(), _resolver);\n  return _o.release();\n}\n\ninline void InParentNamespace::UnPackTo(InParentNamespaceT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {\n  (void)_o;\n  (void)_resolver;\n}\n\ninline ::flatbuffers::Offset<InParentNamespace> CreateInParentNamespace(::flatbuffers::FlatBufferBuilder &_fbb, const InParentNamespaceT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  return InParentNamespace::Pack(_fbb, _o, _rehasher);\n}\n\ninline ::flatbuffers::Offset<InParentNamespace> InParentNamespace::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const InParentNamespaceT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  (void)_rehasher;\n  (void)_o;\n  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const InParentNamespaceT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;\n  return MyGame::CreateInParentNamespace(\n      _fbb);\n}\n\nnamespace Example2 {\n\n\ninline bool operator==(const MonsterT &, const MonsterT &) {\n  return true;\n}\n\ninline bool operator!=(const MonsterT &lhs, const MonsterT &rhs) {\n    return !(lhs == rhs);\n}\n\n\ninline MonsterT *Monster::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {\n  auto _o = std::unique_ptr<MonsterT>(new MonsterT());\n  UnPackTo(_o.get(), _resolver);\n  return _o.release();\n}\n\ninline void Monster::UnPackTo(MonsterT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {\n  (void)_o;\n  (void)_resolver;\n}\n\ninline ::flatbuffers::Offset<Monster> CreateMonster(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  return Monster::Pack(_fbb, _o, _rehasher);\n}\n\ninline ::flatbuffers::Offset<Monster> Monster::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  (void)_rehasher;\n  (void)_o;\n  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const MonsterT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;\n  return MyGame::Example2::CreateMonster(\n      _fbb);\n}\n\n}  // namespace Example2\n\nnamespace Example {\n\n\ninline bool operator==(const TestSimpleTableWithEnumT &lhs, const TestSimpleTableWithEnumT &rhs) {\n  return\n      (lhs.color == rhs.color);\n}\n\ninline bool operator!=(const TestSimpleTableWithEnumT &lhs, const TestSimpleTableWithEnumT &rhs) {\n    return !(lhs == rhs);\n}\n\n\ninline TestSimpleTableWithEnumT *TestSimpleTableWithEnum::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {\n  auto _o = std::unique_ptr<TestSimpleTableWithEnumT>(new TestSimpleTableWithEnumT());\n  UnPackTo(_o.get(), _resolver);\n  return _o.release();\n}\n\ninline void TestSimpleTableWithEnum::UnPackTo(TestSimpleTableWithEnumT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {\n  (void)_o;\n  (void)_resolver;\n  { auto _e = color(); _o->color = _e; }\n}\n\ninline ::flatbuffers::Offset<TestSimpleTableWithEnum> CreateTestSimpleTableWithEnum(::flatbuffers::FlatBufferBuilder &_fbb, const TestSimpleTableWithEnumT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  return TestSimpleTableWithEnum::Pack(_fbb, _o, _rehasher);\n}\n\ninline ::flatbuffers::Offset<TestSimpleTableWithEnum> TestSimpleTableWithEnum::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const TestSimpleTableWithEnumT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  (void)_rehasher;\n  (void)_o;\n  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const TestSimpleTableWithEnumT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;\n  auto _color = _o->color;\n  return MyGame::Example::CreateTestSimpleTableWithEnum(\n      _fbb,\n      _color);\n}\n\n\ninline bool operator==(const StatT &lhs, const StatT &rhs) {\n  return\n      (lhs.id == rhs.id) &&\n      (lhs.val == rhs.val) &&\n      (lhs.count == rhs.count);\n}\n\ninline bool operator!=(const StatT &lhs, const StatT &rhs) {\n    return !(lhs == rhs);\n}\n\n\ninline StatT *Stat::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {\n  auto _o = std::unique_ptr<StatT>(new StatT());\n  UnPackTo(_o.get(), _resolver);\n  return _o.release();\n}\n\ninline void Stat::UnPackTo(StatT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {\n  (void)_o;\n  (void)_resolver;\n  { auto _e = id(); if (_e) _o->id = _e->str(); }\n  { auto _e = val(); _o->val = _e; }\n  { auto _e = count(); _o->count = _e; }\n}\n\ninline ::flatbuffers::Offset<Stat> CreateStat(::flatbuffers::FlatBufferBuilder &_fbb, const StatT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  return Stat::Pack(_fbb, _o, _rehasher);\n}\n\ninline ::flatbuffers::Offset<Stat> Stat::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const StatT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  (void)_rehasher;\n  (void)_o;\n  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const StatT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;\n  auto _id = _o->id.empty() ? 0 : _fbb.CreateString(_o->id);\n  auto _val = _o->val;\n  auto _count = _o->count;\n  return MyGame::Example::CreateStat(\n      _fbb,\n      _id,\n      _val,\n      _count);\n}\n\n\ninline bool operator==(const ReferrableT &lhs, const ReferrableT &rhs) {\n  return\n      (lhs.id == rhs.id);\n}\n\ninline bool operator!=(const ReferrableT &lhs, const ReferrableT &rhs) {\n    return !(lhs == rhs);\n}\n\n\ninline ReferrableT *Referrable::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {\n  auto _o = std::unique_ptr<ReferrableT>(new ReferrableT());\n  UnPackTo(_o.get(), _resolver);\n  return _o.release();\n}\n\ninline void Referrable::UnPackTo(ReferrableT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {\n  (void)_o;\n  (void)_resolver;\n  { auto _e = id(); _o->id = _e; }\n}\n\ninline ::flatbuffers::Offset<Referrable> CreateReferrable(::flatbuffers::FlatBufferBuilder &_fbb, const ReferrableT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  return Referrable::Pack(_fbb, _o, _rehasher);\n}\n\ninline ::flatbuffers::Offset<Referrable> Referrable::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ReferrableT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  (void)_rehasher;\n  (void)_o;\n  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const ReferrableT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;\n  auto _id = _o->id;\n  return MyGame::Example::CreateReferrable(\n      _fbb,\n      _id);\n}\n\n\ninline bool operator==(const MonsterT &lhs, const MonsterT &rhs) {\n  return\n      ((lhs.pos == rhs.pos) || (lhs.pos && rhs.pos && *lhs.pos == *rhs.pos)) &&\n      (lhs.mana == rhs.mana) &&\n      (lhs.hp == rhs.hp) &&\n      (lhs.name == rhs.name) &&\n      (lhs.inventory == rhs.inventory) &&\n      (lhs.color == rhs.color) &&\n      (lhs.test == rhs.test) &&\n      (lhs.test4 == rhs.test4) &&\n      (lhs.testarrayofstring == rhs.testarrayofstring) &&\n      (lhs.testarrayoftables.size() == rhs.testarrayoftables.size() && std::equal(lhs.testarrayoftables.cbegin(), lhs.testarrayoftables.cend(), rhs.testarrayoftables.cbegin(), [](std::unique_ptr<MyGame::Example::MonsterT> const &a, std::unique_ptr<MyGame::Example::MonsterT> const &b) { return (a == b) || (a && b && *a == *b); })) &&\n      ((lhs.enemy == rhs.enemy) || (lhs.enemy && rhs.enemy && *lhs.enemy == *rhs.enemy)) &&\n      (lhs.testnestedflatbuffer == rhs.testnestedflatbuffer) &&\n      ((lhs.testempty == rhs.testempty) || (lhs.testempty && rhs.testempty && *lhs.testempty == *rhs.testempty)) &&\n      (lhs.testbool == rhs.testbool) &&\n      (lhs.testhashs32_fnv1 == rhs.testhashs32_fnv1) &&\n      (lhs.testhashu32_fnv1 == rhs.testhashu32_fnv1) &&\n      (lhs.testhashs64_fnv1 == rhs.testhashs64_fnv1) &&\n      (lhs.testhashu64_fnv1 == rhs.testhashu64_fnv1) &&\n      (lhs.testhashs32_fnv1a == rhs.testhashs32_fnv1a) &&\n      (lhs.testhashu32_fnv1a == rhs.testhashu32_fnv1a) &&\n      (lhs.testhashs64_fnv1a == rhs.testhashs64_fnv1a) &&\n      (lhs.testhashu64_fnv1a == rhs.testhashu64_fnv1a) &&\n      (lhs.testarrayofbools == rhs.testarrayofbools) &&\n      (lhs.testf == rhs.testf) &&\n      (lhs.testf2 == rhs.testf2) &&\n      (lhs.testf3 == rhs.testf3) &&\n      (lhs.testarrayofstring2 == rhs.testarrayofstring2) &&\n      (lhs.testarrayofsortedstruct == rhs.testarrayofsortedstruct) &&\n      (lhs.flex == rhs.flex) &&\n      (lhs.test5 == rhs.test5) &&\n      (lhs.vector_of_longs == rhs.vector_of_longs) &&\n      (lhs.vector_of_doubles == rhs.vector_of_doubles) &&\n      ((lhs.parent_namespace_test == rhs.parent_namespace_test) || (lhs.parent_namespace_test && rhs.parent_namespace_test && *lhs.parent_namespace_test == *rhs.parent_namespace_test)) &&\n      (lhs.vector_of_referrables.size() == rhs.vector_of_referrables.size() && std::equal(lhs.vector_of_referrables.cbegin(), lhs.vector_of_referrables.cend(), rhs.vector_of_referrables.cbegin(), [](std::unique_ptr<MyGame::Example::ReferrableT> const &a, std::unique_ptr<MyGame::Example::ReferrableT> const &b) { return (a == b) || (a && b && *a == *b); })) &&\n      (lhs.single_weak_reference == rhs.single_weak_reference) &&\n      (lhs.vector_of_weak_references == rhs.vector_of_weak_references) &&\n      (lhs.vector_of_strong_referrables.size() == rhs.vector_of_strong_referrables.size() && std::equal(lhs.vector_of_strong_referrables.cbegin(), lhs.vector_of_strong_referrables.cend(), rhs.vector_of_strong_referrables.cbegin(), [](std::unique_ptr<MyGame::Example::ReferrableT> const &a, std::unique_ptr<MyGame::Example::ReferrableT> const &b) { return (a == b) || (a && b && *a == *b); })) &&\n      (lhs.co_owning_reference == rhs.co_owning_reference) &&\n      (lhs.vector_of_co_owning_references == rhs.vector_of_co_owning_references) &&\n      (lhs.non_owning_reference == rhs.non_owning_reference) &&\n      (lhs.vector_of_non_owning_references == rhs.vector_of_non_owning_references) &&\n      (lhs.any_unique == rhs.any_unique) &&\n      (lhs.any_ambiguous == rhs.any_ambiguous) &&\n      (lhs.vector_of_enums == rhs.vector_of_enums) &&\n      (lhs.signed_enum == rhs.signed_enum) &&\n      (lhs.testrequirednestedflatbuffer == rhs.testrequirednestedflatbuffer) &&\n      (lhs.scalar_key_sorted_tables.size() == rhs.scalar_key_sorted_tables.size() && std::equal(lhs.scalar_key_sorted_tables.cbegin(), lhs.scalar_key_sorted_tables.cend(), rhs.scalar_key_sorted_tables.cbegin(), [](std::unique_ptr<MyGame::Example::StatT> const &a, std::unique_ptr<MyGame::Example::StatT> const &b) { return (a == b) || (a && b && *a == *b); })) &&\n      (lhs.native_inline == rhs.native_inline) &&\n      (lhs.long_enum_non_enum_default == rhs.long_enum_non_enum_default) &&\n      (lhs.long_enum_normal_default == rhs.long_enum_normal_default) &&\n      (lhs.nan_default == rhs.nan_default) &&\n      (lhs.inf_default == rhs.inf_default) &&\n      (lhs.positive_inf_default == rhs.positive_inf_default) &&\n      (lhs.infinity_default == rhs.infinity_default) &&\n      (lhs.positive_infinity_default == rhs.positive_infinity_default) &&\n      (lhs.negative_inf_default == rhs.negative_inf_default) &&\n      (lhs.negative_infinity_default == rhs.negative_infinity_default) &&\n      (lhs.double_inf_default == rhs.double_inf_default);\n}\n\ninline bool operator!=(const MonsterT &lhs, const MonsterT &rhs) {\n    return !(lhs == rhs);\n}\n\n\ninline MonsterT::MonsterT(const MonsterT &o)\n      : pos((o.pos) ? new MyGame::Example::Vec3(*o.pos) : nullptr),\n        mana(o.mana),\n        hp(o.hp),\n        name(o.name),\n        inventory(o.inventory),\n        color(o.color),\n        test(o.test),\n        test4(o.test4),\n        testarrayofstring(o.testarrayofstring),\n        enemy((o.enemy) ? new MyGame::Example::MonsterT(*o.enemy) : nullptr),\n        testnestedflatbuffer(o.testnestedflatbuffer),\n        testempty((o.testempty) ? new MyGame::Example::StatT(*o.testempty) : nullptr),\n        testbool(o.testbool),\n        testhashs32_fnv1(o.testhashs32_fnv1),\n        testhashu32_fnv1(o.testhashu32_fnv1),\n        testhashs64_fnv1(o.testhashs64_fnv1),\n        testhashu64_fnv1(o.testhashu64_fnv1),\n        testhashs32_fnv1a(o.testhashs32_fnv1a),\n        testhashu32_fnv1a(o.testhashu32_fnv1a),\n        testhashs64_fnv1a(o.testhashs64_fnv1a),\n        testhashu64_fnv1a(o.testhashu64_fnv1a),\n        testarrayofbools(o.testarrayofbools),\n        testf(o.testf),\n        testf2(o.testf2),\n        testf3(o.testf3),\n        testarrayofstring2(o.testarrayofstring2),\n        testarrayofsortedstruct(o.testarrayofsortedstruct),\n        flex(o.flex),\n        test5(o.test5),\n        vector_of_longs(o.vector_of_longs),\n        vector_of_doubles(o.vector_of_doubles),\n        parent_namespace_test((o.parent_namespace_test) ? new MyGame::InParentNamespaceT(*o.parent_namespace_test) : nullptr),\n        single_weak_reference(o.single_weak_reference),\n        vector_of_weak_references(o.vector_of_weak_references),\n        co_owning_reference(o.co_owning_reference),\n        non_owning_reference(o.non_owning_reference),\n        vector_of_non_owning_references(o.vector_of_non_owning_references),\n        any_unique(o.any_unique),\n        any_ambiguous(o.any_ambiguous),\n        vector_of_enums(o.vector_of_enums),\n        signed_enum(o.signed_enum),\n        testrequirednestedflatbuffer(o.testrequirednestedflatbuffer),\n        native_inline(o.native_inline),\n        long_enum_non_enum_default(o.long_enum_non_enum_default),\n        long_enum_normal_default(o.long_enum_normal_default),\n        nan_default(o.nan_default),\n        inf_default(o.inf_default),\n        positive_inf_default(o.positive_inf_default),\n        infinity_default(o.infinity_default),\n        positive_infinity_default(o.positive_infinity_default),\n        negative_inf_default(o.negative_inf_default),\n        negative_infinity_default(o.negative_infinity_default),\n        double_inf_default(o.double_inf_default) {\n  testarrayoftables.reserve(o.testarrayoftables.size());\n  for (const auto &testarrayoftables_ : o.testarrayoftables) { testarrayoftables.emplace_back((testarrayoftables_) ? new MyGame::Example::MonsterT(*testarrayoftables_) : nullptr); }\n  vector_of_referrables.reserve(o.vector_of_referrables.size());\n  for (const auto &vector_of_referrables_ : o.vector_of_referrables) { vector_of_referrables.emplace_back((vector_of_referrables_) ? new MyGame::Example::ReferrableT(*vector_of_referrables_) : nullptr); }\n  vector_of_strong_referrables.reserve(o.vector_of_strong_referrables.size());\n  for (const auto &vector_of_strong_referrables_ : o.vector_of_strong_referrables) { vector_of_strong_referrables.emplace_back((vector_of_strong_referrables_) ? new MyGame::Example::ReferrableT(*vector_of_strong_referrables_) : nullptr); }\n  vector_of_co_owning_references.reserve(o.vector_of_co_owning_references.size());\n  for (const auto &vector_of_co_owning_references_ : o.vector_of_co_owning_references) { vector_of_co_owning_references.emplace_back((vector_of_co_owning_references_) ? new ReferrableT(*vector_of_co_owning_references_) : nullptr); }\n  scalar_key_sorted_tables.reserve(o.scalar_key_sorted_tables.size());\n  for (const auto &scalar_key_sorted_tables_ : o.scalar_key_sorted_tables) { scalar_key_sorted_tables.emplace_back((scalar_key_sorted_tables_) ? new MyGame::Example::StatT(*scalar_key_sorted_tables_) : nullptr); }\n}\n\ninline MonsterT &MonsterT::operator=(MonsterT o) FLATBUFFERS_NOEXCEPT {\n  std::swap(pos, o.pos);\n  std::swap(mana, o.mana);\n  std::swap(hp, o.hp);\n  std::swap(name, o.name);\n  std::swap(inventory, o.inventory);\n  std::swap(color, o.color);\n  std::swap(test, o.test);\n  std::swap(test4, o.test4);\n  std::swap(testarrayofstring, o.testarrayofstring);\n  std::swap(testarrayoftables, o.testarrayoftables);\n  std::swap(enemy, o.enemy);\n  std::swap(testnestedflatbuffer, o.testnestedflatbuffer);\n  std::swap(testempty, o.testempty);\n  std::swap(testbool, o.testbool);\n  std::swap(testhashs32_fnv1, o.testhashs32_fnv1);\n  std::swap(testhashu32_fnv1, o.testhashu32_fnv1);\n  std::swap(testhashs64_fnv1, o.testhashs64_fnv1);\n  std::swap(testhashu64_fnv1, o.testhashu64_fnv1);\n  std::swap(testhashs32_fnv1a, o.testhashs32_fnv1a);\n  std::swap(testhashu32_fnv1a, o.testhashu32_fnv1a);\n  std::swap(testhashs64_fnv1a, o.testhashs64_fnv1a);\n  std::swap(testhashu64_fnv1a, o.testhashu64_fnv1a);\n  std::swap(testarrayofbools, o.testarrayofbools);\n  std::swap(testf, o.testf);\n  std::swap(testf2, o.testf2);\n  std::swap(testf3, o.testf3);\n  std::swap(testarrayofstring2, o.testarrayofstring2);\n  std::swap(testarrayofsortedstruct, o.testarrayofsortedstruct);\n  std::swap(flex, o.flex);\n  std::swap(test5, o.test5);\n  std::swap(vector_of_longs, o.vector_of_longs);\n  std::swap(vector_of_doubles, o.vector_of_doubles);\n  std::swap(parent_namespace_test, o.parent_namespace_test);\n  std::swap(vector_of_referrables, o.vector_of_referrables);\n  std::swap(single_weak_reference, o.single_weak_reference);\n  std::swap(vector_of_weak_references, o.vector_of_weak_references);\n  std::swap(vector_of_strong_referrables, o.vector_of_strong_referrables);\n  std::swap(co_owning_reference, o.co_owning_reference);\n  std::swap(vector_of_co_owning_references, o.vector_of_co_owning_references);\n  std::swap(non_owning_reference, o.non_owning_reference);\n  std::swap(vector_of_non_owning_references, o.vector_of_non_owning_references);\n  std::swap(any_unique, o.any_unique);\n  std::swap(any_ambiguous, o.any_ambiguous);\n  std::swap(vector_of_enums, o.vector_of_enums);\n  std::swap(signed_enum, o.signed_enum);\n  std::swap(testrequirednestedflatbuffer, o.testrequirednestedflatbuffer);\n  std::swap(scalar_key_sorted_tables, o.scalar_key_sorted_tables);\n  std::swap(native_inline, o.native_inline);\n  std::swap(long_enum_non_enum_default, o.long_enum_non_enum_default);\n  std::swap(long_enum_normal_default, o.long_enum_normal_default);\n  std::swap(nan_default, o.nan_default);\n  std::swap(inf_default, o.inf_default);\n  std::swap(positive_inf_default, o.positive_inf_default);\n  std::swap(infinity_default, o.infinity_default);\n  std::swap(positive_infinity_default, o.positive_infinity_default);\n  std::swap(negative_inf_default, o.negative_inf_default);\n  std::swap(negative_infinity_default, o.negative_infinity_default);\n  std::swap(double_inf_default, o.double_inf_default);\n  return *this;\n}\n\ninline MonsterT *Monster::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {\n  auto _o = std::unique_ptr<MonsterT>(new MonsterT());\n  UnPackTo(_o.get(), _resolver);\n  return _o.release();\n}\n\ninline void Monster::UnPackTo(MonsterT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {\n  (void)_o;\n  (void)_resolver;\n  { auto _e = pos(); if (_e) _o->pos = std::unique_ptr<MyGame::Example::Vec3>(new MyGame::Example::Vec3(*_e)); }\n  { auto _e = mana(); _o->mana = _e; }\n  { auto _e = hp(); _o->hp = _e; }\n  { auto _e = name(); if (_e) _o->name = _e->str(); }\n  { auto _e = inventory(); if (_e) { _o->inventory.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->inventory.begin()); } }\n  { auto _e = color(); _o->color = _e; }\n  { auto _e = test_type(); _o->test.type = _e; }\n  { auto _e = test(); if (_e) _o->test.value = MyGame::Example::AnyUnion::UnPack(_e, test_type(), _resolver); }\n  { auto _e = test4(); if (_e) { _o->test4.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->test4[_i] = *_e->Get(_i); } } else { _o->test4.resize(0); } }\n  { auto _e = testarrayofstring(); if (_e) { _o->testarrayofstring.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testarrayofstring[_i] = _e->Get(_i)->str(); } } else { _o->testarrayofstring.resize(0); } }\n  { auto _e = testarrayoftables(); if (_e) { _o->testarrayoftables.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { if(_o->testarrayoftables[_i]) { _e->Get(_i)->UnPackTo(_o->testarrayoftables[_i].get(), _resolver); } else { _o->testarrayoftables[_i] = std::unique_ptr<MyGame::Example::MonsterT>(_e->Get(_i)->UnPack(_resolver)); } } } else { _o->testarrayoftables.resize(0); } }\n  { auto _e = enemy(); if (_e) { if(_o->enemy) { _e->UnPackTo(_o->enemy.get(), _resolver); } else { _o->enemy = std::unique_ptr<MyGame::Example::MonsterT>(_e->UnPack(_resolver)); } } else if (_o->enemy) { _o->enemy.reset(); } }\n  { auto _e = testnestedflatbuffer(); if (_e) { _o->testnestedflatbuffer.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->testnestedflatbuffer.begin()); } }\n  { auto _e = testempty(); if (_e) { if(_o->testempty) { _e->UnPackTo(_o->testempty.get(), _resolver); } else { _o->testempty = std::unique_ptr<MyGame::Example::StatT>(_e->UnPack(_resolver)); } } else if (_o->testempty) { _o->testempty.reset(); } }\n  { auto _e = testbool(); _o->testbool = _e; }\n  { auto _e = testhashs32_fnv1(); _o->testhashs32_fnv1 = _e; }\n  { auto _e = testhashu32_fnv1(); _o->testhashu32_fnv1 = _e; }\n  { auto _e = testhashs64_fnv1(); _o->testhashs64_fnv1 = _e; }\n  { auto _e = testhashu64_fnv1(); _o->testhashu64_fnv1 = _e; }\n  { auto _e = testhashs32_fnv1a(); _o->testhashs32_fnv1a = _e; }\n  { auto _e = testhashu32_fnv1a(); /*scalar resolver, naked*/ if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->testhashu32_fnv1a), static_cast<::flatbuffers::hash_value_t>(_e)); else _o->testhashu32_fnv1a = nullptr; }\n  { auto _e = testhashs64_fnv1a(); _o->testhashs64_fnv1a = _e; }\n  { auto _e = testhashu64_fnv1a(); _o->testhashu64_fnv1a = _e; }\n  { auto _e = testarrayofbools(); if (_e) { _o->testarrayofbools.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testarrayofbools[_i] = _e->Get(_i) != 0; } } else { _o->testarrayofbools.resize(0); } }\n  { auto _e = testf(); _o->testf = _e; }\n  { auto _e = testf2(); _o->testf2 = _e; }\n  { auto _e = testf3(); _o->testf3 = _e; }\n  { auto _e = testarrayofstring2(); if (_e) { _o->testarrayofstring2.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testarrayofstring2[_i] = _e->Get(_i)->str(); } } else { _o->testarrayofstring2.resize(0); } }\n  { auto _e = testarrayofsortedstruct(); if (_e) { _o->testarrayofsortedstruct.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testarrayofsortedstruct[_i] = *_e->Get(_i); } } else { _o->testarrayofsortedstruct.resize(0); } }\n  { auto _e = flex(); if (_e) { _o->flex.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->flex.begin()); } }\n  { auto _e = test5(); if (_e) { _o->test5.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->test5[_i] = *_e->Get(_i); } } else { _o->test5.resize(0); } }\n  { auto _e = vector_of_longs(); if (_e) { _o->vector_of_longs.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vector_of_longs[_i] = _e->Get(_i); } } else { _o->vector_of_longs.resize(0); } }\n  { auto _e = vector_of_doubles(); if (_e) { _o->vector_of_doubles.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vector_of_doubles[_i] = _e->Get(_i); } } else { _o->vector_of_doubles.resize(0); } }\n  { auto _e = parent_namespace_test(); if (_e) { if(_o->parent_namespace_test) { _e->UnPackTo(_o->parent_namespace_test.get(), _resolver); } else { _o->parent_namespace_test = std::unique_ptr<MyGame::InParentNamespaceT>(_e->UnPack(_resolver)); } } else if (_o->parent_namespace_test) { _o->parent_namespace_test.reset(); } }\n  { auto _e = vector_of_referrables(); if (_e) { _o->vector_of_referrables.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { if(_o->vector_of_referrables[_i]) { _e->Get(_i)->UnPackTo(_o->vector_of_referrables[_i].get(), _resolver); } else { _o->vector_of_referrables[_i] = std::unique_ptr<MyGame::Example::ReferrableT>(_e->Get(_i)->UnPack(_resolver)); } } } else { _o->vector_of_referrables.resize(0); } }\n  { auto _e = single_weak_reference(); /*scalar resolver, naked*/ if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->single_weak_reference), static_cast<::flatbuffers::hash_value_t>(_e)); else _o->single_weak_reference = nullptr; }\n  { auto _e = vector_of_weak_references(); if (_e) { _o->vector_of_weak_references.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { /*vector resolver, naked*/ if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->vector_of_weak_references[_i]), static_cast<::flatbuffers::hash_value_t>(_e->Get(_i))); else _o->vector_of_weak_references[_i] = nullptr; } } else { _o->vector_of_weak_references.resize(0); } }\n  { auto _e = vector_of_strong_referrables(); if (_e) { _o->vector_of_strong_referrables.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { if(_o->vector_of_strong_referrables[_i]) { _e->Get(_i)->UnPackTo(_o->vector_of_strong_referrables[_i].get(), _resolver); } else { _o->vector_of_strong_referrables[_i] = std::unique_ptr<MyGame::Example::ReferrableT>(_e->Get(_i)->UnPack(_resolver)); } } } else { _o->vector_of_strong_referrables.resize(0); } }\n  { auto _e = co_owning_reference(); /*scalar resolver, naked*/ if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->co_owning_reference), static_cast<::flatbuffers::hash_value_t>(_e)); else _o->co_owning_reference = nullptr; }\n  { auto _e = vector_of_co_owning_references(); if (_e) { _o->vector_of_co_owning_references.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { /*vector resolver, default_ptr_type*/ if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->vector_of_co_owning_references[_i]), static_cast<::flatbuffers::hash_value_t>(_e->Get(_i)));/* else do nothing */} } else { _o->vector_of_co_owning_references.resize(0); } }\n  { auto _e = non_owning_reference(); /*scalar resolver, naked*/ if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->non_owning_reference), static_cast<::flatbuffers::hash_value_t>(_e)); else _o->non_owning_reference = nullptr; }\n  { auto _e = vector_of_non_owning_references(); if (_e) { _o->vector_of_non_owning_references.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { /*vector resolver, naked*/ if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->vector_of_non_owning_references[_i]), static_cast<::flatbuffers::hash_value_t>(_e->Get(_i))); else _o->vector_of_non_owning_references[_i] = nullptr; } } else { _o->vector_of_non_owning_references.resize(0); } }\n  { auto _e = any_unique_type(); _o->any_unique.type = _e; }\n  { auto _e = any_unique(); if (_e) _o->any_unique.value = MyGame::Example::AnyUniqueAliasesUnion::UnPack(_e, any_unique_type(), _resolver); }\n  { auto _e = any_ambiguous_type(); _o->any_ambiguous.type = _e; }\n  { auto _e = any_ambiguous(); if (_e) _o->any_ambiguous.value = MyGame::Example::AnyAmbiguousAliasesUnion::UnPack(_e, any_ambiguous_type(), _resolver); }\n  { auto _e = vector_of_enums(); if (_e) { _o->vector_of_enums.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vector_of_enums[_i] = static_cast<MyGame::Example::Color>(_e->Get(_i)); } } else { _o->vector_of_enums.resize(0); } }\n  { auto _e = signed_enum(); _o->signed_enum = _e; }\n  { auto _e = testrequirednestedflatbuffer(); if (_e) { _o->testrequirednestedflatbuffer.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->testrequirednestedflatbuffer.begin()); } }\n  { auto _e = scalar_key_sorted_tables(); if (_e) { _o->scalar_key_sorted_tables.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { if(_o->scalar_key_sorted_tables[_i]) { _e->Get(_i)->UnPackTo(_o->scalar_key_sorted_tables[_i].get(), _resolver); } else { _o->scalar_key_sorted_tables[_i] = std::unique_ptr<MyGame::Example::StatT>(_e->Get(_i)->UnPack(_resolver)); } } } else { _o->scalar_key_sorted_tables.resize(0); } }\n  { auto _e = native_inline(); if (_e) _o->native_inline = *_e; }\n  { auto _e = long_enum_non_enum_default(); _o->long_enum_non_enum_default = _e; }\n  { auto _e = long_enum_normal_default(); _o->long_enum_normal_default = _e; }\n  { auto _e = nan_default(); _o->nan_default = _e; }\n  { auto _e = inf_default(); _o->inf_default = _e; }\n  { auto _e = positive_inf_default(); _o->positive_inf_default = _e; }\n  { auto _e = infinity_default(); _o->infinity_default = _e; }\n  { auto _e = positive_infinity_default(); _o->positive_infinity_default = _e; }\n  { auto _e = negative_inf_default(); _o->negative_inf_default = _e; }\n  { auto _e = negative_infinity_default(); _o->negative_infinity_default = _e; }\n  { auto _e = double_inf_default(); _o->double_inf_default = _e; }\n}\n\ninline ::flatbuffers::Offset<Monster> CreateMonster(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  return Monster::Pack(_fbb, _o, _rehasher);\n}\n\ninline ::flatbuffers::Offset<Monster> Monster::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  (void)_rehasher;\n  (void)_o;\n  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const MonsterT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;\n  auto _pos = _o->pos ? _o->pos.get() : nullptr;\n  auto _mana = _o->mana;\n  auto _hp = _o->hp;\n  auto _name = _fbb.CreateString(_o->name);\n  auto _inventory = _o->inventory.size() ? _fbb.CreateVector(_o->inventory) : 0;\n  auto _color = _o->color;\n  auto _test_type = _o->test.type;\n  auto _test = _o->test.Pack(_fbb);\n  auto _test4 = _o->test4.size() ? _fbb.CreateVectorOfStructs(_o->test4) : 0;\n  auto _testarrayofstring = _o->testarrayofstring.size() ? _fbb.CreateVectorOfStrings(_o->testarrayofstring) : 0;\n  auto _testarrayoftables = _o->testarrayoftables.size() ? _fbb.CreateVector<::flatbuffers::Offset<MyGame::Example::Monster>> (_o->testarrayoftables.size(), [](size_t i, _VectorArgs *__va) { return MyGame::Example::CreateMonster(*__va->__fbb, __va->__o->testarrayoftables[i].get(), __va->__rehasher); }, &_va ) : 0;\n  auto _enemy = _o->enemy ? MyGame::Example::CreateMonster(_fbb, _o->enemy.get(), _rehasher) : 0;\n  auto _testnestedflatbuffer = _o->testnestedflatbuffer.size() ? _fbb.CreateVector(_o->testnestedflatbuffer) : 0;\n  auto _testempty = _o->testempty ? MyGame::Example::CreateStat(_fbb, _o->testempty.get(), _rehasher) : 0;\n  auto _testbool = _o->testbool;\n  auto _testhashs32_fnv1 = _o->testhashs32_fnv1;\n  auto _testhashu32_fnv1 = _o->testhashu32_fnv1;\n  auto _testhashs64_fnv1 = _o->testhashs64_fnv1;\n  auto _testhashu64_fnv1 = _o->testhashu64_fnv1;\n  auto _testhashs32_fnv1a = _o->testhashs32_fnv1a;\n  auto _testhashu32_fnv1a = _rehasher ? static_cast<uint32_t>((*_rehasher)(_o->testhashu32_fnv1a)) : 0;\n  auto _testhashs64_fnv1a = _o->testhashs64_fnv1a;\n  auto _testhashu64_fnv1a = _o->testhashu64_fnv1a;\n  auto _testarrayofbools = _o->testarrayofbools.size() ? _fbb.CreateVector(_o->testarrayofbools) : 0;\n  auto _testf = _o->testf;\n  auto _testf2 = _o->testf2;\n  auto _testf3 = _o->testf3;\n  auto _testarrayofstring2 = _o->testarrayofstring2.size() ? _fbb.CreateVectorOfStrings(_o->testarrayofstring2) : 0;\n  auto _testarrayofsortedstruct = _o->testarrayofsortedstruct.size() ? _fbb.CreateVectorOfStructs(_o->testarrayofsortedstruct) : 0;\n  auto _flex = _o->flex.size() ? _fbb.CreateVector(_o->flex) : 0;\n  auto _test5 = _o->test5.size() ? _fbb.CreateVectorOfStructs(_o->test5) : 0;\n  auto _vector_of_longs = _o->vector_of_longs.size() ? _fbb.CreateVector(_o->vector_of_longs) : 0;\n  auto _vector_of_doubles = _o->vector_of_doubles.size() ? _fbb.CreateVector(_o->vector_of_doubles) : 0;\n  auto _parent_namespace_test = _o->parent_namespace_test ? MyGame::CreateInParentNamespace(_fbb, _o->parent_namespace_test.get(), _rehasher) : 0;\n  auto _vector_of_referrables = _o->vector_of_referrables.size() ? _fbb.CreateVector<::flatbuffers::Offset<MyGame::Example::Referrable>> (_o->vector_of_referrables.size(), [](size_t i, _VectorArgs *__va) { return MyGame::Example::CreateReferrable(*__va->__fbb, __va->__o->vector_of_referrables[i].get(), __va->__rehasher); }, &_va ) : 0;\n  auto _single_weak_reference = _rehasher ? static_cast<uint64_t>((*_rehasher)(_o->single_weak_reference)) : 0;\n  auto _vector_of_weak_references = _o->vector_of_weak_references.size() ? _fbb.CreateVector<uint64_t>(_o->vector_of_weak_references.size(), [](size_t i, _VectorArgs *__va) { return __va->__rehasher ? static_cast<uint64_t>((*__va->__rehasher)(__va->__o->vector_of_weak_references[i])) : 0; }, &_va ) : 0;\n  auto _vector_of_strong_referrables = _o->vector_of_strong_referrables.size() ? _fbb.CreateVector<::flatbuffers::Offset<MyGame::Example::Referrable>> (_o->vector_of_strong_referrables.size(), [](size_t i, _VectorArgs *__va) { return MyGame::Example::CreateReferrable(*__va->__fbb, __va->__o->vector_of_strong_referrables[i].get(), __va->__rehasher); }, &_va ) : 0;\n  auto _co_owning_reference = _rehasher ? static_cast<uint64_t>((*_rehasher)(_o->co_owning_reference)) : 0;\n  auto _vector_of_co_owning_references = _o->vector_of_co_owning_references.size() ? _fbb.CreateVector<uint64_t>(_o->vector_of_co_owning_references.size(), [](size_t i, _VectorArgs *__va) { return __va->__rehasher ? static_cast<uint64_t>((*__va->__rehasher)(__va->__o->vector_of_co_owning_references[i].get())) : 0; }, &_va ) : 0;\n  auto _non_owning_reference = _rehasher ? static_cast<uint64_t>((*_rehasher)(_o->non_owning_reference)) : 0;\n  auto _vector_of_non_owning_references = _o->vector_of_non_owning_references.size() ? _fbb.CreateVector<uint64_t>(_o->vector_of_non_owning_references.size(), [](size_t i, _VectorArgs *__va) { return __va->__rehasher ? static_cast<uint64_t>((*__va->__rehasher)(__va->__o->vector_of_non_owning_references[i])) : 0; }, &_va ) : 0;\n  auto _any_unique_type = _o->any_unique.type;\n  auto _any_unique = _o->any_unique.Pack(_fbb);\n  auto _any_ambiguous_type = _o->any_ambiguous.type;\n  auto _any_ambiguous = _o->any_ambiguous.Pack(_fbb);\n  auto _vector_of_enums = _o->vector_of_enums.size() ? _fbb.CreateVectorScalarCast<uint8_t>(::flatbuffers::data(_o->vector_of_enums), _o->vector_of_enums.size()) : 0;\n  auto _signed_enum = _o->signed_enum;\n  auto _testrequirednestedflatbuffer = _o->testrequirednestedflatbuffer.size() ? _fbb.CreateVector(_o->testrequirednestedflatbuffer) : 0;\n  auto _scalar_key_sorted_tables = _o->scalar_key_sorted_tables.size() ? _fbb.CreateVector<::flatbuffers::Offset<MyGame::Example::Stat>> (_o->scalar_key_sorted_tables.size(), [](size_t i, _VectorArgs *__va) { return MyGame::Example::CreateStat(*__va->__fbb, __va->__o->scalar_key_sorted_tables[i].get(), __va->__rehasher); }, &_va ) : 0;\n  auto _native_inline = &_o->native_inline;\n  auto _long_enum_non_enum_default = _o->long_enum_non_enum_default;\n  auto _long_enum_normal_default = _o->long_enum_normal_default;\n  auto _nan_default = _o->nan_default;\n  auto _inf_default = _o->inf_default;\n  auto _positive_inf_default = _o->positive_inf_default;\n  auto _infinity_default = _o->infinity_default;\n  auto _positive_infinity_default = _o->positive_infinity_default;\n  auto _negative_inf_default = _o->negative_inf_default;\n  auto _negative_infinity_default = _o->negative_infinity_default;\n  auto _double_inf_default = _o->double_inf_default;\n  return MyGame::Example::CreateMonster(\n      _fbb,\n      _pos,\n      _mana,\n      _hp,\n      _name,\n      _inventory,\n      _color,\n      _test_type,\n      _test,\n      _test4,\n      _testarrayofstring,\n      _testarrayoftables,\n      _enemy,\n      _testnestedflatbuffer,\n      _testempty,\n      _testbool,\n      _testhashs32_fnv1,\n      _testhashu32_fnv1,\n      _testhashs64_fnv1,\n      _testhashu64_fnv1,\n      _testhashs32_fnv1a,\n      _testhashu32_fnv1a,\n      _testhashs64_fnv1a,\n      _testhashu64_fnv1a,\n      _testarrayofbools,\n      _testf,\n      _testf2,\n      _testf3,\n      _testarrayofstring2,\n      _testarrayofsortedstruct,\n      _flex,\n      _test5,\n      _vector_of_longs,\n      _vector_of_doubles,\n      _parent_namespace_test,\n      _vector_of_referrables,\n      _single_weak_reference,\n      _vector_of_weak_references,\n      _vector_of_strong_referrables,\n      _co_owning_reference,\n      _vector_of_co_owning_references,\n      _non_owning_reference,\n      _vector_of_non_owning_references,\n      _any_unique_type,\n      _any_unique,\n      _any_ambiguous_type,\n      _any_ambiguous,\n      _vector_of_enums,\n      _signed_enum,\n      _testrequirednestedflatbuffer,\n      _scalar_key_sorted_tables,\n      _native_inline,\n      _long_enum_non_enum_default,\n      _long_enum_normal_default,\n      _nan_default,\n      _inf_default,\n      _positive_inf_default,\n      _infinity_default,\n      _positive_infinity_default,\n      _negative_inf_default,\n      _negative_infinity_default,\n      _double_inf_default);\n}\n\n\ninline bool operator==(const TypeAliasesT &lhs, const TypeAliasesT &rhs) {\n  return\n      (lhs.i8 == rhs.i8) &&\n      (lhs.u8 == rhs.u8) &&\n      (lhs.i16 == rhs.i16) &&\n      (lhs.u16 == rhs.u16) &&\n      (lhs.i32 == rhs.i32) &&\n      (lhs.u32 == rhs.u32) &&\n      (lhs.i64 == rhs.i64) &&\n      (lhs.u64 == rhs.u64) &&\n      (lhs.f32 == rhs.f32) &&\n      (lhs.f64 == rhs.f64) &&\n      (lhs.v8 == rhs.v8) &&\n      (lhs.vf64 == rhs.vf64);\n}\n\ninline bool operator!=(const TypeAliasesT &lhs, const TypeAliasesT &rhs) {\n    return !(lhs == rhs);\n}\n\n\ninline TypeAliasesT *TypeAliases::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {\n  auto _o = std::unique_ptr<TypeAliasesT>(new TypeAliasesT());\n  UnPackTo(_o.get(), _resolver);\n  return _o.release();\n}\n\ninline void TypeAliases::UnPackTo(TypeAliasesT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {\n  (void)_o;\n  (void)_resolver;\n  { auto _e = i8(); _o->i8 = _e; }\n  { auto _e = u8(); _o->u8 = _e; }\n  { auto _e = i16(); _o->i16 = _e; }\n  { auto _e = u16(); _o->u16 = _e; }\n  { auto _e = i32(); _o->i32 = _e; }\n  { auto _e = u32(); _o->u32 = _e; }\n  { auto _e = i64(); _o->i64 = _e; }\n  { auto _e = u64(); _o->u64 = _e; }\n  { auto _e = f32(); _o->f32 = _e; }\n  { auto _e = f64(); _o->f64 = _e; }\n  { auto _e = v8(); if (_e) { _o->v8.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->v8.begin()); } }\n  { auto _e = vf64(); if (_e) { _o->vf64.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vf64[_i] = _e->Get(_i); } } else { _o->vf64.resize(0); } }\n}\n\ninline ::flatbuffers::Offset<TypeAliases> CreateTypeAliases(::flatbuffers::FlatBufferBuilder &_fbb, const TypeAliasesT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  return TypeAliases::Pack(_fbb, _o, _rehasher);\n}\n\ninline ::flatbuffers::Offset<TypeAliases> TypeAliases::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const TypeAliasesT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  (void)_rehasher;\n  (void)_o;\n  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const TypeAliasesT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;\n  auto _i8 = _o->i8;\n  auto _u8 = _o->u8;\n  auto _i16 = _o->i16;\n  auto _u16 = _o->u16;\n  auto _i32 = _o->i32;\n  auto _u32 = _o->u32;\n  auto _i64 = _o->i64;\n  auto _u64 = _o->u64;\n  auto _f32 = _o->f32;\n  auto _f64 = _o->f64;\n  auto _v8 = _o->v8.size() ? _fbb.CreateVector(_o->v8) : 0;\n  auto _vf64 = _o->vf64.size() ? _fbb.CreateVector(_o->vf64) : 0;\n  return MyGame::Example::CreateTypeAliases(\n      _fbb,\n      _i8,\n      _u8,\n      _i16,\n      _u16,\n      _i32,\n      _u32,\n      _i64,\n      _u64,\n      _f32,\n      _f64,\n      _v8,\n      _vf64);\n}\n\ntemplate <bool B>\ninline bool VerifyAny(::flatbuffers::VerifierTemplate<B> &verifier, const void *obj, Any type) {\n  switch (type) {\n    case Any_NONE: {\n      return true;\n    }\n    case Any_Monster: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return verifier.VerifyTable(ptr);\n    }\n    case Any_TestSimpleTableWithEnum: {\n      auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnum *>(obj);\n      return verifier.VerifyTable(ptr);\n    }\n    case Any_MyGame_Example2_Monster: {\n      auto ptr = reinterpret_cast<const MyGame::Example2::Monster *>(obj);\n      return verifier.VerifyTable(ptr);\n    }\n    default: return true;\n  }\n}\n\ntemplate <bool B>\ninline bool VerifyAnyVector(::flatbuffers::VerifierTemplate<B> &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types) {\n  if (!values || !types) return !values && !types;\n  if (values->size() != types->size()) return false;\n  for (::flatbuffers::uoffset_t i = 0; i < values->size(); ++i) {\n    if (!VerifyAny(\n        verifier,  values->Get(i), types->GetEnum<Any>(i))) {\n      return false;\n    }\n  }\n  return true;\n}\n\ninline void *AnyUnion::UnPack(const void *obj, Any type, const ::flatbuffers::resolver_function_t *resolver) {\n  (void)resolver;\n  switch (type) {\n    case Any_Monster: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return ptr->UnPack(resolver);\n    }\n    case Any_TestSimpleTableWithEnum: {\n      auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnum *>(obj);\n      return ptr->UnPack(resolver);\n    }\n    case Any_MyGame_Example2_Monster: {\n      auto ptr = reinterpret_cast<const MyGame::Example2::Monster *>(obj);\n      return ptr->UnPack(resolver);\n    }\n    default: return nullptr;\n  }\n}\n\ninline ::flatbuffers::Offset<void> AnyUnion::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ::flatbuffers::rehasher_function_t *_rehasher) const {\n  (void)_rehasher;\n  switch (type) {\n    case Any_Monster: {\n      auto ptr = reinterpret_cast<const MyGame::Example::MonsterT *>(value);\n      return CreateMonster(_fbb, ptr, _rehasher).Union();\n    }\n    case Any_TestSimpleTableWithEnum: {\n      auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(value);\n      return CreateTestSimpleTableWithEnum(_fbb, ptr, _rehasher).Union();\n    }\n    case Any_MyGame_Example2_Monster: {\n      auto ptr = reinterpret_cast<const MyGame::Example2::MonsterT *>(value);\n      return CreateMonster(_fbb, ptr, _rehasher).Union();\n    }\n    default: return 0;\n  }\n}\n\ninline AnyUnion::AnyUnion(const AnyUnion &u) : type(u.type), value(nullptr) {\n  switch (type) {\n    case Any_Monster: {\n      value = new MyGame::Example::MonsterT(*reinterpret_cast<MyGame::Example::MonsterT *>(u.value));\n      break;\n    }\n    case Any_TestSimpleTableWithEnum: {\n      value = new MyGame::Example::TestSimpleTableWithEnumT(*reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(u.value));\n      break;\n    }\n    case Any_MyGame_Example2_Monster: {\n      value = new MyGame::Example2::MonsterT(*reinterpret_cast<MyGame::Example2::MonsterT *>(u.value));\n      break;\n    }\n    default:\n      break;\n  }\n}\n\ninline void AnyUnion::Reset() {\n  switch (type) {\n    case Any_Monster: {\n      auto ptr = reinterpret_cast<MyGame::Example::MonsterT *>(value);\n      delete ptr;\n      break;\n    }\n    case Any_TestSimpleTableWithEnum: {\n      auto ptr = reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(value);\n      delete ptr;\n      break;\n    }\n    case Any_MyGame_Example2_Monster: {\n      auto ptr = reinterpret_cast<MyGame::Example2::MonsterT *>(value);\n      delete ptr;\n      break;\n    }\n    default: break;\n  }\n  value = nullptr;\n  type = Any_NONE;\n}\n\ntemplate <bool B>\ninline bool VerifyAnyUniqueAliases(::flatbuffers::VerifierTemplate<B> &verifier, const void *obj, AnyUniqueAliases type) {\n  switch (type) {\n    case AnyUniqueAliases_NONE: {\n      return true;\n    }\n    case AnyUniqueAliases_M: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return verifier.VerifyTable(ptr);\n    }\n    case AnyUniqueAliases_TS: {\n      auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnum *>(obj);\n      return verifier.VerifyTable(ptr);\n    }\n    case AnyUniqueAliases_M2: {\n      auto ptr = reinterpret_cast<const MyGame::Example2::Monster *>(obj);\n      return verifier.VerifyTable(ptr);\n    }\n    default: return true;\n  }\n}\n\ntemplate <bool B>\ninline bool VerifyAnyUniqueAliasesVector(::flatbuffers::VerifierTemplate<B> &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types) {\n  if (!values || !types) return !values && !types;\n  if (values->size() != types->size()) return false;\n  for (::flatbuffers::uoffset_t i = 0; i < values->size(); ++i) {\n    if (!VerifyAnyUniqueAliases(\n        verifier,  values->Get(i), types->GetEnum<AnyUniqueAliases>(i))) {\n      return false;\n    }\n  }\n  return true;\n}\n\ninline void *AnyUniqueAliasesUnion::UnPack(const void *obj, AnyUniqueAliases type, const ::flatbuffers::resolver_function_t *resolver) {\n  (void)resolver;\n  switch (type) {\n    case AnyUniqueAliases_M: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return ptr->UnPack(resolver);\n    }\n    case AnyUniqueAliases_TS: {\n      auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnum *>(obj);\n      return ptr->UnPack(resolver);\n    }\n    case AnyUniqueAliases_M2: {\n      auto ptr = reinterpret_cast<const MyGame::Example2::Monster *>(obj);\n      return ptr->UnPack(resolver);\n    }\n    default: return nullptr;\n  }\n}\n\ninline ::flatbuffers::Offset<void> AnyUniqueAliasesUnion::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ::flatbuffers::rehasher_function_t *_rehasher) const {\n  (void)_rehasher;\n  switch (type) {\n    case AnyUniqueAliases_M: {\n      auto ptr = reinterpret_cast<const MyGame::Example::MonsterT *>(value);\n      return CreateMonster(_fbb, ptr, _rehasher).Union();\n    }\n    case AnyUniqueAliases_TS: {\n      auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(value);\n      return CreateTestSimpleTableWithEnum(_fbb, ptr, _rehasher).Union();\n    }\n    case AnyUniqueAliases_M2: {\n      auto ptr = reinterpret_cast<const MyGame::Example2::MonsterT *>(value);\n      return CreateMonster(_fbb, ptr, _rehasher).Union();\n    }\n    default: return 0;\n  }\n}\n\ninline AnyUniqueAliasesUnion::AnyUniqueAliasesUnion(const AnyUniqueAliasesUnion &u) : type(u.type), value(nullptr) {\n  switch (type) {\n    case AnyUniqueAliases_M: {\n      value = new MyGame::Example::MonsterT(*reinterpret_cast<MyGame::Example::MonsterT *>(u.value));\n      break;\n    }\n    case AnyUniqueAliases_TS: {\n      value = new MyGame::Example::TestSimpleTableWithEnumT(*reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(u.value));\n      break;\n    }\n    case AnyUniqueAliases_M2: {\n      value = new MyGame::Example2::MonsterT(*reinterpret_cast<MyGame::Example2::MonsterT *>(u.value));\n      break;\n    }\n    default:\n      break;\n  }\n}\n\ninline void AnyUniqueAliasesUnion::Reset() {\n  switch (type) {\n    case AnyUniqueAliases_M: {\n      auto ptr = reinterpret_cast<MyGame::Example::MonsterT *>(value);\n      delete ptr;\n      break;\n    }\n    case AnyUniqueAliases_TS: {\n      auto ptr = reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(value);\n      delete ptr;\n      break;\n    }\n    case AnyUniqueAliases_M2: {\n      auto ptr = reinterpret_cast<MyGame::Example2::MonsterT *>(value);\n      delete ptr;\n      break;\n    }\n    default: break;\n  }\n  value = nullptr;\n  type = AnyUniqueAliases_NONE;\n}\n\ntemplate <bool B>\ninline bool VerifyAnyAmbiguousAliases(::flatbuffers::VerifierTemplate<B> &verifier, const void *obj, AnyAmbiguousAliases type) {\n  switch (type) {\n    case AnyAmbiguousAliases_NONE: {\n      return true;\n    }\n    case AnyAmbiguousAliases_M1: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return verifier.VerifyTable(ptr);\n    }\n    case AnyAmbiguousAliases_M2: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return verifier.VerifyTable(ptr);\n    }\n    case AnyAmbiguousAliases_M3: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return verifier.VerifyTable(ptr);\n    }\n    default: return true;\n  }\n}\n\ntemplate <bool B>\ninline bool VerifyAnyAmbiguousAliasesVector(::flatbuffers::VerifierTemplate<B> &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types) {\n  if (!values || !types) return !values && !types;\n  if (values->size() != types->size()) return false;\n  for (::flatbuffers::uoffset_t i = 0; i < values->size(); ++i) {\n    if (!VerifyAnyAmbiguousAliases(\n        verifier,  values->Get(i), types->GetEnum<AnyAmbiguousAliases>(i))) {\n      return false;\n    }\n  }\n  return true;\n}\n\ninline void *AnyAmbiguousAliasesUnion::UnPack(const void *obj, AnyAmbiguousAliases type, const ::flatbuffers::resolver_function_t *resolver) {\n  (void)resolver;\n  switch (type) {\n    case AnyAmbiguousAliases_M1: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return ptr->UnPack(resolver);\n    }\n    case AnyAmbiguousAliases_M2: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return ptr->UnPack(resolver);\n    }\n    case AnyAmbiguousAliases_M3: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return ptr->UnPack(resolver);\n    }\n    default: return nullptr;\n  }\n}\n\ninline ::flatbuffers::Offset<void> AnyAmbiguousAliasesUnion::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ::flatbuffers::rehasher_function_t *_rehasher) const {\n  (void)_rehasher;\n  switch (type) {\n    case AnyAmbiguousAliases_M1: {\n      auto ptr = reinterpret_cast<const MyGame::Example::MonsterT *>(value);\n      return CreateMonster(_fbb, ptr, _rehasher).Union();\n    }\n    case AnyAmbiguousAliases_M2: {\n      auto ptr = reinterpret_cast<const MyGame::Example::MonsterT *>(value);\n      return CreateMonster(_fbb, ptr, _rehasher).Union();\n    }\n    case AnyAmbiguousAliases_M3: {\n      auto ptr = reinterpret_cast<const MyGame::Example::MonsterT *>(value);\n      return CreateMonster(_fbb, ptr, _rehasher).Union();\n    }\n    default: return 0;\n  }\n}\n\ninline AnyAmbiguousAliasesUnion::AnyAmbiguousAliasesUnion(const AnyAmbiguousAliasesUnion &u) : type(u.type), value(nullptr) {\n  switch (type) {\n    case AnyAmbiguousAliases_M1: {\n      value = new MyGame::Example::MonsterT(*reinterpret_cast<MyGame::Example::MonsterT *>(u.value));\n      break;\n    }\n    case AnyAmbiguousAliases_M2: {\n      value = new MyGame::Example::MonsterT(*reinterpret_cast<MyGame::Example::MonsterT *>(u.value));\n      break;\n    }\n    case AnyAmbiguousAliases_M3: {\n      value = new MyGame::Example::MonsterT(*reinterpret_cast<MyGame::Example::MonsterT *>(u.value));\n      break;\n    }\n    default:\n      break;\n  }\n}\n\ninline void AnyAmbiguousAliasesUnion::Reset() {\n  switch (type) {\n    case AnyAmbiguousAliases_M1: {\n      auto ptr = reinterpret_cast<MyGame::Example::MonsterT *>(value);\n      delete ptr;\n      break;\n    }\n    case AnyAmbiguousAliases_M2: {\n      auto ptr = reinterpret_cast<MyGame::Example::MonsterT *>(value);\n      delete ptr;\n      break;\n    }\n    case AnyAmbiguousAliases_M3: {\n      auto ptr = reinterpret_cast<MyGame::Example::MonsterT *>(value);\n      delete ptr;\n      break;\n    }\n    default: break;\n  }\n  value = nullptr;\n  type = AnyAmbiguousAliases_NONE;\n}\n\ninline const ::flatbuffers::TypeTable *ColorTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_UCHAR, 0, 0 },\n    { ::flatbuffers::ET_UCHAR, 0, 0 },\n    { ::flatbuffers::ET_UCHAR, 0, 0 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::ColorTypeTable\n  };\n  static const int64_t values[] = { 1, 2, 8 };\n  static const char * const names[] = {\n    \"Red\",\n    \"Green\",\n    \"Blue\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_ENUM, 3, type_codes, type_refs, nullptr, values, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *RaceTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_CHAR, 0, 0 },\n    { ::flatbuffers::ET_CHAR, 0, 0 },\n    { ::flatbuffers::ET_CHAR, 0, 0 },\n    { ::flatbuffers::ET_CHAR, 0, 0 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::RaceTypeTable\n  };\n  static const int64_t values[] = { -1, 0, 1, 2 };\n  static const char * const names[] = {\n    \"None\",\n    \"Human\",\n    \"Dwarf\",\n    \"Elf\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_ENUM, 4, type_codes, type_refs, nullptr, values, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *LongEnumTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_ULONG, 0, 0 },\n    { ::flatbuffers::ET_ULONG, 0, 0 },\n    { ::flatbuffers::ET_ULONG, 0, 0 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::LongEnumTypeTable\n  };\n  static const int64_t values[] = { 2ULL, 4ULL, 1099511627776ULL };\n  static const char * const names[] = {\n    \"LongOne\",\n    \"LongTwo\",\n    \"LongBig\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_ENUM, 3, type_codes, type_refs, nullptr, values, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *AnyTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_SEQUENCE, 0, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 0 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 1 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 2 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::MonsterTypeTable,\n    MyGame::Example::TestSimpleTableWithEnumTypeTable,\n    MyGame::Example2::MonsterTypeTable\n  };\n  static const char * const names[] = {\n    \"NONE\",\n    \"Monster\",\n    \"TestSimpleTableWithEnum\",\n    \"MyGame_Example2_Monster\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, nullptr, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *AnyUniqueAliasesTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_SEQUENCE, 0, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 0 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 1 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 2 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::MonsterTypeTable,\n    MyGame::Example::TestSimpleTableWithEnumTypeTable,\n    MyGame::Example2::MonsterTypeTable\n  };\n  static const char * const names[] = {\n    \"NONE\",\n    \"M\",\n    \"TS\",\n    \"M2\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, nullptr, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *AnyAmbiguousAliasesTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_SEQUENCE, 0, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 0 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 0 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 0 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::MonsterTypeTable\n  };\n  static const char * const names[] = {\n    \"NONE\",\n    \"M1\",\n    \"M2\",\n    \"M3\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, nullptr, names\n  };\n  return &tt;\n}\n\n}  // namespace Example\n\ninline const ::flatbuffers::TypeTable *InParentNamespaceTypeTable() {\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_TABLE, 0, nullptr, nullptr, nullptr, nullptr, nullptr\n  };\n  return &tt;\n}\n\nnamespace Example2 {\n\ninline const ::flatbuffers::TypeTable *MonsterTypeTable() {\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_TABLE, 0, nullptr, nullptr, nullptr, nullptr, nullptr\n  };\n  return &tt;\n}\n\n}  // namespace Example2\n\nnamespace Example {\n\ninline const ::flatbuffers::TypeTable *TestTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_SHORT, 0, -1 },\n    { ::flatbuffers::ET_CHAR, 0, -1 }\n  };\n  static const int64_t values[] = { 0, 2, 4 };\n  static const char * const names[] = {\n    \"a\",\n    \"b\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_STRUCT, 2, type_codes, nullptr, nullptr, values, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *TestSimpleTableWithEnumTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_UCHAR, 0, 0 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::ColorTypeTable\n  };\n  static const char * const names[] = {\n    \"color\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_TABLE, 1, type_codes, type_refs, nullptr, nullptr, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *Vec3TypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_DOUBLE, 0, -1 },\n    { ::flatbuffers::ET_UCHAR, 0, 0 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 1 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::ColorTypeTable,\n    MyGame::Example::TestTypeTable\n  };\n  static const int64_t values[] = { 0, 4, 8, 16, 24, 26, 32 };\n  static const char * const names[] = {\n    \"x\",\n    \"y\",\n    \"z\",\n    \"test1\",\n    \"test2\",\n    \"test3\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_STRUCT, 6, type_codes, type_refs, nullptr, values, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *AbilityTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_UINT, 0, -1 },\n    { ::flatbuffers::ET_UINT, 0, -1 }\n  };\n  static const int64_t values[] = { 0, 4, 8 };\n  static const char * const names[] = {\n    \"id\",\n    \"distance\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_STRUCT, 2, type_codes, nullptr, nullptr, values, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *StructOfStructsTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_SEQUENCE, 0, 0 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 1 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 0 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::AbilityTypeTable,\n    MyGame::Example::TestTypeTable\n  };\n  static const int64_t values[] = { 0, 8, 12, 20 };\n  static const char * const names[] = {\n    \"a\",\n    \"b\",\n    \"c\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_STRUCT, 3, type_codes, type_refs, nullptr, values, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *StructOfStructsOfStructsTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_SEQUENCE, 0, 0 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::StructOfStructsTypeTable\n  };\n  static const int64_t values[] = { 0, 20 };\n  static const char * const names[] = {\n    \"a\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_STRUCT, 1, type_codes, type_refs, nullptr, values, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *StatTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_STRING, 0, -1 },\n    { ::flatbuffers::ET_LONG, 0, -1 },\n    { ::flatbuffers::ET_USHORT, 0, -1 }\n  };\n  static const char * const names[] = {\n    \"id\",\n    \"val\",\n    \"count\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_TABLE, 3, type_codes, nullptr, nullptr, nullptr, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *ReferrableTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_ULONG, 0, -1 }\n  };\n  static const char * const names[] = {\n    \"id\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_TABLE, 1, type_codes, nullptr, nullptr, nullptr, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *MonsterTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_SEQUENCE, 0, 0 },\n    { ::flatbuffers::ET_SHORT, 0, -1 },\n    { ::flatbuffers::ET_SHORT, 0, -1 },\n    { ::flatbuffers::ET_STRING, 0, -1 },\n    { ::flatbuffers::ET_BOOL, 0, -1 },\n    { ::flatbuffers::ET_UCHAR, 1, -1 },\n    { ::flatbuffers::ET_UCHAR, 0, 1 },\n    { ::flatbuffers::ET_UTYPE, 0, 2 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 2 },\n    { ::flatbuffers::ET_SEQUENCE, 1, 3 },\n    { ::flatbuffers::ET_STRING, 1, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 1, 4 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 4 },\n    { ::flatbuffers::ET_UCHAR, 1, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 5 },\n    { ::flatbuffers::ET_BOOL, 0, -1 },\n    { ::flatbuffers::ET_INT, 0, -1 },\n    { ::flatbuffers::ET_UINT, 0, -1 },\n    { ::flatbuffers::ET_LONG, 0, -1 },\n    { ::flatbuffers::ET_ULONG, 0, -1 },\n    { ::flatbuffers::ET_INT, 0, -1 },\n    { ::flatbuffers::ET_UINT, 0, -1 },\n    { ::flatbuffers::ET_LONG, 0, -1 },\n    { ::flatbuffers::ET_ULONG, 0, -1 },\n    { ::flatbuffers::ET_BOOL, 1, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_STRING, 1, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 1, 6 },\n    { ::flatbuffers::ET_UCHAR, 1, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 1, 3 },\n    { ::flatbuffers::ET_LONG, 1, -1 },\n    { ::flatbuffers::ET_DOUBLE, 1, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 7 },\n    { ::flatbuffers::ET_SEQUENCE, 1, 8 },\n    { ::flatbuffers::ET_ULONG, 0, -1 },\n    { ::flatbuffers::ET_ULONG, 1, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 1, 8 },\n    { ::flatbuffers::ET_ULONG, 0, -1 },\n    { ::flatbuffers::ET_ULONG, 1, -1 },\n    { ::flatbuffers::ET_ULONG, 0, -1 },\n    { ::flatbuffers::ET_ULONG, 1, -1 },\n    { ::flatbuffers::ET_UTYPE, 0, 9 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 9 },\n    { ::flatbuffers::ET_UTYPE, 0, 10 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 10 },\n    { ::flatbuffers::ET_UCHAR, 1, 1 },\n    { ::flatbuffers::ET_CHAR, 0, 11 },\n    { ::flatbuffers::ET_UCHAR, 1, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 1, 5 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 3 },\n    { ::flatbuffers::ET_ULONG, 0, 12 },\n    { ::flatbuffers::ET_ULONG, 0, 12 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_DOUBLE, 0, -1 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::Vec3TypeTable,\n    MyGame::Example::ColorTypeTable,\n    MyGame::Example::AnyTypeTable,\n    MyGame::Example::TestTypeTable,\n    MyGame::Example::MonsterTypeTable,\n    MyGame::Example::StatTypeTable,\n    MyGame::Example::AbilityTypeTable,\n    MyGame::InParentNamespaceTypeTable,\n    MyGame::Example::ReferrableTypeTable,\n    MyGame::Example::AnyUniqueAliasesTypeTable,\n    MyGame::Example::AnyAmbiguousAliasesTypeTable,\n    MyGame::Example::RaceTypeTable,\n    MyGame::Example::LongEnumTypeTable\n  };\n  static const char * const names[] = {\n    \"pos\",\n    \"mana\",\n    \"hp\",\n    \"name\",\n    \"friendly\",\n    \"inventory\",\n    \"color\",\n    \"test_type\",\n    \"test\",\n    \"test4\",\n    \"testarrayofstring\",\n    \"testarrayoftables\",\n    \"enemy\",\n    \"testnestedflatbuffer\",\n    \"testempty\",\n    \"testbool\",\n    \"testhashs32_fnv1\",\n    \"testhashu32_fnv1\",\n    \"testhashs64_fnv1\",\n    \"testhashu64_fnv1\",\n    \"testhashs32_fnv1a\",\n    \"testhashu32_fnv1a\",\n    \"testhashs64_fnv1a\",\n    \"testhashu64_fnv1a\",\n    \"testarrayofbools\",\n    \"testf\",\n    \"testf2\",\n    \"testf3\",\n    \"testarrayofstring2\",\n    \"testarrayofsortedstruct\",\n    \"flex\",\n    \"test5\",\n    \"vector_of_longs\",\n    \"vector_of_doubles\",\n    \"parent_namespace_test\",\n    \"vector_of_referrables\",\n    \"single_weak_reference\",\n    \"vector_of_weak_references\",\n    \"vector_of_strong_referrables\",\n    \"co_owning_reference\",\n    \"vector_of_co_owning_references\",\n    \"non_owning_reference\",\n    \"vector_of_non_owning_references\",\n    \"any_unique_type\",\n    \"any_unique\",\n    \"any_ambiguous_type\",\n    \"any_ambiguous\",\n    \"vector_of_enums\",\n    \"signed_enum\",\n    \"testrequirednestedflatbuffer\",\n    \"scalar_key_sorted_tables\",\n    \"native_inline\",\n    \"long_enum_non_enum_default\",\n    \"long_enum_normal_default\",\n    \"nan_default\",\n    \"inf_default\",\n    \"positive_inf_default\",\n    \"infinity_default\",\n    \"positive_infinity_default\",\n    \"negative_inf_default\",\n    \"negative_infinity_default\",\n    \"double_inf_default\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_TABLE, 62, type_codes, type_refs, nullptr, nullptr, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *TypeAliasesTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_CHAR, 0, -1 },\n    { ::flatbuffers::ET_UCHAR, 0, -1 },\n    { ::flatbuffers::ET_SHORT, 0, -1 },\n    { ::flatbuffers::ET_USHORT, 0, -1 },\n    { ::flatbuffers::ET_INT, 0, -1 },\n    { ::flatbuffers::ET_UINT, 0, -1 },\n    { ::flatbuffers::ET_LONG, 0, -1 },\n    { ::flatbuffers::ET_ULONG, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_DOUBLE, 0, -1 },\n    { ::flatbuffers::ET_CHAR, 1, -1 },\n    { ::flatbuffers::ET_DOUBLE, 1, -1 }\n  };\n  static const char * const names[] = {\n    \"i8\",\n    \"u8\",\n    \"i16\",\n    \"u16\",\n    \"i32\",\n    \"u32\",\n    \"i64\",\n    \"u64\",\n    \"f32\",\n    \"f64\",\n    \"v8\",\n    \"vf64\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_TABLE, 12, type_codes, nullptr, nullptr, nullptr, names\n  };\n  return &tt;\n}\n\ninline const MyGame::Example::Monster *GetMonster(const void *buf) {\n  return ::flatbuffers::GetRoot<MyGame::Example::Monster>(buf);\n}\n\ninline const MyGame::Example::Monster *GetSizePrefixedMonster(const void *buf) {\n  return ::flatbuffers::GetSizePrefixedRoot<MyGame::Example::Monster>(buf);\n}\n\ninline Monster *GetMutableMonster(void *buf) {\n  return ::flatbuffers::GetMutableRoot<Monster>(buf);\n}\n\ninline MyGame::Example::Monster *GetMutableSizePrefixedMonster(void *buf) {\n  return ::flatbuffers::GetMutableSizePrefixedRoot<MyGame::Example::Monster>(buf);\n}\n\ninline const char *MonsterIdentifier() {\n  return \"MONS\";\n}\n\ninline bool MonsterBufferHasIdentifier(const void *buf) {\n  return ::flatbuffers::BufferHasIdentifier(\n      buf, MonsterIdentifier());\n}\n\ninline bool SizePrefixedMonsterBufferHasIdentifier(const void *buf) {\n  return ::flatbuffers::BufferHasIdentifier(\n      buf, MonsterIdentifier(), true);\n}\n\ntemplate <bool B = false>\ninline bool VerifyMonsterBuffer(\n    ::flatbuffers::VerifierTemplate<B> &verifier) {\n  return verifier.template VerifyBuffer<MyGame::Example::Monster>(MonsterIdentifier());\n}\n\ntemplate <bool B = false>\ninline bool VerifySizePrefixedMonsterBuffer(\n    ::flatbuffers::VerifierTemplate<B> &verifier) {\n  return verifier.template VerifySizePrefixedBuffer<MyGame::Example::Monster>(MonsterIdentifier());\n}\n\ninline const char *MonsterExtension() {\n  return \"mon\";\n}\n\ninline void FinishMonsterBuffer(\n    ::flatbuffers::FlatBufferBuilder &fbb,\n    ::flatbuffers::Offset<MyGame::Example::Monster> root) {\n  fbb.Finish(root, MonsterIdentifier());\n}\n\ninline void FinishSizePrefixedMonsterBuffer(\n    ::flatbuffers::FlatBufferBuilder &fbb,\n    ::flatbuffers::Offset<MyGame::Example::Monster> root) {\n  fbb.FinishSizePrefixed(root, MonsterIdentifier());\n}\n\ninline std::unique_ptr<MyGame::Example::MonsterT> UnPackMonster(\n    const void *buf,\n    const ::flatbuffers::resolver_function_t *res = nullptr) {\n  return std::unique_ptr<MyGame::Example::MonsterT>(GetMonster(buf)->UnPack(res));\n}\n\ninline std::unique_ptr<MyGame::Example::MonsterT> UnPackSizePrefixedMonster(\n    const void *buf,\n    const ::flatbuffers::resolver_function_t *res = nullptr) {\n  return std::unique_ptr<MyGame::Example::MonsterT>(GetSizePrefixedMonster(buf)->UnPack(res));\n}\n\n}  // namespace Example\n}  // namespace MyGame\n\n#endif  // FLATBUFFERS_GENERATED_MONSTERTEST_MYGAME_EXAMPLE_H_\n"
  },
  {
    "path": "tests/monster_test_suffix/monster_test.grpc.fb.cc",
    "content": "// Generated by the gRPC C++ plugin.\n// FlatBuffers modified generator: native gRPC callback client API enabled when --grpc-callback-api.\n// source: monster_test\n\n#include \"monster_test_suffix.hpp\"\n#include \"monster_test.grpc.fb.h\"\n\n#include <grpcpp/impl/codegen/async_stream.h>\n#include <grpcpp/impl/codegen/async_unary_call.h>\n#include <grpcpp/impl/codegen/channel_interface.h>\n#include <grpcpp/impl/codegen/client_unary_call.h>\n#include <grpcpp/impl/codegen/method_handler.h>\n#include <grpcpp/impl/codegen/rpc_service_method.h>\n#include <grpcpp/impl/codegen/service_type.h>\n#include <grpcpp/impl/codegen/sync_stream.h>\nnamespace MyGame {\nnamespace Example {\n\nstatic const char* MonsterStorage_method_names[] = {\n  \"/MyGame.Example.MonsterStorage/Store\",\n  \"/MyGame.Example.MonsterStorage/Retrieve\",\n  \"/MyGame.Example.MonsterStorage/GetMaxHitPoint\",\n  \"/MyGame.Example.MonsterStorage/GetMinMaxHitPoints\",\n};\n\nstd::unique_ptr< MonsterStorage::Stub> MonsterStorage::NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& /*options*/) {\n  std::unique_ptr< MonsterStorage::Stub> stub(new MonsterStorage::Stub(channel));\n  return stub;\n}\n\nMonsterStorage::Stub::Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel)\n  : channel_(channel)  , rpcmethod_Store_(MonsterStorage_method_names[0], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)\n  , rpcmethod_Retrieve_(MonsterStorage_method_names[1], ::grpc::internal::RpcMethod::SERVER_STREAMING, channel)\n  , rpcmethod_GetMaxHitPoint_(MonsterStorage_method_names[2], ::grpc::internal::RpcMethod::CLIENT_STREAMING, channel)\n  , rpcmethod_GetMinMaxHitPoints_(MonsterStorage_method_names[3], ::grpc::internal::RpcMethod::BIDI_STREAMING, channel)\n  {}\n  \n::grpc::Status MonsterStorage::Stub::Store(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, flatbuffers::grpc::Message<Stat>* response) {\n  return ::grpc::internal::BlockingUnaryCall(channel_.get(), rpcmethod_Store_, context, request, response);\n}\n\n::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>* MonsterStorage::Stub::AsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {\n  return ::grpc::internal::ClientAsyncResponseReaderFactory< flatbuffers::grpc::Message<Stat>>::Create(channel_.get(), cq, rpcmethod_Store_, context, request, true);\n}\n\n::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>* MonsterStorage::Stub::PrepareAsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {\n  return ::grpc::internal::ClientAsyncResponseReaderFactory< flatbuffers::grpc::Message<Stat>>::Create(channel_.get(), cq, rpcmethod_Store_, context, request, false);\n}\n\n::grpc::ClientReader< flatbuffers::grpc::Message<Monster>>* MonsterStorage::Stub::RetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) {\n  return ::grpc::internal::ClientReaderFactory< flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), rpcmethod_Retrieve_, context, request);\n}\n\n::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>* MonsterStorage::Stub::AsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) {\n  return ::grpc::internal::ClientAsyncReaderFactory< flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), cq, rpcmethod_Retrieve_, context, request, true, tag);\n}\n\n::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>* MonsterStorage::Stub::PrepareAsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq) {\n  return ::grpc::internal::ClientAsyncReaderFactory< flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), cq, rpcmethod_Retrieve_, context, request, false, nullptr);\n}\n\n::grpc::ClientWriter< flatbuffers::grpc::Message<Monster>>* MonsterStorage::Stub::GetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response) {\n  return ::grpc::internal::ClientWriterFactory< flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), rpcmethod_GetMaxHitPoint_, context, response);\n}\n\n::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>* MonsterStorage::Stub::AsyncGetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq, void* tag) {\n  return ::grpc::internal::ClientAsyncWriterFactory< flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), cq, rpcmethod_GetMaxHitPoint_, context, response, true, tag);\n}\n\n::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>* MonsterStorage::Stub::PrepareAsyncGetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq) {\n  return ::grpc::internal::ClientAsyncWriterFactory< flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), cq, rpcmethod_GetMaxHitPoint_, context, response, false, nullptr);\n}\n\n::grpc::ClientReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* MonsterStorage::Stub::GetMinMaxHitPointsRaw(::grpc::ClientContext* context) {\n  return ::grpc::internal::ClientReaderWriterFactory< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>::Create(channel_.get(), rpcmethod_GetMinMaxHitPoints_, context);\n}\n\n::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* MonsterStorage::Stub::AsyncGetMinMaxHitPointsRaw(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq, void* tag) {\n  return ::grpc::internal::ClientAsyncReaderWriterFactory< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>::Create(channel_.get(), cq, rpcmethod_GetMinMaxHitPoints_, context, true, tag);\n}\n\n::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* MonsterStorage::Stub::PrepareAsyncGetMinMaxHitPointsRaw(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq) {\n  return ::grpc::internal::ClientAsyncReaderWriterFactory< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>::Create(channel_.get(), cq, rpcmethod_GetMinMaxHitPoints_, context, false, nullptr);\n}\n\nMonsterStorage::Service::Service() {\n  AddMethod(new ::grpc::internal::RpcServiceMethod(\n      MonsterStorage_method_names[0],\n      ::grpc::internal::RpcMethod::NORMAL_RPC,\n      new ::grpc::internal::RpcMethodHandler< MonsterStorage::Service, flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>(\n          std::mem_fn(&MonsterStorage::Service::Store), this)));\n  AddMethod(new ::grpc::internal::RpcServiceMethod(\n      MonsterStorage_method_names[1],\n      ::grpc::internal::RpcMethod::SERVER_STREAMING,\n      new ::grpc::internal::ServerStreamingHandler< MonsterStorage::Service, flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>(\n          std::mem_fn(&MonsterStorage::Service::Retrieve), this)));\n  AddMethod(new ::grpc::internal::RpcServiceMethod(\n      MonsterStorage_method_names[2],\n      ::grpc::internal::RpcMethod::CLIENT_STREAMING,\n      new ::grpc::internal::ClientStreamingHandler< MonsterStorage::Service, flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>(\n          std::mem_fn(&MonsterStorage::Service::GetMaxHitPoint), this)));\n  AddMethod(new ::grpc::internal::RpcServiceMethod(\n      MonsterStorage_method_names[3],\n      ::grpc::internal::RpcMethod::BIDI_STREAMING,\n      new ::grpc::internal::BidiStreamingHandler< MonsterStorage::Service, flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>(\n          std::mem_fn(&MonsterStorage::Service::GetMinMaxHitPoints), this)));\n}\n\nMonsterStorage::Service::~Service() {\n}\n\n::grpc::Status MonsterStorage::Service::Store(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Monster>* /*request*/, flatbuffers::grpc::Message<Stat>* /*response*/) {\n  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n}\n\n::grpc::Status MonsterStorage::Service::Retrieve(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Stat>* /*request*/, ::grpc::ServerWriter< flatbuffers::grpc::Message<Monster>>* /*writer*/) {\n  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n}\n\n::grpc::Status MonsterStorage::Service::GetMaxHitPoint(::grpc::ServerContext* /*context*/, ::grpc::ServerReader< flatbuffers::grpc::Message<Monster>>* /*reader*/, flatbuffers::grpc::Message<Stat>* /*response*/) {\n  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n}\n\n::grpc::Status MonsterStorage::Service::GetMinMaxHitPoints(::grpc::ServerContext* /*context*/, ::grpc::ServerReaderWriter< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>* /*stream*/) {\n  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n}\n\n\n}  // namespace MyGame\n}  // namespace Example\n\n"
  },
  {
    "path": "tests/monster_test_suffix/monster_test.grpc.fb.h",
    "content": "// Generated by the gRPC C++ plugin.\n// If you make any local change, they will be lost.\n// source: monster_test\n#ifndef GRPC_monster_5ftest__INCLUDED\n#define GRPC_monster_5ftest__INCLUDED\n\n#include \"monster_test_suffix.hpp\"\n#include \"flatbuffers/grpc.h\"\n\n#include <grpcpp/impl/codegen/async_stream.h>\n#include <grpcpp/impl/codegen/async_unary_call.h>\n#include <grpcpp/impl/codegen/method_handler.h>\n#include <grpcpp/impl/codegen/proto_utils.h>\n#include <grpcpp/impl/codegen/rpc_method.h>\n#include <grpcpp/impl/codegen/service_type.h>\n#include <grpcpp/impl/codegen/status.h>\n#include <grpcpp/impl/codegen/stub_options.h>\n#include <grpcpp/impl/codegen/sync_stream.h>\n\nnamespace grpc {\nclass CompletionQueue;\nclass Channel;\nclass ServerCompletionQueue;\nclass ServerContext;\n}  // namespace grpc\n\nnamespace MyGame {\nnamespace Example {\n\nclass MonsterStorage final {\n public:\n  static constexpr char const* service_full_name() {\n    return \"MyGame.Example.MonsterStorage\";\n  }\n  class StubInterface {\n   public:\n    virtual ~StubInterface() {}\n    virtual ::grpc::Status Store(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, flatbuffers::grpc::Message<Stat>* response) = 0;\n    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>> AsyncStore(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>>(AsyncStoreRaw(context, request, cq));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>> PrepareAsyncStore(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>>(PrepareAsyncStoreRaw(context, request, cq));\n    }\n    std::unique_ptr< ::grpc::ClientReaderInterface< flatbuffers::grpc::Message<Monster>>> Retrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) {\n      return std::unique_ptr< ::grpc::ClientReaderInterface< flatbuffers::grpc::Message<Monster>>>(RetrieveRaw(context, request));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>> AsyncRetrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr< ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>>(AsyncRetrieveRaw(context, request, cq, tag));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>> PrepareAsyncRetrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>>(PrepareAsyncRetrieveRaw(context, request, cq));\n    }\n    std::unique_ptr< ::grpc::ClientWriterInterface< flatbuffers::grpc::Message<Monster>>> GetMaxHitPoint(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response) {\n      return std::unique_ptr< ::grpc::ClientWriterInterface< flatbuffers::grpc::Message<Monster>>>(GetMaxHitPointRaw(context, response));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncWriterInterface< flatbuffers::grpc::Message<Monster>>> AsyncGetMaxHitPoint(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr< ::grpc::ClientAsyncWriterInterface< flatbuffers::grpc::Message<Monster>>>(AsyncGetMaxHitPointRaw(context, response, cq, tag));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncWriterInterface< flatbuffers::grpc::Message<Monster>>> PrepareAsyncGetMaxHitPoint(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncWriterInterface< flatbuffers::grpc::Message<Monster>>>(PrepareAsyncGetMaxHitPointRaw(context, response, cq));\n    }\n    std::unique_ptr< ::grpc::ClientReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>> GetMinMaxHitPoints(::grpc::ClientContext* context) {\n      return std::unique_ptr< ::grpc::ClientReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>(GetMinMaxHitPointsRaw(context));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>> AsyncGetMinMaxHitPoints(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr< ::grpc::ClientAsyncReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>(AsyncGetMinMaxHitPointsRaw(context, cq, tag));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>> PrepareAsyncGetMinMaxHitPoints(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>(PrepareAsyncGetMinMaxHitPointsRaw(context, cq));\n    }\n  private:\n    virtual ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>* AsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) = 0;\n    virtual ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>* PrepareAsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) = 0;\n    virtual ::grpc::ClientReaderInterface< flatbuffers::grpc::Message<Monster>>* RetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) = 0;\n    virtual ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>* AsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) = 0;\n    virtual ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>* PrepareAsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq) = 0;\n    virtual ::grpc::ClientWriterInterface< flatbuffers::grpc::Message<Monster>>* GetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response) = 0;\n    virtual ::grpc::ClientAsyncWriterInterface< flatbuffers::grpc::Message<Monster>>* AsyncGetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq, void* tag) = 0;\n    virtual ::grpc::ClientAsyncWriterInterface< flatbuffers::grpc::Message<Monster>>* PrepareAsyncGetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq) = 0;\n    virtual ::grpc::ClientReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* GetMinMaxHitPointsRaw(::grpc::ClientContext* context) = 0;\n    virtual ::grpc::ClientAsyncReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* AsyncGetMinMaxHitPointsRaw(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq, void* tag) = 0;\n    virtual ::grpc::ClientAsyncReaderWriterInterface< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* PrepareAsyncGetMinMaxHitPointsRaw(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq) = 0;\n  };\n  class Stub final : public StubInterface {\n   public:\n    Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel);\n    ::grpc::Status Store(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, flatbuffers::grpc::Message<Stat>* response) override;\n    std::unique_ptr< ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>> AsyncStore(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>>(AsyncStoreRaw(context, request, cq));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>> PrepareAsyncStore(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>>(PrepareAsyncStoreRaw(context, request, cq));\n    }\n    std::unique_ptr< ::grpc::ClientReader< flatbuffers::grpc::Message<Monster>>> Retrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) {\n      return std::unique_ptr< ::grpc::ClientReader< flatbuffers::grpc::Message<Monster>>>(RetrieveRaw(context, request));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>> AsyncRetrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr< ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>>(AsyncRetrieveRaw(context, request, cq, tag));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>> PrepareAsyncRetrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>>(PrepareAsyncRetrieveRaw(context, request, cq));\n    }\n    std::unique_ptr< ::grpc::ClientWriter< flatbuffers::grpc::Message<Monster>>> GetMaxHitPoint(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response) {\n      return std::unique_ptr< ::grpc::ClientWriter< flatbuffers::grpc::Message<Monster>>>(GetMaxHitPointRaw(context, response));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>> AsyncGetMaxHitPoint(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr< ::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>>(AsyncGetMaxHitPointRaw(context, response, cq, tag));\n    }\n    std::unique_ptr< ::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>> PrepareAsyncGetMaxHitPoint(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>>(PrepareAsyncGetMaxHitPointRaw(context, response, cq));\n    }\n    std::unique_ptr< ::grpc::ClientReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>> GetMinMaxHitPoints(::grpc::ClientContext* context) {\n      return std::unique_ptr< ::grpc::ClientReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>(GetMinMaxHitPointsRaw(context));\n    }\n    std::unique_ptr<  ::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>> AsyncGetMinMaxHitPoints(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq, void* tag) {\n      return std::unique_ptr< ::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>(AsyncGetMinMaxHitPointsRaw(context, cq, tag));\n    }\n    std::unique_ptr<  ::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>> PrepareAsyncGetMinMaxHitPoints(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>>(PrepareAsyncGetMinMaxHitPointsRaw(context, cq));\n    }\n  \n   private:\n    std::shared_ptr< ::grpc::ChannelInterface> channel_;\n    ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>* AsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) override;\n    ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>* PrepareAsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) override;\n    ::grpc::ClientReader< flatbuffers::grpc::Message<Monster>>* RetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) override;\n    ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>* AsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) override;\n    ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>* PrepareAsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq) override;\n    ::grpc::ClientWriter< flatbuffers::grpc::Message<Monster>>* GetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response) override;\n    ::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>* AsyncGetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq, void* tag) override;\n    ::grpc::ClientAsyncWriter< flatbuffers::grpc::Message<Monster>>* PrepareAsyncGetMaxHitPointRaw(::grpc::ClientContext* context, flatbuffers::grpc::Message<Stat>* response, ::grpc::CompletionQueue* cq) override;\n    ::grpc::ClientReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* GetMinMaxHitPointsRaw(::grpc::ClientContext* context) override;\n    ::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* AsyncGetMinMaxHitPointsRaw(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq, void* tag) override;\n    ::grpc::ClientAsyncReaderWriter< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>* PrepareAsyncGetMinMaxHitPointsRaw(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq) override;\n    const ::grpc::internal::RpcMethod rpcmethod_Store_;\n    const ::grpc::internal::RpcMethod rpcmethod_Retrieve_;\n    const ::grpc::internal::RpcMethod rpcmethod_GetMaxHitPoint_;\n    const ::grpc::internal::RpcMethod rpcmethod_GetMinMaxHitPoints_;\n  };\n  static std::unique_ptr<Stub> NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options = ::grpc::StubOptions());\n  \n  class Service : public ::grpc::Service {\n   public:\n    Service();\n    virtual ~Service();\n    virtual ::grpc::Status Store(::grpc::ServerContext* context, const flatbuffers::grpc::Message<Monster>* request, flatbuffers::grpc::Message<Stat>* response);\n    virtual ::grpc::Status Retrieve(::grpc::ServerContext* context, const flatbuffers::grpc::Message<Stat>* request, ::grpc::ServerWriter< flatbuffers::grpc::Message<Monster>>* writer);\n    virtual ::grpc::Status GetMaxHitPoint(::grpc::ServerContext* context, ::grpc::ServerReader< flatbuffers::grpc::Message<Monster>>* reader, flatbuffers::grpc::Message<Stat>* response);\n    virtual ::grpc::Status GetMinMaxHitPoints(::grpc::ServerContext* context, ::grpc::ServerReaderWriter< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>* stream);\n  };\n  template <class BaseClass>\n  class WithAsyncMethod_Store : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithAsyncMethod_Store() {\n      ::grpc::Service::MarkMethodAsync(0);\n    }\n    ~WithAsyncMethod_Store() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status Store(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Monster>* /*request*/, flatbuffers::grpc::Message<Stat>* /*response*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    void RequestStore(::grpc::ServerContext* context, flatbuffers::grpc::Message<Monster>* request, ::grpc::ServerAsyncResponseWriter< flatbuffers::grpc::Message<Stat>>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n      ::grpc::Service::RequestAsyncUnary(0, context, request, response, new_call_cq, notification_cq, tag);\n    }\n  };\n  template <class BaseClass>\n  class WithAsyncMethod_Retrieve : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithAsyncMethod_Retrieve() {\n      ::grpc::Service::MarkMethodAsync(1);\n    }\n    ~WithAsyncMethod_Retrieve() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status Retrieve(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Stat>* /*request*/, ::grpc::ServerWriter< flatbuffers::grpc::Message<Monster>>* /*writer*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    void RequestRetrieve(::grpc::ServerContext* context, flatbuffers::grpc::Message<Stat>* request, ::grpc::ServerAsyncWriter< flatbuffers::grpc::Message<Monster>>* writer, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n      ::grpc::Service::RequestAsyncServerStreaming(1, context, request, writer, new_call_cq, notification_cq, tag);\n    }\n  };\n  template <class BaseClass>\n  class WithAsyncMethod_GetMaxHitPoint : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithAsyncMethod_GetMaxHitPoint() {\n      ::grpc::Service::MarkMethodAsync(2);\n    }\n    ~WithAsyncMethod_GetMaxHitPoint() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status GetMaxHitPoint(::grpc::ServerContext* /*context*/, ::grpc::ServerReader< flatbuffers::grpc::Message<Monster>>* /*reader*/, flatbuffers::grpc::Message<Stat>* /*response*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    void RequestGetMaxHitPoint(::grpc::ServerContext* context, ::grpc::ServerAsyncReader< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>* reader, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n      ::grpc::Service::RequestAsyncClientStreaming(2, context, reader, new_call_cq, notification_cq, tag);\n    }\n  };\n  template <class BaseClass>\n  class WithAsyncMethod_GetMinMaxHitPoints : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithAsyncMethod_GetMinMaxHitPoints() {\n      ::grpc::Service::MarkMethodAsync(3);\n    }\n    ~WithAsyncMethod_GetMinMaxHitPoints() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status GetMinMaxHitPoints(::grpc::ServerContext* /*context*/, ::grpc::ServerReaderWriter< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>* /*stream*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    void RequestGetMinMaxHitPoints(::grpc::ServerContext* context, ::grpc::ServerAsyncReaderWriter< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>* stream, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n      ::grpc::Service::RequestAsyncBidiStreaming(3, context, stream, new_call_cq, notification_cq, tag);\n    }\n  };\n  typedef   WithAsyncMethod_Store<  WithAsyncMethod_Retrieve<  WithAsyncMethod_GetMaxHitPoint<  WithAsyncMethod_GetMinMaxHitPoints<  Service   >   >   >   >   AsyncService;\n  template <class BaseClass>\n  class WithGenericMethod_Store : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithGenericMethod_Store() {\n      ::grpc::Service::MarkMethodGeneric(0);\n    }\n    ~WithGenericMethod_Store() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status Store(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Monster>* /*request*/, flatbuffers::grpc::Message<Stat>* /*response*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n  };\n  template <class BaseClass>\n  class WithGenericMethod_Retrieve : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithGenericMethod_Retrieve() {\n      ::grpc::Service::MarkMethodGeneric(1);\n    }\n    ~WithGenericMethod_Retrieve() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status Retrieve(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Stat>* /*request*/, ::grpc::ServerWriter< flatbuffers::grpc::Message<Monster>>* /*writer*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n  };\n  template <class BaseClass>\n  class WithGenericMethod_GetMaxHitPoint : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithGenericMethod_GetMaxHitPoint() {\n      ::grpc::Service::MarkMethodGeneric(2);\n    }\n    ~WithGenericMethod_GetMaxHitPoint() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status GetMaxHitPoint(::grpc::ServerContext* /*context*/, ::grpc::ServerReader< flatbuffers::grpc::Message<Monster>>* /*reader*/, flatbuffers::grpc::Message<Stat>* /*response*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n  };\n  template <class BaseClass>\n  class WithGenericMethod_GetMinMaxHitPoints : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithGenericMethod_GetMinMaxHitPoints() {\n      ::grpc::Service::MarkMethodGeneric(3);\n    }\n    ~WithGenericMethod_GetMinMaxHitPoints() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status GetMinMaxHitPoints(::grpc::ServerContext* /*context*/, ::grpc::ServerReaderWriter< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>* /*stream*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n  };\n  template <class BaseClass>\n  class WithStreamedUnaryMethod_Store : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) {}\n   public:\n    WithStreamedUnaryMethod_Store() {\n      ::grpc::Service::MarkMethodStreamed(0,\n        new ::grpc::internal::StreamedUnaryHandler< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>(std::bind(&WithStreamedUnaryMethod_Store<BaseClass>::StreamedStore, this, std::placeholders::_1, std::placeholders::_2)));\n    }\n    ~WithStreamedUnaryMethod_Store() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable regular version of this method\n    ::grpc::Status Store(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Monster>* /*request*/, flatbuffers::grpc::Message<Stat>* /*response*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    // replace default version of method with streamed unary\n    virtual ::grpc::Status StreamedStore(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< flatbuffers::grpc::Message<Monster>,flatbuffers::grpc::Message<Stat>>* server_unary_streamer) = 0;\n  };\n  typedef   WithStreamedUnaryMethod_Store<  Service   >   StreamedUnaryService;\n  template <class BaseClass>\n  class WithSplitStreamingMethod_Retrieve : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service */*service*/) { }\n   public:\n    WithSplitStreamingMethod_Retrieve() {\n      ::grpc::Service::MarkMethodStreamed(1,\n        new ::grpc::internal::SplitServerStreamingHandler< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>(std::bind(&WithSplitStreamingMethod_Retrieve<BaseClass>::StreamedRetrieve, this, std::placeholders::_1, std::placeholders::_2)));\n    }\n    ~WithSplitStreamingMethod_Retrieve() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable regular version of this method\n    ::grpc::Status Retrieve(::grpc::ServerContext* /*context*/, const flatbuffers::grpc::Message<Stat>* /*request*/, ::grpc::ServerWriter< flatbuffers::grpc::Message<Monster>>* /*writer*/) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    // replace default version of method with split streamed\n    virtual ::grpc::Status StreamedRetrieve(::grpc::ServerContext* context, ::grpc::ServerSplitStreamer< flatbuffers::grpc::Message<Stat>,flatbuffers::grpc::Message<Monster>>* server_split_streamer) = 0;\n  };\n  typedef   WithSplitStreamingMethod_Retrieve<  Service   >   SplitStreamedService;\n  typedef   WithStreamedUnaryMethod_Store<  WithSplitStreamingMethod_Retrieve<  Service   >   >   StreamedService;\n};\n\n}  // namespace Example\n}  // namespace MyGame\n\n\n#endif  // GRPC_monster_5ftest__INCLUDED\n"
  },
  {
    "path": "tests/monster_test_suffix/monster_test_suffix.hpp",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n\n#ifndef FLATBUFFERS_GENERATED_MONSTERTEST_MYGAME_EXAMPLE_H_\n#define FLATBUFFERS_GENERATED_MONSTERTEST_MYGAME_EXAMPLE_H_\n\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/flexbuffers.h\"\n#include \"flatbuffers/flex_flat_util.h\"\n\n// Ensure the included flatbuffers.h is the same version as when this file was\n// generated, otherwise it may not be compatible.\nstatic_assert(FLATBUFFERS_VERSION_MAJOR == 25 &&\n              FLATBUFFERS_VERSION_MINOR == 12 &&\n              FLATBUFFERS_VERSION_REVISION == 19,\n             \"Non-compatible flatbuffers version included\");\n\nnamespace MyGame {\n\nstruct InParentNamespace;\nstruct InParentNamespaceBuilder;\nstruct InParentNamespaceT;\n\nnamespace Example2 {\n\nstruct Monster;\nstruct MonsterBuilder;\nstruct MonsterT;\n\n}  // namespace Example2\n\nnamespace Example {\n\nstruct Test;\n\nstruct TestSimpleTableWithEnum;\nstruct TestSimpleTableWithEnumBuilder;\nstruct TestSimpleTableWithEnumT;\n\nstruct Vec3;\n\nstruct Ability;\n\nstruct StructOfStructs;\n\nstruct StructOfStructsOfStructs;\n\nstruct Stat;\nstruct StatBuilder;\nstruct StatT;\n\nstruct Referrable;\nstruct ReferrableBuilder;\nstruct ReferrableT;\n\nstruct Monster;\nstruct MonsterBuilder;\nstruct MonsterT;\n\nstruct TypeAliases;\nstruct TypeAliasesBuilder;\nstruct TypeAliasesT;\n\n}  // namespace Example\n\nbool operator==(const InParentNamespaceT &lhs, const InParentNamespaceT &rhs);\nbool operator!=(const InParentNamespaceT &lhs, const InParentNamespaceT &rhs);\nnamespace Example2 {\n\nbool operator==(const MonsterT &lhs, const MonsterT &rhs);\nbool operator!=(const MonsterT &lhs, const MonsterT &rhs);\n}  // namespace Example2\n\nnamespace Example {\n\nbool operator==(const Test &lhs, const Test &rhs);\nbool operator!=(const Test &lhs, const Test &rhs);\nbool operator==(const TestSimpleTableWithEnumT &lhs, const TestSimpleTableWithEnumT &rhs);\nbool operator!=(const TestSimpleTableWithEnumT &lhs, const TestSimpleTableWithEnumT &rhs);\nbool operator==(const Vec3 &lhs, const Vec3 &rhs);\nbool operator!=(const Vec3 &lhs, const Vec3 &rhs);\nbool operator==(const Ability &lhs, const Ability &rhs);\nbool operator!=(const Ability &lhs, const Ability &rhs);\nbool operator==(const StructOfStructs &lhs, const StructOfStructs &rhs);\nbool operator!=(const StructOfStructs &lhs, const StructOfStructs &rhs);\nbool operator==(const StructOfStructsOfStructs &lhs, const StructOfStructsOfStructs &rhs);\nbool operator!=(const StructOfStructsOfStructs &lhs, const StructOfStructsOfStructs &rhs);\nbool operator==(const StatT &lhs, const StatT &rhs);\nbool operator!=(const StatT &lhs, const StatT &rhs);\nbool operator==(const ReferrableT &lhs, const ReferrableT &rhs);\nbool operator!=(const ReferrableT &lhs, const ReferrableT &rhs);\nbool operator==(const MonsterT &lhs, const MonsterT &rhs);\nbool operator!=(const MonsterT &lhs, const MonsterT &rhs);\nbool operator==(const TypeAliasesT &lhs, const TypeAliasesT &rhs);\nbool operator!=(const TypeAliasesT &lhs, const TypeAliasesT &rhs);\n\n}  // namespace Example\n\ninline const ::flatbuffers::TypeTable *InParentNamespaceTypeTable();\n\nnamespace Example2 {\n\ninline const ::flatbuffers::TypeTable *MonsterTypeTable();\n\n}  // namespace Example2\n\nnamespace Example {\n\ninline const ::flatbuffers::TypeTable *TestTypeTable();\n\ninline const ::flatbuffers::TypeTable *TestSimpleTableWithEnumTypeTable();\n\ninline const ::flatbuffers::TypeTable *Vec3TypeTable();\n\ninline const ::flatbuffers::TypeTable *AbilityTypeTable();\n\ninline const ::flatbuffers::TypeTable *StructOfStructsTypeTable();\n\ninline const ::flatbuffers::TypeTable *StructOfStructsOfStructsTypeTable();\n\ninline const ::flatbuffers::TypeTable *StatTypeTable();\n\ninline const ::flatbuffers::TypeTable *ReferrableTypeTable();\n\ninline const ::flatbuffers::TypeTable *MonsterTypeTable();\n\ninline const ::flatbuffers::TypeTable *TypeAliasesTypeTable();\n\n/// Composite components of Monster color.\nenum Color : uint8_t {\n  Color_Red = 1,\n  /// \\brief color Green\n  /// Green is bit_flag with value (1u << 1)\n  Color_Green = 2,\n  /// \\brief color Blue (1u << 3)\n  Color_Blue = 8,\n  Color_NONE = 0,\n  Color_ANY = 11\n};\n\ninline const Color (&EnumValuesColor())[3] {\n  static const Color values[] = {\n    Color_Red,\n    Color_Green,\n    Color_Blue\n  };\n  return values;\n}\n\ninline const char * const *EnumNamesColor() {\n  static const char * const names[9] = {\n    \"Red\",\n    \"Green\",\n    \"\",\n    \"\",\n    \"\",\n    \"\",\n    \"\",\n    \"Blue\",\n    nullptr\n  };\n  return names;\n}\n\ninline const char *EnumNameColor(Color e) {\n  if (::flatbuffers::IsOutRange(e, Color_Red, Color_Blue)) return \"\";\n  const size_t index = static_cast<size_t>(e) - static_cast<size_t>(Color_Red);\n  return EnumNamesColor()[index];\n}\n\nenum Race : int8_t {\n  Race_None = -1,\n  Race_Human = 0,\n  Race_Dwarf = 1,\n  Race_Elf = 2,\n  Race_MIN = Race_None,\n  Race_MAX = Race_Elf\n};\n\ninline const Race (&EnumValuesRace())[4] {\n  static const Race values[] = {\n    Race_None,\n    Race_Human,\n    Race_Dwarf,\n    Race_Elf\n  };\n  return values;\n}\n\ninline const char * const *EnumNamesRace() {\n  static const char * const names[5] = {\n    \"None\",\n    \"Human\",\n    \"Dwarf\",\n    \"Elf\",\n    nullptr\n  };\n  return names;\n}\n\ninline const char *EnumNameRace(Race e) {\n  if (::flatbuffers::IsOutRange(e, Race_None, Race_Elf)) return \"\";\n  const size_t index = static_cast<size_t>(e) - static_cast<size_t>(Race_None);\n  return EnumNamesRace()[index];\n}\n\nenum LongEnum : uint64_t {\n  LongEnum_LongOne = 2ULL,\n  LongEnum_LongTwo = 4ULL,\n  LongEnum_LongBig = 1099511627776ULL,\n  LongEnum_NONE = 0,\n  LongEnum_ANY = 1099511627782ULL\n};\n\ninline const LongEnum (&EnumValuesLongEnum())[3] {\n  static const LongEnum values[] = {\n    LongEnum_LongOne,\n    LongEnum_LongTwo,\n    LongEnum_LongBig\n  };\n  return values;\n}\n\ninline const char *EnumNameLongEnum(LongEnum e) {\n  switch (e) {\n    case LongEnum_LongOne: return \"LongOne\";\n    case LongEnum_LongTwo: return \"LongTwo\";\n    case LongEnum_LongBig: return \"LongBig\";\n    default: return \"\";\n  }\n}\n\nenum Any : uint8_t {\n  Any_NONE = 0,\n  Any_Monster = 1,\n  Any_TestSimpleTableWithEnum = 2,\n  Any_MyGame_Example2_Monster = 3,\n  Any_MIN = Any_NONE,\n  Any_MAX = Any_MyGame_Example2_Monster\n};\n\ninline const Any (&EnumValuesAny())[4] {\n  static const Any values[] = {\n    Any_NONE,\n    Any_Monster,\n    Any_TestSimpleTableWithEnum,\n    Any_MyGame_Example2_Monster\n  };\n  return values;\n}\n\ninline const char * const *EnumNamesAny() {\n  static const char * const names[5] = {\n    \"NONE\",\n    \"Monster\",\n    \"TestSimpleTableWithEnum\",\n    \"MyGame_Example2_Monster\",\n    nullptr\n  };\n  return names;\n}\n\ninline const char *EnumNameAny(Any e) {\n  if (::flatbuffers::IsOutRange(e, Any_NONE, Any_MyGame_Example2_Monster)) return \"\";\n  const size_t index = static_cast<size_t>(e);\n  return EnumNamesAny()[index];\n}\n\ntemplate<typename T> struct AnyTraits {\n  static const Any enum_value = Any_NONE;\n};\n\ntemplate<> struct AnyTraits<MyGame::Example::Monster> {\n  static const Any enum_value = Any_Monster;\n};\n\ntemplate<> struct AnyTraits<MyGame::Example::TestSimpleTableWithEnum> {\n  static const Any enum_value = Any_TestSimpleTableWithEnum;\n};\n\ntemplate<> struct AnyTraits<MyGame::Example2::Monster> {\n  static const Any enum_value = Any_MyGame_Example2_Monster;\n};\n\ntemplate<typename T> struct AnyUnionTraits {\n  static const Any enum_value = Any_NONE;\n};\n\ntemplate<> struct AnyUnionTraits<MyGame::Example::MonsterT> {\n  static const Any enum_value = Any_Monster;\n};\n\ntemplate<> struct AnyUnionTraits<MyGame::Example::TestSimpleTableWithEnumT> {\n  static const Any enum_value = Any_TestSimpleTableWithEnum;\n};\n\ntemplate<> struct AnyUnionTraits<MyGame::Example2::MonsterT> {\n  static const Any enum_value = Any_MyGame_Example2_Monster;\n};\n\nstruct AnyUnion {\n  Any type;\n  void *value;\n\n  AnyUnion() : type(Any_NONE), value(nullptr) {}\n  AnyUnion(AnyUnion&& u) FLATBUFFERS_NOEXCEPT :\n    type(Any_NONE), value(nullptr)\n    { std::swap(type, u.type); std::swap(value, u.value); }\n  AnyUnion(const AnyUnion &);\n  AnyUnion &operator=(const AnyUnion &u)\n    { AnyUnion t(u); std::swap(type, t.type); std::swap(value, t.value); return *this; }\n  AnyUnion &operator=(AnyUnion &&u) FLATBUFFERS_NOEXCEPT\n    { std::swap(type, u.type); std::swap(value, u.value); return *this; }\n  ~AnyUnion() { Reset(); }\n\n  void Reset();\n\n  template <typename T>\n  void Set(T&& val) {\n    typedef typename std::remove_reference<T>::type RT;\n    Reset();\n    type = AnyUnionTraits<RT>::enum_value;\n    if (type != Any_NONE) {\n      value = new RT(std::forward<T>(val));\n    }\n  }\n\n  static void *UnPack(const void *obj, Any type, const ::flatbuffers::resolver_function_t *resolver);\n  ::flatbuffers::Offset<void> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr) const;\n\n  MyGame::Example::MonsterT *AsMonster() {\n    return type == Any_Monster ?\n      reinterpret_cast<MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n  const MyGame::Example::MonsterT *AsMonster() const {\n    return type == Any_Monster ?\n      reinterpret_cast<const MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n  MyGame::Example::TestSimpleTableWithEnumT *AsTestSimpleTableWithEnum() {\n    return type == Any_TestSimpleTableWithEnum ?\n      reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(value) : nullptr;\n  }\n  const MyGame::Example::TestSimpleTableWithEnumT *AsTestSimpleTableWithEnum() const {\n    return type == Any_TestSimpleTableWithEnum ?\n      reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(value) : nullptr;\n  }\n  MyGame::Example2::MonsterT *AsMyGame_Example2_Monster() {\n    return type == Any_MyGame_Example2_Monster ?\n      reinterpret_cast<MyGame::Example2::MonsterT *>(value) : nullptr;\n  }\n  const MyGame::Example2::MonsterT *AsMyGame_Example2_Monster() const {\n    return type == Any_MyGame_Example2_Monster ?\n      reinterpret_cast<const MyGame::Example2::MonsterT *>(value) : nullptr;\n  }\n};\n\n\ninline bool operator==(const AnyUnion &lhs, const AnyUnion &rhs) {\n  if (lhs.type != rhs.type) return false;\n  switch (lhs.type) {\n    case Any_NONE: {\n      return true;\n    }\n    case Any_Monster: {\n      return *(reinterpret_cast<const MyGame::Example::MonsterT *>(lhs.value)) ==\n             *(reinterpret_cast<const MyGame::Example::MonsterT *>(rhs.value));\n    }\n    case Any_TestSimpleTableWithEnum: {\n      return *(reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(lhs.value)) ==\n             *(reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(rhs.value));\n    }\n    case Any_MyGame_Example2_Monster: {\n      return *(reinterpret_cast<const MyGame::Example2::MonsterT *>(lhs.value)) ==\n             *(reinterpret_cast<const MyGame::Example2::MonsterT *>(rhs.value));\n    }\n    default: {\n      return false;\n    }\n  }\n}\n\ninline bool operator!=(const AnyUnion &lhs, const AnyUnion &rhs) {\n    return !(lhs == rhs);\n}\n\ntemplate <bool B = false>\nbool VerifyAny(::flatbuffers::VerifierTemplate<B> &verifier, const void *obj, Any type);\ntemplate <bool B = false>\nbool VerifyAnyVector(::flatbuffers::VerifierTemplate<B> &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types);\n\nenum AnyUniqueAliases : uint8_t {\n  AnyUniqueAliases_NONE = 0,\n  AnyUniqueAliases_M = 1,\n  AnyUniqueAliases_TS = 2,\n  AnyUniqueAliases_M2 = 3,\n  AnyUniqueAliases_MIN = AnyUniqueAliases_NONE,\n  AnyUniqueAliases_MAX = AnyUniqueAliases_M2\n};\n\ninline const AnyUniqueAliases (&EnumValuesAnyUniqueAliases())[4] {\n  static const AnyUniqueAliases values[] = {\n    AnyUniqueAliases_NONE,\n    AnyUniqueAliases_M,\n    AnyUniqueAliases_TS,\n    AnyUniqueAliases_M2\n  };\n  return values;\n}\n\ninline const char * const *EnumNamesAnyUniqueAliases() {\n  static const char * const names[5] = {\n    \"NONE\",\n    \"M\",\n    \"TS\",\n    \"M2\",\n    nullptr\n  };\n  return names;\n}\n\ninline const char *EnumNameAnyUniqueAliases(AnyUniqueAliases e) {\n  if (::flatbuffers::IsOutRange(e, AnyUniqueAliases_NONE, AnyUniqueAliases_M2)) return \"\";\n  const size_t index = static_cast<size_t>(e);\n  return EnumNamesAnyUniqueAliases()[index];\n}\n\ntemplate<typename T> struct AnyUniqueAliasesTraits {\n  static const AnyUniqueAliases enum_value = AnyUniqueAliases_NONE;\n};\n\ntemplate<> struct AnyUniqueAliasesTraits<MyGame::Example::Monster> {\n  static const AnyUniqueAliases enum_value = AnyUniqueAliases_M;\n};\n\ntemplate<> struct AnyUniqueAliasesTraits<MyGame::Example::TestSimpleTableWithEnum> {\n  static const AnyUniqueAliases enum_value = AnyUniqueAliases_TS;\n};\n\ntemplate<> struct AnyUniqueAliasesTraits<MyGame::Example2::Monster> {\n  static const AnyUniqueAliases enum_value = AnyUniqueAliases_M2;\n};\n\ntemplate<typename T> struct AnyUniqueAliasesUnionTraits {\n  static const AnyUniqueAliases enum_value = AnyUniqueAliases_NONE;\n};\n\ntemplate<> struct AnyUniqueAliasesUnionTraits<MyGame::Example::MonsterT> {\n  static const AnyUniqueAliases enum_value = AnyUniqueAliases_M;\n};\n\ntemplate<> struct AnyUniqueAliasesUnionTraits<MyGame::Example::TestSimpleTableWithEnumT> {\n  static const AnyUniqueAliases enum_value = AnyUniqueAliases_TS;\n};\n\ntemplate<> struct AnyUniqueAliasesUnionTraits<MyGame::Example2::MonsterT> {\n  static const AnyUniqueAliases enum_value = AnyUniqueAliases_M2;\n};\n\nstruct AnyUniqueAliasesUnion {\n  AnyUniqueAliases type;\n  void *value;\n\n  AnyUniqueAliasesUnion() : type(AnyUniqueAliases_NONE), value(nullptr) {}\n  AnyUniqueAliasesUnion(AnyUniqueAliasesUnion&& u) FLATBUFFERS_NOEXCEPT :\n    type(AnyUniqueAliases_NONE), value(nullptr)\n    { std::swap(type, u.type); std::swap(value, u.value); }\n  AnyUniqueAliasesUnion(const AnyUniqueAliasesUnion &);\n  AnyUniqueAliasesUnion &operator=(const AnyUniqueAliasesUnion &u)\n    { AnyUniqueAliasesUnion t(u); std::swap(type, t.type); std::swap(value, t.value); return *this; }\n  AnyUniqueAliasesUnion &operator=(AnyUniqueAliasesUnion &&u) FLATBUFFERS_NOEXCEPT\n    { std::swap(type, u.type); std::swap(value, u.value); return *this; }\n  ~AnyUniqueAliasesUnion() { Reset(); }\n\n  void Reset();\n\n  template <typename T>\n  void Set(T&& val) {\n    typedef typename std::remove_reference<T>::type RT;\n    Reset();\n    type = AnyUniqueAliasesUnionTraits<RT>::enum_value;\n    if (type != AnyUniqueAliases_NONE) {\n      value = new RT(std::forward<T>(val));\n    }\n  }\n\n  static void *UnPack(const void *obj, AnyUniqueAliases type, const ::flatbuffers::resolver_function_t *resolver);\n  ::flatbuffers::Offset<void> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr) const;\n\n  MyGame::Example::MonsterT *AsM() {\n    return type == AnyUniqueAliases_M ?\n      reinterpret_cast<MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n  const MyGame::Example::MonsterT *AsM() const {\n    return type == AnyUniqueAliases_M ?\n      reinterpret_cast<const MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n  MyGame::Example::TestSimpleTableWithEnumT *AsTS() {\n    return type == AnyUniqueAliases_TS ?\n      reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(value) : nullptr;\n  }\n  const MyGame::Example::TestSimpleTableWithEnumT *AsTS() const {\n    return type == AnyUniqueAliases_TS ?\n      reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(value) : nullptr;\n  }\n  MyGame::Example2::MonsterT *AsM2() {\n    return type == AnyUniqueAliases_M2 ?\n      reinterpret_cast<MyGame::Example2::MonsterT *>(value) : nullptr;\n  }\n  const MyGame::Example2::MonsterT *AsM2() const {\n    return type == AnyUniqueAliases_M2 ?\n      reinterpret_cast<const MyGame::Example2::MonsterT *>(value) : nullptr;\n  }\n};\n\n\ninline bool operator==(const AnyUniqueAliasesUnion &lhs, const AnyUniqueAliasesUnion &rhs) {\n  if (lhs.type != rhs.type) return false;\n  switch (lhs.type) {\n    case AnyUniqueAliases_NONE: {\n      return true;\n    }\n    case AnyUniqueAliases_M: {\n      return *(reinterpret_cast<const MyGame::Example::MonsterT *>(lhs.value)) ==\n             *(reinterpret_cast<const MyGame::Example::MonsterT *>(rhs.value));\n    }\n    case AnyUniqueAliases_TS: {\n      return *(reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(lhs.value)) ==\n             *(reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(rhs.value));\n    }\n    case AnyUniqueAliases_M2: {\n      return *(reinterpret_cast<const MyGame::Example2::MonsterT *>(lhs.value)) ==\n             *(reinterpret_cast<const MyGame::Example2::MonsterT *>(rhs.value));\n    }\n    default: {\n      return false;\n    }\n  }\n}\n\ninline bool operator!=(const AnyUniqueAliasesUnion &lhs, const AnyUniqueAliasesUnion &rhs) {\n    return !(lhs == rhs);\n}\n\ntemplate <bool B = false>\nbool VerifyAnyUniqueAliases(::flatbuffers::VerifierTemplate<B> &verifier, const void *obj, AnyUniqueAliases type);\ntemplate <bool B = false>\nbool VerifyAnyUniqueAliasesVector(::flatbuffers::VerifierTemplate<B> &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types);\n\nenum AnyAmbiguousAliases : uint8_t {\n  AnyAmbiguousAliases_NONE = 0,\n  AnyAmbiguousAliases_M1 = 1,\n  AnyAmbiguousAliases_M2 = 2,\n  AnyAmbiguousAliases_M3 = 3,\n  AnyAmbiguousAliases_MIN = AnyAmbiguousAliases_NONE,\n  AnyAmbiguousAliases_MAX = AnyAmbiguousAliases_M3\n};\n\ninline const AnyAmbiguousAliases (&EnumValuesAnyAmbiguousAliases())[4] {\n  static const AnyAmbiguousAliases values[] = {\n    AnyAmbiguousAliases_NONE,\n    AnyAmbiguousAliases_M1,\n    AnyAmbiguousAliases_M2,\n    AnyAmbiguousAliases_M3\n  };\n  return values;\n}\n\ninline const char * const *EnumNamesAnyAmbiguousAliases() {\n  static const char * const names[5] = {\n    \"NONE\",\n    \"M1\",\n    \"M2\",\n    \"M3\",\n    nullptr\n  };\n  return names;\n}\n\ninline const char *EnumNameAnyAmbiguousAliases(AnyAmbiguousAliases e) {\n  if (::flatbuffers::IsOutRange(e, AnyAmbiguousAliases_NONE, AnyAmbiguousAliases_M3)) return \"\";\n  const size_t index = static_cast<size_t>(e);\n  return EnumNamesAnyAmbiguousAliases()[index];\n}\n\nstruct AnyAmbiguousAliasesUnion {\n  AnyAmbiguousAliases type;\n  void *value;\n\n  AnyAmbiguousAliasesUnion() : type(AnyAmbiguousAliases_NONE), value(nullptr) {}\n  AnyAmbiguousAliasesUnion(AnyAmbiguousAliasesUnion&& u) FLATBUFFERS_NOEXCEPT :\n    type(AnyAmbiguousAliases_NONE), value(nullptr)\n    { std::swap(type, u.type); std::swap(value, u.value); }\n  AnyAmbiguousAliasesUnion(const AnyAmbiguousAliasesUnion &);\n  AnyAmbiguousAliasesUnion &operator=(const AnyAmbiguousAliasesUnion &u)\n    { AnyAmbiguousAliasesUnion t(u); std::swap(type, t.type); std::swap(value, t.value); return *this; }\n  AnyAmbiguousAliasesUnion &operator=(AnyAmbiguousAliasesUnion &&u) FLATBUFFERS_NOEXCEPT\n    { std::swap(type, u.type); std::swap(value, u.value); return *this; }\n  ~AnyAmbiguousAliasesUnion() { Reset(); }\n\n  void Reset();\n\n  static void *UnPack(const void *obj, AnyAmbiguousAliases type, const ::flatbuffers::resolver_function_t *resolver);\n  ::flatbuffers::Offset<void> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr) const;\n\n  MyGame::Example::MonsterT *AsM1() {\n    return type == AnyAmbiguousAliases_M1 ?\n      reinterpret_cast<MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n  const MyGame::Example::MonsterT *AsM1() const {\n    return type == AnyAmbiguousAliases_M1 ?\n      reinterpret_cast<const MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n  MyGame::Example::MonsterT *AsM2() {\n    return type == AnyAmbiguousAliases_M2 ?\n      reinterpret_cast<MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n  const MyGame::Example::MonsterT *AsM2() const {\n    return type == AnyAmbiguousAliases_M2 ?\n      reinterpret_cast<const MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n  MyGame::Example::MonsterT *AsM3() {\n    return type == AnyAmbiguousAliases_M3 ?\n      reinterpret_cast<MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n  const MyGame::Example::MonsterT *AsM3() const {\n    return type == AnyAmbiguousAliases_M3 ?\n      reinterpret_cast<const MyGame::Example::MonsterT *>(value) : nullptr;\n  }\n};\n\n\ninline bool operator==(const AnyAmbiguousAliasesUnion &lhs, const AnyAmbiguousAliasesUnion &rhs) {\n  if (lhs.type != rhs.type) return false;\n  switch (lhs.type) {\n    case AnyAmbiguousAliases_NONE: {\n      return true;\n    }\n    case AnyAmbiguousAliases_M1: {\n      return *(reinterpret_cast<const MyGame::Example::MonsterT *>(lhs.value)) ==\n             *(reinterpret_cast<const MyGame::Example::MonsterT *>(rhs.value));\n    }\n    case AnyAmbiguousAliases_M2: {\n      return *(reinterpret_cast<const MyGame::Example::MonsterT *>(lhs.value)) ==\n             *(reinterpret_cast<const MyGame::Example::MonsterT *>(rhs.value));\n    }\n    case AnyAmbiguousAliases_M3: {\n      return *(reinterpret_cast<const MyGame::Example::MonsterT *>(lhs.value)) ==\n             *(reinterpret_cast<const MyGame::Example::MonsterT *>(rhs.value));\n    }\n    default: {\n      return false;\n    }\n  }\n}\n\ninline bool operator!=(const AnyAmbiguousAliasesUnion &lhs, const AnyAmbiguousAliasesUnion &rhs) {\n    return !(lhs == rhs);\n}\n\ntemplate <bool B = false>\nbool VerifyAnyAmbiguousAliases(::flatbuffers::VerifierTemplate<B> &verifier, const void *obj, AnyAmbiguousAliases type);\ntemplate <bool B = false>\nbool VerifyAnyAmbiguousAliasesVector(::flatbuffers::VerifierTemplate<B> &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types);\n\nFLATBUFFERS_MANUALLY_ALIGNED_STRUCT(2) Test FLATBUFFERS_FINAL_CLASS {\n private:\n  int16_t a_;\n  int8_t b_;\n  int8_t padding0__;\n\n public:\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return TestTypeTable();\n  }\n  Test()\n      : a_(0),\n        b_(0),\n        padding0__(0) {\n    (void)padding0__;\n  }\n  Test(int16_t _a, int8_t _b)\n      : a_(::flatbuffers::EndianScalar(_a)),\n        b_(::flatbuffers::EndianScalar(_b)),\n        padding0__(0) {\n    (void)padding0__;\n  }\n  int16_t a() const {\n    return ::flatbuffers::EndianScalar(a_);\n  }\n  void mutate_a(int16_t _a) {\n    ::flatbuffers::WriteScalar(&a_, _a);\n  }\n  int8_t b() const {\n    return ::flatbuffers::EndianScalar(b_);\n  }\n  void mutate_b(int8_t _b) {\n    ::flatbuffers::WriteScalar(&b_, _b);\n  }\n};\nFLATBUFFERS_STRUCT_END(Test, 4);\n\ninline bool operator==(const Test &lhs, const Test &rhs) {\n  return\n      (lhs.a() == rhs.a()) &&\n      (lhs.b() == rhs.b());\n}\n\ninline bool operator!=(const Test &lhs, const Test &rhs) {\n    return !(lhs == rhs);\n}\n\ntemplate <typename H>\ninline H AbslHashValue(H h, const Test &obj) {\n  return H::combine(std::move(h), obj.a(), obj.b());\n}\n\nFLATBUFFERS_MANUALLY_ALIGNED_STRUCT(8) Vec3 FLATBUFFERS_FINAL_CLASS {\n private:\n  float x_;\n  float y_;\n  float z_;\n  int32_t padding0__;\n  double test1_;\n  uint8_t test2_;\n  int8_t padding1__;\n  MyGame::Example::Test test3_;\n  int16_t padding2__;\n\n public:\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return Vec3TypeTable();\n  }\n  Vec3()\n      : x_(0),\n        y_(0),\n        z_(0),\n        padding0__(0),\n        test1_(0),\n        test2_(0),\n        padding1__(0),\n        test3_(),\n        padding2__(0) {\n    (void)padding0__;\n    (void)padding1__;\n    (void)padding2__;\n  }\n  Vec3(float _x, float _y, float _z, double _test1, MyGame::Example::Color _test2, const MyGame::Example::Test &_test3)\n      : x_(::flatbuffers::EndianScalar(_x)),\n        y_(::flatbuffers::EndianScalar(_y)),\n        z_(::flatbuffers::EndianScalar(_z)),\n        padding0__(0),\n        test1_(::flatbuffers::EndianScalar(_test1)),\n        test2_(::flatbuffers::EndianScalar(static_cast<uint8_t>(_test2))),\n        padding1__(0),\n        test3_(_test3),\n        padding2__(0) {\n    (void)padding0__;\n    (void)padding1__;\n    (void)padding2__;\n  }\n  float x() const {\n    return ::flatbuffers::EndianScalar(x_);\n  }\n  void mutate_x(float _x) {\n    ::flatbuffers::WriteScalar(&x_, _x);\n  }\n  float y() const {\n    return ::flatbuffers::EndianScalar(y_);\n  }\n  void mutate_y(float _y) {\n    ::flatbuffers::WriteScalar(&y_, _y);\n  }\n  float z() const {\n    return ::flatbuffers::EndianScalar(z_);\n  }\n  void mutate_z(float _z) {\n    ::flatbuffers::WriteScalar(&z_, _z);\n  }\n  double test1() const {\n    return ::flatbuffers::EndianScalar(test1_);\n  }\n  void mutate_test1(double _test1) {\n    ::flatbuffers::WriteScalar(&test1_, _test1);\n  }\n  MyGame::Example::Color test2() const {\n    return static_cast<MyGame::Example::Color>(::flatbuffers::EndianScalar(test2_));\n  }\n  void mutate_test2(MyGame::Example::Color _test2) {\n    ::flatbuffers::WriteScalar(&test2_, static_cast<uint8_t>(_test2));\n  }\n  const MyGame::Example::Test &test3() const {\n    return test3_;\n  }\n  MyGame::Example::Test &mutable_test3() {\n    return test3_;\n  }\n};\nFLATBUFFERS_STRUCT_END(Vec3, 32);\n\ninline bool operator==(const Vec3 &lhs, const Vec3 &rhs) {\n  return\n      (lhs.x() == rhs.x()) &&\n      (lhs.y() == rhs.y()) &&\n      (lhs.z() == rhs.z()) &&\n      (lhs.test1() == rhs.test1()) &&\n      (lhs.test2() == rhs.test2()) &&\n      (lhs.test3() == rhs.test3());\n}\n\ninline bool operator!=(const Vec3 &lhs, const Vec3 &rhs) {\n    return !(lhs == rhs);\n}\n\ntemplate <typename H>\ninline H AbslHashValue(H h, const Vec3 &obj) {\n  return H::combine(std::move(h), obj.x(), obj.y(), obj.z(), obj.test1(), obj.test2(), obj.test3());\n}\n\nFLATBUFFERS_MANUALLY_ALIGNED_STRUCT(4) Ability FLATBUFFERS_FINAL_CLASS {\n private:\n  uint32_t id_;\n  uint32_t distance_;\n\n public:\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return AbilityTypeTable();\n  }\n  Ability()\n      : id_(0),\n        distance_(0) {\n  }\n  Ability(uint32_t _id, uint32_t _distance)\n      : id_(::flatbuffers::EndianScalar(_id)),\n        distance_(::flatbuffers::EndianScalar(_distance)) {\n  }\n  uint32_t id() const {\n    return ::flatbuffers::EndianScalar(id_);\n  }\n  void mutate_id(uint32_t _id) {\n    ::flatbuffers::WriteScalar(&id_, _id);\n  }\n  bool KeyCompareLessThan(const Ability * const o) const {\n    return id() < o->id();\n  }\n  int KeyCompareWithValue(uint32_t _id) const {\n    return static_cast<int>(id() > _id) - static_cast<int>(id() < _id);\n  }\n  uint32_t distance() const {\n    return ::flatbuffers::EndianScalar(distance_);\n  }\n  void mutate_distance(uint32_t _distance) {\n    ::flatbuffers::WriteScalar(&distance_, _distance);\n  }\n};\nFLATBUFFERS_STRUCT_END(Ability, 8);\n\ninline bool operator==(const Ability &lhs, const Ability &rhs) {\n  return\n      (lhs.id() == rhs.id()) &&\n      (lhs.distance() == rhs.distance());\n}\n\ninline bool operator!=(const Ability &lhs, const Ability &rhs) {\n    return !(lhs == rhs);\n}\n\ntemplate <typename H>\ninline H AbslHashValue(H h, const Ability &obj) {\n  return H::combine(std::move(h), obj.id(), obj.distance());\n}\n\nFLATBUFFERS_MANUALLY_ALIGNED_STRUCT(4) StructOfStructs FLATBUFFERS_FINAL_CLASS {\n private:\n  MyGame::Example::Ability a_;\n  MyGame::Example::Test b_;\n  MyGame::Example::Ability c_;\n\n public:\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return StructOfStructsTypeTable();\n  }\n  StructOfStructs()\n      : a_(),\n        b_(),\n        c_() {\n  }\n  StructOfStructs(const MyGame::Example::Ability &_a, const MyGame::Example::Test &_b, const MyGame::Example::Ability &_c)\n      : a_(_a),\n        b_(_b),\n        c_(_c) {\n  }\n  const MyGame::Example::Ability &a() const {\n    return a_;\n  }\n  MyGame::Example::Ability &mutable_a() {\n    return a_;\n  }\n  const MyGame::Example::Test &b() const {\n    return b_;\n  }\n  MyGame::Example::Test &mutable_b() {\n    return b_;\n  }\n  const MyGame::Example::Ability &c() const {\n    return c_;\n  }\n  MyGame::Example::Ability &mutable_c() {\n    return c_;\n  }\n};\nFLATBUFFERS_STRUCT_END(StructOfStructs, 20);\n\ninline bool operator==(const StructOfStructs &lhs, const StructOfStructs &rhs) {\n  return\n      (lhs.a() == rhs.a()) &&\n      (lhs.b() == rhs.b()) &&\n      (lhs.c() == rhs.c());\n}\n\ninline bool operator!=(const StructOfStructs &lhs, const StructOfStructs &rhs) {\n    return !(lhs == rhs);\n}\n\ntemplate <typename H>\ninline H AbslHashValue(H h, const StructOfStructs &obj) {\n  return H::combine(std::move(h), obj.a(), obj.b(), obj.c());\n}\n\nFLATBUFFERS_MANUALLY_ALIGNED_STRUCT(4) StructOfStructsOfStructs FLATBUFFERS_FINAL_CLASS {\n private:\n  MyGame::Example::StructOfStructs a_;\n\n public:\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return StructOfStructsOfStructsTypeTable();\n  }\n  StructOfStructsOfStructs()\n      : a_() {\n  }\n  StructOfStructsOfStructs(const MyGame::Example::StructOfStructs &_a)\n      : a_(_a) {\n  }\n  const MyGame::Example::StructOfStructs &a() const {\n    return a_;\n  }\n  MyGame::Example::StructOfStructs &mutable_a() {\n    return a_;\n  }\n};\nFLATBUFFERS_STRUCT_END(StructOfStructsOfStructs, 20);\n\ninline bool operator==(const StructOfStructsOfStructs &lhs, const StructOfStructsOfStructs &rhs) {\n  return\n      (lhs.a() == rhs.a());\n}\n\ninline bool operator!=(const StructOfStructsOfStructs &lhs, const StructOfStructsOfStructs &rhs) {\n    return !(lhs == rhs);\n}\n\ntemplate <typename H>\ninline H AbslHashValue(H h, const StructOfStructsOfStructs &obj) {\n  return H::combine(std::move(h), obj.a());\n}\n\n}  // namespace Example\n\nstruct InParentNamespaceT : public ::flatbuffers::NativeTable {\n  typedef InParentNamespace TableType;\n};\n\nstruct InParentNamespace FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef InParentNamespaceT NativeTableType;\n  typedef InParentNamespaceBuilder Builder;\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return InParentNamespaceTypeTable();\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           verifier.EndTable();\n  }\n  InParentNamespaceT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  void UnPackTo(InParentNamespaceT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  static ::flatbuffers::Offset<InParentNamespace> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const InParentNamespaceT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n};\n\nstruct InParentNamespaceBuilder {\n  typedef InParentNamespace Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  explicit InParentNamespaceBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<InParentNamespace> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<InParentNamespace>(end);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<InParentNamespace> CreateInParentNamespace(\n    ::flatbuffers::FlatBufferBuilder &_fbb) {\n  InParentNamespaceBuilder builder_(_fbb);\n  return builder_.Finish();\n}\n\n::flatbuffers::Offset<InParentNamespace> CreateInParentNamespace(::flatbuffers::FlatBufferBuilder &_fbb, const InParentNamespaceT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n\nnamespace Example2 {\n\nstruct MonsterT : public ::flatbuffers::NativeTable {\n  typedef Monster TableType;\n};\n\nstruct Monster FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef MonsterT NativeTableType;\n  typedef MonsterBuilder Builder;\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return MonsterTypeTable();\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           verifier.EndTable();\n  }\n  MonsterT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  void UnPackTo(MonsterT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  static ::flatbuffers::Offset<Monster> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n};\n\nstruct MonsterBuilder {\n  typedef Monster Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  explicit MonsterBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<Monster> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<Monster>(end);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<Monster> CreateMonster(\n    ::flatbuffers::FlatBufferBuilder &_fbb) {\n  MonsterBuilder builder_(_fbb);\n  return builder_.Finish();\n}\n\n::flatbuffers::Offset<Monster> CreateMonster(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n\n}  // namespace Example2\n\nnamespace Example {\n\nstruct TestSimpleTableWithEnumT : public ::flatbuffers::NativeTable {\n  typedef TestSimpleTableWithEnum TableType;\n  MyGame::Example::Color color = MyGame::Example::Color_Green;\n};\n\nstruct TestSimpleTableWithEnum FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef TestSimpleTableWithEnumT NativeTableType;\n  typedef TestSimpleTableWithEnumBuilder Builder;\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return TestSimpleTableWithEnumTypeTable();\n  }\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_COLOR = 4\n  };\n  MyGame::Example::Color color() const {\n    return static_cast<MyGame::Example::Color>(GetField<uint8_t>(VT_COLOR, 2));\n  }\n  bool mutate_color(MyGame::Example::Color _color = static_cast<MyGame::Example::Color>(2)) {\n    return SetField<uint8_t>(VT_COLOR, static_cast<uint8_t>(_color), 2);\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyField<uint8_t>(verifier, VT_COLOR, 1) &&\n           verifier.EndTable();\n  }\n  TestSimpleTableWithEnumT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  void UnPackTo(TestSimpleTableWithEnumT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  static ::flatbuffers::Offset<TestSimpleTableWithEnum> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const TestSimpleTableWithEnumT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n};\n\nstruct TestSimpleTableWithEnumBuilder {\n  typedef TestSimpleTableWithEnum Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_color(MyGame::Example::Color color) {\n    fbb_.AddElement<uint8_t>(TestSimpleTableWithEnum::VT_COLOR, static_cast<uint8_t>(color), 2);\n  }\n  explicit TestSimpleTableWithEnumBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<TestSimpleTableWithEnum> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<TestSimpleTableWithEnum>(end);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<TestSimpleTableWithEnum> CreateTestSimpleTableWithEnum(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    MyGame::Example::Color color = MyGame::Example::Color_Green) {\n  TestSimpleTableWithEnumBuilder builder_(_fbb);\n  builder_.add_color(color);\n  return builder_.Finish();\n}\n\n::flatbuffers::Offset<TestSimpleTableWithEnum> CreateTestSimpleTableWithEnum(::flatbuffers::FlatBufferBuilder &_fbb, const TestSimpleTableWithEnumT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n\nstruct StatT : public ::flatbuffers::NativeTable {\n  typedef Stat TableType;\n  std::string id{};\n  int64_t val = 0;\n  uint16_t count = 0;\n};\n\nstruct Stat FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef StatT NativeTableType;\n  typedef StatBuilder Builder;\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return StatTypeTable();\n  }\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_ID = 4,\n    VT_VAL = 6,\n    VT_COUNT = 8\n  };\n  const ::flatbuffers::String *id() const {\n    return GetPointer<const ::flatbuffers::String *>(VT_ID);\n  }\n  ::flatbuffers::String *mutable_id() {\n    return GetPointer<::flatbuffers::String *>(VT_ID);\n  }\n  int64_t val() const {\n    return GetField<int64_t>(VT_VAL, 0);\n  }\n  bool mutate_val(int64_t _val = 0) {\n    return SetField<int64_t>(VT_VAL, _val, 0);\n  }\n  uint16_t count() const {\n    return GetField<uint16_t>(VT_COUNT, 0);\n  }\n  bool mutate_count(uint16_t _count = 0) {\n    return SetField<uint16_t>(VT_COUNT, _count, 0);\n  }\n  bool KeyCompareLessThan(const Stat * const o) const {\n    return count() < o->count();\n  }\n  int KeyCompareWithValue(uint16_t _count) const {\n    return static_cast<int>(count() > _count) - static_cast<int>(count() < _count);\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyOffset(verifier, VT_ID) &&\n           verifier.VerifyString(id()) &&\n           VerifyField<int64_t>(verifier, VT_VAL, 8) &&\n           VerifyField<uint16_t>(verifier, VT_COUNT, 2) &&\n           verifier.EndTable();\n  }\n  StatT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  void UnPackTo(StatT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  static ::flatbuffers::Offset<Stat> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const StatT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n};\n\nstruct StatBuilder {\n  typedef Stat Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_id(::flatbuffers::Offset<::flatbuffers::String> id) {\n    fbb_.AddOffset(Stat::VT_ID, id);\n  }\n  void add_val(int64_t val) {\n    fbb_.AddElement<int64_t>(Stat::VT_VAL, val, 0);\n  }\n  void add_count(uint16_t count) {\n    fbb_.AddElement<uint16_t>(Stat::VT_COUNT, count, 0);\n  }\n  explicit StatBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<Stat> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<Stat>(end);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<Stat> CreateStat(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    ::flatbuffers::Offset<::flatbuffers::String> id = 0,\n    int64_t val = 0,\n    uint16_t count = 0) {\n  StatBuilder builder_(_fbb);\n  builder_.add_val(val);\n  builder_.add_id(id);\n  builder_.add_count(count);\n  return builder_.Finish();\n}\n\ninline ::flatbuffers::Offset<Stat> CreateStatDirect(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    const char *id = nullptr,\n    int64_t val = 0,\n    uint16_t count = 0) {\n  auto id__ = id ? _fbb.CreateString(id) : 0;\n  return MyGame::Example::CreateStat(\n      _fbb,\n      id__,\n      val,\n      count);\n}\n\n::flatbuffers::Offset<Stat> CreateStat(::flatbuffers::FlatBufferBuilder &_fbb, const StatT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n\nstruct ReferrableT : public ::flatbuffers::NativeTable {\n  typedef Referrable TableType;\n  uint64_t id = 0;\n};\n\nstruct Referrable FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef ReferrableT NativeTableType;\n  typedef ReferrableBuilder Builder;\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return ReferrableTypeTable();\n  }\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_ID = 4\n  };\n  uint64_t id() const {\n    return GetField<uint64_t>(VT_ID, 0);\n  }\n  bool mutate_id(uint64_t _id = 0) {\n    return SetField<uint64_t>(VT_ID, _id, 0);\n  }\n  bool KeyCompareLessThan(const Referrable * const o) const {\n    return id() < o->id();\n  }\n  int KeyCompareWithValue(uint64_t _id) const {\n    return static_cast<int>(id() > _id) - static_cast<int>(id() < _id);\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyField<uint64_t>(verifier, VT_ID, 8) &&\n           verifier.EndTable();\n  }\n  ReferrableT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  void UnPackTo(ReferrableT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  static ::flatbuffers::Offset<Referrable> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ReferrableT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n};\n\nstruct ReferrableBuilder {\n  typedef Referrable Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_id(uint64_t id) {\n    fbb_.AddElement<uint64_t>(Referrable::VT_ID, id, 0);\n  }\n  explicit ReferrableBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<Referrable> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<Referrable>(end);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<Referrable> CreateReferrable(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    uint64_t id = 0) {\n  ReferrableBuilder builder_(_fbb);\n  builder_.add_id(id);\n  return builder_.Finish();\n}\n\n::flatbuffers::Offset<Referrable> CreateReferrable(::flatbuffers::FlatBufferBuilder &_fbb, const ReferrableT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n\nstruct MonsterT : public ::flatbuffers::NativeTable {\n  typedef Monster TableType;\n  std::unique_ptr<MyGame::Example::Vec3> pos{};\n  int16_t mana = 150;\n  int16_t hp = 100;\n  std::string name{};\n  std::vector<uint8_t> inventory{};\n  MyGame::Example::Color color = MyGame::Example::Color_Blue;\n  MyGame::Example::AnyUnion test{};\n  std::vector<MyGame::Example::Test> test4{};\n  std::vector<std::string> testarrayofstring{};\n  std::vector<std::unique_ptr<MyGame::Example::MonsterT>> testarrayoftables{};\n  std::unique_ptr<MyGame::Example::MonsterT> enemy{};\n  std::vector<uint8_t> testnestedflatbuffer{};\n  std::unique_ptr<MyGame::Example::StatT> testempty{};\n  bool testbool = false;\n  int32_t testhashs32_fnv1 = 0;\n  uint32_t testhashu32_fnv1 = 0;\n  int64_t testhashs64_fnv1 = 0;\n  uint64_t testhashu64_fnv1 = 0;\n  int32_t testhashs32_fnv1a = 0;\n  Stat *testhashu32_fnv1a = nullptr;\n  int64_t testhashs64_fnv1a = 0;\n  uint64_t testhashu64_fnv1a = 0;\n  std::vector<bool> testarrayofbools{};\n  float testf = 3.14159f;\n  float testf2 = 3.0f;\n  float testf3 = 0.0f;\n  std::vector<std::string> testarrayofstring2{};\n  std::vector<MyGame::Example::Ability> testarrayofsortedstruct{};\n  std::vector<uint8_t> flex{};\n  std::vector<MyGame::Example::Test> test5{};\n  std::vector<int64_t> vector_of_longs{};\n  std::vector<double> vector_of_doubles{};\n  std::unique_ptr<MyGame::InParentNamespaceT> parent_namespace_test{};\n  std::vector<std::unique_ptr<MyGame::Example::ReferrableT>> vector_of_referrables{};\n  ReferrableT *single_weak_reference = nullptr;\n  std::vector<ReferrableT *> vector_of_weak_references{};\n  std::vector<std::unique_ptr<MyGame::Example::ReferrableT>> vector_of_strong_referrables{};\n  ReferrableT *co_owning_reference = nullptr;\n  std::vector<std::unique_ptr<ReferrableT>> vector_of_co_owning_references{};\n  ReferrableT *non_owning_reference = nullptr;\n  std::vector<ReferrableT *> vector_of_non_owning_references{};\n  MyGame::Example::AnyUniqueAliasesUnion any_unique{};\n  MyGame::Example::AnyAmbiguousAliasesUnion any_ambiguous{};\n  std::vector<MyGame::Example::Color> vector_of_enums{};\n  MyGame::Example::Race signed_enum = MyGame::Example::Race_None;\n  std::vector<uint8_t> testrequirednestedflatbuffer{};\n  std::vector<std::unique_ptr<MyGame::Example::StatT>> scalar_key_sorted_tables{};\n  MyGame::Example::Test native_inline{};\n  MyGame::Example::LongEnum long_enum_non_enum_default = static_cast<MyGame::Example::LongEnum>(0);\n  MyGame::Example::LongEnum long_enum_normal_default = MyGame::Example::LongEnum_LongOne;\n  float nan_default = std::numeric_limits<float>::quiet_NaN();\n  float inf_default = std::numeric_limits<float>::infinity();\n  float positive_inf_default = std::numeric_limits<float>::infinity();\n  float infinity_default = std::numeric_limits<float>::infinity();\n  float positive_infinity_default = std::numeric_limits<float>::infinity();\n  float negative_inf_default = -std::numeric_limits<float>::infinity();\n  float negative_infinity_default = -std::numeric_limits<float>::infinity();\n  double double_inf_default = std::numeric_limits<double>::infinity();\n  MonsterT() = default;\n  MonsterT(const MonsterT &o);\n  MonsterT(MonsterT&&) FLATBUFFERS_NOEXCEPT = default;\n  MonsterT &operator=(MonsterT o) FLATBUFFERS_NOEXCEPT;\n};\n\n/// an example documentation comment: \"monster object\"\nstruct Monster FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef MonsterT NativeTableType;\n  typedef MonsterBuilder Builder;\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return MonsterTypeTable();\n  }\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_POS = 4,\n    VT_MANA = 6,\n    VT_HP = 8,\n    VT_NAME = 10,\n    VT_INVENTORY = 14,\n    VT_COLOR = 16,\n    VT_TEST_TYPE = 18,\n    VT_TEST = 20,\n    VT_TEST4 = 22,\n    VT_TESTARRAYOFSTRING = 24,\n    VT_TESTARRAYOFTABLES = 26,\n    VT_ENEMY = 28,\n    VT_TESTNESTEDFLATBUFFER = 30,\n    VT_TESTEMPTY = 32,\n    VT_TESTBOOL = 34,\n    VT_TESTHASHS32_FNV1 = 36,\n    VT_TESTHASHU32_FNV1 = 38,\n    VT_TESTHASHS64_FNV1 = 40,\n    VT_TESTHASHU64_FNV1 = 42,\n    VT_TESTHASHS32_FNV1A = 44,\n    VT_TESTHASHU32_FNV1A = 46,\n    VT_TESTHASHS64_FNV1A = 48,\n    VT_TESTHASHU64_FNV1A = 50,\n    VT_TESTARRAYOFBOOLS = 52,\n    VT_TESTF = 54,\n    VT_TESTF2 = 56,\n    VT_TESTF3 = 58,\n    VT_TESTARRAYOFSTRING2 = 60,\n    VT_TESTARRAYOFSORTEDSTRUCT = 62,\n    VT_FLEX = 64,\n    VT_TEST5 = 66,\n    VT_VECTOR_OF_LONGS = 68,\n    VT_VECTOR_OF_DOUBLES = 70,\n    VT_PARENT_NAMESPACE_TEST = 72,\n    VT_VECTOR_OF_REFERRABLES = 74,\n    VT_SINGLE_WEAK_REFERENCE = 76,\n    VT_VECTOR_OF_WEAK_REFERENCES = 78,\n    VT_VECTOR_OF_STRONG_REFERRABLES = 80,\n    VT_CO_OWNING_REFERENCE = 82,\n    VT_VECTOR_OF_CO_OWNING_REFERENCES = 84,\n    VT_NON_OWNING_REFERENCE = 86,\n    VT_VECTOR_OF_NON_OWNING_REFERENCES = 88,\n    VT_ANY_UNIQUE_TYPE = 90,\n    VT_ANY_UNIQUE = 92,\n    VT_ANY_AMBIGUOUS_TYPE = 94,\n    VT_ANY_AMBIGUOUS = 96,\n    VT_VECTOR_OF_ENUMS = 98,\n    VT_SIGNED_ENUM = 100,\n    VT_TESTREQUIREDNESTEDFLATBUFFER = 102,\n    VT_SCALAR_KEY_SORTED_TABLES = 104,\n    VT_NATIVE_INLINE = 106,\n    VT_LONG_ENUM_NON_ENUM_DEFAULT = 108,\n    VT_LONG_ENUM_NORMAL_DEFAULT = 110,\n    VT_NAN_DEFAULT = 112,\n    VT_INF_DEFAULT = 114,\n    VT_POSITIVE_INF_DEFAULT = 116,\n    VT_INFINITY_DEFAULT = 118,\n    VT_POSITIVE_INFINITY_DEFAULT = 120,\n    VT_NEGATIVE_INF_DEFAULT = 122,\n    VT_NEGATIVE_INFINITY_DEFAULT = 124,\n    VT_DOUBLE_INF_DEFAULT = 126\n  };\n  const MyGame::Example::Vec3 *pos() const {\n    return GetStruct<const MyGame::Example::Vec3 *>(VT_POS);\n  }\n  MyGame::Example::Vec3 *mutable_pos() {\n    return GetStruct<MyGame::Example::Vec3 *>(VT_POS);\n  }\n  int16_t mana() const {\n    return GetField<int16_t>(VT_MANA, 150);\n  }\n  bool mutate_mana(int16_t _mana = 150) {\n    return SetField<int16_t>(VT_MANA, _mana, 150);\n  }\n  int16_t hp() const {\n    return GetField<int16_t>(VT_HP, 100);\n  }\n  bool mutate_hp(int16_t _hp = 100) {\n    return SetField<int16_t>(VT_HP, _hp, 100);\n  }\n  const ::flatbuffers::String *name() const {\n    return GetPointer<const ::flatbuffers::String *>(VT_NAME);\n  }\n  ::flatbuffers::String *mutable_name() {\n    return GetPointer<::flatbuffers::String *>(VT_NAME);\n  }\n  bool KeyCompareLessThan(const Monster * const o) const {\n    return *name() < *o->name();\n  }\n  int KeyCompareWithValue(const char *_name) const {\n    return strcmp(name()->c_str(), _name);\n  }\n  template<typename StringType>\n  int KeyCompareWithValue(const StringType& _name) const {\n    if (name()->c_str() < _name) return -1;\n    if (_name < name()->c_str()) return 1;\n    return 0;\n  }\n  const ::flatbuffers::Vector<uint8_t> *inventory() const {\n    return GetPointer<const ::flatbuffers::Vector<uint8_t> *>(VT_INVENTORY);\n  }\n  ::flatbuffers::Vector<uint8_t> *mutable_inventory() {\n    return GetPointer<::flatbuffers::Vector<uint8_t> *>(VT_INVENTORY);\n  }\n  MyGame::Example::Color color() const {\n    return static_cast<MyGame::Example::Color>(GetField<uint8_t>(VT_COLOR, 8));\n  }\n  bool mutate_color(MyGame::Example::Color _color = static_cast<MyGame::Example::Color>(8)) {\n    return SetField<uint8_t>(VT_COLOR, static_cast<uint8_t>(_color), 8);\n  }\n  MyGame::Example::Any test_type() const {\n    return static_cast<MyGame::Example::Any>(GetField<uint8_t>(VT_TEST_TYPE, 0));\n  }\n  const void *test() const {\n    return GetPointer<const void *>(VT_TEST);\n  }\n  template<typename T> const T *test_as() const;\n  const MyGame::Example::Monster *test_as_Monster() const {\n    return test_type() == MyGame::Example::Any_Monster ? static_cast<const MyGame::Example::Monster *>(test()) : nullptr;\n  }\n  const MyGame::Example::TestSimpleTableWithEnum *test_as_TestSimpleTableWithEnum() const {\n    return test_type() == MyGame::Example::Any_TestSimpleTableWithEnum ? static_cast<const MyGame::Example::TestSimpleTableWithEnum *>(test()) : nullptr;\n  }\n  const MyGame::Example2::Monster *test_as_MyGame_Example2_Monster() const {\n    return test_type() == MyGame::Example::Any_MyGame_Example2_Monster ? static_cast<const MyGame::Example2::Monster *>(test()) : nullptr;\n  }\n  template<typename T> T *mutable_test_as();\n  MyGame::Example::Monster *mutable_test_as_Monster() {\n    return test_type() == MyGame::Example::Any_Monster ? static_cast<MyGame::Example::Monster *>(mutable_test()) : nullptr;\n  }\n  MyGame::Example::TestSimpleTableWithEnum *mutable_test_as_TestSimpleTableWithEnum() {\n    return test_type() == MyGame::Example::Any_TestSimpleTableWithEnum ? static_cast<MyGame::Example::TestSimpleTableWithEnum *>(mutable_test()) : nullptr;\n  }\n  MyGame::Example2::Monster *mutable_test_as_MyGame_Example2_Monster() {\n    return test_type() == MyGame::Example::Any_MyGame_Example2_Monster ? static_cast<MyGame::Example2::Monster *>(mutable_test()) : nullptr;\n  }\n  void *mutable_test() {\n    return GetPointer<void *>(VT_TEST);\n  }\n  const ::flatbuffers::Vector<const MyGame::Example::Test *> *test4() const {\n    return GetPointer<const ::flatbuffers::Vector<const MyGame::Example::Test *> *>(VT_TEST4);\n  }\n  ::flatbuffers::Vector<const MyGame::Example::Test *> *mutable_test4() {\n    return GetPointer<::flatbuffers::Vector<const MyGame::Example::Test *> *>(VT_TEST4);\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *testarrayofstring() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_TESTARRAYOFSTRING);\n  }\n  ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *mutable_testarrayofstring() {\n    return GetPointer<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_TESTARRAYOFSTRING);\n  }\n  /// an example documentation comment: this will end up in the generated code\n  /// multiline too\n  const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Monster>> *testarrayoftables() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Monster>> *>(VT_TESTARRAYOFTABLES);\n  }\n  ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Monster>> *mutable_testarrayoftables() {\n    return GetPointer<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Monster>> *>(VT_TESTARRAYOFTABLES);\n  }\n  const MyGame::Example::Monster *enemy() const {\n    return GetPointer<const MyGame::Example::Monster *>(VT_ENEMY);\n  }\n  MyGame::Example::Monster *mutable_enemy() {\n    return GetPointer<MyGame::Example::Monster *>(VT_ENEMY);\n  }\n  const ::flatbuffers::Vector<uint8_t> *testnestedflatbuffer() const {\n    return GetPointer<const ::flatbuffers::Vector<uint8_t> *>(VT_TESTNESTEDFLATBUFFER);\n  }\n  ::flatbuffers::Vector<uint8_t> *mutable_testnestedflatbuffer() {\n    return GetPointer<::flatbuffers::Vector<uint8_t> *>(VT_TESTNESTEDFLATBUFFER);\n  }\n  const MyGame::Example::Monster *testnestedflatbuffer_nested_root() const {\n    const auto _f = testnestedflatbuffer();\n    return _f ? ::flatbuffers::GetRoot<MyGame::Example::Monster>(_f->Data())\n              : nullptr;\n  }\n  const MyGame::Example::Stat *testempty() const {\n    return GetPointer<const MyGame::Example::Stat *>(VT_TESTEMPTY);\n  }\n  MyGame::Example::Stat *mutable_testempty() {\n    return GetPointer<MyGame::Example::Stat *>(VT_TESTEMPTY);\n  }\n  bool testbool() const {\n    return GetField<uint8_t>(VT_TESTBOOL, 0) != 0;\n  }\n  bool mutate_testbool(bool _testbool = 0) {\n    return SetField<uint8_t>(VT_TESTBOOL, static_cast<uint8_t>(_testbool), 0);\n  }\n  int32_t testhashs32_fnv1() const {\n    return GetField<int32_t>(VT_TESTHASHS32_FNV1, 0);\n  }\n  bool mutate_testhashs32_fnv1(int32_t _testhashs32_fnv1 = 0) {\n    return SetField<int32_t>(VT_TESTHASHS32_FNV1, _testhashs32_fnv1, 0);\n  }\n  uint32_t testhashu32_fnv1() const {\n    return GetField<uint32_t>(VT_TESTHASHU32_FNV1, 0);\n  }\n  bool mutate_testhashu32_fnv1(uint32_t _testhashu32_fnv1 = 0) {\n    return SetField<uint32_t>(VT_TESTHASHU32_FNV1, _testhashu32_fnv1, 0);\n  }\n  int64_t testhashs64_fnv1() const {\n    return GetField<int64_t>(VT_TESTHASHS64_FNV1, 0);\n  }\n  bool mutate_testhashs64_fnv1(int64_t _testhashs64_fnv1 = 0) {\n    return SetField<int64_t>(VT_TESTHASHS64_FNV1, _testhashs64_fnv1, 0);\n  }\n  uint64_t testhashu64_fnv1() const {\n    return GetField<uint64_t>(VT_TESTHASHU64_FNV1, 0);\n  }\n  bool mutate_testhashu64_fnv1(uint64_t _testhashu64_fnv1 = 0) {\n    return SetField<uint64_t>(VT_TESTHASHU64_FNV1, _testhashu64_fnv1, 0);\n  }\n  int32_t testhashs32_fnv1a() const {\n    return GetField<int32_t>(VT_TESTHASHS32_FNV1A, 0);\n  }\n  bool mutate_testhashs32_fnv1a(int32_t _testhashs32_fnv1a = 0) {\n    return SetField<int32_t>(VT_TESTHASHS32_FNV1A, _testhashs32_fnv1a, 0);\n  }\n  uint32_t testhashu32_fnv1a() const {\n    return GetField<uint32_t>(VT_TESTHASHU32_FNV1A, 0);\n  }\n  bool mutate_testhashu32_fnv1a(uint32_t _testhashu32_fnv1a = 0) {\n    return SetField<uint32_t>(VT_TESTHASHU32_FNV1A, _testhashu32_fnv1a, 0);\n  }\n  int64_t testhashs64_fnv1a() const {\n    return GetField<int64_t>(VT_TESTHASHS64_FNV1A, 0);\n  }\n  bool mutate_testhashs64_fnv1a(int64_t _testhashs64_fnv1a = 0) {\n    return SetField<int64_t>(VT_TESTHASHS64_FNV1A, _testhashs64_fnv1a, 0);\n  }\n  uint64_t testhashu64_fnv1a() const {\n    return GetField<uint64_t>(VT_TESTHASHU64_FNV1A, 0);\n  }\n  bool mutate_testhashu64_fnv1a(uint64_t _testhashu64_fnv1a = 0) {\n    return SetField<uint64_t>(VT_TESTHASHU64_FNV1A, _testhashu64_fnv1a, 0);\n  }\n  const ::flatbuffers::Vector<uint8_t> *testarrayofbools() const {\n    return GetPointer<const ::flatbuffers::Vector<uint8_t> *>(VT_TESTARRAYOFBOOLS);\n  }\n  ::flatbuffers::Vector<uint8_t> *mutable_testarrayofbools() {\n    return GetPointer<::flatbuffers::Vector<uint8_t> *>(VT_TESTARRAYOFBOOLS);\n  }\n  float testf() const {\n    return GetField<float>(VT_TESTF, 3.14159f);\n  }\n  bool mutate_testf(float _testf = 3.14159f) {\n    return SetField<float>(VT_TESTF, _testf, 3.14159f);\n  }\n  float testf2() const {\n    return GetField<float>(VT_TESTF2, 3.0f);\n  }\n  bool mutate_testf2(float _testf2 = 3.0f) {\n    return SetField<float>(VT_TESTF2, _testf2, 3.0f);\n  }\n  float testf3() const {\n    return GetField<float>(VT_TESTF3, 0.0f);\n  }\n  bool mutate_testf3(float _testf3 = 0.0f) {\n    return SetField<float>(VT_TESTF3, _testf3, 0.0f);\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *testarrayofstring2() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_TESTARRAYOFSTRING2);\n  }\n  ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *mutable_testarrayofstring2() {\n    return GetPointer<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_TESTARRAYOFSTRING2);\n  }\n  const ::flatbuffers::Vector<const MyGame::Example::Ability *> *testarrayofsortedstruct() const {\n    return GetPointer<const ::flatbuffers::Vector<const MyGame::Example::Ability *> *>(VT_TESTARRAYOFSORTEDSTRUCT);\n  }\n  ::flatbuffers::Vector<const MyGame::Example::Ability *> *mutable_testarrayofsortedstruct() {\n    return GetPointer<::flatbuffers::Vector<const MyGame::Example::Ability *> *>(VT_TESTARRAYOFSORTEDSTRUCT);\n  }\n  const ::flatbuffers::Vector<uint8_t> *flex() const {\n    return GetPointer<const ::flatbuffers::Vector<uint8_t> *>(VT_FLEX);\n  }\n  ::flatbuffers::Vector<uint8_t> *mutable_flex() {\n    return GetPointer<::flatbuffers::Vector<uint8_t> *>(VT_FLEX);\n  }\n  flexbuffers::Reference flex_flexbuffer_root() const {\n    const auto _f = flex();\n    return _f ? flexbuffers::GetRoot(_f->Data(), _f->size())\n              : flexbuffers::Reference();\n  }\n  const ::flatbuffers::Vector<const MyGame::Example::Test *> *test5() const {\n    return GetPointer<const ::flatbuffers::Vector<const MyGame::Example::Test *> *>(VT_TEST5);\n  }\n  ::flatbuffers::Vector<const MyGame::Example::Test *> *mutable_test5() {\n    return GetPointer<::flatbuffers::Vector<const MyGame::Example::Test *> *>(VT_TEST5);\n  }\n  const ::flatbuffers::Vector<int64_t> *vector_of_longs() const {\n    return GetPointer<const ::flatbuffers::Vector<int64_t> *>(VT_VECTOR_OF_LONGS);\n  }\n  ::flatbuffers::Vector<int64_t> *mutable_vector_of_longs() {\n    return GetPointer<::flatbuffers::Vector<int64_t> *>(VT_VECTOR_OF_LONGS);\n  }\n  const ::flatbuffers::Vector<double> *vector_of_doubles() const {\n    return GetPointer<const ::flatbuffers::Vector<double> *>(VT_VECTOR_OF_DOUBLES);\n  }\n  ::flatbuffers::Vector<double> *mutable_vector_of_doubles() {\n    return GetPointer<::flatbuffers::Vector<double> *>(VT_VECTOR_OF_DOUBLES);\n  }\n  const MyGame::InParentNamespace *parent_namespace_test() const {\n    return GetPointer<const MyGame::InParentNamespace *>(VT_PARENT_NAMESPACE_TEST);\n  }\n  MyGame::InParentNamespace *mutable_parent_namespace_test() {\n    return GetPointer<MyGame::InParentNamespace *>(VT_PARENT_NAMESPACE_TEST);\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *vector_of_referrables() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *>(VT_VECTOR_OF_REFERRABLES);\n  }\n  ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *mutable_vector_of_referrables() {\n    return GetPointer<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *>(VT_VECTOR_OF_REFERRABLES);\n  }\n  uint64_t single_weak_reference() const {\n    return GetField<uint64_t>(VT_SINGLE_WEAK_REFERENCE, 0);\n  }\n  bool mutate_single_weak_reference(uint64_t _single_weak_reference = 0) {\n    return SetField<uint64_t>(VT_SINGLE_WEAK_REFERENCE, _single_weak_reference, 0);\n  }\n  const ::flatbuffers::Vector<uint64_t> *vector_of_weak_references() const {\n    return GetPointer<const ::flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_WEAK_REFERENCES);\n  }\n  ::flatbuffers::Vector<uint64_t> *mutable_vector_of_weak_references() {\n    return GetPointer<::flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_WEAK_REFERENCES);\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *vector_of_strong_referrables() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *>(VT_VECTOR_OF_STRONG_REFERRABLES);\n  }\n  ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *mutable_vector_of_strong_referrables() {\n    return GetPointer<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *>(VT_VECTOR_OF_STRONG_REFERRABLES);\n  }\n  uint64_t co_owning_reference() const {\n    return GetField<uint64_t>(VT_CO_OWNING_REFERENCE, 0);\n  }\n  bool mutate_co_owning_reference(uint64_t _co_owning_reference = 0) {\n    return SetField<uint64_t>(VT_CO_OWNING_REFERENCE, _co_owning_reference, 0);\n  }\n  const ::flatbuffers::Vector<uint64_t> *vector_of_co_owning_references() const {\n    return GetPointer<const ::flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_CO_OWNING_REFERENCES);\n  }\n  ::flatbuffers::Vector<uint64_t> *mutable_vector_of_co_owning_references() {\n    return GetPointer<::flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_CO_OWNING_REFERENCES);\n  }\n  uint64_t non_owning_reference() const {\n    return GetField<uint64_t>(VT_NON_OWNING_REFERENCE, 0);\n  }\n  bool mutate_non_owning_reference(uint64_t _non_owning_reference = 0) {\n    return SetField<uint64_t>(VT_NON_OWNING_REFERENCE, _non_owning_reference, 0);\n  }\n  const ::flatbuffers::Vector<uint64_t> *vector_of_non_owning_references() const {\n    return GetPointer<const ::flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_NON_OWNING_REFERENCES);\n  }\n  ::flatbuffers::Vector<uint64_t> *mutable_vector_of_non_owning_references() {\n    return GetPointer<::flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_NON_OWNING_REFERENCES);\n  }\n  MyGame::Example::AnyUniqueAliases any_unique_type() const {\n    return static_cast<MyGame::Example::AnyUniqueAliases>(GetField<uint8_t>(VT_ANY_UNIQUE_TYPE, 0));\n  }\n  const void *any_unique() const {\n    return GetPointer<const void *>(VT_ANY_UNIQUE);\n  }\n  template<typename T> const T *any_unique_as() const;\n  const MyGame::Example::Monster *any_unique_as_M() const {\n    return any_unique_type() == MyGame::Example::AnyUniqueAliases_M ? static_cast<const MyGame::Example::Monster *>(any_unique()) : nullptr;\n  }\n  const MyGame::Example::TestSimpleTableWithEnum *any_unique_as_TS() const {\n    return any_unique_type() == MyGame::Example::AnyUniqueAliases_TS ? static_cast<const MyGame::Example::TestSimpleTableWithEnum *>(any_unique()) : nullptr;\n  }\n  const MyGame::Example2::Monster *any_unique_as_M2() const {\n    return any_unique_type() == MyGame::Example::AnyUniqueAliases_M2 ? static_cast<const MyGame::Example2::Monster *>(any_unique()) : nullptr;\n  }\n  template<typename T> T *mutable_any_unique_as();\n  MyGame::Example::Monster *mutable_any_unique_as_M() {\n    return any_unique_type() == MyGame::Example::AnyUniqueAliases_M ? static_cast<MyGame::Example::Monster *>(mutable_any_unique()) : nullptr;\n  }\n  MyGame::Example::TestSimpleTableWithEnum *mutable_any_unique_as_TS() {\n    return any_unique_type() == MyGame::Example::AnyUniqueAliases_TS ? static_cast<MyGame::Example::TestSimpleTableWithEnum *>(mutable_any_unique()) : nullptr;\n  }\n  MyGame::Example2::Monster *mutable_any_unique_as_M2() {\n    return any_unique_type() == MyGame::Example::AnyUniqueAliases_M2 ? static_cast<MyGame::Example2::Monster *>(mutable_any_unique()) : nullptr;\n  }\n  void *mutable_any_unique() {\n    return GetPointer<void *>(VT_ANY_UNIQUE);\n  }\n  MyGame::Example::AnyAmbiguousAliases any_ambiguous_type() const {\n    return static_cast<MyGame::Example::AnyAmbiguousAliases>(GetField<uint8_t>(VT_ANY_AMBIGUOUS_TYPE, 0));\n  }\n  const void *any_ambiguous() const {\n    return GetPointer<const void *>(VT_ANY_AMBIGUOUS);\n  }\n  const MyGame::Example::Monster *any_ambiguous_as_M1() const {\n    return any_ambiguous_type() == MyGame::Example::AnyAmbiguousAliases_M1 ? static_cast<const MyGame::Example::Monster *>(any_ambiguous()) : nullptr;\n  }\n  const MyGame::Example::Monster *any_ambiguous_as_M2() const {\n    return any_ambiguous_type() == MyGame::Example::AnyAmbiguousAliases_M2 ? static_cast<const MyGame::Example::Monster *>(any_ambiguous()) : nullptr;\n  }\n  const MyGame::Example::Monster *any_ambiguous_as_M3() const {\n    return any_ambiguous_type() == MyGame::Example::AnyAmbiguousAliases_M3 ? static_cast<const MyGame::Example::Monster *>(any_ambiguous()) : nullptr;\n  }\n  MyGame::Example::Monster *mutable_any_ambiguous_as_M1() {\n    return any_ambiguous_type() == MyGame::Example::AnyAmbiguousAliases_M1 ? static_cast<MyGame::Example::Monster *>(mutable_any_ambiguous()) : nullptr;\n  }\n  MyGame::Example::Monster *mutable_any_ambiguous_as_M2() {\n    return any_ambiguous_type() == MyGame::Example::AnyAmbiguousAliases_M2 ? static_cast<MyGame::Example::Monster *>(mutable_any_ambiguous()) : nullptr;\n  }\n  MyGame::Example::Monster *mutable_any_ambiguous_as_M3() {\n    return any_ambiguous_type() == MyGame::Example::AnyAmbiguousAliases_M3 ? static_cast<MyGame::Example::Monster *>(mutable_any_ambiguous()) : nullptr;\n  }\n  void *mutable_any_ambiguous() {\n    return GetPointer<void *>(VT_ANY_AMBIGUOUS);\n  }\n  const ::flatbuffers::Vector<uint8_t> *vector_of_enums() const {\n    return GetPointer<const ::flatbuffers::Vector<uint8_t> *>(VT_VECTOR_OF_ENUMS);\n  }\n  ::flatbuffers::Vector<uint8_t> *mutable_vector_of_enums() {\n    return GetPointer<::flatbuffers::Vector<uint8_t> *>(VT_VECTOR_OF_ENUMS);\n  }\n  MyGame::Example::Race signed_enum() const {\n    return static_cast<MyGame::Example::Race>(GetField<int8_t>(VT_SIGNED_ENUM, -1));\n  }\n  bool mutate_signed_enum(MyGame::Example::Race _signed_enum = static_cast<MyGame::Example::Race>(-1)) {\n    return SetField<int8_t>(VT_SIGNED_ENUM, static_cast<int8_t>(_signed_enum), -1);\n  }\n  const ::flatbuffers::Vector<uint8_t> *testrequirednestedflatbuffer() const {\n    return GetPointer<const ::flatbuffers::Vector<uint8_t> *>(VT_TESTREQUIREDNESTEDFLATBUFFER);\n  }\n  ::flatbuffers::Vector<uint8_t> *mutable_testrequirednestedflatbuffer() {\n    return GetPointer<::flatbuffers::Vector<uint8_t> *>(VT_TESTREQUIREDNESTEDFLATBUFFER);\n  }\n  const MyGame::Example::Monster *testrequirednestedflatbuffer_nested_root() const {\n    const auto _f = testrequirednestedflatbuffer();\n    return _f ? ::flatbuffers::GetRoot<MyGame::Example::Monster>(_f->Data())\n              : nullptr;\n  }\n  const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Stat>> *scalar_key_sorted_tables() const {\n    return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Stat>> *>(VT_SCALAR_KEY_SORTED_TABLES);\n  }\n  ::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Stat>> *mutable_scalar_key_sorted_tables() {\n    return GetPointer<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Stat>> *>(VT_SCALAR_KEY_SORTED_TABLES);\n  }\n  const MyGame::Example::Test *native_inline() const {\n    return GetStruct<const MyGame::Example::Test *>(VT_NATIVE_INLINE);\n  }\n  MyGame::Example::Test *mutable_native_inline() {\n    return GetStruct<MyGame::Example::Test *>(VT_NATIVE_INLINE);\n  }\n  MyGame::Example::LongEnum long_enum_non_enum_default() const {\n    return static_cast<MyGame::Example::LongEnum>(GetField<uint64_t>(VT_LONG_ENUM_NON_ENUM_DEFAULT, 0));\n  }\n  bool mutate_long_enum_non_enum_default(MyGame::Example::LongEnum _long_enum_non_enum_default = static_cast<MyGame::Example::LongEnum>(0)) {\n    return SetField<uint64_t>(VT_LONG_ENUM_NON_ENUM_DEFAULT, static_cast<uint64_t>(_long_enum_non_enum_default), 0);\n  }\n  MyGame::Example::LongEnum long_enum_normal_default() const {\n    return static_cast<MyGame::Example::LongEnum>(GetField<uint64_t>(VT_LONG_ENUM_NORMAL_DEFAULT, 2ULL));\n  }\n  bool mutate_long_enum_normal_default(MyGame::Example::LongEnum _long_enum_normal_default = static_cast<MyGame::Example::LongEnum>(2ULL)) {\n    return SetField<uint64_t>(VT_LONG_ENUM_NORMAL_DEFAULT, static_cast<uint64_t>(_long_enum_normal_default), 2ULL);\n  }\n  float nan_default() const {\n    return GetField<float>(VT_NAN_DEFAULT, std::numeric_limits<float>::quiet_NaN());\n  }\n  bool mutate_nan_default(float _nan_default = std::numeric_limits<float>::quiet_NaN()) {\n    return SetField<float>(VT_NAN_DEFAULT, _nan_default, std::numeric_limits<float>::quiet_NaN());\n  }\n  float inf_default() const {\n    return GetField<float>(VT_INF_DEFAULT, std::numeric_limits<float>::infinity());\n  }\n  bool mutate_inf_default(float _inf_default = std::numeric_limits<float>::infinity()) {\n    return SetField<float>(VT_INF_DEFAULT, _inf_default, std::numeric_limits<float>::infinity());\n  }\n  float positive_inf_default() const {\n    return GetField<float>(VT_POSITIVE_INF_DEFAULT, std::numeric_limits<float>::infinity());\n  }\n  bool mutate_positive_inf_default(float _positive_inf_default = std::numeric_limits<float>::infinity()) {\n    return SetField<float>(VT_POSITIVE_INF_DEFAULT, _positive_inf_default, std::numeric_limits<float>::infinity());\n  }\n  float infinity_default() const {\n    return GetField<float>(VT_INFINITY_DEFAULT, std::numeric_limits<float>::infinity());\n  }\n  bool mutate_infinity_default(float _infinity_default = std::numeric_limits<float>::infinity()) {\n    return SetField<float>(VT_INFINITY_DEFAULT, _infinity_default, std::numeric_limits<float>::infinity());\n  }\n  float positive_infinity_default() const {\n    return GetField<float>(VT_POSITIVE_INFINITY_DEFAULT, std::numeric_limits<float>::infinity());\n  }\n  bool mutate_positive_infinity_default(float _positive_infinity_default = std::numeric_limits<float>::infinity()) {\n    return SetField<float>(VT_POSITIVE_INFINITY_DEFAULT, _positive_infinity_default, std::numeric_limits<float>::infinity());\n  }\n  float negative_inf_default() const {\n    return GetField<float>(VT_NEGATIVE_INF_DEFAULT, -std::numeric_limits<float>::infinity());\n  }\n  bool mutate_negative_inf_default(float _negative_inf_default = -std::numeric_limits<float>::infinity()) {\n    return SetField<float>(VT_NEGATIVE_INF_DEFAULT, _negative_inf_default, -std::numeric_limits<float>::infinity());\n  }\n  float negative_infinity_default() const {\n    return GetField<float>(VT_NEGATIVE_INFINITY_DEFAULT, -std::numeric_limits<float>::infinity());\n  }\n  bool mutate_negative_infinity_default(float _negative_infinity_default = -std::numeric_limits<float>::infinity()) {\n    return SetField<float>(VT_NEGATIVE_INFINITY_DEFAULT, _negative_infinity_default, -std::numeric_limits<float>::infinity());\n  }\n  double double_inf_default() const {\n    return GetField<double>(VT_DOUBLE_INF_DEFAULT, std::numeric_limits<double>::infinity());\n  }\n  bool mutate_double_inf_default(double _double_inf_default = std::numeric_limits<double>::infinity()) {\n    return SetField<double>(VT_DOUBLE_INF_DEFAULT, _double_inf_default, std::numeric_limits<double>::infinity());\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyField<MyGame::Example::Vec3>(verifier, VT_POS, 8) &&\n           VerifyField<int16_t>(verifier, VT_MANA, 2) &&\n           VerifyField<int16_t>(verifier, VT_HP, 2) &&\n           VerifyOffsetRequired(verifier, VT_NAME) &&\n           verifier.VerifyString(name()) &&\n           VerifyOffset(verifier, VT_INVENTORY) &&\n           verifier.VerifyVector(inventory()) &&\n           VerifyField<uint8_t>(verifier, VT_COLOR, 1) &&\n           VerifyField<uint8_t>(verifier, VT_TEST_TYPE, 1) &&\n           VerifyOffset(verifier, VT_TEST) &&\n           VerifyAny(verifier, test(), test_type()) &&\n           VerifyOffset(verifier, VT_TEST4) &&\n           verifier.VerifyVector(test4()) &&\n           VerifyOffset(verifier, VT_TESTARRAYOFSTRING) &&\n           verifier.VerifyVector(testarrayofstring()) &&\n           verifier.VerifyVectorOfStrings(testarrayofstring()) &&\n           VerifyOffset(verifier, VT_TESTARRAYOFTABLES) &&\n           verifier.VerifyVector(testarrayoftables()) &&\n           verifier.VerifyVectorOfTables(testarrayoftables()) &&\n           VerifyOffset(verifier, VT_ENEMY) &&\n           verifier.VerifyTable(enemy()) &&\n           VerifyOffset(verifier, VT_TESTNESTEDFLATBUFFER) &&\n           verifier.VerifyVector(testnestedflatbuffer()) &&\n           verifier.template VerifyNestedFlatBuffer<MyGame::Example::Monster>(testnestedflatbuffer(), nullptr) &&\n           VerifyOffset(verifier, VT_TESTEMPTY) &&\n           verifier.VerifyTable(testempty()) &&\n           VerifyField<uint8_t>(verifier, VT_TESTBOOL, 1) &&\n           VerifyField<int32_t>(verifier, VT_TESTHASHS32_FNV1, 4) &&\n           VerifyField<uint32_t>(verifier, VT_TESTHASHU32_FNV1, 4) &&\n           VerifyField<int64_t>(verifier, VT_TESTHASHS64_FNV1, 8) &&\n           VerifyField<uint64_t>(verifier, VT_TESTHASHU64_FNV1, 8) &&\n           VerifyField<int32_t>(verifier, VT_TESTHASHS32_FNV1A, 4) &&\n           VerifyField<uint32_t>(verifier, VT_TESTHASHU32_FNV1A, 4) &&\n           VerifyField<int64_t>(verifier, VT_TESTHASHS64_FNV1A, 8) &&\n           VerifyField<uint64_t>(verifier, VT_TESTHASHU64_FNV1A, 8) &&\n           VerifyOffset(verifier, VT_TESTARRAYOFBOOLS) &&\n           verifier.VerifyVector(testarrayofbools()) &&\n           VerifyField<float>(verifier, VT_TESTF, 4) &&\n           VerifyField<float>(verifier, VT_TESTF2, 4) &&\n           VerifyField<float>(verifier, VT_TESTF3, 4) &&\n           VerifyOffset(verifier, VT_TESTARRAYOFSTRING2) &&\n           verifier.VerifyVector(testarrayofstring2()) &&\n           verifier.VerifyVectorOfStrings(testarrayofstring2()) &&\n           VerifyOffset(verifier, VT_TESTARRAYOFSORTEDSTRUCT) &&\n           verifier.VerifyVector(testarrayofsortedstruct()) &&\n           VerifyOffset(verifier, VT_FLEX) &&\n           verifier.VerifyVector(flex()) &&\n           flexbuffers::VerifyNestedFlexBuffer(flex(), verifier) &&\n           VerifyOffset(verifier, VT_TEST5) &&\n           verifier.VerifyVector(test5()) &&\n           VerifyOffset(verifier, VT_VECTOR_OF_LONGS) &&\n           verifier.VerifyVector(vector_of_longs()) &&\n           VerifyOffset(verifier, VT_VECTOR_OF_DOUBLES) &&\n           verifier.VerifyVector(vector_of_doubles()) &&\n           VerifyOffset(verifier, VT_PARENT_NAMESPACE_TEST) &&\n           verifier.VerifyTable(parent_namespace_test()) &&\n           VerifyOffset(verifier, VT_VECTOR_OF_REFERRABLES) &&\n           verifier.VerifyVector(vector_of_referrables()) &&\n           verifier.VerifyVectorOfTables(vector_of_referrables()) &&\n           VerifyField<uint64_t>(verifier, VT_SINGLE_WEAK_REFERENCE, 8) &&\n           VerifyOffset(verifier, VT_VECTOR_OF_WEAK_REFERENCES) &&\n           verifier.VerifyVector(vector_of_weak_references()) &&\n           VerifyOffset(verifier, VT_VECTOR_OF_STRONG_REFERRABLES) &&\n           verifier.VerifyVector(vector_of_strong_referrables()) &&\n           verifier.VerifyVectorOfTables(vector_of_strong_referrables()) &&\n           VerifyField<uint64_t>(verifier, VT_CO_OWNING_REFERENCE, 8) &&\n           VerifyOffset(verifier, VT_VECTOR_OF_CO_OWNING_REFERENCES) &&\n           verifier.VerifyVector(vector_of_co_owning_references()) &&\n           VerifyField<uint64_t>(verifier, VT_NON_OWNING_REFERENCE, 8) &&\n           VerifyOffset(verifier, VT_VECTOR_OF_NON_OWNING_REFERENCES) &&\n           verifier.VerifyVector(vector_of_non_owning_references()) &&\n           VerifyField<uint8_t>(verifier, VT_ANY_UNIQUE_TYPE, 1) &&\n           VerifyOffset(verifier, VT_ANY_UNIQUE) &&\n           VerifyAnyUniqueAliases(verifier, any_unique(), any_unique_type()) &&\n           VerifyField<uint8_t>(verifier, VT_ANY_AMBIGUOUS_TYPE, 1) &&\n           VerifyOffset(verifier, VT_ANY_AMBIGUOUS) &&\n           VerifyAnyAmbiguousAliases(verifier, any_ambiguous(), any_ambiguous_type()) &&\n           VerifyOffset(verifier, VT_VECTOR_OF_ENUMS) &&\n           verifier.VerifyVector(vector_of_enums()) &&\n           VerifyField<int8_t>(verifier, VT_SIGNED_ENUM, 1) &&\n           VerifyOffset(verifier, VT_TESTREQUIREDNESTEDFLATBUFFER) &&\n           verifier.VerifyVector(testrequirednestedflatbuffer()) &&\n           verifier.template VerifyNestedFlatBuffer<MyGame::Example::Monster>(testrequirednestedflatbuffer(), nullptr) &&\n           VerifyOffset(verifier, VT_SCALAR_KEY_SORTED_TABLES) &&\n           verifier.VerifyVector(scalar_key_sorted_tables()) &&\n           verifier.VerifyVectorOfTables(scalar_key_sorted_tables()) &&\n           VerifyField<MyGame::Example::Test>(verifier, VT_NATIVE_INLINE, 2) &&\n           VerifyField<uint64_t>(verifier, VT_LONG_ENUM_NON_ENUM_DEFAULT, 8) &&\n           VerifyField<uint64_t>(verifier, VT_LONG_ENUM_NORMAL_DEFAULT, 8) &&\n           VerifyField<float>(verifier, VT_NAN_DEFAULT, 4) &&\n           VerifyField<float>(verifier, VT_INF_DEFAULT, 4) &&\n           VerifyField<float>(verifier, VT_POSITIVE_INF_DEFAULT, 4) &&\n           VerifyField<float>(verifier, VT_INFINITY_DEFAULT, 4) &&\n           VerifyField<float>(verifier, VT_POSITIVE_INFINITY_DEFAULT, 4) &&\n           VerifyField<float>(verifier, VT_NEGATIVE_INF_DEFAULT, 4) &&\n           VerifyField<float>(verifier, VT_NEGATIVE_INFINITY_DEFAULT, 4) &&\n           VerifyField<double>(verifier, VT_DOUBLE_INF_DEFAULT, 8) &&\n           verifier.EndTable();\n  }\n  MonsterT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  void UnPackTo(MonsterT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  static ::flatbuffers::Offset<Monster> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n};\n\ntemplate<> inline const MyGame::Example::Monster *Monster::test_as<MyGame::Example::Monster>() const {\n  return test_as_Monster();\n}\n\ntemplate<> inline MyGame::Example::Monster *Monster::mutable_test_as<MyGame::Example::Monster>() {\n  return mutable_test_as_Monster();\n}\n\ntemplate<> inline const MyGame::Example::TestSimpleTableWithEnum *Monster::test_as<MyGame::Example::TestSimpleTableWithEnum>() const {\n  return test_as_TestSimpleTableWithEnum();\n}\n\ntemplate<> inline MyGame::Example::TestSimpleTableWithEnum *Monster::mutable_test_as<MyGame::Example::TestSimpleTableWithEnum>() {\n  return mutable_test_as_TestSimpleTableWithEnum();\n}\n\ntemplate<> inline const MyGame::Example2::Monster *Monster::test_as<MyGame::Example2::Monster>() const {\n  return test_as_MyGame_Example2_Monster();\n}\n\ntemplate<> inline MyGame::Example2::Monster *Monster::mutable_test_as<MyGame::Example2::Monster>() {\n  return mutable_test_as_MyGame_Example2_Monster();\n}\n\ntemplate<> inline const MyGame::Example::Monster *Monster::any_unique_as<MyGame::Example::Monster>() const {\n  return any_unique_as_M();\n}\n\ntemplate<> inline MyGame::Example::Monster *Monster::mutable_any_unique_as<MyGame::Example::Monster>() {\n  return mutable_any_unique_as_M();\n}\n\ntemplate<> inline const MyGame::Example::TestSimpleTableWithEnum *Monster::any_unique_as<MyGame::Example::TestSimpleTableWithEnum>() const {\n  return any_unique_as_TS();\n}\n\ntemplate<> inline MyGame::Example::TestSimpleTableWithEnum *Monster::mutable_any_unique_as<MyGame::Example::TestSimpleTableWithEnum>() {\n  return mutable_any_unique_as_TS();\n}\n\ntemplate<> inline const MyGame::Example2::Monster *Monster::any_unique_as<MyGame::Example2::Monster>() const {\n  return any_unique_as_M2();\n}\n\ntemplate<> inline MyGame::Example2::Monster *Monster::mutable_any_unique_as<MyGame::Example2::Monster>() {\n  return mutable_any_unique_as_M2();\n}\n\nstruct MonsterBuilder {\n  typedef Monster Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_pos(const MyGame::Example::Vec3 *pos) {\n    fbb_.AddStruct(Monster::VT_POS, pos);\n  }\n  void add_mana(int16_t mana) {\n    fbb_.AddElement<int16_t>(Monster::VT_MANA, mana, 150);\n  }\n  void add_hp(int16_t hp) {\n    fbb_.AddElement<int16_t>(Monster::VT_HP, hp, 100);\n  }\n  void add_name(::flatbuffers::Offset<::flatbuffers::String> name) {\n    fbb_.AddOffset(Monster::VT_NAME, name);\n  }\n  void add_inventory(::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> inventory) {\n    fbb_.AddOffset(Monster::VT_INVENTORY, inventory);\n  }\n  void add_color(MyGame::Example::Color color) {\n    fbb_.AddElement<uint8_t>(Monster::VT_COLOR, static_cast<uint8_t>(color), 8);\n  }\n  void add_test_type(MyGame::Example::Any test_type) {\n    fbb_.AddElement<uint8_t>(Monster::VT_TEST_TYPE, static_cast<uint8_t>(test_type), 0);\n  }\n  void add_test(::flatbuffers::Offset<void> test) {\n    fbb_.AddOffset(Monster::VT_TEST, test);\n  }\n  void add_test4(::flatbuffers::Offset<::flatbuffers::Vector<const MyGame::Example::Test *>> test4) {\n    fbb_.AddOffset(Monster::VT_TEST4, test4);\n  }\n  void add_testarrayofstring(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> testarrayofstring) {\n    fbb_.AddOffset(Monster::VT_TESTARRAYOFSTRING, testarrayofstring);\n  }\n  void add_testarrayoftables(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Monster>>> testarrayoftables) {\n    fbb_.AddOffset(Monster::VT_TESTARRAYOFTABLES, testarrayoftables);\n  }\n  void add_enemy(::flatbuffers::Offset<MyGame::Example::Monster> enemy) {\n    fbb_.AddOffset(Monster::VT_ENEMY, enemy);\n  }\n  void add_testnestedflatbuffer(::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> testnestedflatbuffer) {\n    fbb_.AddOffset(Monster::VT_TESTNESTEDFLATBUFFER, testnestedflatbuffer);\n  }\n  void add_testempty(::flatbuffers::Offset<MyGame::Example::Stat> testempty) {\n    fbb_.AddOffset(Monster::VT_TESTEMPTY, testempty);\n  }\n  void add_testbool(bool testbool) {\n    fbb_.AddElement<uint8_t>(Monster::VT_TESTBOOL, static_cast<uint8_t>(testbool), 0);\n  }\n  void add_testhashs32_fnv1(int32_t testhashs32_fnv1) {\n    fbb_.AddElement<int32_t>(Monster::VT_TESTHASHS32_FNV1, testhashs32_fnv1, 0);\n  }\n  void add_testhashu32_fnv1(uint32_t testhashu32_fnv1) {\n    fbb_.AddElement<uint32_t>(Monster::VT_TESTHASHU32_FNV1, testhashu32_fnv1, 0);\n  }\n  void add_testhashs64_fnv1(int64_t testhashs64_fnv1) {\n    fbb_.AddElement<int64_t>(Monster::VT_TESTHASHS64_FNV1, testhashs64_fnv1, 0);\n  }\n  void add_testhashu64_fnv1(uint64_t testhashu64_fnv1) {\n    fbb_.AddElement<uint64_t>(Monster::VT_TESTHASHU64_FNV1, testhashu64_fnv1, 0);\n  }\n  void add_testhashs32_fnv1a(int32_t testhashs32_fnv1a) {\n    fbb_.AddElement<int32_t>(Monster::VT_TESTHASHS32_FNV1A, testhashs32_fnv1a, 0);\n  }\n  void add_testhashu32_fnv1a(uint32_t testhashu32_fnv1a) {\n    fbb_.AddElement<uint32_t>(Monster::VT_TESTHASHU32_FNV1A, testhashu32_fnv1a, 0);\n  }\n  void add_testhashs64_fnv1a(int64_t testhashs64_fnv1a) {\n    fbb_.AddElement<int64_t>(Monster::VT_TESTHASHS64_FNV1A, testhashs64_fnv1a, 0);\n  }\n  void add_testhashu64_fnv1a(uint64_t testhashu64_fnv1a) {\n    fbb_.AddElement<uint64_t>(Monster::VT_TESTHASHU64_FNV1A, testhashu64_fnv1a, 0);\n  }\n  void add_testarrayofbools(::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> testarrayofbools) {\n    fbb_.AddOffset(Monster::VT_TESTARRAYOFBOOLS, testarrayofbools);\n  }\n  void add_testf(float testf) {\n    fbb_.AddElement<float>(Monster::VT_TESTF, testf, 3.14159f);\n  }\n  void add_testf2(float testf2) {\n    fbb_.AddElement<float>(Monster::VT_TESTF2, testf2, 3.0f);\n  }\n  void add_testf3(float testf3) {\n    fbb_.AddElement<float>(Monster::VT_TESTF3, testf3, 0.0f);\n  }\n  void add_testarrayofstring2(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> testarrayofstring2) {\n    fbb_.AddOffset(Monster::VT_TESTARRAYOFSTRING2, testarrayofstring2);\n  }\n  void add_testarrayofsortedstruct(::flatbuffers::Offset<::flatbuffers::Vector<const MyGame::Example::Ability *>> testarrayofsortedstruct) {\n    fbb_.AddOffset(Monster::VT_TESTARRAYOFSORTEDSTRUCT, testarrayofsortedstruct);\n  }\n  void add_flex(::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> flex) {\n    fbb_.AddOffset(Monster::VT_FLEX, flex);\n  }\n  void add_test5(::flatbuffers::Offset<::flatbuffers::Vector<const MyGame::Example::Test *>> test5) {\n    fbb_.AddOffset(Monster::VT_TEST5, test5);\n  }\n  void add_vector_of_longs(::flatbuffers::Offset<::flatbuffers::Vector<int64_t>> vector_of_longs) {\n    fbb_.AddOffset(Monster::VT_VECTOR_OF_LONGS, vector_of_longs);\n  }\n  void add_vector_of_doubles(::flatbuffers::Offset<::flatbuffers::Vector<double>> vector_of_doubles) {\n    fbb_.AddOffset(Monster::VT_VECTOR_OF_DOUBLES, vector_of_doubles);\n  }\n  void add_parent_namespace_test(::flatbuffers::Offset<MyGame::InParentNamespace> parent_namespace_test) {\n    fbb_.AddOffset(Monster::VT_PARENT_NAMESPACE_TEST, parent_namespace_test);\n  }\n  void add_vector_of_referrables(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>>> vector_of_referrables) {\n    fbb_.AddOffset(Monster::VT_VECTOR_OF_REFERRABLES, vector_of_referrables);\n  }\n  void add_single_weak_reference(uint64_t single_weak_reference) {\n    fbb_.AddElement<uint64_t>(Monster::VT_SINGLE_WEAK_REFERENCE, single_weak_reference, 0);\n  }\n  void add_vector_of_weak_references(::flatbuffers::Offset<::flatbuffers::Vector<uint64_t>> vector_of_weak_references) {\n    fbb_.AddOffset(Monster::VT_VECTOR_OF_WEAK_REFERENCES, vector_of_weak_references);\n  }\n  void add_vector_of_strong_referrables(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>>> vector_of_strong_referrables) {\n    fbb_.AddOffset(Monster::VT_VECTOR_OF_STRONG_REFERRABLES, vector_of_strong_referrables);\n  }\n  void add_co_owning_reference(uint64_t co_owning_reference) {\n    fbb_.AddElement<uint64_t>(Monster::VT_CO_OWNING_REFERENCE, co_owning_reference, 0);\n  }\n  void add_vector_of_co_owning_references(::flatbuffers::Offset<::flatbuffers::Vector<uint64_t>> vector_of_co_owning_references) {\n    fbb_.AddOffset(Monster::VT_VECTOR_OF_CO_OWNING_REFERENCES, vector_of_co_owning_references);\n  }\n  void add_non_owning_reference(uint64_t non_owning_reference) {\n    fbb_.AddElement<uint64_t>(Monster::VT_NON_OWNING_REFERENCE, non_owning_reference, 0);\n  }\n  void add_vector_of_non_owning_references(::flatbuffers::Offset<::flatbuffers::Vector<uint64_t>> vector_of_non_owning_references) {\n    fbb_.AddOffset(Monster::VT_VECTOR_OF_NON_OWNING_REFERENCES, vector_of_non_owning_references);\n  }\n  void add_any_unique_type(MyGame::Example::AnyUniqueAliases any_unique_type) {\n    fbb_.AddElement<uint8_t>(Monster::VT_ANY_UNIQUE_TYPE, static_cast<uint8_t>(any_unique_type), 0);\n  }\n  void add_any_unique(::flatbuffers::Offset<void> any_unique) {\n    fbb_.AddOffset(Monster::VT_ANY_UNIQUE, any_unique);\n  }\n  void add_any_ambiguous_type(MyGame::Example::AnyAmbiguousAliases any_ambiguous_type) {\n    fbb_.AddElement<uint8_t>(Monster::VT_ANY_AMBIGUOUS_TYPE, static_cast<uint8_t>(any_ambiguous_type), 0);\n  }\n  void add_any_ambiguous(::flatbuffers::Offset<void> any_ambiguous) {\n    fbb_.AddOffset(Monster::VT_ANY_AMBIGUOUS, any_ambiguous);\n  }\n  void add_vector_of_enums(::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> vector_of_enums) {\n    fbb_.AddOffset(Monster::VT_VECTOR_OF_ENUMS, vector_of_enums);\n  }\n  void add_signed_enum(MyGame::Example::Race signed_enum) {\n    fbb_.AddElement<int8_t>(Monster::VT_SIGNED_ENUM, static_cast<int8_t>(signed_enum), -1);\n  }\n  void add_testrequirednestedflatbuffer(::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> testrequirednestedflatbuffer) {\n    fbb_.AddOffset(Monster::VT_TESTREQUIREDNESTEDFLATBUFFER, testrequirednestedflatbuffer);\n  }\n  void add_scalar_key_sorted_tables(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Stat>>> scalar_key_sorted_tables) {\n    fbb_.AddOffset(Monster::VT_SCALAR_KEY_SORTED_TABLES, scalar_key_sorted_tables);\n  }\n  void add_native_inline(const MyGame::Example::Test *native_inline) {\n    fbb_.AddStruct(Monster::VT_NATIVE_INLINE, native_inline);\n  }\n  void add_long_enum_non_enum_default(MyGame::Example::LongEnum long_enum_non_enum_default) {\n    fbb_.AddElement<uint64_t>(Monster::VT_LONG_ENUM_NON_ENUM_DEFAULT, static_cast<uint64_t>(long_enum_non_enum_default), 0);\n  }\n  void add_long_enum_normal_default(MyGame::Example::LongEnum long_enum_normal_default) {\n    fbb_.AddElement<uint64_t>(Monster::VT_LONG_ENUM_NORMAL_DEFAULT, static_cast<uint64_t>(long_enum_normal_default), 2ULL);\n  }\n  void add_nan_default(float nan_default) {\n    fbb_.AddElement<float>(Monster::VT_NAN_DEFAULT, nan_default, std::numeric_limits<float>::quiet_NaN());\n  }\n  void add_inf_default(float inf_default) {\n    fbb_.AddElement<float>(Monster::VT_INF_DEFAULT, inf_default, std::numeric_limits<float>::infinity());\n  }\n  void add_positive_inf_default(float positive_inf_default) {\n    fbb_.AddElement<float>(Monster::VT_POSITIVE_INF_DEFAULT, positive_inf_default, std::numeric_limits<float>::infinity());\n  }\n  void add_infinity_default(float infinity_default) {\n    fbb_.AddElement<float>(Monster::VT_INFINITY_DEFAULT, infinity_default, std::numeric_limits<float>::infinity());\n  }\n  void add_positive_infinity_default(float positive_infinity_default) {\n    fbb_.AddElement<float>(Monster::VT_POSITIVE_INFINITY_DEFAULT, positive_infinity_default, std::numeric_limits<float>::infinity());\n  }\n  void add_negative_inf_default(float negative_inf_default) {\n    fbb_.AddElement<float>(Monster::VT_NEGATIVE_INF_DEFAULT, negative_inf_default, -std::numeric_limits<float>::infinity());\n  }\n  void add_negative_infinity_default(float negative_infinity_default) {\n    fbb_.AddElement<float>(Monster::VT_NEGATIVE_INFINITY_DEFAULT, negative_infinity_default, -std::numeric_limits<float>::infinity());\n  }\n  void add_double_inf_default(double double_inf_default) {\n    fbb_.AddElement<double>(Monster::VT_DOUBLE_INF_DEFAULT, double_inf_default, std::numeric_limits<double>::infinity());\n  }\n  explicit MonsterBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<Monster> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<Monster>(end);\n    fbb_.Required(o, Monster::VT_NAME);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<Monster> CreateMonster(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    const MyGame::Example::Vec3 *pos = nullptr,\n    int16_t mana = 150,\n    int16_t hp = 100,\n    ::flatbuffers::Offset<::flatbuffers::String> name = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> inventory = 0,\n    MyGame::Example::Color color = MyGame::Example::Color_Blue,\n    MyGame::Example::Any test_type = MyGame::Example::Any_NONE,\n    ::flatbuffers::Offset<void> test = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<const MyGame::Example::Test *>> test4 = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> testarrayofstring = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Monster>>> testarrayoftables = 0,\n    ::flatbuffers::Offset<MyGame::Example::Monster> enemy = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> testnestedflatbuffer = 0,\n    ::flatbuffers::Offset<MyGame::Example::Stat> testempty = 0,\n    bool testbool = false,\n    int32_t testhashs32_fnv1 = 0,\n    uint32_t testhashu32_fnv1 = 0,\n    int64_t testhashs64_fnv1 = 0,\n    uint64_t testhashu64_fnv1 = 0,\n    int32_t testhashs32_fnv1a = 0,\n    uint32_t testhashu32_fnv1a = 0,\n    int64_t testhashs64_fnv1a = 0,\n    uint64_t testhashu64_fnv1a = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> testarrayofbools = 0,\n    float testf = 3.14159f,\n    float testf2 = 3.0f,\n    float testf3 = 0.0f,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> testarrayofstring2 = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<const MyGame::Example::Ability *>> testarrayofsortedstruct = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> flex = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<const MyGame::Example::Test *>> test5 = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<int64_t>> vector_of_longs = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<double>> vector_of_doubles = 0,\n    ::flatbuffers::Offset<MyGame::InParentNamespace> parent_namespace_test = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>>> vector_of_referrables = 0,\n    uint64_t single_weak_reference = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<uint64_t>> vector_of_weak_references = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Referrable>>> vector_of_strong_referrables = 0,\n    uint64_t co_owning_reference = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<uint64_t>> vector_of_co_owning_references = 0,\n    uint64_t non_owning_reference = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<uint64_t>> vector_of_non_owning_references = 0,\n    MyGame::Example::AnyUniqueAliases any_unique_type = MyGame::Example::AnyUniqueAliases_NONE,\n    ::flatbuffers::Offset<void> any_unique = 0,\n    MyGame::Example::AnyAmbiguousAliases any_ambiguous_type = MyGame::Example::AnyAmbiguousAliases_NONE,\n    ::flatbuffers::Offset<void> any_ambiguous = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> vector_of_enums = 0,\n    MyGame::Example::Race signed_enum = MyGame::Example::Race_None,\n    ::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> testrequirednestedflatbuffer = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<MyGame::Example::Stat>>> scalar_key_sorted_tables = 0,\n    const MyGame::Example::Test *native_inline = nullptr,\n    MyGame::Example::LongEnum long_enum_non_enum_default = static_cast<MyGame::Example::LongEnum>(0),\n    MyGame::Example::LongEnum long_enum_normal_default = MyGame::Example::LongEnum_LongOne,\n    float nan_default = std::numeric_limits<float>::quiet_NaN(),\n    float inf_default = std::numeric_limits<float>::infinity(),\n    float positive_inf_default = std::numeric_limits<float>::infinity(),\n    float infinity_default = std::numeric_limits<float>::infinity(),\n    float positive_infinity_default = std::numeric_limits<float>::infinity(),\n    float negative_inf_default = -std::numeric_limits<float>::infinity(),\n    float negative_infinity_default = -std::numeric_limits<float>::infinity(),\n    double double_inf_default = std::numeric_limits<double>::infinity()) {\n  MonsterBuilder builder_(_fbb);\n  builder_.add_double_inf_default(double_inf_default);\n  builder_.add_long_enum_normal_default(long_enum_normal_default);\n  builder_.add_long_enum_non_enum_default(long_enum_non_enum_default);\n  builder_.add_non_owning_reference(non_owning_reference);\n  builder_.add_co_owning_reference(co_owning_reference);\n  builder_.add_single_weak_reference(single_weak_reference);\n  builder_.add_testhashu64_fnv1a(testhashu64_fnv1a);\n  builder_.add_testhashs64_fnv1a(testhashs64_fnv1a);\n  builder_.add_testhashu64_fnv1(testhashu64_fnv1);\n  builder_.add_testhashs64_fnv1(testhashs64_fnv1);\n  builder_.add_negative_infinity_default(negative_infinity_default);\n  builder_.add_negative_inf_default(negative_inf_default);\n  builder_.add_positive_infinity_default(positive_infinity_default);\n  builder_.add_infinity_default(infinity_default);\n  builder_.add_positive_inf_default(positive_inf_default);\n  builder_.add_inf_default(inf_default);\n  builder_.add_nan_default(nan_default);\n  builder_.add_native_inline(native_inline);\n  builder_.add_scalar_key_sorted_tables(scalar_key_sorted_tables);\n  builder_.add_testrequirednestedflatbuffer(testrequirednestedflatbuffer);\n  builder_.add_vector_of_enums(vector_of_enums);\n  builder_.add_any_ambiguous(any_ambiguous);\n  builder_.add_any_unique(any_unique);\n  builder_.add_vector_of_non_owning_references(vector_of_non_owning_references);\n  builder_.add_vector_of_co_owning_references(vector_of_co_owning_references);\n  builder_.add_vector_of_strong_referrables(vector_of_strong_referrables);\n  builder_.add_vector_of_weak_references(vector_of_weak_references);\n  builder_.add_vector_of_referrables(vector_of_referrables);\n  builder_.add_parent_namespace_test(parent_namespace_test);\n  builder_.add_vector_of_doubles(vector_of_doubles);\n  builder_.add_vector_of_longs(vector_of_longs);\n  builder_.add_test5(test5);\n  builder_.add_flex(flex);\n  builder_.add_testarrayofsortedstruct(testarrayofsortedstruct);\n  builder_.add_testarrayofstring2(testarrayofstring2);\n  builder_.add_testf3(testf3);\n  builder_.add_testf2(testf2);\n  builder_.add_testf(testf);\n  builder_.add_testarrayofbools(testarrayofbools);\n  builder_.add_testhashu32_fnv1a(testhashu32_fnv1a);\n  builder_.add_testhashs32_fnv1a(testhashs32_fnv1a);\n  builder_.add_testhashu32_fnv1(testhashu32_fnv1);\n  builder_.add_testhashs32_fnv1(testhashs32_fnv1);\n  builder_.add_testempty(testempty);\n  builder_.add_testnestedflatbuffer(testnestedflatbuffer);\n  builder_.add_enemy(enemy);\n  builder_.add_testarrayoftables(testarrayoftables);\n  builder_.add_testarrayofstring(testarrayofstring);\n  builder_.add_test4(test4);\n  builder_.add_test(test);\n  builder_.add_inventory(inventory);\n  builder_.add_name(name);\n  builder_.add_pos(pos);\n  builder_.add_hp(hp);\n  builder_.add_mana(mana);\n  builder_.add_signed_enum(signed_enum);\n  builder_.add_any_ambiguous_type(any_ambiguous_type);\n  builder_.add_any_unique_type(any_unique_type);\n  builder_.add_testbool(testbool);\n  builder_.add_test_type(test_type);\n  builder_.add_color(color);\n  return builder_.Finish();\n}\n\ninline ::flatbuffers::Offset<Monster> CreateMonsterDirect(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    const MyGame::Example::Vec3 *pos = nullptr,\n    int16_t mana = 150,\n    int16_t hp = 100,\n    const char *name = nullptr,\n    const std::vector<uint8_t> *inventory = nullptr,\n    MyGame::Example::Color color = MyGame::Example::Color_Blue,\n    MyGame::Example::Any test_type = MyGame::Example::Any_NONE,\n    ::flatbuffers::Offset<void> test = 0,\n    const std::vector<MyGame::Example::Test> *test4 = nullptr,\n    const std::vector<::flatbuffers::Offset<::flatbuffers::String>> *testarrayofstring = nullptr,\n    std::vector<::flatbuffers::Offset<MyGame::Example::Monster>> *testarrayoftables = nullptr,\n    ::flatbuffers::Offset<MyGame::Example::Monster> enemy = 0,\n    const std::vector<uint8_t> *testnestedflatbuffer = nullptr,\n    ::flatbuffers::Offset<MyGame::Example::Stat> testempty = 0,\n    bool testbool = false,\n    int32_t testhashs32_fnv1 = 0,\n    uint32_t testhashu32_fnv1 = 0,\n    int64_t testhashs64_fnv1 = 0,\n    uint64_t testhashu64_fnv1 = 0,\n    int32_t testhashs32_fnv1a = 0,\n    uint32_t testhashu32_fnv1a = 0,\n    int64_t testhashs64_fnv1a = 0,\n    uint64_t testhashu64_fnv1a = 0,\n    const std::vector<uint8_t> *testarrayofbools = nullptr,\n    float testf = 3.14159f,\n    float testf2 = 3.0f,\n    float testf3 = 0.0f,\n    const std::vector<::flatbuffers::Offset<::flatbuffers::String>> *testarrayofstring2 = nullptr,\n    std::vector<MyGame::Example::Ability> *testarrayofsortedstruct = nullptr,\n    const std::vector<uint8_t> *flex = nullptr,\n    const std::vector<MyGame::Example::Test> *test5 = nullptr,\n    const std::vector<int64_t> *vector_of_longs = nullptr,\n    const std::vector<double> *vector_of_doubles = nullptr,\n    ::flatbuffers::Offset<MyGame::InParentNamespace> parent_namespace_test = 0,\n    std::vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *vector_of_referrables = nullptr,\n    uint64_t single_weak_reference = 0,\n    const std::vector<uint64_t> *vector_of_weak_references = nullptr,\n    std::vector<::flatbuffers::Offset<MyGame::Example::Referrable>> *vector_of_strong_referrables = nullptr,\n    uint64_t co_owning_reference = 0,\n    const std::vector<uint64_t> *vector_of_co_owning_references = nullptr,\n    uint64_t non_owning_reference = 0,\n    const std::vector<uint64_t> *vector_of_non_owning_references = nullptr,\n    MyGame::Example::AnyUniqueAliases any_unique_type = MyGame::Example::AnyUniqueAliases_NONE,\n    ::flatbuffers::Offset<void> any_unique = 0,\n    MyGame::Example::AnyAmbiguousAliases any_ambiguous_type = MyGame::Example::AnyAmbiguousAliases_NONE,\n    ::flatbuffers::Offset<void> any_ambiguous = 0,\n    const std::vector<uint8_t> *vector_of_enums = nullptr,\n    MyGame::Example::Race signed_enum = MyGame::Example::Race_None,\n    const std::vector<uint8_t> *testrequirednestedflatbuffer = nullptr,\n    std::vector<::flatbuffers::Offset<MyGame::Example::Stat>> *scalar_key_sorted_tables = nullptr,\n    const MyGame::Example::Test *native_inline = nullptr,\n    MyGame::Example::LongEnum long_enum_non_enum_default = static_cast<MyGame::Example::LongEnum>(0),\n    MyGame::Example::LongEnum long_enum_normal_default = MyGame::Example::LongEnum_LongOne,\n    float nan_default = std::numeric_limits<float>::quiet_NaN(),\n    float inf_default = std::numeric_limits<float>::infinity(),\n    float positive_inf_default = std::numeric_limits<float>::infinity(),\n    float infinity_default = std::numeric_limits<float>::infinity(),\n    float positive_infinity_default = std::numeric_limits<float>::infinity(),\n    float negative_inf_default = -std::numeric_limits<float>::infinity(),\n    float negative_infinity_default = -std::numeric_limits<float>::infinity(),\n    double double_inf_default = std::numeric_limits<double>::infinity()) {\n  auto name__ = name ? _fbb.CreateString(name) : 0;\n  auto inventory__ = inventory ? _fbb.CreateVector<uint8_t>(*inventory) : 0;\n  auto test4__ = test4 ? _fbb.CreateVectorOfStructs<MyGame::Example::Test>(*test4) : 0;\n  auto testarrayofstring__ = testarrayofstring ? _fbb.CreateVector<::flatbuffers::Offset<::flatbuffers::String>>(*testarrayofstring) : 0;\n  auto testarrayoftables__ = testarrayoftables ? _fbb.CreateVectorOfSortedTables<MyGame::Example::Monster>(testarrayoftables) : 0;\n  auto testnestedflatbuffer__ = testnestedflatbuffer ? _fbb.CreateVector<uint8_t>(*testnestedflatbuffer) : 0;\n  auto testarrayofbools__ = testarrayofbools ? _fbb.CreateVector<uint8_t>(*testarrayofbools) : 0;\n  auto testarrayofstring2__ = testarrayofstring2 ? _fbb.CreateVector<::flatbuffers::Offset<::flatbuffers::String>>(*testarrayofstring2) : 0;\n  auto testarrayofsortedstruct__ = testarrayofsortedstruct ? _fbb.CreateVectorOfSortedStructs<MyGame::Example::Ability>(testarrayofsortedstruct) : 0;\n  auto flex__ = flex ? _fbb.CreateVector<uint8_t>(*flex) : 0;\n  auto test5__ = test5 ? _fbb.CreateVectorOfStructs<MyGame::Example::Test>(*test5) : 0;\n  auto vector_of_longs__ = vector_of_longs ? _fbb.CreateVector<int64_t>(*vector_of_longs) : 0;\n  auto vector_of_doubles__ = vector_of_doubles ? _fbb.CreateVector<double>(*vector_of_doubles) : 0;\n  auto vector_of_referrables__ = vector_of_referrables ? _fbb.CreateVectorOfSortedTables<MyGame::Example::Referrable>(vector_of_referrables) : 0;\n  auto vector_of_weak_references__ = vector_of_weak_references ? _fbb.CreateVector<uint64_t>(*vector_of_weak_references) : 0;\n  auto vector_of_strong_referrables__ = vector_of_strong_referrables ? _fbb.CreateVectorOfSortedTables<MyGame::Example::Referrable>(vector_of_strong_referrables) : 0;\n  auto vector_of_co_owning_references__ = vector_of_co_owning_references ? _fbb.CreateVector<uint64_t>(*vector_of_co_owning_references) : 0;\n  auto vector_of_non_owning_references__ = vector_of_non_owning_references ? _fbb.CreateVector<uint64_t>(*vector_of_non_owning_references) : 0;\n  auto vector_of_enums__ = vector_of_enums ? _fbb.CreateVector<uint8_t>(*vector_of_enums) : 0;\n  auto testrequirednestedflatbuffer__ = testrequirednestedflatbuffer ? _fbb.CreateVector<uint8_t>(*testrequirednestedflatbuffer) : 0;\n  auto scalar_key_sorted_tables__ = scalar_key_sorted_tables ? _fbb.CreateVectorOfSortedTables<MyGame::Example::Stat>(scalar_key_sorted_tables) : 0;\n  return MyGame::Example::CreateMonster(\n      _fbb,\n      pos,\n      mana,\n      hp,\n      name__,\n      inventory__,\n      color,\n      test_type,\n      test,\n      test4__,\n      testarrayofstring__,\n      testarrayoftables__,\n      enemy,\n      testnestedflatbuffer__,\n      testempty,\n      testbool,\n      testhashs32_fnv1,\n      testhashu32_fnv1,\n      testhashs64_fnv1,\n      testhashu64_fnv1,\n      testhashs32_fnv1a,\n      testhashu32_fnv1a,\n      testhashs64_fnv1a,\n      testhashu64_fnv1a,\n      testarrayofbools__,\n      testf,\n      testf2,\n      testf3,\n      testarrayofstring2__,\n      testarrayofsortedstruct__,\n      flex__,\n      test5__,\n      vector_of_longs__,\n      vector_of_doubles__,\n      parent_namespace_test,\n      vector_of_referrables__,\n      single_weak_reference,\n      vector_of_weak_references__,\n      vector_of_strong_referrables__,\n      co_owning_reference,\n      vector_of_co_owning_references__,\n      non_owning_reference,\n      vector_of_non_owning_references__,\n      any_unique_type,\n      any_unique,\n      any_ambiguous_type,\n      any_ambiguous,\n      vector_of_enums__,\n      signed_enum,\n      testrequirednestedflatbuffer__,\n      scalar_key_sorted_tables__,\n      native_inline,\n      long_enum_non_enum_default,\n      long_enum_normal_default,\n      nan_default,\n      inf_default,\n      positive_inf_default,\n      infinity_default,\n      positive_infinity_default,\n      negative_inf_default,\n      negative_infinity_default,\n      double_inf_default);\n}\n\n::flatbuffers::Offset<Monster> CreateMonster(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n\nstruct TypeAliasesT : public ::flatbuffers::NativeTable {\n  typedef TypeAliases TableType;\n  int8_t i8 = 0;\n  uint8_t u8 = 0;\n  int16_t i16 = 0;\n  uint16_t u16 = 0;\n  int32_t i32 = 0;\n  uint32_t u32 = 0;\n  int64_t i64 = 0;\n  uint64_t u64 = 0;\n  float f32 = 0.0f;\n  double f64 = 0.0;\n  std::vector<int8_t> v8{};\n  std::vector<double> vf64{};\n};\n\nstruct TypeAliases FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {\n  typedef TypeAliasesT NativeTableType;\n  typedef TypeAliasesBuilder Builder;\n  static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {\n    return TypeAliasesTypeTable();\n  }\n  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {\n    VT_I8 = 4,\n    VT_U8 = 6,\n    VT_I16 = 8,\n    VT_U16 = 10,\n    VT_I32 = 12,\n    VT_U32 = 14,\n    VT_I64 = 16,\n    VT_U64 = 18,\n    VT_F32 = 20,\n    VT_F64 = 22,\n    VT_V8 = 24,\n    VT_VF64 = 26\n  };\n  int8_t i8() const {\n    return GetField<int8_t>(VT_I8, 0);\n  }\n  bool mutate_i8(int8_t _i8 = 0) {\n    return SetField<int8_t>(VT_I8, _i8, 0);\n  }\n  uint8_t u8() const {\n    return GetField<uint8_t>(VT_U8, 0);\n  }\n  bool mutate_u8(uint8_t _u8 = 0) {\n    return SetField<uint8_t>(VT_U8, _u8, 0);\n  }\n  int16_t i16() const {\n    return GetField<int16_t>(VT_I16, 0);\n  }\n  bool mutate_i16(int16_t _i16 = 0) {\n    return SetField<int16_t>(VT_I16, _i16, 0);\n  }\n  uint16_t u16() const {\n    return GetField<uint16_t>(VT_U16, 0);\n  }\n  bool mutate_u16(uint16_t _u16 = 0) {\n    return SetField<uint16_t>(VT_U16, _u16, 0);\n  }\n  int32_t i32() const {\n    return GetField<int32_t>(VT_I32, 0);\n  }\n  bool mutate_i32(int32_t _i32 = 0) {\n    return SetField<int32_t>(VT_I32, _i32, 0);\n  }\n  uint32_t u32() const {\n    return GetField<uint32_t>(VT_U32, 0);\n  }\n  bool mutate_u32(uint32_t _u32 = 0) {\n    return SetField<uint32_t>(VT_U32, _u32, 0);\n  }\n  int64_t i64() const {\n    return GetField<int64_t>(VT_I64, 0);\n  }\n  bool mutate_i64(int64_t _i64 = 0) {\n    return SetField<int64_t>(VT_I64, _i64, 0);\n  }\n  uint64_t u64() const {\n    return GetField<uint64_t>(VT_U64, 0);\n  }\n  bool mutate_u64(uint64_t _u64 = 0) {\n    return SetField<uint64_t>(VT_U64, _u64, 0);\n  }\n  float f32() const {\n    return GetField<float>(VT_F32, 0.0f);\n  }\n  bool mutate_f32(float _f32 = 0.0f) {\n    return SetField<float>(VT_F32, _f32, 0.0f);\n  }\n  double f64() const {\n    return GetField<double>(VT_F64, 0.0);\n  }\n  bool mutate_f64(double _f64 = 0.0) {\n    return SetField<double>(VT_F64, _f64, 0.0);\n  }\n  const ::flatbuffers::Vector<int8_t> *v8() const {\n    return GetPointer<const ::flatbuffers::Vector<int8_t> *>(VT_V8);\n  }\n  ::flatbuffers::Vector<int8_t> *mutable_v8() {\n    return GetPointer<::flatbuffers::Vector<int8_t> *>(VT_V8);\n  }\n  const ::flatbuffers::Vector<double> *vf64() const {\n    return GetPointer<const ::flatbuffers::Vector<double> *>(VT_VF64);\n  }\n  ::flatbuffers::Vector<double> *mutable_vf64() {\n    return GetPointer<::flatbuffers::Vector<double> *>(VT_VF64);\n  }\n  template <bool B = false>\n  bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {\n    return VerifyTableStart(verifier) &&\n           VerifyField<int8_t>(verifier, VT_I8, 1) &&\n           VerifyField<uint8_t>(verifier, VT_U8, 1) &&\n           VerifyField<int16_t>(verifier, VT_I16, 2) &&\n           VerifyField<uint16_t>(verifier, VT_U16, 2) &&\n           VerifyField<int32_t>(verifier, VT_I32, 4) &&\n           VerifyField<uint32_t>(verifier, VT_U32, 4) &&\n           VerifyField<int64_t>(verifier, VT_I64, 8) &&\n           VerifyField<uint64_t>(verifier, VT_U64, 8) &&\n           VerifyField<float>(verifier, VT_F32, 4) &&\n           VerifyField<double>(verifier, VT_F64, 8) &&\n           VerifyOffset(verifier, VT_V8) &&\n           verifier.VerifyVector(v8()) &&\n           VerifyOffset(verifier, VT_VF64) &&\n           verifier.VerifyVector(vf64()) &&\n           verifier.EndTable();\n  }\n  TypeAliasesT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  void UnPackTo(TypeAliasesT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;\n  static ::flatbuffers::Offset<TypeAliases> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const TypeAliasesT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n};\n\nstruct TypeAliasesBuilder {\n  typedef TypeAliases Table;\n  ::flatbuffers::FlatBufferBuilder &fbb_;\n  ::flatbuffers::uoffset_t start_;\n  void add_i8(int8_t i8) {\n    fbb_.AddElement<int8_t>(TypeAliases::VT_I8, i8, 0);\n  }\n  void add_u8(uint8_t u8) {\n    fbb_.AddElement<uint8_t>(TypeAliases::VT_U8, u8, 0);\n  }\n  void add_i16(int16_t i16) {\n    fbb_.AddElement<int16_t>(TypeAliases::VT_I16, i16, 0);\n  }\n  void add_u16(uint16_t u16) {\n    fbb_.AddElement<uint16_t>(TypeAliases::VT_U16, u16, 0);\n  }\n  void add_i32(int32_t i32) {\n    fbb_.AddElement<int32_t>(TypeAliases::VT_I32, i32, 0);\n  }\n  void add_u32(uint32_t u32) {\n    fbb_.AddElement<uint32_t>(TypeAliases::VT_U32, u32, 0);\n  }\n  void add_i64(int64_t i64) {\n    fbb_.AddElement<int64_t>(TypeAliases::VT_I64, i64, 0);\n  }\n  void add_u64(uint64_t u64) {\n    fbb_.AddElement<uint64_t>(TypeAliases::VT_U64, u64, 0);\n  }\n  void add_f32(float f32) {\n    fbb_.AddElement<float>(TypeAliases::VT_F32, f32, 0.0f);\n  }\n  void add_f64(double f64) {\n    fbb_.AddElement<double>(TypeAliases::VT_F64, f64, 0.0);\n  }\n  void add_v8(::flatbuffers::Offset<::flatbuffers::Vector<int8_t>> v8) {\n    fbb_.AddOffset(TypeAliases::VT_V8, v8);\n  }\n  void add_vf64(::flatbuffers::Offset<::flatbuffers::Vector<double>> vf64) {\n    fbb_.AddOffset(TypeAliases::VT_VF64, vf64);\n  }\n  explicit TypeAliasesBuilder(::flatbuffers::FlatBufferBuilder &_fbb)\n        : fbb_(_fbb) {\n    start_ = fbb_.StartTable();\n  }\n  ::flatbuffers::Offset<TypeAliases> Finish() {\n    const auto end = fbb_.EndTable(start_);\n    auto o = ::flatbuffers::Offset<TypeAliases>(end);\n    return o;\n  }\n};\n\ninline ::flatbuffers::Offset<TypeAliases> CreateTypeAliases(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    int8_t i8 = 0,\n    uint8_t u8 = 0,\n    int16_t i16 = 0,\n    uint16_t u16 = 0,\n    int32_t i32 = 0,\n    uint32_t u32 = 0,\n    int64_t i64 = 0,\n    uint64_t u64 = 0,\n    float f32 = 0.0f,\n    double f64 = 0.0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<int8_t>> v8 = 0,\n    ::flatbuffers::Offset<::flatbuffers::Vector<double>> vf64 = 0) {\n  TypeAliasesBuilder builder_(_fbb);\n  builder_.add_f64(f64);\n  builder_.add_u64(u64);\n  builder_.add_i64(i64);\n  builder_.add_vf64(vf64);\n  builder_.add_v8(v8);\n  builder_.add_f32(f32);\n  builder_.add_u32(u32);\n  builder_.add_i32(i32);\n  builder_.add_u16(u16);\n  builder_.add_i16(i16);\n  builder_.add_u8(u8);\n  builder_.add_i8(i8);\n  return builder_.Finish();\n}\n\ninline ::flatbuffers::Offset<TypeAliases> CreateTypeAliasesDirect(\n    ::flatbuffers::FlatBufferBuilder &_fbb,\n    int8_t i8 = 0,\n    uint8_t u8 = 0,\n    int16_t i16 = 0,\n    uint16_t u16 = 0,\n    int32_t i32 = 0,\n    uint32_t u32 = 0,\n    int64_t i64 = 0,\n    uint64_t u64 = 0,\n    float f32 = 0.0f,\n    double f64 = 0.0,\n    const std::vector<int8_t> *v8 = nullptr,\n    const std::vector<double> *vf64 = nullptr) {\n  auto v8__ = v8 ? _fbb.CreateVector<int8_t>(*v8) : 0;\n  auto vf64__ = vf64 ? _fbb.CreateVector<double>(*vf64) : 0;\n  return MyGame::Example::CreateTypeAliases(\n      _fbb,\n      i8,\n      u8,\n      i16,\n      u16,\n      i32,\n      u32,\n      i64,\n      u64,\n      f32,\n      f64,\n      v8__,\n      vf64__);\n}\n\n::flatbuffers::Offset<TypeAliases> CreateTypeAliases(::flatbuffers::FlatBufferBuilder &_fbb, const TypeAliasesT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);\n\n}  // namespace Example\n\n\ninline bool operator==(const InParentNamespaceT &, const InParentNamespaceT &) {\n  return true;\n}\n\ninline bool operator!=(const InParentNamespaceT &lhs, const InParentNamespaceT &rhs) {\n    return !(lhs == rhs);\n}\n\n\ninline InParentNamespaceT *InParentNamespace::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {\n  auto _o = std::unique_ptr<InParentNamespaceT>(new InParentNamespaceT());\n  UnPackTo(_o.get(), _resolver);\n  return _o.release();\n}\n\ninline void InParentNamespace::UnPackTo(InParentNamespaceT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {\n  (void)_o;\n  (void)_resolver;\n}\n\ninline ::flatbuffers::Offset<InParentNamespace> CreateInParentNamespace(::flatbuffers::FlatBufferBuilder &_fbb, const InParentNamespaceT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  return InParentNamespace::Pack(_fbb, _o, _rehasher);\n}\n\ninline ::flatbuffers::Offset<InParentNamespace> InParentNamespace::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const InParentNamespaceT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  (void)_rehasher;\n  (void)_o;\n  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const InParentNamespaceT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;\n  return MyGame::CreateInParentNamespace(\n      _fbb);\n}\n\nnamespace Example2 {\n\n\ninline bool operator==(const MonsterT &, const MonsterT &) {\n  return true;\n}\n\ninline bool operator!=(const MonsterT &lhs, const MonsterT &rhs) {\n    return !(lhs == rhs);\n}\n\n\ninline MonsterT *Monster::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {\n  auto _o = std::unique_ptr<MonsterT>(new MonsterT());\n  UnPackTo(_o.get(), _resolver);\n  return _o.release();\n}\n\ninline void Monster::UnPackTo(MonsterT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {\n  (void)_o;\n  (void)_resolver;\n}\n\ninline ::flatbuffers::Offset<Monster> CreateMonster(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  return Monster::Pack(_fbb, _o, _rehasher);\n}\n\ninline ::flatbuffers::Offset<Monster> Monster::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  (void)_rehasher;\n  (void)_o;\n  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const MonsterT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;\n  return MyGame::Example2::CreateMonster(\n      _fbb);\n}\n\n}  // namespace Example2\n\nnamespace Example {\n\n\ninline bool operator==(const TestSimpleTableWithEnumT &lhs, const TestSimpleTableWithEnumT &rhs) {\n  return\n      (lhs.color == rhs.color);\n}\n\ninline bool operator!=(const TestSimpleTableWithEnumT &lhs, const TestSimpleTableWithEnumT &rhs) {\n    return !(lhs == rhs);\n}\n\n\ninline TestSimpleTableWithEnumT *TestSimpleTableWithEnum::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {\n  auto _o = std::unique_ptr<TestSimpleTableWithEnumT>(new TestSimpleTableWithEnumT());\n  UnPackTo(_o.get(), _resolver);\n  return _o.release();\n}\n\ninline void TestSimpleTableWithEnum::UnPackTo(TestSimpleTableWithEnumT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {\n  (void)_o;\n  (void)_resolver;\n  { auto _e = color(); _o->color = _e; }\n}\n\ninline ::flatbuffers::Offset<TestSimpleTableWithEnum> CreateTestSimpleTableWithEnum(::flatbuffers::FlatBufferBuilder &_fbb, const TestSimpleTableWithEnumT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  return TestSimpleTableWithEnum::Pack(_fbb, _o, _rehasher);\n}\n\ninline ::flatbuffers::Offset<TestSimpleTableWithEnum> TestSimpleTableWithEnum::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const TestSimpleTableWithEnumT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  (void)_rehasher;\n  (void)_o;\n  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const TestSimpleTableWithEnumT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;\n  auto _color = _o->color;\n  return MyGame::Example::CreateTestSimpleTableWithEnum(\n      _fbb,\n      _color);\n}\n\n\ninline bool operator==(const StatT &lhs, const StatT &rhs) {\n  return\n      (lhs.id == rhs.id) &&\n      (lhs.val == rhs.val) &&\n      (lhs.count == rhs.count);\n}\n\ninline bool operator!=(const StatT &lhs, const StatT &rhs) {\n    return !(lhs == rhs);\n}\n\n\ninline StatT *Stat::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {\n  auto _o = std::unique_ptr<StatT>(new StatT());\n  UnPackTo(_o.get(), _resolver);\n  return _o.release();\n}\n\ninline void Stat::UnPackTo(StatT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {\n  (void)_o;\n  (void)_resolver;\n  { auto _e = id(); if (_e) _o->id = _e->str(); }\n  { auto _e = val(); _o->val = _e; }\n  { auto _e = count(); _o->count = _e; }\n}\n\ninline ::flatbuffers::Offset<Stat> CreateStat(::flatbuffers::FlatBufferBuilder &_fbb, const StatT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  return Stat::Pack(_fbb, _o, _rehasher);\n}\n\ninline ::flatbuffers::Offset<Stat> Stat::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const StatT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  (void)_rehasher;\n  (void)_o;\n  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const StatT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;\n  auto _id = _o->id.empty() ? 0 : _fbb.CreateString(_o->id);\n  auto _val = _o->val;\n  auto _count = _o->count;\n  return MyGame::Example::CreateStat(\n      _fbb,\n      _id,\n      _val,\n      _count);\n}\n\n\ninline bool operator==(const ReferrableT &lhs, const ReferrableT &rhs) {\n  return\n      (lhs.id == rhs.id);\n}\n\ninline bool operator!=(const ReferrableT &lhs, const ReferrableT &rhs) {\n    return !(lhs == rhs);\n}\n\n\ninline ReferrableT *Referrable::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {\n  auto _o = std::unique_ptr<ReferrableT>(new ReferrableT());\n  UnPackTo(_o.get(), _resolver);\n  return _o.release();\n}\n\ninline void Referrable::UnPackTo(ReferrableT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {\n  (void)_o;\n  (void)_resolver;\n  { auto _e = id(); _o->id = _e; }\n}\n\ninline ::flatbuffers::Offset<Referrable> CreateReferrable(::flatbuffers::FlatBufferBuilder &_fbb, const ReferrableT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  return Referrable::Pack(_fbb, _o, _rehasher);\n}\n\ninline ::flatbuffers::Offset<Referrable> Referrable::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ReferrableT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  (void)_rehasher;\n  (void)_o;\n  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const ReferrableT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;\n  auto _id = _o->id;\n  return MyGame::Example::CreateReferrable(\n      _fbb,\n      _id);\n}\n\n\ninline bool operator==(const MonsterT &lhs, const MonsterT &rhs) {\n  return\n      ((lhs.pos == rhs.pos) || (lhs.pos && rhs.pos && *lhs.pos == *rhs.pos)) &&\n      (lhs.mana == rhs.mana) &&\n      (lhs.hp == rhs.hp) &&\n      (lhs.name == rhs.name) &&\n      (lhs.inventory == rhs.inventory) &&\n      (lhs.color == rhs.color) &&\n      (lhs.test == rhs.test) &&\n      (lhs.test4 == rhs.test4) &&\n      (lhs.testarrayofstring == rhs.testarrayofstring) &&\n      (lhs.testarrayoftables.size() == rhs.testarrayoftables.size() && std::equal(lhs.testarrayoftables.cbegin(), lhs.testarrayoftables.cend(), rhs.testarrayoftables.cbegin(), [](std::unique_ptr<MyGame::Example::MonsterT> const &a, std::unique_ptr<MyGame::Example::MonsterT> const &b) { return (a == b) || (a && b && *a == *b); })) &&\n      ((lhs.enemy == rhs.enemy) || (lhs.enemy && rhs.enemy && *lhs.enemy == *rhs.enemy)) &&\n      (lhs.testnestedflatbuffer == rhs.testnestedflatbuffer) &&\n      ((lhs.testempty == rhs.testempty) || (lhs.testempty && rhs.testempty && *lhs.testempty == *rhs.testempty)) &&\n      (lhs.testbool == rhs.testbool) &&\n      (lhs.testhashs32_fnv1 == rhs.testhashs32_fnv1) &&\n      (lhs.testhashu32_fnv1 == rhs.testhashu32_fnv1) &&\n      (lhs.testhashs64_fnv1 == rhs.testhashs64_fnv1) &&\n      (lhs.testhashu64_fnv1 == rhs.testhashu64_fnv1) &&\n      (lhs.testhashs32_fnv1a == rhs.testhashs32_fnv1a) &&\n      (lhs.testhashu32_fnv1a == rhs.testhashu32_fnv1a) &&\n      (lhs.testhashs64_fnv1a == rhs.testhashs64_fnv1a) &&\n      (lhs.testhashu64_fnv1a == rhs.testhashu64_fnv1a) &&\n      (lhs.testarrayofbools == rhs.testarrayofbools) &&\n      (lhs.testf == rhs.testf) &&\n      (lhs.testf2 == rhs.testf2) &&\n      (lhs.testf3 == rhs.testf3) &&\n      (lhs.testarrayofstring2 == rhs.testarrayofstring2) &&\n      (lhs.testarrayofsortedstruct == rhs.testarrayofsortedstruct) &&\n      (lhs.flex == rhs.flex) &&\n      (lhs.test5 == rhs.test5) &&\n      (lhs.vector_of_longs == rhs.vector_of_longs) &&\n      (lhs.vector_of_doubles == rhs.vector_of_doubles) &&\n      ((lhs.parent_namespace_test == rhs.parent_namespace_test) || (lhs.parent_namespace_test && rhs.parent_namespace_test && *lhs.parent_namespace_test == *rhs.parent_namespace_test)) &&\n      (lhs.vector_of_referrables.size() == rhs.vector_of_referrables.size() && std::equal(lhs.vector_of_referrables.cbegin(), lhs.vector_of_referrables.cend(), rhs.vector_of_referrables.cbegin(), [](std::unique_ptr<MyGame::Example::ReferrableT> const &a, std::unique_ptr<MyGame::Example::ReferrableT> const &b) { return (a == b) || (a && b && *a == *b); })) &&\n      (lhs.single_weak_reference == rhs.single_weak_reference) &&\n      (lhs.vector_of_weak_references == rhs.vector_of_weak_references) &&\n      (lhs.vector_of_strong_referrables.size() == rhs.vector_of_strong_referrables.size() && std::equal(lhs.vector_of_strong_referrables.cbegin(), lhs.vector_of_strong_referrables.cend(), rhs.vector_of_strong_referrables.cbegin(), [](std::unique_ptr<MyGame::Example::ReferrableT> const &a, std::unique_ptr<MyGame::Example::ReferrableT> const &b) { return (a == b) || (a && b && *a == *b); })) &&\n      (lhs.co_owning_reference == rhs.co_owning_reference) &&\n      (lhs.vector_of_co_owning_references == rhs.vector_of_co_owning_references) &&\n      (lhs.non_owning_reference == rhs.non_owning_reference) &&\n      (lhs.vector_of_non_owning_references == rhs.vector_of_non_owning_references) &&\n      (lhs.any_unique == rhs.any_unique) &&\n      (lhs.any_ambiguous == rhs.any_ambiguous) &&\n      (lhs.vector_of_enums == rhs.vector_of_enums) &&\n      (lhs.signed_enum == rhs.signed_enum) &&\n      (lhs.testrequirednestedflatbuffer == rhs.testrequirednestedflatbuffer) &&\n      (lhs.scalar_key_sorted_tables.size() == rhs.scalar_key_sorted_tables.size() && std::equal(lhs.scalar_key_sorted_tables.cbegin(), lhs.scalar_key_sorted_tables.cend(), rhs.scalar_key_sorted_tables.cbegin(), [](std::unique_ptr<MyGame::Example::StatT> const &a, std::unique_ptr<MyGame::Example::StatT> const &b) { return (a == b) || (a && b && *a == *b); })) &&\n      (lhs.native_inline == rhs.native_inline) &&\n      (lhs.long_enum_non_enum_default == rhs.long_enum_non_enum_default) &&\n      (lhs.long_enum_normal_default == rhs.long_enum_normal_default) &&\n      (lhs.nan_default == rhs.nan_default) &&\n      (lhs.inf_default == rhs.inf_default) &&\n      (lhs.positive_inf_default == rhs.positive_inf_default) &&\n      (lhs.infinity_default == rhs.infinity_default) &&\n      (lhs.positive_infinity_default == rhs.positive_infinity_default) &&\n      (lhs.negative_inf_default == rhs.negative_inf_default) &&\n      (lhs.negative_infinity_default == rhs.negative_infinity_default) &&\n      (lhs.double_inf_default == rhs.double_inf_default);\n}\n\ninline bool operator!=(const MonsterT &lhs, const MonsterT &rhs) {\n    return !(lhs == rhs);\n}\n\n\ninline MonsterT::MonsterT(const MonsterT &o)\n      : pos((o.pos) ? new MyGame::Example::Vec3(*o.pos) : nullptr),\n        mana(o.mana),\n        hp(o.hp),\n        name(o.name),\n        inventory(o.inventory),\n        color(o.color),\n        test(o.test),\n        test4(o.test4),\n        testarrayofstring(o.testarrayofstring),\n        enemy((o.enemy) ? new MyGame::Example::MonsterT(*o.enemy) : nullptr),\n        testnestedflatbuffer(o.testnestedflatbuffer),\n        testempty((o.testempty) ? new MyGame::Example::StatT(*o.testempty) : nullptr),\n        testbool(o.testbool),\n        testhashs32_fnv1(o.testhashs32_fnv1),\n        testhashu32_fnv1(o.testhashu32_fnv1),\n        testhashs64_fnv1(o.testhashs64_fnv1),\n        testhashu64_fnv1(o.testhashu64_fnv1),\n        testhashs32_fnv1a(o.testhashs32_fnv1a),\n        testhashu32_fnv1a(o.testhashu32_fnv1a),\n        testhashs64_fnv1a(o.testhashs64_fnv1a),\n        testhashu64_fnv1a(o.testhashu64_fnv1a),\n        testarrayofbools(o.testarrayofbools),\n        testf(o.testf),\n        testf2(o.testf2),\n        testf3(o.testf3),\n        testarrayofstring2(o.testarrayofstring2),\n        testarrayofsortedstruct(o.testarrayofsortedstruct),\n        flex(o.flex),\n        test5(o.test5),\n        vector_of_longs(o.vector_of_longs),\n        vector_of_doubles(o.vector_of_doubles),\n        parent_namespace_test((o.parent_namespace_test) ? new MyGame::InParentNamespaceT(*o.parent_namespace_test) : nullptr),\n        single_weak_reference(o.single_weak_reference),\n        vector_of_weak_references(o.vector_of_weak_references),\n        co_owning_reference(o.co_owning_reference),\n        non_owning_reference(o.non_owning_reference),\n        vector_of_non_owning_references(o.vector_of_non_owning_references),\n        any_unique(o.any_unique),\n        any_ambiguous(o.any_ambiguous),\n        vector_of_enums(o.vector_of_enums),\n        signed_enum(o.signed_enum),\n        testrequirednestedflatbuffer(o.testrequirednestedflatbuffer),\n        native_inline(o.native_inline),\n        long_enum_non_enum_default(o.long_enum_non_enum_default),\n        long_enum_normal_default(o.long_enum_normal_default),\n        nan_default(o.nan_default),\n        inf_default(o.inf_default),\n        positive_inf_default(o.positive_inf_default),\n        infinity_default(o.infinity_default),\n        positive_infinity_default(o.positive_infinity_default),\n        negative_inf_default(o.negative_inf_default),\n        negative_infinity_default(o.negative_infinity_default),\n        double_inf_default(o.double_inf_default) {\n  testarrayoftables.reserve(o.testarrayoftables.size());\n  for (const auto &testarrayoftables_ : o.testarrayoftables) { testarrayoftables.emplace_back((testarrayoftables_) ? new MyGame::Example::MonsterT(*testarrayoftables_) : nullptr); }\n  vector_of_referrables.reserve(o.vector_of_referrables.size());\n  for (const auto &vector_of_referrables_ : o.vector_of_referrables) { vector_of_referrables.emplace_back((vector_of_referrables_) ? new MyGame::Example::ReferrableT(*vector_of_referrables_) : nullptr); }\n  vector_of_strong_referrables.reserve(o.vector_of_strong_referrables.size());\n  for (const auto &vector_of_strong_referrables_ : o.vector_of_strong_referrables) { vector_of_strong_referrables.emplace_back((vector_of_strong_referrables_) ? new MyGame::Example::ReferrableT(*vector_of_strong_referrables_) : nullptr); }\n  vector_of_co_owning_references.reserve(o.vector_of_co_owning_references.size());\n  for (const auto &vector_of_co_owning_references_ : o.vector_of_co_owning_references) { vector_of_co_owning_references.emplace_back((vector_of_co_owning_references_) ? new ReferrableT(*vector_of_co_owning_references_) : nullptr); }\n  scalar_key_sorted_tables.reserve(o.scalar_key_sorted_tables.size());\n  for (const auto &scalar_key_sorted_tables_ : o.scalar_key_sorted_tables) { scalar_key_sorted_tables.emplace_back((scalar_key_sorted_tables_) ? new MyGame::Example::StatT(*scalar_key_sorted_tables_) : nullptr); }\n}\n\ninline MonsterT &MonsterT::operator=(MonsterT o) FLATBUFFERS_NOEXCEPT {\n  std::swap(pos, o.pos);\n  std::swap(mana, o.mana);\n  std::swap(hp, o.hp);\n  std::swap(name, o.name);\n  std::swap(inventory, o.inventory);\n  std::swap(color, o.color);\n  std::swap(test, o.test);\n  std::swap(test4, o.test4);\n  std::swap(testarrayofstring, o.testarrayofstring);\n  std::swap(testarrayoftables, o.testarrayoftables);\n  std::swap(enemy, o.enemy);\n  std::swap(testnestedflatbuffer, o.testnestedflatbuffer);\n  std::swap(testempty, o.testempty);\n  std::swap(testbool, o.testbool);\n  std::swap(testhashs32_fnv1, o.testhashs32_fnv1);\n  std::swap(testhashu32_fnv1, o.testhashu32_fnv1);\n  std::swap(testhashs64_fnv1, o.testhashs64_fnv1);\n  std::swap(testhashu64_fnv1, o.testhashu64_fnv1);\n  std::swap(testhashs32_fnv1a, o.testhashs32_fnv1a);\n  std::swap(testhashu32_fnv1a, o.testhashu32_fnv1a);\n  std::swap(testhashs64_fnv1a, o.testhashs64_fnv1a);\n  std::swap(testhashu64_fnv1a, o.testhashu64_fnv1a);\n  std::swap(testarrayofbools, o.testarrayofbools);\n  std::swap(testf, o.testf);\n  std::swap(testf2, o.testf2);\n  std::swap(testf3, o.testf3);\n  std::swap(testarrayofstring2, o.testarrayofstring2);\n  std::swap(testarrayofsortedstruct, o.testarrayofsortedstruct);\n  std::swap(flex, o.flex);\n  std::swap(test5, o.test5);\n  std::swap(vector_of_longs, o.vector_of_longs);\n  std::swap(vector_of_doubles, o.vector_of_doubles);\n  std::swap(parent_namespace_test, o.parent_namespace_test);\n  std::swap(vector_of_referrables, o.vector_of_referrables);\n  std::swap(single_weak_reference, o.single_weak_reference);\n  std::swap(vector_of_weak_references, o.vector_of_weak_references);\n  std::swap(vector_of_strong_referrables, o.vector_of_strong_referrables);\n  std::swap(co_owning_reference, o.co_owning_reference);\n  std::swap(vector_of_co_owning_references, o.vector_of_co_owning_references);\n  std::swap(non_owning_reference, o.non_owning_reference);\n  std::swap(vector_of_non_owning_references, o.vector_of_non_owning_references);\n  std::swap(any_unique, o.any_unique);\n  std::swap(any_ambiguous, o.any_ambiguous);\n  std::swap(vector_of_enums, o.vector_of_enums);\n  std::swap(signed_enum, o.signed_enum);\n  std::swap(testrequirednestedflatbuffer, o.testrequirednestedflatbuffer);\n  std::swap(scalar_key_sorted_tables, o.scalar_key_sorted_tables);\n  std::swap(native_inline, o.native_inline);\n  std::swap(long_enum_non_enum_default, o.long_enum_non_enum_default);\n  std::swap(long_enum_normal_default, o.long_enum_normal_default);\n  std::swap(nan_default, o.nan_default);\n  std::swap(inf_default, o.inf_default);\n  std::swap(positive_inf_default, o.positive_inf_default);\n  std::swap(infinity_default, o.infinity_default);\n  std::swap(positive_infinity_default, o.positive_infinity_default);\n  std::swap(negative_inf_default, o.negative_inf_default);\n  std::swap(negative_infinity_default, o.negative_infinity_default);\n  std::swap(double_inf_default, o.double_inf_default);\n  return *this;\n}\n\ninline MonsterT *Monster::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {\n  auto _o = std::unique_ptr<MonsterT>(new MonsterT());\n  UnPackTo(_o.get(), _resolver);\n  return _o.release();\n}\n\ninline void Monster::UnPackTo(MonsterT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {\n  (void)_o;\n  (void)_resolver;\n  { auto _e = pos(); if (_e) _o->pos = std::unique_ptr<MyGame::Example::Vec3>(new MyGame::Example::Vec3(*_e)); }\n  { auto _e = mana(); _o->mana = _e; }\n  { auto _e = hp(); _o->hp = _e; }\n  { auto _e = name(); if (_e) _o->name = _e->str(); }\n  { auto _e = inventory(); if (_e) { _o->inventory.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->inventory.begin()); } }\n  { auto _e = color(); _o->color = _e; }\n  { auto _e = test_type(); _o->test.type = _e; }\n  { auto _e = test(); if (_e) _o->test.value = MyGame::Example::AnyUnion::UnPack(_e, test_type(), _resolver); }\n  { auto _e = test4(); if (_e) { _o->test4.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->test4[_i] = *_e->Get(_i); } } else { _o->test4.resize(0); } }\n  { auto _e = testarrayofstring(); if (_e) { _o->testarrayofstring.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testarrayofstring[_i] = _e->Get(_i)->str(); } } else { _o->testarrayofstring.resize(0); } }\n  { auto _e = testarrayoftables(); if (_e) { _o->testarrayoftables.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { if(_o->testarrayoftables[_i]) { _e->Get(_i)->UnPackTo(_o->testarrayoftables[_i].get(), _resolver); } else { _o->testarrayoftables[_i] = std::unique_ptr<MyGame::Example::MonsterT>(_e->Get(_i)->UnPack(_resolver)); } } } else { _o->testarrayoftables.resize(0); } }\n  { auto _e = enemy(); if (_e) { if(_o->enemy) { _e->UnPackTo(_o->enemy.get(), _resolver); } else { _o->enemy = std::unique_ptr<MyGame::Example::MonsterT>(_e->UnPack(_resolver)); } } else if (_o->enemy) { _o->enemy.reset(); } }\n  { auto _e = testnestedflatbuffer(); if (_e) { _o->testnestedflatbuffer.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->testnestedflatbuffer.begin()); } }\n  { auto _e = testempty(); if (_e) { if(_o->testempty) { _e->UnPackTo(_o->testempty.get(), _resolver); } else { _o->testempty = std::unique_ptr<MyGame::Example::StatT>(_e->UnPack(_resolver)); } } else if (_o->testempty) { _o->testempty.reset(); } }\n  { auto _e = testbool(); _o->testbool = _e; }\n  { auto _e = testhashs32_fnv1(); _o->testhashs32_fnv1 = _e; }\n  { auto _e = testhashu32_fnv1(); _o->testhashu32_fnv1 = _e; }\n  { auto _e = testhashs64_fnv1(); _o->testhashs64_fnv1 = _e; }\n  { auto _e = testhashu64_fnv1(); _o->testhashu64_fnv1 = _e; }\n  { auto _e = testhashs32_fnv1a(); _o->testhashs32_fnv1a = _e; }\n  { auto _e = testhashu32_fnv1a(); /*scalar resolver, naked*/ if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->testhashu32_fnv1a), static_cast<::flatbuffers::hash_value_t>(_e)); else _o->testhashu32_fnv1a = nullptr; }\n  { auto _e = testhashs64_fnv1a(); _o->testhashs64_fnv1a = _e; }\n  { auto _e = testhashu64_fnv1a(); _o->testhashu64_fnv1a = _e; }\n  { auto _e = testarrayofbools(); if (_e) { _o->testarrayofbools.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testarrayofbools[_i] = _e->Get(_i) != 0; } } else { _o->testarrayofbools.resize(0); } }\n  { auto _e = testf(); _o->testf = _e; }\n  { auto _e = testf2(); _o->testf2 = _e; }\n  { auto _e = testf3(); _o->testf3 = _e; }\n  { auto _e = testarrayofstring2(); if (_e) { _o->testarrayofstring2.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testarrayofstring2[_i] = _e->Get(_i)->str(); } } else { _o->testarrayofstring2.resize(0); } }\n  { auto _e = testarrayofsortedstruct(); if (_e) { _o->testarrayofsortedstruct.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testarrayofsortedstruct[_i] = *_e->Get(_i); } } else { _o->testarrayofsortedstruct.resize(0); } }\n  { auto _e = flex(); if (_e) { _o->flex.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->flex.begin()); } }\n  { auto _e = test5(); if (_e) { _o->test5.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->test5[_i] = *_e->Get(_i); } } else { _o->test5.resize(0); } }\n  { auto _e = vector_of_longs(); if (_e) { _o->vector_of_longs.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vector_of_longs[_i] = _e->Get(_i); } } else { _o->vector_of_longs.resize(0); } }\n  { auto _e = vector_of_doubles(); if (_e) { _o->vector_of_doubles.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vector_of_doubles[_i] = _e->Get(_i); } } else { _o->vector_of_doubles.resize(0); } }\n  { auto _e = parent_namespace_test(); if (_e) { if(_o->parent_namespace_test) { _e->UnPackTo(_o->parent_namespace_test.get(), _resolver); } else { _o->parent_namespace_test = std::unique_ptr<MyGame::InParentNamespaceT>(_e->UnPack(_resolver)); } } else if (_o->parent_namespace_test) { _o->parent_namespace_test.reset(); } }\n  { auto _e = vector_of_referrables(); if (_e) { _o->vector_of_referrables.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { if(_o->vector_of_referrables[_i]) { _e->Get(_i)->UnPackTo(_o->vector_of_referrables[_i].get(), _resolver); } else { _o->vector_of_referrables[_i] = std::unique_ptr<MyGame::Example::ReferrableT>(_e->Get(_i)->UnPack(_resolver)); } } } else { _o->vector_of_referrables.resize(0); } }\n  { auto _e = single_weak_reference(); /*scalar resolver, naked*/ if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->single_weak_reference), static_cast<::flatbuffers::hash_value_t>(_e)); else _o->single_weak_reference = nullptr; }\n  { auto _e = vector_of_weak_references(); if (_e) { _o->vector_of_weak_references.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { /*vector resolver, naked*/ if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->vector_of_weak_references[_i]), static_cast<::flatbuffers::hash_value_t>(_e->Get(_i))); else _o->vector_of_weak_references[_i] = nullptr; } } else { _o->vector_of_weak_references.resize(0); } }\n  { auto _e = vector_of_strong_referrables(); if (_e) { _o->vector_of_strong_referrables.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { if(_o->vector_of_strong_referrables[_i]) { _e->Get(_i)->UnPackTo(_o->vector_of_strong_referrables[_i].get(), _resolver); } else { _o->vector_of_strong_referrables[_i] = std::unique_ptr<MyGame::Example::ReferrableT>(_e->Get(_i)->UnPack(_resolver)); } } } else { _o->vector_of_strong_referrables.resize(0); } }\n  { auto _e = co_owning_reference(); /*scalar resolver, naked*/ if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->co_owning_reference), static_cast<::flatbuffers::hash_value_t>(_e)); else _o->co_owning_reference = nullptr; }\n  { auto _e = vector_of_co_owning_references(); if (_e) { _o->vector_of_co_owning_references.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { /*vector resolver, default_ptr_type*/ if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->vector_of_co_owning_references[_i]), static_cast<::flatbuffers::hash_value_t>(_e->Get(_i)));/* else do nothing */} } else { _o->vector_of_co_owning_references.resize(0); } }\n  { auto _e = non_owning_reference(); /*scalar resolver, naked*/ if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->non_owning_reference), static_cast<::flatbuffers::hash_value_t>(_e)); else _o->non_owning_reference = nullptr; }\n  { auto _e = vector_of_non_owning_references(); if (_e) { _o->vector_of_non_owning_references.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { /*vector resolver, naked*/ if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->vector_of_non_owning_references[_i]), static_cast<::flatbuffers::hash_value_t>(_e->Get(_i))); else _o->vector_of_non_owning_references[_i] = nullptr; } } else { _o->vector_of_non_owning_references.resize(0); } }\n  { auto _e = any_unique_type(); _o->any_unique.type = _e; }\n  { auto _e = any_unique(); if (_e) _o->any_unique.value = MyGame::Example::AnyUniqueAliasesUnion::UnPack(_e, any_unique_type(), _resolver); }\n  { auto _e = any_ambiguous_type(); _o->any_ambiguous.type = _e; }\n  { auto _e = any_ambiguous(); if (_e) _o->any_ambiguous.value = MyGame::Example::AnyAmbiguousAliasesUnion::UnPack(_e, any_ambiguous_type(), _resolver); }\n  { auto _e = vector_of_enums(); if (_e) { _o->vector_of_enums.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vector_of_enums[_i] = static_cast<MyGame::Example::Color>(_e->Get(_i)); } } else { _o->vector_of_enums.resize(0); } }\n  { auto _e = signed_enum(); _o->signed_enum = _e; }\n  { auto _e = testrequirednestedflatbuffer(); if (_e) { _o->testrequirednestedflatbuffer.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->testrequirednestedflatbuffer.begin()); } }\n  { auto _e = scalar_key_sorted_tables(); if (_e) { _o->scalar_key_sorted_tables.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { if(_o->scalar_key_sorted_tables[_i]) { _e->Get(_i)->UnPackTo(_o->scalar_key_sorted_tables[_i].get(), _resolver); } else { _o->scalar_key_sorted_tables[_i] = std::unique_ptr<MyGame::Example::StatT>(_e->Get(_i)->UnPack(_resolver)); } } } else { _o->scalar_key_sorted_tables.resize(0); } }\n  { auto _e = native_inline(); if (_e) _o->native_inline = *_e; }\n  { auto _e = long_enum_non_enum_default(); _o->long_enum_non_enum_default = _e; }\n  { auto _e = long_enum_normal_default(); _o->long_enum_normal_default = _e; }\n  { auto _e = nan_default(); _o->nan_default = _e; }\n  { auto _e = inf_default(); _o->inf_default = _e; }\n  { auto _e = positive_inf_default(); _o->positive_inf_default = _e; }\n  { auto _e = infinity_default(); _o->infinity_default = _e; }\n  { auto _e = positive_infinity_default(); _o->positive_infinity_default = _e; }\n  { auto _e = negative_inf_default(); _o->negative_inf_default = _e; }\n  { auto _e = negative_infinity_default(); _o->negative_infinity_default = _e; }\n  { auto _e = double_inf_default(); _o->double_inf_default = _e; }\n}\n\ninline ::flatbuffers::Offset<Monster> CreateMonster(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  return Monster::Pack(_fbb, _o, _rehasher);\n}\n\ninline ::flatbuffers::Offset<Monster> Monster::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const MonsterT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  (void)_rehasher;\n  (void)_o;\n  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const MonsterT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;\n  auto _pos = _o->pos ? _o->pos.get() : nullptr;\n  auto _mana = _o->mana;\n  auto _hp = _o->hp;\n  auto _name = _fbb.CreateString(_o->name);\n  auto _inventory = _o->inventory.size() ? _fbb.CreateVector(_o->inventory) : 0;\n  auto _color = _o->color;\n  auto _test_type = _o->test.type;\n  auto _test = _o->test.Pack(_fbb);\n  auto _test4 = _o->test4.size() ? _fbb.CreateVectorOfStructs(_o->test4) : 0;\n  auto _testarrayofstring = _o->testarrayofstring.size() ? _fbb.CreateVectorOfStrings(_o->testarrayofstring) : 0;\n  auto _testarrayoftables = _o->testarrayoftables.size() ? _fbb.CreateVector<::flatbuffers::Offset<MyGame::Example::Monster>> (_o->testarrayoftables.size(), [](size_t i, _VectorArgs *__va) { return MyGame::Example::CreateMonster(*__va->__fbb, __va->__o->testarrayoftables[i].get(), __va->__rehasher); }, &_va ) : 0;\n  auto _enemy = _o->enemy ? MyGame::Example::CreateMonster(_fbb, _o->enemy.get(), _rehasher) : 0;\n  auto _testnestedflatbuffer = _o->testnestedflatbuffer.size() ? _fbb.CreateVector(_o->testnestedflatbuffer) : 0;\n  auto _testempty = _o->testempty ? MyGame::Example::CreateStat(_fbb, _o->testempty.get(), _rehasher) : 0;\n  auto _testbool = _o->testbool;\n  auto _testhashs32_fnv1 = _o->testhashs32_fnv1;\n  auto _testhashu32_fnv1 = _o->testhashu32_fnv1;\n  auto _testhashs64_fnv1 = _o->testhashs64_fnv1;\n  auto _testhashu64_fnv1 = _o->testhashu64_fnv1;\n  auto _testhashs32_fnv1a = _o->testhashs32_fnv1a;\n  auto _testhashu32_fnv1a = _rehasher ? static_cast<uint32_t>((*_rehasher)(_o->testhashu32_fnv1a)) : 0;\n  auto _testhashs64_fnv1a = _o->testhashs64_fnv1a;\n  auto _testhashu64_fnv1a = _o->testhashu64_fnv1a;\n  auto _testarrayofbools = _o->testarrayofbools.size() ? _fbb.CreateVector(_o->testarrayofbools) : 0;\n  auto _testf = _o->testf;\n  auto _testf2 = _o->testf2;\n  auto _testf3 = _o->testf3;\n  auto _testarrayofstring2 = _o->testarrayofstring2.size() ? _fbb.CreateVectorOfStrings(_o->testarrayofstring2) : 0;\n  auto _testarrayofsortedstruct = _o->testarrayofsortedstruct.size() ? _fbb.CreateVectorOfStructs(_o->testarrayofsortedstruct) : 0;\n  auto _flex = _o->flex.size() ? _fbb.CreateVector(_o->flex) : 0;\n  auto _test5 = _o->test5.size() ? _fbb.CreateVectorOfStructs(_o->test5) : 0;\n  auto _vector_of_longs = _o->vector_of_longs.size() ? _fbb.CreateVector(_o->vector_of_longs) : 0;\n  auto _vector_of_doubles = _o->vector_of_doubles.size() ? _fbb.CreateVector(_o->vector_of_doubles) : 0;\n  auto _parent_namespace_test = _o->parent_namespace_test ? MyGame::CreateInParentNamespace(_fbb, _o->parent_namespace_test.get(), _rehasher) : 0;\n  auto _vector_of_referrables = _o->vector_of_referrables.size() ? _fbb.CreateVector<::flatbuffers::Offset<MyGame::Example::Referrable>> (_o->vector_of_referrables.size(), [](size_t i, _VectorArgs *__va) { return MyGame::Example::CreateReferrable(*__va->__fbb, __va->__o->vector_of_referrables[i].get(), __va->__rehasher); }, &_va ) : 0;\n  auto _single_weak_reference = _rehasher ? static_cast<uint64_t>((*_rehasher)(_o->single_weak_reference)) : 0;\n  auto _vector_of_weak_references = _o->vector_of_weak_references.size() ? _fbb.CreateVector<uint64_t>(_o->vector_of_weak_references.size(), [](size_t i, _VectorArgs *__va) { return __va->__rehasher ? static_cast<uint64_t>((*__va->__rehasher)(__va->__o->vector_of_weak_references[i])) : 0; }, &_va ) : 0;\n  auto _vector_of_strong_referrables = _o->vector_of_strong_referrables.size() ? _fbb.CreateVector<::flatbuffers::Offset<MyGame::Example::Referrable>> (_o->vector_of_strong_referrables.size(), [](size_t i, _VectorArgs *__va) { return MyGame::Example::CreateReferrable(*__va->__fbb, __va->__o->vector_of_strong_referrables[i].get(), __va->__rehasher); }, &_va ) : 0;\n  auto _co_owning_reference = _rehasher ? static_cast<uint64_t>((*_rehasher)(_o->co_owning_reference)) : 0;\n  auto _vector_of_co_owning_references = _o->vector_of_co_owning_references.size() ? _fbb.CreateVector<uint64_t>(_o->vector_of_co_owning_references.size(), [](size_t i, _VectorArgs *__va) { return __va->__rehasher ? static_cast<uint64_t>((*__va->__rehasher)(__va->__o->vector_of_co_owning_references[i].get())) : 0; }, &_va ) : 0;\n  auto _non_owning_reference = _rehasher ? static_cast<uint64_t>((*_rehasher)(_o->non_owning_reference)) : 0;\n  auto _vector_of_non_owning_references = _o->vector_of_non_owning_references.size() ? _fbb.CreateVector<uint64_t>(_o->vector_of_non_owning_references.size(), [](size_t i, _VectorArgs *__va) { return __va->__rehasher ? static_cast<uint64_t>((*__va->__rehasher)(__va->__o->vector_of_non_owning_references[i])) : 0; }, &_va ) : 0;\n  auto _any_unique_type = _o->any_unique.type;\n  auto _any_unique = _o->any_unique.Pack(_fbb);\n  auto _any_ambiguous_type = _o->any_ambiguous.type;\n  auto _any_ambiguous = _o->any_ambiguous.Pack(_fbb);\n  auto _vector_of_enums = _o->vector_of_enums.size() ? _fbb.CreateVectorScalarCast<uint8_t>(::flatbuffers::data(_o->vector_of_enums), _o->vector_of_enums.size()) : 0;\n  auto _signed_enum = _o->signed_enum;\n  auto _testrequirednestedflatbuffer = _o->testrequirednestedflatbuffer.size() ? _fbb.CreateVector(_o->testrequirednestedflatbuffer) : 0;\n  auto _scalar_key_sorted_tables = _o->scalar_key_sorted_tables.size() ? _fbb.CreateVector<::flatbuffers::Offset<MyGame::Example::Stat>> (_o->scalar_key_sorted_tables.size(), [](size_t i, _VectorArgs *__va) { return MyGame::Example::CreateStat(*__va->__fbb, __va->__o->scalar_key_sorted_tables[i].get(), __va->__rehasher); }, &_va ) : 0;\n  auto _native_inline = &_o->native_inline;\n  auto _long_enum_non_enum_default = _o->long_enum_non_enum_default;\n  auto _long_enum_normal_default = _o->long_enum_normal_default;\n  auto _nan_default = _o->nan_default;\n  auto _inf_default = _o->inf_default;\n  auto _positive_inf_default = _o->positive_inf_default;\n  auto _infinity_default = _o->infinity_default;\n  auto _positive_infinity_default = _o->positive_infinity_default;\n  auto _negative_inf_default = _o->negative_inf_default;\n  auto _negative_infinity_default = _o->negative_infinity_default;\n  auto _double_inf_default = _o->double_inf_default;\n  return MyGame::Example::CreateMonster(\n      _fbb,\n      _pos,\n      _mana,\n      _hp,\n      _name,\n      _inventory,\n      _color,\n      _test_type,\n      _test,\n      _test4,\n      _testarrayofstring,\n      _testarrayoftables,\n      _enemy,\n      _testnestedflatbuffer,\n      _testempty,\n      _testbool,\n      _testhashs32_fnv1,\n      _testhashu32_fnv1,\n      _testhashs64_fnv1,\n      _testhashu64_fnv1,\n      _testhashs32_fnv1a,\n      _testhashu32_fnv1a,\n      _testhashs64_fnv1a,\n      _testhashu64_fnv1a,\n      _testarrayofbools,\n      _testf,\n      _testf2,\n      _testf3,\n      _testarrayofstring2,\n      _testarrayofsortedstruct,\n      _flex,\n      _test5,\n      _vector_of_longs,\n      _vector_of_doubles,\n      _parent_namespace_test,\n      _vector_of_referrables,\n      _single_weak_reference,\n      _vector_of_weak_references,\n      _vector_of_strong_referrables,\n      _co_owning_reference,\n      _vector_of_co_owning_references,\n      _non_owning_reference,\n      _vector_of_non_owning_references,\n      _any_unique_type,\n      _any_unique,\n      _any_ambiguous_type,\n      _any_ambiguous,\n      _vector_of_enums,\n      _signed_enum,\n      _testrequirednestedflatbuffer,\n      _scalar_key_sorted_tables,\n      _native_inline,\n      _long_enum_non_enum_default,\n      _long_enum_normal_default,\n      _nan_default,\n      _inf_default,\n      _positive_inf_default,\n      _infinity_default,\n      _positive_infinity_default,\n      _negative_inf_default,\n      _negative_infinity_default,\n      _double_inf_default);\n}\n\n\ninline bool operator==(const TypeAliasesT &lhs, const TypeAliasesT &rhs) {\n  return\n      (lhs.i8 == rhs.i8) &&\n      (lhs.u8 == rhs.u8) &&\n      (lhs.i16 == rhs.i16) &&\n      (lhs.u16 == rhs.u16) &&\n      (lhs.i32 == rhs.i32) &&\n      (lhs.u32 == rhs.u32) &&\n      (lhs.i64 == rhs.i64) &&\n      (lhs.u64 == rhs.u64) &&\n      (lhs.f32 == rhs.f32) &&\n      (lhs.f64 == rhs.f64) &&\n      (lhs.v8 == rhs.v8) &&\n      (lhs.vf64 == rhs.vf64);\n}\n\ninline bool operator!=(const TypeAliasesT &lhs, const TypeAliasesT &rhs) {\n    return !(lhs == rhs);\n}\n\n\ninline TypeAliasesT *TypeAliases::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {\n  auto _o = std::unique_ptr<TypeAliasesT>(new TypeAliasesT());\n  UnPackTo(_o.get(), _resolver);\n  return _o.release();\n}\n\ninline void TypeAliases::UnPackTo(TypeAliasesT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {\n  (void)_o;\n  (void)_resolver;\n  { auto _e = i8(); _o->i8 = _e; }\n  { auto _e = u8(); _o->u8 = _e; }\n  { auto _e = i16(); _o->i16 = _e; }\n  { auto _e = u16(); _o->u16 = _e; }\n  { auto _e = i32(); _o->i32 = _e; }\n  { auto _e = u32(); _o->u32 = _e; }\n  { auto _e = i64(); _o->i64 = _e; }\n  { auto _e = u64(); _o->u64 = _e; }\n  { auto _e = f32(); _o->f32 = _e; }\n  { auto _e = f64(); _o->f64 = _e; }\n  { auto _e = v8(); if (_e) { _o->v8.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->v8.begin()); } }\n  { auto _e = vf64(); if (_e) { _o->vf64.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vf64[_i] = _e->Get(_i); } } else { _o->vf64.resize(0); } }\n}\n\ninline ::flatbuffers::Offset<TypeAliases> CreateTypeAliases(::flatbuffers::FlatBufferBuilder &_fbb, const TypeAliasesT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  return TypeAliases::Pack(_fbb, _o, _rehasher);\n}\n\ninline ::flatbuffers::Offset<TypeAliases> TypeAliases::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const TypeAliasesT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {\n  (void)_rehasher;\n  (void)_o;\n  struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const TypeAliasesT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;\n  auto _i8 = _o->i8;\n  auto _u8 = _o->u8;\n  auto _i16 = _o->i16;\n  auto _u16 = _o->u16;\n  auto _i32 = _o->i32;\n  auto _u32 = _o->u32;\n  auto _i64 = _o->i64;\n  auto _u64 = _o->u64;\n  auto _f32 = _o->f32;\n  auto _f64 = _o->f64;\n  auto _v8 = _o->v8.size() ? _fbb.CreateVector(_o->v8) : 0;\n  auto _vf64 = _o->vf64.size() ? _fbb.CreateVector(_o->vf64) : 0;\n  return MyGame::Example::CreateTypeAliases(\n      _fbb,\n      _i8,\n      _u8,\n      _i16,\n      _u16,\n      _i32,\n      _u32,\n      _i64,\n      _u64,\n      _f32,\n      _f64,\n      _v8,\n      _vf64);\n}\n\ntemplate <bool B>\ninline bool VerifyAny(::flatbuffers::VerifierTemplate<B> &verifier, const void *obj, Any type) {\n  switch (type) {\n    case Any_NONE: {\n      return true;\n    }\n    case Any_Monster: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return verifier.VerifyTable(ptr);\n    }\n    case Any_TestSimpleTableWithEnum: {\n      auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnum *>(obj);\n      return verifier.VerifyTable(ptr);\n    }\n    case Any_MyGame_Example2_Monster: {\n      auto ptr = reinterpret_cast<const MyGame::Example2::Monster *>(obj);\n      return verifier.VerifyTable(ptr);\n    }\n    default: return true;\n  }\n}\n\ntemplate <bool B>\ninline bool VerifyAnyVector(::flatbuffers::VerifierTemplate<B> &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types) {\n  if (!values || !types) return !values && !types;\n  if (values->size() != types->size()) return false;\n  for (::flatbuffers::uoffset_t i = 0; i < values->size(); ++i) {\n    if (!VerifyAny(\n        verifier,  values->Get(i), types->GetEnum<Any>(i))) {\n      return false;\n    }\n  }\n  return true;\n}\n\ninline void *AnyUnion::UnPack(const void *obj, Any type, const ::flatbuffers::resolver_function_t *resolver) {\n  (void)resolver;\n  switch (type) {\n    case Any_Monster: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return ptr->UnPack(resolver);\n    }\n    case Any_TestSimpleTableWithEnum: {\n      auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnum *>(obj);\n      return ptr->UnPack(resolver);\n    }\n    case Any_MyGame_Example2_Monster: {\n      auto ptr = reinterpret_cast<const MyGame::Example2::Monster *>(obj);\n      return ptr->UnPack(resolver);\n    }\n    default: return nullptr;\n  }\n}\n\ninline ::flatbuffers::Offset<void> AnyUnion::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ::flatbuffers::rehasher_function_t *_rehasher) const {\n  (void)_rehasher;\n  switch (type) {\n    case Any_Monster: {\n      auto ptr = reinterpret_cast<const MyGame::Example::MonsterT *>(value);\n      return CreateMonster(_fbb, ptr, _rehasher).Union();\n    }\n    case Any_TestSimpleTableWithEnum: {\n      auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(value);\n      return CreateTestSimpleTableWithEnum(_fbb, ptr, _rehasher).Union();\n    }\n    case Any_MyGame_Example2_Monster: {\n      auto ptr = reinterpret_cast<const MyGame::Example2::MonsterT *>(value);\n      return CreateMonster(_fbb, ptr, _rehasher).Union();\n    }\n    default: return 0;\n  }\n}\n\ninline AnyUnion::AnyUnion(const AnyUnion &u) : type(u.type), value(nullptr) {\n  switch (type) {\n    case Any_Monster: {\n      value = new MyGame::Example::MonsterT(*reinterpret_cast<MyGame::Example::MonsterT *>(u.value));\n      break;\n    }\n    case Any_TestSimpleTableWithEnum: {\n      value = new MyGame::Example::TestSimpleTableWithEnumT(*reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(u.value));\n      break;\n    }\n    case Any_MyGame_Example2_Monster: {\n      value = new MyGame::Example2::MonsterT(*reinterpret_cast<MyGame::Example2::MonsterT *>(u.value));\n      break;\n    }\n    default:\n      break;\n  }\n}\n\ninline void AnyUnion::Reset() {\n  switch (type) {\n    case Any_Monster: {\n      auto ptr = reinterpret_cast<MyGame::Example::MonsterT *>(value);\n      delete ptr;\n      break;\n    }\n    case Any_TestSimpleTableWithEnum: {\n      auto ptr = reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(value);\n      delete ptr;\n      break;\n    }\n    case Any_MyGame_Example2_Monster: {\n      auto ptr = reinterpret_cast<MyGame::Example2::MonsterT *>(value);\n      delete ptr;\n      break;\n    }\n    default: break;\n  }\n  value = nullptr;\n  type = Any_NONE;\n}\n\ntemplate <bool B>\ninline bool VerifyAnyUniqueAliases(::flatbuffers::VerifierTemplate<B> &verifier, const void *obj, AnyUniqueAliases type) {\n  switch (type) {\n    case AnyUniqueAliases_NONE: {\n      return true;\n    }\n    case AnyUniqueAliases_M: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return verifier.VerifyTable(ptr);\n    }\n    case AnyUniqueAliases_TS: {\n      auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnum *>(obj);\n      return verifier.VerifyTable(ptr);\n    }\n    case AnyUniqueAliases_M2: {\n      auto ptr = reinterpret_cast<const MyGame::Example2::Monster *>(obj);\n      return verifier.VerifyTable(ptr);\n    }\n    default: return true;\n  }\n}\n\ntemplate <bool B>\ninline bool VerifyAnyUniqueAliasesVector(::flatbuffers::VerifierTemplate<B> &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types) {\n  if (!values || !types) return !values && !types;\n  if (values->size() != types->size()) return false;\n  for (::flatbuffers::uoffset_t i = 0; i < values->size(); ++i) {\n    if (!VerifyAnyUniqueAliases(\n        verifier,  values->Get(i), types->GetEnum<AnyUniqueAliases>(i))) {\n      return false;\n    }\n  }\n  return true;\n}\n\ninline void *AnyUniqueAliasesUnion::UnPack(const void *obj, AnyUniqueAliases type, const ::flatbuffers::resolver_function_t *resolver) {\n  (void)resolver;\n  switch (type) {\n    case AnyUniqueAliases_M: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return ptr->UnPack(resolver);\n    }\n    case AnyUniqueAliases_TS: {\n      auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnum *>(obj);\n      return ptr->UnPack(resolver);\n    }\n    case AnyUniqueAliases_M2: {\n      auto ptr = reinterpret_cast<const MyGame::Example2::Monster *>(obj);\n      return ptr->UnPack(resolver);\n    }\n    default: return nullptr;\n  }\n}\n\ninline ::flatbuffers::Offset<void> AnyUniqueAliasesUnion::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ::flatbuffers::rehasher_function_t *_rehasher) const {\n  (void)_rehasher;\n  switch (type) {\n    case AnyUniqueAliases_M: {\n      auto ptr = reinterpret_cast<const MyGame::Example::MonsterT *>(value);\n      return CreateMonster(_fbb, ptr, _rehasher).Union();\n    }\n    case AnyUniqueAliases_TS: {\n      auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(value);\n      return CreateTestSimpleTableWithEnum(_fbb, ptr, _rehasher).Union();\n    }\n    case AnyUniqueAliases_M2: {\n      auto ptr = reinterpret_cast<const MyGame::Example2::MonsterT *>(value);\n      return CreateMonster(_fbb, ptr, _rehasher).Union();\n    }\n    default: return 0;\n  }\n}\n\ninline AnyUniqueAliasesUnion::AnyUniqueAliasesUnion(const AnyUniqueAliasesUnion &u) : type(u.type), value(nullptr) {\n  switch (type) {\n    case AnyUniqueAliases_M: {\n      value = new MyGame::Example::MonsterT(*reinterpret_cast<MyGame::Example::MonsterT *>(u.value));\n      break;\n    }\n    case AnyUniqueAliases_TS: {\n      value = new MyGame::Example::TestSimpleTableWithEnumT(*reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(u.value));\n      break;\n    }\n    case AnyUniqueAliases_M2: {\n      value = new MyGame::Example2::MonsterT(*reinterpret_cast<MyGame::Example2::MonsterT *>(u.value));\n      break;\n    }\n    default:\n      break;\n  }\n}\n\ninline void AnyUniqueAliasesUnion::Reset() {\n  switch (type) {\n    case AnyUniqueAliases_M: {\n      auto ptr = reinterpret_cast<MyGame::Example::MonsterT *>(value);\n      delete ptr;\n      break;\n    }\n    case AnyUniqueAliases_TS: {\n      auto ptr = reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(value);\n      delete ptr;\n      break;\n    }\n    case AnyUniqueAliases_M2: {\n      auto ptr = reinterpret_cast<MyGame::Example2::MonsterT *>(value);\n      delete ptr;\n      break;\n    }\n    default: break;\n  }\n  value = nullptr;\n  type = AnyUniqueAliases_NONE;\n}\n\ntemplate <bool B>\ninline bool VerifyAnyAmbiguousAliases(::flatbuffers::VerifierTemplate<B> &verifier, const void *obj, AnyAmbiguousAliases type) {\n  switch (type) {\n    case AnyAmbiguousAliases_NONE: {\n      return true;\n    }\n    case AnyAmbiguousAliases_M1: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return verifier.VerifyTable(ptr);\n    }\n    case AnyAmbiguousAliases_M2: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return verifier.VerifyTable(ptr);\n    }\n    case AnyAmbiguousAliases_M3: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return verifier.VerifyTable(ptr);\n    }\n    default: return true;\n  }\n}\n\ntemplate <bool B>\ninline bool VerifyAnyAmbiguousAliasesVector(::flatbuffers::VerifierTemplate<B> &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset<void>> *values, const ::flatbuffers::Vector<uint8_t> *types) {\n  if (!values || !types) return !values && !types;\n  if (values->size() != types->size()) return false;\n  for (::flatbuffers::uoffset_t i = 0; i < values->size(); ++i) {\n    if (!VerifyAnyAmbiguousAliases(\n        verifier,  values->Get(i), types->GetEnum<AnyAmbiguousAliases>(i))) {\n      return false;\n    }\n  }\n  return true;\n}\n\ninline void *AnyAmbiguousAliasesUnion::UnPack(const void *obj, AnyAmbiguousAliases type, const ::flatbuffers::resolver_function_t *resolver) {\n  (void)resolver;\n  switch (type) {\n    case AnyAmbiguousAliases_M1: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return ptr->UnPack(resolver);\n    }\n    case AnyAmbiguousAliases_M2: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return ptr->UnPack(resolver);\n    }\n    case AnyAmbiguousAliases_M3: {\n      auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);\n      return ptr->UnPack(resolver);\n    }\n    default: return nullptr;\n  }\n}\n\ninline ::flatbuffers::Offset<void> AnyAmbiguousAliasesUnion::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ::flatbuffers::rehasher_function_t *_rehasher) const {\n  (void)_rehasher;\n  switch (type) {\n    case AnyAmbiguousAliases_M1: {\n      auto ptr = reinterpret_cast<const MyGame::Example::MonsterT *>(value);\n      return CreateMonster(_fbb, ptr, _rehasher).Union();\n    }\n    case AnyAmbiguousAliases_M2: {\n      auto ptr = reinterpret_cast<const MyGame::Example::MonsterT *>(value);\n      return CreateMonster(_fbb, ptr, _rehasher).Union();\n    }\n    case AnyAmbiguousAliases_M3: {\n      auto ptr = reinterpret_cast<const MyGame::Example::MonsterT *>(value);\n      return CreateMonster(_fbb, ptr, _rehasher).Union();\n    }\n    default: return 0;\n  }\n}\n\ninline AnyAmbiguousAliasesUnion::AnyAmbiguousAliasesUnion(const AnyAmbiguousAliasesUnion &u) : type(u.type), value(nullptr) {\n  switch (type) {\n    case AnyAmbiguousAliases_M1: {\n      value = new MyGame::Example::MonsterT(*reinterpret_cast<MyGame::Example::MonsterT *>(u.value));\n      break;\n    }\n    case AnyAmbiguousAliases_M2: {\n      value = new MyGame::Example::MonsterT(*reinterpret_cast<MyGame::Example::MonsterT *>(u.value));\n      break;\n    }\n    case AnyAmbiguousAliases_M3: {\n      value = new MyGame::Example::MonsterT(*reinterpret_cast<MyGame::Example::MonsterT *>(u.value));\n      break;\n    }\n    default:\n      break;\n  }\n}\n\ninline void AnyAmbiguousAliasesUnion::Reset() {\n  switch (type) {\n    case AnyAmbiguousAliases_M1: {\n      auto ptr = reinterpret_cast<MyGame::Example::MonsterT *>(value);\n      delete ptr;\n      break;\n    }\n    case AnyAmbiguousAliases_M2: {\n      auto ptr = reinterpret_cast<MyGame::Example::MonsterT *>(value);\n      delete ptr;\n      break;\n    }\n    case AnyAmbiguousAliases_M3: {\n      auto ptr = reinterpret_cast<MyGame::Example::MonsterT *>(value);\n      delete ptr;\n      break;\n    }\n    default: break;\n  }\n  value = nullptr;\n  type = AnyAmbiguousAliases_NONE;\n}\n\ninline const ::flatbuffers::TypeTable *ColorTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_UCHAR, 0, 0 },\n    { ::flatbuffers::ET_UCHAR, 0, 0 },\n    { ::flatbuffers::ET_UCHAR, 0, 0 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::ColorTypeTable\n  };\n  static const int64_t values[] = { 1, 2, 8 };\n  static const char * const names[] = {\n    \"Red\",\n    \"Green\",\n    \"Blue\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_ENUM, 3, type_codes, type_refs, nullptr, values, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *RaceTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_CHAR, 0, 0 },\n    { ::flatbuffers::ET_CHAR, 0, 0 },\n    { ::flatbuffers::ET_CHAR, 0, 0 },\n    { ::flatbuffers::ET_CHAR, 0, 0 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::RaceTypeTable\n  };\n  static const int64_t values[] = { -1, 0, 1, 2 };\n  static const char * const names[] = {\n    \"None\",\n    \"Human\",\n    \"Dwarf\",\n    \"Elf\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_ENUM, 4, type_codes, type_refs, nullptr, values, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *LongEnumTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_ULONG, 0, 0 },\n    { ::flatbuffers::ET_ULONG, 0, 0 },\n    { ::flatbuffers::ET_ULONG, 0, 0 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::LongEnumTypeTable\n  };\n  static const int64_t values[] = { 2ULL, 4ULL, 1099511627776ULL };\n  static const char * const names[] = {\n    \"LongOne\",\n    \"LongTwo\",\n    \"LongBig\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_ENUM, 3, type_codes, type_refs, nullptr, values, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *AnyTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_SEQUENCE, 0, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 0 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 1 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 2 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::MonsterTypeTable,\n    MyGame::Example::TestSimpleTableWithEnumTypeTable,\n    MyGame::Example2::MonsterTypeTable\n  };\n  static const char * const names[] = {\n    \"NONE\",\n    \"Monster\",\n    \"TestSimpleTableWithEnum\",\n    \"MyGame_Example2_Monster\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, nullptr, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *AnyUniqueAliasesTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_SEQUENCE, 0, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 0 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 1 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 2 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::MonsterTypeTable,\n    MyGame::Example::TestSimpleTableWithEnumTypeTable,\n    MyGame::Example2::MonsterTypeTable\n  };\n  static const char * const names[] = {\n    \"NONE\",\n    \"M\",\n    \"TS\",\n    \"M2\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, nullptr, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *AnyAmbiguousAliasesTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_SEQUENCE, 0, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 0 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 0 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 0 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::MonsterTypeTable\n  };\n  static const char * const names[] = {\n    \"NONE\",\n    \"M1\",\n    \"M2\",\n    \"M3\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, nullptr, names\n  };\n  return &tt;\n}\n\n}  // namespace Example\n\ninline const ::flatbuffers::TypeTable *InParentNamespaceTypeTable() {\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_TABLE, 0, nullptr, nullptr, nullptr, nullptr, nullptr\n  };\n  return &tt;\n}\n\nnamespace Example2 {\n\ninline const ::flatbuffers::TypeTable *MonsterTypeTable() {\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_TABLE, 0, nullptr, nullptr, nullptr, nullptr, nullptr\n  };\n  return &tt;\n}\n\n}  // namespace Example2\n\nnamespace Example {\n\ninline const ::flatbuffers::TypeTable *TestTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_SHORT, 0, -1 },\n    { ::flatbuffers::ET_CHAR, 0, -1 }\n  };\n  static const int64_t values[] = { 0, 2, 4 };\n  static const char * const names[] = {\n    \"a\",\n    \"b\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_STRUCT, 2, type_codes, nullptr, nullptr, values, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *TestSimpleTableWithEnumTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_UCHAR, 0, 0 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::ColorTypeTable\n  };\n  static const char * const names[] = {\n    \"color\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_TABLE, 1, type_codes, type_refs, nullptr, nullptr, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *Vec3TypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_DOUBLE, 0, -1 },\n    { ::flatbuffers::ET_UCHAR, 0, 0 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 1 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::ColorTypeTable,\n    MyGame::Example::TestTypeTable\n  };\n  static const int64_t values[] = { 0, 4, 8, 16, 24, 26, 32 };\n  static const char * const names[] = {\n    \"x\",\n    \"y\",\n    \"z\",\n    \"test1\",\n    \"test2\",\n    \"test3\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_STRUCT, 6, type_codes, type_refs, nullptr, values, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *AbilityTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_UINT, 0, -1 },\n    { ::flatbuffers::ET_UINT, 0, -1 }\n  };\n  static const int64_t values[] = { 0, 4, 8 };\n  static const char * const names[] = {\n    \"id\",\n    \"distance\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_STRUCT, 2, type_codes, nullptr, nullptr, values, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *StructOfStructsTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_SEQUENCE, 0, 0 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 1 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 0 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::AbilityTypeTable,\n    MyGame::Example::TestTypeTable\n  };\n  static const int64_t values[] = { 0, 8, 12, 20 };\n  static const char * const names[] = {\n    \"a\",\n    \"b\",\n    \"c\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_STRUCT, 3, type_codes, type_refs, nullptr, values, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *StructOfStructsOfStructsTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_SEQUENCE, 0, 0 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::StructOfStructsTypeTable\n  };\n  static const int64_t values[] = { 0, 20 };\n  static const char * const names[] = {\n    \"a\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_STRUCT, 1, type_codes, type_refs, nullptr, values, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *StatTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_STRING, 0, -1 },\n    { ::flatbuffers::ET_LONG, 0, -1 },\n    { ::flatbuffers::ET_USHORT, 0, -1 }\n  };\n  static const char * const names[] = {\n    \"id\",\n    \"val\",\n    \"count\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_TABLE, 3, type_codes, nullptr, nullptr, nullptr, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *ReferrableTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_ULONG, 0, -1 }\n  };\n  static const char * const names[] = {\n    \"id\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_TABLE, 1, type_codes, nullptr, nullptr, nullptr, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *MonsterTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_SEQUENCE, 0, 0 },\n    { ::flatbuffers::ET_SHORT, 0, -1 },\n    { ::flatbuffers::ET_SHORT, 0, -1 },\n    { ::flatbuffers::ET_STRING, 0, -1 },\n    { ::flatbuffers::ET_BOOL, 0, -1 },\n    { ::flatbuffers::ET_UCHAR, 1, -1 },\n    { ::flatbuffers::ET_UCHAR, 0, 1 },\n    { ::flatbuffers::ET_UTYPE, 0, 2 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 2 },\n    { ::flatbuffers::ET_SEQUENCE, 1, 3 },\n    { ::flatbuffers::ET_STRING, 1, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 1, 4 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 4 },\n    { ::flatbuffers::ET_UCHAR, 1, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 5 },\n    { ::flatbuffers::ET_BOOL, 0, -1 },\n    { ::flatbuffers::ET_INT, 0, -1 },\n    { ::flatbuffers::ET_UINT, 0, -1 },\n    { ::flatbuffers::ET_LONG, 0, -1 },\n    { ::flatbuffers::ET_ULONG, 0, -1 },\n    { ::flatbuffers::ET_INT, 0, -1 },\n    { ::flatbuffers::ET_UINT, 0, -1 },\n    { ::flatbuffers::ET_LONG, 0, -1 },\n    { ::flatbuffers::ET_ULONG, 0, -1 },\n    { ::flatbuffers::ET_BOOL, 1, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_STRING, 1, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 1, 6 },\n    { ::flatbuffers::ET_UCHAR, 1, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 1, 3 },\n    { ::flatbuffers::ET_LONG, 1, -1 },\n    { ::flatbuffers::ET_DOUBLE, 1, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 7 },\n    { ::flatbuffers::ET_SEQUENCE, 1, 8 },\n    { ::flatbuffers::ET_ULONG, 0, -1 },\n    { ::flatbuffers::ET_ULONG, 1, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 1, 8 },\n    { ::flatbuffers::ET_ULONG, 0, -1 },\n    { ::flatbuffers::ET_ULONG, 1, -1 },\n    { ::flatbuffers::ET_ULONG, 0, -1 },\n    { ::flatbuffers::ET_ULONG, 1, -1 },\n    { ::flatbuffers::ET_UTYPE, 0, 9 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 9 },\n    { ::flatbuffers::ET_UTYPE, 0, 10 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 10 },\n    { ::flatbuffers::ET_UCHAR, 1, 1 },\n    { ::flatbuffers::ET_CHAR, 0, 11 },\n    { ::flatbuffers::ET_UCHAR, 1, -1 },\n    { ::flatbuffers::ET_SEQUENCE, 1, 5 },\n    { ::flatbuffers::ET_SEQUENCE, 0, 3 },\n    { ::flatbuffers::ET_ULONG, 0, 12 },\n    { ::flatbuffers::ET_ULONG, 0, 12 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_DOUBLE, 0, -1 }\n  };\n  static const ::flatbuffers::TypeFunction type_refs[] = {\n    MyGame::Example::Vec3TypeTable,\n    MyGame::Example::ColorTypeTable,\n    MyGame::Example::AnyTypeTable,\n    MyGame::Example::TestTypeTable,\n    MyGame::Example::MonsterTypeTable,\n    MyGame::Example::StatTypeTable,\n    MyGame::Example::AbilityTypeTable,\n    MyGame::InParentNamespaceTypeTable,\n    MyGame::Example::ReferrableTypeTable,\n    MyGame::Example::AnyUniqueAliasesTypeTable,\n    MyGame::Example::AnyAmbiguousAliasesTypeTable,\n    MyGame::Example::RaceTypeTable,\n    MyGame::Example::LongEnumTypeTable\n  };\n  static const char * const names[] = {\n    \"pos\",\n    \"mana\",\n    \"hp\",\n    \"name\",\n    \"friendly\",\n    \"inventory\",\n    \"color\",\n    \"test_type\",\n    \"test\",\n    \"test4\",\n    \"testarrayofstring\",\n    \"testarrayoftables\",\n    \"enemy\",\n    \"testnestedflatbuffer\",\n    \"testempty\",\n    \"testbool\",\n    \"testhashs32_fnv1\",\n    \"testhashu32_fnv1\",\n    \"testhashs64_fnv1\",\n    \"testhashu64_fnv1\",\n    \"testhashs32_fnv1a\",\n    \"testhashu32_fnv1a\",\n    \"testhashs64_fnv1a\",\n    \"testhashu64_fnv1a\",\n    \"testarrayofbools\",\n    \"testf\",\n    \"testf2\",\n    \"testf3\",\n    \"testarrayofstring2\",\n    \"testarrayofsortedstruct\",\n    \"flex\",\n    \"test5\",\n    \"vector_of_longs\",\n    \"vector_of_doubles\",\n    \"parent_namespace_test\",\n    \"vector_of_referrables\",\n    \"single_weak_reference\",\n    \"vector_of_weak_references\",\n    \"vector_of_strong_referrables\",\n    \"co_owning_reference\",\n    \"vector_of_co_owning_references\",\n    \"non_owning_reference\",\n    \"vector_of_non_owning_references\",\n    \"any_unique_type\",\n    \"any_unique\",\n    \"any_ambiguous_type\",\n    \"any_ambiguous\",\n    \"vector_of_enums\",\n    \"signed_enum\",\n    \"testrequirednestedflatbuffer\",\n    \"scalar_key_sorted_tables\",\n    \"native_inline\",\n    \"long_enum_non_enum_default\",\n    \"long_enum_normal_default\",\n    \"nan_default\",\n    \"inf_default\",\n    \"positive_inf_default\",\n    \"infinity_default\",\n    \"positive_infinity_default\",\n    \"negative_inf_default\",\n    \"negative_infinity_default\",\n    \"double_inf_default\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_TABLE, 62, type_codes, type_refs, nullptr, nullptr, names\n  };\n  return &tt;\n}\n\ninline const ::flatbuffers::TypeTable *TypeAliasesTypeTable() {\n  static const ::flatbuffers::TypeCode type_codes[] = {\n    { ::flatbuffers::ET_CHAR, 0, -1 },\n    { ::flatbuffers::ET_UCHAR, 0, -1 },\n    { ::flatbuffers::ET_SHORT, 0, -1 },\n    { ::flatbuffers::ET_USHORT, 0, -1 },\n    { ::flatbuffers::ET_INT, 0, -1 },\n    { ::flatbuffers::ET_UINT, 0, -1 },\n    { ::flatbuffers::ET_LONG, 0, -1 },\n    { ::flatbuffers::ET_ULONG, 0, -1 },\n    { ::flatbuffers::ET_FLOAT, 0, -1 },\n    { ::flatbuffers::ET_DOUBLE, 0, -1 },\n    { ::flatbuffers::ET_CHAR, 1, -1 },\n    { ::flatbuffers::ET_DOUBLE, 1, -1 }\n  };\n  static const char * const names[] = {\n    \"i8\",\n    \"u8\",\n    \"i16\",\n    \"u16\",\n    \"i32\",\n    \"u32\",\n    \"i64\",\n    \"u64\",\n    \"f32\",\n    \"f64\",\n    \"v8\",\n    \"vf64\"\n  };\n  static const ::flatbuffers::TypeTable tt = {\n    ::flatbuffers::ST_TABLE, 12, type_codes, nullptr, nullptr, nullptr, names\n  };\n  return &tt;\n}\n\ninline const MyGame::Example::Monster *GetMonster(const void *buf) {\n  return ::flatbuffers::GetRoot<MyGame::Example::Monster>(buf);\n}\n\ninline const MyGame::Example::Monster *GetSizePrefixedMonster(const void *buf) {\n  return ::flatbuffers::GetSizePrefixedRoot<MyGame::Example::Monster>(buf);\n}\n\ninline Monster *GetMutableMonster(void *buf) {\n  return ::flatbuffers::GetMutableRoot<Monster>(buf);\n}\n\ninline MyGame::Example::Monster *GetMutableSizePrefixedMonster(void *buf) {\n  return ::flatbuffers::GetMutableSizePrefixedRoot<MyGame::Example::Monster>(buf);\n}\n\ninline const char *MonsterIdentifier() {\n  return \"MONS\";\n}\n\ninline bool MonsterBufferHasIdentifier(const void *buf) {\n  return ::flatbuffers::BufferHasIdentifier(\n      buf, MonsterIdentifier());\n}\n\ninline bool SizePrefixedMonsterBufferHasIdentifier(const void *buf) {\n  return ::flatbuffers::BufferHasIdentifier(\n      buf, MonsterIdentifier(), true);\n}\n\ntemplate <bool B = false>\ninline bool VerifyMonsterBuffer(\n    ::flatbuffers::VerifierTemplate<B> &verifier) {\n  return verifier.template VerifyBuffer<MyGame::Example::Monster>(MonsterIdentifier());\n}\n\ntemplate <bool B = false>\ninline bool VerifySizePrefixedMonsterBuffer(\n    ::flatbuffers::VerifierTemplate<B> &verifier) {\n  return verifier.template VerifySizePrefixedBuffer<MyGame::Example::Monster>(MonsterIdentifier());\n}\n\ninline const char *MonsterExtension() {\n  return \"mon\";\n}\n\ninline void FinishMonsterBuffer(\n    ::flatbuffers::FlatBufferBuilder &fbb,\n    ::flatbuffers::Offset<MyGame::Example::Monster> root) {\n  fbb.Finish(root, MonsterIdentifier());\n}\n\ninline void FinishSizePrefixedMonsterBuffer(\n    ::flatbuffers::FlatBufferBuilder &fbb,\n    ::flatbuffers::Offset<MyGame::Example::Monster> root) {\n  fbb.FinishSizePrefixed(root, MonsterIdentifier());\n}\n\ninline std::unique_ptr<MyGame::Example::MonsterT> UnPackMonster(\n    const void *buf,\n    const ::flatbuffers::resolver_function_t *res = nullptr) {\n  return std::unique_ptr<MyGame::Example::MonsterT>(GetMonster(buf)->UnPack(res));\n}\n\ninline std::unique_ptr<MyGame::Example::MonsterT> UnPackSizePrefixedMonster(\n    const void *buf,\n    const ::flatbuffers::resolver_function_t *res = nullptr) {\n  return std::unique_ptr<MyGame::Example::MonsterT>(GetSizePrefixedMonster(buf)->UnPack(res));\n}\n\n}  // namespace Example\n}  // namespace MyGame\n\n#endif  // FLATBUFFERS_GENERATED_MONSTERTEST_MYGAME_EXAMPLE_H_\n"
  },
  {
    "path": "tests/monsterdata_extra.json",
    "content": "{\n  // Initialize with non-default values.\n  d0 : -nan, // match with default\n  d1 : +inf,\n  d2 : -inf,\n  d3:   nan,\n  f0 : +nan, // match with default\n  f1 : -nan, // match with default\n  f2 : +inf, // match with default\n  f3 : -inf, // match with default\n  // Values should have exact binary representation \n  // to avoid rounding effects in tests.\n  dvec : [2.0, +inf, -inf, nan,],\n  fvec : [1.0, -inf, +inf, nan],\n}\n"
  },
  {
    "path": "tests/monsterdata_test.afb",
    "content": "// Annotated Flatbuffer Binary\n//\n// Schema file: monster_test.fbs\n// Binary file: monsterdata_test.mon\n\nheader:\n  +0x0000 | 78 00 00 00             | UOffset32  | 0x00000078 (120) Loc: 0x0078             | offset to root table `MyGame.Example.Monster`\n  +0x0004 | 4D 4F 4E 53             | char[4]    | MONS                                     | File Identifier\n\npadding:\n  +0x0008 | 00 00 00 00             | uint8_t[4] | ....                                     | padding\n\nvtable (MyGame.Example.Monster):\n  +0x000C | 6C 00                   | uint16_t   | 0x006C (108)                             | size of this vtable\n  +0x000E | 94 00                   | uint16_t   | 0x0094 (148)                             | size of referring table\n  +0x0010 | 08 00                   | VOffset16  | 0x0008 (8)                               | offset to field `pos` (id: 0)\n  +0x0012 | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `mana` (id: 1) <defaults to 150> (Short)\n  +0x0014 | 06 00                   | VOffset16  | 0x0006 (6)                               | offset to field `hp` (id: 2)\n  +0x0016 | 2C 00                   | VOffset16  | 0x002C (44)                              | offset to field `name` (id: 3)\n  +0x0018 | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `friendly` (id: 4) <defaults to 0> (Bool)\n  +0x001A | 30 00                   | VOffset16  | 0x0030 (48)                              | offset to field `inventory` (id: 5)\n  +0x001C | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `color` (id: 6) <defaults to 8> (UByte)\n  +0x001E | 04 00                   | VOffset16  | 0x0004 (4)                               | offset to field `test_type` (id: 7)\n  +0x0020 | 34 00                   | VOffset16  | 0x0034 (52)                              | offset to field `test` (id: 8)\n  +0x0022 | 38 00                   | VOffset16  | 0x0038 (56)                              | offset to field `test4` (id: 9)\n  +0x0024 | 3C 00                   | VOffset16  | 0x003C (60)                              | offset to field `testarrayofstring` (id: 10)\n  +0x0026 | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `testarrayoftables` (id: 11) <null> (Vector)\n  +0x0028 | 40 00                   | VOffset16  | 0x0040 (64)                              | offset to field `enemy` (id: 12)\n  +0x002A | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `testnestedflatbuffer` (id: 13) <null> (Vector)\n  +0x002C | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `testempty` (id: 14) <null> (Obj)\n  +0x002E | 05 00                   | VOffset16  | 0x0005 (5)                               | offset to field `testbool` (id: 15)\n  +0x0030 | 44 00                   | VOffset16  | 0x0044 (68)                              | offset to field `testhashs32_fnv1` (id: 16)\n  +0x0032 | 48 00                   | VOffset16  | 0x0048 (72)                              | offset to field `testhashu32_fnv1` (id: 17)\n  +0x0034 | 70 00                   | VOffset16  | 0x0070 (112)                             | offset to field `testhashs64_fnv1` (id: 18)\n  +0x0036 | 78 00                   | VOffset16  | 0x0078 (120)                             | offset to field `testhashu64_fnv1` (id: 19)\n  +0x0038 | 4C 00                   | VOffset16  | 0x004C (76)                              | offset to field `testhashs32_fnv1a` (id: 20)\n  +0x003A | 50 00                   | VOffset16  | 0x0050 (80)                              | offset to field `testhashu32_fnv1a` (id: 21)\n  +0x003C | 80 00                   | VOffset16  | 0x0080 (128)                             | offset to field `testhashs64_fnv1a` (id: 22)\n  +0x003E | 88 00                   | VOffset16  | 0x0088 (136)                             | offset to field `testhashu64_fnv1a` (id: 23)\n  +0x0040 | 54 00                   | VOffset16  | 0x0054 (84)                              | offset to field `testarrayofbools` (id: 24)\n  +0x0042 | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `testf` (id: 25) <defaults to 3.141590> (Float)\n  +0x0044 | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `testf2` (id: 26) <defaults to 3.000000> (Float)\n  +0x0046 | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `testf3` (id: 27) <defaults to 0.000000> (Float)\n  +0x0048 | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `testarrayofstring2` (id: 28) <null> (Vector)\n  +0x004A | 58 00                   | VOffset16  | 0x0058 (88)                              | offset to field `testarrayofsortedstruct` (id: 29)\n  +0x004C | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `flex` (id: 30) <null> (Vector)\n  +0x004E | 5C 00                   | VOffset16  | 0x005C (92)                              | offset to field `test5` (id: 31)\n  +0x0050 | 60 00                   | VOffset16  | 0x0060 (96)                              | offset to field `vector_of_longs` (id: 32)\n  +0x0052 | 64 00                   | VOffset16  | 0x0064 (100)                             | offset to field `vector_of_doubles` (id: 33)\n  +0x0054 | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `parent_namespace_test` (id: 34) <null> (Obj)\n  +0x0056 | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `vector_of_referrables` (id: 35) <null> (Vector)\n  +0x0058 | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `single_weak_reference` (id: 36) <defaults to 0> (ULong)\n  +0x005A | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `vector_of_weak_references` (id: 37) <null> (Vector)\n  +0x005C | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `vector_of_strong_referrables` (id: 38) <null> (Vector)\n  +0x005E | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `co_owning_reference` (id: 39) <defaults to 0> (ULong)\n  +0x0060 | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `vector_of_co_owning_references` (id: 40) <null> (Vector)\n  +0x0062 | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `non_owning_reference` (id: 41) <defaults to 0> (ULong)\n  +0x0064 | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `vector_of_non_owning_references` (id: 42) <null> (Vector)\n  +0x0066 | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `any_unique_type` (id: 43) <defaults to 0> (UType)\n  +0x0068 | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `any_unique` (id: 44) <null> (Union)\n  +0x006A | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `any_ambiguous_type` (id: 45) <defaults to 0> (UType)\n  +0x006C | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `any_ambiguous` (id: 46) <null> (Union)\n  +0x006E | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `vector_of_enums` (id: 47) <null> (Vector)\n  +0x0070 | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `signed_enum` (id: 48) <defaults to -1> (Byte)\n  +0x0072 | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `testrequirednestedflatbuffer` (id: 49) <null> (Vector)\n  +0x0074 | 68 00                   | VOffset16  | 0x0068 (104)                             | offset to field `scalar_key_sorted_tables` (id: 50)\n  +0x0076 | 6C 00                   | VOffset16  | 0x006C (108)                             | offset to field `native_inline` (id: 51)\n\nroot_table (MyGame.Example.Monster):\n  +0x0078 | 6C 00 00 00             | SOffset32  | 0x0000006C (108) Loc: 0x000C             | offset to vtable\n  +0x007C | 01                      | UType8     | 0x01 (1)                                 | table field `test_type` (UType)\n  +0x007D | 01                      | uint8_t    | 0x01 (1)                                 | table field `testbool` (Bool)\n  +0x007E | 50 00                   | int16_t    | 0x0050 (80)                              | table field `hp` (Short)\n  +0x0080 | 00 00 80 3F             | float      | 0x3F800000 (1)                           | struct field `pos.x` of 'MyGame.Example.Vec3' (Float)\n  +0x0084 | 00 00 00 40             | float      | 0x40000000 (2)                           | struct field `pos.y` of 'MyGame.Example.Vec3' (Float)\n  +0x0088 | 00 00 40 40             | float      | 0x40400000 (3)                           | struct field `pos.z` of 'MyGame.Example.Vec3' (Float)\n  +0x008C | 00 00 00 00             | uint8_t[4] | ....                                     | padding\n  +0x0090 | 00 00 00 00 00 00 08 40 | double     | 0x4008000000000000 (3)                   | struct field `pos.test1` of 'MyGame.Example.Vec3' (Double)\n  +0x0098 | 02                      | uint8_t    | 0x02 (2)                                 | struct field `pos.test2` of 'MyGame.Example.Vec3' (UByte)\n  +0x0099 | 00                      | uint8_t[1] | .                                        | padding\n  +0x009A | 05 00                   | int16_t    | 0x0005 (5)                               | struct field `pos.test3.a` of 'MyGame.Example.Test' (Short)\n  +0x009C | 06                      | uint8_t    | 0x06 (6)                                 | struct field `pos.test3.b` of 'MyGame.Example.Test' (Byte)\n  +0x009D | 00                      | uint8_t[1] | .                                        | padding\n  +0x009E | 00 00                   | uint8_t[2] | ..                                       | padding\n  +0x00A0 | 00 00 00 00             | uint8_t[4] | ....                                     | padding\n  +0x00A4 | A4 01 00 00             | UOffset32  | 0x000001A4 (420) Loc: 0x0248             | offset to field `name` (string)\n  +0x00A8 | 94 01 00 00             | UOffset32  | 0x00000194 (404) Loc: 0x023C             | offset to field `inventory` (vector)\n  +0x00AC | 2C 01 00 00             | UOffset32  | 0x0000012C (300) Loc: 0x01D8             | offset to field `test` (union of type `Monster`)\n  +0x00B0 | 10 01 00 00             | UOffset32  | 0x00000110 (272) Loc: 0x01C0             | offset to field `test4` (vector)\n  +0x00B4 | DC 00 00 00             | UOffset32  | 0x000000DC (220) Loc: 0x0190             | offset to field `testarrayofstring` (vector)\n  +0x00B8 | C4 00 00 00             | UOffset32  | 0x000000C4 (196) Loc: 0x017C             | offset to field `enemy` (table)\n  +0x00BC | 41 C9 79 DD             | uint32_t   | 0xDD79C941 (3715746113)                  | table field `testhashs32_fnv1` (Int)\n  +0x00C0 | 41 C9 79 DD             | uint32_t   | 0xDD79C941 (3715746113)                  | table field `testhashu32_fnv1` (UInt)\n  +0x00C4 | 71 A4 81 8E             | uint32_t   | 0x8E81A471 (2390860913)                  | table field `testhashs32_fnv1a` (Int)\n  +0x00C8 | 71 A4 81 8E             | uint32_t   | 0x8E81A471 (2390860913)                  | table field `testhashu32_fnv1a` (UInt)\n  +0x00CC | A8 00 00 00             | UOffset32  | 0x000000A8 (168) Loc: 0x0174             | offset to field `testarrayofbools` (vector)\n  +0x00D0 | 88 00 00 00             | UOffset32  | 0x00000088 (136) Loc: 0x0158             | offset to field `testarrayofsortedstruct` (vector)\n  +0x00D4 | E0 00 00 00             | UOffset32  | 0x000000E0 (224) Loc: 0x01B4             | offset to field `test5` (vector)\n  +0x00D8 | 34 01 00 00             | UOffset32  | 0x00000134 (308) Loc: 0x020C             | offset to field `vector_of_longs` (vector)\n  +0x00DC | 10 01 00 00             | UOffset32  | 0x00000110 (272) Loc: 0x01EC             | offset to field `vector_of_doubles` (vector)\n  +0x00E0 | 2C 00 00 00             | UOffset32  | 0x0000002C (44) Loc: 0x010C              | offset to field `scalar_key_sorted_tables` (vector)\n  +0x00E4 | 01 00                   | int16_t    | 0x0001 (1)                               | struct field `native_inline.a` of 'MyGame.Example.Test' (Short)\n  +0x00E6 | 02                      | uint8_t    | 0x02 (2)                                 | struct field `native_inline.b` of 'MyGame.Example.Test' (Byte)\n  +0x00E7 | 00                      | uint8_t[1] | .                                        | padding\n  +0x00E8 | 81 91 7B F2 CD 80 0F 6E | int64_t    | 0x6E0F80CDF27B9181 (7930699090847568257) | table field `testhashs64_fnv1` (Long)\n  +0x00F0 | 81 91 7B F2 CD 80 0F 6E | uint64_t   | 0x6E0F80CDF27B9181 (7930699090847568257) | table field `testhashu64_fnv1` (ULong)\n  +0x00F8 | F1 DD 67 C7 DC 48 F9 43 | int64_t    | 0x43F948DCC767DDF1 (4898026182817603057) | table field `testhashs64_fnv1a` (Long)\n  +0x0100 | F1 DD 67 C7 DC 48 F9 43 | uint64_t   | 0x43F948DCC767DDF1 (4898026182817603057) | table field `testhashu64_fnv1a` (ULong)\n  +0x0108 | 00 00 00 00             | uint8_t[4] | ....                                     | padding\n\nvector (MyGame.Example.Monster.scalar_key_sorted_tables):\n  +0x010C | 02 00 00 00             | uint32_t   | 0x00000002 (2)                           | length of vector (# items)\n  +0x0110 | 10 00 00 00             | UOffset32  | 0x00000010 (16) Loc: 0x0120              | offset to table[0]\n  +0x0114 | 28 00 00 00             | UOffset32  | 0x00000028 (40) Loc: 0x013C              | offset to table[1]\n\npadding:\n  +0x0118 | 00 00                   | uint8_t[2] | ..                                       | padding\n\nvtable (MyGame.Example.Stat):\n  +0x011A | 06 00                   | uint16_t   | 0x0006 (6)                               | size of this vtable\n  +0x011C | 08 00                   | uint16_t   | 0x0008 (8)                               | size of referring table\n  +0x011E | 04 00                   | VOffset16  | 0x0004 (4)                               | offset to field `id` (id: 0)\n\ntable (MyGame.Example.Stat):\n  +0x0120 | 06 00 00 00             | SOffset32  | 0x00000006 (6) Loc: 0x011A               | offset to vtable\n  +0x0124 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0128               | offset to field `id` (string)\n\nstring (MyGame.Example.Stat.id):\n  +0x0128 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                           | length of string\n  +0x012C | 6D 69 73 73             | char[4]    | miss                                     | string literal\n  +0x0130 | 00                      | char       | 0x00 (0)                                 | string terminator\n\nvtable (MyGame.Example.Stat):\n  +0x0132 | 0A 00                   | uint16_t   | 0x000A (10)                              | size of this vtable\n  +0x0134 | 14 00                   | uint16_t   | 0x0014 (20)                              | size of referring table\n  +0x0136 | 08 00                   | VOffset16  | 0x0008 (8)                               | offset to field `id` (id: 0)\n  +0x0138 | 0C 00                   | VOffset16  | 0x000C (12)                              | offset to field `val` (id: 1)\n  +0x013A | 06 00                   | VOffset16  | 0x0006 (6)                               | offset to field `count` (id: 2)\n\ntable (MyGame.Example.Stat):\n  +0x013C | 0A 00 00 00             | SOffset32  | 0x0000000A (10) Loc: 0x0132              | offset to vtable\n  +0x0140 | 00 00                   | uint8_t[2] | ..                                       | padding\n  +0x0142 | 01 00                   | uint16_t   | 0x0001 (1)                               | table field `count` (UShort)\n  +0x0144 | 0C 00 00 00             | UOffset32  | 0x0000000C (12) Loc: 0x0150              | offset to field `id` (string)\n  +0x0148 | 0A 00 00 00 00 00 00 00 | int64_t    | 0x000000000000000A (10)                  | table field `val` (Long)\n\nstring (MyGame.Example.Stat.id):\n  +0x0150 | 03 00 00 00             | uint32_t   | 0x00000003 (3)                           | length of string\n  +0x0154 | 68 69 74                | char[3]    | hit                                      | string literal\n  +0x0157 | 00                      | char       | 0x00 (0)                                 | string terminator\n\nvector (MyGame.Example.Monster.testarrayofsortedstruct):\n  +0x0158 | 03 00 00 00             | uint32_t   | 0x00000003 (3)                           | length of vector (# items)\n  +0x015C | 00 00 00 00             | uint32_t   | 0x00000000 (0)                           | struct field `[0].id` of 'MyGame.Example.Ability' (UInt)\n  +0x0160 | 2D 00 00 00             | uint32_t   | 0x0000002D (45)                          | struct field `[0].distance` of 'MyGame.Example.Ability' (UInt)\n  +0x0164 | 01 00 00 00             | uint32_t   | 0x00000001 (1)                           | struct field `[1].id` of 'MyGame.Example.Ability' (UInt)\n  +0x0168 | 15 00 00 00             | uint32_t   | 0x00000015 (21)                          | struct field `[1].distance` of 'MyGame.Example.Ability' (UInt)\n  +0x016C | 05 00 00 00             | uint32_t   | 0x00000005 (5)                           | struct field `[2].id` of 'MyGame.Example.Ability' (UInt)\n  +0x0170 | 0C 00 00 00             | uint32_t   | 0x0000000C (12)                          | struct field `[2].distance` of 'MyGame.Example.Ability' (UInt)\n\nvector (MyGame.Example.Monster.testarrayofbools):\n  +0x0174 | 03 00 00 00             | uint32_t   | 0x00000003 (3)                           | length of vector (# items)\n  +0x0178 | 01                      | uint8_t    | 0x01 (1)                                 | value[0]\n  +0x0179 | 00                      | uint8_t    | 0x00 (0)                                 | value[1]\n  +0x017A | 01                      | uint8_t    | 0x01 (1)                                 | value[2]\n\ntable (MyGame.Example.Monster):\n  +0x017C | B0 FF FF FF             | SOffset32  | 0xFFFFFFB0 (-80) Loc: 0x01CC             | offset to vtable\n  +0x0180 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x0184               | offset to field `name` (string)\n\nstring (MyGame.Example.Monster.name):\n  +0x0184 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                           | length of string\n  +0x0188 | 46 72 65 64             | char[4]    | Fred                                     | string literal\n  +0x018C | 00                      | char       | 0x00 (0)                                 | string terminator\n\npadding:\n  +0x018D | 00 00 00                | uint8_t[3] | ...                                      | padding\n\nvector (MyGame.Example.Monster.testarrayofstring):\n  +0x0190 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                           | length of vector (# items)\n  +0x0194 | 14 00 00 00             | UOffset32  | 0x00000014 (20) Loc: 0x01A8              | offset to string[0]\n  +0x0198 | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x019C               | offset to string[1]\n\nstring (MyGame.Example.Monster.testarrayofstring):\n  +0x019C | 05 00 00 00             | uint32_t   | 0x00000005 (5)                           | length of string\n  +0x01A0 | 74 65 73 74 32          | char[5]    | test2                                    | string literal\n  +0x01A5 | 00                      | char       | 0x00 (0)                                 | string terminator\n\npadding:\n  +0x01A6 | 00 00                   | uint8_t[2] | ..                                       | padding\n\nstring (MyGame.Example.Monster.testarrayofstring):\n  +0x01A8 | 05 00 00 00             | uint32_t   | 0x00000005 (5)                           | length of string\n  +0x01AC | 74 65 73 74 31          | char[5]    | test1                                    | string literal\n  +0x01B1 | 00                      | char       | 0x00 (0)                                 | string terminator\n\npadding:\n  +0x01B2 | 00 00                   | uint8_t[2] | ..                                       | padding\n\nvector (MyGame.Example.Monster.test5):\n  +0x01B4 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                           | length of vector (# items)\n  +0x01B8 | 0A 00                   | int16_t    | 0x000A (10)                              | struct field `[0].a` of 'MyGame.Example.Test' (Short)\n  +0x01BA | 14                      | uint8_t    | 0x14 (20)                                | struct field `[0].b` of 'MyGame.Example.Test' (Byte)\n  +0x01BB | 00                      | uint8_t[1] | .                                        | padding\n  +0x01BC | 1E 00                   | int16_t    | 0x001E (30)                              | struct field `[1].a` of 'MyGame.Example.Test' (Short)\n  +0x01BE | 28                      | uint8_t    | 0x28 (40)                                | struct field `[1].b` of 'MyGame.Example.Test' (Byte)\n  +0x01BF | 00                      | uint8_t[1] | .                                        | padding\n\nvector (MyGame.Example.Monster.test4):\n  +0x01C0 | 02 00 00 00             | uint32_t   | 0x00000002 (2)                           | length of vector (# items)\n  +0x01C4 | 0A 00                   | int16_t    | 0x000A (10)                              | struct field `[0].a` of 'MyGame.Example.Test' (Short)\n  +0x01C6 | 14                      | uint8_t    | 0x14 (20)                                | struct field `[0].b` of 'MyGame.Example.Test' (Byte)\n  +0x01C7 | 00                      | uint8_t[1] | .                                        | padding\n  +0x01C8 | 1E 00                   | int16_t    | 0x001E (30)                              | struct field `[1].a` of 'MyGame.Example.Test' (Short)\n  +0x01CA | 28                      | uint8_t    | 0x28 (40)                                | struct field `[1].b` of 'MyGame.Example.Test' (Byte)\n  +0x01CB | 00                      | uint8_t[1] | .                                        | padding\n\nvtable (MyGame.Example.Monster):\n  +0x01CC | 0C 00                   | uint16_t   | 0x000C (12)                              | size of this vtable\n  +0x01CE | 08 00                   | uint16_t   | 0x0008 (8)                               | size of referring table\n  +0x01D0 | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `pos` (id: 0) <null> (Obj)\n  +0x01D2 | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `mana` (id: 1) <defaults to 150> (Short)\n  +0x01D4 | 00 00                   | VOffset16  | 0x0000 (0)                               | offset to field `hp` (id: 2) <defaults to 100> (Short)\n  +0x01D6 | 04 00                   | VOffset16  | 0x0004 (4)                               | offset to field `name` (id: 3)\n\ntable (MyGame.Example.Monster):\n  +0x01D8 | 0C 00 00 00             | SOffset32  | 0x0000000C (12) Loc: 0x01CC              | offset to vtable\n  +0x01DC | 04 00 00 00             | UOffset32  | 0x00000004 (4) Loc: 0x01E0               | offset to field `name` (string)\n\nstring (MyGame.Example.Monster.name):\n  +0x01E0 | 04 00 00 00             | uint32_t   | 0x00000004 (4)                           | length of string\n  +0x01E4 | 46 72 65 64             | char[4]    | Fred                                     | string literal\n  +0x01E8 | 00                      | char       | 0x00 (0)                                 | string terminator\n\npadding:\n  +0x01E9 | 00 00 00                | uint8_t[3] | ...                                      | padding\n\nvector (MyGame.Example.Monster.vector_of_doubles):\n  +0x01EC | 03 00 00 00             | uint32_t   | 0x00000003 (3)                           | length of vector (# items)\n  +0x01F0 | FF FF FF FF FF FF EF FF | double     | 0xFFEFFFFFFFFFFFFF (-1.79769e+308)       | value[0]\n  +0x01F8 | 00 00 00 00 00 00 00 00 | double     | 0x0000000000000000 (0)                   | value[1]\n  +0x0200 | FF FF FF FF FF FF EF 7F | double     | 0x7FEFFFFFFFFFFFFF (1.79769e+308)        | value[2]\n\npadding:\n  +0x0208 | 00 00 00 00             | uint8_t[4] | ....                                     | padding\n\nvector (MyGame.Example.Monster.vector_of_longs):\n  +0x020C | 05 00 00 00             | uint32_t   | 0x00000005 (5)                           | length of vector (# items)\n  +0x0210 | 01 00 00 00 00 00 00 00 | int64_t    | 0x0000000000000001 (1)                   | value[0]\n  +0x0218 | 64 00 00 00 00 00 00 00 | int64_t    | 0x0000000000000064 (100)                 | value[1]\n  +0x0220 | 10 27 00 00 00 00 00 00 | int64_t    | 0x0000000000002710 (10000)               | value[2]\n  +0x0228 | 40 42 0F 00 00 00 00 00 | int64_t    | 0x00000000000F4240 (1000000)             | value[3]\n  +0x0230 | 00 E1 F5 05 00 00 00 00 | int64_t    | 0x0000000005F5E100 (100000000)           | value[4]\n\npadding:\n  +0x0238 | 00 00 00 00             | uint8_t[4] | ....                                     | padding\n\nvector (MyGame.Example.Monster.inventory):\n  +0x023C | 05 00 00 00             | uint32_t   | 0x00000005 (5)                           | length of vector (# items)\n  +0x0240 | 00                      | uint8_t    | 0x00 (0)                                 | value[0]\n  +0x0241 | 01                      | uint8_t    | 0x01 (1)                                 | value[1]\n  +0x0242 | 02                      | uint8_t    | 0x02 (2)                                 | value[2]\n  +0x0243 | 03                      | uint8_t    | 0x03 (3)                                 | value[3]\n  +0x0244 | 04                      | uint8_t    | 0x04 (4)                                 | value[4]\n\npadding:\n  +0x0245 | 00 00 00                | uint8_t[3] | ...                                      | padding\n\nstring (MyGame.Example.Monster.name):\n  +0x0248 | 09 00 00 00             | uint32_t   | 0x00000009 (9)                           | length of string\n  +0x024C | 4D 79 4D 6F 6E 73 74 65 | char[9]    | MyMonste                                 | string literal\n  +0x0254 | 72                      |            | r\n  +0x0255 | 00                      | char       | 0x00 (0)                                 | string terminator\n\npadding:\n  +0x0256 | 00 00                   | uint8_t[2] | ..                                       | padding\n"
  },
  {
    "path": "tests/monsterdata_test.golden",
    "content": "{\n  pos: {\n    x: 1.0,\n    y: 2.0,\n    z: 3.0,\n    test1: 3.14159265359,\n    test2: \"Green\",\n    test3: {\n      a: 10,\n      b: 20\n    }\n  },\n  hp: 80,\n  name: \"MyMonster\",\n  inventory: [\n    0,\n    1,\n    2,\n    3,\n    4,\n    5,\n    6,\n    7,\n    8,\n    9\n  ],\n  test_type: \"Monster\",\n  test: {\n    name: \"Fred\"\n  },\n  test4: [\n    {\n      a: 10,\n      b: 20\n    },\n    {\n      a: 30,\n      b: 40\n    }\n  ],\n  testarrayofstring: [\n    \"bob\",\n    \"fred\",\n    \"bob\",\n    \"fred\"\n  ],\n  testarrayoftables: [\n    {\n      hp: 1000,\n      name: \"Barney\"\n    },\n    {\n      name: \"Fred\"\n    },\n    {\n      name: \"Wilma\"\n    }\n  ],\n  testnestedflatbuffer: {\n    name: \"NestedMonster\"\n  },\n  testbool: true,\n  testhashs32_fnv1: -579221183,\n  testhashu32_fnv1: 3715746113,\n  testhashs64_fnv1: 7930699090847568257,\n  testhashu64_fnv1: 7930699090847568257,\n  testhashs32_fnv1a: -1904106383,\n  testhashu32_fnv1a: 2390860913,\n  testhashs64_fnv1a: 4898026182817603057,\n  testhashu64_fnv1a: 4898026182817603057,\n  flex: 1234,\n  test5: [\n    {\n      a: 10,\n      b: 20\n    },\n    {\n      a: 30,\n      b: 40\n    }\n  ]\n}\n"
  },
  {
    "path": "tests/monsterdata_test.json",
    "content": "{\n  pos: {\n    x: 1,\n    y: \"2\",\n    z: 3,\n    test1: 3,\n    test2: \"Green\",\n    test3: {\n      a: 5,\n      b: 6\n    }\n  },\n  hp: 80,\n  name: \"MyMonster\",\n  inventory: [\n    0,\n    1,\n    2,\n    3,\n    4\n  ],\n  vector_of_longs: [\n    1,\n    100,\n    10000,\n    1000000,\n    100000000\n  ],\n  vector_of_doubles: [\n    -1.7976931348623157e+308,\n    0,\n    1.7976931348623157e+308\n  ],\n  test_type: \"Monster\",\n  test: {\n    name: \"Fred\",\n    pos: null\n  },\n  test4: [\n    {\n      a: 10,\n      b: 20\n    },\n    {\n      b: \"40\",\n      a: 30\n    }\n  ],\n  test5: [\n    {\n      a: 10,\n      b: 20\n    },\n    {\n      b: \"40\",\n      a: 30\n    }\n  ],\n  testarrayofstring: [\n    \"test1\",\n    \"test2\"\n  ],\n  enemy: {\n    name: \"Fred\"\n  },\n  testarrayofbools: [\n    true,\n    false,\n    true\n  ],\n  testbool: true,\n  testhashs32_fnv1: \"This string is being hashed!\",\n  testhashu32_fnv1: \"This string is being hashed!\",\n  testhashs64_fnv1: \"This string is being hashed!\",\n  testhashu64_fnv1: \"This string is being hashed!\",\n  testhashs32_fnv1a: \"This string is being hashed!\",\n  testhashu32_fnv1a: \"This string is being hashed!\",\n  testhashs64_fnv1a: \"This string is being hashed!\",\n  testhashu64_fnv1a: \"This string is being hashed!\",\n  testarrayofsortedstruct: [\n    {id: 5,distance: 12\n    },\n    {id: 1,distance: 21\n    },\n    {id: 0,distance: 45\n    }\n  ],\n  scalar_key_sorted_tables: [\n    {id: \"hit\",val: 10,count: 1\n    },\n    {id: \"miss\",val: 0,count: 0\n    }\n  ],\n  native_inline: {\n    a: 1,\n    b: 2\n  }\n}"
  },
  {
    "path": "tests/more_defaults/abc_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MIN_ABC: i32 = 0;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MAX_ABC: i32 = 2;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n#[allow(non_camel_case_types)]\npub const ENUM_VALUES_ABC: [ABC; 3] = [\n    ABC::A,\n    ABC::B,\n    ABC::C,\n];\n\n#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n#[repr(transparent)]\npub struct ABC(pub i32);\n\n#[allow(non_upper_case_globals)]\nimpl ABC {\n    pub const A: Self = Self(0);\n    pub const B: Self = Self(1);\n    pub const C: Self = Self(2);\n\n    pub const ENUM_MIN: i32 = 0;\n    pub const ENUM_MAX: i32 = 2;\n    pub const ENUM_VALUES: &'static [Self] = &[\n        Self::A,\n        Self::B,\n        Self::C,\n    ];\n\n    /// Returns the variant's name or \"\" if unknown.\n    pub fn variant_name(self) -> Option<&'static str> {\n        match self {\n            Self::A => Some(\"A\"),\n            Self::B => Some(\"B\"),\n            Self::C => Some(\"C\"),\n            _ => None,\n        }\n    }\n}\n\nimpl ::core::fmt::Debug for ABC {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        if let Some(name) = self.variant_name() {\n            f.write_str(name)\n        } else {\n            f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n        }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for ABC {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<i32>(buf, loc) };\n        Self(b)\n    }\n}\n\nimpl ::flatbuffers::Push for ABC {\n    type Output = ABC;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<i32>(dst, self.0) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for ABC {\n    type Scalar = i32;\n\n    #[inline]\n    fn to_little_endian(self) -> i32 {\n        self.0.to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: i32) -> Self {\n        let b = i32::from_le(v);\n        Self(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for ABC {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        i32::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for ABC {}\n"
  },
  {
    "path": "tests/more_defaults/mod.rs",
    "content": "// Automatically generated by the Flatbuffers compiler. Do not modify.\n// @generated\nmod abc_generated;\npub use self::abc_generated::*;\nmod more_defaults_generated;\npub use self::more_defaults_generated::*;\n"
  },
  {
    "path": "tests/more_defaults/more_defaults_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum MoreDefaultsOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct MoreDefaults<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for MoreDefaults<'a> {\n    type Inner = MoreDefaults<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> MoreDefaults<'a> {\n    pub const VT_INTS: ::flatbuffers::VOffsetT = 4;\n    pub const VT_FLOATS: ::flatbuffers::VOffsetT = 6;\n    pub const VT_EMPTY_STRING: ::flatbuffers::VOffsetT = 8;\n    pub const VT_SOME_STRING: ::flatbuffers::VOffsetT = 10;\n    pub const VT_ABCS: ::flatbuffers::VOffsetT = 12;\n    pub const VT_BOOLS: ::flatbuffers::VOffsetT = 14;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"MoreDefaults\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        MoreDefaults { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args MoreDefaultsArgs<'args>\n    ) -> ::flatbuffers::WIPOffset<MoreDefaults<'bldr>> {\n        let mut builder = MoreDefaultsBuilder::new(_fbb);\n        if let Some(x) = args.bools { builder.add_bools(x); }\n        if let Some(x) = args.abcs { builder.add_abcs(x); }\n        if let Some(x) = args.some_string { builder.add_some_string(x); }\n        if let Some(x) = args.empty_string { builder.add_empty_string(x); }\n        if let Some(x) = args.floats { builder.add_floats(x); }\n        if let Some(x) = args.ints { builder.add_ints(x); }\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> MoreDefaultsT {\n        let ints = {\n            let x = self.ints();\n            x.into_iter().collect()\n        };\n        let floats = {\n            let x = self.floats();\n            x.into_iter().collect()\n        };\n        let empty_string = {\n            let x = self.empty_string();\n            alloc::string::ToString::to_string(x)\n        };\n        let some_string = {\n            let x = self.some_string();\n            alloc::string::ToString::to_string(x)\n        };\n        let abcs = {\n            let x = self.abcs();\n            x.into_iter().collect()\n        };\n        let bools = {\n            let x = self.bools();\n            x.into_iter().collect()\n        };\n        MoreDefaultsT {\n            ints,\n            floats,\n            empty_string,\n            some_string,\n            abcs,\n            bools,\n        }\n    }\n\n    #[inline]\n    pub fn ints(&self) -> ::flatbuffers::Vector<'a, i32> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, i32>>>(MoreDefaults::VT_INTS, Some(Default::default())).unwrap()}\n    }\n\n    #[inline]\n    pub fn floats(&self) -> ::flatbuffers::Vector<'a, f32> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, f32>>>(MoreDefaults::VT_FLOATS, Some(Default::default())).unwrap()}\n    }\n\n    #[inline]\n    pub fn empty_string(&self) -> &'a str {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<&str>>(MoreDefaults::VT_EMPTY_STRING, Some(&\"\")).unwrap()}\n    }\n\n    #[inline]\n    pub fn some_string(&self) -> &'a str {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<&str>>(MoreDefaults::VT_SOME_STRING, Some(&\"some\")).unwrap()}\n    }\n\n    #[inline]\n    pub fn abcs(&self) -> ::flatbuffers::Vector<'a, ABC> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, ABC>>>(MoreDefaults::VT_ABCS, Some(Default::default())).unwrap()}\n    }\n\n    #[inline]\n    pub fn bools(&self) -> ::flatbuffers::Vector<'a, bool> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, bool>>>(MoreDefaults::VT_BOOLS, Some(Default::default())).unwrap()}\n    }\n}\n\nimpl ::flatbuffers::Verifiable for MoreDefaults<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, i32>>>(\"ints\", Self::VT_INTS, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, f32>>>(\"floats\", Self::VT_FLOATS, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<&str>>(\"empty_string\", Self::VT_EMPTY_STRING, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<&str>>(\"some_string\", Self::VT_SOME_STRING, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, ABC>>>(\"abcs\", Self::VT_ABCS, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'_, bool>>>(\"bools\", Self::VT_BOOLS, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct MoreDefaultsArgs<'a> {\n    pub ints: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, i32>>>,\n    pub floats: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, f32>>>,\n    pub empty_string: Option<::flatbuffers::WIPOffset<&'a str>>,\n    pub some_string: Option<::flatbuffers::WIPOffset<&'a str>>,\n    pub abcs: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, ABC>>>,\n    pub bools: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, bool>>>,\n}\n\nimpl<'a> Default for MoreDefaultsArgs<'a> {\n    #[inline]\n    fn default() -> Self {\n        MoreDefaultsArgs {\n            ints: None,\n            floats: None,\n            empty_string: None,\n            some_string: None,\n            abcs: None,\n            bools: None,\n        }\n    }\n}\n\npub struct MoreDefaultsBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> MoreDefaultsBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_ints(&mut self, ints: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , i32>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(MoreDefaults::VT_INTS, ints);\n    }\n\n    #[inline]\n    pub fn add_floats(&mut self, floats: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , f32>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(MoreDefaults::VT_FLOATS, floats);\n    }\n\n    #[inline]\n    pub fn add_empty_string(&mut self, empty_string: ::flatbuffers::WIPOffset<&'b  str>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(MoreDefaults::VT_EMPTY_STRING, empty_string);\n    }\n\n    #[inline]\n    pub fn add_some_string(&mut self, some_string: ::flatbuffers::WIPOffset<&'b  str>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(MoreDefaults::VT_SOME_STRING, some_string);\n    }\n\n    #[inline]\n    pub fn add_abcs(&mut self, abcs: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , ABC>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(MoreDefaults::VT_ABCS, abcs);\n    }\n\n    #[inline]\n    pub fn add_bools(&mut self, bools: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , bool>>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(MoreDefaults::VT_BOOLS, bools);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> MoreDefaultsBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        MoreDefaultsBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<MoreDefaults<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for MoreDefaults<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"MoreDefaults\");\n        ds.field(\"ints\", &self.ints());\n        ds.field(\"floats\", &self.floats());\n        ds.field(\"empty_string\", &self.empty_string());\n        ds.field(\"some_string\", &self.some_string());\n        ds.field(\"abcs\", &self.abcs());\n        ds.field(\"bools\", &self.bools());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct MoreDefaultsT {\n    pub ints: alloc::vec::Vec<i32>,\n    pub floats: alloc::vec::Vec<f32>,\n    pub empty_string: alloc::string::String,\n    pub some_string: alloc::string::String,\n    pub abcs: alloc::vec::Vec<ABC>,\n    pub bools: alloc::vec::Vec<bool>,\n}\n\nimpl Default for MoreDefaultsT {\n    fn default() -> Self {\n        Self {\n            ints: Default::default(),\n            floats: Default::default(),\n            empty_string: alloc::string::ToString::to_string(\"\"),\n            some_string: alloc::string::ToString::to_string(\"some\"),\n            abcs: Default::default(),\n            bools: Default::default(),\n        }\n    }\n}\n\nimpl MoreDefaultsT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<MoreDefaults<'b>> {\n        let ints = Some({\n            let x = &self.ints;\n            _fbb.create_vector(x)\n        });\n        let floats = Some({\n            let x = &self.floats;\n            _fbb.create_vector(x)\n        });\n        let empty_string = Some({\n            let x = &self.empty_string;\n            _fbb.create_string(x)\n        });\n        let some_string = Some({\n            let x = &self.some_string;\n            _fbb.create_string(x)\n        });\n        let abcs = Some({\n            let x = &self.abcs;\n            _fbb.create_vector(x)\n        });\n        let bools = Some({\n            let x = &self.bools;\n            _fbb.create_vector(x)\n        });\n        MoreDefaults::create(_fbb, &MoreDefaultsArgs{\n            ints,\n            floats,\n            empty_string,\n            some_string,\n            abcs,\n            bools,\n        })\n    }\n}\n"
  },
  {
    "path": "tests/more_defaults.fbs",
    "content": "\nenum ABC: int { A, B, C }\n\n\ntable MoreDefaults {\n  ints: [int] = [];\n  floats: [float] = [     ];\n  empty_string: string = \"\";\n  some_string: string = \"some\";\n  abcs: [ABC] = [];\n  bools: [bool] = [];\n}\n"
  },
  {
    "path": "tests/name_clash_test/invalid_test1.fbs",
    "content": "include \"invalid_test2.fbs\";\n\nnamespace A;\n\ntable X {}\n"
  },
  {
    "path": "tests/name_clash_test/invalid_test2.fbs",
    "content": "namespace A;\n\nunion X {}\n"
  },
  {
    "path": "tests/name_clash_test/valid_test1.fbs",
    "content": "include \"valid_test2.fbs\";\n\nnamespace A;\n\ntable X {}\n"
  },
  {
    "path": "tests/name_clash_test/valid_test2.fbs",
    "content": "namespace B;\n\nunion X {}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/EnumInNestedNS.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace NamespaceA.NamespaceB\n{\n\n[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]\npublic enum EnumInNestedNS : sbyte\n{\n  A = 0,\n  B = 1,\n  C = 2,\n};\n\n\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/EnumInNestedNS.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage NamespaceB\n\nimport \"strconv\"\n\ntype EnumInNestedNS int8\n\nconst (\n\tEnumInNestedNSA EnumInNestedNS = 0\n\tEnumInNestedNSB EnumInNestedNS = 1\n\tEnumInNestedNSC EnumInNestedNS = 2\n)\n\nvar EnumNamesEnumInNestedNS = map[EnumInNestedNS]string{\n\tEnumInNestedNSA: \"A\",\n\tEnumInNestedNSB: \"B\",\n\tEnumInNestedNSC: \"C\",\n}\n\nvar EnumValuesEnumInNestedNS = map[string]EnumInNestedNS{\n\t\"A\": EnumInNestedNSA,\n\t\"B\": EnumInNestedNSB,\n\t\"C\": EnumInNestedNSC,\n}\n\nfunc (v EnumInNestedNS) String() string {\n\tif s, ok := EnumNamesEnumInNestedNS[v]; ok {\n\t\treturn s\n\t}\n\treturn \"EnumInNestedNS(\" + strconv.FormatInt(int64(v), 10) + \")\"\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/EnumInNestedNS.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage NamespaceA.NamespaceB;\n\n@SuppressWarnings(\"unused\")\npublic final class EnumInNestedNS {\n  private EnumInNestedNS() {}\n\n  public static final byte A = 0;\n  public static final byte B = 1;\n  public static final byte C = 2;\n\n  public static final String[] names = {\n    \"A\", \"B\", \"C\",\n  };\n\n  public static String name(int e) {\n    return names[e];\n  }\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/EnumInNestedNS.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage NamespaceA.NamespaceB\n\n@Suppress(\"unused\")\n@ExperimentalUnsignedTypes\nclass EnumInNestedNS private constructor() {\n  companion object {\n    const val A: Byte = 0\n    const val B: Byte = 1\n    const val C: Byte = 2\n    val names: Array<String> = arrayOf(\"A\", \"B\", \"C\")\n\n    fun name(e: Int): String = names[e]\n  }\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/EnumInNestedNS.lua",
    "content": "-- automatically generated by the FlatBuffers compiler, do not modify\n\n-- namespace: NamespaceB\n\nlocal EnumInNestedNS = {\n    A = 0,\n    B = 1,\n    C = 2,\n}\n\nreturn EnumInNestedNS -- return the module"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/EnumInNestedNS.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nnamespace NamespaceA\\NamespaceB;\n\nclass EnumInNestedNS\n{\n    const A = 0;\n    const B = 1;\n    const C = 2;\n\n    private static $names = array(\n        EnumInNestedNS::A=>\"A\",\n        EnumInNestedNS::B=>\"B\",\n        EnumInNestedNS::C=>\"C\",\n    );\n\n    public static function Name($e)\n    {\n        if (!isset(self::$names[$e])) {\n            throw new \\Exception();\n        }\n        return self::$names[$e];\n    }\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/EnumInNestedNS.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: NamespaceB\n\n\nclass EnumInNestedNS(object):\n  A = 0\n  B = 1\n  C = 2\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/StructInNestedNS.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace NamespaceA.NamespaceB\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct StructInNestedNS : IFlatbufferObject\n{\n  private Struct __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Struct(_i, _bb); }\n  public StructInNestedNS __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public int A { get { return __p.bb.GetInt(__p.bb_pos + 0); } }\n  public void MutateA(int a) { __p.bb.PutInt(__p.bb_pos + 0, a); }\n  public int B { get { return __p.bb.GetInt(__p.bb_pos + 4); } }\n  public void MutateB(int b) { __p.bb.PutInt(__p.bb_pos + 4, b); }\n\n  public static Offset<NamespaceA.NamespaceB.StructInNestedNS> CreateStructInNestedNS(FlatBufferBuilder builder, int A, int B) {\n    builder.Prep(4, 8);\n    builder.PutInt(B);\n    builder.PutInt(A);\n    return new Offset<NamespaceA.NamespaceB.StructInNestedNS>(builder.Offset);\n  }\n  public StructInNestedNST UnPack() {\n    var _o = new StructInNestedNST();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(StructInNestedNST _o) {\n    _o.A = this.A;\n    _o.B = this.B;\n  }\n  public static Offset<NamespaceA.NamespaceB.StructInNestedNS> Pack(FlatBufferBuilder builder, StructInNestedNST _o) {\n    if (_o == null) return default(Offset<NamespaceA.NamespaceB.StructInNestedNS>);\n    return CreateStructInNestedNS(\n      builder,\n      _o.A,\n      _o.B);\n  }\n}\n\npublic class StructInNestedNST\n{\n  [Newtonsoft.Json.JsonProperty(\"a\")]\n  public int A { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"b\")]\n  public int B { get; set; }\n\n  public StructInNestedNST() {\n    this.A = 0;\n    this.B = 0;\n  }\n}\n\n\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/StructInNestedNS.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage NamespaceB\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n)\n\ntype StructInNestedNST struct {\n\tA int32\n\tB int32\n}\n\nfunc (t *StructInNestedNST) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\tif t == nil {\n\t\treturn 0\n\t}\n\treturn CreateStructInNestedNS(builder, t.A, t.B)\n}\nfunc (rcv *StructInNestedNS) UnPackTo(t *StructInNestedNST) {\n\tt.A = rcv.A()\n\tt.B = rcv.B()\n}\n\nfunc (rcv *StructInNestedNS) UnPack() *StructInNestedNST {\n\tif rcv == nil {\n\t\treturn nil\n\t}\n\tt := &StructInNestedNST{}\n\trcv.UnPackTo(t)\n\treturn t\n}\n\ntype StructInNestedNS struct {\n\t_tab flatbuffers.Struct\n}\n\nfunc (rcv *StructInNestedNS) Init(buf []byte, i flatbuffers.UOffsetT) {\n\trcv._tab.Bytes = buf\n\trcv._tab.Pos = i\n}\n\nfunc (rcv *StructInNestedNS) Table() flatbuffers.Table {\n\treturn rcv._tab.Table\n}\n\nfunc (rcv *StructInNestedNS) A() int32 {\n\treturn rcv._tab.GetInt32(rcv._tab.Pos + flatbuffers.UOffsetT(0))\n}\nfunc (rcv *StructInNestedNS) MutateA(n int32) bool {\n\treturn rcv._tab.MutateInt32(rcv._tab.Pos+flatbuffers.UOffsetT(0), n)\n}\n\nfunc (rcv *StructInNestedNS) B() int32 {\n\treturn rcv._tab.GetInt32(rcv._tab.Pos + flatbuffers.UOffsetT(4))\n}\nfunc (rcv *StructInNestedNS) MutateB(n int32) bool {\n\treturn rcv._tab.MutateInt32(rcv._tab.Pos+flatbuffers.UOffsetT(4), n)\n}\n\nfunc CreateStructInNestedNS(builder *flatbuffers.Builder, a int32, b int32) flatbuffers.UOffsetT {\n\tbuilder.Prep(4, 8)\n\tbuilder.PrependInt32(b)\n\tbuilder.PrependInt32(a)\n\treturn builder.Offset()\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/StructInNestedNS.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage NamespaceA.NamespaceB;\n\nimport com.google.flatbuffers.*;\nimport java.nio.*;\nimport java.util.*;\n\n@SuppressWarnings(\"unused\")\npublic final class StructInNestedNS extends Struct {\n  public void __init(int _i, ByteBuffer _bb) {\n    __reset(_i, _bb);\n  }\n\n  public StructInNestedNS __assign(int _i, ByteBuffer _bb) {\n    __init(_i, _bb);\n    return this;\n  }\n\n  public int a() {\n    return bb.getInt(bb_pos + 0);\n  }\n\n  public void mutateA(int a) {\n    bb.putInt(bb_pos + 0, a);\n  }\n\n  public int b() {\n    return bb.getInt(bb_pos + 4);\n  }\n\n  public void mutateB(int b) {\n    bb.putInt(bb_pos + 4, b);\n  }\n\n  public static int createStructInNestedNS(FlatBufferBuilder builder, int a, int b) {\n    builder.prep(4, 8);\n    builder.putInt(b);\n    builder.putInt(a);\n    return builder.offset();\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) {\n      __reset(_vector, _element_size, _bb);\n      return this;\n    }\n\n    public StructInNestedNS get(int j) {\n      return get(new StructInNestedNS(), j);\n    }\n\n    public StructInNestedNS get(StructInNestedNS obj, int j) {\n      return obj.__assign(__element(j), bb);\n    }\n  }\n\n  public StructInNestedNST unpack() {\n    StructInNestedNST _o = new StructInNestedNST();\n    unpackTo(_o);\n    return _o;\n  }\n\n  public void unpackTo(StructInNestedNST _o) {\n    int _oA = a();\n    _o.setA(_oA);\n    int _oB = b();\n    _o.setB(_oB);\n  }\n\n  public static int pack(FlatBufferBuilder builder, StructInNestedNST _o) {\n    if (_o == null) return 0;\n    return createStructInNestedNS(builder, _o.getA(), _o.getB());\n  }\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/StructInNestedNS.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage NamespaceA.NamespaceB\n\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.Struct\nimport java.nio.ByteBuffer\n\n@Suppress(\"unused\")\n@ExperimentalUnsignedTypes\nclass StructInNestedNS : Struct() {\n\n  fun __init(_i: Int, _bb: ByteBuffer) {\n    __reset(_i, _bb)\n  }\n\n  fun __assign(_i: Int, _bb: ByteBuffer): StructInNestedNS {\n    __init(_i, _bb)\n    return this\n  }\n\n  val a: Int\n    get() = bb.getInt(bb_pos + 0)\n\n  fun mutateA(a: Int): ByteBuffer = bb.putInt(bb_pos + 0, a)\n\n  val b: Int\n    get() = bb.getInt(bb_pos + 4)\n\n  fun mutateB(b: Int): ByteBuffer = bb.putInt(bb_pos + 4, b)\n\n  companion object {\n    fun createStructInNestedNS(builder: FlatBufferBuilder, a: Int, b: Int): Int {\n      builder.prep(4, 8)\n      builder.putInt(b)\n      builder.putInt(a)\n      return builder.offset()\n    }\n  }\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/StructInNestedNS.lua",
    "content": "-- automatically generated by the FlatBuffers compiler, do not modify\n\n-- namespace: NamespaceB\n\nlocal flatbuffers = require('flatbuffers')\n\nlocal StructInNestedNS = {} -- the module\nlocal StructInNestedNS_mt = {} -- the class metatable\n\nfunction StructInNestedNS.New()\n    local o = {}\n    setmetatable(o, {__index = StructInNestedNS_mt})\n    return o\nend\nfunction StructInNestedNS_mt:Init(buf, pos)\n    self.view = flatbuffers.view.New(buf, pos)\nend\nfunction StructInNestedNS_mt:A()\n    return self.view:Get(flatbuffers.N.Int32, self.view.pos + 0)\nend\nfunction StructInNestedNS_mt:B()\n    return self.view:Get(flatbuffers.N.Int32, self.view.pos + 4)\nend\nfunction StructInNestedNS.CreateStructInNestedNS(builder, a, b)\n    builder:Prep(4, 8)\n    builder:PrependInt32(b)\n    builder:PrependInt32(a)\n    return builder:Offset()\nend\n\nreturn StructInNestedNS -- return the module"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/StructInNestedNS.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nnamespace NamespaceA\\NamespaceB;\n\nuse \\Google\\FlatBuffers\\Struct;\nuse \\Google\\FlatBuffers\\Table;\nuse \\Google\\FlatBuffers\\ByteBuffer;\nuse \\Google\\FlatBuffers\\FlatBufferBuilder;\n\nclass StructInNestedNS extends Struct\n{\n    /**\n     * @param int $_i offset\n     * @param ByteBuffer $_bb\n     * @return StructInNestedNS\n     **/\n    public function init($_i, ByteBuffer $_bb)\n    {\n        $this->bb_pos = $_i;\n        $this->bb = $_bb;\n        return $this;\n    }\n\n    /**\n     * @return int\n     */\n    public function GetA()\n    {\n        return $this->bb->getInt($this->bb_pos + 0);\n    }\n\n    /**\n     * @return int\n     */\n    public function GetB()\n    {\n        return $this->bb->getInt($this->bb_pos + 4);\n    }\n\n\n    /**\n     * @return int offset\n     */\n    public static function createStructInNestedNS(FlatBufferBuilder $builder, $a, $b)\n    {\n        $builder->prep(4, 8);\n        $builder->putInt($b);\n        $builder->putInt($a);\n        return $builder->offset();\n    }\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/StructInNestedNS.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: NamespaceB\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\n\nnp = import_numpy()\n\n\nclass StructInNestedNS(object):\n  __slots__ = ['_tab']\n\n  @classmethod\n  def SizeOf(cls):\n    return 8\n\n  # StructInNestedNS\n  def Init(self, buf, pos):\n    self._tab = flatbuffers.table.Table(buf, pos)\n\n  # StructInNestedNS\n  def A(self):\n    return self._tab.Get(\n        flatbuffers.number_types.Int32Flags,\n        self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(0),\n    )\n\n  # StructInNestedNS\n  def B(self):\n    return self._tab.Get(\n        flatbuffers.number_types.Int32Flags,\n        self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(4),\n    )\n\n\ndef CreateStructInNestedNS(builder, a, b):\n  builder.Prep(4, 8)\n  builder.PrependInt32(b)\n  builder.PrependInt32(a)\n  return builder.Offset()\n\n\nclass StructInNestedNST(object):\n\n  # StructInNestedNST\n  def __init__(self):\n    self.a = 0  # type: int\n    self.b = 0  # type: int\n\n  @classmethod\n  def InitFromBuf(cls, buf, pos):\n    structInNestedNS = StructInNestedNS()\n    structInNestedNS.Init(buf, pos)\n    return cls.InitFromObj(structInNestedNS)\n\n  @classmethod\n  def InitFromObj(cls, structInNestedNS):\n    x = StructInNestedNST()\n    x._UnPack(structInNestedNS)\n    return x\n\n  # StructInNestedNST\n  def _UnPack(self, structInNestedNS):\n    if structInNestedNS is None:\n      return\n    self.a = structInNestedNS.A()\n    self.b = structInNestedNS.B()\n\n  # StructInNestedNST\n  def Pack(self, builder):\n    return CreateStructInNestedNS(builder, self.a, self.b)\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/StructInNestedNST.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage NamespaceA.NamespaceB;\n\nimport com.google.flatbuffers.*;\nimport java.nio.*;\nimport java.util.*;\n\npublic class StructInNestedNST {\n  private int a;\n  private int b;\n\n  public int getA() {\n    return a;\n  }\n\n  public void setA(int a) {\n    this.a = a;\n  }\n\n  public int getB() {\n    return b;\n  }\n\n  public void setB(int b) {\n    this.b = b;\n  }\n\n  public StructInNestedNST() {\n    this.a = 0;\n    this.b = 0;\n  }\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace NamespaceA.NamespaceB\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct TableInNestedNS : IFlatbufferObject\n{\n  private Table __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_25_12_19(); }\n  public static TableInNestedNS GetRootAsTableInNestedNS(ByteBuffer _bb) { return GetRootAsTableInNestedNS(_bb, new TableInNestedNS()); }\n  public static TableInNestedNS GetRootAsTableInNestedNS(ByteBuffer _bb, TableInNestedNS obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }\n  public TableInNestedNS __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public int Foo { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } }\n  public bool MutateFoo(int foo) { int o = __p.__offset(4); if (o != 0) { __p.bb.PutInt(o + __p.bb_pos, foo); return true; } else { return false; } }\n\n  public static Offset<NamespaceA.NamespaceB.TableInNestedNS> CreateTableInNestedNS(FlatBufferBuilder builder,\n      int foo = 0) {\n    builder.StartTable(1);\n    TableInNestedNS.AddFoo(builder, foo);\n    return TableInNestedNS.EndTableInNestedNS(builder);\n  }\n\n  public static void StartTableInNestedNS(FlatBufferBuilder builder) { builder.StartTable(1); }\n  public static void AddFoo(FlatBufferBuilder builder, int foo) { builder.AddInt(0, foo, 0); }\n  public static Offset<NamespaceA.NamespaceB.TableInNestedNS> EndTableInNestedNS(FlatBufferBuilder builder) {\n    int o = builder.EndTable();\n    return new Offset<NamespaceA.NamespaceB.TableInNestedNS>(o);\n  }\n  public TableInNestedNST UnPack() {\n    var _o = new TableInNestedNST();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(TableInNestedNST _o) {\n    _o.Foo = this.Foo;\n  }\n  public static Offset<NamespaceA.NamespaceB.TableInNestedNS> Pack(FlatBufferBuilder builder, TableInNestedNST _o) {\n    if (_o == null) return default(Offset<NamespaceA.NamespaceB.TableInNestedNS>);\n    return CreateTableInNestedNS(\n      builder,\n      _o.Foo);\n  }\n}\n\npublic class TableInNestedNST\n{\n  [Newtonsoft.Json.JsonProperty(\"foo\")]\n  public int Foo { get; set; }\n\n  public TableInNestedNST() {\n    this.Foo = 0;\n  }\n}\n\n\nstatic public class TableInNestedNSVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos)\n  {\n    return verifier.VerifyTableStart(tablePos)\n      && verifier.VerifyField(tablePos, 4 /*Foo*/, 4 /*int*/, 4, false)\n      && verifier.VerifyTableEnd(tablePos);\n  }\n}\n\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage NamespaceB\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n)\n\ntype TableInNestedNST struct {\n\tFoo int32\n}\n\nfunc (t *TableInNestedNST) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\tif t == nil {\n\t\treturn 0\n\t}\n\tTableInNestedNSStart(builder)\n\tTableInNestedNSAddFoo(builder, t.Foo)\n\treturn TableInNestedNSEnd(builder)\n}\n\nfunc (rcv *TableInNestedNS) UnPackTo(t *TableInNestedNST) {\n\tt.Foo = rcv.Foo()\n}\n\nfunc (rcv *TableInNestedNS) UnPack() *TableInNestedNST {\n\tif rcv == nil {\n\t\treturn nil\n\t}\n\tt := &TableInNestedNST{}\n\trcv.UnPackTo(t)\n\treturn t\n}\n\ntype TableInNestedNS struct {\n\t_tab flatbuffers.Table\n}\n\nfunc GetRootAsTableInNestedNS(buf []byte, offset flatbuffers.UOffsetT) *TableInNestedNS {\n\tn := flatbuffers.GetUOffsetT(buf[offset:])\n\tx := &TableInNestedNS{}\n\tx.Init(buf, n+offset)\n\treturn x\n}\n\nfunc GetSizePrefixedRootAsTableInNestedNS(buf []byte, offset flatbuffers.UOffsetT) *TableInNestedNS {\n\tn := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])\n\tx := &TableInNestedNS{}\n\tx.Init(buf, n+offset+flatbuffers.SizeUint32)\n\treturn x\n}\n\nfunc (rcv *TableInNestedNS) Init(buf []byte, i flatbuffers.UOffsetT) {\n\trcv._tab.Bytes = buf\n\trcv._tab.Pos = i\n}\n\nfunc (rcv *TableInNestedNS) Table() flatbuffers.Table {\n\treturn rcv._tab\n}\n\nfunc (rcv *TableInNestedNS) Foo() int32 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(4))\n\tif o != 0 {\n\t\treturn rcv._tab.GetInt32(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *TableInNestedNS) MutateFoo(n int32) bool {\n\treturn rcv._tab.MutateInt32Slot(4, n)\n}\n\nfunc TableInNestedNSStart(builder *flatbuffers.Builder) {\n\tbuilder.StartObject(1)\n}\nfunc TableInNestedNSAddFoo(builder *flatbuffers.Builder, foo int32) {\n\tbuilder.PrependInt32Slot(0, foo, 0)\n}\nfunc TableInNestedNSEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\treturn builder.EndObject()\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage NamespaceA.NamespaceB;\n\nimport com.google.flatbuffers.*;\nimport java.nio.*;\nimport java.util.*;\n\n@SuppressWarnings(\"unused\")\npublic final class TableInNestedNS extends Table {\n  public static void ValidateVersion() {\n    Constants.FLATBUFFERS_25_12_19();\n  }\n\n  public static TableInNestedNS getRootAsTableInNestedNS(ByteBuffer _bb) {\n    return getRootAsTableInNestedNS(_bb, new TableInNestedNS());\n  }\n\n  public static TableInNestedNS getRootAsTableInNestedNS(ByteBuffer _bb, TableInNestedNS obj) {\n    _bb.order(ByteOrder.LITTLE_ENDIAN);\n    return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb));\n  }\n\n  public void __init(int _i, ByteBuffer _bb) {\n    __reset(_i, _bb);\n  }\n\n  public TableInNestedNS __assign(int _i, ByteBuffer _bb) {\n    __init(_i, _bb);\n    return this;\n  }\n\n  public int foo() {\n    int o = __offset(4);\n    return o != 0 ? bb.getInt(o + bb_pos) : 0;\n  }\n\n  public boolean mutateFoo(int foo) {\n    int o = __offset(4);\n    if (o != 0) {\n      bb.putInt(o + bb_pos, foo);\n      return true;\n    } else {\n      return false;\n    }\n  }\n\n  public static int createTableInNestedNS(FlatBufferBuilder builder, int foo) {\n    builder.startTable(1);\n    TableInNestedNS.addFoo(builder, foo);\n    return TableInNestedNS.endTableInNestedNS(builder);\n  }\n\n  public static void startTableInNestedNS(FlatBufferBuilder builder) {\n    builder.startTable(1);\n  }\n\n  public static void addFoo(FlatBufferBuilder builder, int foo) {\n    builder.addInt(0, foo, 0);\n  }\n\n  public static int endTableInNestedNS(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    return o;\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) {\n      __reset(_vector, _element_size, _bb);\n      return this;\n    }\n\n    public TableInNestedNS get(int j) {\n      return get(new TableInNestedNS(), j);\n    }\n\n    public TableInNestedNS get(TableInNestedNS obj, int j) {\n      return obj.__assign(__indirect(__element(j), bb), bb);\n    }\n  }\n\n  public TableInNestedNST unpack() {\n    TableInNestedNST _o = new TableInNestedNST();\n    unpackTo(_o);\n    return _o;\n  }\n\n  public void unpackTo(TableInNestedNST _o) {\n    int _oFoo = foo();\n    _o.setFoo(_oFoo);\n  }\n\n  public static int pack(FlatBufferBuilder builder, TableInNestedNST _o) {\n    if (_o == null) return 0;\n    return createTableInNestedNS(builder, _o.getFoo());\n  }\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage NamespaceA.NamespaceB\n\nimport com.google.flatbuffers.Constants\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.Table\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\n\n@Suppress(\"unused\")\n@ExperimentalUnsignedTypes\nclass TableInNestedNS : Table() {\n\n  fun __init(_i: Int, _bb: ByteBuffer) {\n    __reset(_i, _bb)\n  }\n\n  fun __assign(_i: Int, _bb: ByteBuffer): TableInNestedNS {\n    __init(_i, _bb)\n    return this\n  }\n\n  val foo: Int\n    get() {\n      val o = __offset(4)\n      return if (o != 0) bb.getInt(o + bb_pos) else 0\n    }\n\n  fun mutateFoo(foo: Int): Boolean {\n    val o = __offset(4)\n    return if (o != 0) {\n      bb.putInt(o + bb_pos, foo)\n      true\n    } else {\n      false\n    }\n  }\n\n  companion object {\n    fun validateVersion() = Constants.FLATBUFFERS_25_12_19()\n\n    fun getRootAsTableInNestedNS(_bb: ByteBuffer): TableInNestedNS =\n      getRootAsTableInNestedNS(_bb, TableInNestedNS())\n\n    fun getRootAsTableInNestedNS(_bb: ByteBuffer, obj: TableInNestedNS): TableInNestedNS {\n      _bb.order(ByteOrder.LITTLE_ENDIAN)\n      return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb))\n    }\n\n    fun createTableInNestedNS(builder: FlatBufferBuilder, foo: Int): Int {\n      builder.startTable(1)\n      addFoo(builder, foo)\n      return endTableInNestedNS(builder)\n    }\n\n    fun startTableInNestedNS(builder: FlatBufferBuilder) = builder.startTable(1)\n\n    fun addFoo(builder: FlatBufferBuilder, foo: Int) = builder.addInt(0, foo, 0)\n\n    fun endTableInNestedNS(builder: FlatBufferBuilder): Int {\n      val o = builder.endTable()\n      return o\n    }\n  }\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.lua",
    "content": "-- automatically generated by the FlatBuffers compiler, do not modify\n\n-- namespace: NamespaceB\n\nlocal flatbuffers = require('flatbuffers')\n\nlocal TableInNestedNS = {} -- the module\nlocal TableInNestedNS_mt = {} -- the class metatable\n\nfunction TableInNestedNS.New()\n    local o = {}\n    setmetatable(o, {__index = TableInNestedNS_mt})\n    return o\nend\nfunction TableInNestedNS.GetRootAsTableInNestedNS(buf, offset)\n    if type(buf) == \"string\" then\n        buf = flatbuffers.binaryArray.New(buf)\n    end\n    local n = flatbuffers.N.UOffsetT:Unpack(buf, offset)\n    local o = TableInNestedNS.New()\n    o:Init(buf, n + offset)\n    return o\nend\nfunction TableInNestedNS_mt:Init(buf, pos)\n    self.view = flatbuffers.view.New(buf, pos)\nend\nfunction TableInNestedNS_mt:Foo()\n    local o = self.view:Offset(4)\n    if o ~= 0 then\n        return self.view:Get(flatbuffers.N.Int32, o + self.view.pos)\n    end\n    return 0\nend\nfunction TableInNestedNS.Start(builder) builder:StartObject(1) end\nfunction TableInNestedNS.AddFoo(builder, foo) builder:PrependInt32Slot(0, foo, 0) end\nfunction TableInNestedNS.End(builder) return builder:EndObject() end\n\nreturn TableInNestedNS -- return the module"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nnamespace NamespaceA\\NamespaceB;\n\nuse \\Google\\FlatBuffers\\Struct;\nuse \\Google\\FlatBuffers\\Table;\nuse \\Google\\FlatBuffers\\ByteBuffer;\nuse \\Google\\FlatBuffers\\FlatBufferBuilder;\n\nclass TableInNestedNS extends Table\n{\n    /**\n     * @param ByteBuffer $bb\n     * @return TableInNestedNS\n     */\n    public static function getRootAsTableInNestedNS(ByteBuffer $bb)\n    {\n        $obj = new TableInNestedNS();\n        return ($obj->init($bb->getInt($bb->getPosition()) + $bb->getPosition(), $bb));\n    }\n\n    /**\n     * @param int $_i offset\n     * @param ByteBuffer $_bb\n     * @return TableInNestedNS\n     **/\n    public function init($_i, ByteBuffer $_bb)\n    {\n        $this->bb_pos = $_i;\n        $this->bb = $_bb;\n        return $this;\n    }\n\n    /**\n     * @return int\n     */\n    public function getFoo()\n    {\n        $o = $this->__offset(4);\n        return $o != 0 ? $this->bb->getInt($o + $this->bb_pos) : 0;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return void\n     */\n    public static function startTableInNestedNS(FlatBufferBuilder $builder)\n    {\n        $builder->StartObject(1);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return TableInNestedNS\n     */\n    public static function createTableInNestedNS(FlatBufferBuilder $builder, $foo)\n    {\n        $builder->startObject(1);\n        self::addFoo($builder, $foo);\n        $o = $builder->endObject();\n        return $o;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int\n     * @return void\n     */\n    public static function addFoo(FlatBufferBuilder $builder, $foo)\n    {\n        $builder->addIntX(0, $foo, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return int table offset\n     */\n    public static function endTableInNestedNS(FlatBufferBuilder $builder)\n    {\n        $o = $builder->endObject();\n        return $o;\n    }\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: NamespaceB\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\n\nnp = import_numpy()\n\n\nclass TableInNestedNS(object):\n  __slots__ = ['_tab']\n\n  @classmethod\n  def GetRootAs(cls, buf, offset=0):\n    n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n    x = TableInNestedNS()\n    x.Init(buf, n + offset)\n    return x\n\n  @classmethod\n  def GetRootAsTableInNestedNS(cls, buf, offset=0):\n    \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n    return cls.GetRootAs(buf, offset)\n\n  # TableInNestedNS\n  def Init(self, buf, pos):\n    self._tab = flatbuffers.table.Table(buf, pos)\n\n  # TableInNestedNS\n  def Foo(self):\n    o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n    if o != 0:\n      return self._tab.Get(\n          flatbuffers.number_types.Int32Flags, o + self._tab.Pos\n      )\n    return 0\n\n\ndef TableInNestedNSStart(builder):\n  builder.StartObject(1)\n\n\ndef Start(builder):\n  return TableInNestedNSStart(builder)\n\n\ndef TableInNestedNSAddFoo(builder, foo):\n  builder.PrependInt32Slot(0, foo, 0)\n\n\ndef AddFoo(builder, foo):\n  return TableInNestedNSAddFoo(builder, foo)\n\n\ndef TableInNestedNSEnd(builder):\n  return builder.EndObject()\n\n\ndef End(builder):\n  return TableInNestedNSEnd(builder)\n\n\nclass TableInNestedNST(object):\n\n  # TableInNestedNST\n  def __init__(self):\n    self.foo = 0  # type: int\n\n  @classmethod\n  def InitFromBuf(cls, buf, pos):\n    tableInNestedNS = TableInNestedNS()\n    tableInNestedNS.Init(buf, pos)\n    return cls.InitFromObj(tableInNestedNS)\n\n  @classmethod\n  def InitFromObj(cls, tableInNestedNS):\n    x = TableInNestedNST()\n    x._UnPack(tableInNestedNS)\n    return x\n\n  # TableInNestedNST\n  def _UnPack(self, tableInNestedNS):\n    if tableInNestedNS is None:\n      return\n    self.foo = tableInNestedNS.Foo()\n\n  # TableInNestedNST\n  def Pack(self, builder):\n    TableInNestedNSStart(builder)\n    TableInNestedNSAddFoo(builder, self.foo)\n    tableInNestedNS = TableInNestedNSEnd(builder)\n    return tableInNestedNS\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNST.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage NamespaceA.NamespaceB;\n\nimport com.google.flatbuffers.*;\nimport java.nio.*;\nimport java.util.*;\n\npublic class TableInNestedNST {\n  private int foo;\n\n  public int getFoo() {\n    return foo;\n  }\n\n  public void setFoo(int foo) {\n    this.foo = foo;\n  }\n\n  public TableInNestedNST() {\n    this.foo = 0;\n  }\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/UnionInNestedNS.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace NamespaceA.NamespaceB\n{\n\n[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]\npublic enum UnionInNestedNS : byte\n{\n  NONE = 0,\n  TableInNestedNS = 1,\n};\n\npublic class UnionInNestedNSUnion {\n  public UnionInNestedNS Type { get; set; }\n  public object Value { get; set; }\n\n  public UnionInNestedNSUnion() {\n    this.Type = UnionInNestedNS.NONE;\n    this.Value = null;\n  }\n\n  public T As<T>() where T : class { return this.Value as T; }\n  public NamespaceA.NamespaceB.TableInNestedNST AsTableInNestedNS() { return this.As<NamespaceA.NamespaceB.TableInNestedNST>(); }\n  public static UnionInNestedNSUnion FromTableInNestedNS(NamespaceA.NamespaceB.TableInNestedNST _tableinnestedns) { return new UnionInNestedNSUnion{ Type = UnionInNestedNS.TableInNestedNS, Value = _tableinnestedns }; }\n\n  public static int Pack(Google.FlatBuffers.FlatBufferBuilder builder, UnionInNestedNSUnion _o) {\n    switch (_o.Type) {\n      default: return 0;\n      case UnionInNestedNS.TableInNestedNS: return NamespaceA.NamespaceB.TableInNestedNS.Pack(builder, _o.AsTableInNestedNS()).Value;\n    }\n  }\n}\n\npublic class UnionInNestedNSUnion_JsonConverter : Newtonsoft.Json.JsonConverter {\n  public override bool CanConvert(System.Type objectType) {\n    return objectType == typeof(UnionInNestedNSUnion) || objectType == typeof(System.Collections.Generic.List<UnionInNestedNSUnion>);\n  }\n  public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) {\n    var _olist = value as System.Collections.Generic.List<UnionInNestedNSUnion>;\n    if (_olist != null) {\n      writer.WriteStartArray();\n      foreach (var _o in _olist) { this.WriteJson(writer, _o, serializer); }\n      writer.WriteEndArray();\n    } else {\n      this.WriteJson(writer, value as UnionInNestedNSUnion, serializer);\n    }\n  }\n  public void WriteJson(Newtonsoft.Json.JsonWriter writer, UnionInNestedNSUnion _o, Newtonsoft.Json.JsonSerializer serializer) {\n    if (_o == null) return;\n    serializer.Serialize(writer, _o.Value);\n  }\n  public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) {\n    var _olist = existingValue as System.Collections.Generic.List<UnionInNestedNSUnion>;\n    if (_olist != null) {\n      for (var _j = 0; _j < _olist.Count; ++_j) {\n        reader.Read();\n        _olist[_j] = this.ReadJson(reader, _olist[_j], serializer);\n      }\n      reader.Read();\n      return _olist;\n    } else {\n      return this.ReadJson(reader, existingValue as UnionInNestedNSUnion, serializer);\n    }\n  }\n  public UnionInNestedNSUnion ReadJson(Newtonsoft.Json.JsonReader reader, UnionInNestedNSUnion _o, Newtonsoft.Json.JsonSerializer serializer) {\n    if (_o == null) return null;\n    switch (_o.Type) {\n      default: break;\n      case UnionInNestedNS.TableInNestedNS: _o.Value = serializer.Deserialize<NamespaceA.NamespaceB.TableInNestedNST>(reader); break;\n    }\n    return _o;\n  }\n}\n\n\n\nstatic public class UnionInNestedNSVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)\n  {\n    bool result = true;\n    switch((UnionInNestedNS)typeId)\n    {\n      case UnionInNestedNS.TableInNestedNS:\n        result = NamespaceA.NamespaceB.TableInNestedNSVerify.Verify(verifier, tablePos);\n        break;\n      default: result = true;\n        break;\n    }\n    return result;\n  }\n}\n\n\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/UnionInNestedNS.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage NamespaceB\n\nimport (\n\t\"strconv\"\n\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n\n\tNamespaceA__NamespaceB \"NamespaceA/NamespaceB\"\n)\n\ntype UnionInNestedNST struct {\n\tType  UnionInNestedNS\n\tValue interface{}\n}\n\nfunc (t *UnionInNestedNST) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\tif t == nil {\n\t\treturn 0\n\t}\n\tswitch t.Type {\n\tcase UnionInNestedNSTableInNestedNS:\n\t\treturn t.Value.(*NamespaceA__NamespaceB.TableInNestedNST).Pack(builder)\n\t}\n\treturn 0\n}\n\nfunc (rcv UnionInNestedNS) UnPack(table flatbuffers.Table) *UnionInNestedNST {\n\tswitch rcv {\n\tcase UnionInNestedNSTableInNestedNS:\n\t\tx := TableInNestedNS{_tab: table}\n\t\treturn &NamespaceA__NamespaceB.UnionInNestedNST{Type: UnionInNestedNSTableInNestedNS, Value: x.UnPack()}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/UnionInNestedNS.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage NamespaceA.NamespaceB;\n\n@SuppressWarnings(\"unused\")\npublic final class UnionInNestedNS {\n  private UnionInNestedNS() {}\n\n  public static final byte NONE = 0;\n  public static final byte TableInNestedNS = 1;\n\n  public static final String[] names = {\n    \"NONE\", \"TableInNestedNS\",\n  };\n\n  public static String name(int e) {\n    return names[e];\n  }\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/UnionInNestedNS.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage NamespaceA.NamespaceB\n\n@Suppress(\"unused\")\n@ExperimentalUnsignedTypes\nclass UnionInNestedNS private constructor() {\n  companion object {\n    const val NONE: UByte = 0u\n    const val TableInNestedNS: UByte = 1u\n    val names: Array<String> = arrayOf(\"NONE\", \"TableInNestedNS\")\n\n    fun name(e: Int): String = names[e]\n  }\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/UnionInNestedNS.lua",
    "content": "-- automatically generated by the FlatBuffers compiler, do not modify\n\n-- namespace: NamespaceB\n\nlocal UnionInNestedNS = {\n    NONE = 0,\n    TableInNestedNS = 1,\n}\n\nreturn UnionInNestedNS -- return the module"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/UnionInNestedNS.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nnamespace NamespaceA\\NamespaceB;\n\nclass UnionInNestedNS\n{\n    const NONE = 0;\n    const TableInNestedNS = 1;\n\n    private static $names = array(\n        UnionInNestedNS::NONE=>\"NONE\",\n        UnionInNestedNS::TableInNestedNS=>\"TableInNestedNS\",\n    );\n\n    public static function Name($e)\n    {\n        if (!isset(self::$names[$e])) {\n            throw new \\Exception();\n        }\n        return self::$names[$e];\n    }\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/UnionInNestedNS.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: NamespaceB\n\n\nclass UnionInNestedNS(object):\n  NONE = 0\n  TableInNestedNS = 1\n\n\ndef UnionInNestedNSCreator(unionType, table):\n  from flatbuffers.table import Table\n\n  if not isinstance(table, Table):\n    return None\n  if unionType == UnionInNestedNS().TableInNestedNS:\n    return TableInNestedNST.InitFromBuf(table.Bytes, table.Pos)\n  return None\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/UnionInNestedNSUnion.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage NamespaceA.NamespaceB;\n\nimport com.google.flatbuffers.FlatBufferBuilder;\n\npublic class UnionInNestedNSUnion {\n  private byte type;\n  private Object value;\n\n  public byte getType() {\n    return type;\n  }\n\n  public void setType(byte type) {\n    this.type = type;\n  }\n\n  public Object getValue() {\n    return value;\n  }\n\n  public void setValue(Object value) {\n    this.value = value;\n  }\n\n  public UnionInNestedNSUnion() {\n    this.type = UnionInNestedNS.NONE;\n    this.value = null;\n  }\n\n  public NamespaceA.NamespaceB.TableInNestedNST asTableInNestedNS() {\n    return (NamespaceA.NamespaceB.TableInNestedNST) value;\n  }\n\n  public static int pack(FlatBufferBuilder builder, UnionInNestedNSUnion _o) {\n    switch (_o.type) {\n      case UnionInNestedNS.TableInNestedNS:\n        return NamespaceA.NamespaceB.TableInNestedNS.pack(builder, _o.asTableInNestedNS());\n      default:\n        return 0;\n    }\n  }\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/NamespaceB/__init__.py",
    "content": ""
  },
  {
    "path": "tests/namespace_test/NamespaceA/SecondTableInA.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace NamespaceA\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct SecondTableInA : IFlatbufferObject\n{\n  private Table __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_25_12_19(); }\n  public static SecondTableInA GetRootAsSecondTableInA(ByteBuffer _bb) { return GetRootAsSecondTableInA(_bb, new SecondTableInA()); }\n  public static SecondTableInA GetRootAsSecondTableInA(ByteBuffer _bb, SecondTableInA obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }\n  public SecondTableInA __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public NamespaceC.TableInC? ReferToC { get { int o = __p.__offset(4); return o != 0 ? (NamespaceC.TableInC?)(new NamespaceC.TableInC()).__assign(__p.__indirect(o + __p.bb_pos), __p.bb) : null; } }\n\n  public static Offset<NamespaceA.SecondTableInA> CreateSecondTableInA(FlatBufferBuilder builder,\n      Offset<NamespaceC.TableInC> refer_to_cOffset = default(Offset<NamespaceC.TableInC>)) {\n    builder.StartTable(1);\n    SecondTableInA.AddReferToC(builder, refer_to_cOffset);\n    return SecondTableInA.EndSecondTableInA(builder);\n  }\n\n  public static void StartSecondTableInA(FlatBufferBuilder builder) { builder.StartTable(1); }\n  public static void AddReferToC(FlatBufferBuilder builder, Offset<NamespaceC.TableInC> referToCOffset) { builder.AddOffset(0, referToCOffset.Value, 0); }\n  public static Offset<NamespaceA.SecondTableInA> EndSecondTableInA(FlatBufferBuilder builder) {\n    int o = builder.EndTable();\n    return new Offset<NamespaceA.SecondTableInA>(o);\n  }\n  public SecondTableInAT UnPack() {\n    var _o = new SecondTableInAT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(SecondTableInAT _o) {\n    _o.ReferToC = this.ReferToC.HasValue ? this.ReferToC.Value.UnPack() : null;\n  }\n  public static Offset<NamespaceA.SecondTableInA> Pack(FlatBufferBuilder builder, SecondTableInAT _o) {\n    if (_o == null) return default(Offset<NamespaceA.SecondTableInA>);\n    var _refer_to_c = _o.ReferToC == null ? default(Offset<NamespaceC.TableInC>) : NamespaceC.TableInC.Pack(builder, _o.ReferToC);\n    return CreateSecondTableInA(\n      builder,\n      _refer_to_c);\n  }\n}\n\npublic class SecondTableInAT\n{\n  [Newtonsoft.Json.JsonProperty(\"refer_to_c\")]\n  public NamespaceC.TableInCT ReferToC { get; set; }\n\n  public SecondTableInAT() {\n    this.ReferToC = null;\n  }\n}\n\n\nstatic public class SecondTableInAVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos)\n  {\n    return verifier.VerifyTableStart(tablePos)\n      && verifier.VerifyTable(tablePos, 4 /*ReferToC*/, NamespaceC.TableInCVerify.Verify, false)\n      && verifier.VerifyTableEnd(tablePos);\n  }\n}\n\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/SecondTableInA.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage NamespaceA\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n\n\tNamespaceC \"NamespaceC\"\n)\n\ntype SecondTableInAT struct {\n\tReferToC *NamespaceC.TableInCT\n}\n\nfunc (t *SecondTableInAT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\tif t == nil {\n\t\treturn 0\n\t}\n\treferToCOffset := t.ReferToC.Pack(builder)\n\tSecondTableInAStart(builder)\n\tSecondTableInAAddReferToC(builder, referToCOffset)\n\treturn SecondTableInAEnd(builder)\n}\n\nfunc (rcv *SecondTableInA) UnPackTo(t *SecondTableInAT) {\n\tt.ReferToC = rcv.ReferToC(nil).UnPack()\n}\n\nfunc (rcv *SecondTableInA) UnPack() *SecondTableInAT {\n\tif rcv == nil {\n\t\treturn nil\n\t}\n\tt := &SecondTableInAT{}\n\trcv.UnPackTo(t)\n\treturn t\n}\n\ntype SecondTableInA struct {\n\t_tab flatbuffers.Table\n}\n\nfunc GetRootAsSecondTableInA(buf []byte, offset flatbuffers.UOffsetT) *SecondTableInA {\n\tn := flatbuffers.GetUOffsetT(buf[offset:])\n\tx := &SecondTableInA{}\n\tx.Init(buf, n+offset)\n\treturn x\n}\n\nfunc GetSizePrefixedRootAsSecondTableInA(buf []byte, offset flatbuffers.UOffsetT) *SecondTableInA {\n\tn := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])\n\tx := &SecondTableInA{}\n\tx.Init(buf, n+offset+flatbuffers.SizeUint32)\n\treturn x\n}\n\nfunc (rcv *SecondTableInA) Init(buf []byte, i flatbuffers.UOffsetT) {\n\trcv._tab.Bytes = buf\n\trcv._tab.Pos = i\n}\n\nfunc (rcv *SecondTableInA) Table() flatbuffers.Table {\n\treturn rcv._tab\n}\n\nfunc (rcv *SecondTableInA) ReferToC(obj *NamespaceC.TableInC) *NamespaceC.TableInC {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(4))\n\tif o != 0 {\n\t\tx := rcv._tab.Indirect(o + rcv._tab.Pos)\n\t\tif obj == nil {\n\t\t\tobj = new(NamespaceC.TableInC)\n\t\t}\n\t\tobj.Init(rcv._tab.Bytes, x)\n\t\treturn obj\n\t}\n\treturn nil\n}\n\nfunc SecondTableInAStart(builder *flatbuffers.Builder) {\n\tbuilder.StartObject(1)\n}\nfunc SecondTableInAAddReferToC(builder *flatbuffers.Builder, referToC flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(referToC), 0)\n}\nfunc SecondTableInAEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\treturn builder.EndObject()\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/SecondTableInA.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage NamespaceA;\n\nimport com.google.flatbuffers.*;\nimport java.nio.*;\nimport java.util.*;\n\n@SuppressWarnings(\"unused\")\npublic final class SecondTableInA extends Table {\n  public static void ValidateVersion() {\n    Constants.FLATBUFFERS_25_12_19();\n  }\n\n  public static SecondTableInA getRootAsSecondTableInA(ByteBuffer _bb) {\n    return getRootAsSecondTableInA(_bb, new SecondTableInA());\n  }\n\n  public static SecondTableInA getRootAsSecondTableInA(ByteBuffer _bb, SecondTableInA obj) {\n    _bb.order(ByteOrder.LITTLE_ENDIAN);\n    return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb));\n  }\n\n  public void __init(int _i, ByteBuffer _bb) {\n    __reset(_i, _bb);\n  }\n\n  public SecondTableInA __assign(int _i, ByteBuffer _bb) {\n    __init(_i, _bb);\n    return this;\n  }\n\n  public NamespaceC.TableInC referToC() {\n    return referToC(new NamespaceC.TableInC());\n  }\n\n  public NamespaceC.TableInC referToC(NamespaceC.TableInC obj) {\n    int o = __offset(4);\n    return o != 0 ? obj.__assign(__indirect(o + bb_pos), bb) : null;\n  }\n\n  public static int createSecondTableInA(FlatBufferBuilder builder, int referToCOffset) {\n    builder.startTable(1);\n    SecondTableInA.addReferToC(builder, referToCOffset);\n    return SecondTableInA.endSecondTableInA(builder);\n  }\n\n  public static void startSecondTableInA(FlatBufferBuilder builder) {\n    builder.startTable(1);\n  }\n\n  public static void addReferToC(FlatBufferBuilder builder, int referToCOffset) {\n    builder.addOffset(0, referToCOffset, 0);\n  }\n\n  public static int endSecondTableInA(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    return o;\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) {\n      __reset(_vector, _element_size, _bb);\n      return this;\n    }\n\n    public SecondTableInA get(int j) {\n      return get(new SecondTableInA(), j);\n    }\n\n    public SecondTableInA get(SecondTableInA obj, int j) {\n      return obj.__assign(__indirect(__element(j), bb), bb);\n    }\n  }\n\n  public SecondTableInAT unpack() {\n    SecondTableInAT _o = new SecondTableInAT();\n    unpackTo(_o);\n    return _o;\n  }\n\n  public void unpackTo(SecondTableInAT _o) {\n    if (referToC() != null) _o.setReferToC(referToC().unpack());\n    else _o.setReferToC(null);\n  }\n\n  public static int pack(FlatBufferBuilder builder, SecondTableInAT _o) {\n    if (_o == null) return 0;\n    int _refer_to_c =\n        _o.getReferToC() == null ? 0 : NamespaceC.TableInC.pack(builder, _o.getReferToC());\n    return createSecondTableInA(builder, _refer_to_c);\n  }\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/SecondTableInA.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage NamespaceA\n\nimport com.google.flatbuffers.Constants\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.Table\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\n\n@Suppress(\"unused\")\n@ExperimentalUnsignedTypes\nclass SecondTableInA : Table() {\n\n  fun __init(_i: Int, _bb: ByteBuffer) {\n    __reset(_i, _bb)\n  }\n\n  fun __assign(_i: Int, _bb: ByteBuffer): SecondTableInA {\n    __init(_i, _bb)\n    return this\n  }\n\n  val referToC: NamespaceC.TableInC?\n    get() = referToC(NamespaceC.TableInC())\n\n  fun referToC(obj: NamespaceC.TableInC): NamespaceC.TableInC? {\n    val o = __offset(4)\n    return if (o != 0) {\n      obj.__assign(__indirect(o + bb_pos), bb)\n    } else {\n      null\n    }\n  }\n\n  companion object {\n    fun validateVersion() = Constants.FLATBUFFERS_25_12_19()\n\n    fun getRootAsSecondTableInA(_bb: ByteBuffer): SecondTableInA =\n      getRootAsSecondTableInA(_bb, SecondTableInA())\n\n    fun getRootAsSecondTableInA(_bb: ByteBuffer, obj: SecondTableInA): SecondTableInA {\n      _bb.order(ByteOrder.LITTLE_ENDIAN)\n      return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb))\n    }\n\n    fun createSecondTableInA(builder: FlatBufferBuilder, referToCOffset: Int): Int {\n      builder.startTable(1)\n      addReferToC(builder, referToCOffset)\n      return endSecondTableInA(builder)\n    }\n\n    fun startSecondTableInA(builder: FlatBufferBuilder) = builder.startTable(1)\n\n    fun addReferToC(builder: FlatBufferBuilder, referToC: Int) = builder.addOffset(0, referToC, 0)\n\n    fun endSecondTableInA(builder: FlatBufferBuilder): Int {\n      val o = builder.endTable()\n      return o\n    }\n  }\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/SecondTableInA.lua",
    "content": "-- automatically generated by the FlatBuffers compiler, do not modify\n\n-- namespace: NamespaceA\n\nlocal flatbuffers = require('flatbuffers')\n\nlocal SecondTableInA = {} -- the module\nlocal SecondTableInA_mt = {} -- the class metatable\n\nfunction SecondTableInA.New()\n    local o = {}\n    setmetatable(o, {__index = SecondTableInA_mt})\n    return o\nend\nfunction SecondTableInA.GetRootAsSecondTableInA(buf, offset)\n    if type(buf) == \"string\" then\n        buf = flatbuffers.binaryArray.New(buf)\n    end\n    local n = flatbuffers.N.UOffsetT:Unpack(buf, offset)\n    local o = SecondTableInA.New()\n    o:Init(buf, n + offset)\n    return o\nend\nfunction SecondTableInA_mt:Init(buf, pos)\n    self.view = flatbuffers.view.New(buf, pos)\nend\nfunction SecondTableInA_mt:ReferToC()\n    local o = self.view:Offset(4)\n    if o ~= 0 then\n        local x = self.view:Indirect(o + self.view.pos)\n        local obj = require('NamespaceC.TableInC').New()\n        obj:Init(self.view.bytes, x)\n        return obj\n    end\nend\nfunction SecondTableInA.Start(builder) builder:StartObject(1) end\nfunction SecondTableInA.AddReferToC(builder, referToC) builder:PrependUOffsetTRelativeSlot(0, referToC, 0) end\nfunction SecondTableInA.End(builder) return builder:EndObject() end\n\nreturn SecondTableInA -- return the module"
  },
  {
    "path": "tests/namespace_test/NamespaceA/SecondTableInA.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nnamespace NamespaceA;\n\nuse \\Google\\FlatBuffers\\Struct;\nuse \\Google\\FlatBuffers\\Table;\nuse \\Google\\FlatBuffers\\ByteBuffer;\nuse \\Google\\FlatBuffers\\FlatBufferBuilder;\n\nclass SecondTableInA extends Table\n{\n    /**\n     * @param ByteBuffer $bb\n     * @return SecondTableInA\n     */\n    public static function getRootAsSecondTableInA(ByteBuffer $bb)\n    {\n        $obj = new SecondTableInA();\n        return ($obj->init($bb->getInt($bb->getPosition()) + $bb->getPosition(), $bb));\n    }\n\n    /**\n     * @param int $_i offset\n     * @param ByteBuffer $_bb\n     * @return SecondTableInA\n     **/\n    public function init($_i, ByteBuffer $_bb)\n    {\n        $this->bb_pos = $_i;\n        $this->bb = $_bb;\n        return $this;\n    }\n\n    public function getReferToC()\n    {\n        $obj = new TableInC();\n        $o = $this->__offset(4);\n        return $o != 0 ? $obj->init($this->__indirect($o + $this->bb_pos), $this->bb) : 0;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return void\n     */\n    public static function startSecondTableInA(FlatBufferBuilder $builder)\n    {\n        $builder->StartObject(1);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return SecondTableInA\n     */\n    public static function createSecondTableInA(FlatBufferBuilder $builder, $refer_to_c)\n    {\n        $builder->startObject(1);\n        self::addReferToC($builder, $refer_to_c);\n        $o = $builder->endObject();\n        return $o;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int\n     * @return void\n     */\n    public static function addReferToC(FlatBufferBuilder $builder, $referToC)\n    {\n        $builder->addOffsetX(0, $referToC, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return int table offset\n     */\n    public static function endSecondTableInA(FlatBufferBuilder $builder)\n    {\n        $o = $builder->endObject();\n        return $o;\n    }\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/SecondTableInA.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: NamespaceA\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\n\nnp = import_numpy()\n\n\nclass SecondTableInA(object):\n  __slots__ = ['_tab']\n\n  @classmethod\n  def GetRootAs(cls, buf, offset=0):\n    n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n    x = SecondTableInA()\n    x.Init(buf, n + offset)\n    return x\n\n  @classmethod\n  def GetRootAsSecondTableInA(cls, buf, offset=0):\n    \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n    return cls.GetRootAs(buf, offset)\n\n  # SecondTableInA\n  def Init(self, buf, pos):\n    self._tab = flatbuffers.table.Table(buf, pos)\n\n  # SecondTableInA\n  def ReferToC(self):\n    o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n    if o != 0:\n      x = self._tab.Indirect(o + self._tab.Pos)\n      obj = TableInC()\n      obj.Init(self._tab.Bytes, x)\n      return obj\n    return None\n\n\ndef SecondTableInAStart(builder):\n  builder.StartObject(1)\n\n\ndef Start(builder):\n  return SecondTableInAStart(builder)\n\n\ndef SecondTableInAAddReferToC(builder, referToC):\n  builder.PrependUOffsetTRelativeSlot(\n      0, flatbuffers.number_types.UOffsetTFlags.py_type(referToC), 0\n  )\n\n\ndef AddReferToC(builder, referToC):\n  return SecondTableInAAddReferToC(builder, referToC)\n\n\ndef SecondTableInAEnd(builder):\n  return builder.EndObject()\n\n\ndef End(builder):\n  return SecondTableInAEnd(builder)\n\n\ntry:\n  from typing import Optional\nexcept:\n  pass\n\n\nclass SecondTableInAT(object):\n\n  # SecondTableInAT\n  def __init__(self):\n    self.referToC = None  # type: Optional[TableInCT]\n\n  @classmethod\n  def InitFromBuf(cls, buf, pos):\n    secondTableInA = SecondTableInA()\n    secondTableInA.Init(buf, pos)\n    return cls.InitFromObj(secondTableInA)\n\n  @classmethod\n  def InitFromObj(cls, secondTableInA):\n    x = SecondTableInAT()\n    x._UnPack(secondTableInA)\n    return x\n\n  # SecondTableInAT\n  def _UnPack(self, secondTableInA):\n    if secondTableInA is None:\n      return\n    if secondTableInA.ReferToC() is not None:\n      self.referToC = TableInCT.InitFromObj(secondTableInA.ReferToC())\n\n  # SecondTableInAT\n  def Pack(self, builder):\n    if self.referToC is not None:\n      referToC = self.referToC.Pack(builder)\n    SecondTableInAStart(builder)\n    if self.referToC is not None:\n      SecondTableInAAddReferToC(builder, referToC)\n    secondTableInA = SecondTableInAEnd(builder)\n    return secondTableInA\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/SecondTableInAT.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage NamespaceA;\n\nimport com.google.flatbuffers.*;\nimport java.nio.*;\nimport java.util.*;\n\npublic class SecondTableInAT {\n  private NamespaceC.TableInCT referToC;\n\n  public NamespaceC.TableInCT getReferToC() {\n    return referToC;\n  }\n\n  public void setReferToC(NamespaceC.TableInCT referToC) {\n    this.referToC = referToC;\n  }\n\n  public SecondTableInAT() {\n    this.referToC = null;\n  }\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/TableInC.cs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\nnamespace NamespaceA\n{\n\nusing System;\nusing Google.FlatBuffers;\n\npublic sealed class TableInC : Table {\n  public static TableInC GetRootAsTableInC(ByteBuffer _bb) { return GetRootAsTableInC(_bb, new TableInC()); }\n  public static TableInC GetRootAsTableInC(ByteBuffer _bb, TableInC obj) { return (obj.__init(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }\n  public TableInC __init(int _i, ByteBuffer _bb) { bb_pos = _i; bb = _bb; return this; }\n\n  public NamespaceA.TableInFirstNS ReferToA1 { get { return GetReferToA1(new NamespaceA.TableInFirstNS()); } }\n  public NamespaceA.TableInFirstNS GetReferToA1(NamespaceA.TableInFirstNS obj) { int o = __offset(4); return o != 0 ? obj.__init(__indirect(o + bb_pos), bb) : null; }\n  public SecondTableInA ReferToA2 { get { return GetReferToA2(new SecondTableInA()); } }\n  public SecondTableInA GetReferToA2(SecondTableInA obj) { int o = __offset(6); return o != 0 ? obj.__init(__indirect(o + bb_pos), bb) : null; }\n\n  public static Offset<NamespaceC.TableInC> CreateTableInC(FlatBufferBuilder builder,\n      Offset<NamespaceA.TableInFirstNS> refer_to_a1Offset = default(Offset<NamespaceA.TableInFirstNS>),\n      Offset<SecondTableInA> refer_to_a2Offset = default(Offset<SecondTableInA>)) {\n    builder.StartObject(2);\n    TableInC.AddReferToA2(builder, refer_to_a2Offset);\n    TableInC.AddReferToA1(builder, refer_to_a1Offset);\n    return TableInC.EndTableInC(builder);\n  }\n\n  public static void StartTableInC(FlatBufferBuilder builder) { builder.StartObject(2); }\n  public static void AddReferToA1(FlatBufferBuilder builder, Offset<NamespaceA.TableInFirstNS> referToA1Offset) { builder.AddOffset(0, referToA1Offset.Value, 0); }\n  public static void AddReferToA2(FlatBufferBuilder builder, Offset<SecondTableInA> referToA2Offset) { builder.AddOffset(1, referToA2Offset.Value, 0); }\n  public static Offset<NamespaceC.TableInC> EndTableInC(FlatBufferBuilder builder) {\n    int o = builder.EndObject();\n    return new Offset<NamespaceC.TableInC>(o);\n  }\n};\n\n\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/TableInC.go",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage NamespaceA\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n)\n\ntype TableInC struct {\n\t_tab flatbuffers.Table\n}\n\nfunc (rcv *TableInC) Init(buf []byte, i flatbuffers.UOffsetT) {\n\trcv._tab.Bytes = buf\n\trcv._tab.Pos = i\n}\n\nfunc (rcv *TableInC) ReferToA1(obj *TableInFirstNS) *TableInFirstNS {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(4))\n\tif o != 0 {\n\t\tx := rcv._tab.Indirect(o + rcv._tab.Pos)\n\t\tif obj == nil {\n\t\t\tobj = new(TableInFirstNS)\n\t\t}\n\t\tobj.Init(rcv._tab.Bytes, x)\n\t\treturn obj\n\t}\n\treturn nil\n}\n\nfunc (rcv *TableInC) ReferToA2(obj *SecondTableInA) *SecondTableInA {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(6))\n\tif o != 0 {\n\t\tx := rcv._tab.Indirect(o + rcv._tab.Pos)\n\t\tif obj == nil {\n\t\t\tobj = new(SecondTableInA)\n\t\t}\n\t\tobj.Init(rcv._tab.Bytes, x)\n\t\treturn obj\n\t}\n\treturn nil\n}\n\nfunc TableInCStart(builder *flatbuffers.Builder) { builder.StartObject(2) }\nfunc TableInCAddReferToA1(builder *flatbuffers.Builder, referToA1 flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(referToA1), 0)\n}\nfunc TableInCAddReferToA2(builder *flatbuffers.Builder, referToA2 flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(1, flatbuffers.UOffsetT(referToA2), 0)\n}\nfunc TableInCEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT { return builder.EndObject() }\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/TableInC.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nnamespace NamespaceA;\n\nuse \\Google\\FlatBuffers\\Struct;\nuse \\Google\\FlatBuffers\\Table;\nuse \\Google\\FlatBuffers\\ByteBuffer;\nuse \\Google\\FlatBuffers\\FlatBufferBuilder;\n\nclass TableInC extends Table\n{\n    /**\n     * @param ByteBuffer $bb\n     * @return TableInC\n     */\n    public static function getRootAsTableInC(ByteBuffer $bb)\n    {\n        $obj = new TableInC();\n        return ($obj->init($bb->getInt($bb->getPosition()) + $bb->getPosition(), $bb));\n    }\n\n    /**\n     * @param int $_i offset\n     * @param ByteBuffer $_bb\n     * @return TableInC\n     **/\n    public function init($_i, ByteBuffer $_bb)\n    {\n        $this->bb_pos = $_i;\n        $this->bb = $_bb;\n        return $this;\n    }\n\n    public function getReferToA1()\n    {\n        $obj = new TableInFirstNS();\n        $o = $this->__offset(4);\n        return $o != 0 ? $obj->init($this->__indirect($o + $this->bb_pos), $this->bb) : 0;\n    }\n\n    public function getReferToA2()\n    {\n        $obj = new SecondTableInA();\n        $o = $this->__offset(6);\n        return $o != 0 ? $obj->init($this->__indirect($o + $this->bb_pos), $this->bb) : 0;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return void\n     */\n    public static function startTableInC(FlatBufferBuilder $builder)\n    {\n        $builder->StartObject(2);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return TableInC\n     */\n    public static function createTableInC(FlatBufferBuilder $builder, $refer_to_a1, $refer_to_a2)\n    {\n        $builder->startObject(2);\n        self::addReferToA1($builder, $refer_to_a1);\n        self::addReferToA2($builder, $refer_to_a2);\n        $o = $builder->endObject();\n        return $o;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int\n     * @return void\n     */\n    public static function addReferToA1(FlatBufferBuilder $builder, $referToA1)\n    {\n        $builder->addOffsetX(0, $referToA1, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int\n     * @return void\n     */\n    public static function addReferToA2(FlatBufferBuilder $builder, $referToA2)\n    {\n        $builder->addOffsetX(1, $referToA2, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return int table offset\n     */\n    public static function endTableInC(FlatBufferBuilder $builder)\n    {\n        $o = $builder->endObject();\n        return $o;\n    }\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/TableInC.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: NamespaceA\n\nimport flatbuffers\n\n\nclass TableInC(object):\n  __slots__ = ['_tab']\n\n  # TableInC\n  def Init(self, buf, pos):\n    self._tab = flatbuffers.table.Table(buf, pos)\n\n  # TableInC\n  def ReferToA1(self):\n    o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n    if o != 0:\n      x = self._tab.Indirect(o + self._tab.Pos)\n      from .TableInFirstNS import TableInFirstNS\n\n      obj = TableInFirstNS()\n      obj.Init(self._tab.Bytes, x)\n      return obj\n    return None\n\n  # TableInC\n  def ReferToA2(self):\n    o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n    if o != 0:\n      x = self._tab.Indirect(o + self._tab.Pos)\n      from .SecondTableInA import SecondTableInA\n\n      obj = SecondTableInA()\n      obj.Init(self._tab.Bytes, x)\n      return obj\n    return None\n\n\ndef TableInCStart(builder):\n  builder.StartObject(2)\n\n\ndef TableInCAddReferToA1(builder, referToA1):\n  builder.PrependUOffsetTRelativeSlot(\n      0, flatbuffers.number_types.UOffsetTFlags.py_type(referToA1), 0\n  )\n\n\ndef TableInCAddReferToA2(builder, referToA2):\n  builder.PrependUOffsetTRelativeSlot(\n      1, flatbuffers.number_types.UOffsetTFlags.py_type(referToA2), 0\n  )\n\n\ndef TableInCEnd(builder):\n  return builder.EndObject()\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/TableInFirstNS.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace NamespaceA\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct TableInFirstNS : IFlatbufferObject\n{\n  private Table __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_25_12_19(); }\n  public static TableInFirstNS GetRootAsTableInFirstNS(ByteBuffer _bb) { return GetRootAsTableInFirstNS(_bb, new TableInFirstNS()); }\n  public static TableInFirstNS GetRootAsTableInFirstNS(ByteBuffer _bb, TableInFirstNS obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }\n  public TableInFirstNS __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public NamespaceA.NamespaceB.TableInNestedNS? FooTable { get { int o = __p.__offset(4); return o != 0 ? (NamespaceA.NamespaceB.TableInNestedNS?)(new NamespaceA.NamespaceB.TableInNestedNS()).__assign(__p.__indirect(o + __p.bb_pos), __p.bb) : null; } }\n  public NamespaceA.NamespaceB.EnumInNestedNS FooEnum { get { int o = __p.__offset(6); return o != 0 ? (NamespaceA.NamespaceB.EnumInNestedNS)__p.bb.GetSbyte(o + __p.bb_pos) : NamespaceA.NamespaceB.EnumInNestedNS.A; } }\n  public bool MutateFooEnum(NamespaceA.NamespaceB.EnumInNestedNS foo_enum) { int o = __p.__offset(6); if (o != 0) { __p.bb.PutSbyte(o + __p.bb_pos, (sbyte)foo_enum); return true; } else { return false; } }\n  public NamespaceA.NamespaceB.UnionInNestedNS FooUnionType { get { int o = __p.__offset(8); return o != 0 ? (NamespaceA.NamespaceB.UnionInNestedNS)__p.bb.Get(o + __p.bb_pos) : NamespaceA.NamespaceB.UnionInNestedNS.NONE; } }\n  public TTable? FooUnion<TTable>() where TTable : struct, IFlatbufferObject { int o = __p.__offset(10); return o != 0 ? (TTable?)__p.__union<TTable>(o + __p.bb_pos) : null; }\n  public NamespaceA.NamespaceB.TableInNestedNS FooUnionAsTableInNestedNS() { return FooUnion<NamespaceA.NamespaceB.TableInNestedNS>().Value; }\n  public NamespaceA.NamespaceB.StructInNestedNS? FooStruct { get { int o = __p.__offset(12); return o != 0 ? (NamespaceA.NamespaceB.StructInNestedNS?)(new NamespaceA.NamespaceB.StructInNestedNS()).__assign(o + __p.bb_pos, __p.bb) : null; } }\n\n  public static Offset<NamespaceA.TableInFirstNS> CreateTableInFirstNS(FlatBufferBuilder builder,\n      Offset<NamespaceA.NamespaceB.TableInNestedNS> foo_tableOffset = default(Offset<NamespaceA.NamespaceB.TableInNestedNS>),\n      NamespaceA.NamespaceB.EnumInNestedNS foo_enum = NamespaceA.NamespaceB.EnumInNestedNS.A,\n      NamespaceA.NamespaceB.UnionInNestedNS foo_union_type = NamespaceA.NamespaceB.UnionInNestedNS.NONE,\n      int foo_unionOffset = 0,\n      NamespaceA.NamespaceB.StructInNestedNST foo_struct = null) {\n    builder.StartTable(5);\n    TableInFirstNS.AddFooStruct(builder, NamespaceA.NamespaceB.StructInNestedNS.Pack(builder, foo_struct));\n    TableInFirstNS.AddFooUnion(builder, foo_unionOffset);\n    TableInFirstNS.AddFooTable(builder, foo_tableOffset);\n    TableInFirstNS.AddFooUnionType(builder, foo_union_type);\n    TableInFirstNS.AddFooEnum(builder, foo_enum);\n    return TableInFirstNS.EndTableInFirstNS(builder);\n  }\n\n  public static void StartTableInFirstNS(FlatBufferBuilder builder) { builder.StartTable(5); }\n  public static void AddFooTable(FlatBufferBuilder builder, Offset<NamespaceA.NamespaceB.TableInNestedNS> fooTableOffset) { builder.AddOffset(0, fooTableOffset.Value, 0); }\n  public static void AddFooEnum(FlatBufferBuilder builder, NamespaceA.NamespaceB.EnumInNestedNS fooEnum) { builder.AddSbyte(1, (sbyte)fooEnum, 0); }\n  public static void AddFooUnionType(FlatBufferBuilder builder, NamespaceA.NamespaceB.UnionInNestedNS fooUnionType) { builder.AddByte(2, (byte)fooUnionType, 0); }\n  public static void AddFooUnion(FlatBufferBuilder builder, int fooUnionOffset) { builder.AddOffset(3, fooUnionOffset, 0); }\n  public static void AddFooStruct(FlatBufferBuilder builder, Offset<NamespaceA.NamespaceB.StructInNestedNS> fooStructOffset) { builder.AddStruct(4, fooStructOffset.Value, 0); }\n  public static Offset<NamespaceA.TableInFirstNS> EndTableInFirstNS(FlatBufferBuilder builder) {\n    int o = builder.EndTable();\n    return new Offset<NamespaceA.TableInFirstNS>(o);\n  }\n  public TableInFirstNST UnPack() {\n    var _o = new TableInFirstNST();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(TableInFirstNST _o) {\n    _o.FooTable = this.FooTable.HasValue ? this.FooTable.Value.UnPack() : null;\n    _o.FooEnum = this.FooEnum;\n    _o.FooUnion = new NamespaceA.NamespaceB.UnionInNestedNSUnion();\n    _o.FooUnion.Type = this.FooUnionType;\n    switch (this.FooUnionType) {\n      default: break;\n      case NamespaceA.NamespaceB.UnionInNestedNS.TableInNestedNS:\n        _o.FooUnion.Value = this.FooUnion<NamespaceA.NamespaceB.TableInNestedNS>().HasValue ? this.FooUnion<NamespaceA.NamespaceB.TableInNestedNS>().Value.UnPack() : null;\n        break;\n    }\n    _o.FooStruct = this.FooStruct.HasValue ? this.FooStruct.Value.UnPack() : null;\n  }\n  public static Offset<NamespaceA.TableInFirstNS> Pack(FlatBufferBuilder builder, TableInFirstNST _o) {\n    if (_o == null) return default(Offset<NamespaceA.TableInFirstNS>);\n    var _foo_table = _o.FooTable == null ? default(Offset<NamespaceA.NamespaceB.TableInNestedNS>) : NamespaceA.NamespaceB.TableInNestedNS.Pack(builder, _o.FooTable);\n    var _foo_union_type = _o.FooUnion == null ? NamespaceA.NamespaceB.UnionInNestedNS.NONE : _o.FooUnion.Type;\n    var _foo_union = _o.FooUnion == null ? 0 : NamespaceA.NamespaceB.UnionInNestedNSUnion.Pack(builder, _o.FooUnion);\n    return CreateTableInFirstNS(\n      builder,\n      _foo_table,\n      _o.FooEnum,\n      _foo_union_type,\n      _foo_union,\n      _o.FooStruct);\n  }\n}\n\npublic class TableInFirstNST\n{\n  [Newtonsoft.Json.JsonProperty(\"foo_table\")]\n  public NamespaceA.NamespaceB.TableInNestedNST FooTable { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"foo_enum\")]\n  public NamespaceA.NamespaceB.EnumInNestedNS FooEnum { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"foo_union_type\")]\n  private NamespaceA.NamespaceB.UnionInNestedNS FooUnionType {\n    get {\n      return this.FooUnion != null ? this.FooUnion.Type : NamespaceA.NamespaceB.UnionInNestedNS.NONE;\n    }\n    set {\n      this.FooUnion = new NamespaceA.NamespaceB.UnionInNestedNSUnion();\n      this.FooUnion.Type = value;\n    }\n  }\n  [Newtonsoft.Json.JsonProperty(\"foo_union\")]\n  [Newtonsoft.Json.JsonConverter(typeof(NamespaceA.NamespaceB.UnionInNestedNSUnion_JsonConverter))]\n  public NamespaceA.NamespaceB.UnionInNestedNSUnion FooUnion { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"foo_struct\")]\n  public NamespaceA.NamespaceB.StructInNestedNST FooStruct { get; set; }\n\n  public TableInFirstNST() {\n    this.FooTable = null;\n    this.FooEnum = NamespaceA.NamespaceB.EnumInNestedNS.A;\n    this.FooUnion = null;\n    this.FooStruct = new NamespaceA.NamespaceB.StructInNestedNST();\n  }\n}\n\n\nstatic public class TableInFirstNSVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos)\n  {\n    return verifier.VerifyTableStart(tablePos)\n      && verifier.VerifyTable(tablePos, 4 /*FooTable*/, NamespaceA.NamespaceB.TableInNestedNSVerify.Verify, false)\n      && verifier.VerifyField(tablePos, 6 /*FooEnum*/, 1 /*NamespaceA.NamespaceB.EnumInNestedNS*/, 1, false)\n      && verifier.VerifyField(tablePos, 8 /*FooUnionType*/, 1 /*NamespaceA.NamespaceB.UnionInNestedNS*/, 1, false)\n      && verifier.VerifyUnion(tablePos, 8, 10 /*FooUnion*/, NamespaceA.NamespaceB.UnionInNestedNSVerify.Verify, false)\n      && verifier.VerifyField(tablePos, 12 /*FooStruct*/, 8 /*NamespaceA.NamespaceB.StructInNestedNS*/, 4, false)\n      && verifier.VerifyTableEnd(tablePos);\n  }\n}\n\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/TableInFirstNS.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage NamespaceA\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n\n\tNamespaceA__NamespaceB \"NamespaceA/NamespaceB\"\n)\n\ntype TableInFirstNST struct {\n\tFooTable  *NamespaceA__NamespaceB.TableInNestedNST\n\tFooEnum   NamespaceA__NamespaceB.EnumInNestedNS\n\tFooUnion  *NamespaceA__NamespaceB.UnionInNestedNST\n\tFooStruct *NamespaceA__NamespaceB.StructInNestedNST\n}\n\nfunc (t *TableInFirstNST) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\tif t == nil {\n\t\treturn 0\n\t}\n\tfooTableOffset := t.FooTable.Pack(builder)\n\tfooUnionOffset := t.FooUnion.Pack(builder)\n\n\tTableInFirstNSStart(builder)\n\tTableInFirstNSAddFooTable(builder, fooTableOffset)\n\tTableInFirstNSAddFooEnum(builder, t.FooEnum)\n\tif t.FooUnion != nil {\n\t\tTableInFirstNSAddFooUnionType(builder, t.FooUnion.Type)\n\t}\n\tTableInFirstNSAddFooUnion(builder, fooUnionOffset)\n\tfooStructOffset := t.FooStruct.Pack(builder)\n\tTableInFirstNSAddFooStruct(builder, fooStructOffset)\n\treturn TableInFirstNSEnd(builder)\n}\n\nfunc (rcv *TableInFirstNS) UnPackTo(t *TableInFirstNST) {\n\tt.FooTable = rcv.FooTable(nil).UnPack()\n\tt.FooEnum = rcv.FooEnum()\n\tfooUnionTable := flatbuffers.Table{}\n\tif rcv.FooUnion(&fooUnionTable) {\n\t\tt.FooUnion = rcv.FooUnionType().UnPack(fooUnionTable)\n\t}\n\tt.FooStruct = rcv.FooStruct(nil).UnPack()\n}\n\nfunc (rcv *TableInFirstNS) UnPack() *TableInFirstNST {\n\tif rcv == nil {\n\t\treturn nil\n\t}\n\tt := &TableInFirstNST{}\n\trcv.UnPackTo(t)\n\treturn t\n}\n\ntype TableInFirstNS struct {\n\t_tab flatbuffers.Table\n}\n\nfunc GetRootAsTableInFirstNS(buf []byte, offset flatbuffers.UOffsetT) *TableInFirstNS {\n\tn := flatbuffers.GetUOffsetT(buf[offset:])\n\tx := &TableInFirstNS{}\n\tx.Init(buf, n+offset)\n\treturn x\n}\n\nfunc GetSizePrefixedRootAsTableInFirstNS(buf []byte, offset flatbuffers.UOffsetT) *TableInFirstNS {\n\tn := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])\n\tx := &TableInFirstNS{}\n\tx.Init(buf, n+offset+flatbuffers.SizeUint32)\n\treturn x\n}\n\nfunc (rcv *TableInFirstNS) Init(buf []byte, i flatbuffers.UOffsetT) {\n\trcv._tab.Bytes = buf\n\trcv._tab.Pos = i\n}\n\nfunc (rcv *TableInFirstNS) Table() flatbuffers.Table {\n\treturn rcv._tab\n}\n\nfunc (rcv *TableInFirstNS) FooTable(obj *NamespaceA__NamespaceB.TableInNestedNS) *NamespaceA__NamespaceB.TableInNestedNS {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(4))\n\tif o != 0 {\n\t\tx := rcv._tab.Indirect(o + rcv._tab.Pos)\n\t\tif obj == nil {\n\t\t\tobj = new(NamespaceA__NamespaceB.TableInNestedNS)\n\t\t}\n\t\tobj.Init(rcv._tab.Bytes, x)\n\t\treturn obj\n\t}\n\treturn nil\n}\n\nfunc (rcv *TableInFirstNS) FooEnum() NamespaceA__NamespaceB.EnumInNestedNS {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(6))\n\tif o != 0 {\n\t\treturn NamespaceA__NamespaceB.EnumInNestedNS(rcv._tab.GetInt8(o + rcv._tab.Pos))\n\t}\n\treturn 0\n}\n\nfunc (rcv *TableInFirstNS) MutateFooEnum(n NamespaceA__NamespaceB.EnumInNestedNS) bool {\n\treturn rcv._tab.MutateInt8Slot(6, int8(n))\n}\n\nfunc (rcv *TableInFirstNS) FooUnionType() NamespaceA__NamespaceB.UnionInNestedNS {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(8))\n\tif o != 0 {\n\t\treturn NamespaceA__NamespaceB.UnionInNestedNS(rcv._tab.GetByte(o + rcv._tab.Pos))\n\t}\n\treturn 0\n}\n\nfunc (rcv *TableInFirstNS) MutateFooUnionType(n NamespaceA__NamespaceB.UnionInNestedNS) bool {\n\treturn rcv._tab.MutateByteSlot(8, byte(n))\n}\n\nfunc (rcv *TableInFirstNS) FooUnion(obj *flatbuffers.Table) bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(10))\n\tif o != 0 {\n\t\trcv._tab.Union(obj, o)\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (rcv *TableInFirstNS) FooStruct(obj *NamespaceA__NamespaceB.StructInNestedNS) *NamespaceA__NamespaceB.StructInNestedNS {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(12))\n\tif o != 0 {\n\t\tx := o + rcv._tab.Pos\n\t\tif obj == nil {\n\t\t\tobj = new(NamespaceA__NamespaceB.StructInNestedNS)\n\t\t}\n\t\tobj.Init(rcv._tab.Bytes, x)\n\t\treturn obj\n\t}\n\treturn nil\n}\n\nfunc TableInFirstNSStart(builder *flatbuffers.Builder) {\n\tbuilder.StartObject(5)\n}\nfunc TableInFirstNSAddFooTable(builder *flatbuffers.Builder, fooTable flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(fooTable), 0)\n}\nfunc TableInFirstNSAddFooEnum(builder *flatbuffers.Builder, fooEnum NamespaceA__NamespaceB.EnumInNestedNS) {\n\tbuilder.PrependInt8Slot(1, int8(fooEnum), 0)\n}\nfunc TableInFirstNSAddFooUnionType(builder *flatbuffers.Builder, fooUnionType NamespaceA__NamespaceB.UnionInNestedNS) {\n\tbuilder.PrependByteSlot(2, byte(fooUnionType), 0)\n}\nfunc TableInFirstNSAddFooUnion(builder *flatbuffers.Builder, fooUnion flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(3, flatbuffers.UOffsetT(fooUnion), 0)\n}\nfunc TableInFirstNSAddFooStruct(builder *flatbuffers.Builder, fooStruct flatbuffers.UOffsetT) {\n\tbuilder.PrependStructSlot(4, flatbuffers.UOffsetT(fooStruct), 0)\n}\nfunc TableInFirstNSEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\treturn builder.EndObject()\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/TableInFirstNS.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage NamespaceA;\n\nimport com.google.flatbuffers.*;\nimport java.nio.*;\nimport java.util.*;\n\n@SuppressWarnings(\"unused\")\npublic final class TableInFirstNS extends Table {\n  public static void ValidateVersion() {\n    Constants.FLATBUFFERS_25_12_19();\n  }\n\n  public static TableInFirstNS getRootAsTableInFirstNS(ByteBuffer _bb) {\n    return getRootAsTableInFirstNS(_bb, new TableInFirstNS());\n  }\n\n  public static TableInFirstNS getRootAsTableInFirstNS(ByteBuffer _bb, TableInFirstNS obj) {\n    _bb.order(ByteOrder.LITTLE_ENDIAN);\n    return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb));\n  }\n\n  public void __init(int _i, ByteBuffer _bb) {\n    __reset(_i, _bb);\n  }\n\n  public TableInFirstNS __assign(int _i, ByteBuffer _bb) {\n    __init(_i, _bb);\n    return this;\n  }\n\n  public NamespaceA.NamespaceB.TableInNestedNS fooTable() {\n    return fooTable(new NamespaceA.NamespaceB.TableInNestedNS());\n  }\n\n  public NamespaceA.NamespaceB.TableInNestedNS fooTable(NamespaceA.NamespaceB.TableInNestedNS obj) {\n    int o = __offset(4);\n    return o != 0 ? obj.__assign(__indirect(o + bb_pos), bb) : null;\n  }\n\n  public byte fooEnum() {\n    int o = __offset(6);\n    return o != 0 ? bb.get(o + bb_pos) : 0;\n  }\n\n  public boolean mutateFooEnum(byte foo_enum) {\n    int o = __offset(6);\n    if (o != 0) {\n      bb.put(o + bb_pos, foo_enum);\n      return true;\n    } else {\n      return false;\n    }\n  }\n\n  public byte fooUnionType() {\n    int o = __offset(8);\n    return o != 0 ? bb.get(o + bb_pos) : 0;\n  }\n\n  public Table fooUnion(Table obj) {\n    int o = __offset(10);\n    return o != 0 ? __union(obj, o + bb_pos) : null;\n  }\n\n  public NamespaceA.NamespaceB.StructInNestedNS fooStruct() {\n    return fooStruct(new NamespaceA.NamespaceB.StructInNestedNS());\n  }\n\n  public NamespaceA.NamespaceB.StructInNestedNS fooStruct(\n      NamespaceA.NamespaceB.StructInNestedNS obj) {\n    int o = __offset(12);\n    return o != 0 ? obj.__assign(o + bb_pos, bb) : null;\n  }\n\n  public static void startTableInFirstNS(FlatBufferBuilder builder) {\n    builder.startTable(5);\n  }\n\n  public static void addFooTable(FlatBufferBuilder builder, int fooTableOffset) {\n    builder.addOffset(0, fooTableOffset, 0);\n  }\n\n  public static void addFooEnum(FlatBufferBuilder builder, byte fooEnum) {\n    builder.addByte(1, fooEnum, 0);\n  }\n\n  public static void addFooUnionType(FlatBufferBuilder builder, byte fooUnionType) {\n    builder.addByte(2, fooUnionType, 0);\n  }\n\n  public static void addFooUnion(FlatBufferBuilder builder, int fooUnionOffset) {\n    builder.addOffset(3, fooUnionOffset, 0);\n  }\n\n  public static void addFooStruct(FlatBufferBuilder builder, int fooStructOffset) {\n    builder.addStruct(4, fooStructOffset, 0);\n  }\n\n  public static int endTableInFirstNS(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    return o;\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) {\n      __reset(_vector, _element_size, _bb);\n      return this;\n    }\n\n    public TableInFirstNS get(int j) {\n      return get(new TableInFirstNS(), j);\n    }\n\n    public TableInFirstNS get(TableInFirstNS obj, int j) {\n      return obj.__assign(__indirect(__element(j), bb), bb);\n    }\n  }\n\n  public TableInFirstNST unpack() {\n    TableInFirstNST _o = new TableInFirstNST();\n    unpackTo(_o);\n    return _o;\n  }\n\n  public void unpackTo(TableInFirstNST _o) {\n    if (fooTable() != null) _o.setFooTable(fooTable().unpack());\n    else _o.setFooTable(null);\n    byte _oFooEnum = fooEnum();\n    _o.setFooEnum(_oFooEnum);\n    NamespaceA.NamespaceB.UnionInNestedNSUnion _oFooUnion =\n        new NamespaceA.NamespaceB.UnionInNestedNSUnion();\n    byte _oFooUnionType = fooUnionType();\n    _oFooUnion.setType(_oFooUnionType);\n    Table _oFooUnionValue;\n    switch (_oFooUnionType) {\n      case NamespaceA.NamespaceB.UnionInNestedNS.TableInNestedNS:\n        _oFooUnionValue = fooUnion(new NamespaceA.NamespaceB.TableInNestedNS());\n        _oFooUnion.setValue(\n            _oFooUnionValue != null\n                ? ((NamespaceA.NamespaceB.TableInNestedNS) _oFooUnionValue).unpack()\n                : null);\n        break;\n      default:\n        break;\n    }\n    _o.setFooUnion(_oFooUnion);\n    if (fooStruct() != null) fooStruct().unpackTo(_o.getFooStruct());\n    else _o.setFooStruct(null);\n  }\n\n  public static int pack(FlatBufferBuilder builder, TableInFirstNST _o) {\n    if (_o == null) return 0;\n    int _foo_table =\n        _o.getFooTable() == null\n            ? 0\n            : NamespaceA.NamespaceB.TableInNestedNS.pack(builder, _o.getFooTable());\n    byte _fooUnionType =\n        _o.getFooUnion() == null\n            ? NamespaceA.NamespaceB.UnionInNestedNS.NONE\n            : _o.getFooUnion().getType();\n    int _fooUnion =\n        _o.getFooUnion() == null\n            ? 0\n            : NamespaceA.NamespaceB.UnionInNestedNSUnion.pack(builder, _o.getFooUnion());\n    startTableInFirstNS(builder);\n    addFooTable(builder, _foo_table);\n    addFooEnum(builder, _o.getFooEnum());\n    addFooUnionType(builder, _fooUnionType);\n    addFooUnion(builder, _fooUnion);\n    addFooStruct(builder, NamespaceA.NamespaceB.StructInNestedNS.pack(builder, _o.getFooStruct()));\n    return endTableInFirstNS(builder);\n  }\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/TableInFirstNS.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage NamespaceA\n\nimport com.google.flatbuffers.Constants\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.Table\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\n\n@Suppress(\"unused\")\n@ExperimentalUnsignedTypes\nclass TableInFirstNS : Table() {\n\n  fun __init(_i: Int, _bb: ByteBuffer) {\n    __reset(_i, _bb)\n  }\n\n  fun __assign(_i: Int, _bb: ByteBuffer): TableInFirstNS {\n    __init(_i, _bb)\n    return this\n  }\n\n  val fooTable: NamespaceA.NamespaceB.TableInNestedNS?\n    get() = fooTable(NamespaceA.NamespaceB.TableInNestedNS())\n\n  fun fooTable(obj: NamespaceA.NamespaceB.TableInNestedNS): NamespaceA.NamespaceB.TableInNestedNS? {\n    val o = __offset(4)\n    return if (o != 0) {\n      obj.__assign(__indirect(o + bb_pos), bb)\n    } else {\n      null\n    }\n  }\n\n  val fooEnum: Byte\n    get() {\n      val o = __offset(6)\n      return if (o != 0) bb.get(o + bb_pos) else 0\n    }\n\n  fun mutateFooEnum(fooEnum: Byte): Boolean {\n    val o = __offset(6)\n    return if (o != 0) {\n      bb.put(o + bb_pos, fooEnum)\n      true\n    } else {\n      false\n    }\n  }\n\n  val fooUnionType: UByte\n    get() {\n      val o = __offset(8)\n      return if (o != 0) bb.get(o + bb_pos).toUByte() else 0u\n    }\n\n  fun mutateFooUnionType(fooUnionType: UByte): Boolean {\n    val o = __offset(8)\n    return if (o != 0) {\n      bb.put(o + bb_pos, fooUnionType.toByte())\n      true\n    } else {\n      false\n    }\n  }\n\n  fun fooUnion(obj: Table): Table? {\n    val o = __offset(10)\n    return if (o != 0) __union(obj, o + bb_pos) else null\n  }\n\n  val fooStruct: NamespaceA.NamespaceB.StructInNestedNS?\n    get() = fooStruct(NamespaceA.NamespaceB.StructInNestedNS())\n\n  fun fooStruct(\n    obj: NamespaceA.NamespaceB.StructInNestedNS\n  ): NamespaceA.NamespaceB.StructInNestedNS? {\n    val o = __offset(12)\n    return if (o != 0) {\n      obj.__assign(o + bb_pos, bb)\n    } else {\n      null\n    }\n  }\n\n  companion object {\n    fun validateVersion() = Constants.FLATBUFFERS_25_12_19()\n\n    fun getRootAsTableInFirstNS(_bb: ByteBuffer): TableInFirstNS =\n      getRootAsTableInFirstNS(_bb, TableInFirstNS())\n\n    fun getRootAsTableInFirstNS(_bb: ByteBuffer, obj: TableInFirstNS): TableInFirstNS {\n      _bb.order(ByteOrder.LITTLE_ENDIAN)\n      return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb))\n    }\n\n    fun startTableInFirstNS(builder: FlatBufferBuilder) = builder.startTable(5)\n\n    fun addFooTable(builder: FlatBufferBuilder, fooTable: Int) = builder.addOffset(0, fooTable, 0)\n\n    fun addFooEnum(builder: FlatBufferBuilder, fooEnum: Byte) = builder.addByte(1, fooEnum, 0)\n\n    fun addFooUnionType(builder: FlatBufferBuilder, fooUnionType: UByte) =\n      builder.addByte(2, fooUnionType.toByte(), 0)\n\n    fun addFooUnion(builder: FlatBufferBuilder, fooUnion: Int) = builder.addOffset(3, fooUnion, 0)\n\n    fun addFooStruct(builder: FlatBufferBuilder, fooStruct: Int) =\n      builder.addStruct(4, fooStruct, 0)\n\n    fun endTableInFirstNS(builder: FlatBufferBuilder): Int {\n      val o = builder.endTable()\n      return o\n    }\n  }\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/TableInFirstNS.lua",
    "content": "-- automatically generated by the FlatBuffers compiler, do not modify\n\n-- namespace: NamespaceA\n\nlocal flatbuffers = require('flatbuffers')\n\nlocal TableInFirstNS = {} -- the module\nlocal TableInFirstNS_mt = {} -- the class metatable\n\nfunction TableInFirstNS.New()\n    local o = {}\n    setmetatable(o, {__index = TableInFirstNS_mt})\n    return o\nend\nfunction TableInFirstNS.GetRootAsTableInFirstNS(buf, offset)\n    if type(buf) == \"string\" then\n        buf = flatbuffers.binaryArray.New(buf)\n    end\n    local n = flatbuffers.N.UOffsetT:Unpack(buf, offset)\n    local o = TableInFirstNS.New()\n    o:Init(buf, n + offset)\n    return o\nend\nfunction TableInFirstNS_mt:Init(buf, pos)\n    self.view = flatbuffers.view.New(buf, pos)\nend\nfunction TableInFirstNS_mt:FooTable()\n    local o = self.view:Offset(4)\n    if o ~= 0 then\n        local x = self.view:Indirect(o + self.view.pos)\n        local obj = require('NamespaceA.NamespaceB.TableInNestedNS').New()\n        obj:Init(self.view.bytes, x)\n        return obj\n    end\nend\nfunction TableInFirstNS_mt:FooEnum()\n    local o = self.view:Offset(6)\n    if o ~= 0 then\n        return self.view:Get(flatbuffers.N.Int8, o + self.view.pos)\n    end\n    return 0\nend\nfunction TableInFirstNS_mt:FooUnionType()\n    local o = self.view:Offset(8)\n    if o ~= 0 then\n        return self.view:Get(flatbuffers.N.Uint8, o + self.view.pos)\n    end\n    return 0\nend\nfunction TableInFirstNS_mt:FooUnion()\n    local o = self.view:Offset(10)\n    if o ~= 0 then\n        local obj = flatbuffers.view.New(require('flatbuffers.binaryarray').New(0), 0)\n        self.view:Union(obj, o)\n        return obj\n    end\nend\nfunction TableInFirstNS_mt:FooStruct()\n    local o = self.view:Offset(12)\n    if o ~= 0 then\n        local x = o + self.view.pos\n        local obj = require('NamespaceA.NamespaceB.StructInNestedNS').New()\n        obj:Init(self.view.bytes, x)\n        return obj\n    end\nend\nfunction TableInFirstNS.Start(builder) builder:StartObject(5) end\nfunction TableInFirstNS.AddFooTable(builder, fooTable) builder:PrependUOffsetTRelativeSlot(0, fooTable, 0) end\nfunction TableInFirstNS.AddFooEnum(builder, fooEnum) builder:PrependInt8Slot(1, fooEnum, 0) end\nfunction TableInFirstNS.AddFooUnionType(builder, fooUnionType) builder:PrependUint8Slot(2, fooUnionType, 0) end\nfunction TableInFirstNS.AddFooUnion(builder, fooUnion) builder:PrependUOffsetTRelativeSlot(3, fooUnion, 0) end\nfunction TableInFirstNS.AddFooStruct(builder, fooStruct) builder:PrependStructSlot(4, fooStruct, 0) end\nfunction TableInFirstNS.End(builder) return builder:EndObject() end\n\nreturn TableInFirstNS -- return the module"
  },
  {
    "path": "tests/namespace_test/NamespaceA/TableInFirstNS.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nnamespace NamespaceA;\n\nuse \\Google\\FlatBuffers\\Struct;\nuse \\Google\\FlatBuffers\\Table;\nuse \\Google\\FlatBuffers\\ByteBuffer;\nuse \\Google\\FlatBuffers\\FlatBufferBuilder;\n\nclass TableInFirstNS extends Table\n{\n    /**\n     * @param ByteBuffer $bb\n     * @return TableInFirstNS\n     */\n    public static function getRootAsTableInFirstNS(ByteBuffer $bb)\n    {\n        $obj = new TableInFirstNS();\n        return ($obj->init($bb->getInt($bb->getPosition()) + $bb->getPosition(), $bb));\n    }\n\n    /**\n     * @param int $_i offset\n     * @param ByteBuffer $_bb\n     * @return TableInFirstNS\n     **/\n    public function init($_i, ByteBuffer $_bb)\n    {\n        $this->bb_pos = $_i;\n        $this->bb = $_bb;\n        return $this;\n    }\n\n    public function getFooTable()\n    {\n        $obj = new TableInNestedNS();\n        $o = $this->__offset(4);\n        return $o != 0 ? $obj->init($this->__indirect($o + $this->bb_pos), $this->bb) : 0;\n    }\n\n    /**\n     * @return sbyte\n     */\n    public function getFooEnum()\n    {\n        $o = $this->__offset(6);\n        return $o != 0 ? $this->bb->getSbyte($o + $this->bb_pos) : \\NamespaceA\\NamespaceB\\EnumInNestedNS::A;\n    }\n\n    /**\n     * @return byte\n     */\n    public function getFooUnionType()\n    {\n        $o = $this->__offset(8);\n        return $o != 0 ? $this->bb->getByte($o + $this->bb_pos) : \\NamespaceA\\NamespaceB\\UnionInNestedNS::NONE;\n    }\n\n    /**\n     * @returnint\n     */\n    public function getFooUnion($obj)\n    {\n        $o = $this->__offset(10);\n        return $o != 0 ? $this->__union($obj, $o) : null;\n    }\n\n    public function getFooStruct()\n    {\n        $obj = new StructInNestedNS();\n        $o = $this->__offset(12);\n        return $o != 0 ? $obj->init($o + $this->bb_pos, $this->bb) : 0;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return void\n     */\n    public static function startTableInFirstNS(FlatBufferBuilder $builder)\n    {\n        $builder->StartObject(5);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return TableInFirstNS\n     */\n    public static function createTableInFirstNS(FlatBufferBuilder $builder, $foo_table, $foo_enum, $foo_union_type, $foo_union, $foo_struct)\n    {\n        $builder->startObject(5);\n        self::addFooTable($builder, $foo_table);\n        self::addFooEnum($builder, $foo_enum);\n        self::addFooUnionType($builder, $foo_union_type);\n        self::addFooUnion($builder, $foo_union);\n        self::addFooStruct($builder, $foo_struct);\n        $o = $builder->endObject();\n        return $o;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int\n     * @return void\n     */\n    public static function addFooTable(FlatBufferBuilder $builder, $fooTable)\n    {\n        $builder->addOffsetX(0, $fooTable, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param sbyte\n     * @return void\n     */\n    public static function addFooEnum(FlatBufferBuilder $builder, $fooEnum)\n    {\n        $builder->addSbyteX(1, $fooEnum, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param byte\n     * @return void\n     */\n    public static function addFooUnionType(FlatBufferBuilder $builder, $fooUnionType)\n    {\n        $builder->addByteX(2, $fooUnionType, 0);\n    }\n\n    public static function addFooUnion(FlatBufferBuilder $builder, $offset)\n    {\n        $builder->addOffsetX(3, $offset, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int\n     * @return void\n     */\n    public static function addFooStruct(FlatBufferBuilder $builder, $fooStruct)\n    {\n        $builder->addStructX(4, $fooStruct, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return int table offset\n     */\n    public static function endTableInFirstNS(FlatBufferBuilder $builder)\n    {\n        $o = $builder->endObject();\n        return $o;\n    }\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/TableInFirstNS.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: NamespaceA\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\n\nnp = import_numpy()\n\n\nclass TableInFirstNS(object):\n  __slots__ = ['_tab']\n\n  @classmethod\n  def GetRootAs(cls, buf, offset=0):\n    n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n    x = TableInFirstNS()\n    x.Init(buf, n + offset)\n    return x\n\n  @classmethod\n  def GetRootAsTableInFirstNS(cls, buf, offset=0):\n    \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n    return cls.GetRootAs(buf, offset)\n\n  # TableInFirstNS\n  def Init(self, buf, pos):\n    self._tab = flatbuffers.table.Table(buf, pos)\n\n  # TableInFirstNS\n  def FooTable(self):\n    o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n    if o != 0:\n      x = self._tab.Indirect(o + self._tab.Pos)\n      obj = TableInNestedNS()\n      obj.Init(self._tab.Bytes, x)\n      return obj\n    return None\n\n  # TableInFirstNS\n  def FooEnum(self):\n    o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n    if o != 0:\n      return self._tab.Get(\n          flatbuffers.number_types.Int8Flags, o + self._tab.Pos\n      )\n    return 0\n\n  # TableInFirstNS\n  def FooUnionType(self):\n    o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))\n    if o != 0:\n      return self._tab.Get(\n          flatbuffers.number_types.Uint8Flags, o + self._tab.Pos\n      )\n    return 0\n\n  # TableInFirstNS\n  def FooUnion(self):\n    o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10))\n    if o != 0:\n      from flatbuffers.table import Table\n\n      obj = Table(bytearray(), 0)\n      self._tab.Union(obj, o)\n      return obj\n    return None\n\n  # TableInFirstNS\n  def FooStruct(self):\n    o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))\n    if o != 0:\n      x = o + self._tab.Pos\n      obj = StructInNestedNS()\n      obj.Init(self._tab.Bytes, x)\n      return obj\n    return None\n\n\ndef TableInFirstNSStart(builder):\n  builder.StartObject(5)\n\n\ndef Start(builder):\n  return TableInFirstNSStart(builder)\n\n\ndef TableInFirstNSAddFooTable(builder, fooTable):\n  builder.PrependUOffsetTRelativeSlot(\n      0, flatbuffers.number_types.UOffsetTFlags.py_type(fooTable), 0\n  )\n\n\ndef AddFooTable(builder, fooTable):\n  return TableInFirstNSAddFooTable(builder, fooTable)\n\n\ndef TableInFirstNSAddFooEnum(builder, fooEnum):\n  builder.PrependInt8Slot(1, fooEnum, 0)\n\n\ndef AddFooEnum(builder, fooEnum):\n  return TableInFirstNSAddFooEnum(builder, fooEnum)\n\n\ndef TableInFirstNSAddFooUnionType(builder, fooUnionType):\n  builder.PrependUint8Slot(2, fooUnionType, 0)\n\n\ndef AddFooUnionType(builder, fooUnionType):\n  return TableInFirstNSAddFooUnionType(builder, fooUnionType)\n\n\ndef TableInFirstNSAddFooUnion(builder, fooUnion):\n  builder.PrependUOffsetTRelativeSlot(\n      3, flatbuffers.number_types.UOffsetTFlags.py_type(fooUnion), 0\n  )\n\n\ndef AddFooUnion(builder, fooUnion):\n  return TableInFirstNSAddFooUnion(builder, fooUnion)\n\n\ndef TableInFirstNSAddFooStruct(builder, fooStruct):\n  builder.PrependStructSlot(\n      4, flatbuffers.number_types.UOffsetTFlags.py_type(fooStruct), 0\n  )\n\n\ndef AddFooStruct(builder, fooStruct):\n  return TableInFirstNSAddFooStruct(builder, fooStruct)\n\n\ndef TableInFirstNSEnd(builder):\n  return builder.EndObject()\n\n\ndef End(builder):\n  return TableInFirstNSEnd(builder)\n\n\ntry:\n  from typing import Optional, Union\nexcept:\n  pass\n\n\nclass TableInFirstNST(object):\n\n  # TableInFirstNST\n  def __init__(self):\n    self.fooTable = None  # type: Optional[TableInNestedNST]\n    self.fooEnum = 0  # type: int\n    self.fooUnionType = 0  # type: int\n    self.fooUnion = None  # type: Union[None, TableInNestedNST]\n    self.fooStruct = None  # type: Optional[StructInNestedNST]\n\n  @classmethod\n  def InitFromBuf(cls, buf, pos):\n    tableInFirstNS = TableInFirstNS()\n    tableInFirstNS.Init(buf, pos)\n    return cls.InitFromObj(tableInFirstNS)\n\n  @classmethod\n  def InitFromObj(cls, tableInFirstNS):\n    x = TableInFirstNST()\n    x._UnPack(tableInFirstNS)\n    return x\n\n  # TableInFirstNST\n  def _UnPack(self, tableInFirstNS):\n    if tableInFirstNS is None:\n      return\n    if tableInFirstNS.FooTable() is not None:\n      self.fooTable = TableInNestedNST.InitFromObj(tableInFirstNS.FooTable())\n    self.fooEnum = tableInFirstNS.FooEnum()\n    self.fooUnionType = tableInFirstNS.FooUnionType()\n    self.fooUnion = UnionInNestedNSCreator(\n        self.fooUnionType, tableInFirstNS.FooUnion()\n    )\n    if tableInFirstNS.FooStruct() is not None:\n      self.fooStruct = StructInNestedNST.InitFromObj(tableInFirstNS.FooStruct())\n\n  # TableInFirstNST\n  def Pack(self, builder):\n    if self.fooTable is not None:\n      fooTable = self.fooTable.Pack(builder)\n    if self.fooUnion is not None:\n      fooUnion = self.fooUnion.Pack(builder)\n    TableInFirstNSStart(builder)\n    if self.fooTable is not None:\n      TableInFirstNSAddFooTable(builder, fooTable)\n    TableInFirstNSAddFooEnum(builder, self.fooEnum)\n    TableInFirstNSAddFooUnionType(builder, self.fooUnionType)\n    if self.fooUnion is not None:\n      TableInFirstNSAddFooUnion(builder, fooUnion)\n    if self.fooStruct is not None:\n      fooStruct = self.fooStruct.Pack(builder)\n      TableInFirstNSAddFooStruct(builder, fooStruct)\n    tableInFirstNS = TableInFirstNSEnd(builder)\n    return tableInFirstNS\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/TableInFirstNST.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage NamespaceA;\n\nimport com.google.flatbuffers.*;\nimport java.nio.*;\nimport java.util.*;\n\npublic class TableInFirstNST {\n  private NamespaceA.NamespaceB.TableInNestedNST fooTable;\n  private byte fooEnum;\n  private NamespaceA.NamespaceB.UnionInNestedNSUnion fooUnion;\n  private NamespaceA.NamespaceB.StructInNestedNST fooStruct;\n\n  public NamespaceA.NamespaceB.TableInNestedNST getFooTable() {\n    return fooTable;\n  }\n\n  public void setFooTable(NamespaceA.NamespaceB.TableInNestedNST fooTable) {\n    this.fooTable = fooTable;\n  }\n\n  public byte getFooEnum() {\n    return fooEnum;\n  }\n\n  public void setFooEnum(byte fooEnum) {\n    this.fooEnum = fooEnum;\n  }\n\n  public NamespaceA.NamespaceB.UnionInNestedNSUnion getFooUnion() {\n    return fooUnion;\n  }\n\n  public void setFooUnion(NamespaceA.NamespaceB.UnionInNestedNSUnion fooUnion) {\n    this.fooUnion = fooUnion;\n  }\n\n  public NamespaceA.NamespaceB.StructInNestedNST getFooStruct() {\n    return fooStruct;\n  }\n\n  public void setFooStruct(NamespaceA.NamespaceB.StructInNestedNST fooStruct) {\n    this.fooStruct = fooStruct;\n  }\n\n  public TableInFirstNST() {\n    this.fooTable = null;\n    this.fooEnum = 0;\n    this.fooUnion = null;\n    this.fooStruct = new NamespaceA.NamespaceB.StructInNestedNST();\n  }\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceA/__init__.py",
    "content": ""
  },
  {
    "path": "tests/namespace_test/NamespaceC/TableInC.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace NamespaceC\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct TableInC : IFlatbufferObject\n{\n  private Table __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_25_12_19(); }\n  public static TableInC GetRootAsTableInC(ByteBuffer _bb) { return GetRootAsTableInC(_bb, new TableInC()); }\n  public static TableInC GetRootAsTableInC(ByteBuffer _bb, TableInC obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }\n  public TableInC __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public NamespaceA.TableInFirstNS? ReferToA1 { get { int o = __p.__offset(4); return o != 0 ? (NamespaceA.TableInFirstNS?)(new NamespaceA.TableInFirstNS()).__assign(__p.__indirect(o + __p.bb_pos), __p.bb) : null; } }\n  public NamespaceA.SecondTableInA? ReferToA2 { get { int o = __p.__offset(6); return o != 0 ? (NamespaceA.SecondTableInA?)(new NamespaceA.SecondTableInA()).__assign(__p.__indirect(o + __p.bb_pos), __p.bb) : null; } }\n\n  public static Offset<NamespaceC.TableInC> CreateTableInC(FlatBufferBuilder builder,\n      Offset<NamespaceA.TableInFirstNS> refer_to_a1Offset = default(Offset<NamespaceA.TableInFirstNS>),\n      Offset<NamespaceA.SecondTableInA> refer_to_a2Offset = default(Offset<NamespaceA.SecondTableInA>)) {\n    builder.StartTable(2);\n    TableInC.AddReferToA2(builder, refer_to_a2Offset);\n    TableInC.AddReferToA1(builder, refer_to_a1Offset);\n    return TableInC.EndTableInC(builder);\n  }\n\n  public static void StartTableInC(FlatBufferBuilder builder) { builder.StartTable(2); }\n  public static void AddReferToA1(FlatBufferBuilder builder, Offset<NamespaceA.TableInFirstNS> referToA1Offset) { builder.AddOffset(0, referToA1Offset.Value, 0); }\n  public static void AddReferToA2(FlatBufferBuilder builder, Offset<NamespaceA.SecondTableInA> referToA2Offset) { builder.AddOffset(1, referToA2Offset.Value, 0); }\n  public static Offset<NamespaceC.TableInC> EndTableInC(FlatBufferBuilder builder) {\n    int o = builder.EndTable();\n    return new Offset<NamespaceC.TableInC>(o);\n  }\n  public TableInCT UnPack() {\n    var _o = new TableInCT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(TableInCT _o) {\n    _o.ReferToA1 = this.ReferToA1.HasValue ? this.ReferToA1.Value.UnPack() : null;\n    _o.ReferToA2 = this.ReferToA2.HasValue ? this.ReferToA2.Value.UnPack() : null;\n  }\n  public static Offset<NamespaceC.TableInC> Pack(FlatBufferBuilder builder, TableInCT _o) {\n    if (_o == null) return default(Offset<NamespaceC.TableInC>);\n    var _refer_to_a1 = _o.ReferToA1 == null ? default(Offset<NamespaceA.TableInFirstNS>) : NamespaceA.TableInFirstNS.Pack(builder, _o.ReferToA1);\n    var _refer_to_a2 = _o.ReferToA2 == null ? default(Offset<NamespaceA.SecondTableInA>) : NamespaceA.SecondTableInA.Pack(builder, _o.ReferToA2);\n    return CreateTableInC(\n      builder,\n      _refer_to_a1,\n      _refer_to_a2);\n  }\n}\n\npublic class TableInCT\n{\n  [Newtonsoft.Json.JsonProperty(\"refer_to_a1\")]\n  public NamespaceA.TableInFirstNST ReferToA1 { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"refer_to_a2\")]\n  public NamespaceA.SecondTableInAT ReferToA2 { get; set; }\n\n  public TableInCT() {\n    this.ReferToA1 = null;\n    this.ReferToA2 = null;\n  }\n}\n\n\nstatic public class TableInCVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos)\n  {\n    return verifier.VerifyTableStart(tablePos)\n      && verifier.VerifyTable(tablePos, 4 /*ReferToA1*/, NamespaceA.TableInFirstNSVerify.Verify, false)\n      && verifier.VerifyTable(tablePos, 6 /*ReferToA2*/, NamespaceA.SecondTableInAVerify.Verify, false)\n      && verifier.VerifyTableEnd(tablePos);\n  }\n}\n\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceC/TableInC.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage NamespaceC\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n\n\tNamespaceA \"NamespaceA\"\n)\n\ntype TableInCT struct {\n\tReferToA1 *NamespaceA.TableInFirstNST\n\tReferToA2 *NamespaceA.SecondTableInAT\n}\n\nfunc (t *TableInCT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\tif t == nil {\n\t\treturn 0\n\t}\n\treferToA1Offset := t.ReferToA1.Pack(builder)\n\treferToA2Offset := t.ReferToA2.Pack(builder)\n\tTableInCStart(builder)\n\tTableInCAddReferToA1(builder, referToA1Offset)\n\tTableInCAddReferToA2(builder, referToA2Offset)\n\treturn TableInCEnd(builder)\n}\n\nfunc (rcv *TableInC) UnPackTo(t *TableInCT) {\n\tt.ReferToA1 = rcv.ReferToA1(nil).UnPack()\n\tt.ReferToA2 = rcv.ReferToA2(nil).UnPack()\n}\n\nfunc (rcv *TableInC) UnPack() *TableInCT {\n\tif rcv == nil {\n\t\treturn nil\n\t}\n\tt := &TableInCT{}\n\trcv.UnPackTo(t)\n\treturn t\n}\n\ntype TableInC struct {\n\t_tab flatbuffers.Table\n}\n\nfunc GetRootAsTableInC(buf []byte, offset flatbuffers.UOffsetT) *TableInC {\n\tn := flatbuffers.GetUOffsetT(buf[offset:])\n\tx := &TableInC{}\n\tx.Init(buf, n+offset)\n\treturn x\n}\n\nfunc GetSizePrefixedRootAsTableInC(buf []byte, offset flatbuffers.UOffsetT) *TableInC {\n\tn := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])\n\tx := &TableInC{}\n\tx.Init(buf, n+offset+flatbuffers.SizeUint32)\n\treturn x\n}\n\nfunc (rcv *TableInC) Init(buf []byte, i flatbuffers.UOffsetT) {\n\trcv._tab.Bytes = buf\n\trcv._tab.Pos = i\n}\n\nfunc (rcv *TableInC) Table() flatbuffers.Table {\n\treturn rcv._tab\n}\n\nfunc (rcv *TableInC) ReferToA1(obj *NamespaceA.TableInFirstNS) *NamespaceA.TableInFirstNS {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(4))\n\tif o != 0 {\n\t\tx := rcv._tab.Indirect(o + rcv._tab.Pos)\n\t\tif obj == nil {\n\t\t\tobj = new(NamespaceA.TableInFirstNS)\n\t\t}\n\t\tobj.Init(rcv._tab.Bytes, x)\n\t\treturn obj\n\t}\n\treturn nil\n}\n\nfunc (rcv *TableInC) ReferToA2(obj *NamespaceA.SecondTableInA) *NamespaceA.SecondTableInA {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(6))\n\tif o != 0 {\n\t\tx := rcv._tab.Indirect(o + rcv._tab.Pos)\n\t\tif obj == nil {\n\t\t\tobj = new(NamespaceA.SecondTableInA)\n\t\t}\n\t\tobj.Init(rcv._tab.Bytes, x)\n\t\treturn obj\n\t}\n\treturn nil\n}\n\nfunc TableInCStart(builder *flatbuffers.Builder) {\n\tbuilder.StartObject(2)\n}\nfunc TableInCAddReferToA1(builder *flatbuffers.Builder, referToA1 flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(referToA1), 0)\n}\nfunc TableInCAddReferToA2(builder *flatbuffers.Builder, referToA2 flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(1, flatbuffers.UOffsetT(referToA2), 0)\n}\nfunc TableInCEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\treturn builder.EndObject()\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceC/TableInC.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage NamespaceC;\n\nimport com.google.flatbuffers.*;\nimport java.nio.*;\nimport java.util.*;\n\n@SuppressWarnings(\"unused\")\npublic final class TableInC extends Table {\n  public static void ValidateVersion() {\n    Constants.FLATBUFFERS_25_12_19();\n  }\n\n  public static TableInC getRootAsTableInC(ByteBuffer _bb) {\n    return getRootAsTableInC(_bb, new TableInC());\n  }\n\n  public static TableInC getRootAsTableInC(ByteBuffer _bb, TableInC obj) {\n    _bb.order(ByteOrder.LITTLE_ENDIAN);\n    return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb));\n  }\n\n  public void __init(int _i, ByteBuffer _bb) {\n    __reset(_i, _bb);\n  }\n\n  public TableInC __assign(int _i, ByteBuffer _bb) {\n    __init(_i, _bb);\n    return this;\n  }\n\n  public NamespaceA.TableInFirstNS referToA1() {\n    return referToA1(new NamespaceA.TableInFirstNS());\n  }\n\n  public NamespaceA.TableInFirstNS referToA1(NamespaceA.TableInFirstNS obj) {\n    int o = __offset(4);\n    return o != 0 ? obj.__assign(__indirect(o + bb_pos), bb) : null;\n  }\n\n  public NamespaceA.SecondTableInA referToA2() {\n    return referToA2(new NamespaceA.SecondTableInA());\n  }\n\n  public NamespaceA.SecondTableInA referToA2(NamespaceA.SecondTableInA obj) {\n    int o = __offset(6);\n    return o != 0 ? obj.__assign(__indirect(o + bb_pos), bb) : null;\n  }\n\n  public static int createTableInC(\n      FlatBufferBuilder builder, int referToA1Offset, int referToA2Offset) {\n    builder.startTable(2);\n    TableInC.addReferToA2(builder, referToA2Offset);\n    TableInC.addReferToA1(builder, referToA1Offset);\n    return TableInC.endTableInC(builder);\n  }\n\n  public static void startTableInC(FlatBufferBuilder builder) {\n    builder.startTable(2);\n  }\n\n  public static void addReferToA1(FlatBufferBuilder builder, int referToA1Offset) {\n    builder.addOffset(0, referToA1Offset, 0);\n  }\n\n  public static void addReferToA2(FlatBufferBuilder builder, int referToA2Offset) {\n    builder.addOffset(1, referToA2Offset, 0);\n  }\n\n  public static int endTableInC(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    return o;\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) {\n      __reset(_vector, _element_size, _bb);\n      return this;\n    }\n\n    public TableInC get(int j) {\n      return get(new TableInC(), j);\n    }\n\n    public TableInC get(TableInC obj, int j) {\n      return obj.__assign(__indirect(__element(j), bb), bb);\n    }\n  }\n\n  public TableInCT unpack() {\n    TableInCT _o = new TableInCT();\n    unpackTo(_o);\n    return _o;\n  }\n\n  public void unpackTo(TableInCT _o) {\n    if (referToA1() != null) _o.setReferToA1(referToA1().unpack());\n    else _o.setReferToA1(null);\n    if (referToA2() != null) _o.setReferToA2(referToA2().unpack());\n    else _o.setReferToA2(null);\n  }\n\n  public static int pack(FlatBufferBuilder builder, TableInCT _o) {\n    if (_o == null) return 0;\n    int _refer_to_a1 =\n        _o.getReferToA1() == null ? 0 : NamespaceA.TableInFirstNS.pack(builder, _o.getReferToA1());\n    int _refer_to_a2 =\n        _o.getReferToA2() == null ? 0 : NamespaceA.SecondTableInA.pack(builder, _o.getReferToA2());\n    return createTableInC(builder, _refer_to_a1, _refer_to_a2);\n  }\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceC/TableInC.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage NamespaceC\n\nimport com.google.flatbuffers.Constants\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.Table\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\n\n@Suppress(\"unused\")\n@ExperimentalUnsignedTypes\nclass TableInC : Table() {\n\n  fun __init(_i: Int, _bb: ByteBuffer) {\n    __reset(_i, _bb)\n  }\n\n  fun __assign(_i: Int, _bb: ByteBuffer): TableInC {\n    __init(_i, _bb)\n    return this\n  }\n\n  val referToA1: NamespaceA.TableInFirstNS?\n    get() = referToA1(NamespaceA.TableInFirstNS())\n\n  fun referToA1(obj: NamespaceA.TableInFirstNS): NamespaceA.TableInFirstNS? {\n    val o = __offset(4)\n    return if (o != 0) {\n      obj.__assign(__indirect(o + bb_pos), bb)\n    } else {\n      null\n    }\n  }\n\n  val referToA2: NamespaceA.SecondTableInA?\n    get() = referToA2(NamespaceA.SecondTableInA())\n\n  fun referToA2(obj: NamespaceA.SecondTableInA): NamespaceA.SecondTableInA? {\n    val o = __offset(6)\n    return if (o != 0) {\n      obj.__assign(__indirect(o + bb_pos), bb)\n    } else {\n      null\n    }\n  }\n\n  companion object {\n    fun validateVersion() = Constants.FLATBUFFERS_25_12_19()\n\n    fun getRootAsTableInC(_bb: ByteBuffer): TableInC = getRootAsTableInC(_bb, TableInC())\n\n    fun getRootAsTableInC(_bb: ByteBuffer, obj: TableInC): TableInC {\n      _bb.order(ByteOrder.LITTLE_ENDIAN)\n      return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb))\n    }\n\n    fun createTableInC(\n      builder: FlatBufferBuilder,\n      referToA1Offset: Int,\n      referToA2Offset: Int,\n    ): Int {\n      builder.startTable(2)\n      addReferToA2(builder, referToA2Offset)\n      addReferToA1(builder, referToA1Offset)\n      return endTableInC(builder)\n    }\n\n    fun startTableInC(builder: FlatBufferBuilder) = builder.startTable(2)\n\n    fun addReferToA1(builder: FlatBufferBuilder, referToA1: Int) =\n      builder.addOffset(0, referToA1, 0)\n\n    fun addReferToA2(builder: FlatBufferBuilder, referToA2: Int) =\n      builder.addOffset(1, referToA2, 0)\n\n    fun endTableInC(builder: FlatBufferBuilder): Int {\n      val o = builder.endTable()\n      return o\n    }\n  }\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceC/TableInC.lua",
    "content": "-- automatically generated by the FlatBuffers compiler, do not modify\n\n-- namespace: NamespaceC\n\nlocal flatbuffers = require('flatbuffers')\n\nlocal TableInC = {} -- the module\nlocal TableInC_mt = {} -- the class metatable\n\nfunction TableInC.New()\n    local o = {}\n    setmetatable(o, {__index = TableInC_mt})\n    return o\nend\nfunction TableInC.GetRootAsTableInC(buf, offset)\n    if type(buf) == \"string\" then\n        buf = flatbuffers.binaryArray.New(buf)\n    end\n    local n = flatbuffers.N.UOffsetT:Unpack(buf, offset)\n    local o = TableInC.New()\n    o:Init(buf, n + offset)\n    return o\nend\nfunction TableInC_mt:Init(buf, pos)\n    self.view = flatbuffers.view.New(buf, pos)\nend\nfunction TableInC_mt:ReferToA1()\n    local o = self.view:Offset(4)\n    if o ~= 0 then\n        local x = self.view:Indirect(o + self.view.pos)\n        local obj = require('NamespaceA.TableInFirstNS').New()\n        obj:Init(self.view.bytes, x)\n        return obj\n    end\nend\nfunction TableInC_mt:ReferToA2()\n    local o = self.view:Offset(6)\n    if o ~= 0 then\n        local x = self.view:Indirect(o + self.view.pos)\n        local obj = require('NamespaceA.SecondTableInA').New()\n        obj:Init(self.view.bytes, x)\n        return obj\n    end\nend\nfunction TableInC.Start(builder) builder:StartObject(2) end\nfunction TableInC.AddReferToA1(builder, referToA1) builder:PrependUOffsetTRelativeSlot(0, referToA1, 0) end\nfunction TableInC.AddReferToA2(builder, referToA2) builder:PrependUOffsetTRelativeSlot(1, referToA2, 0) end\nfunction TableInC.End(builder) return builder:EndObject() end\n\nreturn TableInC -- return the module"
  },
  {
    "path": "tests/namespace_test/NamespaceC/TableInC.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nnamespace NamespaceC;\n\nuse \\Google\\FlatBuffers\\Struct;\nuse \\Google\\FlatBuffers\\Table;\nuse \\Google\\FlatBuffers\\ByteBuffer;\nuse \\Google\\FlatBuffers\\FlatBufferBuilder;\n\nclass TableInC extends Table\n{\n    /**\n     * @param ByteBuffer $bb\n     * @return TableInC\n     */\n    public static function getRootAsTableInC(ByteBuffer $bb)\n    {\n        $obj = new TableInC();\n        return ($obj->init($bb->getInt($bb->getPosition()) + $bb->getPosition(), $bb));\n    }\n\n    /**\n     * @param int $_i offset\n     * @param ByteBuffer $_bb\n     * @return TableInC\n     **/\n    public function init($_i, ByteBuffer $_bb)\n    {\n        $this->bb_pos = $_i;\n        $this->bb = $_bb;\n        return $this;\n    }\n\n    public function getReferToA1()\n    {\n        $obj = new TableInFirstNS();\n        $o = $this->__offset(4);\n        return $o != 0 ? $obj->init($this->__indirect($o + $this->bb_pos), $this->bb) : 0;\n    }\n\n    public function getReferToA2()\n    {\n        $obj = new SecondTableInA();\n        $o = $this->__offset(6);\n        return $o != 0 ? $obj->init($this->__indirect($o + $this->bb_pos), $this->bb) : 0;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return void\n     */\n    public static function startTableInC(FlatBufferBuilder $builder)\n    {\n        $builder->StartObject(2);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return TableInC\n     */\n    public static function createTableInC(FlatBufferBuilder $builder, $refer_to_a1, $refer_to_a2)\n    {\n        $builder->startObject(2);\n        self::addReferToA1($builder, $refer_to_a1);\n        self::addReferToA2($builder, $refer_to_a2);\n        $o = $builder->endObject();\n        return $o;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int\n     * @return void\n     */\n    public static function addReferToA1(FlatBufferBuilder $builder, $referToA1)\n    {\n        $builder->addOffsetX(0, $referToA1, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int\n     * @return void\n     */\n    public static function addReferToA2(FlatBufferBuilder $builder, $referToA2)\n    {\n        $builder->addOffsetX(1, $referToA2, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return int table offset\n     */\n    public static function endTableInC(FlatBufferBuilder $builder)\n    {\n        $o = $builder->endObject();\n        return $o;\n    }\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceC/TableInC.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: NamespaceC\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\n\nnp = import_numpy()\n\n\nclass TableInC(object):\n  __slots__ = ['_tab']\n\n  @classmethod\n  def GetRootAs(cls, buf, offset=0):\n    n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n    x = TableInC()\n    x.Init(buf, n + offset)\n    return x\n\n  @classmethod\n  def GetRootAsTableInC(cls, buf, offset=0):\n    \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n    return cls.GetRootAs(buf, offset)\n\n  # TableInC\n  def Init(self, buf, pos):\n    self._tab = flatbuffers.table.Table(buf, pos)\n\n  # TableInC\n  def ReferToA1(self):\n    o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n    if o != 0:\n      x = self._tab.Indirect(o + self._tab.Pos)\n      obj = TableInFirstNS()\n      obj.Init(self._tab.Bytes, x)\n      return obj\n    return None\n\n  # TableInC\n  def ReferToA2(self):\n    o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n    if o != 0:\n      x = self._tab.Indirect(o + self._tab.Pos)\n      obj = SecondTableInA()\n      obj.Init(self._tab.Bytes, x)\n      return obj\n    return None\n\n\ndef TableInCStart(builder):\n  builder.StartObject(2)\n\n\ndef Start(builder):\n  return TableInCStart(builder)\n\n\ndef TableInCAddReferToA1(builder, referToA1):\n  builder.PrependUOffsetTRelativeSlot(\n      0, flatbuffers.number_types.UOffsetTFlags.py_type(referToA1), 0\n  )\n\n\ndef AddReferToA1(builder, referToA1):\n  return TableInCAddReferToA1(builder, referToA1)\n\n\ndef TableInCAddReferToA2(builder, referToA2):\n  builder.PrependUOffsetTRelativeSlot(\n      1, flatbuffers.number_types.UOffsetTFlags.py_type(referToA2), 0\n  )\n\n\ndef AddReferToA2(builder, referToA2):\n  return TableInCAddReferToA2(builder, referToA2)\n\n\ndef TableInCEnd(builder):\n  return builder.EndObject()\n\n\ndef End(builder):\n  return TableInCEnd(builder)\n\n\ntry:\n  from typing import Optional\nexcept:\n  pass\n\n\nclass TableInCT(object):\n\n  # TableInCT\n  def __init__(self):\n    self.referToA1 = None  # type: Optional[TableInFirstNST]\n    self.referToA2 = None  # type: Optional[SecondTableInAT]\n\n  @classmethod\n  def InitFromBuf(cls, buf, pos):\n    tableInC = TableInC()\n    tableInC.Init(buf, pos)\n    return cls.InitFromObj(tableInC)\n\n  @classmethod\n  def InitFromObj(cls, tableInC):\n    x = TableInCT()\n    x._UnPack(tableInC)\n    return x\n\n  # TableInCT\n  def _UnPack(self, tableInC):\n    if tableInC is None:\n      return\n    if tableInC.ReferToA1() is not None:\n      self.referToA1 = TableInFirstNST.InitFromObj(tableInC.ReferToA1())\n    if tableInC.ReferToA2() is not None:\n      self.referToA2 = SecondTableInAT.InitFromObj(tableInC.ReferToA2())\n\n  # TableInCT\n  def Pack(self, builder):\n    if self.referToA1 is not None:\n      referToA1 = self.referToA1.Pack(builder)\n    if self.referToA2 is not None:\n      referToA2 = self.referToA2.Pack(builder)\n    TableInCStart(builder)\n    if self.referToA1 is not None:\n      TableInCAddReferToA1(builder, referToA1)\n    if self.referToA2 is not None:\n      TableInCAddReferToA2(builder, referToA2)\n    tableInC = TableInCEnd(builder)\n    return tableInC\n"
  },
  {
    "path": "tests/namespace_test/NamespaceC/TableInCT.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage NamespaceC;\n\nimport com.google.flatbuffers.*;\nimport java.nio.*;\nimport java.util.*;\n\npublic class TableInCT {\n  private NamespaceA.TableInFirstNST referToA1;\n  private NamespaceA.SecondTableInAT referToA2;\n\n  public NamespaceA.TableInFirstNST getReferToA1() {\n    return referToA1;\n  }\n\n  public void setReferToA1(NamespaceA.TableInFirstNST referToA1) {\n    this.referToA1 = referToA1;\n  }\n\n  public NamespaceA.SecondTableInAT getReferToA2() {\n    return referToA2;\n  }\n\n  public void setReferToA2(NamespaceA.SecondTableInAT referToA2) {\n    this.referToA2 = referToA2;\n  }\n\n  public TableInCT() {\n    this.referToA1 = null;\n    this.referToA2 = null;\n  }\n}\n"
  },
  {
    "path": "tests/namespace_test/NamespaceC/__init__.py",
    "content": ""
  },
  {
    "path": "tests/namespace_test/mod.rs",
    "content": "// Automatically generated by the Flatbuffers compiler. Do not modify.\n// @generated\npub mod namespace_a {\n    use super::*;\n    pub mod namespace_b {\n        use super::*;\n        mod union_in_nested_ns_generated;\n        pub use self::union_in_nested_ns_generated::*;\n        mod enum_in_nested_ns_generated;\n        pub use self::enum_in_nested_ns_generated::*;\n        mod table_in_nested_ns_generated;\n        pub use self::table_in_nested_ns_generated::*;\n        mod struct_in_nested_ns_generated;\n        pub use self::struct_in_nested_ns_generated::*;\n    } // namespace_b\n    mod table_in_first_ns_generated;\n    pub use self::table_in_first_ns_generated::*;\n    mod second_table_in_a_generated;\n    pub use self::second_table_in_a_generated::*;\n} // namespace_a\npub mod namespace_c {\n    use super::*;\n    mod table_in_c_generated;\n    pub use self::table_in_c_generated::*;\n} // namespace_c\n"
  },
  {
    "path": "tests/namespace_test/namespace_a/namespace_b/enum_in_nested_ns_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MIN_ENUM_IN_NESTED_NS: i8 = 0;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MAX_ENUM_IN_NESTED_NS: i8 = 2;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n#[allow(non_camel_case_types)]\npub const ENUM_VALUES_ENUM_IN_NESTED_NS: [EnumInNestedNS; 3] = [\n    EnumInNestedNS::A,\n    EnumInNestedNS::B,\n    EnumInNestedNS::C,\n];\n\n#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n#[repr(transparent)]\npub struct EnumInNestedNS(pub i8);\n\n#[allow(non_upper_case_globals)]\nimpl EnumInNestedNS {\n    pub const A: Self = Self(0);\n    pub const B: Self = Self(1);\n    pub const C: Self = Self(2);\n\n    pub const ENUM_MIN: i8 = 0;\n    pub const ENUM_MAX: i8 = 2;\n    pub const ENUM_VALUES: &'static [Self] = &[\n        Self::A,\n        Self::B,\n        Self::C,\n    ];\n\n    /// Returns the variant's name or \"\" if unknown.\n    pub fn variant_name(self) -> Option<&'static str> {\n        match self {\n            Self::A => Some(\"A\"),\n            Self::B => Some(\"B\"),\n            Self::C => Some(\"C\"),\n            _ => None,\n        }\n    }\n}\n\nimpl ::core::fmt::Debug for EnumInNestedNS {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        if let Some(name) = self.variant_name() {\n            f.write_str(name)\n        } else {\n            f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n        }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for EnumInNestedNS {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<i8>(buf, loc) };\n        Self(b)\n    }\n}\n\nimpl ::flatbuffers::Push for EnumInNestedNS {\n    type Output = EnumInNestedNS;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<i8>(dst, self.0) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for EnumInNestedNS {\n    type Scalar = i8;\n\n    #[inline]\n    fn to_little_endian(self) -> i8 {\n        self.0.to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: i8) -> Self {\n        let b = i8::from_le(v);\n        Self(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for EnumInNestedNS {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        i8::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for EnumInNestedNS {}\n"
  },
  {
    "path": "tests/namespace_test/namespace_a/namespace_b/struct_in_nested_ns_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n// struct StructInNestedNS, aligned to 4\n#[repr(transparent)]\n#[derive(Clone, Copy, PartialEq)]\npub struct StructInNestedNS(pub [u8; 8]);\n\nimpl Default for StructInNestedNS {\n    fn default() -> Self {\n        Self([0; 8])\n    }\n}\n\nimpl ::core::fmt::Debug for StructInNestedNS {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        f.debug_struct(\"StructInNestedNS\")\n            .field(\"a\", &self.a())\n            .field(\"b\", &self.b())\n            .finish()\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for StructInNestedNS {}\n\nimpl<'a> ::flatbuffers::Follow<'a> for StructInNestedNS {\n    type Inner = &'a StructInNestedNS;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { <&'a StructInNestedNS>::follow(buf, loc) }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for &'a StructInNestedNS {\n    type Inner = &'a StructInNestedNS;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { ::flatbuffers::follow_cast_ref::<StructInNestedNS>(buf, loc) }\n    }\n}\n\nimpl<'b> ::flatbuffers::Push for StructInNestedNS {\n    type Output = StructInNestedNS;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        let src = unsafe { ::core::slice::from_raw_parts(self as *const StructInNestedNS as *const u8, <Self as ::flatbuffers::Push>::size()) };\n        dst.copy_from_slice(src);\n    }\n\n    #[inline]\n    fn alignment() -> ::flatbuffers::PushAlignment {\n        ::flatbuffers::PushAlignment::new(4)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for StructInNestedNS {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.in_buffer::<Self>(pos)\n    }\n}\n\nimpl<'a> StructInNestedNS {\n    #[allow(clippy::too_many_arguments)]\n    pub fn new(\n        a: i32,\n        b: i32,\n    ) -> Self {\n        let mut s = Self([0; 8]);\n        s.set_a(a);\n        s.set_b(b);\n        s\n    }\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"NamespaceA.NamespaceB.StructInNestedNS\"\n    }\n\n    pub fn a(&self) -> i32 {\n        let mut mem = ::core::mem::MaybeUninit::<<i32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[0..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<i32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_a(&mut self, x: i32) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[0..].as_mut_ptr(),\n                ::core::mem::size_of::<<i32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn b(&self) -> i32 {\n        let mut mem = ::core::mem::MaybeUninit::<<i32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[4..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<i32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_b(&mut self, x: i32) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[4..].as_mut_ptr(),\n                ::core::mem::size_of::<<i32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn unpack(&self) -> StructInNestedNST {\n        StructInNestedNST {\n            a: self.a(),\n            b: self.b(),\n        }\n    }\n}\n\n#[derive(Debug, Clone, PartialEq)]\npub struct StructInNestedNST {\n    pub a: i32,\n    pub b: i32,\n}\nimpl Default for StructInNestedNST {\n    fn default() -> Self {\n        Self {\n            a: 0,\n            b: 0,\n        }\n    }\n}\n\nimpl StructInNestedNST {\n    pub fn pack(&self) -> StructInNestedNS {\n        StructInNestedNS::new(\n            self.a,\n            self.b,\n        )\n    }\n}\n"
  },
  {
    "path": "tests/namespace_test/namespace_a/namespace_b/table_in_nested_ns_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum TableInNestedNSOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct TableInNestedNS<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for TableInNestedNS<'a> {\n    type Inner = TableInNestedNS<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> TableInNestedNS<'a> {\n    pub const VT_FOO: ::flatbuffers::VOffsetT = 4;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"NamespaceA.NamespaceB.TableInNestedNS\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        TableInNestedNS { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args TableInNestedNSArgs\n    ) -> ::flatbuffers::WIPOffset<TableInNestedNS<'bldr>> {\n        let mut builder = TableInNestedNSBuilder::new(_fbb);\n        builder.add_foo(args.foo);\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> TableInNestedNST {\n        let foo = self.foo();\n        TableInNestedNST {\n            foo,\n        }\n    }\n\n    #[inline]\n    pub fn foo(&self) -> i32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i32>(TableInNestedNS::VT_FOO, Some(0)).unwrap()}\n    }\n}\n\nimpl ::flatbuffers::Verifiable for TableInNestedNS<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<i32>(\"foo\", Self::VT_FOO, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct TableInNestedNSArgs {\n    pub foo: i32,\n}\n\nimpl<'a> Default for TableInNestedNSArgs {\n    #[inline]\n    fn default() -> Self {\n        TableInNestedNSArgs {\n            foo: 0,\n        }\n    }\n}\n\npub struct TableInNestedNSBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> TableInNestedNSBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_foo(&mut self, foo: i32) {\n        self.fbb_.push_slot::<i32>(TableInNestedNS::VT_FOO, foo, 0);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> TableInNestedNSBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        TableInNestedNSBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<TableInNestedNS<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for TableInNestedNS<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"TableInNestedNS\");\n        ds.field(\"foo\", &self.foo());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct TableInNestedNST {\n    pub foo: i32,\n}\n\nimpl Default for TableInNestedNST {\n    fn default() -> Self {\n        Self {\n            foo: 0,\n        }\n    }\n}\n\nimpl TableInNestedNST {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<TableInNestedNS<'b>> {\n        let foo = self.foo;\n        TableInNestedNS::create(_fbb, &TableInNestedNSArgs{\n            foo,\n        })\n    }\n}\n"
  },
  {
    "path": "tests/namespace_test/namespace_a/namespace_b/union_in_nested_ns_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MIN_UNION_IN_NESTED_NS: u8 = 0;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MAX_UNION_IN_NESTED_NS: u8 = 1;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n#[allow(non_camel_case_types)]\npub const ENUM_VALUES_UNION_IN_NESTED_NS: [UnionInNestedNS; 2] = [\n    UnionInNestedNS::NONE,\n    UnionInNestedNS::TableInNestedNS,\n];\n\n#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n#[repr(transparent)]\npub struct UnionInNestedNS(pub u8);\n\n#[allow(non_upper_case_globals)]\nimpl UnionInNestedNS {\n    pub const NONE: Self = Self(0);\n    pub const TableInNestedNS: Self = Self(1);\n\n    pub const ENUM_MIN: u8 = 0;\n    pub const ENUM_MAX: u8 = 1;\n    pub const ENUM_VALUES: &'static [Self] = &[\n        Self::NONE,\n        Self::TableInNestedNS,\n    ];\n\n    /// Returns the variant's name or \"\" if unknown.\n    pub fn variant_name(self) -> Option<&'static str> {\n        match self {\n            Self::NONE => Some(\"NONE\"),\n            Self::TableInNestedNS => Some(\"TableInNestedNS\"),\n            _ => None,\n        }\n    }\n}\n\nimpl ::core::fmt::Debug for UnionInNestedNS {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        if let Some(name) = self.variant_name() {\n            f.write_str(name)\n        } else {\n            f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n        }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for UnionInNestedNS {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<u8>(buf, loc) };\n        Self(b)\n    }\n}\n\nimpl ::flatbuffers::Push for UnionInNestedNS {\n    type Output = UnionInNestedNS;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<u8>(dst, self.0) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for UnionInNestedNS {\n    type Scalar = u8;\n\n    #[inline]\n    fn to_little_endian(self) -> u8 {\n        self.0.to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: u8) -> Self {\n        let b = u8::from_le(v);\n        Self(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for UnionInNestedNS {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        u8::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for UnionInNestedNS {}\n\npub struct UnionInNestedNSUnionTableOffset {}\n\n#[allow(clippy::upper_case_acronyms)]\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub enum UnionInNestedNST {\n    NONE,\n    TableInNestedNS(alloc::boxed::Box<TableInNestedNST>),\n}\n\nimpl Default for UnionInNestedNST {\n    fn default() -> Self {\n        Self::NONE\n    }\n}\n\nimpl UnionInNestedNST {\n    pub fn union_in_nested_ns_type(&self) -> UnionInNestedNS {\n        match self {\n            Self::NONE => UnionInNestedNS::NONE,\n            Self::TableInNestedNS(_) => UnionInNestedNS::TableInNestedNS,\n        }\n    }\n\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(&self, fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>) -> Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>> {\n        match self {\n            Self::NONE => None,\n            Self::TableInNestedNS(v) => Some(v.pack(fbb).as_union_value()),\n        }\n    }\n\n    /// If the union variant matches, return the owned TableInNestedNST, setting the union to NONE.\n    pub fn take_table_in_nested_ns(&mut self) -> Option<alloc::boxed::Box<TableInNestedNST>> {\n        if let Self::TableInNestedNS(_) = self {\n            let v = ::core::mem::replace(self, Self::NONE);\n            if let Self::TableInNestedNS(w) = v {\n                Some(w)\n            } else {\n                unreachable!()\n            }\n        } else {\n            None\n        }\n    }\n\n    /// If the union variant matches, return a reference to the TableInNestedNST.\n    pub fn as_table_in_nested_ns(&self) -> Option<&TableInNestedNST> {\n        if let Self::TableInNestedNS(v) = self { Some(v.as_ref()) } else { None }\n    }\n\n    /// If the union variant matches, return a mutable reference to the TableInNestedNST.\n    pub fn as_table_in_nested_ns_mut(&mut self) -> Option<&mut TableInNestedNST> {\n        if let Self::TableInNestedNS(v) = self { Some(v.as_mut()) } else { None }\n    }\n}\n\n"
  },
  {
    "path": "tests/namespace_test/namespace_a/second_table_in_a_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum SecondTableInAOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct SecondTableInA<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for SecondTableInA<'a> {\n    type Inner = SecondTableInA<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> SecondTableInA<'a> {\n    pub const VT_REFER_TO_C: ::flatbuffers::VOffsetT = 4;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"NamespaceA.SecondTableInA\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        SecondTableInA { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args SecondTableInAArgs<'args>\n    ) -> ::flatbuffers::WIPOffset<SecondTableInA<'bldr>> {\n        let mut builder = SecondTableInABuilder::new(_fbb);\n        if let Some(x) = args.refer_to_c { builder.add_refer_to_c(x); }\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> SecondTableInAT {\n        let refer_to_c = self.refer_to_c().map(|x| {\n            alloc::boxed::Box::new(x.unpack())\n        });\n        SecondTableInAT {\n            refer_to_c,\n        }\n    }\n\n    #[inline]\n    pub fn refer_to_c(&self) -> Option<super::namespace_c::TableInC<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<super::namespace_c::TableInC>>(SecondTableInA::VT_REFER_TO_C, None)}\n    }\n}\n\nimpl ::flatbuffers::Verifiable for SecondTableInA<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<super::namespace_c::TableInC>>(\"refer_to_c\", Self::VT_REFER_TO_C, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct SecondTableInAArgs<'a> {\n    pub refer_to_c: Option<::flatbuffers::WIPOffset<super::namespace_c::TableInC<'a>>>,\n}\n\nimpl<'a> Default for SecondTableInAArgs<'a> {\n    #[inline]\n    fn default() -> Self {\n        SecondTableInAArgs {\n            refer_to_c: None,\n        }\n    }\n}\n\npub struct SecondTableInABuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> SecondTableInABuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_refer_to_c(&mut self, refer_to_c: ::flatbuffers::WIPOffset<super::namespace_c::TableInC<'b >>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<super::namespace_c::TableInC>>(SecondTableInA::VT_REFER_TO_C, refer_to_c);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> SecondTableInABuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        SecondTableInABuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<SecondTableInA<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for SecondTableInA<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"SecondTableInA\");\n        ds.field(\"refer_to_c\", &self.refer_to_c());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct SecondTableInAT {\n    pub refer_to_c: Option<alloc::boxed::Box<super::namespace_c::TableInCT>>,\n}\n\nimpl Default for SecondTableInAT {\n    fn default() -> Self {\n        Self {\n            refer_to_c: None,\n        }\n    }\n}\n\nimpl SecondTableInAT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<SecondTableInA<'b>> {\n        let refer_to_c = self.refer_to_c.as_ref().map(|x|{\n            x.pack(_fbb)\n        });\n        SecondTableInA::create(_fbb, &SecondTableInAArgs{\n            refer_to_c,\n        })\n    }\n}\n"
  },
  {
    "path": "tests/namespace_test/namespace_a/table_in_first_ns_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum TableInFirstNSOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct TableInFirstNS<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for TableInFirstNS<'a> {\n    type Inner = TableInFirstNS<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> TableInFirstNS<'a> {\n    pub const VT_FOO_TABLE: ::flatbuffers::VOffsetT = 4;\n    pub const VT_FOO_ENUM: ::flatbuffers::VOffsetT = 6;\n    pub const VT_FOO_UNION_TYPE: ::flatbuffers::VOffsetT = 8;\n    pub const VT_FOO_UNION: ::flatbuffers::VOffsetT = 10;\n    pub const VT_FOO_STRUCT: ::flatbuffers::VOffsetT = 12;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"NamespaceA.TableInFirstNS\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        TableInFirstNS { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args TableInFirstNSArgs<'args>\n    ) -> ::flatbuffers::WIPOffset<TableInFirstNS<'bldr>> {\n        let mut builder = TableInFirstNSBuilder::new(_fbb);\n        if let Some(x) = args.foo_struct { builder.add_foo_struct(x); }\n        if let Some(x) = args.foo_union { builder.add_foo_union(x); }\n        if let Some(x) = args.foo_table { builder.add_foo_table(x); }\n        builder.add_foo_union_type(args.foo_union_type);\n        builder.add_foo_enum(args.foo_enum);\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> TableInFirstNST {\n        let foo_table = self.foo_table().map(|x| {\n            alloc::boxed::Box::new(x.unpack())\n        });\n        let foo_enum = self.foo_enum();\n        let foo_union = match self.foo_union_type() {\n            namespace_b::UnionInNestedNS::NONE => namespace_b::UnionInNestedNST::NONE,\n            namespace_b::UnionInNestedNS::TableInNestedNS => namespace_b::UnionInNestedNST::TableInNestedNS(alloc::boxed::Box::new(\n                self.foo_union_as_table_in_nested_ns()\n                    .expect(\"Invalid union table, expected `namespace_b::UnionInNestedNS::TableInNestedNS`.\")\n                    .unpack()\n            )),\n            _ => namespace_b::UnionInNestedNST::NONE,\n        };\n        let foo_struct = self.foo_struct().map(|x| {\n            x.unpack()\n        });\n        TableInFirstNST {\n            foo_table,\n            foo_enum,\n            foo_union,\n            foo_struct,\n        }\n    }\n\n    #[inline]\n    pub fn foo_table(&self) -> Option<namespace_b::TableInNestedNS<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<namespace_b::TableInNestedNS>>(TableInFirstNS::VT_FOO_TABLE, None)}\n    }\n\n    #[inline]\n    pub fn foo_enum(&self) -> namespace_b::EnumInNestedNS {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<namespace_b::EnumInNestedNS>(TableInFirstNS::VT_FOO_ENUM, Some(namespace_b::EnumInNestedNS::A)).unwrap()}\n    }\n\n    #[inline]\n    pub fn foo_union_type(&self) -> namespace_b::UnionInNestedNS {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<namespace_b::UnionInNestedNS>(TableInFirstNS::VT_FOO_UNION_TYPE, Some(namespace_b::UnionInNestedNS::NONE)).unwrap()}\n    }\n\n    #[inline]\n    pub fn foo_union(&self) -> Option<::flatbuffers::Table<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Table<'a>>>(TableInFirstNS::VT_FOO_UNION, None)}\n    }\n\n    #[inline]\n    pub fn foo_struct(&self) -> Option<&'a namespace_b::StructInNestedNS> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<namespace_b::StructInNestedNS>(TableInFirstNS::VT_FOO_STRUCT, None)}\n    }\n\n    #[inline]\n    #[allow(non_snake_case)]\n    pub fn foo_union_as_table_in_nested_ns(&self) -> Option<namespace_b::TableInNestedNS<'a>> {\n        if self.foo_union_type() == namespace_b::UnionInNestedNS::TableInNestedNS {\n            self.foo_union().map(|t| {\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid union in this slot\n                unsafe { namespace_b::TableInNestedNS::init_from_table(t) }\n            })\n        } else {\n            None\n        }\n    }\n}\n\nimpl ::flatbuffers::Verifiable for TableInFirstNS<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<namespace_b::TableInNestedNS>>(\"foo_table\", Self::VT_FOO_TABLE, false)?\n            .visit_field::<namespace_b::EnumInNestedNS>(\"foo_enum\", Self::VT_FOO_ENUM, false)?\n            .visit_union::<namespace_b::UnionInNestedNS, _>(\"foo_union_type\", Self::VT_FOO_UNION_TYPE, \"foo_union\", Self::VT_FOO_UNION, false, |key, v, pos| {\n                match key {\n                    namespace_b::UnionInNestedNS::TableInNestedNS => v.verify_union_variant::<::flatbuffers::ForwardsUOffset<namespace_b::TableInNestedNS>>(\"namespace_b::UnionInNestedNS::TableInNestedNS\", pos),\n                    _ => Ok(()),\n                }\n            })?\n            .visit_field::<namespace_b::StructInNestedNS>(\"foo_struct\", Self::VT_FOO_STRUCT, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct TableInFirstNSArgs<'a> {\n    pub foo_table: Option<::flatbuffers::WIPOffset<namespace_b::TableInNestedNS<'a>>>,\n    pub foo_enum: namespace_b::EnumInNestedNS,\n    pub foo_union_type: namespace_b::UnionInNestedNS,\n    pub foo_union: Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>>,\n    pub foo_struct: Option<&'a namespace_b::StructInNestedNS>,\n}\n\nimpl<'a> Default for TableInFirstNSArgs<'a> {\n    #[inline]\n    fn default() -> Self {\n        TableInFirstNSArgs {\n            foo_table: None,\n            foo_enum: namespace_b::EnumInNestedNS::A,\n            foo_union_type: namespace_b::UnionInNestedNS::NONE,\n            foo_union: None,\n            foo_struct: None,\n        }\n    }\n}\n\npub struct TableInFirstNSBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> TableInFirstNSBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_foo_table(&mut self, foo_table: ::flatbuffers::WIPOffset<namespace_b::TableInNestedNS<'b >>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<namespace_b::TableInNestedNS>>(TableInFirstNS::VT_FOO_TABLE, foo_table);\n    }\n\n    #[inline]\n    pub fn add_foo_enum(&mut self, foo_enum: namespace_b::EnumInNestedNS) {\n        self.fbb_.push_slot::<namespace_b::EnumInNestedNS>(TableInFirstNS::VT_FOO_ENUM, foo_enum, namespace_b::EnumInNestedNS::A);\n    }\n\n    #[inline]\n    pub fn add_foo_union_type(&mut self, foo_union_type: namespace_b::UnionInNestedNS) {\n        self.fbb_.push_slot::<namespace_b::UnionInNestedNS>(TableInFirstNS::VT_FOO_UNION_TYPE, foo_union_type, namespace_b::UnionInNestedNS::NONE);\n    }\n\n    #[inline]\n    pub fn add_foo_union(&mut self, foo_union: ::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(TableInFirstNS::VT_FOO_UNION, foo_union);\n    }\n\n    #[inline]\n    pub fn add_foo_struct(&mut self, foo_struct: &namespace_b::StructInNestedNS) {\n        self.fbb_.push_slot_always::<&namespace_b::StructInNestedNS>(TableInFirstNS::VT_FOO_STRUCT, foo_struct);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> TableInFirstNSBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        TableInFirstNSBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<TableInFirstNS<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for TableInFirstNS<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"TableInFirstNS\");\n        ds.field(\"foo_table\", &self.foo_table());\n        ds.field(\"foo_enum\", &self.foo_enum());\n        ds.field(\"foo_union_type\", &self.foo_union_type());\n        match self.foo_union_type() {\n            namespace_b::UnionInNestedNS::TableInNestedNS => {\n                if let Some(x) = self.foo_union_as_table_in_nested_ns() {\n                    ds.field(\"foo_union\", &x)\n                } else {\n                    ds.field(\"foo_union\", &\"InvalidFlatbuffer: Union discriminant does not match value.\")\n                }\n            },\n            _ => {\n                let x: Option<()> = None;\n                ds.field(\"foo_union\", &x)\n            },\n        };\n        ds.field(\"foo_struct\", &self.foo_struct());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct TableInFirstNST {\n    pub foo_table: Option<alloc::boxed::Box<namespace_b::TableInNestedNST>>,\n    pub foo_enum: namespace_b::EnumInNestedNS,\n    pub foo_union: namespace_b::UnionInNestedNST,\n    pub foo_struct: Option<namespace_b::StructInNestedNST>,\n}\n\nimpl Default for TableInFirstNST {\n    fn default() -> Self {\n        Self {\n            foo_table: None,\n            foo_enum: namespace_b::EnumInNestedNS::A,\n            foo_union: namespace_b::UnionInNestedNST::NONE,\n            foo_struct: None,\n        }\n    }\n}\n\nimpl TableInFirstNST {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<TableInFirstNS<'b>> {\n        let foo_table = self.foo_table.as_ref().map(|x|{\n            x.pack(_fbb)\n        });\n        let foo_enum = self.foo_enum;\n        let foo_union_type = self.foo_union.union_in_nested_ns_type();\n        let foo_union = self.foo_union.pack(_fbb);\n        let foo_struct_tmp = self.foo_struct.as_ref().map(|x| x.pack());\n        let foo_struct = foo_struct_tmp.as_ref();\n        TableInFirstNS::create(_fbb, &TableInFirstNSArgs{\n            foo_table,\n            foo_enum,\n            foo_union_type,\n            foo_union,\n            foo_struct,\n        })\n    }\n}\n"
  },
  {
    "path": "tests/namespace_test/namespace_c/table_in_c_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum TableInCOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct TableInC<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for TableInC<'a> {\n    type Inner = TableInC<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> TableInC<'a> {\n    pub const VT_REFER_TO_A1: ::flatbuffers::VOffsetT = 4;\n    pub const VT_REFER_TO_A2: ::flatbuffers::VOffsetT = 6;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"NamespaceC.TableInC\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        TableInC { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args TableInCArgs<'args>\n    ) -> ::flatbuffers::WIPOffset<TableInC<'bldr>> {\n        let mut builder = TableInCBuilder::new(_fbb);\n        if let Some(x) = args.refer_to_a2 { builder.add_refer_to_a2(x); }\n        if let Some(x) = args.refer_to_a1 { builder.add_refer_to_a1(x); }\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> TableInCT {\n        let refer_to_a1 = self.refer_to_a1().map(|x| {\n            alloc::boxed::Box::new(x.unpack())\n        });\n        let refer_to_a2 = self.refer_to_a2().map(|x| {\n            alloc::boxed::Box::new(x.unpack())\n        });\n        TableInCT {\n            refer_to_a1,\n            refer_to_a2,\n        }\n    }\n\n    #[inline]\n    pub fn refer_to_a1(&self) -> Option<super::namespace_a::TableInFirstNS<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<super::namespace_a::TableInFirstNS>>(TableInC::VT_REFER_TO_A1, None)}\n    }\n\n    #[inline]\n    pub fn refer_to_a2(&self) -> Option<super::namespace_a::SecondTableInA<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<super::namespace_a::SecondTableInA>>(TableInC::VT_REFER_TO_A2, None)}\n    }\n}\n\nimpl ::flatbuffers::Verifiable for TableInC<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<super::namespace_a::TableInFirstNS>>(\"refer_to_a1\", Self::VT_REFER_TO_A1, false)?\n            .visit_field::<::flatbuffers::ForwardsUOffset<super::namespace_a::SecondTableInA>>(\"refer_to_a2\", Self::VT_REFER_TO_A2, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct TableInCArgs<'a> {\n    pub refer_to_a1: Option<::flatbuffers::WIPOffset<super::namespace_a::TableInFirstNS<'a>>>,\n    pub refer_to_a2: Option<::flatbuffers::WIPOffset<super::namespace_a::SecondTableInA<'a>>>,\n}\n\nimpl<'a> Default for TableInCArgs<'a> {\n    #[inline]\n    fn default() -> Self {\n        TableInCArgs {\n            refer_to_a1: None,\n            refer_to_a2: None,\n        }\n    }\n}\n\npub struct TableInCBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> TableInCBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_refer_to_a1(&mut self, refer_to_a1: ::flatbuffers::WIPOffset<super::namespace_a::TableInFirstNS<'b >>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<super::namespace_a::TableInFirstNS>>(TableInC::VT_REFER_TO_A1, refer_to_a1);\n    }\n\n    #[inline]\n    pub fn add_refer_to_a2(&mut self, refer_to_a2: ::flatbuffers::WIPOffset<super::namespace_a::SecondTableInA<'b >>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<super::namespace_a::SecondTableInA>>(TableInC::VT_REFER_TO_A2, refer_to_a2);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> TableInCBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        TableInCBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<TableInC<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for TableInC<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"TableInC\");\n        ds.field(\"refer_to_a1\", &self.refer_to_a1());\n        ds.field(\"refer_to_a2\", &self.refer_to_a2());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct TableInCT {\n    pub refer_to_a1: Option<alloc::boxed::Box<super::namespace_a::TableInFirstNST>>,\n    pub refer_to_a2: Option<alloc::boxed::Box<super::namespace_a::SecondTableInAT>>,\n}\n\nimpl Default for TableInCT {\n    fn default() -> Self {\n        Self {\n            refer_to_a1: None,\n            refer_to_a2: None,\n        }\n    }\n}\n\nimpl TableInCT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<TableInC<'b>> {\n        let refer_to_a1 = self.refer_to_a1.as_ref().map(|x|{\n            x.pack(_fbb)\n        });\n        let refer_to_a2 = self.refer_to_a2.as_ref().map(|x|{\n            x.pack(_fbb)\n        });\n        TableInC::create(_fbb, &TableInCArgs{\n            refer_to_a1,\n            refer_to_a2,\n        })\n    }\n}\n"
  },
  {
    "path": "tests/namespace_test/namespace_test1.fbs",
    "content": "namespace NamespaceA.NamespaceB;\n\ntable TableInNestedNS\n{\n    foo:int;\n}\n\nunion UnionInNestedNS {\n    TableInNestedNS,\n}\n\nenum EnumInNestedNS:byte\n{\n\tA, B, C\n}\n\nstruct StructInNestedNS\n{\n    a:int;\n\tb:int;\n}"
  },
  {
    "path": "tests/namespace_test/namespace_test1_generated.lobster",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\nimport flatbuffers\n\nnamespace NamespaceA_NamespaceB\n\nenum UnionInNestedNS:\n    UnionInNestedNS_NONE = 0\n    UnionInNestedNS_TableInNestedNS = 1\n\nenum EnumInNestedNS:\n    EnumInNestedNS_A = 0\n    EnumInNestedNS_B = 1\n    EnumInNestedNS_C = 2\n\nclass TableInNestedNS\n\nclass StructInNestedNS\n\nclass TableInNestedNS : flatbuffers_handle\n    def foo():\n        return buf_.flatbuffers_field_int32(pos_, 4, 0)\n\ndef GetRootAsTableInNestedNS(buf:string): return TableInNestedNS { buf, buf.flatbuffers_indirect(0) }\n\nstruct TableInNestedNSBuilder:\n    b_:flatbuffers_builder\n    def start():\n        b_.StartObject(1)\n        return this\n    def add_foo(foo:int):\n        b_.PrependInt32Slot(0, foo, 0)\n        return this\n    def end():\n        return b_.EndObject()\n\nclass StructInNestedNS : flatbuffers_handle\n    def a():\n        return buf_.read_int32_le(pos_ + 0)\n    def b():\n        return buf_.read_int32_le(pos_ + 4)\n\ndef CreateStructInNestedNS(b_:flatbuffers_builder, a:int, b:int):\n    b_.Prep(4, 8)\n    b_.PrependInt32(b)\n    b_.PrependInt32(a)\n    return b_.Offset()\n\n"
  },
  {
    "path": "tests/namespace_test/namespace_test1_namespace_a.namespace_b_generated.dart",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable\n\nlibrary namespace_a.namespace_b;\n\nimport 'dart:typed_data' show Uint8List;\n\nimport 'package:flat_buffers/flat_buffers.dart' as fb;\n\nclass UnionInNestedNSTypeId {\n  final int value;\n  const UnionInNestedNSTypeId._(this.value);\n\n  factory UnionInNestedNSTypeId.fromValue(int value) {\n    final result = values[value];\n    if (result == null) {\n      throw StateError(\n        'Invalid value $value for bit flag enum UnionInNestedNSTypeId',\n      );\n    }\n    return result;\n  }\n\n  static UnionInNestedNSTypeId? _createOrNull(int? value) =>\n      value == null ? null : UnionInNestedNSTypeId.fromValue(value);\n\n  static const int minValue = 0;\n  static const int maxValue = 1;\n  static bool containsValue(int value) => values.containsKey(value);\n\n  static const UnionInNestedNSTypeId NONE = UnionInNestedNSTypeId._(0);\n  static const UnionInNestedNSTypeId TableInNestedNS = UnionInNestedNSTypeId._(\n    1,\n  );\n  static const Map<int, UnionInNestedNSTypeId> values = {\n    0: NONE,\n    1: TableInNestedNS,\n  };\n\n  static const fb.Reader<UnionInNestedNSTypeId> reader =\n      _UnionInNestedNSTypeIdReader();\n\n  @override\n  String toString() {\n    return 'UnionInNestedNSTypeId{value: $value}';\n  }\n}\n\nclass _UnionInNestedNSTypeIdReader extends fb.Reader<UnionInNestedNSTypeId> {\n  const _UnionInNestedNSTypeIdReader();\n\n  @override\n  int get size => 1;\n\n  @override\n  UnionInNestedNSTypeId read(fb.BufferContext bc, int offset) =>\n      UnionInNestedNSTypeId.fromValue(const fb.Uint8Reader().read(bc, offset));\n}\n\nclass EnumInNestedNS {\n  final int value;\n  const EnumInNestedNS._(this.value);\n\n  factory EnumInNestedNS.fromValue(int value) {\n    final result = values[value];\n    if (result == null) {\n      throw StateError('Invalid value $value for bit flag enum EnumInNestedNS');\n    }\n    return result;\n  }\n\n  static EnumInNestedNS? _createOrNull(int? value) =>\n      value == null ? null : EnumInNestedNS.fromValue(value);\n\n  static const int minValue = 0;\n  static const int maxValue = 2;\n  static bool containsValue(int value) => values.containsKey(value);\n\n  static const EnumInNestedNS A = EnumInNestedNS._(0);\n  static const EnumInNestedNS B = EnumInNestedNS._(1);\n  static const EnumInNestedNS C = EnumInNestedNS._(2);\n  static const Map<int, EnumInNestedNS> values = {0: A, 1: B, 2: C};\n\n  static const fb.Reader<EnumInNestedNS> reader = _EnumInNestedNSReader();\n\n  @override\n  String toString() {\n    return 'EnumInNestedNS{value: $value}';\n  }\n}\n\nclass _EnumInNestedNSReader extends fb.Reader<EnumInNestedNS> {\n  const _EnumInNestedNSReader();\n\n  @override\n  int get size => 1;\n\n  @override\n  EnumInNestedNS read(fb.BufferContext bc, int offset) =>\n      EnumInNestedNS.fromValue(const fb.Int8Reader().read(bc, offset));\n}\n\nclass TableInNestedNS {\n  TableInNestedNS._(this._bc, this._bcOffset);\n  factory TableInNestedNS(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<TableInNestedNS> reader = _TableInNestedNSReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  int get foo => const fb.Int32Reader().vTableGet(_bc, _bcOffset, 4, 0);\n\n  @override\n  String toString() {\n    return 'TableInNestedNS{foo: $foo}';\n  }\n\n  TableInNestedNST unpack() => TableInNestedNST(foo: foo);\n\n  static int pack(fb.Builder fbBuilder, TableInNestedNST? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass TableInNestedNST implements fb.Packable {\n  int foo;\n\n  TableInNestedNST({this.foo = 0});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    fbBuilder.startTable(1);\n    fbBuilder.addInt32(0, foo);\n    return fbBuilder.endTable();\n  }\n\n  @override\n  String toString() {\n    return 'TableInNestedNST{foo: $foo}';\n  }\n}\n\nclass _TableInNestedNSReader extends fb.TableReader<TableInNestedNS> {\n  const _TableInNestedNSReader();\n\n  @override\n  TableInNestedNS createObject(fb.BufferContext bc, int offset) =>\n      TableInNestedNS._(bc, offset);\n}\n\nclass TableInNestedNSBuilder {\n  TableInNestedNSBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  void begin() {\n    fbBuilder.startTable(1);\n  }\n\n  int addFoo(int? foo) {\n    fbBuilder.addInt32(0, foo);\n    return fbBuilder.offset;\n  }\n\n  int finish() {\n    return fbBuilder.endTable();\n  }\n}\n\nclass TableInNestedNSObjectBuilder extends fb.ObjectBuilder {\n  final int? _foo;\n\n  TableInNestedNSObjectBuilder({int? foo}) : _foo = foo;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    fbBuilder.startTable(1);\n    fbBuilder.addInt32(0, _foo);\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n\nclass StructInNestedNS {\n  StructInNestedNS._(this._bc, this._bcOffset);\n\n  static const fb.Reader<StructInNestedNS> reader = _StructInNestedNSReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  int get a => const fb.Int32Reader().read(_bc, _bcOffset + 0);\n  int get b => const fb.Int32Reader().read(_bc, _bcOffset + 4);\n\n  @override\n  String toString() {\n    return 'StructInNestedNS{a: $a, b: $b}';\n  }\n\n  StructInNestedNST unpack() => StructInNestedNST(a: a, b: b);\n\n  static int pack(fb.Builder fbBuilder, StructInNestedNST? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass StructInNestedNST implements fb.Packable {\n  int a;\n  int b;\n\n  StructInNestedNST({required this.a, required this.b});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    fbBuilder.putInt32(b);\n    fbBuilder.putInt32(a);\n    return fbBuilder.offset;\n  }\n\n  @override\n  String toString() {\n    return 'StructInNestedNST{a: $a, b: $b}';\n  }\n}\n\nclass _StructInNestedNSReader extends fb.StructReader<StructInNestedNS> {\n  const _StructInNestedNSReader();\n\n  @override\n  int get size => 8;\n\n  @override\n  StructInNestedNS createObject(fb.BufferContext bc, int offset) =>\n      StructInNestedNS._(bc, offset);\n}\n\nclass StructInNestedNSBuilder {\n  StructInNestedNSBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  int finish(int a, int b) {\n    fbBuilder.putInt32(b);\n    fbBuilder.putInt32(a);\n    return fbBuilder.offset;\n  }\n}\n\nclass StructInNestedNSObjectBuilder extends fb.ObjectBuilder {\n  final int _a;\n  final int _b;\n\n  StructInNestedNSObjectBuilder({required int a, required int b})\n    : _a = a,\n      _b = b;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    fbBuilder.putInt32(_b);\n    fbBuilder.putInt32(_a);\n    return fbBuilder.offset;\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n"
  },
  {
    "path": "tests/namespace_test/namespace_test2.fbs",
    "content": "include \"namespace_test1.fbs\";\n\nnamespace NamespaceA;\n\ntable TableInFirstNS\n{\n    foo_table:NamespaceB.TableInNestedNS;\n\tfoo_enum:NamespaceB.EnumInNestedNS;\n    foo_union:NamespaceB.UnionInNestedNS;\n\tfoo_struct:NamespaceB.StructInNestedNS;\n}\n\n// Test switching namespaces inside a file.\nnamespace NamespaceC;\n\ntable TableInC {\n    refer_to_a1:NamespaceA.TableInFirstNS;\n    refer_to_a2:NamespaceA.SecondTableInA;\n}\n\nnamespace NamespaceA;\n\ntable SecondTableInA {\n    refer_to_c:NamespaceC.TableInC;\n}\n"
  },
  {
    "path": "tests/namespace_test/namespace_test2_generated.lobster",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\nimport flatbuffers\n\nnamespace NamespaceA\n\nclass TableInFirstNS\n\nnamespace NamespaceC\n\nclass TableInC\n\nnamespace NamespaceA\n\nclass SecondTableInA\n\nclass TableInFirstNS : flatbuffers_handle\n    def foo_table():\n        let o = buf_.flatbuffers_field_table(pos_, 4)\n        return if o: NamespaceA_NamespaceB_TableInNestedNS { buf_, o } else: nil\n    def foo_enum():\n        return EnumInNestedNS(buf_.flatbuffers_field_int8(pos_, 6, 0))\n    def foo_union_type():\n        return UnionInNestedNS(buf_.flatbuffers_field_int8(pos_, 8, 0))\n    def foo_union_as_TableInNestedNS():\n        return NamespaceA_NamespaceB_TableInNestedNS { buf_, buf_.flatbuffers_field_table(pos_, 10) }\n    def foo_struct():\n        let o = buf_.flatbuffers_field_struct(pos_, 12)\n        return if o: NamespaceA_NamespaceB_StructInNestedNS { buf_, o } else: nil\n\ndef GetRootAsTableInFirstNS(buf:string): return TableInFirstNS { buf, buf.flatbuffers_indirect(0) }\n\nstruct TableInFirstNSBuilder:\n    b_:flatbuffers_builder\n    def start():\n        b_.StartObject(5)\n        return this\n    def add_foo_table(foo_table:flatbuffers_offset):\n        b_.PrependUOffsetTRelativeSlot(0, foo_table)\n        return this\n    def add_foo_enum(foo_enum:EnumInNestedNS):\n        b_.PrependInt8Slot(1, foo_enum, 0)\n        return this\n    def add_foo_union_type(foo_union_type:UnionInNestedNS):\n        b_.PrependUint8Slot(2, foo_union_type, 0)\n        return this\n    def add_foo_union(foo_union:flatbuffers_offset):\n        b_.PrependUOffsetTRelativeSlot(3, foo_union)\n        return this\n    def add_foo_struct(foo_struct:flatbuffers_offset):\n        b_.PrependStructSlot(4, foo_struct)\n        return this\n    def end():\n        return b_.EndObject()\n\nnamespace NamespaceC\n\nclass TableInC : flatbuffers_handle\n    def refer_to_a1():\n        let o = buf_.flatbuffers_field_table(pos_, 4)\n        return if o: NamespaceA_TableInFirstNS { buf_, o } else: nil\n    def refer_to_a2():\n        let o = buf_.flatbuffers_field_table(pos_, 6)\n        return if o: NamespaceA_SecondTableInA { buf_, o } else: nil\n\ndef GetRootAsTableInC(buf:string): return TableInC { buf, buf.flatbuffers_indirect(0) }\n\nstruct TableInCBuilder:\n    b_:flatbuffers_builder\n    def start():\n        b_.StartObject(2)\n        return this\n    def add_refer_to_a1(refer_to_a1:flatbuffers_offset):\n        b_.PrependUOffsetTRelativeSlot(0, refer_to_a1)\n        return this\n    def add_refer_to_a2(refer_to_a2:flatbuffers_offset):\n        b_.PrependUOffsetTRelativeSlot(1, refer_to_a2)\n        return this\n    def end():\n        return b_.EndObject()\n\nnamespace NamespaceA\n\nclass SecondTableInA : flatbuffers_handle\n    def refer_to_c():\n        let o = buf_.flatbuffers_field_table(pos_, 4)\n        return if o: NamespaceC_TableInC { buf_, o } else: nil\n\ndef GetRootAsSecondTableInA(buf:string): return SecondTableInA { buf, buf.flatbuffers_indirect(0) }\n\nstruct SecondTableInABuilder:\n    b_:flatbuffers_builder\n    def start():\n        b_.StartObject(1)\n        return this\n    def add_refer_to_c(refer_to_c:flatbuffers_offset):\n        b_.PrependUOffsetTRelativeSlot(0, refer_to_c)\n        return this\n    def end():\n        return b_.EndObject()\n\n"
  },
  {
    "path": "tests/namespace_test/namespace_test2_namespace_a_generated.dart",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable\n\nlibrary namespace_a;\n\nimport 'dart:typed_data' show Uint8List;\n\nimport 'package:flat_buffers/flat_buffers.dart' as fb;\n\nimport './namespace_test2_namespace_c_generated.dart' as namespace_c;\n\nclass TableInFirstNS {\n  TableInFirstNS._(this._bc, this._bcOffset);\n  factory TableInFirstNS(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<TableInFirstNS> reader = _TableInFirstNSReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  namespace_a_namespace_b.TableInNestedNS? get fooTable =>\n      namespace_a_namespace_b.TableInNestedNS.reader.vTableGetNullable(\n        _bc,\n        _bcOffset,\n        4,\n      );\n  EnumInNestedNS get fooEnum => EnumInNestedNS.fromValue(\n    const fb.Int8Reader().vTableGet(_bc, _bcOffset, 6, 0),\n  );\n  UnionInNestedNSTypeId? get fooUnionType =>\n      UnionInNestedNSTypeId._createOrNull(\n        const fb.Uint8Reader().vTableGetNullable(_bc, _bcOffset, 8),\n      );\n  dynamic get fooUnion {\n    switch (fooUnionType?.value) {\n      case 1:\n        return TableInNestedNS.reader.vTableGetNullable(_bc, _bcOffset, 10);\n      default:\n        return null;\n    }\n  }\n\n  namespace_a_namespace_b.StructInNestedNS? get fooStruct =>\n      namespace_a_namespace_b.StructInNestedNS.reader.vTableGetNullable(\n        _bc,\n        _bcOffset,\n        12,\n      );\n\n  @override\n  String toString() {\n    return 'TableInFirstNS{fooTable: $fooTable, fooEnum: $fooEnum, fooUnionType: $fooUnionType, fooUnion: $fooUnion, fooStruct: $fooStruct}';\n  }\n\n  TableInFirstNST unpack() => TableInFirstNST(\n    fooTable: fooTable?.unpack(),\n    fooEnum: fooEnum,\n    fooUnionType: fooUnionType,\n    fooUnion: fooUnion,\n    fooStruct: fooStruct?.unpack(),\n  );\n\n  static int pack(fb.Builder fbBuilder, TableInFirstNST? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass TableInFirstNST implements fb.Packable {\n  namespace_a_namespace_b.TableInNestedNST? fooTable;\n  EnumInNestedNS fooEnum;\n  UnionInNestedNSTypeId? fooUnionType;\n  dynamic fooUnion;\n  namespace_a_namespace_b.StructInNestedNST? fooStruct;\n\n  TableInFirstNST({\n    this.fooTable,\n    this.fooEnum = EnumInNestedNS.A,\n    this.fooUnionType,\n    this.fooUnion,\n    this.fooStruct,\n  });\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    final int? fooTableOffset = fooTable?.pack(fbBuilder);\n    final int? fooUnionOffset = fooUnion?.pack(fbBuilder);\n    fbBuilder.startTable(5);\n    fbBuilder.addOffset(0, fooTableOffset);\n    fbBuilder.addInt8(1, fooEnum.value);\n    fbBuilder.addUint8(2, fooUnionType?.value);\n    fbBuilder.addOffset(3, fooUnionOffset);\n    if (fooStruct != null) {\n      fbBuilder.addStruct(4, fooStruct!.pack(fbBuilder));\n    }\n    return fbBuilder.endTable();\n  }\n\n  @override\n  String toString() {\n    return 'TableInFirstNST{fooTable: $fooTable, fooEnum: $fooEnum, fooUnionType: $fooUnionType, fooUnion: $fooUnion, fooStruct: $fooStruct}';\n  }\n}\n\nclass _TableInFirstNSReader extends fb.TableReader<TableInFirstNS> {\n  const _TableInFirstNSReader();\n\n  @override\n  TableInFirstNS createObject(fb.BufferContext bc, int offset) =>\n      TableInFirstNS._(bc, offset);\n}\n\nclass TableInFirstNSBuilder {\n  TableInFirstNSBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  void begin() {\n    fbBuilder.startTable(5);\n  }\n\n  int addFooTableOffset(int? offset) {\n    fbBuilder.addOffset(0, offset);\n    return fbBuilder.offset;\n  }\n\n  int addFooEnum(EnumInNestedNS? fooEnum) {\n    fbBuilder.addInt8(1, fooEnum?.value);\n    return fbBuilder.offset;\n  }\n\n  int addFooUnionType(UnionInNestedNSTypeId? fooUnionType) {\n    fbBuilder.addUint8(2, fooUnionType?.value);\n    return fbBuilder.offset;\n  }\n\n  int addFooUnionOffset(int? offset) {\n    fbBuilder.addOffset(3, offset);\n    return fbBuilder.offset;\n  }\n\n  int addFooStruct(int offset) {\n    fbBuilder.addStruct(4, offset);\n    return fbBuilder.offset;\n  }\n\n  int finish() {\n    return fbBuilder.endTable();\n  }\n}\n\nclass TableInFirstNSObjectBuilder extends fb.ObjectBuilder {\n  final namespace_a_namespace_b.TableInNestedNSObjectBuilder? _fooTable;\n  final EnumInNestedNS? _fooEnum;\n  final UnionInNestedNSTypeId? _fooUnionType;\n  final dynamic _fooUnion;\n  final namespace_a_namespace_b.StructInNestedNSObjectBuilder? _fooStruct;\n\n  TableInFirstNSObjectBuilder({\n    namespace_a_namespace_b.TableInNestedNSObjectBuilder? fooTable,\n    EnumInNestedNS? fooEnum,\n    UnionInNestedNSTypeId? fooUnionType,\n    dynamic fooUnion,\n    namespace_a_namespace_b.StructInNestedNSObjectBuilder? fooStruct,\n  }) : _fooTable = fooTable,\n       _fooEnum = fooEnum,\n       _fooUnionType = fooUnionType,\n       _fooUnion = fooUnion,\n       _fooStruct = fooStruct;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    final int? fooTableOffset = _fooTable?.getOrCreateOffset(fbBuilder);\n    final int? fooUnionOffset = _fooUnion?.getOrCreateOffset(fbBuilder);\n    fbBuilder.startTable(5);\n    fbBuilder.addOffset(0, fooTableOffset);\n    fbBuilder.addInt8(1, _fooEnum?.value);\n    fbBuilder.addUint8(2, _fooUnionType?.value);\n    fbBuilder.addOffset(3, fooUnionOffset);\n    if (_fooStruct != null) {\n      fbBuilder.addStruct(4, _fooStruct!.finish(fbBuilder));\n    }\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n\nclass SecondTableInA {\n  SecondTableInA._(this._bc, this._bcOffset);\n  factory SecondTableInA(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<SecondTableInA> reader = _SecondTableInAReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  namespace_c.TableInC? get referToC =>\n      namespace_c.TableInC.reader.vTableGetNullable(_bc, _bcOffset, 4);\n\n  @override\n  String toString() {\n    return 'SecondTableInA{referToC: $referToC}';\n  }\n\n  SecondTableInAT unpack() => SecondTableInAT(referToC: referToC?.unpack());\n\n  static int pack(fb.Builder fbBuilder, SecondTableInAT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass SecondTableInAT implements fb.Packable {\n  namespace_c.TableInCT? referToC;\n\n  SecondTableInAT({this.referToC});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    final int? referToCOffset = referToC?.pack(fbBuilder);\n    fbBuilder.startTable(1);\n    fbBuilder.addOffset(0, referToCOffset);\n    return fbBuilder.endTable();\n  }\n\n  @override\n  String toString() {\n    return 'SecondTableInAT{referToC: $referToC}';\n  }\n}\n\nclass _SecondTableInAReader extends fb.TableReader<SecondTableInA> {\n  const _SecondTableInAReader();\n\n  @override\n  SecondTableInA createObject(fb.BufferContext bc, int offset) =>\n      SecondTableInA._(bc, offset);\n}\n\nclass SecondTableInABuilder {\n  SecondTableInABuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  void begin() {\n    fbBuilder.startTable(1);\n  }\n\n  int addReferToCOffset(int? offset) {\n    fbBuilder.addOffset(0, offset);\n    return fbBuilder.offset;\n  }\n\n  int finish() {\n    return fbBuilder.endTable();\n  }\n}\n\nclass SecondTableInAObjectBuilder extends fb.ObjectBuilder {\n  final namespace_c.TableInCObjectBuilder? _referToC;\n\n  SecondTableInAObjectBuilder({namespace_c.TableInCObjectBuilder? referToC})\n    : _referToC = referToC;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    final int? referToCOffset = _referToC?.getOrCreateOffset(fbBuilder);\n    fbBuilder.startTable(1);\n    fbBuilder.addOffset(0, referToCOffset);\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n"
  },
  {
    "path": "tests/namespace_test/namespace_test2_namespace_c_generated.dart",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable\n\nlibrary namespace_c;\n\nimport 'dart:typed_data' show Uint8List;\n\nimport 'package:flat_buffers/flat_buffers.dart' as fb;\n\nimport './namespace_test2_namespace_a_generated.dart' as namespace_a;\n\nclass TableInC {\n  TableInC._(this._bc, this._bcOffset);\n  factory TableInC(List<int> bytes) {\n    final rootRef = fb.BufferContext.fromBytes(bytes);\n    return reader.read(rootRef, 0);\n  }\n\n  static const fb.Reader<TableInC> reader = _TableInCReader();\n\n  final fb.BufferContext _bc;\n  final int _bcOffset;\n\n  namespace_a.TableInFirstNS? get referToA1 =>\n      namespace_a.TableInFirstNS.reader.vTableGetNullable(_bc, _bcOffset, 4);\n  namespace_a.SecondTableInA? get referToA2 =>\n      namespace_a.SecondTableInA.reader.vTableGetNullable(_bc, _bcOffset, 6);\n\n  @override\n  String toString() {\n    return 'TableInC{referToA1: $referToA1, referToA2: $referToA2}';\n  }\n\n  TableInCT unpack() =>\n      TableInCT(referToA1: referToA1?.unpack(), referToA2: referToA2?.unpack());\n\n  static int pack(fb.Builder fbBuilder, TableInCT? object) {\n    if (object == null) return 0;\n    return object.pack(fbBuilder);\n  }\n}\n\nclass TableInCT implements fb.Packable {\n  namespace_a.TableInFirstNST? referToA1;\n  namespace_a.SecondTableInAT? referToA2;\n\n  TableInCT({this.referToA1, this.referToA2});\n\n  @override\n  int pack(fb.Builder fbBuilder) {\n    final int? referToA1Offset = referToA1?.pack(fbBuilder);\n    final int? referToA2Offset = referToA2?.pack(fbBuilder);\n    fbBuilder.startTable(2);\n    fbBuilder.addOffset(0, referToA1Offset);\n    fbBuilder.addOffset(1, referToA2Offset);\n    return fbBuilder.endTable();\n  }\n\n  @override\n  String toString() {\n    return 'TableInCT{referToA1: $referToA1, referToA2: $referToA2}';\n  }\n}\n\nclass _TableInCReader extends fb.TableReader<TableInC> {\n  const _TableInCReader();\n\n  @override\n  TableInC createObject(fb.BufferContext bc, int offset) =>\n      TableInC._(bc, offset);\n}\n\nclass TableInCBuilder {\n  TableInCBuilder(this.fbBuilder);\n\n  final fb.Builder fbBuilder;\n\n  void begin() {\n    fbBuilder.startTable(2);\n  }\n\n  int addReferToA1Offset(int? offset) {\n    fbBuilder.addOffset(0, offset);\n    return fbBuilder.offset;\n  }\n\n  int addReferToA2Offset(int? offset) {\n    fbBuilder.addOffset(1, offset);\n    return fbBuilder.offset;\n  }\n\n  int finish() {\n    return fbBuilder.endTable();\n  }\n}\n\nclass TableInCObjectBuilder extends fb.ObjectBuilder {\n  final namespace_a.TableInFirstNSObjectBuilder? _referToA1;\n  final namespace_a.SecondTableInAObjectBuilder? _referToA2;\n\n  TableInCObjectBuilder({\n    namespace_a.TableInFirstNSObjectBuilder? referToA1,\n    namespace_a.SecondTableInAObjectBuilder? referToA2,\n  }) : _referToA1 = referToA1,\n       _referToA2 = referToA2;\n\n  /// Finish building, and store into the [fbBuilder].\n  @override\n  int finish(fb.Builder fbBuilder) {\n    final int? referToA1Offset = _referToA1?.getOrCreateOffset(fbBuilder);\n    final int? referToA2Offset = _referToA2?.getOrCreateOffset(fbBuilder);\n    fbBuilder.startTable(2);\n    fbBuilder.addOffset(0, referToA1Offset);\n    fbBuilder.addOffset(1, referToA2Offset);\n    return fbBuilder.endTable();\n  }\n\n  /// Convenience method to serialize to byte list.\n  @override\n  Uint8List toBytes([String? fileIdentifier]) {\n    final fbBuilder = fb.Builder(deduplicateTables: false);\n    fbBuilder.finish(finish(fbBuilder), fileIdentifier);\n    return fbBuilder.buffer;\n  }\n}\n"
  },
  {
    "path": "tests/nan_inf_test.fbs",
    "content": "namespace Swift.Tests;\n\ntable NanInfTable\n{\n  default_nan:double = nan;\n  default_inf:double = inf;\n  default_ninf:double = -inf;\n  value_nan:double;\n  value_inf:double;\n  value_ninf:double;\n  value:double;\n}\n\nroot_type NanInfTable;\n"
  },
  {
    "path": "tests/native_inline_table_test.fbs",
    "content": "table NativeInlineTable {\n  a: int;\n}\n\ntable TestNativeInlineTable {\n  t: [NativeInlineTable] (native_inline);\n}\n"
  },
  {
    "path": "tests/native_type_test.fbs",
    "content": "native_include \"native_type_test_impl.h\";\n\nnamespace Geometry;\n\nstruct Vector3D (native_type:\"Native::Vector3D\") {\n  x:float;\n  y:float;\n  z:float;\n}\n\nstruct Vector3DAlt (native_type:\"Native::Vector3D\", native_type_pack_name:\"Vector3DAlt\") {\n  a:float;\n  b:float;\n  c:float;\n}\n\ntable Matrix (native_type:\"Native::Matrix\") {\n  rows:int32;\n  columns:int32;\n  values:[float];\n}\n\ntable ApplicationData {\n  vectors:[Vector3D];\n  vectors_alt:[Vector3DAlt];\n  position:Vector3D;\n  position_inline:Vector3D (native_inline);\n  matrix:Matrix;\n  matrices:[Matrix];\n}\n\nroot_type ApplicationData;\n"
  },
  {
    "path": "tests/native_type_test_impl.cpp",
    "content": "#include \"native_type_test_impl.h\"\n\n#include \"native_type_test_generated.h\"\n\nnamespace flatbuffers {\nGeometry::Vector3D Pack(const Native::Vector3D& obj) {\n  return Geometry::Vector3D(obj.x, obj.y, obj.z);\n}\n\nconst Native::Vector3D UnPack(const Geometry::Vector3D& obj) {\n  return Native::Vector3D(obj.x(), obj.y(), obj.z());\n}\n\nGeometry::Vector3DAlt PackVector3DAlt(const Native::Vector3D& obj) {\n  return Geometry::Vector3DAlt(obj.x, obj.y, obj.z);\n}\n\nconst Native::Vector3D UnPackVector3DAlt(const Geometry::Vector3DAlt& obj) {\n  return Native::Vector3D(obj.a(), obj.b(), obj.c());\n}\n}  // namespace flatbuffers\n\nnamespace Geometry {\nvoid Matrix::UnPackTo(\n    Native::Matrix* _o,\n    const ::flatbuffers::resolver_function_t* _resolver) const {\n  (void)_resolver;\n\n  auto _rows = rows();\n  if (_rows) {\n    _o->rows = _rows;\n  }\n\n  auto _columns = columns();\n  if (_columns) {\n    _o->columns = _columns;\n  }\n\n  auto _values = values();\n  if (_values) {\n    _o->values.resize(_values->size());\n    for (::flatbuffers::uoffset_t i = 0; i < _values->size(); i++) {\n      _o->values[i] = _values->Get(i);\n    }\n  }\n}\n\n::flatbuffers::Offset<Matrix> Matrix::Pack(\n    ::flatbuffers::FlatBufferBuilder& _fbb, const Native::Matrix* _o,\n    const ::flatbuffers::rehasher_function_t* _rehasher) {\n  (void)_rehasher;\n\n  return CreateMatrix(_fbb, _o->rows, _o->columns,\n                      _fbb.CreateVector<float>(_o->values));\n}\n}  // namespace Geometry\n"
  },
  {
    "path": "tests/native_type_test_impl.h",
    "content": "#ifndef NATIVE_TYPE_TEST_IMPL_H\n#define NATIVE_TYPE_TEST_IMPL_H\n\n#include <vector>\n\nnamespace Native {\nstruct Vector3D {\n  float x;\n  float y;\n  float z;\n\n  Vector3D() {\n    x = 0;\n    y = 0;\n    z = 0;\n  }\n  Vector3D(float _x, float _y, float _z) {\n    this->x = _x;\n    this->y = _y;\n    this->z = _z;\n  }\n\n  bool operator==(const Vector3D& other) const {\n    return (x == other.x) && (y == other.y) && (z == other.z);\n  }\n};\n\nstruct Matrix {\n  int rows;\n  int columns;\n  std::vector<float> values;\n\n  Matrix() : Matrix(0, 0) {}\n\n  Matrix(int _rows, int _columns) {\n    this->rows = _rows;\n    this->columns = _columns;\n    values.resize(_rows * _columns);\n  }\n\n  bool operator==(const Matrix& other) const {\n    return (rows == other.rows) && (columns == other.columns) &&\n           (values == other.values);\n  }\n};\n}  // namespace Native\n\nnamespace Geometry {\nstruct Vector3D;\nstruct Vector3DAlt;\n}  // namespace Geometry\n\nnamespace flatbuffers {\nGeometry::Vector3D Pack(const Native::Vector3D& obj);\nconst Native::Vector3D UnPack(const Geometry::Vector3D& obj);\nGeometry::Vector3DAlt PackVector3DAlt(const Native::Vector3D& obj);\nconst Native::Vector3D UnPackVector3DAlt(const Geometry::Vector3DAlt& obj);\n}  // namespace flatbuffers\n\n#endif  // VECTOR3D_PACK_H\n"
  },
  {
    "path": "tests/nested_namespace_test/nested_namespace_test1.fbs",
    "content": "namespace NamespaceB;\n\nenum Color:byte { Red, Green, Blue }\n"
  },
  {
    "path": "tests/nested_namespace_test/nested_namespace_test1_generated.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace NamespaceB\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\n[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]\npublic enum Color : sbyte\n{\n  Red = 0,\n  Green = 1,\n  Blue = 2,\n};\n\n\n}\n"
  },
  {
    "path": "tests/nested_namespace_test/nested_namespace_test2.fbs",
    "content": "namespace NamespaceA.NamespaceB;\n\nenum Color:byte { Purple }\n"
  },
  {
    "path": "tests/nested_namespace_test/nested_namespace_test2_generated.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace NamespaceA.NamespaceB\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\n[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]\npublic enum Color : sbyte\n{\n  Purple = 0,\n};\n\n\n}\n"
  },
  {
    "path": "tests/nested_namespace_test/nested_namespace_test3.fbs",
    "content": "include \"nested_namespace_test1.fbs\";\n\nnamespace NamespaceA.NamespaceB;\n\ntable ColorTestTable {\n  color:NamespaceB.Color = Blue;\n}\n"
  },
  {
    "path": "tests/nested_namespace_test/nested_namespace_test3_generated.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace NamespaceA.NamespaceB\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct ColorTestTable : IFlatbufferObject\n{\n  private Table __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_25_12_19(); }\n  public static ColorTestTable GetRootAsColorTestTable(ByteBuffer _bb) { return GetRootAsColorTestTable(_bb, new ColorTestTable()); }\n  public static ColorTestTable GetRootAsColorTestTable(ByteBuffer _bb, ColorTestTable obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }\n  public ColorTestTable __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public global::NamespaceB.Color Color { get { int o = __p.__offset(4); return o != 0 ? (global::NamespaceB.Color)__p.bb.GetSbyte(o + __p.bb_pos) : global::NamespaceB.Color.Blue; } }\n  public bool MutateColor(global::NamespaceB.Color color) { int o = __p.__offset(4); if (o != 0) { __p.bb.PutSbyte(o + __p.bb_pos, (sbyte)color); return true; } else { return false; } }\n\n  public static Offset<global::NamespaceA.NamespaceB.ColorTestTable> CreateColorTestTable(FlatBufferBuilder builder,\n      global::NamespaceB.Color color = global::NamespaceB.Color.Blue) {\n    builder.StartTable(1);\n    ColorTestTable.AddColor(builder, color);\n    return ColorTestTable.EndColorTestTable(builder);\n  }\n\n  public static void StartColorTestTable(FlatBufferBuilder builder) { builder.StartTable(1); }\n  public static void AddColor(FlatBufferBuilder builder, global::NamespaceB.Color color) { builder.AddSbyte(0, (sbyte)color, 2); }\n  public static Offset<global::NamespaceA.NamespaceB.ColorTestTable> EndColorTestTable(FlatBufferBuilder builder) {\n    int o = builder.EndTable();\n    return new Offset<global::NamespaceA.NamespaceB.ColorTestTable>(o);\n  }\n  public ColorTestTableT UnPack() {\n    var _o = new ColorTestTableT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(ColorTestTableT _o) {\n    _o.Color = this.Color;\n  }\n  public static Offset<global::NamespaceA.NamespaceB.ColorTestTable> Pack(FlatBufferBuilder builder, ColorTestTableT _o) {\n    if (_o == null) return default(Offset<global::NamespaceA.NamespaceB.ColorTestTable>);\n    return CreateColorTestTable(\n      builder,\n      _o.Color);\n  }\n}\n\npublic class ColorTestTableT\n{\n  [Newtonsoft.Json.JsonProperty(\"color\")]\n  public global::NamespaceB.Color Color { get; set; }\n\n  public ColorTestTableT() {\n    this.Color = global::NamespaceB.Color.Blue;\n  }\n}\n\n\nstatic public class ColorTestTableVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos)\n  {\n    return verifier.VerifyTableStart(tablePos)\n      && verifier.VerifyField(tablePos, 4 /*Color*/, 1 /*global::NamespaceB.Color*/, 1, false)\n      && verifier.VerifyTableEnd(tablePos);\n  }\n}\n\n}\n"
  },
  {
    "path": "tests/nested_union_test.fbs",
    "content": "namespace MyGame.Example.NestedUnion;\n\n/// Composite components of Monster color.\nenum Color:ubyte (bit_flags) {\n  Red = 0, // color Red = (1u << 0)\n  /// \\brief color Green\n  /// Green is bit_flag with value (1u << 1)\n  Green,\n  /// \\brief color Blue (1u << 3)\n  Blue = 3,\n}\n\ntable TestSimpleTableWithEnum (csharp_partial, private) {\n  color: Color = Green;\n}\n\nstruct Test { a:short; b:byte; }\n\ntable Vec3 {\n  x:double;\n  y:double;\n  z:double;\n  test1:double;\n  test2:Color;\n  test3:Test;\n}\n\nunion Any { Vec3, TestSimpleTableWithEnum }\n\ntable NestedUnionTest {\n  name:string;\n  data:Any;\n  id:short;\n}\n\nroot_type NestedUnionTest;"
  },
  {
    "path": "tests/nim/testnim.py",
    "content": "import glob\nimport os\nfrom pathlib import Path\nimport shutil\nimport subprocess\n\ntest_nim_dir = Path(__file__).absolute().parent\ntest_dir = test_nim_dir.parent\n\n\ndef main():\n  try:\n    subprocess.check_call(\"testament --megatest:off all\".split())\n  finally:\n    shutil.rmtree(test_nim_dir / \"nimcache\")\n    shutil.rmtree(test_nim_dir / \"testresults\")\n    for f in glob.glob(str(test_nim_dir / \"tests\" / \"*\" / \"test\")):\n      os.remove(f)\n\n\nif __name__ == \"__main__\":\n  main()\n"
  },
  {
    "path": "tests/nim/tests/moredefaults/test.nim",
    "content": "discard \"\"\"\n  action:   \"run\"\n  exitcode: 0\n  timeout:  60.0\n\"\"\"\nimport std/unittest\nimport flatbuffers\nimport ../../../MoreDefaults\n\nsuite \"TestMoreDefaults\":\n\n  test \"testFlatbuffersObject\":\n    var fbb = newBuilder(0)\n    fbb.MoreDefaultsStart()\n    let root = fbb.MoreDefaultsEnd()\n    fbb.Finish(root)\n\n    var defaults: MoreDefaults\n    defaults.GetRootAs(fbb.FinishedBytes(), 0)\n    check(defaults.emptyString == \"\")\n    check(defaults.ints == [])\n    check(defaults.floats == [])\n    check(defaults.bools == [])\n    check(defaults.intsLength == 0)\n    check(defaults.floatsLength == 0)\n    check(defaults.abcsLength == 0)\n    check(defaults.boolsLength == 0)\n"
  },
  {
    "path": "tests/nim/tests/mutatingbool/test.nim",
    "content": "discard \"\"\"\n  action:   \"run\"\n  exitcode: 0\n  timeout:  60.0\n\"\"\"\nimport std/unittest\nimport std/options\nimport flatbuffers\nimport ../../../TestMutatingBool\nimport ../../../Property\n\nsuite \"TestMutatingBool\":\n\n  test \"MutatingBool\":\n    var builder = newBuilder(1024)\n    builder.TestMutatingBoolStart()\n    builder.TestMutatingBoolAddB(builder.PropertyCreate(false))\n    let root = builder.TestMutatingBoolEnd()\n    builder.Finish(root)\n\n    var test_mutating_bool: TestMutatingBool\n    GetRootAs(test_mutating_bool, builder.FinishedBytes(), 0)\n    check(test_mutating_bool.b.isSome)\n    var prop2 = test_mutating_bool.b.get()\n    check(prop2.property == false)\n    discard (prop2.property = false)\n    check(prop2.property == false)\n    discard (prop2.property = true)\n    check(prop2.property == true)\n\n  test \"EmptyBool\":\n    var builder = newBuilder(1024)\n    builder.TestMutatingBoolStart()\n    let root = builder.TestMutatingBoolEnd()\n    builder.Finish(root)\n\n    var test_mutating_bool: TestMutatingBool\n    GetRootAs(test_mutating_bool, builder.FinishedBytes(), 0)\n    check(test_mutating_bool.b.isNone)\n"
  },
  {
    "path": "tests/nim/tests/mygame/test.nim",
    "content": "discard \"\"\"\n  action:   \"run\"\n  exitcode: 0\n  timeout:  60.0\n\"\"\"\nimport std/unittest\nimport std/options\nimport flatbuffers\nimport ../../../MyGame/Example/Test\nimport ../../../MyGame/Example/Monster\nimport ../../../MyGame/Example/Vec3\nimport ../../../MyGame/Example/Color as ColorMod\nimport ../../../MyGame/Example/Any as AnyMod\n\nproc verifyMonster(monster: var Monster) =\n  check(monster.hp == 80)\n  check(monster.mana == 150)\n  check(monster.name == \"MyMonster\")\n  check(monster.pos.isSome)\n  let pos = monster.pos.get()\n  check(pos.x == 1)\n  check(pos.y == 2)\n  check(pos.z == 3)\n  check(pos.test1 == 3)\n  check(pos.test2 == Color.Green)\n  check(pos.test3.a == 5)\n  check(pos.test3.b == 6)\n  check(monster.testType == Any.Monster)\n  check(monster.test.isSome)\n  let monster2 = Monster(tab: monster.test.get())\n  check(monster2.name == \"Fred\")\n  check((monster.mana = 10) == false)\n  check(monster.mana == 150)\n  check(monster.inventoryLength == 5)\n  var sum: uint8 = 0\n  for item in monster.inventory:\n    sum += item\n  check(sum == 10)\n  check(monster.test4Length == 2)\n\n  let test0 = monster.test4(0)\n  let test1 = monster.test4(1)\n  var sum0 = test0.a + test0.b\n  var sum1 = test1.a + test1.b\n  check(sum0 + sum1 == 100)\n\n  check(monster.testarrayofstringLength == 2)\n  check(monster.testarrayofstring(0) == \"test1\")\n  check(monster.testarrayofstring(1) == \"test2\")\n  check(monster.testbool == true)\n\n\nsuite \"TestMyGame\":\n\n  test \"testData\":\n    let data: seq[byte] = @[byte(48), 0, 0, 0, 77, 79, 78, 83, 0, 0, 0, 0, 36,\n        0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28, 0, 0, 0, 27, 0, 20, 0,\n        16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0, 0,\n        0, 0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0,\n        0, 120, 0, 0, 0, 0, 0, 80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64,\n        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64, 2, 0, 5, 0, 6, 0, 0, 0, 2, 0, 0, 0,\n        64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10, 0, 20, 0, 152,\n        255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5,\n        0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0,\n        0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 49, 0, 0, 0, 9, 0, 0, 0, 77, 121,\n        77, 111, 110, 115, 116, 101, 114, 0, 0, 0, 3, 0, 0, 0, 20, 0, 0, 0, 36,\n        0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255, 255,\n        255, 36, 0, 0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28,\n        0, 0, 0, 5, 0, 0, 0, 87, 105, 108, 109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97,\n        114, 110, 101, 121, 0, 0, 5, 0, 0, 0, 70, 114, 111, 100, 111, 0, 0, 0]\n    var monster: Monster\n    GetRootAs(monster, data, 0)\n    verifyMonster(monster)\n\n  test \"testCreateString\":\n    var fbb = newBuilder(0)\n    let name = fbb.Create(\"Frodo\")\n    fbb.Finish(name)\n    check(fbb.FinishedBytes() == @[byte(4), 0, 0, 0, 5, 0, 0, 0, 70, 114, 111,\n        100, 111, 0, 0, 0])\n\n  test \"testCreateVector\":\n    var fbb = newBuilder(0)\n    let vec = fbb.Create(@[byte(0), 1, 2, 3, 4])\n    fbb.Finish(vec)\n    check(fbb.FinishedBytes() == @[byte(4), 0, 0, 0, 5, 0, 0, 0, 0, 1, 2, 3, 4,\n        0, 0, 0])\n\n  test \"createSimpleMonster\":\n    var fbb = newBuilder(0)\n    let names = [\n      fbb.Create(\"Frodo\"),\n      fbb.Create(\"Barney\"),\n      fbb.Create(\"Wilma\"),\n    ]\n    fbb.MonsterStart()\n    fbb.MonsterAddName(names[0])\n    let monster = fbb.MonsterEnd()\n    fbb.Finish(monster)\n    check(fbb.FinishedBytes() == @[byte(16), 0, 0, 0, 12, 0, 8, 0, 0, 0, 0, 0,\n        0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0, 0, 0, 87, 105, 108, 109, 97,\n        0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0, 0, 70,\n        114, 111, 100, 111, 0, 0, 0])\n\n  test \"testCreateTestVector\":\n    var fbb = newBuilder(0)\n    fbb.MonsterStartTest4Vector(2)\n    discard fbb.TestCreate(a = 30, b = 40)\n    discard fbb.TestCreate(a = 10, b = 20)\n    let test4 = fbb.EndVector()\n    fbb.Finish(test4)\n    check(fbb.FinishedBytes() == @[byte(4), 0, 0, 0, 2, 0, 0, 0, 10, 0, 20, 0,\n        30, 0, 40, 0])\n\n  test \"testTableWithStruct\":\n    var fbb = newBuilder(0)\n    fbb.MonsterStart()\n    fbb.MonsterAddPos(fbb.Vec3Create(x = 1,\n        y = 2,\n        z = 3,\n        test1 = 3,\n        test2 = Color.Green,\n        test3_a = 5, test3_b = 6))\n\n    let monster_end = fbb.MonsterEnd()\n    fbb.Finish(monster_end)\n    check(fbb.FinishedBytes() == @[byte(12), 0, 0, 0, 0, 0, 6, 0, 36, 0, 4, 0,\n        6, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0,\n        0, 0, 0, 0, 8, 64, 2, 0, 5, 0, 6, 0, 0, 0])\n\n  test \"testCreateMonster\":\n    var fbb = newBuilder(0)\n    let names = [\n      fbb.Create(\"Frodo\"),\n      fbb.Create(\"Barney\"),\n      fbb.Create(\"Wilma\"),\n    ]\n\n    var offsets: seq[uoffset] = @[]\n    fbb.MonsterStart()\n    fbb.MonsterAddName(names[0])\n    offsets.add(fbb.MonsterEnd())\n    fbb.MonsterStart()\n    fbb.MonsterAddName(names[1])\n    offsets.add(fbb.MonsterEnd())\n    fbb.MonsterStart()\n    fbb.MonsterAddName(names[2])\n    offsets.add(fbb.MonsterEnd())\n\n    let str = fbb.Create(\"MyMonster\")\n    let test1 = fbb.Create(\"test1\")\n    let test2 = fbb.Create(\"test2\")\n    let inv = fbb.Create(@[byte(0), 1, 2, 3, 4])\n    let fred = fbb.Create(\"Fred\")\n    fbb.MonsterStart()\n    fbb.MonsterAddName(fred)\n    let mon2 = fbb.MonsterEnd()\n\n    fbb.MonsterStartTest4Vector(2)\n    discard fbb.TestCreate(a = 30, b = 40)\n    discard fbb.TestCreate(a = 10, b = 20)\n    let test4 = fbb.EndVector()\n\n    fbb.MonsterStartTestarrayofstringVector(2)\n    fbb.PrependOffsetRelative(test1)\n    fbb.PrependOffsetRelative(test2)\n    let stringTestVector = fbb.EndVector()\n\n    fbb.MonsterStartTestarrayoftablesVector(3)\n    fbb.PrependOffsetRelative(offsets[0])\n    fbb.PrependOffsetRelative(offsets[1])\n    fbb.PrependOffsetRelative(offsets[2])\n    let tableTestVector = fbb.EndVector()\n\n    fbb.MonsterStart()\n    fbb.MonsterAddPos(fbb.Vec3Create(x = 1,\n        y = 2,\n        z = 3,\n        test1 = 3,\n        test2 = Color.Green,\n        test3_a = 5, test3_b = 6))\n    fbb.MonsterAddHp(80)\n    fbb.MonsterAddName(str)\n    fbb.MonsterAddInventory(inv)\n    fbb.MonsterAddTestType(Any.Monster.uint8)\n    fbb.MonsterAddTest(mon2)\n    fbb.MonsterAddTest4(test4)\n    fbb.MonsterAddTestarrayofstring(stringTestVector)\n    fbb.MonsterAddTestbool(true)\n    fbb.MonsterAddTestarrayoftables(tableTestVector)\n    let monster_end = fbb.MonsterEnd()\n    fbb.Finish(monster_end)\n    check(fbb.FinishedBytes() == @[byte(40), 0, 0, 0, 36, 0, 72, 0, 40, 0, 0, 0,\n        38, 0, 32, 0, 0, 0, 28, 0, 0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0,\n        0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 1, 76, 0, 0, 0,\n        84, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 1, 104, 0, 0, 0, 136, 0, 0, 0, 0, 0,\n        80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0,\n        0, 0, 8, 64, 2, 0, 5, 0, 6, 0, 0, 0, 3, 0, 0, 0, 108, 0, 0, 0, 112, 0,\n        0, 0, 128, 0, 0, 0, 2, 0, 0, 0, 52, 0, 0, 0, 60, 0, 0, 0, 2, 0, 0, 0,\n        10, 0, 20, 0, 30, 0, 40, 0, 168, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0,\n        70, 114, 101, 100, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 5, 0,\n        0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116,\n        49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0,\n        0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255, 255, 255, 36, 0, 0, 0,\n        12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0, 0,\n        0, 87, 105, 108, 109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101,\n        121, 0, 0, 5, 0, 0, 0, 70, 114, 111, 100, 111, 0, 0, 0])\n"
  },
  {
    "path": "tests/nim/tests/optional_scalars/test.nim",
    "content": "discard \"\"\"\n  action:   \"run\"\n  exitcode: 0\n  timeout:  60.0\n\"\"\"\nimport std/unittest\nimport std/options\nimport flatbuffers\nimport ../../../optional_scalars/ScalarStuff\n\n\nsuite \"TestOptionalScalars\":\n\n  test \"OptionalScalars\":\n    var builder = newBuilder(1024)\n    builder.ScalarStuffStart()\n    let root = builder.ScalarStuffEnd()\n    builder.Finish(root)\n\n    var optionals: ScalarStuff\n    optionals.GetRootAs(builder.FinishedBytes(), 0)\n\n    # Creates a flatbuffer with optional values.\n    check(optionals.justI8 == 0)\n    check(optionals.maybeF32.isNone)\n    check(optionals.defaultBool == true)\n    check(optionals.justU16 == 0)\n    check(optionals.maybeEnum.isNone)\n    check(optionals.defaultU64 == 42)\n"
  },
  {
    "path": "tests/non_zero_enum.fbs",
    "content": "enum NonZero: ubyte {\n    VAL = 1,\n}\n\n// this now is not allowed because arrays of enums must have a zero value\n// struct NonZeroArrayStruct {\n//     data: [NonZero:4];\n// }\n\ntable NonZeroVectorTable {\n    values: [NonZero];\n    value: NonZero = VAL;\n}\n"
  },
  {
    "path": "tests/optional_scalars/OptionalByte.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace optional_scalars\n{\n\npublic enum OptionalByte : sbyte\n{\n  None = 0,\n  One = 1,\n  Two = 2,\n};\n\n\n}\n"
  },
  {
    "path": "tests/optional_scalars/OptionalByte.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage optional_scalars\n\nimport \"strconv\"\n\ntype OptionalByte int8\n\nconst (\n\tOptionalByteNone OptionalByte = 0\n\tOptionalByteOne  OptionalByte = 1\n\tOptionalByteTwo  OptionalByte = 2\n)\n\nvar EnumNamesOptionalByte = map[OptionalByte]string{\n\tOptionalByteNone: \"None\",\n\tOptionalByteOne:  \"One\",\n\tOptionalByteTwo:  \"Two\",\n}\n\nvar EnumValuesOptionalByte = map[string]OptionalByte{\n\t\"None\": OptionalByteNone,\n\t\"One\":  OptionalByteOne,\n\t\"Two\":  OptionalByteTwo,\n}\n\nfunc (v OptionalByte) String() string {\n\tif s, ok := EnumNamesOptionalByte[v]; ok {\n\t\treturn s\n\t}\n\treturn \"OptionalByte(\" + strconv.FormatInt(int64(v), 10) + \")\"\n}\n"
  },
  {
    "path": "tests/optional_scalars/OptionalByte.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage optional_scalars;\n\n@SuppressWarnings(\"unused\")\npublic final class OptionalByte {\n  private OptionalByte() { }\n  public static final byte None = 0;\n  public static final byte One = 1;\n  public static final byte Two = 2;\n\n  public static final String[] names = { \"None\", \"One\", \"Two\", };\n\n  public static String name(int e) { return names[e]; }\n}\n\n"
  },
  {
    "path": "tests/optional_scalars/OptionalByte.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage optional_scalars\n\n@Suppress(\"unused\")\nclass OptionalByte private constructor() {\n    companion object {\n        const val None: Byte = 0\n        const val One: Byte = 1\n        const val Two: Byte = 2\n    }\n}\n"
  },
  {
    "path": "tests/optional_scalars/OptionalByte.nim",
    "content": "#[ optional_scalars.OptionalByte\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : \n  Rooting type : optional_scalars.ScalarStuff ()\n]#\n\ntype OptionalByte*{.pure.} = enum\n  None = 0.int8,\n  One = 1.int8,\n  Two = 2.int8,\n"
  },
  {
    "path": "tests/optional_scalars/OptionalByte.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: optional_scalars\n\nclass OptionalByte(object):\n    None_ = 0\n    One = 1\n    Two = 2\n"
  },
  {
    "path": "tests/optional_scalars/ScalarStuff.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace optional_scalars\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct ScalarStuff : IFlatbufferObject\n{\n  private Table __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_25_12_19(); }\n  public static ScalarStuff GetRootAsScalarStuff(ByteBuffer _bb) { return GetRootAsScalarStuff(_bb, new ScalarStuff()); }\n  public static ScalarStuff GetRootAsScalarStuff(ByteBuffer _bb, ScalarStuff obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }\n  public static bool ScalarStuffBufferHasIdentifier(ByteBuffer _bb) { return Table.__has_identifier(_bb, \"NULL\"); }\n  public static bool VerifyScalarStuff(ByteBuffer _bb) {Google.FlatBuffers.Verifier verifier = new Google.FlatBuffers.Verifier(_bb); return verifier.VerifyBuffer(\"NULL\", false, ScalarStuffVerify.Verify); }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }\n  public ScalarStuff __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public sbyte JustI8 { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetSbyte(o + __p.bb_pos) : (sbyte)0; } }\n  public sbyte? MaybeI8 { get { int o = __p.__offset(6); return o != 0 ? __p.bb.GetSbyte(o + __p.bb_pos) : (sbyte?)null; } }\n  public sbyte DefaultI8 { get { int o = __p.__offset(8); return o != 0 ? __p.bb.GetSbyte(o + __p.bb_pos) : (sbyte)42; } }\n  public byte JustU8 { get { int o = __p.__offset(10); return o != 0 ? __p.bb.Get(o + __p.bb_pos) : (byte)0; } }\n  public byte? MaybeU8 { get { int o = __p.__offset(12); return o != 0 ? __p.bb.Get(o + __p.bb_pos) : (byte?)null; } }\n  public byte DefaultU8 { get { int o = __p.__offset(14); return o != 0 ? __p.bb.Get(o + __p.bb_pos) : (byte)42; } }\n  public short JustI16 { get { int o = __p.__offset(16); return o != 0 ? __p.bb.GetShort(o + __p.bb_pos) : (short)0; } }\n  public short? MaybeI16 { get { int o = __p.__offset(18); return o != 0 ? __p.bb.GetShort(o + __p.bb_pos) : (short?)null; } }\n  public short DefaultI16 { get { int o = __p.__offset(20); return o != 0 ? __p.bb.GetShort(o + __p.bb_pos) : (short)42; } }\n  public ushort JustU16 { get { int o = __p.__offset(22); return o != 0 ? __p.bb.GetUshort(o + __p.bb_pos) : (ushort)0; } }\n  public ushort? MaybeU16 { get { int o = __p.__offset(24); return o != 0 ? __p.bb.GetUshort(o + __p.bb_pos) : (ushort?)null; } }\n  public ushort DefaultU16 { get { int o = __p.__offset(26); return o != 0 ? __p.bb.GetUshort(o + __p.bb_pos) : (ushort)42; } }\n  public int JustI32 { get { int o = __p.__offset(28); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } }\n  public int? MaybeI32 { get { int o = __p.__offset(30); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int?)null; } }\n  public int DefaultI32 { get { int o = __p.__offset(32); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)42; } }\n  public uint JustU32 { get { int o = __p.__offset(34); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }\n  public uint? MaybeU32 { get { int o = __p.__offset(36); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint?)null; } }\n  public uint DefaultU32 { get { int o = __p.__offset(38); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)42; } }\n  public long JustI64 { get { int o = __p.__offset(40); return o != 0 ? __p.bb.GetLong(o + __p.bb_pos) : (long)0; } }\n  public long? MaybeI64 { get { int o = __p.__offset(42); return o != 0 ? __p.bb.GetLong(o + __p.bb_pos) : (long?)null; } }\n  public long DefaultI64 { get { int o = __p.__offset(44); return o != 0 ? __p.bb.GetLong(o + __p.bb_pos) : (long)42; } }\n  public ulong JustU64 { get { int o = __p.__offset(46); return o != 0 ? __p.bb.GetUlong(o + __p.bb_pos) : (ulong)0; } }\n  public ulong? MaybeU64 { get { int o = __p.__offset(48); return o != 0 ? __p.bb.GetUlong(o + __p.bb_pos) : (ulong?)null; } }\n  public ulong DefaultU64 { get { int o = __p.__offset(50); return o != 0 ? __p.bb.GetUlong(o + __p.bb_pos) : (ulong)42; } }\n  public float JustF32 { get { int o = __p.__offset(52); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)0.0f; } }\n  public float? MaybeF32 { get { int o = __p.__offset(54); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float?)null; } }\n  public float DefaultF32 { get { int o = __p.__offset(56); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)42.0f; } }\n  public double JustF64 { get { int o = __p.__offset(58); return o != 0 ? __p.bb.GetDouble(o + __p.bb_pos) : (double)0.0; } }\n  public double? MaybeF64 { get { int o = __p.__offset(60); return o != 0 ? __p.bb.GetDouble(o + __p.bb_pos) : (double?)null; } }\n  public double DefaultF64 { get { int o = __p.__offset(62); return o != 0 ? __p.bb.GetDouble(o + __p.bb_pos) : (double)42.0; } }\n  public bool JustBool { get { int o = __p.__offset(64); return o != 0 ? 0!=__p.bb.Get(o + __p.bb_pos) : (bool)false; } }\n  public bool? MaybeBool { get { int o = __p.__offset(66); return o != 0 ? 0!=__p.bb.Get(o + __p.bb_pos) : (bool?)null; } }\n  public bool DefaultBool { get { int o = __p.__offset(68); return o != 0 ? 0!=__p.bb.Get(o + __p.bb_pos) : (bool)true; } }\n  public optional_scalars.OptionalByte JustEnum { get { int o = __p.__offset(70); return o != 0 ? (optional_scalars.OptionalByte)__p.bb.GetSbyte(o + __p.bb_pos) : optional_scalars.OptionalByte.None; } }\n  public optional_scalars.OptionalByte? MaybeEnum { get { int o = __p.__offset(72); return o != 0 ? (optional_scalars.OptionalByte)__p.bb.GetSbyte(o + __p.bb_pos) : (optional_scalars.OptionalByte?)null; } }\n  public optional_scalars.OptionalByte DefaultEnum { get { int o = __p.__offset(74); return o != 0 ? (optional_scalars.OptionalByte)__p.bb.GetSbyte(o + __p.bb_pos) : optional_scalars.OptionalByte.One; } }\n\n  public static Offset<optional_scalars.ScalarStuff> CreateScalarStuff(FlatBufferBuilder builder,\n      sbyte just_i8 = 0,\n      sbyte? maybe_i8 = null,\n      sbyte default_i8 = 42,\n      byte just_u8 = 0,\n      byte? maybe_u8 = null,\n      byte default_u8 = 42,\n      short just_i16 = 0,\n      short? maybe_i16 = null,\n      short default_i16 = 42,\n      ushort just_u16 = 0,\n      ushort? maybe_u16 = null,\n      ushort default_u16 = 42,\n      int just_i32 = 0,\n      int? maybe_i32 = null,\n      int default_i32 = 42,\n      uint just_u32 = 0,\n      uint? maybe_u32 = null,\n      uint default_u32 = 42,\n      long just_i64 = 0,\n      long? maybe_i64 = null,\n      long default_i64 = 42,\n      ulong just_u64 = 0,\n      ulong? maybe_u64 = null,\n      ulong default_u64 = 42,\n      float just_f32 = 0.0f,\n      float? maybe_f32 = null,\n      float default_f32 = 42.0f,\n      double just_f64 = 0.0,\n      double? maybe_f64 = null,\n      double default_f64 = 42.0,\n      bool just_bool = false,\n      bool? maybe_bool = null,\n      bool default_bool = true,\n      optional_scalars.OptionalByte just_enum = optional_scalars.OptionalByte.None,\n      optional_scalars.OptionalByte? maybe_enum = null,\n      optional_scalars.OptionalByte default_enum = optional_scalars.OptionalByte.One) {\n    builder.StartTable(36);\n    ScalarStuff.AddDefaultF64(builder, default_f64);\n    ScalarStuff.AddMaybeF64(builder, maybe_f64);\n    ScalarStuff.AddJustF64(builder, just_f64);\n    ScalarStuff.AddDefaultU64(builder, default_u64);\n    ScalarStuff.AddMaybeU64(builder, maybe_u64);\n    ScalarStuff.AddJustU64(builder, just_u64);\n    ScalarStuff.AddDefaultI64(builder, default_i64);\n    ScalarStuff.AddMaybeI64(builder, maybe_i64);\n    ScalarStuff.AddJustI64(builder, just_i64);\n    ScalarStuff.AddDefaultF32(builder, default_f32);\n    ScalarStuff.AddMaybeF32(builder, maybe_f32);\n    ScalarStuff.AddJustF32(builder, just_f32);\n    ScalarStuff.AddDefaultU32(builder, default_u32);\n    ScalarStuff.AddMaybeU32(builder, maybe_u32);\n    ScalarStuff.AddJustU32(builder, just_u32);\n    ScalarStuff.AddDefaultI32(builder, default_i32);\n    ScalarStuff.AddMaybeI32(builder, maybe_i32);\n    ScalarStuff.AddJustI32(builder, just_i32);\n    ScalarStuff.AddDefaultU16(builder, default_u16);\n    ScalarStuff.AddMaybeU16(builder, maybe_u16);\n    ScalarStuff.AddJustU16(builder, just_u16);\n    ScalarStuff.AddDefaultI16(builder, default_i16);\n    ScalarStuff.AddMaybeI16(builder, maybe_i16);\n    ScalarStuff.AddJustI16(builder, just_i16);\n    ScalarStuff.AddDefaultEnum(builder, default_enum);\n    ScalarStuff.AddMaybeEnum(builder, maybe_enum);\n    ScalarStuff.AddJustEnum(builder, just_enum);\n    ScalarStuff.AddDefaultBool(builder, default_bool);\n    ScalarStuff.AddMaybeBool(builder, maybe_bool);\n    ScalarStuff.AddJustBool(builder, just_bool);\n    ScalarStuff.AddDefaultU8(builder, default_u8);\n    ScalarStuff.AddMaybeU8(builder, maybe_u8);\n    ScalarStuff.AddJustU8(builder, just_u8);\n    ScalarStuff.AddDefaultI8(builder, default_i8);\n    ScalarStuff.AddMaybeI8(builder, maybe_i8);\n    ScalarStuff.AddJustI8(builder, just_i8);\n    return ScalarStuff.EndScalarStuff(builder);\n  }\n\n  public static void StartScalarStuff(FlatBufferBuilder builder) { builder.StartTable(36); }\n  public static void AddJustI8(FlatBufferBuilder builder, sbyte justI8) { builder.AddSbyte(0, justI8, 0); }\n  public static void AddMaybeI8(FlatBufferBuilder builder, sbyte? maybeI8) { builder.AddSbyte(1, maybeI8); }\n  public static void AddDefaultI8(FlatBufferBuilder builder, sbyte defaultI8) { builder.AddSbyte(2, defaultI8, 42); }\n  public static void AddJustU8(FlatBufferBuilder builder, byte justU8) { builder.AddByte(3, justU8, 0); }\n  public static void AddMaybeU8(FlatBufferBuilder builder, byte? maybeU8) { builder.AddByte(4, maybeU8); }\n  public static void AddDefaultU8(FlatBufferBuilder builder, byte defaultU8) { builder.AddByte(5, defaultU8, 42); }\n  public static void AddJustI16(FlatBufferBuilder builder, short justI16) { builder.AddShort(6, justI16, 0); }\n  public static void AddMaybeI16(FlatBufferBuilder builder, short? maybeI16) { builder.AddShort(7, maybeI16); }\n  public static void AddDefaultI16(FlatBufferBuilder builder, short defaultI16) { builder.AddShort(8, defaultI16, 42); }\n  public static void AddJustU16(FlatBufferBuilder builder, ushort justU16) { builder.AddUshort(9, justU16, 0); }\n  public static void AddMaybeU16(FlatBufferBuilder builder, ushort? maybeU16) { builder.AddUshort(10, maybeU16); }\n  public static void AddDefaultU16(FlatBufferBuilder builder, ushort defaultU16) { builder.AddUshort(11, defaultU16, 42); }\n  public static void AddJustI32(FlatBufferBuilder builder, int justI32) { builder.AddInt(12, justI32, 0); }\n  public static void AddMaybeI32(FlatBufferBuilder builder, int? maybeI32) { builder.AddInt(13, maybeI32); }\n  public static void AddDefaultI32(FlatBufferBuilder builder, int defaultI32) { builder.AddInt(14, defaultI32, 42); }\n  public static void AddJustU32(FlatBufferBuilder builder, uint justU32) { builder.AddUint(15, justU32, 0); }\n  public static void AddMaybeU32(FlatBufferBuilder builder, uint? maybeU32) { builder.AddUint(16, maybeU32); }\n  public static void AddDefaultU32(FlatBufferBuilder builder, uint defaultU32) { builder.AddUint(17, defaultU32, 42); }\n  public static void AddJustI64(FlatBufferBuilder builder, long justI64) { builder.AddLong(18, justI64, 0); }\n  public static void AddMaybeI64(FlatBufferBuilder builder, long? maybeI64) { builder.AddLong(19, maybeI64); }\n  public static void AddDefaultI64(FlatBufferBuilder builder, long defaultI64) { builder.AddLong(20, defaultI64, 42); }\n  public static void AddJustU64(FlatBufferBuilder builder, ulong justU64) { builder.AddUlong(21, justU64, 0); }\n  public static void AddMaybeU64(FlatBufferBuilder builder, ulong? maybeU64) { builder.AddUlong(22, maybeU64); }\n  public static void AddDefaultU64(FlatBufferBuilder builder, ulong defaultU64) { builder.AddUlong(23, defaultU64, 42); }\n  public static void AddJustF32(FlatBufferBuilder builder, float justF32) { builder.AddFloat(24, justF32, 0.0f); }\n  public static void AddMaybeF32(FlatBufferBuilder builder, float? maybeF32) { builder.AddFloat(25, maybeF32); }\n  public static void AddDefaultF32(FlatBufferBuilder builder, float defaultF32) { builder.AddFloat(26, defaultF32, 42.0f); }\n  public static void AddJustF64(FlatBufferBuilder builder, double justF64) { builder.AddDouble(27, justF64, 0.0); }\n  public static void AddMaybeF64(FlatBufferBuilder builder, double? maybeF64) { builder.AddDouble(28, maybeF64); }\n  public static void AddDefaultF64(FlatBufferBuilder builder, double defaultF64) { builder.AddDouble(29, defaultF64, 42.0); }\n  public static void AddJustBool(FlatBufferBuilder builder, bool justBool) { builder.AddBool(30, justBool, false); }\n  public static void AddMaybeBool(FlatBufferBuilder builder, bool? maybeBool) { builder.AddBool(31, maybeBool); }\n  public static void AddDefaultBool(FlatBufferBuilder builder, bool defaultBool) { builder.AddBool(32, defaultBool, true); }\n  public static void AddJustEnum(FlatBufferBuilder builder, optional_scalars.OptionalByte justEnum) { builder.AddSbyte(33, (sbyte)justEnum, 0); }\n  public static void AddMaybeEnum(FlatBufferBuilder builder, optional_scalars.OptionalByte? maybeEnum) { builder.AddSbyte(34, (sbyte?)maybeEnum); }\n  public static void AddDefaultEnum(FlatBufferBuilder builder, optional_scalars.OptionalByte defaultEnum) { builder.AddSbyte(35, (sbyte)defaultEnum, 1); }\n  public static Offset<optional_scalars.ScalarStuff> EndScalarStuff(FlatBufferBuilder builder) {\n    int o = builder.EndTable();\n    return new Offset<optional_scalars.ScalarStuff>(o);\n  }\n  public static void FinishScalarStuffBuffer(FlatBufferBuilder builder, Offset<optional_scalars.ScalarStuff> offset) { builder.Finish(offset.Value, \"NULL\"); }\n  public static void FinishSizePrefixedScalarStuffBuffer(FlatBufferBuilder builder, Offset<optional_scalars.ScalarStuff> offset) { builder.FinishSizePrefixed(offset.Value, \"NULL\"); }\n  public ScalarStuffT UnPack() {\n    var _o = new ScalarStuffT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(ScalarStuffT _o) {\n    _o.JustI8 = this.JustI8;\n    _o.MaybeI8 = this.MaybeI8;\n    _o.DefaultI8 = this.DefaultI8;\n    _o.JustU8 = this.JustU8;\n    _o.MaybeU8 = this.MaybeU8;\n    _o.DefaultU8 = this.DefaultU8;\n    _o.JustI16 = this.JustI16;\n    _o.MaybeI16 = this.MaybeI16;\n    _o.DefaultI16 = this.DefaultI16;\n    _o.JustU16 = this.JustU16;\n    _o.MaybeU16 = this.MaybeU16;\n    _o.DefaultU16 = this.DefaultU16;\n    _o.JustI32 = this.JustI32;\n    _o.MaybeI32 = this.MaybeI32;\n    _o.DefaultI32 = this.DefaultI32;\n    _o.JustU32 = this.JustU32;\n    _o.MaybeU32 = this.MaybeU32;\n    _o.DefaultU32 = this.DefaultU32;\n    _o.JustI64 = this.JustI64;\n    _o.MaybeI64 = this.MaybeI64;\n    _o.DefaultI64 = this.DefaultI64;\n    _o.JustU64 = this.JustU64;\n    _o.MaybeU64 = this.MaybeU64;\n    _o.DefaultU64 = this.DefaultU64;\n    _o.JustF32 = this.JustF32;\n    _o.MaybeF32 = this.MaybeF32;\n    _o.DefaultF32 = this.DefaultF32;\n    _o.JustF64 = this.JustF64;\n    _o.MaybeF64 = this.MaybeF64;\n    _o.DefaultF64 = this.DefaultF64;\n    _o.JustBool = this.JustBool;\n    _o.MaybeBool = this.MaybeBool;\n    _o.DefaultBool = this.DefaultBool;\n    _o.JustEnum = this.JustEnum;\n    _o.MaybeEnum = this.MaybeEnum;\n    _o.DefaultEnum = this.DefaultEnum;\n  }\n  public static Offset<optional_scalars.ScalarStuff> Pack(FlatBufferBuilder builder, ScalarStuffT _o) {\n    if (_o == null) return default(Offset<optional_scalars.ScalarStuff>);\n    return CreateScalarStuff(\n      builder,\n      _o.JustI8,\n      _o.MaybeI8,\n      _o.DefaultI8,\n      _o.JustU8,\n      _o.MaybeU8,\n      _o.DefaultU8,\n      _o.JustI16,\n      _o.MaybeI16,\n      _o.DefaultI16,\n      _o.JustU16,\n      _o.MaybeU16,\n      _o.DefaultU16,\n      _o.JustI32,\n      _o.MaybeI32,\n      _o.DefaultI32,\n      _o.JustU32,\n      _o.MaybeU32,\n      _o.DefaultU32,\n      _o.JustI64,\n      _o.MaybeI64,\n      _o.DefaultI64,\n      _o.JustU64,\n      _o.MaybeU64,\n      _o.DefaultU64,\n      _o.JustF32,\n      _o.MaybeF32,\n      _o.DefaultF32,\n      _o.JustF64,\n      _o.MaybeF64,\n      _o.DefaultF64,\n      _o.JustBool,\n      _o.MaybeBool,\n      _o.DefaultBool,\n      _o.JustEnum,\n      _o.MaybeEnum,\n      _o.DefaultEnum);\n  }\n}\n\npublic class ScalarStuffT\n{\n  public sbyte JustI8 { get; set; }\n  public sbyte? MaybeI8 { get; set; }\n  public sbyte DefaultI8 { get; set; }\n  public byte JustU8 { get; set; }\n  public byte? MaybeU8 { get; set; }\n  public byte DefaultU8 { get; set; }\n  public short JustI16 { get; set; }\n  public short? MaybeI16 { get; set; }\n  public short DefaultI16 { get; set; }\n  public ushort JustU16 { get; set; }\n  public ushort? MaybeU16 { get; set; }\n  public ushort DefaultU16 { get; set; }\n  public int JustI32 { get; set; }\n  public int? MaybeI32 { get; set; }\n  public int DefaultI32 { get; set; }\n  public uint JustU32 { get; set; }\n  public uint? MaybeU32 { get; set; }\n  public uint DefaultU32 { get; set; }\n  public long JustI64 { get; set; }\n  public long? MaybeI64 { get; set; }\n  public long DefaultI64 { get; set; }\n  public ulong JustU64 { get; set; }\n  public ulong? MaybeU64 { get; set; }\n  public ulong DefaultU64 { get; set; }\n  public float JustF32 { get; set; }\n  public float? MaybeF32 { get; set; }\n  public float DefaultF32 { get; set; }\n  public double JustF64 { get; set; }\n  public double? MaybeF64 { get; set; }\n  public double DefaultF64 { get; set; }\n  public bool JustBool { get; set; }\n  public bool? MaybeBool { get; set; }\n  public bool DefaultBool { get; set; }\n  public optional_scalars.OptionalByte JustEnum { get; set; }\n  public optional_scalars.OptionalByte? MaybeEnum { get; set; }\n  public optional_scalars.OptionalByte DefaultEnum { get; set; }\n\n  public ScalarStuffT() {\n    this.JustI8 = 0;\n    this.MaybeI8 = null;\n    this.DefaultI8 = 42;\n    this.JustU8 = 0;\n    this.MaybeU8 = null;\n    this.DefaultU8 = 42;\n    this.JustI16 = 0;\n    this.MaybeI16 = null;\n    this.DefaultI16 = 42;\n    this.JustU16 = 0;\n    this.MaybeU16 = null;\n    this.DefaultU16 = 42;\n    this.JustI32 = 0;\n    this.MaybeI32 = null;\n    this.DefaultI32 = 42;\n    this.JustU32 = 0;\n    this.MaybeU32 = null;\n    this.DefaultU32 = 42;\n    this.JustI64 = 0;\n    this.MaybeI64 = null;\n    this.DefaultI64 = 42;\n    this.JustU64 = 0;\n    this.MaybeU64 = null;\n    this.DefaultU64 = 42;\n    this.JustF32 = 0.0f;\n    this.MaybeF32 = null;\n    this.DefaultF32 = 42.0f;\n    this.JustF64 = 0.0;\n    this.MaybeF64 = null;\n    this.DefaultF64 = 42.0;\n    this.JustBool = false;\n    this.MaybeBool = null;\n    this.DefaultBool = true;\n    this.JustEnum = optional_scalars.OptionalByte.None;\n    this.MaybeEnum = null;\n    this.DefaultEnum = optional_scalars.OptionalByte.One;\n  }\n  public static ScalarStuffT DeserializeFromBinary(byte[] fbBuffer) {\n    return ScalarStuff.GetRootAsScalarStuff(new ByteBuffer(fbBuffer)).UnPack();\n  }\n  public byte[] SerializeToBinary() {\n    var fbb = new FlatBufferBuilder(0x10000);\n    ScalarStuff.FinishScalarStuffBuffer(fbb, ScalarStuff.Pack(fbb, this));\n    return fbb.DataBuffer.ToSizedArray();\n  }\n}\n\n\nstatic public class ScalarStuffVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos)\n  {\n    return verifier.VerifyTableStart(tablePos)\n      && verifier.VerifyField(tablePos, 4 /*JustI8*/, 1 /*sbyte*/, 1, false)\n      && verifier.VerifyField(tablePos, 6 /*MaybeI8*/, 1 /*sbyte*/, 1, false)\n      && verifier.VerifyField(tablePos, 8 /*DefaultI8*/, 1 /*sbyte*/, 1, false)\n      && verifier.VerifyField(tablePos, 10 /*JustU8*/, 1 /*byte*/, 1, false)\n      && verifier.VerifyField(tablePos, 12 /*MaybeU8*/, 1 /*byte*/, 1, false)\n      && verifier.VerifyField(tablePos, 14 /*DefaultU8*/, 1 /*byte*/, 1, false)\n      && verifier.VerifyField(tablePos, 16 /*JustI16*/, 2 /*short*/, 2, false)\n      && verifier.VerifyField(tablePos, 18 /*MaybeI16*/, 2 /*short*/, 2, false)\n      && verifier.VerifyField(tablePos, 20 /*DefaultI16*/, 2 /*short*/, 2, false)\n      && verifier.VerifyField(tablePos, 22 /*JustU16*/, 2 /*ushort*/, 2, false)\n      && verifier.VerifyField(tablePos, 24 /*MaybeU16*/, 2 /*ushort*/, 2, false)\n      && verifier.VerifyField(tablePos, 26 /*DefaultU16*/, 2 /*ushort*/, 2, false)\n      && verifier.VerifyField(tablePos, 28 /*JustI32*/, 4 /*int*/, 4, false)\n      && verifier.VerifyField(tablePos, 30 /*MaybeI32*/, 4 /*int*/, 4, false)\n      && verifier.VerifyField(tablePos, 32 /*DefaultI32*/, 4 /*int*/, 4, false)\n      && verifier.VerifyField(tablePos, 34 /*JustU32*/, 4 /*uint*/, 4, false)\n      && verifier.VerifyField(tablePos, 36 /*MaybeU32*/, 4 /*uint*/, 4, false)\n      && verifier.VerifyField(tablePos, 38 /*DefaultU32*/, 4 /*uint*/, 4, false)\n      && verifier.VerifyField(tablePos, 40 /*JustI64*/, 8 /*long*/, 8, false)\n      && verifier.VerifyField(tablePos, 42 /*MaybeI64*/, 8 /*long*/, 8, false)\n      && verifier.VerifyField(tablePos, 44 /*DefaultI64*/, 8 /*long*/, 8, false)\n      && verifier.VerifyField(tablePos, 46 /*JustU64*/, 8 /*ulong*/, 8, false)\n      && verifier.VerifyField(tablePos, 48 /*MaybeU64*/, 8 /*ulong*/, 8, false)\n      && verifier.VerifyField(tablePos, 50 /*DefaultU64*/, 8 /*ulong*/, 8, false)\n      && verifier.VerifyField(tablePos, 52 /*JustF32*/, 4 /*float*/, 4, false)\n      && verifier.VerifyField(tablePos, 54 /*MaybeF32*/, 4 /*float*/, 4, false)\n      && verifier.VerifyField(tablePos, 56 /*DefaultF32*/, 4 /*float*/, 4, false)\n      && verifier.VerifyField(tablePos, 58 /*JustF64*/, 8 /*double*/, 8, false)\n      && verifier.VerifyField(tablePos, 60 /*MaybeF64*/, 8 /*double*/, 8, false)\n      && verifier.VerifyField(tablePos, 62 /*DefaultF64*/, 8 /*double*/, 8, false)\n      && verifier.VerifyField(tablePos, 64 /*JustBool*/, 1 /*bool*/, 1, false)\n      && verifier.VerifyField(tablePos, 66 /*MaybeBool*/, 1 /*bool*/, 1, false)\n      && verifier.VerifyField(tablePos, 68 /*DefaultBool*/, 1 /*bool*/, 1, false)\n      && verifier.VerifyField(tablePos, 70 /*JustEnum*/, 1 /*optional_scalars.OptionalByte*/, 1, false)\n      && verifier.VerifyField(tablePos, 72 /*MaybeEnum*/, 1 /*optional_scalars.OptionalByte*/, 1, false)\n      && verifier.VerifyField(tablePos, 74 /*DefaultEnum*/, 1 /*optional_scalars.OptionalByte*/, 1, false)\n      && verifier.VerifyTableEnd(tablePos);\n  }\n}\n\n}\n"
  },
  {
    "path": "tests/optional_scalars/ScalarStuff.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage optional_scalars\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n)\n\ntype ScalarStuffT struct {\n\tJustI8      int8          `json:\"just_i8\"`\n\tMaybeI8     *int8         `json:\"maybe_i8\"`\n\tDefaultI8   int8          `json:\"default_i8\"`\n\tJustU8      byte          `json:\"just_u8\"`\n\tMaybeU8     *byte         `json:\"maybe_u8\"`\n\tDefaultU8   byte          `json:\"default_u8\"`\n\tJustI16     int16         `json:\"just_i16\"`\n\tMaybeI16    *int16        `json:\"maybe_i16\"`\n\tDefaultI16  int16         `json:\"default_i16\"`\n\tJustU16     uint16        `json:\"just_u16\"`\n\tMaybeU16    *uint16       `json:\"maybe_u16\"`\n\tDefaultU16  uint16        `json:\"default_u16\"`\n\tJustI32     int32         `json:\"just_i32\"`\n\tMaybeI32    *int32        `json:\"maybe_i32\"`\n\tDefaultI32  int32         `json:\"default_i32\"`\n\tJustU32     uint32        `json:\"just_u32\"`\n\tMaybeU32    *uint32       `json:\"maybe_u32\"`\n\tDefaultU32  uint32        `json:\"default_u32\"`\n\tJustI64     int64         `json:\"just_i64\"`\n\tMaybeI64    *int64        `json:\"maybe_i64\"`\n\tDefaultI64  int64         `json:\"default_i64\"`\n\tJustU64     uint64        `json:\"just_u64\"`\n\tMaybeU64    *uint64       `json:\"maybe_u64\"`\n\tDefaultU64  uint64        `json:\"default_u64\"`\n\tJustF32     float32       `json:\"just_f32\"`\n\tMaybeF32    *float32      `json:\"maybe_f32\"`\n\tDefaultF32  float32       `json:\"default_f32\"`\n\tJustF64     float64       `json:\"just_f64\"`\n\tMaybeF64    *float64      `json:\"maybe_f64\"`\n\tDefaultF64  float64       `json:\"default_f64\"`\n\tJustBool    bool          `json:\"just_bool\"`\n\tMaybeBool   *bool         `json:\"maybe_bool\"`\n\tDefaultBool bool          `json:\"default_bool\"`\n\tJustEnum    OptionalByte  `json:\"just_enum\"`\n\tMaybeEnum   *OptionalByte `json:\"maybe_enum\"`\n\tDefaultEnum OptionalByte  `json:\"default_enum\"`\n}\n\nfunc (t *ScalarStuffT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\tif t == nil {\n\t\treturn 0\n\t}\n\tScalarStuffStart(builder)\n\tScalarStuffAddJustI8(builder, t.JustI8)\n\tif t.MaybeI8 != nil {\n\t\tScalarStuffAddMaybeI8(builder, *t.MaybeI8)\n\t}\n\tScalarStuffAddDefaultI8(builder, t.DefaultI8)\n\tScalarStuffAddJustU8(builder, t.JustU8)\n\tif t.MaybeU8 != nil {\n\t\tScalarStuffAddMaybeU8(builder, *t.MaybeU8)\n\t}\n\tScalarStuffAddDefaultU8(builder, t.DefaultU8)\n\tScalarStuffAddJustI16(builder, t.JustI16)\n\tif t.MaybeI16 != nil {\n\t\tScalarStuffAddMaybeI16(builder, *t.MaybeI16)\n\t}\n\tScalarStuffAddDefaultI16(builder, t.DefaultI16)\n\tScalarStuffAddJustU16(builder, t.JustU16)\n\tif t.MaybeU16 != nil {\n\t\tScalarStuffAddMaybeU16(builder, *t.MaybeU16)\n\t}\n\tScalarStuffAddDefaultU16(builder, t.DefaultU16)\n\tScalarStuffAddJustI32(builder, t.JustI32)\n\tif t.MaybeI32 != nil {\n\t\tScalarStuffAddMaybeI32(builder, *t.MaybeI32)\n\t}\n\tScalarStuffAddDefaultI32(builder, t.DefaultI32)\n\tScalarStuffAddJustU32(builder, t.JustU32)\n\tif t.MaybeU32 != nil {\n\t\tScalarStuffAddMaybeU32(builder, *t.MaybeU32)\n\t}\n\tScalarStuffAddDefaultU32(builder, t.DefaultU32)\n\tScalarStuffAddJustI64(builder, t.JustI64)\n\tif t.MaybeI64 != nil {\n\t\tScalarStuffAddMaybeI64(builder, *t.MaybeI64)\n\t}\n\tScalarStuffAddDefaultI64(builder, t.DefaultI64)\n\tScalarStuffAddJustU64(builder, t.JustU64)\n\tif t.MaybeU64 != nil {\n\t\tScalarStuffAddMaybeU64(builder, *t.MaybeU64)\n\t}\n\tScalarStuffAddDefaultU64(builder, t.DefaultU64)\n\tScalarStuffAddJustF32(builder, t.JustF32)\n\tif t.MaybeF32 != nil {\n\t\tScalarStuffAddMaybeF32(builder, *t.MaybeF32)\n\t}\n\tScalarStuffAddDefaultF32(builder, t.DefaultF32)\n\tScalarStuffAddJustF64(builder, t.JustF64)\n\tif t.MaybeF64 != nil {\n\t\tScalarStuffAddMaybeF64(builder, *t.MaybeF64)\n\t}\n\tScalarStuffAddDefaultF64(builder, t.DefaultF64)\n\tScalarStuffAddJustBool(builder, t.JustBool)\n\tif t.MaybeBool != nil {\n\t\tScalarStuffAddMaybeBool(builder, *t.MaybeBool)\n\t}\n\tScalarStuffAddDefaultBool(builder, t.DefaultBool)\n\tScalarStuffAddJustEnum(builder, t.JustEnum)\n\tif t.MaybeEnum != nil {\n\t\tScalarStuffAddMaybeEnum(builder, *t.MaybeEnum)\n\t}\n\tScalarStuffAddDefaultEnum(builder, t.DefaultEnum)\n\treturn ScalarStuffEnd(builder)\n}\n\nfunc (rcv *ScalarStuff) UnPackTo(t *ScalarStuffT) {\n\tt.JustI8 = rcv.JustI8()\n\tt.MaybeI8 = rcv.MaybeI8()\n\tt.DefaultI8 = rcv.DefaultI8()\n\tt.JustU8 = rcv.JustU8()\n\tt.MaybeU8 = rcv.MaybeU8()\n\tt.DefaultU8 = rcv.DefaultU8()\n\tt.JustI16 = rcv.JustI16()\n\tt.MaybeI16 = rcv.MaybeI16()\n\tt.DefaultI16 = rcv.DefaultI16()\n\tt.JustU16 = rcv.JustU16()\n\tt.MaybeU16 = rcv.MaybeU16()\n\tt.DefaultU16 = rcv.DefaultU16()\n\tt.JustI32 = rcv.JustI32()\n\tt.MaybeI32 = rcv.MaybeI32()\n\tt.DefaultI32 = rcv.DefaultI32()\n\tt.JustU32 = rcv.JustU32()\n\tt.MaybeU32 = rcv.MaybeU32()\n\tt.DefaultU32 = rcv.DefaultU32()\n\tt.JustI64 = rcv.JustI64()\n\tt.MaybeI64 = rcv.MaybeI64()\n\tt.DefaultI64 = rcv.DefaultI64()\n\tt.JustU64 = rcv.JustU64()\n\tt.MaybeU64 = rcv.MaybeU64()\n\tt.DefaultU64 = rcv.DefaultU64()\n\tt.JustF32 = rcv.JustF32()\n\tt.MaybeF32 = rcv.MaybeF32()\n\tt.DefaultF32 = rcv.DefaultF32()\n\tt.JustF64 = rcv.JustF64()\n\tt.MaybeF64 = rcv.MaybeF64()\n\tt.DefaultF64 = rcv.DefaultF64()\n\tt.JustBool = rcv.JustBool()\n\tt.MaybeBool = rcv.MaybeBool()\n\tt.DefaultBool = rcv.DefaultBool()\n\tt.JustEnum = rcv.JustEnum()\n\tt.MaybeEnum = rcv.MaybeEnum()\n\tt.DefaultEnum = rcv.DefaultEnum()\n}\n\nfunc (rcv *ScalarStuff) UnPack() *ScalarStuffT {\n\tif rcv == nil {\n\t\treturn nil\n\t}\n\tt := &ScalarStuffT{}\n\trcv.UnPackTo(t)\n\treturn t\n}\n\ntype ScalarStuff struct {\n\t_tab flatbuffers.Table\n}\n\nfunc GetRootAsScalarStuff(buf []byte, offset flatbuffers.UOffsetT) *ScalarStuff {\n\tn := flatbuffers.GetUOffsetT(buf[offset:])\n\tx := &ScalarStuff{}\n\tx.Init(buf, n+offset)\n\treturn x\n}\n\nfunc GetSizePrefixedRootAsScalarStuff(buf []byte, offset flatbuffers.UOffsetT) *ScalarStuff {\n\tn := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])\n\tx := &ScalarStuff{}\n\tx.Init(buf, n+offset+flatbuffers.SizeUint32)\n\treturn x\n}\n\nfunc (rcv *ScalarStuff) Init(buf []byte, i flatbuffers.UOffsetT) {\n\trcv._tab.Bytes = buf\n\trcv._tab.Pos = i\n}\n\nfunc (rcv *ScalarStuff) Table() flatbuffers.Table {\n\treturn rcv._tab\n}\n\nfunc (rcv *ScalarStuff) JustI8() int8 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(4))\n\tif o != 0 {\n\t\treturn rcv._tab.GetInt8(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *ScalarStuff) MutateJustI8(n int8) bool {\n\treturn rcv._tab.MutateInt8Slot(4, n)\n}\n\nfunc (rcv *ScalarStuff) MaybeI8() *int8 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(6))\n\tif o != 0 {\n\t\tv := rcv._tab.GetInt8(o + rcv._tab.Pos)\n\t\treturn &v\n\t}\n\treturn nil\n}\n\nfunc (rcv *ScalarStuff) MutateMaybeI8(n int8) bool {\n\treturn rcv._tab.MutateInt8Slot(6, n)\n}\n\nfunc (rcv *ScalarStuff) DefaultI8() int8 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(8))\n\tif o != 0 {\n\t\treturn rcv._tab.GetInt8(o + rcv._tab.Pos)\n\t}\n\treturn 42\n}\n\nfunc (rcv *ScalarStuff) MutateDefaultI8(n int8) bool {\n\treturn rcv._tab.MutateInt8Slot(8, n)\n}\n\nfunc (rcv *ScalarStuff) JustU8() byte {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(10))\n\tif o != 0 {\n\t\treturn rcv._tab.GetByte(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *ScalarStuff) MutateJustU8(n byte) bool {\n\treturn rcv._tab.MutateByteSlot(10, n)\n}\n\nfunc (rcv *ScalarStuff) MaybeU8() *byte {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(12))\n\tif o != 0 {\n\t\tv := rcv._tab.GetByte(o + rcv._tab.Pos)\n\t\treturn &v\n\t}\n\treturn nil\n}\n\nfunc (rcv *ScalarStuff) MutateMaybeU8(n byte) bool {\n\treturn rcv._tab.MutateByteSlot(12, n)\n}\n\nfunc (rcv *ScalarStuff) DefaultU8() byte {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(14))\n\tif o != 0 {\n\t\treturn rcv._tab.GetByte(o + rcv._tab.Pos)\n\t}\n\treturn 42\n}\n\nfunc (rcv *ScalarStuff) MutateDefaultU8(n byte) bool {\n\treturn rcv._tab.MutateByteSlot(14, n)\n}\n\nfunc (rcv *ScalarStuff) JustI16() int16 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(16))\n\tif o != 0 {\n\t\treturn rcv._tab.GetInt16(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *ScalarStuff) MutateJustI16(n int16) bool {\n\treturn rcv._tab.MutateInt16Slot(16, n)\n}\n\nfunc (rcv *ScalarStuff) MaybeI16() *int16 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(18))\n\tif o != 0 {\n\t\tv := rcv._tab.GetInt16(o + rcv._tab.Pos)\n\t\treturn &v\n\t}\n\treturn nil\n}\n\nfunc (rcv *ScalarStuff) MutateMaybeI16(n int16) bool {\n\treturn rcv._tab.MutateInt16Slot(18, n)\n}\n\nfunc (rcv *ScalarStuff) DefaultI16() int16 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(20))\n\tif o != 0 {\n\t\treturn rcv._tab.GetInt16(o + rcv._tab.Pos)\n\t}\n\treturn 42\n}\n\nfunc (rcv *ScalarStuff) MutateDefaultI16(n int16) bool {\n\treturn rcv._tab.MutateInt16Slot(20, n)\n}\n\nfunc (rcv *ScalarStuff) JustU16() uint16 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(22))\n\tif o != 0 {\n\t\treturn rcv._tab.GetUint16(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *ScalarStuff) MutateJustU16(n uint16) bool {\n\treturn rcv._tab.MutateUint16Slot(22, n)\n}\n\nfunc (rcv *ScalarStuff) MaybeU16() *uint16 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(24))\n\tif o != 0 {\n\t\tv := rcv._tab.GetUint16(o + rcv._tab.Pos)\n\t\treturn &v\n\t}\n\treturn nil\n}\n\nfunc (rcv *ScalarStuff) MutateMaybeU16(n uint16) bool {\n\treturn rcv._tab.MutateUint16Slot(24, n)\n}\n\nfunc (rcv *ScalarStuff) DefaultU16() uint16 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(26))\n\tif o != 0 {\n\t\treturn rcv._tab.GetUint16(o + rcv._tab.Pos)\n\t}\n\treturn 42\n}\n\nfunc (rcv *ScalarStuff) MutateDefaultU16(n uint16) bool {\n\treturn rcv._tab.MutateUint16Slot(26, n)\n}\n\nfunc (rcv *ScalarStuff) JustI32() int32 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(28))\n\tif o != 0 {\n\t\treturn rcv._tab.GetInt32(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *ScalarStuff) MutateJustI32(n int32) bool {\n\treturn rcv._tab.MutateInt32Slot(28, n)\n}\n\nfunc (rcv *ScalarStuff) MaybeI32() *int32 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(30))\n\tif o != 0 {\n\t\tv := rcv._tab.GetInt32(o + rcv._tab.Pos)\n\t\treturn &v\n\t}\n\treturn nil\n}\n\nfunc (rcv *ScalarStuff) MutateMaybeI32(n int32) bool {\n\treturn rcv._tab.MutateInt32Slot(30, n)\n}\n\nfunc (rcv *ScalarStuff) DefaultI32() int32 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(32))\n\tif o != 0 {\n\t\treturn rcv._tab.GetInt32(o + rcv._tab.Pos)\n\t}\n\treturn 42\n}\n\nfunc (rcv *ScalarStuff) MutateDefaultI32(n int32) bool {\n\treturn rcv._tab.MutateInt32Slot(32, n)\n}\n\nfunc (rcv *ScalarStuff) JustU32() uint32 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(34))\n\tif o != 0 {\n\t\treturn rcv._tab.GetUint32(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *ScalarStuff) MutateJustU32(n uint32) bool {\n\treturn rcv._tab.MutateUint32Slot(34, n)\n}\n\nfunc (rcv *ScalarStuff) MaybeU32() *uint32 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(36))\n\tif o != 0 {\n\t\tv := rcv._tab.GetUint32(o + rcv._tab.Pos)\n\t\treturn &v\n\t}\n\treturn nil\n}\n\nfunc (rcv *ScalarStuff) MutateMaybeU32(n uint32) bool {\n\treturn rcv._tab.MutateUint32Slot(36, n)\n}\n\nfunc (rcv *ScalarStuff) DefaultU32() uint32 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(38))\n\tif o != 0 {\n\t\treturn rcv._tab.GetUint32(o + rcv._tab.Pos)\n\t}\n\treturn 42\n}\n\nfunc (rcv *ScalarStuff) MutateDefaultU32(n uint32) bool {\n\treturn rcv._tab.MutateUint32Slot(38, n)\n}\n\nfunc (rcv *ScalarStuff) JustI64() int64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(40))\n\tif o != 0 {\n\t\treturn rcv._tab.GetInt64(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *ScalarStuff) MutateJustI64(n int64) bool {\n\treturn rcv._tab.MutateInt64Slot(40, n)\n}\n\nfunc (rcv *ScalarStuff) MaybeI64() *int64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(42))\n\tif o != 0 {\n\t\tv := rcv._tab.GetInt64(o + rcv._tab.Pos)\n\t\treturn &v\n\t}\n\treturn nil\n}\n\nfunc (rcv *ScalarStuff) MutateMaybeI64(n int64) bool {\n\treturn rcv._tab.MutateInt64Slot(42, n)\n}\n\nfunc (rcv *ScalarStuff) DefaultI64() int64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(44))\n\tif o != 0 {\n\t\treturn rcv._tab.GetInt64(o + rcv._tab.Pos)\n\t}\n\treturn 42\n}\n\nfunc (rcv *ScalarStuff) MutateDefaultI64(n int64) bool {\n\treturn rcv._tab.MutateInt64Slot(44, n)\n}\n\nfunc (rcv *ScalarStuff) JustU64() uint64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(46))\n\tif o != 0 {\n\t\treturn rcv._tab.GetUint64(o + rcv._tab.Pos)\n\t}\n\treturn 0\n}\n\nfunc (rcv *ScalarStuff) MutateJustU64(n uint64) bool {\n\treturn rcv._tab.MutateUint64Slot(46, n)\n}\n\nfunc (rcv *ScalarStuff) MaybeU64() *uint64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(48))\n\tif o != 0 {\n\t\tv := rcv._tab.GetUint64(o + rcv._tab.Pos)\n\t\treturn &v\n\t}\n\treturn nil\n}\n\nfunc (rcv *ScalarStuff) MutateMaybeU64(n uint64) bool {\n\treturn rcv._tab.MutateUint64Slot(48, n)\n}\n\nfunc (rcv *ScalarStuff) DefaultU64() uint64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(50))\n\tif o != 0 {\n\t\treturn rcv._tab.GetUint64(o + rcv._tab.Pos)\n\t}\n\treturn 42\n}\n\nfunc (rcv *ScalarStuff) MutateDefaultU64(n uint64) bool {\n\treturn rcv._tab.MutateUint64Slot(50, n)\n}\n\nfunc (rcv *ScalarStuff) JustF32() float32 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(52))\n\tif o != 0 {\n\t\treturn rcv._tab.GetFloat32(o + rcv._tab.Pos)\n\t}\n\treturn 0.0\n}\n\nfunc (rcv *ScalarStuff) MutateJustF32(n float32) bool {\n\treturn rcv._tab.MutateFloat32Slot(52, n)\n}\n\nfunc (rcv *ScalarStuff) MaybeF32() *float32 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(54))\n\tif o != 0 {\n\t\tv := rcv._tab.GetFloat32(o + rcv._tab.Pos)\n\t\treturn &v\n\t}\n\treturn nil\n}\n\nfunc (rcv *ScalarStuff) MutateMaybeF32(n float32) bool {\n\treturn rcv._tab.MutateFloat32Slot(54, n)\n}\n\nfunc (rcv *ScalarStuff) DefaultF32() float32 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(56))\n\tif o != 0 {\n\t\treturn rcv._tab.GetFloat32(o + rcv._tab.Pos)\n\t}\n\treturn 42.0\n}\n\nfunc (rcv *ScalarStuff) MutateDefaultF32(n float32) bool {\n\treturn rcv._tab.MutateFloat32Slot(56, n)\n}\n\nfunc (rcv *ScalarStuff) JustF64() float64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(58))\n\tif o != 0 {\n\t\treturn rcv._tab.GetFloat64(o + rcv._tab.Pos)\n\t}\n\treturn 0.0\n}\n\nfunc (rcv *ScalarStuff) MutateJustF64(n float64) bool {\n\treturn rcv._tab.MutateFloat64Slot(58, n)\n}\n\nfunc (rcv *ScalarStuff) MaybeF64() *float64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(60))\n\tif o != 0 {\n\t\tv := rcv._tab.GetFloat64(o + rcv._tab.Pos)\n\t\treturn &v\n\t}\n\treturn nil\n}\n\nfunc (rcv *ScalarStuff) MutateMaybeF64(n float64) bool {\n\treturn rcv._tab.MutateFloat64Slot(60, n)\n}\n\nfunc (rcv *ScalarStuff) DefaultF64() float64 {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(62))\n\tif o != 0 {\n\t\treturn rcv._tab.GetFloat64(o + rcv._tab.Pos)\n\t}\n\treturn 42.0\n}\n\nfunc (rcv *ScalarStuff) MutateDefaultF64(n float64) bool {\n\treturn rcv._tab.MutateFloat64Slot(62, n)\n}\n\nfunc (rcv *ScalarStuff) JustBool() bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(64))\n\tif o != 0 {\n\t\treturn rcv._tab.GetBool(o + rcv._tab.Pos)\n\t}\n\treturn false\n}\n\nfunc (rcv *ScalarStuff) MutateJustBool(n bool) bool {\n\treturn rcv._tab.MutateBoolSlot(64, n)\n}\n\nfunc (rcv *ScalarStuff) MaybeBool() *bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(66))\n\tif o != 0 {\n\t\tv := rcv._tab.GetBool(o + rcv._tab.Pos)\n\t\treturn &v\n\t}\n\treturn nil\n}\n\nfunc (rcv *ScalarStuff) MutateMaybeBool(n bool) bool {\n\treturn rcv._tab.MutateBoolSlot(66, n)\n}\n\nfunc (rcv *ScalarStuff) DefaultBool() bool {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(68))\n\tif o != 0 {\n\t\treturn rcv._tab.GetBool(o + rcv._tab.Pos)\n\t}\n\treturn true\n}\n\nfunc (rcv *ScalarStuff) MutateDefaultBool(n bool) bool {\n\treturn rcv._tab.MutateBoolSlot(68, n)\n}\n\nfunc (rcv *ScalarStuff) JustEnum() OptionalByte {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(70))\n\tif o != 0 {\n\t\treturn OptionalByte(rcv._tab.GetInt8(o + rcv._tab.Pos))\n\t}\n\treturn 0\n}\n\nfunc (rcv *ScalarStuff) MutateJustEnum(n OptionalByte) bool {\n\treturn rcv._tab.MutateInt8Slot(70, int8(n))\n}\n\nfunc (rcv *ScalarStuff) MaybeEnum() *OptionalByte {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(72))\n\tif o != 0 {\n\t\tv := OptionalByte(rcv._tab.GetInt8(o + rcv._tab.Pos))\n\t\treturn &v\n\t}\n\treturn nil\n}\n\nfunc (rcv *ScalarStuff) MutateMaybeEnum(n OptionalByte) bool {\n\treturn rcv._tab.MutateInt8Slot(72, int8(n))\n}\n\nfunc (rcv *ScalarStuff) DefaultEnum() OptionalByte {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(74))\n\tif o != 0 {\n\t\treturn OptionalByte(rcv._tab.GetInt8(o + rcv._tab.Pos))\n\t}\n\treturn 1\n}\n\nfunc (rcv *ScalarStuff) MutateDefaultEnum(n OptionalByte) bool {\n\treturn rcv._tab.MutateInt8Slot(74, int8(n))\n}\n\nfunc ScalarStuffStart(builder *flatbuffers.Builder) {\n\tbuilder.StartObject(36)\n}\nfunc ScalarStuffAddJustI8(builder *flatbuffers.Builder, justI8 int8) {\n\tbuilder.PrependInt8Slot(0, justI8, 0)\n}\nfunc ScalarStuffAddMaybeI8(builder *flatbuffers.Builder, maybeI8 int8) {\n\tbuilder.PrependInt8(maybeI8)\n\tbuilder.Slot(1)\n}\nfunc ScalarStuffAddDefaultI8(builder *flatbuffers.Builder, defaultI8 int8) {\n\tbuilder.PrependInt8Slot(2, defaultI8, 42)\n}\nfunc ScalarStuffAddJustU8(builder *flatbuffers.Builder, justU8 byte) {\n\tbuilder.PrependByteSlot(3, justU8, 0)\n}\nfunc ScalarStuffAddMaybeU8(builder *flatbuffers.Builder, maybeU8 byte) {\n\tbuilder.PrependByte(maybeU8)\n\tbuilder.Slot(4)\n}\nfunc ScalarStuffAddDefaultU8(builder *flatbuffers.Builder, defaultU8 byte) {\n\tbuilder.PrependByteSlot(5, defaultU8, 42)\n}\nfunc ScalarStuffAddJustI16(builder *flatbuffers.Builder, justI16 int16) {\n\tbuilder.PrependInt16Slot(6, justI16, 0)\n}\nfunc ScalarStuffAddMaybeI16(builder *flatbuffers.Builder, maybeI16 int16) {\n\tbuilder.PrependInt16(maybeI16)\n\tbuilder.Slot(7)\n}\nfunc ScalarStuffAddDefaultI16(builder *flatbuffers.Builder, defaultI16 int16) {\n\tbuilder.PrependInt16Slot(8, defaultI16, 42)\n}\nfunc ScalarStuffAddJustU16(builder *flatbuffers.Builder, justU16 uint16) {\n\tbuilder.PrependUint16Slot(9, justU16, 0)\n}\nfunc ScalarStuffAddMaybeU16(builder *flatbuffers.Builder, maybeU16 uint16) {\n\tbuilder.PrependUint16(maybeU16)\n\tbuilder.Slot(10)\n}\nfunc ScalarStuffAddDefaultU16(builder *flatbuffers.Builder, defaultU16 uint16) {\n\tbuilder.PrependUint16Slot(11, defaultU16, 42)\n}\nfunc ScalarStuffAddJustI32(builder *flatbuffers.Builder, justI32 int32) {\n\tbuilder.PrependInt32Slot(12, justI32, 0)\n}\nfunc ScalarStuffAddMaybeI32(builder *flatbuffers.Builder, maybeI32 int32) {\n\tbuilder.PrependInt32(maybeI32)\n\tbuilder.Slot(13)\n}\nfunc ScalarStuffAddDefaultI32(builder *flatbuffers.Builder, defaultI32 int32) {\n\tbuilder.PrependInt32Slot(14, defaultI32, 42)\n}\nfunc ScalarStuffAddJustU32(builder *flatbuffers.Builder, justU32 uint32) {\n\tbuilder.PrependUint32Slot(15, justU32, 0)\n}\nfunc ScalarStuffAddMaybeU32(builder *flatbuffers.Builder, maybeU32 uint32) {\n\tbuilder.PrependUint32(maybeU32)\n\tbuilder.Slot(16)\n}\nfunc ScalarStuffAddDefaultU32(builder *flatbuffers.Builder, defaultU32 uint32) {\n\tbuilder.PrependUint32Slot(17, defaultU32, 42)\n}\nfunc ScalarStuffAddJustI64(builder *flatbuffers.Builder, justI64 int64) {\n\tbuilder.PrependInt64Slot(18, justI64, 0)\n}\nfunc ScalarStuffAddMaybeI64(builder *flatbuffers.Builder, maybeI64 int64) {\n\tbuilder.PrependInt64(maybeI64)\n\tbuilder.Slot(19)\n}\nfunc ScalarStuffAddDefaultI64(builder *flatbuffers.Builder, defaultI64 int64) {\n\tbuilder.PrependInt64Slot(20, defaultI64, 42)\n}\nfunc ScalarStuffAddJustU64(builder *flatbuffers.Builder, justU64 uint64) {\n\tbuilder.PrependUint64Slot(21, justU64, 0)\n}\nfunc ScalarStuffAddMaybeU64(builder *flatbuffers.Builder, maybeU64 uint64) {\n\tbuilder.PrependUint64(maybeU64)\n\tbuilder.Slot(22)\n}\nfunc ScalarStuffAddDefaultU64(builder *flatbuffers.Builder, defaultU64 uint64) {\n\tbuilder.PrependUint64Slot(23, defaultU64, 42)\n}\nfunc ScalarStuffAddJustF32(builder *flatbuffers.Builder, justF32 float32) {\n\tbuilder.PrependFloat32Slot(24, justF32, 0.0)\n}\nfunc ScalarStuffAddMaybeF32(builder *flatbuffers.Builder, maybeF32 float32) {\n\tbuilder.PrependFloat32(maybeF32)\n\tbuilder.Slot(25)\n}\nfunc ScalarStuffAddDefaultF32(builder *flatbuffers.Builder, defaultF32 float32) {\n\tbuilder.PrependFloat32Slot(26, defaultF32, 42.0)\n}\nfunc ScalarStuffAddJustF64(builder *flatbuffers.Builder, justF64 float64) {\n\tbuilder.PrependFloat64Slot(27, justF64, 0.0)\n}\nfunc ScalarStuffAddMaybeF64(builder *flatbuffers.Builder, maybeF64 float64) {\n\tbuilder.PrependFloat64(maybeF64)\n\tbuilder.Slot(28)\n}\nfunc ScalarStuffAddDefaultF64(builder *flatbuffers.Builder, defaultF64 float64) {\n\tbuilder.PrependFloat64Slot(29, defaultF64, 42.0)\n}\nfunc ScalarStuffAddJustBool(builder *flatbuffers.Builder, justBool bool) {\n\tbuilder.PrependBoolSlot(30, justBool, false)\n}\nfunc ScalarStuffAddMaybeBool(builder *flatbuffers.Builder, maybeBool bool) {\n\tbuilder.PrependBool(maybeBool)\n\tbuilder.Slot(31)\n}\nfunc ScalarStuffAddDefaultBool(builder *flatbuffers.Builder, defaultBool bool) {\n\tbuilder.PrependBoolSlot(32, defaultBool, true)\n}\nfunc ScalarStuffAddJustEnum(builder *flatbuffers.Builder, justEnum OptionalByte) {\n\tbuilder.PrependInt8Slot(33, int8(justEnum), 0)\n}\nfunc ScalarStuffAddMaybeEnum(builder *flatbuffers.Builder, maybeEnum OptionalByte) {\n\tbuilder.PrependInt8(int8(maybeEnum))\n\tbuilder.Slot(34)\n}\nfunc ScalarStuffAddDefaultEnum(builder *flatbuffers.Builder, defaultEnum OptionalByte) {\n\tbuilder.PrependInt8Slot(35, int8(defaultEnum), 1)\n}\nfunc ScalarStuffEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\treturn builder.EndObject()\n}\n"
  },
  {
    "path": "tests/optional_scalars/ScalarStuff.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage optional_scalars;\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class ScalarStuff extends com.google.flatbuffers.Table {\n  public static void ValidateVersion() { Constants.FLATBUFFERS_25_12_19(); }\n  public static ScalarStuff getRootAsScalarStuff(ByteBuffer _bb) { return getRootAsScalarStuff(_bb, new ScalarStuff()); }\n  public static ScalarStuff getRootAsScalarStuff(ByteBuffer _bb, ScalarStuff obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }\n  public static boolean ScalarStuffBufferHasIdentifier(ByteBuffer _bb) { return __has_identifier(_bb, \"NULL\"); }\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public ScalarStuff __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public byte justI8() { int o = __offset(4); return o != 0 ? bb.get(o + bb_pos) : 0; }\n  public boolean hasMaybeI8() { return 0 != __offset(6); }\n  public byte maybeI8() { int o = __offset(6); return o != 0 ? bb.get(o + bb_pos) : 0; }\n  public byte defaultI8() { int o = __offset(8); return o != 0 ? bb.get(o + bb_pos) : 42; }\n  public int justU8() { int o = __offset(10); return o != 0 ? bb.get(o + bb_pos) & 0xFF : 0; }\n  public boolean hasMaybeU8() { return 0 != __offset(12); }\n  public int maybeU8() { int o = __offset(12); return o != 0 ? bb.get(o + bb_pos) & 0xFF : 0; }\n  public int defaultU8() { int o = __offset(14); return o != 0 ? bb.get(o + bb_pos) & 0xFF : 42; }\n  public short justI16() { int o = __offset(16); return o != 0 ? bb.getShort(o + bb_pos) : 0; }\n  public boolean hasMaybeI16() { return 0 != __offset(18); }\n  public short maybeI16() { int o = __offset(18); return o != 0 ? bb.getShort(o + bb_pos) : 0; }\n  public short defaultI16() { int o = __offset(20); return o != 0 ? bb.getShort(o + bb_pos) : 42; }\n  public int justU16() { int o = __offset(22); return o != 0 ? bb.getShort(o + bb_pos) & 0xFFFF : 0; }\n  public boolean hasMaybeU16() { return 0 != __offset(24); }\n  public int maybeU16() { int o = __offset(24); return o != 0 ? bb.getShort(o + bb_pos) & 0xFFFF : 0; }\n  public int defaultU16() { int o = __offset(26); return o != 0 ? bb.getShort(o + bb_pos) & 0xFFFF : 42; }\n  public int justI32() { int o = __offset(28); return o != 0 ? bb.getInt(o + bb_pos) : 0; }\n  public boolean hasMaybeI32() { return 0 != __offset(30); }\n  public int maybeI32() { int o = __offset(30); return o != 0 ? bb.getInt(o + bb_pos) : 0; }\n  public int defaultI32() { int o = __offset(32); return o != 0 ? bb.getInt(o + bb_pos) : 42; }\n  public long justU32() { int o = __offset(34); return o != 0 ? (long)bb.getInt(o + bb_pos) & 0xFFFFFFFFL : 0L; }\n  public boolean hasMaybeU32() { return 0 != __offset(36); }\n  public long maybeU32() { int o = __offset(36); return o != 0 ? (long)bb.getInt(o + bb_pos) & 0xFFFFFFFFL : 0L; }\n  public long defaultU32() { int o = __offset(38); return o != 0 ? (long)bb.getInt(o + bb_pos) & 0xFFFFFFFFL : 42L; }\n  public long justI64() { int o = __offset(40); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }\n  public boolean hasMaybeI64() { return 0 != __offset(42); }\n  public long maybeI64() { int o = __offset(42); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }\n  public long defaultI64() { int o = __offset(44); return o != 0 ? bb.getLong(o + bb_pos) : 42L; }\n  public long justU64() { int o = __offset(46); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }\n  public boolean hasMaybeU64() { return 0 != __offset(48); }\n  public long maybeU64() { int o = __offset(48); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }\n  public long defaultU64() { int o = __offset(50); return o != 0 ? bb.getLong(o + bb_pos) : 42L; }\n  public float justF32() { int o = __offset(52); return o != 0 ? bb.getFloat(o + bb_pos) : 0.0f; }\n  public boolean hasMaybeF32() { return 0 != __offset(54); }\n  public float maybeF32() { int o = __offset(54); return o != 0 ? bb.getFloat(o + bb_pos) : 0f; }\n  public float defaultF32() { int o = __offset(56); return o != 0 ? bb.getFloat(o + bb_pos) : 42.0f; }\n  public double justF64() { int o = __offset(58); return o != 0 ? bb.getDouble(o + bb_pos) : 0.0; }\n  public boolean hasMaybeF64() { return 0 != __offset(60); }\n  public double maybeF64() { int o = __offset(60); return o != 0 ? bb.getDouble(o + bb_pos) : 0.0; }\n  public double defaultF64() { int o = __offset(62); return o != 0 ? bb.getDouble(o + bb_pos) : 42.0; }\n  public boolean justBool() { int o = __offset(64); return o != 0 ? 0!=bb.get(o + bb_pos) : false; }\n  public boolean hasMaybeBool() { return 0 != __offset(66); }\n  public boolean maybeBool() { int o = __offset(66); return o != 0 ? 0!=bb.get(o + bb_pos) : false; }\n  public boolean defaultBool() { int o = __offset(68); return o != 0 ? 0!=bb.get(o + bb_pos) : true; }\n  public byte justEnum() { int o = __offset(70); return o != 0 ? bb.get(o + bb_pos) : 0; }\n  public boolean hasMaybeEnum() { return 0 != __offset(72); }\n  public byte maybeEnum() { int o = __offset(72); return o != 0 ? bb.get(o + bb_pos) : 0; }\n  public byte defaultEnum() { int o = __offset(74); return o != 0 ? bb.get(o + bb_pos) : 1; }\n\n  public static int createScalarStuff(FlatBufferBuilder builder,\n      byte justI8,\n      byte maybeI8,\n      byte defaultI8,\n      int justU8,\n      int maybeU8,\n      int defaultU8,\n      short justI16,\n      short maybeI16,\n      short defaultI16,\n      int justU16,\n      int maybeU16,\n      int defaultU16,\n      int justI32,\n      int maybeI32,\n      int defaultI32,\n      long justU32,\n      long maybeU32,\n      long defaultU32,\n      long justI64,\n      long maybeI64,\n      long defaultI64,\n      long justU64,\n      long maybeU64,\n      long defaultU64,\n      float justF32,\n      float maybeF32,\n      float defaultF32,\n      double justF64,\n      double maybeF64,\n      double defaultF64,\n      boolean justBool,\n      boolean maybeBool,\n      boolean defaultBool,\n      byte justEnum,\n      byte maybeEnum,\n      byte defaultEnum) {\n    builder.startTable(36);\n    ScalarStuff.addDefaultF64(builder, defaultF64);\n    ScalarStuff.addMaybeF64(builder, maybeF64);\n    ScalarStuff.addJustF64(builder, justF64);\n    ScalarStuff.addDefaultU64(builder, defaultU64);\n    ScalarStuff.addMaybeU64(builder, maybeU64);\n    ScalarStuff.addJustU64(builder, justU64);\n    ScalarStuff.addDefaultI64(builder, defaultI64);\n    ScalarStuff.addMaybeI64(builder, maybeI64);\n    ScalarStuff.addJustI64(builder, justI64);\n    ScalarStuff.addDefaultF32(builder, defaultF32);\n    ScalarStuff.addMaybeF32(builder, maybeF32);\n    ScalarStuff.addJustF32(builder, justF32);\n    ScalarStuff.addDefaultU32(builder, defaultU32);\n    ScalarStuff.addMaybeU32(builder, maybeU32);\n    ScalarStuff.addJustU32(builder, justU32);\n    ScalarStuff.addDefaultI32(builder, defaultI32);\n    ScalarStuff.addMaybeI32(builder, maybeI32);\n    ScalarStuff.addJustI32(builder, justI32);\n    ScalarStuff.addDefaultU16(builder, defaultU16);\n    ScalarStuff.addMaybeU16(builder, maybeU16);\n    ScalarStuff.addJustU16(builder, justU16);\n    ScalarStuff.addDefaultI16(builder, defaultI16);\n    ScalarStuff.addMaybeI16(builder, maybeI16);\n    ScalarStuff.addJustI16(builder, justI16);\n    ScalarStuff.addDefaultEnum(builder, defaultEnum);\n    ScalarStuff.addMaybeEnum(builder, maybeEnum);\n    ScalarStuff.addJustEnum(builder, justEnum);\n    ScalarStuff.addDefaultBool(builder, defaultBool);\n    ScalarStuff.addMaybeBool(builder, maybeBool);\n    ScalarStuff.addJustBool(builder, justBool);\n    ScalarStuff.addDefaultU8(builder, defaultU8);\n    ScalarStuff.addMaybeU8(builder, maybeU8);\n    ScalarStuff.addJustU8(builder, justU8);\n    ScalarStuff.addDefaultI8(builder, defaultI8);\n    ScalarStuff.addMaybeI8(builder, maybeI8);\n    ScalarStuff.addJustI8(builder, justI8);\n    return ScalarStuff.endScalarStuff(builder);\n  }\n\n  public static void startScalarStuff(FlatBufferBuilder builder) { builder.startTable(36); }\n  public static void addJustI8(FlatBufferBuilder builder, byte justI8) { builder.addByte(0, justI8, 0); }\n  public static void addMaybeI8(FlatBufferBuilder builder, byte maybeI8) { builder.addByte(1, maybeI8, 0); }\n  public static void addDefaultI8(FlatBufferBuilder builder, byte defaultI8) { builder.addByte(2, defaultI8, 42); }\n  public static void addJustU8(FlatBufferBuilder builder, int justU8) { builder.addByte(3, (byte) justU8, (byte) 0); }\n  public static void addMaybeU8(FlatBufferBuilder builder, int maybeU8) { builder.addByte(4, (byte) maybeU8, (byte) 0); }\n  public static void addDefaultU8(FlatBufferBuilder builder, int defaultU8) { builder.addByte(5, (byte) defaultU8, (byte) 42); }\n  public static void addJustI16(FlatBufferBuilder builder, short justI16) { builder.addShort(6, justI16, 0); }\n  public static void addMaybeI16(FlatBufferBuilder builder, short maybeI16) { builder.addShort(7, maybeI16, 0); }\n  public static void addDefaultI16(FlatBufferBuilder builder, short defaultI16) { builder.addShort(8, defaultI16, 42); }\n  public static void addJustU16(FlatBufferBuilder builder, int justU16) { builder.addShort(9, (short) justU16, (short) 0); }\n  public static void addMaybeU16(FlatBufferBuilder builder, int maybeU16) { builder.addShort(10, (short) maybeU16, (short) 0); }\n  public static void addDefaultU16(FlatBufferBuilder builder, int defaultU16) { builder.addShort(11, (short) defaultU16, (short) 42); }\n  public static void addJustI32(FlatBufferBuilder builder, int justI32) { builder.addInt(12, justI32, 0); }\n  public static void addMaybeI32(FlatBufferBuilder builder, int maybeI32) { builder.addInt(13, maybeI32, 0); }\n  public static void addDefaultI32(FlatBufferBuilder builder, int defaultI32) { builder.addInt(14, defaultI32, 42); }\n  public static void addJustU32(FlatBufferBuilder builder, long justU32) { builder.addInt(15, (int) justU32, (int) 0L); }\n  public static void addMaybeU32(FlatBufferBuilder builder, long maybeU32) { builder.addInt(16, (int) maybeU32, (int) 0L); }\n  public static void addDefaultU32(FlatBufferBuilder builder, long defaultU32) { builder.addInt(17, (int) defaultU32, (int) 42L); }\n  public static void addJustI64(FlatBufferBuilder builder, long justI64) { builder.addLong(18, justI64, 0L); }\n  public static void addMaybeI64(FlatBufferBuilder builder, long maybeI64) { builder.addLong(19, maybeI64, 0L); }\n  public static void addDefaultI64(FlatBufferBuilder builder, long defaultI64) { builder.addLong(20, defaultI64, 42L); }\n  public static void addJustU64(FlatBufferBuilder builder, long justU64) { builder.addLong(21, justU64, 0L); }\n  public static void addMaybeU64(FlatBufferBuilder builder, long maybeU64) { builder.addLong(22, maybeU64, 0L); }\n  public static void addDefaultU64(FlatBufferBuilder builder, long defaultU64) { builder.addLong(23, defaultU64, 42L); }\n  public static void addJustF32(FlatBufferBuilder builder, float justF32) { builder.addFloat(24, justF32, 0.0f); }\n  public static void addMaybeF32(FlatBufferBuilder builder, float maybeF32) { builder.addFloat(25, maybeF32, 0f); }\n  public static void addDefaultF32(FlatBufferBuilder builder, float defaultF32) { builder.addFloat(26, defaultF32, 42.0f); }\n  public static void addJustF64(FlatBufferBuilder builder, double justF64) { builder.addDouble(27, justF64, 0.0); }\n  public static void addMaybeF64(FlatBufferBuilder builder, double maybeF64) { builder.addDouble(28, maybeF64, 0.0); }\n  public static void addDefaultF64(FlatBufferBuilder builder, double defaultF64) { builder.addDouble(29, defaultF64, 42.0); }\n  public static void addJustBool(FlatBufferBuilder builder, boolean justBool) { builder.addBoolean(30, justBool, false); }\n  public static void addMaybeBool(FlatBufferBuilder builder, boolean maybeBool) { builder.addBoolean(31, maybeBool, false); }\n  public static void addDefaultBool(FlatBufferBuilder builder, boolean defaultBool) { builder.addBoolean(32, defaultBool, true); }\n  public static void addJustEnum(FlatBufferBuilder builder, byte justEnum) { builder.addByte(33, justEnum, 0); }\n  public static void addMaybeEnum(FlatBufferBuilder builder, byte maybeEnum) { builder.addByte(34, maybeEnum, 0); }\n  public static void addDefaultEnum(FlatBufferBuilder builder, byte defaultEnum) { builder.addByte(35, defaultEnum, 1); }\n  public static int endScalarStuff(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    return o;\n  }\n  public static void finishScalarStuffBuffer(FlatBufferBuilder builder, int offset) { builder.finish(offset, \"NULL\"); }\n  public static void finishSizePrefixedScalarStuffBuffer(FlatBufferBuilder builder, int offset) { builder.finishSizePrefixed(offset, \"NULL\"); }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public ScalarStuff get(int j) { return get(new ScalarStuff(), j); }\n    public ScalarStuff get(ScalarStuff obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); }\n  }\n}\n\n"
  },
  {
    "path": "tests/optional_scalars/ScalarStuff.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\npackage optional_scalars\n\nimport com.google.flatbuffers.BaseVector\nimport com.google.flatbuffers.BooleanVector\nimport com.google.flatbuffers.ByteVector\nimport com.google.flatbuffers.Constants\nimport com.google.flatbuffers.DoubleVector\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.FloatVector\nimport com.google.flatbuffers.LongVector\nimport com.google.flatbuffers.StringVector\nimport com.google.flatbuffers.Struct\nimport com.google.flatbuffers.Table\nimport com.google.flatbuffers.UnionVector\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport kotlin.math.sign\n\n@Suppress(\"unused\")\nclass ScalarStuff : Table() {\n\n    fun __init(_i: Int, _bb: ByteBuffer)  {\n        __reset(_i, _bb)\n    }\n    fun __assign(_i: Int, _bb: ByteBuffer) : ScalarStuff {\n        __init(_i, _bb)\n        return this\n    }\n    val justI8 : Byte\n        get() {\n            val o = __offset(4)\n            return if(o != 0) bb.get(o + bb_pos) else 0\n        }\n    val maybeI8 : Byte?\n        get() {\n            val o = __offset(6)\n            return if(o != 0) bb.get(o + bb_pos) else null\n        }\n    val defaultI8 : Byte\n        get() {\n            val o = __offset(8)\n            return if(o != 0) bb.get(o + bb_pos) else 42\n        }\n    val justU8 : UByte\n        get() {\n            val o = __offset(10)\n            return if(o != 0) bb.get(o + bb_pos).toUByte() else 0u\n        }\n    val maybeU8 : UByte?\n        get() {\n            val o = __offset(12)\n            return if(o != 0) bb.get(o + bb_pos).toUByte() else null\n        }\n    val defaultU8 : UByte\n        get() {\n            val o = __offset(14)\n            return if(o != 0) bb.get(o + bb_pos).toUByte() else 42u\n        }\n    val justI16 : Short\n        get() {\n            val o = __offset(16)\n            return if(o != 0) bb.getShort(o + bb_pos) else 0\n        }\n    val maybeI16 : Short?\n        get() {\n            val o = __offset(18)\n            return if(o != 0) bb.getShort(o + bb_pos) else null\n        }\n    val defaultI16 : Short\n        get() {\n            val o = __offset(20)\n            return if(o != 0) bb.getShort(o + bb_pos) else 42\n        }\n    val justU16 : UShort\n        get() {\n            val o = __offset(22)\n            return if(o != 0) bb.getShort(o + bb_pos).toUShort() else 0u\n        }\n    val maybeU16 : UShort?\n        get() {\n            val o = __offset(24)\n            return if(o != 0) bb.getShort(o + bb_pos).toUShort() else null\n        }\n    val defaultU16 : UShort\n        get() {\n            val o = __offset(26)\n            return if(o != 0) bb.getShort(o + bb_pos).toUShort() else 42u\n        }\n    val justI32 : Int\n        get() {\n            val o = __offset(28)\n            return if(o != 0) bb.getInt(o + bb_pos) else 0\n        }\n    val maybeI32 : Int?\n        get() {\n            val o = __offset(30)\n            return if(o != 0) bb.getInt(o + bb_pos) else null\n        }\n    val defaultI32 : Int\n        get() {\n            val o = __offset(32)\n            return if(o != 0) bb.getInt(o + bb_pos) else 42\n        }\n    val justU32 : UInt\n        get() {\n            val o = __offset(34)\n            return if(o != 0) bb.getInt(o + bb_pos).toUInt() else 0u\n        }\n    val maybeU32 : UInt?\n        get() {\n            val o = __offset(36)\n            return if(o != 0) bb.getInt(o + bb_pos).toUInt() else null\n        }\n    val defaultU32 : UInt\n        get() {\n            val o = __offset(38)\n            return if(o != 0) bb.getInt(o + bb_pos).toUInt() else 42u\n        }\n    val justI64 : Long\n        get() {\n            val o = __offset(40)\n            return if(o != 0) bb.getLong(o + bb_pos) else 0L\n        }\n    val maybeI64 : Long?\n        get() {\n            val o = __offset(42)\n            return if(o != 0) bb.getLong(o + bb_pos) else null\n        }\n    val defaultI64 : Long\n        get() {\n            val o = __offset(44)\n            return if(o != 0) bb.getLong(o + bb_pos) else 42L\n        }\n    val justU64 : ULong\n        get() {\n            val o = __offset(46)\n            return if(o != 0) bb.getLong(o + bb_pos).toULong() else 0UL\n        }\n    val maybeU64 : ULong?\n        get() {\n            val o = __offset(48)\n            return if(o != 0) bb.getLong(o + bb_pos).toULong() else null\n        }\n    val defaultU64 : ULong\n        get() {\n            val o = __offset(50)\n            return if(o != 0) bb.getLong(o + bb_pos).toULong() else 42UL\n        }\n    val justF32 : Float\n        get() {\n            val o = __offset(52)\n            return if(o != 0) bb.getFloat(o + bb_pos) else 0.0f\n        }\n    val maybeF32 : Float?\n        get() {\n            val o = __offset(54)\n            return if(o != 0) bb.getFloat(o + bb_pos) else null\n        }\n    val defaultF32 : Float\n        get() {\n            val o = __offset(56)\n            return if(o != 0) bb.getFloat(o + bb_pos) else 42.0f\n        }\n    val justF64 : Double\n        get() {\n            val o = __offset(58)\n            return if(o != 0) bb.getDouble(o + bb_pos) else 0.0\n        }\n    val maybeF64 : Double?\n        get() {\n            val o = __offset(60)\n            return if(o != 0) bb.getDouble(o + bb_pos) else null\n        }\n    val defaultF64 : Double\n        get() {\n            val o = __offset(62)\n            return if(o != 0) bb.getDouble(o + bb_pos) else 42.0\n        }\n    val justBool : Boolean\n        get() {\n            val o = __offset(64)\n            return if(o != 0) 0.toByte() != bb.get(o + bb_pos) else false\n        }\n    val maybeBool : Boolean?\n        get() {\n            val o = __offset(66)\n            return if(o != 0) 0.toByte() != bb.get(o + bb_pos) else null\n        }\n    val defaultBool : Boolean\n        get() {\n            val o = __offset(68)\n            return if(o != 0) 0.toByte() != bb.get(o + bb_pos) else true\n        }\n    val justEnum : Byte\n        get() {\n            val o = __offset(70)\n            return if(o != 0) bb.get(o + bb_pos) else 0\n        }\n    val maybeEnum : Byte?\n        get() {\n            val o = __offset(72)\n            return if(o != 0) bb.get(o + bb_pos) else null\n        }\n    val defaultEnum : Byte\n        get() {\n            val o = __offset(74)\n            return if(o != 0) bb.get(o + bb_pos) else 1\n        }\n    companion object {\n        fun validateVersion() = Constants.FLATBUFFERS_25_12_19()\n        fun getRootAsScalarStuff(_bb: ByteBuffer): ScalarStuff = getRootAsScalarStuff(_bb, ScalarStuff())\n        fun getRootAsScalarStuff(_bb: ByteBuffer, obj: ScalarStuff): ScalarStuff {\n            _bb.order(ByteOrder.LITTLE_ENDIAN)\n            return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb))\n        }\n        fun ScalarStuffBufferHasIdentifier(_bb: ByteBuffer) : Boolean = __has_identifier(_bb, \"NULL\")\n        fun createScalarStuff(builder: FlatBufferBuilder, justI8: Byte, maybeI8: Byte?, defaultI8: Byte, justU8: UByte, maybeU8: UByte?, defaultU8: UByte, justI16: Short, maybeI16: Short?, defaultI16: Short, justU16: UShort, maybeU16: UShort?, defaultU16: UShort, justI32: Int, maybeI32: Int?, defaultI32: Int, justU32: UInt, maybeU32: UInt?, defaultU32: UInt, justI64: Long, maybeI64: Long?, defaultI64: Long, justU64: ULong, maybeU64: ULong?, defaultU64: ULong, justF32: Float, maybeF32: Float?, defaultF32: Float, justF64: Double, maybeF64: Double?, defaultF64: Double, justBool: Boolean, maybeBool: Boolean?, defaultBool: Boolean, justEnum: Byte, maybeEnum: Byte?, defaultEnum: Byte) : Int {\n            builder.startTable(36)\n            addDefaultF64(builder, defaultF64)\n            maybeF64?.run { addMaybeF64(builder, maybeF64) }\n            addJustF64(builder, justF64)\n            addDefaultU64(builder, defaultU64)\n            maybeU64?.run { addMaybeU64(builder, maybeU64) }\n            addJustU64(builder, justU64)\n            addDefaultI64(builder, defaultI64)\n            maybeI64?.run { addMaybeI64(builder, maybeI64) }\n            addJustI64(builder, justI64)\n            addDefaultF32(builder, defaultF32)\n            maybeF32?.run { addMaybeF32(builder, maybeF32) }\n            addJustF32(builder, justF32)\n            addDefaultU32(builder, defaultU32)\n            maybeU32?.run { addMaybeU32(builder, maybeU32) }\n            addJustU32(builder, justU32)\n            addDefaultI32(builder, defaultI32)\n            maybeI32?.run { addMaybeI32(builder, maybeI32) }\n            addJustI32(builder, justI32)\n            addDefaultU16(builder, defaultU16)\n            maybeU16?.run { addMaybeU16(builder, maybeU16) }\n            addJustU16(builder, justU16)\n            addDefaultI16(builder, defaultI16)\n            maybeI16?.run { addMaybeI16(builder, maybeI16) }\n            addJustI16(builder, justI16)\n            addDefaultEnum(builder, defaultEnum)\n            maybeEnum?.run { addMaybeEnum(builder, maybeEnum) }\n            addJustEnum(builder, justEnum)\n            addDefaultBool(builder, defaultBool)\n            maybeBool?.run { addMaybeBool(builder, maybeBool) }\n            addJustBool(builder, justBool)\n            addDefaultU8(builder, defaultU8)\n            maybeU8?.run { addMaybeU8(builder, maybeU8) }\n            addJustU8(builder, justU8)\n            addDefaultI8(builder, defaultI8)\n            maybeI8?.run { addMaybeI8(builder, maybeI8) }\n            addJustI8(builder, justI8)\n            return endScalarStuff(builder)\n        }\n        fun startScalarStuff(builder: FlatBufferBuilder) = builder.startTable(36)\n        fun addJustI8(builder: FlatBufferBuilder, justI8: Byte) = builder.addByte(0, justI8, 0)\n        fun addMaybeI8(builder: FlatBufferBuilder, maybeI8: Byte) = builder.addByte(1, maybeI8, 0)\n        fun addDefaultI8(builder: FlatBufferBuilder, defaultI8: Byte) = builder.addByte(2, defaultI8, 42)\n        fun addJustU8(builder: FlatBufferBuilder, justU8: UByte) = builder.addByte(3, justU8.toByte(), 0)\n        fun addMaybeU8(builder: FlatBufferBuilder, maybeU8: UByte) = builder.addByte(4, maybeU8.toByte(), 0)\n        fun addDefaultU8(builder: FlatBufferBuilder, defaultU8: UByte) = builder.addByte(5, defaultU8.toByte(), 42)\n        fun addJustI16(builder: FlatBufferBuilder, justI16: Short) = builder.addShort(6, justI16, 0)\n        fun addMaybeI16(builder: FlatBufferBuilder, maybeI16: Short) = builder.addShort(7, maybeI16, 0)\n        fun addDefaultI16(builder: FlatBufferBuilder, defaultI16: Short) = builder.addShort(8, defaultI16, 42)\n        fun addJustU16(builder: FlatBufferBuilder, justU16: UShort) = builder.addShort(9, justU16.toShort(), 0)\n        fun addMaybeU16(builder: FlatBufferBuilder, maybeU16: UShort) = builder.addShort(10, maybeU16.toShort(), 0)\n        fun addDefaultU16(builder: FlatBufferBuilder, defaultU16: UShort) = builder.addShort(11, defaultU16.toShort(), 42)\n        fun addJustI32(builder: FlatBufferBuilder, justI32: Int) = builder.addInt(12, justI32, 0)\n        fun addMaybeI32(builder: FlatBufferBuilder, maybeI32: Int) = builder.addInt(13, maybeI32, 0)\n        fun addDefaultI32(builder: FlatBufferBuilder, defaultI32: Int) = builder.addInt(14, defaultI32, 42)\n        fun addJustU32(builder: FlatBufferBuilder, justU32: UInt) = builder.addInt(15, justU32.toInt(), 0)\n        fun addMaybeU32(builder: FlatBufferBuilder, maybeU32: UInt) = builder.addInt(16, maybeU32.toInt(), 0)\n        fun addDefaultU32(builder: FlatBufferBuilder, defaultU32: UInt) = builder.addInt(17, defaultU32.toInt(), 42)\n        fun addJustI64(builder: FlatBufferBuilder, justI64: Long) = builder.addLong(18, justI64, 0L)\n        fun addMaybeI64(builder: FlatBufferBuilder, maybeI64: Long) = builder.addLong(19, maybeI64, 0)\n        fun addDefaultI64(builder: FlatBufferBuilder, defaultI64: Long) = builder.addLong(20, defaultI64, 42L)\n        fun addJustU64(builder: FlatBufferBuilder, justU64: ULong) = builder.addLong(21, justU64.toLong(), 0)\n        fun addMaybeU64(builder: FlatBufferBuilder, maybeU64: ULong) = builder.addLong(22, maybeU64.toLong(), 0)\n        fun addDefaultU64(builder: FlatBufferBuilder, defaultU64: ULong) = builder.addLong(23, defaultU64.toLong(), 42)\n        fun addJustF32(builder: FlatBufferBuilder, justF32: Float) = builder.addFloat(24, justF32, 0.0)\n        fun addMaybeF32(builder: FlatBufferBuilder, maybeF32: Float) = builder.addFloat(25, maybeF32, 0.0)\n        fun addDefaultF32(builder: FlatBufferBuilder, defaultF32: Float) = builder.addFloat(26, defaultF32, 42.0)\n        fun addJustF64(builder: FlatBufferBuilder, justF64: Double) = builder.addDouble(27, justF64, 0.0)\n        fun addMaybeF64(builder: FlatBufferBuilder, maybeF64: Double) = builder.addDouble(28, maybeF64, 0.0)\n        fun addDefaultF64(builder: FlatBufferBuilder, defaultF64: Double) = builder.addDouble(29, defaultF64, 42.0)\n        fun addJustBool(builder: FlatBufferBuilder, justBool: Boolean) = builder.addBoolean(30, justBool, false)\n        fun addMaybeBool(builder: FlatBufferBuilder, maybeBool: Boolean) = builder.addBoolean(31, maybeBool, false)\n        fun addDefaultBool(builder: FlatBufferBuilder, defaultBool: Boolean) = builder.addBoolean(32, defaultBool, true)\n        fun addJustEnum(builder: FlatBufferBuilder, justEnum: Byte) = builder.addByte(33, justEnum, 0)\n        fun addMaybeEnum(builder: FlatBufferBuilder, maybeEnum: Byte) = builder.addByte(34, maybeEnum, 0)\n        fun addDefaultEnum(builder: FlatBufferBuilder, defaultEnum: Byte) = builder.addByte(35, defaultEnum, 1)\n        fun endScalarStuff(builder: FlatBufferBuilder) : Int {\n            val o = builder.endTable()\n            return o\n        }\n        fun finishScalarStuffBuffer(builder: FlatBufferBuilder, offset: Int) = builder.finish(offset, \"NULL\")\n        fun finishSizePrefixedScalarStuffBuffer(builder: FlatBufferBuilder, offset: Int) = builder.finishSizePrefixed(offset, \"NULL\")\n    }\n}\n"
  },
  {
    "path": "tests/optional_scalars/ScalarStuff.nim",
    "content": "#[ optional_scalars.ScalarStuff\n  Automatically generated by the FlatBuffers compiler, do not modify.\n  Or modify. I'm a message, not a cop.\n\n  flatc version: 25.12.19\n\n  Declared by  : \n  Rooting type : optional_scalars.ScalarStuff ()\n]#\n\nimport OptionalByte as optional_scalars_OptionalByte\nimport flatbuffers\nimport std/options\n\ntype ScalarStuff* = object of FlatObj\nfunc justI8*(self: ScalarStuff): int8 =\n  let o = self.tab.Offset(4)\n  if o != 0:\n    return Get[int8](self.tab, self.tab.Pos + o)\n  return 0\nfunc `justI8=`*(self: var ScalarStuff, n: int8): bool =\n  return self.tab.MutateSlot(4, n)\nfunc maybeI8*(self: ScalarStuff): Option[int8] =\n  let o = self.tab.Offset(6)\n  if o != 0:\n    return some(Get[int8](self.tab, self.tab.Pos + o))\nfunc `maybeI8=`*(self: var ScalarStuff, n: Option[int8]): bool =\n  return self.tab.MutateSlot(6, n)\nfunc defaultI8*(self: ScalarStuff): int8 =\n  let o = self.tab.Offset(8)\n  if o != 0:\n    return Get[int8](self.tab, self.tab.Pos + o)\n  return 42\nfunc `defaultI8=`*(self: var ScalarStuff, n: int8): bool =\n  return self.tab.MutateSlot(8, n)\nfunc justU8*(self: ScalarStuff): uint8 =\n  let o = self.tab.Offset(10)\n  if o != 0:\n    return Get[uint8](self.tab, self.tab.Pos + o)\n  return 0\nfunc `justU8=`*(self: var ScalarStuff, n: uint8): bool =\n  return self.tab.MutateSlot(10, n)\nfunc maybeU8*(self: ScalarStuff): Option[uint8] =\n  let o = self.tab.Offset(12)\n  if o != 0:\n    return some(Get[uint8](self.tab, self.tab.Pos + o))\nfunc `maybeU8=`*(self: var ScalarStuff, n: Option[uint8]): bool =\n  return self.tab.MutateSlot(12, n)\nfunc defaultU8*(self: ScalarStuff): uint8 =\n  let o = self.tab.Offset(14)\n  if o != 0:\n    return Get[uint8](self.tab, self.tab.Pos + o)\n  return 42\nfunc `defaultU8=`*(self: var ScalarStuff, n: uint8): bool =\n  return self.tab.MutateSlot(14, n)\nfunc justI16*(self: ScalarStuff): int16 =\n  let o = self.tab.Offset(16)\n  if o != 0:\n    return Get[int16](self.tab, self.tab.Pos + o)\n  return 0\nfunc `justI16=`*(self: var ScalarStuff, n: int16): bool =\n  return self.tab.MutateSlot(16, n)\nfunc maybeI16*(self: ScalarStuff): Option[int16] =\n  let o = self.tab.Offset(18)\n  if o != 0:\n    return some(Get[int16](self.tab, self.tab.Pos + o))\nfunc `maybeI16=`*(self: var ScalarStuff, n: Option[int16]): bool =\n  return self.tab.MutateSlot(18, n)\nfunc defaultI16*(self: ScalarStuff): int16 =\n  let o = self.tab.Offset(20)\n  if o != 0:\n    return Get[int16](self.tab, self.tab.Pos + o)\n  return 42\nfunc `defaultI16=`*(self: var ScalarStuff, n: int16): bool =\n  return self.tab.MutateSlot(20, n)\nfunc justU16*(self: ScalarStuff): uint16 =\n  let o = self.tab.Offset(22)\n  if o != 0:\n    return Get[uint16](self.tab, self.tab.Pos + o)\n  return 0\nfunc `justU16=`*(self: var ScalarStuff, n: uint16): bool =\n  return self.tab.MutateSlot(22, n)\nfunc maybeU16*(self: ScalarStuff): Option[uint16] =\n  let o = self.tab.Offset(24)\n  if o != 0:\n    return some(Get[uint16](self.tab, self.tab.Pos + o))\nfunc `maybeU16=`*(self: var ScalarStuff, n: Option[uint16]): bool =\n  return self.tab.MutateSlot(24, n)\nfunc defaultU16*(self: ScalarStuff): uint16 =\n  let o = self.tab.Offset(26)\n  if o != 0:\n    return Get[uint16](self.tab, self.tab.Pos + o)\n  return 42\nfunc `defaultU16=`*(self: var ScalarStuff, n: uint16): bool =\n  return self.tab.MutateSlot(26, n)\nfunc justI32*(self: ScalarStuff): int32 =\n  let o = self.tab.Offset(28)\n  if o != 0:\n    return Get[int32](self.tab, self.tab.Pos + o)\n  return 0\nfunc `justI32=`*(self: var ScalarStuff, n: int32): bool =\n  return self.tab.MutateSlot(28, n)\nfunc maybeI32*(self: ScalarStuff): Option[int32] =\n  let o = self.tab.Offset(30)\n  if o != 0:\n    return some(Get[int32](self.tab, self.tab.Pos + o))\nfunc `maybeI32=`*(self: var ScalarStuff, n: Option[int32]): bool =\n  return self.tab.MutateSlot(30, n)\nfunc defaultI32*(self: ScalarStuff): int32 =\n  let o = self.tab.Offset(32)\n  if o != 0:\n    return Get[int32](self.tab, self.tab.Pos + o)\n  return 42\nfunc `defaultI32=`*(self: var ScalarStuff, n: int32): bool =\n  return self.tab.MutateSlot(32, n)\nfunc justU32*(self: ScalarStuff): uint32 =\n  let o = self.tab.Offset(34)\n  if o != 0:\n    return Get[uint32](self.tab, self.tab.Pos + o)\n  return 0\nfunc `justU32=`*(self: var ScalarStuff, n: uint32): bool =\n  return self.tab.MutateSlot(34, n)\nfunc maybeU32*(self: ScalarStuff): Option[uint32] =\n  let o = self.tab.Offset(36)\n  if o != 0:\n    return some(Get[uint32](self.tab, self.tab.Pos + o))\nfunc `maybeU32=`*(self: var ScalarStuff, n: Option[uint32]): bool =\n  return self.tab.MutateSlot(36, n)\nfunc defaultU32*(self: ScalarStuff): uint32 =\n  let o = self.tab.Offset(38)\n  if o != 0:\n    return Get[uint32](self.tab, self.tab.Pos + o)\n  return 42\nfunc `defaultU32=`*(self: var ScalarStuff, n: uint32): bool =\n  return self.tab.MutateSlot(38, n)\nfunc justI64*(self: ScalarStuff): int64 =\n  let o = self.tab.Offset(40)\n  if o != 0:\n    return Get[int64](self.tab, self.tab.Pos + o)\n  return 0\nfunc `justI64=`*(self: var ScalarStuff, n: int64): bool =\n  return self.tab.MutateSlot(40, n)\nfunc maybeI64*(self: ScalarStuff): Option[int64] =\n  let o = self.tab.Offset(42)\n  if o != 0:\n    return some(Get[int64](self.tab, self.tab.Pos + o))\nfunc `maybeI64=`*(self: var ScalarStuff, n: Option[int64]): bool =\n  return self.tab.MutateSlot(42, n)\nfunc defaultI64*(self: ScalarStuff): int64 =\n  let o = self.tab.Offset(44)\n  if o != 0:\n    return Get[int64](self.tab, self.tab.Pos + o)\n  return 42\nfunc `defaultI64=`*(self: var ScalarStuff, n: int64): bool =\n  return self.tab.MutateSlot(44, n)\nfunc justU64*(self: ScalarStuff): uint64 =\n  let o = self.tab.Offset(46)\n  if o != 0:\n    return Get[uint64](self.tab, self.tab.Pos + o)\n  return 0\nfunc `justU64=`*(self: var ScalarStuff, n: uint64): bool =\n  return self.tab.MutateSlot(46, n)\nfunc maybeU64*(self: ScalarStuff): Option[uint64] =\n  let o = self.tab.Offset(48)\n  if o != 0:\n    return some(Get[uint64](self.tab, self.tab.Pos + o))\nfunc `maybeU64=`*(self: var ScalarStuff, n: Option[uint64]): bool =\n  return self.tab.MutateSlot(48, n)\nfunc defaultU64*(self: ScalarStuff): uint64 =\n  let o = self.tab.Offset(50)\n  if o != 0:\n    return Get[uint64](self.tab, self.tab.Pos + o)\n  return 42\nfunc `defaultU64=`*(self: var ScalarStuff, n: uint64): bool =\n  return self.tab.MutateSlot(50, n)\nfunc justF32*(self: ScalarStuff): float32 =\n  let o = self.tab.Offset(52)\n  if o != 0:\n    return Get[float32](self.tab, self.tab.Pos + o)\n  return 0.0\nfunc `justF32=`*(self: var ScalarStuff, n: float32): bool =\n  return self.tab.MutateSlot(52, n)\nfunc maybeF32*(self: ScalarStuff): Option[float32] =\n  let o = self.tab.Offset(54)\n  if o != 0:\n    return some(Get[float32](self.tab, self.tab.Pos + o))\nfunc `maybeF32=`*(self: var ScalarStuff, n: Option[float32]): bool =\n  return self.tab.MutateSlot(54, n)\nfunc defaultF32*(self: ScalarStuff): float32 =\n  let o = self.tab.Offset(56)\n  if o != 0:\n    return Get[float32](self.tab, self.tab.Pos + o)\n  return 42.0\nfunc `defaultF32=`*(self: var ScalarStuff, n: float32): bool =\n  return self.tab.MutateSlot(56, n)\nfunc justF64*(self: ScalarStuff): float64 =\n  let o = self.tab.Offset(58)\n  if o != 0:\n    return Get[float64](self.tab, self.tab.Pos + o)\n  return 0.0\nfunc `justF64=`*(self: var ScalarStuff, n: float64): bool =\n  return self.tab.MutateSlot(58, n)\nfunc maybeF64*(self: ScalarStuff): Option[float64] =\n  let o = self.tab.Offset(60)\n  if o != 0:\n    return some(Get[float64](self.tab, self.tab.Pos + o))\nfunc `maybeF64=`*(self: var ScalarStuff, n: Option[float64]): bool =\n  return self.tab.MutateSlot(60, n)\nfunc defaultF64*(self: ScalarStuff): float64 =\n  let o = self.tab.Offset(62)\n  if o != 0:\n    return Get[float64](self.tab, self.tab.Pos + o)\n  return 42.0\nfunc `defaultF64=`*(self: var ScalarStuff, n: float64): bool =\n  return self.tab.MutateSlot(62, n)\nfunc justBool*(self: ScalarStuff): bool =\n  let o = self.tab.Offset(64)\n  if o != 0:\n    return Get[bool](self.tab, self.tab.Pos + o)\n  return false\nfunc `justBool=`*(self: var ScalarStuff, n: bool): bool =\n  return self.tab.MutateSlot(64, n)\nfunc maybeBool*(self: ScalarStuff): Option[bool] =\n  let o = self.tab.Offset(66)\n  if o != 0:\n    return some(Get[bool](self.tab, self.tab.Pos + o))\nfunc `maybeBool=`*(self: var ScalarStuff, n: Option[bool]): bool =\n  return self.tab.MutateSlot(66, n)\nfunc defaultBool*(self: ScalarStuff): bool =\n  let o = self.tab.Offset(68)\n  if o != 0:\n    return Get[bool](self.tab, self.tab.Pos + o)\n  return true\nfunc `defaultBool=`*(self: var ScalarStuff, n: bool): bool =\n  return self.tab.MutateSlot(68, n)\nfunc justEnum*(self: ScalarStuff): optional_scalars_OptionalByte.OptionalByte =\n  let o = self.tab.Offset(70)\n  if o != 0:\n    return optional_scalars_OptionalByte.OptionalByte(Get[int8](self.tab, self.tab.Pos + o))\n  return type(result)(0)\nfunc `justEnum=`*(self: var ScalarStuff, n: optional_scalars_OptionalByte.OptionalByte): bool =\n  return self.tab.MutateSlot(70, n)\nfunc maybeEnum*(self: ScalarStuff): Option[optional_scalars_OptionalByte.OptionalByte] =\n  let o = self.tab.Offset(72)\n  if o != 0:\n    return some(optional_scalars_OptionalByte.OptionalByte(Get[int8](self.tab, self.tab.Pos + o)))\nfunc `maybeEnum=`*(self: var ScalarStuff, n: Option[optional_scalars_OptionalByte.OptionalByte]): bool =\n  return self.tab.MutateSlot(72, n)\nfunc defaultEnum*(self: ScalarStuff): optional_scalars_OptionalByte.OptionalByte =\n  let o = self.tab.Offset(74)\n  if o != 0:\n    return optional_scalars_OptionalByte.OptionalByte(Get[int8](self.tab, self.tab.Pos + o))\n  return type(result)(1)\nfunc `defaultEnum=`*(self: var ScalarStuff, n: optional_scalars_OptionalByte.OptionalByte): bool =\n  return self.tab.MutateSlot(74, n)\nproc ScalarStuffStart*(builder: var Builder) =\n  builder.StartObject(36)\nproc ScalarStuffAddjustI8*(builder: var Builder, justI8: int8) =\n  builder.PrependSlot(0, justI8, default(int8))\nproc ScalarStuffAddmaybeI8*(builder: var Builder, maybeI8: int8) =\n  builder.PrependSlot(1, maybeI8, default(int8))\nproc ScalarStuffAdddefaultI8*(builder: var Builder, defaultI8: int8) =\n  builder.PrependSlot(2, defaultI8, default(int8))\nproc ScalarStuffAddjustU8*(builder: var Builder, justU8: uint8) =\n  builder.PrependSlot(3, justU8, default(uint8))\nproc ScalarStuffAddmaybeU8*(builder: var Builder, maybeU8: uint8) =\n  builder.PrependSlot(4, maybeU8, default(uint8))\nproc ScalarStuffAdddefaultU8*(builder: var Builder, defaultU8: uint8) =\n  builder.PrependSlot(5, defaultU8, default(uint8))\nproc ScalarStuffAddjustI16*(builder: var Builder, justI16: int16) =\n  builder.PrependSlot(6, justI16, default(int16))\nproc ScalarStuffAddmaybeI16*(builder: var Builder, maybeI16: int16) =\n  builder.PrependSlot(7, maybeI16, default(int16))\nproc ScalarStuffAdddefaultI16*(builder: var Builder, defaultI16: int16) =\n  builder.PrependSlot(8, defaultI16, default(int16))\nproc ScalarStuffAddjustU16*(builder: var Builder, justU16: uint16) =\n  builder.PrependSlot(9, justU16, default(uint16))\nproc ScalarStuffAddmaybeU16*(builder: var Builder, maybeU16: uint16) =\n  builder.PrependSlot(10, maybeU16, default(uint16))\nproc ScalarStuffAdddefaultU16*(builder: var Builder, defaultU16: uint16) =\n  builder.PrependSlot(11, defaultU16, default(uint16))\nproc ScalarStuffAddjustI32*(builder: var Builder, justI32: int32) =\n  builder.PrependSlot(12, justI32, default(int32))\nproc ScalarStuffAddmaybeI32*(builder: var Builder, maybeI32: int32) =\n  builder.PrependSlot(13, maybeI32, default(int32))\nproc ScalarStuffAdddefaultI32*(builder: var Builder, defaultI32: int32) =\n  builder.PrependSlot(14, defaultI32, default(int32))\nproc ScalarStuffAddjustU32*(builder: var Builder, justU32: uint32) =\n  builder.PrependSlot(15, justU32, default(uint32))\nproc ScalarStuffAddmaybeU32*(builder: var Builder, maybeU32: uint32) =\n  builder.PrependSlot(16, maybeU32, default(uint32))\nproc ScalarStuffAdddefaultU32*(builder: var Builder, defaultU32: uint32) =\n  builder.PrependSlot(17, defaultU32, default(uint32))\nproc ScalarStuffAddjustI64*(builder: var Builder, justI64: int64) =\n  builder.PrependSlot(18, justI64, default(int64))\nproc ScalarStuffAddmaybeI64*(builder: var Builder, maybeI64: int64) =\n  builder.PrependSlot(19, maybeI64, default(int64))\nproc ScalarStuffAdddefaultI64*(builder: var Builder, defaultI64: int64) =\n  builder.PrependSlot(20, defaultI64, default(int64))\nproc ScalarStuffAddjustU64*(builder: var Builder, justU64: uint64) =\n  builder.PrependSlot(21, justU64, default(uint64))\nproc ScalarStuffAddmaybeU64*(builder: var Builder, maybeU64: uint64) =\n  builder.PrependSlot(22, maybeU64, default(uint64))\nproc ScalarStuffAdddefaultU64*(builder: var Builder, defaultU64: uint64) =\n  builder.PrependSlot(23, defaultU64, default(uint64))\nproc ScalarStuffAddjustF32*(builder: var Builder, justF32: float32) =\n  builder.PrependSlot(24, justF32, default(float32))\nproc ScalarStuffAddmaybeF32*(builder: var Builder, maybeF32: float32) =\n  builder.PrependSlot(25, maybeF32, default(float32))\nproc ScalarStuffAdddefaultF32*(builder: var Builder, defaultF32: float32) =\n  builder.PrependSlot(26, defaultF32, default(float32))\nproc ScalarStuffAddjustF64*(builder: var Builder, justF64: float64) =\n  builder.PrependSlot(27, justF64, default(float64))\nproc ScalarStuffAddmaybeF64*(builder: var Builder, maybeF64: float64) =\n  builder.PrependSlot(28, maybeF64, default(float64))\nproc ScalarStuffAdddefaultF64*(builder: var Builder, defaultF64: float64) =\n  builder.PrependSlot(29, defaultF64, default(float64))\nproc ScalarStuffAddjustBool*(builder: var Builder, justBool: bool) =\n  builder.PrependSlot(30, justBool, default(bool))\nproc ScalarStuffAddmaybeBool*(builder: var Builder, maybeBool: bool) =\n  builder.PrependSlot(31, maybeBool, default(bool))\nproc ScalarStuffAdddefaultBool*(builder: var Builder, defaultBool: bool) =\n  builder.PrependSlot(32, defaultBool, default(bool))\nproc ScalarStuffAddjustEnum*(builder: var Builder, justEnum: int8) =\n  builder.PrependSlot(33, justEnum, default(int8))\nproc ScalarStuffAddmaybeEnum*(builder: var Builder, maybeEnum: int8) =\n  builder.PrependSlot(34, maybeEnum, default(int8))\nproc ScalarStuffAdddefaultEnum*(builder: var Builder, defaultEnum: int8) =\n  builder.PrependSlot(35, defaultEnum, default(int8))\nproc ScalarStuffEnd*(builder: var Builder): uoffset =\n  return builder.EndObject()\n"
  },
  {
    "path": "tests/optional_scalars/ScalarStuff.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: optional_scalars\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\nclass ScalarStuff(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = ScalarStuff()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsScalarStuff(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    @classmethod\n    def ScalarStuffBufferHasIdentifier(cls, buf, offset, size_prefixed=False):\n        return flatbuffers.util.BufferHasIdentifier(buf, offset, b\"\\x4E\\x55\\x4C\\x4C\", size_prefixed=size_prefixed)\n\n    # ScalarStuff\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # ScalarStuff\n    def JustI8(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos)\n        return 0\n\n    # ScalarStuff\n    def MaybeI8(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos)\n        return None\n\n    # ScalarStuff\n    def DefaultI8(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos)\n        return 42\n\n    # ScalarStuff\n    def JustU8(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos)\n        return 0\n\n    # ScalarStuff\n    def MaybeU8(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos)\n        return None\n\n    # ScalarStuff\n    def DefaultU8(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos)\n        return 42\n\n    # ScalarStuff\n    def JustI16(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int16Flags, o + self._tab.Pos)\n        return 0\n\n    # ScalarStuff\n    def MaybeI16(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(18))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int16Flags, o + self._tab.Pos)\n        return None\n\n    # ScalarStuff\n    def DefaultI16(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(20))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int16Flags, o + self._tab.Pos)\n        return 42\n\n    # ScalarStuff\n    def JustU16(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(22))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint16Flags, o + self._tab.Pos)\n        return 0\n\n    # ScalarStuff\n    def MaybeU16(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(24))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint16Flags, o + self._tab.Pos)\n        return None\n\n    # ScalarStuff\n    def DefaultU16(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(26))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint16Flags, o + self._tab.Pos)\n        return 42\n\n    # ScalarStuff\n    def JustI32(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(28))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos)\n        return 0\n\n    # ScalarStuff\n    def MaybeI32(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(30))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos)\n        return None\n\n    # ScalarStuff\n    def DefaultI32(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(32))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos)\n        return 42\n\n    # ScalarStuff\n    def JustU32(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(34))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint32Flags, o + self._tab.Pos)\n        return 0\n\n    # ScalarStuff\n    def MaybeU32(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(36))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint32Flags, o + self._tab.Pos)\n        return None\n\n    # ScalarStuff\n    def DefaultU32(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(38))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint32Flags, o + self._tab.Pos)\n        return 42\n\n    # ScalarStuff\n    def JustI64(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(40))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int64Flags, o + self._tab.Pos)\n        return 0\n\n    # ScalarStuff\n    def MaybeI64(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(42))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int64Flags, o + self._tab.Pos)\n        return None\n\n    # ScalarStuff\n    def DefaultI64(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(44))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int64Flags, o + self._tab.Pos)\n        return 42\n\n    # ScalarStuff\n    def JustU64(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(46))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos)\n        return 0\n\n    # ScalarStuff\n    def MaybeU64(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(48))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos)\n        return None\n\n    # ScalarStuff\n    def DefaultU64(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(50))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos)\n        return 42\n\n    # ScalarStuff\n    def JustF32(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(52))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos)\n        return 0.0\n\n    # ScalarStuff\n    def MaybeF32(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(54))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos)\n        return None\n\n    # ScalarStuff\n    def DefaultF32(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(56))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float32Flags, o + self._tab.Pos)\n        return 42.0\n\n    # ScalarStuff\n    def JustF64(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(58))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float64Flags, o + self._tab.Pos)\n        return 0.0\n\n    # ScalarStuff\n    def MaybeF64(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(60))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float64Flags, o + self._tab.Pos)\n        return None\n\n    # ScalarStuff\n    def DefaultF64(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(62))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Float64Flags, o + self._tab.Pos)\n        return 42.0\n\n    # ScalarStuff\n    def JustBool(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(64))\n        if o != 0:\n            return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos))\n        return False\n\n    # ScalarStuff\n    def MaybeBool(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(66))\n        if o != 0:\n            return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos))\n        return None\n\n    # ScalarStuff\n    def DefaultBool(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(68))\n        if o != 0:\n            return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos))\n        return True\n\n    # ScalarStuff\n    def JustEnum(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(70))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos)\n        return 0\n\n    # ScalarStuff\n    def MaybeEnum(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(72))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos)\n        return None\n\n    # ScalarStuff\n    def DefaultEnum(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(74))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos)\n        return 1\n\ndef ScalarStuffStart(builder):\n    builder.StartObject(36)\n\ndef Start(builder):\n    ScalarStuffStart(builder)\n\ndef ScalarStuffAddJustI8(builder, justI8):\n    builder.PrependInt8Slot(0, justI8, 0)\n\ndef AddJustI8(builder, justI8):\n    ScalarStuffAddJustI8(builder, justI8)\n\ndef ScalarStuffAddMaybeI8(builder, maybeI8):\n    builder.PrependInt8Slot(1, maybeI8, None)\n\ndef AddMaybeI8(builder, maybeI8):\n    ScalarStuffAddMaybeI8(builder, maybeI8)\n\ndef ScalarStuffAddDefaultI8(builder, defaultI8):\n    builder.PrependInt8Slot(2, defaultI8, 42)\n\ndef AddDefaultI8(builder, defaultI8):\n    ScalarStuffAddDefaultI8(builder, defaultI8)\n\ndef ScalarStuffAddJustU8(builder, justU8):\n    builder.PrependUint8Slot(3, justU8, 0)\n\ndef AddJustU8(builder, justU8):\n    ScalarStuffAddJustU8(builder, justU8)\n\ndef ScalarStuffAddMaybeU8(builder, maybeU8):\n    builder.PrependUint8Slot(4, maybeU8, None)\n\ndef AddMaybeU8(builder, maybeU8):\n    ScalarStuffAddMaybeU8(builder, maybeU8)\n\ndef ScalarStuffAddDefaultU8(builder, defaultU8):\n    builder.PrependUint8Slot(5, defaultU8, 42)\n\ndef AddDefaultU8(builder, defaultU8):\n    ScalarStuffAddDefaultU8(builder, defaultU8)\n\ndef ScalarStuffAddJustI16(builder, justI16):\n    builder.PrependInt16Slot(6, justI16, 0)\n\ndef AddJustI16(builder, justI16):\n    ScalarStuffAddJustI16(builder, justI16)\n\ndef ScalarStuffAddMaybeI16(builder, maybeI16):\n    builder.PrependInt16Slot(7, maybeI16, None)\n\ndef AddMaybeI16(builder, maybeI16):\n    ScalarStuffAddMaybeI16(builder, maybeI16)\n\ndef ScalarStuffAddDefaultI16(builder, defaultI16):\n    builder.PrependInt16Slot(8, defaultI16, 42)\n\ndef AddDefaultI16(builder, defaultI16):\n    ScalarStuffAddDefaultI16(builder, defaultI16)\n\ndef ScalarStuffAddJustU16(builder, justU16):\n    builder.PrependUint16Slot(9, justU16, 0)\n\ndef AddJustU16(builder, justU16):\n    ScalarStuffAddJustU16(builder, justU16)\n\ndef ScalarStuffAddMaybeU16(builder, maybeU16):\n    builder.PrependUint16Slot(10, maybeU16, None)\n\ndef AddMaybeU16(builder, maybeU16):\n    ScalarStuffAddMaybeU16(builder, maybeU16)\n\ndef ScalarStuffAddDefaultU16(builder, defaultU16):\n    builder.PrependUint16Slot(11, defaultU16, 42)\n\ndef AddDefaultU16(builder, defaultU16):\n    ScalarStuffAddDefaultU16(builder, defaultU16)\n\ndef ScalarStuffAddJustI32(builder, justI32):\n    builder.PrependInt32Slot(12, justI32, 0)\n\ndef AddJustI32(builder, justI32):\n    ScalarStuffAddJustI32(builder, justI32)\n\ndef ScalarStuffAddMaybeI32(builder, maybeI32):\n    builder.PrependInt32Slot(13, maybeI32, None)\n\ndef AddMaybeI32(builder, maybeI32):\n    ScalarStuffAddMaybeI32(builder, maybeI32)\n\ndef ScalarStuffAddDefaultI32(builder, defaultI32):\n    builder.PrependInt32Slot(14, defaultI32, 42)\n\ndef AddDefaultI32(builder, defaultI32):\n    ScalarStuffAddDefaultI32(builder, defaultI32)\n\ndef ScalarStuffAddJustU32(builder, justU32):\n    builder.PrependUint32Slot(15, justU32, 0)\n\ndef AddJustU32(builder, justU32):\n    ScalarStuffAddJustU32(builder, justU32)\n\ndef ScalarStuffAddMaybeU32(builder, maybeU32):\n    builder.PrependUint32Slot(16, maybeU32, None)\n\ndef AddMaybeU32(builder, maybeU32):\n    ScalarStuffAddMaybeU32(builder, maybeU32)\n\ndef ScalarStuffAddDefaultU32(builder, defaultU32):\n    builder.PrependUint32Slot(17, defaultU32, 42)\n\ndef AddDefaultU32(builder, defaultU32):\n    ScalarStuffAddDefaultU32(builder, defaultU32)\n\ndef ScalarStuffAddJustI64(builder, justI64):\n    builder.PrependInt64Slot(18, justI64, 0)\n\ndef AddJustI64(builder, justI64):\n    ScalarStuffAddJustI64(builder, justI64)\n\ndef ScalarStuffAddMaybeI64(builder, maybeI64):\n    builder.PrependInt64Slot(19, maybeI64, None)\n\ndef AddMaybeI64(builder, maybeI64):\n    ScalarStuffAddMaybeI64(builder, maybeI64)\n\ndef ScalarStuffAddDefaultI64(builder, defaultI64):\n    builder.PrependInt64Slot(20, defaultI64, 42)\n\ndef AddDefaultI64(builder, defaultI64):\n    ScalarStuffAddDefaultI64(builder, defaultI64)\n\ndef ScalarStuffAddJustU64(builder, justU64):\n    builder.PrependUint64Slot(21, justU64, 0)\n\ndef AddJustU64(builder, justU64):\n    ScalarStuffAddJustU64(builder, justU64)\n\ndef ScalarStuffAddMaybeU64(builder, maybeU64):\n    builder.PrependUint64Slot(22, maybeU64, None)\n\ndef AddMaybeU64(builder, maybeU64):\n    ScalarStuffAddMaybeU64(builder, maybeU64)\n\ndef ScalarStuffAddDefaultU64(builder, defaultU64):\n    builder.PrependUint64Slot(23, defaultU64, 42)\n\ndef AddDefaultU64(builder, defaultU64):\n    ScalarStuffAddDefaultU64(builder, defaultU64)\n\ndef ScalarStuffAddJustF32(builder, justF32):\n    builder.PrependFloat32Slot(24, justF32, 0.0)\n\ndef AddJustF32(builder, justF32):\n    ScalarStuffAddJustF32(builder, justF32)\n\ndef ScalarStuffAddMaybeF32(builder, maybeF32):\n    builder.PrependFloat32Slot(25, maybeF32, None)\n\ndef AddMaybeF32(builder, maybeF32):\n    ScalarStuffAddMaybeF32(builder, maybeF32)\n\ndef ScalarStuffAddDefaultF32(builder, defaultF32):\n    builder.PrependFloat32Slot(26, defaultF32, 42.0)\n\ndef AddDefaultF32(builder, defaultF32):\n    ScalarStuffAddDefaultF32(builder, defaultF32)\n\ndef ScalarStuffAddJustF64(builder, justF64):\n    builder.PrependFloat64Slot(27, justF64, 0.0)\n\ndef AddJustF64(builder, justF64):\n    ScalarStuffAddJustF64(builder, justF64)\n\ndef ScalarStuffAddMaybeF64(builder, maybeF64):\n    builder.PrependFloat64Slot(28, maybeF64, None)\n\ndef AddMaybeF64(builder, maybeF64):\n    ScalarStuffAddMaybeF64(builder, maybeF64)\n\ndef ScalarStuffAddDefaultF64(builder, defaultF64):\n    builder.PrependFloat64Slot(29, defaultF64, 42.0)\n\ndef AddDefaultF64(builder, defaultF64):\n    ScalarStuffAddDefaultF64(builder, defaultF64)\n\ndef ScalarStuffAddJustBool(builder, justBool):\n    builder.PrependBoolSlot(30, justBool, 0)\n\ndef AddJustBool(builder, justBool):\n    ScalarStuffAddJustBool(builder, justBool)\n\ndef ScalarStuffAddMaybeBool(builder, maybeBool):\n    builder.PrependBoolSlot(31, maybeBool, None)\n\ndef AddMaybeBool(builder, maybeBool):\n    ScalarStuffAddMaybeBool(builder, maybeBool)\n\ndef ScalarStuffAddDefaultBool(builder, defaultBool):\n    builder.PrependBoolSlot(32, defaultBool, 1)\n\ndef AddDefaultBool(builder, defaultBool):\n    ScalarStuffAddDefaultBool(builder, defaultBool)\n\ndef ScalarStuffAddJustEnum(builder, justEnum):\n    builder.PrependInt8Slot(33, justEnum, 0)\n\ndef AddJustEnum(builder, justEnum):\n    ScalarStuffAddJustEnum(builder, justEnum)\n\ndef ScalarStuffAddMaybeEnum(builder, maybeEnum):\n    builder.PrependInt8Slot(34, maybeEnum, None)\n\ndef AddMaybeEnum(builder, maybeEnum):\n    ScalarStuffAddMaybeEnum(builder, maybeEnum)\n\ndef ScalarStuffAddDefaultEnum(builder, defaultEnum):\n    builder.PrependInt8Slot(35, defaultEnum, 1)\n\ndef AddDefaultEnum(builder, defaultEnum):\n    ScalarStuffAddDefaultEnum(builder, defaultEnum)\n\ndef ScalarStuffEnd(builder):\n    return builder.EndObject()\n\ndef End(builder):\n    return ScalarStuffEnd(builder)\n\ntry:\n    from typing import Optional\nexcept:\n    pass\n\nclass ScalarStuffT(object):\n\n    # ScalarStuffT\n    def __init__(\n        self,\n        justI8 = 0,\n        maybeI8 = None,\n        defaultI8 = 42,\n        justU8 = 0,\n        maybeU8 = None,\n        defaultU8 = 42,\n        justI16 = 0,\n        maybeI16 = None,\n        defaultI16 = 42,\n        justU16 = 0,\n        maybeU16 = None,\n        defaultU16 = 42,\n        justI32 = 0,\n        maybeI32 = None,\n        defaultI32 = 42,\n        justU32 = 0,\n        maybeU32 = None,\n        defaultU32 = 42,\n        justI64 = 0,\n        maybeI64 = None,\n        defaultI64 = 42,\n        justU64 = 0,\n        maybeU64 = None,\n        defaultU64 = 42,\n        justF32 = 0.0,\n        maybeF32 = None,\n        defaultF32 = 42.0,\n        justF64 = 0.0,\n        maybeF64 = None,\n        defaultF64 = 42.0,\n        justBool = False,\n        maybeBool = None,\n        defaultBool = True,\n        justEnum = 0,\n        maybeEnum = None,\n        defaultEnum = 1,\n    ):\n        self.justI8 = justI8  # type: int\n        self.maybeI8 = maybeI8  # type: Optional[int]\n        self.defaultI8 = defaultI8  # type: int\n        self.justU8 = justU8  # type: int\n        self.maybeU8 = maybeU8  # type: Optional[int]\n        self.defaultU8 = defaultU8  # type: int\n        self.justI16 = justI16  # type: int\n        self.maybeI16 = maybeI16  # type: Optional[int]\n        self.defaultI16 = defaultI16  # type: int\n        self.justU16 = justU16  # type: int\n        self.maybeU16 = maybeU16  # type: Optional[int]\n        self.defaultU16 = defaultU16  # type: int\n        self.justI32 = justI32  # type: int\n        self.maybeI32 = maybeI32  # type: Optional[int]\n        self.defaultI32 = defaultI32  # type: int\n        self.justU32 = justU32  # type: int\n        self.maybeU32 = maybeU32  # type: Optional[int]\n        self.defaultU32 = defaultU32  # type: int\n        self.justI64 = justI64  # type: int\n        self.maybeI64 = maybeI64  # type: Optional[int]\n        self.defaultI64 = defaultI64  # type: int\n        self.justU64 = justU64  # type: int\n        self.maybeU64 = maybeU64  # type: Optional[int]\n        self.defaultU64 = defaultU64  # type: int\n        self.justF32 = justF32  # type: float\n        self.maybeF32 = maybeF32  # type: Optional[float]\n        self.defaultF32 = defaultF32  # type: float\n        self.justF64 = justF64  # type: float\n        self.maybeF64 = maybeF64  # type: Optional[float]\n        self.defaultF64 = defaultF64  # type: float\n        self.justBool = justBool  # type: bool\n        self.maybeBool = maybeBool  # type: Optional[bool]\n        self.defaultBool = defaultBool  # type: bool\n        self.justEnum = justEnum  # type: int\n        self.maybeEnum = maybeEnum  # type: Optional[int]\n        self.defaultEnum = defaultEnum  # type: int\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        scalarStuff = ScalarStuff()\n        scalarStuff.Init(buf, pos)\n        return cls.InitFromObj(scalarStuff)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, scalarStuff):\n        x = ScalarStuffT()\n        x._UnPack(scalarStuff)\n        return x\n\n    # ScalarStuffT\n    def _UnPack(self, scalarStuff):\n        if scalarStuff is None:\n            return\n        self.justI8 = scalarStuff.JustI8()\n        self.maybeI8 = scalarStuff.MaybeI8()\n        self.defaultI8 = scalarStuff.DefaultI8()\n        self.justU8 = scalarStuff.JustU8()\n        self.maybeU8 = scalarStuff.MaybeU8()\n        self.defaultU8 = scalarStuff.DefaultU8()\n        self.justI16 = scalarStuff.JustI16()\n        self.maybeI16 = scalarStuff.MaybeI16()\n        self.defaultI16 = scalarStuff.DefaultI16()\n        self.justU16 = scalarStuff.JustU16()\n        self.maybeU16 = scalarStuff.MaybeU16()\n        self.defaultU16 = scalarStuff.DefaultU16()\n        self.justI32 = scalarStuff.JustI32()\n        self.maybeI32 = scalarStuff.MaybeI32()\n        self.defaultI32 = scalarStuff.DefaultI32()\n        self.justU32 = scalarStuff.JustU32()\n        self.maybeU32 = scalarStuff.MaybeU32()\n        self.defaultU32 = scalarStuff.DefaultU32()\n        self.justI64 = scalarStuff.JustI64()\n        self.maybeI64 = scalarStuff.MaybeI64()\n        self.defaultI64 = scalarStuff.DefaultI64()\n        self.justU64 = scalarStuff.JustU64()\n        self.maybeU64 = scalarStuff.MaybeU64()\n        self.defaultU64 = scalarStuff.DefaultU64()\n        self.justF32 = scalarStuff.JustF32()\n        self.maybeF32 = scalarStuff.MaybeF32()\n        self.defaultF32 = scalarStuff.DefaultF32()\n        self.justF64 = scalarStuff.JustF64()\n        self.maybeF64 = scalarStuff.MaybeF64()\n        self.defaultF64 = scalarStuff.DefaultF64()\n        self.justBool = scalarStuff.JustBool()\n        self.maybeBool = scalarStuff.MaybeBool()\n        self.defaultBool = scalarStuff.DefaultBool()\n        self.justEnum = scalarStuff.JustEnum()\n        self.maybeEnum = scalarStuff.MaybeEnum()\n        self.defaultEnum = scalarStuff.DefaultEnum()\n\n    # ScalarStuffT\n    def Pack(self, builder):\n        ScalarStuffStart(builder)\n        ScalarStuffAddJustI8(builder, self.justI8)\n        ScalarStuffAddMaybeI8(builder, self.maybeI8)\n        ScalarStuffAddDefaultI8(builder, self.defaultI8)\n        ScalarStuffAddJustU8(builder, self.justU8)\n        ScalarStuffAddMaybeU8(builder, self.maybeU8)\n        ScalarStuffAddDefaultU8(builder, self.defaultU8)\n        ScalarStuffAddJustI16(builder, self.justI16)\n        ScalarStuffAddMaybeI16(builder, self.maybeI16)\n        ScalarStuffAddDefaultI16(builder, self.defaultI16)\n        ScalarStuffAddJustU16(builder, self.justU16)\n        ScalarStuffAddMaybeU16(builder, self.maybeU16)\n        ScalarStuffAddDefaultU16(builder, self.defaultU16)\n        ScalarStuffAddJustI32(builder, self.justI32)\n        ScalarStuffAddMaybeI32(builder, self.maybeI32)\n        ScalarStuffAddDefaultI32(builder, self.defaultI32)\n        ScalarStuffAddJustU32(builder, self.justU32)\n        ScalarStuffAddMaybeU32(builder, self.maybeU32)\n        ScalarStuffAddDefaultU32(builder, self.defaultU32)\n        ScalarStuffAddJustI64(builder, self.justI64)\n        ScalarStuffAddMaybeI64(builder, self.maybeI64)\n        ScalarStuffAddDefaultI64(builder, self.defaultI64)\n        ScalarStuffAddJustU64(builder, self.justU64)\n        ScalarStuffAddMaybeU64(builder, self.maybeU64)\n        ScalarStuffAddDefaultU64(builder, self.defaultU64)\n        ScalarStuffAddJustF32(builder, self.justF32)\n        ScalarStuffAddMaybeF32(builder, self.maybeF32)\n        ScalarStuffAddDefaultF32(builder, self.defaultF32)\n        ScalarStuffAddJustF64(builder, self.justF64)\n        ScalarStuffAddMaybeF64(builder, self.maybeF64)\n        ScalarStuffAddDefaultF64(builder, self.defaultF64)\n        ScalarStuffAddJustBool(builder, self.justBool)\n        ScalarStuffAddMaybeBool(builder, self.maybeBool)\n        ScalarStuffAddDefaultBool(builder, self.defaultBool)\n        ScalarStuffAddJustEnum(builder, self.justEnum)\n        ScalarStuffAddMaybeEnum(builder, self.maybeEnum)\n        ScalarStuffAddDefaultEnum(builder, self.defaultEnum)\n        scalarStuff = ScalarStuffEnd(builder)\n        return scalarStuff\n"
  },
  {
    "path": "tests/optional_scalars/__init__.py",
    "content": ""
  },
  {
    "path": "tests/optional_scalars/mod.rs",
    "content": "// Automatically generated by the Flatbuffers compiler. Do not modify.\n// @generated\npub mod optional_scalars {\n    use super::*;\n    mod optional_byte_generated;\n    pub use self::optional_byte_generated::*;\n    mod scalar_stuff_generated;\n    pub use self::scalar_stuff_generated::*;\n} // optional_scalars\n"
  },
  {
    "path": "tests/optional_scalars/optional_scalars/optional_byte_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MIN_OPTIONAL_BYTE: i8 = 0;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MAX_OPTIONAL_BYTE: i8 = 2;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n#[allow(non_camel_case_types)]\npub const ENUM_VALUES_OPTIONAL_BYTE: [OptionalByte; 3] = [\n    OptionalByte::None,\n    OptionalByte::One,\n    OptionalByte::Two,\n];\n\n#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n#[repr(transparent)]\npub struct OptionalByte(pub i8);\n\n#[allow(non_upper_case_globals)]\nimpl OptionalByte {\n    pub const None: Self = Self(0);\n    pub const One: Self = Self(1);\n    pub const Two: Self = Self(2);\n\n    pub const ENUM_MIN: i8 = 0;\n    pub const ENUM_MAX: i8 = 2;\n    pub const ENUM_VALUES: &'static [Self] = &[\n        Self::None,\n        Self::One,\n        Self::Two,\n    ];\n\n    /// Returns the variant's name or \"\" if unknown.\n    pub fn variant_name(self) -> Option<&'static str> {\n        match self {\n            Self::None => Some(\"None\"),\n            Self::One => Some(\"One\"),\n            Self::Two => Some(\"Two\"),\n            _ => None,\n        }\n    }\n}\n\nimpl ::core::fmt::Debug for OptionalByte {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        if let Some(name) = self.variant_name() {\n            f.write_str(name)\n        } else {\n            f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n        }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for OptionalByte {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<i8>(buf, loc) };\n        Self(b)\n    }\n}\n\nimpl ::flatbuffers::Push for OptionalByte {\n    type Output = OptionalByte;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<i8>(dst, self.0) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for OptionalByte {\n    type Scalar = i8;\n\n    #[inline]\n    fn to_little_endian(self) -> i8 {\n        self.0.to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: i8) -> Self {\n        let b = i8::from_le(v);\n        Self(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for OptionalByte {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        i8::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for OptionalByte {}\n"
  },
  {
    "path": "tests/optional_scalars/optional_scalars/scalar_stuff_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum ScalarStuffOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct ScalarStuff<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for ScalarStuff<'a> {\n    type Inner = ScalarStuff<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> ScalarStuff<'a> {\n    pub const VT_JUST_I8: ::flatbuffers::VOffsetT = 4;\n    pub const VT_MAYBE_I8: ::flatbuffers::VOffsetT = 6;\n    pub const VT_DEFAULT_I8: ::flatbuffers::VOffsetT = 8;\n    pub const VT_JUST_U8: ::flatbuffers::VOffsetT = 10;\n    pub const VT_MAYBE_U8: ::flatbuffers::VOffsetT = 12;\n    pub const VT_DEFAULT_U8: ::flatbuffers::VOffsetT = 14;\n    pub const VT_JUST_I16: ::flatbuffers::VOffsetT = 16;\n    pub const VT_MAYBE_I16: ::flatbuffers::VOffsetT = 18;\n    pub const VT_DEFAULT_I16: ::flatbuffers::VOffsetT = 20;\n    pub const VT_JUST_U16: ::flatbuffers::VOffsetT = 22;\n    pub const VT_MAYBE_U16: ::flatbuffers::VOffsetT = 24;\n    pub const VT_DEFAULT_U16: ::flatbuffers::VOffsetT = 26;\n    pub const VT_JUST_I32: ::flatbuffers::VOffsetT = 28;\n    pub const VT_MAYBE_I32: ::flatbuffers::VOffsetT = 30;\n    pub const VT_DEFAULT_I32: ::flatbuffers::VOffsetT = 32;\n    pub const VT_JUST_U32: ::flatbuffers::VOffsetT = 34;\n    pub const VT_MAYBE_U32: ::flatbuffers::VOffsetT = 36;\n    pub const VT_DEFAULT_U32: ::flatbuffers::VOffsetT = 38;\n    pub const VT_JUST_I64: ::flatbuffers::VOffsetT = 40;\n    pub const VT_MAYBE_I64: ::flatbuffers::VOffsetT = 42;\n    pub const VT_DEFAULT_I64: ::flatbuffers::VOffsetT = 44;\n    pub const VT_JUST_U64: ::flatbuffers::VOffsetT = 46;\n    pub const VT_MAYBE_U64: ::flatbuffers::VOffsetT = 48;\n    pub const VT_DEFAULT_U64: ::flatbuffers::VOffsetT = 50;\n    pub const VT_JUST_F32: ::flatbuffers::VOffsetT = 52;\n    pub const VT_MAYBE_F32: ::flatbuffers::VOffsetT = 54;\n    pub const VT_DEFAULT_F32: ::flatbuffers::VOffsetT = 56;\n    pub const VT_JUST_F64: ::flatbuffers::VOffsetT = 58;\n    pub const VT_MAYBE_F64: ::flatbuffers::VOffsetT = 60;\n    pub const VT_DEFAULT_F64: ::flatbuffers::VOffsetT = 62;\n    pub const VT_JUST_BOOL: ::flatbuffers::VOffsetT = 64;\n    pub const VT_MAYBE_BOOL: ::flatbuffers::VOffsetT = 66;\n    pub const VT_DEFAULT_BOOL: ::flatbuffers::VOffsetT = 68;\n    pub const VT_JUST_ENUM: ::flatbuffers::VOffsetT = 70;\n    pub const VT_MAYBE_ENUM: ::flatbuffers::VOffsetT = 72;\n    pub const VT_DEFAULT_ENUM: ::flatbuffers::VOffsetT = 74;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"optional_scalars.ScalarStuff\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        ScalarStuff { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args ScalarStuffArgs\n    ) -> ::flatbuffers::WIPOffset<ScalarStuff<'bldr>> {\n        let mut builder = ScalarStuffBuilder::new(_fbb);\n        builder.add_default_f64(args.default_f64);\n        if let Some(x) = args.maybe_f64 { builder.add_maybe_f64(x); }\n        builder.add_just_f64(args.just_f64);\n        builder.add_default_u64(args.default_u64);\n        if let Some(x) = args.maybe_u64 { builder.add_maybe_u64(x); }\n        builder.add_just_u64(args.just_u64);\n        builder.add_default_i64(args.default_i64);\n        if let Some(x) = args.maybe_i64 { builder.add_maybe_i64(x); }\n        builder.add_just_i64(args.just_i64);\n        builder.add_default_f32(args.default_f32);\n        if let Some(x) = args.maybe_f32 { builder.add_maybe_f32(x); }\n        builder.add_just_f32(args.just_f32);\n        builder.add_default_u32(args.default_u32);\n        if let Some(x) = args.maybe_u32 { builder.add_maybe_u32(x); }\n        builder.add_just_u32(args.just_u32);\n        builder.add_default_i32(args.default_i32);\n        if let Some(x) = args.maybe_i32 { builder.add_maybe_i32(x); }\n        builder.add_just_i32(args.just_i32);\n        builder.add_default_u16(args.default_u16);\n        if let Some(x) = args.maybe_u16 { builder.add_maybe_u16(x); }\n        builder.add_just_u16(args.just_u16);\n        builder.add_default_i16(args.default_i16);\n        if let Some(x) = args.maybe_i16 { builder.add_maybe_i16(x); }\n        builder.add_just_i16(args.just_i16);\n        builder.add_default_enum(args.default_enum);\n        if let Some(x) = args.maybe_enum { builder.add_maybe_enum(x); }\n        builder.add_just_enum(args.just_enum);\n        builder.add_default_bool(args.default_bool);\n        if let Some(x) = args.maybe_bool { builder.add_maybe_bool(x); }\n        builder.add_just_bool(args.just_bool);\n        builder.add_default_u8(args.default_u8);\n        if let Some(x) = args.maybe_u8 { builder.add_maybe_u8(x); }\n        builder.add_just_u8(args.just_u8);\n        builder.add_default_i8(args.default_i8);\n        if let Some(x) = args.maybe_i8 { builder.add_maybe_i8(x); }\n        builder.add_just_i8(args.just_i8);\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> ScalarStuffT {\n        let just_i8 = self.just_i8();\n        let maybe_i8 = self.maybe_i8();\n        let default_i8 = self.default_i8();\n        let just_u8 = self.just_u8();\n        let maybe_u8 = self.maybe_u8();\n        let default_u8 = self.default_u8();\n        let just_i16 = self.just_i16();\n        let maybe_i16 = self.maybe_i16();\n        let default_i16 = self.default_i16();\n        let just_u16 = self.just_u16();\n        let maybe_u16 = self.maybe_u16();\n        let default_u16 = self.default_u16();\n        let just_i32 = self.just_i32();\n        let maybe_i32 = self.maybe_i32();\n        let default_i32 = self.default_i32();\n        let just_u32 = self.just_u32();\n        let maybe_u32 = self.maybe_u32();\n        let default_u32 = self.default_u32();\n        let just_i64 = self.just_i64();\n        let maybe_i64 = self.maybe_i64();\n        let default_i64 = self.default_i64();\n        let just_u64 = self.just_u64();\n        let maybe_u64 = self.maybe_u64();\n        let default_u64 = self.default_u64();\n        let just_f32 = self.just_f32();\n        let maybe_f32 = self.maybe_f32();\n        let default_f32 = self.default_f32();\n        let just_f64 = self.just_f64();\n        let maybe_f64 = self.maybe_f64();\n        let default_f64 = self.default_f64();\n        let just_bool = self.just_bool();\n        let maybe_bool = self.maybe_bool();\n        let default_bool = self.default_bool();\n        let just_enum = self.just_enum();\n        let maybe_enum = self.maybe_enum();\n        let default_enum = self.default_enum();\n        ScalarStuffT {\n            just_i8,\n            maybe_i8,\n            default_i8,\n            just_u8,\n            maybe_u8,\n            default_u8,\n            just_i16,\n            maybe_i16,\n            default_i16,\n            just_u16,\n            maybe_u16,\n            default_u16,\n            just_i32,\n            maybe_i32,\n            default_i32,\n            just_u32,\n            maybe_u32,\n            default_u32,\n            just_i64,\n            maybe_i64,\n            default_i64,\n            just_u64,\n            maybe_u64,\n            default_u64,\n            just_f32,\n            maybe_f32,\n            default_f32,\n            just_f64,\n            maybe_f64,\n            default_f64,\n            just_bool,\n            maybe_bool,\n            default_bool,\n            just_enum,\n            maybe_enum,\n            default_enum,\n        }\n    }\n\n    #[inline]\n    pub fn just_i8(&self) -> i8 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i8>(ScalarStuff::VT_JUST_I8, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn maybe_i8(&self) -> Option<i8> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i8>(ScalarStuff::VT_MAYBE_I8, None)}\n    }\n\n    #[inline]\n    pub fn default_i8(&self) -> i8 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i8>(ScalarStuff::VT_DEFAULT_I8, Some(42)).unwrap()}\n    }\n\n    #[inline]\n    pub fn just_u8(&self) -> u8 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u8>(ScalarStuff::VT_JUST_U8, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn maybe_u8(&self) -> Option<u8> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u8>(ScalarStuff::VT_MAYBE_U8, None)}\n    }\n\n    #[inline]\n    pub fn default_u8(&self) -> u8 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u8>(ScalarStuff::VT_DEFAULT_U8, Some(42)).unwrap()}\n    }\n\n    #[inline]\n    pub fn just_i16(&self) -> i16 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i16>(ScalarStuff::VT_JUST_I16, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn maybe_i16(&self) -> Option<i16> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i16>(ScalarStuff::VT_MAYBE_I16, None)}\n    }\n\n    #[inline]\n    pub fn default_i16(&self) -> i16 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i16>(ScalarStuff::VT_DEFAULT_I16, Some(42)).unwrap()}\n    }\n\n    #[inline]\n    pub fn just_u16(&self) -> u16 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u16>(ScalarStuff::VT_JUST_U16, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn maybe_u16(&self) -> Option<u16> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u16>(ScalarStuff::VT_MAYBE_U16, None)}\n    }\n\n    #[inline]\n    pub fn default_u16(&self) -> u16 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u16>(ScalarStuff::VT_DEFAULT_U16, Some(42)).unwrap()}\n    }\n\n    #[inline]\n    pub fn just_i32(&self) -> i32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i32>(ScalarStuff::VT_JUST_I32, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn maybe_i32(&self) -> Option<i32> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i32>(ScalarStuff::VT_MAYBE_I32, None)}\n    }\n\n    #[inline]\n    pub fn default_i32(&self) -> i32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i32>(ScalarStuff::VT_DEFAULT_I32, Some(42)).unwrap()}\n    }\n\n    #[inline]\n    pub fn just_u32(&self) -> u32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u32>(ScalarStuff::VT_JUST_U32, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn maybe_u32(&self) -> Option<u32> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u32>(ScalarStuff::VT_MAYBE_U32, None)}\n    }\n\n    #[inline]\n    pub fn default_u32(&self) -> u32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u32>(ScalarStuff::VT_DEFAULT_U32, Some(42)).unwrap()}\n    }\n\n    #[inline]\n    pub fn just_i64(&self) -> i64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i64>(ScalarStuff::VT_JUST_I64, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn maybe_i64(&self) -> Option<i64> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i64>(ScalarStuff::VT_MAYBE_I64, None)}\n    }\n\n    #[inline]\n    pub fn default_i64(&self) -> i64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i64>(ScalarStuff::VT_DEFAULT_I64, Some(42)).unwrap()}\n    }\n\n    #[inline]\n    pub fn just_u64(&self) -> u64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u64>(ScalarStuff::VT_JUST_U64, Some(0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn maybe_u64(&self) -> Option<u64> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u64>(ScalarStuff::VT_MAYBE_U64, None)}\n    }\n\n    #[inline]\n    pub fn default_u64(&self) -> u64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<u64>(ScalarStuff::VT_DEFAULT_U64, Some(42)).unwrap()}\n    }\n\n    #[inline]\n    pub fn just_f32(&self) -> f32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f32>(ScalarStuff::VT_JUST_F32, Some(0.0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn maybe_f32(&self) -> Option<f32> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f32>(ScalarStuff::VT_MAYBE_F32, None)}\n    }\n\n    #[inline]\n    pub fn default_f32(&self) -> f32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f32>(ScalarStuff::VT_DEFAULT_F32, Some(42.0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn just_f64(&self) -> f64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f64>(ScalarStuff::VT_JUST_F64, Some(0.0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn maybe_f64(&self) -> Option<f64> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f64>(ScalarStuff::VT_MAYBE_F64, None)}\n    }\n\n    #[inline]\n    pub fn default_f64(&self) -> f64 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<f64>(ScalarStuff::VT_DEFAULT_F64, Some(42.0)).unwrap()}\n    }\n\n    #[inline]\n    pub fn just_bool(&self) -> bool {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<bool>(ScalarStuff::VT_JUST_BOOL, Some(false)).unwrap()}\n    }\n\n    #[inline]\n    pub fn maybe_bool(&self) -> Option<bool> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<bool>(ScalarStuff::VT_MAYBE_BOOL, None)}\n    }\n\n    #[inline]\n    pub fn default_bool(&self) -> bool {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<bool>(ScalarStuff::VT_DEFAULT_BOOL, Some(true)).unwrap()}\n    }\n\n    #[inline]\n    pub fn just_enum(&self) -> OptionalByte {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<OptionalByte>(ScalarStuff::VT_JUST_ENUM, Some(OptionalByte::None)).unwrap()}\n    }\n\n    #[inline]\n    pub fn maybe_enum(&self) -> Option<OptionalByte> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<OptionalByte>(ScalarStuff::VT_MAYBE_ENUM, None)}\n    }\n\n    #[inline]\n    pub fn default_enum(&self) -> OptionalByte {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<OptionalByte>(ScalarStuff::VT_DEFAULT_ENUM, Some(OptionalByte::One)).unwrap()}\n    }\n}\n\nimpl ::flatbuffers::Verifiable for ScalarStuff<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<i8>(\"just_i8\", Self::VT_JUST_I8, false)?\n            .visit_field::<i8>(\"maybe_i8\", Self::VT_MAYBE_I8, false)?\n            .visit_field::<i8>(\"default_i8\", Self::VT_DEFAULT_I8, false)?\n            .visit_field::<u8>(\"just_u8\", Self::VT_JUST_U8, false)?\n            .visit_field::<u8>(\"maybe_u8\", Self::VT_MAYBE_U8, false)?\n            .visit_field::<u8>(\"default_u8\", Self::VT_DEFAULT_U8, false)?\n            .visit_field::<i16>(\"just_i16\", Self::VT_JUST_I16, false)?\n            .visit_field::<i16>(\"maybe_i16\", Self::VT_MAYBE_I16, false)?\n            .visit_field::<i16>(\"default_i16\", Self::VT_DEFAULT_I16, false)?\n            .visit_field::<u16>(\"just_u16\", Self::VT_JUST_U16, false)?\n            .visit_field::<u16>(\"maybe_u16\", Self::VT_MAYBE_U16, false)?\n            .visit_field::<u16>(\"default_u16\", Self::VT_DEFAULT_U16, false)?\n            .visit_field::<i32>(\"just_i32\", Self::VT_JUST_I32, false)?\n            .visit_field::<i32>(\"maybe_i32\", Self::VT_MAYBE_I32, false)?\n            .visit_field::<i32>(\"default_i32\", Self::VT_DEFAULT_I32, false)?\n            .visit_field::<u32>(\"just_u32\", Self::VT_JUST_U32, false)?\n            .visit_field::<u32>(\"maybe_u32\", Self::VT_MAYBE_U32, false)?\n            .visit_field::<u32>(\"default_u32\", Self::VT_DEFAULT_U32, false)?\n            .visit_field::<i64>(\"just_i64\", Self::VT_JUST_I64, false)?\n            .visit_field::<i64>(\"maybe_i64\", Self::VT_MAYBE_I64, false)?\n            .visit_field::<i64>(\"default_i64\", Self::VT_DEFAULT_I64, false)?\n            .visit_field::<u64>(\"just_u64\", Self::VT_JUST_U64, false)?\n            .visit_field::<u64>(\"maybe_u64\", Self::VT_MAYBE_U64, false)?\n            .visit_field::<u64>(\"default_u64\", Self::VT_DEFAULT_U64, false)?\n            .visit_field::<f32>(\"just_f32\", Self::VT_JUST_F32, false)?\n            .visit_field::<f32>(\"maybe_f32\", Self::VT_MAYBE_F32, false)?\n            .visit_field::<f32>(\"default_f32\", Self::VT_DEFAULT_F32, false)?\n            .visit_field::<f64>(\"just_f64\", Self::VT_JUST_F64, false)?\n            .visit_field::<f64>(\"maybe_f64\", Self::VT_MAYBE_F64, false)?\n            .visit_field::<f64>(\"default_f64\", Self::VT_DEFAULT_F64, false)?\n            .visit_field::<bool>(\"just_bool\", Self::VT_JUST_BOOL, false)?\n            .visit_field::<bool>(\"maybe_bool\", Self::VT_MAYBE_BOOL, false)?\n            .visit_field::<bool>(\"default_bool\", Self::VT_DEFAULT_BOOL, false)?\n            .visit_field::<OptionalByte>(\"just_enum\", Self::VT_JUST_ENUM, false)?\n            .visit_field::<OptionalByte>(\"maybe_enum\", Self::VT_MAYBE_ENUM, false)?\n            .visit_field::<OptionalByte>(\"default_enum\", Self::VT_DEFAULT_ENUM, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct ScalarStuffArgs {\n    pub just_i8: i8,\n    pub maybe_i8: Option<i8>,\n    pub default_i8: i8,\n    pub just_u8: u8,\n    pub maybe_u8: Option<u8>,\n    pub default_u8: u8,\n    pub just_i16: i16,\n    pub maybe_i16: Option<i16>,\n    pub default_i16: i16,\n    pub just_u16: u16,\n    pub maybe_u16: Option<u16>,\n    pub default_u16: u16,\n    pub just_i32: i32,\n    pub maybe_i32: Option<i32>,\n    pub default_i32: i32,\n    pub just_u32: u32,\n    pub maybe_u32: Option<u32>,\n    pub default_u32: u32,\n    pub just_i64: i64,\n    pub maybe_i64: Option<i64>,\n    pub default_i64: i64,\n    pub just_u64: u64,\n    pub maybe_u64: Option<u64>,\n    pub default_u64: u64,\n    pub just_f32: f32,\n    pub maybe_f32: Option<f32>,\n    pub default_f32: f32,\n    pub just_f64: f64,\n    pub maybe_f64: Option<f64>,\n    pub default_f64: f64,\n    pub just_bool: bool,\n    pub maybe_bool: Option<bool>,\n    pub default_bool: bool,\n    pub just_enum: OptionalByte,\n    pub maybe_enum: Option<OptionalByte>,\n    pub default_enum: OptionalByte,\n}\n\nimpl<'a> Default for ScalarStuffArgs {\n    #[inline]\n    fn default() -> Self {\n        ScalarStuffArgs {\n            just_i8: 0,\n            maybe_i8: None,\n            default_i8: 42,\n            just_u8: 0,\n            maybe_u8: None,\n            default_u8: 42,\n            just_i16: 0,\n            maybe_i16: None,\n            default_i16: 42,\n            just_u16: 0,\n            maybe_u16: None,\n            default_u16: 42,\n            just_i32: 0,\n            maybe_i32: None,\n            default_i32: 42,\n            just_u32: 0,\n            maybe_u32: None,\n            default_u32: 42,\n            just_i64: 0,\n            maybe_i64: None,\n            default_i64: 42,\n            just_u64: 0,\n            maybe_u64: None,\n            default_u64: 42,\n            just_f32: 0.0,\n            maybe_f32: None,\n            default_f32: 42.0,\n            just_f64: 0.0,\n            maybe_f64: None,\n            default_f64: 42.0,\n            just_bool: false,\n            maybe_bool: None,\n            default_bool: true,\n            just_enum: OptionalByte::None,\n            maybe_enum: None,\n            default_enum: OptionalByte::One,\n        }\n    }\n}\n\npub struct ScalarStuffBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> ScalarStuffBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_just_i8(&mut self, just_i8: i8) {\n        self.fbb_.push_slot::<i8>(ScalarStuff::VT_JUST_I8, just_i8, 0);\n    }\n\n    #[inline]\n    pub fn add_maybe_i8(&mut self, maybe_i8: i8) {\n        self.fbb_.push_slot_always::<i8>(ScalarStuff::VT_MAYBE_I8, maybe_i8);\n    }\n\n    #[inline]\n    pub fn add_default_i8(&mut self, default_i8: i8) {\n        self.fbb_.push_slot::<i8>(ScalarStuff::VT_DEFAULT_I8, default_i8, 42);\n    }\n\n    #[inline]\n    pub fn add_just_u8(&mut self, just_u8: u8) {\n        self.fbb_.push_slot::<u8>(ScalarStuff::VT_JUST_U8, just_u8, 0);\n    }\n\n    #[inline]\n    pub fn add_maybe_u8(&mut self, maybe_u8: u8) {\n        self.fbb_.push_slot_always::<u8>(ScalarStuff::VT_MAYBE_U8, maybe_u8);\n    }\n\n    #[inline]\n    pub fn add_default_u8(&mut self, default_u8: u8) {\n        self.fbb_.push_slot::<u8>(ScalarStuff::VT_DEFAULT_U8, default_u8, 42);\n    }\n\n    #[inline]\n    pub fn add_just_i16(&mut self, just_i16: i16) {\n        self.fbb_.push_slot::<i16>(ScalarStuff::VT_JUST_I16, just_i16, 0);\n    }\n\n    #[inline]\n    pub fn add_maybe_i16(&mut self, maybe_i16: i16) {\n        self.fbb_.push_slot_always::<i16>(ScalarStuff::VT_MAYBE_I16, maybe_i16);\n    }\n\n    #[inline]\n    pub fn add_default_i16(&mut self, default_i16: i16) {\n        self.fbb_.push_slot::<i16>(ScalarStuff::VT_DEFAULT_I16, default_i16, 42);\n    }\n\n    #[inline]\n    pub fn add_just_u16(&mut self, just_u16: u16) {\n        self.fbb_.push_slot::<u16>(ScalarStuff::VT_JUST_U16, just_u16, 0);\n    }\n\n    #[inline]\n    pub fn add_maybe_u16(&mut self, maybe_u16: u16) {\n        self.fbb_.push_slot_always::<u16>(ScalarStuff::VT_MAYBE_U16, maybe_u16);\n    }\n\n    #[inline]\n    pub fn add_default_u16(&mut self, default_u16: u16) {\n        self.fbb_.push_slot::<u16>(ScalarStuff::VT_DEFAULT_U16, default_u16, 42);\n    }\n\n    #[inline]\n    pub fn add_just_i32(&mut self, just_i32: i32) {\n        self.fbb_.push_slot::<i32>(ScalarStuff::VT_JUST_I32, just_i32, 0);\n    }\n\n    #[inline]\n    pub fn add_maybe_i32(&mut self, maybe_i32: i32) {\n        self.fbb_.push_slot_always::<i32>(ScalarStuff::VT_MAYBE_I32, maybe_i32);\n    }\n\n    #[inline]\n    pub fn add_default_i32(&mut self, default_i32: i32) {\n        self.fbb_.push_slot::<i32>(ScalarStuff::VT_DEFAULT_I32, default_i32, 42);\n    }\n\n    #[inline]\n    pub fn add_just_u32(&mut self, just_u32: u32) {\n        self.fbb_.push_slot::<u32>(ScalarStuff::VT_JUST_U32, just_u32, 0);\n    }\n\n    #[inline]\n    pub fn add_maybe_u32(&mut self, maybe_u32: u32) {\n        self.fbb_.push_slot_always::<u32>(ScalarStuff::VT_MAYBE_U32, maybe_u32);\n    }\n\n    #[inline]\n    pub fn add_default_u32(&mut self, default_u32: u32) {\n        self.fbb_.push_slot::<u32>(ScalarStuff::VT_DEFAULT_U32, default_u32, 42);\n    }\n\n    #[inline]\n    pub fn add_just_i64(&mut self, just_i64: i64) {\n        self.fbb_.push_slot::<i64>(ScalarStuff::VT_JUST_I64, just_i64, 0);\n    }\n\n    #[inline]\n    pub fn add_maybe_i64(&mut self, maybe_i64: i64) {\n        self.fbb_.push_slot_always::<i64>(ScalarStuff::VT_MAYBE_I64, maybe_i64);\n    }\n\n    #[inline]\n    pub fn add_default_i64(&mut self, default_i64: i64) {\n        self.fbb_.push_slot::<i64>(ScalarStuff::VT_DEFAULT_I64, default_i64, 42);\n    }\n\n    #[inline]\n    pub fn add_just_u64(&mut self, just_u64: u64) {\n        self.fbb_.push_slot::<u64>(ScalarStuff::VT_JUST_U64, just_u64, 0);\n    }\n\n    #[inline]\n    pub fn add_maybe_u64(&mut self, maybe_u64: u64) {\n        self.fbb_.push_slot_always::<u64>(ScalarStuff::VT_MAYBE_U64, maybe_u64);\n    }\n\n    #[inline]\n    pub fn add_default_u64(&mut self, default_u64: u64) {\n        self.fbb_.push_slot::<u64>(ScalarStuff::VT_DEFAULT_U64, default_u64, 42);\n    }\n\n    #[inline]\n    pub fn add_just_f32(&mut self, just_f32: f32) {\n        self.fbb_.push_slot::<f32>(ScalarStuff::VT_JUST_F32, just_f32, 0.0);\n    }\n\n    #[inline]\n    pub fn add_maybe_f32(&mut self, maybe_f32: f32) {\n        self.fbb_.push_slot_always::<f32>(ScalarStuff::VT_MAYBE_F32, maybe_f32);\n    }\n\n    #[inline]\n    pub fn add_default_f32(&mut self, default_f32: f32) {\n        self.fbb_.push_slot::<f32>(ScalarStuff::VT_DEFAULT_F32, default_f32, 42.0);\n    }\n\n    #[inline]\n    pub fn add_just_f64(&mut self, just_f64: f64) {\n        self.fbb_.push_slot::<f64>(ScalarStuff::VT_JUST_F64, just_f64, 0.0);\n    }\n\n    #[inline]\n    pub fn add_maybe_f64(&mut self, maybe_f64: f64) {\n        self.fbb_.push_slot_always::<f64>(ScalarStuff::VT_MAYBE_F64, maybe_f64);\n    }\n\n    #[inline]\n    pub fn add_default_f64(&mut self, default_f64: f64) {\n        self.fbb_.push_slot::<f64>(ScalarStuff::VT_DEFAULT_F64, default_f64, 42.0);\n    }\n\n    #[inline]\n    pub fn add_just_bool(&mut self, just_bool: bool) {\n        self.fbb_.push_slot::<bool>(ScalarStuff::VT_JUST_BOOL, just_bool, false);\n    }\n\n    #[inline]\n    pub fn add_maybe_bool(&mut self, maybe_bool: bool) {\n        self.fbb_.push_slot_always::<bool>(ScalarStuff::VT_MAYBE_BOOL, maybe_bool);\n    }\n\n    #[inline]\n    pub fn add_default_bool(&mut self, default_bool: bool) {\n        self.fbb_.push_slot::<bool>(ScalarStuff::VT_DEFAULT_BOOL, default_bool, true);\n    }\n\n    #[inline]\n    pub fn add_just_enum(&mut self, just_enum: OptionalByte) {\n        self.fbb_.push_slot::<OptionalByte>(ScalarStuff::VT_JUST_ENUM, just_enum, OptionalByte::None);\n    }\n\n    #[inline]\n    pub fn add_maybe_enum(&mut self, maybe_enum: OptionalByte) {\n        self.fbb_.push_slot_always::<OptionalByte>(ScalarStuff::VT_MAYBE_ENUM, maybe_enum);\n    }\n\n    #[inline]\n    pub fn add_default_enum(&mut self, default_enum: OptionalByte) {\n        self.fbb_.push_slot::<OptionalByte>(ScalarStuff::VT_DEFAULT_ENUM, default_enum, OptionalByte::One);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> ScalarStuffBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        ScalarStuffBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<ScalarStuff<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for ScalarStuff<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"ScalarStuff\");\n        ds.field(\"just_i8\", &self.just_i8());\n        ds.field(\"maybe_i8\", &self.maybe_i8());\n        ds.field(\"default_i8\", &self.default_i8());\n        ds.field(\"just_u8\", &self.just_u8());\n        ds.field(\"maybe_u8\", &self.maybe_u8());\n        ds.field(\"default_u8\", &self.default_u8());\n        ds.field(\"just_i16\", &self.just_i16());\n        ds.field(\"maybe_i16\", &self.maybe_i16());\n        ds.field(\"default_i16\", &self.default_i16());\n        ds.field(\"just_u16\", &self.just_u16());\n        ds.field(\"maybe_u16\", &self.maybe_u16());\n        ds.field(\"default_u16\", &self.default_u16());\n        ds.field(\"just_i32\", &self.just_i32());\n        ds.field(\"maybe_i32\", &self.maybe_i32());\n        ds.field(\"default_i32\", &self.default_i32());\n        ds.field(\"just_u32\", &self.just_u32());\n        ds.field(\"maybe_u32\", &self.maybe_u32());\n        ds.field(\"default_u32\", &self.default_u32());\n        ds.field(\"just_i64\", &self.just_i64());\n        ds.field(\"maybe_i64\", &self.maybe_i64());\n        ds.field(\"default_i64\", &self.default_i64());\n        ds.field(\"just_u64\", &self.just_u64());\n        ds.field(\"maybe_u64\", &self.maybe_u64());\n        ds.field(\"default_u64\", &self.default_u64());\n        ds.field(\"just_f32\", &self.just_f32());\n        ds.field(\"maybe_f32\", &self.maybe_f32());\n        ds.field(\"default_f32\", &self.default_f32());\n        ds.field(\"just_f64\", &self.just_f64());\n        ds.field(\"maybe_f64\", &self.maybe_f64());\n        ds.field(\"default_f64\", &self.default_f64());\n        ds.field(\"just_bool\", &self.just_bool());\n        ds.field(\"maybe_bool\", &self.maybe_bool());\n        ds.field(\"default_bool\", &self.default_bool());\n        ds.field(\"just_enum\", &self.just_enum());\n        ds.field(\"maybe_enum\", &self.maybe_enum());\n        ds.field(\"default_enum\", &self.default_enum());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct ScalarStuffT {\n    pub just_i8: i8,\n    pub maybe_i8: Option<i8>,\n    pub default_i8: i8,\n    pub just_u8: u8,\n    pub maybe_u8: Option<u8>,\n    pub default_u8: u8,\n    pub just_i16: i16,\n    pub maybe_i16: Option<i16>,\n    pub default_i16: i16,\n    pub just_u16: u16,\n    pub maybe_u16: Option<u16>,\n    pub default_u16: u16,\n    pub just_i32: i32,\n    pub maybe_i32: Option<i32>,\n    pub default_i32: i32,\n    pub just_u32: u32,\n    pub maybe_u32: Option<u32>,\n    pub default_u32: u32,\n    pub just_i64: i64,\n    pub maybe_i64: Option<i64>,\n    pub default_i64: i64,\n    pub just_u64: u64,\n    pub maybe_u64: Option<u64>,\n    pub default_u64: u64,\n    pub just_f32: f32,\n    pub maybe_f32: Option<f32>,\n    pub default_f32: f32,\n    pub just_f64: f64,\n    pub maybe_f64: Option<f64>,\n    pub default_f64: f64,\n    pub just_bool: bool,\n    pub maybe_bool: Option<bool>,\n    pub default_bool: bool,\n    pub just_enum: OptionalByte,\n    pub maybe_enum: Option<OptionalByte>,\n    pub default_enum: OptionalByte,\n}\n\nimpl Default for ScalarStuffT {\n    fn default() -> Self {\n        Self {\n            just_i8: 0,\n            maybe_i8: None,\n            default_i8: 42,\n            just_u8: 0,\n            maybe_u8: None,\n            default_u8: 42,\n            just_i16: 0,\n            maybe_i16: None,\n            default_i16: 42,\n            just_u16: 0,\n            maybe_u16: None,\n            default_u16: 42,\n            just_i32: 0,\n            maybe_i32: None,\n            default_i32: 42,\n            just_u32: 0,\n            maybe_u32: None,\n            default_u32: 42,\n            just_i64: 0,\n            maybe_i64: None,\n            default_i64: 42,\n            just_u64: 0,\n            maybe_u64: None,\n            default_u64: 42,\n            just_f32: 0.0,\n            maybe_f32: None,\n            default_f32: 42.0,\n            just_f64: 0.0,\n            maybe_f64: None,\n            default_f64: 42.0,\n            just_bool: false,\n            maybe_bool: None,\n            default_bool: true,\n            just_enum: OptionalByte::None,\n            maybe_enum: None,\n            default_enum: OptionalByte::One,\n        }\n    }\n}\n\nimpl ScalarStuffT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<ScalarStuff<'b>> {\n        let just_i8 = self.just_i8;\n        let maybe_i8 = self.maybe_i8;\n        let default_i8 = self.default_i8;\n        let just_u8 = self.just_u8;\n        let maybe_u8 = self.maybe_u8;\n        let default_u8 = self.default_u8;\n        let just_i16 = self.just_i16;\n        let maybe_i16 = self.maybe_i16;\n        let default_i16 = self.default_i16;\n        let just_u16 = self.just_u16;\n        let maybe_u16 = self.maybe_u16;\n        let default_u16 = self.default_u16;\n        let just_i32 = self.just_i32;\n        let maybe_i32 = self.maybe_i32;\n        let default_i32 = self.default_i32;\n        let just_u32 = self.just_u32;\n        let maybe_u32 = self.maybe_u32;\n        let default_u32 = self.default_u32;\n        let just_i64 = self.just_i64;\n        let maybe_i64 = self.maybe_i64;\n        let default_i64 = self.default_i64;\n        let just_u64 = self.just_u64;\n        let maybe_u64 = self.maybe_u64;\n        let default_u64 = self.default_u64;\n        let just_f32 = self.just_f32;\n        let maybe_f32 = self.maybe_f32;\n        let default_f32 = self.default_f32;\n        let just_f64 = self.just_f64;\n        let maybe_f64 = self.maybe_f64;\n        let default_f64 = self.default_f64;\n        let just_bool = self.just_bool;\n        let maybe_bool = self.maybe_bool;\n        let default_bool = self.default_bool;\n        let just_enum = self.just_enum;\n        let maybe_enum = self.maybe_enum;\n        let default_enum = self.default_enum;\n        ScalarStuff::create(_fbb, &ScalarStuffArgs{\n            just_i8,\n            maybe_i8,\n            default_i8,\n            just_u8,\n            maybe_u8,\n            default_u8,\n            just_i16,\n            maybe_i16,\n            default_i16,\n            just_u16,\n            maybe_u16,\n            default_u16,\n            just_i32,\n            maybe_i32,\n            default_i32,\n            just_u32,\n            maybe_u32,\n            default_u32,\n            just_i64,\n            maybe_i64,\n            default_i64,\n            just_u64,\n            maybe_u64,\n            default_u64,\n            just_f32,\n            maybe_f32,\n            default_f32,\n            just_f64,\n            maybe_f64,\n            default_f64,\n            just_bool,\n            maybe_bool,\n            default_bool,\n            just_enum,\n            maybe_enum,\n            default_enum,\n        })\n    }\n}\n\n/// Verifies that a buffer of bytes contains a `ScalarStuff`\n/// and returns it.\n/// Note that verification is still experimental and may not\n/// catch every error, or be maximally performant. For the\n/// previous, unchecked, behavior use\n/// `root_as_scalar_stuff_unchecked`.\n#[inline]\npub fn root_as_scalar_stuff(buf: &[u8]) -> Result<ScalarStuff<'_>, ::flatbuffers::InvalidFlatbuffer> {\n    ::flatbuffers::root::<ScalarStuff>(buf)\n}\n\n/// Verifies that a buffer of bytes contains a size prefixed\n/// `ScalarStuff` and returns it.\n/// Note that verification is still experimental and may not\n/// catch every error, or be maximally performant. For the\n/// previous, unchecked, behavior use\n/// `size_prefixed_root_as_scalar_stuff_unchecked`.\n#[inline]\npub fn size_prefixed_root_as_scalar_stuff(buf: &[u8]) -> Result<ScalarStuff<'_>, ::flatbuffers::InvalidFlatbuffer> {\n    ::flatbuffers::size_prefixed_root::<ScalarStuff>(buf)\n}\n\n/// Verifies, with the given options, that a buffer of bytes\n/// contains a `ScalarStuff` and returns it.\n/// Note that verification is still experimental and may not\n/// catch every error, or be maximally performant. For the\n/// previous, unchecked, behavior use\n/// `root_as_scalar_stuff_unchecked`.\n#[inline]\npub fn root_as_scalar_stuff_with_opts<'b, 'o>(\n    opts: &'o ::flatbuffers::VerifierOptions,\n    buf: &'b [u8],\n) -> Result<ScalarStuff<'b>, ::flatbuffers::InvalidFlatbuffer> {\n    ::flatbuffers::root_with_opts::<ScalarStuff<'b>>(opts, buf)\n}\n\n/// Verifies, with the given verifier options, that a buffer of\n/// bytes contains a size prefixed `ScalarStuff` and returns\n/// it. Note that verification is still experimental and may not\n/// catch every error, or be maximally performant. For the\n/// previous, unchecked, behavior use\n/// `root_as_scalar_stuff_unchecked`.\n#[inline]\npub fn size_prefixed_root_as_scalar_stuff_with_opts<'b, 'o>(\n    opts: &'o ::flatbuffers::VerifierOptions,\n    buf: &'b [u8],\n) -> Result<ScalarStuff<'b>, ::flatbuffers::InvalidFlatbuffer> {\n    ::flatbuffers::size_prefixed_root_with_opts::<ScalarStuff<'b>>(opts, buf)\n}\n\n/// Assumes, without verification, that a buffer of bytes contains a ScalarStuff and returns it.\n/// # Safety\n/// Callers must trust the given bytes do indeed contain a valid `ScalarStuff`.\n#[inline]\npub unsafe fn root_as_scalar_stuff_unchecked(buf: &[u8]) -> ScalarStuff<'_> {\n    unsafe { ::flatbuffers::root_unchecked::<ScalarStuff>(buf) }\n}\n\n/// Assumes, without verification, that a buffer of bytes contains a size prefixed ScalarStuff and returns it.\n/// # Safety\n/// Callers must trust the given bytes do indeed contain a valid size prefixed `ScalarStuff`.\n#[inline]\npub unsafe fn size_prefixed_root_as_scalar_stuff_unchecked(buf: &[u8]) -> ScalarStuff<'_> {\n    unsafe { ::flatbuffers::size_prefixed_root_unchecked::<ScalarStuff>(buf) }\n}\n\npub const SCALAR_STUFF_IDENTIFIER: &str = \"NULL\";\n\n#[inline]\npub fn scalar_stuff_buffer_has_identifier(buf: &[u8]) -> bool {\n    ::flatbuffers::buffer_has_identifier(buf, SCALAR_STUFF_IDENTIFIER, false)\n}\n\n#[inline]\npub fn scalar_stuff_size_prefixed_buffer_has_identifier(buf: &[u8]) -> bool {\n    ::flatbuffers::buffer_has_identifier(buf, SCALAR_STUFF_IDENTIFIER, true)\n}\n\npub const SCALAR_STUFF_EXTENSION: &str = \"mon\";\n\n#[inline]\npub fn finish_scalar_stuff_buffer<'a, 'b, A: ::flatbuffers::Allocator + 'a>(\n    fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    root: ::flatbuffers::WIPOffset<ScalarStuff<'a>>\n) {\n    fbb.finish(root, Some(SCALAR_STUFF_IDENTIFIER));\n}\n\n#[inline]\npub fn finish_size_prefixed_scalar_stuff_buffer<'a, 'b, A: ::flatbuffers::Allocator + 'a>(\n    fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    root: ::flatbuffers::WIPOffset<ScalarStuff<'a>>\n) {\n    fbb.finish_size_prefixed(root, Some(SCALAR_STUFF_IDENTIFIER));\n}\n"
  },
  {
    "path": "tests/optional_scalars.fbs",
    "content": "namespace optional_scalars;\n\nenum OptionalByte: byte {\n  None = 0,\n  One = 1,\n  Two = 2,\n}\n\n// This table tests optional scalars in tables. It should be integrated with\n// the main monster test once most languages support optional scalars.\ntable ScalarStuff {\n  just_i8: int8;\n  maybe_i8: int8 = null;\n  default_i8: int8 = 42;\n  just_u8: uint8;\n  maybe_u8: uint8 = null;\n  default_u8: uint8 = 42;\n\n  just_i16: int16;\n  maybe_i16: int16 = null;\n  default_i16: int16 = 42;\n  just_u16: uint16;\n  maybe_u16: uint16 = null;\n  default_u16: uint16 = 42;\n\n  just_i32: int32;\n  maybe_i32: int32 = null;\n  default_i32: int32 = 42;\n  just_u32: uint32;\n  maybe_u32: uint32 = null;\n  default_u32: uint32 = 42;\n\n  just_i64: int64;\n  maybe_i64: int64 = null;\n  default_i64: int64 = 42;\n  just_u64: uint64;\n  maybe_u64: uint64 = null;\n  default_u64: uint64 = 42;\n\n  just_f32: float32;\n  maybe_f32: float32 = null;\n  default_f32: float32 = 42;\n  just_f64: float64;\n  maybe_f64: float64 = null;\n  default_f64: float64 = 42;\n\n  just_bool: bool;\n  maybe_bool: bool = null;\n  default_bool: bool = true;\n\n  just_enum: OptionalByte;\n  maybe_enum: OptionalByte = null;\n  default_enum: OptionalByte = One;\n}\n\nroot_type ScalarStuff;\n\nfile_identifier \"NULL\";\nfile_extension \"mon\";\n"
  },
  {
    "path": "tests/optional_scalars.json",
    "content": "{\n  just_i8: 4,\n  maybe_u8: 0,\n  default_u8: 0,\n  just_i16: 4,\n  maybe_u16: 0,\n  default_u16: 0,\n  just_i32: 4,\n  maybe_u32: 0,\n  default_u32: 0,\n  just_i64: 4,\n  maybe_u64: 0,\n  default_u64: 0,\n  just_f32: 4.0,\n  maybe_f64: 0.0,\n  default_f64: 0.0,\n  just_bool: true,\n  default_bool: false,\n  maybe_enum: \"One\",\n  default_enum: \"Two\"\n}\n"
  },
  {
    "path": "tests/optional_scalars_defaults.json",
    "content": "{\n  just_i8: 4,\n  maybe_i8: null,\n  default_i8: 42,\n  just_u8: 0,\n  maybe_u8: 0,\n  default_u8: 0,\n  just_i16: 4,\n  maybe_i16: null,\n  default_i16: 42,\n  just_u16: 0,\n  maybe_u16: 0,\n  default_u16: 0,\n  just_i32: 4,\n  maybe_i32: null,\n  default_i32: 42,\n  just_u32: 0,\n  maybe_u32: 0,\n  default_u32: 0,\n  just_i64: 4,\n  maybe_i64: null,\n  default_i64: 42,\n  just_u64: 0,\n  maybe_u64: 0,\n  default_u64: 0,\n  just_f32: 4.0,\n  maybe_f32: null,\n  default_f32: 42.0,\n  just_f64: 0.0,\n  maybe_f64: 0.0,\n  default_f64: 0.0,\n  just_bool: true,\n  maybe_bool: null,\n  default_bool: false,\n  just_enum: \"None\",\n  maybe_enum: \"One\",\n  default_enum: \"Two\"\n}\n"
  },
  {
    "path": "tests/optional_scalars_generated.lobster",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\nimport flatbuffers\n\nnamespace optional_scalars\n\nenum OptionalByte:\n    OptionalByte_None = 0\n    OptionalByte_One = 1\n    OptionalByte_Two = 2\n\nclass ScalarStuff\n\nclass ScalarStuff : flatbuffers.handle\n    def just_i8() -> int:\n        return flatbuffers.field_int8(buf_, pos_, 4, 0)\n    def maybe_i8() -> int, bool:\n        return flatbuffers.field_int8(buf_, pos_, 6, 0), flatbuffers.field_present(buf_, pos_, 6)\n    def default_i8() -> int:\n        return flatbuffers.field_int8(buf_, pos_, 8, 42)\n    def just_u8() -> int:\n        return flatbuffers.field_uint8(buf_, pos_, 10, 0)\n    def maybe_u8() -> int, bool:\n        return flatbuffers.field_uint8(buf_, pos_, 12, 0), flatbuffers.field_present(buf_, pos_, 12)\n    def default_u8() -> int:\n        return flatbuffers.field_uint8(buf_, pos_, 14, 42)\n    def just_i16() -> int:\n        return flatbuffers.field_int16(buf_, pos_, 16, 0)\n    def maybe_i16() -> int, bool:\n        return flatbuffers.field_int16(buf_, pos_, 18, 0), flatbuffers.field_present(buf_, pos_, 18)\n    def default_i16() -> int:\n        return flatbuffers.field_int16(buf_, pos_, 20, 42)\n    def just_u16() -> int:\n        return flatbuffers.field_uint16(buf_, pos_, 22, 0)\n    def maybe_u16() -> int, bool:\n        return flatbuffers.field_uint16(buf_, pos_, 24, 0), flatbuffers.field_present(buf_, pos_, 24)\n    def default_u16() -> int:\n        return flatbuffers.field_uint16(buf_, pos_, 26, 42)\n    def just_i32() -> int:\n        return flatbuffers.field_int32(buf_, pos_, 28, 0)\n    def maybe_i32() -> int, bool:\n        return flatbuffers.field_int32(buf_, pos_, 30, 0), flatbuffers.field_present(buf_, pos_, 30)\n    def default_i32() -> int:\n        return flatbuffers.field_int32(buf_, pos_, 32, 42)\n    def just_u32() -> int:\n        return flatbuffers.field_uint32(buf_, pos_, 34, 0)\n    def maybe_u32() -> int, bool:\n        return flatbuffers.field_uint32(buf_, pos_, 36, 0), flatbuffers.field_present(buf_, pos_, 36)\n    def default_u32() -> int:\n        return flatbuffers.field_uint32(buf_, pos_, 38, 42)\n    def just_i64() -> int:\n        return flatbuffers.field_int64(buf_, pos_, 40, 0)\n    def maybe_i64() -> int, bool:\n        return flatbuffers.field_int64(buf_, pos_, 42, 0), flatbuffers.field_present(buf_, pos_, 42)\n    def default_i64() -> int:\n        return flatbuffers.field_int64(buf_, pos_, 44, 42)\n    def just_u64() -> int:\n        return flatbuffers.field_uint64(buf_, pos_, 46, 0)\n    def maybe_u64() -> int, bool:\n        return flatbuffers.field_uint64(buf_, pos_, 48, 0), flatbuffers.field_present(buf_, pos_, 48)\n    def default_u64() -> int:\n        return flatbuffers.field_uint64(buf_, pos_, 50, 42)\n    def just_f32() -> float:\n        return flatbuffers.field_float32(buf_, pos_, 52, 0.0)\n    def maybe_f32() -> float, bool:\n        return flatbuffers.field_float32(buf_, pos_, 54, 0.0), flatbuffers.field_present(buf_, pos_, 54)\n    def default_f32() -> float:\n        return flatbuffers.field_float32(buf_, pos_, 56, 42.0)\n    def just_f64() -> float:\n        return flatbuffers.field_float64(buf_, pos_, 58, 0.0)\n    def maybe_f64() -> float, bool:\n        return flatbuffers.field_float64(buf_, pos_, 60, 0.0), flatbuffers.field_present(buf_, pos_, 60)\n    def default_f64() -> float:\n        return flatbuffers.field_float64(buf_, pos_, 62, 42.0)\n    def just_bool() -> bool:\n        return bool(flatbuffers.field_int8(buf_, pos_, 64, 0))\n    def maybe_bool() -> bool, bool:\n        return bool(flatbuffers.field_int8(buf_, pos_, 66, 0)), flatbuffers.field_present(buf_, pos_, 66)\n    def default_bool() -> bool:\n        return bool(flatbuffers.field_int8(buf_, pos_, 68, 1))\n    def just_enum() -> OptionalByte:\n        return OptionalByte(flatbuffers.field_int8(buf_, pos_, 70, 0))\n    def maybe_enum() -> OptionalByte, bool:\n        return OptionalByte(flatbuffers.field_int8(buf_, pos_, 72, 0)), flatbuffers.field_present(buf_, pos_, 72)\n    def default_enum() -> OptionalByte:\n        return OptionalByte(flatbuffers.field_int8(buf_, pos_, 74, 1))\n\ndef GetRootAsScalarStuff(buf:string): return ScalarStuff { buf, flatbuffers.indirect(buf, 0) }\n\nstruct ScalarStuffBuilder:\n    b_:flatbuffers.builder\n    def start():\n        b_.StartObject(36)\n        return this\n    def add_just_i8(just_i8:int):\n        b_.PrependInt8Slot(0, just_i8, 0)\n        return this\n    def add_maybe_i8(maybe_i8:int):\n        b_.PrependInt8Slot(1, maybe_i8)\n        return this\n    def add_default_i8(default_i8:int):\n        b_.PrependInt8Slot(2, default_i8, 42)\n        return this\n    def add_just_u8(just_u8:int):\n        b_.PrependUint8Slot(3, just_u8, 0)\n        return this\n    def add_maybe_u8(maybe_u8:int):\n        b_.PrependUint8Slot(4, maybe_u8)\n        return this\n    def add_default_u8(default_u8:int):\n        b_.PrependUint8Slot(5, default_u8, 42)\n        return this\n    def add_just_i16(just_i16:int):\n        b_.PrependInt16Slot(6, just_i16, 0)\n        return this\n    def add_maybe_i16(maybe_i16:int):\n        b_.PrependInt16Slot(7, maybe_i16)\n        return this\n    def add_default_i16(default_i16:int):\n        b_.PrependInt16Slot(8, default_i16, 42)\n        return this\n    def add_just_u16(just_u16:int):\n        b_.PrependUint16Slot(9, just_u16, 0)\n        return this\n    def add_maybe_u16(maybe_u16:int):\n        b_.PrependUint16Slot(10, maybe_u16)\n        return this\n    def add_default_u16(default_u16:int):\n        b_.PrependUint16Slot(11, default_u16, 42)\n        return this\n    def add_just_i32(just_i32:int):\n        b_.PrependInt32Slot(12, just_i32, 0)\n        return this\n    def add_maybe_i32(maybe_i32:int):\n        b_.PrependInt32Slot(13, maybe_i32)\n        return this\n    def add_default_i32(default_i32:int):\n        b_.PrependInt32Slot(14, default_i32, 42)\n        return this\n    def add_just_u32(just_u32:int):\n        b_.PrependUint32Slot(15, just_u32, 0)\n        return this\n    def add_maybe_u32(maybe_u32:int):\n        b_.PrependUint32Slot(16, maybe_u32)\n        return this\n    def add_default_u32(default_u32:int):\n        b_.PrependUint32Slot(17, default_u32, 42)\n        return this\n    def add_just_i64(just_i64:int):\n        b_.PrependInt64Slot(18, just_i64, 0)\n        return this\n    def add_maybe_i64(maybe_i64:int):\n        b_.PrependInt64Slot(19, maybe_i64)\n        return this\n    def add_default_i64(default_i64:int):\n        b_.PrependInt64Slot(20, default_i64, 42)\n        return this\n    def add_just_u64(just_u64:int):\n        b_.PrependUint64Slot(21, just_u64, 0)\n        return this\n    def add_maybe_u64(maybe_u64:int):\n        b_.PrependUint64Slot(22, maybe_u64)\n        return this\n    def add_default_u64(default_u64:int):\n        b_.PrependUint64Slot(23, default_u64, 42)\n        return this\n    def add_just_f32(just_f32:float):\n        b_.PrependFloat32Slot(24, just_f32, 0.0)\n        return this\n    def add_maybe_f32(maybe_f32:float):\n        b_.PrependFloat32Slot(25, maybe_f32)\n        return this\n    def add_default_f32(default_f32:float):\n        b_.PrependFloat32Slot(26, default_f32, 42.0)\n        return this\n    def add_just_f64(just_f64:float):\n        b_.PrependFloat64Slot(27, just_f64, 0.0)\n        return this\n    def add_maybe_f64(maybe_f64:float):\n        b_.PrependFloat64Slot(28, maybe_f64)\n        return this\n    def add_default_f64(default_f64:float):\n        b_.PrependFloat64Slot(29, default_f64, 42.0)\n        return this\n    def add_just_bool(just_bool:bool):\n        b_.PrependBoolSlot(30, just_bool, 0)\n        return this\n    def add_maybe_bool(maybe_bool:bool):\n        b_.PrependBoolSlot(31, maybe_bool)\n        return this\n    def add_default_bool(default_bool:bool):\n        b_.PrependBoolSlot(32, default_bool, 1)\n        return this\n    def add_just_enum(just_enum:OptionalByte):\n        b_.PrependInt8Slot(33, just_enum, 0)\n        return this\n    def add_maybe_enum(maybe_enum:OptionalByte):\n        b_.PrependInt8Slot(34, maybe_enum)\n        return this\n    def add_default_enum(default_enum:OptionalByte):\n        b_.PrependInt8Slot(35, default_enum, 1)\n        return this\n    def end():\n        return b_.EndObject()\n\n"
  },
  {
    "path": "tests/optional_scalars_generated.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\nexport {OptionalByte} from './optional-scalars/optional-byte';\nexport {ScalarStuff} from './optional-scalars/scalar-stuff';\n"
  },
  {
    "path": "tests/optional_scalars_test.cpp",
    "content": "#include \"optional_scalars_test.h\"\n\n#include <string>\n#include <vector>\n\n#include \"flatbuffers/idl.h\"\n#include \"optional_scalars_generated.h\"\n#include \"test_assert.h\"\n\nnamespace flatbuffers {\nnamespace tests {\n\nvoid OptionalScalarsTest() {\n  // Simple schemas and a \"has optional scalar\" sentinal.\n  std::vector<std::string> schemas;\n  schemas.push_back(\"table Monster { mana : int; }\");\n  schemas.push_back(\"table Monster { mana : int = 42; }\");\n  schemas.push_back(\"table Monster { mana : int =  null; }\");\n  schemas.push_back(\"table Monster { mana : long; }\");\n  schemas.push_back(\"table Monster { mana : long = 42; }\");\n  schemas.push_back(\"table Monster { mana : long = null; }\");\n  schemas.push_back(\"table Monster { mana : float; }\");\n  schemas.push_back(\"table Monster { mana : float = 42; }\");\n  schemas.push_back(\"table Monster { mana : float = null; }\");\n  schemas.push_back(\"table Monster { mana : double; }\");\n  schemas.push_back(\"table Monster { mana : double = 42; }\");\n  schemas.push_back(\"table Monster { mana : double = null; }\");\n  schemas.push_back(\"table Monster { mana : bool; }\");\n  schemas.push_back(\"table Monster { mana : bool = 42; }\");\n  schemas.push_back(\"table Monster { mana : bool = null; }\");\n  schemas.push_back(\n      \"enum Enum: int {A=0, B=1} \"\n      \"table Monster { mana : Enum; }\");\n  schemas.push_back(\n      \"enum Enum: int {A=0, B=1} \"\n      \"table Monster { mana : Enum = B; }\");\n  schemas.push_back(\n      \"enum Enum: int {A=0, B=1} \"\n      \"table Monster { mana : Enum = null; }\");\n\n  // Check the FieldDef is correctly set.\n  for (auto schema = schemas.begin(); schema < schemas.end(); schema++) {\n    const bool has_null = schema->find(\"null\") != std::string::npos;\n    flatbuffers::Parser parser;\n    TEST_ASSERT(parser.Parse(schema->c_str()));\n    const auto* mana = parser.structs_.Lookup(\"Monster\")->fields.Lookup(\"mana\");\n    TEST_EQ(mana->IsOptional(), has_null);\n  }\n\n  // Test if nullable scalars are allowed for each language.\n  for (unsigned lang = 1; lang < flatbuffers::IDLOptions::kMAX; lang <<= 1) {\n    flatbuffers::IDLOptions opts;\n    opts.lang_to_generate = lang;\n    if (false == flatbuffers::Parser::SupportsOptionalScalars(opts)) {\n      continue;\n    }\n    for (auto schema = schemas.begin(); schema < schemas.end(); schema++) {\n      flatbuffers::Parser parser(opts);\n      auto done = parser.Parse(schema->c_str());\n      TEST_EQ_STR(parser.error_.c_str(), \"\");\n      TEST_ASSERT(done);\n    }\n  }\n\n  // test C++ nullable\n  flatbuffers::FlatBufferBuilder fbb;\n  FinishScalarStuffBuffer(\n      fbb, optional_scalars::CreateScalarStuff(fbb, 1, static_cast<int8_t>(2)));\n  auto opts = optional_scalars::GetMutableScalarStuff(fbb.GetBufferPointer());\n  TEST_ASSERT(!opts->maybe_bool());\n  TEST_ASSERT(!opts->maybe_f32().has_value());\n  TEST_ASSERT(opts->maybe_i8().has_value());\n  TEST_EQ(opts->maybe_i8().value(), 2);\n  TEST_ASSERT(opts->mutate_maybe_i8(3));\n  TEST_ASSERT(opts->maybe_i8().has_value());\n  TEST_EQ(opts->maybe_i8().value(), 3);\n  TEST_ASSERT(!opts->mutate_maybe_i16(-10));\n\n  optional_scalars::ScalarStuffT obj;\n  TEST_ASSERT(!obj.maybe_bool);\n  TEST_ASSERT(!obj.maybe_f32.has_value());\n  opts->UnPackTo(&obj);\n  TEST_ASSERT(!obj.maybe_bool);\n  TEST_ASSERT(!obj.maybe_f32.has_value());\n  TEST_ASSERT(obj.maybe_i8.has_value() && obj.maybe_i8.value() == 3);\n  TEST_ASSERT(obj.maybe_i8 && *obj.maybe_i8 == 3);\n  obj.maybe_i32 = -1;\n  obj.maybe_enum = optional_scalars::OptionalByte_Two;\n\n  fbb.Clear();\n  FinishScalarStuffBuffer(fbb, optional_scalars::ScalarStuff::Pack(fbb, &obj));\n  opts = optional_scalars::GetMutableScalarStuff(fbb.GetBufferPointer());\n  TEST_ASSERT(opts->maybe_i8().has_value());\n  TEST_EQ(opts->maybe_i8().value(), 3);\n  TEST_ASSERT(opts->maybe_i32().has_value());\n  TEST_EQ(opts->maybe_i32().value(), -1);\n  TEST_EQ(opts->maybe_enum().value(), optional_scalars::OptionalByte_Two);\n  TEST_ASSERT(opts->maybe_i32() == flatbuffers::Optional<int64_t>(-1));\n}\n\n}  // namespace tests\n}  // namespace flatbuffers\n"
  },
  {
    "path": "tests/optional_scalars_test.h",
    "content": "#ifndef TESTS_OPTIONAL_SCALARS_TEST_H\n#define TESTS_OPTIONAL_SCALARS_TEST_H\n\nnamespace flatbuffers {\nnamespace tests {\n\nvoid OptionalScalarsTest();\n\n}  // namespace tests\n}  // namespace flatbuffers\n\n#endif\n"
  },
  {
    "path": "tests/order/Food.go",
    "content": "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\npackage order\n\nimport (\n\tflatbuffers \"github.com/google/flatbuffers/go\"\n\n\tPizza \"Pizza\"\n)\n\ntype FoodT struct {\n\tPizza     *Pizza.PizzaT `json:\"pizza\"`\n\tPizzaTest *Pizza.PizzaT `json:\"pizza_test\"`\n}\n\nfunc (t *FoodT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\tif t == nil {\n\t\treturn 0\n\t}\n\tpizzaOffset := t.Pizza.Pack(builder)\n\tpizzaTestOffset := t.PizzaTest.Pack(builder)\n\tFoodStart(builder)\n\tFoodAddPizza(builder, pizzaOffset)\n\tFoodAddPizzaTest(builder, pizzaTestOffset)\n\treturn FoodEnd(builder)\n}\n\nfunc (rcv *Food) UnPackTo(t *FoodT) {\n\tt.Pizza = rcv.Pizza(nil).UnPack()\n\tt.PizzaTest = rcv.PizzaTest(nil).UnPack()\n}\n\nfunc (rcv *Food) UnPack() *FoodT {\n\tif rcv == nil {\n\t\treturn nil\n\t}\n\tt := &FoodT{}\n\trcv.UnPackTo(t)\n\treturn t\n}\n\ntype Food struct {\n\t_tab flatbuffers.Table\n}\n\nfunc GetRootAsFood(buf []byte, offset flatbuffers.UOffsetT) *Food {\n\tn := flatbuffers.GetUOffsetT(buf[offset:])\n\tx := &Food{}\n\tx.Init(buf, n+offset)\n\treturn x\n}\n\nfunc GetSizePrefixedRootAsFood(buf []byte, offset flatbuffers.UOffsetT) *Food {\n\tn := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])\n\tx := &Food{}\n\tx.Init(buf, n+offset+flatbuffers.SizeUint32)\n\treturn x\n}\n\nfunc (rcv *Food) Init(buf []byte, i flatbuffers.UOffsetT) {\n\trcv._tab.Bytes = buf\n\trcv._tab.Pos = i\n}\n\nfunc (rcv *Food) Table() flatbuffers.Table {\n\treturn rcv._tab\n}\n\nfunc (rcv *Food) Pizza(obj *Pizza.Pizza) *Pizza.Pizza {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(4))\n\tif o != 0 {\n\t\tx := rcv._tab.Indirect(o + rcv._tab.Pos)\n\t\tif obj == nil {\n\t\t\tobj = new(Pizza.Pizza)\n\t\t}\n\t\tobj.Init(rcv._tab.Bytes, x)\n\t\treturn obj\n\t}\n\treturn nil\n}\n\nfunc (rcv *Food) PizzaTest(obj *Pizza.Pizza) *Pizza.Pizza {\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(6))\n\tif o != 0 {\n\t\tx := rcv._tab.Indirect(o + rcv._tab.Pos)\n\t\tif obj == nil {\n\t\t\tobj = new(Pizza.Pizza)\n\t\t}\n\t\tobj.Init(rcv._tab.Bytes, x)\n\t\treturn obj\n\t}\n\treturn nil\n}\n\nfunc FoodStart(builder *flatbuffers.Builder) {\n\tbuilder.StartObject(2)\n}\nfunc FoodAddPizza(builder *flatbuffers.Builder, pizza flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(pizza), 0)\n}\nfunc FoodAddPizzaTest(builder *flatbuffers.Builder, pizzaTest flatbuffers.UOffsetT) {\n\tbuilder.PrependUOffsetTSlot(1, flatbuffers.UOffsetT(pizzaTest), 0)\n}\nfunc FoodEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {\n\treturn builder.EndObject()\n}\n"
  },
  {
    "path": "tests/parser_test.cpp",
    "content": "#include \"parser_test.h\"\n\n#include <cmath>\n#include <limits>\n#include <string>\n\n#include \"flatbuffers/idl.h\"\n#include \"test_assert.h\"\n\nnamespace flatbuffers {\nnamespace tests {\nnamespace {\n\n// Shortcuts for the infinity.\nstatic const auto infinity_f = std::numeric_limits<float>::infinity();\nstatic const auto infinity_d = std::numeric_limits<double>::infinity();\n\n// Test that parser errors are actually generated.\nstatic void TestError_(const char* src, const char* error_substr,\n                       bool strict_json, const char* file, int line,\n                       const char* func) {\n  flatbuffers::IDLOptions opts;\n  opts.strict_json = strict_json;\n  flatbuffers::Parser parser(opts);\n  if (parser.Parse(src)) {\n    TestFail(\"true\", \"false\",\n             (\"parser.Parse(\\\"\" + std::string(src) + \"\\\")\").c_str(), file, line,\n             func);\n  } else if (!strstr(parser.error_.c_str(), error_substr)) {\n    TestFail(error_substr, parser.error_.c_str(),\n             (\"parser.Parse(\\\"\" + std::string(src) + \"\\\")\").c_str(), file, line,\n             func);\n  }\n}\n\nstatic void TestError_(const char* src, const char* error_substr,\n                       const char* file, int line, const char* func) {\n  TestError_(src, error_substr, false, file, line, func);\n}\n\n#ifdef _WIN32\n#define TestError(src, ...) \\\n  TestError_(src, __VA_ARGS__, __FILE__, __LINE__, __FUNCTION__)\n#else\n#define TestError(src, ...) \\\n  TestError_(src, __VA_ARGS__, __FILE__, __LINE__, __PRETTY_FUNCTION__)\n#endif\n\nstatic bool FloatCompare(float a, float b) { return fabs(a - b) < 0.001; }\n\n}  // namespace\n\n// Test that parsing errors occur as we'd expect.\n// Also useful for coverage, making sure these paths are run.\nvoid ErrorTest() {\n  // In order they appear in idl_parser.cpp\n  TestError(\"table X { Y:byte; } root_type X; { Y: 999 }\", \"does not fit\");\n  TestError(\"\\\"\\0\", \"illegal\");\n  TestError(\"\\\"\\\\q\", \"escape code\");\n  TestError(\"table ///\", \"documentation\");\n  TestError(\"@\", \"illegal\");\n  TestError(\"table 1\", \"expecting\");\n  TestError(\"table X { Y:[[int]]; }\", \"nested vector\");\n  TestError(\"table X { Y:1; }\", \"illegal type\");\n  TestError(\"table X { Y:int; Y:int; }\", \"field already\");\n  TestError(\"table Y {} table X { Y:int; }\", \"same as table\");\n  TestError(\"struct X { Y:string; }\", \"only scalar\");\n  TestError(\"struct X { a:uint = 42; }\", \"default values\");\n  TestError(\"enum Y:byte { Z = 1 } table X { y:Y; }\", \"not part of enum\");\n  TestError(\"struct X { Y:int (deprecated); }\", \"deprecate\");\n  TestError(\"union Z { X } table X { Y:Z; } root_type X; { Y: {}, A:1 }\",\n            \"missing type field\");\n  TestError(\"union Z { X } table X { Y:Z; } root_type X; { Y_type: 99, Y: {\",\n            \"type id\");\n  TestError(\"table X { Y:int; } root_type X; { Z:\", \"unknown field\");\n  TestError(\"table X { Y:int; } root_type X; { Y:\", \"string constant\", true);\n  TestError(\"table X { Y:int; } root_type X; { \\\"Y\\\":1, }\", \"string constant\",\n            true);\n  TestError(\n      \"struct X { Y:int; Z:int; } table W { V:X; } root_type W; \"\n      \"{ V:{ Y:1 } }\",\n      \"wrong number\");\n  TestError(\"enum E:byte { A } table X { Y:E; } root_type X; { Y:U }\",\n            \"unknown enum value\");\n  TestError(\"table X { Y:byte; } root_type X; { Y:; }\", \"starting\");\n  TestError(\"enum X:byte { Y } enum X {\", \"enum already\");\n  TestError(\"enum X:float {}\", \"underlying\");\n  TestError(\"enum X:byte { Y, Y }\", \"value already\");\n  TestError(\"enum X:byte { Y=2, Z=2 }\", \"unique\");\n  TestError(\"enum X:byte (force_align: 4) { Y }\", \"force_align\");\n  TestError(\"table X { Y:int; } table X {\", \"datatype already\");\n  TestError(\"table X { } union X { }\", \"datatype already\");\n  TestError(\"union X { } table X { }\", \"datatype already\");\n  TestError(\"namespace A; table X { } namespace A; union X { }\",\n            \"datatype already\");\n  TestError(\"namespace A; union X { } namespace A; table X { }\",\n            \"datatype already\");\n  TestError(\"struct X (force_align: 7) { Y:int; }\", \"force_align\");\n  TestError(\"struct X {}\", \"size 0\");\n  TestError(\"{}\", \"no root\");\n  TestError(\"table X { Y:byte; } root_type X; { Y:1 } { Y:1 }\", \"end of file\");\n  TestError(\"table X { Y:byte; } root_type X; { Y:1 } table Y{ Z:int }\",\n            \"end of file\");\n  TestError(\"root_type X;\", \"unknown root\");\n  TestError(\"struct X { Y:int; } root_type X;\", \"a table\");\n  TestError(\"union X { Y }\", \"referenced\");\n  TestError(\"union Z { X } struct X { Y:int; }\", \"only tables\");\n  TestError(\"table X { Y:[int]; YLength:int; }\", \"clash\");\n  TestError(\"table X { Y:byte; } root_type X; { Y:1, Y:2 }\", \"more than once\");\n  // float to integer conversion is forbidden\n  TestError(\"table X { Y:int; } root_type X; { Y:1.0 }\", \"float\");\n  TestError(\"table X { Y:bool; } root_type X; { Y:1.0 }\", \"float\");\n  TestError(\"enum X:bool { Y = true }\", \"must be integral\");\n  // Array of non-scalar\n  TestError(\"table X { x:int; } struct Y { y:[X:2]; }\",\n            \"may contain only scalar or struct fields\");\n  // Non-snake case field names\n  TestError(\"table X { Y: int; } root_type Y: {Y:1.0}\", \"snake_case\");\n  // Complex defaults\n  TestError(\"table X { y: string = 1; }\", \"expecting: string\");\n  TestError(\"table X { y: string = []; }\", \" Cannot assign token\");\n  TestError(\"table X { y: [int] = [1]; }\", \"Expected `]`\");\n  TestError(\"table X { y: [int] = [; }\", \"Expected `]`\");\n  TestError(\"table X { y: [int] = \\\"\\\"; }\", \"type mismatch\");\n  // An identifier can't start from sign (+|-)\n  TestError(\"table X { -Y: int; } root_type Y: {Y:1.0}\", \"identifier\");\n  TestError(\"table X { +Y: int; } root_type Y: {Y:1.0}\", \"identifier\");\n\n  // Offset64\n  TestError(\"table X { a:int (vector64); }\", \"`vector64` attribute\");\n  TestError(\"table X { a:int (offset64); }\", \"`offset64` attribute\");\n  TestError(\"table X { a:string (vector64); }\", \"`vector64` attribute\");\n  TestError(\"table y { a:int; } table X { a:y (offset64); }\",\n            \"`offset64` attribute\");\n  TestError(\"struct y { a:int; } table X { a:y (offset64); }\",\n            \"`offset64` attribute\");\n  TestError(\"table y { a:int; } table X { a:y (vector64); }\",\n            \"`vector64` attribute\");\n  TestError(\"union Y { } table X { ys:Y (offset64); }\", \"`offset64` attribute\");\n\n  TestError(\"table Y { a:int; } table X { ys:[Y] (offset64); }\",\n            \"only vectors of scalars are allowed to be 64-bit.\");\n  TestError(\"table Y { a:int; } table X { ys:[Y] (vector64); }\",\n            \"only vectors of scalars are allowed to be 64-bit.\");\n  TestError(\"union Y { } table X { ys:[Y] (vector64); }\",\n            \"only vectors of scalars are allowed to be 64-bit.\");\n\n  // TOOD(derekbailey): the following three could be allowed once the code gen\n  // supports the output.\n  TestError(\"table X { y:[string] (offset64); }\",\n            \"only vectors of scalars are allowed to be 64-bit.\");\n  TestError(\"table X { y:[string] (vector64); }\",\n            \"only vectors of scalars are allowed to be 64-bit.\");\n  TestError(\"enum X:byte {Z} table X { y:[X] (offset64); }\",\n            \"only vectors of scalars are allowed to be 64-bit.\");\n}\n\nvoid EnumOutOfRangeTest() {\n  TestError(\"enum X:byte { Y = 128 }\", \"enum value does not fit\");\n  TestError(\"enum X:byte { Y = -129 }\", \"enum value does not fit\");\n  TestError(\"enum X:byte { Y = 126, Z0, Z1 }\", \"enum value does not fit\");\n  TestError(\"enum X:ubyte { Y = -1 }\", \"enum value does not fit\");\n  TestError(\"enum X:ubyte { Y = 256 }\", \"enum value does not fit\");\n  TestError(\"enum X:ubyte { Y = 255, Z }\", \"enum value does not fit\");\n  TestError(\"table Y{} union X { Y = -1 }\", \"enum value does not fit\");\n  TestError(\"table Y{} union X { Y = 256 }\", \"enum value does not fit\");\n  TestError(\"table Y{} union X { Y = 255, Z:Y }\", \"enum value does not fit\");\n  TestError(\"enum X:int { Y = -2147483649 }\", \"enum value does not fit\");\n  TestError(\"enum X:int { Y = 2147483648 }\", \"enum value does not fit\");\n  TestError(\"enum X:uint { Y = -1 }\", \"enum value does not fit\");\n  TestError(\"enum X:uint { Y = 4294967297 }\", \"enum value does not fit\");\n  TestError(\"enum X:long { Y = 9223372036854775808 }\", \"does not fit\");\n  TestError(\"enum X:long { Y = 9223372036854775807, Z }\",\n            \"enum value does not fit\");\n  TestError(\"enum X:ulong { Y = -1 }\", \"does not fit\");\n  TestError(\"enum X:ubyte (bit_flags) { Y=8 }\", \"bit flag out\");\n  TestError(\"enum X:byte (bit_flags) { Y=7 }\", \"must be unsigned\");  // -128\n  // bit_flgs out of range\n  TestError(\"enum X:ubyte (bit_flags) { Y0,Y1,Y2,Y3,Y4,Y5,Y6,Y7,Y8 }\",\n            \"out of range\");\n}\n\nvoid IntegerOutOfRangeTest() {\n  TestError(\"table T { F:byte; } root_type T; { F:128 }\",\n            \"constant does not fit\");\n  TestError(\"table T { F:byte; } root_type T; { F:-129 }\",\n            \"constant does not fit\");\n  TestError(\"table T { F:ubyte; } root_type T; { F:256 }\",\n            \"constant does not fit\");\n  TestError(\"table T { F:ubyte; } root_type T; { F:-1 }\",\n            \"constant does not fit\");\n  TestError(\"table T { F:short; } root_type T; { F:32768 }\",\n            \"constant does not fit\");\n  TestError(\"table T { F:short; } root_type T; { F:-32769 }\",\n            \"constant does not fit\");\n  TestError(\"table T { F:ushort; } root_type T; { F:65536 }\",\n            \"constant does not fit\");\n  TestError(\"table T { F:ushort; } root_type T; { F:-1 }\",\n            \"constant does not fit\");\n  TestError(\"table T { F:int; } root_type T; { F:2147483648 }\",\n            \"constant does not fit\");\n  TestError(\"table T { F:int; } root_type T; { F:-2147483649 }\",\n            \"constant does not fit\");\n  TestError(\"table T { F:uint; } root_type T; { F:4294967296 }\",\n            \"constant does not fit\");\n  TestError(\"table T { F:uint; } root_type T; { F:-1 }\",\n            \"constant does not fit\");\n  // Check fixed width aliases\n  TestError(\"table X { Y:uint8; } root_type X; { Y: -1 }\", \"does not fit\");\n  TestError(\"table X { Y:uint8; } root_type X; { Y: 256 }\", \"does not fit\");\n  TestError(\"table X { Y:uint16; } root_type X; { Y: -1 }\", \"does not fit\");\n  TestError(\"table X { Y:uint16; } root_type X; { Y: 65536 }\", \"does not fit\");\n  TestError(\"table X { Y:uint32; } root_type X; { Y: -1 }\", \"\");\n  TestError(\"table X { Y:uint32; } root_type X; { Y: 4294967296 }\",\n            \"does not fit\");\n  TestError(\"table X { Y:uint64; } root_type X; { Y: -1 }\", \"\");\n  TestError(\"table X { Y:uint64; } root_type X; { Y: -9223372036854775809 }\",\n            \"does not fit\");\n  TestError(\"table X { Y:uint64; } root_type X; { Y: 18446744073709551616 }\",\n            \"does not fit\");\n\n  TestError(\"table X { Y:int8; } root_type X; { Y: -129 }\", \"does not fit\");\n  TestError(\"table X { Y:int8; } root_type X; { Y: 128 }\", \"does not fit\");\n  TestError(\"table X { Y:int16; } root_type X; { Y: -32769 }\", \"does not fit\");\n  TestError(\"table X { Y:int16; } root_type X; { Y: 32768 }\", \"does not fit\");\n  TestError(\"table X { Y:int32; } root_type X; { Y: -2147483649 }\", \"\");\n  TestError(\"table X { Y:int32; } root_type X; { Y: 2147483648 }\",\n            \"does not fit\");\n  TestError(\"table X { Y:int64; } root_type X; { Y: -9223372036854775809 }\",\n            \"does not fit\");\n  TestError(\"table X { Y:int64; } root_type X; { Y: 9223372036854775808 }\",\n            \"does not fit\");\n  // check out-of-int64 as int8\n  TestError(\"table X { Y:int8; } root_type X; { Y: -9223372036854775809 }\",\n            \"does not fit\");\n  TestError(\"table X { Y:int8; } root_type X; { Y: 9223372036854775808 }\",\n            \"does not fit\");\n\n  // Check default values\n  TestError(\"table X { Y:int64=-9223372036854775809; } root_type X; {}\",\n            \"does not fit\");\n  TestError(\"table X { Y:int64= 9223372036854775808; } root_type X; {}\",\n            \"does not fit\");\n  TestError(\"table X { Y:uint64; } root_type X; { Y: -1 }\", \"\");\n  TestError(\"table X { Y:uint64=-9223372036854775809; } root_type X; {}\",\n            \"does not fit\");\n  TestError(\"table X { Y:uint64= 18446744073709551616; } root_type X; {}\",\n            \"does not fit\");\n}\n\nvoid InvalidFloatTest() {\n  auto invalid_msg = \"invalid number\";\n  auto comma_msg = \"expecting: ,\";\n  TestError(\"table T { F:float; } root_type T; { F:1,0 }\", \"\");\n  TestError(\"table T { F:float; } root_type T; { F:. }\", \"\");\n  TestError(\"table T { F:float; } root_type T; { F:- }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:+ }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:-. }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:+. }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:.e }\", \"\");\n  TestError(\"table T { F:float; } root_type T; { F:-e }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:+e }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:-.e }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:+.e }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:-e1 }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:+e1 }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:1.0e+ }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:1.0e- }\", invalid_msg);\n  // exponent pP is mandatory for hex-float\n  TestError(\"table T { F:float; } root_type T; { F:0x0 }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:-0x. }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:0x. }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:0Xe }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:\\\"0Xe\\\" }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:\\\"nan(1)\\\" }\", invalid_msg);\n  // eE not exponent in hex-float!\n  TestError(\"table T { F:float; } root_type T; { F:0x0.0e+ }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:0x0.0e- }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:0x0.0p }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:0x0.0p+ }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:0x0.0p- }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:0x0.0pa1 }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:0x0.0e+ }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:0x0.0e- }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:0x0.0e+0 }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:0x0.0e-0 }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:0x0.0ep+ }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:0x0.0ep- }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:1.2.3 }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:1.2.e3 }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:1.2e.3 }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:1.2e0.3 }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:1.2e3. }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:1.2e3.0 }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:+-1.0 }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:1.0e+-1 }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:\\\"1.0e+-1\\\" }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:1.e0e }\", comma_msg);\n  TestError(\"table T { F:float; } root_type T; { F:0x1.p0e }\", comma_msg);\n  TestError(\"table T { F:float; } root_type T; { F:\\\" 0x10 \\\" }\", invalid_msg);\n  // floats in string\n  TestError(\"table T { F:float; } root_type T; { F:\\\"1,2.\\\" }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:\\\"1.2e3.\\\" }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:\\\"0x1.p0e\\\" }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:\\\"0x1.0\\\" }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:\\\" 0x1.0\\\" }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:\\\"+ 0\\\" }\", invalid_msg);\n  // disable escapes for \"number-in-string\"\n  TestError(\"table T { F:float; } root_type T; { F:\\\"\\\\f1.2e3.\\\" }\", \"invalid\");\n  TestError(\"table T { F:float; } root_type T; { F:\\\"\\\\t1.2e3.\\\" }\", \"invalid\");\n  TestError(\"table T { F:float; } root_type T; { F:\\\"\\\\n1.2e3.\\\" }\", \"invalid\");\n  TestError(\"table T { F:float; } root_type T; { F:\\\"\\\\r1.2e3.\\\" }\", \"invalid\");\n  TestError(\"table T { F:float; } root_type T; { F:\\\"4\\\\x005\\\" }\", \"invalid\");\n  TestError(\"table T { F:float; } root_type T; { F:\\\"\\'12\\'\\\" }\", invalid_msg);\n  // null is not a number constant!\n  TestError(\"table T { F:float; } root_type T; { F:\\\"null\\\" }\", invalid_msg);\n  TestError(\"table T { F:float; } root_type T; { F:null }\", invalid_msg);\n}\n\nvoid UnicodeInvalidSurrogatesTest() {\n  TestError(\n      \"table T { F:string; }\"\n      \"root_type T;\"\n      \"{ F:\\\"\\\\uD800\\\"}\",\n      \"unpaired high surrogate\");\n  TestError(\n      \"table T { F:string; }\"\n      \"root_type T;\"\n      \"{ F:\\\"\\\\uD800abcd\\\"}\",\n      \"unpaired high surrogate\");\n  TestError(\n      \"table T { F:string; }\"\n      \"root_type T;\"\n      \"{ F:\\\"\\\\uD800\\\\n\\\"}\",\n      \"unpaired high surrogate\");\n  TestError(\n      \"table T { F:string; }\"\n      \"root_type T;\"\n      \"{ F:\\\"\\\\uD800\\\\uD800\\\"}\",\n      \"multiple high surrogates\");\n  TestError(\n      \"table T { F:string; }\"\n      \"root_type T;\"\n      \"{ F:\\\"\\\\uDC00\\\"}\",\n      \"unpaired low surrogate\");\n}\n\nvoid InvalidUTF8Test() {\n  // \"1 byte\" pattern, under min length of 2 bytes\n  TestError(\n      \"table T { F:string; }\"\n      \"root_type T;\"\n      \"{ F:\\\"\\x80\\\"}\",\n      \"illegal UTF-8 sequence\");\n  // 2 byte pattern, string too short\n  TestError(\n      \"table T { F:string; }\"\n      \"root_type T;\"\n      \"{ F:\\\"\\xDF\\\"}\",\n      \"illegal UTF-8 sequence\");\n  // 3 byte pattern, string too short\n  TestError(\n      \"table T { F:string; }\"\n      \"root_type T;\"\n      \"{ F:\\\"\\xEF\\xBF\\\"}\",\n      \"illegal UTF-8 sequence\");\n  // 4 byte pattern, string too short\n  TestError(\n      \"table T { F:string; }\"\n      \"root_type T;\"\n      \"{ F:\\\"\\xF7\\xBF\\xBF\\\"}\",\n      \"illegal UTF-8 sequence\");\n  // \"5 byte\" pattern, string too short\n  TestError(\n      \"table T { F:string; }\"\n      \"root_type T;\"\n      \"{ F:\\\"\\xFB\\xBF\\xBF\\xBF\\\"}\",\n      \"illegal UTF-8 sequence\");\n  // \"6 byte\" pattern, string too short\n  TestError(\n      \"table T { F:string; }\"\n      \"root_type T;\"\n      \"{ F:\\\"\\xFD\\xBF\\xBF\\xBF\\xBF\\\"}\",\n      \"illegal UTF-8 sequence\");\n  // \"7 byte\" pattern, string too short\n  TestError(\n      \"table T { F:string; }\"\n      \"root_type T;\"\n      \"{ F:\\\"\\xFE\\xBF\\xBF\\xBF\\xBF\\xBF\\\"}\",\n      \"illegal UTF-8 sequence\");\n  // \"5 byte\" pattern, over max length of 4 bytes\n  TestError(\n      \"table T { F:string; }\"\n      \"root_type T;\"\n      \"{ F:\\\"\\xFB\\xBF\\xBF\\xBF\\xBF\\\"}\",\n      \"illegal UTF-8 sequence\");\n  // \"6 byte\" pattern, over max length of 4 bytes\n  TestError(\n      \"table T { F:string; }\"\n      \"root_type T;\"\n      \"{ F:\\\"\\xFD\\xBF\\xBF\\xBF\\xBF\\xBF\\\"}\",\n      \"illegal UTF-8 sequence\");\n  // \"7 byte\" pattern, over max length of 4 bytes\n  TestError(\n      \"table T { F:string; }\"\n      \"root_type T;\"\n      \"{ F:\\\"\\xFE\\xBF\\xBF\\xBF\\xBF\\xBF\\xBF\\\"}\",\n      \"illegal UTF-8 sequence\");\n\n  // Three invalid encodings for U+000A (\\n, aka NEWLINE)\n  TestError(\n      \"table T { F:string; }\"\n      \"root_type T;\"\n      \"{ F:\\\"\\xC0\\x8A\\\"}\",\n      \"illegal UTF-8 sequence\");\n  TestError(\n      \"table T { F:string; }\"\n      \"root_type T;\"\n      \"{ F:\\\"\\xE0\\x80\\x8A\\\"}\",\n      \"illegal UTF-8 sequence\");\n  TestError(\n      \"table T { F:string; }\"\n      \"root_type T;\"\n      \"{ F:\\\"\\xF0\\x80\\x80\\x8A\\\"}\",\n      \"illegal UTF-8 sequence\");\n\n  // Two invalid encodings for U+00A9 (COPYRIGHT SYMBOL)\n  TestError(\n      \"table T { F:string; }\"\n      \"root_type T;\"\n      \"{ F:\\\"\\xE0\\x81\\xA9\\\"}\",\n      \"illegal UTF-8 sequence\");\n  TestError(\n      \"table T { F:string; }\"\n      \"root_type T;\"\n      \"{ F:\\\"\\xF0\\x80\\x81\\xA9\\\"}\",\n      \"illegal UTF-8 sequence\");\n\n  // Invalid encoding for U+20AC (EURO SYMBOL)\n  TestError(\n      \"table T { F:string; }\"\n      \"root_type T;\"\n      \"{ F:\\\"\\xF0\\x82\\x82\\xAC\\\"}\",\n      \"illegal UTF-8 sequence\");\n\n  // UTF-16 surrogate values between U+D800 and U+DFFF cannot be encoded in\n  // UTF-8\n  TestError(\n      \"table T { F:string; }\"\n      \"root_type T;\"\n      // U+10400 \"encoded\" as U+D801 U+DC00\n      \"{ F:\\\"\\xED\\xA0\\x81\\xED\\xB0\\x80\\\"}\",\n      \"illegal UTF-8 sequence\");\n\n  // Check independence of identifier from locale.\n  std::string locale_ident;\n  locale_ident += \"table T { F\";\n  locale_ident += static_cast<char>(-32);  // unsigned 0xE0\n  locale_ident += \" :string; }\";\n  locale_ident += \"root_type T;\";\n  locale_ident += \"{}\";\n  TestError(locale_ident.c_str(), \"\");\n}\n\ntemplate <typename T>\nT TestValue(const char* json, const char* type_name,\n            const char* decls = nullptr) {\n  flatbuffers::Parser parser;\n  parser.builder_.ForceDefaults(true);  // return defaults\n  auto check_default = json ? false : true;\n  if (check_default) {\n    parser.opts.output_default_scalars_in_json = true;\n  }\n  // Simple schema.\n  std::string schema = std::string(decls ? decls : \"\") + \"\\n\" +\n                       \"table X { y:\" + std::string(type_name) +\n                       \"; } root_type X;\";\n  auto schema_done = parser.Parse(schema.c_str());\n  TEST_EQ_STR(parser.error_.c_str(), \"\");\n  TEST_EQ(schema_done, true);\n\n  auto done = parser.Parse(check_default ? \"{}\" : json);\n  TEST_EQ_STR(parser.error_.c_str(), \"\");\n  TEST_EQ(done, true);\n\n  // Check with print.\n  std::string print_back;\n  parser.opts.indent_step = -1;\n  TEST_NULL(GenText(parser, parser.builder_.GetBufferPointer(), &print_back));\n  // restore value from its default\n  if (check_default) {\n    TEST_EQ(parser.Parse(print_back.c_str()), true);\n  }\n\n  auto root = flatbuffers::GetRoot<flatbuffers::Table>(\n      parser.builder_.GetBufferPointer());\n  return root->GetField<T>(flatbuffers::FieldIndexToOffset(0), 0);\n}\n\n// Additional parser testing not covered elsewhere.\nvoid ValueTest() {\n  // Test scientific notation numbers.\n  TEST_EQ(\n      FloatCompare(TestValue<float>(\"{ y:0.0314159e+2 }\", \"float\"), 3.14159f),\n      true);\n  // number in string\n  TEST_EQ(FloatCompare(TestValue<float>(\"{ y:\\\"0.0314159e+2\\\" }\", \"float\"),\n                       3.14159f),\n          true);\n\n  // Test conversion functions.\n  TEST_EQ(FloatCompare(TestValue<float>(\"{ y:cos(rad(180)) }\", \"float\"), -1),\n          true);\n\n  // int embedded to string\n  TEST_EQ(TestValue<int>(\"{ y:\\\"-876\\\" }\", \"int=-123\"), -876);\n  TEST_EQ(TestValue<int>(\"{ y:\\\"876\\\" }\", \"int=-123\"), 876);\n\n  // Test negative hex constant.\n  TEST_EQ(TestValue<int>(\"{ y:-0x8ea0 }\", \"int=-0x8ea0\"), -36512);\n  TEST_EQ(TestValue<int>(nullptr, \"int=-0x8ea0\"), -36512);\n\n  // positive hex constant\n  TEST_EQ(TestValue<int>(\"{ y:0x1abcdef }\", \"int=0x1\"), 0x1abcdef);\n  // with optional '+' sign\n  TEST_EQ(TestValue<int>(\"{ y:+0x1abcdef }\", \"int=+0x1\"), 0x1abcdef);\n  // hex in string\n  TEST_EQ(TestValue<int>(\"{ y:\\\"0x1abcdef\\\" }\", \"int=+0x1\"), 0x1abcdef);\n\n  // Make sure we do unsigned 64bit correctly.\n  TEST_EQ(TestValue<uint64_t>(\"{ y:12335089644688340133 }\", \"ulong\"),\n          12335089644688340133ULL);\n\n  // bool in string\n  TEST_EQ(TestValue<bool>(\"{ y:\\\"false\\\" }\", \"bool=true\"), false);\n  TEST_EQ(TestValue<bool>(\"{ y:\\\"true\\\" }\", \"bool=\\\"true\\\"\"), true);\n  TEST_EQ(TestValue<bool>(\"{ y:'false' }\", \"bool=true\"), false);\n  TEST_EQ(TestValue<bool>(\"{ y:'true' }\", \"bool=\\\"true\\\"\"), true);\n\n  // check comments before and after json object\n  TEST_EQ(TestValue<int>(\"/*before*/ { y:1 } /*after*/\", \"int\"), 1);\n  TEST_EQ(TestValue<int>(\"//before \\n { y:1 } //after\", \"int\"), 1);\n}\n\nvoid NestedListTest() {\n  flatbuffers::Parser parser1;\n  TEST_EQ(parser1.Parse(\"struct Test { a:short; b:byte; } table T { F:[Test]; }\"\n                        \"root_type T;\"\n                        \"{ F:[ [10,20], [30,40]] }\"),\n          true);\n}\n\nvoid EnumStringsTest() {\n  flatbuffers::Parser parser1;\n  TEST_EQ(parser1.Parse(\"enum E:byte { A, B, C } table T { F:[E]; }\"\n                        \"root_type T;\"\n                        \"{ F:[ A, B, \\\"C\\\", \\\"A B C\\\" ] }\"),\n          true);\n  flatbuffers::Parser parser2;\n  TEST_EQ(parser2.Parse(\"enum E:byte { A, B, C } table T { F:[int]; }\"\n                        \"root_type T;\"\n                        \"{ F:[ \\\"E.C\\\", \\\"E.A E.B E.C\\\" ] }\"),\n          true);\n  // unsigned bit_flags\n  flatbuffers::Parser parser3;\n  TEST_EQ(\n      parser3.Parse(\"enum E:uint16 (bit_flags) { F0, F07=7, F08, F14=14, F15 }\"\n                    \" table T { F: E = \\\"F15 F08\\\"; }\"\n                    \"root_type T;\"),\n      true);\n}\n\nvoid EnumValueTest() {\n  // json: \"{ Y:0 }\", schema: table X { y: \"E\"}\n  // 0 in enum (V=0) E then Y=0 is valid.\n  TEST_EQ(TestValue<int>(\"{ y:0 }\", \"E\", \"enum E:int { V }\"), 0);\n  TEST_EQ(TestValue<int>(\"{ y:V }\", \"E\", \"enum E:int { V }\"), 0);\n  // A default value of Y is 0.\n  TEST_EQ(TestValue<int>(\"{ }\", \"E\", \"enum E:int { V }\"), 0);\n  TEST_EQ(TestValue<int>(\"{ y:5 }\", \"E=V\", \"enum E:int { V=5 }\"), 5);\n  // Generate json with defaults and check.\n  TEST_EQ(TestValue<int>(nullptr, \"E=V\", \"enum E:int { V=5 }\"), 5);\n  // 5 in enum\n  TEST_EQ(TestValue<int>(\"{ y:5 }\", \"E\", \"enum E:int { Z, V=5 }\"), 5);\n  TEST_EQ(TestValue<int>(\"{ y:5 }\", \"E=V\", \"enum E:int { Z, V=5 }\"), 5);\n  // Generate json with defaults and check.\n  TEST_EQ(TestValue<int>(nullptr, \"E\", \"enum E:int { Z, V=5 }\"), 0);\n  TEST_EQ(TestValue<int>(nullptr, \"E=V\", \"enum E:int { Z, V=5 }\"), 5);\n  // u84 test\n  TEST_EQ(TestValue<uint64_t>(nullptr, \"E=V\",\n                              \"enum E:ulong { V = 13835058055282163712 }\"),\n          13835058055282163712ULL);\n  TEST_EQ(TestValue<uint64_t>(nullptr, \"E=V\",\n                              \"enum E:ulong { V = 18446744073709551615 }\"),\n          18446744073709551615ULL);\n  // Assign non-enum value to enum field. Is it right?\n  TEST_EQ(TestValue<int>(\"{ y:7 }\", \"E\", \"enum E:int { V = 0 }\"), 7);\n  // Check that non-ascending values are valid.\n  TEST_EQ(TestValue<int>(\"{ y:5 }\", \"E=V\", \"enum E:int { Z=10, V=5 }\"), 5);\n}\n\nvoid IntegerBoundaryTest() {\n  // Check numerical compatibility with non-C++ languages.\n  // By the C++ standard, std::numerical_limits<int64_t>::min() ==\n  // -9223372036854775807 (-2^63+1) or less* The Flatbuffers grammar and most of\n  // the languages (C#, Java, Rust) expect that minimum values are: -128,\n  // -32768,.., -9223372036854775808. Since C++20,\n  // static_cast<int64>(0x8000000000000000ULL) is well-defined two's complement\n  // cast. Therefore -9223372036854775808 should be valid negative value.\n  TEST_EQ(flatbuffers::numeric_limits<int8_t>::min(), -128);\n  TEST_EQ(flatbuffers::numeric_limits<int8_t>::max(), 127);\n  TEST_EQ(flatbuffers::numeric_limits<int16_t>::min(), -32768);\n  TEST_EQ(flatbuffers::numeric_limits<int16_t>::max(), 32767);\n  TEST_EQ(flatbuffers::numeric_limits<int32_t>::min() + 1, -2147483647);\n  TEST_EQ(flatbuffers::numeric_limits<int32_t>::max(), 2147483647ULL);\n  TEST_EQ(flatbuffers::numeric_limits<int64_t>::min() + 1LL,\n          -9223372036854775807LL);\n  TEST_EQ(flatbuffers::numeric_limits<int64_t>::max(), 9223372036854775807ULL);\n  TEST_EQ(flatbuffers::numeric_limits<uint8_t>::max(), 255);\n  TEST_EQ(flatbuffers::numeric_limits<uint16_t>::max(), 65535);\n  TEST_EQ(flatbuffers::numeric_limits<uint32_t>::max(), 4294967295ULL);\n  TEST_EQ(flatbuffers::numeric_limits<uint64_t>::max(),\n          18446744073709551615ULL);\n\n  TEST_EQ(TestValue<int8_t>(\"{ y:127 }\", \"byte\"), 127);\n  TEST_EQ(TestValue<int8_t>(\"{ y:-128 }\", \"byte\"), -128);\n  TEST_EQ(TestValue<uint8_t>(\"{ y:255 }\", \"ubyte\"), 255);\n  TEST_EQ(TestValue<uint8_t>(\"{ y:0 }\", \"ubyte\"), 0);\n  TEST_EQ(TestValue<int16_t>(\"{ y:32767 }\", \"short\"), 32767);\n  TEST_EQ(TestValue<int16_t>(\"{ y:-32768 }\", \"short\"), -32768);\n  TEST_EQ(TestValue<uint16_t>(\"{ y:65535 }\", \"ushort\"), 65535);\n  TEST_EQ(TestValue<uint16_t>(\"{ y:0 }\", \"ushort\"), 0);\n  TEST_EQ(TestValue<int32_t>(\"{ y:2147483647 }\", \"int\"), 2147483647);\n  TEST_EQ(TestValue<int32_t>(\"{ y:-2147483648 }\", \"int\") + 1, -2147483647);\n  TEST_EQ(TestValue<uint32_t>(\"{ y:4294967295 }\", \"uint\"), 4294967295);\n  TEST_EQ(TestValue<uint32_t>(\"{ y:0 }\", \"uint\"), 0);\n  TEST_EQ(TestValue<int64_t>(\"{ y:9223372036854775807 }\", \"long\"),\n          9223372036854775807LL);\n  TEST_EQ(TestValue<int64_t>(\"{ y:-9223372036854775808 }\", \"long\") + 1LL,\n          -9223372036854775807LL);\n  TEST_EQ(TestValue<uint64_t>(\"{ y:18446744073709551615 }\", \"ulong\"),\n          18446744073709551615ULL);\n  TEST_EQ(TestValue<uint64_t>(\"{ y:0 }\", \"ulong\"), 0);\n  TEST_EQ(TestValue<uint64_t>(\"{ y: 18446744073709551615 }\", \"uint64\"),\n          18446744073709551615ULL);\n  // check that the default works\n  TEST_EQ(TestValue<uint64_t>(nullptr, \"uint64 = 18446744073709551615\"),\n          18446744073709551615ULL);\n}\n\nvoid ValidFloatTest() {\n  // check rounding to infinity\n  TEST_EQ(TestValue<float>(\"{ y:+3.4029e+38 }\", \"float\"), +infinity_f);\n  TEST_EQ(TestValue<float>(\"{ y:-3.4029e+38 }\", \"float\"), -infinity_f);\n  TEST_EQ(TestValue<double>(\"{ y:+1.7977e+308 }\", \"double\"), +infinity_d);\n  TEST_EQ(TestValue<double>(\"{ y:-1.7977e+308 }\", \"double\"), -infinity_d);\n\n  TEST_EQ(\n      FloatCompare(TestValue<float>(\"{ y:0.0314159e+2 }\", \"float\"), 3.14159f),\n      true);\n  // float in string\n  TEST_EQ(FloatCompare(TestValue<float>(\"{ y:\\\" 0.0314159e+2  \\\" }\", \"float\"),\n                       3.14159f),\n          true);\n\n  TEST_EQ(TestValue<float>(\"{ y:1 }\", \"float\"), 1.0f);\n  TEST_EQ(TestValue<float>(\"{ y:1.0 }\", \"float\"), 1.0f);\n  TEST_EQ(TestValue<float>(\"{ y:1. }\", \"float\"), 1.0f);\n  TEST_EQ(TestValue<float>(\"{ y:+1. }\", \"float\"), 1.0f);\n  TEST_EQ(TestValue<float>(\"{ y:-1. }\", \"float\"), -1.0f);\n  TEST_EQ(TestValue<float>(\"{ y:1.e0 }\", \"float\"), 1.0f);\n  TEST_EQ(TestValue<float>(\"{ y:1.e+0 }\", \"float\"), 1.0f);\n  TEST_EQ(TestValue<float>(\"{ y:1.e-0 }\", \"float\"), 1.0f);\n  TEST_EQ(TestValue<float>(\"{ y:0.125 }\", \"float\"), 0.125f);\n  TEST_EQ(TestValue<float>(\"{ y:.125 }\", \"float\"), 0.125f);\n  TEST_EQ(TestValue<float>(\"{ y:-.125 }\", \"float\"), -0.125f);\n  TEST_EQ(TestValue<float>(\"{ y:+.125 }\", \"float\"), +0.125f);\n  TEST_EQ(TestValue<float>(\"{ y:5 }\", \"float\"), 5.0f);\n  TEST_EQ(TestValue<float>(\"{ y:\\\"5\\\" }\", \"float\"), 5.0f);\n\n#if defined(FLATBUFFERS_HAS_NEW_STRTOD) && (FLATBUFFERS_HAS_NEW_STRTOD > 0)\n  // Old MSVC versions may have problem with this check.\n  // https://www.exploringbinary.com/visual-c-plus-plus-strtod-still-broken/\n  TEST_EQ(TestValue<double>(\"{ y:6.9294956446009195e15 }\", \"double\"),\n          6929495644600920.0);\n  // check nan's\n  TEST_EQ(std::isnan(TestValue<double>(\"{ y:nan }\", \"double\")), true);\n  TEST_EQ(std::isnan(TestValue<float>(\"{ y:nan }\", \"float\")), true);\n  TEST_EQ(std::isnan(TestValue<float>(\"{ y:\\\"nan\\\" }\", \"float\")), true);\n  TEST_EQ(std::isnan(TestValue<float>(\"{ y:\\\"+nan\\\" }\", \"float\")), true);\n  TEST_EQ(std::isnan(TestValue<float>(\"{ y:\\\"-nan\\\" }\", \"float\")), true);\n  TEST_EQ(std::isnan(TestValue<float>(\"{ y:+nan }\", \"float\")), true);\n  TEST_EQ(std::isnan(TestValue<float>(\"{ y:-nan }\", \"float\")), true);\n  TEST_EQ(std::isnan(TestValue<float>(nullptr, \"float=nan\")), true);\n  TEST_EQ(std::isnan(TestValue<float>(nullptr, \"float=-nan\")), true);\n  // check inf\n  TEST_EQ(TestValue<float>(\"{ y:inf }\", \"float\"), infinity_f);\n  TEST_EQ(TestValue<float>(\"{ y:\\\"inf\\\" }\", \"float\"), infinity_f);\n  TEST_EQ(TestValue<float>(\"{ y:\\\"-inf\\\" }\", \"float\"), -infinity_f);\n  TEST_EQ(TestValue<float>(\"{ y:\\\"+inf\\\" }\", \"float\"), infinity_f);\n  TEST_EQ(TestValue<float>(\"{ y:+inf }\", \"float\"), infinity_f);\n  TEST_EQ(TestValue<float>(\"{ y:-inf }\", \"float\"), -infinity_f);\n  TEST_EQ(TestValue<float>(nullptr, \"float=inf\"), infinity_f);\n  TEST_EQ(TestValue<float>(nullptr, \"float=-inf\"), -infinity_f);\n  TestValue<double>(\n      \"{ y: [0.2, .2, 1.0, -1.0, -2., 2., 1e0, -1e0, 1.0e0, -1.0e0, -3.e2, \"\n      \"3.0e2] }\",\n      \"[double]\");\n  TestValue<float>(\n      \"{ y: [0.2, .2, 1.0, -1.0, -2., 2., 1e0, -1e0, 1.0e0, -1.0e0, -3.e2, \"\n      \"3.0e2] }\",\n      \"[float]\");\n\n  // Test binary format of float point.\n  // https://en.cppreference.com/w/cpp/language/floating_literal\n  // 0x11.12p-1 = (1*16^1 + 2*16^0 + 3*16^-1 + 4*16^-2) * 2^-1 =\n  TEST_EQ(TestValue<double>(\"{ y:0x12.34p-1 }\", \"double\"), 9.1015625);\n  // hex fraction 1.2 (decimal 1.125) scaled by 2^3, that is 9.0\n  TEST_EQ(TestValue<float>(\"{ y:-0x0.2p0 }\", \"float\"), -0.125f);\n  TEST_EQ(TestValue<float>(\"{ y:-0x.2p1 }\", \"float\"), -0.25f);\n  TEST_EQ(TestValue<float>(\"{ y:0x1.2p3 }\", \"float\"), 9.0f);\n  TEST_EQ(TestValue<float>(\"{ y:0x10.1p0 }\", \"float\"), 16.0625f);\n  TEST_EQ(TestValue<double>(\"{ y:0x1.2p3 }\", \"double\"), 9.0);\n  TEST_EQ(TestValue<double>(\"{ y:0x10.1p0 }\", \"double\"), 16.0625);\n  TEST_EQ(TestValue<double>(\"{ y:0xC.68p+2 }\", \"double\"), 49.625);\n  TestValue<double>(\"{ y: [0x20.4ep1, +0x20.4ep1, -0x20.4ep1] }\", \"[double]\");\n  TestValue<float>(\"{ y: [0x20.4ep1, +0x20.4ep1, -0x20.4ep1] }\", \"[float]\");\n\n#else   // FLATBUFFERS_HAS_NEW_STRTOD\n  TEST_OUTPUT_LINE(\"FLATBUFFERS_HAS_NEW_STRTOD tests skipped\");\n#endif  // !FLATBUFFERS_HAS_NEW_STRTOD\n}\n\nvoid UnicodeTest() {\n  flatbuffers::Parser parser;\n  // Without setting allow_non_utf8 = true, we treat \\x sequences as byte\n  // sequences which are then validated as UTF-8.\n  TEST_EQ(parser.Parse(\"table T { F:string; }\"\n                       \"root_type T;\"\n                       \"{ F:\\\"\\\\u20AC\\\\u00A2\\\\u30E6\\\\u30FC\\\\u30B6\\\\u30FC\"\n                       \"\\\\u5225\\\\u30B5\\\\u30A4\\\\u30C8\\\\xE2\\\\x82\\\\xAC\\\\u0080\\\\uD8\"\n                       \"3D\\\\uDE0E\\\" }\"),\n          true);\n  std::string jsongen;\n  parser.opts.indent_step = -1;\n  auto result = GenText(parser, parser.builder_.GetBufferPointer(), &jsongen);\n  TEST_NULL(result);\n  TEST_EQ_STR(jsongen.c_str(),\n              \"{F: \\\"\\\\u20AC\\\\u00A2\\\\u30E6\\\\u30FC\\\\u30B6\\\\u30FC\"\n              \"\\\\u5225\\\\u30B5\\\\u30A4\\\\u30C8\\\\u20AC\\\\u0080\\\\uD83D\\\\uDE0E\\\"}\");\n}\n\nvoid UnicodeTestAllowNonUTF8() {\n  flatbuffers::Parser parser;\n  parser.opts.allow_non_utf8 = true;\n  TEST_EQ(\n      parser.Parse(\n          \"table T { F:string; }\"\n          \"root_type T;\"\n          \"{ F:\\\"\\\\u20AC\\\\u00A2\\\\u30E6\\\\u30FC\\\\u30B6\\\\u30FC\"\n          \"\\\\u5225\\\\u30B5\\\\u30A4\\\\u30C8\\\\x01\\\\x80\\\\u0080\\\\uD83D\\\\uDE0E\\\" }\"),\n      true);\n  std::string jsongen;\n  parser.opts.indent_step = -1;\n  auto result = GenText(parser, parser.builder_.GetBufferPointer(), &jsongen);\n  TEST_NULL(result);\n  TEST_EQ_STR(\n      jsongen.c_str(),\n      \"{F: \\\"\\\\u20AC\\\\u00A2\\\\u30E6\\\\u30FC\\\\u30B6\\\\u30FC\"\n      \"\\\\u5225\\\\u30B5\\\\u30A4\\\\u30C8\\\\u0001\\\\x80\\\\u0080\\\\uD83D\\\\uDE0E\\\"}\");\n}\n\nvoid UnicodeTestGenerateTextFailsOnNonUTF8() {\n  flatbuffers::Parser parser;\n  // Allow non-UTF-8 initially to model what happens when we load a binary\n  // flatbuffer from disk which contains non-UTF-8 strings.\n  parser.opts.allow_non_utf8 = true;\n  TEST_EQ(\n      parser.Parse(\n          \"table T { F:string; }\"\n          \"root_type T;\"\n          \"{ F:\\\"\\\\u20AC\\\\u00A2\\\\u30E6\\\\u30FC\\\\u30B6\\\\u30FC\"\n          \"\\\\u5225\\\\u30B5\\\\u30A4\\\\u30C8\\\\x01\\\\x80\\\\u0080\\\\uD83D\\\\uDE0E\\\" }\"),\n      true);\n  std::string jsongen;\n  parser.opts.indent_step = -1;\n  // Now, disallow non-UTF-8 (the default behavior) so GenText indicates\n  // failure.\n  parser.opts.allow_non_utf8 = false;\n  auto result = GenText(parser, parser.builder_.GetBufferPointer(), &jsongen);\n  TEST_EQ_STR(result, \"string contains non-utf8 bytes\");\n}\n\nvoid UnicodeSurrogatesTest() {\n  flatbuffers::Parser parser;\n\n  TEST_EQ(parser.Parse(\"table T { F:string (id: 0); }\"\n                       \"root_type T;\"\n                       \"{ F:\\\"\\\\uD83D\\\\uDCA9\\\"}\"),\n          true);\n  auto root = flatbuffers::GetRoot<flatbuffers::Table>(\n      parser.builder_.GetBufferPointer());\n  auto string = root->GetPointer<flatbuffers::String*>(\n      flatbuffers::FieldIndexToOffset(0));\n  TEST_EQ_STR(string->c_str(), \"\\xF0\\x9F\\x92\\xA9\");\n}\n\nvoid UnknownFieldsTest() {\n  flatbuffers::IDLOptions opts;\n  opts.skip_unexpected_fields_in_json = true;\n  flatbuffers::Parser parser(opts);\n\n  TEST_EQ(parser.Parse(\"table T { str:string; i:int;}\"\n                       \"root_type T;\"\n                       \"{ str:\\\"test\\\",\"\n                       \"unknown_string:\\\"test\\\",\"\n                       \"\\\"unknown_string\\\":\\\"test\\\",\"\n                       \"unknown_int:10,\"\n                       \"unknown_float:1.0,\"\n                       \"unknown_array: [ 1, 2, 3, 4],\"\n                       \"unknown_object: { i: 10 },\"\n                       \"\\\"unknown_object\\\": { \\\"i\\\": 10 },\"\n                       \"i:10}\"),\n          true);\n\n  std::string jsongen;\n  parser.opts.indent_step = -1;\n  auto result = GenText(parser, parser.builder_.GetBufferPointer(), &jsongen);\n  TEST_NULL(result);\n  TEST_EQ_STR(jsongen.c_str(), \"{str: \\\"test\\\",i: 10}\");\n}\n\nvoid ParseUnionTest() {\n  // Unions must be parseable with the type field following the object.\n  flatbuffers::Parser parser;\n  TEST_EQ(parser.Parse(\"table T { A:int; }\"\n                       \"union U { T }\"\n                       \"table V { X:U; }\"\n                       \"root_type V;\"\n                       \"{ X:{ A:1 }, X_type: T }\"),\n          true);\n  // Unions must be parsable with prefixed namespace.\n  flatbuffers::Parser parser2;\n  TEST_EQ(parser2.Parse(\"namespace N; table A {} namespace; union U { N.A }\"\n                        \"table B { e:U; } root_type B;\"\n                        \"{ e_type: N_A, e: {} }\"),\n          true);\n\n  // Test union underlying type\n  const char* source =\n      \"table A {} table B {} union U : int {A, B} table C {test_union: U; \"\n      \"test_vector_of_union: [U];}\";\n  flatbuffers::Parser parser3;\n  parser3.opts.lang_to_generate =\n      flatbuffers::IDLOptions::kCpp | flatbuffers::IDLOptions::kTs;\n  TEST_EQ(parser3.Parse(source), true);\n\n  parser3.opts.lang_to_generate &= flatbuffers::IDLOptions::kJava;\n  TEST_EQ(parser3.Parse(source), false);\n}\n\nvoid ValidSameNameDifferentNamespaceTest() {\n  // Duplicate table names in different namespaces must be parsable\n  TEST_ASSERT(flatbuffers::Parser().Parse(\n      \"namespace A; table X {} namespace B; table X {}\"));\n  // Duplicate union names in different namespaces must be parsable\n  TEST_ASSERT(flatbuffers::Parser().Parse(\n      \"namespace A; union X {} namespace B; union X {}\"));\n  // Clashing table and union names in different namespaces must be parsable\n  TEST_ASSERT(flatbuffers::Parser().Parse(\n      \"namespace A; table X {} namespace B; union X {}\"));\n  TEST_ASSERT(flatbuffers::Parser().Parse(\n      \"namespace A; union X {} namespace B; table X {}\"));\n}\n\nvoid WarningsAsErrorsTest() {\n  {\n    flatbuffers::IDLOptions opts;\n    // opts.warnings_as_errors should default to false\n    flatbuffers::Parser parser(opts);\n    TEST_EQ(parser.Parse(\"table T { THIS_NAME_CAUSES_A_WARNING:string;}\\n\"\n                         \"root_type T;\"),\n            true);\n  }\n  {\n    flatbuffers::IDLOptions opts;\n    opts.warnings_as_errors = true;\n    flatbuffers::Parser parser(opts);\n    TEST_EQ(parser.Parse(\"table T { THIS_NAME_CAUSES_A_WARNING:string;}\\n\"\n                         \"root_type T;\"),\n            false);\n  }\n}\n\nvoid StringVectorDefaultsTest() {\n  std::vector<std::string> schemas;\n  schemas.push_back(\"table Monster { mana: string = \\\"\\\"; }\");\n  schemas.push_back(\"table Monster { mana: string = \\\"mystr\\\"; }\");\n  schemas.push_back(\"table Monster { mana: string = \\\"  \\\"; }\");\n  schemas.push_back(\"table Monster { mana: string = \\\"null\\\"; }\");\n  schemas.push_back(\"table Monster { mana: [int] = []; }\");\n  schemas.push_back(\"table Monster { mana: [uint] = [  ]; }\");\n  schemas.push_back(\"table Monster { mana: [byte] = [\\t\\t\\n]; }\");\n  schemas.push_back(\"enum E:int{}table Monster{mana:[E]=[];}\");\n  for (auto s = schemas.begin(); s < schemas.end(); s++) {\n    flatbuffers::Parser parser;\n    TEST_ASSERT(parser.Parse(s->c_str()));\n    const auto* mana = parser.structs_.Lookup(\"Monster\")->fields.Lookup(\"mana\");\n    TEST_EQ(mana->IsDefault(), true);\n  }\n}\n\nvoid FieldIdentifierTest() {\n  using flatbuffers::Parser;\n  TEST_EQ(true, Parser().Parse(\"table T{ f: int (id:0); }\"));\n  // non-integer `id` should be rejected\n  TEST_EQ(false, Parser().Parse(\"table T{ f: int (id:text); }\"));\n  TEST_EQ(false, Parser().Parse(\"table T{ f: int (id:\\\"text\\\"); }\"));\n  TEST_EQ(false, Parser().Parse(\"table T{ f: int (id:0text); }\"));\n  TEST_EQ(false, Parser().Parse(\"table T{ f: int (id:1.0); }\"));\n  TEST_EQ(false, Parser().Parse(\"table T{ f: int (id:-1); g: int (id:0); }\"));\n  TEST_EQ(false, Parser().Parse(\"table T{ f: int (id:129496726); }\"));\n  // A unuion filed occupys two ids: enumerator + pointer (offset).\n  TEST_EQ(false,\n          Parser().Parse(\"union X{} table T{ u: X(id:0); table F{x:int;\\n}\"));\n  // Positive tests for unions\n  TEST_EQ(true, Parser().Parse(\"union X{} table T{ u: X (id:1); }\"));\n  TEST_EQ(true, Parser().Parse(\"union X{} table T{ u: X; }\"));\n  // Test using 'inf' and 'nan' words both as identifiers and as default values.\n  TEST_EQ(true, Parser().Parse(\"table T{ nan: string; }\"));\n  TEST_EQ(true, Parser().Parse(\"table T{ inf: string; }\"));\n#if defined(FLATBUFFERS_HAS_NEW_STRTOD) && (FLATBUFFERS_HAS_NEW_STRTOD > 0)\n  TEST_EQ(true, Parser().Parse(\"table T{ inf: float = inf; }\"));\n  TEST_EQ(true, Parser().Parse(\"table T{ nan: float = inf; }\"));\n#endif\n}\n\n}  // namespace tests\n}  // namespace flatbuffers\n"
  },
  {
    "path": "tests/parser_test.h",
    "content": "#ifndef TESTS_PARSER_TEST_H\n#define TESTS_PARSER_TEST_H\n\nnamespace flatbuffers {\nnamespace tests {\n\nvoid ErrorTest();\nvoid EnumOutOfRangeTest();\nvoid IntegerOutOfRangeTest();\nvoid InvalidFloatTest();\nvoid UnicodeInvalidSurrogatesTest();\nvoid InvalidUTF8Test();\nvoid ValueTest();\nvoid NestedListTest();\nvoid EnumStringsTest();\nvoid EnumValueTest();\nvoid IntegerBoundaryTest();\nvoid ValidFloatTest();\nvoid UnicodeTest();\nvoid UnicodeTestAllowNonUTF8();\nvoid UnicodeTestGenerateTextFailsOnNonUTF8();\nvoid UnicodeSurrogatesTest();\nvoid UnknownFieldsTest();\nvoid ParseUnionTest();\nvoid ValidSameNameDifferentNamespaceTest();\nvoid WarningsAsErrorsTest();\nvoid StringVectorDefaultsTest();\nvoid FieldIdentifierTest();\n\n}  // namespace tests\n}  // namespace flatbuffers\n\n#endif  // TESTS_PARSER_TEST_H\n"
  },
  {
    "path": "tests/phpTest.php",
    "content": "<?php\n// manual load for testing. please use PSR style autoloader when you use flatbuffers.\nrequire join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)), \"php\", \"Constants.php\"));\nrequire join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)), \"php\", \"ByteBuffer.php\"));\nrequire join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)), \"php\", \"FlatbufferBuilder.php\"));\nrequire join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)), \"php\", \"Table.php\"));\nrequire join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)), \"php\", \"Struct.php\"));\nforeach (glob(join(DIRECTORY_SEPARATOR, array(dirname(__FILE__), \"MyGame\", \"Example\", \"*.php\"))) as $file) {\n    require $file;\n}\n\nfunction main()\n{\n    /// Begin Test\n    $assert = new Assert();\n\n    // First, let's test reading a FlatBuffer generated by C++ code:\n    // This file was generated from monsterdata_test.json\n\n    // Now test it:\n    $data = file_get_contents('monsterdata_test.mon');\n    $bb = Google\\FlatBuffers\\ByteBuffer::wrap($data);\n    test_buffer($assert, $bb);\n\n    // Second, let's create a FlatBuffer from scratch in JavaScript, and test it also.\n    // We use an initial size of 1 to exercise the reallocation algorithm,\n    // normally a size larger than the typical FlatBuffer you generate would be\n    // better for performance.\n    $fbb = new Google\\FlatBuffers\\FlatBufferBuilder(1);\n\n    // We set up the same values as monsterdata.json:\n    $str = $fbb->createString(\"MyMonster\");\n    $name = $fbb->createString('Fred');\n    \\MyGame\\Example\\Monster::startMonster($fbb);\n    \\MyGame\\Example\\Monster::addName($fbb, $name);\n    $enemy = \\MyGame\\Example\\Monster::endMonster($fbb);\n\n    $inv = \\MyGame\\Example\\Monster::CreateInventoryVector($fbb, array(0, 1, 2, 3, 4));\n\n    $fred = $fbb->createString('Fred');\n    \\MyGame\\Example\\Monster::StartMonster($fbb);\n    \\MyGame\\Example\\Monster::AddName($fbb, $fred);\n    $mon2 = \\MyGame\\Example\\Monster::EndMonster($fbb);\n\n    \\MyGame\\Example\\Monster::StartTest4Vector($fbb, 2);\n    \\MyGame\\Example\\Test::CreateTest($fbb, 10, 20);\n    \\MyGame\\Example\\Test::CreateTest($fbb, 30, 40);\n    $test4 = $fbb->endVector();\n\n    $testArrayOfString = \\MyGame\\Example\\Monster::CreateTestarrayofstringVector($fbb, array(\n        $fbb->createString('test1'),\n        $fbb->createString('test2')\n    ));\n\n    \\MyGame\\Example\\Monster::StartMonster($fbb);\n    \\MyGame\\Example\\Monster::AddPos($fbb, \\MyGame\\Example\\Vec3::CreateVec3($fbb,\n        1.0, 2.0, 3.0, //float\n        3.0, // double\n        \\MyGame\\Example\\Color::Green,\n        5, //short\n        6));\n    \\MyGame\\Example\\Monster::AddHp($fbb, 80);\n    \\MyGame\\Example\\Monster::AddName($fbb, $str);\n    \\MyGame\\Example\\Monster::AddInventory($fbb, $inv);\n    \\MyGame\\Example\\Monster::AddTestType($fbb, \\MyGame\\Example\\Any::Monster);\n    \\MyGame\\Example\\Monster::AddTest($fbb, $mon2);\n    \\MyGame\\Example\\Monster::AddTest4($fbb, $test4);\n    \\MyGame\\Example\\Monster::AddTestarrayofstring($fbb, $testArrayOfString);\n    \\MyGame\\Example\\Monster::AddEnemy($fbb, $enemy);\n    \\MyGame\\Example\\Monster::AddTestbool($fbb, true);\n    $mon = \\MyGame\\Example\\Monster::EndMonster($fbb);\n\n    \\MyGame\\Example\\Monster::FinishMonsterBuffer($fbb, $mon);\n\n    // Test it:\n    test_buffer($assert, $fbb->dataBuffer());\n\n    testByteBuffer($assert);\n    fuzzTest1($assert);\n//    testUnicode($assert);\n\n    echo 'FlatBuffers php test: completed successfully' . PHP_EOL;\n}\n\ntry {\n    main();\n    exit(0);\n} catch(Exception $e) {\n    printf(\"Fatal error: Uncaught exception '%s' with message '%s. in %s:%d\\n\", get_class($e), $e->getMessage(), $e->getFile(), $e->getLine());\n    printf(\"Stack trace:\\n\");\n    echo $e->getTraceAsString() . PHP_EOL;\n    printf(\"  thrown in in %s:%d\\n\", $e->getFile(), $e->getLine());\n\n    die(-1);\n}\n\nfunction test_buffer(Assert $assert, Google\\FlatBuffers\\ByteBuffer $bb) {\n\n    $assert->ok(MyGame\\Example\\Monster::MonsterBufferHasIdentifier($bb));\n    $monster = \\MyGame\\Example\\Monster::GetRootAsMonster($bb);\n\n    $assert->strictEqual($monster->GetHp(), 80);\n    $assert->strictEqual($monster->GetMana(), 150); // default\n\n    $assert->strictEqual($monster->GetName(), 'MyMonster');\n\n    $pos = $monster->GetPos();\n    $assert->strictEqual($pos->GetX(), 1.0);\n    $assert->strictEqual($pos->GetY(), 2.0);\n    $assert->strictEqual($pos->GetZ(), 3.0);\n\n    $assert->Equal($pos->GetTest1(), 3.0);\n    $assert->strictEqual($pos->GetTest2(), \\MyGame\\Example\\Color::Green);\n\n    $t = $pos->GetTest3();\n    $assert->strictEqual($t->GetA(), 5);\n    $assert->strictEqual($t->GetB(), 6);\n    $assert->strictEqual($monster->GetTestType(), \\MyGame\\Example\\Any::Monster);\n\n    $monster2 = new \\MyGame\\Example\\Monster();\n    $assert->strictEqual($monster->GetTest($monster2) != null, true);\n    $assert->strictEqual($monster2->GetName(), 'Fred');\n\n    $assert->strictEqual($monster->GetInventoryLength(), 5);\n    $invsum = 0;\n    for ($i = 0; $i < $monster->GetInventoryLength(); $i++) {\n        $invsum += $monster->GetInventory($i);\n    }\n    $assert->strictEqual($invsum, 10);\n\n    $assert->strictEqual(bin2hex($monster->GetInventoryBytes()), \"0001020304\");\n\n    $test_0 = $monster->GetTest4(0);\n    $test_1 = $monster->GetTest4(1);\n    $assert->strictEqual($monster->GetTest4Length(), 2);\n    $assert->strictEqual($test_0->GetA() + $test_0->GetB() + $test_1->GetA() + $test_1->GetB(), 100);\n\n    $assert->strictEqual($monster->GetTestarrayofstringLength(), 2);\n    $assert->strictEqual($monster->GetTestarrayofstring(0), 'test1');\n    $assert->strictEqual($monster->GetTestarrayofstring(1), 'test2');\n\n    $fred = $monster->getEnemy();\n    $assert->Equal('Fred', $fred->getName());\n\n    $assert->strictEqual($monster->GetTestbool(), true);\n}\n\n//function testUnicode(Assert $assert) {\n//    // missing unicode_test.mon, implemented later\n//    $correct = file_get_contents('unicode_test.mon');\n//    $json = json_decode(file_get_contents('unicode_test.json'));\n//\n//    // Test reading\n//    $bb = flatbuffers\\ByteBuffer::Wrap($correct);\n//    $monster = \\MyGame\\Example\\Monster::GetRootAsMonster($bb);\n//    $assert->strictEqual($monster->GetName(), $json[\"name\"]);\n//\n//    //$assert->deepEqual(new Buffer(monster.name(flatbuffers.Encoding.UTF8_BYTES)), new Buffer(json.name));\n//    //assert.strictEqual(monster.testarrayoftablesLength(), json.testarrayoftables.length);\n//    foreach ($json[\"testarrayoftables\"]as $i => $table) {\n//        $value = $monster->GetTestArrayOfTables($i);\n//        $assert->strictEqual($value->GetName(), $table[\"name\"]);\n//        //assert.deepEqual(new Buffer(value.name(flatbuffers.Encoding.UTF8_BYTES)), new Buffer(table.name));\n//    }\n//    $assert->strictEqual($monster->GetTestarrayofstringLength(), $json[\"testarrayofstring\"][\"length\"]);\n//    foreach ($json[\"testarrayofstring\"] as $i => $string) {\n//        $assert->strictEqual($monster->GetTestarrayofstring($i), $string);\n//        //assert.deepEqual(new Buffer(monster.testarrayofstring(i, flatbuffers.Encoding.UTF8_BYTES)), new Buffer(string));\n//    }\n//\n//    // Test writing\n//    $fbb = new FlatBuffers\\FlatBufferBuilder(1);\n//    $name = $fbb->CreateString($json[\"name\"]);\n//    $testarrayoftablesOffsets = array_map(function($table) use($fbb) {\n//        $name = $fbb->CreateString($table[\"name\"]);\n//        \\MyGame\\Example\\Monster::StartMonster($fbb);\n//        \\MyGame\\Example\\Monster::AddName($fbb, $name);\n//        return \\MyGame\\Example\\Monster::EndMonster($fbb);\n//    }, $json[\"testarrayoftables\"]);\n//    $testarrayoftablesOffset = \\MyGame\\Example\\Monster::CreateTestarrayoftablesVector($fbb,\n//            $testarrayoftablesOffsets);\n////    $testarrayofstringOffset = \\MyGame\\Example\\Monster::CreateTestarrayofstringVector($fbb,\n////            $json[\"testarrayofstring\"].map(function(string) { return fbb.createString(string); }));\n//\n//    \\MyGame\\Example\\Monster::startMonster($fbb);\n//    \\MyGame\\Example\\Monster::addTestarrayofstring($fbb, $testarrayoftablesOffset);\n//    \\MyGame\\Example\\Monster::addTestarrayoftables($fbb, $testarrayoftablesOffset);\n//    \\MyGame\\Example\\Monster::addName($fbb, $name);\n//    \\MyGame\\Example\\Monster::finishMonsterBuffer($fbb, \\MyGame\\Example\\Monster::endMonster($fbb));\n//    //;assert.deepEqual(new Buffer(fbb.asUint8Array()), correct);\n//}\n\n// Low level stress/fuzz test: serialize/deserialize a variety of\n// different kinds of data in different combinations\nfunction fuzzTest1(Assert $assert)\n{\n\n    // Values we're testing against: chosen to ensure no bits get chopped\n    // off anywhere, and also be different from eachother.\n    $bool_val = true;\n    $char_val = -127; // 0x81\n    $uchar_val = 0xFF;\n    $short_val = -32222; // 0x8222;\n    $ushort_val = 0xFEEE;\n    $int_val = 0x7fffffff | 0;\n    // for now\n    $uint_val = 1;\n    $long_val = 2;\n    $ulong_val = 3;\n\n//    var uint_val   = 0xFDDDDDDD;\n//    var long_val   = new flatbuffers.Long(0x44444444, 0x84444444);\n//    var ulong_val  = new flatbuffers.Long(0xCCCCCCCC, 0xFCCCCCCC);\n\n    $float_val = 3.14159;\n    $double_val = 3.14159265359;\n\n    $test_values_max = 11;\n    $fields_per_object = 4;\n    // current implementation is not good at encoding.\n    $num_fuzz_objects = 1000;\n    $builder = new Google\\FlatBuffers\\FlatBufferBuilder(1);\n\n    // can't use same implementation due to PHP_INTMAX overflow issue.\n    // we use mt_rand function to reproduce fuzzy test.\n    mt_srand(48271);\n    $objects = array();\n    // Generate num_fuzz_objects random objects each consisting of\n    // fields_per_object fields, each of a random type.\n    for ($i = 0; $i < $num_fuzz_objects; $i++) {\n        $builder->startObject($fields_per_object);\n        for ($f = 0; $f < $fields_per_object; $f++) {\n            $choice = mt_rand() % $test_values_max;\n            switch ($choice) {\n                case 0:\n                    $builder->addBoolX($f, $bool_val, 0);\n                    break;\n                case 1:\n                    $builder->addByteX($f, $char_val, 0);\n                    break;\n                case 2:\n                    $builder->addSbyteX($f, $uchar_val, 0);\n                    break;\n                case 3:\n                    $builder->addShortX($f, $short_val, 0);\n                    break;\n                case 4:\n                    $builder->addUshortX($f, $ushort_val, 0);\n                    break;\n                case 5:\n                    $builder->addIntX($f, $int_val, 0);\n                    break;\n                case 6:\n                    $builder->addUintX($f, $uint_val, 0);\n                    break;\n                case 7:\n                    $builder->addLongX($f, $long_val, 0);\n                    break;\n                case 8:\n                    $builder->addUlongX($f, $ulong_val, 0);\n                    break;\n                case 9:\n                    $builder->addFloatX($f, $float_val, 0);\n                    break;\n                case 10:\n                    $builder->addDoubleX($f, $double_val, 0);\n                    break;\n            }\n        }\n        $objects[] = $builder->endObject();\n    }\n    $builder->prep(8, 0); // Align whole buffer.\n\n    mt_srand(48271); // Reset\n    $builder->finish($objects[count($objects) - 1]);\n\n    $view = Google\\FlatBuffers\\ByteBuffer::wrap($builder->sizedByteArray());\n    for ($i = 0; $i < $num_fuzz_objects; $i++) {\n        $offset = $view->capacity() - $objects[$i];\n        for ($f = 0; $f < $fields_per_object; $f++) {\n            $choice = mt_rand() % $test_values_max;\n            $vtable_offset = fieldIndexToOffset($f);\n            $vtable = $offset - $view->getInt($offset);\n            $assert->ok($vtable_offset < $view->getShort($vtable));\n            $field_offset = $offset + $view->getShort($vtable + $vtable_offset);\n            switch ($choice) {\n                case 0:\n                    $assert->strictEqual(!!$view->getBool($field_offset), $bool_val);\n                    break;\n                case 1:\n                    $assert->strictEqual($view->getSbyte($field_offset), $char_val);\n                    break;\n                case 2:\n                    $assert->strictEqual($view->getByte($field_offset), $uchar_val);\n                    break;\n                case 3:\n                    $assert->strictEqual($view->getShort($field_offset), $short_val);\n                    break;\n                case 4:\n                    $assert->strictEqual($view->getUShort($field_offset), $ushort_val);\n                    break;\n                case 5:\n                    $assert->strictEqual($view->getInt($field_offset), $int_val);\n                    break;\n                case 6:\n                    $assert->strictEqual($view->getUint($field_offset), $uint_val);\n                    break;\n                case 7:\n                    if (PHP_INT_SIZE <= 4) break;\n                    $assert->strictEqual($view->getLong($field_offset), $long_val);\n                    break;\n                case 8:\n                    if (PHP_INT_SIZE <= 4) break;\n                    $assert->strictEqual($view->getUlong($field_offset), $ulong_val);\n                    break;\n                case 9:\n                    $assert->strictEqual(floor($view->getFloat($field_offset)), floor($float_val));\n                    break;\n                case 10:\n                    $assert->strictEqual($view->getDouble($field_offset), $double_val);\n                    break;\n            }\n        }\n    }\n}\n\nfunction fieldIndexToOffset($field_id) {\n    // Should correspond to what EndTable() below builds up.\n    $fixed_fields = 2;  // Vtable size and Object Size.\n    return ($field_id + $fixed_fields) * 2;\n}\n\nfunction testByteBuffer(Assert $assert) {\n\n    //Test: ByteBuffer_Length_MatchesBufferLength\n    $buffer = str_repeat(\"\\0\", 100);\n    $uut  = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n    $assert->Equal($uut->capacity(), strlen($buffer));\n\n    //Test: ByteBuffer_PutBytePopulatesBufferAtZeroOffset\n    $buffer = \"\\0\";\n    $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n    $uut->putByte(0, \"\\x63\"); // 99\n    $assert->Equal(\"\\x63\", $uut->_buffer[0]); // don't share buffer as php user might confuse reference.\n\n    //Test: ByteBuffer_PutByteCannotPutAtOffsetPastLength\n    $buffer = \"\\0\";\n    $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n    $assert->Throws(new OutOfRangeException(), function()  use ($uut) {\n        $uut->putByte(1, \"\\x63\"); // 99\n    });\n\n    //Test: ByteBuffer_PutShortPopulatesBufferCorrectly\n    $buffer = str_repeat(\"\\0\", 2);\n    $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n    $uut->putShort(0, 1);\n\n    // Ensure Endiannes was written correctly\n    $assert->Equal(chr(0x01), $uut->_buffer[0]);\n    $assert->Equal(chr(0x00), $uut->_buffer[1]);\n\n    $buffer = str_repeat(\"\\0\", 2);\n    $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n    $uut->putShort(0, -32768);\n\n    // Ensure Endiannes was written correctly\n    $assert->Equal(chr(0x00), $uut->_buffer[0]);\n    $assert->Equal(chr(0x80), $uut->_buffer[1]);\n\n    //Test: ByteBuffer_PutShortCannotPutAtOffsetPastLength\n    $buffer = \"\\0\";\n    $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n    $assert->Throws(new OutOfRangeException(), function()  use ($uut) {\n        $uut->putShort(2, 2); // 99\n    });\n\n    //Test: ByteBuffer_PutShortChecksLength\n    $buffer = \"\\0\";\n    $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n    $assert->Throws(new OutOfRangeException(), function()  use ($uut) {\n        $uut->putShort(0, 2); // 99\n    });\n\n    //Test: ByteBuffer_PutShortChecksLengthAndOffset\n    $buffer = str_repeat(\"\\0\", 2);\n    $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n    $assert->Throws(new OutOfRangeException(), function()  use ($uut) {\n        $uut->putShort(1, 2); // 99\n    });\n\n    //Test: ByteBuffer_PutIntPopulatesBufferCorrectly\n    $buffer = str_repeat(\"\\0\", 4);\n    $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n    $uut->putInt(0, 0x0A0B0C0D);\n    $assert->Equal(chr(0x0D), $uut->_buffer[0]);\n    $assert->Equal(chr(0x0C), $uut->_buffer[1]);\n    $assert->Equal(chr(0x0B), $uut->_buffer[2]);\n    $assert->Equal(chr(0x0A), $uut->_buffer[3]);\n\n    $buffer = str_repeat(\"\\0\", 4);\n    $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n    $uut->putInt(0, -2147483648);\n    $assert->Equal(chr(0x00), $uut->_buffer[0]);\n    $assert->Equal(chr(0x00), $uut->_buffer[1]);\n    $assert->Equal(chr(0x00), $uut->_buffer[2]);\n    $assert->Equal(chr(0x80), $uut->_buffer[3]);\n\n    //Test: ByteBuffer_PutIntCannotPutAtOffsetPastLength\n    $buffer = str_repeat(\"\\0\", 4);\n    $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n    $assert->Throws(new OutOfRangeException(), function()  use ($uut) {\n        $uut->putInt(2, 0x0A0B0C0D);\n    });\n\n    //Test: ByteBuffer_PutIntChecksLength\n    $buffer = str_repeat(\"\\0\", 1);\n    $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n    $assert->Throws(new OutOfRangeException(), function()  use ($uut) {\n        $uut->putInt(0, 0x0A0B0C0D);\n    });\n\n    //Test: ByteBuffer_PutIntChecksLengthAndOffset\n    $buffer = str_repeat(\"\\0\", 4);\n    $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n    $assert->Throws(new OutOfRangeException(), function()  use ($uut) {\n        $uut->putInt(2, 0x0A0B0C0D);\n    });\n\n    if (PHP_INT_SIZE > 4) {\n        //Test: ByteBuffer_PutLongPopulatesBufferCorrectly\n        $buffer = str_repeat(\"\\0\", 8);\n        $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n        $uut->putLong(0, 0x010203040A0B0C0D);\n        $assert->Equal(chr(0x0D), $uut->_buffer[0]);\n        $assert->Equal(chr(0x0C), $uut->_buffer[1]);\n        $assert->Equal(chr(0x0B), $uut->_buffer[2]);\n        $assert->Equal(chr(0x0A), $uut->_buffer[3]);\n        $assert->Equal(chr(0x04), $uut->_buffer[4]);\n        $assert->Equal(chr(0x03), $uut->_buffer[5]);\n        $assert->Equal(chr(0x02), $uut->_buffer[6]);\n        $assert->Equal(chr(0x01), $uut->_buffer[7]);\n\n        //Test: ByteBuffer_PutLongCannotPutAtOffsetPastLength\n        $buffer = str_repeat(\"\\0\", 8);\n        $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n        $assert->Throws(new OutOfRangeException(), function()  use ($uut) {\n            $uut->putLong(2, 0x010203040A0B0C0D);\n        });\n\n        //Test: ByteBuffer_PutLongCannotPutAtOffsetPastLength\n        $buffer = str_repeat(\"\\0\", 1);\n        $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n        $assert->Throws(new OutOfRangeException(), function()  use ($uut) {\n            $uut->putLong(0, 0x010203040A0B0C0D);\n        });\n\n\n        //Test: ByteBuffer_PutLongChecksLengthAndOffset\n        $buffer = str_repeat(\"\\0\", 8);\n        $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n        $assert->Throws(new OutOfRangeException(), function()  use ($uut) {\n            $uut->putLong(2, 0x010203040A0B0C0D);\n        });\n    }\n\n    //Test: ByteBuffer_GetByteReturnsCorrectData\n    $buffer = str_repeat(\"\\0\", 1);\n    $buffer[0] = \"\\x63\";\n    $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n    $assert->Equal(\"\\x63\", $uut->get(0));\n\n    //Test: ByteBuffer_GetByteChecksOffset\n    $buffer = str_repeat(\"\\0\", 1);\n    $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n    $assert->Throws(new OutOfRangeException(), function()  use ($uut) {\n        $uut->get(1);\n    });\n\n    //Test: ByteBuffer_GetShortReturnsCorrectData\n    $buffer = str_repeat(\"\\0\", 2);\n    $buffer[0] = chr(0x01);\n    $buffer[1] = chr(0x00);\n    $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n    $assert->Equal(1, $uut->getShort(0));\n\n    //Test: ByteBuffer_GetShortReturnsCorrectData (signed value)\n    $buffer = str_repeat(\"\\0\", 2);\n    $buffer[0] = chr(0x00);\n    $buffer[1] = chr(0x80);\n    $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n    $assert->Equal(-32768, $uut->getShort(0));\n\n    //Test: ByteBuffer_GetShortChecksOffset\n    $buffer = str_repeat(\"\\0\", 2);\n    $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n    $assert->Throws(new OutOfRangeException(), function()  use ($uut) {\n        $uut->getShort(2);\n    });\n\n    //Test: ByteBuffer_GetShortChecksLength\n    $buffer = str_repeat(\"\\0\", 2);\n    $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n    $assert->Throws(new OutOfRangeException(), function()  use ($uut) {\n        $uut->getShort(1);\n    });\n\n    //Test: ByteBuffer_GetIntReturnsCorrectData\n    $buffer = str_repeat(\"\\0\", 4);\n    $buffer[0] = chr(0x0D);\n    $buffer[1] = chr(0x0C);\n    $buffer[2] = chr(0x0B);\n    $buffer[3] = chr(0x0A);\n    $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n    $assert->Equal(0x0A0B0C0D, $uut->getInt(0));\n\n    $buffer = str_repeat(\"\\0\", 4);\n    $buffer[0] = chr(0x00);\n    $buffer[1] = chr(0x00);\n    $buffer[2] = chr(0x00);\n    $buffer[3] = chr(0x80);\n    $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n    $assert->Equal(-2147483648, $uut->getInt(0));\n\n    //Test: ByteBuffer_GetIntChecksOffset\n    $buffer = str_repeat(\"\\0\", 4);\n\n    $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n    $assert->Throws(new OutOfRangeException(), function()  use ($uut) {\n        $uut->getInt(4);\n    });\n\n    //Test: ByteBuffer_GetIntChecksLength\n    $buffer = str_repeat(\"\\0\", 2);\n    $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n    $assert->Throws(new OutOfRangeException(), function()  use ($uut) {\n        $uut->getInt(0);\n    });\n\n    if (PHP_INT_SIZE > 4) {\n        //Test: ByteBuffer_GetLongReturnsCorrectData\n        $buffer = str_repeat(\"\\0\", 8);\n        $buffer[0] = chr(0x0D);\n        $buffer[1] = chr(0x0C);\n        $buffer[2] = chr(0x0B);\n        $buffer[3] = chr(0x0A);\n        $buffer[4] = chr(0x04);\n        $buffer[5] = chr(0x03);\n        $buffer[6] = chr(0x02);\n        $buffer[7] = chr(0x01);\n        $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n        $assert->Equal(0x010203040A0B0C0D, $uut->getLong(0));\n\n        //Test: Signed Long\n        $buffer = str_repeat(\"\\0\", 8);\n        $buffer[0] = chr(0x00);\n        $buffer[1] = chr(0x00);\n        $buffer[2] = chr(0x00);\n        $buffer[3] = chr(0x00);\n        $buffer[4] = chr(0x00);\n        $buffer[5] = chr(0x00);\n        $buffer[6] = chr(0x00);\n        $buffer[7] = chr(0x80);\n        $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n        $assert->Equal(-1 << 63, $uut->getLong(0));\n    }\n\n    //Test: ByteBuffer_GetLongChecksOffset\n    $buffer = str_repeat(\"\\0\", 8);\n    $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n    $assert->Throws(new OutOfRangeException(), function()  use ($uut) {\n        $uut->getLong(8);\n    });\n\n    //Test: ByteBuffer_GetLongChecksLength\n    $buffer = str_repeat(\"\\0\", 7);\n    $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n    $assert->Throws(new OutOfRangeException(), function()  use ($uut) {\n        $uut->getLong(0);\n    });\n\n    //Test: big endian\n    $buffer = str_repeat(\"\\0\", 2);\n    // 0xFF 0x00\n    // Little Endian: 255\n    // Big Endian: 65280\n    $buffer[0] = chr(0xff);\n    $buffer[1] = chr(0x00);\n    $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n    $assert->Equal(65280, $uut->readLittleEndian(0, 2, true));\n\n    $buffer = str_repeat(\"\\0\", 4);\n    $buffer[0] = chr(0x0D);\n    $buffer[1] = chr(0x0C);\n    $buffer[2] = chr(0x0B);\n    $buffer[3] = chr(0x0A);\n    $uut = Google\\FlatBuffers\\ByteBuffer::wrap($buffer);\n    $assert->Equal(0x0D0C0B0A, $uut->readLittleEndian(0, 4, true));\n\n}\n\nclass Assert {\n    public function ok($result, $message = \"\") {\n        if (!$result){\n            throw new Exception(!empty($message) ? $message : \"{$result} is not true.\");\n        }\n    }\n\n    public function Equal($result, $expected, $message = \"\") {\n        if ($result != $expected) {\n            throw new Exception(!empty($message) ? $message : \"given the result {$result} is not equals as {$expected}\");\n        }\n    }\n\n\n    public function strictEqual($result, $expected, $message = \"\") {\n        if ($result !== $expected) {\n            throw new Exception(!empty($message) ? $message : \"given the result {$result} is not strict equals as {$expected}\");\n        }\n    }\n\n    public function Throws($class, Callable $callback) {\n        try {\n            $callback();\n\n            throw new \\Exception(\"passed statement don't throw an exception.\");\n        } catch (\\Exception $e) {\n            if (get_class($e) != get_class($class)) {\n                throw new Exception(\"passed statement doesn't throw \" . get_class($class) . \". throws \" . get_class($e) . \": {$e->getMessage()}\");\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/phpUnionVectorTest.php",
    "content": "<?php\n\nrequire join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)), \"php\", \"Constants.php\"));\nrequire join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)), \"php\", \"ByteBuffer.php\"));\nrequire join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)), \"php\", \"FlatbufferBuilder.php\"));\nrequire join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)), \"php\", \"Table.php\"));\nrequire join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)), \"php\", \"Struct.php\"));\n\nrequire join(DIRECTORY_SEPARATOR, array(dirname(__FILE__), \"php\", 'Attacker.php'));\nrequire join(DIRECTORY_SEPARATOR, array(dirname(__FILE__), \"php\", 'BookReader.php'));\nrequire join(DIRECTORY_SEPARATOR, array(dirname(__FILE__), \"php\", 'Character.php'));\nrequire join(DIRECTORY_SEPARATOR, array(dirname(__FILE__), \"php\", 'Movie.php'));\n\nclass Assert {\n    public function ok($result, $message = \"\") {\n        if (!$result){\n            throw new Exception(!empty($message) ? $message : \"{$result} is not true.\");\n        }\n    }\n\n    public function Equal($result, $expected, $message = \"\") {\n        if ($result != $expected) {\n            throw new Exception(!empty($message) ? $message : \"given the result {$result} is not equals as {$expected}\");\n        }\n    }\n\n\n    public function strictEqual($result, $expected, $message = \"\") {\n        if ($result !== $expected) {\n            throw new Exception(!empty($message) ? $message : \"given the result {$result} is not strict equals as {$expected}\");\n        }\n    }\n\n    public function Throws($class, Callable $callback) {\n        try {\n            $callback();\n\n            throw new \\Exception(\"passed statement don't throw an exception.\");\n        } catch (\\Exception $e) {\n            if (get_class($e) != get_class($class)) {\n                throw new Exception(\"passed statement doesn't throw \" . get_class($class) . \". throwws \" . get_class($e));\n            }\n        }\n    }\n}\n\nfunction main()\n{\n    $assert = new Assert();\n\n    $fbb = new Google\\FlatBuffers\\FlatBufferBuilder(1);\n\n    $charTypes = [\n        Character::Belle,\n        Character::MuLan,\n        Character::BookFan,\n    ];\n\n    Attacker::startAttacker($fbb);\n    Attacker::addSwordAttackDamage($fbb, 5);\n    $attackerOffset = Attacker::endAttacker($fbb);\n\n    $charTypesOffset = Movie::createCharactersTypeVector($fbb, $charTypes);\n    $charsOffset = Movie::createCharactersVector(\n        $fbb,\n        [\n            BookReader::createBookReader($fbb, 7),\n            $attackerOffset,\n            BookReader::createBookReader($fbb, 2),\n        ]\n    );\n\n    Movie::startMovie($fbb);\n    Movie::addCharactersType($fbb, $charTypesOffset);\n    Movie::addCharacters($fbb, $charsOffset);\n    Movie::finishMovieBuffer($fbb, Movie::endMovie($fbb));\n\n    $buf = Google\\FlatBuffers\\ByteBuffer::wrap($fbb->dataBuffer()->data());\n\n    $movie = Movie::getRootAsMovie($buf);\n\n    $assert->strictEqual($movie->getCharactersTypeLength(), count($charTypes));\n    $assert->strictEqual($movie->getCharactersLength(), $movie->getCharactersTypeLength());\n\n    for ($i = 0; $i < count($charTypes); ++$i) {\n        $assert->strictEqual($movie->getCharactersType($i), $charTypes[$i]);\n    }\n\n    $bookReader7 = $movie->getCharacters(0, new BookReader());\n    $assert->strictEqual($bookReader7->getBooksRead(), 7);\n\n    $attacker = $movie->getCharacters(1, new Attacker());\n    $assert->strictEqual($attacker->getSwordAttackDamage(), 5);\n\n    $bookReader2 = $movie->getCharacters(2, new BookReader());\n    $assert->strictEqual($bookReader2->getBooksRead(), 2);\n}\n\ntry {\n    main();\n    exit(0);\n} catch(Exception $e) {\n    printf(\"Fatal error: Uncaught exception '%s' with message '%s. in %s:%d\\n\", get_class($e), $e->getMessage(), $e->getFile(), $e->getLine());\n    printf(\"Stack trace:\\n\");\n    echo $e->getTraceAsString() . PHP_EOL;\n    printf(\"  thrown in in %s:%d\\n\", $e->getFile(), $e->getLine());\n\n    die(-1);\n}\n"
  },
  {
    "path": "tests/phpUnionVectorTest.sh",
    "content": "#!/bin/bash\n\nset -e\n\n../flatc --php -o php union_vector/union_vector.fbs\nphp phpUnionVectorTest.php\n\necho 'PHP union vector test passed'\n"
  },
  {
    "path": "tests/private_annotation_test/ab_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MIN_AB: i8 = 0;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MAX_AB: i8 = 1;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n#[allow(non_camel_case_types)]\npub const ENUM_VALUES_AB: [AB; 2] = [\n    AB::A,\n    AB::B,\n];\n\n#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n#[repr(transparent)]\npub(crate) struct AB(pub i8);\n\n#[allow(non_upper_case_globals)]\nimpl AB {\n    pub const A: Self = Self(0);\n    pub const B: Self = Self(1);\n\n    pub const ENUM_MIN: i8 = 0;\n    pub const ENUM_MAX: i8 = 1;\n    pub const ENUM_VALUES: &'static [Self] = &[\n        Self::A,\n        Self::B,\n    ];\n\n    /// Returns the variant's name or \"\" if unknown.\n    pub fn variant_name(self) -> Option<&'static str> {\n        match self {\n            Self::A => Some(\"A\"),\n            Self::B => Some(\"B\"),\n            _ => None,\n        }\n    }\n}\n\nimpl ::core::fmt::Debug for AB {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        if let Some(name) = self.variant_name() {\n            f.write_str(name)\n        } else {\n            f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n        }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for AB {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<i8>(buf, loc) };\n        Self(b)\n    }\n}\n\nimpl ::flatbuffers::Push for AB {\n    type Output = AB;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<i8>(dst, self.0) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for AB {\n    type Scalar = i8;\n\n    #[inline]\n    fn to_little_endian(self) -> i8 {\n        self.0.to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: i8) -> Self {\n        let b = i8::from_le(v);\n        Self(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for AB {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        i8::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for AB {}\n"
  },
  {
    "path": "tests/private_annotation_test/annotations_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub(crate) enum AnnotationsOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub(crate) struct Annotations<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Annotations<'a> {\n    type Inner = Annotations<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> Annotations<'a> {\n    pub const VT_VALUE: ::flatbuffers::VOffsetT = 4;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"Annotations\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        Annotations { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args AnnotationsArgs\n    ) -> ::flatbuffers::WIPOffset<Annotations<'bldr>> {\n        let mut builder = AnnotationsBuilder::new(_fbb);\n        builder.add_value(args.value);\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> AnnotationsT {\n        let value = self.value();\n        AnnotationsT {\n            value,\n        }\n    }\n\n    #[inline]\n    pub fn value(&self) -> i32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i32>(Annotations::VT_VALUE, Some(0)).unwrap()}\n    }\n}\n\nimpl ::flatbuffers::Verifiable for Annotations<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<i32>(\"value\", Self::VT_VALUE, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub(crate) struct AnnotationsArgs {\n    pub value: i32,\n}\n\nimpl<'a> Default for AnnotationsArgs {\n    #[inline]\n    fn default() -> Self {\n        AnnotationsArgs {\n            value: 0,\n        }\n    }\n}\n\npub(crate) struct AnnotationsBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> AnnotationsBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_value(&mut self, value: i32) {\n        self.fbb_.push_slot::<i32>(Annotations::VT_VALUE, value, 0);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> AnnotationsBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        AnnotationsBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<Annotations<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for Annotations<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"Annotations\");\n        ds.field(\"value\", &self.value());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub(crate) struct AnnotationsT {\n    pub value: i32,\n}\n\nimpl Default for AnnotationsT {\n    fn default() -> Self {\n        Self {\n            value: 0,\n        }\n    }\n}\n\nimpl AnnotationsT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<Annotations<'b>> {\n        let value = self.value;\n        Annotations::create(_fbb, &AnnotationsArgs{\n            value,\n        })\n    }\n}\n"
  },
  {
    "path": "tests/private_annotation_test/any_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MIN_ANY: u8 = 0;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MAX_ANY: u8 = 2;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n#[allow(non_camel_case_types)]\npub const ENUM_VALUES_ANY: [Any; 3] = [\n    Any::NONE,\n    Any::Game,\n    Any::Annotations,\n];\n\n#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n#[repr(transparent)]\npub(crate) struct Any(pub u8);\n\n#[allow(non_upper_case_globals)]\nimpl Any {\n    pub const NONE: Self = Self(0);\n    pub const Game: Self = Self(1);\n    pub const Annotations: Self = Self(2);\n\n    pub const ENUM_MIN: u8 = 0;\n    pub const ENUM_MAX: u8 = 2;\n    pub const ENUM_VALUES: &'static [Self] = &[\n        Self::NONE,\n        Self::Game,\n        Self::Annotations,\n    ];\n\n    /// Returns the variant's name or \"\" if unknown.\n    pub fn variant_name(self) -> Option<&'static str> {\n        match self {\n            Self::NONE => Some(\"NONE\"),\n            Self::Game => Some(\"Game\"),\n            Self::Annotations => Some(\"Annotations\"),\n            _ => None,\n        }\n    }\n}\n\nimpl ::core::fmt::Debug for Any {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        if let Some(name) = self.variant_name() {\n            f.write_str(name)\n        } else {\n            f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n        }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Any {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<u8>(buf, loc) };\n        Self(b)\n    }\n}\n\nimpl ::flatbuffers::Push for Any {\n    type Output = Any;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<u8>(dst, self.0) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for Any {\n    type Scalar = u8;\n\n    #[inline]\n    fn to_little_endian(self) -> u8 {\n        self.0.to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: u8) -> Self {\n        let b = u8::from_le(v);\n        Self(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for Any {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        u8::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for Any {}\n\npub(crate) struct AnyUnionTableOffset {}\n\n#[allow(clippy::upper_case_acronyms)]\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub(crate) enum AnyT {\n    NONE,\n    Game(alloc::boxed::Box<GameT>),\n    Annotations(alloc::boxed::Box<AnnotationsT>),\n}\n\nimpl Default for AnyT {\n    fn default() -> Self {\n        Self::NONE\n    }\n}\n\nimpl AnyT {\n    pub fn any_type(&self) -> Any {\n        match self {\n            Self::NONE => Any::NONE,\n            Self::Game(_) => Any::Game,\n            Self::Annotations(_) => Any::Annotations,\n        }\n    }\n\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(&self, fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>) -> Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>> {\n        match self {\n            Self::NONE => None,\n            Self::Game(v) => Some(v.pack(fbb).as_union_value()),\n            Self::Annotations(v) => Some(v.pack(fbb).as_union_value()),\n        }\n    }\n\n    /// If the union variant matches, return the owned GameT, setting the union to NONE.\n    pub fn take_game(&mut self) -> Option<alloc::boxed::Box<GameT>> {\n        if let Self::Game(_) = self {\n            let v = ::core::mem::replace(self, Self::NONE);\n            if let Self::Game(w) = v {\n                Some(w)\n            } else {\n                unreachable!()\n            }\n        } else {\n            None\n        }\n    }\n\n    /// If the union variant matches, return a reference to the GameT.\n    pub fn as_game(&self) -> Option<&GameT> {\n        if let Self::Game(v) = self { Some(v.as_ref()) } else { None }\n    }\n\n    /// If the union variant matches, return a mutable reference to the GameT.\n    pub fn as_game_mut(&mut self) -> Option<&mut GameT> {\n        if let Self::Game(v) = self { Some(v.as_mut()) } else { None }\n    }\n\n    /// If the union variant matches, return the owned AnnotationsT, setting the union to NONE.\n    pub fn take_annotations(&mut self) -> Option<alloc::boxed::Box<AnnotationsT>> {\n        if let Self::Annotations(_) = self {\n            let v = ::core::mem::replace(self, Self::NONE);\n            if let Self::Annotations(w) = v {\n                Some(w)\n            } else {\n                unreachable!()\n            }\n        } else {\n            None\n        }\n    }\n\n    /// If the union variant matches, return a reference to the AnnotationsT.\n    pub fn as_annotations(&self) -> Option<&AnnotationsT> {\n        if let Self::Annotations(v) = self { Some(v.as_ref()) } else { None }\n    }\n\n    /// If the union variant matches, return a mutable reference to the AnnotationsT.\n    pub fn as_annotations_mut(&mut self) -> Option<&mut AnnotationsT> {\n        if let Self::Annotations(v) = self { Some(v.as_mut()) } else { None }\n    }\n}\n\n"
  },
  {
    "path": "tests/private_annotation_test/game_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub(crate) enum GameOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub(crate) struct Game<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Game<'a> {\n    type Inner = Game<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> Game<'a> {\n    pub const VT_VALUE: ::flatbuffers::VOffsetT = 4;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"Game\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        Game { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args GameArgs\n    ) -> ::flatbuffers::WIPOffset<Game<'bldr>> {\n        let mut builder = GameBuilder::new(_fbb);\n        builder.add_value(args.value);\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> GameT {\n        let value = self.value();\n        GameT {\n            value,\n        }\n    }\n\n    #[inline]\n    pub fn value(&self) -> i32 {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<i32>(Game::VT_VALUE, Some(0)).unwrap()}\n    }\n}\n\nimpl ::flatbuffers::Verifiable for Game<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_field::<i32>(\"value\", Self::VT_VALUE, false)?\n            .finish();\n        Ok(())\n    }\n}\n\npub(crate) struct GameArgs {\n    pub value: i32,\n}\n\nimpl<'a> Default for GameArgs {\n    #[inline]\n    fn default() -> Self {\n        GameArgs {\n            value: 0,\n        }\n    }\n}\n\npub(crate) struct GameBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> GameBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_value(&mut self, value: i32) {\n        self.fbb_.push_slot::<i32>(Game::VT_VALUE, value, 0);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> GameBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        GameBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<Game<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for Game<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"Game\");\n        ds.field(\"value\", &self.value());\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub(crate) struct GameT {\n    pub value: i32,\n}\n\nimpl Default for GameT {\n    fn default() -> Self {\n        Self {\n            value: 0,\n        }\n    }\n}\n\nimpl GameT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<Game<'b>> {\n        let value = self.value;\n        Game::create(_fbb, &GameArgs{\n            value,\n        })\n    }\n}\n"
  },
  {
    "path": "tests/private_annotation_test/mod.rs",
    "content": "// Automatically generated by the Flatbuffers compiler. Do not modify.\n// @generated\nmod ab_generated;\npub use self::ab_generated::*;\nmod any_generated;\npub use self::any_generated::*;\nmod object_generated;\npub use self::object_generated::*;\nmod game_generated;\npub use self::game_generated::*;\nmod annotations_generated;\npub use self::annotations_generated::*;\n"
  },
  {
    "path": "tests/private_annotation_test/object_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n// struct Object, aligned to 4\n#[repr(transparent)]\n#[derive(Clone, Copy, PartialEq)]\npub(crate) struct Object(pub [u8; 4]);\n\nimpl Default for Object {\n    fn default() -> Self {\n        Self([0; 4])\n    }\n}\n\nimpl ::core::fmt::Debug for Object {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        f.debug_struct(\"Object\")\n            .field(\"value\", &self.value())\n            .finish()\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for Object {}\n\nimpl<'a> ::flatbuffers::Follow<'a> for Object {\n    type Inner = &'a Object;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { <&'a Object>::follow(buf, loc) }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for &'a Object {\n    type Inner = &'a Object;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { ::flatbuffers::follow_cast_ref::<Object>(buf, loc) }\n    }\n}\n\nimpl<'b> ::flatbuffers::Push for Object {\n    type Output = Object;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        let src = unsafe { ::core::slice::from_raw_parts(self as *const Object as *const u8, <Self as ::flatbuffers::Push>::size()) };\n        dst.copy_from_slice(src);\n    }\n\n    #[inline]\n    fn alignment() -> ::flatbuffers::PushAlignment {\n        ::flatbuffers::PushAlignment::new(4)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for Object {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.in_buffer::<Self>(pos)\n    }\n}\n\nimpl<'a> Object {\n    #[allow(clippy::too_many_arguments)]\n    pub fn new(\n        value: i32,\n    ) -> Self {\n        let mut s = Self([0; 4]);\n        s.set_value(value);\n        s\n    }\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"Object\"\n    }\n\n    pub fn value(&self) -> i32 {\n        let mut mem = ::core::mem::MaybeUninit::<<i32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[0..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<i32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_value(&mut self, x: i32) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[0..].as_mut_ptr(),\n                ::core::mem::size_of::<<i32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn unpack(&self) -> ObjectT {\n        ObjectT {\n            value: self.value(),\n        }\n    }\n}\n\n#[derive(Debug, Clone, PartialEq)]\npub(crate) struct ObjectT {\n    pub value: i32,\n}\nimpl Default for ObjectT {\n    fn default() -> Self {\n        Self {\n            value: 0,\n        }\n    }\n}\n\nimpl ObjectT {\n    pub fn pack(&self) -> Object {\n        Object::new(\n            self.value,\n        )\n    }\n}\n"
  },
  {
    "path": "tests/private_annotation_test.fbs",
    "content": "enum AB:byte (private) {\n  A,\n  B,\n}\n\nstruct Object (private) {\n    value: int;\n}\n\nunion Any (private) { Game, Annotations }\n\ntable Game (private) {\n    value: int;\n}\n\ntable Annotations (private) {\n    value: int;\n}"
  },
  {
    "path": "tests/proto_test.cpp",
    "content": "#include \"proto_test.h\"\n\n#include \"flatbuffers/code_generator.h\"\n#include \"idl_gen_fbs.h\"\n#include \"test_assert.h\"\n\nnamespace flatbuffers {\nnamespace tests {\n\nvoid RunTest(const flatbuffers::IDLOptions& opts, const std::string& proto_path,\n             const std::string& proto_file, const std::string& golden_file,\n             const std::string import_proto_file) {\n  const char* include_directories[] = {proto_path.c_str(), nullptr};\n\n  // Parse proto.\n  flatbuffers::Parser parser(opts);\n  TEST_EQ(parser.Parse(proto_file.c_str(), include_directories), true);\n\n  // Generate fbs.\n  std::unique_ptr<CodeGenerator> fbs_generator = NewFBSCodeGenerator(true);\n  std::string fbs;\n  TEST_EQ(fbs_generator->GenerateCodeString(parser, \"test\", fbs),\n          CodeGenerator::Status::OK);\n\n  // Ensure generated file is parsable.\n  flatbuffers::Parser parser2;\n\n  if (!import_proto_file.empty()) {\n    // Generate fbs from import.proto\n    flatbuffers::Parser import_parser(opts);\n    TEST_EQ(import_parser.Parse(import_proto_file.c_str(), include_directories),\n            true);\n    std::string import_fbs;\n    TEST_EQ(\n        fbs_generator->GenerateCodeString(import_parser, \"test\", import_fbs),\n        CodeGenerator::Status::OK);\n    // auto import_fbs = flatbuffers::GenerateFBS(import_parser, \"test\", true);\n    // Since `imported.fbs` isn't in the filesystem AbsolutePath can't figure it\n    // out by itself. We manually construct it so Parser works.\n    std::string imported_fbs = flatbuffers::PosixPath(\n        flatbuffers::AbsolutePath(proto_path) + \"/imported.fbs\");\n    TEST_EQ(parser2.Parse(import_fbs.c_str(), include_directories,\n                          imported_fbs.c_str()),\n            true);\n  }\n\n  TEST_EQ(parser2.Parse(fbs.c_str(), nullptr), true);\n  TEST_EQ_STR(fbs.c_str(), golden_file.c_str());\n}\n\nvoid proto_test(const std::string& proto_path, const std::string& proto_file) {\n  flatbuffers::IDLOptions opts;\n  opts.include_dependence_headers = false;\n  opts.proto_mode = true;\n  opts.proto_id_gap_action = IDLOptions::ProtoIdGapAction::NO_OP;\n\n  // load the .proto and the golden file from disk\n  std::string golden_file;\n  TEST_EQ(flatbuffers::LoadFile((proto_path + \"test.golden.fbs\").c_str(), false,\n                                &golden_file),\n          true);\n\n  RunTest(opts, proto_path, proto_file, golden_file);\n}\n\nvoid proto_test_id(const std::string& proto_path,\n                   const std::string& proto_file) {\n  flatbuffers::IDLOptions opts;\n  opts.include_dependence_headers = false;\n  opts.proto_mode = true;\n  opts.keep_proto_id = true;\n  opts.proto_id_gap_action = IDLOptions::ProtoIdGapAction::NO_OP;\n\n  // load the .proto and the golden file from disk\n  std::string golden_file;\n  TEST_EQ(flatbuffers::LoadFile((proto_path + \"test_id.golden.fbs\").c_str(),\n                                false, &golden_file),\n          true);\n\n  RunTest(opts, proto_path, proto_file, golden_file);\n}\n\nvoid proto_test_union(const std::string& proto_path,\n                      const std::string& proto_file) {\n  // Parse proto with --oneof-union option.\n  flatbuffers::IDLOptions opts;\n  opts.include_dependence_headers = false;\n  opts.proto_mode = true;\n  opts.proto_oneof_union = true;\n  opts.proto_id_gap_action = IDLOptions::ProtoIdGapAction::NO_OP;\n\n  std::string golden_file;\n  TEST_EQ(flatbuffers::LoadFile((proto_path + \"test_union.golden.fbs\").c_str(),\n                                false, &golden_file),\n          true);\n  RunTest(opts, proto_path, proto_file, golden_file);\n}\n\nvoid proto_test_union_id(const std::string& proto_path,\n                         const std::string& proto_file) {\n  // Parse proto with --oneof-union option.\n  flatbuffers::IDLOptions opts;\n  opts.include_dependence_headers = false;\n  opts.proto_mode = true;\n  opts.proto_oneof_union = true;\n  opts.keep_proto_id = true;\n  opts.proto_id_gap_action = IDLOptions::ProtoIdGapAction::NO_OP;\n\n  std::string golden_file;\n  TEST_EQ(\n      flatbuffers::LoadFile((proto_path + \"test_union_id.golden.fbs\").c_str(),\n                            false, &golden_file),\n      true);\n  RunTest(opts, proto_path, proto_file, golden_file);\n}\n\nvoid proto_test_union_suffix(const std::string& proto_path,\n                             const std::string& proto_file) {\n  flatbuffers::IDLOptions opts;\n  opts.include_dependence_headers = false;\n  opts.proto_mode = true;\n  opts.proto_namespace_suffix = \"test_namespace_suffix\";\n  opts.proto_oneof_union = true;\n  opts.proto_id_gap_action = IDLOptions::ProtoIdGapAction::NO_OP;\n\n  std::string golden_file;\n  TEST_EQ(flatbuffers::LoadFile(\n              (proto_path + \"test_union_suffix.golden.fbs\").c_str(), false,\n              &golden_file),\n          true);\n  RunTest(opts, proto_path, proto_file, golden_file);\n}\n\nvoid proto_test_union_suffix_id(const std::string& proto_path,\n                                const std::string& proto_file) {\n  flatbuffers::IDLOptions opts;\n  opts.include_dependence_headers = false;\n  opts.proto_mode = true;\n  opts.proto_namespace_suffix = \"test_namespace_suffix\";\n  opts.proto_oneof_union = true;\n  opts.keep_proto_id = true;\n  opts.proto_id_gap_action = IDLOptions::ProtoIdGapAction::NO_OP;\n\n  std::string golden_file;\n  TEST_EQ(flatbuffers::LoadFile(\n              (proto_path + \"test_union_suffix_id.golden.fbs\").c_str(), false,\n              &golden_file),\n          true);\n  RunTest(opts, proto_path, proto_file, golden_file);\n}\n\nvoid proto_test_include(const std::string& proto_path,\n                        const std::string& proto_file,\n                        const std::string& import_proto_file) {\n  flatbuffers::IDLOptions opts;\n  opts.include_dependence_headers = true;\n  opts.proto_mode = true;\n  opts.proto_id_gap_action = IDLOptions::ProtoIdGapAction::NO_OP;\n\n  std::string golden_file;\n  TEST_EQ(\n      flatbuffers::LoadFile((proto_path + \"test_include.golden.fbs\").c_str(),\n                            false, &golden_file),\n      true);\n\n  RunTest(opts, proto_path, proto_file, golden_file, import_proto_file);\n}\n\nvoid proto_test_include_id(const std::string& proto_path,\n                           const std::string& proto_file,\n                           const std::string& import_proto_file) {\n  flatbuffers::IDLOptions opts;\n  opts.include_dependence_headers = true;\n  opts.proto_mode = true;\n  opts.keep_proto_id = true;\n  opts.proto_id_gap_action = IDLOptions::ProtoIdGapAction::NO_OP;\n\n  std::string golden_file;\n  TEST_EQ(\n      flatbuffers::LoadFile((proto_path + \"test_include_id.golden.fbs\").c_str(),\n                            false, &golden_file),\n      true);\n\n  RunTest(opts, proto_path, proto_file, golden_file, import_proto_file);\n}\n\nvoid proto_test_include_union(const std::string& proto_path,\n                              const std::string& proto_file,\n                              const std::string& import_proto_file) {\n  flatbuffers::IDLOptions opts;\n  opts.include_dependence_headers = true;\n  opts.proto_mode = true;\n  opts.proto_oneof_union = true;\n  opts.proto_id_gap_action = IDLOptions::ProtoIdGapAction::NO_OP;\n\n  std::string golden_file;\n  TEST_EQ(flatbuffers::LoadFile(\n              (proto_path + \"test_union_include.golden.fbs\").c_str(), false,\n              &golden_file),\n          true);\n\n  RunTest(opts, proto_path, proto_file, golden_file, import_proto_file);\n}\n\nvoid proto_test_include_union_id(const std::string& proto_path,\n                                 const std::string& proto_file,\n                                 const std::string& import_proto_file) {\n  flatbuffers::IDLOptions opts;\n  opts.include_dependence_headers = true;\n  opts.proto_mode = true;\n  opts.proto_oneof_union = true;\n  opts.keep_proto_id = true;\n  opts.proto_id_gap_action = IDLOptions::ProtoIdGapAction::NO_OP;\n\n  std::string golden_file;\n  TEST_EQ(flatbuffers::LoadFile(\n              (proto_path + \"test_union_include_id.golden.fbs\").c_str(), false,\n              &golden_file),\n          true);\n\n  RunTest(opts, proto_path, proto_file, golden_file, import_proto_file);\n}\n\nvoid ParseCorruptedProto(const std::string& proto_path) {\n  const char* include_directories[] = {proto_path.c_str(), nullptr};\n\n  flatbuffers::IDLOptions opts;\n  opts.include_dependence_headers = true;\n  opts.proto_mode = true;\n  opts.proto_oneof_union = true;\n\n  std::string proto_file;\n\n  std::unique_ptr<CodeGenerator> fbs_generator = NewFBSCodeGenerator(true);\n\n  // Parse proto with non positive id.\n  {\n    flatbuffers::Parser parser(opts);\n    TEST_EQ(\n        flatbuffers::LoadFile((proto_path + \"non-positive-id.proto\").c_str(),\n                              false, &proto_file),\n        true);\n    TEST_EQ(parser.Parse(proto_file.c_str(), include_directories), true);\n    TEST_NE(fbs_generator->GenerateCode(parser, \"temp.fbs\", \"test\"),\n            CodeGenerator::Status::OK);\n  }\n\n  // Parse proto with twice id.\n  {\n    flatbuffers::Parser parser(opts);\n    TEST_EQ(flatbuffers::LoadFile((proto_path + \"twice-id.proto\").c_str(),\n                                  false, &proto_file),\n            true);\n    TEST_EQ(parser.Parse(proto_file.c_str(), include_directories), true);\n    TEST_NE(fbs_generator->GenerateCode(parser, \"temp.fbs\", \"test\"),\n            CodeGenerator::Status::OK);\n  }\n\n  // Parse proto with using reserved id.\n  {\n    flatbuffers::Parser parser(opts);\n    TEST_EQ(flatbuffers::LoadFile((proto_path + \"twice-id.proto\").c_str(),\n                                  false, &proto_file),\n            true);\n    TEST_EQ(parser.Parse(proto_file.c_str(), include_directories), true);\n    TEST_NE(fbs_generator->GenerateCode(parser, \"temp.fbs\", \"test\"),\n            CodeGenerator::Status::OK);\n  }\n\n  // Parse proto with error on gap.\n  {\n    opts.proto_id_gap_action = IDLOptions::ProtoIdGapAction::ERROR;\n    flatbuffers::Parser parser(opts);\n    TEST_EQ(flatbuffers::LoadFile((proto_path + \"test.proto\").c_str(), false,\n                                  &proto_file),\n            true);\n    TEST_EQ(parser.Parse(proto_file.c_str(), include_directories), true);\n\n    TEST_NE(fbs_generator->GenerateCode(parser, \"temp.fbs\", \"test\"),\n            CodeGenerator::Status::OK);\n  }\n}\n\n// Parse a .proto schema, output as .fbs\nvoid ParseProtoTest(const std::string& tests_data_path) {\n  auto proto_path = tests_data_path + \"prototest/\";\n  std::string proto_file;\n  TEST_EQ(\n      flatbuffers::LoadFile((tests_data_path + \"prototest/test.proto\").c_str(),\n                            false, &proto_file),\n      true);\n\n  std::string import_proto_file;\n  TEST_EQ(flatbuffers::LoadFile(\n              (tests_data_path + \"prototest/imported.proto\").c_str(), false,\n              &import_proto_file),\n          true);\n\n  proto_test(proto_path, proto_file);\n  proto_test_union(proto_path, proto_file);\n  proto_test_union_suffix(proto_path, proto_file);\n  proto_test_include(proto_path, proto_file, import_proto_file);\n  proto_test_include_union(proto_path, proto_file, import_proto_file);\n\n  proto_test_id(proto_path, proto_file);\n  proto_test_union_id(proto_path, proto_file);\n  proto_test_union_suffix_id(proto_path, proto_file);\n  proto_test_include_id(proto_path, proto_file, import_proto_file);\n  proto_test_include_union_id(proto_path, proto_file, import_proto_file);\n\n  ParseCorruptedProto(proto_path);\n}\n\nvoid ParseProtoBufAsciiTest() {\n  // We can put the parser in a mode where it will accept JSON that looks more\n  // like Protobuf ASCII, for users that have data in that format.\n  // This uses no \"\" for field names (which we already support by default,\n  // omits `,`, `:` before `{` and a couple of other features.\n  flatbuffers::Parser parser;\n  parser.opts.protobuf_ascii_alike = true;\n  TEST_EQ(\n      parser.Parse(\"table S { B:int; } table T { A:[int]; C:S; } root_type T;\"),\n      true);\n  TEST_EQ(parser.Parse(\"{ A [1 2] C { B:2 }}\"), true);\n  // Similarly, in text output, it should omit these.\n  std::string text;\n  auto err =\n      flatbuffers::GenText(parser, parser.builder_.GetBufferPointer(), &text);\n  TEST_NULL(err);\n  TEST_EQ_STR(text.c_str(),\n              \"{\\n  A [\\n    1\\n    2\\n  ]\\n  C {\\n    B: 2\\n  }\\n}\\n\");\n}\n\n}  // namespace tests\n}  // namespace flatbuffers\n"
  },
  {
    "path": "tests/proto_test.h",
    "content": "#ifndef TESTS_PROTO_TEST_H\n#define TESTS_PROTO_TEST_H\n\n#include <string>\n\n#include \"flatbuffers/idl.h\"\n\nnamespace flatbuffers {\nnamespace tests {\n\nvoid RunTest(const flatbuffers::IDLOptions& opts, const std::string& proto_path,\n             const std::string& proto_file, const std::string& golden_file,\n             const std::string import_proto_file = {});\nvoid proto_test(const std::string& proto_path, const std::string& proto_file);\nvoid proto_test_union(const std::string& proto_path,\n                      const std::string& proto_file);\nvoid proto_test_union_suffix(const std::string& proto_path,\n                             const std::string& proto_file);\nvoid proto_test_include(const std::string& proto_path,\n                        const std::string& proto_file,\n                        const std::string& import_proto_file);\nvoid proto_test_include_union(const std::string& proto_path,\n                              const std::string& proto_file,\n                              const std::string& import_proto_file);\n\nvoid proto_test_id(const std::string& proto_path,\n                   const std::string& proto_file);\nvoid proto_test_union_id(const std::string& proto_path,\n                         const std::string& proto_file);\nvoid proto_test_union_suffix_id(const std::string& proto_path,\n                                const std::string& proto_file);\nvoid proto_test_include_id(const std::string& proto_path,\n                           const std::string& proto_file,\n                           const std::string& import_proto_file);\nvoid proto_test_include_union_id(const std::string& proto_path,\n                                 const std::string& proto_file,\n                                 const std::string& import_proto_file);\n\nvoid ParseCorruptedProto(const std::string& proto_path);\nvoid ParseProtoTest(const std::string& tests_data_path);\nvoid ParseProtoBufAsciiTest();\n\n}  // namespace tests\n}  // namespace flatbuffers\n\n#endif\n"
  },
  {
    "path": "tests/prototest/GenerateProtoGoldens.sh",
    "content": "#!/bin/bash\n#\n# Copyright 2022 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\npushd \"$(dirname $0)\" >/dev/null\n\n./../../flatc --proto test.proto && mv test.fbs test_include.golden.fbs\n./../../flatc --proto --gen-all test.proto && mv test.fbs test.golden.fbs\n./../../flatc --proto --oneof-union test.proto && mv test.fbs test_union_include.golden.fbs\n./../../flatc --proto --gen-all --oneof-union test.proto && mv test.fbs test_union.golden.fbs\n./../../flatc --proto --gen-all --proto-namespace-suffix test_namespace_suffix test.proto && mv test.fbs test_suffix.golden.fbs\n./../../flatc --proto --gen-all --proto-namespace-suffix test_namespace_suffix --oneof-union test.proto && mv test.fbs test_union_suffix.golden.fbs\n\n./../../flatc --proto --keep-proto-id test.proto && mv test.fbs test_include_id.golden.fbs\n./../../flatc --proto --keep-proto-id --gen-all test.proto && mv test.fbs test_id.golden.fbs\n./../../flatc --proto --keep-proto-id --oneof-union test.proto && mv test.fbs test_union_include_id.golden.fbs\n./../../flatc --proto --keep-proto-id --gen-all --oneof-union test.proto && mv test.fbs test_union_id.golden.fbs\n./../../flatc --proto --keep-proto-id --gen-all --proto-namespace-suffix test_namespace_suffix test.proto && mv test.fbs test_suffix_id.golden.fbs\n./../../flatc --proto --keep-proto-id --gen-all --proto-namespace-suffix test_namespace_suffix --oneof-union test.proto && mv test.fbs test_union_suffix_id.golden.fbs\n"
  },
  {
    "path": "tests/prototest/imported.proto",
    "content": "package proto.test;\n\nmessage ImportedMessage {\n    optional int32 a = 26;\n}\n"
  },
  {
    "path": "tests/prototest/non-positive-id.proto",
    "content": "// Sample .proto file that we can not translate to the corresponding .fbs because it has non-positive ids.\n\noption some_option = is_ignored;\n\npackage proto.test;\n\nmessage ProtoMessage {\n  optional uint64 NonPositiveId = -1;\n}\n"
  },
  {
    "path": "tests/prototest/test.golden.fbs",
    "content": "// Generated from test.proto\n\nnamespace proto.test;\n\n/// Enum doc comment.\nenum ProtoEnum : int {\n  NUL = 0,\n  FOO = 1,\n  /// Enum 2nd value doc comment misaligned.\n  BAR = 5,\n}\n\nnamespace proto.test.ProtoMessage_.OtherMessage_;\n\nenum ProtoEnum : int {\n  NUL = 0,\n  FOO = 1,\n  BAR = 2,\n  BAZ = 3,\n}\n\nnamespace proto.test;\n\ntable ImportedMessage {\n  a:int;\n}\n\n/// 2nd table doc comment with\n/// many lines.\ntable ProtoMessage {\n  c:int = 16;\n  d:long;\n  p:uint;\n  e:ulong;\n  /// doc comment for f.\n  f:int = -1;\n  g:long;\n  h:uint;\n  q:ulong;\n  i:int;\n  j:long;\n  /// doc comment for k.\n  k:bool;\n  /// doc comment for l on 2\n  /// lines\n  l:string (required);\n  m:[ubyte];\n  n:proto.test.ProtoMessage_.OtherMessage;\n  o:[string];\n  z:proto.test.ImportedMessage;\n  /// doc comment for r.\n  r:proto.test.ProtoMessage_.Anonymous0;\n  outer_enum:proto.test.ProtoEnum;\n  u:float = +inf;\n  v:float = +inf;\n  w:float = -inf;\n  grades:[proto.test.ProtoMessage_.GradesEntry];\n  other_message_map:[proto.test.ProtoMessage_.OtherMessageMapEntry];\n}\n\nnamespace proto.test.ProtoMessage_;\n\ntable OtherMessage {\n  a:double;\n  /// doc comment for b.\n  b:float = 3.14149;\n  foo_bar_baz:proto.test.ProtoMessage_.OtherMessage_.ProtoEnum;\n}\n\ntable Anonymous0 {\n  /// doc comment for s.\n  s:proto.test.ImportedMessage;\n  /// doc comment for t on 2\n  /// lines.\n  t:proto.test.ProtoMessage_.OtherMessage;\n}\n\ntable GradesEntry {\n  key:string (key);\n  value:float;\n}\n\ntable OtherMessageMapEntry {\n  key:string (key);\n  value:proto.test.ProtoMessage_.OtherMessage;\n}\n\n"
  },
  {
    "path": "tests/prototest/test.proto",
    "content": "// Sample .proto file that we can translate to the corresponding .fbs.\n\noption some_option = is_ignored;\nimport \"imported.proto\";\n\npackage proto.test;\n\n/// Enum doc comment.\nenum ProtoEnum {\n  option allow_alias = true;\n  NUL = 0;\n  FOO = 1;\n  /// Enum 2nd value doc comment misaligned.\n  BAR = 5;\n  // Aliases\n  FOO_A1 = 1;\n  BAR_A1 = 5;\n  FOO_A2 = 1;\n}\n\n/// 2nd table doc comment with\n/// many lines.\nmessage ProtoMessage {\n  // Ignored non-doc comment.\n  // A nested message declaration, will be moved to top level in .fbs\n  message OtherMessage {\n    reserved 2, 9 to 11, 15;\n    optional double a = 26;\n    /// doc comment for b.\n    optional float b = 32 [default = 3.14149];\n\n    // Nested enum that aliases the outer one.\n    enum ProtoEnum {\n      NUL = 0;\n      FOO = 1;\n      BAR = 2;\n      BAZ = 3;\n    }\n\n    optional ProtoEnum foo_bar_baz = 33;\n  }\n  optional int32 c = 12 [default = 16];\n  optional int64 d = 1 [default = 0];\n  optional uint32 p = 40;\n  optional uint64 e = 2;\n  /// doc comment for f.\n  optional sint32 f = 3 [default = -1];\n  optional sint64 g = 4;\n  optional fixed32 h = 5;\n  optional fixed64 q = 6;\n  optional sfixed32 i = 7;\n  optional sfixed64 j = 8;\n  /// doc comment for k.\n  optional bool k = 9;\n  /// doc comment for l on 2\n  /// lines\n  required string l = 10;\n  optional bytes m = 11;\n  optional OtherMessage n = 41;\n  repeated string o = 14;\n  optional ImportedMessage z = 16;\n  /// doc comment for r.\n  oneof r {\n    /// doc comment for s.\n    ImportedMessage s = 17;\n    /// doc comment for t on 2\n    /// lines.\n    OtherMessage t = 18;\n  }\n  optional ProtoEnum outer_enum = 33;\n  // Tests that `inf` and `+/-inf` can be parsed in proto options.\n  optional float u = 34 [default = inf];\n  optional float v = 35 [default = +inf];\n  optional float w = 36 [default = -inf];\n\n  map<string, float> grades = 37;\n  map<string, OtherMessage> other_message_map = 38;\n}\n"
  },
  {
    "path": "tests/prototest/test_id.golden.fbs",
    "content": "// Generated from test.proto\n\nnamespace proto.test;\n\n/// Enum doc comment.\nenum ProtoEnum : int {\n  NUL = 0,\n  FOO = 1,\n  /// Enum 2nd value doc comment misaligned.\n  BAR = 5,\n}\n\nnamespace proto.test.ProtoMessage_.OtherMessage_;\n\nenum ProtoEnum : int {\n  NUL = 0,\n  FOO = 1,\n  BAR = 2,\n  BAZ = 3,\n}\n\nnamespace proto.test;\n\ntable ImportedMessage {\n  a:int (id: 0);\n}\n\n/// 2nd table doc comment with\n/// many lines.\ntable ProtoMessage {\n  c:int = 16 (id: 12);\n  d:long (id: 1);\n  p:uint (id: 21);\n  e:ulong (id: 2);\n  /// doc comment for f.\n  f:int = -1 (id: 3);\n  g:long (id: 4);\n  h:uint (id: 5);\n  q:ulong (id: 6);\n  i:int (id: 7);\n  j:long (id: 8);\n  /// doc comment for k.\n  k:bool (id: 9);\n  /// doc comment for l on 2\n  /// lines\n  l:string (required,id: 10);\n  m:[ubyte] (id: 11);\n  n:proto.test.ProtoMessage_.OtherMessage (id: 22);\n  o:[string] (id: 13);\n  z:proto.test.ImportedMessage (id: 14);\n  /// doc comment for r.\n  r:proto.test.ProtoMessage_.Anonymous0 (id: 0);\n  outer_enum:proto.test.ProtoEnum (id: 15);\n  u:float = +inf (id: 16);\n  v:float = +inf (id: 17);\n  w:float = -inf (id: 18);\n  grades:[proto.test.ProtoMessage_.GradesEntry] (id: 19);\n  other_message_map:[proto.test.ProtoMessage_.OtherMessageMapEntry] (id: 20);\n}\n\nnamespace proto.test.ProtoMessage_;\n\ntable OtherMessage {\n  a:double (id: 0);\n  /// doc comment for b.\n  b:float = 3.14149 (id: 1);\n  foo_bar_baz:proto.test.ProtoMessage_.OtherMessage_.ProtoEnum (id: 2);\n}\n\ntable Anonymous0 {\n  /// doc comment for s.\n  s:proto.test.ImportedMessage (id: 0);\n  /// doc comment for t on 2\n  /// lines.\n  t:proto.test.ProtoMessage_.OtherMessage (id: 1);\n}\n\ntable GradesEntry {\n  key:string (key);\n  value:float;\n}\n\ntable OtherMessageMapEntry {\n  key:string (key);\n  value:proto.test.ProtoMessage_.OtherMessage;\n}\n\n"
  },
  {
    "path": "tests/prototest/test_include.golden.fbs",
    "content": "// Generated from test.proto\n\ninclude \"imported.fbs\";\n\nnamespace proto.test;\n\n/// Enum doc comment.\nenum ProtoEnum : int {\n  NUL = 0,\n  FOO = 1,\n  /// Enum 2nd value doc comment misaligned.\n  BAR = 5,\n}\n\nnamespace proto.test.ProtoMessage_.OtherMessage_;\n\nenum ProtoEnum : int {\n  NUL = 0,\n  FOO = 1,\n  BAR = 2,\n  BAZ = 3,\n}\n\nnamespace proto.test;\n\n/// 2nd table doc comment with\n/// many lines.\ntable ProtoMessage {\n  c:int = 16;\n  d:long;\n  p:uint;\n  e:ulong;\n  /// doc comment for f.\n  f:int = -1;\n  g:long;\n  h:uint;\n  q:ulong;\n  i:int;\n  j:long;\n  /// doc comment for k.\n  k:bool;\n  /// doc comment for l on 2\n  /// lines\n  l:string (required);\n  m:[ubyte];\n  n:proto.test.ProtoMessage_.OtherMessage;\n  o:[string];\n  z:proto.test.ImportedMessage;\n  /// doc comment for r.\n  r:proto.test.ProtoMessage_.Anonymous0;\n  outer_enum:proto.test.ProtoEnum;\n  u:float = +inf;\n  v:float = +inf;\n  w:float = -inf;\n  grades:[proto.test.ProtoMessage_.GradesEntry];\n  other_message_map:[proto.test.ProtoMessage_.OtherMessageMapEntry];\n}\n\nnamespace proto.test.ProtoMessage_;\n\ntable OtherMessage {\n  a:double;\n  /// doc comment for b.\n  b:float = 3.14149;\n  foo_bar_baz:proto.test.ProtoMessage_.OtherMessage_.ProtoEnum;\n}\n\ntable Anonymous0 {\n  /// doc comment for s.\n  s:proto.test.ImportedMessage;\n  /// doc comment for t on 2\n  /// lines.\n  t:proto.test.ProtoMessage_.OtherMessage;\n}\n\ntable GradesEntry {\n  key:string (key);\n  value:float;\n}\n\ntable OtherMessageMapEntry {\n  key:string (key);\n  value:proto.test.ProtoMessage_.OtherMessage;\n}\n\n"
  },
  {
    "path": "tests/prototest/test_include_id.golden.fbs",
    "content": "// Generated from test.proto\n\ninclude \"imported.fbs\";\n\nnamespace proto.test;\n\n/// Enum doc comment.\nenum ProtoEnum : int {\n  NUL = 0,\n  FOO = 1,\n  /// Enum 2nd value doc comment misaligned.\n  BAR = 5,\n}\n\nnamespace proto.test.ProtoMessage_.OtherMessage_;\n\nenum ProtoEnum : int {\n  NUL = 0,\n  FOO = 1,\n  BAR = 2,\n  BAZ = 3,\n}\n\nnamespace proto.test;\n\n/// 2nd table doc comment with\n/// many lines.\ntable ProtoMessage {\n  c:int = 16 (id: 12);\n  d:long (id: 1);\n  p:uint (id: 21);\n  e:ulong (id: 2);\n  /// doc comment for f.\n  f:int = -1 (id: 3);\n  g:long (id: 4);\n  h:uint (id: 5);\n  q:ulong (id: 6);\n  i:int (id: 7);\n  j:long (id: 8);\n  /// doc comment for k.\n  k:bool (id: 9);\n  /// doc comment for l on 2\n  /// lines\n  l:string (required,id: 10);\n  m:[ubyte] (id: 11);\n  n:proto.test.ProtoMessage_.OtherMessage (id: 22);\n  o:[string] (id: 13);\n  z:proto.test.ImportedMessage (id: 14);\n  /// doc comment for r.\n  r:proto.test.ProtoMessage_.Anonymous0 (id: 0);\n  outer_enum:proto.test.ProtoEnum (id: 15);\n  u:float = +inf (id: 16);\n  v:float = +inf (id: 17);\n  w:float = -inf (id: 18);\n  grades:[proto.test.ProtoMessage_.GradesEntry] (id: 19);\n  other_message_map:[proto.test.ProtoMessage_.OtherMessageMapEntry] (id: 20);\n}\n\nnamespace proto.test.ProtoMessage_;\n\ntable OtherMessage {\n  a:double (id: 0);\n  /// doc comment for b.\n  b:float = 3.14149 (id: 1);\n  foo_bar_baz:proto.test.ProtoMessage_.OtherMessage_.ProtoEnum (id: 2);\n}\n\ntable Anonymous0 {\n  /// doc comment for s.\n  s:proto.test.ImportedMessage (id: 0);\n  /// doc comment for t on 2\n  /// lines.\n  t:proto.test.ProtoMessage_.OtherMessage (id: 1);\n}\n\ntable GradesEntry {\n  key:string (key);\n  value:float;\n}\n\ntable OtherMessageMapEntry {\n  key:string (key);\n  value:proto.test.ProtoMessage_.OtherMessage;\n}\n\n"
  },
  {
    "path": "tests/prototest/test_suffix.golden.fbs",
    "content": "// Generated from test.proto\n\nnamespace proto.test.test_namespace_suffix;\n\n/// Enum doc comment.\nenum ProtoEnum : int {\n  NUL = 0,\n  FOO = 1,\n  /// Enum 2nd value doc comment misaligned.\n  BAR = 5,\n}\n\nnamespace proto.test.test_namespace_suffix.ProtoMessage_.OtherMessage_;\n\nenum ProtoEnum : int {\n  NUL = 0,\n  FOO = 1,\n  BAR = 2,\n  BAZ = 3,\n}\n\nnamespace proto.test.test_namespace_suffix;\n\ntable ImportedMessage {\n  a:int;\n}\n\n/// 2nd table doc comment with\n/// many lines.\ntable ProtoMessage {\n  c:int = 16;\n  d:long;\n  p:uint;\n  e:ulong;\n  /// doc comment for f.\n  f:int = -1;\n  g:long;\n  h:uint;\n  q:ulong;\n  i:int;\n  j:long;\n  /// doc comment for k.\n  k:bool;\n  /// doc comment for l on 2\n  /// lines\n  l:string (required);\n  m:[ubyte];\n  n:proto.test.test_namespace_suffix.ProtoMessage_.OtherMessage;\n  o:[string];\n  z:proto.test.test_namespace_suffix.ImportedMessage;\n  /// doc comment for r.\n  r:proto.test.test_namespace_suffix.ProtoMessage_.Anonymous0;\n  outer_enum:proto.test.test_namespace_suffix.ProtoEnum;\n  u:float = +inf;\n  v:float = +inf;\n  w:float = -inf;\n  grades:[proto.test.test_namespace_suffix.ProtoMessage_.GradesEntry];\n  other_message_map:[proto.test.test_namespace_suffix.ProtoMessage_.OtherMessageMapEntry];\n}\n\nnamespace proto.test.test_namespace_suffix.ProtoMessage_;\n\ntable OtherMessage {\n  a:double;\n  /// doc comment for b.\n  b:float = 3.14149;\n  foo_bar_baz:proto.test.test_namespace_suffix.ProtoMessage_.OtherMessage_.ProtoEnum;\n}\n\ntable Anonymous0 {\n  /// doc comment for s.\n  s:proto.test.test_namespace_suffix.ImportedMessage;\n  /// doc comment for t on 2\n  /// lines.\n  t:proto.test.test_namespace_suffix.ProtoMessage_.OtherMessage;\n}\n\ntable GradesEntry {\n  key:string (key);\n  value:float;\n}\n\ntable OtherMessageMapEntry {\n  key:string (key);\n  value:proto.test.test_namespace_suffix.ProtoMessage_.OtherMessage;\n}\n\n"
  },
  {
    "path": "tests/prototest/test_suffix_id.golden.fbs",
    "content": "// Generated from test.proto\n\nnamespace proto.test.test_namespace_suffix;\n\n/// Enum doc comment.\nenum ProtoEnum : int {\n  NUL = 0,\n  FOO = 1,\n  /// Enum 2nd value doc comment misaligned.\n  BAR = 5,\n}\n\nnamespace proto.test.test_namespace_suffix.ProtoMessage_.OtherMessage_;\n\nenum ProtoEnum : int {\n  NUL = 0,\n  FOO = 1,\n  BAR = 2,\n  BAZ = 3,\n}\n\nnamespace proto.test.test_namespace_suffix;\n\ntable ImportedMessage {\n  a:int (id: 0);\n}\n\n/// 2nd table doc comment with\n/// many lines.\ntable ProtoMessage {\n  c:int = 16 (id: 12);\n  d:long (id: 1);\n  p:uint (id: 21);\n  e:ulong (id: 2);\n  /// doc comment for f.\n  f:int = -1 (id: 3);\n  g:long (id: 4);\n  h:uint (id: 5);\n  q:ulong (id: 6);\n  i:int (id: 7);\n  j:long (id: 8);\n  /// doc comment for k.\n  k:bool (id: 9);\n  /// doc comment for l on 2\n  /// lines\n  l:string (required,id: 10);\n  m:[ubyte] (id: 11);\n  n:proto.test.test_namespace_suffix.ProtoMessage_.OtherMessage (id: 22);\n  o:[string] (id: 13);\n  z:proto.test.test_namespace_suffix.ImportedMessage (id: 14);\n  /// doc comment for r.\n  r:proto.test.test_namespace_suffix.ProtoMessage_.Anonymous0 (id: 0);\n  outer_enum:proto.test.test_namespace_suffix.ProtoEnum (id: 15);\n  u:float = +inf (id: 16);\n  v:float = +inf (id: 17);\n  w:float = -inf (id: 18);\n  grades:[proto.test.test_namespace_suffix.ProtoMessage_.GradesEntry] (id: 19);\n  other_message_map:[proto.test.test_namespace_suffix.ProtoMessage_.OtherMessageMapEntry] (id: 20);\n}\n\nnamespace proto.test.test_namespace_suffix.ProtoMessage_;\n\ntable OtherMessage {\n  a:double (id: 0);\n  /// doc comment for b.\n  b:float = 3.14149 (id: 1);\n  foo_bar_baz:proto.test.test_namespace_suffix.ProtoMessage_.OtherMessage_.ProtoEnum (id: 2);\n}\n\ntable Anonymous0 {\n  /// doc comment for s.\n  s:proto.test.test_namespace_suffix.ImportedMessage (id: 0);\n  /// doc comment for t on 2\n  /// lines.\n  t:proto.test.test_namespace_suffix.ProtoMessage_.OtherMessage (id: 1);\n}\n\ntable GradesEntry {\n  key:string (key);\n  value:float;\n}\n\ntable OtherMessageMapEntry {\n  key:string (key);\n  value:proto.test.test_namespace_suffix.ProtoMessage_.OtherMessage;\n}\n\n"
  },
  {
    "path": "tests/prototest/test_union.golden.fbs",
    "content": "// Generated from test.proto\n\nnamespace proto.test;\n\n/// Enum doc comment.\nenum ProtoEnum : int {\n  NUL = 0,\n  FOO = 1,\n  /// Enum 2nd value doc comment misaligned.\n  BAR = 5,\n}\n\nnamespace proto.test.ProtoMessage_.OtherMessage_;\n\nenum ProtoEnum : int {\n  NUL = 0,\n  FOO = 1,\n  BAR = 2,\n  BAZ = 3,\n}\n\nnamespace proto.test.ProtoMessage_;\n\nunion RUnion {\n  /// doc comment for s.\n  proto.test.ImportedMessage,\n  /// doc comment for t on 2\n  /// lines.\n  proto.test.ProtoMessage_.OtherMessage,\n}\n\nnamespace proto.test;\n\ntable ImportedMessage {\n  a:int;\n}\n\n/// 2nd table doc comment with\n/// many lines.\ntable ProtoMessage {\n  c:int = 16;\n  d:long;\n  p:uint;\n  e:ulong;\n  /// doc comment for f.\n  f:int = -1;\n  g:long;\n  h:uint;\n  q:ulong;\n  i:int;\n  j:long;\n  /// doc comment for k.\n  k:bool;\n  /// doc comment for l on 2\n  /// lines\n  l:string (required);\n  m:[ubyte];\n  n:proto.test.ProtoMessage_.OtherMessage;\n  o:[string];\n  z:proto.test.ImportedMessage;\n  /// doc comment for r.\n  r:proto.test.ProtoMessage_.RUnion;\n  outer_enum:proto.test.ProtoEnum;\n  u:float = +inf;\n  v:float = +inf;\n  w:float = -inf;\n  grades:[proto.test.ProtoMessage_.GradesEntry];\n  other_message_map:[proto.test.ProtoMessage_.OtherMessageMapEntry];\n}\n\nnamespace proto.test.ProtoMessage_;\n\ntable OtherMessage {\n  a:double;\n  /// doc comment for b.\n  b:float = 3.14149;\n  foo_bar_baz:proto.test.ProtoMessage_.OtherMessage_.ProtoEnum;\n}\n\ntable GradesEntry {\n  key:string (key);\n  value:float;\n}\n\ntable OtherMessageMapEntry {\n  key:string (key);\n  value:proto.test.ProtoMessage_.OtherMessage;\n}\n\n"
  },
  {
    "path": "tests/prototest/test_union_id.golden.fbs",
    "content": "// Generated from test.proto\n\nnamespace proto.test;\n\n/// Enum doc comment.\nenum ProtoEnum : int {\n  NUL = 0,\n  FOO = 1,\n  /// Enum 2nd value doc comment misaligned.\n  BAR = 5,\n}\n\nnamespace proto.test.ProtoMessage_.OtherMessage_;\n\nenum ProtoEnum : int {\n  NUL = 0,\n  FOO = 1,\n  BAR = 2,\n  BAZ = 3,\n}\n\nnamespace proto.test.ProtoMessage_;\n\nunion RUnion {\n  /// doc comment for s.\n  proto.test.ImportedMessage,\n  /// doc comment for t on 2\n  /// lines.\n  proto.test.ProtoMessage_.OtherMessage,\n}\n\nnamespace proto.test;\n\ntable ImportedMessage {\n  a:int (id: 0);\n}\n\n/// 2nd table doc comment with\n/// many lines.\ntable ProtoMessage {\n  c:int = 16 (id: 13);\n  d:long (id: 2);\n  p:uint (id: 22);\n  e:ulong (id: 3);\n  /// doc comment for f.\n  f:int = -1 (id: 4);\n  g:long (id: 5);\n  h:uint (id: 6);\n  q:ulong (id: 7);\n  i:int (id: 8);\n  j:long (id: 9);\n  /// doc comment for k.\n  k:bool (id: 10);\n  /// doc comment for l on 2\n  /// lines\n  l:string (required,id: 11);\n  m:[ubyte] (id: 12);\n  n:proto.test.ProtoMessage_.OtherMessage (id: 23);\n  o:[string] (id: 14);\n  z:proto.test.ImportedMessage (id: 15);\n  /// doc comment for r.\n  r:proto.test.ProtoMessage_.RUnion (id: 1);\n  outer_enum:proto.test.ProtoEnum (id: 16);\n  u:float = +inf (id: 17);\n  v:float = +inf (id: 18);\n  w:float = -inf (id: 19);\n  grades:[proto.test.ProtoMessage_.GradesEntry] (id: 20);\n  other_message_map:[proto.test.ProtoMessage_.OtherMessageMapEntry] (id: 21);\n}\n\nnamespace proto.test.ProtoMessage_;\n\ntable OtherMessage {\n  a:double (id: 0);\n  /// doc comment for b.\n  b:float = 3.14149 (id: 1);\n  foo_bar_baz:proto.test.ProtoMessage_.OtherMessage_.ProtoEnum (id: 2);\n}\n\ntable GradesEntry {\n  key:string (key);\n  value:float;\n}\n\ntable OtherMessageMapEntry {\n  key:string (key);\n  value:proto.test.ProtoMessage_.OtherMessage;\n}\n\n"
  },
  {
    "path": "tests/prototest/test_union_include.golden.fbs",
    "content": "// Generated from test.proto\n\ninclude \"imported.fbs\";\n\nnamespace proto.test;\n\n/// Enum doc comment.\nenum ProtoEnum : int {\n  NUL = 0,\n  FOO = 1,\n  /// Enum 2nd value doc comment misaligned.\n  BAR = 5,\n}\n\nnamespace proto.test.ProtoMessage_.OtherMessage_;\n\nenum ProtoEnum : int {\n  NUL = 0,\n  FOO = 1,\n  BAR = 2,\n  BAZ = 3,\n}\n\nnamespace proto.test.ProtoMessage_;\n\nunion RUnion {\n  /// doc comment for s.\n  proto.test.ImportedMessage,\n  /// doc comment for t on 2\n  /// lines.\n  proto.test.ProtoMessage_.OtherMessage,\n}\n\nnamespace proto.test;\n\n/// 2nd table doc comment with\n/// many lines.\ntable ProtoMessage {\n  c:int = 16;\n  d:long;\n  p:uint;\n  e:ulong;\n  /// doc comment for f.\n  f:int = -1;\n  g:long;\n  h:uint;\n  q:ulong;\n  i:int;\n  j:long;\n  /// doc comment for k.\n  k:bool;\n  /// doc comment for l on 2\n  /// lines\n  l:string (required);\n  m:[ubyte];\n  n:proto.test.ProtoMessage_.OtherMessage;\n  o:[string];\n  z:proto.test.ImportedMessage;\n  /// doc comment for r.\n  r:proto.test.ProtoMessage_.RUnion;\n  outer_enum:proto.test.ProtoEnum;\n  u:float = +inf;\n  v:float = +inf;\n  w:float = -inf;\n  grades:[proto.test.ProtoMessage_.GradesEntry];\n  other_message_map:[proto.test.ProtoMessage_.OtherMessageMapEntry];\n}\n\nnamespace proto.test.ProtoMessage_;\n\ntable OtherMessage {\n  a:double;\n  /// doc comment for b.\n  b:float = 3.14149;\n  foo_bar_baz:proto.test.ProtoMessage_.OtherMessage_.ProtoEnum;\n}\n\ntable GradesEntry {\n  key:string (key);\n  value:float;\n}\n\ntable OtherMessageMapEntry {\n  key:string (key);\n  value:proto.test.ProtoMessage_.OtherMessage;\n}\n\n"
  },
  {
    "path": "tests/prototest/test_union_include_id.golden.fbs",
    "content": "// Generated from test.proto\n\ninclude \"imported.fbs\";\n\nnamespace proto.test;\n\n/// Enum doc comment.\nenum ProtoEnum : int {\n  NUL = 0,\n  FOO = 1,\n  /// Enum 2nd value doc comment misaligned.\n  BAR = 5,\n}\n\nnamespace proto.test.ProtoMessage_.OtherMessage_;\n\nenum ProtoEnum : int {\n  NUL = 0,\n  FOO = 1,\n  BAR = 2,\n  BAZ = 3,\n}\n\nnamespace proto.test.ProtoMessage_;\n\nunion RUnion {\n  /// doc comment for s.\n  proto.test.ImportedMessage,\n  /// doc comment for t on 2\n  /// lines.\n  proto.test.ProtoMessage_.OtherMessage,\n}\n\nnamespace proto.test;\n\n/// 2nd table doc comment with\n/// many lines.\ntable ProtoMessage {\n  c:int = 16 (id: 13);\n  d:long (id: 2);\n  p:uint (id: 22);\n  e:ulong (id: 3);\n  /// doc comment for f.\n  f:int = -1 (id: 4);\n  g:long (id: 5);\n  h:uint (id: 6);\n  q:ulong (id: 7);\n  i:int (id: 8);\n  j:long (id: 9);\n  /// doc comment for k.\n  k:bool (id: 10);\n  /// doc comment for l on 2\n  /// lines\n  l:string (required,id: 11);\n  m:[ubyte] (id: 12);\n  n:proto.test.ProtoMessage_.OtherMessage (id: 23);\n  o:[string] (id: 14);\n  z:proto.test.ImportedMessage (id: 15);\n  /// doc comment for r.\n  r:proto.test.ProtoMessage_.RUnion (id: 1);\n  outer_enum:proto.test.ProtoEnum (id: 16);\n  u:float = +inf (id: 17);\n  v:float = +inf (id: 18);\n  w:float = -inf (id: 19);\n  grades:[proto.test.ProtoMessage_.GradesEntry] (id: 20);\n  other_message_map:[proto.test.ProtoMessage_.OtherMessageMapEntry] (id: 21);\n}\n\nnamespace proto.test.ProtoMessage_;\n\ntable OtherMessage {\n  a:double (id: 0);\n  /// doc comment for b.\n  b:float = 3.14149 (id: 1);\n  foo_bar_baz:proto.test.ProtoMessage_.OtherMessage_.ProtoEnum (id: 2);\n}\n\ntable GradesEntry {\n  key:string (key);\n  value:float;\n}\n\ntable OtherMessageMapEntry {\n  key:string (key);\n  value:proto.test.ProtoMessage_.OtherMessage;\n}\n\n"
  },
  {
    "path": "tests/prototest/test_union_suffix.golden.fbs",
    "content": "// Generated from test.proto\n\nnamespace proto.test.test_namespace_suffix;\n\n/// Enum doc comment.\nenum ProtoEnum : int {\n  NUL = 0,\n  FOO = 1,\n  /// Enum 2nd value doc comment misaligned.\n  BAR = 5,\n}\n\nnamespace proto.test.test_namespace_suffix.ProtoMessage_.OtherMessage_;\n\nenum ProtoEnum : int {\n  NUL = 0,\n  FOO = 1,\n  BAR = 2,\n  BAZ = 3,\n}\n\nnamespace proto.test.test_namespace_suffix.ProtoMessage_;\n\nunion RUnion {\n  /// doc comment for s.\n  proto.test.test_namespace_suffix.ImportedMessage,\n  /// doc comment for t on 2\n  /// lines.\n  proto.test.test_namespace_suffix.ProtoMessage_.OtherMessage,\n}\n\nnamespace proto.test.test_namespace_suffix;\n\ntable ImportedMessage {\n  a:int;\n}\n\n/// 2nd table doc comment with\n/// many lines.\ntable ProtoMessage {\n  c:int = 16;\n  d:long;\n  p:uint;\n  e:ulong;\n  /// doc comment for f.\n  f:int = -1;\n  g:long;\n  h:uint;\n  q:ulong;\n  i:int;\n  j:long;\n  /// doc comment for k.\n  k:bool;\n  /// doc comment for l on 2\n  /// lines\n  l:string (required);\n  m:[ubyte];\n  n:proto.test.test_namespace_suffix.ProtoMessage_.OtherMessage;\n  o:[string];\n  z:proto.test.test_namespace_suffix.ImportedMessage;\n  /// doc comment for r.\n  r:proto.test.test_namespace_suffix.ProtoMessage_.RUnion;\n  outer_enum:proto.test.test_namespace_suffix.ProtoEnum;\n  u:float = +inf;\n  v:float = +inf;\n  w:float = -inf;\n  grades:[proto.test.test_namespace_suffix.ProtoMessage_.GradesEntry];\n  other_message_map:[proto.test.test_namespace_suffix.ProtoMessage_.OtherMessageMapEntry];\n}\n\nnamespace proto.test.test_namespace_suffix.ProtoMessage_;\n\ntable OtherMessage {\n  a:double;\n  /// doc comment for b.\n  b:float = 3.14149;\n  foo_bar_baz:proto.test.test_namespace_suffix.ProtoMessage_.OtherMessage_.ProtoEnum;\n}\n\ntable GradesEntry {\n  key:string (key);\n  value:float;\n}\n\ntable OtherMessageMapEntry {\n  key:string (key);\n  value:proto.test.test_namespace_suffix.ProtoMessage_.OtherMessage;\n}\n\n"
  },
  {
    "path": "tests/prototest/test_union_suffix_id.golden.fbs",
    "content": "// Generated from test.proto\n\nnamespace proto.test.test_namespace_suffix;\n\n/// Enum doc comment.\nenum ProtoEnum : int {\n  NUL = 0,\n  FOO = 1,\n  /// Enum 2nd value doc comment misaligned.\n  BAR = 5,\n}\n\nnamespace proto.test.test_namespace_suffix.ProtoMessage_.OtherMessage_;\n\nenum ProtoEnum : int {\n  NUL = 0,\n  FOO = 1,\n  BAR = 2,\n  BAZ = 3,\n}\n\nnamespace proto.test.test_namespace_suffix.ProtoMessage_;\n\nunion RUnion {\n  /// doc comment for s.\n  proto.test.test_namespace_suffix.ImportedMessage,\n  /// doc comment for t on 2\n  /// lines.\n  proto.test.test_namespace_suffix.ProtoMessage_.OtherMessage,\n}\n\nnamespace proto.test.test_namespace_suffix;\n\ntable ImportedMessage {\n  a:int (id: 0);\n}\n\n/// 2nd table doc comment with\n/// many lines.\ntable ProtoMessage {\n  c:int = 16 (id: 13);\n  d:long (id: 2);\n  p:uint (id: 22);\n  e:ulong (id: 3);\n  /// doc comment for f.\n  f:int = -1 (id: 4);\n  g:long (id: 5);\n  h:uint (id: 6);\n  q:ulong (id: 7);\n  i:int (id: 8);\n  j:long (id: 9);\n  /// doc comment for k.\n  k:bool (id: 10);\n  /// doc comment for l on 2\n  /// lines\n  l:string (required,id: 11);\n  m:[ubyte] (id: 12);\n  n:proto.test.test_namespace_suffix.ProtoMessage_.OtherMessage (id: 23);\n  o:[string] (id: 14);\n  z:proto.test.test_namespace_suffix.ImportedMessage (id: 15);\n  /// doc comment for r.\n  r:proto.test.test_namespace_suffix.ProtoMessage_.RUnion (id: 1);\n  outer_enum:proto.test.test_namespace_suffix.ProtoEnum (id: 16);\n  u:float = +inf (id: 17);\n  v:float = +inf (id: 18);\n  w:float = -inf (id: 19);\n  grades:[proto.test.test_namespace_suffix.ProtoMessage_.GradesEntry] (id: 20);\n  other_message_map:[proto.test.test_namespace_suffix.ProtoMessage_.OtherMessageMapEntry] (id: 21);\n}\n\nnamespace proto.test.test_namespace_suffix.ProtoMessage_;\n\ntable OtherMessage {\n  a:double (id: 0);\n  /// doc comment for b.\n  b:float = 3.14149 (id: 1);\n  foo_bar_baz:proto.test.test_namespace_suffix.ProtoMessage_.OtherMessage_.ProtoEnum (id: 2);\n}\n\ntable GradesEntry {\n  key:string (key);\n  value:float;\n}\n\ntable OtherMessageMapEntry {\n  key:string (key);\n  value:proto.test.test_namespace_suffix.ProtoMessage_.OtherMessage;\n}\n\n"
  },
  {
    "path": "tests/prototest/twice-id.proto",
    "content": "// Sample .proto file that we can not translate to the corresponding .fbs because it has used an id twice\n\noption some_option = is_ignored;\n\npackage proto.test;\n\nmessage ProtoMessage {\n  optional sint32 e = 2;\n  optional uint64 twice = 2;\n}\n"
  },
  {
    "path": "tests/prototest/use-reserved-id.proto",
    "content": "// Sample .proto file that we can not translate to the corresponding .fbs because it has used ids from reserved ids.\n\noption some_option = is_ignored;\n\npackage proto.test;\n\nmessage ProtoMessage {\n  reserved 200, 9 to 11, 1500;\n  optional sint32 reserved_id_usage = 10;\n}\n"
  },
  {
    "path": "tests/py_flexbuffers_test.py",
    "content": "# Lint as: python3\n# Copyright 2020 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\"\"\"Unit tests for flexbuffers.py.\"\"\"\n\nimport array\nimport os.path\nimport struct\nimport unittest\n\nfrom flatbuffers import flexbuffers\n\nType = flexbuffers.Type\n\nLOG2 = {1: 0, 2: 1, 4: 2, 8: 3}\n\nGOLD_FLEXBUFFER_OBJ = {\n    'bar': [1, 2, 3],\n    'bar3': [1, 2, 3],\n    'bool': True,\n    'bools': [True, False, True, False],\n    'foo': 100.0,\n    'mymap': {'foo': 'Fred'},\n    'vec': [-100, 'Fred', 4.0, b'M', False, 4.0],\n}\n\nGOLD_FLEXBUFFER_FILE = 'gold_flexbuffer_example.bin'\n\n\ndef read_test_file(name):\n  with open(os.path.join(os.path.dirname(__file__), name), 'rb') as f:\n    return f.read()\n\n\ndef packed_type(type_, i):\n  return (type_ << 2) | LOG2[i]\n\n\ndef uint_size(value):\n  \"\"\"Returns number of bytes (power of two) to represent unsigned value.\"\"\"\n  assert value >= 0\n\n  n = 8\n  while not value < (1 << n):\n    n *= 2\n  return n // 8\n\n\ndef int_size(value):\n  \"\"\"Returns number of bytes (power of two) to represent signed value.\"\"\"\n  n = 8\n  while not -(1 << (n - 1)) <= value < (1 << (n - 1)):\n    n *= 2\n  return n // 8\n\n\ndef uint_sizes(value):\n  return tuple(1 << i for i in range(LOG2[uint_size(value)], 4))\n\n\ndef int_sizes(value):\n  return tuple(1 << i for i in range(LOG2[int_size(value)], 4))\n\n\ndef int_bytes(value, byte_width):\n  return struct.pack(\n      '<%s' % {1: 'b', 2: 'h', 4: 'i', 8: 'q'}[byte_width], value\n  )\n\n\ndef uint_bytes(value, byte_width):\n  return struct.pack(\n      '<%s' % {1: 'B', 2: 'H', 4: 'I', 8: 'Q'}[byte_width], value\n  )\n\n\ndef float_bytes(value, byte_width):\n  return struct.pack('<%s' % {4: 'f', 8: 'd'}[byte_width], value)\n\n\ndef min_value(type_, byte_width):\n  assert byte_width > 0\n\n  if type_ in (Type.INT, Type.INDIRECT_INT):\n    return -(1 << (8 * byte_width - 1))\n  elif type_ in (Type.UINT, Type.INDIRECT_UINT):\n    return 0\n  else:\n    raise ValueError('Unsupported type %s' % type_)\n\n\ndef max_value(type_, byte_width):\n  assert byte_width > 0\n\n  if type_ in (Type.INT, Type.INDIRECT_INT):\n    return (1 << (8 * byte_width - 1)) - 1\n  elif type_ in (Type.UINT, Type.INDIRECT_UINT):\n    return (1 << 8 * byte_width) - 1\n  else:\n    raise ValueError('Unsupported type %s' % type_)\n\n\ndef str_bytes(value, byte_width):\n  value_bytes = value.encode('utf-8')\n  return [*uint_bytes(len(value_bytes), byte_width), *value_bytes, 0]\n\n\ndef key_bytes(value):\n  return [*value.encode('ascii'), 0]\n\n\ndef encode_type(type_, value, byte_width=None):\n  fbb = flexbuffers.Builder()\n  add = fbb.Adder(type_)\n  if byte_width:\n    add(value, byte_width)\n  else:\n    add(value)\n  return fbb.Finish()\n\n\nINT_MIN_MAX_VALUES = (\n    min_value(Type.INT, 1),\n    max_value(Type.INT, 1),\n    min_value(Type.INT, 2),\n    max_value(Type.INT, 2),\n    min_value(Type.INT, 4),\n    max_value(Type.INT, 4),\n    min_value(Type.INT, 8),\n    max_value(Type.INT, 8),\n)\n\nUINT_MIN_MAX_VALUES = (\n    0,\n    max_value(Type.UINT, 1),\n    max_value(Type.UINT, 2),\n    max_value(Type.UINT, 4),\n    max_value(Type.UINT, 8),\n)\n\n\nclass UtilTest(unittest.TestCase):\n  \"\"\"Tests to check FlexBuffer utility functions.\"\"\"\n\n  def _test_type_predicate(self, pred, types):\n    for type_ in types:\n      with self.subTest(type=type_, pred=pred):\n        self.assertTrue(pred(type_))\n\n    for type_ in set(Type).difference(types):\n      with self.subTest(type=type_, pred=pred):\n        self.assertFalse(pred(type_))\n\n  def test_inline_types(self):\n    self._test_type_predicate(\n        Type.IsInline, (Type.NULL, Type.INT, Type.UINT, Type.FLOAT, Type.BOOL)\n    )\n\n  def test_typed_vector(self):\n    self._test_type_predicate(\n        Type.IsTypedVector,\n        (\n            Type.VECTOR_INT,\n            Type.VECTOR_UINT,\n            Type.VECTOR_FLOAT,\n            Type.VECTOR_KEY,\n            Type.VECTOR_STRING_DEPRECATED,\n            Type.VECTOR_BOOL,\n        ),\n    )\n\n    self._test_type_predicate(\n        Type.IsTypedVectorElementType,\n        (Type.INT, Type.UINT, Type.FLOAT, Type.KEY, Type.STRING, Type.BOOL),\n    )\n\n    with self.assertRaises(ValueError):\n      Type.ToTypedVectorElementType(Type.VECTOR)\n    self.assertIs(Type.ToTypedVectorElementType(Type.VECTOR_INT), Type.INT)\n    self.assertIs(Type.ToTypedVectorElementType(Type.VECTOR_UINT), Type.UINT)\n    self.assertIs(Type.ToTypedVectorElementType(Type.VECTOR_FLOAT), Type.FLOAT)\n    self.assertIs(Type.ToTypedVectorElementType(Type.VECTOR_KEY), Type.KEY)\n    self.assertIs(\n        Type.ToTypedVectorElementType(Type.VECTOR_STRING_DEPRECATED),\n        Type.STRING,\n    )\n    self.assertIs(Type.ToTypedVectorElementType(Type.VECTOR_BOOL), Type.BOOL)\n\n    with self.assertRaises(ValueError):\n      Type.ToTypedVector(Type.VECTOR)\n    self.assertIs(Type.ToTypedVector(Type.INT), Type.VECTOR_INT)\n    self.assertIs(Type.ToTypedVector(Type.UINT), Type.VECTOR_UINT)\n    self.assertIs(Type.ToTypedVector(Type.FLOAT), Type.VECTOR_FLOAT)\n    self.assertIs(Type.ToTypedVector(Type.KEY), Type.VECTOR_KEY)\n    self.assertIs(\n        Type.ToTypedVector(Type.STRING), Type.VECTOR_STRING_DEPRECATED\n    )\n    self.assertIs(Type.ToTypedVector(Type.BOOL), Type.VECTOR_BOOL)\n\n  def test_fixed_typed_vector(self):\n    self._test_type_predicate(\n        Type.IsFixedTypedVector,\n        (\n            Type.VECTOR_INT2,\n            Type.VECTOR_UINT2,\n            Type.VECTOR_FLOAT2,\n            Type.VECTOR_INT3,\n            Type.VECTOR_UINT3,\n            Type.VECTOR_FLOAT3,\n            Type.VECTOR_INT4,\n            Type.VECTOR_UINT4,\n            Type.VECTOR_FLOAT4,\n        ),\n    )\n\n    self._test_type_predicate(\n        Type.IsFixedTypedVectorElementType, (Type.INT, Type.UINT, Type.FLOAT)\n    )\n\n    self.assertEqual(\n        Type.ToFixedTypedVectorElementType(Type.VECTOR_INT2), (Type.INT, 2)\n    )\n    self.assertEqual(\n        Type.ToFixedTypedVectorElementType(Type.VECTOR_UINT2), (Type.UINT, 2)\n    )\n    self.assertEqual(\n        Type.ToFixedTypedVectorElementType(Type.VECTOR_FLOAT2), (Type.FLOAT, 2)\n    )\n    self.assertEqual(\n        Type.ToFixedTypedVectorElementType(Type.VECTOR_INT3), (Type.INT, 3)\n    )\n    self.assertEqual(\n        Type.ToFixedTypedVectorElementType(Type.VECTOR_UINT3), (Type.UINT, 3)\n    )\n    self.assertEqual(\n        Type.ToFixedTypedVectorElementType(Type.VECTOR_FLOAT3), (Type.FLOAT, 3)\n    )\n    self.assertEqual(\n        Type.ToFixedTypedVectorElementType(Type.VECTOR_INT4), (Type.INT, 4)\n    )\n    self.assertEqual(\n        Type.ToFixedTypedVectorElementType(Type.VECTOR_UINT4), (Type.UINT, 4)\n    )\n    self.assertEqual(\n        Type.ToFixedTypedVectorElementType(Type.VECTOR_FLOAT4), (Type.FLOAT, 4)\n    )\n\n    # Invalid size\n    for type_ in Type.INT, Type.UINT, Type.FLOAT:\n      with self.assertRaises(ValueError):\n        Type.ToTypedVector(type_, 1)\n      with self.assertRaises(ValueError):\n        Type.ToTypedVector(type_, 5)\n\n    # Invalid element type\n    for length in 1, 2, 3, 4, 5:\n      with self.assertRaises(ValueError):\n        Type.ToTypedVector(Type.STRING, length)\n\n    self.assertIs(Type.ToTypedVector(Type.INT, 2), Type.VECTOR_INT2)\n    self.assertIs(Type.ToTypedVector(Type.INT, 3), Type.VECTOR_INT3)\n    self.assertIs(Type.ToTypedVector(Type.INT, 4), Type.VECTOR_INT4)\n\n    self.assertIs(Type.ToTypedVector(Type.UINT, 2), Type.VECTOR_UINT2)\n    self.assertIs(Type.ToTypedVector(Type.UINT, 3), Type.VECTOR_UINT3)\n    self.assertIs(Type.ToTypedVector(Type.UINT, 4), Type.VECTOR_UINT4)\n\n    self.assertIs(Type.ToTypedVector(Type.FLOAT, 2), Type.VECTOR_FLOAT2)\n    self.assertIs(Type.ToTypedVector(Type.FLOAT, 3), Type.VECTOR_FLOAT3)\n    self.assertIs(Type.ToTypedVector(Type.FLOAT, 4), Type.VECTOR_FLOAT4)\n\n  def test_width(self):\n    for x in range(1 << 10):\n      self.assertEqual(flexbuffers.BitWidth.U(x), LOG2[uint_size(x)])\n\n    for x in range(-(1 << 10), 1 << 10):\n      self.assertEqual(flexbuffers.BitWidth.I(x), LOG2[int_size(x)])\n\n  def test_padding(self):\n    self.assertEqual(flexbuffers._PaddingBytes(0, 4), 0)\n    self.assertEqual(flexbuffers._PaddingBytes(0, 8), 0)\n    self.assertEqual(flexbuffers._PaddingBytes(0, 16), 0)\n\n    self.assertEqual(flexbuffers._PaddingBytes(1, 8), 7)\n    self.assertEqual(flexbuffers._PaddingBytes(17, 8), 7)\n\n    self.assertEqual(flexbuffers._PaddingBytes(42, 2), 0)\n\n\nclass DecoderTest(unittest.TestCase):\n  \"\"\"Tests to check FlexBuffer decoding functions.\n\n  Common variable names used in the tests for compactness:\n    bw: byte_width\n    ebw: element_byte_width\n    kbw: key_byte_width\n    vbw: value_byte_width\n    tbw: type_byte_width\n\n  Having '_ignored' suffix means that variable doesn't affect the constructed\n  byte buffer size.\n  \"\"\"\n\n  def test_null(self):\n    for bw in 1, 2, 4, 8:\n      for ebw_ignored in 1, 2, 4, 8:\n        with self.subTest(bw=bw, ebw_ignored=ebw_ignored):\n          data = bytes([\n              *uint_bytes(0, bw),\n              packed_type(Type.NULL, ebw_ignored),\n              bw,\n          ])\n\n          root = flexbuffers.GetRoot(data)\n          self.assertTrue(root.IsNull)\n          self.assertEqual(root.AsBool, False)\n          self.assertEqual(root.AsInt, 0)\n          self.assertEqual(root.AsFloat, 0.0)\n\n          for prop in (\n              type(root).AsKey,\n              type(root).AsString,\n              type(root).AsBlob,\n              type(root).AsVector,\n              type(root).AsTypedVector,\n              type(root).AsFixedTypedVector,\n              type(root).AsMap,\n          ):\n            with self.assertRaises(TypeError):\n              prop.fget(root)\n\n          self.assertEqual(root.Value, None)\n\n          self.assertIsNone(flexbuffers.Loads(data))\n\n  def test_bool(self):\n    for value in False, True:\n      for bw in 1, 2, 4, 8:\n        for ebw_ignored in 1, 2, 4, 8:\n          with self.subTest(bw=bw, ebw_ignored=ebw_ignored):\n            data = bytes([\n                *uint_bytes(int(value), bw),\n                packed_type(Type.BOOL, ebw_ignored),\n                bw,\n            ])\n\n            root = flexbuffers.GetRoot(data)\n            self.assertTrue(root.IsBool)\n            self.assertEqual(root.AsBool, value)\n            self.assertEqual(root.AsInt, int(value))\n            self.assertEqual(root.AsFloat, float(value))\n\n            for prop in (\n                type(root).AsKey,\n                type(root).AsString,\n                type(root).AsBlob,\n                type(root).AsVector,\n                type(root).AsTypedVector,\n                type(root).AsFixedTypedVector,\n                type(root).AsMap,\n            ):\n              with self.assertRaises(TypeError):\n                prop.fget(root)\n\n            self.assertEqual(root.Value, value)\n\n            self.assertEqual(flexbuffers.Loads(data), value)\n\n  def test_mutate_bool(self):\n    root = flexbuffers.GetRoot(flexbuffers.Dumps(True))\n    self.assertTrue(root.IsBool)\n    self.assertTrue(root.AsBool)\n\n    self.assertTrue(root.MutateBool(False))\n    self.assertTrue(root.IsBool)\n    self.assertFalse(root.AsBool)\n\n    self.assertTrue(root.MutateBool(True))\n    self.assertTrue(root.IsBool)\n    self.assertTrue(root.AsBool)\n\n  def _check_int(self, data, value):\n    root = flexbuffers.GetRoot(data)\n    self.assertTrue(root.IsInt)\n    self.assertEqual(root.AsInt, value)\n    self.assertEqual(root.AsBool, bool(value))\n    self.assertEqual(root.AsFloat, float(value))\n\n    for prop in (\n        type(root).AsKey,\n        type(root).AsString,\n        type(root).AsBlob,\n        type(root).AsVector,\n        type(root).AsTypedVector,\n        type(root).AsFixedTypedVector,\n        type(root).AsMap,\n    ):\n      with self.assertRaises(TypeError):\n        prop.fget(root)\n\n    self.assertEqual(root.Value, value)\n\n    self.assertEqual(flexbuffers.Loads(data), value)\n\n  def test_int(self):\n    for value in (0, 1, -1, 15, -17, *INT_MIN_MAX_VALUES):\n      for bw in int_sizes(value):\n        for ebw_ignored in 1, 2, 4, 8:\n          with self.subTest(value=value, bw=bw, ebw_ignored=ebw_ignored):\n            data = bytes([\n                *int_bytes(value, bw),\n                packed_type(Type.INT, ebw_ignored),\n                bw,\n            ])\n\n            self._check_int(data, value)\n\n  def test_indirect_int(self):\n    for value in (0, 1, -1, 15, -17, *INT_MIN_MAX_VALUES):\n      for bw in 1, 2, 4, 8:\n        for ebw in int_sizes(value):\n          with self.subTest(value=value, bw=bw, ebw=ebw):\n            data = bytes([\n                # Int\n                *int_bytes(value, ebw),\n                # Root\n                *uint_bytes(ebw, bw),\n                packed_type(Type.INDIRECT_INT, ebw),\n                bw,\n            ])\n            self._check_int(data, value)\n\n  def test_uint(self):\n    for value in (1, *UINT_MIN_MAX_VALUES):\n      for bw in uint_sizes(value):\n        for ebw_ignored in 1, 2, 4, 8:\n          with self.subTest(value=value, bw=bw, ebw_ignored=ebw_ignored):\n            data = bytes([\n                *uint_bytes(value, bw),\n                packed_type(Type.UINT, ebw_ignored),\n                bw,\n            ])\n\n            self._check_int(data, value)\n\n  def test_inidirect_uint(self):\n    for value in (1, *UINT_MIN_MAX_VALUES):\n      for bw in 1, 2, 4, 8:\n        for ebw in uint_sizes(value):\n          with self.subTest(value=value, bw=bw, ebw=ebw):\n            data = bytes([\n                # UInt\n                *uint_bytes(value, ebw),\n                # Root\n                *uint_bytes(ebw, bw),\n                packed_type(Type.INDIRECT_UINT, ebw),\n                bw,\n            ])\n\n            self._check_int(data, value)\n\n  def test_mutate_ints(self):\n    # Signed\n    for type_ in Type.INT, Type.INDIRECT_INT:\n      with self.subTest(type=type_):\n        root = flexbuffers.GetRoot(encode_type(type_, 56))\n        self.assertEqual(root.AsInt, 56)\n\n        for new_value in 0, 1, -1, -128, 127:\n          self.assertTrue(root.MutateInt(new_value))\n          self.assertEqual(root.AsInt, new_value)\n\n        for new_value in -129, 128:\n          self.assertFalse(root.MutateInt(new_value))\n\n    # Unsigned\n    for type_ in Type.UINT, Type.INDIRECT_UINT:\n      with self.subTest(type=type_):\n        root = flexbuffers.GetRoot(encode_type(type_, 1))\n        self.assertEqual(root.AsInt, 1)\n\n        for new_value in 0, 1, 255:\n          self.assertTrue(root.MutateInt(new_value))\n          self.assertEqual(root.AsInt, new_value)\n\n        self.assertFalse(root.MutateInt(256))\n\n    # Inside vector\n    fbb = flexbuffers.Builder()\n    fbb.VectorFromElements([13, 0, -15])\n    data = fbb.Finish()\n\n    self.assertEqual(flexbuffers.Loads(data), [13, 0, -15])\n    self.assertTrue(flexbuffers.GetRoot(data).AsVector[0].MutateInt(0))\n    self.assertTrue(flexbuffers.GetRoot(data).AsVector[1].MutateInt(-7))\n    self.assertTrue(flexbuffers.GetRoot(data).AsVector[2].MutateInt(45))\n    self.assertEqual(flexbuffers.Loads(data), [0, -7, 45])\n\n    # Inside map\n    fbb = flexbuffers.Builder()\n    fbb.MapFromElements({'x': -7, 'y': 46})\n    data = fbb.Finish()\n\n    self.assertEqual(flexbuffers.Loads(data), {'x': -7, 'y': 46})\n    self.assertTrue(flexbuffers.GetRoot(data).AsMap['x'].MutateInt(14))\n    self.assertTrue(flexbuffers.GetRoot(data).AsMap['y'].MutateInt(-1))\n    self.assertEqual(flexbuffers.Loads(data), {'x': 14, 'y': -1})\n\n  def _check_float(self, data, value):\n    root = flexbuffers.GetRoot(data)\n    self.assertTrue(root.IsFloat)\n    self.assertAlmostEqual(root.AsFloat, value)\n\n    for prop in (\n        type(root).AsKey,\n        type(root).AsString,\n        type(root).AsBlob,\n        type(root).AsVector,\n        type(root).AsTypedVector,\n        type(root).AsFixedTypedVector,\n        type(root).AsMap,\n    ):\n      with self.assertRaises(TypeError):\n        prop.fget(root)\n\n    self.assertAlmostEqual(root.Value, value)\n\n    self.assertAlmostEqual(flexbuffers.Loads(data), value)\n\n  def test_float(self):\n    for value in -1.0, 0.0, 1.0, 3.141592, 1.5e6:\n      for bw in 4, 8:\n        for ebw_ignored in 1, 2, 4, 8:\n          with self.subTest(value=value, bw=bw, ebw_ignored=ebw_ignored):\n            data = bytes([\n                *float_bytes(value, bw),\n                packed_type(Type.FLOAT, ebw_ignored),\n                bw,\n            ])\n\n            self._check_float(data, value)\n\n  def test_indirect_float(self):\n    for value in -1.0, 0.0, 1.0, 3.141592, 1.5e6:\n      for bw in 1, 2, 4, 8:\n        for ebw in 4, 8:\n          with self.subTest(value=value, bw=bw, ebw=ebw):\n            data = bytes([\n                # Float\n                *float_bytes(value, ebw),\n                # Root\n                *uint_bytes(ebw, bw),\n                packed_type(Type.INDIRECT_FLOAT, ebw),\n                bw,\n            ])\n\n            self._check_float(data, value)\n\n  def test_mutate_float(self):\n    for type_ in Type.FLOAT, Type.INDIRECT_FLOAT:\n      for bw in 4, 8:\n        value = 3.141592\n        root = flexbuffers.GetRoot(encode_type(type_, value, bw))\n        self.assertAlmostEqual(root.AsFloat, value)\n\n        value = 2.71828\n        self.assertTrue(root.MutateFloat(value))\n        self.assertAlmostEqual(root.AsFloat, value, places=5)\n\n    # Inside vector\n    data = flexbuffers.Dumps([2.4, 1.5, -7.2])\n\n    self.assertTrue(flexbuffers.GetRoot(data).AsVector[0].MutateFloat(0.0))\n    self.assertTrue(flexbuffers.GetRoot(data).AsVector[1].MutateFloat(15.2))\n    self.assertTrue(flexbuffers.GetRoot(data).AsVector[2].MutateFloat(-5.1))\n\n    for a, b in zip(flexbuffers.Loads(data), [0.0, 15.2, -5.1]):\n      self.assertAlmostEqual(a, b)\n\n  def test_string(self):\n    for value in 'red', 'green', 'blue', 'flatbuffers + flexbuffers':\n      value_bytes = value.encode('utf-8')\n      for bw in 1, 2, 4, 8:\n        for lbw in 1, 2, 4, 8:\n          with self.subTest(bw=bw, lbw=lbw):\n            data = bytes([\n                # String\n                *uint_bytes(len(value_bytes), lbw),\n                *value_bytes,\n                0,\n                # Root\n                *uint_bytes(len(value_bytes) + 1, bw),  # offset\n                packed_type(Type.STRING, lbw),\n                bw,\n            ])\n\n            root = flexbuffers.GetRoot(data)\n            self.assertTrue(root.IsString)\n            self.assertEqual(root.AsString, value)\n            self.assertEqual(root.Value, value)\n            self.assertEqual(root.AsInt, len(value))\n\n            self.assertEqual(flexbuffers.Loads(data), value)\n\n  def test_mutate_string(self):\n    data = encode_type(Type.STRING, '12345')\n\n    root = flexbuffers.GetRoot(data)\n    self.assertTrue(root.IsString)\n    self.assertEqual(root.AsString, '12345')\n\n    self.assertFalse(root.MutateString('543210'))\n\n    self.assertTrue(root.MutateString('54321'))\n    self.assertTrue(root.IsString)\n    self.assertEqual(root.AsString, '54321')\n\n    self.assertTrue(root.MutateString('543'))\n    self.assertTrue(root.IsString)\n    self.assertEqual(root.AsString, '543')\n\n    self.assertFalse(root.MutateString('54321'))\n\n  def test_empty_blob(self):\n    for bw in 1, 2, 4, 8:\n      for lbw in 1, 2, 4, 8:\n        with self.subTest(bw=bw, lbw=lbw):\n          data = bytes([\n              # Blob\n              *uint_bytes(0, lbw),\n              # Root\n              *uint_bytes(0, bw),\n              packed_type(Type.BLOB, lbw),\n              bw,\n          ])\n\n          root = flexbuffers.GetRoot(data)\n          self.assertTrue(root.IsBlob)\n          self.assertEqual(root.AsBlob, bytes())\n          self.assertEqual(root.Value, bytes())\n          self.assertEqual(flexbuffers.Loads(data), bytes())\n\n  def test_blob(self):\n    for blob in [], [215], [23, 75, 124, 0, 45, 15], 255 * [0]:\n      for bw in 1, 2, 4, 8:\n        for lbw in 1, 2, 4, 8:\n          with self.subTest(blob=blob, bw=bw, lbw=lbw):\n            data = bytes([\n                # Blob\n                *uint_bytes(len(blob), lbw),\n                *blob,\n                # Root\n                *uint_bytes(len(blob), bw),\n                packed_type(Type.BLOB, lbw),\n                bw,\n            ])\n\n            root = flexbuffers.GetRoot(data)\n            self.assertTrue(root.IsBlob)\n            self.assertEqual(root.AsBlob, bytes(blob))\n            self.assertEqual(root.Value, bytes(blob))\n            self.assertEqual(flexbuffers.Loads(data), bytes(blob))\n\n  def test_key(self):\n    for value in '', 'x', 'color':\n      for bw in 1, 2, 4, 8:\n        with self.subTest(value=value, bw=bw):\n          value_bytes = value.encode('ascii')\n          data = bytes([\n              # Key\n              *value_bytes,\n              0,\n              # Root\n              *uint_bytes(len(value_bytes) + 1, bw),\n              packed_type(Type.KEY, 1),\n              bw,\n          ])\n\n          root = flexbuffers.GetRoot(data)\n          self.assertTrue(root.IsKey)\n          self.assertEqual(root.AsKey, value)\n          self.assertEqual(root.Value, value)\n          self.assertEqual(flexbuffers.Loads(data), value)\n\n  def _check_fixed_typed_vector(self, data, vector, type_):\n    self.assertEqual(flexbuffers.Loads(data), vector)\n\n    root = flexbuffers.GetRoot(data)\n    self.assertTrue(root.IsFixedTypedVector)\n\n    v = root.AsFixedTypedVector\n    self.assertEqual(len(v), len(vector))\n    self.assertIs(v.ElementType, type_)\n    self.assertEqual([e.Value for e in v], vector)\n    self.assertSequenceEqual(v.Value, vector)\n\n    self.assertEqual(root.AsInt, len(vector))\n\n  def test_fixed_typed_vector_float(self):\n    for type_, vector in (\n        (Type.VECTOR_FLOAT2, [-75.0, 34.89]),\n        (Type.VECTOR_FLOAT3, [-75.0, 34.89, 12.0]),\n        (Type.VECTOR_FLOAT4, [-75.0, 34.89, -1.0, 1.0]),\n    ):\n      for bw in 1, 2, 4, 8:\n        for ebw in 4, 8:\n          with self.subTest(type=type_, vector=vector, bw=bw, ebw=ebw):\n            data = bytes([\n                # FixedTypedVector\n                *b''.join(float_bytes(e, ebw) for e in vector),\n                # Root\n                *uint_bytes(len(vector) * ebw, bw),\n                packed_type(type_, ebw),\n                bw,\n            ])\n\n            for a, b in zip(flexbuffers.Loads(data), vector):\n              self.assertAlmostEqual(a, b, places=2)\n\n  def test_fixed_typed_vector_int(self):\n    for type_, vector in (\n        (Type.VECTOR_INT2, [0, -13]),\n        (Type.VECTOR_INT3, [127, 0, -13]),\n        (Type.VECTOR_INT4, [127, 0, -13, 0]),\n    ):\n      for bw in 1, 2, 4, 8:\n        for ebw in 1, 2, 4, 8:\n          with self.subTest(type=type_, vector=vector, bw=bw, ebw=ebw):\n            data = bytes([\n                # FixedTypeVector\n                *b''.join(int_bytes(e, ebw) for e in vector),\n                # Root\n                *uint_bytes(ebw * len(vector), bw),\n                packed_type(type_, ebw),\n                bw,\n            ])\n\n            self._check_fixed_typed_vector(data, vector, Type.INT)\n\n  def test_fixed_typed_vector_uint(self):\n    for type_, vector in (\n        (Type.VECTOR_UINT2, [0, 13]),\n        (Type.VECTOR_UINT3, [127, 0, 13]),\n        (Type.VECTOR_UINT4, [127, 0, 13, 0]),\n    ):\n      for bw in 1, 2, 4, 8:\n        for ebw in 1, 2, 4, 8:\n          with self.subTest(type=type_, vector=vector, bw=bw, ebw=ebw):\n            data = bytes([\n                # FixedTypeVector\n                *b''.join(uint_bytes(e, ebw) for e in vector),\n                # Root\n                *uint_bytes(ebw * len(vector), bw),\n                packed_type(type_, ebw),\n                bw,\n            ])\n\n            self._check_fixed_typed_vector(data, vector, Type.UINT)\n\n  def _check_typed_vector(self, data, vector, type_):\n    self.assertEqual(flexbuffers.Loads(data), vector)\n\n    root = flexbuffers.GetRoot(data)\n    self.assertTrue(root.IsTypedVector)\n\n    v = root.AsTypedVector\n    self.assertIs(v.ElementType, type_)\n    self.assertEqual(len(v), len(vector))\n    self.assertEqual([e.Value for e in v], vector)\n    self.assertSequenceEqual(v.Value, vector)\n\n    self.assertEqual(root.AsInt, len(vector))\n\n  def test_empty_typed_vector(self):\n    for type_ in (\n        Type.VECTOR_BOOL,\n        Type.VECTOR_INT,\n        Type.VECTOR_UINT,\n        Type.VECTOR_FLOAT,\n        Type.VECTOR_KEY,\n        Type.VECTOR_STRING_DEPRECATED,\n    ):\n      for bw in 1, 2, 4, 8:\n        for ebw in 1, 2, 4, 8:\n          with self.subTest(type=type_, bw=bw, ebw=ebw):\n            data = bytes([\n                # TypedVector[type_]\n                *uint_bytes(0, ebw),\n                # Root\n                *uint_bytes(0, bw),\n                packed_type(type_, ebw),\n                bw,\n            ])\n\n            element_type = Type.ToTypedVectorElementType(type_)\n            if element_type == Type.STRING:\n              element_type = Type.KEY\n            self._check_typed_vector(data, [], element_type)\n\n  def test_typed_vector_bool(self):\n    vector = [True, False, False, False, True]\n\n    for bw in 1, 2, 4, 8:\n      for ebw in 1, 2, 4, 8:\n        with self.subTest(bw=bw, ebw=ebw):\n          data = bytes([\n              # TypedVector[Type.BOOL]\n              *uint_bytes(len(vector), ebw),\n              *b''.join(uint_bytes(int(e), ebw) for e in vector),\n              # Root\n              *uint_bytes(len(vector) * ebw, bw),\n              packed_type(Type.VECTOR_BOOL, ebw),\n              bw,\n          ])\n          self._check_typed_vector(data, vector, Type.BOOL)\n\n  def test_typed_vector_int(self):\n    vector = [-100, 200, -300]\n\n    for bw in 1, 2, 4, 8:\n      for ebw in 2, 4, 8:\n        with self.subTest(bw=bw, ebw=ebw):\n          data = bytes([\n              # TypedVector[Type.INT]\n              *uint_bytes(len(vector), ebw),\n              *b''.join(int_bytes(e, ebw) for e in vector),\n              # Root\n              *uint_bytes(len(vector) * ebw, bw),\n              packed_type(Type.VECTOR_INT, ebw),\n              bw,\n          ])\n          self._check_typed_vector(data, vector, Type.INT)\n\n  def test_typed_vector_uint(self):\n    vector = [100, 200, 300, 400, 0]\n\n    for bw in 1, 2, 4, 8:\n      for ebw in 2, 4, 8:\n        with self.subTest(bw=bw, ebw=ebw):\n          data = bytes([\n              # TypedVector[Type.UINT]\n              *uint_bytes(len(vector), ebw),\n              *b''.join(int_bytes(e, ebw) for e in vector),\n              # Root\n              *uint_bytes(len(vector) * ebw, bw),\n              packed_type(Type.VECTOR_UINT, ebw),\n              bw,\n          ])\n          self._check_typed_vector(data, vector, Type.UINT)\n\n  def test_typed_vector_float(self):\n    vector = [3.64, -6.36, 3.14, 634.0, -42.0]\n\n    for bw in 1, 2, 4, 8:\n      for ebw in 4, 8:\n        with self.subTest(bw=bw, ebw=ebw):\n          data = bytes([\n              # TypedVector[Type.FLOAT]\n              *uint_bytes(len(vector), ebw),\n              *b''.join(float_bytes(e, ebw) for e in vector),\n              # Root\n              *uint_bytes(ebw * len(vector), bw),\n              packed_type(Type.VECTOR_FLOAT, ebw),\n              bw,\n          ])\n\n          for a, b in zip(flexbuffers.Loads(data), vector):\n            self.assertAlmostEqual(a, b, places=2)\n\n  def test_typed_vector_key(self):\n    vector = ['red', 'green', 'blue']\n\n    for bw in 1, 2, 4, 8:\n      for ebw in 1, 2, 4, 8:\n        with self.subTest(bw=bw, ebw=ebw):\n          data = bytes([\n              # Keys\n              *key_bytes(vector[0]),\n              *key_bytes(vector[1]),\n              *key_bytes(vector[2]),\n              # TypedVector[Type.KEY]\n              *uint_bytes(len(vector), ebw),\n              *uint_bytes(15 + 1 * ebw, ebw),  # offset to vector[0]\n              *uint_bytes(11 + 2 * ebw, ebw),  # offset to vector[1]\n              *uint_bytes(5 + 3 * ebw, ebw),  # offset to vector[2]\n              # Root\n              *uint_bytes(len(vector) * ebw, bw),  # offset to vector\n              packed_type(Type.VECTOR_KEY, ebw),\n              bw,\n          ])\n          self._check_typed_vector(data, vector, Type.KEY)\n\n  def test_typed_vector_string(self):\n    vector = ['red', 'green', 'blue']\n\n    for bw in 1, 2, 4, 8:\n      for ebw in 1, 2, 4, 8:\n        with self.subTest(bw=bw, ebw=ebw):\n          data = bytes([\n              # Strings\n              *str_bytes(vector[0], 1),  # 5 bytes\n              *str_bytes(vector[1], 1),  # 7 bytes\n              *str_bytes(vector[2], 1),  # 6 bytes\n              # TypedVector[Type.STRING]\n              *uint_bytes(len(vector), ebw),\n              *uint_bytes(17 + 1 * ebw, ebw),  # offset to vector[0]\n              *uint_bytes(12 + 2 * ebw, ebw),  # offset to vector[1]\n              *uint_bytes(5 + 3 * ebw, ebw),  # offset to vector[2]\n              # Root\n              *uint_bytes(len(vector) * ebw, bw),  # offset to vector\n              packed_type(Type.VECTOR_STRING_DEPRECATED, ebw),\n              bw,\n          ])\n\n          # We have to pass Type.KEY because of Type.VECTOR_STRING_DEPRECATED.\n          self._check_typed_vector(data, vector, Type.KEY)\n\n  def test_typed_vector_string_deprecated(self):\n    # Check FlexBuffersDeprecatedTest() inside test.cpp for details.\n    vector = [300 * 'A', 'test']\n\n    fbb = flexbuffers.Builder()\n    with fbb.TypedVector():\n      for e in vector:\n        fbb.String(e)\n    data = fbb.Finish()\n\n    # We have to pass Type.KEY because of Type.VECTOR_STRING_DEPRECATED.\n    self._check_typed_vector(data, vector, Type.KEY)\n\n  def test_typed_vector_invalid(self):\n    fbb = flexbuffers.Builder()\n\n    with self.assertRaises(RuntimeError):\n      fbb.TypedVectorFromElements(['string', 423])\n\n  def test_empty_vector(self):\n    for bw in 1, 2, 4, 8:\n      for ebw in 1, 2, 4, 8:\n        data = bytes([\n            *uint_bytes(0, ebw),\n            # Root\n            *uint_bytes(0, bw),\n            packed_type(Type.VECTOR, ebw),\n            bw,\n        ])\n\n        root = flexbuffers.GetRoot(data)\n        self.assertTrue(root.IsVector)\n        self.assertEqual(len(root.AsVector), 0)\n\n        self.assertEqual(flexbuffers.Loads(data), [])\n\n  def test_vector1(self):\n    vector = [300, 400, 500]\n\n    for bw in 1, 2, 4, 8:\n      for ebw in 2, 4, 8:\n        for tbw_ignored in 1, 2, 4, 8:\n          with self.subTest(bw=bw, ebw=ebw, ignore=tbw_ignored):\n            data = bytes([\n                # Vector length\n                *uint_bytes(len(vector), ebw),\n                # Vector elements\n                *int_bytes(vector[0], ebw),\n                *int_bytes(vector[1], ebw),\n                *int_bytes(vector[2], ebw),\n                # Vector types\n                packed_type(Type.INT, tbw_ignored),\n                packed_type(Type.INT, tbw_ignored),\n                packed_type(Type.INT, tbw_ignored),\n                # Root\n                *uint_bytes(ebw * len(vector) + len(vector), bw),\n                packed_type(Type.VECTOR, ebw),\n                bw,\n            ])\n\n            root = flexbuffers.GetRoot(data)\n            self.assertTrue(root.IsVector)\n            self.assertFalse(root.IsMap)\n\n            v = root.AsVector\n            self.assertEqual(len(v), len(vector))\n\n            for i in range(len(v)):\n              self.assertTrue(v[i].IsInt)\n              self.assertEqual(v[i].AsInt, vector[i])\n\n            for i, e in enumerate(v):\n              self.assertTrue(e.IsInt)\n              self.assertEqual(e.AsInt, vector[i])\n\n            with self.assertRaises(IndexError):\n              v[-1].AsInt  # pylint: disable=pointless-statement\n\n            with self.assertRaises(IndexError):\n              v[3].AsInt  # pylint: disable=pointless-statement\n\n            with self.assertRaises(TypeError):\n              root.AsMap  # pylint: disable=pointless-statement\n\n            self.assertEqual(root.AsInt, len(vector))\n            self.assertEqual(root.AsFloat, float(len(vector)))\n\n            self.assertEqual(flexbuffers.Loads(data), vector)\n\n  def test_vector2(self):\n    vector = [1984, 'August', True]\n\n    for bw in 1, 2, 4, 8:\n      with self.subTest(bw=bw):\n        data = bytes([\n            *str_bytes(vector[1], 1),\n            # Vector\n            *uint_bytes(len(vector), 2),\n            *int_bytes(vector[0], 2),\n            *uint_bytes(11, 2),  # offset to 'August'\n            *uint_bytes(int(vector[2]), 2),\n            packed_type(Type.INT, 2),\n            packed_type(Type.STRING, 1),\n            packed_type(Type.BOOL, 2),\n            # Root\n            *uint_bytes(2 * len(vector) + len(vector), bw),  # offset to vector\n            packed_type(Type.VECTOR, 2),\n            bw,\n        ])\n        self.assertEqual(flexbuffers.Loads(data), vector)\n\n        root = flexbuffers.GetRoot(data)\n        self.assertTrue(root.IsVector)\n\n        v = root.AsVector\n        self.assertTrue(v[0].IsInt)\n        self.assertEqual(v[0].AsInt, 1984)\n\n        self.assertTrue(v[1].IsString)\n        self.assertEqual(v[1].AsString, 'August')\n\n        self.assertTrue(v[2].IsBool)\n        self.assertTrue(v[2].AsBool)\n\n        self.assertEqual(v.Value, vector)\n\n        self.assertEqual(root.AsInt, len(vector))\n\n  def test_empty_map(self):\n    for bw in 1, 2, 4, 8:\n      for kbw in 1, 2, 4, 8:\n        for vbw in 1, 2, 4, 8:\n          data = bytes([\n              *uint_bytes(0, kbw),  # Keys length\n              *uint_bytes(0, vbw),\n              *uint_bytes(kbw, vbw),\n              *uint_bytes(0, vbw),  # Values length\n              # Root\n              *uint_bytes(0, bw),\n              packed_type(Type.MAP, vbw),\n              bw,\n          ])\n\n          root = flexbuffers.GetRoot(data)\n          self.assertTrue(root.IsMap)\n          self.assertEqual(len(root.AsMap), 0)\n\n          self.assertEqual(flexbuffers.Loads(data), {})\n\n  def test_map(self):\n    value = {'foo': 13, 'bar': 14}\n\n    for bw in 1, 2, 4, 8:\n      for kbw in 1, 2, 4, 8:\n        for vbw in 1, 2, 4, 8:\n          with self.subTest(kbw=kbw, vbw=vbw, bw=bw):\n            data = bytes([\n                *key_bytes('foo'),  # 4 bytes\n                *key_bytes('bar'),  # 4 bytes\n                # Map\n                *uint_bytes(len(value), kbw),\n                *uint_bytes(4 + 1 * kbw, kbw),  # offset to 'bar'\n                *uint_bytes(8 + 2 * kbw, kbw),  # offset to 'foo'\n                *uint_bytes(len(value) * kbw, vbw),  # offset to keys\n                *uint_bytes(kbw, vbw),\n                *uint_bytes(len(value), vbw),\n                *int_bytes(value['bar'], vbw),\n                *int_bytes(value['foo'], vbw),\n                packed_type(Type.INT, vbw),\n                packed_type(Type.INT, vbw),\n                # Root\n                *uint_bytes(\n                    vbw * len(value) + len(value), bw\n                ),  # offset to values\n                packed_type(Type.MAP, vbw),\n                bw,\n            ])\n\n            root = flexbuffers.GetRoot(data)\n            self.assertTrue(root.IsMap)\n\n            m = root.AsMap\n            self.assertEqual(len(m), 2)\n            self.assertEqual(m[0].AsInt, 14)\n            self.assertEqual(m[1].AsInt, 13)\n\n            self.assertEqual(m['bar'].AsInt, 14)\n            self.assertEqual(m['foo'].AsInt, 13)\n\n            for invalid_key in 'a', 'b', 'no':\n              with self.assertRaises(KeyError):\n                m[invalid_key]  # pylint: disable=pointless-statement\n\n            values = m.Values\n            self.assertEqual(len(values), 2)\n            self.assertEqual(values[0].AsInt, 14)\n            self.assertEqual(values[1].AsInt, 13)\n\n            keys = m.Keys\n            self.assertEqual(len(keys), 2)\n            self.assertEqual(len(keys[0].AsKey), 3)\n            self.assertEqual(keys[0].AsKey, 'bar')\n            self.assertEqual(len(keys[1].AsKey), 3)\n            self.assertEqual(keys[1].AsKey, 'foo')\n\n            keys = [key.AsKey for key in keys]\n            self.assertEqual(sorted(keys), keys)\n\n            self.assertEqual(root.AsInt, len(value))\n\n            self.assertEqual(flexbuffers.Loads(data), value)\n\n  def test_alignment(self):\n    value = ['test', 7]\n\n    data = bytes([\n        *key_bytes('test'),  # 5 bytes: 'test' and \\0\n        0,\n        0,\n        0,  # 3 bytes: alignment\n        # Vector\n        *uint_bytes(len(value), byte_width=8),\n        *uint_bytes(16, byte_width=8),\n        *uint_bytes(7, byte_width=8),\n        packed_type(Type.KEY, 1),\n        packed_type(Type.INT, 8),\n        # Root\n        *uint_bytes(8 * len(value) + len(value), 1),\n        packed_type(Type.VECTOR, 8),\n        1,\n    ])\n\n    self.assertEqual(flexbuffers.Loads(data), value)\n\n\nclass EncoderTest(unittest.TestCase):\n  \"\"\"Tests to check FlexBuffer encoding functions.\"\"\"\n\n  def test_null(self):\n    def encode_null():\n      fbb = flexbuffers.Builder()\n      fbb.Null()\n      return fbb.Finish()\n\n    self.assertIsNone(flexbuffers.Loads(encode_null()))\n\n  def test_bool(self):\n    for value in False, True:\n      data = encode_type(Type.BOOL, value)\n      self.assertEqual(flexbuffers.Loads(data), value)\n\n  def test_int(self):\n    for byte_width in 1, 2, 4, 8:\n      for type_ in Type.INT, Type.INDIRECT_INT, Type.UINT, Type.INDIRECT_UINT:\n        with self.subTest(byte_width=byte_width, type=type_):\n          value = min_value(type_, byte_width)\n          data = encode_type(type_, value)\n          self.assertEqual(flexbuffers.Loads(data), value)\n\n          value = max_value(type_, byte_width)\n          data = encode_type(type_, value)\n          self.assertEqual(flexbuffers.Loads(data), value)\n\n  def test_float(self):\n    for value in 3.141592, 7.62, 999.99:\n      for type_ in Type.FLOAT, Type.INDIRECT_FLOAT:\n        with self.subTest(value=value, type=type_):\n          data = encode_type(type_, value)\n          self.assertEqual(flexbuffers.Loads(data), value)\n\n          data = encode_type(type_, value, 4)\n          self.assertAlmostEqual(flexbuffers.Loads(data), value, places=4)\n\n          data = encode_type(type_, value, 8)\n          self.assertEqual(flexbuffers.Loads(data), value)\n\n  def test_string(self):\n    for value in '', 'x', 'color', 'hello world':\n      with self.subTest(value=value):\n        data = encode_type(Type.STRING, value)\n        self.assertEqual(flexbuffers.Loads(data), value)\n\n  def test_blob(self):\n    for value in bytes(), bytes([240, 12, 143, 7]), bytes(1000 * [17]):\n      with self.subTest(value=value):\n        data = encode_type(Type.BLOB, value)\n        self.assertEqual(flexbuffers.Loads(data), value)\n\n  def test_key(self):\n    for value in '', 'color', 'hello world':\n      with self.subTest(value=value):\n        data = encode_type(Type.KEY, value)\n        self.assertEqual(flexbuffers.Loads(data), value)\n\n    with self.assertRaises(ValueError):\n      encode_type(Type.KEY, (b'\\x00' * 10).decode('ascii'))\n\n  def test_vector(self):\n\n    def encode_vector(elements, element_type):\n      fbb = flexbuffers.Builder()\n      with fbb.Vector():\n        add = fbb.Adder(element_type)\n        for e in elements:\n          add(e)\n      return fbb.Finish()\n\n    def encode_vector_from_elements(elements):\n      fbb = flexbuffers.Builder()\n      fbb.VectorFromElements(elements)\n      return fbb.Finish()\n\n    for elements in [], [1435], [56, 23, 0, 6783]:\n      data = encode_vector(elements, Type.INT)\n      self.assertEqual(flexbuffers.Loads(data), elements)\n\n      data = encode_vector_from_elements(elements)\n      self.assertEqual(flexbuffers.Loads(data), elements)\n\n    # Elements of different type: one by one\n    elements = [56.0, 'flexbuffers', 0, False, 75123]\n\n    fbb = flexbuffers.Builder()\n    with fbb.Vector():\n      fbb.Float(elements[0])\n      fbb.String(elements[1])\n      fbb.UInt(elements[2], 8)\n      fbb.Bool(elements[3])\n      fbb.Int(elements[4])\n    data = fbb.Finish()\n    self.assertEqual(flexbuffers.Loads(data), elements)\n\n    # Elements of different type: all at once\n    fbb = flexbuffers.Builder()\n    fbb.VectorFromElements(elements)\n    data = fbb.Finish()\n    self.assertEqual(flexbuffers.Loads(data), elements)\n\n  def test_nested_vectors(self):\n    fbb = flexbuffers.Builder()\n    with fbb.Vector():\n      fbb.String('begin')\n      fbb.IndirectInt(42)\n      with fbb.Vector():\n        for i in range(5):\n          fbb.Int(i)\n      fbb.String('end')\n    data = fbb.Finish()\n\n    self.assertEqual(\n        flexbuffers.Loads(data), ['begin', 42, [0, 1, 2, 3, 4], 'end']\n    )\n\n  def test_big_vector(self):\n    n = 10 * 1000\n    fbb = flexbuffers.Builder()\n    with fbb.Vector():\n      for i in range(n):\n        fbb.Int(i)\n    self.assertEqual(flexbuffers.Loads(fbb.Finish()), list(range(n)))\n\n  def test_typed_vector(self):\n\n    def encode_typed_vector_from_elements(elements, element_type=None):\n      fbb = flexbuffers.Builder()\n      fbb.TypedVectorFromElements(elements, element_type)\n      return fbb.Finish()\n\n    for elements in [], [False], [True], [False, True, True, False, False]:\n      data = encode_typed_vector_from_elements(elements, Type.BOOL)\n      self.assertEqual(flexbuffers.Loads(data), elements)\n\n      data = encode_typed_vector_from_elements(elements)\n      self.assertEqual(flexbuffers.Loads(data), elements)\n\n    for elements in [], [23455], [351, -2, 0, 6783, 0, -10]:\n      data = encode_typed_vector_from_elements(elements, Type.INT)\n      self.assertEqual(flexbuffers.Loads(data), elements)\n\n      data = encode_typed_vector_from_elements(elements)\n      self.assertEqual(flexbuffers.Loads(data), elements)\n\n    for elements in [], [23455], [351, 2, 0, 6783, 0, 10]:\n      data = encode_typed_vector_from_elements(elements)\n      self.assertEqual(flexbuffers.Loads(data), elements)\n\n      data = encode_typed_vector_from_elements(elements, Type.INT)\n      self.assertEqual(flexbuffers.Loads(data), elements)\n\n      data = encode_typed_vector_from_elements(elements, Type.UINT)\n      self.assertEqual(flexbuffers.Loads(data), elements)\n\n    for elements in [], [7.0], [52.0, 51.2, 70.0, -4.0]:\n      data = encode_typed_vector_from_elements(elements, Type.FLOAT)\n      self.assertEqual(flexbuffers.Loads(data), elements)\n\n      data = encode_typed_vector_from_elements(elements)\n      self.assertEqual(flexbuffers.Loads(data), elements)\n\n    for elements in [], ['color'], ['x', 'y']:\n      data = encode_typed_vector_from_elements(elements, Type.KEY)\n      self.assertEqual(flexbuffers.Loads(data), elements)\n\n      data = encode_typed_vector_from_elements(elements)\n      self.assertEqual(flexbuffers.Loads(data), elements)\n\n  def test_typed_vector_from_array(self):\n\n    def encode_array(typecode, values):\n      fbb = flexbuffers.Builder()\n      fbb.VectorFromElements(array.array(typecode, values))\n      return fbb.Finish()\n\n    values = [1.0, 3.14, -2.54, 0.0]\n    data = encode_array('f', values)\n    for a, b in zip(flexbuffers.Loads(data), values):\n      self.assertAlmostEqual(a, b, places=2)\n\n    values = [1.0, 3.14, -2.54, 0.0]\n    data = encode_array('d', values)\n    self.assertEqual(flexbuffers.Loads(data), values)\n\n    values = [1, -7, 9, 26, 12]\n    data = encode_array('i', values)\n    self.assertEqual(flexbuffers.Loads(data), values)\n\n    values = [0, 1, 2, 3, 4, 5, 6]\n    data = encode_array('I', values)\n    self.assertEqual(flexbuffers.Loads(data), values)\n\n  def test_fixed_typed_vector(self):\n\n    def encode_fixed_typed_vector(elements, element_type=None):\n      fbb = flexbuffers.Builder()\n      fbb.FixedTypedVectorFromElements(elements, element_type)\n      return fbb.Finish()\n\n    for elements in (\n        (-2, 2),\n        (1, 2, 3),\n        (100, -100, 200, -200),\n        (4.0, 7.0),\n        (0.0, 1.0, 8.0),\n        (9.0, 7.0, 1.0, 5.5),\n    ):\n      with self.subTest(elements=elements):\n        data = encode_fixed_typed_vector(elements)\n        self.assertSequenceEqual(flexbuffers.Loads(data), elements)\n\n    elements = [-170, 432, 0, -7]\n    data = encode_fixed_typed_vector(elements, Type.INT)\n    self.assertSequenceEqual(flexbuffers.Loads(data), elements)\n\n    with self.assertRaises(ValueError):\n      encode_fixed_typed_vector([])  # Invalid input length\n\n    with self.assertRaises(ValueError):\n      encode_fixed_typed_vector([1])  # Invalid input length\n\n    with self.assertRaises(ValueError):\n      encode_fixed_typed_vector([1, 2, 3, 4, 5])  # Invalid input length\n\n    with self.assertRaises(TypeError):\n      encode_fixed_typed_vector([1, 1.0])  # Invalid input types\n\n    with self.assertRaises(TypeError):\n      encode_fixed_typed_vector(['', ''])  # Invalid input types\n\n  def test_map_builder(self):\n\n    def get_keys(data):\n      return [key.AsKey for key in flexbuffers.GetRoot(data).AsMap.Keys]\n\n    # Empty map\n    fbb = flexbuffers.Builder()\n    with fbb.Map():\n      pass\n    data = fbb.Finish()\n\n    self.assertEqual(flexbuffers.Loads(data), {})\n\n    # Two-element map of Int\n    fbb = flexbuffers.Builder()\n    with fbb.Map():\n      fbb.Int('y', -2)\n      fbb.Int('x', 10)\n    data = fbb.Finish()\n\n    self.assertEqual(flexbuffers.Loads(data), {'x': 10, 'y': -2})\n\n    # Multiple-element map of vectors\n    fbb = flexbuffers.Builder()\n    with fbb.Map():\n      with fbb.Vector('v'):\n        fbb.Int(45)\n      with fbb.TypedVector('tv'):\n        fbb.Int(-7)\n      fbb.FixedTypedVectorFromElements('ftv', [-2.0, 1.0])\n    data = fbb.Finish()\n\n    self.assertEqual(\n        flexbuffers.Loads(data), {'v': [45], 'tv': [-7], 'ftv': [-2.0, 1.0]}\n    )\n\n    keys = get_keys(data)\n    self.assertEqual(sorted(keys), keys)\n\n    # Multiple-element map of different types\n    fbb = flexbuffers.Builder()\n    with fbb.Map():\n      fbb.Null('n')\n      fbb.Bool('b', False)\n      fbb.Int('i', -27)\n      fbb.UInt('u', 27)\n      fbb.Float('f', -0.85)\n      fbb.String('s', 'String')\n      fbb.Blob('bb', b'data')\n      fbb.IndirectInt('ii', -9500)\n      fbb.IndirectUInt('iu', 540)\n      fbb.IndirectFloat('if', 0.0)\n      fbb.VectorFromElements('v', [2, 1, 0.0])\n      fbb.TypedVectorFromElements('tv', [2, 1, 0])\n      fbb.FixedTypedVectorFromElements('ftv', [2.0, -6.0])\n    data = fbb.Finish()\n\n    self.assertEqual(\n        flexbuffers.Loads(data),\n        {\n            'n': None,\n            'b': False,\n            'i': -27,\n            'u': 27,\n            'f': -0.85,\n            's': 'String',\n            'bb': b'data',\n            'ii': -9500,\n            'iu': 540,\n            'if': 0.0,\n            'v': [2, 1, 0.0],\n            'tv': [2, 1, 0],\n            'ftv': [2.0, -6.0],\n        },\n    )\n\n    keys = get_keys(data)\n    self.assertEqual(sorted(keys), keys)\n\n  def test_map_python(self):\n    maps = [\n        {},\n        {'key': 'value'},\n        {'x': None, 'y': 3400, 'z': -7040},\n        {'zzz': 100, 'aaa': 5.0, 'ccc': ['Test', 32, False, None, True]},\n        {\n            'name': ['John', 'Smith'],\n            'valid': True,\n            'note': None,\n            'address': {\n                'lines': [175, 'Alhambra'],\n                'city': 'San Francisco',\n                'zip': 94123,\n            },\n        },\n    ]\n\n    for m in maps:\n      self.assertEqual(flexbuffers.Loads(flexbuffers.Dumps(m)), m)\n\n  def test_gold_from_file(self):\n    data = read_test_file(GOLD_FLEXBUFFER_FILE)\n    self.assertEqual(flexbuffers.Loads(data), GOLD_FLEXBUFFER_OBJ)\n\n  def test_gold_from_builder(self):\n    fbb = flexbuffers.Builder()\n    with fbb.Map():\n      with fbb.Vector('vec'):\n        fbb.Int(-100)\n        fbb.String('Fred')\n        fbb.IndirectFloat(4.0)\n        i_f = fbb.LastValue\n        fbb.Blob(bytes([77]))\n        fbb.Bool(False)\n        fbb.ReuseValue(i_f)\n\n      vec = [1, 2, 3]\n      fbb.VectorFromElements('bar', vec)\n      fbb.FixedTypedVectorFromElements('bar3', [1, 2, 3])\n      fbb.VectorFromElements('bools', [True, False, True, False])\n      fbb.Bool('bool', True)\n      fbb.Float('foo', 100)\n      with fbb.Map('mymap'):\n        fbb.String('foo', 'Fred')\n    data = fbb.Finish()\n\n    self.assertEqual(flexbuffers.Loads(data), GOLD_FLEXBUFFER_OBJ)\n\n  def test_min_bit_width(self):\n    fbb = flexbuffers.Builder(force_min_bit_width=flexbuffers.BitWidth.W8)\n    fbb.TypedVectorFromElements([0, 1, 0, 1, 0])\n    data = fbb.Finish()\n\n    root = flexbuffers.GetRoot(data)\n    self.assertTrue(root.IsTypedVector)\n    self.assertEqual(root.AsTypedVector.ByteWidth, 1)\n\n    fbb = flexbuffers.Builder(force_min_bit_width=flexbuffers.BitWidth.W32)\n    fbb.TypedVectorFromElements([0, 1, 0, 1, 0])\n    data = fbb.Finish()\n\n    root = flexbuffers.GetRoot(data)\n    self.assertTrue(root.IsTypedVector)\n    self.assertEqual(root.AsTypedVector.ByteWidth, 4)\n\n  def test_share_keys(self):\n\n    def encode_key_vector(value, count, share_keys):\n      fbb = flexbuffers.Builder(share_keys=share_keys)\n      with fbb.Vector():\n        for _ in range(count):\n          fbb.Key(value)\n      return fbb.Finish(), fbb.KeyPool.Elements\n\n    data, pool = encode_key_vector('test', 10, share_keys=False)\n    self.assertEqual(len(pool), 0)\n    self.assertEqual(len(data), 74)\n    self.assertEqual(flexbuffers.Loads(data), 10 * ['test'])\n\n    data, pool = encode_key_vector('test', 10, share_keys=True)\n    self.assertEqual(len(pool), 1)\n    self.assertEqual(pool[0], 'test'.encode('ascii'))\n    self.assertEqual(len(data), 29)\n    self.assertEqual(flexbuffers.Loads(data), 10 * ['test'])\n\n  def test_share_strings(self):\n\n    def encode_string_vector(value, count, share_strings):\n      fbb = flexbuffers.Builder(share_strings=share_strings)\n      with fbb.Vector():\n        for _ in range(count):\n          fbb.String(value)\n      return fbb.Finish(), fbb.StringPool.Elements\n\n    data, pool = encode_string_vector('test', 10, share_strings=False)\n    self.assertEqual(len(pool), 0)\n    self.assertEqual(len(data), 84)\n    self.assertEqual(flexbuffers.Loads(data), 10 * ['test'])\n\n    data, pool = encode_string_vector('test', 10, share_strings=True)\n    self.assertEqual(len(pool), 1)\n    self.assertEqual(pool[0], 'test'.encode('utf-8'))\n    self.assertEqual(len(data), 30)\n    self.assertEqual(flexbuffers.Loads(data), 10 * ['test'])\n\n  def test_invalid_stack_size(self):\n    fbb = flexbuffers.Builder()\n\n    with self.assertRaises(RuntimeError):\n      fbb.Finish()\n\n    fbb.Int(100)\n    fbb.Int(200)\n    with self.assertRaises(RuntimeError):\n      fbb.Finish()\n\n    fbb.Clear()\n    fbb.Int(420)\n    fbb.Finish()\n\n\nif __name__ == '__main__':\n  unittest.main()\n"
  },
  {
    "path": "tests/py_test.py",
    "content": "# coding=utf-8\n# Copyright 2014 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nimport os.path\nimport sys\n\nPY_VERSION = sys.version_info[:2]\n\nimport ctypes\nfrom collections import defaultdict\nimport math\nimport random\nimport timeit\nimport unittest\n\nfrom flatbuffers import compat\nfrom flatbuffers import util\nfrom flatbuffers.compat import range_func as compat_range\nfrom flatbuffers.compat import NumpyRequiredForThisFeature\n\nimport flatbuffers\nfrom flatbuffers import number_types as N\n\nimport MyGame  # refers to generated code\nimport MyGame.Example  # refers to generated code\nimport MyGame.Example.Any  # refers to generated code\nimport MyGame.Example.Color  # refers to generated code\nimport MyGame.Example.Monster  # refers to generated code\nimport MyGame.Example.Test  # refers to generated code\nimport MyGame.Example.Stat  # refers to generated code\nimport MyGame.Example.Vec3  # refers to generated code\nimport MyGame.MonsterExtra  # refers to generated code\nimport MyGame.InParentNamespace  # refers to generated code\nimport MyGame.Example.ArrayTable  # refers to generated code\nimport MyGame.Example.ArrayStruct  # refers to generated code\nimport MyGame.Example.NestedStruct  # refers to generated code\nimport MyGame.Example.TestEnum  # refers to generated code\nimport MyGame.Example.NestedUnion.NestedUnionTest  # refers to generated code\nimport MyGame.Example.NestedUnion.Vec3  # refers to generated code\nimport MyGame.Example.NestedUnion.Any  # refers to generated code\nimport MyGame.Example.NestedUnion.Test  # refers to generated code\nimport MyGame.Example.NestedUnion.Color  # refers to generated code\nimport monster_test_generated  # the one-file version\nimport optional_scalars\nimport optional_scalars.ScalarStuff\nimport union_name_test.Container  # refers to generated code\nimport union_name_test.Foo  # refers to generated code\nimport union_name_test.Bar  # refers to generated code\nimport union_name_test.my_test_union  # refers to generated code\n\n\ndef create_namespace_shortcut(is_onefile):\n  # Create shortcut from either the one-file format or the multi-file format\n  global _ANY\n  global _COLOR\n  global _MONSTER\n  global _TEST\n  global _STAT\n  global _VEC3\n  global _IN_PARENT_NAMESPACE\n  if is_onefile:\n    print('Testing with the one-file generated code')\n    _ANY = monster_test_generated\n    _COLOR = monster_test_generated\n    _MONSTER = monster_test_generated\n    _TEST = monster_test_generated\n    _STAT = monster_test_generated\n    _VEC3 = monster_test_generated\n    _IN_PARENT_NAMESPACE = monster_test_generated\n  else:\n    print('Testing with multi-file generated code')\n    _ANY = MyGame.Example.Any\n    _COLOR = MyGame.Example.Color\n    _MONSTER = MyGame.Example.Monster\n    _TEST = MyGame.Example.Test\n    _STAT = MyGame.Example.Stat\n    _VEC3 = MyGame.Example.Vec3\n    _IN_PARENT_NAMESPACE = MyGame.InParentNamespace\n\n\ndef assertRaises(test_case, fn, exception_class):\n  \"\"\"Backwards-compatible assertion for exceptions raised.\"\"\"\n\n  exc = None\n  try:\n    fn()\n  except Exception as e:\n    exc = e\n  test_case.assertTrue(exc is not None)\n  test_case.assertTrue(isinstance(exc, exception_class))\n\n\ndef byte_swap_array(np_version, arr):\n  \"\"\"Performs byte swapping on a NumPy array, adapting to different NumPy versions.\n\n  Args:\n      np_version: Version of NumPu (np.__version__)\n      arr: The input NumPy array.\n\n  Returns:\n      A new NumPy array with byte order swapped.\n  \"\"\"\n  numpy_version_tuple = tuple(map(int, np_version.split('.')[:3]))\n  min_version_for_new_method_tuple = (2, 0, 0)\n\n  if numpy_version_tuple >= min_version_for_new_method_tuple:\n    # 'S' indicates swap byte order.\n    return arr.byteswap().view(arr.dtype.newbyteorder('S'))\n  else:\n    return arr.byteswap().newbyteorder()\n\n\nclass TestWireFormat(unittest.TestCase):\n\n  def test_wire_format(self):\n    # Verify that using the generated Python code builds a buffer without\n    # returning errors, and is interpreted correctly, for size prefixed\n    # representation and regular:\n    for sizePrefix in [True, False]:\n      for file_identifier in [None, b'MONS']:\n        gen_buf, gen_off = make_monster_from_generated_code(\n            sizePrefix=sizePrefix, file_identifier=file_identifier\n        )\n        CheckReadBuffer(\n            gen_buf,\n            gen_off,\n            sizePrefix=sizePrefix,\n            file_identifier=file_identifier,\n        )\n\n    # Verify that the canonical flatbuffer file is readable by the\n    # generated Python code. Note that context managers are not part of\n    # Python 2.5, so we use the simpler open/close methods here:\n    f = open('monsterdata_test.mon', 'rb')\n    canonicalWireData = f.read()\n    f.close()\n    CheckReadBuffer(bytearray(canonicalWireData), 0, file_identifier=b'MONS')\n\n    # Write the generated buffer out to a file:\n    f = open('monsterdata_python_wire.mon', 'wb')\n    f.write(gen_buf[gen_off:])\n    f.close()\n\n\nclass TestObjectBasedAPI(unittest.TestCase):\n  \"\"\"Tests the generated object based API.\"\"\"\n\n  def test_consistency_with_repeated_pack_and_unpack(self):\n    \"\"\"Checks the serialization and deserialization between a buffer and\n\n    its python object. It tests in the same way as the C++ object API test,\n    ObjectFlatBuffersTest in test.cpp.\n    \"\"\"\n\n    buf, off = make_monster_from_generated_code()\n\n    # Turns a buffer into Python object (T class).\n    monster1 = _MONSTER.Monster.GetRootAs(buf, off)\n    monsterT1 = _MONSTER.MonsterT.InitFromObj(monster1)\n\n    for sizePrefix in [True, False]:\n      # Re-serialize the data into a buffer.\n      b1 = flatbuffers.Builder(0)\n      if sizePrefix:\n        b1.FinishSizePrefixed(monsterT1.Pack(b1))\n      else:\n        b1.Finish(monsterT1.Pack(b1))\n      CheckReadBuffer(b1.Bytes, b1.Head(), sizePrefix)\n\n    # Deserializes the buffer into Python object again.\n    monster2 = _MONSTER.Monster.GetRootAs(b1.Bytes, b1.Head())\n    # Re-serializes the data into a buffer for one more time.\n    monsterT2 = _MONSTER.MonsterT.InitFromObj(monster2)\n    for sizePrefix in [True, False]:\n      # Re-serializes the data into a buffer\n      b2 = flatbuffers.Builder(0)\n      if sizePrefix:\n        b2.FinishSizePrefixed(monsterT2.Pack(b2))\n      else:\n        b2.Finish(monsterT2.Pack(b2))\n      CheckReadBuffer(b2.Bytes, b2.Head(), sizePrefix)\n\n  def test_default_values_with_pack_and_unpack(self):\n    \"\"\"Serializes and deserializes between a buffer with default values (no\n\n    specific values are filled when the buffer is created) and its python\n    object.\n    \"\"\"\n    # Creates a flatbuffer with default values.\n    b1 = flatbuffers.Builder(0)\n    _MONSTER.MonsterStart(b1)\n    gen_mon = _MONSTER.MonsterEnd(b1)\n    b1.Finish(gen_mon)\n\n    # Converts the flatbuffer into the object class.\n    monster1 = _MONSTER.Monster.GetRootAs(b1.Bytes, b1.Head())\n    monsterT1 = _MONSTER.MonsterT.InitFromObj(monster1)\n\n    # Packs the object class into another flatbuffer.\n    b2 = flatbuffers.Builder(0)\n    b2.Finish(monsterT1.Pack(b2))\n    monster2 = _MONSTER.Monster.GetRootAs(b2.Bytes, b2.Head())\n    # Checks the default values.\n    self.assertTrue(monster2.Pos() is None)\n    self.assertEqual(monster2.Mana(), 150)\n    self.assertEqual(monster2.Hp(), 100)\n    self.assertTrue(monster2.Name() is None)\n    self.assertEqual(monster2.Inventory(0), 0)\n    self.assertEqual(monster2.InventoryAsNumpy(), 0)\n    self.assertEqual(monster2.InventoryLength(), 0)\n    self.assertTrue(monster2.InventoryIsNone())\n    self.assertEqual(monster2.Color(), 8)\n    self.assertEqual(monster2.TestType(), 0)\n    self.assertTrue(monster2.Test() is None)\n    self.assertTrue(monster2.Test4(0) is None)\n    self.assertEqual(monster2.Test4Length(), 0)\n    self.assertTrue(monster2.Test4IsNone())\n    self.assertEqual(monster2.Testarrayofstring(0), '')\n    self.assertEqual(monster2.TestarrayofstringLength(), 0)\n    self.assertTrue(monster2.TestarrayofstringIsNone())\n    self.assertTrue(monster2.Testarrayoftables(0) is None)\n    self.assertEqual(monster2.TestarrayoftablesLength(), 0)\n    self.assertTrue(monster2.TestarrayoftablesIsNone())\n    self.assertTrue(monster2.Enemy() is None)\n    self.assertEqual(monster2.Testnestedflatbuffer(0), 0)\n    self.assertEqual(monster2.TestnestedflatbufferAsNumpy(), 0)\n    self.assertEqual(monster2.TestnestedflatbufferLength(), 0)\n    self.assertTrue(monster2.TestnestedflatbufferIsNone())\n    self.assertTrue(monster2.Testempty() is None)\n    self.assertFalse(monster2.Testbool())\n    self.assertEqual(monster2.Testhashs32Fnv1(), 0)\n    self.assertEqual(monster2.Testhashu32Fnv1(), 0)\n    self.assertEqual(monster2.Testhashs64Fnv1(), 0)\n    self.assertEqual(monster2.Testhashu64Fnv1(), 0)\n    self.assertEqual(monster2.Testhashs32Fnv1a(), 0)\n    self.assertEqual(monster2.Testhashu32Fnv1a(), 0)\n    self.assertEqual(monster2.Testhashs64Fnv1a(), 0)\n    self.assertEqual(monster2.Testhashu64Fnv1a(), 0)\n    self.assertEqual(monster2.Testarrayofbools(0), 0)\n    self.assertEqual(monster2.TestarrayofboolsAsNumpy(), 0)\n    self.assertEqual(monster2.TestarrayofboolsLength(), 0)\n    self.assertTrue(monster2.TestarrayofboolsIsNone())\n    self.assertEqual(monster2.Testf(), 3.14159)\n    self.assertEqual(monster2.Testf2(), 3.0)\n    self.assertEqual(monster2.Testf3(), 0.0)\n    self.assertEqual(monster2.Testarrayofstring2(0), '')\n    self.assertEqual(monster2.Testarrayofstring2Length(), 0)\n    self.assertTrue(monster2.Testarrayofstring2IsNone())\n    self.assertTrue(monster2.Testarrayofsortedstruct(0) is None)\n    self.assertEqual(monster2.TestarrayofsortedstructLength(), 0)\n    self.assertTrue(monster2.TestarrayofsortedstructIsNone())\n    self.assertEqual(monster2.Flex(0), 0)\n    self.assertEqual(monster2.FlexAsNumpy(), 0)\n    self.assertEqual(monster2.FlexLength(), 0)\n    self.assertTrue(monster2.FlexIsNone())\n    self.assertTrue(monster2.Test5(0) is None)\n    self.assertEqual(monster2.Test5Length(), 0)\n    self.assertTrue(monster2.Test5IsNone())\n    self.assertEqual(monster2.VectorOfLongs(0), 0)\n    self.assertEqual(monster2.VectorOfLongsAsNumpy(), 0)\n    self.assertEqual(monster2.VectorOfLongsLength(), 0)\n    self.assertTrue(monster2.VectorOfLongsIsNone())\n    self.assertEqual(monster2.VectorOfDoubles(0), 0)\n    self.assertEqual(monster2.VectorOfDoublesAsNumpy(), 0)\n    self.assertEqual(monster2.VectorOfDoublesLength(), 0)\n    self.assertTrue(monster2.VectorOfDoublesIsNone())\n    self.assertTrue(monster2.ParentNamespaceTest() is None)\n    self.assertTrue(monster2.VectorOfReferrables(0) is None)\n    self.assertEqual(monster2.VectorOfReferrablesLength(), 0)\n    self.assertTrue(monster2.VectorOfReferrablesIsNone())\n    self.assertEqual(monster2.SingleWeakReference(), 0)\n    self.assertEqual(monster2.VectorOfWeakReferences(0), 0)\n    self.assertEqual(monster2.VectorOfWeakReferencesAsNumpy(), 0)\n    self.assertEqual(monster2.VectorOfWeakReferencesLength(), 0)\n    self.assertTrue(monster2.VectorOfWeakReferencesIsNone())\n    self.assertTrue(monster2.VectorOfStrongReferrables(0) is None)\n    self.assertEqual(monster2.VectorOfStrongReferrablesLength(), 0)\n    self.assertTrue(monster2.VectorOfStrongReferrablesIsNone())\n    self.assertEqual(monster2.CoOwningReference(), 0)\n    self.assertEqual(monster2.VectorOfCoOwningReferences(0), 0)\n    self.assertEqual(monster2.VectorOfCoOwningReferencesAsNumpy(), 0)\n    self.assertEqual(monster2.VectorOfCoOwningReferencesLength(), 0)\n    self.assertTrue(monster2.VectorOfCoOwningReferencesIsNone())\n    self.assertEqual(monster2.NonOwningReference(), 0)\n    self.assertEqual(monster2.VectorOfNonOwningReferences(0), 0)\n    self.assertEqual(monster2.VectorOfNonOwningReferencesAsNumpy(), 0)\n    self.assertEqual(monster2.VectorOfNonOwningReferencesLength(), 0)\n    self.assertTrue(monster2.VectorOfNonOwningReferencesIsNone())\n    self.assertEqual(monster2.AnyUniqueType(), 0)\n    self.assertTrue(monster2.AnyUnique() is None)\n    self.assertEqual(monster2.AnyAmbiguousType(), 0)\n    self.assertTrue(monster2.AnyAmbiguous() is None)\n    self.assertEqual(monster2.VectorOfEnums(0), 0)\n    self.assertEqual(monster2.VectorOfEnumsAsNumpy(), 0)\n    self.assertEqual(monster2.VectorOfEnumsLength(), 0)\n    self.assertTrue(monster2.VectorOfEnumsIsNone())\n\n  def test_optional_scalars_with_pack_and_unpack(self):\n    \"\"\"Serializes and deserializes between a buffer with optional values (no\n\n    specific values are filled when the buffer is created) and its python\n    object.\n    \"\"\"\n    # Creates a flatbuffer with optional values.\n    b1 = flatbuffers.Builder(0)\n    optional_scalars.ScalarStuff.ScalarStuffStart(b1)\n    gen_opt = optional_scalars.ScalarStuff.ScalarStuffEnd(b1)\n    b1.Finish(gen_opt)\n\n    # Converts the flatbuffer into the object class.\n    opts1 = optional_scalars.ScalarStuff.ScalarStuff.GetRootAs(\n        b1.Bytes, b1.Head()\n    )\n    optsT1 = optional_scalars.ScalarStuff.ScalarStuffT.InitFromObj(opts1)\n\n    # Packs the object class into another flatbuffer.\n    b2 = flatbuffers.Builder(0)\n    b2.Finish(optsT1.Pack(b2))\n    opts2 = optional_scalars.ScalarStuff.ScalarStuff.GetRootAs(\n        b2.Bytes, b2.Head()\n    )\n    optsT2 = optional_scalars.ScalarStuff.ScalarStuffT.InitFromObj(opts2)\n    # Checks the default values.\n    self.assertTrue(opts2.JustI8() == 0)\n    self.assertTrue(opts2.MaybeF32() is None)\n    self.assertTrue(opts2.DefaultBool() is True)\n    self.assertTrue(optsT2.justU16 == 0)\n    self.assertTrue(optsT2.maybeEnum is None)\n    self.assertTrue(optsT2.defaultU64 == 42)\n\n\nclass TestAllMutableCodePathsOfExampleSchema(unittest.TestCase):\n  \"\"\"Tests the object API generated for monster_test.fbs for mutation\n\n  purposes. In each test, the default values will be changed through the\n  object API. We'll then pack the object class into the buf class and read\n  the updated values out from it to validate if the values are mutated as\n  expected.\n  \"\"\"\n\n  def setUp(self, *args, **kwargs):\n    super(TestAllMutableCodePathsOfExampleSchema, self).setUp(*args, **kwargs)\n    # Creates an empty monster flatbuffer, and loads it into the object\n    # class for future tests.\n    b = flatbuffers.Builder(0)\n    _MONSTER.MonsterStart(b)\n    self.monsterT = self._create_and_load_object_class(b)\n\n  def _pack_and_load_buf_class(self, monsterT):\n    \"\"\"Packs the object class into a flatbuffer and loads it into a buf\n\n    class.\n    \"\"\"\n    b = flatbuffers.Builder(0)\n    b.Finish(monsterT.Pack(b))\n    monster = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())\n    return monster\n\n  def _create_and_load_object_class(self, b):\n    \"\"\"Finishs the creation of a monster flatbuffer and loads it into an\n\n    object class.\n    \"\"\"\n    gen_mon = _MONSTER.MonsterEnd(b)\n    b.Finish(gen_mon)\n    monster = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())\n    monsterT = _MONSTER.MonsterT()\n    monsterT.InitFromObj(monster)\n    return monsterT\n\n  def test_mutate_pos(self):\n    posT = _VEC3.Vec3T()\n    posT.x = 4.0\n    posT.y = 5.0\n    posT.z = 6.0\n    posT.test1 = 6.0\n    posT.test2 = 7\n    test3T = _TEST.TestT()\n    test3T.a = 8\n    test3T.b = 9\n    posT.test3 = test3T\n    self.monsterT.pos = posT\n\n    # Packs the updated values.\n    monster = self._pack_and_load_buf_class(self.monsterT)\n\n    # Checks if values are loaded correctly into the object class.\n    pos = monster.Pos()\n\n    # Verifies the properties of the Vec3.\n    self.assertEqual(pos.X(), 4.0)\n    self.assertEqual(pos.Y(), 5.0)\n    self.assertEqual(pos.Z(), 6.0)\n    self.assertEqual(pos.Test1(), 6.0)\n    self.assertEqual(pos.Test2(), 7)\n    t3 = _TEST.Test()\n    t3 = pos.Test3(t3)\n    self.assertEqual(t3.A(), 8)\n    self.assertEqual(t3.B(), 9)\n\n  def test_mutate_mana(self):\n    self.monsterT.mana = 200\n    monster = self._pack_and_load_buf_class(self.monsterT)\n    self.assertEqual(monster.Mana(), 200)\n\n  def test_mutate_hp(self):\n    self.monsterT.hp = 200\n    monster = self._pack_and_load_buf_class(self.monsterT)\n    self.assertEqual(monster.Hp(), 200)\n\n  def test_mutate_name(self):\n    self.monsterT.name = 'MyMonster'\n    monster = self._pack_and_load_buf_class(self.monsterT)\n    self.assertEqual(monster.Name(), b'MyMonster')\n\n  def test_mutate_inventory(self):\n    self.monsterT.inventory = [1, 7, 8]\n    monster = self._pack_and_load_buf_class(self.monsterT)\n    self.assertEqual(monster.Inventory(0), 1)\n    self.assertEqual(monster.Inventory(1), 7)\n    self.assertEqual(monster.Inventory(2), 8)\n\n  def test_empty_inventory(self):\n    self.monsterT.inventory = []\n    monster = self._pack_and_load_buf_class(self.monsterT)\n    self.assertFalse(monster.InventoryIsNone())\n\n  def test_mutate_color(self):\n    self.monsterT.color = _COLOR.Color.Red\n    monster = self._pack_and_load_buf_class(self.monsterT)\n    self.assertEqual(monster.Color(), _COLOR.Color.Red)\n\n  def test_mutate_testtype(self):\n    self.monsterT.testType = _ANY.Any.Monster\n    monster = self._pack_and_load_buf_class(self.monsterT)\n    self.assertEqual(monster.TestType(), _ANY.Any.Monster)\n\n  def test_mutate_test(self):\n    testT = _MONSTER.MonsterT()\n    testT.hp = 200\n    self.monsterT.test = testT\n    monster = self._pack_and_load_buf_class(self.monsterT)\n    # Initializes a Table from a union field Test(...).\n    table = monster.Test()\n\n    # Initializes a Monster from the Table from the union.\n    test_monster = _MONSTER.Monster()\n    test_monster.Init(table.Bytes, table.Pos)\n    self.assertEqual(test_monster.Hp(), 200)\n\n  def test_mutate_test4(self):\n    test0T = _TEST.TestT()\n    test0T.a = 10\n    test0T.b = 20\n    test1T = _TEST.TestT()\n    test1T.a = 30\n    test1T.b = 40\n    self.monsterT.test4 = [test0T, test1T]\n\n    monster = self._pack_and_load_buf_class(self.monsterT)\n    test0 = monster.Test4(0)\n    self.assertEqual(test0.A(), 10)\n    self.assertEqual(test0.B(), 20)\n    test1 = monster.Test4(1)\n    self.assertEqual(test1.A(), 30)\n    self.assertEqual(test1.B(), 40)\n\n  def test_empty_test4(self):\n    self.monsterT.test4 = []\n    monster = self._pack_and_load_buf_class(self.monsterT)\n    self.assertFalse(monster.Test4IsNone())\n\n  def test_mutate_testarrayofstring(self):\n    self.monsterT.testarrayofstring = []\n    self.monsterT.testarrayofstring.append('test1')\n    self.monsterT.testarrayofstring.append('test2')\n    monster = self._pack_and_load_buf_class(self.monsterT)\n    self.assertEqual(monster.Testarrayofstring(0), b'test1')\n    self.assertEqual(monster.Testarrayofstring(1), b'test2')\n\n  def test_empty_testarrayofstring(self):\n    self.monsterT.testarrayofstring = []\n    monster = self._pack_and_load_buf_class(self.monsterT)\n    self.assertFalse(monster.TestarrayofstringIsNone())\n\n  def test_mutate_testarrayoftables(self):\n    monsterT0 = _MONSTER.MonsterT()\n    monsterT0.hp = 200\n    monsterT1 = _MONSTER.MonsterT()\n    monsterT1.hp = 400\n    self.monsterT.testarrayoftables = []\n    self.monsterT.testarrayoftables.append(monsterT0)\n    self.monsterT.testarrayoftables.append(monsterT1)\n    monster = self._pack_and_load_buf_class(self.monsterT)\n    self.assertEqual(monster.Testarrayoftables(0).Hp(), 200)\n    self.assertEqual(monster.Testarrayoftables(1).Hp(), 400)\n\n  def test_empty_testarrayoftables(self):\n    self.monsterT.testarrayoftables = []\n    monster = self._pack_and_load_buf_class(self.monsterT)\n    self.assertFalse(monster.TestarrayoftablesIsNone())\n\n  def test_mutate_enemy(self):\n    monsterT = _MONSTER.MonsterT()\n    monsterT.hp = 200\n    self.monsterT.enemy = monsterT\n    monster = self._pack_and_load_buf_class(self.monsterT)\n    self.assertEqual(monster.Enemy().Hp(), 200)\n\n  def test_mutate_testnestedflatbuffer(self):\n    self.monsterT.testnestedflatbuffer = [8, 2, 4]\n    monster = self._pack_and_load_buf_class(self.monsterT)\n    self.assertEqual(monster.Testnestedflatbuffer(0), 8)\n    self.assertEqual(monster.Testnestedflatbuffer(1), 2)\n    self.assertEqual(monster.Testnestedflatbuffer(2), 4)\n\n  def test_empty_testnestedflatbuffer(self):\n    self.monsterT.testnestedflatbuffer = []\n    monster = self._pack_and_load_buf_class(self.monsterT)\n    self.assertFalse(monster.TestnestedflatbufferIsNone())\n\n  def test_mutate_testbool(self):\n    self.monsterT.testbool = True\n    monster = self._pack_and_load_buf_class(self.monsterT)\n    self.assertTrue(monster.Testbool())\n\n  def test_mutate_testhashes(self):\n    self.monsterT.testhashs32Fnv1 = 1\n    self.monsterT.testhashu32Fnv1 = 2\n    self.monsterT.testhashs64Fnv1 = 3\n    self.monsterT.testhashu64Fnv1 = 4\n    self.monsterT.testhashs32Fnv1a = 5\n    self.monsterT.testhashu32Fnv1a = 6\n    self.monsterT.testhashs64Fnv1a = 7\n    self.monsterT.testhashu64Fnv1a = 8\n    monster = self._pack_and_load_buf_class(self.monsterT)\n    self.assertEqual(monster.Testhashs32Fnv1(), 1)\n    self.assertEqual(monster.Testhashu32Fnv1(), 2)\n    self.assertEqual(monster.Testhashs64Fnv1(), 3)\n    self.assertEqual(monster.Testhashu64Fnv1(), 4)\n    self.assertEqual(monster.Testhashs32Fnv1a(), 5)\n    self.assertEqual(monster.Testhashu32Fnv1a(), 6)\n    self.assertEqual(monster.Testhashs64Fnv1a(), 7)\n    self.assertEqual(monster.Testhashu64Fnv1a(), 8)\n\n  def test_mutate_testarrayofbools(self):\n    self.monsterT.testarrayofbools = []\n    self.monsterT.testarrayofbools.append(True)\n    self.monsterT.testarrayofbools.append(True)\n    self.monsterT.testarrayofbools.append(False)\n    monster = self._pack_and_load_buf_class(self.monsterT)\n    self.assertEqual(monster.Testarrayofbools(0), True)\n    self.assertEqual(monster.Testarrayofbools(1), True)\n    self.assertEqual(monster.Testarrayofbools(2), False)\n\n  def test_empty_testarrayofbools(self):\n    self.monsterT.testarrayofbools = []\n    monster = self._pack_and_load_buf_class(self.monsterT)\n    self.assertFalse(monster.TestarrayofboolsIsNone())\n\n  def test_mutate_testf(self):\n    self.monsterT.testf = 2.0\n    monster = self._pack_and_load_buf_class(self.monsterT)\n    self.assertEqual(monster.Testf(), 2.0)\n\n  def test_mutate_vectoroflongs(self):\n    self.monsterT.vectorOfLongs = []\n    self.monsterT.vectorOfLongs.append(1)\n    self.monsterT.vectorOfLongs.append(100)\n    self.monsterT.vectorOfLongs.append(10000)\n    self.monsterT.vectorOfLongs.append(1000000)\n    self.monsterT.vectorOfLongs.append(100000000)\n    monster = self._pack_and_load_buf_class(self.monsterT)\n    self.assertEqual(monster.VectorOfLongs(0), 1)\n    self.assertEqual(monster.VectorOfLongs(1), 100)\n    self.assertEqual(monster.VectorOfLongs(2), 10000)\n    self.assertEqual(monster.VectorOfLongs(3), 1000000)\n    self.assertEqual(monster.VectorOfLongs(4), 100000000)\n\n  def test_empty_vectoroflongs(self):\n    self.monsterT.vectorOfLongs = []\n    monster = self._pack_and_load_buf_class(self.monsterT)\n    self.assertFalse(monster.VectorOfLongsIsNone())\n\n  def test_mutate_vectorofdoubles(self):\n    self.monsterT.vectorOfDoubles = []\n    self.monsterT.vectorOfDoubles.append(-1.7976931348623157e308)\n    self.monsterT.vectorOfDoubles.append(0)\n    self.monsterT.vectorOfDoubles.append(1.7976931348623157e308)\n    monster = self._pack_and_load_buf_class(self.monsterT)\n    self.assertEqual(monster.VectorOfDoubles(0), -1.7976931348623157e308)\n    self.assertEqual(monster.VectorOfDoubles(1), 0)\n    self.assertEqual(monster.VectorOfDoubles(2), 1.7976931348623157e308)\n\n  def test_empty_vectorofdoubles(self):\n    self.monsterT.vectorOfDoubles = []\n    monster = self._pack_and_load_buf_class(self.monsterT)\n    self.assertFalse(monster.VectorOfDoublesIsNone())\n\n  def test_mutate_parentnamespacetest(self):\n    self.monsterT.parentNamespaceTest = (\n        _IN_PARENT_NAMESPACE.InParentNamespaceT()\n    )\n    monster = self._pack_and_load_buf_class(self.monsterT)\n    self.assertTrue(\n        isinstance(\n            monster.ParentNamespaceTest(),\n            _IN_PARENT_NAMESPACE.InParentNamespace,\n        )\n    )\n\n  def test_mutate_vectorofEnums(self):\n    self.monsterT.vectorOfEnums = []\n    self.monsterT.vectorOfEnums.append(_COLOR.Color.Red)\n    self.monsterT.vectorOfEnums.append(_COLOR.Color.Blue)\n    self.monsterT.vectorOfEnums.append(_COLOR.Color.Red)\n    monster = self._pack_and_load_buf_class(self.monsterT)\n    self.assertEqual(monster.VectorOfEnums(0), _COLOR.Color.Red)\n    self.assertEqual(monster.VectorOfEnums(1), _COLOR.Color.Blue)\n    self.assertEqual(monster.VectorOfEnums(2), _COLOR.Color.Red)\n\n  def test_empty_vectorofEnums(self):\n    self.monsterT.vectorOfEnums = []\n    monster = self._pack_and_load_buf_class(self.monsterT)\n    self.assertFalse(monster.VectorOfEnumsIsNone())\n\n\ndef CheckReadBuffer(buf, offset, sizePrefix=False, file_identifier=None):\n  \"\"\"CheckReadBuffer checks that the given buffer is evaluated correctly\n\n  as the example Monster.\n  \"\"\"\n\n  def asserter(stmt):\n    \"\"\"An assertion helper that is separated from TestCase classes.\"\"\"\n    if not stmt:\n      raise AssertionError('CheckReadBuffer case failed')\n\n  if file_identifier:\n    # test prior to removal of size_prefix\n    asserter(\n        util.GetBufferIdentifier(buf, offset, size_prefixed=sizePrefix)\n        == file_identifier\n    )\n    asserter(\n        util.BufferHasIdentifier(\n            buf,\n            offset,\n            file_identifier=file_identifier,\n            size_prefixed=sizePrefix,\n        )\n    )\n    asserter(\n        _MONSTER.Monster.MonsterBufferHasIdentifier(\n            buf, offset, size_prefixed=sizePrefix\n        )\n    )\n  if sizePrefix:\n    size = util.GetSizePrefix(buf, offset)\n    asserter(size == len(buf[offset:]) - 4)\n    buf, offset = util.RemoveSizePrefix(buf, offset)\n  if file_identifier:\n    asserter(_MONSTER.Monster.MonsterBufferHasIdentifier(buf, offset))\n  else:\n    asserter(not _MONSTER.Monster.MonsterBufferHasIdentifier(buf, offset))\n  monster = _MONSTER.Monster.GetRootAs(buf, offset)\n\n  asserter(monster.Hp() == 80)\n  asserter(monster.Mana() == 150)\n  asserter(monster.Name() == b'MyMonster')\n\n  # initialize a Vec3 from Pos()\n  vec = monster.Pos()\n  asserter(vec is not None)\n\n  # verify the properties of the Vec3\n  asserter(vec.X() == 1.0)\n  asserter(vec.Y() == 2.0)\n  asserter(vec.Z() == 3.0)\n  asserter(vec.Test1() == 3.0)\n  asserter(vec.Test2() == 2)\n\n  # initialize a Test from Test3(...)\n  t = _TEST.Test()\n  t = vec.Test3(t)\n  asserter(t is not None)\n\n  # verify the properties of the Test\n  asserter(t.A() == 5)\n  asserter(t.B() == 6)\n\n  # verify that the enum code matches the enum declaration:\n  union_type = _ANY.Any\n  asserter(monster.TestType() == union_type.Monster)\n\n  # initialize a Table from a union field Test(...)\n  table2 = monster.Test()\n  asserter(type(table2) is flatbuffers.table.Table)\n\n  # initialize a Monster from the Table from the union\n  monster2 = _MONSTER.Monster()\n  monster2.Init(table2.Bytes, table2.Pos)\n\n  asserter(monster2.Name() == b'Fred')\n\n  # iterate through the first monster's inventory:\n  asserter(monster.InventoryLength() == 5)\n  asserter(not monster.InventoryIsNone())\n\n  invsum = 0\n  for i in compat_range(monster.InventoryLength()):\n    v = monster.Inventory(i)\n    invsum += int(v)\n  asserter(invsum == 10)\n\n  for i in range(5):\n    asserter(monster.VectorOfLongs(i) == 10 ** (i * 2))\n\n  asserter(not monster.VectorOfDoublesIsNone())\n  asserter((\n      [-1.7976931348623157e308, 0, 1.7976931348623157e308]\n      == [\n          monster.VectorOfDoubles(i)\n          for i in range(monster.VectorOfDoublesLength())\n      ]\n  ))\n\n  try:\n    # if numpy exists, then we should be able to get the\n    # vector as a numpy array\n    import numpy as np\n\n    asserter(monster.InventoryAsNumpy().sum() == 10)\n    asserter(monster.InventoryAsNumpy().dtype == np.dtype('<u1'))\n\n    VectorOfLongs = monster.VectorOfLongsAsNumpy()\n    asserter(VectorOfLongs.dtype == np.dtype('<i8'))\n    for i in range(5):\n      asserter(VectorOfLongs[i] == 10 ** (i * 2))\n\n    VectorOfDoubles = monster.VectorOfDoublesAsNumpy()\n    asserter(VectorOfDoubles.dtype == np.dtype('<f8'))\n    asserter(VectorOfDoubles[0] == np.finfo('<f8').min)\n    asserter(VectorOfDoubles[1] == 0.0)\n    asserter(VectorOfDoubles[2] == np.finfo('<f8').max)\n\n  except ImportError:\n    # If numpy does not exist, trying to get vector as numpy\n    # array should raise NumpyRequiredForThisFeature. The way\n    # assertRaises has been implemented prevents us from\n    # asserting this error is raised outside of a test case.\n    pass\n\n  asserter(monster.Test4Length() == 2)\n  asserter(not monster.Test4IsNone())\n\n  # create a 'Test' object and populate it:\n  test0 = monster.Test4(0)\n  asserter(type(test0) is _TEST.Test)\n\n  test1 = monster.Test4(1)\n  asserter(type(test1) is _TEST.Test)\n\n  # the position of test0 and test1 are swapped in monsterdata_java_wire\n  # and monsterdata_test_wire, so ignore ordering\n  v0 = test0.A()\n  v1 = test0.B()\n  v2 = test1.A()\n  v3 = test1.B()\n  sumtest12 = int(v0) + int(v1) + int(v2) + int(v3)\n\n  asserter(sumtest12 == 100)\n\n  asserter(not monster.TestarrayofstringIsNone())\n  asserter(monster.TestarrayofstringLength() == 2)\n  asserter(monster.Testarrayofstring(0) == b'test1')\n  asserter(monster.Testarrayofstring(1) == b'test2')\n\n  asserter(monster.TestarrayoftablesIsNone())\n  asserter(monster.TestarrayoftablesLength() == 0)\n  asserter(monster.TestnestedflatbufferIsNone())\n  asserter(monster.TestnestedflatbufferLength() == 0)\n  asserter(monster.Testempty() is None)\n\n\nclass TestFuzz(unittest.TestCase):\n  \"\"\"Low level stress/fuzz test: serialize/deserialize a variety of\n\n  different kinds of data in different combinations\n  \"\"\"\n\n  binary_type = compat.binary_types[0]  # this will always exist\n  ofInt32Bytes = binary_type([0x83, 0x33, 0x33, 0x33])\n  ofInt64Bytes = binary_type([0x84, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44])\n  overflowingInt32Val = flatbuffers.encode.Get(\n      flatbuffers.packer.int32, ofInt32Bytes, 0\n  )\n  overflowingInt64Val = flatbuffers.encode.Get(\n      flatbuffers.packer.int64, ofInt64Bytes, 0\n  )\n\n  # Values we're testing against: chosen to ensure no bits get chopped\n  # off anywhere, and also be different from eachother.\n  boolVal = True\n  int8Val = N.Int8Flags.py_type(-127)  # 0x81\n  uint8Val = N.Uint8Flags.py_type(0xFF)\n  int16Val = N.Int16Flags.py_type(-32222)  # 0x8222\n  uint16Val = N.Uint16Flags.py_type(0xFEEE)\n  int32Val = N.Int32Flags.py_type(overflowingInt32Val)\n  uint32Val = N.Uint32Flags.py_type(0xFDDDDDDD)\n  int64Val = N.Int64Flags.py_type(overflowingInt64Val)\n  uint64Val = N.Uint64Flags.py_type(0xFCCCCCCCCCCCCCCC)\n  # Python uses doubles, so force it here\n  float32Val = N.Float32Flags.py_type(ctypes.c_float(3.14159).value)\n  float64Val = N.Float64Flags.py_type(3.14159265359)\n\n  def test_fuzz(self):\n    return self.check_once(11, 100)\n\n  def check_once(self, fuzzFields, fuzzObjects):\n    testValuesMax = 11  # hardcoded to the number of scalar types\n\n    builder = flatbuffers.Builder(0)\n    l = LCG()\n\n    objects = [0 for _ in compat_range(fuzzObjects)]\n\n    # Generate fuzzObjects random objects each consisting of\n    # fuzzFields fields, each of a random type.\n    for i in compat_range(fuzzObjects):\n      builder.StartObject(fuzzFields)\n\n      for j in compat_range(fuzzFields):\n        choice = int(l.Next()) % testValuesMax\n        if choice == 0:\n          builder.PrependBoolSlot(int(j), self.boolVal, False)\n        elif choice == 1:\n          builder.PrependInt8Slot(int(j), self.int8Val, 0)\n        elif choice == 2:\n          builder.PrependUint8Slot(int(j), self.uint8Val, 0)\n        elif choice == 3:\n          builder.PrependInt16Slot(int(j), self.int16Val, 0)\n        elif choice == 4:\n          builder.PrependUint16Slot(int(j), self.uint16Val, 0)\n        elif choice == 5:\n          builder.PrependInt32Slot(int(j), self.int32Val, 0)\n        elif choice == 6:\n          builder.PrependUint32Slot(int(j), self.uint32Val, 0)\n        elif choice == 7:\n          builder.PrependInt64Slot(int(j), self.int64Val, 0)\n        elif choice == 8:\n          builder.PrependUint64Slot(int(j), self.uint64Val, 0)\n        elif choice == 9:\n          builder.PrependFloat32Slot(int(j), self.float32Val, 0)\n        elif choice == 10:\n          builder.PrependFloat64Slot(int(j), self.float64Val, 0)\n        else:\n          raise RuntimeError('unreachable')\n\n      off = builder.EndObject()\n\n      # store the offset from the end of the builder buffer,\n      # since it will keep growing:\n      objects[i] = off\n\n    # Do some bookkeeping to generate stats on fuzzes:\n    stats = defaultdict(int)\n\n    def check(table, desc, want, got):\n      stats[desc] += 1\n      self.assertEqual(want, got, '%s != %s, %s' % (want, got, desc))\n\n    l = LCG()  # Reset.\n\n    # Test that all objects we generated are readable and return the\n    # expected values. We generate random objects in the same order\n    # so this is deterministic.\n    for i in compat_range(fuzzObjects):\n\n      table = flatbuffers.table.Table(\n          builder.Bytes, len(builder.Bytes) - objects[i]\n      )\n\n      for j in compat_range(fuzzFields):\n        field_count = flatbuffers.builder.VtableMetadataFields + j\n        f = N.VOffsetTFlags.py_type(field_count * N.VOffsetTFlags.bytewidth)\n        choice = int(l.Next()) % testValuesMax\n\n        if choice == 0:\n          check(\n              table, 'bool', self.boolVal, table.GetSlot(f, False, N.BoolFlags)\n          )\n        elif choice == 1:\n          check(table, '<i1', self.int8Val, table.GetSlot(f, 0, N.Int8Flags))\n        elif choice == 2:\n          check(table, '<u1', self.uint8Val, table.GetSlot(f, 0, N.Uint8Flags))\n        elif choice == 3:\n          check(table, '<i2', self.int16Val, table.GetSlot(f, 0, N.Int16Flags))\n        elif choice == 4:\n          check(\n              table, '<u2', self.uint16Val, table.GetSlot(f, 0, N.Uint16Flags)\n          )\n        elif choice == 5:\n          check(table, '<i4', self.int32Val, table.GetSlot(f, 0, N.Int32Flags))\n        elif choice == 6:\n          check(\n              table, '<u4', self.uint32Val, table.GetSlot(f, 0, N.Uint32Flags)\n          )\n        elif choice == 7:\n          check(table, '<i8', self.int64Val, table.GetSlot(f, 0, N.Int64Flags))\n        elif choice == 8:\n          check(\n              table, '<u8', self.uint64Val, table.GetSlot(f, 0, N.Uint64Flags)\n          )\n        elif choice == 9:\n          check(\n              table, '<f4', self.float32Val, table.GetSlot(f, 0, N.Float32Flags)\n          )\n        elif choice == 10:\n          check(\n              table, '<f8', self.float64Val, table.GetSlot(f, 0, N.Float64Flags)\n          )\n        else:\n          raise RuntimeError('unreachable')\n\n    # If enough checks were made, verify that all scalar types were used:\n    self.assertEqual(\n        testValuesMax,\n        len(stats),\n        'fuzzing failed to test all scalar types: %s' % stats,\n    )\n\n\nclass TestByteLayout(unittest.TestCase):\n  \"\"\"TestByteLayout checks the bytes of a Builder in various scenarios.\"\"\"\n\n  def assertBuilderEquals(self, builder, want_chars_or_ints):\n\n    def integerize(x):\n      if isinstance(x, compat.string_types):\n        return ord(x)\n      return x\n\n    want_ints = list(map(integerize, want_chars_or_ints))\n    want = bytearray(want_ints)\n    got = builder.Bytes[builder.Head() :]  # use the buffer directly\n    self.assertEqual(want, got)\n\n  def test_numbers(self):\n    b = flatbuffers.Builder(0)\n    self.assertBuilderEquals(b, [])\n    b.PrependBool(True)\n    self.assertBuilderEquals(b, [1])\n    b.PrependInt8(-127)\n    self.assertBuilderEquals(b, [129, 1])\n    b.PrependUint8(255)\n    self.assertBuilderEquals(b, [255, 129, 1])\n    b.PrependInt16(-32222)\n    self.assertBuilderEquals(b, [0x22, 0x82, 0, 255, 129, 1])  # first pad\n    b.PrependUint16(0xFEEE)\n    # no pad this time:\n    self.assertBuilderEquals(b, [0xEE, 0xFE, 0x22, 0x82, 0, 255, 129, 1])\n    b.PrependInt32(-53687092)\n    self.assertBuilderEquals(\n        b, [204, 204, 204, 252, 0xEE, 0xFE, 0x22, 0x82, 0, 255, 129, 1]\n    )\n    b.PrependUint32(0x98765432)\n    self.assertBuilderEquals(\n        b,\n        [\n            0x32,\n            0x54,\n            0x76,\n            0x98,\n            204,\n            204,\n            204,\n            252,\n            0xEE,\n            0xFE,\n            0x22,\n            0x82,\n            0,\n            255,\n            129,\n            1,\n        ],\n    )\n\n  def test_numbers64(self):\n    b = flatbuffers.Builder(0)\n    b.PrependUint64(0x1122334455667788)\n    self.assertBuilderEquals(\n        b, [0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11]\n    )\n\n    b = flatbuffers.Builder(0)\n    b.PrependInt64(0x1122334455667788)\n    self.assertBuilderEquals(\n        b, [0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11]\n    )\n\n  def test_1xbyte_vector(self):\n    b = flatbuffers.Builder(0)\n    self.assertBuilderEquals(b, [])\n    b.StartVector(flatbuffers.number_types.Uint8Flags.bytewidth, 1, 1)\n    self.assertBuilderEquals(b, [0, 0, 0])  # align to 4bytes\n    b.PrependByte(1)\n    self.assertBuilderEquals(b, [1, 0, 0, 0])\n    b.EndVector()\n    self.assertBuilderEquals(b, [1, 0, 0, 0, 1, 0, 0, 0])  # padding\n\n  def test_2xbyte_vector(self):\n    b = flatbuffers.Builder(0)\n    b.StartVector(flatbuffers.number_types.Uint8Flags.bytewidth, 2, 1)\n    self.assertBuilderEquals(b, [0, 0])  # align to 4bytes\n    b.PrependByte(1)\n    self.assertBuilderEquals(b, [1, 0, 0])\n    b.PrependByte(2)\n    self.assertBuilderEquals(b, [2, 1, 0, 0])\n    b.EndVector()\n    self.assertBuilderEquals(b, [2, 0, 0, 0, 2, 1, 0, 0])  # padding\n\n  def test_1xuint16_vector(self):\n    b = flatbuffers.Builder(0)\n    b.StartVector(flatbuffers.number_types.Uint16Flags.bytewidth, 1, 1)\n    self.assertBuilderEquals(b, [0, 0])  # align to 4bytes\n    b.PrependUint16(1)\n    self.assertBuilderEquals(b, [1, 0, 0, 0])\n    b.EndVector()\n    self.assertBuilderEquals(b, [1, 0, 0, 0, 1, 0, 0, 0])  # padding\n\n  def test_2xuint16_vector(self):\n    b = flatbuffers.Builder(0)\n    b.StartVector(flatbuffers.number_types.Uint16Flags.bytewidth, 2, 1)\n    self.assertBuilderEquals(b, [])  # align to 4bytes\n    b.PrependUint16(0xABCD)\n    self.assertBuilderEquals(b, [0xCD, 0xAB])\n    b.PrependUint16(0xDCBA)\n    self.assertBuilderEquals(b, [0xBA, 0xDC, 0xCD, 0xAB])\n    b.EndVector()\n    self.assertBuilderEquals(b, [2, 0, 0, 0, 0xBA, 0xDC, 0xCD, 0xAB])\n\n  def test_create_ascii_shared_string(self):\n    b = flatbuffers.Builder(0)\n    b.CreateSharedString('foo', encoding='ascii')\n    b.CreateSharedString('foo', encoding='ascii')\n\n    # 0-terminated, no pad:\n    self.assertBuilderEquals(b, [3, 0, 0, 0, 'f', 'o', 'o', 0])\n    b.CreateSharedString('moop', encoding='ascii')\n    b.CreateSharedString('moop', encoding='ascii')\n    # 0-terminated, 3-byte pad:\n    self.assertBuilderEquals(\n        b,\n        [\n            4,\n            0,\n            0,\n            0,\n            'm',\n            'o',\n            'o',\n            'p',\n            0,\n            0,\n            0,\n            0,\n            3,\n            0,\n            0,\n            0,\n            'f',\n            'o',\n            'o',\n            0,\n        ],\n    )\n\n  def test_create_utf8_shared_string(self):\n    b = flatbuffers.Builder(0)\n    b.CreateSharedString('Цлїςσδε')\n    b.CreateSharedString('Цлїςσδε')\n    self.assertBuilderEquals(\n        b,\n        '\\x0e\\x00\\x00\\x00\\xd0\\xa6\\xd0\\xbb\\xd1\\x97'\n        '\\xcf\\x82\\xcf\\x83\\xce\\xb4\\xce\\xb5\\x00\\x00',\n    )\n\n    b.CreateSharedString('ﾌﾑｱﾑｶﾓｹﾓ')\n    b.CreateSharedString('ﾌﾑｱﾑｶﾓｹﾓ')\n    self.assertBuilderEquals(\n        b,\n        '\\x18\\x00\\x00\\x00\\xef\\xbe\\x8c\\xef\\xbe\\x91'\n        '\\xef\\xbd\\xb1\\xef\\xbe\\x91\\xef\\xbd\\xb6\\xef\\xbe\\x93\\xef\\xbd\\xb9\\xef'\n        '\\xbe\\x93\\x00\\x00\\x00\\x00\\x0e\\x00\\x00\\x00\\xd0\\xa6\\xd0\\xbb\\xd1\\x97'\n        '\\xcf\\x82\\xcf\\x83\\xce\\xb4\\xce\\xb5\\x00\\x00',\n    )\n\n  def test_create_arbitrary_shared_string(self):\n    b = flatbuffers.Builder(0)\n    s = '\\x01\\x02\\x03'\n    b.CreateSharedString(s)  # Default encoding is utf-8.\n    b.CreateSharedString(s)\n    # 0-terminated, no pad:\n    self.assertBuilderEquals(b, [3, 0, 0, 0, 1, 2, 3, 0])\n    s2 = '\\x04\\x05\\x06\\x07'\n    b.CreateSharedString(s2)  # Default encoding is utf-8.\n    b.CreateSharedString(s2)\n    # 0-terminated, 3-byte pad:\n    self.assertBuilderEquals(\n        b, [4, 0, 0, 0, 4, 5, 6, 7, 0, 0, 0, 0, 3, 0, 0, 0, 1, 2, 3, 0]\n    )\n\n  def test_create_ascii_string(self):\n    b = flatbuffers.Builder(0)\n    b.CreateString('foo', encoding='ascii')\n\n    # 0-terminated, no pad:\n    self.assertBuilderEquals(b, [3, 0, 0, 0, 'f', 'o', 'o', 0])\n    b.CreateString('moop', encoding='ascii')\n    # 0-terminated, 3-byte pad:\n    self.assertBuilderEquals(\n        b,\n        [\n            4,\n            0,\n            0,\n            0,\n            'm',\n            'o',\n            'o',\n            'p',\n            0,\n            0,\n            0,\n            0,\n            3,\n            0,\n            0,\n            0,\n            'f',\n            'o',\n            'o',\n            0,\n        ],\n    )\n\n  def test_create_utf8_string(self):\n    b = flatbuffers.Builder(0)\n    b.CreateString('Цлїςσδε')\n    self.assertBuilderEquals(\n        b,\n        '\\x0e\\x00\\x00\\x00\\xd0\\xa6\\xd0\\xbb\\xd1\\x97'\n        '\\xcf\\x82\\xcf\\x83\\xce\\xb4\\xce\\xb5\\x00\\x00',\n    )\n\n    b.CreateString('ﾌﾑｱﾑｶﾓｹﾓ')\n    self.assertBuilderEquals(\n        b,\n        '\\x18\\x00\\x00\\x00\\xef\\xbe\\x8c\\xef\\xbe\\x91'\n        '\\xef\\xbd\\xb1\\xef\\xbe\\x91\\xef\\xbd\\xb6\\xef\\xbe\\x93\\xef\\xbd\\xb9\\xef'\n        '\\xbe\\x93\\x00\\x00\\x00\\x00\\x0e\\x00\\x00\\x00\\xd0\\xa6\\xd0\\xbb\\xd1\\x97'\n        '\\xcf\\x82\\xcf\\x83\\xce\\xb4\\xce\\xb5\\x00\\x00',\n    )\n\n  def test_create_arbitrary_string(self):\n    b = flatbuffers.Builder(0)\n    s = '\\x01\\x02\\x03'\n    b.CreateString(s)  # Default encoding is utf-8.\n    # 0-terminated, no pad:\n    self.assertBuilderEquals(b, [3, 0, 0, 0, 1, 2, 3, 0])\n    s2 = '\\x04\\x05\\x06\\x07'\n    b.CreateString(s2)  # Default encoding is utf-8.\n    # 0-terminated, 3-byte pad:\n    self.assertBuilderEquals(\n        b, [4, 0, 0, 0, 4, 5, 6, 7, 0, 0, 0, 0, 3, 0, 0, 0, 1, 2, 3, 0]\n    )\n\n  def test_create_byte_vector(self):\n    b = flatbuffers.Builder(0)\n    b.CreateByteVector(b'')\n    # 0-byte pad:\n    self.assertBuilderEquals(b, [0, 0, 0, 0])\n\n    b = flatbuffers.Builder(0)\n    b.CreateByteVector(b'\\x01\\x02\\x03')\n    # 1-byte pad:\n    self.assertBuilderEquals(b, [3, 0, 0, 0, 1, 2, 3, 0])\n\n  def test_comparison_of_np_arrays(self):\n    \"\"\"MonsterT dvec and fvec are np.array types which can not be compared with == directly\n\n    This tests ensures that the __eq__ is generated correctly\n    \"\"\"\n    try:\n      # if numpy exists, then we should be able to get the\n      # vector as a numpy array\n      import numpy as np\n\n      vec1 = np.array([1, 2], dtype=np.float32)\n      vec2 = np.array([3, 4], dtype=np.float32)\n\n      monsterA = MyGame.MonsterExtra.MonsterExtraT(\n          d0=1, d1=1, d2=1, d3=1, f0=1, f1=1, f2=1, f3=1, dvec=vec1, fvec=vec2\n      )\n      assert monsterA == monsterA\n\n      monsterB = MyGame.MonsterExtra.MonsterExtraT(\n          d0=2, d1=1, d2=1, d3=1, f0=1, f1=1, f2=1, f3=1, dvec=vec1, fvec=vec2\n      )\n      assert monsterA != monsterB\n    except ImportError:\n      b = flatbuffers.Builder(0)\n      x = 0\n      assertRaises(\n          self, lambda: b.CreateNumpyVector(x), NumpyRequiredForThisFeature\n      )\n\n  def test_create_numpy_vector_int8(self):\n    try:\n      # if numpy exists, then we should be able to get the\n      # vector as a numpy array\n      import numpy as np\n\n      # Systems endian:\n      b = flatbuffers.Builder(0)\n      x = np.array([1, 2, -3], dtype=np.int8)\n      b.CreateNumpyVector(x)\n      self.assertBuilderEquals(\n          b,\n          [\n              3,\n              0,\n              0,\n              0,  # vector length\n              1,\n              2,\n              256 - 3,\n              0,  # vector value + padding\n          ],\n      )\n\n      # Reverse endian:\n      b = flatbuffers.Builder(0)\n      x_other_endian = byte_swap_array(np.__version__, x)\n      b.CreateNumpyVector(x_other_endian)\n      self.assertBuilderEquals(\n          b,\n          [\n              3,\n              0,\n              0,\n              0,  # vector length\n              1,\n              2,\n              256 - 3,\n              0,  # vector value + padding\n          ],\n      )\n    except ImportError:\n      b = flatbuffers.Builder(0)\n      x = 0\n      assertRaises(\n          self, lambda: b.CreateNumpyVector(x), NumpyRequiredForThisFeature\n      )\n\n  def test_create_numpy_vector_uint16(self):\n    try:\n      # if numpy exists, then we should be able to get the\n      # vector as a numpy array\n      import numpy as np\n\n      # Systems endian:\n      b = flatbuffers.Builder(0)\n      x = np.array([1, 2, 312], dtype=np.uint16)\n      b.CreateNumpyVector(x)\n      self.assertBuilderEquals(\n          b,\n          [\n              3,\n              0,\n              0,\n              0,  # vector length\n              1,\n              0,  # 1\n              2,\n              0,  # 2\n              312 - 256,\n              1,  # 312\n              0,\n              0,  # padding\n          ],\n      )\n\n      # Reverse endian:\n      b = flatbuffers.Builder(0)\n      x_other_endian = byte_swap_array(np.__version__, x)\n      b.CreateNumpyVector(x_other_endian)\n      self.assertBuilderEquals(\n          b,\n          [\n              3,\n              0,\n              0,\n              0,  # vector length\n              1,\n              0,  # 1\n              2,\n              0,  # 2\n              312 - 256,\n              1,  # 312\n              0,\n              0,  # padding\n          ],\n      )\n    except ImportError:\n      b = flatbuffers.Builder(0)\n      x = 0\n      assertRaises(\n          self, lambda: b.CreateNumpyVector(x), NumpyRequiredForThisFeature\n      )\n\n  def test_create_numpy_vector_int64(self):\n    try:\n      # if numpy exists, then we should be able to get the\n      # vector as a numpy array\n      import numpy as np\n\n      # Systems endian:\n      b = flatbuffers.Builder(0)\n      x = np.array([1, 2, -12], dtype=np.int64)\n      b.CreateNumpyVector(x)\n      self.assertBuilderEquals(\n          b,\n          [\n              3,\n              0,\n              0,\n              0,  # vector length\n              1,\n              0,\n              0,\n              0,\n              0,\n              0,\n              0,\n              0,  # 1\n              2,\n              0,\n              0,\n              0,\n              0,\n              0,\n              0,\n              0,  # 2\n              256 - 12,\n              255,\n              255,\n              255,\n              255,\n              255,\n              255,\n              255,  # -12\n          ],\n      )\n\n      # Reverse endian:\n      b = flatbuffers.Builder(0)\n      x_other_endian = byte_swap_array(np.__version__, x)\n      b.CreateNumpyVector(x_other_endian)\n      self.assertBuilderEquals(\n          b,\n          [\n              3,\n              0,\n              0,\n              0,  # vector length\n              1,\n              0,\n              0,\n              0,\n              0,\n              0,\n              0,\n              0,  # 1\n              2,\n              0,\n              0,\n              0,\n              0,\n              0,\n              0,\n              0,  # 2\n              256 - 12,\n              255,\n              255,\n              255,\n              255,\n              255,\n              255,\n              255,  # -12\n          ],\n      )\n\n    except ImportError:\n      b = flatbuffers.Builder(0)\n      x = 0\n      assertRaises(\n          self, lambda: b.CreateNumpyVector(x), NumpyRequiredForThisFeature\n      )\n\n  def test_create_numpy_vector_float32(self):\n    try:\n      # if numpy exists, then we should be able to get the\n      # vector as a numpy array\n      import numpy as np\n\n      # Systems endian:\n      b = flatbuffers.Builder(0)\n      x = np.array([1, 2, -12], dtype=np.float32)\n      b.CreateNumpyVector(x)\n      self.assertBuilderEquals(\n          b,\n          [\n              3,\n              0,\n              0,\n              0,  # vector length\n              0,\n              0,\n              128,\n              63,  # 1\n              0,\n              0,\n              0,\n              64,  # 2\n              0,\n              0,\n              64,\n              193,  # -12\n          ],\n      )\n\n      # Reverse endian:\n      b = flatbuffers.Builder(0)\n      x_other_endian = byte_swap_array(np.__version__, x)\n      b.CreateNumpyVector(x_other_endian)\n      self.assertBuilderEquals(\n          b,\n          [\n              3,\n              0,\n              0,\n              0,  # vector length\n              0,\n              0,\n              128,\n              63,  # 1\n              0,\n              0,\n              0,\n              64,  # 2\n              0,\n              0,\n              64,\n              193,  # -12\n          ],\n      )\n\n    except ImportError:\n      b = flatbuffers.Builder(0)\n      x = 0\n      assertRaises(\n          self, lambda: b.CreateNumpyVector(x), NumpyRequiredForThisFeature\n      )\n\n  def test_create_numpy_vector_float64(self):\n    try:\n      # if numpy exists, then we should be able to get the\n      # vector as a numpy array\n      import numpy as np\n\n      # Systems endian:\n      b = flatbuffers.Builder(0)\n      x = np.array([1, 2, -12], dtype=np.float64)\n      b.CreateNumpyVector(x)\n      self.assertBuilderEquals(\n          b,\n          [\n              3,\n              0,\n              0,\n              0,  # vector length\n              0,\n              0,\n              0,\n              0,\n              0,\n              0,\n              240,\n              63,  # 1\n              0,\n              0,\n              0,\n              0,\n              0,\n              0,\n              0,\n              64,  # 2\n              0,\n              0,\n              0,\n              0,\n              0,\n              0,\n              40,\n              192,  # -12\n          ],\n      )\n\n      # Reverse endian:\n      b = flatbuffers.Builder(0)\n      x_other_endian = byte_swap_array(np.__version__, x)\n      b.CreateNumpyVector(x_other_endian)\n      self.assertBuilderEquals(\n          b,\n          [\n              3,\n              0,\n              0,\n              0,  # vector length\n              0,\n              0,\n              0,\n              0,\n              0,\n              0,\n              240,\n              63,  # 1\n              0,\n              0,\n              0,\n              0,\n              0,\n              0,\n              0,\n              64,  # 2\n              0,\n              0,\n              0,\n              0,\n              0,\n              0,\n              40,\n              192,  # -12\n          ],\n      )\n\n    except ImportError:\n      b = flatbuffers.Builder(0)\n      x = 0\n      assertRaises(\n          self, lambda: b.CreateNumpyVector(x), NumpyRequiredForThisFeature\n      )\n\n  def test_create_numpy_vector_bool(self):\n    try:\n      # if numpy exists, then we should be able to get the\n      # vector as a numpy array\n      import numpy as np\n\n      # Systems endian:\n      b = flatbuffers.Builder(0)\n      x = np.array([True, False, True], dtype=bool)\n      b.CreateNumpyVector(x)\n      self.assertBuilderEquals(\n          b,\n          [3, 0, 0, 0, 1, 0, 1, 0],  # vector length  # vector values + padding\n      )\n\n      # Reverse endian:\n      b = flatbuffers.Builder(0)\n      x_other_endian = byte_swap_array(np.__version__, x)\n      b.CreateNumpyVector(x_other_endian)\n      self.assertBuilderEquals(\n          b,\n          [3, 0, 0, 0, 1, 0, 1, 0],  # vector length  # vector values + padding\n      )\n\n    except ImportError:\n      b = flatbuffers.Builder(0)\n      x = 0\n      assertRaises(\n          self, lambda: b.CreateNumpyVector(x), NumpyRequiredForThisFeature\n      )\n\n  def test_create_numpy_vector_reject_strings(self):\n    try:\n      # if numpy exists, then we should be able to get the\n      # vector as a numpy array\n      import numpy as np\n\n      # Create String array\n      b = flatbuffers.Builder(0)\n      x = np.array(['hello', 'fb', 'testing'])\n      assertRaises(self, lambda: b.CreateNumpyVector(x), TypeError)\n\n    except ImportError:\n      b = flatbuffers.Builder(0)\n      x = 0\n      assertRaises(\n          self, lambda: b.CreateNumpyVector(x), NumpyRequiredForThisFeature\n      )\n\n  def test_create_numpy_vector_reject_object(self):\n    try:\n      # if numpy exists, then we should be able to get the\n      # vector as a numpy array\n      import numpy as np\n\n      # Create String array\n      b = flatbuffers.Builder(0)\n      x = np.array([{'m': 0}, {'as': -2.1, 'c': 'c'}])\n      assertRaises(self, lambda: b.CreateNumpyVector(x), TypeError)\n\n    except ImportError:\n      b = flatbuffers.Builder(0)\n      x = 0\n      assertRaises(\n          self, lambda: b.CreateNumpyVector(x), NumpyRequiredForThisFeature\n      )\n\n  def test_empty_vtable(self):\n    b = flatbuffers.Builder(0)\n    b.StartObject(0)\n    self.assertBuilderEquals(b, [])\n    b.EndObject()\n    self.assertBuilderEquals(b, [4, 0, 4, 0, 4, 0, 0, 0])\n\n  def test_vtable_with_one_true_bool(self):\n    b = flatbuffers.Builder(0)\n    self.assertBuilderEquals(b, [])\n    b.StartObject(1)\n    self.assertBuilderEquals(b, [])\n    b.PrependBoolSlot(0, True, False)\n    b.EndObject()\n    self.assertBuilderEquals(\n        b,\n        [\n            6,\n            0,  # vtable bytes\n            8,\n            0,  # length of object including vtable offset\n            7,\n            0,  # start of bool value\n            6,\n            0,\n            0,\n            0,  # offset for start of vtable (int32)\n            0,\n            0,\n            0,  # padded to 4 bytes\n            1,  # bool value\n        ],\n    )\n\n  def test_vtable_with_one_default_bool(self):\n    b = flatbuffers.Builder(0)\n    self.assertBuilderEquals(b, [])\n    b.StartObject(1)\n    self.assertBuilderEquals(b, [])\n    b.PrependBoolSlot(0, False, False)\n    b.EndObject()\n    self.assertBuilderEquals(\n        b,\n        [\n            4,\n            0,  # vtable bytes\n            4,\n            0,  # end of object from here\n            # entry 1 is zero and not stored\n            4,\n            0,\n            0,\n            0,  # offset for start of vtable (int32)\n        ],\n    )\n\n  def test_vtable_with_one_int16(self):\n    b = flatbuffers.Builder(0)\n    b.StartObject(1)\n    b.PrependInt16Slot(0, 0x789A, 0)\n    b.EndObject()\n    self.assertBuilderEquals(\n        b,\n        [\n            6,\n            0,  # vtable bytes\n            8,\n            0,  # end of object from here\n            6,\n            0,  # offset to value\n            6,\n            0,\n            0,\n            0,  # offset for start of vtable (int32)\n            0,\n            0,  # padding to 4 bytes\n            0x9A,\n            0x78,\n        ],\n    )\n\n  def test_vtable_with_two_int16(self):\n    b = flatbuffers.Builder(0)\n    b.StartObject(2)\n    b.PrependInt16Slot(0, 0x3456, 0)\n    b.PrependInt16Slot(1, 0x789A, 0)\n    b.EndObject()\n    self.assertBuilderEquals(\n        b,\n        [\n            8,\n            0,  # vtable bytes\n            8,\n            0,  # end of object from here\n            6,\n            0,  # offset to value 0\n            4,\n            0,  # offset to value 1\n            8,\n            0,\n            0,\n            0,  # offset for start of vtable (int32)\n            0x9A,\n            0x78,  # value 1\n            0x56,\n            0x34,  # value 0\n        ],\n    )\n\n  def test_vtable_with_int16_and_bool(self):\n    b = flatbuffers.Builder(0)\n    b.StartObject(2)\n    b.PrependInt16Slot(0, 0x3456, 0)\n    b.PrependBoolSlot(1, True, False)\n    b.EndObject()\n    self.assertBuilderEquals(\n        b,\n        [\n            8,\n            0,  # vtable bytes\n            8,\n            0,  # end of object from here\n            6,\n            0,  # offset to value 0\n            5,\n            0,  # offset to value 1\n            8,\n            0,\n            0,\n            0,  # offset for start of vtable (int32)\n            0,  # padding\n            1,  # value 1\n            0x56,\n            0x34,  # value 0\n        ],\n    )\n\n  def test_vtable_with_empty_vector(self):\n    b = flatbuffers.Builder(0)\n    b.StartVector(flatbuffers.number_types.Uint8Flags.bytewidth, 0, 1)\n    vecend = b.EndVector()\n    b.StartObject(1)\n    b.PrependUOffsetTRelativeSlot(0, vecend, 0)\n    b.EndObject()\n    self.assertBuilderEquals(\n        b,\n        [\n            6,\n            0,  # vtable bytes\n            8,\n            0,\n            4,\n            0,  # offset to vector offset\n            6,\n            0,\n            0,\n            0,  # offset for start of vtable (int32)\n            4,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,  # length of vector (not in struct)\n        ],\n    )\n\n  def test_vtable_with_empty_vector_of_byte_and_some_scalars(self):\n    b = flatbuffers.Builder(0)\n    b.StartVector(flatbuffers.number_types.Uint8Flags.bytewidth, 0, 1)\n    vecend = b.EndVector()\n    b.StartObject(2)\n    b.PrependInt16Slot(0, 55, 0)\n    b.PrependUOffsetTRelativeSlot(1, vecend, 0)\n    b.EndObject()\n    self.assertBuilderEquals(\n        b,\n        [\n            8,\n            0,  # vtable bytes\n            12,\n            0,\n            10,\n            0,  # offset to value 0\n            4,\n            0,  # offset to vector offset\n            8,\n            0,\n            0,\n            0,  # vtable loc\n            8,\n            0,\n            0,\n            0,  # value 1\n            0,\n            0,\n            55,\n            0,  # value 0\n            0,\n            0,\n            0,\n            0,  # length of vector (not in struct)\n        ],\n    )\n\n  def test_vtable_with_1_int16_and_2vector_of_int16(self):\n    b = flatbuffers.Builder(0)\n    b.StartVector(flatbuffers.number_types.Int16Flags.bytewidth, 2, 1)\n    b.PrependInt16(0x1234)\n    b.PrependInt16(0x5678)\n    vecend = b.EndVector()\n    b.StartObject(2)\n    b.PrependUOffsetTRelativeSlot(1, vecend, 0)\n    b.PrependInt16Slot(0, 55, 0)\n    b.EndObject()\n    self.assertBuilderEquals(\n        b,\n        [\n            8,\n            0,  # vtable bytes\n            12,\n            0,  # length of object\n            6,\n            0,  # start of value 0 from end of vtable\n            8,\n            0,  # start of value 1 from end of buffer\n            8,\n            0,\n            0,\n            0,  # offset for start of vtable (int32)\n            0,\n            0,  # padding\n            55,\n            0,  # value 0\n            4,\n            0,\n            0,\n            0,  # vector position from here\n            2,\n            0,\n            0,\n            0,  # length of vector (uint32)\n            0x78,\n            0x56,  # vector value 1\n            0x34,\n            0x12,  # vector value 0\n        ],\n    )\n\n  def test_vtable_with_1_struct_of_1_int8__1_int16__1_int32(self):\n    b = flatbuffers.Builder(0)\n    b.StartObject(1)\n    b.Prep(4 + 4 + 4, 0)\n    b.PrependInt8(55)\n    b.Pad(3)\n    b.PrependInt16(0x1234)\n    b.Pad(2)\n    b.PrependInt32(0x12345678)\n    structStart = b.Offset()\n    b.PrependStructSlot(0, structStart, 0)\n    b.EndObject()\n    self.assertBuilderEquals(\n        b,\n        [\n            6,\n            0,  # vtable bytes\n            16,\n            0,  # end of object from here\n            4,\n            0,  # start of struct from here\n            6,\n            0,\n            0,\n            0,  # offset for start of vtable (int32)\n            0x78,\n            0x56,\n            0x34,\n            0x12,  # value 2\n            0,\n            0,  # padding\n            0x34,\n            0x12,  # value 1\n            0,\n            0,\n            0,  # padding\n            55,  # value 0\n        ],\n    )\n\n  def test_vtable_with_1_vector_of_2_struct_of_2_int8(self):\n    b = flatbuffers.Builder(0)\n    b.StartVector(flatbuffers.number_types.Int8Flags.bytewidth * 2, 2, 1)\n    b.PrependInt8(33)\n    b.PrependInt8(44)\n    b.PrependInt8(55)\n    b.PrependInt8(66)\n    vecend = b.EndVector()\n    b.StartObject(1)\n    b.PrependUOffsetTRelativeSlot(0, vecend, 0)\n    b.EndObject()\n    self.assertBuilderEquals(\n        b,\n        [\n            6,\n            0,  # vtable bytes\n            8,\n            0,\n            4,\n            0,  # offset of vector offset\n            6,\n            0,\n            0,\n            0,  # offset for start of vtable (int32)\n            4,\n            0,\n            0,\n            0,  # vector start offset\n            2,\n            0,\n            0,\n            0,  # vector length\n            66,  # vector value 1,1\n            55,  # vector value 1,0\n            44,  # vector value 0,1\n            33,  # vector value 0,0\n        ],\n    )\n\n  def test_table_with_some_elements(self):\n    b = flatbuffers.Builder(0)\n    b.StartObject(2)\n    b.PrependInt8Slot(0, 33, 0)\n    b.PrependInt16Slot(1, 66, 0)\n    off = b.EndObject()\n    b.Finish(off)\n\n    self.assertBuilderEquals(\n        b,\n        [\n            12,\n            0,\n            0,\n            0,  # root of table: points to vtable offset\n            8,\n            0,  # vtable bytes\n            8,\n            0,  # end of object from here\n            7,\n            0,  # start of value 0\n            4,\n            0,  # start of value 1\n            8,\n            0,\n            0,\n            0,  # offset for start of vtable (int32)\n            66,\n            0,  # value 1\n            0,  # padding\n            33,  # value 0\n        ],\n    )\n\n  def test__one_unfinished_table_and_one_finished_table(self):\n    b = flatbuffers.Builder(0)\n    b.StartObject(2)\n    b.PrependInt8Slot(0, 33, 0)\n    b.PrependInt8Slot(1, 44, 0)\n    off = b.EndObject()\n    b.Finish(off)\n\n    b.StartObject(3)\n    b.PrependInt8Slot(0, 55, 0)\n    b.PrependInt8Slot(1, 66, 0)\n    b.PrependInt8Slot(2, 77, 0)\n    off = b.EndObject()\n    b.Finish(off)\n\n    self.assertBuilderEquals(\n        b,\n        [\n            16,\n            0,\n            0,\n            0,  # root of table: points to object\n            0,\n            0,  # padding\n            10,\n            0,  # vtable bytes\n            8,\n            0,  # size of object\n            7,\n            0,  # start of value 0\n            6,\n            0,  # start of value 1\n            5,\n            0,  # start of value 2\n            10,\n            0,\n            0,\n            0,  # offset for start of vtable (int32)\n            0,  # padding\n            77,  # value 2\n            66,  # value 1\n            55,  # value 0\n            12,\n            0,\n            0,\n            0,  # root of table: points to object\n            8,\n            0,  # vtable bytes\n            8,\n            0,  # size of object\n            7,\n            0,  # start of value 0\n            6,\n            0,  # start of value 1\n            8,\n            0,\n            0,\n            0,  # offset for start of vtable (int32)\n            0,\n            0,  # padding\n            44,  # value 1\n            33,  # value 0\n        ],\n    )\n\n  def test_a_bunch_of_bools(self):\n    b = flatbuffers.Builder(0)\n    b.StartObject(8)\n    b.PrependBoolSlot(0, True, False)\n    b.PrependBoolSlot(1, True, False)\n    b.PrependBoolSlot(2, True, False)\n    b.PrependBoolSlot(3, True, False)\n    b.PrependBoolSlot(4, True, False)\n    b.PrependBoolSlot(5, True, False)\n    b.PrependBoolSlot(6, True, False)\n    b.PrependBoolSlot(7, True, False)\n    off = b.EndObject()\n    b.Finish(off)\n\n    self.assertBuilderEquals(\n        b,\n        [\n            24,\n            0,\n            0,\n            0,  # root of table: points to vtable offset\n            20,\n            0,  # vtable bytes\n            12,\n            0,  # size of object\n            11,\n            0,  # start of value 0\n            10,\n            0,  # start of value 1\n            9,\n            0,  # start of value 2\n            8,\n            0,  # start of value 3\n            7,\n            0,  # start of value 4\n            6,\n            0,  # start of value 5\n            5,\n            0,  # start of value 6\n            4,\n            0,  # start of value 7\n            20,\n            0,\n            0,\n            0,  # vtable offset\n            1,  # value 7\n            1,  # value 6\n            1,  # value 5\n            1,  # value 4\n            1,  # value 3\n            1,  # value 2\n            1,  # value 1\n            1,  # value 0\n        ],\n    )\n\n  def test_three_bools(self):\n    b = flatbuffers.Builder(0)\n    b.StartObject(3)\n    b.PrependBoolSlot(0, True, False)\n    b.PrependBoolSlot(1, True, False)\n    b.PrependBoolSlot(2, True, False)\n    off = b.EndObject()\n    b.Finish(off)\n\n    self.assertBuilderEquals(\n        b,\n        [\n            16,\n            0,\n            0,\n            0,  # root of table: points to vtable offset\n            0,\n            0,  # padding\n            10,\n            0,  # vtable bytes\n            8,\n            0,  # size of object\n            7,\n            0,  # start of value 0\n            6,\n            0,  # start of value 1\n            5,\n            0,  # start of value 2\n            10,\n            0,\n            0,\n            0,  # vtable offset from here\n            0,  # padding\n            1,  # value 2\n            1,  # value 1\n            1,  # value 0\n        ],\n    )\n\n  def test_some_floats(self):\n    b = flatbuffers.Builder(0)\n    b.StartObject(1)\n    b.PrependFloat32Slot(0, 1.0, 0.0)\n    off = b.EndObject()\n\n    self.assertBuilderEquals(\n        b,\n        [\n            6,\n            0,  # vtable bytes\n            8,\n            0,  # size of object\n            4,\n            0,  # start of value 0\n            6,\n            0,\n            0,\n            0,  # vtable offset\n            0,\n            0,\n            128,\n            63,  # value 0\n        ],\n    )\n\n\ndef make_monster_from_generated_code(\n    b=None, sizePrefix=False, file_identifier=None\n):\n  \"\"\"Use generated code to build the example Monster.\"\"\"\n  if b is None:\n    b = flatbuffers.Builder(0)\n  string = b.CreateString('MyMonster')\n  test1 = b.CreateString('test1')\n  test2 = b.CreateString('test2')\n  fred = b.CreateString('Fred')\n\n  inv = _MONSTER.MonsterCreateInventoryVector(b, range(5))\n\n  _MONSTER.MonsterStart(b)\n  _MONSTER.MonsterAddName(b, fred)\n  mon2 = _MONSTER.MonsterEnd(b)\n\n  test4_structs = (_TEST.TestT(10, 20), _TEST.TestT(30, 40))\n  test4 = _MONSTER.MonsterCreateTest4Vector(b, test4_structs)\n\n  testArrayOfString = _MONSTER.MonsterCreateTestarrayofstringVector(\n      b, [test1, test2]\n  )\n\n  _MONSTER.MonsterStartVectorOfLongsVector(b, 5)\n  b.PrependInt64(100000000)\n  b.PrependInt64(1000000)\n  b.PrependInt64(10000)\n  b.PrependInt64(100)\n  b.PrependInt64(1)\n  VectorOfLongs = b.EndVector()\n\n  _MONSTER.MonsterStartVectorOfDoublesVector(b, 3)\n  b.PrependFloat64(1.7976931348623157e308)\n  b.PrependFloat64(0)\n  b.PrependFloat64(-1.7976931348623157e308)\n  VectorOfDoubles = b.EndVector()\n\n  _MONSTER.MonsterStart(b)\n\n  pos = _VEC3.CreateVec3(b, 1.0, 2.0, 3.0, 3.0, 2, 5, 6)\n  _MONSTER.MonsterAddPos(b, pos)\n\n  _MONSTER.MonsterAddHp(b, 80)\n  _MONSTER.MonsterAddName(b, string)\n  _MONSTER.MonsterAddInventory(b, inv)\n  _MONSTER.MonsterAddTestType(b, 1)\n  _MONSTER.MonsterAddTest(b, mon2)\n  _MONSTER.MonsterAddTest4(b, test4)\n  _MONSTER.MonsterAddTestarrayofstring(b, testArrayOfString)\n  _MONSTER.MonsterAddVectorOfLongs(b, VectorOfLongs)\n  _MONSTER.MonsterAddVectorOfDoubles(b, VectorOfDoubles)\n  mon = _MONSTER.MonsterEnd(b)\n\n  if sizePrefix:\n    b.FinishSizePrefixed(mon, file_identifier)\n  else:\n    b.Finish(mon, file_identifier)\n\n  return b.Bytes, b.Head()\n\n\nclass TestBuilderForceDefaults(unittest.TestCase):\n  \"\"\"Verify that the builder adds default values when forced.\"\"\"\n\n  test_flags = [\n      N.BoolFlags(),\n      N.Uint8Flags(),\n      N.Uint16Flags(),\n      N.Uint32Flags(),\n      N.Uint64Flags(),\n      N.Int8Flags(),\n      N.Int16Flags(),\n      N.Int32Flags(),\n      N.Int64Flags(),\n      N.Float32Flags(),\n      N.Float64Flags(),\n      N.UOffsetTFlags(),\n  ]\n\n  def test_default_force_defaults(self):\n    for flag in self.test_flags:\n      b = flatbuffers.Builder(0)\n      b.StartObject(1)\n      stored_offset = b.Offset()\n      if flag != N.UOffsetTFlags():\n        b.PrependSlot(flag, 0, 0, 0)\n      else:\n        b.PrependUOffsetTRelativeSlot(0, 0, 0)\n      end_offset = b.Offset()\n      b.EndObject()\n      self.assertEqual(0, end_offset - stored_offset)\n\n  def test_force_defaults_true(self):\n    for flag in self.test_flags:\n      b = flatbuffers.Builder(0)\n      b.ForceDefaults(True)\n      b.StartObject(1)\n      stored_offset = b.Offset()\n      if flag != N.UOffsetTFlags():\n        b.PrependSlot(flag, 0, 0, 0)\n      else:\n        b.PrependUOffsetTRelativeSlot(0, 0, 0)\n      end_offset = b.Offset()\n      b.EndObject()\n      self.assertEqual(flag.bytewidth, end_offset - stored_offset)\n\n\nclass TestAllCodePathsOfExampleSchema(unittest.TestCase):\n\n  def setUp(self, *args, **kwargs):\n    super(TestAllCodePathsOfExampleSchema, self).setUp(*args, **kwargs)\n\n    b = flatbuffers.Builder(0)\n    _MONSTER.MonsterStart(b)\n    gen_mon = _MONSTER.MonsterEnd(b)\n    b.Finish(gen_mon)\n\n    self.mon = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())\n\n  def test_default_monster_pos(self):\n    self.assertTrue(self.mon.Pos() is None)\n\n  def test_nondefault_monster_mana(self):\n    b = flatbuffers.Builder(0)\n    _MONSTER.MonsterStart(b)\n    _MONSTER.MonsterAddMana(b, 50)\n    mon = _MONSTER.MonsterEnd(b)\n    b.Finish(mon)\n\n    got_mon = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())\n    self.assertEqual(50, got_mon.Mana())\n\n  def test_default_monster_hp(self):\n    self.assertEqual(100, self.mon.Hp())\n\n  def test_default_monster_name(self):\n    self.assertEqual(None, self.mon.Name())\n\n  def test_default_monster_inventory_item(self):\n    self.assertEqual(0, self.mon.Inventory(0))\n\n  def test_default_monster_inventory_length(self):\n    self.assertEqual(0, self.mon.InventoryLength())\n    self.assertTrue(self.mon.InventoryIsNone())\n\n  def test_empty_monster_inventory_vector(self):\n    b = flatbuffers.Builder(0)\n    _MONSTER.MonsterStartInventoryVector(b, 0)\n    inv = b.EndVector()\n    _MONSTER.MonsterStart(b)\n    _MONSTER.MonsterAddInventory(b, inv)\n    mon = _MONSTER.MonsterEnd(b)\n    b.Finish(mon)\n    mon2 = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())\n    self.assertFalse(mon2.InventoryIsNone())\n\n  def test_default_monster_color(self):\n    self.assertEqual(_COLOR.Color.Blue, self.mon.Color())\n\n  def test_nondefault_monster_color(self):\n    b = flatbuffers.Builder(0)\n    color = _COLOR.Color.Red\n    _MONSTER.MonsterStart(b)\n    _MONSTER.MonsterAddColor(b, color)\n    mon = _MONSTER.MonsterEnd(b)\n    b.Finish(mon)\n\n    mon2 = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())\n    self.assertEqual(_COLOR.Color.Red, mon2.Color())\n\n  def test_default_monster_testtype(self):\n    self.assertEqual(0, self.mon.TestType())\n\n  def test_default_monster_test_field(self):\n    self.assertEqual(None, self.mon.Test())\n\n  def test_default_monster_test4_item(self):\n    self.assertEqual(None, self.mon.Test4(0))\n\n  def test_default_monster_test4_length(self):\n    self.assertEqual(0, self.mon.Test4Length())\n    self.assertTrue(self.mon.Test4IsNone())\n\n  def test_empty_monster_test4_vector(self):\n    b = flatbuffers.Builder(0)\n    _MONSTER.MonsterStartTest4Vector(b, 0)\n    test4 = b.EndVector()\n    _MONSTER.MonsterStart(b)\n    _MONSTER.MonsterAddTest4(b, test4)\n    mon = _MONSTER.MonsterEnd(b)\n    b.Finish(mon)\n    mon2 = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())\n    self.assertFalse(mon2.Test4IsNone())\n\n  def test_default_monster_testarrayofstring(self):\n    self.assertEqual('', self.mon.Testarrayofstring(0))\n\n  def test_default_monster_testarrayofstring_length(self):\n    self.assertEqual(0, self.mon.TestarrayofstringLength())\n    self.assertTrue(self.mon.TestarrayofstringIsNone())\n\n  def test_empty_monster_testarrayofstring_vector(self):\n    b = flatbuffers.Builder(0)\n    _MONSTER.MonsterStartTestarrayofstringVector(b, 0)\n    testarrayofstring = b.EndVector()\n    _MONSTER.MonsterStart(b)\n    _MONSTER.MonsterAddTestarrayofstring(b, testarrayofstring)\n    mon = _MONSTER.MonsterEnd(b)\n    b.Finish(mon)\n    mon2 = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())\n    self.assertFalse(mon2.TestarrayofstringIsNone())\n\n  def test_default_monster_testarrayoftables(self):\n    self.assertEqual(None, self.mon.Testarrayoftables(0))\n\n  def test_nondefault_monster_testarrayoftables(self):\n    b = flatbuffers.Builder(0)\n\n    # make a child Monster within a vector of Monsters:\n    _MONSTER.MonsterStart(b)\n    _MONSTER.MonsterAddHp(b, 99)\n    sub_monster = _MONSTER.MonsterEnd(b)\n\n    # build the vector:\n    _MONSTER.MonsterStartTestarrayoftablesVector(b, 1)\n    b.PrependUOffsetTRelative(sub_monster)\n    vec = b.EndVector()\n\n    # make the parent monster and include the vector of Monster:\n    _MONSTER.MonsterStart(b)\n    _MONSTER.MonsterAddTestarrayoftables(b, vec)\n    mon = _MONSTER.MonsterEnd(b)\n    b.Finish(mon)\n\n    # inspect the resulting data:\n    mon2 = _MONSTER.Monster.GetRootAs(b.Output(), 0)\n    self.assertEqual(99, mon2.Testarrayoftables(0).Hp())\n    self.assertEqual(1, mon2.TestarrayoftablesLength())\n    self.assertFalse(mon2.TestarrayoftablesIsNone())\n\n  def test_default_monster_testarrayoftables_length(self):\n    self.assertEqual(0, self.mon.TestarrayoftablesLength())\n    self.assertTrue(self.mon.TestarrayoftablesIsNone())\n\n  def test_empty_monster_testarrayoftables_vector(self):\n    b = flatbuffers.Builder(0)\n    _MONSTER.MonsterStartTestarrayoftablesVector(b, 0)\n    testarrayoftables = b.EndVector()\n    _MONSTER.MonsterStart(b)\n    _MONSTER.MonsterAddTestarrayoftables(b, testarrayoftables)\n    mon = _MONSTER.MonsterEnd(b)\n    b.Finish(mon)\n    mon2 = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())\n    self.assertFalse(mon2.TestarrayoftablesIsNone())\n\n  def test_default_monster_testarrayoftables_length(self):\n    self.assertEqual(0, self.mon.TestarrayoftablesLength())\n\n  def test_nondefault_monster_enemy(self):\n    b = flatbuffers.Builder(0)\n\n    # make an Enemy object:\n    _MONSTER.MonsterStart(b)\n    _MONSTER.MonsterAddHp(b, 88)\n    enemy = _MONSTER.MonsterEnd(b)\n    b.Finish(enemy)\n\n    # make the parent monster and include the vector of Monster:\n    _MONSTER.MonsterStart(b)\n    _MONSTER.MonsterAddEnemy(b, enemy)\n    mon = _MONSTER.MonsterEnd(b)\n    b.Finish(mon)\n\n    # inspect the resulting data:\n    mon2 = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())\n    self.assertEqual(88, mon2.Enemy().Hp())\n\n  def test_default_monster_testnestedflatbuffer(self):\n    self.assertEqual(0, self.mon.Testnestedflatbuffer(0))\n\n  def test_default_monster_testnestedflatbuffer_length(self):\n    self.assertEqual(0, self.mon.TestnestedflatbufferLength())\n    self.assertTrue(self.mon.TestnestedflatbufferIsNone())\n\n  def test_empty_monster_testnestedflatbuffer_vector(self):\n    b = flatbuffers.Builder(0)\n    _MONSTER.MonsterStartTestnestedflatbufferVector(b, 0)\n    testnestedflatbuffer = b.EndVector()\n    _MONSTER.MonsterStart(b)\n    _MONSTER.MonsterAddTestnestedflatbuffer(b, testnestedflatbuffer)\n    mon = _MONSTER.MonsterEnd(b)\n    b.Finish(mon)\n    mon2 = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())\n    self.assertFalse(mon2.TestnestedflatbufferIsNone())\n\n  def test_nondefault_monster_testnestedflatbuffer(self):\n    b = flatbuffers.Builder(0)\n\n    _MONSTER.MonsterStartTestnestedflatbufferVector(b, 3)\n    b.PrependByte(4)\n    b.PrependByte(2)\n    b.PrependByte(0)\n    sub_buf = b.EndVector()\n\n    # make the parent monster and include the vector of Monster:\n    _MONSTER.MonsterStart(b)\n    _MONSTER.MonsterAddTestnestedflatbuffer(b, sub_buf)\n    mon = _MONSTER.MonsterEnd(b)\n    b.Finish(mon)\n\n    # inspect the resulting data:\n    mon2 = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())\n    self.assertEqual(3, mon2.TestnestedflatbufferLength())\n    self.assertFalse(mon2.TestnestedflatbufferIsNone())\n    self.assertEqual(0, mon2.Testnestedflatbuffer(0))\n    self.assertEqual(2, mon2.Testnestedflatbuffer(1))\n    self.assertEqual(4, mon2.Testnestedflatbuffer(2))\n    try:\n      # if numpy exists, then we should be able to get the\n      # vector as a numpy array\n      import numpy as np\n\n      self.assertEqual([0, 2, 4], mon2.TestnestedflatbufferAsNumpy().tolist())\n    except ImportError:\n      assertRaises(\n          self,\n          lambda: mon2.TestnestedflatbufferAsNumpy(),\n          NumpyRequiredForThisFeature,\n      )\n\n  def test_nested_monster_testnestedflatbuffer(self):\n    b = flatbuffers.Builder(0)\n\n    # build another monster to nest inside testnestedflatbuffer\n    nestedB = flatbuffers.Builder(0)\n    nameStr = nestedB.CreateString('Nested Monster')\n    _MONSTER.MonsterStart(nestedB)\n    _MONSTER.MonsterAddHp(nestedB, 30)\n    _MONSTER.MonsterAddName(nestedB, nameStr)\n    nestedMon = _MONSTER.MonsterEnd(nestedB)\n    nestedB.Finish(nestedMon)\n\n    # write the nested FB bytes\n    sub_buf = _MONSTER.MonsterMakeTestnestedflatbufferVectorFromBytes(\n        b, nestedB.Output()\n    )\n\n    # make the parent monster and include the bytes of the nested monster\n    _MONSTER.MonsterStart(b)\n    _MONSTER.MonsterAddTestnestedflatbuffer(b, sub_buf)\n    mon = _MONSTER.MonsterEnd(b)\n    b.Finish(mon)\n\n    # inspect the resulting data:\n    mon2 = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())\n    nestedMon2 = mon2.TestnestedflatbufferNestedRoot()\n    self.assertEqual(b'Nested Monster', nestedMon2.Name())\n    self.assertEqual(30, nestedMon2.Hp())\n\n  def test_nondefault_monster_testempty(self):\n    b = flatbuffers.Builder(0)\n\n    # make a Stat object:\n    _STAT.StatStart(b)\n    _STAT.StatAddVal(b, 123)\n    my_stat = _STAT.StatEnd(b)\n    b.Finish(my_stat)\n\n    # include the stat object in a monster:\n    _MONSTER.MonsterStart(b)\n    _MONSTER.MonsterAddTestempty(b, my_stat)\n    mon = _MONSTER.MonsterEnd(b)\n    b.Finish(mon)\n\n    # inspect the resulting data:\n    mon2 = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())\n    self.assertEqual(123, mon2.Testempty().Val())\n\n  def test_default_monster_testbool(self):\n    self.assertFalse(self.mon.Testbool())\n\n  def test_nondefault_monster_testbool(self):\n    b = flatbuffers.Builder(0)\n    _MONSTER.MonsterStart(b)\n    _MONSTER.MonsterAddTestbool(b, True)\n    mon = _MONSTER.MonsterEnd(b)\n    b.Finish(mon)\n\n    # inspect the resulting data:\n    mon2 = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())\n    self.assertTrue(mon2.Testbool())\n\n  def test_default_monster_testhashes(self):\n    self.assertEqual(0, self.mon.Testhashs32Fnv1())\n    self.assertEqual(0, self.mon.Testhashu32Fnv1())\n    self.assertEqual(0, self.mon.Testhashs64Fnv1())\n    self.assertEqual(0, self.mon.Testhashu64Fnv1())\n    self.assertEqual(0, self.mon.Testhashs32Fnv1a())\n    self.assertEqual(0, self.mon.Testhashu32Fnv1a())\n    self.assertEqual(0, self.mon.Testhashs64Fnv1a())\n    self.assertEqual(0, self.mon.Testhashu64Fnv1a())\n\n  def test_nondefault_monster_testhashes(self):\n    b = flatbuffers.Builder(0)\n    _MONSTER.MonsterStart(b)\n    _MONSTER.MonsterAddTesthashs32Fnv1(b, 1)\n    _MONSTER.MonsterAddTesthashu32Fnv1(b, 2)\n    _MONSTER.MonsterAddTesthashs64Fnv1(b, 3)\n    _MONSTER.MonsterAddTesthashu64Fnv1(b, 4)\n    _MONSTER.MonsterAddTesthashs32Fnv1a(b, 5)\n    _MONSTER.MonsterAddTesthashu32Fnv1a(b, 6)\n    _MONSTER.MonsterAddTesthashs64Fnv1a(b, 7)\n    _MONSTER.MonsterAddTesthashu64Fnv1a(b, 8)\n    mon = _MONSTER.MonsterEnd(b)\n    b.Finish(mon)\n\n    # inspect the resulting data:\n    mon2 = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())\n    self.assertEqual(1, mon2.Testhashs32Fnv1())\n    self.assertEqual(2, mon2.Testhashu32Fnv1())\n    self.assertEqual(3, mon2.Testhashs64Fnv1())\n    self.assertEqual(4, mon2.Testhashu64Fnv1())\n    self.assertEqual(5, mon2.Testhashs32Fnv1a())\n    self.assertEqual(6, mon2.Testhashu32Fnv1a())\n    self.assertEqual(7, mon2.Testhashs64Fnv1a())\n    self.assertEqual(8, mon2.Testhashu64Fnv1a())\n\n  def test_default_monster_parent_namespace_test(self):\n    self.assertEqual(None, self.mon.ParentNamespaceTest())\n\n  def test_nondefault_monster_parent_namespace_test(self):\n    b = flatbuffers.Builder(0)\n    _IN_PARENT_NAMESPACE.InParentNamespaceStart(b)\n    parent = _IN_PARENT_NAMESPACE.InParentNamespaceEnd(b)\n    _MONSTER.MonsterStart(b)\n    _MONSTER.MonsterAddParentNamespaceTest(b, parent)\n    mon = _MONSTER.MonsterEnd(b)\n    b.Finish(mon)\n\n    # Inspect the resulting data.\n    monster = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())\n    self.assertTrue(\n        isinstance(\n            monster.ParentNamespaceTest(),\n            _IN_PARENT_NAMESPACE.InParentNamespace,\n        )\n    )\n\n  def test_getrootas_for_nonroot_table(self):\n    b = flatbuffers.Builder(0)\n    string = b.CreateString('MyStat')\n\n    _STAT.StatStart(b)\n    _STAT.StatAddId(b, string)\n    _STAT.StatAddVal(b, 12345678)\n    _STAT.StatAddCount(b, 12345)\n    stat = _STAT.StatEnd(b)\n    b.Finish(stat)\n\n    stat2 = _STAT.Stat.GetRootAs(b.Bytes, b.Head())\n\n    self.assertEqual(b'MyStat', stat2.Id())\n    self.assertEqual(12345678, stat2.Val())\n    self.assertEqual(12345, stat2.Count())\n\n\nclass TestAllCodePathsOfMonsterExtraSchema(unittest.TestCase):\n\n  def setUp(self, *args, **kwargs):\n    super(TestAllCodePathsOfMonsterExtraSchema, self).setUp(*args, **kwargs)\n\n    b = flatbuffers.Builder(0)\n    MyGame.MonsterExtra.Start(b)\n    gen_mon = MyGame.MonsterExtra.End(b)\n    b.Finish(gen_mon)\n\n    self.mon = MyGame.MonsterExtra.MonsterExtra.GetRootAs(b.Bytes, b.Head())\n\n  def test_default_nan_inf(self):\n    self.assertTrue(math.isnan(self.mon.F1()))\n    self.assertEqual(self.mon.F2(), float('inf'))\n    self.assertEqual(self.mon.F3(), float('-inf'))\n\n    self.assertTrue(math.isnan(self.mon.D1()))\n    self.assertEqual(self.mon.D2(), float('inf'))\n    self.assertEqual(self.mon.D3(), float('-inf'))\n\n\nclass TestVtableDeduplication(unittest.TestCase):\n  \"\"\"TestVtableDeduplication verifies that vtables are deduplicated.\"\"\"\n\n  def test_vtable_deduplication(self):\n    b = flatbuffers.Builder(0)\n\n    b.StartObject(4)\n    b.PrependByteSlot(0, 0, 0)\n    b.PrependByteSlot(1, 11, 0)\n    b.PrependByteSlot(2, 22, 0)\n    b.PrependInt16Slot(3, 33, 0)\n    obj0 = b.EndObject()\n\n    b.StartObject(4)\n    b.PrependByteSlot(0, 0, 0)\n    b.PrependByteSlot(1, 44, 0)\n    b.PrependByteSlot(2, 55, 0)\n    b.PrependInt16Slot(3, 66, 0)\n    obj1 = b.EndObject()\n\n    b.StartObject(4)\n    b.PrependByteSlot(0, 0, 0)\n    b.PrependByteSlot(1, 77, 0)\n    b.PrependByteSlot(2, 88, 0)\n    b.PrependInt16Slot(3, 99, 0)\n    obj2 = b.EndObject()\n\n    got = b.Bytes[b.Head() :]\n\n    want = bytearray([\n        240,\n        255,\n        255,\n        255,  # == -12. offset to dedupped vtable.\n        99,\n        0,\n        88,\n        77,\n        248,\n        255,\n        255,\n        255,  # == -8. offset to dedupped vtable.\n        66,\n        0,\n        55,\n        44,\n        12,\n        0,\n        8,\n        0,\n        0,\n        0,\n        7,\n        0,\n        6,\n        0,\n        4,\n        0,\n        12,\n        0,\n        0,\n        0,\n        33,\n        0,\n        22,\n        11,\n    ])\n\n    self.assertEqual((len(want), want), (len(got), got))\n\n    table0 = flatbuffers.table.Table(b.Bytes, len(b.Bytes) - obj0)\n    table1 = flatbuffers.table.Table(b.Bytes, len(b.Bytes) - obj1)\n    table2 = flatbuffers.table.Table(b.Bytes, len(b.Bytes) - obj2)\n\n    def _checkTable(tab, voffsett_value, b, c, d):\n      # vtable size\n      got = tab.GetVOffsetTSlot(0, 0)\n      self.assertEqual(12, got, 'case 0, 0')\n\n      # object size\n      got = tab.GetVOffsetTSlot(2, 0)\n      self.assertEqual(8, got, 'case 2, 0')\n\n      # default value\n      got = tab.GetVOffsetTSlot(4, 0)\n      self.assertEqual(voffsett_value, got, 'case 4, 0')\n\n      got = tab.GetSlot(6, 0, N.Uint8Flags)\n      self.assertEqual(b, got, 'case 6, 0')\n\n      val = tab.GetSlot(8, 0, N.Uint8Flags)\n      self.assertEqual(c, val, 'failed 8, 0')\n\n      got = tab.GetSlot(10, 0, N.Uint8Flags)\n      self.assertEqual(d, got, 'failed 10, 0')\n\n    _checkTable(table0, 0, 11, 22, 33)\n    _checkTable(table1, 0, 44, 55, 66)\n    _checkTable(table2, 0, 77, 88, 99)\n\n  def test_vtable_deduplication_respects_object_size(self):\n    \"\"\"Vtables can't be shared if object sizes differ.\"\"\"\n\n    b = flatbuffers.Builder(0)\n\n    b.StartObject(1)\n    b.PrependInt32Slot(0, 1, 0)\n    first = b.EndObject()\n\n    b.StartObject(1)\n    b.PrependInt64Slot(0, 2, 0)\n    second = b.EndObject()\n    b.Finish(second)\n\n    # The second object has to point to a different vtable than the first one.\n    table_first = flatbuffers.table.Table(b.Bytes, len(b.Bytes) - first)\n    table_second = flatbuffers.table.Table(b.Bytes, len(b.Bytes) - second)\n\n    self.assertEqual(8, table_first.GetVOffsetTSlot(2, 0))\n    self.assertEqual(14, table_second.GetVOffsetTSlot(2, 0))\n\n    # Ensure two distinct vtables exist so dedup considers object size.\n    self.assertEqual(2, len(b.vtables))\n\nclass TestExceptions(unittest.TestCase):\n\n  def test_object_is_nested_error(self):\n    b = flatbuffers.Builder(0)\n    b.StartObject(0)\n    assertRaises(\n        self, lambda: b.StartObject(0), flatbuffers.builder.IsNestedError\n    )\n\n  def test_object_is_not_nested_error(self):\n    b = flatbuffers.Builder(0)\n    assertRaises(\n        self, lambda: b.EndObject(), flatbuffers.builder.IsNotNestedError\n    )\n\n  def test_struct_is_not_inline_error(self):\n    b = flatbuffers.Builder(0)\n    b.StartObject(0)\n    assertRaises(\n        self,\n        lambda: b.PrependStructSlot(0, 1, 0),\n        flatbuffers.builder.StructIsNotInlineError,\n    )\n\n  def test_unreachable_error(self):\n    b = flatbuffers.Builder(0)\n    assertRaises(\n        self,\n        lambda: b.PrependUOffsetTRelative(1),\n        flatbuffers.builder.OffsetArithmeticError,\n    )\n\n  def test_create_shared_string_is_nested_error(self):\n    b = flatbuffers.Builder(0)\n    b.StartObject(0)\n    s = 'test1'\n    assertRaises(\n        self, lambda: b.CreateSharedString(s), flatbuffers.builder.IsNestedError\n    )\n\n  def test_create_string_is_nested_error(self):\n    b = flatbuffers.Builder(0)\n    b.StartObject(0)\n    s = 'test1'\n    assertRaises(\n        self, lambda: b.CreateString(s), flatbuffers.builder.IsNestedError\n    )\n\n  def test_create_byte_vector_is_nested_error(self):\n    b = flatbuffers.Builder(0)\n    b.StartObject(0)\n    s = b'test1'\n    assertRaises(\n        self, lambda: b.CreateByteVector(s), flatbuffers.builder.IsNestedError\n    )\n\n  def test_finished_bytes_error(self):\n    b = flatbuffers.Builder(0)\n    assertRaises(\n        self, lambda: b.Output(), flatbuffers.builder.BuilderNotFinishedError\n    )\n\n\nclass TestFixedLengthArrays(unittest.TestCase):\n\n  def test_fixed_length_array(self):\n    builder = flatbuffers.Builder(0)\n\n    a = 0.5\n    b = range(0, 15)\n    c = 1\n    d_a = [[1, 2], [3, 4]]\n    d_b = [\n        MyGame.Example.TestEnum.TestEnum.B,\n        MyGame.Example.TestEnum.TestEnum.C,\n    ]\n    d_c = [\n        [\n            MyGame.Example.TestEnum.TestEnum.A,\n            MyGame.Example.TestEnum.TestEnum.B,\n        ],\n        [\n            MyGame.Example.TestEnum.TestEnum.C,\n            MyGame.Example.TestEnum.TestEnum.B,\n        ],\n    ]\n    d_d = [[-1, 1], [-2, 2]]\n    e = 2\n    f = [-1, 1]\n\n    arrayOffset = MyGame.Example.ArrayStruct.CreateArrayStruct(\n        builder, a, b, c, d_a, d_b, d_c, d_d, e, f\n    )\n\n    # Create a table with the ArrayStruct.\n    MyGame.Example.ArrayTable.Start(builder)\n    MyGame.Example.ArrayTable.AddA(builder, arrayOffset)\n    tableOffset = MyGame.Example.ArrayTable.End(builder)\n\n    builder.Finish(tableOffset)\n\n    buf = builder.Output()\n\n    table = MyGame.Example.ArrayTable.ArrayTable.GetRootAs(buf)\n\n    # Verify structure.\n    nested = MyGame.Example.NestedStruct.NestedStruct()\n    self.assertEqual(table.A().A(), 0.5)\n    self.assertEqual(\n        table.A().B(), [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]\n    )\n    self.assertEqual(table.A().C(), 1)\n    self.assertEqual(table.A().D(0).A(), [1, 2])\n    self.assertEqual(table.A().D(1).A(), [3, 4])\n    self.assertEqual(table.A().D(0).B(), MyGame.Example.TestEnum.TestEnum.B)\n    self.assertEqual(table.A().D(1).B(), MyGame.Example.TestEnum.TestEnum.C)\n    self.assertEqual(\n        table.A().D(0).C(),\n        [\n            MyGame.Example.TestEnum.TestEnum.A,\n            MyGame.Example.TestEnum.TestEnum.B,\n        ],\n    )\n    self.assertEqual(\n        table.A().D(1).C(),\n        [\n            MyGame.Example.TestEnum.TestEnum.C,\n            MyGame.Example.TestEnum.TestEnum.B,\n        ],\n    )\n    self.assertEqual(table.A().D(0).D(), [-1, 1])\n    self.assertEqual(table.A().D(1).D(), [-2, 2])\n    self.assertEqual(table.A().E(), 2)\n    self.assertEqual(table.A().F(), [-1, 1])\n    self.assertEqual(table.A().D(0).D(0), -1)\n    self.assertEqual(table.A().D(0).D(1), 1)\n    self.assertEqual(table.A().D(1).D(0), -2)\n    self.assertEqual(table.A().D(1).D(1), 2)\n\n\nclass TestNestedUnionTables(unittest.TestCase):\n\n  def test_nested_union_tables(self):\n    nestUnion = MyGame.Example.NestedUnion.NestedUnionTest.NestedUnionTestT()\n    nestUnion.name = 'testUnion1'\n    nestUnion.id = 1\n    nestUnion.data = MyGame.Example.NestedUnion.Vec3.Vec3T()\n    nestUnion.dataType = MyGame.Example.NestedUnion.Any.Any.Vec3\n    nestUnion.data.x = 4.278975356\n    nestUnion.data.y = 5.32\n    nestUnion.data.z = -6.464\n    nestUnion.data.test1 = 0.9\n    nestUnion.data.test2 = MyGame.Example.NestedUnion.Color.Color.Red\n    nestUnion.data.test3 = MyGame.Example.NestedUnion.Test.TestT()\n    nestUnion.data.test3.a = 5\n    nestUnion.data.test3.b = 2\n\n    b = flatbuffers.Builder(0)\n    b.Finish(nestUnion.Pack(b))\n\n    nestUnionDecode = (\n        MyGame.Example.NestedUnion.NestedUnionTest.NestedUnionTest.GetRootAs(\n            b.Bytes, b.Head()\n        )\n    )\n    nestUnionDecodeT = (\n        MyGame.Example.NestedUnion.NestedUnionTest.NestedUnionTestT.InitFromObj(\n            nestUnionDecode\n        )\n    )\n    self.assertEqual(nestUnionDecodeT.name, nestUnion.name)\n    self.assertEqual(nestUnionDecodeT.id, nestUnion.id)\n    self.assertEqual(nestUnionDecodeT.dataType, nestUnion.dataType)\n    self.assertEqual(nestUnionDecodeT.data.x, nestUnion.data.x)\n    self.assertEqual(nestUnionDecodeT.data.y, nestUnion.data.y)\n    self.assertEqual(nestUnionDecodeT.data.z, nestUnion.data.z)\n    self.assertEqual(nestUnionDecodeT.data.test1, nestUnion.data.test1)\n    self.assertEqual(nestUnionDecodeT.data.test2, nestUnion.data.test2)\n    self.assertEqual(nestUnionDecodeT.data.test3.a, nestUnion.data.test3.a)\n    self.assertEqual(nestUnionDecodeT.data.test3.b, nestUnion.data.test3.b)\n\n    nestUnionDecodeTFromBuf = MyGame.Example.NestedUnion.NestedUnionTest.NestedUnionTestT.InitFromPackedBuf(\n        b.Bytes, b.Head()\n    )\n    self.assertEqual(nestUnionDecodeTFromBuf.name, nestUnion.name)\n    self.assertEqual(nestUnionDecodeTFromBuf.id, nestUnion.id)\n    self.assertEqual(nestUnionDecodeTFromBuf.dataType, nestUnion.dataType)\n    self.assertEqual(nestUnionDecodeTFromBuf.data.x, nestUnion.data.x)\n    self.assertEqual(nestUnionDecodeTFromBuf.data.y, nestUnion.data.y)\n    self.assertEqual(nestUnionDecodeTFromBuf.data.z, nestUnion.data.z)\n    self.assertEqual(nestUnionDecodeTFromBuf.data.test1, nestUnion.data.test1)\n    self.assertEqual(nestUnionDecodeTFromBuf.data.test2, nestUnion.data.test2)\n    self.assertEqual(\n        nestUnionDecodeTFromBuf.data.test3.a, nestUnion.data.test3.a\n    )\n    self.assertEqual(\n        nestUnionDecodeTFromBuf.data.test3.b, nestUnion.data.test3.b\n    )\n\n    nestUnionDecodeTFromBuf2 = MyGame.Example.NestedUnion.NestedUnionTest.NestedUnionTestT.InitFromPackedBuf(\n        b.Output()\n    )\n    self.assertEqual(nestUnionDecodeTFromBuf2.name, nestUnion.name)\n    self.assertEqual(nestUnionDecodeTFromBuf2.id, nestUnion.id)\n    self.assertEqual(nestUnionDecodeTFromBuf2.dataType, nestUnion.dataType)\n    self.assertEqual(nestUnionDecodeTFromBuf2.data.x, nestUnion.data.x)\n    self.assertEqual(nestUnionDecodeTFromBuf2.data.y, nestUnion.data.y)\n    self.assertEqual(nestUnionDecodeTFromBuf2.data.z, nestUnion.data.z)\n    self.assertEqual(nestUnionDecodeTFromBuf2.data.test1, nestUnion.data.test1)\n    self.assertEqual(nestUnionDecodeTFromBuf2.data.test2, nestUnion.data.test2)\n    self.assertEqual(\n        nestUnionDecodeTFromBuf2.data.test3.a, nestUnion.data.test3.a\n    )\n    self.assertEqual(\n        nestUnionDecodeTFromBuf2.data.test3.b, nestUnion.data.test3.b\n    )\n\n\nclass TestUnionCreatorNaming(unittest.TestCase):\n  \"\"\"Tests that union creator functions use consistent naming (issue #8843).\n\n  Uses a schema with a snake_case union name (my_test_union) to verify that\n  the generated creator function name matches between definition and call site.\n  \"\"\"\n\n  def test_union_creator_pack_unpack(self):\n    \"\"\"Pack and UnPack a table with a non-UpperCamel union name.\"\"\"\n    containerT = union_name_test.Container.ContainerT()\n    containerT.uType = union_name_test.my_test_union.my_test_union.Foo\n    containerT.u = union_name_test.Foo.FooT()\n    containerT.u.val = 42\n\n    b = flatbuffers.Builder(0)\n    b.Finish(containerT.Pack(b))\n\n    container = union_name_test.Container.Container.GetRootAs(\n        b.Bytes, b.Head()\n    )\n    containerT2 = union_name_test.Container.ContainerT.InitFromObj(container)\n\n    self.assertEqual(containerT2.uType, union_name_test.my_test_union.my_test_union.Foo)\n    self.assertEqual(containerT2.u.val, 42)\n\n  def test_union_creator_with_bar(self):\n    \"\"\"Test the other union variant to ensure all branches work.\"\"\"\n    containerT = union_name_test.Container.ContainerT()\n    containerT.uType = union_name_test.my_test_union.my_test_union.Bar\n    containerT.u = union_name_test.Bar.BarT()\n    containerT.u.name = \"hello\"\n\n    b = flatbuffers.Builder(0)\n    b.Finish(containerT.Pack(b))\n\n    container = union_name_test.Container.Container.GetRootAs(\n        b.Bytes, b.Head()\n    )\n    containerT2 = union_name_test.Container.ContainerT.InitFromObj(container)\n\n    self.assertEqual(containerT2.uType, union_name_test.my_test_union.my_test_union.Bar)\n    self.assertEqual(containerT2.u.name, b\"hello\")\n\n\nclass TestBuilderClear(unittest.TestCase):\n\n  def test_consistency(self):\n    \"\"\"Checks if clear resets the state of the builder.\"\"\"\n    b = flatbuffers.Builder(0)\n\n    # Add some data to the buffer\n    off1 = b.CreateString('a' * 1024)\n    want = b.Bytes[b.Head() :]\n\n    # Reset the builder\n    b.Clear()\n\n    # Readd the same data into the buffer\n    off2 = b.CreateString('a' * 1024)\n    got = b.Bytes[b.Head() :]\n\n    # Expect to get the same data into the buffer at the same offset\n    self.assertEqual(off1, off2)\n    self.assertEqual(want, got)\n\n  def test_repeated_clear_after_builder_reuse(self):\n    init_buf = None\n    init_off = None\n    b = flatbuffers.Builder(0)\n\n    for i in range(5):\n      buf, off = make_monster_from_generated_code(b)\n      b.Clear()\n\n      if i > 0:\n        self.assertEqual(init_buf, buf)\n        self.assertEqual(init_off, off)\n      else:\n        init_buf = buf\n        init_off = off\n\n\ndef CheckAgainstGoldDataGo():\n  try:\n    gen_buf, gen_off = make_monster_from_generated_code()\n    fn = 'monsterdata_go_wire.mon'\n    if not os.path.exists(fn):\n      print('Go-generated data does not exist, failed.')\n      return False\n\n    # would like to use a context manager here, but it's less\n    # backwards-compatible:\n    f = open(fn, 'rb')\n    go_wire_data = f.read()\n    f.close()\n\n    CheckReadBuffer(bytearray(go_wire_data), 0)\n    if not bytearray(gen_buf[gen_off:]) == bytearray(go_wire_data):\n      raise AssertionError('CheckAgainstGoldDataGo failed')\n  except:\n    print('Failed to test against Go-generated test data.')\n    return False\n\n  print(\n      'Can read Go-generated test data, and Python generates bytewise identical'\n      ' data.'\n  )\n  return True\n\n\ndef CheckAgainstGoldDataJava():\n  try:\n    gen_buf, gen_off = make_monster_from_generated_code()\n    fn = 'monsterdata_java_wire.mon'\n    if not os.path.exists(fn):\n      print('Java-generated data does not exist, failed.')\n      return False\n    f = open(fn, 'rb')\n    java_wire_data = f.read()\n    f.close()\n\n    CheckReadBuffer(bytearray(java_wire_data), 0)\n  except:\n    print('Failed to read Java-generated test data.')\n    return False\n\n  print('Can read Java-generated test data.')\n  return True\n\n\nclass LCG(object):\n  \"\"\"Include simple random number generator to ensure results will be the\n\n  same cross platform.\n  http://en.wikipedia.org/wiki/Park%E2%80%93Miller_random_number_generator\n  \"\"\"\n\n  __slots__ = ['n']\n\n  InitialLCGSeed = 48271\n\n  def __init__(self):\n    self.n = self.InitialLCGSeed\n\n  def Reset(self):\n    self.n = self.InitialLCGSeed\n\n  def Next(self):\n    self.n = ((self.n * 279470273) % 4294967291) & 0xFFFFFFFF\n    return self.n\n\n\ndef BenchmarkVtableDeduplication(count):\n  \"\"\"BenchmarkVtableDeduplication measures the speed of vtable deduplication\n\n  by creating `prePop` vtables, then populating `count` objects with a\n  different single vtable.\n\n  When count is large (as in long benchmarks), memory usage may be high.\n  \"\"\"\n\n  for prePop in (1, 10, 100, 1000):\n    builder = flatbuffers.Builder(0)\n    n = 1 + int(math.log(prePop, 1.5))\n\n    # generate some layouts:\n    layouts = set()\n    r = list(compat_range(n))\n    while len(layouts) < prePop:\n      layouts.add(tuple(sorted(random.sample(r, int(max(1, n / 2))))))\n\n    layouts = list(layouts)\n\n    # pre-populate vtables:\n    for layout in layouts:\n      builder.StartObject(n)\n      for j in layout:\n        builder.PrependInt16Slot(j, j, 0)\n      builder.EndObject()\n\n    # benchmark deduplication of a new vtable:\n    def f():\n      layout = random.choice(layouts)\n      builder.StartObject(n)\n      for j in layout:\n        builder.PrependInt16Slot(j, j, 0)\n      builder.EndObject()\n\n    duration = timeit.timeit(stmt=f, number=count)\n    rate = float(count) / duration\n    print((\n        'vtable deduplication rate (n=%d, vtables=%d): %.2f sec'\n        % (prePop, len(builder.vtables), rate)\n    ))\n\n\ndef BenchmarkCheckReadBuffer(count, buf, off):\n  \"\"\"BenchmarkCheckReadBuffer measures the speed of flatbuffer reading\n\n  by re-using the CheckReadBuffer function with the gold data.\n  \"\"\"\n\n  def f():\n    CheckReadBuffer(buf, off)\n\n  duration = timeit.timeit(stmt=f, number=count)\n  rate = float(count) / duration\n  data = float(len(buf) * count) / float(1024 * 1024)\n  data_rate = data / float(duration)\n\n  print(\n      'traversed %d %d-byte flatbuffers in %.2fsec: %.2f/sec, %.2fMB/sec'\n      % (count, len(buf), duration, rate, data_rate)\n  )\n\n\ndef BenchmarkMakeMonsterFromGeneratedCode(count, length):\n  \"\"\"BenchmarkMakeMonsterFromGeneratedCode measures the speed of flatbuffer\n\n  creation by re-using the make_monster_from_generated_code function for\n  generating gold data examples.\n  \"\"\"\n\n  duration = timeit.timeit(stmt=make_monster_from_generated_code, number=count)\n  rate = float(count) / duration\n  data = float(length * count) / float(1024 * 1024)\n  data_rate = data / float(duration)\n\n  print((\n      'built %d %d-byte flatbuffers in %.2fsec: %.2f/sec, %.2fMB/sec'\n      % (count, length, duration, rate, data_rate)\n  ))\n\n\ndef BenchmarkBuilderClear(count, length):\n  b = flatbuffers.Builder(length)\n  duration = timeit.timeit(\n      stmt=lambda: make_monster_from_generated_code(b), number=count\n  )\n  rate = float(count) / duration\n  data = float(length * count) / float(1024 * 1024)\n  data_rate = data / float(duration)\n\n  print((\n      'built %d %d-byte flatbuffers (reused buffer) in %.2fsec:'\n      ' %.2f/sec, %.2fMB/sec' % (count, length, duration, rate, data_rate)\n  ))\n\n\ndef backward_compatible_run_tests(**kwargs):\n  if PY_VERSION < (2, 6):\n    sys.stderr.write('Python version less than 2.6 are not supported')\n    sys.stderr.flush()\n    return False\n\n  # python2.6 has a reduced-functionality unittest.main function:\n  if PY_VERSION == (2, 6):\n    try:\n      unittest.main(**kwargs)\n    except SystemExit as e:\n      if not e.code == 0:\n        return False\n    return True\n\n  # python2.7 and above let us not exit once unittest.main is run:\n  kwargs['exit'] = False\n  kwargs['verbosity'] = 0\n  ret = unittest.main(**kwargs)\n  if ret.result.errors or ret.result.failures:\n    return False\n\n  return True\n\n\ndef main():\n  import os\n  import sys\n\n  if not len(sys.argv) == 6:\n    sys.stderr.write(\n        'Usage: %s <benchmark vtable count> '\n        '<benchmark read count> <benchmark build count> '\n        '<benchmark clear builder> <is_onefile>\\n'\n        % sys.argv[0]\n    )\n    sys.stderr.write(\n        '       Provide COMPARE_GENERATED_TO_GO=1   to check'\n        'for bytewise comparison to Go data.\\n'\n    )\n    sys.stderr.write(\n        '       Provide COMPARE_GENERATED_TO_JAVA=1 to check'\n        'for bytewise comparison to Java data.\\n'\n    )\n    sys.stderr.flush()\n    sys.exit(1)\n\n  kwargs = dict(argv=sys.argv[:-5])\n\n  create_namespace_shortcut(sys.argv[5].lower() == 'true')\n\n  # show whether numpy is present, as it changes the test logic:\n  try:\n    import numpy\n\n    print('numpy available')\n  except ImportError:\n    print('numpy not available')\n\n  # run tests, and run some language comparison checks if needed:\n  success = backward_compatible_run_tests(**kwargs)\n  if success and os.environ.get('COMPARE_GENERATED_TO_GO', 0) == '1':\n    success = success and CheckAgainstGoldDataGo()\n  if success and os.environ.get('COMPARE_GENERATED_TO_JAVA', 0) == '1':\n    success = success and CheckAgainstGoldDataJava()\n\n  if not success:\n    sys.stderr.write('Tests failed, skipping benchmarks.\\n')\n    sys.stderr.flush()\n    sys.exit(1)\n\n  # run benchmarks (if 0, they will be a noop):\n  bench_vtable = int(sys.argv[1])\n  bench_traverse = int(sys.argv[2])\n  bench_build = int(sys.argv[3])\n  bench_clear = int(sys.argv[4])\n  if bench_vtable:\n    BenchmarkVtableDeduplication(bench_vtable)\n  if bench_traverse:\n    buf, off = make_monster_from_generated_code()\n    BenchmarkCheckReadBuffer(bench_traverse, buf, off)\n  if bench_build:\n    buf, off = make_monster_from_generated_code()\n    BenchmarkMakeMonsterFromGeneratedCode(bench_build, len(buf))\n  if bench_clear:\n    buf, off = make_monster_from_generated_code()\n    BenchmarkBuilderClear(bench_build, len(buf))\n\n\nif __name__ == '__main__':\n  main()\n"
  },
  {
    "path": "tests/reflection_test.cpp",
    "content": "#include \"reflection_test.h\"\n\n#include \"flatbuffers/minireflect.h\"\n#include \"flatbuffers/reflection.h\"\n#include \"flatbuffers/reflection_generated.h\"\n#include \"flatbuffers/verifier.h\"\n#include \"monster_test.h\"\n#include \"monster_test_generated.h\"\n#include \"test_assert.h\"\n#include \"tests/arrays_test_generated.h\"\n\nnamespace flatbuffers {\nnamespace tests {\n\nusing namespace MyGame::Example;\n\nvoid ReflectionTest(const std::string& tests_data_path, uint8_t* flatbuf,\n                    size_t length) {\n  // Load a binary schema.\n  std::string bfbsfile;\n  TEST_EQ(flatbuffers::LoadFile((tests_data_path + \"monster_test.bfbs\").c_str(),\n                                true, &bfbsfile),\n          true);\n\n  // Verify it, just in case:\n  flatbuffers::Verifier verifier(\n      reinterpret_cast<const uint8_t*>(bfbsfile.c_str()), bfbsfile.length());\n  TEST_EQ(reflection::VerifySchemaBuffer(verifier), true);\n\n  // Make sure the schema is what we expect it to be.\n  auto& schema = *reflection::GetSchema(bfbsfile.c_str());\n  auto root_table = schema.root_table();\n\n  // Check the declaration files.\n  TEST_EQ_STR(root_table->name()->c_str(), \"MyGame.Example.Monster\");\n  TEST_EQ_STR(root_table->declaration_file()->c_str(), \"//monster_test.fbs\");\n  TEST_EQ_STR(\n      schema.objects()->LookupByKey(\"TableA\")->declaration_file()->c_str(),\n      \"//include_test/include_test1.fbs\");\n  TEST_EQ_STR(schema.objects()\n                  ->LookupByKey(\"MyGame.OtherNameSpace.Unused\")\n                  ->declaration_file()\n                  ->c_str(),\n              \"//include_test/sub/include_test2.fbs\");\n  TEST_EQ_STR(schema.enums()\n                  ->LookupByKey(\"MyGame.OtherNameSpace.FromInclude\")\n                  ->declaration_file()\n                  ->c_str(),\n              \"//include_test/sub/include_test2.fbs\");\n\n  // Check scheam filenames and their includes.\n  TEST_EQ(schema.fbs_files()->size(), 3);\n\n  const auto fbs0 = schema.fbs_files()->Get(0);\n  TEST_EQ_STR(fbs0->filename()->c_str(), \"//include_test/include_test1.fbs\");\n  const auto fbs0_includes = fbs0->included_filenames();\n  TEST_EQ(fbs0_includes->size(), 2);\n\n  // TODO(caspern): Should we force or disallow inclusion of self?\n  TEST_EQ_STR(fbs0_includes->Get(0)->c_str(),\n              \"//include_test/include_test1.fbs\");\n  TEST_EQ_STR(fbs0_includes->Get(1)->c_str(),\n              \"//include_test/sub/include_test2.fbs\");\n\n  const auto fbs1 = schema.fbs_files()->Get(1);\n  TEST_EQ_STR(fbs1->filename()->c_str(),\n              \"//include_test/sub/include_test2.fbs\");\n  const auto fbs1_includes = fbs1->included_filenames();\n  TEST_EQ(fbs1_includes->size(), 2);\n  TEST_EQ_STR(fbs1_includes->Get(0)->c_str(),\n              \"//include_test/include_test1.fbs\");\n  TEST_EQ_STR(fbs1_includes->Get(1)->c_str(),\n              \"//include_test/sub/include_test2.fbs\");\n\n  const auto fbs2 = schema.fbs_files()->Get(2);\n  TEST_EQ_STR(fbs2->filename()->c_str(), \"//monster_test.fbs\");\n  const auto fbs2_includes = fbs2->included_filenames();\n  TEST_EQ(fbs2_includes->size(), 1);\n  TEST_EQ_STR(fbs2_includes->Get(0)->c_str(),\n              \"//include_test/include_test1.fbs\");\n\n  // Check Root table fields\n  auto fields = root_table->fields();\n  auto hp_field_ptr = fields->LookupByKey(\"hp\");\n  TEST_NOTNULL(hp_field_ptr);\n  auto& hp_field = *hp_field_ptr;\n  TEST_EQ_STR(hp_field.name()->c_str(), \"hp\");\n  TEST_EQ(hp_field.id(), 2);\n  TEST_EQ(hp_field.type()->base_type(), reflection::Short);\n\n  auto friendly_field_ptr = fields->LookupByKey(\"friendly\");\n  TEST_NOTNULL(friendly_field_ptr);\n  TEST_NOTNULL(friendly_field_ptr->attributes());\n  TEST_NOTNULL(friendly_field_ptr->attributes()->LookupByKey(\"priority\"));\n\n  // Make sure the table index is what we expect it to be.\n  auto pos_field_ptr = fields->LookupByKey(\"pos\");\n  TEST_NOTNULL(pos_field_ptr);\n  TEST_EQ(pos_field_ptr->type()->base_type(), reflection::Obj);\n  auto pos_table_ptr = schema.objects()->Get(pos_field_ptr->type()->index());\n  TEST_NOTNULL(pos_table_ptr);\n  TEST_EQ_STR(pos_table_ptr->name()->c_str(), \"MyGame.Example.Vec3\");\n\n  // Test nullability of fields: hp is a 0-default scalar, pos is a struct =>\n  // optional, and name is a required string => not optional.\n  TEST_EQ(hp_field.optional(), false);\n  TEST_EQ(pos_field_ptr->optional(), true);\n  TEST_EQ(fields->LookupByKey(\"name\")->optional(), false);\n\n  // Now use it to dynamically access a buffer.\n  auto& root = *flatbuffers::GetAnyRoot(flatbuf);\n\n  // Verify the buffer first using reflection based verification\n  TEST_EQ(flatbuffers::Verify(schema, *schema.root_table(), flatbuf, length),\n          true);\n\n  auto hp = flatbuffers::GetFieldI<uint16_t>(root, hp_field);\n  TEST_EQ(hp, 80);\n\n  // Rather than needing to know the type, we can also get the value of\n  // any field as an int64_t/double/string, regardless of what it actually is.\n  auto hp_int64 = flatbuffers::GetAnyFieldI(root, hp_field);\n  TEST_EQ(hp_int64, 80);\n  auto hp_double = flatbuffers::GetAnyFieldF(root, hp_field);\n  TEST_EQ(hp_double, 80.0);\n  auto hp_string = flatbuffers::GetAnyFieldS(root, hp_field, &schema);\n  TEST_EQ_STR(hp_string.c_str(), \"80\");\n\n  // Get struct field through reflection\n  auto pos_struct = flatbuffers::GetFieldStruct(root, *pos_field_ptr);\n  TEST_NOTNULL(pos_struct);\n  TEST_EQ(flatbuffers::GetAnyFieldF(*pos_struct,\n                                    *pos_table_ptr->fields()->LookupByKey(\"z\")),\n          3.0f);\n\n  auto test3_field = pos_table_ptr->fields()->LookupByKey(\"test3\");\n  auto test3_struct = flatbuffers::GetFieldStruct(*pos_struct, *test3_field);\n  TEST_NOTNULL(test3_struct);\n  auto test3_object = schema.objects()->Get(test3_field->type()->index());\n\n  TEST_EQ(flatbuffers::GetAnyFieldF(*test3_struct,\n                                    *test3_object->fields()->LookupByKey(\"a\")),\n          10);\n\n  // We can also modify it.\n  flatbuffers::SetField<uint16_t>(&root, hp_field, 200);\n  hp = flatbuffers::GetFieldI<uint16_t>(root, hp_field);\n  TEST_EQ(hp, 200);\n\n  // We can also set fields generically:\n  flatbuffers::SetAnyFieldI(&root, hp_field, 300);\n  hp_int64 = flatbuffers::GetAnyFieldI(root, hp_field);\n  TEST_EQ(hp_int64, 300);\n  flatbuffers::SetAnyFieldF(&root, hp_field, 300.5);\n  hp_int64 = flatbuffers::GetAnyFieldI(root, hp_field);\n  TEST_EQ(hp_int64, 300);\n  flatbuffers::SetAnyFieldS(&root, hp_field, \"300\");\n  hp_int64 = flatbuffers::GetAnyFieldI(root, hp_field);\n  TEST_EQ(hp_int64, 300);\n\n  // Test buffer is valid after the modifications\n  TEST_EQ(flatbuffers::Verify(schema, *schema.root_table(), flatbuf, length),\n          true);\n\n  // Reset it, for further tests.\n  flatbuffers::SetField<uint16_t>(&root, hp_field, 80);\n\n  // More advanced functionality: changing the size of items in-line!\n  // First we put the FlatBuffer inside an std::vector.\n  std::vector<uint8_t> resizingbuf(flatbuf, flatbuf + length);\n  // Find the field we want to modify.\n  auto& name_field = *fields->LookupByKey(\"name\");\n  // Get the root.\n  // This time we wrap the result from GetAnyRoot in a smartpointer that\n  // will keep rroot valid as resizingbuf resizes.\n  auto rroot = flatbuffers::piv(flatbuffers::GetAnyRoot(resizingbuf.data()),\n                                resizingbuf);\n  SetString(schema, \"totally new string\", GetFieldS(**rroot, name_field),\n            &resizingbuf);\n  // Here resizingbuf has changed, but rroot is still valid.\n  TEST_EQ_STR(GetFieldS(**rroot, name_field)->c_str(), \"totally new string\");\n  // Now lets extend a vector by 100 elements (10 -> 110).\n  auto& inventory_field = *fields->LookupByKey(\"inventory\");\n  auto rinventory = flatbuffers::piv(\n      flatbuffers::GetFieldV<uint8_t>(**rroot, inventory_field), resizingbuf);\n  flatbuffers::ResizeVector<uint8_t>(schema, 110, 50, *rinventory,\n                                     &resizingbuf);\n  // rinventory still valid, so lets read from it.\n  TEST_EQ(rinventory->Get(10), 50);\n\n  // For reflection uses not covered already, there is a more powerful way:\n  // we can simply generate whatever object we want to add/modify in a\n  // FlatBuffer of its own, then add that to an existing FlatBuffer:\n  // As an example, let's add a string to an array of strings.\n  // First, find our field:\n  auto& testarrayofstring_field = *fields->LookupByKey(\"testarrayofstring\");\n  // Find the vector value:\n  auto rtestarrayofstring = flatbuffers::piv(\n      flatbuffers::GetFieldV<flatbuffers::Offset<flatbuffers::String>>(\n          **rroot, testarrayofstring_field),\n      resizingbuf);\n  // It's a vector of 2 strings, to which we add one more, initialized to\n  // offset 0.\n  flatbuffers::ResizeVector<flatbuffers::Offset<flatbuffers::String>>(\n      schema, 3, 0, *rtestarrayofstring, &resizingbuf);\n  // Here we just create a buffer that contans a single string, but this\n  // could also be any complex set of tables and other values.\n  flatbuffers::FlatBufferBuilder stringfbb;\n  stringfbb.Finish(stringfbb.CreateString(\"hank\"));\n  // Add the contents of it to our existing FlatBuffer.\n  // We do this last, so the pointer doesn't get invalidated (since it is\n  // at the end of the buffer):\n  auto string_ptr = flatbuffers::AddFlatBuffer(\n      resizingbuf, stringfbb.GetBufferPointer(), stringfbb.GetSize());\n  // Finally, set the new value in the vector.\n  rtestarrayofstring->MutateOffset(2, string_ptr);\n  TEST_EQ_STR(rtestarrayofstring->Get(0)->c_str(), \"bob\");\n  TEST_EQ_STR(rtestarrayofstring->Get(2)->c_str(), \"hank\");\n  // Test integrity of all resize operations above.\n  flatbuffers::Verifier resize_verifier(\n      reinterpret_cast<const uint8_t*>(resizingbuf.data()), resizingbuf.size());\n  TEST_EQ(VerifyMonsterBuffer(resize_verifier), true);\n\n  // Test buffer is valid using reflection as well\n  TEST_EQ(flatbuffers::Verify(schema, *schema.root_table(), resizingbuf.data(),\n                              resizingbuf.size()),\n          true);\n\n  // As an additional test, also set it on the name field.\n  // Note: unlike the name change above, this just overwrites the offset,\n  // rather than changing the string in-place.\n  SetFieldT(*rroot, name_field, string_ptr);\n  TEST_EQ_STR(GetFieldS(**rroot, name_field)->c_str(), \"hank\");\n\n  // Using reflection, rather than mutating binary FlatBuffers, we can also copy\n  // tables and other things out of other FlatBuffers into a FlatBufferBuilder,\n  // either part or whole.\n  flatbuffers::FlatBufferBuilder fbb;\n  auto root_offset = flatbuffers::CopyTable(\n      fbb, schema, *root_table, *flatbuffers::GetAnyRoot(flatbuf), true);\n  fbb.Finish(root_offset, MonsterIdentifier());\n  // Test that it was copied correctly:\n  AccessFlatBufferTest(fbb.GetBufferPointer(), fbb.GetSize());\n\n  // Test buffer is valid using reflection as well\n  TEST_EQ(flatbuffers::Verify(schema, *schema.root_table(),\n                              fbb.GetBufferPointer(), fbb.GetSize()),\n          true);\n}\n\nvoid MiniReflectFlatBuffersTest(uint8_t* flatbuf) {\n  auto s =\n      flatbuffers::FlatBufferToString(flatbuf, Monster::MiniReflectTypeTable());\n  TEST_EQ_STR(\n      s.c_str(),\n      \"{ \"\n      \"pos: { x: 1.0, y: 2.0, z: 3.0, test1: 0.0, test2: Red, test3: \"\n      \"{ a: 10, b: 20 } }, \"\n      \"hp: 80, \"\n      \"name: \\\"MyMonster\\\", \"\n      \"inventory: [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], \"\n      \"test_type: Monster, \"\n      \"test: { name: \\\"Fred\\\" }, \"\n      \"test4: [ { a: 10, b: 20 }, { a: 30, b: 40 } ], \"\n      \"testarrayofstring: [ \\\"bob\\\", \\\"fred\\\", \\\"bob\\\", \\\"fred\\\" ], \"\n      \"testarrayoftables: [ { hp: 1000, name: \\\"Barney\\\" }, { name: \\\"Fred\\\" \"\n      \"}, \"\n      \"{ name: \\\"Wilma\\\" } ], \"\n      // TODO(wvo): should really print this nested buffer correctly.\n      \"testnestedflatbuffer: [ 124, 0, 0, 0, 77, 79, 78, 83, 0, 0, 114, 0, 16, \"\n      \"0, 0, 0, 4, 0, 6, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \"\n      \"0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \"\n      \"0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \"\n      \"0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \"\n      \"0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 114, 0, 0, 0, 0, 0, 0, 0, \"\n      \"8, 0, 0, 0, 0, 0, 192, 127, 13, 0, 0, 0, 78, 101, 115, 116, 101, 100, \"\n      \"77, 111, 110, 115, 116, 101, 114, 0, 0, 0 ], \"\n      \"testarrayofstring2: [ \\\"jane\\\", \\\"mary\\\" ], \"\n      \"testarrayofsortedstruct: [ { id: 0, distance: 0 }, \"\n      \"{ id: 2, distance: 20 }, { id: 3, distance: 30 }, \"\n      \"{ id: 4, distance: 40 } ], \"\n      \"flex: [ 210, 4, 5, 2 ], \"\n      \"test5: [ { a: 10, b: 20 }, { a: 30, b: 40 } ], \"\n      \"vector_of_enums: [ Blue, Green ], \"\n      \"scalar_key_sorted_tables: [ { id: \\\"miss\\\" } ], \"\n      \"nan_default: nan \"\n      \"}\");\n\n  Test test(16, 32);\n  Vec3 vec(1, 2, 3, 1.5, Color_Red, test);\n  flatbuffers::FlatBufferBuilder vec_builder;\n  vec_builder.Finish(vec_builder.CreateStruct(vec));\n  auto vec_buffer = vec_builder.Release();\n  auto vec_str = flatbuffers::FlatBufferToString(vec_buffer.data(),\n                                                 Vec3::MiniReflectTypeTable());\n  TEST_EQ_STR(vec_str.c_str(),\n              \"{ x: 1.0, y: 2.0, z: 3.0, test1: 1.5, test2: Red, test3: { a: \"\n              \"16, b: 32 } }\");\n}\n\nvoid MiniReflectFixedLengthArrayTest() {\n  // VS10 does not support typed enums, exclude from tests\n#if !defined(_MSC_VER) || _MSC_VER >= 1700\n  flatbuffers::FlatBufferBuilder fbb;\n  MyGame::Example::ArrayStruct aStruct(2, 12, 1);\n  auto aTable = MyGame::Example::CreateArrayTable(fbb, &aStruct);\n  fbb.Finish(aTable);\n\n  auto flatbuf = fbb.Release();\n  auto s = flatbuffers::FlatBufferToString(\n      flatbuf.data(), MyGame::Example::ArrayTableTypeTable());\n  TEST_EQ_STR(\n      \"{ \"\n      \"a: { a: 2.0, \"\n      \"b: [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], \"\n      \"c: 12, \"\n      \"d: [ { a: [ 0, 0 ], b: A, c: [ A, A ], d: [ 0, 0 ] }, \"\n      \"{ a: [ 0, 0 ], b: A, c: [ A, A ], d: [ 0, 0 ] } ], \"\n      \"e: 1, f: [ 0, 0 ] } \"\n      \"}\",\n      s.c_str());\n#endif\n}\n\n}  // namespace tests\n}  // namespace flatbuffers\n"
  },
  {
    "path": "tests/reflection_test.h",
    "content": "#ifndef TESTS_REFLECTION_TEST_H\n#define TESTS_REFLECTION_TEST_H\n\n#include <stdint.h>\n\n#include <string>\n\nnamespace flatbuffers {\nnamespace tests {\n\nvoid ReflectionTest(const std::string& tests_data_path, uint8_t* flatbuf,\n                    size_t length);\nvoid MiniReflectFixedLengthArrayTest();\nvoid MiniReflectFlatBuffersTest(uint8_t* flatbuf);\n\n}  // namespace tests\n}  // namespace flatbuffers\n\n#endif\n"
  },
  {
    "path": "tests/required_strings.fbs",
    "content": "namespace required_strings;\n\n/**\n * Foo defines a type where both fields are mandatory.\n * The creation of a Foo buffer must throw if either of the fields is missing.\n *\n * https://github.com/google/flatbuffers/issues/7739\n */\ntable Foo {\n  str_a:string (required);\n  str_b:string (required);\n}\n"
  },
  {
    "path": "tests/rust_namer_test/mod.rs",
    "content": "// Automatically generated by the Flatbuffers compiler. Do not modify.\n// @generated\npub mod rust_namer_test {\n    use super::*;\n    mod field_union_generated;\n    pub use self::field_union_generated::*;\n    mod game_message_generated;\n    pub use self::game_message_generated::*;\n    mod field_table_generated;\n    pub use self::field_table_generated::*;\n    mod root_table_generated;\n    pub use self::root_table_generated::*;\n    mod player_stat_event_generated;\n    pub use self::player_stat_event_generated::*;\n    mod player_spectate_generated;\n    pub use self::player_spectate_generated::*;\n    mod player_input_change_generated;\n    pub use self::player_input_change_generated::*;\n    mod game_message_wrapper_generated;\n    pub use self::game_message_wrapper_generated::*;\n    mod possibly_reserved_words_generated;\n    pub use self::possibly_reserved_words_generated::*;\n} // rust_namer_test\n"
  },
  {
    "path": "tests/rust_namer_test/rust_namer_test/field_table_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum FieldTableOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct FieldTable<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for FieldTable<'a> {\n    type Inner = FieldTable<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> FieldTable<'a> {\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"RustNamerTest.FieldTable\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        FieldTable { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        _args: &'args FieldTableArgs\n    ) -> ::flatbuffers::WIPOffset<FieldTable<'bldr>> {\n        let mut builder = FieldTableBuilder::new(_fbb);\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> FieldTableT {\n        FieldTableT {\n        }\n    }\n}\n\nimpl ::flatbuffers::Verifiable for FieldTable<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct FieldTableArgs {\n}\n\nimpl<'a> Default for FieldTableArgs {\n    #[inline]\n    fn default() -> Self {\n        FieldTableArgs {\n        }\n    }\n}\n\npub struct FieldTableBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> FieldTableBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> FieldTableBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        FieldTableBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<FieldTable<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for FieldTable<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"FieldTable\");\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct FieldTableT {\n}\n\nimpl Default for FieldTableT {\n    fn default() -> Self {\n        Self {\n        }\n    }\n}\n\nimpl FieldTableT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<FieldTable<'b>> {\n        FieldTable::create(_fbb, &FieldTableArgs{\n        })\n    }\n}\n"
  },
  {
    "path": "tests/rust_namer_test/rust_namer_test/field_union_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MIN_FIELD_UNION: u8 = 0;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MAX_FIELD_UNION: u8 = 1;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n#[allow(non_camel_case_types)]\npub const ENUM_VALUES_FIELD_UNION: [FieldUnion; 2] = [\n    FieldUnion::NONE,\n    FieldUnion::f,\n];\n\n#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n#[repr(transparent)]\npub struct FieldUnion(pub u8);\n\n#[allow(non_upper_case_globals)]\nimpl FieldUnion {\n    pub const NONE: Self = Self(0);\n    pub const f: Self = Self(1);\n\n    pub const ENUM_MIN: u8 = 0;\n    pub const ENUM_MAX: u8 = 1;\n    pub const ENUM_VALUES: &'static [Self] = &[\n        Self::NONE,\n        Self::f,\n    ];\n\n    /// Returns the variant's name or \"\" if unknown.\n    pub fn variant_name(self) -> Option<&'static str> {\n        match self {\n            Self::NONE => Some(\"NONE\"),\n            Self::f => Some(\"f\"),\n            _ => None,\n        }\n    }\n}\n\nimpl ::core::fmt::Debug for FieldUnion {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        if let Some(name) = self.variant_name() {\n            f.write_str(name)\n        } else {\n            f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n        }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for FieldUnion {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<u8>(buf, loc) };\n        Self(b)\n    }\n}\n\nimpl ::flatbuffers::Push for FieldUnion {\n    type Output = FieldUnion;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<u8>(dst, self.0) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for FieldUnion {\n    type Scalar = u8;\n\n    #[inline]\n    fn to_little_endian(self) -> u8 {\n        self.0.to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: u8) -> Self {\n        let b = u8::from_le(v);\n        Self(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for FieldUnion {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        u8::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for FieldUnion {}\n\npub struct FieldUnionUnionTableOffset {}\n\n#[allow(clippy::upper_case_acronyms)]\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub enum FieldUnionT {\n    NONE,\n    F(alloc::boxed::Box<FieldTableT>),\n}\n\nimpl Default for FieldUnionT {\n    fn default() -> Self {\n        Self::NONE\n    }\n}\n\nimpl FieldUnionT {\n    pub fn field_union_type(&self) -> FieldUnion {\n        match self {\n            Self::NONE => FieldUnion::NONE,\n            Self::F(_) => FieldUnion::f,\n        }\n    }\n\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(&self, fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>) -> Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>> {\n        match self {\n            Self::NONE => None,\n            Self::F(v) => Some(v.pack(fbb).as_union_value()),\n        }\n    }\n\n    /// If the union variant matches, return the owned FieldTableT, setting the union to NONE.\n    pub fn take_f(&mut self) -> Option<alloc::boxed::Box<FieldTableT>> {\n        if let Self::F(_) = self {\n            let v = ::core::mem::replace(self, Self::NONE);\n            if let Self::F(w) = v {\n                Some(w)\n            } else {\n                unreachable!()\n            }\n        } else {\n            None\n        }\n    }\n\n    /// If the union variant matches, return a reference to the FieldTableT.\n    pub fn as_f(&self) -> Option<&FieldTableT> {\n        if let Self::F(v) = self { Some(v.as_ref()) } else { None }\n    }\n\n    /// If the union variant matches, return a mutable reference to the FieldTableT.\n    pub fn as_f_mut(&mut self) -> Option<&mut FieldTableT> {\n        if let Self::F(v) = self { Some(v.as_mut()) } else { None }\n    }\n}\n\n"
  },
  {
    "path": "tests/rust_namer_test/rust_namer_test/game_message_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MIN_GAME_MESSAGE: u8 = 0;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\npub const ENUM_MAX_GAME_MESSAGE: u8 = 3;\n\n#[deprecated(since = \"2.0.0\", note = \"Use associated constants instead. This will no longer be generated in 2021.\")]\n#[allow(non_camel_case_types)]\npub const ENUM_VALUES_GAME_MESSAGE: [GameMessage; 4] = [\n    GameMessage::NONE,\n    GameMessage::PlayerStatEvent,\n    GameMessage::PlayerSpectate,\n    GameMessage::PlayerInputChange,\n];\n\n#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\n#[repr(transparent)]\npub struct GameMessage(pub u8);\n\n#[allow(non_upper_case_globals)]\nimpl GameMessage {\n    pub const NONE: Self = Self(0);\n    pub const PlayerStatEvent: Self = Self(1);\n    pub const PlayerSpectate: Self = Self(2);\n    pub const PlayerInputChange: Self = Self(3);\n\n    pub const ENUM_MIN: u8 = 0;\n    pub const ENUM_MAX: u8 = 3;\n    pub const ENUM_VALUES: &'static [Self] = &[\n        Self::NONE,\n        Self::PlayerStatEvent,\n        Self::PlayerSpectate,\n        Self::PlayerInputChange,\n    ];\n\n    /// Returns the variant's name or \"\" if unknown.\n    pub fn variant_name(self) -> Option<&'static str> {\n        match self {\n            Self::NONE => Some(\"NONE\"),\n            Self::PlayerStatEvent => Some(\"PlayerStatEvent\"),\n            Self::PlayerSpectate => Some(\"PlayerSpectate\"),\n            Self::PlayerInputChange => Some(\"PlayerInputChange\"),\n            _ => None,\n        }\n    }\n}\n\nimpl ::core::fmt::Debug for GameMessage {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        if let Some(name) = self.variant_name() {\n            f.write_str(name)\n        } else {\n            f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))\n        }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for GameMessage {\n    type Inner = Self;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        let b = unsafe { ::flatbuffers::read_scalar_at::<u8>(buf, loc) };\n        Self(b)\n    }\n}\n\nimpl ::flatbuffers::Push for GameMessage {\n    type Output = GameMessage;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        unsafe { ::flatbuffers::emplace_scalar::<u8>(dst, self.0) };\n    }\n}\n\nimpl ::flatbuffers::EndianScalar for GameMessage {\n    type Scalar = u8;\n\n    #[inline]\n    fn to_little_endian(self) -> u8 {\n        self.0.to_le()\n    }\n\n    #[inline]\n    #[allow(clippy::wrong_self_convention)]\n    fn from_little_endian(v: u8) -> Self {\n        let b = u8::from_le(v);\n        Self(b)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for GameMessage {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        u8::run_verifier(v, pos)\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for GameMessage {}\n\npub struct GameMessageUnionTableOffset {}\n\n#[allow(clippy::upper_case_acronyms)]\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub enum GameMessageT {\n    NONE,\n    PlayerStatEvent(alloc::boxed::Box<PlayerStatEventT>),\n    PlayerSpectate(alloc::boxed::Box<PlayerSpectateT>),\n    PlayerInputChange(alloc::boxed::Box<PlayerInputChangeT>),\n}\n\nimpl Default for GameMessageT {\n    fn default() -> Self {\n        Self::NONE\n    }\n}\n\nimpl GameMessageT {\n    pub fn game_message_type(&self) -> GameMessage {\n        match self {\n            Self::NONE => GameMessage::NONE,\n            Self::PlayerStatEvent(_) => GameMessage::PlayerStatEvent,\n            Self::PlayerSpectate(_) => GameMessage::PlayerSpectate,\n            Self::PlayerInputChange(_) => GameMessage::PlayerInputChange,\n        }\n    }\n\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(&self, fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>) -> Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>> {\n        match self {\n            Self::NONE => None,\n            Self::PlayerStatEvent(v) => Some(v.pack(fbb).as_union_value()),\n            Self::PlayerSpectate(v) => Some(v.pack(fbb).as_union_value()),\n            Self::PlayerInputChange(v) => Some(v.pack(fbb).as_union_value()),\n        }\n    }\n\n    /// If the union variant matches, return the owned PlayerStatEventT, setting the union to NONE.\n    pub fn take_player_stat_event(&mut self) -> Option<alloc::boxed::Box<PlayerStatEventT>> {\n        if let Self::PlayerStatEvent(_) = self {\n            let v = ::core::mem::replace(self, Self::NONE);\n            if let Self::PlayerStatEvent(w) = v {\n                Some(w)\n            } else {\n                unreachable!()\n            }\n        } else {\n            None\n        }\n    }\n\n    /// If the union variant matches, return a reference to the PlayerStatEventT.\n    pub fn as_player_stat_event(&self) -> Option<&PlayerStatEventT> {\n        if let Self::PlayerStatEvent(v) = self { Some(v.as_ref()) } else { None }\n    }\n\n    /// If the union variant matches, return a mutable reference to the PlayerStatEventT.\n    pub fn as_player_stat_event_mut(&mut self) -> Option<&mut PlayerStatEventT> {\n        if let Self::PlayerStatEvent(v) = self { Some(v.as_mut()) } else { None }\n    }\n\n    /// If the union variant matches, return the owned PlayerSpectateT, setting the union to NONE.\n    pub fn take_player_spectate(&mut self) -> Option<alloc::boxed::Box<PlayerSpectateT>> {\n        if let Self::PlayerSpectate(_) = self {\n            let v = ::core::mem::replace(self, Self::NONE);\n            if let Self::PlayerSpectate(w) = v {\n                Some(w)\n            } else {\n                unreachable!()\n            }\n        } else {\n            None\n        }\n    }\n\n    /// If the union variant matches, return a reference to the PlayerSpectateT.\n    pub fn as_player_spectate(&self) -> Option<&PlayerSpectateT> {\n        if let Self::PlayerSpectate(v) = self { Some(v.as_ref()) } else { None }\n    }\n\n    /// If the union variant matches, return a mutable reference to the PlayerSpectateT.\n    pub fn as_player_spectate_mut(&mut self) -> Option<&mut PlayerSpectateT> {\n        if let Self::PlayerSpectate(v) = self { Some(v.as_mut()) } else { None }\n    }\n\n    /// If the union variant matches, return the owned PlayerInputChangeT, setting the union to NONE.\n    pub fn take_player_input_change(&mut self) -> Option<alloc::boxed::Box<PlayerInputChangeT>> {\n        if let Self::PlayerInputChange(_) = self {\n            let v = ::core::mem::replace(self, Self::NONE);\n            if let Self::PlayerInputChange(w) = v {\n                Some(w)\n            } else {\n                unreachable!()\n            }\n        } else {\n            None\n        }\n    }\n\n    /// If the union variant matches, return a reference to the PlayerInputChangeT.\n    pub fn as_player_input_change(&self) -> Option<&PlayerInputChangeT> {\n        if let Self::PlayerInputChange(v) = self { Some(v.as_ref()) } else { None }\n    }\n\n    /// If the union variant matches, return a mutable reference to the PlayerInputChangeT.\n    pub fn as_player_input_change_mut(&mut self) -> Option<&mut PlayerInputChangeT> {\n        if let Self::PlayerInputChange(v) = self { Some(v.as_mut()) } else { None }\n    }\n}\n\n"
  },
  {
    "path": "tests/rust_namer_test/rust_namer_test/game_message_wrapper_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum GameMessageWrapperOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct GameMessageWrapper<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for GameMessageWrapper<'a> {\n    type Inner = GameMessageWrapper<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> GameMessageWrapper<'a> {\n    pub const VT_MESSAGE_TYPE: ::flatbuffers::VOffsetT = 4;\n    pub const VT_MESSAGE: ::flatbuffers::VOffsetT = 6;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"RustNamerTest.GameMessageWrapper\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        GameMessageWrapper { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args GameMessageWrapperArgs\n    ) -> ::flatbuffers::WIPOffset<GameMessageWrapper<'bldr>> {\n        let mut builder = GameMessageWrapperBuilder::new(_fbb);\n        if let Some(x) = args.Message { builder.add_Message(x); }\n        builder.add_Message_type(args.Message_type);\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> GameMessageWrapperT {\n        let Message = match self.Message_type() {\n            GameMessage::NONE => GameMessageT::NONE,\n            GameMessage::PlayerStatEvent => GameMessageT::PlayerStatEvent(alloc::boxed::Box::new(\n                self.Message_as_player_stat_event()\n                    .expect(\"Invalid union table, expected `GameMessage::PlayerStatEvent`.\")\n                    .unpack()\n            )),\n            GameMessage::PlayerSpectate => GameMessageT::PlayerSpectate(alloc::boxed::Box::new(\n                self.Message_as_player_spectate()\n                    .expect(\"Invalid union table, expected `GameMessage::PlayerSpectate`.\")\n                    .unpack()\n            )),\n            GameMessage::PlayerInputChange => GameMessageT::PlayerInputChange(alloc::boxed::Box::new(\n                self.Message_as_player_input_change()\n                    .expect(\"Invalid union table, expected `GameMessage::PlayerInputChange`.\")\n                    .unpack()\n            )),\n            _ => GameMessageT::NONE,\n        };\n        GameMessageWrapperT {\n            Message,\n        }\n    }\n\n    #[inline]\n    pub fn Message_type(&self) -> GameMessage {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<GameMessage>(GameMessageWrapper::VT_MESSAGE_TYPE, Some(GameMessage::NONE)).unwrap()}\n    }\n\n    #[inline]\n    pub fn Message(&self) -> Option<::flatbuffers::Table<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Table<'a>>>(GameMessageWrapper::VT_MESSAGE, None)}\n    }\n\n    #[inline]\n    #[allow(non_snake_case)]\n    pub fn Message_as_player_stat_event(&self) -> Option<PlayerStatEvent<'a>> {\n        if self.Message_type() == GameMessage::PlayerStatEvent {\n            self.Message().map(|t| {\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid union in this slot\n                unsafe { PlayerStatEvent::init_from_table(t) }\n            })\n        } else {\n            None\n        }\n    }\n\n    #[inline]\n    #[allow(non_snake_case)]\n    pub fn Message_as_player_spectate(&self) -> Option<PlayerSpectate<'a>> {\n        if self.Message_type() == GameMessage::PlayerSpectate {\n            self.Message().map(|t| {\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid union in this slot\n                unsafe { PlayerSpectate::init_from_table(t) }\n            })\n        } else {\n            None\n        }\n    }\n\n    #[inline]\n    #[allow(non_snake_case)]\n    pub fn Message_as_player_input_change(&self) -> Option<PlayerInputChange<'a>> {\n        if self.Message_type() == GameMessage::PlayerInputChange {\n            self.Message().map(|t| {\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid union in this slot\n                unsafe { PlayerInputChange::init_from_table(t) }\n            })\n        } else {\n            None\n        }\n    }\n}\n\nimpl ::flatbuffers::Verifiable for GameMessageWrapper<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_union::<GameMessage, _>(\"Message_type\", Self::VT_MESSAGE_TYPE, \"Message\", Self::VT_MESSAGE, false, |key, v, pos| {\n                match key {\n                    GameMessage::PlayerStatEvent => v.verify_union_variant::<::flatbuffers::ForwardsUOffset<PlayerStatEvent>>(\"GameMessage::PlayerStatEvent\", pos),\n                    GameMessage::PlayerSpectate => v.verify_union_variant::<::flatbuffers::ForwardsUOffset<PlayerSpectate>>(\"GameMessage::PlayerSpectate\", pos),\n                    GameMessage::PlayerInputChange => v.verify_union_variant::<::flatbuffers::ForwardsUOffset<PlayerInputChange>>(\"GameMessage::PlayerInputChange\", pos),\n                    _ => Ok(()),\n                }\n            })?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct GameMessageWrapperArgs {\n    pub Message_type: GameMessage,\n    pub Message: Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>>,\n}\n\nimpl<'a> Default for GameMessageWrapperArgs {\n    #[inline]\n    fn default() -> Self {\n        GameMessageWrapperArgs {\n            Message_type: GameMessage::NONE,\n            Message: None,\n        }\n    }\n}\n\npub struct GameMessageWrapperBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> GameMessageWrapperBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_Message_type(&mut self, Message_type: GameMessage) {\n        self.fbb_.push_slot::<GameMessage>(GameMessageWrapper::VT_MESSAGE_TYPE, Message_type, GameMessage::NONE);\n    }\n\n    #[inline]\n    pub fn add_Message(&mut self, Message: ::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(GameMessageWrapper::VT_MESSAGE, Message);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> GameMessageWrapperBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        GameMessageWrapperBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<GameMessageWrapper<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for GameMessageWrapper<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"GameMessageWrapper\");\n        ds.field(\"Message_type\", &self.Message_type());\n        match self.Message_type() {\n            GameMessage::PlayerStatEvent => {\n                if let Some(x) = self.Message_as_player_stat_event() {\n                    ds.field(\"Message\", &x)\n                } else {\n                    ds.field(\"Message\", &\"InvalidFlatbuffer: Union discriminant does not match value.\")\n                }\n            },\n            GameMessage::PlayerSpectate => {\n                if let Some(x) = self.Message_as_player_spectate() {\n                    ds.field(\"Message\", &x)\n                } else {\n                    ds.field(\"Message\", &\"InvalidFlatbuffer: Union discriminant does not match value.\")\n                }\n            },\n            GameMessage::PlayerInputChange => {\n                if let Some(x) = self.Message_as_player_input_change() {\n                    ds.field(\"Message\", &x)\n                } else {\n                    ds.field(\"Message\", &\"InvalidFlatbuffer: Union discriminant does not match value.\")\n                }\n            },\n            _ => {\n                let x: Option<()> = None;\n                ds.field(\"Message\", &x)\n            },\n        };\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct GameMessageWrapperT {\n    pub Message: GameMessageT,\n}\n\nimpl Default for GameMessageWrapperT {\n    fn default() -> Self {\n        Self {\n            Message: GameMessageT::NONE,\n        }\n    }\n}\n\nimpl GameMessageWrapperT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<GameMessageWrapper<'b>> {\n        let Message_type = self.Message.game_message_type();\n        let Message = self.Message.pack(_fbb);\n        GameMessageWrapper::create(_fbb, &GameMessageWrapperArgs{\n            Message_type,\n            Message,\n        })\n    }\n}\n"
  },
  {
    "path": "tests/rust_namer_test/rust_namer_test/player_input_change_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum PlayerInputChangeOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct PlayerInputChange<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for PlayerInputChange<'a> {\n    type Inner = PlayerInputChange<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> PlayerInputChange<'a> {\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"RustNamerTest.PlayerInputChange\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        PlayerInputChange { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        _args: &'args PlayerInputChangeArgs\n    ) -> ::flatbuffers::WIPOffset<PlayerInputChange<'bldr>> {\n        let mut builder = PlayerInputChangeBuilder::new(_fbb);\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> PlayerInputChangeT {\n        PlayerInputChangeT {\n        }\n    }\n}\n\nimpl ::flatbuffers::Verifiable for PlayerInputChange<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct PlayerInputChangeArgs {\n}\n\nimpl<'a> Default for PlayerInputChangeArgs {\n    #[inline]\n    fn default() -> Self {\n        PlayerInputChangeArgs {\n        }\n    }\n}\n\npub struct PlayerInputChangeBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> PlayerInputChangeBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> PlayerInputChangeBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        PlayerInputChangeBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<PlayerInputChange<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for PlayerInputChange<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"PlayerInputChange\");\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct PlayerInputChangeT {\n}\n\nimpl Default for PlayerInputChangeT {\n    fn default() -> Self {\n        Self {\n        }\n    }\n}\n\nimpl PlayerInputChangeT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<PlayerInputChange<'b>> {\n        PlayerInputChange::create(_fbb, &PlayerInputChangeArgs{\n        })\n    }\n}\n"
  },
  {
    "path": "tests/rust_namer_test/rust_namer_test/player_spectate_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum PlayerSpectateOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct PlayerSpectate<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for PlayerSpectate<'a> {\n    type Inner = PlayerSpectate<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> PlayerSpectate<'a> {\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"RustNamerTest.PlayerSpectate\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        PlayerSpectate { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        _args: &'args PlayerSpectateArgs\n    ) -> ::flatbuffers::WIPOffset<PlayerSpectate<'bldr>> {\n        let mut builder = PlayerSpectateBuilder::new(_fbb);\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> PlayerSpectateT {\n        PlayerSpectateT {\n        }\n    }\n}\n\nimpl ::flatbuffers::Verifiable for PlayerSpectate<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct PlayerSpectateArgs {\n}\n\nimpl<'a> Default for PlayerSpectateArgs {\n    #[inline]\n    fn default() -> Self {\n        PlayerSpectateArgs {\n        }\n    }\n}\n\npub struct PlayerSpectateBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> PlayerSpectateBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> PlayerSpectateBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        PlayerSpectateBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<PlayerSpectate<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for PlayerSpectate<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"PlayerSpectate\");\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct PlayerSpectateT {\n}\n\nimpl Default for PlayerSpectateT {\n    fn default() -> Self {\n        Self {\n        }\n    }\n}\n\nimpl PlayerSpectateT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<PlayerSpectate<'b>> {\n        PlayerSpectate::create(_fbb, &PlayerSpectateArgs{\n        })\n    }\n}\n"
  },
  {
    "path": "tests/rust_namer_test/rust_namer_test/player_stat_event_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum PlayerStatEventOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct PlayerStatEvent<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for PlayerStatEvent<'a> {\n    type Inner = PlayerStatEvent<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> PlayerStatEvent<'a> {\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"RustNamerTest.PlayerStatEvent\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        PlayerStatEvent { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        _args: &'args PlayerStatEventArgs\n    ) -> ::flatbuffers::WIPOffset<PlayerStatEvent<'bldr>> {\n        let mut builder = PlayerStatEventBuilder::new(_fbb);\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> PlayerStatEventT {\n        PlayerStatEventT {\n        }\n    }\n}\n\nimpl ::flatbuffers::Verifiable for PlayerStatEvent<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct PlayerStatEventArgs {\n}\n\nimpl<'a> Default for PlayerStatEventArgs {\n    #[inline]\n    fn default() -> Self {\n        PlayerStatEventArgs {\n        }\n    }\n}\n\npub struct PlayerStatEventBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> PlayerStatEventBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> PlayerStatEventBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        PlayerStatEventBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<PlayerStatEvent<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for PlayerStatEvent<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"PlayerStatEvent\");\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct PlayerStatEventT {\n}\n\nimpl Default for PlayerStatEventT {\n    fn default() -> Self {\n        Self {\n        }\n    }\n}\n\nimpl PlayerStatEventT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<PlayerStatEvent<'b>> {\n        PlayerStatEvent::create(_fbb, &PlayerStatEventArgs{\n        })\n    }\n}\n"
  },
  {
    "path": "tests/rust_namer_test/rust_namer_test/possibly_reserved_words_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\n// struct PossiblyReservedWords, aligned to 4\n#[repr(transparent)]\n#[derive(Clone, Copy, PartialEq)]\npub struct PossiblyReservedWords(pub [u8; 16]);\n\nimpl Default for PossiblyReservedWords {\n    fn default() -> Self {\n        Self([0; 16])\n    }\n}\n\nimpl ::core::fmt::Debug for PossiblyReservedWords {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {\n        f.debug_struct(\"PossiblyReservedWords\")\n            .field(\"follow_\", &self.follow_())\n            .field(\"push_\", &self.push_())\n            .field(\"size\", &self.size())\n            .field(\"alignment\", &self.alignment())\n            .finish()\n    }\n}\n\nimpl ::flatbuffers::SimpleToVerifyInSlice for PossiblyReservedWords {}\n\nimpl<'a> ::flatbuffers::Follow<'a> for PossiblyReservedWords {\n    type Inner = &'a PossiblyReservedWords;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { <&'a PossiblyReservedWords>::follow(buf, loc) }\n    }\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for &'a PossiblyReservedWords {\n    type Inner = &'a PossiblyReservedWords;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        unsafe { ::flatbuffers::follow_cast_ref::<PossiblyReservedWords>(buf, loc) }\n    }\n}\n\nimpl<'b> ::flatbuffers::Push for PossiblyReservedWords {\n    type Output = PossiblyReservedWords;\n\n    #[inline]\n    unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {\n        let src = unsafe { ::core::slice::from_raw_parts(self as *const PossiblyReservedWords as *const u8, <Self as ::flatbuffers::Push>::size()) };\n        dst.copy_from_slice(src);\n    }\n\n    #[inline]\n    fn alignment() -> ::flatbuffers::PushAlignment {\n        ::flatbuffers::PushAlignment::new(4)\n    }\n}\n\nimpl<'a> ::flatbuffers::Verifiable for PossiblyReservedWords {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.in_buffer::<Self>(pos)\n    }\n}\n\nimpl<'a> PossiblyReservedWords {\n    #[allow(clippy::too_many_arguments)]\n    pub fn new(\n        follow_: f32,\n        push_: f32,\n        size: f32,\n        alignment: f32,\n    ) -> Self {\n        let mut s = Self([0; 16]);\n        s.set_follow_(follow_);\n        s.set_push_(push_);\n        s.set_size(size);\n        s.set_alignment(alignment);\n        s\n    }\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"RustNamerTest.PossiblyReservedWords\"\n    }\n\n    pub fn follow_(&self) -> f32 {\n        let mut mem = ::core::mem::MaybeUninit::<<f32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[0..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_follow_(&mut self, x: f32) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[0..].as_mut_ptr(),\n                ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn push_(&self) -> f32 {\n        let mut mem = ::core::mem::MaybeUninit::<<f32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[4..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_push_(&mut self, x: f32) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[4..].as_mut_ptr(),\n                ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn size(&self) -> f32 {\n        let mut mem = ::core::mem::MaybeUninit::<<f32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[8..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_size(&mut self, x: f32) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[8..].as_mut_ptr(),\n                ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn alignment(&self) -> f32 {\n        let mut mem = ::core::mem::MaybeUninit::<<f32 as ::flatbuffers::EndianScalar>::Scalar>::uninit();\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        ::flatbuffers::EndianScalar::from_little_endian(unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                self.0[12..].as_ptr(),\n                mem.as_mut_ptr() as *mut u8,\n                ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n            mem.assume_init()\n        })\n    }\n\n    pub fn set_alignment(&mut self, x: f32) {\n        let x_le = ::flatbuffers::EndianScalar::to_little_endian(x);\n        // Safety:\n        // Created from a valid Table for this object\n        // Which contains a valid value in this slot\n        unsafe {\n            ::core::ptr::copy_nonoverlapping(\n                &x_le as *const _ as *const u8,\n                self.0[12..].as_mut_ptr(),\n                ::core::mem::size_of::<<f32 as ::flatbuffers::EndianScalar>::Scalar>(),\n            );\n        }\n    }\n\n    pub fn unpack(&self) -> PossiblyReservedWordsT {\n        PossiblyReservedWordsT {\n            follow_: self.follow_(),\n            push_: self.push_(),\n            size: self.size(),\n            alignment: self.alignment(),\n        }\n    }\n}\n\n#[derive(Debug, Clone, PartialEq)]\npub struct PossiblyReservedWordsT {\n    pub follow_: f32,\n    pub push_: f32,\n    pub size: f32,\n    pub alignment: f32,\n}\nimpl Default for PossiblyReservedWordsT {\n    fn default() -> Self {\n        Self {\n            follow_: 0.0,\n            push_: 0.0,\n            size: 0.0,\n            alignment: 0.0,\n        }\n    }\n}\n\nimpl PossiblyReservedWordsT {\n    pub fn pack(&self) -> PossiblyReservedWords {\n        PossiblyReservedWords::new(\n            self.follow_,\n            self.push_,\n            self.size,\n            self.alignment,\n        )\n    }\n}\n"
  },
  {
    "path": "tests/rust_namer_test/rust_namer_test/root_table_generated.rs",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// @generated\nextern crate alloc;\nuse super::*;\n\npub enum RootTableOffset {}\n\n#[derive(Copy, Clone, PartialEq)]\npub struct RootTable<'a> {\n    pub _tab: ::flatbuffers::Table<'a>,\n}\n\nimpl<'a> ::flatbuffers::Follow<'a> for RootTable<'a> {\n    type Inner = RootTable<'a>;\n\n    #[inline]\n    unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n        Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }\n    }\n}\n\nimpl<'a> RootTable<'a> {\n    pub const VT_FIELD42_TYPE: ::flatbuffers::VOffsetT = 4;\n    pub const VT_FIELD42: ::flatbuffers::VOffsetT = 6;\n\n    pub const fn get_fully_qualified_name() -> &'static str {\n        \"RustNamerTest.RootTable\"\n    }\n\n    #[inline]\n    pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {\n        RootTable { _tab: table }\n    }\n\n    #[allow(unused_mut)]\n    pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(\n        _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,\n        args: &'args RootTableArgs\n    ) -> ::flatbuffers::WIPOffset<RootTable<'bldr>> {\n        let mut builder = RootTableBuilder::new(_fbb);\n        if let Some(x) = args.field42 { builder.add_field42(x); }\n        builder.add_field42_type(args.field42_type);\n        builder.finish()\n    }\n\n    pub fn unpack(&self) -> RootTableT {\n        let field42 = match self.field42_type() {\n            FieldUnion::NONE => FieldUnionT::NONE,\n            FieldUnion::f => FieldUnionT::F(alloc::boxed::Box::new(\n                self.field42_as_f()\n                    .expect(\"Invalid union table, expected `FieldUnion::f`.\")\n                    .unpack()\n            )),\n            _ => FieldUnionT::NONE,\n        };\n        RootTableT {\n            field42,\n        }\n    }\n\n    #[inline]\n    pub fn field42_type(&self) -> FieldUnion {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<FieldUnion>(RootTable::VT_FIELD42_TYPE, Some(FieldUnion::NONE)).unwrap()}\n    }\n\n    #[inline]\n    pub fn field42(&self) -> Option<::flatbuffers::Table<'a>> {\n        // Safety:\n        // Created from valid Table for this object\n        // which contains a valid value in this slot\n        unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Table<'a>>>(RootTable::VT_FIELD42, None)}\n    }\n\n    #[inline]\n    #[allow(non_snake_case)]\n    pub fn field42_as_f(&self) -> Option<FieldTable<'a>> {\n        if self.field42_type() == FieldUnion::f {\n            self.field42().map(|t| {\n                // Safety:\n                // Created from a valid Table for this object\n                // Which contains a valid union in this slot\n                unsafe { FieldTable::init_from_table(t) }\n            })\n        } else {\n            None\n        }\n    }\n}\n\nimpl ::flatbuffers::Verifiable for RootTable<'_> {\n    #[inline]\n    fn run_verifier(\n        v: &mut ::flatbuffers::Verifier, pos: usize\n    ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {\n        v.visit_table(pos)?\n            .visit_union::<FieldUnion, _>(\"field42_type\", Self::VT_FIELD42_TYPE, \"field42\", Self::VT_FIELD42, false, |key, v, pos| {\n                match key {\n                    FieldUnion::f => v.verify_union_variant::<::flatbuffers::ForwardsUOffset<FieldTable>>(\"FieldUnion::f\", pos),\n                    _ => Ok(()),\n                }\n            })?\n            .finish();\n        Ok(())\n    }\n}\n\npub struct RootTableArgs {\n    pub field42_type: FieldUnion,\n    pub field42: Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>>,\n}\n\nimpl<'a> Default for RootTableArgs {\n    #[inline]\n    fn default() -> Self {\n        RootTableArgs {\n            field42_type: FieldUnion::NONE,\n            field42: None,\n        }\n    }\n}\n\npub struct RootTableBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {\n    fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,\n    start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,\n}\n\nimpl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> RootTableBuilder<'a, 'b, A> {\n    #[inline]\n    pub fn add_field42_type(&mut self, field42_type: FieldUnion) {\n        self.fbb_.push_slot::<FieldUnion>(RootTable::VT_FIELD42_TYPE, field42_type, FieldUnion::NONE);\n    }\n\n    #[inline]\n    pub fn add_field42(&mut self, field42: ::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>) {\n        self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(RootTable::VT_FIELD42, field42);\n    }\n\n    #[inline]\n    pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> RootTableBuilder<'a, 'b, A> {\n        let start = _fbb.start_table();\n        RootTableBuilder {\n            fbb_: _fbb,\n            start_: start,\n        }\n    }\n\n    #[inline]\n    pub fn finish(self) -> ::flatbuffers::WIPOffset<RootTable<'a>> {\n        let o = self.fbb_.end_table(self.start_);\n        ::flatbuffers::WIPOffset::new(o.value())\n    }\n}\n\nimpl ::core::fmt::Debug for RootTable<'_> {\n    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {\n        let mut ds = f.debug_struct(\"RootTable\");\n        ds.field(\"field42_type\", &self.field42_type());\n        match self.field42_type() {\n            FieldUnion::f => {\n                if let Some(x) = self.field42_as_f() {\n                    ds.field(\"field42\", &x)\n                } else {\n                    ds.field(\"field42\", &\"InvalidFlatbuffer: Union discriminant does not match value.\")\n                }\n            },\n            _ => {\n                let x: Option<()> = None;\n                ds.field(\"field42\", &x)\n            },\n        };\n        ds.finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct RootTableT {\n    pub field42: FieldUnionT,\n}\n\nimpl Default for RootTableT {\n    fn default() -> Self {\n        Self {\n            field42: FieldUnionT::NONE,\n        }\n    }\n}\n\nimpl RootTableT {\n    pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(\n        &self,\n        _fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>\n    ) -> ::flatbuffers::WIPOffset<RootTable<'b>> {\n        let field42_type = self.field42.field_union_type();\n        let field42 = self.field42.pack(_fbb);\n        RootTable::create(_fbb, &RootTableArgs{\n            field42_type,\n            field42,\n        })\n    }\n}\n"
  },
  {
    "path": "tests/rust_namer_test.fbs",
    "content": "namespace RustNamerTest;\n\ntable FieldTable {}\n\nunion FieldUnion {\n  f :FieldTable (id: 0),\n}\n\ntable RootTable {\n  field42 :FieldUnion (id: 1);\n}\n\ntable PlayerStatEvent {}\ntable PlayerSpectate {}\ntable PlayerInputChange {}\n\nunion GameMessage\n{\n  PlayerStatEvent,\n  PlayerSpectate,\n\tPlayerInputChange\n}\n\ntable GameMessageWrapper\n{\n\tMessage:GameMessage;\n}\n\nstruct PossiblyReservedWords\n{\n  // Keywords reserved by Rust namer\n  follow: float;\n  push: float;\n  // Keywords no longer reserved by Rust namer\n  size: float;\n  alignment: float;\n}\n"
  },
  {
    "path": "tests/rust_no_std_compilation_test/.cargo/config.toml",
    "content": "[build]\ntarget = \"thumbv7m-none-eabi\"\n\n[unstable]\nbuild-std = [\"core\", \"alloc\"]\n"
  },
  {
    "path": "tests/rust_no_std_compilation_test/Cargo.toml",
    "content": "[package]\nname = \"rust_test_no_std_compilation\"\nversion = \"0.1.0\"\nedition = \"2021\"\n\n[dependencies]\nflatbuffers = { path = \"../../rust/flatbuffers\", default-features = false }\n\n[profile.dev]\npanic = \"abort\"\n\n[profile.release]\npanic = \"abort\"\n"
  },
  {
    "path": "tests/rust_no_std_compilation_test/src/main.rs",
    "content": "#![no_std]\n#![no_main]\n#![feature(default_alloc_error_handler)]\n\n// Include flatbuffers purely to check that it compiles in a no_std binary\n#[allow(unused_imports)]\nuse flatbuffers;\n\n// The rest is just no_std boilerplate\n\nuse core::alloc::{GlobalAlloc, Layout};\n\nstruct NullAllocator;\nunsafe impl GlobalAlloc for NullAllocator {\n    unsafe fn alloc(&self, _lt: Layout) -> *mut u8 {\n        core::ptr::null_mut()\n    }\n    unsafe fn dealloc(&self, _ptr: *mut u8, _lt: Layout) {\n        panic!(\"won't deallocate: we never allocated!\");\n    }\n}\n\n#[global_allocator]\nstatic A: NullAllocator = NullAllocator;\n\n#[panic_handler]\nfn panic(_info: &core::panic::PanicInfo) -> ! {\n    loop {}\n}\n\n#[no_mangle]\npub extern \"C\" fn main(_argc: i32, _argv: *const *const u8) -> i32 {\n    0\n}\n"
  },
  {
    "path": "tests/rust_reflection_test/.gitignore",
    "content": "/target\nCargo.lock\n"
  },
  {
    "path": "tests/rust_reflection_test/Cargo.toml",
    "content": "[package]\nname = \"rust_reflection_test\"\nversion = \"0.1.0\"\nedition = \"2018\"\n\n[dependencies]\nflatbuffers-reflection = { path = \"../../rust/reflection\" }\nflatbuffers = { path = \"../../rust/flatbuffers\" }\nassert_approx_eq = \"1.1.0\"\n"
  },
  {
    "path": "tests/rust_reflection_test/src/lib.rs",
    "content": "use flatbuffers_reflection::reflection::{root_as_schema, BaseType, Field};\nuse flatbuffers_reflection::{\n    get_any_field_float, get_any_field_float_in_struct, get_any_field_integer,\n    get_any_field_integer_in_struct, get_any_field_string, get_any_field_string_in_struct,\n    get_any_root, get_field_float, get_field_integer, get_field_string, get_field_struct,\n    get_field_struct_in_struct, get_field_table, get_field_vector, set_any_field_float,\n    set_any_field_integer, set_any_field_string, set_field, set_string, FlatbufferError,\n};\nuse flatbuffers_reflection::{SafeBuffer, Struct};\n\nuse flatbuffers::{FlatBufferBuilder, Table, VerifierOptions};\n\nuse std::error::Error;\nuse std::fs::File;\nuse std::io::Read;\n\nuse assert_approx_eq::assert_approx_eq;\n\n#[allow(dead_code, unused_imports)]\n#[path = \"../../monster_test/mod.rs\"]\nmod monster_test_generated;\npub use monster_test_generated::my_game;\n\n#[test]\nfn test_schema_correct_root_table() {\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n\n    let root_table = schema.root_table().unwrap();\n\n    assert_eq!(root_table.name(), \"MyGame.Example.Monster\");\n    assert_eq!(root_table.declaration_file().unwrap(), \"//monster_test.fbs\");\n}\n\n#[test]\nfn test_schema_correct_object() {\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n\n    assert_eq!(\n        schema\n            .objects()\n            .lookup_by_key(\"TableA\", |object, key| object.key_compare_with_value(key))\n            .unwrap()\n            .declaration_file()\n            .unwrap(),\n        \"//include_test/include_test1.fbs\"\n    );\n    assert_eq!(\n        schema\n            .objects()\n            .lookup_by_key(\"MyGame.OtherNameSpace.Unused\", |object, key| object\n                .key_compare_with_value(key))\n            .unwrap()\n            .declaration_file()\n            .unwrap(),\n        \"//include_test/sub/include_test2.fbs\"\n    );\n}\n\n#[test]\nfn test_schema_correct_enum() {\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n\n    assert_eq!(\n        schema\n            .enums()\n            .lookup_by_key(\"MyGame.OtherNameSpace.FromInclude\", |en, key| en\n                .key_compare_with_value(key))\n            .unwrap()\n            .declaration_file()\n            .unwrap(),\n        \"//include_test/sub/include_test2.fbs\"\n    );\n}\n\n#[test]\nfn test_schema_correct_file() {\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n\n    assert_eq!(schema.fbs_files().unwrap().len(), 3);\n\n    let fbs0 = schema.fbs_files().unwrap().get(0);\n    assert_eq!(fbs0.filename(), \"//include_test/include_test1.fbs\");\n    let fbs0_includes = fbs0.included_filenames().unwrap();\n    assert_eq!(fbs0_includes.len(), 2);\n    assert_eq!(fbs0_includes.get(0), \"//include_test/include_test1.fbs\");\n    assert_eq!(fbs0_includes.get(1), \"//include_test/sub/include_test2.fbs\");\n\n    let fbs1 = schema.fbs_files().unwrap().get(1);\n    assert_eq!(fbs1.filename(), \"//include_test/sub/include_test2.fbs\");\n    let fbs1_includes = fbs1.included_filenames().unwrap();\n    assert_eq!(fbs1_includes.len(), 2);\n    assert_eq!(fbs1_includes.get(0), \"//include_test/include_test1.fbs\");\n    assert_eq!(fbs1_includes.get(1), \"//include_test/sub/include_test2.fbs\");\n\n    let fbs2 = schema.fbs_files().unwrap().get(2);\n    assert_eq!(fbs2.filename(), \"//monster_test.fbs\");\n    let fbs2_includes = fbs2.included_filenames().unwrap();\n    assert_eq!(fbs2_includes.len(), 1);\n    assert_eq!(fbs2_includes.get(0), \"//include_test/include_test1.fbs\");\n}\n\n#[test]\nfn test_schema_correct_table_field() {\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let root_table = root_as_schema(schema_buffer.as_slice()).unwrap().root_table().unwrap();\n\n    let fields = root_table.fields();\n\n    let hp_field_option =\n        fields.lookup_by_key(\"hp\", |field, key| field.key_compare_with_value(key));\n    assert!(hp_field_option.is_some());\n    let hp_field = hp_field_option.unwrap();\n    assert_eq!(hp_field.name(), \"hp\");\n    assert_eq!(hp_field.id(), 2);\n    assert_eq!(hp_field.type_().base_type(), BaseType::Short);\n\n    let friendly_field_option =\n        fields.lookup_by_key(\"friendly\", |field, key| field.key_compare_with_value(key));\n    assert!(friendly_field_option.is_some());\n    assert!(friendly_field_option.unwrap().attributes().is_some());\n    assert!(friendly_field_option\n        .unwrap()\n        .attributes()\n        .unwrap()\n        .lookup_by_key(\"priority\", |key_value, key| key_value.key_compare_with_value(key))\n        .is_some());\n}\n\n#[test]\nfn test_schema_correct_table_field_nullability() {\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let root_table = root_as_schema(schema_buffer.as_slice()).unwrap().root_table().unwrap();\n\n    let fields = root_table.fields();\n\n    assert_eq!(\n        fields\n            .lookup_by_key(\"hp\", |field, key| field.key_compare_with_value(key))\n            .unwrap()\n            .optional(),\n        false\n    );\n    assert_eq!(\n        fields\n            .lookup_by_key(\"pos\", |field, key| field.key_compare_with_value(key))\n            .unwrap()\n            .optional(),\n        true\n    );\n    assert_eq!(\n        fields\n            .lookup_by_key(\"name\", |field, key| field.key_compare_with_value(key))\n            .unwrap()\n            .optional(),\n        false\n    );\n}\n\n#[test]\nfn test_schema_correct_child_table_index() {\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let root_table = schema.root_table().unwrap();\n\n    let fields = root_table.fields();\n\n    let pos_field_option =\n        fields.lookup_by_key(\"pos\", |field, key| field.key_compare_with_value(key));\n    assert!(pos_field_option.is_some());\n    let pos_field = pos_field_option.unwrap();\n    assert_eq!(pos_field.type_().base_type(), BaseType::Obj);\n    let pos_table = schema.objects().get(pos_field.type_().index() as usize);\n    assert_eq!(pos_table.name(), \"MyGame.Example.Vec3\");\n}\n\n#[test]\nfn test_buffer_integer_same_type_succeeds() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let i16_field = get_schema_field(&schema, \"hp\");\n\n    let value = unsafe { get_field_integer::<i16>(&root_table, &i16_field) };\n\n    assert!(value.is_ok());\n    assert_eq!(value.unwrap(), Some(32767));\n}\n\n#[test]\nfn test_buffer_integer_diff_type_same_size_succeeds() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let i16_field = get_schema_field(&schema, \"hp\");\n\n    let value = unsafe { get_field_integer::<u16>(&root_table, &i16_field) };\n\n    assert!(value.is_ok());\n    assert_eq!(value.unwrap(), Some(32767));\n}\n\n#[test]\nfn test_buffer_integer_diff_size_fails() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let i16_field = get_schema_field(&schema, \"hp\");\n\n    let value = unsafe { get_field_integer::<i64>(&root_table, &i16_field) };\n\n    assert!(value.is_err());\n    assert_eq!(\n        value.unwrap_err(),\n        FlatbufferError::FieldTypeMismatch(String::from(\"i64\"), String::from(\"Short\"))\n    );\n}\n\n#[test]\nfn test_buffer_float_same_type_succeeds() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let f32_field = get_schema_field(&schema, \"testf\");\n\n    let value = unsafe { get_field_float::<f32>(&root_table, &f32_field) };\n\n    assert!(value.is_ok());\n    assert_eq!(value.unwrap(), Some(3.14));\n}\n\n#[test]\nfn test_buffer_float_diff_type_fails() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let f32_field = get_schema_field(&schema, \"testf\");\n\n    let value = unsafe { get_field_float::<f64>(&root_table, &f32_field) };\n\n    assert!(value.is_err());\n    assert_eq!(\n        value.unwrap_err(),\n        FlatbufferError::FieldTypeMismatch(String::from(\"f64\"), String::from(\"Float\"))\n    );\n}\n\n#[test]\nfn test_buffer_string_same_type_succeeds() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let string_field = get_schema_field(&schema, \"name\");\n\n    let value = unsafe { get_field_string(&root_table, &string_field) };\n\n    assert!(value.is_ok());\n    assert_eq!(value.unwrap(), Some(\"MyMonster\"));\n}\n\n#[test]\nfn test_buffer_string_diff_type_fails() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let f32_field = get_schema_field(&schema, \"testf\");\n\n    let value = unsafe { get_field_string(&root_table, &f32_field) };\n\n    assert!(value.is_err());\n    assert_eq!(\n        value.unwrap_err(),\n        FlatbufferError::FieldTypeMismatch(String::from(\"String\"), String::from(\"Float\"))\n    );\n}\n\n#[test]\nfn test_buffer_struct_same_type_succeeds() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let struct_field = get_schema_field(&schema, \"pos\");\n\n    let res = unsafe { get_field_struct(&root_table, &struct_field) };\n\n    assert!(res.is_ok());\n    let optional_value = res.unwrap();\n    assert!(optional_value.is_some());\n    assert_eq!(optional_value.unwrap().buf(), &buffer);\n    assert!(optional_value.unwrap().loc() > root_table.loc());\n}\n\n#[test]\nfn test_buffer_struct_diff_type_fails() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let f32_field = get_schema_field(&schema, \"testf\");\n\n    let res = unsafe { get_field_struct(&root_table, &f32_field) };\n\n    assert!(res.is_err());\n    assert_eq!(\n        res.unwrap_err(),\n        FlatbufferError::FieldTypeMismatch(String::from(\"Obj\"), String::from(\"Float\"))\n    );\n}\n\n#[test]\nfn test_buffer_vector_same_type_succeeds() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let vector_field = get_schema_field(&schema, \"inventory\");\n\n    let value = unsafe { get_field_vector::<u8>(&root_table, &vector_field) };\n\n    assert!(value.is_ok());\n    let optional_vector = value.unwrap();\n    assert!(optional_vector.is_some());\n    let vector = optional_vector.unwrap();\n    assert_eq!(vector.len(), 5);\n    assert_eq!(vector.get(0), 0);\n    assert_eq!(vector.get(1), 1);\n    assert_eq!(vector.get(2), 2);\n    assert_eq!(vector.get(3), 3);\n    assert_eq!(vector.get(4), 4);\n}\n\n#[test]\nfn test_buffer_vector_diff_type_fails() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let f32_field = get_schema_field(&schema, \"testf\");\n\n    let value = unsafe { get_field_vector::<u8>(&root_table, &f32_field) };\n\n    assert!(value.is_err());\n    assert_eq!(\n        value.unwrap_err(),\n        FlatbufferError::FieldTypeMismatch(String::from(\"u8\"), String::from(\"Float\"))\n    );\n}\n\n#[test]\nfn test_buffer_table_same_type_succeeds() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let table_field = get_schema_field(&schema, \"testempty\");\n\n    let value = unsafe { get_field_table(&root_table, &table_field) };\n\n    assert!(value.is_ok());\n    let optional_nested_table = value.unwrap();\n    assert!(optional_nested_table.is_some());\n    let nested_table = optional_nested_table.unwrap();\n    let nested_table_fields = &root_as_schema(schema.as_slice())\n        .unwrap()\n        .objects()\n        .get(table_field.type_().index() as usize)\n        .fields();\n    let nested_table_field = nested_table_fields\n        .lookup_by_key(\"id\", |field: &Field<'_>, key| field.key_compare_with_value(key))\n        .unwrap();\n    let nested_table_id = unsafe { get_field_string(&nested_table, &nested_table_field) };\n    assert!(nested_table_id.is_ok());\n    assert_eq!(nested_table_id.unwrap(), Some(\"Fred\"));\n}\n\n#[test]\nfn test_buffer_table_diff_type_fails() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let f32_field = get_schema_field(&schema, \"testf\");\n\n    let value = unsafe { get_field_table(&root_table, &f32_field) };\n\n    assert!(value.is_err());\n    assert_eq!(\n        value.unwrap_err(),\n        FlatbufferError::FieldTypeMismatch(String::from(\"Obj\"), String::from(\"Float\"))\n    );\n}\n\n#[test]\nfn test_buffer_nested_struct_same_type_succeeds() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let struct_field = get_schema_field(&schema, \"pos\");\n    let struct_value = unsafe { get_field_struct(&root_table, &struct_field).unwrap().unwrap() };\n    let struct_schema = root_as_schema(schema.as_slice())\n        .unwrap()\n        .objects()\n        .get(struct_field.type_().index() as usize);\n    let nested_struct_field = struct_schema\n        .fields()\n        .lookup_by_key(\"test3\", |field, key| field.key_compare_with_value(key))\n        .unwrap();\n\n    let res = unsafe { get_field_struct_in_struct(&struct_value, &nested_struct_field) };\n\n    assert!(res.is_ok());\n    let value = res.unwrap();\n    assert_eq!(value.buf(), &buffer);\n    assert!(value.loc() > struct_value.loc());\n}\n\n#[test]\nfn test_buffer_nested_struct_diff_type_fails() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let struct_field = get_schema_field(&schema, \"pos\");\n    let struct_value = unsafe { get_field_struct(&root_table, &struct_field).unwrap().unwrap() };\n    let struct_schema = root_as_schema(schema.as_slice())\n        .unwrap()\n        .objects()\n        .get(struct_field.type_().index() as usize);\n    let nested_float_field = struct_schema\n        .fields()\n        .lookup_by_key(\"x\", |field, key| field.key_compare_with_value(key))\n        .unwrap();\n\n    let res = unsafe { get_field_struct_in_struct(&struct_value, &nested_float_field) };\n\n    assert!(res.is_err());\n    assert_eq!(\n        res.unwrap_err(),\n        FlatbufferError::FieldTypeMismatch(String::from(\"Obj\"), String::from(\"Float\"))\n    );\n}\n\n#[test]\nfn test_buffer_i16_as_integer_succeeds() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let i16_field = get_schema_field(&schema, \"hp\");\n\n    let value = unsafe { get_any_field_integer(&root_table, &i16_field) };\n\n    assert!(value.is_ok());\n    assert_eq!(value.unwrap(), 32767);\n}\n\n#[test]\nfn test_buffer_f32_as_integer_succeeds() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let f32_field = get_schema_field(&schema, \"testf\");\n\n    let value = unsafe { get_any_field_integer(&root_table, &f32_field) };\n\n    assert!(value.is_ok());\n    assert_eq!(value.unwrap(), 3);\n}\n\n#[test]\nfn test_buffer_inf_as_integer_succeeds() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let inf_field = get_schema_field(&schema, \"inf_default\");\n\n    let value = unsafe { get_any_field_integer(&root_table, &inf_field) };\n\n    assert!(value.is_ok());\n    assert_eq!(value.unwrap(), 0);\n}\n\n#[test]\nfn test_buffer_bool_as_integer_succeeds() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let bool_field = get_schema_field(&schema, \"testbool\");\n\n    let value = unsafe { get_any_field_integer(&root_table, &bool_field) };\n\n    assert!(value.is_ok());\n    assert_eq!(value.unwrap(), 0);\n}\n\n#[test]\nfn test_buffer_nan_as_integer_fails() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let nan_field = get_schema_field(&schema, \"nan_default\");\n\n    let value = unsafe { get_any_field_integer(&root_table, &nan_field) };\n\n    assert!(value.is_err());\n    assert_eq!(\n        value.unwrap_err(),\n        FlatbufferError::FieldTypeMismatch(String::from(\"i64\"), String::from(\"Float\"))\n    );\n}\n\n#[test]\nfn test_buffer_string_as_integer_fails() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let string_field = get_schema_field(&schema, \"name\");\n\n    let value = unsafe { get_any_field_integer(&root_table, &string_field) };\n\n    assert!(value.is_err());\n    assert_eq!(\n        value.unwrap_err(),\n        FlatbufferError::FieldTypeMismatch(String::from(\"i64\"), String::from(\"String\"))\n    );\n}\n\n#[test]\nfn test_buffer_i16_as_float_succeeds() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let i16_field = get_schema_field(&schema, \"hp\");\n\n    let value = unsafe { get_any_field_float(&root_table, &i16_field) };\n\n    assert!(value.is_ok());\n    assert_eq!(value.unwrap(), 32767f64);\n}\n\n#[test]\nfn test_buffer_f32_as_float_succeeds() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let f32_field = get_schema_field(&schema, \"testf\");\n\n    let value = unsafe { get_any_field_float(&root_table, &f32_field) };\n\n    assert!(value.is_ok());\n    assert_approx_eq!(value.unwrap(), 3.14);\n}\n\n#[test]\nfn test_buffer_string_as_float_fails() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let string_field = get_schema_field(&schema, \"name\");\n\n    let value = unsafe { get_any_field_float(&root_table, &string_field) };\n\n    assert!(value.is_err());\n    assert_eq!(\n        value.unwrap_err(),\n        FlatbufferError::FieldTypeMismatch(String::from(\"f64\"), String::from(\"String\"))\n    );\n}\n\n#[test]\nfn test_buffer_i16_as_string_succeeds() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let i16_field = get_schema_field(&schema, \"hp\");\n\n    let value = unsafe {\n        get_any_field_string(&root_table, &i16_field, &root_as_schema(schema.as_slice()).unwrap())\n    };\n\n    assert_eq!(value, String::from(\"32767\"));\n}\n\n#[test]\nfn test_buffer_f32_as_string_succeeds() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let f32_field = get_schema_field(&schema, \"testf\");\n\n    let mut value = unsafe {\n        get_any_field_string(&root_table, &f32_field, &root_as_schema(schema.as_slice()).unwrap())\n    };\n\n    value.truncate(4);\n    assert_eq!(value, String::from(\"3.14\"));\n}\n\n#[test]\nfn test_buffer_string_as_string_succeeds() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let string_field = get_schema_field(&schema, \"name\");\n\n    let value = unsafe {\n        get_any_field_string(\n            &root_table,\n            &string_field,\n            &root_as_schema(schema.as_slice()).unwrap(),\n        )\n    };\n\n    assert_eq!(value, \"MyMonster\");\n}\n\n#[test]\nfn test_buffer_i16_in_struct_as_integer_succeeds() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let struct_field = get_schema_field(&schema, \"pos\");\n    let struct_value = unsafe { get_field_struct(&root_table, &struct_field).unwrap().unwrap() };\n    let struct_schema = root_as_schema(schema.as_slice())\n        .unwrap()\n        .objects()\n        .get(struct_field.type_().index() as usize);\n    let nested_struct_field = struct_schema\n        .fields()\n        .lookup_by_key(\"test3\", |field, key| field.key_compare_with_value(key))\n        .unwrap();\n    let nested_struct_value =\n        unsafe { get_field_struct_in_struct(&struct_value, &nested_struct_field).unwrap() };\n    let nested_struct_schema = root_as_schema(schema.as_slice())\n        .unwrap()\n        .objects()\n        .get(nested_struct_field.type_().index() as usize);\n    let i16_in_struct = nested_struct_schema\n        .fields()\n        .lookup_by_key(\"a\", |field, key| field.key_compare_with_value(key))\n        .unwrap();\n\n    let value = unsafe { get_any_field_integer_in_struct(&nested_struct_value, &i16_in_struct) };\n\n    assert!(value.is_ok());\n    assert_eq!(value.unwrap(), 5);\n}\n\n#[test]\nfn test_buffer_f32_in_struct_as_integer_succeeds() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let struct_field = get_schema_field(&schema, \"pos\");\n    let struct_value = unsafe { get_field_struct(&root_table, &struct_field).unwrap().unwrap() };\n    let struct_schema = root_as_schema(schema.as_slice())\n        .unwrap()\n        .objects()\n        .get(struct_field.type_().index() as usize);\n    let f32_in_struct = struct_schema\n        .fields()\n        .lookup_by_key(\"x\", |field, key| field.key_compare_with_value(key))\n        .unwrap();\n\n    let value = unsafe { get_any_field_integer_in_struct(&struct_value, &f32_in_struct) };\n\n    assert!(value.is_ok());\n    assert_eq!(value.unwrap(), 1);\n}\n\n#[test]\nfn test_buffer_enum_in_struct_as_integer_succeeds() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let struct_field = get_schema_field(&schema, \"pos\");\n    let struct_value = unsafe { get_field_struct(&root_table, &struct_field).unwrap().unwrap() };\n    let struct_schema = root_as_schema(schema.as_slice())\n        .unwrap()\n        .objects()\n        .get(struct_field.type_().index() as usize);\n    let enum_in_struct = struct_schema\n        .fields()\n        .lookup_by_key(\"test2\", |field, key| field.key_compare_with_value(key))\n        .unwrap();\n\n    let value = unsafe { get_any_field_integer_in_struct(&struct_value, &enum_in_struct) };\n\n    assert!(value.is_ok());\n    assert_eq!(value.unwrap(), 2);\n}\n\n#[test]\nfn test_buffer_struct_in_struct_as_integer_fails() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let struct_field = get_schema_field(&schema, \"pos\");\n    let struct_value = unsafe { get_field_struct(&root_table, &struct_field).unwrap().unwrap() };\n    let struct_schema = root_as_schema(schema.as_slice())\n        .unwrap()\n        .objects()\n        .get(struct_field.type_().index() as usize);\n    let struct_in_struct = struct_schema\n        .fields()\n        .lookup_by_key(\"test3\", |field, key| field.key_compare_with_value(key))\n        .unwrap();\n\n    let value = unsafe { get_any_field_integer_in_struct(&struct_value, &struct_in_struct) };\n\n    assert!(value.is_err());\n    assert_eq!(\n        value.unwrap_err(),\n        FlatbufferError::FieldTypeMismatch(String::from(\"i64\"), String::from(\"Obj\"))\n    );\n}\n\n#[test]\nfn test_buffer_i16_in_struct_as_float_succeeds() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let struct_field = get_schema_field(&schema, \"pos\");\n    let struct_value = unsafe { get_field_struct(&root_table, &struct_field).unwrap().unwrap() };\n    let struct_schema = root_as_schema(schema.as_slice())\n        .unwrap()\n        .objects()\n        .get(struct_field.type_().index() as usize);\n    let nested_struct_field = struct_schema\n        .fields()\n        .lookup_by_key(\"test3\", |field, key| field.key_compare_with_value(key))\n        .unwrap();\n    let nested_struct_value =\n        unsafe { get_field_struct_in_struct(&struct_value, &nested_struct_field).unwrap() };\n    let nested_struct_schema = root_as_schema(schema.as_slice())\n        .unwrap()\n        .objects()\n        .get(nested_struct_field.type_().index() as usize);\n    let i16_in_struct = nested_struct_schema\n        .fields()\n        .lookup_by_key(\"a\", |field, key| field.key_compare_with_value(key))\n        .unwrap();\n\n    let value = unsafe { get_any_field_float_in_struct(&nested_struct_value, &i16_in_struct) };\n\n    assert!(value.is_ok());\n    assert_eq!(value.unwrap(), 5f64);\n}\n\n#[test]\nfn test_buffer_f32_in_struct_as_float_succeeds() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let struct_field = get_schema_field(&schema, \"pos\");\n    let struct_value = unsafe { get_field_struct(&root_table, &struct_field).unwrap().unwrap() };\n    let struct_schema = root_as_schema(schema.as_slice())\n        .unwrap()\n        .objects()\n        .get(struct_field.type_().index() as usize);\n    let f32_in_struct = struct_schema\n        .fields()\n        .lookup_by_key(\"x\", |field, key| field.key_compare_with_value(key))\n        .unwrap();\n\n    let value = unsafe { get_any_field_float_in_struct(&struct_value, &f32_in_struct) };\n\n    assert!(value.is_ok());\n    assert_eq!(value.unwrap(), 1f64);\n}\n\n#[test]\nfn test_buffer_enum_in_struct_as_float_succeeds() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let struct_field = get_schema_field(&schema, \"pos\");\n    let struct_value = unsafe { get_field_struct(&root_table, &struct_field).unwrap().unwrap() };\n    let struct_schema = root_as_schema(schema.as_slice())\n        .unwrap()\n        .objects()\n        .get(struct_field.type_().index() as usize);\n    let enum_in_struct = struct_schema\n        .fields()\n        .lookup_by_key(\"test2\", |field, key| field.key_compare_with_value(key))\n        .unwrap();\n\n    let value = unsafe { get_any_field_float_in_struct(&struct_value, &enum_in_struct) };\n\n    assert!(value.is_ok());\n    assert_eq!(value.unwrap(), 2f64);\n}\n\n#[test]\nfn test_buffer_struct_in_struct_as_float_fails() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let struct_field = get_schema_field(&schema, \"pos\");\n    let struct_value = unsafe { get_field_struct(&root_table, &struct_field).unwrap().unwrap() };\n    let struct_schema = root_as_schema(schema.as_slice())\n        .unwrap()\n        .objects()\n        .get(struct_field.type_().index() as usize);\n    let struct_in_struct = struct_schema\n        .fields()\n        .lookup_by_key(\"test3\", |field, key| field.key_compare_with_value(key))\n        .unwrap();\n\n    let value = unsafe { get_any_field_float_in_struct(&struct_value, &struct_in_struct) };\n\n    assert!(value.is_err());\n    assert_eq!(\n        value.unwrap_err(),\n        FlatbufferError::FieldTypeMismatch(String::from(\"f64\"), String::from(\"Obj\"))\n    );\n}\n\n#[test]\nfn test_buffer_i16_in_struct_as_string_succeeds() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let struct_field = get_schema_field(&schema, \"pos\");\n    let struct_value = unsafe { get_field_struct(&root_table, &struct_field).unwrap().unwrap() };\n    let struct_schema = root_as_schema(schema.as_slice())\n        .unwrap()\n        .objects()\n        .get(struct_field.type_().index() as usize);\n    let nested_struct_field = struct_schema\n        .fields()\n        .lookup_by_key(\"test3\", |field, key| field.key_compare_with_value(key))\n        .unwrap();\n    let nested_struct_value =\n        unsafe { get_field_struct_in_struct(&struct_value, &nested_struct_field).unwrap() };\n    let nested_struct_schema = root_as_schema(schema.as_slice())\n        .unwrap()\n        .objects()\n        .get(nested_struct_field.type_().index() as usize);\n    let i16_in_struct = nested_struct_schema\n        .fields()\n        .lookup_by_key(\"a\", |field, key| field.key_compare_with_value(key))\n        .unwrap();\n\n    let value = unsafe {\n        get_any_field_string_in_struct(\n            &nested_struct_value,\n            &i16_in_struct,\n            &root_as_schema(schema.as_slice()).unwrap(),\n        )\n    };\n\n    assert_eq!(value, String::from(\"5\"));\n}\n\n#[test]\nfn test_buffer_f32_in_struct_as_string_succeeds() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let struct_field = get_schema_field(&schema, \"pos\");\n    let struct_value = unsafe { get_field_struct(&root_table, &struct_field).unwrap().unwrap() };\n    let struct_schema = root_as_schema(schema.as_slice())\n        .unwrap()\n        .objects()\n        .get(struct_field.type_().index() as usize);\n    let f32_in_struct = struct_schema\n        .fields()\n        .lookup_by_key(\"x\", |field, key| field.key_compare_with_value(key))\n        .unwrap();\n\n    let value = unsafe {\n        get_any_field_string_in_struct(\n            &struct_value,\n            &f32_in_struct,\n            &root_as_schema(schema.as_slice()).unwrap(),\n        )\n    };\n\n    assert_eq!(value, String::from(\"1\"));\n}\n\n#[test]\nfn test_buffer_enum_in_struct_as_string_succeeds() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let struct_field = get_schema_field(&schema, \"pos\");\n    let struct_value = unsafe { get_field_struct(&root_table, &struct_field).unwrap().unwrap() };\n    let struct_schema = root_as_schema(schema.as_slice())\n        .unwrap()\n        .objects()\n        .get(struct_field.type_().index() as usize);\n    let enum_in_struct = struct_schema\n        .fields()\n        .lookup_by_key(\"test2\", |field, key| field.key_compare_with_value(key))\n        .unwrap();\n\n    let value = unsafe {\n        get_any_field_string_in_struct(\n            &struct_value,\n            &enum_in_struct,\n            &root_as_schema(schema.as_slice()).unwrap(),\n        )\n    };\n\n    assert_eq!(value, String::from(\"2\"));\n}\n\n#[test]\nfn test_buffer_struct_in_struct_as_string_succeeds() {\n    let buffer = create_test_buffer();\n    let root_table = unsafe { get_any_root(&buffer) };\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let struct_field = get_schema_field(&schema, \"pos\");\n    let struct_value = unsafe { get_field_struct(&root_table, &struct_field).unwrap().unwrap() };\n    let struct_schema = root_as_schema(schema.as_slice())\n        .unwrap()\n        .objects()\n        .get(struct_field.type_().index() as usize);\n    let struct_in_struct = struct_schema\n        .fields()\n        .lookup_by_key(\"test3\", |field, key| field.key_compare_with_value(key))\n        .unwrap();\n\n    let value = unsafe {\n        get_any_field_string_in_struct(\n            &struct_value,\n            &struct_in_struct,\n            &root_as_schema(schema.as_slice()).unwrap(),\n        )\n    };\n\n    assert_eq!(value, String::from(\"MyGame.Example.Test { a: 5, b: 6, }\"));\n}\n\n#[test]\nfn test_buffer_set_valid_int_to_i16_succeeds() {\n    let mut buffer = create_test_buffer();\n    let table_loc = unsafe { get_any_root(&buffer) }.loc();\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let i16_field = get_schema_field(&schema, \"hp\");\n\n    let res = unsafe { set_any_field_integer(&mut buffer, table_loc, &i16_field, 111) };\n\n    assert!(res.is_ok());\n    let updated_table = unsafe { get_any_root(&buffer) };\n    let updated_value = unsafe { get_field_integer::<i16>(&updated_table, &i16_field) };\n    assert!(updated_value.is_ok());\n    assert_eq!(updated_value.unwrap(), Some(111));\n}\n\n#[test]\nfn test_buffer_set_integer_to_f32_succeeds() {\n    let mut buffer = create_test_buffer();\n    let table_loc = unsafe { get_any_root(&buffer) }.loc();\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let f32_field = get_schema_field(&schema, \"testf\");\n\n    let res = unsafe { set_any_field_integer(&mut buffer, table_loc, &f32_field, 111) };\n\n    assert!(res.is_ok());\n    let updated_table = unsafe { get_any_root(&buffer) };\n    let updated_value = unsafe { get_field_float::<f32>(&updated_table, &f32_field) };\n    assert!(updated_value.is_ok());\n    assert_approx_eq!(updated_value.unwrap().unwrap(), 111f32);\n}\n\n#[test]\nfn test_buffer_set_overflow_to_i16_fails() {\n    let mut buffer = create_test_buffer();\n    let table_loc = unsafe { get_any_root(&buffer) }.loc();\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let i16_field = get_schema_field(&schema, \"hp\");\n\n    let res = unsafe { set_any_field_integer(&mut buffer, table_loc, &i16_field, 32768) };\n\n    assert!(res.is_err());\n    assert_eq!(\n        res.unwrap_err(),\n        FlatbufferError::FieldTypeMismatch(String::from(\"i64\"), String::from(\"Short\"))\n    );\n}\n\n#[test]\nfn test_buffer_set_integer_to_string_fails() {\n    let mut buffer = create_test_buffer();\n    let table_loc = unsafe { get_any_root(&buffer) }.loc();\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let string_field = get_schema_field(&schema, \"name\");\n\n    let res = unsafe { set_any_field_integer(&mut buffer, table_loc, &string_field, 1) };\n\n    assert!(res.is_err());\n    assert_eq!(res.unwrap_err(), FlatbufferError::SetValueNotSupported);\n}\n\n#[test]\nfn test_buffer_set_integer_to_unset_fails() {\n    let mut buffer = create_test_buffer();\n    let table_loc = unsafe { get_any_root(&buffer) }.loc();\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let unset_field = get_schema_field(&schema, \"testf3\");\n\n    let res = unsafe { set_any_field_integer(&mut buffer, table_loc, &unset_field, 1) };\n\n    assert!(res.is_err());\n    assert_eq!(res.unwrap_err(), FlatbufferError::SetValueNotSupported);\n}\n\n#[test]\nfn test_buffer_set_valid_float_to_f32_succeeds() {\n    let mut buffer = create_test_buffer();\n    let table_loc = unsafe { get_any_root(&buffer) }.loc();\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let f32_field = get_schema_field(&schema, \"testf\");\n\n    let res = unsafe { set_any_field_float(&mut buffer, table_loc, &f32_field, 111.11) };\n\n    assert!(res.is_ok());\n    let updated_table = unsafe { get_any_root(&buffer) };\n    let updated_value = unsafe { get_field_float::<f32>(&updated_table, &f32_field) };\n    assert!(updated_value.is_ok());\n    assert_approx_eq!(updated_value.unwrap().unwrap(), 111.11);\n}\n\n#[test]\nfn test_buffer_set_float_to_i16_succeeds() {\n    let mut buffer = create_test_buffer();\n    let table_loc = unsafe { get_any_root(&buffer) }.loc();\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let i16_field = get_schema_field(&schema, \"hp\");\n\n    let res = unsafe { set_any_field_float(&mut buffer, table_loc, &i16_field, 111.11) };\n\n    assert!(res.is_ok());\n    let updated_table = unsafe { get_any_root(&buffer) };\n    let updated_value = unsafe { get_field_integer::<i16>(&updated_table, &i16_field) };\n    assert!(updated_value.is_ok());\n    assert_eq!(updated_value.unwrap(), Some(111));\n}\n\n#[test]\nfn test_buffer_set_overflow_to_f32_fails() {\n    let mut buffer = create_test_buffer();\n    let table_loc = unsafe { get_any_root(&buffer) }.loc();\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let f32_field = get_schema_field(&schema, \"testf\");\n\n    let res = unsafe { set_any_field_float(&mut buffer, table_loc, &f32_field, f64::MAX) };\n\n    assert!(res.is_err());\n    assert_eq!(\n        res.unwrap_err(),\n        FlatbufferError::FieldTypeMismatch(String::from(\"f64\"), String::from(\"Float\"))\n    );\n}\n\n#[test]\nfn test_buffer_set_float_to_string_fails() {\n    let mut buffer = create_test_buffer();\n    let table_loc = unsafe { get_any_root(&buffer) }.loc();\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let string_field = get_schema_field(&schema, \"name\");\n\n    let res = unsafe { set_any_field_float(&mut buffer, table_loc, &string_field, 1.1) };\n\n    assert!(res.is_err());\n    assert_eq!(res.unwrap_err(), FlatbufferError::SetValueNotSupported);\n}\n\n#[test]\nfn test_buffer_set_float_to_unset_fails() {\n    let mut buffer = create_test_buffer();\n    let table_loc = unsafe { get_any_root(&buffer) }.loc();\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let unset_field = get_schema_field(&schema, \"testf3\");\n\n    let res = unsafe { set_any_field_float(&mut buffer, table_loc, &unset_field, 1.1) };\n\n    assert!(res.is_err());\n    assert_eq!(res.unwrap_err(), FlatbufferError::SetValueNotSupported);\n}\n\n#[test]\nfn test_buffer_set_float_str_to_f32_succeeds() {\n    let mut buffer = create_test_buffer();\n    let table_loc = unsafe { get_any_root(&buffer) }.loc();\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let f32_field = get_schema_field(&schema, \"testf\");\n\n    let res = unsafe { set_any_field_string(&mut buffer, table_loc, &f32_field, \"111.11\") };\n\n    assert!(res.is_ok());\n    let updated_table = unsafe { get_any_root(&buffer) };\n    let updated_value = unsafe { get_field_float::<f32>(&updated_table, &f32_field) };\n    assert!(updated_value.is_ok());\n    assert_approx_eq!(updated_value.unwrap().unwrap(), 111.11);\n}\n\n#[test]\nfn test_buffer_set_int_str_to_i16_succeeds() {\n    let mut buffer = create_test_buffer();\n    let table_loc = unsafe { get_any_root(&buffer) }.loc();\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let i16_field = get_schema_field(&schema, \"hp\");\n\n    let res = unsafe { set_any_field_string(&mut buffer, table_loc, &i16_field, \"111\") };\n\n    assert!(res.is_ok());\n    let updated_table = unsafe { get_any_root(&buffer) };\n    let updated_value = unsafe { get_field_integer::<i16>(&updated_table, &i16_field) };\n    assert!(updated_value.is_ok());\n    assert_eq!(updated_value.unwrap(), Some(111));\n}\n\n#[test]\nfn test_buffer_set_non_num_str_to_f32_fails() {\n    let mut buffer = create_test_buffer();\n    let table_loc = unsafe { get_any_root(&buffer) }.loc();\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let f32_field = get_schema_field(&schema, \"testf\");\n\n    let res = unsafe { set_any_field_string(&mut buffer, table_loc, &f32_field, \"any\") };\n\n    assert!(res.is_err());\n    assert_eq!(res.unwrap_err().to_string(), \"invalid float literal\");\n}\n\n#[test]\nfn test_buffer_set_int_str_to_string_fails() {\n    let mut buffer = create_test_buffer();\n    let table_loc = unsafe { get_any_root(&buffer) }.loc();\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let string_field = get_schema_field(&schema, \"name\");\n\n    let res = unsafe { set_any_field_string(&mut buffer, table_loc, &string_field, \"1\") };\n\n    assert!(res.is_err());\n    assert_eq!(res.unwrap_err(), FlatbufferError::SetValueNotSupported);\n}\n\n#[test]\nfn test_buffer_set_int_str_to_unset_fails() {\n    let mut buffer = create_test_buffer();\n    let table_loc = unsafe { get_any_root(&buffer) }.loc();\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let unset_field = get_schema_field(&schema, \"testf3\");\n\n    let res = unsafe { set_any_field_string(&mut buffer, table_loc, &unset_field, \"1\") };\n\n    assert!(res.is_err());\n    assert_eq!(res.unwrap_err(), FlatbufferError::SetValueNotSupported);\n}\n\n#[test]\nfn test_buffer_set_i16_to_i16_succeeds() {\n    let mut buffer = create_test_buffer();\n    let table_loc = unsafe { get_any_root(&buffer) }.loc();\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let i16_field = get_schema_field(&schema, \"hp\");\n\n    let res = unsafe { set_field::<i16>(&mut buffer, table_loc, &i16_field, 111) };\n\n    assert!(res.is_ok());\n    let updated_table = unsafe { get_any_root(&buffer) };\n    let updated_value = unsafe { get_field_integer::<i16>(&updated_table, &i16_field) };\n    assert!(updated_value.is_ok());\n    assert_eq!(updated_value.unwrap(), Some(111));\n}\n\n#[test]\nfn test_buffer_set_i32_to_i16_fails() {\n    let mut buffer = create_test_buffer();\n    let table_loc = unsafe { get_any_root(&buffer) }.loc();\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let i16_field = get_schema_field(&schema, \"hp\");\n\n    let res = unsafe { set_field::<i32>(&mut buffer, table_loc, &i16_field, 111) };\n\n    assert!(res.is_err());\n    assert_eq!(\n        res.unwrap_err(),\n        FlatbufferError::FieldTypeMismatch(String::from(\"i32\"), String::from(\"Short\"))\n    );\n}\n\n#[test]\nfn test_buffer_set_f32_to_f32_succeeds() {\n    let mut buffer = create_test_buffer();\n    let table_loc = unsafe { get_any_root(&buffer) }.loc();\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let f32_field = get_schema_field(&schema, \"testf\");\n\n    let res = unsafe { set_field::<f32>(&mut buffer, table_loc, &f32_field, 111.11) };\n\n    assert!(res.is_ok());\n    let updated_table = unsafe { get_any_root(&buffer) };\n    let updated_value = unsafe { get_field_float::<f32>(&updated_table, &f32_field) };\n    assert!(updated_value.is_ok());\n    assert_approx_eq!(updated_value.unwrap().unwrap(), 111.11);\n}\n\n#[test]\nfn test_buffer_set_f64_to_f32_fails() {\n    let mut buffer = create_test_buffer();\n    let table_loc = unsafe { get_any_root(&buffer) }.loc();\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let f32_field = get_schema_field(&schema, \"testf\");\n\n    let res = unsafe { set_field::<f64>(&mut buffer, table_loc, &f32_field, 111.11) };\n\n    assert!(res.is_err());\n    assert_eq!(\n        res.unwrap_err(),\n        FlatbufferError::FieldTypeMismatch(String::from(\"f64\"), String::from(\"Float\"))\n    );\n}\n\n#[test]\nfn test_buffer_set_f32_to_f32_unset_fails() {\n    let mut buffer = create_test_buffer();\n    let table_loc = unsafe { get_any_root(&buffer) }.loc();\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let unset_field = get_schema_field(&schema, \"testf3\");\n\n    let res = unsafe { set_field::<f32>(&mut buffer, table_loc, &unset_field, 111.11) };\n\n    assert!(res.is_err());\n    assert_eq!(res.unwrap_err(), FlatbufferError::SetValueNotSupported);\n}\n\n#[test]\nfn test_buffer_set_string_same_str_succeeds() {\n    let mut buffer = create_test_buffer();\n    let table_loc = unsafe { get_any_root(&buffer) }.loc();\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let string_field = get_schema_field(&schema, \"name\");\n\n    let res = unsafe {\n        set_string(\n            &mut buffer,\n            table_loc,\n            &string_field,\n            \"MyMonster\",\n            &root_as_schema(schema.as_slice()).unwrap(),\n        )\n    };\n\n    assert!(res.is_ok());\n    let updated_table = unsafe { get_any_root(&buffer) };\n    let updated_value = unsafe { get_field_string(&updated_table, &string_field) };\n    assert!(updated_value.is_ok());\n    assert_eq!(updated_value.unwrap(), Some(\"MyMonster\"));\n}\n\n#[test]\nfn test_buffer_set_string_same_size_succeeds() {\n    let mut buffer = create_test_buffer();\n    let table_loc = unsafe { get_any_root(&buffer) }.loc();\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let string_field = get_schema_field(&schema, \"name\");\n\n    let res = unsafe {\n        set_string(\n            &mut buffer,\n            table_loc,\n            &string_field,\n            \"YoMonster\",\n            &root_as_schema(schema.as_slice()).unwrap(),\n        )\n    };\n\n    assert!(res.is_ok());\n    let updated_table = unsafe { get_any_root(&buffer) };\n    let updated_value = unsafe { get_field_string(&updated_table, &string_field) };\n    assert!(updated_value.is_ok());\n    assert_eq!(updated_value.unwrap(), Some(\"YoMonster\"));\n}\n\n#[test]\nfn test_buffer_set_string_bigger_size_succeeds() {\n    let mut buffer = create_test_buffer();\n    let table_loc = unsafe { get_any_root(&buffer) }.loc();\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let string_field = get_schema_field(&schema, \"name\");\n\n    let res = unsafe {\n        set_string(\n            &mut buffer,\n            table_loc,\n            &string_field,\n            \"AStringWithSlightlyBiggerSize\",\n            &root_as_schema(schema.as_slice()).unwrap(),\n        )\n    };\n\n    assert!(res.is_ok());\n    let updated_table = unsafe { get_any_root(&buffer) };\n    let updated_value = unsafe { get_field_string(&updated_table, &string_field) };\n    assert!(updated_value.is_ok());\n    assert_eq!(updated_value.unwrap(), Some(\"AStringWithSlightlyBiggerSize\"));\n}\n\n#[test]\nfn test_buffer_set_string_smaller_size_succeeds() {\n    let mut buffer = create_test_buffer();\n    let table_loc = unsafe { get_any_root(&buffer) }.loc();\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let string_field = get_schema_field(&schema, \"name\");\n\n    let res = unsafe {\n        set_string(\n            &mut buffer,\n            table_loc,\n            &string_field,\n            \"s\",\n            &root_as_schema(schema.as_slice()).unwrap(),\n        )\n    };\n\n    assert!(res.is_ok());\n    let updated_table = unsafe { get_any_root(&buffer) };\n    let updated_value = unsafe { get_field_string(&updated_table, &string_field) };\n    assert!(updated_value.is_ok());\n    assert_eq!(updated_value.unwrap(), Some(\"s\"));\n}\n\n#[test]\nfn test_buffer_set_string_diff_type_fails() {\n    let mut buffer = create_test_buffer();\n    let table_loc = unsafe { get_any_root(&buffer) }.loc();\n    let schema = load_file_as_buffer(\"../monster_test.bfbs\");\n    let f32_field = get_schema_field(&schema, \"testf\");\n\n    let res = unsafe {\n        set_string(\n            &mut buffer,\n            table_loc,\n            &f32_field,\n            \"any\",\n            &root_as_schema(schema.as_slice()).unwrap(),\n        )\n    };\n\n    assert!(res.is_err());\n    assert_eq!(\n        res.unwrap_err(),\n        FlatbufferError::FieldTypeMismatch(String::from(\"String\"), String::from(\"Float\"))\n    );\n}\n\n#[test]\nfn test_create_safe_buffer_default_options_succeeds() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n\n    let safe_buffer = SafeBuffer::new(&buffer, &schema);\n\n    assert!(safe_buffer.is_ok());\n}\n\n#[test]\nfn test_create_safe_buffer_limit_max_depth_fails() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let verify_options = VerifierOptions { max_depth: 1, ..Default::default() };\n\n    let safe_buffer = SafeBuffer::new_with_options(&buffer, &schema, &verify_options);\n\n    assert!(safe_buffer.is_err());\n    assert!(format!(\"{:#?}\", safe_buffer.err().unwrap()).contains(\"DepthLimitReached\"));\n}\n\n#[test]\nfn test_create_safe_buffer_limit_max_table_fails() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let verify_options = VerifierOptions { max_tables: 1, ..Default::default() };\n\n    let safe_buffer = SafeBuffer::new_with_options(&buffer, &schema, &verify_options);\n\n    assert!(safe_buffer.is_err());\n    assert!(format!(\"{:#?}\", safe_buffer.err().unwrap()).contains(\"TooManyTables\"));\n}\n\n#[test]\nfn test_create_safe_buffer_limit_max_size_fails() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let verify_options = VerifierOptions { max_apparent_size: 1 << 6, ..Default::default() };\n\n    let safe_buffer = SafeBuffer::new_with_options(&buffer, &schema, &verify_options);\n\n    assert!(safe_buffer.is_err());\n    assert!(format!(\"{:#?}\", safe_buffer.err().unwrap()).contains(\"ApparentSizeTooLarge\"));\n}\n\n#[test]\nfn test_safe_buffer_integer_same_type_succeeds() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n\n    let value = root_table.get_field_integer::<i16>(\"hp\");\n\n    assert!(value.is_ok());\n    assert_eq!(value.unwrap(), Some(32767));\n}\n\n#[test]\nfn test_safe_buffer_integer_invalid_field_fails() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n\n    let value = root_table.get_field_integer::<i16>(\"nonexistent\");\n\n    assert!(value.is_err());\n    assert_eq!(value.unwrap_err(), FlatbufferError::FieldNotFound);\n}\n\n#[test]\nfn test_safe_buffer_integer_diff_size_fails() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n\n    let value = root_table.get_field_integer::<i64>(\"hp\");\n\n    assert!(value.is_err());\n    assert_eq!(\n        value.unwrap_err(),\n        FlatbufferError::FieldTypeMismatch(String::from(\"i64\"), String::from(\"Short\"))\n    );\n}\n\n#[test]\nfn test_safe_buffer_float_same_type_succeeds() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n\n    let value = root_table.get_field_float::<f32>(\"testf\");\n\n    assert!(value.is_ok());\n    assert_eq!(value.unwrap(), Some(3.14));\n}\n\n#[test]\nfn test_safe_buffer_float_invalid_field_fails() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n\n    let value = root_table.get_field_float::<f32>(\"non_existent\");\n\n    assert!(value.is_err());\n    assert_eq!(value.unwrap_err(), FlatbufferError::FieldNotFound);\n}\n\n#[test]\nfn test_safe_buffer_float_diff_type_fails() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n\n    let value = root_table.get_field_float::<f64>(\"testf\");\n\n    assert!(value.is_err());\n    assert_eq!(\n        value.unwrap_err(),\n        FlatbufferError::FieldTypeMismatch(String::from(\"f64\"), String::from(\"Float\"))\n    );\n}\n\n#[test]\nfn test_safe_buffer_string_same_type_succeeds() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n\n    let value = root_table.get_field_string(\"name\");\n\n    assert!(value.is_ok());\n    assert_eq!(value.unwrap(), Some(\"MyMonster\"));\n}\n\n#[test]\nfn test_safe_buffer_string_invalid_field_fails() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n\n    let value = root_table.get_field_string(\"non_existent\");\n\n    assert!(value.is_err());\n    assert_eq!(value.unwrap_err(), FlatbufferError::FieldNotFound);\n}\n\n#[test]\nfn test_safe_buffer_string_diff_type_fails() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n\n    let value = root_table.get_field_string(\"testf\");\n\n    assert!(value.is_err());\n    assert_eq!(\n        value.unwrap_err(),\n        FlatbufferError::FieldTypeMismatch(String::from(\"String\"), String::from(\"Float\"))\n    );\n}\n\n#[test]\nfn test_safe_buffer_struct_same_type_succeeds() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n\n    let value = root_table.get_field_struct(\"pos\");\n\n    assert!(value.is_ok());\n    let optional_value = value.unwrap();\n    assert!(optional_value.is_some());\n    let safe_struct = optional_value.unwrap();\n    assert!(safe_struct.get_field_struct(\"test3\").is_ok());\n}\n\n#[test]\nfn test_safe_buffer_struct_invalid_field_fails() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n\n    let value = root_table.get_field_struct(\"non_existent\");\n\n    assert!(value.is_err());\n    assert_eq!(value.unwrap_err(), FlatbufferError::FieldNotFound);\n}\n\n#[test]\nfn test_safe_buffer_struct_diff_type_fails() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n\n    let value = root_table.get_field_struct(\"testf\");\n\n    assert!(value.is_err());\n    assert_eq!(\n        value.unwrap_err(),\n        FlatbufferError::FieldTypeMismatch(String::from(\"Obj\"), String::from(\"Float\"))\n    );\n}\n\n#[test]\nfn test_safe_buffer_vector_same_type_succeeds() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n\n    let value = root_table.get_field_vector::<u8>(\"inventory\");\n\n    assert!(value.is_ok());\n    let optional_vector = value.unwrap();\n    assert!(optional_vector.is_some());\n    let vector = optional_vector.unwrap();\n    assert_eq!(vector.len(), 5);\n    assert_eq!(vector.get(0), 0);\n    assert_eq!(vector.get(1), 1);\n    assert_eq!(vector.get(2), 2);\n    assert_eq!(vector.get(3), 3);\n    assert_eq!(vector.get(4), 4);\n}\n\n#[test]\nfn test_safe_buffer_vector_invalid_field_fails() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n\n    let value = root_table.get_field_vector::<u8>(\"non_existent\");\n\n    assert!(value.is_err());\n    assert_eq!(value.unwrap_err(), FlatbufferError::FieldNotFound);\n}\n\n#[test]\nfn test_safe_buffer_vector_diff_type_fails() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n\n    let value = root_table.get_field_vector::<u8>(\"testf\");\n\n    assert!(value.is_err());\n    assert_eq!(\n        value.unwrap_err(),\n        FlatbufferError::FieldTypeMismatch(String::from(\"u8\"), String::from(\"Float\"))\n    );\n}\n\n#[test]\nfn test_safe_buffer_table_same_type_succeeds() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n\n    let value = root_table.get_field_table(\"testempty\");\n\n    assert!(value.is_ok());\n    let optional_nested_table = value.unwrap();\n    assert!(optional_nested_table.is_some());\n    let nested_table = optional_nested_table.unwrap();\n    let nested_field_value = nested_table.get_field_string(\"id\");\n\n    assert!(nested_field_value.is_ok());\n    assert_eq!(nested_field_value.unwrap(), Some(\"Fred\"));\n}\n\n#[test]\nfn test_safe_buffer_table_invalid_field_fails() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n\n    let value = root_table.get_field_table(\"non_existent\");\n\n    assert!(value.is_err());\n    assert_eq!(value.unwrap_err(), FlatbufferError::FieldNotFound);\n}\n\n#[test]\nfn test_safe_buffer_table_diff_type_fails() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n\n    let value = root_table.get_field_table(\"testf\");\n\n    assert!(value.is_err());\n    assert_eq!(\n        value.unwrap_err(),\n        FlatbufferError::FieldTypeMismatch(String::from(\"Obj\"), String::from(\"Float\"))\n    );\n}\n\n#[test]\nfn test_safe_buffer_i16_as_integer_succeeds() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n\n    let value = root_table.get_any_field_integer(\"hp\");\n\n    assert!(value.is_ok());\n    assert_eq!(value.unwrap(), 32767);\n}\n\n#[test]\nfn test_safe_buffer_i16_as_integer_invalid_field_fails() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n\n    let value = root_table.get_any_field_integer(\"non_existent\");\n\n    assert!(value.is_err());\n    assert_eq!(value.unwrap_err(), FlatbufferError::FieldNotFound);\n}\n\n#[test]\nfn test_safe_buffer_string_as_integer_fails() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n\n    let value = root_table.get_any_field_integer(\"name\");\n\n    assert!(value.is_err());\n    assert_eq!(\n        value.unwrap_err(),\n        FlatbufferError::FieldTypeMismatch(String::from(\"i64\"), String::from(\"String\"))\n    );\n}\n\n#[test]\nfn test_safe_buffer_i16_as_float_succeeds() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n\n    let value = root_table.get_any_field_float(\"hp\");\n\n    assert!(value.is_ok());\n    assert_eq!(value.unwrap(), 32767f64);\n}\n\n#[test]\nfn test_safe_buffer_i16_as_float_invalid_field_fails() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n\n    let value = root_table.get_any_field_float(\"non_existent\");\n\n    assert!(value.is_err());\n    assert_eq!(value.unwrap_err(), FlatbufferError::FieldNotFound);\n}\n\n#[test]\nfn test_safe_buffer_string_as_float_fails() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n\n    let value = root_table.get_any_field_float(\"name\");\n\n    assert!(value.is_err());\n    assert_eq!(\n        value.unwrap_err(),\n        FlatbufferError::FieldTypeMismatch(String::from(\"f64\"), String::from(\"String\"))\n    );\n}\n\n#[test]\nfn test_safe_buffer_string_as_string_succeeds() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n\n    let value = root_table.get_any_field_string(\"name\");\n\n    assert!(value.is_ok());\n    assert_eq!(value.unwrap(), \"MyMonster\");\n}\n\n#[test]\nfn test_safe_buffer_i16_as_string_invalid_field_fails() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n\n    let value = root_table.get_any_field_string(\"non_existent\");\n\n    assert!(value.is_err());\n    assert_eq!(value.unwrap_err(), FlatbufferError::FieldNotFound);\n}\n\n#[test]\nfn test_safe_buffer_nested_struct_same_type_succeeds() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n    let struct_value = root_table.get_field_struct(\"pos\").unwrap().unwrap();\n\n    let nested_struct_value = struct_value.get_field_struct(\"test3\");\n\n    assert!(nested_struct_value.is_ok());\n    let value = nested_struct_value.unwrap();\n    assert!(value.get_any_field_integer(\"a\").is_ok());\n}\n\n#[test]\nfn test_safe_buffer_nested_struct_invalid_field_fails() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n    let struct_value = root_table.get_field_struct(\"pos\").unwrap().unwrap();\n\n    let value = struct_value.get_field_struct(\"non_existent\");\n\n    assert!(value.is_err());\n    assert_eq!(value.unwrap_err(), FlatbufferError::FieldNotFound);\n}\n\n#[test]\nfn test_safe_buffer_nested_struct_diff_type_fails() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n    let struct_value = root_table.get_field_struct(\"pos\").unwrap().unwrap();\n\n    let nested_struct_value = struct_value.get_field_struct(\"x\");\n\n    assert!(nested_struct_value.is_err());\n    assert_eq!(\n        nested_struct_value.unwrap_err(),\n        FlatbufferError::FieldTypeMismatch(String::from(\"Obj\"), String::from(\"Float\"))\n    );\n}\n\n#[test]\nfn test_safe_buffer_enum_in_struct_as_integer_succeeds() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n    let struct_value = root_table.get_field_struct(\"pos\").unwrap().unwrap();\n\n    let nested_enum_value = struct_value.get_any_field_integer(\"test2\");\n\n    assert!(nested_enum_value.is_ok());\n    assert_eq!(nested_enum_value.unwrap(), 2);\n}\n\n#[test]\nfn test_safe_buffer_enum_in_struct_as_integer_invalid_field_fails() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n    let struct_value = root_table.get_field_struct(\"pos\").unwrap().unwrap();\n\n    let value = struct_value.get_any_field_integer(\"non_existent\");\n\n    assert!(value.is_err());\n    assert_eq!(value.unwrap_err(), FlatbufferError::FieldNotFound);\n}\n\n#[test]\nfn test_safe_buffer_struct_in_struct_as_integer_fails() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n    let struct_value = root_table.get_field_struct(\"pos\").unwrap().unwrap();\n\n    let nested_struct_value = struct_value.get_any_field_integer(\"test3\");\n\n    assert!(nested_struct_value.is_err());\n    assert_eq!(\n        nested_struct_value.unwrap_err(),\n        FlatbufferError::FieldTypeMismatch(String::from(\"i64\"), String::from(\"Obj\"))\n    );\n}\n\n#[test]\nfn test_safe_buffer_i16_in_struct_as_float_succeeds() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n    let struct_value = root_table.get_field_struct(\"pos\").unwrap().unwrap();\n    let nested_struct_value = struct_value.get_field_struct(\"test3\").unwrap();\n\n    let nested_i16_value = nested_struct_value.get_any_field_float(\"a\");\n\n    assert!(nested_i16_value.is_ok());\n    assert_eq!(nested_i16_value.unwrap(), 5f64);\n}\n\n#[test]\nfn test_safe_buffer_child_in_struct_as_float_invalid_field_fails() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n    let struct_value = root_table.get_field_struct(\"pos\").unwrap().unwrap();\n\n    let value = struct_value.get_any_field_float(\"non_existent\");\n\n    assert!(value.is_err());\n    assert_eq!(value.unwrap_err(), FlatbufferError::FieldNotFound);\n}\n\n#[test]\nfn test_safe_buffer_struct_in_struct_as_float_fails() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n    let struct_value = root_table.get_field_struct(\"pos\").unwrap().unwrap();\n\n    let value = struct_value.get_any_field_float(\"test3\");\n\n    assert!(value.is_err());\n    assert_eq!(\n        value.unwrap_err(),\n        FlatbufferError::FieldTypeMismatch(String::from(\"f64\"), String::from(\"Obj\"))\n    );\n}\n\n#[test]\nfn test_safe_buffer_f32_in_struct_as_string_succeeds() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n    let struct_value = root_table.get_field_struct(\"pos\").unwrap().unwrap();\n\n    let nested_f32_value = struct_value.get_any_field_string(\"x\");\n\n    assert!(nested_f32_value.is_ok());\n    assert_eq!(nested_f32_value.unwrap(), String::from(\"1\"));\n}\n\n#[test]\nfn test_safe_buffer_child_in_struct_as_string_invalid_field_fails() {\n    let buffer = create_test_buffer();\n    let schema_buffer = load_file_as_buffer(\"../monster_test.bfbs\");\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let safe_buffer = SafeBuffer::new(&buffer, &schema).unwrap();\n    let root_table = safe_buffer.get_root();\n    let struct_value = root_table.get_field_struct(\"pos\").unwrap().unwrap();\n\n    let value = struct_value.get_any_field_string(\"non_existent\");\n\n    assert!(value.is_err());\n    assert_eq!(value.unwrap_err(), FlatbufferError::FieldNotFound);\n}\n\nfn load_file_as_buffer(path: &str) -> Vec<u8> {\n    std::fs::read(path).unwrap()\n}\n\nfn get_schema_field<'a>(schema_buffer: &'a Vec<u8>, field_name: &'a str) -> Field<'a> {\n    let schema = root_as_schema(schema_buffer.as_slice()).unwrap();\n    let root_table = schema.root_table().unwrap();\n    let fields = root_table.fields();\n    fields.lookup_by_key(field_name, |field, key| field.key_compare_with_value(key)).unwrap()\n}\n\nfn create_test_buffer() -> Vec<u8> {\n    let mut builder = FlatBufferBuilder::new();\n    let mon = {\n        let s0 = builder.create_string(\"test1\");\n        let s1 = builder.create_string(\"test2\");\n        let fred_name = builder.create_string(\"Fred\");\n\n        // can't inline creation of this Vec3 because we refer to it by reference, so it must live\n        // long enough to be used by MonsterArgs.\n        let pos = my_game::example::Vec3::new(\n            1.0,\n            2.0,\n            3.0,\n            3.0,\n            my_game::example::Color::Green,\n            &my_game::example::Test::new(5i16, 6i8),\n        );\n\n        let args = my_game::example::MonsterArgs {\n            hp: 32767,\n            testf: 3.14,\n            mana: 150,\n            name: Some(builder.create_string(\"MyMonster\")),\n            pos: Some(&pos),\n            test_type: my_game::example::Any::Monster,\n            testempty: Some(my_game::example::Stat::create(\n                &mut builder,\n                &my_game::example::StatArgs { id: Some(fred_name), ..Default::default() },\n            )),\n            test: Some(\n                my_game::example::Monster::create(\n                    &mut builder,\n                    &my_game::example::MonsterArgs { name: Some(fred_name), ..Default::default() },\n                )\n                .as_union_value(),\n            ),\n            inventory: Some(builder.create_vector(&[0u8, 1, 2, 3, 4])),\n            test4: Some(builder.create_vector(&[\n                my_game::example::Test::new(10, 20),\n                my_game::example::Test::new(30, 40),\n            ])),\n            testarrayofstring: Some(builder.create_vector(&[s0, s1])),\n            ..Default::default()\n        };\n        my_game::example::Monster::create(&mut builder, &args)\n    };\n    my_game::example::finish_monster_buffer(&mut builder, mon);\n    let (flatbuf, start_loc) = builder.mut_finished_buffer();\n    flatbuf[start_loc..].to_vec()\n}\n"
  },
  {
    "path": "tests/rust_serialize_test/Cargo.toml",
    "content": "[package]\nname = \"rust_serialize_test\"\nversion = \"0.1.0\"\nedition = \"2021\"\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\nflatbuffers = { path = \"../../rust/flatbuffers\", features=[\"serialize\"] }\nserde = \"1.0\"\nserde_json = \"1.0\"\n"
  },
  {
    "path": "tests/rust_serialize_test/src/main.rs",
    "content": "#[allow(dead_code, unused_imports)]\n#[path = \"../../monster_test_serialize/mod.rs\"]\nmod monster_test_serialize_generated;\npub use monster_test_serialize_generated::my_game;\n\nuse crate::my_game::example::AnyAmbiguousAliases;\nuse std::collections::HashMap;\n\nfn create_serialized_example_with_generated_code(builder: &mut flatbuffers::FlatBufferBuilder) {\n    let mon = {\n        let s0 = builder.create_string(\"test1\");\n        let s1 = builder.create_string(\"test2\");\n        let fred_name = builder.create_string(\"Fred\");\n\n        // can't inline creation of this Vec3 because we refer to it by reference, so it must live\n        // long enough to be used by MonsterArgs.\n        let pos = my_game::example::Vec3::new(\n            1.0,\n            2.0,\n            3.0,\n            3.0,\n            my_game::example::Color::Green,\n            &my_game::example::Test::new(5i16, 6i8),\n        );\n\n        let args = my_game::example::MonsterArgs {\n            hp: 80,\n            mana: 150,\n            name: Some(builder.create_string(\"MyMonster\")),\n            pos: Some(&pos),\n            test_type: my_game::example::Any::Monster,\n            test: Some(\n                my_game::example::Monster::create(\n                    builder,\n                    &my_game::example::MonsterArgs {\n                        name: Some(fred_name),\n                        ..Default::default()\n                    },\n                )\n                .as_union_value(),\n            ),\n            inventory: Some(builder.create_vector(&[0u8, 1, 2, 3, 4])),\n            test4: Some(builder.create_vector(&[\n                my_game::example::Test::new(10, 20),\n                my_game::example::Test::new(30, 40),\n            ])),\n            testarrayofstring: Some(builder.create_vector(&[s0, s1])),\n            ..Default::default()\n        };\n        my_game::example::Monster::create(builder, &args)\n    };\n    my_game::example::finish_monster_buffer(builder, mon);\n}\n\nfn main() {\n    // This test is built into its own crate because it has a different set of\n    // dependencies as the normal Rust tests; it requires that the `flatbuffer`\n    // dependency have the \"serialize\" feature enabled. As this feature may\n    // cause extra code gen and dependencies for those who do not need it, it\n    // is disabled by default.\n    let mut builder = flatbuffers::FlatBufferBuilder::new();\n    create_serialized_example_with_generated_code(&mut builder);\n\n    let data = builder.finished_data();\n    let obj = my_game::example::root_as_monster(&data[..]).unwrap();\n    let value = serde_json::to_value(&obj).unwrap();\n    let o = value.as_object().unwrap();\n\n    let pos = o.get(\"pos\").unwrap().as_object().unwrap();\n    assert_eq!(pos.get(\"x\").unwrap().as_f64().unwrap(), 1.0);\n    assert_eq!(pos.get(\"y\").unwrap().as_f64().unwrap(), 2.0);\n    assert_eq!(pos.get(\"z\").unwrap().as_f64().unwrap(), 3.0);\n\n    let mana = o.get(\"mana\").unwrap();\n    assert_eq!(mana.as_i64().unwrap(), 150);\n\n    let hp = o.get(\"hp\").unwrap();\n    assert_eq!(hp.as_i64().unwrap(), 80);\n\n    let name = o.get(\"name\").unwrap();\n    assert_eq!(name.as_str().unwrap(), \"MyMonster\");\n\n    let test_type = o.get(\"test_type\").unwrap();\n    assert_eq!(test_type.as_str().unwrap(), \"Monster\");\n\n    let testarrayofstring = o.get(\"testarrayofstring\").unwrap().as_array().unwrap();\n    let t0 = testarrayofstring[0].as_str().unwrap();\n    assert_eq!(t0, \"test1\");\n\n    let t1 = testarrayofstring[1].as_str().unwrap();\n    assert_eq!(t1, \"test2\");\n\n    let s = r#\"{\"val\":\"M1\"}\"#;\n    let des = serde_json::from_str::<HashMap<String, AnyAmbiguousAliases>>(s).unwrap();\n    assert_eq!(*des.get(\"val\").unwrap(), AnyAmbiguousAliases::M1);\n}\n"
  },
  {
    "path": "tests/rust_usage_test/Cargo.toml",
    "content": "[package]\nname = \"rust_usage_test\"\nversion = \"0.1.0\"\nauthors = [\"Robert Winslow <hello@rwinslow.com>\",\n           \"Casper Neo <cneo@google.com>\",\n           \"FlatBuffers Maintainers\"]\nedition = \"2018\"\n\n[dependencies]\nflatbuffers = { path = \"../../rust/flatbuffers\", default-features = false }\nflexbuffers = { path = \"../../rust/flexbuffers\" }\nserde_derive = \"1.0\"\nserde = \"1.0\"\nserde_bytes = \"0.11\"\nlibc_alloc = { version = \"1.0.3\", optional = true }\n\n[features]\ndefault = [\"flatbuffers/default\"]\nno_std = [\"libc_alloc\"]\n\n[[bin]]\nname = \"monster_example\"\npath = \"bin/monster_example.rs\"\n\n[[bin]]\nname = \"flatbuffers_alloc_check\"\npath = \"bin/flatbuffers_alloc_check.rs\"\ntest = false\n\n[[bin]]\nname = \"flexbuffers_alloc_check\"\npath = \"bin/flexbuffers_alloc_check.rs\"\ntest = false\n\n[[bin]]\nname = \"sample_flexbuffers\"\npath = \"../../samples/sample_flexbuffers.rs\"\n\n[[bin]]\nname = \"sample_flexbuffers_serde\"\npath = \"../../samples/sample_flexbuffers_serde.rs\"\n\n[[bin]]\nname = \"sample_flatbuffers\"\npath = \"../../samples/sample_binary.rs\"\n\n[dev-dependencies]\nquickcheck = \"0.6\"\n# TODO(rw): look into moving to criterion.rs\nserde = \"1.0\"\nbencher = \"0.1.5\"\nstatic_assertions = \"1.0.0\"\nrand = \"*\"\nquickcheck_derive = \"*\"\narray-init = \"2.0\"\n\n[[bench]]\n# setup for bencher\nname = \"benchmarks\"\nharness = false\n"
  },
  {
    "path": "tests/rust_usage_test/benches/benchmarks.rs",
    "content": "/*\n * Copyright 2020 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#[macro_use]\nextern crate bencher;\nextern crate flatbuffers;\nextern crate flexbuffers;\n\nmod flatbuffers_benchmarks;\nmod flexbuffers_benchmarks;\n\n#[allow(dead_code, unused_imports)]\n#[path = \"../../monster_test/mod.rs\"]\nmod monster_test_generated;\npub use monster_test_generated::my_game;\n\nbenchmark_main!(flatbuffers_benchmarks::benches, flexbuffers_benchmarks::benches);\n"
  },
  {
    "path": "tests/rust_usage_test/benches/flatbuffers_benchmarks.rs",
    "content": "/*\n * Copyright 2018 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nuse bencher::{benchmark_group, Bencher};\nuse flatbuffers;\n\n#[allow(dead_code, unused_imports)]\n#[path = \"../../monster_test/mod.rs\"]\nmod monster_test_generated;\npub use monster_test_generated::my_game;\n\nfn traverse_canonical_buffer(bench: &mut Bencher) {\n    let owned_data = {\n        let mut builder = &mut flatbuffers::FlatBufferBuilder::new();\n        create_serialized_example_with_generated_code(&mut builder, true);\n        builder.finished_data().to_vec()\n    };\n    let data = &owned_data[..];\n    let n = data.len() as u64;\n    bench.iter(|| {\n        traverse_serialized_example_with_generated_code(data);\n    });\n    bench.bytes = n;\n}\n\nfn create_canonical_buffer_then_reset(bench: &mut Bencher) {\n    let mut builder = &mut flatbuffers::FlatBufferBuilder::new();\n    // warmup\n    create_serialized_example_with_generated_code(&mut builder, true);\n    let n = builder.finished_data().len() as u64;\n    builder.reset();\n\n    bench.iter(|| {\n        let _ = create_serialized_example_with_generated_code(&mut builder, true);\n        builder.reset();\n    });\n\n    bench.bytes = n;\n}\n\n#[inline(always)]\nfn create_serialized_example_with_generated_code(\n    builder: &mut flatbuffers::FlatBufferBuilder,\n    finish: bool,\n) -> usize {\n    let s0 = builder.create_string(\"test1\");\n    let s1 = builder.create_string(\"test2\");\n    let t0_name = builder.create_string(\"Barney\");\n    let t1_name = builder.create_string(\"Fred\");\n    let t2_name = builder.create_string(\"Wilma\");\n    let t0 = my_game::example::Monster::create(\n        builder,\n        &my_game::example::MonsterArgs { hp: 1000, name: Some(t0_name), ..Default::default() },\n    );\n    let t1 = my_game::example::Monster::create(\n        builder,\n        &my_game::example::MonsterArgs { name: Some(t1_name), ..Default::default() },\n    );\n    let t2 = my_game::example::Monster::create(\n        builder,\n        &my_game::example::MonsterArgs { name: Some(t2_name), ..Default::default() },\n    );\n    let mon = {\n        let name = builder.create_string(\"MyMonster\");\n        let fred_name = builder.create_string(\"Fred\");\n        let inventory = builder.create_vector(&[0u8, 1, 2, 3, 4]);\n        let test4 = builder.create_vector(&[\n            my_game::example::Test::new(10, 20),\n            my_game::example::Test::new(30, 40),\n        ]);\n        let pos = my_game::example::Vec3::new(\n            1.0,\n            2.0,\n            3.0,\n            3.0,\n            my_game::example::Color::Green,\n            &my_game::example::Test::new(5i16, 6i8),\n        );\n        let args = my_game::example::MonsterArgs {\n            hp: 80,\n            mana: 150,\n            name: Some(name),\n            pos: Some(&pos),\n            test_type: my_game::example::Any::Monster,\n            test: Some(\n                my_game::example::Monster::create(\n                    builder,\n                    &my_game::example::MonsterArgs { name: Some(fred_name), ..Default::default() },\n                )\n                .as_union_value(),\n            ),\n            inventory: Some(inventory),\n            test4: Some(test4),\n            testarrayofstring: Some(builder.create_vector(&[s0, s1])),\n            testarrayoftables: Some(builder.create_vector(&[t0, t1, t2])),\n            ..Default::default()\n        };\n        my_game::example::Monster::create(builder, &args)\n    };\n    if finish {\n        my_game::example::finish_monster_buffer(builder, mon);\n    }\n\n    builder.finished_data().len()\n\n    // make it do some work\n    // if builder.finished_data().len() == 0 { panic!(\"bad benchmark\"); }\n}\n\n#[inline(always)]\nfn blackbox<T>(t: T) -> T {\n    // encapsulate this in case we need to turn it into a noop\n    bencher::black_box(t)\n}\n\n#[inline(always)]\nfn traverse_serialized_example_with_generated_code(bytes: &[u8]) {\n    let m = unsafe { my_game::example::root_as_monster_unchecked(bytes) };\n    blackbox(m.hp());\n    blackbox(m.mana());\n    blackbox(m.name());\n    let pos = m.pos().unwrap();\n    blackbox(pos.x());\n    blackbox(pos.y());\n    blackbox(pos.z());\n    blackbox(pos.test1());\n    blackbox(pos.test2());\n    let pos_test3 = pos.test3();\n    blackbox(pos_test3.a());\n    blackbox(pos_test3.b());\n    blackbox(m.test_type());\n    let table2 = m.test().unwrap();\n    let monster2 = unsafe { my_game::example::Monster::init_from_table(table2) };\n    blackbox(monster2.name());\n    blackbox(m.inventory());\n    blackbox(m.test4());\n    let testarrayoftables = m.testarrayoftables().unwrap();\n    blackbox(testarrayoftables.get(0).hp());\n    blackbox(testarrayoftables.get(0).name());\n    blackbox(testarrayoftables.get(1).name());\n    blackbox(testarrayoftables.get(2).name());\n    let testarrayofstring = m.testarrayofstring().unwrap();\n    blackbox(testarrayofstring.get(0));\n    blackbox(testarrayofstring.get(1));\n}\n\nfn create_string_10(bench: &mut Bencher) {\n    let builder = &mut flatbuffers::FlatBufferBuilder::with_capacity(1 << 20);\n    let mut i = 0;\n    bench.iter(|| {\n        builder.create_string(\"foobarbaz\"); // zero-terminated -> 10 bytes\n        i += 1;\n        if i == 10000 {\n            builder.reset();\n            i = 0;\n        }\n    });\n\n    bench.bytes = 10;\n}\n\nfn create_string_100(bench: &mut Bencher) {\n    let builder = &mut flatbuffers::FlatBufferBuilder::with_capacity(1 << 20);\n    let s_owned = (0..99).map(|_| \"x\").collect::<String>();\n    let s: &str = &s_owned;\n\n    let mut i = 0;\n    bench.iter(|| {\n        builder.create_string(s); // zero-terminated -> 100 bytes\n        i += 1;\n        if i == 1000 {\n            builder.reset();\n            i = 0;\n        }\n    });\n\n    bench.bytes = s.len() as u64;\n}\n\nfn create_byte_vector_100_naive(bench: &mut Bencher) {\n    let builder = &mut flatbuffers::FlatBufferBuilder::with_capacity(1 << 20);\n    let v_owned = (0u8..100).map(|i| i).collect::<Vec<u8>>();\n    let v: &[u8] = &v_owned;\n\n    let mut i = 0;\n    bench.iter(|| {\n        builder.create_vector(v); // zero-terminated -> 100 bytes\n        i += 1;\n        if i == 10000 {\n            builder.reset();\n            i = 0;\n        }\n    });\n\n    bench.bytes = v.len() as u64;\n}\n\nfn create_byte_vector_100_optimal(bench: &mut Bencher) {\n    let builder = &mut flatbuffers::FlatBufferBuilder::with_capacity(1 << 20);\n    let v_owned = (0u8..100).map(|i| i).collect::<Vec<u8>>();\n    let v: &[u8] = &v_owned;\n\n    let mut i = 0;\n    bench.iter(|| {\n        builder.create_vector(v);\n        i += 1;\n        if i == 10000 {\n            builder.reset();\n            i = 0;\n        }\n    });\n\n    bench.bytes = v.len() as u64;\n}\n\nfn create_many_tables(bench: &mut Bencher) {\n    let builder = &mut flatbuffers::FlatBufferBuilder::with_capacity(1 << 20);\n    // We test vtable overhead by making many unique tables of up to 16 fields of u8s.\n    bench.iter(|| {\n        for i in 0..(1u16 << 10) {\n            let t = builder.start_table();\n            for j in 0..15 {\n                if i & (1 << j) == 1 {\n                    builder.push_slot_always(i * 2, 42u8);\n                }\n            }\n            builder.end_table(t);\n        }\n        builder.reset();\n    });\n    bench.bytes = 1 << 15;\n}\n\nbenchmark_group!(\n    benches,\n    create_byte_vector_100_naive,\n    create_byte_vector_100_optimal,\n    traverse_canonical_buffer,\n    create_canonical_buffer_then_reset,\n    create_string_10,\n    create_string_100,\n    create_many_tables,\n);\n"
  },
  {
    "path": "tests/rust_usage_test/benches/flexbuffers_benchmarks.rs",
    "content": "// Copyright 2019 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nuse bencher::{benchmark_group, benchmark_main, Bencher};\nuse flexbuffers::*;\n\nfn push_vec_u64_to_map(b: &mut Bencher) {\n    let va = vec![u64::max_value() - 10; 512];\n    let vb = vec![u64::max_value() - 20; 512];\n    let vc = vec![u64::max_value() - 30; 512];\n    let mut n = 0;\n\n    b.iter(|| {\n        let mut fxb = Builder::default();\n        let mut m = fxb.start_map();\n        let mut ma = m.start_vector(\"a\");\n        for &a in va.iter() {\n            ma.push(a);\n        }\n        ma.end_vector();\n        let mut mb = m.start_vector(\"b\");\n        for &b in vb.iter() {\n            mb.push(b);\n        }\n        mb.end_vector();\n        let mut mc = m.start_vector(\"c\");\n        for &c in vc.iter() {\n            mc.push(c);\n        }\n        mc.end_vector();\n        m.end_map();\n        n = fxb.view().len();\n    });\n    b.bytes = n as u64;\n}\nfn push_vec_u64_to_map_reused(b: &mut Bencher) {\n    let va = vec![u64::max_value() - 10; 512];\n    let vb = vec![u64::max_value() - 20; 512];\n    let vc = vec![u64::max_value() - 30; 512];\n    let mut fxb = Builder::default();\n    let mut n = 0;\n    let mut go = || {\n        let mut m = fxb.start_map();\n        let mut ma = m.start_vector(\"a\");\n        for &a in va.iter() {\n            ma.push(a);\n        }\n        ma.end_vector();\n        let mut mb = m.start_vector(\"b\");\n        for &b in vb.iter() {\n            mb.push(b);\n        }\n        mb.end_vector();\n        let mut mc = m.start_vector(\"c\");\n        for &c in vc.iter() {\n            mc.push(c);\n        }\n        mc.end_vector();\n        m.end_map();\n        n = fxb.view().len();\n    };\n    go(); // warm up allocations.\n    b.iter(go);\n    b.bytes = n as u64;\n}\nfn push_vec_u64_to_map_direct(b: &mut Bencher) {\n    let va = vec![u64::max_value() - 10; 512];\n    let vb = vec![u64::max_value() - 20; 512];\n    let vc = vec![u64::max_value() - 30; 512];\n    let mut n = 0;\n\n    b.iter(|| {\n        let mut fxb = Builder::default();\n        let mut m = fxb.start_map();\n        m.push(\"a\", &va);\n        m.push(\"b\", &vb);\n        m.push(\"c\", &vc);\n        m.end_map();\n        n = fxb.view().len();\n    });\n    b.bytes = n as u64;\n}\nfn push_vec_u64_to_map_direct_reused(b: &mut Bencher) {\n    let va = vec![u64::max_value() - 10; 512];\n    let vb = vec![u64::max_value() - 20; 512];\n    let vc = vec![u64::max_value() - 30; 512];\n    let mut n = 0;\n    let mut fxb = Builder::default();\n    let mut go = || {\n        let mut m = fxb.start_map();\n        m.push(\"a\", &va);\n        m.push(\"b\", &vb);\n        m.push(\"c\", &vc);\n        m.end_map();\n        n = fxb.view().len();\n    };\n    go(); // warm up allocations.\n    b.iter(go);\n    b.bytes = n as u64;\n}\n\nfn push_vec_without_indirect(b: &mut Bencher) {\n    let mut builder = Builder::default();\n    let mut n = 0;\n    let mut go = || {\n        let mut b = builder.start_vector();\n        for i in 0..1024u16 {\n            b.push(i);\n        }\n        b.push(i64::max_value());\n        b.end_vector();\n        n = builder.view().len();\n    };\n    go(); // warm up allocations.\n    b.iter(go);\n    b.bytes = n as u64;\n}\n// This isn't actually faster than the alternative but it is a lot smaller.\n// Based on the above benchmarks a lot of time is stuck in the `values` stack.\nfn push_vec_with_indirect(b: &mut Bencher) {\n    let mut builder = Builder::default();\n    let mut n = 0;\n    let mut go = || {\n        let mut b = builder.start_vector();\n        for i in 0..1024u16 {\n            b.push(i);\n        }\n        b.push(IndirectInt(i64::max_value()));\n        b.end_vector();\n        n = builder.view().len();\n    };\n    go(); // warm up allocations.\n    b.iter(go);\n    b.bytes = n as u64;\n}\n\nfn example_map<'a>(m: &mut MapBuilder<'a>) {\n    m.push(\"some_ints\", &[256; 5]);\n    m.push(\"some_uints\", &[256u16; 5]);\n    m.push(\"some_floats\", &[256f32; 5]);\n    m.push(\"some_strings\", \"muahahahahaha\");\n}\nfn hundred_maps(b: &mut Bencher) {\n    let mut builder = Builder::default();\n    let mut n = 0;\n    let mut go = || {\n        let mut v = builder.start_vector();\n        for _ in 0..100 {\n            example_map(&mut v.start_map());\n        }\n        v.end_vector();\n        n = builder.view().len();\n    };\n    go(); // Warm up allocations.\n    b.iter(go);\n    b.bytes = n as u64;\n}\nfn hundred_maps_pooled(b: &mut Bencher) {\n    let mut builder = Builder::default();\n    let mut n = 0;\n    let mut go = || {\n        let mut v = builder.start_vector();\n        for _ in 0..100 {\n            example_map(&mut v.start_map());\n        }\n        v.end_vector();\n        n = builder.view().len();\n    };\n    go(); // Warm up allocations.\n    b.iter(go);\n    b.bytes = n as u64;\n}\nfn make_monster(mut monster: MapBuilder) {\n    monster.push(\"type\", \"great orc\");\n    monster.push(\"age\", 100u8);\n    monster.push(\"name\", \"Mr. Orc\");\n    monster.push(\"coins\", &[1, 25, 50, 100, 250]);\n    monster.push(\"color\", &[255u8, 0, 0, 0]);\n    {\n        let mut weapons = monster.start_vector(\"weapons\");\n        {\n            let mut hammer = weapons.start_map();\n            hammer.push(\"name\", \"hammer\");\n            hammer.push(\"damage type\", \"crush\");\n            hammer.push(\"damage\", 20);\n        }\n        {\n            let mut axe = weapons.start_map();\n            axe.push(\"name\", \"Great Axe\");\n            axe.push(\"damage type\", \"slash\");\n            axe.push(\"damage\", 30);\n        }\n    }\n    {\n        let mut sounds = monster.start_vector(\"sounds\");\n        sounds.push(\"grr\");\n        sounds.push(\"rawr\");\n        sounds.push(\"muahaha\");\n    }\n}\nfn serialize_monsters(b: &mut Bencher) {\n    let mut builder = Builder::default();\n    let mut n = 0;\n    let mut go = || {\n        let mut monsters = builder.start_vector();\n        for _ in 0..100 {\n            make_monster(monsters.start_map())\n        }\n        monsters.end_vector();\n        n = builder.view().len();\n    };\n    go(); // Warm up allocations.\n    b.iter(go);\n    b.bytes = n as u64;\n}\nfn validate_monster(r: MapReader<&[u8]>) {\n    assert_eq!(r.idx(\"type\").as_str(), \"great orc\");\n    assert_eq!(r.idx(\"age\").as_u8(), 100);\n    assert_eq!(r.idx(\"name\").as_str(), \"Mr. Orc\");\n    assert!(r\n        .idx(\"coins\")\n        .as_vector()\n        .iter()\n        .map(|c| c.as_i16())\n        .eq([1, 25, 50, 100, 250].iter().cloned()));\n    assert!(r\n        .idx(\"color\")\n        .as_vector()\n        .iter()\n        .map(|c| c.as_u8())\n        .eq([255, 0, 0, 0].iter().cloned()));\n\n    let weapons = r.idx(\"weapons\").as_vector();\n    assert_eq!(weapons.len(), 2);\n\n    let hammer = weapons.idx(0).as_map();\n    assert_eq!(hammer.idx(\"name\").as_str(), \"hammer\");\n    assert_eq!(hammer.idx(\"damage type\").as_str(), \"crush\");\n    assert_eq!(hammer.idx(\"damage\").as_u64(), 20);\n\n    let axe = weapons.idx(1).as_map();\n    assert_eq!(axe.idx(\"name\").as_str(), \"Great Axe\");\n    assert_eq!(axe.idx(\"damage type\").as_str(), \"slash\");\n    assert_eq!(axe.idx(\"damage\").as_u64(), 30);\n\n    assert!(r\n        .idx(\"sounds\")\n        .as_vector()\n        .iter()\n        .map(|s| s.as_str())\n        .eq([\"grr\", \"rawr\", \"muahaha\"].iter().cloned()));\n}\nfn read_monsters(b: &mut Bencher) {\n    let mut builder = Builder::default();\n    let mut monsters = builder.start_vector();\n    for _ in 0..100 {\n        make_monster(monsters.start_map());\n    }\n    monsters.end_vector();\n    b.bytes = builder.view().len() as u64;\n    let go = || {\n        let r = Reader::get_root(builder.view()).unwrap().as_vector();\n        assert_eq!(r.len(), 100);\n        for i in 0..100 {\n            validate_monster(r.idx(i).as_map());\n        }\n    };\n    b.iter(go);\n}\n\nbenchmark_group!(\n    benches,\n    push_vec_u64_to_map,\n    push_vec_u64_to_map_reused,\n    push_vec_u64_to_map_direct,\n    push_vec_u64_to_map_direct_reused,\n    push_vec_without_indirect,\n    push_vec_with_indirect,\n    hundred_maps,\n    hundred_maps_pooled,\n    serialize_monsters,\n    read_monsters,\n);\nbenchmark_main!(benches);\n"
  },
  {
    "path": "tests/rust_usage_test/bin/flatbuffers_alloc_check.rs",
    "content": "// define a passthrough allocator that tracks alloc calls.\n// (note that we can't drop this in to the usual test suite, because it's a big\n// global variable).\nuse std::alloc::{GlobalAlloc, Layout, System};\n\nstatic mut N_ALLOCS: usize = 0;\n\nstruct TrackingAllocator;\n\nimpl TrackingAllocator {\n    fn n_allocs(&self) -> usize {\n        unsafe { N_ALLOCS }\n    }\n}\n\nunsafe impl GlobalAlloc for TrackingAllocator {\n    unsafe fn alloc(&self, layout: Layout) -> *mut u8 {\n        N_ALLOCS += 1;\n        System.alloc(layout)\n    }\n    unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {\n        System.dealloc(ptr, layout)\n    }\n}\n\n// use the tracking allocator:\n#[global_allocator]\nstatic A: TrackingAllocator = TrackingAllocator;\n\n// import the flatbuffers generated code:\nextern crate flatbuffers;\n\n#[allow(dead_code, unused_imports, clippy::all)]\n#[path = \"../../monster_test/mod.rs\"]\nmod monster_test_generated;\n\npub use monster_test_generated::my_game;\n\n// verbatim from the test suite:\nfn create_serialized_example_with_generated_code(builder: &mut flatbuffers::FlatBufferBuilder) {\n    let mon = {\n        let strings = [\n            builder.create_string(\"these\"),\n            builder.create_string(\"unused\"),\n            builder.create_string(\"strings\"),\n            builder.create_string(\"check\"),\n            builder.create_string(\"the\"),\n            builder.create_string(\"create_vector_of_strings\"),\n            builder.create_string(\"function\"),\n        ];\n        let _ = builder.create_vector(&strings);\n\n        let s0 = builder.create_string(\"test1\");\n        let s1 = builder.create_string(\"test2\");\n        let fred_name = builder.create_string(\"Fred\");\n\n        // can't inline creation of this Vec3 because we refer to it by reference, so it must live\n        // long enough to be used by MonsterArgs.\n        let pos = my_game::example::Vec3::new(\n            1.0,\n            2.0,\n            3.0,\n            3.0,\n            my_game::example::Color::Green,\n            &my_game::example::Test::new(5i16, 6i8),\n        );\n\n        let args = my_game::example::MonsterArgs {\n            hp: 80,\n            mana: 150,\n            name: Some(builder.create_string(\"MyMonster\")),\n            pos: Some(&pos),\n            test_type: my_game::example::Any::Monster,\n            test: Some(\n                my_game::example::Monster::create(\n                    builder,\n                    &my_game::example::MonsterArgs { name: Some(fred_name), ..Default::default() },\n                )\n                .as_union_value(),\n            ),\n            inventory: Some(builder.create_vector(&[0u8, 1, 2, 3, 4])),\n            test4: Some(builder.create_vector(&[\n                my_game::example::Test::new(10, 20),\n                my_game::example::Test::new(30, 40),\n            ])),\n            testarrayofstring: Some(builder.create_vector(&[s0, s1])),\n            ..Default::default()\n        };\n        my_game::example::Monster::create(builder, &args)\n    };\n    my_game::example::finish_monster_buffer(builder, mon);\n}\n\n#[cfg(not(miri))] // slow.\nfn main() {\n    // test the allocation tracking:\n    {\n        let before = A.n_allocs();\n        let _x: Vec<u8> = vec![0u8; 1];\n        let after = A.n_allocs();\n        assert_eq!(before + 1, after);\n    }\n\n    let builder = &mut flatbuffers::FlatBufferBuilder::new();\n    {\n        // warm up the builder (it can make small allocs internally, such as for storing vtables):\n        create_serialized_example_with_generated_code(builder);\n    }\n\n    // reset the builder, clearing its heap-allocated memory:\n    builder.reset();\n\n    {\n        let before = A.n_allocs();\n        create_serialized_example_with_generated_code(builder);\n        let after = A.n_allocs();\n        assert_eq!(before, after, \"KO: Heap allocs occurred in Rust write path\");\n    }\n\n    let buf = builder.finished_data();\n\n    // use the allocation tracking on the read path:\n    {\n        let before = A.n_allocs();\n\n        // do many reads, forcing them to execute by using assert_eq:\n        {\n            let m = unsafe { my_game::example::root_as_monster_unchecked(buf) };\n            assert_eq!(80, m.hp());\n            assert_eq!(150, m.mana());\n            assert_eq!(\"MyMonster\", m.name());\n\n            let pos = m.pos().unwrap();\n            // We know the bits should be exactly equal here but compilers may\n            // optimize floats in subtle ways so we're playing it safe and using\n            // epsilon comparison\n            assert!((pos.x() - 1.0f32).abs() < f32::EPSILON);\n            assert!((pos.y() - 2.0f32).abs() < f32::EPSILON);\n            assert!((pos.z() - 3.0f32).abs() < f32::EPSILON);\n            assert!((pos.test1() - 3.0f64).abs() < f64::EPSILON);\n            assert_eq!(pos.test2(), my_game::example::Color::Green);\n            let pos_test3 = pos.test3();\n            assert_eq!(pos_test3.a(), 5i16);\n            assert_eq!(pos_test3.b(), 6i8);\n            assert_eq!(m.test_type(), my_game::example::Any::Monster);\n            let table2 = m.test().unwrap();\n            let m2 = unsafe { my_game::example::Monster::init_from_table(table2) };\n\n            assert_eq!(m2.name(), \"Fred\");\n\n            let inv = m.inventory().unwrap();\n            assert_eq!(inv.len(), 5);\n            assert_eq!(inv.iter().sum::<u8>(), 10u8);\n\n            let test4 = m.test4().unwrap();\n            assert_eq!(test4.len(), 2);\n            assert_eq!(\n                i32::from(test4.get(0).a())\n                    + i32::from(test4.get(1).a())\n                    + i32::from(test4.get(0).b())\n                    + i32::from(test4.get(1).b()),\n                100\n            );\n\n            let testarrayofstring = m.testarrayofstring().unwrap();\n            assert_eq!(testarrayofstring.len(), 2);\n            assert_eq!(testarrayofstring.get(0), \"test1\");\n            assert_eq!(testarrayofstring.get(1), \"test2\");\n        }\n\n        // assert that no allocs occurred:\n        let after = A.n_allocs();\n        assert_eq!(before, after, \"KO: Heap allocs occurred in Rust read path\");\n    }\n    println!(\"Rust: Heap alloc checks completed successfully\");\n}\n"
  },
  {
    "path": "tests/rust_usage_test/bin/flexbuffers_alloc_check.rs",
    "content": "// Copyright 2019 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nextern crate flexbuffers;\n\nuse flexbuffers::*;\nuse std::alloc::{GlobalAlloc, Layout, System};\n\n/// We take over the Rust allocator to count allocations. This is super not thread safe.\nstatic mut NUM_ALLOCS: usize = 0;\nfn current_allocs() -> usize {\n    unsafe { NUM_ALLOCS }\n}\nstruct TrackingAllocator;\nunsafe impl GlobalAlloc for TrackingAllocator {\n    unsafe fn alloc(&self, layout: Layout) -> *mut u8 {\n        NUM_ALLOCS += 1;\n        System.alloc(layout)\n    }\n    unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {\n        System.dealloc(ptr, layout)\n    }\n}\n#[global_allocator]\nstatic T: TrackingAllocator = TrackingAllocator;\n\n/// Make some example data\nfn make_monster(mut monster: MapBuilder) {\n    monster.push(\"type\", \"great orc\");\n    monster.push(\"age\", 100u8);\n    monster.push(\"name\", \"Mr. Orc\");\n    monster.push(\"coins\", &[1, 25, 50, 100, 250]);\n    monster.push(\"color\", &[255u8, 0, 0, 0]);\n    {\n        let mut weapons = monster.start_vector(\"weapons\");\n        {\n            let mut hammer = weapons.start_map();\n            hammer.push(\"name\", \"hammer\");\n            hammer.push(\"damage type\", \"crush\");\n            hammer.push(\"damage\", 20);\n        }\n        {\n            let mut axe = weapons.start_map();\n            axe.push(\"name\", \"Great Axe\");\n            axe.push(\"damage type\", \"slash\");\n            axe.push(\"damage\", 30);\n        }\n    }\n    {\n        let mut sounds = monster.start_vector(\"sounds\");\n        sounds.push(\"grr\");\n        sounds.push(\"rawr\");\n        sounds.push(\"muahaha\");\n    }\n    // TODO(cneo): Directly pushing string slices has alloc.\n}\n\n// Read back the data from make_monster.\nfn validate_monster(flexbuffer: &[u8]) {\n    let r = Reader::get_root(flexbuffer).unwrap().as_map();\n\n    assert!(!r.is_empty());\n    assert!(r.index_key(\"not_a_field\").is_none());\n\n    assert_eq!(r.len(), 7);\n    assert_eq!(r.idx(\"type\").as_str(), \"great orc\");\n    assert_eq!(r.idx(\"age\").as_u8(), 100);\n    assert_eq!(r.idx(\"name\").as_str(), \"Mr. Orc\");\n\n    let coins = r.idx(\"coins\").as_vector();\n    for (i, &c) in [1, 25, 50, 100, 250].iter().enumerate() {\n        assert_eq!(coins.idx(i).as_u16(), c);\n    }\n    let color = r.idx(\"color\").as_vector();\n    for (i, &c) in [255, 0, 0, 0].iter().enumerate() {\n        assert_eq!(color.idx(i).as_i32(), c);\n    }\n    let weapons = r.idx(\"weapons\").as_vector();\n    assert_eq!(weapons.len(), 2);\n\n    let hammer = weapons.idx(0).as_map();\n    assert_eq!(hammer.idx(\"name\").as_str(), \"hammer\");\n    assert_eq!(hammer.idx(\"damage type\").as_str(), \"crush\");\n    assert_eq!(hammer.idx(\"damage\").as_u64(), 20);\n\n    let axe = weapons.idx(1).as_map();\n    assert_eq!(axe.idx(\"name\").as_str(), \"Great Axe\");\n    assert_eq!(axe.idx(\"damage type\").as_str(), \"slash\");\n    assert_eq!(axe.idx(\"damage\").as_u64(), 30);\n\n    let sounds = r.idx(\"sounds\").as_vector();\n    for (i, &s) in [\"grr\", \"rawr\", \"muahaha\"].iter().enumerate() {\n        assert_eq!(sounds.idx(i).as_str(), s);\n    }\n}\n\n// This is in a separate binary than tests because taking over the global allocator is not\n// hermetic and not thread safe.\n#[cfg(not(miri))] // slow.\nfn main() {\n    let start_up = current_allocs();\n\n    // Let's build a flexbuffer from a new (cold) flexbuffer builder.\n    let mut builder = Builder::default();\n    make_monster(builder.start_map());\n    let after_warmup = current_allocs();\n\n    // The builder makes some allocations while warming up.\n    assert!(after_warmup > start_up);\n    assert!(after_warmup < start_up + 20);\n\n    // A warm builder should make no allocations.\n    make_monster(builder.start_map());\n    assert_eq!(after_warmup, current_allocs());\n\n    // Nor should a reader.\n    validate_monster(builder.view());\n    assert_eq!(after_warmup, current_allocs());\n\n    // Do it again just for kicks.\n    make_monster(builder.start_map());\n    validate_monster(builder.view());\n    assert_eq!(after_warmup, current_allocs());\n\n    let final_allocs = current_allocs(); // dbg! does allocate.\n    dbg!(start_up, after_warmup, final_allocs);\n}\n\n#[test]\n#[cfg(not(miri))] // slow.\nfn no_extra_allocations() {\n    main()\n}\n"
  },
  {
    "path": "tests/rust_usage_test/bin/monster_example.rs",
    "content": "#![allow(clippy::derivable_impls, clippy::all)]\nextern crate flatbuffers;\n\n#[allow(dead_code, unused_imports, clippy::approx_constant)]\n#[path = \"../../monster_test/mod.rs\"]\nmod monster_test_generated;\npub use monster_test_generated::my_game;\n\nuse std::io::Read;\n\nfn main() {\n    let mut f = std::fs::File::open(\"../monsterdata_test.mon\").unwrap();\n    let mut buf = Vec::new();\n    f.read_to_end(&mut buf).expect(\"file reading failed\");\n\n    let monster = my_game::example::root_as_monster(&buf[..]).unwrap();\n    println!(\"{}\", monster.hp()); // `80`\n    println!(\"{}\", monster.mana()); // default value of `150`\n    println!(\"{:?}\", monster.name()); // Some(\"MyMonster\")\n}\n"
  },
  {
    "path": "tests/rust_usage_test/outdir/.gitignore",
    "content": "src/generated\n"
  },
  {
    "path": "tests/rust_usage_test/outdir/Cargo.toml",
    "content": "[package]\nname = \"outdir\"\nversion = \"0.1.0\"\nauthors = [\"Casper Neo <cneo@google.com>\"]\nedition = \"2018\"\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\nflatbuffers = { path = \"../../../rust/flatbuffers\" }\nserde = \"1.0\"\n"
  },
  {
    "path": "tests/rust_usage_test/outdir/build.rs",
    "content": "fn main() {\n    use std::process::Command;\n    let project_root = std::env::current_dir()\n        .unwrap()\n        .parent() // flatbuffers/tests/rust_usage test\n        .unwrap()\n        .parent() // flatbuffers/tests\n        .unwrap()\n        .parent() // flatbuffers/\n        .unwrap()\n        .to_path_buf();\n    let sample_schema = {\n        let mut s = project_root.to_path_buf();\n        s.push(\"samples\");\n        s.push(\"monster.fbs\");\n        s\n    };\n\n    let flatc = {\n        let mut f = project_root.to_path_buf();\n        f.push(\"flatc\");\n        f\n    };\n\n    let out_dir = {\n        let mut d = std::path::Path::new(&std::env::var(\"OUT_DIR\").unwrap()).to_path_buf();\n        d.push(\"flatbuffers\");\n        d\n    };\n\n    Command::new(&flatc)\n        .arg(\"-o\")\n        .arg(&out_dir)\n        .arg(\"--rust\")\n        .arg(\"--rust-module-root-file\")\n        .arg(&sample_schema)\n        .output()\n        .expect(\"Failed to generate file\");\n\n    assert!(out_dir.exists());\n\n    let generated = std::path::Path::new(\"src/generated\");\n    #[cfg(target_os = \"windows\")]\n    {\n        if generated.exists() {\n            std::fs::remove_dir(generated).unwrap();\n        }\n        std::os::windows::fs::symlink_dir(out_dir, generated).unwrap();\n    }\n    #[cfg(not(target_os = \"windows\"))]\n    {\n        if generated.exists() {\n            std::fs::remove_file(generated).unwrap();\n        }\n        std::os::unix::fs::symlink(out_dir, generated).unwrap();\n    }\n}\n"
  },
  {
    "path": "tests/rust_usage_test/outdir/src/main.rs",
    "content": "// In this example, a build.rs file generates the code and then copies it into generated/\nextern crate flatbuffers;\n#[allow(unused_imports, dead_code)]\nmod generated;\nuse generated::my_game::sample::{Monster, MonsterArgs};\n\nfn main() {\n    let mut fbb = flatbuffers::FlatBufferBuilder::new();\n    let name = Some(fbb.create_string(\"bob\"));\n    let m = Monster::create(&mut fbb, &MonsterArgs { hp: 1, mana: 2, name, ..Default::default() });\n    fbb.finish(m, None);\n    let mon = flatbuffers::root::<Monster>(fbb.finished_data()).unwrap();\n    assert_eq!(mon.hp(), 1);\n    assert_eq!(mon.mana(), 2);\n    assert_eq!(mon.name().unwrap(), \"bob\");\n}\n\n#[test]\nfn test_main() {\n    main()\n}\n"
  },
  {
    "path": "tests/rust_usage_test/tests/arrays_test.rs",
    "content": "#![no_std]\n\n#[cfg(not(feature = \"no_std\"))]\nextern crate std;\n\nextern crate alloc;\n\nextern crate array_init;\n\n#[allow(dead_code, unused_imports)]\n#[path = \"../../arrays_test/mod.rs\"]\nmod arrays_test_generated;\n\nuse alloc::format;\nuse core::fmt::Debug;\n\nuse crate::arrays_test_generated::my_game::example::*;\n\nextern crate quickcheck;\n\nuse array_init::array_init;\nuse core::mem::size_of;\nuse quickcheck::{Arbitrary, Gen};\n\nfn create_serialized_example_with_generated_code(builder: &mut flatbuffers::FlatBufferBuilder) {\n    let nested_struct1 = NestedStruct::new(\n        &[-1, 2],\n        TestEnum::A,\n        &[TestEnum::C, TestEnum::B],\n        &[0x1122334455667788, -0x1122334455667788],\n    );\n    let nested_struct2 = NestedStruct::new(\n        &[3, -4],\n        TestEnum::B,\n        &[TestEnum::B, TestEnum::A],\n        &[-0x1122334455667788, 0x1122334455667788],\n    );\n    let array_struct = ArrayStruct::new(\n        12.34,\n        &[1, 2, 3, 4, 5, 6, 7, 8, 9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF],\n        -127,\n        &[nested_struct1, nested_struct2],\n        1,\n        &[-0x8000000000000000, 0x7FFFFFFFFFFFFFFF],\n    );\n    // Test five makes sense when specified.\n    let ss = ArrayTable::create(builder, &ArrayTableArgs { a: Some(&array_struct) });\n    finish_array_table_buffer(builder, ss);\n}\n\nfn serialized_example_is_accessible_and_correct(\n    bytes: &[u8],\n    identifier_required: bool,\n    size_prefixed: bool,\n) {\n    if identifier_required {\n        let correct = if size_prefixed {\n            array_table_size_prefixed_buffer_has_identifier(bytes)\n        } else {\n            array_table_buffer_has_identifier(bytes)\n        };\n\n        assert_eq!(correct, true);\n    }\n\n    let array_table = if size_prefixed {\n        size_prefixed_root_as_array_table(bytes).unwrap()\n    } else {\n        root_as_array_table(bytes).unwrap()\n    };\n\n    let array_struct = array_table.a().unwrap();\n    assert_eq!(array_struct.a(), 12.34);\n    assert_eq!(array_struct.b().len(), 0xF);\n    assert_eq!(array_struct.b().iter().sum::<i32>(), 120);\n    assert_eq!(array_struct.c(), -127);\n\n    assert_eq!(array_struct.d().len(), 2);\n    let nested_struct1 = array_struct.d().get(0);\n    assert_eq!(nested_struct1.a().len(), 2);\n    assert_eq!(nested_struct1.a().iter().sum::<i32>(), 1);\n    assert_eq!(nested_struct1.b(), TestEnum::A);\n    assert_eq!(nested_struct1.c().len(), 2);\n    assert_eq!(nested_struct1.c().get(0), TestEnum::C);\n    assert_eq!(nested_struct1.c().get(1), TestEnum::B);\n    assert_eq!(nested_struct1.d().len(), 2);\n    assert_eq!(\n        [nested_struct1.d().get(0), nested_struct1.d().get(1)],\n        [0x1122334455667788, -0x1122334455667788]\n    );\n    let nested_struct2 = array_struct.d().get(1);\n    assert_eq!(nested_struct2.a().len(), 2);\n    assert_eq!(nested_struct2.a().iter().sum::<i32>(), -1);\n    assert_eq!(nested_struct2.b(), TestEnum::B);\n    assert_eq!(nested_struct2.c().len(), 2);\n    assert_eq!(nested_struct2.c().get(0), TestEnum::B);\n    assert_eq!(nested_struct2.c().get(1), TestEnum::A);\n    assert_eq!(nested_struct2.d().len(), 2);\n    let arr: [i64; 2] = nested_struct2.d().into();\n    assert_eq!(arr, [-0x1122334455667788, 0x1122334455667788]);\n\n    assert_eq!(array_struct.e(), 1);\n    assert_eq!(array_struct.f().len(), 2);\n    assert_eq!(array_struct.f().get(0), -0x8000000000000000);\n    assert_eq!(array_struct.f().get(1), 0x7FFFFFFFFFFFFFFF);\n}\n\n#[test]\nfn generated_code_creates_correct_example() {\n    let mut b = flatbuffers::FlatBufferBuilder::new();\n    create_serialized_example_with_generated_code(&mut b);\n    let buf = b.finished_data();\n    serialized_example_is_accessible_and_correct(&buf[..], true, false);\n}\n\n#[test]\nfn struct_netsted_struct_is_32_bytes() {\n    assert_eq!(32, ::core::mem::size_of::<NestedStruct>());\n}\n\n#[test]\nfn struct_array_struct_is_160_bytes() {\n    assert_eq!(160, ::core::mem::size_of::<ArrayStruct>());\n}\n\n#[test]\nfn test_object_api_reads_correctly() {\n    let mut b = flatbuffers::FlatBufferBuilder::new();\n    create_serialized_example_with_generated_code(&mut b);\n\n    let array_table = root_as_array_table(b.finished_data()).unwrap().unpack();\n\n    let array_struct = array_table.a.unwrap();\n    assert_eq!(array_struct.a, 12.34);\n    assert_eq!(array_struct.b.len(), 0xF);\n    assert_eq!(array_struct.b.iter().sum::<i32>(), 120);\n    assert_eq!(array_struct.c, -127);\n\n    assert_eq!(array_struct.d.len(), 2);\n    let nested_struct1 = &array_struct.d[0];\n    assert_eq!(nested_struct1.a.len(), 2);\n    assert_eq!(nested_struct1.a.iter().sum::<i32>(), 1);\n    assert_eq!(nested_struct1.b, TestEnum::A);\n    assert_eq!(nested_struct1.c.len(), 2);\n    assert_eq!(nested_struct1.c[0], TestEnum::C);\n    assert_eq!(nested_struct1.c[1], TestEnum::B);\n    assert_eq!(nested_struct1.d.len(), 2);\n    assert_eq!(nested_struct1.d, [0x1122334455667788, -0x1122334455667788]);\n    let nested_struct2 = &array_struct.d[1];\n    assert_eq!(nested_struct2.a.len(), 2);\n    assert_eq!(nested_struct2.a.iter().sum::<i32>(), -1);\n    assert_eq!(nested_struct2.b, TestEnum::B);\n    assert_eq!(nested_struct2.c.len(), 2);\n    assert_eq!(nested_struct2.c[0], TestEnum::B);\n    assert_eq!(nested_struct2.c[1], TestEnum::A);\n    assert_eq!(nested_struct2.d.len(), 2);\n    assert_eq!(nested_struct2.d, [-0x1122334455667788, 0x1122334455667788]);\n\n    assert_eq!(array_struct.e, 1);\n    assert_eq!(array_struct.f.len(), 2);\n    assert_eq!(array_struct.f[0], -0x8000000000000000);\n    assert_eq!(array_struct.f[1], 0x7FFFFFFFFFFFFFFF);\n}\n\n#[test]\nfn object_api_defaults() {\n    use arrays_test_generated::my_game::example::*;\n\n    assert_eq!(\n        NestedStructT::default(),\n        NestedStructT {\n            a: [0, 0],\n            b: TestEnum::default(),\n            c: [TestEnum::default(), TestEnum::default()],\n            d: [0, 0],\n        }\n    );\n\n    assert_eq!(\n        ArrayStructT::default(),\n        ArrayStructT {\n            a: 0.0,\n            b: [0; 0xF],\n            c: 0,\n            d: [NestedStructT::default(), NestedStructT::default()],\n            e: 0,\n            f: [0, 0],\n        }\n    );\n}\n\n#[test]\nfn generated_code_debug_prints_correctly() {\n    let b = &mut flatbuffers::FlatBufferBuilder::new();\n    create_serialized_example_with_generated_code(b);\n    let buf = b.finished_data();\n    let array_table = root_as_array_table(buf).unwrap();\n    assert_eq!(\n        format!(\"{:.5?}\", &array_table),\n        \"ArrayTable { a: Some(ArrayStruct { a: 12.34000, \\\n         b: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], \\\n         c: -127, d: [NestedStruct { a: [-1, 2], b: A, c: [C, B], \\\n         d: [1234605616436508552, -1234605616436508552] }, \\\n         NestedStruct { a: [3, -4], b: B, c: [B, A], d: [-1234605616436508552, 1234605616436508552] }], \\\n         e: 1, f: [-9223372036854775808, 9223372036854775807] }) }\"\n    );\n}\n\n#[test]\n#[should_panic]\nfn assert_on_too_small_array_buf() {\n    let a = [0u8; 19];\n    unsafe { flatbuffers::Array::<i32, 5>::new(&a) };\n}\n\n#[test]\n#[should_panic]\nfn assert_on_too_big_array_buf() {\n    let a = [0u8; 21];\n    unsafe { flatbuffers::Array::<i32, 5>::new(&a) };\n}\n\n#[test]\n#[cfg(target_endian = \"little\")]\nfn verify_struct_array_alignment() {\n    let mut b = flatbuffers::FlatBufferBuilder::new();\n    create_serialized_example_with_generated_code(&mut b);\n    let buf = b.finished_data();\n    let array_table = root_as_array_table(buf).unwrap();\n    let array_struct = array_table.a().unwrap();\n    let struct_start_ptr = array_struct.0.as_ptr() as usize;\n    let b_start_ptr = array_struct.b().as_ptr() as usize;\n    let d_start_ptr = array_struct.d().as_ptr() as usize;\n    // The T type of b\n    let b_aln = ::core::mem::align_of::<i32>();\n    assert_eq!((b_start_ptr - struct_start_ptr) % b_aln, 0);\n    assert_eq!((d_start_ptr - b_start_ptr) % b_aln, 0);\n    assert_eq!((d_start_ptr - struct_start_ptr) % 8, 0);\n}\n\n#[derive(Clone, Debug)]\nstruct FakeArray<T, const N: usize>([T; N]);\n\nimpl<T: Arbitrary + Debug + PartialEq, const N: usize> Arbitrary for FakeArray<T, N> {\n    fn arbitrary<G: Gen>(g: &mut G) -> FakeArray<T, N> {\n        let x: [T; N] = array_init(|_| {\n            loop {\n                let generated_scalar = T::arbitrary(g);\n                // Verify that generated scalar is not Nan, which is not equals to itself,\n                // therefore we can't use it to validate input == output\n                if generated_scalar == generated_scalar {\n                    return generated_scalar;\n                }\n            }\n        });\n        FakeArray { 0: x }\n    }\n}\n\n#[cfg(test)]\nmod array_fuzz {\n    extern crate flatbuffers;\n    #[cfg(not(miri))] // slow.\n    extern crate quickcheck;\n\n    use self::flatbuffers::{Follow, Push};\n    use super::*;\n\n    const MAX_TESTS: u64 = 20;\n    const ARRAY_SIZE: usize = 29;\n\n    // This uses a macro because lifetimes for the trait-bounded function get too\n    // complicated.\n    macro_rules! impl_prop {\n        ($test_name:ident, $fn_name:ident, $ty:ident) => {\n            fn $fn_name(xs: FakeArray<$ty, ARRAY_SIZE>) {\n                let mut test_buf = [0 as u8; 1024];\n                let arr: flatbuffers::Array<$ty, ARRAY_SIZE> = unsafe {\n                    flatbuffers::emplace_scalar_array(&mut test_buf, 0, &xs.0);\n                    flatbuffers::Array::follow(&test_buf, 0)\n                };\n                let got: [$ty; ARRAY_SIZE] = arr.into();\n                assert_eq!(got, xs.0);\n            }\n            #[test]\n            fn $test_name() {\n                quickcheck::QuickCheck::new()\n                    .max_tests(MAX_TESTS)\n                    .quickcheck($fn_name as fn(FakeArray<$ty, ARRAY_SIZE>));\n            }\n        };\n    }\n\n    impl_prop!(test_bool, prop_bool, bool);\n    impl_prop!(test_u8, prop_u8, u8);\n    impl_prop!(test_i8, prop_i8, i8);\n    impl_prop!(test_u16, prop_u16, u16);\n    impl_prop!(test_u32, prop_u32, u32);\n    impl_prop!(test_u64, prop_u64, u64);\n    impl_prop!(test_i16, prop_i16, i16);\n    impl_prop!(test_i32, prop_i32, i32);\n    impl_prop!(test_i64, prop_i64, i64);\n    impl_prop!(test_f32, prop_f32, f32);\n    impl_prop!(test_f64, prop_f64, f64);\n\n    const NESTED_STRUCT_SIZE: usize = size_of::<NestedStruct>();\n\n    #[derive(Clone, Debug, PartialEq)]\n    struct NestedStructWrapper(NestedStruct);\n\n    impl Arbitrary for NestedStructWrapper {\n        fn arbitrary<G: Gen>(g: &mut G) -> NestedStructWrapper {\n            let mut x = NestedStruct::default();\n            x.0 = FakeArray::<u8, NESTED_STRUCT_SIZE>::arbitrary(g).0;\n            NestedStructWrapper { 0: x }\n        }\n    }\n\n    fn prop_struct(xs: FakeArray<NestedStructWrapper, ARRAY_SIZE>) {\n        let mut test_buf = [0 as u8; 1024];\n        let native_struct_array: [&NestedStruct; ARRAY_SIZE] =\n            array_init::from_iter(xs.0.iter().map(|x| &x.0)).unwrap();\n        for i in 0..ARRAY_SIZE {\n            let offset = i * NESTED_STRUCT_SIZE;\n            unsafe {\n                native_struct_array[i].push(&mut test_buf[offset..offset + NESTED_STRUCT_SIZE], 0)\n            };\n        }\n        let arr: flatbuffers::Array<NestedStruct, ARRAY_SIZE> =\n            unsafe { flatbuffers::Array::follow(&test_buf, 0) };\n        let got: [&NestedStruct; ARRAY_SIZE] = arr.into();\n        assert_eq!(got, native_struct_array);\n    }\n\n    #[test]\n    #[cfg(not(miri))] // slow.\n    fn test_struct() {\n        quickcheck::QuickCheck::new()\n            .max_tests(MAX_TESTS)\n            .quickcheck(prop_struct as fn(FakeArray<NestedStructWrapper, ARRAY_SIZE>));\n    }\n}\n"
  },
  {
    "path": "tests/rust_usage_test/tests/flexbuffers_tests/binary_format.rs",
    "content": "// Copyright 2019 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nuse flexbuffers::*;\nuse serde::Serialize;\n\n#[test]\nfn store_13() {\n    let buf = singleton(13i32);\n    assert_eq!(&buf, &[13, 4, 1]);\n}\n#[test]\nfn store_2pow20() {\n    let buf = singleton(1_048_576i32);\n    assert_eq!(\n        &buf,\n        &[\n            0,\n            0,\n            16,\n            0,          // 2^20 in LE bytes.\n            1 << 2 | 2, // Int 32bit\n            4           // Root width 32 bit\n        ]\n    );\n}\n\n#[test]\nfn heterogenous_vector_of_string_because_width() {\n    // Each string is 32 characters. They are 256 bytes altogether.\n    // This forces the vector to be W16 because of the large offsets.\n    let test_data = [\n        \"0aaabbbbccccddddeeeeffffgggghhh\",\n        \"1aaabbbbccccddddeeeeffffgggghhh\",\n        \"2aaabbbbccccddddeeeeffffgggghhh\",\n        \"3aaabbbbccccddddeeeeffffgggghhh\",\n        \"4aaabbbbccccddddeeeeffffgggghhh\",\n        \"5aaabbbbccccddddeeeeffffgggghhh\",\n        \"6aaabbbbccccddddeeeeffffgggghhh\",\n        \"7aaabbbbccccddddeeeeffffgggghhh\",\n    ];\n    let mut fxb = Builder::default();\n    let mut v = fxb.start_vector();\n    for &s in test_data.iter() {\n        v.push(s);\n    }\n    v.end_vector();\n    let mut expected = vec![];\n    for &s in test_data.iter() {\n        expected.push(s.len() as u8);\n        expected.extend(s.bytes());\n        expected.push(b'\\0');\n    }\n    expected.extend(8u16.to_le_bytes().iter()); // Length.\n    for i in 0..test_data.len() as u16 {\n        let offset = 32 * (8 - i) + 9 + i;\n        expected.extend(offset.to_le_bytes().iter());\n    }\n    for _ in 0..test_data.len() {\n        expected.push(5 << 2 | 0); // String, W8.\n    }\n    expected.push(24); // Offset to Vector.\n    expected.push(10 << 2 | 1); // Vector, W16.\n    expected.push(1); // Root width W8.\n    assert_eq!(fxb.view(), expected.as_slice());\n}\n\n#[test]\nfn store_vec_uint_16() {\n    let mut fxb = Builder::default();\n    let mut v = fxb.start_vector();\n    v.push(256u16);\n    v.push(257u16);\n    v.push(258u16);\n    v.push(259u16);\n    v.push(0u8); // This still becomes u16.\n    v.end_vector();\n    assert_eq!(\n        fxb.view(),\n        &[\n            5,\n            0,\n            0,\n            1,\n            1,\n            1,\n            2,\n            1,\n            3,\n            1,\n            0,\n            0,           // Data\n            10,          // Vector offset.\n            12 << 2 | 1, // (VectorUInt, W16 - referring to data).\n            1,           // Root width W8 - referring to vector.\n        ]\n    );\n}\n\n#[cfg(not(miri))] // slow.\nquickcheck! {\n    fn qc_f32(x: f32) -> bool {\n        let fxb = singleton(x);\n        let mut expected = x.to_le_bytes().to_vec();\n        expected.push(3 << 2 | 2);  // Float W32.\n        expected.push(4); // Root width W32.\n        fxb == expected\n    }\n}\n\n#[test]\nfn singleton_vector_uint_4_16bit() {\n    let buf = singleton(&[4u16, 16, 64, 256]);\n    assert_eq!(\n        &buf,\n        &[\n            4,\n            0,\n            16,\n            0,\n            64,\n            0,\n            0,\n            1,           // Data\n            8,           // Vector offset.\n            23 << 2 | 1, // (VectorUInt, W16 - referring to data).\n            1,           // Root width W8 - referring to vector.\n        ]\n    );\n}\n#[test]\nfn store_u64() {\n    let buf = singleton(u64::max_value() - 10);\n    assert_eq!(\n        &buf,\n        &[\n            245,\n            255,\n            255,\n            255,\n            255,\n            255,\n            255,\n            255,        // max value - 10.\n            2 << 2 | 3, // (UInt, W64)\n            8,          // Root width W64.\n        ]\n    );\n}\n#[test]\nfn vector_uint4() {\n    let mut fxb = Builder::default();\n    let mut v = fxb.start_vector();\n    v.push(2u8);\n    v.push(3u8);\n    v.push(5u8);\n    v.push(7u8);\n    v.end_vector();\n    assert_eq!(\n        &fxb.view(),\n        &[\n            2,\n            3,\n            5,\n            7,           // data\n            4,           // Root (offset)\n            23 << 2 | 0, // Root type VectorUInt4, BitWidth::W8\n            1,           // Root bitwidth W8\n        ]\n    );\n}\n#[test]\nfn nested_vector() {\n    let mut fxb = Builder::default();\n    let mut v = fxb.start_vector();\n    v.push(0u8);\n    {\n        let mut nested = v.start_vector();\n        nested.push(1u8);\n        nested.push(2u8);\n        nested.push(3u8);\n    }\n    v.push(-42i8);\n    v.end_vector();\n    assert_eq!(\n        fxb.view(),\n        &[\n            1,\n            2,\n            3, // Nested vector\n            3,\n            0,\n            5,\n            214,         // Root Vector: size, v[0], v[1] (offset), v[2] as u8\n            2 << 2 | 0,  // v[0]: (UInt, W8)\n            20 << 2 | 0, // v[1]: (VectorUInt3, W8)\n            1 << 2 | 0,  // v[2]: (Int, W8)\n            6,           // Root points to Root vector\n            10 << 2 | 0, // Root type and width (Vector, W8)\n            1,           // Root bytes\n        ]\n    )\n}\n\n#[test]\nfn nested_vector_push_direct() {\n    let mut fxb = Builder::default();\n    let mut v = fxb.start_vector();\n    v.push(0u8);\n    v.push(&[1u8, 2, 3]);\n    v.push(-42i8);\n    v.end_vector();\n    assert_eq!(\n        fxb.view(),\n        &[\n            1,\n            2,\n            3, // Nested VectorUInt3\n            3,\n            0,\n            5,\n            214,         // Root Vector: size, v[0], v[1] (offset), v[2] as u8\n            2 << 2 | 0,  // v[0]: (UInt, W8)\n            20 << 2 | 0, // v[1]: (VectorUInt3, W8)\n            1 << 2 | 0,  // v[2]: (Int, W8)\n            6,           // Root points to Root vector\n            10 << 2 | 0, // Root type and width (Vector, W8)\n            1,           // Root bytes\n        ]\n    )\n}\n#[test]\nfn store_map_index_into_it() {\n    let mut fxb = Builder::default();\n    {\n        let mut m = fxb.start_map();\n        m.push(\"foo\", 17u8);\n        m.push(\"bar\", 33u16);\n        m.push(\"baz\", 41u32);\n    }\n    assert_eq!(\n        fxb.view(),\n        &[\n            b'f',\n            b'o',\n            b'o',\n            b'\\0',\n            b'b',\n            b'a',\n            b'r',\n            b'\\0',\n            b'b',\n            b'a',\n            b'z',\n            b'\\0',\n            3,\n            9,\n            6,\n            15, // Keys vector (note \"bar\" < \"baz\" < \"foo\").\n            3,\n            1,\n            3, // map prefix\n            33,\n            41,\n            17, // values\n            8,\n            8,\n            8,          // types (UInt, W8) ~ (2 << 2 | 0)\n            6,          // Offset to map (root)\n            9 << 2 | 0, // Root type (map)\n            1,          // Root bytes\n        ]\n    );\n}\n#[test]\nfn utf8_snowman() {\n    let buf = singleton(\"snowman ☃︎\");\n    assert_eq!(\n        &buf,\n        &[\n            14, // Byte length (besides extra null terminator).\n            b's',\n            b'n',\n            b'o',\n            b'w',\n            b'm',\n            b'a',\n            b'n',\n            b' ',\n            226,\n            152,\n            131, // snowman bytes\n            239,\n            184,\n            142,    // UTF Variation selector 15\n            0,      // extra null terminator.\n            15,     // Offset to string start.\n            5 << 2, // String, W8\n            1,      // Root bytes\n        ]\n    );\n    let r = Reader::get_root(buf.as_ref()).unwrap();\n    assert_eq!(r.get_str(), Ok(\"snowman ☃︎\"));\n}\n#[test]\nfn indirect_numbers() {\n    let mut fxb = Builder::default();\n    let mut v = fxb.start_vector();\n    v.push(IndirectUInt(u64::max_value()));\n    v.push(IndirectInt(i64::min_value()));\n    // TODO(cneo): Something about Float EPSILON and casting leads to a different binary format.\n    v.push(IndirectFloat(core::f64::consts::PI));\n    v.push(0u32); // This is stored in 8 bits instead of 64 because of indirection.\n    v.end_vector();\n    assert_eq!(\n        fxb.view(),\n        vec![\n            255,\n            255,\n            255,\n            255,\n            255,\n            255,\n            255,\n            255, // u64 max\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            128, // i64 min value\n            24,\n            45,\n            68,\n            84,\n            251,\n            33,\n            9,\n            64, // f64 PI.\n            4,  // Vector length\n            25,\n            18,\n            11,\n            0,           // offsets to the indirect numbers and zero.\n            7 << 2 | 3,  // IndirectUInt 64 bit\n            6 << 2 | 3,  // IndirectInt 64 bit\n            8 << 2 | 3,  // IndirectFloat 64 bit\n            2 << 2 | 0,  // (inline) UInt 8 bit\n            8,           // Offset to Root.\n            10 << 2 | 0, // Vector 8 bit\n            1,           // 1 byte root\n        ]\n        .as_slice()\n    )\n}\n#[test]\nfn indirect_2p5x_smaller() {\n    let mut builder = Builder::default();\n    let mut v = builder.start_vector();\n    for i in 0..512 {\n        v.push(i);\n    }\n    v.push(i64::max_value());\n    v.end_vector();\n    let len_without_indirect = builder.view().len() as f32;\n\n    let mut v = builder.start_vector();\n    for i in 0..512 {\n        v.push(i);\n    }\n    v.push(IndirectInt(i64::max_value()));\n    v.end_vector();\n    let len_with_indirect = builder.view().len() as f32;\n    assert!(len_with_indirect * 2.5 < len_without_indirect);\n}\n#[test]\nfn key_pool() {\n    let mut builder = Builder::default();\n    let mut vector = builder.start_vector();\n    for _ in 0..2 {\n        let mut m = vector.start_map();\n        m.push(\"a\", 42u8);\n        m.push(\"b\", 42u8);\n        m.push(\"c\", 42u8);\n    }\n    vector.end_vector();\n\n    assert_eq!(\n        builder.view(),\n        vec![\n            b'a',\n            b'\\0',\n            b'b',\n            b'\\0',\n            b'c',\n            b'\\0',\n            3,\n            7,\n            6,\n            5, // Key vector 0\n            3,\n            1,\n            3,\n            42,\n            42,\n            42,\n            2 << 2,\n            2 << 2,\n            2 << 2, // Map 0.\n            3,\n            20,\n            19,\n            18, // Key vector 1 (shares keys with key vector 0).\n            3,\n            1,\n            3,\n            42,\n            42,\n            42,\n            2 << 2,\n            2 << 2,\n            2 << 2, // Map 1.\n            2,\n            20,\n            8,\n            9 << 2,\n            9 << 2, // Vector containing the maps.\n            4,\n            10 << 2,\n            1, // Root.\n        ]\n        .as_slice()\n    );\n}\n\n#[test]\nfn serialize_unit() {\n    #[derive(Serialize)]\n    struct Foo;\n    let mut s = FlexbufferSerializer::new();\n    Foo.serialize(&mut s).unwrap();\n    assert_eq!(s.view(), &[0, 0, 1]);\n}\n\n#[test]\nfn serialize_i8() {\n    let mut s = FlexbufferSerializer::new();\n    13i8.serialize(&mut s).unwrap();\n    assert_eq!(s.view(), &[13, 4, 1]);\n}\n#[test]\nfn serialize_tuple_struct_i8() {\n    #[derive(Serialize)]\n    struct Foo(i32);\n    let mut s = FlexbufferSerializer::new();\n    Foo(13).serialize(&mut s).unwrap();\n    assert_eq!(s.view(), &[13, 4, 1]);\n}\n#[test]\nfn serialize_tuple_tuple_struct_i8_is_inlined() {\n    #[derive(Serialize)]\n    struct Foo(i32);\n    #[derive(Serialize)]\n    struct Bar(Foo);\n    let mut s = FlexbufferSerializer::new();\n    Bar(Foo(13)).serialize(&mut s).unwrap();\n    assert_eq!(s.view(), &[13, 4, 1]);\n}\n#[test]\nfn align_8byte() {\n    let mut b = Builder::default();\n    let mut v = b.start_vector();\n    v.push(IndirectUInt(42));\n    v.push(&[u64::max_value(); 2]);\n    v.end_vector();\n    assert_eq!(\n        b.view()[..16],\n        [\n            42, 0, 0, 0, 0, 0, 0, 0, // padding\n            255, 255, 255, 255, 255, 255, 255, 255, // the first u64 max value.\n        ]\n    );\n}\n#[test]\nfn align_4byte() {\n    let mut b = Builder::default();\n    let mut v = b.start_vector();\n    v.push(IndirectUInt(42));\n    v.push(&[u32::max_value(); 2]);\n    v.end_vector();\n    assert_eq!(\n        b.view()[..8],\n        [\n            42, 0, 0, 0, // padding\n            255, 255, 255, 255, // the first u32 max value.\n        ]\n    );\n}\n#[test]\nfn align_2byte() {\n    let mut b = Builder::default();\n    let mut v = b.start_vector();\n    v.push(IndirectUInt(42));\n    v.push(&[u16::max_value(); 2]);\n    v.end_vector();\n    assert_eq!(\n        b.view()[..4],\n        [\n            42, 0, // padding\n            255, 255, // the first u16 max value.\n        ]\n    );\n}\n#[test]\nfn align_1byte() {\n    let mut b = Builder::default();\n    let mut v = b.start_vector();\n    v.push(IndirectUInt(42));\n    v.push(&[u8::max_value(); 2]);\n    v.end_vector();\n    assert_eq!(b.view()[..2], [42, 255]); // No padding.\n}\n"
  },
  {
    "path": "tests/rust_usage_test/tests/flexbuffers_tests/interop.rs",
    "content": "// Copyright 2019 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nuse flexbuffers::*;\n\n#[test]\nfn read_golden_flexbuffer() {\n    let s =\n        std::fs::read(\"../gold_flexbuffer_example.bin\").expect(\"Unable to read golden flexbuffer.\");\n    let r = Reader::get_root(s.as_ref()).unwrap();\n    let m = r.as_map();\n\n    let vec = m.idx(\"vec\").as_vector();\n    assert_eq!(vec.idx(0).as_i8(), -100);\n    assert_eq!(vec.idx(1).as_str(), \"Fred\");\n    assert_eq!(vec.idx(2).as_f32(), 4.0);\n    assert_eq!(vec.idx(3).as_blob(), Blob([77].as_ref()));\n    assert_eq!(vec.idx(4).flexbuffer_type(), FlexBufferType::Bool);\n    assert_eq!(vec.idx(4).as_bool(), false);\n    assert_eq!(vec.idx(5).as_f64(), 4.0);\n\n    let bar = m.idx(\"bar\").as_vector();\n    for (i, &x) in [1, 2, 3].iter().enumerate() {\n        assert_eq!(bar.idx(i).as_i8(), x);\n    }\n    let bar3 = m.idx(\"bar3\").as_vector();\n    for (i, &x) in [1, 2, 3].iter().enumerate() {\n        assert_eq!(bar3.idx(i).as_i8(), x);\n    }\n    let bools = m.idx(\"bools\").as_vector();\n    for (i, &b) in [true, false, true, false].iter().enumerate() {\n        assert_eq!(bools.idx(i).as_bool(), b)\n    }\n\n    assert_eq!(m.idx(\"bool\").as_bool(), true);\n    assert_eq!(m.idx(\"foo\").as_f64(), 100.0);\n    let mymap = m.idx(\"mymap\").as_map();\n    assert_eq!(mymap.idx(\"foo\").as_str(), \"Fred\");\n}\n"
  },
  {
    "path": "tests/rust_usage_test/tests/flexbuffers_tests/mod.rs",
    "content": "// Copyright 2020 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nmod binary_format;\n#[cfg(not(feature = \"no_std\"))] // uses file I/O\nmod interop;\nmod other_api;\n#[cfg(not(miri))] // slow.\nmod qc_serious;\nmod rwyw;\n"
  },
  {
    "path": "tests/rust_usage_test/tests/flexbuffers_tests/other_api.rs",
    "content": "// Copyright 2020 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nuse alloc::vec::Vec;\n\nuse flexbuffers::*;\n#[cfg(not(miri))] // slow.\nuse quickcheck::QuickCheck;\n\n#[test]\n#[cfg(not(miri))] // slow.\nfn qc_reader_no_crash() {\n    fn no_crash(xs: Vec<u8>) -> bool {\n        let r = Reader::get_root(xs.as_ref());\n        r.is_err() || r.is_ok()\n    }\n    QuickCheck::new()\n        .min_tests_passed(10_000_000)\n        .quicktest(no_crash as fn(Vec<u8>) -> bool)\n        .unwrap();\n\n    no_crash(vec![0, 10 << 2 | 2, 0]);\n}\n#[test]\nfn as_num() {\n    let mut fxb = Builder::default();\n    let mut m = fxb.start_map();\n    m.push(\"a\", &[-1i8, -2, -3, -4]);\n    m.push(\"b\", 250i64);\n    m.push(\"c\", 5000u16);\n    m.end_map();\n\n    let r = Reader::get_root(fxb.view()).unwrap();\n    assert_eq!(r.as_i8(), 3); // length.\n    assert_eq!(r.as_i16(), 3);\n    assert_eq!(r.as_i32(), 3);\n    assert_eq!(r.as_i64(), 3);\n    assert_eq!(r.as_u8(), 3);\n    assert_eq!(r.as_u16(), 3);\n    assert_eq!(r.as_u32(), 3);\n    assert_eq!(r.as_u64(), 3);\n    assert_eq!(r.as_f32(), 3.0);\n    assert_eq!(r.as_f64(), 3.0);\n\n    let m = r.as_map();\n    let a = m.index(\"a\").unwrap();\n    assert_eq!(a.as_f32(), 4.0); // length.\n    assert_eq!(a.as_f64(), 4.0); // length.\n    assert_eq!(a.as_vector().idx(0).as_i8(), -1);\n    assert_eq!(a.as_vector().idx(1).as_i16(), -2);\n    assert_eq!(a.as_vector().idx(2).as_i32(), -3);\n    assert_eq!(a.as_vector().idx(3).as_i64(), -4);\n\n    let b = m.index(\"b\").unwrap();\n    assert_eq!(b.as_u8(), 250);\n    assert_eq!(b.as_u16(), 250);\n    assert_eq!(b.as_u32(), 250);\n    assert_eq!(b.as_u64(), 250);\n    assert_eq!(b.as_i8(), 0); // overflow\n    assert_eq!(b.as_i16(), 250);\n    assert_eq!(b.as_i32(), 250);\n    assert_eq!(b.as_i64(), 250);\n\n    let c = m.index(\"c\").unwrap();\n    assert_eq!(c.as_i64(), 5000);\n    assert_eq!(c.as_u64(), 5000);\n    assert_eq!(c.as_f32(), 5000.0);\n    assert_eq!(c.as_u8(), 0); // overflow\n    assert_eq!(c.as_u16(), 5000);\n    assert_eq!(c.as_u32(), 5000);\n    assert_eq!(c.as_u64(), 5000);\n    assert_eq!(c.as_i8(), 0); // overflow\n    assert_eq!(c.as_i16(), 5000);\n    assert_eq!(c.as_i32(), 5000);\n    assert_eq!(c.as_i64(), 5000);\n}\n#[test]\nfn string_as_num() {\n    let mut fxb = Builder::default();\n    let mut v = fxb.start_vector();\n    v.push(\"3.1415\");\n    v.push(\"9.001e3\");\n    v.push(\"42\");\n    v.end_vector();\n    let r = Reader::get_root(fxb.view()).unwrap();\n\n    let v0 = r.as_vector().idx(0);\n    assert_eq!(v0.as_f64(), 3.1415);\n    assert_eq!(v0.as_f32(), 3.1415);\n    assert_eq!(v0.as_u8(), 0);\n    assert_eq!(v0.as_u16(), 0);\n    assert_eq!(v0.as_u32(), 0);\n    assert_eq!(v0.as_u64(), 0);\n    assert_eq!(v0.as_i8(), 0);\n    assert_eq!(v0.as_i16(), 0);\n    assert_eq!(v0.as_i32(), 0);\n    assert_eq!(v0.as_i64(), 0);\n\n    let v1 = r.as_vector().idx(1);\n    assert_eq!(v1.as_f64(), 9001.0);\n    assert_eq!(v1.as_f32(), 9001.0);\n    assert_eq!(v1.as_u8(), 0);\n    assert_eq!(v1.as_u16(), 0);\n    assert_eq!(v1.as_u32(), 0);\n    assert_eq!(v1.as_u64(), 0);\n    assert_eq!(v1.as_i8(), 0);\n    assert_eq!(v1.as_i16(), 0);\n    assert_eq!(v1.as_i32(), 0);\n    assert_eq!(v1.as_i64(), 0);\n    assert_eq!(v1.as_i32(), 0);\n\n    let v2 = r.as_vector().idx(2);\n    assert_eq!(v2.as_f64(), 42.0);\n    assert_eq!(v2.as_f32(), 42.0);\n    assert_eq!(v2.as_u8(), 42);\n    assert_eq!(v2.as_u16(), 42);\n    assert_eq!(v2.as_u32(), 42);\n    assert_eq!(v2.as_u64(), 42);\n    assert_eq!(v2.as_i8(), 42);\n    assert_eq!(v2.as_i16(), 42);\n    assert_eq!(v2.as_i32(), 42);\n    assert_eq!(v2.as_i64(), 42);\n    assert_eq!(v2.as_i32(), 42);\n}\n#[test]\nfn null_reader() {\n    let n = Reader::<&[u8]>::default();\n    assert_eq!(n.as_i8(), 0);\n    assert_eq!(n.as_i16(), 0);\n    assert_eq!(n.as_i32(), 0);\n    assert_eq!(n.as_i64(), 0);\n    assert_eq!(n.as_u8(), 0);\n    assert_eq!(n.as_u16(), 0);\n    assert_eq!(n.as_u32(), 0);\n    assert_eq!(n.as_u64(), 0);\n    assert_eq!(n.as_f32(), 0.0);\n    assert_eq!(n.as_f64(), 0.0);\n    assert!(n.get_i64().is_err());\n    assert!(n.get_u64().is_err());\n    assert!(n.get_f64().is_err());\n    assert!(n.as_vector().is_empty());\n    assert!(n.as_map().is_empty());\n    assert_eq!(n.as_vector().idx(1).flexbuffer_type(), FlexBufferType::Null);\n    assert_eq!(n.as_map().idx(\"1\").flexbuffer_type(), FlexBufferType::Null);\n}\n#[test]\nfn get_root_deref_oob() {\n    let s = &[\n        4, // Deref out of bounds\n        (FlexBufferType::Vector as u8) << 2 | BitWidth::W8 as u8,\n        1,\n    ];\n    assert!(Reader::get_root(s.as_ref()).is_err());\n}\n#[test]\nfn get_root_deref_u64() {\n    let s = &[0, 0, (FlexBufferType::IndirectUInt as u8) << 2 | BitWidth::W64 as u8, 1];\n    // The risk of crashing is reading 8 bytes from index 0.\n    assert_eq!(Reader::get_root(s.as_ref()).unwrap().as_u64(), 0);\n}\n\n/// Verifies that the clone operation is shallow / zero copy.\n#[test]\nfn clone_is_shallow() {\n    let mut fxb = Builder::default();\n    let mut m = fxb.start_map();\n    m.push(\"a\", &[-1i8, -2, -3, -4]);\n    m.push(\"b\", 250i64);\n    m.push(\"c\", 5000u16);\n    m.end_map();\n\n    let r = Reader::get_root(fxb.view()).unwrap();\n\n    let r2 = r.clone();\n\n    assert_eq!(r.buffer().as_ptr(), r2.buffer().as_ptr());\n}\n\n#[test]\n#[should_panic]\nfn build_map_panic_on_repeated_key() {\n    let mut b = Builder::default();\n    let mut m = b.start_map();\n    m.push(\"foo\", 5u8);\n    m.push(\"foo\", 6u8);\n    m.end_map();\n}\n#[test]\n#[should_panic]\nfn build_map_panic_on_internal_null() {\n    let mut b = Builder::default();\n    let mut m = b.start_map();\n    m.push(\"foo\\0\", 5u8);\n    m.end_map();\n}\n"
  },
  {
    "path": "tests/rust_usage_test/tests/flexbuffers_tests/qc_serious.rs",
    "content": "use alloc::collections::BTreeMap;\nuse alloc::string::String;\nuse alloc::vec::Vec;\n\nuse super::rwyw::NonNullString;\nuse flexbuffers::*;\nuse quickcheck::{Arbitrary, Gen};\n\n#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]\nenum Enum {\n    Unit,\n    U8(u8),\n    U16(u16),\n    U32(u32),\n    U64(u64),\n    Us(u8, u16, u32, u64),\n    I8(i8),\n    I16(i16),\n    I32(i32),\n    I64(i64),\n    Is(i8, i16, i32, i64),\n    F32(f32),\n    F64(f64),\n    Fs(f32, f64),\n    String(String),\n    Strings(String, String),\n    Everything(u8, u16, u32, u64, i8, i16, i32, i64, f32, f64, String),\n    Arrays { a: Array3<u16>, b: Array4<i32>, c: Array2<f64> },\n    Blobs(#[serde(with = \"serde_bytes\")] Vec<u8>),\n}\n\n// There is some upstream bug in deriving Arbitrary for Enum so we manually implement it here.\nimpl Arbitrary for Enum {\n    fn arbitrary<G: Gen>(g: &mut G) -> Self {\n        match g.gen_range(0, 18) {\n            0 => Enum::Unit,\n            1 => Enum::U8(<u8>::arbitrary(g)),\n            2 => Enum::U16(<u16>::arbitrary(g)),\n            3 => Enum::U32(<u32>::arbitrary(g)),\n            4 => Enum::U64(<u64>::arbitrary(g)),\n            5 => {\n                let (a, b, c, d) = <(u8, u16, u32, u64)>::arbitrary(g);\n                Enum::Us(a, b, c, d)\n            }\n            6 => Enum::I8(<i8>::arbitrary(g)),\n            7 => Enum::I16(<i16>::arbitrary(g)),\n            8 => Enum::I32(<i32>::arbitrary(g)),\n            9 => Enum::I64(<i64>::arbitrary(g)),\n            10 => {\n                let (a, b, c, d) = <(i8, i16, i32, i64)>::arbitrary(g);\n                Enum::Is(a, b, c, d)\n            }\n            11 => Enum::F32(<f32>::arbitrary(g)),\n            12 => Enum::F64(<f64>::arbitrary(g)),\n            13 => {\n                let (a, b) = <(f32, f64)>::arbitrary(g);\n                Enum::Fs(a, b)\n            }\n            14 => Enum::String(String::arbitrary(g)),\n            15 => {\n                let (a, b) = <(String, String)>::arbitrary(g);\n                Enum::Strings(a, b)\n            }\n            16 => Enum::Everything(\n                <u8>::arbitrary(g),\n                <u16>::arbitrary(g),\n                <u32>::arbitrary(g),\n                <u64>::arbitrary(g),\n                <i8>::arbitrary(g),\n                <i16>::arbitrary(g),\n                <i32>::arbitrary(g),\n                <i64>::arbitrary(g),\n                <f32>::arbitrary(g),\n                <f64>::arbitrary(g),\n                <String>::arbitrary(g),\n            ),\n            17 => {\n                let a = Array3::arbitrary(g);\n                let b = Array4::arbitrary(g);\n                let c = Array2::arbitrary(g);\n                Enum::Arrays { a, b, c }\n            }\n            _ => unreachable!(),\n        }\n    }\n}\n\n#[derive(Debug, Clone, Arbitrary, PartialEq, Serialize, Deserialize)]\nstruct Unit;\n\n#[derive(Debug, Clone, Arbitrary, PartialEq, Serialize, Deserialize)]\nstruct NewType(bool);\n\n#[derive(Debug, Clone, Arbitrary, PartialEq, Serialize, Deserialize)]\nstruct Tuple(bool, u8, i16, f32, String);\n\n#[derive(Debug, Clone, Arbitrary, PartialEq, Serialize, Deserialize)]\nstruct Struct {\n    a: Vec<Enum>,\n    b: BTreeMap<NonNullString, Enum>,\n    c: Tuple,\n    d: (Unit, Unit),\n    e: Array4<NewType>,\n}\n\n#[derive(Debug, Clone, PartialOrd, Ord, PartialEq, Eq, Serialize, Deserialize)]\nstruct Array2<A: Arbitrary>([A; 2]);\n#[derive(Debug, Clone, PartialOrd, Ord, PartialEq, Eq, Serialize, Deserialize)]\nstruct Array3<A: Arbitrary>([A; 3]);\n#[derive(Debug, Clone, PartialOrd, Ord, PartialEq, Eq, Serialize, Deserialize)]\nstruct Array4<A: Arbitrary>([A; 4]);\n\nimpl<A: Arbitrary> Arbitrary for Array2<A> {\n    fn arbitrary<G: Gen>(g: &mut G) -> Self {\n        Array2([A::arbitrary(g), A::arbitrary(g)])\n    }\n}\nimpl<A: Arbitrary> Arbitrary for Array3<A> {\n    fn arbitrary<G: Gen>(g: &mut G) -> Self {\n        Array3([A::arbitrary(g), A::arbitrary(g), A::arbitrary(g)])\n    }\n}\nimpl<A: Arbitrary> Arbitrary for Array4<A> {\n    fn arbitrary<G: Gen>(g: &mut G) -> Self {\n        Array4([A::arbitrary(g), A::arbitrary(g), A::arbitrary(g), A::arbitrary(g)])\n    }\n}\n\nquickcheck! {\n    fn qc_serious(original: Struct) -> bool {\n        let struct_buf = flexbuffers::to_vec(&original).unwrap();\n        let root = Reader::get_root(&*struct_buf).unwrap();\n        let reader_buf = flexbuffers::to_vec(&root).unwrap();\n        let deserialized: Struct = flexbuffers::from_slice(&struct_buf).unwrap();\n        let reserialized: Struct = flexbuffers::from_slice(&reader_buf).unwrap();\n\n        original == deserialized && original == reserialized\n    }\n}\n"
  },
  {
    "path": "tests/rust_usage_test/tests/flexbuffers_tests/rwyw.rs",
    "content": "// Copyright 2019 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nuse alloc::string::{String, ToString};\nuse alloc::vec::Vec;\n\n// Read what you wrote.\nuse flexbuffers::*;\n#[cfg(not(miri))] // slow.\nuse quickcheck;\nuse serde::{Deserialize, Serialize};\n\n// TODO(cneo): Upstream this to the quickcheck crate. Also, write a macro to derive Arbitrary.\n#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Serialize, Deserialize)]\npub struct NonNullString(String);\nimpl quickcheck::Arbitrary for NonNullString {\n    fn arbitrary<G: quickcheck::Gen>(g: &mut G) -> Self {\n        let size = core::cmp::min(1, usize::arbitrary(g));\n        NonNullString(\n            (0..).map(|_| <char>::arbitrary(g)).filter(|&b| b != '\\0').take(size).collect(),\n        )\n    }\n}\n\n#[cfg(not(miri))] // slow.\nquickcheck! {\n    fn qc_vec_bool(xs: Vec<bool>) -> bool {\n        let mut builder = Builder::default();\n        let mut v = builder.start_vector();\n        for &x in &xs {\n            v.push(x);\n        }\n        v.end_vector();\n        let r = Reader::get_root(builder.view()).unwrap().as_vector();\n        xs.iter().enumerate().all(|(i, &x)| r.index(i).unwrap().get_bool().unwrap() == x)\n    }\n    fn qc_vec_uint(xs: Vec<u64>) -> bool {\n        let mut builder = Builder::default();\n        let mut v = builder.start_vector();\n        for &x in &xs {\n            v.push(x);\n        }\n        v.end_vector();\n        let r = Reader::get_root(builder.view()).unwrap().as_vector();\n        xs.iter().enumerate().all(|(i, &x)| r.idx(i).as_u64() == x)\n    }\n    fn qc_vec_int(xs: Vec<i64>) -> bool {\n        let mut builder = Builder::default();\n        let mut v = builder.start_vector();\n        for &x in &xs {\n            v.push(x);\n        }\n        v.end_vector();\n        let r = Reader::get_root(builder.view()).unwrap().as_vector();\n        xs.iter().enumerate().all(|(i, &x)| r.idx(i).as_i64() == x)\n    }\n    fn qc_vec_float(xs: Vec<f64>) -> bool {\n        let mut builder = Builder::default();\n        let mut v = builder.start_vector();\n        for &x in &xs {\n            v.push(x);\n        }\n        v.end_vector();\n        let r = Reader::get_root(builder.view()).unwrap().as_vector();\n        xs.iter().enumerate().all(|(i, &x)| (r.idx(i).as_f64() - x).abs() < core::f64::EPSILON)\n    }\n    fn qc_vec_string(xs: Vec<String>) -> bool {\n        let mut builder = Builder::default();\n        let mut v = builder.start_vector();\n        for x in &xs {\n            v.push(x as &str);\n        }\n        v.end_vector();\n        let r = Reader::get_root(builder.view()).unwrap().as_vector();\n        xs.iter().enumerate().all(|(i, x)| (r.idx(i).as_str() == x))\n    }\n    #[cfg(not(feature = \"no_std\"))]\n    fn qc_map_int(xs: std::collections::BTreeMap<NonNullString, i64>) -> bool {\n        let mut builder = Builder::default();\n        let mut m = builder.start_map();\n        for (k, &v) in &xs {\n            m.push(&k.0, v);\n        }\n        m.end_map();\n        let r = Reader::get_root(builder.view()).unwrap().as_map();\n        xs.iter().enumerate().all(|(i, (k, &v))| {\n            r.idx(i).as_i64() == v && r.idx(k.0.as_str()).as_i64() == v\n        })\n    }\n    #[cfg(not(feature = \"no_std\"))]\n    fn qc_map_string(xs: std::collections::BTreeMap<NonNullString, String>) -> bool {\n        let mut builder = Builder::default();\n        let mut m = builder.start_map();\n        for (k, v) in &xs {\n            m.push(&k.0, v as &str);\n        }\n        m.end_map();\n        let r = Reader::get_root(builder.view()).unwrap().as_map();\n        xs.iter().enumerate().all(|(i, (k, v))| {\n            r.idx(i).as_str() == v && r.idx(k.0.as_str()).as_str() == v\n        })\n    }\n    fn qc_blob(xs: Vec<Vec<u8>>) -> bool {\n        let mut builder = Builder::default();\n        let mut v = builder.start_vector();\n        for x in &xs {\n            v.push(Blob(x.as_ref()));\n        }\n        v.end_vector();\n        let r = Reader::get_root(builder.view()).unwrap().as_vector();\n        xs.iter().enumerate().all(\n            |(i, x)| r.idx(i).get_blob().unwrap().0.iter().eq(x.iter())\n        )\n    }\n    fn qc_serde_ints(\n        u8s: Vec<u8>,\n        u16s: Vec<u16>,\n        u32s: Vec<u32>,\n        u64s: Vec<u64>,\n        i8s: Vec<i8>,\n        i16s: Vec<i16>,\n        i32s: Vec<i32>,\n        i64s: Vec<i64>\n    ) -> bool {\n        #[derive(Serialize, Deserialize, PartialEq)]\n        struct Foo {\n            u8s: Vec<u8>,\n            u16s: Vec<u16>,\n            u32s: Vec<u32>,\n            u64s: Vec<u64>,\n            i8s: Vec<i8>,\n            i16s: Vec<i16>,\n            i32s: Vec<i32>,\n            i64s: Vec<i64>,\n        }\n        let mut ser = FlexbufferSerializer::new();\n        let foo1 = Foo { u8s, u16s, u32s, u64s, i8s, i16s, i32s, i64s };\n        foo1.serialize(&mut ser).unwrap();\n        let r = Reader::get_root(ser.view()).unwrap();\n        let foo2 = Foo::deserialize(r).unwrap();\n        foo1 == foo2\n    }\n    fn qc_serde_others(\n        bools: Vec<bool>,\n        strings: Vec<String>,\n        f32s: Vec<f32>,\n        f64s: Vec<f64>\n    ) -> bool {\n        #[derive(Serialize, Deserialize, PartialEq)]\n        struct Foo {\n            bools: Vec<bool>,\n            strings: Vec<String>,\n            f32s: Vec<f32>,\n            f64s: Vec<f64>,\n        }\n        let mut ser = FlexbufferSerializer::new();\n        let foo1 = Foo { bools, strings, f32s, f64s };\n        foo1.serialize(&mut ser).unwrap();\n        let r = Reader::get_root(ser.view()).unwrap();\n        let foo2 = Foo::deserialize(r).unwrap();\n        foo1 == foo2\n    }\n    fn qc_serde_others2(\n        bools: Vec<bool>,\n        strings: Vec<String>,\n        f32s: Vec<f32>,\n        f64s: Vec<f64>\n    ) -> bool {\n        #[derive(Serialize, Deserialize, PartialEq)]\n        struct Foo (Vec<bool>, Vec<String>, Vec<f32>, Vec<f64>);\n        let mut ser = FlexbufferSerializer::new();\n        let foo1 = Foo(bools, strings, f32s, f64s);\n        foo1.serialize(&mut ser).unwrap();\n        let r = Reader::get_root(ser.view()).unwrap();\n        let foo2 = Foo::deserialize(r).unwrap();\n        foo1 == foo2\n    }\n\n}\n\n#[test]\nfn empty_vectors() {\n    #[derive(PartialEq, Serialize, Deserialize, Default, Debug)]\n    struct Foo(Vec<u8>, Vec<i8>);\n    let foo1 = Foo::default();\n    let mut s = FlexbufferSerializer::new();\n    foo1.serialize(&mut s).unwrap();\n    let r = Reader::get_root(s.view()).unwrap();\n    let foo2 = Foo::deserialize(r).unwrap();\n    assert_eq!(foo1, foo2);\n}\n\n#[test]\nfn string() {\n    let mut builder = Builder::default();\n    let mut v = builder.start_vector();\n    v.push(\"foo\");\n    v.push(\"barrr\");\n    v.push(\"bazzzzzz\");\n    v.end_vector();\n    let r = Reader::get_root(builder.view()).unwrap().as_vector();\n    assert_eq!(r.idx(0).as_str(), \"foo\");\n    assert_eq!(r.idx(1).as_str(), \"barrr\");\n    assert_eq!(r.idx(2).as_str(), \"bazzzzzz\");\n}\n\n#[test]\nfn store_13() {\n    let finished = singleton::<i32>(13);\n    let r = Reader::get_root(finished.as_ref()).unwrap();\n    assert_eq!(r.as_i32(), 13);\n}\n#[test]\nfn singleton_vector_uint_4_16bit() {\n    let mut builder = Builder::default();\n    let mut v = builder.start_vector();\n    v.push(2u8);\n    v.push(3u8);\n    v.push(5u8);\n    v.end_vector();\n    let buf1 = builder.view();\n    let buf2 = singleton(&[2u8, 3, 5]);\n    assert_eq!(buf1, buf2.as_slice());\n\n    let r = Reader::get_root(buf1).unwrap().as_vector();\n    assert_eq!(r.idx(0).get_u64(), Ok(2));\n    assert_eq!(r.idx(1).get_u64(), Ok(3));\n    assert_eq!(r.idx(2).get_u64(), Ok(5));\n    assert_eq!(r.index(3).unwrap_err(), ReaderError::IndexOutOfBounds);\n}\n#[test]\nfn vector_uint4() {\n    let mut fxb = Builder::default();\n    let mut v = fxb.start_vector();\n    v.push(2u8);\n    v.push(3u8);\n    v.push(5u8);\n    v.push(7u8);\n    v.end_vector();\n    let r = Reader::get_root(fxb.view()).unwrap();\n    let v = r.as_vector();\n    assert_eq!(v.idx(0).get_u64(), Ok(2));\n    assert_eq!(v.idx(1).get_u64(), Ok(3));\n    assert_eq!(v.idx(2).get_u64(), Ok(5));\n    assert_eq!(v.idx(3).get_u64(), Ok(7));\n    assert!(v.index(4).is_err());\n    #[allow(deprecated)]\n    #[cfg(target_endian = \"little\")]\n    {\n        assert_eq!(r.get_slice::<u8>().unwrap(), [2, 3, 5, 7]);\n    }\n}\n#[test]\nfn store_and_read_blob() {\n    let mut fxb = Builder::default();\n    let mut v = fxb.start_vector();\n    v.push(Blob([1, 2, 3, 4].as_ref()));\n    v.push(Blob([5, 6, 7].as_ref()));\n    v.end_vector();\n\n    let r = Reader::get_root(fxb.view()).unwrap().as_vector();\n    assert_eq!(r.idx(0).get_blob(), Ok(Blob([1, 2, 3, 4].as_ref())));\n    assert_eq!(r.idx(1).get_blob(), Ok(Blob([5, 6, 7].as_ref())));\n}\n#[test]\nfn map_64bit() {\n    let mut fxb = Builder::default();\n    let mut m = fxb.start_map();\n    m.push(\"a\", 257u16);\n    m.push(\"b\", u64::max_value() - 3);\n    m.end_map();\n\n    let r = Reader::get_root(fxb.view()).unwrap().as_map();\n    assert_eq!(r.idx(\"a\").as_u16(), 257);\n    assert_eq!(r.idx(\"b\").as_u64(), u64::max_value() - 3);\n}\n#[test]\nfn index_map() {\n    let mut fxb = Builder::default();\n    let mut m = fxb.start_map();\n    m.push(\"foo\", 17u8);\n    m.push(\"bar\", 33u16);\n    m.push(\"baz\", 41u32);\n    m.end_map();\n\n    let r = Reader::get_root(fxb.view()).unwrap().as_map();\n    assert_eq!(r.idx(0).get_u64(), Ok(33));\n    assert_eq!(r.idx(1).get_u64(), Ok(41));\n    assert_eq!(r.idx(2).as_u8(), 17);\n    assert_eq!(r.index(3).unwrap_err(), ReaderError::IndexOutOfBounds);\n\n    assert_eq!(r.idx(\"bar\").as_u64(), 33);\n    assert_eq!(r.idx(\"baz\").as_u32(), 41);\n    assert_eq!(r.idx(\"foo\").as_u16(), 17);\n    assert_eq!(r.index(\"???\").unwrap_err(), ReaderError::KeyNotFound);\n}\n\n#[test]\nfn map_strings() {\n    let mut fxb = Builder::default();\n    {\n        let mut m = fxb.start_map();\n        let mut a = m.start_vector(\"a\");\n        for &s in [\"b\", \"c\", \"d\", \"e\"].iter() {\n            a.push(s);\n        }\n        a.end_vector();\n        let mut f = m.start_vector(\"f\");\n        for &s in [\"gh\", \"ij\"].iter() {\n            f.push(s);\n        }\n    }\n    let r = Reader::get_root(fxb.view()).unwrap().as_map();\n    let a = r.idx(\"a\").as_vector();\n\n    assert_eq!(a.idx(0).as_str(), \"b\");\n    assert_eq!(a.idx(1).as_str(), \"c\");\n    assert_eq!(a.idx(2).as_str(), \"d\");\n    assert_eq!(a.idx(3).as_str(), \"e\");\n\n    let f = r.idx(\"f\").as_vector();\n    assert_eq!(f.idx(0).as_str(), \"gh\");\n    assert_eq!(f.idx(1).as_str(), \"ij\");\n\n    // Defaults to empty string for index errors.\n    assert_eq!(r.idx(\"a\").as_vector().idx(4).as_str(), \"\");\n    assert_eq!(r.idx(\"b\").as_vector().idx(2).as_str(), \"\");\n    assert_eq!(r.idx(\"c\").as_str(), \"\");\n}\n\n#[test]\nfn store_u64() {\n    let finished = singleton(u64::max_value() - 10);\n    let r = Reader::get_root(finished.as_ref()).unwrap();\n    assert_eq!(r.get_u64(), Ok(u64::max_value() - 10));\n}\n#[test]\nfn store_indirects() {\n    let mut b = Builder::default();\n    let mut v = b.start_vector();\n    v.push(IndirectInt(-42));\n    v.push(IndirectUInt(9000));\n    v.push(IndirectFloat(3.14));\n    v.end_vector();\n    let r = Reader::get_root(b.view()).unwrap().as_vector();\n    assert_eq!(r.idx(0).get_i64().unwrap(), -42);\n    assert_eq!(r.idx(1).get_u64().unwrap(), 9000);\n    assert_eq!(r.idx(2).get_f64().unwrap(), 3.14);\n}\n\n#[derive(Serialize, Deserialize, Debug, PartialEq)]\nstruct Foo {\n    a: i8,\n    b: f64,\n    c: Vec<u32>,\n    d: String,\n}\n\n#[cfg(not(miri))] // slow.\nquickcheck! {\n    fn serde_foo(a: i8,\n    b: f64,\n    c: Vec<u32>,\n    d: String) -> bool {\n        let mut s = FlexbufferSerializer::new();\n        let data = Foo { a, b, c, d };\n        data.serialize(&mut s).unwrap();\n\n        let read = Foo::deserialize(Reader::get_root(s.view()).unwrap()).unwrap();\n        data == read\n    }\n}\n\n#[test]\nfn serde_serious() {\n    #[derive(Debug, PartialEq, Serialize, Deserialize)]\n    enum MyEnum {\n        Unit,\n        NewType([i32; 3]),\n        Tuple(f32, f64),\n        Struct { a: u8, b: u16, c: u32 },\n    }\n    #[derive(Debug, PartialEq, Serialize, Deserialize)]\n    struct MyNewType;\n\n    #[derive(Debug, PartialEq, Serialize, Deserialize)]\n    struct MyStruct {\n        a: u8,\n        b: u16,\n        c: u32,\n        d: u64,\n    }\n\n    #[derive(Debug, PartialEq, Serialize, Deserialize)]\n    struct MyUnitStruct(Vec<String>);\n\n    #[derive(Debug, PartialEq, Serialize, Deserialize)]\n    struct MyTupleStruct(MyNewType, MyUnitStruct, MyStruct, Vec<MyEnum>);\n\n    let data = MyTupleStruct(\n        MyNewType,\n        MyUnitStruct(vec![\"Hello\".to_string(), \"World\".to_string()]),\n        MyStruct { a: 2, b: 4, c: 8, d: 16 },\n        vec![\n            MyEnum::Unit,\n            MyEnum::NewType([-1, 0, 1]),\n            MyEnum::Unit,\n            MyEnum::Tuple(3.14, 2.71),\n            MyEnum::Struct { a: 32, b: 64, c: 128 },\n        ],\n    );\n\n    let mut s = FlexbufferSerializer::new();\n    data.serialize(&mut s).unwrap();\n\n    let reader = Reader::get_root(s.view()).unwrap();\n    let read = MyTupleStruct::deserialize(reader).unwrap();\n    assert_eq!(data, read);\n}\n#[test]\nfn serialize_serde_with_bytes_as_blob() {\n    #[derive(Serialize, Deserialize)]\n    struct Foo(#[serde(with = \"serde_bytes\")] Vec<u8>);\n    let mut s = FlexbufferSerializer::new();\n    Foo(vec![5, 6, 7, 8]).serialize(&mut s).unwrap();\n    let reader = Reader::get_root(s.view()).unwrap();\n    assert_eq!(reader.flexbuffer_type(), FlexBufferType::Blob);\n    assert_eq!(reader.as_blob(), Blob([5, 6, 7, 8].as_ref()));\n}\n#[test]\nfn iter() {\n    let mut fxb = Builder::default();\n    {\n        let mut m = fxb.start_map();\n        m.push(\"a\", \"42\");\n        m.push(\"b\", 250i64);\n        m.push(\"c\", 5000u16);\n    }\n    let r = Reader::get_root(fxb.view()).unwrap();\n\n    let v: Vec<u32> = r.as_vector().iter().map(|x| x.as_u32()).collect();\n    assert_eq!(&v, &[42, 250, 5000]);\n}\n\n#[test]\nfn deserialize_newtype_i8() {\n    #[derive(Deserialize)]\n    struct Foo(u8);\n    let data = [13, 4, 1];\n    let r = Reader::get_root(data.as_ref()).unwrap();\n    let foo = Foo::deserialize(r).unwrap();\n    assert_eq!(foo.0, 13);\n}\n#[test]\nfn deserialize_newtype_str() {\n    #[derive(Deserialize)]\n    struct Foo<'a>(&'a str);\n    let data = [5, b'h', b'e', b'l', b'l', b'o', b'\\0', 6, 5 << 2, 1];\n    let r = Reader::get_root(data.as_ref()).unwrap();\n    let foo = Foo::deserialize(r).unwrap();\n    assert_eq!(foo.0, \"hello\");\n}\n#[test]\n#[rustfmt::skip]\nfn deserialize_tuple_struct_to_vec_uint4() {\n    #[derive(Deserialize)]\n    struct Foo(u8, u16, u32, u64);\n    let data = [\n        4, 0, 16, 0, 64, 0, 0, 1, // Data\n        8,              // Vector offset.\n        23 << 2 | 1,    // (VectorUInt4, W16 - referring to data).\n        1,              // Root width W8 - referring to vector.\n    ];\n    let r = Reader::get_root(data.as_ref()).unwrap();\n    let foo = Foo::deserialize(r).unwrap();\n    assert_eq!(foo.0, 4);\n    assert_eq!(foo.1, 16);\n    assert_eq!(foo.2, 64);\n    assert_eq!(foo.3, 256);\n\n    let data = [\n        1, 2, 3, 4, // The vector.\n        4,          // Root data (offset).\n        23 << 2,    // Root type: VectorUInt4, W8.\n        1,          // Root width: W8.\n    ];\n    let r = Reader::get_root(data.as_ref()).unwrap();\n    let foo = Foo::deserialize(r).unwrap();\n    assert_eq!(foo.0, 1);\n    assert_eq!(foo.1, 2);\n    assert_eq!(foo.2, 3);\n    assert_eq!(foo.3, 4);\n}\n"
  },
  {
    "path": "tests/rust_usage_test/tests/include_test.rs",
    "content": "#[allow(dead_code, unused_imports, clippy::all)]\n#[path = \"../../include_test1/mod.rs\"]\nmod include_test1_generated;\n\n#[allow(dead_code, unused_imports, clippy::all)]\n#[path = \"../../include_test2/mod.rs\"]\nmod include_test2_generated;\n\n#[allow(dead_code, unused_imports, clippy::all)]\n#[path = \"../../include_test1_generated.rs\"]\nmod include_test1_standalone;\n\n#[allow(dead_code, unused_imports, clippy::all)]\n#[path = \"../../include_test2_generated.rs\"]\nmod include_test2_standalone;\n"
  },
  {
    "path": "tests/rust_usage_test/tests/integration_test.rs",
    "content": "/*\n *\n * Copyright 2018 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#![no_std]\n\n#[cfg(not(feature = \"no_std\"))]\nextern crate std;\n#[cfg(not(feature = \"no_std\"))]\nuse alloc::vec::Vec;\n\n#[macro_use]\nextern crate alloc;\n\nuse alloc::string::String;\n\n#[cfg(feature = \"no_std\")]\n#[global_allocator]\nstatic ALLOCATOR: libc_alloc::LibcAlloc = libc_alloc::LibcAlloc;\n\n#[macro_use]\n#[cfg(not(miri))] // slow.\nextern crate quickcheck;\nextern crate flatbuffers;\nextern crate flexbuffers;\nextern crate rand;\nextern crate serde;\n#[macro_use]\nextern crate serde_derive;\n#[cfg(not(miri))] // slow.\n#[macro_use]\nextern crate quickcheck_derive;\n\nmod flexbuffers_tests;\nmod more_defaults_test;\nmod optional_scalars_test;\n\n#[allow(dead_code, unused_imports, clippy::all)]\n#[path = \"../../namespace_test/mod.rs\"]\npub mod namespace_test_generated;\n\n#[allow(dead_code, unused_imports, clippy::all)]\n#[path = \"../../monster_test/mod.rs\"]\nmod monster_test_generated;\npub use monster_test_generated::my_game;\n\n#[allow(dead_code, unused_imports, clippy::all)]\n#[path = \"../../optional_scalars/mod.rs\"]\nmod optional_scalars_generated;\n\n#[allow(dead_code, unused_imports, clippy::all)]\n#[path = \"../../arrays_test/mod.rs\"]\nmod arrays_test_generated;\n\n// We use incorrect casing to test keywords.\n#[allow(dead_code, unused_imports, non_camel_case_types, non_snake_case)]\n#[path = \"../../keyword_test/mod.rs\"]\nmod keyword_test_generated;\n\n// Test rust namer, should not cause compiling issues\n#[allow(dead_code, unused_imports, clippy::all)]\n#[path = \"../../rust_namer_test/mod.rs\"]\nmod rust_namer_test;\n\n#[rustfmt::skip] // TODO: Use standard rust formatting and remove dead code.\n#[allow(dead_code)]\nmod flatbuffers_tests {\nuse super::*;\n\n// Include simple random number generator to ensure results will be the\n// same across platforms.\n// http://en.wikipedia.org/wiki/Park%E2%80%93Miller_random_number_generator\nstruct LCG(u64);\nimpl LCG {\n    fn new() -> Self {\n        LCG { 0: 48271 }\n    }\n    fn next(&mut self) -> u64 {\n        let old = self.0;\n        self.0 = (self.0 * 279470273u64) % 4294967291u64;\n        old\n    }\n    fn reset(&mut self) {\n        self.0 = 48271\n    }\n}\n\n// test helper macro to return an error if two expressions are not equal\nmacro_rules! check_eq {\n    ($field_call:expr, $want:expr) => (\n        if $field_call == $want {\n            Ok(())\n        } else {\n            Err(stringify!($field_call))\n        }\n    )\n}\n\n#[test]\nfn macro_check_eq() {\n    assert!(check_eq!(1, 1).is_ok());\n    assert!(check_eq!(1, 2).is_err());\n}\n\n// test helper macro to return an error if two expressions are equal\nmacro_rules! check_is_some {\n    ($field_call:expr) => (\n        if $field_call.is_some() {\n            Ok(())\n        } else {\n            Err(stringify!($field_call))\n        }\n    )\n}\n\n#[test]\nfn macro_check_is_some() {\n    let some: Option<usize> = Some(0);\n    let none: Option<usize> = None;\n    assert!(check_is_some!(some).is_ok());\n    assert!(check_is_some!(none).is_err());\n}\n\n#[test]\nfn object_api_defaults() {\n    use my_game::example::*;\n    assert_eq!(\n        Vec3T::default(), Vec3T {\n        x: 0.0,\n        y: 0.0,\n        z: 0.0,\n        test1: 0.0,\n        test2: Color::empty(),\n        test3: TestT {\n            a: 0,\n            b: 0\n        }\n    });\n    let mut default_without_nan = MonsterT::default();\n    default_without_nan.nan_default = 0.0;\n    assert_eq!(\n        default_without_nan,\n        MonsterT {\n            pos: None,\n            hp: 100,\n            mana: 150,\n            name: String::new(),  // required string => default is empty string.\n            color: Color::Blue,\n            inventory: None,\n            testarrayoftables: None,\n            testarrayofstring: None,\n            testarrayofstring2: None,\n            testarrayofbools: None,\n            testarrayofsortedstruct: None,\n            enemy: None,\n            test: AnyT::NONE,\n            test4: None,\n            test5: None,\n            testnestedflatbuffer: None,\n            testempty: None,\n            testbool: false,\n            testhashs32_fnv1: 0,\n            testhashu32_fnv1: 0,\n            testhashs64_fnv1: 0,\n            testhashu64_fnv1: 0,\n            testhashs32_fnv1a: 0,\n            testhashu32_fnv1a: 0,\n            testhashs64_fnv1a: 0,\n            testhashu64_fnv1a: 0,\n            testf: 3.14159,\n            testf2: 3.0,\n            testf3: 0.0,\n            flex: None,\n            vector_of_longs: None,\n            vector_of_doubles: None,\n            parent_namespace_test: None,\n            vector_of_referrables: None,\n            single_weak_reference: 0,\n            vector_of_weak_references: None,\n            vector_of_strong_referrables: None,\n            co_owning_reference: 0,\n            vector_of_co_owning_references: None,\n            non_owning_reference: 0,\n            vector_of_non_owning_references: None,\n            any_unique: AnyUniqueAliasesT::NONE,\n            any_ambiguous: AnyAmbiguousAliasesT::NONE,\n            vector_of_enums: None,\n            signed_enum: Race::None,\n            testrequirednestedflatbuffer: None,  // despite the name, it is not required.\n            scalar_key_sorted_tables: None,\n            native_inline: None,\n            long_enum_non_enum_default: Default::default(),\n            long_enum_normal_default: LongEnum::LongOne,\n            nan_default: 0.0,\n            inf_default: f32::INFINITY,\n            positive_inf_default: f32::INFINITY,\n            infinity_default: f32::INFINITY,\n            positive_infinity_default: f32::INFINITY,\n            negative_inf_default: f32::NEG_INFINITY,\n            negative_infinity_default: f32::NEG_INFINITY,\n            double_inf_default: f64::INFINITY,\n        }\n    );\n}\n\nfn create_serialized_example_with_generated_code(builder: &mut flatbuffers::FlatBufferBuilder) {\n    let mon = {\n        let s0 = builder.create_string(\"test1\");\n        let s1 = builder.create_string(\"test2\");\n        let fred_name = builder.create_string(\"Fred\");\n\n        // can't inline creation of this Vec3 because we refer to it by reference, so it must live\n        // long enough to be used by MonsterArgs.\n        let pos = my_game::example::Vec3::new(1.0, 2.0, 3.0, 3.0, my_game::example::Color::Green, &my_game::example::Test::new(5i16, 6i8));\n\n        let args = my_game::example::MonsterArgs{\n            hp: 80,\n            mana: 150,\n            name: Some(builder.create_string(\"MyMonster\")),\n            pos: Some(&pos),\n            test_type: my_game::example::Any::Monster,\n            test: Some(my_game::example::Monster::create(builder, &my_game::example::MonsterArgs{\n                name: Some(fred_name),\n                ..Default::default()\n            }).as_union_value()),\n            inventory: Some(builder.create_vector(&[0u8, 1, 2, 3, 4])),\n            test4: Some(builder.create_vector(&[my_game::example::Test::new(10, 20),\n                                                       my_game::example::Test::new(30, 40)])),\n            testarrayofstring: Some(builder.create_vector(&[s0, s1])),\n            ..Default::default()\n        };\n        my_game::example::Monster::create(builder, &args)\n    };\n    my_game::example::finish_monster_buffer(builder, mon);\n}\n\nfn create_serialized_example_with_library_code(builder: &mut flatbuffers::FlatBufferBuilder) {\n    let nested_union_mon = {\n        let name = builder.create_string(\"Fred\");\n        let table_start = builder.start_table();\n        builder.push_slot_always(my_game::example::Monster::VT_NAME, name);\n        builder.end_table(table_start)\n    };\n    let pos = my_game::example::Vec3::new(1.0, 2.0, 3.0, 3.0, my_game::example::Color::Green, &my_game::example::Test::new(5i16, 6i8));\n    let inv = builder.create_vector(&[0u8, 1, 2, 3, 4]);\n\n    let test4 = builder.create_vector(&[my_game::example::Test::new(10, 20),\n                                        my_game::example::Test::new(30, 40)][..]);\n\n    let name = builder.create_string(\"MyMonster\");\n\n    let test1 = builder.create_string(\"test1\");\n    let test2 = builder.create_string(\"test2\");\n\n    let testarrayofstring = builder.create_vector(&[test1, test2]);\n\n    // begin building\n\n    let table_start = builder.start_table();\n    builder.push_slot(my_game::example::Monster::VT_HP, 80i16, 100);\n    builder.push_slot_always(my_game::example::Monster::VT_NAME, name);\n    builder.push_slot_always(my_game::example::Monster::VT_POS, &pos);\n    builder.push_slot(my_game::example::Monster::VT_TEST_TYPE, my_game::example::Any::Monster, my_game::example::Any::NONE);\n    builder.push_slot_always(my_game::example::Monster::VT_TEST, nested_union_mon);\n    builder.push_slot_always(my_game::example::Monster::VT_INVENTORY, inv);\n    builder.push_slot_always(my_game::example::Monster::VT_TEST4, test4);\n    builder.push_slot_always(my_game::example::Monster::VT_TESTARRAYOFSTRING, testarrayofstring);\n    let root = builder.end_table(table_start);\n    builder.finish(root, Some(my_game::example::MONSTER_IDENTIFIER));\n}\n\nfn serialized_example_is_accessible_and_correct(bytes: &[u8], identifier_required: bool, size_prefixed: bool) -> Result<(), &'static str> {\n\n    if identifier_required {\n        let correct = if size_prefixed {\n            my_game::example::monster_size_prefixed_buffer_has_identifier(bytes)\n        } else {\n            my_game::example::monster_buffer_has_identifier(bytes)\n        };\n        check_eq!(correct, true)?;\n    }\n\n    let m = if size_prefixed {\n        my_game::example::size_prefixed_root_as_monster(bytes).unwrap()\n    } else {\n        my_game::example::root_as_monster(bytes).unwrap()\n    };\n\n    check_eq!(m.hp(), 80)?;\n    check_eq!(m.mana(), 150)?;\n    check_eq!(m.name(), \"MyMonster\")?;\n\n    let pos = m.pos().unwrap();\n    check_eq!(pos.x(), 1.0f32)?;\n    check_eq!(pos.y(), 2.0f32)?;\n    check_eq!(pos.z(), 3.0f32)?;\n    check_eq!(pos.test1(), 3.0f64)?;\n    check_eq!(pos.test2(), my_game::example::Color::Green)?;\n\n    let pos_test3 = pos.test3();\n    check_eq!(pos_test3.a(), 5i16)?;\n    check_eq!(pos_test3.b(), 6i8)?;\n\n    check_eq!(m.test_type(), my_game::example::Any::Monster)?;\n    check_is_some!(m.test())?;\n    let table2 = m.test().unwrap();\n    let monster2 = unsafe { my_game::example::Monster::init_from_table(table2) };\n\n    check_eq!(monster2.name(), \"Fred\")?;\n\n    check_is_some!(m.inventory())?;\n    let inv = m.inventory().unwrap();\n    check_eq!(inv.len(), 5)?;\n    check_eq!(inv.iter().sum::<u8>(), 10u8)?;\n    check_eq!(inv.iter().rev().sum::<u8>(), 10u8)?;\n\n    check_is_some!(m.test4())?;\n    let test4 = m.test4().unwrap();\n    check_eq!(test4.len(), 2)?;\n    check_eq!(test4.get(0).a() as i32 + test4.get(0).b() as i32 +\n              test4.get(1).a() as i32 + test4.get(1).b() as i32, 100)?;\n\n    check_is_some!(m.testarrayofstring())?;\n    let testarrayofstring = m.testarrayofstring().unwrap();\n    check_eq!(testarrayofstring.len(), 2)?;\n    check_eq!(testarrayofstring.get(0), \"test1\")?;\n    check_eq!(testarrayofstring.get(1), \"test2\")?;\n\n    Ok(())\n}\n\n#[test]\nfn test_object_api_reads_correctly() -> Result<(), &'static str>{\n    let mut fbb = flatbuffers::FlatBufferBuilder::new();\n    create_serialized_example_with_library_code(&mut fbb);\n\n    let m = my_game::example::root_as_monster(fbb.finished_data()).unwrap().unpack();\n\n    check_eq!(m.hp, 80)?;\n    check_eq!(m.mana, 150)?;\n    check_eq!(m.name, \"MyMonster\")?;\n\n    let pos = m.pos.as_ref().unwrap();\n    check_eq!(pos.x, 1.0f32)?;\n    check_eq!(pos.y, 2.0f32)?;\n    check_eq!(pos.z, 3.0f32)?;\n    check_eq!(pos.test1, 3.0f64)?;\n    check_eq!(pos.test2, my_game::example::Color::Green)?;\n\n    let pos_test3 = &pos.test3;\n    check_eq!(pos_test3.a, 5i16)?;\n    check_eq!(pos_test3.b, 6i8)?;\n\n    let monster2 = m.test.as_monster().unwrap();\n    check_eq!(monster2.name, \"Fred\")?;\n\n    let inv = m.inventory.as_ref().unwrap();\n    check_eq!(inv.len(), 5)?;\n    check_eq!(inv.iter().sum::<u8>(), 10u8)?;\n    check_eq!(inv.iter().rev().sum::<u8>(), 10u8)?;\n\n    let test4 = m.test4.as_ref().unwrap();\n    check_eq!(test4.len(), 2)?;\n    check_eq!(test4[0].a as i32 + test4[0].b as i32 +\n              test4[1].a as i32 + test4[1].b as i32, 100)?;\n\n    let testarrayofstring = m.testarrayofstring.as_ref().unwrap();\n    check_eq!(testarrayofstring.len(), 2)?;\n    check_eq!(testarrayofstring[0], \"test1\")?;\n    check_eq!(testarrayofstring[1], \"test2\")?;\n    Ok(())\n}\n\n\n\n// Disabled due to Windows CI limitations.\n// #[test]\n// fn builder_initializes_with_maximum_buffer_size() {\n//     flatbuffers::FlatBufferBuilder::with_capacity(flatbuffers::FLATBUFFERS_MAX_BUFFER_SIZE);\n// }\n\n#[should_panic]\n#[test]\nfn builder_abort_with_greater_than_maximum_buffer_size() {\n    flatbuffers::FlatBufferBuilder::with_capacity(flatbuffers::FLATBUFFERS_MAX_BUFFER_SIZE+1);\n}\n\n#[test]\nfn builder_collapses_into_vec() {\n    let mut b = flatbuffers::FlatBufferBuilder::new();\n    create_serialized_example_with_generated_code(&mut b);\n    let (backing_buf, head) = b.collapse();\n    serialized_example_is_accessible_and_correct(&backing_buf[head..], true, false).unwrap();\n}\n\n#[test]\n#[cfg(not(miri))]  // slow.\nfn verifier_one_byte_errors_do_not_crash() {\n    let mut b = flatbuffers::FlatBufferBuilder::new();\n    create_serialized_example_with_library_code(&mut b);\n    let mut badbuf = b.finished_data().to_vec();\n    // If the verifier says a buffer is okay then using it won't cause a crash.\n    // We use write_fmt since Debug visits all the fields - but there's no need to store anything.\n    struct ForgetfulWriter;\n    use core::fmt::Write;\n    impl Write for ForgetfulWriter {\n        fn write_str(&mut self, _: &str) -> Result<(), core::fmt::Error> {\n            Ok(())\n        }\n    }\n    let mut w = ForgetfulWriter;\n    for d in 1..=255u8 {\n        for i in 0..badbuf.len() {\n            let orig = badbuf[i];\n            badbuf[i] = badbuf[i].wrapping_add(d);\n            if let Ok(m) = flatbuffers::root::<my_game::example::Monster>(&badbuf) {\n                w.write_fmt(format_args!(\"{:?}\", m)).unwrap()\n            }\n            badbuf[i] = orig;\n        }\n    }\n}\n#[test]\n#[cfg(not(miri))]  // slow.\nfn verifier_too_many_tables() {\n    use my_game::example::*;\n    let b = &mut flatbuffers::FlatBufferBuilder::new();\n    let r = Referrable::create(b, &ReferrableArgs { id: 42 });\n    let rs = b.create_vector(&vec![r; 500]);\n    let name = Some(b.create_string(\"foo\"));\n    let m = Monster::create(b, &MonsterArgs {\n        vector_of_referrables: Some(rs),\n        name,  // required field.\n        ..Default::default()\n    });\n    b.finish(m, None);\n\n    let data = b.finished_data();\n    let mut opts = flatbuffers::VerifierOptions::default();\n\n    opts.max_tables = 500;\n    let res = flatbuffers::root_with_opts::<Monster>(&opts, data);\n    assert_eq!(res.unwrap_err(), flatbuffers::InvalidFlatbuffer::TooManyTables);\n\n    opts.max_tables += 2;\n    assert!(flatbuffers::root_with_opts::<Monster>(&opts, data).is_ok());\n}\n#[test]\n#[cfg(not(miri))]  // slow.\nfn verifier_apparent_size_too_large() {\n    use my_game::example::*;\n    let b = &mut flatbuffers::FlatBufferBuilder::new();\n    let name = Some(b.create_string(\"foo\"));\n    // String amplification attack.\n    let s = b.create_string(&(core::iter::repeat(\"X\").take(1000).collect::<String>()));\n    let testarrayofstring = Some(b.create_vector(&vec![s; 1000]));\n    let m = Monster::create(b, &MonsterArgs {\n        testarrayofstring,\n        name,  // required field.\n        ..Default::default()\n    });\n    b.finish(m, None);\n    let data = b.finished_data();\n    assert!(data.len() < 5200);  // est 4000 for the vector + 1000 for the string + 200 overhead.\n    let mut opts = flatbuffers::VerifierOptions::default();\n    opts.max_apparent_size = 1_000_000;\n\n    let res = flatbuffers::root_with_opts::<Monster>(&opts, data);\n    assert_eq!(res.unwrap_err(), flatbuffers::InvalidFlatbuffer::ApparentSizeTooLarge);\n\n    opts.max_apparent_size += 20_000;\n    assert!(flatbuffers::root_with_opts::<Monster>(&opts, data).is_ok());\n}\n#[test]\nfn verifier_in_too_deep() {\n    use my_game::example::*;\n    let b = &mut flatbuffers::FlatBufferBuilder::new();\n    let name = Some(b.create_string(\"foo\"));\n    let mut prev_monster = None;\n    for _ in 0..11 {\n        prev_monster = Some(Monster::create(b, &MonsterArgs {\n            enemy: prev_monster,\n            name,  // required field.\n            ..Default::default()\n        }));\n    };\n    b.finish(prev_monster.unwrap(), None);\n    let mut opts = flatbuffers::VerifierOptions::default();\n    opts.max_depth = 10;\n\n    let data = b.finished_data();\n    let res = flatbuffers::root_with_opts::<Monster>(&opts, data);\n    assert_eq!(res.unwrap_err(), flatbuffers::InvalidFlatbuffer::DepthLimitReached);\n\n    opts.max_depth += 1;\n    assert!(flatbuffers::root_with_opts::<Monster>(&opts, data).is_ok());\n}\n\n#[cfg(test)]\nmod generated_constants {\n    extern crate flatbuffers;\n    use super::my_game;\n\n    #[test]\n    fn monster_identifier() {\n        assert_eq!(\"MONS\", my_game::example::MONSTER_IDENTIFIER);\n    }\n\n    #[test]\n    fn monster_file_extension() {\n        assert_eq!(\"mon\", my_game::example::MONSTER_EXTENSION);\n    }\n\n    #[test]\n    fn enum_constants_are_public() {\n        assert_eq!(-1, my_game::example::Race::ENUM_MIN);\n        assert_eq!(2, my_game::example::Race::ENUM_MAX);\n        assert_eq!(my_game::example::Race::ENUM_VALUES, [\n            my_game::example::Race::None,\n            my_game::example::Race::Human,\n            my_game::example::Race::Dwarf,\n            my_game::example::Race::Elf,\n        ]);\n\n        assert_eq!(0, my_game::example::Any::ENUM_MIN);\n        assert_eq!(3, my_game::example::Any::ENUM_MAX);\n        assert_eq!(my_game::example::Any::ENUM_VALUES, [\n            my_game::example::Any::NONE,\n            my_game::example::Any::Monster,\n            my_game::example::Any::TestSimpleTableWithEnum,\n            my_game::example::Any::MyGame_Example2_Monster,\n        ]);\n\n        assert_eq!(0, my_game::example::AnyUniqueAliases::ENUM_MIN);\n        assert_eq!(3, my_game::example::AnyUniqueAliases::ENUM_MAX);\n        assert_eq!(my_game::example::AnyUniqueAliases::ENUM_VALUES, [\n            my_game::example::AnyUniqueAliases::NONE,\n            my_game::example::AnyUniqueAliases::M,\n            my_game::example::AnyUniqueAliases::TS,\n            my_game::example::AnyUniqueAliases::M2,\n        ]);\n\n        assert_eq!(0, my_game::example::AnyAmbiguousAliases::ENUM_MIN);\n        assert_eq!(3, my_game::example::AnyAmbiguousAliases::ENUM_MAX);\n        assert_eq!(my_game::example::AnyAmbiguousAliases::ENUM_VALUES, [\n            my_game::example::AnyAmbiguousAliases::NONE,\n            my_game::example::AnyAmbiguousAliases::M1,\n            my_game::example::AnyAmbiguousAliases::M2,\n            my_game::example::AnyAmbiguousAliases::M3,\n        ]);\n    }\n}\n\n#[cfg(not(feature = \"no_std\"))]\n#[cfg(test)]\nmod lifetime_correctness {\n    extern crate flatbuffers;\n\n    use core::mem;\n\n    use super::my_game;\n    use super::load_file;\n\n    #[test]\n    fn table_get_field_from_static_buffer_1() {\n        let buf = load_file(\"../monsterdata_test.mon\").expect(\"missing monsterdata_test.mon\");\n        // create 'static slice\n        let slice: &[u8] = &buf;\n        let slice: &'static [u8] = unsafe { mem::transmute(slice) };\n        // make sure values retrieved from the 'static buffer are themselves 'static\n        let monster: my_game::example::Monster<'static> = my_game::example::root_as_monster(slice).unwrap();\n        // this line should compile:\n        let name: Option<&'static str> = unsafe { monster._tab.get::<flatbuffers::ForwardsUOffset<&str>>(my_game::example::Monster::VT_NAME, None) };\n        assert_eq!(name, Some(\"MyMonster\"));\n    }\n\n    #[test]\n    fn table_get_field_from_static_buffer_2() {\n        static DATA: [u8; 4] = [0, 0, 0, 0]; // some binary data\n        let table: flatbuffers::Table<'static> = unsafe { flatbuffers::Table::new(&DATA, 0) };\n        // this line should compile:\n        unsafe { table.get::<&'static str>(0, None) };\n    }\n\n    #[test]\n    fn table_object_self_lifetime_in_closure() {\n        // This test is designed to ensure that lifetimes for temporary intermediate tables aren't inflated beyond where the need to be.\n        let buf = load_file(\"../monsterdata_test.mon\").expect(\"missing monsterdata_test.mon\");\n        let monster = my_game::example::root_as_monster(&buf).unwrap();\n        let enemy: Option<my_game::example::Monster> = monster.enemy();\n        // This line won't compile if \"self\" is required to live for the lifetime of buf above as the borrow disappears at the end of the closure.\n        let enemy_of_my_enemy = enemy.map(|e| {\n            // enemy (the Option) is consumed, and the enum's value is taken as a temporary (e) at the start of the closure\n            let name = e.name();\n            // ... the temporary dies here, so for this to compile name's lifetime must not be tied to the temporary\n            name\n            // If this test fails the error would be \"`e` dropped here while still borrowed\"\n        });\n        assert_eq!(enemy_of_my_enemy, Some(\"Fred\"));\n    }\n}\n\n#[cfg(test)]\nmod roundtrip_generated_code {\n    extern crate flatbuffers;\n\n    use alloc::vec::Vec;\n\n    use super::my_game;\n\n    fn build_mon<'a, 'b>(builder: &'a mut flatbuffers::FlatBufferBuilder, args: &'b my_game::example::MonsterArgs) -> my_game::example::Monster<'a> {\n        let mon = my_game::example::Monster::create(builder, &args);\n        my_game::example::finish_monster_buffer(builder, mon);\n        my_game::example::root_as_monster(builder.finished_data()).unwrap()\n    }\n\n    #[test]\n    fn scalar_store() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let name = b.create_string(\"foo\");\n        let m = build_mon(&mut b, &my_game::example::MonsterArgs{hp: 123, name: Some(name), ..Default::default()});\n        assert_eq!(m.hp(), 123);\n    }\n    #[test]\n    fn scalar_default() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let name = b.create_string(\"foo\");\n        let m = build_mon(&mut b, &my_game::example::MonsterArgs{name: Some(name), ..Default::default()});\n        assert_eq!(m.hp(), 100);\n    }\n    #[test]\n    fn string_store() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let name = b.create_string(\"foobar\");\n        let m = build_mon(&mut b, &my_game::example::MonsterArgs{name: Some(name), ..Default::default()});\n        assert_eq!(m.name(), \"foobar\");\n    }\n    #[test]\n    fn struct_store() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let name = b.create_string(\"foo\");\n        let m = build_mon(&mut b, &my_game::example::MonsterArgs{\n            name: Some(name),\n            pos: Some(&my_game::example::Vec3::new(1.0, 2.0, 3.0, 4.0,\n                                                   my_game::example::Color::Green,\n                                                   &my_game::example::Test::new(98, 99))),\n            ..Default::default()\n        });\n        assert_eq!(m.pos(), Some(&my_game::example::Vec3::new(1.0, 2.0, 3.0, 4.0,\n                                                              my_game::example::Color::Green,\n                                                              &my_game::example::Test::new(98, 99))));\n    }\n    #[test]\n    fn struct_default() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let name = b.create_string(\"foo\");\n        let m = build_mon(&mut b, &my_game::example::MonsterArgs{name: Some(name), ..Default::default()});\n        assert_eq!(m.pos(), None);\n    }\n    #[test]\n    fn enum_store() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let name = b.create_string(\"foo\");\n        let m = build_mon(&mut b, &my_game::example::MonsterArgs{name: Some(name), color: my_game::example::Color::Red, ..Default::default()});\n        assert_eq!(m.color(), my_game::example::Color::Red);\n    }\n    #[test]\n    fn enum_default() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let name = b.create_string(\"foo\");\n        let m = build_mon(&mut b, &my_game::example::MonsterArgs{name: Some(name), ..Default::default()});\n        assert_eq!(m.color(), my_game::example::Color::Blue);\n    }\n    #[test]\n    fn union_store() {\n        let b = &mut flatbuffers::FlatBufferBuilder::new();\n        {\n            let name_inner = b.create_string(\"foo\");\n            let name_outer = b.create_string(\"bar\");\n\n            let inner = my_game::example::Monster::create(b, &my_game::example::MonsterArgs{\n                name: Some(name_inner),\n                ..Default::default()\n            });\n            let outer = my_game::example::Monster::create(b, &my_game::example::MonsterArgs{\n                name: Some(name_outer),\n                test_type: my_game::example::Any::Monster,\n                test: Some(inner.as_union_value()),\n                ..Default::default()\n            });\n            my_game::example::finish_monster_buffer(b, outer);\n        }\n\n        let mon = my_game::example::root_as_monster(b.finished_data()).unwrap();\n        assert_eq!(mon.name(), \"bar\");\n        assert_eq!(mon.test_type(), my_game::example::Any::Monster);\n        let name = unsafe { my_game::example::Monster::init_from_table(mon.test().unwrap()).name() };\n        assert_eq!(name, \"foo\");\n        assert_eq!(mon.test_as_monster().unwrap().name(), \"foo\");\n        assert_eq!(mon.test_as_test_simple_table_with_enum(), None);\n        assert_eq!(mon.test_as_my_game_example_2_monster(), None);\n    }\n    #[test]\n    fn union_default() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let name = b.create_string(\"foo\");\n        let m = build_mon(&mut b, &my_game::example::MonsterArgs{name: Some(name), ..Default::default()});\n        assert_eq!(m.test_type(), my_game::example::Any::NONE);\n        assert_eq!(m.test(), None);\n    }\n    #[test]\n    fn table_full_namespace_store() {\n        let b = &mut flatbuffers::FlatBufferBuilder::new();\n        {\n            let name_inner = b.create_string(\"foo\");\n            let name_outer = b.create_string(\"bar\");\n\n            let inner = my_game::example::Monster::create(b, &my_game::example::MonsterArgs{\n                name: Some(name_inner),\n                ..Default::default()\n            });\n            let outer = my_game::example::Monster::create(b, &my_game::example::MonsterArgs{\n                name: Some(name_outer),\n                enemy: Some(inner),\n                ..Default::default()\n            });\n            my_game::example::finish_monster_buffer(b, outer);\n        }\n\n        let mon = my_game::example::root_as_monster(b.finished_data()).unwrap();\n        assert_eq!(mon.name(), \"bar\");\n        assert_eq!(mon.enemy().unwrap().name(), \"foo\");\n    }\n    #[test]\n    fn table_full_namespace_default() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let name = b.create_string(\"foo\");\n        let m = build_mon(&mut b, &my_game::example::MonsterArgs{name: Some(name), ..Default::default()});\n        assert_eq!(m.enemy(), None);\n    }\n    #[test]\n    fn table_store() {\n        let b = &mut flatbuffers::FlatBufferBuilder::new();\n        {\n            let id_inner = b.create_string(\"foo\");\n            let name_outer = b.create_string(\"bar\");\n\n            let inner = my_game::example::Stat::create(b, &my_game::example::StatArgs{\n                id: Some(id_inner),\n                ..Default::default()\n            });\n            let outer = my_game::example::Monster::create(b, &my_game::example::MonsterArgs{\n                name: Some(name_outer),\n                testempty: Some(inner),\n                ..Default::default()\n            });\n            my_game::example::finish_monster_buffer(b, outer);\n        }\n\n        let mon = my_game::example::root_as_monster(b.finished_data()).unwrap();\n        assert_eq!(mon.name(), \"bar\");\n        assert_eq!(mon.testempty().unwrap().id(), Some(\"foo\"));\n    }\n    #[test]\n    fn table_default() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let name = b.create_string(\"foo\");\n        let m = build_mon(&mut b, &my_game::example::MonsterArgs{name: Some(name), ..Default::default()});\n        assert_eq!(m.testempty(), None);\n    }\n    #[test]\n    fn nested_flatbuffer_store() {\n        let b0 = {\n            let mut b0 = flatbuffers::FlatBufferBuilder::new();\n            let args = my_game::example::MonsterArgs{\n                hp: 123,\n                name: Some(b0.create_string(\"foobar\")),\n                ..Default::default()\n            };\n            let mon = my_game::example::Monster::create(&mut b0, &args);\n            my_game::example::finish_monster_buffer(&mut b0, mon);\n            b0\n        };\n\n        let b1 = {\n            let mut b1 = flatbuffers::FlatBufferBuilder::new();\n            let args = my_game::example::MonsterArgs{\n                testnestedflatbuffer: Some(b1.create_vector(b0.finished_data())),\n                name: Some(b1.create_string(\"foo\")),\n                ..Default::default()\n            };\n            let mon = my_game::example::Monster::create(&mut b1, &args);\n            my_game::example::finish_monster_buffer(&mut b1, mon);\n            b1\n        };\n\n        let m = my_game::example::root_as_monster(b1.finished_data()).unwrap();\n\n        assert!(m.testnestedflatbuffer().is_some());\n        assert_eq!(m.testnestedflatbuffer().unwrap().bytes(), b0.finished_data());\n\n        let m2_a = my_game::example::root_as_monster(m.testnestedflatbuffer().unwrap().bytes()).unwrap();\n        assert_eq!(m2_a.hp(), 123);\n        assert_eq!(m2_a.name(), \"foobar\");\n\n        assert!(m.testnestedflatbuffer_nested_flatbuffer().is_some());\n        let m2_b = m.testnestedflatbuffer_nested_flatbuffer().unwrap();\n\n        assert_eq!(m2_b.hp(), 123);\n        assert_eq!(m2_b.name(), \"foobar\");\n    }\n    #[test]\n    fn nested_flatbuffer_default() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let name = b.create_string(\"foo\");\n        let m = build_mon(&mut b, &my_game::example::MonsterArgs{name: Some(name), ..Default::default()});\n        assert!(m.testnestedflatbuffer().is_none());\n    }\n    #[test]\n    fn vector_of_string_store_helper_build() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let strings = &[b.create_string(\"foobar\"), b.create_string(\"baz\")];\n        let v = b.create_vector(strings);\n        let name = b.create_string(\"foo\");\n        let m = build_mon(&mut b, &my_game::example::MonsterArgs{\n            name: Some(name),\n            testarrayofstring: Some(v), ..Default::default()});\n        assert_eq!(m.testarrayofstring().unwrap().len(), 2);\n        assert_eq!(m.testarrayofstring().unwrap().get(0), \"foobar\");\n        assert_eq!(m.testarrayofstring().unwrap().get(1), \"baz\");\n\n        let rust_vec_inst = m.testarrayofstring().unwrap();\n        let rust_vec_iter_collect = rust_vec_inst.iter().collect::<Vec<_>>();\n        assert_eq!(rust_vec_iter_collect.len(), 2);\n        assert_eq!(rust_vec_iter_collect[0], \"foobar\");\n        assert_eq!(rust_vec_iter_collect[1], \"baz\");\n\n        let rust_vec_iter_rev_collect = rust_vec_inst.iter().rev().collect::<Vec<_>>();\n        assert_eq!(rust_vec_iter_rev_collect.len(), 2);\n        assert_eq!(rust_vec_iter_rev_collect[1], \"foobar\");\n        assert_eq!(rust_vec_iter_rev_collect[0], \"baz\");\n\n    }\n    #[test]\n    fn vector_of_string_store_manual_build() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let s0 = b.create_string(\"foobar\");\n        let s1 = b.create_string(\"baz\");\n        let v = b.create_vector(&[s0, s1]);\n        let name = b.create_string(\"foo\");\n        let m = build_mon(&mut b, &my_game::example::MonsterArgs{\n            name: Some(name),\n            testarrayofstring: Some(v), ..Default::default()});\n        assert_eq!(m.testarrayofstring().unwrap().len(), 2);\n        assert_eq!(m.testarrayofstring().unwrap().get(0), \"foobar\");\n        assert_eq!(m.testarrayofstring().unwrap().get(1), \"baz\");\n\n        let rust_vec_inst = m.testarrayofstring().unwrap();\n        let rust_vec_iter_collect = rust_vec_inst.iter().collect::<Vec<_>>();\n        assert_eq!(rust_vec_iter_collect.len(), 2);\n        assert_eq!(rust_vec_iter_collect[0], \"foobar\");\n        assert_eq!(rust_vec_iter_collect[1], \"baz\");\n\n        let rust_vec_iter_rev_collect = rust_vec_inst.iter().rev().collect::<Vec<_>>();\n        assert_eq!(rust_vec_iter_rev_collect.len(), 2);\n        assert_eq!(rust_vec_iter_rev_collect[0], \"baz\");\n        assert_eq!(rust_vec_iter_rev_collect[1], \"foobar\");\n    }\n    #[test]\n    fn vector_of_ubyte_store() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let v = b.create_vector(&[123u8, 234u8][..]);\n        let name = b.create_string(\"foo\");\n        let m = build_mon(&mut b, &my_game::example::MonsterArgs{\n            name: Some(name),\n            inventory: Some(v), ..Default::default()\n        });\n        assert_eq!(m.inventory().unwrap().bytes(), &[123, 234]);\n    }\n    #[test]\n    fn vector_of_bool_store() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let v = b.create_vector(&[false, true, false, true][..]);\n        let name = b.create_string(\"foo\");\n        let m = build_mon(&mut b, &my_game::example::MonsterArgs{\n            name: Some(name),\n            testarrayofbools: Some(v), ..Default::default()});\n\n        let rust_vec_inst = m.testarrayofbools().unwrap();\n        let rust_vec_iter_collect = rust_vec_inst.iter().collect::<Vec<_>>();\n        assert_eq!(&rust_vec_iter_collect, &[false, true, false, true]);\n\n        let rust_vec_iter_rev_collect = rust_vec_inst.iter().rev().collect::<Vec<_>>();\n        assert_eq!(&rust_vec_iter_rev_collect, &[true, false, true, false]);\n    }\n    #[test]\n    fn vector_of_f64_store() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let v = b.create_vector(&[3.14159265359f64][..]);\n        let name = b.create_string(\"foo\");\n        let m = build_mon(&mut b, &my_game::example::MonsterArgs{\n            name: Some(name),\n            vector_of_doubles: Some(v), ..Default::default()});\n        assert_eq!(m.vector_of_doubles().unwrap().len(), 1);\n        assert_eq!(m.vector_of_doubles().unwrap().get(0), 3.14159265359f64);\n\n        let rust_vec_inst = m.vector_of_doubles().unwrap();\n        let rust_vec_iter_collect = rust_vec_inst.iter().collect::<Vec<_>>();\n        assert_eq!(rust_vec_iter_collect.len(), 1);\n        assert_eq!(rust_vec_iter_collect[0], 3.14159265359f64);\n\n        let rust_vec_iter_rev_collect = rust_vec_inst.iter().rev().collect::<Vec<_>>();\n        assert_eq!(rust_vec_iter_rev_collect.len(), 1);\n        assert_eq!(rust_vec_iter_rev_collect[0], 3.14159265359f64);\n    }\n    #[test]\n    fn vector_of_struct_store() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let v = b.create_vector(&[my_game::example::Test::new(127, -128), my_game::example::Test::new(3, 123)][..]);\n        let name = b.create_string(\"foo\");\n        let m = build_mon(&mut b, &my_game::example::MonsterArgs{\n            name: Some(name),\n            test4: Some(v), ..Default::default()});\n\n        let rust_vec_inst = m.test4().unwrap();\n        let rust_vec_iter_collect = rust_vec_inst.iter().collect::<Vec<_>>();\n        assert_eq!(rust_vec_iter_collect, &[&my_game::example::Test::new(127, -128), &my_game::example::Test::new(3, 123)][..]);\n\n        let rust_vec_iter_rev_collect = rust_vec_inst.iter().rev().collect::<Vec<_>>();\n        assert_eq!(rust_vec_iter_rev_collect, &[&my_game::example::Test::new(3, 123), &my_game::example::Test::new(127, -128)][..]);\n    }\n    #[test]\n    fn vector_of_struct_store_with_type_inference() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let v = b.create_vector(&[my_game::example::Test::new(127, -128),\n                                  my_game::example::Test::new(3, 123),\n                                  my_game::example::Test::new(100, 101)]);\n        let name = b.create_string(\"foo\");\n        let m = build_mon(&mut b, &my_game::example::MonsterArgs{\n            name: Some(name),\n            test4: Some(v), ..Default::default()});\n        let vals: Vec<_> = m.test4().unwrap().iter().collect::<Vec<_>>();\n        assert_eq!(vals, vec![&my_game::example::Test::new(127, -128), &my_game::example::Test::new(3, 123), &my_game::example::Test::new(100, 101)]);\n    }\n     #[test]\n     fn vector_of_enums_store() {\n         let mut b = flatbuffers::FlatBufferBuilder::new();\n         let v = b.create_vector::<my_game::example::Color>(&[my_game::example::Color::Red, my_game::example::Color::Green][..]);\n         let name = b.create_string(\"foo\");\n         let m = build_mon(&mut b, &my_game::example::MonsterArgs{\n             name: Some(name),\n             vector_of_enums: Some(v), ..Default::default()});\n         assert_eq!(m.vector_of_enums().unwrap().len(), 2);\n         assert_eq!(m.vector_of_enums().unwrap().get(0), my_game::example::Color::Red);\n         assert_eq!(m.vector_of_enums().unwrap().get(1), my_game::example::Color::Green);\n     }\n    #[test]\n    fn vector_of_table_store() {\n        let b = &mut flatbuffers::FlatBufferBuilder::new();\n        let t0 = {\n            let name = b.create_string(\"foo\");\n            let args = my_game::example::MonsterArgs{hp: 55, name: Some(name), ..Default::default()};\n            my_game::example::Monster::create(b, &args)\n        };\n        let t1 = {\n            let name = b.create_string(\"bar\");\n            let args = my_game::example::MonsterArgs{name: Some(name), ..Default::default()};\n            my_game::example::Monster::create(b, &args)\n        };\n        let v = b.create_vector(&[t0, t1][..]);\n        let name = b.create_string(\"foo\");\n        let m = build_mon(b, &my_game::example::MonsterArgs{\n            name: Some(name),\n            testarrayoftables: Some(v), ..Default::default()});\n        assert_eq!(m.testarrayoftables().unwrap().len(), 2);\n        assert_eq!(m.testarrayoftables().unwrap().get(0).hp(), 55);\n        assert_eq!(m.testarrayoftables().unwrap().get(0).name(), \"foo\");\n        assert_eq!(m.testarrayoftables().unwrap().get(1).hp(), 100);\n        assert_eq!(m.testarrayoftables().unwrap().get(1).name(), \"bar\");\n\n        let rust_vec_inst = m.testarrayoftables().unwrap();\n        let rust_vec_iter_collect = rust_vec_inst.iter().collect::<Vec<_>>();\n        assert_eq!(rust_vec_iter_collect.len(), 2);\n        assert_eq!(rust_vec_iter_collect[0].hp(), 55);\n        assert_eq!(rust_vec_iter_collect[0].name(), \"foo\");\n        assert_eq!(rust_vec_iter_collect[1].hp(), 100);\n        assert_eq!(rust_vec_iter_collect[1].name(), \"bar\");\n\n        let rust_vec_iter_rev_collect = rust_vec_inst.iter().rev().collect::<Vec<_>>();\n        assert_eq!(rust_vec_iter_rev_collect.len(), 2);\n        assert_eq!(rust_vec_iter_rev_collect[0].hp(), 100);\n        assert_eq!(rust_vec_iter_rev_collect[0].name(), \"bar\");\n        assert_eq!(rust_vec_iter_rev_collect[1].hp(), 55);\n        assert_eq!(rust_vec_iter_rev_collect[1].name(), \"foo\");\n    }\n}\n\n#[cfg(test)]\nmod generated_code_alignment_and_padding {\n    extern crate flatbuffers;\n    use super::my_game;\n\n    #[test]\n    fn enum_color_is_1_byte() {\n        assert_eq!(1, ::core::mem::size_of::<my_game::example::Color>());\n    }\n\n    #[test]\n    fn union_any_is_1_byte() {\n        assert_eq!(1, ::core::mem::size_of::<my_game::example::Any>());\n    }\n\n    #[test]\n    fn union_any_is_aligned_to_1() {\n        assert_eq!(1, ::core::mem::align_of::<my_game::example::Any>());\n    }\n    #[test]\n    fn struct_test_is_4_bytes() {\n        assert_eq!(4, ::core::mem::size_of::<my_game::example::Test>());\n    }\n    #[test]\n    fn struct_vec3_is_32_bytes() {\n        assert_eq!(32, ::core::mem::size_of::<my_game::example::Vec3>());\n    }\n\n    #[test]\n    fn struct_vec3_is_written_with_correct_alignment_in_table() {\n        let b = &mut flatbuffers::FlatBufferBuilder::new();\n        {\n            let name = b.create_string(\"foo\");\n            let mon = my_game::example::Monster::create(b, &my_game::example::MonsterArgs{\n                name: Some(name),\n                pos: Some(&my_game::example::Vec3::new(1.0, 2.0, 3.0, 4.0,\n                                                       my_game::example::Color::Green,\n                                                       &my_game::example::Test::new(98, 99))),\n                                                       ..Default::default()});\n            my_game::example::finish_monster_buffer(b, mon);\n        }\n        let buf = b.finished_data();\n        let mon = my_game::example::root_as_monster(buf).unwrap();\n        let vec3 = mon.pos().unwrap();\n\n        let start_ptr = buf.as_ptr() as usize;\n        let vec3_ptr = vec3 as *const my_game::example::Vec3 as usize;\n\n        assert!(vec3_ptr > start_ptr);\n        // Vec3 is aligned to 8 wrt the flatbuffer.\n        assert_eq!((vec3_ptr - start_ptr) % 8, 0);\n    }\n\n    #[test]\n    fn struct_ability_is_8_bytes() {\n        assert_eq!(8, ::core::mem::size_of::<my_game::example::Ability>());\n    }\n\n    #[test]\n    fn struct_ability_is_written_with_correct_alignment_in_table_vector() {\n        let b = &mut flatbuffers::FlatBufferBuilder::new();\n        {\n            let name = b.create_string(\"foo\");\n            let v = b.create_vector(&[my_game::example::Ability::new(1, 2),\n                                      my_game::example::Ability::new(3, 4),\n                                      my_game::example::Ability::new(5, 6)]);\n            let mon = my_game::example::Monster::create(b, &my_game::example::MonsterArgs{\n                name: Some(name),\n                testarrayofsortedstruct: Some(v),\n                ..Default::default()});\n            my_game::example::finish_monster_buffer(b, mon);\n        }\n        let buf = b.finished_data();\n        let mon = my_game::example::root_as_monster(buf).unwrap();\n        let abilities = mon.testarrayofsortedstruct().unwrap();\n\n        let start_ptr = buf.as_ptr() as usize;\n        for a in abilities.iter() {\n            let a_ptr = a as *const my_game::example::Ability as usize;\n            assert!(a_ptr > start_ptr);\n            let aln = ::core::mem::align_of::<my_game::example::Ability>();\n            assert_eq!((a_ptr - start_ptr) % aln, 0);\n        }\n        for a in abilities.iter().rev() {\n            let a_ptr = a as *const my_game::example::Ability as usize;\n            assert!(a_ptr > start_ptr);\n            // Vec3 is aligned to 8 wrt the flatbuffer.\n            assert_eq!((a_ptr - start_ptr) % 8, 0);\n        }\n    }\n}\n\n#[cfg(not(miri))]\nquickcheck! {\n  fn struct_of_structs(\n    a_id: u32,\n    a_distance: u32,\n    b_a: i16,\n    b_b: i8,\n    c_id: u32,\n    c_distance: u32\n  ) -> bool {\n    use my_game::example::*;\n    let mut sos = StructOfStructs::default();\n    let mut a = Ability::default();\n    a.set_id(a_id);\n    a.set_distance(a_distance);\n    let mut b = Test::default();\n    b.set_a(b_a);\n    b.set_b(b_b);\n    let mut c = Ability::default();\n    c.set_id(c_id);\n    c.set_distance(c_distance);\n    sos.set_a(&a);\n    sos.set_b(&b);\n    sos.set_c(&c);\n\n    sos.a().id() == a_id &&\n    sos.a().distance() == a_distance &&\n    sos.b().a() == b_a &&\n    sos.b().b() == b_b &&\n    sos.c().id() == c_id &&\n    sos.c().distance() == c_distance\n  }\n}\n\n#[cfg(not(miri))]  // slow.\n#[cfg(test)]\nmod roundtrip_vectors {\n\n    #[cfg(test)]\n    mod scalar {\n        extern crate quickcheck;\n        extern crate flatbuffers;\n\n        use alloc::vec::Vec;\n\n        const N: u64 = 20;\n\n        fn prop<T>(xs: Vec<T>)\n        where\n            T: for<'a> flatbuffers::Follow<'a, Inner = T>\n                + flatbuffers::EndianScalar\n                + flatbuffers::Push\n                + ::core::fmt::Debug,\n        {\n            use flatbuffers::Follow;\n\n            let mut b = flatbuffers::FlatBufferBuilder::new();\n            b.start_vector::<T>(xs.len());\n            for i in (0..xs.len()).rev() {\n                b.push::<T>(xs[i]);\n            }\n            let vecend = b.end_vector::<T>(xs.len());\n            b.finish_minimal(vecend);\n\n            let buf = b.finished_data();\n\n            let got = unsafe { <flatbuffers::ForwardsUOffset<flatbuffers::Vector<T>>>::follow(&buf[..], 0) };\n            let mut result_vec: Vec<T> = Vec::with_capacity(got.len());\n            for i in 0..got.len() {\n                result_vec.push(got.get(i));\n            }\n            assert_eq!(result_vec, xs);\n\n            let rust_vec_iter = got.iter().collect::<Vec<T>>();\n            assert_eq!(rust_vec_iter, xs);\n\n            let mut rust_vec_rev_iter = got.iter().rev().collect::<Vec<T>>();\n            rust_vec_rev_iter.reverse();\n            assert_eq!(rust_vec_rev_iter, xs);\n        }\n\n        #[test]\n        fn easy_u8() {\n            prop::<u8>(vec![]);\n            prop::<u8>(vec![1u8]);\n            prop::<u8>(vec![1u8, 2u8]);\n            prop::<u8>(vec![1u8, 2u8, 3u8]);\n            prop::<u8>(vec![1u8, 2u8, 3u8, 4u8]);\n        }\n\n        #[test]\n        fn fuzz_bool() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop::<bool> as fn(Vec<_>)); }\n        #[test]\n        fn fuzz_u8() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop::<u8> as fn(Vec<_>)); }\n        #[test]\n        fn fuzz_i8() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop::<i8> as fn(Vec<_>)); }\n        #[test]\n        fn fuzz_u16() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop::<u16> as fn(Vec<_>)); }\n        #[test]\n        fn fuzz_i16() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop::<i16> as fn(Vec<_>)); }\n        #[test]\n        fn fuzz_u32() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop::<u32> as fn(Vec<_>)); }\n        #[test]\n        fn fuzz_i32() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop::<i32> as fn(Vec<_>)); }\n        #[test]\n        fn fuzz_u64() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop::<u64> as fn(Vec<_>)); }\n        #[test]\n        fn fuzz_i64() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop::<i64> as fn(Vec<_>)); }\n        #[test]\n        fn fuzz_f32() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop::<f32> as fn(Vec<_>)); }\n        #[test]\n        fn fuzz_f64() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop::<f64> as fn(Vec<_>)); }\n    }\n\n    #[cfg(test)]\n    mod string_manual_build {\n        #[cfg(not(miri))]  // slow.\n        extern crate quickcheck;\n        extern crate flatbuffers;\n\n        use alloc::string::String;\n        use alloc::vec::Vec;\n\n        fn prop(xs: Vec<String>) {\n            use flatbuffers::Follow;\n\n            let mut b = flatbuffers::FlatBufferBuilder::new();\n            let mut offsets = Vec::new();\n            for s in xs.iter().rev() {\n                offsets.push(b.create_string(s.as_str()));\n            }\n\n            b.start_vector::<flatbuffers::WIPOffset<&str>>(xs.len());\n            for &i in offsets.iter() {\n                b.push(i);\n            }\n            let vecend = b.end_vector::<flatbuffers::WIPOffset<&str>>(xs.len());\n\n            b.finish_minimal(vecend);\n\n            let buf = b.finished_data();\n            let got = unsafe { <flatbuffers::ForwardsUOffset<flatbuffers::Vector<flatbuffers::ForwardsUOffset<&str>>>>::follow(buf, 0) };\n\n            assert_eq!(got.len(), xs.len());\n            for i in 0..xs.len() {\n                assert_eq!(got.get(i), &xs[i][..]);\n            }\n        }\n\n        #[test]\n        fn fuzz() {\n            quickcheck::QuickCheck::new().max_tests(20).quickcheck(prop as fn(Vec<_>));\n        }\n    }\n\n    #[cfg(test)]\n    mod string_helper_build {\n        #[cfg(not(miri))]  // slow.\n        extern crate quickcheck;\n        extern crate flatbuffers;\n\n        use alloc::string::String;\n        use alloc::vec::Vec;\n\n        fn prop(input: Vec<String>) {\n            use flatbuffers::Follow;\n\n            let mut b = flatbuffers::FlatBufferBuilder::new();\n            let xs: Vec<_> = input.iter().map(|s: &String| b.create_string(s)).collect();\n            let vecend = b.create_vector(&xs);\n\n            b.finish_minimal(vecend);\n\n            let buf = b.finished_data();\n            let got = unsafe { <flatbuffers::ForwardsUOffset<flatbuffers::Vector<flatbuffers::ForwardsUOffset<&str>>>>::follow(buf, 0) };\n\n            assert_eq!(got.len(), xs.len());\n            for (idx, s) in input.iter().enumerate() {\n                assert_eq!(got.get(idx), s);\n            }\n        }\n\n        #[test]\n        fn fuzz() {\n            quickcheck::QuickCheck::new().max_tests(100).quickcheck(prop as fn(Vec<_>));\n        }\n    }\n\n    #[cfg(test)]\n    mod ubyte {\n        #[cfg(not(miri))]  // slow.\n        extern crate quickcheck;\n        extern crate flatbuffers;\n\n        use alloc::vec::Vec;\n\n        #[cfg(not(miri))]  // slow.\n        #[test]\n        fn fuzz_manual_build() {\n            fn prop(vec: Vec<u8>) {\n                let xs = &vec[..];\n\n                let mut b1 = flatbuffers::FlatBufferBuilder::new();\n                b1.start_vector::<u8>(xs.len());\n\n                for i in (0..xs.len()).rev() {\n                    b1.push(xs[i]);\n                }\n                b1.end_vector::<u8>(xs.len());\n\n                let mut b2 = flatbuffers::FlatBufferBuilder::new();\n                b2.create_vector(xs);\n                assert_eq!(b1.unfinished_data(), b2.unfinished_data());\n            }\n            quickcheck::QuickCheck::new().max_tests(100).quickcheck(prop as fn(Vec<_>));\n        }\n    }\n}\n\n#[cfg(test)]\nmod framing_format {\n    extern crate flatbuffers;\n\n    use super::my_game;\n\n    #[test]\n    fn test_size_prefixed_buffer() {\n        // Create size prefixed buffer.\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let args = &my_game::example::MonsterArgs{\n            mana: 200,\n            hp: 300,\n            name: Some(b.create_string(\"bob\")),\n            ..Default::default()\n        };\n        let mon = my_game::example::Monster::create(&mut b, &args);\n        b.finish_size_prefixed(mon, None);\n\n        // Access it.\n        let buf = b.finished_data();\n        let m = flatbuffers::size_prefixed_root::<my_game::example::Monster>(buf).unwrap();\n        assert_eq!(m.mana(), 200);\n        assert_eq!(m.hp(), 300);\n        assert_eq!(m.name(), \"bob\");\n    }\n}\n\n#[cfg(not(feature = \"no_std\"))]\n#[cfg(test)]\nmod roundtrip_table {\n    use alloc::string::String;\n    use alloc::vec::Vec;\n    use std::collections::HashMap;\n\n    extern crate flatbuffers;\n    #[cfg(not(miri))]  // slow.\n    extern crate quickcheck;\n\n    use super::LCG;\n\n    #[test]\n    #[cfg(not(miri))]  // slow.\n    fn table_of_mixed_scalars_fuzz() {\n        // Values we're testing against: chosen to ensure no bits get chopped\n        // off anywhere, and also be different from eachother.\n        let bool_val: bool = true;\n        let char_val: i8 = -127;  // 0x81\n        let uchar_val: u8 = 0xFF;\n        let short_val: i16 = -32222;  // 0x8222;\n        let ushort_val: u16 = 0xFEEE;\n        let int_val: i32 = unsafe { ::core::mem::transmute(0x83333333u32) };\n        let uint_val: u32 = 0xFDDDDDDD;\n        let long_val: i64 = unsafe { ::core::mem::transmute(0x8444444444444444u64) }; // TODO: byte literal?\n        let ulong_val: u64 = 0xFCCCCCCCCCCCCCCCu64;\n        let float_val: f32 = 3.14159;\n        let double_val: f64 = 3.14159265359;\n\n        let test_value_types_max: isize = 11;\n        let max_fields_per_object: flatbuffers::VOffsetT = 100;\n        let num_fuzz_objects: isize = 1000;  // The higher, the more thorough :)\n\n        let mut builder = flatbuffers::FlatBufferBuilder::new();\n        let mut lcg = LCG::new();\n\n        let mut objects: Vec<flatbuffers::UOffsetT> = vec![0; num_fuzz_objects as usize];\n\n        // Generate num_fuzz_objects random objects each consisting of\n        // fields_per_object fields, each of a random type.\n        for i in 0..(num_fuzz_objects as usize) {\n            let fields_per_object = (lcg.next() % (max_fields_per_object as u64)) as flatbuffers::VOffsetT;\n            let start = builder.start_table();\n\n            for j in 0..fields_per_object {\n                let choice = lcg.next() % (test_value_types_max as u64);\n\n                let f = flatbuffers::field_index_to_field_offset(j);\n\n                match choice {\n                    0 => {builder.push_slot::<bool>(f, bool_val, false);}\n                    1 => {builder.push_slot::<i8>(f, char_val, 0);}\n                    2 => {builder.push_slot::<u8>(f, uchar_val, 0);}\n                    3 => {builder.push_slot::<i16>(f, short_val, 0);}\n                    4 => {builder.push_slot::<u16>(f, ushort_val, 0);}\n                    5 => {builder.push_slot::<i32>(f, int_val, 0);}\n                    6 => {builder.push_slot::<u32>(f, uint_val, 0);}\n                    7 => {builder.push_slot::<i64>(f, long_val, 0);}\n                    8 => {builder.push_slot::<u64>(f, ulong_val, 0);}\n                    9 => {builder.push_slot::<f32>(f, float_val, 0.0);}\n                    10 => {builder.push_slot::<f64>(f, double_val, 0.0);}\n                    _ => { panic!(\"unknown choice: {}\", choice); }\n                }\n            }\n            objects[i] = builder.end_table(start).value();\n        }\n\n        // Do some bookkeeping to generate stats on fuzzes:\n        let mut stats: HashMap<u64, u64> = HashMap::new();\n        let mut values_generated: u64 = 0;\n\n        // Embrace PRNG determinism:\n        lcg.reset();\n\n        // Test that all objects we generated are readable and return the\n        // expected values. We generate random objects in the same order\n        // so this is deterministic:\n        for i in 0..(num_fuzz_objects as usize) {\n            let table = {\n                let buf = builder.unfinished_data();\n                let loc = buf.len() as flatbuffers::UOffsetT - objects[i];\n                unsafe { flatbuffers::Table::new(buf, loc as usize) }\n            };\n\n            let fields_per_object = (lcg.next() % (max_fields_per_object as u64)) as flatbuffers::VOffsetT;\n            for j in 0..fields_per_object {\n                let choice = lcg.next() % (test_value_types_max as u64);\n\n                *stats.entry(choice).or_insert(0) += 1;\n                values_generated += 1;\n\n                let f = flatbuffers::field_index_to_field_offset(j);\n\n                unsafe {\n                    match choice {\n                        0 => { assert_eq!(bool_val, table.get::<bool>(f, Some(false)).unwrap()); }\n                        1 => { assert_eq!(char_val, table.get::<i8>(f, Some(0)).unwrap()); }\n                        2 => { assert_eq!(uchar_val, table.get::<u8>(f, Some(0)).unwrap()); }\n                        3 => { assert_eq!(short_val, table.get::<i16>(f, Some(0)).unwrap()); }\n                        4 => { assert_eq!(ushort_val, table.get::<u16>(f, Some(0)).unwrap()); }\n                        5 => { assert_eq!(int_val, table.get::<i32>(f, Some(0)).unwrap()); }\n                        6 => { assert_eq!(uint_val, table.get::<u32>(f, Some(0)).unwrap()); }\n                        7 => { assert_eq!(long_val, table.get::<i64>(f, Some(0)).unwrap()); }\n                        8 => { assert_eq!(ulong_val, table.get::<u64>(f, Some(0)).unwrap()); }\n                        9 => { assert_eq!(float_val, table.get::<f32>(f, Some(0.0)).unwrap()); }\n                        10 => { assert_eq!(double_val, table.get::<f64>(f, Some(0.0)).unwrap()); }\n                        _ => { panic!(\"unknown choice: {}\", choice); }\n                    }\n                }\n            }\n        }\n\n        // Assert that we tested all the fuzz cases enough:\n        let min_tests_per_choice = 1000;\n        assert!(values_generated > 0);\n        assert!(min_tests_per_choice > 0);\n        for i in 0..test_value_types_max as u64 {\n            assert!(stats[&i] >= min_tests_per_choice, \"inadequately-tested fuzz case: {}\", i);\n        }\n    }\n\n    #[test]\n    #[cfg(not(miri))]  // slow.\n    fn table_of_byte_strings_fuzz() {\n        fn prop(vec: Vec<Vec<u8>>) {\n            use flatbuffers::field_index_to_field_offset as fi2fo;\n            use flatbuffers::Follow;\n\n            let xs = &vec[..];\n\n            // build\n            let mut b = flatbuffers::FlatBufferBuilder::new();\n            let str_offsets: Vec<flatbuffers::WIPOffset<_>> = xs.iter().map(|s| b.create_byte_string(&s[..])).collect();\n            let table_start = b.start_table();\n\n            for i in 0..xs.len() {\n                b.push_slot_always(fi2fo(i as flatbuffers::VOffsetT), str_offsets[i]);\n            }\n            let root = b.end_table(table_start);\n            b.finish_minimal(root);\n\n            // use\n            let buf = b.finished_data();\n            let tab = unsafe { <flatbuffers::ForwardsUOffset<flatbuffers::Table>>::follow(buf, 0) };\n\n            for i in 0..xs.len() {\n                let v = unsafe { tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<u8>>>(fi2fo(i as flatbuffers::VOffsetT), None) };\n                assert!(v.is_some());\n                let v2 = v.unwrap();\n                assert_eq!(v2.bytes(), &xs[i]);\n            }\n        }\n        prop(vec![vec![1,2,3]]);\n\n        let n = 20;\n        quickcheck::QuickCheck::new().max_tests(n).quickcheck(prop as fn(Vec<_>));\n    }\n\n    #[test]\n    #[cfg(not(miri))]  // slow.\n    fn fuzz_table_of_strings() {\n        fn prop(vec: Vec<String>) {\n            use flatbuffers::field_index_to_field_offset as fi2fo;\n            use flatbuffers::Follow;\n\n            let xs = &vec[..];\n\n            // build\n            let mut b = flatbuffers::FlatBufferBuilder::new();\n            let str_offsets: Vec<flatbuffers::WIPOffset<_>> = xs.iter().map(|s| b.create_string(&s[..])).collect();\n            let table_start = b.start_table();\n\n            for i in 0..xs.len() {\n                b.push_slot_always(fi2fo(i as flatbuffers::VOffsetT), str_offsets[i]);\n            }\n            let root = b.end_table(table_start);\n            b.finish_minimal(root);\n\n            // use\n            let buf = b.finished_data();\n            let tab = unsafe { <flatbuffers::ForwardsUOffset<flatbuffers::Table>>::follow(buf, 0) };\n\n            for i in 0..xs.len() {\n                let v = unsafe { tab.get::<flatbuffers::ForwardsUOffset<&str>>(fi2fo(i as flatbuffers::VOffsetT), None) };\n                assert_eq!(v, Some(&xs[i][..]));\n            }\n        }\n        let n = 20;\n        quickcheck::QuickCheck::new().max_tests(n).quickcheck(prop as fn(Vec<String>));\n    }\n\n    #[cfg(not(miri))]  // slow.\n    mod table_of_vectors_of_scalars {\n\n        use alloc::vec::Vec;\n\n        extern crate flatbuffers;\n        #[cfg(not(miri))]  // slow.\n        extern crate quickcheck;\n\n        const N: u64 = 20;\n\n        fn prop<T>(vecs: Vec<Vec<T>>)\n        where\n            T: for<'a> flatbuffers::Follow<'a, Inner = T>\n                + flatbuffers::EndianScalar\n                + flatbuffers::Push\n                + ::core::fmt::Debug,\n        {\n            use flatbuffers::field_index_to_field_offset as fi2fo;\n            use flatbuffers::Follow;\n\n            // build\n            let mut b = flatbuffers::FlatBufferBuilder::new();\n            let mut offs = vec![];\n            for vec in &vecs {\n                b.start_vector::<T>(vec.len());\n\n                let xs = &vec[..];\n                for i in (0..xs.len()).rev() {\n                    b.push::<T>(xs[i]);\n                }\n                let vecend = b.end_vector::<T>(xs.len());\n                offs.push(vecend);\n            }\n\n            let table_start = b.start_table();\n\n            for i in 0..vecs.len() {\n                b.push_slot_always(fi2fo(i as flatbuffers::VOffsetT), offs[i]);\n            }\n            let root = b.end_table(table_start);\n            b.finish_minimal(root);\n\n            // use\n            let buf = b.finished_data();\n            let tab = unsafe { <flatbuffers::ForwardsUOffset<flatbuffers::Table>>::follow(buf, 0) };\n\n            for i in 0..vecs.len() {\n                let got = unsafe { tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<T>>>(fi2fo(i as flatbuffers::VOffsetT), None) };\n                assert!(got.is_some());\n                let got2 = got.unwrap();\n                let mut got3: Vec<T> = Vec::with_capacity(got2.len());\n                for i in 0..got2.len() {\n                    got3.push(got2.get(i));\n                }\n                assert_eq!(vecs[i], got3);\n            }\n        }\n\n        #[test]\n        fn fuzz_bool() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop as fn(Vec<Vec<bool>>)); }\n\n        #[test]\n        fn fuzz_u8() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop as fn(Vec<Vec<u8>>)); }\n        #[test]\n        fn fuzz_u16() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop as fn(Vec<Vec<u16>>)); }\n        #[test]\n        fn fuzz_u32() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop as fn(Vec<Vec<u32>>)); }\n        #[test]\n        fn fuzz_u64() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop as fn(Vec<Vec<u64>>)); }\n\n        #[test]\n        fn fuzz_i8() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop as fn(Vec<Vec<u8>>)); }\n        #[test]\n        fn fuzz_i16() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop as fn(Vec<Vec<u16>>)); }\n        #[test]\n        fn fuzz_i32() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop as fn(Vec<Vec<u32>>)); }\n        #[test]\n        fn fuzz_i64() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop as fn(Vec<Vec<u64>>)); }\n\n        #[test]\n        fn fuzz_f32() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop as fn(Vec<Vec<f32>>)); }\n        #[test]\n        fn fuzz_f64() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop as fn(Vec<Vec<f64>>)); }\n    }\n}\n\n#[cfg(not(miri))]  // slow.\n#[cfg(test)]\nmod roundtrip_scalars {\n    extern crate flatbuffers;\n    #[cfg(not(miri))]  // slow.\n    extern crate quickcheck;\n\n    const N: u64 = 1000;\n\n    fn prop<T: PartialEq + ::core::fmt::Debug + Copy + flatbuffers::EndianScalar>(x: T) {\n        let mut buf = vec![0u8; ::core::mem::size_of::<T>()];\n        let y = unsafe {\n            flatbuffers::emplace_scalar(&mut buf[..], x);\n            flatbuffers::read_scalar(&buf[..])\n        };\n        assert_eq!(x, y);\n    }\n\n    #[test]\n    fn fuzz_bool() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop::<bool> as fn(_)); }\n    #[test]\n    fn fuzz_u8() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop::<u8> as fn(_)); }\n    #[test]\n    fn fuzz_i8() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop::<i8> as fn(_)); }\n\n    #[test]\n    fn fuzz_u16() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop::<u16> as fn(_)); }\n    #[test]\n    fn fuzz_i16() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop::<i16> as fn(_)); }\n\n    #[test]\n    fn fuzz_u32() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop::<u32> as fn(_)); }\n    #[test]\n    fn fuzz_i32() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop::<i32> as fn(_)); }\n\n    #[test]\n    fn fuzz_u64() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop::<u64> as fn(_)); }\n    #[test]\n    fn fuzz_i64() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop::<i64> as fn(_)); }\n\n    #[test]\n    fn fuzz_f32() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop::<f32> as fn(_)); }\n    #[test]\n    fn fuzz_f64() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop::<f64> as fn(_)); }\n}\n\n#[cfg(test)]\n#[cfg(not(miri))]  // slow.\nmod roundtrip_push_follow_scalars {\n    extern crate flatbuffers;\n    #[cfg(not(miri))]  // slow.\n    extern crate quickcheck;\n\n    use flatbuffers::Push;\n\n    const N: u64 = 1000;\n\n    // This uses a macro because lifetimes for a trait-bounded function get too\n    // complicated.\n    macro_rules! impl_prop {\n        ($fn_name:ident, $ty:ident) => (\n            fn $fn_name(x: $ty) {\n                let mut buf = vec![0u8; ::core::mem::size_of::<$ty>()];\n                unsafe { x.push(&mut buf[..], 0) };\n                let fs: flatbuffers::FollowStart<$ty> = flatbuffers::FollowStart::new();\n                assert_eq!(unsafe { fs.self_follow(&buf[..], 0) }, x);\n            }\n        )\n    }\n\n    impl_prop!(prop_bool, bool);\n    impl_prop!(prop_u8, u8);\n    impl_prop!(prop_i8, i8);\n    impl_prop!(prop_u16, u16);\n    impl_prop!(prop_i16, i16);\n    impl_prop!(prop_u32, u32);\n    impl_prop!(prop_i32, i32);\n    impl_prop!(prop_u64, u64);\n    impl_prop!(prop_i64, i64);\n    impl_prop!(prop_f32, f32);\n    impl_prop!(prop_f64, f64);\n\n    #[test]\n    fn fuzz_bool() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop_bool as fn(bool)); }\n    #[test]\n    fn fuzz_u8() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop_u8 as fn(u8)); }\n    #[test]\n    fn fuzz_i8() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop_i8 as fn(i8)); }\n    #[test]\n    fn fuzz_u16() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop_u16 as fn(u16)); }\n    #[test]\n    fn fuzz_i16() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop_i16 as fn(i16)); }\n    #[test]\n    fn fuzz_u32() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop_u32 as fn(u32)); }\n    #[test]\n    fn fuzz_i32() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop_i32 as fn(i32)); }\n    #[test]\n    fn fuzz_u64() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop_u64 as fn(u64)); }\n    #[test]\n    fn fuzz_i64() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop_i64 as fn(i64)); }\n    #[test]\n    fn fuzz_f32() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop_f32 as fn(f32)); }\n    #[test]\n    fn fuzz_f64() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop_f64 as fn(f64)); }\n}\n\n\n#[cfg(test)]\nmod write_and_read_examples {\n    extern crate flatbuffers;\n\n    use super::create_serialized_example_with_library_code;\n    use super::create_serialized_example_with_generated_code;\n    use super::serialized_example_is_accessible_and_correct;\n\n    #[test]\n    fn generated_code_creates_correct_example() {\n        let b = &mut flatbuffers::FlatBufferBuilder::new();\n        create_serialized_example_with_generated_code(b);\n        let buf = b.finished_data();\n        serialized_example_is_accessible_and_correct(&buf[..], true, false).unwrap();\n    }\n\n    #[test]\n    fn generated_code_debug_prints_correctly() {\n        let b = &mut flatbuffers::FlatBufferBuilder::new();\n        create_serialized_example_with_generated_code(b);\n        let buf = b.finished_data();\n        serialized_example_is_accessible_and_correct(&buf, true, false).unwrap();\n        let m = super::my_game::example::root_as_monster(buf).unwrap();\n        assert_eq!(\n            format!(\"{:.5?}\", &m),\n            \"Monster { pos: Some(Vec3 { x: 1.00000, y: 2.00000, z: 3.00000, \\\n            test1: 3.00000, test2: Color(Green), test3: Test { a: 5, b: 6 } \\\n            }), mana: 150, hp: 80, name: \\\"MyMonster\\\", inventory: Some([0, 1, \\\n            2, 3, 4]), color: Color(Blue), test_type: Monster, test: Monster { \\\n            pos: None, mana: 150, hp: 100, name: \\\"Fred\\\", inventory: None, \\\n            color: Color(Blue), test_type: NONE, test: None, test4: None, \\\n            testarrayofstring: None, testarrayoftables: None, enemy: None, \\\n            testnestedflatbuffer: None, testempty: None, testbool: false, \\\n            testhashs32_fnv1: 0, testhashu32_fnv1: 0, testhashs64_fnv1: 0, \\\n            testhashu64_fnv1: 0, testhashs32_fnv1a: 0, testhashu32_fnv1a: 0, \\\n            testhashs64_fnv1a: 0, testhashu64_fnv1a: 0, testarrayofbools: \\\n            None, testf: 3.14159, testf2: 3.00000, testf3: 0.00000, \\\n            testarrayofstring2: None, testarrayofsortedstruct: None, flex: \\\n            None, test5: None, vector_of_longs: None, vector_of_doubles: None, \\\n            parent_namespace_test: None, vector_of_referrables: None, \\\n            single_weak_reference: 0, vector_of_weak_references: None, \\\n            vector_of_strong_referrables: None, co_owning_reference: 0, \\\n            vector_of_co_owning_references: None, non_owning_reference: 0, \\\n            vector_of_non_owning_references: None, any_unique_type: NONE, \\\n            any_unique: None, any_ambiguous_type: NONE, any_ambiguous: None, \\\n            vector_of_enums: None, signed_enum: None, \\\n            testrequirednestedflatbuffer: None, scalar_key_sorted_tables: \\\n            None, native_inline: None, long_enum_non_enum_default: \\\n            LongEnum(0x0), long_enum_normal_default: LongEnum(LongOne), \\\n            nan_default: NaN, inf_default: inf, positive_inf_default: inf, \\\n            infinity_default: inf, positive_infinity_default: inf, \\\n            negative_inf_default: -inf, negative_infinity_default: -inf, \\\n            double_inf_default: inf }, test4: Some([Test { a: 10, b: 20 }, \\\n            Test { a: 30, b: 40 }]), testarrayofstring: Some([\\\"test1\\\", \\\n            \\\"test2\\\"]), testarrayoftables: None, enemy: None, \\\n            testnestedflatbuffer: None, testempty: None, testbool: false, \\\n            testhashs32_fnv1: 0, testhashu32_fnv1: 0, testhashs64_fnv1: 0, \\\n            testhashu64_fnv1: 0, testhashs32_fnv1a: 0, testhashu32_fnv1a: 0, \\\n            testhashs64_fnv1a: 0, testhashu64_fnv1a: 0, testarrayofbools: \\\n            None, testf: 3.14159, testf2: 3.00000, testf3: 0.00000, \\\n            testarrayofstring2: None, testarrayofsortedstruct: None, flex: \\\n            None, test5: None, vector_of_longs: None, vector_of_doubles: None, \\\n            parent_namespace_test: None, vector_of_referrables: None, \\\n            single_weak_reference: 0, vector_of_weak_references: None, \\\n            vector_of_strong_referrables: None, co_owning_reference: 0, \\\n            vector_of_co_owning_references: None, non_owning_reference: 0, \\\n            vector_of_non_owning_references: None, any_unique_type: NONE, \\\n            any_unique: None, any_ambiguous_type: NONE, any_ambiguous: None, \\\n            vector_of_enums: None, signed_enum: None, \\\n            testrequirednestedflatbuffer: None, scalar_key_sorted_tables: \\\n            None, native_inline: None, long_enum_non_enum_default: \\\n            LongEnum(0x0), long_enum_normal_default: LongEnum(LongOne), \\\n            nan_default: NaN, inf_default: inf, positive_inf_default: inf, \\\n            infinity_default: inf, positive_infinity_default: inf, \\\n            negative_inf_default: -inf, negative_infinity_default: -inf, \\\n            double_inf_default: inf }\"\n        );\n    }\n\n    #[test]\n    #[cfg(not(miri))]  // slow.\n    fn generated_code_creates_correct_example_repeatedly_with_reset() {\n        let b = &mut flatbuffers::FlatBufferBuilder::new();\n        for _ in 0..100 {\n            create_serialized_example_with_generated_code(b);\n            {\n                let buf = b.finished_data();\n                serialized_example_is_accessible_and_correct(&buf[..], true, false).unwrap();\n            }\n            b.reset();\n        }\n    }\n\n    #[test]\n    fn library_code_creates_correct_example() {\n        let b = &mut flatbuffers::FlatBufferBuilder::new();\n        create_serialized_example_with_library_code(b);\n        let buf = b.finished_data();\n        serialized_example_is_accessible_and_correct(&buf[..], true, false).unwrap();\n    }\n\n    #[test]\n    #[cfg(not(miri))]  // slow.\n    fn library_code_creates_correct_example_repeatedly_with_reset() {\n        let b = &mut flatbuffers::FlatBufferBuilder::new();\n        for _ in 0..100 {\n            create_serialized_example_with_library_code(b);\n            {\n                let buf = b.finished_data();\n                serialized_example_is_accessible_and_correct(&buf[..], true, false).unwrap();\n            }\n            b.reset();\n        }\n    }\n}\n\n#[cfg(not(feature = \"no_std\"))]\n#[cfg(test)]\nmod read_examples_from_other_language_ports {\n    extern crate flatbuffers;\n\n    use std::println;\n\n    use super::load_file;\n    use super::serialized_example_is_accessible_and_correct;\n\n    #[test]\n    fn gold_cpp_example_data_is_accessible_and_correct() {\n        let buf = load_file(\"../monsterdata_test.mon\").expect(\"missing monsterdata_test.mon\");\n        serialized_example_is_accessible_and_correct(&buf[..], true, false).unwrap();\n    }\n    #[test]\n    fn java_wire_example_data_is_accessible_and_correct() {\n        let buf = load_file(\"../monsterdata_java_wire.mon\");\n        if buf.is_err() {\n            println!(\"skipping java wire test because it is not present\");\n            return;\n        }\n        let buf = buf.unwrap();\n        serialized_example_is_accessible_and_correct(&buf[..], true, false).unwrap();\n    }\n    #[test]\n    fn java_wire_size_prefixed_example_data_is_accessible_and_correct() {\n        let buf = load_file(\"../monsterdata_java_wire_sp.mon\");\n        if buf.is_err() {\n            println!(\"skipping java wire test because it is not present\");\n            return;\n        }\n        let buf = buf.unwrap();\n        serialized_example_is_accessible_and_correct(&buf[..], true, true).unwrap();\n    }\n}\n\n#[cfg(test)]\nmod generated_code_asserts {\n    extern crate flatbuffers;\n\n    use super::my_game;\n\n    #[test]\n    #[should_panic]\n    fn monster_builder_fails_when_name_is_missing() {\n        let b = &mut flatbuffers::FlatBufferBuilder::new();\n        my_game::example::Monster::create(b, &my_game::example::MonsterArgs{..Default::default()});\n    }\n}\n\n#[cfg(test)]\nmod generated_key_comparisons {\n    extern crate flatbuffers;\n\n    use super::my_game;\n\n    #[test]\n    fn struct_ability_key_compare_less_than() {\n        let a = my_game::example::Ability::new(1, 2);\n        let b = my_game::example::Ability::new(2, 1);\n        let c = my_game::example::Ability::new(3, 3);\n\n        assert_eq!(a.key_compare_less_than(&a), false);\n        assert_eq!(b.key_compare_less_than(&b), false);\n        assert_eq!(c.key_compare_less_than(&c), false);\n\n        assert_eq!(a.key_compare_less_than(&b), true);\n        assert_eq!(a.key_compare_less_than(&c), true);\n\n        assert_eq!(b.key_compare_less_than(&a), false);\n        assert_eq!(b.key_compare_less_than(&c), true);\n\n        assert_eq!(c.key_compare_less_than(&a), false);\n        assert_eq!(c.key_compare_less_than(&b), false);\n    }\n\n    #[test]\n    fn struct_key_compare_with_value() {\n        let a = my_game::example::Ability::new(1, 2);\n\n        assert_eq!(a.key_compare_with_value(0), ::core::cmp::Ordering::Greater);\n        assert_eq!(a.key_compare_with_value(1), ::core::cmp::Ordering::Equal);\n        assert_eq!(a.key_compare_with_value(2), ::core::cmp::Ordering::Less);\n    }\n\n    #[test]\n    fn struct_key_compare_less_than() {\n        let a = my_game::example::Ability::new(1, 2);\n        let b = my_game::example::Ability::new(2, 1);\n        let c = my_game::example::Ability::new(3, 3);\n\n        assert_eq!(a.key_compare_less_than(&a), false);\n        assert_eq!(b.key_compare_less_than(&b), false);\n        assert_eq!(c.key_compare_less_than(&c), false);\n\n        assert_eq!(a.key_compare_less_than(&b), true);\n        assert_eq!(a.key_compare_less_than(&c), true);\n\n        assert_eq!(b.key_compare_less_than(&a), false);\n        assert_eq!(b.key_compare_less_than(&c), true);\n\n        assert_eq!(c.key_compare_less_than(&a), false);\n        assert_eq!(c.key_compare_less_than(&b), false);\n    }\n\n    #[test]\n    fn table_key_compare_with_value() {\n        // setup\n        let builder = &mut flatbuffers::FlatBufferBuilder::new();\n        super::create_serialized_example_with_library_code(builder);\n        let buf = builder.finished_data();\n        let a = my_game::example::root_as_monster(buf).unwrap();\n\n        // preconditions\n        assert_eq!(a.name(), \"MyMonster\");\n\n        assert_eq!(a.key_compare_with_value(\"AAA\"), ::core::cmp::Ordering::Greater);\n        assert_eq!(a.key_compare_with_value(\"MyMonster\"), ::core::cmp::Ordering::Equal);\n        assert_eq!(a.key_compare_with_value(\"ZZZ\"), ::core::cmp::Ordering::Less);\n    }\n\n    #[test]\n    fn table_key_compare_less_than() {\n        // setup\n        let builder = &mut flatbuffers::FlatBufferBuilder::new();\n        super::create_serialized_example_with_library_code(builder);\n        let buf = builder.finished_data();\n        let a = my_game::example::root_as_monster(buf).unwrap();\n        let b = a.test_as_monster().unwrap();\n\n        // preconditions\n        assert_eq!(a.name(), \"MyMonster\");\n        assert_eq!(b.name(), \"Fred\");\n\n        assert_eq!(a.key_compare_less_than(&a), false);\n        assert_eq!(a.key_compare_less_than(&b), false);\n\n        assert_eq!(b.key_compare_less_than(&a), true);\n        assert_eq!(b.key_compare_less_than(&b), false);\n    }\n}\n\n#[cfg(test)]\nmod included_schema_generated_code {\n\n    #[test]\n    #[allow(unused_imports)]\n    fn namespace_test_mod_is_importable() {\n        use super::namespace_test_generated::{\n            namespace_a,\n            namespace_a::namespace_b,\n            namespace_c,\n        };\n\n    }\n}\n\n#[cfg(test)]\nmod builder_asserts {\n    extern crate flatbuffers;\n\n    #[test]\n    #[should_panic]\n    fn end_table_should_panic_when_not_in_table() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        b.end_table(flatbuffers::WIPOffset::new(0));\n    }\n\n    #[test]\n    #[should_panic]\n    fn create_string_should_panic_when_in_table() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        b.start_table();\n        b.create_string(\"foo\");\n    }\n\n    #[test]\n    #[should_panic]\n    fn create_byte_string_should_panic_when_in_table() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        b.start_table();\n        b.create_byte_string(b\"foo\");\n    }\n\n    #[test]\n    #[should_panic]\n    fn push_struct_slot_should_panic_when_not_in_table() {\n        #[derive(Copy, Clone, Debug, PartialEq)]\n        #[repr(C, packed)]\n        struct foo { }\n        impl<'b> flatbuffers::Push for &'b foo {\n            type Output = foo;\n            unsafe fn push<'a>(&'a self, _dst: &'a mut [u8], _written_len: usize) { }\n        }\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        b.push_slot_always(0, &foo{});\n    }\n\n    #[test]\n    #[should_panic]\n    fn finished_bytes_should_panic_when_table_is_not_finished() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        b.start_table();\n        b.finished_data();\n    }\n\n    #[test]\n    #[should_panic]\n    fn required_panics_when_field_not_set() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let start = b.start_table();\n        let o = b.end_table(start);\n        b.required(o, 4 /* byte offset to first field */, \"test field\");\n    }\n}\n\n#[cfg(test)]\nmod follow_impls {\n    extern crate flatbuffers;\n    use flatbuffers::Follow;\n    use flatbuffers::field_index_to_field_offset as fi2fo;\n\n    use alloc::vec::Vec;\n\n    // Define a test struct to use in a few tests. This replicates the work that the code generator\n    // would normally do when defining a FlatBuffer struct. For reference, compare the following\n    // `FooStruct` code with the code generated for the `Vec3` struct in\n    // `../../monster_test/mod.rs`.\n    use flatbuffers::EndianScalar;\n    #[derive(Copy, Clone, Debug, PartialEq)]\n    #[repr(C, packed)]\n    struct FooStruct {\n        a: i8,\n        b: u8,\n        c: i16,\n    }\n    impl FooStruct {\n        fn new(_a: i8, _b: u8, _c: i16) -> Self {\n            FooStruct {\n                a: _a.to_little_endian(),\n                b: _b.to_little_endian(),\n                c: _c.to_little_endian(),\n            }\n        }\n    }\n    impl<'a> flatbuffers::Follow<'a> for FooStruct {\n        type Inner = &'a FooStruct;\n        #[inline(always)]\n        unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n            <&'a FooStruct>::follow(buf, loc)\n        }\n    }\n    impl<'a> flatbuffers::Follow<'a> for &'a FooStruct {\n        type Inner = &'a FooStruct;\n        #[inline(always)]\n        unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {\n            flatbuffers::follow_cast_ref::<FooStruct>(buf, loc)\n        }\n    }\n\n    #[test]\n    fn to_u8() {\n        let vec: Vec<u8> = vec![255, 3];\n        let fs: flatbuffers::FollowStart<u8> = flatbuffers::FollowStart::new();\n        assert_eq!(unsafe { fs.self_follow(&vec[..], 1) }, 3);\n    }\n\n    #[test]\n    fn to_u16() {\n        let vec: Vec<u8> = vec![255, 255, 3, 4];\n        let fs: flatbuffers::FollowStart<u16> = flatbuffers::FollowStart::new();\n        assert_eq!(unsafe { fs.self_follow(&vec[..], 2) }, 1027);\n    }\n\n    #[test]\n    fn to_f32() {\n        let vec: Vec<u8> = vec![255, 255, 255, 255, /* start of value */ 208, 15, 73, 64];\n        let fs: flatbuffers::FollowStart<f32> = flatbuffers::FollowStart::new();\n        assert_eq!(unsafe { fs.self_follow(&vec[..], 4) }, 3.14159);\n    }\n\n    #[test]\n    fn to_string() {\n        let vec: Vec<u8> = vec![255,255,255,255, 3, 0, 0, 0, 'f' as u8, 'o' as u8, 'o' as u8, 0];\n        let off: flatbuffers::FollowStart<&str> = flatbuffers::FollowStart::new();\n        assert_eq!(unsafe { off.self_follow(&vec[..], 4) }, \"foo\");\n    }\n\n    #[test]\n    fn to_byte_slice() {\n        let vec: Vec<u8> = vec![255, 255, 255, 255, 4, 0, 0, 0, 1, 2, 3, 4];\n        let off: flatbuffers::FollowStart<flatbuffers::Vector<u8>> = flatbuffers::FollowStart::new();\n        assert_eq!(unsafe { off.self_follow(&vec[..], 4).bytes() }, &[1, 2, 3, 4][..]);\n    }\n\n    #[test]\n    fn to_vector_of_u16() {\n        let vec: Vec<u8> = vec![255, 255, 255, 255, 2, 0, 0, 0, 1, 2, 3, 4];\n        let off: flatbuffers::FollowStart<flatbuffers::Vector<u16>> = flatbuffers::FollowStart::new();\n        assert_eq!(unsafe { off.self_follow(&vec[..], 4).len() }, 2);\n        assert_eq!(unsafe { off.self_follow(&vec[..], 4).get(0) }, 513);\n        assert_eq!(unsafe { off.self_follow(&vec[..], 4).get(1) }, 1027);\n    }\n\n    #[test]\n    fn to_struct() {\n        let vec: Vec<u8> = vec![255, 255, 255, 255, 1, 2, 3, 4];\n        let off: flatbuffers::FollowStart<&FooStruct> = flatbuffers::FollowStart::new();\n        assert_eq!(unsafe { *off.self_follow(&vec[..], 4) }, FooStruct::new(1, 2, 1027));\n    }\n\n    #[test]\n    fn to_vector_of_offset_to_string_elements() {\n        let buf: Vec<u8> = vec![/* vec len */ 1, 0, 0, 0, /* offset to string */ 4, 0, 0, 0, /* str length */ 3, 0, 0, 0, 'f' as u8, 'o' as u8, 'o' as u8, 0];\n        let s: flatbuffers::FollowStart<flatbuffers::Vector<flatbuffers::ForwardsUOffset<&str>>> = flatbuffers::FollowStart::new();\n        assert_eq!(unsafe {s.self_follow(&buf[..], 0).len() }, 1);\n        assert_eq!(unsafe { s.self_follow(&buf[..], 0).get(0) }, \"foo\");\n    }\n\n    #[test]\n    fn to_vector_of_struct_elements() {\n        let buf: Vec<u8> = vec![1, 0, 0, 0, /* struct data */ 1, 2, 3, 4];\n        let fs: flatbuffers::FollowStart<flatbuffers::Vector<FooStruct>> = flatbuffers::FollowStart::new();\n        assert_eq!(unsafe { fs.self_follow(&buf[..], 0).len() }, 1);\n        assert_eq!(unsafe { fs.self_follow(&buf[..], 0).get(0) }, &FooStruct::new(1, 2, 1027));\n    }\n\n    #[test]\n    fn to_root_to_empty_table() {\n        let buf: Vec<u8> = vec![\n            12, 0, 0, 0, // offset to root table\n            // enter vtable\n            4, 0, // vtable len\n            0, 0, // inline size\n            255, 255, 255, 255, // canary\n            // enter table\n            8, 0, 0, 0, // vtable location\n        ];\n        unsafe {\n            let fs: flatbuffers::FollowStart<flatbuffers::ForwardsUOffset<flatbuffers::Table>> = flatbuffers::FollowStart::new();\n            assert_eq!(fs.self_follow(&buf[..], 0), flatbuffers::Table::new(&buf[..], 12));\n        }\n    }\n\n    #[test]\n    fn to_root_table_get_slot_scalar_u8() {\n        let buf: Vec<u8> = vec![\n            14, 0, 0, 0, // offset to root table\n            // enter vtable\n            6, 0, // vtable len\n            2, 0, // inline size\n            5, 0, // value loc\n            255, 255, 255, 255, // canary\n            // enter table\n            10, 0, 0, 0, // vtable location\n            0, 99 // value (with padding)\n        ];\n        unsafe {\n            let fs: flatbuffers::FollowStart<flatbuffers::ForwardsUOffset<flatbuffers::Table>> = flatbuffers::FollowStart::new();\n            let tab = fs.self_follow(&buf[..], 0);\n            assert_eq!(tab.get::<u8>(fi2fo(0), Some(123)), Some(99));\n        }\n    }\n\n    #[test]\n    fn to_root_to_table_get_slot_scalar_u8_default_via_vtable_len() {\n        let buf: Vec<u8> = vec![\n            12, 0, 0, 0, // offset to root table\n            // enter vtable\n            4, 0, // vtable len\n            2, 0, // inline size\n            255, 255, 255, 255, // canary\n            // enter table\n            8, 0, 0, 0, // vtable location\n        ];\n        unsafe {\n            let fs: flatbuffers::FollowStart<flatbuffers::ForwardsUOffset<flatbuffers::Table>> = flatbuffers::FollowStart::new();\n            let tab = fs.self_follow(&buf[..], 0);\n            assert_eq!(tab.get::<u8>(fi2fo(0), Some(123)), Some(123));\n        }\n    }\n\n    #[test]\n    fn to_root_to_table_get_slot_scalar_u8_default_via_vtable_zero() {\n        let buf: Vec<u8> = vec![\n            14, 0, 0, 0, // offset to root table\n            // enter vtable\n            6, 0, // vtable len\n            2, 0, // inline size\n            0, 0, // zero means use the default value\n            255, 255, 255, 255, // canary\n            // enter table\n            10, 0, 0, 0, // vtable location\n        ];\n        unsafe {\n            let fs: flatbuffers::FollowStart<flatbuffers::ForwardsUOffset<flatbuffers::Table>> = flatbuffers::FollowStart::new();\n            let tab = fs.self_follow(&buf[..], 0);\n            assert_eq!(tab.get::<u8>(fi2fo(0), Some(123)), Some(123));\n        }\n    }\n\n    #[test]\n    fn to_root_to_table_get_slot_string_multiple_types() {\n        let buf: Vec<u8> = vec![\n            14, 0, 0, 0, // offset to root table\n            // enter vtable\n            6, 0, // vtable len\n            2, 0, // inline size\n            4, 0, // value loc\n            255, 255, 255, 255, // canary\n            // enter table\n            10, 0, 0, 0, // vtable location\n            8, 0, 0, 0, // offset to string\n            // leave table\n            255, 255, 255, 255, // canary\n            // enter string\n            3, 0, 0, 0, 109, 111, 111, 0 // string length and contents\n        ];\n        unsafe {\n            let tab = <flatbuffers::ForwardsUOffset<flatbuffers::Table>>::follow(&buf[..], 0);\n            assert_eq!(tab.get::<flatbuffers::ForwardsUOffset<&str>>(fi2fo(0), None), Some(\"moo\"));\n            let byte_vec = tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<u8>>>(fi2fo(0), None).unwrap().bytes();\n            assert_eq!(byte_vec, &vec![109, 111, 111][..]);\n            let v = tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<u8>>>(fi2fo(0), None).unwrap();\n            assert_eq!(v.len(), 3);\n            assert_eq!(v.get(0), 109);\n            assert_eq!(v.get(1), 111);\n            assert_eq!(v.get(2), 111);\n        }\n    }\n\n    #[test]\n    fn to_root_to_table_get_slot_string_multiple_types_default_via_vtable_len() {\n        let buf: Vec<u8> = vec![\n            12, 0, 0, 0, // offset to root table\n            // enter vtable\n            4, 0, // vtable len\n            4, 0, // table inline len\n            255, 255, 255, 255, // canary\n            // enter table\n            8, 0, 0, 0, // vtable location\n        ];\n\n        unsafe {\n            let tab = <flatbuffers::ForwardsUOffset<flatbuffers::Table>>::follow(&buf[..], 0);\n            assert_eq!(tab.get::<flatbuffers::ForwardsUOffset<&str>>(fi2fo(0), Some(\"abc\")), Some(\"abc\"));\n            #[cfg(target_endian = \"little\")]\n            {\n                assert_eq!(tab.get::<flatbuffers::ForwardsUOffset<&[u8]>>(fi2fo(0), Some(&vec![70, 71, 72][..])), Some(&vec![70, 71, 72][..]));\n            }\n\n            let default_vec_buf: Vec<u8> = vec![3, 0, 0, 0, 70, 71, 72, 0];\n            let default_vec = flatbuffers::Vector::new(&default_vec_buf[..], 0);\n            let v = tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<u8>>>(fi2fo(0), Some(default_vec)).unwrap();\n            assert_eq!(v.len(), 3);\n            assert_eq!(v.get(0), 70);\n            assert_eq!(v.get(1), 71);\n            assert_eq!(v.get(2), 72);\n        }\n    }\n\n    #[test]\n    fn to_root_to_table_get_slot_string_multiple_types_default_via_vtable_zero() {\n        let buf: Vec<u8> = vec![\n            14, 0, 0, 0, // offset to root table\n            // enter vtable\n            6, 0, // vtable len\n            2, 0, // inline size\n            0, 0, // value loc\n            255, 255, 255, 255, // canary\n            // enter table\n            10, 0, 0, 0, // vtable location\n        ];\n        unsafe {\n            let tab = <flatbuffers::ForwardsUOffset<flatbuffers::Table>>::follow(&buf[..], 0);\n            assert_eq!(tab.get::<flatbuffers::ForwardsUOffset<&str>>(fi2fo(0), Some(\"abc\")), Some(\"abc\"));\n            #[cfg(target_endian = \"little\")]\n            {\n                assert_eq!(tab.get::<flatbuffers::ForwardsUOffset<&[u8]>>(fi2fo(0), Some(&vec![70, 71, 72][..])), Some(&vec![70, 71, 72][..]));\n            }\n\n            let default_vec_buf: Vec<u8> = vec![3, 0, 0, 0, 70, 71, 72, 0];\n            let default_vec = flatbuffers::Vector::new(&default_vec_buf[..], 0);\n            let v = tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<u8>>>(fi2fo(0), Some(default_vec)).unwrap();\n            assert_eq!(v.len(), 3);\n            assert_eq!(v.get(0), 70);\n            assert_eq!(v.get(1), 71);\n            assert_eq!(v.get(2), 72);\n        }\n    }\n}\n\n#[cfg(test)]\nmod push_impls {\n    extern crate flatbuffers;\n\n    use super::my_game;\n\n    fn check<'a>(b: &'a flatbuffers::FlatBufferBuilder, want: &'a [u8]) {\n        let got = b.unfinished_data();\n        assert_eq!(want, got);\n    }\n\n    #[test]\n    fn push_u8() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        b.push(123u8);\n        check(&b, &[123]);\n    }\n\n    #[test]\n    fn push_u64() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        b.push(0x12345678);\n        check(&b, &[0x78, 0x56, 0x34, 0x12]);\n    }\n\n    #[test]\n    fn push_f64() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        b.push(3.14159265359f64);\n        check(&b, &[234, 46, 68, 84, 251, 33, 9, 64]);\n    }\n\n    #[test]\n    fn push_generated_struct() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        b.push(my_game::example::Test::new(10, 20));\n        check(&b, &[10, 0, 20, 0]);\n    }\n\n    #[test]\n    fn push_u8_vector_with_offset_with_alignment() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let off = b.create_vector(&[1u8, 2, 3, 4, 5, 6, 7, 8, 9][..]);\n        b.push(off);\n        check(&b, &[/* loc */ 4, 0, 0, 0, /* len */ 9, 0, 0, 0, /* val */ 1, 2, 3, 4, 5, 6, 7, 8, 9, /* padding */ 0, 0, 0]);\n    }\n\n    #[test]\n    fn push_u8_u16_alignment() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        b.push(1u8);\n        b.push(2u16);\n        check(&b, &[2, 0, 0, 1]);\n    }\n\n    #[test]\n    fn push_u8_u32_alignment() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        b.push(1u8);\n        b.push(2u32);\n        check(&b, &[2, 0, 0, 0, 0, 0, 0, 1]);\n    }\n\n    #[test]\n    fn push_u8_u64_alignment() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        b.push(1u8);\n        b.push(2u64);\n        check(&b, &[2, 0, 0, 0,\n                    0, 0, 0, 0,\n                    0, 0, 0, 0,\n                    0, 0, 0, 1]);\n    }\n\n    #[test]\n    fn push_u8_generated_struct_alignment() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        b.push(1u8);\n        b.push(my_game::example::Test::new(10, 20));\n        check(&b, &[10, 0, 20, 0, 0, 1]);\n    }\n}\n\n#[cfg(test)]\nmod vtable_deduplication {\n    extern crate flatbuffers;\n    use flatbuffers::field_index_to_field_offset as fi2fo;\n\n    fn check<'a>(b: &'a flatbuffers::FlatBufferBuilder, want: &'a [u8]) {\n        let got = b.unfinished_data();\n        assert_eq!(want, got);\n    }\n\n    #[test]\n    fn one_empty_table() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let start0 = b.start_table();\n        b.end_table(start0);\n        check(&b, &[\n              4, 0, // vtable size in bytes\n              4, 0, // object inline data in bytes\n\n              4, 0, 0, 0, // backwards offset to vtable\n        ]);\n    }\n\n    #[test]\n    fn two_empty_tables_are_deduplicated() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let start0 = b.start_table();\n        b.end_table(start0);\n        let start1 = b.start_table();\n        b.end_table(start1);\n        check(&b, &[\n              252, 255, 255, 255, // forwards offset to vtable\n\n              4, 0, // vtable size in bytes\n              4, 0, // object inline data in bytes\n\n              4, 0, 0, 0, // backwards offset to vtable\n        ]);\n    }\n\n    #[test]\n    fn two_tables_with_two_conveniently_sized_inline_elements_are_deduplicated() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let start0 = b.start_table();\n        b.push_slot::<u64>(fi2fo(0), 100, 0);\n        b.push_slot::<u32>(fi2fo(1), 101, 0);\n        b.end_table(start0);\n        let start1 = b.start_table();\n        b.push_slot::<u64>(fi2fo(0), 200, 0);\n        b.push_slot::<u32>(fi2fo(1), 201, 0);\n        b.end_table(start1);\n        check(&b, &[\n              240, 255, 255, 255, // forwards offset to vtable\n\n              201, 0, 0, 0, // value #1\n              200, 0, 0, 0, 0, 0, 0, 0, // value #0\n\n              8, 0, // vtable size in bytes\n              16, 0, // object inline data in bytes\n              8, 0, // offset in object for value #0\n              4, 0, // offset in object for value #1\n\n              8, 0, 0, 0, // backwards offset to vtable\n              101, 0, 0, 0, // value #1\n              100, 0, 0, 0, 0, 0, 0, 0 // value #0\n        ]);\n    }\n\n    #[cfg(not(miri))]  // slow.\n    #[test]\n    fn many_identical_tables_use_few_vtables() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        for _ in 0..1000 {\n            let start = b.start_table();\n            b.push_slot::<u8>(fi2fo(0), 100, 0);\n            b.push_slot::<u32>(fi2fo(1), 101, 0);\n            b.end_table(start);\n        }\n        assert!(b.num_written_vtables() <= 10);\n    }\n}\n\n#[cfg(test)]\nmod byte_layouts {\n    extern crate flatbuffers;\n    use flatbuffers::field_index_to_field_offset as fi2fo;\n\n    fn check<'a>(b: &'a flatbuffers::FlatBufferBuilder, want: &'a [u8]) {\n        let got = b.unfinished_data();\n        assert_eq!(want, got);\n    }\n\n    #[test]\n    fn layout_01_basic_numbers() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        b.push(true);\n        check(&b, &[1]);\n        b.push(-127i8);\n        check(&b, &[129, 1]);\n        b.push(255u8);\n        check(&b, &[255, 129, 1]);\n        b.push(-32222i16);\n        check(&b, &[0x22, 0x82, 0, 255, 129, 1]); // first pad\n        b.push(0xFEEEu16);\n        check(&b, &[0xEE, 0xFE, 0x22, 0x82, 0, 255, 129, 1]); // no pad this time\n        b.push(-53687092i32);\n        check(&b, &[204, 204, 204, 252, 0xEE, 0xFE, 0x22, 0x82, 0, 255, 129, 1]);\n        b.push(0x98765432u32);\n        check(&b, &[0x32, 0x54, 0x76, 0x98, 204, 204, 204, 252, 0xEE, 0xFE, 0x22, 0x82, 0, 255, 129, 1]);\n    }\n\n    #[test]\n    fn layout_01b_bigger_numbers() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        b.push(0x1122334455667788u64);\n        check(&b, &[0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11]);\n    }\n\n    #[test]\n    fn layout_02_1xbyte_vector() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        check(&b, &[]);\n        b.start_vector::<u8>(1);\n        check(&b, &[0, 0, 0]); // align to 4bytes\n        b.push(1u8);\n        check(&b, &[1, 0, 0, 0]);\n        b.end_vector::<u8>(1);\n        check(&b, &[1, 0, 0, 0, 1, 0, 0, 0]); // padding\n    }\n\n    #[test]\n    fn layout_03_2xbyte_vector() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        b.start_vector::<u8>(2);\n        check(&b, &[0, 0]); // align to 4bytes\n        b.push(1u8);\n        check(&b, &[1, 0, 0]);\n        b.push(2u8);\n        check(&b, &[2, 1, 0, 0]);\n        b.end_vector::<u8>(2);\n        check(&b, &[2, 0, 0, 0, 2, 1, 0, 0]); // padding\n    }\n\n    #[test]\n    fn layout_03b_11xbyte_vector_matches_builder_size() {\n        let mut b = flatbuffers::FlatBufferBuilder::with_capacity(12);\n        b.start_vector::<u8>(8);\n\n        let mut gold = vec![0u8; 0];\n        check(&b, &gold[..]);\n\n        for i in 1u8..=8 {\n            b.push(i);\n            gold.insert(0, i);\n            check(&b, &gold[..]);\n        }\n        b.end_vector::<u8>(8);\n        let want = vec![8u8, 0, 0, 0,  8, 7, 6, 5, 4, 3, 2, 1];\n        check(&b, &want[..]);\n    }\n    #[test]\n    fn layout_04_1xuint16_vector() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        b.start_vector::<u16>(1);\n        check(&b, &[0, 0]); // align to 4bytes\n        b.push(1u16);\n        check(&b, &[1, 0, 0, 0]);\n        b.end_vector::<u16>(1);\n        check(&b, &[1, 0, 0, 0, 1, 0, 0, 0]); // padding\n    }\n\n    #[test]\n    fn layout_05_2xuint16_vector() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let _off = b.start_vector::<u16>(2);\n        check(&b, &[]); // align to 4bytes\n        b.push(0xABCDu16);\n        check(&b, &[0xCD, 0xAB]);\n        b.push(0xDCBAu16);\n        check(&b, &[0xBA, 0xDC, 0xCD, 0xAB]);\n        b.end_vector::<u16>(2);\n        check(&b, &[2, 0, 0, 0, 0xBA, 0xDC, 0xCD, 0xAB]);\n    }\n\n    #[test]\n    fn layout_06_create_string() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let off0 = b.create_string(\"foo\");\n        assert_eq!(8, off0.value());\n        check(&b, b\"\\x03\\x00\\x00\\x00foo\\x00\"); // 0-terminated, no pad\n        let off1 = b.create_string(\"moop\");\n        assert_eq!(20, off1.value());\n        check(&b, b\"\\x04\\x00\\x00\\x00moop\\x00\\x00\\x00\\x00\\\n                    \\x03\\x00\\x00\\x00foo\\x00\"); // 0-terminated, 3-byte pad\n    }\n\n    #[test]\n    fn layout_06b_create_string_unicode() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        // These characters are chinese from blog.golang.org/strings\n        // We use escape codes here so that editors without unicode support\n        // aren't bothered:\n        let uni_str = \"\\u{65e5}\\u{672c}\\u{8a9e}\";\n        let off0 = b.create_string(uni_str);\n        assert_eq!(16, off0.value());\n        check(&b, &[9, 0, 0, 0, 230, 151, 165, 230, 156, 172, 232, 170, 158, 0, //  null-terminated, 2-byte pad\n                    0, 0]);\n    }\n\n    #[test]\n    fn layout_06c_create_byte_string() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let off0 = b.create_byte_string(b\"foo\");\n        assert_eq!(8, off0.value());\n        check(&b, b\"\\x03\\x00\\x00\\x00foo\\x00\"); // 0-terminated, no pad\n        let off1 = b.create_byte_string(b\"moop\");\n        assert_eq!(20, off1.value());\n        check(&b, b\"\\x04\\x00\\x00\\x00moop\\x00\\x00\\x00\\x00\\\n                    \\x03\\x00\\x00\\x00foo\\x00\"); // 0-terminated, 3-byte pad\n    }\n\n    #[test]\n    fn layout_07_empty_vtable() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let off0 = b.start_table();\n        check(&b, &[]);\n        b.end_table(off0);\n        check(&b, &[4, 0, // vtable length\n                    4, 0, // length of table including vtable offset\n                    4, 0, 0, 0]); // offset for start of vtable\n    }\n\n    #[test]\n    fn layout_08_vtable_with_one_true_bool() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        check(&b, &[]);\n        let off0 = b.start_table();\n        assert_eq!(0, off0.value());\n        check(&b, &[]);\n        b.push_slot(fi2fo(0), true, false);\n        check(&b, &[1]);\n        let off1 = b.end_table(off0);\n        assert_eq!(8, off1.value());\n        check(&b, &[\n              6, 0, // vtable bytes\n              8, 0, // length of object including vtable offset\n              7, 0, // start of bool value\n              6, 0, 0, 0, // offset for start of vtable (int32)\n              0, 0, 0, // padded to 4 bytes\n              1, // bool value\n        ]);\n    }\n\n    #[test]\n    fn layout_09_vtable_with_one_default_bool() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        check(&b, &[]);\n        let off = b.start_table();\n        check(&b, &[]);\n        b.push_slot(fi2fo(0), false, false);\n        b.end_table(off);\n        check(&b, &[\n             4, 0, // vtable bytes\n             4, 0, // end of object from here\n             // entry 1 is zero and not stored.\n             4, 0, 0, 0, // offset for start of vtable (int32)\n        ]);\n    }\n\n    #[test]\n    fn layout_09b_vtable_with_one_default_bool_force_defaults() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        check(&b, &[]);\n        let off = b.start_table();\n        check(&b, &[]);\n        b.force_defaults(true);\n        b.push_slot(fi2fo(0), false, false);\n        b.end_table(off);\n        check(&b, &[\n            6, 0, // vtable bytes\n            8, 0, // length of object including vtable offset\n            7, 0, // start of bool value\n            6, 0, 0, 0, // offset for start of vtable (int32)\n            0, 0, 0, // padded to 4 bytes\n            0, // bool value\n      ]);\n    }\n\n    #[test]\n    fn layout_10_vtable_with_one_int16() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        check(&b, &[]);\n        let off = b.start_table();\n        b.push_slot(fi2fo(0), 0x789Ai16, 0);\n        b.end_table(off);\n        check(&b, &[\n              6, 0, // vtable bytes\n              8, 0, // end of object from here\n              6, 0, // offset to value\n              6, 0, 0, 0, // offset for start of vtable (int32)\n              0, 0, // padding to 4 bytes\n              0x9A, 0x78,\n        ]);\n    }\n\n    #[test]\n    fn layout_11_vtable_with_two_int16() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let off = b.start_table();\n        b.push_slot(fi2fo(0), 0x3456i16, 0);\n        b.push_slot(fi2fo(1), 0x789Ai16, 0);\n        b.end_table(off);\n        check(&b, &[\n              8, 0, // vtable bytes\n              8, 0, // end of object from here\n              6, 0, // offset to value 0\n              4, 0, // offset to value 1\n              8, 0, 0, 0, // offset for start of vtable (int32)\n              0x9A, 0x78, // value 1\n              0x56, 0x34, // value 0\n        ]);\n    }\n\n    #[test]\n    fn layout_12_vtable_with_int16_and_bool() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let off = b.start_table();\n        b.push_slot(fi2fo(0), 0x3456i16, 0);\n        b.push_slot(fi2fo(1), true, false);\n        b.end_table(off);\n        check(&b, &[\n            8, 0, // vtable bytes\n            8, 0, // end of object from here\n            6, 0, // offset to value 0\n            5, 0, // offset to value 1\n            8, 0, 0, 0, // offset for start of vtable (int32)\n            0,          // padding\n            1,          // value 1\n            0x56, 0x34, // value 0\n        ]);\n    }\n\n    #[test]\n    fn layout_12b_vtable_with_empty_vector() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        b.start_vector::<u8>(0);\n        let vecend = b.end_vector::<u8>(0);\n        let off = b.start_table();\n        b.push_slot_always(fi2fo(0), vecend);\n        b.end_table(off);\n        check(&b, &[\n              6, 0, // vtable bytes\n              8, 0,\n              4, 0, // offset to vector offset\n              6, 0, 0, 0, // offset for start of vtable (int32)\n              4, 0, 0, 0,\n              0, 0, 0, 0, // length of vector (not in struct)\n        ]);\n    }\n\n    #[test]\n    fn layout_12c_vtable_with_empty_vector_of_byte_and_some_scalars() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        b.start_vector::<u8>(0);\n        let vecend = b.end_vector::<u8>(0);\n        let off = b.start_table();\n        b.push_slot::<i16>(fi2fo(0), 55i16, 0);\n        b.push_slot_always::<flatbuffers::WIPOffset<_>>(fi2fo(1), vecend);\n        b.end_table(off);\n        check(&b, &[\n              8, 0, // vtable bytes\n              12, 0,\n              10, 0, // offset to value 0\n              4, 0, // offset to vector offset\n              8, 0, 0, 0, // vtable loc\n              8, 0, 0, 0, // value 1\n              0, 0, 55, 0, // value 0\n\n              0, 0, 0, 0, // length of vector (not in struct)\n        ]);\n    }\n    #[test]\n    fn layout_13_vtable_with_1_int16_and_2_vector_of_i16() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        b.start_vector::<i16>(2);\n        b.push(0x1234i16);\n        b.push(0x5678i16);\n        let vecend = b.end_vector::<i16>(2);\n        let off = b.start_table();\n        b.push_slot_always(fi2fo(1), vecend);\n        b.push_slot(fi2fo(0), 55i16, 0);\n        b.end_table(off);\n        check(&b, &[\n              8, 0, // vtable bytes\n              12, 0, // length of object\n              6, 0, // start of value 0 from end of vtable\n              8, 0, // start of value 1 from end of buffer\n              8, 0, 0, 0, // offset for start of vtable (int32)\n              0, 0, // padding\n              55, 0, // value 0\n              4, 0, 0, 0, // vector position from here\n              2, 0, 0, 0, // length of vector (uint32)\n              0x78, 0x56, // vector value 1\n              0x34, 0x12, // vector value 0\n        ]);\n    }\n    #[test]\n    fn layout_14_vtable_with_1_struct_of_int8_and_int16_and_int32() {\n        #[derive(Copy, Clone, Debug, Eq, PartialEq)]\n        #[repr(C, packed)]\n        struct foo {\n            a: i32,\n            _pad0: [u8; 2],\n            b: i16,\n            _pad1: [u8; 3],\n            c: i8,\n            _pad2: [u8; 4],\n        }\n        assert_eq!(::core::mem::size_of::<foo>(), 16);\n        impl<'b> flatbuffers::Push for &'b foo {\n            type Output = foo;\n            unsafe fn push<'a>(&'a self, dst: &'a mut [u8], _written_len: usize) {\n                let src = ::core::slice::from_raw_parts(*self as *const foo as *const u8, ::core::mem::size_of::<foo>());\n                dst.copy_from_slice(src);\n            }\n        }\n\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let off = b.start_table();\n        let x = foo{a: 0x12345678i32.to_le(), _pad0: [0,0], b: 0x1234i16.to_le(), _pad1: [0, 0, 0], c: 0x12i8.to_le(), _pad2: [0, 0, 0, 0]};\n        b.push_slot_always(fi2fo(0), &x);\n        b.end_table(off);\n        check(&b, &[\n              6, 0, // vtable bytes\n              20, 0, // end of object from here\n              4, 0, // start of struct from here\n              6, 0, 0, 0, // offset for start of vtable (int32)\n\n              0x78, 0x56, 0x34, 0x12, // value a\n              0, 0, // padding\n              0x34, 0x12, // value b\n              0, 0, 0, // padding\n              0x12, // value c\n              0, 0, 0, 0, // padding\n        ]);\n    }\n    #[test]\n    fn layout_15_vtable_with_1_vector_of_4_int8() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        b.start_vector::<i8>(4);\n        b.push(33i8);\n        b.push(44i8);\n        b.push(55i8);\n        b.push(66i8);\n        let vecend = b.end_vector::<i8>(4);\n        let off = b.start_table();\n        b.push_slot_always(fi2fo(0), vecend);\n        b.end_table(off);\n        check(&b, &[\n              6, 0, // vtable bytes\n              8, 0,\n              4, 0, // offset of vector offset\n              6, 0, 0, 0, // offset for start of vtable (int32)\n              4, 0, 0, 0, // vector start offset\n\n              4, 0, 0, 0, // vector length\n              66, // vector value 1,1\n              55, // vector value 1,0\n              44, // vector value 0,1\n              33, // vector value 0,0\n        ]);\n    }\n\n    #[test]\n    fn layout_16_table_with_some_elements() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let off = b.start_table();\n        b.push_slot(fi2fo(0), 33i8, 0);\n        b.push_slot(fi2fo(1), 66i16, 0);\n        let off2 = b.end_table(off);\n        b.finish_minimal(off2);\n\n        check(&b, &[\n              12, 0, 0, 0, // root of table: points to vtable offset\n\n              8, 0, // vtable bytes\n              8, 0, // end of object from here\n              7, 0, // start of value 0\n              4, 0, // start of value 1\n\n              8, 0, 0, 0, // offset for start of vtable (int32)\n\n              66, 0, // value 1\n              0,  // padding\n              33, // value 0\n        ]);\n    }\n\n    #[test]\n    fn layout_17_one_unfinished_table_and_one_finished_table() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        {\n            let off = b.start_table();\n            b.push_slot(fi2fo(0), 33i8, 0);\n            b.push_slot(fi2fo(1), 44i8, 0);\n            b.end_table(off);\n        }\n\n        {\n            let off = b.start_table();\n            b.push_slot(fi2fo(0), 55i8, 0);\n            b.push_slot(fi2fo(1), 66i8, 0);\n            b.push_slot(fi2fo(2), 77i8, 0);\n            let off2 = b.end_table(off);\n            b.finish_minimal(off2);\n        }\n\n        check(&b, &[\n              16, 0, 0, 0, // root of table: points to object\n              0, 0, // padding\n\n              10, 0, // vtable bytes\n              8, 0, // size of object\n              7, 0, // start of value 0\n              6, 0, // start of value 1\n              5, 0, // start of value 2\n              10, 0, 0, 0, // offset for start of vtable (int32)\n              0,  // padding\n              77, // value 2\n              66, // value 1\n              55, // value 0\n\n              //12, 0, 0, 0, // root of table: points to object\n\n              8, 0, // vtable bytes\n              8, 0, // size of object\n              7, 0, // start of value 0\n              6, 0, // start of value 1\n              8, 0, 0, 0, // offset for start of vtable (int32)\n              0, 0, // padding\n              44, // value 1\n              33, // value 0\n              ]);\n    }\n\n    #[test]\n    fn layout_18_a_bunch_of_bools() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let off = b.start_table();\n        b.push_slot(fi2fo(0), true, false);\n        b.push_slot(fi2fo(1), true, false);\n        b.push_slot(fi2fo(2), true, false);\n        b.push_slot(fi2fo(3), true, false);\n        b.push_slot(fi2fo(4), true, false);\n        b.push_slot(fi2fo(5), true, false);\n        b.push_slot(fi2fo(6), true, false);\n        b.push_slot(fi2fo(7), true, false);\n        let off2 = b.end_table(off);\n        b.finish_minimal(off2);\n\n        check(&b, &[\n              24, 0, 0, 0, // root of table: points to vtable offset\n\n              20, 0, // vtable bytes\n              12, 0, // size of object\n              11, 0, // start of value 0\n              10, 0, // start of value 1\n              9, 0, // start of value 2\n              8, 0, // start of value 3\n              7, 0, // start of value 4\n              6, 0, // start of value 5\n              5, 0, // start of value 6\n              4, 0, // start of value 7\n              20, 0, 0, 0, // vtable offset\n\n              1, // value 7\n              1, // value 6\n              1, // value 5\n              1, // value 4\n              1, // value 3\n              1, // value 2\n              1, // value 1\n              1, // value 0\n              ]);\n    }\n\n    #[test]\n    fn layout_19_three_bools() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let off = b.start_table();\n        b.push_slot(fi2fo(0), true, false);\n        b.push_slot(fi2fo(1), true, false);\n        b.push_slot(fi2fo(2), true, false);\n        let off2 = b.end_table(off);\n        b.finish_minimal(off2);\n\n        check(&b, &[\n              16, 0, 0, 0, // root of table: points to vtable offset\n\n              0, 0, // padding\n\n              10, 0, // vtable bytes\n              8, 0, // size of object\n              7, 0, // start of value 0\n              6, 0, // start of value 1\n              5, 0, // start of value 2\n              10, 0, 0, 0, // vtable offset from here\n\n              0, // padding\n              1, // value 2\n              1, // value 1\n              1, // value 0\n        ]);\n    }\n\n    #[test]\n    fn layout_20_some_floats() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let off = b.start_table();\n        b.push_slot(fi2fo(0), 1.0f32, 0.0);\n        b.end_table(off);\n\n        check(&b, &[\n              6, 0, // vtable bytes\n              8, 0, // size of object\n              4, 0, // start of value 0\n              6, 0, 0, 0, // vtable offset\n\n              0, 0, 128, 63, // value 0\n        ]);\n    }\n\n    #[test]\n    fn layout_21_vtable_defaults() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let off = b.start_table();\n        b.push_slot::<i8>(fi2fo(0), 1, 1);\n        b.push_slot::<i8>(fi2fo(1), 3, 2);\n        b.push_slot::<i8>(fi2fo(2), 3, 3);\n        b.end_table(off);\n        check(&b, &[\n              8, 0, // vtable size in bytes\n              8, 0, // object inline data in bytes\n              0, 0, // entry 1/3: 0 => default\n              7, 0, // entry 2/3: 7 => table start + 7 bytes\n              // entry 3/3: not present => default\n              8, 0, 0, 0,\n              0, 0, 0,\n              3,\n        ]);\n    }\n\n    #[test]\n    fn layout_22_root() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let off = b.start_table();\n        // skipped: b.push_slot_scalar::<i16>(0, 1, 1);\n        b.push_slot::<i16>(fi2fo(1), 3, 2);\n        b.push_slot::<i16>(fi2fo(2), 3, 3);\n        let table_end = b.end_table(off);\n        b.finish_minimal(table_end);\n        check(&b, &[\n              12, 0, 0, 0, // root\n\n              8, 0, // vtable size in bytes\n              8, 0, // object inline data in bytes\n              0, 0, // entry 1/3: 0 => default\n              6, 0, // entry 2/3: 6 => table start + 6 bytes\n              // entry 3/3: not present => default\n              8, 0, 0, 0, // size of table data in bytes\n              0, 0, // padding\n              3, 0, // value 2/3\n        ]);\n    }\n    #[test]\n    fn layout_23_varied_slots_and_root() {\n        let mut b = flatbuffers::FlatBufferBuilder::new();\n        let off = b.start_table();\n        b.push_slot::<i16>(fi2fo(0), 1, 0);\n        b.push_slot::<u8>(fi2fo(1), 2, 0);\n        b.push_slot::<f32>(fi2fo(2), 3.0, 0.0);\n        let table_end = b.end_table(off);\n        b.finish_minimal(table_end);\n        check(&b, &[\n              16, 0, 0, 0, // root\n              0, 0, // padding\n              10, 0, // vtable bytes\n              12, 0, // object inline data size\n              10, 0, // offset to value #1 (i16)\n              9, 0, // offset to value #2 (u8)\n              4, 0, // offset to value #3 (f32)\n              10, 0, // offset to vtable\n              0, 0, // padding\n              0, 0, 64, 64, // value #3 => 3.0 (float32)\n              0, 2, // value #1 => 2 (u8)\n              1, 0, // value #0 => 1 (int16)\n        ]);\n    }\n}\n\n#[cfg(test)]\nmod copy_clone_traits {\n\n    use alloc::vec::Vec;\n\n    #[test]\n    fn follow_types_implement_copy_and_clone() {\n        static_assertions::assert_impl_all!(flatbuffers::WIPOffset<u32>: Copy, Clone);\n        static_assertions::assert_impl_all!(flatbuffers::WIPOffset<Vec<u32>>: Copy, Clone);\n\n        static_assertions::assert_impl_all!(flatbuffers::ForwardsUOffset<u32>: Copy, Clone);\n        static_assertions::assert_impl_all!(flatbuffers::ForwardsUOffset<Vec<u32>>: Copy, Clone);\n\n        static_assertions::assert_impl_all!(flatbuffers::Vector<'static, u32>: Copy, Clone);\n        static_assertions::assert_impl_all!(flatbuffers::Vector<'static, Vec<u32>>: Copy, Clone);\n    }\n}\n\n#[cfg(test)]\nmod fully_qualified_name {\n    #[test]\n    fn fully_qualified_name_generated() {\n        assert!(check_eq!(super::my_game::example::Monster::get_fully_qualified_name(), \"MyGame.Example.Monster\").is_ok());\n        assert!(check_eq!(super::my_game::example_2::Monster::get_fully_qualified_name(), \"MyGame.Example2.Monster\").is_ok());\n\n        assert!(check_eq!(super::my_game::example::Vec3::get_fully_qualified_name(), \"MyGame.Example.Vec3\").is_ok());\n        assert!(check_eq!(super::my_game::example::Ability::get_fully_qualified_name(), \"MyGame.Example.Ability\").is_ok());\n    }\n}\n\n// this is not technically a test, but we want to always keep this generated\n// file up-to-date, and the simplest way to do that is to make sure that when\n// tests are run, the file is generated.\n#[cfg(not(feature = \"no_std\"))]\n#[test]\nfn write_example_wire_data_to_file() {\n    let b = &mut flatbuffers::FlatBufferBuilder::new();\n    create_serialized_example_with_generated_code(b);\n\n    use ::std::io::Write;\n    let mut f = std::fs::File::create(\"../monsterdata_rust_wire.mon\").unwrap();\n    f.write_all(b.finished_data()).unwrap();\n}\n\n#[cfg(not(feature = \"no_std\"))]\nfn load_file(filename: &str) -> Result<Vec<u8>, std::io::Error> {\n    use std::io::Read;\n    let mut f = std::fs::File::open(filename)?;\n    let mut buf = Vec::new();\n    f.read_to_end(&mut buf)?;\n    Ok(buf)\n}\n\n#[test]\nfn test_shared_strings() {\n    let mut builder = flatbuffers::FlatBufferBuilder::new();\n    let offset1 = builder.create_shared_string(\"welcome to flatbuffers!!\");\n    let offset2 = builder.create_shared_string(\"welcome\");\n    let offset3 = builder.create_shared_string(\"welcome to flatbuffers!!\");\n    assert_ne!(offset2.value(), offset3.value());\n    assert_eq!(offset1.value(), offset3.value());\n    builder.reset();\n    let offset4 = builder.create_shared_string(\"welcome\");\n    let offset5 = builder.create_shared_string(\"welcome to flatbuffers!!\");\n    assert_ne!(offset2.value(), offset4.value());\n    assert_ne!(offset5.value(), offset1.value());\n    builder.reset();\n\n    // Checks if the shared string function would always work with\n    // an object in between the writes\n    let name = builder.create_shared_string(\"foo\");\n    let enemy = my_game::example::Monster::create(&mut builder, &my_game::example::MonsterArgs {\n        name: Some(name),\n        ..Default::default()\n    });\n    let secondary_name = builder.create_shared_string(\"foo\");\n    assert_eq!(name.value(), secondary_name.value());\n\n    // Builds a new monster object and embeds enemy into it so we can verify\n    // that shared strings are working.\n    let args = my_game::example::MonsterArgs {\n        name: Some(secondary_name),\n        enemy: Some(enemy),\n        testarrayofstring: Some(builder.create_vector(&[name, secondary_name])),\n        ..Default::default()\n    };\n    // Building secondary monster\n    let main_monster = my_game::example::Monster::create(&mut builder, &args);\n    builder.finish(main_monster, None);\n    let monster = my_game::example::root_as_monster(builder.finished_data()).unwrap();\n\n    // Checks if the embedded object (Enemy) name is foo\n    assert_eq!(monster.enemy().unwrap().name(), \"foo\");\n    let string_vector = monster.testarrayofstring().unwrap();\n    // Check if the vector will have the same string\n    assert_eq!(string_vector.get(0), \"foo\");\n    assert_eq!(string_vector.get(1), \"foo\");\n}\n\n#[test]\nfn lookup_index_by_key_returns_correct_index() {\n    let b = &mut flatbuffers::FlatBufferBuilder::new();\n    // Abilities are sorted by id (the key field).\n    let v = b.create_vector(&[\n        my_game::example::Ability::new(1, 10),\n        my_game::example::Ability::new(3, 30),\n        my_game::example::Ability::new(5, 50),\n    ]);\n    let name = b.create_string(\"test\");\n    let mon = my_game::example::Monster::create(b, &my_game::example::MonsterArgs {\n        name: Some(name),\n        testarrayofsortedstruct: Some(v),\n        ..Default::default()\n    });\n    my_game::example::finish_monster_buffer(b, mon);\n    let buf = b.finished_data();\n    let mon = my_game::example::root_as_monster(buf).unwrap();\n    let abilities = mon.testarrayofsortedstruct().unwrap();\n\n    // Lookup each element and verify the returned index.\n    assert_eq!(\n        abilities.lookup_index_by_key(1u32, |a, key| a.key_compare_with_value(*key)),\n        Some(0)\n    );\n    assert_eq!(\n        abilities.lookup_index_by_key(3u32, |a, key| a.key_compare_with_value(*key)),\n        Some(1)\n    );\n    assert_eq!(\n        abilities.lookup_index_by_key(5u32, |a, key| a.key_compare_with_value(*key)),\n        Some(2)\n    );\n}\n\n#[test]\nfn lookup_index_by_key_returns_none_for_missing_key() {\n    let b = &mut flatbuffers::FlatBufferBuilder::new();\n    let v = b.create_vector(&[\n        my_game::example::Ability::new(1, 10),\n        my_game::example::Ability::new(3, 30),\n        my_game::example::Ability::new(5, 50),\n    ]);\n    let name = b.create_string(\"test\");\n    let mon = my_game::example::Monster::create(b, &my_game::example::MonsterArgs {\n        name: Some(name),\n        testarrayofsortedstruct: Some(v),\n        ..Default::default()\n    });\n    my_game::example::finish_monster_buffer(b, mon);\n    let buf = b.finished_data();\n    let mon = my_game::example::root_as_monster(buf).unwrap();\n    let abilities = mon.testarrayofsortedstruct().unwrap();\n\n    // Keys that do not exist in the vector.\n    assert_eq!(\n        abilities.lookup_index_by_key(0u32, |a, key| a.key_compare_with_value(*key)),\n        None\n    );\n    assert_eq!(\n        abilities.lookup_index_by_key(2u32, |a, key| a.key_compare_with_value(*key)),\n        None\n    );\n    assert_eq!(\n        abilities.lookup_index_by_key(99u32, |a, key| a.key_compare_with_value(*key)),\n        None\n    );\n}\n\n#[test]\nfn lookup_index_by_key_on_empty_vector() {\n    let b = &mut flatbuffers::FlatBufferBuilder::new();\n    let v = b.create_vector::<my_game::example::Ability>(&[]);\n    let name = b.create_string(\"test\");\n    let mon = my_game::example::Monster::create(b, &my_game::example::MonsterArgs {\n        name: Some(name),\n        testarrayofsortedstruct: Some(v),\n        ..Default::default()\n    });\n    my_game::example::finish_monster_buffer(b, mon);\n    let buf = b.finished_data();\n    let mon = my_game::example::root_as_monster(buf).unwrap();\n    let abilities = mon.testarrayofsortedstruct().unwrap();\n\n    assert_eq!(\n        abilities.lookup_index_by_key(1u32, |a, key| a.key_compare_with_value(*key)),\n        None\n    );\n}\n\n#[test]\nfn lookup_index_by_key_single_element() {\n    let b = &mut flatbuffers::FlatBufferBuilder::new();\n    let v = b.create_vector(&[my_game::example::Ability::new(42, 100)]);\n    let name = b.create_string(\"test\");\n    let mon = my_game::example::Monster::create(b, &my_game::example::MonsterArgs {\n        name: Some(name),\n        testarrayofsortedstruct: Some(v),\n        ..Default::default()\n    });\n    my_game::example::finish_monster_buffer(b, mon);\n    let buf = b.finished_data();\n    let mon = my_game::example::root_as_monster(buf).unwrap();\n    let abilities = mon.testarrayofsortedstruct().unwrap();\n\n    assert_eq!(\n        abilities.lookup_index_by_key(42u32, |a, key| a.key_compare_with_value(*key)),\n        Some(0)\n    );\n    assert_eq!(\n        abilities.lookup_index_by_key(1u32, |a, key| a.key_compare_with_value(*key)),\n        None\n    );\n}\n\n#[test]\nfn lookup_index_by_key_consistent_with_lookup_by_key() {\n    let b = &mut flatbuffers::FlatBufferBuilder::new();\n    let v = b.create_vector(&[\n        my_game::example::Ability::new(2, 20),\n        my_game::example::Ability::new(4, 40),\n        my_game::example::Ability::new(6, 60),\n        my_game::example::Ability::new(8, 80),\n        my_game::example::Ability::new(10, 100),\n    ]);\n    let name = b.create_string(\"test\");\n    let mon = my_game::example::Monster::create(b, &my_game::example::MonsterArgs {\n        name: Some(name),\n        testarrayofsortedstruct: Some(v),\n        ..Default::default()\n    });\n    my_game::example::finish_monster_buffer(b, mon);\n    let buf = b.finished_data();\n    let mon = my_game::example::root_as_monster(buf).unwrap();\n    let abilities = mon.testarrayofsortedstruct().unwrap();\n\n    // For every key that exists, lookup_index_by_key should return an index\n    // whose element matches lookup_by_key.\n    for key in &[2u32, 4, 6, 8, 10] {\n        let obj = abilities.lookup_by_key(*key, |a, k| a.key_compare_with_value(*k));\n        let idx = abilities.lookup_index_by_key(*key, |a, k| a.key_compare_with_value(*k));\n        assert!(obj.is_some());\n        assert!(idx.is_some());\n        assert_eq!(abilities.get(idx.unwrap()).id(), obj.unwrap().id());\n    }\n\n    // For keys that don't exist, both should return None.\n    for key in &[0u32, 1, 3, 5, 7, 9, 11] {\n        assert!(abilities.lookup_by_key(*key, |a, k| a.key_compare_with_value(*k)).is_none());\n        assert!(abilities.lookup_index_by_key(*key, |a, k| a.key_compare_with_value(*k)).is_none());\n    }\nfn test_shared_strings_pool_deduplication() {\n    // Verifies that create_shared_string correctly deduplicates across many\n    // unique strings and that the resulting buffer contains valid data.\n    let mut builder = flatbuffers::FlatBufferBuilder::with_capacity(1024);\n\n    // Insert multiple unique strings and verify each gets a distinct offset.\n    let animals = [\"cat\", \"dog\", \"bird\", \"fish\", \"snake\"];\n    let offsets: Vec<_> = animals\n        .iter()\n        .map(|s| builder.create_shared_string(s))\n        .collect();\n    for i in 0..offsets.len() {\n        for j in (i + 1)..offsets.len() {\n            assert_ne!(\n                offsets[i].value(),\n                offsets[j].value(),\n                \"unique strings '{}' and '{}' must have different offsets\",\n                animals[i],\n                animals[j],\n            );\n        }\n    }\n\n    // Re-insert the same strings and verify they return the original offsets.\n    for (i, s) in animals.iter().enumerate() {\n        let offset = builder.create_shared_string(s);\n        assert_eq!(\n            offset.value(),\n            offsets[i].value(),\n            \"duplicate string '{}' must return the same offset\",\n            s,\n        );\n    }\n\n    // Verify that reset clears the pool: a previously shared string is no\n    // longer deduplicated against strings from before the reset.\n    builder.reset();\n    let a = builder.create_shared_string(\"cat\");\n    let b = builder.create_shared_string(\"cat\");\n    assert_eq!(a.value(), b.value(), \"same string after reset must still deduplicate\");\n\n    // Verify that shared strings produce a valid, readable buffer.\n    builder.reset();\n    let shared_name = builder.create_shared_string(\"goblin\");\n    let shared_name_dup = builder.create_shared_string(\"goblin\");\n    assert_eq!(shared_name.value(), shared_name_dup.value());\n\n    let enemy = my_game::example::Monster::create(\n        &mut builder,\n        &my_game::example::MonsterArgs {\n            name: Some(shared_name),\n            ..Default::default()\n        },\n    );\n    let main_name = builder.create_shared_string(\"goblin\");\n    assert_eq!(main_name.value(), shared_name.value());\n\n    let monster = my_game::example::Monster::create(\n        &mut builder,\n        &my_game::example::MonsterArgs {\n            name: Some(main_name),\n            enemy: Some(enemy),\n            ..Default::default()\n        },\n    );\n    builder.finish(monster, None);\n\n    let m = my_game::example::root_as_monster(builder.finished_data()).unwrap();\n    assert_eq!(m.name(), \"goblin\");\n    assert_eq!(m.enemy().unwrap().name(), \"goblin\");\n}\n\n} // mod flatbuffers_tests\n}\n"
  },
  {
    "path": "tests/rust_usage_test/tests/more_defaults_test.rs",
    "content": "extern crate alloc;\n\nuse alloc::string::ToString;\nuse alloc::vec::Vec;\n\n#[allow(dead_code, unused_imports)]\n#[path = \"../../more_defaults/mod.rs\"]\nmod more_defaults_generated;\nuse self::more_defaults_generated::*;\n\n#[test]\nfn object_defaults() {\n    assert_eq!(\n        MoreDefaultsT::default(),\n        MoreDefaultsT {\n            ints: Vec::new(),\n            floats: Vec::new(),\n            empty_string: \"\".to_string(),\n            some_string: \"some\".to_string(),\n            abcs: Vec::new(),\n            bools: Vec::new(),\n        },\n    )\n}\n\n#[test]\nfn nonpresent_values() {\n    let m = flatbuffers::root::<MoreDefaults>(&[0; 4]).unwrap();\n    assert_eq!(m.ints().len(), 0);\n    assert_eq!(m.floats().len(), 0);\n    assert_eq!(m.abcs().len(), 0);\n    assert_eq!(m.bools().len(), 0);\n    assert_eq!(m.empty_string(), \"\");\n    assert_eq!(m.some_string(), \"some\");\n}\n"
  },
  {
    "path": "tests/rust_usage_test/tests/optional_scalars_test.rs",
    "content": "#[allow(dead_code, unused_imports)]\n#[path = \"../../optional_scalars/mod.rs\"]\nmod optional_scalars_generated;\nuse crate::optional_scalars_generated::optional_scalars::*;\n\n// There are 3 variants of scalars in tables - those specified with default=42,\n// optional scalars, and those with nothing specified (implicitly default=0).\n// This tests that you can read what you write.\nmacro_rules! make_test {\n    (\n        $test_name: ident,\n        $just: ident, $default: ident, $maybe: ident,\n        $five: expr, $zero: expr, $fortytwo: expr\n    ) => {\n        #[test]\n        fn $test_name() {\n            let mut builder = flatbuffers::FlatBufferBuilder::new();\n            // Test five makes sense when specified.\n            let ss = ScalarStuff::create(\n                &mut builder,\n                &ScalarStuffArgs {\n                    $just: $five,\n                    $default: $five,\n                    $maybe: Some($five),\n                    ..Default::default()\n                },\n            );\n            builder.finish(ss, None);\n\n            let s = flatbuffers::root::<ScalarStuff>(builder.finished_data()).unwrap();\n            assert_eq!(s.$just(), $five);\n            assert_eq!(s.$default(), $five);\n            assert_eq!(s.$maybe(), Some($five));\n\n            // Test defaults are used when not specified.\n            let s = flatbuffers::root::<ScalarStuff>(&[0; 8]).unwrap();\n            assert_eq!(s.$just(), $zero);\n            assert_eq!(s.$default(), $fortytwo);\n            assert_eq!(s.$maybe(), None);\n\n            // Same for object API\n            let s = flatbuffers::root::<ScalarStuff>(builder.finished_data()).unwrap().unpack();\n            assert_eq!(s.$just, $five);\n            assert_eq!(s.$default, $five);\n            assert_eq!(s.$maybe, Some($five));\n            let s = flatbuffers::root::<ScalarStuff>(&[0; 8]).unwrap().unpack();\n            assert_eq!(s.$just, $zero);\n            assert_eq!(s.$default, $fortytwo);\n            assert_eq!(s.$maybe, None);\n        }\n    };\n}\n\nmake_test!(optional_i8, just_i8, default_i8, maybe_i8, 5, 0, 42);\nmake_test!(optional_u8, just_u8, default_u8, maybe_u8, 5, 0, 42);\nmake_test!(optional_i16, just_i16, default_i16, maybe_i16, 5, 0, 42);\nmake_test!(optional_u16, just_u16, default_u16, maybe_u16, 5, 0, 42);\nmake_test!(optional_i32, just_i32, default_i32, maybe_i32, 5, 0, 42);\nmake_test!(optional_u32, just_u32, default_u32, maybe_u32, 5, 0, 42);\nmake_test!(optional_i64, just_i64, default_i64, maybe_i64, 5, 0, 42);\nmake_test!(optional_u64, just_u64, default_u64, maybe_u64, 5, 0, 42);\nmake_test!(optional_f32, just_f32, default_f32, maybe_f32, 5.0, 0.0, 42.0);\nmake_test!(optional_f64, just_f64, default_f64, maybe_f64, 5.0, 0.0, 42.0);\nmake_test!(optional_bool, just_bool, default_bool, maybe_bool, true, false, true);\nmake_test!(\n    optional_enum,\n    just_enum,\n    default_enum,\n    maybe_enum,\n    OptionalByte::Two,\n    OptionalByte::None,\n    OptionalByte::One\n);\n\n#[test]\nfn object_api_defaults() {\n    assert_eq!(\n        ScalarStuffT::default(),\n        ScalarStuffT {\n            just_i8: 0,\n            maybe_i8: None,\n            default_i8: 42,\n            just_u8: 0,\n            maybe_u8: None,\n            default_u8: 42,\n\n            just_i16: 0,\n            maybe_i16: None,\n            default_i16: 42,\n            just_u16: 0,\n            maybe_u16: None,\n            default_u16: 42,\n\n            just_i32: 0,\n            maybe_i32: None,\n            default_i32: 42,\n            just_u32: 0,\n            maybe_u32: None,\n            default_u32: 42,\n\n            just_i64: 0,\n            maybe_i64: None,\n            default_i64: 42,\n            just_u64: 0,\n            maybe_u64: None,\n            default_u64: 42,\n\n            just_f32: 0.0,\n            maybe_f32: None,\n            default_f32: 42.0,\n            just_f64: 0.0,\n            maybe_f64: None,\n            default_f64: 42.0,\n\n            just_bool: false,\n            maybe_bool: None,\n            default_bool: true,\n\n            just_enum: OptionalByte::None,\n            maybe_enum: None,\n            default_enum: OptionalByte::One,\n        }\n    );\n}\n"
  },
  {
    "path": "tests/rust_usage_test/tests/vtable_zeroed_test.rs",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//! Regression test for https://github.com/google/flatbuffers/issues/8894\n//!\n//! Tests that vtable memory is properly zeroed when building FlatBuffers.\n\nextern crate alloc;\nextern crate flatbuffers;\n\nuse alloc::vec;\nuse alloc::vec::Vec;\nuse core::convert::Infallible;\nuse core::cmp::max;\nuse core::ops::{Deref, DerefMut};\nuse core::ptr::write_bytes;\n\nuse flatbuffers::{Allocator, FlatBufferBuilder};\n\n/// Custom allocator that pre-fills buffer with garbage (0xAA) to detect\n/// uninitialized memory bugs.\nstruct GarbageFilledAllocator(Vec<u8>);\n\nimpl GarbageFilledAllocator {\n    fn new(size: usize) -> Self {\n        Self(vec![0xAA; size])\n    }\n}\n\nimpl Deref for GarbageFilledAllocator {\n    type Target = [u8];\n    fn deref(&self) -> &Self::Target {\n        &self.0\n    }\n}\n\nimpl DerefMut for GarbageFilledAllocator {\n    fn deref_mut(&mut self) -> &mut Self::Target {\n        &mut self.0\n    }\n}\n\n// SAFETY: grow_downwards properly moves data and the new space is filled with garbage\n// (intentionally, to detect bugs where code assumes zeroed memory)\nunsafe impl Allocator for GarbageFilledAllocator {\n    type Error = Infallible;\n\n    fn grow_downwards(&mut self) -> Result<(), Self::Error> {\n        let old_len = self.0.len();\n        let new_len = max(1, old_len * 2);\n\n        // Resize and fill new space with garbage\n        self.0.resize(new_len, 0xAA);\n\n        if new_len == 1 {\n            return Ok(());\n        }\n\n        // Move old data to the end\n        let middle = new_len / 2;\n        {\n            let (left, right) = &mut self.0[..].split_at_mut(middle);\n            right.copy_from_slice(left);\n        }\n        // Fill old space with garbage (NOT zeros)\n        {\n            let ptr = self.0[..middle].as_mut_ptr();\n            unsafe {\n                write_bytes(ptr, 0xAA, middle);\n            }\n        }\n        Ok(())\n    }\n\n    fn len(&self) -> usize {\n        self.0.len()\n    }\n}\n\n/// Regression test for https://github.com/google/flatbuffers/issues/8894\n///\n/// The bug: write_vtable() called make_space() which only reserves memory\n/// but doesn't zero it. If the allocator's buffer contains garbage data,\n/// vtable entries for fields with default values would contain garbage\n/// instead of zero (which indicates \"use default\").\n///\n/// This test uses a garbage-filled allocator to detect if vtable memory\n/// is properly zeroed before being written.\n#[test]\nfn test_vtable_zeroed_with_garbage_allocator() {\n    // Create a builder with garbage-filled allocator\n    let allocator = GarbageFilledAllocator::new(256);\n    let mut builder: FlatBufferBuilder<GarbageFilledAllocator> =\n        FlatBufferBuilder::new_in(allocator);\n\n    // Start a table\n    let table_start = builder.start_table();\n\n    // Set a field at a HIGH slot ID (14) to force a larger vtable.\n    // This leaves slots 4, 6, 8, 10, 12 unset (should be zero).\n    // VTable layout: [vtable_size:2][table_size:2][field0:2][field1:2][field2:2][field3:2][field4:2][field5:2]\n    // Offsets:           0              2            4         6         8        10        12        14\n    builder.push_slot::<u32>(14, 42, 0); // Set field 5 (at vtable offset 14) to 42\n\n    // End the table - this calls write_vtable()\n    let table_end = builder.end_table(table_start);\n\n    // Finish the buffer\n    builder.finish(table_end, None);\n\n    let data = builder.finished_data();\n\n    // Read the root table offset (first 4 bytes, little-endian)\n    let root_offset = u32::from_le_bytes([data[0], data[1], data[2], data[3]]) as usize;\n    let table_pos = root_offset;\n\n    // Read the vtable offset (signed, at table position)\n    let vtable_offset = i32::from_le_bytes([\n        data[table_pos],\n        data[table_pos + 1],\n        data[table_pos + 2],\n        data[table_pos + 3],\n    ]);\n    let vtable_pos = (table_pos as i32 - vtable_offset) as usize;\n\n    // Read vtable size (first 2 bytes of vtable)\n    let vtable_size = u16::from_le_bytes([data[vtable_pos], data[vtable_pos + 1]]) as usize;\n\n    // Verify vtable structure is as expected (16 bytes total for 6 fields + header)\n    assert_eq!(\n        vtable_size, 16,\n        \"VTable should be 16 bytes (4 header + 6*2 fields)\"\n    );\n\n    // Check that unset fields (at offsets 4, 6, 8, 10, 12) are zero.\n    // Only field at offset 14 was set.\n    // If the bug exists, unset fields would be 0xAAAA instead of 0.\n    for i in [4_usize, 6, 8, 10, 12] {\n        let field_offset = u16::from_le_bytes([data[vtable_pos + i], data[vtable_pos + i + 1]]);\n        assert_eq!(\n            field_offset, 0,\n            \"Vtable entry at offset {} should be 0 (default), but was 0x{:04X}. \\\n             This indicates uninitialized vtable memory (issue #8894).\",\n            i, field_offset\n        );\n    }\n\n    // Verify the field we DID set has a non-zero offset\n    let field5_offset = u16::from_le_bytes([data[vtable_pos + 14], data[vtable_pos + 14 + 1]]);\n    assert_ne!(field5_offset, 0, \"Field 5 should have a non-zero offset\");\n}\n"
  },
  {
    "path": "tests/service_test.fbs",
    "content": "namespace example;\n\ntable HelloRequest {}\ntable HelloResponse {}\n\nrpc_service HelloService {\n  Hello(HelloRequest):HelloResponse;\n  StreamClient(HelloRequest):HelloResponse (streaming: \"client\");\n  StreamServer(HelloRequest):HelloResponse (streaming: \"server\");\n  Stream(HelloRequest):HelloResponse (streaming: \"bidi\");\n}\n"
  },
  {
    "path": "tests/service_test_generated.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: example\n\nimport flatbuffers\nclass HelloRequest(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = HelloRequest()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsHelloRequest(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    # HelloRequest\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\ndef HelloRequestStart(builder):\n    builder.StartObject(0)\n\ndef HelloRequestEnd(builder):\n    return builder.EndObject()\n\n\n\nclass HelloResponse(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = HelloResponse()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsHelloResponse(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    # HelloResponse\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\ndef HelloResponseStart(builder):\n    builder.StartObject(0)\n\ndef HelloResponseEnd(builder):\n    return builder.EndObject()\n\n\n\n"
  },
  {
    "path": "tests/service_test_generated.pyi",
    "content": "from __future__ import annotations\n\nimport flatbuffers\n\nimport typing\n\nuoffset: typing.TypeAlias = flatbuffers.number_types.UOffsetTFlags.py_type\n\nclass HelloRequest(object):\n  @classmethod\n  def GetRootAs(cls, buf: bytes, offset: int) -> HelloRequest: ...\n  @classmethod\n  def GetRootAsHelloRequest(cls, buf: bytes, offset: int) -> HelloRequest: ...\n  def Init(self, buf: bytes, pos: int) -> None: ...\ndef HelloRequestStart(builder: flatbuffers.Builder) -> None: ...\ndef HelloRequestEnd(builder: flatbuffers.Builder) -> uoffset: ...\nclass HelloResponse(object):\n  @classmethod\n  def GetRootAs(cls, buf: bytes, offset: int) -> HelloResponse: ...\n  @classmethod\n  def GetRootAsHelloResponse(cls, buf: bytes, offset: int) -> HelloResponse: ...\n  def Init(self, buf: bytes, pos: int) -> None: ...\ndef HelloResponseStart(builder: flatbuffers.Builder) -> None: ...\ndef HelloResponseEnd(builder: flatbuffers.Builder) -> uoffset: ...\n\n"
  },
  {
    "path": "tests/service_test_grpc.fb.py",
    "content": "# Generated by the gRPC FlatBuffers compiler. DO NOT EDIT!\n\nimport flatbuffers\nimport grpc\nfrom service_test_generated import HelloRequest, HelloResponse\n\n\ndef _serialize_to_bytes(table):\n  buf = table._tab.Bytes\n  n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, 0)\n  if table._tab.Pos != n:\n    raise ValueError('must be a top-level table')\n  return bytes(buf)\n\n\nclass HelloServiceStub(object):\n  \"\"\"Interface exported by the server.\"\"\"\n\n  def __init__(self, channel):\n    \"\"\"Constructor.\n\n    Args:\n      channel: A grpc.Channel.\n    \"\"\"\n\n    self.Hello = channel.unary_unary(\n        method='/example.HelloService/Hello',\n        request_serializer=_serialize_to_bytes,\n        response_deserializer=HelloResponse.GetRootAs,\n    )\n\n    self.StreamClient = channel.stream_unary(\n        method='/example.HelloService/StreamClient',\n        request_serializer=_serialize_to_bytes,\n        response_deserializer=HelloResponse.GetRootAs,\n    )\n\n    self.StreamServer = channel.unary_stream(\n        method='/example.HelloService/StreamServer',\n        request_serializer=_serialize_to_bytes,\n        response_deserializer=HelloResponse.GetRootAs,\n    )\n\n    self.Stream = channel.stream_stream(\n        method='/example.HelloService/Stream',\n        request_serializer=_serialize_to_bytes,\n        response_deserializer=HelloResponse.GetRootAs,\n    )\n\n\nclass HelloServiceServicer(object):\n  \"\"\"Interface exported by the server.\"\"\"\n\n  def Hello(self, request, context):\n    context.set_code(grpc.StatusCode.UNIMPLEMENTED)\n    context.set_details('Method not implemented!')\n    raise NotImplementedError('Method not implemented!')\n\n  def StreamClient(self, request_iterator, context):\n    context.set_code(grpc.StatusCode.UNIMPLEMENTED)\n    context.set_details('Method not implemented!')\n    raise NotImplementedError('Method not implemented!')\n\n  def StreamServer(self, request, context):\n    context.set_code(grpc.StatusCode.UNIMPLEMENTED)\n    context.set_details('Method not implemented!')\n    raise NotImplementedError('Method not implemented!')\n\n  def Stream(self, request_iterator, context):\n    context.set_code(grpc.StatusCode.UNIMPLEMENTED)\n    context.set_details('Method not implemented!')\n    raise NotImplementedError('Method not implemented!')\n\n\ndef add_HelloServiceServicer_to_server(servicer, server):\n  rpc_method_handlers = {\n      'Hello': grpc.unary_unary_rpc_method_handler(\n          servicer.Hello,\n          request_deserializer=HelloRequest.GetRootAs,\n          response_serializer=_serialize_to_bytes,\n      ),\n      'StreamClient': grpc.stream_unary_rpc_method_handler(\n          servicer.StreamClient,\n          request_deserializer=HelloRequest.GetRootAs,\n          response_serializer=_serialize_to_bytes,\n      ),\n      'StreamServer': grpc.unary_stream_rpc_method_handler(\n          servicer.StreamServer,\n          request_deserializer=HelloRequest.GetRootAs,\n          response_serializer=_serialize_to_bytes,\n      ),\n      'Stream': grpc.stream_stream_rpc_method_handler(\n          servicer.Stream,\n          request_deserializer=HelloRequest.GetRootAs,\n          response_serializer=_serialize_to_bytes,\n      ),\n  }\n\n  generic_handler = grpc.method_handlers_generic_handler(\n      'example.HelloService', rpc_method_handlers\n  )\n\n  server.add_generic_rpc_handlers((generic_handler,))\n"
  },
  {
    "path": "tests/service_test_grpc.fb.pyi",
    "content": "# Generated by the gRPC FlatBuffers compiler. DO NOT EDIT!\n\nfrom __future__ import annotations\n\nimport grpc\nimport typing\n\nfrom service_test_generated import HelloRequest, HelloResponse\n\n\nclass HelloServiceStub(object):\n  def __init__(self, channel: grpc.Channel) -> None: ...\n  def Hello(self, request: HelloRequest) -> HelloResponse: ...\n  def StreamClient(self, request_iterator: typing.Iterator[HelloRequest]) -> HelloResponse: ...\n  def StreamServer(self, request: HelloRequest) -> typing.Iterator[HelloResponse]: ...\n  def Stream(self, request_iterator: typing.Iterator[HelloRequest]) -> typing.Iterator[HelloResponse]: ...\n\n\nclass HelloServiceServicer(object):\n  def Hello(self, request: HelloRequest, context: grpc.ServicerContext) -> HelloResponse: ...\n  def StreamClient(self, request_iterator: typing.Iterator[HelloRequest], context: grpc.ServicerContext) -> HelloResponse: ...\n  def StreamServer(self, request: HelloRequest, context: grpc.ServicerContext) -> typing.Iterator[HelloResponse]: ...\n  def Stream(self, request_iterator: typing.Iterator[HelloRequest], context: grpc.ServicerContext) -> typing.Iterator[HelloResponse]: ...\n\n\ndef add_HelloServiceServicer_to_server(servicer: HelloServiceServicer, server: grpc.Server) -> None: ...\n\n"
  },
  {
    "path": "tests/swift/Tests/Flatbuffers/ByteBufferTests.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport XCTest\n\n@testable import FlatBuffers\n\nfinal class ByteBufferTests: XCTestCase {\n  func testCopyingMemory() {\n    let count = 100\n    let ptr = UnsafeMutableRawPointer.allocate(byteCount: count, alignment: 1)\n    let byteBuffer = ByteBuffer(copyingMemoryBound: ptr, capacity: count)\n    byteBuffer.withUnsafeBytes { memory in\n      XCTAssertNotEqual(memory.baseAddress, ptr)\n    }\n  }\n\n  func testSamePointer() {\n    let count = 100\n    let ptr = UnsafeMutableRawPointer.allocate(byteCount: count, alignment: 1)\n    let byteBuffer = ByteBuffer(assumingMemoryBound: ptr, capacity: count)\n    byteBuffer.withUnsafeBytes { memory in\n      XCTAssertEqual(memory.baseAddress!, ptr)\n    }\n  }\n\n  func testSameDataPtr() {\n    let count = 100\n    let ptr = Data(repeating: 0, count: count)\n    let byteBuffer = ByteBuffer(data: ptr)\n    byteBuffer.withUnsafeBytes { memory in\n      ptr.withUnsafeBytes { ptr in\n        XCTAssertEqual(memory.baseAddress!, ptr.baseAddress!)\n      }\n    }\n  }\n\n  func testSameArrayPtr() {\n    let count = 100\n    let ptr: [UInt8] = Array(repeating: 0, count: count)\n    let byteBuffer = ByteBuffer(bytes: ptr)\n    ptr.withUnsafeBytes { ptr in\n      byteBuffer.withUnsafeBytes { memory in\n        XCTAssertEqual(memory.baseAddress, ptr.baseAddress)\n      }\n    }\n  }\n\n  func testReadingDoubleBuffer() {\n    let count = 8\n    let array: [Double] = Array(repeating: 8.8, count: count)\n    var oldBuffer = _InternalByteBuffer(initialSize: 16)\n    oldBuffer.push(elements: array)\n    let bytes: [Byte] = oldBuffer.withUnsafeBytes { bytes in\n      Array(bytes)\n    }\n    let byteBuffer = ByteBuffer(bytes: bytes)\n    byteBuffer.withUnsafePointerToSlice(index: 0, count: count) { ptr in\n      XCTAssertEqual(ptr.count, count)\n      bytes.withUnsafeBufferPointer {\n        XCTAssertEqual(\n          UnsafeRawPointer($0.baseAddress),\n          UnsafeRawPointer(ptr.baseAddress))\n      }\n    }\n  }\n\n  func testReadingNativeStructs() {\n    let array = [\n      MyGame_Example_Vec3(\n        x: 3.2,\n        y: 3.2,\n        z: 3.2,\n        test1: 8,\n        test2: .red,\n        test3: MyGame_Example_Test(a: 8, b: 8)),\n      MyGame_Example_Vec3(\n        x: 3.2,\n        y: 3.2,\n        z: 3.2,\n        test1: 8,\n        test2: .green,\n        test3: MyGame_Example_Test(a: 16, b: 16)),\n      MyGame_Example_Vec3(\n        x: 3.2,\n        y: 3.2,\n        z: 3.2,\n        test1: 8,\n        test2: .blue,\n        test3: MyGame_Example_Test(a: 32, b: 32)),\n    ]\n    let count = array.count\n    var oldBuffer = _InternalByteBuffer(initialSize: 16)\n    oldBuffer.push(elements: array)\n    let bytes: [Byte] = oldBuffer.withUnsafeBytes { bytes in\n      Array(bytes)\n    }\n    let byteBuffer = ByteBuffer(bytes: bytes)\n    byteBuffer\n      .withUnsafePointerToSlice(index: 0, count: count) { bufferPointer in\n        XCTAssertEqual(bufferPointer.count, count)\n        bytes.withUnsafeBufferPointer { ptr in\n          XCTAssertEqual(\n            UnsafeRawPointer(ptr.baseAddress),\n            UnsafeRawPointer(bufferPointer.baseAddress))\n        }\n      }\n  }\n}\n\nprivate struct TestNativeStructs: NativeStruct {\n  let x: Double\n  let y: Double\n  let z: Int\n}\n\nextension MyGame_Example_Color: CaseIterable {\n  public static var allCases: [MyGame_Example_Color] = [.red, .blue, .green]\n}\n"
  },
  {
    "path": "tests/swift/Tests/Flatbuffers/FlatBuffersArraysTests.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#if compiler(>=6.2)\n\nimport XCTest\n\n@testable import FlatBuffers\n\n@available(macOS 26.0, iOS 26.0, watchOS 26.0, tvOS 26.0, *)\nfinal class FlatBuffersArraysTests: XCTestCase {\n\n  func testStructSizes() {\n    XCTAssertEqual(MemoryLayout<MyGame_Example_NestedStruct>.size, 32)\n    XCTAssertEqual(MemoryLayout<MyGame_Example_ArrayStruct>.size, 160)\n  }\n\n  func testGoldenData() {\n    // swiftformat:disable all\n    let data: [UInt8] = [\n      20, 0, 0, 0, 65, 82, 82, 84, 0, 0, 0, 0, 0, 0, 6, 0, 164, 0, 4, 0, 6,\n      0, 0, 0, 164, 112, 69, 65, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0,\n      0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 10,\n      0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0,\n      0, 129, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 2, 0, 0, 0, 0, 2, 1,\n      0, 0, 0, 0, 0, 136, 119, 102, 85, 68, 51, 34, 17, 120, 136, 153, 170,\n      187, 204, 221, 238, 3, 0, 0, 0, 252, 255, 255, 255, 1, 1, 0, 0, 0, 0,\n      0, 0, 120, 136, 153, 170, 187, 204, 221, 238, 136, 119, 102, 85, 68,\n      51, 34, 17, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 255,\n      255, 255, 255, 255, 255, 255, 127\n    ]\n    // swiftformat:enable all\n\n    XCTAssertEqual(data, createArrayTable())\n  }\n\n  func testData() throws {\n    var buf = ByteBuffer(bytes: createArrayTable())\n    let table: MyGame_Example_ArrayTable = try getCheckedRoot(\n      byteBuffer: &buf,\n      fileId: \"ARRT\")\n    verifyNativeStruct(a: table.a)\n    verifyMutations(in: table)\n    verifyNativeStruct(a: table.a)\n  }\n\n  func testObjectAPI() throws {\n    var buf = ByteBuffer(bytes: createArrayTable())\n    let table: MyGame_Example_ArrayTable = try getCheckedRoot(\n      byteBuffer: &buf,\n      fileId: \"ARRT\")\n    verifyNativeStruct(a: table.unpack().a)\n  }\n\n  func testDefaults() {\n    XCTAssertEqual(\n      MyGame_Example_NestedStruct(),\n      MyGame_Example_NestedStruct(\n        a: [0, 0],\n        b: .a,\n        c: [0, 0],\n        d: [0, 0]))\n  }\n\n  func verifyNativeStruct(a: MyGame_Example_ArrayStruct?) {\n    let a = a!\n    XCTAssertEqual(a.a, 12.34)\n    XCTAssertEqual(a.b.count, 15)\n    var sum: Int32 = 0\n    for i in a.b.startIndex..<a.b.endIndex {\n      sum += a.b[i]\n    }\n    XCTAssertEqual(sum, 120)\n    XCTAssertEqual(a.c, -127)\n    XCTAssertEqual(a.d.count, 2)\n    let nestedStruct1 = a.d[0]\n    XCTAssertEqual(nestedStruct1.a.toArray(), [-1, 2])\n    XCTAssertEqual(nestedStruct1.b, .a)\n    XCTAssertEqual(nestedStruct1.c.toArray(), [.c, .b])\n    XCTAssertEqual(\n      nestedStruct1.d.toArray(),\n      [0x1122334455667788, -0x1122334455667788])\n\n    let nestedStruct2 = a.d[1]\n    XCTAssertEqual(nestedStruct2.a.toArray(), [3, -4])\n    XCTAssertEqual(nestedStruct2.b, .b)\n    XCTAssertEqual(nestedStruct2.c.toArray(), [.b, .a])\n    XCTAssertEqual(\n      nestedStruct2.d.toArray(),\n      [-0x1122334455667788, 0x1122334455667788])\n\n    XCTAssertEqual(a.e, 1)\n    XCTAssertEqual(a.f.count, 2)\n  }\n\n  func verifyMutations(in table: MyGame_Example_ArrayTable) {\n    let a = table.mutableA!\n    XCTAssertEqual(a.a, 12.34)\n    XCTAssertEqual(a.b.count, 15)\n    var sum: Int32 = 0\n    for i in a.b.startIndex..<a.b.endIndex {\n      sum += a.b[i]\n    }\n    XCTAssertEqual(sum, 120)\n    XCTAssertEqual(a.c, -127)\n    XCTAssertEqual(a.d.count, 2)\n    let nestedStruct1 = a.d[0]\n\n    XCTAssertEqual(nestedStruct1.a.reduce(0) { $0 + $1 }, 1)\n    XCTAssertEqual(nestedStruct1.b, .a)\n    XCTAssertEqual(nestedStruct1.c[0], .c)\n    XCTAssertEqual(nestedStruct1.c[1], .b)\n\n    let nestedStruct2 = a.d[1]\n    XCTAssertEqual(nestedStruct2.a.reduce(0) { $0 + $1 }, -1)\n    XCTAssertEqual(nestedStruct2.b, .b)\n    XCTAssertEqual(nestedStruct2.c[0], .b)\n    XCTAssertEqual(nestedStruct2.c[1], .a)\n    XCTAssertEqual(nestedStruct2.d[0], -0x1122334455667788)\n    XCTAssertEqual(nestedStruct2.d[1], 0x1122334455667788)\n\n    XCTAssertTrue(a.mutate(b: 1000, at: 0))\n    XCTAssertTrue(a.mutate(b: 2000, at: 1))\n\n    XCTAssertTrue(nestedStruct2.mutate(c: .a, at: 0))\n    XCTAssertTrue(nestedStruct2.mutate(c: .b, at: 1))\n\n    XCTAssertEqual(nestedStruct2.c[0], .a)\n    XCTAssertEqual(nestedStruct2.c[1], .b)\n\n    XCTAssertTrue(nestedStruct2.mutate(d: 0, at: 0))\n    XCTAssertTrue(nestedStruct2.mutate(d: 0, at: 1))\n\n    XCTAssertEqual(nestedStruct2.d.reduce(0) { $0 + $1 }, 0)\n\n    let nativeStruct = table.a?.d[1]\n\n    XCTAssertEqual(nativeStruct?.c[0], .a)\n    XCTAssertEqual(nativeStruct?.c[1], .b)\n\n    XCTAssertEqual(nativeStruct?.d[0], 0)\n    XCTAssertEqual(nativeStruct?.d[1], 0)\n\n    XCTAssertTrue(a.mutate(b: 1, at: 0))\n    XCTAssertTrue(a.mutate(b: 2, at: 1))\n\n    XCTAssertTrue(nestedStruct2.mutate(c: .b, at: 0))\n    XCTAssertTrue(nestedStruct2.mutate(c: .a, at: 1))\n\n    XCTAssertTrue(nestedStruct2.mutate(d: -0x1122334455667788, at: 0))\n    XCTAssertTrue(nestedStruct2.mutate(d: 0x1122334455667788, at: 1))\n  }\n\n  private func createArrayTable() -> [UInt8] {\n    var builder = FlatBufferBuilder(initialSize: 1024)\n\n    let nestedStruct1 = MyGame_Example_NestedStruct(\n      a: [-1, 2],\n      b: .a,\n      c: [\n        MyGame_Example_TestEnum.c.rawValue,\n        MyGame_Example_TestEnum.b.rawValue,\n      ],\n      d: [0x1122334455667788, -0x1122334455667788])\n\n    let nestedStruct2 = MyGame_Example_NestedStruct(\n      a: [3, -4],\n      b: .b,\n      c: [\n        MyGame_Example_TestEnum.b.rawValue,\n        MyGame_Example_TestEnum.a.rawValue,\n      ],\n      d: [-0x1122334455667788, 0x1122334455667788])\n\n    let arrayStruct = MyGame_Example_ArrayStruct(\n      a: 12.34,\n      b: [1, 2, 3, 4, 5, 6, 7, 8, 9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF],\n      c: -127,\n      d: [nestedStruct1, nestedStruct2],\n      e: 1,\n      f: [-0x8000000000000000, 0x7FFFFFFFFFFFFFFF])\n\n    let arrayTable = MyGame_Example_ArrayTable.createArrayTable(\n      &builder,\n      a: arrayStruct)\n    builder.finish(offset: arrayTable, fileId: \"ARRT\")\n\n    return builder.sizedByteArray\n  }\n}\n\n@available(macOS 26.0, iOS 26.0, watchOS 26.0, tvOS 26.0, *)\nextension MyGame_Example_NestedStruct: Equatable {\n  public static func == (\n    lhs: MyGame_Example_NestedStruct,\n    rhs: MyGame_Example_NestedStruct) -> Bool\n  {\n    lhs.a == rhs.a && lhs.c == rhs.c && lhs.d == rhs.d && lhs.b == rhs.b\n  }\n}\n\n@available(macOS 26.0, iOS 26.0, watchOS 26.0, tvOS 26.0, *)\nextension InlineArray: @retroactive Equatable where Element: Equatable {\n  public static func == (lhs: Self, rhs: Self) -> Bool {\n    guard lhs.count == rhs.count else { return false }\n\n    for i in 0..<lhs.count {\n      if lhs[i] != rhs[i] { return false }\n    }\n    return true\n  }\n\n  func toArray() -> [Element] {\n    var result: [Element] = []\n    for i in startIndex..<endIndex {\n      result.append(self[i])\n    }\n    return result\n  }\n}\n\n#endif\n\n"
  },
  {
    "path": "tests/swift/Tests/Flatbuffers/FlatBuffersMonsterWriterTests.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\nimport XCTest\n\n@testable import FlatBuffers\n\ntypealias Test = MyGame_Example_Test\ntypealias Monster = MyGame_Example_Monster\ntypealias Vec3 = MyGame_Example_Vec3\ntypealias Stat = MyGame_Example_Stat\n\nclass FlatBuffersMonsterWriterTests: XCTestCase {\n\n  func testData() {\n    // swiftformat:disable all\n    let data = Data([\n      48, 0, 0, 0, 77, 79, 78, 83, 0, 0, 0, 0, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28, 0,\n      0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0, 0, 0,\n      0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0, 0, 0,\n      80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64, 2, 0, 5,\n      0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10, 0, 20, 0,\n      152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1,\n      2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116,\n      49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0, 3, 0, 0, 0, 20,\n      0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255, 255, 255, 36, 0,\n      0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0, 0, 0, 87, 105, 108,\n      109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0, 0, 70, 114, 111, 100,\n      111, 0, 0, 0,\n    ])\n    // swiftformat:enable all\n    let _data = ByteBuffer(data: data)\n    readVerifiedMonster(fb: _data)\n  }\n\n  func testReadFromOtherLanguages() {\n    let path = {\n      #if os(macOS)\n      // Gets the current path of this test file then\n      // strips out the nested directories.\n      let filePath = URL(filePath: #file)\n        .deletingLastPathComponent()\n      return filePath.absoluteString\n      #else\n      return FileManager.default.currentDirectoryPath\n        .appending(\"/tests/swift/Tests/Flatbuffers\")\n      #endif\n    }()\n\n    let url = URL(string: path)!\n      .appendingPathComponent(\"monsterdata_test\")\n      .appendingPathExtension(\"mon\")\n\n    let data = FileManager.default.contents(atPath: url.path)!\n    let _data = ByteBuffer(data: data)\n\n    readVerifiedMonster(fb: _data)\n  }\n\n  func testCreateMonsterData() {\n    let bytes = createMonster(withPrefix: false)\n    var buffer = ByteBuffer(data: bytes.data)\n    let monster: MyGame_Example_Monster = getRoot(byteBuffer: &buffer)\n    readMonster(monster: monster)\n    mutateMonster(fb: bytes.buffer)\n    readMonster(monster: monster)\n  }\n\n  func testCreateMonsterResetTests() {\n    var builder = createMonster(withPrefix: false)\n    var buffer = ByteBuffer(data: builder.data)\n    let monster: MyGame_Example_Monster = getRoot(byteBuffer: &buffer)\n    readMonster(monster: monster)\n    builder.clear()\n    XCTAssertEqual(builder.capacity, 1)\n    XCTAssertEqual(builder.size, 0)\n\n    write(fbb: &builder, prefix: false)\n    var _buffer = ByteBuffer(data: builder.data)\n    XCTAssertEqual(_buffer.capacity, 304)\n    let _monster: MyGame_Example_Monster = getRoot(byteBuffer: &_buffer)\n    readMonster(monster: _monster)\n    builder.clear(keepingCapacity: true)\n    XCTAssertEqual(builder.capacity, 512)\n    XCTAssertEqual(builder.size, 0)\n  }\n\n  func testCreateMonster() {\n    let bytes = createMonster(withPrefix: false)\n    // swiftformat:disable all\n    XCTAssertEqual(\n      bytes.sizedByteArray,\n      [\n        48, 0, 0, 0, 77, 79, 78, 83, 0, 0, 0, 0, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28,\n        0, 0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0,\n        0, 0, 0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0,\n        0, 0, 80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64,\n        2, 0, 5, 0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10,\n        0, 20, 0, 152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0,\n        0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116,\n        101, 115, 116, 49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0,\n        3, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255,\n        255, 255, 36, 0, 0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0,\n        0, 0, 87, 105, 108, 109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0,\n        0, 70, 114, 111, 100, 111, 0, 0, 0,\n      ])\n    // swiftformat:enable all\n    var buffer = bytes.buffer\n\n    let monster: MyGame_Example_Monster = getRoot(byteBuffer: &buffer)\n    readMonster(monster: monster)\n    mutateMonster(fb: bytes.buffer)\n    readMonster(monster: monster)\n  }\n\n  func testCreateMonsterResizedBuffer() {\n    let bytes = createMonster(withPrefix: false)\n    // swiftformat:disable all\n    XCTAssertEqual(\n      bytes.sizedByteArray,\n      [\n        48, 0, 0, 0, 77, 79, 78, 83, 0, 0, 0, 0, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28,\n        0, 0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0,\n        0, 0, 0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0,\n        0, 0, 80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64,\n        2, 0, 5, 0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10,\n        0, 20, 0, 152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0,\n        0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116,\n        101, 115, 116, 49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0,\n        3, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255,\n        255, 255, 36, 0, 0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0,\n        0, 0, 87, 105, 108, 109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0,\n        0, 70, 114, 111, 100, 111, 0, 0, 0,\n      ])\n    // swiftformat:enable all\n    readVerifiedMonster(fb: bytes.sizedBuffer)\n  }\n\n  func testCreateMonsterPrefixed() {\n    let bytes = createMonster(withPrefix: true)\n    // swiftformat:disable all\n    XCTAssertEqual(\n      bytes.sizedByteArray,\n      [\n        44, 1, 0, 0, 44, 0, 0, 0, 77, 79, 78, 83, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28,\n        0, 0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0,\n        0, 0, 0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0,\n        0, 0, 80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64,\n        2, 0, 5, 0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10,\n        0, 20, 0, 152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0,\n        0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116,\n        101, 115, 116, 49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0,\n        3, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255,\n        255, 255, 36, 0, 0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0,\n        0, 0, 87, 105, 108, 109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0,\n        0, 70, 114, 111, 100, 111, 0, 0, 0,\n      ])\n    // swiftformat:enable all\n\n    var buffer = bytes.buffer\n    readMonster(monster: getPrefixedSizeRoot(byteBuffer: &buffer))\n  }\n\n  func testCreateMonsterUsingCreateMonsterMethodWithNilPos() {\n    var fbb = FlatBufferBuilder(initialSize: 1)\n    let name = fbb.create(string: \"Frodo\")\n    let mStart = Monster.startMonster(&fbb)\n    Monster.add(name: name, &fbb)\n    let root = Monster.endMonster(&fbb, start: mStart)\n    fbb.finish(offset: root)\n    var buffer = fbb.sizedBuffer\n    let newMonster: Monster = getRoot(byteBuffer: &buffer)\n    XCTAssertNil(newMonster.pos)\n    XCTAssertEqual(newMonster.name, \"Frodo\")\n  }\n\n  func testCreateMonsterUsingCreateMonsterMethodWithPosX() {\n    var fbb = FlatBufferBuilder(initialSize: 1)\n    let name = fbb.create(string: \"Barney\")\n    let mStart = Monster.startMonster(&fbb)\n    Monster.add(\n      pos: MyGame_Example_Vec3(\n        x: 10,\n        y: 0,\n        z: 0,\n        test1: 0,\n        test2: .blue,\n        test3: .init()),\n      &fbb)\n    Monster.add(name: name, &fbb)\n    let root = Monster.endMonster(&fbb, start: mStart)\n    fbb.finish(offset: root)\n\n    var buffer = fbb.sizedBuffer\n    let newMonster: Monster = getRoot(byteBuffer: &buffer)\n    XCTAssertEqual(newMonster.pos!.x, 10)\n    XCTAssertEqual(newMonster.name, \"Barney\")\n  }\n\n  func testReadMonsterFromUnsafePointerWithoutCopying() {\n    // swiftformat:disable all\n    var array: [UInt8] = [\n      48, 0, 0, 0, 77, 79, 78, 83, 0, 0, 0, 0, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28, 0,\n      0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0, 0, 0,\n      0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0, 0, 0,\n      80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64, 2, 0, 5,\n      0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10, 0, 20, 0,\n      152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1,\n      2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116,\n      49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0, 3, 0, 0, 0, 20,\n      0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255, 255, 255, 36, 0,\n      0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0, 0, 0, 87, 105, 108,\n      109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0, 0, 70, 114, 111, 100,\n      111, 0, 0, 0,\n    ]\n    // swiftformat:enable all\n    let unpacked =\n      array\n        .withUnsafeMutableBytes { memory -> MyGame_Example_MonsterT in\n          var bytes = ByteBuffer(\n            assumingMemoryBound: memory.baseAddress!,\n            capacity: memory.count)\n          var monster: Monster = getRoot(byteBuffer: &bytes)\n          readFlatbufferMonster(monster: &monster)\n          let unpacked = monster.unpack()\n          return unpacked\n        }\n    readObjectApi(monster: unpacked)\n  }\n\n  func testArrayOfBools() {\n    let boolArray = [false, true, false, true, false, true, false]\n    var fbb = FlatBufferBuilder(initialSize: 1)\n    let name = fbb.create(string: \"Frodo\")\n    let bools = fbb.createVector(boolArray)\n\n    let root = Monster.createMonster(\n      &fbb,\n      nameOffset: name,\n      testarrayofboolsVectorOffset: bools)\n    fbb.finish(offset: root)\n    var buffer = fbb.sizedBuffer\n    let monster: Monster = getRoot(byteBuffer: &buffer)\n    let values = monster.testarrayofbools\n\n    XCTAssertEqual(boolArray.count, values.count)\n\n    for (index, bool) in monster.testarrayofbools.enumerated() {\n      XCTAssertEqual(bool, boolArray[index])\n    }\n  }\n\n  func readVerifiedMonster(fb: ByteBuffer) {\n    var byteBuffer = fb\n    XCTAssertNoThrow(\n      try readMonster(\n        monster: getCheckedRoot(\n          byteBuffer: &byteBuffer) as MyGame_Example_Monster))\n  }\n\n  func testUnalignedRead() {\n    // Aligned read\n    let fbb = createMonster(withPrefix: false)\n    let testAligned: () -> Bool = {\n      var buffer = fbb.sizedBuffer\n      var monster: Monster = getRoot(byteBuffer: &buffer)\n      self.readFlatbufferMonster(monster: &monster)\n      return true\n    }\n    XCTAssertEqual(testAligned(), true)\n    let testUnaligned: () -> Bool = {\n      var bytes: [UInt8] = [0x00]\n      bytes.append(contentsOf: fbb.sizedByteArray)\n      return bytes.withUnsafeMutableBytes { ptr in\n        guard var baseAddress = ptr.baseAddress else {\n          XCTFail(\"Base pointer is not defined\")\n          return false\n        }\n        baseAddress = baseAddress.advanced(by: 1)\n        let unlignedPtr = UnsafeMutableRawPointer(baseAddress)\n        var bytes = ByteBuffer(\n          assumingMemoryBound: unlignedPtr,\n          capacity: ptr.count - 1)\n        var monster: Monster = getRoot(byteBuffer: &bytes)\n        self.readFlatbufferMonster(monster: &monster)\n        return true\n      }\n    }\n    XCTAssertEqual(testUnaligned(), true)\n  }\n\n  func testReadingRemovedSizeUnalignedBuffer() {\n    // Aligned read\n    let fbb = createMonster(withPrefix: true)\n    let testUnaligned: () -> Bool = {\n      var bytes: [UInt8] = [0x00]\n      bytes.append(contentsOf: fbb.sizedByteArray)\n      return bytes.withUnsafeMutableBytes { ptr in\n        guard var baseAddress = ptr.baseAddress else {\n          XCTFail(\"Base pointer is not defined\")\n          return false\n        }\n        baseAddress = baseAddress.advanced(by: 1)\n        let unlignedPtr = UnsafeMutableRawPointer(baseAddress)\n        let bytes = ByteBuffer(\n          assumingMemoryBound: unlignedPtr,\n          capacity: ptr.count - 1)\n        var newBuf = FlatBuffersUtils.removeSizePrefix(bb: bytes)\n        var monster: Monster = getRoot(byteBuffer: &newBuf)\n        self.readFlatbufferMonster(monster: &monster)\n        return true\n      }\n    }\n    XCTAssertEqual(testUnaligned(), true)\n  }\n\n  func testCreateMessage() {\n    let fbb = createMonster(withPrefix: false)\n    let byteBuffer = fbb.buffer\n    let firstMessage = Message<Monster>(byteBuffer: byteBuffer)\n    firstMessage.withUnsafeReadableBytes { ptr in\n      var bytes = ByteBuffer(contiguousBytes: ptr, count: ptr.count)\n      var monster: Monster = getRoot(byteBuffer: &bytes)\n      self.readFlatbufferMonster(monster: &monster)\n    }\n\n    let secondByteBuffer = fbb.sizedBuffer\n    let secondMessage = Message<Monster>(byteBuffer: secondByteBuffer)\n    secondMessage.withUnsafeReadableBytes { ptr in\n      var bytes = ByteBuffer(contiguousBytes: ptr, count: ptr.count)\n      var monster: Monster = getRoot(byteBuffer: &bytes)\n      self.readFlatbufferMonster(monster: &monster)\n    }\n  }\n\n  func testForceRetainedObject() {\n    let byteBuffer = {\n      // swiftformat:disable all\n      var data: Data? = Data([\n        48, 0, 0, 0, 77, 79, 78, 83, 0, 0, 0, 0, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28,\n        0, 0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0,\n        0, 0, 0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0,\n        0, 0, 80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64,\n        2, 0, 5, 0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10,\n        0, 20, 0, 152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0,\n        0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116,\n        101, 115, 116, 49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0,\n        3, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255,\n        255, 255, 36, 0, 0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0,\n        0, 0, 87, 105, 108, 109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0,\n        0, 70, 114, 111, 100, 111, 0, 0, 0,\n      ])\n      // swiftformat:enable all\n      let buffer = ByteBuffer(data: data!)\n      data = nil\n      return buffer\n    }()\n    readVerifiedMonster(fb: byteBuffer)\n  }\n\n  func readMonster(monster: Monster) {\n    var monster = monster\n    readFlatbufferMonster(monster: &monster)\n    let unpacked: MyGame_Example_MonsterT? = monster.unpack()\n    readObjectApi(monster: unpacked!)\n    guard var buffer = unpacked?.serialize()\n    else { fatalError(\"Couldnt generate bytebuffer\") }\n    var newMonster: Monster = getRoot(byteBuffer: &buffer)\n    readFlatbufferMonster(monster: &newMonster)\n  }\n\n  func createMonster(withPrefix prefix: Bool) -> FlatBufferBuilder {\n    var fbb = FlatBufferBuilder(initialSize: 1)\n    write(fbb: &fbb, prefix: prefix)\n    return fbb\n  }\n\n  func write(fbb: inout FlatBufferBuilder, prefix: Bool = false) {\n    let names = [\n      fbb.create(string: \"Frodo\"),\n      fbb.create(string: \"Barney\"),\n      fbb.create(string: \"Wilma\"),\n    ]\n    var offsets: [Offset] = []\n    let start1 = Monster.startMonster(&fbb)\n    Monster.add(name: names[0], &fbb)\n    offsets.append(Monster.endMonster(&fbb, start: start1))\n    let start2 = Monster.startMonster(&fbb)\n    Monster.add(name: names[1], &fbb)\n    offsets.append(Monster.endMonster(&fbb, start: start2))\n    let start3 = Monster.startMonster(&fbb)\n    Monster.add(name: names[2], &fbb)\n    offsets.append(Monster.endMonster(&fbb, start: start3))\n\n    let sortedArray = Monster.sortVectorOfMonster(offsets: offsets, &fbb)\n\n    let str = fbb.create(string: \"MyMonster\")\n    let test1 = fbb.create(string: \"test1\")\n    let test2 = fbb.create(string: \"test2\")\n    let _inv: [Byte] = [0, 1, 2, 3, 4]\n    let inv = fbb.createVector(_inv)\n\n    let fred = fbb.create(string: \"Fred\")\n    let mon1Start = Monster.startMonster(&fbb)\n    Monster.add(name: fred, &fbb)\n    let mon2 = Monster.endMonster(&fbb, start: mon1Start)\n\n    let test4 = fbb.createVector(ofStructs: [\n      MyGame_Example_Test(a: 30, b: 40),\n      MyGame_Example_Test(a: 10, b: 20),\n    ])\n\n    let stringTestVector = fbb.createVector(ofOffsets: [test1, test2])\n    let mStart = Monster.startMonster(&fbb)\n    Monster.add(\n      pos: MyGame_Example_Vec3(\n        x: 1,\n        y: 2,\n        z: 3,\n        test1: 3,\n        test2: .green,\n        test3: .init(a: 5, b: 6)),\n      &fbb)\n    Monster.add(hp: 80, &fbb)\n    Monster.add(name: str, &fbb)\n    Monster.addVectorOf(inventory: inv, &fbb)\n    Monster.add(testType: .monster, &fbb)\n    Monster.add(test: mon2, &fbb)\n    Monster.addVectorOf(test4: test4, &fbb)\n    Monster.addVectorOf(testarrayofstring: stringTestVector, &fbb)\n    Monster.add(testbool: true, &fbb)\n    Monster.addVectorOf(testarrayoftables: sortedArray, &fbb)\n    let end = Monster.endMonster(&fbb, start: mStart)\n    Monster.finish(&fbb, end: end, prefix: prefix)\n  }\n\n  func mutateMonster(fb: ByteBuffer) {\n    var fb = fb\n\n    let monster: Monster = getRoot(byteBuffer: &fb)\n    XCTAssertFalse(monster.mutate(mana: 10))\n    XCTAssertEqual(monster.testarrayoftables[0].name, \"Barney\")\n    XCTAssertEqual(monster.testarrayoftables[1].name, \"Frodo\")\n    XCTAssertEqual(monster.testarrayoftables[2].name, \"Wilma\")\n\n    // Example of searching for a table by the key\n    XCTAssertNotNil(monster.testarrayoftablesBy(key: \"Frodo\"))\n    XCTAssertNotNil(monster.testarrayoftablesBy(key: \"Barney\"))\n    XCTAssertNotNil(monster.testarrayoftablesBy(key: \"Wilma\"))\n\n    XCTAssertEqual(monster.testType, .monster)\n\n    XCTAssertEqual(monster.mutate(inventory: 1, at: 0), true)\n    XCTAssertEqual(monster.mutate(inventory: 2, at: 1), true)\n    XCTAssertEqual(monster.mutate(inventory: 3, at: 2), true)\n    XCTAssertEqual(monster.mutate(inventory: 4, at: 3), true)\n    XCTAssertEqual(monster.mutate(inventory: 5, at: 4), true)\n\n    for i in 0..<monster.inventory.count {\n      XCTAssertEqual(monster.inventory[i], Byte(i + 1))\n    }\n\n    XCTAssertEqual(monster.mutate(inventory: 0, at: 0), true)\n    XCTAssertEqual(monster.mutate(inventory: 1, at: 1), true)\n    XCTAssertEqual(monster.mutate(inventory: 2, at: 2), true)\n    XCTAssertEqual(monster.mutate(inventory: 3, at: 3), true)\n    XCTAssertEqual(monster.mutate(inventory: 4, at: 4), true)\n\n    let vec = monster.mutablePos\n    XCTAssertEqual(vec?.x, 1)\n    XCTAssertTrue(vec?.mutate(x: 55.0) ?? false)\n    XCTAssertTrue(vec?.mutate(test1: 55) ?? false)\n    XCTAssertEqual(vec?.x, 55.0)\n    XCTAssertEqual(vec?.test1, 55.0)\n    XCTAssertTrue(vec?.mutate(x: 1) ?? false)\n    XCTAssertEqual(vec?.x, 1)\n    XCTAssertTrue(vec?.mutate(test1: 3) ?? false)\n\n    let mutableTest4 = monster.mutableTest4\n    let orignalValues = mutableTest4[0].a\n    XCTAssertEqual(mutableTest4[0].mutate(a: 100), true)\n    XCTAssertNotEqual(monster.test4[0].a, orignalValues)\n    XCTAssertEqual(monster.test4[0].a, 100)\n    XCTAssertEqual(mutableTest4[0].mutate(a: orignalValues), true)\n  }\n\n  func readFlatbufferMonster(monster: inout MyGame_Example_Monster) {\n    XCTAssertEqual(monster.hp, 80)\n    XCTAssertEqual(monster.mana, 150)\n    XCTAssertEqual(monster.name, \"MyMonster\")\n    let pos = monster.pos\n    XCTAssertEqual(pos?.x, 1)\n    XCTAssertEqual(pos?.y, 2)\n    XCTAssertEqual(pos?.z, 3)\n    XCTAssertEqual(pos?.test1, 3)\n    XCTAssertEqual(pos?.test2, .green)\n    let test = pos?.test3\n    XCTAssertEqual(test?.a, 5)\n    XCTAssertEqual(test?.b, 6)\n    XCTAssertEqual(monster.testType, .monster)\n    let monster2 = monster.test(type: Monster.self)\n    XCTAssertEqual(monster2?.name, \"Fred\")\n\n    XCTAssertEqual(monster.mutate(mana: 10), false)\n\n    XCTAssertEqual(monster.mana, 150)\n    XCTAssertEqual(monster.inventory.count, 5)\n    var sum: Byte = 0\n    for inventory in monster.inventory {\n      sum += inventory\n    }\n    XCTAssertEqual(sum, 10)\n\n    monster.withUnsafePointerToInventory { ptr, count in\n      var sum: UInt8 = 0\n      for pointee in ptr.startIndex..<ptr.endIndex {\n        sum += ptr[pointee]\n      }\n      XCTAssertEqual(sum, 10)\n    }\n\n    XCTAssertEqual(monster.test4.count, 2)\n\n    let test4 = monster.test4\n    var sum0 = 0\n    for test0 in test4 {\n      sum0 += Int(test0.a) + Int(test0.b)\n    }\n    XCTAssertEqual(sum0, 100)\n\n    monster.withUnsafePointerToTest4 { ptr, count in\n      guard let ptr = ptr.baseAddress else { return }\n\n      let bindedMemory: UnsafeBufferPointer<MyGame_Example_Test> =\n        UnsafeBufferPointer(\n          start: ptr.bindMemory(\n            to: MyGame_Example_Test.self,\n            capacity: count),\n          count: count)\n      var pointerSum = 0\n      for pointee in bindedMemory.startIndex..<bindedMemory.endIndex {\n        pointerSum += Int(bindedMemory[pointee].a) +\n          Int(bindedMemory[pointee].b)\n      }\n      XCTAssertEqual(pointerSum, 100)\n    }\n\n    let mutableTest4 = monster.mutableTest4\n    var sum2 = 0\n    for test0 in mutableTest4 {\n      sum2 += Int(test0.a) + Int(test0.b)\n    }\n    XCTAssertEqual(sum2, 100)\n\n    let stringArray = monster.testarrayofstring\n    XCTAssertEqual(stringArray.count, 2)\n    XCTAssertEqual(stringArray[0], \"test1\")\n    XCTAssertEqual(stringArray[1], \"test2\")\n    XCTAssertEqual(monster.testbool, true)\n\n    let array = monster.nameSegmentArray\n    XCTAssertEqual(String(bytes: array ?? [], encoding: .utf8), \"MyMonster\")\n\n    if 0 == monster.testarrayofbools.count {\n      XCTAssertEqual(monster.testarrayofbools.isEmpty, true)\n    } else {\n      XCTAssertEqual(monster.testarrayofbools.isEmpty, false)\n    }\n  }\n\n  func readObjectApi(monster: MyGame_Example_MonsterT) {\n    XCTAssertEqual(monster.hp, 80)\n    XCTAssertEqual(monster.mana, 150)\n    XCTAssertEqual(monster.name, \"MyMonster\")\n    let pos = monster.pos\n    XCTAssertEqual(pos?.x, 1)\n    XCTAssertEqual(pos?.y, 2)\n    XCTAssertEqual(pos?.z, 3)\n    XCTAssertEqual(pos?.test1, 3)\n    XCTAssertEqual(pos?.test2, .green)\n    let test = pos?.test3\n    XCTAssertEqual(test?.a, 5)\n    XCTAssertEqual(test?.b, 6)\n    let monster2 = monster.test?.value as? MyGame_Example_MonsterT\n    XCTAssertEqual(monster2?.name, \"Fred\")\n    XCTAssertEqual(monster.mana, 150)\n    monster.mana = 10\n    XCTAssertEqual(monster.mana, 10)\n    monster.mana = 150\n    XCTAssertEqual(monster.mana, 150)\n\n    XCTAssertEqual(monster.inventory.count, 5)\n    var sum: Byte = 0\n    for i in monster.inventory {\n      sum += i\n    }\n    XCTAssertEqual(sum, 10)\n    XCTAssertEqual(monster.test4.count, 2)\n    var sum0 = 0\n    for test in monster.test4 {\n      sum0 += Int(test.a) + Int(test.b)\n    }\n    XCTAssertEqual(sum0, 100)\n    XCTAssertEqual(monster.testbool, true)\n  }\n\n  func testEncoding() {\n    let fbb = createMonster(withPrefix: false)\n    var sizedBuffer = fbb.sizedBuffer\n    do {\n      struct Test: Decodable {\n        struct Pos: Decodable {\n          let x, y, z: Int\n        }\n        let hp: Int\n        let inventory: [UInt8]\n        let name: String\n        let pos: Pos\n      }\n      let reader: Monster = try getCheckedRoot(byteBuffer: &sizedBuffer)\n      let encoder = JSONEncoder()\n      encoder.keyEncodingStrategy = .convertToSnakeCase\n      let data = try encoder.encode(reader)\n      let decoder = JSONDecoder()\n      decoder.keyDecodingStrategy = .convertFromSnakeCase\n      let value = try decoder.decode(Test.self, from: data)\n      XCTAssertEqual(value.name, \"MyMonster\")\n      XCTAssertEqual(value.pos.x, 1)\n      XCTAssertEqual(value.pos.y, 2)\n      XCTAssertEqual(value.pos.z, 3)\n    } catch {\n      XCTFail(error.localizedDescription)\n    }\n  }\n\n  var jsonData: String {\n    \"\"\"\n    {\\\"hp\\\":80,\\\"inventory\\\":[0,1,2,3,4],\\\"test\\\":{\\\"name\\\":\\\"Fred\\\"},\\\"testarrayofstring\\\":[\\\"test1\\\",\\\"test2\\\"],\\\"testarrayoftables\\\":[{\\\"name\\\":\\\"Barney\\\"},{\\\"name\\\":\\\"Frodo\\\"},{\\\"name\\\":\\\"Wilma\\\"}],\\\"test4\\\":[{\\\"a\\\":30,\\\"b\\\":40},{\\\"a\\\":10,\\\"b\\\":20}],\\\"testbool\\\":true,\\\"test_type\\\":\\\"Monster\\\",\\\"pos\\\":{\\\"y\\\":2,\\\"test3\\\":{\\\"a\\\":5,\\\"b\\\":6},\\\"z\\\":3,\\\"x\\\":1,\\\"test1\\\":3,\\\"test2\\\":\\\"Green\\\"},\\\"name\\\":\\\"MyMonster\\\"}\n    \"\"\"\n  }\n\n  func testContiguousBytes() {\n    let byteArray: [UInt8] = [3, 1, 4, 1, 5, 9]\n    var fbb = FlatBufferBuilder(initialSize: 1)\n    let name = fbb.create(string: \"Frodo\")\n    let bytes = fbb.createVector(bytes: byteArray)\n    let root = Monster.createMonster(\n      &fbb,\n      nameOffset: name,\n      inventoryVectorOffset: bytes)\n    fbb.finish(offset: root)\n    var buffer = fbb.sizedBuffer\n    let monster: Monster = getRoot(byteBuffer: &buffer)\n    let values = monster.inventory\n\n    monster.withUnsafePointerToInventory { ptr, count in\n      let array = Array(ptr)\n      for (index, value) in values.enumerated() {\n        XCTAssertEqual(array[index], value)\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "tests/swift/Tests/Flatbuffers/FlatBuffersNanInfTests.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport XCTest\n\n@testable import FlatBuffers\n\nfinal class FlatBuffersNanInfTests: XCTestCase {\n\n  func createTestTable() -> FlatBufferBuilder {\n    var fbb = FlatBufferBuilder()\n    let msg = Swift_Tests_NanInfTable.createNanInfTable(\n      &fbb,\n      valueNan: .nan,\n      valueInf: .infinity,\n      valueNinf: -.infinity,\n      value: 100.0)\n    fbb.finish(offset: msg)\n    return fbb\n  }\n\n  func testInfNanBinary() {\n    let fbb = createTestTable()\n    let data = fbb.sizedByteArray\n\n    var buffer = ByteBuffer(bytes: data)\n    let table: Swift_Tests_NanInfTable = getRoot(byteBuffer: &buffer)\n    XCTAssert(table.defaultNan.isNaN)\n    XCTAssertEqual(table.defaultInf, .infinity)\n    XCTAssertEqual(table.defaultNinf, -.infinity)\n    XCTAssert(table.valueNan.isNaN)\n    XCTAssertEqual(table.valueInf, .infinity)\n    XCTAssertEqual(table.valueNinf, -.infinity)\n    XCTAssertEqual(table.value, 100.0)\n  }\n\n  func testInfNanJSON() {\n    let fbb = createTestTable()\n    var bb = fbb.sizedBuffer\n    do {\n      struct Test: Decodable {\n        let valueInf: Double\n        let value: Int\n        let valueNan: Double\n        let valueNinf: Double\n      }\n      let reader: Swift_Tests_NanInfTable = try getCheckedRoot(byteBuffer: &bb)\n      let encoder = JSONEncoder()\n      encoder.keyEncodingStrategy = .convertToSnakeCase\n      encoder.nonConformingFloatEncodingStrategy =\n        .convertToString(\n          positiveInfinity: \"inf\",\n          negativeInfinity: \"-inf\",\n          nan: \"nan\")\n      let data = try encoder.encode(reader)\n      let decoder = JSONDecoder()\n      decoder.nonConformingFloatDecodingStrategy = .convertFromString(\n        positiveInfinity: \"inf\",\n        negativeInfinity: \"-inf\",\n        nan: \"nan\")\n      decoder.keyDecodingStrategy = .convertFromSnakeCase\n      let value = try decoder.decode(Test.self, from: data)\n      XCTAssertEqual(value.value, 100)\n      XCTAssertEqual(value.valueInf, .infinity)\n      XCTAssertEqual(value.valueNinf, -.infinity)\n    } catch {\n      XCTFail(error.localizedDescription)\n    }\n  }\n\n}\n"
  },
  {
    "path": "tests/swift/Tests/Flatbuffers/FlatBuffersStructsTests.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport XCTest\n\n@testable import FlatBuffers\n\nfinal class FlatBuffersStructsTests: XCTestCase {\n\n  func testWritingAndMutatingBools() {\n    var fbb = FlatBufferBuilder()\n    let start = TestMutatingBool.startTestMutatingBool(&fbb)\n    TestMutatingBool.add(b: Property(property: false), &fbb)\n    let root = TestMutatingBool.endTestMutatingBool(&fbb, start: start)\n    fbb.finish(offset: root)\n\n    var buffer = fbb.sizedBuffer\n    let testMutatingBool: TestMutatingBool = getRoot(byteBuffer: &buffer)\n    let property = testMutatingBool.mutableB\n    XCTAssertEqual(property?.property, false)\n    property?.mutate(property: false)\n    XCTAssertEqual(property?.property, false)\n    property?.mutate(property: true)\n    XCTAssertEqual(property?.property, true)\n  }\n\n}\n\nstruct Vec: NativeStruct {\n  var x: Float32\n  var y: Float32\n  var z: Float32\n}\n"
  },
  {
    "path": "tests/swift/Tests/Flatbuffers/FlatBuffersTests.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport XCTest\n\n@testable import Common\n@testable import FlatBuffers\n\nfinal class FlatBuffersTests: XCTestCase {\n\n  let country = \"Norway\"\n\n  func testEndian() { XCTAssertEqual(isLitteEndian, true) }\n\n  func testOffset() {\n    let o = Offset()\n    let b = Offset(offset: 1)\n    XCTAssertEqual(o.isEmpty, true)\n    XCTAssertEqual(b.isEmpty, false)\n  }\n\n  func testCreateString() {\n    let helloWorld = \"Hello, world!\"\n    var b = FlatBufferBuilder(initialSize: 16)\n    XCTAssertEqual(b.create(string: country).o, 12)\n    XCTAssertEqual(b.create(string: helloWorld).o, 32)\n    b.clear()\n    XCTAssertEqual(b.create(string: helloWorld).o, 20)\n    XCTAssertEqual(b.create(string: country).o, 32)\n    b.clear()\n    XCTAssertEqual(b.create(string: String(repeating: \"a\", count: 257)).o, 264)\n  }\n\n  func testStartTable() {\n    var b = FlatBufferBuilder(initialSize: 16)\n    XCTAssertNoThrow(b.startTable(with: 0))\n    b.clear()\n    XCTAssertEqual(b.create(string: country).o, 12)\n    XCTAssertEqual(b.startTable(with: 0), 12)\n  }\n\n  func testCreateFinish() {\n    var b = FlatBufferBuilder(initialSize: 16)\n    let countryOff = Country.createCountry(\n      builder: &b,\n      name: country,\n      log: 200,\n      lan: 100)\n    b.finish(offset: countryOff)\n    // swiftformat:disable all\n    let v: [UInt8] = [\n      16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 4, 0, 8, 0, 12, 0, 10, 0, 0, 0, 12, 0, 0, 0, 100, 0, 0, 0,\n      200, 0, 0, 0, 6, 0, 0, 0, 78, 111, 114, 119, 97, 121, 0, 0,\n    ]\n    // swiftformat:enable all\n    XCTAssertEqual(b.sizedByteArray, v)\n  }\n\n  func testCreateFinishWithPrefix() {\n    var b = FlatBufferBuilder(initialSize: 16)\n    let countryOff = Country.createCountry(\n      builder: &b,\n      name: country,\n      log: 200,\n      lan: 100)\n    b.finish(offset: countryOff, addPrefix: true)\n    // swiftformat:disable all\n    let v: [UInt8] = [\n      44, 0, 0, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 4, 0, 8, 0, 12, 0, 10, 0, 0, 0, 12, 0, 0, 0,\n      100, 0, 0, 0, 200, 0, 0, 0, 6, 0, 0, 0, 78, 111, 114, 119, 97, 121, 0, 0,\n    ]\n    // swiftformat:enable all\n    XCTAssertEqual(b.sizedByteArray, v)\n  }\n\n  func testReadCountry() {\n    // swiftformat:disable all\n    let v: [UInt8] = [\n      16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 4, 0, 8, 0, 12, 0, 10, 0, 0, 0, 12, 0, 0, 0, 100, 0, 0, 0,\n      200, 0, 0, 0, 6, 0, 0, 0, 78, 111, 114, 119, 97, 121, 0, 0,\n    ]\n    // swiftformat:enable all\n    let buffer = ByteBuffer(bytes: v)\n    let c = Country.getRootAsCountry(buffer)\n    XCTAssertEqual(c.lan, 100)\n    XCTAssertEqual(c.log, 200)\n    XCTAssertEqual(c.nameVector, [78, 111, 114, 119, 97, 121])\n    XCTAssertEqual(c.name, country)\n  }\n\n  func testWriteNullableStrings() {\n    var b = FlatBufferBuilder()\n    XCTAssertTrue(b.create(string: nil).isEmpty)\n    XCTAssertTrue(b.createShared(string: nil).isEmpty)\n  }\n\n  func testWriteOptionalValues() {\n    var b = FlatBufferBuilder()\n    let root = optional_scalars_ScalarStuff.createScalarStuff(\n      &b,\n      justI8: 80,\n      maybeI8: nil,\n      justU8: 100,\n      maybeU8: 10,\n      maybeBool: true,\n      justEnum: .one,\n      maybeEnum: nil)\n    b.finish(offset: root)\n    var buffer = b.sizedBuffer\n    let scalarTable: optional_scalars_ScalarStuff = getRoot(byteBuffer: &buffer)\n    XCTAssertEqual(scalarTable.justI8, 80)\n    XCTAssertNil(scalarTable.maybeI8)\n    XCTAssertEqual(scalarTable.maybeBool, true)\n    XCTAssertEqual(scalarTable.defaultI8, 42)\n    XCTAssertEqual(scalarTable.justU8, 100)\n    XCTAssertEqual(scalarTable.maybeU8, 10)\n    XCTAssertEqual(scalarTable.justEnum, .one)\n    XCTAssertNil(scalarTable.maybeEnum)\n  }\n\n  func testAlignmentCrash() {\n    var builder = FlatBufferBuilder(initialSize: 256)\n\n    // Create two identical tables to trigger vtable deduplication\n    let str1 = builder.create(string: \"test\")\n    let start1 = builder.startTable(with: 1)\n    builder.add(offset: str1, at: 0)\n    _ = builder.endTable(at: start1)\n\n    // Second table triggers vtable comparison where crash occurs\n    let str2 = builder.create(string: \"crash\")\n    let start2 = builder.startTable(with: 1)\n    builder.add(offset: str2, at: 0)\n    _ = builder.endTable(at: start2)  // ← Crashes here on ARM64\n  }\n}\n\nclass Country {\n\n  static let offsets: (name: VOffset, lan: VOffset, lng: VOffset) = (4, 6, 8)\n  private var __t: Table\n\n  private init(_ t: Table) {\n    __t = t\n  }\n\n  var lan: Int32 {\n    let o = __t.offset(6)\n    return o == 0\n      ? 0\n      : __t.readBuffer(\n        of: Int32.self,\n        at: o)\n  }\n  var log: Int32 {\n    let o = __t.offset(8)\n    return o == 0\n      ? 0\n      : __t.readBuffer(\n        of: Int32.self,\n        at: o)\n  }\n  var nameVector: [UInt8]? { __t.getVector(at: 4) }\n  var name: String? {\n    let o = __t.offset(4)\n    return o == 0 ? nil : __t.string(at: o)\n  }\n\n  @inlinable\n  static func getRootAsCountry(_ bb: ByteBuffer) -> Country {\n    Country(\n      Table(\n        bb: bb,\n        position: Int32(bb.read(def: UOffset.self, position: 0))))\n  }\n\n  @inlinable\n  static func createCountry(\n    builder: inout FlatBufferBuilder,\n    name: String,\n    log: Int32,\n    lan: Int32) -> Offset\n  {\n    createCountry(\n      builder: &builder,\n      offset: builder.create(string: name),\n      log: log,\n      lan: lan)\n  }\n\n  @inlinable\n  static func createCountry(\n    builder: inout FlatBufferBuilder,\n    offset: Offset,\n    log: Int32,\n    lan: Int32) -> Offset\n  {\n    let _start = builder.startTable(with: 3)\n    Country.add(builder: &builder, lng: log)\n    Country.add(builder: &builder, lan: lan)\n    Country.add(builder: &builder, name: offset)\n    return Country.end(builder: &builder, startOffset: _start)\n  }\n\n  @inlinable\n  static func end(\n    builder: inout FlatBufferBuilder,\n    startOffset: UOffset) -> Offset\n  {\n    Offset(offset: builder.endTable(at: startOffset))\n  }\n\n  @inlinable\n  static func add(builder: inout FlatBufferBuilder, name: String) {\n    add(builder: &builder, name: builder.create(string: name))\n  }\n\n  @inlinable\n  static func add(builder: inout FlatBufferBuilder, name: Offset) {\n    builder.add(offset: name, at: Country.offsets.name)\n  }\n\n  @inlinable\n  static func add(builder: inout FlatBufferBuilder, lan: Int32) {\n    builder.add(element: lan, def: 0, at: Country.offsets.lan)\n  }\n\n  @inlinable\n  static func add(builder: inout FlatBufferBuilder, lng: Int32) {\n    builder.add(element: lng, def: 0, at: Country.offsets.lng)\n  }\n}\n"
  },
  {
    "path": "tests/swift/Tests/Flatbuffers/FlatBuffersUnionTests.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport XCTest\n\n@testable import FlatBuffers\n\nfinal class FlatBuffersUnionTests: XCTestCase {\n\n  func testCreateMonstor() {\n\n    var b = FlatBufferBuilder(initialSize: 20)\n    let dmg: Int16 = 5\n    let str = \"Axe\"\n    let axe = b.create(string: str)\n    let weapon = Weapon.createWeapon(builder: &b, offset: axe, dmg: dmg)\n    let weapons = b.createVector(ofOffsets: [weapon])\n    let root = LocalMonster.createMonster(\n      builder: &b,\n      offset: weapons,\n      equipment: .Weapon,\n      equippedOffset: weapon.o)\n    b.finish(offset: root)\n    let buffer = b.sizedByteArray\n    // swiftformat:disable all\n    XCTAssertEqual(\n      buffer,\n      [\n        16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 8, 0, 7, 0, 12, 0, 10, 0, 0, 0, 0, 0, 0, 1, 8, 0, 0, 0, 20,\n        0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 8, 0, 12, 0, 8, 0, 6, 0, 8, 0, 0, 0, 0, 0, 5, 0, 4, 0, 0,\n        0, 3, 0, 0, 0, 65, 120, 101, 0,\n      ])\n    // swiftformat:enable all\n    let monster = LocalMonster.getRootAsMonster(bb: ByteBuffer(bytes: buffer))\n    XCTAssertEqual(monster.weapon(at: 0)?.dmg, dmg)\n    XCTAssertEqual(monster.weapon(at: 0)?.name, str)\n    XCTAssertEqual(monster.weapon(at: 0)?.nameVector, [65, 120, 101])\n    let p: Weapon? = monster.equiped()\n    XCTAssertEqual(p?.dmg, dmg)\n    XCTAssertEqual(p?.name, str)\n    XCTAssertEqual(p?.nameVector, [65, 120, 101])\n  }\n\n  func testEndTableFinish() {\n    var builder = FlatBufferBuilder(initialSize: 20)\n    let sword = builder.create(string: \"Sword\")\n    let axe = builder.create(string: \"Axe\")\n    let weaponOne = Weapon.createWeapon(\n      builder: &builder,\n      offset: sword,\n      dmg: 3)\n    let weaponTwo = Weapon.createWeapon(builder: &builder, offset: axe, dmg: 5)\n    let name = builder.create(string: \"Orc\")\n    let inventory: [UInt8] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n    let inv = builder.createVector(inventory, size: 10)\n    let weapons = builder.createVector(ofOffsets: [weaponOne, weaponTwo])\n    let path = builder.createVector(ofStructs: [\n      Vec(x: 4.0, y: 5.0, z: 6.0),\n      Vec(x: 1.0, y: 2.0, z: 3.0),\n    ])\n    let orc = FinalMonster.createMonster(\n      builder: &builder,\n      position: Vec(x: 1, y: 2, z: 3),\n      hp: 300,\n      name: name,\n      inventory: inv,\n      color: .red,\n      weapons: weapons,\n      equipment: .Weapon,\n      equippedOffset: weaponTwo,\n      path: path)\n    builder.finish(offset: orc)\n    // swiftformat:disable all\n    XCTAssertEqual(\n      builder.sizedByteArray,\n      [\n        32, 0, 0, 0, 0, 0, 26, 0, 48, 0, 36, 0, 0, 0, 34, 0, 28, 0, 0, 0, 24, 0, 23, 0, 16, 0, 15,\n        0, 8, 0, 4, 0, 26, 0, 0, 0, 44, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 1, 60, 0, 0, 0, 0, 0, 0, 0,\n        64, 0, 0, 0, 76, 0, 0, 0, 0, 0, 44, 1, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, 0, 0,\n        0, 0, 128, 64, 0, 0, 160, 64, 0, 0, 192, 64, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, 0,\n        0, 0, 52, 0, 0, 0, 28, 0, 0, 0, 10, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 3, 0, 0, 0,\n        79, 114, 99, 0, 244, 255, 255, 255, 0, 0, 5, 0, 24, 0, 0, 0, 8, 0, 12, 0, 8, 0, 6, 0, 8, 0,\n        0, 0, 0, 0, 3, 0, 12, 0, 0, 0, 3, 0, 0, 0, 65, 120, 101, 0, 5, 0, 0, 0, 83, 119, 111, 114,\n        100, 0, 0, 0,\n      ])\n    // swiftformat:enable all\n  }\n\n  func testEnumVector() {\n    let vectorOfEnums: [ColorsNameSpace.RGB] = [.blue, .green]\n\n    var builder = FlatBufferBuilder(initialSize: 1)\n    let off = builder.createVector(vectorOfEnums)\n    let start = ColorsNameSpace.Monster.startMonster(&builder)\n    ColorsNameSpace.Monster.add(colors: off, &builder)\n    let end = ColorsNameSpace.Monster.endMonster(&builder, start: start)\n    builder.finish(offset: end)\n    // swiftformat:disable all\n    XCTAssertEqual(\n      builder.sizedByteArray,\n      [\n        12, 0, 0, 0, 0, 0, 6, 0, 8, 0, 4, 0, 6, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 1, 0,\n        0, 0,\n      ])\n    // swiftformat:enable all\n    let monster = ColorsNameSpace.Monster\n      .getRootAsMonster(bb: builder.sizedBuffer)\n    XCTAssertEqual(monster.colorsCount, 2)\n    let colors = monster.colors\n    XCTAssertEqual(colors[0], .blue)\n    XCTAssertEqual(colors[1], .green)\n  }\n\n  func testUnionVector() {\n    var fb = FlatBufferBuilder()\n\n    let swordDmg: Int32 = 8\n    let attackStart = Attacker.startAttacker(&fb)\n    Attacker.add(swordAttackDamage: swordDmg, &fb)\n    let attack = Attacker.endAttacker(&fb, start: attackStart)\n\n    let characterType: [Character] = [.belle, .mulan, .bookfan]\n\n    let characters = [\n      fb.create(struct: BookReader(booksRead: 7)),\n      attack,\n      fb.create(struct: BookReader(booksRead: 2)),\n    ]\n    let types = fb.createVector(characterType)\n    let characterVector = fb.createVector(ofOffsets: characters)\n    let end = Movie.createMovie(\n      &fb,\n      charactersTypeVectorOffset: types,\n      charactersVectorOffset: characterVector)\n    Movie.finish(&fb, end: end)\n\n    var buffer = fb.sizedBuffer\n    let movie: Movie = getRoot(byteBuffer: &buffer)\n    XCTAssertEqual(movie.charactersType.count, characterType.count)\n    XCTAssertEqual(movie.characters.count, characters.count)\n\n    let bufferCharactersType = movie.charactersType\n    for (index, element) in bufferCharactersType.enumerated() {\n      XCTAssertEqual(element, characterType[index])\n    }\n\n    XCTAssertEqual(\n      movie.characters(at: 0, type: BookReader_Mutable.self)?.booksRead,\n      7)\n    XCTAssertEqual(\n      movie.characters(at: 1, type: Attacker.self)?.swordAttackDamage,\n      swordDmg)\n    XCTAssertEqual(\n      movie.characters(at: 2, type: BookReader_Mutable.self)?.booksRead,\n      2)\n\n    var objc: MovieT? = movie.unpack()\n    XCTAssertEqual(\n      movie.charactersType.count, objc?.characters.count ?? 0)\n    XCTAssertEqual(\n      movie.characters(at: 0, type: BookReader_Mutable.self)?.booksRead,\n      (objc?.characters[0]?.value as? BookReader)?.booksRead)\n    fb.clear()\n    let newMovie = Movie.pack(&fb, obj: &objc)\n    fb.finish(offset: newMovie)\n\n    var _buffer = fb.sizedBuffer\n    let packedMovie: Movie = getRoot(byteBuffer: &_buffer)\n\n    XCTAssertEqual(\n      packedMovie.characters(at: 0, type: BookReader_Mutable.self)?.booksRead,\n      movie.characters(at: 0, type: BookReader_Mutable.self)?.booksRead)\n    XCTAssertEqual(\n      packedMovie.characters(at: 1, type: Attacker.self)?.swordAttackDamage,\n      movie.characters(at: 1, type: Attacker.self)?.swordAttackDamage)\n    XCTAssertEqual(\n      packedMovie.characters(at: 2, type: BookReader_Mutable.self)?.booksRead,\n      movie.characters(at: 2, type: BookReader_Mutable.self)?.booksRead)\n  }\n\n  func testStringUnion() {\n    let string = \"Awesome \\\\\\\\t\\t\\nstring!\"\n    var fb = FlatBufferBuilder()\n    let stringOffset = fb.create(string: string)\n    let characterType: [Character] = [.bookfan, .other]\n\n    let characters = [\n      fb.create(struct: BookReader(booksRead: 7)),\n      stringOffset,\n    ]\n    let types = fb.createVector(characterType)\n    let characterVector = fb.createVector(ofOffsets: characters)\n\n    let end = Movie.createMovie(\n      &fb,\n      mainCharacterType: .other,\n      mainCharacterOffset: Offset(offset: stringOffset.o),\n      charactersTypeVectorOffset: types,\n      charactersVectorOffset: characterVector)\n    Movie.finish(&fb, end: end)\n\n    var buffer = fb.sizedBuffer\n    let movie: Movie = getRoot(byteBuffer: &buffer)\n    XCTAssertEqual(movie.mainCharacter(type: String.self), string)\n    XCTAssertEqual(\n      movie.characters(at: 0, type: BookReader_Mutable.self)?.booksRead,\n      7)\n    XCTAssertEqual(movie.characters(at: 1, type: String.self), string)\n\n    var objc: MovieT? = movie.unpack()\n    XCTAssertEqual(objc?.mainCharacter?.value as? String, string)\n    XCTAssertEqual((objc?.characters[0]?.value as? BookReader)?.booksRead, 7)\n    XCTAssertEqual(objc?.characters[1]?.value as? String, string)\n    fb.clear()\n    let newMovie = Movie.pack(&fb, obj: &objc)\n    fb.finish(offset: newMovie)\n\n    var _buffer = fb.sizedBuffer\n    let packedMovie: Movie = getRoot(byteBuffer: &_buffer)\n    XCTAssertEqual(packedMovie.mainCharacter(type: String.self), string)\n    XCTAssertEqual(\n      packedMovie.characters(at: 0, type: BookReader_Mutable.self)?.booksRead,\n      7)\n    XCTAssertEqual(packedMovie.characters(at: 1, type: String.self), string)\n  }\n\n  func testEncoding() {\n    let string = \"Awesome \\\\\\\\t\\t\\nstring!\"\n    var fb = FlatBufferBuilder()\n\n    let stringOffset = fb.create(string: string)\n\n    let swordDmg: Int32 = 8\n    let attackStart = Attacker.startAttacker(&fb)\n    Attacker.add(swordAttackDamage: swordDmg, &fb)\n    let attack = Attacker.endAttacker(&fb, start: attackStart)\n\n    let characterType: [Character] = [.belle, .mulan, .bookfan, .other]\n\n    let characters = [\n      fb.create(struct: BookReader(booksRead: 7)),\n      attack,\n      fb.create(struct: BookReader(booksRead: 2)),\n      stringOffset,\n    ]\n    let types = fb.createVector(characterType)\n    let characterVector = fb.createVector(ofOffsets: characters)\n    let end = Movie.createMovie(\n      &fb,\n      charactersTypeVectorOffset: types,\n      charactersVectorOffset: characterVector)\n    Movie.finish(&fb, end: end)\n\n    var sizedBuffer = fb.sizedBuffer\n    do {\n      let reader: Movie = try getCheckedRoot(byteBuffer: &sizedBuffer)\n      let encoder = JSONEncoder()\n      encoder.keyEncodingStrategy = .convertToSnakeCase\n      encoder.outputFormatting = [.sortedKeys]\n      let data = try encoder.encode(reader)\n      XCTAssertEqual(String(data: data, encoding: .utf8), jsonData)\n    } catch {\n      XCTFail(error.localizedDescription)\n    }\n  }\n\n  var jsonData: String {\n    \"\"\"\n    {\"characters\":[{\"books_read\":7},{\"sword_attack_damage\":8},{\"books_read\":2},\"Awesome \\\\\\\\\\\\\\\\t\\\\t\\\\nstring!\"],\"characters_type\":[\"Belle\",\"MuLan\",\"BookFan\",\"Other\"]}\n    \"\"\"\n  }\n}\n\npublic enum ColorsNameSpace {\n\n  enum RGB: Int32, Enum, FlatbuffersVectorInitializable {\n    static var min: ColorsNameSpace.RGB { .red }\n\n    typealias T = Int32\n    static var byteSize: Int { MemoryLayout<Int32>.size }\n    var value: Int32 { rawValue }\n    case red = 0, green = 1, blue = 2\n  }\n\n  struct Monster: FlatBufferTable {\n    var __buffer: ByteBuffer! { _accessor.bb }\n\n    private var _accessor: Table\n    static func getRootAsMonster(bb: ByteBuffer) -> Monster {\n      Monster(\n        Table(\n          bb: bb,\n          position: Int32(bb.read(def: UOffset.self, position: bb.reader)) +\n            Int32(bb.reader)))\n    }\n\n    init(_ t: Table) { _accessor = t }\n    init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n    public var colorsCount: Int32 {\n      let o = _accessor.offset(4)\n      return o == 0\n        ? 0\n        : _accessor\n        .vector(count: o)\n    }\n\n    public var colors: FlatbufferVector<RGB> {\n      _accessor.vector(at: 4, byteSize: 4)\n    }\n\n    static func startMonster(_ fbb: inout FlatBufferBuilder) -> UOffset {\n      fbb\n        .startTable(with: 1)\n    }\n    static func add(colors: Offset, _ fbb: inout FlatBufferBuilder) {\n      fbb.add(\n        offset: colors,\n        at: 4)\n    }\n    static func endMonster(\n      _ fbb: inout FlatBufferBuilder,\n      start: UOffset)\n      -> Offset\n    {\n      let end = Offset(offset: fbb.endTable(at: start))\n      return end\n    }\n  }\n}\n\nenum Equipment: Byte { case none, Weapon }\n\nenum Color3: Int8 {\n  case red = 0\n  case green, blue\n}\n\nstruct FinalMonster {\n\n  @inlinable\n  static func createMonster(\n    builder: inout FlatBufferBuilder,\n    position: Vec,\n    hp: Int16,\n    name: Offset,\n    inventory: Offset,\n    color: Color3,\n    weapons: Offset,\n    equipment: Equipment = .none,\n    equippedOffset: Offset,\n    path: Offset) -> Offset\n  {\n    let start = builder.startTable(with: 11)\n    builder.create(struct: position, position: 4)\n    builder.add(element: hp, def: 100, at: 8)\n    builder.add(offset: name, at: 10)\n    builder.add(offset: inventory, at: 14)\n    builder.add(element: color.rawValue, def: Color3.green.rawValue, at: 16)\n    builder.add(offset: weapons, at: 18)\n    builder.add(\n      element: equipment.rawValue,\n      def: Equipment.none.rawValue,\n      at: 20)\n    builder.add(offset: equippedOffset, at: 22)\n    builder.add(offset: path, at: 24)\n    return Offset(offset: builder.endTable(at: start))\n  }\n}\n\nstruct LocalMonster {\n\n  private var __t: Table\n\n  init(_ fb: ByteBuffer, o: Int32) { __t = Table(bb: fb, position: o) }\n  init(_ t: Table) { __t = t }\n\n  func weapon(at index: Int32) -> Weapon? {\n    let o =\n      __t\n        .offset(4)\n    return o == 0\n      ? nil\n      : Weapon.assign(\n        __t.indirect(__t.vector(at: o) + (index * 4)),\n        __t.bb)\n  }\n\n  func equiped<T: FlatBufferTable>() -> T? {\n    let o = __t.offset(8)\n    return o == 0 ? nil : __t.union(o)\n  }\n\n  static func getRootAsMonster(bb: ByteBuffer) -> LocalMonster {\n    LocalMonster(\n      Table(\n        bb: bb,\n        position: Int32(bb.read(def: UOffset.self, position: 0))))\n  }\n\n  @inlinable\n  static func createMonster(\n    builder: inout FlatBufferBuilder,\n    offset: Offset,\n    equipment: Equipment = .none,\n    equippedOffset: UOffset) -> Offset\n  {\n    let start = builder.startTable(with: 3)\n    builder.add(element: equippedOffset, def: 0, at: 8)\n    builder.add(offset: offset, at: 4)\n    builder.add(\n      element: equipment.rawValue,\n      def: Equipment.none.rawValue,\n      at: 6)\n    return Offset(offset: builder.endTable(at: start))\n  }\n}\n\nstruct Weapon: FlatBufferTable {\n\n  var __buffer: ByteBuffer! { __t.bb }\n\n  static let offsets: (name: VOffset, dmg: VOffset) = (4, 6)\n  private var __t: Table\n\n  init(_ t: Table) { __t = t }\n  init(_ fb: ByteBuffer, o: Int32) { __t = Table(bb: fb, position: o) }\n\n  var dmg: Int16 {\n    let o = __t.offset(6)\n    return o == 0\n      ? 0\n      : __t.readBuffer(\n        of: Int16.self,\n        at: o)\n  }\n  var nameVector: [UInt8]? { __t.getVector(at: 4) }\n  var name: String? {\n    let o = __t.offset(4)\n    return o == 0 ? nil : __t.string(at: o)\n  }\n\n  static func assign(_ i: Int32, _ bb: ByteBuffer) -> Weapon {\n    Weapon(\n      Table(\n        bb: bb,\n        position: i))\n  }\n\n  @inlinable\n  static func createWeapon(\n    builder: inout FlatBufferBuilder,\n    offset: Offset,\n    dmg: Int16) -> Offset\n  {\n    let _start = builder.startTable(with: 2)\n    Weapon.add(builder: &builder, name: offset)\n    Weapon.add(builder: &builder, dmg: dmg)\n    return Weapon.end(builder: &builder, startOffset: _start)\n  }\n\n  @inlinable\n  static func end(\n    builder: inout FlatBufferBuilder,\n    startOffset: UOffset) -> Offset\n  {\n    Offset(offset: builder.endTable(at: startOffset))\n  }\n\n  @inlinable\n  static func add(builder: inout FlatBufferBuilder, name: Offset) {\n    builder.add(offset: name, at: Weapon.offsets.name)\n  }\n\n  @inlinable\n  static func add(builder: inout FlatBufferBuilder, dmg: Int16) {\n    builder.add(element: dmg, def: 0, at: Weapon.offsets.dmg)\n  }\n}\n"
  },
  {
    "path": "tests/swift/Tests/Flatbuffers/FlatBuffersVectorsTests.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport XCTest\n\n@testable import FlatBuffers\n\nfinal class FlatBuffersVectors: XCTestCase {\n\n  func testCreatingTwoCountries() {\n    let norway = \"Norway\"\n    let denmark = \"Denmark\"\n    var b = FlatBufferBuilder(initialSize: 20)\n    let noStr = b.create(string: norway)\n    let deStr = b.create(string: denmark)\n    let n = Country.createCountry(\n      builder: &b,\n      offset: noStr,\n      log: 888,\n      lan: 700)\n    let d = Country.createCountry(\n      builder: &b,\n      offset: deStr,\n      log: 200,\n      lan: 100)\n    let vector = [n, d]\n    let vectorOffset = b.createVector(ofOffsets: vector)\n    b.finish(offset: vectorOffset)\n    // swiftformat:disable all\n    XCTAssertEqual(\n      b.sizedByteArray,\n      [\n        4, 0, 0, 0, 2, 0, 0, 0, 48, 0, 0, 0, 16, 0, 0, 0, 0, 0, 10, 0, 18, 0, 4, 0, 8, 0, 12, 0, 10,\n        0, 0, 0, 40, 0, 0, 0, 100, 0, 0, 0, 200, 0, 0, 0, 0, 0, 10, 0, 16, 0, 4, 0, 8, 0, 12, 0, 10,\n        0, 0, 0, 24, 0, 0, 0, 188, 2, 0, 0, 120, 3, 0, 0, 7, 0, 0, 0, 68, 101, 110, 109, 97, 114,\n        107, 0, 6, 0, 0, 0, 78, 111, 114, 119, 97, 121, 0, 0,\n      ])\n    // swiftformat:enable all\n  }\n\n  func testCreateIntArray() {\n    let numbers: [Int32] = [1, 2, 3, 4, 5]\n    var b = FlatBufferBuilder(initialSize: 20)\n    let o = b.createVector(numbers, size: numbers.count)\n    b.finish(offset: o)\n    // swiftformat:disable all\n    XCTAssertEqual(\n      b.sizedByteArray,\n      [4, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0])\n    // swiftformat:enable all\n  }\n\n  func testCreateStructArray() {\n    struct Vec: NativeStruct {\n      let x, y, z: Float32\n    }\n    let vector: [Vec] = [\n      Vec(x: 1, y: 2, z: 3),\n      Vec(x: 4, y: 5, z: 6),\n      Vec(x: 7, y: 8, z: 9),\n    ]\n    var b = FlatBufferBuilder(initialSize: 100)\n    let o = b.createVector(ofStructs: vector)\n    b.finish(offset: o)\n    // swiftformat:disable all\n    XCTAssertEqual(\n      b.sizedByteArray,\n      [\n        4, 0, 0, 0, 3, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 128, 64, 0, 0, 160,\n        64, 0, 0, 192, 64, 0, 0, 224, 64, 0, 0, 0, 65, 0, 0, 16, 65,\n      ])\n    // swiftformat:enable all\n  }\n\n  func testCreateEmptyIntArray() {\n    let numbers: [Int32] = []\n    var b = FlatBufferBuilder(initialSize: 20)\n    let o = b.createVector(numbers, size: numbers.count)\n    b.finish(offset: o)\n    XCTAssertEqual(b.sizedByteArray, [4, 0, 0, 0, 0, 0, 0, 0])\n  }\n\n  func testCreateVectorOfStrings() {\n    let strs = [\"Denmark\", \"Norway\"]\n    var b = FlatBufferBuilder(initialSize: 20)\n    let o = b.createVector(ofStrings: strs)\n    b.finish(offset: o)\n    // swiftformat:disable all\n    XCTAssertEqual(\n      b.sizedByteArray,\n      [\n        4, 0, 0, 0, 2, 0, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 6, 0, 0, 0, 78, 111, 114, 119, 97, 121, 0,\n        0, 7, 0, 0, 0, 68, 101, 110, 109, 97, 114, 107, 0,\n      ])\n    // swiftformat:enable all\n  }\n  func testCreateSharedStringVector() {\n    let norway = \"Norway\"\n    let denmark = \"Denmark\"\n    var b = FlatBufferBuilder(initialSize: 20)\n    let noStr = b.createShared(string: norway)\n    let deStr = b.createShared(string: denmark)\n    let _noStr = b.createShared(string: norway)\n    let _deStr = b.createShared(string: denmark)\n    let v = [noStr, deStr, _noStr, _deStr]\n    let end = b.createVector(ofOffsets: v)\n    b.finish(offset: end)\n    // swiftformat:disable all\n    XCTAssertEqual(\n      b.sizedByteArray,\n      [\n        4, 0, 0, 0, 4, 0, 0, 0, 28, 0, 0, 0, 12, 0, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 68,\n        101, 110, 109, 97, 114, 107, 0, 6, 0, 0, 0, 78, 111, 114, 119, 97, 121, 0, 0,\n      ])\n    // swiftformat:enable all\n  }\n\n  func testReadInt32Array() {\n    let data: [Int32] = [1, 2, 3, 4, 5]\n    var b = FlatBufferBuilder(initialSize: 20)\n    let v = Numbers.createNumbersVector(b: &b, array: data)\n    let end = Numbers.createNumbers(b: &b, o: v)\n    b.finish(offset: end)\n    let number = Numbers.getRootAsNumbers(ByteBuffer(bytes: b.sizedByteArray))\n    for (index, num) in number.vArrayInt32.enumerated() {\n      XCTAssertEqual(num, data[index])\n    }\n  }\n\n  func testReadDoubleArray() {\n    let data: [Double] = [1, 2, 3, 4, 5]\n    var b = FlatBufferBuilder(initialSize: 20)\n    let v = Numbers.createNumbersVector(b: &b, array: data)\n    let end = Numbers.createNumbers(b: &b, o: v)\n    b.finish(offset: end)\n    let number = Numbers.getRootAsNumbers(ByteBuffer(bytes: b.sizedByteArray))\n    for (index, num) in number.vArrayDouble.enumerated() {\n      XCTAssertEqual(num, data[index])\n    }\n  }\n\n  func testHasForArray() {\n    var builder = FlatBufferBuilder(initialSize: 20)\n    let emptyVector = [UInt8]()\n    let emptyOffset = builder.createVector(emptyVector)\n    let nonEmptyVector = [1, 2, 3]\n    let nonEmptyVectorOffest = builder.createVector(nonEmptyVector)\n    let start = Swift_Tests_Vectors.startVectors(&builder)\n    Swift_Tests_Vectors.addVectorOf(empty: emptyOffset, &builder)\n    Swift_Tests_Vectors.addVectorOf(array: nonEmptyVectorOffest, &builder)\n    let finish = Swift_Tests_Vectors.endVectors(&builder, start: start)\n    builder.finish(offset: finish)\n\n    var byteBuffer = ByteBuffer(bytes: builder.sizedByteArray)\n    let msg: Swift_Tests_Vectors = getRoot(byteBuffer: &byteBuffer)\n    XCTAssertEqual(msg.none_.isEmpty, true)\n    XCTAssertEqual(msg.empty.isEmpty, true)\n    XCTAssertEqual(msg.empty.count, 0)\n    XCTAssertEqual(msg.array.isEmpty, false)\n    XCTAssertEqual(msg.array.count, 3)\n\n    for i in msg.array.startIndex..<msg.array.endIndex {\n      XCTAssertEqual(msg.array[i], 1 + UInt64(i))\n    }\n\n    let array = msg.withUnsafePointerToArray { ptr, count in\n      let ptr: UnsafeBufferPointer<UInt64> = UnsafeBufferPointer(\n        start: ptr.baseAddress?.bindMemory(\n          to: UInt64.self,\n          capacity: count),\n        count: count)\n      return Array(ptr)\n    }\n\n    XCTAssertEqual(array, [1, 2, 3])\n  }\n}\n\nstruct Numbers {\n\n  private var __t: Table\n\n  private init(_ t: Table) {\n    __t = t\n  }\n\n  @inlinable\n  static func getRootAsNumbers(_ bb: ByteBuffer) -> Numbers {\n    Numbers(\n      Table(\n        bb: bb,\n        position: Int32(bb.read(def: UOffset.self, position: 0))))\n  }\n\n  var vArrayInt: FlatbufferVector<Int> { __t.vector(at: 4, byteSize: 8) }\n  var vArrayInt32: FlatbufferVector<Int32> { __t.vector(at: 4, byteSize: 4) }\n  var vArrayDouble: FlatbufferVector<Double> { __t.vector(at: 4, byteSize: 8) }\n  var vArrayFloat: FlatbufferVector<Float32> { __t.vector(at: 4, byteSize: 4) }\n\n  static func createNumbersVector(\n    b: inout FlatBufferBuilder,\n    array: [Int]) -> Offset\n  {\n    b.createVector(array, size: array.count)\n  }\n\n  static func createNumbersVector(\n    b: inout FlatBufferBuilder,\n    array: [Int32]) -> Offset\n  {\n    b.createVector(array, size: array.count)\n  }\n\n  static func createNumbersVector(\n    b: inout FlatBufferBuilder,\n    array: [Double]) -> Offset\n  {\n    b.createVector(array, size: array.count)\n  }\n\n  static func createNumbersVector(\n    b: inout FlatBufferBuilder,\n    array: [Float32]) -> Offset\n  {\n    b.createVector(array, size: array.count)\n  }\n\n  static func createNumbers(b: inout FlatBufferBuilder, o: Offset) -> Offset {\n    let start = b.startTable(with: 1)\n    b.add(offset: o, at: 4)\n    return Offset(offset: b.endTable(at: start))\n  }\n}\n"
  },
  {
    "path": "tests/swift/Tests/Flatbuffers/FlatbuffersDoubleTests.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport XCTest\n\n@testable import FlatBuffers\n\nfinal class FlatBuffersDoubleTests: XCTestCase {\n\n  let country = \"Norway\"\n\n  func testCreateFinish() {\n    var b = FlatBufferBuilder(initialSize: 16)\n    let countryOff = CountryDouble.createCountry(\n      builder: &b,\n      name: country,\n      log: 200,\n      lan: 100)\n    b.finish(offset: countryOff)\n    // swiftformat:disable all\n    let v: [UInt8] = [\n      16, 0, 0, 0, 0, 0, 10, 0, 28, 0, 4, 0, 8, 0, 16, 0, 10,\n      0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 64, 0, 0, 0,\n      0, 0, 0, 105, 64, 0, 0, 0, 0, 6, 0, 0, 0, 78, 111, 114, 119,\n      97, 121, 0, 0,\n    ]\n    // swiftformat:enable all\n    XCTAssertEqual(b.sizedByteArray, v)\n  }\n\n  func testCreateFinishWithPrefix() {\n    var b = FlatBufferBuilder(initialSize: 16)\n    let countryOff = CountryDouble.createCountry(\n      builder: &b,\n      name: country,\n      log: 200,\n      lan: 100)\n    b.finish(offset: countryOff, addPrefix: true)\n    // swiftformat:disable all\n    let v: [UInt8] = [\n      60, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 28, 0, 4, 0, 8, 0, 16, 0, 10, 0, 0, 0, 24,\n      0, 0, 0, 0, 0,\n      0, 0, 0, 0, 89, 64, 0, 0, 0, 0, 0, 0, 105, 64, 0, 0, 0,\n      0, 6, 0, 0, 0, 78, 111, 114, 119, 97, 121, 0, 0,\n    ]\n    // swiftformat:enable all\n    XCTAssertEqual(b.sizedByteArray, v)\n  }\n}\n\nclass CountryDouble {\n\n  static let offsets: (name: VOffset, lan: VOffset, lng: VOffset) = (4, 6, 8)\n\n  private var table: Table\n\n  private init(table t: Table) { table = t }\n\n  static func getRootAsCountry(_ bb: ByteBuffer) -> CountryDouble {\n    let pos = bb.read(def: Int32.self, position: Int(bb.size))\n    return CountryDouble(table: Table(bb: bb, position: Int32(pos)))\n  }\n\n  static func createCountry(\n    builder: inout FlatBufferBuilder,\n    name: String,\n    log: Double,\n    lan: Double) -> Offset\n  {\n    createCountry(\n      builder: &builder,\n      offset: builder.create(string: name),\n      log: log,\n      lan: lan)\n  }\n\n  static func createCountry(\n    builder: inout FlatBufferBuilder,\n    offset: Offset,\n    log: Double,\n    lan: Double) -> Offset\n  {\n    let _start = builder.startTable(with: 3)\n    CountryDouble.add(builder: &builder, lng: log)\n    CountryDouble.add(builder: &builder, lan: lan)\n    CountryDouble.add(builder: &builder, name: offset)\n    return CountryDouble.end(builder: &builder, startOffset: _start)\n  }\n\n  static func end(\n    builder: inout FlatBufferBuilder,\n    startOffset: UOffset) -> Offset\n  {\n    Offset(offset: builder.endTable(at: startOffset))\n  }\n\n  static func add(builder: inout FlatBufferBuilder, name: String) {\n    add(builder: &builder, name: builder.create(string: name))\n  }\n\n  static func add(builder: inout FlatBufferBuilder, name: Offset) {\n    builder.add(offset: name, at: Country.offsets.name)\n  }\n\n  static func add(builder: inout FlatBufferBuilder, lan: Double) {\n    builder.add(element: lan, def: 0, at: Country.offsets.lan)\n  }\n\n  static func add(builder: inout FlatBufferBuilder, lng: Double) {\n    builder.add(element: lng, def: 0, at: Country.offsets.lng)\n  }\n}\n"
  },
  {
    "path": "tests/swift/Tests/Flatbuffers/FlatbuffersMoreDefaults.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\nimport XCTest\n\n@testable import FlatBuffers\n\nclass FlatBuffersMoreDefaults: XCTestCase {\n\n  func testFlatbuffersObject() {\n    var fbb = FlatBufferBuilder()\n    let root = MoreDefaults.createMoreDefaults(&fbb)\n    fbb.finish(offset: root)\n    var byteBuffer = fbb.sizedBuffer\n    let defaults: MoreDefaults = getRoot(byteBuffer: &byteBuffer)\n    XCTAssertEqual(defaults.emptyString, \"\")\n    XCTAssertEqual(defaults.someString, \"some\")\n    XCTAssertEqual(defaults.ints.isEmpty, true)\n    XCTAssertEqual(defaults.floats.isEmpty, true)\n    XCTAssertEqual(defaults.bools.isEmpty, true)\n    XCTAssertEqual(defaults.ints.count, 0)\n    XCTAssertEqual(defaults.floats.count, 0)\n    XCTAssertEqual(defaults.abcs.count, 0)\n    XCTAssertEqual(defaults.bools.count, 0)\n  }\n\n  func testFlatbuffersObjectAPI() {\n    var fbb = FlatBufferBuilder()\n    let defaults = MoreDefaultsT()\n    XCTAssertEqual(defaults.emptyString, \"\")\n    XCTAssertEqual(defaults.someString, \"some\")\n    XCTAssertEqual(defaults.ints, [])\n    XCTAssertEqual(defaults.floats, [])\n    XCTAssertEqual(defaults.abcs, [])\n    XCTAssertEqual(defaults.bools, [])\n\n    var buffer = defaults.serialize(builder: &fbb, type: MoreDefaults.self)\n    let fDefaults: MoreDefaults = getRoot(byteBuffer: &buffer)\n    XCTAssertEqual(fDefaults.emptyString, \"\")\n    XCTAssertEqual(fDefaults.someString, \"some\")\n    XCTAssertEqual(fDefaults.ints.isEmpty, true)\n    XCTAssertEqual(fDefaults.floats.isEmpty, true)\n    XCTAssertEqual(fDefaults.ints.count, 0)\n    XCTAssertEqual(fDefaults.floats.count, 0)\n    XCTAssertEqual(fDefaults.abcs.count, 0)\n    XCTAssertEqual(fDefaults.bools.count, 0)\n  }\n\n  func testEncoding() {\n    var fbb = FlatBufferBuilder()\n    let root = MoreDefaults.createMoreDefaults(&fbb)\n    fbb.finish(offset: root)\n    var sizedBuffer = fbb.sizedBuffer\n    do {\n      struct Test: Decodable {\n        var emptyString: String\n        var someString: String\n      }\n      let reader: MoreDefaults = try getCheckedRoot(byteBuffer: &sizedBuffer)\n      let encoder = JSONEncoder()\n      encoder.keyEncodingStrategy = .convertToSnakeCase\n      let data = try encoder.encode(reader)\n      let decoder = JSONDecoder()\n      decoder.keyDecodingStrategy = .convertFromSnakeCase\n      let value = try decoder.decode(Test.self, from: data)\n      XCTAssertEqual(value.someString, \"some\")\n      XCTAssertEqual(value.emptyString, \"\")\n    } catch {\n      XCTFail(error.localizedDescription)\n    }\n  }\n\n}\n"
  },
  {
    "path": "tests/swift/Tests/Flatbuffers/FlatbuffersVerifierTests.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport XCTest\n\n@testable import FlatBuffers\n\nfinal class FlatbuffersVerifierTests: XCTestCase {\n\n  var buffer: ByteBuffer!\n  var validFlatbuffersObject: ByteBuffer!\n  var invalidFlatbuffersObject: ByteBuffer!\n  var invalidFlatbuffersObject2: ByteBuffer!\n  var invalidFlatbuffersObject3: ByteBuffer!\n\n  override func setUp() {\n    // swiftformat:disable all\n    let memory = UnsafeMutableRawPointer.allocate(byteCount: 32, alignment: 1)\n    buffer = ByteBuffer(assumingMemoryBound: memory, capacity: 32)\n    add(buffer: &buffer, v: 4, p: 16)\n    add(buffer: &buffer, v: 4, p: 20)\n\n    validFlatbuffersObject = ByteBuffer(bytes: [\n      48, 0, 0, 0, 77, 79, 78, 83, 0, 0, 0, 0, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28, 0,\n      0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0, 0, 0,\n      0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0, 0, 0,\n      80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64, 2, 0, 5,\n      0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10, 0, 20, 0,\n      152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1,\n      2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116,\n      49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0, 3, 0, 0, 0, 20,\n      0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255, 255, 255, 36, 0,\n      0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0, 0, 0, 87, 105, 108,\n      109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0, 0, 70, 114, 111, 100,\n      111, 0, 0, 0,\n    ])\n\n    invalidFlatbuffersObject = ByteBuffer(bytes: [\n      0, 48, 0, 0, 0, 77, 79, 78, 83, 0, 0, 0, 0, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28,\n      0, 0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0, 0,\n      0, 0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0, 0,\n      0, 80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64, 2, 0,\n      5, 0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10, 0, 20,\n      0, 152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0, 0, 0, 0,\n      1, 2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115,\n      116, 49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0, 3, 0, 0, 0,\n      20, 0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255, 255, 255, 36,\n      0, 0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0, 0, 0, 87, 105,\n      108, 109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0, 0, 70, 114, 111,\n      100, 111, 0, 0, 0,\n    ])\n\n    // Array failure within a the inventory array\n    invalidFlatbuffersObject2 = ByteBuffer(bytes: [\n      48, 0, 0, 0, 77, 79, 78, 83, 0, 0, 0, 0, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28, 0,\n      0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0, 0, 0,\n      0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0, 0, 0,\n      80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64, 2, 0, 5,\n      0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10, 0, 20, 0,\n      152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1,\n      2, 0x00, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116, 101,\n      115, 116, 49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0, 3, 0,\n      0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255, 255,\n      255, 36, 0, 0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0, 0, 0,\n      87, 105, 108, 109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0, 0, 70,\n      114, 111, 100, 111, 0, 0, 0,\n    ])\n\n    // Array failure within a the strings array\n    invalidFlatbuffersObject3 = ByteBuffer(bytes: [\n      48, 0, 0, 0, 77, 79, 78, 83, 0, 0, 0, 0, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28, 0,\n      0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0, 0, 0,\n      0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0, 0, 0,\n      80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64, 2, 0, 5,\n      0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10, 0, 20, 0,\n      152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1,\n      2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116,\n      49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0, 3, 0, 0, 0, 20,\n      0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255, 255, 255, 36, 0,\n      0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0, 0, 0, 87, 105, 108,\n      109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0, 0, 70, 114, 111, 100,\n      0x00, 111, 0, 0, 0,\n    ])\n    // swiftformat:enable all\n  }\n\n  func testVeriferInitPassing() {\n    let memory = UnsafeMutableRawPointer.allocate(byteCount: 8, alignment: 1)\n    var buffer = ByteBuffer(\n      assumingMemoryBound: memory,\n      capacity: Int(FlatBufferMaxSize) - 1)\n    XCTAssertNoThrow(try Verifier(buffer: &buffer))\n  }\n\n  func testVeriferInitFailing() {\n    let memory = UnsafeMutableRawPointer.allocate(byteCount: 8, alignment: 1)\n    var buffer = ByteBuffer(\n      assumingMemoryBound: memory,\n      capacity: Int(FlatBufferMaxSize) + 1)\n    XCTAssertThrowsError(try Verifier(buffer: &buffer))\n  }\n\n  func testFailingID() {\n    let dutData: [UInt8] = [1, 2, 3, 4, 5, 6, 7]\n    var buff = ByteBuffer(bytes: dutData)\n    do {\n      let _: Monster = try getCheckedRoot(byteBuffer: &buff, fileId: \"ABCD\")\n      XCTFail(\"This should always fail\")\n    } catch {\n      XCTAssertEqual(error as? FlatbuffersErrors, .bufferDoesntContainID)\n    }\n  }\n\n  func testVerifierCheckAlignment() {\n    let verifier = try! Verifier(buffer: &buffer)\n    do {\n      try verifier.isAligned(position: 20, type: Int.self)\n    } catch {\n      XCTAssertEqual(\n        error as? FlatbuffersErrors,\n        .missAlignedPointer(position: 20, type: \"Int\"))\n    }\n    XCTAssertNoThrow(try verifier.isAligned(position: 16, type: Int.self))\n\n    let newVerifer = try! Verifier(buffer: &buffer, checkAlignment: false)\n    XCTAssertNoThrow(try newVerifer.isAligned(position: 16, type: Int.self))\n  }\n\n  func testRangeInBuffer() {\n    var verifier = try! Verifier(buffer: &buffer)\n    let size = MemoryLayout<Int64>.size\n    XCTAssertNoThrow(try verifier.rangeInBuffer(position: 24, size: size))\n    XCTAssertThrowsError(try verifier.rangeInBuffer(position: 26, size: size))\n    XCTAssertThrowsError(try verifier.rangeInBuffer(position: 26, size: size))\n    XCTAssertThrowsError(try verifier.rangeInBuffer(position: 30, size: size))\n    XCTAssertThrowsError(try verifier.rangeInBuffer(position: 32, size: size))\n    XCTAssertThrowsError(try verifier.rangeInBuffer(position: 34, size: size))\n\n    verifier = try! Verifier(\n      buffer: &buffer,\n      options: .init(maxDepth: 0, maxTableCount: 0, maxApparentSize: 4))\n    do {\n      try verifier.rangeInBuffer(position: 24, size: size)\n    } catch {\n      XCTAssertEqual(\n        error as! FlatbuffersErrors,\n        .apparentSizeTooLarge)\n    }\n  }\n\n  func testPositionInBuffer() {\n    let verifier = try! Verifier(buffer: &buffer)\n    XCTAssertNoThrow(try verifier.inBuffer(position: 0, of: Int64.self))\n    XCTAssertNoThrow(try verifier.inBuffer(position: 24, of: Int64.self))\n    XCTAssertThrowsError(try verifier.inBuffer(position: -9, of: Int64.self))\n    XCTAssertThrowsError(try verifier.inBuffer(position: 25, of: Int64.self))\n    XCTAssertThrowsError(try verifier.inBuffer(position: 26, of: Int32.self))\n    XCTAssertThrowsError(try verifier.inBuffer(position: 26, of: Int64.self))\n    XCTAssertThrowsError(try verifier.inBuffer(position: 30, of: Int64.self))\n    XCTAssertThrowsError(try verifier.inBuffer(position: 32, of: Int64.self))\n    XCTAssertThrowsError(try verifier.inBuffer(position: 34, of: Int64.self))\n  }\n\n  func testVisitTable() {\n    var verifier = try! Verifier(buffer: &validFlatbuffersObject)\n    XCTAssertNoThrow(try verifier.visitTable(at: 48))\n    verifier.reset()\n  }\n\n  func testTableVerifier() {\n    var verifier = try! Verifier(buffer: &validFlatbuffersObject)\n\n    var tableVerifer = try! verifier.visitTable(at: 48)\n    XCTAssertEqual(verifier.depth, 1)\n    XCTAssertEqual(verifier.tableCount, 1)\n\n    XCTAssertNoThrow(\n      try tableVerifer.visit(\n        field: 4,\n        fieldName: \"Vec\",\n        required: false,\n        type: Vec3.self))\n    XCTAssertNoThrow(\n      try tableVerifer.visit(\n        field: 8,\n        fieldName: \"hp\",\n        required: false,\n        type: Int16.self))\n\n    XCTAssertNoThrow(\n      try tableVerifer.visit(\n        field: 10,\n        fieldName: \"name\",\n        required: true,\n        type: ForwardOffset<String>.self))\n\n    XCTAssertNoThrow(\n      try tableVerifer.visit(\n        field: 14,\n        fieldName: \"inventory\",\n        required: false,\n        type: ForwardOffset<Vector<UInt8, UInt8>>.self))\n\n    XCTAssertNoThrow(\n      try tableVerifer.visit(\n        field: 22,\n        fieldName: \"test4\",\n        required: false,\n        type: ForwardOffset<Vector<MyGame_Example_Test, MyGame_Example_Test>>\n          .self))\n\n    XCTAssertNoThrow(\n      try tableVerifer.visit(\n        field: 24,\n        fieldName: \"Vector of strings\",\n        required: false,\n        type: ForwardOffset<Vector<ForwardOffset<String>, String>>.self))\n\n    do {\n      try tableVerifer.visit(\n        field: 13,\n        fieldName: \"notvalid\",\n        required: false,\n        type: Int16.self)\n    } catch {\n      XCTAssertEqual(\n        error as! FlatbuffersErrors,\n        .missAlignedPointer(position: 25, type: \"UInt16\"))\n    }\n\n    do {\n      try tableVerifer.visit(\n        unionKey: 18,\n        unionField: 20,\n        unionKeyName: \"testType\",\n        fieldName: \"test\",\n        required: false,\n        completion: { (verifier, key: MyGame_Example_Any_, pos) in\n          switch key {\n          case .none_:\n            break\n          case .monster:\n            try ForwardOffset<MyGame_Example_Monster>.verify(\n              &verifier,\n              at: pos,\n              of: MyGame_Example_Monster.self)\n\n          case .testsimpletablewithenum:\n            break\n          case .mygameExample2Monster:\n            break\n          }\n        })\n    } catch {\n      XCTAssertEqual(\n        error as! FlatbuffersErrors,\n        .missAlignedPointer(position: 25, type: \"UInt16\"))\n    }\n    tableVerifer.finish()\n    XCTAssertEqual(verifier.depth, 0)\n  }\n\n  func testVerifyUnionVectors() {\n    // swiftformat:disable all\n    var byteBuffer = ByteBuffer(bytes: [\n      20, 0, 0, 0, 77, 79, 86, 73, 12, 0, 12, 0, 0, 0, 0, 0, 8, 0, 4, 0, 12, 0, 0, 0, 8, 0, 0, 0,\n      20, 0, 0, 0, 3, 0, 0, 0, 24, 0, 0, 0, 32, 0, 0, 0, 12, 0, 0, 0, 3, 0, 0, 0, 3, 1, 4, 0, 2, 0,\n      0, 0, 7, 0, 0, 0, 0, 0, 6, 0, 8, 0, 4, 0, 6, 0, 0, 0, 8, 0, 0, 0,\n    ])\n    // swiftformat:enable all\n    XCTAssertNoThrow(try getCheckedRoot(byteBuffer: &byteBuffer) as Movie)\n  }\n\n  func testErrorWrongFileId() {\n    // swiftformat:disable all\n    var byteBuffer = ByteBuffer(bytes: [\n      20, 0, 0, 0, 77, 79, 86, 73, 12, 0, 12, 0, 0, 0, 0, 0, 8, 0, 4, 0, 12, 0, 0, 0, 8, 0, 0, 0,\n      20, 0, 0, 0, 3, 0, 0, 0, 24, 0, 0, 0, 32, 0, 0, 0, 12, 0, 0, 0, 3, 0, 0, 0, 3, 1, 4, 0, 2, 0,\n      0, 0, 7, 0, 0, 0, 0, 0, 6, 0, 8, 0, 4, 0, 6, 0, 0, 0, 8, 0, 0, 0,\n    ])\n    // swiftformat:enable all\n    XCTAssertThrowsError(\n      try getCheckedRoot(\n        byteBuffer: &byteBuffer,\n        fileId: \"FLEX\") as Movie)\n  }\n\n  func testVerifyPrefixedBuffer() {\n    // swiftformat:disable all\n    var byteBuffer = ByteBuffer(bytes: [\n      0, 0, 0, 1, 20, 0, 0, 0, 77, 79, 86, 73, 12, 0, 12, 0, 0, 0, 0, 0, 8, 0, 4, 0, 12, 0, 0, 0, 8,\n      0, 0, 0, 20, 0, 0, 0, 3, 0, 0, 0, 24, 0, 0, 0, 32, 0, 0, 0, 12, 0, 0, 0, 3, 0, 0, 0, 3, 1, 4,\n      0, 2, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 0, 8, 0, 4, 0, 6, 0, 0, 0, 8, 0, 0, 0,\n    ])\n    // swiftformat:enable all\n    XCTAssertThrowsError(\n      try getCheckedPrefixedSizeRoot(byteBuffer: &byteBuffer) as Movie)\n  }\n\n  func testFullVerifier() {\n    XCTAssertNoThrow(\n      try getCheckedRoot(\n        byteBuffer: &validFlatbuffersObject) as MyGame_Example_Monster)\n  }\n\n  func testFullVerifierWithFileId() {\n    XCTAssertNoThrow(\n      try getCheckedRoot(\n        byteBuffer: &validFlatbuffersObject,\n        fileId: MyGame_Example_Monster.id) as MyGame_Example_Monster)\n  }\n\n  func testInvalidBuffer() {\n    XCTAssertThrowsError(\n      try getCheckedRoot(\n        byteBuffer: &invalidFlatbuffersObject) as MyGame_Example_Monster)\n  }\n\n  func testInvalidBuffer2() {\n    XCTAssertThrowsError(\n      try getCheckedRoot(\n        byteBuffer: &invalidFlatbuffersObject2) as MyGame_Example_Monster)\n  }\n\n  func testInvalidBuffer3() {\n    XCTAssertThrowsError(\n      try getCheckedRoot(\n        byteBuffer: &invalidFlatbuffersObject3) as MyGame_Example_Monster)\n  }\n\n  func testValidUnionBuffer() {\n    let string = \"Awesome \\\\\\\\t\\t\\nstring!\"\n    var fb = FlatBufferBuilder()\n    let stringOffset = fb.create(string: string)\n    let characterType: [Character] = [.bookfan, .other]\n\n    let characters = [\n      fb.create(struct: BookReader(booksRead: 7)),\n      stringOffset,\n    ]\n    let types = fb.createVector(characterType)\n    let characterVector = fb.createVector(ofOffsets: characters)\n\n    let end = Movie.createMovie(\n      &fb,\n      mainCharacterType: .other,\n      mainCharacterOffset: Offset(offset: stringOffset.o),\n      charactersTypeVectorOffset: types,\n      charactersVectorOffset: characterVector)\n    Movie.finish(&fb, end: end)\n    var buf = fb.sizedBuffer\n    XCTAssertNoThrow(try getCheckedRoot(byteBuffer: &buf) as Movie)\n  }\n\n  func testNestedTables() throws {\n    var builder = FlatBufferBuilder()\n    let name = builder.create(string: \"Monster\")\n\n    let enemy = MyGame_Example_Monster.createMonster(\n      &builder,\n      nameOffset: name)\n    let currentName = builder.create(string: \"Main name\")\n    let monster = MyGame_Example_Monster.createMonster(\n      &builder,\n      nameOffset: currentName,\n      enemyOffset: enemy)\n    builder.finish(offset: monster)\n\n    var sizedBuffer = builder.sizedBuffer\n    var verifier = try! Verifier(buffer: &sizedBuffer)\n    var tableVerifer = try! verifier.visitTable(\n      at: try getOffset(at: 0, within: verifier))\n    XCTAssertEqual(verifier.depth, 1)\n    XCTAssertEqual(verifier.tableCount, 1)\n\n    let position = try tableVerifer.dereference(28)!\n\n    var nestedTable = try verifier.visitTable(\n      at: try getOffset(at: position, within: verifier))\n\n    XCTAssertEqual(verifier.depth, 2)\n    XCTAssertEqual(verifier.tableCount, 2)\n    nestedTable.finish()\n    XCTAssertEqual(verifier.depth, 1)\n    XCTAssertEqual(verifier.tableCount, 2)\n    tableVerifer.finish()\n    XCTAssertEqual(verifier.depth, 0)\n    XCTAssertEqual(verifier.tableCount, 2)\n  }\n\n  func add(buffer: inout ByteBuffer, v: Int32, p: Int) {\n    buffer.write(value: v, index: p)\n  }\n\n  private func getOffset(\n    at value: Int,\n    within verifier: Verifier) throws -> Int\n  {\n    let offset: UOffset = try verifier.getValue(at: value)\n    return Int(clamping: (Int(offset) &+ 0).magnitude)\n  }\n}\n"
  },
  {
    "path": "tests/swift/Tests/Flatbuffers/MutatingBool_generated.swift",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// swiftlint:disable all\n// swiftformat:disable all\n\n#if canImport(Common)\nimport Common\n#endif\n\nimport FlatBuffers\n\npublic struct Property: NativeStruct, FlatbuffersVectorInitializable, Verifiable, FlatbuffersInitializable, NativeObject {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n\n  private var _property: Bool\n\n  public init(_ bb: ByteBuffer, o: Int32) {\n    self = bb.read(def: Self.self, position: Int(o))\n  }\n\n  public init(property: Bool) {\n    _property = property\n  }\n\n  public init() {\n    _property = false\n  }\n\n  public init(_ _t: borrowing Property_Mutable) {\n    _property = _t.property\n  }\n\n  public var property: Bool { _property }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    try verifier.inBuffer(position: position, of: Property.self)\n  }\n}\n\nextension Property: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case property = \"property\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    if property != false {\n      try container.encodeIfPresent(property, forKey: .property)\n    }\n  }\n}\n\npublic struct Property_Mutable: FlatBufferStruct, FlatbuffersVectorInitializable {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Struct\n\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }\n\n  public var property: Bool { return _accessor.readBuffer(of: Bool.self, at: 0) }\n  @discardableResult public func mutate(property: Bool) -> Bool { return _accessor.mutate(property, index: 0) }\n\n  public func unpack() -> Property {\n    return Property(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout Property?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout Property) -> Offset {\n    return builder.create(struct: obj)\n  }\n}\n\npublic struct TestMutatingBool: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable, ObjectAPIPacker {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private struct VT {\n    static let b: VOffset = 4\n  }\n\n  public var b: Property? { let o = _accessor.offset(VT.b); return o == 0 ? nil : _accessor.readBuffer(of: Property.self, at: o) }\n  public var mutableB: Property_Mutable? { let o = _accessor.offset(VT.b); return o == 0 ? nil : Property_Mutable(_accessor.bb, o: o + _accessor.position) }\n  public static func startTestMutatingBool(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) }\n  public static func add(b: Property?, _ fbb: inout FlatBufferBuilder) { guard let b = b else { return }; fbb.create(struct: b, position: VT.b) }\n  public static func endTestMutatingBool(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n  public static func createTestMutatingBool(\n    _ fbb: inout FlatBufferBuilder,\n    b: Property? = nil\n  ) -> Offset {\n    let __start = TestMutatingBool.startTestMutatingBool(&fbb)\n    TestMutatingBool.add(b: b, &fbb)\n    return TestMutatingBool.endTestMutatingBool(&fbb, start: __start)\n  }\n\n  public func unpack() -> TestMutatingBoolT {\n    return TestMutatingBoolT(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout TestMutatingBoolT?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout TestMutatingBoolT) -> Offset {\n    let __root = TestMutatingBool.startTestMutatingBool(&builder)\n    TestMutatingBool.add(b: obj.b, &builder)\n    return TestMutatingBool.endTestMutatingBool(&builder, start: __root)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    try _v.visit(field: VT.b, fieldName: \"b\", required: false, type: Property.self)\n    _v.finish()\n  }\n}\n\nextension TestMutatingBool: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case b = \"b\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    try container.encodeIfPresent(b, forKey: .b)\n  }\n}\n\npublic class TestMutatingBoolT: NativeObject {\n\n  public var b: Property?\n\n  public init(_ _t: borrowing TestMutatingBool) {\n    b = _t.b\n  }\n\n  public init() {\n    b = Property()\n  }\n\n  public func serialize() -> ByteBuffer { return serialize(type: TestMutatingBool.self) }\n\n}\n"
  },
  {
    "path": "tests/swift/Tests/Flatbuffers/arrays_test_generated.swift",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// swiftlint:disable all\n// swiftformat:disable all\n\n#if canImport(Common)\nimport Common\n#endif\n\nimport FlatBuffers\n\n#if compiler(>=6.2)\npublic enum MyGame_Example_TestEnum: Int8, FlatbuffersVectorInitializable, Enum, Verifiable {\n  public typealias T = Int8\n  public static var byteSize: Int { return MemoryLayout<Int8>.size }\n  public var value: Int8 { return self.rawValue }\n  case a = 0\n  case b = 1\n  case c = 2\n\n  public static var max: MyGame_Example_TestEnum { return .c }\n  public static var min: MyGame_Example_TestEnum { return .a }\n}\n\nextension MyGame_Example_TestEnum: Encodable {\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.singleValueContainer()\n    switch self {\n    case .a: try container.encode(\"A\")\n    case .b: try container.encode(\"B\")\n    case .c: try container.encode(\"C\")\n    }\n  }\n}\n\n@available(macOS 26.0, iOS 26.0, watchOS 26.0, tvOS 26.0, *)\npublic struct MyGame_Example_NestedStruct: NativeStruct, FlatbuffersVectorInitializable, Verifiable, FlatbuffersInitializable, NativeObject {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n\n  private var _a: InlineArray<2, Int32>\n  private var _b: Int8\n  private var _c: InlineArray<2, Int8>\n  private var padding0__: UInt8 = 0\n  private var padding1__: UInt32 = 0\n  private var _d: InlineArray<2, Int64>\n\n  public init(_ bb: ByteBuffer, o: Int32) {\n    self = bb.read(def: Self.self, position: Int(o))\n  }\n\n  public init(a: InlineArray<2, Int32>, b: MyGame_Example_TestEnum, c: InlineArray<2, Int8>, d: InlineArray<2, Int64>) {\n    _a = a\n    _b = b.value\n    _c = c\n    _d = d\n  }\n\n  public init() {\n    _a = InlineArray(repeating: 0)\n    _b = 0\n    _c = InlineArray(repeating: 0)\n    _d = InlineArray(repeating: 0)\n  }\n\n  public init(_ _t: borrowing MyGame_Example_NestedStruct_Mutable) {\n    let _va = _t.a\n    _a = InlineArray { _va[$0] }\n    _b = _t.b.value\n    let _vc = _t.c\n    _c = InlineArray { _vc[$0].rawValue }\n    let _vd = _t.d\n    _d = InlineArray { _vd[$0] }\n  }\n\n  public var a: InlineArray<2, Int32> { _a }\n  public var b: MyGame_Example_TestEnum { MyGame_Example_TestEnum(rawValue: _b)! }\n  public var c: InlineArray<2, MyGame_Example_TestEnum> { InlineArray { MyGame_Example_TestEnum(rawValue: _c[$0])! } }\n  public var d: InlineArray<2, Int64> { _d }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    try verifier.inBuffer(position: position, of: MyGame_Example_NestedStruct.self)\n  }\n}\n\n@available(macOS 26.0, iOS 26.0, watchOS 26.0, tvOS 26.0, *)\nextension MyGame_Example_NestedStruct: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case a = \"a\"\n    case b = \"b\"\n    case c = \"c\"\n    case d = \"d\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    var aContainer = container.nestedUnkeyedContainer(forKey: .a)\n    for index in a.startIndex..<a.endIndex {\n      try aContainer.encode(a[index])\n    }\n    if b != .a {\n      try container.encodeIfPresent(b, forKey: .b)\n    }\n    var cContainer = container.nestedUnkeyedContainer(forKey: .c)\n    for index in c.startIndex..<c.endIndex {\n      try cContainer.encode(c[index])\n    }\n    var dContainer = container.nestedUnkeyedContainer(forKey: .d)\n    for index in d.startIndex..<d.endIndex {\n      try dContainer.encode(d[index])\n    }\n  }\n}\n\n@available(macOS 26.0, iOS 26.0, watchOS 26.0, tvOS 26.0, *)\npublic struct MyGame_Example_NestedStruct_Mutable: FlatBufferStruct, FlatbuffersVectorInitializable {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Struct\n\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }\n\n  public var a: FlatbufferVector<Int32> { return _accessor.vector(at: 0, count: 2, size: 4) }\n  @discardableResult public func mutate(a: Int32, at index: Int32) -> Bool { return _accessor.mutate(a, index: 0 + (index * 4)) }\n  public var b: MyGame_Example_TestEnum { return MyGame_Example_TestEnum(rawValue: _accessor.readBuffer(of: Int8.self, at: 8)) ?? .a }\n  @discardableResult public func mutate(b: MyGame_Example_TestEnum) -> Bool { return _accessor.mutate(b.rawValue, index: 8) }\n  public var c: FlatbufferVector<MyGame_Example_TestEnum> { return _accessor.vector(at: 9, count: 2, size: 1) }\n  @discardableResult public func mutate(c: MyGame_Example_TestEnum, at index: Int32) -> Bool { return _accessor.mutate(c.rawValue, index: 9 + (index * 1)) }\n  public var d: FlatbufferVector<Int64> { return _accessor.vector(at: 16, count: 2, size: 8) }\n  @discardableResult public func mutate(d: Int64, at index: Int32) -> Bool { return _accessor.mutate(d, index: 16 + (index * 8)) }\n\n  public func unpack() -> MyGame_Example_NestedStruct {\n    return MyGame_Example_NestedStruct(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_NestedStruct?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_NestedStruct) -> Offset {\n    return builder.create(struct: obj)\n  }\n}\n\n@available(macOS 26.0, iOS 26.0, watchOS 26.0, tvOS 26.0, *)\npublic struct MyGame_Example_ArrayStruct: NativeStruct, FlatbuffersVectorInitializable, Verifiable, FlatbuffersInitializable, NativeObject {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n\n  private var _a: Float32\n  private var _b: InlineArray<15, Int32>\n  private var _c: Int8\n  private var padding0__: UInt8 = 0\n  private var padding1__: UInt16 = 0\n  private var padding2__: UInt32 = 0\n  private var _d: InlineArray<2, MyGame_Example_NestedStruct>\n  private var _e: Int32\n  private var padding3__: UInt32 = 0\n  private var _f: InlineArray<2, Int64>\n\n  public init(_ bb: ByteBuffer, o: Int32) {\n    self = bb.read(def: Self.self, position: Int(o))\n  }\n\n  public init(a: Float32, b: InlineArray<15, Int32>, c: Int8, d: InlineArray<2, MyGame_Example_NestedStruct>, e: Int32, f: InlineArray<2, Int64>) {\n    _a = a\n    _b = b\n    _c = c\n    _d = d\n    _e = e\n    _f = f\n  }\n\n  public init() {\n    _a = 0.0\n    _b = InlineArray(repeating: 0)\n    _c = 0\n    _d = InlineArray(repeating: MyGame_Example_NestedStruct())\n    _e = 0\n    _f = InlineArray(repeating: 0)\n  }\n\n  public init(_ _t: borrowing MyGame_Example_ArrayStruct_Mutable) {\n    _a = _t.a\n    let _vb = _t.b\n    _b = InlineArray { _vb[$0] }\n    _c = _t.c\n    let _vd = _t.d\n    _d = InlineArray { _vd[$0].unpack() }\n    _e = _t.e\n    let _vf = _t.f\n    _f = InlineArray { _vf[$0] }\n  }\n\n  public var a: Float32 { _a }\n  public var b: InlineArray<15, Int32> { _b }\n  public var c: Int8 { _c }\n  public var d: InlineArray<2, MyGame_Example_NestedStruct> { _d }\n  public var e: Int32 { _e }\n  public var f: InlineArray<2, Int64> { _f }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    try verifier.inBuffer(position: position, of: MyGame_Example_ArrayStruct.self)\n  }\n}\n\n@available(macOS 26.0, iOS 26.0, watchOS 26.0, tvOS 26.0, *)\nextension MyGame_Example_ArrayStruct: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case a = \"a\"\n    case b = \"b\"\n    case c = \"c\"\n    case d = \"d\"\n    case e = \"e\"\n    case f = \"f\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    if a != 0.0 {\n      try container.encodeIfPresent(a, forKey: .a)\n    }\n    var bContainer = container.nestedUnkeyedContainer(forKey: .b)\n    for index in b.startIndex..<b.endIndex {\n      try bContainer.encode(b[index])\n    }\n    if c != 0 {\n      try container.encodeIfPresent(c, forKey: .c)\n    }\n    var dContainer = container.nestedUnkeyedContainer(forKey: .d)\n    for index in d.startIndex..<d.endIndex {\n      try dContainer.encode(d[index])\n    }\n    if e != 0 {\n      try container.encodeIfPresent(e, forKey: .e)\n    }\n    var fContainer = container.nestedUnkeyedContainer(forKey: .f)\n    for index in f.startIndex..<f.endIndex {\n      try fContainer.encode(f[index])\n    }\n  }\n}\n\n@available(macOS 26.0, iOS 26.0, watchOS 26.0, tvOS 26.0, *)\npublic struct MyGame_Example_ArrayStruct_Mutable: FlatBufferStruct, FlatbuffersVectorInitializable {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Struct\n\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }\n\n  public var a: Float32 { return _accessor.readBuffer(of: Float32.self, at: 0) }\n  @discardableResult public func mutate(a: Float32) -> Bool { return _accessor.mutate(a, index: 0) }\n  public var b: FlatbufferVector<Int32> { return _accessor.vector(at: 4, count: 15, size: 4) }\n  @discardableResult public func mutate(b: Int32, at index: Int32) -> Bool { return _accessor.mutate(b, index: 4 + (index * 4)) }\n  public var c: Int8 { return _accessor.readBuffer(of: Int8.self, at: 64) }\n  @discardableResult public func mutate(c: Int8) -> Bool { return _accessor.mutate(c, index: 64) }\n  public var d: FlatbufferVector<MyGame_Example_NestedStruct_Mutable> { return _accessor.vector(at: 72, count: 2, size: 32) }\n  public var e: Int32 { return _accessor.readBuffer(of: Int32.self, at: 136) }\n  @discardableResult public func mutate(e: Int32) -> Bool { return _accessor.mutate(e, index: 136) }\n  public var f: FlatbufferVector<Int64> { return _accessor.vector(at: 144, count: 2, size: 8) }\n  @discardableResult public func mutate(f: Int64, at index: Int32) -> Bool { return _accessor.mutate(f, index: 144 + (index * 8)) }\n\n  public func unpack() -> MyGame_Example_ArrayStruct {\n    return MyGame_Example_ArrayStruct(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_ArrayStruct?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_ArrayStruct) -> Offset {\n    return builder.create(struct: obj)\n  }\n}\n\n@available(macOS 26.0, iOS 26.0, watchOS 26.0, tvOS 26.0, *)\npublic struct MyGame_Example_LargeArrayStruct: NativeStruct, FlatbuffersVectorInitializable, Verifiable, FlatbuffersInitializable, NativeObject {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n\n  private var _d: InlineArray<64, UInt8>\n  private var _e: InlineArray<64, Float32>\n  private var _f: InlineArray<64, Bool>\n  private var _g: InlineArray<64, MyGame_Example_NestedStruct>\n  private var _h: InlineArray<64, Int8>\n\n  public init(_ bb: ByteBuffer, o: Int32) {\n    self = bb.read(def: Self.self, position: Int(o))\n  }\n\n  public init(d: InlineArray<64, UInt8>, e: InlineArray<64, Float32>, f: InlineArray<64, Bool>, g: InlineArray<64, MyGame_Example_NestedStruct>, h: InlineArray<64, Int8>) {\n    _d = d\n    _e = e\n    _f = f\n    _g = g\n    _h = h\n  }\n\n  public init() {\n    _d = InlineArray(repeating: 0)\n    _e = InlineArray(repeating: 0.0)\n    _f = InlineArray(repeating: false)\n    _g = InlineArray(repeating: MyGame_Example_NestedStruct())\n    _h = InlineArray(repeating: 0)\n  }\n\n  public init(_ _t: borrowing MyGame_Example_LargeArrayStruct_Mutable) {\n    let _vd = _t.d\n    _d = InlineArray { _vd[$0] }\n    let _ve = _t.e\n    _e = InlineArray { _ve[$0] }\n    let _vf = _t.f\n    _f = InlineArray { _vf[$0] }\n    let _vg = _t.g\n    _g = InlineArray { _vg[$0].unpack() }\n    let _vh = _t.h\n    _h = InlineArray { _vh[$0].rawValue }\n  }\n\n  public var d: InlineArray<64, UInt8> { _d }\n  public var e: InlineArray<64, Float32> { _e }\n  public var f: InlineArray<64, Bool> { _f }\n  public var g: InlineArray<64, MyGame_Example_NestedStruct> { _g }\n  public var h: InlineArray<64, MyGame_Example_TestEnum> { InlineArray { MyGame_Example_TestEnum(rawValue: _h[$0])! } }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    try verifier.inBuffer(position: position, of: MyGame_Example_LargeArrayStruct.self)\n  }\n}\n\n@available(macOS 26.0, iOS 26.0, watchOS 26.0, tvOS 26.0, *)\nextension MyGame_Example_LargeArrayStruct: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case d = \"d\"\n    case e = \"e\"\n    case f = \"f\"\n    case g = \"g\"\n    case h = \"h\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    var dContainer = container.nestedUnkeyedContainer(forKey: .d)\n    for index in d.startIndex..<d.endIndex {\n      try dContainer.encode(d[index])\n    }\n    var eContainer = container.nestedUnkeyedContainer(forKey: .e)\n    for index in e.startIndex..<e.endIndex {\n      try eContainer.encode(e[index])\n    }\n    var fContainer = container.nestedUnkeyedContainer(forKey: .f)\n    for index in f.startIndex..<f.endIndex {\n      try fContainer.encode(f[index])\n    }\n    var gContainer = container.nestedUnkeyedContainer(forKey: .g)\n    for index in g.startIndex..<g.endIndex {\n      try gContainer.encode(g[index])\n    }\n    var hContainer = container.nestedUnkeyedContainer(forKey: .h)\n    for index in h.startIndex..<h.endIndex {\n      try hContainer.encode(h[index])\n    }\n  }\n}\n\n@available(macOS 26.0, iOS 26.0, watchOS 26.0, tvOS 26.0, *)\npublic struct MyGame_Example_LargeArrayStruct_Mutable: FlatBufferStruct, FlatbuffersVectorInitializable {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Struct\n\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }\n\n  public var d: FlatbufferVector<UInt8> { return _accessor.vector(at: 0, count: 64, size: 1) }\n  @discardableResult public func mutate(d: UInt8, at index: Int32) -> Bool { return _accessor.mutate(d, index: 0 + (index * 1)) }\n  public var e: FlatbufferVector<Float32> { return _accessor.vector(at: 64, count: 64, size: 4) }\n  @discardableResult public func mutate(e: Float32, at index: Int32) -> Bool { return _accessor.mutate(e, index: 64 + (index * 4)) }\n  public var f: FlatbufferVector<Bool> { return _accessor.vector(at: 320, count: 64, size: 1) }\n  @discardableResult public func mutate(f: Bool, at index: Int32) -> Bool { return _accessor.mutate(f, index: 320 + (index * 1)) }\n  public var g: FlatbufferVector<MyGame_Example_NestedStruct_Mutable> { return _accessor.vector(at: 384, count: 64, size: 32) }\n  public var h: FlatbufferVector<MyGame_Example_TestEnum> { return _accessor.vector(at: 2432, count: 64, size: 1) }\n  @discardableResult public func mutate(h: MyGame_Example_TestEnum, at index: Int32) -> Bool { return _accessor.mutate(h.rawValue, index: 2432 + (index * 1)) }\n\n  public func unpack() -> MyGame_Example_LargeArrayStruct {\n    return MyGame_Example_LargeArrayStruct(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_LargeArrayStruct?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_LargeArrayStruct) -> Offset {\n    return builder.create(struct: obj)\n  }\n}\n\n@available(macOS 26.0, iOS 26.0, watchOS 26.0, tvOS 26.0, *)\npublic struct MyGame_Example_ArrayTable: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable, ObjectAPIPacker {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  public static var id: String { \"ARRT\" } \n  public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset, prefix: Bool = false) { fbb.finish(offset: end, fileId: MyGame_Example_ArrayTable.id, addPrefix: prefix) }\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private struct VT {\n    static let a: VOffset = 4\n  }\n\n  public var a: MyGame_Example_ArrayStruct? { let o = _accessor.offset(VT.a); return o == 0 ? nil : _accessor.readBuffer(of: MyGame_Example_ArrayStruct.self, at: o) }\n  public var mutableA: MyGame_Example_ArrayStruct_Mutable? { let o = _accessor.offset(VT.a); return o == 0 ? nil : MyGame_Example_ArrayStruct_Mutable(_accessor.bb, o: o + _accessor.position) }\n  public static func startArrayTable(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) }\n  public static func add(a: MyGame_Example_ArrayStruct?, _ fbb: inout FlatBufferBuilder) { guard let a = a else { return }; fbb.create(struct: a, position: VT.a) }\n  public static func endArrayTable(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n  public static func createArrayTable(\n    _ fbb: inout FlatBufferBuilder,\n    a: MyGame_Example_ArrayStruct? = nil\n  ) -> Offset {\n    let __start = MyGame_Example_ArrayTable.startArrayTable(&fbb)\n    MyGame_Example_ArrayTable.add(a: a, &fbb)\n    return MyGame_Example_ArrayTable.endArrayTable(&fbb, start: __start)\n  }\n\n  public func unpack() -> MyGame_Example_ArrayTableT {\n    return MyGame_Example_ArrayTableT(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_ArrayTableT?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_ArrayTableT) -> Offset {\n    let __root = MyGame_Example_ArrayTable.startArrayTable(&builder)\n    MyGame_Example_ArrayTable.add(a: obj.a, &builder)\n    return MyGame_Example_ArrayTable.endArrayTable(&builder, start: __root)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    try _v.visit(field: VT.a, fieldName: \"a\", required: false, type: MyGame_Example_ArrayStruct.self)\n    _v.finish()\n  }\n}\n\n@available(macOS 26.0, iOS 26.0, watchOS 26.0, tvOS 26.0, *)\nextension MyGame_Example_ArrayTable: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case a = \"a\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    try container.encodeIfPresent(a, forKey: .a)\n  }\n}\n\n@available(macOS 26.0, iOS 26.0, watchOS 26.0, tvOS 26.0, *)\npublic class MyGame_Example_ArrayTableT: NativeObject {\n\n  public var a: MyGame_Example_ArrayStruct?\n\n  public init(_ _t: borrowing MyGame_Example_ArrayTable) {\n    a = _t.a\n  }\n\n  public init() {\n    a = MyGame_Example_ArrayStruct()\n  }\n\n  public func serialize() -> ByteBuffer { return serialize(type: MyGame_Example_ArrayTable.self) }\n\n}\n#endif\n"
  },
  {
    "path": "tests/swift/Tests/Flatbuffers/empty_vtable_generated.swift",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// swiftlint:disable all\n// swiftformat:disable all\n\n#if canImport(Common)\nimport Common\n#endif\n\nimport FlatBuffers\n\npublic struct DataModel_A: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable, ObjectAPIPacker {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private struct VT {\n  }\n\n  public static func startA(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) }\n  public static func endA(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n  public static func createA(\n    _ fbb: inout FlatBufferBuilder\n  ) -> Offset {\n    let __start = DataModel_A.startA(&fbb)\n    return DataModel_A.endA(&fbb, start: __start)\n  }\n\n  public func unpack() -> DataModel_AT {\n    return DataModel_AT(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout DataModel_AT?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout DataModel_AT) -> Offset {\n    let __root = DataModel_A.startA(&builder)\n    return DataModel_A.endA(&builder, start: __root)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    _v.finish()\n  }\n}\n\nextension DataModel_A: Encodable {\n  public func encode(to encoder: Encoder) throws {\n  }\n}\n\npublic class DataModel_AT: NativeObject {\n\n\n  public init(_ _t: borrowing DataModel_A) {\n  }\n\n  public init() {\n  }\n\n  public func serialize() -> ByteBuffer { return serialize(type: DataModel_A.self) }\n\n}\n"
  },
  {
    "path": "tests/swift/Tests/Flatbuffers/monster_test.grpc.swift",
    "content": "// Generated GRPC code for FlatBuffers swift!\n/// The following code is generated by the Flatbuffers library which might not be in sync with grpc-swift\n/// in case of an issue please open github issue, though it would be maintained\n\n// swiftlint:disable all\n// swiftformat:disable all\n\n#if !os(Windows)\nimport Foundation\nimport GRPC\nimport NIO\nimport NIOHTTP1\nimport FlatBuffers\n\npublic protocol GRPCFlatBufPayload: GRPCPayload, FlatBufferGRPCMessage {}\npublic extension GRPCFlatBufPayload {\n  init(serializedByteBuffer: inout NIO.ByteBuffer) throws {\n    self.init(byteBuffer: FlatBuffers.ByteBuffer(contiguousBytes: serializedByteBuffer.readableBytesView, count: serializedByteBuffer.readableBytes))\n  }\n  func serialize(into buffer: inout NIO.ByteBuffer) throws {\n    withUnsafeReadableBytes { buffer.writeBytes($0) }\n  }\n}\nextension Message: GRPCFlatBufPayload {}\n\n/// Usage: instantiate MyGame_Example_MonsterStorageServiceClient, then call methods of this protocol to make API calls.\npublic protocol MyGame_Example_MonsterStorageClientProtocol: GRPCClient {\n\n  var serviceName: String { get }\n\n  var interceptors: MyGame_Example_MonsterStorageClientInterceptorFactoryProtocol? { get }\n\n  func Store(\n    _ request: Message<MyGame_Example_Monster>\n    , callOptions: CallOptions?\n  ) -> UnaryCall<Message<MyGame_Example_Monster>, Message<MyGame_Example_Stat>>\n\n  func Retrieve(\n    _ request: Message<MyGame_Example_Stat>\n    , callOptions: CallOptions?,\n    handler: @escaping (Message<MyGame_Example_Monster>) -> Void\n  ) -> ServerStreamingCall<Message<MyGame_Example_Stat>, Message<MyGame_Example_Monster>>\n\n  func GetMaxHitPoint(\n    callOptions: CallOptions?\n  ) -> ClientStreamingCall<Message<MyGame_Example_Monster>, Message<MyGame_Example_Stat>>\n\n  func GetMinMaxHitPoints(\n    callOptions: CallOptions?,\n    handler: @escaping (Message<MyGame_Example_Stat> ) -> Void\n  ) -> BidirectionalStreamingCall<Message<MyGame_Example_Monster>, Message<MyGame_Example_Stat>>\n\n}\n\nextension MyGame_Example_MonsterStorageClientProtocol {\n\n  public var serviceName: String { \"MyGame.Example.MonsterStorage\" }\n\n  public func Store(\n    _ request: Message<MyGame_Example_Monster>\n    , callOptions: CallOptions? = nil\n  ) -> UnaryCall<Message<MyGame_Example_Monster>, Message<MyGame_Example_Stat>> {\n    return self.makeUnaryCall(\n      path: \"/MyGame.Example.MonsterStorage/Store\",\n      request: request,\n      callOptions: callOptions ?? self.defaultCallOptions,\n      interceptors: self.interceptors?.makeStoreInterceptors() ?? []\n    )\n  }\n\n  public func Retrieve(\n    _ request: Message<MyGame_Example_Stat>\n    , callOptions: CallOptions? = nil,\n    handler: @escaping (Message<MyGame_Example_Monster>) -> Void\n  ) -> ServerStreamingCall<Message<MyGame_Example_Stat>, Message<MyGame_Example_Monster>> {\n    return self.makeServerStreamingCall(\n      path: \"/MyGame.Example.MonsterStorage/Retrieve\",\n      request: request,\n      callOptions: callOptions ?? self.defaultCallOptions,\n      interceptors: self.interceptors?.makeRetrieveInterceptors() ?? [],\n      handler: handler\n    )\n  }\n\n  public func GetMaxHitPoint(\n    callOptions: CallOptions? = nil\n  ) -> ClientStreamingCall<Message<MyGame_Example_Monster>, Message<MyGame_Example_Stat>> {\n    return self.makeClientStreamingCall(\n      path: \"/MyGame.Example.MonsterStorage/GetMaxHitPoint\",\n      callOptions: callOptions ?? self.defaultCallOptions,\n      interceptors: self.interceptors?.makeGetMaxHitPointInterceptors() ?? []\n    )\n  }\n\n  public func GetMinMaxHitPoints(\n    callOptions: CallOptions? = nil,\n    handler: @escaping (Message<MyGame_Example_Stat> ) -> Void\n  ) -> BidirectionalStreamingCall<Message<MyGame_Example_Monster>, Message<MyGame_Example_Stat>> {\n    return self.makeBidirectionalStreamingCall(\n      path: \"/MyGame.Example.MonsterStorage/GetMinMaxHitPoints\",\n      callOptions: callOptions ?? self.defaultCallOptions,\n      interceptors: self.interceptors?.makeGetMinMaxHitPointsInterceptors() ?? [],\n      handler: handler\n    )\n  }\n}\n\npublic protocol MyGame_Example_MonsterStorageClientInterceptorFactoryProtocol {\n  /// - Returns: Interceptors to use when invoking 'Store'.\n  func makeStoreInterceptors() -> [ClientInterceptor<Message<MyGame_Example_Monster>, Message<MyGame_Example_Stat>>]\n\n  /// - Returns: Interceptors to use when invoking 'Retrieve'.\n  func makeRetrieveInterceptors() -> [ClientInterceptor<Message<MyGame_Example_Stat>, Message<MyGame_Example_Monster>>]\n\n  /// - Returns: Interceptors to use when invoking 'GetMaxHitPoint'.\n  func makeGetMaxHitPointInterceptors() -> [ClientInterceptor<Message<MyGame_Example_Monster>, Message<MyGame_Example_Stat>>]\n\n  /// - Returns: Interceptors to use when invoking 'GetMinMaxHitPoints'.\n  func makeGetMinMaxHitPointsInterceptors() -> [ClientInterceptor<Message<MyGame_Example_Monster>, Message<MyGame_Example_Stat>>]\n\n}\n\npublic final class MyGame_Example_MonsterStorageServiceClient: MyGame_Example_MonsterStorageClientProtocol {\n  public let channel: GRPCChannel\n  public var defaultCallOptions: CallOptions\n  public var interceptors: MyGame_Example_MonsterStorageClientInterceptorFactoryProtocol?\n\n  public init(\n    channel: GRPCChannel,\n    defaultCallOptions: CallOptions = CallOptions(),\n    interceptors: MyGame_Example_MonsterStorageClientInterceptorFactoryProtocol? = nil\n  ) {\n    self.channel = channel\n    self.defaultCallOptions = defaultCallOptions\n    self.interceptors = interceptors\n  }\n}\n\npublic protocol MyGame_Example_MonsterStorageProvider: CallHandlerProvider {\n  var interceptors: MyGame_Example_MonsterStorageServerInterceptorFactoryProtocol? { get }\n  func Store(request: Message<MyGame_Example_Monster>, context: StatusOnlyCallContext) -> EventLoopFuture<Message<MyGame_Example_Stat>>\n  func Retrieve(request: Message<MyGame_Example_Stat>, context: StreamingResponseCallContext<Message<MyGame_Example_Monster>>) -> EventLoopFuture<GRPCStatus>\n  func GetMaxHitPoint(context: UnaryResponseCallContext<Message<MyGame_Example_Stat>>) -> EventLoopFuture<(StreamEvent<Message<MyGame_Example_Monster>>) -> Void>\n  func GetMinMaxHitPoints(context: StreamingResponseCallContext<Message<MyGame_Example_Stat>>) -> EventLoopFuture<(StreamEvent<Message<MyGame_Example_Monster>>) -> Void>\n}\n\npublic extension MyGame_Example_MonsterStorageProvider {\n\n  var serviceName: Substring { return \"MyGame.Example.MonsterStorage\" }\n\n  func handle(method name: Substring, context: CallHandlerContext) -> GRPCServerHandlerProtocol? {\n    switch name {\n    case \"Store\":\n    return UnaryServerHandler(\n      context: context,\n      requestDeserializer: GRPCPayloadDeserializer<Message<MyGame_Example_Monster>>(),\n      responseSerializer: GRPCPayloadSerializer<Message<MyGame_Example_Stat>>(),\n      interceptors: self.interceptors?.makeStoreInterceptors() ?? [],\n      userFunction: self.Store(request:context:))\n\n    case \"Retrieve\":\n    return ServerStreamingServerHandler(\n      context: context,\n      requestDeserializer: GRPCPayloadDeserializer<Message<MyGame_Example_Stat>>(),\n      responseSerializer: GRPCPayloadSerializer<Message<MyGame_Example_Monster>>(),\n      interceptors: self.interceptors?.makeRetrieveInterceptors() ?? [],\n      userFunction: self.Retrieve(request:context:))\n\n    case \"GetMaxHitPoint\":\n    return ClientStreamingServerHandler(\n      context: context,\n      requestDeserializer: GRPCPayloadDeserializer<Message<MyGame_Example_Monster>>(),\n      responseSerializer: GRPCPayloadSerializer<Message<MyGame_Example_Stat>>(),\n      interceptors: self.interceptors?.makeGetMaxHitPointInterceptors() ?? [],\n      observerFactory: self.GetMaxHitPoint(context:))\n\n    case \"GetMinMaxHitPoints\":\n    return BidirectionalStreamingServerHandler(\n      context: context,\n      requestDeserializer: GRPCPayloadDeserializer<Message<MyGame_Example_Monster>>(),\n      responseSerializer: GRPCPayloadSerializer<Message<MyGame_Example_Stat>>(),\n      interceptors: self.interceptors?.makeGetMinMaxHitPointsInterceptors() ?? [],\n      observerFactory: self.GetMinMaxHitPoints(context:))\n\n    default: return nil;\n    }\n  }\n\n}\n\npublic protocol MyGame_Example_MonsterStorageServerInterceptorFactoryProtocol {\n  /// - Returns: Interceptors to use when handling 'Store'.\n  ///   Defaults to calling `self.makeInterceptors()`.\n  func makeStoreInterceptors() -> [ServerInterceptor<Message<MyGame_Example_Monster>, Message<MyGame_Example_Stat>>]\n\n  /// - Returns: Interceptors to use when handling 'Retrieve'.\n  ///   Defaults to calling `self.makeInterceptors()`.\n  func makeRetrieveInterceptors() -> [ServerInterceptor<Message<MyGame_Example_Stat>, Message<MyGame_Example_Monster>>]\n\n  /// - Returns: Interceptors to use when handling 'GetMaxHitPoint'.\n  ///   Defaults to calling `self.makeInterceptors()`.\n  func makeGetMaxHitPointInterceptors() -> [ServerInterceptor<Message<MyGame_Example_Monster>, Message<MyGame_Example_Stat>>]\n\n  /// - Returns: Interceptors to use when handling 'GetMinMaxHitPoints'.\n  ///   Defaults to calling `self.makeInterceptors()`.\n  func makeGetMinMaxHitPointsInterceptors() -> [ServerInterceptor<Message<MyGame_Example_Monster>, Message<MyGame_Example_Stat>>]\n\n}\n#endif\n\n"
  },
  {
    "path": "tests/swift/Tests/Flatbuffers/monster_test_generated.swift",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// swiftlint:disable all\n// swiftformat:disable all\n\n#if canImport(Common)\nimport Common\n#endif\n\nimport FlatBuffers\n\n///  Composite components of Monster color.\npublic enum MyGame_Example_Color: UInt8, FlatbuffersVectorInitializable, Enum, Verifiable {\n  public typealias T = UInt8\n  public static var byteSize: Int { return MemoryLayout<UInt8>.size }\n  public var value: UInt8 { return self.rawValue }\n  case red = 1\n  ///  \\brief color Green\n  ///  Green is bit_flag with value (1u << 1)\n  case green = 2\n  ///  \\brief color Blue (1u << 3)\n  case blue = 8\n\n  public static var max: MyGame_Example_Color { return .blue }\n  public static var min: MyGame_Example_Color { return .red }\n}\n\nextension MyGame_Example_Color: Encodable {\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.singleValueContainer()\n    switch self {\n    case .red: try container.encode(\"Red\")\n    case .green: try container.encode(\"Green\")\n    case .blue: try container.encode(\"Blue\")\n    }\n  }\n}\n\npublic enum MyGame_Example_Race: Int8, FlatbuffersVectorInitializable, Enum, Verifiable {\n  public typealias T = Int8\n  public static var byteSize: Int { return MemoryLayout<Int8>.size }\n  public var value: Int8 { return self.rawValue }\n  case none_ = -1\n  case human = 0\n  case dwarf = 1\n  case elf = 2\n\n  public static var max: MyGame_Example_Race { return .elf }\n  public static var min: MyGame_Example_Race { return .none_ }\n}\n\nextension MyGame_Example_Race: Encodable {\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.singleValueContainer()\n    switch self {\n    case .none_: try container.encode(\"None\")\n    case .human: try container.encode(\"Human\")\n    case .dwarf: try container.encode(\"Dwarf\")\n    case .elf: try container.encode(\"Elf\")\n    }\n  }\n}\n\npublic enum MyGame_Example_LongEnum: UInt64, FlatbuffersVectorInitializable, Enum, Verifiable {\n  public typealias T = UInt64\n  public static var byteSize: Int { return MemoryLayout<UInt64>.size }\n  public var value: UInt64 { return self.rawValue }\n  case longone = 2\n  case longtwo = 4\n  case longbig = 1099511627776\n\n  public static var max: MyGame_Example_LongEnum { return .longbig }\n  public static var min: MyGame_Example_LongEnum { return .longone }\n}\n\nextension MyGame_Example_LongEnum: Encodable {\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.singleValueContainer()\n    switch self {\n    case .longone: try container.encode(\"LongOne\")\n    case .longtwo: try container.encode(\"LongTwo\")\n    case .longbig: try container.encode(\"LongBig\")\n    }\n  }\n}\n\npublic enum MyGame_Example_Any_: UInt8, FlatbuffersVectorInitializable, UnionEnum {\n  public typealias T = UInt8\n\n  public init?(value: T) {\n    self.init(rawValue: value)\n  }\n\n  public static var byteSize: Int { return MemoryLayout<UInt8>.size }\n  public var value: UInt8 { return self.rawValue }\n  case none_ = 0\n  case monster = 1\n  case testsimpletablewithenum = 2\n  case mygameExample2Monster = 3\n\n  public static var max: MyGame_Example_Any_ { return .mygameExample2Monster }\n  public static var min: MyGame_Example_Any_ { return .none_ }\n}\n\nextension MyGame_Example_Any_: Encodable {\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.singleValueContainer()\n    switch self {\n    case .none_: try container.encode(\"NONE\")\n    case .monster: try container.encode(\"Monster\")\n    case .testsimpletablewithenum: try container.encode(\"TestSimpleTableWithEnum\")\n    case .mygameExample2Monster: try container.encode(\"MyGame_Example2_Monster\")\n    }\n  }\n}\n\npublic struct MyGame_Example_Any_Union {\n  public var type: MyGame_Example_Any_\n  public var value: NativeObject?\n  public init(_ v: NativeObject?, type: MyGame_Example_Any_) {\n    self.type = type\n    self.value = v\n  }\n  public func pack(builder: inout FlatBufferBuilder) -> Offset {\n    switch type {\n    case .monster:\n      var __obj = value as? MyGame_Example_MonsterT\n      return MyGame_Example_Monster.pack(&builder, obj: &__obj)\n    case .testsimpletablewithenum:\n      var __obj = value as? MyGame_Example_TestSimpleTableWithEnumT\n      return MyGame_Example_TestSimpleTableWithEnum.pack(&builder, obj: &__obj)\n    case .mygameExample2Monster:\n      var __obj = value as? MyGame_Example2_MonsterT\n      return MyGame_Example2_Monster.pack(&builder, obj: &__obj)\n    default: return Offset()\n    }\n  }\n}\npublic enum MyGame_Example_AnyUniqueAliases: UInt8, FlatbuffersVectorInitializable, UnionEnum {\n  public typealias T = UInt8\n\n  public init?(value: T) {\n    self.init(rawValue: value)\n  }\n\n  public static var byteSize: Int { return MemoryLayout<UInt8>.size }\n  public var value: UInt8 { return self.rawValue }\n  case none_ = 0\n  case m = 1\n  case ts = 2\n  case m2 = 3\n\n  public static var max: MyGame_Example_AnyUniqueAliases { return .m2 }\n  public static var min: MyGame_Example_AnyUniqueAliases { return .none_ }\n}\n\nextension MyGame_Example_AnyUniqueAliases: Encodable {\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.singleValueContainer()\n    switch self {\n    case .none_: try container.encode(\"NONE\")\n    case .m: try container.encode(\"M\")\n    case .ts: try container.encode(\"TS\")\n    case .m2: try container.encode(\"M2\")\n    }\n  }\n}\n\npublic struct MyGame_Example_AnyUniqueAliasesUnion {\n  public var type: MyGame_Example_AnyUniqueAliases\n  public var value: NativeObject?\n  public init(_ v: NativeObject?, type: MyGame_Example_AnyUniqueAliases) {\n    self.type = type\n    self.value = v\n  }\n  public func pack(builder: inout FlatBufferBuilder) -> Offset {\n    switch type {\n    case .m:\n      var __obj = value as? MyGame_Example_MonsterT\n      return MyGame_Example_Monster.pack(&builder, obj: &__obj)\n    case .ts:\n      var __obj = value as? MyGame_Example_TestSimpleTableWithEnumT\n      return MyGame_Example_TestSimpleTableWithEnum.pack(&builder, obj: &__obj)\n    case .m2:\n      var __obj = value as? MyGame_Example2_MonsterT\n      return MyGame_Example2_Monster.pack(&builder, obj: &__obj)\n    default: return Offset()\n    }\n  }\n}\npublic enum MyGame_Example_AnyAmbiguousAliases: UInt8, FlatbuffersVectorInitializable, UnionEnum {\n  public typealias T = UInt8\n\n  public init?(value: T) {\n    self.init(rawValue: value)\n  }\n\n  public static var byteSize: Int { return MemoryLayout<UInt8>.size }\n  public var value: UInt8 { return self.rawValue }\n  case none_ = 0\n  case m1 = 1\n  case m2 = 2\n  case m3 = 3\n\n  public static var max: MyGame_Example_AnyAmbiguousAliases { return .m3 }\n  public static var min: MyGame_Example_AnyAmbiguousAliases { return .none_ }\n}\n\nextension MyGame_Example_AnyAmbiguousAliases: Encodable {\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.singleValueContainer()\n    switch self {\n    case .none_: try container.encode(\"NONE\")\n    case .m1: try container.encode(\"M1\")\n    case .m2: try container.encode(\"M2\")\n    case .m3: try container.encode(\"M3\")\n    }\n  }\n}\n\npublic struct MyGame_Example_AnyAmbiguousAliasesUnion {\n  public var type: MyGame_Example_AnyAmbiguousAliases\n  public var value: NativeObject?\n  public init(_ v: NativeObject?, type: MyGame_Example_AnyAmbiguousAliases) {\n    self.type = type\n    self.value = v\n  }\n  public func pack(builder: inout FlatBufferBuilder) -> Offset {\n    switch type {\n    case .m1:\n      var __obj = value as? MyGame_Example_MonsterT\n      return MyGame_Example_Monster.pack(&builder, obj: &__obj)\n    case .m2:\n      var __obj = value as? MyGame_Example_MonsterT\n      return MyGame_Example_Monster.pack(&builder, obj: &__obj)\n    case .m3:\n      var __obj = value as? MyGame_Example_MonsterT\n      return MyGame_Example_Monster.pack(&builder, obj: &__obj)\n    default: return Offset()\n    }\n  }\n}\npublic struct MyGame_Example_Test: NativeStruct, FlatbuffersVectorInitializable, Verifiable, FlatbuffersInitializable, NativeObject {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n\n  private var _a: Int16\n  private var _b: Int8\n  private var padding0__: UInt8 = 0\n\n  public init(_ bb: ByteBuffer, o: Int32) {\n    self = bb.read(def: Self.self, position: Int(o))\n  }\n\n  public init(a: Int16, b: Int8) {\n    _a = a\n    _b = b\n  }\n\n  public init() {\n    _a = 0\n    _b = 0\n  }\n\n  public init(_ _t: borrowing MyGame_Example_Test_Mutable) {\n    _a = _t.a\n    _b = _t.b\n  }\n\n  public var a: Int16 { _a }\n  public var b: Int8 { _b }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    try verifier.inBuffer(position: position, of: MyGame_Example_Test.self)\n  }\n}\n\nextension MyGame_Example_Test: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case a = \"a\"\n    case b = \"b\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    if a != 0 {\n      try container.encodeIfPresent(a, forKey: .a)\n    }\n    if b != 0 {\n      try container.encodeIfPresent(b, forKey: .b)\n    }\n  }\n}\n\npublic struct MyGame_Example_Test_Mutable: FlatBufferStruct, FlatbuffersVectorInitializable {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Struct\n\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }\n\n  public var a: Int16 { return _accessor.readBuffer(of: Int16.self, at: 0) }\n  @discardableResult public func mutate(a: Int16) -> Bool { return _accessor.mutate(a, index: 0) }\n  public var b: Int8 { return _accessor.readBuffer(of: Int8.self, at: 2) }\n  @discardableResult public func mutate(b: Int8) -> Bool { return _accessor.mutate(b, index: 2) }\n\n  public func unpack() -> MyGame_Example_Test {\n    return MyGame_Example_Test(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_Test?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_Test) -> Offset {\n    return builder.create(struct: obj)\n  }\n}\n\npublic struct MyGame_Example_Vec3: NativeStruct, FlatbuffersVectorInitializable, Verifiable, FlatbuffersInitializable, NativeObject {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n\n  private var _x: Float32\n  private var _y: Float32\n  private var _z: Float32\n  private var padding0__: UInt32 = 0\n  private var _test1: Double\n  private var _test2: UInt8\n  private var padding1__: UInt8 = 0\n  private var _test3: MyGame_Example_Test\n  private var padding2__: UInt16 = 0\n\n  public init(_ bb: ByteBuffer, o: Int32) {\n    self = bb.read(def: Self.self, position: Int(o))\n  }\n\n  public init(x: Float32, y: Float32, z: Float32, test1: Double, test2: MyGame_Example_Color, test3: MyGame_Example_Test) {\n    _x = x\n    _y = y\n    _z = z\n    _test1 = test1\n    _test2 = test2.value\n    _test3 = test3\n  }\n\n  public init() {\n    _x = 0.0\n    _y = 0.0\n    _z = 0.0\n    _test1 = 0.0\n    _test2 = 0\n    _test3 = MyGame_Example_Test()\n  }\n\n  public init(_ _t: borrowing MyGame_Example_Vec3_Mutable) {\n    _x = _t.x\n    _y = _t.y\n    _z = _t.z\n    _test1 = _t.test1\n    _test2 = _t.test2.value\n    let _vtest3 = _t.test3\n    _test3 = _vtest3.unpack()\n  }\n\n  public var x: Float32 { _x }\n  public var y: Float32 { _y }\n  public var z: Float32 { _z }\n  public var test1: Double { _test1 }\n  public var test2: MyGame_Example_Color { MyGame_Example_Color(rawValue: _test2)! }\n  public var test3: MyGame_Example_Test { _test3 }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    try verifier.inBuffer(position: position, of: MyGame_Example_Vec3.self)\n  }\n}\n\nextension MyGame_Example_Vec3: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case x = \"x\"\n    case y = \"y\"\n    case z = \"z\"\n    case test1 = \"test1\"\n    case test2 = \"test2\"\n    case test3 = \"test3\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    if x != 0.0 {\n      try container.encodeIfPresent(x, forKey: .x)\n    }\n    if y != 0.0 {\n      try container.encodeIfPresent(y, forKey: .y)\n    }\n    if z != 0.0 {\n      try container.encodeIfPresent(z, forKey: .z)\n    }\n    if test1 != 0.0 {\n      try container.encodeIfPresent(test1, forKey: .test1)\n    }\n    if test2 != .red {\n      try container.encodeIfPresent(test2, forKey: .test2)\n    }\n    try container.encodeIfPresent(test3, forKey: .test3)\n  }\n}\n\npublic struct MyGame_Example_Vec3_Mutable: FlatBufferStruct, FlatbuffersVectorInitializable {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Struct\n\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }\n\n  public var x: Float32 { return _accessor.readBuffer(of: Float32.self, at: 0) }\n  @discardableResult public func mutate(x: Float32) -> Bool { return _accessor.mutate(x, index: 0) }\n  public var y: Float32 { return _accessor.readBuffer(of: Float32.self, at: 4) }\n  @discardableResult public func mutate(y: Float32) -> Bool { return _accessor.mutate(y, index: 4) }\n  public var z: Float32 { return _accessor.readBuffer(of: Float32.self, at: 8) }\n  @discardableResult public func mutate(z: Float32) -> Bool { return _accessor.mutate(z, index: 8) }\n  public var test1: Double { return _accessor.readBuffer(of: Double.self, at: 16) }\n  @discardableResult public func mutate(test1: Double) -> Bool { return _accessor.mutate(test1, index: 16) }\n  public var test2: MyGame_Example_Color { return MyGame_Example_Color(rawValue: _accessor.readBuffer(of: UInt8.self, at: 24)) ?? .red }\n  @discardableResult public func mutate(test2: MyGame_Example_Color) -> Bool { return _accessor.mutate(test2.rawValue, index: 24) }\n  public var test3: MyGame_Example_Test_Mutable { return MyGame_Example_Test_Mutable(_accessor.bb, o: _accessor.position + 26) }\n\n  public func unpack() -> MyGame_Example_Vec3 {\n    return MyGame_Example_Vec3(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_Vec3?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_Vec3) -> Offset {\n    return builder.create(struct: obj)\n  }\n}\n\npublic struct MyGame_Example_Ability: NativeStruct, FlatbuffersVectorInitializable, Verifiable, FlatbuffersInitializable, NativeObject {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n\n  private var _id: UInt32\n  private var _distance: UInt32\n\n  public init(_ bb: ByteBuffer, o: Int32) {\n    self = bb.read(def: Self.self, position: Int(o))\n  }\n\n  public init(id: UInt32, distance: UInt32) {\n    _id = id\n    _distance = distance\n  }\n\n  public init() {\n    _id = 0\n    _distance = 0\n  }\n\n  public init(_ _t: borrowing MyGame_Example_Ability_Mutable) {\n    _id = _t.id\n    _distance = _t.distance\n  }\n\n  public var id: UInt32 { _id }\n  public var distance: UInt32 { _distance }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    try verifier.inBuffer(position: position, of: MyGame_Example_Ability.self)\n  }\n}\n\nextension MyGame_Example_Ability: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case id = \"id\"\n    case distance = \"distance\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    if id != 0 {\n      try container.encodeIfPresent(id, forKey: .id)\n    }\n    if distance != 0 {\n      try container.encodeIfPresent(distance, forKey: .distance)\n    }\n  }\n}\n\npublic struct MyGame_Example_Ability_Mutable: FlatBufferStruct, FlatbuffersVectorInitializable {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Struct\n\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }\n\n  public var id: UInt32 { return _accessor.readBuffer(of: UInt32.self, at: 0) }\n  @discardableResult public func mutate(id: UInt32) -> Bool { return _accessor.mutate(id, index: 0) }\n  public var distance: UInt32 { return _accessor.readBuffer(of: UInt32.self, at: 4) }\n  @discardableResult public func mutate(distance: UInt32) -> Bool { return _accessor.mutate(distance, index: 4) }\n\n  public func unpack() -> MyGame_Example_Ability {\n    return MyGame_Example_Ability(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_Ability?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_Ability) -> Offset {\n    return builder.create(struct: obj)\n  }\n}\n\npublic struct MyGame_Example_StructOfStructs: NativeStruct, FlatbuffersVectorInitializable, Verifiable, FlatbuffersInitializable, NativeObject {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n\n  private var _a: MyGame_Example_Ability\n  private var _b: MyGame_Example_Test\n  private var _c: MyGame_Example_Ability\n\n  public init(_ bb: ByteBuffer, o: Int32) {\n    self = bb.read(def: Self.self, position: Int(o))\n  }\n\n  public init(a: MyGame_Example_Ability, b: MyGame_Example_Test, c: MyGame_Example_Ability) {\n    _a = a\n    _b = b\n    _c = c\n  }\n\n  public init() {\n    _a = MyGame_Example_Ability()\n    _b = MyGame_Example_Test()\n    _c = MyGame_Example_Ability()\n  }\n\n  public init(_ _t: borrowing MyGame_Example_StructOfStructs_Mutable) {\n    let _va = _t.a\n    _a = _va.unpack()\n    let _vb = _t.b\n    _b = _vb.unpack()\n    let _vc = _t.c\n    _c = _vc.unpack()\n  }\n\n  public var a: MyGame_Example_Ability { _a }\n  public var b: MyGame_Example_Test { _b }\n  public var c: MyGame_Example_Ability { _c }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    try verifier.inBuffer(position: position, of: MyGame_Example_StructOfStructs.self)\n  }\n}\n\nextension MyGame_Example_StructOfStructs: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case a = \"a\"\n    case b = \"b\"\n    case c = \"c\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    try container.encodeIfPresent(a, forKey: .a)\n    try container.encodeIfPresent(b, forKey: .b)\n    try container.encodeIfPresent(c, forKey: .c)\n  }\n}\n\npublic struct MyGame_Example_StructOfStructs_Mutable: FlatBufferStruct, FlatbuffersVectorInitializable {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Struct\n\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }\n\n  public var a: MyGame_Example_Ability_Mutable { return MyGame_Example_Ability_Mutable(_accessor.bb, o: _accessor.position + 0) }\n  public var b: MyGame_Example_Test_Mutable { return MyGame_Example_Test_Mutable(_accessor.bb, o: _accessor.position + 8) }\n  public var c: MyGame_Example_Ability_Mutable { return MyGame_Example_Ability_Mutable(_accessor.bb, o: _accessor.position + 12) }\n\n  public func unpack() -> MyGame_Example_StructOfStructs {\n    return MyGame_Example_StructOfStructs(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_StructOfStructs?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_StructOfStructs) -> Offset {\n    return builder.create(struct: obj)\n  }\n}\n\npublic struct MyGame_Example_StructOfStructsOfStructs: NativeStruct, FlatbuffersVectorInitializable, Verifiable, FlatbuffersInitializable, NativeObject {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n\n  private var _a: MyGame_Example_StructOfStructs\n\n  public init(_ bb: ByteBuffer, o: Int32) {\n    self = bb.read(def: Self.self, position: Int(o))\n  }\n\n  public init(a: MyGame_Example_StructOfStructs) {\n    _a = a\n  }\n\n  public init() {\n    _a = MyGame_Example_StructOfStructs()\n  }\n\n  public init(_ _t: borrowing MyGame_Example_StructOfStructsOfStructs_Mutable) {\n    let _va = _t.a\n    _a = _va.unpack()\n  }\n\n  public var a: MyGame_Example_StructOfStructs { _a }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    try verifier.inBuffer(position: position, of: MyGame_Example_StructOfStructsOfStructs.self)\n  }\n}\n\nextension MyGame_Example_StructOfStructsOfStructs: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case a = \"a\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    try container.encodeIfPresent(a, forKey: .a)\n  }\n}\n\npublic struct MyGame_Example_StructOfStructsOfStructs_Mutable: FlatBufferStruct, FlatbuffersVectorInitializable {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Struct\n\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }\n\n  public var a: MyGame_Example_StructOfStructs_Mutable { return MyGame_Example_StructOfStructs_Mutable(_accessor.bb, o: _accessor.position + 0) }\n\n  public func unpack() -> MyGame_Example_StructOfStructsOfStructs {\n    return MyGame_Example_StructOfStructsOfStructs(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_StructOfStructsOfStructs?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_StructOfStructsOfStructs) -> Offset {\n    return builder.create(struct: obj)\n  }\n}\n\npublic struct MyGame_InParentNamespace: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable, ObjectAPIPacker {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  public static var id: String { \"MONS\" } \n  public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset, prefix: Bool = false) { fbb.finish(offset: end, fileId: MyGame_InParentNamespace.id, addPrefix: prefix) }\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  public static func startInParentNamespace(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 0) }\n  public static func endInParentNamespace(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n\n  public func unpack() -> MyGame_InParentNamespaceT {\n    return MyGame_InParentNamespaceT(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_InParentNamespaceT?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_InParentNamespaceT) -> Offset {\n    let __root = MyGame_InParentNamespace.startInParentNamespace(&builder)\n    return MyGame_InParentNamespace.endInParentNamespace(&builder, start: __root)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    _v.finish()\n  }\n}\n\nextension MyGame_InParentNamespace: Encodable {\n  public func encode(to encoder: Encoder) throws {\n  }\n}\n\npublic class MyGame_InParentNamespaceT: NativeObject {\n\n\n  public init(_ _t: borrowing MyGame_InParentNamespace) {\n  }\n\n  public init() {\n  }\n\n  public func serialize() -> ByteBuffer { return serialize(type: MyGame_InParentNamespace.self) }\n\n}\npublic struct MyGame_Example2_Monster: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable, ObjectAPIPacker {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  public static var id: String { \"MONS\" } \n  public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset, prefix: Bool = false) { fbb.finish(offset: end, fileId: MyGame_Example2_Monster.id, addPrefix: prefix) }\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  public static func startMonster(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 0) }\n  public static func endMonster(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n\n  public func unpack() -> MyGame_Example2_MonsterT {\n    return MyGame_Example2_MonsterT(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example2_MonsterT?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example2_MonsterT) -> Offset {\n    let __root = MyGame_Example2_Monster.startMonster(&builder)\n    return MyGame_Example2_Monster.endMonster(&builder, start: __root)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    _v.finish()\n  }\n}\n\nextension MyGame_Example2_Monster: Encodable {\n  public func encode(to encoder: Encoder) throws {\n  }\n}\n\npublic class MyGame_Example2_MonsterT: NativeObject {\n\n\n  public init(_ _t: borrowing MyGame_Example2_Monster) {\n  }\n\n  public init() {\n  }\n\n  public func serialize() -> ByteBuffer { return serialize(type: MyGame_Example2_Monster.self) }\n\n}\ninternal struct MyGame_Example_TestSimpleTableWithEnum: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable, ObjectAPIPacker {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  internal var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  internal static var id: String { \"MONS\" } \n  internal static func finish(_ fbb: inout FlatBufferBuilder, end: Offset, prefix: Bool = false) { fbb.finish(offset: end, fileId: MyGame_Example_TestSimpleTableWithEnum.id, addPrefix: prefix) }\n  private init(_ t: Table) { _accessor = t }\n  internal init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private struct VT {\n    static let color: VOffset = 4\n  }\n\n  internal var color: MyGame_Example_Color { let o = _accessor.offset(VT.color); return o == 0 ? .green : MyGame_Example_Color(rawValue: _accessor.readBuffer(of: UInt8.self, at: o)) ?? .green }\n  @discardableResult internal func mutate(color: MyGame_Example_Color) -> Bool {let o = _accessor.offset(VT.color);  return _accessor.mutate(color.rawValue, index: o) }\n  internal static func startTestSimpleTableWithEnum(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) }\n  internal static func add(color: MyGame_Example_Color, _ fbb: inout FlatBufferBuilder) { fbb.add(element: color.rawValue, def: 2, at: VT.color) }\n  internal static func endTestSimpleTableWithEnum(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n  internal static func createTestSimpleTableWithEnum(\n    _ fbb: inout FlatBufferBuilder,\n    color: MyGame_Example_Color = .green\n  ) -> Offset {\n    let __start = MyGame_Example_TestSimpleTableWithEnum.startTestSimpleTableWithEnum(&fbb)\n    MyGame_Example_TestSimpleTableWithEnum.add(color: color, &fbb)\n    return MyGame_Example_TestSimpleTableWithEnum.endTestSimpleTableWithEnum(&fbb, start: __start)\n  }\n\n  internal func unpack() -> MyGame_Example_TestSimpleTableWithEnumT {\n    return MyGame_Example_TestSimpleTableWithEnumT(self)\n  }\n  internal static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_TestSimpleTableWithEnumT?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  internal static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_TestSimpleTableWithEnumT) -> Offset {\n    let __root = MyGame_Example_TestSimpleTableWithEnum.startTestSimpleTableWithEnum(&builder)\n    MyGame_Example_TestSimpleTableWithEnum.add(color: obj.color, &builder)\n    return MyGame_Example_TestSimpleTableWithEnum.endTestSimpleTableWithEnum(&builder, start: __root)\n  }\n\n  internal static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    try _v.visit(field: VT.color, fieldName: \"color\", required: false, type: MyGame_Example_Color.self)\n    _v.finish()\n  }\n}\n\nextension MyGame_Example_TestSimpleTableWithEnum: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case color = \"color\"\n  }\n\n  internal func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    if color != .green {\n      try container.encodeIfPresent(color, forKey: .color)\n    }\n  }\n}\n\ninternal class MyGame_Example_TestSimpleTableWithEnumT: NativeObject {\n\n  internal var color: MyGame_Example_Color\n\n  internal init(_ _t: borrowing MyGame_Example_TestSimpleTableWithEnum) {\n    color = _t.color\n  }\n\n  internal init() {\n    color = .green\n  }\n\n  internal func serialize() -> ByteBuffer { return serialize(type: MyGame_Example_TestSimpleTableWithEnum.self) }\n\n}\npublic struct MyGame_Example_Stat: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable, ObjectAPIPacker {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  public static var id: String { \"MONS\" } \n  public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset, prefix: Bool = false) { fbb.finish(offset: end, fileId: MyGame_Example_Stat.id, addPrefix: prefix) }\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private struct VT {\n    static let id: VOffset = 4\n    static let val: VOffset = 6\n    static let count: VOffset = 8\n  }\n\n  public var id: String? { let o = _accessor.offset(VT.id); return o == 0 ? nil : _accessor.string(at: o) }\n  public var idSegmentArray: [UInt8]? { return _accessor.getVector(at: VT.id) }\n  public var val: Int64 { let o = _accessor.offset(VT.val); return o == 0 ? 0 : _accessor.readBuffer(of: Int64.self, at: o) }\n  @discardableResult public func mutate(val: Int64) -> Bool {let o = _accessor.offset(VT.val);  return _accessor.mutate(val, index: o) }\n  public var count: UInt16 { let o = _accessor.offset(VT.count); return o == 0 ? 0 : _accessor.readBuffer(of: UInt16.self, at: o) }\n  @discardableResult public func mutate(count: UInt16) -> Bool {let o = _accessor.offset(VT.count);  return _accessor.mutate(count, index: o) }\n  public static func startStat(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 3) }\n  public static func add(id: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: id, at: VT.id) }\n  public static func add(val: Int64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: val, def: 0, at: VT.val) }\n  public static func add(count: UInt16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: count, def: 0, at: VT.count) }\n  public static func endStat(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n  public static func createStat(\n    _ fbb: inout FlatBufferBuilder,\n    idOffset id: Offset = Offset(),\n    val: Int64 = 0,\n    count: UInt16 = 0\n  ) -> Offset {\n    let __start = MyGame_Example_Stat.startStat(&fbb)\n    MyGame_Example_Stat.add(id: id, &fbb)\n    MyGame_Example_Stat.add(val: val, &fbb)\n    MyGame_Example_Stat.add(count: count, &fbb)\n    return MyGame_Example_Stat.endStat(&fbb, start: __start)\n  }\n  public static func sortVectorOfStat(offsets:[Offset], _ fbb: inout FlatBufferBuilder) -> Offset {\n    var off = offsets\n    off.sort { Table.compare(Table.offset(Int32($1.o), vOffset: 8, fbb: &fbb), Table.offset(Int32($0.o), vOffset: 8, fbb: &fbb), fbb: &fbb) < 0 } \n    return fbb.createVector(ofOffsets: off)\n  }\n  fileprivate static func lookupByKey(vector: Int32, key: UInt16, fbb: ByteBuffer) -> MyGame_Example_Stat? {\n    var span = fbb.read(def: Int32.self, position: Int(vector - 4))\n    var start: Int32 = 0\n    while span != 0 {\n      var middle = span / 2\n      let tableOffset = Table.indirect(vector + 4 * (start + middle), fbb)\n      let comp = fbb.read(def: UInt16.self, position: Int(Table.offset(Int32(fbb.capacity) - tableOffset, vOffset: 8, fbb: fbb)))\n      if comp > 0 {\n        span = middle\n      } else if comp < 0 {\n        middle += 1\n        start += middle\n        span -= middle\n      } else {\n        return MyGame_Example_Stat(fbb, o: tableOffset)\n      }\n    }\n    return nil\n  }\n\n  public func unpack() -> MyGame_Example_StatT {\n    return MyGame_Example_StatT(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_StatT?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_StatT) -> Offset {\n    let __id: Offset\n    if let s = obj.id {\n      __id = builder.create(string: s)\n    } else {\n      __id = Offset()\n    }\n\n    let __root = MyGame_Example_Stat.startStat(&builder)\n    MyGame_Example_Stat.add(id: __id, &builder)\n    MyGame_Example_Stat.add(val: obj.val, &builder)\n    MyGame_Example_Stat.add(count: obj.count, &builder)\n    return MyGame_Example_Stat.endStat(&builder, start: __root)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    try _v.visit(field: VT.id, fieldName: \"id\", required: false, type: ForwardOffset<String>.self)\n    try _v.visit(field: VT.val, fieldName: \"val\", required: false, type: Int64.self)\n    try _v.visit(field: VT.count, fieldName: \"count\", required: false, type: UInt16.self)\n    _v.finish()\n  }\n}\n\nextension MyGame_Example_Stat: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case id = \"id\"\n    case val = \"val\"\n    case count = \"count\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    try container.encodeIfPresent(id, forKey: .id)\n    if val != 0 {\n      try container.encodeIfPresent(val, forKey: .val)\n    }\n    if count != 0 {\n      try container.encodeIfPresent(count, forKey: .count)\n    }\n  }\n}\n\npublic class MyGame_Example_StatT: NativeObject {\n\n  public var id: String?\n  public var val: Int64\n  public var count: UInt16\n\n  public init(_ _t: borrowing MyGame_Example_Stat) {\n    id = _t.id\n    val = _t.val\n    count = _t.count\n  }\n\n  public init() {\n    val = 0\n    count = 0\n  }\n\n  public func serialize() -> ByteBuffer { return serialize(type: MyGame_Example_Stat.self) }\n\n}\npublic struct MyGame_Example_Referrable: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable, ObjectAPIPacker {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  public static var id: String { \"MONS\" } \n  public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset, prefix: Bool = false) { fbb.finish(offset: end, fileId: MyGame_Example_Referrable.id, addPrefix: prefix) }\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private struct VT {\n    static let id: VOffset = 4\n  }\n\n  public var id: UInt64 { let o = _accessor.offset(VT.id); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }\n  @discardableResult public func mutate(id: UInt64) -> Bool {let o = _accessor.offset(VT.id);  return _accessor.mutate(id, index: o) }\n  public static func startReferrable(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) }\n  public static func add(id: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: id, def: 0, at: VT.id) }\n  public static func endReferrable(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n  public static func createReferrable(\n    _ fbb: inout FlatBufferBuilder,\n    id: UInt64 = 0\n  ) -> Offset {\n    let __start = MyGame_Example_Referrable.startReferrable(&fbb)\n    MyGame_Example_Referrable.add(id: id, &fbb)\n    return MyGame_Example_Referrable.endReferrable(&fbb, start: __start)\n  }\n  public static func sortVectorOfReferrable(offsets:[Offset], _ fbb: inout FlatBufferBuilder) -> Offset {\n    var off = offsets\n    off.sort { Table.compare(Table.offset(Int32($1.o), vOffset: 4, fbb: &fbb), Table.offset(Int32($0.o), vOffset: 4, fbb: &fbb), fbb: &fbb) < 0 } \n    return fbb.createVector(ofOffsets: off)\n  }\n  fileprivate static func lookupByKey(vector: Int32, key: UInt64, fbb: ByteBuffer) -> MyGame_Example_Referrable? {\n    var span = fbb.read(def: Int32.self, position: Int(vector - 4))\n    var start: Int32 = 0\n    while span != 0 {\n      var middle = span / 2\n      let tableOffset = Table.indirect(vector + 4 * (start + middle), fbb)\n      let comp = fbb.read(def: UInt64.self, position: Int(Table.offset(Int32(fbb.capacity) - tableOffset, vOffset: 4, fbb: fbb)))\n      if comp > 0 {\n        span = middle\n      } else if comp < 0 {\n        middle += 1\n        start += middle\n        span -= middle\n      } else {\n        return MyGame_Example_Referrable(fbb, o: tableOffset)\n      }\n    }\n    return nil\n  }\n\n  public func unpack() -> MyGame_Example_ReferrableT {\n    return MyGame_Example_ReferrableT(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_ReferrableT?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_ReferrableT) -> Offset {\n    let __root = MyGame_Example_Referrable.startReferrable(&builder)\n    MyGame_Example_Referrable.add(id: obj.id, &builder)\n    return MyGame_Example_Referrable.endReferrable(&builder, start: __root)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    try _v.visit(field: VT.id, fieldName: \"id\", required: false, type: UInt64.self)\n    _v.finish()\n  }\n}\n\nextension MyGame_Example_Referrable: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case id = \"id\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    if id != 0 {\n      try container.encodeIfPresent(id, forKey: .id)\n    }\n  }\n}\n\npublic class MyGame_Example_ReferrableT: NativeObject {\n\n  public var id: UInt64\n\n  public init(_ _t: borrowing MyGame_Example_Referrable) {\n    id = _t.id\n  }\n\n  public init() {\n    id = 0\n  }\n\n  public func serialize() -> ByteBuffer { return serialize(type: MyGame_Example_Referrable.self) }\n\n}\n///  an example documentation comment: \"monster object\"\npublic struct MyGame_Example_Monster: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable, ObjectAPIPacker {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  public static var id: String { \"MONS\" } \n  public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset, prefix: Bool = false) { fbb.finish(offset: end, fileId: MyGame_Example_Monster.id, addPrefix: prefix) }\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private struct VT {\n    static let pos: VOffset = 4\n    static let mana: VOffset = 6\n    static let hp: VOffset = 8\n    static let name: VOffset = 10\n    static let inventory: VOffset = 14\n    static let color: VOffset = 16\n    static let testType: VOffset = 18\n    static let test: VOffset = 20\n    static let test4: VOffset = 22\n    static let testarrayofstring: VOffset = 24\n    static let testarrayoftables: VOffset = 26\n    static let enemy: VOffset = 28\n    static let testnestedflatbuffer: VOffset = 30\n    static let testempty: VOffset = 32\n    static let testbool: VOffset = 34\n    static let testhashs32Fnv1: VOffset = 36\n    static let testhashu32Fnv1: VOffset = 38\n    static let testhashs64Fnv1: VOffset = 40\n    static let testhashu64Fnv1: VOffset = 42\n    static let testhashs32Fnv1a: VOffset = 44\n    static let testhashu32Fnv1a: VOffset = 46\n    static let testhashs64Fnv1a: VOffset = 48\n    static let testhashu64Fnv1a: VOffset = 50\n    static let testarrayofbools: VOffset = 52\n    static let testf: VOffset = 54\n    static let testf2: VOffset = 56\n    static let testf3: VOffset = 58\n    static let testarrayofstring2: VOffset = 60\n    static let testarrayofsortedstruct: VOffset = 62\n    static let flex: VOffset = 64\n    static let test5: VOffset = 66\n    static let vectorOfLongs: VOffset = 68\n    static let vectorOfDoubles: VOffset = 70\n    static let parentNamespaceTest: VOffset = 72\n    static let vectorOfReferrables: VOffset = 74\n    static let singleWeakReference: VOffset = 76\n    static let vectorOfWeakReferences: VOffset = 78\n    static let vectorOfStrongReferrables: VOffset = 80\n    static let coOwningReference: VOffset = 82\n    static let vectorOfCoOwningReferences: VOffset = 84\n    static let nonOwningReference: VOffset = 86\n    static let vectorOfNonOwningReferences: VOffset = 88\n    static let anyUniqueType: VOffset = 90\n    static let anyUnique: VOffset = 92\n    static let anyAmbiguousType: VOffset = 94\n    static let anyAmbiguous: VOffset = 96\n    static let vectorOfEnums: VOffset = 98\n    static let signedEnum: VOffset = 100\n    static let testrequirednestedflatbuffer: VOffset = 102\n    static let scalarKeySortedTables: VOffset = 104\n    static let nativeInline: VOffset = 106\n    static let longEnumNonEnumDefault: VOffset = 108\n    static let longEnumNormalDefault: VOffset = 110\n    static let nanDefault: VOffset = 112\n    static let infDefault: VOffset = 114\n    static let positiveInfDefault: VOffset = 116\n    static let infinityDefault: VOffset = 118\n    static let positiveInfinityDefault: VOffset = 120\n    static let negativeInfDefault: VOffset = 122\n    static let negativeInfinityDefault: VOffset = 124\n    static let doubleInfDefault: VOffset = 126\n  }\n\n  public var pos: MyGame_Example_Vec3? { let o = _accessor.offset(VT.pos); return o == 0 ? nil : _accessor.readBuffer(of: MyGame_Example_Vec3.self, at: o) }\n  public var mutablePos: MyGame_Example_Vec3_Mutable? { let o = _accessor.offset(VT.pos); return o == 0 ? nil : MyGame_Example_Vec3_Mutable(_accessor.bb, o: o + _accessor.position) }\n  public var mana: Int16 { let o = _accessor.offset(VT.mana); return o == 0 ? 150 : _accessor.readBuffer(of: Int16.self, at: o) }\n  @discardableResult public func mutate(mana: Int16) -> Bool {let o = _accessor.offset(VT.mana);  return _accessor.mutate(mana, index: o) }\n  public var hp: Int16 { let o = _accessor.offset(VT.hp); return o == 0 ? 100 : _accessor.readBuffer(of: Int16.self, at: o) }\n  @discardableResult public func mutate(hp: Int16) -> Bool {let o = _accessor.offset(VT.hp);  return _accessor.mutate(hp, index: o) }\n  public var name: String! { let o = _accessor.offset(VT.name); return _accessor.string(at: o) }\n  public var nameSegmentArray: [UInt8]! { return _accessor.getVector(at: VT.name) }\n  public var inventory: FlatbufferVector<UInt8> { return _accessor.vector(at: VT.inventory, byteSize: 1) }\n  public func mutate(inventory: UInt8, at index: Int32) -> Bool { let o = _accessor.offset(VT.inventory); return _accessor.directMutate(inventory, index: _accessor.vector(at: o) + index * 1) }\n  public func withUnsafePointerToInventory<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.inventory, body: body) }\n  public var color: MyGame_Example_Color { let o = _accessor.offset(VT.color); return o == 0 ? .blue : MyGame_Example_Color(rawValue: _accessor.readBuffer(of: UInt8.self, at: o)) ?? .blue }\n  @discardableResult public func mutate(color: MyGame_Example_Color) -> Bool {let o = _accessor.offset(VT.color);  return _accessor.mutate(color.rawValue, index: o) }\n  public var testType: MyGame_Example_Any_ { let o = _accessor.offset(VT.testType); return o == 0 ? .none_ : MyGame_Example_Any_(rawValue: _accessor.readBuffer(of: UInt8.self, at: o)) ?? .none_ }\n  public func test<T: FlatbuffersInitializable>(type: T.Type) -> T? { let o = _accessor.offset(VT.test); return o == 0 ? nil : _accessor.union(o) }\n  public var test4: FlatbufferVector<MyGame_Example_Test> { return _accessor.vector(at: VT.test4, byteSize: 4) }\n  public var mutableTest4: FlatbufferVector<MyGame_Example_Test_Mutable> { return _accessor.vector(at: VT.test4, byteSize: 4) }\n  public func withUnsafePointerToTest4<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.test4, body: body) }\n  public var testarrayofstring: FlatbufferVector<String?> { return _accessor.vector(at: VT.testarrayofstring, byteSize: 4) }\n  ///  an example documentation comment: this will end up in the generated code\n  ///  multiline too\n  public var testarrayoftables: FlatbufferVector<MyGame_Example_Monster> { return _accessor.vector(at: VT.testarrayoftables, byteSize: 4) }\n  public func testarrayoftablesBy(key: String) -> MyGame_Example_Monster? { let o = _accessor.offset(VT.testarrayoftables); return o == 0 ? nil : MyGame_Example_Monster.lookupByKey(vector: _accessor.vector(at: o), key: key, fbb: _accessor.bb) }\n  public var enemy: MyGame_Example_Monster? { let o = _accessor.offset(VT.enemy); return o == 0 ? nil : MyGame_Example_Monster(_accessor.bb, o: _accessor.indirect(o + _accessor.position)) }\n  public var testnestedflatbuffer: FlatbufferVector<UInt8> { return _accessor.vector(at: VT.testnestedflatbuffer, byteSize: 1) }\n  public func mutate(testnestedflatbuffer: UInt8, at index: Int32) -> Bool { let o = _accessor.offset(VT.testnestedflatbuffer); return _accessor.directMutate(testnestedflatbuffer, index: _accessor.vector(at: o) + index * 1) }\n  public func withUnsafePointerToTestnestedflatbuffer<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.testnestedflatbuffer, body: body) }\n  public var testempty: MyGame_Example_Stat? { let o = _accessor.offset(VT.testempty); return o == 0 ? nil : MyGame_Example_Stat(_accessor.bb, o: _accessor.indirect(o + _accessor.position)) }\n  public var testbool: Bool { let o = _accessor.offset(VT.testbool); return o == 0 ? false : _accessor.readBuffer(of: Bool.self, at: o) }\n  @discardableResult public func mutate(testbool: Bool) -> Bool {let o = _accessor.offset(VT.testbool);  return _accessor.mutate(testbool, index: o) }\n  public var testhashs32Fnv1: Int32 { let o = _accessor.offset(VT.testhashs32Fnv1); return o == 0 ? 0 : _accessor.readBuffer(of: Int32.self, at: o) }\n  @discardableResult public func mutate(testhashs32Fnv1: Int32) -> Bool {let o = _accessor.offset(VT.testhashs32Fnv1);  return _accessor.mutate(testhashs32Fnv1, index: o) }\n  public var testhashu32Fnv1: UInt32 { let o = _accessor.offset(VT.testhashu32Fnv1); return o == 0 ? 0 : _accessor.readBuffer(of: UInt32.self, at: o) }\n  @discardableResult public func mutate(testhashu32Fnv1: UInt32) -> Bool {let o = _accessor.offset(VT.testhashu32Fnv1);  return _accessor.mutate(testhashu32Fnv1, index: o) }\n  public var testhashs64Fnv1: Int64 { let o = _accessor.offset(VT.testhashs64Fnv1); return o == 0 ? 0 : _accessor.readBuffer(of: Int64.self, at: o) }\n  @discardableResult public func mutate(testhashs64Fnv1: Int64) -> Bool {let o = _accessor.offset(VT.testhashs64Fnv1);  return _accessor.mutate(testhashs64Fnv1, index: o) }\n  public var testhashu64Fnv1: UInt64 { let o = _accessor.offset(VT.testhashu64Fnv1); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }\n  @discardableResult public func mutate(testhashu64Fnv1: UInt64) -> Bool {let o = _accessor.offset(VT.testhashu64Fnv1);  return _accessor.mutate(testhashu64Fnv1, index: o) }\n  public var testhashs32Fnv1a: Int32 { let o = _accessor.offset(VT.testhashs32Fnv1a); return o == 0 ? 0 : _accessor.readBuffer(of: Int32.self, at: o) }\n  @discardableResult public func mutate(testhashs32Fnv1a: Int32) -> Bool {let o = _accessor.offset(VT.testhashs32Fnv1a);  return _accessor.mutate(testhashs32Fnv1a, index: o) }\n  public var testhashu32Fnv1a: UInt32 { let o = _accessor.offset(VT.testhashu32Fnv1a); return o == 0 ? 0 : _accessor.readBuffer(of: UInt32.self, at: o) }\n  @discardableResult public func mutate(testhashu32Fnv1a: UInt32) -> Bool {let o = _accessor.offset(VT.testhashu32Fnv1a);  return _accessor.mutate(testhashu32Fnv1a, index: o) }\n  public var testhashs64Fnv1a: Int64 { let o = _accessor.offset(VT.testhashs64Fnv1a); return o == 0 ? 0 : _accessor.readBuffer(of: Int64.self, at: o) }\n  @discardableResult public func mutate(testhashs64Fnv1a: Int64) -> Bool {let o = _accessor.offset(VT.testhashs64Fnv1a);  return _accessor.mutate(testhashs64Fnv1a, index: o) }\n  public var testhashu64Fnv1a: UInt64 { let o = _accessor.offset(VT.testhashu64Fnv1a); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }\n  @discardableResult public func mutate(testhashu64Fnv1a: UInt64) -> Bool {let o = _accessor.offset(VT.testhashu64Fnv1a);  return _accessor.mutate(testhashu64Fnv1a, index: o) }\n  public var testarrayofbools: FlatbufferVector<Bool> { return _accessor.vector(at: VT.testarrayofbools, byteSize: 1) }\n  public func mutate(testarrayofbools: Bool, at index: Int32) -> Bool { let o = _accessor.offset(VT.testarrayofbools); return _accessor.directMutate(testarrayofbools, index: _accessor.vector(at: o) + index * 1) }\n  public func withUnsafePointerToTestarrayofbools<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.testarrayofbools, body: body) }\n  public var testf: Float32 { let o = _accessor.offset(VT.testf); return o == 0 ? 3.14159 : _accessor.readBuffer(of: Float32.self, at: o) }\n  @discardableResult public func mutate(testf: Float32) -> Bool {let o = _accessor.offset(VT.testf);  return _accessor.mutate(testf, index: o) }\n  public var testf2: Float32 { let o = _accessor.offset(VT.testf2); return o == 0 ? 3.0 : _accessor.readBuffer(of: Float32.self, at: o) }\n  @discardableResult public func mutate(testf2: Float32) -> Bool {let o = _accessor.offset(VT.testf2);  return _accessor.mutate(testf2, index: o) }\n  public var testf3: Float32 { let o = _accessor.offset(VT.testf3); return o == 0 ? 0.0 : _accessor.readBuffer(of: Float32.self, at: o) }\n  @discardableResult public func mutate(testf3: Float32) -> Bool {let o = _accessor.offset(VT.testf3);  return _accessor.mutate(testf3, index: o) }\n  public var testarrayofstring2: FlatbufferVector<String?> { return _accessor.vector(at: VT.testarrayofstring2, byteSize: 4) }\n  public var testarrayofsortedstruct: FlatbufferVector<MyGame_Example_Ability> { return _accessor.vector(at: VT.testarrayofsortedstruct, byteSize: 8) }\n  public var mutableTestarrayofsortedstruct: FlatbufferVector<MyGame_Example_Ability_Mutable> { return _accessor.vector(at: VT.testarrayofsortedstruct, byteSize: 8) }\n  public func withUnsafePointerToTestarrayofsortedstruct<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.testarrayofsortedstruct, body: body) }\n  public var flex: FlatbufferVector<UInt8> { return _accessor.vector(at: VT.flex, byteSize: 1) }\n  public func mutate(flex: UInt8, at index: Int32) -> Bool { let o = _accessor.offset(VT.flex); return _accessor.directMutate(flex, index: _accessor.vector(at: o) + index * 1) }\n  public func withUnsafePointerToFlex<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.flex, body: body) }\n  public var test5: FlatbufferVector<MyGame_Example_Test> { return _accessor.vector(at: VT.test5, byteSize: 4) }\n  public var mutableTest5: FlatbufferVector<MyGame_Example_Test_Mutable> { return _accessor.vector(at: VT.test5, byteSize: 4) }\n  public func withUnsafePointerToTest5<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.test5, body: body) }\n  public var vectorOfLongs: FlatbufferVector<Int64> { return _accessor.vector(at: VT.vectorOfLongs, byteSize: 8) }\n  public func mutate(vectorOfLongs: Int64, at index: Int32) -> Bool { let o = _accessor.offset(VT.vectorOfLongs); return _accessor.directMutate(vectorOfLongs, index: _accessor.vector(at: o) + index * 8) }\n  public func withUnsafePointerToVectorOfLongs<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.vectorOfLongs, body: body) }\n  public var vectorOfDoubles: FlatbufferVector<Double> { return _accessor.vector(at: VT.vectorOfDoubles, byteSize: 8) }\n  public func mutate(vectorOfDoubles: Double, at index: Int32) -> Bool { let o = _accessor.offset(VT.vectorOfDoubles); return _accessor.directMutate(vectorOfDoubles, index: _accessor.vector(at: o) + index * 8) }\n  public func withUnsafePointerToVectorOfDoubles<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.vectorOfDoubles, body: body) }\n  public var parentNamespaceTest: MyGame_InParentNamespace? { let o = _accessor.offset(VT.parentNamespaceTest); return o == 0 ? nil : MyGame_InParentNamespace(_accessor.bb, o: _accessor.indirect(o + _accessor.position)) }\n  public var vectorOfReferrables: FlatbufferVector<MyGame_Example_Referrable> { return _accessor.vector(at: VT.vectorOfReferrables, byteSize: 4) }\n  public func vectorOfReferrablesBy(key: UInt64) -> MyGame_Example_Referrable? { let o = _accessor.offset(VT.vectorOfReferrables); return o == 0 ? nil : MyGame_Example_Referrable.lookupByKey(vector: _accessor.vector(at: o), key: key, fbb: _accessor.bb) }\n  public var singleWeakReference: UInt64 { let o = _accessor.offset(VT.singleWeakReference); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }\n  @discardableResult public func mutate(singleWeakReference: UInt64) -> Bool {let o = _accessor.offset(VT.singleWeakReference);  return _accessor.mutate(singleWeakReference, index: o) }\n  public var vectorOfWeakReferences: FlatbufferVector<UInt64> { return _accessor.vector(at: VT.vectorOfWeakReferences, byteSize: 8) }\n  public func mutate(vectorOfWeakReferences: UInt64, at index: Int32) -> Bool { let o = _accessor.offset(VT.vectorOfWeakReferences); return _accessor.directMutate(vectorOfWeakReferences, index: _accessor.vector(at: o) + index * 8) }\n  public func withUnsafePointerToVectorOfWeakReferences<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.vectorOfWeakReferences, body: body) }\n  public var vectorOfStrongReferrables: FlatbufferVector<MyGame_Example_Referrable> { return _accessor.vector(at: VT.vectorOfStrongReferrables, byteSize: 4) }\n  public func vectorOfStrongReferrablesBy(key: UInt64) -> MyGame_Example_Referrable? { let o = _accessor.offset(VT.vectorOfStrongReferrables); return o == 0 ? nil : MyGame_Example_Referrable.lookupByKey(vector: _accessor.vector(at: o), key: key, fbb: _accessor.bb) }\n  public var coOwningReference: UInt64 { let o = _accessor.offset(VT.coOwningReference); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }\n  @discardableResult public func mutate(coOwningReference: UInt64) -> Bool {let o = _accessor.offset(VT.coOwningReference);  return _accessor.mutate(coOwningReference, index: o) }\n  public var vectorOfCoOwningReferences: FlatbufferVector<UInt64> { return _accessor.vector(at: VT.vectorOfCoOwningReferences, byteSize: 8) }\n  public func mutate(vectorOfCoOwningReferences: UInt64, at index: Int32) -> Bool { let o = _accessor.offset(VT.vectorOfCoOwningReferences); return _accessor.directMutate(vectorOfCoOwningReferences, index: _accessor.vector(at: o) + index * 8) }\n  public func withUnsafePointerToVectorOfCoOwningReferences<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.vectorOfCoOwningReferences, body: body) }\n  public var nonOwningReference: UInt64 { let o = _accessor.offset(VT.nonOwningReference); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }\n  @discardableResult public func mutate(nonOwningReference: UInt64) -> Bool {let o = _accessor.offset(VT.nonOwningReference);  return _accessor.mutate(nonOwningReference, index: o) }\n  public var vectorOfNonOwningReferences: FlatbufferVector<UInt64> { return _accessor.vector(at: VT.vectorOfNonOwningReferences, byteSize: 8) }\n  public func mutate(vectorOfNonOwningReferences: UInt64, at index: Int32) -> Bool { let o = _accessor.offset(VT.vectorOfNonOwningReferences); return _accessor.directMutate(vectorOfNonOwningReferences, index: _accessor.vector(at: o) + index * 8) }\n  public func withUnsafePointerToVectorOfNonOwningReferences<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.vectorOfNonOwningReferences, body: body) }\n  public var anyUniqueType: MyGame_Example_AnyUniqueAliases { let o = _accessor.offset(VT.anyUniqueType); return o == 0 ? .none_ : MyGame_Example_AnyUniqueAliases(rawValue: _accessor.readBuffer(of: UInt8.self, at: o)) ?? .none_ }\n  public func anyUnique<T: FlatbuffersInitializable>(type: T.Type) -> T? { let o = _accessor.offset(VT.anyUnique); return o == 0 ? nil : _accessor.union(o) }\n  public var anyAmbiguousType: MyGame_Example_AnyAmbiguousAliases { let o = _accessor.offset(VT.anyAmbiguousType); return o == 0 ? .none_ : MyGame_Example_AnyAmbiguousAliases(rawValue: _accessor.readBuffer(of: UInt8.self, at: o)) ?? .none_ }\n  public func anyAmbiguous<T: FlatbuffersInitializable>(type: T.Type) -> T? { let o = _accessor.offset(VT.anyAmbiguous); return o == 0 ? nil : _accessor.union(o) }\n  public var vectorOfEnums: FlatbufferVector<MyGame_Example_Color> { return _accessor.vector(at: VT.vectorOfEnums, byteSize: 1) }\n  public var signedEnum: MyGame_Example_Race { let o = _accessor.offset(VT.signedEnum); return o == 0 ? .none_ : MyGame_Example_Race(rawValue: _accessor.readBuffer(of: Int8.self, at: o)) ?? .none_ }\n  @discardableResult public func mutate(signedEnum: MyGame_Example_Race) -> Bool {let o = _accessor.offset(VT.signedEnum);  return _accessor.mutate(signedEnum.rawValue, index: o) }\n  public var testrequirednestedflatbuffer: FlatbufferVector<UInt8> { return _accessor.vector(at: VT.testrequirednestedflatbuffer, byteSize: 1) }\n  public func mutate(testrequirednestedflatbuffer: UInt8, at index: Int32) -> Bool { let o = _accessor.offset(VT.testrequirednestedflatbuffer); return _accessor.directMutate(testrequirednestedflatbuffer, index: _accessor.vector(at: o) + index * 1) }\n  public func withUnsafePointerToTestrequirednestedflatbuffer<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.testrequirednestedflatbuffer, body: body) }\n  public var scalarKeySortedTables: FlatbufferVector<MyGame_Example_Stat> { return _accessor.vector(at: VT.scalarKeySortedTables, byteSize: 4) }\n  public func scalarKeySortedTablesBy(key: UInt16) -> MyGame_Example_Stat? { let o = _accessor.offset(VT.scalarKeySortedTables); return o == 0 ? nil : MyGame_Example_Stat.lookupByKey(vector: _accessor.vector(at: o), key: key, fbb: _accessor.bb) }\n  public var nativeInline: MyGame_Example_Test? { let o = _accessor.offset(VT.nativeInline); return o == 0 ? nil : _accessor.readBuffer(of: MyGame_Example_Test.self, at: o) }\n  public var mutableNativeInline: MyGame_Example_Test_Mutable? { let o = _accessor.offset(VT.nativeInline); return o == 0 ? nil : MyGame_Example_Test_Mutable(_accessor.bb, o: o + _accessor.position) }\n  public var longEnumNonEnumDefault: MyGame_Example_LongEnum { let o = _accessor.offset(VT.longEnumNonEnumDefault); return o == 0 ? .longone : MyGame_Example_LongEnum(rawValue: _accessor.readBuffer(of: UInt64.self, at: o)) ?? .longone }\n  @discardableResult public func mutate(longEnumNonEnumDefault: MyGame_Example_LongEnum) -> Bool {let o = _accessor.offset(VT.longEnumNonEnumDefault);  return _accessor.mutate(longEnumNonEnumDefault.rawValue, index: o) }\n  public var longEnumNormalDefault: MyGame_Example_LongEnum { let o = _accessor.offset(VT.longEnumNormalDefault); return o == 0 ? .longone : MyGame_Example_LongEnum(rawValue: _accessor.readBuffer(of: UInt64.self, at: o)) ?? .longone }\n  @discardableResult public func mutate(longEnumNormalDefault: MyGame_Example_LongEnum) -> Bool {let o = _accessor.offset(VT.longEnumNormalDefault);  return _accessor.mutate(longEnumNormalDefault.rawValue, index: o) }\n  public var nanDefault: Float32 { let o = _accessor.offset(VT.nanDefault); return o == 0 ? .nan : _accessor.readBuffer(of: Float32.self, at: o) }\n  @discardableResult public func mutate(nanDefault: Float32) -> Bool {let o = _accessor.offset(VT.nanDefault);  return _accessor.mutate(nanDefault, index: o) }\n  public var infDefault: Float32 { let o = _accessor.offset(VT.infDefault); return o == 0 ? .infinity : _accessor.readBuffer(of: Float32.self, at: o) }\n  @discardableResult public func mutate(infDefault: Float32) -> Bool {let o = _accessor.offset(VT.infDefault);  return _accessor.mutate(infDefault, index: o) }\n  public var positiveInfDefault: Float32 { let o = _accessor.offset(VT.positiveInfDefault); return o == 0 ? .infinity : _accessor.readBuffer(of: Float32.self, at: o) }\n  @discardableResult public func mutate(positiveInfDefault: Float32) -> Bool {let o = _accessor.offset(VT.positiveInfDefault);  return _accessor.mutate(positiveInfDefault, index: o) }\n  public var infinityDefault: Float32 { let o = _accessor.offset(VT.infinityDefault); return o == 0 ? .infinity : _accessor.readBuffer(of: Float32.self, at: o) }\n  @discardableResult public func mutate(infinityDefault: Float32) -> Bool {let o = _accessor.offset(VT.infinityDefault);  return _accessor.mutate(infinityDefault, index: o) }\n  public var positiveInfinityDefault: Float32 { let o = _accessor.offset(VT.positiveInfinityDefault); return o == 0 ? .infinity : _accessor.readBuffer(of: Float32.self, at: o) }\n  @discardableResult public func mutate(positiveInfinityDefault: Float32) -> Bool {let o = _accessor.offset(VT.positiveInfinityDefault);  return _accessor.mutate(positiveInfinityDefault, index: o) }\n  public var negativeInfDefault: Float32 { let o = _accessor.offset(VT.negativeInfDefault); return o == 0 ? -.infinity : _accessor.readBuffer(of: Float32.self, at: o) }\n  @discardableResult public func mutate(negativeInfDefault: Float32) -> Bool {let o = _accessor.offset(VT.negativeInfDefault);  return _accessor.mutate(negativeInfDefault, index: o) }\n  public var negativeInfinityDefault: Float32 { let o = _accessor.offset(VT.negativeInfinityDefault); return o == 0 ? -.infinity : _accessor.readBuffer(of: Float32.self, at: o) }\n  @discardableResult public func mutate(negativeInfinityDefault: Float32) -> Bool {let o = _accessor.offset(VT.negativeInfinityDefault);  return _accessor.mutate(negativeInfinityDefault, index: o) }\n  public var doubleInfDefault: Double { let o = _accessor.offset(VT.doubleInfDefault); return o == 0 ? .infinity : _accessor.readBuffer(of: Double.self, at: o) }\n  @discardableResult public func mutate(doubleInfDefault: Double) -> Bool {let o = _accessor.offset(VT.doubleInfDefault);  return _accessor.mutate(doubleInfDefault, index: o) }\n  public static func startMonster(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 62) }\n  public static func add(pos: MyGame_Example_Vec3?, _ fbb: inout FlatBufferBuilder) { guard let pos = pos else { return }; fbb.create(struct: pos, position: VT.pos) }\n  public static func add(mana: Int16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: mana, def: 150, at: VT.mana) }\n  public static func add(hp: Int16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: hp, def: 100, at: VT.hp) }\n  public static func add(name: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: name, at: VT.name) }\n  public static func addVectorOf(inventory: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: inventory, at: VT.inventory) }\n  public static func add(color: MyGame_Example_Color, _ fbb: inout FlatBufferBuilder) { fbb.add(element: color.rawValue, def: 8, at: VT.color) }\n  public static func add(testType: MyGame_Example_Any_, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testType.rawValue, def: 0, at: VT.testType) }\n  public static func add(test: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: test, at: VT.test) }\n  public static func addVectorOf(test4: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: test4, at: VT.test4) }\n  public static func startVectorOfTest4(_ size: Int, in builder: inout FlatBufferBuilder) {\n    builder.startVector(size * MemoryLayout<MyGame_Example_Test>.size, elementSize: MemoryLayout<MyGame_Example_Test>.alignment)\n  }\n  public static func addVectorOf(testarrayofstring: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testarrayofstring, at: VT.testarrayofstring) }\n  public static func addVectorOf(testarrayoftables: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testarrayoftables, at: VT.testarrayoftables) }\n  public static func add(enemy: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: enemy, at: VT.enemy) }\n  public static func addVectorOf(testnestedflatbuffer: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testnestedflatbuffer, at: VT.testnestedflatbuffer) }\n  public static func add(testempty: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testempty, at: VT.testempty) }\n  public static func add(testbool: Bool, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testbool, def: false,\n   at: VT.testbool) }\n  public static func add(testhashs32Fnv1: Int32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashs32Fnv1, def: 0, at: VT.testhashs32Fnv1) }\n  public static func add(testhashu32Fnv1: UInt32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashu32Fnv1, def: 0, at: VT.testhashu32Fnv1) }\n  public static func add(testhashs64Fnv1: Int64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashs64Fnv1, def: 0, at: VT.testhashs64Fnv1) }\n  public static func add(testhashu64Fnv1: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashu64Fnv1, def: 0, at: VT.testhashu64Fnv1) }\n  public static func add(testhashs32Fnv1a: Int32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashs32Fnv1a, def: 0, at: VT.testhashs32Fnv1a) }\n  public static func add(testhashu32Fnv1a: UInt32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashu32Fnv1a, def: 0, at: VT.testhashu32Fnv1a) }\n  public static func add(testhashs64Fnv1a: Int64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashs64Fnv1a, def: 0, at: VT.testhashs64Fnv1a) }\n  public static func add(testhashu64Fnv1a: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashu64Fnv1a, def: 0, at: VT.testhashu64Fnv1a) }\n  public static func addVectorOf(testarrayofbools: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testarrayofbools, at: VT.testarrayofbools) }\n  public static func add(testf: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testf, def: 3.14159, at: VT.testf) }\n  public static func add(testf2: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testf2, def: 3.0, at: VT.testf2) }\n  public static func add(testf3: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testf3, def: 0.0, at: VT.testf3) }\n  public static func addVectorOf(testarrayofstring2: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testarrayofstring2, at: VT.testarrayofstring2) }\n  public static func addVectorOf(testarrayofsortedstruct: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testarrayofsortedstruct, at: VT.testarrayofsortedstruct) }\n  public static func startVectorOfTestarrayofsortedstruct(_ size: Int, in builder: inout FlatBufferBuilder) {\n    builder.startVector(size * MemoryLayout<MyGame_Example_Ability>.size, elementSize: MemoryLayout<MyGame_Example_Ability>.alignment)\n  }\n  public static func addVectorOf(flex: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: flex, at: VT.flex) }\n  public static func addVectorOf(test5: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: test5, at: VT.test5) }\n  public static func startVectorOfTest5(_ size: Int, in builder: inout FlatBufferBuilder) {\n    builder.startVector(size * MemoryLayout<MyGame_Example_Test>.size, elementSize: MemoryLayout<MyGame_Example_Test>.alignment)\n  }\n  public static func addVectorOf(vectorOfLongs: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfLongs, at: VT.vectorOfLongs) }\n  public static func addVectorOf(vectorOfDoubles: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfDoubles, at: VT.vectorOfDoubles) }\n  public static func add(parentNamespaceTest: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: parentNamespaceTest, at: VT.parentNamespaceTest) }\n  public static func addVectorOf(vectorOfReferrables: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfReferrables, at: VT.vectorOfReferrables) }\n  public static func add(singleWeakReference: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: singleWeakReference, def: 0, at: VT.singleWeakReference) }\n  public static func addVectorOf(vectorOfWeakReferences: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfWeakReferences, at: VT.vectorOfWeakReferences) }\n  public static func addVectorOf(vectorOfStrongReferrables: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfStrongReferrables, at: VT.vectorOfStrongReferrables) }\n  public static func add(coOwningReference: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: coOwningReference, def: 0, at: VT.coOwningReference) }\n  public static func addVectorOf(vectorOfCoOwningReferences: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfCoOwningReferences, at: VT.vectorOfCoOwningReferences) }\n  public static func add(nonOwningReference: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: nonOwningReference, def: 0, at: VT.nonOwningReference) }\n  public static func addVectorOf(vectorOfNonOwningReferences: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfNonOwningReferences, at: VT.vectorOfNonOwningReferences) }\n  public static func add(anyUniqueType: MyGame_Example_AnyUniqueAliases, _ fbb: inout FlatBufferBuilder) { fbb.add(element: anyUniqueType.rawValue, def: 0, at: VT.anyUniqueType) }\n  public static func add(anyUnique: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: anyUnique, at: VT.anyUnique) }\n  public static func add(anyAmbiguousType: MyGame_Example_AnyAmbiguousAliases, _ fbb: inout FlatBufferBuilder) { fbb.add(element: anyAmbiguousType.rawValue, def: 0, at: VT.anyAmbiguousType) }\n  public static func add(anyAmbiguous: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: anyAmbiguous, at: VT.anyAmbiguous) }\n  public static func addVectorOf(vectorOfEnums: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfEnums, at: VT.vectorOfEnums) }\n  public static func add(signedEnum: MyGame_Example_Race, _ fbb: inout FlatBufferBuilder) { fbb.add(element: signedEnum.rawValue, def: -1, at: VT.signedEnum) }\n  public static func addVectorOf(testrequirednestedflatbuffer: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testrequirednestedflatbuffer, at: VT.testrequirednestedflatbuffer) }\n  public static func addVectorOf(scalarKeySortedTables: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: scalarKeySortedTables, at: VT.scalarKeySortedTables) }\n  public static func add(nativeInline: MyGame_Example_Test?, _ fbb: inout FlatBufferBuilder) { guard let nativeInline = nativeInline else { return }; fbb.create(struct: nativeInline, position: VT.nativeInline) }\n  public static func add(longEnumNonEnumDefault: MyGame_Example_LongEnum, _ fbb: inout FlatBufferBuilder) { fbb.add(element: longEnumNonEnumDefault.rawValue, def: 0, at: VT.longEnumNonEnumDefault) }\n  public static func add(longEnumNormalDefault: MyGame_Example_LongEnum, _ fbb: inout FlatBufferBuilder) { fbb.add(element: longEnumNormalDefault.rawValue, def: 2, at: VT.longEnumNormalDefault) }\n  public static func add(nanDefault: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: nanDefault, def: .nan, at: VT.nanDefault) }\n  public static func add(infDefault: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: infDefault, def: .infinity, at: VT.infDefault) }\n  public static func add(positiveInfDefault: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: positiveInfDefault, def: .infinity, at: VT.positiveInfDefault) }\n  public static func add(infinityDefault: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: infinityDefault, def: .infinity, at: VT.infinityDefault) }\n  public static func add(positiveInfinityDefault: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: positiveInfinityDefault, def: .infinity, at: VT.positiveInfinityDefault) }\n  public static func add(negativeInfDefault: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: negativeInfDefault, def: -.infinity, at: VT.negativeInfDefault) }\n  public static func add(negativeInfinityDefault: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: negativeInfinityDefault, def: -.infinity, at: VT.negativeInfinityDefault) }\n  public static func add(doubleInfDefault: Double, _ fbb: inout FlatBufferBuilder) { fbb.add(element: doubleInfDefault, def: .infinity, at: VT.doubleInfDefault) }\n  public static func endMonster(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); fbb.require(table: end, fields: [10]); return end }\n  public static func createMonster(\n    _ fbb: inout FlatBufferBuilder,\n    pos: MyGame_Example_Vec3? = nil,\n    mana: Int16 = 150,\n    hp: Int16 = 100,\n    nameOffset name: Offset,\n    inventoryVectorOffset inventory: Offset = Offset(),\n    color: MyGame_Example_Color = .blue,\n    testType: MyGame_Example_Any_ = .none_,\n    testOffset test: Offset = Offset(),\n    test4VectorOffset test4: Offset = Offset(),\n    testarrayofstringVectorOffset testarrayofstring: Offset = Offset(),\n    testarrayoftablesVectorOffset testarrayoftables: Offset = Offset(),\n    enemyOffset enemy: Offset = Offset(),\n    testnestedflatbufferVectorOffset testnestedflatbuffer: Offset = Offset(),\n    testemptyOffset testempty: Offset = Offset(),\n    testbool: Bool = false,\n    testhashs32Fnv1: Int32 = 0,\n    testhashu32Fnv1: UInt32 = 0,\n    testhashs64Fnv1: Int64 = 0,\n    testhashu64Fnv1: UInt64 = 0,\n    testhashs32Fnv1a: Int32 = 0,\n    testhashu32Fnv1a: UInt32 = 0,\n    testhashs64Fnv1a: Int64 = 0,\n    testhashu64Fnv1a: UInt64 = 0,\n    testarrayofboolsVectorOffset testarrayofbools: Offset = Offset(),\n    testf: Float32 = 3.14159,\n    testf2: Float32 = 3.0,\n    testf3: Float32 = 0.0,\n    testarrayofstring2VectorOffset testarrayofstring2: Offset = Offset(),\n    testarrayofsortedstructVectorOffset testarrayofsortedstruct: Offset = Offset(),\n    flexVectorOffset flex: Offset = Offset(),\n    test5VectorOffset test5: Offset = Offset(),\n    vectorOfLongsVectorOffset vectorOfLongs: Offset = Offset(),\n    vectorOfDoublesVectorOffset vectorOfDoubles: Offset = Offset(),\n    parentNamespaceTestOffset parentNamespaceTest: Offset = Offset(),\n    vectorOfReferrablesVectorOffset vectorOfReferrables: Offset = Offset(),\n    singleWeakReference: UInt64 = 0,\n    vectorOfWeakReferencesVectorOffset vectorOfWeakReferences: Offset = Offset(),\n    vectorOfStrongReferrablesVectorOffset vectorOfStrongReferrables: Offset = Offset(),\n    coOwningReference: UInt64 = 0,\n    vectorOfCoOwningReferencesVectorOffset vectorOfCoOwningReferences: Offset = Offset(),\n    nonOwningReference: UInt64 = 0,\n    vectorOfNonOwningReferencesVectorOffset vectorOfNonOwningReferences: Offset = Offset(),\n    anyUniqueType: MyGame_Example_AnyUniqueAliases = .none_,\n    anyUniqueOffset anyUnique: Offset = Offset(),\n    anyAmbiguousType: MyGame_Example_AnyAmbiguousAliases = .none_,\n    anyAmbiguousOffset anyAmbiguous: Offset = Offset(),\n    vectorOfEnumsVectorOffset vectorOfEnums: Offset = Offset(),\n    signedEnum: MyGame_Example_Race = .none_,\n    testrequirednestedflatbufferVectorOffset testrequirednestedflatbuffer: Offset = Offset(),\n    scalarKeySortedTablesVectorOffset scalarKeySortedTables: Offset = Offset(),\n    nativeInline: MyGame_Example_Test? = nil,\n    longEnumNonEnumDefault: MyGame_Example_LongEnum = .longone,\n    longEnumNormalDefault: MyGame_Example_LongEnum = .longone,\n    nanDefault: Float32 = .nan,\n    infDefault: Float32 = .infinity,\n    positiveInfDefault: Float32 = .infinity,\n    infinityDefault: Float32 = .infinity,\n    positiveInfinityDefault: Float32 = .infinity,\n    negativeInfDefault: Float32 = -.infinity,\n    negativeInfinityDefault: Float32 = -.infinity,\n    doubleInfDefault: Double = .infinity\n  ) -> Offset {\n    let __start = MyGame_Example_Monster.startMonster(&fbb)\n    MyGame_Example_Monster.add(pos: pos, &fbb)\n    MyGame_Example_Monster.add(mana: mana, &fbb)\n    MyGame_Example_Monster.add(hp: hp, &fbb)\n    MyGame_Example_Monster.add(name: name, &fbb)\n    MyGame_Example_Monster.addVectorOf(inventory: inventory, &fbb)\n    MyGame_Example_Monster.add(color: color, &fbb)\n    MyGame_Example_Monster.add(testType: testType, &fbb)\n    MyGame_Example_Monster.add(test: test, &fbb)\n    MyGame_Example_Monster.addVectorOf(test4: test4, &fbb)\n    MyGame_Example_Monster.addVectorOf(testarrayofstring: testarrayofstring, &fbb)\n    MyGame_Example_Monster.addVectorOf(testarrayoftables: testarrayoftables, &fbb)\n    MyGame_Example_Monster.add(enemy: enemy, &fbb)\n    MyGame_Example_Monster.addVectorOf(testnestedflatbuffer: testnestedflatbuffer, &fbb)\n    MyGame_Example_Monster.add(testempty: testempty, &fbb)\n    MyGame_Example_Monster.add(testbool: testbool, &fbb)\n    MyGame_Example_Monster.add(testhashs32Fnv1: testhashs32Fnv1, &fbb)\n    MyGame_Example_Monster.add(testhashu32Fnv1: testhashu32Fnv1, &fbb)\n    MyGame_Example_Monster.add(testhashs64Fnv1: testhashs64Fnv1, &fbb)\n    MyGame_Example_Monster.add(testhashu64Fnv1: testhashu64Fnv1, &fbb)\n    MyGame_Example_Monster.add(testhashs32Fnv1a: testhashs32Fnv1a, &fbb)\n    MyGame_Example_Monster.add(testhashu32Fnv1a: testhashu32Fnv1a, &fbb)\n    MyGame_Example_Monster.add(testhashs64Fnv1a: testhashs64Fnv1a, &fbb)\n    MyGame_Example_Monster.add(testhashu64Fnv1a: testhashu64Fnv1a, &fbb)\n    MyGame_Example_Monster.addVectorOf(testarrayofbools: testarrayofbools, &fbb)\n    MyGame_Example_Monster.add(testf: testf, &fbb)\n    MyGame_Example_Monster.add(testf2: testf2, &fbb)\n    MyGame_Example_Monster.add(testf3: testf3, &fbb)\n    MyGame_Example_Monster.addVectorOf(testarrayofstring2: testarrayofstring2, &fbb)\n    MyGame_Example_Monster.addVectorOf(testarrayofsortedstruct: testarrayofsortedstruct, &fbb)\n    MyGame_Example_Monster.addVectorOf(flex: flex, &fbb)\n    MyGame_Example_Monster.addVectorOf(test5: test5, &fbb)\n    MyGame_Example_Monster.addVectorOf(vectorOfLongs: vectorOfLongs, &fbb)\n    MyGame_Example_Monster.addVectorOf(vectorOfDoubles: vectorOfDoubles, &fbb)\n    MyGame_Example_Monster.add(parentNamespaceTest: parentNamespaceTest, &fbb)\n    MyGame_Example_Monster.addVectorOf(vectorOfReferrables: vectorOfReferrables, &fbb)\n    MyGame_Example_Monster.add(singleWeakReference: singleWeakReference, &fbb)\n    MyGame_Example_Monster.addVectorOf(vectorOfWeakReferences: vectorOfWeakReferences, &fbb)\n    MyGame_Example_Monster.addVectorOf(vectorOfStrongReferrables: vectorOfStrongReferrables, &fbb)\n    MyGame_Example_Monster.add(coOwningReference: coOwningReference, &fbb)\n    MyGame_Example_Monster.addVectorOf(vectorOfCoOwningReferences: vectorOfCoOwningReferences, &fbb)\n    MyGame_Example_Monster.add(nonOwningReference: nonOwningReference, &fbb)\n    MyGame_Example_Monster.addVectorOf(vectorOfNonOwningReferences: vectorOfNonOwningReferences, &fbb)\n    MyGame_Example_Monster.add(anyUniqueType: anyUniqueType, &fbb)\n    MyGame_Example_Monster.add(anyUnique: anyUnique, &fbb)\n    MyGame_Example_Monster.add(anyAmbiguousType: anyAmbiguousType, &fbb)\n    MyGame_Example_Monster.add(anyAmbiguous: anyAmbiguous, &fbb)\n    MyGame_Example_Monster.addVectorOf(vectorOfEnums: vectorOfEnums, &fbb)\n    MyGame_Example_Monster.add(signedEnum: signedEnum, &fbb)\n    MyGame_Example_Monster.addVectorOf(testrequirednestedflatbuffer: testrequirednestedflatbuffer, &fbb)\n    MyGame_Example_Monster.addVectorOf(scalarKeySortedTables: scalarKeySortedTables, &fbb)\n    MyGame_Example_Monster.add(nativeInline: nativeInline, &fbb)\n    MyGame_Example_Monster.add(longEnumNonEnumDefault: longEnumNonEnumDefault, &fbb)\n    MyGame_Example_Monster.add(longEnumNormalDefault: longEnumNormalDefault, &fbb)\n    MyGame_Example_Monster.add(nanDefault: nanDefault, &fbb)\n    MyGame_Example_Monster.add(infDefault: infDefault, &fbb)\n    MyGame_Example_Monster.add(positiveInfDefault: positiveInfDefault, &fbb)\n    MyGame_Example_Monster.add(infinityDefault: infinityDefault, &fbb)\n    MyGame_Example_Monster.add(positiveInfinityDefault: positiveInfinityDefault, &fbb)\n    MyGame_Example_Monster.add(negativeInfDefault: negativeInfDefault, &fbb)\n    MyGame_Example_Monster.add(negativeInfinityDefault: negativeInfinityDefault, &fbb)\n    MyGame_Example_Monster.add(doubleInfDefault: doubleInfDefault, &fbb)\n    return MyGame_Example_Monster.endMonster(&fbb, start: __start)\n  }\n  public static func sortVectorOfMonster(offsets:[Offset], _ fbb: inout FlatBufferBuilder) -> Offset {\n    var off = offsets\n    off.sort { Table.compare(Table.offset(Int32($1.o), vOffset: 10, fbb: &fbb), Table.offset(Int32($0.o), vOffset: 10, fbb: &fbb), fbb: &fbb) < 0 } \n    return fbb.createVector(ofOffsets: off)\n  }\n  fileprivate static func lookupByKey(vector: Int32, key: String, fbb: ByteBuffer) -> MyGame_Example_Monster? {\n    let key = key.utf8.map { $0 }\n    var span = fbb.read(def: Int32.self, position: Int(vector - 4))\n    var start: Int32 = 0\n    while span != 0 {\n      var middle = span / 2\n      let tableOffset = Table.indirect(vector + 4 * (start + middle), fbb)\n      let comp = Table.compare(Table.offset(Int32(fbb.capacity) - tableOffset, vOffset: 10, fbb: fbb), key, fbb: fbb)\n      if comp > 0 {\n        span = middle\n      } else if comp < 0 {\n        middle += 1\n        start += middle\n        span -= middle\n      } else {\n        return MyGame_Example_Monster(fbb, o: tableOffset)\n      }\n    }\n    return nil\n  }\n\n  public func unpack() -> MyGame_Example_MonsterT {\n    return MyGame_Example_MonsterT(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_MonsterT?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_MonsterT) -> Offset {\n    let __name = builder.create(string: obj.name)\n    let __inventory = builder.createVector(obj.inventory)\n    let __test = obj.test?.pack(builder: &builder) ?? Offset()\n    MyGame_Example_Monster.startVectorOfTest4(obj.test4.count, in: &builder)\n    for val in obj.test4 {\n      builder.create(struct: val)\n    }\n    let __test4 = builder.endVector(len: obj.test4.count)\n    let __testarrayofstring = builder.createVector(ofStrings: obj.testarrayofstring.compactMap({ $0 }) )\n    var __testarrayoftables__: [Offset] = []\n    for var i in obj.testarrayoftables {\n      __testarrayoftables__.append(MyGame_Example_Monster.pack(&builder, obj: &i))\n    }\n    let __testarrayoftables = builder.createVector(ofOffsets: __testarrayoftables__)\n    let __enemy = MyGame_Example_Monster.pack(&builder, obj: &obj.enemy)\n    let __testnestedflatbuffer = builder.createVector(obj.testnestedflatbuffer)\n    let __testempty = MyGame_Example_Stat.pack(&builder, obj: &obj.testempty)\n    let __testarrayofbools = builder.createVector(obj.testarrayofbools)\n    let __testarrayofstring2 = builder.createVector(ofStrings: obj.testarrayofstring2.compactMap({ $0 }) )\n    MyGame_Example_Monster.startVectorOfTestarrayofsortedstruct(obj.testarrayofsortedstruct.count, in: &builder)\n    for val in obj.testarrayofsortedstruct {\n      builder.create(struct: val)\n    }\n    let __testarrayofsortedstruct = builder.endVector(len: obj.testarrayofsortedstruct.count)\n    let __flex = builder.createVector(obj.flex)\n    MyGame_Example_Monster.startVectorOfTest5(obj.test5.count, in: &builder)\n    for val in obj.test5 {\n      builder.create(struct: val)\n    }\n    let __test5 = builder.endVector(len: obj.test5.count)\n    let __vectorOfLongs = builder.createVector(obj.vectorOfLongs)\n    let __vectorOfDoubles = builder.createVector(obj.vectorOfDoubles)\n    let __parentNamespaceTest = MyGame_InParentNamespace.pack(&builder, obj: &obj.parentNamespaceTest)\n    var __vectorOfReferrables__: [Offset] = []\n    for var i in obj.vectorOfReferrables {\n      __vectorOfReferrables__.append(MyGame_Example_Referrable.pack(&builder, obj: &i))\n    }\n    let __vectorOfReferrables = builder.createVector(ofOffsets: __vectorOfReferrables__)\n    let __vectorOfWeakReferences = builder.createVector(obj.vectorOfWeakReferences)\n    var __vectorOfStrongReferrables__: [Offset] = []\n    for var i in obj.vectorOfStrongReferrables {\n      __vectorOfStrongReferrables__.append(MyGame_Example_Referrable.pack(&builder, obj: &i))\n    }\n    let __vectorOfStrongReferrables = builder.createVector(ofOffsets: __vectorOfStrongReferrables__)\n    let __vectorOfCoOwningReferences = builder.createVector(obj.vectorOfCoOwningReferences)\n    let __vectorOfNonOwningReferences = builder.createVector(obj.vectorOfNonOwningReferences)\n    let __anyUnique = obj.anyUnique?.pack(builder: &builder) ?? Offset()\n    let __anyAmbiguous = obj.anyAmbiguous?.pack(builder: &builder) ?? Offset()\n    let __vectorOfEnums = builder.createVector(obj.vectorOfEnums)\n    let __testrequirednestedflatbuffer = builder.createVector(obj.testrequirednestedflatbuffer)\n    var __scalarKeySortedTables__: [Offset] = []\n    for var i in obj.scalarKeySortedTables {\n      __scalarKeySortedTables__.append(MyGame_Example_Stat.pack(&builder, obj: &i))\n    }\n    let __scalarKeySortedTables = builder.createVector(ofOffsets: __scalarKeySortedTables__)\n    let __root = MyGame_Example_Monster.startMonster(&builder)\n    MyGame_Example_Monster.add(pos: obj.pos, &builder)\n    MyGame_Example_Monster.add(mana: obj.mana, &builder)\n    MyGame_Example_Monster.add(hp: obj.hp, &builder)\n    MyGame_Example_Monster.add(name: __name, &builder)\n    MyGame_Example_Monster.addVectorOf(inventory: __inventory, &builder)\n    MyGame_Example_Monster.add(color: obj.color, &builder)\n    if let o = obj.test?.type {\n      MyGame_Example_Monster.add(testType: o, &builder)\n      MyGame_Example_Monster.add(test: __test, &builder)\n    }\n\n    MyGame_Example_Monster.addVectorOf(test4: __test4, &builder)\n    MyGame_Example_Monster.addVectorOf(testarrayofstring: __testarrayofstring, &builder)\n    MyGame_Example_Monster.addVectorOf(testarrayoftables: __testarrayoftables, &builder)\n    MyGame_Example_Monster.add(enemy: __enemy, &builder)\n    MyGame_Example_Monster.addVectorOf(testnestedflatbuffer: __testnestedflatbuffer, &builder)\n    MyGame_Example_Monster.add(testempty: __testempty, &builder)\n    MyGame_Example_Monster.add(testbool: obj.testbool, &builder)\n    MyGame_Example_Monster.add(testhashs32Fnv1: obj.testhashs32Fnv1, &builder)\n    MyGame_Example_Monster.add(testhashu32Fnv1: obj.testhashu32Fnv1, &builder)\n    MyGame_Example_Monster.add(testhashs64Fnv1: obj.testhashs64Fnv1, &builder)\n    MyGame_Example_Monster.add(testhashu64Fnv1: obj.testhashu64Fnv1, &builder)\n    MyGame_Example_Monster.add(testhashs32Fnv1a: obj.testhashs32Fnv1a, &builder)\n    MyGame_Example_Monster.add(testhashu32Fnv1a: obj.testhashu32Fnv1a, &builder)\n    MyGame_Example_Monster.add(testhashs64Fnv1a: obj.testhashs64Fnv1a, &builder)\n    MyGame_Example_Monster.add(testhashu64Fnv1a: obj.testhashu64Fnv1a, &builder)\n    MyGame_Example_Monster.addVectorOf(testarrayofbools: __testarrayofbools, &builder)\n    MyGame_Example_Monster.add(testf: obj.testf, &builder)\n    MyGame_Example_Monster.add(testf2: obj.testf2, &builder)\n    MyGame_Example_Monster.add(testf3: obj.testf3, &builder)\n    MyGame_Example_Monster.addVectorOf(testarrayofstring2: __testarrayofstring2, &builder)\n    MyGame_Example_Monster.addVectorOf(testarrayofsortedstruct: __testarrayofsortedstruct, &builder)\n    MyGame_Example_Monster.addVectorOf(flex: __flex, &builder)\n    MyGame_Example_Monster.addVectorOf(test5: __test5, &builder)\n    MyGame_Example_Monster.addVectorOf(vectorOfLongs: __vectorOfLongs, &builder)\n    MyGame_Example_Monster.addVectorOf(vectorOfDoubles: __vectorOfDoubles, &builder)\n    MyGame_Example_Monster.add(parentNamespaceTest: __parentNamespaceTest, &builder)\n    MyGame_Example_Monster.addVectorOf(vectorOfReferrables: __vectorOfReferrables, &builder)\n    MyGame_Example_Monster.add(singleWeakReference: obj.singleWeakReference, &builder)\n    MyGame_Example_Monster.addVectorOf(vectorOfWeakReferences: __vectorOfWeakReferences, &builder)\n    MyGame_Example_Monster.addVectorOf(vectorOfStrongReferrables: __vectorOfStrongReferrables, &builder)\n    MyGame_Example_Monster.add(coOwningReference: obj.coOwningReference, &builder)\n    MyGame_Example_Monster.addVectorOf(vectorOfCoOwningReferences: __vectorOfCoOwningReferences, &builder)\n    MyGame_Example_Monster.add(nonOwningReference: obj.nonOwningReference, &builder)\n    MyGame_Example_Monster.addVectorOf(vectorOfNonOwningReferences: __vectorOfNonOwningReferences, &builder)\n    if let o = obj.anyUnique?.type {\n      MyGame_Example_Monster.add(anyUniqueType: o, &builder)\n      MyGame_Example_Monster.add(anyUnique: __anyUnique, &builder)\n    }\n\n    if let o = obj.anyAmbiguous?.type {\n      MyGame_Example_Monster.add(anyAmbiguousType: o, &builder)\n      MyGame_Example_Monster.add(anyAmbiguous: __anyAmbiguous, &builder)\n    }\n\n    MyGame_Example_Monster.addVectorOf(vectorOfEnums: __vectorOfEnums, &builder)\n    MyGame_Example_Monster.add(signedEnum: obj.signedEnum, &builder)\n    MyGame_Example_Monster.addVectorOf(testrequirednestedflatbuffer: __testrequirednestedflatbuffer, &builder)\n    MyGame_Example_Monster.addVectorOf(scalarKeySortedTables: __scalarKeySortedTables, &builder)\n    MyGame_Example_Monster.add(nativeInline: obj.nativeInline, &builder)\n    MyGame_Example_Monster.add(longEnumNonEnumDefault: obj.longEnumNonEnumDefault, &builder)\n    MyGame_Example_Monster.add(longEnumNormalDefault: obj.longEnumNormalDefault, &builder)\n    MyGame_Example_Monster.add(nanDefault: obj.nanDefault, &builder)\n    MyGame_Example_Monster.add(infDefault: obj.infDefault, &builder)\n    MyGame_Example_Monster.add(positiveInfDefault: obj.positiveInfDefault, &builder)\n    MyGame_Example_Monster.add(infinityDefault: obj.infinityDefault, &builder)\n    MyGame_Example_Monster.add(positiveInfinityDefault: obj.positiveInfinityDefault, &builder)\n    MyGame_Example_Monster.add(negativeInfDefault: obj.negativeInfDefault, &builder)\n    MyGame_Example_Monster.add(negativeInfinityDefault: obj.negativeInfinityDefault, &builder)\n    MyGame_Example_Monster.add(doubleInfDefault: obj.doubleInfDefault, &builder)\n    return MyGame_Example_Monster.endMonster(&builder, start: __root)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    try _v.visit(field: VT.pos, fieldName: \"pos\", required: false, type: MyGame_Example_Vec3.self)\n    try _v.visit(field: VT.mana, fieldName: \"mana\", required: false, type: Int16.self)\n    try _v.visit(field: VT.hp, fieldName: \"hp\", required: false, type: Int16.self)\n    try _v.visit(field: VT.name, fieldName: \"name\", required: true, type: ForwardOffset<String>.self)\n    try _v.visit(field: VT.inventory, fieldName: \"inventory\", required: false, type: ForwardOffset<Vector<UInt8, UInt8>>.self)\n    try _v.visit(field: VT.color, fieldName: \"color\", required: false, type: MyGame_Example_Color.self)\n    try _v.visit(unionKey: VT.testType, unionField: VT.test, unionKeyName: \"testType\", fieldName: \"test\", required: false, completion: { (verifier, key: MyGame_Example_Any_, pos) in\n      switch key {\n      case .none_:\n        break // NOTE - SWIFT doesnt support none\n      case .monster:\n        try ForwardOffset<MyGame_Example_Monster>.verify(&verifier, at: pos, of: MyGame_Example_Monster.self)\n      case .testsimpletablewithenum:\n        try ForwardOffset<MyGame_Example_TestSimpleTableWithEnum>.verify(&verifier, at: pos, of: MyGame_Example_TestSimpleTableWithEnum.self)\n      case .mygameExample2Monster:\n        try ForwardOffset<MyGame_Example2_Monster>.verify(&verifier, at: pos, of: MyGame_Example2_Monster.self)\n      }\n    })\n    try _v.visit(field: VT.test4, fieldName: \"test4\", required: false, type: ForwardOffset<Vector<MyGame_Example_Test, MyGame_Example_Test>>.self)\n    try _v.visit(field: VT.testarrayofstring, fieldName: \"testarrayofstring\", required: false, type: ForwardOffset<Vector<ForwardOffset<String>, String>>.self)\n    try _v.visit(field: VT.testarrayoftables, fieldName: \"testarrayoftables\", required: false, type: ForwardOffset<Vector<ForwardOffset<MyGame_Example_Monster>, MyGame_Example_Monster>>.self)\n    try _v.visit(field: VT.enemy, fieldName: \"enemy\", required: false, type: ForwardOffset<MyGame_Example_Monster>.self)\n    try _v.visit(field: VT.testnestedflatbuffer, fieldName: \"testnestedflatbuffer\", required: false, type: ForwardOffset<Vector<UInt8, UInt8>>.self)\n    try _v.visit(field: VT.testempty, fieldName: \"testempty\", required: false, type: ForwardOffset<MyGame_Example_Stat>.self)\n    try _v.visit(field: VT.testbool, fieldName: \"testbool\", required: false, type: Bool.self)\n    try _v.visit(field: VT.testhashs32Fnv1, fieldName: \"testhashs32Fnv1\", required: false, type: Int32.self)\n    try _v.visit(field: VT.testhashu32Fnv1, fieldName: \"testhashu32Fnv1\", required: false, type: UInt32.self)\n    try _v.visit(field: VT.testhashs64Fnv1, fieldName: \"testhashs64Fnv1\", required: false, type: Int64.self)\n    try _v.visit(field: VT.testhashu64Fnv1, fieldName: \"testhashu64Fnv1\", required: false, type: UInt64.self)\n    try _v.visit(field: VT.testhashs32Fnv1a, fieldName: \"testhashs32Fnv1a\", required: false, type: Int32.self)\n    try _v.visit(field: VT.testhashu32Fnv1a, fieldName: \"testhashu32Fnv1a\", required: false, type: UInt32.self)\n    try _v.visit(field: VT.testhashs64Fnv1a, fieldName: \"testhashs64Fnv1a\", required: false, type: Int64.self)\n    try _v.visit(field: VT.testhashu64Fnv1a, fieldName: \"testhashu64Fnv1a\", required: false, type: UInt64.self)\n    try _v.visit(field: VT.testarrayofbools, fieldName: \"testarrayofbools\", required: false, type: ForwardOffset<Vector<Bool, Bool>>.self)\n    try _v.visit(field: VT.testf, fieldName: \"testf\", required: false, type: Float32.self)\n    try _v.visit(field: VT.testf2, fieldName: \"testf2\", required: false, type: Float32.self)\n    try _v.visit(field: VT.testf3, fieldName: \"testf3\", required: false, type: Float32.self)\n    try _v.visit(field: VT.testarrayofstring2, fieldName: \"testarrayofstring2\", required: false, type: ForwardOffset<Vector<ForwardOffset<String>, String>>.self)\n    try _v.visit(field: VT.testarrayofsortedstruct, fieldName: \"testarrayofsortedstruct\", required: false, type: ForwardOffset<Vector<MyGame_Example_Ability, MyGame_Example_Ability>>.self)\n    try _v.visit(field: VT.flex, fieldName: \"flex\", required: false, type: ForwardOffset<Vector<UInt8, UInt8>>.self)\n    try _v.visit(field: VT.test5, fieldName: \"test5\", required: false, type: ForwardOffset<Vector<MyGame_Example_Test, MyGame_Example_Test>>.self)\n    try _v.visit(field: VT.vectorOfLongs, fieldName: \"vectorOfLongs\", required: false, type: ForwardOffset<Vector<Int64, Int64>>.self)\n    try _v.visit(field: VT.vectorOfDoubles, fieldName: \"vectorOfDoubles\", required: false, type: ForwardOffset<Vector<Double, Double>>.self)\n    try _v.visit(field: VT.parentNamespaceTest, fieldName: \"parentNamespaceTest\", required: false, type: ForwardOffset<MyGame_InParentNamespace>.self)\n    try _v.visit(field: VT.vectorOfReferrables, fieldName: \"vectorOfReferrables\", required: false, type: ForwardOffset<Vector<ForwardOffset<MyGame_Example_Referrable>, MyGame_Example_Referrable>>.self)\n    try _v.visit(field: VT.singleWeakReference, fieldName: \"singleWeakReference\", required: false, type: UInt64.self)\n    try _v.visit(field: VT.vectorOfWeakReferences, fieldName: \"vectorOfWeakReferences\", required: false, type: ForwardOffset<Vector<UInt64, UInt64>>.self)\n    try _v.visit(field: VT.vectorOfStrongReferrables, fieldName: \"vectorOfStrongReferrables\", required: false, type: ForwardOffset<Vector<ForwardOffset<MyGame_Example_Referrable>, MyGame_Example_Referrable>>.self)\n    try _v.visit(field: VT.coOwningReference, fieldName: \"coOwningReference\", required: false, type: UInt64.self)\n    try _v.visit(field: VT.vectorOfCoOwningReferences, fieldName: \"vectorOfCoOwningReferences\", required: false, type: ForwardOffset<Vector<UInt64, UInt64>>.self)\n    try _v.visit(field: VT.nonOwningReference, fieldName: \"nonOwningReference\", required: false, type: UInt64.self)\n    try _v.visit(field: VT.vectorOfNonOwningReferences, fieldName: \"vectorOfNonOwningReferences\", required: false, type: ForwardOffset<Vector<UInt64, UInt64>>.self)\n    try _v.visit(unionKey: VT.anyUniqueType, unionField: VT.anyUnique, unionKeyName: \"anyUniqueType\", fieldName: \"anyUnique\", required: false, completion: { (verifier, key: MyGame_Example_AnyUniqueAliases, pos) in\n      switch key {\n      case .none_:\n        break // NOTE - SWIFT doesnt support none\n      case .m:\n        try ForwardOffset<MyGame_Example_Monster>.verify(&verifier, at: pos, of: MyGame_Example_Monster.self)\n      case .ts:\n        try ForwardOffset<MyGame_Example_TestSimpleTableWithEnum>.verify(&verifier, at: pos, of: MyGame_Example_TestSimpleTableWithEnum.self)\n      case .m2:\n        try ForwardOffset<MyGame_Example2_Monster>.verify(&verifier, at: pos, of: MyGame_Example2_Monster.self)\n      }\n    })\n    try _v.visit(unionKey: VT.anyAmbiguousType, unionField: VT.anyAmbiguous, unionKeyName: \"anyAmbiguousType\", fieldName: \"anyAmbiguous\", required: false, completion: { (verifier, key: MyGame_Example_AnyAmbiguousAliases, pos) in\n      switch key {\n      case .none_:\n        break // NOTE - SWIFT doesnt support none\n      case .m1:\n        try ForwardOffset<MyGame_Example_Monster>.verify(&verifier, at: pos, of: MyGame_Example_Monster.self)\n      case .m2:\n        try ForwardOffset<MyGame_Example_Monster>.verify(&verifier, at: pos, of: MyGame_Example_Monster.self)\n      case .m3:\n        try ForwardOffset<MyGame_Example_Monster>.verify(&verifier, at: pos, of: MyGame_Example_Monster.self)\n      }\n    })\n    try _v.visit(field: VT.vectorOfEnums, fieldName: \"vectorOfEnums\", required: false, type: ForwardOffset<Vector<MyGame_Example_Color, MyGame_Example_Color>>.self)\n    try _v.visit(field: VT.signedEnum, fieldName: \"signedEnum\", required: false, type: MyGame_Example_Race.self)\n    try _v.visit(field: VT.testrequirednestedflatbuffer, fieldName: \"testrequirednestedflatbuffer\", required: false, type: ForwardOffset<Vector<UInt8, UInt8>>.self)\n    try _v.visit(field: VT.scalarKeySortedTables, fieldName: \"scalarKeySortedTables\", required: false, type: ForwardOffset<Vector<ForwardOffset<MyGame_Example_Stat>, MyGame_Example_Stat>>.self)\n    try _v.visit(field: VT.nativeInline, fieldName: \"nativeInline\", required: false, type: MyGame_Example_Test.self)\n    try _v.visit(field: VT.longEnumNonEnumDefault, fieldName: \"longEnumNonEnumDefault\", required: false, type: MyGame_Example_LongEnum.self)\n    try _v.visit(field: VT.longEnumNormalDefault, fieldName: \"longEnumNormalDefault\", required: false, type: MyGame_Example_LongEnum.self)\n    try _v.visit(field: VT.nanDefault, fieldName: \"nanDefault\", required: false, type: Float32.self)\n    try _v.visit(field: VT.infDefault, fieldName: \"infDefault\", required: false, type: Float32.self)\n    try _v.visit(field: VT.positiveInfDefault, fieldName: \"positiveInfDefault\", required: false, type: Float32.self)\n    try _v.visit(field: VT.infinityDefault, fieldName: \"infinityDefault\", required: false, type: Float32.self)\n    try _v.visit(field: VT.positiveInfinityDefault, fieldName: \"positiveInfinityDefault\", required: false, type: Float32.self)\n    try _v.visit(field: VT.negativeInfDefault, fieldName: \"negativeInfDefault\", required: false, type: Float32.self)\n    try _v.visit(field: VT.negativeInfinityDefault, fieldName: \"negativeInfinityDefault\", required: false, type: Float32.self)\n    try _v.visit(field: VT.doubleInfDefault, fieldName: \"doubleInfDefault\", required: false, type: Double.self)\n    _v.finish()\n  }\n}\n\nextension MyGame_Example_Monster: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case pos = \"pos\"\n    case mana = \"mana\"\n    case hp = \"hp\"\n    case name = \"name\"\n    case inventory = \"inventory\"\n    case color = \"color\"\n    case testType = \"test_type\"\n    case test = \"test\"\n    case test4 = \"test4\"\n    case testarrayofstring = \"testarrayofstring\"\n    case testarrayoftables = \"testarrayoftables\"\n    case enemy = \"enemy\"\n    case testnestedflatbuffer = \"testnestedflatbuffer\"\n    case testempty = \"testempty\"\n    case testbool = \"testbool\"\n    case testhashs32Fnv1 = \"testhashs32_fnv1\"\n    case testhashu32Fnv1 = \"testhashu32_fnv1\"\n    case testhashs64Fnv1 = \"testhashs64_fnv1\"\n    case testhashu64Fnv1 = \"testhashu64_fnv1\"\n    case testhashs32Fnv1a = \"testhashs32_fnv1a\"\n    case testhashu32Fnv1a = \"testhashu32_fnv1a\"\n    case testhashs64Fnv1a = \"testhashs64_fnv1a\"\n    case testhashu64Fnv1a = \"testhashu64_fnv1a\"\n    case testarrayofbools = \"testarrayofbools\"\n    case testf = \"testf\"\n    case testf2 = \"testf2\"\n    case testf3 = \"testf3\"\n    case testarrayofstring2 = \"testarrayofstring2\"\n    case testarrayofsortedstruct = \"testarrayofsortedstruct\"\n    case flex = \"flex\"\n    case test5 = \"test5\"\n    case vectorOfLongs = \"vector_of_longs\"\n    case vectorOfDoubles = \"vector_of_doubles\"\n    case parentNamespaceTest = \"parent_namespace_test\"\n    case vectorOfReferrables = \"vector_of_referrables\"\n    case singleWeakReference = \"single_weak_reference\"\n    case vectorOfWeakReferences = \"vector_of_weak_references\"\n    case vectorOfStrongReferrables = \"vector_of_strong_referrables\"\n    case coOwningReference = \"co_owning_reference\"\n    case vectorOfCoOwningReferences = \"vector_of_co_owning_references\"\n    case nonOwningReference = \"non_owning_reference\"\n    case vectorOfNonOwningReferences = \"vector_of_non_owning_references\"\n    case anyUniqueType = \"any_unique_type\"\n    case anyUnique = \"any_unique\"\n    case anyAmbiguousType = \"any_ambiguous_type\"\n    case anyAmbiguous = \"any_ambiguous\"\n    case vectorOfEnums = \"vector_of_enums\"\n    case signedEnum = \"signed_enum\"\n    case testrequirednestedflatbuffer = \"testrequirednestedflatbuffer\"\n    case scalarKeySortedTables = \"scalar_key_sorted_tables\"\n    case nativeInline = \"native_inline\"\n    case longEnumNonEnumDefault = \"long_enum_non_enum_default\"\n    case longEnumNormalDefault = \"long_enum_normal_default\"\n    case nanDefault = \"nan_default\"\n    case infDefault = \"inf_default\"\n    case positiveInfDefault = \"positive_inf_default\"\n    case infinityDefault = \"infinity_default\"\n    case positiveInfinityDefault = \"positive_infinity_default\"\n    case negativeInfDefault = \"negative_inf_default\"\n    case negativeInfinityDefault = \"negative_infinity_default\"\n    case doubleInfDefault = \"double_inf_default\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    try container.encodeIfPresent(pos, forKey: .pos)\n    if mana != 150 {\n      try container.encodeIfPresent(mana, forKey: .mana)\n    }\n    if hp != 100 {\n      try container.encodeIfPresent(hp, forKey: .hp)\n    }\n    try container.encodeIfPresent(name, forKey: .name)\n    try container.encodeIfPresent(inventory, forKey: .inventory)\n    if color != .blue {\n      try container.encodeIfPresent(color, forKey: .color)\n    }\n    if testType != .none_ {\n      try container.encodeIfPresent(testType, forKey: .testType)\n    }\n    switch testType {\n    case .monster:\n      let _v = test(type: MyGame_Example_Monster.self)\n      try container.encodeIfPresent(_v, forKey: .test)\n    case .testsimpletablewithenum:\n      let _v = test(type: MyGame_Example_TestSimpleTableWithEnum.self)\n      try container.encodeIfPresent(_v, forKey: .test)\n    case .mygameExample2Monster:\n      let _v = test(type: MyGame_Example2_Monster.self)\n      try container.encodeIfPresent(_v, forKey: .test)\n    default: break;\n    }\n    try container.encodeIfPresent(test4, forKey: .test4)\n    try container.encodeIfPresent(testarrayofstring, forKey: .testarrayofstring)\n    try container.encodeIfPresent(testarrayoftables, forKey: .testarrayoftables)\n    try container.encodeIfPresent(enemy, forKey: .enemy)\n    try container.encodeIfPresent(testnestedflatbuffer, forKey: .testnestedflatbuffer)\n    try container.encodeIfPresent(testempty, forKey: .testempty)\n    if testbool != false {\n      try container.encodeIfPresent(testbool, forKey: .testbool)\n    }\n    if testhashs32Fnv1 != 0 {\n      try container.encodeIfPresent(testhashs32Fnv1, forKey: .testhashs32Fnv1)\n    }\n    if testhashu32Fnv1 != 0 {\n      try container.encodeIfPresent(testhashu32Fnv1, forKey: .testhashu32Fnv1)\n    }\n    if testhashs64Fnv1 != 0 {\n      try container.encodeIfPresent(testhashs64Fnv1, forKey: .testhashs64Fnv1)\n    }\n    if testhashu64Fnv1 != 0 {\n      try container.encodeIfPresent(testhashu64Fnv1, forKey: .testhashu64Fnv1)\n    }\n    if testhashs32Fnv1a != 0 {\n      try container.encodeIfPresent(testhashs32Fnv1a, forKey: .testhashs32Fnv1a)\n    }\n    if testhashu32Fnv1a != 0 {\n      try container.encodeIfPresent(testhashu32Fnv1a, forKey: .testhashu32Fnv1a)\n    }\n    if testhashs64Fnv1a != 0 {\n      try container.encodeIfPresent(testhashs64Fnv1a, forKey: .testhashs64Fnv1a)\n    }\n    if testhashu64Fnv1a != 0 {\n      try container.encodeIfPresent(testhashu64Fnv1a, forKey: .testhashu64Fnv1a)\n    }\n    try container.encodeIfPresent(testarrayofbools, forKey: .testarrayofbools)\n    if testf != 3.14159 {\n      try container.encodeIfPresent(testf, forKey: .testf)\n    }\n    if testf2 != 3.0 {\n      try container.encodeIfPresent(testf2, forKey: .testf2)\n    }\n    if testf3 != 0.0 {\n      try container.encodeIfPresent(testf3, forKey: .testf3)\n    }\n    try container.encodeIfPresent(testarrayofstring2, forKey: .testarrayofstring2)\n    try container.encodeIfPresent(testarrayofsortedstruct, forKey: .testarrayofsortedstruct)\n    try container.encodeIfPresent(flex, forKey: .flex)\n    try container.encodeIfPresent(test5, forKey: .test5)\n    try container.encodeIfPresent(vectorOfLongs, forKey: .vectorOfLongs)\n    try container.encodeIfPresent(vectorOfDoubles, forKey: .vectorOfDoubles)\n    try container.encodeIfPresent(parentNamespaceTest, forKey: .parentNamespaceTest)\n    try container.encodeIfPresent(vectorOfReferrables, forKey: .vectorOfReferrables)\n    if singleWeakReference != 0 {\n      try container.encodeIfPresent(singleWeakReference, forKey: .singleWeakReference)\n    }\n    try container.encodeIfPresent(vectorOfWeakReferences, forKey: .vectorOfWeakReferences)\n    try container.encodeIfPresent(vectorOfStrongReferrables, forKey: .vectorOfStrongReferrables)\n    if coOwningReference != 0 {\n      try container.encodeIfPresent(coOwningReference, forKey: .coOwningReference)\n    }\n    try container.encodeIfPresent(vectorOfCoOwningReferences, forKey: .vectorOfCoOwningReferences)\n    if nonOwningReference != 0 {\n      try container.encodeIfPresent(nonOwningReference, forKey: .nonOwningReference)\n    }\n    try container.encodeIfPresent(vectorOfNonOwningReferences, forKey: .vectorOfNonOwningReferences)\n    if anyUniqueType != .none_ {\n      try container.encodeIfPresent(anyUniqueType, forKey: .anyUniqueType)\n    }\n    switch anyUniqueType {\n    case .m:\n      let _v = anyUnique(type: MyGame_Example_Monster.self)\n      try container.encodeIfPresent(_v, forKey: .anyUnique)\n    case .ts:\n      let _v = anyUnique(type: MyGame_Example_TestSimpleTableWithEnum.self)\n      try container.encodeIfPresent(_v, forKey: .anyUnique)\n    case .m2:\n      let _v = anyUnique(type: MyGame_Example2_Monster.self)\n      try container.encodeIfPresent(_v, forKey: .anyUnique)\n    default: break;\n    }\n    if anyAmbiguousType != .none_ {\n      try container.encodeIfPresent(anyAmbiguousType, forKey: .anyAmbiguousType)\n    }\n    switch anyAmbiguousType {\n    case .m1:\n      let _v = anyAmbiguous(type: MyGame_Example_Monster.self)\n      try container.encodeIfPresent(_v, forKey: .anyAmbiguous)\n    case .m2:\n      let _v = anyAmbiguous(type: MyGame_Example_Monster.self)\n      try container.encodeIfPresent(_v, forKey: .anyAmbiguous)\n    case .m3:\n      let _v = anyAmbiguous(type: MyGame_Example_Monster.self)\n      try container.encodeIfPresent(_v, forKey: .anyAmbiguous)\n    default: break;\n    }\n    try container.encodeIfPresent(vectorOfEnums, forKey: .vectorOfEnums)\n    if signedEnum != .none_ {\n      try container.encodeIfPresent(signedEnum, forKey: .signedEnum)\n    }\n    try container.encodeIfPresent(testrequirednestedflatbuffer, forKey: .testrequirednestedflatbuffer)\n    try container.encodeIfPresent(scalarKeySortedTables, forKey: .scalarKeySortedTables)\n    try container.encodeIfPresent(nativeInline, forKey: .nativeInline)\n    if longEnumNonEnumDefault != .longone {\n      try container.encodeIfPresent(longEnumNonEnumDefault, forKey: .longEnumNonEnumDefault)\n    }\n    if longEnumNormalDefault != .longone {\n      try container.encodeIfPresent(longEnumNormalDefault, forKey: .longEnumNormalDefault)\n    }\n    if !nanDefault.isNaN {\n      try container.encodeIfPresent(nanDefault, forKey: .nanDefault)\n    }\n    if infDefault != .infinity {\n      try container.encodeIfPresent(infDefault, forKey: .infDefault)\n    }\n    if positiveInfDefault != .infinity {\n      try container.encodeIfPresent(positiveInfDefault, forKey: .positiveInfDefault)\n    }\n    if infinityDefault != .infinity {\n      try container.encodeIfPresent(infinityDefault, forKey: .infinityDefault)\n    }\n    if positiveInfinityDefault != .infinity {\n      try container.encodeIfPresent(positiveInfinityDefault, forKey: .positiveInfinityDefault)\n    }\n    if negativeInfDefault != -.infinity {\n      try container.encodeIfPresent(negativeInfDefault, forKey: .negativeInfDefault)\n    }\n    if negativeInfinityDefault != -.infinity {\n      try container.encodeIfPresent(negativeInfinityDefault, forKey: .negativeInfinityDefault)\n    }\n    if doubleInfDefault != .infinity {\n      try container.encodeIfPresent(doubleInfDefault, forKey: .doubleInfDefault)\n    }\n  }\n}\n\npublic class MyGame_Example_MonsterT: NativeObject {\n\n  public var pos: MyGame_Example_Vec3?\n  public var mana: Int16\n  public var hp: Int16\n  public var name: String\n  public var inventory: [UInt8]\n  public var color: MyGame_Example_Color\n  public var test: MyGame_Example_Any_Union?\n  public var test4: [MyGame_Example_Test]\n  public var testarrayofstring: [String?]\n  public var testarrayoftables: [MyGame_Example_MonsterT?]\n  public var enemy: MyGame_Example_MonsterT?\n  public var testnestedflatbuffer: [UInt8]\n  public var testempty: MyGame_Example_StatT?\n  public var testbool: Bool\n  public var testhashs32Fnv1: Int32\n  public var testhashu32Fnv1: UInt32\n  public var testhashs64Fnv1: Int64\n  public var testhashu64Fnv1: UInt64\n  public var testhashs32Fnv1a: Int32\n  public var testhashu32Fnv1a: UInt32\n  public var testhashs64Fnv1a: Int64\n  public var testhashu64Fnv1a: UInt64\n  public var testarrayofbools: [Bool]\n  public var testf: Float32\n  public var testf2: Float32\n  public var testf3: Float32\n  public var testarrayofstring2: [String?]\n  public var testarrayofsortedstruct: [MyGame_Example_Ability]\n  public var flex: [UInt8]\n  public var test5: [MyGame_Example_Test]\n  public var vectorOfLongs: [Int64]\n  public var vectorOfDoubles: [Double]\n  public var parentNamespaceTest: MyGame_InParentNamespaceT?\n  public var vectorOfReferrables: [MyGame_Example_ReferrableT?]\n  public var singleWeakReference: UInt64\n  public var vectorOfWeakReferences: [UInt64]\n  public var vectorOfStrongReferrables: [MyGame_Example_ReferrableT?]\n  public var coOwningReference: UInt64\n  public var vectorOfCoOwningReferences: [UInt64]\n  public var nonOwningReference: UInt64\n  public var vectorOfNonOwningReferences: [UInt64]\n  public var anyUnique: MyGame_Example_AnyUniqueAliasesUnion?\n  public var anyAmbiguous: MyGame_Example_AnyAmbiguousAliasesUnion?\n  public var vectorOfEnums: [MyGame_Example_Color]\n  public var signedEnum: MyGame_Example_Race\n  public var testrequirednestedflatbuffer: [UInt8]\n  public var scalarKeySortedTables: [MyGame_Example_StatT?]\n  public var nativeInline: MyGame_Example_Test?\n  public var longEnumNonEnumDefault: MyGame_Example_LongEnum\n  public var longEnumNormalDefault: MyGame_Example_LongEnum\n  public var nanDefault: Float32\n  public var infDefault: Float32\n  public var positiveInfDefault: Float32\n  public var infinityDefault: Float32\n  public var positiveInfinityDefault: Float32\n  public var negativeInfDefault: Float32\n  public var negativeInfinityDefault: Float32\n  public var doubleInfDefault: Double\n\n  public init(_ _t: borrowing MyGame_Example_Monster) {\n    pos = _t.pos\n    mana = _t.mana\n    hp = _t.hp\n    name = _t.name\n    inventory = []\n    inventory.append(contentsOf: _t.inventory)\n    color = _t.color\n    switch _t.testType {\n    case .monster:\n      let _v = _t.test(type: MyGame_Example_Monster.self)\n      test = MyGame_Example_Any_Union(_v?.unpack(), type: .monster)\n    case .testsimpletablewithenum:\n      let _v = _t.test(type: MyGame_Example_TestSimpleTableWithEnum.self)\n      test = MyGame_Example_Any_Union(_v?.unpack(), type: .testsimpletablewithenum)\n    case .mygameExample2Monster:\n      let _v = _t.test(type: MyGame_Example2_Monster.self)\n      test = MyGame_Example_Any_Union(_v?.unpack(), type: .mygameExample2Monster)\n    default: break\n    }\n    test4 = []\n    test4.append(contentsOf: _t.test4)\n    testarrayofstring = []\n    testarrayofstring.append(contentsOf: _t.testarrayofstring)\n    testarrayoftables = []\n    for val in _t.testarrayoftables{\n        testarrayoftables.append(val.unpack())\n    }\n    enemy = _t.enemy?.unpack()\n    testnestedflatbuffer = []\n    testnestedflatbuffer.append(contentsOf: _t.testnestedflatbuffer)\n    testempty = _t.testempty?.unpack()\n    testbool = _t.testbool\n    testhashs32Fnv1 = _t.testhashs32Fnv1\n    testhashu32Fnv1 = _t.testhashu32Fnv1\n    testhashs64Fnv1 = _t.testhashs64Fnv1\n    testhashu64Fnv1 = _t.testhashu64Fnv1\n    testhashs32Fnv1a = _t.testhashs32Fnv1a\n    testhashu32Fnv1a = _t.testhashu32Fnv1a\n    testhashs64Fnv1a = _t.testhashs64Fnv1a\n    testhashu64Fnv1a = _t.testhashu64Fnv1a\n    testarrayofbools = []\n    testarrayofbools.append(contentsOf: _t.testarrayofbools)\n    testf = _t.testf\n    testf2 = _t.testf2\n    testf3 = _t.testf3\n    testarrayofstring2 = []\n    testarrayofstring2.append(contentsOf: _t.testarrayofstring2)\n    testarrayofsortedstruct = []\n    testarrayofsortedstruct.append(contentsOf: _t.testarrayofsortedstruct)\n    flex = []\n    flex.append(contentsOf: _t.flex)\n    test5 = []\n    test5.append(contentsOf: _t.test5)\n    vectorOfLongs = []\n    vectorOfLongs.append(contentsOf: _t.vectorOfLongs)\n    vectorOfDoubles = []\n    vectorOfDoubles.append(contentsOf: _t.vectorOfDoubles)\n    parentNamespaceTest = _t.parentNamespaceTest?.unpack()\n    vectorOfReferrables = []\n    for val in _t.vectorOfReferrables{\n        vectorOfReferrables.append(val.unpack())\n    }\n    singleWeakReference = _t.singleWeakReference\n    vectorOfWeakReferences = []\n    vectorOfWeakReferences.append(contentsOf: _t.vectorOfWeakReferences)\n    vectorOfStrongReferrables = []\n    for val in _t.vectorOfStrongReferrables{\n        vectorOfStrongReferrables.append(val.unpack())\n    }\n    coOwningReference = _t.coOwningReference\n    vectorOfCoOwningReferences = []\n    vectorOfCoOwningReferences.append(contentsOf: _t.vectorOfCoOwningReferences)\n    nonOwningReference = _t.nonOwningReference\n    vectorOfNonOwningReferences = []\n    vectorOfNonOwningReferences.append(contentsOf: _t.vectorOfNonOwningReferences)\n    switch _t.anyUniqueType {\n    case .m:\n      let _v = _t.anyUnique(type: MyGame_Example_Monster.self)\n      anyUnique = MyGame_Example_AnyUniqueAliasesUnion(_v?.unpack(), type: .m)\n    case .ts:\n      let _v = _t.anyUnique(type: MyGame_Example_TestSimpleTableWithEnum.self)\n      anyUnique = MyGame_Example_AnyUniqueAliasesUnion(_v?.unpack(), type: .ts)\n    case .m2:\n      let _v = _t.anyUnique(type: MyGame_Example2_Monster.self)\n      anyUnique = MyGame_Example_AnyUniqueAliasesUnion(_v?.unpack(), type: .m2)\n    default: break\n    }\n    switch _t.anyAmbiguousType {\n    case .m1:\n      let _v = _t.anyAmbiguous(type: MyGame_Example_Monster.self)\n      anyAmbiguous = MyGame_Example_AnyAmbiguousAliasesUnion(_v?.unpack(), type: .m1)\n    case .m2:\n      let _v = _t.anyAmbiguous(type: MyGame_Example_Monster.self)\n      anyAmbiguous = MyGame_Example_AnyAmbiguousAliasesUnion(_v?.unpack(), type: .m2)\n    case .m3:\n      let _v = _t.anyAmbiguous(type: MyGame_Example_Monster.self)\n      anyAmbiguous = MyGame_Example_AnyAmbiguousAliasesUnion(_v?.unpack(), type: .m3)\n    default: break\n    }\n    vectorOfEnums = []\n    vectorOfEnums.append(contentsOf: _t.vectorOfEnums)\n    signedEnum = _t.signedEnum\n    testrequirednestedflatbuffer = []\n    testrequirednestedflatbuffer.append(contentsOf: _t.testrequirednestedflatbuffer)\n    scalarKeySortedTables = []\n    for val in _t.scalarKeySortedTables{\n        scalarKeySortedTables.append(val.unpack())\n    }\n    nativeInline = _t.nativeInline\n    longEnumNonEnumDefault = _t.longEnumNonEnumDefault\n    longEnumNormalDefault = _t.longEnumNormalDefault\n    nanDefault = _t.nanDefault\n    infDefault = _t.infDefault\n    positiveInfDefault = _t.positiveInfDefault\n    infinityDefault = _t.infinityDefault\n    positiveInfinityDefault = _t.positiveInfinityDefault\n    negativeInfDefault = _t.negativeInfDefault\n    negativeInfinityDefault = _t.negativeInfinityDefault\n    doubleInfDefault = _t.doubleInfDefault\n  }\n\n  public init() {\n    pos = MyGame_Example_Vec3()\n    mana = 150\n    hp = 100\n    name = \"\"\n    inventory = []\n    color = .blue\n    test4 = []\n    testarrayofstring = []\n    testarrayoftables = []\n    enemy = MyGame_Example_MonsterT()\n    testnestedflatbuffer = []\n    testempty = MyGame_Example_StatT()\n    testbool = false\n    testhashs32Fnv1 = 0\n    testhashu32Fnv1 = 0\n    testhashs64Fnv1 = 0\n    testhashu64Fnv1 = 0\n    testhashs32Fnv1a = 0\n    testhashu32Fnv1a = 0\n    testhashs64Fnv1a = 0\n    testhashu64Fnv1a = 0\n    testarrayofbools = []\n    testf = 3.14159\n    testf2 = 3.0\n    testf3 = 0.0\n    testarrayofstring2 = []\n    testarrayofsortedstruct = []\n    flex = []\n    test5 = []\n    vectorOfLongs = []\n    vectorOfDoubles = []\n    parentNamespaceTest = MyGame_InParentNamespaceT()\n    vectorOfReferrables = []\n    singleWeakReference = 0\n    vectorOfWeakReferences = []\n    vectorOfStrongReferrables = []\n    coOwningReference = 0\n    vectorOfCoOwningReferences = []\n    nonOwningReference = 0\n    vectorOfNonOwningReferences = []\n    vectorOfEnums = []\n    signedEnum = .none_\n    testrequirednestedflatbuffer = []\n    scalarKeySortedTables = []\n    nativeInline = MyGame_Example_Test()\n    longEnumNonEnumDefault = .longone\n    longEnumNormalDefault = .longone\n    nanDefault = .nan\n    infDefault = .infinity\n    positiveInfDefault = .infinity\n    infinityDefault = .infinity\n    positiveInfinityDefault = .infinity\n    negativeInfDefault = -.infinity\n    negativeInfinityDefault = -.infinity\n    doubleInfDefault = .infinity\n  }\n\n  public func serialize() -> ByteBuffer { return serialize(type: MyGame_Example_Monster.self) }\n\n}\npublic struct MyGame_Example_TypeAliases: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable, ObjectAPIPacker {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  public static var id: String { \"MONS\" } \n  public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset, prefix: Bool = false) { fbb.finish(offset: end, fileId: MyGame_Example_TypeAliases.id, addPrefix: prefix) }\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private struct VT {\n    static let i8: VOffset = 4\n    static let u8: VOffset = 6\n    static let i16: VOffset = 8\n    static let u16: VOffset = 10\n    static let i32: VOffset = 12\n    static let u32: VOffset = 14\n    static let i64: VOffset = 16\n    static let u64: VOffset = 18\n    static let f32: VOffset = 20\n    static let f64: VOffset = 22\n    static let v8: VOffset = 24\n    static let vf64: VOffset = 26\n  }\n\n  public var i8: Int8 { let o = _accessor.offset(VT.i8); return o == 0 ? 0 : _accessor.readBuffer(of: Int8.self, at: o) }\n  @discardableResult public func mutate(i8: Int8) -> Bool {let o = _accessor.offset(VT.i8);  return _accessor.mutate(i8, index: o) }\n  public var u8: UInt8 { let o = _accessor.offset(VT.u8); return o == 0 ? 0 : _accessor.readBuffer(of: UInt8.self, at: o) }\n  @discardableResult public func mutate(u8: UInt8) -> Bool {let o = _accessor.offset(VT.u8);  return _accessor.mutate(u8, index: o) }\n  public var i16: Int16 { let o = _accessor.offset(VT.i16); return o == 0 ? 0 : _accessor.readBuffer(of: Int16.self, at: o) }\n  @discardableResult public func mutate(i16: Int16) -> Bool {let o = _accessor.offset(VT.i16);  return _accessor.mutate(i16, index: o) }\n  public var u16: UInt16 { let o = _accessor.offset(VT.u16); return o == 0 ? 0 : _accessor.readBuffer(of: UInt16.self, at: o) }\n  @discardableResult public func mutate(u16: UInt16) -> Bool {let o = _accessor.offset(VT.u16);  return _accessor.mutate(u16, index: o) }\n  public var i32: Int32 { let o = _accessor.offset(VT.i32); return o == 0 ? 0 : _accessor.readBuffer(of: Int32.self, at: o) }\n  @discardableResult public func mutate(i32: Int32) -> Bool {let o = _accessor.offset(VT.i32);  return _accessor.mutate(i32, index: o) }\n  public var u32: UInt32 { let o = _accessor.offset(VT.u32); return o == 0 ? 0 : _accessor.readBuffer(of: UInt32.self, at: o) }\n  @discardableResult public func mutate(u32: UInt32) -> Bool {let o = _accessor.offset(VT.u32);  return _accessor.mutate(u32, index: o) }\n  public var i64: Int64 { let o = _accessor.offset(VT.i64); return o == 0 ? 0 : _accessor.readBuffer(of: Int64.self, at: o) }\n  @discardableResult public func mutate(i64: Int64) -> Bool {let o = _accessor.offset(VT.i64);  return _accessor.mutate(i64, index: o) }\n  public var u64: UInt64 { let o = _accessor.offset(VT.u64); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }\n  @discardableResult public func mutate(u64: UInt64) -> Bool {let o = _accessor.offset(VT.u64);  return _accessor.mutate(u64, index: o) }\n  public var f32: Float32 { let o = _accessor.offset(VT.f32); return o == 0 ? 0.0 : _accessor.readBuffer(of: Float32.self, at: o) }\n  @discardableResult public func mutate(f32: Float32) -> Bool {let o = _accessor.offset(VT.f32);  return _accessor.mutate(f32, index: o) }\n  public var f64: Double { let o = _accessor.offset(VT.f64); return o == 0 ? 0.0 : _accessor.readBuffer(of: Double.self, at: o) }\n  @discardableResult public func mutate(f64: Double) -> Bool {let o = _accessor.offset(VT.f64);  return _accessor.mutate(f64, index: o) }\n  public var v8: FlatbufferVector<Int8> { return _accessor.vector(at: VT.v8, byteSize: 1) }\n  public func mutate(v8: Int8, at index: Int32) -> Bool { let o = _accessor.offset(VT.v8); return _accessor.directMutate(v8, index: _accessor.vector(at: o) + index * 1) }\n  public func withUnsafePointerToV8<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.v8, body: body) }\n  public var vf64: FlatbufferVector<Double> { return _accessor.vector(at: VT.vf64, byteSize: 8) }\n  public func mutate(vf64: Double, at index: Int32) -> Bool { let o = _accessor.offset(VT.vf64); return _accessor.directMutate(vf64, index: _accessor.vector(at: o) + index * 8) }\n  public func withUnsafePointerToVf64<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.vf64, body: body) }\n  public static func startTypeAliases(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 12) }\n  public static func add(i8: Int8, _ fbb: inout FlatBufferBuilder) { fbb.add(element: i8, def: 0, at: VT.i8) }\n  public static func add(u8: UInt8, _ fbb: inout FlatBufferBuilder) { fbb.add(element: u8, def: 0, at: VT.u8) }\n  public static func add(i16: Int16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: i16, def: 0, at: VT.i16) }\n  public static func add(u16: UInt16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: u16, def: 0, at: VT.u16) }\n  public static func add(i32: Int32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: i32, def: 0, at: VT.i32) }\n  public static func add(u32: UInt32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: u32, def: 0, at: VT.u32) }\n  public static func add(i64: Int64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: i64, def: 0, at: VT.i64) }\n  public static func add(u64: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: u64, def: 0, at: VT.u64) }\n  public static func add(f32: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: f32, def: 0.0, at: VT.f32) }\n  public static func add(f64: Double, _ fbb: inout FlatBufferBuilder) { fbb.add(element: f64, def: 0.0, at: VT.f64) }\n  public static func addVectorOf(v8: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: v8, at: VT.v8) }\n  public static func addVectorOf(vf64: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vf64, at: VT.vf64) }\n  public static func endTypeAliases(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n  public static func createTypeAliases(\n    _ fbb: inout FlatBufferBuilder,\n    i8: Int8 = 0,\n    u8: UInt8 = 0,\n    i16: Int16 = 0,\n    u16: UInt16 = 0,\n    i32: Int32 = 0,\n    u32: UInt32 = 0,\n    i64: Int64 = 0,\n    u64: UInt64 = 0,\n    f32: Float32 = 0.0,\n    f64: Double = 0.0,\n    v8VectorOffset v8: Offset = Offset(),\n    vf64VectorOffset vf64: Offset = Offset()\n  ) -> Offset {\n    let __start = MyGame_Example_TypeAliases.startTypeAliases(&fbb)\n    MyGame_Example_TypeAliases.add(i8: i8, &fbb)\n    MyGame_Example_TypeAliases.add(u8: u8, &fbb)\n    MyGame_Example_TypeAliases.add(i16: i16, &fbb)\n    MyGame_Example_TypeAliases.add(u16: u16, &fbb)\n    MyGame_Example_TypeAliases.add(i32: i32, &fbb)\n    MyGame_Example_TypeAliases.add(u32: u32, &fbb)\n    MyGame_Example_TypeAliases.add(i64: i64, &fbb)\n    MyGame_Example_TypeAliases.add(u64: u64, &fbb)\n    MyGame_Example_TypeAliases.add(f32: f32, &fbb)\n    MyGame_Example_TypeAliases.add(f64: f64, &fbb)\n    MyGame_Example_TypeAliases.addVectorOf(v8: v8, &fbb)\n    MyGame_Example_TypeAliases.addVectorOf(vf64: vf64, &fbb)\n    return MyGame_Example_TypeAliases.endTypeAliases(&fbb, start: __start)\n  }\n\n  public func unpack() -> MyGame_Example_TypeAliasesT {\n    return MyGame_Example_TypeAliasesT(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_TypeAliasesT?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_TypeAliasesT) -> Offset {\n    let __v8 = builder.createVector(obj.v8)\n    let __vf64 = builder.createVector(obj.vf64)\n    let __root = MyGame_Example_TypeAliases.startTypeAliases(&builder)\n    MyGame_Example_TypeAliases.add(i8: obj.i8, &builder)\n    MyGame_Example_TypeAliases.add(u8: obj.u8, &builder)\n    MyGame_Example_TypeAliases.add(i16: obj.i16, &builder)\n    MyGame_Example_TypeAliases.add(u16: obj.u16, &builder)\n    MyGame_Example_TypeAliases.add(i32: obj.i32, &builder)\n    MyGame_Example_TypeAliases.add(u32: obj.u32, &builder)\n    MyGame_Example_TypeAliases.add(i64: obj.i64, &builder)\n    MyGame_Example_TypeAliases.add(u64: obj.u64, &builder)\n    MyGame_Example_TypeAliases.add(f32: obj.f32, &builder)\n    MyGame_Example_TypeAliases.add(f64: obj.f64, &builder)\n    MyGame_Example_TypeAliases.addVectorOf(v8: __v8, &builder)\n    MyGame_Example_TypeAliases.addVectorOf(vf64: __vf64, &builder)\n    return MyGame_Example_TypeAliases.endTypeAliases(&builder, start: __root)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    try _v.visit(field: VT.i8, fieldName: \"i8\", required: false, type: Int8.self)\n    try _v.visit(field: VT.u8, fieldName: \"u8\", required: false, type: UInt8.self)\n    try _v.visit(field: VT.i16, fieldName: \"i16\", required: false, type: Int16.self)\n    try _v.visit(field: VT.u16, fieldName: \"u16\", required: false, type: UInt16.self)\n    try _v.visit(field: VT.i32, fieldName: \"i32\", required: false, type: Int32.self)\n    try _v.visit(field: VT.u32, fieldName: \"u32\", required: false, type: UInt32.self)\n    try _v.visit(field: VT.i64, fieldName: \"i64\", required: false, type: Int64.self)\n    try _v.visit(field: VT.u64, fieldName: \"u64\", required: false, type: UInt64.self)\n    try _v.visit(field: VT.f32, fieldName: \"f32\", required: false, type: Float32.self)\n    try _v.visit(field: VT.f64, fieldName: \"f64\", required: false, type: Double.self)\n    try _v.visit(field: VT.v8, fieldName: \"v8\", required: false, type: ForwardOffset<Vector<Int8, Int8>>.self)\n    try _v.visit(field: VT.vf64, fieldName: \"vf64\", required: false, type: ForwardOffset<Vector<Double, Double>>.self)\n    _v.finish()\n  }\n}\n\nextension MyGame_Example_TypeAliases: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case i8 = \"i8\"\n    case u8 = \"u8\"\n    case i16 = \"i16\"\n    case u16 = \"u16\"\n    case i32 = \"i32\"\n    case u32 = \"u32\"\n    case i64 = \"i64\"\n    case u64 = \"u64\"\n    case f32 = \"f32\"\n    case f64 = \"f64\"\n    case v8 = \"v8\"\n    case vf64 = \"vf64\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    if i8 != 0 {\n      try container.encodeIfPresent(i8, forKey: .i8)\n    }\n    if u8 != 0 {\n      try container.encodeIfPresent(u8, forKey: .u8)\n    }\n    if i16 != 0 {\n      try container.encodeIfPresent(i16, forKey: .i16)\n    }\n    if u16 != 0 {\n      try container.encodeIfPresent(u16, forKey: .u16)\n    }\n    if i32 != 0 {\n      try container.encodeIfPresent(i32, forKey: .i32)\n    }\n    if u32 != 0 {\n      try container.encodeIfPresent(u32, forKey: .u32)\n    }\n    if i64 != 0 {\n      try container.encodeIfPresent(i64, forKey: .i64)\n    }\n    if u64 != 0 {\n      try container.encodeIfPresent(u64, forKey: .u64)\n    }\n    if f32 != 0.0 {\n      try container.encodeIfPresent(f32, forKey: .f32)\n    }\n    if f64 != 0.0 {\n      try container.encodeIfPresent(f64, forKey: .f64)\n    }\n    try container.encodeIfPresent(v8, forKey: .v8)\n    try container.encodeIfPresent(vf64, forKey: .vf64)\n  }\n}\n\npublic class MyGame_Example_TypeAliasesT: NativeObject {\n\n  public var i8: Int8\n  public var u8: UInt8\n  public var i16: Int16\n  public var u16: UInt16\n  public var i32: Int32\n  public var u32: UInt32\n  public var i64: Int64\n  public var u64: UInt64\n  public var f32: Float32\n  public var f64: Double\n  public var v8: [Int8]\n  public var vf64: [Double]\n\n  public init(_ _t: borrowing MyGame_Example_TypeAliases) {\n    i8 = _t.i8\n    u8 = _t.u8\n    i16 = _t.i16\n    u16 = _t.u16\n    i32 = _t.i32\n    u32 = _t.u32\n    i64 = _t.i64\n    u64 = _t.u64\n    f32 = _t.f32\n    f64 = _t.f64\n    v8 = []\n    v8.append(contentsOf: _t.v8)\n    vf64 = []\n    vf64.append(contentsOf: _t.vf64)\n  }\n\n  public init() {\n    i8 = 0\n    u8 = 0\n    i16 = 0\n    u16 = 0\n    i32 = 0\n    u32 = 0\n    i64 = 0\n    u64 = 0\n    f32 = 0.0\n    f64 = 0.0\n    v8 = []\n    vf64 = []\n  }\n\n  public func serialize() -> ByteBuffer { return serialize(type: MyGame_Example_TypeAliases.self) }\n\n}\n"
  },
  {
    "path": "tests/swift/Tests/Flatbuffers/more_defaults_generated.swift",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// swiftlint:disable all\n// swiftformat:disable all\n\n#if canImport(Common)\nimport Common\n#endif\n\nimport FlatBuffers\n\npublic enum ABC: Int32, FlatbuffersVectorInitializable, Enum, Verifiable {\n  public typealias T = Int32\n  public static var byteSize: Int { return MemoryLayout<Int32>.size }\n  public var value: Int32 { return self.rawValue }\n  case a = 0\n  case b = 1\n  case c = 2\n\n  public static var max: ABC { return .c }\n  public static var min: ABC { return .a }\n}\n\nextension ABC: Encodable {\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.singleValueContainer()\n    switch self {\n    case .a: try container.encode(\"A\")\n    case .b: try container.encode(\"B\")\n    case .c: try container.encode(\"C\")\n    }\n  }\n}\n\npublic struct MoreDefaults: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable, ObjectAPIPacker {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private struct VT {\n    static let ints: VOffset = 4\n    static let floats: VOffset = 6\n    static let emptyString: VOffset = 8\n    static let someString: VOffset = 10\n    static let abcs: VOffset = 12\n    static let bools: VOffset = 14\n  }\n\n  public var ints: FlatbufferVector<Int32> { return _accessor.vector(at: VT.ints, byteSize: 4) }\n  public func withUnsafePointerToInts<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.ints, body: body) }\n  public var floats: FlatbufferVector<Float32> { return _accessor.vector(at: VT.floats, byteSize: 4) }\n  public func withUnsafePointerToFloats<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.floats, body: body) }\n  public var emptyString: String? { let o = _accessor.offset(VT.emptyString); return o == 0 ? \"\" : _accessor.string(at: o) }\n  public var emptyStringSegmentArray: [UInt8]? { return _accessor.getVector(at: VT.emptyString) }\n  public var someString: String? { let o = _accessor.offset(VT.someString); return o == 0 ? \"some\" : _accessor.string(at: o) }\n  public var someStringSegmentArray: [UInt8]? { return _accessor.getVector(at: VT.someString) }\n  public var abcs: FlatbufferVector<ABC> { return _accessor.vector(at: VT.abcs, byteSize: 4) }\n  public var bools: FlatbufferVector<Bool> { return _accessor.vector(at: VT.bools, byteSize: 1) }\n  public func withUnsafePointerToBools<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.bools, body: body) }\n  public static func startMoreDefaults(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 6) }\n  public static func addVectorOf(ints: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: ints, at: VT.ints) }\n  public static func addVectorOf(floats: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: floats, at: VT.floats) }\n  public static func add(emptyString: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: emptyString, at: VT.emptyString) }\n  public static func add(someString: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: someString, at: VT.someString) }\n  public static func addVectorOf(abcs: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: abcs, at: VT.abcs) }\n  public static func addVectorOf(bools: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: bools, at: VT.bools) }\n  public static func endMoreDefaults(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n  public static func createMoreDefaults(\n    _ fbb: inout FlatBufferBuilder,\n    intsVectorOffset ints: Offset = Offset(),\n    floatsVectorOffset floats: Offset = Offset(),\n    emptyStringOffset emptyString: Offset = Offset(),\n    someStringOffset someString: Offset = Offset(),\n    abcsVectorOffset abcs: Offset = Offset(),\n    boolsVectorOffset bools: Offset = Offset()\n  ) -> Offset {\n    let __start = MoreDefaults.startMoreDefaults(&fbb)\n    MoreDefaults.addVectorOf(ints: ints, &fbb)\n    MoreDefaults.addVectorOf(floats: floats, &fbb)\n    MoreDefaults.add(emptyString: emptyString, &fbb)\n    MoreDefaults.add(someString: someString, &fbb)\n    MoreDefaults.addVectorOf(abcs: abcs, &fbb)\n    MoreDefaults.addVectorOf(bools: bools, &fbb)\n    return MoreDefaults.endMoreDefaults(&fbb, start: __start)\n  }\n\n  public func unpack() -> MoreDefaultsT {\n    return MoreDefaultsT(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MoreDefaultsT?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MoreDefaultsT) -> Offset {\n    let __ints = builder.createVector(obj.ints)\n    let __floats = builder.createVector(obj.floats)\n    let __emptyString: Offset\n    if let s = obj.emptyString {\n      __emptyString = builder.create(string: s)\n    } else {\n      __emptyString = Offset()\n    }\n\n    let __someString: Offset\n    if let s = obj.someString {\n      __someString = builder.create(string: s)\n    } else {\n      __someString = Offset()\n    }\n\n    let __abcs = builder.createVector(obj.abcs)\n    let __bools = builder.createVector(obj.bools)\n    let __root = MoreDefaults.startMoreDefaults(&builder)\n    MoreDefaults.addVectorOf(ints: __ints, &builder)\n    MoreDefaults.addVectorOf(floats: __floats, &builder)\n    MoreDefaults.add(emptyString: __emptyString, &builder)\n    MoreDefaults.add(someString: __someString, &builder)\n    MoreDefaults.addVectorOf(abcs: __abcs, &builder)\n    MoreDefaults.addVectorOf(bools: __bools, &builder)\n    return MoreDefaults.endMoreDefaults(&builder, start: __root)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    try _v.visit(field: VT.ints, fieldName: \"ints\", required: false, type: ForwardOffset<Vector<Int32, Int32>>.self)\n    try _v.visit(field: VT.floats, fieldName: \"floats\", required: false, type: ForwardOffset<Vector<Float32, Float32>>.self)\n    try _v.visit(field: VT.emptyString, fieldName: \"emptyString\", required: false, type: ForwardOffset<String>.self)\n    try _v.visit(field: VT.someString, fieldName: \"someString\", required: false, type: ForwardOffset<String>.self)\n    try _v.visit(field: VT.abcs, fieldName: \"abcs\", required: false, type: ForwardOffset<Vector<ABC, ABC>>.self)\n    try _v.visit(field: VT.bools, fieldName: \"bools\", required: false, type: ForwardOffset<Vector<Bool, Bool>>.self)\n    _v.finish()\n  }\n}\n\nextension MoreDefaults: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case ints = \"ints\"\n    case floats = \"floats\"\n    case emptyString = \"empty_string\"\n    case someString = \"some_string\"\n    case abcs = \"abcs\"\n    case bools = \"bools\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    try container.encodeIfPresent(ints, forKey: .ints)\n    try container.encodeIfPresent(floats, forKey: .floats)\n    try container.encodeIfPresent(emptyString, forKey: .emptyString)\n    try container.encodeIfPresent(someString, forKey: .someString)\n    try container.encodeIfPresent(abcs, forKey: .abcs)\n    try container.encodeIfPresent(bools, forKey: .bools)\n  }\n}\n\npublic class MoreDefaultsT: NativeObject {\n\n  public var ints: [Int32]\n  public var floats: [Float32]\n  public var emptyString: String?\n  public var someString: String?\n  public var abcs: [ABC]\n  public var bools: [Bool]\n\n  public init(_ _t: borrowing MoreDefaults) {\n    ints = []\n    ints.append(contentsOf: _t.ints)\n    floats = []\n    floats.append(contentsOf: _t.floats)\n    emptyString = _t.emptyString\n    someString = _t.someString\n    abcs = []\n    abcs.append(contentsOf: _t.abcs)\n    bools = []\n    bools.append(contentsOf: _t.bools)\n  }\n\n  public init() {\n    ints = []\n    floats = []\n    emptyString = \"\"\n    someString = \"some\"\n    abcs = []\n    bools = []\n  }\n\n  public func serialize() -> ByteBuffer { return serialize(type: MoreDefaults.self) }\n\n}\n"
  },
  {
    "path": "tests/swift/Tests/Flatbuffers/nan_inf_test_generated.swift",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// swiftlint:disable all\n// swiftformat:disable all\n\n#if canImport(Common)\nimport Common\n#endif\n\nimport FlatBuffers\n\npublic struct Swift_Tests_NanInfTable: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private struct VT {\n    static let defaultNan: VOffset = 4\n    static let defaultInf: VOffset = 6\n    static let defaultNinf: VOffset = 8\n    static let valueNan: VOffset = 10\n    static let valueInf: VOffset = 12\n    static let valueNinf: VOffset = 14\n    static let value: VOffset = 16\n  }\n\n  public var defaultNan: Double { let o = _accessor.offset(VT.defaultNan); return o == 0 ? .nan : _accessor.readBuffer(of: Double.self, at: o) }\n  public var defaultInf: Double { let o = _accessor.offset(VT.defaultInf); return o == 0 ? .infinity : _accessor.readBuffer(of: Double.self, at: o) }\n  public var defaultNinf: Double { let o = _accessor.offset(VT.defaultNinf); return o == 0 ? -.infinity : _accessor.readBuffer(of: Double.self, at: o) }\n  public var valueNan: Double { let o = _accessor.offset(VT.valueNan); return o == 0 ? 0.0 : _accessor.readBuffer(of: Double.self, at: o) }\n  public var valueInf: Double { let o = _accessor.offset(VT.valueInf); return o == 0 ? 0.0 : _accessor.readBuffer(of: Double.self, at: o) }\n  public var valueNinf: Double { let o = _accessor.offset(VT.valueNinf); return o == 0 ? 0.0 : _accessor.readBuffer(of: Double.self, at: o) }\n  public var value: Double { let o = _accessor.offset(VT.value); return o == 0 ? 0.0 : _accessor.readBuffer(of: Double.self, at: o) }\n  public static func startNanInfTable(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 7) }\n  public static func add(defaultNan: Double, _ fbb: inout FlatBufferBuilder) { fbb.add(element: defaultNan, def: .nan, at: VT.defaultNan) }\n  public static func add(defaultInf: Double, _ fbb: inout FlatBufferBuilder) { fbb.add(element: defaultInf, def: .infinity, at: VT.defaultInf) }\n  public static func add(defaultNinf: Double, _ fbb: inout FlatBufferBuilder) { fbb.add(element: defaultNinf, def: -.infinity, at: VT.defaultNinf) }\n  public static func add(valueNan: Double, _ fbb: inout FlatBufferBuilder) { fbb.add(element: valueNan, def: 0.0, at: VT.valueNan) }\n  public static func add(valueInf: Double, _ fbb: inout FlatBufferBuilder) { fbb.add(element: valueInf, def: 0.0, at: VT.valueInf) }\n  public static func add(valueNinf: Double, _ fbb: inout FlatBufferBuilder) { fbb.add(element: valueNinf, def: 0.0, at: VT.valueNinf) }\n  public static func add(value: Double, _ fbb: inout FlatBufferBuilder) { fbb.add(element: value, def: 0.0, at: VT.value) }\n  public static func endNanInfTable(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n  public static func createNanInfTable(\n    _ fbb: inout FlatBufferBuilder,\n    defaultNan: Double = .nan,\n    defaultInf: Double = .infinity,\n    defaultNinf: Double = -.infinity,\n    valueNan: Double = 0.0,\n    valueInf: Double = 0.0,\n    valueNinf: Double = 0.0,\n    value: Double = 0.0\n  ) -> Offset {\n    let __start = Swift_Tests_NanInfTable.startNanInfTable(&fbb)\n    Swift_Tests_NanInfTable.add(defaultNan: defaultNan, &fbb)\n    Swift_Tests_NanInfTable.add(defaultInf: defaultInf, &fbb)\n    Swift_Tests_NanInfTable.add(defaultNinf: defaultNinf, &fbb)\n    Swift_Tests_NanInfTable.add(valueNan: valueNan, &fbb)\n    Swift_Tests_NanInfTable.add(valueInf: valueInf, &fbb)\n    Swift_Tests_NanInfTable.add(valueNinf: valueNinf, &fbb)\n    Swift_Tests_NanInfTable.add(value: value, &fbb)\n    return Swift_Tests_NanInfTable.endNanInfTable(&fbb, start: __start)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    try _v.visit(field: VT.defaultNan, fieldName: \"defaultNan\", required: false, type: Double.self)\n    try _v.visit(field: VT.defaultInf, fieldName: \"defaultInf\", required: false, type: Double.self)\n    try _v.visit(field: VT.defaultNinf, fieldName: \"defaultNinf\", required: false, type: Double.self)\n    try _v.visit(field: VT.valueNan, fieldName: \"valueNan\", required: false, type: Double.self)\n    try _v.visit(field: VT.valueInf, fieldName: \"valueInf\", required: false, type: Double.self)\n    try _v.visit(field: VT.valueNinf, fieldName: \"valueNinf\", required: false, type: Double.self)\n    try _v.visit(field: VT.value, fieldName: \"value\", required: false, type: Double.self)\n    _v.finish()\n  }\n}\n\nextension Swift_Tests_NanInfTable: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case defaultNan = \"default_nan\"\n    case defaultInf = \"default_inf\"\n    case defaultNinf = \"default_ninf\"\n    case valueNan = \"value_nan\"\n    case valueInf = \"value_inf\"\n    case valueNinf = \"value_ninf\"\n    case value = \"value\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    if !defaultNan.isNaN {\n      try container.encodeIfPresent(defaultNan, forKey: .defaultNan)\n    }\n    if defaultInf != .infinity {\n      try container.encodeIfPresent(defaultInf, forKey: .defaultInf)\n    }\n    if defaultNinf != -.infinity {\n      try container.encodeIfPresent(defaultNinf, forKey: .defaultNinf)\n    }\n    if valueNan != 0.0 {\n      try container.encodeIfPresent(valueNan, forKey: .valueNan)\n    }\n    if valueInf != 0.0 {\n      try container.encodeIfPresent(valueInf, forKey: .valueInf)\n    }\n    if valueNinf != 0.0 {\n      try container.encodeIfPresent(valueNinf, forKey: .valueNinf)\n    }\n    if value != 0.0 {\n      try container.encodeIfPresent(value, forKey: .value)\n    }\n  }\n}\n\n"
  },
  {
    "path": "tests/swift/Tests/Flatbuffers/optional_scalars_generated.swift",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// swiftlint:disable all\n// swiftformat:disable all\n\n#if canImport(Common)\nimport Common\n#endif\n\nimport FlatBuffers\n\npublic enum optional_scalars_OptionalByte: Int8, FlatbuffersVectorInitializable, Enum, Verifiable {\n  public typealias T = Int8\n  public static var byteSize: Int { return MemoryLayout<Int8>.size }\n  public var value: Int8 { return self.rawValue }\n  case none_ = 0\n  case one = 1\n  case two = 2\n\n  public static var max: optional_scalars_OptionalByte { return .two }\n  public static var min: optional_scalars_OptionalByte { return .none_ }\n}\n\nextension optional_scalars_OptionalByte: Encodable {\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.singleValueContainer()\n    switch self {\n    case .none_: try container.encode(\"None\")\n    case .one: try container.encode(\"One\")\n    case .two: try container.encode(\"Two\")\n    }\n  }\n}\n\npublic struct optional_scalars_ScalarStuff: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  public static var id: String { \"NULL\" } \n  public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset, prefix: Bool = false) { fbb.finish(offset: end, fileId: optional_scalars_ScalarStuff.id, addPrefix: prefix) }\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private struct VT {\n    static let justI8: VOffset = 4\n    static let maybeI8: VOffset = 6\n    static let defaultI8: VOffset = 8\n    static let justU8: VOffset = 10\n    static let maybeU8: VOffset = 12\n    static let defaultU8: VOffset = 14\n    static let justI16: VOffset = 16\n    static let maybeI16: VOffset = 18\n    static let defaultI16: VOffset = 20\n    static let justU16: VOffset = 22\n    static let maybeU16: VOffset = 24\n    static let defaultU16: VOffset = 26\n    static let justI32: VOffset = 28\n    static let maybeI32: VOffset = 30\n    static let defaultI32: VOffset = 32\n    static let justU32: VOffset = 34\n    static let maybeU32: VOffset = 36\n    static let defaultU32: VOffset = 38\n    static let justI64: VOffset = 40\n    static let maybeI64: VOffset = 42\n    static let defaultI64: VOffset = 44\n    static let justU64: VOffset = 46\n    static let maybeU64: VOffset = 48\n    static let defaultU64: VOffset = 50\n    static let justF32: VOffset = 52\n    static let maybeF32: VOffset = 54\n    static let defaultF32: VOffset = 56\n    static let justF64: VOffset = 58\n    static let maybeF64: VOffset = 60\n    static let defaultF64: VOffset = 62\n    static let justBool: VOffset = 64\n    static let maybeBool: VOffset = 66\n    static let defaultBool: VOffset = 68\n    static let justEnum: VOffset = 70\n    static let maybeEnum: VOffset = 72\n    static let defaultEnum: VOffset = 74\n  }\n\n  public var justI8: Int8 { let o = _accessor.offset(VT.justI8); return o == 0 ? 0 : _accessor.readBuffer(of: Int8.self, at: o) }\n  public var maybeI8: Int8? { let o = _accessor.offset(VT.maybeI8); return o == 0 ? nil : _accessor.readBuffer(of: Int8.self, at: o) }\n  public var defaultI8: Int8 { let o = _accessor.offset(VT.defaultI8); return o == 0 ? 42 : _accessor.readBuffer(of: Int8.self, at: o) }\n  public var justU8: UInt8 { let o = _accessor.offset(VT.justU8); return o == 0 ? 0 : _accessor.readBuffer(of: UInt8.self, at: o) }\n  public var maybeU8: UInt8? { let o = _accessor.offset(VT.maybeU8); return o == 0 ? nil : _accessor.readBuffer(of: UInt8.self, at: o) }\n  public var defaultU8: UInt8 { let o = _accessor.offset(VT.defaultU8); return o == 0 ? 42 : _accessor.readBuffer(of: UInt8.self, at: o) }\n  public var justI16: Int16 { let o = _accessor.offset(VT.justI16); return o == 0 ? 0 : _accessor.readBuffer(of: Int16.self, at: o) }\n  public var maybeI16: Int16? { let o = _accessor.offset(VT.maybeI16); return o == 0 ? nil : _accessor.readBuffer(of: Int16.self, at: o) }\n  public var defaultI16: Int16 { let o = _accessor.offset(VT.defaultI16); return o == 0 ? 42 : _accessor.readBuffer(of: Int16.self, at: o) }\n  public var justU16: UInt16 { let o = _accessor.offset(VT.justU16); return o == 0 ? 0 : _accessor.readBuffer(of: UInt16.self, at: o) }\n  public var maybeU16: UInt16? { let o = _accessor.offset(VT.maybeU16); return o == 0 ? nil : _accessor.readBuffer(of: UInt16.self, at: o) }\n  public var defaultU16: UInt16 { let o = _accessor.offset(VT.defaultU16); return o == 0 ? 42 : _accessor.readBuffer(of: UInt16.self, at: o) }\n  public var justI32: Int32 { let o = _accessor.offset(VT.justI32); return o == 0 ? 0 : _accessor.readBuffer(of: Int32.self, at: o) }\n  public var maybeI32: Int32? { let o = _accessor.offset(VT.maybeI32); return o == 0 ? nil : _accessor.readBuffer(of: Int32.self, at: o) }\n  public var defaultI32: Int32 { let o = _accessor.offset(VT.defaultI32); return o == 0 ? 42 : _accessor.readBuffer(of: Int32.self, at: o) }\n  public var justU32: UInt32 { let o = _accessor.offset(VT.justU32); return o == 0 ? 0 : _accessor.readBuffer(of: UInt32.self, at: o) }\n  public var maybeU32: UInt32? { let o = _accessor.offset(VT.maybeU32); return o == 0 ? nil : _accessor.readBuffer(of: UInt32.self, at: o) }\n  public var defaultU32: UInt32 { let o = _accessor.offset(VT.defaultU32); return o == 0 ? 42 : _accessor.readBuffer(of: UInt32.self, at: o) }\n  public var justI64: Int64 { let o = _accessor.offset(VT.justI64); return o == 0 ? 0 : _accessor.readBuffer(of: Int64.self, at: o) }\n  public var maybeI64: Int64? { let o = _accessor.offset(VT.maybeI64); return o == 0 ? nil : _accessor.readBuffer(of: Int64.self, at: o) }\n  public var defaultI64: Int64 { let o = _accessor.offset(VT.defaultI64); return o == 0 ? 42 : _accessor.readBuffer(of: Int64.self, at: o) }\n  public var justU64: UInt64 { let o = _accessor.offset(VT.justU64); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }\n  public var maybeU64: UInt64? { let o = _accessor.offset(VT.maybeU64); return o == 0 ? nil : _accessor.readBuffer(of: UInt64.self, at: o) }\n  public var defaultU64: UInt64 { let o = _accessor.offset(VT.defaultU64); return o == 0 ? 42 : _accessor.readBuffer(of: UInt64.self, at: o) }\n  public var justF32: Float32 { let o = _accessor.offset(VT.justF32); return o == 0 ? 0.0 : _accessor.readBuffer(of: Float32.self, at: o) }\n  public var maybeF32: Float32? { let o = _accessor.offset(VT.maybeF32); return o == 0 ? nil : _accessor.readBuffer(of: Float32.self, at: o) }\n  public var defaultF32: Float32 { let o = _accessor.offset(VT.defaultF32); return o == 0 ? 42.0 : _accessor.readBuffer(of: Float32.self, at: o) }\n  public var justF64: Double { let o = _accessor.offset(VT.justF64); return o == 0 ? 0.0 : _accessor.readBuffer(of: Double.self, at: o) }\n  public var maybeF64: Double? { let o = _accessor.offset(VT.maybeF64); return o == 0 ? nil : _accessor.readBuffer(of: Double.self, at: o) }\n  public var defaultF64: Double { let o = _accessor.offset(VT.defaultF64); return o == 0 ? 42.0 : _accessor.readBuffer(of: Double.self, at: o) }\n  public var justBool: Bool { let o = _accessor.offset(VT.justBool); return o == 0 ? false : _accessor.readBuffer(of: Bool.self, at: o) }\n  public var maybeBool: Bool? { let o = _accessor.offset(VT.maybeBool); return o == 0 ? nil : _accessor.readBuffer(of: Bool.self, at: o) }\n  public var defaultBool: Bool { let o = _accessor.offset(VT.defaultBool); return o == 0 ? true : _accessor.readBuffer(of: Bool.self, at: o) }\n  public var justEnum: optional_scalars_OptionalByte { let o = _accessor.offset(VT.justEnum); return o == 0 ? .none_ : optional_scalars_OptionalByte(rawValue: _accessor.readBuffer(of: Int8.self, at: o)) ?? .none_ }\n  public var maybeEnum: optional_scalars_OptionalByte? { let o = _accessor.offset(VT.maybeEnum); return o == 0 ? nil : optional_scalars_OptionalByte(rawValue: _accessor.readBuffer(of: Int8.self, at: o)) ?? nil }\n  public var defaultEnum: optional_scalars_OptionalByte { let o = _accessor.offset(VT.defaultEnum); return o == 0 ? .one : optional_scalars_OptionalByte(rawValue: _accessor.readBuffer(of: Int8.self, at: o)) ?? .one }\n  public static func startScalarStuff(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 36) }\n  public static func add(justI8: Int8, _ fbb: inout FlatBufferBuilder) { fbb.add(element: justI8, def: 0, at: VT.justI8) }\n  public static func add(maybeI8: Int8?, _ fbb: inout FlatBufferBuilder) { fbb.add(element: maybeI8, at: VT.maybeI8) }\n  public static func add(defaultI8: Int8, _ fbb: inout FlatBufferBuilder) { fbb.add(element: defaultI8, def: 42, at: VT.defaultI8) }\n  public static func add(justU8: UInt8, _ fbb: inout FlatBufferBuilder) { fbb.add(element: justU8, def: 0, at: VT.justU8) }\n  public static func add(maybeU8: UInt8?, _ fbb: inout FlatBufferBuilder) { fbb.add(element: maybeU8, at: VT.maybeU8) }\n  public static func add(defaultU8: UInt8, _ fbb: inout FlatBufferBuilder) { fbb.add(element: defaultU8, def: 42, at: VT.defaultU8) }\n  public static func add(justI16: Int16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: justI16, def: 0, at: VT.justI16) }\n  public static func add(maybeI16: Int16?, _ fbb: inout FlatBufferBuilder) { fbb.add(element: maybeI16, at: VT.maybeI16) }\n  public static func add(defaultI16: Int16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: defaultI16, def: 42, at: VT.defaultI16) }\n  public static func add(justU16: UInt16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: justU16, def: 0, at: VT.justU16) }\n  public static func add(maybeU16: UInt16?, _ fbb: inout FlatBufferBuilder) { fbb.add(element: maybeU16, at: VT.maybeU16) }\n  public static func add(defaultU16: UInt16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: defaultU16, def: 42, at: VT.defaultU16) }\n  public static func add(justI32: Int32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: justI32, def: 0, at: VT.justI32) }\n  public static func add(maybeI32: Int32?, _ fbb: inout FlatBufferBuilder) { fbb.add(element: maybeI32, at: VT.maybeI32) }\n  public static func add(defaultI32: Int32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: defaultI32, def: 42, at: VT.defaultI32) }\n  public static func add(justU32: UInt32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: justU32, def: 0, at: VT.justU32) }\n  public static func add(maybeU32: UInt32?, _ fbb: inout FlatBufferBuilder) { fbb.add(element: maybeU32, at: VT.maybeU32) }\n  public static func add(defaultU32: UInt32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: defaultU32, def: 42, at: VT.defaultU32) }\n  public static func add(justI64: Int64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: justI64, def: 0, at: VT.justI64) }\n  public static func add(maybeI64: Int64?, _ fbb: inout FlatBufferBuilder) { fbb.add(element: maybeI64, at: VT.maybeI64) }\n  public static func add(defaultI64: Int64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: defaultI64, def: 42, at: VT.defaultI64) }\n  public static func add(justU64: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: justU64, def: 0, at: VT.justU64) }\n  public static func add(maybeU64: UInt64?, _ fbb: inout FlatBufferBuilder) { fbb.add(element: maybeU64, at: VT.maybeU64) }\n  public static func add(defaultU64: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: defaultU64, def: 42, at: VT.defaultU64) }\n  public static func add(justF32: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: justF32, def: 0.0, at: VT.justF32) }\n  public static func add(maybeF32: Float32?, _ fbb: inout FlatBufferBuilder) { fbb.add(element: maybeF32, at: VT.maybeF32) }\n  public static func add(defaultF32: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: defaultF32, def: 42.0, at: VT.defaultF32) }\n  public static func add(justF64: Double, _ fbb: inout FlatBufferBuilder) { fbb.add(element: justF64, def: 0.0, at: VT.justF64) }\n  public static func add(maybeF64: Double?, _ fbb: inout FlatBufferBuilder) { fbb.add(element: maybeF64, at: VT.maybeF64) }\n  public static func add(defaultF64: Double, _ fbb: inout FlatBufferBuilder) { fbb.add(element: defaultF64, def: 42.0, at: VT.defaultF64) }\n  public static func add(justBool: Bool, _ fbb: inout FlatBufferBuilder) { fbb.add(element: justBool, def: false,\n   at: VT.justBool) }\n  public static func add(maybeBool: Bool?, _ fbb: inout FlatBufferBuilder) { fbb.add(element: maybeBool, at: VT.maybeBool) }\n  public static func add(defaultBool: Bool, _ fbb: inout FlatBufferBuilder) { fbb.add(element: defaultBool, def: true,\n   at: VT.defaultBool) }\n  public static func add(justEnum: optional_scalars_OptionalByte, _ fbb: inout FlatBufferBuilder) { fbb.add(element: justEnum.rawValue, def: 0, at: VT.justEnum) }\n  public static func add(maybeEnum: optional_scalars_OptionalByte?, _ fbb: inout FlatBufferBuilder) { fbb.add(element: maybeEnum?.rawValue, at: VT.maybeEnum) }\n  public static func add(defaultEnum: optional_scalars_OptionalByte, _ fbb: inout FlatBufferBuilder) { fbb.add(element: defaultEnum.rawValue, def: 1, at: VT.defaultEnum) }\n  public static func endScalarStuff(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n  public static func createScalarStuff(\n    _ fbb: inout FlatBufferBuilder,\n    justI8: Int8 = 0,\n    maybeI8: Int8? = nil,\n    defaultI8: Int8 = 42,\n    justU8: UInt8 = 0,\n    maybeU8: UInt8? = nil,\n    defaultU8: UInt8 = 42,\n    justI16: Int16 = 0,\n    maybeI16: Int16? = nil,\n    defaultI16: Int16 = 42,\n    justU16: UInt16 = 0,\n    maybeU16: UInt16? = nil,\n    defaultU16: UInt16 = 42,\n    justI32: Int32 = 0,\n    maybeI32: Int32? = nil,\n    defaultI32: Int32 = 42,\n    justU32: UInt32 = 0,\n    maybeU32: UInt32? = nil,\n    defaultU32: UInt32 = 42,\n    justI64: Int64 = 0,\n    maybeI64: Int64? = nil,\n    defaultI64: Int64 = 42,\n    justU64: UInt64 = 0,\n    maybeU64: UInt64? = nil,\n    defaultU64: UInt64 = 42,\n    justF32: Float32 = 0.0,\n    maybeF32: Float32? = nil,\n    defaultF32: Float32 = 42.0,\n    justF64: Double = 0.0,\n    maybeF64: Double? = nil,\n    defaultF64: Double = 42.0,\n    justBool: Bool = false,\n    maybeBool: Bool? = nil,\n    defaultBool: Bool = true,\n    justEnum: optional_scalars_OptionalByte = .none_,\n    maybeEnum: optional_scalars_OptionalByte? = nil,\n    defaultEnum: optional_scalars_OptionalByte = .one\n  ) -> Offset {\n    let __start = optional_scalars_ScalarStuff.startScalarStuff(&fbb)\n    optional_scalars_ScalarStuff.add(justI8: justI8, &fbb)\n    optional_scalars_ScalarStuff.add(maybeI8: maybeI8, &fbb)\n    optional_scalars_ScalarStuff.add(defaultI8: defaultI8, &fbb)\n    optional_scalars_ScalarStuff.add(justU8: justU8, &fbb)\n    optional_scalars_ScalarStuff.add(maybeU8: maybeU8, &fbb)\n    optional_scalars_ScalarStuff.add(defaultU8: defaultU8, &fbb)\n    optional_scalars_ScalarStuff.add(justI16: justI16, &fbb)\n    optional_scalars_ScalarStuff.add(maybeI16: maybeI16, &fbb)\n    optional_scalars_ScalarStuff.add(defaultI16: defaultI16, &fbb)\n    optional_scalars_ScalarStuff.add(justU16: justU16, &fbb)\n    optional_scalars_ScalarStuff.add(maybeU16: maybeU16, &fbb)\n    optional_scalars_ScalarStuff.add(defaultU16: defaultU16, &fbb)\n    optional_scalars_ScalarStuff.add(justI32: justI32, &fbb)\n    optional_scalars_ScalarStuff.add(maybeI32: maybeI32, &fbb)\n    optional_scalars_ScalarStuff.add(defaultI32: defaultI32, &fbb)\n    optional_scalars_ScalarStuff.add(justU32: justU32, &fbb)\n    optional_scalars_ScalarStuff.add(maybeU32: maybeU32, &fbb)\n    optional_scalars_ScalarStuff.add(defaultU32: defaultU32, &fbb)\n    optional_scalars_ScalarStuff.add(justI64: justI64, &fbb)\n    optional_scalars_ScalarStuff.add(maybeI64: maybeI64, &fbb)\n    optional_scalars_ScalarStuff.add(defaultI64: defaultI64, &fbb)\n    optional_scalars_ScalarStuff.add(justU64: justU64, &fbb)\n    optional_scalars_ScalarStuff.add(maybeU64: maybeU64, &fbb)\n    optional_scalars_ScalarStuff.add(defaultU64: defaultU64, &fbb)\n    optional_scalars_ScalarStuff.add(justF32: justF32, &fbb)\n    optional_scalars_ScalarStuff.add(maybeF32: maybeF32, &fbb)\n    optional_scalars_ScalarStuff.add(defaultF32: defaultF32, &fbb)\n    optional_scalars_ScalarStuff.add(justF64: justF64, &fbb)\n    optional_scalars_ScalarStuff.add(maybeF64: maybeF64, &fbb)\n    optional_scalars_ScalarStuff.add(defaultF64: defaultF64, &fbb)\n    optional_scalars_ScalarStuff.add(justBool: justBool, &fbb)\n    optional_scalars_ScalarStuff.add(maybeBool: maybeBool, &fbb)\n    optional_scalars_ScalarStuff.add(defaultBool: defaultBool, &fbb)\n    optional_scalars_ScalarStuff.add(justEnum: justEnum, &fbb)\n    optional_scalars_ScalarStuff.add(maybeEnum: maybeEnum, &fbb)\n    optional_scalars_ScalarStuff.add(defaultEnum: defaultEnum, &fbb)\n    return optional_scalars_ScalarStuff.endScalarStuff(&fbb, start: __start)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    try _v.visit(field: VT.justI8, fieldName: \"justI8\", required: false, type: Int8.self)\n    try _v.visit(field: VT.maybeI8, fieldName: \"maybeI8\", required: false, type: Int8.self)\n    try _v.visit(field: VT.defaultI8, fieldName: \"defaultI8\", required: false, type: Int8.self)\n    try _v.visit(field: VT.justU8, fieldName: \"justU8\", required: false, type: UInt8.self)\n    try _v.visit(field: VT.maybeU8, fieldName: \"maybeU8\", required: false, type: UInt8.self)\n    try _v.visit(field: VT.defaultU8, fieldName: \"defaultU8\", required: false, type: UInt8.self)\n    try _v.visit(field: VT.justI16, fieldName: \"justI16\", required: false, type: Int16.self)\n    try _v.visit(field: VT.maybeI16, fieldName: \"maybeI16\", required: false, type: Int16.self)\n    try _v.visit(field: VT.defaultI16, fieldName: \"defaultI16\", required: false, type: Int16.self)\n    try _v.visit(field: VT.justU16, fieldName: \"justU16\", required: false, type: UInt16.self)\n    try _v.visit(field: VT.maybeU16, fieldName: \"maybeU16\", required: false, type: UInt16.self)\n    try _v.visit(field: VT.defaultU16, fieldName: \"defaultU16\", required: false, type: UInt16.self)\n    try _v.visit(field: VT.justI32, fieldName: \"justI32\", required: false, type: Int32.self)\n    try _v.visit(field: VT.maybeI32, fieldName: \"maybeI32\", required: false, type: Int32.self)\n    try _v.visit(field: VT.defaultI32, fieldName: \"defaultI32\", required: false, type: Int32.self)\n    try _v.visit(field: VT.justU32, fieldName: \"justU32\", required: false, type: UInt32.self)\n    try _v.visit(field: VT.maybeU32, fieldName: \"maybeU32\", required: false, type: UInt32.self)\n    try _v.visit(field: VT.defaultU32, fieldName: \"defaultU32\", required: false, type: UInt32.self)\n    try _v.visit(field: VT.justI64, fieldName: \"justI64\", required: false, type: Int64.self)\n    try _v.visit(field: VT.maybeI64, fieldName: \"maybeI64\", required: false, type: Int64.self)\n    try _v.visit(field: VT.defaultI64, fieldName: \"defaultI64\", required: false, type: Int64.self)\n    try _v.visit(field: VT.justU64, fieldName: \"justU64\", required: false, type: UInt64.self)\n    try _v.visit(field: VT.maybeU64, fieldName: \"maybeU64\", required: false, type: UInt64.self)\n    try _v.visit(field: VT.defaultU64, fieldName: \"defaultU64\", required: false, type: UInt64.self)\n    try _v.visit(field: VT.justF32, fieldName: \"justF32\", required: false, type: Float32.self)\n    try _v.visit(field: VT.maybeF32, fieldName: \"maybeF32\", required: false, type: Float32.self)\n    try _v.visit(field: VT.defaultF32, fieldName: \"defaultF32\", required: false, type: Float32.self)\n    try _v.visit(field: VT.justF64, fieldName: \"justF64\", required: false, type: Double.self)\n    try _v.visit(field: VT.maybeF64, fieldName: \"maybeF64\", required: false, type: Double.self)\n    try _v.visit(field: VT.defaultF64, fieldName: \"defaultF64\", required: false, type: Double.self)\n    try _v.visit(field: VT.justBool, fieldName: \"justBool\", required: false, type: Bool.self)\n    try _v.visit(field: VT.maybeBool, fieldName: \"maybeBool\", required: false, type: Bool.self)\n    try _v.visit(field: VT.defaultBool, fieldName: \"defaultBool\", required: false, type: Bool.self)\n    try _v.visit(field: VT.justEnum, fieldName: \"justEnum\", required: false, type: optional_scalars_OptionalByte.self)\n    try _v.visit(field: VT.maybeEnum, fieldName: \"maybeEnum\", required: false, type: optional_scalars_OptionalByte.self)\n    try _v.visit(field: VT.defaultEnum, fieldName: \"defaultEnum\", required: false, type: optional_scalars_OptionalByte.self)\n    _v.finish()\n  }\n}\n\nextension optional_scalars_ScalarStuff: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case justI8 = \"just_i8\"\n    case maybeI8 = \"maybe_i8\"\n    case defaultI8 = \"default_i8\"\n    case justU8 = \"just_u8\"\n    case maybeU8 = \"maybe_u8\"\n    case defaultU8 = \"default_u8\"\n    case justI16 = \"just_i16\"\n    case maybeI16 = \"maybe_i16\"\n    case defaultI16 = \"default_i16\"\n    case justU16 = \"just_u16\"\n    case maybeU16 = \"maybe_u16\"\n    case defaultU16 = \"default_u16\"\n    case justI32 = \"just_i32\"\n    case maybeI32 = \"maybe_i32\"\n    case defaultI32 = \"default_i32\"\n    case justU32 = \"just_u32\"\n    case maybeU32 = \"maybe_u32\"\n    case defaultU32 = \"default_u32\"\n    case justI64 = \"just_i64\"\n    case maybeI64 = \"maybe_i64\"\n    case defaultI64 = \"default_i64\"\n    case justU64 = \"just_u64\"\n    case maybeU64 = \"maybe_u64\"\n    case defaultU64 = \"default_u64\"\n    case justF32 = \"just_f32\"\n    case maybeF32 = \"maybe_f32\"\n    case defaultF32 = \"default_f32\"\n    case justF64 = \"just_f64\"\n    case maybeF64 = \"maybe_f64\"\n    case defaultF64 = \"default_f64\"\n    case justBool = \"just_bool\"\n    case maybeBool = \"maybe_bool\"\n    case defaultBool = \"default_bool\"\n    case justEnum = \"just_enum\"\n    case maybeEnum = \"maybe_enum\"\n    case defaultEnum = \"default_enum\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    if justI8 != 0 {\n      try container.encodeIfPresent(justI8, forKey: .justI8)\n    }\n    try container.encodeIfPresent(maybeI8, forKey: .maybeI8)\n    if defaultI8 != 42 {\n      try container.encodeIfPresent(defaultI8, forKey: .defaultI8)\n    }\n    if justU8 != 0 {\n      try container.encodeIfPresent(justU8, forKey: .justU8)\n    }\n    try container.encodeIfPresent(maybeU8, forKey: .maybeU8)\n    if defaultU8 != 42 {\n      try container.encodeIfPresent(defaultU8, forKey: .defaultU8)\n    }\n    if justI16 != 0 {\n      try container.encodeIfPresent(justI16, forKey: .justI16)\n    }\n    try container.encodeIfPresent(maybeI16, forKey: .maybeI16)\n    if defaultI16 != 42 {\n      try container.encodeIfPresent(defaultI16, forKey: .defaultI16)\n    }\n    if justU16 != 0 {\n      try container.encodeIfPresent(justU16, forKey: .justU16)\n    }\n    try container.encodeIfPresent(maybeU16, forKey: .maybeU16)\n    if defaultU16 != 42 {\n      try container.encodeIfPresent(defaultU16, forKey: .defaultU16)\n    }\n    if justI32 != 0 {\n      try container.encodeIfPresent(justI32, forKey: .justI32)\n    }\n    try container.encodeIfPresent(maybeI32, forKey: .maybeI32)\n    if defaultI32 != 42 {\n      try container.encodeIfPresent(defaultI32, forKey: .defaultI32)\n    }\n    if justU32 != 0 {\n      try container.encodeIfPresent(justU32, forKey: .justU32)\n    }\n    try container.encodeIfPresent(maybeU32, forKey: .maybeU32)\n    if defaultU32 != 42 {\n      try container.encodeIfPresent(defaultU32, forKey: .defaultU32)\n    }\n    if justI64 != 0 {\n      try container.encodeIfPresent(justI64, forKey: .justI64)\n    }\n    try container.encodeIfPresent(maybeI64, forKey: .maybeI64)\n    if defaultI64 != 42 {\n      try container.encodeIfPresent(defaultI64, forKey: .defaultI64)\n    }\n    if justU64 != 0 {\n      try container.encodeIfPresent(justU64, forKey: .justU64)\n    }\n    try container.encodeIfPresent(maybeU64, forKey: .maybeU64)\n    if defaultU64 != 42 {\n      try container.encodeIfPresent(defaultU64, forKey: .defaultU64)\n    }\n    if justF32 != 0.0 {\n      try container.encodeIfPresent(justF32, forKey: .justF32)\n    }\n    try container.encodeIfPresent(maybeF32, forKey: .maybeF32)\n    if defaultF32 != 42.0 {\n      try container.encodeIfPresent(defaultF32, forKey: .defaultF32)\n    }\n    if justF64 != 0.0 {\n      try container.encodeIfPresent(justF64, forKey: .justF64)\n    }\n    try container.encodeIfPresent(maybeF64, forKey: .maybeF64)\n    if defaultF64 != 42.0 {\n      try container.encodeIfPresent(defaultF64, forKey: .defaultF64)\n    }\n    if justBool != false {\n      try container.encodeIfPresent(justBool, forKey: .justBool)\n    }\n    try container.encodeIfPresent(maybeBool, forKey: .maybeBool)\n    if defaultBool != true {\n      try container.encodeIfPresent(defaultBool, forKey: .defaultBool)\n    }\n    if justEnum != .none_ {\n      try container.encodeIfPresent(justEnum, forKey: .justEnum)\n    }\n    try container.encodeIfPresent(maybeEnum, forKey: .maybeEnum)\n    if defaultEnum != .one {\n      try container.encodeIfPresent(defaultEnum, forKey: .defaultEnum)\n    }\n  }\n}\n\n"
  },
  {
    "path": "tests/swift/Tests/Flatbuffers/union_vector_generated.swift",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// swiftlint:disable all\n// swiftformat:disable all\n\n#if canImport(Common)\nimport Common\n#endif\n\nimport FlatBuffers\n\npublic enum Character: UInt8, FlatbuffersVectorInitializable, UnionEnum {\n  public typealias T = UInt8\n\n  public init?(value: T) {\n    self.init(rawValue: value)\n  }\n\n  public static var byteSize: Int { return MemoryLayout<UInt8>.size }\n  public var value: UInt8 { return self.rawValue }\n  case none_ = 0\n  case mulan = 1\n  case rapunzel = 2\n  case belle = 3\n  case bookfan = 4\n  case other = 5\n  case unused = 6\n\n  public static var max: Character { return .unused }\n  public static var min: Character { return .none_ }\n}\n\nextension Character: Encodable {\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.singleValueContainer()\n    switch self {\n    case .none_: try container.encode(\"NONE\")\n    case .mulan: try container.encode(\"MuLan\")\n    case .rapunzel: try container.encode(\"Rapunzel\")\n    case .belle: try container.encode(\"Belle\")\n    case .bookfan: try container.encode(\"BookFan\")\n    case .other: try container.encode(\"Other\")\n    case .unused: try container.encode(\"Unused\")\n    }\n  }\n}\n\npublic struct CharacterUnion {\n  public var type: Character\n  public var value: NativeObject?\n  public init(_ v: NativeObject?, type: Character) {\n    self.type = type\n    self.value = v\n  }\n  public func pack(builder: inout FlatBufferBuilder) -> Offset {\n    switch type {\n    case .mulan:\n      var __obj = value as? AttackerT\n      return Attacker.pack(&builder, obj: &__obj)\n    case .rapunzel:\n      var __obj = value as? Rapunzel\n      return Rapunzel_Mutable.pack(&builder, obj: &__obj)\n    case .belle:\n      var __obj = value as? BookReader\n      return BookReader_Mutable.pack(&builder, obj: &__obj)\n    case .bookfan:\n      var __obj = value as? BookReader\n      return BookReader_Mutable.pack(&builder, obj: &__obj)\n    case .other:\n      var __obj = value as? String\n      return String.pack(&builder, obj: &__obj)\n    case .unused:\n      var __obj = value as? String\n      return String.pack(&builder, obj: &__obj)\n    default: return Offset()\n    }\n  }\n}\npublic enum Gadget: UInt8, FlatbuffersVectorInitializable, UnionEnum {\n  public typealias T = UInt8\n\n  public init?(value: T) {\n    self.init(rawValue: value)\n  }\n\n  public static var byteSize: Int { return MemoryLayout<UInt8>.size }\n  public var value: UInt8 { return self.rawValue }\n  case none_ = 0\n  case fallingtub = 1\n  case handfan = 2\n\n  public static var max: Gadget { return .handfan }\n  public static var min: Gadget { return .none_ }\n}\n\nextension Gadget: Encodable {\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.singleValueContainer()\n    switch self {\n    case .none_: try container.encode(\"NONE\")\n    case .fallingtub: try container.encode(\"FallingTub\")\n    case .handfan: try container.encode(\"HandFan\")\n    }\n  }\n}\n\npublic struct GadgetUnion {\n  public var type: Gadget\n  public var value: NativeObject?\n  public init(_ v: NativeObject?, type: Gadget) {\n    self.type = type\n    self.value = v\n  }\n  public func pack(builder: inout FlatBufferBuilder) -> Offset {\n    switch type {\n    case .fallingtub:\n      var __obj = value as? FallingTub\n      return FallingTub_Mutable.pack(&builder, obj: &__obj)\n    case .handfan:\n      var __obj = value as? HandFanT\n      return HandFan.pack(&builder, obj: &__obj)\n    default: return Offset()\n    }\n  }\n}\npublic struct Rapunzel: NativeStruct, FlatbuffersVectorInitializable, Verifiable, FlatbuffersInitializable, NativeObject {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n\n  private var _hairLength: Int32\n\n  public init(_ bb: ByteBuffer, o: Int32) {\n    self = bb.read(def: Self.self, position: Int(o))\n  }\n\n  public init(hairLength: Int32) {\n    _hairLength = hairLength\n  }\n\n  public init() {\n    _hairLength = 0\n  }\n\n  public init(_ _t: borrowing Rapunzel_Mutable) {\n    _hairLength = _t.hairLength\n  }\n\n  public var hairLength: Int32 { _hairLength }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    try verifier.inBuffer(position: position, of: Rapunzel.self)\n  }\n}\n\nextension Rapunzel: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case hairLength = \"hair_length\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    if hairLength != 0 {\n      try container.encodeIfPresent(hairLength, forKey: .hairLength)\n    }\n  }\n}\n\npublic struct Rapunzel_Mutable: FlatBufferStruct, FlatbuffersVectorInitializable {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Struct\n\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }\n\n  public var hairLength: Int32 { return _accessor.readBuffer(of: Int32.self, at: 0) }\n  @discardableResult public func mutate(hairLength: Int32) -> Bool { return _accessor.mutate(hairLength, index: 0) }\n\n  public func unpack() -> Rapunzel {\n    return Rapunzel(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout Rapunzel?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout Rapunzel) -> Offset {\n    return builder.create(struct: obj)\n  }\n}\n\npublic struct BookReader: NativeStruct, FlatbuffersVectorInitializable, Verifiable, FlatbuffersInitializable, NativeObject {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n\n  private var _booksRead: Int32\n\n  public init(_ bb: ByteBuffer, o: Int32) {\n    self = bb.read(def: Self.self, position: Int(o))\n  }\n\n  public init(booksRead: Int32) {\n    _booksRead = booksRead\n  }\n\n  public init() {\n    _booksRead = 0\n  }\n\n  public init(_ _t: borrowing BookReader_Mutable) {\n    _booksRead = _t.booksRead\n  }\n\n  public var booksRead: Int32 { _booksRead }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    try verifier.inBuffer(position: position, of: BookReader.self)\n  }\n}\n\nextension BookReader: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case booksRead = \"books_read\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    if booksRead != 0 {\n      try container.encodeIfPresent(booksRead, forKey: .booksRead)\n    }\n  }\n}\n\npublic struct BookReader_Mutable: FlatBufferStruct, FlatbuffersVectorInitializable {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Struct\n\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }\n\n  public var booksRead: Int32 { return _accessor.readBuffer(of: Int32.self, at: 0) }\n  @discardableResult public func mutate(booksRead: Int32) -> Bool { return _accessor.mutate(booksRead, index: 0) }\n\n  public func unpack() -> BookReader {\n    return BookReader(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout BookReader?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout BookReader) -> Offset {\n    return builder.create(struct: obj)\n  }\n}\n\npublic struct FallingTub: NativeStruct, FlatbuffersVectorInitializable, Verifiable, FlatbuffersInitializable, NativeObject {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n\n  private var _weight: Int32\n\n  public init(_ bb: ByteBuffer, o: Int32) {\n    self = bb.read(def: Self.self, position: Int(o))\n  }\n\n  public init(weight: Int32) {\n    _weight = weight\n  }\n\n  public init() {\n    _weight = 0\n  }\n\n  public init(_ _t: borrowing FallingTub_Mutable) {\n    _weight = _t.weight\n  }\n\n  public var weight: Int32 { _weight }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    try verifier.inBuffer(position: position, of: FallingTub.self)\n  }\n}\n\nextension FallingTub: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case weight = \"weight\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    if weight != 0 {\n      try container.encodeIfPresent(weight, forKey: .weight)\n    }\n  }\n}\n\npublic struct FallingTub_Mutable: FlatBufferStruct, FlatbuffersVectorInitializable {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Struct\n\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }\n\n  public var weight: Int32 { return _accessor.readBuffer(of: Int32.self, at: 0) }\n  @discardableResult public func mutate(weight: Int32) -> Bool { return _accessor.mutate(weight, index: 0) }\n\n  public func unpack() -> FallingTub {\n    return FallingTub(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout FallingTub?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout FallingTub) -> Offset {\n    return builder.create(struct: obj)\n  }\n}\n\npublic struct Attacker: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable, ObjectAPIPacker {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  public static var id: String { \"MOVI\" } \n  public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset, prefix: Bool = false) { fbb.finish(offset: end, fileId: Attacker.id, addPrefix: prefix) }\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private struct VT {\n    static let swordAttackDamage: VOffset = 4\n  }\n\n  public var swordAttackDamage: Int32 { let o = _accessor.offset(VT.swordAttackDamage); return o == 0 ? 0 : _accessor.readBuffer(of: Int32.self, at: o) }\n  @discardableResult public func mutate(swordAttackDamage: Int32) -> Bool {let o = _accessor.offset(VT.swordAttackDamage);  return _accessor.mutate(swordAttackDamage, index: o) }\n  public static func startAttacker(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) }\n  public static func add(swordAttackDamage: Int32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: swordAttackDamage, def: 0, at: VT.swordAttackDamage) }\n  public static func endAttacker(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n  public static func createAttacker(\n    _ fbb: inout FlatBufferBuilder,\n    swordAttackDamage: Int32 = 0\n  ) -> Offset {\n    let __start = Attacker.startAttacker(&fbb)\n    Attacker.add(swordAttackDamage: swordAttackDamage, &fbb)\n    return Attacker.endAttacker(&fbb, start: __start)\n  }\n\n  public func unpack() -> AttackerT {\n    return AttackerT(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout AttackerT?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout AttackerT) -> Offset {\n    let __root = Attacker.startAttacker(&builder)\n    Attacker.add(swordAttackDamage: obj.swordAttackDamage, &builder)\n    return Attacker.endAttacker(&builder, start: __root)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    try _v.visit(field: VT.swordAttackDamage, fieldName: \"swordAttackDamage\", required: false, type: Int32.self)\n    _v.finish()\n  }\n}\n\nextension Attacker: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case swordAttackDamage = \"sword_attack_damage\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    if swordAttackDamage != 0 {\n      try container.encodeIfPresent(swordAttackDamage, forKey: .swordAttackDamage)\n    }\n  }\n}\n\npublic class AttackerT: NativeObject {\n\n  public var swordAttackDamage: Int32\n\n  public init(_ _t: borrowing Attacker) {\n    swordAttackDamage = _t.swordAttackDamage\n  }\n\n  public init() {\n    swordAttackDamage = 0\n  }\n\n  public func serialize() -> ByteBuffer { return serialize(type: Attacker.self) }\n\n}\npublic struct HandFan: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable, ObjectAPIPacker {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  public static var id: String { \"MOVI\" } \n  public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset, prefix: Bool = false) { fbb.finish(offset: end, fileId: HandFan.id, addPrefix: prefix) }\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private struct VT {\n    static let length: VOffset = 4\n  }\n\n  public var length: Int32 { let o = _accessor.offset(VT.length); return o == 0 ? 0 : _accessor.readBuffer(of: Int32.self, at: o) }\n  @discardableResult public func mutate(length: Int32) -> Bool {let o = _accessor.offset(VT.length);  return _accessor.mutate(length, index: o) }\n  public static func startHandFan(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) }\n  public static func add(length: Int32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: length, def: 0, at: VT.length) }\n  public static func endHandFan(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n  public static func createHandFan(\n    _ fbb: inout FlatBufferBuilder,\n    length: Int32 = 0\n  ) -> Offset {\n    let __start = HandFan.startHandFan(&fbb)\n    HandFan.add(length: length, &fbb)\n    return HandFan.endHandFan(&fbb, start: __start)\n  }\n\n  public func unpack() -> HandFanT {\n    return HandFanT(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout HandFanT?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout HandFanT) -> Offset {\n    let __root = HandFan.startHandFan(&builder)\n    HandFan.add(length: obj.length, &builder)\n    return HandFan.endHandFan(&builder, start: __root)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    try _v.visit(field: VT.length, fieldName: \"length\", required: false, type: Int32.self)\n    _v.finish()\n  }\n}\n\nextension HandFan: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case length = \"length\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    if length != 0 {\n      try container.encodeIfPresent(length, forKey: .length)\n    }\n  }\n}\n\npublic class HandFanT: NativeObject {\n\n  public var length: Int32\n\n  public init(_ _t: borrowing HandFan) {\n    length = _t.length\n  }\n\n  public init() {\n    length = 0\n  }\n\n  public func serialize() -> ByteBuffer { return serialize(type: HandFan.self) }\n\n}\npublic struct Movie: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable, ObjectAPIPacker {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  public static var id: String { \"MOVI\" } \n  public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset, prefix: Bool = false) { fbb.finish(offset: end, fileId: Movie.id, addPrefix: prefix) }\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private struct VT {\n    static let mainCharacterType: VOffset = 4\n    static let mainCharacter: VOffset = 6\n    static let charactersType: VOffset = 8\n    static let characters: VOffset = 10\n  }\n\n  public var mainCharacterType: Character { let o = _accessor.offset(VT.mainCharacterType); return o == 0 ? .none_ : Character(rawValue: _accessor.readBuffer(of: UInt8.self, at: o)) ?? .none_ }\n  public func mainCharacter<T: FlatbuffersInitializable>(type: T.Type) -> T? { let o = _accessor.offset(VT.mainCharacter); return o == 0 ? nil : _accessor.union(o) }\n  public var charactersType: FlatbufferVector<Character> { return _accessor.vector(at: VT.charactersType, byteSize: 1) }\n  public var characters: UnionFlatbufferVector { return _accessor.unionVector(at: VT.characters, byteSize: 4) }\n  public func characters<T: FlatbuffersInitializable>(at index: Int32, type: T.Type) -> T? { let o = _accessor.offset(VT.characters); return o == 0 ? nil : _accessor.directUnion(_accessor.vector(at: o) + index * 4) }\n  public static func startMovie(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 4) }\n  public static func add(mainCharacterType: Character, _ fbb: inout FlatBufferBuilder) { fbb.add(element: mainCharacterType.rawValue, def: 0, at: VT.mainCharacterType) }\n  public static func add(mainCharacter: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: mainCharacter, at: VT.mainCharacter) }\n  public static func addVectorOf(charactersType: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: charactersType, at: VT.charactersType) }\n  public static func addVectorOf(characters: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: characters, at: VT.characters) }\n  public static func endMovie(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n  public static func createMovie(\n    _ fbb: inout FlatBufferBuilder,\n    mainCharacterType: Character = .none_,\n    mainCharacterOffset mainCharacter: Offset = Offset(),\n    charactersTypeVectorOffset charactersType: Offset = Offset(),\n    charactersVectorOffset characters: Offset = Offset()\n  ) -> Offset {\n    let __start = Movie.startMovie(&fbb)\n    Movie.add(mainCharacterType: mainCharacterType, &fbb)\n    Movie.add(mainCharacter: mainCharacter, &fbb)\n    Movie.addVectorOf(charactersType: charactersType, &fbb)\n    Movie.addVectorOf(characters: characters, &fbb)\n    return Movie.endMovie(&fbb, start: __start)\n  }\n\n  public func unpack() -> MovieT {\n    return MovieT(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MovieT?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MovieT) -> Offset {\n    let __mainCharacter = obj.mainCharacter?.pack(builder: &builder) ?? Offset()\n    var __characters__: [Offset] = []\n    for i in obj.characters {\n      guard let off = i?.pack(builder: &builder) else { continue }\n      __characters__.append(off)\n    }\n    let __characters = builder.createVector(ofOffsets: __characters__)\n    let __charactersType = builder.createVector(obj.characters.compactMap { $0?.type })\n    let __root = Movie.startMovie(&builder)\n    if let o = obj.mainCharacter?.type {\n      Movie.add(mainCharacterType: o, &builder)\n      Movie.add(mainCharacter: __mainCharacter, &builder)\n    }\n\n    Movie.addVectorOf(charactersType: __charactersType, &builder)\n    Movie.addVectorOf(characters: __characters, &builder)\n    return Movie.endMovie(&builder, start: __root)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    try _v.visit(unionKey: VT.mainCharacterType, unionField: VT.mainCharacter, unionKeyName: \"mainCharacterType\", fieldName: \"mainCharacter\", required: false, completion: { (verifier, key: Character, pos) in\n      switch key {\n      case .none_:\n        break // NOTE - SWIFT doesnt support none\n      case .mulan:\n        try ForwardOffset<Attacker>.verify(&verifier, at: pos, of: Attacker.self)\n      case .rapunzel:\n        try Rapunzel.verify(&verifier, at: pos, of: Rapunzel.self)\n      case .belle:\n        try BookReader.verify(&verifier, at: pos, of: BookReader.self)\n      case .bookfan:\n        try BookReader.verify(&verifier, at: pos, of: BookReader.self)\n      case .other:\n        try ForwardOffset<String>.verify(&verifier, at: pos, of: String.self)\n      case .unused:\n        try ForwardOffset<String>.verify(&verifier, at: pos, of: String.self)\n      }\n    })\n    try _v.visitUnionVector(unionKey: VT.charactersType, unionField: VT.characters, unionKeyName: \"charactersType\", fieldName: \"characters\", required: false, completion: { (verifier, key: Character, pos) in\n      switch key {\n      case .none_:\n        break // NOTE - SWIFT doesnt support none\n      case .mulan:\n        try ForwardOffset<Attacker>.verify(&verifier, at: pos, of: Attacker.self)\n      case .rapunzel:\n        try Rapunzel.verify(&verifier, at: pos, of: Rapunzel.self)\n      case .belle:\n        try BookReader.verify(&verifier, at: pos, of: BookReader.self)\n      case .bookfan:\n        try BookReader.verify(&verifier, at: pos, of: BookReader.self)\n      case .other:\n        try ForwardOffset<String>.verify(&verifier, at: pos, of: String.self)\n      case .unused:\n        try ForwardOffset<String>.verify(&verifier, at: pos, of: String.self)\n      }\n    })\n    _v.finish()\n  }\n}\n\nextension Movie: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case mainCharacterType = \"main_character_type\"\n    case mainCharacter = \"main_character\"\n    case charactersType = \"characters_type\"\n    case characters = \"characters\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    if mainCharacterType != .none_ {\n      try container.encodeIfPresent(mainCharacterType, forKey: .mainCharacterType)\n    }\n    switch mainCharacterType {\n    case .mulan:\n      let _v = mainCharacter(type: Attacker.self)\n      try container.encodeIfPresent(_v, forKey: .mainCharacter)\n    case .rapunzel:\n      let _v = mainCharacter(type: Rapunzel.self)\n      try container.encodeIfPresent(_v, forKey: .mainCharacter)\n    case .belle:\n      let _v = mainCharacter(type: BookReader.self)\n      try container.encodeIfPresent(_v, forKey: .mainCharacter)\n    case .bookfan:\n      let _v = mainCharacter(type: BookReader.self)\n      try container.encodeIfPresent(_v, forKey: .mainCharacter)\n    case .other:\n      let _v = mainCharacter(type: String.self)\n      try container.encodeIfPresent(_v, forKey: .mainCharacter)\n    case .unused:\n      let _v = mainCharacter(type: String.self)\n      try container.encodeIfPresent(_v, forKey: .mainCharacter)\n    default: break;\n    }\n    try container.encode(charactersType, forKey: .charactersType)\n    var contentEncoder = container.nestedUnkeyedContainer(forKey: .characters)\n    let _characters = charactersType\n    for index in _characters.startIndex..<_characters.endIndex {\n      switch _characters[index] {\n      case .mulan:\n        let _v = characters(at: Int32(index), type: Attacker.self)\n        try contentEncoder.encode(_v)\n      case .rapunzel:\n        let _v = characters(at: Int32(index), type: Rapunzel.self)\n        try contentEncoder.encode(_v)\n      case .belle:\n        let _v = characters(at: Int32(index), type: BookReader.self)\n        try contentEncoder.encode(_v)\n      case .bookfan:\n        let _v = characters(at: Int32(index), type: BookReader.self)\n        try contentEncoder.encode(_v)\n      case .other:\n        let _v = characters(at: Int32(index), type: String.self)\n        try contentEncoder.encode(_v)\n      case .unused:\n        let _v = characters(at: Int32(index), type: String.self)\n        try contentEncoder.encode(_v)\n      default: break;\n      }\n    }\n  }\n}\n\npublic class MovieT: NativeObject {\n\n  public var mainCharacter: CharacterUnion?\n  public var characters: [CharacterUnion?]\n\n  public init(_ _t: borrowing Movie) {\n    switch _t.mainCharacterType {\n    case .mulan:\n      let _v = _t.mainCharacter(type: Attacker.self)\n      mainCharacter = CharacterUnion(_v?.unpack(), type: .mulan)\n    case .rapunzel:\n      let _v = _t.mainCharacter(type: Rapunzel_Mutable.self)\n      mainCharacter = CharacterUnion(_v?.unpack(), type: .rapunzel)\n    case .belle:\n      let _v = _t.mainCharacter(type: BookReader_Mutable.self)\n      mainCharacter = CharacterUnion(_v?.unpack(), type: .belle)\n    case .bookfan:\n      let _v = _t.mainCharacter(type: BookReader_Mutable.self)\n      mainCharacter = CharacterUnion(_v?.unpack(), type: .bookfan)\n    case .other:\n      let _v = _t.mainCharacter(type: String.self)\n      mainCharacter = CharacterUnion(_v?.unpack(), type: .other)\n    case .unused:\n      let _v = _t.mainCharacter(type: String.self)\n      mainCharacter = CharacterUnion(_v?.unpack(), type: .unused)\n    default: break\n    }\n    characters = []\n    let _charactersType = _t.charactersType\n    for index in _charactersType.startIndex..<_charactersType.endIndex {\n        switch _t.charactersType[index] {\n        case .mulan:\n          let _v = _t.characters(at: Int32(index), type: Attacker.self)\n          characters.append(CharacterUnion(_v?.unpack(), type: .mulan))\n        case .rapunzel:\n          let _v = _t.characters(at: Int32(index), type: Rapunzel_Mutable.self)\n          characters.append(CharacterUnion(_v?.unpack(), type: .rapunzel))\n        case .belle:\n          let _v = _t.characters(at: Int32(index), type: BookReader_Mutable.self)\n          characters.append(CharacterUnion(_v?.unpack(), type: .belle))\n        case .bookfan:\n          let _v = _t.characters(at: Int32(index), type: BookReader_Mutable.self)\n          characters.append(CharacterUnion(_v?.unpack(), type: .bookfan))\n        case .other:\n          let _v = _t.characters(at: Int32(index), type: String.self)\n          characters.append(CharacterUnion(_v?.unpack(), type: .other))\n        case .unused:\n          let _v = _t.characters(at: Int32(index), type: String.self)\n          characters.append(CharacterUnion(_v?.unpack(), type: .unused))\n        default: break\n        }\n    }\n  }\n\n  public init() {\n    characters = []\n  }\n\n  public func serialize() -> ByteBuffer { return serialize(type: Movie.self) }\n\n}\n"
  },
  {
    "path": "tests/swift/Tests/Flatbuffers/vector_has_test_generated.swift",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// swiftlint:disable all\n// swiftformat:disable all\n\n#if canImport(Common)\nimport Common\n#endif\n\nimport FlatBuffers\n\npublic struct Swift_Tests_Vectors: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private struct VT {\n    static let none_: VOffset = 4\n    static let empty: VOffset = 6\n    static let array: VOffset = 8\n  }\n\n  public var none_: FlatbufferVector<UInt64> { return _accessor.vector(at: VT.none_, byteSize: 8) }\n  public func withUnsafePointerToNone<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.none_, body: body) }\n  public var empty: FlatbufferVector<UInt64> { return _accessor.vector(at: VT.empty, byteSize: 8) }\n  public func withUnsafePointerToEmpty<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.empty, body: body) }\n  public var array: FlatbufferVector<UInt64> { return _accessor.vector(at: VT.array, byteSize: 8) }\n  public func withUnsafePointerToArray<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.array, body: body) }\n  public static func startVectors(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 3) }\n  public static func addVectorOf(none_: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: none_, at: VT.none_) }\n  public static func addVectorOf(empty: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: empty, at: VT.empty) }\n  public static func addVectorOf(array: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: array, at: VT.array) }\n  public static func endVectors(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n  public static func createVectors(\n    _ fbb: inout FlatBufferBuilder,\n    none_VectorOffset none_: Offset = Offset(),\n    emptyVectorOffset empty: Offset = Offset(),\n    arrayVectorOffset array: Offset = Offset()\n  ) -> Offset {\n    let __start = Swift_Tests_Vectors.startVectors(&fbb)\n    Swift_Tests_Vectors.addVectorOf(none_: none_, &fbb)\n    Swift_Tests_Vectors.addVectorOf(empty: empty, &fbb)\n    Swift_Tests_Vectors.addVectorOf(array: array, &fbb)\n    return Swift_Tests_Vectors.endVectors(&fbb, start: __start)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    try _v.visit(field: VT.none_, fieldName: \"none_\", required: false, type: ForwardOffset<Vector<UInt64, UInt64>>.self)\n    try _v.visit(field: VT.empty, fieldName: \"empty\", required: false, type: ForwardOffset<Vector<UInt64, UInt64>>.self)\n    try _v.visit(field: VT.array, fieldName: \"array\", required: false, type: ForwardOffset<Vector<UInt64, UInt64>>.self)\n    _v.finish()\n  }\n}\n\nextension Swift_Tests_Vectors: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case none_ = \"none\"\n    case empty = \"empty\"\n    case array = \"array\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    try container.encodeIfPresent(none_, forKey: .none_)\n    try container.encodeIfPresent(empty, forKey: .empty)\n    try container.encodeIfPresent(array, forKey: .array)\n  }\n}\n\n"
  },
  {
    "path": "tests/swift/Tests/Flexbuffers/FlexBuffersJSONTests.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Common\nimport FlexBuffers\nimport XCTest\n\nfinal class FlexBuffersJSONTests: XCTestCase {\n  func testEncodingJSON() throws {\n    let buf: ByteBuffer = createProperBuffer().sizedByteBuffer\n    let reference = try getRoot(buffer: buf)!\n\n    let json = reference.jsonString()\n    // swiftformat:disable all\n    XCTAssertEqual(\n      json,\n      \"{\\\"bar\\\": [1, 2, 3], \\\"bar3\\\": [1, 2, 3], \\\"bool\\\": true, \\\"bools\\\": [true, false, true, false], \\\"foo\\\": 100.0, \\\"mymap\\\": {\\\"foo\\\": \\\"Fred\\\"}, \\\"vec\\\": [-100, \\\"Fred\\\", 4.0, \\\"M\\\", false, 4.0]}\"\n    )\n    // swiftformat:enable all\n\n    let data = json.data(using: .utf8)!\n    let decodedData =\n      try JSONSerialization.jsonObject(\n        with: data,\n        options: []) as! [String: Any]\n\n    XCTAssertEqual(decodedData[\"bar\"] as! [Int], [1, 2, 3])\n    XCTAssertEqual(decodedData[\"bar3\"] as! [Int], [1, 2, 3])\n\n    let vec: [Any] = decodedData[\"vec\"] as! [Any]\n    XCTAssertEqual(vec[0] as! Int, -100)\n    XCTAssertEqual(vec[1] as! String, \"Fred\")\n    XCTAssertEqual(vec[2] as! Double, 4.0)\n    XCTAssertEqual(vec[3] as! String, \"M\")\n    XCTAssertEqual(vec[4] as! Bool, false)\n    XCTAssertEqual(vec[5] as! Double, 4.0)\n  }\n}\n"
  },
  {
    "path": "tests/swift/Tests/Flexbuffers/FlexBuffersReaderTests.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Common\nimport XCTest\n\n@testable import FlexBuffers\n\nfinal class FlexBuffersReaderTests: XCTestCase {\n\n  func testReadingProperBuffer() throws {\n    let buf: ByteBuffer = createProperBuffer().byteBuffer\n    try validate(buffer: buf)\n  }\n\n  func testReadingSizedBuffer() throws {\n    let buf: ByteBuffer = createSizedBuffer()\n    try validate(buffer: buf)\n  }\n\n  func testReset() throws {\n    var fbx = FlexBuffersWriter(\n      initialSize: 8,\n      flags: .shareKeysAndStrings)\n    write(fbx: &fbx)\n\n    try validate(buffer: ByteBuffer(data: fbx.data))\n    XCTAssertEqual(fbx.capacity, 512)\n    fbx.reset()\n    XCTAssertEqual(fbx.writerIndex, 0)\n    XCTAssertEqual(fbx.capacity, 8)\n\n    write(fbx: &fbx)\n    try validate(buffer: ByteBuffer(data: fbx.data))\n    fbx.reset(keepingCapacity: true)\n    XCTAssertEqual(fbx.writerIndex, 0)\n    XCTAssertEqual(fbx.capacity, 512)\n\n    write(fbx: &fbx)\n    try validate(buffer: ByteBuffer(data: fbx.data))\n    XCTAssertEqual(fbx.capacity, 512)\n  }\n\n  private func validate(buffer buf: ByteBuffer) throws {\n    let reference = try getRoot(buffer: buf)!\n    XCTAssertEqual(reference.type, .map)\n    let map = reference.map!\n    XCTAssertEqual(map.count, 7)\n    let vecRef = map[\"vec\"]!\n    XCTAssertEqual(vecRef.type, .vector)\n    let vec = vecRef.vector!\n    XCTAssertEqual(vec.count, 6)\n    XCTAssertEqual(vec[0]?.type, .int)\n    XCTAssertEqual(vec[0]?.int, -100)\n    XCTAssertEqual(vec[1]?.type, .string)\n    XCTAssertEqual(vec[1]?.cString, \"Fred\")\n    XCTAssertNil(vec[1]?.int)\n    XCTAssertEqual(vec[2]?.double, 4.0)\n    XCTAssertTrue(vec[3]?.type == .blob)\n\n    let blob = vec[3]!.blob { pointer in\n      Array(pointer)\n    }\n\n    XCTAssertEqual(blob?.count, 1)\n    XCTAssertEqual(blob?[0], 77)\n    XCTAssertEqual(vec[4]?.type, .bool)\n    XCTAssertEqual(vec[4]?.bool, false)\n    XCTAssertEqual(vec[5]?.double, 4.0)  // Shared with vec[2]\n\n    let barVec = map[\"bar\"]!.typedVector!\n    XCTAssertEqual(barVec.count, 3)\n    XCTAssertEqual(barVec[2]?.int, 3)\n    XCTAssertEqual(barVec[2]?.asInt(), UInt8(3))\n\n    let fixedVec = map[\"bar3\"]!.fixedTypedVector!\n    XCTAssertEqual(fixedVec.count, 3)\n    XCTAssertEqual(fixedVec[2]?.int, 3)\n    XCTAssertEqual(fixedVec[2]?.asInt(), UInt8(3))\n    XCTAssertEqual(map[\"bool\"]?.bool, true)\n\n    let boolsVector = map[\"bools\"]!.typedVector!\n    XCTAssertEqual(boolsVector.type, .bool)\n    XCTAssertEqual(boolsVector[0]?.bool, true)\n    XCTAssertEqual(boolsVector[1]?.bool, false)\n\n    let bools = [true, false, true, false]\n    boolsVector.withUnsafeRawBufferPointer { buff in\n      for i in 0..<boolsVector.count {\n        XCTAssertEqual(buff.load(fromByteOffset: i, as: Bool.self), bools[i])\n      }\n    }\n    XCTAssertEqual(map[\"foo\"]?.double, 100)\n    XCTAssertNil(map[\"unknown\"])\n    let mymap = map[\"mymap\"]?.map\n\n    // Check if both addresses used are the same for keys and strings\n    XCTAssertEqual(mymap?.keys[0]?.cString, map.keys[4]?.cString)\n    map.keys[4]?.withUnsafeRawPointer { pointer in\n      mymap?.keys[0]?.withUnsafeRawPointer { mymapPointer in\n        XCTAssertEqual(pointer, mymapPointer)\n      }\n    }\n\n    XCTAssertEqual(mymap?.values[0]?.cString, vec[1]?.cString)\n    vec[1]?.withUnsafeRawPointer { pointer in\n      mymap?.values[0]?.withUnsafeRawPointer { mymapPointer in\n        XCTAssertEqual(pointer, mymapPointer)\n      }\n    }\n  }\n\n  private var path: String {\n    #if os(macOS)\n    // Gets the current path of this test file then\n    // strips out the nested directories.\n    let filePath = URL(filePath: #file)\n      .deletingLastPathComponent()\n      .deletingLastPathComponent()\n      .deletingLastPathComponent()\n    return filePath.absoluteString\n    #else\n    return FileManager.default.currentDirectoryPath\n    #endif\n  }\n\n}\n"
  },
  {
    "path": "tests/swift/Tests/Flexbuffers/FlexBuffersStringTests.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Common\nimport FlexBuffers\nimport XCTest\n\nfinal class FlexBuffersStringTests: XCTestCase {\n\n  func testEncodingUnicodeString() {\n    let text = \"プ画をみて✋\"\n\n    let bytes = text.data(using: .unicode, allowLossyConversion: true)\n    var flx = FlexBuffersWriter()\n    flx.map { writer in\n      writer.add(blob: bytes!, key: \"text\", length: bytes!.count)\n    }\n    flx.finish()\n    let byteBuffer = flx.sizedByteBuffer\n\n    let reference = try! getRoot(buffer: byteBuffer)\n    let root = reference?.map?[\"text\"]\n    let builtString = root?.blob {\n      let data = Data(bytes: $0.baseAddress!, count: Int($0.count))\n      return String(data: data, encoding: .unicode)\n    }\n\n    XCTAssertEqual(builtString, text)\n  }\n}\n"
  },
  {
    "path": "tests/swift/Tests/Flexbuffers/FlexBuffersWriterTests.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Common\nimport FlexBuffers\nimport XCTest\n\nfinal class FlexBuffersWriterTests: XCTestCase {\n  func testDeallocation() {\n    let buf: ByteBuffer = {\n      var fbx = FlexBuffersWriter()\n      fbx.add(string: \"Hello\")\n      fbx.finish()\n      return fbx.sizedByteBuffer\n    }()\n\n    buf.withUnsafeBytes {\n      XCTAssertEqual(\n        Array($0),\n        [5, 72, 101, 108, 108, 111, 0, 6, 20, 1])\n    }\n  }\n\n  func testAddingVectorOfScalars() {\n    var fbx = FlexBuffersWriter()\n    fbx.vector {\n      let arr: [Int32] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 20]\n      $0.create(vector: arr)\n    }\n    fbx.finish()\n    let buf: ByteBuffer = fbx.sizedByteBuffer\n\n    buf.withUnsafeBytes {\n      // swiftformat:disable all\n      XCTAssertEqual(\n        Array($0),\n        [\n          10, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 7, 0,\n          0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 20, 0, 0, 0, 1, 41, 46, 2, 40, 1,\n        ])\n      // swiftformat:enable all\n    }\n  }\n\n  func testAddingVectorOfUnsignedScalars() {\n    var fbx = FlexBuffersWriter()\n    fbx.vector {\n      let arr: [UInt] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 20]\n      $0.create(vector: arr)\n    }\n    fbx.finish()\n    let buf: ByteBuffer = fbx.sizedByteBuffer\n\n    buf.withUnsafeBytes {\n      // swiftformat:disable all\n      XCTAssertEqual(\n        Array($0),\n        [\n          10, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0,\n          0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0,\n          0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 1,\n          81, 51, 2, 40, 1,\n        ])\n      // swiftformat:enable all\n    }\n  }\n\n  func testAddingVectorOfBools() {\n    var fbx = FlexBuffersWriter()\n    fbx.vector {\n      let arr: [Bool] = [true, false, true, false]\n      $0.create(vector: arr)\n    }\n    fbx.finish()\n    let buf: ByteBuffer = fbx.sizedByteBuffer\n\n    buf.withUnsafeBytes {\n      // swiftformat:disable all\n      XCTAssertEqual(\n        Array($0),\n        [4, 1, 0, 1, 0, 1, 5, 144, 2, 40, 1])\n      // swiftformat:enable all\n    }\n  }\n\n  func testSortingWithinMap() {\n    var fbx = FlexBuffersWriter()\n    fbx.map {\n      $0.add(bool: false, key: \"bool2\")\n      $0.add(bool: true, key: \"bool1\")\n    }\n    fbx.finish()\n    let buf: ByteBuffer = fbx.sizedByteBuffer\n    buf.withUnsafeBytes {\n      // swiftformat:disable all\n      XCTAssertEqual(\n        Array($0),\n        [\n          98, 111, 111, 108, 50, 0, 98, 111, 111, 108, 49, 0, 2, 7, 14, 2, 1, 2, 1, 0, 104, 104, 4,\n          36, 1,\n        ]\n      )\n      // swiftformat:enable all\n    }\n  }\n\n  func testSharingKeyWithinMap() {\n    var fbx = FlexBuffersWriter(initialSize: 1000, flags: .shareKeysAndStrings)\n    fbx.map {\n      $0.add(string: \"welcome\", key: \"welcome\")\n      $0.add(string: \"welcome\", key: \"welcome\")\n      $0.add(string: \"welcome\", key: \"welcome\")\n    }\n    fbx.finish()\n    let buf: ByteBuffer = fbx.sizedByteBuffer\n    buf.withUnsafeBytes {\n      // swiftformat:disable all\n      XCTAssertEqual(\n        Array($0),\n        [\n          119, 101, 108, 99, 111, 109, 101, 0, 7, 119, 101, 108, 99, 111, 109, 101, 0, 3, 18, 19,\n          20, 3, 1, 3, 15, 16, 17, 20, 20, 20, 6, 36, 1,\n        ]\n      )\n      // swiftformat:enable all\n    }\n  }\n\n  func testNestingVectorInMap() {\n    let buf: ByteBuffer = createSizedBuffer()\n\n    buf.withUnsafeBytes {\n      // swiftformat:disable all\n      XCTAssertEqual(\n        Array($0),\n        flexbufferGolden\n      )\n      // swiftformat:enable all\n    }\n  }\n\n  func testAddingNil() {\n    var fbx = FlexBuffersWriter(\n      initialSize: 8,\n      flags: .shareKeysAndStrings)\n\n    fbx.map { map in\n      map.addNil(key: \"v\")\n    }\n\n    fbx.finish()\n    let buf: ByteBuffer = fbx.sizedByteBuffer\n    buf.withUnsafeBytes {\n      // swiftformat:disable all\n      XCTAssertEqual(\n        Array($0),\n        [118, 0, 1, 3, 1, 1, 1, 0, 0, 2, 36, 1]\n      )\n      // swiftformat:enable all\n    }\n  }\n\n  func testAddingManually() {\n    var fbx = FlexBuffersWriter(\n      initialSize: 8,\n      flags: .shareKeysAndStrings)\n\n    let outerMap = fbx.startMap()\n\n    let vector = fbx.startVector(key: \"vec\")\n    fbx.add(int64: -100)\n    fbx.add(string: \"Fred\")\n    fbx.indirect(float32: 4.0)\n    let lv = fbx.lastValue()\n    let blob: [UInt8] = [77]\n    fbx.add(blob: blob, length: blob.count)\n    fbx.add(bool: false)\n    fbx.reuse(value: lv!)\n    fbx.endVector(start: vector)\n\n    let ints: [Int32] = [1, 2, 3]\n    fbx.create(vector: ints, key: \"bar\")\n    fbx.createFixed(vector: ints, key: \"bar3\")\n    let bools = [true, false, true, false]\n    fbx.create(vector: bools, key: \"bools\")\n    fbx.add(bool: true, key: \"bool\")\n    fbx.add(double: 100, key: \"foo\")\n\n    let innerMap = fbx.startMap(key: \"mymap\")\n    fbx.add(string: \"Fred\", key: \"foo\")\n    fbx.endMap(start: innerMap)\n\n    fbx.endMap(start: outerMap)\n\n    fbx.finish()\n    let buf: ByteBuffer = fbx.sizedByteBuffer\n    buf.withUnsafeBytes {\n      // swiftformat:disable all\n      XCTAssertEqual(\n        Array($0),\n        flexbufferGolden\n      )\n      // swiftformat:enable all\n    }\n  }\n\n  func testEncodingAllTypes() {\n    var fbx = FlexBuffersWriter()\n    fbx.vector {\n      $0.indirect(int64: 9)\n      $0.indirect(uint64: 9)\n      $0.indirect(float32: 3)\n      $0.indirect(double: 3)\n\n      $0.addNil()\n      $0.add(bool: true)\n      $0.add(int64: 9)\n      $0.add(int64: -9)\n      $0.add(uint64: 9)\n      $0.add(double: 2.4)\n      $0.add(float32: 2.4)\n      $0.add(double: -2.4)\n      $0.add(float32: -2.4)\n    }\n    fbx.finish()\n    let buf: ByteBuffer = fbx.sizedByteBuffer\n\n    buf.withUnsafeBytes {\n      // swiftformat:disable all\n      XCTAssertEqual(\n        Array($0),\n        allTypesGolden)\n      // swiftformat:enable all\n    }\n  }\n}\n"
  },
  {
    "path": "tests/swift/Tests/Flexbuffers/Mocks.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport FlexBuffers\n\n// swiftformat:disable all\nlet flexbufferGolden: [UInt8] = [\n  118, 101, 99, 0, 4, 70, 114, 101, 100, 0, 0, 0, 0, 0, 128, 64, 1, 77, 6, 156, 15, 9, 5, 0, 12, 4,\n  20, 34, 100, 104, 34, 98, 97, 114, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 98, 97,\n  114, 51, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 98, 111, 111, 108, 115, 0, 4, 1, 0, 1, 0,\n  98, 111, 111, 108, 0, 102, 111, 111, 0, 109, 121, 109, 97, 112, 0, 1, 11, 1, 1, 1, 98, 20, 7, 75,\n  55, 25, 37, 22, 19, 112, 0, 0, 0, 10, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 88, 0, 0, 0, 72, 0, 0, 0,\n  1, 0, 0, 0, 61, 0, 0, 0, 0, 0, 200, 66, 45, 0, 0, 0, 133, 0, 0, 0, 46, 78, 106, 144, 14, 36, 40,\n  35, 38, 1,\n]\n\nlet allTypesGolden: [UInt8] = [\n  9, 9, 0, 0, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0,\n  0, 31, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 1, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 247, 255, 255, 255, 255, 255, 255, 255, 9, 0,\n  0, 0, 0, 0, 0, 0, 51, 51, 51, 51, 51, 51, 3, 64, 0, 0, 0, 64, 51, 51, 3, 64, 51, 51, 51, 51, 51,\n  51, 3, 192, 0, 0, 0, 64, 51, 51, 3, 192, 24, 28, 34, 34, 3, 107, 7, 7, 11, 15, 15, 15, 15, 117,\n  43, 1,\n]\n// swiftformat:enable all\n\n@inline(__always)\nfunc createSizedBuffer() -> ByteBuffer {\n  createProperBuffer().sizedByteBuffer\n}\n\n@inline(__always)\nfunc createProperBuffer() -> FlexBuffersWriter {\n  var fbx = FlexBuffersWriter(\n    initialSize: 8,\n    flags: .shareKeysAndStrings)\n  write(fbx: &fbx)\n  return fbx\n}\n\nfunc write(fbx: inout FlexBuffersWriter) {\n  fbx.map { map in\n    map.vector(key: \"vec\") { v in\n      v.add(int64: -100)\n      v.add(string: \"Fred\")\n      v.indirect(float32: 4.0)\n      let lv = v.lastValue()\n      let blob: [UInt8] = [77]\n      v.add(blob: blob, length: blob.count)\n      v.add(bool: false)\n      v.reuse(value: lv!)\n    }\n    let ints: [Int32] = [1, 2, 3]\n    map.create(vector: ints, key: \"bar\")\n    map.createFixed(vector: ints, key: \"bar3\")\n    let bools = [true, false, true, false]\n    map.create(vector: bools, key: \"bools\")\n    map.add(bool: true, key: \"bool\")\n    map.add(double: 100, key: \"foo\")\n    map.map(key: \"mymap\") { m in\n      m.add(string: \"Fred\", key: \"foo\")\n    }\n  }\n\n  fbx.finish()\n}\n"
  },
  {
    "path": "tests/swift/Wasm.tests/.swift-version",
    "content": "6.2.1"
  },
  {
    "path": "tests/swift/Wasm.tests/Package.swift",
    "content": "// swift-tools-version:5.10\n/*\n * Copyright 2020 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport PackageDescription\n\nlet package = Package(\n  name: \"FlatBuffers.Test.Swift.Wasm\",\n  platforms: [\n    .macOS(.v10_14),\n  ],\n  dependencies: [\n    .package(path: \"../../..\"),\n    .package(url: \"https://github.com/swiftwasm/WasmKit\", exact: \"0.1.6\"),\n  ],\n  targets: [\n    .target(name: \"Wasm\"),\n    .testTarget(\n      name: \"FlatBuffers.Test.Swift.WasmTests\",\n      dependencies: [\n        .product(name: \"FlatBuffers\", package: \"flatbuffers\"),\n      ]),\n    .testTarget(\n      name: \"FlexBuffers.Test.Swift.WasmTests\",\n      dependencies: [\n        .product(name: \"FlexBuffers\", package: \"flatbuffers\"),\n      ]),\n  ])\n"
  },
  {
    "path": "tests/swift/Wasm.tests/Sources/Wasm/Wasm.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npublic struct Wasm {}\n"
  },
  {
    "path": "tests/swift/Wasm.tests/Tests/FlatBuffers.Test.Swift.WasmTests/FlatBuffersMonsterWriterTests.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Foundation\nimport XCTest\n\n@testable import FlatBuffers\n\ntypealias Test = MyGame_Example_Test\ntypealias Monster = MyGame_Example_Monster\ntypealias Vec3 = MyGame_Example_Vec3\ntypealias Stat = MyGame_Example_Stat\n\nclass FlatBuffersMonsterWriterTests: XCTestCase {\n\n  func testData() {\n    // swiftformat:disable all\n    let data: [UInt8] = [\n      48, 0, 0, 0, 77, 79, 78, 83, 0, 0, 0, 0, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28, 0,\n      0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0, 0, 0,\n      0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0, 0, 0,\n      80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64, 2, 0, 5,\n      0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10, 0, 20, 0,\n      152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1,\n      2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116,\n      49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0, 3, 0, 0, 0, 20,\n      0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255, 255, 255, 36, 0,\n      0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0, 0, 0, 87, 105, 108,\n      109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0, 0, 70, 114, 111, 100,\n      111, 0, 0, 0,\n    ]\n    // swiftformat:enable all\n    let _data = ByteBuffer(bytes: data)\n    readVerifiedMonster(fb: _data)\n  }\n\n  func testCreateMonster() {\n    let bytes = createMonster(withPrefix: false)\n    // swiftformat:disable all\n    XCTAssertEqual(\n      bytes.sizedByteArray,\n      [\n        48, 0, 0, 0, 77, 79, 78, 83, 0, 0, 0, 0, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28,\n        0, 0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0,\n        0, 0, 0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0,\n        0, 0, 80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64,\n        2, 0, 5, 0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10,\n        0, 20, 0, 152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0,\n        0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116,\n        101, 115, 116, 49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0,\n        3, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255,\n        255, 255, 36, 0, 0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0,\n        0, 0, 87, 105, 108, 109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0,\n        0, 70, 114, 111, 100, 111, 0, 0, 0,\n      ])\n    // swiftformat:enable all\n    var buffer = bytes.buffer\n\n    let monster: MyGame_Example_Monster = getRoot(byteBuffer: &buffer)\n    readMonster(monster: monster)\n    mutateMonster(fb: bytes.buffer)\n    readMonster(monster: monster)\n  }\n\n  func testCreateMonsterResizedBuffer() {\n    let bytes = createMonster(withPrefix: false)\n    // swiftformat:disable all\n    XCTAssertEqual(\n      bytes.sizedByteArray,\n      [\n        48, 0, 0, 0, 77, 79, 78, 83, 0, 0, 0, 0, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28,\n        0, 0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0,\n        0, 0, 0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0,\n        0, 0, 80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64,\n        2, 0, 5, 0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10,\n        0, 20, 0, 152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0,\n        0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116,\n        101, 115, 116, 49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0,\n        3, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255,\n        255, 255, 36, 0, 0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0,\n        0, 0, 87, 105, 108, 109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0,\n        0, 70, 114, 111, 100, 111, 0, 0, 0,\n      ])\n    // swiftformat:enable all\n    readVerifiedMonster(fb: bytes.sizedBuffer)\n  }\n\n  func testCreateMonsterPrefixed() {\n    let bytes = createMonster(withPrefix: true)\n    // swiftformat:disable all\n    XCTAssertEqual(\n      bytes.sizedByteArray,\n      [\n        44, 1, 0, 0, 44, 0, 0, 0, 77, 79, 78, 83, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28,\n        0, 0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0,\n        0, 0, 0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0,\n        0, 0, 80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64,\n        2, 0, 5, 0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10,\n        0, 20, 0, 152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0,\n        0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116,\n        101, 115, 116, 49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0,\n        3, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255,\n        255, 255, 36, 0, 0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0,\n        0, 0, 87, 105, 108, 109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0,\n        0, 70, 114, 111, 100, 111, 0, 0, 0,\n      ])\n    // swiftformat:enable all\n\n    var buffer = bytes.buffer\n    readMonster(monster: getPrefixedSizeRoot(byteBuffer: &buffer))\n  }\n\n  func testCreateMonsterUsingCreateMonsterMethodWithNilPos() {\n    var fbb = FlatBufferBuilder(initialSize: 1)\n    let name = fbb.create(string: \"Frodo\")\n    let mStart = Monster.startMonster(&fbb)\n    Monster.add(name: name, &fbb)\n    let root = Monster.endMonster(&fbb, start: mStart)\n    fbb.finish(offset: root)\n    var buffer = fbb.sizedBuffer\n    let newMonster: Monster = getRoot(byteBuffer: &buffer)\n    XCTAssertNil(newMonster.pos)\n    XCTAssertEqual(newMonster.name, \"Frodo\")\n  }\n\n  func testCreateMonsterUsingCreateMonsterMethodWithPosX() {\n    var fbb = FlatBufferBuilder(initialSize: 1)\n    let name = fbb.create(string: \"Barney\")\n    let mStart = Monster.startMonster(&fbb)\n    Monster.add(\n      pos: MyGame_Example_Vec3(\n        x: 10,\n        y: 0,\n        z: 0,\n        test1: 0,\n        test2: .blue,\n        test3: .init()),\n      &fbb)\n    Monster.add(name: name, &fbb)\n    let root = Monster.endMonster(&fbb, start: mStart)\n    fbb.finish(offset: root)\n\n    var buffer = fbb.sizedBuffer\n    let newMonster: Monster = getRoot(byteBuffer: &buffer)\n    XCTAssertEqual(newMonster.pos!.x, 10)\n    XCTAssertEqual(newMonster.name, \"Barney\")\n  }\n\n  func testReadMonsterFromUnsafePointerWithoutCopying() {\n    // swiftformat:disable all\n    var array: [UInt8] = [\n      48, 0, 0, 0, 77, 79, 78, 83, 0, 0, 0, 0, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28, 0,\n      0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0, 0, 0,\n      0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0, 0, 0,\n      80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64, 2, 0, 5,\n      0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10, 0, 20, 0,\n      152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1,\n      2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116,\n      49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0, 3, 0, 0, 0, 20,\n      0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255, 255, 255, 36, 0,\n      0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0, 0, 0, 87, 105, 108,\n      109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0, 0, 70, 114, 111, 100,\n      111, 0, 0, 0,\n    ]\n    // swiftformat:enable all\n    let unpacked =\n      array\n        .withUnsafeMutableBytes { memory -> MyGame_Example_MonsterT in\n          var bytes = ByteBuffer(\n            assumingMemoryBound: memory.baseAddress!,\n            capacity: memory.count)\n          var monster: Monster = getRoot(byteBuffer: &bytes)\n          readFlatbufferMonster(monster: &monster)\n          let unpacked = monster.unpack()\n          return unpacked\n        }\n    readObjectApi(monster: unpacked)\n  }\n\n  func testArrayOfBools() {\n    let boolArray = [false, true, false, true, false, true, false]\n    var fbb = FlatBufferBuilder(initialSize: 1)\n    let name = fbb.create(string: \"Frodo\")\n    let bools = fbb.createVector(boolArray)\n\n    let root = Monster.createMonster(\n      &fbb,\n      nameOffset: name,\n      testarrayofboolsVectorOffset: bools)\n    fbb.finish(offset: root)\n    var buffer = fbb.sizedBuffer\n    let monster: Monster = getRoot(byteBuffer: &buffer)\n    let values = monster.testarrayofbools\n\n    XCTAssertEqual(boolArray.count, values.count)\n\n    for (index, bool) in monster.testarrayofbools.enumerated() {\n      XCTAssertEqual(bool, boolArray[index])\n    }\n  }\n\n  func readVerifiedMonster(fb: ByteBuffer) {\n    var byteBuffer = fb\n    XCTAssertNoThrow(\n      try readMonster(\n        monster: getCheckedRoot(\n          byteBuffer: &byteBuffer) as MyGame_Example_Monster))\n  }\n\n  func testUnalignedRead() {\n    // Aligned read\n    let fbb = createMonster(withPrefix: false)\n    let testAligned: () -> Bool = {\n      var buffer = fbb.sizedBuffer\n      var monster: Monster = getRoot(byteBuffer: &buffer)\n      self.readFlatbufferMonster(monster: &monster)\n      return true\n    }\n    XCTAssertEqual(testAligned(), true)\n    let testUnaligned: () -> Bool = {\n      var bytes: [UInt8] = [0x00]\n      bytes.append(contentsOf: fbb.sizedByteArray)\n      return bytes.withUnsafeMutableBytes { ptr in\n        guard var baseAddress = ptr.baseAddress else {\n          XCTFail(\"Base pointer is not defined\")\n          return false\n        }\n        baseAddress = baseAddress.advanced(by: 1)\n        let unlignedPtr = UnsafeMutableRawPointer(baseAddress)\n        var bytes = ByteBuffer(\n          assumingMemoryBound: unlignedPtr,\n          capacity: ptr.count - 1)\n        var monster: Monster = getRoot(byteBuffer: &bytes)\n        self.readFlatbufferMonster(monster: &monster)\n        return true\n      }\n    }\n    XCTAssertEqual(testUnaligned(), true)\n  }\n\n  func testReadingRemovedSizeUnalignedBuffer() {\n    // Aligned read\n    let fbb = createMonster(withPrefix: true)\n    let testUnaligned: () -> Bool = {\n      var bytes: [UInt8] = [0x00]\n      bytes.append(contentsOf: fbb.sizedByteArray)\n      return bytes.withUnsafeMutableBytes { ptr in\n        guard var baseAddress = ptr.baseAddress else {\n          XCTFail(\"Base pointer is not defined\")\n          return false\n        }\n        baseAddress = baseAddress.advanced(by: 1)\n        let unlignedPtr = UnsafeMutableRawPointer(baseAddress)\n        let bytes = ByteBuffer(\n          assumingMemoryBound: unlignedPtr,\n          capacity: ptr.count - 1)\n        var newBuf = FlatBuffersUtils.removeSizePrefix(bb: bytes)\n        var monster: Monster = getRoot(byteBuffer: &newBuf)\n        self.readFlatbufferMonster(monster: &monster)\n        return true\n      }\n    }\n    XCTAssertEqual(testUnaligned(), true)\n  }\n\n  func testForceRetainedObject() {\n    let byteBuffer = {\n      // swiftformat:disable all\n      var data: [UInt8]? = [\n        48, 0, 0, 0, 77, 79, 78, 83, 0, 0, 0, 0, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28,\n        0, 0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0,\n        0, 0, 0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0,\n        0, 0, 80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64,\n        2, 0, 5, 0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10,\n        0, 20, 0, 152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0,\n        0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116,\n        101, 115, 116, 49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0,\n        3, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255,\n        255, 255, 36, 0, 0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0,\n        0, 0, 87, 105, 108, 109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0,\n        0, 70, 114, 111, 100, 111, 0, 0, 0,\n      ]\n      // swiftformat:enable all\n      let buffer = ByteBuffer(bytes: data!)\n      data = nil\n      return buffer\n    }()\n    readVerifiedMonster(fb: byteBuffer)\n  }\n\n  func readMonster(monster: Monster) {\n    var monster = monster\n    readFlatbufferMonster(monster: &monster)\n    let unpacked: MyGame_Example_MonsterT? = monster.unpack()\n    readObjectApi(monster: unpacked!)\n    guard var buffer = unpacked?.serialize()\n    else { fatalError(\"Couldnt generate bytebuffer\") }\n    var newMonster: Monster = getRoot(byteBuffer: &buffer)\n    readFlatbufferMonster(monster: &newMonster)\n  }\n\n  func createMonster(withPrefix prefix: Bool) -> FlatBufferBuilder {\n    var fbb = FlatBufferBuilder(initialSize: 1)\n    write(fbb: &fbb, prefix: prefix)\n    return fbb\n  }\n\n  func write(fbb: inout FlatBufferBuilder, prefix: Bool = false) {\n    let names = [\n      fbb.create(string: \"Frodo\"),\n      fbb.create(string: \"Barney\"),\n      fbb.create(string: \"Wilma\"),\n    ]\n    var offsets: [Offset] = []\n    let start1 = Monster.startMonster(&fbb)\n    Monster.add(name: names[0], &fbb)\n    offsets.append(Monster.endMonster(&fbb, start: start1))\n    let start2 = Monster.startMonster(&fbb)\n    Monster.add(name: names[1], &fbb)\n    offsets.append(Monster.endMonster(&fbb, start: start2))\n    let start3 = Monster.startMonster(&fbb)\n    Monster.add(name: names[2], &fbb)\n    offsets.append(Monster.endMonster(&fbb, start: start3))\n\n    let sortedArray = Monster.sortVectorOfMonster(offsets: offsets, &fbb)\n\n    let str = fbb.create(string: \"MyMonster\")\n    let test1 = fbb.create(string: \"test1\")\n    let test2 = fbb.create(string: \"test2\")\n    let _inv: [Byte] = [0, 1, 2, 3, 4]\n    let inv = fbb.createVector(_inv)\n\n    let fred = fbb.create(string: \"Fred\")\n    let mon1Start = Monster.startMonster(&fbb)\n    Monster.add(name: fred, &fbb)\n    let mon2 = Monster.endMonster(&fbb, start: mon1Start)\n\n    let test4 = fbb.createVector(ofStructs: [\n      MyGame_Example_Test(a: 30, b: 40),\n      MyGame_Example_Test(a: 10, b: 20),\n    ])\n\n    let stringTestVector = fbb.createVector(ofOffsets: [test1, test2])\n    let mStart = Monster.startMonster(&fbb)\n    Monster.add(\n      pos: MyGame_Example_Vec3(\n        x: 1,\n        y: 2,\n        z: 3,\n        test1: 3,\n        test2: .green,\n        test3: .init(a: 5, b: 6)),\n      &fbb)\n    Monster.add(hp: 80, &fbb)\n    Monster.add(name: str, &fbb)\n    Monster.addVectorOf(inventory: inv, &fbb)\n    Monster.add(testType: .monster, &fbb)\n    Monster.add(test: mon2, &fbb)\n    Monster.addVectorOf(test4: test4, &fbb)\n    Monster.addVectorOf(testarrayofstring: stringTestVector, &fbb)\n    Monster.add(testbool: true, &fbb)\n    Monster.addVectorOf(testarrayoftables: sortedArray, &fbb)\n    let end = Monster.endMonster(&fbb, start: mStart)\n    Monster.finish(&fbb, end: end, prefix: prefix)\n  }\n\n  func mutateMonster(fb: ByteBuffer) {\n    var fb = fb\n\n    let monster: Monster = getRoot(byteBuffer: &fb)\n    XCTAssertFalse(monster.mutate(mana: 10))\n    XCTAssertEqual(monster.testarrayoftables[0].name, \"Barney\")\n    XCTAssertEqual(monster.testarrayoftables[1].name, \"Frodo\")\n    XCTAssertEqual(monster.testarrayoftables[2].name, \"Wilma\")\n\n    // Example of searching for a table by the key\n    XCTAssertNotNil(monster.testarrayoftablesBy(key: \"Frodo\"))\n    XCTAssertNotNil(monster.testarrayoftablesBy(key: \"Barney\"))\n    XCTAssertNotNil(monster.testarrayoftablesBy(key: \"Wilma\"))\n\n    XCTAssertEqual(monster.testType, .monster)\n\n    XCTAssertEqual(monster.mutate(inventory: 1, at: 0), true)\n    XCTAssertEqual(monster.mutate(inventory: 2, at: 1), true)\n    XCTAssertEqual(monster.mutate(inventory: 3, at: 2), true)\n    XCTAssertEqual(monster.mutate(inventory: 4, at: 3), true)\n    XCTAssertEqual(monster.mutate(inventory: 5, at: 4), true)\n\n    for i in 0..<monster.inventory.count {\n      XCTAssertEqual(monster.inventory[i], Byte(i + 1))\n    }\n\n    XCTAssertEqual(monster.mutate(inventory: 0, at: 0), true)\n    XCTAssertEqual(monster.mutate(inventory: 1, at: 1), true)\n    XCTAssertEqual(monster.mutate(inventory: 2, at: 2), true)\n    XCTAssertEqual(monster.mutate(inventory: 3, at: 3), true)\n    XCTAssertEqual(monster.mutate(inventory: 4, at: 4), true)\n\n    let vec = monster.mutablePos\n    XCTAssertEqual(vec?.x, 1)\n    XCTAssertTrue(vec?.mutate(x: 55.0) ?? false)\n    XCTAssertTrue(vec?.mutate(test1: 55) ?? false)\n    XCTAssertEqual(vec?.x, 55.0)\n    XCTAssertEqual(vec?.test1, 55.0)\n    XCTAssertTrue(vec?.mutate(x: 1) ?? false)\n    XCTAssertEqual(vec?.x, 1)\n    XCTAssertTrue(vec?.mutate(test1: 3) ?? false)\n\n    let mutableTest4 = monster.mutableTest4\n    let orignalValues = mutableTest4[0].a\n    XCTAssertEqual(mutableTest4[0].mutate(a: 100), true)\n    XCTAssertNotEqual(monster.test4[0].a, orignalValues)\n    XCTAssertEqual(monster.test4[0].a, 100)\n    XCTAssertEqual(mutableTest4[0].mutate(a: orignalValues), true)\n  }\n\n  func readFlatbufferMonster(monster: inout MyGame_Example_Monster) {\n    XCTAssertEqual(monster.hp, 80)\n    XCTAssertEqual(monster.mana, 150)\n    XCTAssertEqual(monster.name, \"MyMonster\")\n    let pos = monster.pos\n    XCTAssertEqual(pos?.x, 1)\n    XCTAssertEqual(pos?.y, 2)\n    XCTAssertEqual(pos?.z, 3)\n    XCTAssertEqual(pos?.test1, 3)\n    XCTAssertEqual(pos?.test2, .green)\n    let test = pos?.test3\n    XCTAssertEqual(test?.a, 5)\n    XCTAssertEqual(test?.b, 6)\n    XCTAssertEqual(monster.testType, .monster)\n    let monster2 = monster.test(type: Monster.self)\n    XCTAssertEqual(monster2?.name, \"Fred\")\n\n    XCTAssertEqual(monster.mutate(mana: 10), false)\n\n    XCTAssertEqual(monster.mana, 150)\n    XCTAssertEqual(monster.inventory.count, 5)\n    var sum: Byte = 0\n    for inventory in monster.inventory {\n      sum += inventory\n    }\n    XCTAssertEqual(sum, 10)\n\n    monster.withUnsafePointerToInventory { ptr, count in\n      var sum: UInt8 = 0\n      for pointee in ptr.startIndex..<ptr.endIndex {\n        sum += ptr[pointee]\n      }\n      XCTAssertEqual(sum, 10)\n    }\n\n    XCTAssertEqual(monster.test4.count, 2)\n\n    let test4 = monster.test4\n    var sum0 = 0\n    for test0 in test4 {\n      sum0 += Int(test0.a) + Int(test0.b)\n    }\n    XCTAssertEqual(sum0, 100)\n\n    monster.withUnsafePointerToTest4 { ptr, count in\n      guard let ptr = ptr.baseAddress else { return }\n\n      let bindedMemory: UnsafeBufferPointer<MyGame_Example_Test> =\n        UnsafeBufferPointer(\n          start: ptr.bindMemory(\n            to: MyGame_Example_Test.self,\n            capacity: count),\n          count: count)\n      var pointerSum = 0\n      for pointee in bindedMemory.startIndex..<bindedMemory.endIndex {\n        pointerSum += Int(bindedMemory[pointee].a) +\n          Int(bindedMemory[pointee].b)\n      }\n      XCTAssertEqual(pointerSum, 100)\n    }\n\n    let mutableTest4 = monster.mutableTest4\n    var sum2 = 0\n    for test0 in mutableTest4 {\n      sum2 += Int(test0.a) + Int(test0.b)\n    }\n    XCTAssertEqual(sum2, 100)\n\n    let stringArray = monster.testarrayofstring\n    XCTAssertEqual(stringArray.count, 2)\n    XCTAssertEqual(stringArray[0], \"test1\")\n    XCTAssertEqual(stringArray[1], \"test2\")\n    XCTAssertEqual(monster.testbool, true)\n\n    let array = monster.nameSegmentArray\n    XCTAssertEqual(String(bytes: array ?? [], encoding: .utf8), \"MyMonster\")\n\n    if 0 == monster.testarrayofbools.count {\n      XCTAssertEqual(monster.testarrayofbools.isEmpty, true)\n    } else {\n      XCTAssertEqual(monster.testarrayofbools.isEmpty, false)\n    }\n  }\n\n  func readObjectApi(monster: MyGame_Example_MonsterT) {\n    XCTAssertEqual(monster.hp, 80)\n    XCTAssertEqual(monster.mana, 150)\n    XCTAssertEqual(monster.name, \"MyMonster\")\n    let pos = monster.pos\n    XCTAssertEqual(pos?.x, 1)\n    XCTAssertEqual(pos?.y, 2)\n    XCTAssertEqual(pos?.z, 3)\n    XCTAssertEqual(pos?.test1, 3)\n    XCTAssertEqual(pos?.test2, .green)\n    let test = pos?.test3\n    XCTAssertEqual(test?.a, 5)\n    XCTAssertEqual(test?.b, 6)\n    let monster2 = monster.test?.value as? MyGame_Example_MonsterT\n    XCTAssertEqual(monster2?.name, \"Fred\")\n    XCTAssertEqual(monster.mana, 150)\n    monster.mana = 10\n    XCTAssertEqual(monster.mana, 10)\n    monster.mana = 150\n    XCTAssertEqual(monster.mana, 150)\n\n    XCTAssertEqual(monster.inventory.count, 5)\n    var sum: Byte = 0\n    for i in monster.inventory {\n      sum += i\n    }\n    XCTAssertEqual(sum, 10)\n    XCTAssertEqual(monster.test4.count, 2)\n    var sum0 = 0\n    for test in monster.test4 {\n      sum0 += Int(test.a) + Int(test.b)\n    }\n    XCTAssertEqual(sum0, 100)\n    XCTAssertEqual(monster.testbool, true)\n  }\n\n  func testEncoding() {\n    let fbb = createMonster(withPrefix: false)\n    var sizedBuffer = fbb.sizedBuffer\n    do {\n      struct Test: Decodable {\n        struct Pos: Decodable {\n          let x, y, z: Int\n        }\n        let hp: Int\n        let inventory: [UInt8]\n        let name: String\n        let pos: Pos\n      }\n      let reader: Monster = try getCheckedRoot(byteBuffer: &sizedBuffer)\n      let encoder = JSONEncoder()\n      encoder.keyEncodingStrategy = .convertToSnakeCase\n      let data = try encoder.encode(reader)\n      let decoder = JSONDecoder()\n      decoder.keyDecodingStrategy = .convertFromSnakeCase\n      let value = try decoder.decode(Test.self, from: data)\n      XCTAssertEqual(value.name, \"MyMonster\")\n      XCTAssertEqual(value.pos.x, 1)\n      XCTAssertEqual(value.pos.y, 2)\n      XCTAssertEqual(value.pos.z, 3)\n    } catch {\n      XCTFail(error.localizedDescription)\n    }\n  }\n\n  var jsonData: String {\n    \"\"\"\n    {\\\"hp\\\":80,\\\"inventory\\\":[0,1,2,3,4],\\\"test\\\":{\\\"name\\\":\\\"Fred\\\"},\\\"testarrayofstring\\\":[\\\"test1\\\",\\\"test2\\\"],\\\"testarrayoftables\\\":[{\\\"name\\\":\\\"Barney\\\"},{\\\"name\\\":\\\"Frodo\\\"},{\\\"name\\\":\\\"Wilma\\\"}],\\\"test4\\\":[{\\\"a\\\":30,\\\"b\\\":40},{\\\"a\\\":10,\\\"b\\\":20}],\\\"testbool\\\":true,\\\"test_type\\\":\\\"Monster\\\",\\\"pos\\\":{\\\"y\\\":2,\\\"test3\\\":{\\\"a\\\":5,\\\"b\\\":6},\\\"z\\\":3,\\\"x\\\":1,\\\"test1\\\":3,\\\"test2\\\":\\\"Green\\\"},\\\"name\\\":\\\"MyMonster\\\"}\n    \"\"\"\n  }\n}\n"
  },
  {
    "path": "tests/swift/Wasm.tests/Tests/FlatBuffers.Test.Swift.WasmTests/monster_test_generated.swift",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// swiftlint:disable all\n// swiftformat:disable all\n\n#if canImport(Common)\nimport Common\n#endif\n\nimport FlatBuffers\n\n///  Composite components of Monster color.\npublic enum MyGame_Example_Color: UInt8, FlatbuffersVectorInitializable, Enum, Verifiable {\n  public typealias T = UInt8\n  public static var byteSize: Int { return MemoryLayout<UInt8>.size }\n  public var value: UInt8 { return self.rawValue }\n  case red = 1\n  ///  \\brief color Green\n  ///  Green is bit_flag with value (1u << 1)\n  case green = 2\n  ///  \\brief color Blue (1u << 3)\n  case blue = 8\n\n  public static var max: MyGame_Example_Color { return .blue }\n  public static var min: MyGame_Example_Color { return .red }\n}\n\nextension MyGame_Example_Color: Encodable {\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.singleValueContainer()\n    switch self {\n    case .red: try container.encode(\"Red\")\n    case .green: try container.encode(\"Green\")\n    case .blue: try container.encode(\"Blue\")\n    }\n  }\n}\n\npublic enum MyGame_Example_Race: Int8, FlatbuffersVectorInitializable, Enum, Verifiable {\n  public typealias T = Int8\n  public static var byteSize: Int { return MemoryLayout<Int8>.size }\n  public var value: Int8 { return self.rawValue }\n  case none_ = -1\n  case human = 0\n  case dwarf = 1\n  case elf = 2\n\n  public static var max: MyGame_Example_Race { return .elf }\n  public static var min: MyGame_Example_Race { return .none_ }\n}\n\nextension MyGame_Example_Race: Encodable {\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.singleValueContainer()\n    switch self {\n    case .none_: try container.encode(\"None\")\n    case .human: try container.encode(\"Human\")\n    case .dwarf: try container.encode(\"Dwarf\")\n    case .elf: try container.encode(\"Elf\")\n    }\n  }\n}\n\npublic enum MyGame_Example_LongEnum: UInt64, FlatbuffersVectorInitializable, Enum, Verifiable {\n  public typealias T = UInt64\n  public static var byteSize: Int { return MemoryLayout<UInt64>.size }\n  public var value: UInt64 { return self.rawValue }\n  case longone = 2\n  case longtwo = 4\n  case longbig = 1099511627776\n\n  public static var max: MyGame_Example_LongEnum { return .longbig }\n  public static var min: MyGame_Example_LongEnum { return .longone }\n}\n\nextension MyGame_Example_LongEnum: Encodable {\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.singleValueContainer()\n    switch self {\n    case .longone: try container.encode(\"LongOne\")\n    case .longtwo: try container.encode(\"LongTwo\")\n    case .longbig: try container.encode(\"LongBig\")\n    }\n  }\n}\n\npublic enum MyGame_Example_Any_: UInt8, FlatbuffersVectorInitializable, UnionEnum {\n  public typealias T = UInt8\n\n  public init?(value: T) {\n    self.init(rawValue: value)\n  }\n\n  public static var byteSize: Int { return MemoryLayout<UInt8>.size }\n  public var value: UInt8 { return self.rawValue }\n  case none_ = 0\n  case monster = 1\n  case testsimpletablewithenum = 2\n  case mygameExample2Monster = 3\n\n  public static var max: MyGame_Example_Any_ { return .mygameExample2Monster }\n  public static var min: MyGame_Example_Any_ { return .none_ }\n}\n\nextension MyGame_Example_Any_: Encodable {\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.singleValueContainer()\n    switch self {\n    case .none_: try container.encode(\"NONE\")\n    case .monster: try container.encode(\"Monster\")\n    case .testsimpletablewithenum: try container.encode(\"TestSimpleTableWithEnum\")\n    case .mygameExample2Monster: try container.encode(\"MyGame_Example2_Monster\")\n    }\n  }\n}\n\npublic struct MyGame_Example_Any_Union {\n  public var type: MyGame_Example_Any_\n  public var value: NativeObject?\n  public init(_ v: NativeObject?, type: MyGame_Example_Any_) {\n    self.type = type\n    self.value = v\n  }\n  public func pack(builder: inout FlatBufferBuilder) -> Offset {\n    switch type {\n    case .monster:\n      var __obj = value as? MyGame_Example_MonsterT\n      return MyGame_Example_Monster.pack(&builder, obj: &__obj)\n    case .testsimpletablewithenum:\n      var __obj = value as? MyGame_Example_TestSimpleTableWithEnumT\n      return MyGame_Example_TestSimpleTableWithEnum.pack(&builder, obj: &__obj)\n    case .mygameExample2Monster:\n      var __obj = value as? MyGame_Example2_MonsterT\n      return MyGame_Example2_Monster.pack(&builder, obj: &__obj)\n    default: return Offset()\n    }\n  }\n}\npublic enum MyGame_Example_AnyUniqueAliases: UInt8, FlatbuffersVectorInitializable, UnionEnum {\n  public typealias T = UInt8\n\n  public init?(value: T) {\n    self.init(rawValue: value)\n  }\n\n  public static var byteSize: Int { return MemoryLayout<UInt8>.size }\n  public var value: UInt8 { return self.rawValue }\n  case none_ = 0\n  case m = 1\n  case ts = 2\n  case m2 = 3\n\n  public static var max: MyGame_Example_AnyUniqueAliases { return .m2 }\n  public static var min: MyGame_Example_AnyUniqueAliases { return .none_ }\n}\n\nextension MyGame_Example_AnyUniqueAliases: Encodable {\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.singleValueContainer()\n    switch self {\n    case .none_: try container.encode(\"NONE\")\n    case .m: try container.encode(\"M\")\n    case .ts: try container.encode(\"TS\")\n    case .m2: try container.encode(\"M2\")\n    }\n  }\n}\n\npublic struct MyGame_Example_AnyUniqueAliasesUnion {\n  public var type: MyGame_Example_AnyUniqueAliases\n  public var value: NativeObject?\n  public init(_ v: NativeObject?, type: MyGame_Example_AnyUniqueAliases) {\n    self.type = type\n    self.value = v\n  }\n  public func pack(builder: inout FlatBufferBuilder) -> Offset {\n    switch type {\n    case .m:\n      var __obj = value as? MyGame_Example_MonsterT\n      return MyGame_Example_Monster.pack(&builder, obj: &__obj)\n    case .ts:\n      var __obj = value as? MyGame_Example_TestSimpleTableWithEnumT\n      return MyGame_Example_TestSimpleTableWithEnum.pack(&builder, obj: &__obj)\n    case .m2:\n      var __obj = value as? MyGame_Example2_MonsterT\n      return MyGame_Example2_Monster.pack(&builder, obj: &__obj)\n    default: return Offset()\n    }\n  }\n}\npublic enum MyGame_Example_AnyAmbiguousAliases: UInt8, FlatbuffersVectorInitializable, UnionEnum {\n  public typealias T = UInt8\n\n  public init?(value: T) {\n    self.init(rawValue: value)\n  }\n\n  public static var byteSize: Int { return MemoryLayout<UInt8>.size }\n  public var value: UInt8 { return self.rawValue }\n  case none_ = 0\n  case m1 = 1\n  case m2 = 2\n  case m3 = 3\n\n  public static var max: MyGame_Example_AnyAmbiguousAliases { return .m3 }\n  public static var min: MyGame_Example_AnyAmbiguousAliases { return .none_ }\n}\n\nextension MyGame_Example_AnyAmbiguousAliases: Encodable {\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.singleValueContainer()\n    switch self {\n    case .none_: try container.encode(\"NONE\")\n    case .m1: try container.encode(\"M1\")\n    case .m2: try container.encode(\"M2\")\n    case .m3: try container.encode(\"M3\")\n    }\n  }\n}\n\npublic struct MyGame_Example_AnyAmbiguousAliasesUnion {\n  public var type: MyGame_Example_AnyAmbiguousAliases\n  public var value: NativeObject?\n  public init(_ v: NativeObject?, type: MyGame_Example_AnyAmbiguousAliases) {\n    self.type = type\n    self.value = v\n  }\n  public func pack(builder: inout FlatBufferBuilder) -> Offset {\n    switch type {\n    case .m1:\n      var __obj = value as? MyGame_Example_MonsterT\n      return MyGame_Example_Monster.pack(&builder, obj: &__obj)\n    case .m2:\n      var __obj = value as? MyGame_Example_MonsterT\n      return MyGame_Example_Monster.pack(&builder, obj: &__obj)\n    case .m3:\n      var __obj = value as? MyGame_Example_MonsterT\n      return MyGame_Example_Monster.pack(&builder, obj: &__obj)\n    default: return Offset()\n    }\n  }\n}\npublic struct MyGame_Example_Test: NativeStruct, FlatbuffersVectorInitializable, Verifiable, FlatbuffersInitializable, NativeObject {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n\n  private var _a: Int16\n  private var _b: Int8\n  private var padding0__: UInt8 = 0\n\n  public init(_ bb: ByteBuffer, o: Int32) {\n    self = bb.read(def: Self.self, position: Int(o))\n  }\n\n  public init(a: Int16, b: Int8) {\n    _a = a\n    _b = b\n  }\n\n  public init() {\n    _a = 0\n    _b = 0\n  }\n\n  public init(_ _t: borrowing MyGame_Example_Test_Mutable) {\n    _a = _t.a\n    _b = _t.b\n  }\n\n  public var a: Int16 { _a }\n  public var b: Int8 { _b }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    try verifier.inBuffer(position: position, of: MyGame_Example_Test.self)\n  }\n}\n\nextension MyGame_Example_Test: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case a = \"a\"\n    case b = \"b\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    if a != 0 {\n      try container.encodeIfPresent(a, forKey: .a)\n    }\n    if b != 0 {\n      try container.encodeIfPresent(b, forKey: .b)\n    }\n  }\n}\n\npublic struct MyGame_Example_Test_Mutable: FlatBufferStruct, FlatbuffersVectorInitializable {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Struct\n\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }\n\n  public var a: Int16 { return _accessor.readBuffer(of: Int16.self, at: 0) }\n  @discardableResult public func mutate(a: Int16) -> Bool { return _accessor.mutate(a, index: 0) }\n  public var b: Int8 { return _accessor.readBuffer(of: Int8.self, at: 2) }\n  @discardableResult public func mutate(b: Int8) -> Bool { return _accessor.mutate(b, index: 2) }\n\n  public func unpack() -> MyGame_Example_Test {\n    return MyGame_Example_Test(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_Test?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_Test) -> Offset {\n    return builder.create(struct: obj)\n  }\n}\n\npublic struct MyGame_Example_Vec3: NativeStruct, FlatbuffersVectorInitializable, Verifiable, FlatbuffersInitializable, NativeObject {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n\n  private var _x: Float32\n  private var _y: Float32\n  private var _z: Float32\n  private var padding0__: UInt32 = 0\n  private var _test1: Double\n  private var _test2: UInt8\n  private var padding1__: UInt8 = 0\n  private var _test3: MyGame_Example_Test\n  private var padding2__: UInt16 = 0\n\n  public init(_ bb: ByteBuffer, o: Int32) {\n    self = bb.read(def: Self.self, position: Int(o))\n  }\n\n  public init(x: Float32, y: Float32, z: Float32, test1: Double, test2: MyGame_Example_Color, test3: MyGame_Example_Test) {\n    _x = x\n    _y = y\n    _z = z\n    _test1 = test1\n    _test2 = test2.value\n    _test3 = test3\n  }\n\n  public init() {\n    _x = 0.0\n    _y = 0.0\n    _z = 0.0\n    _test1 = 0.0\n    _test2 = 0\n    _test3 = MyGame_Example_Test()\n  }\n\n  public init(_ _t: borrowing MyGame_Example_Vec3_Mutable) {\n    _x = _t.x\n    _y = _t.y\n    _z = _t.z\n    _test1 = _t.test1\n    _test2 = _t.test2.value\n    let _vtest3 = _t.test3\n    _test3 = _vtest3.unpack()\n  }\n\n  public var x: Float32 { _x }\n  public var y: Float32 { _y }\n  public var z: Float32 { _z }\n  public var test1: Double { _test1 }\n  public var test2: MyGame_Example_Color { MyGame_Example_Color(rawValue: _test2)! }\n  public var test3: MyGame_Example_Test { _test3 }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    try verifier.inBuffer(position: position, of: MyGame_Example_Vec3.self)\n  }\n}\n\nextension MyGame_Example_Vec3: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case x = \"x\"\n    case y = \"y\"\n    case z = \"z\"\n    case test1 = \"test1\"\n    case test2 = \"test2\"\n    case test3 = \"test3\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    if x != 0.0 {\n      try container.encodeIfPresent(x, forKey: .x)\n    }\n    if y != 0.0 {\n      try container.encodeIfPresent(y, forKey: .y)\n    }\n    if z != 0.0 {\n      try container.encodeIfPresent(z, forKey: .z)\n    }\n    if test1 != 0.0 {\n      try container.encodeIfPresent(test1, forKey: .test1)\n    }\n    if test2 != .red {\n      try container.encodeIfPresent(test2, forKey: .test2)\n    }\n    try container.encodeIfPresent(test3, forKey: .test3)\n  }\n}\n\npublic struct MyGame_Example_Vec3_Mutable: FlatBufferStruct, FlatbuffersVectorInitializable {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Struct\n\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }\n\n  public var x: Float32 { return _accessor.readBuffer(of: Float32.self, at: 0) }\n  @discardableResult public func mutate(x: Float32) -> Bool { return _accessor.mutate(x, index: 0) }\n  public var y: Float32 { return _accessor.readBuffer(of: Float32.self, at: 4) }\n  @discardableResult public func mutate(y: Float32) -> Bool { return _accessor.mutate(y, index: 4) }\n  public var z: Float32 { return _accessor.readBuffer(of: Float32.self, at: 8) }\n  @discardableResult public func mutate(z: Float32) -> Bool { return _accessor.mutate(z, index: 8) }\n  public var test1: Double { return _accessor.readBuffer(of: Double.self, at: 16) }\n  @discardableResult public func mutate(test1: Double) -> Bool { return _accessor.mutate(test1, index: 16) }\n  public var test2: MyGame_Example_Color { return MyGame_Example_Color(rawValue: _accessor.readBuffer(of: UInt8.self, at: 24)) ?? .red }\n  @discardableResult public func mutate(test2: MyGame_Example_Color) -> Bool { return _accessor.mutate(test2.rawValue, index: 24) }\n  public var test3: MyGame_Example_Test_Mutable { return MyGame_Example_Test_Mutable(_accessor.bb, o: _accessor.position + 26) }\n\n  public func unpack() -> MyGame_Example_Vec3 {\n    return MyGame_Example_Vec3(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_Vec3?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_Vec3) -> Offset {\n    return builder.create(struct: obj)\n  }\n}\n\npublic struct MyGame_Example_Ability: NativeStruct, FlatbuffersVectorInitializable, Verifiable, FlatbuffersInitializable, NativeObject {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n\n  private var _id: UInt32\n  private var _distance: UInt32\n\n  public init(_ bb: ByteBuffer, o: Int32) {\n    self = bb.read(def: Self.self, position: Int(o))\n  }\n\n  public init(id: UInt32, distance: UInt32) {\n    _id = id\n    _distance = distance\n  }\n\n  public init() {\n    _id = 0\n    _distance = 0\n  }\n\n  public init(_ _t: borrowing MyGame_Example_Ability_Mutable) {\n    _id = _t.id\n    _distance = _t.distance\n  }\n\n  public var id: UInt32 { _id }\n  public var distance: UInt32 { _distance }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    try verifier.inBuffer(position: position, of: MyGame_Example_Ability.self)\n  }\n}\n\nextension MyGame_Example_Ability: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case id = \"id\"\n    case distance = \"distance\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    if id != 0 {\n      try container.encodeIfPresent(id, forKey: .id)\n    }\n    if distance != 0 {\n      try container.encodeIfPresent(distance, forKey: .distance)\n    }\n  }\n}\n\npublic struct MyGame_Example_Ability_Mutable: FlatBufferStruct, FlatbuffersVectorInitializable {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Struct\n\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }\n\n  public var id: UInt32 { return _accessor.readBuffer(of: UInt32.self, at: 0) }\n  @discardableResult public func mutate(id: UInt32) -> Bool { return _accessor.mutate(id, index: 0) }\n  public var distance: UInt32 { return _accessor.readBuffer(of: UInt32.self, at: 4) }\n  @discardableResult public func mutate(distance: UInt32) -> Bool { return _accessor.mutate(distance, index: 4) }\n\n  public func unpack() -> MyGame_Example_Ability {\n    return MyGame_Example_Ability(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_Ability?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_Ability) -> Offset {\n    return builder.create(struct: obj)\n  }\n}\n\npublic struct MyGame_Example_StructOfStructs: NativeStruct, FlatbuffersVectorInitializable, Verifiable, FlatbuffersInitializable, NativeObject {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n\n  private var _a: MyGame_Example_Ability\n  private var _b: MyGame_Example_Test\n  private var _c: MyGame_Example_Ability\n\n  public init(_ bb: ByteBuffer, o: Int32) {\n    self = bb.read(def: Self.self, position: Int(o))\n  }\n\n  public init(a: MyGame_Example_Ability, b: MyGame_Example_Test, c: MyGame_Example_Ability) {\n    _a = a\n    _b = b\n    _c = c\n  }\n\n  public init() {\n    _a = MyGame_Example_Ability()\n    _b = MyGame_Example_Test()\n    _c = MyGame_Example_Ability()\n  }\n\n  public init(_ _t: borrowing MyGame_Example_StructOfStructs_Mutable) {\n    let _va = _t.a\n    _a = _va.unpack()\n    let _vb = _t.b\n    _b = _vb.unpack()\n    let _vc = _t.c\n    _c = _vc.unpack()\n  }\n\n  public var a: MyGame_Example_Ability { _a }\n  public var b: MyGame_Example_Test { _b }\n  public var c: MyGame_Example_Ability { _c }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    try verifier.inBuffer(position: position, of: MyGame_Example_StructOfStructs.self)\n  }\n}\n\nextension MyGame_Example_StructOfStructs: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case a = \"a\"\n    case b = \"b\"\n    case c = \"c\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    try container.encodeIfPresent(a, forKey: .a)\n    try container.encodeIfPresent(b, forKey: .b)\n    try container.encodeIfPresent(c, forKey: .c)\n  }\n}\n\npublic struct MyGame_Example_StructOfStructs_Mutable: FlatBufferStruct, FlatbuffersVectorInitializable {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Struct\n\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }\n\n  public var a: MyGame_Example_Ability_Mutable { return MyGame_Example_Ability_Mutable(_accessor.bb, o: _accessor.position + 0) }\n  public var b: MyGame_Example_Test_Mutable { return MyGame_Example_Test_Mutable(_accessor.bb, o: _accessor.position + 8) }\n  public var c: MyGame_Example_Ability_Mutable { return MyGame_Example_Ability_Mutable(_accessor.bb, o: _accessor.position + 12) }\n\n  public func unpack() -> MyGame_Example_StructOfStructs {\n    return MyGame_Example_StructOfStructs(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_StructOfStructs?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_StructOfStructs) -> Offset {\n    return builder.create(struct: obj)\n  }\n}\n\npublic struct MyGame_Example_StructOfStructsOfStructs: NativeStruct, FlatbuffersVectorInitializable, Verifiable, FlatbuffersInitializable, NativeObject {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n\n  private var _a: MyGame_Example_StructOfStructs\n\n  public init(_ bb: ByteBuffer, o: Int32) {\n    self = bb.read(def: Self.self, position: Int(o))\n  }\n\n  public init(a: MyGame_Example_StructOfStructs) {\n    _a = a\n  }\n\n  public init() {\n    _a = MyGame_Example_StructOfStructs()\n  }\n\n  public init(_ _t: borrowing MyGame_Example_StructOfStructsOfStructs_Mutable) {\n    let _va = _t.a\n    _a = _va.unpack()\n  }\n\n  public var a: MyGame_Example_StructOfStructs { _a }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    try verifier.inBuffer(position: position, of: MyGame_Example_StructOfStructsOfStructs.self)\n  }\n}\n\nextension MyGame_Example_StructOfStructsOfStructs: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case a = \"a\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    try container.encodeIfPresent(a, forKey: .a)\n  }\n}\n\npublic struct MyGame_Example_StructOfStructsOfStructs_Mutable: FlatBufferStruct, FlatbuffersVectorInitializable {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Struct\n\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }\n\n  public var a: MyGame_Example_StructOfStructs_Mutable { return MyGame_Example_StructOfStructs_Mutable(_accessor.bb, o: _accessor.position + 0) }\n\n  public func unpack() -> MyGame_Example_StructOfStructsOfStructs {\n    return MyGame_Example_StructOfStructsOfStructs(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_StructOfStructsOfStructs?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_StructOfStructsOfStructs) -> Offset {\n    return builder.create(struct: obj)\n  }\n}\n\npublic struct MyGame_InParentNamespace: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable, ObjectAPIPacker {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  public static var id: String { \"MONS\" } \n  public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset, prefix: Bool = false) { fbb.finish(offset: end, fileId: MyGame_InParentNamespace.id, addPrefix: prefix) }\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  public static func startInParentNamespace(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 0) }\n  public static func endInParentNamespace(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n\n  public func unpack() -> MyGame_InParentNamespaceT {\n    return MyGame_InParentNamespaceT(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_InParentNamespaceT?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_InParentNamespaceT) -> Offset {\n    let __root = MyGame_InParentNamespace.startInParentNamespace(&builder)\n    return MyGame_InParentNamespace.endInParentNamespace(&builder, start: __root)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    _v.finish()\n  }\n}\n\nextension MyGame_InParentNamespace: Encodable {\n  public func encode(to encoder: Encoder) throws {\n  }\n}\n\npublic class MyGame_InParentNamespaceT: NativeObject {\n\n\n  public init(_ _t: borrowing MyGame_InParentNamespace) {\n  }\n\n  public init() {\n  }\n\n  public func serialize() -> ByteBuffer { return serialize(type: MyGame_InParentNamespace.self) }\n\n}\npublic struct MyGame_Example2_Monster: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable, ObjectAPIPacker {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  public static var id: String { \"MONS\" } \n  public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset, prefix: Bool = false) { fbb.finish(offset: end, fileId: MyGame_Example2_Monster.id, addPrefix: prefix) }\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  public static func startMonster(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 0) }\n  public static func endMonster(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n\n  public func unpack() -> MyGame_Example2_MonsterT {\n    return MyGame_Example2_MonsterT(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example2_MonsterT?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example2_MonsterT) -> Offset {\n    let __root = MyGame_Example2_Monster.startMonster(&builder)\n    return MyGame_Example2_Monster.endMonster(&builder, start: __root)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    _v.finish()\n  }\n}\n\nextension MyGame_Example2_Monster: Encodable {\n  public func encode(to encoder: Encoder) throws {\n  }\n}\n\npublic class MyGame_Example2_MonsterT: NativeObject {\n\n\n  public init(_ _t: borrowing MyGame_Example2_Monster) {\n  }\n\n  public init() {\n  }\n\n  public func serialize() -> ByteBuffer { return serialize(type: MyGame_Example2_Monster.self) }\n\n}\ninternal struct MyGame_Example_TestSimpleTableWithEnum: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable, ObjectAPIPacker {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  internal var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  internal static var id: String { \"MONS\" } \n  internal static func finish(_ fbb: inout FlatBufferBuilder, end: Offset, prefix: Bool = false) { fbb.finish(offset: end, fileId: MyGame_Example_TestSimpleTableWithEnum.id, addPrefix: prefix) }\n  private init(_ t: Table) { _accessor = t }\n  internal init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private struct VT {\n    static let color: VOffset = 4\n  }\n\n  internal var color: MyGame_Example_Color { let o = _accessor.offset(VT.color); return o == 0 ? .green : MyGame_Example_Color(rawValue: _accessor.readBuffer(of: UInt8.self, at: o)) ?? .green }\n  @discardableResult internal func mutate(color: MyGame_Example_Color) -> Bool {let o = _accessor.offset(VT.color);  return _accessor.mutate(color.rawValue, index: o) }\n  internal static func startTestSimpleTableWithEnum(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) }\n  internal static func add(color: MyGame_Example_Color, _ fbb: inout FlatBufferBuilder) { fbb.add(element: color.rawValue, def: 2, at: VT.color) }\n  internal static func endTestSimpleTableWithEnum(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n  internal static func createTestSimpleTableWithEnum(\n    _ fbb: inout FlatBufferBuilder,\n    color: MyGame_Example_Color = .green\n  ) -> Offset {\n    let __start = MyGame_Example_TestSimpleTableWithEnum.startTestSimpleTableWithEnum(&fbb)\n    MyGame_Example_TestSimpleTableWithEnum.add(color: color, &fbb)\n    return MyGame_Example_TestSimpleTableWithEnum.endTestSimpleTableWithEnum(&fbb, start: __start)\n  }\n\n  internal func unpack() -> MyGame_Example_TestSimpleTableWithEnumT {\n    return MyGame_Example_TestSimpleTableWithEnumT(self)\n  }\n  internal static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_TestSimpleTableWithEnumT?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  internal static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_TestSimpleTableWithEnumT) -> Offset {\n    let __root = MyGame_Example_TestSimpleTableWithEnum.startTestSimpleTableWithEnum(&builder)\n    MyGame_Example_TestSimpleTableWithEnum.add(color: obj.color, &builder)\n    return MyGame_Example_TestSimpleTableWithEnum.endTestSimpleTableWithEnum(&builder, start: __root)\n  }\n\n  internal static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    try _v.visit(field: VT.color, fieldName: \"color\", required: false, type: MyGame_Example_Color.self)\n    _v.finish()\n  }\n}\n\nextension MyGame_Example_TestSimpleTableWithEnum: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case color = \"color\"\n  }\n\n  internal func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    if color != .green {\n      try container.encodeIfPresent(color, forKey: .color)\n    }\n  }\n}\n\ninternal class MyGame_Example_TestSimpleTableWithEnumT: NativeObject {\n\n  internal var color: MyGame_Example_Color\n\n  internal init(_ _t: borrowing MyGame_Example_TestSimpleTableWithEnum) {\n    color = _t.color\n  }\n\n  internal init() {\n    color = .green\n  }\n\n  internal func serialize() -> ByteBuffer { return serialize(type: MyGame_Example_TestSimpleTableWithEnum.self) }\n\n}\npublic struct MyGame_Example_Stat: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable, ObjectAPIPacker {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  public static var id: String { \"MONS\" } \n  public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset, prefix: Bool = false) { fbb.finish(offset: end, fileId: MyGame_Example_Stat.id, addPrefix: prefix) }\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private struct VT {\n    static let id: VOffset = 4\n    static let val: VOffset = 6\n    static let count: VOffset = 8\n  }\n\n  public var id: String? { let o = _accessor.offset(VT.id); return o == 0 ? nil : _accessor.string(at: o) }\n  public var idSegmentArray: [UInt8]? { return _accessor.getVector(at: VT.id) }\n  public var val: Int64 { let o = _accessor.offset(VT.val); return o == 0 ? 0 : _accessor.readBuffer(of: Int64.self, at: o) }\n  @discardableResult public func mutate(val: Int64) -> Bool {let o = _accessor.offset(VT.val);  return _accessor.mutate(val, index: o) }\n  public var count: UInt16 { let o = _accessor.offset(VT.count); return o == 0 ? 0 : _accessor.readBuffer(of: UInt16.self, at: o) }\n  @discardableResult public func mutate(count: UInt16) -> Bool {let o = _accessor.offset(VT.count);  return _accessor.mutate(count, index: o) }\n  public static func startStat(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 3) }\n  public static func add(id: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: id, at: VT.id) }\n  public static func add(val: Int64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: val, def: 0, at: VT.val) }\n  public static func add(count: UInt16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: count, def: 0, at: VT.count) }\n  public static func endStat(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n  public static func createStat(\n    _ fbb: inout FlatBufferBuilder,\n    idOffset id: Offset = Offset(),\n    val: Int64 = 0,\n    count: UInt16 = 0\n  ) -> Offset {\n    let __start = MyGame_Example_Stat.startStat(&fbb)\n    MyGame_Example_Stat.add(id: id, &fbb)\n    MyGame_Example_Stat.add(val: val, &fbb)\n    MyGame_Example_Stat.add(count: count, &fbb)\n    return MyGame_Example_Stat.endStat(&fbb, start: __start)\n  }\n  public static func sortVectorOfStat(offsets:[Offset], _ fbb: inout FlatBufferBuilder) -> Offset {\n    var off = offsets\n    off.sort { Table.compare(Table.offset(Int32($1.o), vOffset: 8, fbb: &fbb), Table.offset(Int32($0.o), vOffset: 8, fbb: &fbb), fbb: &fbb) < 0 } \n    return fbb.createVector(ofOffsets: off)\n  }\n  fileprivate static func lookupByKey(vector: Int32, key: UInt16, fbb: ByteBuffer) -> MyGame_Example_Stat? {\n    var span = fbb.read(def: Int32.self, position: Int(vector - 4))\n    var start: Int32 = 0\n    while span != 0 {\n      var middle = span / 2\n      let tableOffset = Table.indirect(vector + 4 * (start + middle), fbb)\n      let comp = fbb.read(def: UInt16.self, position: Int(Table.offset(Int32(fbb.capacity) - tableOffset, vOffset: 8, fbb: fbb)))\n      if comp > 0 {\n        span = middle\n      } else if comp < 0 {\n        middle += 1\n        start += middle\n        span -= middle\n      } else {\n        return MyGame_Example_Stat(fbb, o: tableOffset)\n      }\n    }\n    return nil\n  }\n\n  public func unpack() -> MyGame_Example_StatT {\n    return MyGame_Example_StatT(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_StatT?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_StatT) -> Offset {\n    let __id: Offset\n    if let s = obj.id {\n      __id = builder.create(string: s)\n    } else {\n      __id = Offset()\n    }\n\n    let __root = MyGame_Example_Stat.startStat(&builder)\n    MyGame_Example_Stat.add(id: __id, &builder)\n    MyGame_Example_Stat.add(val: obj.val, &builder)\n    MyGame_Example_Stat.add(count: obj.count, &builder)\n    return MyGame_Example_Stat.endStat(&builder, start: __root)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    try _v.visit(field: VT.id, fieldName: \"id\", required: false, type: ForwardOffset<String>.self)\n    try _v.visit(field: VT.val, fieldName: \"val\", required: false, type: Int64.self)\n    try _v.visit(field: VT.count, fieldName: \"count\", required: false, type: UInt16.self)\n    _v.finish()\n  }\n}\n\nextension MyGame_Example_Stat: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case id = \"id\"\n    case val = \"val\"\n    case count = \"count\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    try container.encodeIfPresent(id, forKey: .id)\n    if val != 0 {\n      try container.encodeIfPresent(val, forKey: .val)\n    }\n    if count != 0 {\n      try container.encodeIfPresent(count, forKey: .count)\n    }\n  }\n}\n\npublic class MyGame_Example_StatT: NativeObject {\n\n  public var id: String?\n  public var val: Int64\n  public var count: UInt16\n\n  public init(_ _t: borrowing MyGame_Example_Stat) {\n    id = _t.id\n    val = _t.val\n    count = _t.count\n  }\n\n  public init() {\n    val = 0\n    count = 0\n  }\n\n  public func serialize() -> ByteBuffer { return serialize(type: MyGame_Example_Stat.self) }\n\n}\npublic struct MyGame_Example_Referrable: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable, ObjectAPIPacker {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  public static var id: String { \"MONS\" } \n  public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset, prefix: Bool = false) { fbb.finish(offset: end, fileId: MyGame_Example_Referrable.id, addPrefix: prefix) }\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private struct VT {\n    static let id: VOffset = 4\n  }\n\n  public var id: UInt64 { let o = _accessor.offset(VT.id); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }\n  @discardableResult public func mutate(id: UInt64) -> Bool {let o = _accessor.offset(VT.id);  return _accessor.mutate(id, index: o) }\n  public static func startReferrable(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) }\n  public static func add(id: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: id, def: 0, at: VT.id) }\n  public static func endReferrable(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n  public static func createReferrable(\n    _ fbb: inout FlatBufferBuilder,\n    id: UInt64 = 0\n  ) -> Offset {\n    let __start = MyGame_Example_Referrable.startReferrable(&fbb)\n    MyGame_Example_Referrable.add(id: id, &fbb)\n    return MyGame_Example_Referrable.endReferrable(&fbb, start: __start)\n  }\n  public static func sortVectorOfReferrable(offsets:[Offset], _ fbb: inout FlatBufferBuilder) -> Offset {\n    var off = offsets\n    off.sort { Table.compare(Table.offset(Int32($1.o), vOffset: 4, fbb: &fbb), Table.offset(Int32($0.o), vOffset: 4, fbb: &fbb), fbb: &fbb) < 0 } \n    return fbb.createVector(ofOffsets: off)\n  }\n  fileprivate static func lookupByKey(vector: Int32, key: UInt64, fbb: ByteBuffer) -> MyGame_Example_Referrable? {\n    var span = fbb.read(def: Int32.self, position: Int(vector - 4))\n    var start: Int32 = 0\n    while span != 0 {\n      var middle = span / 2\n      let tableOffset = Table.indirect(vector + 4 * (start + middle), fbb)\n      let comp = fbb.read(def: UInt64.self, position: Int(Table.offset(Int32(fbb.capacity) - tableOffset, vOffset: 4, fbb: fbb)))\n      if comp > 0 {\n        span = middle\n      } else if comp < 0 {\n        middle += 1\n        start += middle\n        span -= middle\n      } else {\n        return MyGame_Example_Referrable(fbb, o: tableOffset)\n      }\n    }\n    return nil\n  }\n\n  public func unpack() -> MyGame_Example_ReferrableT {\n    return MyGame_Example_ReferrableT(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_ReferrableT?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_ReferrableT) -> Offset {\n    let __root = MyGame_Example_Referrable.startReferrable(&builder)\n    MyGame_Example_Referrable.add(id: obj.id, &builder)\n    return MyGame_Example_Referrable.endReferrable(&builder, start: __root)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    try _v.visit(field: VT.id, fieldName: \"id\", required: false, type: UInt64.self)\n    _v.finish()\n  }\n}\n\nextension MyGame_Example_Referrable: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case id = \"id\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    if id != 0 {\n      try container.encodeIfPresent(id, forKey: .id)\n    }\n  }\n}\n\npublic class MyGame_Example_ReferrableT: NativeObject {\n\n  public var id: UInt64\n\n  public init(_ _t: borrowing MyGame_Example_Referrable) {\n    id = _t.id\n  }\n\n  public init() {\n    id = 0\n  }\n\n  public func serialize() -> ByteBuffer { return serialize(type: MyGame_Example_Referrable.self) }\n\n}\n///  an example documentation comment: \"monster object\"\npublic struct MyGame_Example_Monster: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable, ObjectAPIPacker {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  public static var id: String { \"MONS\" } \n  public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset, prefix: Bool = false) { fbb.finish(offset: end, fileId: MyGame_Example_Monster.id, addPrefix: prefix) }\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private struct VT {\n    static let pos: VOffset = 4\n    static let mana: VOffset = 6\n    static let hp: VOffset = 8\n    static let name: VOffset = 10\n    static let inventory: VOffset = 14\n    static let color: VOffset = 16\n    static let testType: VOffset = 18\n    static let test: VOffset = 20\n    static let test4: VOffset = 22\n    static let testarrayofstring: VOffset = 24\n    static let testarrayoftables: VOffset = 26\n    static let enemy: VOffset = 28\n    static let testnestedflatbuffer: VOffset = 30\n    static let testempty: VOffset = 32\n    static let testbool: VOffset = 34\n    static let testhashs32Fnv1: VOffset = 36\n    static let testhashu32Fnv1: VOffset = 38\n    static let testhashs64Fnv1: VOffset = 40\n    static let testhashu64Fnv1: VOffset = 42\n    static let testhashs32Fnv1a: VOffset = 44\n    static let testhashu32Fnv1a: VOffset = 46\n    static let testhashs64Fnv1a: VOffset = 48\n    static let testhashu64Fnv1a: VOffset = 50\n    static let testarrayofbools: VOffset = 52\n    static let testf: VOffset = 54\n    static let testf2: VOffset = 56\n    static let testf3: VOffset = 58\n    static let testarrayofstring2: VOffset = 60\n    static let testarrayofsortedstruct: VOffset = 62\n    static let flex: VOffset = 64\n    static let test5: VOffset = 66\n    static let vectorOfLongs: VOffset = 68\n    static let vectorOfDoubles: VOffset = 70\n    static let parentNamespaceTest: VOffset = 72\n    static let vectorOfReferrables: VOffset = 74\n    static let singleWeakReference: VOffset = 76\n    static let vectorOfWeakReferences: VOffset = 78\n    static let vectorOfStrongReferrables: VOffset = 80\n    static let coOwningReference: VOffset = 82\n    static let vectorOfCoOwningReferences: VOffset = 84\n    static let nonOwningReference: VOffset = 86\n    static let vectorOfNonOwningReferences: VOffset = 88\n    static let anyUniqueType: VOffset = 90\n    static let anyUnique: VOffset = 92\n    static let anyAmbiguousType: VOffset = 94\n    static let anyAmbiguous: VOffset = 96\n    static let vectorOfEnums: VOffset = 98\n    static let signedEnum: VOffset = 100\n    static let testrequirednestedflatbuffer: VOffset = 102\n    static let scalarKeySortedTables: VOffset = 104\n    static let nativeInline: VOffset = 106\n    static let longEnumNonEnumDefault: VOffset = 108\n    static let longEnumNormalDefault: VOffset = 110\n    static let nanDefault: VOffset = 112\n    static let infDefault: VOffset = 114\n    static let positiveInfDefault: VOffset = 116\n    static let infinityDefault: VOffset = 118\n    static let positiveInfinityDefault: VOffset = 120\n    static let negativeInfDefault: VOffset = 122\n    static let negativeInfinityDefault: VOffset = 124\n    static let doubleInfDefault: VOffset = 126\n  }\n\n  public var pos: MyGame_Example_Vec3? { let o = _accessor.offset(VT.pos); return o == 0 ? nil : _accessor.readBuffer(of: MyGame_Example_Vec3.self, at: o) }\n  public var mutablePos: MyGame_Example_Vec3_Mutable? { let o = _accessor.offset(VT.pos); return o == 0 ? nil : MyGame_Example_Vec3_Mutable(_accessor.bb, o: o + _accessor.position) }\n  public var mana: Int16 { let o = _accessor.offset(VT.mana); return o == 0 ? 150 : _accessor.readBuffer(of: Int16.self, at: o) }\n  @discardableResult public func mutate(mana: Int16) -> Bool {let o = _accessor.offset(VT.mana);  return _accessor.mutate(mana, index: o) }\n  public var hp: Int16 { let o = _accessor.offset(VT.hp); return o == 0 ? 100 : _accessor.readBuffer(of: Int16.self, at: o) }\n  @discardableResult public func mutate(hp: Int16) -> Bool {let o = _accessor.offset(VT.hp);  return _accessor.mutate(hp, index: o) }\n  public var name: String! { let o = _accessor.offset(VT.name); return _accessor.string(at: o) }\n  public var nameSegmentArray: [UInt8]! { return _accessor.getVector(at: VT.name) }\n  public var inventory: FlatbufferVector<UInt8> { return _accessor.vector(at: VT.inventory, byteSize: 1) }\n  public func mutate(inventory: UInt8, at index: Int32) -> Bool { let o = _accessor.offset(VT.inventory); return _accessor.directMutate(inventory, index: _accessor.vector(at: o) + index * 1) }\n  public func withUnsafePointerToInventory<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.inventory, body: body) }\n  public var color: MyGame_Example_Color { let o = _accessor.offset(VT.color); return o == 0 ? .blue : MyGame_Example_Color(rawValue: _accessor.readBuffer(of: UInt8.self, at: o)) ?? .blue }\n  @discardableResult public func mutate(color: MyGame_Example_Color) -> Bool {let o = _accessor.offset(VT.color);  return _accessor.mutate(color.rawValue, index: o) }\n  public var testType: MyGame_Example_Any_ { let o = _accessor.offset(VT.testType); return o == 0 ? .none_ : MyGame_Example_Any_(rawValue: _accessor.readBuffer(of: UInt8.self, at: o)) ?? .none_ }\n  public func test<T: FlatbuffersInitializable>(type: T.Type) -> T? { let o = _accessor.offset(VT.test); return o == 0 ? nil : _accessor.union(o) }\n  public var test4: FlatbufferVector<MyGame_Example_Test> { return _accessor.vector(at: VT.test4, byteSize: 4) }\n  public var mutableTest4: FlatbufferVector<MyGame_Example_Test_Mutable> { return _accessor.vector(at: VT.test4, byteSize: 4) }\n  public func withUnsafePointerToTest4<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.test4, body: body) }\n  public var testarrayofstring: FlatbufferVector<String?> { return _accessor.vector(at: VT.testarrayofstring, byteSize: 4) }\n  ///  an example documentation comment: this will end up in the generated code\n  ///  multiline too\n  public var testarrayoftables: FlatbufferVector<MyGame_Example_Monster> { return _accessor.vector(at: VT.testarrayoftables, byteSize: 4) }\n  public func testarrayoftablesBy(key: String) -> MyGame_Example_Monster? { let o = _accessor.offset(VT.testarrayoftables); return o == 0 ? nil : MyGame_Example_Monster.lookupByKey(vector: _accessor.vector(at: o), key: key, fbb: _accessor.bb) }\n  public var enemy: MyGame_Example_Monster? { let o = _accessor.offset(VT.enemy); return o == 0 ? nil : MyGame_Example_Monster(_accessor.bb, o: _accessor.indirect(o + _accessor.position)) }\n  public var testnestedflatbuffer: FlatbufferVector<UInt8> { return _accessor.vector(at: VT.testnestedflatbuffer, byteSize: 1) }\n  public func mutate(testnestedflatbuffer: UInt8, at index: Int32) -> Bool { let o = _accessor.offset(VT.testnestedflatbuffer); return _accessor.directMutate(testnestedflatbuffer, index: _accessor.vector(at: o) + index * 1) }\n  public func withUnsafePointerToTestnestedflatbuffer<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.testnestedflatbuffer, body: body) }\n  public var testempty: MyGame_Example_Stat? { let o = _accessor.offset(VT.testempty); return o == 0 ? nil : MyGame_Example_Stat(_accessor.bb, o: _accessor.indirect(o + _accessor.position)) }\n  public var testbool: Bool { let o = _accessor.offset(VT.testbool); return o == 0 ? false : _accessor.readBuffer(of: Bool.self, at: o) }\n  @discardableResult public func mutate(testbool: Bool) -> Bool {let o = _accessor.offset(VT.testbool);  return _accessor.mutate(testbool, index: o) }\n  public var testhashs32Fnv1: Int32 { let o = _accessor.offset(VT.testhashs32Fnv1); return o == 0 ? 0 : _accessor.readBuffer(of: Int32.self, at: o) }\n  @discardableResult public func mutate(testhashs32Fnv1: Int32) -> Bool {let o = _accessor.offset(VT.testhashs32Fnv1);  return _accessor.mutate(testhashs32Fnv1, index: o) }\n  public var testhashu32Fnv1: UInt32 { let o = _accessor.offset(VT.testhashu32Fnv1); return o == 0 ? 0 : _accessor.readBuffer(of: UInt32.self, at: o) }\n  @discardableResult public func mutate(testhashu32Fnv1: UInt32) -> Bool {let o = _accessor.offset(VT.testhashu32Fnv1);  return _accessor.mutate(testhashu32Fnv1, index: o) }\n  public var testhashs64Fnv1: Int64 { let o = _accessor.offset(VT.testhashs64Fnv1); return o == 0 ? 0 : _accessor.readBuffer(of: Int64.self, at: o) }\n  @discardableResult public func mutate(testhashs64Fnv1: Int64) -> Bool {let o = _accessor.offset(VT.testhashs64Fnv1);  return _accessor.mutate(testhashs64Fnv1, index: o) }\n  public var testhashu64Fnv1: UInt64 { let o = _accessor.offset(VT.testhashu64Fnv1); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }\n  @discardableResult public func mutate(testhashu64Fnv1: UInt64) -> Bool {let o = _accessor.offset(VT.testhashu64Fnv1);  return _accessor.mutate(testhashu64Fnv1, index: o) }\n  public var testhashs32Fnv1a: Int32 { let o = _accessor.offset(VT.testhashs32Fnv1a); return o == 0 ? 0 : _accessor.readBuffer(of: Int32.self, at: o) }\n  @discardableResult public func mutate(testhashs32Fnv1a: Int32) -> Bool {let o = _accessor.offset(VT.testhashs32Fnv1a);  return _accessor.mutate(testhashs32Fnv1a, index: o) }\n  public var testhashu32Fnv1a: UInt32 { let o = _accessor.offset(VT.testhashu32Fnv1a); return o == 0 ? 0 : _accessor.readBuffer(of: UInt32.self, at: o) }\n  @discardableResult public func mutate(testhashu32Fnv1a: UInt32) -> Bool {let o = _accessor.offset(VT.testhashu32Fnv1a);  return _accessor.mutate(testhashu32Fnv1a, index: o) }\n  public var testhashs64Fnv1a: Int64 { let o = _accessor.offset(VT.testhashs64Fnv1a); return o == 0 ? 0 : _accessor.readBuffer(of: Int64.self, at: o) }\n  @discardableResult public func mutate(testhashs64Fnv1a: Int64) -> Bool {let o = _accessor.offset(VT.testhashs64Fnv1a);  return _accessor.mutate(testhashs64Fnv1a, index: o) }\n  public var testhashu64Fnv1a: UInt64 { let o = _accessor.offset(VT.testhashu64Fnv1a); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }\n  @discardableResult public func mutate(testhashu64Fnv1a: UInt64) -> Bool {let o = _accessor.offset(VT.testhashu64Fnv1a);  return _accessor.mutate(testhashu64Fnv1a, index: o) }\n  public var testarrayofbools: FlatbufferVector<Bool> { return _accessor.vector(at: VT.testarrayofbools, byteSize: 1) }\n  public func mutate(testarrayofbools: Bool, at index: Int32) -> Bool { let o = _accessor.offset(VT.testarrayofbools); return _accessor.directMutate(testarrayofbools, index: _accessor.vector(at: o) + index * 1) }\n  public func withUnsafePointerToTestarrayofbools<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.testarrayofbools, body: body) }\n  public var testf: Float32 { let o = _accessor.offset(VT.testf); return o == 0 ? 3.14159 : _accessor.readBuffer(of: Float32.self, at: o) }\n  @discardableResult public func mutate(testf: Float32) -> Bool {let o = _accessor.offset(VT.testf);  return _accessor.mutate(testf, index: o) }\n  public var testf2: Float32 { let o = _accessor.offset(VT.testf2); return o == 0 ? 3.0 : _accessor.readBuffer(of: Float32.self, at: o) }\n  @discardableResult public func mutate(testf2: Float32) -> Bool {let o = _accessor.offset(VT.testf2);  return _accessor.mutate(testf2, index: o) }\n  public var testf3: Float32 { let o = _accessor.offset(VT.testf3); return o == 0 ? 0.0 : _accessor.readBuffer(of: Float32.self, at: o) }\n  @discardableResult public func mutate(testf3: Float32) -> Bool {let o = _accessor.offset(VT.testf3);  return _accessor.mutate(testf3, index: o) }\n  public var testarrayofstring2: FlatbufferVector<String?> { return _accessor.vector(at: VT.testarrayofstring2, byteSize: 4) }\n  public var testarrayofsortedstruct: FlatbufferVector<MyGame_Example_Ability> { return _accessor.vector(at: VT.testarrayofsortedstruct, byteSize: 8) }\n  public var mutableTestarrayofsortedstruct: FlatbufferVector<MyGame_Example_Ability_Mutable> { return _accessor.vector(at: VT.testarrayofsortedstruct, byteSize: 8) }\n  public func withUnsafePointerToTestarrayofsortedstruct<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.testarrayofsortedstruct, body: body) }\n  public var flex: FlatbufferVector<UInt8> { return _accessor.vector(at: VT.flex, byteSize: 1) }\n  public func mutate(flex: UInt8, at index: Int32) -> Bool { let o = _accessor.offset(VT.flex); return _accessor.directMutate(flex, index: _accessor.vector(at: o) + index * 1) }\n  public func withUnsafePointerToFlex<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.flex, body: body) }\n  public var test5: FlatbufferVector<MyGame_Example_Test> { return _accessor.vector(at: VT.test5, byteSize: 4) }\n  public var mutableTest5: FlatbufferVector<MyGame_Example_Test_Mutable> { return _accessor.vector(at: VT.test5, byteSize: 4) }\n  public func withUnsafePointerToTest5<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.test5, body: body) }\n  public var vectorOfLongs: FlatbufferVector<Int64> { return _accessor.vector(at: VT.vectorOfLongs, byteSize: 8) }\n  public func mutate(vectorOfLongs: Int64, at index: Int32) -> Bool { let o = _accessor.offset(VT.vectorOfLongs); return _accessor.directMutate(vectorOfLongs, index: _accessor.vector(at: o) + index * 8) }\n  public func withUnsafePointerToVectorOfLongs<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.vectorOfLongs, body: body) }\n  public var vectorOfDoubles: FlatbufferVector<Double> { return _accessor.vector(at: VT.vectorOfDoubles, byteSize: 8) }\n  public func mutate(vectorOfDoubles: Double, at index: Int32) -> Bool { let o = _accessor.offset(VT.vectorOfDoubles); return _accessor.directMutate(vectorOfDoubles, index: _accessor.vector(at: o) + index * 8) }\n  public func withUnsafePointerToVectorOfDoubles<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.vectorOfDoubles, body: body) }\n  public var parentNamespaceTest: MyGame_InParentNamespace? { let o = _accessor.offset(VT.parentNamespaceTest); return o == 0 ? nil : MyGame_InParentNamespace(_accessor.bb, o: _accessor.indirect(o + _accessor.position)) }\n  public var vectorOfReferrables: FlatbufferVector<MyGame_Example_Referrable> { return _accessor.vector(at: VT.vectorOfReferrables, byteSize: 4) }\n  public func vectorOfReferrablesBy(key: UInt64) -> MyGame_Example_Referrable? { let o = _accessor.offset(VT.vectorOfReferrables); return o == 0 ? nil : MyGame_Example_Referrable.lookupByKey(vector: _accessor.vector(at: o), key: key, fbb: _accessor.bb) }\n  public var singleWeakReference: UInt64 { let o = _accessor.offset(VT.singleWeakReference); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }\n  @discardableResult public func mutate(singleWeakReference: UInt64) -> Bool {let o = _accessor.offset(VT.singleWeakReference);  return _accessor.mutate(singleWeakReference, index: o) }\n  public var vectorOfWeakReferences: FlatbufferVector<UInt64> { return _accessor.vector(at: VT.vectorOfWeakReferences, byteSize: 8) }\n  public func mutate(vectorOfWeakReferences: UInt64, at index: Int32) -> Bool { let o = _accessor.offset(VT.vectorOfWeakReferences); return _accessor.directMutate(vectorOfWeakReferences, index: _accessor.vector(at: o) + index * 8) }\n  public func withUnsafePointerToVectorOfWeakReferences<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.vectorOfWeakReferences, body: body) }\n  public var vectorOfStrongReferrables: FlatbufferVector<MyGame_Example_Referrable> { return _accessor.vector(at: VT.vectorOfStrongReferrables, byteSize: 4) }\n  public func vectorOfStrongReferrablesBy(key: UInt64) -> MyGame_Example_Referrable? { let o = _accessor.offset(VT.vectorOfStrongReferrables); return o == 0 ? nil : MyGame_Example_Referrable.lookupByKey(vector: _accessor.vector(at: o), key: key, fbb: _accessor.bb) }\n  public var coOwningReference: UInt64 { let o = _accessor.offset(VT.coOwningReference); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }\n  @discardableResult public func mutate(coOwningReference: UInt64) -> Bool {let o = _accessor.offset(VT.coOwningReference);  return _accessor.mutate(coOwningReference, index: o) }\n  public var vectorOfCoOwningReferences: FlatbufferVector<UInt64> { return _accessor.vector(at: VT.vectorOfCoOwningReferences, byteSize: 8) }\n  public func mutate(vectorOfCoOwningReferences: UInt64, at index: Int32) -> Bool { let o = _accessor.offset(VT.vectorOfCoOwningReferences); return _accessor.directMutate(vectorOfCoOwningReferences, index: _accessor.vector(at: o) + index * 8) }\n  public func withUnsafePointerToVectorOfCoOwningReferences<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.vectorOfCoOwningReferences, body: body) }\n  public var nonOwningReference: UInt64 { let o = _accessor.offset(VT.nonOwningReference); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }\n  @discardableResult public func mutate(nonOwningReference: UInt64) -> Bool {let o = _accessor.offset(VT.nonOwningReference);  return _accessor.mutate(nonOwningReference, index: o) }\n  public var vectorOfNonOwningReferences: FlatbufferVector<UInt64> { return _accessor.vector(at: VT.vectorOfNonOwningReferences, byteSize: 8) }\n  public func mutate(vectorOfNonOwningReferences: UInt64, at index: Int32) -> Bool { let o = _accessor.offset(VT.vectorOfNonOwningReferences); return _accessor.directMutate(vectorOfNonOwningReferences, index: _accessor.vector(at: o) + index * 8) }\n  public func withUnsafePointerToVectorOfNonOwningReferences<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.vectorOfNonOwningReferences, body: body) }\n  public var anyUniqueType: MyGame_Example_AnyUniqueAliases { let o = _accessor.offset(VT.anyUniqueType); return o == 0 ? .none_ : MyGame_Example_AnyUniqueAliases(rawValue: _accessor.readBuffer(of: UInt8.self, at: o)) ?? .none_ }\n  public func anyUnique<T: FlatbuffersInitializable>(type: T.Type) -> T? { let o = _accessor.offset(VT.anyUnique); return o == 0 ? nil : _accessor.union(o) }\n  public var anyAmbiguousType: MyGame_Example_AnyAmbiguousAliases { let o = _accessor.offset(VT.anyAmbiguousType); return o == 0 ? .none_ : MyGame_Example_AnyAmbiguousAliases(rawValue: _accessor.readBuffer(of: UInt8.self, at: o)) ?? .none_ }\n  public func anyAmbiguous<T: FlatbuffersInitializable>(type: T.Type) -> T? { let o = _accessor.offset(VT.anyAmbiguous); return o == 0 ? nil : _accessor.union(o) }\n  public var vectorOfEnums: FlatbufferVector<MyGame_Example_Color> { return _accessor.vector(at: VT.vectorOfEnums, byteSize: 1) }\n  public var signedEnum: MyGame_Example_Race { let o = _accessor.offset(VT.signedEnum); return o == 0 ? .none_ : MyGame_Example_Race(rawValue: _accessor.readBuffer(of: Int8.self, at: o)) ?? .none_ }\n  @discardableResult public func mutate(signedEnum: MyGame_Example_Race) -> Bool {let o = _accessor.offset(VT.signedEnum);  return _accessor.mutate(signedEnum.rawValue, index: o) }\n  public var testrequirednestedflatbuffer: FlatbufferVector<UInt8> { return _accessor.vector(at: VT.testrequirednestedflatbuffer, byteSize: 1) }\n  public func mutate(testrequirednestedflatbuffer: UInt8, at index: Int32) -> Bool { let o = _accessor.offset(VT.testrequirednestedflatbuffer); return _accessor.directMutate(testrequirednestedflatbuffer, index: _accessor.vector(at: o) + index * 1) }\n  public func withUnsafePointerToTestrequirednestedflatbuffer<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.testrequirednestedflatbuffer, body: body) }\n  public var scalarKeySortedTables: FlatbufferVector<MyGame_Example_Stat> { return _accessor.vector(at: VT.scalarKeySortedTables, byteSize: 4) }\n  public func scalarKeySortedTablesBy(key: UInt16) -> MyGame_Example_Stat? { let o = _accessor.offset(VT.scalarKeySortedTables); return o == 0 ? nil : MyGame_Example_Stat.lookupByKey(vector: _accessor.vector(at: o), key: key, fbb: _accessor.bb) }\n  public var nativeInline: MyGame_Example_Test? { let o = _accessor.offset(VT.nativeInline); return o == 0 ? nil : _accessor.readBuffer(of: MyGame_Example_Test.self, at: o) }\n  public var mutableNativeInline: MyGame_Example_Test_Mutable? { let o = _accessor.offset(VT.nativeInline); return o == 0 ? nil : MyGame_Example_Test_Mutable(_accessor.bb, o: o + _accessor.position) }\n  public var longEnumNonEnumDefault: MyGame_Example_LongEnum { let o = _accessor.offset(VT.longEnumNonEnumDefault); return o == 0 ? .longone : MyGame_Example_LongEnum(rawValue: _accessor.readBuffer(of: UInt64.self, at: o)) ?? .longone }\n  @discardableResult public func mutate(longEnumNonEnumDefault: MyGame_Example_LongEnum) -> Bool {let o = _accessor.offset(VT.longEnumNonEnumDefault);  return _accessor.mutate(longEnumNonEnumDefault.rawValue, index: o) }\n  public var longEnumNormalDefault: MyGame_Example_LongEnum { let o = _accessor.offset(VT.longEnumNormalDefault); return o == 0 ? .longone : MyGame_Example_LongEnum(rawValue: _accessor.readBuffer(of: UInt64.self, at: o)) ?? .longone }\n  @discardableResult public func mutate(longEnumNormalDefault: MyGame_Example_LongEnum) -> Bool {let o = _accessor.offset(VT.longEnumNormalDefault);  return _accessor.mutate(longEnumNormalDefault.rawValue, index: o) }\n  public var nanDefault: Float32 { let o = _accessor.offset(VT.nanDefault); return o == 0 ? .nan : _accessor.readBuffer(of: Float32.self, at: o) }\n  @discardableResult public func mutate(nanDefault: Float32) -> Bool {let o = _accessor.offset(VT.nanDefault);  return _accessor.mutate(nanDefault, index: o) }\n  public var infDefault: Float32 { let o = _accessor.offset(VT.infDefault); return o == 0 ? .infinity : _accessor.readBuffer(of: Float32.self, at: o) }\n  @discardableResult public func mutate(infDefault: Float32) -> Bool {let o = _accessor.offset(VT.infDefault);  return _accessor.mutate(infDefault, index: o) }\n  public var positiveInfDefault: Float32 { let o = _accessor.offset(VT.positiveInfDefault); return o == 0 ? .infinity : _accessor.readBuffer(of: Float32.self, at: o) }\n  @discardableResult public func mutate(positiveInfDefault: Float32) -> Bool {let o = _accessor.offset(VT.positiveInfDefault);  return _accessor.mutate(positiveInfDefault, index: o) }\n  public var infinityDefault: Float32 { let o = _accessor.offset(VT.infinityDefault); return o == 0 ? .infinity : _accessor.readBuffer(of: Float32.self, at: o) }\n  @discardableResult public func mutate(infinityDefault: Float32) -> Bool {let o = _accessor.offset(VT.infinityDefault);  return _accessor.mutate(infinityDefault, index: o) }\n  public var positiveInfinityDefault: Float32 { let o = _accessor.offset(VT.positiveInfinityDefault); return o == 0 ? .infinity : _accessor.readBuffer(of: Float32.self, at: o) }\n  @discardableResult public func mutate(positiveInfinityDefault: Float32) -> Bool {let o = _accessor.offset(VT.positiveInfinityDefault);  return _accessor.mutate(positiveInfinityDefault, index: o) }\n  public var negativeInfDefault: Float32 { let o = _accessor.offset(VT.negativeInfDefault); return o == 0 ? -.infinity : _accessor.readBuffer(of: Float32.self, at: o) }\n  @discardableResult public func mutate(negativeInfDefault: Float32) -> Bool {let o = _accessor.offset(VT.negativeInfDefault);  return _accessor.mutate(negativeInfDefault, index: o) }\n  public var negativeInfinityDefault: Float32 { let o = _accessor.offset(VT.negativeInfinityDefault); return o == 0 ? -.infinity : _accessor.readBuffer(of: Float32.self, at: o) }\n  @discardableResult public func mutate(negativeInfinityDefault: Float32) -> Bool {let o = _accessor.offset(VT.negativeInfinityDefault);  return _accessor.mutate(negativeInfinityDefault, index: o) }\n  public var doubleInfDefault: Double { let o = _accessor.offset(VT.doubleInfDefault); return o == 0 ? .infinity : _accessor.readBuffer(of: Double.self, at: o) }\n  @discardableResult public func mutate(doubleInfDefault: Double) -> Bool {let o = _accessor.offset(VT.doubleInfDefault);  return _accessor.mutate(doubleInfDefault, index: o) }\n  public static func startMonster(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 62) }\n  public static func add(pos: MyGame_Example_Vec3?, _ fbb: inout FlatBufferBuilder) { guard let pos = pos else { return }; fbb.create(struct: pos, position: VT.pos) }\n  public static func add(mana: Int16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: mana, def: 150, at: VT.mana) }\n  public static func add(hp: Int16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: hp, def: 100, at: VT.hp) }\n  public static func add(name: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: name, at: VT.name) }\n  public static func addVectorOf(inventory: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: inventory, at: VT.inventory) }\n  public static func add(color: MyGame_Example_Color, _ fbb: inout FlatBufferBuilder) { fbb.add(element: color.rawValue, def: 8, at: VT.color) }\n  public static func add(testType: MyGame_Example_Any_, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testType.rawValue, def: 0, at: VT.testType) }\n  public static func add(test: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: test, at: VT.test) }\n  public static func addVectorOf(test4: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: test4, at: VT.test4) }\n  public static func startVectorOfTest4(_ size: Int, in builder: inout FlatBufferBuilder) {\n    builder.startVector(size * MemoryLayout<MyGame_Example_Test>.size, elementSize: MemoryLayout<MyGame_Example_Test>.alignment)\n  }\n  public static func addVectorOf(testarrayofstring: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testarrayofstring, at: VT.testarrayofstring) }\n  public static func addVectorOf(testarrayoftables: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testarrayoftables, at: VT.testarrayoftables) }\n  public static func add(enemy: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: enemy, at: VT.enemy) }\n  public static func addVectorOf(testnestedflatbuffer: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testnestedflatbuffer, at: VT.testnestedflatbuffer) }\n  public static func add(testempty: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testempty, at: VT.testempty) }\n  public static func add(testbool: Bool, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testbool, def: false,\n   at: VT.testbool) }\n  public static func add(testhashs32Fnv1: Int32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashs32Fnv1, def: 0, at: VT.testhashs32Fnv1) }\n  public static func add(testhashu32Fnv1: UInt32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashu32Fnv1, def: 0, at: VT.testhashu32Fnv1) }\n  public static func add(testhashs64Fnv1: Int64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashs64Fnv1, def: 0, at: VT.testhashs64Fnv1) }\n  public static func add(testhashu64Fnv1: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashu64Fnv1, def: 0, at: VT.testhashu64Fnv1) }\n  public static func add(testhashs32Fnv1a: Int32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashs32Fnv1a, def: 0, at: VT.testhashs32Fnv1a) }\n  public static func add(testhashu32Fnv1a: UInt32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashu32Fnv1a, def: 0, at: VT.testhashu32Fnv1a) }\n  public static func add(testhashs64Fnv1a: Int64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashs64Fnv1a, def: 0, at: VT.testhashs64Fnv1a) }\n  public static func add(testhashu64Fnv1a: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashu64Fnv1a, def: 0, at: VT.testhashu64Fnv1a) }\n  public static func addVectorOf(testarrayofbools: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testarrayofbools, at: VT.testarrayofbools) }\n  public static func add(testf: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testf, def: 3.14159, at: VT.testf) }\n  public static func add(testf2: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testf2, def: 3.0, at: VT.testf2) }\n  public static func add(testf3: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testf3, def: 0.0, at: VT.testf3) }\n  public static func addVectorOf(testarrayofstring2: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testarrayofstring2, at: VT.testarrayofstring2) }\n  public static func addVectorOf(testarrayofsortedstruct: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testarrayofsortedstruct, at: VT.testarrayofsortedstruct) }\n  public static func startVectorOfTestarrayofsortedstruct(_ size: Int, in builder: inout FlatBufferBuilder) {\n    builder.startVector(size * MemoryLayout<MyGame_Example_Ability>.size, elementSize: MemoryLayout<MyGame_Example_Ability>.alignment)\n  }\n  public static func addVectorOf(flex: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: flex, at: VT.flex) }\n  public static func addVectorOf(test5: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: test5, at: VT.test5) }\n  public static func startVectorOfTest5(_ size: Int, in builder: inout FlatBufferBuilder) {\n    builder.startVector(size * MemoryLayout<MyGame_Example_Test>.size, elementSize: MemoryLayout<MyGame_Example_Test>.alignment)\n  }\n  public static func addVectorOf(vectorOfLongs: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfLongs, at: VT.vectorOfLongs) }\n  public static func addVectorOf(vectorOfDoubles: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfDoubles, at: VT.vectorOfDoubles) }\n  public static func add(parentNamespaceTest: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: parentNamespaceTest, at: VT.parentNamespaceTest) }\n  public static func addVectorOf(vectorOfReferrables: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfReferrables, at: VT.vectorOfReferrables) }\n  public static func add(singleWeakReference: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: singleWeakReference, def: 0, at: VT.singleWeakReference) }\n  public static func addVectorOf(vectorOfWeakReferences: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfWeakReferences, at: VT.vectorOfWeakReferences) }\n  public static func addVectorOf(vectorOfStrongReferrables: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfStrongReferrables, at: VT.vectorOfStrongReferrables) }\n  public static func add(coOwningReference: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: coOwningReference, def: 0, at: VT.coOwningReference) }\n  public static func addVectorOf(vectorOfCoOwningReferences: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfCoOwningReferences, at: VT.vectorOfCoOwningReferences) }\n  public static func add(nonOwningReference: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: nonOwningReference, def: 0, at: VT.nonOwningReference) }\n  public static func addVectorOf(vectorOfNonOwningReferences: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfNonOwningReferences, at: VT.vectorOfNonOwningReferences) }\n  public static func add(anyUniqueType: MyGame_Example_AnyUniqueAliases, _ fbb: inout FlatBufferBuilder) { fbb.add(element: anyUniqueType.rawValue, def: 0, at: VT.anyUniqueType) }\n  public static func add(anyUnique: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: anyUnique, at: VT.anyUnique) }\n  public static func add(anyAmbiguousType: MyGame_Example_AnyAmbiguousAliases, _ fbb: inout FlatBufferBuilder) { fbb.add(element: anyAmbiguousType.rawValue, def: 0, at: VT.anyAmbiguousType) }\n  public static func add(anyAmbiguous: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: anyAmbiguous, at: VT.anyAmbiguous) }\n  public static func addVectorOf(vectorOfEnums: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfEnums, at: VT.vectorOfEnums) }\n  public static func add(signedEnum: MyGame_Example_Race, _ fbb: inout FlatBufferBuilder) { fbb.add(element: signedEnum.rawValue, def: -1, at: VT.signedEnum) }\n  public static func addVectorOf(testrequirednestedflatbuffer: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testrequirednestedflatbuffer, at: VT.testrequirednestedflatbuffer) }\n  public static func addVectorOf(scalarKeySortedTables: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: scalarKeySortedTables, at: VT.scalarKeySortedTables) }\n  public static func add(nativeInline: MyGame_Example_Test?, _ fbb: inout FlatBufferBuilder) { guard let nativeInline = nativeInline else { return }; fbb.create(struct: nativeInline, position: VT.nativeInline) }\n  public static func add(longEnumNonEnumDefault: MyGame_Example_LongEnum, _ fbb: inout FlatBufferBuilder) { fbb.add(element: longEnumNonEnumDefault.rawValue, def: 0, at: VT.longEnumNonEnumDefault) }\n  public static func add(longEnumNormalDefault: MyGame_Example_LongEnum, _ fbb: inout FlatBufferBuilder) { fbb.add(element: longEnumNormalDefault.rawValue, def: 2, at: VT.longEnumNormalDefault) }\n  public static func add(nanDefault: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: nanDefault, def: .nan, at: VT.nanDefault) }\n  public static func add(infDefault: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: infDefault, def: .infinity, at: VT.infDefault) }\n  public static func add(positiveInfDefault: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: positiveInfDefault, def: .infinity, at: VT.positiveInfDefault) }\n  public static func add(infinityDefault: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: infinityDefault, def: .infinity, at: VT.infinityDefault) }\n  public static func add(positiveInfinityDefault: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: positiveInfinityDefault, def: .infinity, at: VT.positiveInfinityDefault) }\n  public static func add(negativeInfDefault: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: negativeInfDefault, def: -.infinity, at: VT.negativeInfDefault) }\n  public static func add(negativeInfinityDefault: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: negativeInfinityDefault, def: -.infinity, at: VT.negativeInfinityDefault) }\n  public static func add(doubleInfDefault: Double, _ fbb: inout FlatBufferBuilder) { fbb.add(element: doubleInfDefault, def: .infinity, at: VT.doubleInfDefault) }\n  public static func endMonster(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); fbb.require(table: end, fields: [10]); return end }\n  public static func createMonster(\n    _ fbb: inout FlatBufferBuilder,\n    pos: MyGame_Example_Vec3? = nil,\n    mana: Int16 = 150,\n    hp: Int16 = 100,\n    nameOffset name: Offset,\n    inventoryVectorOffset inventory: Offset = Offset(),\n    color: MyGame_Example_Color = .blue,\n    testType: MyGame_Example_Any_ = .none_,\n    testOffset test: Offset = Offset(),\n    test4VectorOffset test4: Offset = Offset(),\n    testarrayofstringVectorOffset testarrayofstring: Offset = Offset(),\n    testarrayoftablesVectorOffset testarrayoftables: Offset = Offset(),\n    enemyOffset enemy: Offset = Offset(),\n    testnestedflatbufferVectorOffset testnestedflatbuffer: Offset = Offset(),\n    testemptyOffset testempty: Offset = Offset(),\n    testbool: Bool = false,\n    testhashs32Fnv1: Int32 = 0,\n    testhashu32Fnv1: UInt32 = 0,\n    testhashs64Fnv1: Int64 = 0,\n    testhashu64Fnv1: UInt64 = 0,\n    testhashs32Fnv1a: Int32 = 0,\n    testhashu32Fnv1a: UInt32 = 0,\n    testhashs64Fnv1a: Int64 = 0,\n    testhashu64Fnv1a: UInt64 = 0,\n    testarrayofboolsVectorOffset testarrayofbools: Offset = Offset(),\n    testf: Float32 = 3.14159,\n    testf2: Float32 = 3.0,\n    testf3: Float32 = 0.0,\n    testarrayofstring2VectorOffset testarrayofstring2: Offset = Offset(),\n    testarrayofsortedstructVectorOffset testarrayofsortedstruct: Offset = Offset(),\n    flexVectorOffset flex: Offset = Offset(),\n    test5VectorOffset test5: Offset = Offset(),\n    vectorOfLongsVectorOffset vectorOfLongs: Offset = Offset(),\n    vectorOfDoublesVectorOffset vectorOfDoubles: Offset = Offset(),\n    parentNamespaceTestOffset parentNamespaceTest: Offset = Offset(),\n    vectorOfReferrablesVectorOffset vectorOfReferrables: Offset = Offset(),\n    singleWeakReference: UInt64 = 0,\n    vectorOfWeakReferencesVectorOffset vectorOfWeakReferences: Offset = Offset(),\n    vectorOfStrongReferrablesVectorOffset vectorOfStrongReferrables: Offset = Offset(),\n    coOwningReference: UInt64 = 0,\n    vectorOfCoOwningReferencesVectorOffset vectorOfCoOwningReferences: Offset = Offset(),\n    nonOwningReference: UInt64 = 0,\n    vectorOfNonOwningReferencesVectorOffset vectorOfNonOwningReferences: Offset = Offset(),\n    anyUniqueType: MyGame_Example_AnyUniqueAliases = .none_,\n    anyUniqueOffset anyUnique: Offset = Offset(),\n    anyAmbiguousType: MyGame_Example_AnyAmbiguousAliases = .none_,\n    anyAmbiguousOffset anyAmbiguous: Offset = Offset(),\n    vectorOfEnumsVectorOffset vectorOfEnums: Offset = Offset(),\n    signedEnum: MyGame_Example_Race = .none_,\n    testrequirednestedflatbufferVectorOffset testrequirednestedflatbuffer: Offset = Offset(),\n    scalarKeySortedTablesVectorOffset scalarKeySortedTables: Offset = Offset(),\n    nativeInline: MyGame_Example_Test? = nil,\n    longEnumNonEnumDefault: MyGame_Example_LongEnum = .longone,\n    longEnumNormalDefault: MyGame_Example_LongEnum = .longone,\n    nanDefault: Float32 = .nan,\n    infDefault: Float32 = .infinity,\n    positiveInfDefault: Float32 = .infinity,\n    infinityDefault: Float32 = .infinity,\n    positiveInfinityDefault: Float32 = .infinity,\n    negativeInfDefault: Float32 = -.infinity,\n    negativeInfinityDefault: Float32 = -.infinity,\n    doubleInfDefault: Double = .infinity\n  ) -> Offset {\n    let __start = MyGame_Example_Monster.startMonster(&fbb)\n    MyGame_Example_Monster.add(pos: pos, &fbb)\n    MyGame_Example_Monster.add(mana: mana, &fbb)\n    MyGame_Example_Monster.add(hp: hp, &fbb)\n    MyGame_Example_Monster.add(name: name, &fbb)\n    MyGame_Example_Monster.addVectorOf(inventory: inventory, &fbb)\n    MyGame_Example_Monster.add(color: color, &fbb)\n    MyGame_Example_Monster.add(testType: testType, &fbb)\n    MyGame_Example_Monster.add(test: test, &fbb)\n    MyGame_Example_Monster.addVectorOf(test4: test4, &fbb)\n    MyGame_Example_Monster.addVectorOf(testarrayofstring: testarrayofstring, &fbb)\n    MyGame_Example_Monster.addVectorOf(testarrayoftables: testarrayoftables, &fbb)\n    MyGame_Example_Monster.add(enemy: enemy, &fbb)\n    MyGame_Example_Monster.addVectorOf(testnestedflatbuffer: testnestedflatbuffer, &fbb)\n    MyGame_Example_Monster.add(testempty: testempty, &fbb)\n    MyGame_Example_Monster.add(testbool: testbool, &fbb)\n    MyGame_Example_Monster.add(testhashs32Fnv1: testhashs32Fnv1, &fbb)\n    MyGame_Example_Monster.add(testhashu32Fnv1: testhashu32Fnv1, &fbb)\n    MyGame_Example_Monster.add(testhashs64Fnv1: testhashs64Fnv1, &fbb)\n    MyGame_Example_Monster.add(testhashu64Fnv1: testhashu64Fnv1, &fbb)\n    MyGame_Example_Monster.add(testhashs32Fnv1a: testhashs32Fnv1a, &fbb)\n    MyGame_Example_Monster.add(testhashu32Fnv1a: testhashu32Fnv1a, &fbb)\n    MyGame_Example_Monster.add(testhashs64Fnv1a: testhashs64Fnv1a, &fbb)\n    MyGame_Example_Monster.add(testhashu64Fnv1a: testhashu64Fnv1a, &fbb)\n    MyGame_Example_Monster.addVectorOf(testarrayofbools: testarrayofbools, &fbb)\n    MyGame_Example_Monster.add(testf: testf, &fbb)\n    MyGame_Example_Monster.add(testf2: testf2, &fbb)\n    MyGame_Example_Monster.add(testf3: testf3, &fbb)\n    MyGame_Example_Monster.addVectorOf(testarrayofstring2: testarrayofstring2, &fbb)\n    MyGame_Example_Monster.addVectorOf(testarrayofsortedstruct: testarrayofsortedstruct, &fbb)\n    MyGame_Example_Monster.addVectorOf(flex: flex, &fbb)\n    MyGame_Example_Monster.addVectorOf(test5: test5, &fbb)\n    MyGame_Example_Monster.addVectorOf(vectorOfLongs: vectorOfLongs, &fbb)\n    MyGame_Example_Monster.addVectorOf(vectorOfDoubles: vectorOfDoubles, &fbb)\n    MyGame_Example_Monster.add(parentNamespaceTest: parentNamespaceTest, &fbb)\n    MyGame_Example_Monster.addVectorOf(vectorOfReferrables: vectorOfReferrables, &fbb)\n    MyGame_Example_Monster.add(singleWeakReference: singleWeakReference, &fbb)\n    MyGame_Example_Monster.addVectorOf(vectorOfWeakReferences: vectorOfWeakReferences, &fbb)\n    MyGame_Example_Monster.addVectorOf(vectorOfStrongReferrables: vectorOfStrongReferrables, &fbb)\n    MyGame_Example_Monster.add(coOwningReference: coOwningReference, &fbb)\n    MyGame_Example_Monster.addVectorOf(vectorOfCoOwningReferences: vectorOfCoOwningReferences, &fbb)\n    MyGame_Example_Monster.add(nonOwningReference: nonOwningReference, &fbb)\n    MyGame_Example_Monster.addVectorOf(vectorOfNonOwningReferences: vectorOfNonOwningReferences, &fbb)\n    MyGame_Example_Monster.add(anyUniqueType: anyUniqueType, &fbb)\n    MyGame_Example_Monster.add(anyUnique: anyUnique, &fbb)\n    MyGame_Example_Monster.add(anyAmbiguousType: anyAmbiguousType, &fbb)\n    MyGame_Example_Monster.add(anyAmbiguous: anyAmbiguous, &fbb)\n    MyGame_Example_Monster.addVectorOf(vectorOfEnums: vectorOfEnums, &fbb)\n    MyGame_Example_Monster.add(signedEnum: signedEnum, &fbb)\n    MyGame_Example_Monster.addVectorOf(testrequirednestedflatbuffer: testrequirednestedflatbuffer, &fbb)\n    MyGame_Example_Monster.addVectorOf(scalarKeySortedTables: scalarKeySortedTables, &fbb)\n    MyGame_Example_Monster.add(nativeInline: nativeInline, &fbb)\n    MyGame_Example_Monster.add(longEnumNonEnumDefault: longEnumNonEnumDefault, &fbb)\n    MyGame_Example_Monster.add(longEnumNormalDefault: longEnumNormalDefault, &fbb)\n    MyGame_Example_Monster.add(nanDefault: nanDefault, &fbb)\n    MyGame_Example_Monster.add(infDefault: infDefault, &fbb)\n    MyGame_Example_Monster.add(positiveInfDefault: positiveInfDefault, &fbb)\n    MyGame_Example_Monster.add(infinityDefault: infinityDefault, &fbb)\n    MyGame_Example_Monster.add(positiveInfinityDefault: positiveInfinityDefault, &fbb)\n    MyGame_Example_Monster.add(negativeInfDefault: negativeInfDefault, &fbb)\n    MyGame_Example_Monster.add(negativeInfinityDefault: negativeInfinityDefault, &fbb)\n    MyGame_Example_Monster.add(doubleInfDefault: doubleInfDefault, &fbb)\n    return MyGame_Example_Monster.endMonster(&fbb, start: __start)\n  }\n  public static func sortVectorOfMonster(offsets:[Offset], _ fbb: inout FlatBufferBuilder) -> Offset {\n    var off = offsets\n    off.sort { Table.compare(Table.offset(Int32($1.o), vOffset: 10, fbb: &fbb), Table.offset(Int32($0.o), vOffset: 10, fbb: &fbb), fbb: &fbb) < 0 } \n    return fbb.createVector(ofOffsets: off)\n  }\n  fileprivate static func lookupByKey(vector: Int32, key: String, fbb: ByteBuffer) -> MyGame_Example_Monster? {\n    let key = key.utf8.map { $0 }\n    var span = fbb.read(def: Int32.self, position: Int(vector - 4))\n    var start: Int32 = 0\n    while span != 0 {\n      var middle = span / 2\n      let tableOffset = Table.indirect(vector + 4 * (start + middle), fbb)\n      let comp = Table.compare(Table.offset(Int32(fbb.capacity) - tableOffset, vOffset: 10, fbb: fbb), key, fbb: fbb)\n      if comp > 0 {\n        span = middle\n      } else if comp < 0 {\n        middle += 1\n        start += middle\n        span -= middle\n      } else {\n        return MyGame_Example_Monster(fbb, o: tableOffset)\n      }\n    }\n    return nil\n  }\n\n  public func unpack() -> MyGame_Example_MonsterT {\n    return MyGame_Example_MonsterT(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_MonsterT?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_MonsterT) -> Offset {\n    let __name = builder.create(string: obj.name)\n    let __inventory = builder.createVector(obj.inventory)\n    let __test = obj.test?.pack(builder: &builder) ?? Offset()\n    MyGame_Example_Monster.startVectorOfTest4(obj.test4.count, in: &builder)\n    for val in obj.test4 {\n      builder.create(struct: val)\n    }\n    let __test4 = builder.endVector(len: obj.test4.count)\n    let __testarrayofstring = builder.createVector(ofStrings: obj.testarrayofstring.compactMap({ $0 }) )\n    var __testarrayoftables__: [Offset] = []\n    for var i in obj.testarrayoftables {\n      __testarrayoftables__.append(MyGame_Example_Monster.pack(&builder, obj: &i))\n    }\n    let __testarrayoftables = builder.createVector(ofOffsets: __testarrayoftables__)\n    let __enemy = MyGame_Example_Monster.pack(&builder, obj: &obj.enemy)\n    let __testnestedflatbuffer = builder.createVector(obj.testnestedflatbuffer)\n    let __testempty = MyGame_Example_Stat.pack(&builder, obj: &obj.testempty)\n    let __testarrayofbools = builder.createVector(obj.testarrayofbools)\n    let __testarrayofstring2 = builder.createVector(ofStrings: obj.testarrayofstring2.compactMap({ $0 }) )\n    MyGame_Example_Monster.startVectorOfTestarrayofsortedstruct(obj.testarrayofsortedstruct.count, in: &builder)\n    for val in obj.testarrayofsortedstruct {\n      builder.create(struct: val)\n    }\n    let __testarrayofsortedstruct = builder.endVector(len: obj.testarrayofsortedstruct.count)\n    let __flex = builder.createVector(obj.flex)\n    MyGame_Example_Monster.startVectorOfTest5(obj.test5.count, in: &builder)\n    for val in obj.test5 {\n      builder.create(struct: val)\n    }\n    let __test5 = builder.endVector(len: obj.test5.count)\n    let __vectorOfLongs = builder.createVector(obj.vectorOfLongs)\n    let __vectorOfDoubles = builder.createVector(obj.vectorOfDoubles)\n    let __parentNamespaceTest = MyGame_InParentNamespace.pack(&builder, obj: &obj.parentNamespaceTest)\n    var __vectorOfReferrables__: [Offset] = []\n    for var i in obj.vectorOfReferrables {\n      __vectorOfReferrables__.append(MyGame_Example_Referrable.pack(&builder, obj: &i))\n    }\n    let __vectorOfReferrables = builder.createVector(ofOffsets: __vectorOfReferrables__)\n    let __vectorOfWeakReferences = builder.createVector(obj.vectorOfWeakReferences)\n    var __vectorOfStrongReferrables__: [Offset] = []\n    for var i in obj.vectorOfStrongReferrables {\n      __vectorOfStrongReferrables__.append(MyGame_Example_Referrable.pack(&builder, obj: &i))\n    }\n    let __vectorOfStrongReferrables = builder.createVector(ofOffsets: __vectorOfStrongReferrables__)\n    let __vectorOfCoOwningReferences = builder.createVector(obj.vectorOfCoOwningReferences)\n    let __vectorOfNonOwningReferences = builder.createVector(obj.vectorOfNonOwningReferences)\n    let __anyUnique = obj.anyUnique?.pack(builder: &builder) ?? Offset()\n    let __anyAmbiguous = obj.anyAmbiguous?.pack(builder: &builder) ?? Offset()\n    let __vectorOfEnums = builder.createVector(obj.vectorOfEnums)\n    let __testrequirednestedflatbuffer = builder.createVector(obj.testrequirednestedflatbuffer)\n    var __scalarKeySortedTables__: [Offset] = []\n    for var i in obj.scalarKeySortedTables {\n      __scalarKeySortedTables__.append(MyGame_Example_Stat.pack(&builder, obj: &i))\n    }\n    let __scalarKeySortedTables = builder.createVector(ofOffsets: __scalarKeySortedTables__)\n    let __root = MyGame_Example_Monster.startMonster(&builder)\n    MyGame_Example_Monster.add(pos: obj.pos, &builder)\n    MyGame_Example_Monster.add(mana: obj.mana, &builder)\n    MyGame_Example_Monster.add(hp: obj.hp, &builder)\n    MyGame_Example_Monster.add(name: __name, &builder)\n    MyGame_Example_Monster.addVectorOf(inventory: __inventory, &builder)\n    MyGame_Example_Monster.add(color: obj.color, &builder)\n    if let o = obj.test?.type {\n      MyGame_Example_Monster.add(testType: o, &builder)\n      MyGame_Example_Monster.add(test: __test, &builder)\n    }\n\n    MyGame_Example_Monster.addVectorOf(test4: __test4, &builder)\n    MyGame_Example_Monster.addVectorOf(testarrayofstring: __testarrayofstring, &builder)\n    MyGame_Example_Monster.addVectorOf(testarrayoftables: __testarrayoftables, &builder)\n    MyGame_Example_Monster.add(enemy: __enemy, &builder)\n    MyGame_Example_Monster.addVectorOf(testnestedflatbuffer: __testnestedflatbuffer, &builder)\n    MyGame_Example_Monster.add(testempty: __testempty, &builder)\n    MyGame_Example_Monster.add(testbool: obj.testbool, &builder)\n    MyGame_Example_Monster.add(testhashs32Fnv1: obj.testhashs32Fnv1, &builder)\n    MyGame_Example_Monster.add(testhashu32Fnv1: obj.testhashu32Fnv1, &builder)\n    MyGame_Example_Monster.add(testhashs64Fnv1: obj.testhashs64Fnv1, &builder)\n    MyGame_Example_Monster.add(testhashu64Fnv1: obj.testhashu64Fnv1, &builder)\n    MyGame_Example_Monster.add(testhashs32Fnv1a: obj.testhashs32Fnv1a, &builder)\n    MyGame_Example_Monster.add(testhashu32Fnv1a: obj.testhashu32Fnv1a, &builder)\n    MyGame_Example_Monster.add(testhashs64Fnv1a: obj.testhashs64Fnv1a, &builder)\n    MyGame_Example_Monster.add(testhashu64Fnv1a: obj.testhashu64Fnv1a, &builder)\n    MyGame_Example_Monster.addVectorOf(testarrayofbools: __testarrayofbools, &builder)\n    MyGame_Example_Monster.add(testf: obj.testf, &builder)\n    MyGame_Example_Monster.add(testf2: obj.testf2, &builder)\n    MyGame_Example_Monster.add(testf3: obj.testf3, &builder)\n    MyGame_Example_Monster.addVectorOf(testarrayofstring2: __testarrayofstring2, &builder)\n    MyGame_Example_Monster.addVectorOf(testarrayofsortedstruct: __testarrayofsortedstruct, &builder)\n    MyGame_Example_Monster.addVectorOf(flex: __flex, &builder)\n    MyGame_Example_Monster.addVectorOf(test5: __test5, &builder)\n    MyGame_Example_Monster.addVectorOf(vectorOfLongs: __vectorOfLongs, &builder)\n    MyGame_Example_Monster.addVectorOf(vectorOfDoubles: __vectorOfDoubles, &builder)\n    MyGame_Example_Monster.add(parentNamespaceTest: __parentNamespaceTest, &builder)\n    MyGame_Example_Monster.addVectorOf(vectorOfReferrables: __vectorOfReferrables, &builder)\n    MyGame_Example_Monster.add(singleWeakReference: obj.singleWeakReference, &builder)\n    MyGame_Example_Monster.addVectorOf(vectorOfWeakReferences: __vectorOfWeakReferences, &builder)\n    MyGame_Example_Monster.addVectorOf(vectorOfStrongReferrables: __vectorOfStrongReferrables, &builder)\n    MyGame_Example_Monster.add(coOwningReference: obj.coOwningReference, &builder)\n    MyGame_Example_Monster.addVectorOf(vectorOfCoOwningReferences: __vectorOfCoOwningReferences, &builder)\n    MyGame_Example_Monster.add(nonOwningReference: obj.nonOwningReference, &builder)\n    MyGame_Example_Monster.addVectorOf(vectorOfNonOwningReferences: __vectorOfNonOwningReferences, &builder)\n    if let o = obj.anyUnique?.type {\n      MyGame_Example_Monster.add(anyUniqueType: o, &builder)\n      MyGame_Example_Monster.add(anyUnique: __anyUnique, &builder)\n    }\n\n    if let o = obj.anyAmbiguous?.type {\n      MyGame_Example_Monster.add(anyAmbiguousType: o, &builder)\n      MyGame_Example_Monster.add(anyAmbiguous: __anyAmbiguous, &builder)\n    }\n\n    MyGame_Example_Monster.addVectorOf(vectorOfEnums: __vectorOfEnums, &builder)\n    MyGame_Example_Monster.add(signedEnum: obj.signedEnum, &builder)\n    MyGame_Example_Monster.addVectorOf(testrequirednestedflatbuffer: __testrequirednestedflatbuffer, &builder)\n    MyGame_Example_Monster.addVectorOf(scalarKeySortedTables: __scalarKeySortedTables, &builder)\n    MyGame_Example_Monster.add(nativeInline: obj.nativeInline, &builder)\n    MyGame_Example_Monster.add(longEnumNonEnumDefault: obj.longEnumNonEnumDefault, &builder)\n    MyGame_Example_Monster.add(longEnumNormalDefault: obj.longEnumNormalDefault, &builder)\n    MyGame_Example_Monster.add(nanDefault: obj.nanDefault, &builder)\n    MyGame_Example_Monster.add(infDefault: obj.infDefault, &builder)\n    MyGame_Example_Monster.add(positiveInfDefault: obj.positiveInfDefault, &builder)\n    MyGame_Example_Monster.add(infinityDefault: obj.infinityDefault, &builder)\n    MyGame_Example_Monster.add(positiveInfinityDefault: obj.positiveInfinityDefault, &builder)\n    MyGame_Example_Monster.add(negativeInfDefault: obj.negativeInfDefault, &builder)\n    MyGame_Example_Monster.add(negativeInfinityDefault: obj.negativeInfinityDefault, &builder)\n    MyGame_Example_Monster.add(doubleInfDefault: obj.doubleInfDefault, &builder)\n    return MyGame_Example_Monster.endMonster(&builder, start: __root)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    try _v.visit(field: VT.pos, fieldName: \"pos\", required: false, type: MyGame_Example_Vec3.self)\n    try _v.visit(field: VT.mana, fieldName: \"mana\", required: false, type: Int16.self)\n    try _v.visit(field: VT.hp, fieldName: \"hp\", required: false, type: Int16.self)\n    try _v.visit(field: VT.name, fieldName: \"name\", required: true, type: ForwardOffset<String>.self)\n    try _v.visit(field: VT.inventory, fieldName: \"inventory\", required: false, type: ForwardOffset<Vector<UInt8, UInt8>>.self)\n    try _v.visit(field: VT.color, fieldName: \"color\", required: false, type: MyGame_Example_Color.self)\n    try _v.visit(unionKey: VT.testType, unionField: VT.test, unionKeyName: \"testType\", fieldName: \"test\", required: false, completion: { (verifier, key: MyGame_Example_Any_, pos) in\n      switch key {\n      case .none_:\n        break // NOTE - SWIFT doesnt support none\n      case .monster:\n        try ForwardOffset<MyGame_Example_Monster>.verify(&verifier, at: pos, of: MyGame_Example_Monster.self)\n      case .testsimpletablewithenum:\n        try ForwardOffset<MyGame_Example_TestSimpleTableWithEnum>.verify(&verifier, at: pos, of: MyGame_Example_TestSimpleTableWithEnum.self)\n      case .mygameExample2Monster:\n        try ForwardOffset<MyGame_Example2_Monster>.verify(&verifier, at: pos, of: MyGame_Example2_Monster.self)\n      }\n    })\n    try _v.visit(field: VT.test4, fieldName: \"test4\", required: false, type: ForwardOffset<Vector<MyGame_Example_Test, MyGame_Example_Test>>.self)\n    try _v.visit(field: VT.testarrayofstring, fieldName: \"testarrayofstring\", required: false, type: ForwardOffset<Vector<ForwardOffset<String>, String>>.self)\n    try _v.visit(field: VT.testarrayoftables, fieldName: \"testarrayoftables\", required: false, type: ForwardOffset<Vector<ForwardOffset<MyGame_Example_Monster>, MyGame_Example_Monster>>.self)\n    try _v.visit(field: VT.enemy, fieldName: \"enemy\", required: false, type: ForwardOffset<MyGame_Example_Monster>.self)\n    try _v.visit(field: VT.testnestedflatbuffer, fieldName: \"testnestedflatbuffer\", required: false, type: ForwardOffset<Vector<UInt8, UInt8>>.self)\n    try _v.visit(field: VT.testempty, fieldName: \"testempty\", required: false, type: ForwardOffset<MyGame_Example_Stat>.self)\n    try _v.visit(field: VT.testbool, fieldName: \"testbool\", required: false, type: Bool.self)\n    try _v.visit(field: VT.testhashs32Fnv1, fieldName: \"testhashs32Fnv1\", required: false, type: Int32.self)\n    try _v.visit(field: VT.testhashu32Fnv1, fieldName: \"testhashu32Fnv1\", required: false, type: UInt32.self)\n    try _v.visit(field: VT.testhashs64Fnv1, fieldName: \"testhashs64Fnv1\", required: false, type: Int64.self)\n    try _v.visit(field: VT.testhashu64Fnv1, fieldName: \"testhashu64Fnv1\", required: false, type: UInt64.self)\n    try _v.visit(field: VT.testhashs32Fnv1a, fieldName: \"testhashs32Fnv1a\", required: false, type: Int32.self)\n    try _v.visit(field: VT.testhashu32Fnv1a, fieldName: \"testhashu32Fnv1a\", required: false, type: UInt32.self)\n    try _v.visit(field: VT.testhashs64Fnv1a, fieldName: \"testhashs64Fnv1a\", required: false, type: Int64.self)\n    try _v.visit(field: VT.testhashu64Fnv1a, fieldName: \"testhashu64Fnv1a\", required: false, type: UInt64.self)\n    try _v.visit(field: VT.testarrayofbools, fieldName: \"testarrayofbools\", required: false, type: ForwardOffset<Vector<Bool, Bool>>.self)\n    try _v.visit(field: VT.testf, fieldName: \"testf\", required: false, type: Float32.self)\n    try _v.visit(field: VT.testf2, fieldName: \"testf2\", required: false, type: Float32.self)\n    try _v.visit(field: VT.testf3, fieldName: \"testf3\", required: false, type: Float32.self)\n    try _v.visit(field: VT.testarrayofstring2, fieldName: \"testarrayofstring2\", required: false, type: ForwardOffset<Vector<ForwardOffset<String>, String>>.self)\n    try _v.visit(field: VT.testarrayofsortedstruct, fieldName: \"testarrayofsortedstruct\", required: false, type: ForwardOffset<Vector<MyGame_Example_Ability, MyGame_Example_Ability>>.self)\n    try _v.visit(field: VT.flex, fieldName: \"flex\", required: false, type: ForwardOffset<Vector<UInt8, UInt8>>.self)\n    try _v.visit(field: VT.test5, fieldName: \"test5\", required: false, type: ForwardOffset<Vector<MyGame_Example_Test, MyGame_Example_Test>>.self)\n    try _v.visit(field: VT.vectorOfLongs, fieldName: \"vectorOfLongs\", required: false, type: ForwardOffset<Vector<Int64, Int64>>.self)\n    try _v.visit(field: VT.vectorOfDoubles, fieldName: \"vectorOfDoubles\", required: false, type: ForwardOffset<Vector<Double, Double>>.self)\n    try _v.visit(field: VT.parentNamespaceTest, fieldName: \"parentNamespaceTest\", required: false, type: ForwardOffset<MyGame_InParentNamespace>.self)\n    try _v.visit(field: VT.vectorOfReferrables, fieldName: \"vectorOfReferrables\", required: false, type: ForwardOffset<Vector<ForwardOffset<MyGame_Example_Referrable>, MyGame_Example_Referrable>>.self)\n    try _v.visit(field: VT.singleWeakReference, fieldName: \"singleWeakReference\", required: false, type: UInt64.self)\n    try _v.visit(field: VT.vectorOfWeakReferences, fieldName: \"vectorOfWeakReferences\", required: false, type: ForwardOffset<Vector<UInt64, UInt64>>.self)\n    try _v.visit(field: VT.vectorOfStrongReferrables, fieldName: \"vectorOfStrongReferrables\", required: false, type: ForwardOffset<Vector<ForwardOffset<MyGame_Example_Referrable>, MyGame_Example_Referrable>>.self)\n    try _v.visit(field: VT.coOwningReference, fieldName: \"coOwningReference\", required: false, type: UInt64.self)\n    try _v.visit(field: VT.vectorOfCoOwningReferences, fieldName: \"vectorOfCoOwningReferences\", required: false, type: ForwardOffset<Vector<UInt64, UInt64>>.self)\n    try _v.visit(field: VT.nonOwningReference, fieldName: \"nonOwningReference\", required: false, type: UInt64.self)\n    try _v.visit(field: VT.vectorOfNonOwningReferences, fieldName: \"vectorOfNonOwningReferences\", required: false, type: ForwardOffset<Vector<UInt64, UInt64>>.self)\n    try _v.visit(unionKey: VT.anyUniqueType, unionField: VT.anyUnique, unionKeyName: \"anyUniqueType\", fieldName: \"anyUnique\", required: false, completion: { (verifier, key: MyGame_Example_AnyUniqueAliases, pos) in\n      switch key {\n      case .none_:\n        break // NOTE - SWIFT doesnt support none\n      case .m:\n        try ForwardOffset<MyGame_Example_Monster>.verify(&verifier, at: pos, of: MyGame_Example_Monster.self)\n      case .ts:\n        try ForwardOffset<MyGame_Example_TestSimpleTableWithEnum>.verify(&verifier, at: pos, of: MyGame_Example_TestSimpleTableWithEnum.self)\n      case .m2:\n        try ForwardOffset<MyGame_Example2_Monster>.verify(&verifier, at: pos, of: MyGame_Example2_Monster.self)\n      }\n    })\n    try _v.visit(unionKey: VT.anyAmbiguousType, unionField: VT.anyAmbiguous, unionKeyName: \"anyAmbiguousType\", fieldName: \"anyAmbiguous\", required: false, completion: { (verifier, key: MyGame_Example_AnyAmbiguousAliases, pos) in\n      switch key {\n      case .none_:\n        break // NOTE - SWIFT doesnt support none\n      case .m1:\n        try ForwardOffset<MyGame_Example_Monster>.verify(&verifier, at: pos, of: MyGame_Example_Monster.self)\n      case .m2:\n        try ForwardOffset<MyGame_Example_Monster>.verify(&verifier, at: pos, of: MyGame_Example_Monster.self)\n      case .m3:\n        try ForwardOffset<MyGame_Example_Monster>.verify(&verifier, at: pos, of: MyGame_Example_Monster.self)\n      }\n    })\n    try _v.visit(field: VT.vectorOfEnums, fieldName: \"vectorOfEnums\", required: false, type: ForwardOffset<Vector<MyGame_Example_Color, MyGame_Example_Color>>.self)\n    try _v.visit(field: VT.signedEnum, fieldName: \"signedEnum\", required: false, type: MyGame_Example_Race.self)\n    try _v.visit(field: VT.testrequirednestedflatbuffer, fieldName: \"testrequirednestedflatbuffer\", required: false, type: ForwardOffset<Vector<UInt8, UInt8>>.self)\n    try _v.visit(field: VT.scalarKeySortedTables, fieldName: \"scalarKeySortedTables\", required: false, type: ForwardOffset<Vector<ForwardOffset<MyGame_Example_Stat>, MyGame_Example_Stat>>.self)\n    try _v.visit(field: VT.nativeInline, fieldName: \"nativeInline\", required: false, type: MyGame_Example_Test.self)\n    try _v.visit(field: VT.longEnumNonEnumDefault, fieldName: \"longEnumNonEnumDefault\", required: false, type: MyGame_Example_LongEnum.self)\n    try _v.visit(field: VT.longEnumNormalDefault, fieldName: \"longEnumNormalDefault\", required: false, type: MyGame_Example_LongEnum.self)\n    try _v.visit(field: VT.nanDefault, fieldName: \"nanDefault\", required: false, type: Float32.self)\n    try _v.visit(field: VT.infDefault, fieldName: \"infDefault\", required: false, type: Float32.self)\n    try _v.visit(field: VT.positiveInfDefault, fieldName: \"positiveInfDefault\", required: false, type: Float32.self)\n    try _v.visit(field: VT.infinityDefault, fieldName: \"infinityDefault\", required: false, type: Float32.self)\n    try _v.visit(field: VT.positiveInfinityDefault, fieldName: \"positiveInfinityDefault\", required: false, type: Float32.self)\n    try _v.visit(field: VT.negativeInfDefault, fieldName: \"negativeInfDefault\", required: false, type: Float32.self)\n    try _v.visit(field: VT.negativeInfinityDefault, fieldName: \"negativeInfinityDefault\", required: false, type: Float32.self)\n    try _v.visit(field: VT.doubleInfDefault, fieldName: \"doubleInfDefault\", required: false, type: Double.self)\n    _v.finish()\n  }\n}\n\nextension MyGame_Example_Monster: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case pos = \"pos\"\n    case mana = \"mana\"\n    case hp = \"hp\"\n    case name = \"name\"\n    case inventory = \"inventory\"\n    case color = \"color\"\n    case testType = \"test_type\"\n    case test = \"test\"\n    case test4 = \"test4\"\n    case testarrayofstring = \"testarrayofstring\"\n    case testarrayoftables = \"testarrayoftables\"\n    case enemy = \"enemy\"\n    case testnestedflatbuffer = \"testnestedflatbuffer\"\n    case testempty = \"testempty\"\n    case testbool = \"testbool\"\n    case testhashs32Fnv1 = \"testhashs32_fnv1\"\n    case testhashu32Fnv1 = \"testhashu32_fnv1\"\n    case testhashs64Fnv1 = \"testhashs64_fnv1\"\n    case testhashu64Fnv1 = \"testhashu64_fnv1\"\n    case testhashs32Fnv1a = \"testhashs32_fnv1a\"\n    case testhashu32Fnv1a = \"testhashu32_fnv1a\"\n    case testhashs64Fnv1a = \"testhashs64_fnv1a\"\n    case testhashu64Fnv1a = \"testhashu64_fnv1a\"\n    case testarrayofbools = \"testarrayofbools\"\n    case testf = \"testf\"\n    case testf2 = \"testf2\"\n    case testf3 = \"testf3\"\n    case testarrayofstring2 = \"testarrayofstring2\"\n    case testarrayofsortedstruct = \"testarrayofsortedstruct\"\n    case flex = \"flex\"\n    case test5 = \"test5\"\n    case vectorOfLongs = \"vector_of_longs\"\n    case vectorOfDoubles = \"vector_of_doubles\"\n    case parentNamespaceTest = \"parent_namespace_test\"\n    case vectorOfReferrables = \"vector_of_referrables\"\n    case singleWeakReference = \"single_weak_reference\"\n    case vectorOfWeakReferences = \"vector_of_weak_references\"\n    case vectorOfStrongReferrables = \"vector_of_strong_referrables\"\n    case coOwningReference = \"co_owning_reference\"\n    case vectorOfCoOwningReferences = \"vector_of_co_owning_references\"\n    case nonOwningReference = \"non_owning_reference\"\n    case vectorOfNonOwningReferences = \"vector_of_non_owning_references\"\n    case anyUniqueType = \"any_unique_type\"\n    case anyUnique = \"any_unique\"\n    case anyAmbiguousType = \"any_ambiguous_type\"\n    case anyAmbiguous = \"any_ambiguous\"\n    case vectorOfEnums = \"vector_of_enums\"\n    case signedEnum = \"signed_enum\"\n    case testrequirednestedflatbuffer = \"testrequirednestedflatbuffer\"\n    case scalarKeySortedTables = \"scalar_key_sorted_tables\"\n    case nativeInline = \"native_inline\"\n    case longEnumNonEnumDefault = \"long_enum_non_enum_default\"\n    case longEnumNormalDefault = \"long_enum_normal_default\"\n    case nanDefault = \"nan_default\"\n    case infDefault = \"inf_default\"\n    case positiveInfDefault = \"positive_inf_default\"\n    case infinityDefault = \"infinity_default\"\n    case positiveInfinityDefault = \"positive_infinity_default\"\n    case negativeInfDefault = \"negative_inf_default\"\n    case negativeInfinityDefault = \"negative_infinity_default\"\n    case doubleInfDefault = \"double_inf_default\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    try container.encodeIfPresent(pos, forKey: .pos)\n    if mana != 150 {\n      try container.encodeIfPresent(mana, forKey: .mana)\n    }\n    if hp != 100 {\n      try container.encodeIfPresent(hp, forKey: .hp)\n    }\n    try container.encodeIfPresent(name, forKey: .name)\n    try container.encodeIfPresent(inventory, forKey: .inventory)\n    if color != .blue {\n      try container.encodeIfPresent(color, forKey: .color)\n    }\n    if testType != .none_ {\n      try container.encodeIfPresent(testType, forKey: .testType)\n    }\n    switch testType {\n    case .monster:\n      let _v = test(type: MyGame_Example_Monster.self)\n      try container.encodeIfPresent(_v, forKey: .test)\n    case .testsimpletablewithenum:\n      let _v = test(type: MyGame_Example_TestSimpleTableWithEnum.self)\n      try container.encodeIfPresent(_v, forKey: .test)\n    case .mygameExample2Monster:\n      let _v = test(type: MyGame_Example2_Monster.self)\n      try container.encodeIfPresent(_v, forKey: .test)\n    default: break;\n    }\n    try container.encodeIfPresent(test4, forKey: .test4)\n    try container.encodeIfPresent(testarrayofstring, forKey: .testarrayofstring)\n    try container.encodeIfPresent(testarrayoftables, forKey: .testarrayoftables)\n    try container.encodeIfPresent(enemy, forKey: .enemy)\n    try container.encodeIfPresent(testnestedflatbuffer, forKey: .testnestedflatbuffer)\n    try container.encodeIfPresent(testempty, forKey: .testempty)\n    if testbool != false {\n      try container.encodeIfPresent(testbool, forKey: .testbool)\n    }\n    if testhashs32Fnv1 != 0 {\n      try container.encodeIfPresent(testhashs32Fnv1, forKey: .testhashs32Fnv1)\n    }\n    if testhashu32Fnv1 != 0 {\n      try container.encodeIfPresent(testhashu32Fnv1, forKey: .testhashu32Fnv1)\n    }\n    if testhashs64Fnv1 != 0 {\n      try container.encodeIfPresent(testhashs64Fnv1, forKey: .testhashs64Fnv1)\n    }\n    if testhashu64Fnv1 != 0 {\n      try container.encodeIfPresent(testhashu64Fnv1, forKey: .testhashu64Fnv1)\n    }\n    if testhashs32Fnv1a != 0 {\n      try container.encodeIfPresent(testhashs32Fnv1a, forKey: .testhashs32Fnv1a)\n    }\n    if testhashu32Fnv1a != 0 {\n      try container.encodeIfPresent(testhashu32Fnv1a, forKey: .testhashu32Fnv1a)\n    }\n    if testhashs64Fnv1a != 0 {\n      try container.encodeIfPresent(testhashs64Fnv1a, forKey: .testhashs64Fnv1a)\n    }\n    if testhashu64Fnv1a != 0 {\n      try container.encodeIfPresent(testhashu64Fnv1a, forKey: .testhashu64Fnv1a)\n    }\n    try container.encodeIfPresent(testarrayofbools, forKey: .testarrayofbools)\n    if testf != 3.14159 {\n      try container.encodeIfPresent(testf, forKey: .testf)\n    }\n    if testf2 != 3.0 {\n      try container.encodeIfPresent(testf2, forKey: .testf2)\n    }\n    if testf3 != 0.0 {\n      try container.encodeIfPresent(testf3, forKey: .testf3)\n    }\n    try container.encodeIfPresent(testarrayofstring2, forKey: .testarrayofstring2)\n    try container.encodeIfPresent(testarrayofsortedstruct, forKey: .testarrayofsortedstruct)\n    try container.encodeIfPresent(flex, forKey: .flex)\n    try container.encodeIfPresent(test5, forKey: .test5)\n    try container.encodeIfPresent(vectorOfLongs, forKey: .vectorOfLongs)\n    try container.encodeIfPresent(vectorOfDoubles, forKey: .vectorOfDoubles)\n    try container.encodeIfPresent(parentNamespaceTest, forKey: .parentNamespaceTest)\n    try container.encodeIfPresent(vectorOfReferrables, forKey: .vectorOfReferrables)\n    if singleWeakReference != 0 {\n      try container.encodeIfPresent(singleWeakReference, forKey: .singleWeakReference)\n    }\n    try container.encodeIfPresent(vectorOfWeakReferences, forKey: .vectorOfWeakReferences)\n    try container.encodeIfPresent(vectorOfStrongReferrables, forKey: .vectorOfStrongReferrables)\n    if coOwningReference != 0 {\n      try container.encodeIfPresent(coOwningReference, forKey: .coOwningReference)\n    }\n    try container.encodeIfPresent(vectorOfCoOwningReferences, forKey: .vectorOfCoOwningReferences)\n    if nonOwningReference != 0 {\n      try container.encodeIfPresent(nonOwningReference, forKey: .nonOwningReference)\n    }\n    try container.encodeIfPresent(vectorOfNonOwningReferences, forKey: .vectorOfNonOwningReferences)\n    if anyUniqueType != .none_ {\n      try container.encodeIfPresent(anyUniqueType, forKey: .anyUniqueType)\n    }\n    switch anyUniqueType {\n    case .m:\n      let _v = anyUnique(type: MyGame_Example_Monster.self)\n      try container.encodeIfPresent(_v, forKey: .anyUnique)\n    case .ts:\n      let _v = anyUnique(type: MyGame_Example_TestSimpleTableWithEnum.self)\n      try container.encodeIfPresent(_v, forKey: .anyUnique)\n    case .m2:\n      let _v = anyUnique(type: MyGame_Example2_Monster.self)\n      try container.encodeIfPresent(_v, forKey: .anyUnique)\n    default: break;\n    }\n    if anyAmbiguousType != .none_ {\n      try container.encodeIfPresent(anyAmbiguousType, forKey: .anyAmbiguousType)\n    }\n    switch anyAmbiguousType {\n    case .m1:\n      let _v = anyAmbiguous(type: MyGame_Example_Monster.self)\n      try container.encodeIfPresent(_v, forKey: .anyAmbiguous)\n    case .m2:\n      let _v = anyAmbiguous(type: MyGame_Example_Monster.self)\n      try container.encodeIfPresent(_v, forKey: .anyAmbiguous)\n    case .m3:\n      let _v = anyAmbiguous(type: MyGame_Example_Monster.self)\n      try container.encodeIfPresent(_v, forKey: .anyAmbiguous)\n    default: break;\n    }\n    try container.encodeIfPresent(vectorOfEnums, forKey: .vectorOfEnums)\n    if signedEnum != .none_ {\n      try container.encodeIfPresent(signedEnum, forKey: .signedEnum)\n    }\n    try container.encodeIfPresent(testrequirednestedflatbuffer, forKey: .testrequirednestedflatbuffer)\n    try container.encodeIfPresent(scalarKeySortedTables, forKey: .scalarKeySortedTables)\n    try container.encodeIfPresent(nativeInline, forKey: .nativeInline)\n    if longEnumNonEnumDefault != .longone {\n      try container.encodeIfPresent(longEnumNonEnumDefault, forKey: .longEnumNonEnumDefault)\n    }\n    if longEnumNormalDefault != .longone {\n      try container.encodeIfPresent(longEnumNormalDefault, forKey: .longEnumNormalDefault)\n    }\n    if !nanDefault.isNaN {\n      try container.encodeIfPresent(nanDefault, forKey: .nanDefault)\n    }\n    if infDefault != .infinity {\n      try container.encodeIfPresent(infDefault, forKey: .infDefault)\n    }\n    if positiveInfDefault != .infinity {\n      try container.encodeIfPresent(positiveInfDefault, forKey: .positiveInfDefault)\n    }\n    if infinityDefault != .infinity {\n      try container.encodeIfPresent(infinityDefault, forKey: .infinityDefault)\n    }\n    if positiveInfinityDefault != .infinity {\n      try container.encodeIfPresent(positiveInfinityDefault, forKey: .positiveInfinityDefault)\n    }\n    if negativeInfDefault != -.infinity {\n      try container.encodeIfPresent(negativeInfDefault, forKey: .negativeInfDefault)\n    }\n    if negativeInfinityDefault != -.infinity {\n      try container.encodeIfPresent(negativeInfinityDefault, forKey: .negativeInfinityDefault)\n    }\n    if doubleInfDefault != .infinity {\n      try container.encodeIfPresent(doubleInfDefault, forKey: .doubleInfDefault)\n    }\n  }\n}\n\npublic class MyGame_Example_MonsterT: NativeObject {\n\n  public var pos: MyGame_Example_Vec3?\n  public var mana: Int16\n  public var hp: Int16\n  public var name: String\n  public var inventory: [UInt8]\n  public var color: MyGame_Example_Color\n  public var test: MyGame_Example_Any_Union?\n  public var test4: [MyGame_Example_Test]\n  public var testarrayofstring: [String?]\n  public var testarrayoftables: [MyGame_Example_MonsterT?]\n  public var enemy: MyGame_Example_MonsterT?\n  public var testnestedflatbuffer: [UInt8]\n  public var testempty: MyGame_Example_StatT?\n  public var testbool: Bool\n  public var testhashs32Fnv1: Int32\n  public var testhashu32Fnv1: UInt32\n  public var testhashs64Fnv1: Int64\n  public var testhashu64Fnv1: UInt64\n  public var testhashs32Fnv1a: Int32\n  public var testhashu32Fnv1a: UInt32\n  public var testhashs64Fnv1a: Int64\n  public var testhashu64Fnv1a: UInt64\n  public var testarrayofbools: [Bool]\n  public var testf: Float32\n  public var testf2: Float32\n  public var testf3: Float32\n  public var testarrayofstring2: [String?]\n  public var testarrayofsortedstruct: [MyGame_Example_Ability]\n  public var flex: [UInt8]\n  public var test5: [MyGame_Example_Test]\n  public var vectorOfLongs: [Int64]\n  public var vectorOfDoubles: [Double]\n  public var parentNamespaceTest: MyGame_InParentNamespaceT?\n  public var vectorOfReferrables: [MyGame_Example_ReferrableT?]\n  public var singleWeakReference: UInt64\n  public var vectorOfWeakReferences: [UInt64]\n  public var vectorOfStrongReferrables: [MyGame_Example_ReferrableT?]\n  public var coOwningReference: UInt64\n  public var vectorOfCoOwningReferences: [UInt64]\n  public var nonOwningReference: UInt64\n  public var vectorOfNonOwningReferences: [UInt64]\n  public var anyUnique: MyGame_Example_AnyUniqueAliasesUnion?\n  public var anyAmbiguous: MyGame_Example_AnyAmbiguousAliasesUnion?\n  public var vectorOfEnums: [MyGame_Example_Color]\n  public var signedEnum: MyGame_Example_Race\n  public var testrequirednestedflatbuffer: [UInt8]\n  public var scalarKeySortedTables: [MyGame_Example_StatT?]\n  public var nativeInline: MyGame_Example_Test?\n  public var longEnumNonEnumDefault: MyGame_Example_LongEnum\n  public var longEnumNormalDefault: MyGame_Example_LongEnum\n  public var nanDefault: Float32\n  public var infDefault: Float32\n  public var positiveInfDefault: Float32\n  public var infinityDefault: Float32\n  public var positiveInfinityDefault: Float32\n  public var negativeInfDefault: Float32\n  public var negativeInfinityDefault: Float32\n  public var doubleInfDefault: Double\n\n  public init(_ _t: borrowing MyGame_Example_Monster) {\n    pos = _t.pos\n    mana = _t.mana\n    hp = _t.hp\n    name = _t.name\n    inventory = []\n    inventory.append(contentsOf: _t.inventory)\n    color = _t.color\n    switch _t.testType {\n    case .monster:\n      let _v = _t.test(type: MyGame_Example_Monster.self)\n      test = MyGame_Example_Any_Union(_v?.unpack(), type: .monster)\n    case .testsimpletablewithenum:\n      let _v = _t.test(type: MyGame_Example_TestSimpleTableWithEnum.self)\n      test = MyGame_Example_Any_Union(_v?.unpack(), type: .testsimpletablewithenum)\n    case .mygameExample2Monster:\n      let _v = _t.test(type: MyGame_Example2_Monster.self)\n      test = MyGame_Example_Any_Union(_v?.unpack(), type: .mygameExample2Monster)\n    default: break\n    }\n    test4 = []\n    test4.append(contentsOf: _t.test4)\n    testarrayofstring = []\n    testarrayofstring.append(contentsOf: _t.testarrayofstring)\n    testarrayoftables = []\n    for val in _t.testarrayoftables{\n        testarrayoftables.append(val.unpack())\n    }\n    enemy = _t.enemy?.unpack()\n    testnestedflatbuffer = []\n    testnestedflatbuffer.append(contentsOf: _t.testnestedflatbuffer)\n    testempty = _t.testempty?.unpack()\n    testbool = _t.testbool\n    testhashs32Fnv1 = _t.testhashs32Fnv1\n    testhashu32Fnv1 = _t.testhashu32Fnv1\n    testhashs64Fnv1 = _t.testhashs64Fnv1\n    testhashu64Fnv1 = _t.testhashu64Fnv1\n    testhashs32Fnv1a = _t.testhashs32Fnv1a\n    testhashu32Fnv1a = _t.testhashu32Fnv1a\n    testhashs64Fnv1a = _t.testhashs64Fnv1a\n    testhashu64Fnv1a = _t.testhashu64Fnv1a\n    testarrayofbools = []\n    testarrayofbools.append(contentsOf: _t.testarrayofbools)\n    testf = _t.testf\n    testf2 = _t.testf2\n    testf3 = _t.testf3\n    testarrayofstring2 = []\n    testarrayofstring2.append(contentsOf: _t.testarrayofstring2)\n    testarrayofsortedstruct = []\n    testarrayofsortedstruct.append(contentsOf: _t.testarrayofsortedstruct)\n    flex = []\n    flex.append(contentsOf: _t.flex)\n    test5 = []\n    test5.append(contentsOf: _t.test5)\n    vectorOfLongs = []\n    vectorOfLongs.append(contentsOf: _t.vectorOfLongs)\n    vectorOfDoubles = []\n    vectorOfDoubles.append(contentsOf: _t.vectorOfDoubles)\n    parentNamespaceTest = _t.parentNamespaceTest?.unpack()\n    vectorOfReferrables = []\n    for val in _t.vectorOfReferrables{\n        vectorOfReferrables.append(val.unpack())\n    }\n    singleWeakReference = _t.singleWeakReference\n    vectorOfWeakReferences = []\n    vectorOfWeakReferences.append(contentsOf: _t.vectorOfWeakReferences)\n    vectorOfStrongReferrables = []\n    for val in _t.vectorOfStrongReferrables{\n        vectorOfStrongReferrables.append(val.unpack())\n    }\n    coOwningReference = _t.coOwningReference\n    vectorOfCoOwningReferences = []\n    vectorOfCoOwningReferences.append(contentsOf: _t.vectorOfCoOwningReferences)\n    nonOwningReference = _t.nonOwningReference\n    vectorOfNonOwningReferences = []\n    vectorOfNonOwningReferences.append(contentsOf: _t.vectorOfNonOwningReferences)\n    switch _t.anyUniqueType {\n    case .m:\n      let _v = _t.anyUnique(type: MyGame_Example_Monster.self)\n      anyUnique = MyGame_Example_AnyUniqueAliasesUnion(_v?.unpack(), type: .m)\n    case .ts:\n      let _v = _t.anyUnique(type: MyGame_Example_TestSimpleTableWithEnum.self)\n      anyUnique = MyGame_Example_AnyUniqueAliasesUnion(_v?.unpack(), type: .ts)\n    case .m2:\n      let _v = _t.anyUnique(type: MyGame_Example2_Monster.self)\n      anyUnique = MyGame_Example_AnyUniqueAliasesUnion(_v?.unpack(), type: .m2)\n    default: break\n    }\n    switch _t.anyAmbiguousType {\n    case .m1:\n      let _v = _t.anyAmbiguous(type: MyGame_Example_Monster.self)\n      anyAmbiguous = MyGame_Example_AnyAmbiguousAliasesUnion(_v?.unpack(), type: .m1)\n    case .m2:\n      let _v = _t.anyAmbiguous(type: MyGame_Example_Monster.self)\n      anyAmbiguous = MyGame_Example_AnyAmbiguousAliasesUnion(_v?.unpack(), type: .m2)\n    case .m3:\n      let _v = _t.anyAmbiguous(type: MyGame_Example_Monster.self)\n      anyAmbiguous = MyGame_Example_AnyAmbiguousAliasesUnion(_v?.unpack(), type: .m3)\n    default: break\n    }\n    vectorOfEnums = []\n    vectorOfEnums.append(contentsOf: _t.vectorOfEnums)\n    signedEnum = _t.signedEnum\n    testrequirednestedflatbuffer = []\n    testrequirednestedflatbuffer.append(contentsOf: _t.testrequirednestedflatbuffer)\n    scalarKeySortedTables = []\n    for val in _t.scalarKeySortedTables{\n        scalarKeySortedTables.append(val.unpack())\n    }\n    nativeInline = _t.nativeInline\n    longEnumNonEnumDefault = _t.longEnumNonEnumDefault\n    longEnumNormalDefault = _t.longEnumNormalDefault\n    nanDefault = _t.nanDefault\n    infDefault = _t.infDefault\n    positiveInfDefault = _t.positiveInfDefault\n    infinityDefault = _t.infinityDefault\n    positiveInfinityDefault = _t.positiveInfinityDefault\n    negativeInfDefault = _t.negativeInfDefault\n    negativeInfinityDefault = _t.negativeInfinityDefault\n    doubleInfDefault = _t.doubleInfDefault\n  }\n\n  public init() {\n    pos = MyGame_Example_Vec3()\n    mana = 150\n    hp = 100\n    name = \"\"\n    inventory = []\n    color = .blue\n    test4 = []\n    testarrayofstring = []\n    testarrayoftables = []\n    enemy = MyGame_Example_MonsterT()\n    testnestedflatbuffer = []\n    testempty = MyGame_Example_StatT()\n    testbool = false\n    testhashs32Fnv1 = 0\n    testhashu32Fnv1 = 0\n    testhashs64Fnv1 = 0\n    testhashu64Fnv1 = 0\n    testhashs32Fnv1a = 0\n    testhashu32Fnv1a = 0\n    testhashs64Fnv1a = 0\n    testhashu64Fnv1a = 0\n    testarrayofbools = []\n    testf = 3.14159\n    testf2 = 3.0\n    testf3 = 0.0\n    testarrayofstring2 = []\n    testarrayofsortedstruct = []\n    flex = []\n    test5 = []\n    vectorOfLongs = []\n    vectorOfDoubles = []\n    parentNamespaceTest = MyGame_InParentNamespaceT()\n    vectorOfReferrables = []\n    singleWeakReference = 0\n    vectorOfWeakReferences = []\n    vectorOfStrongReferrables = []\n    coOwningReference = 0\n    vectorOfCoOwningReferences = []\n    nonOwningReference = 0\n    vectorOfNonOwningReferences = []\n    vectorOfEnums = []\n    signedEnum = .none_\n    testrequirednestedflatbuffer = []\n    scalarKeySortedTables = []\n    nativeInline = MyGame_Example_Test()\n    longEnumNonEnumDefault = .longone\n    longEnumNormalDefault = .longone\n    nanDefault = .nan\n    infDefault = .infinity\n    positiveInfDefault = .infinity\n    infinityDefault = .infinity\n    positiveInfinityDefault = .infinity\n    negativeInfDefault = -.infinity\n    negativeInfinityDefault = -.infinity\n    doubleInfDefault = .infinity\n  }\n\n  public func serialize() -> ByteBuffer { return serialize(type: MyGame_Example_Monster.self) }\n\n}\npublic struct MyGame_Example_TypeAliases: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable, ObjectAPIPacker {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  public static var id: String { \"MONS\" } \n  public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset, prefix: Bool = false) { fbb.finish(offset: end, fileId: MyGame_Example_TypeAliases.id, addPrefix: prefix) }\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private struct VT {\n    static let i8: VOffset = 4\n    static let u8: VOffset = 6\n    static let i16: VOffset = 8\n    static let u16: VOffset = 10\n    static let i32: VOffset = 12\n    static let u32: VOffset = 14\n    static let i64: VOffset = 16\n    static let u64: VOffset = 18\n    static let f32: VOffset = 20\n    static let f64: VOffset = 22\n    static let v8: VOffset = 24\n    static let vf64: VOffset = 26\n  }\n\n  public var i8: Int8 { let o = _accessor.offset(VT.i8); return o == 0 ? 0 : _accessor.readBuffer(of: Int8.self, at: o) }\n  @discardableResult public func mutate(i8: Int8) -> Bool {let o = _accessor.offset(VT.i8);  return _accessor.mutate(i8, index: o) }\n  public var u8: UInt8 { let o = _accessor.offset(VT.u8); return o == 0 ? 0 : _accessor.readBuffer(of: UInt8.self, at: o) }\n  @discardableResult public func mutate(u8: UInt8) -> Bool {let o = _accessor.offset(VT.u8);  return _accessor.mutate(u8, index: o) }\n  public var i16: Int16 { let o = _accessor.offset(VT.i16); return o == 0 ? 0 : _accessor.readBuffer(of: Int16.self, at: o) }\n  @discardableResult public func mutate(i16: Int16) -> Bool {let o = _accessor.offset(VT.i16);  return _accessor.mutate(i16, index: o) }\n  public var u16: UInt16 { let o = _accessor.offset(VT.u16); return o == 0 ? 0 : _accessor.readBuffer(of: UInt16.self, at: o) }\n  @discardableResult public func mutate(u16: UInt16) -> Bool {let o = _accessor.offset(VT.u16);  return _accessor.mutate(u16, index: o) }\n  public var i32: Int32 { let o = _accessor.offset(VT.i32); return o == 0 ? 0 : _accessor.readBuffer(of: Int32.self, at: o) }\n  @discardableResult public func mutate(i32: Int32) -> Bool {let o = _accessor.offset(VT.i32);  return _accessor.mutate(i32, index: o) }\n  public var u32: UInt32 { let o = _accessor.offset(VT.u32); return o == 0 ? 0 : _accessor.readBuffer(of: UInt32.self, at: o) }\n  @discardableResult public func mutate(u32: UInt32) -> Bool {let o = _accessor.offset(VT.u32);  return _accessor.mutate(u32, index: o) }\n  public var i64: Int64 { let o = _accessor.offset(VT.i64); return o == 0 ? 0 : _accessor.readBuffer(of: Int64.self, at: o) }\n  @discardableResult public func mutate(i64: Int64) -> Bool {let o = _accessor.offset(VT.i64);  return _accessor.mutate(i64, index: o) }\n  public var u64: UInt64 { let o = _accessor.offset(VT.u64); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }\n  @discardableResult public func mutate(u64: UInt64) -> Bool {let o = _accessor.offset(VT.u64);  return _accessor.mutate(u64, index: o) }\n  public var f32: Float32 { let o = _accessor.offset(VT.f32); return o == 0 ? 0.0 : _accessor.readBuffer(of: Float32.self, at: o) }\n  @discardableResult public func mutate(f32: Float32) -> Bool {let o = _accessor.offset(VT.f32);  return _accessor.mutate(f32, index: o) }\n  public var f64: Double { let o = _accessor.offset(VT.f64); return o == 0 ? 0.0 : _accessor.readBuffer(of: Double.self, at: o) }\n  @discardableResult public func mutate(f64: Double) -> Bool {let o = _accessor.offset(VT.f64);  return _accessor.mutate(f64, index: o) }\n  public var v8: FlatbufferVector<Int8> { return _accessor.vector(at: VT.v8, byteSize: 1) }\n  public func mutate(v8: Int8, at index: Int32) -> Bool { let o = _accessor.offset(VT.v8); return _accessor.directMutate(v8, index: _accessor.vector(at: o) + index * 1) }\n  public func withUnsafePointerToV8<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.v8, body: body) }\n  public var vf64: FlatbufferVector<Double> { return _accessor.vector(at: VT.vf64, byteSize: 8) }\n  public func mutate(vf64: Double, at index: Int32) -> Bool { let o = _accessor.offset(VT.vf64); return _accessor.directMutate(vf64, index: _accessor.vector(at: o) + index * 8) }\n  public func withUnsafePointerToVf64<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.vf64, body: body) }\n  public static func startTypeAliases(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 12) }\n  public static func add(i8: Int8, _ fbb: inout FlatBufferBuilder) { fbb.add(element: i8, def: 0, at: VT.i8) }\n  public static func add(u8: UInt8, _ fbb: inout FlatBufferBuilder) { fbb.add(element: u8, def: 0, at: VT.u8) }\n  public static func add(i16: Int16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: i16, def: 0, at: VT.i16) }\n  public static func add(u16: UInt16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: u16, def: 0, at: VT.u16) }\n  public static func add(i32: Int32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: i32, def: 0, at: VT.i32) }\n  public static func add(u32: UInt32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: u32, def: 0, at: VT.u32) }\n  public static func add(i64: Int64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: i64, def: 0, at: VT.i64) }\n  public static func add(u64: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: u64, def: 0, at: VT.u64) }\n  public static func add(f32: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: f32, def: 0.0, at: VT.f32) }\n  public static func add(f64: Double, _ fbb: inout FlatBufferBuilder) { fbb.add(element: f64, def: 0.0, at: VT.f64) }\n  public static func addVectorOf(v8: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: v8, at: VT.v8) }\n  public static func addVectorOf(vf64: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vf64, at: VT.vf64) }\n  public static func endTypeAliases(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n  public static func createTypeAliases(\n    _ fbb: inout FlatBufferBuilder,\n    i8: Int8 = 0,\n    u8: UInt8 = 0,\n    i16: Int16 = 0,\n    u16: UInt16 = 0,\n    i32: Int32 = 0,\n    u32: UInt32 = 0,\n    i64: Int64 = 0,\n    u64: UInt64 = 0,\n    f32: Float32 = 0.0,\n    f64: Double = 0.0,\n    v8VectorOffset v8: Offset = Offset(),\n    vf64VectorOffset vf64: Offset = Offset()\n  ) -> Offset {\n    let __start = MyGame_Example_TypeAliases.startTypeAliases(&fbb)\n    MyGame_Example_TypeAliases.add(i8: i8, &fbb)\n    MyGame_Example_TypeAliases.add(u8: u8, &fbb)\n    MyGame_Example_TypeAliases.add(i16: i16, &fbb)\n    MyGame_Example_TypeAliases.add(u16: u16, &fbb)\n    MyGame_Example_TypeAliases.add(i32: i32, &fbb)\n    MyGame_Example_TypeAliases.add(u32: u32, &fbb)\n    MyGame_Example_TypeAliases.add(i64: i64, &fbb)\n    MyGame_Example_TypeAliases.add(u64: u64, &fbb)\n    MyGame_Example_TypeAliases.add(f32: f32, &fbb)\n    MyGame_Example_TypeAliases.add(f64: f64, &fbb)\n    MyGame_Example_TypeAliases.addVectorOf(v8: v8, &fbb)\n    MyGame_Example_TypeAliases.addVectorOf(vf64: vf64, &fbb)\n    return MyGame_Example_TypeAliases.endTypeAliases(&fbb, start: __start)\n  }\n\n  public func unpack() -> MyGame_Example_TypeAliasesT {\n    return MyGame_Example_TypeAliasesT(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_TypeAliasesT?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_TypeAliasesT) -> Offset {\n    let __v8 = builder.createVector(obj.v8)\n    let __vf64 = builder.createVector(obj.vf64)\n    let __root = MyGame_Example_TypeAliases.startTypeAliases(&builder)\n    MyGame_Example_TypeAliases.add(i8: obj.i8, &builder)\n    MyGame_Example_TypeAliases.add(u8: obj.u8, &builder)\n    MyGame_Example_TypeAliases.add(i16: obj.i16, &builder)\n    MyGame_Example_TypeAliases.add(u16: obj.u16, &builder)\n    MyGame_Example_TypeAliases.add(i32: obj.i32, &builder)\n    MyGame_Example_TypeAliases.add(u32: obj.u32, &builder)\n    MyGame_Example_TypeAliases.add(i64: obj.i64, &builder)\n    MyGame_Example_TypeAliases.add(u64: obj.u64, &builder)\n    MyGame_Example_TypeAliases.add(f32: obj.f32, &builder)\n    MyGame_Example_TypeAliases.add(f64: obj.f64, &builder)\n    MyGame_Example_TypeAliases.addVectorOf(v8: __v8, &builder)\n    MyGame_Example_TypeAliases.addVectorOf(vf64: __vf64, &builder)\n    return MyGame_Example_TypeAliases.endTypeAliases(&builder, start: __root)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    try _v.visit(field: VT.i8, fieldName: \"i8\", required: false, type: Int8.self)\n    try _v.visit(field: VT.u8, fieldName: \"u8\", required: false, type: UInt8.self)\n    try _v.visit(field: VT.i16, fieldName: \"i16\", required: false, type: Int16.self)\n    try _v.visit(field: VT.u16, fieldName: \"u16\", required: false, type: UInt16.self)\n    try _v.visit(field: VT.i32, fieldName: \"i32\", required: false, type: Int32.self)\n    try _v.visit(field: VT.u32, fieldName: \"u32\", required: false, type: UInt32.self)\n    try _v.visit(field: VT.i64, fieldName: \"i64\", required: false, type: Int64.self)\n    try _v.visit(field: VT.u64, fieldName: \"u64\", required: false, type: UInt64.self)\n    try _v.visit(field: VT.f32, fieldName: \"f32\", required: false, type: Float32.self)\n    try _v.visit(field: VT.f64, fieldName: \"f64\", required: false, type: Double.self)\n    try _v.visit(field: VT.v8, fieldName: \"v8\", required: false, type: ForwardOffset<Vector<Int8, Int8>>.self)\n    try _v.visit(field: VT.vf64, fieldName: \"vf64\", required: false, type: ForwardOffset<Vector<Double, Double>>.self)\n    _v.finish()\n  }\n}\n\nextension MyGame_Example_TypeAliases: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case i8 = \"i8\"\n    case u8 = \"u8\"\n    case i16 = \"i16\"\n    case u16 = \"u16\"\n    case i32 = \"i32\"\n    case u32 = \"u32\"\n    case i64 = \"i64\"\n    case u64 = \"u64\"\n    case f32 = \"f32\"\n    case f64 = \"f64\"\n    case v8 = \"v8\"\n    case vf64 = \"vf64\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    if i8 != 0 {\n      try container.encodeIfPresent(i8, forKey: .i8)\n    }\n    if u8 != 0 {\n      try container.encodeIfPresent(u8, forKey: .u8)\n    }\n    if i16 != 0 {\n      try container.encodeIfPresent(i16, forKey: .i16)\n    }\n    if u16 != 0 {\n      try container.encodeIfPresent(u16, forKey: .u16)\n    }\n    if i32 != 0 {\n      try container.encodeIfPresent(i32, forKey: .i32)\n    }\n    if u32 != 0 {\n      try container.encodeIfPresent(u32, forKey: .u32)\n    }\n    if i64 != 0 {\n      try container.encodeIfPresent(i64, forKey: .i64)\n    }\n    if u64 != 0 {\n      try container.encodeIfPresent(u64, forKey: .u64)\n    }\n    if f32 != 0.0 {\n      try container.encodeIfPresent(f32, forKey: .f32)\n    }\n    if f64 != 0.0 {\n      try container.encodeIfPresent(f64, forKey: .f64)\n    }\n    try container.encodeIfPresent(v8, forKey: .v8)\n    try container.encodeIfPresent(vf64, forKey: .vf64)\n  }\n}\n\npublic class MyGame_Example_TypeAliasesT: NativeObject {\n\n  public var i8: Int8\n  public var u8: UInt8\n  public var i16: Int16\n  public var u16: UInt16\n  public var i32: Int32\n  public var u32: UInt32\n  public var i64: Int64\n  public var u64: UInt64\n  public var f32: Float32\n  public var f64: Double\n  public var v8: [Int8]\n  public var vf64: [Double]\n\n  public init(_ _t: borrowing MyGame_Example_TypeAliases) {\n    i8 = _t.i8\n    u8 = _t.u8\n    i16 = _t.i16\n    u16 = _t.u16\n    i32 = _t.i32\n    u32 = _t.u32\n    i64 = _t.i64\n    u64 = _t.u64\n    f32 = _t.f32\n    f64 = _t.f64\n    v8 = []\n    v8.append(contentsOf: _t.v8)\n    vf64 = []\n    vf64.append(contentsOf: _t.vf64)\n  }\n\n  public init() {\n    i8 = 0\n    u8 = 0\n    i16 = 0\n    u16 = 0\n    i32 = 0\n    u32 = 0\n    i64 = 0\n    u64 = 0\n    f32 = 0.0\n    f64 = 0.0\n    v8 = []\n    vf64 = []\n  }\n\n  public func serialize() -> ByteBuffer { return serialize(type: MyGame_Example_TypeAliases.self) }\n\n}\n"
  },
  {
    "path": "tests/swift/Wasm.tests/Tests/FlexBuffers.Test.Swift.WasmTests/FlexBuffersJSONTests.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Common\nimport FlexBuffers\nimport XCTest\n\nfinal class FlexBuffersJSONTests: XCTestCase {\n  func testEncodingJSON() throws {\n    let buf: ByteBuffer = createProperBuffer().sizedByteBuffer\n    let reference = try getRoot(buffer: buf)!\n\n    let json = reference.jsonString()\n    // swiftformat:disable all\n    XCTAssertEqual(\n      json,\n      \"{\\\"bar\\\": [1, 2, 3], \\\"bar3\\\": [1, 2, 3], \\\"bool\\\": true, \\\"bools\\\": [true, false, true, false], \\\"foo\\\": 100.0, \\\"mymap\\\": {\\\"foo\\\": \\\"Fred\\\"}, \\\"vec\\\": [-100, \\\"Fred\\\", 4.0, \\\"M\\\", false, 4.0]}\"\n    )\n    // swiftformat:enable all\n\n    let data = json.data(using: .utf8)!\n    let decodedData =\n      try JSONSerialization.jsonObject(\n        with: data,\n        options: []) as! [String: Any]\n\n    XCTAssertEqual(decodedData[\"bar\"] as! [Int], [1, 2, 3])\n    XCTAssertEqual(decodedData[\"bar3\"] as! [Int], [1, 2, 3])\n\n    let vec: [Any] = decodedData[\"vec\"] as! [Any]\n    XCTAssertEqual(vec[0] as! Int, -100)\n    XCTAssertEqual(vec[1] as! String, \"Fred\")\n    XCTAssertEqual(vec[2] as! Double, 4.0)\n    XCTAssertEqual(vec[3] as! String, \"M\")\n    XCTAssertEqual(vec[4] as! Bool, false)\n    XCTAssertEqual(vec[5] as! Double, 4.0)\n  }\n}\n"
  },
  {
    "path": "tests/swift/Wasm.tests/Tests/FlexBuffers.Test.Swift.WasmTests/FlexBuffersReaderTests.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Common\nimport XCTest\n\n@testable import FlexBuffers\n\nfinal class FlexBuffersReaderTests: XCTestCase {\n\n  func testReadingProperBuffer() throws {\n    let buf: ByteBuffer = createProperBuffer().byteBuffer\n    try validate(buffer: buf)\n  }\n\n  func testReadingSizedBuffer() throws {\n    let buf: ByteBuffer = createSizedBuffer()\n    try validate(buffer: buf)\n  }\n\n  func testReset() throws {\n    var fbx = FlexBuffersWriter(\n      initialSize: 8,\n      flags: .shareKeysAndStrings)\n    write(fbx: &fbx)\n\n    try validate(buffer: ByteBuffer(bytes: fbx.sizedByteArray))\n    XCTAssertEqual(fbx.capacity, 512)\n    fbx.reset()\n    XCTAssertEqual(fbx.writerIndex, 0)\n    XCTAssertEqual(fbx.capacity, 8)\n\n    write(fbx: &fbx)\n    try validate(buffer: ByteBuffer(bytes: fbx.sizedByteArray))\n    fbx.reset(keepingCapacity: true)\n    XCTAssertEqual(fbx.writerIndex, 0)\n    XCTAssertEqual(fbx.capacity, 512)\n\n    write(fbx: &fbx)\n    try validate(buffer: ByteBuffer(bytes: fbx.sizedByteArray))\n    XCTAssertEqual(fbx.capacity, 512)\n  }\n\n  private func validate(buffer buf: ByteBuffer) throws {\n    let reference = try getRoot(buffer: buf)!\n    XCTAssertEqual(reference.type, .map)\n    let map = reference.map!\n    XCTAssertEqual(map.count, 7)\n    let vecRef = map[\"vec\"]!\n    XCTAssertEqual(vecRef.type, .vector)\n    let vec = vecRef.vector!\n    XCTAssertEqual(vec.count, 6)\n    XCTAssertEqual(vec[0]?.type, .int)\n    XCTAssertEqual(vec[0]?.int, -100)\n    XCTAssertEqual(vec[1]?.type, .string)\n    XCTAssertEqual(vec[1]?.cString, \"Fred\")\n    XCTAssertNil(vec[1]?.int)\n    XCTAssertEqual(vec[2]?.double, 4.0)\n    XCTAssertTrue(vec[3]?.type == .blob)\n\n    let blob = vec[3]!.blob { pointer in\n      Array(pointer)\n    }\n\n    XCTAssertEqual(blob?.count, 1)\n    XCTAssertEqual(blob?[0], 77)\n    XCTAssertEqual(vec[4]?.type, .bool)\n    XCTAssertEqual(vec[4]?.bool, false)\n    XCTAssertEqual(vec[5]?.double, 4.0)  // Shared with vec[2]\n\n    let barVec = map[\"bar\"]!.typedVector!\n    XCTAssertEqual(barVec.count, 3)\n    XCTAssertEqual(barVec[2]?.int, 3)\n    XCTAssertEqual(barVec[2]?.asInt(), UInt8(3))\n\n    let fixedVec = map[\"bar3\"]!.fixedTypedVector!\n    XCTAssertEqual(fixedVec.count, 3)\n    XCTAssertEqual(fixedVec[2]?.int, 3)\n    XCTAssertEqual(fixedVec[2]?.asInt(), UInt8(3))\n    XCTAssertEqual(map[\"bool\"]?.bool, true)\n\n    let boolsVector = map[\"bools\"]!.typedVector!\n    XCTAssertEqual(boolsVector.type, .bool)\n    XCTAssertEqual(boolsVector[0]?.bool, true)\n    XCTAssertEqual(boolsVector[1]?.bool, false)\n\n    let bools = [true, false, true, false]\n    boolsVector.withUnsafeRawBufferPointer { buff in\n      for i in 0..<boolsVector.count {\n        XCTAssertEqual(buff.load(fromByteOffset: i, as: Bool.self), bools[i])\n      }\n    }\n    XCTAssertEqual(map[\"foo\"]?.double, 100)\n    XCTAssertNil(map[\"unknown\"])\n    let mymap = map[\"mymap\"]?.map\n\n    // Check if both addresses used are the same for keys and strings\n    XCTAssertEqual(mymap?.keys[0]?.cString, map.keys[4]?.cString)\n    map.keys[4]?.withUnsafeRawPointer { pointer in\n      mymap?.keys[0]?.withUnsafeRawPointer { mymapPointer in\n        XCTAssertEqual(pointer, mymapPointer)\n      }\n    }\n\n    XCTAssertEqual(mymap?.values[0]?.cString, vec[1]?.cString)\n    vec[1]?.withUnsafeRawPointer { pointer in\n      mymap?.values[0]?.withUnsafeRawPointer { mymapPointer in\n        XCTAssertEqual(pointer, mymapPointer)\n      }\n    }\n  }\n\n  private var path: String {\n    #if os(macOS)\n    // Gets the current path of this test file then\n    // strips out the nested directories.\n    let filePath = URL(filePath: #file)\n      .deletingLastPathComponent()\n      .deletingLastPathComponent()\n      .deletingLastPathComponent()\n    return filePath.absoluteString\n    #else\n    return FileManager.default.currentDirectoryPath\n    #endif\n  }\n\n}\n"
  },
  {
    "path": "tests/swift/Wasm.tests/Tests/FlexBuffers.Test.Swift.WasmTests/FlexBuffersStringTests.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Common\nimport FlexBuffers\nimport XCTest\n\nfinal class FlexBuffersStringTests: XCTestCase {\n\n  func testEncodingUnicodeString() {\n    let text = \"プ画をみて✋\"\n\n    let bytes = text.data(using: .unicode, allowLossyConversion: true)\n    var flx = FlexBuffersWriter()\n    flx.map { writer in\n      writer.add(blob: bytes!, key: \"text\", length: bytes!.count)\n    }\n    flx.finish()\n    let byteBuffer = flx.sizedByteBuffer\n\n    let reference = try! getRoot(buffer: byteBuffer)\n    let root = reference?.map?[\"text\"]\n    let builtString = root?.blob {\n      let data = Data(bytes: $0.baseAddress!, count: Int($0.count))\n      return String(data: data, encoding: .unicode)\n    }\n\n    XCTAssertEqual(builtString, text)\n  }\n}\n"
  },
  {
    "path": "tests/swift/Wasm.tests/Tests/FlexBuffers.Test.Swift.WasmTests/FlexBuffersWriterTests.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Common\nimport FlexBuffers\nimport XCTest\n\nfinal class FlexBuffersWriterTests: XCTestCase {\n  func testDeallocation() {\n    let buf: ByteBuffer = {\n      var fbx = FlexBuffersWriter()\n      fbx.add(string: \"Hello\")\n      fbx.finish()\n      return fbx.sizedByteBuffer\n    }()\n\n    buf.withUnsafeBytes {\n      XCTAssertEqual(\n        Array($0),\n        [5, 72, 101, 108, 108, 111, 0, 6, 20, 1])\n    }\n  }\n\n  func testAddingVectorOfScalars() {\n    var fbx = FlexBuffersWriter()\n    fbx.vector {\n      let arr: [Int32] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 20]\n      $0.create(vector: arr)\n    }\n    fbx.finish()\n    let buf: ByteBuffer = fbx.sizedByteBuffer\n\n    buf.withUnsafeBytes {\n      // swiftformat:disable all\n      XCTAssertEqual(\n        Array($0),\n        [\n          10, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 7, 0,\n          0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 20, 0, 0, 0, 1, 41, 46, 2, 40, 1,\n        ])\n      // swiftformat:enable all\n    }\n  }\n\n  func testAddingVectorOfUnsignedScalars() {\n    var fbx = FlexBuffersWriter()\n    fbx.vector {\n      let arr: [UInt64] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 20]\n      $0.create(vector: arr)\n    }\n    fbx.finish()\n    let buf: ByteBuffer = fbx.sizedByteBuffer\n\n    buf.withUnsafeBytes {\n      // swiftformat:disable all\n      XCTAssertEqual(\n        Array($0),\n        [\n          10, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0,\n          0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0,\n          0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 1,\n          81, 51, 2, 40, 1,\n        ])\n      // swiftformat:enable all\n    }\n  }\n\n  func testAddingVectorOfBools() {\n    var fbx = FlexBuffersWriter()\n    fbx.vector {\n      let arr: [Bool] = [true, false, true, false]\n      $0.create(vector: arr)\n    }\n    fbx.finish()\n    let buf: ByteBuffer = fbx.sizedByteBuffer\n\n    buf.withUnsafeBytes {\n      // swiftformat:disable all\n      XCTAssertEqual(\n        Array($0),\n        [4, 1, 0, 1, 0, 1, 5, 144, 2, 40, 1])\n      // swiftformat:enable all\n    }\n  }\n\n  func testSortingWithinMap() {\n    var fbx = FlexBuffersWriter()\n    fbx.map {\n      $0.add(bool: false, key: \"bool2\")\n      $0.add(bool: true, key: \"bool1\")\n    }\n    fbx.finish()\n    let buf: ByteBuffer = fbx.sizedByteBuffer\n    buf.withUnsafeBytes {\n      // swiftformat:disable all\n      XCTAssertEqual(\n        Array($0),\n        [\n          98, 111, 111, 108, 50, 0, 98, 111, 111, 108, 49, 0, 2, 7, 14, 2, 1, 2, 1, 0, 104, 104, 4,\n          36, 1,\n        ]\n      )\n      // swiftformat:enable all\n    }\n  }\n\n  func testSharingKeyWithinMap() {\n    var fbx = FlexBuffersWriter(initialSize: 1000, flags: .shareKeysAndStrings)\n    fbx.map {\n      $0.add(string: \"welcome\", key: \"welcome\")\n      $0.add(string: \"welcome\", key: \"welcome\")\n      $0.add(string: \"welcome\", key: \"welcome\")\n    }\n    fbx.finish()\n    let buf: ByteBuffer = fbx.sizedByteBuffer\n    buf.withUnsafeBytes {\n      // swiftformat:disable all\n      XCTAssertEqual(\n        Array($0),\n        [\n          119, 101, 108, 99, 111, 109, 101, 0, 7, 119, 101, 108, 99, 111, 109, 101, 0, 3, 18, 19,\n          20, 3, 1, 3, 15, 16, 17, 20, 20, 20, 6, 36, 1,\n        ]\n      )\n      // swiftformat:enable all\n    }\n  }\n\n  func testNestingVectorInMap() {\n    let buf: ByteBuffer = createSizedBuffer()\n\n    buf.withUnsafeBytes {\n      // swiftformat:disable all\n      XCTAssertEqual(\n        Array($0),\n        flexbufferGolden\n      )\n      // swiftformat:enable all\n    }\n  }\n\n  func testAddingNil() {\n    var fbx = FlexBuffersWriter(\n      initialSize: 8,\n      flags: .shareKeysAndStrings)\n\n    fbx.map { map in\n      map.addNil(key: \"v\")\n    }\n\n    fbx.finish()\n    let buf: ByteBuffer = fbx.sizedByteBuffer\n    buf.withUnsafeBytes {\n      // swiftformat:disable all\n      XCTAssertEqual(\n        Array($0),\n        [118, 0, 1, 3, 1, 1, 1, 0, 0, 2, 36, 1]\n      )\n      // swiftformat:enable all\n    }\n  }\n\n  func testAddingManually() {\n    var fbx = FlexBuffersWriter(\n      initialSize: 8,\n      flags: .shareKeysAndStrings)\n\n    let outerMap = fbx.startMap()\n\n    let vector = fbx.startVector(key: \"vec\")\n    fbx.add(int64: -100)\n    fbx.add(string: \"Fred\")\n    fbx.indirect(float32: 4.0)\n    let lv = fbx.lastValue()\n    let blob: [UInt8] = [77]\n    fbx.add(blob: blob, length: blob.count)\n    fbx.add(bool: false)\n    fbx.reuse(value: lv!)\n    fbx.endVector(start: vector)\n\n    let ints: [Int32] = [1, 2, 3]\n    fbx.create(vector: ints, key: \"bar\")\n    fbx.createFixed(vector: ints, key: \"bar3\")\n    let bools = [true, false, true, false]\n    fbx.create(vector: bools, key: \"bools\")\n    fbx.add(bool: true, key: \"bool\")\n    fbx.add(double: 100, key: \"foo\")\n\n    let innerMap = fbx.startMap(key: \"mymap\")\n    fbx.add(string: \"Fred\", key: \"foo\")\n    fbx.endMap(start: innerMap)\n\n    fbx.endMap(start: outerMap)\n\n    fbx.finish()\n    let buf: ByteBuffer = fbx.sizedByteBuffer\n    buf.withUnsafeBytes {\n      // swiftformat:disable all\n      XCTAssertEqual(\n        Array($0),\n        flexbufferGolden\n      )\n      // swiftformat:enable all\n    }\n  }\n\n  func testEncodingAllTypes() {\n    var fbx = FlexBuffersWriter()\n    fbx.vector {\n      $0.indirect(int64: 9)\n      $0.indirect(uint64: 9)\n      $0.indirect(float32: 3)\n      $0.indirect(double: 3)\n\n      $0.addNil()\n      $0.add(bool: true)\n      $0.add(int64: 9)\n      $0.add(int64: -9)\n      $0.add(uint64: 9)\n      $0.add(double: 2.4)\n      $0.add(float32: 2.4)\n      $0.add(double: -2.4)\n      $0.add(float32: -2.4)\n    }\n    fbx.finish()\n    let buf: ByteBuffer = fbx.sizedByteBuffer\n\n    buf.withUnsafeBytes {\n      // swiftformat:disable all\n      XCTAssertEqual(\n        Array($0),\n        allTypesGolden)\n      // swiftformat:enable all\n    }\n  }\n}\n"
  },
  {
    "path": "tests/swift/Wasm.tests/Tests/FlexBuffers.Test.Swift.WasmTests/Mocks.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport FlexBuffers\n\n// swiftformat:disable all\nlet flexbufferGolden: [UInt8] = [\n  118, 101, 99, 0, 4, 70, 114, 101, 100, 0, 0, 0, 0, 0, 128, 64, 1, 77, 6, 156, 15, 9, 5, 0, 12, 4,\n  20, 34, 100, 104, 34, 98, 97, 114, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 98, 97,\n  114, 51, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 98, 111, 111, 108, 115, 0, 4, 1, 0, 1, 0,\n  98, 111, 111, 108, 0, 102, 111, 111, 0, 109, 121, 109, 97, 112, 0, 1, 11, 1, 1, 1, 98, 20, 7, 75,\n  55, 25, 37, 22, 19, 112, 0, 0, 0, 10, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 88, 0, 0, 0, 72, 0, 0, 0,\n  1, 0, 0, 0, 61, 0, 0, 0, 0, 0, 200, 66, 45, 0, 0, 0, 133, 0, 0, 0, 46, 78, 106, 144, 14, 36, 40,\n  35, 38, 1,\n]\n\nlet allTypesGolden: [UInt8] = [\n  9, 9, 0, 0, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0,\n  0, 31, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 1, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 247, 255, 255, 255, 255, 255, 255, 255, 9, 0,\n  0, 0, 0, 0, 0, 0, 51, 51, 51, 51, 51, 51, 3, 64, 0, 0, 0, 64, 51, 51, 3, 64, 51, 51, 51, 51, 51,\n  51, 3, 192, 0, 0, 0, 64, 51, 51, 3, 192, 24, 28, 34, 34, 3, 107, 7, 7, 11, 15, 15, 15, 15, 117,\n  43, 1,\n]\n// swiftformat:enable all\n\n@inline(__always)\nfunc createSizedBuffer() -> ByteBuffer {\n  createProperBuffer().sizedByteBuffer\n}\n\n@inline(__always)\nfunc createProperBuffer() -> FlexBuffersWriter {\n  var fbx = FlexBuffersWriter(\n    initialSize: 8,\n    flags: .shareKeysAndStrings)\n  write(fbx: &fbx)\n  return fbx\n}\n\nfunc write(fbx: inout FlexBuffersWriter) {\n  fbx.map { map in\n    map.vector(key: \"vec\") { v in\n      v.add(int64: -100)\n      v.add(string: \"Fred\")\n      v.indirect(float32: 4.0)\n      let lv = v.lastValue()\n      let blob: [UInt8] = [77]\n      v.add(blob: blob, length: blob.count)\n      v.add(bool: false)\n      v.reuse(value: lv!)\n    }\n    let ints: [Int32] = [1, 2, 3]\n    map.create(vector: ints, key: \"bar\")\n    map.createFixed(vector: ints, key: \"bar3\")\n    let bools = [true, false, true, false]\n    map.create(vector: bools, key: \"bools\")\n    map.add(bool: true, key: \"bool\")\n    map.add(double: 100, key: \"foo\")\n    map.map(key: \"mymap\") { m in\n      m.add(string: \"Fred\", key: \"foo\")\n    }\n  }\n\n  fbx.finish()\n}\n"
  },
  {
    "path": "tests/swift/fuzzer/CodeGenerationTests/empty_vtable.fbs",
    "content": "namespace DataModel;\n\ntable A {\n    a:int (deprecated);\n}\n"
  },
  {
    "path": "tests/swift/fuzzer/CodeGenerationTests/test_import.fbs",
    "content": "table Message {\n  internal_message: string;\n}"
  },
  {
    "path": "tests/swift/fuzzer/CodeGenerationTests/test_import_generated.swift",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// swiftlint:disable all\n// swiftformat:disable all\n\n#if canImport(Common)\n@_implementationOnly import Common\n#endif\n\n@_implementationOnly import FlatBuffers\n\ninternal struct Message: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable, ObjectAPIPacker {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  internal var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  private init(_ t: Table) { _accessor = t }\n  internal init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private struct VT {\n    static let internalMessage: VOffset = 4\n  }\n\n  internal var internalMessage: String? { let o = _accessor.offset(VT.internalMessage); return o == 0 ? nil : _accessor.string(at: o) }\n  internal var internalMessageSegmentArray: [UInt8]? { return _accessor.getVector(at: VT.internalMessage) }\n  internal static func startMessage(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) }\n  internal static func add(internalMessage: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: internalMessage, at: VT.internalMessage) }\n  internal static func endMessage(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n  internal static func createMessage(\n    _ fbb: inout FlatBufferBuilder,\n    internalMessageOffset internalMessage: Offset = Offset()\n  ) -> Offset {\n    let __start = Message.startMessage(&fbb)\n    Message.add(internalMessage: internalMessage, &fbb)\n    return Message.endMessage(&fbb, start: __start)\n  }\n\n  internal func unpack() -> MessageT {\n    return MessageT(self)\n  }\n  internal static func pack(_ builder: inout FlatBufferBuilder, obj: inout MessageT?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  internal static func pack(_ builder: inout FlatBufferBuilder, obj: inout MessageT) -> Offset {\n    let __internalMessage: Offset\n    if let s = obj.internalMessage {\n      __internalMessage = builder.create(string: s)\n    } else {\n      __internalMessage = Offset()\n    }\n\n    let __root = Message.startMessage(&builder)\n    Message.add(internalMessage: __internalMessage, &builder)\n    return Message.endMessage(&builder, start: __root)\n  }\n\n  internal static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    try _v.visit(field: VT.internalMessage, fieldName: \"internalMessage\", required: false, type: ForwardOffset<String>.self)\n    _v.finish()\n  }\n}\n\nextension Message: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case internalMessage = \"internal_message\"\n  }\n\n  internal func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    try container.encodeIfPresent(internalMessage, forKey: .internalMessage)\n  }\n}\n\ninternal class MessageT: NativeObject {\n\n  internal var internalMessage: String?\n\n  internal init(_ _t: borrowing Message) {\n    internalMessage = _t.internalMessage\n  }\n\n  internal init() {\n  }\n\n  internal func serialize() -> ByteBuffer { return serialize(type: Message.self) }\n\n}\n"
  },
  {
    "path": "tests/swift/fuzzer/CodeGenerationTests/test_no_include.fbs",
    "content": "struct BytesCount { \n  x: int64;\n}\n\ntable InternalMessage { \n  str: string;\n}\n\ntable Message { \n  id: int64;\n  position: BytesCount (required);\n  pointer: InternalMessage (required);\n}"
  },
  {
    "path": "tests/swift/fuzzer/CodeGenerationTests/test_no_include_generated.swift",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// swiftlint:disable all\n// swiftformat:disable all\n\npublic struct BytesCount: NativeStruct, FlatbuffersVectorInitializable, Verifiable, FlatbuffersInitializable, NativeObject {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n\n  private var _x: Int64\n\n  public init(_ bb: ByteBuffer, o: Int32) {\n    self = bb.read(def: Self.self, position: Int(o))\n  }\n\n  public init(x: Int64) {\n    _x = x\n  }\n\n  public init() {\n    _x = 0\n  }\n\n  public init(_ _t: borrowing BytesCount_Mutable) {\n    _x = _t.x\n  }\n\n  public var x: Int64 { _x }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    try verifier.inBuffer(position: position, of: BytesCount.self)\n  }\n}\n\nextension BytesCount: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case x = \"x\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    if x != 0 {\n      try container.encodeIfPresent(x, forKey: .x)\n    }\n  }\n}\n\npublic struct BytesCount_Mutable: FlatBufferStruct, FlatbuffersVectorInitializable {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Struct\n\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }\n\n  public var x: Int64 { return _accessor.readBuffer(of: Int64.self, at: 0) }\n  @discardableResult public func mutate(x: Int64) -> Bool { return _accessor.mutate(x, index: 0) }\n\n  public func unpack() -> BytesCount {\n    return BytesCount(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout BytesCount?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout BytesCount) -> Offset {\n    return builder.create(struct: obj)\n  }\n}\n\npublic struct InternalMessage: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable, ObjectAPIPacker {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private struct VT {\n    static let str: VOffset = 4\n  }\n\n  public var str: String? { let o = _accessor.offset(VT.str); return o == 0 ? nil : _accessor.string(at: o) }\n  public var strSegmentArray: [UInt8]? { return _accessor.getVector(at: VT.str) }\n  public static func startInternalMessage(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) }\n  public static func add(str: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: str, at: VT.str) }\n  public static func endInternalMessage(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }\n  public static func createInternalMessage(\n    _ fbb: inout FlatBufferBuilder,\n    strOffset str: Offset = Offset()\n  ) -> Offset {\n    let __start = InternalMessage.startInternalMessage(&fbb)\n    InternalMessage.add(str: str, &fbb)\n    return InternalMessage.endInternalMessage(&fbb, start: __start)\n  }\n\n  public func unpack() -> InternalMessageT {\n    return InternalMessageT(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout InternalMessageT?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout InternalMessageT) -> Offset {\n    let __str: Offset\n    if let s = obj.str {\n      __str = builder.create(string: s)\n    } else {\n      __str = Offset()\n    }\n\n    let __root = InternalMessage.startInternalMessage(&builder)\n    InternalMessage.add(str: __str, &builder)\n    return InternalMessage.endInternalMessage(&builder, start: __root)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    try _v.visit(field: VT.str, fieldName: \"str\", required: false, type: ForwardOffset<String>.self)\n    _v.finish()\n  }\n}\n\nextension InternalMessage: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case str = \"str\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    try container.encodeIfPresent(str, forKey: .str)\n  }\n}\n\npublic class InternalMessageT: NativeObject {\n\n  public var str: String?\n\n  public init(_ _t: borrowing InternalMessage) {\n    str = _t.str\n  }\n\n  public init() {\n  }\n\n  public func serialize() -> ByteBuffer { return serialize(type: InternalMessage.self) }\n\n}\npublic struct Message: FlatBufferTable, FlatbuffersVectorInitializable, Verifiable, ObjectAPIPacker {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private struct VT {\n    static let id: VOffset = 4\n    static let position: VOffset = 6\n    static let pointer: VOffset = 8\n  }\n\n  public var id: Int64 { let o = _accessor.offset(VT.id); return o == 0 ? 0 : _accessor.readBuffer(of: Int64.self, at: o) }\n  @discardableResult public func mutate(id: Int64) -> Bool {let o = _accessor.offset(VT.id);  return _accessor.mutate(id, index: o) }\n  public var position: BytesCount! { let o = _accessor.offset(VT.position); return _accessor.readBuffer(of: BytesCount.self, at: o) }\n  public var mutablePosition: BytesCount_Mutable! { let o = _accessor.offset(VT.position); return BytesCount_Mutable(_accessor.bb, o: o + _accessor.position) }\n  public var pointer: InternalMessage! { let o = _accessor.offset(VT.pointer); return InternalMessage(_accessor.bb, o: _accessor.indirect(o + _accessor.position)) }\n  public static func startMessage(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 3) }\n  public static func add(id: Int64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: id, def: 0, at: VT.id) }\n  public static func add(position: BytesCount?, _ fbb: inout FlatBufferBuilder) { guard let position = position else { return }; fbb.create(struct: position, position: VT.position) }\n  public static func add(pointer: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: pointer, at: VT.pointer) }\n  public static func endMessage(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); fbb.require(table: end, fields: [6, 8]); return end }\n  public static func createMessage(\n    _ fbb: inout FlatBufferBuilder,\n    id: Int64 = 0,\n    position: BytesCount,\n    pointerOffset pointer: Offset\n  ) -> Offset {\n    let __start = Message.startMessage(&fbb)\n    Message.add(id: id, &fbb)\n    Message.add(position: position, &fbb)\n    Message.add(pointer: pointer, &fbb)\n    return Message.endMessage(&fbb, start: __start)\n  }\n\n  public func unpack() -> MessageT {\n    return MessageT(self)\n  }\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MessageT?) -> Offset {\n    guard var obj = obj else { return Offset() }\n    return pack(&builder, obj: &obj)\n  }\n\n  public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MessageT) -> Offset {\n    let __pointer = InternalMessage.pack(&builder, obj: &obj.pointer)\n    let __root = Message.startMessage(&builder)\n    Message.add(id: obj.id, &builder)\n    Message.add(position: obj.position, &builder)\n    Message.add(pointer: __pointer, &builder)\n    return Message.endMessage(&builder, start: __root)\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    try _v.visit(field: VT.id, fieldName: \"id\", required: false, type: Int64.self)\n    try _v.visit(field: VT.position, fieldName: \"position\", required: true, type: BytesCount.self)\n    try _v.visit(field: VT.pointer, fieldName: \"pointer\", required: true, type: ForwardOffset<InternalMessage>.self)\n    _v.finish()\n  }\n}\n\nextension Message: Encodable {\n  enum CodingKeys: String, CodingKey {\n    case id = \"id\"\n    case position = \"position\"\n    case pointer = \"pointer\"\n  }\n\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    if id != 0 {\n      try container.encodeIfPresent(id, forKey: .id)\n    }\n    try container.encodeIfPresent(position, forKey: .position)\n    try container.encodeIfPresent(pointer, forKey: .pointer)\n  }\n}\n\npublic class MessageT: NativeObject {\n\n  public var id: Int64\n  public var position: BytesCount\n  public var pointer: InternalMessageT\n\n  public init(_ _t: borrowing Message) {\n    id = _t.id\n    position = _t.position\n    pointer = _t.pointer!.unpack()\n  }\n\n  public init() {\n    id = 0\n    position = BytesCount()\n    pointer = InternalMessageT()\n  }\n\n  public func serialize() -> ByteBuffer { return serialize(type: Message.self) }\n\n}\n"
  },
  {
    "path": "tests/swift/fuzzer/Package.swift",
    "content": "// swift-tools-version:5.10\n/*\n * Copyright 2020 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport PackageDescription\n\nlet package = Package(\n  name: \"fuzzer\",\n  platforms: [\n    .iOS(.v12),\n    .macOS(.v10_14),\n  ],\n  dependencies: [\n    .package(path: \"../../..\"),\n  ],\n  targets: [\n    .executableTarget(\n      name: \"fuzzer\",\n      dependencies: [\n        .product(name: \"FlatBuffers\", package: \"flatbuffers\"),\n      ]),\n  ])\n"
  },
  {
    "path": "tests/swift/fuzzer/Sources/fuzzer/fuzzer.fbs",
    "content": "enum Color:ubyte (bit_flags) {\n  Red = 0, // color Red = (1u << 0)\n  /// \\brief color Green\n  /// Green is bit_flag with value (1u << 1)\n  Green,\n  /// \\brief color Blue (1u << 3)\n  Blue = 3,\n}\n\nstruct Test { a:short; b:byte; }\n\nstruct Vec3 (force_align: 8) {\n  x:float;\n  y:float;\n  z:float;\n  test1:double;\n  test2:Color;\n  test3:Test;\n}\n\n/// an example documentation comment: \"monster object\"\ntable Monster {\n  pos:Vec3 (id: 0);\n  hp:short = 100 (id: 2);\n  mana:short = 150 (id: 1);\n  name:string (id: 3, key);\n  color:Color = Blue (id: 6);\n  inventory:[ubyte] (id: 5);\n  testarrayoftables:[Monster] (id: 4);\n}\n\nroot_type Monster;\n"
  },
  {
    "path": "tests/swift/fuzzer/Sources/fuzzer/fuzzer_generated.swift",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n// swiftlint:disable all\n// swiftformat:disable all\n\nimport FlatBuffers\n\npublic enum Color: UInt8, Enum, Verifiable {\n  public typealias T = UInt8\n  public static var byteSize: Int { return MemoryLayout<UInt8>.size }\n  public var value: UInt8 { return self.rawValue }\n  case red = 1\n  ///  \\brief color Green\n  ///  Green is bit_flag with value (1u << 1)\n  case green = 2\n  ///  \\brief color Blue (1u << 3)\n  case blue = 8\n\n  public static var max: Color { return .blue }\n  public static var min: Color { return .red }\n}\n\nextension Color: Encodable {\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.singleValueContainer()\n    switch self {\n    case .red: try container.encode(\"Red\")\n    case .green: try container.encode(\"Green\")\n    case .blue: try container.encode(\"Blue\")\n    }\n  }\n}\n\npublic struct Test: NativeStruct, Verifiable, FlatbuffersInitializable {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n\n  private var _a: Int16\n  private var _b: Int8\n  private let padding0__: UInt8 = 0\n\n  public init(_ bb: ByteBuffer, o: Int32) {\n    let _accessor = Struct(bb: bb, position: o)\n    _a = _accessor.readBuffer(of: Int16.self, at: 0)\n    _b = _accessor.readBuffer(of: Int8.self, at: 2)\n  }\n\n  public init(a: Int16, b: Int8) {\n    _a = a\n    _b = b\n  }\n\n  public init() {\n    _a = 0\n    _b = 0\n  }\n\n  public var a: Int16 { _a }\n  public var b: Int8 { _b }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws\n  where T: Verifiable {\n    try verifier.inBuffer(position: position, of: Test.self)\n  }\n}\n\nextension Test: Encodable {\n\n  enum CodingKeys: String, CodingKey {\n    case a = \"a\"\n    case b = \"b\"\n  }\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    if a != 0 {\n      try container.encodeIfPresent(a, forKey: .a)\n    }\n    if b != 0 {\n      try container.encodeIfPresent(b, forKey: .b)\n    }\n  }\n}\n\npublic struct Test_Mutable: FlatBufferObject {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Struct\n\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }\n\n  public var a: Int16 { return _accessor.readBuffer(of: Int16.self, at: 0) }\n  public var b: Int8 { return _accessor.readBuffer(of: Int8.self, at: 2) }\n}\n\npublic struct Vec3: NativeStruct, Verifiable, FlatbuffersInitializable {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n\n  private var _x: Float32\n  private var _y: Float32\n  private var _z: Float32\n  private let padding0__: UInt32 = 0\n  private var _test1: Double\n  private var _test2: UInt8\n  private let padding1__: UInt8 = 0\n  private var _test3: Test\n  private let padding2__: UInt16 = 0\n\n  public init(_ bb: ByteBuffer, o: Int32) {\n    let _accessor = Struct(bb: bb, position: o)\n    _x = _accessor.readBuffer(of: Float32.self, at: 0)\n    _y = _accessor.readBuffer(of: Float32.self, at: 4)\n    _z = _accessor.readBuffer(of: Float32.self, at: 8)\n    _test1 = _accessor.readBuffer(of: Double.self, at: 16)\n    _test2 = _accessor.readBuffer(of: UInt8.self, at: 24)\n    _test3 = Test(_accessor.bb, o: _accessor.position + 26)\n  }\n\n  public init(x: Float32, y: Float32, z: Float32, test1: Double, test2: Color, test3: Test) {\n    _x = x\n    _y = y\n    _z = z\n    _test1 = test1\n    _test2 = test2.value\n    _test3 = test3\n  }\n\n  public init() {\n    _x = 0.0\n    _y = 0.0\n    _z = 0.0\n    _test1 = 0.0\n    _test2 = 0\n    _test3 = Test()\n  }\n\n  public var x: Float32 { _x }\n  public var y: Float32 { _y }\n  public var z: Float32 { _z }\n  public var test1: Double { _test1 }\n  public var test2: Color { Color(rawValue: _test2)! }\n  public var test3: Test { _test3 }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws\n  where T: Verifiable {\n    try verifier.inBuffer(position: position, of: Vec3.self)\n  }\n}\n\nextension Vec3: Encodable {\n\n  enum CodingKeys: String, CodingKey {\n    case x = \"x\"\n    case y = \"y\"\n    case z = \"z\"\n    case test1 = \"test1\"\n    case test2 = \"test2\"\n    case test3 = \"test3\"\n  }\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    if x != 0.0 {\n      try container.encodeIfPresent(x, forKey: .x)\n    }\n    if y != 0.0 {\n      try container.encodeIfPresent(y, forKey: .y)\n    }\n    if z != 0.0 {\n      try container.encodeIfPresent(z, forKey: .z)\n    }\n    if test1 != 0.0 {\n      try container.encodeIfPresent(test1, forKey: .test1)\n    }\n    if test2 != .red {\n      try container.encodeIfPresent(test2, forKey: .test2)\n    }\n    try container.encodeIfPresent(test3, forKey: .test3)\n  }\n}\n\npublic struct Vec3_Mutable: FlatBufferObject {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Struct\n\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }\n\n  public var x: Float32 { return _accessor.readBuffer(of: Float32.self, at: 0) }\n  public var y: Float32 { return _accessor.readBuffer(of: Float32.self, at: 4) }\n  public var z: Float32 { return _accessor.readBuffer(of: Float32.self, at: 8) }\n  public var test1: Double { return _accessor.readBuffer(of: Double.self, at: 16) }\n  public var test2: Color {\n    return Color(rawValue: _accessor.readBuffer(of: UInt8.self, at: 24)) ?? .red\n  }\n  public var test3: Test_Mutable { return Test_Mutable(_accessor.bb, o: _accessor.position + 26) }\n}\n\n///  an example documentation comment: \"monster object\"\npublic struct Monster: FlatBufferObject, Verifiable {\n\n  static func validateVersion() { FlatBuffersVersion_25_12_19() }\n  public var __buffer: ByteBuffer! { return _accessor.bb }\n  private var _accessor: Table\n\n  private init(_ t: Table) { _accessor = t }\n  public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }\n\n  private enum VTOFFSET: VOffset {\n    case pos = 4\n    case mana = 6\n    case hp = 8\n    case name = 10\n    case testarrayoftables = 12\n    case inventory = 14\n    case color = 16\n    var v: Int32 { Int32(self.rawValue) }\n    var p: VOffset { self.rawValue }\n  }\n\n  public var pos: Vec3? {\n    let o = _accessor.offset(VTOFFSET.pos.v)\n    return o == 0 ? nil : _accessor.readBuffer(of: Vec3.self, at: o)\n  }\n  public var mutablePos: Vec3_Mutable? {\n    let o = _accessor.offset(VTOFFSET.pos.v)\n    return o == 0 ? nil : Vec3_Mutable(_accessor.bb, o: o + _accessor.position)\n  }\n  public var mana: Int16 {\n    let o = _accessor.offset(VTOFFSET.mana.v)\n    return o == 0 ? 150 : _accessor.readBuffer(of: Int16.self, at: o)\n  }\n  public var hp: Int16 {\n    let o = _accessor.offset(VTOFFSET.hp.v)\n    return o == 0 ? 100 : _accessor.readBuffer(of: Int16.self, at: o)\n  }\n  public var name: String! {\n    let o = _accessor.offset(VTOFFSET.name.v)\n    return _accessor.string(at: o)\n  }\n  public var nameSegmentArray: [UInt8]! { return _accessor.getVector(at: VTOFFSET.name.v) }\n  public var hasTestarrayoftables: Bool {\n    let o = _accessor.offset(VTOFFSET.testarrayoftables.v)\n    return o == 0 ? false : true\n  }\n  public var testarrayoftablesCount: Int32 {\n    let o = _accessor.offset(VTOFFSET.testarrayoftables.v)\n    return o == 0 ? 0 : _accessor.vector(count: o)\n  }\n  public func testarrayoftables(at index: Int32) -> Monster? {\n    let o = _accessor.offset(VTOFFSET.testarrayoftables.v)\n    return o == 0\n      ? nil : Monster(_accessor.bb, o: _accessor.indirect(_accessor.vector(at: o) + index * 4))\n  }\n  public func testarrayoftablesBy(key: String) -> Monster? {\n    let o = _accessor.offset(VTOFFSET.testarrayoftables.v)\n    return o == 0\n      ? nil : Monster.lookupByKey(vector: _accessor.vector(at: o), key: key, fbb: _accessor.bb)\n  }\n  public var hasInventory: Bool {\n    let o = _accessor.offset(VTOFFSET.inventory.v)\n    return o == 0 ? false : true\n  }\n  public var inventoryCount: Int32 {\n    let o = _accessor.offset(VTOFFSET.inventory.v)\n    return o == 0 ? 0 : _accessor.vector(count: o)\n  }\n  public func inventory(at index: Int32) -> UInt8 {\n    let o = _accessor.offset(VTOFFSET.inventory.v)\n    return o == 0\n      ? 0 : _accessor.directRead(of: UInt8.self, offset: _accessor.vector(at: o) + index * 1)\n  }\n  public var inventory: [UInt8] { return _accessor.getVector(at: VTOFFSET.inventory.v) ?? [] }\n  public func withUnsafePointerToInventory<T>(_ body: (UnsafeRawBufferPointer) throws -> T) rethrows\n    -> T?\n  { return try _accessor.withUnsafePointerToSlice(at: VTOFFSET.inventory.v, body: body) }\n  public var color: Color {\n    let o = _accessor.offset(VTOFFSET.color.v)\n    return o == 0 ? .blue : Color(rawValue: _accessor.readBuffer(of: UInt8.self, at: o)) ?? .blue\n  }\n  public static func startMonster(_ fbb: inout FlatBufferBuilder) -> UOffset {\n    fbb.startTable(with: 7)\n  }\n  public static func add(pos: Vec3?, _ fbb: inout FlatBufferBuilder) {\n    guard let pos = pos else { return }\n    fbb.create(struct: pos, position: VTOFFSET.pos.p)\n  }\n  public static func add(mana: Int16, _ fbb: inout FlatBufferBuilder) {\n    fbb.add(element: mana, def: 150, at: VTOFFSET.mana.p)\n  }\n  public static func add(hp: Int16, _ fbb: inout FlatBufferBuilder) {\n    fbb.add(element: hp, def: 100, at: VTOFFSET.hp.p)\n  }\n  public static func add(name: Offset, _ fbb: inout FlatBufferBuilder) {\n    fbb.add(offset: name, at: VTOFFSET.name.p)\n  }\n  public static func addVectorOf(testarrayoftables: Offset, _ fbb: inout FlatBufferBuilder) {\n    fbb.add(offset: testarrayoftables, at: VTOFFSET.testarrayoftables.p)\n  }\n  public static func addVectorOf(inventory: Offset, _ fbb: inout FlatBufferBuilder) {\n    fbb.add(offset: inventory, at: VTOFFSET.inventory.p)\n  }\n  public static func add(color: Color, _ fbb: inout FlatBufferBuilder) {\n    fbb.add(element: color.rawValue, def: 8, at: VTOFFSET.color.p)\n  }\n  public static func endMonster(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset {\n    let end = Offset(offset: fbb.endTable(at: start))\n    fbb.require(table: end, fields: [10])\n    return end\n  }\n  public static func createMonster(\n    _ fbb: inout FlatBufferBuilder,\n    pos: Vec3? = nil,\n    mana: Int16 = 150,\n    hp: Int16 = 100,\n    nameOffset name: Offset,\n    testarrayoftablesVectorOffset testarrayoftables: Offset = Offset(),\n    inventoryVectorOffset inventory: Offset = Offset(),\n    color: Color = .blue\n  ) -> Offset {\n    let __start = Monster.startMonster(&fbb)\n    Monster.add(pos: pos, &fbb)\n    Monster.add(mana: mana, &fbb)\n    Monster.add(hp: hp, &fbb)\n    Monster.add(name: name, &fbb)\n    Monster.addVectorOf(testarrayoftables: testarrayoftables, &fbb)\n    Monster.addVectorOf(inventory: inventory, &fbb)\n    Monster.add(color: color, &fbb)\n    return Monster.endMonster(&fbb, start: __start)\n  }\n  public static func sortVectorOfMonster(offsets: [Offset], _ fbb: inout FlatBufferBuilder)\n    -> Offset\n  {\n    var off = offsets\n    off.sort {\n      Table.compare(\n        Table.offset(Int32($1.o), vOffset: 10, fbb: &fbb),\n        Table.offset(Int32($0.o), vOffset: 10, fbb: &fbb), fbb: &fbb) < 0\n    }\n    return fbb.createVector(ofOffsets: off)\n  }\n  fileprivate static func lookupByKey(vector: Int32, key: String, fbb: ByteBuffer) -> Monster? {\n    let key = key.utf8.map { $0 }\n    var span = fbb.read(def: Int32.self, position: Int(vector - 4))\n    var start: Int32 = 0\n    while span != 0 {\n      var middle = span / 2\n      let tableOffset = Table.indirect(vector + 4 * (start + middle), fbb)\n      let comp = Table.compare(\n        Table.offset(Int32(fbb.capacity) - tableOffset, vOffset: 10, fbb: fbb), key, fbb: fbb)\n      if comp > 0 {\n        span = middle\n      } else if comp < 0 {\n        middle += 1\n        start += middle\n        span -= middle\n      } else {\n        return Monster(fbb, o: tableOffset)\n      }\n    }\n    return nil\n  }\n\n  public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws\n  where T: Verifiable {\n    var _v = try verifier.visitTable(at: position)\n    try _v.visit(field: VTOFFSET.pos.p, fieldName: \"pos\", required: false, type: Vec3.self)\n    try _v.visit(field: VTOFFSET.mana.p, fieldName: \"mana\", required: false, type: Int16.self)\n    try _v.visit(field: VTOFFSET.hp.p, fieldName: \"hp\", required: false, type: Int16.self)\n    try _v.visit(\n      field: VTOFFSET.name.p, fieldName: \"name\", required: true, type: ForwardOffset<String>.self)\n    try _v.visit(\n      field: VTOFFSET.testarrayoftables.p, fieldName: \"testarrayoftables\", required: false,\n      type: ForwardOffset<Vector<ForwardOffset<Monster>, Monster>>.self)\n    try _v.visit(\n      field: VTOFFSET.inventory.p, fieldName: \"inventory\", required: false,\n      type: ForwardOffset<Vector<UInt8, UInt8>>.self)\n    try _v.visit(field: VTOFFSET.color.p, fieldName: \"color\", required: false, type: Color.self)\n    _v.finish()\n  }\n}\n\nextension Monster: Encodable {\n\n  enum CodingKeys: String, CodingKey {\n    case pos = \"pos\"\n    case mana = \"mana\"\n    case hp = \"hp\"\n    case name = \"name\"\n    case testarrayoftables = \"testarrayoftables\"\n    case inventory = \"inventory\"\n    case color = \"color\"\n  }\n  public func encode(to encoder: Encoder) throws {\n    var container = encoder.container(keyedBy: CodingKeys.self)\n    try container.encodeIfPresent(pos, forKey: .pos)\n    if mana != 150 {\n      try container.encodeIfPresent(mana, forKey: .mana)\n    }\n    if hp != 100 {\n      try container.encodeIfPresent(hp, forKey: .hp)\n    }\n    try container.encodeIfPresent(name, forKey: .name)\n    if testarrayoftablesCount > 0 {\n      var contentEncoder = container.nestedUnkeyedContainer(forKey: .testarrayoftables)\n      for index in 0..<testarrayoftablesCount {\n        guard let type = testarrayoftables(at: index) else { continue }\n        try contentEncoder.encode(type)\n      }\n    }\n    if inventoryCount > 0 {\n      try container.encodeIfPresent(inventory, forKey: .inventory)\n    }\n    if color != .blue {\n      try container.encodeIfPresent(color, forKey: .color)\n    }\n  }\n}\n"
  },
  {
    "path": "tests/swift/fuzzer/Sources/fuzzer/main.swift",
    "content": "/*\n * Copyright 2024 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport FlatBuffers\n\n@_cdecl(\"LLVMFuzzerTestOneInput\")\npublic func FuzzFlatbuffers(_ start: UnsafeRawPointer, _ count: Int) -> CInt {\n  let bytes = UnsafeRawBufferPointer(start: start, count: count)\n  do {\n    var buffer = ByteBuffer(contiguousBytes: bytes, count: count)\n    let _: Monster = try getCheckedRoot(byteBuffer: &buffer)\n  } catch {\n  }\n\n  return 0\n}\n"
  },
  {
    "path": "tests/test.cpp",
    "content": "/*\n * Copyright 2014 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#include <stdint.h>\n\n#include <cmath>\n#include <limits>\n#include <memory>\n#include <string>\n\n#if defined(__ANDROID__)\n#define INCLUDE_64_BIT_TESTS 0\n#else\n#define INCLUDE_64_BIT_TESTS 1\n#endif\n\n#if __has_include(\"third_party/absl/container/flat_hash_set.h\")\n#define HAS_ABSL_CONTAINERS 1\n#endif\n\n#ifdef HAS_ABSL_CONTAINERS\n#include \"third_party/absl/container/flat_hash_set.h\"\n#endif\n#include \"alignment_test.h\"\n#include \"cross_namespace_pack_test_generated.h\"\n#include \"default_vectors_strings_test.h\"\n#include \"evolution_test.h\"\n#include \"flatbuffers/flatbuffers.h\"\n#include \"flatbuffers/idl.h\"\n#include \"flatbuffers/minireflect.h\"\n#include \"flatbuffers/reflection_generated.h\"\n#include \"flatbuffers/registry.h\"\n#include \"flatbuffers/util.h\"\n#include \"fuzz_test.h\"\n#include \"json_test.h\"\n#include \"key_field_test.h\"\n#include \"monster_test.h\"\n#include \"monster_test_generated.h\"\n#include \"native_inline_table_test_generated.h\"\n#include \"optional_scalars_test.h\"\n#include \"parser_test.h\"\n#include \"proto_test.h\"\n#include \"reflection_test.h\"\n#include \"tests/union_vector/union_vector_generated.h\"\n#include \"union_underlying_type_test_generated.h\"\n#if !defined(_MSC_VER) || _MSC_VER >= 1700\n#include \"tests/arrays_test_generated.h\"\n#endif\n#if INCLUDE_64_BIT_TESTS\n#include \"tests/64bit/offset64_test.h\"\n#endif\n#include \"flexbuffers_test.h\"\n#include \"is_quiet_nan.h\"\n#include \"monster_test_bfbs_generated.h\"  // Generated using --bfbs-comments --bfbs-builtins --cpp --bfbs-gen-embed\n#include \"native_type_test_generated.h\"\n#include \"test_assert.h\"\n#include \"util_test.h\"\n#include \"vector_table_naked_ptr_test.h\"\n\nvoid FlatBufferBuilderTest();\n\nnamespace flatbuffers {\nnamespace tests {\nnamespace {\n\n// clang-format off\n// Check that char* and uint8_t* are interoperable types.\n// The reinterpret_cast<> between the pointers are used to simplify data loading.\nstatic_assert(flatbuffers::is_same<uint8_t, char>::value ||\n              flatbuffers::is_same<uint8_t, unsigned char>::value,\n              \"unexpected uint8_t type\");\n\n#if defined(FLATBUFFERS_HAS_NEW_STRTOD) && (FLATBUFFERS_HAS_NEW_STRTOD > 0)\n  // Ensure IEEE-754 support if tests of floats with NaN/Inf will run.\n  static_assert(std::numeric_limits<float>::is_iec559 &&\n                std::numeric_limits<double>::is_iec559,\n                \"IEC-559 (IEEE-754) standard required\");\n#endif\n// clang-format on\n\nusing namespace MyGame::Example;\n\nvoid TriviallyCopyableTest() {\n  // clang-format off\n  #if __GNUG__ && __GNUC__ < 5 && \\\n      !(defined(__clang__) && __clang_major__ >= 16)\n    TEST_EQ(__is_trivially_copyable(Vec3), true);\n  #else\n    #if __cplusplus >= 201103L\n      TEST_EQ(std::is_trivially_copyable<Vec3>::value, true);\n    #endif\n  #endif\n  // clang-format on\n}\n\n// Guard against -Wunused-function on platforms without file tests.\n#ifndef FLATBUFFERS_NO_FILE_TESTS\nvoid GenerateTableTextTest(const std::string& tests_data_path) {\n  std::string schemafile;\n  std::string jsonfile;\n  bool ok =\n      flatbuffers::LoadFile((tests_data_path + \"monster_test.fbs\").c_str(),\n                            false, &schemafile) &&\n      flatbuffers::LoadFile((tests_data_path + \"monsterdata_test.json\").c_str(),\n                            false, &jsonfile);\n  TEST_EQ(ok, true);\n  auto include_test_path =\n      flatbuffers::ConCatPathFileName(tests_data_path, \"include_test\");\n  const char* include_directories[] = {tests_data_path.c_str(),\n                                       include_test_path.c_str(), nullptr};\n  flatbuffers::IDLOptions opt;\n  opt.indent_step = -1;\n  flatbuffers::Parser parser(opt);\n  ok = parser.Parse(schemafile.c_str(), include_directories) &&\n       parser.Parse(jsonfile.c_str(), include_directories);\n  TEST_EQ(ok, true);\n  // Test root table\n  const Monster* monster = GetMonster(parser.builder_.GetBufferPointer());\n  const auto abilities = monster->testarrayofsortedstruct();\n  TEST_EQ(abilities->size(), 3);\n  TEST_EQ(abilities->Get(0)->id(), 0);\n  TEST_EQ(abilities->Get(0)->distance(), 45);\n  TEST_EQ(abilities->Get(1)->id(), 1);\n  TEST_EQ(abilities->Get(1)->distance(), 21);\n  TEST_EQ(abilities->Get(2)->id(), 5);\n  TEST_EQ(abilities->Get(2)->distance(), 12);\n\n  std::string jsongen;\n  auto result =\n      GenTextFromTable(parser, monster, \"MyGame.Example.Monster\", &jsongen);\n  TEST_NULL(result);\n  // Test sub table\n  const Vec3* pos = monster->pos();\n  jsongen.clear();\n  result = GenTextFromTable(parser, pos, \"MyGame.Example.Vec3\", &jsongen);\n  TEST_NULL(result);\n  TEST_EQ_STR(\n      jsongen.c_str(),\n      \"{x: 1.0,y: 2.0,z: 3.0,test1: 3.0,test2: \\\"Green\\\",test3: {a: 5,b: 6}}\");\n  const Test& test3 = pos->test3();\n  jsongen.clear();\n  result = GenTextFromTable(parser, &test3, \"MyGame.Example.Test\", &jsongen);\n  TEST_NULL(result);\n  TEST_EQ_STR(jsongen.c_str(), \"{a: 5,b: 6}\");\n  const Test* test4 = monster->test4()->Get(0);\n  jsongen.clear();\n  result = GenTextFromTable(parser, test4, \"MyGame.Example.Test\", &jsongen);\n  TEST_NULL(result);\n  TEST_EQ_STR(jsongen.c_str(), \"{a: 10,b: 20}\");\n}\n\nvoid MultiFileNameClashTest(const std::string& tests_data_path) {\n  const auto name_clash_path =\n      flatbuffers::ConCatPathFileName(tests_data_path, \"name_clash_test\");\n  const char* include_directories[] = {name_clash_path.c_str()};\n\n  // Load valid 2 file Flatbuffer schema\n  const auto valid_path =\n      flatbuffers::ConCatPathFileName(name_clash_path, \"valid_test1.fbs\");\n  std::string valid_schema;\n  TEST_ASSERT(flatbuffers::LoadFile(valid_path.c_str(), false, &valid_schema));\n  // Clashing table and union names in different namespaces must be parsable\n  TEST_ASSERT(\n      flatbuffers::Parser().Parse(valid_schema.c_str(), include_directories));\n\n  flatbuffers::Parser p;\n  TEST_ASSERT(p.Parse(valid_schema.c_str(), include_directories));\n\n  // Load invalid 2 file Flatbuffer schema\n  const auto invalid_path =\n      flatbuffers::ConCatPathFileName(name_clash_path, \"invalid_test1.fbs\");\n  std::string invalid_schema;\n  TEST_ASSERT(\n      flatbuffers::LoadFile(invalid_path.c_str(), false, &invalid_schema));\n  // Clashing table and union names in same namespace must fail to parse\n  TEST_EQ(\n      flatbuffers::Parser().Parse(invalid_schema.c_str(), include_directories),\n      false);\n}\n\nvoid InvalidNestedFlatbufferTest(const std::string& tests_data_path) {\n  // First, load and parse FlatBuffer schema (.fbs)\n  std::string schemafile;\n  TEST_EQ(flatbuffers::LoadFile((tests_data_path + \"monster_test.fbs\").c_str(),\n                                false, &schemafile),\n          true);\n  auto include_test_path =\n      flatbuffers::ConCatPathFileName(tests_data_path, \"include_test\");\n  const char* include_directories[] = {tests_data_path.c_str(),\n                                       include_test_path.c_str(), nullptr};\n  flatbuffers::Parser parser1;\n  TEST_EQ(parser1.Parse(schemafile.c_str(), include_directories), true);\n\n  // \"color\" inside nested flatbuffer contains invalid enum value\n  TEST_EQ(parser1.Parse(\"{ name: \\\"Bender\\\", testnestedflatbuffer: { name: \"\n                        \"\\\"Leela\\\", color: \\\"nonexistent\\\"}}\"),\n          false);\n}\n\nvoid UnionVectorTest(const std::string& tests_data_path) {\n  // load FlatBuffer fbs schema and json.\n  std::string schemafile, jsonfile;\n  TEST_EQ(flatbuffers::LoadFile(\n              (tests_data_path + \"union_vector/union_vector.fbs\").c_str(),\n              false, &schemafile),\n          true);\n  TEST_EQ(flatbuffers::LoadFile(\n              (tests_data_path + \"union_vector/union_vector.json\").c_str(),\n              false, &jsonfile),\n          true);\n\n  // parse schema.\n  flatbuffers::IDLOptions idl_opts;\n  idl_opts.lang_to_generate |= flatbuffers::IDLOptions::kBinary;\n  flatbuffers::Parser parser(idl_opts);\n  TEST_EQ(parser.Parse(schemafile.c_str()), true);\n\n  flatbuffers::FlatBufferBuilder fbb;\n\n  // union types.\n  std::vector<uint8_t> types;\n  types.push_back(static_cast<uint8_t>(Character_Belle));\n  types.push_back(static_cast<uint8_t>(Character_MuLan));\n  types.push_back(static_cast<uint8_t>(Character_BookFan));\n  types.push_back(static_cast<uint8_t>(Character_Other));\n  types.push_back(static_cast<uint8_t>(Character_Unused));\n\n  // union values.\n  std::vector<flatbuffers::Offset<void>> characters;\n  characters.push_back(fbb.CreateStruct(BookReader(/*books_read=*/7)).Union());\n  characters.push_back(CreateAttacker(fbb, /*sword_attack_damage=*/5).Union());\n  characters.push_back(fbb.CreateStruct(BookReader(/*books_read=*/2)).Union());\n  characters.push_back(fbb.CreateString(\"Other\").Union());\n  characters.push_back(fbb.CreateString(\"Unused\").Union());\n\n  // create Movie.\n  const auto movie_offset =\n      CreateMovie(fbb, Character_Rapunzel,\n                  fbb.CreateStruct(Rapunzel(/*hair_length=*/6)).Union(),\n                  fbb.CreateVector(types), fbb.CreateVector(characters));\n  FinishMovieBuffer(fbb, movie_offset);\n\n  flatbuffers::Verifier verifier(fbb.GetBufferPointer(), fbb.GetSize());\n  TEST_EQ(VerifyMovieBuffer(verifier), true);\n\n  auto flat_movie = GetMovie(fbb.GetBufferPointer());\n\n  auto TestMovie = [](const Movie* movie) {\n    TEST_EQ(movie->main_character_type() == Character_Rapunzel, true);\n\n    auto cts = movie->characters_type();\n    TEST_EQ(movie->characters_type()->size(), 5);\n    TEST_EQ(cts->GetEnum<Character>(0) == Character_Belle, true);\n    TEST_EQ(cts->GetEnum<Character>(1) == Character_MuLan, true);\n    TEST_EQ(cts->GetEnum<Character>(2) == Character_BookFan, true);\n    TEST_EQ(cts->GetEnum<Character>(3) == Character_Other, true);\n    TEST_EQ(cts->GetEnum<Character>(4) == Character_Unused, true);\n\n    auto rapunzel = movie->main_character_as_Rapunzel();\n    TEST_NOTNULL(rapunzel);\n    TEST_EQ(rapunzel->hair_length(), 6);\n\n    auto cs = movie->characters();\n    TEST_EQ(cs->size(), 5);\n    auto belle = cs->GetAs<BookReader>(0);\n    TEST_EQ(belle->books_read(), 7);\n    auto mu_lan = cs->GetAs<Attacker>(1);\n    TEST_EQ(mu_lan->sword_attack_damage(), 5);\n    auto book_fan = cs->GetAs<BookReader>(2);\n    TEST_EQ(book_fan->books_read(), 2);\n    auto other = cs->GetAsString(3);\n    TEST_EQ_STR(other->c_str(), \"Other\");\n    auto unused = cs->GetAsString(4);\n    TEST_EQ_STR(unused->c_str(), \"Unused\");\n  };\n\n  TestMovie(flat_movie);\n\n  // Also test the JSON we loaded above.\n  TEST_EQ(parser.Parse(jsonfile.c_str()), true);\n  auto jbuf = parser.builder_.GetBufferPointer();\n  flatbuffers::Verifier jverifier(jbuf, parser.builder_.GetSize());\n  TEST_EQ(VerifyMovieBuffer(jverifier), true);\n  TestMovie(GetMovie(jbuf));\n\n  auto movie_object = flat_movie->UnPack();\n  TEST_EQ(movie_object->main_character.AsRapunzel()->hair_length(), 6);\n  TEST_EQ(movie_object->characters[0].AsBelle()->books_read(), 7);\n  TEST_EQ(movie_object->characters[1].AsMuLan()->sword_attack_damage, 5);\n  TEST_EQ(movie_object->characters[2].AsBookFan()->books_read(), 2);\n  TEST_EQ_STR(movie_object->characters[3].AsOther()->c_str(), \"Other\");\n  TEST_EQ_STR(movie_object->characters[4].AsUnused()->c_str(), \"Unused\");\n\n  fbb.Clear();\n  fbb.Finish(Movie::Pack(fbb, movie_object));\n\n  delete movie_object;\n\n  auto repacked_movie = GetMovie(fbb.GetBufferPointer());\n\n  TestMovie(repacked_movie);\n\n  // Generate text using mini-reflection.\n  auto s =\n      flatbuffers::FlatBufferToString(fbb.GetBufferPointer(), MovieTypeTable());\n  TEST_EQ_STR(\n      s.c_str(),\n      \"{ main_character_type: Rapunzel, main_character: { hair_length: 6 }, \"\n      \"characters_type: [ Belle, MuLan, BookFan, Other, Unused ], \"\n      \"characters: [ { books_read: 7 }, { sword_attack_damage: 5 }, \"\n      \"{ books_read: 2 }, \\\"Other\\\", \\\"Unused\\\" ] }\");\n\n  flatbuffers::ToStringVisitor visitor(\"\\n\", true, \"  \");\n  IterateFlatBuffer(fbb.GetBufferPointer(), MovieTypeTable(), &visitor);\n  TEST_EQ_STR(visitor.s.c_str(),\n              \"{\\n\"\n              \"  \\\"main_character_type\\\": \\\"Rapunzel\\\",\\n\"\n              \"  \\\"main_character\\\": {\\n\"\n              \"    \\\"hair_length\\\": 6\\n\"\n              \"  },\\n\"\n              \"  \\\"characters_type\\\": [\\n\"\n              \"    \\\"Belle\\\",\\n\"\n              \"    \\\"MuLan\\\",\\n\"\n              \"    \\\"BookFan\\\",\\n\"\n              \"    \\\"Other\\\",\\n\"\n              \"    \\\"Unused\\\"\\n\"\n              \"  ],\\n\"\n              \"  \\\"characters\\\": [\\n\"\n              \"    {\\n\"\n              \"      \\\"books_read\\\": 7\\n\"\n              \"    },\\n\"\n              \"    {\\n\"\n              \"      \\\"sword_attack_damage\\\": 5\\n\"\n              \"    },\\n\"\n              \"    {\\n\"\n              \"      \\\"books_read\\\": 2\\n\"\n              \"    },\\n\"\n              \"    \\\"Other\\\",\\n\"\n              \"    \\\"Unused\\\"\\n\"\n              \"  ]\\n\"\n              \"}\");\n\n  // Generate text using parsed schema.\n  std::string jsongen;\n  auto result = GenText(parser, fbb.GetBufferPointer(), &jsongen);\n  TEST_NULL(result);\n  TEST_EQ_STR(jsongen.c_str(),\n              \"{\\n\"\n              \"  main_character_type: \\\"Rapunzel\\\",\\n\"\n              \"  main_character: {\\n\"\n              \"    hair_length: 6\\n\"\n              \"  },\\n\"\n              \"  characters_type: [\\n\"\n              \"    \\\"Belle\\\",\\n\"\n              \"    \\\"MuLan\\\",\\n\"\n              \"    \\\"BookFan\\\",\\n\"\n              \"    \\\"Other\\\",\\n\"\n              \"    \\\"Unused\\\"\\n\"\n              \"  ],\\n\"\n              \"  characters: [\\n\"\n              \"    {\\n\"\n              \"      books_read: 7\\n\"\n              \"    },\\n\"\n              \"    {\\n\"\n              \"      sword_attack_damage: 5\\n\"\n              \"    },\\n\"\n              \"    {\\n\"\n              \"      books_read: 2\\n\"\n              \"    },\\n\"\n              \"    \\\"Other\\\",\\n\"\n              \"    \\\"Unused\\\"\\n\"\n              \"  ]\\n\"\n              \"}\\n\");\n\n  // Simple test with reflection.\n  parser.Serialize();\n  auto schema = reflection::GetSchema(parser.builder_.GetBufferPointer());\n  auto ok = flatbuffers::Verify(*schema, *schema->root_table(),\n                                fbb.GetBufferPointer(), fbb.GetSize());\n  TEST_EQ(ok, true);\n\n  flatbuffers::Parser parser2(idl_opts);\n  TEST_EQ(parser2.Parse(\"struct Bool { b:bool; }\"\n                        \"union Any { Bool }\"\n                        \"table Root { a:Any; }\"\n                        \"root_type Root;\"),\n          true);\n  TEST_EQ(parser2.Parse(\"{a_type:Bool,a:{b:true}}\"), true);\n}\n#endif\n\nvoid EndianSwapTest() {\n  TEST_EQ(flatbuffers::EndianSwap(static_cast<int16_t>(0x1234)), 0x3412);\n  TEST_EQ(flatbuffers::EndianSwap(static_cast<int32_t>(0x12345678)),\n          0x78563412);\n  TEST_EQ(flatbuffers::EndianSwap(static_cast<int64_t>(0x1234567890ABCDEF)),\n          0xEFCDAB9078563412);\n  TEST_EQ(flatbuffers::EndianSwap(flatbuffers::EndianSwap(3.14f)), 3.14f);\n}\n\nvoid UninitializedVectorTest() {\n  flatbuffers::FlatBufferBuilder builder;\n\n  Test* buf = nullptr;\n  auto vector_offset =\n      builder.CreateUninitializedVectorOfStructs<Test>(2, &buf);\n  TEST_NOTNULL(buf);\n  buf[0] = Test(10, 20);\n  buf[1] = Test(30, 40);\n\n  auto required_name = builder.CreateString(\"myMonster\");\n  auto monster_builder = MonsterBuilder(builder);\n  monster_builder.add_name(\n      required_name);  // required field mandated for monster.\n  monster_builder.add_test4(vector_offset);\n  builder.Finish(monster_builder.Finish());\n\n  auto p = builder.GetBufferPointer();\n  auto uvt = flatbuffers::GetRoot<Monster>(p);\n  TEST_NOTNULL(uvt);\n  auto vec = uvt->test4();\n  TEST_NOTNULL(vec);\n  auto test_0 = vec->Get(0);\n  auto test_1 = vec->Get(1);\n  TEST_EQ(test_0->a(), 10);\n  TEST_EQ(test_0->b(), 20);\n  TEST_EQ(test_1->a(), 30);\n  TEST_EQ(test_1->b(), 40);\n}\n\nvoid EqualOperatorTest() {\n  MonsterT a;\n  MonsterT b;\n  // We have to reset the fields that are NaN to zero to allow the equality\n  // to evaluate to true.\n  TEST_EQ(std::isnan(a.nan_default), true);\n  TEST_EQ(std::isnan(b.nan_default), true);\n  a.nan_default = 0;\n  b.nan_default = 0;\n  TEST_EQ(b == a, true);\n  TEST_EQ(b != a, false);\n\n  b.mana = 33;\n  TEST_EQ(b == a, false);\n  TEST_EQ(b != a, true);\n  b.mana = 150;\n  TEST_EQ(b == a, true);\n  TEST_EQ(b != a, false);\n\n  b.inventory.push_back(3);\n  TEST_EQ(b == a, false);\n  TEST_EQ(b != a, true);\n  b.inventory.clear();\n  TEST_EQ(b == a, true);\n  TEST_EQ(b != a, false);\n\n  a.enemy.reset(new MonsterT());\n  a.enemy->nan_default = 0;\n  TEST_EQ(b != a, true);\n  a.enemy->mana = 33;\n  TEST_EQ(b == a, false);\n  TEST_EQ(b != a, true);\n\n  b.enemy.reset(new MonsterT());\n  b.enemy->nan_default = 0;\n  TEST_EQ(b == a, false);\n  TEST_EQ(b != a, true);\n  b.enemy->mana = 33;\n  TEST_EQ(b == a, true);\n  TEST_EQ(b != a, false);\n\n  a.enemy.reset(nullptr);\n  TEST_EQ(b == a, false);\n  TEST_EQ(b != a, true);\n  b.enemy->mana = 150;\n  TEST_EQ(b == a, false);\n  TEST_EQ(b != a, true);\n  a.enemy.reset(new MonsterT());\n  a.enemy->nan_default = 0;\n  TEST_EQ(b == a, true);\n  TEST_EQ(b != a, false);\n\n  b.enemy.reset(nullptr);\n\n  b.test.type = Any_Monster;\n  TEST_EQ(b == a, false);\n  TEST_EQ(b != a, true);\n\n  // Test that vector of tables are compared by value and not by reference.\n  {\n    // Two tables are equal by default.\n    MonsterT a, b;\n    a.nan_default = 0;\n    b.nan_default = 0;\n    TEST_EQ(a == b, true);\n\n    // Adding only a table to one of the monster vectors should make it not\n    // equal (due to size mistmatch).\n    a.testarrayoftables.push_back(\n        flatbuffers::unique_ptr<MonsterT>(new MonsterT));\n    a.testarrayoftables.back()->nan_default = 0;\n    TEST_EQ(a == b, false);\n\n    // Adding an equalivant table to the other monster vector should make it\n    // equal again.\n    b.testarrayoftables.push_back(\n        flatbuffers::unique_ptr<MonsterT>(new MonsterT));\n    b.testarrayoftables.back()->nan_default = 0;\n    TEST_EQ(a == b, true);\n\n    // Create two new monsters that are different.\n    auto c = flatbuffers::unique_ptr<MonsterT>(new MonsterT);\n    auto d = flatbuffers::unique_ptr<MonsterT>(new MonsterT);\n    c->nan_default = 0;\n    d->nan_default = 0;\n    c->hp = 1;\n    d->hp = 2;\n    TEST_EQ(c == d, false);\n\n    // Adding them to the original monsters should also make them different.\n    a.testarrayoftables.push_back(std::move(c));\n    b.testarrayoftables.push_back(std::move(d));\n    TEST_EQ(a == b, false);\n\n    // Remove the mismatching monsters to get back to equality\n    a.testarrayoftables.pop_back();\n    b.testarrayoftables.pop_back();\n    TEST_EQ(a == b, true);\n\n    // Check that nullptr are OK.\n    a.testarrayoftables.push_back(nullptr);\n    b.testarrayoftables.push_back(\n        flatbuffers::unique_ptr<MonsterT>(new MonsterT));\n    TEST_EQ(a == b, false);\n  }\n}\n\nvoid CreateSharedStringTest() {\n  flatbuffers::FlatBufferBuilder builder;\n  const auto one1 = builder.CreateSharedString(\"one\");\n  const auto two = builder.CreateSharedString(\"two\");\n  const auto one2 = builder.CreateSharedString(\"one\");\n  TEST_EQ(one1.o, one2.o);\n  const auto onetwo = builder.CreateSharedString(\"onetwo\");\n  TEST_EQ(onetwo.o != one1.o, true);\n  TEST_EQ(onetwo.o != two.o, true);\n\n  // Support for embedded nulls\n  const char chars_b[] = {'a', '\\0', 'b'};\n  const char chars_c[] = {'a', '\\0', 'c'};\n  const auto null_b1 = builder.CreateSharedString(chars_b, sizeof(chars_b));\n  const auto null_c = builder.CreateSharedString(chars_c, sizeof(chars_c));\n  const auto null_b2 = builder.CreateSharedString(chars_b, sizeof(chars_b));\n  TEST_EQ(null_b1.o != null_c.o, true);  // Issue#5058 repro\n  TEST_EQ(null_b1.o, null_b2.o);\n\n  // Put the strings into an array for round trip verification.\n  std::array<flatbuffers::Offset<flatbuffers::String>, 7> array = {\n      one1, two, one2, onetwo, null_b1, null_c, null_b2};\n  const auto vector_offset =\n      builder.CreateVector<flatbuffers::Offset<flatbuffers::String>>(array);\n  MonsterBuilder monster_builder(builder);\n  monster_builder.add_name(two);\n  monster_builder.add_testarrayofstring(vector_offset);\n  builder.Finish(monster_builder.Finish());\n\n  // Read the Monster back.\n  const auto* monster =\n      flatbuffers::GetRoot<Monster>(builder.GetBufferPointer());\n  TEST_EQ_STR(monster->name()->c_str(), \"two\");\n  const auto* testarrayofstring = monster->testarrayofstring();\n  TEST_EQ(testarrayofstring->size(), flatbuffers::uoffset_t(7));\n  const auto& a = *testarrayofstring;\n  TEST_EQ_STR(a[0]->c_str(), \"one\");\n  TEST_EQ_STR(a[1]->c_str(), \"two\");\n  TEST_EQ_STR(a[2]->c_str(), \"one\");\n  TEST_EQ_STR(a[3]->c_str(), \"onetwo\");\n  TEST_EQ(a[4]->str(), (std::string(chars_b, sizeof(chars_b))));\n  TEST_EQ(a[5]->str(), (std::string(chars_c, sizeof(chars_c))));\n  TEST_EQ(a[6]->str(), (std::string(chars_b, sizeof(chars_b))));\n\n  // Make sure String::operator< works, too, since it is related to\n  // StringOffsetCompare.\n  TEST_EQ((*a[0]) < (*a[1]), true);\n  TEST_EQ((*a[1]) < (*a[0]), false);\n  TEST_EQ((*a[1]) < (*a[2]), false);\n  TEST_EQ((*a[2]) < (*a[1]), true);\n  TEST_EQ((*a[4]) < (*a[3]), true);\n  TEST_EQ((*a[5]) < (*a[4]), false);\n  TEST_EQ((*a[5]) < (*a[4]), false);\n  TEST_EQ((*a[6]) < (*a[5]), true);\n}\n\n#if !defined(FLATBUFFERS_USE_STD_SPAN) && !defined(FLATBUFFERS_SPAN_MINIMAL)\nvoid FlatbuffersSpanTest() {\n  // Compile-time checking of non-const [] to const [] conversions.\n  using flatbuffers::internal::is_span_convertible;\n  (void)is_span_convertible<int, 1, int, 1>::type(123);\n  (void)is_span_convertible<const int, 1, int, 1>::type(123);\n  (void)is_span_convertible<const int64_t, 1, int64_t, 1>::type(123);\n  (void)is_span_convertible<const uint64_t, 1, uint64_t, 1>::type(123);\n  (void)is_span_convertible<const int, 1, const int, 1>::type(123);\n  (void)is_span_convertible<const int64_t, 1, const int64_t, 1>::type(123);\n  (void)is_span_convertible<const uint64_t, 1, const uint64_t, 1>::type(123);\n\n  using flatbuffers::span;\n  span<char, 0> c1;\n  TEST_EQ(c1.size(), 0);\n  span<char, flatbuffers::dynamic_extent> c2;\n  TEST_EQ(c2.size(), 0);\n  span<char> c3;\n  TEST_EQ(c3.size(), 0);\n  TEST_ASSERT(c1.empty() && c2.empty() && c3.empty());\n\n  int i_data7[7] = {0, 1, 2, 3, 4, 5, 6};\n  span<int, 7> i1(&i_data7[0], 7);\n  span<int> i2(i1);  // make dynamic from static\n  TEST_EQ(i1.size(), 7);\n  TEST_EQ(i1.empty(), false);\n  TEST_EQ(i1.size(), i2.size());\n  TEST_EQ(i1.data(), i_data7);\n  TEST_EQ(i1[2], 2);\n  // Make const span from a non-const one.\n  span<const int, 7> i3(i1);\n  // Construct from a C-array.\n  span<int, 7> i4(i_data7);\n  span<const int, 7> i5(i_data7);\n  span<int> i6(i_data7);\n  span<const int> i7(i_data7);\n  TEST_EQ(i7.size(), 7);\n  // Check construction from a const array.\n  const int i_cdata5[5] = {4, 3, 2, 1, 0};\n  span<const int, 5> i8(i_cdata5);\n  span<const int> i9(i_cdata5);\n  TEST_EQ(i9.size(), 5);\n  // Construction from a (ptr, size) pair.\n  span<int, 7> i10(i_data7, 7);\n  span<int> i11(i_data7, 7);\n  TEST_EQ(i11.size(), 7);\n  span<const int, 5> i12(i_cdata5, 5);\n  span<const int> i13(i_cdata5, 5);\n  TEST_EQ(i13.size(), 5);\n  // Construction from std::array.\n  std::array<int, 6> i_arr6 = {{0, 1, 2, 3, 4, 5}};\n  span<int, 6> i14(i_arr6);\n  span<const int, 6> i15(i_arr6);\n  span<int> i16(i_arr6);\n  span<const int> i17(i_arr6);\n  TEST_EQ(i17.size(), 6);\n  const std::array<int, 8> i_carr8 = {{0, 1, 2, 3, 4, 5, 6, 7}};\n  span<const int, 8> i18(i_carr8);\n  span<const int> i19(i_carr8);\n  TEST_EQ(i18.size(), 8);\n  TEST_EQ(i19.size(), 8);\n  TEST_EQ(i19[7], 7);\n  // Check compatibility with flatbuffers::Array.\n  int fbs_int3_underlaying[3] = {0};\n  int fbs_int3_data[3] = {1, 2, 3};\n  auto& fbs_int3 = flatbuffers::CastToArray(fbs_int3_underlaying);\n  fbs_int3.CopyFromSpan(fbs_int3_data);\n  TEST_EQ(fbs_int3.Get(1), 2);\n  const int fbs_cint3_data[3] = {2, 3, 4};\n  fbs_int3.CopyFromSpan(fbs_cint3_data);\n  TEST_EQ(fbs_int3.Get(1), 3);\n  // Check with Array<Enum, N>\n  enum class Dummy : uint16_t { Zero = 0, One, Two };\n  Dummy fbs_dummy3_underlaying[3] = {};\n  Dummy fbs_dummy3_data[3] = {Dummy::One, Dummy::Two, Dummy::Two};\n  auto& fbs_dummy3 = flatbuffers::CastToArray(fbs_dummy3_underlaying);\n  fbs_dummy3.CopyFromSpan(fbs_dummy3_data);\n  TEST_EQ(fbs_dummy3.Get(1), Dummy::Two);\n}\n#else\nvoid FlatbuffersSpanTest() {}\n#endif\n\n// VS10 does not support typed enums, exclude from tests\n#if !defined(_MSC_VER) || _MSC_VER >= 1700\nvoid FixedLengthArrayTest() {\n  // Generate an ArrayTable containing one ArrayStruct.\n  flatbuffers::FlatBufferBuilder fbb;\n  MyGame::Example::NestedStruct nStruct0(MyGame::Example::TestEnum::B);\n  TEST_NOTNULL(nStruct0.mutable_a());\n  nStruct0.mutable_a()->Mutate(0, 1);\n  nStruct0.mutable_a()->Mutate(1, 2);\n  TEST_NOTNULL(nStruct0.mutable_c());\n  nStruct0.mutable_c()->Mutate(0, MyGame::Example::TestEnum::C);\n  nStruct0.mutable_c()->Mutate(1, MyGame::Example::TestEnum::A);\n  TEST_NOTNULL(nStruct0.mutable_d());\n  nStruct0.mutable_d()->Mutate(0, flatbuffers::numeric_limits<int64_t>::max());\n  nStruct0.mutable_d()->Mutate(1, flatbuffers::numeric_limits<int64_t>::min());\n  MyGame::Example::NestedStruct nStruct1(MyGame::Example::TestEnum::C);\n  TEST_NOTNULL(nStruct1.mutable_a());\n  nStruct1.mutable_a()->Mutate(0, 3);\n  nStruct1.mutable_a()->Mutate(1, 4);\n  TEST_NOTNULL(nStruct1.mutable_c());\n  nStruct1.mutable_c()->Mutate(0, MyGame::Example::TestEnum::C);\n  nStruct1.mutable_c()->Mutate(1, MyGame::Example::TestEnum::A);\n  TEST_NOTNULL(nStruct1.mutable_d());\n  nStruct1.mutable_d()->Mutate(0, flatbuffers::numeric_limits<int64_t>::min());\n  nStruct1.mutable_d()->Mutate(1, flatbuffers::numeric_limits<int64_t>::max());\n  MyGame::Example::ArrayStruct aStruct(2, 12, 1);\n  TEST_NOTNULL(aStruct.b());\n  TEST_NOTNULL(aStruct.mutable_b());\n  TEST_NOTNULL(aStruct.mutable_d());\n  TEST_NOTNULL(aStruct.mutable_f());\n  for (int i = 0; i < aStruct.b()->size(); i++)\n    aStruct.mutable_b()->Mutate(i, i + 1);\n  aStruct.mutable_d()->Mutate(0, nStruct0);\n  aStruct.mutable_d()->Mutate(1, nStruct1);\n  auto aTable = MyGame::Example::CreateArrayTable(fbb, &aStruct);\n  MyGame::Example::FinishArrayTableBuffer(fbb, aTable);\n  // Verify correctness of the ArrayTable.\n  flatbuffers::Verifier verifier(fbb.GetBufferPointer(), fbb.GetSize());\n  TEST_ASSERT(MyGame::Example::VerifyArrayTableBuffer(verifier));\n  // Do test.\n  auto p = MyGame::Example::GetMutableArrayTable(fbb.GetBufferPointer());\n  auto mArStruct = p->mutable_a();\n  TEST_NOTNULL(mArStruct);\n  TEST_NOTNULL(mArStruct->b());\n  TEST_NOTNULL(mArStruct->d());\n  TEST_NOTNULL(mArStruct->f());\n  TEST_NOTNULL(mArStruct->mutable_b());\n  TEST_NOTNULL(mArStruct->mutable_d());\n  TEST_NOTNULL(mArStruct->mutable_f());\n  TEST_EQ(mArStruct->a(), 2);\n  TEST_EQ(mArStruct->b()->size(), 15);\n  mArStruct->mutable_b()->Mutate(14, -14);\n  TEST_EQ(mArStruct->b()->Get(14), -14);\n  TEST_EQ(mArStruct->c(), 12);\n  TEST_NOTNULL(mArStruct->d()->Get(0));\n  TEST_NOTNULL(mArStruct->d()->Get(0)->a());\n  TEST_EQ(mArStruct->d()->Get(0)->a()->Get(0), 1);\n  TEST_EQ(mArStruct->d()->Get(0)->a()->Get(1), 2);\n  TEST_NOTNULL(mArStruct->d()->Get(1));\n  TEST_NOTNULL(mArStruct->d()->Get(1)->a());\n  TEST_EQ(mArStruct->d()->Get(1)->a()->Get(0), 3);\n  TEST_EQ(mArStruct->d()->Get(1)->a()->Get(1), 4);\n  TEST_NOTNULL(mArStruct->mutable_d()->GetMutablePointer(1));\n  TEST_NOTNULL(mArStruct->mutable_d()->GetMutablePointer(1)->mutable_a());\n  mArStruct->mutable_d()->GetMutablePointer(1)->mutable_a()->Mutate(1, 5);\n  TEST_EQ(5, mArStruct->d()->Get(1)->a()->Get(1));\n  TEST_EQ(MyGame::Example::TestEnum::B, mArStruct->d()->Get(0)->b());\n  TEST_NOTNULL(mArStruct->d()->Get(0)->c());\n  TEST_EQ(MyGame::Example::TestEnum::C, mArStruct->d()->Get(0)->c()->Get(0));\n  TEST_EQ(MyGame::Example::TestEnum::A, mArStruct->d()->Get(0)->c()->Get(1));\n  TEST_EQ(flatbuffers::numeric_limits<int64_t>::max(),\n          mArStruct->d()->Get(0)->d()->Get(0));\n  TEST_EQ(flatbuffers::numeric_limits<int64_t>::min(),\n          mArStruct->d()->Get(0)->d()->Get(1));\n  TEST_EQ(MyGame::Example::TestEnum::C, mArStruct->d()->Get(1)->b());\n  TEST_NOTNULL(mArStruct->d()->Get(1)->c());\n  TEST_EQ(MyGame::Example::TestEnum::C, mArStruct->d()->Get(1)->c()->Get(0));\n  TEST_EQ(MyGame::Example::TestEnum::A, mArStruct->d()->Get(1)->c()->Get(1));\n  TEST_EQ(flatbuffers::numeric_limits<int64_t>::min(),\n          mArStruct->d()->Get(1)->d()->Get(0));\n  TEST_EQ(flatbuffers::numeric_limits<int64_t>::max(),\n          mArStruct->d()->Get(1)->d()->Get(1));\n  for (int i = 0; i < mArStruct->b()->size() - 1; i++)\n    TEST_EQ(mArStruct->b()->Get(i), i + 1);\n  // Check alignment\n  TEST_EQ(0, reinterpret_cast<uintptr_t>(mArStruct->d()) % 8);\n  TEST_EQ(0, reinterpret_cast<uintptr_t>(mArStruct->f()) % 8);\n\n  // Check if default constructor set all memory zero\n  const size_t arr_size = sizeof(MyGame::Example::ArrayStruct);\n  char non_zero_memory[arr_size];\n  // set memory chunk of size ArrayStruct to 1's\n  std::memset(static_cast<void*>(non_zero_memory), 1, arr_size);\n  // after placement-new it should be all 0's\n#if defined(FLATBUFFERS_MEMORY_LEAK_TRACKING) && defined(_MSC_VER) && \\\n    defined(_DEBUG)\n#undef new\n#endif\n  MyGame::Example::ArrayStruct* ap =\n      new (non_zero_memory) MyGame::Example::ArrayStruct;\n#if defined(FLATBUFFERS_MEMORY_LEAK_TRACKING) && defined(_MSC_VER) && \\\n    defined(_DEBUG)\n#define new DEBUG_NEW\n#endif\n  (void)ap;\n  for (size_t i = 0; i < arr_size; ++i) {\n    TEST_EQ(non_zero_memory[i], 0);\n  }\n}\n#else\nvoid FixedLengthArrayTest() {}\n#endif  // !defined(_MSC_VER) || _MSC_VER >= 1700\n\n#if !defined(FLATBUFFERS_SPAN_MINIMAL) && \\\n    (!defined(_MSC_VER) || _MSC_VER >= 1700)\nvoid FixedLengthArrayConstructorTest() {\n  const int32_t nested_a[2] = {1, 2};\n  MyGame::Example::TestEnum nested_c[2] = {MyGame::Example::TestEnum::A,\n                                           MyGame::Example::TestEnum::B};\n  const int64_t int64_2[2] = {-2, -1};\n\n  std::array<MyGame::Example::NestedStruct, 2> init_d = {\n      {MyGame::Example::NestedStruct(nested_a, MyGame::Example::TestEnum::B,\n                                     nested_c, int64_2),\n       MyGame::Example::NestedStruct(nested_a, MyGame::Example::TestEnum::A,\n                                     nested_c,\n                                     std::array<int64_t, 2>{{12, 13}})}};\n\n  MyGame::Example::ArrayStruct arr_struct(\n      8.125,\n      std::array<int32_t, 0xF>{\n          {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}},\n      -17, init_d, 10, int64_2);\n  TEST_EQ(arr_struct.a(), 8.125);\n  TEST_EQ(arr_struct.b()->Get(2), 3);\n  TEST_EQ(arr_struct.c(), -17);\n\n  TEST_NOTNULL(arr_struct.d());\n  const auto& arr_d_0 = *arr_struct.d()->Get(0);\n  TEST_EQ(arr_d_0.a()->Get(0), 1);\n  TEST_EQ(arr_d_0.a()->Get(1), 2);\n  TEST_EQ(arr_d_0.b(), MyGame::Example::TestEnum::B);\n  TEST_EQ(arr_d_0.c()->Get(0), MyGame::Example::TestEnum::A);\n  TEST_EQ(arr_d_0.c()->Get(1), MyGame::Example::TestEnum::B);\n  TEST_EQ(arr_d_0.d()->Get(0), -2);\n  TEST_EQ(arr_d_0.d()->Get(1), -1);\n  const auto& arr_d_1 = *arr_struct.d()->Get(1);\n  TEST_EQ(arr_d_1.a()->Get(0), 1);\n  TEST_EQ(arr_d_1.a()->Get(1), 2);\n  TEST_EQ(arr_d_1.b(), MyGame::Example::TestEnum::A);\n  TEST_EQ(arr_d_1.c()->Get(0), MyGame::Example::TestEnum::A);\n  TEST_EQ(arr_d_1.c()->Get(1), MyGame::Example::TestEnum::B);\n  TEST_EQ(arr_d_1.d()->Get(0), 12);\n  TEST_EQ(arr_d_1.d()->Get(1), 13);\n\n  TEST_EQ(arr_struct.e(), 10);\n  TEST_EQ(arr_struct.f()->Get(0), -2);\n  TEST_EQ(arr_struct.f()->Get(1), -1);\n\n  // Test for each loop over NestedStruct entries\n  for (auto i : *arr_struct.d()) {\n    for (auto a : *i->a()) {\n      TEST_EQ(a, 1);\n      break;  // one iteration is enough, just testing compilation\n    }\n    TEST_EQ(i->b(), MyGame::Example::TestEnum::B);\n    for (auto c : *i->c()) {\n      TEST_EQ(c, MyGame::Example::TestEnum::A);\n      break;  // one iteration is enough, just testing compilation\n    }\n    for (auto d : *i->d()) {\n      TEST_EQ(d, -2);\n      break;  // one iteration is enough, just testing compilation\n    }\n    break;  // one iteration is enough, just testing compilation\n  }\n}\n#else\nvoid FixedLengthArrayConstructorTest() {}\n#endif\n\nvoid FixedLengthArrayOperatorEqualTest() {\n  const int32_t nested_a[2] = {1, 2};\n  MyGame::Example::TestEnum nested_c[2] = {MyGame::Example::TestEnum::A,\n                                           MyGame::Example::TestEnum::B};\n\n  MyGame::Example::TestEnum nested_cc[2] = {MyGame::Example::TestEnum::A,\n                                            MyGame::Example::TestEnum::C};\n  const int64_t int64_2[2] = {-2, -1};\n\n  std::array<MyGame::Example::NestedStruct, 2> init_d = {\n      {MyGame::Example::NestedStruct(nested_a, MyGame::Example::TestEnum::B,\n                                     nested_c, int64_2),\n       MyGame::Example::NestedStruct(nested_a, MyGame::Example::TestEnum::B,\n                                     nested_c,\n                                     std::array<int64_t, 2>{{-2, -1}})}};\n\n  auto different = MyGame::Example::NestedStruct(\n      nested_a, MyGame::Example::TestEnum::B, nested_cc,\n      std::array<int64_t, 2>{{-2, -1}});\n\n  TEST_ASSERT(init_d[0] == init_d[1]);\n  TEST_ASSERT(init_d[0] != different);\n\n  std::array<MyGame::Example::ArrayStruct, 3> arr_struct = {\n      MyGame::Example::ArrayStruct(\n          8.125,\n          std::array<int32_t, 0xF>{\n              {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}},\n          -17, init_d, 10, int64_2),\n\n      MyGame::Example::ArrayStruct(\n          8.125,\n          std::array<int32_t, 0xF>{\n              {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}},\n          -17, init_d, 10, int64_2),\n\n      MyGame::Example::ArrayStruct(\n          8.125,\n          std::array<int32_t, 0xF>{\n              {1000, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}},\n          -17, init_d, 10, int64_2)};\n\n  TEST_ASSERT(arr_struct[0] == arr_struct[1]);\n  TEST_ASSERT(arr_struct[1] != arr_struct[2]);\n}\n\nvoid NativeTypeTest() {\n  const int N = 3;\n\n  Geometry::ApplicationDataT src_data;\n  src_data.position = flatbuffers::unique_ptr<Native::Vector3D>(\n      new Native::Vector3D(1.0f, 2.0f, 3.0f));\n  src_data.position_inline = Native::Vector3D(4.0f, 5.0f, 6.0f);\n  src_data.vectors.reserve(N);\n  src_data.vectors_alt.reserve(N);\n\n  for (int i = 0; i < N; ++i) {\n    src_data.vectors.push_back(\n        Native::Vector3D(10 * i + 0.1f, 10 * i + 0.2f, 10 * i + 0.3f));\n    src_data.vectors_alt.push_back(\n        Native::Vector3D(20 * i + 0.1f, 20 * i + 0.2f, 20 * i + 0.3f));\n  }\n\n  src_data.matrix = std::unique_ptr<Native::Matrix>(new Native::Matrix(1, 2));\n  src_data.matrix->values = {3, 4};\n\n  for (int i = 0; i < N; ++i) {\n    src_data.matrices.push_back(\n        std::unique_ptr<Native::Matrix>(new Native::Matrix(1, i)));\n    std::fill(src_data.matrices[i]->values.begin(),\n              src_data.matrices[i]->values.end(), i + 0.5f);\n  }\n\n  flatbuffers::FlatBufferBuilder fbb;\n  fbb.Finish(Geometry::ApplicationData::Pack(fbb, &src_data));\n\n  auto dstDataT = Geometry::UnPackApplicationData(fbb.GetBufferPointer());\n\n  TEST_EQ(dstDataT->position->x, 1.0f);\n  TEST_EQ(dstDataT->position->y, 2.0f);\n  TEST_EQ(dstDataT->position->z, 3.0f);\n  TEST_EQ(dstDataT->position_inline.x, 4.0f);\n  TEST_EQ(dstDataT->position_inline.y, 5.0f);\n  TEST_EQ(dstDataT->position_inline.z, 6.0f);\n\n  for (int i = 0; i < N; ++i) {\n    const Native::Vector3D& v = dstDataT->vectors[i];\n    TEST_EQ(v.x, 10 * i + 0.1f);\n    TEST_EQ(v.y, 10 * i + 0.2f);\n    TEST_EQ(v.z, 10 * i + 0.3f);\n\n    const Native::Vector3D& v2 = dstDataT->vectors_alt[i];\n    TEST_EQ(v2.x, 20 * i + 0.1f);\n    TEST_EQ(v2.y, 20 * i + 0.2f);\n    TEST_EQ(v2.z, 20 * i + 0.3f);\n  }\n\n  TEST_EQ(dstDataT->matrix->rows, 1);\n  TEST_EQ(dstDataT->matrix->columns, 2);\n  TEST_EQ(dstDataT->matrix->values[0], 3);\n  TEST_EQ(dstDataT->matrix->values[1], 4);\n\n  for (int i = 0; i < N; ++i) {\n    const Native::Matrix& m = *dstDataT->matrices[i];\n    TEST_EQ(m.rows, 1);\n    TEST_EQ(m.columns, i);\n    for (int j = 0; j < i; ++j) {\n      TEST_EQ(m.values[j], i + 0.5f);\n    }\n  }\n}\n\n// Guard against -Wunused-function on platforms without file tests.\n#ifndef FLATBUFFERS_NO_FILE_TESTS\n// VS10 does not support typed enums, exclude from tests\n#if !defined(_MSC_VER) || _MSC_VER >= 1700\nvoid FixedLengthArrayJsonTest(const std::string& tests_data_path, bool binary) {\n  // load FlatBuffer schema (.fbs) and JSON from disk\n  std::string schemafile;\n  std::string jsonfile;\n  TEST_EQ(flatbuffers::LoadFile(\n              (tests_data_path + \"arrays_test.\" + (binary ? \"bfbs\" : \"fbs\"))\n                  .c_str(),\n              binary, &schemafile),\n          true);\n  TEST_EQ(\n      flatbuffers::LoadFile((tests_data_path + \"arrays_test.golden\").c_str(),\n                            false, &jsonfile),\n      true);\n\n  // parse schema first, so we can use it to parse the data after\n  flatbuffers::Parser parserOrg, parserGen;\n  if (binary) {\n    flatbuffers::Verifier verifier(\n        reinterpret_cast<const uint8_t*>(schemafile.c_str()),\n        schemafile.size());\n    TEST_EQ(reflection::VerifySchemaBuffer(verifier), true);\n    TEST_EQ(parserOrg.Deserialize(\n                reinterpret_cast<const uint8_t*>(schemafile.c_str()),\n                schemafile.size()),\n            true);\n    TEST_EQ(parserGen.Deserialize(\n                reinterpret_cast<const uint8_t*>(schemafile.c_str()),\n                schemafile.size()),\n            true);\n  } else {\n    TEST_EQ(parserOrg.Parse(schemafile.c_str()), true);\n    TEST_EQ(parserGen.Parse(schemafile.c_str()), true);\n  }\n  TEST_EQ(parserOrg.Parse(jsonfile.c_str()), true);\n\n  // First, verify it, just in case:\n  flatbuffers::Verifier verifierOrg(parserOrg.builder_.GetBufferPointer(),\n                                    parserOrg.builder_.GetSize());\n  TEST_EQ(VerifyArrayTableBuffer(verifierOrg), true);\n\n  // Export to JSON\n  std::string jsonGen;\n  TEST_NULL(\n      GenText(parserOrg, parserOrg.builder_.GetBufferPointer(), &jsonGen));\n\n  // Import from JSON\n  TEST_EQ(parserGen.Parse(jsonGen.c_str()), true);\n\n  // Verify buffer from generated JSON\n  flatbuffers::Verifier verifierGen(parserGen.builder_.GetBufferPointer(),\n                                    parserGen.builder_.GetSize());\n  TEST_EQ(VerifyArrayTableBuffer(verifierGen), true);\n\n  // Compare generated buffer to original\n  TEST_EQ(parserOrg.builder_.GetSize(), parserGen.builder_.GetSize());\n  TEST_EQ(std::memcmp(parserOrg.builder_.GetBufferPointer(),\n                      parserGen.builder_.GetBufferPointer(),\n                      parserOrg.builder_.GetSize()),\n          0);\n}\n\nvoid FixedLengthArraySpanTest(const std::string& tests_data_path) {\n  // load FlatBuffer schema (.fbs) and JSON from disk\n  std::string schemafile;\n  std::string jsonfile;\n  TEST_EQ(flatbuffers::LoadFile((tests_data_path + \"arrays_test.fbs\").c_str(),\n                                false, &schemafile),\n          true);\n  TEST_EQ(\n      flatbuffers::LoadFile((tests_data_path + \"arrays_test.golden\").c_str(),\n                            false, &jsonfile),\n      true);\n\n  // parse schema first, so we can use it to parse the data after\n  flatbuffers::Parser parser;\n  TEST_EQ(parser.Parse(schemafile.c_str()), true);\n  TEST_EQ(parser.Parse(jsonfile.c_str()), true);\n  auto& fbb = parser.builder_;\n  auto verifier = flatbuffers::Verifier(fbb.GetBufferPointer(), fbb.GetSize());\n  TEST_EQ(true, VerifyArrayTableBuffer(verifier));\n\n  auto p = MyGame::Example::GetMutableArrayTable(fbb.GetBufferPointer());\n  TEST_NOTNULL(p);\n  auto table_struct = p->mutable_a();\n  TEST_NOTNULL(table_struct);\n  TEST_EQ(2, table_struct->d()->size());\n  TEST_NOTNULL(table_struct->d());\n  TEST_NOTNULL(table_struct->mutable_d());\n  // test array of structs\n  auto const_d = flatbuffers::make_span(*table_struct->d());\n  auto mutable_d = flatbuffers::make_span(*table_struct->mutable_d());\n  TEST_EQ(2, const_d.size());\n  TEST_EQ(2, mutable_d.size());\n  TEST_ASSERT(const_d[0] == mutable_d[0]);\n  TEST_ASSERT(const_d[1] == mutable_d[1]);\n  mutable_d[0] = const_d[0];  // mutate\n  // test scalars\n  auto& const_nested = const_d[0];\n  auto& mutable_nested = mutable_d[0];\n  static_assert(sizeof(MyGame::Example::TestEnum) == sizeof(uint8_t),\n                \"TestEnum's underlaying type must by byte\");\n  TEST_NOTNULL(const_nested.d());\n  TEST_NOTNULL(mutable_nested.d());\n  {\n    flatbuffers::span<const MyGame::Example::TestEnum, 2> const_d_c =\n        flatbuffers::make_span(*const_nested.c());\n    auto mutable_d_c = flatbuffers::make_span(*mutable_nested.mutable_c());\n    TEST_EQ(2, const_d_c.size());\n    TEST_EQ(2, mutable_d_c.size());\n    TEST_EQ(MyGame::Example::TestEnum::C, const_d_c[0]);\n    TEST_EQ(MyGame::Example::TestEnum::B, const_d_c[1]);\n    TEST_ASSERT(mutable_d_c.end() == std::copy(const_d_c.begin(),\n                                               const_d_c.end(),\n                                               mutable_d_c.begin()));\n    TEST_ASSERT(\n        std::equal(const_d_c.begin(), const_d_c.end(), mutable_d_c.begin()));\n  }\n  // test little endian array of int32\n#if FLATBUFFERS_LITTLEENDIAN\n  {\n    flatbuffers::span<const int32_t, 2> const_d_a =\n        flatbuffers::make_span(*const_nested.a());\n    auto mutable_d_a = flatbuffers::make_span(*mutable_nested.mutable_a());\n    TEST_EQ(2, const_d_a.size());\n    TEST_EQ(2, mutable_d_a.size());\n    TEST_EQ(-1, const_d_a[0]);\n    TEST_EQ(2, const_d_a[1]);\n    TEST_ASSERT(mutable_d_a.end() == std::copy(const_d_a.begin(),\n                                               const_d_a.end(),\n                                               mutable_d_a.begin()));\n    TEST_ASSERT(\n        std::equal(const_d_a.begin(), const_d_a.end(), mutable_d_a.begin()));\n  }\n#endif\n}\n#else\nvoid FixedLengthArrayJsonTest(bool /*binary*/) {}\nvoid FixedLengthArraySpanTest() {}\n#endif\n\nvoid TestEmbeddedBinarySchema(const std::string& tests_data_path) {\n  // load JSON from disk\n  std::string jsonfile;\n  TEST_EQ(flatbuffers::LoadFile(\n              (tests_data_path + \"monsterdata_test.golden\").c_str(), false,\n              &jsonfile),\n          true);\n\n  // parse schema first, so we can use it to parse the data after\n  flatbuffers::Parser parserOrg, parserGen;\n  flatbuffers::Verifier verifier(MyGame::Example::MonsterBinarySchema::data(),\n                                 MyGame::Example::MonsterBinarySchema::size());\n  TEST_EQ(reflection::VerifySchemaBuffer(verifier), true);\n  TEST_EQ(parserOrg.Deserialize(MyGame::Example::MonsterBinarySchema::data(),\n                                MyGame::Example::MonsterBinarySchema::size()),\n          true);\n  TEST_EQ(parserGen.Deserialize(MyGame::Example::MonsterBinarySchema::data(),\n                                MyGame::Example::MonsterBinarySchema::size()),\n          true);\n  TEST_EQ(parserOrg.Parse(jsonfile.c_str()), true);\n\n  // First, verify it, just in case:\n  flatbuffers::Verifier verifierOrg(parserOrg.builder_.GetBufferPointer(),\n                                    parserOrg.builder_.GetSize());\n  TEST_EQ(VerifyMonsterBuffer(verifierOrg), true);\n\n  // Export to JSON\n  std::string jsonGen;\n  TEST_NULL(\n      GenText(parserOrg, parserOrg.builder_.GetBufferPointer(), &jsonGen));\n\n  // Import from JSON\n  TEST_EQ(parserGen.Parse(jsonGen.c_str()), true);\n\n  // Verify buffer from generated JSON\n  flatbuffers::Verifier verifierGen(parserGen.builder_.GetBufferPointer(),\n                                    parserGen.builder_.GetSize());\n  TEST_EQ(VerifyMonsterBuffer(verifierGen), true);\n\n  // Compare generated buffer to original\n  TEST_EQ(parserOrg.builder_.GetSize(), parserGen.builder_.GetSize());\n  TEST_EQ(std::memcmp(parserOrg.builder_.GetBufferPointer(),\n                      parserGen.builder_.GetBufferPointer(),\n                      parserOrg.builder_.GetSize()),\n          0);\n}\n#endif\n\ntemplate <typename T>\nvoid EmbeddedSchemaAccessByType() {\n  // Get the binary schema from the Type itself.\n  // Verify the schema is OK.\n  flatbuffers::Verifier verifierEmbeddedSchema(\n      T::TableType::BinarySchema::data(), T::TableType::BinarySchema::size());\n  TEST_EQ(reflection::VerifySchemaBuffer(verifierEmbeddedSchema), true);\n\n  // Reflect it.\n  auto schema = reflection::GetSchema(T::TableType::BinarySchema::data());\n\n  // This should equal the expected root table.\n  TEST_EQ_STR(schema->root_table()->name()->c_str(), \"MyGame.Example.Monster\");\n}\n\nvoid EmbeddedSchemaAccess() {\n  // Get the binary schema for the monster.\n  // Verify the schema is OK.\n  flatbuffers::Verifier verifierEmbeddedSchema(Monster::BinarySchema::data(),\n                                               Monster::BinarySchema::size());\n  TEST_EQ(reflection::VerifySchemaBuffer(verifierEmbeddedSchema), true);\n\n  // Reflect it.\n  auto schema = reflection::GetSchema(Monster::BinarySchema::data());\n\n  // This should equal the expected root table.\n  TEST_EQ_STR(schema->root_table()->name()->c_str(), \"MyGame.Example.Monster\");\n\n  // Repeat above, but do so through a template parameter:\n  EmbeddedSchemaAccessByType<StatT>();\n}\n\nvoid NestedVerifierTest() {\n  // Create a nested monster.\n  flatbuffers::FlatBufferBuilder nested_builder;\n  FinishMonsterBuffer(\n      nested_builder,\n      CreateMonster(nested_builder, nullptr, 0, 0,\n                    nested_builder.CreateString(\"NestedMonster\")));\n\n  // Verify the nested monster\n  flatbuffers::Verifier verifier(nested_builder.GetBufferPointer(),\n                                 nested_builder.GetSize());\n  TEST_EQ(true, VerifyMonsterBuffer(verifier));\n\n  {\n    // Create the outer monster.\n    flatbuffers::FlatBufferBuilder builder;\n\n    // Add the nested monster as a vector of bytes.\n    auto nested_monster_bytes = builder.CreateVector(\n        nested_builder.GetBufferPointer(), nested_builder.GetSize());\n\n    auto name = builder.CreateString(\"OuterMonster\");\n\n    MonsterBuilder mon_builder(builder);\n    mon_builder.add_name(name);\n    mon_builder.add_testnestedflatbuffer(nested_monster_bytes);\n    FinishMonsterBuffer(builder, mon_builder.Finish());\n\n    // Verify the root monster, which includes verifing the nested monster\n    flatbuffers::Verifier verifier(builder.GetBufferPointer(),\n                                   builder.GetSize());\n    TEST_EQ(true, VerifyMonsterBuffer(verifier));\n  }\n\n  {\n    // Create the outer monster.\n    flatbuffers::FlatBufferBuilder builder;\n\n    // Purposely invalidate the nested flatbuffer setting its length to 1, an\n    // invalid length.\n    uint8_t invalid_nested_buffer[1];\n    auto nested_monster_bytes = builder.CreateVector(invalid_nested_buffer, 1);\n\n    auto name = builder.CreateString(\"OuterMonster\");\n\n    MonsterBuilder mon_builder(builder);\n    mon_builder.add_name(name);\n    mon_builder.add_testnestedflatbuffer(nested_monster_bytes);\n    FinishMonsterBuffer(builder, mon_builder.Finish());\n\n    // Verify the root monster fails, since the included nested monster fails.\n    flatbuffers::Verifier verifier(builder.GetBufferPointer(),\n                                   builder.GetSize());\n    TEST_EQ(false, VerifyMonsterBuffer(verifier));\n\n    // Verify the root monster succeeds, since we've disabled checking nested\n    // flatbuffers\n    flatbuffers::Verifier::Options options;\n    options.check_nested_flatbuffers = false;\n    flatbuffers::Verifier no_check_nested(builder.GetBufferPointer(),\n                                          builder.GetSize(), options);\n    TEST_EQ(true, VerifyMonsterBuffer(no_check_nested));\n  }\n\n  {\n    // Create the outer monster.\n    flatbuffers::FlatBufferBuilder builder;\n\n    // Purposely invalidate the nested flatbuffer setting its length to 0, an\n    // invalid length.\n    uint8_t* invalid_nested_buffer = nullptr;\n    auto nested_monster_bytes = builder.CreateVector(invalid_nested_buffer, 0);\n\n    auto name = builder.CreateString(\"OuterMonster\");\n\n    MonsterBuilder mon_builder(builder);\n    mon_builder.add_name(name);\n    mon_builder.add_testnestedflatbuffer(nested_monster_bytes);\n    FinishMonsterBuffer(builder, mon_builder.Finish());\n\n    // Verify the root monster fails, since the included nested monster fails.\n    flatbuffers::Verifier verifier(builder.GetBufferPointer(),\n                                   builder.GetSize());\n    TEST_EQ(false, VerifyMonsterBuffer(verifier));\n  }\n}\n\nvoid SizeVerifierTest() {\n  // Create a monster.\n  flatbuffers::FlatBufferBuilder builder;\n  FinishMonsterBuffer(builder,\n                      CreateMonster(builder, nullptr, 0, 0,\n                                    builder.CreateString(\"NestedMonster\")));\n  size_t length = builder.GetSize();\n  const uint8_t* data = builder.GetBufferPointer();\n\n  // Verify the monster, using SizeVerifier.\n  // We verify in several ways, using several different API functions/methods,\n  // to ensure that all of these APIs are tested.\n  flatbuffers::SizeVerifier size_verifier(data,\n                                          FLATBUFFERS_MAX_BUFFER_SIZE - 1);\n  {\n    TEST_EQ(true, VerifyMonsterBuffer(size_verifier));\n  }\n  {\n    TEST_EQ(true, size_verifier.VerifyBuffer<Monster>());\n  }\n  {\n    const MyGame::Example::Monster* my_buffer = GetMonster(data);\n    TEST_EQ(true, my_buffer->Verify(size_verifier));\n  }\n\n  // Verify that the size verifier computed the correct size.\n  TEST_EQ(length, size_verifier.GetComputedSize());\n}\n\ntemplate <class T, class Container>\nvoid TestIterators(const std::vector<T>& expected, const Container& tested) {\n  TEST_ASSERT(tested.rbegin().base() == tested.end());\n  TEST_ASSERT(tested.crbegin().base() == tested.cend());\n  TEST_ASSERT(tested.rend().base() == tested.begin());\n  TEST_ASSERT(tested.crend().base() == tested.cbegin());\n\n  size_t k = 0;\n  for (auto it = tested.begin(); it != tested.end(); ++it, ++k) {\n    const auto& e = expected.at(k);\n    TEST_EQ(*it, e);\n  }\n  TEST_EQ(k, expected.size());\n\n  k = expected.size();\n  for (auto it = tested.rbegin(); it != tested.rend(); ++it, --k) {\n    const auto& e = expected.at(k - 1);\n    TEST_EQ(*it, e);\n  }\n  TEST_EQ(k, 0);\n}\n\nvoid FlatbuffersIteratorsTest() {\n  {\n    flatbuffers::FlatBufferBuilder fbb;\n    const std::vector<unsigned char> inv_data = {1, 2, 3};\n    {\n      auto mon_name = fbb.CreateString(\"MyMonster\");  // key, mandatory\n      auto inv_vec = fbb.CreateVector(inv_data);\n      auto empty_i64_vec =\n          fbb.CreateVector(static_cast<const int64_t*>(nullptr), 0);\n      MonsterBuilder mb(fbb);\n      mb.add_name(mon_name);\n      mb.add_inventory(inv_vec);\n      mb.add_vector_of_longs(empty_i64_vec);\n      FinishMonsterBuffer(fbb, mb.Finish());\n    }\n    const auto& mon = *flatbuffers::GetRoot<Monster>(fbb.GetBufferPointer());\n\n    TEST_EQ_STR(\"MyMonster\", mon.name()->c_str());\n    TEST_ASSERT(mon.inventory());\n    TEST_ASSERT(mon.vector_of_longs());\n    TestIterators(inv_data, *mon.inventory());\n    TestIterators(std::vector<int64_t>(), *mon.vector_of_longs());\n  }\n\n  {\n    flatbuffers::FlatBufferBuilder fbb;\n    MyGame::Example::ArrayStruct aStruct;\n    MyGame::Example::FinishArrayTableBuffer(\n        fbb, MyGame::Example::CreateArrayTable(fbb, &aStruct));\n    const auto& array_table =\n        *flatbuffers::GetRoot<ArrayTable>(fbb.GetBufferPointer());\n    TEST_ASSERT(array_table.a());\n    auto& int_15 = *array_table.a()->b();\n    TestIterators(std::vector<int>(15, 0), int_15);\n  }\n}\n\nvoid PrivateAnnotationsLeaks() {\n  // Simple schemas and a \"has optional scalar\" sentinal.\n  std::vector<std::string> schemas;\n  std::vector<std::string> failure_schemas;\n\n  // (private) (table/struct)\n  schemas.push_back(\n      \"table Monster (private) { mana: int; }\"\n      \"struct ABC (private) { mana: int; }\");\n\n  // (public) (table/struct)\n  schemas.push_back(\n      \"table Monster { mana: int; }\"\n      \"struct ABC { mana: int; }\");\n\n  // (private) (union) containing (private) (table/struct)\n  schemas.push_back(\n      \"table Monster (private) { mana: int; } \"\n      \"struct ABC (private) { mana: int; } \"\n      \"union Any (private) { Monster, ABC } \");\n\n  // (public) (union) containing (public) (table/struct)\n  schemas.push_back(\n      \"table Monster { mana: int; }\"\n      \"struct ABC { mana: int; }\"\n      \"union Any { Monster, ABC }\");\n\n  // (private) (table/struct/enum)\n  schemas.push_back(\n      \"table Monster (private) { mana: int; }\"\n      \"struct ABC (private) { mana: int; }\"\n      \"enum Race:byte (private) { None = -1, Human = 0, }\");\n\n  // (public) (table/struct/enum)\n  schemas.push_back(\n      \"table Monster { mana: int; }\"\n      \"struct ABC { mana: int; }\"\n      \"enum Race:byte { None = -1, Human = 0, }\");\n\n  // (private) (union) containing (private) (table/struct)\n  schemas.push_back(\n      \"table Monster (private) { mana: int; }\"\n      \"struct ABC (private) { mana: int; }\"\n      \"enum Race:byte (private) { None = -1, Human = 0, }\"\n      \"union Any (private) { Monster, ABC }\");\n\n  // (public) (union) containing (public) (table/struct)\n  schemas.push_back(\n      \"table Monster { mana: int; }\"\n      \"struct ABC { mana: int; }\"\n      \"enum Race:byte { None = -1, Human = 0, }\"\n      \"union Any { Monster, ABC }\");\n\n  // (private) (table), (public struct)\n  schemas.push_back(\n      \"table Monster (private) { mana: int; }\"\n      \"struct ABC { mana: int; }\");\n\n  // (private) (table), (public) (struct/enum)\n  schemas.push_back(\n      \"table Monster (private) { mana: int; }\"\n      \"struct ABC { mana: int; }\"\n      \"enum Race:byte { None = -1, Human = 0, }\");\n\n  // (public) (struct) containing (public) (enum)\n  schemas.push_back(\n      \"enum Race:byte { None = -1, Human = 0, }\"\n      \"table Monster { mana: int; }\"\n      \"struct ABC { mana: int; type: Race; }\");\n\n  // (public) (union) containing (private) (table) & (public) (struct)\n  failure_schemas.push_back(\n      \"table Monster (private) { mana: int; }\"\n      \"struct ABC { mana: int; }\"\n      \"union Any { Monster, ABC }\");\n\n  // (public) (union) containing (private) (table/struct)\n  failure_schemas.push_back(\n      \"table Monster (private) { mana: int; }\"\n      \"struct ABC (private) { mana: int; }\"\n      \"enum Race:byte { None = -1, Human = 0, }\"\n      \"union Any { Monster, ABC }\");\n\n  // (public) (table) containing (private) (struct)\n  failure_schemas.push_back(\n      \"table Monster { mana: int; ab: ABC; }\"\n      \"struct ABC (private) { mana: int; }\");\n\n  // (public) (struct) containing (private) (enum)\n  failure_schemas.push_back(\n      \"enum Race:byte (private) { None = -1, Human = 0, }\"\n      \"table Monster { mana: int; }\"\n      \"struct ABC { mana: int; type: Race; }\");\n\n  flatbuffers::IDLOptions opts;\n  opts.lang_to_generate = flatbuffers::IDLOptions::Language::kSwift;\n  opts.no_leak_private_annotations = true;\n\n  for (auto schema = schemas.begin(); schema < schemas.end(); schema++) {\n    flatbuffers::Parser parser(opts);\n    TEST_ASSERT(parser.Parse(schema->c_str()));\n  }\n\n  for (auto schema = failure_schemas.begin(); schema < failure_schemas.end();\n       schema++) {\n    flatbuffers::Parser parser(opts);\n    TEST_EQ(false, parser.Parse(schema->c_str()));\n  }\n\n  opts.no_leak_private_annotations = false;\n\n  for (auto schema = schemas.begin(); schema < schemas.end(); schema++) {\n    flatbuffers::Parser parser(opts);\n    TEST_ASSERT(parser.Parse(schema->c_str()));\n  }\n\n  for (auto schema = failure_schemas.begin(); schema < failure_schemas.end();\n       schema++) {\n    flatbuffers::Parser parser(opts);\n    TEST_ASSERT(parser.Parse(schema->c_str()));\n  }\n}\n\nvoid VectorSpanTest() {\n  flatbuffers::FlatBufferBuilder builder;\n\n  auto mloc = CreateMonster(\n      builder, nullptr, 0, 0, builder.CreateString(\"Monster\"),\n      builder.CreateVector<uint8_t>({0, 1, 2, 3, 4, 5, 6, 7, 8, 9}));\n\n  FinishMonsterBuffer(builder, mloc);\n\n  auto monster = GetMonster(builder.GetBufferPointer());\n  auto mutable_monster = GetMutableMonster(builder.GetBufferPointer());\n\n  {  // using references\n    TEST_NOTNULL(monster->inventory());\n\n    flatbuffers::span<const uint8_t> const_inventory =\n        flatbuffers::make_span(*monster->inventory());\n    TEST_EQ(const_inventory.size(), 10);\n    TEST_EQ(const_inventory[0], 0);\n    TEST_EQ(const_inventory[9], 9);\n\n    flatbuffers::span<uint8_t> mutable_inventory =\n        flatbuffers::make_span(*mutable_monster->mutable_inventory());\n    TEST_EQ(mutable_inventory.size(), 10);\n    TEST_EQ(mutable_inventory[0], 0);\n    TEST_EQ(mutable_inventory[9], 9);\n\n    mutable_inventory[0] = 42;\n    TEST_EQ(mutable_inventory[0], 42);\n\n    mutable_inventory[0] = 0;\n    TEST_EQ(mutable_inventory[0], 0);\n  }\n\n  {  // using pointers\n    TEST_EQ(flatbuffers::VectorLength(monster->inventory()), 10);\n\n    flatbuffers::span<const uint8_t> const_inventory =\n        flatbuffers::make_span(monster->inventory());\n    TEST_EQ(const_inventory.size(), 10);\n    TEST_EQ(const_inventory[0], 0);\n    TEST_EQ(const_inventory[9], 9);\n\n    flatbuffers::span<uint8_t> mutable_inventory =\n        flatbuffers::make_span(mutable_monster->mutable_inventory());\n    TEST_EQ(mutable_inventory.size(), 10);\n    TEST_EQ(mutable_inventory[0], 0);\n    TEST_EQ(mutable_inventory[9], 9);\n\n    mutable_inventory[0] = 42;\n    TEST_EQ(mutable_inventory[0], 42);\n\n    mutable_inventory[0] = 0;\n    TEST_EQ(mutable_inventory[0], 0);\n  }\n\n  {\n    TEST_ASSERT(nullptr == monster->testnestedflatbuffer());\n\n    TEST_EQ(flatbuffers::VectorLength(monster->testnestedflatbuffer()), 0);\n\n    flatbuffers::span<const uint8_t> const_nested =\n        flatbuffers::make_span(monster->testnestedflatbuffer());\n    TEST_ASSERT(const_nested.empty());\n\n    flatbuffers::span<uint8_t> mutable_nested =\n        flatbuffers::make_span(mutable_monster->mutable_testnestedflatbuffer());\n    TEST_ASSERT(mutable_nested.empty());\n  }\n}\n\nvoid NativeInlineTableVectorTest() {\n  TestNativeInlineTableT test;\n  for (int i = 0; i < 10; ++i) {\n    NativeInlineTableT t;\n    t.a = i;\n    test.t.push_back(t);\n  }\n\n  flatbuffers::FlatBufferBuilder fbb;\n  auto offset = TestNativeInlineTable::Pack(fbb, &test);\n  fbb.Finish(offset);\n\n  auto* root =\n      flatbuffers::GetRoot<TestNativeInlineTable>(fbb.GetBufferPointer());\n  TestNativeInlineTableT unpacked;\n  root->UnPackTo(&unpacked);\n\n  for (int i = 0; i < 10; ++i) {\n    TEST_ASSERT(unpacked.t[i] == test.t[i]);\n  }\n\n  TEST_ASSERT(unpacked.t == test.t);\n}\n\n// Guard against -Wunused-function on platforms without file tests.\n#ifndef FLATBUFFERS_NO_FILE_TESTS\nvoid DoNotRequireEofTest(const std::string& tests_data_path) {\n  std::string schemafile;\n  bool ok = flatbuffers::LoadFile(\n      (tests_data_path + \"monster_test.fbs\").c_str(), false, &schemafile);\n  TEST_EQ(ok, true);\n  auto include_test_path =\n      flatbuffers::ConCatPathFileName(tests_data_path, \"include_test\");\n  const char* include_directories[] = {tests_data_path.c_str(),\n                                       include_test_path.c_str(), nullptr};\n  flatbuffers::IDLOptions opt;\n  opt.require_json_eof = false;\n  flatbuffers::Parser parser(opt);\n  ok = parser.Parse(schemafile.c_str(), include_directories);\n  TEST_EQ(ok, true);\n\n  const char* str = R\"(Some text at the beginning. {\n      \"name\": \"Blob\",\n      \"hp\": 5\n    }{\n      \"name\": \"Imp\",\n      \"hp\": 10\n    }\n    Some extra text at the end too.\n  )\";\n  const char* tableStart = std::strchr(str, '{');\n  ok = parser.ParseJson(tableStart);\n  TEST_EQ(ok, true);\n\n  const Monster* monster = GetMonster(parser.builder_.GetBufferPointer());\n  TEST_EQ_STR(monster->name()->c_str(), \"Blob\");\n  TEST_EQ(monster->hp(), 5);\n\n  tableStart += parser.BytesConsumed();\n\n  ok = parser.ParseJson(tableStart);\n  TEST_EQ(ok, true);\n\n  monster = GetMonster(parser.builder_.GetBufferPointer());\n  TEST_EQ_STR(monster->name()->c_str(), \"Imp\");\n  TEST_EQ(monster->hp(), 10);\n}\n#endif\n\nvoid UnionUnderlyingTypeTest() {\n  using namespace UnionUnderlyingType;\n  TEST_ASSERT(sizeof(ABC) == sizeof(uint32_t));\n  TEST_ASSERT(static_cast<int32_t>(ABC::A) == 555);\n  TEST_ASSERT(static_cast<int32_t>(ABC::B) == 666);\n  TEST_ASSERT(static_cast<int32_t>(ABC::C) == 777);\n\n  DT buffer;\n  AT a;\n  a.a = 42;\n  BT b;\n  b.b = \"foo\";\n  CT c;\n  c.c = true;\n  buffer.test_union = ABCUnion();\n  buffer.test_union.Set(a);\n  buffer.test_vector_of_union.resize(3);\n  buffer.test_vector_of_union[0].Set(a);\n  buffer.test_vector_of_union[1].Set(b);\n  buffer.test_vector_of_union[2].Set(c);\n\n  flatbuffers::FlatBufferBuilder fbb;\n  auto offset = D::Pack(fbb, &buffer);\n  fbb.Finish(offset);\n\n  auto* root = flatbuffers::GetRoot<D>(fbb.GetBufferPointer());\n  DT unpacked;\n  root->UnPackTo(&unpacked);\n\n  TEST_ASSERT(unpacked.test_union == buffer.test_union);\n  TEST_ASSERT(unpacked.test_vector_of_union == buffer.test_vector_of_union);\n}\n\nvoid StructsInHashTableTest() {\n#if defined(HAS_ABSL_CONTAINERS) && (!defined(_MSC_VER) || _MSC_VER >= 1700)\n  absl::flat_hash_set<ArrayStruct> hash_set;\n  ArrayStruct array_struct_1;\n  array_struct_1.mutate_a(0.4);\n  for (int i = 0; i < array_struct_1.b()->size(); ++i) {\n    array_struct_1.mutable_b()->Mutate(i, i * 2);\n  }\n  for (int i = 0; i < array_struct_1.d()->size(); ++i) {\n    NestedStruct nested_struct;\n    nested_struct.mutable_a()->Mutate(0, i * 3);\n    array_struct_1.mutable_d()->Mutate(i, nested_struct);\n  }\n\n  ArrayStruct array_struct_2;\n  array_struct_2.mutate_e(999);\n\n  hash_set.insert(array_struct_1);\n  hash_set.insert(array_struct_2);\n\n  TEST_EQ(hash_set.size(), 2);\n  TEST_ASSERT(hash_set.contains(array_struct_1));\n  TEST_ASSERT(hash_set.contains(array_struct_2));\n\n  ArrayStruct array_struct_3 = array_struct_1;\n  array_struct_3.mutable_b()->Mutate(0, 2);\n  TEST_ASSERT(!hash_set.contains(array_struct_3));\n\n  hash_set.insert(array_struct_3);\n  TEST_ASSERT(hash_set.contains(array_struct_3));\n#endif  // defined(HAS_ABSL_CONTAINERS) && (!defined(_MSC_VER) || _MSC_VER >=\n        // 1700)\n}\n\nstatic void Offset64Tests() {\n#if INCLUDE_64_BIT_TESTS\n  Offset64Test();\n  Offset64SerializedFirst();\n  Offset64NestedFlatBuffer();\n  Offset64CreateDirect();\n  Offset64Evolution();\n  Offset64VectorOfStructs();\n  Offset64SizePrefix();\n  Offset64ManyVectors();\n  Offset64ForceAlign();\n#endif\n}\n\n// Test that Pack() generates correctly namespace-qualified Create* calls\n// when referencing tables from different namespaces. (issue #8948)\nvoid CrossNamespacePackTest() {\n  // Build a Consumer with a cross-namespace TableWithNative reference.\n  foo::ConsumerT consumer;\n  consumer.c1 = std::make_unique<native::TableWithNativeT>();\n  consumer.c1->value = 42;\n\n  // Add a vector element too.\n  consumer.c2.push_back(std::make_unique<native::TableWithNativeT>());\n  consumer.c2[0]->value = 99;\n\n  // Pack and verify round-trip.\n  flatbuffers::FlatBufferBuilder fbb;\n  fbb.Finish(foo::Consumer::Pack(fbb, &consumer));\n\n  auto* packed = flatbuffers::GetRoot<foo::Consumer>(fbb.GetBufferPointer());\n  auto unpacked = packed->UnPack();\n  TEST_EQ(unpacked->c1->value, 42);\n  TEST_EQ(unpacked->c2.size(), 1);\n  TEST_EQ(unpacked->c2[0]->value, 99);\n}\n\nint FlatBufferTests(const std::string& tests_data_path) {\n  // Run our various test suites:\n\n  std::string rawbuf;\n  auto flatbuf1 = CreateFlatBufferTest(rawbuf);\n  auto flatbuf = std::move(flatbuf1);  // Test move assignment.\n\n  AccessFlatBufferTest(reinterpret_cast<const uint8_t*>(rawbuf.c_str()),\n                       rawbuf.length());\n  AccessFlatBufferTest(flatbuf.data(), flatbuf.size());\n\n  MutateFlatBuffersTest(flatbuf.data(), flatbuf.size());\n\n  ObjectFlatBuffersTest(flatbuf.data());\n  UnPackTo(flatbuf.data());\n\n  MiniReflectFlatBuffersTest(flatbuf.data());\n  MiniReflectFixedLengthArrayTest();\n\n  SizePrefixedTest();\n\n  AlignmentTest();\n\n#ifndef FLATBUFFERS_NO_FILE_TESTS\n  ParseAndGenerateTextTest(tests_data_path, false);\n  ParseAndGenerateTextTest(tests_data_path, true);\n  FixedLengthArrayJsonTest(tests_data_path, false);\n  FixedLengthArrayJsonTest(tests_data_path, true);\n  ReflectionTest(tests_data_path, flatbuf.data(), flatbuf.size());\n  ParseProtoTest(tests_data_path);\n  EvolutionTest(tests_data_path);\n  UnionDeprecationTest(tests_data_path);\n  UnionVectorTest(tests_data_path);\n  GenerateTableTextTest(tests_data_path);\n  TestEmbeddedBinarySchema(tests_data_path);\n  JsonOptionalTest(tests_data_path, false);\n  JsonOptionalTest(tests_data_path, true);\n  MultiFileNameClashTest(tests_data_path);\n  InvalidNestedFlatbufferTest(tests_data_path);\n  JsonDefaultTest(tests_data_path);\n  JsonEnumsTest(tests_data_path);\n  TestMonsterExtraFloats(tests_data_path);\n  ParseIncorrectMonsterJsonTest(tests_data_path);\n  FixedLengthArraySpanTest(tests_data_path);\n  DoNotRequireEofTest(tests_data_path);\n  JsonUnionStructTest();\n  VectorTableNakedPtrTest();\n#else\n  // Guard against -Wunused-parameter.\n  (void)tests_data_path;\n#endif\n\n  UtilConvertCase();\n\n  FuzzTest1();\n  FuzzTest2();\n\n  TriviallyCopyableTest();\n  ErrorTest();\n  ValueTest();\n  EnumValueTest();\n  NestedListTest();\n  EnumStringsTest();\n  EnumNamesTest();\n  EnumOutOfRangeTest();\n  IntegerOutOfRangeTest();\n  IntegerBoundaryTest();\n  UnicodeTest();\n  UnicodeTestAllowNonUTF8();\n  UnicodeTestGenerateTextFailsOnNonUTF8();\n  UnicodeSurrogatesTest();\n  UnicodeInvalidSurrogatesTest();\n  InvalidUTF8Test();\n  UnknownFieldsTest();\n  ParseUnionTest();\n  ValidSameNameDifferentNamespaceTest();\n  ConformTest();\n  ParseProtoBufAsciiTest();\n  TypeAliasesTest();\n  EndianSwapTest();\n  CreateSharedStringTest();\n  FlexBuffersTest();\n  FlexBuffersReuseBugTest();\n  FlexBuffersDeprecatedTest();\n  UninitializedVectorTest();\n  EqualOperatorTest();\n  NumericUtilsTest();\n  IsAsciiUtilsTest();\n  ValidFloatTest();\n  InvalidFloatTest();\n  FixedLengthArrayTest();\n  NativeTypeTest();\n  OptionalScalarsTest();\n  ParseFlexbuffersFromJsonWithNullTest();\n  FlatbuffersSpanTest();\n  FixedLengthArrayConstructorTest();\n  FixedLengthArrayOperatorEqualTest();\n  FieldIdentifierTest();\n  StringVectorDefaultsTest();\n  FlexBuffersFloatingPointTest();\n  FlatbuffersIteratorsTest();\n  WarningsAsErrorsTest();\n  NestedVerifierTest();\n  SizeVerifierTest();\n  PrivateAnnotationsLeaks();\n  JsonUnsortedArrayTest();\n  VectorSpanTest();\n  NativeInlineTableVectorTest();\n  FixedSizedScalarKeyInStructTest();\n  StructKeyInStructTest();\n  NestedStructKeyInStructTest();\n  FixedSizedStructArrayKeyInStructTest();\n  EmbeddedSchemaAccess();\n  Offset64Tests();\n  UnionUnderlyingTypeTest();\n  StructsInHashTableTest();\n  DefaultVectorsStringsTest();\n  CrossNamespacePackTest();\n  return 0;\n}\n}  // namespace\n}  // namespace tests\n}  // namespace flatbuffers\n\nint main(int argc, const char* argv[]) {\n  std::string tests_data_path = \"tests/\";\n\n  for (int argi = 1; argi < argc; argi++) {\n    std::string arg = argv[argi];\n    if (arg == \"--test_path\") {\n      if (++argi >= argc) {\n        fprintf(stderr, \"error: missing path following: %s\\n\", arg.c_str());\n        exit(1);\n      }\n      // Override default path if provided one.\n      tests_data_path = argv[argi];\n\n    } else {\n      fprintf(stderr, \"error: Unknown argument: %s\\n\", arg.c_str());\n      exit(1);\n    }\n  }\n\n  InitTestEngine();\n\n  std::string req_locale;\n  if (flatbuffers::ReadEnvironmentVariable(\"FLATBUFFERS_TEST_LOCALE\",\n                                           &req_locale)) {\n    TEST_OUTPUT_LINE(\"The environment variable FLATBUFFERS_TEST_LOCALE=%s\",\n                     req_locale.c_str());\n    req_locale = flatbuffers::RemoveStringQuotes(req_locale);\n    std::string the_locale;\n    TEST_ASSERT_FUNC(\n        flatbuffers::SetGlobalTestLocale(req_locale.c_str(), &the_locale));\n    TEST_OUTPUT_LINE(\"The global C-locale changed: %s\", the_locale.c_str());\n  }\n\n#ifdef FLATBUFFERS_TEST_PATH_PREFIX\n  tests_data_path =\n      FLATBUFFERS_STRING(FLATBUFFERS_TEST_PATH_PREFIX) + tests_data_path;\n#endif\n\n  flatbuffers::tests::FlatBufferTests(tests_data_path);\n  FlatBufferBuilderTest();\n\n  if (!testing_fails) {\n    TEST_OUTPUT_LINE(\"ALL TESTS PASSED\");\n  } else {\n    TEST_OUTPUT_LINE(\"%d FAILED TESTS\", testing_fails);\n  }\n  return CloseTestEngine();\n}\n"
  },
  {
    "path": "tests/test.fbs",
    "content": "// Generated from test.proto\n\ninclude \"imported.fbs\";\n\nnamespace proto.test;\n\n/// Enum doc comment.\nenum ProtoEnum : int {\n  NUL = 0,\n  FOO = 1,\n  /// Enum 2nd value doc comment misaligned.\n  BAR = 5,\n}\n\nnamespace proto.test.ProtoMessage_.OtherMessage_;\n\nenum ProtoEnum : int {\n  NUL = 0,\n  FOO = 1,\n  BAR = 2,\n  BAZ = 3,\n}\n\nnamespace proto.test;\n\n/// 2nd table doc comment with\n/// many lines.\ntable ProtoMessage {\n  c:int = 16;\n  d:long;\n  p:uint;\n  e:ulong;\n  /// doc comment for f.\n  f:int = -1;\n  g:long;\n  h:uint;\n  q:ulong;\n  i:int;\n  j:long;\n  /// doc comment for k.\n  k:bool;\n  /// doc comment for l on 2\n  /// lines\n  l:string (required);\n  m:[ubyte];\n  n:proto.test.ProtoMessage_.OtherMessage;\n  o:[string];\n  z:proto.test.ImportedMessage;\n  /// doc comment for r.\n  r:proto.test.ProtoMessage_.Anonymous0;\n  outer_enum:proto.test.ProtoEnum;\n  u:float = +inf;\n  v:float = +inf;\n  w:float = -inf;\n  grades:[proto.test.ProtoMessage_.GradesEntry];\n  other_message_map:[proto.test.ProtoMessage_.OtherMessageMapEntry];\n}\n\nnamespace proto.test.ProtoMessage_;\n\ntable OtherMessage {\n  a:double;\n  /// doc comment for b.\n  b:float = 3.14149;\n  foo_bar_baz:proto.test.ProtoMessage_.OtherMessage_.ProtoEnum;\n}\n\ntable Anonymous0 {\n  /// doc comment for s.\n  s:proto.test.ImportedMessage;\n  /// doc comment for t on 2\n  /// lines.\n  t:proto.test.ProtoMessage_.OtherMessage;\n}\n\ntable GradesEntry {\n  key:string (key);\n  value:float;\n}\n\ntable OtherMessageMapEntry {\n  key:string (key);\n  value:proto.test.ProtoMessage_.OtherMessage;\n}\n\n"
  },
  {
    "path": "tests/test_assert.cpp",
    "content": "#include \"test_assert.h\"\n\n#include <assert.h>\n\n#ifdef _MSC_VER\n#include <crtdbg.h>\n#include <windows.h>\n#endif\n\nint testing_fails = 0;\nstatic TestFailEventListener fail_listener_ = nullptr;\n\nvoid TestFail(const char* expval, const char* val, const char* exp,\n              const char* file, int line, const char* func) {\n  TEST_OUTPUT_LINE(\"EXPECTED: \\\"%s\\\"\", expval);\n  TEST_OUTPUT_LINE(\"VALUE: \\\"%s\\\"\", val);\n  TEST_OUTPUT_LINE(\"TEST FAILED: %s:%d, %s in %s\", file, line, exp,\n                   func ? func : \"\");\n  testing_fails++;\n\n  // Notify, emulate 'gtest::OnTestPartResult' event handler.\n  if (fail_listener_) (*fail_listener_)(expval, val, exp, file, line, func);\n\n  assert(0);  // ignored in Release if NDEBUG defined\n}\n\nvoid TestEqStr(const char* expval, const char* val, const char* exp,\n               const char* file, int line, const char* func) {\n  if (strcmp(expval, val) != 0) {\n    TestFail(expval, val, exp, file, line, func);\n  }\n}\n\n#if defined(FLATBUFFERS_MEMORY_LEAK_TRACKING) && defined(_MSC_VER) && \\\n    defined(_DEBUG)\n#define FLATBUFFERS_MEMORY_LEAK_TRACKING_MSVC\n#endif\n\nvoid InitTestEngine(TestFailEventListener listener) {\n  testing_fails = 0;\n  // Disable stdout buffering to prevent information lost on assertion or core\n  // dump.\n  setvbuf(stdout, nullptr, _IONBF, 0);\n  setvbuf(stderr, nullptr, _IONBF, 0);\n\n  // clang-format off\n\n  #if defined(FLATBUFFERS_MEMORY_LEAK_TRACKING_MSVC)\n    // For more thorough checking:\n    // _CRTDBG_DELAY_FREE_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF\n    auto flags = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);\n    _CrtSetDbgFlag(flags | _CRTDBG_ALLOC_MEM_DF);\n  #endif\n  // clang-format on\n\n  fail_listener_ = listener;\n}\n\nint CloseTestEngine(bool force_report) {\n  if (!testing_fails || force_report) {\n#if defined(FLATBUFFERS_MEMORY_LEAK_TRACKING_MSVC)\n    auto flags = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);\n    flags &= ~_CRTDBG_DELAY_FREE_MEM_DF;\n    flags |= _CRTDBG_LEAK_CHECK_DF;\n    _CrtSetDbgFlag(flags);\n#endif\n  }\n  return (0 != testing_fails);\n}\n"
  },
  {
    "path": "tests/test_assert.h",
    "content": "#ifndef TEST_ASSERT_H\n#define TEST_ASSERT_H\n\n#include \"flatbuffers/base.h\"\n#include \"flatbuffers/util.h\"\n\n// clang-format off\n\n#ifdef __ANDROID__\n  #include <android/log.h>\n  #define TEST_OUTPUT_LINE(...) \\\n      __android_log_print(ANDROID_LOG_INFO, \"FlatBuffers\", __VA_ARGS__)\n  #define FLATBUFFERS_NO_FILE_TESTS\n#else\n  #define TEST_OUTPUT_LINE(...) \\\n      do { printf(__VA_ARGS__); printf(\"\\n\"); } while(!flatbuffers::IsConstTrue(true))\n#endif\n\n#define TEST_EQ(exp, val) TestEq(exp, val, \"'\" #exp \"' != '\" #val \"'\", __FILE__, __LINE__, \"\")\n#define TEST_NE(exp, val) TestNe(exp, val, \"'\" #exp \"' == '\" #val \"'\", __FILE__, __LINE__, \"\")\n#define TEST_ASSERT(val)  TestEq(true, !!(val), \"'\" \"true\" \"' != '\" #val \"'\", __FILE__, __LINE__, \"\")\n#define TEST_NULL(val) TestEq(true, (val) == nullptr, \"'\" \"nullptr\" \"' != '\" #val \"'\", __FILE__, __LINE__, \"\")\n#define TEST_NOTNULL(val) TestEq(true, (val) != nullptr, \"'\" \"nullptr\" \"' == '\" #val \"'\", __FILE__, __LINE__, \"\")\n#define TEST_EQ_STR(exp, val) TestEqStr(exp, val, \"'\" #exp \"' != '\" #val \"'\", __FILE__, __LINE__, \"\")\n\n#ifdef _WIN32\n  #define TEST_ASSERT_FUNC(val) TestEq(true, !!(val), \"'\" \"true\" \"' != '\" #val \"'\", __FILE__, __LINE__, __FUNCTION__)\n  #define TEST_EQ_FUNC(exp, val) TestEq(exp, val, \"'\" #exp \"' != '\" #val \"'\", __FILE__, __LINE__, __FUNCTION__)\n#else\n  #define TEST_ASSERT_FUNC(val) TestEq(true, !!(val), \"'\" \"true\" \"' != '\" #val \"'\", __FILE__, __LINE__, __PRETTY_FUNCTION__)\n  #define TEST_EQ_FUNC(exp, val) TestEq(exp, val, \"'\" #exp \"' != '\" #val \"'\", __FILE__, __LINE__, __PRETTY_FUNCTION__)\n#endif\n\n// clang-format on\n\nextern int testing_fails;\n\n// Listener of TestFail, like 'gtest::OnTestPartResult' event handler.\n// Called in TestFail after a failed assertion.\ntypedef bool (*TestFailEventListener)(const char* expval, const char* val,\n                                      const char* exp, const char* file,\n                                      int line, const char* func);\n\n// Prepare test engine (MSVC assertion setup, etc).\n// listener - this function will be notified on each TestFail call.\nvoid InitTestEngine(TestFailEventListener listener = nullptr);\n\n// Release all test-engine resources.\n// Prints or schedule a debug report if all test passed.\n// Returns 0 if all tests passed or 1 otherwise.\n// Memory leak report: FLATBUFFERS_MEMORY_LEAK_TRACKING && _MSC_VER && _DEBUG.\nint CloseTestEngine(bool force_report = false);\n\n// Write captured state to a log and terminate test run.\nvoid TestFail(const char* expval, const char* val, const char* exp,\n              const char* file, int line, const char* func = nullptr);\n\nvoid TestEqStr(const char* expval, const char* val, const char* exp,\n               const char* file, int line, const char* func = nullptr);\n\n// Workaround for `enum class` printing.\n// There is an issue with the printing of enums with a fixed underlying type.\n// These enums are generated by `flatc` if `--scoped-enums` is active.\n// All modern compilers have problems with `std::stringstream&<<(T v)` if T is\n// an enum with fixed type. For details see DR1601:\n// http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1601\n// https://stackoverflow.com/questions/34336024/ambiguous-overload-when-writing-an-enum-with-an-enum-base-but-only-with-clang\n\ntemplate <typename T, bool is_enum_type = flatbuffers::is_enum<T>::value>\nstruct underlying_of_scalar {\n  static_assert(flatbuffers::is_scalar<T>::value, \"invalid type T\");\n  typedef T type;\n};\n\ntemplate <typename T>\nstruct underlying_of_scalar<T, true> {\n  // clang-format off\n  // There are old compilers without full C++11 support (see stl_emulation.h).\n  #if defined(FLATBUFFERS_TEMPLATES_ALIASES)\n  using type = typename std::underlying_type<T>::type;\n  #else\n  typedef int64_t type;\n  #endif\n  // clang-format on\n};\n\ntemplate <typename T>\ntypename underlying_of_scalar<T>::type scalar_as_underlying(T v) {\n  return static_cast<typename underlying_of_scalar<T>::type>(v);\n}\n\ntemplate <typename T, typename U>\nvoid TestEq(T expval, U val, const char* exp, const char* file, int line,\n            const char* func) {\n  if (static_cast<U>(expval) != val) {\n    TestFail(flatbuffers::NumToString(scalar_as_underlying(expval)).c_str(),\n             flatbuffers::NumToString(scalar_as_underlying(val)).c_str(), exp,\n             file, line, func);\n  }\n}\n\ntemplate <>\ninline void TestEq<std::string, std::string>(std::string expval,\n                                             std::string val, const char* exp,\n                                             const char* file, int line,\n                                             const char* func) {\n  if (expval != val) {\n    TestFail(expval.c_str(), val.c_str(), exp, file, line, func);\n  }\n}\n\ntemplate <typename T, typename U>\nvoid TestNe(T expval, U val, const char* exp, const char* file, int line,\n            const char* func) {\n  if (static_cast<U>(expval) == val) {\n    TestFail(flatbuffers::NumToString(scalar_as_underlying(expval)).c_str(),\n             flatbuffers::NumToString(scalar_as_underlying(val)).c_str(), exp,\n             file, line, func);\n  }\n}\n\ntemplate <>\ninline void TestNe<std::string, std::string>(std::string expval,\n                                             std::string val, const char* exp,\n                                             const char* file, int line,\n                                             const char* func) {\n  if (expval == val) {\n    TestFail(expval.c_str(), val.c_str(), exp, file, line, func);\n  }\n}\n\n#endif  // !TEST_ASSERT_H\n"
  },
  {
    "path": "tests/test_builder.cpp",
    "content": "#include \"test_builder.h\"\n\n#include \"flatbuffers/flatbuffer_builder.h\"\n#include \"flatbuffers/stl_emulation.h\"\n#include \"monster_test_generated.h\"\n\nusing namespace MyGame::Example;\nusing namespace flatbuffers;\n\nstruct OwnedAllocator : public DefaultAllocator {};\n\nclass TestHeapBuilder : public FlatBufferBuilder {\n private:\n  TestHeapBuilder(const TestHeapBuilder&);\n  TestHeapBuilder& operator=(const TestHeapBuilder&);\n\n public:\n  TestHeapBuilder() : FlatBufferBuilder(2048, new OwnedAllocator(), true) {}\n\n  TestHeapBuilder(TestHeapBuilder&& other)\n      : FlatBufferBuilder(std::move(other)) {}\n\n  TestHeapBuilder& operator=(TestHeapBuilder&& other) {\n    FlatBufferBuilder::operator=(std::move(other));\n    return *this;\n  }\n};\n\n// This class simulates flatbuffers::grpc::detail::SliceAllocatorMember\nstruct AllocatorMember {\n  flatbuffers::DefaultAllocator member_allocator_;\n};\n\nstruct GrpcLikeMessageBuilder : private AllocatorMember,\n                                public FlatBufferBuilder {\n private:\n  GrpcLikeMessageBuilder(const GrpcLikeMessageBuilder&);\n  GrpcLikeMessageBuilder& operator=(const GrpcLikeMessageBuilder&);\n\n public:\n  GrpcLikeMessageBuilder()\n      : FlatBufferBuilder(1024, &member_allocator_, false) {}\n\n  GrpcLikeMessageBuilder(GrpcLikeMessageBuilder&& other)\n      : FlatBufferBuilder(1024, &member_allocator_, false) {\n    // Default construct and swap idiom.\n    Swap(other);\n  }\n\n  GrpcLikeMessageBuilder& operator=(GrpcLikeMessageBuilder&& other) {\n    // Construct temporary and swap idiom\n    GrpcLikeMessageBuilder temp(std::move(other));\n    Swap(temp);\n    return *this;\n  }\n\n  void Swap(GrpcLikeMessageBuilder& other) {\n    // No need to swap member_allocator_ because it's stateless.\n    FlatBufferBuilder::Swap(other);\n    // After swapping the FlatBufferBuilder, we swap back the allocator, which\n    // restores the original allocator back in place. This is necessary because\n    // MessageBuilder's allocator is its own member (SliceAllocatorMember). The\n    // allocator passed to FlatBufferBuilder::vector_downward must point to this\n    // member.\n    buf_.swap_allocator(other.buf_);\n  }\n};\n\nflatbuffers::Offset<Monster> populate1(\n    flatbuffers::FlatBufferBuilder& builder) {\n  auto name_offset = builder.CreateString(m1_name());\n  return CreateMonster(builder, nullptr, 0, 0, name_offset, 0, m1_color());\n}\n\nflatbuffers::Offset<Monster> populate2(\n    flatbuffers::FlatBufferBuilder& builder) {\n  auto name_offset = builder.CreateString(m2_name());\n  return CreateMonster(builder, nullptr, 0, 0, name_offset, 0, m2_color());\n}\n\nuint8_t* release_raw_base(flatbuffers::FlatBufferBuilder& fbb, size_t& size,\n                          size_t& offset) {\n  return fbb.ReleaseRaw(size, offset);\n}\n\nvoid free_raw(flatbuffers::grpc::MessageBuilder&, uint8_t*) {\n  // release_raw_base calls FlatBufferBuilder::ReleaseRaw on the argument\n  // MessageBuilder. It's semantically wrong as MessageBuilder has its own\n  // ReleaseRaw member function that takes three arguments. In such cases\n  // though, ~MessageBuilder() invokes ~SliceAllocator() that takes care of\n  // deleting memory as it calls grpc_slice_unref. Obviously, this behavior is\n  // very surprising as the pointer returned by FlatBufferBuilder::ReleaseRaw is\n  // not valid as soon as MessageBuilder goes out of scope. This problem does\n  // not occur with FlatBufferBuilder.\n}\n\nvoid free_raw(flatbuffers::FlatBufferBuilder&, uint8_t* buf) {\n  flatbuffers::DefaultAllocator().deallocate(buf, 0);\n}\n\nbool verify(const flatbuffers::DetachedBuffer& buf,\n            const std::string& expected_name, Color color) {\n  const Monster* monster = flatbuffers::GetRoot<Monster>(buf.data());\n  return (monster->name()->str() == expected_name) &&\n         (monster->color() == color);\n}\n\nbool verify(const uint8_t* buf, size_t offset, const std::string& expected_name,\n            Color color) {\n  const Monster* monster = flatbuffers::GetRoot<Monster>(buf + offset);\n  return (monster->name()->str() == expected_name) &&\n         (monster->color() == color);\n}\n\nbool release_n_verify(flatbuffers::FlatBufferBuilder& fbb,\n                      const std::string& expected_name, Color color) {\n  flatbuffers::DetachedBuffer buf = fbb.Release();\n  return verify(buf, expected_name, color);\n}\n\n// forward-declared in test.cpp\nvoid FlatBufferBuilderTest();\n\nvoid FlatBufferBuilderTest() {\n  using flatbuffers::FlatBufferBuilder;\n\n  BuilderTests<FlatBufferBuilder>::all_tests();\n  BuilderTests<TestHeapBuilder>::all_tests();\n  BuilderTests<GrpcLikeMessageBuilder>::all_tests();\n\n  BuilderReuseTestSelector tests[4] = {\n      REUSABLE_AFTER_RELEASE, REUSABLE_AFTER_RELEASE_RAW,\n      REUSABLE_AFTER_RELEASE_AND_MOVE_ASSIGN,\n      REUSABLE_AFTER_RELEASE_RAW_AND_MOVE_ASSIGN};\n\n  BuilderReuseTests<FlatBufferBuilder, FlatBufferBuilder>::run_tests(\n      TestSelector(tests, tests + 4));\n  BuilderReuseTests<TestHeapBuilder, TestHeapBuilder>::run_tests(\n      TestSelector(tests, tests + 4));\n  BuilderReuseTests<GrpcLikeMessageBuilder, GrpcLikeMessageBuilder>::run_tests(\n      TestSelector(tests, tests + 4));\n}\n\n// forward-declared in test_builder.h\nvoid CheckTestGeneratedIsValid(const MyGame::Example::Color&);\n\n// Link-time check using pointer type.\nvoid CheckTestGeneratedIsValid(const MyGame::Example::Color&) {}\n"
  },
  {
    "path": "tests/test_builder.h",
    "content": "#ifndef TEST_BUILDER_H\n#define TEST_BUILDER_H\n\n#include <set>\n#include <type_traits>\n\n#include \"flatbuffers/flatbuffers.h\"\n#include \"monster_test_generated.h\"\n#include \"test_assert.h\"\n\nusing MyGame::Example::Color;\nusing MyGame::Example::Monster;\n\nnamespace flatbuffers {\nnamespace grpc {\nclass MessageBuilder;\n}\n}  // namespace flatbuffers\n\ninline std::string m1_name() { return \"Cyberdemon\"; }\ninline std::string m2_name() { return \"Imp\"; }\ninline MyGame::Example::Color m1_color() { return MyGame::Example::Color_Red; }\ninline MyGame::Example::Color m2_color() {\n  return MyGame::Example::Color_Green;\n}\ninline void m1_color_check() {\n  // Ensure that all compilation units see the same monster_test_generated.h.\n  extern void CheckTestGeneratedIsValid(const MyGame::Example::Color&);\n  CheckTestGeneratedIsValid(m1_color());\n}\n\nflatbuffers::Offset<Monster> populate1(flatbuffers::FlatBufferBuilder& builder);\nflatbuffers::Offset<Monster> populate2(flatbuffers::FlatBufferBuilder& builder);\n\nuint8_t* release_raw_base(flatbuffers::FlatBufferBuilder& fbb, size_t& size,\n                          size_t& offset);\n\nvoid free_raw(flatbuffers::grpc::MessageBuilder& mbb, uint8_t* buf);\nvoid free_raw(flatbuffers::FlatBufferBuilder& fbb, uint8_t* buf);\n\nbool verify(const flatbuffers::DetachedBuffer& buf,\n            const std::string& expected_name, Color color);\nbool verify(const uint8_t* buf, size_t offset, const std::string& expected_name,\n            Color color);\n\nbool release_n_verify(flatbuffers::FlatBufferBuilder& fbb,\n                      const std::string& expected_name, Color color);\nbool release_n_verify(flatbuffers::grpc::MessageBuilder& mbb,\n                      const std::string& expected_name, Color color);\n\n// Invokes this function when testing the following Builder types\n// FlatBufferBuilder, TestHeapBuilder, and GrpcLikeMessageBuilder\ntemplate <class Builder>\nvoid builder_move_assign_after_releaseraw_test(Builder b1) {\n  auto root_offset1 = populate1(b1);\n  b1.Finish(root_offset1);\n  size_t size, offset;\n\n  uint8_t* rr = b1.ReleaseRaw(size, offset);\n  std::shared_ptr<uint8_t> raw(rr, [size](uint8_t* ptr) {\n    flatbuffers::DefaultAllocator::dealloc(ptr, size);\n  });\n  Builder src;\n  auto root_offset2 = populate2(src);\n  src.Finish(root_offset2);\n  auto src_size = src.GetSize();\n  // Move into a released builder.\n  b1 = std::move(src);\n  TEST_EQ_FUNC(b1.GetSize(), src_size);\n  TEST_ASSERT_FUNC(release_n_verify(b1, m2_name(), m2_color()));\n  TEST_EQ_FUNC(src.GetSize(), 0);\n}\n\nvoid builder_move_assign_after_releaseraw_test(\n    flatbuffers::grpc::MessageBuilder b1);\n\ntemplate <class DestBuilder, class SrcBuilder = DestBuilder>\nstruct BuilderTests {\n  static void empty_builder_movector_test() {\n    SrcBuilder src;\n    size_t src_size = src.GetSize();\n    DestBuilder dst(std::move(src));\n    size_t dst_size = dst.GetSize();\n    TEST_EQ_FUNC(src_size, 0);\n    TEST_EQ_FUNC(src_size, dst_size);\n  }\n\n  static void nonempty_builder_movector_test() {\n    SrcBuilder src;\n    populate1(src);\n    size_t src_size = src.GetSize();\n    DestBuilder dst(std::move(src));\n    TEST_EQ_FUNC(src_size, dst.GetSize());\n    TEST_EQ_FUNC(src.GetSize(), 0);\n  }\n\n  static void builder_movector_before_finish_test() {\n    SrcBuilder src;\n    auto root_offset1 = populate1(src);\n    DestBuilder dst(std::move(src));\n    dst.Finish(root_offset1);\n    TEST_ASSERT_FUNC(release_n_verify(dst, m1_name(), m1_color()));\n    TEST_EQ_FUNC(src.GetSize(), 0);\n  }\n\n  static void builder_movector_after_finish_test() {\n    SrcBuilder src;\n    auto root_offset1 = populate1(src);\n    src.Finish(root_offset1);\n    auto src_size = src.GetSize();\n    DestBuilder dst(std::move(src));\n    TEST_EQ_FUNC(dst.GetSize(), src_size);\n    TEST_ASSERT_FUNC(release_n_verify(dst, m1_name(), m1_color()));\n    TEST_EQ_FUNC(src.GetSize(), 0);\n  }\n\n  static void builder_move_assign_before_finish_test() {\n    SrcBuilder src;\n    auto root_offset1 = populate1(src);\n    DestBuilder dst;\n    populate2(dst);\n    dst = std::move(src);\n    dst.Finish(root_offset1);\n    TEST_ASSERT_FUNC(release_n_verify(dst, m1_name(), m1_color()));\n    TEST_EQ_FUNC(src.GetSize(), 0);\n  }\n\n  static void builder_move_assign_after_finish_test() {\n    SrcBuilder src;\n    auto root_offset1 = populate1(src);\n    src.Finish(root_offset1);\n    auto src_size = src.GetSize();\n    DestBuilder dst;\n    auto root_offset2 = populate2(dst);\n    dst.Finish(root_offset2);\n    dst = std::move(src);\n    TEST_EQ_FUNC(dst.GetSize(), src_size);\n    TEST_ASSERT_FUNC(release_n_verify(dst, m1_name(), m1_color()));\n    TEST_EQ_FUNC(src.GetSize(), 0);\n  }\n\n  static void builder_move_assign_after_release_test() {\n    DestBuilder dst;\n    auto root_offset1 = populate1(dst);\n    dst.Finish(root_offset1);\n    {\n      flatbuffers::DetachedBuffer dst_detached = dst.Release();\n      // detached buffer is deleted\n    }\n    SrcBuilder src;\n    auto root_offset2 = populate2(src);\n    src.Finish(root_offset2);\n    auto src_size = src.GetSize();\n    // Move into a released builder.\n    dst = std::move(src);\n    TEST_EQ_FUNC(dst.GetSize(), src_size);\n    TEST_ASSERT_FUNC(release_n_verify(dst, m2_name(), m2_color()));\n    TEST_EQ_FUNC(src.GetSize(), 0);\n  }\n\n  static void builder_swap_before_finish_test(\n      bool run = std::is_same<DestBuilder, SrcBuilder>::value) {\n    /// Swap is allowed only when lhs and rhs are the same concrete type.\n    if (run) {\n      SrcBuilder src;\n      auto root_offset1 = populate1(src);\n      auto size1 = src.GetSize();\n      DestBuilder dst;\n      auto root_offset2 = populate2(dst);\n      auto size2 = dst.GetSize();\n      src.Swap(dst);\n      src.Finish(root_offset2);\n      dst.Finish(root_offset1);\n      TEST_EQ_FUNC(src.GetSize() > size2, true);\n      TEST_EQ_FUNC(dst.GetSize() > size1, true);\n      TEST_ASSERT_FUNC(release_n_verify(src, m2_name(), m2_color()));\n      TEST_ASSERT_FUNC(release_n_verify(dst, m1_name(), m1_color()));\n    }\n  }\n\n  static void builder_swap_after_finish_test(\n      bool run = std::is_same<DestBuilder, SrcBuilder>::value) {\n    /// Swap is allowed only when lhs and rhs are the same concrete type.\n    if (run) {\n      SrcBuilder src;\n      auto root_offset1 = populate1(src);\n      src.Finish(root_offset1);\n      auto size1 = src.GetSize();\n      DestBuilder dst;\n      auto root_offset2 = populate2(dst);\n      dst.Finish(root_offset2);\n      auto size2 = dst.GetSize();\n      src.Swap(dst);\n      TEST_EQ_FUNC(src.GetSize(), size2);\n      TEST_EQ_FUNC(dst.GetSize(), size1);\n      TEST_ASSERT_FUNC(release_n_verify(src, m2_name(), m2_color()));\n      TEST_ASSERT_FUNC(release_n_verify(dst, m1_name(), m1_color()));\n    }\n  }\n\n  static void all_tests() {\n    empty_builder_movector_test();\n    nonempty_builder_movector_test();\n    builder_movector_before_finish_test();\n    builder_movector_after_finish_test();\n    builder_move_assign_before_finish_test();\n    builder_move_assign_after_finish_test();\n    builder_move_assign_after_release_test();\n    builder_move_assign_after_releaseraw_test(DestBuilder());\n    builder_swap_before_finish_test();\n    builder_swap_after_finish_test();\n  }\n};\n\nenum BuilderReuseTestSelector {\n  REUSABLE_AFTER_RELEASE = 1,\n  REUSABLE_AFTER_RELEASE_RAW = 2,\n  REUSABLE_AFTER_RELEASE_MESSAGE = 3,\n  REUSABLE_AFTER_RELEASE_AND_MOVE_ASSIGN = 4,\n  REUSABLE_AFTER_RELEASE_RAW_AND_MOVE_ASSIGN = 5,\n  REUSABLE_AFTER_RELEASE_MESSAGE_AND_MOVE_ASSIGN = 6\n};\n\ntypedef std::set<BuilderReuseTestSelector> TestSelector;\n\ntemplate <class DestBuilder, class SrcBuilder>\nstruct BuilderReuseTests {\n  static void builder_reusable_after_release_test(TestSelector selector) {\n    if (!selector.count(REUSABLE_AFTER_RELEASE)) {\n      return;\n    }\n\n    DestBuilder fbb;\n    std::vector<flatbuffers::DetachedBuffer> buffers;\n    for (int i = 0; i < 5; ++i) {\n      auto root_offset1 = populate1(fbb);\n      fbb.Finish(root_offset1);\n      buffers.push_back(fbb.Release());\n      TEST_ASSERT_FUNC(verify(buffers[i], m1_name(), m1_color()));\n    }\n  }\n\n  static void builder_reusable_after_releaseraw_test(TestSelector selector) {\n    if (!selector.count(REUSABLE_AFTER_RELEASE_RAW)) {\n      return;\n    }\n\n    DestBuilder fbb;\n    for (int i = 0; i < 5; ++i) {\n      auto root_offset1 = populate1(fbb);\n      fbb.Finish(root_offset1);\n      size_t size, offset;\n      uint8_t* buf = release_raw_base(fbb, size, offset);\n      TEST_ASSERT_FUNC(verify(buf, offset, m1_name(), m1_color()));\n      free_raw(fbb, buf);\n    }\n  }\n\n  static void builder_reusable_after_release_and_move_assign_test(\n      TestSelector selector) {\n    if (!selector.count(REUSABLE_AFTER_RELEASE_AND_MOVE_ASSIGN)) {\n      return;\n    }\n\n    DestBuilder dst;\n    std::vector<flatbuffers::DetachedBuffer> buffers;\n    for (int i = 0; i < 5; ++i) {\n      auto root_offset1 = populate1(dst);\n      dst.Finish(root_offset1);\n      buffers.push_back(dst.Release());\n      TEST_ASSERT_FUNC(verify(buffers[i], m1_name(), m1_color()));\n      SrcBuilder src;\n      dst = std::move(src);\n      TEST_EQ_FUNC(src.GetSize(), 0);\n    }\n  }\n\n  static void builder_reusable_after_releaseraw_and_move_assign_test(\n      TestSelector selector) {\n    if (!selector.count(REUSABLE_AFTER_RELEASE_RAW_AND_MOVE_ASSIGN)) {\n      return;\n    }\n\n    DestBuilder dst;\n    for (int i = 0; i < 5; ++i) {\n      auto root_offset1 = populate1(dst);\n      dst.Finish(root_offset1);\n      size_t size, offset;\n      uint8_t* buf = release_raw_base(dst, size, offset);\n      TEST_ASSERT_FUNC(verify(buf, offset, m1_name(), m1_color()));\n      free_raw(dst, buf);\n      SrcBuilder src;\n      dst = std::move(src);\n      TEST_EQ_FUNC(src.GetSize(), 0);\n    }\n  }\n\n  static void run_tests(TestSelector selector) {\n    builder_reusable_after_release_test(selector);\n    builder_reusable_after_releaseraw_test(selector);\n    builder_reusable_after_release_and_move_assign_test(selector);\n    builder_reusable_after_releaseraw_and_move_assign_test(selector);\n  }\n};\n\n#endif  // TEST_BUILDER_H\n"
  },
  {
    "path": "tests/ts/BUILD.bazel",
    "content": "load(\"@aspect_rules_js//js:defs.bzl\", \"js_test\")\nload(\"@aspect_rules_js//npm:defs.bzl\", \"npm_link_package\")\nload(\"//:typescript.bzl\", \"flatbuffer_ts_library\")\n\npackage(default_visibility = [\"//visibility:private\"])\n\n# This is a copy of //ts:node_modules/flatbuffers. The rules_js-based tests\n# require this target to live in the same or a parent package. Since we don't\n# want to put rules_js targets in the root package, we create a copy here.\nnpm_link_package(\n    name = \"node_modules/flatbuffers\",\n    src = \"//ts:flatbuffers\",\n    root_package = \"tests/ts\",\n)\n\nflatbuffer_ts_library(\n    name = \"typescript_ts_fbs\",\n    srcs = [\"typescript_keywords.fbs\"],\n    deps = [\n        \"//reflection/ts:reflection_ts_fbs\",\n        \"//tests/ts/test_dir:include_ts_fbs\",\n        \"//tests/ts/test_dir:typescript_transitive_ts_fbs\",\n    ],\n)\n\nTEST_DATA = glob([\n    \"my-game/*.js\",\n    \"my-game/example/*.js\",\n    \"my-game/example2/*.js\",\n])\n\nTEST_UNION_VECTOR_DATA = glob([\n    \"union_vector/*.js\",\n])\n\nTEST_COMPLEX_ARRAYS_DATA = glob([\n    \"arrays_test_complex/**/*.js\",\n])\n\n# Here we're running the tests against the checked-in generated files. These\n# are kept up-to-date with a CI-based mechanism. The intent of running these\n# tests here via bazel is not to validate that they're up-to-date. Instead, we\n# just want to make it easy to run these tests while making other changes. For\n# example, this is useful when making changes to the rules_js setup to validate\n# that the basic infrastructure is still working.\n[js_test(\n    name = \"%s_test\" % test,\n    chdir = package_name(),\n    data = data + [\n        \"package.json\",\n        \"//tests:test_data_copied_to_bin\",\n        \"//tests/ts:node_modules/flatbuffers\",\n    ],\n    entry_point = \"%s.js\" % test,\n) for test, data in (\n    (\"JavaScriptTest\", TEST_DATA),\n    (\"JavaScriptUnionVectorTest\", TEST_UNION_VECTOR_DATA),\n    # TODO(philsc): Figure out how to run this test with flexbuffers available.\n    # At the moment the flexbuffer library is not exposed as a bazel target.\n    #(\"JavaScriptFlexBuffersTest\", TBD_DATA)\n    (\"JavaScriptComplexArraysTest\", TEST_COMPLEX_ARRAYS_DATA),\n)]\n"
  },
  {
    "path": "tests/ts/JavaScriptComplexArraysTest.js",
    "content": "/* global BigInt */\n\nimport assert from 'assert';\nimport * as flatbuffers from 'flatbuffers';\nimport {readFileSync, writeFileSync} from 'fs';\n\nimport {ArrayStructT} from './arrays_test_complex/my-game/example/array-struct.js'\nimport {ArrayTable, ArrayTableT} from './arrays_test_complex/my-game/example/array-table.js'\nimport {InnerStructT} from './arrays_test_complex/my-game/example/inner-struct.js'\nimport {NestedStructT} from './arrays_test_complex/my-game/example/nested-struct.js'\nimport {OuterStructT} from './arrays_test_complex/my-game/example/outer-struct.js'\nimport {TestEnum} from './arrays_test_complex/my-game/example/test-enum.js'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nBigInt.prototype.toJSON = function() {\n  return this.toString();\n};\nfunction fbObjToObj(fbObj) {\n  const ret = {};\n  for (const propName of Object.keys(fbObj)) {\n    const key = propName;\n    const prop = fbObj[key];\n    if (prop.valueOf) {\n      ret[key] = prop.valueOf();\n    } else if (typeof prop === 'object') {\n      ret[key] = fbObjToObj(prop);\n    }\n  }\n  return ret;\n}\nfunction testBuild(monFile, jsFile) {\n  const arrayTable = new ArrayTableT(\n    'Complex Array Test',\n    new ArrayStructT(\n      221.139008,\n      [-700, -600, -500, -400, -300, -200, -100, 0, 100, 200, 300, 400, 500, 600, 700],\n      13,\n      [\n        new NestedStructT(\n          [233, -123],\n          TestEnum.B,\n          [TestEnum.A, TestEnum.C],\n          [\n            new OuterStructT(\n              false,\n              123.456,\n              new InnerStructT(\n                123456792.0,\n                [13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1],\n                91,\n                BigInt('9007199254740999')\n              ),\n              [\n                new InnerStructT(\n                  -987654321.9876,\n                  [255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243],\n                  123,\n                  BigInt('9007199254741000')\n                ),\n                new InnerStructT(\n                  123000987.9876,\n                  [101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113],\n                  -123,\n                  BigInt('9007199254741000')\n                ),\n              ],\n              new InnerStructT(\n                987654321.9876,\n                [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13],\n                19,\n                BigInt('9007199254741000')\n              ),\n              [111000111.222, 222000222.111, 333000333.333, 444000444.444]\n            ),\n          ]\n        ),\n      ],\n      -123456789\n    )\n  );\n  const builder = new flatbuffers.Builder();\n  builder.finish(arrayTable.pack(builder));\n  if (jsFile) {\n    const obj = fbObjToObj(arrayTable);\n    writeFileSync(jsFile, `export default ${JSON.stringify(obj, null, 2)}`);\n  }\n  if (monFile) {\n    writeFileSync(monFile, builder.asUint8Array());\n  }\n  return builder.asUint8Array();\n}\nfunction testParse(monFile, jsFile, buffer) {\n  if (!buffer) {\n    if (!monFile) {\n      console.log(`Please specify mon file read the buffer from.`);\n      process.exit(1);\n    }\n    buffer = readFileSync(monFile);\n  }\n  const byteBuffer = new flatbuffers.ByteBuffer(new Uint8Array(buffer));\n  const arrayTable = ArrayTable.getRootAsArrayTable(byteBuffer).unpack();\n  const json = JSON.stringify(arrayTable, null, 2);\n  if (jsFile) {\n    writeFileSync(jsFile, `export default ${json}`);\n  }\n  return arrayTable;\n}\nif (process.argv[2] === 'build') {\n  testBuild(process.argv[3], process.argv[4]);\n} else if (process.argv[2] === 'parse') {\n  testParse(process.argv[3], process.argv[4], null);\n} else {\n  const arr = testBuild(null, null);\n  const parsed = testParse(null, null, Buffer.from(arr));\n  assert.strictEqual(parsed.a, 'Complex Array Test', 'String Test');\n  assert.strictEqual(\n      parsed?.cUnderscore?.aUnderscore, 221.13900756835938, 'Float Test');\n  assert.deepEqual(\n      parsed?.cUnderscore?.bUnderscore,\n      [\n        -700, -600, -500, -400, -300, -200, -100, 0, 100, 200, 300, 400, 500,\n        600, 700\n      ],\n      'Array of signed integers');\n  assert.strictEqual(\n      parsed?.cUnderscore.d?.[0].dOuter[0].d[1].a, 123000987.9876,\n      'Float in deep');\n  assert.deepEqual(\n      parsed?.cUnderscore?.d[0].dOuter?.[0]?.e, {\n        a: 987654321.9876,\n        b: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13],\n        c: 19,\n        dUnderscore: '9007199254741000',\n      },\n      'Object in deep');\n  assert.deepEqual(parsed?.cUnderscore.g, ['0', '0'], 'Last object');\n\n  console.log('Arrays test: completed successfully');\n}\n"
  },
  {
    "path": "tests/ts/JavaScriptFlexBuffersTest.js",
    "content": "// Run this using JavaScriptTest.sh\nimport assert from 'assert'\nimport * as flexbuffers from 'flatbuffers/js/flexbuffers.js'\nimport fs from 'fs'\n\nfunction main() {\n  testSingleValueBuffers();\n  testGoldBuffer();\n  testEncode();\n  testIndirectAdd();\n  testIndirectWithCache();\n  testMapBuilder();\n  testRoundTrip();\n  testRoundTripWithBuilder();\n  testDeduplicationOff();\n  testBugWhereOffestWereStoredAsIntInsteadOfUInt();\n  testRootVector();\n\n  console.log('FlexBuffers test: completed successfully');\n}\n\nfunction testRootVector() {\n  // Root vector of strings\n  const stringVec = ['a', 'b', 'c'];\n  const bufStr = flexbuffers.encode(stringVec).buffer;\n  const objStr = flexbuffers.toObject(bufStr);\n  assert.deepStrictEqual(objStr, stringVec);\n\n  // Root vector of numbers\n  const numVec = [1, 2, 3, 4];\n  const bufNum = flexbuffers.encode(numVec).buffer;\n  const objNum = flexbuffers.toObject(bufNum);\n  assert.deepStrictEqual(objNum, numVec);\n\n  // Root vector of mixed types\n  const mixedVec = ['x', 42, true, null];\n  const bufMixed = flexbuffers.encode(mixedVec).buffer;\n  const objMixed = flexbuffers.toObject(bufMixed);\n  assert.deepStrictEqual(objMixed, mixedVec);\n}\n\nfunction testSingleValueBuffers() {\n  {\n    const ref = flexbuffers.toReference(new Uint8Array([0, 0, 1]).buffer);\n    assert.strictEqual(true, ref.isNull());\n  }\n\n  function _assert(object, buffer) {\n    assert.deepStrictEqual(\n        flexbuffers.toObject(new Uint8Array(buffer).buffer), object);\n  }\n  _assert(true, [1, 104, 1]);\n  _assert(false, [0, 104, 1]);\n  _assert(25, [25, 4, 1]);\n  _assert(-25, [231, 4, 1]);\n  _assert(230, [230, 8, 1]);\n  _assert(230, [230, 0, 5, 2]);\n  _assert(-1025, [255, 251, 5, 2]);\n  _assert(1025, [1, 4, 9, 2]);\n  _assert(2147483647, [255, 255, 255, 127, 6, 4]);\n  _assert(-2147483648, [0, 0, 0, 128, 6, 4]);\n  _assert(4294967295n, [255, 255, 255, 255, 0, 0, 0, 0, 7, 8]);\n  _assert(9223372036854775807n, [255, 255, 255, 255, 255, 255, 255, 127, 7, 8]);\n  _assert(-9223372036854775808n, [0, 0, 0, 0, 0, 0, 0, 128, 7, 8]);\n  _assert(\n      18446744073709551615n, [255, 255, 255, 255, 255, 255, 255, 255, 11, 8]);\n  _assert(4.5, [0, 0, 144, 64, 14, 4]);\n  _assert(0.10000000149011612, [205, 204, 204, 61, 14, 4]);\n  _assert(0.1, [154, 153, 153, 153, 153, 153, 185, 63, 15, 8]);\n  _assert(-1025, [255, 251, 5, 2]);\n  _assert('Maxim', [5, 77, 97, 120, 105, 109, 0, 6, 20, 1]);\n  _assert(\n      'hello 😱',\n      [10, 104, 101, 108, 108, 111, 32, 240, 159, 152, 177, 0, 11, 20, 1]);\n  _assert({a: 12}, [97, 0, 1, 3, 1, 1, 1, 12, 4, 2, 36, 1]);\n  _assert(\n      {'': 45, 'a': 12}, [0, 97, 0, 2, 4, 4, 2, 1, 2, 45, 12, 4, 4, 4, 36, 1]);\n}\n\nfunction testEncode() {\n  function _assert(value, buffer) {\n    assert.deepStrictEqual(flexbuffers.encode(value), new Uint8Array(buffer));\n  }\n  _assert(null, [0, 0, 1]);\n  _assert(true, [1, 104, 1]);\n  _assert(false, [0, 104, 1]);\n  _assert(1, [1, 4, 1]);\n  _assert(230, [230, 0, 5, 2]);\n  _assert(1025, [1, 4, 5, 2]);\n  _assert(-1025, [255, 251, 5, 2]);\n  _assert(0x100000001, [1, 0, 0, 0, 1, 0, 0, 0, 7, 8]);\n  _assert(0.1, [154, 153, 153, 153, 153, 153, 185, 63, 15, 8]);\n  _assert(0.5, [0, 0, 0, 63, 14, 4]);\n  _assert(new Uint8Array([1, 2, 3]), [3, 1, 2, 3, 3, 100, 1]);\n  _assert('Maxim', [5, 77, 97, 120, 105, 109, 0, 6, 20, 1]);\n  _assert(\n      'hello 😱',\n      [10, 104, 101, 108, 108, 111, 32, 240, 159, 152, 177, 0, 11, 20, 1]);\n  _assert([1, 2], [1, 2, 2, 64, 1]);\n  _assert([-1, 256], [255, 255, 0, 1, 4, 65, 1]);\n  _assert([-45, 256000], [211, 255, 255, 255, 0, 232, 3, 0, 8, 66, 1]);\n  _assert([1.1, -256.0], [\n    2,  0, 0,   0,   0,   0,   0,   0,   154, 153, 153, 153, 153, 153, 241,\n    63, 0, 255, 255, 255, 255, 255, 255, 255, 15,  5,   18,  43,  1\n  ]);\n  _assert([1, 2, 4], [1, 2, 4, 3, 76, 1]);\n  _assert([-1, 256, 4], [255, 255, 0, 1, 4, 0, 6, 77, 1]);\n  _assert([[61], 64], [1, 61, 2, 2, 64, 44, 4, 4, 40, 1]);\n  _assert(['foo', 'bar', 'baz'], [\n    3,  102, 111, 111, 0, 3,  98, 97, 114, 0,  3,\n    98, 97,  122, 0,   3, 15, 11, 7,  3,   60, 1\n  ]);\n  _assert(['foo', 'bar', 'baz', 'foo', 'bar', 'baz'], [\n    3,   102, 111, 111, 0,  3, 98, 97, 114, 0, 3,  98, 97,\n    122, 0,   6,   15,  11, 7, 18, 14, 10,  6, 60, 1\n  ]);\n  _assert([true, false, true], [3, 1, 0, 1, 3, 144, 1]);\n  _assert(['foo', 1, -5, 1.3, true], [\n    3,   102, 111, 111, 0,   0,   0,   0,   5,   0,   0,   0,   0,\n    0,   0,   0,   15,  0,   0,   0,   0,   0,   0,   0,   1,   0,\n    0,   0,   0,   0,   0,   0,   251, 255, 255, 255, 255, 255, 255,\n    255, 205, 204, 204, 204, 204, 204, 244, 63,  1,   0,   0,   0,\n    0,   0,   0,   0,   20,  4,   4,   15,  104, 45,  43,  1\n  ]);\n  _assert([1, 3.3, 'max', true, null, false], [\n    3,  109, 97, 120, 0, 0,  0,  0,   6, 0,   0,   0,   0,   0,   0,\n    0,  1,   0,  0,   0, 0,  0,  0,   0, 102, 102, 102, 102, 102, 102,\n    10, 64,  31, 0,   0, 0,  0,  0,   0, 0,   1,   0,   0,   0,   0,\n    0,  0,   0,  0,   0, 0,  0,  0,   0, 0,   0,   0,   0,   0,   0,\n    0,  0,   0,  0,   4, 15, 20, 104, 0, 104, 54,  43,  1\n  ]);\n  _assert({'a': 12}, [97, 0, 1, 3, 1, 1, 1, 12, 4, 2, 36, 1]);\n  _assert(\n      {'a': 12, '': 45}, [0, 97, 0, 2, 4, 4, 2, 1, 2, 45, 12, 4, 4, 4, 36, 1]);\n  // JS currently does not support key vector offset sharing\n  _assert([{'something': 12}, {'something': 45}], [\n    115, 111, 109, 101, 116, 104, 105, 110, 103, 0, 1,  11, 1, 1,  1,\n    12,  4,   6,   1,   1,   45,  4,   2,   8,   4, 36, 36, 4, 40, 1\n  ]);\n}\n\nfunction testDeduplicationOff() {\n  let buffer = flexbuffers.encode(\n      [{'something': 12}, {'something': 45}], 1, true, true, false);\n  assert.deepStrictEqual(\n      buffer, new Uint8Array([\n        115, 111, 109, 101, 116, 104, 105, 110, 103, 0,  1, 11, 1,  1, 1,  12,\n        4,   1,   18,  1,   1,   1,   45,  4,   2,   10, 4, 36, 36, 4, 40, 1\n      ]));\n\n  buffer = flexbuffers.encode(\n      [{'something': 12}, {'something': 45}], 1, true, false, false);\n  assert.deepStrictEqual(\n      buffer, new Uint8Array([\n        115, 111, 109, 101, 116, 104, 105, 110, 103, 0,   1,   11,  1,  1,\n        1,   12,  4,   115, 111, 109, 101, 116, 104, 105, 110, 103, 0,  1,\n        11,  1,   1,   1,   45,  4,   2,   20,  4,   36,  36,  4,   40, 1\n      ]));\n\n  buffer = flexbuffers.encode(\n      ['something', 'something', 'dark'], 1, true, false, false);\n  assert.deepStrictEqual(\n      buffer, new Uint8Array([\n        9,   115, 111, 109, 101, 116, 104, 105, 110, 103, 0,  4,\n        100, 97,  114, 107, 0,   3,   17,  18,  8,   3,   60, 1\n      ]));\n\n  buffer = flexbuffers.encode(\n      ['something', 'something', 'dark'], 1, false, false, false);\n  assert.deepStrictEqual(\n      buffer, new Uint8Array([\n        9,   115, 111, 109, 101, 116, 104, 105, 110, 103, 0, 9,\n        115, 111, 109, 101, 116, 104, 105, 110, 103, 0,   4, 100,\n        97,  114, 107, 0,   3,   28,  18,  8,   3,   60,  1\n      ]));\n}\n\nfunction testIndirectAdd() {\n  function _assertInt(buffer, value, indirect = false, cache = false) {\n    const builder = flexbuffers.builder();\n    builder.addInt(value, indirect, cache);\n    const data = builder.finish();\n    assert.deepStrictEqual(data, new Uint8Array(buffer));\n  }\n  function _assertUInt(buffer, value, indirect = false, cache = false) {\n    const builder = flexbuffers.builder();\n    builder.addUInt(value, indirect, cache);\n    const data = builder.finish();\n    assert.deepStrictEqual(data, new Uint8Array(buffer));\n  }\n  function _assertFloat(buffer, value, indirect = false, cache = false) {\n    const builder = flexbuffers.builder();\n    builder.addFloat(value, indirect, cache);\n    const data = builder.finish();\n    assert.deepStrictEqual(data, new Uint8Array(buffer));\n  }\n  _assertInt([0, 4, 1], 0);\n  _assertInt([0, 1, 24, 1], 0, true);\n  _assertInt([255, 0, 5, 2], 255);\n\n  _assertUInt([0, 8, 1], 0);\n  _assertUInt([0, 1, 28, 1], 0, true);\n  _assertUInt([255, 8, 1], 255);\n\n  _assertUInt([185, 115, 175, 118, 250, 84, 8, 0, 11, 8], 2345234523452345);\n  _assertUInt(\n      [185, 115, 175, 118, 250, 84, 8, 0, 8, 31, 1], 2345234523452345, true);\n  _assertInt([185, 115, 175, 118, 250, 84, 8, 0, 7, 8], 2345234523452345);\n  _assertInt(\n      [185, 115, 175, 118, 250, 84, 8, 0, 8, 27, 1], 2345234523452345, true);\n\n  _assertFloat([154, 153, 153, 153, 153, 153, 185, 63, 15, 8], 0.1);\n  _assertFloat([154, 153, 153, 153, 153, 153, 185, 63, 8, 35, 1], 0.1, true);\n  _assertFloat([0, 0, 0, 0, 14, 4], 0);\n  _assertFloat([0, 0, 0, 0, 4, 34, 1], 0, true);\n}\n\nfunction testIndirectWithCache() {\n  function _assertInt(buffer, values) {\n    const builder = flexbuffers.builder();\n    builder.startVector();\n    values.forEach(v => {builder.addInt(v, true, true)});\n    builder.end();\n    const data = builder.finish();\n    assert.deepStrictEqual(data, new Uint8Array(buffer));\n  }\n\n  function _assertUInt(buffer, values) {\n    const builder = flexbuffers.builder();\n    builder.startVector();\n    values.forEach(v => {\n      builder.addUInt(v, true, true);\n    });\n    builder.end();\n    const data = builder.finish();\n    assert.deepStrictEqual(data, new Uint8Array(buffer));\n  }\n\n  function _assertFloat(buffer, values) {\n    const builder = flexbuffers.builder();\n    builder.startVector();\n    values.forEach(v => {\n      builder.addFloat(v, true, true);\n    });\n    builder.end();\n    const data = builder.finish();\n    assert.deepStrictEqual(data, new Uint8Array(buffer));\n  }\n\n  _assertInt(\n      [\n        185, 115, 175, 118, 250, 84, 8,  0, 4,  9,\n        10,  11,  12,  27,  27,  27, 27, 8, 40, 1\n      ],\n      [2345234523452345, 2345234523452345, 2345234523452345, 2345234523452345]);\n\n  _assertUInt(\n      [\n        185, 115, 175, 118, 250, 84, 8,  0, 4,  9,\n        10,  11,  12,  31,  31,  31, 31, 8, 40, 1\n      ],\n      [2345234523452345, 2345234523452345, 2345234523452345, 2345234523452345]);\n\n  _assertFloat(\n      [\n        154, 153, 153, 153, 153, 153, 185, 63, 4,  9,\n        10,  11,  12,  35,  35,  35,  35,  8,  40, 1\n      ],\n      [0.1, 0.1, 0.1, 0.1]);\n}\n\nfunction testMapBuilder() {\n  const builder = flexbuffers.builder();\n  builder.startMap();\n  builder.addKey('a');\n  builder.add(12);\n  builder.addKey('');\n  builder.add(45);\n  builder.end();\n  const data = builder.finish();\n  assert.deepStrictEqual(\n      data,\n      new Uint8Array([97, 0, 0, 2, 2, 5, 2, 1, 2, 45, 12, 4, 4, 4, 36, 1]));\n}\n\nfunction testRoundTrip() {\n  const example = {\n    'age': 35,\n    'flags': [true, false, true, true],\n    'weight': 72.5,\n    'name': 'Maxim',\n    'address': {\n      'city': 'Bla',\n      'zip': '12345',\n      'countryCode': 'XX',\n    }\n  };\n\n  function _assert(value) {\n    let buffer = flexbuffers.encode(value, 1);\n    let o = flexbuffers.toObject(buffer.buffer);\n    assert.deepStrictEqual(o, value);\n  }\n\n  _assert(example);\n  _assert(0x100000001n);\n  _assert({test_number: 72.6})\n}\n\nfunction testRoundTripWithBuilder() {\n  const example = {\n    'age': 35,\n    'flags': [true, false, true, true],\n    'weight': 72.5,\n    'name': 'Maxim',\n    'address': {\n      'city': 'Bla',\n      'zip': '12345',\n      'countryCode': 'XX',\n    }\n  };\n\n  const builder = flexbuffers.builder();\n  builder.startMap();\n\n  builder.addKey('age');\n  builder.add(35);\n\n  builder.addKey('flags');\n  builder.startVector();\n  builder.add(true);\n  builder.add(false);\n  builder.add(true);\n  builder.add(true);\n  builder.end();\n\n  builder.addKey('weight');\n  builder.add(72.5);\n\n  builder.addKey('name');\n  builder.add('Maxim');\n\n  builder.addKey('address');\n\n  builder.startMap();\n  builder.addKey('city');\n  builder.add('Bla');\n  builder.addKey('zip');\n  builder.add('12345');\n  builder.addKey('countryCode');\n  builder.add('XX');\n  builder.end();\n\n  builder.end();\n\n  const data = builder.finish();\n  let o = flexbuffers.toObject(data.buffer);\n  assert.deepStrictEqual(o, example);\n\n  let root = flexbuffers.toReference(data.buffer);\n  assert.strictEqual(root.isMap(), true);\n  assert.strictEqual(root.get('age').numericValue(), 35);\n  assert.strictEqual(root.get('age').intValue(), 35);\n  assert.strictEqual(root.get('name').stringValue(), 'Maxim');\n  assert.strictEqual(root.get('weight').floatValue(), 72.5);\n  assert.strictEqual(root.get('weight').numericValue(), 72.5);\n  let flags = root.get('flags');\n  assert.strictEqual(flags.isVector(), true);\n  assert.strictEqual(flags.length(), 4);\n  assert.strictEqual(flags.get(0).boolValue(), true);\n  assert.strictEqual(flags.get(1).boolValue(), false);\n  assert.strictEqual(flags.get(2).boolValue(), true);\n  assert.strictEqual(flags.get(3).boolValue(), true);\n\n  let address = root.get('address');\n  assert.strictEqual(address.isMap(), true);\n  assert.strictEqual(address.length(), 3);\n  assert.strictEqual(address.get('city').stringValue(), 'Bla');\n  assert.strictEqual(address.get('zip').stringValue(), '12345');\n  assert.strictEqual(address.get('countryCode').stringValue(), 'XX');\n}\n\nfunction testGoldBuffer() {\n  const data =\n      new Uint8Array(fs.readFileSync('../gold_flexbuffer_example.bin')).buffer;\n  const b1 = flexbuffers.toReference(data).get('bools').get(1);\n  assert.strictEqual(b1.isBool(), true);\n  assert.strictEqual(b1.boolValue(), false);\n\n  const blob = flexbuffers.toReference(data).get('vec').get(3);\n  assert.strictEqual(blob.isBlob(), true);\n  assert.deepStrictEqual(blob.blobValue(), new Uint8Array([77]));\n\n  const o = flexbuffers.toObject(data);\n  assert.deepStrictEqual(o, {\n    bool: true,\n    bools: [true, false, true, false],\n    bar: [1, 2, 3],\n    bar3: [1, 2, 3],\n    foo: 100,\n    mymap: {foo: 'Fred'},\n    vec: [-100, 'Fred', 4, new Uint8Array([77]), false, 4]\n  });\n}\n\nfunction testBugWhereOffestWereStoredAsIntInsteadOfUInt() {\n  // Reported in\n  // https://github.com/google/flatbuffers/issues/5949#issuecomment-688421193\n  const object = {\n    'channels_in': 64,\n    'dilation_height_factor': 1,\n    'dilation_width_factor': 1,\n    'fused_activation_function': 1,\n    'pad_values': 1,\n    'padding': 0,\n    'stride_height': 1,\n    'stride_width': 1\n  };\n  let data1 = flexbuffers.encode(object);\n  const data = [\n    99,  104, 97,  110, 110, 101, 108, 115, 95,  105, 110, 0,   100, 105, 108,\n    97,  116, 105, 111, 110, 95,  104, 101, 105, 103, 104, 116, 95,  102, 97,\n    99,  116, 111, 114, 0,   100, 105, 108, 97,  116, 105, 111, 110, 95,  119,\n    105, 100, 116, 104, 95,  102, 97,  99,  116, 111, 114, 0,   102, 117, 115,\n    101, 100, 95,  97,  99,  116, 105, 118, 97,  116, 105, 111, 110, 95,  102,\n    117, 110, 99,  116, 105, 111, 110, 0,   112, 97,  100, 95,  118, 97,  108,\n    117, 101, 115, 0,   112, 97,  100, 100, 105, 110, 103, 0,   115, 116, 114,\n    105, 100, 101, 95,  104, 101, 105, 103, 104, 116, 0,   115, 116, 114, 105,\n    100, 101, 95,  119, 105, 100, 116, 104, 0,   8,   130, 119, 97,  76,  51,\n    41,  34,  21,  8,   1,   8,   64,  1,   1,   1,   1,   0,   1,   1,   4,\n    4,   4,   4,   4,   4,   4,   4,   16,  36,  1\n  ];\n  let object2 = flexbuffers.toObject(new Uint8Array(data).buffer);\n  let object1 = flexbuffers.toObject(new Uint8Array(data1).buffer);\n  assert.deepStrictEqual(object, object2);\n  assert.deepStrictEqual(object, object1);\n  assert.strictEqual(data.length, data1.length);\n  let ref = flexbuffers.toReference(new Uint8Array(data).buffer);\n  assert.strictEqual(ref.isMap(), true);\n  assert.strictEqual(ref.length(), 8);\n  assert.strictEqual(ref.get('channels_in').numericValue(), 64);\n  assert.strictEqual(ref.get('padding').isNumber(), true);\n}\n\nmain();\n"
  },
  {
    "path": "tests/ts/JavaScriptRelativeImportPathTest.js",
    "content": "import { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, resolve } from \"node:path\";\n\nconst here = dirname(fileURLToPath(import.meta.url));\nconst headerPath = resolve(here, \"relative_imports/transit/three/header.ts\");\n\nconst contents = readFileSync(headerPath, \"utf8\");\n\nconst expectedImports = [\n  \"from '../one/info.js';\",\n  \"from '../two/identity.js';\",\n];\n\nfor (const expected of expectedImports) {\n  if (!contents.includes(expected)) {\n    throw new Error(`Missing relative import \"${expected}\" in ${headerPath}`);\n  }\n}\n\nconst forbidden = \"../transit/\";\nif (contents.includes(forbidden)) {\n  throw new Error(\n    `Found unexpected namespace segment in import path within ${headerPath}`\n  );\n}\n\nconsole.log(\"JavaScriptRelativeImportPathTest: OK\");\n"
  },
  {
    "path": "tests/ts/JavaScriptRequiredStringTest.js",
    "content": "import assert from 'assert'\nimport * as flatbuffers from 'flatbuffers';\n\nimport {Foo} from './required-strings/foo.js';\n\n\nvar builder = new flatbuffers.Builder();\n\nfunction main() {\n  testMissingFirstRequiredString();\n  builder.clear();\n  testMissingSecondRequiredString();\n}\n\nfunction testMissingFirstRequiredString() {\n  const undefined_string = builder.createString(undefined);\n  const defined_string = builder.createString('cat');\n\n  assert.throws(() => Foo.createFoo(builder, undefined_string, defined_string));\n}\n\nfunction testMissingSecondRequiredString() {\n  const defined_string = builder.createString('cat');\n  const undefined_string = builder.createString(undefined);\n\n  assert.throws(() => Foo.createFoo(builder, defined_string, undefined_string));\n}\n\nmain();\n"
  },
  {
    "path": "tests/ts/JavaScriptTest.js",
    "content": "// Run this using JavaScriptTest.sh\nimport assert from 'assert'\nimport * as flatbuffers from 'flatbuffers'\nimport fs from 'fs'\n\nimport {Any} from './my-game/example/any.js';\nimport {Color} from './my-game/example/color.js';\nimport {Monster, MonsterT} from './my-game/example/monster.js'\nimport {Stat} from './my-game/example/stat.js'\nimport {Test, TestT} from './my-game/example/test.js'\nimport {Vec3} from './my-game/example/vec3.js'\n\nfunction main() {\n  // First, let's test reading a FlatBuffer generated by C++ code:\n  // This file was generated from monsterdata_test.json\n  var data = new Uint8Array(fs.readFileSync('../monsterdata_test.mon'));\n\n  // Now test it:\n\n  var bb = new flatbuffers.ByteBuffer(data);\n  testBuffer(bb);\n\n  // Second, let's create a FlatBuffer from scratch in JavaScript, and test it\n  // also. We use an initial size of 1 to exercise the reallocation algorithm,\n  // normally a size larger than the typical FlatBuffer you generate would be\n  // better for performance.\n  var fbb = new flatbuffers.Builder(1);\n  createMonster(fbb);\n  serializeAndTest(fbb);\n  testObjApiPack(fbb);\n\n  // clear the builder, repeat tests\n  var clearIterations = 100;\n  var startingCapacity = fbb.bb.capacity();\n  for (var i = 0; i < clearIterations; i++) {\n    fbb.clear();\n    createMonster(fbb);\n    serializeAndTest(fbb);\n    testObjApiPack(fbb);\n  }\n  // the capacity of our buffer shouldn't increase with the same size payload\n  assert.strictEqual(fbb.bb.capacity(), startingCapacity);\n\n  test64bit();\n  testUnicode();\n  fuzzTest1();\n  testNullStrings();\n  testSharedStrings();\n  testVectorOfStructs();\n  testCreateByteVector();\n\n  console.log('FlatBuffers test: completed successfully');\n}\n\nfunction createMonster(fbb) {\n  // We set up the same values as monsterdata.json:\n\n  var str = fbb.createString('MyMonster');\n\n  var inv = Monster.createInventoryVector(fbb, [0, 1, 2, 3, 4]);\n\n  var fred = fbb.createString('Fred');\n  Monster.startMonster(fbb);\n  Monster.addName(fbb, fred);\n  var mon2 = Monster.endMonster(fbb);\n\n  Monster.startTest4Vector(fbb, 2);\n  Test.createTest(fbb, 10, 20);\n  Test.createTest(fbb, 30, 40);\n  var test4 = fbb.endVector();\n\n  var testArrayOfString = Monster.createTestarrayofstringVector(\n      fbb, [fbb.createString('test1'), fbb.createString('test2')]);\n\n  var testVectorOfLongs =\n      Monster.createVectorOfLongsVector(fbb, [1n, 101010100n]);\n\n  Monster.startMonster(fbb);\n  Monster.addPos(fbb, Vec3.createVec3(fbb, 1, 2, 3, 3, Color.Green, 5, 6));\n  Monster.addHp(fbb, 80);\n  Monster.addName(fbb, str);\n  Monster.addInventory(fbb, inv);\n  Monster.addTestType(fbb, Any.Monster);\n  Monster.addTest(fbb, mon2);\n  Monster.addTest4(fbb, test4);\n  Monster.addTestarrayofstring(fbb, testArrayOfString);\n  Monster.addVectorOfLongs(fbb, testVectorOfLongs);\n  Monster.addTestbool(fbb, true);\n  var mon = Monster.endMonster(fbb);\n\n  Monster.finishMonsterBuffer(fbb, mon);\n}\n\nfunction serializeAndTest(fbb) {\n  // Write the result to a file for debugging purposes:\n  // Note that the binaries are not necessarily identical, since the JSON\n  // parser may serialize in a slightly different order than the above\n  // JavaScript code. They are functionally equivalent though.\n\n  fs.writeFileSync(\n      'monsterdata_javascript_wire.mon', Buffer.from(fbb.asUint8Array()));\n\n  // Tests mutation first.  This will verify that we did not trample any other\n  // part of the byte buffer.\n  testMutation(fbb.dataBuffer());\n\n  testBuffer(fbb.dataBuffer());\n}\n\nfunction testMutation(bb) {\n  var monster = Monster.getRootAsMonster(bb);\n\n  monster.mutate_hp(120);\n  assert.strictEqual(monster.hp(), 120);\n\n  monster.mutate_hp(80);\n  assert.strictEqual(monster.hp(), 80);\n\n  var manaRes = monster.mutate_mana(10);\n  assert.strictEqual(\n      manaRes, false);  // Field was NOT present, because default value.\n\n  // TODO: There is not the availability to mutate structs or vectors.\n}\n\nfunction testObjApiPack(fbb) {\n  fbb.clear();\n  createMonster(fbb);\n  let monster_t = Monster.getRootAsMonster(fbb.dataBuffer()).unpack();\n  fbb.clear();\n  Monster.finishMonsterBuffer(fbb, monster_t.pack(fbb));\n  serializeAndTest(fbb);\n}\n\nfunction testObjApiUnpack(monster) {\n  assert.strictEqual(monster.hp, 80);\n  assert.strictEqual(monster.mana, 150);  // default\n\n  assert.strictEqual(monster.name, 'MyMonster');\n\n  let pos = monster.pos;\n  assert.strictEqual(pos.x, 1);\n  assert.strictEqual(pos.y, 2);\n  assert.strictEqual(pos.z, 3);\n  assert.strictEqual(pos.test1, 3);\n  assert.strictEqual(pos.test2, Color.Green);\n  let test3 = pos.test3;\n  assert.strictEqual(test3.a, 5);\n  assert.strictEqual(test3.b, 6);\n\n  assert.strictEqual(monster.testType, Any.Monster);\n  let monster2 = monster.test;\n  assert.strictEqual(monster2 != null, true);\n  assert.strictEqual(monster2 instanceof MonsterT, true);\n  assert.strictEqual(monster2.name, 'Fred');\n\n  assert.strictEqual(monster.inventory.length, 5);\n  let invsum = 0;\n  for (let i = 0; i < monster.inventory.length; i++) {\n    invsum += monster.inventory[i];\n  }\n  assert.strictEqual(invsum, 10);\n\n  let test_0 = monster.test4[0];\n  let test_1 = monster.test4[1];\n  assert.strictEqual(monster.test4.length, 2);\n  assert.strictEqual(test_0.a + test_0.b + test_1.a + test_1.b, 100);\n\n  assert.strictEqual(monster.testarrayofstring.length, 2);\n  assert.strictEqual(monster.testarrayofstring[0], 'test1');\n  assert.strictEqual(monster.testarrayofstring[1], 'test2');\n\n  assert.strictEqual(monster.testbool, true);\n}\n\nfunction testBuffer(bb) {\n  assert.ok(Monster.bufferHasIdentifier(bb));\n\n  var monster = Monster.getRootAsMonster(bb);\n\n  assert.strictEqual(monster.hp(), 80);\n  assert.strictEqual(monster.mana(), 150);  // default\n\n  assert.strictEqual(monster.name(), 'MyMonster');\n\n  var pos = monster.pos();\n  assert.strictEqual(pos.x(), 1);\n  assert.strictEqual(pos.y(), 2);\n  assert.strictEqual(pos.z(), 3);\n  assert.strictEqual(pos.test1(), 3);\n  assert.strictEqual(pos.test2(), Color.Green);\n  var t = pos.test3();\n  assert.strictEqual(t.a(), 5);\n  assert.strictEqual(t.b(), 6);\n\n  assert.strictEqual(monster.testType(), Any.Monster);\n  var monster2 = new Monster();\n  assert.strictEqual(monster.test(monster2) != null, true);\n  assert.strictEqual(monster2.name(), 'Fred');\n\n  assert.strictEqual(monster.inventoryLength(), 5);\n  var invsum = 0;\n  for (var i = 0; i < monster.inventoryLength(); i++) {\n    invsum += monster.inventory(i);\n  }\n  assert.strictEqual(invsum, 10);\n\n  var invsum2 = 0;\n  var invArr = monster.inventoryArray();\n  for (var i = 0; i < invArr.length; i++) {\n    invsum2 += invArr[i];\n  }\n  assert.strictEqual(invsum2, 10);\n\n  let longSum = 0n;\n  for (let idx = 0; idx < monster.vectorOfLongsLength(); ++idx) {\n    longSum += monster.vectorOfLongs(idx);\n  }\n  assert.strictEqual(longSum, 101010101n);\n\n  var test_0 = monster.test4(0);\n  var test_1 = monster.test4(1);\n  assert.strictEqual(monster.test4Length(), 2);\n  assert.strictEqual(test_0.a() + test_0.b() + test_1.a() + test_1.b(), 100);\n\n  assert.strictEqual(monster.testarrayofstringLength(), 2);\n  assert.strictEqual(monster.testarrayofstring(0), 'test1');\n  assert.strictEqual(monster.testarrayofstring(1), 'test2');\n\n  assert.strictEqual(monster.testbool(), true);\n\n  let monster_t = monster.unpack();\n  testObjApiUnpack(monster_t);\n\n  let monster2_t = new MonsterT();\n  monster.unpackTo(monster2_t);\n  testObjApiUnpack(monster2_t);\n}\n\nfunction test64bit() {\n  var fbb = new flatbuffers.Builder();\n  var required = fbb.createString('required');\n\n  Stat.startStat(fbb);\n  var stat2 = Stat.endStat(fbb);\n\n  Monster.startMonster(fbb);\n  Monster.addName(fbb, required);\n  Monster.addTestempty(fbb, stat2);\n  var mon2 = Monster.endMonster(fbb);\n\n  Stat.startStat(fbb);\n  // 2541551405100253985 = 0x2345678987654321\n  Stat.addVal(fbb, 0x2345678987654321n);\n  var stat = Stat.endStat(fbb);\n\n  Monster.startMonster(fbb);\n  Monster.addName(fbb, required);\n  Monster.addEnemy(fbb, mon2);\n  Monster.addTestempty(fbb, stat);\n  var mon = Monster.endMonster(fbb);\n\n  Monster.finishMonsterBuffer(fbb, mon);\n  var bytes = fbb.asUint8Array();\n\n  ////////////////////////////////////////////////////////////////\n\n  var bb = new flatbuffers.ByteBuffer(bytes);\n  assert.ok(Monster.bufferHasIdentifier(bb));\n  var mon = Monster.getRootAsMonster(bb);\n\n  var stat = mon.testempty();\n  assert.strictEqual(stat != null, true);\n  assert.strictEqual(stat.val() != null, true);\n  assert.strictEqual(stat.val(), 2541551405100253985n);\n\n  var mon2 = mon.enemy();\n  assert.strictEqual(mon2 != null, true);\n  stat = mon2.testempty();\n  assert.strictEqual(stat != null, true);\n  assert.strictEqual(stat.val() != null, true);\n  assert.strictEqual(stat.val(), 0n);  // default value\n}\n\nfunction testUnicode() {\n  var correct = fs.readFileSync('../unicode_test.mon');\n  var json = JSON.parse(fs.readFileSync('../unicode_test.json', 'utf8'));\n\n  // Test reading\n  function testReadingUnicode(bb) {\n    var monster = Monster.getRootAsMonster(bb);\n    assert.strictEqual(monster.name(), json.name);\n    assert.deepEqual(\n        Buffer.from(monster.name(flatbuffers.Encoding.UTF8_BYTES)),\n        Buffer.from(json.name));\n    assert.strictEqual(\n        monster.testarrayoftablesLength(), json.testarrayoftables.length);\n    json.testarrayoftables.forEach(function(table, i) {\n      var value = monster.testarrayoftables(i);\n      assert.strictEqual(value.name(), table.name);\n      assert.deepEqual(\n          Buffer.from(value.name(flatbuffers.Encoding.UTF8_BYTES)),\n          Buffer.from(table.name));\n    });\n    assert.strictEqual(\n        monster.testarrayofstringLength(), json.testarrayofstring.length);\n    json.testarrayofstring.forEach(function(string, i) {\n      assert.strictEqual(monster.testarrayofstring(i), string);\n      assert.deepEqual(\n          Buffer.from(\n              monster.testarrayofstring(i, flatbuffers.Encoding.UTF8_BYTES)),\n          Buffer.from(string));\n    });\n  }\n  testReadingUnicode(new flatbuffers.ByteBuffer(new Uint8Array(correct)));\n\n  // Test writing\n  var fbb = new flatbuffers.Builder();\n  var name = fbb.createString(json.name);\n  var testarrayoftablesOffsets = json.testarrayoftables.map(function(table) {\n    var name = fbb.createString(new Uint8Array(Buffer.from(table.name)));\n    Monster.startMonster(fbb);\n    Monster.addName(fbb, name);\n    return Monster.endMonster(fbb);\n  });\n  var testarrayoftablesOffset =\n      Monster.createTestarrayoftablesVector(fbb, testarrayoftablesOffsets);\n  var testarrayofstringOffset = Monster.createTestarrayofstringVector(\n      fbb, json.testarrayofstring.map(function(string) {\n        return fbb.createString(string);\n      }));\n  Monster.startMonster(fbb);\n  Monster.addTestarrayofstring(fbb, testarrayofstringOffset);\n  Monster.addTestarrayoftables(fbb, testarrayoftablesOffset);\n  Monster.addName(fbb, name);\n  Monster.finishSizePrefixedMonsterBuffer(fbb, Monster.endMonster(fbb));\n  var bb = new flatbuffers.ByteBuffer(fbb.asUint8Array())\n  bb.setPosition(4);\n  testReadingUnicode(bb);\n}\n\nvar __imul = Math.imul ? Math.imul : function(a, b) {\n  var ah = a >> 16 & 65535;\n  var bh = b >> 16 & 65535;\n  var al = a & 65535;\n  var bl = b & 65535;\n  return al * bl + (ah * bl + al * bh << 16) | 0;\n};\n\n// Include simple random number generator to ensure results will be the\n// same cross platform.\n// http://en.wikipedia.org/wiki/Park%E2%80%93Miller_random_number_generator\nvar lcg_seed = 48271;\n\nfunction lcg_rand() {\n  return lcg_seed = (__imul(lcg_seed, 279470273) >>> 0) % 4294967291;\n}\n\nfunction lcg_reset() {\n  lcg_seed = 48271;\n}\n\n// Converts a Field ID to a virtual table offset.\nfunction fieldIndexToOffset(field_id) {\n  // Should correspond to what EndTable() below builds up.\n  var fixed_fields = 2;  // Vtable size and Object Size.\n  return (field_id + fixed_fields) * 2;\n}\n\n// Low level stress/fuzz test: serialize/deserialize a variety of\n// different kinds of data in different combinations\nfunction fuzzTest1() {\n  // Values we're testing against: chosen to ensure no bits get chopped\n  // off anywhere, and also be different from eachother.\n  var bool_val = true;\n  var char_val = -127;  // 0x81\n  var uchar_val = 0xFF;\n  var short_val = -32222;  // 0x8222;\n  var ushort_val = 0xFEEE;\n  var int_val = 0x83333333 | 0;\n  var uint_val = 0xFDDDDDDD;\n  var long_val = BigInt.asIntN(64, 0x8444444444444444n);\n  var ulong_val = BigInt.asUintN(64, 0xFCCCCCCCCCCCCCCCn);\n  var float_val = new Float32Array([3.14159])[0];\n  var double_val = 3.14159265359;\n\n  var test_values_max = 11;\n  var fields_per_object = 4;\n  var num_fuzz_objects = 10000;  // The higher, the more thorough :)\n\n  var builder = new flatbuffers.Builder();\n\n  lcg_reset();  // Keep it deterministic.\n\n  var objects = [];\n\n  // Generate num_fuzz_objects random objects each consisting of\n  // fields_per_object fields, each of a random type.\n  for (var i = 0; i < num_fuzz_objects; i++) {\n    builder.startObject(fields_per_object);\n    for (var f = 0; f < fields_per_object; f++) {\n      var choice = lcg_rand() % test_values_max;\n      switch (choice) {\n        case 0:\n          builder.addFieldInt8(f, bool_val, 0);\n          break;\n        case 1:\n          builder.addFieldInt8(f, char_val, 0);\n          break;\n        case 2:\n          builder.addFieldInt8(f, uchar_val, 0);\n          break;\n        case 3:\n          builder.addFieldInt16(f, short_val, 0);\n          break;\n        case 4:\n          builder.addFieldInt16(f, ushort_val, 0);\n          break;\n        case 5:\n          builder.addFieldInt32(f, int_val, 0);\n          break;\n        case 6:\n          builder.addFieldInt32(f, uint_val, 0);\n          break;\n        case 7:\n          builder.addFieldInt64(f, long_val, 0n);\n          break;\n        case 8:\n          builder.addFieldInt64(f, ulong_val, 0n);\n          break;\n        case 9:\n          builder.addFieldFloat32(f, float_val, 0);\n          break;\n        case 10:\n          builder.addFieldFloat64(f, double_val, 0);\n          break;\n      }\n    }\n    objects.push(builder.endObject());\n  }\n  builder.prep(8, 0);  // Align whole buffer.\n\n  lcg_reset();  // Reset.\n\n  builder.finish(objects[objects.length - 1]);\n  var bytes = new Uint8Array(builder.asUint8Array());\n  var view = new DataView(bytes.buffer);\n\n  // Test that all objects we generated are readable and return the\n  // expected values. We generate random objects in the same order\n  // so this is deterministic.\n  for (var i = 0; i < num_fuzz_objects; i++) {\n    var offset = bytes.length - objects[i];\n    for (var f = 0; f < fields_per_object; f++) {\n      var choice = lcg_rand() % test_values_max;\n      var vtable_offset = fieldIndexToOffset(f);\n      var vtable = offset - view.getInt32(offset, true);\n      assert.ok(vtable_offset < view.getInt16(vtable, true));\n      var field_offset = offset + view.getInt16(vtable + vtable_offset, true);\n      switch (choice) {\n        case 0:\n          assert.strictEqual(!!view.getInt8(field_offset), bool_val);\n          break;\n        case 1:\n          assert.strictEqual(view.getInt8(field_offset), char_val);\n          break;\n        case 2:\n          assert.strictEqual(view.getUint8(field_offset), uchar_val);\n          break;\n        case 3:\n          assert.strictEqual(view.getInt16(field_offset, true), short_val);\n          break;\n        case 4:\n          assert.strictEqual(view.getUint16(field_offset, true), ushort_val);\n          break;\n        case 5:\n          assert.strictEqual(view.getInt32(field_offset, true), int_val);\n          break;\n        case 6:\n          assert.strictEqual(view.getUint32(field_offset, true), uint_val);\n          break;\n        case 7:\n          assert.strictEqual(view.getBigInt64(field_offset, true), long_val);\n          break;\n        case 8:\n          assert.strictEqual(view.getBigUint64(field_offset, true), ulong_val);\n          break;\n        case 9:\n          assert.strictEqual(view.getFloat32(field_offset, true), float_val);\n          break;\n        case 10:\n          assert.strictEqual(view.getFloat64(field_offset, true), double_val);\n          break;\n      }\n    }\n  }\n}\n\nfunction testSharedStrings() {\n  var shared_string = 'Hello world';\n  var builder = new flatbuffers.Builder();\n  let mainOffset = builder.createSharedString(shared_string);\n  assert.strictEqual(builder.createSharedString(shared_string), mainOffset);\n}\n\nfunction testNullStrings() {\n  var builder = new flatbuffers.Builder();\n  assert.strictEqual(builder.createString(null), 0);\n  assert.strictEqual(builder.createSharedString(null), 0);\n  assert.strictEqual(builder.createString(undefined), 0);\n  assert.strictEqual(builder.createSharedString(undefined), 0);\n}\n\nfunction testVectorOfStructs() {\n  let monster = new MonsterT();\n  monster.name = 'testVectorOfStructs';\n  monster.test4 = [new TestT(1, 2), new TestT(3, 4)];\n\n  let builder = new flatbuffers.Builder();\n  builder.finish(monster.pack(builder));\n\n  let decodedMonster = Monster.getRootAsMonster(builder.dataBuffer()).unpack();\n  assert.strictEqual(decodedMonster.test4[0].a, 1);\n  assert.strictEqual(decodedMonster.test4[0].b, 2);\n  assert.strictEqual(decodedMonster.test4[1].a, 3);\n  assert.strictEqual(decodedMonster.test4[1].b, 4);\n}\n\nfunction testCreateByteVector() {\n  const data = Uint8Array.from([1, 2, 3, 4, 5]);\n\n  const builder = new flatbuffers.Builder();\n  const required = builder.createString('required');\n  const offset = builder.createByteVector(data);\n\n  Monster.startMonster(builder);\n  Monster.addName(builder, required);\n  Monster.addInventory(builder, offset)\n  builder.finish(Monster.endMonster(builder));\n\n  let decodedMonster = Monster.getRootAsMonster(builder.dataBuffer());\n  assert.deepEqual(decodedMonster.inventoryArray(), data);\n}\n\nmain();\n"
  },
  {
    "path": "tests/ts/JavaScriptTestv1.cjs",
    "content": "// Run this using JavaScriptTest.sh\nvar assert = require('assert');\nvar fs = require('fs');\n\nvar flatbuffers = require('../../js/flatbuffers');\nvar MyGame = require(process.argv[2]).MyGame;\n\nfunction main() {\n\n  // First, let's test reading a FlatBuffer generated by C++ code:\n  // This file was generated from monsterdata_test.json\n  var data = new Uint8Array(fs.readFileSync('../monsterdata_test.mon'));\n\n  // Now test it:\n\n  var bb = new flatbuffers.ByteBuffer(data);\n  testBuffer(bb);\n\n  // Second, let's create a FlatBuffer from scratch in JavaScript, and test it also.\n  // We use an initial size of 1 to exercise the reallocation algorithm,\n  // normally a size larger than the typical FlatBuffer you generate would be\n  // better for performance.\n  var fbb = new flatbuffers.Builder(1);\n  createMonster(fbb);\n  serializeAndTest(fbb);\n\n  // clear the builder, repeat tests\n  var clearIterations = 100;\n  var startingCapacity = fbb.bb.capacity();\n  for (var i = 0; i < clearIterations; i++) {\n    fbb.clear();\n    createMonster(fbb);\n    serializeAndTest(fbb);\n  }\n  // the capacity of our buffer shouldn't increase with the same size payload\n  assert.strictEqual(fbb.bb.capacity(), startingCapacity);\n\n  test64bit();\n  testUnicode();\n  fuzzTest1();\n\n  console.log('FlatBuffers test: completed successfully');\n}\n\nfunction createMonster(fbb) {\n  // We set up the same values as monsterdata.json:\n\n  var str = fbb.createString('MyMonster');\n\n  var inv = MyGame.Example.Monster.createInventoryVector(fbb, [0, 1, 2, 3, 4]);\n\n  var fred = fbb.createString('Fred');\n  MyGame.Example.Monster.startMonster(fbb);\n  MyGame.Example.Monster.addName(fbb, fred);\n  var mon2 = MyGame.Example.Monster.endMonster(fbb);\n\n  MyGame.Example.Monster.startTest4Vector(fbb, 2);\n  MyGame.Example.Test.createTest(fbb, 10, 20);\n  MyGame.Example.Test.createTest(fbb, 30, 40);\n  var test4 = fbb.endVector();\n\n  var testArrayOfString = MyGame.Example.Monster.createTestarrayofstringVector(fbb, [\n    fbb.createString('test1'),\n    fbb.createString('test2')\n  ]);\n\n  MyGame.Example.Monster.startMonster(fbb);\n  MyGame.Example.Monster.addPos(fbb, MyGame.Example.Vec3.createVec3(fbb, 1, 2, 3, 3, MyGame.Example.Color.Green, 5, 6));\n  MyGame.Example.Monster.addHp(fbb, 80);\n  MyGame.Example.Monster.addName(fbb, str);\n  MyGame.Example.Monster.addInventory(fbb, inv);\n  MyGame.Example.Monster.addTestType(fbb, MyGame.Example.Any.Monster);\n  MyGame.Example.Monster.addTest(fbb, mon2);\n  MyGame.Example.Monster.addTest4(fbb, test4);\n  MyGame.Example.Monster.addTestarrayofstring(fbb, testArrayOfString);\n  MyGame.Example.Monster.addTestbool(fbb, true);\n  var mon = MyGame.Example.Monster.endMonster(fbb);\n\n  MyGame.Example.Monster.finishMonsterBuffer(fbb, mon);\n}\n\nfunction serializeAndTest(fbb) {\n  // Write the result to a file for debugging purposes:\n  // Note that the binaries are not necessarily identical, since the JSON\n  // parser may serialize in a slightly different order than the above\n  // JavaScript code. They are functionally equivalent though.\n\n  fs.writeFileSync('monsterdata_javascript_wire.mon', new Buffer(fbb.asUint8Array()));\n\n  // Tests mutation first.  This will verify that we did not trample any other\n  // part of the byte buffer.\n  testMutation(fbb.dataBuffer());\n\n  testBuffer(fbb.dataBuffer());\n}\n\nfunction testMutation(bb) {\n  var monster = MyGame.Example.Monster.getRootAsMonster(bb);\n\n  monster.mutate_hp(120);\n  assert.strictEqual(monster.hp(), 120);\n\n  monster.mutate_hp(80);\n  assert.strictEqual(monster.hp(), 80);\n\n  var manaRes = monster.mutate_mana(10);\n  assert.strictEqual(manaRes, false);  // Field was NOT present, because default value.\n\n  // TODO: There is not the availability to mutate structs or vectors.\n}\n\nfunction testBuffer(bb) {\n  assert.ok(MyGame.Example.Monster.bufferHasIdentifier(bb));\n\n  var monster = MyGame.Example.Monster.getRootAsMonster(bb);\n\n  assert.strictEqual(monster.hp(), 80);\n  assert.strictEqual(monster.mana(), 150); // default\n\n  assert.strictEqual(monster.name(), 'MyMonster');\n\n  var pos = monster.pos();\n  assert.strictEqual(pos.x(), 1);\n  assert.strictEqual(pos.y(), 2);\n  assert.strictEqual(pos.z(), 3);\n  assert.strictEqual(pos.test1(), 3);\n  assert.strictEqual(pos.test2(), MyGame.Example.Color.Green);\n  var t = pos.test3();\n  assert.strictEqual(t.a(), 5);\n  assert.strictEqual(t.b(), 6);\n\n  assert.strictEqual(monster.testType(), MyGame.Example.Any.Monster);\n  var monster2 = new MyGame.Example.Monster();\n  assert.strictEqual(monster.test(monster2) != null, true);\n  assert.strictEqual(monster2.name(), 'Fred');\n\n  assert.strictEqual(monster.inventoryLength(), 5);\n  var invsum = 0;\n  for (var i = 0; i < monster.inventoryLength(); i++) {\n    invsum += monster.inventory(i);\n  }\n  assert.strictEqual(invsum, 10);\n\n  var invsum2 = 0;\n  var invArr = monster.inventoryArray();\n  for (var i = 0; i < invArr.length; i++) {\n    invsum2 += invArr[i];\n  }\n  assert.strictEqual(invsum2, 10);\n\n  var test_0 = monster.test4(0);\n  var test_1 = monster.test4(1);\n  assert.strictEqual(monster.test4Length(), 2);\n  assert.strictEqual(test_0.a() + test_0.b() + test_1.a() + test_1.b(), 100);\n\n  assert.strictEqual(monster.testarrayofstringLength(), 2);\n  assert.strictEqual(monster.testarrayofstring(0), 'test1');\n  assert.strictEqual(monster.testarrayofstring(1), 'test2');\n\n  assert.strictEqual(monster.testbool(), true);\n}\n\nfunction test64bit() {\n  var fbb = new flatbuffers.Builder();\n  var required = fbb.createString('required');\n\n  MyGame.Example.Stat.startStat(fbb);\n  var stat2 = MyGame.Example.Stat.endStat(fbb);\n\n  MyGame.Example.Monster.startMonster(fbb);\n  MyGame.Example.Monster.addName(fbb, required);\n  MyGame.Example.Monster.addTestempty(fbb, stat2);\n  var mon2 = MyGame.Example.Monster.endMonster(fbb);\n\n  MyGame.Example.Stat.startStat(fbb);\n  MyGame.Example.Stat.addVal(fbb, 0x2345678987654321n);\n  var stat = MyGame.Example.Stat.endStat(fbb);\n\n  MyGame.Example.Monster.startMonster(fbb);\n  MyGame.Example.Monster.addName(fbb, required);\n  MyGame.Example.Monster.addEnemy(fbb, mon2);\n  MyGame.Example.Monster.addTestempty(fbb, stat);\n  var mon = MyGame.Example.Monster.endMonster(fbb);\n\n  MyGame.Example.Monster.finishMonsterBuffer(fbb, mon);\n  var bytes = fbb.asUint8Array();\n\n  ////////////////////////////////////////////////////////////////\n\n  var bb = new flatbuffers.ByteBuffer(bytes);\n  assert.ok(MyGame.Example.Monster.bufferHasIdentifier(bb));\n  var mon = MyGame.Example.Monster.getRootAsMonster(bb);\n\n  var stat = mon.testempty();\n  assert.strictEqual(stat != null, true);\n  assert.strictEqual(stat.val() != null, true);\n  assert.strictEqual(stat.val(), 2541551405100253985n);\n\n  var mon2 = mon.enemy();\n  assert.strictEqual(mon2 != null, true);\n  stat = mon2.testempty();\n  assert.strictEqual(stat != null, true);\n  assert.strictEqual(stat.val() != null, true);\n  assert.strictEqual(stat.val(), 0n); // default value\n}\n\nfunction testUnicode() {\n  var correct = fs.readFileSync('unicode_test.mon');\n  var json = JSON.parse(fs.readFileSync('../unicode_test.json', 'utf8'));\n\n  // Test reading\n  function testReadingUnicode(bb) {\n    var monster = MyGame.Example.Monster.getRootAsMonster(bb);\n    assert.strictEqual(monster.name(), json.name);\n    assert.deepEqual(new Buffer(monster.name(flatbuffers.Encoding.UTF8_BYTES)), new Buffer(json.name));\n    assert.strictEqual(monster.testarrayoftablesLength(), json.testarrayoftables.length);\n    json.testarrayoftables.forEach(function(table, i) {\n      var value = monster.testarrayoftables(i);\n      assert.strictEqual(value.name(), table.name);\n      assert.deepEqual(new Buffer(value.name(flatbuffers.Encoding.UTF8_BYTES)), new Buffer(table.name));\n    });\n    assert.strictEqual(monster.testarrayofstringLength(), json.testarrayofstring.length);\n    json.testarrayofstring.forEach(function(string, i) {\n      assert.strictEqual(monster.testarrayofstring(i), string);\n      assert.deepEqual(new Buffer(monster.testarrayofstring(i, flatbuffers.Encoding.UTF8_BYTES)), new Buffer(string));\n    });\n  }\n  testReadingUnicode(new flatbuffers.ByteBuffer(new Uint8Array(correct)));\n\n  // Test writing\n  var fbb = new flatbuffers.Builder();\n  var name = fbb.createString(json.name);\n  var testarrayoftablesOffsets = json.testarrayoftables.map(function(table) {\n    var name = fbb.createString(new Uint8Array(new Buffer(table.name)));\n    MyGame.Example.Monster.startMonster(fbb);\n    MyGame.Example.Monster.addName(fbb, name);\n    return MyGame.Example.Monster.endMonster(fbb);\n  });\n  var testarrayoftablesOffset = MyGame.Example.Monster.createTestarrayoftablesVector(fbb,\n    testarrayoftablesOffsets);\n  var testarrayofstringOffset = MyGame.Example.Monster.createTestarrayofstringVector(fbb,\n    json.testarrayofstring.map(function(string) { return fbb.createString(string); }));\n  MyGame.Example.Monster.startMonster(fbb);\n  MyGame.Example.Monster.addTestarrayofstring(fbb, testarrayofstringOffset);\n  MyGame.Example.Monster.addTestarrayoftables(fbb, testarrayoftablesOffset);\n  MyGame.Example.Monster.addName(fbb, name);\n  MyGame.Example.Monster.finishSizePrefixedMonsterBuffer(fbb, MyGame.Example.Monster.endMonster(fbb));\n  var bb = new flatbuffers.ByteBuffer(fbb.asUint8Array())\n  bb.setPosition(4);\n  testReadingUnicode(bb);\n}\n\nvar __imul = Math.imul ? Math.imul : function(a, b) {\n  var ah = a >> 16 & 65535;\n  var bh = b >> 16 & 65535;\n  var al = a & 65535;\n  var bl = b & 65535;\n  return al * bl + (ah * bl + al * bh << 16) | 0;\n};\n\n// Include simple random number generator to ensure results will be the\n// same cross platform.\n// http://en.wikipedia.org/wiki/Park%E2%80%93Miller_random_number_generator\nvar lcg_seed = 48271;\n\nfunction lcg_rand() {\n  return lcg_seed = (__imul(lcg_seed, 279470273) >>> 0) % 4294967291;\n}\n\nfunction lcg_reset() {\n  lcg_seed = 48271;\n}\n\n// Converts a Field ID to a virtual table offset.\nfunction fieldIndexToOffset(field_id) {\n  // Should correspond to what EndTable() below builds up.\n  var fixed_fields = 2;  // Vtable size and Object Size.\n  return (field_id + fixed_fields) * 2;\n}\n\n// Low level stress/fuzz test: serialize/deserialize a variety of\n// different kinds of data in different combinations\nfunction fuzzTest1() {\n\n  // Values we're testing against: chosen to ensure no bits get chopped\n  // off anywhere, and also be different from eachother.\n  var bool_val   = true;\n  var char_val   = -127;  // 0x81\n  var uchar_val  = 0xFF;\n  var short_val  = -32222; // 0x8222;\n  var ushort_val = 0xFEEE;\n  var int_val    = 0x83333333 | 0;\n  var uint_val   = 0xFDDDDDDD;\n  var long_val   = BigInt.asIntN(64, 0x8444444444444444n);\n  var ulong_val  = BigInt.asUintN(64, 0xFCCCCCCCCCCCCCCCn);\n  var float_val  = new Float32Array([3.14159])[0];\n  var double_val = 3.14159265359;\n\n  var test_values_max = 11;\n  var fields_per_object = 4;\n  var num_fuzz_objects = 10000;  // The higher, the more thorough :)\n\n  var builder = new flatbuffers.Builder();\n\n  lcg_reset();  // Keep it deterministic.\n\n  var objects = [];\n\n  // Generate num_fuzz_objects random objects each consisting of\n  // fields_per_object fields, each of a random type.\n  for (var i = 0; i < num_fuzz_objects; i++) {\n    builder.startObject(fields_per_object);\n    for (var f = 0; f < fields_per_object; f++) {\n      var choice = lcg_rand() % test_values_max;\n      switch (choice) {\n        case 0:  builder.addFieldInt8(f, bool_val,   0); break;\n        case 1:  builder.addFieldInt8(f, char_val,   0); break;\n        case 2:  builder.addFieldInt8(f, uchar_val,  0); break;\n        case 3:  builder.addFieldInt16(f, short_val,  0); break;\n        case 4:  builder.addFieldInt16(f, ushort_val, 0); break;\n        case 5:  builder.addFieldInt32(f, int_val,    0); break;\n        case 6:  builder.addFieldInt32(f, uint_val,   0); break;\n        case 7:  builder.addFieldInt64(f, long_val, 0n); break;\n        case 8:  builder.addFieldInt64(f, ulong_val, 0n); break;\n        case 9:  builder.addFieldFloat32(f, float_val,  0); break;\n        case 10: builder.addFieldFloat64(f, double_val, 0); break;\n      }\n    }\n    objects.push(builder.endObject());\n  }\n  builder.prep(8, 0);  // Align whole buffer.\n\n  lcg_reset();  // Reset.\n\n  builder.finish(objects[objects.length - 1]);\n  var bytes = new Uint8Array(builder.asUint8Array());\n  var view = new DataView(bytes.buffer);\n\n  // Test that all objects we generated are readable and return the\n  // expected values. We generate random objects in the same order\n  // so this is deterministic.\n  for (var i = 0; i < num_fuzz_objects; i++) {\n    var offset = bytes.length - objects[i];\n    for (var f = 0; f < fields_per_object; f++) {\n      var choice = lcg_rand() % test_values_max;\n      var vtable_offset = fieldIndexToOffset(f);\n      var vtable = offset - view.getInt32(offset, true);\n      assert.ok(vtable_offset < view.getInt16(vtable, true));\n      var field_offset = offset + view.getInt16(vtable + vtable_offset, true);\n      switch (choice) {\n        case 0:  assert.strictEqual(!!view.getInt8(field_offset), bool_val); break;\n        case 1:  assert.strictEqual(view.getInt8(field_offset), char_val); break;\n        case 2:  assert.strictEqual(view.getUint8(field_offset), uchar_val); break;\n        case 3:  assert.strictEqual(view.getInt16(field_offset, true), short_val); break;\n        case 4:  assert.strictEqual(view.getUint16(field_offset, true), ushort_val); break;\n        case 5:  assert.strictEqual(view.getInt32(field_offset, true), int_val); break;\n        case 6:  assert.strictEqual(view.getUint32(field_offset, true), uint_val); break;\n        case 7:  assert.strictEqual(view.getBigInt64(field_offset, true), long_val); break;\n        case 8:  assert.strictEqual(view.getBigUint64(field_offset, true), ulong_val); break;\n        case 9:  assert.strictEqual(view.getFloat32(field_offset, true), float_val); break;\n        case 10: assert.strictEqual(view.getFloat64(field_offset, true), double_val); break;\n      }\n    }\n  }\n}\n\nmain();"
  },
  {
    "path": "tests/ts/JavaScriptUndefinedForOptionals.js",
    "content": "import assert from 'assert'\nimport * as flatbuffers from 'flatbuffers'\n\nimport optional_scalars from './ts-undefined-for-optionals/optional_scalars_generated.cjs'\n\nconst { ScalarStuff, ScalarStuffT } = optional_scalars.optional_scalars;\n\nfunction testScalarStuffBuf(scalarStuff) {\n  assert.strictEqual(scalarStuff.justI8(), -1);\n  assert.strictEqual(scalarStuff.maybeI8(), undefined);\n  assert.strictEqual(scalarStuff.defaultI8(), 42);\n  assert.strictEqual(scalarStuff.justU8(), 1);\n  assert.strictEqual(scalarStuff.maybeU8(), undefined);\n  assert.strictEqual(scalarStuff.defaultU8(), 42);\n}\n\nfunction testScalarStuffUnpack(scalarStuff) {\n  assert.strictEqual(scalarStuff.justI8, -1);\n  assert.strictEqual(scalarStuff.maybeI8, undefined);\n  assert.strictEqual(scalarStuff.defaultI8, 42);\n  assert.strictEqual(scalarStuff.justU8, 1);\n  assert.strictEqual(scalarStuff.maybeU8, undefined);\n  assert.strictEqual(scalarStuff.defaultU8, 42);\n}\n\nfunction createScalarStuff(fbb) {\n  ScalarStuff.startScalarStuff(fbb);\n  ScalarStuff.addJustI8(fbb, -1);\n  ScalarStuff.addJustU8(fbb, 1);\n  var offset = ScalarStuff.endScalarStuff(fbb);\n  ScalarStuff.finishScalarStuffBuffer(fbb, offset);\n}\n\nfunction main() {\n  var fbb = new flatbuffers.Builder();\n\n  createScalarStuff(fbb);\n\n  var buf = new flatbuffers.ByteBuffer(fbb.asUint8Array());\n  var scalarStuff = ScalarStuff.getRootAsScalarStuff(buf);\n\n  testScalarStuffBuf(scalarStuff);\n\n  testScalarStuffUnpack(scalarStuff.unpack());\n\n  var scalarStuff_to = new ScalarStuffT();\n  scalarStuff.unpackTo(scalarStuff_to);\n\n  testScalarStuffUnpack(scalarStuff_to);\n\n  fbb.clear();\n  ScalarStuff.finishScalarStuffBuffer(fbb, scalarStuff_to.pack(fbb));\n  var unpackBuf = new flatbuffers.ByteBuffer(fbb.asUint8Array());\n\n  testScalarStuffBuf(ScalarStuff.getRootAsScalarStuff(unpackBuf));\n\n  console.log('FlatBuffers --ts-undefined-for-optionals test: completed successfully');\n}\n\nmain();\n"
  },
  {
    "path": "tests/ts/JavaScriptUnionUnderlyingTypeTest.js",
    "content": "import assert from 'assert'\nimport * as flatbuffers from 'flatbuffers'\n\nimport {UnionUnderlyingType as Test} from './union_underlying_type_test.js'\n\nfunction main() {\n  let a = new Test.AT();\n  a.a = 1;\n  let b = new Test.BT();\n  b.b = 'foo';\n  let c = new Test.CT();\n  c.c = true;\n  let d = new Test.DT();\n  d.testUnionType = Test.ABC.A;\n  d.testUnion = a;\n  d.testVectorOfUnionType = [Test.ABC.A, Test.ABC.B, Test.ABC.C];\n  d.testVectorOfUnion = [a, b, c];\n\n  let fbb = new flatbuffers.Builder();\n  let offset = d.pack(fbb);\n  fbb.finish(offset);\n\n  let unpacked = Test.D.getRootAsD(fbb.dataBuffer()).unpack();\n  assert.equal(JSON.stringify(unpacked), JSON.stringify(d));\n}\n\nmain()"
  },
  {
    "path": "tests/ts/JavaScriptUnionVectorTest.js",
    "content": "import assert from 'assert'\nimport * as flatbuffers from 'flatbuffers'\n\nimport {Attacker, AttackerT} from './union_vector/attacker.js'\nimport {BookReader, BookReaderT} from './union_vector/book-reader.js'\nimport {Character} from './union_vector/character.js'\nimport {Movie, MovieT} from './union_vector/movie.js'\n\nvar charTypes =\n    [Character.Belle, Character.MuLan, Character.BookFan, Character.Other];\n\nfunction testMovieBuf(movie) {\n  assert.strictEqual(movie.charactersTypeLength(), charTypes.length);\n  assert.strictEqual(movie.charactersLength(), movie.charactersTypeLength());\n\n  for (var i = 0; i < charTypes.length; ++i) {\n    assert.strictEqual(movie.charactersType(i), charTypes[i]);\n  }\n\n  var bookReader7 = movie.characters(0, new BookReader());\n  assert.strictEqual(bookReader7.booksRead(), 7);\n\n  var attacker = movie.characters(1, new Attacker());\n  assert.strictEqual(attacker.swordAttackDamage(), 5);\n\n  var bookReader2 = movie.characters(2, new BookReader());\n  assert.strictEqual(bookReader2.booksRead(), 2);\n\n  var other = movie.characters(3, '');\n  assert.strictEqual(other, 'I am other');\n}\n\nfunction testMovieUnpack(movie) {\n  assert.strictEqual(movie.charactersType.length, charTypes.length);\n  assert.strictEqual(movie.characters.length, movie.charactersType.length);\n\n  for (var i = 0; i < charTypes.length; ++i) {\n    assert.strictEqual(movie.charactersType[i], charTypes[i]);\n  }\n\n  var bookReader7 = movie.characters[0];\n  assert.strictEqual(bookReader7 instanceof BookReaderT, true);\n  assert.strictEqual(bookReader7.booksRead, 7);\n\n  var attacker = movie.characters[1];\n  assert.strictEqual(attacker instanceof AttackerT, true);\n  assert.strictEqual(attacker.swordAttackDamage, 5);\n\n  var bookReader2 = movie.characters[2];\n  assert.strictEqual(bookReader2 instanceof BookReaderT, true);\n  assert.strictEqual(bookReader2.booksRead, 2);\n\n  var other = movie.characters[3];\n  assert.strictEqual(other, 'I am other');\n}\n\nfunction createMovie(fbb) {\n  Attacker.startAttacker(fbb);\n  Attacker.addSwordAttackDamage(fbb, 5);\n  var attackerOffset = Attacker.endAttacker(fbb);\n\n  var charTypesOffset = Movie.createCharactersTypeVector(fbb, charTypes);\n  var charsOffset = 0;\n\n  let otherOffset = fbb.createString('I am other');\n\n  charsOffset = Movie.createCharactersVector(fbb, [\n    BookReader.createBookReader(fbb, 7), attackerOffset,\n    BookReader.createBookReader(fbb, 2), otherOffset\n  ]);\n\n  Movie.startMovie(fbb);\n  Movie.addCharactersType(fbb, charTypesOffset);\n  Movie.addCharacters(fbb, charsOffset);\n  Movie.finishMovieBuffer(fbb, Movie.endMovie(fbb))\n}\n\nfunction main() {\n  var fbb = new flatbuffers.Builder();\n\n  createMovie(fbb);\n\n  var buf = new flatbuffers.ByteBuffer(fbb.asUint8Array());\n\n  var movie = Movie.getRootAsMovie(buf);\n  testMovieBuf(movie);\n\n  testMovieUnpack(movie.unpack());\n\n  var movie_to = new MovieT();\n  movie.unpackTo(movie_to);\n  testMovieUnpack(movie_to);\n\n  fbb.clear();\n  Movie.finishMovieBuffer(fbb, movie_to.pack(fbb));\n  var unpackBuf = new flatbuffers.ByteBuffer(fbb.asUint8Array());\n  testMovieBuf(Movie.getRootAsMovie(unpackBuf));\n\n  console.log('FlatBuffers union vector test: completed successfully');\n}\n\nmain();\n"
  },
  {
    "path": "tests/ts/TypeScriptTest.py",
    "content": "#!/usr/bin/env python3\n#\n# Copyright 2022 Google Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nfrom pathlib import Path\nimport platform\nimport shutil\nimport subprocess\nimport sys\n\n# Get the path where this script is located so we can invoke the script from\n# any directory and have the paths work correctly.\ntests_path = Path(__file__).parent.resolve()\n\n# Get the root path as an absolute path, so all derived paths are absolute.\nroot_path = tests_path.parent.parent.absolute()\n\n# Windows works with subprocess.run a bit differently.\nis_windows = platform.system() == \"Windows\"\n\n# Get the location of the flatc executable\nflatc_exe = Path(\"flatc.exe\" if is_windows else \"flatc\")\n\n# Find and assert flatc compiler is present.\nif root_path in flatc_exe.parents:\n  flatc_exe = flatc_exe.relative_to(root_path)\nflatc_path = Path(root_path, flatc_exe)\nassert flatc_path.exists(), \"Cannot find the flatc compiler \" + str(flatc_path)\n\n\ndef check_call(args, cwd=tests_path):\n  subprocess.check_call(args, cwd=str(cwd), shell=is_windows)\n\n\n# Execute the flatc compiler with the specified parameters\ndef flatc(\n    options, schema, prefix=None, include=None, data=None, cwd=tests_path\n):\n  print(\"Invoking flatc on schema \" + str(schema))\n  cmd = [str(flatc_path)] + options\n  if prefix:\n    cmd += [\"-o\"] + [prefix]\n  if include:\n    cmd += [\"-I\"] + [include]\n  cmd += [schema] if isinstance(schema, str) else schema\n  if data:\n    cmd += [data] if isinstance(data, str) else data\n  check_call(cmd)\n\n\n# Execute esbuild with the specified parameters\ndef esbuild(input, output):\n  cmd = [\"esbuild\", input, \"--outfile=\" + output]\n  cmd += [\"--format=cjs\", \"--bundle\", \"--external:flatbuffers\"]\n  check_call(cmd)\n\n\nprint(\"Removing node_modules/ directory...\")\nshutil.rmtree(Path(tests_path, \"node_modules\"), ignore_errors=True)\n\ncheck_call([\"npm\", \"install\", \"--silent\"])\n\nflatc(\n    options=[\n        \"--ts\",\n        \"--reflect-names\",\n        \"--gen-name-strings\",\n        \"--gen-mutable\",\n        \"--gen-object-api\",\n        \"--ts-entry-points\",\n        \"--ts-flat-files\",\n    ],\n    schema=\"../monster_test.fbs\",\n    include=\"../include_test\",\n)\nesbuild(\"monster_test.ts\", \"monster_test_generated.cjs\")\n\nflatc(\n    options=[\n        \"--ts\",\n        \"--reflect-names\",\n        \"--gen-name-strings\",\n        \"--gen-mutable\",\n        \"--gen-object-api\",\n        \"--ts-entry-points\",\n        \"--ts-flat-files\",\n    ],\n    schema=\"../even_more_defaults.fbs\",\n    include=\"../include_test\",\n)\n\nflatc(\n    options=[\"--gen-object-api\", \"-b\"],\n    schema=\"../monster_test.fbs\",\n    include=\"../include_test\",\n    data=\"../unicode_test.json\",\n)\n\nflatc(\n    options=[\"--ts\", \"--gen-object-api\"],\n    schema=\"../non_zero_enum.fbs\",\n)\n\nflatc(\n    options=[\n        \"--ts\",\n        \"--gen-object-api\",\n        \"--ts-undefined-for-optionals\",\n    ],\n    schema=\"../optional_scalars.fbs\",\n    prefix=\"ts-undefined-for-optionals\",\n)\nesbuild(\n    \"ts-undefined-for-optionals/optional_scalars.ts\",\n    \"ts-undefined-for-optionals/optional_scalars_generated.cjs\",\n)\n\nflatc(\n    options=[\n        \"--ts\",\n        \"--reflect-names\",\n        \"--gen-name-strings\",\n        \"--gen-mutable\",\n        \"--gen-object-api\",\n        \"--ts-entry-points\",\n        \"--ts-flat-files\",\n    ],\n    schema=\"../union_vector/union_vector.fbs\",\n    prefix=\"union_vector\",\n)\nesbuild(\n    \"union_vector/union_vector.ts\", \"union_vector/union_vector_generated.cjs\"\n)\n\nflatc(\n    options=[\"--ts\", \"--reflect-names\", \"--gen-name-strings\"],\n    schema=\"../optional_scalars.fbs\",\n)\n\nflatc(\n    options=[\n        \"--ts\",\n        \"--reflect-names\",\n        \"--gen-name-strings\",\n        \"--ts-no-import-ext\",\n    ],\n    schema=\"../optional_scalars.fbs\",\n    prefix=\"no_import_ext\",\n)\n\nflatc(\n    options=[\n        \"--ts\",\n        \"--reflect-names\",\n        \"--gen-name-strings\",\n        \"--gen-object-api\",\n        \"--ts-entry-points\",\n        \"--ts-flat-files\",\n    ],\n    schema=\"arrays_test_complex/arrays_test_complex.fbs\",\n    prefix=\"arrays_test_complex\",\n)\nesbuild(\n    \"arrays_test_complex/my-game/example.ts\",\n    \"arrays_test_complex/arrays_test_complex_generated.cjs\",\n)\n\nflatc(\n    options=[\n        \"--ts\",\n        \"--reflect-names\",\n        \"--gen-name-strings\",\n        \"--gen-mutable\",\n        \"--gen-object-api\",\n        \"--ts-entry-points\",\n        \"--ts-flat-files\",\n    ],\n    schema=[\n        \"typescript_keywords.fbs\",\n        \"test_dir/typescript_include.fbs\",\n        \"test_dir/typescript_transitive_include.fbs\",\n        \"../../reflection/reflection.fbs\",\n    ],\n    include=\"../../\",\n)\nesbuild(\"typescript_keywords.ts\", \"typescript_keywords_generated.cjs\")\n\nflatc(\n    options=[\n        \"--ts\",\n        \"--reflect-names\",\n        \"--gen-name-strings\",\n        \"--gen-mutable\",\n        \"--gen-object-api\",\n        \"--ts-entry-points\",\n        \"--ts-flat-files\",\n    ],\n    schema=\"../union_underlying_type_test.fbs\",\n)\n\nflatc(options=[\"--ts\"], schema=\"../long_namespace.fbs\")\nflatc(options=[\"--ts\"], schema=\"../longer_namespace.fbs\")\n\n\nflatc(\n    options=[\n        \"--ts\",\n        \"--reflect-names\",\n        \"--gen-name-strings\",\n        \"--gen-object-api\",\n        \"--ts-entry-points\",\n        \"--ts-flat-files\",\n    ],\n    schema=\"relative_imports/relative_imports.fbs\",\n    prefix=\"relative_imports\",\n)\n\nprint(\"Running TypeScript Compiler...\")\ncheck_call([\"tsc\"])\nprint(\n    \"Running TypeScript Compiler in old node resolution mode for\"\n    \" no_import_ext...\"\n)\ncheck_call([\"tsc\", \"-p\", \"./tsconfig.node.json\"])\n\nNODE_CMD = [\"node\"]\n\nprint(\"Running TypeScript Tests...\")\ncheck_call(NODE_CMD + [\"JavaScriptTest\"])\ncheck_call(NODE_CMD + [\"JavaScriptUnionVectorTest\"])\ncheck_call(NODE_CMD + [\"JavaScriptFlexBuffersTest\"])\ncheck_call(NODE_CMD + [\"JavaScriptComplexArraysTest\"])\ncheck_call(NODE_CMD + [\"JavaScriptUnionUnderlyingTypeTest\"])\ncheck_call(NODE_CMD + [\"JavaScriptRelativeImportPathTest\"])\ncheck_call(NODE_CMD + [\"JavaScriptUndefinedForOptionals\"])\n\nprint(\"Running old v1 TypeScript Tests...\")\ncheck_call(NODE_CMD + [\"JavaScriptTestv1.cjs\", \"./monster_test_generated.cjs\"])\n"
  },
  {
    "path": "tests/ts/arrays_test_complex/arrays_test_complex.fbs",
    "content": "namespace MyGame.Example;\n\nenum TestEnum : byte { A, B, C }\n\nstruct InnerStruct {\n  a:float64;\n  b:[ubyte:13];\n  c:int8;\n  d_underscore:int64;\n}\n\nstruct OuterStruct {\n  a:bool;\n  b:double;\n  c_underscore:InnerStruct;\n  d:[InnerStruct:3];\n  e:InnerStruct;\n  f:[float64:4];\n}\n\nstruct NestedStruct{\n  a:[int:2];\n  b:TestEnum;\n  c_underscore:[TestEnum:2];\n  d_outer:[OuterStruct:5];\n  e:[int64:2];\n}\n\nstruct ArrayStruct{\n  a_underscore:float;\n  b_underscore:[int:0xF];\n  c:byte;\n  d:[NestedStruct:2];\n  e:int32;\n  f:[OuterStruct:2];\n  g:[int64:2];\n}\n\ntable ArrayTable{\n  a:string;\n  c_underscore:ArrayStruct;\n}\n\nroot_type ArrayTable;\nfile_identifier \"RHUB\";\nfile_extension \"mon\";"
  },
  {
    "path": "tests/ts/arrays_test_complex/arrays_test_complex_generated.cjs",
    "content": "\"use strict\";\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n  for (var name in all)\n    __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n  if (from && typeof from === \"object\" || typeof from === \"function\") {\n    for (let key of __getOwnPropNames(from))\n      if (!__hasOwnProp.call(to, key) && key !== except)\n        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n  }\n  return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n  // If the importer is in node compatibility mode or this is not an ESM\n  // file that has been converted to a CommonJS file using a Babel-\n  // compatible transform (i.e. \"__esModule\" has not been set), then set\n  // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n  isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n  mod\n));\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// arrays_test_complex/my-game/example.ts\nvar example_exports = {};\n__export(example_exports, {\n  ArrayStruct: () => ArrayStruct,\n  ArrayStructT: () => ArrayStructT,\n  ArrayTable: () => ArrayTable,\n  ArrayTableT: () => ArrayTableT,\n  InnerStruct: () => InnerStruct,\n  InnerStructT: () => InnerStructT,\n  NestedStruct: () => NestedStruct,\n  NestedStructT: () => NestedStructT,\n  OuterStruct: () => OuterStruct,\n  OuterStructT: () => OuterStructT,\n  TestEnum: () => TestEnum\n});\nmodule.exports = __toCommonJS(example_exports);\n\n// arrays_test_complex/my-game/example/inner-struct.js\nvar InnerStruct = class {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  a() {\n    return this.bb.readFloat64(this.bb_pos);\n  }\n  b(index) {\n    return this.bb.readUint8(this.bb_pos + 8 + index);\n  }\n  c() {\n    return this.bb.readInt8(this.bb_pos + 21);\n  }\n  dUnderscore() {\n    return this.bb.readInt64(this.bb_pos + 24);\n  }\n  static getFullyQualifiedName() {\n    return \"MyGame.Example.InnerStruct\";\n  }\n  static sizeOf() {\n    return 32;\n  }\n  static createInnerStruct(builder, a, b, c, d_underscore) {\n    builder.prep(8, 32);\n    builder.writeInt64(BigInt(d_underscore ?? 0));\n    builder.pad(2);\n    builder.writeInt8(c);\n    for (let i = 12; i >= 0; --i) {\n      builder.writeInt8(b?.[i] ?? 0);\n    }\n    builder.writeFloat64(a);\n    return builder.offset();\n  }\n  unpack() {\n    return new InnerStructT(this.a(), this.bb.createScalarList(this.b.bind(this), 13), this.c(), this.dUnderscore());\n  }\n  unpackTo(_o) {\n    _o.a = this.a();\n    _o.b = this.bb.createScalarList(this.b.bind(this), 13);\n    _o.c = this.c();\n    _o.dUnderscore = this.dUnderscore();\n  }\n};\nvar InnerStructT = class {\n  constructor(a = 0, b = [], c = 0, dUnderscore = BigInt(\"0\")) {\n    this.a = a;\n    this.b = b;\n    this.c = c;\n    this.dUnderscore = dUnderscore;\n  }\n  pack(builder) {\n    return InnerStruct.createInnerStruct(builder, this.a, this.b, this.c, this.dUnderscore);\n  }\n};\n\n// arrays_test_complex/my-game/example/outer-struct.js\nvar OuterStruct = class {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  a() {\n    return !!this.bb.readInt8(this.bb_pos);\n  }\n  b() {\n    return this.bb.readFloat64(this.bb_pos + 8);\n  }\n  cUnderscore(obj) {\n    return (obj || new InnerStruct()).__init(this.bb_pos + 16, this.bb);\n  }\n  d(index, obj) {\n    return (obj || new InnerStruct()).__init(this.bb_pos + 48 + index * 32, this.bb);\n  }\n  e(obj) {\n    return (obj || new InnerStruct()).__init(this.bb_pos + 144, this.bb);\n  }\n  f(index) {\n    return this.bb.readFloat64(this.bb_pos + 176 + index * 8);\n  }\n  static getFullyQualifiedName() {\n    return \"MyGame.Example.OuterStruct\";\n  }\n  static sizeOf() {\n    return 208;\n  }\n  static createOuterStruct(builder, a, b, c_underscore_a, c_underscore_b, c_underscore_c, c_underscore_d_underscore, d, e_a, e_b, e_c, e_d_underscore, f) {\n    builder.prep(8, 208);\n    for (let i = 3; i >= 0; --i) {\n      builder.writeFloat64(f?.[i] ?? 0);\n    }\n    builder.prep(8, 32);\n    builder.writeInt64(BigInt(e_d_underscore ?? 0));\n    builder.pad(2);\n    builder.writeInt8(e_c);\n    for (let i = 12; i >= 0; --i) {\n      builder.writeInt8(e_b?.[i] ?? 0);\n    }\n    builder.writeFloat64(e_a);\n    for (let i = 2; i >= 0; --i) {\n      const item = d?.[i];\n      if (item instanceof InnerStructT) {\n        item.pack(builder);\n        continue;\n      }\n      InnerStruct.createInnerStruct(builder, item?.a, item?.b, item?.c, item?.dUnderscore);\n    }\n    builder.prep(8, 32);\n    builder.writeInt64(BigInt(c_underscore_d_underscore ?? 0));\n    builder.pad(2);\n    builder.writeInt8(c_underscore_c);\n    for (let i = 12; i >= 0; --i) {\n      builder.writeInt8(c_underscore_b?.[i] ?? 0);\n    }\n    builder.writeFloat64(c_underscore_a);\n    builder.writeFloat64(b);\n    builder.pad(7);\n    builder.writeInt8(Number(Boolean(a)));\n    return builder.offset();\n  }\n  unpack() {\n    return new OuterStructT(this.a(), this.b(), this.cUnderscore() !== null ? this.cUnderscore().unpack() : null, this.bb.createObjList(this.d.bind(this), 3), this.e() !== null ? this.e().unpack() : null, this.bb.createScalarList(this.f.bind(this), 4));\n  }\n  unpackTo(_o) {\n    _o.a = this.a();\n    _o.b = this.b();\n    _o.cUnderscore = this.cUnderscore() !== null ? this.cUnderscore().unpack() : null;\n    _o.d = this.bb.createObjList(this.d.bind(this), 3);\n    _o.e = this.e() !== null ? this.e().unpack() : null;\n    _o.f = this.bb.createScalarList(this.f.bind(this), 4);\n  }\n};\nvar OuterStructT = class {\n  constructor(a = false, b = 0, cUnderscore = null, d = [], e = null, f = []) {\n    this.a = a;\n    this.b = b;\n    this.cUnderscore = cUnderscore;\n    this.d = d;\n    this.e = e;\n    this.f = f;\n  }\n  pack(builder) {\n    return OuterStruct.createOuterStruct(builder, this.a, this.b, this.cUnderscore?.a ?? 0, this.cUnderscore?.b ?? [], this.cUnderscore?.c ?? 0, this.cUnderscore?.dUnderscore ?? BigInt(0), this.d, this.e?.a ?? 0, this.e?.b ?? [], this.e?.c ?? 0, this.e?.dUnderscore ?? BigInt(0), this.f);\n  }\n};\n\n// arrays_test_complex/my-game/example/test-enum.js\nvar TestEnum;\n(function(TestEnum2) {\n  TestEnum2[TestEnum2[\"A\"] = 0] = \"A\";\n  TestEnum2[TestEnum2[\"B\"] = 1] = \"B\";\n  TestEnum2[TestEnum2[\"C\"] = 2] = \"C\";\n})(TestEnum || (TestEnum = {}));\n\n// arrays_test_complex/my-game/example/nested-struct.js\nvar NestedStruct = class {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  a(index) {\n    return this.bb.readInt32(this.bb_pos + 0 + index * 4);\n  }\n  b() {\n    return this.bb.readInt8(this.bb_pos + 8);\n  }\n  cUnderscore(index) {\n    return this.bb.readInt8(this.bb_pos + 9 + index);\n  }\n  dOuter(index, obj) {\n    return (obj || new OuterStruct()).__init(this.bb_pos + 16 + index * 208, this.bb);\n  }\n  e(index) {\n    return this.bb.readInt64(this.bb_pos + 1056 + index * 8);\n  }\n  static getFullyQualifiedName() {\n    return \"MyGame.Example.NestedStruct\";\n  }\n  static sizeOf() {\n    return 1072;\n  }\n  static createNestedStruct(builder, a, b, c_underscore, d_outer, e) {\n    builder.prep(8, 1072);\n    for (let i = 1; i >= 0; --i) {\n      builder.writeInt64(BigInt(e?.[i] ?? 0));\n    }\n    for (let i = 4; i >= 0; --i) {\n      const item = d_outer?.[i];\n      if (item instanceof OuterStructT) {\n        item.pack(builder);\n        continue;\n      }\n      OuterStruct.createOuterStruct(builder, item?.a, item?.b, item?.cUnderscore?.a ?? 0, item?.cUnderscore?.b ?? [], item?.cUnderscore?.c ?? 0, item?.cUnderscore?.dUnderscore ?? BigInt(0), item?.d, item?.e?.a ?? 0, item?.e?.b ?? [], item?.e?.c ?? 0, item?.e?.dUnderscore ?? BigInt(0), item?.f);\n    }\n    builder.pad(5);\n    for (let i = 1; i >= 0; --i) {\n      builder.writeInt8(c_underscore?.[i] ?? 0);\n    }\n    builder.writeInt8(b);\n    for (let i = 1; i >= 0; --i) {\n      builder.writeInt32(a?.[i] ?? 0);\n    }\n    return builder.offset();\n  }\n  unpack() {\n    return new NestedStructT(this.bb.createScalarList(this.a.bind(this), 2), this.b(), this.bb.createScalarList(this.cUnderscore.bind(this), 2), this.bb.createObjList(this.dOuter.bind(this), 5), this.bb.createScalarList(this.e.bind(this), 2));\n  }\n  unpackTo(_o) {\n    _o.a = this.bb.createScalarList(this.a.bind(this), 2);\n    _o.b = this.b();\n    _o.cUnderscore = this.bb.createScalarList(this.cUnderscore.bind(this), 2);\n    _o.dOuter = this.bb.createObjList(this.dOuter.bind(this), 5);\n    _o.e = this.bb.createScalarList(this.e.bind(this), 2);\n  }\n};\nvar NestedStructT = class {\n  constructor(a = [], b = TestEnum.A, cUnderscore = [TestEnum.A, TestEnum.A], dOuter = [], e = []) {\n    this.a = a;\n    this.b = b;\n    this.cUnderscore = cUnderscore;\n    this.dOuter = dOuter;\n    this.e = e;\n  }\n  pack(builder) {\n    return NestedStruct.createNestedStruct(builder, this.a, this.b, this.cUnderscore, this.dOuter, this.e);\n  }\n};\n\n// arrays_test_complex/my-game/example/array-struct.js\nvar ArrayStruct = class {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  aUnderscore() {\n    return this.bb.readFloat32(this.bb_pos);\n  }\n  bUnderscore(index) {\n    return this.bb.readInt32(this.bb_pos + 4 + index * 4);\n  }\n  c() {\n    return this.bb.readInt8(this.bb_pos + 64);\n  }\n  d(index, obj) {\n    return (obj || new NestedStruct()).__init(this.bb_pos + 72 + index * 1072, this.bb);\n  }\n  e() {\n    return this.bb.readInt32(this.bb_pos + 2216);\n  }\n  f(index, obj) {\n    return (obj || new OuterStruct()).__init(this.bb_pos + 2224 + index * 208, this.bb);\n  }\n  g(index) {\n    return this.bb.readInt64(this.bb_pos + 2640 + index * 8);\n  }\n  static getFullyQualifiedName() {\n    return \"MyGame.Example.ArrayStruct\";\n  }\n  static sizeOf() {\n    return 2656;\n  }\n  static createArrayStruct(builder, a_underscore, b_underscore, c, d, e, f, g) {\n    builder.prep(8, 2656);\n    for (let i = 1; i >= 0; --i) {\n      builder.writeInt64(BigInt(g?.[i] ?? 0));\n    }\n    for (let i = 1; i >= 0; --i) {\n      const item = f?.[i];\n      if (item instanceof OuterStructT) {\n        item.pack(builder);\n        continue;\n      }\n      OuterStruct.createOuterStruct(builder, item?.a, item?.b, item?.cUnderscore?.a ?? 0, item?.cUnderscore?.b ?? [], item?.cUnderscore?.c ?? 0, item?.cUnderscore?.dUnderscore ?? BigInt(0), item?.d, item?.e?.a ?? 0, item?.e?.b ?? [], item?.e?.c ?? 0, item?.e?.dUnderscore ?? BigInt(0), item?.f);\n    }\n    builder.pad(4);\n    builder.writeInt32(e);\n    for (let i = 1; i >= 0; --i) {\n      const item = d?.[i];\n      if (item instanceof NestedStructT) {\n        item.pack(builder);\n        continue;\n      }\n      NestedStruct.createNestedStruct(builder, item?.a, item?.b, item?.cUnderscore, item?.dOuter, item?.e);\n    }\n    builder.pad(7);\n    builder.writeInt8(c);\n    for (let i = 14; i >= 0; --i) {\n      builder.writeInt32(b_underscore?.[i] ?? 0);\n    }\n    builder.writeFloat32(a_underscore);\n    return builder.offset();\n  }\n  unpack() {\n    return new ArrayStructT(this.aUnderscore(), this.bb.createScalarList(this.bUnderscore.bind(this), 15), this.c(), this.bb.createObjList(this.d.bind(this), 2), this.e(), this.bb.createObjList(this.f.bind(this), 2), this.bb.createScalarList(this.g.bind(this), 2));\n  }\n  unpackTo(_o) {\n    _o.aUnderscore = this.aUnderscore();\n    _o.bUnderscore = this.bb.createScalarList(this.bUnderscore.bind(this), 15);\n    _o.c = this.c();\n    _o.d = this.bb.createObjList(this.d.bind(this), 2);\n    _o.e = this.e();\n    _o.f = this.bb.createObjList(this.f.bind(this), 2);\n    _o.g = this.bb.createScalarList(this.g.bind(this), 2);\n  }\n};\nvar ArrayStructT = class {\n  constructor(aUnderscore = 0, bUnderscore = [], c = 0, d = [], e = 0, f = [], g = []) {\n    this.aUnderscore = aUnderscore;\n    this.bUnderscore = bUnderscore;\n    this.c = c;\n    this.d = d;\n    this.e = e;\n    this.f = f;\n    this.g = g;\n  }\n  pack(builder) {\n    return ArrayStruct.createArrayStruct(builder, this.aUnderscore, this.bUnderscore, this.c, this.d, this.e, this.f, this.g);\n  }\n};\n\n// arrays_test_complex/my-game/example/array-table.js\nvar flatbuffers = __toESM(require(\"flatbuffers\"), 1);\nvar ArrayTable = class _ArrayTable {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsArrayTable(bb, obj) {\n    return (obj || new _ArrayTable()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsArrayTable(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new _ArrayTable()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static bufferHasIdentifier(bb) {\n    return bb.__has_identifier(\"RHUB\");\n  }\n  a(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  cUnderscore(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? (obj || new ArrayStruct()).__init(this.bb_pos + offset, this.bb) : null;\n  }\n  static getFullyQualifiedName() {\n    return \"MyGame.Example.ArrayTable\";\n  }\n  static startArrayTable(builder) {\n    builder.startObject(2);\n  }\n  static addA(builder, aOffset) {\n    builder.addFieldOffset(0, aOffset, 0);\n  }\n  static addCUnderscore(builder, cUnderscoreOffset) {\n    builder.addFieldStruct(1, cUnderscoreOffset, 0);\n  }\n  static endArrayTable(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static finishArrayTableBuffer(builder, offset) {\n    builder.finish(offset, \"RHUB\");\n  }\n  static finishSizePrefixedArrayTableBuffer(builder, offset) {\n    builder.finish(offset, \"RHUB\", true);\n  }\n  unpack() {\n    return new ArrayTableT(this.a(), this.cUnderscore() !== null ? this.cUnderscore().unpack() : null);\n  }\n  unpackTo(_o) {\n    _o.a = this.a();\n    _o.cUnderscore = this.cUnderscore() !== null ? this.cUnderscore().unpack() : null;\n  }\n};\nvar ArrayTableT = class {\n  constructor(a = null, cUnderscore = null) {\n    this.a = a;\n    this.cUnderscore = cUnderscore;\n  }\n  pack(builder) {\n    const a = this.a !== null ? builder.createString(this.a) : 0;\n    ArrayTable.startArrayTable(builder);\n    ArrayTable.addA(builder, a);\n    ArrayTable.addCUnderscore(builder, this.cUnderscore !== null ? this.cUnderscore.pack(builder) : 0);\n    return ArrayTable.endArrayTable(builder);\n  }\n};\n"
  },
  {
    "path": "tests/ts/arrays_test_complex/my-game/example/array-struct.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nimport {\n  NestedStruct,\n  NestedStructT,\n} from '../../my-game/example/nested-struct.js';\nimport {OuterStruct, OuterStructT} from '../../my-game/example/outer-struct.js';\nexport declare class ArrayStruct\n  implements flatbuffers.IUnpackableObject<ArrayStructT>\n{\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): ArrayStruct;\n  aUnderscore(): number;\n  bUnderscore(index: number): number | null;\n  c(): number;\n  d(index: number, obj?: NestedStruct): NestedStruct | null;\n  e(): number;\n  f(index: number, obj?: OuterStruct): OuterStruct | null;\n  g(index: number): bigint | null;\n  static getFullyQualifiedName(): string;\n  static sizeOf(): number;\n  static createArrayStruct(\n    builder: flatbuffers.Builder,\n    a_underscore: number,\n    b_underscore: number[] | null,\n    c: number,\n    d: (any | NestedStructT)[] | null,\n    e: number,\n    f: (any | OuterStructT)[] | null,\n    g: bigint[] | null,\n  ): flatbuffers.Offset;\n  unpack(): ArrayStructT;\n  unpackTo(_o: ArrayStructT): void;\n}\nexport declare class ArrayStructT implements flatbuffers.IGeneratedObject {\n  aUnderscore: number;\n  bUnderscore: number[];\n  c: number;\n  d: NestedStructT[];\n  e: number;\n  f: OuterStructT[];\n  g: bigint[];\n  constructor(\n    aUnderscore?: number,\n    bUnderscore?: number[],\n    c?: number,\n    d?: NestedStructT[],\n    e?: number,\n    f?: OuterStructT[],\n    g?: bigint[],\n  );\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/arrays_test_complex/my-game/example/array-struct.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\nimport {NestedStruct, NestedStructT} from '../../my-game/example/nested-struct.js';\nimport {OuterStruct, OuterStructT} from '../../my-game/example/outer-struct.js';\nexport class ArrayStruct {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  aUnderscore() {\n    return this.bb.readFloat32(this.bb_pos);\n  }\n  bUnderscore(index) {\n    return this.bb.readInt32(this.bb_pos + 4 + index * 4);\n  }\n  c() {\n    return this.bb.readInt8(this.bb_pos + 64);\n  }\n  d(index, obj) {\n    return (obj || new NestedStruct())\n        .__init(this.bb_pos + 72 + index * 1072, this.bb);\n  }\n  e() {\n    return this.bb.readInt32(this.bb_pos + 2216);\n  }\n  f(index, obj) {\n    return (obj || new OuterStruct())\n        .__init(this.bb_pos + 2224 + index * 208, this.bb);\n  }\n  g(index) {\n    return this.bb.readInt64(this.bb_pos + 2640 + index * 8);\n  }\n  static getFullyQualifiedName() {\n    return 'MyGame.Example.ArrayStruct';\n  }\n  static sizeOf() {\n    return 2656;\n  }\n  static createArrayStruct(builder, a_underscore, b_underscore, c, d, e, f, g) {\n    builder.prep(8, 2656);\n    for (let i = 1; i >= 0; --i) {\n      builder.writeInt64(BigInt(g?.[i] ?? 0));\n    }\n    for (let i = 1; i >= 0; --i) {\n      const item = f?.[i];\n      if (item instanceof OuterStructT) {\n        item.pack(builder);\n        continue;\n      }\n      OuterStruct.createOuterStruct(\n          builder, item?.a, item?.b, (item?.cUnderscore?.a ?? 0),\n          (item?.cUnderscore?.b ?? []), (item?.cUnderscore?.c ?? 0),\n          (item?.cUnderscore?.dUnderscore ?? BigInt(0)), item?.d,\n          (item?.e?.a ?? 0), (item?.e?.b ?? []), (item?.e?.c ?? 0),\n          (item?.e?.dUnderscore ?? BigInt(0)), item?.f);\n    }\n    builder.pad(4);\n    builder.writeInt32(e);\n    for (let i = 1; i >= 0; --i) {\n      const item = d?.[i];\n      if (item instanceof NestedStructT) {\n        item.pack(builder);\n        continue;\n      }\n      NestedStruct.createNestedStruct(\n          builder, item?.a, item?.b, item?.cUnderscore, item?.dOuter, item?.e);\n    }\n    builder.pad(7);\n    builder.writeInt8(c);\n    for (let i = 14; i >= 0; --i) {\n      builder.writeInt32((b_underscore?.[i] ?? 0));\n    }\n    builder.writeFloat32(a_underscore);\n    return builder.offset();\n  }\n  unpack() {\n    return new ArrayStructT(\n        this.aUnderscore(),\n        this.bb.createScalarList(this.bUnderscore.bind(this), 15), this.c(),\n        this.bb.createObjList(this.d.bind(this), 2), this.e(),\n        this.bb.createObjList(this.f.bind(this), 2),\n        this.bb.createScalarList(this.g.bind(this), 2));\n  }\n  unpackTo(_o) {\n    _o.aUnderscore = this.aUnderscore();\n    _o.bUnderscore = this.bb.createScalarList(this.bUnderscore.bind(this), 15);\n    _o.c = this.c();\n    _o.d = this.bb.createObjList(this.d.bind(this), 2);\n    _o.e = this.e();\n    _o.f = this.bb.createObjList(this.f.bind(this), 2);\n    _o.g = this.bb.createScalarList(this.g.bind(this), 2);\n  }\n}\nexport class ArrayStructT {\n  constructor(\n      aUnderscore = 0.0, bUnderscore = [], c = 0, d = [], e = 0, f = [],\n      g = []) {\n    this.aUnderscore = aUnderscore;\n    this.bUnderscore = bUnderscore;\n    this.c = c;\n    this.d = d;\n    this.e = e;\n    this.f = f;\n    this.g = g;\n  }\n  pack(builder) {\n    return ArrayStruct.createArrayStruct(\n        builder, this.aUnderscore, this.bUnderscore, this.c, this.d, this.e,\n        this.f, this.g);\n  }\n}\n"
  },
  {
    "path": "tests/ts/arrays_test_complex/my-game/example/array-struct.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport {\n  NestedStruct,\n  NestedStructT,\n} from '../../my-game/example/nested-struct.js';\nimport {OuterStruct, OuterStructT} from '../../my-game/example/outer-struct.js';\n\nexport class ArrayStruct\n  implements flatbuffers.IUnpackableObject<ArrayStructT>\n{\n  bb: flatbuffers.ByteBuffer | null = null;\n  bb_pos = 0;\n  __init(i: number, bb: flatbuffers.ByteBuffer): ArrayStruct {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n\n  aUnderscore(): number {\n    return this.bb!.readFloat32(this.bb_pos);\n  }\n\n  bUnderscore(index: number): number | null {\n    return this.bb!.readInt32(this.bb_pos + 4 + index * 4);\n  }\n\n  c(): number {\n    return this.bb!.readInt8(this.bb_pos + 64);\n  }\n\n  d(index: number, obj?: NestedStruct): NestedStruct | null {\n    return (obj || new NestedStruct()).__init(\n      this.bb_pos + 72 + index * 1072,\n      this.bb!,\n    );\n  }\n\n  e(): number {\n    return this.bb!.readInt32(this.bb_pos + 2216);\n  }\n\n  f(index: number, obj?: OuterStruct): OuterStruct | null {\n    return (obj || new OuterStruct()).__init(\n      this.bb_pos + 2224 + index * 208,\n      this.bb!,\n    );\n  }\n\n  g(index: number): bigint | null {\n    return this.bb!.readInt64(this.bb_pos + 2640 + index * 8);\n  }\n\n  static getFullyQualifiedName(): string {\n    return 'MyGame.Example.ArrayStruct';\n  }\n\n  static sizeOf(): number {\n    return 2656;\n  }\n\n  static createArrayStruct(\n    builder: flatbuffers.Builder,\n    a_underscore: number,\n    b_underscore: number[] | null,\n    c: number,\n    d: (any | NestedStructT)[] | null,\n    e: number,\n    f: (any | OuterStructT)[] | null,\n    g: bigint[] | null,\n  ): flatbuffers.Offset {\n    builder.prep(8, 2656);\n\n    for (let i = 1; i >= 0; --i) {\n      builder.writeInt64(BigInt(g?.[i] ?? 0));\n    }\n\n    for (let i = 1; i >= 0; --i) {\n      const item = f?.[i];\n\n      if (item instanceof OuterStructT) {\n        item.pack(builder);\n        continue;\n      }\n\n      OuterStruct.createOuterStruct(\n        builder,\n        item?.a,\n        item?.b,\n        item?.cUnderscore?.a ?? 0,\n        item?.cUnderscore?.b ?? [],\n        item?.cUnderscore?.c ?? 0,\n        item?.cUnderscore?.dUnderscore ?? BigInt(0),\n        item?.d,\n        item?.e?.a ?? 0,\n        item?.e?.b ?? [],\n        item?.e?.c ?? 0,\n        item?.e?.dUnderscore ?? BigInt(0),\n        item?.f,\n      );\n    }\n\n    builder.pad(4);\n    builder.writeInt32(e);\n\n    for (let i = 1; i >= 0; --i) {\n      const item = d?.[i];\n\n      if (item instanceof NestedStructT) {\n        item.pack(builder);\n        continue;\n      }\n\n      NestedStruct.createNestedStruct(\n        builder,\n        item?.a,\n        item?.b,\n        item?.cUnderscore,\n        item?.dOuter,\n        item?.e,\n      );\n    }\n\n    builder.pad(7);\n    builder.writeInt8(c);\n\n    for (let i = 14; i >= 0; --i) {\n      builder.writeInt32(b_underscore?.[i] ?? 0);\n    }\n\n    builder.writeFloat32(a_underscore);\n    return builder.offset();\n  }\n\n  unpack(): ArrayStructT {\n    return new ArrayStructT(\n      this.aUnderscore(),\n      this.bb!.createScalarList<number>(this.bUnderscore.bind(this), 15),\n      this.c(),\n      this.bb!.createObjList<NestedStruct, NestedStructT>(this.d.bind(this), 2),\n      this.e(),\n      this.bb!.createObjList<OuterStruct, OuterStructT>(this.f.bind(this), 2),\n      this.bb!.createScalarList<bigint>(this.g.bind(this), 2),\n    );\n  }\n\n  unpackTo(_o: ArrayStructT): void {\n    _o.aUnderscore = this.aUnderscore();\n    _o.bUnderscore = this.bb!.createScalarList<number>(\n      this.bUnderscore.bind(this),\n      15,\n    );\n    _o.c = this.c();\n    _o.d = this.bb!.createObjList<NestedStruct, NestedStructT>(\n      this.d.bind(this),\n      2,\n    );\n    _o.e = this.e();\n    _o.f = this.bb!.createObjList<OuterStruct, OuterStructT>(\n      this.f.bind(this),\n      2,\n    );\n    _o.g = this.bb!.createScalarList<bigint>(this.g.bind(this), 2);\n  }\n}\n\nexport class ArrayStructT implements flatbuffers.IGeneratedObject {\n  constructor(\n    public aUnderscore: number = 0.0,\n    public bUnderscore: number[] = [],\n    public c: number = 0,\n    public d: NestedStructT[] = [],\n    public e: number = 0,\n    public f: OuterStructT[] = [],\n    public g: bigint[] = [],\n  ) {}\n\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset {\n    return ArrayStruct.createArrayStruct(\n      builder,\n      this.aUnderscore,\n      this.bUnderscore,\n      this.c,\n      this.d,\n      this.e,\n      this.f,\n      this.g,\n    );\n  }\n}\n"
  },
  {
    "path": "tests/ts/arrays_test_complex/my-game/example/array-table.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nimport {ArrayStruct, ArrayStructT} from '../../my-game/example/array-struct.js';\nexport declare class ArrayTable\n  implements flatbuffers.IUnpackableObject<ArrayTableT>\n{\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): ArrayTable;\n  static getRootAsArrayTable(\n    bb: flatbuffers.ByteBuffer,\n    obj?: ArrayTable,\n  ): ArrayTable;\n  static getSizePrefixedRootAsArrayTable(\n    bb: flatbuffers.ByteBuffer,\n    obj?: ArrayTable,\n  ): ArrayTable;\n  static bufferHasIdentifier(bb: flatbuffers.ByteBuffer): boolean;\n  a(): string | null;\n  a(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  cUnderscore(obj?: ArrayStruct): ArrayStruct | null;\n  static getFullyQualifiedName(): string;\n  static startArrayTable(builder: flatbuffers.Builder): void;\n  static addA(builder: flatbuffers.Builder, aOffset: flatbuffers.Offset): void;\n  static addCUnderscore(\n    builder: flatbuffers.Builder,\n    cUnderscoreOffset: flatbuffers.Offset,\n  ): void;\n  static endArrayTable(builder: flatbuffers.Builder): flatbuffers.Offset;\n  static finishArrayTableBuffer(\n    builder: flatbuffers.Builder,\n    offset: flatbuffers.Offset,\n  ): void;\n  static finishSizePrefixedArrayTableBuffer(\n    builder: flatbuffers.Builder,\n    offset: flatbuffers.Offset,\n  ): void;\n  unpack(): ArrayTableT;\n  unpackTo(_o: ArrayTableT): void;\n}\nexport declare class ArrayTableT implements flatbuffers.IGeneratedObject {\n  a: string | Uint8Array | null;\n  cUnderscore: ArrayStructT | null;\n  constructor(\n    a?: string | Uint8Array | null,\n    cUnderscore?: ArrayStructT | null,\n  );\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/arrays_test_complex/my-game/example/array-table.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\n\nimport {ArrayStruct} from '../../my-game/example/array-struct.js';\n\nexport class ArrayTable {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsArrayTable(bb, obj) {\n    return (obj || new ArrayTable())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsArrayTable(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new ArrayTable())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static bufferHasIdentifier(bb) {\n    return bb.__has_identifier('RHUB');\n  }\n  a(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) :\n                    null;\n  }\n  cUnderscore(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ?\n        (obj || new ArrayStruct()).__init(this.bb_pos + offset, this.bb) :\n        null;\n  }\n  static getFullyQualifiedName() {\n    return 'MyGame.Example.ArrayTable';\n  }\n  static startArrayTable(builder) {\n    builder.startObject(2);\n  }\n  static addA(builder, aOffset) {\n    builder.addFieldOffset(0, aOffset, 0);\n  }\n  static addCUnderscore(builder, cUnderscoreOffset) {\n    builder.addFieldStruct(1, cUnderscoreOffset, 0);\n  }\n  static endArrayTable(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static finishArrayTableBuffer(builder, offset) {\n    builder.finish(offset, 'RHUB');\n  }\n  static finishSizePrefixedArrayTableBuffer(builder, offset) {\n    builder.finish(offset, 'RHUB', true);\n  }\n  unpack() {\n    return new ArrayTableT(\n        this.a(),\n        (this.cUnderscore() !== null ? this.cUnderscore().unpack() : null));\n  }\n  unpackTo(_o) {\n    _o.a = this.a();\n    _o.cUnderscore =\n        (this.cUnderscore() !== null ? this.cUnderscore().unpack() : null);\n  }\n}\nexport class ArrayTableT {\n  constructor(a = null, cUnderscore = null) {\n    this.a = a;\n    this.cUnderscore = cUnderscore;\n  }\n  pack(builder) {\n    const a = (this.a !== null ? builder.createString(this.a) : 0);\n    ArrayTable.startArrayTable(builder);\n    ArrayTable.addA(builder, a);\n    ArrayTable.addCUnderscore(\n        builder,\n        (this.cUnderscore !== null ? this.cUnderscore.pack(builder) : 0));\n    return ArrayTable.endArrayTable(builder);\n  }\n}\n"
  },
  {
    "path": "tests/ts/arrays_test_complex/my-game/example/array-table.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport {ArrayStruct, ArrayStructT} from '../../my-game/example/array-struct.js';\n\nexport class ArrayTable implements flatbuffers.IUnpackableObject<ArrayTableT> {\n  bb: flatbuffers.ByteBuffer | null = null;\n  bb_pos = 0;\n  __init(i: number, bb: flatbuffers.ByteBuffer): ArrayTable {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n\n  static getRootAsArrayTable(\n    bb: flatbuffers.ByteBuffer,\n    obj?: ArrayTable,\n  ): ArrayTable {\n    return (obj || new ArrayTable()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  static getSizePrefixedRootAsArrayTable(\n    bb: flatbuffers.ByteBuffer,\n    obj?: ArrayTable,\n  ): ArrayTable {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new ArrayTable()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  static bufferHasIdentifier(bb: flatbuffers.ByteBuffer): boolean {\n    return bb.__has_identifier('RHUB');\n  }\n\n  a(): string | null;\n  a(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  a(optionalEncoding?: any): string | Uint8Array | null {\n    const offset = this.bb!.__offset(this.bb_pos, 4);\n    return offset\n      ? this.bb!.__string(this.bb_pos + offset, optionalEncoding)\n      : null;\n  }\n\n  cUnderscore(obj?: ArrayStruct): ArrayStruct | null {\n    const offset = this.bb!.__offset(this.bb_pos, 6);\n    return offset\n      ? (obj || new ArrayStruct()).__init(this.bb_pos + offset, this.bb!)\n      : null;\n  }\n\n  static getFullyQualifiedName(): string {\n    return 'MyGame.Example.ArrayTable';\n  }\n\n  static startArrayTable(builder: flatbuffers.Builder) {\n    builder.startObject(2);\n  }\n\n  static addA(builder: flatbuffers.Builder, aOffset: flatbuffers.Offset) {\n    builder.addFieldOffset(0, aOffset, 0);\n  }\n\n  static addCUnderscore(\n    builder: flatbuffers.Builder,\n    cUnderscoreOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldStruct(1, cUnderscoreOffset, 0);\n  }\n\n  static endArrayTable(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const offset = builder.endObject();\n    return offset;\n  }\n\n  static finishArrayTableBuffer(\n    builder: flatbuffers.Builder,\n    offset: flatbuffers.Offset,\n  ) {\n    builder.finish(offset, 'RHUB');\n  }\n\n  static finishSizePrefixedArrayTableBuffer(\n    builder: flatbuffers.Builder,\n    offset: flatbuffers.Offset,\n  ) {\n    builder.finish(offset, 'RHUB', true);\n  }\n\n  unpack(): ArrayTableT {\n    return new ArrayTableT(\n      this.a(),\n      this.cUnderscore() !== null ? this.cUnderscore()!.unpack() : null,\n    );\n  }\n\n  unpackTo(_o: ArrayTableT): void {\n    _o.a = this.a();\n    _o.cUnderscore =\n      this.cUnderscore() !== null ? this.cUnderscore()!.unpack() : null;\n  }\n}\n\nexport class ArrayTableT implements flatbuffers.IGeneratedObject {\n  constructor(\n    public a: string | Uint8Array | null = null,\n    public cUnderscore: ArrayStructT | null = null,\n  ) {}\n\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const a = this.a !== null ? builder.createString(this.a!) : 0;\n\n    ArrayTable.startArrayTable(builder);\n    ArrayTable.addA(builder, a);\n    ArrayTable.addCUnderscore(\n      builder,\n      this.cUnderscore !== null ? this.cUnderscore!.pack(builder) : 0,\n    );\n\n    return ArrayTable.endArrayTable(builder);\n  }\n}\n"
  },
  {
    "path": "tests/ts/arrays_test_complex/my-game/example/inner-struct.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nexport declare class InnerStruct\n  implements flatbuffers.IUnpackableObject<InnerStructT>\n{\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): InnerStruct;\n  a(): number;\n  b(index: number): number | null;\n  c(): number;\n  dUnderscore(): bigint;\n  static getFullyQualifiedName(): string;\n  static sizeOf(): number;\n  static createInnerStruct(\n    builder: flatbuffers.Builder,\n    a: number,\n    b: number[] | null,\n    c: number,\n    d_underscore: bigint,\n  ): flatbuffers.Offset;\n  unpack(): InnerStructT;\n  unpackTo(_o: InnerStructT): void;\n}\nexport declare class InnerStructT implements flatbuffers.IGeneratedObject {\n  a: number;\n  b: number[];\n  c: number;\n  dUnderscore: bigint;\n  constructor(a?: number, b?: number[], c?: number, dUnderscore?: bigint);\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/arrays_test_complex/my-game/example/inner-struct.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\nexport class InnerStruct {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  a() {\n    return this.bb.readFloat64(this.bb_pos);\n  }\n  b(index) {\n    return this.bb.readUint8(this.bb_pos + 8 + index);\n  }\n  c() {\n    return this.bb.readInt8(this.bb_pos + 21);\n  }\n  dUnderscore() {\n    return this.bb.readInt64(this.bb_pos + 24);\n  }\n  static getFullyQualifiedName() {\n    return 'MyGame.Example.InnerStruct';\n  }\n  static sizeOf() {\n    return 32;\n  }\n  static createInnerStruct(builder, a, b, c, d_underscore) {\n    builder.prep(8, 32);\n    builder.writeInt64(BigInt(d_underscore ?? 0));\n    builder.pad(2);\n    builder.writeInt8(c);\n    for (let i = 12; i >= 0; --i) {\n      builder.writeInt8((b?.[i] ?? 0));\n    }\n    builder.writeFloat64(a);\n    return builder.offset();\n  }\n  unpack() {\n    return new InnerStructT(\n        this.a(), this.bb.createScalarList(this.b.bind(this), 13), this.c(),\n        this.dUnderscore());\n  }\n  unpackTo(_o) {\n    _o.a = this.a();\n    _o.b = this.bb.createScalarList(this.b.bind(this), 13);\n    _o.c = this.c();\n    _o.dUnderscore = this.dUnderscore();\n  }\n}\nexport class InnerStructT {\n  constructor(a = 0.0, b = [], c = 0, dUnderscore = BigInt('0')) {\n    this.a = a;\n    this.b = b;\n    this.c = c;\n    this.dUnderscore = dUnderscore;\n  }\n  pack(builder) {\n    return InnerStruct.createInnerStruct(\n        builder, this.a, this.b, this.c, this.dUnderscore);\n  }\n}\n"
  },
  {
    "path": "tests/ts/arrays_test_complex/my-game/example/inner-struct.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nexport class InnerStruct\n  implements flatbuffers.IUnpackableObject<InnerStructT>\n{\n  bb: flatbuffers.ByteBuffer | null = null;\n  bb_pos = 0;\n  __init(i: number, bb: flatbuffers.ByteBuffer): InnerStruct {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n\n  a(): number {\n    return this.bb!.readFloat64(this.bb_pos);\n  }\n\n  b(index: number): number | null {\n    return this.bb!.readUint8(this.bb_pos + 8 + index);\n  }\n\n  c(): number {\n    return this.bb!.readInt8(this.bb_pos + 21);\n  }\n\n  dUnderscore(): bigint {\n    return this.bb!.readInt64(this.bb_pos + 24);\n  }\n\n  static getFullyQualifiedName(): string {\n    return 'MyGame.Example.InnerStruct';\n  }\n\n  static sizeOf(): number {\n    return 32;\n  }\n\n  static createInnerStruct(\n    builder: flatbuffers.Builder,\n    a: number,\n    b: number[] | null,\n    c: number,\n    d_underscore: bigint,\n  ): flatbuffers.Offset {\n    builder.prep(8, 32);\n    builder.writeInt64(BigInt(d_underscore ?? 0));\n    builder.pad(2);\n    builder.writeInt8(c);\n\n    for (let i = 12; i >= 0; --i) {\n      builder.writeInt8(b?.[i] ?? 0);\n    }\n\n    builder.writeFloat64(a);\n    return builder.offset();\n  }\n\n  unpack(): InnerStructT {\n    return new InnerStructT(\n      this.a(),\n      this.bb!.createScalarList<number>(this.b.bind(this), 13),\n      this.c(),\n      this.dUnderscore(),\n    );\n  }\n\n  unpackTo(_o: InnerStructT): void {\n    _o.a = this.a();\n    _o.b = this.bb!.createScalarList<number>(this.b.bind(this), 13);\n    _o.c = this.c();\n    _o.dUnderscore = this.dUnderscore();\n  }\n}\n\nexport class InnerStructT implements flatbuffers.IGeneratedObject {\n  constructor(\n    public a: number = 0.0,\n    public b: number[] = [],\n    public c: number = 0,\n    public dUnderscore: bigint = BigInt('0'),\n  ) {}\n\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset {\n    return InnerStruct.createInnerStruct(\n      builder,\n      this.a,\n      this.b,\n      this.c,\n      this.dUnderscore,\n    );\n  }\n}\n"
  },
  {
    "path": "tests/ts/arrays_test_complex/my-game/example/nested-struct.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nimport {OuterStruct, OuterStructT} from '../../my-game/example/outer-struct.js';\nimport {TestEnum} from '../../my-game/example/test-enum.js';\nexport declare class NestedStruct\n  implements flatbuffers.IUnpackableObject<NestedStructT>\n{\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): NestedStruct;\n  a(index: number): number | null;\n  b(): TestEnum;\n  cUnderscore(index: number): TestEnum | null;\n  dOuter(index: number, obj?: OuterStruct): OuterStruct | null;\n  e(index: number): bigint | null;\n  static getFullyQualifiedName(): string;\n  static sizeOf(): number;\n  static createNestedStruct(\n    builder: flatbuffers.Builder,\n    a: number[] | null,\n    b: TestEnum,\n    c_underscore: number[] | null,\n    d_outer: (any | OuterStructT)[] | null,\n    e: bigint[] | null,\n  ): flatbuffers.Offset;\n  unpack(): NestedStructT;\n  unpackTo(_o: NestedStructT): void;\n}\nexport declare class NestedStructT implements flatbuffers.IGeneratedObject {\n  a: number[];\n  b: TestEnum;\n  cUnderscore: TestEnum[];\n  dOuter: OuterStructT[];\n  e: bigint[];\n  constructor(\n    a?: number[],\n    b?: TestEnum,\n    cUnderscore?: TestEnum[],\n    dOuter?: OuterStructT[],\n    e?: bigint[],\n  );\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/arrays_test_complex/my-game/example/nested-struct.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\nimport {OuterStruct, OuterStructT} from '../../my-game/example/outer-struct.js';\nimport {TestEnum} from '../../my-game/example/test-enum.js';\nexport class NestedStruct {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  a(index) {\n    return this.bb.readInt32(this.bb_pos + 0 + index * 4);\n  }\n  b() {\n    return this.bb.readInt8(this.bb_pos + 8);\n  }\n  cUnderscore(index) {\n    return this.bb.readInt8(this.bb_pos + 9 + index);\n  }\n  dOuter(index, obj) {\n    return (obj || new OuterStruct())\n        .__init(this.bb_pos + 16 + index * 208, this.bb);\n  }\n  e(index) {\n    return this.bb.readInt64(this.bb_pos + 1056 + index * 8);\n  }\n  static getFullyQualifiedName() {\n    return 'MyGame.Example.NestedStruct';\n  }\n  static sizeOf() {\n    return 1072;\n  }\n  static createNestedStruct(builder, a, b, c_underscore, d_outer, e) {\n    builder.prep(8, 1072);\n    for (let i = 1; i >= 0; --i) {\n      builder.writeInt64(BigInt(e?.[i] ?? 0));\n    }\n    for (let i = 4; i >= 0; --i) {\n      const item = d_outer?.[i];\n      if (item instanceof OuterStructT) {\n        item.pack(builder);\n        continue;\n      }\n      OuterStruct.createOuterStruct(\n          builder, item?.a, item?.b, (item?.cUnderscore?.a ?? 0),\n          (item?.cUnderscore?.b ?? []), (item?.cUnderscore?.c ?? 0),\n          (item?.cUnderscore?.dUnderscore ?? BigInt(0)), item?.d,\n          (item?.e?.a ?? 0), (item?.e?.b ?? []), (item?.e?.c ?? 0),\n          (item?.e?.dUnderscore ?? BigInt(0)), item?.f);\n    }\n    builder.pad(5);\n    for (let i = 1; i >= 0; --i) {\n      builder.writeInt8((c_underscore?.[i] ?? 0));\n    }\n    builder.writeInt8(b);\n    for (let i = 1; i >= 0; --i) {\n      builder.writeInt32((a?.[i] ?? 0));\n    }\n    return builder.offset();\n  }\n  unpack() {\n    return new NestedStructT(\n        this.bb.createScalarList(this.a.bind(this), 2), this.b(),\n        this.bb.createScalarList(this.cUnderscore.bind(this), 2),\n        this.bb.createObjList(this.dOuter.bind(this), 5),\n        this.bb.createScalarList(this.e.bind(this), 2));\n  }\n  unpackTo(_o) {\n    _o.a = this.bb.createScalarList(this.a.bind(this), 2);\n    _o.b = this.b();\n    _o.cUnderscore = this.bb.createScalarList(this.cUnderscore.bind(this), 2);\n    _o.dOuter = this.bb.createObjList(this.dOuter.bind(this), 5);\n    _o.e = this.bb.createScalarList(this.e.bind(this), 2);\n  }\n}\nexport class NestedStructT {\n  constructor(\n      a = [], b = TestEnum.A, cUnderscore = [TestEnum.A, TestEnum.A],\n      dOuter = [], e = []) {\n    this.a = a;\n    this.b = b;\n    this.cUnderscore = cUnderscore;\n    this.dOuter = dOuter;\n    this.e = e;\n  }\n  pack(builder) {\n    return NestedStruct.createNestedStruct(\n        builder, this.a, this.b, this.cUnderscore, this.dOuter, this.e);\n  }\n}\n"
  },
  {
    "path": "tests/ts/arrays_test_complex/my-game/example/nested-struct.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport {OuterStruct, OuterStructT} from '../../my-game/example/outer-struct.js';\nimport {TestEnum} from '../../my-game/example/test-enum.js';\n\nexport class NestedStruct\n  implements flatbuffers.IUnpackableObject<NestedStructT>\n{\n  bb: flatbuffers.ByteBuffer | null = null;\n  bb_pos = 0;\n  __init(i: number, bb: flatbuffers.ByteBuffer): NestedStruct {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n\n  a(index: number): number | null {\n    return this.bb!.readInt32(this.bb_pos + 0 + index * 4);\n  }\n\n  b(): TestEnum {\n    return this.bb!.readInt8(this.bb_pos + 8);\n  }\n\n  cUnderscore(index: number): TestEnum | null {\n    return this.bb!.readInt8(this.bb_pos + 9 + index);\n  }\n\n  dOuter(index: number, obj?: OuterStruct): OuterStruct | null {\n    return (obj || new OuterStruct()).__init(\n      this.bb_pos + 16 + index * 208,\n      this.bb!,\n    );\n  }\n\n  e(index: number): bigint | null {\n    return this.bb!.readInt64(this.bb_pos + 1056 + index * 8);\n  }\n\n  static getFullyQualifiedName(): string {\n    return 'MyGame.Example.NestedStruct';\n  }\n\n  static sizeOf(): number {\n    return 1072;\n  }\n\n  static createNestedStruct(\n    builder: flatbuffers.Builder,\n    a: number[] | null,\n    b: TestEnum,\n    c_underscore: number[] | null,\n    d_outer: (any | OuterStructT)[] | null,\n    e: bigint[] | null,\n  ): flatbuffers.Offset {\n    builder.prep(8, 1072);\n\n    for (let i = 1; i >= 0; --i) {\n      builder.writeInt64(BigInt(e?.[i] ?? 0));\n    }\n\n    for (let i = 4; i >= 0; --i) {\n      const item = d_outer?.[i];\n\n      if (item instanceof OuterStructT) {\n        item.pack(builder);\n        continue;\n      }\n\n      OuterStruct.createOuterStruct(\n        builder,\n        item?.a,\n        item?.b,\n        item?.cUnderscore?.a ?? 0,\n        item?.cUnderscore?.b ?? [],\n        item?.cUnderscore?.c ?? 0,\n        item?.cUnderscore?.dUnderscore ?? BigInt(0),\n        item?.d,\n        item?.e?.a ?? 0,\n        item?.e?.b ?? [],\n        item?.e?.c ?? 0,\n        item?.e?.dUnderscore ?? BigInt(0),\n        item?.f,\n      );\n    }\n\n    builder.pad(5);\n\n    for (let i = 1; i >= 0; --i) {\n      builder.writeInt8(c_underscore?.[i] ?? 0);\n    }\n\n    builder.writeInt8(b);\n\n    for (let i = 1; i >= 0; --i) {\n      builder.writeInt32(a?.[i] ?? 0);\n    }\n\n    return builder.offset();\n  }\n\n  unpack(): NestedStructT {\n    return new NestedStructT(\n      this.bb!.createScalarList<number>(this.a.bind(this), 2),\n      this.b(),\n      this.bb!.createScalarList<TestEnum>(this.cUnderscore.bind(this), 2),\n      this.bb!.createObjList<OuterStruct, OuterStructT>(\n        this.dOuter.bind(this),\n        5,\n      ),\n      this.bb!.createScalarList<bigint>(this.e.bind(this), 2),\n    );\n  }\n\n  unpackTo(_o: NestedStructT): void {\n    _o.a = this.bb!.createScalarList<number>(this.a.bind(this), 2);\n    _o.b = this.b();\n    _o.cUnderscore = this.bb!.createScalarList<TestEnum>(\n      this.cUnderscore.bind(this),\n      2,\n    );\n    _o.dOuter = this.bb!.createObjList<OuterStruct, OuterStructT>(\n      this.dOuter.bind(this),\n      5,\n    );\n    _o.e = this.bb!.createScalarList<bigint>(this.e.bind(this), 2);\n  }\n}\n\nexport class NestedStructT implements flatbuffers.IGeneratedObject {\n  constructor(\n    public a: number[] = [],\n    public b: TestEnum = TestEnum.A,\n    public cUnderscore: TestEnum[] = [TestEnum.A, TestEnum.A],\n    public dOuter: OuterStructT[] = [],\n    public e: bigint[] = [],\n  ) {}\n\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset {\n    return NestedStruct.createNestedStruct(\n      builder,\n      this.a,\n      this.b,\n      this.cUnderscore,\n      this.dOuter,\n      this.e,\n    );\n  }\n}\n"
  },
  {
    "path": "tests/ts/arrays_test_complex/my-game/example/outer-struct.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nimport {InnerStruct, InnerStructT} from '../../my-game/example/inner-struct.js';\nexport declare class OuterStruct\n  implements flatbuffers.IUnpackableObject<OuterStructT>\n{\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): OuterStruct;\n  a(): boolean;\n  b(): number;\n  cUnderscore(obj?: InnerStruct): InnerStruct | null;\n  d(index: number, obj?: InnerStruct): InnerStruct | null;\n  e(obj?: InnerStruct): InnerStruct | null;\n  f(index: number): number | null;\n  static getFullyQualifiedName(): string;\n  static sizeOf(): number;\n  static createOuterStruct(\n    builder: flatbuffers.Builder,\n    a: boolean,\n    b: number,\n    c_underscore_a: number,\n    c_underscore_b: number[] | null,\n    c_underscore_c: number,\n    c_underscore_d_underscore: bigint,\n    d: (any | InnerStructT)[] | null,\n    e_a: number,\n    e_b: number[] | null,\n    e_c: number,\n    e_d_underscore: bigint,\n    f: number[] | null,\n  ): flatbuffers.Offset;\n  unpack(): OuterStructT;\n  unpackTo(_o: OuterStructT): void;\n}\nexport declare class OuterStructT implements flatbuffers.IGeneratedObject {\n  a: boolean;\n  b: number;\n  cUnderscore: InnerStructT | null;\n  d: InnerStructT[];\n  e: InnerStructT | null;\n  f: number[];\n  constructor(\n    a?: boolean,\n    b?: number,\n    cUnderscore?: InnerStructT | null,\n    d?: InnerStructT[],\n    e?: InnerStructT | null,\n    f?: number[],\n  );\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/arrays_test_complex/my-game/example/outer-struct.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\nimport {InnerStruct, InnerStructT} from '../../my-game/example/inner-struct.js';\nexport class OuterStruct {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  a() {\n    return !!this.bb.readInt8(this.bb_pos);\n  }\n  b() {\n    return this.bb.readFloat64(this.bb_pos + 8);\n  }\n  cUnderscore(obj) {\n    return (obj || new InnerStruct()).__init(this.bb_pos + 16, this.bb);\n  }\n  d(index, obj) {\n    return (obj || new InnerStruct())\n        .__init(this.bb_pos + 48 + index * 32, this.bb);\n  }\n  e(obj) {\n    return (obj || new InnerStruct()).__init(this.bb_pos + 144, this.bb);\n  }\n  f(index) {\n    return this.bb.readFloat64(this.bb_pos + 176 + index * 8);\n  }\n  static getFullyQualifiedName() {\n    return 'MyGame.Example.OuterStruct';\n  }\n  static sizeOf() {\n    return 208;\n  }\n  static createOuterStruct(\n      builder, a, b, c_underscore_a, c_underscore_b, c_underscore_c,\n      c_underscore_d_underscore, d, e_a, e_b, e_c, e_d_underscore, f) {\n    builder.prep(8, 208);\n    for (let i = 3; i >= 0; --i) {\n      builder.writeFloat64((f?.[i] ?? 0));\n    }\n    builder.prep(8, 32);\n    builder.writeInt64(BigInt(e_d_underscore ?? 0));\n    builder.pad(2);\n    builder.writeInt8(e_c);\n    for (let i = 12; i >= 0; --i) {\n      builder.writeInt8((e_b?.[i] ?? 0));\n    }\n    builder.writeFloat64(e_a);\n    for (let i = 2; i >= 0; --i) {\n      const item = d?.[i];\n      if (item instanceof InnerStructT) {\n        item.pack(builder);\n        continue;\n      }\n      InnerStruct.createInnerStruct(\n          builder, item?.a, item?.b, item?.c, item?.dUnderscore);\n    }\n    builder.prep(8, 32);\n    builder.writeInt64(BigInt(c_underscore_d_underscore ?? 0));\n    builder.pad(2);\n    builder.writeInt8(c_underscore_c);\n    for (let i = 12; i >= 0; --i) {\n      builder.writeInt8((c_underscore_b?.[i] ?? 0));\n    }\n    builder.writeFloat64(c_underscore_a);\n    builder.writeFloat64(b);\n    builder.pad(7);\n    builder.writeInt8(Number(Boolean(a)));\n    return builder.offset();\n  }\n  unpack() {\n    return new OuterStructT(\n        this.a(), this.b(),\n        (this.cUnderscore() !== null ? this.cUnderscore().unpack() : null),\n        this.bb.createObjList(this.d.bind(this), 3),\n        (this.e() !== null ? this.e().unpack() : null),\n        this.bb.createScalarList(this.f.bind(this), 4));\n  }\n  unpackTo(_o) {\n    _o.a = this.a();\n    _o.b = this.b();\n    _o.cUnderscore =\n        (this.cUnderscore() !== null ? this.cUnderscore().unpack() : null);\n    _o.d = this.bb.createObjList(this.d.bind(this), 3);\n    _o.e = (this.e() !== null ? this.e().unpack() : null);\n    _o.f = this.bb.createScalarList(this.f.bind(this), 4);\n  }\n}\nexport class OuterStructT {\n  constructor(\n      a = false, b = 0.0, cUnderscore = null, d = [], e = null, f = []) {\n    this.a = a;\n    this.b = b;\n    this.cUnderscore = cUnderscore;\n    this.d = d;\n    this.e = e;\n    this.f = f;\n  }\n  pack(builder) {\n    return OuterStruct.createOuterStruct(\n        builder, this.a, this.b, (this.cUnderscore?.a ?? 0),\n        (this.cUnderscore?.b ?? []), (this.cUnderscore?.c ?? 0),\n        (this.cUnderscore?.dUnderscore ?? BigInt(0)), this.d, (this.e?.a ?? 0),\n        (this.e?.b ?? []), (this.e?.c ?? 0), (this.e?.dUnderscore ?? BigInt(0)),\n        this.f);\n  }\n}\n"
  },
  {
    "path": "tests/ts/arrays_test_complex/my-game/example/outer-struct.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport {InnerStruct, InnerStructT} from '../../my-game/example/inner-struct.js';\n\nexport class OuterStruct\n  implements flatbuffers.IUnpackableObject<OuterStructT>\n{\n  bb: flatbuffers.ByteBuffer | null = null;\n  bb_pos = 0;\n  __init(i: number, bb: flatbuffers.ByteBuffer): OuterStruct {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n\n  a(): boolean {\n    return !!this.bb!.readInt8(this.bb_pos);\n  }\n\n  b(): number {\n    return this.bb!.readFloat64(this.bb_pos + 8);\n  }\n\n  cUnderscore(obj?: InnerStruct): InnerStruct | null {\n    return (obj || new InnerStruct()).__init(this.bb_pos + 16, this.bb!);\n  }\n\n  d(index: number, obj?: InnerStruct): InnerStruct | null {\n    return (obj || new InnerStruct()).__init(\n      this.bb_pos + 48 + index * 32,\n      this.bb!,\n    );\n  }\n\n  e(obj?: InnerStruct): InnerStruct | null {\n    return (obj || new InnerStruct()).__init(this.bb_pos + 144, this.bb!);\n  }\n\n  f(index: number): number | null {\n    return this.bb!.readFloat64(this.bb_pos + 176 + index * 8);\n  }\n\n  static getFullyQualifiedName(): string {\n    return 'MyGame.Example.OuterStruct';\n  }\n\n  static sizeOf(): number {\n    return 208;\n  }\n\n  static createOuterStruct(\n    builder: flatbuffers.Builder,\n    a: boolean,\n    b: number,\n    c_underscore_a: number,\n    c_underscore_b: number[] | null,\n    c_underscore_c: number,\n    c_underscore_d_underscore: bigint,\n    d: (any | InnerStructT)[] | null,\n    e_a: number,\n    e_b: number[] | null,\n    e_c: number,\n    e_d_underscore: bigint,\n    f: number[] | null,\n  ): flatbuffers.Offset {\n    builder.prep(8, 208);\n\n    for (let i = 3; i >= 0; --i) {\n      builder.writeFloat64(f?.[i] ?? 0);\n    }\n\n    builder.prep(8, 32);\n    builder.writeInt64(BigInt(e_d_underscore ?? 0));\n    builder.pad(2);\n    builder.writeInt8(e_c);\n\n    for (let i = 12; i >= 0; --i) {\n      builder.writeInt8(e_b?.[i] ?? 0);\n    }\n\n    builder.writeFloat64(e_a);\n\n    for (let i = 2; i >= 0; --i) {\n      const item = d?.[i];\n\n      if (item instanceof InnerStructT) {\n        item.pack(builder);\n        continue;\n      }\n\n      InnerStruct.createInnerStruct(\n        builder,\n        item?.a,\n        item?.b,\n        item?.c,\n        item?.dUnderscore,\n      );\n    }\n\n    builder.prep(8, 32);\n    builder.writeInt64(BigInt(c_underscore_d_underscore ?? 0));\n    builder.pad(2);\n    builder.writeInt8(c_underscore_c);\n\n    for (let i = 12; i >= 0; --i) {\n      builder.writeInt8(c_underscore_b?.[i] ?? 0);\n    }\n\n    builder.writeFloat64(c_underscore_a);\n    builder.writeFloat64(b);\n    builder.pad(7);\n    builder.writeInt8(Number(Boolean(a)));\n    return builder.offset();\n  }\n\n  unpack(): OuterStructT {\n    return new OuterStructT(\n      this.a(),\n      this.b(),\n      this.cUnderscore() !== null ? this.cUnderscore()!.unpack() : null,\n      this.bb!.createObjList<InnerStruct, InnerStructT>(this.d.bind(this), 3),\n      this.e() !== null ? this.e()!.unpack() : null,\n      this.bb!.createScalarList<number>(this.f.bind(this), 4),\n    );\n  }\n\n  unpackTo(_o: OuterStructT): void {\n    _o.a = this.a();\n    _o.b = this.b();\n    _o.cUnderscore =\n      this.cUnderscore() !== null ? this.cUnderscore()!.unpack() : null;\n    _o.d = this.bb!.createObjList<InnerStruct, InnerStructT>(\n      this.d.bind(this),\n      3,\n    );\n    _o.e = this.e() !== null ? this.e()!.unpack() : null;\n    _o.f = this.bb!.createScalarList<number>(this.f.bind(this), 4);\n  }\n}\n\nexport class OuterStructT implements flatbuffers.IGeneratedObject {\n  constructor(\n    public a: boolean = false,\n    public b: number = 0.0,\n    public cUnderscore: InnerStructT | null = null,\n    public d: InnerStructT[] = [],\n    public e: InnerStructT | null = null,\n    public f: number[] = [],\n  ) {}\n\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset {\n    return OuterStruct.createOuterStruct(\n      builder,\n      this.a,\n      this.b,\n      this.cUnderscore?.a ?? 0,\n      this.cUnderscore?.b ?? [],\n      this.cUnderscore?.c ?? 0,\n      this.cUnderscore?.dUnderscore ?? BigInt(0),\n      this.d,\n      this.e?.a ?? 0,\n      this.e?.b ?? [],\n      this.e?.c ?? 0,\n      this.e?.dUnderscore ?? BigInt(0),\n      this.f,\n    );\n  }\n}\n"
  },
  {
    "path": "tests/ts/arrays_test_complex/my-game/example/test-enum.d.ts",
    "content": "export declare enum TestEnum {\n  A = 0,\n  B = 1,\n  C = 2,\n}\n"
  },
  {
    "path": "tests/ts/arrays_test_complex/my-game/example/test-enum.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nexport var TestEnum;\n(function(TestEnum) {\nTestEnum[TestEnum['A'] = 0] = 'A';\nTestEnum[TestEnum['B'] = 1] = 'B';\nTestEnum[TestEnum['C'] = 2] = 'C';\n})(TestEnum || (TestEnum = {}));\n"
  },
  {
    "path": "tests/ts/arrays_test_complex/my-game/example/test-enum.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport enum TestEnum {\n  A = 0,\n  B = 1,\n  C = 2,\n}\n"
  },
  {
    "path": "tests/ts/arrays_test_complex/my-game/example.d.ts",
    "content": "export {ArrayStruct, ArrayStructT} from './example/array-struct.js';\nexport {ArrayTable, ArrayTableT} from './example/array-table.js';\nexport {InnerStruct, InnerStructT} from './example/inner-struct.js';\nexport {NestedStruct, NestedStructT} from './example/nested-struct.js';\nexport {OuterStruct, OuterStructT} from './example/outer-struct.js';\nexport {TestEnum} from './example/test-enum.js';\n"
  },
  {
    "path": "tests/ts/arrays_test_complex/my-game/example.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nexport {ArrayStruct, ArrayStructT} from './example/array-struct.js';\nexport {ArrayTable, ArrayTableT} from './example/array-table.js';\nexport {InnerStruct, InnerStructT} from './example/inner-struct.js';\nexport {NestedStruct, NestedStructT} from './example/nested-struct.js';\nexport {OuterStruct, OuterStructT} from './example/outer-struct.js';\nexport {TestEnum} from './example/test-enum.js';\n"
  },
  {
    "path": "tests/ts/arrays_test_complex/my-game/example.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport {ArrayStruct, ArrayStructT} from './example/array-struct.js';\nexport {ArrayTable, ArrayTableT} from './example/array-table.js';\nexport {InnerStruct, InnerStructT} from './example/inner-struct.js';\nexport {NestedStruct, NestedStructT} from './example/nested-struct.js';\nexport {OuterStruct, OuterStructT} from './example/outer-struct.js';\nexport {TestEnum} from './example/test-enum.js';\n"
  },
  {
    "path": "tests/ts/bazel_repository_test_dir/.bazelignore",
    "content": "node_modules\n"
  },
  {
    "path": "tests/ts/bazel_repository_test_dir/.bazelrc",
    "content": "build --symlink_prefix=/\n# Honor the setting of `skipLibCheck` in the tsconfig.json file.\ncommon --@aspect_rules_ts//ts:skipLibCheck=honor_tsconfig\n# Use \"tsc\" as the transpiler when ts_project has no `transpiler` set.\ncommon --@aspect_rules_ts//ts:default_to_tsc_transpiler\n"
  },
  {
    "path": "tests/ts/bazel_repository_test_dir/.gitignore",
    "content": "bazel-*\n"
  },
  {
    "path": "tests/ts/bazel_repository_test_dir/BUILD.bazel",
    "content": "load(\"@aspect_rules_js//js:defs.bzl\", \"js_test\")\nload(\"@aspect_rules_js//npm:defs.bzl\", \"npm_link_package\")\nload(\"@com_github_google_flatbuffers//:typescript.bzl\", \"flatbuffer_ts_library\")\nload(\"@npm//:defs.bzl\", \"npm_link_all_packages\")\n\nnpm_link_all_packages(name = \"node_modules\")\n\nnpm_link_package(\n    name = \"node_modules/flatbuffers\",\n    src = \"@com_github_google_flatbuffers//ts:flatbuffers\",\n)\n\nflatbuffer_ts_library(\n    name = \"one_fbs\",\n    srcs = [\"one.fbs\"],\n)\n\nflatbuffer_ts_library(\n    name = \"two_fbs\",\n    srcs = [\"two.fbs\"],\n    deps = [\":one_fbs\"],\n)\n\njs_test(\n    name = \"import_test\",\n    data = [\n        \"package.json\",\n        \":node_modules/flatbuffers\",\n        \":two_fbs\",\n    ],\n    entry_point = \"import_test.js\",\n)\n\njs_test(\n    name = \"independent_deps_test\",\n    data = [\n        \"package.json\",\n        \":node_modules/lodash\",\n    ],\n    entry_point = \"independent_deps_test.js\",\n)\n"
  },
  {
    "path": "tests/ts/bazel_repository_test_dir/MODULE.bazel",
    "content": "module(name = \"bazel_repository_test\")\n\nbazel_dep(name = \"flatbuffers\", repo_name = \"com_github_google_flatbuffers\")\nlocal_path_override(\n    module_name = \"flatbuffers\",\n    path = \"../../../\",\n)\n\nbazel_dep(\n    name = \"aspect_rules_esbuild\",\n    version = \"0.21.0\",\n)\nbazel_dep(\n    name = \"aspect_rules_js\",\n    version = \"2.1.3\",\n)\nbazel_dep(\n    name = \"aspect_rules_ts\",\n    version = \"3.4.0\",\n)\nbazel_dep(\n    name = \"rules_nodejs\",\n    version = \"6.3.3\",\n)\n\nnpm = use_extension(\"@aspect_rules_js//npm:extensions.bzl\", \"npm\")\nnpm.npm_translate_lock(\n    name = \"npm\",\n    npmrc = \"//:.npmrc\",\n    pnpm_lock = \"//:pnpm-lock.yaml\",\n    verify_node_modules_ignored = \"//:.bazelignore\",\n)\nuse_repo(npm, \"npm\")\n\nnode = use_extension(\"@rules_nodejs//nodejs:extensions.bzl\", \"node\")\nuse_repo(node, \"nodejs_linux_amd64\")\n\nrules_ts_ext = use_extension(\"@aspect_rules_ts//ts:extensions.bzl\", \"ext\")\nuse_repo(rules_ts_ext, \"npm_typescript\")\n"
  },
  {
    "path": "tests/ts/bazel_repository_test_dir/README.md",
    "content": "This directory is not intended to be used independently of the flatbuffers\nrepository. Instead, this whole directory serves as a unit test for the\n`rules_js` integration in the flatbuffers repo.\n\nRun this test from the top-level of the flatbuffers repo.\n```console\n$ bazel test //tests/ts:bazel_repository_test\n```\n"
  },
  {
    "path": "tests/ts/bazel_repository_test_dir/import_test.js",
    "content": "import assert from 'assert'\nimport * as flatbuffers from 'flatbuffers'\n\nimport two_cjs from './two_generated.cjs'\n\nconst bazel_repository_test = two_cjs.bazel_repository_test;\n\nfunction main() {\n  // Validate building a table with a table field.\n  var fbb = new flatbuffers.Builder(1);\n\n  bazel_repository_test.One.startOne(fbb);\n  bazel_repository_test.One.addInformation(fbb, 42);\n  var one = bazel_repository_test.One.endOne(fbb);\n\n  bazel_repository_test.Two.startTwo(fbb);\n  bazel_repository_test.Two.addOne(fbb, one);\n  var two = bazel_repository_test.Two.endTwo(fbb);\n\n  fbb.finish(two);\n\n  // Call as a sanity check. Would be better to validate actual output here.\n  fbb.asUint8Array();\n\n  console.log('FlatBuffers bazel repository test: completed successfully');\n}\n\nmain();\n"
  },
  {
    "path": "tests/ts/bazel_repository_test_dir/independent_deps_test.js",
    "content": "// This test has nothing to do with flatbuffers. It only exists to validate\n// that other projects can use their own set of dependencies without having to\n// explicitly pull in flatbuffers's dependencies.\n//\n// We pick lodash here not for any particular reason. It could be any package,\n// really. I chose it because it's a relatively simple package.\n\nimport _ from 'lodash'\nimport assert from 'node:assert/strict'\n\nfunction main() {\n  console.log(_);\n  assert.deepStrictEqual(\n      _.defaults({'a': 1}, {'a': 3, 'b': 2}), {'a': 1, 'b': 2});\n  assert.deepStrictEqual(\n      _.partition([1, 2, 3, 4], n => n % 2), [[1, 3], [2, 4]]);\n}\n\nmain();\n"
  },
  {
    "path": "tests/ts/bazel_repository_test_dir/one.fbs",
    "content": "namespace bazel_repository_test;\n\ntable One {\n  information:int;\n}\n\nroot_type One;\n"
  },
  {
    "path": "tests/ts/bazel_repository_test_dir/package.json",
    "content": "{\n  \"name\": \"bazel_repository_test\",\n  \"type\": \"module\",\n  \"private\": true,\n  \"devDependencies\": {\n    \"lodash\": \"4.17.23\"\n  }\n}\n"
  },
  {
    "path": "tests/ts/bazel_repository_test_dir/two.fbs",
    "content": "include 'one.fbs';\n\nnamespace bazel_repository_test;\n\ntable Two {\n  one:One;\n}\n\nroot_type Two;\n"
  },
  {
    "path": "tests/ts/com/company/test/person.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nexport class Person {\n  bb: flatbuffers.ByteBuffer | null = null;\n  bb_pos = 0;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Person {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n\n  static getRootAsPerson(bb: flatbuffers.ByteBuffer, obj?: Person): Person {\n    return (obj || new Person()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  static getSizePrefixedRootAsPerson(\n    bb: flatbuffers.ByteBuffer,\n    obj?: Person,\n  ): Person {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new Person()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  name(): string | null;\n  name(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  name(optionalEncoding?: any): string | Uint8Array | null {\n    const offset = this.bb!.__offset(this.bb_pos, 4);\n    return offset\n      ? this.bb!.__string(this.bb_pos + offset, optionalEncoding)\n      : null;\n  }\n\n  age(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 6);\n    return offset ? this.bb!.readInt16(this.bb_pos + offset) : 0;\n  }\n\n  static startPerson(builder: flatbuffers.Builder) {\n    builder.startObject(2);\n  }\n\n  static addName(builder: flatbuffers.Builder, nameOffset: flatbuffers.Offset) {\n    builder.addFieldOffset(0, nameOffset, 0);\n  }\n\n  static addAge(builder: flatbuffers.Builder, age: number) {\n    builder.addFieldInt16(1, age, 0);\n  }\n\n  static endPerson(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const offset = builder.endObject();\n    return offset;\n  }\n\n  static finishPersonBuffer(\n    builder: flatbuffers.Builder,\n    offset: flatbuffers.Offset,\n  ) {\n    builder.finish(offset);\n  }\n\n  static finishSizePrefixedPersonBuffer(\n    builder: flatbuffers.Builder,\n    offset: flatbuffers.Offset,\n  ) {\n    builder.finish(offset, undefined, true);\n  }\n\n  static createPerson(\n    builder: flatbuffers.Builder,\n    nameOffset: flatbuffers.Offset,\n    age: number,\n  ): flatbuffers.Offset {\n    Person.startPerson(builder);\n    Person.addName(builder, nameOffset);\n    Person.addAge(builder, age);\n    return Person.endPerson(builder);\n  }\n}\n"
  },
  {
    "path": "tests/ts/com/company/test.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport {Person} from './test/person.js';\n"
  },
  {
    "path": "tests/ts/foobar/abc.d.ts",
    "content": "export declare enum Abc {\n  a = 0,\n}\n"
  },
  {
    "path": "tests/ts/foobar/abc.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nexport var Abc;\n(function(Abc) {\nAbc[Abc['a'] = 0] = 'a';\n})(Abc || (Abc = {}));\n"
  },
  {
    "path": "tests/ts/foobar/abc.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport enum Abc {\n  a = 0,\n}\n"
  },
  {
    "path": "tests/ts/foobar/class.d.ts",
    "content": "export declare enum class_ {\n  arguments_ = 0,\n}\n"
  },
  {
    "path": "tests/ts/foobar/class.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nexport var class_;\n(function(class_) {\nclass_[class_['arguments_'] = 0] = 'arguments_';\n})(class_ || (class_ = {}));\n"
  },
  {
    "path": "tests/ts/foobar/class.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport enum class_ {\n  arguments_ = 0,\n}\n"
  },
  {
    "path": "tests/ts/foobar/tab.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport {Abc} from '../foobar/abc.js';\nimport {class_} from '../foobar/class.js';\n\nexport class Tab implements flatbuffers.IUnpackableObject<TabT> {\n  bb: flatbuffers.ByteBuffer | null = null;\n  bb_pos = 0;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Tab {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n\n  static getRootAsTab(bb: flatbuffers.ByteBuffer, obj?: Tab): Tab {\n    return (obj || new Tab()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  static getSizePrefixedRootAsTab(bb: flatbuffers.ByteBuffer, obj?: Tab): Tab {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new Tab()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  abc(): Abc {\n    const offset = this.bb!.__offset(this.bb_pos, 4);\n    return offset ? this.bb!.readInt32(this.bb_pos + offset) : Abc.a;\n  }\n\n  mutate_abc(value: Abc): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 4);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n\n  arg(): class_ {\n    const offset = this.bb!.__offset(this.bb_pos, 6);\n    return offset\n      ? this.bb!.readInt32(this.bb_pos + offset)\n      : class_.arguments_;\n  }\n\n  mutate_arg(value: class_): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 6);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n\n  name(): string | null;\n  name(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  name(optionalEncoding?: any): string | Uint8Array | null {\n    const offset = this.bb!.__offset(this.bb_pos, 8);\n    return offset\n      ? this.bb!.__string(this.bb_pos + offset, optionalEncoding)\n      : null;\n  }\n\n  static getFullyQualifiedName(): string {\n    return 'foobar.Tab';\n  }\n\n  static startTab(builder: flatbuffers.Builder) {\n    builder.startObject(3);\n  }\n\n  static addAbc(builder: flatbuffers.Builder, abc: Abc) {\n    builder.addFieldInt32(0, abc, Abc.a);\n  }\n\n  static addArg(builder: flatbuffers.Builder, arg: class_) {\n    builder.addFieldInt32(1, arg, class_.arguments_);\n  }\n\n  static addName(builder: flatbuffers.Builder, nameOffset: flatbuffers.Offset) {\n    builder.addFieldOffset(2, nameOffset, 0);\n  }\n\n  static endTab(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const offset = builder.endObject();\n    return offset;\n  }\n\n  static createTab(\n    builder: flatbuffers.Builder,\n    abc: Abc,\n    arg: class_,\n    nameOffset: flatbuffers.Offset,\n  ): flatbuffers.Offset {\n    Tab.startTab(builder);\n    Tab.addAbc(builder, abc);\n    Tab.addArg(builder, arg);\n    Tab.addName(builder, nameOffset);\n    return Tab.endTab(builder);\n  }\n\n  unpack(): TabT {\n    return new TabT(this.abc(), this.arg(), this.name());\n  }\n\n  unpackTo(_o: TabT): void {\n    _o.abc = this.abc();\n    _o.arg = this.arg();\n    _o.name = this.name();\n  }\n}\n\nexport class TabT implements flatbuffers.IGeneratedObject {\n  constructor(\n    public abc: Abc = Abc.a,\n    public arg: class_ = class_.arguments_,\n    public name: string | Uint8Array | null = null,\n  ) {}\n\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const name = this.name !== null ? builder.createString(this.name!) : 0;\n\n    return Tab.createTab(builder, this.abc, this.arg, name);\n  }\n}\n"
  },
  {
    "path": "tests/ts/foobar.d.ts",
    "content": "export {Abc} from './foobar/abc.js';\n"
  },
  {
    "path": "tests/ts/foobar.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nexport {Abc} from './foobar/abc.js';\n"
  },
  {
    "path": "tests/ts/foobar.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport {Abc} from './foobar/abc.js';\n"
  },
  {
    "path": "tests/ts/longer-namespace/a/b/c/person.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nexport declare class Person {\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Person;\n  static getRootAsPerson(bb: flatbuffers.ByteBuffer, obj?: Person): Person;\n  static getSizePrefixedRootAsPerson(\n    bb: flatbuffers.ByteBuffer,\n    obj?: Person,\n  ): Person;\n  name(): string | null;\n  name(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  age(): number;\n  static startPerson(builder: flatbuffers.Builder): void;\n  static addName(\n    builder: flatbuffers.Builder,\n    nameOffset: flatbuffers.Offset,\n  ): void;\n  static addAge(builder: flatbuffers.Builder, age: number): void;\n  static endPerson(builder: flatbuffers.Builder): flatbuffers.Offset;\n  static finishPersonBuffer(\n    builder: flatbuffers.Builder,\n    offset: flatbuffers.Offset,\n  ): void;\n  static finishSizePrefixedPersonBuffer(\n    builder: flatbuffers.Builder,\n    offset: flatbuffers.Offset,\n  ): void;\n  static createPerson(\n    builder: flatbuffers.Builder,\n    nameOffset: flatbuffers.Offset,\n    age: number,\n  ): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/longer-namespace/a/b/c/person.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\nexport class Person {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsPerson(bb, obj) {\n    return (obj || new Person())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsPerson(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new Person())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  name(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) :\n                    null;\n  }\n  age() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.readInt16(this.bb_pos + offset) : 0;\n  }\n  static startPerson(builder) {\n    builder.startObject(2);\n  }\n  static addName(builder, nameOffset) {\n    builder.addFieldOffset(0, nameOffset, 0);\n  }\n  static addAge(builder, age) {\n    builder.addFieldInt16(1, age, 0);\n  }\n  static endPerson(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static finishPersonBuffer(builder, offset) {\n    builder.finish(offset);\n  }\n  static finishSizePrefixedPersonBuffer(builder, offset) {\n    builder.finish(offset, undefined, true);\n  }\n  static createPerson(builder, nameOffset, age) {\n    Person.startPerson(builder);\n    Person.addName(builder, nameOffset);\n    Person.addAge(builder, age);\n    return Person.endPerson(builder);\n  }\n}\n"
  },
  {
    "path": "tests/ts/longer-namespace/a/b/c/person.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nexport class Person {\n  bb: flatbuffers.ByteBuffer | null = null;\n  bb_pos = 0;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Person {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n\n  static getRootAsPerson(bb: flatbuffers.ByteBuffer, obj?: Person): Person {\n    return (obj || new Person()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  static getSizePrefixedRootAsPerson(\n    bb: flatbuffers.ByteBuffer,\n    obj?: Person,\n  ): Person {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new Person()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  name(): string | null;\n  name(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  name(optionalEncoding?: any): string | Uint8Array | null {\n    const offset = this.bb!.__offset(this.bb_pos, 4);\n    return offset\n      ? this.bb!.__string(this.bb_pos + offset, optionalEncoding)\n      : null;\n  }\n\n  age(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 6);\n    return offset ? this.bb!.readInt16(this.bb_pos + offset) : 0;\n  }\n\n  static startPerson(builder: flatbuffers.Builder) {\n    builder.startObject(2);\n  }\n\n  static addName(builder: flatbuffers.Builder, nameOffset: flatbuffers.Offset) {\n    builder.addFieldOffset(0, nameOffset, 0);\n  }\n\n  static addAge(builder: flatbuffers.Builder, age: number) {\n    builder.addFieldInt16(1, age, 0);\n  }\n\n  static endPerson(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const offset = builder.endObject();\n    return offset;\n  }\n\n  static finishPersonBuffer(\n    builder: flatbuffers.Builder,\n    offset: flatbuffers.Offset,\n  ) {\n    builder.finish(offset);\n  }\n\n  static finishSizePrefixedPersonBuffer(\n    builder: flatbuffers.Builder,\n    offset: flatbuffers.Offset,\n  ) {\n    builder.finish(offset, undefined, true);\n  }\n\n  static createPerson(\n    builder: flatbuffers.Builder,\n    nameOffset: flatbuffers.Offset,\n    age: number,\n  ): flatbuffers.Offset {\n    Person.startPerson(builder);\n    Person.addName(builder, nameOffset);\n    Person.addAge(builder, age);\n    return Person.endPerson(builder);\n  }\n}\n"
  },
  {
    "path": "tests/ts/longer-namespace/a/b/c.d.ts",
    "content": "export {Person} from './c/person.js';\n"
  },
  {
    "path": "tests/ts/longer-namespace/a/b/c.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nexport {Person} from './c/person.js';\n"
  },
  {
    "path": "tests/ts/longer-namespace/a/b/c.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport {Person} from './c/person.js';\n"
  },
  {
    "path": "tests/ts/monster_test.d.ts",
    "content": "export * as MyGame from './my-game.js';\nexport {TableA, TableAT} from './table-a.js';\n"
  },
  {
    "path": "tests/ts/monster_test.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nexport * as MyGame from './my-game.js';\nexport {TableA, TableAT} from './table-a.js';\n"
  },
  {
    "path": "tests/ts/monster_test.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport { TableA, TableAT } from './table-a.js';\nexport * as MyGame from './my-game.js';\n"
  },
  {
    "path": "tests/ts/monster_test_generated.cjs",
    "content": "\"use strict\";\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n  for (var name in all)\n    __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n  if (from && typeof from === \"object\" || typeof from === \"function\") {\n    for (let key of __getOwnPropNames(from))\n      if (!__hasOwnProp.call(to, key) && key !== except)\n        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n  }\n  return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n  // If the importer is in node compatibility mode or this is not an ESM\n  // file that has been converted to a CommonJS file using a Babel-\n  // compatible transform (i.e. \"__esModule\" has not been set), then set\n  // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n  isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n  mod\n));\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// monster_test.ts\nvar monster_test_exports = {};\n__export(monster_test_exports, {\n  MyGame: () => my_game_exports,\n  TableA: () => TableA,\n  TableAT: () => TableAT\n});\nmodule.exports = __toCommonJS(monster_test_exports);\n\n// table-a.js\nvar flatbuffers2 = __toESM(require(\"flatbuffers\"), 1);\n\n// my-game/other-name-space/table-b.js\nvar flatbuffers = __toESM(require(\"flatbuffers\"), 1);\nvar TableB = class _TableB {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsTableB(bb, obj) {\n    return (obj || new _TableB()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsTableB(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new _TableB()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  a(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? (obj || new TableA()).__init(this.bb.__indirect(this.bb_pos + offset), this.bb) : null;\n  }\n  static getFullyQualifiedName() {\n    return \"MyGame.OtherNameSpace.TableB\";\n  }\n  static startTableB(builder) {\n    builder.startObject(1);\n  }\n  static addA(builder, aOffset) {\n    builder.addFieldOffset(0, aOffset, 0);\n  }\n  static endTableB(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static createTableB(builder, aOffset) {\n    _TableB.startTableB(builder);\n    _TableB.addA(builder, aOffset);\n    return _TableB.endTableB(builder);\n  }\n  serialize() {\n    return this.bb.bytes();\n  }\n  static deserialize(buffer) {\n    return _TableB.getRootAsTableB(new flatbuffers.ByteBuffer(buffer));\n  }\n  unpack() {\n    return new TableBT(this.a() !== null ? this.a().unpack() : null);\n  }\n  unpackTo(_o) {\n    _o.a = this.a() !== null ? this.a().unpack() : null;\n  }\n};\nvar TableBT = class {\n  constructor(a = null) {\n    this.a = a;\n  }\n  pack(builder) {\n    const a = this.a !== null ? this.a.pack(builder) : 0;\n    return TableB.createTableB(builder, a);\n  }\n};\n\n// table-a.js\nvar TableA = class _TableA {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsTableA(bb, obj) {\n    return (obj || new _TableA()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsTableA(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers2.SIZE_PREFIX_LENGTH);\n    return (obj || new _TableA()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  b(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? (obj || new TableB()).__init(this.bb.__indirect(this.bb_pos + offset), this.bb) : null;\n  }\n  static getFullyQualifiedName() {\n    return \"TableA\";\n  }\n  static startTableA(builder) {\n    builder.startObject(1);\n  }\n  static addB(builder, bOffset) {\n    builder.addFieldOffset(0, bOffset, 0);\n  }\n  static endTableA(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static createTableA(builder, bOffset) {\n    _TableA.startTableA(builder);\n    _TableA.addB(builder, bOffset);\n    return _TableA.endTableA(builder);\n  }\n  serialize() {\n    return this.bb.bytes();\n  }\n  static deserialize(buffer) {\n    return _TableA.getRootAsTableA(new flatbuffers2.ByteBuffer(buffer));\n  }\n  unpack() {\n    return new TableAT(this.b() !== null ? this.b().unpack() : null);\n  }\n  unpackTo(_o) {\n    _o.b = this.b() !== null ? this.b().unpack() : null;\n  }\n};\nvar TableAT = class {\n  constructor(b = null) {\n    this.b = b;\n  }\n  pack(builder) {\n    const b = this.b !== null ? this.b.pack(builder) : 0;\n    return TableA.createTableA(builder, b);\n  }\n};\n\n// my-game.js\nvar my_game_exports = {};\n__export(my_game_exports, {\n  Example: () => example_exports,\n  Example2: () => example2_exports,\n  InParentNamespace: () => InParentNamespace,\n  InParentNamespaceT: () => InParentNamespaceT,\n  OtherNameSpace: () => other_name_space_exports\n});\n\n// my-game/in-parent-namespace.js\nvar flatbuffers3 = __toESM(require(\"flatbuffers\"), 1);\nvar InParentNamespace = class _InParentNamespace {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsInParentNamespace(bb, obj) {\n    return (obj || new _InParentNamespace()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsInParentNamespace(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers3.SIZE_PREFIX_LENGTH);\n    return (obj || new _InParentNamespace()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getFullyQualifiedName() {\n    return \"MyGame.InParentNamespace\";\n  }\n  static startInParentNamespace(builder) {\n    builder.startObject(0);\n  }\n  static endInParentNamespace(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static createInParentNamespace(builder) {\n    _InParentNamespace.startInParentNamespace(builder);\n    return _InParentNamespace.endInParentNamespace(builder);\n  }\n  serialize() {\n    return this.bb.bytes();\n  }\n  static deserialize(buffer) {\n    return _InParentNamespace.getRootAsInParentNamespace(new flatbuffers3.ByteBuffer(buffer));\n  }\n  unpack() {\n    return new InParentNamespaceT();\n  }\n  unpackTo(_o) {\n  }\n};\nvar InParentNamespaceT = class {\n  constructor() {\n  }\n  pack(builder) {\n    return InParentNamespace.createInParentNamespace(builder);\n  }\n};\n\n// my-game/example.js\nvar example_exports = {};\n__export(example_exports, {\n  Ability: () => Ability,\n  AbilityT: () => AbilityT,\n  Any: () => Any,\n  AnyAmbiguousAliases: () => AnyAmbiguousAliases,\n  AnyUniqueAliases: () => AnyUniqueAliases,\n  Color: () => Color,\n  LongEnum: () => LongEnum,\n  Monster: () => Monster2,\n  MonsterT: () => MonsterT2,\n  Race: () => Race,\n  Referrable: () => Referrable,\n  ReferrableT: () => ReferrableT,\n  Stat: () => Stat,\n  StatT: () => StatT,\n  StructOfStructs: () => StructOfStructs,\n  StructOfStructsOfStructs: () => StructOfStructsOfStructs,\n  StructOfStructsOfStructsT: () => StructOfStructsOfStructsT,\n  StructOfStructsT: () => StructOfStructsT,\n  Test: () => Test,\n  TestSimpleTableWithEnum: () => TestSimpleTableWithEnum,\n  TestSimpleTableWithEnumT: () => TestSimpleTableWithEnumT,\n  TestT: () => TestT,\n  TypeAliases: () => TypeAliases,\n  TypeAliasesT: () => TypeAliasesT,\n  Vec3: () => Vec3,\n  Vec3T: () => Vec3T\n});\n\n// my-game/example/ability.js\nvar Ability = class {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  id() {\n    return this.bb.readUint32(this.bb_pos);\n  }\n  mutate_id(value) {\n    this.bb.writeUint32(this.bb_pos + 0, value);\n    return true;\n  }\n  distance() {\n    return this.bb.readUint32(this.bb_pos + 4);\n  }\n  mutate_distance(value) {\n    this.bb.writeUint32(this.bb_pos + 4, value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return \"MyGame.Example.Ability\";\n  }\n  static sizeOf() {\n    return 8;\n  }\n  static createAbility(builder, id, distance) {\n    builder.prep(4, 8);\n    builder.writeInt32(distance);\n    builder.writeInt32(id);\n    return builder.offset();\n  }\n  unpack() {\n    return new AbilityT(this.id(), this.distance());\n  }\n  unpackTo(_o) {\n    _o.id = this.id();\n    _o.distance = this.distance();\n  }\n};\nvar AbilityT = class {\n  constructor(id = 0, distance = 0) {\n    this.id = id;\n    this.distance = distance;\n  }\n  pack(builder) {\n    return Ability.createAbility(builder, this.id, this.distance);\n  }\n};\n\n// my-game/example2/monster.js\nvar flatbuffers4 = __toESM(require(\"flatbuffers\"), 1);\nvar Monster = class _Monster {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsMonster(bb, obj) {\n    return (obj || new _Monster()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsMonster(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers4.SIZE_PREFIX_LENGTH);\n    return (obj || new _Monster()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getFullyQualifiedName() {\n    return \"MyGame.Example2.Monster\";\n  }\n  static startMonster(builder) {\n    builder.startObject(0);\n  }\n  static endMonster(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static createMonster(builder) {\n    _Monster.startMonster(builder);\n    return _Monster.endMonster(builder);\n  }\n  serialize() {\n    return this.bb.bytes();\n  }\n  static deserialize(buffer) {\n    return _Monster.getRootAsMonster(new flatbuffers4.ByteBuffer(buffer));\n  }\n  unpack() {\n    return new MonsterT();\n  }\n  unpackTo(_o) {\n  }\n};\nvar MonsterT = class {\n  constructor() {\n  }\n  pack(builder) {\n    return Monster.createMonster(builder);\n  }\n};\n\n// my-game/example/monster.js\nvar flatbuffers8 = __toESM(require(\"flatbuffers\"), 1);\n\n// my-game/example/any-ambiguous-aliases.js\nvar AnyAmbiguousAliases;\n(function(AnyAmbiguousAliases2) {\n  AnyAmbiguousAliases2[AnyAmbiguousAliases2[\"NONE\"] = 0] = \"NONE\";\n  AnyAmbiguousAliases2[AnyAmbiguousAliases2[\"M1\"] = 1] = \"M1\";\n  AnyAmbiguousAliases2[AnyAmbiguousAliases2[\"M2\"] = 2] = \"M2\";\n  AnyAmbiguousAliases2[AnyAmbiguousAliases2[\"M3\"] = 3] = \"M3\";\n})(AnyAmbiguousAliases || (AnyAmbiguousAliases = {}));\nfunction unionToAnyAmbiguousAliases(type, accessor) {\n  switch (AnyAmbiguousAliases[type]) {\n    case \"NONE\":\n      return null;\n    case \"M1\":\n      return accessor(new Monster2());\n    case \"M2\":\n      return accessor(new Monster2());\n    case \"M3\":\n      return accessor(new Monster2());\n    default:\n      return null;\n  }\n}\n\n// my-game/example/test-simple-table-with-enum.js\nvar flatbuffers5 = __toESM(require(\"flatbuffers\"), 1);\n\n// my-game/example/color.js\nvar Color;\n(function(Color2) {\n  Color2[Color2[\"Red\"] = 1] = \"Red\";\n  Color2[Color2[\"Green\"] = 2] = \"Green\";\n  Color2[Color2[\"Blue\"] = 8] = \"Blue\";\n})(Color || (Color = {}));\n\n// my-game/example/test-simple-table-with-enum.js\nvar TestSimpleTableWithEnum = class _TestSimpleTableWithEnum {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsTestSimpleTableWithEnum(bb, obj) {\n    return (obj || new _TestSimpleTableWithEnum()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsTestSimpleTableWithEnum(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers5.SIZE_PREFIX_LENGTH);\n    return (obj || new _TestSimpleTableWithEnum()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  color() {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.readUint8(this.bb_pos + offset) : Color.Green;\n  }\n  mutate_color(value) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint8(this.bb_pos + offset, value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return \"MyGame.Example.TestSimpleTableWithEnum\";\n  }\n  static startTestSimpleTableWithEnum(builder) {\n    builder.startObject(1);\n  }\n  static addColor(builder, color) {\n    builder.addFieldInt8(0, color, Color.Green);\n  }\n  static endTestSimpleTableWithEnum(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static createTestSimpleTableWithEnum(builder, color) {\n    _TestSimpleTableWithEnum.startTestSimpleTableWithEnum(builder);\n    _TestSimpleTableWithEnum.addColor(builder, color);\n    return _TestSimpleTableWithEnum.endTestSimpleTableWithEnum(builder);\n  }\n  serialize() {\n    return this.bb.bytes();\n  }\n  static deserialize(buffer) {\n    return _TestSimpleTableWithEnum.getRootAsTestSimpleTableWithEnum(new flatbuffers5.ByteBuffer(buffer));\n  }\n  unpack() {\n    return new TestSimpleTableWithEnumT(this.color());\n  }\n  unpackTo(_o) {\n    _o.color = this.color();\n  }\n};\nvar TestSimpleTableWithEnumT = class {\n  constructor(color = Color.Green) {\n    this.color = color;\n  }\n  pack(builder) {\n    return TestSimpleTableWithEnum.createTestSimpleTableWithEnum(builder, this.color);\n  }\n};\n\n// my-game/example/any-unique-aliases.js\nvar AnyUniqueAliases;\n(function(AnyUniqueAliases2) {\n  AnyUniqueAliases2[AnyUniqueAliases2[\"NONE\"] = 0] = \"NONE\";\n  AnyUniqueAliases2[AnyUniqueAliases2[\"M\"] = 1] = \"M\";\n  AnyUniqueAliases2[AnyUniqueAliases2[\"TS\"] = 2] = \"TS\";\n  AnyUniqueAliases2[AnyUniqueAliases2[\"M2\"] = 3] = \"M2\";\n})(AnyUniqueAliases || (AnyUniqueAliases = {}));\nfunction unionToAnyUniqueAliases(type, accessor) {\n  switch (AnyUniqueAliases[type]) {\n    case \"NONE\":\n      return null;\n    case \"M\":\n      return accessor(new Monster2());\n    case \"TS\":\n      return accessor(new TestSimpleTableWithEnum());\n    case \"M2\":\n      return accessor(new Monster());\n    default:\n      return null;\n  }\n}\n\n// my-game/example/race.js\nvar Race;\n(function(Race2) {\n  Race2[Race2[\"None\"] = -1] = \"None\";\n  Race2[Race2[\"Human\"] = 0] = \"Human\";\n  Race2[Race2[\"Dwarf\"] = 1] = \"Dwarf\";\n  Race2[Race2[\"Elf\"] = 2] = \"Elf\";\n})(Race || (Race = {}));\n\n// my-game/example/referrable.js\nvar flatbuffers6 = __toESM(require(\"flatbuffers\"), 1);\nvar Referrable = class _Referrable {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsReferrable(bb, obj) {\n    return (obj || new _Referrable()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsReferrable(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers6.SIZE_PREFIX_LENGTH);\n    return (obj || new _Referrable()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  id() {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.readUint64(this.bb_pos + offset) : BigInt(\"0\");\n  }\n  mutate_id(value) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint64(this.bb_pos + offset, value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return \"MyGame.Example.Referrable\";\n  }\n  static startReferrable(builder) {\n    builder.startObject(1);\n  }\n  static addId(builder, id) {\n    builder.addFieldInt64(0, id, BigInt(\"0\"));\n  }\n  static endReferrable(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static createReferrable(builder, id) {\n    _Referrable.startReferrable(builder);\n    _Referrable.addId(builder, id);\n    return _Referrable.endReferrable(builder);\n  }\n  serialize() {\n    return this.bb.bytes();\n  }\n  static deserialize(buffer) {\n    return _Referrable.getRootAsReferrable(new flatbuffers6.ByteBuffer(buffer));\n  }\n  unpack() {\n    return new ReferrableT(this.id());\n  }\n  unpackTo(_o) {\n    _o.id = this.id();\n  }\n};\nvar ReferrableT = class {\n  constructor(id = BigInt(\"0\")) {\n    this.id = id;\n  }\n  pack(builder) {\n    return Referrable.createReferrable(builder, this.id);\n  }\n};\n\n// my-game/example/stat.js\nvar flatbuffers7 = __toESM(require(\"flatbuffers\"), 1);\nvar Stat = class _Stat {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsStat(bb, obj) {\n    return (obj || new _Stat()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsStat(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers7.SIZE_PREFIX_LENGTH);\n    return (obj || new _Stat()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  id(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  val() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.readInt64(this.bb_pos + offset) : BigInt(\"0\");\n  }\n  mutate_val(value) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt64(this.bb_pos + offset, value);\n    return true;\n  }\n  count() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? this.bb.readUint16(this.bb_pos + offset) : 0;\n  }\n  mutate_count(value) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint16(this.bb_pos + offset, value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return \"MyGame.Example.Stat\";\n  }\n  static startStat(builder) {\n    builder.startObject(3);\n  }\n  static addId(builder, idOffset) {\n    builder.addFieldOffset(0, idOffset, 0);\n  }\n  static addVal(builder, val) {\n    builder.addFieldInt64(1, val, BigInt(\"0\"));\n  }\n  static addCount(builder, count) {\n    builder.addFieldInt16(2, count, 0);\n  }\n  static endStat(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static createStat(builder, idOffset, val, count) {\n    _Stat.startStat(builder);\n    _Stat.addId(builder, idOffset);\n    _Stat.addVal(builder, val);\n    _Stat.addCount(builder, count);\n    return _Stat.endStat(builder);\n  }\n  serialize() {\n    return this.bb.bytes();\n  }\n  static deserialize(buffer) {\n    return _Stat.getRootAsStat(new flatbuffers7.ByteBuffer(buffer));\n  }\n  unpack() {\n    return new StatT(this.id(), this.val(), this.count());\n  }\n  unpackTo(_o) {\n    _o.id = this.id();\n    _o.val = this.val();\n    _o.count = this.count();\n  }\n};\nvar StatT = class {\n  constructor(id = null, val = BigInt(\"0\"), count = 0) {\n    this.id = id;\n    this.val = val;\n    this.count = count;\n  }\n  pack(builder) {\n    const id = this.id !== null ? builder.createString(this.id) : 0;\n    return Stat.createStat(builder, id, this.val, this.count);\n  }\n};\n\n// my-game/example/test.js\nvar Test = class {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  a() {\n    return this.bb.readInt16(this.bb_pos);\n  }\n  mutate_a(value) {\n    this.bb.writeInt16(this.bb_pos + 0, value);\n    return true;\n  }\n  b() {\n    return this.bb.readInt8(this.bb_pos + 2);\n  }\n  mutate_b(value) {\n    this.bb.writeInt8(this.bb_pos + 2, value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return \"MyGame.Example.Test\";\n  }\n  static sizeOf() {\n    return 4;\n  }\n  static createTest(builder, a, b) {\n    builder.prep(2, 4);\n    builder.pad(1);\n    builder.writeInt8(b);\n    builder.writeInt16(a);\n    return builder.offset();\n  }\n  unpack() {\n    return new TestT(this.a(), this.b());\n  }\n  unpackTo(_o) {\n    _o.a = this.a();\n    _o.b = this.b();\n  }\n};\nvar TestT = class {\n  constructor(a = 0, b = 0) {\n    this.a = a;\n    this.b = b;\n  }\n  pack(builder) {\n    return Test.createTest(builder, this.a, this.b);\n  }\n};\n\n// my-game/example/vec3.js\nvar Vec3 = class {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  x() {\n    return this.bb.readFloat32(this.bb_pos);\n  }\n  mutate_x(value) {\n    this.bb.writeFloat32(this.bb_pos + 0, value);\n    return true;\n  }\n  y() {\n    return this.bb.readFloat32(this.bb_pos + 4);\n  }\n  mutate_y(value) {\n    this.bb.writeFloat32(this.bb_pos + 4, value);\n    return true;\n  }\n  z() {\n    return this.bb.readFloat32(this.bb_pos + 8);\n  }\n  mutate_z(value) {\n    this.bb.writeFloat32(this.bb_pos + 8, value);\n    return true;\n  }\n  test1() {\n    return this.bb.readFloat64(this.bb_pos + 16);\n  }\n  mutate_test1(value) {\n    this.bb.writeFloat64(this.bb_pos + 16, value);\n    return true;\n  }\n  test2() {\n    return this.bb.readUint8(this.bb_pos + 24);\n  }\n  mutate_test2(value) {\n    this.bb.writeUint8(this.bb_pos + 24, value);\n    return true;\n  }\n  test3(obj) {\n    return (obj || new Test()).__init(this.bb_pos + 26, this.bb);\n  }\n  static getFullyQualifiedName() {\n    return \"MyGame.Example.Vec3\";\n  }\n  static sizeOf() {\n    return 32;\n  }\n  static createVec3(builder, x, y, z, test1, test2, test3_a, test3_b) {\n    builder.prep(8, 32);\n    builder.pad(2);\n    builder.prep(2, 4);\n    builder.pad(1);\n    builder.writeInt8(test3_b);\n    builder.writeInt16(test3_a);\n    builder.pad(1);\n    builder.writeInt8(test2);\n    builder.writeFloat64(test1);\n    builder.pad(4);\n    builder.writeFloat32(z);\n    builder.writeFloat32(y);\n    builder.writeFloat32(x);\n    return builder.offset();\n  }\n  unpack() {\n    return new Vec3T(this.x(), this.y(), this.z(), this.test1(), this.test2(), this.test3() !== null ? this.test3().unpack() : null);\n  }\n  unpackTo(_o) {\n    _o.x = this.x();\n    _o.y = this.y();\n    _o.z = this.z();\n    _o.test1 = this.test1();\n    _o.test2 = this.test2();\n    _o.test3 = this.test3() !== null ? this.test3().unpack() : null;\n  }\n};\nvar Vec3T = class {\n  constructor(x = 0, y = 0, z = 0, test1 = 0, test2 = Color.Red, test3 = null) {\n    this.x = x;\n    this.y = y;\n    this.z = z;\n    this.test1 = test1;\n    this.test2 = test2;\n    this.test3 = test3;\n  }\n  pack(builder) {\n    return Vec3.createVec3(builder, this.x, this.y, this.z, this.test1, this.test2, this.test3?.a ?? 0, this.test3?.b ?? 0);\n  }\n};\n\n// my-game/example/monster.js\nvar Monster2 = class _Monster {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsMonster(bb, obj) {\n    return (obj || new _Monster()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsMonster(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers8.SIZE_PREFIX_LENGTH);\n    return (obj || new _Monster()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static bufferHasIdentifier(bb) {\n    return bb.__has_identifier(\"MONS\");\n  }\n  pos(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? (obj || new Vec3()).__init(this.bb_pos + offset, this.bb) : null;\n  }\n  mana() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.readInt16(this.bb_pos + offset) : 150;\n  }\n  mutate_mana(value) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt16(this.bb_pos + offset, value);\n    return true;\n  }\n  hp() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? this.bb.readInt16(this.bb_pos + offset) : 100;\n  }\n  mutate_hp(value) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt16(this.bb_pos + offset, value);\n    return true;\n  }\n  name(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  inventory(index) {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.readUint8(this.bb.__vector(this.bb_pos + offset) + index) : 0;\n  }\n  inventoryLength() {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  inventoryArray() {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? new Uint8Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null;\n  }\n  color() {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    return offset ? this.bb.readUint8(this.bb_pos + offset) : Color.Blue;\n  }\n  mutate_color(value) {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint8(this.bb_pos + offset, value);\n    return true;\n  }\n  testType() {\n    const offset = this.bb.__offset(this.bb_pos, 18);\n    return offset ? this.bb.readUint8(this.bb_pos + offset) : Any.NONE;\n  }\n  test(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 20);\n    return offset ? this.bb.__union(obj, this.bb_pos + offset) : null;\n  }\n  test4(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 22);\n    return offset ? (obj || new Test()).__init(this.bb.__vector(this.bb_pos + offset) + index * 4, this.bb) : null;\n  }\n  test4Length() {\n    const offset = this.bb.__offset(this.bb_pos, 22);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  testarrayofstring(index, optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 24);\n    return offset ? this.bb.__string(this.bb.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n  }\n  testarrayofstringLength() {\n    const offset = this.bb.__offset(this.bb_pos, 24);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  /**\n   * an example documentation comment: this will end up in the generated code\n   * multiline too\n   */\n  testarrayoftables(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 26);\n    return offset ? (obj || new _Monster()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  testarrayoftablesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 26);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  enemy(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 28);\n    return offset ? (obj || new _Monster()).__init(this.bb.__indirect(this.bb_pos + offset), this.bb) : null;\n  }\n  testnestedflatbuffer(index) {\n    const offset = this.bb.__offset(this.bb_pos, 30);\n    return offset ? this.bb.readUint8(this.bb.__vector(this.bb_pos + offset) + index) : 0;\n  }\n  testnestedflatbufferLength() {\n    const offset = this.bb.__offset(this.bb_pos, 30);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  testnestedflatbufferArray() {\n    const offset = this.bb.__offset(this.bb_pos, 30);\n    return offset ? new Uint8Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null;\n  }\n  testempty(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 32);\n    return offset ? (obj || new Stat()).__init(this.bb.__indirect(this.bb_pos + offset), this.bb) : null;\n  }\n  testbool() {\n    const offset = this.bb.__offset(this.bb_pos, 34);\n    return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false;\n  }\n  mutate_testbool(value) {\n    const offset = this.bb.__offset(this.bb_pos, 34);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n  testhashs32Fnv1() {\n    const offset = this.bb.__offset(this.bb_pos, 36);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n  }\n  mutate_testhashs32_fnv1(value) {\n    const offset = this.bb.__offset(this.bb_pos, 36);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  testhashu32Fnv1() {\n    const offset = this.bb.__offset(this.bb_pos, 38);\n    return offset ? this.bb.readUint32(this.bb_pos + offset) : 0;\n  }\n  mutate_testhashu32_fnv1(value) {\n    const offset = this.bb.__offset(this.bb_pos, 38);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint32(this.bb_pos + offset, value);\n    return true;\n  }\n  testhashs64Fnv1() {\n    const offset = this.bb.__offset(this.bb_pos, 40);\n    return offset ? this.bb.readInt64(this.bb_pos + offset) : BigInt(\"0\");\n  }\n  mutate_testhashs64_fnv1(value) {\n    const offset = this.bb.__offset(this.bb_pos, 40);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt64(this.bb_pos + offset, value);\n    return true;\n  }\n  testhashu64Fnv1() {\n    const offset = this.bb.__offset(this.bb_pos, 42);\n    return offset ? this.bb.readUint64(this.bb_pos + offset) : BigInt(\"0\");\n  }\n  mutate_testhashu64_fnv1(value) {\n    const offset = this.bb.__offset(this.bb_pos, 42);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint64(this.bb_pos + offset, value);\n    return true;\n  }\n  testhashs32Fnv1a() {\n    const offset = this.bb.__offset(this.bb_pos, 44);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n  }\n  mutate_testhashs32_fnv1a(value) {\n    const offset = this.bb.__offset(this.bb_pos, 44);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  testhashu32Fnv1a() {\n    const offset = this.bb.__offset(this.bb_pos, 46);\n    return offset ? this.bb.readUint32(this.bb_pos + offset) : 0;\n  }\n  mutate_testhashu32_fnv1a(value) {\n    const offset = this.bb.__offset(this.bb_pos, 46);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint32(this.bb_pos + offset, value);\n    return true;\n  }\n  testhashs64Fnv1a() {\n    const offset = this.bb.__offset(this.bb_pos, 48);\n    return offset ? this.bb.readInt64(this.bb_pos + offset) : BigInt(\"0\");\n  }\n  mutate_testhashs64_fnv1a(value) {\n    const offset = this.bb.__offset(this.bb_pos, 48);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt64(this.bb_pos + offset, value);\n    return true;\n  }\n  testhashu64Fnv1a() {\n    const offset = this.bb.__offset(this.bb_pos, 50);\n    return offset ? this.bb.readUint64(this.bb_pos + offset) : BigInt(\"0\");\n  }\n  mutate_testhashu64_fnv1a(value) {\n    const offset = this.bb.__offset(this.bb_pos, 50);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint64(this.bb_pos + offset, value);\n    return true;\n  }\n  testarrayofbools(index) {\n    const offset = this.bb.__offset(this.bb_pos, 52);\n    return offset ? !!this.bb.readInt8(this.bb.__vector(this.bb_pos + offset) + index) : false;\n  }\n  testarrayofboolsLength() {\n    const offset = this.bb.__offset(this.bb_pos, 52);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  testarrayofboolsArray() {\n    const offset = this.bb.__offset(this.bb_pos, 52);\n    return offset ? new Int8Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null;\n  }\n  testf() {\n    const offset = this.bb.__offset(this.bb_pos, 54);\n    return offset ? this.bb.readFloat32(this.bb_pos + offset) : 3.14159;\n  }\n  mutate_testf(value) {\n    const offset = this.bb.__offset(this.bb_pos, 54);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeFloat32(this.bb_pos + offset, value);\n    return true;\n  }\n  testf2() {\n    const offset = this.bb.__offset(this.bb_pos, 56);\n    return offset ? this.bb.readFloat32(this.bb_pos + offset) : 3;\n  }\n  mutate_testf2(value) {\n    const offset = this.bb.__offset(this.bb_pos, 56);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeFloat32(this.bb_pos + offset, value);\n    return true;\n  }\n  testf3() {\n    const offset = this.bb.__offset(this.bb_pos, 58);\n    return offset ? this.bb.readFloat32(this.bb_pos + offset) : 0;\n  }\n  mutate_testf3(value) {\n    const offset = this.bb.__offset(this.bb_pos, 58);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeFloat32(this.bb_pos + offset, value);\n    return true;\n  }\n  testarrayofstring2(index, optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 60);\n    return offset ? this.bb.__string(this.bb.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n  }\n  testarrayofstring2Length() {\n    const offset = this.bb.__offset(this.bb_pos, 60);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  testarrayofsortedstruct(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 62);\n    return offset ? (obj || new Ability()).__init(this.bb.__vector(this.bb_pos + offset) + index * 8, this.bb) : null;\n  }\n  testarrayofsortedstructLength() {\n    const offset = this.bb.__offset(this.bb_pos, 62);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  flex(index) {\n    const offset = this.bb.__offset(this.bb_pos, 64);\n    return offset ? this.bb.readUint8(this.bb.__vector(this.bb_pos + offset) + index) : 0;\n  }\n  flexLength() {\n    const offset = this.bb.__offset(this.bb_pos, 64);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  flexArray() {\n    const offset = this.bb.__offset(this.bb_pos, 64);\n    return offset ? new Uint8Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null;\n  }\n  test5(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 66);\n    return offset ? (obj || new Test()).__init(this.bb.__vector(this.bb_pos + offset) + index * 4, this.bb) : null;\n  }\n  test5Length() {\n    const offset = this.bb.__offset(this.bb_pos, 66);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  vectorOfLongs(index) {\n    const offset = this.bb.__offset(this.bb_pos, 68);\n    return offset ? this.bb.readInt64(this.bb.__vector(this.bb_pos + offset) + index * 8) : BigInt(0);\n  }\n  vectorOfLongsLength() {\n    const offset = this.bb.__offset(this.bb_pos, 68);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  vectorOfDoubles(index) {\n    const offset = this.bb.__offset(this.bb_pos, 70);\n    return offset ? this.bb.readFloat64(this.bb.__vector(this.bb_pos + offset) + index * 8) : 0;\n  }\n  vectorOfDoublesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 70);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  vectorOfDoublesArray() {\n    const offset = this.bb.__offset(this.bb_pos, 70);\n    return offset ? new Float64Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null;\n  }\n  parentNamespaceTest(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 72);\n    return offset ? (obj || new InParentNamespace()).__init(this.bb.__indirect(this.bb_pos + offset), this.bb) : null;\n  }\n  vectorOfReferrables(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 74);\n    return offset ? (obj || new Referrable()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  vectorOfReferrablesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 74);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  singleWeakReference() {\n    const offset = this.bb.__offset(this.bb_pos, 76);\n    return offset ? this.bb.readUint64(this.bb_pos + offset) : BigInt(\"0\");\n  }\n  mutate_single_weak_reference(value) {\n    const offset = this.bb.__offset(this.bb_pos, 76);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint64(this.bb_pos + offset, value);\n    return true;\n  }\n  vectorOfWeakReferences(index) {\n    const offset = this.bb.__offset(this.bb_pos, 78);\n    return offset ? this.bb.readUint64(this.bb.__vector(this.bb_pos + offset) + index * 8) : BigInt(0);\n  }\n  vectorOfWeakReferencesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 78);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  vectorOfStrongReferrables(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 80);\n    return offset ? (obj || new Referrable()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  vectorOfStrongReferrablesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 80);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  coOwningReference() {\n    const offset = this.bb.__offset(this.bb_pos, 82);\n    return offset ? this.bb.readUint64(this.bb_pos + offset) : BigInt(\"0\");\n  }\n  mutate_co_owning_reference(value) {\n    const offset = this.bb.__offset(this.bb_pos, 82);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint64(this.bb_pos + offset, value);\n    return true;\n  }\n  vectorOfCoOwningReferences(index) {\n    const offset = this.bb.__offset(this.bb_pos, 84);\n    return offset ? this.bb.readUint64(this.bb.__vector(this.bb_pos + offset) + index * 8) : BigInt(0);\n  }\n  vectorOfCoOwningReferencesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 84);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  nonOwningReference() {\n    const offset = this.bb.__offset(this.bb_pos, 86);\n    return offset ? this.bb.readUint64(this.bb_pos + offset) : BigInt(\"0\");\n  }\n  mutate_non_owning_reference(value) {\n    const offset = this.bb.__offset(this.bb_pos, 86);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint64(this.bb_pos + offset, value);\n    return true;\n  }\n  vectorOfNonOwningReferences(index) {\n    const offset = this.bb.__offset(this.bb_pos, 88);\n    return offset ? this.bb.readUint64(this.bb.__vector(this.bb_pos + offset) + index * 8) : BigInt(0);\n  }\n  vectorOfNonOwningReferencesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 88);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  anyUniqueType() {\n    const offset = this.bb.__offset(this.bb_pos, 90);\n    return offset ? this.bb.readUint8(this.bb_pos + offset) : AnyUniqueAliases.NONE;\n  }\n  anyUnique(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 92);\n    return offset ? this.bb.__union(obj, this.bb_pos + offset) : null;\n  }\n  anyAmbiguousType() {\n    const offset = this.bb.__offset(this.bb_pos, 94);\n    return offset ? this.bb.readUint8(this.bb_pos + offset) : AnyAmbiguousAliases.NONE;\n  }\n  anyAmbiguous(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 96);\n    return offset ? this.bb.__union(obj, this.bb_pos + offset) : null;\n  }\n  vectorOfEnums(index) {\n    const offset = this.bb.__offset(this.bb_pos, 98);\n    return offset ? this.bb.readUint8(this.bb.__vector(this.bb_pos + offset) + index) : 0;\n  }\n  vectorOfEnumsLength() {\n    const offset = this.bb.__offset(this.bb_pos, 98);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  vectorOfEnumsArray() {\n    const offset = this.bb.__offset(this.bb_pos, 98);\n    return offset ? new Uint8Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null;\n  }\n  signedEnum() {\n    const offset = this.bb.__offset(this.bb_pos, 100);\n    return offset ? this.bb.readInt8(this.bb_pos + offset) : Race.None;\n  }\n  mutate_signed_enum(value) {\n    const offset = this.bb.__offset(this.bb_pos, 100);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, value);\n    return true;\n  }\n  testrequirednestedflatbuffer(index) {\n    const offset = this.bb.__offset(this.bb_pos, 102);\n    return offset ? this.bb.readUint8(this.bb.__vector(this.bb_pos + offset) + index) : 0;\n  }\n  testrequirednestedflatbufferLength() {\n    const offset = this.bb.__offset(this.bb_pos, 102);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  testrequirednestedflatbufferArray() {\n    const offset = this.bb.__offset(this.bb_pos, 102);\n    return offset ? new Uint8Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null;\n  }\n  scalarKeySortedTables(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 104);\n    return offset ? (obj || new Stat()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  scalarKeySortedTablesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 104);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  nativeInline(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 106);\n    return offset ? (obj || new Test()).__init(this.bb_pos + offset, this.bb) : null;\n  }\n  longEnumNonEnumDefault() {\n    const offset = this.bb.__offset(this.bb_pos, 108);\n    return offset ? this.bb.readUint64(this.bb_pos + offset) : BigInt(\"0\");\n  }\n  mutate_long_enum_non_enum_default(value) {\n    const offset = this.bb.__offset(this.bb_pos, 108);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint64(this.bb_pos + offset, value);\n    return true;\n  }\n  longEnumNormalDefault() {\n    const offset = this.bb.__offset(this.bb_pos, 110);\n    return offset ? this.bb.readUint64(this.bb_pos + offset) : BigInt(\"2\");\n  }\n  mutate_long_enum_normal_default(value) {\n    const offset = this.bb.__offset(this.bb_pos, 110);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint64(this.bb_pos + offset, value);\n    return true;\n  }\n  nanDefault() {\n    const offset = this.bb.__offset(this.bb_pos, 112);\n    return offset ? this.bb.readFloat32(this.bb_pos + offset) : NaN;\n  }\n  mutate_nan_default(value) {\n    const offset = this.bb.__offset(this.bb_pos, 112);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeFloat32(this.bb_pos + offset, value);\n    return true;\n  }\n  infDefault() {\n    const offset = this.bb.__offset(this.bb_pos, 114);\n    return offset ? this.bb.readFloat32(this.bb_pos + offset) : Infinity;\n  }\n  mutate_inf_default(value) {\n    const offset = this.bb.__offset(this.bb_pos, 114);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeFloat32(this.bb_pos + offset, value);\n    return true;\n  }\n  positiveInfDefault() {\n    const offset = this.bb.__offset(this.bb_pos, 116);\n    return offset ? this.bb.readFloat32(this.bb_pos + offset) : Infinity;\n  }\n  mutate_positive_inf_default(value) {\n    const offset = this.bb.__offset(this.bb_pos, 116);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeFloat32(this.bb_pos + offset, value);\n    return true;\n  }\n  infinityDefault() {\n    const offset = this.bb.__offset(this.bb_pos, 118);\n    return offset ? this.bb.readFloat32(this.bb_pos + offset) : Infinity;\n  }\n  mutate_infinity_default(value) {\n    const offset = this.bb.__offset(this.bb_pos, 118);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeFloat32(this.bb_pos + offset, value);\n    return true;\n  }\n  positiveInfinityDefault() {\n    const offset = this.bb.__offset(this.bb_pos, 120);\n    return offset ? this.bb.readFloat32(this.bb_pos + offset) : Infinity;\n  }\n  mutate_positive_infinity_default(value) {\n    const offset = this.bb.__offset(this.bb_pos, 120);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeFloat32(this.bb_pos + offset, value);\n    return true;\n  }\n  negativeInfDefault() {\n    const offset = this.bb.__offset(this.bb_pos, 122);\n    return offset ? this.bb.readFloat32(this.bb_pos + offset) : -Infinity;\n  }\n  mutate_negative_inf_default(value) {\n    const offset = this.bb.__offset(this.bb_pos, 122);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeFloat32(this.bb_pos + offset, value);\n    return true;\n  }\n  negativeInfinityDefault() {\n    const offset = this.bb.__offset(this.bb_pos, 124);\n    return offset ? this.bb.readFloat32(this.bb_pos + offset) : -Infinity;\n  }\n  mutate_negative_infinity_default(value) {\n    const offset = this.bb.__offset(this.bb_pos, 124);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeFloat32(this.bb_pos + offset, value);\n    return true;\n  }\n  doubleInfDefault() {\n    const offset = this.bb.__offset(this.bb_pos, 126);\n    return offset ? this.bb.readFloat64(this.bb_pos + offset) : Infinity;\n  }\n  mutate_double_inf_default(value) {\n    const offset = this.bb.__offset(this.bb_pos, 126);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeFloat64(this.bb_pos + offset, value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return \"MyGame.Example.Monster\";\n  }\n  static startMonster(builder) {\n    builder.startObject(62);\n  }\n  static addPos(builder, posOffset) {\n    builder.addFieldStruct(0, posOffset, 0);\n  }\n  static addMana(builder, mana) {\n    builder.addFieldInt16(1, mana, 150);\n  }\n  static addHp(builder, hp) {\n    builder.addFieldInt16(2, hp, 100);\n  }\n  static addName(builder, nameOffset) {\n    builder.addFieldOffset(3, nameOffset, 0);\n  }\n  static addInventory(builder, inventoryOffset) {\n    builder.addFieldOffset(5, inventoryOffset, 0);\n  }\n  static createInventoryVector(builder, data) {\n    builder.startVector(1, data.length, 1);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addInt8(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startInventoryVector(builder, numElems) {\n    builder.startVector(1, numElems, 1);\n  }\n  static addColor(builder, color) {\n    builder.addFieldInt8(6, color, Color.Blue);\n  }\n  static addTestType(builder, testType) {\n    builder.addFieldInt8(7, testType, Any.NONE);\n  }\n  static addTest(builder, testOffset) {\n    builder.addFieldOffset(8, testOffset, 0);\n  }\n  static addTest4(builder, test4Offset) {\n    builder.addFieldOffset(9, test4Offset, 0);\n  }\n  static startTest4Vector(builder, numElems) {\n    builder.startVector(4, numElems, 2);\n  }\n  static addTestarrayofstring(builder, testarrayofstringOffset) {\n    builder.addFieldOffset(10, testarrayofstringOffset, 0);\n  }\n  static createTestarrayofstringVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startTestarrayofstringVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addTestarrayoftables(builder, testarrayoftablesOffset) {\n    builder.addFieldOffset(11, testarrayoftablesOffset, 0);\n  }\n  static createTestarrayoftablesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startTestarrayoftablesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addEnemy(builder, enemyOffset) {\n    builder.addFieldOffset(12, enemyOffset, 0);\n  }\n  static addTestnestedflatbuffer(builder, testnestedflatbufferOffset) {\n    builder.addFieldOffset(13, testnestedflatbufferOffset, 0);\n  }\n  static createTestnestedflatbufferVector(builder, data) {\n    builder.startVector(1, data.length, 1);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addInt8(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startTestnestedflatbufferVector(builder, numElems) {\n    builder.startVector(1, numElems, 1);\n  }\n  static addTestempty(builder, testemptyOffset) {\n    builder.addFieldOffset(14, testemptyOffset, 0);\n  }\n  static addTestbool(builder, testbool) {\n    builder.addFieldInt8(15, +testbool, 0);\n  }\n  static addTesthashs32Fnv1(builder, testhashs32Fnv1) {\n    builder.addFieldInt32(16, testhashs32Fnv1, 0);\n  }\n  static addTesthashu32Fnv1(builder, testhashu32Fnv1) {\n    builder.addFieldInt32(17, testhashu32Fnv1, 0);\n  }\n  static addTesthashs64Fnv1(builder, testhashs64Fnv1) {\n    builder.addFieldInt64(18, testhashs64Fnv1, BigInt(\"0\"));\n  }\n  static addTesthashu64Fnv1(builder, testhashu64Fnv1) {\n    builder.addFieldInt64(19, testhashu64Fnv1, BigInt(\"0\"));\n  }\n  static addTesthashs32Fnv1a(builder, testhashs32Fnv1a) {\n    builder.addFieldInt32(20, testhashs32Fnv1a, 0);\n  }\n  static addTesthashu32Fnv1a(builder, testhashu32Fnv1a) {\n    builder.addFieldInt32(21, testhashu32Fnv1a, 0);\n  }\n  static addTesthashs64Fnv1a(builder, testhashs64Fnv1a) {\n    builder.addFieldInt64(22, testhashs64Fnv1a, BigInt(\"0\"));\n  }\n  static addTesthashu64Fnv1a(builder, testhashu64Fnv1a) {\n    builder.addFieldInt64(23, testhashu64Fnv1a, BigInt(\"0\"));\n  }\n  static addTestarrayofbools(builder, testarrayofboolsOffset) {\n    builder.addFieldOffset(24, testarrayofboolsOffset, 0);\n  }\n  static createTestarrayofboolsVector(builder, data) {\n    builder.startVector(1, data.length, 1);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addInt8(+data[i]);\n    }\n    return builder.endVector();\n  }\n  static startTestarrayofboolsVector(builder, numElems) {\n    builder.startVector(1, numElems, 1);\n  }\n  static addTestf(builder, testf) {\n    builder.addFieldFloat32(25, testf, 3.14159);\n  }\n  static addTestf2(builder, testf2) {\n    builder.addFieldFloat32(26, testf2, 3);\n  }\n  static addTestf3(builder, testf3) {\n    builder.addFieldFloat32(27, testf3, 0);\n  }\n  static addTestarrayofstring2(builder, testarrayofstring2Offset) {\n    builder.addFieldOffset(28, testarrayofstring2Offset, 0);\n  }\n  static createTestarrayofstring2Vector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startTestarrayofstring2Vector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addTestarrayofsortedstruct(builder, testarrayofsortedstructOffset) {\n    builder.addFieldOffset(29, testarrayofsortedstructOffset, 0);\n  }\n  static startTestarrayofsortedstructVector(builder, numElems) {\n    builder.startVector(8, numElems, 4);\n  }\n  static addFlex(builder, flexOffset) {\n    builder.addFieldOffset(30, flexOffset, 0);\n  }\n  static createFlexVector(builder, data) {\n    builder.startVector(1, data.length, 1);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addInt8(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startFlexVector(builder, numElems) {\n    builder.startVector(1, numElems, 1);\n  }\n  static addTest5(builder, test5Offset) {\n    builder.addFieldOffset(31, test5Offset, 0);\n  }\n  static startTest5Vector(builder, numElems) {\n    builder.startVector(4, numElems, 2);\n  }\n  static addVectorOfLongs(builder, vectorOfLongsOffset) {\n    builder.addFieldOffset(32, vectorOfLongsOffset, 0);\n  }\n  static createVectorOfLongsVector(builder, data) {\n    builder.startVector(8, data.length, 8);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addInt64(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startVectorOfLongsVector(builder, numElems) {\n    builder.startVector(8, numElems, 8);\n  }\n  static addVectorOfDoubles(builder, vectorOfDoublesOffset) {\n    builder.addFieldOffset(33, vectorOfDoublesOffset, 0);\n  }\n  static createVectorOfDoublesVector(builder, data) {\n    builder.startVector(8, data.length, 8);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addFloat64(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startVectorOfDoublesVector(builder, numElems) {\n    builder.startVector(8, numElems, 8);\n  }\n  static addParentNamespaceTest(builder, parentNamespaceTestOffset) {\n    builder.addFieldOffset(34, parentNamespaceTestOffset, 0);\n  }\n  static addVectorOfReferrables(builder, vectorOfReferrablesOffset) {\n    builder.addFieldOffset(35, vectorOfReferrablesOffset, 0);\n  }\n  static createVectorOfReferrablesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startVectorOfReferrablesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addSingleWeakReference(builder, singleWeakReference) {\n    builder.addFieldInt64(36, singleWeakReference, BigInt(\"0\"));\n  }\n  static addVectorOfWeakReferences(builder, vectorOfWeakReferencesOffset) {\n    builder.addFieldOffset(37, vectorOfWeakReferencesOffset, 0);\n  }\n  static createVectorOfWeakReferencesVector(builder, data) {\n    builder.startVector(8, data.length, 8);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addInt64(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startVectorOfWeakReferencesVector(builder, numElems) {\n    builder.startVector(8, numElems, 8);\n  }\n  static addVectorOfStrongReferrables(builder, vectorOfStrongReferrablesOffset) {\n    builder.addFieldOffset(38, vectorOfStrongReferrablesOffset, 0);\n  }\n  static createVectorOfStrongReferrablesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startVectorOfStrongReferrablesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addCoOwningReference(builder, coOwningReference) {\n    builder.addFieldInt64(39, coOwningReference, BigInt(\"0\"));\n  }\n  static addVectorOfCoOwningReferences(builder, vectorOfCoOwningReferencesOffset) {\n    builder.addFieldOffset(40, vectorOfCoOwningReferencesOffset, 0);\n  }\n  static createVectorOfCoOwningReferencesVector(builder, data) {\n    builder.startVector(8, data.length, 8);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addInt64(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startVectorOfCoOwningReferencesVector(builder, numElems) {\n    builder.startVector(8, numElems, 8);\n  }\n  static addNonOwningReference(builder, nonOwningReference) {\n    builder.addFieldInt64(41, nonOwningReference, BigInt(\"0\"));\n  }\n  static addVectorOfNonOwningReferences(builder, vectorOfNonOwningReferencesOffset) {\n    builder.addFieldOffset(42, vectorOfNonOwningReferencesOffset, 0);\n  }\n  static createVectorOfNonOwningReferencesVector(builder, data) {\n    builder.startVector(8, data.length, 8);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addInt64(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startVectorOfNonOwningReferencesVector(builder, numElems) {\n    builder.startVector(8, numElems, 8);\n  }\n  static addAnyUniqueType(builder, anyUniqueType) {\n    builder.addFieldInt8(43, anyUniqueType, AnyUniqueAliases.NONE);\n  }\n  static addAnyUnique(builder, anyUniqueOffset) {\n    builder.addFieldOffset(44, anyUniqueOffset, 0);\n  }\n  static addAnyAmbiguousType(builder, anyAmbiguousType) {\n    builder.addFieldInt8(45, anyAmbiguousType, AnyAmbiguousAliases.NONE);\n  }\n  static addAnyAmbiguous(builder, anyAmbiguousOffset) {\n    builder.addFieldOffset(46, anyAmbiguousOffset, 0);\n  }\n  static addVectorOfEnums(builder, vectorOfEnumsOffset) {\n    builder.addFieldOffset(47, vectorOfEnumsOffset, 0);\n  }\n  static createVectorOfEnumsVector(builder, data) {\n    builder.startVector(1, data.length, 1);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addInt8(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startVectorOfEnumsVector(builder, numElems) {\n    builder.startVector(1, numElems, 1);\n  }\n  static addSignedEnum(builder, signedEnum) {\n    builder.addFieldInt8(48, signedEnum, Race.None);\n  }\n  static addTestrequirednestedflatbuffer(builder, testrequirednestedflatbufferOffset) {\n    builder.addFieldOffset(49, testrequirednestedflatbufferOffset, 0);\n  }\n  static createTestrequirednestedflatbufferVector(builder, data) {\n    builder.startVector(1, data.length, 1);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addInt8(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startTestrequirednestedflatbufferVector(builder, numElems) {\n    builder.startVector(1, numElems, 1);\n  }\n  static addScalarKeySortedTables(builder, scalarKeySortedTablesOffset) {\n    builder.addFieldOffset(50, scalarKeySortedTablesOffset, 0);\n  }\n  static createScalarKeySortedTablesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startScalarKeySortedTablesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addNativeInline(builder, nativeInlineOffset) {\n    builder.addFieldStruct(51, nativeInlineOffset, 0);\n  }\n  static addLongEnumNonEnumDefault(builder, longEnumNonEnumDefault) {\n    builder.addFieldInt64(52, longEnumNonEnumDefault, BigInt(\"0\"));\n  }\n  static addLongEnumNormalDefault(builder, longEnumNormalDefault) {\n    builder.addFieldInt64(53, longEnumNormalDefault, BigInt(\"2\"));\n  }\n  static addNanDefault(builder, nanDefault) {\n    builder.addFieldFloat32(54, nanDefault, NaN);\n  }\n  static addInfDefault(builder, infDefault) {\n    builder.addFieldFloat32(55, infDefault, Infinity);\n  }\n  static addPositiveInfDefault(builder, positiveInfDefault) {\n    builder.addFieldFloat32(56, positiveInfDefault, Infinity);\n  }\n  static addInfinityDefault(builder, infinityDefault) {\n    builder.addFieldFloat32(57, infinityDefault, Infinity);\n  }\n  static addPositiveInfinityDefault(builder, positiveInfinityDefault) {\n    builder.addFieldFloat32(58, positiveInfinityDefault, Infinity);\n  }\n  static addNegativeInfDefault(builder, negativeInfDefault) {\n    builder.addFieldFloat32(59, negativeInfDefault, -Infinity);\n  }\n  static addNegativeInfinityDefault(builder, negativeInfinityDefault) {\n    builder.addFieldFloat32(60, negativeInfinityDefault, -Infinity);\n  }\n  static addDoubleInfDefault(builder, doubleInfDefault) {\n    builder.addFieldFloat64(61, doubleInfDefault, Infinity);\n  }\n  static endMonster(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 10);\n    return offset;\n  }\n  static finishMonsterBuffer(builder, offset) {\n    builder.finish(offset, \"MONS\");\n  }\n  static finishSizePrefixedMonsterBuffer(builder, offset) {\n    builder.finish(offset, \"MONS\", true);\n  }\n  serialize() {\n    return this.bb.bytes();\n  }\n  static deserialize(buffer) {\n    return _Monster.getRootAsMonster(new flatbuffers8.ByteBuffer(buffer));\n  }\n  unpack() {\n    return new MonsterT2(this.pos() !== null ? this.pos().unpack() : null, this.mana(), this.hp(), this.name(), this.bb.createScalarList(this.inventory.bind(this), this.inventoryLength()), this.color(), this.testType(), (() => {\n      const temp = unionToAny(this.testType(), this.test.bind(this));\n      if (temp === null) {\n        return null;\n      }\n      return temp.unpack();\n    })(), this.bb.createObjList(this.test4.bind(this), this.test4Length()), this.bb.createScalarList(this.testarrayofstring.bind(this), this.testarrayofstringLength()), this.bb.createObjList(this.testarrayoftables.bind(this), this.testarrayoftablesLength()), this.enemy() !== null ? this.enemy().unpack() : null, this.bb.createScalarList(this.testnestedflatbuffer.bind(this), this.testnestedflatbufferLength()), this.testempty() !== null ? this.testempty().unpack() : null, this.testbool(), this.testhashs32Fnv1(), this.testhashu32Fnv1(), this.testhashs64Fnv1(), this.testhashu64Fnv1(), this.testhashs32Fnv1a(), this.testhashu32Fnv1a(), this.testhashs64Fnv1a(), this.testhashu64Fnv1a(), this.bb.createScalarList(this.testarrayofbools.bind(this), this.testarrayofboolsLength()), this.testf(), this.testf2(), this.testf3(), this.bb.createScalarList(this.testarrayofstring2.bind(this), this.testarrayofstring2Length()), this.bb.createObjList(this.testarrayofsortedstruct.bind(this), this.testarrayofsortedstructLength()), this.bb.createScalarList(this.flex.bind(this), this.flexLength()), this.bb.createObjList(this.test5.bind(this), this.test5Length()), this.bb.createScalarList(this.vectorOfLongs.bind(this), this.vectorOfLongsLength()), this.bb.createScalarList(this.vectorOfDoubles.bind(this), this.vectorOfDoublesLength()), this.parentNamespaceTest() !== null ? this.parentNamespaceTest().unpack() : null, this.bb.createObjList(this.vectorOfReferrables.bind(this), this.vectorOfReferrablesLength()), this.singleWeakReference(), this.bb.createScalarList(this.vectorOfWeakReferences.bind(this), this.vectorOfWeakReferencesLength()), this.bb.createObjList(this.vectorOfStrongReferrables.bind(this), this.vectorOfStrongReferrablesLength()), this.coOwningReference(), this.bb.createScalarList(this.vectorOfCoOwningReferences.bind(this), this.vectorOfCoOwningReferencesLength()), this.nonOwningReference(), this.bb.createScalarList(this.vectorOfNonOwningReferences.bind(this), this.vectorOfNonOwningReferencesLength()), this.anyUniqueType(), (() => {\n      const temp = unionToAnyUniqueAliases(this.anyUniqueType(), this.anyUnique.bind(this));\n      if (temp === null) {\n        return null;\n      }\n      return temp.unpack();\n    })(), this.anyAmbiguousType(), (() => {\n      const temp = unionToAnyAmbiguousAliases(this.anyAmbiguousType(), this.anyAmbiguous.bind(this));\n      if (temp === null) {\n        return null;\n      }\n      return temp.unpack();\n    })(), this.bb.createScalarList(this.vectorOfEnums.bind(this), this.vectorOfEnumsLength()), this.signedEnum(), this.bb.createScalarList(this.testrequirednestedflatbuffer.bind(this), this.testrequirednestedflatbufferLength()), this.bb.createObjList(this.scalarKeySortedTables.bind(this), this.scalarKeySortedTablesLength()), this.nativeInline() !== null ? this.nativeInline().unpack() : null, this.longEnumNonEnumDefault(), this.longEnumNormalDefault(), this.nanDefault(), this.infDefault(), this.positiveInfDefault(), this.infinityDefault(), this.positiveInfinityDefault(), this.negativeInfDefault(), this.negativeInfinityDefault(), this.doubleInfDefault());\n  }\n  unpackTo(_o) {\n    _o.pos = this.pos() !== null ? this.pos().unpack() : null;\n    _o.mana = this.mana();\n    _o.hp = this.hp();\n    _o.name = this.name();\n    _o.inventory = this.bb.createScalarList(this.inventory.bind(this), this.inventoryLength());\n    _o.color = this.color();\n    _o.testType = this.testType();\n    _o.test = (() => {\n      const temp = unionToAny(this.testType(), this.test.bind(this));\n      if (temp === null) {\n        return null;\n      }\n      return temp.unpack();\n    })();\n    _o.test4 = this.bb.createObjList(this.test4.bind(this), this.test4Length());\n    _o.testarrayofstring = this.bb.createScalarList(this.testarrayofstring.bind(this), this.testarrayofstringLength());\n    _o.testarrayoftables = this.bb.createObjList(this.testarrayoftables.bind(this), this.testarrayoftablesLength());\n    _o.enemy = this.enemy() !== null ? this.enemy().unpack() : null;\n    _o.testnestedflatbuffer = this.bb.createScalarList(this.testnestedflatbuffer.bind(this), this.testnestedflatbufferLength());\n    _o.testempty = this.testempty() !== null ? this.testempty().unpack() : null;\n    _o.testbool = this.testbool();\n    _o.testhashs32Fnv1 = this.testhashs32Fnv1();\n    _o.testhashu32Fnv1 = this.testhashu32Fnv1();\n    _o.testhashs64Fnv1 = this.testhashs64Fnv1();\n    _o.testhashu64Fnv1 = this.testhashu64Fnv1();\n    _o.testhashs32Fnv1a = this.testhashs32Fnv1a();\n    _o.testhashu32Fnv1a = this.testhashu32Fnv1a();\n    _o.testhashs64Fnv1a = this.testhashs64Fnv1a();\n    _o.testhashu64Fnv1a = this.testhashu64Fnv1a();\n    _o.testarrayofbools = this.bb.createScalarList(this.testarrayofbools.bind(this), this.testarrayofboolsLength());\n    _o.testf = this.testf();\n    _o.testf2 = this.testf2();\n    _o.testf3 = this.testf3();\n    _o.testarrayofstring2 = this.bb.createScalarList(this.testarrayofstring2.bind(this), this.testarrayofstring2Length());\n    _o.testarrayofsortedstruct = this.bb.createObjList(this.testarrayofsortedstruct.bind(this), this.testarrayofsortedstructLength());\n    _o.flex = this.bb.createScalarList(this.flex.bind(this), this.flexLength());\n    _o.test5 = this.bb.createObjList(this.test5.bind(this), this.test5Length());\n    _o.vectorOfLongs = this.bb.createScalarList(this.vectorOfLongs.bind(this), this.vectorOfLongsLength());\n    _o.vectorOfDoubles = this.bb.createScalarList(this.vectorOfDoubles.bind(this), this.vectorOfDoublesLength());\n    _o.parentNamespaceTest = this.parentNamespaceTest() !== null ? this.parentNamespaceTest().unpack() : null;\n    _o.vectorOfReferrables = this.bb.createObjList(this.vectorOfReferrables.bind(this), this.vectorOfReferrablesLength());\n    _o.singleWeakReference = this.singleWeakReference();\n    _o.vectorOfWeakReferences = this.bb.createScalarList(this.vectorOfWeakReferences.bind(this), this.vectorOfWeakReferencesLength());\n    _o.vectorOfStrongReferrables = this.bb.createObjList(this.vectorOfStrongReferrables.bind(this), this.vectorOfStrongReferrablesLength());\n    _o.coOwningReference = this.coOwningReference();\n    _o.vectorOfCoOwningReferences = this.bb.createScalarList(this.vectorOfCoOwningReferences.bind(this), this.vectorOfCoOwningReferencesLength());\n    _o.nonOwningReference = this.nonOwningReference();\n    _o.vectorOfNonOwningReferences = this.bb.createScalarList(this.vectorOfNonOwningReferences.bind(this), this.vectorOfNonOwningReferencesLength());\n    _o.anyUniqueType = this.anyUniqueType();\n    _o.anyUnique = (() => {\n      const temp = unionToAnyUniqueAliases(this.anyUniqueType(), this.anyUnique.bind(this));\n      if (temp === null) {\n        return null;\n      }\n      return temp.unpack();\n    })();\n    _o.anyAmbiguousType = this.anyAmbiguousType();\n    _o.anyAmbiguous = (() => {\n      const temp = unionToAnyAmbiguousAliases(this.anyAmbiguousType(), this.anyAmbiguous.bind(this));\n      if (temp === null) {\n        return null;\n      }\n      return temp.unpack();\n    })();\n    _o.vectorOfEnums = this.bb.createScalarList(this.vectorOfEnums.bind(this), this.vectorOfEnumsLength());\n    _o.signedEnum = this.signedEnum();\n    _o.testrequirednestedflatbuffer = this.bb.createScalarList(this.testrequirednestedflatbuffer.bind(this), this.testrequirednestedflatbufferLength());\n    _o.scalarKeySortedTables = this.bb.createObjList(this.scalarKeySortedTables.bind(this), this.scalarKeySortedTablesLength());\n    _o.nativeInline = this.nativeInline() !== null ? this.nativeInline().unpack() : null;\n    _o.longEnumNonEnumDefault = this.longEnumNonEnumDefault();\n    _o.longEnumNormalDefault = this.longEnumNormalDefault();\n    _o.nanDefault = this.nanDefault();\n    _o.infDefault = this.infDefault();\n    _o.positiveInfDefault = this.positiveInfDefault();\n    _o.infinityDefault = this.infinityDefault();\n    _o.positiveInfinityDefault = this.positiveInfinityDefault();\n    _o.negativeInfDefault = this.negativeInfDefault();\n    _o.negativeInfinityDefault = this.negativeInfinityDefault();\n    _o.doubleInfDefault = this.doubleInfDefault();\n  }\n};\nvar MonsterT2 = class {\n  constructor(pos = null, mana = 150, hp = 100, name = null, inventory = [], color = Color.Blue, testType = Any.NONE, test = null, test4 = [], testarrayofstring = [], testarrayoftables = [], enemy = null, testnestedflatbuffer = [], testempty = null, testbool = false, testhashs32Fnv1 = 0, testhashu32Fnv1 = 0, testhashs64Fnv1 = BigInt(\"0\"), testhashu64Fnv1 = BigInt(\"0\"), testhashs32Fnv1a = 0, testhashu32Fnv1a = 0, testhashs64Fnv1a = BigInt(\"0\"), testhashu64Fnv1a = BigInt(\"0\"), testarrayofbools = [], testf = 3.14159, testf2 = 3, testf3 = 0, testarrayofstring2 = [], testarrayofsortedstruct = [], flex = [], test5 = [], vectorOfLongs = [], vectorOfDoubles = [], parentNamespaceTest = null, vectorOfReferrables = [], singleWeakReference = BigInt(\"0\"), vectorOfWeakReferences = [], vectorOfStrongReferrables = [], coOwningReference = BigInt(\"0\"), vectorOfCoOwningReferences = [], nonOwningReference = BigInt(\"0\"), vectorOfNonOwningReferences = [], anyUniqueType = AnyUniqueAliases.NONE, anyUnique = null, anyAmbiguousType = AnyAmbiguousAliases.NONE, anyAmbiguous = null, vectorOfEnums = [], signedEnum = Race.None, testrequirednestedflatbuffer = [], scalarKeySortedTables = [], nativeInline = null, longEnumNonEnumDefault = BigInt(\"0\"), longEnumNormalDefault = BigInt(\"2\"), nanDefault = NaN, infDefault = Infinity, positiveInfDefault = Infinity, infinityDefault = Infinity, positiveInfinityDefault = Infinity, negativeInfDefault = -Infinity, negativeInfinityDefault = -Infinity, doubleInfDefault = Infinity) {\n    this.pos = pos;\n    this.mana = mana;\n    this.hp = hp;\n    this.name = name;\n    this.inventory = inventory;\n    this.color = color;\n    this.testType = testType;\n    this.test = test;\n    this.test4 = test4;\n    this.testarrayofstring = testarrayofstring;\n    this.testarrayoftables = testarrayoftables;\n    this.enemy = enemy;\n    this.testnestedflatbuffer = testnestedflatbuffer;\n    this.testempty = testempty;\n    this.testbool = testbool;\n    this.testhashs32Fnv1 = testhashs32Fnv1;\n    this.testhashu32Fnv1 = testhashu32Fnv1;\n    this.testhashs64Fnv1 = testhashs64Fnv1;\n    this.testhashu64Fnv1 = testhashu64Fnv1;\n    this.testhashs32Fnv1a = testhashs32Fnv1a;\n    this.testhashu32Fnv1a = testhashu32Fnv1a;\n    this.testhashs64Fnv1a = testhashs64Fnv1a;\n    this.testhashu64Fnv1a = testhashu64Fnv1a;\n    this.testarrayofbools = testarrayofbools;\n    this.testf = testf;\n    this.testf2 = testf2;\n    this.testf3 = testf3;\n    this.testarrayofstring2 = testarrayofstring2;\n    this.testarrayofsortedstruct = testarrayofsortedstruct;\n    this.flex = flex;\n    this.test5 = test5;\n    this.vectorOfLongs = vectorOfLongs;\n    this.vectorOfDoubles = vectorOfDoubles;\n    this.parentNamespaceTest = parentNamespaceTest;\n    this.vectorOfReferrables = vectorOfReferrables;\n    this.singleWeakReference = singleWeakReference;\n    this.vectorOfWeakReferences = vectorOfWeakReferences;\n    this.vectorOfStrongReferrables = vectorOfStrongReferrables;\n    this.coOwningReference = coOwningReference;\n    this.vectorOfCoOwningReferences = vectorOfCoOwningReferences;\n    this.nonOwningReference = nonOwningReference;\n    this.vectorOfNonOwningReferences = vectorOfNonOwningReferences;\n    this.anyUniqueType = anyUniqueType;\n    this.anyUnique = anyUnique;\n    this.anyAmbiguousType = anyAmbiguousType;\n    this.anyAmbiguous = anyAmbiguous;\n    this.vectorOfEnums = vectorOfEnums;\n    this.signedEnum = signedEnum;\n    this.testrequirednestedflatbuffer = testrequirednestedflatbuffer;\n    this.scalarKeySortedTables = scalarKeySortedTables;\n    this.nativeInline = nativeInline;\n    this.longEnumNonEnumDefault = longEnumNonEnumDefault;\n    this.longEnumNormalDefault = longEnumNormalDefault;\n    this.nanDefault = nanDefault;\n    this.infDefault = infDefault;\n    this.positiveInfDefault = positiveInfDefault;\n    this.infinityDefault = infinityDefault;\n    this.positiveInfinityDefault = positiveInfinityDefault;\n    this.negativeInfDefault = negativeInfDefault;\n    this.negativeInfinityDefault = negativeInfinityDefault;\n    this.doubleInfDefault = doubleInfDefault;\n  }\n  pack(builder) {\n    const name = this.name !== null ? builder.createString(this.name) : 0;\n    const inventory = Monster2.createInventoryVector(builder, this.inventory);\n    const test = builder.createObjectOffset(this.test);\n    const test4 = builder.createStructOffsetList(this.test4, Monster2.startTest4Vector);\n    const testarrayofstring = Monster2.createTestarrayofstringVector(builder, builder.createObjectOffsetList(this.testarrayofstring));\n    const testarrayoftables = Monster2.createTestarrayoftablesVector(builder, builder.createObjectOffsetList(this.testarrayoftables));\n    const enemy = this.enemy !== null ? this.enemy.pack(builder) : 0;\n    const testnestedflatbuffer = Monster2.createTestnestedflatbufferVector(builder, this.testnestedflatbuffer);\n    const testempty = this.testempty !== null ? this.testempty.pack(builder) : 0;\n    const testarrayofbools = Monster2.createTestarrayofboolsVector(builder, this.testarrayofbools);\n    const testarrayofstring2 = Monster2.createTestarrayofstring2Vector(builder, builder.createObjectOffsetList(this.testarrayofstring2));\n    const testarrayofsortedstruct = builder.createStructOffsetList(this.testarrayofsortedstruct, Monster2.startTestarrayofsortedstructVector);\n    const flex = Monster2.createFlexVector(builder, this.flex);\n    const test5 = builder.createStructOffsetList(this.test5, Monster2.startTest5Vector);\n    const vectorOfLongs = Monster2.createVectorOfLongsVector(builder, this.vectorOfLongs);\n    const vectorOfDoubles = Monster2.createVectorOfDoublesVector(builder, this.vectorOfDoubles);\n    const parentNamespaceTest = this.parentNamespaceTest !== null ? this.parentNamespaceTest.pack(builder) : 0;\n    const vectorOfReferrables = Monster2.createVectorOfReferrablesVector(builder, builder.createObjectOffsetList(this.vectorOfReferrables));\n    const vectorOfWeakReferences = Monster2.createVectorOfWeakReferencesVector(builder, this.vectorOfWeakReferences);\n    const vectorOfStrongReferrables = Monster2.createVectorOfStrongReferrablesVector(builder, builder.createObjectOffsetList(this.vectorOfStrongReferrables));\n    const vectorOfCoOwningReferences = Monster2.createVectorOfCoOwningReferencesVector(builder, this.vectorOfCoOwningReferences);\n    const vectorOfNonOwningReferences = Monster2.createVectorOfNonOwningReferencesVector(builder, this.vectorOfNonOwningReferences);\n    const anyUnique = builder.createObjectOffset(this.anyUnique);\n    const anyAmbiguous = builder.createObjectOffset(this.anyAmbiguous);\n    const vectorOfEnums = Monster2.createVectorOfEnumsVector(builder, this.vectorOfEnums);\n    const testrequirednestedflatbuffer = Monster2.createTestrequirednestedflatbufferVector(builder, this.testrequirednestedflatbuffer);\n    const scalarKeySortedTables = Monster2.createScalarKeySortedTablesVector(builder, builder.createObjectOffsetList(this.scalarKeySortedTables));\n    Monster2.startMonster(builder);\n    Monster2.addPos(builder, this.pos !== null ? this.pos.pack(builder) : 0);\n    Monster2.addMana(builder, this.mana);\n    Monster2.addHp(builder, this.hp);\n    Monster2.addName(builder, name);\n    Monster2.addInventory(builder, inventory);\n    Monster2.addColor(builder, this.color);\n    Monster2.addTestType(builder, this.testType);\n    Monster2.addTest(builder, test);\n    Monster2.addTest4(builder, test4);\n    Monster2.addTestarrayofstring(builder, testarrayofstring);\n    Monster2.addTestarrayoftables(builder, testarrayoftables);\n    Monster2.addEnemy(builder, enemy);\n    Monster2.addTestnestedflatbuffer(builder, testnestedflatbuffer);\n    Monster2.addTestempty(builder, testempty);\n    Monster2.addTestbool(builder, this.testbool);\n    Monster2.addTesthashs32Fnv1(builder, this.testhashs32Fnv1);\n    Monster2.addTesthashu32Fnv1(builder, this.testhashu32Fnv1);\n    Monster2.addTesthashs64Fnv1(builder, this.testhashs64Fnv1);\n    Monster2.addTesthashu64Fnv1(builder, this.testhashu64Fnv1);\n    Monster2.addTesthashs32Fnv1a(builder, this.testhashs32Fnv1a);\n    Monster2.addTesthashu32Fnv1a(builder, this.testhashu32Fnv1a);\n    Monster2.addTesthashs64Fnv1a(builder, this.testhashs64Fnv1a);\n    Monster2.addTesthashu64Fnv1a(builder, this.testhashu64Fnv1a);\n    Monster2.addTestarrayofbools(builder, testarrayofbools);\n    Monster2.addTestf(builder, this.testf);\n    Monster2.addTestf2(builder, this.testf2);\n    Monster2.addTestf3(builder, this.testf3);\n    Monster2.addTestarrayofstring2(builder, testarrayofstring2);\n    Monster2.addTestarrayofsortedstruct(builder, testarrayofsortedstruct);\n    Monster2.addFlex(builder, flex);\n    Monster2.addTest5(builder, test5);\n    Monster2.addVectorOfLongs(builder, vectorOfLongs);\n    Monster2.addVectorOfDoubles(builder, vectorOfDoubles);\n    Monster2.addParentNamespaceTest(builder, parentNamespaceTest);\n    Monster2.addVectorOfReferrables(builder, vectorOfReferrables);\n    Monster2.addSingleWeakReference(builder, this.singleWeakReference);\n    Monster2.addVectorOfWeakReferences(builder, vectorOfWeakReferences);\n    Monster2.addVectorOfStrongReferrables(builder, vectorOfStrongReferrables);\n    Monster2.addCoOwningReference(builder, this.coOwningReference);\n    Monster2.addVectorOfCoOwningReferences(builder, vectorOfCoOwningReferences);\n    Monster2.addNonOwningReference(builder, this.nonOwningReference);\n    Monster2.addVectorOfNonOwningReferences(builder, vectorOfNonOwningReferences);\n    Monster2.addAnyUniqueType(builder, this.anyUniqueType);\n    Monster2.addAnyUnique(builder, anyUnique);\n    Monster2.addAnyAmbiguousType(builder, this.anyAmbiguousType);\n    Monster2.addAnyAmbiguous(builder, anyAmbiguous);\n    Monster2.addVectorOfEnums(builder, vectorOfEnums);\n    Monster2.addSignedEnum(builder, this.signedEnum);\n    Monster2.addTestrequirednestedflatbuffer(builder, testrequirednestedflatbuffer);\n    Monster2.addScalarKeySortedTables(builder, scalarKeySortedTables);\n    Monster2.addNativeInline(builder, this.nativeInline !== null ? this.nativeInline.pack(builder) : 0);\n    Monster2.addLongEnumNonEnumDefault(builder, this.longEnumNonEnumDefault);\n    Monster2.addLongEnumNormalDefault(builder, this.longEnumNormalDefault);\n    Monster2.addNanDefault(builder, this.nanDefault);\n    Monster2.addInfDefault(builder, this.infDefault);\n    Monster2.addPositiveInfDefault(builder, this.positiveInfDefault);\n    Monster2.addInfinityDefault(builder, this.infinityDefault);\n    Monster2.addPositiveInfinityDefault(builder, this.positiveInfinityDefault);\n    Monster2.addNegativeInfDefault(builder, this.negativeInfDefault);\n    Monster2.addNegativeInfinityDefault(builder, this.negativeInfinityDefault);\n    Monster2.addDoubleInfDefault(builder, this.doubleInfDefault);\n    return Monster2.endMonster(builder);\n  }\n};\n\n// my-game/example/any.js\nvar Any;\n(function(Any2) {\n  Any2[Any2[\"NONE\"] = 0] = \"NONE\";\n  Any2[Any2[\"Monster\"] = 1] = \"Monster\";\n  Any2[Any2[\"TestSimpleTableWithEnum\"] = 2] = \"TestSimpleTableWithEnum\";\n  Any2[Any2[\"MyGame_Example2_Monster\"] = 3] = \"MyGame_Example2_Monster\";\n})(Any || (Any = {}));\nfunction unionToAny(type, accessor) {\n  switch (Any[type]) {\n    case \"NONE\":\n      return null;\n    case \"Monster\":\n      return accessor(new Monster2());\n    case \"TestSimpleTableWithEnum\":\n      return accessor(new TestSimpleTableWithEnum());\n    case \"MyGame_Example2_Monster\":\n      return accessor(new Monster());\n    default:\n      return null;\n  }\n}\n\n// my-game/example/long-enum.js\nvar LongEnum;\n(function(LongEnum2) {\n  LongEnum2[\"LongOne\"] = \"2\";\n  LongEnum2[\"LongTwo\"] = \"4\";\n  LongEnum2[\"LongBig\"] = \"1099511627776\";\n})(LongEnum || (LongEnum = {}));\n\n// my-game/example/struct-of-structs.js\nvar StructOfStructs = class {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  a(obj) {\n    return (obj || new Ability()).__init(this.bb_pos, this.bb);\n  }\n  b(obj) {\n    return (obj || new Test()).__init(this.bb_pos + 8, this.bb);\n  }\n  c(obj) {\n    return (obj || new Ability()).__init(this.bb_pos + 12, this.bb);\n  }\n  static getFullyQualifiedName() {\n    return \"MyGame.Example.StructOfStructs\";\n  }\n  static sizeOf() {\n    return 20;\n  }\n  static createStructOfStructs(builder, a_id, a_distance, b_a, b_b, c_id, c_distance) {\n    builder.prep(4, 20);\n    builder.prep(4, 8);\n    builder.writeInt32(c_distance);\n    builder.writeInt32(c_id);\n    builder.prep(2, 4);\n    builder.pad(1);\n    builder.writeInt8(b_b);\n    builder.writeInt16(b_a);\n    builder.prep(4, 8);\n    builder.writeInt32(a_distance);\n    builder.writeInt32(a_id);\n    return builder.offset();\n  }\n  unpack() {\n    return new StructOfStructsT(this.a() !== null ? this.a().unpack() : null, this.b() !== null ? this.b().unpack() : null, this.c() !== null ? this.c().unpack() : null);\n  }\n  unpackTo(_o) {\n    _o.a = this.a() !== null ? this.a().unpack() : null;\n    _o.b = this.b() !== null ? this.b().unpack() : null;\n    _o.c = this.c() !== null ? this.c().unpack() : null;\n  }\n};\nvar StructOfStructsT = class {\n  constructor(a = null, b = null, c = null) {\n    this.a = a;\n    this.b = b;\n    this.c = c;\n  }\n  pack(builder) {\n    return StructOfStructs.createStructOfStructs(builder, this.a?.id ?? 0, this.a?.distance ?? 0, this.b?.a ?? 0, this.b?.b ?? 0, this.c?.id ?? 0, this.c?.distance ?? 0);\n  }\n};\n\n// my-game/example/struct-of-structs-of-structs.js\nvar StructOfStructsOfStructs = class {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  a(obj) {\n    return (obj || new StructOfStructs()).__init(this.bb_pos, this.bb);\n  }\n  static getFullyQualifiedName() {\n    return \"MyGame.Example.StructOfStructsOfStructs\";\n  }\n  static sizeOf() {\n    return 20;\n  }\n  static createStructOfStructsOfStructs(builder, a_a_id, a_a_distance, a_b_a, a_b_b, a_c_id, a_c_distance) {\n    builder.prep(4, 20);\n    builder.prep(4, 20);\n    builder.prep(4, 8);\n    builder.writeInt32(a_c_distance);\n    builder.writeInt32(a_c_id);\n    builder.prep(2, 4);\n    builder.pad(1);\n    builder.writeInt8(a_b_b);\n    builder.writeInt16(a_b_a);\n    builder.prep(4, 8);\n    builder.writeInt32(a_a_distance);\n    builder.writeInt32(a_a_id);\n    return builder.offset();\n  }\n  unpack() {\n    return new StructOfStructsOfStructsT(this.a() !== null ? this.a().unpack() : null);\n  }\n  unpackTo(_o) {\n    _o.a = this.a() !== null ? this.a().unpack() : null;\n  }\n};\nvar StructOfStructsOfStructsT = class {\n  constructor(a = null) {\n    this.a = a;\n  }\n  pack(builder) {\n    return StructOfStructsOfStructs.createStructOfStructsOfStructs(builder, this.a?.a?.id ?? 0, this.a?.a?.distance ?? 0, this.a?.b?.a ?? 0, this.a?.b?.b ?? 0, this.a?.c?.id ?? 0, this.a?.c?.distance ?? 0);\n  }\n};\n\n// my-game/example/type-aliases.js\nvar flatbuffers9 = __toESM(require(\"flatbuffers\"), 1);\nvar TypeAliases = class _TypeAliases {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsTypeAliases(bb, obj) {\n    return (obj || new _TypeAliases()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsTypeAliases(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers9.SIZE_PREFIX_LENGTH);\n    return (obj || new _TypeAliases()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  i8() {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.readInt8(this.bb_pos + offset) : 0;\n  }\n  mutate_i8(value) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, value);\n    return true;\n  }\n  u8() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.readUint8(this.bb_pos + offset) : 0;\n  }\n  mutate_u8(value) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint8(this.bb_pos + offset, value);\n    return true;\n  }\n  i16() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? this.bb.readInt16(this.bb_pos + offset) : 0;\n  }\n  mutate_i16(value) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt16(this.bb_pos + offset, value);\n    return true;\n  }\n  u16() {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.readUint16(this.bb_pos + offset) : 0;\n  }\n  mutate_u16(value) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint16(this.bb_pos + offset, value);\n    return true;\n  }\n  i32() {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n  }\n  mutate_i32(value) {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  u32() {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.readUint32(this.bb_pos + offset) : 0;\n  }\n  mutate_u32(value) {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint32(this.bb_pos + offset, value);\n    return true;\n  }\n  i64() {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    return offset ? this.bb.readInt64(this.bb_pos + offset) : BigInt(\"0\");\n  }\n  mutate_i64(value) {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt64(this.bb_pos + offset, value);\n    return true;\n  }\n  u64() {\n    const offset = this.bb.__offset(this.bb_pos, 18);\n    return offset ? this.bb.readUint64(this.bb_pos + offset) : BigInt(\"0\");\n  }\n  mutate_u64(value) {\n    const offset = this.bb.__offset(this.bb_pos, 18);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint64(this.bb_pos + offset, value);\n    return true;\n  }\n  f32() {\n    const offset = this.bb.__offset(this.bb_pos, 20);\n    return offset ? this.bb.readFloat32(this.bb_pos + offset) : 0;\n  }\n  mutate_f32(value) {\n    const offset = this.bb.__offset(this.bb_pos, 20);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeFloat32(this.bb_pos + offset, value);\n    return true;\n  }\n  f64() {\n    const offset = this.bb.__offset(this.bb_pos, 22);\n    return offset ? this.bb.readFloat64(this.bb_pos + offset) : 0;\n  }\n  mutate_f64(value) {\n    const offset = this.bb.__offset(this.bb_pos, 22);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeFloat64(this.bb_pos + offset, value);\n    return true;\n  }\n  v8(index) {\n    const offset = this.bb.__offset(this.bb_pos, 24);\n    return offset ? this.bb.readInt8(this.bb.__vector(this.bb_pos + offset) + index) : 0;\n  }\n  v8Length() {\n    const offset = this.bb.__offset(this.bb_pos, 24);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  v8Array() {\n    const offset = this.bb.__offset(this.bb_pos, 24);\n    return offset ? new Int8Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null;\n  }\n  vf64(index) {\n    const offset = this.bb.__offset(this.bb_pos, 26);\n    return offset ? this.bb.readFloat64(this.bb.__vector(this.bb_pos + offset) + index * 8) : 0;\n  }\n  vf64Length() {\n    const offset = this.bb.__offset(this.bb_pos, 26);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  vf64Array() {\n    const offset = this.bb.__offset(this.bb_pos, 26);\n    return offset ? new Float64Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null;\n  }\n  static getFullyQualifiedName() {\n    return \"MyGame.Example.TypeAliases\";\n  }\n  static startTypeAliases(builder) {\n    builder.startObject(12);\n  }\n  static addI8(builder, i8) {\n    builder.addFieldInt8(0, i8, 0);\n  }\n  static addU8(builder, u8) {\n    builder.addFieldInt8(1, u8, 0);\n  }\n  static addI16(builder, i16) {\n    builder.addFieldInt16(2, i16, 0);\n  }\n  static addU16(builder, u16) {\n    builder.addFieldInt16(3, u16, 0);\n  }\n  static addI32(builder, i32) {\n    builder.addFieldInt32(4, i32, 0);\n  }\n  static addU32(builder, u32) {\n    builder.addFieldInt32(5, u32, 0);\n  }\n  static addI64(builder, i64) {\n    builder.addFieldInt64(6, i64, BigInt(\"0\"));\n  }\n  static addU64(builder, u64) {\n    builder.addFieldInt64(7, u64, BigInt(\"0\"));\n  }\n  static addF32(builder, f32) {\n    builder.addFieldFloat32(8, f32, 0);\n  }\n  static addF64(builder, f64) {\n    builder.addFieldFloat64(9, f64, 0);\n  }\n  static addV8(builder, v8Offset) {\n    builder.addFieldOffset(10, v8Offset, 0);\n  }\n  static createV8Vector(builder, data) {\n    builder.startVector(1, data.length, 1);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addInt8(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startV8Vector(builder, numElems) {\n    builder.startVector(1, numElems, 1);\n  }\n  static addVf64(builder, vf64Offset) {\n    builder.addFieldOffset(11, vf64Offset, 0);\n  }\n  static createVf64Vector(builder, data) {\n    builder.startVector(8, data.length, 8);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addFloat64(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startVf64Vector(builder, numElems) {\n    builder.startVector(8, numElems, 8);\n  }\n  static endTypeAliases(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static createTypeAliases(builder, i8, u8, i16, u16, i32, u32, i64, u64, f32, f64, v8Offset, vf64Offset) {\n    _TypeAliases.startTypeAliases(builder);\n    _TypeAliases.addI8(builder, i8);\n    _TypeAliases.addU8(builder, u8);\n    _TypeAliases.addI16(builder, i16);\n    _TypeAliases.addU16(builder, u16);\n    _TypeAliases.addI32(builder, i32);\n    _TypeAliases.addU32(builder, u32);\n    _TypeAliases.addI64(builder, i64);\n    _TypeAliases.addU64(builder, u64);\n    _TypeAliases.addF32(builder, f32);\n    _TypeAliases.addF64(builder, f64);\n    _TypeAliases.addV8(builder, v8Offset);\n    _TypeAliases.addVf64(builder, vf64Offset);\n    return _TypeAliases.endTypeAliases(builder);\n  }\n  serialize() {\n    return this.bb.bytes();\n  }\n  static deserialize(buffer) {\n    return _TypeAliases.getRootAsTypeAliases(new flatbuffers9.ByteBuffer(buffer));\n  }\n  unpack() {\n    return new TypeAliasesT(this.i8(), this.u8(), this.i16(), this.u16(), this.i32(), this.u32(), this.i64(), this.u64(), this.f32(), this.f64(), this.bb.createScalarList(this.v8.bind(this), this.v8Length()), this.bb.createScalarList(this.vf64.bind(this), this.vf64Length()));\n  }\n  unpackTo(_o) {\n    _o.i8 = this.i8();\n    _o.u8 = this.u8();\n    _o.i16 = this.i16();\n    _o.u16 = this.u16();\n    _o.i32 = this.i32();\n    _o.u32 = this.u32();\n    _o.i64 = this.i64();\n    _o.u64 = this.u64();\n    _o.f32 = this.f32();\n    _o.f64 = this.f64();\n    _o.v8 = this.bb.createScalarList(this.v8.bind(this), this.v8Length());\n    _o.vf64 = this.bb.createScalarList(this.vf64.bind(this), this.vf64Length());\n  }\n};\nvar TypeAliasesT = class {\n  constructor(i8 = 0, u8 = 0, i16 = 0, u16 = 0, i32 = 0, u32 = 0, i64 = BigInt(\"0\"), u64 = BigInt(\"0\"), f32 = 0, f64 = 0, v8 = [], vf64 = []) {\n    this.i8 = i8;\n    this.u8 = u8;\n    this.i16 = i16;\n    this.u16 = u16;\n    this.i32 = i32;\n    this.u32 = u32;\n    this.i64 = i64;\n    this.u64 = u64;\n    this.f32 = f32;\n    this.f64 = f64;\n    this.v8 = v8;\n    this.vf64 = vf64;\n  }\n  pack(builder) {\n    const v8 = TypeAliases.createV8Vector(builder, this.v8);\n    const vf64 = TypeAliases.createVf64Vector(builder, this.vf64);\n    return TypeAliases.createTypeAliases(builder, this.i8, this.u8, this.i16, this.u16, this.i32, this.u32, this.i64, this.u64, this.f32, this.f64, v8, vf64);\n  }\n};\n\n// my-game/example2.js\nvar example2_exports = {};\n__export(example2_exports, {\n  Monster: () => Monster,\n  MonsterT: () => MonsterT\n});\n\n// my-game/other-name-space.js\nvar other_name_space_exports = {};\n__export(other_name_space_exports, {\n  FromInclude: () => FromInclude,\n  TableB: () => TableB,\n  TableBT: () => TableBT,\n  Unused: () => Unused,\n  UnusedT: () => UnusedT\n});\n\n// my-game/other-name-space/from-include.js\nvar FromInclude;\n(function(FromInclude2) {\n  FromInclude2[\"IncludeVal\"] = \"0\";\n})(FromInclude || (FromInclude = {}));\n\n// my-game/other-name-space/unused.js\nvar Unused = class {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  a() {\n    return this.bb.readInt32(this.bb_pos);\n  }\n  mutate_a(value) {\n    this.bb.writeInt32(this.bb_pos + 0, value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return \"MyGame.OtherNameSpace.Unused\";\n  }\n  static sizeOf() {\n    return 4;\n  }\n  static createUnused(builder, a) {\n    builder.prep(4, 4);\n    builder.writeInt32(a);\n    return builder.offset();\n  }\n  unpack() {\n    return new UnusedT(this.a());\n  }\n  unpackTo(_o) {\n    _o.a = this.a();\n  }\n};\nvar UnusedT = class {\n  constructor(a = 0) {\n    this.a = a;\n  }\n  pack(builder) {\n    return Unused.createUnused(builder, this.a);\n  }\n};\n"
  },
  {
    "path": "tests/ts/my-game/example/ability.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nexport declare class Ability\n  implements flatbuffers.IUnpackableObject<AbilityT>\n{\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Ability;\n  id(): number;\n  mutate_id(value: number): boolean;\n  distance(): number;\n  mutate_distance(value: number): boolean;\n  static getFullyQualifiedName(): string;\n  static sizeOf(): number;\n  static createAbility(\n    builder: flatbuffers.Builder,\n    id: number,\n    distance: number,\n  ): flatbuffers.Offset;\n  unpack(): AbilityT;\n  unpackTo(_o: AbilityT): void;\n}\nexport declare class AbilityT implements flatbuffers.IGeneratedObject {\n  id: number;\n  distance: number;\n  constructor(id?: number, distance?: number);\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/ability.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\nexport class Ability {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  id() {\n    return this.bb.readUint32(this.bb_pos);\n  }\n  mutate_id(value) {\n    this.bb.writeUint32(this.bb_pos + 0, value);\n    return true;\n  }\n  distance() {\n    return this.bb.readUint32(this.bb_pos + 4);\n  }\n  mutate_distance(value) {\n    this.bb.writeUint32(this.bb_pos + 4, value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return 'MyGame.Example.Ability';\n  }\n  static sizeOf() {\n    return 8;\n  }\n  static createAbility(builder, id, distance) {\n    builder.prep(4, 8);\n    builder.writeInt32(distance);\n    builder.writeInt32(id);\n    return builder.offset();\n  }\n  unpack() {\n    return new AbilityT(this.id(), this.distance());\n  }\n  unpackTo(_o) {\n    _o.id = this.id();\n    _o.distance = this.distance();\n  }\n}\nexport class AbilityT {\n  constructor(id = 0, distance = 0) {\n    this.id = id;\n    this.distance = distance;\n  }\n  pack(builder) {\n    return Ability.createAbility(builder, this.id, this.distance);\n  }\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/ability.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\n\n\nexport class Ability implements flatbuffers.IUnpackableObject<AbilityT> {\n  bb: flatbuffers.ByteBuffer|null = null;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):Ability {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\nid():number {\n  return this.bb!.readUint32(this.bb_pos);\n}\n\nmutate_id(value:number):boolean {\n  this.bb!.writeUint32(this.bb_pos + 0, value);\n  return true;\n}\n\ndistance():number {\n  return this.bb!.readUint32(this.bb_pos + 4);\n}\n\nmutate_distance(value:number):boolean {\n  this.bb!.writeUint32(this.bb_pos + 4, value);\n  return true;\n}\n\nstatic getFullyQualifiedName(): \"MyGame.Example.Ability\" {\n  return 'MyGame.Example.Ability';\n}\n\nstatic sizeOf():number {\n  return 8;\n}\n\nstatic createAbility(builder:flatbuffers.Builder, id: number, distance: number):flatbuffers.Offset {\n  builder.prep(4, 8);\n  builder.writeInt32(distance);\n  builder.writeInt32(id);\n  return builder.offset();\n}\n\n\nunpack(): AbilityT {\n  return new AbilityT(\n    this.id(),\n    this.distance()\n  );\n}\n\n\nunpackTo(_o: AbilityT): void {\n  _o.id = this.id();\n  _o.distance = this.distance();\n}\n}\n\nexport class AbilityT implements flatbuffers.IGeneratedObject {\nconstructor(\n  public id: number = 0,\n  public distance: number = 0\n){}\n\n\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n  return Ability.createAbility(builder,\n    this.id,\n    this.distance\n  );\n}\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/any-ambiguous-aliases.d.ts",
    "content": "import {Monster} from '../../my-game/example/monster.js';\nexport declare enum AnyAmbiguousAliases {\n  NONE = 0,\n  M1 = 1,\n  M2 = 2,\n  M3 = 3,\n}\nexport declare function unionToAnyAmbiguousAliases(\n  type: AnyAmbiguousAliases,\n  accessor: (obj: Monster) => Monster | null,\n): Monster | null;\nexport declare function unionListToAnyAmbiguousAliases(\n  type: AnyAmbiguousAliases,\n  accessor: (index: number, obj: Monster) => Monster | null,\n  index: number,\n): Monster | null;\n"
  },
  {
    "path": "tests/ts/my-game/example/any-ambiguous-aliases.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport {Monster} from '../../my-game/example/monster.js';\nexport var AnyAmbiguousAliases;\n(function(AnyAmbiguousAliases) {\nAnyAmbiguousAliases[AnyAmbiguousAliases['NONE'] = 0] = 'NONE';\nAnyAmbiguousAliases[AnyAmbiguousAliases['M1'] = 1] = 'M1';\nAnyAmbiguousAliases[AnyAmbiguousAliases['M2'] = 2] = 'M2';\nAnyAmbiguousAliases[AnyAmbiguousAliases['M3'] = 3] = 'M3';\n})(AnyAmbiguousAliases || (AnyAmbiguousAliases = {}));\nexport function unionToAnyAmbiguousAliases(type, accessor) {\n  switch (AnyAmbiguousAliases[type]) {\n    case 'NONE':\n      return null;\n    case 'M1':\n      return accessor(new Monster());\n    case 'M2':\n      return accessor(new Monster());\n    case 'M3':\n      return accessor(new Monster());\n    default:\n      return null;\n  }\n}\nexport function unionListToAnyAmbiguousAliases(type, accessor, index) {\n  switch (AnyAmbiguousAliases[type]) {\n    case 'NONE':\n      return null;\n    case 'M1':\n      return accessor(index, new Monster());\n    case 'M2':\n      return accessor(index, new Monster());\n    case 'M3':\n      return accessor(index, new Monster());\n    default:\n      return null;\n  }\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/any-ambiguous-aliases.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport { Monster, MonsterT } from './monster.js';\n\n\nexport enum AnyAmbiguousAliases {\n  NONE = 0,\n  M1 = 1,\n  M2 = 2,\n  M3 = 3\n}\n\nexport function unionToAnyAmbiguousAliases(\n  type: AnyAmbiguousAliases,\n  accessor: (obj:Monster) => Monster|null\n): Monster|null {\n  switch(AnyAmbiguousAliases[type]) {\n    case 'NONE': return null; \n    case 'M1': return accessor(new Monster())! as Monster;\n    case 'M2': return accessor(new Monster())! as Monster;\n    case 'M3': return accessor(new Monster())! as Monster;\n    default: return null;\n  }\n}\n\nexport function unionListToAnyAmbiguousAliases(\n  type: AnyAmbiguousAliases, \n  accessor: (index: number, obj:Monster) => Monster|null, \n  index: number\n): Monster|null {\n  switch(AnyAmbiguousAliases[type]) {\n    case 'NONE': return null; \n    case 'M1': return accessor(index, new Monster())! as Monster;\n    case 'M2': return accessor(index, new Monster())! as Monster;\n    case 'M3': return accessor(index, new Monster())! as Monster;\n    default: return null;\n  }\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/any-unique-aliases.d.ts",
    "content": "import {Monster} from '../../my-game/example/monster.js';\nimport {TestSimpleTableWithEnum} from '../../my-game/example/test-simple-table-with-enum.js';\nimport {Monster as MyGame_Example2_Monster} from '../../my-game/example2/monster.js';\nexport declare enum AnyUniqueAliases {\n  NONE = 0,\n  M = 1,\n  TS = 2,\n  M2 = 3,\n}\nexport declare function unionToAnyUniqueAliases(\n  type: AnyUniqueAliases,\n  accessor: (\n    obj: Monster | MyGame_Example2_Monster | TestSimpleTableWithEnum,\n  ) => Monster | MyGame_Example2_Monster | TestSimpleTableWithEnum | null,\n): Monster | MyGame_Example2_Monster | TestSimpleTableWithEnum | null;\nexport declare function unionListToAnyUniqueAliases(\n  type: AnyUniqueAliases,\n  accessor: (\n    index: number,\n    obj: Monster | MyGame_Example2_Monster | TestSimpleTableWithEnum,\n  ) => Monster | MyGame_Example2_Monster | TestSimpleTableWithEnum | null,\n  index: number,\n): Monster | MyGame_Example2_Monster | TestSimpleTableWithEnum | null;\n"
  },
  {
    "path": "tests/ts/my-game/example/any-unique-aliases.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport {Monster} from '../../my-game/example/monster.js';\nimport {TestSimpleTableWithEnum} from '../../my-game/example/test-simple-table-with-enum.js';\nimport {Monster as MyGame_Example2_Monster} from '../../my-game/example2/monster.js';\n\nexport var AnyUniqueAliases;\n(function(AnyUniqueAliases) {\nAnyUniqueAliases[AnyUniqueAliases['NONE'] = 0] = 'NONE';\nAnyUniqueAliases[AnyUniqueAliases['M'] = 1] = 'M';\nAnyUniqueAliases[AnyUniqueAliases['TS'] = 2] = 'TS';\nAnyUniqueAliases[AnyUniqueAliases['M2'] = 3] = 'M2';\n})(AnyUniqueAliases || (AnyUniqueAliases = {}));\nexport function unionToAnyUniqueAliases(type, accessor) {\n  switch (AnyUniqueAliases[type]) {\n    case 'NONE':\n      return null;\n    case 'M':\n      return accessor(new Monster());\n    case 'TS':\n      return accessor(new TestSimpleTableWithEnum());\n    case 'M2':\n      return accessor(new MyGame_Example2_Monster());\n    default:\n      return null;\n  }\n}\nexport function unionListToAnyUniqueAliases(type, accessor, index) {\n  switch (AnyUniqueAliases[type]) {\n    case 'NONE':\n      return null;\n    case 'M':\n      return accessor(index, new Monster());\n    case 'TS':\n      return accessor(index, new TestSimpleTableWithEnum());\n    case 'M2':\n      return accessor(index, new MyGame_Example2_Monster());\n    default:\n      return null;\n  }\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/any-unique-aliases.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport { Monster as MyGame_Example2_Monster, MonsterT as MyGame_Example2_MonsterT } from '../example2/monster.js';\nimport { Monster, MonsterT } from './monster.js';\nimport { TestSimpleTableWithEnum, TestSimpleTableWithEnumT } from './test-simple-table-with-enum.js';\n\n\nexport enum AnyUniqueAliases {\n  NONE = 0,\n  M = 1,\n  TS = 2,\n  M2 = 3\n}\n\nexport function unionToAnyUniqueAliases(\n  type: AnyUniqueAliases,\n  accessor: (obj:Monster|MyGame_Example2_Monster|TestSimpleTableWithEnum) => Monster|MyGame_Example2_Monster|TestSimpleTableWithEnum|null\n): Monster|MyGame_Example2_Monster|TestSimpleTableWithEnum|null {\n  switch(AnyUniqueAliases[type]) {\n    case 'NONE': return null; \n    case 'M': return accessor(new Monster())! as Monster;\n    case 'TS': return accessor(new TestSimpleTableWithEnum())! as TestSimpleTableWithEnum;\n    case 'M2': return accessor(new MyGame_Example2_Monster())! as MyGame_Example2_Monster;\n    default: return null;\n  }\n}\n\nexport function unionListToAnyUniqueAliases(\n  type: AnyUniqueAliases, \n  accessor: (index: number, obj:Monster|MyGame_Example2_Monster|TestSimpleTableWithEnum) => Monster|MyGame_Example2_Monster|TestSimpleTableWithEnum|null, \n  index: number\n): Monster|MyGame_Example2_Monster|TestSimpleTableWithEnum|null {\n  switch(AnyUniqueAliases[type]) {\n    case 'NONE': return null; \n    case 'M': return accessor(index, new Monster())! as Monster;\n    case 'TS': return accessor(index, new TestSimpleTableWithEnum())! as TestSimpleTableWithEnum;\n    case 'M2': return accessor(index, new MyGame_Example2_Monster())! as MyGame_Example2_Monster;\n    default: return null;\n  }\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/any.d.ts",
    "content": "import {Monster} from '../../my-game/example/monster.js';\nimport {TestSimpleTableWithEnum} from '../../my-game/example/test-simple-table-with-enum.js';\nimport {Monster as MyGame_Example2_Monster} from '../../my-game/example2/monster.js';\nexport declare enum Any {\n  NONE = 0,\n  Monster = 1,\n  TestSimpleTableWithEnum = 2,\n  MyGame_Example2_Monster = 3,\n}\nexport declare function unionToAny(\n  type: Any,\n  accessor: (\n    obj: Monster | MyGame_Example2_Monster | TestSimpleTableWithEnum,\n  ) => Monster | MyGame_Example2_Monster | TestSimpleTableWithEnum | null,\n): Monster | MyGame_Example2_Monster | TestSimpleTableWithEnum | null;\nexport declare function unionListToAny(\n  type: Any,\n  accessor: (\n    index: number,\n    obj: Monster | MyGame_Example2_Monster | TestSimpleTableWithEnum,\n  ) => Monster | MyGame_Example2_Monster | TestSimpleTableWithEnum | null,\n  index: number,\n): Monster | MyGame_Example2_Monster | TestSimpleTableWithEnum | null;\n"
  },
  {
    "path": "tests/ts/my-game/example/any.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport {Monster} from '../../my-game/example/monster.js';\nimport {TestSimpleTableWithEnum} from '../../my-game/example/test-simple-table-with-enum.js';\nimport {Monster as MyGame_Example2_Monster} from '../../my-game/example2/monster.js';\n\nexport var Any;\n(function(Any) {\nAny[Any['NONE'] = 0] = 'NONE';\nAny[Any['Monster'] = 1] = 'Monster';\nAny[Any['TestSimpleTableWithEnum'] = 2] = 'TestSimpleTableWithEnum';\nAny[Any['MyGame_Example2_Monster'] = 3] = 'MyGame_Example2_Monster';\n})(Any || (Any = {}));\nexport function unionToAny(type, accessor) {\n  switch (Any[type]) {\n    case 'NONE':\n      return null;\n    case 'Monster':\n      return accessor(new Monster());\n    case 'TestSimpleTableWithEnum':\n      return accessor(new TestSimpleTableWithEnum());\n    case 'MyGame_Example2_Monster':\n      return accessor(new MyGame_Example2_Monster());\n    default:\n      return null;\n  }\n}\nexport function unionListToAny(type, accessor, index) {\n  switch (Any[type]) {\n    case 'NONE':\n      return null;\n    case 'Monster':\n      return accessor(index, new Monster());\n    case 'TestSimpleTableWithEnum':\n      return accessor(index, new TestSimpleTableWithEnum());\n    case 'MyGame_Example2_Monster':\n      return accessor(index, new MyGame_Example2_Monster());\n    default:\n      return null;\n  }\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/any.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport { Monster as MyGame_Example2_Monster, MonsterT as MyGame_Example2_MonsterT } from '../example2/monster.js';\nimport { Monster, MonsterT } from './monster.js';\nimport { TestSimpleTableWithEnum, TestSimpleTableWithEnumT } from './test-simple-table-with-enum.js';\n\n\nexport enum Any {\n  NONE = 0,\n  Monster = 1,\n  TestSimpleTableWithEnum = 2,\n  MyGame_Example2_Monster = 3\n}\n\nexport function unionToAny(\n  type: Any,\n  accessor: (obj:Monster|MyGame_Example2_Monster|TestSimpleTableWithEnum) => Monster|MyGame_Example2_Monster|TestSimpleTableWithEnum|null\n): Monster|MyGame_Example2_Monster|TestSimpleTableWithEnum|null {\n  switch(Any[type]) {\n    case 'NONE': return null; \n    case 'Monster': return accessor(new Monster())! as Monster;\n    case 'TestSimpleTableWithEnum': return accessor(new TestSimpleTableWithEnum())! as TestSimpleTableWithEnum;\n    case 'MyGame_Example2_Monster': return accessor(new MyGame_Example2_Monster())! as MyGame_Example2_Monster;\n    default: return null;\n  }\n}\n\nexport function unionListToAny(\n  type: Any, \n  accessor: (index: number, obj:Monster|MyGame_Example2_Monster|TestSimpleTableWithEnum) => Monster|MyGame_Example2_Monster|TestSimpleTableWithEnum|null, \n  index: number\n): Monster|MyGame_Example2_Monster|TestSimpleTableWithEnum|null {\n  switch(Any[type]) {\n    case 'NONE': return null; \n    case 'Monster': return accessor(index, new Monster())! as Monster;\n    case 'TestSimpleTableWithEnum': return accessor(index, new TestSimpleTableWithEnum())! as TestSimpleTableWithEnum;\n    case 'MyGame_Example2_Monster': return accessor(index, new MyGame_Example2_Monster())! as MyGame_Example2_Monster;\n    default: return null;\n  }\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/color.d.ts",
    "content": "/**\n * Composite components of Monster color.\n */\nexport declare enum Color {\n  Red = 1,\n  /**\n   * \\brief color Green\n   * Green is bit_flag with value (1u << 1)\n   */\n  Green = 2,\n  /**\n   * \\brief color Blue (1u << 3)\n   */\n  Blue = 8,\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/color.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\n/**\n * Composite components of Monster color.\n */\nexport var Color;\n(function(Color) {\nColor[Color['Red'] = 1] = 'Red';\n/**\n * \\brief color Green\n * Green is bit_flag with value (1u << 1)\n */\nColor[Color['Green'] = 2] = 'Green';\n/**\n * \\brief color Blue (1u << 3)\n */\nColor[Color['Blue'] = 8] = 'Blue';\n})(Color || (Color = {}));\n"
  },
  {
    "path": "tests/ts/my-game/example/color.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\n/**\n * Composite components of Monster color.\n */\nexport enum Color {\n  Red = 1,\n\n  /**\n   * \\brief color Green\n   * Green is bit_flag with value (1u << 1)\n   */\n  Green = 2,\n\n  /**\n   * \\brief color Blue (1u << 3)\n   */\n  Blue = 8\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/long-enum.d.ts",
    "content": "export declare enum LongEnum {\n  LongOne = '2',\n  LongTwo = '4',\n  LongBig = '1099511627776',\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/long-enum.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nexport var LongEnum;\n(function(LongEnum) {\nLongEnum['LongOne'] = '2';\nLongEnum['LongTwo'] = '4';\nLongEnum['LongBig'] = '1099511627776';\n})(LongEnum || (LongEnum = {}));\n"
  },
  {
    "path": "tests/ts/my-game/example/long-enum.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport enum LongEnum {\n  LongOne = '2',\n  LongTwo = '4',\n  LongBig = '1099511627776'\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/monster.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nimport {Ability, AbilityT} from '../../my-game/example/ability.js';\nimport {AnyAmbiguousAliases} from '../../my-game/example/any-ambiguous-aliases.js';\nimport {AnyUniqueAliases} from '../../my-game/example/any-unique-aliases.js';\nimport {Any} from '../../my-game/example/any.js';\nimport {Color} from '../../my-game/example/color.js';\nimport {Race} from '../../my-game/example/race.js';\nimport {Referrable, ReferrableT} from '../../my-game/example/referrable.js';\nimport {Stat, StatT} from '../../my-game/example/stat.js';\nimport {TestSimpleTableWithEnumT} from '../../my-game/example/test-simple-table-with-enum.js';\nimport {Test, TestT} from '../../my-game/example/test.js';\nimport {Vec3, Vec3T} from '../../my-game/example/vec3.js';\nimport {MonsterT as MyGame_Example2_MonsterT} from '../../my-game/example2/monster.js';\nimport {\n  InParentNamespace,\n  InParentNamespaceT,\n} from '../../my-game/in-parent-namespace.js';\n/**\n * an example documentation comment: \"monster object\"\n */\nexport declare class Monster\n  implements flatbuffers.IUnpackableObject<MonsterT>\n{\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Monster;\n  static getRootAsMonster(bb: flatbuffers.ByteBuffer, obj?: Monster): Monster;\n  static getSizePrefixedRootAsMonster(\n    bb: flatbuffers.ByteBuffer,\n    obj?: Monster,\n  ): Monster;\n  static bufferHasIdentifier(bb: flatbuffers.ByteBuffer): boolean;\n  pos(obj?: Vec3): Vec3 | null;\n  mana(): number;\n  mutate_mana(value: number): boolean;\n  hp(): number;\n  mutate_hp(value: number): boolean;\n  name(): string | null;\n  name(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  inventory(index: number): number | null;\n  inventoryLength(): number;\n  inventoryArray(): Uint8Array | null;\n  color(): Color;\n  mutate_color(value: Color): boolean;\n  testType(): Any;\n  test<T extends flatbuffers.Table>(obj: any): any | null;\n  test4(index: number, obj?: Test): Test | null;\n  test4Length(): number;\n  testarrayofstring(index: number): string;\n  testarrayofstring(\n    index: number,\n    optionalEncoding: flatbuffers.Encoding,\n  ): string | Uint8Array;\n  testarrayofstringLength(): number;\n  /**\n   * an example documentation comment: this will end up in the generated code\n   * multiline too\n   */\n  testarrayoftables(index: number, obj?: Monster): Monster | null;\n  testarrayoftablesLength(): number;\n  enemy(obj?: Monster): Monster | null;\n  testnestedflatbuffer(index: number): number | null;\n  testnestedflatbufferLength(): number;\n  testnestedflatbufferArray(): Uint8Array | null;\n  testempty(obj?: Stat): Stat | null;\n  testbool(): boolean;\n  mutate_testbool(value: boolean): boolean;\n  testhashs32Fnv1(): number;\n  mutate_testhashs32_fnv1(value: number): boolean;\n  testhashu32Fnv1(): number;\n  mutate_testhashu32_fnv1(value: number): boolean;\n  testhashs64Fnv1(): bigint;\n  mutate_testhashs64_fnv1(value: bigint): boolean;\n  testhashu64Fnv1(): bigint;\n  mutate_testhashu64_fnv1(value: bigint): boolean;\n  testhashs32Fnv1a(): number;\n  mutate_testhashs32_fnv1a(value: number): boolean;\n  testhashu32Fnv1a(): number;\n  mutate_testhashu32_fnv1a(value: number): boolean;\n  testhashs64Fnv1a(): bigint;\n  mutate_testhashs64_fnv1a(value: bigint): boolean;\n  testhashu64Fnv1a(): bigint;\n  mutate_testhashu64_fnv1a(value: bigint): boolean;\n  testarrayofbools(index: number): boolean | null;\n  testarrayofboolsLength(): number;\n  testarrayofboolsArray(): Int8Array | null;\n  testf(): number;\n  mutate_testf(value: number): boolean;\n  testf2(): number;\n  mutate_testf2(value: number): boolean;\n  testf3(): number;\n  mutate_testf3(value: number): boolean;\n  testarrayofstring2(index: number): string;\n  testarrayofstring2(\n    index: number,\n    optionalEncoding: flatbuffers.Encoding,\n  ): string | Uint8Array;\n  testarrayofstring2Length(): number;\n  testarrayofsortedstruct(index: number, obj?: Ability): Ability | null;\n  testarrayofsortedstructLength(): number;\n  flex(index: number): number | null;\n  flexLength(): number;\n  flexArray(): Uint8Array | null;\n  test5(index: number, obj?: Test): Test | null;\n  test5Length(): number;\n  vectorOfLongs(index: number): bigint | null;\n  vectorOfLongsLength(): number;\n  vectorOfDoubles(index: number): number | null;\n  vectorOfDoublesLength(): number;\n  vectorOfDoublesArray(): Float64Array | null;\n  parentNamespaceTest(obj?: InParentNamespace): InParentNamespace | null;\n  vectorOfReferrables(index: number, obj?: Referrable): Referrable | null;\n  vectorOfReferrablesLength(): number;\n  singleWeakReference(): bigint;\n  mutate_single_weak_reference(value: bigint): boolean;\n  vectorOfWeakReferences(index: number): bigint | null;\n  vectorOfWeakReferencesLength(): number;\n  vectorOfStrongReferrables(index: number, obj?: Referrable): Referrable | null;\n  vectorOfStrongReferrablesLength(): number;\n  coOwningReference(): bigint;\n  mutate_co_owning_reference(value: bigint): boolean;\n  vectorOfCoOwningReferences(index: number): bigint | null;\n  vectorOfCoOwningReferencesLength(): number;\n  nonOwningReference(): bigint;\n  mutate_non_owning_reference(value: bigint): boolean;\n  vectorOfNonOwningReferences(index: number): bigint | null;\n  vectorOfNonOwningReferencesLength(): number;\n  anyUniqueType(): AnyUniqueAliases;\n  anyUnique<T extends flatbuffers.Table>(obj: any): any | null;\n  anyAmbiguousType(): AnyAmbiguousAliases;\n  anyAmbiguous<T extends flatbuffers.Table>(obj: any): any | null;\n  vectorOfEnums(index: number): Color | null;\n  vectorOfEnumsLength(): number;\n  vectorOfEnumsArray(): Uint8Array | null;\n  signedEnum(): Race;\n  mutate_signed_enum(value: Race): boolean;\n  testrequirednestedflatbuffer(index: number): number | null;\n  testrequirednestedflatbufferLength(): number;\n  testrequirednestedflatbufferArray(): Uint8Array | null;\n  scalarKeySortedTables(index: number, obj?: Stat): Stat | null;\n  scalarKeySortedTablesLength(): number;\n  nativeInline(obj?: Test): Test | null;\n  longEnumNonEnumDefault(): bigint;\n  mutate_long_enum_non_enum_default(value: bigint): boolean;\n  longEnumNormalDefault(): bigint;\n  mutate_long_enum_normal_default(value: bigint): boolean;\n  nanDefault(): number;\n  mutate_nan_default(value: number): boolean;\n  infDefault(): number;\n  mutate_inf_default(value: number): boolean;\n  positiveInfDefault(): number;\n  mutate_positive_inf_default(value: number): boolean;\n  infinityDefault(): number;\n  mutate_infinity_default(value: number): boolean;\n  positiveInfinityDefault(): number;\n  mutate_positive_infinity_default(value: number): boolean;\n  negativeInfDefault(): number;\n  mutate_negative_inf_default(value: number): boolean;\n  negativeInfinityDefault(): number;\n  mutate_negative_infinity_default(value: number): boolean;\n  doubleInfDefault(): number;\n  mutate_double_inf_default(value: number): boolean;\n  static getFullyQualifiedName(): string;\n  static startMonster(builder: flatbuffers.Builder): void;\n  static addPos(\n    builder: flatbuffers.Builder,\n    posOffset: flatbuffers.Offset,\n  ): void;\n  static addMana(builder: flatbuffers.Builder, mana: number): void;\n  static addHp(builder: flatbuffers.Builder, hp: number): void;\n  static addName(\n    builder: flatbuffers.Builder,\n    nameOffset: flatbuffers.Offset,\n  ): void;\n  static addInventory(\n    builder: flatbuffers.Builder,\n    inventoryOffset: flatbuffers.Offset,\n  ): void;\n  static createInventoryVector(\n    builder: flatbuffers.Builder,\n    data: number[] | Uint8Array,\n  ): flatbuffers.Offset;\n  static startInventoryVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addColor(builder: flatbuffers.Builder, color: Color): void;\n  static addTestType(builder: flatbuffers.Builder, testType: Any): void;\n  static addTest(\n    builder: flatbuffers.Builder,\n    testOffset: flatbuffers.Offset,\n  ): void;\n  static addTest4(\n    builder: flatbuffers.Builder,\n    test4Offset: flatbuffers.Offset,\n  ): void;\n  static startTest4Vector(builder: flatbuffers.Builder, numElems: number): void;\n  static addTestarrayofstring(\n    builder: flatbuffers.Builder,\n    testarrayofstringOffset: flatbuffers.Offset,\n  ): void;\n  static createTestarrayofstringVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset;\n  static startTestarrayofstringVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addTestarrayoftables(\n    builder: flatbuffers.Builder,\n    testarrayoftablesOffset: flatbuffers.Offset,\n  ): void;\n  static createTestarrayoftablesVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset;\n  static startTestarrayoftablesVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addEnemy(\n    builder: flatbuffers.Builder,\n    enemyOffset: flatbuffers.Offset,\n  ): void;\n  static addTestnestedflatbuffer(\n    builder: flatbuffers.Builder,\n    testnestedflatbufferOffset: flatbuffers.Offset,\n  ): void;\n  static createTestnestedflatbufferVector(\n    builder: flatbuffers.Builder,\n    data: number[] | Uint8Array,\n  ): flatbuffers.Offset;\n  static startTestnestedflatbufferVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addTestempty(\n    builder: flatbuffers.Builder,\n    testemptyOffset: flatbuffers.Offset,\n  ): void;\n  static addTestbool(builder: flatbuffers.Builder, testbool: boolean): void;\n  static addTesthashs32Fnv1(\n    builder: flatbuffers.Builder,\n    testhashs32Fnv1: number,\n  ): void;\n  static addTesthashu32Fnv1(\n    builder: flatbuffers.Builder,\n    testhashu32Fnv1: number,\n  ): void;\n  static addTesthashs64Fnv1(\n    builder: flatbuffers.Builder,\n    testhashs64Fnv1: bigint,\n  ): void;\n  static addTesthashu64Fnv1(\n    builder: flatbuffers.Builder,\n    testhashu64Fnv1: bigint,\n  ): void;\n  static addTesthashs32Fnv1a(\n    builder: flatbuffers.Builder,\n    testhashs32Fnv1a: number,\n  ): void;\n  static addTesthashu32Fnv1a(\n    builder: flatbuffers.Builder,\n    testhashu32Fnv1a: number,\n  ): void;\n  static addTesthashs64Fnv1a(\n    builder: flatbuffers.Builder,\n    testhashs64Fnv1a: bigint,\n  ): void;\n  static addTesthashu64Fnv1a(\n    builder: flatbuffers.Builder,\n    testhashu64Fnv1a: bigint,\n  ): void;\n  static addTestarrayofbools(\n    builder: flatbuffers.Builder,\n    testarrayofboolsOffset: flatbuffers.Offset,\n  ): void;\n  static createTestarrayofboolsVector(\n    builder: flatbuffers.Builder,\n    data: boolean[],\n  ): flatbuffers.Offset;\n  static startTestarrayofboolsVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addTestf(builder: flatbuffers.Builder, testf: number): void;\n  static addTestf2(builder: flatbuffers.Builder, testf2: number): void;\n  static addTestf3(builder: flatbuffers.Builder, testf3: number): void;\n  static addTestarrayofstring2(\n    builder: flatbuffers.Builder,\n    testarrayofstring2Offset: flatbuffers.Offset,\n  ): void;\n  static createTestarrayofstring2Vector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset;\n  static startTestarrayofstring2Vector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addTestarrayofsortedstruct(\n    builder: flatbuffers.Builder,\n    testarrayofsortedstructOffset: flatbuffers.Offset,\n  ): void;\n  static startTestarrayofsortedstructVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addFlex(\n    builder: flatbuffers.Builder,\n    flexOffset: flatbuffers.Offset,\n  ): void;\n  static createFlexVector(\n    builder: flatbuffers.Builder,\n    data: number[] | Uint8Array,\n  ): flatbuffers.Offset;\n  static startFlexVector(builder: flatbuffers.Builder, numElems: number): void;\n  static addTest5(\n    builder: flatbuffers.Builder,\n    test5Offset: flatbuffers.Offset,\n  ): void;\n  static startTest5Vector(builder: flatbuffers.Builder, numElems: number): void;\n  static addVectorOfLongs(\n    builder: flatbuffers.Builder,\n    vectorOfLongsOffset: flatbuffers.Offset,\n  ): void;\n  static createVectorOfLongsVector(\n    builder: flatbuffers.Builder,\n    data: bigint[],\n  ): flatbuffers.Offset;\n  static startVectorOfLongsVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addVectorOfDoubles(\n    builder: flatbuffers.Builder,\n    vectorOfDoublesOffset: flatbuffers.Offset,\n  ): void;\n  static createVectorOfDoublesVector(\n    builder: flatbuffers.Builder,\n    data: number[] | Float64Array,\n  ): flatbuffers.Offset;\n  /**\n   * @deprecated This Uint8Array overload will be removed in the future.\n   */\n  static createVectorOfDoublesVector(\n    builder: flatbuffers.Builder,\n    data: number[] | Uint8Array,\n  ): flatbuffers.Offset;\n  static startVectorOfDoublesVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addParentNamespaceTest(\n    builder: flatbuffers.Builder,\n    parentNamespaceTestOffset: flatbuffers.Offset,\n  ): void;\n  static addVectorOfReferrables(\n    builder: flatbuffers.Builder,\n    vectorOfReferrablesOffset: flatbuffers.Offset,\n  ): void;\n  static createVectorOfReferrablesVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset;\n  static startVectorOfReferrablesVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addSingleWeakReference(\n    builder: flatbuffers.Builder,\n    singleWeakReference: bigint,\n  ): void;\n  static addVectorOfWeakReferences(\n    builder: flatbuffers.Builder,\n    vectorOfWeakReferencesOffset: flatbuffers.Offset,\n  ): void;\n  static createVectorOfWeakReferencesVector(\n    builder: flatbuffers.Builder,\n    data: bigint[],\n  ): flatbuffers.Offset;\n  static startVectorOfWeakReferencesVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addVectorOfStrongReferrables(\n    builder: flatbuffers.Builder,\n    vectorOfStrongReferrablesOffset: flatbuffers.Offset,\n  ): void;\n  static createVectorOfStrongReferrablesVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset;\n  static startVectorOfStrongReferrablesVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addCoOwningReference(\n    builder: flatbuffers.Builder,\n    coOwningReference: bigint,\n  ): void;\n  static addVectorOfCoOwningReferences(\n    builder: flatbuffers.Builder,\n    vectorOfCoOwningReferencesOffset: flatbuffers.Offset,\n  ): void;\n  static createVectorOfCoOwningReferencesVector(\n    builder: flatbuffers.Builder,\n    data: bigint[],\n  ): flatbuffers.Offset;\n  static startVectorOfCoOwningReferencesVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addNonOwningReference(\n    builder: flatbuffers.Builder,\n    nonOwningReference: bigint,\n  ): void;\n  static addVectorOfNonOwningReferences(\n    builder: flatbuffers.Builder,\n    vectorOfNonOwningReferencesOffset: flatbuffers.Offset,\n  ): void;\n  static createVectorOfNonOwningReferencesVector(\n    builder: flatbuffers.Builder,\n    data: bigint[],\n  ): flatbuffers.Offset;\n  static startVectorOfNonOwningReferencesVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addAnyUniqueType(\n    builder: flatbuffers.Builder,\n    anyUniqueType: AnyUniqueAliases,\n  ): void;\n  static addAnyUnique(\n    builder: flatbuffers.Builder,\n    anyUniqueOffset: flatbuffers.Offset,\n  ): void;\n  static addAnyAmbiguousType(\n    builder: flatbuffers.Builder,\n    anyAmbiguousType: AnyAmbiguousAliases,\n  ): void;\n  static addAnyAmbiguous(\n    builder: flatbuffers.Builder,\n    anyAmbiguousOffset: flatbuffers.Offset,\n  ): void;\n  static addVectorOfEnums(\n    builder: flatbuffers.Builder,\n    vectorOfEnumsOffset: flatbuffers.Offset,\n  ): void;\n  static createVectorOfEnumsVector(\n    builder: flatbuffers.Builder,\n    data: Color[],\n  ): flatbuffers.Offset;\n  static startVectorOfEnumsVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addSignedEnum(builder: flatbuffers.Builder, signedEnum: Race): void;\n  static addTestrequirednestedflatbuffer(\n    builder: flatbuffers.Builder,\n    testrequirednestedflatbufferOffset: flatbuffers.Offset,\n  ): void;\n  static createTestrequirednestedflatbufferVector(\n    builder: flatbuffers.Builder,\n    data: number[] | Uint8Array,\n  ): flatbuffers.Offset;\n  static startTestrequirednestedflatbufferVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addScalarKeySortedTables(\n    builder: flatbuffers.Builder,\n    scalarKeySortedTablesOffset: flatbuffers.Offset,\n  ): void;\n  static createScalarKeySortedTablesVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset;\n  static startScalarKeySortedTablesVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addNativeInline(\n    builder: flatbuffers.Builder,\n    nativeInlineOffset: flatbuffers.Offset,\n  ): void;\n  static addLongEnumNonEnumDefault(\n    builder: flatbuffers.Builder,\n    longEnumNonEnumDefault: bigint,\n  ): void;\n  static addLongEnumNormalDefault(\n    builder: flatbuffers.Builder,\n    longEnumNormalDefault: bigint,\n  ): void;\n  static addNanDefault(builder: flatbuffers.Builder, nanDefault: number): void;\n  static addInfDefault(builder: flatbuffers.Builder, infDefault: number): void;\n  static addPositiveInfDefault(\n    builder: flatbuffers.Builder,\n    positiveInfDefault: number,\n  ): void;\n  static addInfinityDefault(\n    builder: flatbuffers.Builder,\n    infinityDefault: number,\n  ): void;\n  static addPositiveInfinityDefault(\n    builder: flatbuffers.Builder,\n    positiveInfinityDefault: number,\n  ): void;\n  static addNegativeInfDefault(\n    builder: flatbuffers.Builder,\n    negativeInfDefault: number,\n  ): void;\n  static addNegativeInfinityDefault(\n    builder: flatbuffers.Builder,\n    negativeInfinityDefault: number,\n  ): void;\n  static addDoubleInfDefault(\n    builder: flatbuffers.Builder,\n    doubleInfDefault: number,\n  ): void;\n  static endMonster(builder: flatbuffers.Builder): flatbuffers.Offset;\n  static finishMonsterBuffer(\n    builder: flatbuffers.Builder,\n    offset: flatbuffers.Offset,\n  ): void;\n  static finishSizePrefixedMonsterBuffer(\n    builder: flatbuffers.Builder,\n    offset: flatbuffers.Offset,\n  ): void;\n  serialize(): Uint8Array;\n  static deserialize(buffer: Uint8Array): Monster;\n  unpack(): MonsterT;\n  unpackTo(_o: MonsterT): void;\n}\nexport declare class MonsterT implements flatbuffers.IGeneratedObject {\n  pos: Vec3T | null;\n  mana: number;\n  hp: number;\n  name: string | Uint8Array | null;\n  inventory: number[];\n  color: Color;\n  testType: Any;\n  test: MonsterT | MyGame_Example2_MonsterT | TestSimpleTableWithEnumT | null;\n  test4: TestT[];\n  testarrayofstring: string[];\n  testarrayoftables: MonsterT[];\n  enemy: MonsterT | null;\n  testnestedflatbuffer: number[];\n  testempty: StatT | null;\n  testbool: boolean;\n  testhashs32Fnv1: number;\n  testhashu32Fnv1: number;\n  testhashs64Fnv1: bigint;\n  testhashu64Fnv1: bigint;\n  testhashs32Fnv1a: number;\n  testhashu32Fnv1a: number;\n  testhashs64Fnv1a: bigint;\n  testhashu64Fnv1a: bigint;\n  testarrayofbools: boolean[];\n  testf: number;\n  testf2: number;\n  testf3: number;\n  testarrayofstring2: string[];\n  testarrayofsortedstruct: AbilityT[];\n  flex: number[];\n  test5: TestT[];\n  vectorOfLongs: bigint[];\n  vectorOfDoubles: number[];\n  parentNamespaceTest: InParentNamespaceT | null;\n  vectorOfReferrables: ReferrableT[];\n  singleWeakReference: bigint;\n  vectorOfWeakReferences: bigint[];\n  vectorOfStrongReferrables: ReferrableT[];\n  coOwningReference: bigint;\n  vectorOfCoOwningReferences: bigint[];\n  nonOwningReference: bigint;\n  vectorOfNonOwningReferences: bigint[];\n  anyUniqueType: AnyUniqueAliases;\n  anyUnique:\n    | MonsterT\n    | MyGame_Example2_MonsterT\n    | TestSimpleTableWithEnumT\n    | null;\n  anyAmbiguousType: AnyAmbiguousAliases;\n  anyAmbiguous: MonsterT | null;\n  vectorOfEnums: Color[];\n  signedEnum: Race;\n  testrequirednestedflatbuffer: number[];\n  scalarKeySortedTables: StatT[];\n  nativeInline: TestT | null;\n  longEnumNonEnumDefault: bigint;\n  longEnumNormalDefault: bigint;\n  nanDefault: number;\n  infDefault: number;\n  positiveInfDefault: number;\n  infinityDefault: number;\n  positiveInfinityDefault: number;\n  negativeInfDefault: number;\n  negativeInfinityDefault: number;\n  doubleInfDefault: number;\n  constructor(\n    pos?: Vec3T | null,\n    mana?: number,\n    hp?: number,\n    name?: string | Uint8Array | null,\n    inventory?: number[],\n    color?: Color,\n    testType?: Any,\n    test?:\n      | MonsterT\n      | MyGame_Example2_MonsterT\n      | TestSimpleTableWithEnumT\n      | null,\n    test4?: TestT[],\n    testarrayofstring?: string[],\n    testarrayoftables?: MonsterT[],\n    enemy?: MonsterT | null,\n    testnestedflatbuffer?: number[],\n    testempty?: StatT | null,\n    testbool?: boolean,\n    testhashs32Fnv1?: number,\n    testhashu32Fnv1?: number,\n    testhashs64Fnv1?: bigint,\n    testhashu64Fnv1?: bigint,\n    testhashs32Fnv1a?: number,\n    testhashu32Fnv1a?: number,\n    testhashs64Fnv1a?: bigint,\n    testhashu64Fnv1a?: bigint,\n    testarrayofbools?: boolean[],\n    testf?: number,\n    testf2?: number,\n    testf3?: number,\n    testarrayofstring2?: string[],\n    testarrayofsortedstruct?: AbilityT[],\n    flex?: number[],\n    test5?: TestT[],\n    vectorOfLongs?: bigint[],\n    vectorOfDoubles?: number[],\n    parentNamespaceTest?: InParentNamespaceT | null,\n    vectorOfReferrables?: ReferrableT[],\n    singleWeakReference?: bigint,\n    vectorOfWeakReferences?: bigint[],\n    vectorOfStrongReferrables?: ReferrableT[],\n    coOwningReference?: bigint,\n    vectorOfCoOwningReferences?: bigint[],\n    nonOwningReference?: bigint,\n    vectorOfNonOwningReferences?: bigint[],\n    anyUniqueType?: AnyUniqueAliases,\n    anyUnique?:\n      | MonsterT\n      | MyGame_Example2_MonsterT\n      | TestSimpleTableWithEnumT\n      | null,\n    anyAmbiguousType?: AnyAmbiguousAliases,\n    anyAmbiguous?: MonsterT | null,\n    vectorOfEnums?: Color[],\n    signedEnum?: Race,\n    testrequirednestedflatbuffer?: number[],\n    scalarKeySortedTables?: StatT[],\n    nativeInline?: TestT | null,\n    longEnumNonEnumDefault?: bigint,\n    longEnumNormalDefault?: bigint,\n    nanDefault?: number,\n    infDefault?: number,\n    positiveInfDefault?: number,\n    infinityDefault?: number,\n    positiveInfinityDefault?: number,\n    negativeInfDefault?: number,\n    negativeInfinityDefault?: number,\n    doubleInfDefault?: number,\n  );\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/monster.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\n\nimport {Ability} from '../../my-game/example/ability.js';\nimport {AnyAmbiguousAliases, unionToAnyAmbiguousAliases} from '../../my-game/example/any-ambiguous-aliases.js';\nimport {AnyUniqueAliases, unionToAnyUniqueAliases} from '../../my-game/example/any-unique-aliases.js';\nimport {Any, unionToAny} from '../../my-game/example/any.js';\nimport {Color} from '../../my-game/example/color.js';\nimport {Race} from '../../my-game/example/race.js';\nimport {Referrable} from '../../my-game/example/referrable.js';\nimport {Stat} from '../../my-game/example/stat.js';\nimport {Test} from '../../my-game/example/test.js';\nimport {Vec3} from '../../my-game/example/vec3.js';\nimport {InParentNamespace} from '../../my-game/in-parent-namespace.js';\n\n/**\n * an example documentation comment: \"monster object\"\n */\nexport class Monster {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsMonster(bb, obj) {\n    return (obj || new Monster())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsMonster(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new Monster())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static bufferHasIdentifier(bb) {\n    return bb.__has_identifier('MONS');\n  }\n  pos(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? (obj || new Vec3()).__init(this.bb_pos + offset, this.bb) :\n                    null;\n  }\n  mana() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.readInt16(this.bb_pos + offset) : 150;\n  }\n  mutate_mana(value) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt16(this.bb_pos + offset, value);\n    return true;\n  }\n  hp() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? this.bb.readInt16(this.bb_pos + offset) : 100;\n  }\n  mutate_hp(value) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt16(this.bb_pos + offset, value);\n    return true;\n  }\n  name(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) :\n                    null;\n  }\n  inventory(index) {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ?\n        this.bb.readUint8(this.bb.__vector(this.bb_pos + offset) + index) :\n        0;\n  }\n  inventoryLength() {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  inventoryArray() {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ?\n        new Uint8Array(\n            this.bb.bytes().buffer,\n            this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset),\n            this.bb.__vector_len(this.bb_pos + offset)) :\n        null;\n  }\n  color() {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    return offset ? this.bb.readUint8(this.bb_pos + offset) : Color.Blue;\n  }\n  mutate_color(value) {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint8(this.bb_pos + offset, value);\n    return true;\n  }\n  testType() {\n    const offset = this.bb.__offset(this.bb_pos, 18);\n    return offset ? this.bb.readUint8(this.bb_pos + offset) : Any.NONE;\n  }\n  test(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 20);\n    return offset ? this.bb.__union(obj, this.bb_pos + offset) : null;\n  }\n  test4(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 22);\n    return offset ?\n        (obj || new Test())\n            .__init(\n                this.bb.__vector(this.bb_pos + offset) + index * 4, this.bb) :\n        null;\n  }\n  test4Length() {\n    const offset = this.bb.__offset(this.bb_pos, 22);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  testarrayofstring(index, optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 24);\n    return offset ? this.bb.__string(\n                        this.bb.__vector(this.bb_pos + offset) + index * 4,\n                        optionalEncoding) :\n                    null;\n  }\n  testarrayofstringLength() {\n    const offset = this.bb.__offset(this.bb_pos, 24);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  /**\n   * an example documentation comment: this will end up in the generated code\n   * multiline too\n   */\n  testarrayoftables(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 26);\n    return offset ?\n        (obj || new Monster())\n            .__init(\n                this.bb.__indirect(\n                    this.bb.__vector(this.bb_pos + offset) + index * 4),\n                this.bb) :\n        null;\n  }\n  testarrayoftablesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 26);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  enemy(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 28);\n    return offset ?\n        (obj || new Monster())\n            .__init(this.bb.__indirect(this.bb_pos + offset), this.bb) :\n        null;\n  }\n  testnestedflatbuffer(index) {\n    const offset = this.bb.__offset(this.bb_pos, 30);\n    return offset ?\n        this.bb.readUint8(this.bb.__vector(this.bb_pos + offset) + index) :\n        0;\n  }\n  testnestedflatbufferLength() {\n    const offset = this.bb.__offset(this.bb_pos, 30);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  testnestedflatbufferArray() {\n    const offset = this.bb.__offset(this.bb_pos, 30);\n    return offset ?\n        new Uint8Array(\n            this.bb.bytes().buffer,\n            this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset),\n            this.bb.__vector_len(this.bb_pos + offset)) :\n        null;\n  }\n  testempty(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 32);\n    return offset ?\n        (obj || new Stat())\n            .__init(this.bb.__indirect(this.bb_pos + offset), this.bb) :\n        null;\n  }\n  testbool() {\n    const offset = this.bb.__offset(this.bb_pos, 34);\n    return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false;\n  }\n  mutate_testbool(value) {\n    const offset = this.bb.__offset(this.bb_pos, 34);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n  testhashs32Fnv1() {\n    const offset = this.bb.__offset(this.bb_pos, 36);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n  }\n  mutate_testhashs32_fnv1(value) {\n    const offset = this.bb.__offset(this.bb_pos, 36);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  testhashu32Fnv1() {\n    const offset = this.bb.__offset(this.bb_pos, 38);\n    return offset ? this.bb.readUint32(this.bb_pos + offset) : 0;\n  }\n  mutate_testhashu32_fnv1(value) {\n    const offset = this.bb.__offset(this.bb_pos, 38);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint32(this.bb_pos + offset, value);\n    return true;\n  }\n  testhashs64Fnv1() {\n    const offset = this.bb.__offset(this.bb_pos, 40);\n    return offset ? this.bb.readInt64(this.bb_pos + offset) : BigInt('0');\n  }\n  mutate_testhashs64_fnv1(value) {\n    const offset = this.bb.__offset(this.bb_pos, 40);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt64(this.bb_pos + offset, value);\n    return true;\n  }\n  testhashu64Fnv1() {\n    const offset = this.bb.__offset(this.bb_pos, 42);\n    return offset ? this.bb.readUint64(this.bb_pos + offset) : BigInt('0');\n  }\n  mutate_testhashu64_fnv1(value) {\n    const offset = this.bb.__offset(this.bb_pos, 42);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint64(this.bb_pos + offset, value);\n    return true;\n  }\n  testhashs32Fnv1a() {\n    const offset = this.bb.__offset(this.bb_pos, 44);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n  }\n  mutate_testhashs32_fnv1a(value) {\n    const offset = this.bb.__offset(this.bb_pos, 44);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  testhashu32Fnv1a() {\n    const offset = this.bb.__offset(this.bb_pos, 46);\n    return offset ? this.bb.readUint32(this.bb_pos + offset) : 0;\n  }\n  mutate_testhashu32_fnv1a(value) {\n    const offset = this.bb.__offset(this.bb_pos, 46);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint32(this.bb_pos + offset, value);\n    return true;\n  }\n  testhashs64Fnv1a() {\n    const offset = this.bb.__offset(this.bb_pos, 48);\n    return offset ? this.bb.readInt64(this.bb_pos + offset) : BigInt('0');\n  }\n  mutate_testhashs64_fnv1a(value) {\n    const offset = this.bb.__offset(this.bb_pos, 48);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt64(this.bb_pos + offset, value);\n    return true;\n  }\n  testhashu64Fnv1a() {\n    const offset = this.bb.__offset(this.bb_pos, 50);\n    return offset ? this.bb.readUint64(this.bb_pos + offset) : BigInt('0');\n  }\n  mutate_testhashu64_fnv1a(value) {\n    const offset = this.bb.__offset(this.bb_pos, 50);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint64(this.bb_pos + offset, value);\n    return true;\n  }\n  testarrayofbools(index) {\n    const offset = this.bb.__offset(this.bb_pos, 52);\n    return offset ?\n        !!this.bb.readInt8(this.bb.__vector(this.bb_pos + offset) + index) :\n        false;\n  }\n  testarrayofboolsLength() {\n    const offset = this.bb.__offset(this.bb_pos, 52);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  testarrayofboolsArray() {\n    const offset = this.bb.__offset(this.bb_pos, 52);\n    return offset ?\n        new Int8Array(\n            this.bb.bytes().buffer,\n            this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset),\n            this.bb.__vector_len(this.bb_pos + offset)) :\n        null;\n  }\n  testf() {\n    const offset = this.bb.__offset(this.bb_pos, 54);\n    return offset ? this.bb.readFloat32(this.bb_pos + offset) : 3.14159;\n  }\n  mutate_testf(value) {\n    const offset = this.bb.__offset(this.bb_pos, 54);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeFloat32(this.bb_pos + offset, value);\n    return true;\n  }\n  testf2() {\n    const offset = this.bb.__offset(this.bb_pos, 56);\n    return offset ? this.bb.readFloat32(this.bb_pos + offset) : 3.0;\n  }\n  mutate_testf2(value) {\n    const offset = this.bb.__offset(this.bb_pos, 56);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeFloat32(this.bb_pos + offset, value);\n    return true;\n  }\n  testf3() {\n    const offset = this.bb.__offset(this.bb_pos, 58);\n    return offset ? this.bb.readFloat32(this.bb_pos + offset) : 0.0;\n  }\n  mutate_testf3(value) {\n    const offset = this.bb.__offset(this.bb_pos, 58);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeFloat32(this.bb_pos + offset, value);\n    return true;\n  }\n  testarrayofstring2(index, optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 60);\n    return offset ? this.bb.__string(\n                        this.bb.__vector(this.bb_pos + offset) + index * 4,\n                        optionalEncoding) :\n                    null;\n  }\n  testarrayofstring2Length() {\n    const offset = this.bb.__offset(this.bb_pos, 60);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  testarrayofsortedstruct(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 62);\n    return offset ?\n        (obj || new Ability())\n            .__init(\n                this.bb.__vector(this.bb_pos + offset) + index * 8, this.bb) :\n        null;\n  }\n  testarrayofsortedstructLength() {\n    const offset = this.bb.__offset(this.bb_pos, 62);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  flex(index) {\n    const offset = this.bb.__offset(this.bb_pos, 64);\n    return offset ?\n        this.bb.readUint8(this.bb.__vector(this.bb_pos + offset) + index) :\n        0;\n  }\n  flexLength() {\n    const offset = this.bb.__offset(this.bb_pos, 64);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  flexArray() {\n    const offset = this.bb.__offset(this.bb_pos, 64);\n    return offset ?\n        new Uint8Array(\n            this.bb.bytes().buffer,\n            this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset),\n            this.bb.__vector_len(this.bb_pos + offset)) :\n        null;\n  }\n  test5(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 66);\n    return offset ?\n        (obj || new Test())\n            .__init(\n                this.bb.__vector(this.bb_pos + offset) + index * 4, this.bb) :\n        null;\n  }\n  test5Length() {\n    const offset = this.bb.__offset(this.bb_pos, 66);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  vectorOfLongs(index) {\n    const offset = this.bb.__offset(this.bb_pos, 68);\n    return offset ?\n        this.bb.readInt64(this.bb.__vector(this.bb_pos + offset) + index * 8) :\n        BigInt(0);\n  }\n  vectorOfLongsLength() {\n    const offset = this.bb.__offset(this.bb_pos, 68);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  vectorOfDoubles(index) {\n    const offset = this.bb.__offset(this.bb_pos, 70);\n    return offset ? this.bb.readFloat64(\n                        this.bb.__vector(this.bb_pos + offset) + index * 8) :\n                    0;\n  }\n  vectorOfDoublesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 70);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  vectorOfDoublesArray() {\n    const offset = this.bb.__offset(this.bb_pos, 70);\n    return offset ?\n        new Float64Array(\n            this.bb.bytes().buffer,\n            this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset),\n            this.bb.__vector_len(this.bb_pos + offset)) :\n        null;\n  }\n  parentNamespaceTest(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 72);\n    return offset ?\n        (obj || new InParentNamespace())\n            .__init(this.bb.__indirect(this.bb_pos + offset), this.bb) :\n        null;\n  }\n  vectorOfReferrables(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 74);\n    return offset ?\n        (obj || new Referrable())\n            .__init(\n                this.bb.__indirect(\n                    this.bb.__vector(this.bb_pos + offset) + index * 4),\n                this.bb) :\n        null;\n  }\n  vectorOfReferrablesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 74);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  singleWeakReference() {\n    const offset = this.bb.__offset(this.bb_pos, 76);\n    return offset ? this.bb.readUint64(this.bb_pos + offset) : BigInt('0');\n  }\n  mutate_single_weak_reference(value) {\n    const offset = this.bb.__offset(this.bb_pos, 76);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint64(this.bb_pos + offset, value);\n    return true;\n  }\n  vectorOfWeakReferences(index) {\n    const offset = this.bb.__offset(this.bb_pos, 78);\n    return offset ?\n        this.bb.readUint64(this.bb.__vector(this.bb_pos + offset) + index * 8) :\n        BigInt(0);\n  }\n  vectorOfWeakReferencesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 78);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  vectorOfStrongReferrables(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 80);\n    return offset ?\n        (obj || new Referrable())\n            .__init(\n                this.bb.__indirect(\n                    this.bb.__vector(this.bb_pos + offset) + index * 4),\n                this.bb) :\n        null;\n  }\n  vectorOfStrongReferrablesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 80);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  coOwningReference() {\n    const offset = this.bb.__offset(this.bb_pos, 82);\n    return offset ? this.bb.readUint64(this.bb_pos + offset) : BigInt('0');\n  }\n  mutate_co_owning_reference(value) {\n    const offset = this.bb.__offset(this.bb_pos, 82);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint64(this.bb_pos + offset, value);\n    return true;\n  }\n  vectorOfCoOwningReferences(index) {\n    const offset = this.bb.__offset(this.bb_pos, 84);\n    return offset ?\n        this.bb.readUint64(this.bb.__vector(this.bb_pos + offset) + index * 8) :\n        BigInt(0);\n  }\n  vectorOfCoOwningReferencesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 84);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  nonOwningReference() {\n    const offset = this.bb.__offset(this.bb_pos, 86);\n    return offset ? this.bb.readUint64(this.bb_pos + offset) : BigInt('0');\n  }\n  mutate_non_owning_reference(value) {\n    const offset = this.bb.__offset(this.bb_pos, 86);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint64(this.bb_pos + offset, value);\n    return true;\n  }\n  vectorOfNonOwningReferences(index) {\n    const offset = this.bb.__offset(this.bb_pos, 88);\n    return offset ?\n        this.bb.readUint64(this.bb.__vector(this.bb_pos + offset) + index * 8) :\n        BigInt(0);\n  }\n  vectorOfNonOwningReferencesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 88);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  anyUniqueType() {\n    const offset = this.bb.__offset(this.bb_pos, 90);\n    return offset ? this.bb.readUint8(this.bb_pos + offset) :\n                    AnyUniqueAliases.NONE;\n  }\n  anyUnique(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 92);\n    return offset ? this.bb.__union(obj, this.bb_pos + offset) : null;\n  }\n  anyAmbiguousType() {\n    const offset = this.bb.__offset(this.bb_pos, 94);\n    return offset ? this.bb.readUint8(this.bb_pos + offset) :\n                    AnyAmbiguousAliases.NONE;\n  }\n  anyAmbiguous(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 96);\n    return offset ? this.bb.__union(obj, this.bb_pos + offset) : null;\n  }\n  vectorOfEnums(index) {\n    const offset = this.bb.__offset(this.bb_pos, 98);\n    return offset ?\n        this.bb.readUint8(this.bb.__vector(this.bb_pos + offset) + index) :\n        null;\n  }\n  vectorOfEnumsLength() {\n    const offset = this.bb.__offset(this.bb_pos, 98);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  vectorOfEnumsArray() {\n    const offset = this.bb.__offset(this.bb_pos, 98);\n    return offset ?\n        new Uint8Array(\n            this.bb.bytes().buffer,\n            this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset),\n            this.bb.__vector_len(this.bb_pos + offset)) :\n        null;\n  }\n  signedEnum() {\n    const offset = this.bb.__offset(this.bb_pos, 100);\n    return offset ? this.bb.readInt8(this.bb_pos + offset) : Race.None;\n  }\n  mutate_signed_enum(value) {\n    const offset = this.bb.__offset(this.bb_pos, 100);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, value);\n    return true;\n  }\n  testrequirednestedflatbuffer(index) {\n    const offset = this.bb.__offset(this.bb_pos, 102);\n    return offset ?\n        this.bb.readUint8(this.bb.__vector(this.bb_pos + offset) + index) :\n        0;\n  }\n  testrequirednestedflatbufferLength() {\n    const offset = this.bb.__offset(this.bb_pos, 102);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  testrequirednestedflatbufferArray() {\n    const offset = this.bb.__offset(this.bb_pos, 102);\n    return offset ?\n        new Uint8Array(\n            this.bb.bytes().buffer,\n            this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset),\n            this.bb.__vector_len(this.bb_pos + offset)) :\n        null;\n  }\n  scalarKeySortedTables(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 104);\n    return offset ?\n        (obj || new Stat())\n            .__init(\n                this.bb.__indirect(\n                    this.bb.__vector(this.bb_pos + offset) + index * 4),\n                this.bb) :\n        null;\n  }\n  scalarKeySortedTablesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 104);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  nativeInline(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 106);\n    return offset ? (obj || new Test()).__init(this.bb_pos + offset, this.bb) :\n                    null;\n  }\n  longEnumNonEnumDefault() {\n    const offset = this.bb.__offset(this.bb_pos, 108);\n    return offset ? this.bb.readUint64(this.bb_pos + offset) : BigInt('0');\n  }\n  mutate_long_enum_non_enum_default(value) {\n    const offset = this.bb.__offset(this.bb_pos, 108);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint64(this.bb_pos + offset, value);\n    return true;\n  }\n  longEnumNormalDefault() {\n    const offset = this.bb.__offset(this.bb_pos, 110);\n    return offset ? this.bb.readUint64(this.bb_pos + offset) : BigInt('2');\n  }\n  mutate_long_enum_normal_default(value) {\n    const offset = this.bb.__offset(this.bb_pos, 110);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint64(this.bb_pos + offset, value);\n    return true;\n  }\n  nanDefault() {\n    const offset = this.bb.__offset(this.bb_pos, 112);\n    return offset ? this.bb.readFloat32(this.bb_pos + offset) : NaN;\n  }\n  mutate_nan_default(value) {\n    const offset = this.bb.__offset(this.bb_pos, 112);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeFloat32(this.bb_pos + offset, value);\n    return true;\n  }\n  infDefault() {\n    const offset = this.bb.__offset(this.bb_pos, 114);\n    return offset ? this.bb.readFloat32(this.bb_pos + offset) : Infinity;\n  }\n  mutate_inf_default(value) {\n    const offset = this.bb.__offset(this.bb_pos, 114);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeFloat32(this.bb_pos + offset, value);\n    return true;\n  }\n  positiveInfDefault() {\n    const offset = this.bb.__offset(this.bb_pos, 116);\n    return offset ? this.bb.readFloat32(this.bb_pos + offset) : Infinity;\n  }\n  mutate_positive_inf_default(value) {\n    const offset = this.bb.__offset(this.bb_pos, 116);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeFloat32(this.bb_pos + offset, value);\n    return true;\n  }\n  infinityDefault() {\n    const offset = this.bb.__offset(this.bb_pos, 118);\n    return offset ? this.bb.readFloat32(this.bb_pos + offset) : Infinity;\n  }\n  mutate_infinity_default(value) {\n    const offset = this.bb.__offset(this.bb_pos, 118);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeFloat32(this.bb_pos + offset, value);\n    return true;\n  }\n  positiveInfinityDefault() {\n    const offset = this.bb.__offset(this.bb_pos, 120);\n    return offset ? this.bb.readFloat32(this.bb_pos + offset) : Infinity;\n  }\n  mutate_positive_infinity_default(value) {\n    const offset = this.bb.__offset(this.bb_pos, 120);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeFloat32(this.bb_pos + offset, value);\n    return true;\n  }\n  negativeInfDefault() {\n    const offset = this.bb.__offset(this.bb_pos, 122);\n    return offset ? this.bb.readFloat32(this.bb_pos + offset) : -Infinity;\n  }\n  mutate_negative_inf_default(value) {\n    const offset = this.bb.__offset(this.bb_pos, 122);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeFloat32(this.bb_pos + offset, value);\n    return true;\n  }\n  negativeInfinityDefault() {\n    const offset = this.bb.__offset(this.bb_pos, 124);\n    return offset ? this.bb.readFloat32(this.bb_pos + offset) : -Infinity;\n  }\n  mutate_negative_infinity_default(value) {\n    const offset = this.bb.__offset(this.bb_pos, 124);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeFloat32(this.bb_pos + offset, value);\n    return true;\n  }\n  doubleInfDefault() {\n    const offset = this.bb.__offset(this.bb_pos, 126);\n    return offset ? this.bb.readFloat64(this.bb_pos + offset) : Infinity;\n  }\n  mutate_double_inf_default(value) {\n    const offset = this.bb.__offset(this.bb_pos, 126);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeFloat64(this.bb_pos + offset, value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return 'MyGame.Example.Monster';\n  }\n  static startMonster(builder) {\n    builder.startObject(62);\n  }\n  static addPos(builder, posOffset) {\n    builder.addFieldStruct(0, posOffset, 0);\n  }\n  static addMana(builder, mana) {\n    builder.addFieldInt16(1, mana, 150);\n  }\n  static addHp(builder, hp) {\n    builder.addFieldInt16(2, hp, 100);\n  }\n  static addName(builder, nameOffset) {\n    builder.addFieldOffset(3, nameOffset, 0);\n  }\n  static addInventory(builder, inventoryOffset) {\n    builder.addFieldOffset(5, inventoryOffset, 0);\n  }\n  static createInventoryVector(builder, data) {\n    builder.startVector(1, data.length, 1);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addInt8(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startInventoryVector(builder, numElems) {\n    builder.startVector(1, numElems, 1);\n  }\n  static addColor(builder, color) {\n    builder.addFieldInt8(6, color, Color.Blue);\n  }\n  static addTestType(builder, testType) {\n    builder.addFieldInt8(7, testType, Any.NONE);\n  }\n  static addTest(builder, testOffset) {\n    builder.addFieldOffset(8, testOffset, 0);\n  }\n  static addTest4(builder, test4Offset) {\n    builder.addFieldOffset(9, test4Offset, 0);\n  }\n  static startTest4Vector(builder, numElems) {\n    builder.startVector(4, numElems, 2);\n  }\n  static addTestarrayofstring(builder, testarrayofstringOffset) {\n    builder.addFieldOffset(10, testarrayofstringOffset, 0);\n  }\n  static createTestarrayofstringVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startTestarrayofstringVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addTestarrayoftables(builder, testarrayoftablesOffset) {\n    builder.addFieldOffset(11, testarrayoftablesOffset, 0);\n  }\n  static createTestarrayoftablesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startTestarrayoftablesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addEnemy(builder, enemyOffset) {\n    builder.addFieldOffset(12, enemyOffset, 0);\n  }\n  static addTestnestedflatbuffer(builder, testnestedflatbufferOffset) {\n    builder.addFieldOffset(13, testnestedflatbufferOffset, 0);\n  }\n  static createTestnestedflatbufferVector(builder, data) {\n    builder.startVector(1, data.length, 1);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addInt8(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startTestnestedflatbufferVector(builder, numElems) {\n    builder.startVector(1, numElems, 1);\n  }\n  static addTestempty(builder, testemptyOffset) {\n    builder.addFieldOffset(14, testemptyOffset, 0);\n  }\n  static addTestbool(builder, testbool) {\n    builder.addFieldInt8(15, +testbool, +false);\n  }\n  static addTesthashs32Fnv1(builder, testhashs32Fnv1) {\n    builder.addFieldInt32(16, testhashs32Fnv1, 0);\n  }\n  static addTesthashu32Fnv1(builder, testhashu32Fnv1) {\n    builder.addFieldInt32(17, testhashu32Fnv1, 0);\n  }\n  static addTesthashs64Fnv1(builder, testhashs64Fnv1) {\n    builder.addFieldInt64(18, testhashs64Fnv1, BigInt('0'));\n  }\n  static addTesthashu64Fnv1(builder, testhashu64Fnv1) {\n    builder.addFieldInt64(19, testhashu64Fnv1, BigInt('0'));\n  }\n  static addTesthashs32Fnv1a(builder, testhashs32Fnv1a) {\n    builder.addFieldInt32(20, testhashs32Fnv1a, 0);\n  }\n  static addTesthashu32Fnv1a(builder, testhashu32Fnv1a) {\n    builder.addFieldInt32(21, testhashu32Fnv1a, 0);\n  }\n  static addTesthashs64Fnv1a(builder, testhashs64Fnv1a) {\n    builder.addFieldInt64(22, testhashs64Fnv1a, BigInt('0'));\n  }\n  static addTesthashu64Fnv1a(builder, testhashu64Fnv1a) {\n    builder.addFieldInt64(23, testhashu64Fnv1a, BigInt('0'));\n  }\n  static addTestarrayofbools(builder, testarrayofboolsOffset) {\n    builder.addFieldOffset(24, testarrayofboolsOffset, 0);\n  }\n  static createTestarrayofboolsVector(builder, data) {\n    builder.startVector(1, data.length, 1);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addInt8(+data[i]);\n    }\n    return builder.endVector();\n  }\n  static startTestarrayofboolsVector(builder, numElems) {\n    builder.startVector(1, numElems, 1);\n  }\n  static addTestf(builder, testf) {\n    builder.addFieldFloat32(25, testf, 3.14159);\n  }\n  static addTestf2(builder, testf2) {\n    builder.addFieldFloat32(26, testf2, 3.0);\n  }\n  static addTestf3(builder, testf3) {\n    builder.addFieldFloat32(27, testf3, 0.0);\n  }\n  static addTestarrayofstring2(builder, testarrayofstring2Offset) {\n    builder.addFieldOffset(28, testarrayofstring2Offset, 0);\n  }\n  static createTestarrayofstring2Vector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startTestarrayofstring2Vector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addTestarrayofsortedstruct(builder, testarrayofsortedstructOffset) {\n    builder.addFieldOffset(29, testarrayofsortedstructOffset, 0);\n  }\n  static startTestarrayofsortedstructVector(builder, numElems) {\n    builder.startVector(8, numElems, 4);\n  }\n  static addFlex(builder, flexOffset) {\n    builder.addFieldOffset(30, flexOffset, 0);\n  }\n  static createFlexVector(builder, data) {\n    builder.startVector(1, data.length, 1);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addInt8(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startFlexVector(builder, numElems) {\n    builder.startVector(1, numElems, 1);\n  }\n  static addTest5(builder, test5Offset) {\n    builder.addFieldOffset(31, test5Offset, 0);\n  }\n  static startTest5Vector(builder, numElems) {\n    builder.startVector(4, numElems, 2);\n  }\n  static addVectorOfLongs(builder, vectorOfLongsOffset) {\n    builder.addFieldOffset(32, vectorOfLongsOffset, 0);\n  }\n  static createVectorOfLongsVector(builder, data) {\n    builder.startVector(8, data.length, 8);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addInt64(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startVectorOfLongsVector(builder, numElems) {\n    builder.startVector(8, numElems, 8);\n  }\n  static addVectorOfDoubles(builder, vectorOfDoublesOffset) {\n    builder.addFieldOffset(33, vectorOfDoublesOffset, 0);\n  }\n  static createVectorOfDoublesVector(builder, data) {\n    builder.startVector(8, data.length, 8);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addFloat64(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startVectorOfDoublesVector(builder, numElems) {\n    builder.startVector(8, numElems, 8);\n  }\n  static addParentNamespaceTest(builder, parentNamespaceTestOffset) {\n    builder.addFieldOffset(34, parentNamespaceTestOffset, 0);\n  }\n  static addVectorOfReferrables(builder, vectorOfReferrablesOffset) {\n    builder.addFieldOffset(35, vectorOfReferrablesOffset, 0);\n  }\n  static createVectorOfReferrablesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startVectorOfReferrablesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addSingleWeakReference(builder, singleWeakReference) {\n    builder.addFieldInt64(36, singleWeakReference, BigInt('0'));\n  }\n  static addVectorOfWeakReferences(builder, vectorOfWeakReferencesOffset) {\n    builder.addFieldOffset(37, vectorOfWeakReferencesOffset, 0);\n  }\n  static createVectorOfWeakReferencesVector(builder, data) {\n    builder.startVector(8, data.length, 8);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addInt64(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startVectorOfWeakReferencesVector(builder, numElems) {\n    builder.startVector(8, numElems, 8);\n  }\n  static addVectorOfStrongReferrables(\n      builder, vectorOfStrongReferrablesOffset) {\n    builder.addFieldOffset(38, vectorOfStrongReferrablesOffset, 0);\n  }\n  static createVectorOfStrongReferrablesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startVectorOfStrongReferrablesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addCoOwningReference(builder, coOwningReference) {\n    builder.addFieldInt64(39, coOwningReference, BigInt('0'));\n  }\n  static addVectorOfCoOwningReferences(\n      builder, vectorOfCoOwningReferencesOffset) {\n    builder.addFieldOffset(40, vectorOfCoOwningReferencesOffset, 0);\n  }\n  static createVectorOfCoOwningReferencesVector(builder, data) {\n    builder.startVector(8, data.length, 8);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addInt64(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startVectorOfCoOwningReferencesVector(builder, numElems) {\n    builder.startVector(8, numElems, 8);\n  }\n  static addNonOwningReference(builder, nonOwningReference) {\n    builder.addFieldInt64(41, nonOwningReference, BigInt('0'));\n  }\n  static addVectorOfNonOwningReferences(\n      builder, vectorOfNonOwningReferencesOffset) {\n    builder.addFieldOffset(42, vectorOfNonOwningReferencesOffset, 0);\n  }\n  static createVectorOfNonOwningReferencesVector(builder, data) {\n    builder.startVector(8, data.length, 8);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addInt64(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startVectorOfNonOwningReferencesVector(builder, numElems) {\n    builder.startVector(8, numElems, 8);\n  }\n  static addAnyUniqueType(builder, anyUniqueType) {\n    builder.addFieldInt8(43, anyUniqueType, AnyUniqueAliases.NONE);\n  }\n  static addAnyUnique(builder, anyUniqueOffset) {\n    builder.addFieldOffset(44, anyUniqueOffset, 0);\n  }\n  static addAnyAmbiguousType(builder, anyAmbiguousType) {\n    builder.addFieldInt8(45, anyAmbiguousType, AnyAmbiguousAliases.NONE);\n  }\n  static addAnyAmbiguous(builder, anyAmbiguousOffset) {\n    builder.addFieldOffset(46, anyAmbiguousOffset, 0);\n  }\n  static addVectorOfEnums(builder, vectorOfEnumsOffset) {\n    builder.addFieldOffset(47, vectorOfEnumsOffset, 0);\n  }\n  static createVectorOfEnumsVector(builder, data) {\n    builder.startVector(1, data.length, 1);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addInt8(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startVectorOfEnumsVector(builder, numElems) {\n    builder.startVector(1, numElems, 1);\n  }\n  static addSignedEnum(builder, signedEnum) {\n    builder.addFieldInt8(48, signedEnum, Race.None);\n  }\n  static addTestrequirednestedflatbuffer(\n      builder, testrequirednestedflatbufferOffset) {\n    builder.addFieldOffset(49, testrequirednestedflatbufferOffset, 0);\n  }\n  static createTestrequirednestedflatbufferVector(builder, data) {\n    builder.startVector(1, data.length, 1);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addInt8(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startTestrequirednestedflatbufferVector(builder, numElems) {\n    builder.startVector(1, numElems, 1);\n  }\n  static addScalarKeySortedTables(builder, scalarKeySortedTablesOffset) {\n    builder.addFieldOffset(50, scalarKeySortedTablesOffset, 0);\n  }\n  static createScalarKeySortedTablesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startScalarKeySortedTablesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addNativeInline(builder, nativeInlineOffset) {\n    builder.addFieldStruct(51, nativeInlineOffset, 0);\n  }\n  static addLongEnumNonEnumDefault(builder, longEnumNonEnumDefault) {\n    builder.addFieldInt64(52, longEnumNonEnumDefault, BigInt('0'));\n  }\n  static addLongEnumNormalDefault(builder, longEnumNormalDefault) {\n    builder.addFieldInt64(53, longEnumNormalDefault, BigInt('2'));\n  }\n  static addNanDefault(builder, nanDefault) {\n    builder.addFieldFloat32(54, nanDefault, NaN);\n  }\n  static addInfDefault(builder, infDefault) {\n    builder.addFieldFloat32(55, infDefault, Infinity);\n  }\n  static addPositiveInfDefault(builder, positiveInfDefault) {\n    builder.addFieldFloat32(56, positiveInfDefault, Infinity);\n  }\n  static addInfinityDefault(builder, infinityDefault) {\n    builder.addFieldFloat32(57, infinityDefault, Infinity);\n  }\n  static addPositiveInfinityDefault(builder, positiveInfinityDefault) {\n    builder.addFieldFloat32(58, positiveInfinityDefault, Infinity);\n  }\n  static addNegativeInfDefault(builder, negativeInfDefault) {\n    builder.addFieldFloat32(59, negativeInfDefault, -Infinity);\n  }\n  static addNegativeInfinityDefault(builder, negativeInfinityDefault) {\n    builder.addFieldFloat32(60, negativeInfinityDefault, -Infinity);\n  }\n  static addDoubleInfDefault(builder, doubleInfDefault) {\n    builder.addFieldFloat64(61, doubleInfDefault, Infinity);\n  }\n  static endMonster(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 10);  // name\n    return offset;\n  }\n  static finishMonsterBuffer(builder, offset) {\n    builder.finish(offset, 'MONS');\n  }\n  static finishSizePrefixedMonsterBuffer(builder, offset) {\n    builder.finish(offset, 'MONS', true);\n  }\n  serialize() {\n    return this.bb.bytes();\n  }\n  static deserialize(buffer) {\n    return Monster.getRootAsMonster(new flatbuffers.ByteBuffer(buffer));\n  }\n  unpack() {\n    return new MonsterT(\n        (this.pos() !== null ? this.pos().unpack() : null), this.mana(),\n        this.hp(), this.name(),\n        this.bb.createScalarList(\n            this.inventory.bind(this), this.inventoryLength()),\n        this.color(), this.testType(), (() => {\n          const temp = unionToAny(this.testType(), this.test.bind(this));\n          if (temp === null) {\n            return null;\n          }\n          return temp.unpack();\n        })(),\n        this.bb.createObjList(this.test4.bind(this), this.test4Length()),\n        this.bb.createScalarList(\n            this.testarrayofstring.bind(this), this.testarrayofstringLength()),\n        this.bb.createObjList(\n            this.testarrayoftables.bind(this), this.testarrayoftablesLength()),\n        (this.enemy() !== null ? this.enemy().unpack() : null),\n        this.bb.createScalarList(\n            this.testnestedflatbuffer.bind(this),\n            this.testnestedflatbufferLength()),\n        (this.testempty() !== null ? this.testempty().unpack() : null),\n        this.testbool(), this.testhashs32Fnv1(), this.testhashu32Fnv1(),\n        this.testhashs64Fnv1(), this.testhashu64Fnv1(), this.testhashs32Fnv1a(),\n        this.testhashu32Fnv1a(), this.testhashs64Fnv1a(),\n        this.testhashu64Fnv1a(),\n        this.bb.createScalarList(\n            this.testarrayofbools.bind(this), this.testarrayofboolsLength()),\n        this.testf(), this.testf2(), this.testf3(),\n        this.bb.createScalarList(\n            this.testarrayofstring2.bind(this),\n            this.testarrayofstring2Length()),\n        this.bb.createObjList(\n            this.testarrayofsortedstruct.bind(this),\n            this.testarrayofsortedstructLength()),\n        this.bb.createScalarList(this.flex.bind(this), this.flexLength()),\n        this.bb.createObjList(this.test5.bind(this), this.test5Length()),\n        this.bb.createScalarList(\n            this.vectorOfLongs.bind(this), this.vectorOfLongsLength()),\n        this.bb.createScalarList(\n            this.vectorOfDoubles.bind(this), this.vectorOfDoublesLength()),\n        (this.parentNamespaceTest() !== null ?\n             this.parentNamespaceTest().unpack() :\n             null),\n        this.bb.createObjList(\n            this.vectorOfReferrables.bind(this),\n            this.vectorOfReferrablesLength()),\n        this.singleWeakReference(),\n        this.bb.createScalarList(\n            this.vectorOfWeakReferences.bind(this),\n            this.vectorOfWeakReferencesLength()),\n        this.bb.createObjList(\n            this.vectorOfStrongReferrables.bind(this),\n            this.vectorOfStrongReferrablesLength()),\n        this.coOwningReference(),\n        this.bb.createScalarList(\n            this.vectorOfCoOwningReferences.bind(this),\n            this.vectorOfCoOwningReferencesLength()),\n        this.nonOwningReference(),\n        this.bb.createScalarList(\n            this.vectorOfNonOwningReferences.bind(this),\n            this.vectorOfNonOwningReferencesLength()),\n        this.anyUniqueType(), (() => {\n          const temp = unionToAnyUniqueAliases(\n              this.anyUniqueType(), this.anyUnique.bind(this));\n          if (temp === null) {\n            return null;\n          }\n          return temp.unpack();\n        })(),\n        this.anyAmbiguousType(), (() => {\n          const temp = unionToAnyAmbiguousAliases(\n              this.anyAmbiguousType(), this.anyAmbiguous.bind(this));\n          if (temp === null) {\n            return null;\n          }\n          return temp.unpack();\n        })(),\n        this.bb.createScalarList(\n            this.vectorOfEnums.bind(this), this.vectorOfEnumsLength()),\n        this.signedEnum(),\n        this.bb.createScalarList(\n            this.testrequirednestedflatbuffer.bind(this),\n            this.testrequirednestedflatbufferLength()),\n        this.bb.createObjList(\n            this.scalarKeySortedTables.bind(this),\n            this.scalarKeySortedTablesLength()),\n        (this.nativeInline() !== null ? this.nativeInline().unpack() : null),\n        this.longEnumNonEnumDefault(), this.longEnumNormalDefault(),\n        this.nanDefault(), this.infDefault(), this.positiveInfDefault(),\n        this.infinityDefault(), this.positiveInfinityDefault(),\n        this.negativeInfDefault(), this.negativeInfinityDefault(),\n        this.doubleInfDefault());\n  }\n  unpackTo(_o) {\n    _o.pos = (this.pos() !== null ? this.pos().unpack() : null);\n    _o.mana = this.mana();\n    _o.hp = this.hp();\n    _o.name = this.name();\n    _o.inventory = this.bb.createScalarList(\n        this.inventory.bind(this), this.inventoryLength());\n    _o.color = this.color();\n    _o.testType = this.testType();\n    _o.test = (() => {\n      const temp = unionToAny(this.testType(), this.test.bind(this));\n      if (temp === null) {\n        return null;\n      }\n      return temp.unpack();\n    })();\n    _o.test4 = this.bb.createObjList(this.test4.bind(this), this.test4Length());\n    _o.testarrayofstring = this.bb.createScalarList(\n        this.testarrayofstring.bind(this), this.testarrayofstringLength());\n    _o.testarrayoftables = this.bb.createObjList(\n        this.testarrayoftables.bind(this), this.testarrayoftablesLength());\n    _o.enemy = (this.enemy() !== null ? this.enemy().unpack() : null);\n    _o.testnestedflatbuffer = this.bb.createScalarList(\n        this.testnestedflatbuffer.bind(this),\n        this.testnestedflatbufferLength());\n    _o.testempty =\n        (this.testempty() !== null ? this.testempty().unpack() : null);\n    _o.testbool = this.testbool();\n    _o.testhashs32Fnv1 = this.testhashs32Fnv1();\n    _o.testhashu32Fnv1 = this.testhashu32Fnv1();\n    _o.testhashs64Fnv1 = this.testhashs64Fnv1();\n    _o.testhashu64Fnv1 = this.testhashu64Fnv1();\n    _o.testhashs32Fnv1a = this.testhashs32Fnv1a();\n    _o.testhashu32Fnv1a = this.testhashu32Fnv1a();\n    _o.testhashs64Fnv1a = this.testhashs64Fnv1a();\n    _o.testhashu64Fnv1a = this.testhashu64Fnv1a();\n    _o.testarrayofbools = this.bb.createScalarList(\n        this.testarrayofbools.bind(this), this.testarrayofboolsLength());\n    _o.testf = this.testf();\n    _o.testf2 = this.testf2();\n    _o.testf3 = this.testf3();\n    _o.testarrayofstring2 = this.bb.createScalarList(\n        this.testarrayofstring2.bind(this), this.testarrayofstring2Length());\n    _o.testarrayofsortedstruct = this.bb.createObjList(\n        this.testarrayofsortedstruct.bind(this),\n        this.testarrayofsortedstructLength());\n    _o.flex = this.bb.createScalarList(this.flex.bind(this), this.flexLength());\n    _o.test5 = this.bb.createObjList(this.test5.bind(this), this.test5Length());\n    _o.vectorOfLongs = this.bb.createScalarList(\n        this.vectorOfLongs.bind(this), this.vectorOfLongsLength());\n    _o.vectorOfDoubles = this.bb.createScalarList(\n        this.vectorOfDoubles.bind(this), this.vectorOfDoublesLength());\n    _o.parentNamespaceTest =\n        (this.parentNamespaceTest() !== null ?\n             this.parentNamespaceTest().unpack() :\n             null);\n    _o.vectorOfReferrables = this.bb.createObjList(\n        this.vectorOfReferrables.bind(this), this.vectorOfReferrablesLength());\n    _o.singleWeakReference = this.singleWeakReference();\n    _o.vectorOfWeakReferences = this.bb.createScalarList(\n        this.vectorOfWeakReferences.bind(this),\n        this.vectorOfWeakReferencesLength());\n    _o.vectorOfStrongReferrables = this.bb.createObjList(\n        this.vectorOfStrongReferrables.bind(this),\n        this.vectorOfStrongReferrablesLength());\n    _o.coOwningReference = this.coOwningReference();\n    _o.vectorOfCoOwningReferences = this.bb.createScalarList(\n        this.vectorOfCoOwningReferences.bind(this),\n        this.vectorOfCoOwningReferencesLength());\n    _o.nonOwningReference = this.nonOwningReference();\n    _o.vectorOfNonOwningReferences = this.bb.createScalarList(\n        this.vectorOfNonOwningReferences.bind(this),\n        this.vectorOfNonOwningReferencesLength());\n    _o.anyUniqueType = this.anyUniqueType();\n    _o.anyUnique = (() => {\n      const temp = unionToAnyUniqueAliases(\n          this.anyUniqueType(), this.anyUnique.bind(this));\n      if (temp === null) {\n        return null;\n      }\n      return temp.unpack();\n    })();\n    _o.anyAmbiguousType = this.anyAmbiguousType();\n    _o.anyAmbiguous = (() => {\n      const temp = unionToAnyAmbiguousAliases(\n          this.anyAmbiguousType(), this.anyAmbiguous.bind(this));\n      if (temp === null) {\n        return null;\n      }\n      return temp.unpack();\n    })();\n    _o.vectorOfEnums = this.bb.createScalarList(\n        this.vectorOfEnums.bind(this), this.vectorOfEnumsLength());\n    _o.signedEnum = this.signedEnum();\n    _o.testrequirednestedflatbuffer = this.bb.createScalarList(\n        this.testrequirednestedflatbuffer.bind(this),\n        this.testrequirednestedflatbufferLength());\n    _o.scalarKeySortedTables = this.bb.createObjList(\n        this.scalarKeySortedTables.bind(this),\n        this.scalarKeySortedTablesLength());\n    _o.nativeInline =\n        (this.nativeInline() !== null ? this.nativeInline().unpack() : null);\n    _o.longEnumNonEnumDefault = this.longEnumNonEnumDefault();\n    _o.longEnumNormalDefault = this.longEnumNormalDefault();\n    _o.nanDefault = this.nanDefault();\n    _o.infDefault = this.infDefault();\n    _o.positiveInfDefault = this.positiveInfDefault();\n    _o.infinityDefault = this.infinityDefault();\n    _o.positiveInfinityDefault = this.positiveInfinityDefault();\n    _o.negativeInfDefault = this.negativeInfDefault();\n    _o.negativeInfinityDefault = this.negativeInfinityDefault();\n    _o.doubleInfDefault = this.doubleInfDefault();\n  }\n}\nexport class MonsterT {\n  constructor(\n      pos = null, mana = 150, hp = 100, name = null, inventory = [],\n      color = Color.Blue, testType = Any.NONE, test = null, test4 = [],\n      testarrayofstring = [], testarrayoftables = [], enemy = null,\n      testnestedflatbuffer = [], testempty = null, testbool = false,\n      testhashs32Fnv1 = 0, testhashu32Fnv1 = 0, testhashs64Fnv1 = BigInt('0'),\n      testhashu64Fnv1 = BigInt('0'), testhashs32Fnv1a = 0, testhashu32Fnv1a = 0,\n      testhashs64Fnv1a = BigInt('0'), testhashu64Fnv1a = BigInt('0'),\n      testarrayofbools = [], testf = 3.14159, testf2 = 3.0, testf3 = 0.0,\n      testarrayofstring2 = [], testarrayofsortedstruct = [], flex = [],\n      test5 = [], vectorOfLongs = [], vectorOfDoubles = [],\n      parentNamespaceTest = null, vectorOfReferrables = [],\n      singleWeakReference = BigInt('0'), vectorOfWeakReferences = [],\n      vectorOfStrongReferrables = [], coOwningReference = BigInt('0'),\n      vectorOfCoOwningReferences = [], nonOwningReference = BigInt('0'),\n      vectorOfNonOwningReferences = [], anyUniqueType = AnyUniqueAliases.NONE,\n      anyUnique = null, anyAmbiguousType = AnyAmbiguousAliases.NONE,\n      anyAmbiguous = null, vectorOfEnums = [], signedEnum = Race.None,\n      testrequirednestedflatbuffer = [], scalarKeySortedTables = [],\n      nativeInline = null, longEnumNonEnumDefault = BigInt('0'),\n      longEnumNormalDefault = BigInt('2'), nanDefault = NaN,\n      infDefault = Infinity, positiveInfDefault = Infinity,\n      infinityDefault = Infinity, positiveInfinityDefault = Infinity,\n      negativeInfDefault = -Infinity, negativeInfinityDefault = -Infinity,\n      doubleInfDefault = Infinity) {\n    this.pos = pos;\n    this.mana = mana;\n    this.hp = hp;\n    this.name = name;\n    this.inventory = inventory;\n    this.color = color;\n    this.testType = testType;\n    this.test = test;\n    this.test4 = test4;\n    this.testarrayofstring = testarrayofstring;\n    this.testarrayoftables = testarrayoftables;\n    this.enemy = enemy;\n    this.testnestedflatbuffer = testnestedflatbuffer;\n    this.testempty = testempty;\n    this.testbool = testbool;\n    this.testhashs32Fnv1 = testhashs32Fnv1;\n    this.testhashu32Fnv1 = testhashu32Fnv1;\n    this.testhashs64Fnv1 = testhashs64Fnv1;\n    this.testhashu64Fnv1 = testhashu64Fnv1;\n    this.testhashs32Fnv1a = testhashs32Fnv1a;\n    this.testhashu32Fnv1a = testhashu32Fnv1a;\n    this.testhashs64Fnv1a = testhashs64Fnv1a;\n    this.testhashu64Fnv1a = testhashu64Fnv1a;\n    this.testarrayofbools = testarrayofbools;\n    this.testf = testf;\n    this.testf2 = testf2;\n    this.testf3 = testf3;\n    this.testarrayofstring2 = testarrayofstring2;\n    this.testarrayofsortedstruct = testarrayofsortedstruct;\n    this.flex = flex;\n    this.test5 = test5;\n    this.vectorOfLongs = vectorOfLongs;\n    this.vectorOfDoubles = vectorOfDoubles;\n    this.parentNamespaceTest = parentNamespaceTest;\n    this.vectorOfReferrables = vectorOfReferrables;\n    this.singleWeakReference = singleWeakReference;\n    this.vectorOfWeakReferences = vectorOfWeakReferences;\n    this.vectorOfStrongReferrables = vectorOfStrongReferrables;\n    this.coOwningReference = coOwningReference;\n    this.vectorOfCoOwningReferences = vectorOfCoOwningReferences;\n    this.nonOwningReference = nonOwningReference;\n    this.vectorOfNonOwningReferences = vectorOfNonOwningReferences;\n    this.anyUniqueType = anyUniqueType;\n    this.anyUnique = anyUnique;\n    this.anyAmbiguousType = anyAmbiguousType;\n    this.anyAmbiguous = anyAmbiguous;\n    this.vectorOfEnums = vectorOfEnums;\n    this.signedEnum = signedEnum;\n    this.testrequirednestedflatbuffer = testrequirednestedflatbuffer;\n    this.scalarKeySortedTables = scalarKeySortedTables;\n    this.nativeInline = nativeInline;\n    this.longEnumNonEnumDefault = longEnumNonEnumDefault;\n    this.longEnumNormalDefault = longEnumNormalDefault;\n    this.nanDefault = nanDefault;\n    this.infDefault = infDefault;\n    this.positiveInfDefault = positiveInfDefault;\n    this.infinityDefault = infinityDefault;\n    this.positiveInfinityDefault = positiveInfinityDefault;\n    this.negativeInfDefault = negativeInfDefault;\n    this.negativeInfinityDefault = negativeInfinityDefault;\n    this.doubleInfDefault = doubleInfDefault;\n  }\n  pack(builder) {\n    const name = (this.name !== null ? builder.createString(this.name) : 0);\n    const inventory = Monster.createInventoryVector(builder, this.inventory);\n    const test = builder.createObjectOffset(this.test);\n    const test4 =\n        builder.createStructOffsetList(this.test4, Monster.startTest4Vector);\n    const testarrayofstring = Monster.createTestarrayofstringVector(\n        builder, builder.createObjectOffsetList(this.testarrayofstring));\n    const testarrayoftables = Monster.createTestarrayoftablesVector(\n        builder, builder.createObjectOffsetList(this.testarrayoftables));\n    const enemy = (this.enemy !== null ? this.enemy.pack(builder) : 0);\n    const testnestedflatbuffer = Monster.createTestnestedflatbufferVector(\n        builder, this.testnestedflatbuffer);\n    const testempty =\n        (this.testempty !== null ? this.testempty.pack(builder) : 0);\n    const testarrayofbools =\n        Monster.createTestarrayofboolsVector(builder, this.testarrayofbools);\n    const testarrayofstring2 = Monster.createTestarrayofstring2Vector(\n        builder, builder.createObjectOffsetList(this.testarrayofstring2));\n    const testarrayofsortedstruct = builder.createStructOffsetList(\n        this.testarrayofsortedstruct,\n        Monster.startTestarrayofsortedstructVector);\n    const flex = Monster.createFlexVector(builder, this.flex);\n    const test5 =\n        builder.createStructOffsetList(this.test5, Monster.startTest5Vector);\n    const vectorOfLongs =\n        Monster.createVectorOfLongsVector(builder, this.vectorOfLongs);\n    const vectorOfDoubles =\n        Monster.createVectorOfDoublesVector(builder, this.vectorOfDoubles);\n    const parentNamespaceTest =\n        (this.parentNamespaceTest !== null ?\n             this.parentNamespaceTest.pack(builder) :\n             0);\n    const vectorOfReferrables = Monster.createVectorOfReferrablesVector(\n        builder, builder.createObjectOffsetList(this.vectorOfReferrables));\n    const vectorOfWeakReferences = Monster.createVectorOfWeakReferencesVector(\n        builder, this.vectorOfWeakReferences);\n    const vectorOfStrongReferrables =\n        Monster.createVectorOfStrongReferrablesVector(\n            builder,\n            builder.createObjectOffsetList(this.vectorOfStrongReferrables));\n    const vectorOfCoOwningReferences =\n        Monster.createVectorOfCoOwningReferencesVector(\n            builder, this.vectorOfCoOwningReferences);\n    const vectorOfNonOwningReferences =\n        Monster.createVectorOfNonOwningReferencesVector(\n            builder, this.vectorOfNonOwningReferences);\n    const anyUnique = builder.createObjectOffset(this.anyUnique);\n    const anyAmbiguous = builder.createObjectOffset(this.anyAmbiguous);\n    const vectorOfEnums =\n        Monster.createVectorOfEnumsVector(builder, this.vectorOfEnums);\n    const testrequirednestedflatbuffer =\n        Monster.createTestrequirednestedflatbufferVector(\n            builder, this.testrequirednestedflatbuffer);\n    const scalarKeySortedTables = Monster.createScalarKeySortedTablesVector(\n        builder, builder.createObjectOffsetList(this.scalarKeySortedTables));\n    Monster.startMonster(builder);\n    Monster.addPos(builder, (this.pos !== null ? this.pos.pack(builder) : 0));\n    Monster.addMana(builder, this.mana);\n    Monster.addHp(builder, this.hp);\n    Monster.addName(builder, name);\n    Monster.addInventory(builder, inventory);\n    Monster.addColor(builder, this.color);\n    Monster.addTestType(builder, this.testType);\n    Monster.addTest(builder, test);\n    Monster.addTest4(builder, test4);\n    Monster.addTestarrayofstring(builder, testarrayofstring);\n    Monster.addTestarrayoftables(builder, testarrayoftables);\n    Monster.addEnemy(builder, enemy);\n    Monster.addTestnestedflatbuffer(builder, testnestedflatbuffer);\n    Monster.addTestempty(builder, testempty);\n    Monster.addTestbool(builder, this.testbool);\n    Monster.addTesthashs32Fnv1(builder, this.testhashs32Fnv1);\n    Monster.addTesthashu32Fnv1(builder, this.testhashu32Fnv1);\n    Monster.addTesthashs64Fnv1(builder, this.testhashs64Fnv1);\n    Monster.addTesthashu64Fnv1(builder, this.testhashu64Fnv1);\n    Monster.addTesthashs32Fnv1a(builder, this.testhashs32Fnv1a);\n    Monster.addTesthashu32Fnv1a(builder, this.testhashu32Fnv1a);\n    Monster.addTesthashs64Fnv1a(builder, this.testhashs64Fnv1a);\n    Monster.addTesthashu64Fnv1a(builder, this.testhashu64Fnv1a);\n    Monster.addTestarrayofbools(builder, testarrayofbools);\n    Monster.addTestf(builder, this.testf);\n    Monster.addTestf2(builder, this.testf2);\n    Monster.addTestf3(builder, this.testf3);\n    Monster.addTestarrayofstring2(builder, testarrayofstring2);\n    Monster.addTestarrayofsortedstruct(builder, testarrayofsortedstruct);\n    Monster.addFlex(builder, flex);\n    Monster.addTest5(builder, test5);\n    Monster.addVectorOfLongs(builder, vectorOfLongs);\n    Monster.addVectorOfDoubles(builder, vectorOfDoubles);\n    Monster.addParentNamespaceTest(builder, parentNamespaceTest);\n    Monster.addVectorOfReferrables(builder, vectorOfReferrables);\n    Monster.addSingleWeakReference(builder, this.singleWeakReference);\n    Monster.addVectorOfWeakReferences(builder, vectorOfWeakReferences);\n    Monster.addVectorOfStrongReferrables(builder, vectorOfStrongReferrables);\n    Monster.addCoOwningReference(builder, this.coOwningReference);\n    Monster.addVectorOfCoOwningReferences(builder, vectorOfCoOwningReferences);\n    Monster.addNonOwningReference(builder, this.nonOwningReference);\n    Monster.addVectorOfNonOwningReferences(\n        builder, vectorOfNonOwningReferences);\n    Monster.addAnyUniqueType(builder, this.anyUniqueType);\n    Monster.addAnyUnique(builder, anyUnique);\n    Monster.addAnyAmbiguousType(builder, this.anyAmbiguousType);\n    Monster.addAnyAmbiguous(builder, anyAmbiguous);\n    Monster.addVectorOfEnums(builder, vectorOfEnums);\n    Monster.addSignedEnum(builder, this.signedEnum);\n    Monster.addTestrequirednestedflatbuffer(\n        builder, testrequirednestedflatbuffer);\n    Monster.addScalarKeySortedTables(builder, scalarKeySortedTables);\n    Monster.addNativeInline(\n        builder,\n        (this.nativeInline !== null ? this.nativeInline.pack(builder) : 0));\n    Monster.addLongEnumNonEnumDefault(builder, this.longEnumNonEnumDefault);\n    Monster.addLongEnumNormalDefault(builder, this.longEnumNormalDefault);\n    Monster.addNanDefault(builder, this.nanDefault);\n    Monster.addInfDefault(builder, this.infDefault);\n    Monster.addPositiveInfDefault(builder, this.positiveInfDefault);\n    Monster.addInfinityDefault(builder, this.infinityDefault);\n    Monster.addPositiveInfinityDefault(builder, this.positiveInfinityDefault);\n    Monster.addNegativeInfDefault(builder, this.negativeInfDefault);\n    Monster.addNegativeInfinityDefault(builder, this.negativeInfinityDefault);\n    Monster.addDoubleInfDefault(builder, this.doubleInfDefault);\n    return Monster.endMonster(builder);\n  }\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/monster.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport { Monster as MyGame_Example2_Monster, MonsterT as MyGame_Example2_MonsterT } from '../example2/monster.js';\nimport { Ability, AbilityT } from './ability.js';\nimport { Any, unionToAny, unionListToAny } from './any.js';\nimport { AnyAmbiguousAliases, unionToAnyAmbiguousAliases, unionListToAnyAmbiguousAliases } from './any-ambiguous-aliases.js';\nimport { AnyUniqueAliases, unionToAnyUniqueAliases, unionListToAnyUniqueAliases } from './any-unique-aliases.js';\nimport { Color } from './color.js';\nimport { Race } from './race.js';\nimport { Referrable, ReferrableT } from './referrable.js';\nimport { Stat, StatT } from './stat.js';\nimport { Test, TestT } from './test.js';\nimport { TestSimpleTableWithEnum, TestSimpleTableWithEnumT } from './test-simple-table-with-enum.js';\nimport { Vec3, Vec3T } from './vec3.js';\nimport { InParentNamespace, InParentNamespaceT } from '../in-parent-namespace.js';\n\n\n/**\n * an example documentation comment: \"monster object\"\n */\nexport class Monster implements flatbuffers.IUnpackableObject<MonsterT> {\n  bb: flatbuffers.ByteBuffer|null = null;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):Monster {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\nstatic getRootAsMonster(bb:flatbuffers.ByteBuffer, obj?:Monster):Monster {\n  return (obj || new Monster()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic getSizePrefixedRootAsMonster(bb:flatbuffers.ByteBuffer, obj?:Monster):Monster {\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n  return (obj || new Monster()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic bufferHasIdentifier(bb:flatbuffers.ByteBuffer):boolean {\n  return bb.__has_identifier('MONS');\n}\n\npos(obj?:Vec3):Vec3|null {\n  const offset = this.bb!.__offset(this.bb_pos, 4);\n  return offset ? (obj || new Vec3()).__init(this.bb_pos + offset, this.bb!) : null;\n}\n\nmana():number {\n  const offset = this.bb!.__offset(this.bb_pos, 6);\n  return offset ? this.bb!.readInt16(this.bb_pos + offset) : 150;\n}\n\nmutate_mana(value:number):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 6);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeInt16(this.bb_pos + offset, value);\n  return true;\n}\n\nhp():number {\n  const offset = this.bb!.__offset(this.bb_pos, 8);\n  return offset ? this.bb!.readInt16(this.bb_pos + offset) : 100;\n}\n\nmutate_hp(value:number):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 8);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeInt16(this.bb_pos + offset, value);\n  return true;\n}\n\nname():string\nname(optionalEncoding:flatbuffers.Encoding):string|Uint8Array\nname(optionalEncoding?:any):string|Uint8Array {\n  const offset = this.bb!.__offset(this.bb_pos, 10);\n  return this.bb!.__string(this.bb_pos + offset, optionalEncoding);\n}\n\ninventory(index: number):number|null {\n  const offset = this.bb!.__offset(this.bb_pos, 14);\n  return offset ? this.bb!.readUint8(this.bb!.__vector(this.bb_pos + offset) + index) : 0;\n}\n\ninventoryLength():number {\n  const offset = this.bb!.__offset(this.bb_pos, 14);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\ninventoryArray():Uint8Array|null {\n  const offset = this.bb!.__offset(this.bb_pos, 14);\n  return offset ? new Uint8Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\n}\n\ncolor():Color {\n  const offset = this.bb!.__offset(this.bb_pos, 16);\n  return offset ? this.bb!.readUint8(this.bb_pos + offset) : Color.Blue;\n}\n\nmutate_color(value:Color):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 16);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeUint8(this.bb_pos + offset, value);\n  return true;\n}\n\ntestType():Any {\n  const offset = this.bb!.__offset(this.bb_pos, 18);\n  return offset ? this.bb!.readUint8(this.bb_pos + offset) : Any.NONE;\n}\n\ntest<T extends flatbuffers.Table>(obj:any):any|null {\n  const offset = this.bb!.__offset(this.bb_pos, 20);\n  return offset ? this.bb!.__union(obj, this.bb_pos + offset) : null;\n}\n\ntest4(index: number, obj?:Test):Test|null {\n  const offset = this.bb!.__offset(this.bb_pos, 22);\n  return offset ? (obj || new Test()).__init(this.bb!.__vector(this.bb_pos + offset) + index * 4, this.bb!) : null;\n}\n\ntest4Length():number {\n  const offset = this.bb!.__offset(this.bb_pos, 22);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\ntestarrayofstring(index: number):string\ntestarrayofstring(index: number,optionalEncoding:flatbuffers.Encoding):string|Uint8Array\ntestarrayofstring(index: number,optionalEncoding?:any):string|Uint8Array|null {\n  const offset = this.bb!.__offset(this.bb_pos, 24);\n  return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n}\n\ntestarrayofstringLength():number {\n  const offset = this.bb!.__offset(this.bb_pos, 24);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\n/**\n * an example documentation comment: this will end up in the generated code\n * multiline too\n */\ntestarrayoftables(index: number, obj?:Monster):Monster|null {\n  const offset = this.bb!.__offset(this.bb_pos, 26);\n  return offset ? (obj || new Monster()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;\n}\n\ntestarrayoftablesLength():number {\n  const offset = this.bb!.__offset(this.bb_pos, 26);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\nenemy(obj?:Monster):Monster|null {\n  const offset = this.bb!.__offset(this.bb_pos, 28);\n  return offset ? (obj || new Monster()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null;\n}\n\ntestnestedflatbuffer(index: number):number|null {\n  const offset = this.bb!.__offset(this.bb_pos, 30);\n  return offset ? this.bb!.readUint8(this.bb!.__vector(this.bb_pos + offset) + index) : 0;\n}\n\ntestnestedflatbufferLength():number {\n  const offset = this.bb!.__offset(this.bb_pos, 30);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\ntestnestedflatbufferArray():Uint8Array|null {\n  const offset = this.bb!.__offset(this.bb_pos, 30);\n  return offset ? new Uint8Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\n}\n\ntestempty(obj?:Stat):Stat|null {\n  const offset = this.bb!.__offset(this.bb_pos, 32);\n  return offset ? (obj || new Stat()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null;\n}\n\ntestbool():boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 34);\n  return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false;\n}\n\nmutate_testbool(value:boolean):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 34);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeInt8(this.bb_pos + offset, +value);\n  return true;\n}\n\ntesthashs32Fnv1():number {\n  const offset = this.bb!.__offset(this.bb_pos, 36);\n  return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;\n}\n\nmutate_testhashs32_fnv1(value:number):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 36);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeInt32(this.bb_pos + offset, value);\n  return true;\n}\n\ntesthashu32Fnv1():number {\n  const offset = this.bb!.__offset(this.bb_pos, 38);\n  return offset ? this.bb!.readUint32(this.bb_pos + offset) : 0;\n}\n\nmutate_testhashu32_fnv1(value:number):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 38);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeUint32(this.bb_pos + offset, value);\n  return true;\n}\n\ntesthashs64Fnv1():bigint {\n  const offset = this.bb!.__offset(this.bb_pos, 40);\n  return offset ? this.bb!.readInt64(this.bb_pos + offset) : BigInt('0');\n}\n\nmutate_testhashs64_fnv1(value:bigint):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 40);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeInt64(this.bb_pos + offset, value);\n  return true;\n}\n\ntesthashu64Fnv1():bigint {\n  const offset = this.bb!.__offset(this.bb_pos, 42);\n  return offset ? this.bb!.readUint64(this.bb_pos + offset) : BigInt('0');\n}\n\nmutate_testhashu64_fnv1(value:bigint):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 42);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeUint64(this.bb_pos + offset, value);\n  return true;\n}\n\ntesthashs32Fnv1a():number {\n  const offset = this.bb!.__offset(this.bb_pos, 44);\n  return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;\n}\n\nmutate_testhashs32_fnv1a(value:number):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 44);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeInt32(this.bb_pos + offset, value);\n  return true;\n}\n\ntesthashu32Fnv1a():number {\n  const offset = this.bb!.__offset(this.bb_pos, 46);\n  return offset ? this.bb!.readUint32(this.bb_pos + offset) : 0;\n}\n\nmutate_testhashu32_fnv1a(value:number):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 46);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeUint32(this.bb_pos + offset, value);\n  return true;\n}\n\ntesthashs64Fnv1a():bigint {\n  const offset = this.bb!.__offset(this.bb_pos, 48);\n  return offset ? this.bb!.readInt64(this.bb_pos + offset) : BigInt('0');\n}\n\nmutate_testhashs64_fnv1a(value:bigint):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 48);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeInt64(this.bb_pos + offset, value);\n  return true;\n}\n\ntesthashu64Fnv1a():bigint {\n  const offset = this.bb!.__offset(this.bb_pos, 50);\n  return offset ? this.bb!.readUint64(this.bb_pos + offset) : BigInt('0');\n}\n\nmutate_testhashu64_fnv1a(value:bigint):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 50);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeUint64(this.bb_pos + offset, value);\n  return true;\n}\n\ntestarrayofbools(index: number):boolean|null {\n  const offset = this.bb!.__offset(this.bb_pos, 52);\n  return offset ? !!this.bb!.readInt8(this.bb!.__vector(this.bb_pos + offset) + index) : false;\n}\n\ntestarrayofboolsLength():number {\n  const offset = this.bb!.__offset(this.bb_pos, 52);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\ntestarrayofboolsArray():Int8Array|null {\n  const offset = this.bb!.__offset(this.bb_pos, 52);\n  return offset ? new Int8Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\n}\n\ntestf():number {\n  const offset = this.bb!.__offset(this.bb_pos, 54);\n  return offset ? this.bb!.readFloat32(this.bb_pos + offset) : 3.14159;\n}\n\nmutate_testf(value:number):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 54);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeFloat32(this.bb_pos + offset, value);\n  return true;\n}\n\ntestf2():number {\n  const offset = this.bb!.__offset(this.bb_pos, 56);\n  return offset ? this.bb!.readFloat32(this.bb_pos + offset) : 3.0;\n}\n\nmutate_testf2(value:number):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 56);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeFloat32(this.bb_pos + offset, value);\n  return true;\n}\n\ntestf3():number {\n  const offset = this.bb!.__offset(this.bb_pos, 58);\n  return offset ? this.bb!.readFloat32(this.bb_pos + offset) : 0.0;\n}\n\nmutate_testf3(value:number):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 58);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeFloat32(this.bb_pos + offset, value);\n  return true;\n}\n\ntestarrayofstring2(index: number):string\ntestarrayofstring2(index: number,optionalEncoding:flatbuffers.Encoding):string|Uint8Array\ntestarrayofstring2(index: number,optionalEncoding?:any):string|Uint8Array|null {\n  const offset = this.bb!.__offset(this.bb_pos, 60);\n  return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n}\n\ntestarrayofstring2Length():number {\n  const offset = this.bb!.__offset(this.bb_pos, 60);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\ntestarrayofsortedstruct(index: number, obj?:Ability):Ability|null {\n  const offset = this.bb!.__offset(this.bb_pos, 62);\n  return offset ? (obj || new Ability()).__init(this.bb!.__vector(this.bb_pos + offset) + index * 8, this.bb!) : null;\n}\n\ntestarrayofsortedstructLength():number {\n  const offset = this.bb!.__offset(this.bb_pos, 62);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\nflex(index: number):number|null {\n  const offset = this.bb!.__offset(this.bb_pos, 64);\n  return offset ? this.bb!.readUint8(this.bb!.__vector(this.bb_pos + offset) + index) : 0;\n}\n\nflexLength():number {\n  const offset = this.bb!.__offset(this.bb_pos, 64);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\nflexArray():Uint8Array|null {\n  const offset = this.bb!.__offset(this.bb_pos, 64);\n  return offset ? new Uint8Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\n}\n\ntest5(index: number, obj?:Test):Test|null {\n  const offset = this.bb!.__offset(this.bb_pos, 66);\n  return offset ? (obj || new Test()).__init(this.bb!.__vector(this.bb_pos + offset) + index * 4, this.bb!) : null;\n}\n\ntest5Length():number {\n  const offset = this.bb!.__offset(this.bb_pos, 66);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\nvectorOfLongs(index: number):bigint|null {\n  const offset = this.bb!.__offset(this.bb_pos, 68);\n  return offset ? this.bb!.readInt64(this.bb!.__vector(this.bb_pos + offset) + index * 8) : BigInt(0);\n}\n\nvectorOfLongsLength():number {\n  const offset = this.bb!.__offset(this.bb_pos, 68);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\nvectorOfDoubles(index: number):number|null {\n  const offset = this.bb!.__offset(this.bb_pos, 70);\n  return offset ? this.bb!.readFloat64(this.bb!.__vector(this.bb_pos + offset) + index * 8) : 0;\n}\n\nvectorOfDoublesLength():number {\n  const offset = this.bb!.__offset(this.bb_pos, 70);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\nvectorOfDoublesArray():Float64Array|null {\n  const offset = this.bb!.__offset(this.bb_pos, 70);\n  return offset ? new Float64Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\n}\n\nparentNamespaceTest(obj?:InParentNamespace):InParentNamespace|null {\n  const offset = this.bb!.__offset(this.bb_pos, 72);\n  return offset ? (obj || new InParentNamespace()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null;\n}\n\nvectorOfReferrables(index: number, obj?:Referrable):Referrable|null {\n  const offset = this.bb!.__offset(this.bb_pos, 74);\n  return offset ? (obj || new Referrable()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;\n}\n\nvectorOfReferrablesLength():number {\n  const offset = this.bb!.__offset(this.bb_pos, 74);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\nsingleWeakReference():bigint {\n  const offset = this.bb!.__offset(this.bb_pos, 76);\n  return offset ? this.bb!.readUint64(this.bb_pos + offset) : BigInt('0');\n}\n\nmutate_single_weak_reference(value:bigint):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 76);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeUint64(this.bb_pos + offset, value);\n  return true;\n}\n\nvectorOfWeakReferences(index: number):bigint|null {\n  const offset = this.bb!.__offset(this.bb_pos, 78);\n  return offset ? this.bb!.readUint64(this.bb!.__vector(this.bb_pos + offset) + index * 8) : BigInt(0);\n}\n\nvectorOfWeakReferencesLength():number {\n  const offset = this.bb!.__offset(this.bb_pos, 78);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\nvectorOfStrongReferrables(index: number, obj?:Referrable):Referrable|null {\n  const offset = this.bb!.__offset(this.bb_pos, 80);\n  return offset ? (obj || new Referrable()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;\n}\n\nvectorOfStrongReferrablesLength():number {\n  const offset = this.bb!.__offset(this.bb_pos, 80);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\ncoOwningReference():bigint {\n  const offset = this.bb!.__offset(this.bb_pos, 82);\n  return offset ? this.bb!.readUint64(this.bb_pos + offset) : BigInt('0');\n}\n\nmutate_co_owning_reference(value:bigint):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 82);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeUint64(this.bb_pos + offset, value);\n  return true;\n}\n\nvectorOfCoOwningReferences(index: number):bigint|null {\n  const offset = this.bb!.__offset(this.bb_pos, 84);\n  return offset ? this.bb!.readUint64(this.bb!.__vector(this.bb_pos + offset) + index * 8) : BigInt(0);\n}\n\nvectorOfCoOwningReferencesLength():number {\n  const offset = this.bb!.__offset(this.bb_pos, 84);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\nnonOwningReference():bigint {\n  const offset = this.bb!.__offset(this.bb_pos, 86);\n  return offset ? this.bb!.readUint64(this.bb_pos + offset) : BigInt('0');\n}\n\nmutate_non_owning_reference(value:bigint):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 86);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeUint64(this.bb_pos + offset, value);\n  return true;\n}\n\nvectorOfNonOwningReferences(index: number):bigint|null {\n  const offset = this.bb!.__offset(this.bb_pos, 88);\n  return offset ? this.bb!.readUint64(this.bb!.__vector(this.bb_pos + offset) + index * 8) : BigInt(0);\n}\n\nvectorOfNonOwningReferencesLength():number {\n  const offset = this.bb!.__offset(this.bb_pos, 88);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\nanyUniqueType():AnyUniqueAliases {\n  const offset = this.bb!.__offset(this.bb_pos, 90);\n  return offset ? this.bb!.readUint8(this.bb_pos + offset) : AnyUniqueAliases.NONE;\n}\n\nanyUnique<T extends flatbuffers.Table>(obj:any):any|null {\n  const offset = this.bb!.__offset(this.bb_pos, 92);\n  return offset ? this.bb!.__union(obj, this.bb_pos + offset) : null;\n}\n\nanyAmbiguousType():AnyAmbiguousAliases {\n  const offset = this.bb!.__offset(this.bb_pos, 94);\n  return offset ? this.bb!.readUint8(this.bb_pos + offset) : AnyAmbiguousAliases.NONE;\n}\n\nanyAmbiguous<T extends flatbuffers.Table>(obj:any):any|null {\n  const offset = this.bb!.__offset(this.bb_pos, 96);\n  return offset ? this.bb!.__union(obj, this.bb_pos + offset) : null;\n}\n\nvectorOfEnums(index: number):Color|null {\n  const offset = this.bb!.__offset(this.bb_pos, 98);\n  return offset ? this.bb!.readUint8(this.bb!.__vector(this.bb_pos + offset) + index) : null;\n}\n\nvectorOfEnumsLength():number {\n  const offset = this.bb!.__offset(this.bb_pos, 98);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\nvectorOfEnumsArray():Uint8Array|null {\n  const offset = this.bb!.__offset(this.bb_pos, 98);\n  return offset ? new Uint8Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\n}\n\nsignedEnum():Race {\n  const offset = this.bb!.__offset(this.bb_pos, 100);\n  return offset ? this.bb!.readInt8(this.bb_pos + offset) : Race.None;\n}\n\nmutate_signed_enum(value:Race):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 100);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeInt8(this.bb_pos + offset, value);\n  return true;\n}\n\ntestrequirednestedflatbuffer(index: number):number|null {\n  const offset = this.bb!.__offset(this.bb_pos, 102);\n  return offset ? this.bb!.readUint8(this.bb!.__vector(this.bb_pos + offset) + index) : 0;\n}\n\ntestrequirednestedflatbufferLength():number {\n  const offset = this.bb!.__offset(this.bb_pos, 102);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\ntestrequirednestedflatbufferArray():Uint8Array|null {\n  const offset = this.bb!.__offset(this.bb_pos, 102);\n  return offset ? new Uint8Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\n}\n\nscalarKeySortedTables(index: number, obj?:Stat):Stat|null {\n  const offset = this.bb!.__offset(this.bb_pos, 104);\n  return offset ? (obj || new Stat()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;\n}\n\nscalarKeySortedTablesLength():number {\n  const offset = this.bb!.__offset(this.bb_pos, 104);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\nnativeInline(obj?:Test):Test|null {\n  const offset = this.bb!.__offset(this.bb_pos, 106);\n  return offset ? (obj || new Test()).__init(this.bb_pos + offset, this.bb!) : null;\n}\n\nlongEnumNonEnumDefault():bigint {\n  const offset = this.bb!.__offset(this.bb_pos, 108);\n  return offset ? this.bb!.readUint64(this.bb_pos + offset) : BigInt('0');\n}\n\nmutate_long_enum_non_enum_default(value:bigint):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 108);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeUint64(this.bb_pos + offset, value);\n  return true;\n}\n\nlongEnumNormalDefault():bigint {\n  const offset = this.bb!.__offset(this.bb_pos, 110);\n  return offset ? this.bb!.readUint64(this.bb_pos + offset) : BigInt('2');\n}\n\nmutate_long_enum_normal_default(value:bigint):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 110);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeUint64(this.bb_pos + offset, value);\n  return true;\n}\n\nnanDefault():number {\n  const offset = this.bb!.__offset(this.bb_pos, 112);\n  return offset ? this.bb!.readFloat32(this.bb_pos + offset) : NaN;\n}\n\nmutate_nan_default(value:number):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 112);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeFloat32(this.bb_pos + offset, value);\n  return true;\n}\n\ninfDefault():number {\n  const offset = this.bb!.__offset(this.bb_pos, 114);\n  return offset ? this.bb!.readFloat32(this.bb_pos + offset) : Infinity;\n}\n\nmutate_inf_default(value:number):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 114);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeFloat32(this.bb_pos + offset, value);\n  return true;\n}\n\npositiveInfDefault():number {\n  const offset = this.bb!.__offset(this.bb_pos, 116);\n  return offset ? this.bb!.readFloat32(this.bb_pos + offset) : Infinity;\n}\n\nmutate_positive_inf_default(value:number):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 116);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeFloat32(this.bb_pos + offset, value);\n  return true;\n}\n\ninfinityDefault():number {\n  const offset = this.bb!.__offset(this.bb_pos, 118);\n  return offset ? this.bb!.readFloat32(this.bb_pos + offset) : Infinity;\n}\n\nmutate_infinity_default(value:number):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 118);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeFloat32(this.bb_pos + offset, value);\n  return true;\n}\n\npositiveInfinityDefault():number {\n  const offset = this.bb!.__offset(this.bb_pos, 120);\n  return offset ? this.bb!.readFloat32(this.bb_pos + offset) : Infinity;\n}\n\nmutate_positive_infinity_default(value:number):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 120);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeFloat32(this.bb_pos + offset, value);\n  return true;\n}\n\nnegativeInfDefault():number {\n  const offset = this.bb!.__offset(this.bb_pos, 122);\n  return offset ? this.bb!.readFloat32(this.bb_pos + offset) : -Infinity;\n}\n\nmutate_negative_inf_default(value:number):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 122);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeFloat32(this.bb_pos + offset, value);\n  return true;\n}\n\nnegativeInfinityDefault():number {\n  const offset = this.bb!.__offset(this.bb_pos, 124);\n  return offset ? this.bb!.readFloat32(this.bb_pos + offset) : -Infinity;\n}\n\nmutate_negative_infinity_default(value:number):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 124);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeFloat32(this.bb_pos + offset, value);\n  return true;\n}\n\ndoubleInfDefault():number {\n  const offset = this.bb!.__offset(this.bb_pos, 126);\n  return offset ? this.bb!.readFloat64(this.bb_pos + offset) : Infinity;\n}\n\nmutate_double_inf_default(value:number):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 126);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeFloat64(this.bb_pos + offset, value);\n  return true;\n}\n\nstatic getFullyQualifiedName(): \"MyGame.Example.Monster\" {\n  return 'MyGame.Example.Monster';\n}\n\nstatic startMonster(builder:flatbuffers.Builder) {\n  builder.startObject(62);\n}\n\nstatic addPos(builder:flatbuffers.Builder, posOffset:flatbuffers.Offset) {\n  builder.addFieldStruct(0, posOffset, 0);\n}\n\nstatic addMana(builder:flatbuffers.Builder, mana:number) {\n  builder.addFieldInt16(1, mana, 150);\n}\n\nstatic addHp(builder:flatbuffers.Builder, hp:number) {\n  builder.addFieldInt16(2, hp, 100);\n}\n\nstatic addName(builder:flatbuffers.Builder, nameOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(3, nameOffset, 0);\n}\n\nstatic addInventory(builder:flatbuffers.Builder, inventoryOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(5, inventoryOffset, 0);\n}\n\nstatic createInventoryVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset {\n  builder.startVector(1, data.length, 1);\n  for (let i = data.length - 1; i >= 0; i--) {\n    builder.addInt8(data[i]!);\n  }\n  return builder.endVector();\n}\n\nstatic startInventoryVector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(1, numElems, 1);\n}\n\nstatic addColor(builder:flatbuffers.Builder, color:Color) {\n  builder.addFieldInt8(6, color, Color.Blue);\n}\n\nstatic addTestType(builder:flatbuffers.Builder, testType:Any) {\n  builder.addFieldInt8(7, testType, Any.NONE);\n}\n\nstatic addTest(builder:flatbuffers.Builder, testOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(8, testOffset, 0);\n}\n\nstatic addTest4(builder:flatbuffers.Builder, test4Offset:flatbuffers.Offset) {\n  builder.addFieldOffset(9, test4Offset, 0);\n}\n\nstatic startTest4Vector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(4, numElems, 2);\n}\n\nstatic addTestarrayofstring(builder:flatbuffers.Builder, testarrayofstringOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(10, testarrayofstringOffset, 0);\n}\n\nstatic createTestarrayofstringVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {\n  builder.startVector(4, data.length, 4);\n  for (let i = data.length - 1; i >= 0; i--) {\n    builder.addOffset(data[i]!);\n  }\n  return builder.endVector();\n}\n\nstatic startTestarrayofstringVector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(4, numElems, 4);\n}\n\nstatic addTestarrayoftables(builder:flatbuffers.Builder, testarrayoftablesOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(11, testarrayoftablesOffset, 0);\n}\n\nstatic createTestarrayoftablesVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {\n  builder.startVector(4, data.length, 4);\n  for (let i = data.length - 1; i >= 0; i--) {\n    builder.addOffset(data[i]!);\n  }\n  return builder.endVector();\n}\n\nstatic startTestarrayoftablesVector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(4, numElems, 4);\n}\n\nstatic addEnemy(builder:flatbuffers.Builder, enemyOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(12, enemyOffset, 0);\n}\n\nstatic addTestnestedflatbuffer(builder:flatbuffers.Builder, testnestedflatbufferOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(13, testnestedflatbufferOffset, 0);\n}\n\nstatic createTestnestedflatbufferVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset {\n  builder.startVector(1, data.length, 1);\n  for (let i = data.length - 1; i >= 0; i--) {\n    builder.addInt8(data[i]!);\n  }\n  return builder.endVector();\n}\n\nstatic startTestnestedflatbufferVector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(1, numElems, 1);\n}\n\nstatic addTestempty(builder:flatbuffers.Builder, testemptyOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(14, testemptyOffset, 0);\n}\n\nstatic addTestbool(builder:flatbuffers.Builder, testbool:boolean) {\n  builder.addFieldInt8(15, +testbool, +false);\n}\n\nstatic addTesthashs32Fnv1(builder:flatbuffers.Builder, testhashs32Fnv1:number) {\n  builder.addFieldInt32(16, testhashs32Fnv1, 0);\n}\n\nstatic addTesthashu32Fnv1(builder:flatbuffers.Builder, testhashu32Fnv1:number) {\n  builder.addFieldInt32(17, testhashu32Fnv1, 0);\n}\n\nstatic addTesthashs64Fnv1(builder:flatbuffers.Builder, testhashs64Fnv1:bigint) {\n  builder.addFieldInt64(18, testhashs64Fnv1, BigInt('0'));\n}\n\nstatic addTesthashu64Fnv1(builder:flatbuffers.Builder, testhashu64Fnv1:bigint) {\n  builder.addFieldInt64(19, testhashu64Fnv1, BigInt('0'));\n}\n\nstatic addTesthashs32Fnv1a(builder:flatbuffers.Builder, testhashs32Fnv1a:number) {\n  builder.addFieldInt32(20, testhashs32Fnv1a, 0);\n}\n\nstatic addTesthashu32Fnv1a(builder:flatbuffers.Builder, testhashu32Fnv1a:number) {\n  builder.addFieldInt32(21, testhashu32Fnv1a, 0);\n}\n\nstatic addTesthashs64Fnv1a(builder:flatbuffers.Builder, testhashs64Fnv1a:bigint) {\n  builder.addFieldInt64(22, testhashs64Fnv1a, BigInt('0'));\n}\n\nstatic addTesthashu64Fnv1a(builder:flatbuffers.Builder, testhashu64Fnv1a:bigint) {\n  builder.addFieldInt64(23, testhashu64Fnv1a, BigInt('0'));\n}\n\nstatic addTestarrayofbools(builder:flatbuffers.Builder, testarrayofboolsOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(24, testarrayofboolsOffset, 0);\n}\n\nstatic createTestarrayofboolsVector(builder:flatbuffers.Builder, data:boolean[]):flatbuffers.Offset {\n  builder.startVector(1, data.length, 1);\n  for (let i = data.length - 1; i >= 0; i--) {\n    builder.addInt8(+data[i]!);\n  }\n  return builder.endVector();\n}\n\nstatic startTestarrayofboolsVector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(1, numElems, 1);\n}\n\nstatic addTestf(builder:flatbuffers.Builder, testf:number) {\n  builder.addFieldFloat32(25, testf, 3.14159);\n}\n\nstatic addTestf2(builder:flatbuffers.Builder, testf2:number) {\n  builder.addFieldFloat32(26, testf2, 3.0);\n}\n\nstatic addTestf3(builder:flatbuffers.Builder, testf3:number) {\n  builder.addFieldFloat32(27, testf3, 0.0);\n}\n\nstatic addTestarrayofstring2(builder:flatbuffers.Builder, testarrayofstring2Offset:flatbuffers.Offset) {\n  builder.addFieldOffset(28, testarrayofstring2Offset, 0);\n}\n\nstatic createTestarrayofstring2Vector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {\n  builder.startVector(4, data.length, 4);\n  for (let i = data.length - 1; i >= 0; i--) {\n    builder.addOffset(data[i]!);\n  }\n  return builder.endVector();\n}\n\nstatic startTestarrayofstring2Vector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(4, numElems, 4);\n}\n\nstatic addTestarrayofsortedstruct(builder:flatbuffers.Builder, testarrayofsortedstructOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(29, testarrayofsortedstructOffset, 0);\n}\n\nstatic startTestarrayofsortedstructVector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(8, numElems, 4);\n}\n\nstatic addFlex(builder:flatbuffers.Builder, flexOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(30, flexOffset, 0);\n}\n\nstatic createFlexVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset {\n  builder.startVector(1, data.length, 1);\n  for (let i = data.length - 1; i >= 0; i--) {\n    builder.addInt8(data[i]!);\n  }\n  return builder.endVector();\n}\n\nstatic startFlexVector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(1, numElems, 1);\n}\n\nstatic addTest5(builder:flatbuffers.Builder, test5Offset:flatbuffers.Offset) {\n  builder.addFieldOffset(31, test5Offset, 0);\n}\n\nstatic startTest5Vector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(4, numElems, 2);\n}\n\nstatic addVectorOfLongs(builder:flatbuffers.Builder, vectorOfLongsOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(32, vectorOfLongsOffset, 0);\n}\n\nstatic createVectorOfLongsVector(builder:flatbuffers.Builder, data:bigint[]):flatbuffers.Offset {\n  builder.startVector(8, data.length, 8);\n  for (let i = data.length - 1; i >= 0; i--) {\n    builder.addInt64(data[i]!);\n  }\n  return builder.endVector();\n}\n\nstatic startVectorOfLongsVector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(8, numElems, 8);\n}\n\nstatic addVectorOfDoubles(builder:flatbuffers.Builder, vectorOfDoublesOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(33, vectorOfDoublesOffset, 0);\n}\n\nstatic createVectorOfDoublesVector(builder:flatbuffers.Builder, data:number[]|Float64Array):flatbuffers.Offset;\n/**\n * @deprecated This Uint8Array overload will be removed in the future.\n */\nstatic createVectorOfDoublesVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset;\nstatic createVectorOfDoublesVector(builder:flatbuffers.Builder, data:number[]|Float64Array|Uint8Array):flatbuffers.Offset {\n  builder.startVector(8, data.length, 8);\n  for (let i = data.length - 1; i >= 0; i--) {\n    builder.addFloat64(data[i]!);\n  }\n  return builder.endVector();\n}\n\nstatic startVectorOfDoublesVector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(8, numElems, 8);\n}\n\nstatic addParentNamespaceTest(builder:flatbuffers.Builder, parentNamespaceTestOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(34, parentNamespaceTestOffset, 0);\n}\n\nstatic addVectorOfReferrables(builder:flatbuffers.Builder, vectorOfReferrablesOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(35, vectorOfReferrablesOffset, 0);\n}\n\nstatic createVectorOfReferrablesVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {\n  builder.startVector(4, data.length, 4);\n  for (let i = data.length - 1; i >= 0; i--) {\n    builder.addOffset(data[i]!);\n  }\n  return builder.endVector();\n}\n\nstatic startVectorOfReferrablesVector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(4, numElems, 4);\n}\n\nstatic addSingleWeakReference(builder:flatbuffers.Builder, singleWeakReference:bigint) {\n  builder.addFieldInt64(36, singleWeakReference, BigInt('0'));\n}\n\nstatic addVectorOfWeakReferences(builder:flatbuffers.Builder, vectorOfWeakReferencesOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(37, vectorOfWeakReferencesOffset, 0);\n}\n\nstatic createVectorOfWeakReferencesVector(builder:flatbuffers.Builder, data:bigint[]):flatbuffers.Offset {\n  builder.startVector(8, data.length, 8);\n  for (let i = data.length - 1; i >= 0; i--) {\n    builder.addInt64(data[i]!);\n  }\n  return builder.endVector();\n}\n\nstatic startVectorOfWeakReferencesVector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(8, numElems, 8);\n}\n\nstatic addVectorOfStrongReferrables(builder:flatbuffers.Builder, vectorOfStrongReferrablesOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(38, vectorOfStrongReferrablesOffset, 0);\n}\n\nstatic createVectorOfStrongReferrablesVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {\n  builder.startVector(4, data.length, 4);\n  for (let i = data.length - 1; i >= 0; i--) {\n    builder.addOffset(data[i]!);\n  }\n  return builder.endVector();\n}\n\nstatic startVectorOfStrongReferrablesVector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(4, numElems, 4);\n}\n\nstatic addCoOwningReference(builder:flatbuffers.Builder, coOwningReference:bigint) {\n  builder.addFieldInt64(39, coOwningReference, BigInt('0'));\n}\n\nstatic addVectorOfCoOwningReferences(builder:flatbuffers.Builder, vectorOfCoOwningReferencesOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(40, vectorOfCoOwningReferencesOffset, 0);\n}\n\nstatic createVectorOfCoOwningReferencesVector(builder:flatbuffers.Builder, data:bigint[]):flatbuffers.Offset {\n  builder.startVector(8, data.length, 8);\n  for (let i = data.length - 1; i >= 0; i--) {\n    builder.addInt64(data[i]!);\n  }\n  return builder.endVector();\n}\n\nstatic startVectorOfCoOwningReferencesVector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(8, numElems, 8);\n}\n\nstatic addNonOwningReference(builder:flatbuffers.Builder, nonOwningReference:bigint) {\n  builder.addFieldInt64(41, nonOwningReference, BigInt('0'));\n}\n\nstatic addVectorOfNonOwningReferences(builder:flatbuffers.Builder, vectorOfNonOwningReferencesOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(42, vectorOfNonOwningReferencesOffset, 0);\n}\n\nstatic createVectorOfNonOwningReferencesVector(builder:flatbuffers.Builder, data:bigint[]):flatbuffers.Offset {\n  builder.startVector(8, data.length, 8);\n  for (let i = data.length - 1; i >= 0; i--) {\n    builder.addInt64(data[i]!);\n  }\n  return builder.endVector();\n}\n\nstatic startVectorOfNonOwningReferencesVector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(8, numElems, 8);\n}\n\nstatic addAnyUniqueType(builder:flatbuffers.Builder, anyUniqueType:AnyUniqueAliases) {\n  builder.addFieldInt8(43, anyUniqueType, AnyUniqueAliases.NONE);\n}\n\nstatic addAnyUnique(builder:flatbuffers.Builder, anyUniqueOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(44, anyUniqueOffset, 0);\n}\n\nstatic addAnyAmbiguousType(builder:flatbuffers.Builder, anyAmbiguousType:AnyAmbiguousAliases) {\n  builder.addFieldInt8(45, anyAmbiguousType, AnyAmbiguousAliases.NONE);\n}\n\nstatic addAnyAmbiguous(builder:flatbuffers.Builder, anyAmbiguousOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(46, anyAmbiguousOffset, 0);\n}\n\nstatic addVectorOfEnums(builder:flatbuffers.Builder, vectorOfEnumsOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(47, vectorOfEnumsOffset, 0);\n}\n\nstatic createVectorOfEnumsVector(builder:flatbuffers.Builder, data:Color[]):flatbuffers.Offset {\n  builder.startVector(1, data.length, 1);\n  for (let i = data.length - 1; i >= 0; i--) {\n    builder.addInt8(data[i]!);\n  }\n  return builder.endVector();\n}\n\nstatic startVectorOfEnumsVector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(1, numElems, 1);\n}\n\nstatic addSignedEnum(builder:flatbuffers.Builder, signedEnum:Race) {\n  builder.addFieldInt8(48, signedEnum, Race.None);\n}\n\nstatic addTestrequirednestedflatbuffer(builder:flatbuffers.Builder, testrequirednestedflatbufferOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(49, testrequirednestedflatbufferOffset, 0);\n}\n\nstatic createTestrequirednestedflatbufferVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset {\n  builder.startVector(1, data.length, 1);\n  for (let i = data.length - 1; i >= 0; i--) {\n    builder.addInt8(data[i]!);\n  }\n  return builder.endVector();\n}\n\nstatic startTestrequirednestedflatbufferVector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(1, numElems, 1);\n}\n\nstatic addScalarKeySortedTables(builder:flatbuffers.Builder, scalarKeySortedTablesOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(50, scalarKeySortedTablesOffset, 0);\n}\n\nstatic createScalarKeySortedTablesVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {\n  builder.startVector(4, data.length, 4);\n  for (let i = data.length - 1; i >= 0; i--) {\n    builder.addOffset(data[i]!);\n  }\n  return builder.endVector();\n}\n\nstatic startScalarKeySortedTablesVector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(4, numElems, 4);\n}\n\nstatic addNativeInline(builder:flatbuffers.Builder, nativeInlineOffset:flatbuffers.Offset) {\n  builder.addFieldStruct(51, nativeInlineOffset, 0);\n}\n\nstatic addLongEnumNonEnumDefault(builder:flatbuffers.Builder, longEnumNonEnumDefault:bigint) {\n  builder.addFieldInt64(52, longEnumNonEnumDefault, BigInt('0'));\n}\n\nstatic addLongEnumNormalDefault(builder:flatbuffers.Builder, longEnumNormalDefault:bigint) {\n  builder.addFieldInt64(53, longEnumNormalDefault, BigInt('2'));\n}\n\nstatic addNanDefault(builder:flatbuffers.Builder, nanDefault:number) {\n  builder.addFieldFloat32(54, nanDefault, NaN);\n}\n\nstatic addInfDefault(builder:flatbuffers.Builder, infDefault:number) {\n  builder.addFieldFloat32(55, infDefault, Infinity);\n}\n\nstatic addPositiveInfDefault(builder:flatbuffers.Builder, positiveInfDefault:number) {\n  builder.addFieldFloat32(56, positiveInfDefault, Infinity);\n}\n\nstatic addInfinityDefault(builder:flatbuffers.Builder, infinityDefault:number) {\n  builder.addFieldFloat32(57, infinityDefault, Infinity);\n}\n\nstatic addPositiveInfinityDefault(builder:flatbuffers.Builder, positiveInfinityDefault:number) {\n  builder.addFieldFloat32(58, positiveInfinityDefault, Infinity);\n}\n\nstatic addNegativeInfDefault(builder:flatbuffers.Builder, negativeInfDefault:number) {\n  builder.addFieldFloat32(59, negativeInfDefault, -Infinity);\n}\n\nstatic addNegativeInfinityDefault(builder:flatbuffers.Builder, negativeInfinityDefault:number) {\n  builder.addFieldFloat32(60, negativeInfinityDefault, -Infinity);\n}\n\nstatic addDoubleInfDefault(builder:flatbuffers.Builder, doubleInfDefault:number) {\n  builder.addFieldFloat64(61, doubleInfDefault, Infinity);\n}\n\nstatic endMonster(builder:flatbuffers.Builder):flatbuffers.Offset {\n  const offset = builder.endObject();\n  builder.requiredField(offset, 10) // name\n  return offset;\n}\n\nstatic finishMonsterBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) {\n  builder.finish(offset, 'MONS');\n}\n\nstatic finishSizePrefixedMonsterBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) {\n  builder.finish(offset, 'MONS', true);\n}\n\n\nserialize():Uint8Array {\n  return this.bb!.bytes();\n}\n\nstatic deserialize(buffer: Uint8Array):Monster {\n  return Monster.getRootAsMonster(new flatbuffers.ByteBuffer(buffer))\n}\n\nunpack(): MonsterT {\n  return new MonsterT(\n    (this.pos() !== null ? this.pos()!.unpack() : null),\n    this.mana(),\n    this.hp(),\n    this.name(),\n    this.bb!.createScalarList<number>(this.inventory.bind(this), this.inventoryLength()),\n    this.color(),\n    this.testType(),\n    (() => {\n      const temp = unionToAny(this.testType(), this.test.bind(this));\n      if(temp === null) { return null; }\n      return temp.unpack()\n  })(),\n    this.bb!.createObjList<Test, TestT>(this.test4.bind(this), this.test4Length()),\n    this.bb!.createScalarList<string>(this.testarrayofstring.bind(this), this.testarrayofstringLength()),\n    this.bb!.createObjList<Monster, MonsterT>(this.testarrayoftables.bind(this), this.testarrayoftablesLength()),\n    (this.enemy() !== null ? this.enemy()!.unpack() : null),\n    this.bb!.createScalarList<number>(this.testnestedflatbuffer.bind(this), this.testnestedflatbufferLength()),\n    (this.testempty() !== null ? this.testempty()!.unpack() : null),\n    this.testbool(),\n    this.testhashs32Fnv1(),\n    this.testhashu32Fnv1(),\n    this.testhashs64Fnv1(),\n    this.testhashu64Fnv1(),\n    this.testhashs32Fnv1a(),\n    this.testhashu32Fnv1a(),\n    this.testhashs64Fnv1a(),\n    this.testhashu64Fnv1a(),\n    this.bb!.createScalarList<boolean>(this.testarrayofbools.bind(this), this.testarrayofboolsLength()),\n    this.testf(),\n    this.testf2(),\n    this.testf3(),\n    this.bb!.createScalarList<string>(this.testarrayofstring2.bind(this), this.testarrayofstring2Length()),\n    this.bb!.createObjList<Ability, AbilityT>(this.testarrayofsortedstruct.bind(this), this.testarrayofsortedstructLength()),\n    this.bb!.createScalarList<number>(this.flex.bind(this), this.flexLength()),\n    this.bb!.createObjList<Test, TestT>(this.test5.bind(this), this.test5Length()),\n    this.bb!.createScalarList<bigint>(this.vectorOfLongs.bind(this), this.vectorOfLongsLength()),\n    this.bb!.createScalarList<number>(this.vectorOfDoubles.bind(this), this.vectorOfDoublesLength()),\n    (this.parentNamespaceTest() !== null ? this.parentNamespaceTest()!.unpack() : null),\n    this.bb!.createObjList<Referrable, ReferrableT>(this.vectorOfReferrables.bind(this), this.vectorOfReferrablesLength()),\n    this.singleWeakReference(),\n    this.bb!.createScalarList<bigint>(this.vectorOfWeakReferences.bind(this), this.vectorOfWeakReferencesLength()),\n    this.bb!.createObjList<Referrable, ReferrableT>(this.vectorOfStrongReferrables.bind(this), this.vectorOfStrongReferrablesLength()),\n    this.coOwningReference(),\n    this.bb!.createScalarList<bigint>(this.vectorOfCoOwningReferences.bind(this), this.vectorOfCoOwningReferencesLength()),\n    this.nonOwningReference(),\n    this.bb!.createScalarList<bigint>(this.vectorOfNonOwningReferences.bind(this), this.vectorOfNonOwningReferencesLength()),\n    this.anyUniqueType(),\n    (() => {\n      const temp = unionToAnyUniqueAliases(this.anyUniqueType(), this.anyUnique.bind(this));\n      if(temp === null) { return null; }\n      return temp.unpack()\n  })(),\n    this.anyAmbiguousType(),\n    (() => {\n      const temp = unionToAnyAmbiguousAliases(this.anyAmbiguousType(), this.anyAmbiguous.bind(this));\n      if(temp === null) { return null; }\n      return temp.unpack()\n  })(),\n    this.bb!.createScalarList<Color>(this.vectorOfEnums.bind(this), this.vectorOfEnumsLength()),\n    this.signedEnum(),\n    this.bb!.createScalarList<number>(this.testrequirednestedflatbuffer.bind(this), this.testrequirednestedflatbufferLength()),\n    this.bb!.createObjList<Stat, StatT>(this.scalarKeySortedTables.bind(this), this.scalarKeySortedTablesLength()),\n    (this.nativeInline() !== null ? this.nativeInline()!.unpack() : null),\n    this.longEnumNonEnumDefault(),\n    this.longEnumNormalDefault(),\n    this.nanDefault(),\n    this.infDefault(),\n    this.positiveInfDefault(),\n    this.infinityDefault(),\n    this.positiveInfinityDefault(),\n    this.negativeInfDefault(),\n    this.negativeInfinityDefault(),\n    this.doubleInfDefault()\n  );\n}\n\n\nunpackTo(_o: MonsterT): void {\n  _o.pos = (this.pos() !== null ? this.pos()!.unpack() : null);\n  _o.mana = this.mana();\n  _o.hp = this.hp();\n  _o.name = this.name();\n  _o.inventory = this.bb!.createScalarList<number>(this.inventory.bind(this), this.inventoryLength());\n  _o.color = this.color();\n  _o.testType = this.testType();\n  _o.test = (() => {\n      const temp = unionToAny(this.testType(), this.test.bind(this));\n      if(temp === null) { return null; }\n      return temp.unpack()\n  })();\n  _o.test4 = this.bb!.createObjList<Test, TestT>(this.test4.bind(this), this.test4Length());\n  _o.testarrayofstring = this.bb!.createScalarList<string>(this.testarrayofstring.bind(this), this.testarrayofstringLength());\n  _o.testarrayoftables = this.bb!.createObjList<Monster, MonsterT>(this.testarrayoftables.bind(this), this.testarrayoftablesLength());\n  _o.enemy = (this.enemy() !== null ? this.enemy()!.unpack() : null);\n  _o.testnestedflatbuffer = this.bb!.createScalarList<number>(this.testnestedflatbuffer.bind(this), this.testnestedflatbufferLength());\n  _o.testempty = (this.testempty() !== null ? this.testempty()!.unpack() : null);\n  _o.testbool = this.testbool();\n  _o.testhashs32Fnv1 = this.testhashs32Fnv1();\n  _o.testhashu32Fnv1 = this.testhashu32Fnv1();\n  _o.testhashs64Fnv1 = this.testhashs64Fnv1();\n  _o.testhashu64Fnv1 = this.testhashu64Fnv1();\n  _o.testhashs32Fnv1a = this.testhashs32Fnv1a();\n  _o.testhashu32Fnv1a = this.testhashu32Fnv1a();\n  _o.testhashs64Fnv1a = this.testhashs64Fnv1a();\n  _o.testhashu64Fnv1a = this.testhashu64Fnv1a();\n  _o.testarrayofbools = this.bb!.createScalarList<boolean>(this.testarrayofbools.bind(this), this.testarrayofboolsLength());\n  _o.testf = this.testf();\n  _o.testf2 = this.testf2();\n  _o.testf3 = this.testf3();\n  _o.testarrayofstring2 = this.bb!.createScalarList<string>(this.testarrayofstring2.bind(this), this.testarrayofstring2Length());\n  _o.testarrayofsortedstruct = this.bb!.createObjList<Ability, AbilityT>(this.testarrayofsortedstruct.bind(this), this.testarrayofsortedstructLength());\n  _o.flex = this.bb!.createScalarList<number>(this.flex.bind(this), this.flexLength());\n  _o.test5 = this.bb!.createObjList<Test, TestT>(this.test5.bind(this), this.test5Length());\n  _o.vectorOfLongs = this.bb!.createScalarList<bigint>(this.vectorOfLongs.bind(this), this.vectorOfLongsLength());\n  _o.vectorOfDoubles = this.bb!.createScalarList<number>(this.vectorOfDoubles.bind(this), this.vectorOfDoublesLength());\n  _o.parentNamespaceTest = (this.parentNamespaceTest() !== null ? this.parentNamespaceTest()!.unpack() : null);\n  _o.vectorOfReferrables = this.bb!.createObjList<Referrable, ReferrableT>(this.vectorOfReferrables.bind(this), this.vectorOfReferrablesLength());\n  _o.singleWeakReference = this.singleWeakReference();\n  _o.vectorOfWeakReferences = this.bb!.createScalarList<bigint>(this.vectorOfWeakReferences.bind(this), this.vectorOfWeakReferencesLength());\n  _o.vectorOfStrongReferrables = this.bb!.createObjList<Referrable, ReferrableT>(this.vectorOfStrongReferrables.bind(this), this.vectorOfStrongReferrablesLength());\n  _o.coOwningReference = this.coOwningReference();\n  _o.vectorOfCoOwningReferences = this.bb!.createScalarList<bigint>(this.vectorOfCoOwningReferences.bind(this), this.vectorOfCoOwningReferencesLength());\n  _o.nonOwningReference = this.nonOwningReference();\n  _o.vectorOfNonOwningReferences = this.bb!.createScalarList<bigint>(this.vectorOfNonOwningReferences.bind(this), this.vectorOfNonOwningReferencesLength());\n  _o.anyUniqueType = this.anyUniqueType();\n  _o.anyUnique = (() => {\n      const temp = unionToAnyUniqueAliases(this.anyUniqueType(), this.anyUnique.bind(this));\n      if(temp === null) { return null; }\n      return temp.unpack()\n  })();\n  _o.anyAmbiguousType = this.anyAmbiguousType();\n  _o.anyAmbiguous = (() => {\n      const temp = unionToAnyAmbiguousAliases(this.anyAmbiguousType(), this.anyAmbiguous.bind(this));\n      if(temp === null) { return null; }\n      return temp.unpack()\n  })();\n  _o.vectorOfEnums = this.bb!.createScalarList<Color>(this.vectorOfEnums.bind(this), this.vectorOfEnumsLength());\n  _o.signedEnum = this.signedEnum();\n  _o.testrequirednestedflatbuffer = this.bb!.createScalarList<number>(this.testrequirednestedflatbuffer.bind(this), this.testrequirednestedflatbufferLength());\n  _o.scalarKeySortedTables = this.bb!.createObjList<Stat, StatT>(this.scalarKeySortedTables.bind(this), this.scalarKeySortedTablesLength());\n  _o.nativeInline = (this.nativeInline() !== null ? this.nativeInline()!.unpack() : null);\n  _o.longEnumNonEnumDefault = this.longEnumNonEnumDefault();\n  _o.longEnumNormalDefault = this.longEnumNormalDefault();\n  _o.nanDefault = this.nanDefault();\n  _o.infDefault = this.infDefault();\n  _o.positiveInfDefault = this.positiveInfDefault();\n  _o.infinityDefault = this.infinityDefault();\n  _o.positiveInfinityDefault = this.positiveInfinityDefault();\n  _o.negativeInfDefault = this.negativeInfDefault();\n  _o.negativeInfinityDefault = this.negativeInfinityDefault();\n  _o.doubleInfDefault = this.doubleInfDefault();\n}\n}\n\nexport class MonsterT implements flatbuffers.IGeneratedObject {\nconstructor(\n  public pos: Vec3T|null = null,\n  public mana: number = 150,\n  public hp: number = 100,\n  public name: string|Uint8Array|null = null,\n  public inventory: (number)[] = [],\n  public color: Color = Color.Blue,\n  public testType: Any = Any.NONE,\n  public test: MonsterT|MyGame_Example2_MonsterT|TestSimpleTableWithEnumT|null = null,\n  public test4: (TestT)[] = [],\n  public testarrayofstring: (string)[] = [],\n  public testarrayoftables: (MonsterT)[] = [],\n  public enemy: MonsterT|null = null,\n  public testnestedflatbuffer: (number)[] = [],\n  public testempty: StatT|null = null,\n  public testbool: boolean = false,\n  public testhashs32Fnv1: number = 0,\n  public testhashu32Fnv1: number = 0,\n  public testhashs64Fnv1: bigint = BigInt('0'),\n  public testhashu64Fnv1: bigint = BigInt('0'),\n  public testhashs32Fnv1a: number = 0,\n  public testhashu32Fnv1a: number = 0,\n  public testhashs64Fnv1a: bigint = BigInt('0'),\n  public testhashu64Fnv1a: bigint = BigInt('0'),\n  public testarrayofbools: (boolean)[] = [],\n  public testf: number = 3.14159,\n  public testf2: number = 3.0,\n  public testf3: number = 0.0,\n  public testarrayofstring2: (string)[] = [],\n  public testarrayofsortedstruct: (AbilityT)[] = [],\n  public flex: (number)[] = [],\n  public test5: (TestT)[] = [],\n  public vectorOfLongs: (bigint)[] = [],\n  public vectorOfDoubles: (number)[] = [],\n  public parentNamespaceTest: InParentNamespaceT|null = null,\n  public vectorOfReferrables: (ReferrableT)[] = [],\n  public singleWeakReference: bigint = BigInt('0'),\n  public vectorOfWeakReferences: (bigint)[] = [],\n  public vectorOfStrongReferrables: (ReferrableT)[] = [],\n  public coOwningReference: bigint = BigInt('0'),\n  public vectorOfCoOwningReferences: (bigint)[] = [],\n  public nonOwningReference: bigint = BigInt('0'),\n  public vectorOfNonOwningReferences: (bigint)[] = [],\n  public anyUniqueType: AnyUniqueAliases = AnyUniqueAliases.NONE,\n  public anyUnique: MonsterT|MyGame_Example2_MonsterT|TestSimpleTableWithEnumT|null = null,\n  public anyAmbiguousType: AnyAmbiguousAliases = AnyAmbiguousAliases.NONE,\n  public anyAmbiguous: MonsterT|null = null,\n  public vectorOfEnums: (Color)[] = [],\n  public signedEnum: Race = Race.None,\n  public testrequirednestedflatbuffer: (number)[] = [],\n  public scalarKeySortedTables: (StatT)[] = [],\n  public nativeInline: TestT|null = null,\n  public longEnumNonEnumDefault: bigint = BigInt('0'),\n  public longEnumNormalDefault: bigint = BigInt('2'),\n  public nanDefault: number = NaN,\n  public infDefault: number = Infinity,\n  public positiveInfDefault: number = Infinity,\n  public infinityDefault: number = Infinity,\n  public positiveInfinityDefault: number = Infinity,\n  public negativeInfDefault: number = -Infinity,\n  public negativeInfinityDefault: number = -Infinity,\n  public doubleInfDefault: number = Infinity\n){}\n\n\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n  const name = (this.name !== null ? builder.createString(this.name!) : 0);\n  const inventory = Monster.createInventoryVector(builder, this.inventory);\n  const test = builder.createObjectOffset(this.test);\n  const test4 = builder.createStructOffsetList(this.test4, Monster.startTest4Vector);\n  const testarrayofstring = Monster.createTestarrayofstringVector(builder, builder.createObjectOffsetList(this.testarrayofstring));\n  const testarrayoftables = Monster.createTestarrayoftablesVector(builder, builder.createObjectOffsetList(this.testarrayoftables));\n  const enemy = (this.enemy !== null ? this.enemy!.pack(builder) : 0);\n  const testnestedflatbuffer = Monster.createTestnestedflatbufferVector(builder, this.testnestedflatbuffer);\n  const testempty = (this.testempty !== null ? this.testempty!.pack(builder) : 0);\n  const testarrayofbools = Monster.createTestarrayofboolsVector(builder, this.testarrayofbools);\n  const testarrayofstring2 = Monster.createTestarrayofstring2Vector(builder, builder.createObjectOffsetList(this.testarrayofstring2));\n  const testarrayofsortedstruct = builder.createStructOffsetList(this.testarrayofsortedstruct, Monster.startTestarrayofsortedstructVector);\n  const flex = Monster.createFlexVector(builder, this.flex);\n  const test5 = builder.createStructOffsetList(this.test5, Monster.startTest5Vector);\n  const vectorOfLongs = Monster.createVectorOfLongsVector(builder, this.vectorOfLongs);\n  const vectorOfDoubles = Monster.createVectorOfDoublesVector(builder, this.vectorOfDoubles);\n  const parentNamespaceTest = (this.parentNamespaceTest !== null ? this.parentNamespaceTest!.pack(builder) : 0);\n  const vectorOfReferrables = Monster.createVectorOfReferrablesVector(builder, builder.createObjectOffsetList(this.vectorOfReferrables));\n  const vectorOfWeakReferences = Monster.createVectorOfWeakReferencesVector(builder, this.vectorOfWeakReferences);\n  const vectorOfStrongReferrables = Monster.createVectorOfStrongReferrablesVector(builder, builder.createObjectOffsetList(this.vectorOfStrongReferrables));\n  const vectorOfCoOwningReferences = Monster.createVectorOfCoOwningReferencesVector(builder, this.vectorOfCoOwningReferences);\n  const vectorOfNonOwningReferences = Monster.createVectorOfNonOwningReferencesVector(builder, this.vectorOfNonOwningReferences);\n  const anyUnique = builder.createObjectOffset(this.anyUnique);\n  const anyAmbiguous = builder.createObjectOffset(this.anyAmbiguous);\n  const vectorOfEnums = Monster.createVectorOfEnumsVector(builder, this.vectorOfEnums);\n  const testrequirednestedflatbuffer = Monster.createTestrequirednestedflatbufferVector(builder, this.testrequirednestedflatbuffer);\n  const scalarKeySortedTables = Monster.createScalarKeySortedTablesVector(builder, builder.createObjectOffsetList(this.scalarKeySortedTables));\n\n  Monster.startMonster(builder);\n  Monster.addPos(builder, (this.pos !== null ? this.pos!.pack(builder) : 0));\n  Monster.addMana(builder, this.mana);\n  Monster.addHp(builder, this.hp);\n  Monster.addName(builder, name);\n  Monster.addInventory(builder, inventory);\n  Monster.addColor(builder, this.color);\n  Monster.addTestType(builder, this.testType);\n  Monster.addTest(builder, test);\n  Monster.addTest4(builder, test4);\n  Monster.addTestarrayofstring(builder, testarrayofstring);\n  Monster.addTestarrayoftables(builder, testarrayoftables);\n  Monster.addEnemy(builder, enemy);\n  Monster.addTestnestedflatbuffer(builder, testnestedflatbuffer);\n  Monster.addTestempty(builder, testempty);\n  Monster.addTestbool(builder, this.testbool);\n  Monster.addTesthashs32Fnv1(builder, this.testhashs32Fnv1);\n  Monster.addTesthashu32Fnv1(builder, this.testhashu32Fnv1);\n  Monster.addTesthashs64Fnv1(builder, this.testhashs64Fnv1);\n  Monster.addTesthashu64Fnv1(builder, this.testhashu64Fnv1);\n  Monster.addTesthashs32Fnv1a(builder, this.testhashs32Fnv1a);\n  Monster.addTesthashu32Fnv1a(builder, this.testhashu32Fnv1a);\n  Monster.addTesthashs64Fnv1a(builder, this.testhashs64Fnv1a);\n  Monster.addTesthashu64Fnv1a(builder, this.testhashu64Fnv1a);\n  Monster.addTestarrayofbools(builder, testarrayofbools);\n  Monster.addTestf(builder, this.testf);\n  Monster.addTestf2(builder, this.testf2);\n  Monster.addTestf3(builder, this.testf3);\n  Monster.addTestarrayofstring2(builder, testarrayofstring2);\n  Monster.addTestarrayofsortedstruct(builder, testarrayofsortedstruct);\n  Monster.addFlex(builder, flex);\n  Monster.addTest5(builder, test5);\n  Monster.addVectorOfLongs(builder, vectorOfLongs);\n  Monster.addVectorOfDoubles(builder, vectorOfDoubles);\n  Monster.addParentNamespaceTest(builder, parentNamespaceTest);\n  Monster.addVectorOfReferrables(builder, vectorOfReferrables);\n  Monster.addSingleWeakReference(builder, this.singleWeakReference);\n  Monster.addVectorOfWeakReferences(builder, vectorOfWeakReferences);\n  Monster.addVectorOfStrongReferrables(builder, vectorOfStrongReferrables);\n  Monster.addCoOwningReference(builder, this.coOwningReference);\n  Monster.addVectorOfCoOwningReferences(builder, vectorOfCoOwningReferences);\n  Monster.addNonOwningReference(builder, this.nonOwningReference);\n  Monster.addVectorOfNonOwningReferences(builder, vectorOfNonOwningReferences);\n  Monster.addAnyUniqueType(builder, this.anyUniqueType);\n  Monster.addAnyUnique(builder, anyUnique);\n  Monster.addAnyAmbiguousType(builder, this.anyAmbiguousType);\n  Monster.addAnyAmbiguous(builder, anyAmbiguous);\n  Monster.addVectorOfEnums(builder, vectorOfEnums);\n  Monster.addSignedEnum(builder, this.signedEnum);\n  Monster.addTestrequirednestedflatbuffer(builder, testrequirednestedflatbuffer);\n  Monster.addScalarKeySortedTables(builder, scalarKeySortedTables);\n  Monster.addNativeInline(builder, (this.nativeInline !== null ? this.nativeInline!.pack(builder) : 0));\n  Monster.addLongEnumNonEnumDefault(builder, this.longEnumNonEnumDefault);\n  Monster.addLongEnumNormalDefault(builder, this.longEnumNormalDefault);\n  Monster.addNanDefault(builder, this.nanDefault);\n  Monster.addInfDefault(builder, this.infDefault);\n  Monster.addPositiveInfDefault(builder, this.positiveInfDefault);\n  Monster.addInfinityDefault(builder, this.infinityDefault);\n  Monster.addPositiveInfinityDefault(builder, this.positiveInfinityDefault);\n  Monster.addNegativeInfDefault(builder, this.negativeInfDefault);\n  Monster.addNegativeInfinityDefault(builder, this.negativeInfinityDefault);\n  Monster.addDoubleInfDefault(builder, this.doubleInfDefault);\n\n  return Monster.endMonster(builder);\n}\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/race.d.ts",
    "content": "export declare enum Race {\n  None = -1,\n  Human = 0,\n  Dwarf = 1,\n  Elf = 2,\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/race.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nexport var Race;\n(function(Race) {\nRace[Race['None'] = -1] = 'None';\nRace[Race['Human'] = 0] = 'Human';\nRace[Race['Dwarf'] = 1] = 'Dwarf';\nRace[Race['Elf'] = 2] = 'Elf';\n})(Race || (Race = {}));\n"
  },
  {
    "path": "tests/ts/my-game/example/race.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport enum Race {\n  None = -1,\n  Human = 0,\n  Dwarf = 1,\n  Elf = 2\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/referrable.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nexport declare class Referrable\n  implements flatbuffers.IUnpackableObject<ReferrableT>\n{\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Referrable;\n  static getRootAsReferrable(\n    bb: flatbuffers.ByteBuffer,\n    obj?: Referrable,\n  ): Referrable;\n  static getSizePrefixedRootAsReferrable(\n    bb: flatbuffers.ByteBuffer,\n    obj?: Referrable,\n  ): Referrable;\n  id(): bigint;\n  mutate_id(value: bigint): boolean;\n  static getFullyQualifiedName(): string;\n  static startReferrable(builder: flatbuffers.Builder): void;\n  static addId(builder: flatbuffers.Builder, id: bigint): void;\n  static endReferrable(builder: flatbuffers.Builder): flatbuffers.Offset;\n  static createReferrable(\n    builder: flatbuffers.Builder,\n    id: bigint,\n  ): flatbuffers.Offset;\n  serialize(): Uint8Array;\n  static deserialize(buffer: Uint8Array): Referrable;\n  unpack(): ReferrableT;\n  unpackTo(_o: ReferrableT): void;\n}\nexport declare class ReferrableT implements flatbuffers.IGeneratedObject {\n  id: bigint;\n  constructor(id?: bigint);\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/referrable.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\nexport class Referrable {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsReferrable(bb, obj) {\n    return (obj || new Referrable())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsReferrable(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new Referrable())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  id() {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.readUint64(this.bb_pos + offset) : BigInt('0');\n  }\n  mutate_id(value) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint64(this.bb_pos + offset, value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return 'MyGame.Example.Referrable';\n  }\n  static startReferrable(builder) {\n    builder.startObject(1);\n  }\n  static addId(builder, id) {\n    builder.addFieldInt64(0, id, BigInt('0'));\n  }\n  static endReferrable(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static createReferrable(builder, id) {\n    Referrable.startReferrable(builder);\n    Referrable.addId(builder, id);\n    return Referrable.endReferrable(builder);\n  }\n  serialize() {\n    return this.bb.bytes();\n  }\n  static deserialize(buffer) {\n    return Referrable.getRootAsReferrable(new flatbuffers.ByteBuffer(buffer));\n  }\n  unpack() {\n    return new ReferrableT(this.id());\n  }\n  unpackTo(_o) {\n    _o.id = this.id();\n  }\n}\nexport class ReferrableT {\n  constructor(id = BigInt('0')) {\n    this.id = id;\n  }\n  pack(builder) {\n    return Referrable.createReferrable(builder, this.id);\n  }\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/referrable.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\n\n\nexport class Referrable implements flatbuffers.IUnpackableObject<ReferrableT> {\n  bb: flatbuffers.ByteBuffer|null = null;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):Referrable {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\nstatic getRootAsReferrable(bb:flatbuffers.ByteBuffer, obj?:Referrable):Referrable {\n  return (obj || new Referrable()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic getSizePrefixedRootAsReferrable(bb:flatbuffers.ByteBuffer, obj?:Referrable):Referrable {\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n  return (obj || new Referrable()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nid():bigint {\n  const offset = this.bb!.__offset(this.bb_pos, 4);\n  return offset ? this.bb!.readUint64(this.bb_pos + offset) : BigInt('0');\n}\n\nmutate_id(value:bigint):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 4);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeUint64(this.bb_pos + offset, value);\n  return true;\n}\n\nstatic getFullyQualifiedName(): \"MyGame.Example.Referrable\" {\n  return 'MyGame.Example.Referrable';\n}\n\nstatic startReferrable(builder:flatbuffers.Builder) {\n  builder.startObject(1);\n}\n\nstatic addId(builder:flatbuffers.Builder, id:bigint) {\n  builder.addFieldInt64(0, id, BigInt('0'));\n}\n\nstatic endReferrable(builder:flatbuffers.Builder):flatbuffers.Offset {\n  const offset = builder.endObject();\n  return offset;\n}\n\nstatic createReferrable(builder:flatbuffers.Builder, id:bigint):flatbuffers.Offset {\n  Referrable.startReferrable(builder);\n  Referrable.addId(builder, id);\n  return Referrable.endReferrable(builder);\n}\n\nserialize():Uint8Array {\n  return this.bb!.bytes();\n}\n\nstatic deserialize(buffer: Uint8Array):Referrable {\n  return Referrable.getRootAsReferrable(new flatbuffers.ByteBuffer(buffer))\n}\n\nunpack(): ReferrableT {\n  return new ReferrableT(\n    this.id()\n  );\n}\n\n\nunpackTo(_o: ReferrableT): void {\n  _o.id = this.id();\n}\n}\n\nexport class ReferrableT implements flatbuffers.IGeneratedObject {\nconstructor(\n  public id: bigint = BigInt('0')\n){}\n\n\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n  return Referrable.createReferrable(builder,\n    this.id\n  );\n}\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/stat.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nexport declare class Stat implements flatbuffers.IUnpackableObject<StatT> {\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Stat;\n  static getRootAsStat(bb: flatbuffers.ByteBuffer, obj?: Stat): Stat;\n  static getSizePrefixedRootAsStat(\n    bb: flatbuffers.ByteBuffer,\n    obj?: Stat,\n  ): Stat;\n  id(): string | null;\n  id(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  val(): bigint;\n  mutate_val(value: bigint): boolean;\n  count(): number;\n  mutate_count(value: number): boolean;\n  static getFullyQualifiedName(): string;\n  static startStat(builder: flatbuffers.Builder): void;\n  static addId(\n    builder: flatbuffers.Builder,\n    idOffset: flatbuffers.Offset,\n  ): void;\n  static addVal(builder: flatbuffers.Builder, val: bigint): void;\n  static addCount(builder: flatbuffers.Builder, count: number): void;\n  static endStat(builder: flatbuffers.Builder): flatbuffers.Offset;\n  static createStat(\n    builder: flatbuffers.Builder,\n    idOffset: flatbuffers.Offset,\n    val: bigint,\n    count: number,\n  ): flatbuffers.Offset;\n  serialize(): Uint8Array;\n  static deserialize(buffer: Uint8Array): Stat;\n  unpack(): StatT;\n  unpackTo(_o: StatT): void;\n}\nexport declare class StatT implements flatbuffers.IGeneratedObject {\n  id: string | Uint8Array | null;\n  val: bigint;\n  count: number;\n  constructor(id?: string | Uint8Array | null, val?: bigint, count?: number);\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/stat.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\nexport class Stat {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsStat(bb, obj) {\n    return (obj || new Stat())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsStat(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new Stat())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  id(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) :\n                    null;\n  }\n  val() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.readInt64(this.bb_pos + offset) : BigInt('0');\n  }\n  mutate_val(value) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt64(this.bb_pos + offset, value);\n    return true;\n  }\n  count() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? this.bb.readUint16(this.bb_pos + offset) : 0;\n  }\n  mutate_count(value) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint16(this.bb_pos + offset, value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return 'MyGame.Example.Stat';\n  }\n  static startStat(builder) {\n    builder.startObject(3);\n  }\n  static addId(builder, idOffset) {\n    builder.addFieldOffset(0, idOffset, 0);\n  }\n  static addVal(builder, val) {\n    builder.addFieldInt64(1, val, BigInt('0'));\n  }\n  static addCount(builder, count) {\n    builder.addFieldInt16(2, count, 0);\n  }\n  static endStat(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static createStat(builder, idOffset, val, count) {\n    Stat.startStat(builder);\n    Stat.addId(builder, idOffset);\n    Stat.addVal(builder, val);\n    Stat.addCount(builder, count);\n    return Stat.endStat(builder);\n  }\n  serialize() {\n    return this.bb.bytes();\n  }\n  static deserialize(buffer) {\n    return Stat.getRootAsStat(new flatbuffers.ByteBuffer(buffer));\n  }\n  unpack() {\n    return new StatT(this.id(), this.val(), this.count());\n  }\n  unpackTo(_o) {\n    _o.id = this.id();\n    _o.val = this.val();\n    _o.count = this.count();\n  }\n}\nexport class StatT {\n  constructor(id = null, val = BigInt('0'), count = 0) {\n    this.id = id;\n    this.val = val;\n    this.count = count;\n  }\n  pack(builder) {\n    const id = (this.id !== null ? builder.createString(this.id) : 0);\n    return Stat.createStat(builder, id, this.val, this.count);\n  }\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/stat.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\n\n\nexport class Stat implements flatbuffers.IUnpackableObject<StatT> {\n  bb: flatbuffers.ByteBuffer|null = null;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):Stat {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\nstatic getRootAsStat(bb:flatbuffers.ByteBuffer, obj?:Stat):Stat {\n  return (obj || new Stat()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic getSizePrefixedRootAsStat(bb:flatbuffers.ByteBuffer, obj?:Stat):Stat {\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n  return (obj || new Stat()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nid():string|null\nid(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null\nid(optionalEncoding?:any):string|Uint8Array|null {\n  const offset = this.bb!.__offset(this.bb_pos, 4);\n  return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n}\n\nval():bigint {\n  const offset = this.bb!.__offset(this.bb_pos, 6);\n  return offset ? this.bb!.readInt64(this.bb_pos + offset) : BigInt('0');\n}\n\nmutate_val(value:bigint):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 6);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeInt64(this.bb_pos + offset, value);\n  return true;\n}\n\ncount():number {\n  const offset = this.bb!.__offset(this.bb_pos, 8);\n  return offset ? this.bb!.readUint16(this.bb_pos + offset) : 0;\n}\n\nmutate_count(value:number):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 8);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeUint16(this.bb_pos + offset, value);\n  return true;\n}\n\nstatic getFullyQualifiedName(): \"MyGame.Example.Stat\" {\n  return 'MyGame.Example.Stat';\n}\n\nstatic startStat(builder:flatbuffers.Builder) {\n  builder.startObject(3);\n}\n\nstatic addId(builder:flatbuffers.Builder, idOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(0, idOffset, 0);\n}\n\nstatic addVal(builder:flatbuffers.Builder, val:bigint) {\n  builder.addFieldInt64(1, val, BigInt('0'));\n}\n\nstatic addCount(builder:flatbuffers.Builder, count:number) {\n  builder.addFieldInt16(2, count, 0);\n}\n\nstatic endStat(builder:flatbuffers.Builder):flatbuffers.Offset {\n  const offset = builder.endObject();\n  return offset;\n}\n\nstatic createStat(builder:flatbuffers.Builder, idOffset:flatbuffers.Offset, val:bigint, count:number):flatbuffers.Offset {\n  Stat.startStat(builder);\n  Stat.addId(builder, idOffset);\n  Stat.addVal(builder, val);\n  Stat.addCount(builder, count);\n  return Stat.endStat(builder);\n}\n\nserialize():Uint8Array {\n  return this.bb!.bytes();\n}\n\nstatic deserialize(buffer: Uint8Array):Stat {\n  return Stat.getRootAsStat(new flatbuffers.ByteBuffer(buffer))\n}\n\nunpack(): StatT {\n  return new StatT(\n    this.id(),\n    this.val(),\n    this.count()\n  );\n}\n\n\nunpackTo(_o: StatT): void {\n  _o.id = this.id();\n  _o.val = this.val();\n  _o.count = this.count();\n}\n}\n\nexport class StatT implements flatbuffers.IGeneratedObject {\nconstructor(\n  public id: string|Uint8Array|null = null,\n  public val: bigint = BigInt('0'),\n  public count: number = 0\n){}\n\n\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n  const id = (this.id !== null ? builder.createString(this.id!) : 0);\n\n  return Stat.createStat(builder,\n    id,\n    this.val,\n    this.count\n  );\n}\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/struct-of-structs-of-structs.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nimport {\n  StructOfStructs,\n  StructOfStructsT,\n} from '../../my-game/example/struct-of-structs.js';\nexport declare class StructOfStructsOfStructs\n  implements flatbuffers.IUnpackableObject<StructOfStructsOfStructsT>\n{\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): StructOfStructsOfStructs;\n  a(obj?: StructOfStructs): StructOfStructs | null;\n  static getFullyQualifiedName(): string;\n  static sizeOf(): number;\n  static createStructOfStructsOfStructs(\n    builder: flatbuffers.Builder,\n    a_a_id: number,\n    a_a_distance: number,\n    a_b_a: number,\n    a_b_b: number,\n    a_c_id: number,\n    a_c_distance: number,\n  ): flatbuffers.Offset;\n  unpack(): StructOfStructsOfStructsT;\n  unpackTo(_o: StructOfStructsOfStructsT): void;\n}\nexport declare class StructOfStructsOfStructsT\n  implements flatbuffers.IGeneratedObject\n{\n  a: StructOfStructsT | null;\n  constructor(a?: StructOfStructsT | null);\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/struct-of-structs-of-structs.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\nimport {StructOfStructs} from '../../my-game/example/struct-of-structs.js';\nexport class StructOfStructsOfStructs {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  a(obj) {\n    return (obj || new StructOfStructs()).__init(this.bb_pos, this.bb);\n  }\n  static getFullyQualifiedName() {\n    return 'MyGame.Example.StructOfStructsOfStructs';\n  }\n  static sizeOf() {\n    return 20;\n  }\n  static createStructOfStructsOfStructs(\n      builder, a_a_id, a_a_distance, a_b_a, a_b_b, a_c_id, a_c_distance) {\n    builder.prep(4, 20);\n    builder.prep(4, 20);\n    builder.prep(4, 8);\n    builder.writeInt32(a_c_distance);\n    builder.writeInt32(a_c_id);\n    builder.prep(2, 4);\n    builder.pad(1);\n    builder.writeInt8(a_b_b);\n    builder.writeInt16(a_b_a);\n    builder.prep(4, 8);\n    builder.writeInt32(a_a_distance);\n    builder.writeInt32(a_a_id);\n    return builder.offset();\n  }\n  unpack() {\n    return new StructOfStructsOfStructsT(\n        (this.a() !== null ? this.a().unpack() : null));\n  }\n  unpackTo(_o) {\n    _o.a = (this.a() !== null ? this.a().unpack() : null);\n  }\n}\nexport class StructOfStructsOfStructsT {\n  constructor(a = null) {\n    this.a = a;\n  }\n  pack(builder) {\n    return StructOfStructsOfStructs.createStructOfStructsOfStructs(\n        builder, (this.a?.a?.id ?? 0), (this.a?.a?.distance ?? 0),\n        (this.a?.b?.a ?? 0), (this.a?.b?.b ?? 0), (this.a?.c?.id ?? 0),\n        (this.a?.c?.distance ?? 0));\n  }\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/struct-of-structs-of-structs.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport { StructOfStructs, StructOfStructsT } from './struct-of-structs.js';\n\n\nexport class StructOfStructsOfStructs implements flatbuffers.IUnpackableObject<StructOfStructsOfStructsT> {\n  bb: flatbuffers.ByteBuffer|null = null;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):StructOfStructsOfStructs {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\na(obj?:StructOfStructs):StructOfStructs|null {\n  return (obj || new StructOfStructs()).__init(this.bb_pos, this.bb!);\n}\n\nstatic getFullyQualifiedName(): \"MyGame.Example.StructOfStructsOfStructs\" {\n  return 'MyGame.Example.StructOfStructsOfStructs';\n}\n\nstatic sizeOf():number {\n  return 20;\n}\n\nstatic createStructOfStructsOfStructs(builder:flatbuffers.Builder, a_a_id: number, a_a_distance: number, a_b_a: number, a_b_b: number, a_c_id: number, a_c_distance: number):flatbuffers.Offset {\n  builder.prep(4, 20);\n  builder.prep(4, 20);\n  builder.prep(4, 8);\n  builder.writeInt32(a_c_distance);\n  builder.writeInt32(a_c_id);\n  builder.prep(2, 4);\n  builder.pad(1);\n  builder.writeInt8(a_b_b);\n  builder.writeInt16(a_b_a);\n  builder.prep(4, 8);\n  builder.writeInt32(a_a_distance);\n  builder.writeInt32(a_a_id);\n  return builder.offset();\n}\n\n\nunpack(): StructOfStructsOfStructsT {\n  return new StructOfStructsOfStructsT(\n    (this.a() !== null ? this.a()!.unpack() : null)\n  );\n}\n\n\nunpackTo(_o: StructOfStructsOfStructsT): void {\n  _o.a = (this.a() !== null ? this.a()!.unpack() : null);\n}\n}\n\nexport class StructOfStructsOfStructsT implements flatbuffers.IGeneratedObject {\nconstructor(\n  public a: StructOfStructsT|null = null\n){}\n\n\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n  return StructOfStructsOfStructs.createStructOfStructsOfStructs(builder,\n    (this.a?.a?.id ?? 0),\n    (this.a?.a?.distance ?? 0),\n    (this.a?.b?.a ?? 0),\n    (this.a?.b?.b ?? 0),\n    (this.a?.c?.id ?? 0),\n    (this.a?.c?.distance ?? 0)\n  );\n}\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/struct-of-structs.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nimport {Ability, AbilityT} from '../../my-game/example/ability.js';\nimport {Test, TestT} from '../../my-game/example/test.js';\nexport declare class StructOfStructs\n  implements flatbuffers.IUnpackableObject<StructOfStructsT>\n{\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): StructOfStructs;\n  a(obj?: Ability): Ability | null;\n  b(obj?: Test): Test | null;\n  c(obj?: Ability): Ability | null;\n  static getFullyQualifiedName(): string;\n  static sizeOf(): number;\n  static createStructOfStructs(\n    builder: flatbuffers.Builder,\n    a_id: number,\n    a_distance: number,\n    b_a: number,\n    b_b: number,\n    c_id: number,\n    c_distance: number,\n  ): flatbuffers.Offset;\n  unpack(): StructOfStructsT;\n  unpackTo(_o: StructOfStructsT): void;\n}\nexport declare class StructOfStructsT implements flatbuffers.IGeneratedObject {\n  a: AbilityT | null;\n  b: TestT | null;\n  c: AbilityT | null;\n  constructor(a?: AbilityT | null, b?: TestT | null, c?: AbilityT | null);\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/struct-of-structs.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\nimport {Ability} from '../../my-game/example/ability.js';\nimport {Test} from '../../my-game/example/test.js';\nexport class StructOfStructs {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  a(obj) {\n    return (obj || new Ability()).__init(this.bb_pos, this.bb);\n  }\n  b(obj) {\n    return (obj || new Test()).__init(this.bb_pos + 8, this.bb);\n  }\n  c(obj) {\n    return (obj || new Ability()).__init(this.bb_pos + 12, this.bb);\n  }\n  static getFullyQualifiedName() {\n    return 'MyGame.Example.StructOfStructs';\n  }\n  static sizeOf() {\n    return 20;\n  }\n  static createStructOfStructs(\n      builder, a_id, a_distance, b_a, b_b, c_id, c_distance) {\n    builder.prep(4, 20);\n    builder.prep(4, 8);\n    builder.writeInt32(c_distance);\n    builder.writeInt32(c_id);\n    builder.prep(2, 4);\n    builder.pad(1);\n    builder.writeInt8(b_b);\n    builder.writeInt16(b_a);\n    builder.prep(4, 8);\n    builder.writeInt32(a_distance);\n    builder.writeInt32(a_id);\n    return builder.offset();\n  }\n  unpack() {\n    return new StructOfStructsT(\n        (this.a() !== null ? this.a().unpack() : null),\n        (this.b() !== null ? this.b().unpack() : null),\n        (this.c() !== null ? this.c().unpack() : null));\n  }\n  unpackTo(_o) {\n    _o.a = (this.a() !== null ? this.a().unpack() : null);\n    _o.b = (this.b() !== null ? this.b().unpack() : null);\n    _o.c = (this.c() !== null ? this.c().unpack() : null);\n  }\n}\nexport class StructOfStructsT {\n  constructor(a = null, b = null, c = null) {\n    this.a = a;\n    this.b = b;\n    this.c = c;\n  }\n  pack(builder) {\n    return StructOfStructs.createStructOfStructs(\n        builder, (this.a?.id ?? 0), (this.a?.distance ?? 0), (this.b?.a ?? 0),\n        (this.b?.b ?? 0), (this.c?.id ?? 0), (this.c?.distance ?? 0));\n  }\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/struct-of-structs.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport { Ability, AbilityT } from './ability.js';\nimport { Test, TestT } from './test.js';\n\n\nexport class StructOfStructs implements flatbuffers.IUnpackableObject<StructOfStructsT> {\n  bb: flatbuffers.ByteBuffer|null = null;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):StructOfStructs {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\na(obj?:Ability):Ability|null {\n  return (obj || new Ability()).__init(this.bb_pos, this.bb!);\n}\n\nb(obj?:Test):Test|null {\n  return (obj || new Test()).__init(this.bb_pos + 8, this.bb!);\n}\n\nc(obj?:Ability):Ability|null {\n  return (obj || new Ability()).__init(this.bb_pos + 12, this.bb!);\n}\n\nstatic getFullyQualifiedName(): \"MyGame.Example.StructOfStructs\" {\n  return 'MyGame.Example.StructOfStructs';\n}\n\nstatic sizeOf():number {\n  return 20;\n}\n\nstatic createStructOfStructs(builder:flatbuffers.Builder, a_id: number, a_distance: number, b_a: number, b_b: number, c_id: number, c_distance: number):flatbuffers.Offset {\n  builder.prep(4, 20);\n  builder.prep(4, 8);\n  builder.writeInt32(c_distance);\n  builder.writeInt32(c_id);\n  builder.prep(2, 4);\n  builder.pad(1);\n  builder.writeInt8(b_b);\n  builder.writeInt16(b_a);\n  builder.prep(4, 8);\n  builder.writeInt32(a_distance);\n  builder.writeInt32(a_id);\n  return builder.offset();\n}\n\n\nunpack(): StructOfStructsT {\n  return new StructOfStructsT(\n    (this.a() !== null ? this.a()!.unpack() : null),\n    (this.b() !== null ? this.b()!.unpack() : null),\n    (this.c() !== null ? this.c()!.unpack() : null)\n  );\n}\n\n\nunpackTo(_o: StructOfStructsT): void {\n  _o.a = (this.a() !== null ? this.a()!.unpack() : null);\n  _o.b = (this.b() !== null ? this.b()!.unpack() : null);\n  _o.c = (this.c() !== null ? this.c()!.unpack() : null);\n}\n}\n\nexport class StructOfStructsT implements flatbuffers.IGeneratedObject {\nconstructor(\n  public a: AbilityT|null = null,\n  public b: TestT|null = null,\n  public c: AbilityT|null = null\n){}\n\n\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n  return StructOfStructs.createStructOfStructs(builder,\n    (this.a?.id ?? 0),\n    (this.a?.distance ?? 0),\n    (this.b?.a ?? 0),\n    (this.b?.b ?? 0),\n    (this.c?.id ?? 0),\n    (this.c?.distance ?? 0)\n  );\n}\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/test-simple-table-with-enum.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nimport {Color} from '../../my-game/example/color.js';\nexport declare class TestSimpleTableWithEnum\n  implements flatbuffers.IUnpackableObject<TestSimpleTableWithEnumT>\n{\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): TestSimpleTableWithEnum;\n  static getRootAsTestSimpleTableWithEnum(\n    bb: flatbuffers.ByteBuffer,\n    obj?: TestSimpleTableWithEnum,\n  ): TestSimpleTableWithEnum;\n  static getSizePrefixedRootAsTestSimpleTableWithEnum(\n    bb: flatbuffers.ByteBuffer,\n    obj?: TestSimpleTableWithEnum,\n  ): TestSimpleTableWithEnum;\n  color(): Color;\n  mutate_color(value: Color): boolean;\n  static getFullyQualifiedName(): string;\n  static startTestSimpleTableWithEnum(builder: flatbuffers.Builder): void;\n  static addColor(builder: flatbuffers.Builder, color: Color): void;\n  static endTestSimpleTableWithEnum(\n    builder: flatbuffers.Builder,\n  ): flatbuffers.Offset;\n  static createTestSimpleTableWithEnum(\n    builder: flatbuffers.Builder,\n    color: Color,\n  ): flatbuffers.Offset;\n  serialize(): Uint8Array;\n  static deserialize(buffer: Uint8Array): TestSimpleTableWithEnum;\n  unpack(): TestSimpleTableWithEnumT;\n  unpackTo(_o: TestSimpleTableWithEnumT): void;\n}\nexport declare class TestSimpleTableWithEnumT\n  implements flatbuffers.IGeneratedObject\n{\n  color: Color;\n  constructor(color?: Color);\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/test-simple-table-with-enum.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\n\nimport {Color} from '../../my-game/example/color.js';\n\nexport class TestSimpleTableWithEnum {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsTestSimpleTableWithEnum(bb, obj) {\n    return (obj || new TestSimpleTableWithEnum())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsTestSimpleTableWithEnum(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new TestSimpleTableWithEnum())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  color() {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.readUint8(this.bb_pos + offset) : Color.Green;\n  }\n  mutate_color(value) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint8(this.bb_pos + offset, value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return 'MyGame.Example.TestSimpleTableWithEnum';\n  }\n  static startTestSimpleTableWithEnum(builder) {\n    builder.startObject(1);\n  }\n  static addColor(builder, color) {\n    builder.addFieldInt8(0, color, Color.Green);\n  }\n  static endTestSimpleTableWithEnum(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static createTestSimpleTableWithEnum(builder, color) {\n    TestSimpleTableWithEnum.startTestSimpleTableWithEnum(builder);\n    TestSimpleTableWithEnum.addColor(builder, color);\n    return TestSimpleTableWithEnum.endTestSimpleTableWithEnum(builder);\n  }\n  serialize() {\n    return this.bb.bytes();\n  }\n  static deserialize(buffer) {\n    return TestSimpleTableWithEnum.getRootAsTestSimpleTableWithEnum(\n        new flatbuffers.ByteBuffer(buffer));\n  }\n  unpack() {\n    return new TestSimpleTableWithEnumT(this.color());\n  }\n  unpackTo(_o) {\n    _o.color = this.color();\n  }\n}\nexport class TestSimpleTableWithEnumT {\n  constructor(color = Color.Green) {\n    this.color = color;\n  }\n  pack(builder) {\n    return TestSimpleTableWithEnum.createTestSimpleTableWithEnum(\n        builder, this.color);\n  }\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/test-simple-table-with-enum.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport { Color } from './color.js';\n\n\nexport class TestSimpleTableWithEnum implements flatbuffers.IUnpackableObject<TestSimpleTableWithEnumT> {\n  bb: flatbuffers.ByteBuffer|null = null;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):TestSimpleTableWithEnum {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\nstatic getRootAsTestSimpleTableWithEnum(bb:flatbuffers.ByteBuffer, obj?:TestSimpleTableWithEnum):TestSimpleTableWithEnum {\n  return (obj || new TestSimpleTableWithEnum()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic getSizePrefixedRootAsTestSimpleTableWithEnum(bb:flatbuffers.ByteBuffer, obj?:TestSimpleTableWithEnum):TestSimpleTableWithEnum {\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n  return (obj || new TestSimpleTableWithEnum()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\ncolor():Color {\n  const offset = this.bb!.__offset(this.bb_pos, 4);\n  return offset ? this.bb!.readUint8(this.bb_pos + offset) : Color.Green;\n}\n\nmutate_color(value:Color):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 4);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeUint8(this.bb_pos + offset, value);\n  return true;\n}\n\nstatic getFullyQualifiedName(): \"MyGame.Example.TestSimpleTableWithEnum\" {\n  return 'MyGame.Example.TestSimpleTableWithEnum';\n}\n\nstatic startTestSimpleTableWithEnum(builder:flatbuffers.Builder) {\n  builder.startObject(1);\n}\n\nstatic addColor(builder:flatbuffers.Builder, color:Color) {\n  builder.addFieldInt8(0, color, Color.Green);\n}\n\nstatic endTestSimpleTableWithEnum(builder:flatbuffers.Builder):flatbuffers.Offset {\n  const offset = builder.endObject();\n  return offset;\n}\n\nstatic createTestSimpleTableWithEnum(builder:flatbuffers.Builder, color:Color):flatbuffers.Offset {\n  TestSimpleTableWithEnum.startTestSimpleTableWithEnum(builder);\n  TestSimpleTableWithEnum.addColor(builder, color);\n  return TestSimpleTableWithEnum.endTestSimpleTableWithEnum(builder);\n}\n\nserialize():Uint8Array {\n  return this.bb!.bytes();\n}\n\nstatic deserialize(buffer: Uint8Array):TestSimpleTableWithEnum {\n  return TestSimpleTableWithEnum.getRootAsTestSimpleTableWithEnum(new flatbuffers.ByteBuffer(buffer))\n}\n\nunpack(): TestSimpleTableWithEnumT {\n  return new TestSimpleTableWithEnumT(\n    this.color()\n  );\n}\n\n\nunpackTo(_o: TestSimpleTableWithEnumT): void {\n  _o.color = this.color();\n}\n}\n\nexport class TestSimpleTableWithEnumT implements flatbuffers.IGeneratedObject {\nconstructor(\n  public color: Color = Color.Green\n){}\n\n\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n  return TestSimpleTableWithEnum.createTestSimpleTableWithEnum(builder,\n    this.color\n  );\n}\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/test.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nexport declare class Test implements flatbuffers.IUnpackableObject<TestT> {\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Test;\n  a(): number;\n  mutate_a(value: number): boolean;\n  b(): number;\n  mutate_b(value: number): boolean;\n  static getFullyQualifiedName(): string;\n  static sizeOf(): number;\n  static createTest(\n    builder: flatbuffers.Builder,\n    a: number,\n    b: number,\n  ): flatbuffers.Offset;\n  unpack(): TestT;\n  unpackTo(_o: TestT): void;\n}\nexport declare class TestT implements flatbuffers.IGeneratedObject {\n  a: number;\n  b: number;\n  constructor(a?: number, b?: number);\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/test.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\nexport class Test {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  a() {\n    return this.bb.readInt16(this.bb_pos);\n  }\n  mutate_a(value) {\n    this.bb.writeInt16(this.bb_pos + 0, value);\n    return true;\n  }\n  b() {\n    return this.bb.readInt8(this.bb_pos + 2);\n  }\n  mutate_b(value) {\n    this.bb.writeInt8(this.bb_pos + 2, value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return 'MyGame.Example.Test';\n  }\n  static sizeOf() {\n    return 4;\n  }\n  static createTest(builder, a, b) {\n    builder.prep(2, 4);\n    builder.pad(1);\n    builder.writeInt8(b);\n    builder.writeInt16(a);\n    return builder.offset();\n  }\n  unpack() {\n    return new TestT(this.a(), this.b());\n  }\n  unpackTo(_o) {\n    _o.a = this.a();\n    _o.b = this.b();\n  }\n}\nexport class TestT {\n  constructor(a = 0, b = 0) {\n    this.a = a;\n    this.b = b;\n  }\n  pack(builder) {\n    return Test.createTest(builder, this.a, this.b);\n  }\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/test.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\n\n\nexport class Test implements flatbuffers.IUnpackableObject<TestT> {\n  bb: flatbuffers.ByteBuffer|null = null;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):Test {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\na():number {\n  return this.bb!.readInt16(this.bb_pos);\n}\n\nmutate_a(value:number):boolean {\n  this.bb!.writeInt16(this.bb_pos + 0, value);\n  return true;\n}\n\nb():number {\n  return this.bb!.readInt8(this.bb_pos + 2);\n}\n\nmutate_b(value:number):boolean {\n  this.bb!.writeInt8(this.bb_pos + 2, value);\n  return true;\n}\n\nstatic getFullyQualifiedName(): \"MyGame.Example.Test\" {\n  return 'MyGame.Example.Test';\n}\n\nstatic sizeOf():number {\n  return 4;\n}\n\nstatic createTest(builder:flatbuffers.Builder, a: number, b: number):flatbuffers.Offset {\n  builder.prep(2, 4);\n  builder.pad(1);\n  builder.writeInt8(b);\n  builder.writeInt16(a);\n  return builder.offset();\n}\n\n\nunpack(): TestT {\n  return new TestT(\n    this.a(),\n    this.b()\n  );\n}\n\n\nunpackTo(_o: TestT): void {\n  _o.a = this.a();\n  _o.b = this.b();\n}\n}\n\nexport class TestT implements flatbuffers.IGeneratedObject {\nconstructor(\n  public a: number = 0,\n  public b: number = 0\n){}\n\n\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n  return Test.createTest(builder,\n    this.a,\n    this.b\n  );\n}\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/type-aliases.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nexport declare class TypeAliases\n  implements flatbuffers.IUnpackableObject<TypeAliasesT>\n{\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): TypeAliases;\n  static getRootAsTypeAliases(\n    bb: flatbuffers.ByteBuffer,\n    obj?: TypeAliases,\n  ): TypeAliases;\n  static getSizePrefixedRootAsTypeAliases(\n    bb: flatbuffers.ByteBuffer,\n    obj?: TypeAliases,\n  ): TypeAliases;\n  i8(): number;\n  mutate_i8(value: number): boolean;\n  u8(): number;\n  mutate_u8(value: number): boolean;\n  i16(): number;\n  mutate_i16(value: number): boolean;\n  u16(): number;\n  mutate_u16(value: number): boolean;\n  i32(): number;\n  mutate_i32(value: number): boolean;\n  u32(): number;\n  mutate_u32(value: number): boolean;\n  i64(): bigint;\n  mutate_i64(value: bigint): boolean;\n  u64(): bigint;\n  mutate_u64(value: bigint): boolean;\n  f32(): number;\n  mutate_f32(value: number): boolean;\n  f64(): number;\n  mutate_f64(value: number): boolean;\n  v8(index: number): number | null;\n  v8Length(): number;\n  v8Array(): Int8Array | null;\n  vf64(index: number): number | null;\n  vf64Length(): number;\n  vf64Array(): Float64Array | null;\n  static getFullyQualifiedName(): string;\n  static startTypeAliases(builder: flatbuffers.Builder): void;\n  static addI8(builder: flatbuffers.Builder, i8: number): void;\n  static addU8(builder: flatbuffers.Builder, u8: number): void;\n  static addI16(builder: flatbuffers.Builder, i16: number): void;\n  static addU16(builder: flatbuffers.Builder, u16: number): void;\n  static addI32(builder: flatbuffers.Builder, i32: number): void;\n  static addU32(builder: flatbuffers.Builder, u32: number): void;\n  static addI64(builder: flatbuffers.Builder, i64: bigint): void;\n  static addU64(builder: flatbuffers.Builder, u64: bigint): void;\n  static addF32(builder: flatbuffers.Builder, f32: number): void;\n  static addF64(builder: flatbuffers.Builder, f64: number): void;\n  static addV8(\n    builder: flatbuffers.Builder,\n    v8Offset: flatbuffers.Offset,\n  ): void;\n  static createV8Vector(\n    builder: flatbuffers.Builder,\n    data: number[] | Int8Array,\n  ): flatbuffers.Offset;\n  /**\n   * @deprecated This Uint8Array overload will be removed in the future.\n   */\n  static createV8Vector(\n    builder: flatbuffers.Builder,\n    data: number[] | Uint8Array,\n  ): flatbuffers.Offset;\n  static startV8Vector(builder: flatbuffers.Builder, numElems: number): void;\n  static addVf64(\n    builder: flatbuffers.Builder,\n    vf64Offset: flatbuffers.Offset,\n  ): void;\n  static createVf64Vector(\n    builder: flatbuffers.Builder,\n    data: number[] | Float64Array,\n  ): flatbuffers.Offset;\n  /**\n   * @deprecated This Uint8Array overload will be removed in the future.\n   */\n  static createVf64Vector(\n    builder: flatbuffers.Builder,\n    data: number[] | Uint8Array,\n  ): flatbuffers.Offset;\n  static startVf64Vector(builder: flatbuffers.Builder, numElems: number): void;\n  static endTypeAliases(builder: flatbuffers.Builder): flatbuffers.Offset;\n  static createTypeAliases(\n    builder: flatbuffers.Builder,\n    i8: number,\n    u8: number,\n    i16: number,\n    u16: number,\n    i32: number,\n    u32: number,\n    i64: bigint,\n    u64: bigint,\n    f32: number,\n    f64: number,\n    v8Offset: flatbuffers.Offset,\n    vf64Offset: flatbuffers.Offset,\n  ): flatbuffers.Offset;\n  serialize(): Uint8Array;\n  static deserialize(buffer: Uint8Array): TypeAliases;\n  unpack(): TypeAliasesT;\n  unpackTo(_o: TypeAliasesT): void;\n}\nexport declare class TypeAliasesT implements flatbuffers.IGeneratedObject {\n  i8: number;\n  u8: number;\n  i16: number;\n  u16: number;\n  i32: number;\n  u32: number;\n  i64: bigint;\n  u64: bigint;\n  f32: number;\n  f64: number;\n  v8: number[];\n  vf64: number[];\n  constructor(\n    i8?: number,\n    u8?: number,\n    i16?: number,\n    u16?: number,\n    i32?: number,\n    u32?: number,\n    i64?: bigint,\n    u64?: bigint,\n    f32?: number,\n    f64?: number,\n    v8?: number[],\n    vf64?: number[],\n  );\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/type-aliases.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\nexport class TypeAliases {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsTypeAliases(bb, obj) {\n    return (obj || new TypeAliases())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsTypeAliases(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new TypeAliases())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  i8() {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.readInt8(this.bb_pos + offset) : 0;\n  }\n  mutate_i8(value) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, value);\n    return true;\n  }\n  u8() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.readUint8(this.bb_pos + offset) : 0;\n  }\n  mutate_u8(value) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint8(this.bb_pos + offset, value);\n    return true;\n  }\n  i16() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? this.bb.readInt16(this.bb_pos + offset) : 0;\n  }\n  mutate_i16(value) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt16(this.bb_pos + offset, value);\n    return true;\n  }\n  u16() {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.readUint16(this.bb_pos + offset) : 0;\n  }\n  mutate_u16(value) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint16(this.bb_pos + offset, value);\n    return true;\n  }\n  i32() {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n  }\n  mutate_i32(value) {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  u32() {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.readUint32(this.bb_pos + offset) : 0;\n  }\n  mutate_u32(value) {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint32(this.bb_pos + offset, value);\n    return true;\n  }\n  i64() {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    return offset ? this.bb.readInt64(this.bb_pos + offset) : BigInt('0');\n  }\n  mutate_i64(value) {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt64(this.bb_pos + offset, value);\n    return true;\n  }\n  u64() {\n    const offset = this.bb.__offset(this.bb_pos, 18);\n    return offset ? this.bb.readUint64(this.bb_pos + offset) : BigInt('0');\n  }\n  mutate_u64(value) {\n    const offset = this.bb.__offset(this.bb_pos, 18);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint64(this.bb_pos + offset, value);\n    return true;\n  }\n  f32() {\n    const offset = this.bb.__offset(this.bb_pos, 20);\n    return offset ? this.bb.readFloat32(this.bb_pos + offset) : 0.0;\n  }\n  mutate_f32(value) {\n    const offset = this.bb.__offset(this.bb_pos, 20);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeFloat32(this.bb_pos + offset, value);\n    return true;\n  }\n  f64() {\n    const offset = this.bb.__offset(this.bb_pos, 22);\n    return offset ? this.bb.readFloat64(this.bb_pos + offset) : 0.0;\n  }\n  mutate_f64(value) {\n    const offset = this.bb.__offset(this.bb_pos, 22);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeFloat64(this.bb_pos + offset, value);\n    return true;\n  }\n  v8(index) {\n    const offset = this.bb.__offset(this.bb_pos, 24);\n    return offset ?\n        this.bb.readInt8(this.bb.__vector(this.bb_pos + offset) + index) :\n        0;\n  }\n  v8Length() {\n    const offset = this.bb.__offset(this.bb_pos, 24);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  v8Array() {\n    const offset = this.bb.__offset(this.bb_pos, 24);\n    return offset ?\n        new Int8Array(\n            this.bb.bytes().buffer,\n            this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset),\n            this.bb.__vector_len(this.bb_pos + offset)) :\n        null;\n  }\n  vf64(index) {\n    const offset = this.bb.__offset(this.bb_pos, 26);\n    return offset ? this.bb.readFloat64(\n                        this.bb.__vector(this.bb_pos + offset) + index * 8) :\n                    0;\n  }\n  vf64Length() {\n    const offset = this.bb.__offset(this.bb_pos, 26);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  vf64Array() {\n    const offset = this.bb.__offset(this.bb_pos, 26);\n    return offset ?\n        new Float64Array(\n            this.bb.bytes().buffer,\n            this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset),\n            this.bb.__vector_len(this.bb_pos + offset)) :\n        null;\n  }\n  static getFullyQualifiedName() {\n    return 'MyGame.Example.TypeAliases';\n  }\n  static startTypeAliases(builder) {\n    builder.startObject(12);\n  }\n  static addI8(builder, i8) {\n    builder.addFieldInt8(0, i8, 0);\n  }\n  static addU8(builder, u8) {\n    builder.addFieldInt8(1, u8, 0);\n  }\n  static addI16(builder, i16) {\n    builder.addFieldInt16(2, i16, 0);\n  }\n  static addU16(builder, u16) {\n    builder.addFieldInt16(3, u16, 0);\n  }\n  static addI32(builder, i32) {\n    builder.addFieldInt32(4, i32, 0);\n  }\n  static addU32(builder, u32) {\n    builder.addFieldInt32(5, u32, 0);\n  }\n  static addI64(builder, i64) {\n    builder.addFieldInt64(6, i64, BigInt('0'));\n  }\n  static addU64(builder, u64) {\n    builder.addFieldInt64(7, u64, BigInt('0'));\n  }\n  static addF32(builder, f32) {\n    builder.addFieldFloat32(8, f32, 0.0);\n  }\n  static addF64(builder, f64) {\n    builder.addFieldFloat64(9, f64, 0.0);\n  }\n  static addV8(builder, v8Offset) {\n    builder.addFieldOffset(10, v8Offset, 0);\n  }\n  static createV8Vector(builder, data) {\n    builder.startVector(1, data.length, 1);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addInt8(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startV8Vector(builder, numElems) {\n    builder.startVector(1, numElems, 1);\n  }\n  static addVf64(builder, vf64Offset) {\n    builder.addFieldOffset(11, vf64Offset, 0);\n  }\n  static createVf64Vector(builder, data) {\n    builder.startVector(8, data.length, 8);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addFloat64(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startVf64Vector(builder, numElems) {\n    builder.startVector(8, numElems, 8);\n  }\n  static endTypeAliases(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static createTypeAliases(\n      builder, i8, u8, i16, u16, i32, u32, i64, u64, f32, f64, v8Offset,\n      vf64Offset) {\n    TypeAliases.startTypeAliases(builder);\n    TypeAliases.addI8(builder, i8);\n    TypeAliases.addU8(builder, u8);\n    TypeAliases.addI16(builder, i16);\n    TypeAliases.addU16(builder, u16);\n    TypeAliases.addI32(builder, i32);\n    TypeAliases.addU32(builder, u32);\n    TypeAliases.addI64(builder, i64);\n    TypeAliases.addU64(builder, u64);\n    TypeAliases.addF32(builder, f32);\n    TypeAliases.addF64(builder, f64);\n    TypeAliases.addV8(builder, v8Offset);\n    TypeAliases.addVf64(builder, vf64Offset);\n    return TypeAliases.endTypeAliases(builder);\n  }\n  serialize() {\n    return this.bb.bytes();\n  }\n  static deserialize(buffer) {\n    return TypeAliases.getRootAsTypeAliases(new flatbuffers.ByteBuffer(buffer));\n  }\n  unpack() {\n    return new TypeAliasesT(\n        this.i8(), this.u8(), this.i16(), this.u16(), this.i32(), this.u32(),\n        this.i64(), this.u64(), this.f32(), this.f64(),\n        this.bb.createScalarList(this.v8.bind(this), this.v8Length()),\n        this.bb.createScalarList(this.vf64.bind(this), this.vf64Length()));\n  }\n  unpackTo(_o) {\n    _o.i8 = this.i8();\n    _o.u8 = this.u8();\n    _o.i16 = this.i16();\n    _o.u16 = this.u16();\n    _o.i32 = this.i32();\n    _o.u32 = this.u32();\n    _o.i64 = this.i64();\n    _o.u64 = this.u64();\n    _o.f32 = this.f32();\n    _o.f64 = this.f64();\n    _o.v8 = this.bb.createScalarList(this.v8.bind(this), this.v8Length());\n    _o.vf64 = this.bb.createScalarList(this.vf64.bind(this), this.vf64Length());\n  }\n}\nexport class TypeAliasesT {\n  constructor(\n      i8 = 0, u8 = 0, i16 = 0, u16 = 0, i32 = 0, u32 = 0, i64 = BigInt('0'),\n      u64 = BigInt('0'), f32 = 0.0, f64 = 0.0, v8 = [], vf64 = []) {\n    this.i8 = i8;\n    this.u8 = u8;\n    this.i16 = i16;\n    this.u16 = u16;\n    this.i32 = i32;\n    this.u32 = u32;\n    this.i64 = i64;\n    this.u64 = u64;\n    this.f32 = f32;\n    this.f64 = f64;\n    this.v8 = v8;\n    this.vf64 = vf64;\n  }\n  pack(builder) {\n    const v8 = TypeAliases.createV8Vector(builder, this.v8);\n    const vf64 = TypeAliases.createVf64Vector(builder, this.vf64);\n    return TypeAliases.createTypeAliases(\n        builder, this.i8, this.u8, this.i16, this.u16, this.i32, this.u32,\n        this.i64, this.u64, this.f32, this.f64, v8, vf64);\n  }\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/type-aliases.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\n\n\nexport class TypeAliases implements flatbuffers.IUnpackableObject<TypeAliasesT> {\n  bb: flatbuffers.ByteBuffer|null = null;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):TypeAliases {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\nstatic getRootAsTypeAliases(bb:flatbuffers.ByteBuffer, obj?:TypeAliases):TypeAliases {\n  return (obj || new TypeAliases()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic getSizePrefixedRootAsTypeAliases(bb:flatbuffers.ByteBuffer, obj?:TypeAliases):TypeAliases {\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n  return (obj || new TypeAliases()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\ni8():number {\n  const offset = this.bb!.__offset(this.bb_pos, 4);\n  return offset ? this.bb!.readInt8(this.bb_pos + offset) : 0;\n}\n\nmutate_i8(value:number):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 4);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeInt8(this.bb_pos + offset, value);\n  return true;\n}\n\nu8():number {\n  const offset = this.bb!.__offset(this.bb_pos, 6);\n  return offset ? this.bb!.readUint8(this.bb_pos + offset) : 0;\n}\n\nmutate_u8(value:number):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 6);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeUint8(this.bb_pos + offset, value);\n  return true;\n}\n\ni16():number {\n  const offset = this.bb!.__offset(this.bb_pos, 8);\n  return offset ? this.bb!.readInt16(this.bb_pos + offset) : 0;\n}\n\nmutate_i16(value:number):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 8);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeInt16(this.bb_pos + offset, value);\n  return true;\n}\n\nu16():number {\n  const offset = this.bb!.__offset(this.bb_pos, 10);\n  return offset ? this.bb!.readUint16(this.bb_pos + offset) : 0;\n}\n\nmutate_u16(value:number):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 10);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeUint16(this.bb_pos + offset, value);\n  return true;\n}\n\ni32():number {\n  const offset = this.bb!.__offset(this.bb_pos, 12);\n  return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;\n}\n\nmutate_i32(value:number):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 12);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeInt32(this.bb_pos + offset, value);\n  return true;\n}\n\nu32():number {\n  const offset = this.bb!.__offset(this.bb_pos, 14);\n  return offset ? this.bb!.readUint32(this.bb_pos + offset) : 0;\n}\n\nmutate_u32(value:number):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 14);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeUint32(this.bb_pos + offset, value);\n  return true;\n}\n\ni64():bigint {\n  const offset = this.bb!.__offset(this.bb_pos, 16);\n  return offset ? this.bb!.readInt64(this.bb_pos + offset) : BigInt('0');\n}\n\nmutate_i64(value:bigint):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 16);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeInt64(this.bb_pos + offset, value);\n  return true;\n}\n\nu64():bigint {\n  const offset = this.bb!.__offset(this.bb_pos, 18);\n  return offset ? this.bb!.readUint64(this.bb_pos + offset) : BigInt('0');\n}\n\nmutate_u64(value:bigint):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 18);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeUint64(this.bb_pos + offset, value);\n  return true;\n}\n\nf32():number {\n  const offset = this.bb!.__offset(this.bb_pos, 20);\n  return offset ? this.bb!.readFloat32(this.bb_pos + offset) : 0.0;\n}\n\nmutate_f32(value:number):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 20);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeFloat32(this.bb_pos + offset, value);\n  return true;\n}\n\nf64():number {\n  const offset = this.bb!.__offset(this.bb_pos, 22);\n  return offset ? this.bb!.readFloat64(this.bb_pos + offset) : 0.0;\n}\n\nmutate_f64(value:number):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 22);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeFloat64(this.bb_pos + offset, value);\n  return true;\n}\n\nv8(index: number):number|null {\n  const offset = this.bb!.__offset(this.bb_pos, 24);\n  return offset ? this.bb!.readInt8(this.bb!.__vector(this.bb_pos + offset) + index) : 0;\n}\n\nv8Length():number {\n  const offset = this.bb!.__offset(this.bb_pos, 24);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\nv8Array():Int8Array|null {\n  const offset = this.bb!.__offset(this.bb_pos, 24);\n  return offset ? new Int8Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\n}\n\nvf64(index: number):number|null {\n  const offset = this.bb!.__offset(this.bb_pos, 26);\n  return offset ? this.bb!.readFloat64(this.bb!.__vector(this.bb_pos + offset) + index * 8) : 0;\n}\n\nvf64Length():number {\n  const offset = this.bb!.__offset(this.bb_pos, 26);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\nvf64Array():Float64Array|null {\n  const offset = this.bb!.__offset(this.bb_pos, 26);\n  return offset ? new Float64Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\n}\n\nstatic getFullyQualifiedName(): \"MyGame.Example.TypeAliases\" {\n  return 'MyGame.Example.TypeAliases';\n}\n\nstatic startTypeAliases(builder:flatbuffers.Builder) {\n  builder.startObject(12);\n}\n\nstatic addI8(builder:flatbuffers.Builder, i8:number) {\n  builder.addFieldInt8(0, i8, 0);\n}\n\nstatic addU8(builder:flatbuffers.Builder, u8:number) {\n  builder.addFieldInt8(1, u8, 0);\n}\n\nstatic addI16(builder:flatbuffers.Builder, i16:number) {\n  builder.addFieldInt16(2, i16, 0);\n}\n\nstatic addU16(builder:flatbuffers.Builder, u16:number) {\n  builder.addFieldInt16(3, u16, 0);\n}\n\nstatic addI32(builder:flatbuffers.Builder, i32:number) {\n  builder.addFieldInt32(4, i32, 0);\n}\n\nstatic addU32(builder:flatbuffers.Builder, u32:number) {\n  builder.addFieldInt32(5, u32, 0);\n}\n\nstatic addI64(builder:flatbuffers.Builder, i64:bigint) {\n  builder.addFieldInt64(6, i64, BigInt('0'));\n}\n\nstatic addU64(builder:flatbuffers.Builder, u64:bigint) {\n  builder.addFieldInt64(7, u64, BigInt('0'));\n}\n\nstatic addF32(builder:flatbuffers.Builder, f32:number) {\n  builder.addFieldFloat32(8, f32, 0.0);\n}\n\nstatic addF64(builder:flatbuffers.Builder, f64:number) {\n  builder.addFieldFloat64(9, f64, 0.0);\n}\n\nstatic addV8(builder:flatbuffers.Builder, v8Offset:flatbuffers.Offset) {\n  builder.addFieldOffset(10, v8Offset, 0);\n}\n\nstatic createV8Vector(builder:flatbuffers.Builder, data:number[]|Int8Array):flatbuffers.Offset;\n/**\n * @deprecated This Uint8Array overload will be removed in the future.\n */\nstatic createV8Vector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset;\nstatic createV8Vector(builder:flatbuffers.Builder, data:number[]|Int8Array|Uint8Array):flatbuffers.Offset {\n  builder.startVector(1, data.length, 1);\n  for (let i = data.length - 1; i >= 0; i--) {\n    builder.addInt8(data[i]!);\n  }\n  return builder.endVector();\n}\n\nstatic startV8Vector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(1, numElems, 1);\n}\n\nstatic addVf64(builder:flatbuffers.Builder, vf64Offset:flatbuffers.Offset) {\n  builder.addFieldOffset(11, vf64Offset, 0);\n}\n\nstatic createVf64Vector(builder:flatbuffers.Builder, data:number[]|Float64Array):flatbuffers.Offset;\n/**\n * @deprecated This Uint8Array overload will be removed in the future.\n */\nstatic createVf64Vector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset;\nstatic createVf64Vector(builder:flatbuffers.Builder, data:number[]|Float64Array|Uint8Array):flatbuffers.Offset {\n  builder.startVector(8, data.length, 8);\n  for (let i = data.length - 1; i >= 0; i--) {\n    builder.addFloat64(data[i]!);\n  }\n  return builder.endVector();\n}\n\nstatic startVf64Vector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(8, numElems, 8);\n}\n\nstatic endTypeAliases(builder:flatbuffers.Builder):flatbuffers.Offset {\n  const offset = builder.endObject();\n  return offset;\n}\n\nstatic createTypeAliases(builder:flatbuffers.Builder, i8:number, u8:number, i16:number, u16:number, i32:number, u32:number, i64:bigint, u64:bigint, f32:number, f64:number, v8Offset:flatbuffers.Offset, vf64Offset:flatbuffers.Offset):flatbuffers.Offset {\n  TypeAliases.startTypeAliases(builder);\n  TypeAliases.addI8(builder, i8);\n  TypeAliases.addU8(builder, u8);\n  TypeAliases.addI16(builder, i16);\n  TypeAliases.addU16(builder, u16);\n  TypeAliases.addI32(builder, i32);\n  TypeAliases.addU32(builder, u32);\n  TypeAliases.addI64(builder, i64);\n  TypeAliases.addU64(builder, u64);\n  TypeAliases.addF32(builder, f32);\n  TypeAliases.addF64(builder, f64);\n  TypeAliases.addV8(builder, v8Offset);\n  TypeAliases.addVf64(builder, vf64Offset);\n  return TypeAliases.endTypeAliases(builder);\n}\n\nserialize():Uint8Array {\n  return this.bb!.bytes();\n}\n\nstatic deserialize(buffer: Uint8Array):TypeAliases {\n  return TypeAliases.getRootAsTypeAliases(new flatbuffers.ByteBuffer(buffer))\n}\n\nunpack(): TypeAliasesT {\n  return new TypeAliasesT(\n    this.i8(),\n    this.u8(),\n    this.i16(),\n    this.u16(),\n    this.i32(),\n    this.u32(),\n    this.i64(),\n    this.u64(),\n    this.f32(),\n    this.f64(),\n    this.bb!.createScalarList<number>(this.v8.bind(this), this.v8Length()),\n    this.bb!.createScalarList<number>(this.vf64.bind(this), this.vf64Length())\n  );\n}\n\n\nunpackTo(_o: TypeAliasesT): void {\n  _o.i8 = this.i8();\n  _o.u8 = this.u8();\n  _o.i16 = this.i16();\n  _o.u16 = this.u16();\n  _o.i32 = this.i32();\n  _o.u32 = this.u32();\n  _o.i64 = this.i64();\n  _o.u64 = this.u64();\n  _o.f32 = this.f32();\n  _o.f64 = this.f64();\n  _o.v8 = this.bb!.createScalarList<number>(this.v8.bind(this), this.v8Length());\n  _o.vf64 = this.bb!.createScalarList<number>(this.vf64.bind(this), this.vf64Length());\n}\n}\n\nexport class TypeAliasesT implements flatbuffers.IGeneratedObject {\nconstructor(\n  public i8: number = 0,\n  public u8: number = 0,\n  public i16: number = 0,\n  public u16: number = 0,\n  public i32: number = 0,\n  public u32: number = 0,\n  public i64: bigint = BigInt('0'),\n  public u64: bigint = BigInt('0'),\n  public f32: number = 0.0,\n  public f64: number = 0.0,\n  public v8: (number)[] = [],\n  public vf64: (number)[] = []\n){}\n\n\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n  const v8 = TypeAliases.createV8Vector(builder, this.v8);\n  const vf64 = TypeAliases.createVf64Vector(builder, this.vf64);\n\n  return TypeAliases.createTypeAliases(builder,\n    this.i8,\n    this.u8,\n    this.i16,\n    this.u16,\n    this.i32,\n    this.u32,\n    this.i64,\n    this.u64,\n    this.f32,\n    this.f64,\n    v8,\n    vf64\n  );\n}\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/vec3.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nimport {Color} from '../../my-game/example/color.js';\nimport {Test, TestT} from '../../my-game/example/test.js';\nexport declare class Vec3 implements flatbuffers.IUnpackableObject<Vec3T> {\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Vec3;\n  x(): number;\n  mutate_x(value: number): boolean;\n  y(): number;\n  mutate_y(value: number): boolean;\n  z(): number;\n  mutate_z(value: number): boolean;\n  test1(): number;\n  mutate_test1(value: number): boolean;\n  test2(): Color;\n  mutate_test2(value: Color): boolean;\n  test3(obj?: Test): Test | null;\n  static getFullyQualifiedName(): string;\n  static sizeOf(): number;\n  static createVec3(\n    builder: flatbuffers.Builder,\n    x: number,\n    y: number,\n    z: number,\n    test1: number,\n    test2: Color,\n    test3_a: number,\n    test3_b: number,\n  ): flatbuffers.Offset;\n  unpack(): Vec3T;\n  unpackTo(_o: Vec3T): void;\n}\nexport declare class Vec3T implements flatbuffers.IGeneratedObject {\n  x: number;\n  y: number;\n  z: number;\n  test1: number;\n  test2: Color;\n  test3: TestT | null;\n  constructor(\n    x?: number,\n    y?: number,\n    z?: number,\n    test1?: number,\n    test2?: Color,\n    test3?: TestT | null,\n  );\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/vec3.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\nimport {Color} from '../../my-game/example/color.js';\nimport {Test} from '../../my-game/example/test.js';\nexport class Vec3 {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  x() {\n    return this.bb.readFloat32(this.bb_pos);\n  }\n  mutate_x(value) {\n    this.bb.writeFloat32(this.bb_pos + 0, value);\n    return true;\n  }\n  y() {\n    return this.bb.readFloat32(this.bb_pos + 4);\n  }\n  mutate_y(value) {\n    this.bb.writeFloat32(this.bb_pos + 4, value);\n    return true;\n  }\n  z() {\n    return this.bb.readFloat32(this.bb_pos + 8);\n  }\n  mutate_z(value) {\n    this.bb.writeFloat32(this.bb_pos + 8, value);\n    return true;\n  }\n  test1() {\n    return this.bb.readFloat64(this.bb_pos + 16);\n  }\n  mutate_test1(value) {\n    this.bb.writeFloat64(this.bb_pos + 16, value);\n    return true;\n  }\n  test2() {\n    return this.bb.readUint8(this.bb_pos + 24);\n  }\n  mutate_test2(value) {\n    this.bb.writeUint8(this.bb_pos + 24, value);\n    return true;\n  }\n  test3(obj) {\n    return (obj || new Test()).__init(this.bb_pos + 26, this.bb);\n  }\n  static getFullyQualifiedName() {\n    return 'MyGame.Example.Vec3';\n  }\n  static sizeOf() {\n    return 32;\n  }\n  static createVec3(builder, x, y, z, test1, test2, test3_a, test3_b) {\n    builder.prep(8, 32);\n    builder.pad(2);\n    builder.prep(2, 4);\n    builder.pad(1);\n    builder.writeInt8(test3_b);\n    builder.writeInt16(test3_a);\n    builder.pad(1);\n    builder.writeInt8(test2);\n    builder.writeFloat64(test1);\n    builder.pad(4);\n    builder.writeFloat32(z);\n    builder.writeFloat32(y);\n    builder.writeFloat32(x);\n    return builder.offset();\n  }\n  unpack() {\n    return new Vec3T(\n        this.x(), this.y(), this.z(), this.test1(), this.test2(),\n        (this.test3() !== null ? this.test3().unpack() : null));\n  }\n  unpackTo(_o) {\n    _o.x = this.x();\n    _o.y = this.y();\n    _o.z = this.z();\n    _o.test1 = this.test1();\n    _o.test2 = this.test2();\n    _o.test3 = (this.test3() !== null ? this.test3().unpack() : null);\n  }\n}\nexport class Vec3T {\n  constructor(\n      x = 0.0, y = 0.0, z = 0.0, test1 = 0.0, test2 = Color.Red, test3 = null) {\n    this.x = x;\n    this.y = y;\n    this.z = z;\n    this.test1 = test1;\n    this.test2 = test2;\n    this.test3 = test3;\n  }\n  pack(builder) {\n    return Vec3.createVec3(\n        builder, this.x, this.y, this.z, this.test1, this.test2,\n        (this.test3?.a ?? 0), (this.test3?.b ?? 0));\n  }\n}\n"
  },
  {
    "path": "tests/ts/my-game/example/vec3.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport { Color } from './color.js';\nimport { Test, TestT } from './test.js';\n\n\nexport class Vec3 implements flatbuffers.IUnpackableObject<Vec3T> {\n  bb: flatbuffers.ByteBuffer|null = null;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):Vec3 {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\nx():number {\n  return this.bb!.readFloat32(this.bb_pos);\n}\n\nmutate_x(value:number):boolean {\n  this.bb!.writeFloat32(this.bb_pos + 0, value);\n  return true;\n}\n\ny():number {\n  return this.bb!.readFloat32(this.bb_pos + 4);\n}\n\nmutate_y(value:number):boolean {\n  this.bb!.writeFloat32(this.bb_pos + 4, value);\n  return true;\n}\n\nz():number {\n  return this.bb!.readFloat32(this.bb_pos + 8);\n}\n\nmutate_z(value:number):boolean {\n  this.bb!.writeFloat32(this.bb_pos + 8, value);\n  return true;\n}\n\ntest1():number {\n  return this.bb!.readFloat64(this.bb_pos + 16);\n}\n\nmutate_test1(value:number):boolean {\n  this.bb!.writeFloat64(this.bb_pos + 16, value);\n  return true;\n}\n\ntest2():Color {\n  return this.bb!.readUint8(this.bb_pos + 24);\n}\n\nmutate_test2(value:Color):boolean {\n  this.bb!.writeUint8(this.bb_pos + 24, value);\n  return true;\n}\n\ntest3(obj?:Test):Test|null {\n  return (obj || new Test()).__init(this.bb_pos + 26, this.bb!);\n}\n\nstatic getFullyQualifiedName(): \"MyGame.Example.Vec3\" {\n  return 'MyGame.Example.Vec3';\n}\n\nstatic sizeOf():number {\n  return 32;\n}\n\nstatic createVec3(builder:flatbuffers.Builder, x: number, y: number, z: number, test1: number, test2: Color, test3_a: number, test3_b: number):flatbuffers.Offset {\n  builder.prep(8, 32);\n  builder.pad(2);\n  builder.prep(2, 4);\n  builder.pad(1);\n  builder.writeInt8(test3_b);\n  builder.writeInt16(test3_a);\n  builder.pad(1);\n  builder.writeInt8(test2);\n  builder.writeFloat64(test1);\n  builder.pad(4);\n  builder.writeFloat32(z);\n  builder.writeFloat32(y);\n  builder.writeFloat32(x);\n  return builder.offset();\n}\n\n\nunpack(): Vec3T {\n  return new Vec3T(\n    this.x(),\n    this.y(),\n    this.z(),\n    this.test1(),\n    this.test2(),\n    (this.test3() !== null ? this.test3()!.unpack() : null)\n  );\n}\n\n\nunpackTo(_o: Vec3T): void {\n  _o.x = this.x();\n  _o.y = this.y();\n  _o.z = this.z();\n  _o.test1 = this.test1();\n  _o.test2 = this.test2();\n  _o.test3 = (this.test3() !== null ? this.test3()!.unpack() : null);\n}\n}\n\nexport class Vec3T implements flatbuffers.IGeneratedObject {\nconstructor(\n  public x: number = 0.0,\n  public y: number = 0.0,\n  public z: number = 0.0,\n  public test1: number = 0.0,\n  public test2: Color = Color.Red,\n  public test3: TestT|null = null\n){}\n\n\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n  return Vec3.createVec3(builder,\n    this.x,\n    this.y,\n    this.z,\n    this.test1,\n    this.test2,\n    (this.test3?.a ?? 0),\n    (this.test3?.b ?? 0)\n  );\n}\n}\n"
  },
  {
    "path": "tests/ts/my-game/example.d.ts",
    "content": "export {Ability, AbilityT} from './example/ability.js';\nexport {AnyAmbiguousAliases} from './example/any-ambiguous-aliases.js';\nexport {AnyUniqueAliases} from './example/any-unique-aliases.js';\nexport {Any} from './example/any.js';\nexport {Color} from './example/color.js';\nexport {LongEnum} from './example/long-enum.js';\nexport {Monster, MonsterT} from './example/monster.js';\nexport {Race} from './example/race.js';\nexport {Referrable, ReferrableT} from './example/referrable.js';\nexport {Stat, StatT} from './example/stat.js';\nexport {\n  StructOfStructsOfStructs,\n  StructOfStructsOfStructsT,\n} from './example/struct-of-structs-of-structs.js';\nexport {\n  StructOfStructs,\n  StructOfStructsT,\n} from './example/struct-of-structs.js';\nexport {\n  TestSimpleTableWithEnum,\n  TestSimpleTableWithEnumT,\n} from './example/test-simple-table-with-enum.js';\nexport {Test, TestT} from './example/test.js';\nexport {TypeAliases, TypeAliasesT} from './example/type-aliases.js';\nexport {Vec3, Vec3T} from './example/vec3.js';\n"
  },
  {
    "path": "tests/ts/my-game/example.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nexport {Ability, AbilityT} from './example/ability.js';\nexport {AnyAmbiguousAliases} from './example/any-ambiguous-aliases.js';\nexport {AnyUniqueAliases} from './example/any-unique-aliases.js';\nexport {Any} from './example/any.js';\nexport {Color} from './example/color.js';\nexport {LongEnum} from './example/long-enum.js';\nexport {Monster, MonsterT} from './example/monster.js';\nexport {Race} from './example/race.js';\nexport {Referrable, ReferrableT} from './example/referrable.js';\nexport {Stat, StatT} from './example/stat.js';\nexport {StructOfStructsOfStructs, StructOfStructsOfStructsT} from './example/struct-of-structs-of-structs.js';\nexport {StructOfStructs, StructOfStructsT} from './example/struct-of-structs.js';\nexport {TestSimpleTableWithEnum, TestSimpleTableWithEnumT} from './example/test-simple-table-with-enum.js';\nexport {Test, TestT} from './example/test.js';\nexport {TypeAliases, TypeAliasesT} from './example/type-aliases.js';\nexport {Vec3, Vec3T} from './example/vec3.js';\n"
  },
  {
    "path": "tests/ts/my-game/example.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport { Ability, AbilityT } from './example/ability.js';\nexport { Any } from './example/any.js';\nexport { AnyAmbiguousAliases } from './example/any-ambiguous-aliases.js';\nexport { AnyUniqueAliases } from './example/any-unique-aliases.js';\nexport { Color } from './example/color.js';\nexport { LongEnum } from './example/long-enum.js';\nexport { Monster, MonsterT } from './example/monster.js';\nexport { Race } from './example/race.js';\nexport { Referrable, ReferrableT } from './example/referrable.js';\nexport { Stat, StatT } from './example/stat.js';\nexport { StructOfStructs, StructOfStructsT } from './example/struct-of-structs.js';\nexport { StructOfStructsOfStructs, StructOfStructsOfStructsT } from './example/struct-of-structs-of-structs.js';\nexport { Test, TestT } from './example/test.js';\nexport { TestSimpleTableWithEnum, TestSimpleTableWithEnumT } from './example/test-simple-table-with-enum.js';\nexport { TypeAliases, TypeAliasesT } from './example/type-aliases.js';\nexport { Vec3, Vec3T } from './example/vec3.js';\n"
  },
  {
    "path": "tests/ts/my-game/example2/monster.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nexport declare class Monster\n  implements flatbuffers.IUnpackableObject<MonsterT>\n{\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Monster;\n  static getRootAsMonster(bb: flatbuffers.ByteBuffer, obj?: Monster): Monster;\n  static getSizePrefixedRootAsMonster(\n    bb: flatbuffers.ByteBuffer,\n    obj?: Monster,\n  ): Monster;\n  static getFullyQualifiedName(): string;\n  static startMonster(builder: flatbuffers.Builder): void;\n  static endMonster(builder: flatbuffers.Builder): flatbuffers.Offset;\n  static createMonster(builder: flatbuffers.Builder): flatbuffers.Offset;\n  serialize(): Uint8Array;\n  static deserialize(buffer: Uint8Array): Monster;\n  unpack(): MonsterT;\n  unpackTo(_o: MonsterT): void;\n}\nexport declare class MonsterT implements flatbuffers.IGeneratedObject {\n  constructor();\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/my-game/example2/monster.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\nexport class Monster {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsMonster(bb, obj) {\n    return (obj || new Monster())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsMonster(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new Monster())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getFullyQualifiedName() {\n    return 'MyGame.Example2.Monster';\n  }\n  static startMonster(builder) {\n    builder.startObject(0);\n  }\n  static endMonster(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static createMonster(builder) {\n    Monster.startMonster(builder);\n    return Monster.endMonster(builder);\n  }\n  serialize() {\n    return this.bb.bytes();\n  }\n  static deserialize(buffer) {\n    return Monster.getRootAsMonster(new flatbuffers.ByteBuffer(buffer));\n  }\n  unpack() {\n    return new MonsterT();\n  }\n  unpackTo(_o) {}\n}\nexport class MonsterT {\n  constructor() {}\n  pack(builder) {\n    return Monster.createMonster(builder);\n  }\n}\n"
  },
  {
    "path": "tests/ts/my-game/example2/monster.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\n\n\nexport class Monster implements flatbuffers.IUnpackableObject<MonsterT> {\n  bb: flatbuffers.ByteBuffer|null = null;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):Monster {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\nstatic getRootAsMonster(bb:flatbuffers.ByteBuffer, obj?:Monster):Monster {\n  return (obj || new Monster()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic getSizePrefixedRootAsMonster(bb:flatbuffers.ByteBuffer, obj?:Monster):Monster {\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n  return (obj || new Monster()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic getFullyQualifiedName(): \"MyGame.Example2.Monster\" {\n  return 'MyGame.Example2.Monster';\n}\n\nstatic startMonster(builder:flatbuffers.Builder) {\n  builder.startObject(0);\n}\n\nstatic endMonster(builder:flatbuffers.Builder):flatbuffers.Offset {\n  const offset = builder.endObject();\n  return offset;\n}\n\nstatic createMonster(builder:flatbuffers.Builder):flatbuffers.Offset {\n  Monster.startMonster(builder);\n  return Monster.endMonster(builder);\n}\n\nserialize():Uint8Array {\n  return this.bb!.bytes();\n}\n\nstatic deserialize(buffer: Uint8Array):Monster {\n  return Monster.getRootAsMonster(new flatbuffers.ByteBuffer(buffer))\n}\n\nunpack(): MonsterT {\n  return new MonsterT();\n}\n\n\nunpackTo(_o: MonsterT): void {}\n}\n\nexport class MonsterT implements flatbuffers.IGeneratedObject {\nconstructor(){}\n\n\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n  return Monster.createMonster(builder);\n}\n}\n"
  },
  {
    "path": "tests/ts/my-game/example2.d.ts",
    "content": "export {Monster, MonsterT} from './example2/monster.js';\n"
  },
  {
    "path": "tests/ts/my-game/example2.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nexport {Monster, MonsterT} from './example2/monster.js';\n"
  },
  {
    "path": "tests/ts/my-game/example2.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport { Monster, MonsterT } from './example2/monster.js';\n"
  },
  {
    "path": "tests/ts/my-game/in-parent-namespace.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nexport declare class InParentNamespace\n  implements flatbuffers.IUnpackableObject<InParentNamespaceT>\n{\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): InParentNamespace;\n  static getRootAsInParentNamespace(\n    bb: flatbuffers.ByteBuffer,\n    obj?: InParentNamespace,\n  ): InParentNamespace;\n  static getSizePrefixedRootAsInParentNamespace(\n    bb: flatbuffers.ByteBuffer,\n    obj?: InParentNamespace,\n  ): InParentNamespace;\n  static getFullyQualifiedName(): string;\n  static startInParentNamespace(builder: flatbuffers.Builder): void;\n  static endInParentNamespace(builder: flatbuffers.Builder): flatbuffers.Offset;\n  static createInParentNamespace(\n    builder: flatbuffers.Builder,\n  ): flatbuffers.Offset;\n  serialize(): Uint8Array;\n  static deserialize(buffer: Uint8Array): InParentNamespace;\n  unpack(): InParentNamespaceT;\n  unpackTo(_o: InParentNamespaceT): void;\n}\nexport declare class InParentNamespaceT\n  implements flatbuffers.IGeneratedObject\n{\n  constructor();\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/my-game/in-parent-namespace.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\nexport class InParentNamespace {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsInParentNamespace(bb, obj) {\n    return (obj || new InParentNamespace())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsInParentNamespace(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new InParentNamespace())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getFullyQualifiedName() {\n    return 'MyGame.InParentNamespace';\n  }\n  static startInParentNamespace(builder) {\n    builder.startObject(0);\n  }\n  static endInParentNamespace(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static createInParentNamespace(builder) {\n    InParentNamespace.startInParentNamespace(builder);\n    return InParentNamespace.endInParentNamespace(builder);\n  }\n  serialize() {\n    return this.bb.bytes();\n  }\n  static deserialize(buffer) {\n    return InParentNamespace.getRootAsInParentNamespace(\n        new flatbuffers.ByteBuffer(buffer));\n  }\n  unpack() {\n    return new InParentNamespaceT();\n  }\n  unpackTo(_o) {}\n}\nexport class InParentNamespaceT {\n  constructor() {}\n  pack(builder) {\n    return InParentNamespace.createInParentNamespace(builder);\n  }\n}\n"
  },
  {
    "path": "tests/ts/my-game/in-parent-namespace.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\n\n\nexport class InParentNamespace implements flatbuffers.IUnpackableObject<InParentNamespaceT> {\n  bb: flatbuffers.ByteBuffer|null = null;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):InParentNamespace {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\nstatic getRootAsInParentNamespace(bb:flatbuffers.ByteBuffer, obj?:InParentNamespace):InParentNamespace {\n  return (obj || new InParentNamespace()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic getSizePrefixedRootAsInParentNamespace(bb:flatbuffers.ByteBuffer, obj?:InParentNamespace):InParentNamespace {\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n  return (obj || new InParentNamespace()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic getFullyQualifiedName(): \"MyGame.InParentNamespace\" {\n  return 'MyGame.InParentNamespace';\n}\n\nstatic startInParentNamespace(builder:flatbuffers.Builder) {\n  builder.startObject(0);\n}\n\nstatic endInParentNamespace(builder:flatbuffers.Builder):flatbuffers.Offset {\n  const offset = builder.endObject();\n  return offset;\n}\n\nstatic createInParentNamespace(builder:flatbuffers.Builder):flatbuffers.Offset {\n  InParentNamespace.startInParentNamespace(builder);\n  return InParentNamespace.endInParentNamespace(builder);\n}\n\nserialize():Uint8Array {\n  return this.bb!.bytes();\n}\n\nstatic deserialize(buffer: Uint8Array):InParentNamespace {\n  return InParentNamespace.getRootAsInParentNamespace(new flatbuffers.ByteBuffer(buffer))\n}\n\nunpack(): InParentNamespaceT {\n  return new InParentNamespaceT();\n}\n\n\nunpackTo(_o: InParentNamespaceT): void {}\n}\n\nexport class InParentNamespaceT implements flatbuffers.IGeneratedObject {\nconstructor(){}\n\n\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n  return InParentNamespace.createInParentNamespace(builder);\n}\n}\n"
  },
  {
    "path": "tests/ts/my-game/other-name-space/from-include.d.ts",
    "content": "export declare enum FromInclude {\n  IncludeVal = '0',\n}\n"
  },
  {
    "path": "tests/ts/my-game/other-name-space/from-include.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nexport var FromInclude;\n(function(FromInclude) {\nFromInclude['IncludeVal'] = '0';\n})(FromInclude || (FromInclude = {}));\n"
  },
  {
    "path": "tests/ts/my-game/other-name-space/from-include.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport enum FromInclude {\n  IncludeVal = '0',\n}\n"
  },
  {
    "path": "tests/ts/my-game/other-name-space/table-b.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nimport {TableA, TableAT} from '../../table-a.js';\nexport declare class TableB implements flatbuffers.IUnpackableObject<TableBT> {\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): TableB;\n  static getRootAsTableB(bb: flatbuffers.ByteBuffer, obj?: TableB): TableB;\n  static getSizePrefixedRootAsTableB(\n    bb: flatbuffers.ByteBuffer,\n    obj?: TableB,\n  ): TableB;\n  a(obj?: TableA): TableA | null;\n  static getFullyQualifiedName(): string;\n  static startTableB(builder: flatbuffers.Builder): void;\n  static addA(builder: flatbuffers.Builder, aOffset: flatbuffers.Offset): void;\n  static endTableB(builder: flatbuffers.Builder): flatbuffers.Offset;\n  static createTableB(\n    builder: flatbuffers.Builder,\n    aOffset: flatbuffers.Offset,\n  ): flatbuffers.Offset;\n  serialize(): Uint8Array;\n  static deserialize(buffer: Uint8Array): TableB;\n  unpack(): TableBT;\n  unpackTo(_o: TableBT): void;\n}\nexport declare class TableBT implements flatbuffers.IGeneratedObject {\n  a: TableAT | null;\n  constructor(a?: TableAT | null);\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/my-game/other-name-space/table-b.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\n\nimport {TableA} from '../../table-a.js';\n\nexport class TableB {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsTableB(bb, obj) {\n    return (obj || new TableB())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsTableB(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new TableB())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  a(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ?\n        (obj || new TableA())\n            .__init(this.bb.__indirect(this.bb_pos + offset), this.bb) :\n        null;\n  }\n  static getFullyQualifiedName() {\n    return 'MyGame.OtherNameSpace.TableB';\n  }\n  static startTableB(builder) {\n    builder.startObject(1);\n  }\n  static addA(builder, aOffset) {\n    builder.addFieldOffset(0, aOffset, 0);\n  }\n  static endTableB(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static createTableB(builder, aOffset) {\n    TableB.startTableB(builder);\n    TableB.addA(builder, aOffset);\n    return TableB.endTableB(builder);\n  }\n  serialize() {\n    return this.bb.bytes();\n  }\n  static deserialize(buffer) {\n    return TableB.getRootAsTableB(new flatbuffers.ByteBuffer(buffer));\n  }\n  unpack() {\n    return new TableBT((this.a() !== null ? this.a().unpack() : null));\n  }\n  unpackTo(_o) {\n    _o.a = (this.a() !== null ? this.a().unpack() : null);\n  }\n}\nexport class TableBT {\n  constructor(a = null) {\n    this.a = a;\n  }\n  pack(builder) {\n    const a = (this.a !== null ? this.a.pack(builder) : 0);\n    return TableB.createTableB(builder, a);\n  }\n}\n"
  },
  {
    "path": "tests/ts/my-game/other-name-space/table-b.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport {TableA, TableAT} from '../../table-a.js';\n\nexport class TableB implements flatbuffers.IUnpackableObject<TableBT> {\n  bb: flatbuffers.ByteBuffer | null = null;\n  bb_pos = 0;\n  __init(i: number, bb: flatbuffers.ByteBuffer): TableB {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n\n  static getRootAsTableB(bb: flatbuffers.ByteBuffer, obj?: TableB): TableB {\n    return (obj || new TableB()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  static getSizePrefixedRootAsTableB(\n    bb: flatbuffers.ByteBuffer,\n    obj?: TableB,\n  ): TableB {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new TableB()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  a(obj?: TableA): TableA | null {\n    const offset = this.bb!.__offset(this.bb_pos, 4);\n    return offset\n      ? (obj || new TableA()).__init(\n          this.bb!.__indirect(this.bb_pos + offset),\n          this.bb!,\n        )\n      : null;\n  }\n\n  static getFullyQualifiedName(): string {\n    return 'MyGame.OtherNameSpace.TableB';\n  }\n\n  static startTableB(builder: flatbuffers.Builder) {\n    builder.startObject(1);\n  }\n\n  static addA(builder: flatbuffers.Builder, aOffset: flatbuffers.Offset) {\n    builder.addFieldOffset(0, aOffset, 0);\n  }\n\n  static endTableB(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const offset = builder.endObject();\n    return offset;\n  }\n\n  static createTableB(\n    builder: flatbuffers.Builder,\n    aOffset: flatbuffers.Offset,\n  ): flatbuffers.Offset {\n    TableB.startTableB(builder);\n    TableB.addA(builder, aOffset);\n    return TableB.endTableB(builder);\n  }\n\n  serialize(): Uint8Array {\n    return this.bb!.bytes();\n  }\n\n  static deserialize(buffer: Uint8Array): TableB {\n    return TableB.getRootAsTableB(new flatbuffers.ByteBuffer(buffer));\n  }\n\n  unpack(): TableBT {\n    return new TableBT(this.a() !== null ? this.a()!.unpack() : null);\n  }\n\n  unpackTo(_o: TableBT): void {\n    _o.a = this.a() !== null ? this.a()!.unpack() : null;\n  }\n}\n\nexport class TableBT implements flatbuffers.IGeneratedObject {\n  constructor(public a: TableAT | null = null) {}\n\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const a = this.a !== null ? this.a!.pack(builder) : 0;\n\n    return TableB.createTableB(builder, a);\n  }\n}\n"
  },
  {
    "path": "tests/ts/my-game/other-name-space/unused.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nexport declare class Unused implements flatbuffers.IUnpackableObject<UnusedT> {\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Unused;\n  a(): number;\n  mutate_a(value: number): boolean;\n  static getFullyQualifiedName(): string;\n  static sizeOf(): number;\n  static createUnused(\n    builder: flatbuffers.Builder,\n    a: number,\n  ): flatbuffers.Offset;\n  unpack(): UnusedT;\n  unpackTo(_o: UnusedT): void;\n}\nexport declare class UnusedT implements flatbuffers.IGeneratedObject {\n  a: number;\n  constructor(a?: number);\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/my-game/other-name-space/unused.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\nexport class Unused {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  a() {\n    return this.bb.readInt32(this.bb_pos);\n  }\n  mutate_a(value) {\n    this.bb.writeInt32(this.bb_pos + 0, value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return 'MyGame.OtherNameSpace.Unused';\n  }\n  static sizeOf() {\n    return 4;\n  }\n  static createUnused(builder, a) {\n    builder.prep(4, 4);\n    builder.writeInt32(a);\n    return builder.offset();\n  }\n  unpack() {\n    return new UnusedT(this.a());\n  }\n  unpackTo(_o) {\n    _o.a = this.a();\n  }\n}\nexport class UnusedT {\n  constructor(a = 0) {\n    this.a = a;\n  }\n  pack(builder) {\n    return Unused.createUnused(builder, this.a);\n  }\n}\n"
  },
  {
    "path": "tests/ts/my-game/other-name-space/unused.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nexport class Unused implements flatbuffers.IUnpackableObject<UnusedT> {\n  bb: flatbuffers.ByteBuffer | null = null;\n  bb_pos = 0;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Unused {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n\n  a(): number {\n    return this.bb!.readInt32(this.bb_pos);\n  }\n\n  mutate_a(value: number): boolean {\n    this.bb!.writeInt32(this.bb_pos + 0, value);\n    return true;\n  }\n\n  static getFullyQualifiedName(): string {\n    return 'MyGame.OtherNameSpace.Unused';\n  }\n\n  static sizeOf(): number {\n    return 4;\n  }\n\n  static createUnused(\n    builder: flatbuffers.Builder,\n    a: number,\n  ): flatbuffers.Offset {\n    builder.prep(4, 4);\n    builder.writeInt32(a);\n    return builder.offset();\n  }\n\n  unpack(): UnusedT {\n    return new UnusedT(this.a());\n  }\n\n  unpackTo(_o: UnusedT): void {\n    _o.a = this.a();\n  }\n}\n\nexport class UnusedT implements flatbuffers.IGeneratedObject {\n  constructor(public a: number = 0) {}\n\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset {\n    return Unused.createUnused(builder, this.a);\n  }\n}\n"
  },
  {
    "path": "tests/ts/my-game/other-name-space.d.ts",
    "content": "export {FromInclude} from './other-name-space/from-include.js';\nexport {TableB, TableBT} from './other-name-space/table-b.js';\nexport {Unused, UnusedT} from './other-name-space/unused.js';\n"
  },
  {
    "path": "tests/ts/my-game/other-name-space.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nexport {FromInclude} from './other-name-space/from-include.js';\nexport {TableB, TableBT} from './other-name-space/table-b.js';\nexport {Unused, UnusedT} from './other-name-space/unused.js';\n"
  },
  {
    "path": "tests/ts/my-game/other-name-space.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport { FromInclude } from './other-name-space/from-include.js';\nexport { TableB, TableBT } from './other-name-space/table-b.js';\nexport { Unused, UnusedT } from './other-name-space/unused.js';\n"
  },
  {
    "path": "tests/ts/my-game.d.ts",
    "content": "export * as Example from './my-game/example.js';\nexport * as Example2 from './my-game/example2.js';\nexport {\n  InParentNamespace,\n  InParentNamespaceT,\n} from './my-game/in-parent-namespace.js';\nexport * as OtherNameSpace from './my-game/other-name-space.js';\n"
  },
  {
    "path": "tests/ts/my-game.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nexport * as Example from './my-game/example.js';\nexport * as Example2 from './my-game/example2.js';\nexport {InParentNamespace, InParentNamespaceT} from './my-game/in-parent-namespace.js';\nexport * as OtherNameSpace from './my-game/other-name-space.js';\n"
  },
  {
    "path": "tests/ts/my-game.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport { InParentNamespace, InParentNamespaceT } from './my-game/in-parent-namespace.js';\nexport * as Example from './my-game/example.js';\nexport * as Example2 from './my-game/example2.js';\nexport * as OtherNameSpace from './my-game/other-name-space.js';\n"
  },
  {
    "path": "tests/ts/no_import_ext/optional-scalars/optional-byte.d.ts",
    "content": "export declare enum OptionalByte {\n  None = 0,\n  One = 1,\n  Two = 2,\n}\n"
  },
  {
    "path": "tests/ts/no_import_ext/optional-scalars/optional-byte.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nexport var OptionalByte;\n(function(OptionalByte) {\nOptionalByte[OptionalByte['None'] = 0] = 'None';\nOptionalByte[OptionalByte['One'] = 1] = 'One';\nOptionalByte[OptionalByte['Two'] = 2] = 'Two';\n})(OptionalByte || (OptionalByte = {}));\n"
  },
  {
    "path": "tests/ts/no_import_ext/optional-scalars/optional-byte.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport enum OptionalByte {\n  None = 0,\n  One = 1,\n  Two = 2,\n}\n"
  },
  {
    "path": "tests/ts/no_import_ext/optional-scalars/scalar-stuff.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nimport {OptionalByte} from '../optional-scalars/optional-byte';\nexport declare class ScalarStuff {\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): ScalarStuff;\n  static getRootAsScalarStuff(\n    bb: flatbuffers.ByteBuffer,\n    obj?: ScalarStuff,\n  ): ScalarStuff;\n  static getSizePrefixedRootAsScalarStuff(\n    bb: flatbuffers.ByteBuffer,\n    obj?: ScalarStuff,\n  ): ScalarStuff;\n  static bufferHasIdentifier(bb: flatbuffers.ByteBuffer): boolean;\n  justI8(): number;\n  maybeI8(): number | null;\n  defaultI8(): number;\n  justU8(): number;\n  maybeU8(): number | null;\n  defaultU8(): number;\n  justI16(): number;\n  maybeI16(): number | null;\n  defaultI16(): number;\n  justU16(): number;\n  maybeU16(): number | null;\n  defaultU16(): number;\n  justI32(): number;\n  maybeI32(): number | null;\n  defaultI32(): number;\n  justU32(): number;\n  maybeU32(): number | null;\n  defaultU32(): number;\n  justI64(): bigint;\n  maybeI64(): bigint | null;\n  defaultI64(): bigint;\n  justU64(): bigint;\n  maybeU64(): bigint | null;\n  defaultU64(): bigint;\n  justF32(): number;\n  maybeF32(): number | null;\n  defaultF32(): number;\n  justF64(): number;\n  maybeF64(): number | null;\n  defaultF64(): number;\n  justBool(): boolean;\n  maybeBool(): boolean | null;\n  defaultBool(): boolean;\n  justEnum(): OptionalByte;\n  maybeEnum(): OptionalByte | null;\n  defaultEnum(): OptionalByte;\n  static getFullyQualifiedName(): string;\n  static startScalarStuff(builder: flatbuffers.Builder): void;\n  static addJustI8(builder: flatbuffers.Builder, justI8: number): void;\n  static addMaybeI8(builder: flatbuffers.Builder, maybeI8: number): void;\n  static addDefaultI8(builder: flatbuffers.Builder, defaultI8: number): void;\n  static addJustU8(builder: flatbuffers.Builder, justU8: number): void;\n  static addMaybeU8(builder: flatbuffers.Builder, maybeU8: number): void;\n  static addDefaultU8(builder: flatbuffers.Builder, defaultU8: number): void;\n  static addJustI16(builder: flatbuffers.Builder, justI16: number): void;\n  static addMaybeI16(builder: flatbuffers.Builder, maybeI16: number): void;\n  static addDefaultI16(builder: flatbuffers.Builder, defaultI16: number): void;\n  static addJustU16(builder: flatbuffers.Builder, justU16: number): void;\n  static addMaybeU16(builder: flatbuffers.Builder, maybeU16: number): void;\n  static addDefaultU16(builder: flatbuffers.Builder, defaultU16: number): void;\n  static addJustI32(builder: flatbuffers.Builder, justI32: number): void;\n  static addMaybeI32(builder: flatbuffers.Builder, maybeI32: number): void;\n  static addDefaultI32(builder: flatbuffers.Builder, defaultI32: number): void;\n  static addJustU32(builder: flatbuffers.Builder, justU32: number): void;\n  static addMaybeU32(builder: flatbuffers.Builder, maybeU32: number): void;\n  static addDefaultU32(builder: flatbuffers.Builder, defaultU32: number): void;\n  static addJustI64(builder: flatbuffers.Builder, justI64: bigint): void;\n  static addMaybeI64(builder: flatbuffers.Builder, maybeI64: bigint): void;\n  static addDefaultI64(builder: flatbuffers.Builder, defaultI64: bigint): void;\n  static addJustU64(builder: flatbuffers.Builder, justU64: bigint): void;\n  static addMaybeU64(builder: flatbuffers.Builder, maybeU64: bigint): void;\n  static addDefaultU64(builder: flatbuffers.Builder, defaultU64: bigint): void;\n  static addJustF32(builder: flatbuffers.Builder, justF32: number): void;\n  static addMaybeF32(builder: flatbuffers.Builder, maybeF32: number): void;\n  static addDefaultF32(builder: flatbuffers.Builder, defaultF32: number): void;\n  static addJustF64(builder: flatbuffers.Builder, justF64: number): void;\n  static addMaybeF64(builder: flatbuffers.Builder, maybeF64: number): void;\n  static addDefaultF64(builder: flatbuffers.Builder, defaultF64: number): void;\n  static addJustBool(builder: flatbuffers.Builder, justBool: boolean): void;\n  static addMaybeBool(builder: flatbuffers.Builder, maybeBool: boolean): void;\n  static addDefaultBool(\n    builder: flatbuffers.Builder,\n    defaultBool: boolean,\n  ): void;\n  static addJustEnum(\n    builder: flatbuffers.Builder,\n    justEnum: OptionalByte,\n  ): void;\n  static addMaybeEnum(\n    builder: flatbuffers.Builder,\n    maybeEnum: OptionalByte,\n  ): void;\n  static addDefaultEnum(\n    builder: flatbuffers.Builder,\n    defaultEnum: OptionalByte,\n  ): void;\n  static endScalarStuff(builder: flatbuffers.Builder): flatbuffers.Offset;\n  static finishScalarStuffBuffer(\n    builder: flatbuffers.Builder,\n    offset: flatbuffers.Offset,\n  ): void;\n  static finishSizePrefixedScalarStuffBuffer(\n    builder: flatbuffers.Builder,\n    offset: flatbuffers.Offset,\n  ): void;\n  static createScalarStuff(\n    builder: flatbuffers.Builder,\n    justI8: number,\n    maybeI8: number | null,\n    defaultI8: number,\n    justU8: number,\n    maybeU8: number | null,\n    defaultU8: number,\n    justI16: number,\n    maybeI16: number | null,\n    defaultI16: number,\n    justU16: number,\n    maybeU16: number | null,\n    defaultU16: number,\n    justI32: number,\n    maybeI32: number | null,\n    defaultI32: number,\n    justU32: number,\n    maybeU32: number | null,\n    defaultU32: number,\n    justI64: bigint,\n    maybeI64: bigint | null,\n    defaultI64: bigint,\n    justU64: bigint,\n    maybeU64: bigint | null,\n    defaultU64: bigint,\n    justF32: number,\n    maybeF32: number | null,\n    defaultF32: number,\n    justF64: number,\n    maybeF64: number | null,\n    defaultF64: number,\n    justBool: boolean,\n    maybeBool: boolean | null,\n    defaultBool: boolean,\n    justEnum: OptionalByte,\n    maybeEnum: OptionalByte | null,\n    defaultEnum: OptionalByte,\n  ): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/no_import_ext/optional-scalars/scalar-stuff.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\n\nimport {OptionalByte} from '../optional-scalars/optional-byte';\n\nexport class ScalarStuff {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsScalarStuff(bb, obj) {\n    return (obj || new ScalarStuff())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsScalarStuff(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new ScalarStuff())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static bufferHasIdentifier(bb) {\n    return bb.__has_identifier('NULL');\n  }\n  justI8() {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.readInt8(this.bb_pos + offset) : 0;\n  }\n  maybeI8() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.readInt8(this.bb_pos + offset) : null;\n  }\n  defaultI8() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? this.bb.readInt8(this.bb_pos + offset) : 42;\n  }\n  justU8() {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.readUint8(this.bb_pos + offset) : 0;\n  }\n  maybeU8() {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.readUint8(this.bb_pos + offset) : null;\n  }\n  defaultU8() {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.readUint8(this.bb_pos + offset) : 42;\n  }\n  justI16() {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    return offset ? this.bb.readInt16(this.bb_pos + offset) : 0;\n  }\n  maybeI16() {\n    const offset = this.bb.__offset(this.bb_pos, 18);\n    return offset ? this.bb.readInt16(this.bb_pos + offset) : null;\n  }\n  defaultI16() {\n    const offset = this.bb.__offset(this.bb_pos, 20);\n    return offset ? this.bb.readInt16(this.bb_pos + offset) : 42;\n  }\n  justU16() {\n    const offset = this.bb.__offset(this.bb_pos, 22);\n    return offset ? this.bb.readUint16(this.bb_pos + offset) : 0;\n  }\n  maybeU16() {\n    const offset = this.bb.__offset(this.bb_pos, 24);\n    return offset ? this.bb.readUint16(this.bb_pos + offset) : null;\n  }\n  defaultU16() {\n    const offset = this.bb.__offset(this.bb_pos, 26);\n    return offset ? this.bb.readUint16(this.bb_pos + offset) : 42;\n  }\n  justI32() {\n    const offset = this.bb.__offset(this.bb_pos, 28);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n  }\n  maybeI32() {\n    const offset = this.bb.__offset(this.bb_pos, 30);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : null;\n  }\n  defaultI32() {\n    const offset = this.bb.__offset(this.bb_pos, 32);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : 42;\n  }\n  justU32() {\n    const offset = this.bb.__offset(this.bb_pos, 34);\n    return offset ? this.bb.readUint32(this.bb_pos + offset) : 0;\n  }\n  maybeU32() {\n    const offset = this.bb.__offset(this.bb_pos, 36);\n    return offset ? this.bb.readUint32(this.bb_pos + offset) : null;\n  }\n  defaultU32() {\n    const offset = this.bb.__offset(this.bb_pos, 38);\n    return offset ? this.bb.readUint32(this.bb_pos + offset) : 42;\n  }\n  justI64() {\n    const offset = this.bb.__offset(this.bb_pos, 40);\n    return offset ? this.bb.readInt64(this.bb_pos + offset) : BigInt('0');\n  }\n  maybeI64() {\n    const offset = this.bb.__offset(this.bb_pos, 42);\n    return offset ? this.bb.readInt64(this.bb_pos + offset) : null;\n  }\n  defaultI64() {\n    const offset = this.bb.__offset(this.bb_pos, 44);\n    return offset ? this.bb.readInt64(this.bb_pos + offset) : BigInt('42');\n  }\n  justU64() {\n    const offset = this.bb.__offset(this.bb_pos, 46);\n    return offset ? this.bb.readUint64(this.bb_pos + offset) : BigInt('0');\n  }\n  maybeU64() {\n    const offset = this.bb.__offset(this.bb_pos, 48);\n    return offset ? this.bb.readUint64(this.bb_pos + offset) : null;\n  }\n  defaultU64() {\n    const offset = this.bb.__offset(this.bb_pos, 50);\n    return offset ? this.bb.readUint64(this.bb_pos + offset) : BigInt('42');\n  }\n  justF32() {\n    const offset = this.bb.__offset(this.bb_pos, 52);\n    return offset ? this.bb.readFloat32(this.bb_pos + offset) : 0.0;\n  }\n  maybeF32() {\n    const offset = this.bb.__offset(this.bb_pos, 54);\n    return offset ? this.bb.readFloat32(this.bb_pos + offset) : null;\n  }\n  defaultF32() {\n    const offset = this.bb.__offset(this.bb_pos, 56);\n    return offset ? this.bb.readFloat32(this.bb_pos + offset) : 42.0;\n  }\n  justF64() {\n    const offset = this.bb.__offset(this.bb_pos, 58);\n    return offset ? this.bb.readFloat64(this.bb_pos + offset) : 0.0;\n  }\n  maybeF64() {\n    const offset = this.bb.__offset(this.bb_pos, 60);\n    return offset ? this.bb.readFloat64(this.bb_pos + offset) : null;\n  }\n  defaultF64() {\n    const offset = this.bb.__offset(this.bb_pos, 62);\n    return offset ? this.bb.readFloat64(this.bb_pos + offset) : 42.0;\n  }\n  justBool() {\n    const offset = this.bb.__offset(this.bb_pos, 64);\n    return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false;\n  }\n  maybeBool() {\n    const offset = this.bb.__offset(this.bb_pos, 66);\n    return offset ? !!this.bb.readInt8(this.bb_pos + offset) : null;\n  }\n  defaultBool() {\n    const offset = this.bb.__offset(this.bb_pos, 68);\n    return offset ? !!this.bb.readInt8(this.bb_pos + offset) : true;\n  }\n  justEnum() {\n    const offset = this.bb.__offset(this.bb_pos, 70);\n    return offset ? this.bb.readInt8(this.bb_pos + offset) : OptionalByte.None;\n  }\n  maybeEnum() {\n    const offset = this.bb.__offset(this.bb_pos, 72);\n    return offset ? this.bb.readInt8(this.bb_pos + offset) : null;\n  }\n  defaultEnum() {\n    const offset = this.bb.__offset(this.bb_pos, 74);\n    return offset ? this.bb.readInt8(this.bb_pos + offset) : OptionalByte.One;\n  }\n  static getFullyQualifiedName() {\n    return 'optional_scalars.ScalarStuff';\n  }\n  static startScalarStuff(builder) {\n    builder.startObject(36);\n  }\n  static addJustI8(builder, justI8) {\n    builder.addFieldInt8(0, justI8, 0);\n  }\n  static addMaybeI8(builder, maybeI8) {\n    builder.addFieldInt8(1, maybeI8, null);\n  }\n  static addDefaultI8(builder, defaultI8) {\n    builder.addFieldInt8(2, defaultI8, 42);\n  }\n  static addJustU8(builder, justU8) {\n    builder.addFieldInt8(3, justU8, 0);\n  }\n  static addMaybeU8(builder, maybeU8) {\n    builder.addFieldInt8(4, maybeU8, null);\n  }\n  static addDefaultU8(builder, defaultU8) {\n    builder.addFieldInt8(5, defaultU8, 42);\n  }\n  static addJustI16(builder, justI16) {\n    builder.addFieldInt16(6, justI16, 0);\n  }\n  static addMaybeI16(builder, maybeI16) {\n    builder.addFieldInt16(7, maybeI16, null);\n  }\n  static addDefaultI16(builder, defaultI16) {\n    builder.addFieldInt16(8, defaultI16, 42);\n  }\n  static addJustU16(builder, justU16) {\n    builder.addFieldInt16(9, justU16, 0);\n  }\n  static addMaybeU16(builder, maybeU16) {\n    builder.addFieldInt16(10, maybeU16, null);\n  }\n  static addDefaultU16(builder, defaultU16) {\n    builder.addFieldInt16(11, defaultU16, 42);\n  }\n  static addJustI32(builder, justI32) {\n    builder.addFieldInt32(12, justI32, 0);\n  }\n  static addMaybeI32(builder, maybeI32) {\n    builder.addFieldInt32(13, maybeI32, null);\n  }\n  static addDefaultI32(builder, defaultI32) {\n    builder.addFieldInt32(14, defaultI32, 42);\n  }\n  static addJustU32(builder, justU32) {\n    builder.addFieldInt32(15, justU32, 0);\n  }\n  static addMaybeU32(builder, maybeU32) {\n    builder.addFieldInt32(16, maybeU32, null);\n  }\n  static addDefaultU32(builder, defaultU32) {\n    builder.addFieldInt32(17, defaultU32, 42);\n  }\n  static addJustI64(builder, justI64) {\n    builder.addFieldInt64(18, justI64, BigInt('0'));\n  }\n  static addMaybeI64(builder, maybeI64) {\n    builder.addFieldInt64(19, maybeI64, null);\n  }\n  static addDefaultI64(builder, defaultI64) {\n    builder.addFieldInt64(20, defaultI64, BigInt('42'));\n  }\n  static addJustU64(builder, justU64) {\n    builder.addFieldInt64(21, justU64, BigInt('0'));\n  }\n  static addMaybeU64(builder, maybeU64) {\n    builder.addFieldInt64(22, maybeU64, null);\n  }\n  static addDefaultU64(builder, defaultU64) {\n    builder.addFieldInt64(23, defaultU64, BigInt('42'));\n  }\n  static addJustF32(builder, justF32) {\n    builder.addFieldFloat32(24, justF32, 0.0);\n  }\n  static addMaybeF32(builder, maybeF32) {\n    builder.addFieldFloat32(25, maybeF32, null);\n  }\n  static addDefaultF32(builder, defaultF32) {\n    builder.addFieldFloat32(26, defaultF32, 42.0);\n  }\n  static addJustF64(builder, justF64) {\n    builder.addFieldFloat64(27, justF64, 0.0);\n  }\n  static addMaybeF64(builder, maybeF64) {\n    builder.addFieldFloat64(28, maybeF64, null);\n  }\n  static addDefaultF64(builder, defaultF64) {\n    builder.addFieldFloat64(29, defaultF64, 42.0);\n  }\n  static addJustBool(builder, justBool) {\n    builder.addFieldInt8(30, +justBool, +false);\n  }\n  static addMaybeBool(builder, maybeBool) {\n    builder.addFieldInt8(31, +maybeBool, null);\n  }\n  static addDefaultBool(builder, defaultBool) {\n    builder.addFieldInt8(32, +defaultBool, +true);\n  }\n  static addJustEnum(builder, justEnum) {\n    builder.addFieldInt8(33, justEnum, OptionalByte.None);\n  }\n  static addMaybeEnum(builder, maybeEnum) {\n    builder.addFieldInt8(34, maybeEnum, null);\n  }\n  static addDefaultEnum(builder, defaultEnum) {\n    builder.addFieldInt8(35, defaultEnum, OptionalByte.One);\n  }\n  static endScalarStuff(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static finishScalarStuffBuffer(builder, offset) {\n    builder.finish(offset, 'NULL');\n  }\n  static finishSizePrefixedScalarStuffBuffer(builder, offset) {\n    builder.finish(offset, 'NULL', true);\n  }\n  static createScalarStuff(\n      builder, justI8, maybeI8, defaultI8, justU8, maybeU8, defaultU8, justI16,\n      maybeI16, defaultI16, justU16, maybeU16, defaultU16, justI32, maybeI32,\n      defaultI32, justU32, maybeU32, defaultU32, justI64, maybeI64, defaultI64,\n      justU64, maybeU64, defaultU64, justF32, maybeF32, defaultF32, justF64,\n      maybeF64, defaultF64, justBool, maybeBool, defaultBool, justEnum,\n      maybeEnum, defaultEnum) {\n    ScalarStuff.startScalarStuff(builder);\n    ScalarStuff.addJustI8(builder, justI8);\n    if (maybeI8 !== null) ScalarStuff.addMaybeI8(builder, maybeI8);\n    ScalarStuff.addDefaultI8(builder, defaultI8);\n    ScalarStuff.addJustU8(builder, justU8);\n    if (maybeU8 !== null) ScalarStuff.addMaybeU8(builder, maybeU8);\n    ScalarStuff.addDefaultU8(builder, defaultU8);\n    ScalarStuff.addJustI16(builder, justI16);\n    if (maybeI16 !== null) ScalarStuff.addMaybeI16(builder, maybeI16);\n    ScalarStuff.addDefaultI16(builder, defaultI16);\n    ScalarStuff.addJustU16(builder, justU16);\n    if (maybeU16 !== null) ScalarStuff.addMaybeU16(builder, maybeU16);\n    ScalarStuff.addDefaultU16(builder, defaultU16);\n    ScalarStuff.addJustI32(builder, justI32);\n    if (maybeI32 !== null) ScalarStuff.addMaybeI32(builder, maybeI32);\n    ScalarStuff.addDefaultI32(builder, defaultI32);\n    ScalarStuff.addJustU32(builder, justU32);\n    if (maybeU32 !== null) ScalarStuff.addMaybeU32(builder, maybeU32);\n    ScalarStuff.addDefaultU32(builder, defaultU32);\n    ScalarStuff.addJustI64(builder, justI64);\n    if (maybeI64 !== null) ScalarStuff.addMaybeI64(builder, maybeI64);\n    ScalarStuff.addDefaultI64(builder, defaultI64);\n    ScalarStuff.addJustU64(builder, justU64);\n    if (maybeU64 !== null) ScalarStuff.addMaybeU64(builder, maybeU64);\n    ScalarStuff.addDefaultU64(builder, defaultU64);\n    ScalarStuff.addJustF32(builder, justF32);\n    if (maybeF32 !== null) ScalarStuff.addMaybeF32(builder, maybeF32);\n    ScalarStuff.addDefaultF32(builder, defaultF32);\n    ScalarStuff.addJustF64(builder, justF64);\n    if (maybeF64 !== null) ScalarStuff.addMaybeF64(builder, maybeF64);\n    ScalarStuff.addDefaultF64(builder, defaultF64);\n    ScalarStuff.addJustBool(builder, justBool);\n    if (maybeBool !== null) ScalarStuff.addMaybeBool(builder, maybeBool);\n    ScalarStuff.addDefaultBool(builder, defaultBool);\n    ScalarStuff.addJustEnum(builder, justEnum);\n    if (maybeEnum !== null) ScalarStuff.addMaybeEnum(builder, maybeEnum);\n    ScalarStuff.addDefaultEnum(builder, defaultEnum);\n    return ScalarStuff.endScalarStuff(builder);\n  }\n}\n"
  },
  {
    "path": "tests/ts/no_import_ext/optional-scalars/scalar-stuff.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport {OptionalByte} from '../optional-scalars/optional-byte';\n\nexport class ScalarStuff {\n  bb: flatbuffers.ByteBuffer | null = null;\n  bb_pos = 0;\n  __init(i: number, bb: flatbuffers.ByteBuffer): ScalarStuff {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n\n  static getRootAsScalarStuff(\n    bb: flatbuffers.ByteBuffer,\n    obj?: ScalarStuff,\n  ): ScalarStuff {\n    return (obj || new ScalarStuff()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  static getSizePrefixedRootAsScalarStuff(\n    bb: flatbuffers.ByteBuffer,\n    obj?: ScalarStuff,\n  ): ScalarStuff {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new ScalarStuff()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  static bufferHasIdentifier(bb: flatbuffers.ByteBuffer): boolean {\n    return bb.__has_identifier('NULL');\n  }\n\n  justI8(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 4);\n    return offset ? this.bb!.readInt8(this.bb_pos + offset) : 0;\n  }\n\n  maybeI8(): number | null {\n    const offset = this.bb!.__offset(this.bb_pos, 6);\n    return offset ? this.bb!.readInt8(this.bb_pos + offset) : null;\n  }\n\n  defaultI8(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 8);\n    return offset ? this.bb!.readInt8(this.bb_pos + offset) : 42;\n  }\n\n  justU8(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 10);\n    return offset ? this.bb!.readUint8(this.bb_pos + offset) : 0;\n  }\n\n  maybeU8(): number | null {\n    const offset = this.bb!.__offset(this.bb_pos, 12);\n    return offset ? this.bb!.readUint8(this.bb_pos + offset) : null;\n  }\n\n  defaultU8(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 14);\n    return offset ? this.bb!.readUint8(this.bb_pos + offset) : 42;\n  }\n\n  justI16(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 16);\n    return offset ? this.bb!.readInt16(this.bb_pos + offset) : 0;\n  }\n\n  maybeI16(): number | null {\n    const offset = this.bb!.__offset(this.bb_pos, 18);\n    return offset ? this.bb!.readInt16(this.bb_pos + offset) : null;\n  }\n\n  defaultI16(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 20);\n    return offset ? this.bb!.readInt16(this.bb_pos + offset) : 42;\n  }\n\n  justU16(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 22);\n    return offset ? this.bb!.readUint16(this.bb_pos + offset) : 0;\n  }\n\n  maybeU16(): number | null {\n    const offset = this.bb!.__offset(this.bb_pos, 24);\n    return offset ? this.bb!.readUint16(this.bb_pos + offset) : null;\n  }\n\n  defaultU16(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 26);\n    return offset ? this.bb!.readUint16(this.bb_pos + offset) : 42;\n  }\n\n  justI32(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 28);\n    return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;\n  }\n\n  maybeI32(): number | null {\n    const offset = this.bb!.__offset(this.bb_pos, 30);\n    return offset ? this.bb!.readInt32(this.bb_pos + offset) : null;\n  }\n\n  defaultI32(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 32);\n    return offset ? this.bb!.readInt32(this.bb_pos + offset) : 42;\n  }\n\n  justU32(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 34);\n    return offset ? this.bb!.readUint32(this.bb_pos + offset) : 0;\n  }\n\n  maybeU32(): number | null {\n    const offset = this.bb!.__offset(this.bb_pos, 36);\n    return offset ? this.bb!.readUint32(this.bb_pos + offset) : null;\n  }\n\n  defaultU32(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 38);\n    return offset ? this.bb!.readUint32(this.bb_pos + offset) : 42;\n  }\n\n  justI64(): bigint {\n    const offset = this.bb!.__offset(this.bb_pos, 40);\n    return offset ? this.bb!.readInt64(this.bb_pos + offset) : BigInt('0');\n  }\n\n  maybeI64(): bigint | null {\n    const offset = this.bb!.__offset(this.bb_pos, 42);\n    return offset ? this.bb!.readInt64(this.bb_pos + offset) : null;\n  }\n\n  defaultI64(): bigint {\n    const offset = this.bb!.__offset(this.bb_pos, 44);\n    return offset ? this.bb!.readInt64(this.bb_pos + offset) : BigInt('42');\n  }\n\n  justU64(): bigint {\n    const offset = this.bb!.__offset(this.bb_pos, 46);\n    return offset ? this.bb!.readUint64(this.bb_pos + offset) : BigInt('0');\n  }\n\n  maybeU64(): bigint | null {\n    const offset = this.bb!.__offset(this.bb_pos, 48);\n    return offset ? this.bb!.readUint64(this.bb_pos + offset) : null;\n  }\n\n  defaultU64(): bigint {\n    const offset = this.bb!.__offset(this.bb_pos, 50);\n    return offset ? this.bb!.readUint64(this.bb_pos + offset) : BigInt('42');\n  }\n\n  justF32(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 52);\n    return offset ? this.bb!.readFloat32(this.bb_pos + offset) : 0.0;\n  }\n\n  maybeF32(): number | null {\n    const offset = this.bb!.__offset(this.bb_pos, 54);\n    return offset ? this.bb!.readFloat32(this.bb_pos + offset) : null;\n  }\n\n  defaultF32(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 56);\n    return offset ? this.bb!.readFloat32(this.bb_pos + offset) : 42.0;\n  }\n\n  justF64(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 58);\n    return offset ? this.bb!.readFloat64(this.bb_pos + offset) : 0.0;\n  }\n\n  maybeF64(): number | null {\n    const offset = this.bb!.__offset(this.bb_pos, 60);\n    return offset ? this.bb!.readFloat64(this.bb_pos + offset) : null;\n  }\n\n  defaultF64(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 62);\n    return offset ? this.bb!.readFloat64(this.bb_pos + offset) : 42.0;\n  }\n\n  justBool(): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 64);\n    return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false;\n  }\n\n  maybeBool(): boolean | null {\n    const offset = this.bb!.__offset(this.bb_pos, 66);\n    return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : null;\n  }\n\n  defaultBool(): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 68);\n    return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : true;\n  }\n\n  justEnum(): OptionalByte {\n    const offset = this.bb!.__offset(this.bb_pos, 70);\n    return offset ? this.bb!.readInt8(this.bb_pos + offset) : OptionalByte.None;\n  }\n\n  maybeEnum(): OptionalByte | null {\n    const offset = this.bb!.__offset(this.bb_pos, 72);\n    return offset ? this.bb!.readInt8(this.bb_pos + offset) : null;\n  }\n\n  defaultEnum(): OptionalByte {\n    const offset = this.bb!.__offset(this.bb_pos, 74);\n    return offset ? this.bb!.readInt8(this.bb_pos + offset) : OptionalByte.One;\n  }\n\n  static getFullyQualifiedName(): string {\n    return 'optional_scalars.ScalarStuff';\n  }\n\n  static startScalarStuff(builder: flatbuffers.Builder) {\n    builder.startObject(36);\n  }\n\n  static addJustI8(builder: flatbuffers.Builder, justI8: number) {\n    builder.addFieldInt8(0, justI8, 0);\n  }\n\n  static addMaybeI8(builder: flatbuffers.Builder, maybeI8: number) {\n    builder.addFieldInt8(1, maybeI8, null);\n  }\n\n  static addDefaultI8(builder: flatbuffers.Builder, defaultI8: number) {\n    builder.addFieldInt8(2, defaultI8, 42);\n  }\n\n  static addJustU8(builder: flatbuffers.Builder, justU8: number) {\n    builder.addFieldInt8(3, justU8, 0);\n  }\n\n  static addMaybeU8(builder: flatbuffers.Builder, maybeU8: number) {\n    builder.addFieldInt8(4, maybeU8, null);\n  }\n\n  static addDefaultU8(builder: flatbuffers.Builder, defaultU8: number) {\n    builder.addFieldInt8(5, defaultU8, 42);\n  }\n\n  static addJustI16(builder: flatbuffers.Builder, justI16: number) {\n    builder.addFieldInt16(6, justI16, 0);\n  }\n\n  static addMaybeI16(builder: flatbuffers.Builder, maybeI16: number) {\n    builder.addFieldInt16(7, maybeI16, null);\n  }\n\n  static addDefaultI16(builder: flatbuffers.Builder, defaultI16: number) {\n    builder.addFieldInt16(8, defaultI16, 42);\n  }\n\n  static addJustU16(builder: flatbuffers.Builder, justU16: number) {\n    builder.addFieldInt16(9, justU16, 0);\n  }\n\n  static addMaybeU16(builder: flatbuffers.Builder, maybeU16: number) {\n    builder.addFieldInt16(10, maybeU16, null);\n  }\n\n  static addDefaultU16(builder: flatbuffers.Builder, defaultU16: number) {\n    builder.addFieldInt16(11, defaultU16, 42);\n  }\n\n  static addJustI32(builder: flatbuffers.Builder, justI32: number) {\n    builder.addFieldInt32(12, justI32, 0);\n  }\n\n  static addMaybeI32(builder: flatbuffers.Builder, maybeI32: number) {\n    builder.addFieldInt32(13, maybeI32, null);\n  }\n\n  static addDefaultI32(builder: flatbuffers.Builder, defaultI32: number) {\n    builder.addFieldInt32(14, defaultI32, 42);\n  }\n\n  static addJustU32(builder: flatbuffers.Builder, justU32: number) {\n    builder.addFieldInt32(15, justU32, 0);\n  }\n\n  static addMaybeU32(builder: flatbuffers.Builder, maybeU32: number) {\n    builder.addFieldInt32(16, maybeU32, null);\n  }\n\n  static addDefaultU32(builder: flatbuffers.Builder, defaultU32: number) {\n    builder.addFieldInt32(17, defaultU32, 42);\n  }\n\n  static addJustI64(builder: flatbuffers.Builder, justI64: bigint) {\n    builder.addFieldInt64(18, justI64, BigInt('0'));\n  }\n\n  static addMaybeI64(builder: flatbuffers.Builder, maybeI64: bigint) {\n    builder.addFieldInt64(19, maybeI64, null);\n  }\n\n  static addDefaultI64(builder: flatbuffers.Builder, defaultI64: bigint) {\n    builder.addFieldInt64(20, defaultI64, BigInt('42'));\n  }\n\n  static addJustU64(builder: flatbuffers.Builder, justU64: bigint) {\n    builder.addFieldInt64(21, justU64, BigInt('0'));\n  }\n\n  static addMaybeU64(builder: flatbuffers.Builder, maybeU64: bigint) {\n    builder.addFieldInt64(22, maybeU64, null);\n  }\n\n  static addDefaultU64(builder: flatbuffers.Builder, defaultU64: bigint) {\n    builder.addFieldInt64(23, defaultU64, BigInt('42'));\n  }\n\n  static addJustF32(builder: flatbuffers.Builder, justF32: number) {\n    builder.addFieldFloat32(24, justF32, 0.0);\n  }\n\n  static addMaybeF32(builder: flatbuffers.Builder, maybeF32: number) {\n    builder.addFieldFloat32(25, maybeF32, null);\n  }\n\n  static addDefaultF32(builder: flatbuffers.Builder, defaultF32: number) {\n    builder.addFieldFloat32(26, defaultF32, 42.0);\n  }\n\n  static addJustF64(builder: flatbuffers.Builder, justF64: number) {\n    builder.addFieldFloat64(27, justF64, 0.0);\n  }\n\n  static addMaybeF64(builder: flatbuffers.Builder, maybeF64: number) {\n    builder.addFieldFloat64(28, maybeF64, null);\n  }\n\n  static addDefaultF64(builder: flatbuffers.Builder, defaultF64: number) {\n    builder.addFieldFloat64(29, defaultF64, 42.0);\n  }\n\n  static addJustBool(builder: flatbuffers.Builder, justBool: boolean) {\n    builder.addFieldInt8(30, +justBool, +false);\n  }\n\n  static addMaybeBool(builder: flatbuffers.Builder, maybeBool: boolean) {\n    builder.addFieldInt8(31, +maybeBool, null);\n  }\n\n  static addDefaultBool(builder: flatbuffers.Builder, defaultBool: boolean) {\n    builder.addFieldInt8(32, +defaultBool, +true);\n  }\n\n  static addJustEnum(builder: flatbuffers.Builder, justEnum: OptionalByte) {\n    builder.addFieldInt8(33, justEnum, OptionalByte.None);\n  }\n\n  static addMaybeEnum(builder: flatbuffers.Builder, maybeEnum: OptionalByte) {\n    builder.addFieldInt8(34, maybeEnum, null);\n  }\n\n  static addDefaultEnum(\n    builder: flatbuffers.Builder,\n    defaultEnum: OptionalByte,\n  ) {\n    builder.addFieldInt8(35, defaultEnum, OptionalByte.One);\n  }\n\n  static endScalarStuff(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const offset = builder.endObject();\n    return offset;\n  }\n\n  static finishScalarStuffBuffer(\n    builder: flatbuffers.Builder,\n    offset: flatbuffers.Offset,\n  ) {\n    builder.finish(offset, 'NULL');\n  }\n\n  static finishSizePrefixedScalarStuffBuffer(\n    builder: flatbuffers.Builder,\n    offset: flatbuffers.Offset,\n  ) {\n    builder.finish(offset, 'NULL', true);\n  }\n\n  static createScalarStuff(\n    builder: flatbuffers.Builder,\n    justI8: number,\n    maybeI8: number | null,\n    defaultI8: number,\n    justU8: number,\n    maybeU8: number | null,\n    defaultU8: number,\n    justI16: number,\n    maybeI16: number | null,\n    defaultI16: number,\n    justU16: number,\n    maybeU16: number | null,\n    defaultU16: number,\n    justI32: number,\n    maybeI32: number | null,\n    defaultI32: number,\n    justU32: number,\n    maybeU32: number | null,\n    defaultU32: number,\n    justI64: bigint,\n    maybeI64: bigint | null,\n    defaultI64: bigint,\n    justU64: bigint,\n    maybeU64: bigint | null,\n    defaultU64: bigint,\n    justF32: number,\n    maybeF32: number | null,\n    defaultF32: number,\n    justF64: number,\n    maybeF64: number | null,\n    defaultF64: number,\n    justBool: boolean,\n    maybeBool: boolean | null,\n    defaultBool: boolean,\n    justEnum: OptionalByte,\n    maybeEnum: OptionalByte | null,\n    defaultEnum: OptionalByte,\n  ): flatbuffers.Offset {\n    ScalarStuff.startScalarStuff(builder);\n    ScalarStuff.addJustI8(builder, justI8);\n    if (maybeI8 !== null) ScalarStuff.addMaybeI8(builder, maybeI8);\n    ScalarStuff.addDefaultI8(builder, defaultI8);\n    ScalarStuff.addJustU8(builder, justU8);\n    if (maybeU8 !== null) ScalarStuff.addMaybeU8(builder, maybeU8);\n    ScalarStuff.addDefaultU8(builder, defaultU8);\n    ScalarStuff.addJustI16(builder, justI16);\n    if (maybeI16 !== null) ScalarStuff.addMaybeI16(builder, maybeI16);\n    ScalarStuff.addDefaultI16(builder, defaultI16);\n    ScalarStuff.addJustU16(builder, justU16);\n    if (maybeU16 !== null) ScalarStuff.addMaybeU16(builder, maybeU16);\n    ScalarStuff.addDefaultU16(builder, defaultU16);\n    ScalarStuff.addJustI32(builder, justI32);\n    if (maybeI32 !== null) ScalarStuff.addMaybeI32(builder, maybeI32);\n    ScalarStuff.addDefaultI32(builder, defaultI32);\n    ScalarStuff.addJustU32(builder, justU32);\n    if (maybeU32 !== null) ScalarStuff.addMaybeU32(builder, maybeU32);\n    ScalarStuff.addDefaultU32(builder, defaultU32);\n    ScalarStuff.addJustI64(builder, justI64);\n    if (maybeI64 !== null) ScalarStuff.addMaybeI64(builder, maybeI64);\n    ScalarStuff.addDefaultI64(builder, defaultI64);\n    ScalarStuff.addJustU64(builder, justU64);\n    if (maybeU64 !== null) ScalarStuff.addMaybeU64(builder, maybeU64);\n    ScalarStuff.addDefaultU64(builder, defaultU64);\n    ScalarStuff.addJustF32(builder, justF32);\n    if (maybeF32 !== null) ScalarStuff.addMaybeF32(builder, maybeF32);\n    ScalarStuff.addDefaultF32(builder, defaultF32);\n    ScalarStuff.addJustF64(builder, justF64);\n    if (maybeF64 !== null) ScalarStuff.addMaybeF64(builder, maybeF64);\n    ScalarStuff.addDefaultF64(builder, defaultF64);\n    ScalarStuff.addJustBool(builder, justBool);\n    if (maybeBool !== null) ScalarStuff.addMaybeBool(builder, maybeBool);\n    ScalarStuff.addDefaultBool(builder, defaultBool);\n    ScalarStuff.addJustEnum(builder, justEnum);\n    if (maybeEnum !== null) ScalarStuff.addMaybeEnum(builder, maybeEnum);\n    ScalarStuff.addDefaultEnum(builder, defaultEnum);\n    return ScalarStuff.endScalarStuff(builder);\n  }\n}\n"
  },
  {
    "path": "tests/ts/no_import_ext/optional-scalars.d.ts",
    "content": "export {OptionalByte} from './optional-scalars/optional-byte';\nexport {ScalarStuff} from './optional-scalars/scalar-stuff';\n"
  },
  {
    "path": "tests/ts/no_import_ext/optional-scalars.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nexport {OptionalByte} from './optional-scalars/optional-byte';\nexport {ScalarStuff} from './optional-scalars/scalar-stuff';\n"
  },
  {
    "path": "tests/ts/no_import_ext/optional-scalars.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport {OptionalByte} from './optional-scalars/optional-byte';\nexport {ScalarStuff} from './optional-scalars/scalar-stuff';\n"
  },
  {
    "path": "tests/ts/no_import_ext/optional_scalars.d.ts",
    "content": "export * as optional_scalars from './optional-scalars.js';\n"
  },
  {
    "path": "tests/ts/no_import_ext/optional_scalars.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\nimport * as optional_scalars_1 from './optional-scalars.js';\n\nexport {optional_scalars_1 as optional_scalars};\n"
  },
  {
    "path": "tests/ts/no_import_ext/optional_scalars.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport * as optional_scalars from './optional-scalars.js';\n"
  },
  {
    "path": "tests/ts/optional-scalars/optional-byte.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport enum OptionalByte {\n  None = 0,\n  One = 1,\n  Two = 2\n}\n"
  },
  {
    "path": "tests/ts/optional-scalars/scalar-stuff.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport { OptionalByte } from './optional-byte.js';\n\n\nexport class ScalarStuff {\n  bb: flatbuffers.ByteBuffer|null = null;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):ScalarStuff {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\nstatic getRootAsScalarStuff(bb:flatbuffers.ByteBuffer, obj?:ScalarStuff):ScalarStuff {\n  return (obj || new ScalarStuff()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic getSizePrefixedRootAsScalarStuff(bb:flatbuffers.ByteBuffer, obj?:ScalarStuff):ScalarStuff {\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n  return (obj || new ScalarStuff()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic bufferHasIdentifier(bb:flatbuffers.ByteBuffer):boolean {\n  return bb.__has_identifier('NULL');\n}\n\njustI8():number {\n  const offset = this.bb!.__offset(this.bb_pos, 4);\n  return offset ? this.bb!.readInt8(this.bb_pos + offset) : 0;\n}\n\nmaybeI8():number|null {\n  const offset = this.bb!.__offset(this.bb_pos, 6);\n  return offset ? this.bb!.readInt8(this.bb_pos + offset) : null;\n}\n\ndefaultI8():number {\n  const offset = this.bb!.__offset(this.bb_pos, 8);\n  return offset ? this.bb!.readInt8(this.bb_pos + offset) : 42;\n}\n\njustU8():number {\n  const offset = this.bb!.__offset(this.bb_pos, 10);\n  return offset ? this.bb!.readUint8(this.bb_pos + offset) : 0;\n}\n\nmaybeU8():number|null {\n  const offset = this.bb!.__offset(this.bb_pos, 12);\n  return offset ? this.bb!.readUint8(this.bb_pos + offset) : null;\n}\n\ndefaultU8():number {\n  const offset = this.bb!.__offset(this.bb_pos, 14);\n  return offset ? this.bb!.readUint8(this.bb_pos + offset) : 42;\n}\n\njustI16():number {\n  const offset = this.bb!.__offset(this.bb_pos, 16);\n  return offset ? this.bb!.readInt16(this.bb_pos + offset) : 0;\n}\n\nmaybeI16():number|null {\n  const offset = this.bb!.__offset(this.bb_pos, 18);\n  return offset ? this.bb!.readInt16(this.bb_pos + offset) : null;\n}\n\ndefaultI16():number {\n  const offset = this.bb!.__offset(this.bb_pos, 20);\n  return offset ? this.bb!.readInt16(this.bb_pos + offset) : 42;\n}\n\njustU16():number {\n  const offset = this.bb!.__offset(this.bb_pos, 22);\n  return offset ? this.bb!.readUint16(this.bb_pos + offset) : 0;\n}\n\nmaybeU16():number|null {\n  const offset = this.bb!.__offset(this.bb_pos, 24);\n  return offset ? this.bb!.readUint16(this.bb_pos + offset) : null;\n}\n\ndefaultU16():number {\n  const offset = this.bb!.__offset(this.bb_pos, 26);\n  return offset ? this.bb!.readUint16(this.bb_pos + offset) : 42;\n}\n\njustI32():number {\n  const offset = this.bb!.__offset(this.bb_pos, 28);\n  return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;\n}\n\nmaybeI32():number|null {\n  const offset = this.bb!.__offset(this.bb_pos, 30);\n  return offset ? this.bb!.readInt32(this.bb_pos + offset) : null;\n}\n\ndefaultI32():number {\n  const offset = this.bb!.__offset(this.bb_pos, 32);\n  return offset ? this.bb!.readInt32(this.bb_pos + offset) : 42;\n}\n\njustU32():number {\n  const offset = this.bb!.__offset(this.bb_pos, 34);\n  return offset ? this.bb!.readUint32(this.bb_pos + offset) : 0;\n}\n\nmaybeU32():number|null {\n  const offset = this.bb!.__offset(this.bb_pos, 36);\n  return offset ? this.bb!.readUint32(this.bb_pos + offset) : null;\n}\n\ndefaultU32():number {\n  const offset = this.bb!.__offset(this.bb_pos, 38);\n  return offset ? this.bb!.readUint32(this.bb_pos + offset) : 42;\n}\n\njustI64():bigint {\n  const offset = this.bb!.__offset(this.bb_pos, 40);\n  return offset ? this.bb!.readInt64(this.bb_pos + offset) : BigInt('0');\n}\n\nmaybeI64():bigint|null {\n  const offset = this.bb!.__offset(this.bb_pos, 42);\n  return offset ? this.bb!.readInt64(this.bb_pos + offset) : null;\n}\n\ndefaultI64():bigint {\n  const offset = this.bb!.__offset(this.bb_pos, 44);\n  return offset ? this.bb!.readInt64(this.bb_pos + offset) : BigInt('42');\n}\n\njustU64():bigint {\n  const offset = this.bb!.__offset(this.bb_pos, 46);\n  return offset ? this.bb!.readUint64(this.bb_pos + offset) : BigInt('0');\n}\n\nmaybeU64():bigint|null {\n  const offset = this.bb!.__offset(this.bb_pos, 48);\n  return offset ? this.bb!.readUint64(this.bb_pos + offset) : null;\n}\n\ndefaultU64():bigint {\n  const offset = this.bb!.__offset(this.bb_pos, 50);\n  return offset ? this.bb!.readUint64(this.bb_pos + offset) : BigInt('42');\n}\n\njustF32():number {\n  const offset = this.bb!.__offset(this.bb_pos, 52);\n  return offset ? this.bb!.readFloat32(this.bb_pos + offset) : 0.0;\n}\n\nmaybeF32():number|null {\n  const offset = this.bb!.__offset(this.bb_pos, 54);\n  return offset ? this.bb!.readFloat32(this.bb_pos + offset) : null;\n}\n\ndefaultF32():number {\n  const offset = this.bb!.__offset(this.bb_pos, 56);\n  return offset ? this.bb!.readFloat32(this.bb_pos + offset) : 42.0;\n}\n\njustF64():number {\n  const offset = this.bb!.__offset(this.bb_pos, 58);\n  return offset ? this.bb!.readFloat64(this.bb_pos + offset) : 0.0;\n}\n\nmaybeF64():number|null {\n  const offset = this.bb!.__offset(this.bb_pos, 60);\n  return offset ? this.bb!.readFloat64(this.bb_pos + offset) : null;\n}\n\ndefaultF64():number {\n  const offset = this.bb!.__offset(this.bb_pos, 62);\n  return offset ? this.bb!.readFloat64(this.bb_pos + offset) : 42.0;\n}\n\njustBool():boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 64);\n  return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false;\n}\n\nmaybeBool():boolean|null {\n  const offset = this.bb!.__offset(this.bb_pos, 66);\n  return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : null;\n}\n\ndefaultBool():boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 68);\n  return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : true;\n}\n\njustEnum():OptionalByte {\n  const offset = this.bb!.__offset(this.bb_pos, 70);\n  return offset ? this.bb!.readInt8(this.bb_pos + offset) : OptionalByte.None;\n}\n\nmaybeEnum():OptionalByte|null {\n  const offset = this.bb!.__offset(this.bb_pos, 72);\n  return offset ? this.bb!.readInt8(this.bb_pos + offset) : null;\n}\n\ndefaultEnum():OptionalByte {\n  const offset = this.bb!.__offset(this.bb_pos, 74);\n  return offset ? this.bb!.readInt8(this.bb_pos + offset) : OptionalByte.One;\n}\n\nstatic getFullyQualifiedName(): \"optional_scalars.ScalarStuff\" {\n  return 'optional_scalars.ScalarStuff';\n}\n\nstatic startScalarStuff(builder:flatbuffers.Builder) {\n  builder.startObject(36);\n}\n\nstatic addJustI8(builder:flatbuffers.Builder, justI8:number) {\n  builder.addFieldInt8(0, justI8, 0);\n}\n\nstatic addMaybeI8(builder:flatbuffers.Builder, maybeI8:number) {\n  builder.addFieldInt8(1, maybeI8, null);\n}\n\nstatic addDefaultI8(builder:flatbuffers.Builder, defaultI8:number) {\n  builder.addFieldInt8(2, defaultI8, 42);\n}\n\nstatic addJustU8(builder:flatbuffers.Builder, justU8:number) {\n  builder.addFieldInt8(3, justU8, 0);\n}\n\nstatic addMaybeU8(builder:flatbuffers.Builder, maybeU8:number) {\n  builder.addFieldInt8(4, maybeU8, null);\n}\n\nstatic addDefaultU8(builder:flatbuffers.Builder, defaultU8:number) {\n  builder.addFieldInt8(5, defaultU8, 42);\n}\n\nstatic addJustI16(builder:flatbuffers.Builder, justI16:number) {\n  builder.addFieldInt16(6, justI16, 0);\n}\n\nstatic addMaybeI16(builder:flatbuffers.Builder, maybeI16:number) {\n  builder.addFieldInt16(7, maybeI16, null);\n}\n\nstatic addDefaultI16(builder:flatbuffers.Builder, defaultI16:number) {\n  builder.addFieldInt16(8, defaultI16, 42);\n}\n\nstatic addJustU16(builder:flatbuffers.Builder, justU16:number) {\n  builder.addFieldInt16(9, justU16, 0);\n}\n\nstatic addMaybeU16(builder:flatbuffers.Builder, maybeU16:number) {\n  builder.addFieldInt16(10, maybeU16, null);\n}\n\nstatic addDefaultU16(builder:flatbuffers.Builder, defaultU16:number) {\n  builder.addFieldInt16(11, defaultU16, 42);\n}\n\nstatic addJustI32(builder:flatbuffers.Builder, justI32:number) {\n  builder.addFieldInt32(12, justI32, 0);\n}\n\nstatic addMaybeI32(builder:flatbuffers.Builder, maybeI32:number) {\n  builder.addFieldInt32(13, maybeI32, null);\n}\n\nstatic addDefaultI32(builder:flatbuffers.Builder, defaultI32:number) {\n  builder.addFieldInt32(14, defaultI32, 42);\n}\n\nstatic addJustU32(builder:flatbuffers.Builder, justU32:number) {\n  builder.addFieldInt32(15, justU32, 0);\n}\n\nstatic addMaybeU32(builder:flatbuffers.Builder, maybeU32:number) {\n  builder.addFieldInt32(16, maybeU32, null);\n}\n\nstatic addDefaultU32(builder:flatbuffers.Builder, defaultU32:number) {\n  builder.addFieldInt32(17, defaultU32, 42);\n}\n\nstatic addJustI64(builder:flatbuffers.Builder, justI64:bigint) {\n  builder.addFieldInt64(18, justI64, BigInt('0'));\n}\n\nstatic addMaybeI64(builder:flatbuffers.Builder, maybeI64:bigint) {\n  builder.addFieldInt64(19, maybeI64, null);\n}\n\nstatic addDefaultI64(builder:flatbuffers.Builder, defaultI64:bigint) {\n  builder.addFieldInt64(20, defaultI64, BigInt('42'));\n}\n\nstatic addJustU64(builder:flatbuffers.Builder, justU64:bigint) {\n  builder.addFieldInt64(21, justU64, BigInt('0'));\n}\n\nstatic addMaybeU64(builder:flatbuffers.Builder, maybeU64:bigint) {\n  builder.addFieldInt64(22, maybeU64, null);\n}\n\nstatic addDefaultU64(builder:flatbuffers.Builder, defaultU64:bigint) {\n  builder.addFieldInt64(23, defaultU64, BigInt('42'));\n}\n\nstatic addJustF32(builder:flatbuffers.Builder, justF32:number) {\n  builder.addFieldFloat32(24, justF32, 0.0);\n}\n\nstatic addMaybeF32(builder:flatbuffers.Builder, maybeF32:number) {\n  builder.addFieldFloat32(25, maybeF32, null);\n}\n\nstatic addDefaultF32(builder:flatbuffers.Builder, defaultF32:number) {\n  builder.addFieldFloat32(26, defaultF32, 42.0);\n}\n\nstatic addJustF64(builder:flatbuffers.Builder, justF64:number) {\n  builder.addFieldFloat64(27, justF64, 0.0);\n}\n\nstatic addMaybeF64(builder:flatbuffers.Builder, maybeF64:number) {\n  builder.addFieldFloat64(28, maybeF64, null);\n}\n\nstatic addDefaultF64(builder:flatbuffers.Builder, defaultF64:number) {\n  builder.addFieldFloat64(29, defaultF64, 42.0);\n}\n\nstatic addJustBool(builder:flatbuffers.Builder, justBool:boolean) {\n  builder.addFieldInt8(30, +justBool, +false);\n}\n\nstatic addMaybeBool(builder:flatbuffers.Builder, maybeBool:boolean) {\n  builder.addFieldInt8(31, +maybeBool, null);\n}\n\nstatic addDefaultBool(builder:flatbuffers.Builder, defaultBool:boolean) {\n  builder.addFieldInt8(32, +defaultBool, +true);\n}\n\nstatic addJustEnum(builder:flatbuffers.Builder, justEnum:OptionalByte) {\n  builder.addFieldInt8(33, justEnum, OptionalByte.None);\n}\n\nstatic addMaybeEnum(builder:flatbuffers.Builder, maybeEnum:OptionalByte) {\n  builder.addFieldInt8(34, maybeEnum, null);\n}\n\nstatic addDefaultEnum(builder:flatbuffers.Builder, defaultEnum:OptionalByte) {\n  builder.addFieldInt8(35, defaultEnum, OptionalByte.One);\n}\n\nstatic endScalarStuff(builder:flatbuffers.Builder):flatbuffers.Offset {\n  const offset = builder.endObject();\n  return offset;\n}\n\nstatic finishScalarStuffBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) {\n  builder.finish(offset, 'NULL');\n}\n\nstatic finishSizePrefixedScalarStuffBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) {\n  builder.finish(offset, 'NULL', true);\n}\n\nstatic createScalarStuff(builder:flatbuffers.Builder, justI8:number, maybeI8:number|null, defaultI8:number, justU8:number, maybeU8:number|null, defaultU8:number, justI16:number, maybeI16:number|null, defaultI16:number, justU16:number, maybeU16:number|null, defaultU16:number, justI32:number, maybeI32:number|null, defaultI32:number, justU32:number, maybeU32:number|null, defaultU32:number, justI64:bigint, maybeI64:bigint|null, defaultI64:bigint, justU64:bigint, maybeU64:bigint|null, defaultU64:bigint, justF32:number, maybeF32:number|null, defaultF32:number, justF64:number, maybeF64:number|null, defaultF64:number, justBool:boolean, maybeBool:boolean|null, defaultBool:boolean, justEnum:OptionalByte, maybeEnum:OptionalByte|null, defaultEnum:OptionalByte):flatbuffers.Offset {\n  ScalarStuff.startScalarStuff(builder);\n  ScalarStuff.addJustI8(builder, justI8);\n  if (maybeI8 !== null)\n    ScalarStuff.addMaybeI8(builder, maybeI8);\n  ScalarStuff.addDefaultI8(builder, defaultI8);\n  ScalarStuff.addJustU8(builder, justU8);\n  if (maybeU8 !== null)\n    ScalarStuff.addMaybeU8(builder, maybeU8);\n  ScalarStuff.addDefaultU8(builder, defaultU8);\n  ScalarStuff.addJustI16(builder, justI16);\n  if (maybeI16 !== null)\n    ScalarStuff.addMaybeI16(builder, maybeI16);\n  ScalarStuff.addDefaultI16(builder, defaultI16);\n  ScalarStuff.addJustU16(builder, justU16);\n  if (maybeU16 !== null)\n    ScalarStuff.addMaybeU16(builder, maybeU16);\n  ScalarStuff.addDefaultU16(builder, defaultU16);\n  ScalarStuff.addJustI32(builder, justI32);\n  if (maybeI32 !== null)\n    ScalarStuff.addMaybeI32(builder, maybeI32);\n  ScalarStuff.addDefaultI32(builder, defaultI32);\n  ScalarStuff.addJustU32(builder, justU32);\n  if (maybeU32 !== null)\n    ScalarStuff.addMaybeU32(builder, maybeU32);\n  ScalarStuff.addDefaultU32(builder, defaultU32);\n  ScalarStuff.addJustI64(builder, justI64);\n  if (maybeI64 !== null)\n    ScalarStuff.addMaybeI64(builder, maybeI64);\n  ScalarStuff.addDefaultI64(builder, defaultI64);\n  ScalarStuff.addJustU64(builder, justU64);\n  if (maybeU64 !== null)\n    ScalarStuff.addMaybeU64(builder, maybeU64);\n  ScalarStuff.addDefaultU64(builder, defaultU64);\n  ScalarStuff.addJustF32(builder, justF32);\n  if (maybeF32 !== null)\n    ScalarStuff.addMaybeF32(builder, maybeF32);\n  ScalarStuff.addDefaultF32(builder, defaultF32);\n  ScalarStuff.addJustF64(builder, justF64);\n  if (maybeF64 !== null)\n    ScalarStuff.addMaybeF64(builder, maybeF64);\n  ScalarStuff.addDefaultF64(builder, defaultF64);\n  ScalarStuff.addJustBool(builder, justBool);\n  if (maybeBool !== null)\n    ScalarStuff.addMaybeBool(builder, maybeBool);\n  ScalarStuff.addDefaultBool(builder, defaultBool);\n  ScalarStuff.addJustEnum(builder, justEnum);\n  if (maybeEnum !== null)\n    ScalarStuff.addMaybeEnum(builder, maybeEnum);\n  ScalarStuff.addDefaultEnum(builder, defaultEnum);\n  return ScalarStuff.endScalarStuff(builder);\n}\n}\n"
  },
  {
    "path": "tests/ts/optional-scalars.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport { OptionalByte } from './optional-scalars/optional-byte.js';\nexport { ScalarStuff } from './optional-scalars/scalar-stuff.js';\n"
  },
  {
    "path": "tests/ts/optional_scalars.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport * as optional_scalars from './optional-scalars.js';\n"
  },
  {
    "path": "tests/ts/package.json",
    "content": "{\n    \"type\": \"module\",\n    \"dependencies\": {\n        \"flatbuffers\": \"../../\"\n    }\n}\n"
  },
  {
    "path": "tests/ts/reflection/advanced-features.d.ts",
    "content": "/**\n * New schema language features that are not supported by old code generators.\n */\nexport declare enum AdvancedFeatures {\n  AdvancedArrayFeatures = '1',\n  AdvancedUnionFeatures = '2',\n  OptionalScalars = '4',\n  DefaultVectorsAndStrings = '8',\n}\n"
  },
  {
    "path": "tests/ts/reflection/advanced-features.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\n/**\n * New schema language features that are not supported by old code generators.\n */\nexport var AdvancedFeatures;\n(function(AdvancedFeatures) {\nAdvancedFeatures['AdvancedArrayFeatures'] = '1';\nAdvancedFeatures['AdvancedUnionFeatures'] = '2';\nAdvancedFeatures['OptionalScalars'] = '4';\nAdvancedFeatures['DefaultVectorsAndStrings'] = '8';\n})(AdvancedFeatures || (AdvancedFeatures = {}));\n"
  },
  {
    "path": "tests/ts/reflection/advanced-features.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\n/**\n * New schema language features that are not supported by old code generators.\n */\nexport enum AdvancedFeatures {\n  AdvancedArrayFeatures = '1',\n  AdvancedUnionFeatures = '2',\n  OptionalScalars = '4',\n  DefaultVectorsAndStrings = '8',\n}\n"
  },
  {
    "path": "tests/ts/reflection/base-type.d.ts",
    "content": "export declare enum BaseType {\n  None = 0,\n  UType = 1,\n  Bool = 2,\n  Byte = 3,\n  UByte = 4,\n  Short = 5,\n  UShort = 6,\n  Int = 7,\n  UInt = 8,\n  Long = 9,\n  ULong = 10,\n  Float = 11,\n  Double = 12,\n  String = 13,\n  Vector = 14,\n  Obj = 15,\n  Union = 16,\n  Array = 17,\n  Vector64 = 18,\n  MaxBaseType = 19,\n}\n"
  },
  {
    "path": "tests/ts/reflection/base-type.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nexport var BaseType;\n(function(BaseType) {\nBaseType[BaseType['None'] = 0] = 'None';\nBaseType[BaseType['UType'] = 1] = 'UType';\nBaseType[BaseType['Bool'] = 2] = 'Bool';\nBaseType[BaseType['Byte'] = 3] = 'Byte';\nBaseType[BaseType['UByte'] = 4] = 'UByte';\nBaseType[BaseType['Short'] = 5] = 'Short';\nBaseType[BaseType['UShort'] = 6] = 'UShort';\nBaseType[BaseType['Int'] = 7] = 'Int';\nBaseType[BaseType['UInt'] = 8] = 'UInt';\nBaseType[BaseType['Long'] = 9] = 'Long';\nBaseType[BaseType['ULong'] = 10] = 'ULong';\nBaseType[BaseType['Float'] = 11] = 'Float';\nBaseType[BaseType['Double'] = 12] = 'Double';\nBaseType[BaseType['String'] = 13] = 'String';\nBaseType[BaseType['Vector'] = 14] = 'Vector';\nBaseType[BaseType['Obj'] = 15] = 'Obj';\nBaseType[BaseType['Union'] = 16] = 'Union';\nBaseType[BaseType['Array'] = 17] = 'Array';\nBaseType[BaseType['Vector64'] = 18] = 'Vector64';\nBaseType[BaseType['MaxBaseType'] = 19] = 'MaxBaseType';\n})(BaseType || (BaseType = {}));\n"
  },
  {
    "path": "tests/ts/reflection/base-type.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport enum BaseType {\n  None = 0,\n  UType = 1,\n  Bool = 2,\n  Byte = 3,\n  UByte = 4,\n  Short = 5,\n  UShort = 6,\n  Int = 7,\n  UInt = 8,\n  Long = 9,\n  ULong = 10,\n  Float = 11,\n  Double = 12,\n  String = 13,\n  Vector = 14,\n  Obj = 15,\n  Union = 16,\n  Array = 17,\n  Vector64 = 18,\n  MaxBaseType = 19,\n}\n"
  },
  {
    "path": "tests/ts/reflection/enum-val.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nimport {KeyValue, KeyValueT} from '../reflection/key-value.js';\nimport {Type, TypeT} from '../reflection/type.js';\nexport declare class EnumVal\n  implements flatbuffers.IUnpackableObject<EnumValT>\n{\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): EnumVal;\n  static getRootAsEnumVal(bb: flatbuffers.ByteBuffer, obj?: EnumVal): EnumVal;\n  static getSizePrefixedRootAsEnumVal(\n    bb: flatbuffers.ByteBuffer,\n    obj?: EnumVal,\n  ): EnumVal;\n  name(): string | null;\n  name(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  value(): bigint;\n  mutate_value(value: bigint): boolean;\n  unionType(obj?: Type): Type | null;\n  documentation(index: number): string;\n  documentation(\n    index: number,\n    optionalEncoding: flatbuffers.Encoding,\n  ): string | Uint8Array;\n  documentationLength(): number;\n  attributes(index: number, obj?: KeyValue): KeyValue | null;\n  attributesLength(): number;\n  static getFullyQualifiedName(): string;\n  static startEnumVal(builder: flatbuffers.Builder): void;\n  static addName(\n    builder: flatbuffers.Builder,\n    nameOffset: flatbuffers.Offset,\n  ): void;\n  static addValue(builder: flatbuffers.Builder, value: bigint): void;\n  static addUnionType(\n    builder: flatbuffers.Builder,\n    unionTypeOffset: flatbuffers.Offset,\n  ): void;\n  static addDocumentation(\n    builder: flatbuffers.Builder,\n    documentationOffset: flatbuffers.Offset,\n  ): void;\n  static createDocumentationVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset;\n  static startDocumentationVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addAttributes(\n    builder: flatbuffers.Builder,\n    attributesOffset: flatbuffers.Offset,\n  ): void;\n  static createAttributesVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset;\n  static startAttributesVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static endEnumVal(builder: flatbuffers.Builder): flatbuffers.Offset;\n  unpack(): EnumValT;\n  unpackTo(_o: EnumValT): void;\n}\nexport declare class EnumValT implements flatbuffers.IGeneratedObject {\n  name: string | Uint8Array | null;\n  value: bigint;\n  unionType: TypeT | null;\n  documentation: string[];\n  attributes: KeyValueT[];\n  constructor(\n    name?: string | Uint8Array | null,\n    value?: bigint,\n    unionType?: TypeT | null,\n    documentation?: string[],\n    attributes?: KeyValueT[],\n  );\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/reflection/enum-val.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\n\nimport {KeyValue} from '../reflection/key-value.js';\nimport {Type} from '../reflection/type.js';\n\nexport class EnumVal {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsEnumVal(bb, obj) {\n    return (obj || new EnumVal())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsEnumVal(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new EnumVal())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  name(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) :\n                    null;\n  }\n  value() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.readInt64(this.bb_pos + offset) : BigInt('0');\n  }\n  mutate_value(value) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt64(this.bb_pos + offset, value);\n    return true;\n  }\n  unionType(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ?\n        (obj || new Type())\n            .__init(this.bb.__indirect(this.bb_pos + offset), this.bb) :\n        null;\n  }\n  documentation(index, optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.__string(\n                        this.bb.__vector(this.bb_pos + offset) + index * 4,\n                        optionalEncoding) :\n                    null;\n  }\n  documentationLength() {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  attributes(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ?\n        (obj || new KeyValue())\n            .__init(\n                this.bb.__indirect(\n                    this.bb.__vector(this.bb_pos + offset) + index * 4),\n                this.bb) :\n        null;\n  }\n  attributesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  static getFullyQualifiedName() {\n    return 'reflection.EnumVal';\n  }\n  static startEnumVal(builder) {\n    builder.startObject(6);\n  }\n  static addName(builder, nameOffset) {\n    builder.addFieldOffset(0, nameOffset, 0);\n  }\n  static addValue(builder, value) {\n    builder.addFieldInt64(1, value, BigInt('0'));\n  }\n  static addUnionType(builder, unionTypeOffset) {\n    builder.addFieldOffset(3, unionTypeOffset, 0);\n  }\n  static addDocumentation(builder, documentationOffset) {\n    builder.addFieldOffset(4, documentationOffset, 0);\n  }\n  static createDocumentationVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startDocumentationVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addAttributes(builder, attributesOffset) {\n    builder.addFieldOffset(5, attributesOffset, 0);\n  }\n  static createAttributesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startAttributesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static endEnumVal(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4);  // name\n    return offset;\n  }\n  unpack() {\n    return new EnumValT(\n        this.name(), this.value(),\n        (this.unionType() !== null ? this.unionType().unpack() : null),\n        this.bb.createScalarList(\n            this.documentation.bind(this), this.documentationLength()),\n        this.bb.createObjList(\n            this.attributes.bind(this), this.attributesLength()));\n  }\n  unpackTo(_o) {\n    _o.name = this.name();\n    _o.value = this.value();\n    _o.unionType =\n        (this.unionType() !== null ? this.unionType().unpack() : null);\n    _o.documentation = this.bb.createScalarList(\n        this.documentation.bind(this), this.documentationLength());\n    _o.attributes = this.bb.createObjList(\n        this.attributes.bind(this), this.attributesLength());\n  }\n}\nexport class EnumValT {\n  constructor(\n      name = null, value = BigInt('0'), unionType = null, documentation = [],\n      attributes = []) {\n    this.name = name;\n    this.value = value;\n    this.unionType = unionType;\n    this.documentation = documentation;\n    this.attributes = attributes;\n  }\n  pack(builder) {\n    const name = (this.name !== null ? builder.createString(this.name) : 0);\n    const unionType =\n        (this.unionType !== null ? this.unionType.pack(builder) : 0);\n    const documentation = EnumVal.createDocumentationVector(\n        builder, builder.createObjectOffsetList(this.documentation));\n    const attributes = EnumVal.createAttributesVector(\n        builder, builder.createObjectOffsetList(this.attributes));\n    EnumVal.startEnumVal(builder);\n    EnumVal.addName(builder, name);\n    EnumVal.addValue(builder, this.value);\n    EnumVal.addUnionType(builder, unionType);\n    EnumVal.addDocumentation(builder, documentation);\n    EnumVal.addAttributes(builder, attributes);\n    return EnumVal.endEnumVal(builder);\n  }\n}\n"
  },
  {
    "path": "tests/ts/reflection/enum-val.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport {KeyValue, KeyValueT} from '../reflection/key-value.js';\nimport {Type, TypeT} from '../reflection/type.js';\n\nexport class EnumVal implements flatbuffers.IUnpackableObject<EnumValT> {\n  bb: flatbuffers.ByteBuffer | null = null;\n  bb_pos = 0;\n  __init(i: number, bb: flatbuffers.ByteBuffer): EnumVal {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n\n  static getRootAsEnumVal(bb: flatbuffers.ByteBuffer, obj?: EnumVal): EnumVal {\n    return (obj || new EnumVal()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  static getSizePrefixedRootAsEnumVal(\n    bb: flatbuffers.ByteBuffer,\n    obj?: EnumVal,\n  ): EnumVal {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new EnumVal()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  name(): string | null;\n  name(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  name(optionalEncoding?: any): string | Uint8Array | null {\n    const offset = this.bb!.__offset(this.bb_pos, 4);\n    return offset\n      ? this.bb!.__string(this.bb_pos + offset, optionalEncoding)\n      : null;\n  }\n\n  value(): bigint {\n    const offset = this.bb!.__offset(this.bb_pos, 6);\n    return offset ? this.bb!.readInt64(this.bb_pos + offset) : BigInt('0');\n  }\n\n  mutate_value(value: bigint): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 6);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeInt64(this.bb_pos + offset, value);\n    return true;\n  }\n\n  unionType(obj?: Type): Type | null {\n    const offset = this.bb!.__offset(this.bb_pos, 10);\n    return offset\n      ? (obj || new Type()).__init(\n          this.bb!.__indirect(this.bb_pos + offset),\n          this.bb!,\n        )\n      : null;\n  }\n\n  documentation(index: number): string;\n  documentation(\n    index: number,\n    optionalEncoding: flatbuffers.Encoding,\n  ): string | Uint8Array;\n  documentation(\n    index: number,\n    optionalEncoding?: any,\n  ): string | Uint8Array | null {\n    const offset = this.bb!.__offset(this.bb_pos, 12);\n    return offset\n      ? this.bb!.__string(\n          this.bb!.__vector(this.bb_pos + offset) + index * 4,\n          optionalEncoding,\n        )\n      : null;\n  }\n\n  documentationLength(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 12);\n    return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n  }\n\n  attributes(index: number, obj?: KeyValue): KeyValue | null {\n    const offset = this.bb!.__offset(this.bb_pos, 14);\n    return offset\n      ? (obj || new KeyValue()).__init(\n          this.bb!.__indirect(\n            this.bb!.__vector(this.bb_pos + offset) + index * 4,\n          ),\n          this.bb!,\n        )\n      : null;\n  }\n\n  attributesLength(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 14);\n    return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n  }\n\n  static getFullyQualifiedName(): string {\n    return 'reflection.EnumVal';\n  }\n\n  static startEnumVal(builder: flatbuffers.Builder) {\n    builder.startObject(6);\n  }\n\n  static addName(builder: flatbuffers.Builder, nameOffset: flatbuffers.Offset) {\n    builder.addFieldOffset(0, nameOffset, 0);\n  }\n\n  static addValue(builder: flatbuffers.Builder, value: bigint) {\n    builder.addFieldInt64(1, value, BigInt('0'));\n  }\n\n  static addUnionType(\n    builder: flatbuffers.Builder,\n    unionTypeOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(3, unionTypeOffset, 0);\n  }\n\n  static addDocumentation(\n    builder: flatbuffers.Builder,\n    documentationOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(4, documentationOffset, 0);\n  }\n\n  static createDocumentationVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]!);\n    }\n    return builder.endVector();\n  }\n\n  static startDocumentationVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ) {\n    builder.startVector(4, numElems, 4);\n  }\n\n  static addAttributes(\n    builder: flatbuffers.Builder,\n    attributesOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(5, attributesOffset, 0);\n  }\n\n  static createAttributesVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]!);\n    }\n    return builder.endVector();\n  }\n\n  static startAttributesVector(builder: flatbuffers.Builder, numElems: number) {\n    builder.startVector(4, numElems, 4);\n  }\n\n  static endEnumVal(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4); // name\n    return offset;\n  }\n\n  unpack(): EnumValT {\n    return new EnumValT(\n      this.name(),\n      this.value(),\n      this.unionType() !== null ? this.unionType()!.unpack() : null,\n      this.bb!.createScalarList<string>(\n        this.documentation.bind(this),\n        this.documentationLength(),\n      ),\n      this.bb!.createObjList<KeyValue, KeyValueT>(\n        this.attributes.bind(this),\n        this.attributesLength(),\n      ),\n    );\n  }\n\n  unpackTo(_o: EnumValT): void {\n    _o.name = this.name();\n    _o.value = this.value();\n    _o.unionType =\n      this.unionType() !== null ? this.unionType()!.unpack() : null;\n    _o.documentation = this.bb!.createScalarList<string>(\n      this.documentation.bind(this),\n      this.documentationLength(),\n    );\n    _o.attributes = this.bb!.createObjList<KeyValue, KeyValueT>(\n      this.attributes.bind(this),\n      this.attributesLength(),\n    );\n  }\n}\n\nexport class EnumValT implements flatbuffers.IGeneratedObject {\n  constructor(\n    public name: string | Uint8Array | null = null,\n    public value: bigint = BigInt('0'),\n    public unionType: TypeT | null = null,\n    public documentation: string[] = [],\n    public attributes: KeyValueT[] = [],\n  ) {}\n\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const name = this.name !== null ? builder.createString(this.name!) : 0;\n    const unionType =\n      this.unionType !== null ? this.unionType!.pack(builder) : 0;\n    const documentation = EnumVal.createDocumentationVector(\n      builder,\n      builder.createObjectOffsetList(this.documentation),\n    );\n    const attributes = EnumVal.createAttributesVector(\n      builder,\n      builder.createObjectOffsetList(this.attributes),\n    );\n\n    EnumVal.startEnumVal(builder);\n    EnumVal.addName(builder, name);\n    EnumVal.addValue(builder, this.value);\n    EnumVal.addUnionType(builder, unionType);\n    EnumVal.addDocumentation(builder, documentation);\n    EnumVal.addAttributes(builder, attributes);\n\n    return EnumVal.endEnumVal(builder);\n  }\n}\n"
  },
  {
    "path": "tests/ts/reflection/enum.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nimport {EnumVal, EnumValT} from '../reflection/enum-val.js';\nimport {KeyValue, KeyValueT} from '../reflection/key-value.js';\nimport {Type, TypeT} from '../reflection/type.js';\nexport declare class Enum implements flatbuffers.IUnpackableObject<EnumT> {\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Enum;\n  static getRootAsEnum(bb: flatbuffers.ByteBuffer, obj?: Enum): Enum;\n  static getSizePrefixedRootAsEnum(\n    bb: flatbuffers.ByteBuffer,\n    obj?: Enum,\n  ): Enum;\n  name(): string | null;\n  name(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  values(index: number, obj?: EnumVal): EnumVal | null;\n  valuesLength(): number;\n  isUnion(): boolean;\n  mutate_is_union(value: boolean): boolean;\n  underlyingType(obj?: Type): Type | null;\n  attributes(index: number, obj?: KeyValue): KeyValue | null;\n  attributesLength(): number;\n  documentation(index: number): string;\n  documentation(\n    index: number,\n    optionalEncoding: flatbuffers.Encoding,\n  ): string | Uint8Array;\n  documentationLength(): number;\n  /**\n   * File that this Enum is declared in.\n   */\n  declarationFile(): string | null;\n  declarationFile(\n    optionalEncoding: flatbuffers.Encoding,\n  ): string | Uint8Array | null;\n  static getFullyQualifiedName(): string;\n  static startEnum(builder: flatbuffers.Builder): void;\n  static addName(\n    builder: flatbuffers.Builder,\n    nameOffset: flatbuffers.Offset,\n  ): void;\n  static addValues(\n    builder: flatbuffers.Builder,\n    valuesOffset: flatbuffers.Offset,\n  ): void;\n  static createValuesVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset;\n  static startValuesVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addIsUnion(builder: flatbuffers.Builder, isUnion: boolean): void;\n  static addUnderlyingType(\n    builder: flatbuffers.Builder,\n    underlyingTypeOffset: flatbuffers.Offset,\n  ): void;\n  static addAttributes(\n    builder: flatbuffers.Builder,\n    attributesOffset: flatbuffers.Offset,\n  ): void;\n  static createAttributesVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset;\n  static startAttributesVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addDocumentation(\n    builder: flatbuffers.Builder,\n    documentationOffset: flatbuffers.Offset,\n  ): void;\n  static createDocumentationVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset;\n  static startDocumentationVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addDeclarationFile(\n    builder: flatbuffers.Builder,\n    declarationFileOffset: flatbuffers.Offset,\n  ): void;\n  static endEnum(builder: flatbuffers.Builder): flatbuffers.Offset;\n  unpack(): EnumT;\n  unpackTo(_o: EnumT): void;\n}\nexport declare class EnumT implements flatbuffers.IGeneratedObject {\n  name: string | Uint8Array | null;\n  values: EnumValT[];\n  isUnion: boolean;\n  underlyingType: TypeT | null;\n  attributes: KeyValueT[];\n  documentation: string[];\n  declarationFile: string | Uint8Array | null;\n  constructor(\n    name?: string | Uint8Array | null,\n    values?: EnumValT[],\n    isUnion?: boolean,\n    underlyingType?: TypeT | null,\n    attributes?: KeyValueT[],\n    documentation?: string[],\n    declarationFile?: string | Uint8Array | null,\n  );\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/reflection/enum.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\n\nimport {EnumVal} from '../reflection/enum-val.js';\nimport {KeyValue} from '../reflection/key-value.js';\nimport {Type} from '../reflection/type.js';\n\nexport class Enum {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsEnum(bb, obj) {\n    return (obj || new Enum())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsEnum(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new Enum())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  name(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) :\n                    null;\n  }\n  values(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ?\n        (obj || new EnumVal())\n            .__init(\n                this.bb.__indirect(\n                    this.bb.__vector(this.bb_pos + offset) + index * 4),\n                this.bb) :\n        null;\n  }\n  valuesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  isUnion() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false;\n  }\n  mutate_is_union(value) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n  underlyingType(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ?\n        (obj || new Type())\n            .__init(this.bb.__indirect(this.bb_pos + offset), this.bb) :\n        null;\n  }\n  attributes(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ?\n        (obj || new KeyValue())\n            .__init(\n                this.bb.__indirect(\n                    this.bb.__vector(this.bb_pos + offset) + index * 4),\n                this.bb) :\n        null;\n  }\n  attributesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  documentation(index, optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.__string(\n                        this.bb.__vector(this.bb_pos + offset) + index * 4,\n                        optionalEncoding) :\n                    null;\n  }\n  documentationLength() {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  declarationFile(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) :\n                    null;\n  }\n  static getFullyQualifiedName() {\n    return 'reflection.Enum';\n  }\n  static startEnum(builder) {\n    builder.startObject(7);\n  }\n  static addName(builder, nameOffset) {\n    builder.addFieldOffset(0, nameOffset, 0);\n  }\n  static addValues(builder, valuesOffset) {\n    builder.addFieldOffset(1, valuesOffset, 0);\n  }\n  static createValuesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startValuesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addIsUnion(builder, isUnion) {\n    builder.addFieldInt8(2, +isUnion, +false);\n  }\n  static addUnderlyingType(builder, underlyingTypeOffset) {\n    builder.addFieldOffset(3, underlyingTypeOffset, 0);\n  }\n  static addAttributes(builder, attributesOffset) {\n    builder.addFieldOffset(4, attributesOffset, 0);\n  }\n  static createAttributesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startAttributesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addDocumentation(builder, documentationOffset) {\n    builder.addFieldOffset(5, documentationOffset, 0);\n  }\n  static createDocumentationVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startDocumentationVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addDeclarationFile(builder, declarationFileOffset) {\n    builder.addFieldOffset(6, declarationFileOffset, 0);\n  }\n  static endEnum(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4);   // name\n    builder.requiredField(offset, 6);   // values\n    builder.requiredField(offset, 10);  // underlying_type\n    return offset;\n  }\n  unpack() {\n    return new EnumT(\n        this.name(),\n        this.bb.createObjList(this.values.bind(this), this.valuesLength()),\n        this.isUnion(),\n        (this.underlyingType() !== null ? this.underlyingType().unpack() :\n                                          null),\n        this.bb.createObjList(\n            this.attributes.bind(this), this.attributesLength()),\n        this.bb.createScalarList(\n            this.documentation.bind(this), this.documentationLength()),\n        this.declarationFile());\n  }\n  unpackTo(_o) {\n    _o.name = this.name();\n    _o.values =\n        this.bb.createObjList(this.values.bind(this), this.valuesLength());\n    _o.isUnion = this.isUnion();\n    _o.underlyingType =\n        (this.underlyingType() !== null ? this.underlyingType().unpack() :\n                                          null);\n    _o.attributes = this.bb.createObjList(\n        this.attributes.bind(this), this.attributesLength());\n    _o.documentation = this.bb.createScalarList(\n        this.documentation.bind(this), this.documentationLength());\n    _o.declarationFile = this.declarationFile();\n  }\n}\nexport class EnumT {\n  constructor(\n      name = null, values = [], isUnion = false, underlyingType = null,\n      attributes = [], documentation = [], declarationFile = null) {\n    this.name = name;\n    this.values = values;\n    this.isUnion = isUnion;\n    this.underlyingType = underlyingType;\n    this.attributes = attributes;\n    this.documentation = documentation;\n    this.declarationFile = declarationFile;\n  }\n  pack(builder) {\n    const name = (this.name !== null ? builder.createString(this.name) : 0);\n    const values = Enum.createValuesVector(\n        builder, builder.createObjectOffsetList(this.values));\n    const underlyingType =\n        (this.underlyingType !== null ? this.underlyingType.pack(builder) : 0);\n    const attributes = Enum.createAttributesVector(\n        builder, builder.createObjectOffsetList(this.attributes));\n    const documentation = Enum.createDocumentationVector(\n        builder, builder.createObjectOffsetList(this.documentation));\n    const declarationFile =\n        (this.declarationFile !== null ?\n             builder.createString(this.declarationFile) :\n             0);\n    Enum.startEnum(builder);\n    Enum.addName(builder, name);\n    Enum.addValues(builder, values);\n    Enum.addIsUnion(builder, this.isUnion);\n    Enum.addUnderlyingType(builder, underlyingType);\n    Enum.addAttributes(builder, attributes);\n    Enum.addDocumentation(builder, documentation);\n    Enum.addDeclarationFile(builder, declarationFile);\n    return Enum.endEnum(builder);\n  }\n}\n"
  },
  {
    "path": "tests/ts/reflection/enum.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport {EnumVal, EnumValT} from '../reflection/enum-val.js';\nimport {KeyValue, KeyValueT} from '../reflection/key-value.js';\nimport {Type, TypeT} from '../reflection/type.js';\n\nexport class Enum implements flatbuffers.IUnpackableObject<EnumT> {\n  bb: flatbuffers.ByteBuffer | null = null;\n  bb_pos = 0;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Enum {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n\n  static getRootAsEnum(bb: flatbuffers.ByteBuffer, obj?: Enum): Enum {\n    return (obj || new Enum()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  static getSizePrefixedRootAsEnum(\n    bb: flatbuffers.ByteBuffer,\n    obj?: Enum,\n  ): Enum {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new Enum()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  name(): string | null;\n  name(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  name(optionalEncoding?: any): string | Uint8Array | null {\n    const offset = this.bb!.__offset(this.bb_pos, 4);\n    return offset\n      ? this.bb!.__string(this.bb_pos + offset, optionalEncoding)\n      : null;\n  }\n\n  values(index: number, obj?: EnumVal): EnumVal | null {\n    const offset = this.bb!.__offset(this.bb_pos, 6);\n    return offset\n      ? (obj || new EnumVal()).__init(\n          this.bb!.__indirect(\n            this.bb!.__vector(this.bb_pos + offset) + index * 4,\n          ),\n          this.bb!,\n        )\n      : null;\n  }\n\n  valuesLength(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 6);\n    return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n  }\n\n  isUnion(): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 8);\n    return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false;\n  }\n\n  mutate_is_union(value: boolean): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 8);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n\n  underlyingType(obj?: Type): Type | null {\n    const offset = this.bb!.__offset(this.bb_pos, 10);\n    return offset\n      ? (obj || new Type()).__init(\n          this.bb!.__indirect(this.bb_pos + offset),\n          this.bb!,\n        )\n      : null;\n  }\n\n  attributes(index: number, obj?: KeyValue): KeyValue | null {\n    const offset = this.bb!.__offset(this.bb_pos, 12);\n    return offset\n      ? (obj || new KeyValue()).__init(\n          this.bb!.__indirect(\n            this.bb!.__vector(this.bb_pos + offset) + index * 4,\n          ),\n          this.bb!,\n        )\n      : null;\n  }\n\n  attributesLength(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 12);\n    return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n  }\n\n  documentation(index: number): string;\n  documentation(\n    index: number,\n    optionalEncoding: flatbuffers.Encoding,\n  ): string | Uint8Array;\n  documentation(\n    index: number,\n    optionalEncoding?: any,\n  ): string | Uint8Array | null {\n    const offset = this.bb!.__offset(this.bb_pos, 14);\n    return offset\n      ? this.bb!.__string(\n          this.bb!.__vector(this.bb_pos + offset) + index * 4,\n          optionalEncoding,\n        )\n      : null;\n  }\n\n  documentationLength(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 14);\n    return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n  }\n\n  /**\n   * File that this Enum is declared in.\n   */\n  declarationFile(): string | null;\n  declarationFile(\n    optionalEncoding: flatbuffers.Encoding,\n  ): string | Uint8Array | null;\n  declarationFile(optionalEncoding?: any): string | Uint8Array | null {\n    const offset = this.bb!.__offset(this.bb_pos, 16);\n    return offset\n      ? this.bb!.__string(this.bb_pos + offset, optionalEncoding)\n      : null;\n  }\n\n  static getFullyQualifiedName(): string {\n    return 'reflection.Enum';\n  }\n\n  static startEnum(builder: flatbuffers.Builder) {\n    builder.startObject(7);\n  }\n\n  static addName(builder: flatbuffers.Builder, nameOffset: flatbuffers.Offset) {\n    builder.addFieldOffset(0, nameOffset, 0);\n  }\n\n  static addValues(\n    builder: flatbuffers.Builder,\n    valuesOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(1, valuesOffset, 0);\n  }\n\n  static createValuesVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]!);\n    }\n    return builder.endVector();\n  }\n\n  static startValuesVector(builder: flatbuffers.Builder, numElems: number) {\n    builder.startVector(4, numElems, 4);\n  }\n\n  static addIsUnion(builder: flatbuffers.Builder, isUnion: boolean) {\n    builder.addFieldInt8(2, +isUnion, +false);\n  }\n\n  static addUnderlyingType(\n    builder: flatbuffers.Builder,\n    underlyingTypeOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(3, underlyingTypeOffset, 0);\n  }\n\n  static addAttributes(\n    builder: flatbuffers.Builder,\n    attributesOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(4, attributesOffset, 0);\n  }\n\n  static createAttributesVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]!);\n    }\n    return builder.endVector();\n  }\n\n  static startAttributesVector(builder: flatbuffers.Builder, numElems: number) {\n    builder.startVector(4, numElems, 4);\n  }\n\n  static addDocumentation(\n    builder: flatbuffers.Builder,\n    documentationOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(5, documentationOffset, 0);\n  }\n\n  static createDocumentationVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]!);\n    }\n    return builder.endVector();\n  }\n\n  static startDocumentationVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ) {\n    builder.startVector(4, numElems, 4);\n  }\n\n  static addDeclarationFile(\n    builder: flatbuffers.Builder,\n    declarationFileOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(6, declarationFileOffset, 0);\n  }\n\n  static endEnum(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4); // name\n    builder.requiredField(offset, 6); // values\n    builder.requiredField(offset, 10); // underlying_type\n    return offset;\n  }\n\n  unpack(): EnumT {\n    return new EnumT(\n      this.name(),\n      this.bb!.createObjList<EnumVal, EnumValT>(\n        this.values.bind(this),\n        this.valuesLength(),\n      ),\n      this.isUnion(),\n      this.underlyingType() !== null ? this.underlyingType()!.unpack() : null,\n      this.bb!.createObjList<KeyValue, KeyValueT>(\n        this.attributes.bind(this),\n        this.attributesLength(),\n      ),\n      this.bb!.createScalarList<string>(\n        this.documentation.bind(this),\n        this.documentationLength(),\n      ),\n      this.declarationFile(),\n    );\n  }\n\n  unpackTo(_o: EnumT): void {\n    _o.name = this.name();\n    _o.values = this.bb!.createObjList<EnumVal, EnumValT>(\n      this.values.bind(this),\n      this.valuesLength(),\n    );\n    _o.isUnion = this.isUnion();\n    _o.underlyingType =\n      this.underlyingType() !== null ? this.underlyingType()!.unpack() : null;\n    _o.attributes = this.bb!.createObjList<KeyValue, KeyValueT>(\n      this.attributes.bind(this),\n      this.attributesLength(),\n    );\n    _o.documentation = this.bb!.createScalarList<string>(\n      this.documentation.bind(this),\n      this.documentationLength(),\n    );\n    _o.declarationFile = this.declarationFile();\n  }\n}\n\nexport class EnumT implements flatbuffers.IGeneratedObject {\n  constructor(\n    public name: string | Uint8Array | null = null,\n    public values: EnumValT[] = [],\n    public isUnion: boolean = false,\n    public underlyingType: TypeT | null = null,\n    public attributes: KeyValueT[] = [],\n    public documentation: string[] = [],\n    public declarationFile: string | Uint8Array | null = null,\n  ) {}\n\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const name = this.name !== null ? builder.createString(this.name!) : 0;\n    const values = Enum.createValuesVector(\n      builder,\n      builder.createObjectOffsetList(this.values),\n    );\n    const underlyingType =\n      this.underlyingType !== null ? this.underlyingType!.pack(builder) : 0;\n    const attributes = Enum.createAttributesVector(\n      builder,\n      builder.createObjectOffsetList(this.attributes),\n    );\n    const documentation = Enum.createDocumentationVector(\n      builder,\n      builder.createObjectOffsetList(this.documentation),\n    );\n    const declarationFile =\n      this.declarationFile !== null\n        ? builder.createString(this.declarationFile!)\n        : 0;\n\n    Enum.startEnum(builder);\n    Enum.addName(builder, name);\n    Enum.addValues(builder, values);\n    Enum.addIsUnion(builder, this.isUnion);\n    Enum.addUnderlyingType(builder, underlyingType);\n    Enum.addAttributes(builder, attributes);\n    Enum.addDocumentation(builder, documentation);\n    Enum.addDeclarationFile(builder, declarationFile);\n\n    return Enum.endEnum(builder);\n  }\n}\n"
  },
  {
    "path": "tests/ts/reflection/field.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nimport {KeyValue, KeyValueT} from '../reflection/key-value.js';\nimport {Type, TypeT} from '../reflection/type.js';\nexport declare class Field implements flatbuffers.IUnpackableObject<FieldT> {\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Field;\n  static getRootAsField(bb: flatbuffers.ByteBuffer, obj?: Field): Field;\n  static getSizePrefixedRootAsField(\n    bb: flatbuffers.ByteBuffer,\n    obj?: Field,\n  ): Field;\n  name(): string | null;\n  name(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  type(obj?: Type): Type | null;\n  id(): number;\n  mutate_id(value: number): boolean;\n  offset(): number;\n  mutate_offset(value: number): boolean;\n  defaultInteger(): bigint;\n  mutate_default_integer(value: bigint): boolean;\n  defaultReal(): number;\n  mutate_default_real(value: number): boolean;\n  deprecated(): boolean;\n  mutate_deprecated(value: boolean): boolean;\n  required(): boolean;\n  mutate_required(value: boolean): boolean;\n  key(): boolean;\n  mutate_key(value: boolean): boolean;\n  attributes(index: number, obj?: KeyValue): KeyValue | null;\n  attributesLength(): number;\n  documentation(index: number): string;\n  documentation(\n    index: number,\n    optionalEncoding: flatbuffers.Encoding,\n  ): string | Uint8Array;\n  documentationLength(): number;\n  optional(): boolean;\n  mutate_optional(value: boolean): boolean;\n  /**\n   * Number of padding octets to always add after this field. Structs only.\n   */\n  padding(): number;\n  mutate_padding(value: number): boolean;\n  /**\n   * If the field uses 64-bit offsets.\n   */\n  offset64(): boolean;\n  mutate_offset64(value: boolean): boolean;\n  static getFullyQualifiedName(): string;\n  static startField(builder: flatbuffers.Builder): void;\n  static addName(\n    builder: flatbuffers.Builder,\n    nameOffset: flatbuffers.Offset,\n  ): void;\n  static addType(\n    builder: flatbuffers.Builder,\n    typeOffset: flatbuffers.Offset,\n  ): void;\n  static addId(builder: flatbuffers.Builder, id: number): void;\n  static addOffset(builder: flatbuffers.Builder, offset: number): void;\n  static addDefaultInteger(\n    builder: flatbuffers.Builder,\n    defaultInteger: bigint,\n  ): void;\n  static addDefaultReal(\n    builder: flatbuffers.Builder,\n    defaultReal: number,\n  ): void;\n  static addDeprecated(builder: flatbuffers.Builder, deprecated: boolean): void;\n  static addRequired(builder: flatbuffers.Builder, required: boolean): void;\n  static addKey(builder: flatbuffers.Builder, key: boolean): void;\n  static addAttributes(\n    builder: flatbuffers.Builder,\n    attributesOffset: flatbuffers.Offset,\n  ): void;\n  static createAttributesVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset;\n  static startAttributesVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addDocumentation(\n    builder: flatbuffers.Builder,\n    documentationOffset: flatbuffers.Offset,\n  ): void;\n  static createDocumentationVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset;\n  static startDocumentationVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addOptional(builder: flatbuffers.Builder, optional: boolean): void;\n  static addPadding(builder: flatbuffers.Builder, padding: number): void;\n  static addOffset64(builder: flatbuffers.Builder, offset64: boolean): void;\n  static endField(builder: flatbuffers.Builder): flatbuffers.Offset;\n  unpack(): FieldT;\n  unpackTo(_o: FieldT): void;\n}\nexport declare class FieldT implements flatbuffers.IGeneratedObject {\n  name: string | Uint8Array | null;\n  type: TypeT | null;\n  id: number;\n  offset: number;\n  defaultInteger: bigint;\n  defaultReal: number;\n  deprecated: boolean;\n  required: boolean;\n  key: boolean;\n  attributes: KeyValueT[];\n  documentation: string[];\n  optional: boolean;\n  padding: number;\n  offset64: boolean;\n  constructor(\n    name?: string | Uint8Array | null,\n    type?: TypeT | null,\n    id?: number,\n    offset?: number,\n    defaultInteger?: bigint,\n    defaultReal?: number,\n    deprecated?: boolean,\n    required?: boolean,\n    key?: boolean,\n    attributes?: KeyValueT[],\n    documentation?: string[],\n    optional?: boolean,\n    padding?: number,\n    offset64?: boolean,\n  );\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/reflection/field.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\n\nimport {KeyValue} from '../reflection/key-value.js';\nimport {Type} from '../reflection/type.js';\n\nexport class Field {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsField(bb, obj) {\n    return (obj || new Field())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsField(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new Field())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  name(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) :\n                    null;\n  }\n  type(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ?\n        (obj || new Type())\n            .__init(this.bb.__indirect(this.bb_pos + offset), this.bb) :\n        null;\n  }\n  id() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? this.bb.readUint16(this.bb_pos + offset) : 0;\n  }\n  mutate_id(value) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint16(this.bb_pos + offset, value);\n    return true;\n  }\n  offset() {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.readUint16(this.bb_pos + offset) : 0;\n  }\n  mutate_offset(value) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint16(this.bb_pos + offset, value);\n    return true;\n  }\n  defaultInteger() {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.readInt64(this.bb_pos + offset) : BigInt('0');\n  }\n  mutate_default_integer(value) {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt64(this.bb_pos + offset, value);\n    return true;\n  }\n  defaultReal() {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.readFloat64(this.bb_pos + offset) : 0.0;\n  }\n  mutate_default_real(value) {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeFloat64(this.bb_pos + offset, value);\n    return true;\n  }\n  deprecated() {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false;\n  }\n  mutate_deprecated(value) {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n  required() {\n    const offset = this.bb.__offset(this.bb_pos, 18);\n    return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false;\n  }\n  mutate_required(value) {\n    const offset = this.bb.__offset(this.bb_pos, 18);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n  key() {\n    const offset = this.bb.__offset(this.bb_pos, 20);\n    return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false;\n  }\n  mutate_key(value) {\n    const offset = this.bb.__offset(this.bb_pos, 20);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n  attributes(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 22);\n    return offset ?\n        (obj || new KeyValue())\n            .__init(\n                this.bb.__indirect(\n                    this.bb.__vector(this.bb_pos + offset) + index * 4),\n                this.bb) :\n        null;\n  }\n  attributesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 22);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  documentation(index, optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 24);\n    return offset ? this.bb.__string(\n                        this.bb.__vector(this.bb_pos + offset) + index * 4,\n                        optionalEncoding) :\n                    null;\n  }\n  documentationLength() {\n    const offset = this.bb.__offset(this.bb_pos, 24);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  optional() {\n    const offset = this.bb.__offset(this.bb_pos, 26);\n    return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false;\n  }\n  mutate_optional(value) {\n    const offset = this.bb.__offset(this.bb_pos, 26);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n  /**\n   * Number of padding octets to always add after this field. Structs only.\n   */\n  padding() {\n    const offset = this.bb.__offset(this.bb_pos, 28);\n    return offset ? this.bb.readUint16(this.bb_pos + offset) : 0;\n  }\n  mutate_padding(value) {\n    const offset = this.bb.__offset(this.bb_pos, 28);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint16(this.bb_pos + offset, value);\n    return true;\n  }\n  /**\n   * If the field uses 64-bit offsets.\n   */\n  offset64() {\n    const offset = this.bb.__offset(this.bb_pos, 30);\n    return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false;\n  }\n  mutate_offset64(value) {\n    const offset = this.bb.__offset(this.bb_pos, 30);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return 'reflection.Field';\n  }\n  static startField(builder) {\n    builder.startObject(14);\n  }\n  static addName(builder, nameOffset) {\n    builder.addFieldOffset(0, nameOffset, 0);\n  }\n  static addType(builder, typeOffset) {\n    builder.addFieldOffset(1, typeOffset, 0);\n  }\n  static addId(builder, id) {\n    builder.addFieldInt16(2, id, 0);\n  }\n  static addOffset(builder, offset) {\n    builder.addFieldInt16(3, offset, 0);\n  }\n  static addDefaultInteger(builder, defaultInteger) {\n    builder.addFieldInt64(4, defaultInteger, BigInt('0'));\n  }\n  static addDefaultReal(builder, defaultReal) {\n    builder.addFieldFloat64(5, defaultReal, 0.0);\n  }\n  static addDeprecated(builder, deprecated) {\n    builder.addFieldInt8(6, +deprecated, +false);\n  }\n  static addRequired(builder, required) {\n    builder.addFieldInt8(7, +required, +false);\n  }\n  static addKey(builder, key) {\n    builder.addFieldInt8(8, +key, +false);\n  }\n  static addAttributes(builder, attributesOffset) {\n    builder.addFieldOffset(9, attributesOffset, 0);\n  }\n  static createAttributesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startAttributesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addDocumentation(builder, documentationOffset) {\n    builder.addFieldOffset(10, documentationOffset, 0);\n  }\n  static createDocumentationVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startDocumentationVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addOptional(builder, optional) {\n    builder.addFieldInt8(11, +optional, +false);\n  }\n  static addPadding(builder, padding) {\n    builder.addFieldInt16(12, padding, 0);\n  }\n  static addOffset64(builder, offset64) {\n    builder.addFieldInt8(13, +offset64, +false);\n  }\n  static endField(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4);  // name\n    builder.requiredField(offset, 6);  // type\n    return offset;\n  }\n  unpack() {\n    return new FieldT(\n        this.name(), (this.type() !== null ? this.type().unpack() : null),\n        this.id(), this.offset(), this.defaultInteger(), this.defaultReal(),\n        this.deprecated(), this.required(), this.key(),\n        this.bb.createObjList(\n            this.attributes.bind(this), this.attributesLength()),\n        this.bb.createScalarList(\n            this.documentation.bind(this), this.documentationLength()),\n        this.optional(), this.padding(), this.offset64());\n  }\n  unpackTo(_o) {\n    _o.name = this.name();\n    _o.type = (this.type() !== null ? this.type().unpack() : null);\n    _o.id = this.id();\n    _o.offset = this.offset();\n    _o.defaultInteger = this.defaultInteger();\n    _o.defaultReal = this.defaultReal();\n    _o.deprecated = this.deprecated();\n    _o.required = this.required();\n    _o.key = this.key();\n    _o.attributes = this.bb.createObjList(\n        this.attributes.bind(this), this.attributesLength());\n    _o.documentation = this.bb.createScalarList(\n        this.documentation.bind(this), this.documentationLength());\n    _o.optional = this.optional();\n    _o.padding = this.padding();\n    _o.offset64 = this.offset64();\n  }\n}\nexport class FieldT {\n  constructor(\n      name = null, type = null, id = 0, offset = 0,\n      defaultInteger = BigInt('0'), defaultReal = 0.0, deprecated = false,\n      required = false, key = false, attributes = [], documentation = [],\n      optional = false, padding = 0, offset64 = false) {\n    this.name = name;\n    this.type = type;\n    this.id = id;\n    this.offset = offset;\n    this.defaultInteger = defaultInteger;\n    this.defaultReal = defaultReal;\n    this.deprecated = deprecated;\n    this.required = required;\n    this.key = key;\n    this.attributes = attributes;\n    this.documentation = documentation;\n    this.optional = optional;\n    this.padding = padding;\n    this.offset64 = offset64;\n  }\n  pack(builder) {\n    const name = (this.name !== null ? builder.createString(this.name) : 0);\n    const type = (this.type !== null ? this.type.pack(builder) : 0);\n    const attributes = Field.createAttributesVector(\n        builder, builder.createObjectOffsetList(this.attributes));\n    const documentation = Field.createDocumentationVector(\n        builder, builder.createObjectOffsetList(this.documentation));\n    Field.startField(builder);\n    Field.addName(builder, name);\n    Field.addType(builder, type);\n    Field.addId(builder, this.id);\n    Field.addOffset(builder, this.offset);\n    Field.addDefaultInteger(builder, this.defaultInteger);\n    Field.addDefaultReal(builder, this.defaultReal);\n    Field.addDeprecated(builder, this.deprecated);\n    Field.addRequired(builder, this.required);\n    Field.addKey(builder, this.key);\n    Field.addAttributes(builder, attributes);\n    Field.addDocumentation(builder, documentation);\n    Field.addOptional(builder, this.optional);\n    Field.addPadding(builder, this.padding);\n    Field.addOffset64(builder, this.offset64);\n    return Field.endField(builder);\n  }\n}\n"
  },
  {
    "path": "tests/ts/reflection/field.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport {KeyValue, KeyValueT} from '../reflection/key-value.js';\nimport {Type, TypeT} from '../reflection/type.js';\n\nexport class Field implements flatbuffers.IUnpackableObject<FieldT> {\n  bb: flatbuffers.ByteBuffer | null = null;\n  bb_pos = 0;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Field {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n\n  static getRootAsField(bb: flatbuffers.ByteBuffer, obj?: Field): Field {\n    return (obj || new Field()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  static getSizePrefixedRootAsField(\n    bb: flatbuffers.ByteBuffer,\n    obj?: Field,\n  ): Field {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new Field()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  name(): string | null;\n  name(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  name(optionalEncoding?: any): string | Uint8Array | null {\n    const offset = this.bb!.__offset(this.bb_pos, 4);\n    return offset\n      ? this.bb!.__string(this.bb_pos + offset, optionalEncoding)\n      : null;\n  }\n\n  type(obj?: Type): Type | null {\n    const offset = this.bb!.__offset(this.bb_pos, 6);\n    return offset\n      ? (obj || new Type()).__init(\n          this.bb!.__indirect(this.bb_pos + offset),\n          this.bb!,\n        )\n      : null;\n  }\n\n  id(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 8);\n    return offset ? this.bb!.readUint16(this.bb_pos + offset) : 0;\n  }\n\n  mutate_id(value: number): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 8);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeUint16(this.bb_pos + offset, value);\n    return true;\n  }\n\n  offset(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 10);\n    return offset ? this.bb!.readUint16(this.bb_pos + offset) : 0;\n  }\n\n  mutate_offset(value: number): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 10);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeUint16(this.bb_pos + offset, value);\n    return true;\n  }\n\n  defaultInteger(): bigint {\n    const offset = this.bb!.__offset(this.bb_pos, 12);\n    return offset ? this.bb!.readInt64(this.bb_pos + offset) : BigInt('0');\n  }\n\n  mutate_default_integer(value: bigint): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 12);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeInt64(this.bb_pos + offset, value);\n    return true;\n  }\n\n  defaultReal(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 14);\n    return offset ? this.bb!.readFloat64(this.bb_pos + offset) : 0.0;\n  }\n\n  mutate_default_real(value: number): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 14);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeFloat64(this.bb_pos + offset, value);\n    return true;\n  }\n\n  deprecated(): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 16);\n    return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false;\n  }\n\n  mutate_deprecated(value: boolean): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 16);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n\n  required(): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 18);\n    return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false;\n  }\n\n  mutate_required(value: boolean): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 18);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n\n  key(): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 20);\n    return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false;\n  }\n\n  mutate_key(value: boolean): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 20);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n\n  attributes(index: number, obj?: KeyValue): KeyValue | null {\n    const offset = this.bb!.__offset(this.bb_pos, 22);\n    return offset\n      ? (obj || new KeyValue()).__init(\n          this.bb!.__indirect(\n            this.bb!.__vector(this.bb_pos + offset) + index * 4,\n          ),\n          this.bb!,\n        )\n      : null;\n  }\n\n  attributesLength(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 22);\n    return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n  }\n\n  documentation(index: number): string;\n  documentation(\n    index: number,\n    optionalEncoding: flatbuffers.Encoding,\n  ): string | Uint8Array;\n  documentation(\n    index: number,\n    optionalEncoding?: any,\n  ): string | Uint8Array | null {\n    const offset = this.bb!.__offset(this.bb_pos, 24);\n    return offset\n      ? this.bb!.__string(\n          this.bb!.__vector(this.bb_pos + offset) + index * 4,\n          optionalEncoding,\n        )\n      : null;\n  }\n\n  documentationLength(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 24);\n    return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n  }\n\n  optional(): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 26);\n    return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false;\n  }\n\n  mutate_optional(value: boolean): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 26);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n\n  /**\n   * Number of padding octets to always add after this field. Structs only.\n   */\n  padding(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 28);\n    return offset ? this.bb!.readUint16(this.bb_pos + offset) : 0;\n  }\n\n  mutate_padding(value: number): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 28);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeUint16(this.bb_pos + offset, value);\n    return true;\n  }\n\n  /**\n   * If the field uses 64-bit offsets.\n   */\n  offset64(): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 30);\n    return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false;\n  }\n\n  mutate_offset64(value: boolean): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 30);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n\n  static getFullyQualifiedName(): string {\n    return 'reflection.Field';\n  }\n\n  static startField(builder: flatbuffers.Builder) {\n    builder.startObject(14);\n  }\n\n  static addName(builder: flatbuffers.Builder, nameOffset: flatbuffers.Offset) {\n    builder.addFieldOffset(0, nameOffset, 0);\n  }\n\n  static addType(builder: flatbuffers.Builder, typeOffset: flatbuffers.Offset) {\n    builder.addFieldOffset(1, typeOffset, 0);\n  }\n\n  static addId(builder: flatbuffers.Builder, id: number) {\n    builder.addFieldInt16(2, id, 0);\n  }\n\n  static addOffset(builder: flatbuffers.Builder, offset: number) {\n    builder.addFieldInt16(3, offset, 0);\n  }\n\n  static addDefaultInteger(\n    builder: flatbuffers.Builder,\n    defaultInteger: bigint,\n  ) {\n    builder.addFieldInt64(4, defaultInteger, BigInt('0'));\n  }\n\n  static addDefaultReal(builder: flatbuffers.Builder, defaultReal: number) {\n    builder.addFieldFloat64(5, defaultReal, 0.0);\n  }\n\n  static addDeprecated(builder: flatbuffers.Builder, deprecated: boolean) {\n    builder.addFieldInt8(6, +deprecated, +false);\n  }\n\n  static addRequired(builder: flatbuffers.Builder, required: boolean) {\n    builder.addFieldInt8(7, +required, +false);\n  }\n\n  static addKey(builder: flatbuffers.Builder, key: boolean) {\n    builder.addFieldInt8(8, +key, +false);\n  }\n\n  static addAttributes(\n    builder: flatbuffers.Builder,\n    attributesOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(9, attributesOffset, 0);\n  }\n\n  static createAttributesVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]!);\n    }\n    return builder.endVector();\n  }\n\n  static startAttributesVector(builder: flatbuffers.Builder, numElems: number) {\n    builder.startVector(4, numElems, 4);\n  }\n\n  static addDocumentation(\n    builder: flatbuffers.Builder,\n    documentationOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(10, documentationOffset, 0);\n  }\n\n  static createDocumentationVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]!);\n    }\n    return builder.endVector();\n  }\n\n  static startDocumentationVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ) {\n    builder.startVector(4, numElems, 4);\n  }\n\n  static addOptional(builder: flatbuffers.Builder, optional: boolean) {\n    builder.addFieldInt8(11, +optional, +false);\n  }\n\n  static addPadding(builder: flatbuffers.Builder, padding: number) {\n    builder.addFieldInt16(12, padding, 0);\n  }\n\n  static addOffset64(builder: flatbuffers.Builder, offset64: boolean) {\n    builder.addFieldInt8(13, +offset64, +false);\n  }\n\n  static endField(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4); // name\n    builder.requiredField(offset, 6); // type\n    return offset;\n  }\n\n  unpack(): FieldT {\n    return new FieldT(\n      this.name(),\n      this.type() !== null ? this.type()!.unpack() : null,\n      this.id(),\n      this.offset(),\n      this.defaultInteger(),\n      this.defaultReal(),\n      this.deprecated(),\n      this.required(),\n      this.key(),\n      this.bb!.createObjList<KeyValue, KeyValueT>(\n        this.attributes.bind(this),\n        this.attributesLength(),\n      ),\n      this.bb!.createScalarList<string>(\n        this.documentation.bind(this),\n        this.documentationLength(),\n      ),\n      this.optional(),\n      this.padding(),\n      this.offset64(),\n    );\n  }\n\n  unpackTo(_o: FieldT): void {\n    _o.name = this.name();\n    _o.type = this.type() !== null ? this.type()!.unpack() : null;\n    _o.id = this.id();\n    _o.offset = this.offset();\n    _o.defaultInteger = this.defaultInteger();\n    _o.defaultReal = this.defaultReal();\n    _o.deprecated = this.deprecated();\n    _o.required = this.required();\n    _o.key = this.key();\n    _o.attributes = this.bb!.createObjList<KeyValue, KeyValueT>(\n      this.attributes.bind(this),\n      this.attributesLength(),\n    );\n    _o.documentation = this.bb!.createScalarList<string>(\n      this.documentation.bind(this),\n      this.documentationLength(),\n    );\n    _o.optional = this.optional();\n    _o.padding = this.padding();\n    _o.offset64 = this.offset64();\n  }\n}\n\nexport class FieldT implements flatbuffers.IGeneratedObject {\n  constructor(\n    public name: string | Uint8Array | null = null,\n    public type: TypeT | null = null,\n    public id: number = 0,\n    public offset: number = 0,\n    public defaultInteger: bigint = BigInt('0'),\n    public defaultReal: number = 0.0,\n    public deprecated: boolean = false,\n    public required: boolean = false,\n    public key: boolean = false,\n    public attributes: KeyValueT[] = [],\n    public documentation: string[] = [],\n    public optional: boolean = false,\n    public padding: number = 0,\n    public offset64: boolean = false,\n  ) {}\n\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const name = this.name !== null ? builder.createString(this.name!) : 0;\n    const type = this.type !== null ? this.type!.pack(builder) : 0;\n    const attributes = Field.createAttributesVector(\n      builder,\n      builder.createObjectOffsetList(this.attributes),\n    );\n    const documentation = Field.createDocumentationVector(\n      builder,\n      builder.createObjectOffsetList(this.documentation),\n    );\n\n    Field.startField(builder);\n    Field.addName(builder, name);\n    Field.addType(builder, type);\n    Field.addId(builder, this.id);\n    Field.addOffset(builder, this.offset);\n    Field.addDefaultInteger(builder, this.defaultInteger);\n    Field.addDefaultReal(builder, this.defaultReal);\n    Field.addDeprecated(builder, this.deprecated);\n    Field.addRequired(builder, this.required);\n    Field.addKey(builder, this.key);\n    Field.addAttributes(builder, attributes);\n    Field.addDocumentation(builder, documentation);\n    Field.addOptional(builder, this.optional);\n    Field.addPadding(builder, this.padding);\n    Field.addOffset64(builder, this.offset64);\n\n    return Field.endField(builder);\n  }\n}\n"
  },
  {
    "path": "tests/ts/reflection/key-value.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nexport declare class KeyValue\n  implements flatbuffers.IUnpackableObject<KeyValueT>\n{\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): KeyValue;\n  static getRootAsKeyValue(\n    bb: flatbuffers.ByteBuffer,\n    obj?: KeyValue,\n  ): KeyValue;\n  static getSizePrefixedRootAsKeyValue(\n    bb: flatbuffers.ByteBuffer,\n    obj?: KeyValue,\n  ): KeyValue;\n  key(): string | null;\n  key(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  value(): string | null;\n  value(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  static getFullyQualifiedName(): string;\n  static startKeyValue(builder: flatbuffers.Builder): void;\n  static addKey(\n    builder: flatbuffers.Builder,\n    keyOffset: flatbuffers.Offset,\n  ): void;\n  static addValue(\n    builder: flatbuffers.Builder,\n    valueOffset: flatbuffers.Offset,\n  ): void;\n  static endKeyValue(builder: flatbuffers.Builder): flatbuffers.Offset;\n  static createKeyValue(\n    builder: flatbuffers.Builder,\n    keyOffset: flatbuffers.Offset,\n    valueOffset: flatbuffers.Offset,\n  ): flatbuffers.Offset;\n  unpack(): KeyValueT;\n  unpackTo(_o: KeyValueT): void;\n}\nexport declare class KeyValueT implements flatbuffers.IGeneratedObject {\n  key: string | Uint8Array | null;\n  value: string | Uint8Array | null;\n  constructor(\n    key?: string | Uint8Array | null,\n    value?: string | Uint8Array | null,\n  );\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/reflection/key-value.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\nexport class KeyValue {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsKeyValue(bb, obj) {\n    return (obj || new KeyValue())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsKeyValue(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new KeyValue())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  key(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) :\n                    null;\n  }\n  value(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) :\n                    null;\n  }\n  static getFullyQualifiedName() {\n    return 'reflection.KeyValue';\n  }\n  static startKeyValue(builder) {\n    builder.startObject(2);\n  }\n  static addKey(builder, keyOffset) {\n    builder.addFieldOffset(0, keyOffset, 0);\n  }\n  static addValue(builder, valueOffset) {\n    builder.addFieldOffset(1, valueOffset, 0);\n  }\n  static endKeyValue(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4);  // key\n    return offset;\n  }\n  static createKeyValue(builder, keyOffset, valueOffset) {\n    KeyValue.startKeyValue(builder);\n    KeyValue.addKey(builder, keyOffset);\n    KeyValue.addValue(builder, valueOffset);\n    return KeyValue.endKeyValue(builder);\n  }\n  unpack() {\n    return new KeyValueT(this.key(), this.value());\n  }\n  unpackTo(_o) {\n    _o.key = this.key();\n    _o.value = this.value();\n  }\n}\nexport class KeyValueT {\n  constructor(key = null, value = null) {\n    this.key = key;\n    this.value = value;\n  }\n  pack(builder) {\n    const key = (this.key !== null ? builder.createString(this.key) : 0);\n    const value = (this.value !== null ? builder.createString(this.value) : 0);\n    return KeyValue.createKeyValue(builder, key, value);\n  }\n}\n"
  },
  {
    "path": "tests/ts/reflection/key-value.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nexport class KeyValue implements flatbuffers.IUnpackableObject<KeyValueT> {\n  bb: flatbuffers.ByteBuffer | null = null;\n  bb_pos = 0;\n  __init(i: number, bb: flatbuffers.ByteBuffer): KeyValue {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n\n  static getRootAsKeyValue(\n    bb: flatbuffers.ByteBuffer,\n    obj?: KeyValue,\n  ): KeyValue {\n    return (obj || new KeyValue()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  static getSizePrefixedRootAsKeyValue(\n    bb: flatbuffers.ByteBuffer,\n    obj?: KeyValue,\n  ): KeyValue {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new KeyValue()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  key(): string | null;\n  key(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  key(optionalEncoding?: any): string | Uint8Array | null {\n    const offset = this.bb!.__offset(this.bb_pos, 4);\n    return offset\n      ? this.bb!.__string(this.bb_pos + offset, optionalEncoding)\n      : null;\n  }\n\n  value(): string | null;\n  value(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  value(optionalEncoding?: any): string | Uint8Array | null {\n    const offset = this.bb!.__offset(this.bb_pos, 6);\n    return offset\n      ? this.bb!.__string(this.bb_pos + offset, optionalEncoding)\n      : null;\n  }\n\n  static getFullyQualifiedName(): string {\n    return 'reflection.KeyValue';\n  }\n\n  static startKeyValue(builder: flatbuffers.Builder) {\n    builder.startObject(2);\n  }\n\n  static addKey(builder: flatbuffers.Builder, keyOffset: flatbuffers.Offset) {\n    builder.addFieldOffset(0, keyOffset, 0);\n  }\n\n  static addValue(\n    builder: flatbuffers.Builder,\n    valueOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(1, valueOffset, 0);\n  }\n\n  static endKeyValue(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4); // key\n    return offset;\n  }\n\n  static createKeyValue(\n    builder: flatbuffers.Builder,\n    keyOffset: flatbuffers.Offset,\n    valueOffset: flatbuffers.Offset,\n  ): flatbuffers.Offset {\n    KeyValue.startKeyValue(builder);\n    KeyValue.addKey(builder, keyOffset);\n    KeyValue.addValue(builder, valueOffset);\n    return KeyValue.endKeyValue(builder);\n  }\n\n  unpack(): KeyValueT {\n    return new KeyValueT(this.key(), this.value());\n  }\n\n  unpackTo(_o: KeyValueT): void {\n    _o.key = this.key();\n    _o.value = this.value();\n  }\n}\n\nexport class KeyValueT implements flatbuffers.IGeneratedObject {\n  constructor(\n    public key: string | Uint8Array | null = null,\n    public value: string | Uint8Array | null = null,\n  ) {}\n\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const key = this.key !== null ? builder.createString(this.key!) : 0;\n    const value = this.value !== null ? builder.createString(this.value!) : 0;\n\n    return KeyValue.createKeyValue(builder, key, value);\n  }\n}\n"
  },
  {
    "path": "tests/ts/reflection/object.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nimport {Field, FieldT} from '../reflection/field.js';\nimport {KeyValue, KeyValueT} from '../reflection/key-value.js';\nexport declare class Object_\n  implements flatbuffers.IUnpackableObject<Object_T>\n{\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Object_;\n  static getRootAsObject(bb: flatbuffers.ByteBuffer, obj?: Object_): Object_;\n  static getSizePrefixedRootAsObject(\n    bb: flatbuffers.ByteBuffer,\n    obj?: Object_,\n  ): Object_;\n  name(): string | null;\n  name(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  fields(index: number, obj?: Field): Field | null;\n  fieldsLength(): number;\n  isStruct(): boolean;\n  mutate_is_struct(value: boolean): boolean;\n  minalign(): number;\n  mutate_minalign(value: number): boolean;\n  bytesize(): number;\n  mutate_bytesize(value: number): boolean;\n  attributes(index: number, obj?: KeyValue): KeyValue | null;\n  attributesLength(): number;\n  documentation(index: number): string;\n  documentation(\n    index: number,\n    optionalEncoding: flatbuffers.Encoding,\n  ): string | Uint8Array;\n  documentationLength(): number;\n  /**\n   * File that this Object is declared in.\n   */\n  declarationFile(): string | null;\n  declarationFile(\n    optionalEncoding: flatbuffers.Encoding,\n  ): string | Uint8Array | null;\n  static getFullyQualifiedName(): string;\n  static startObject(builder: flatbuffers.Builder): void;\n  static addName(\n    builder: flatbuffers.Builder,\n    nameOffset: flatbuffers.Offset,\n  ): void;\n  static addFields(\n    builder: flatbuffers.Builder,\n    fieldsOffset: flatbuffers.Offset,\n  ): void;\n  static createFieldsVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset;\n  static startFieldsVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addIsStruct(builder: flatbuffers.Builder, isStruct: boolean): void;\n  static addMinalign(builder: flatbuffers.Builder, minalign: number): void;\n  static addBytesize(builder: flatbuffers.Builder, bytesize: number): void;\n  static addAttributes(\n    builder: flatbuffers.Builder,\n    attributesOffset: flatbuffers.Offset,\n  ): void;\n  static createAttributesVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset;\n  static startAttributesVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addDocumentation(\n    builder: flatbuffers.Builder,\n    documentationOffset: flatbuffers.Offset,\n  ): void;\n  static createDocumentationVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset;\n  static startDocumentationVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addDeclarationFile(\n    builder: flatbuffers.Builder,\n    declarationFileOffset: flatbuffers.Offset,\n  ): void;\n  static endObject(builder: flatbuffers.Builder): flatbuffers.Offset;\n  static createObject(\n    builder: flatbuffers.Builder,\n    nameOffset: flatbuffers.Offset,\n    fieldsOffset: flatbuffers.Offset,\n    isStruct: boolean,\n    minalign: number,\n    bytesize: number,\n    attributesOffset: flatbuffers.Offset,\n    documentationOffset: flatbuffers.Offset,\n    declarationFileOffset: flatbuffers.Offset,\n  ): flatbuffers.Offset;\n  unpack(): Object_T;\n  unpackTo(_o: Object_T): void;\n}\nexport declare class Object_T implements flatbuffers.IGeneratedObject {\n  name: string | Uint8Array | null;\n  fields: FieldT[];\n  isStruct: boolean;\n  minalign: number;\n  bytesize: number;\n  attributes: KeyValueT[];\n  documentation: string[];\n  declarationFile: string | Uint8Array | null;\n  constructor(\n    name?: string | Uint8Array | null,\n    fields?: FieldT[],\n    isStruct?: boolean,\n    minalign?: number,\n    bytesize?: number,\n    attributes?: KeyValueT[],\n    documentation?: string[],\n    declarationFile?: string | Uint8Array | null,\n  );\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/reflection/object.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\n\nimport {Field} from '../reflection/field.js';\nimport {KeyValue} from '../reflection/key-value.js';\n\nexport class Object_ {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsObject(bb, obj) {\n    return (obj || new Object_())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsObject(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new Object_())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  name(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) :\n                    null;\n  }\n  fields(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ?\n        (obj || new Field())\n            .__init(\n                this.bb.__indirect(\n                    this.bb.__vector(this.bb_pos + offset) + index * 4),\n                this.bb) :\n        null;\n  }\n  fieldsLength() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  isStruct() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false;\n  }\n  mutate_is_struct(value) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n  minalign() {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n  }\n  mutate_minalign(value) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  bytesize() {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n  }\n  mutate_bytesize(value) {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  attributes(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ?\n        (obj || new KeyValue())\n            .__init(\n                this.bb.__indirect(\n                    this.bb.__vector(this.bb_pos + offset) + index * 4),\n                this.bb) :\n        null;\n  }\n  attributesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  documentation(index, optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    return offset ? this.bb.__string(\n                        this.bb.__vector(this.bb_pos + offset) + index * 4,\n                        optionalEncoding) :\n                    null;\n  }\n  documentationLength() {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  declarationFile(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 18);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) :\n                    null;\n  }\n  static getFullyQualifiedName() {\n    return 'reflection.Object';\n  }\n  static startObject(builder) {\n    builder.startObject(8);\n  }\n  static addName(builder, nameOffset) {\n    builder.addFieldOffset(0, nameOffset, 0);\n  }\n  static addFields(builder, fieldsOffset) {\n    builder.addFieldOffset(1, fieldsOffset, 0);\n  }\n  static createFieldsVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startFieldsVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addIsStruct(builder, isStruct) {\n    builder.addFieldInt8(2, +isStruct, +false);\n  }\n  static addMinalign(builder, minalign) {\n    builder.addFieldInt32(3, minalign, 0);\n  }\n  static addBytesize(builder, bytesize) {\n    builder.addFieldInt32(4, bytesize, 0);\n  }\n  static addAttributes(builder, attributesOffset) {\n    builder.addFieldOffset(5, attributesOffset, 0);\n  }\n  static createAttributesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startAttributesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addDocumentation(builder, documentationOffset) {\n    builder.addFieldOffset(6, documentationOffset, 0);\n  }\n  static createDocumentationVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startDocumentationVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addDeclarationFile(builder, declarationFileOffset) {\n    builder.addFieldOffset(7, declarationFileOffset, 0);\n  }\n  static endObject(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4);  // name\n    builder.requiredField(offset, 6);  // fields\n    return offset;\n  }\n  static createObject(\n      builder, nameOffset, fieldsOffset, isStruct, minalign, bytesize,\n      attributesOffset, documentationOffset, declarationFileOffset) {\n    Object_.startObject(builder);\n    Object_.addName(builder, nameOffset);\n    Object_.addFields(builder, fieldsOffset);\n    Object_.addIsStruct(builder, isStruct);\n    Object_.addMinalign(builder, minalign);\n    Object_.addBytesize(builder, bytesize);\n    Object_.addAttributes(builder, attributesOffset);\n    Object_.addDocumentation(builder, documentationOffset);\n    Object_.addDeclarationFile(builder, declarationFileOffset);\n    return Object_.endObject(builder);\n  }\n  unpack() {\n    return new Object_T(\n        this.name(),\n        this.bb.createObjList(this.fields.bind(this), this.fieldsLength()),\n        this.isStruct(), this.minalign(), this.bytesize(),\n        this.bb.createObjList(\n            this.attributes.bind(this), this.attributesLength()),\n        this.bb.createScalarList(\n            this.documentation.bind(this), this.documentationLength()),\n        this.declarationFile());\n  }\n  unpackTo(_o) {\n    _o.name = this.name();\n    _o.fields =\n        this.bb.createObjList(this.fields.bind(this), this.fieldsLength());\n    _o.isStruct = this.isStruct();\n    _o.minalign = this.minalign();\n    _o.bytesize = this.bytesize();\n    _o.attributes = this.bb.createObjList(\n        this.attributes.bind(this), this.attributesLength());\n    _o.documentation = this.bb.createScalarList(\n        this.documentation.bind(this), this.documentationLength());\n    _o.declarationFile = this.declarationFile();\n  }\n}\nexport class Object_T {\n  constructor(\n      name = null, fields = [], isStruct = false, minalign = 0, bytesize = 0,\n      attributes = [], documentation = [], declarationFile = null) {\n    this.name = name;\n    this.fields = fields;\n    this.isStruct = isStruct;\n    this.minalign = minalign;\n    this.bytesize = bytesize;\n    this.attributes = attributes;\n    this.documentation = documentation;\n    this.declarationFile = declarationFile;\n  }\n  pack(builder) {\n    const name = (this.name !== null ? builder.createString(this.name) : 0);\n    const fields = Object_.createFieldsVector(\n        builder, builder.createObjectOffsetList(this.fields));\n    const attributes = Object_.createAttributesVector(\n        builder, builder.createObjectOffsetList(this.attributes));\n    const documentation = Object_.createDocumentationVector(\n        builder, builder.createObjectOffsetList(this.documentation));\n    const declarationFile =\n        (this.declarationFile !== null ?\n             builder.createString(this.declarationFile) :\n             0);\n    return Object_.createObject(\n        builder, name, fields, this.isStruct, this.minalign, this.bytesize,\n        attributes, documentation, declarationFile);\n  }\n}\n"
  },
  {
    "path": "tests/ts/reflection/object.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport {Field, FieldT} from '../reflection/field.js';\nimport {KeyValue, KeyValueT} from '../reflection/key-value.js';\n\nexport class Object_ implements flatbuffers.IUnpackableObject<Object_T> {\n  bb: flatbuffers.ByteBuffer | null = null;\n  bb_pos = 0;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Object_ {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n\n  static getRootAsObject(bb: flatbuffers.ByteBuffer, obj?: Object_): Object_ {\n    return (obj || new Object_()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  static getSizePrefixedRootAsObject(\n    bb: flatbuffers.ByteBuffer,\n    obj?: Object_,\n  ): Object_ {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new Object_()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  name(): string | null;\n  name(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  name(optionalEncoding?: any): string | Uint8Array | null {\n    const offset = this.bb!.__offset(this.bb_pos, 4);\n    return offset\n      ? this.bb!.__string(this.bb_pos + offset, optionalEncoding)\n      : null;\n  }\n\n  fields(index: number, obj?: Field): Field | null {\n    const offset = this.bb!.__offset(this.bb_pos, 6);\n    return offset\n      ? (obj || new Field()).__init(\n          this.bb!.__indirect(\n            this.bb!.__vector(this.bb_pos + offset) + index * 4,\n          ),\n          this.bb!,\n        )\n      : null;\n  }\n\n  fieldsLength(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 6);\n    return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n  }\n\n  isStruct(): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 8);\n    return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false;\n  }\n\n  mutate_is_struct(value: boolean): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 8);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n\n  minalign(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 10);\n    return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;\n  }\n\n  mutate_minalign(value: number): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 10);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n\n  bytesize(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 12);\n    return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;\n  }\n\n  mutate_bytesize(value: number): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 12);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n\n  attributes(index: number, obj?: KeyValue): KeyValue | null {\n    const offset = this.bb!.__offset(this.bb_pos, 14);\n    return offset\n      ? (obj || new KeyValue()).__init(\n          this.bb!.__indirect(\n            this.bb!.__vector(this.bb_pos + offset) + index * 4,\n          ),\n          this.bb!,\n        )\n      : null;\n  }\n\n  attributesLength(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 14);\n    return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n  }\n\n  documentation(index: number): string;\n  documentation(\n    index: number,\n    optionalEncoding: flatbuffers.Encoding,\n  ): string | Uint8Array;\n  documentation(\n    index: number,\n    optionalEncoding?: any,\n  ): string | Uint8Array | null {\n    const offset = this.bb!.__offset(this.bb_pos, 16);\n    return offset\n      ? this.bb!.__string(\n          this.bb!.__vector(this.bb_pos + offset) + index * 4,\n          optionalEncoding,\n        )\n      : null;\n  }\n\n  documentationLength(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 16);\n    return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n  }\n\n  /**\n   * File that this Object is declared in.\n   */\n  declarationFile(): string | null;\n  declarationFile(\n    optionalEncoding: flatbuffers.Encoding,\n  ): string | Uint8Array | null;\n  declarationFile(optionalEncoding?: any): string | Uint8Array | null {\n    const offset = this.bb!.__offset(this.bb_pos, 18);\n    return offset\n      ? this.bb!.__string(this.bb_pos + offset, optionalEncoding)\n      : null;\n  }\n\n  static getFullyQualifiedName(): string {\n    return 'reflection.Object';\n  }\n\n  static startObject(builder: flatbuffers.Builder) {\n    builder.startObject(8);\n  }\n\n  static addName(builder: flatbuffers.Builder, nameOffset: flatbuffers.Offset) {\n    builder.addFieldOffset(0, nameOffset, 0);\n  }\n\n  static addFields(\n    builder: flatbuffers.Builder,\n    fieldsOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(1, fieldsOffset, 0);\n  }\n\n  static createFieldsVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]!);\n    }\n    return builder.endVector();\n  }\n\n  static startFieldsVector(builder: flatbuffers.Builder, numElems: number) {\n    builder.startVector(4, numElems, 4);\n  }\n\n  static addIsStruct(builder: flatbuffers.Builder, isStruct: boolean) {\n    builder.addFieldInt8(2, +isStruct, +false);\n  }\n\n  static addMinalign(builder: flatbuffers.Builder, minalign: number) {\n    builder.addFieldInt32(3, minalign, 0);\n  }\n\n  static addBytesize(builder: flatbuffers.Builder, bytesize: number) {\n    builder.addFieldInt32(4, bytesize, 0);\n  }\n\n  static addAttributes(\n    builder: flatbuffers.Builder,\n    attributesOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(5, attributesOffset, 0);\n  }\n\n  static createAttributesVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]!);\n    }\n    return builder.endVector();\n  }\n\n  static startAttributesVector(builder: flatbuffers.Builder, numElems: number) {\n    builder.startVector(4, numElems, 4);\n  }\n\n  static addDocumentation(\n    builder: flatbuffers.Builder,\n    documentationOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(6, documentationOffset, 0);\n  }\n\n  static createDocumentationVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]!);\n    }\n    return builder.endVector();\n  }\n\n  static startDocumentationVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ) {\n    builder.startVector(4, numElems, 4);\n  }\n\n  static addDeclarationFile(\n    builder: flatbuffers.Builder,\n    declarationFileOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(7, declarationFileOffset, 0);\n  }\n\n  static endObject(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4); // name\n    builder.requiredField(offset, 6); // fields\n    return offset;\n  }\n\n  static createObject(\n    builder: flatbuffers.Builder,\n    nameOffset: flatbuffers.Offset,\n    fieldsOffset: flatbuffers.Offset,\n    isStruct: boolean,\n    minalign: number,\n    bytesize: number,\n    attributesOffset: flatbuffers.Offset,\n    documentationOffset: flatbuffers.Offset,\n    declarationFileOffset: flatbuffers.Offset,\n  ): flatbuffers.Offset {\n    Object_.startObject(builder);\n    Object_.addName(builder, nameOffset);\n    Object_.addFields(builder, fieldsOffset);\n    Object_.addIsStruct(builder, isStruct);\n    Object_.addMinalign(builder, minalign);\n    Object_.addBytesize(builder, bytesize);\n    Object_.addAttributes(builder, attributesOffset);\n    Object_.addDocumentation(builder, documentationOffset);\n    Object_.addDeclarationFile(builder, declarationFileOffset);\n    return Object_.endObject(builder);\n  }\n\n  unpack(): Object_T {\n    return new Object_T(\n      this.name(),\n      this.bb!.createObjList<Field, FieldT>(\n        this.fields.bind(this),\n        this.fieldsLength(),\n      ),\n      this.isStruct(),\n      this.minalign(),\n      this.bytesize(),\n      this.bb!.createObjList<KeyValue, KeyValueT>(\n        this.attributes.bind(this),\n        this.attributesLength(),\n      ),\n      this.bb!.createScalarList<string>(\n        this.documentation.bind(this),\n        this.documentationLength(),\n      ),\n      this.declarationFile(),\n    );\n  }\n\n  unpackTo(_o: Object_T): void {\n    _o.name = this.name();\n    _o.fields = this.bb!.createObjList<Field, FieldT>(\n      this.fields.bind(this),\n      this.fieldsLength(),\n    );\n    _o.isStruct = this.isStruct();\n    _o.minalign = this.minalign();\n    _o.bytesize = this.bytesize();\n    _o.attributes = this.bb!.createObjList<KeyValue, KeyValueT>(\n      this.attributes.bind(this),\n      this.attributesLength(),\n    );\n    _o.documentation = this.bb!.createScalarList<string>(\n      this.documentation.bind(this),\n      this.documentationLength(),\n    );\n    _o.declarationFile = this.declarationFile();\n  }\n}\n\nexport class Object_T implements flatbuffers.IGeneratedObject {\n  constructor(\n    public name: string | Uint8Array | null = null,\n    public fields: FieldT[] = [],\n    public isStruct: boolean = false,\n    public minalign: number = 0,\n    public bytesize: number = 0,\n    public attributes: KeyValueT[] = [],\n    public documentation: string[] = [],\n    public declarationFile: string | Uint8Array | null = null,\n  ) {}\n\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const name = this.name !== null ? builder.createString(this.name!) : 0;\n    const fields = Object_.createFieldsVector(\n      builder,\n      builder.createObjectOffsetList(this.fields),\n    );\n    const attributes = Object_.createAttributesVector(\n      builder,\n      builder.createObjectOffsetList(this.attributes),\n    );\n    const documentation = Object_.createDocumentationVector(\n      builder,\n      builder.createObjectOffsetList(this.documentation),\n    );\n    const declarationFile =\n      this.declarationFile !== null\n        ? builder.createString(this.declarationFile!)\n        : 0;\n\n    return Object_.createObject(\n      builder,\n      name,\n      fields,\n      this.isStruct,\n      this.minalign,\n      this.bytesize,\n      attributes,\n      documentation,\n      declarationFile,\n    );\n  }\n}\n"
  },
  {
    "path": "tests/ts/reflection/rpccall.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nimport {KeyValue, KeyValueT} from '../reflection/key-value.js';\nimport {Object_, Object_T} from '../reflection/object.js';\nexport declare class RPCCall\n  implements flatbuffers.IUnpackableObject<RPCCallT>\n{\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): RPCCall;\n  static getRootAsRPCCall(bb: flatbuffers.ByteBuffer, obj?: RPCCall): RPCCall;\n  static getSizePrefixedRootAsRPCCall(\n    bb: flatbuffers.ByteBuffer,\n    obj?: RPCCall,\n  ): RPCCall;\n  name(): string | null;\n  name(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  request(obj?: Object_): Object_ | null;\n  response(obj?: Object_): Object_ | null;\n  attributes(index: number, obj?: KeyValue): KeyValue | null;\n  attributesLength(): number;\n  documentation(index: number): string;\n  documentation(\n    index: number,\n    optionalEncoding: flatbuffers.Encoding,\n  ): string | Uint8Array;\n  documentationLength(): number;\n  static getFullyQualifiedName(): string;\n  static startRPCCall(builder: flatbuffers.Builder): void;\n  static addName(\n    builder: flatbuffers.Builder,\n    nameOffset: flatbuffers.Offset,\n  ): void;\n  static addRequest(\n    builder: flatbuffers.Builder,\n    requestOffset: flatbuffers.Offset,\n  ): void;\n  static addResponse(\n    builder: flatbuffers.Builder,\n    responseOffset: flatbuffers.Offset,\n  ): void;\n  static addAttributes(\n    builder: flatbuffers.Builder,\n    attributesOffset: flatbuffers.Offset,\n  ): void;\n  static createAttributesVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset;\n  static startAttributesVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addDocumentation(\n    builder: flatbuffers.Builder,\n    documentationOffset: flatbuffers.Offset,\n  ): void;\n  static createDocumentationVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset;\n  static startDocumentationVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static endRPCCall(builder: flatbuffers.Builder): flatbuffers.Offset;\n  unpack(): RPCCallT;\n  unpackTo(_o: RPCCallT): void;\n}\nexport declare class RPCCallT implements flatbuffers.IGeneratedObject {\n  name: string | Uint8Array | null;\n  request: Object_T | null;\n  response: Object_T | null;\n  attributes: KeyValueT[];\n  documentation: string[];\n  constructor(\n    name?: string | Uint8Array | null,\n    request?: Object_T | null,\n    response?: Object_T | null,\n    attributes?: KeyValueT[],\n    documentation?: string[],\n  );\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/reflection/rpccall.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\n\nimport {KeyValue} from '../reflection/key-value.js';\nimport {Object_} from '../reflection/object.js';\n\nexport class RPCCall {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsRPCCall(bb, obj) {\n    return (obj || new RPCCall())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsRPCCall(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new RPCCall())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  name(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) :\n                    null;\n  }\n  request(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ?\n        (obj || new Object_())\n            .__init(this.bb.__indirect(this.bb_pos + offset), this.bb) :\n        null;\n  }\n  response(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ?\n        (obj || new Object_())\n            .__init(this.bb.__indirect(this.bb_pos + offset), this.bb) :\n        null;\n  }\n  attributes(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ?\n        (obj || new KeyValue())\n            .__init(\n                this.bb.__indirect(\n                    this.bb.__vector(this.bb_pos + offset) + index * 4),\n                this.bb) :\n        null;\n  }\n  attributesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  documentation(index, optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.__string(\n                        this.bb.__vector(this.bb_pos + offset) + index * 4,\n                        optionalEncoding) :\n                    null;\n  }\n  documentationLength() {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  static getFullyQualifiedName() {\n    return 'reflection.RPCCall';\n  }\n  static startRPCCall(builder) {\n    builder.startObject(5);\n  }\n  static addName(builder, nameOffset) {\n    builder.addFieldOffset(0, nameOffset, 0);\n  }\n  static addRequest(builder, requestOffset) {\n    builder.addFieldOffset(1, requestOffset, 0);\n  }\n  static addResponse(builder, responseOffset) {\n    builder.addFieldOffset(2, responseOffset, 0);\n  }\n  static addAttributes(builder, attributesOffset) {\n    builder.addFieldOffset(3, attributesOffset, 0);\n  }\n  static createAttributesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startAttributesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addDocumentation(builder, documentationOffset) {\n    builder.addFieldOffset(4, documentationOffset, 0);\n  }\n  static createDocumentationVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startDocumentationVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static endRPCCall(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4);  // name\n    builder.requiredField(offset, 6);  // request\n    builder.requiredField(offset, 8);  // response\n    return offset;\n  }\n  unpack() {\n    return new RPCCallT(\n        this.name(), (this.request() !== null ? this.request().unpack() : null),\n        (this.response() !== null ? this.response().unpack() : null),\n        this.bb.createObjList(\n            this.attributes.bind(this), this.attributesLength()),\n        this.bb.createScalarList(\n            this.documentation.bind(this), this.documentationLength()));\n  }\n  unpackTo(_o) {\n    _o.name = this.name();\n    _o.request = (this.request() !== null ? this.request().unpack() : null);\n    _o.response = (this.response() !== null ? this.response().unpack() : null);\n    _o.attributes = this.bb.createObjList(\n        this.attributes.bind(this), this.attributesLength());\n    _o.documentation = this.bb.createScalarList(\n        this.documentation.bind(this), this.documentationLength());\n  }\n}\nexport class RPCCallT {\n  constructor(\n      name = null, request = null, response = null, attributes = [],\n      documentation = []) {\n    this.name = name;\n    this.request = request;\n    this.response = response;\n    this.attributes = attributes;\n    this.documentation = documentation;\n  }\n  pack(builder) {\n    const name = (this.name !== null ? builder.createString(this.name) : 0);\n    const request = (this.request !== null ? this.request.pack(builder) : 0);\n    const response = (this.response !== null ? this.response.pack(builder) : 0);\n    const attributes = RPCCall.createAttributesVector(\n        builder, builder.createObjectOffsetList(this.attributes));\n    const documentation = RPCCall.createDocumentationVector(\n        builder, builder.createObjectOffsetList(this.documentation));\n    RPCCall.startRPCCall(builder);\n    RPCCall.addName(builder, name);\n    RPCCall.addRequest(builder, request);\n    RPCCall.addResponse(builder, response);\n    RPCCall.addAttributes(builder, attributes);\n    RPCCall.addDocumentation(builder, documentation);\n    return RPCCall.endRPCCall(builder);\n  }\n}\n"
  },
  {
    "path": "tests/ts/reflection/rpccall.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport {KeyValue, KeyValueT} from '../reflection/key-value.js';\nimport {Object_, Object_T} from '../reflection/object.js';\n\nexport class RPCCall implements flatbuffers.IUnpackableObject<RPCCallT> {\n  bb: flatbuffers.ByteBuffer | null = null;\n  bb_pos = 0;\n  __init(i: number, bb: flatbuffers.ByteBuffer): RPCCall {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n\n  static getRootAsRPCCall(bb: flatbuffers.ByteBuffer, obj?: RPCCall): RPCCall {\n    return (obj || new RPCCall()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  static getSizePrefixedRootAsRPCCall(\n    bb: flatbuffers.ByteBuffer,\n    obj?: RPCCall,\n  ): RPCCall {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new RPCCall()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  name(): string | null;\n  name(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  name(optionalEncoding?: any): string | Uint8Array | null {\n    const offset = this.bb!.__offset(this.bb_pos, 4);\n    return offset\n      ? this.bb!.__string(this.bb_pos + offset, optionalEncoding)\n      : null;\n  }\n\n  request(obj?: Object_): Object_ | null {\n    const offset = this.bb!.__offset(this.bb_pos, 6);\n    return offset\n      ? (obj || new Object_()).__init(\n          this.bb!.__indirect(this.bb_pos + offset),\n          this.bb!,\n        )\n      : null;\n  }\n\n  response(obj?: Object_): Object_ | null {\n    const offset = this.bb!.__offset(this.bb_pos, 8);\n    return offset\n      ? (obj || new Object_()).__init(\n          this.bb!.__indirect(this.bb_pos + offset),\n          this.bb!,\n        )\n      : null;\n  }\n\n  attributes(index: number, obj?: KeyValue): KeyValue | null {\n    const offset = this.bb!.__offset(this.bb_pos, 10);\n    return offset\n      ? (obj || new KeyValue()).__init(\n          this.bb!.__indirect(\n            this.bb!.__vector(this.bb_pos + offset) + index * 4,\n          ),\n          this.bb!,\n        )\n      : null;\n  }\n\n  attributesLength(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 10);\n    return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n  }\n\n  documentation(index: number): string;\n  documentation(\n    index: number,\n    optionalEncoding: flatbuffers.Encoding,\n  ): string | Uint8Array;\n  documentation(\n    index: number,\n    optionalEncoding?: any,\n  ): string | Uint8Array | null {\n    const offset = this.bb!.__offset(this.bb_pos, 12);\n    return offset\n      ? this.bb!.__string(\n          this.bb!.__vector(this.bb_pos + offset) + index * 4,\n          optionalEncoding,\n        )\n      : null;\n  }\n\n  documentationLength(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 12);\n    return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n  }\n\n  static getFullyQualifiedName(): string {\n    return 'reflection.RPCCall';\n  }\n\n  static startRPCCall(builder: flatbuffers.Builder) {\n    builder.startObject(5);\n  }\n\n  static addName(builder: flatbuffers.Builder, nameOffset: flatbuffers.Offset) {\n    builder.addFieldOffset(0, nameOffset, 0);\n  }\n\n  static addRequest(\n    builder: flatbuffers.Builder,\n    requestOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(1, requestOffset, 0);\n  }\n\n  static addResponse(\n    builder: flatbuffers.Builder,\n    responseOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(2, responseOffset, 0);\n  }\n\n  static addAttributes(\n    builder: flatbuffers.Builder,\n    attributesOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(3, attributesOffset, 0);\n  }\n\n  static createAttributesVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]!);\n    }\n    return builder.endVector();\n  }\n\n  static startAttributesVector(builder: flatbuffers.Builder, numElems: number) {\n    builder.startVector(4, numElems, 4);\n  }\n\n  static addDocumentation(\n    builder: flatbuffers.Builder,\n    documentationOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(4, documentationOffset, 0);\n  }\n\n  static createDocumentationVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]!);\n    }\n    return builder.endVector();\n  }\n\n  static startDocumentationVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ) {\n    builder.startVector(4, numElems, 4);\n  }\n\n  static endRPCCall(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4); // name\n    builder.requiredField(offset, 6); // request\n    builder.requiredField(offset, 8); // response\n    return offset;\n  }\n\n  unpack(): RPCCallT {\n    return new RPCCallT(\n      this.name(),\n      this.request() !== null ? this.request()!.unpack() : null,\n      this.response() !== null ? this.response()!.unpack() : null,\n      this.bb!.createObjList<KeyValue, KeyValueT>(\n        this.attributes.bind(this),\n        this.attributesLength(),\n      ),\n      this.bb!.createScalarList<string>(\n        this.documentation.bind(this),\n        this.documentationLength(),\n      ),\n    );\n  }\n\n  unpackTo(_o: RPCCallT): void {\n    _o.name = this.name();\n    _o.request = this.request() !== null ? this.request()!.unpack() : null;\n    _o.response = this.response() !== null ? this.response()!.unpack() : null;\n    _o.attributes = this.bb!.createObjList<KeyValue, KeyValueT>(\n      this.attributes.bind(this),\n      this.attributesLength(),\n    );\n    _o.documentation = this.bb!.createScalarList<string>(\n      this.documentation.bind(this),\n      this.documentationLength(),\n    );\n  }\n}\n\nexport class RPCCallT implements flatbuffers.IGeneratedObject {\n  constructor(\n    public name: string | Uint8Array | null = null,\n    public request: Object_T | null = null,\n    public response: Object_T | null = null,\n    public attributes: KeyValueT[] = [],\n    public documentation: string[] = [],\n  ) {}\n\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const name = this.name !== null ? builder.createString(this.name!) : 0;\n    const request = this.request !== null ? this.request!.pack(builder) : 0;\n    const response = this.response !== null ? this.response!.pack(builder) : 0;\n    const attributes = RPCCall.createAttributesVector(\n      builder,\n      builder.createObjectOffsetList(this.attributes),\n    );\n    const documentation = RPCCall.createDocumentationVector(\n      builder,\n      builder.createObjectOffsetList(this.documentation),\n    );\n\n    RPCCall.startRPCCall(builder);\n    RPCCall.addName(builder, name);\n    RPCCall.addRequest(builder, request);\n    RPCCall.addResponse(builder, response);\n    RPCCall.addAttributes(builder, attributes);\n    RPCCall.addDocumentation(builder, documentation);\n\n    return RPCCall.endRPCCall(builder);\n  }\n}\n"
  },
  {
    "path": "tests/ts/reflection/schema-file.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\n/**\n * File specific information.\n * Symbols declared within a file may be recovered by iterating over all\n * symbols and examining the `declaration_file` field.\n */\nexport declare class SchemaFile\n  implements flatbuffers.IUnpackableObject<SchemaFileT>\n{\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): SchemaFile;\n  static getRootAsSchemaFile(\n    bb: flatbuffers.ByteBuffer,\n    obj?: SchemaFile,\n  ): SchemaFile;\n  static getSizePrefixedRootAsSchemaFile(\n    bb: flatbuffers.ByteBuffer,\n    obj?: SchemaFile,\n  ): SchemaFile;\n  /**\n   * Filename, relative to project root.\n   */\n  filename(): string | null;\n  filename(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  /**\n   * Names of included files, relative to project root.\n   */\n  includedFilenames(index: number): string;\n  includedFilenames(\n    index: number,\n    optionalEncoding: flatbuffers.Encoding,\n  ): string | Uint8Array;\n  includedFilenamesLength(): number;\n  static getFullyQualifiedName(): string;\n  static startSchemaFile(builder: flatbuffers.Builder): void;\n  static addFilename(\n    builder: flatbuffers.Builder,\n    filenameOffset: flatbuffers.Offset,\n  ): void;\n  static addIncludedFilenames(\n    builder: flatbuffers.Builder,\n    includedFilenamesOffset: flatbuffers.Offset,\n  ): void;\n  static createIncludedFilenamesVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset;\n  static startIncludedFilenamesVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static endSchemaFile(builder: flatbuffers.Builder): flatbuffers.Offset;\n  static createSchemaFile(\n    builder: flatbuffers.Builder,\n    filenameOffset: flatbuffers.Offset,\n    includedFilenamesOffset: flatbuffers.Offset,\n  ): flatbuffers.Offset;\n  unpack(): SchemaFileT;\n  unpackTo(_o: SchemaFileT): void;\n}\nexport declare class SchemaFileT implements flatbuffers.IGeneratedObject {\n  filename: string | Uint8Array | null;\n  includedFilenames: string[];\n  constructor(\n    filename?: string | Uint8Array | null,\n    includedFilenames?: string[],\n  );\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/reflection/schema-file.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\n/**\n * File specific information.\n * Symbols declared within a file may be recovered by iterating over all\n * symbols and examining the `declaration_file` field.\n */\nexport class SchemaFile {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsSchemaFile(bb, obj) {\n    return (obj || new SchemaFile())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsSchemaFile(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new SchemaFile())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  filename(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) :\n                    null;\n  }\n  includedFilenames(index, optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.__string(\n                        this.bb.__vector(this.bb_pos + offset) + index * 4,\n                        optionalEncoding) :\n                    null;\n  }\n  includedFilenamesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  static getFullyQualifiedName() {\n    return 'reflection.SchemaFile';\n  }\n  static startSchemaFile(builder) {\n    builder.startObject(2);\n  }\n  static addFilename(builder, filenameOffset) {\n    builder.addFieldOffset(0, filenameOffset, 0);\n  }\n  static addIncludedFilenames(builder, includedFilenamesOffset) {\n    builder.addFieldOffset(1, includedFilenamesOffset, 0);\n  }\n  static createIncludedFilenamesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startIncludedFilenamesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static endSchemaFile(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4);  // filename\n    return offset;\n  }\n  static createSchemaFile(builder, filenameOffset, includedFilenamesOffset) {\n    SchemaFile.startSchemaFile(builder);\n    SchemaFile.addFilename(builder, filenameOffset);\n    SchemaFile.addIncludedFilenames(builder, includedFilenamesOffset);\n    return SchemaFile.endSchemaFile(builder);\n  }\n  unpack() {\n    return new SchemaFileT(\n        this.filename(),\n        this.bb.createScalarList(\n            this.includedFilenames.bind(this), this.includedFilenamesLength()));\n  }\n  unpackTo(_o) {\n    _o.filename = this.filename();\n    _o.includedFilenames = this.bb.createScalarList(\n        this.includedFilenames.bind(this), this.includedFilenamesLength());\n  }\n}\nexport class SchemaFileT {\n  constructor(filename = null, includedFilenames = []) {\n    this.filename = filename;\n    this.includedFilenames = includedFilenames;\n  }\n  pack(builder) {\n    const filename =\n        (this.filename !== null ? builder.createString(this.filename) : 0);\n    const includedFilenames = SchemaFile.createIncludedFilenamesVector(\n        builder, builder.createObjectOffsetList(this.includedFilenames));\n    return SchemaFile.createSchemaFile(builder, filename, includedFilenames);\n  }\n}\n"
  },
  {
    "path": "tests/ts/reflection/schema-file.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\n/**\n * File specific information.\n * Symbols declared within a file may be recovered by iterating over all\n * symbols and examining the `declaration_file` field.\n */\nexport class SchemaFile implements flatbuffers.IUnpackableObject<SchemaFileT> {\n  bb: flatbuffers.ByteBuffer | null = null;\n  bb_pos = 0;\n  __init(i: number, bb: flatbuffers.ByteBuffer): SchemaFile {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n\n  static getRootAsSchemaFile(\n    bb: flatbuffers.ByteBuffer,\n    obj?: SchemaFile,\n  ): SchemaFile {\n    return (obj || new SchemaFile()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  static getSizePrefixedRootAsSchemaFile(\n    bb: flatbuffers.ByteBuffer,\n    obj?: SchemaFile,\n  ): SchemaFile {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new SchemaFile()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  /**\n   * Filename, relative to project root.\n   */\n  filename(): string | null;\n  filename(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  filename(optionalEncoding?: any): string | Uint8Array | null {\n    const offset = this.bb!.__offset(this.bb_pos, 4);\n    return offset\n      ? this.bb!.__string(this.bb_pos + offset, optionalEncoding)\n      : null;\n  }\n\n  /**\n   * Names of included files, relative to project root.\n   */\n  includedFilenames(index: number): string;\n  includedFilenames(\n    index: number,\n    optionalEncoding: flatbuffers.Encoding,\n  ): string | Uint8Array;\n  includedFilenames(\n    index: number,\n    optionalEncoding?: any,\n  ): string | Uint8Array | null {\n    const offset = this.bb!.__offset(this.bb_pos, 6);\n    return offset\n      ? this.bb!.__string(\n          this.bb!.__vector(this.bb_pos + offset) + index * 4,\n          optionalEncoding,\n        )\n      : null;\n  }\n\n  includedFilenamesLength(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 6);\n    return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n  }\n\n  static getFullyQualifiedName(): string {\n    return 'reflection.SchemaFile';\n  }\n\n  static startSchemaFile(builder: flatbuffers.Builder) {\n    builder.startObject(2);\n  }\n\n  static addFilename(\n    builder: flatbuffers.Builder,\n    filenameOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(0, filenameOffset, 0);\n  }\n\n  static addIncludedFilenames(\n    builder: flatbuffers.Builder,\n    includedFilenamesOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(1, includedFilenamesOffset, 0);\n  }\n\n  static createIncludedFilenamesVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]!);\n    }\n    return builder.endVector();\n  }\n\n  static startIncludedFilenamesVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ) {\n    builder.startVector(4, numElems, 4);\n  }\n\n  static endSchemaFile(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4); // filename\n    return offset;\n  }\n\n  static createSchemaFile(\n    builder: flatbuffers.Builder,\n    filenameOffset: flatbuffers.Offset,\n    includedFilenamesOffset: flatbuffers.Offset,\n  ): flatbuffers.Offset {\n    SchemaFile.startSchemaFile(builder);\n    SchemaFile.addFilename(builder, filenameOffset);\n    SchemaFile.addIncludedFilenames(builder, includedFilenamesOffset);\n    return SchemaFile.endSchemaFile(builder);\n  }\n\n  unpack(): SchemaFileT {\n    return new SchemaFileT(\n      this.filename(),\n      this.bb!.createScalarList<string>(\n        this.includedFilenames.bind(this),\n        this.includedFilenamesLength(),\n      ),\n    );\n  }\n\n  unpackTo(_o: SchemaFileT): void {\n    _o.filename = this.filename();\n    _o.includedFilenames = this.bb!.createScalarList<string>(\n      this.includedFilenames.bind(this),\n      this.includedFilenamesLength(),\n    );\n  }\n}\n\nexport class SchemaFileT implements flatbuffers.IGeneratedObject {\n  constructor(\n    public filename: string | Uint8Array | null = null,\n    public includedFilenames: string[] = [],\n  ) {}\n\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const filename =\n      this.filename !== null ? builder.createString(this.filename!) : 0;\n    const includedFilenames = SchemaFile.createIncludedFilenamesVector(\n      builder,\n      builder.createObjectOffsetList(this.includedFilenames),\n    );\n\n    return SchemaFile.createSchemaFile(builder, filename, includedFilenames);\n  }\n}\n"
  },
  {
    "path": "tests/ts/reflection/schema.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nimport {Enum, EnumT} from '../reflection/enum.js';\nimport {Object_, Object_T} from '../reflection/object.js';\nimport {SchemaFile, SchemaFileT} from '../reflection/schema-file.js';\nimport {Service, ServiceT} from '../reflection/service.js';\nexport declare class Schema implements flatbuffers.IUnpackableObject<SchemaT> {\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Schema;\n  static getRootAsSchema(bb: flatbuffers.ByteBuffer, obj?: Schema): Schema;\n  static getSizePrefixedRootAsSchema(\n    bb: flatbuffers.ByteBuffer,\n    obj?: Schema,\n  ): Schema;\n  static bufferHasIdentifier(bb: flatbuffers.ByteBuffer): boolean;\n  objects(index: number, obj?: Object_): Object_ | null;\n  objectsLength(): number;\n  enums(index: number, obj?: Enum): Enum | null;\n  enumsLength(): number;\n  fileIdent(): string | null;\n  fileIdent(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  fileExt(): string | null;\n  fileExt(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  rootTable(obj?: Object_): Object_ | null;\n  services(index: number, obj?: Service): Service | null;\n  servicesLength(): number;\n  advancedFeatures(): bigint;\n  mutate_advanced_features(value: bigint): boolean;\n  /**\n   * All the files used in this compilation. Files are relative to where\n   * flatc was invoked.\n   */\n  fbsFiles(index: number, obj?: SchemaFile): SchemaFile | null;\n  fbsFilesLength(): number;\n  static getFullyQualifiedName(): string;\n  static startSchema(builder: flatbuffers.Builder): void;\n  static addObjects(\n    builder: flatbuffers.Builder,\n    objectsOffset: flatbuffers.Offset,\n  ): void;\n  static createObjectsVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset;\n  static startObjectsVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addEnums(\n    builder: flatbuffers.Builder,\n    enumsOffset: flatbuffers.Offset,\n  ): void;\n  static createEnumsVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset;\n  static startEnumsVector(builder: flatbuffers.Builder, numElems: number): void;\n  static addFileIdent(\n    builder: flatbuffers.Builder,\n    fileIdentOffset: flatbuffers.Offset,\n  ): void;\n  static addFileExt(\n    builder: flatbuffers.Builder,\n    fileExtOffset: flatbuffers.Offset,\n  ): void;\n  static addRootTable(\n    builder: flatbuffers.Builder,\n    rootTableOffset: flatbuffers.Offset,\n  ): void;\n  static addServices(\n    builder: flatbuffers.Builder,\n    servicesOffset: flatbuffers.Offset,\n  ): void;\n  static createServicesVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset;\n  static startServicesVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addAdvancedFeatures(\n    builder: flatbuffers.Builder,\n    advancedFeatures: bigint,\n  ): void;\n  static addFbsFiles(\n    builder: flatbuffers.Builder,\n    fbsFilesOffset: flatbuffers.Offset,\n  ): void;\n  static createFbsFilesVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset;\n  static startFbsFilesVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static endSchema(builder: flatbuffers.Builder): flatbuffers.Offset;\n  static finishSchemaBuffer(\n    builder: flatbuffers.Builder,\n    offset: flatbuffers.Offset,\n  ): void;\n  static finishSizePrefixedSchemaBuffer(\n    builder: flatbuffers.Builder,\n    offset: flatbuffers.Offset,\n  ): void;\n  unpack(): SchemaT;\n  unpackTo(_o: SchemaT): void;\n}\nexport declare class SchemaT implements flatbuffers.IGeneratedObject {\n  objects: Object_T[];\n  enums: EnumT[];\n  fileIdent: string | Uint8Array | null;\n  fileExt: string | Uint8Array | null;\n  rootTable: Object_T | null;\n  services: ServiceT[];\n  advancedFeatures: bigint;\n  fbsFiles: SchemaFileT[];\n  constructor(\n    objects?: Object_T[],\n    enums?: EnumT[],\n    fileIdent?: string | Uint8Array | null,\n    fileExt?: string | Uint8Array | null,\n    rootTable?: Object_T | null,\n    services?: ServiceT[],\n    advancedFeatures?: bigint,\n    fbsFiles?: SchemaFileT[],\n  );\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/reflection/schema.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\n\nimport {Enum} from '../reflection/enum.js';\nimport {Object_} from '../reflection/object.js';\nimport {SchemaFile} from '../reflection/schema-file.js';\nimport {Service} from '../reflection/service.js';\n\nexport class Schema {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsSchema(bb, obj) {\n    return (obj || new Schema())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsSchema(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new Schema())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static bufferHasIdentifier(bb) {\n    return bb.__has_identifier('BFBS');\n  }\n  objects(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ?\n        (obj || new Object_())\n            .__init(\n                this.bb.__indirect(\n                    this.bb.__vector(this.bb_pos + offset) + index * 4),\n                this.bb) :\n        null;\n  }\n  objectsLength() {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  enums(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ?\n        (obj || new Enum())\n            .__init(\n                this.bb.__indirect(\n                    this.bb.__vector(this.bb_pos + offset) + index * 4),\n                this.bb) :\n        null;\n  }\n  enumsLength() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  fileIdent(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) :\n                    null;\n  }\n  fileExt(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) :\n                    null;\n  }\n  rootTable(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ?\n        (obj || new Object_())\n            .__init(this.bb.__indirect(this.bb_pos + offset), this.bb) :\n        null;\n  }\n  services(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ?\n        (obj || new Service())\n            .__init(\n                this.bb.__indirect(\n                    this.bb.__vector(this.bb_pos + offset) + index * 4),\n                this.bb) :\n        null;\n  }\n  servicesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  advancedFeatures() {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    return offset ? this.bb.readUint64(this.bb_pos + offset) : BigInt('0');\n  }\n  mutate_advanced_features(value) {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint64(this.bb_pos + offset, value);\n    return true;\n  }\n  /**\n   * All the files used in this compilation. Files are relative to where\n   * flatc was invoked.\n   */\n  fbsFiles(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 18);\n    return offset ?\n        (obj || new SchemaFile())\n            .__init(\n                this.bb.__indirect(\n                    this.bb.__vector(this.bb_pos + offset) + index * 4),\n                this.bb) :\n        null;\n  }\n  fbsFilesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 18);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  static getFullyQualifiedName() {\n    return 'reflection.Schema';\n  }\n  static startSchema(builder) {\n    builder.startObject(8);\n  }\n  static addObjects(builder, objectsOffset) {\n    builder.addFieldOffset(0, objectsOffset, 0);\n  }\n  static createObjectsVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startObjectsVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addEnums(builder, enumsOffset) {\n    builder.addFieldOffset(1, enumsOffset, 0);\n  }\n  static createEnumsVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startEnumsVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addFileIdent(builder, fileIdentOffset) {\n    builder.addFieldOffset(2, fileIdentOffset, 0);\n  }\n  static addFileExt(builder, fileExtOffset) {\n    builder.addFieldOffset(3, fileExtOffset, 0);\n  }\n  static addRootTable(builder, rootTableOffset) {\n    builder.addFieldOffset(4, rootTableOffset, 0);\n  }\n  static addServices(builder, servicesOffset) {\n    builder.addFieldOffset(5, servicesOffset, 0);\n  }\n  static createServicesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startServicesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addAdvancedFeatures(builder, advancedFeatures) {\n    builder.addFieldInt64(6, advancedFeatures, BigInt('0'));\n  }\n  static addFbsFiles(builder, fbsFilesOffset) {\n    builder.addFieldOffset(7, fbsFilesOffset, 0);\n  }\n  static createFbsFilesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startFbsFilesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static endSchema(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4);  // objects\n    builder.requiredField(offset, 6);  // enums\n    return offset;\n  }\n  static finishSchemaBuffer(builder, offset) {\n    builder.finish(offset, 'BFBS');\n  }\n  static finishSizePrefixedSchemaBuffer(builder, offset) {\n    builder.finish(offset, 'BFBS', true);\n  }\n  unpack() {\n    return new SchemaT(\n        this.bb.createObjList(this.objects.bind(this), this.objectsLength()),\n        this.bb.createObjList(this.enums.bind(this), this.enumsLength()),\n        this.fileIdent(), this.fileExt(),\n        (this.rootTable() !== null ? this.rootTable().unpack() : null),\n        this.bb.createObjList(this.services.bind(this), this.servicesLength()),\n        this.advancedFeatures(),\n        this.bb.createObjList(this.fbsFiles.bind(this), this.fbsFilesLength()));\n  }\n  unpackTo(_o) {\n    _o.objects =\n        this.bb.createObjList(this.objects.bind(this), this.objectsLength());\n    _o.enums = this.bb.createObjList(this.enums.bind(this), this.enumsLength());\n    _o.fileIdent = this.fileIdent();\n    _o.fileExt = this.fileExt();\n    _o.rootTable =\n        (this.rootTable() !== null ? this.rootTable().unpack() : null);\n    _o.services =\n        this.bb.createObjList(this.services.bind(this), this.servicesLength());\n    _o.advancedFeatures = this.advancedFeatures();\n    _o.fbsFiles =\n        this.bb.createObjList(this.fbsFiles.bind(this), this.fbsFilesLength());\n  }\n}\nexport class SchemaT {\n  constructor(\n      objects = [], enums = [], fileIdent = null, fileExt = null,\n      rootTable = null, services = [], advancedFeatures = BigInt('0'),\n      fbsFiles = []) {\n    this.objects = objects;\n    this.enums = enums;\n    this.fileIdent = fileIdent;\n    this.fileExt = fileExt;\n    this.rootTable = rootTable;\n    this.services = services;\n    this.advancedFeatures = advancedFeatures;\n    this.fbsFiles = fbsFiles;\n  }\n  pack(builder) {\n    const objects = Schema.createObjectsVector(\n        builder, builder.createObjectOffsetList(this.objects));\n    const enums = Schema.createEnumsVector(\n        builder, builder.createObjectOffsetList(this.enums));\n    const fileIdent =\n        (this.fileIdent !== null ? builder.createString(this.fileIdent) : 0);\n    const fileExt =\n        (this.fileExt !== null ? builder.createString(this.fileExt) : 0);\n    const rootTable =\n        (this.rootTable !== null ? this.rootTable.pack(builder) : 0);\n    const services = Schema.createServicesVector(\n        builder, builder.createObjectOffsetList(this.services));\n    const fbsFiles = Schema.createFbsFilesVector(\n        builder, builder.createObjectOffsetList(this.fbsFiles));\n    Schema.startSchema(builder);\n    Schema.addObjects(builder, objects);\n    Schema.addEnums(builder, enums);\n    Schema.addFileIdent(builder, fileIdent);\n    Schema.addFileExt(builder, fileExt);\n    Schema.addRootTable(builder, rootTable);\n    Schema.addServices(builder, services);\n    Schema.addAdvancedFeatures(builder, this.advancedFeatures);\n    Schema.addFbsFiles(builder, fbsFiles);\n    return Schema.endSchema(builder);\n  }\n}\n"
  },
  {
    "path": "tests/ts/reflection/schema.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport {Enum, EnumT} from '../reflection/enum.js';\nimport {Object_, Object_T} from '../reflection/object.js';\nimport {SchemaFile, SchemaFileT} from '../reflection/schema-file.js';\nimport {Service, ServiceT} from '../reflection/service.js';\n\nexport class Schema implements flatbuffers.IUnpackableObject<SchemaT> {\n  bb: flatbuffers.ByteBuffer | null = null;\n  bb_pos = 0;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Schema {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n\n  static getRootAsSchema(bb: flatbuffers.ByteBuffer, obj?: Schema): Schema {\n    return (obj || new Schema()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  static getSizePrefixedRootAsSchema(\n    bb: flatbuffers.ByteBuffer,\n    obj?: Schema,\n  ): Schema {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new Schema()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  static bufferHasIdentifier(bb: flatbuffers.ByteBuffer): boolean {\n    return bb.__has_identifier('BFBS');\n  }\n\n  objects(index: number, obj?: Object_): Object_ | null {\n    const offset = this.bb!.__offset(this.bb_pos, 4);\n    return offset\n      ? (obj || new Object_()).__init(\n          this.bb!.__indirect(\n            this.bb!.__vector(this.bb_pos + offset) + index * 4,\n          ),\n          this.bb!,\n        )\n      : null;\n  }\n\n  objectsLength(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 4);\n    return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n  }\n\n  enums(index: number, obj?: Enum): Enum | null {\n    const offset = this.bb!.__offset(this.bb_pos, 6);\n    return offset\n      ? (obj || new Enum()).__init(\n          this.bb!.__indirect(\n            this.bb!.__vector(this.bb_pos + offset) + index * 4,\n          ),\n          this.bb!,\n        )\n      : null;\n  }\n\n  enumsLength(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 6);\n    return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n  }\n\n  fileIdent(): string | null;\n  fileIdent(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  fileIdent(optionalEncoding?: any): string | Uint8Array | null {\n    const offset = this.bb!.__offset(this.bb_pos, 8);\n    return offset\n      ? this.bb!.__string(this.bb_pos + offset, optionalEncoding)\n      : null;\n  }\n\n  fileExt(): string | null;\n  fileExt(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  fileExt(optionalEncoding?: any): string | Uint8Array | null {\n    const offset = this.bb!.__offset(this.bb_pos, 10);\n    return offset\n      ? this.bb!.__string(this.bb_pos + offset, optionalEncoding)\n      : null;\n  }\n\n  rootTable(obj?: Object_): Object_ | null {\n    const offset = this.bb!.__offset(this.bb_pos, 12);\n    return offset\n      ? (obj || new Object_()).__init(\n          this.bb!.__indirect(this.bb_pos + offset),\n          this.bb!,\n        )\n      : null;\n  }\n\n  services(index: number, obj?: Service): Service | null {\n    const offset = this.bb!.__offset(this.bb_pos, 14);\n    return offset\n      ? (obj || new Service()).__init(\n          this.bb!.__indirect(\n            this.bb!.__vector(this.bb_pos + offset) + index * 4,\n          ),\n          this.bb!,\n        )\n      : null;\n  }\n\n  servicesLength(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 14);\n    return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n  }\n\n  advancedFeatures(): bigint {\n    const offset = this.bb!.__offset(this.bb_pos, 16);\n    return offset ? this.bb!.readUint64(this.bb_pos + offset) : BigInt('0');\n  }\n\n  mutate_advanced_features(value: bigint): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 16);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeUint64(this.bb_pos + offset, value);\n    return true;\n  }\n\n  /**\n   * All the files used in this compilation. Files are relative to where\n   * flatc was invoked.\n   */\n  fbsFiles(index: number, obj?: SchemaFile): SchemaFile | null {\n    const offset = this.bb!.__offset(this.bb_pos, 18);\n    return offset\n      ? (obj || new SchemaFile()).__init(\n          this.bb!.__indirect(\n            this.bb!.__vector(this.bb_pos + offset) + index * 4,\n          ),\n          this.bb!,\n        )\n      : null;\n  }\n\n  fbsFilesLength(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 18);\n    return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n  }\n\n  static getFullyQualifiedName(): string {\n    return 'reflection.Schema';\n  }\n\n  static startSchema(builder: flatbuffers.Builder) {\n    builder.startObject(8);\n  }\n\n  static addObjects(\n    builder: flatbuffers.Builder,\n    objectsOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(0, objectsOffset, 0);\n  }\n\n  static createObjectsVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]!);\n    }\n    return builder.endVector();\n  }\n\n  static startObjectsVector(builder: flatbuffers.Builder, numElems: number) {\n    builder.startVector(4, numElems, 4);\n  }\n\n  static addEnums(\n    builder: flatbuffers.Builder,\n    enumsOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(1, enumsOffset, 0);\n  }\n\n  static createEnumsVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]!);\n    }\n    return builder.endVector();\n  }\n\n  static startEnumsVector(builder: flatbuffers.Builder, numElems: number) {\n    builder.startVector(4, numElems, 4);\n  }\n\n  static addFileIdent(\n    builder: flatbuffers.Builder,\n    fileIdentOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(2, fileIdentOffset, 0);\n  }\n\n  static addFileExt(\n    builder: flatbuffers.Builder,\n    fileExtOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(3, fileExtOffset, 0);\n  }\n\n  static addRootTable(\n    builder: flatbuffers.Builder,\n    rootTableOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(4, rootTableOffset, 0);\n  }\n\n  static addServices(\n    builder: flatbuffers.Builder,\n    servicesOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(5, servicesOffset, 0);\n  }\n\n  static createServicesVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]!);\n    }\n    return builder.endVector();\n  }\n\n  static startServicesVector(builder: flatbuffers.Builder, numElems: number) {\n    builder.startVector(4, numElems, 4);\n  }\n\n  static addAdvancedFeatures(\n    builder: flatbuffers.Builder,\n    advancedFeatures: bigint,\n  ) {\n    builder.addFieldInt64(6, advancedFeatures, BigInt('0'));\n  }\n\n  static addFbsFiles(\n    builder: flatbuffers.Builder,\n    fbsFilesOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(7, fbsFilesOffset, 0);\n  }\n\n  static createFbsFilesVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]!);\n    }\n    return builder.endVector();\n  }\n\n  static startFbsFilesVector(builder: flatbuffers.Builder, numElems: number) {\n    builder.startVector(4, numElems, 4);\n  }\n\n  static endSchema(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4); // objects\n    builder.requiredField(offset, 6); // enums\n    return offset;\n  }\n\n  static finishSchemaBuffer(\n    builder: flatbuffers.Builder,\n    offset: flatbuffers.Offset,\n  ) {\n    builder.finish(offset, 'BFBS');\n  }\n\n  static finishSizePrefixedSchemaBuffer(\n    builder: flatbuffers.Builder,\n    offset: flatbuffers.Offset,\n  ) {\n    builder.finish(offset, 'BFBS', true);\n  }\n\n  unpack(): SchemaT {\n    return new SchemaT(\n      this.bb!.createObjList<Object_, Object_T>(\n        this.objects.bind(this),\n        this.objectsLength(),\n      ),\n      this.bb!.createObjList<Enum, EnumT>(\n        this.enums.bind(this),\n        this.enumsLength(),\n      ),\n      this.fileIdent(),\n      this.fileExt(),\n      this.rootTable() !== null ? this.rootTable()!.unpack() : null,\n      this.bb!.createObjList<Service, ServiceT>(\n        this.services.bind(this),\n        this.servicesLength(),\n      ),\n      this.advancedFeatures(),\n      this.bb!.createObjList<SchemaFile, SchemaFileT>(\n        this.fbsFiles.bind(this),\n        this.fbsFilesLength(),\n      ),\n    );\n  }\n\n  unpackTo(_o: SchemaT): void {\n    _o.objects = this.bb!.createObjList<Object_, Object_T>(\n      this.objects.bind(this),\n      this.objectsLength(),\n    );\n    _o.enums = this.bb!.createObjList<Enum, EnumT>(\n      this.enums.bind(this),\n      this.enumsLength(),\n    );\n    _o.fileIdent = this.fileIdent();\n    _o.fileExt = this.fileExt();\n    _o.rootTable =\n      this.rootTable() !== null ? this.rootTable()!.unpack() : null;\n    _o.services = this.bb!.createObjList<Service, ServiceT>(\n      this.services.bind(this),\n      this.servicesLength(),\n    );\n    _o.advancedFeatures = this.advancedFeatures();\n    _o.fbsFiles = this.bb!.createObjList<SchemaFile, SchemaFileT>(\n      this.fbsFiles.bind(this),\n      this.fbsFilesLength(),\n    );\n  }\n}\n\nexport class SchemaT implements flatbuffers.IGeneratedObject {\n  constructor(\n    public objects: Object_T[] = [],\n    public enums: EnumT[] = [],\n    public fileIdent: string | Uint8Array | null = null,\n    public fileExt: string | Uint8Array | null = null,\n    public rootTable: Object_T | null = null,\n    public services: ServiceT[] = [],\n    public advancedFeatures: bigint = BigInt('0'),\n    public fbsFiles: SchemaFileT[] = [],\n  ) {}\n\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const objects = Schema.createObjectsVector(\n      builder,\n      builder.createObjectOffsetList(this.objects),\n    );\n    const enums = Schema.createEnumsVector(\n      builder,\n      builder.createObjectOffsetList(this.enums),\n    );\n    const fileIdent =\n      this.fileIdent !== null ? builder.createString(this.fileIdent!) : 0;\n    const fileExt =\n      this.fileExt !== null ? builder.createString(this.fileExt!) : 0;\n    const rootTable =\n      this.rootTable !== null ? this.rootTable!.pack(builder) : 0;\n    const services = Schema.createServicesVector(\n      builder,\n      builder.createObjectOffsetList(this.services),\n    );\n    const fbsFiles = Schema.createFbsFilesVector(\n      builder,\n      builder.createObjectOffsetList(this.fbsFiles),\n    );\n\n    Schema.startSchema(builder);\n    Schema.addObjects(builder, objects);\n    Schema.addEnums(builder, enums);\n    Schema.addFileIdent(builder, fileIdent);\n    Schema.addFileExt(builder, fileExt);\n    Schema.addRootTable(builder, rootTable);\n    Schema.addServices(builder, services);\n    Schema.addAdvancedFeatures(builder, this.advancedFeatures);\n    Schema.addFbsFiles(builder, fbsFiles);\n\n    return Schema.endSchema(builder);\n  }\n}\n"
  },
  {
    "path": "tests/ts/reflection/service.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nimport {KeyValue, KeyValueT} from '../reflection/key-value.js';\nimport {RPCCall, RPCCallT} from '../reflection/rpccall.js';\nexport declare class Service\n  implements flatbuffers.IUnpackableObject<ServiceT>\n{\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Service;\n  static getRootAsService(bb: flatbuffers.ByteBuffer, obj?: Service): Service;\n  static getSizePrefixedRootAsService(\n    bb: flatbuffers.ByteBuffer,\n    obj?: Service,\n  ): Service;\n  name(): string | null;\n  name(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  calls(index: number, obj?: RPCCall): RPCCall | null;\n  callsLength(): number;\n  attributes(index: number, obj?: KeyValue): KeyValue | null;\n  attributesLength(): number;\n  documentation(index: number): string;\n  documentation(\n    index: number,\n    optionalEncoding: flatbuffers.Encoding,\n  ): string | Uint8Array;\n  documentationLength(): number;\n  /**\n   * File that this Service is declared in.\n   */\n  declarationFile(): string | null;\n  declarationFile(\n    optionalEncoding: flatbuffers.Encoding,\n  ): string | Uint8Array | null;\n  static getFullyQualifiedName(): string;\n  static startService(builder: flatbuffers.Builder): void;\n  static addName(\n    builder: flatbuffers.Builder,\n    nameOffset: flatbuffers.Offset,\n  ): void;\n  static addCalls(\n    builder: flatbuffers.Builder,\n    callsOffset: flatbuffers.Offset,\n  ): void;\n  static createCallsVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset;\n  static startCallsVector(builder: flatbuffers.Builder, numElems: number): void;\n  static addAttributes(\n    builder: flatbuffers.Builder,\n    attributesOffset: flatbuffers.Offset,\n  ): void;\n  static createAttributesVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset;\n  static startAttributesVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addDocumentation(\n    builder: flatbuffers.Builder,\n    documentationOffset: flatbuffers.Offset,\n  ): void;\n  static createDocumentationVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset;\n  static startDocumentationVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addDeclarationFile(\n    builder: flatbuffers.Builder,\n    declarationFileOffset: flatbuffers.Offset,\n  ): void;\n  static endService(builder: flatbuffers.Builder): flatbuffers.Offset;\n  static createService(\n    builder: flatbuffers.Builder,\n    nameOffset: flatbuffers.Offset,\n    callsOffset: flatbuffers.Offset,\n    attributesOffset: flatbuffers.Offset,\n    documentationOffset: flatbuffers.Offset,\n    declarationFileOffset: flatbuffers.Offset,\n  ): flatbuffers.Offset;\n  unpack(): ServiceT;\n  unpackTo(_o: ServiceT): void;\n}\nexport declare class ServiceT implements flatbuffers.IGeneratedObject {\n  name: string | Uint8Array | null;\n  calls: RPCCallT[];\n  attributes: KeyValueT[];\n  documentation: string[];\n  declarationFile: string | Uint8Array | null;\n  constructor(\n    name?: string | Uint8Array | null,\n    calls?: RPCCallT[],\n    attributes?: KeyValueT[],\n    documentation?: string[],\n    declarationFile?: string | Uint8Array | null,\n  );\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/reflection/service.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\n\nimport {KeyValue} from '../reflection/key-value.js';\nimport {RPCCall} from '../reflection/rpccall.js';\n\nexport class Service {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsService(bb, obj) {\n    return (obj || new Service())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsService(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new Service())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  name(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) :\n                    null;\n  }\n  calls(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ?\n        (obj || new RPCCall())\n            .__init(\n                this.bb.__indirect(\n                    this.bb.__vector(this.bb_pos + offset) + index * 4),\n                this.bb) :\n        null;\n  }\n  callsLength() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  attributes(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ?\n        (obj || new KeyValue())\n            .__init(\n                this.bb.__indirect(\n                    this.bb.__vector(this.bb_pos + offset) + index * 4),\n                this.bb) :\n        null;\n  }\n  attributesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  documentation(index, optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.__string(\n                        this.bb.__vector(this.bb_pos + offset) + index * 4,\n                        optionalEncoding) :\n                    null;\n  }\n  documentationLength() {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  declarationFile(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) :\n                    null;\n  }\n  static getFullyQualifiedName() {\n    return 'reflection.Service';\n  }\n  static startService(builder) {\n    builder.startObject(5);\n  }\n  static addName(builder, nameOffset) {\n    builder.addFieldOffset(0, nameOffset, 0);\n  }\n  static addCalls(builder, callsOffset) {\n    builder.addFieldOffset(1, callsOffset, 0);\n  }\n  static createCallsVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startCallsVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addAttributes(builder, attributesOffset) {\n    builder.addFieldOffset(2, attributesOffset, 0);\n  }\n  static createAttributesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startAttributesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addDocumentation(builder, documentationOffset) {\n    builder.addFieldOffset(3, documentationOffset, 0);\n  }\n  static createDocumentationVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startDocumentationVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addDeclarationFile(builder, declarationFileOffset) {\n    builder.addFieldOffset(4, declarationFileOffset, 0);\n  }\n  static endService(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4);  // name\n    return offset;\n  }\n  static createService(\n      builder, nameOffset, callsOffset, attributesOffset, documentationOffset,\n      declarationFileOffset) {\n    Service.startService(builder);\n    Service.addName(builder, nameOffset);\n    Service.addCalls(builder, callsOffset);\n    Service.addAttributes(builder, attributesOffset);\n    Service.addDocumentation(builder, documentationOffset);\n    Service.addDeclarationFile(builder, declarationFileOffset);\n    return Service.endService(builder);\n  }\n  unpack() {\n    return new ServiceT(\n        this.name(),\n        this.bb.createObjList(this.calls.bind(this), this.callsLength()),\n        this.bb.createObjList(\n            this.attributes.bind(this), this.attributesLength()),\n        this.bb.createScalarList(\n            this.documentation.bind(this), this.documentationLength()),\n        this.declarationFile());\n  }\n  unpackTo(_o) {\n    _o.name = this.name();\n    _o.calls = this.bb.createObjList(this.calls.bind(this), this.callsLength());\n    _o.attributes = this.bb.createObjList(\n        this.attributes.bind(this), this.attributesLength());\n    _o.documentation = this.bb.createScalarList(\n        this.documentation.bind(this), this.documentationLength());\n    _o.declarationFile = this.declarationFile();\n  }\n}\nexport class ServiceT {\n  constructor(\n      name = null, calls = [], attributes = [], documentation = [],\n      declarationFile = null) {\n    this.name = name;\n    this.calls = calls;\n    this.attributes = attributes;\n    this.documentation = documentation;\n    this.declarationFile = declarationFile;\n  }\n  pack(builder) {\n    const name = (this.name !== null ? builder.createString(this.name) : 0);\n    const calls = Service.createCallsVector(\n        builder, builder.createObjectOffsetList(this.calls));\n    const attributes = Service.createAttributesVector(\n        builder, builder.createObjectOffsetList(this.attributes));\n    const documentation = Service.createDocumentationVector(\n        builder, builder.createObjectOffsetList(this.documentation));\n    const declarationFile =\n        (this.declarationFile !== null ?\n             builder.createString(this.declarationFile) :\n             0);\n    return Service.createService(\n        builder, name, calls, attributes, documentation, declarationFile);\n  }\n}\n"
  },
  {
    "path": "tests/ts/reflection/service.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport {KeyValue, KeyValueT} from '../reflection/key-value.js';\nimport {RPCCall, RPCCallT} from '../reflection/rpccall.js';\n\nexport class Service implements flatbuffers.IUnpackableObject<ServiceT> {\n  bb: flatbuffers.ByteBuffer | null = null;\n  bb_pos = 0;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Service {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n\n  static getRootAsService(bb: flatbuffers.ByteBuffer, obj?: Service): Service {\n    return (obj || new Service()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  static getSizePrefixedRootAsService(\n    bb: flatbuffers.ByteBuffer,\n    obj?: Service,\n  ): Service {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new Service()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  name(): string | null;\n  name(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  name(optionalEncoding?: any): string | Uint8Array | null {\n    const offset = this.bb!.__offset(this.bb_pos, 4);\n    return offset\n      ? this.bb!.__string(this.bb_pos + offset, optionalEncoding)\n      : null;\n  }\n\n  calls(index: number, obj?: RPCCall): RPCCall | null {\n    const offset = this.bb!.__offset(this.bb_pos, 6);\n    return offset\n      ? (obj || new RPCCall()).__init(\n          this.bb!.__indirect(\n            this.bb!.__vector(this.bb_pos + offset) + index * 4,\n          ),\n          this.bb!,\n        )\n      : null;\n  }\n\n  callsLength(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 6);\n    return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n  }\n\n  attributes(index: number, obj?: KeyValue): KeyValue | null {\n    const offset = this.bb!.__offset(this.bb_pos, 8);\n    return offset\n      ? (obj || new KeyValue()).__init(\n          this.bb!.__indirect(\n            this.bb!.__vector(this.bb_pos + offset) + index * 4,\n          ),\n          this.bb!,\n        )\n      : null;\n  }\n\n  attributesLength(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 8);\n    return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n  }\n\n  documentation(index: number): string;\n  documentation(\n    index: number,\n    optionalEncoding: flatbuffers.Encoding,\n  ): string | Uint8Array;\n  documentation(\n    index: number,\n    optionalEncoding?: any,\n  ): string | Uint8Array | null {\n    const offset = this.bb!.__offset(this.bb_pos, 10);\n    return offset\n      ? this.bb!.__string(\n          this.bb!.__vector(this.bb_pos + offset) + index * 4,\n          optionalEncoding,\n        )\n      : null;\n  }\n\n  documentationLength(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 10);\n    return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n  }\n\n  /**\n   * File that this Service is declared in.\n   */\n  declarationFile(): string | null;\n  declarationFile(\n    optionalEncoding: flatbuffers.Encoding,\n  ): string | Uint8Array | null;\n  declarationFile(optionalEncoding?: any): string | Uint8Array | null {\n    const offset = this.bb!.__offset(this.bb_pos, 12);\n    return offset\n      ? this.bb!.__string(this.bb_pos + offset, optionalEncoding)\n      : null;\n  }\n\n  static getFullyQualifiedName(): string {\n    return 'reflection.Service';\n  }\n\n  static startService(builder: flatbuffers.Builder) {\n    builder.startObject(5);\n  }\n\n  static addName(builder: flatbuffers.Builder, nameOffset: flatbuffers.Offset) {\n    builder.addFieldOffset(0, nameOffset, 0);\n  }\n\n  static addCalls(\n    builder: flatbuffers.Builder,\n    callsOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(1, callsOffset, 0);\n  }\n\n  static createCallsVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]!);\n    }\n    return builder.endVector();\n  }\n\n  static startCallsVector(builder: flatbuffers.Builder, numElems: number) {\n    builder.startVector(4, numElems, 4);\n  }\n\n  static addAttributes(\n    builder: flatbuffers.Builder,\n    attributesOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(2, attributesOffset, 0);\n  }\n\n  static createAttributesVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]!);\n    }\n    return builder.endVector();\n  }\n\n  static startAttributesVector(builder: flatbuffers.Builder, numElems: number) {\n    builder.startVector(4, numElems, 4);\n  }\n\n  static addDocumentation(\n    builder: flatbuffers.Builder,\n    documentationOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(3, documentationOffset, 0);\n  }\n\n  static createDocumentationVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]!);\n    }\n    return builder.endVector();\n  }\n\n  static startDocumentationVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ) {\n    builder.startVector(4, numElems, 4);\n  }\n\n  static addDeclarationFile(\n    builder: flatbuffers.Builder,\n    declarationFileOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(4, declarationFileOffset, 0);\n  }\n\n  static endService(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4); // name\n    return offset;\n  }\n\n  static createService(\n    builder: flatbuffers.Builder,\n    nameOffset: flatbuffers.Offset,\n    callsOffset: flatbuffers.Offset,\n    attributesOffset: flatbuffers.Offset,\n    documentationOffset: flatbuffers.Offset,\n    declarationFileOffset: flatbuffers.Offset,\n  ): flatbuffers.Offset {\n    Service.startService(builder);\n    Service.addName(builder, nameOffset);\n    Service.addCalls(builder, callsOffset);\n    Service.addAttributes(builder, attributesOffset);\n    Service.addDocumentation(builder, documentationOffset);\n    Service.addDeclarationFile(builder, declarationFileOffset);\n    return Service.endService(builder);\n  }\n\n  unpack(): ServiceT {\n    return new ServiceT(\n      this.name(),\n      this.bb!.createObjList<RPCCall, RPCCallT>(\n        this.calls.bind(this),\n        this.callsLength(),\n      ),\n      this.bb!.createObjList<KeyValue, KeyValueT>(\n        this.attributes.bind(this),\n        this.attributesLength(),\n      ),\n      this.bb!.createScalarList<string>(\n        this.documentation.bind(this),\n        this.documentationLength(),\n      ),\n      this.declarationFile(),\n    );\n  }\n\n  unpackTo(_o: ServiceT): void {\n    _o.name = this.name();\n    _o.calls = this.bb!.createObjList<RPCCall, RPCCallT>(\n      this.calls.bind(this),\n      this.callsLength(),\n    );\n    _o.attributes = this.bb!.createObjList<KeyValue, KeyValueT>(\n      this.attributes.bind(this),\n      this.attributesLength(),\n    );\n    _o.documentation = this.bb!.createScalarList<string>(\n      this.documentation.bind(this),\n      this.documentationLength(),\n    );\n    _o.declarationFile = this.declarationFile();\n  }\n}\n\nexport class ServiceT implements flatbuffers.IGeneratedObject {\n  constructor(\n    public name: string | Uint8Array | null = null,\n    public calls: RPCCallT[] = [],\n    public attributes: KeyValueT[] = [],\n    public documentation: string[] = [],\n    public declarationFile: string | Uint8Array | null = null,\n  ) {}\n\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const name = this.name !== null ? builder.createString(this.name!) : 0;\n    const calls = Service.createCallsVector(\n      builder,\n      builder.createObjectOffsetList(this.calls),\n    );\n    const attributes = Service.createAttributesVector(\n      builder,\n      builder.createObjectOffsetList(this.attributes),\n    );\n    const documentation = Service.createDocumentationVector(\n      builder,\n      builder.createObjectOffsetList(this.documentation),\n    );\n    const declarationFile =\n      this.declarationFile !== null\n        ? builder.createString(this.declarationFile!)\n        : 0;\n\n    return Service.createService(\n      builder,\n      name,\n      calls,\n      attributes,\n      documentation,\n      declarationFile,\n    );\n  }\n}\n"
  },
  {
    "path": "tests/ts/reflection/type.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nimport {BaseType} from '../reflection/base-type.js';\nexport declare class Type implements flatbuffers.IUnpackableObject<TypeT> {\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Type;\n  static getRootAsType(bb: flatbuffers.ByteBuffer, obj?: Type): Type;\n  static getSizePrefixedRootAsType(\n    bb: flatbuffers.ByteBuffer,\n    obj?: Type,\n  ): Type;\n  baseType(): BaseType;\n  mutate_base_type(value: BaseType): boolean;\n  element(): BaseType;\n  mutate_element(value: BaseType): boolean;\n  index(): number;\n  mutate_index(value: number): boolean;\n  fixedLength(): number;\n  mutate_fixed_length(value: number): boolean;\n  /**\n   * The size (octets) of the `base_type` field.\n   */\n  baseSize(): number;\n  mutate_base_size(value: number): boolean;\n  /**\n   * The size (octets) of the `element` field, if present.\n   */\n  elementSize(): number;\n  mutate_element_size(value: number): boolean;\n  static getFullyQualifiedName(): string;\n  static startType(builder: flatbuffers.Builder): void;\n  static addBaseType(builder: flatbuffers.Builder, baseType: BaseType): void;\n  static addElement(builder: flatbuffers.Builder, element: BaseType): void;\n  static addIndex(builder: flatbuffers.Builder, index: number): void;\n  static addFixedLength(\n    builder: flatbuffers.Builder,\n    fixedLength: number,\n  ): void;\n  static addBaseSize(builder: flatbuffers.Builder, baseSize: number): void;\n  static addElementSize(\n    builder: flatbuffers.Builder,\n    elementSize: number,\n  ): void;\n  static endType(builder: flatbuffers.Builder): flatbuffers.Offset;\n  static createType(\n    builder: flatbuffers.Builder,\n    baseType: BaseType,\n    element: BaseType,\n    index: number,\n    fixedLength: number,\n    baseSize: number,\n    elementSize: number,\n  ): flatbuffers.Offset;\n  unpack(): TypeT;\n  unpackTo(_o: TypeT): void;\n}\nexport declare class TypeT implements flatbuffers.IGeneratedObject {\n  baseType: BaseType;\n  element: BaseType;\n  index: number;\n  fixedLength: number;\n  baseSize: number;\n  elementSize: number;\n  constructor(\n    baseType?: BaseType,\n    element?: BaseType,\n    index?: number,\n    fixedLength?: number,\n    baseSize?: number,\n    elementSize?: number,\n  );\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/reflection/type.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\n\nimport {BaseType} from '../reflection/base-type.js';\n\nexport class Type {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsType(bb, obj) {\n    return (obj || new Type())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsType(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new Type())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  baseType() {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.readInt8(this.bb_pos + offset) : BaseType.None;\n  }\n  mutate_base_type(value) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, value);\n    return true;\n  }\n  element() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.readInt8(this.bb_pos + offset) : BaseType.None;\n  }\n  mutate_element(value) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, value);\n    return true;\n  }\n  index() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : -1;\n  }\n  mutate_index(value) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  fixedLength() {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.readUint16(this.bb_pos + offset) : 0;\n  }\n  mutate_fixed_length(value) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint16(this.bb_pos + offset, value);\n    return true;\n  }\n  /**\n   * The size (octets) of the `base_type` field.\n   */\n  baseSize() {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.readUint32(this.bb_pos + offset) : 4;\n  }\n  mutate_base_size(value) {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint32(this.bb_pos + offset, value);\n    return true;\n  }\n  /**\n   * The size (octets) of the `element` field, if present.\n   */\n  elementSize() {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.readUint32(this.bb_pos + offset) : 0;\n  }\n  mutate_element_size(value) {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint32(this.bb_pos + offset, value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return 'reflection.Type';\n  }\n  static startType(builder) {\n    builder.startObject(6);\n  }\n  static addBaseType(builder, baseType) {\n    builder.addFieldInt8(0, baseType, BaseType.None);\n  }\n  static addElement(builder, element) {\n    builder.addFieldInt8(1, element, BaseType.None);\n  }\n  static addIndex(builder, index) {\n    builder.addFieldInt32(2, index, -1);\n  }\n  static addFixedLength(builder, fixedLength) {\n    builder.addFieldInt16(3, fixedLength, 0);\n  }\n  static addBaseSize(builder, baseSize) {\n    builder.addFieldInt32(4, baseSize, 4);\n  }\n  static addElementSize(builder, elementSize) {\n    builder.addFieldInt32(5, elementSize, 0);\n  }\n  static endType(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static createType(\n      builder, baseType, element, index, fixedLength, baseSize, elementSize) {\n    Type.startType(builder);\n    Type.addBaseType(builder, baseType);\n    Type.addElement(builder, element);\n    Type.addIndex(builder, index);\n    Type.addFixedLength(builder, fixedLength);\n    Type.addBaseSize(builder, baseSize);\n    Type.addElementSize(builder, elementSize);\n    return Type.endType(builder);\n  }\n  unpack() {\n    return new TypeT(\n        this.baseType(), this.element(), this.index(), this.fixedLength(),\n        this.baseSize(), this.elementSize());\n  }\n  unpackTo(_o) {\n    _o.baseType = this.baseType();\n    _o.element = this.element();\n    _o.index = this.index();\n    _o.fixedLength = this.fixedLength();\n    _o.baseSize = this.baseSize();\n    _o.elementSize = this.elementSize();\n  }\n}\nexport class TypeT {\n  constructor(\n      baseType = BaseType.None, element = BaseType.None, index = -1,\n      fixedLength = 0, baseSize = 4, elementSize = 0) {\n    this.baseType = baseType;\n    this.element = element;\n    this.index = index;\n    this.fixedLength = fixedLength;\n    this.baseSize = baseSize;\n    this.elementSize = elementSize;\n  }\n  pack(builder) {\n    return Type.createType(\n        builder, this.baseType, this.element, this.index, this.fixedLength,\n        this.baseSize, this.elementSize);\n  }\n}\n"
  },
  {
    "path": "tests/ts/reflection/type.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport {BaseType} from '../reflection/base-type.js';\n\nexport class Type implements flatbuffers.IUnpackableObject<TypeT> {\n  bb: flatbuffers.ByteBuffer | null = null;\n  bb_pos = 0;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Type {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n\n  static getRootAsType(bb: flatbuffers.ByteBuffer, obj?: Type): Type {\n    return (obj || new Type()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  static getSizePrefixedRootAsType(\n    bb: flatbuffers.ByteBuffer,\n    obj?: Type,\n  ): Type {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new Type()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  baseType(): BaseType {\n    const offset = this.bb!.__offset(this.bb_pos, 4);\n    return offset ? this.bb!.readInt8(this.bb_pos + offset) : BaseType.None;\n  }\n\n  mutate_base_type(value: BaseType): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 4);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeInt8(this.bb_pos + offset, value);\n    return true;\n  }\n\n  element(): BaseType {\n    const offset = this.bb!.__offset(this.bb_pos, 6);\n    return offset ? this.bb!.readInt8(this.bb_pos + offset) : BaseType.None;\n  }\n\n  mutate_element(value: BaseType): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 6);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeInt8(this.bb_pos + offset, value);\n    return true;\n  }\n\n  index(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 8);\n    return offset ? this.bb!.readInt32(this.bb_pos + offset) : -1;\n  }\n\n  mutate_index(value: number): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 8);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n\n  fixedLength(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 10);\n    return offset ? this.bb!.readUint16(this.bb_pos + offset) : 0;\n  }\n\n  mutate_fixed_length(value: number): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 10);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeUint16(this.bb_pos + offset, value);\n    return true;\n  }\n\n  /**\n   * The size (octets) of the `base_type` field.\n   */\n  baseSize(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 12);\n    return offset ? this.bb!.readUint32(this.bb_pos + offset) : 4;\n  }\n\n  mutate_base_size(value: number): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 12);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeUint32(this.bb_pos + offset, value);\n    return true;\n  }\n\n  /**\n   * The size (octets) of the `element` field, if present.\n   */\n  elementSize(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 14);\n    return offset ? this.bb!.readUint32(this.bb_pos + offset) : 0;\n  }\n\n  mutate_element_size(value: number): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 14);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeUint32(this.bb_pos + offset, value);\n    return true;\n  }\n\n  static getFullyQualifiedName(): string {\n    return 'reflection.Type';\n  }\n\n  static startType(builder: flatbuffers.Builder) {\n    builder.startObject(6);\n  }\n\n  static addBaseType(builder: flatbuffers.Builder, baseType: BaseType) {\n    builder.addFieldInt8(0, baseType, BaseType.None);\n  }\n\n  static addElement(builder: flatbuffers.Builder, element: BaseType) {\n    builder.addFieldInt8(1, element, BaseType.None);\n  }\n\n  static addIndex(builder: flatbuffers.Builder, index: number) {\n    builder.addFieldInt32(2, index, -1);\n  }\n\n  static addFixedLength(builder: flatbuffers.Builder, fixedLength: number) {\n    builder.addFieldInt16(3, fixedLength, 0);\n  }\n\n  static addBaseSize(builder: flatbuffers.Builder, baseSize: number) {\n    builder.addFieldInt32(4, baseSize, 4);\n  }\n\n  static addElementSize(builder: flatbuffers.Builder, elementSize: number) {\n    builder.addFieldInt32(5, elementSize, 0);\n  }\n\n  static endType(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const offset = builder.endObject();\n    return offset;\n  }\n\n  static createType(\n    builder: flatbuffers.Builder,\n    baseType: BaseType,\n    element: BaseType,\n    index: number,\n    fixedLength: number,\n    baseSize: number,\n    elementSize: number,\n  ): flatbuffers.Offset {\n    Type.startType(builder);\n    Type.addBaseType(builder, baseType);\n    Type.addElement(builder, element);\n    Type.addIndex(builder, index);\n    Type.addFixedLength(builder, fixedLength);\n    Type.addBaseSize(builder, baseSize);\n    Type.addElementSize(builder, elementSize);\n    return Type.endType(builder);\n  }\n\n  unpack(): TypeT {\n    return new TypeT(\n      this.baseType(),\n      this.element(),\n      this.index(),\n      this.fixedLength(),\n      this.baseSize(),\n      this.elementSize(),\n    );\n  }\n\n  unpackTo(_o: TypeT): void {\n    _o.baseType = this.baseType();\n    _o.element = this.element();\n    _o.index = this.index();\n    _o.fixedLength = this.fixedLength();\n    _o.baseSize = this.baseSize();\n    _o.elementSize = this.elementSize();\n  }\n}\n\nexport class TypeT implements flatbuffers.IGeneratedObject {\n  constructor(\n    public baseType: BaseType = BaseType.None,\n    public element: BaseType = BaseType.None,\n    public index: number = -1,\n    public fixedLength: number = 0,\n    public baseSize: number = 4,\n    public elementSize: number = 0,\n  ) {}\n\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset {\n    return Type.createType(\n      builder,\n      this.baseType,\n      this.element,\n      this.index,\n      this.fixedLength,\n      this.baseSize,\n      this.elementSize,\n    );\n  }\n}\n"
  },
  {
    "path": "tests/ts/reflection.d.ts",
    "content": "export {AdvancedFeatures} from './reflection/advanced-features.js';\nexport {BaseType} from './reflection/base-type.js';\nexport {EnumVal, EnumValT} from './reflection/enum-val.js';\nexport {Enum, EnumT} from './reflection/enum.js';\nexport {Field, FieldT} from './reflection/field.js';\nexport {KeyValue, KeyValueT} from './reflection/key-value.js';\nexport {Object_} from './reflection/object.js';\nexport {RPCCall, RPCCallT} from './reflection/rpccall.js';\nexport {SchemaFile, SchemaFileT} from './reflection/schema-file.js';\nexport {Schema, SchemaT} from './reflection/schema.js';\nexport {Service, ServiceT} from './reflection/service.js';\nexport {Type, TypeT} from './reflection/type.js';\n"
  },
  {
    "path": "tests/ts/reflection.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nexport {AdvancedFeatures} from './reflection/advanced-features.js';\nexport {BaseType} from './reflection/base-type.js';\nexport {EnumVal, EnumValT} from './reflection/enum-val.js';\nexport {Enum, EnumT} from './reflection/enum.js';\nexport {Field, FieldT} from './reflection/field.js';\nexport {KeyValue, KeyValueT} from './reflection/key-value.js';\nexport {Object_} from './reflection/object.js';\nexport {RPCCall, RPCCallT} from './reflection/rpccall.js';\nexport {SchemaFile, SchemaFileT} from './reflection/schema-file.js';\nexport {Schema, SchemaT} from './reflection/schema.js';\nexport {Service, ServiceT} from './reflection/service.js';\nexport {Type, TypeT} from './reflection/type.js';\n"
  },
  {
    "path": "tests/ts/reflection.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport {AdvancedFeatures} from './reflection/advanced-features.js';\nexport {BaseType} from './reflection/base-type.js';\nexport {EnumVal, EnumValT} from './reflection/enum-val.js';\nexport {Enum, EnumT} from './reflection/enum.js';\nexport {Field, FieldT} from './reflection/field.js';\nexport {KeyValue, KeyValueT} from './reflection/key-value.js';\nexport {Object_} from './reflection/object.js';\nexport {RPCCall, RPCCallT} from './reflection/rpccall.js';\nexport {SchemaFile, SchemaFileT} from './reflection/schema-file.js';\nexport {Schema, SchemaT} from './reflection/schema.js';\nexport {Service, ServiceT} from './reflection/service.js';\nexport {Type, TypeT} from './reflection/type.js';\n"
  },
  {
    "path": "tests/ts/reflection_generated.cjs",
    "content": "\"use strict\";\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n  for (var name in all)\n    __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n  if (from && typeof from === \"object\" || typeof from === \"function\") {\n    for (let key of __getOwnPropNames(from))\n      if (!__hasOwnProp.call(to, key) && key !== except)\n        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n  }\n  return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n  isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n  mod\n));\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// reflection.ts\nvar reflection_exports = {};\n__export(reflection_exports, {\n  AdvancedFeatures: () => AdvancedFeatures,\n  BaseType: () => BaseType,\n  Enum: () => Enum,\n  EnumVal: () => EnumVal,\n  Field: () => Field,\n  KeyValue: () => KeyValue,\n  Object_: () => Object_,\n  RPCCall: () => RPCCall,\n  Schema: () => Schema,\n  SchemaFile: () => SchemaFile,\n  Service: () => Service,\n  Type: () => Type\n});\nmodule.exports = __toCommonJS(reflection_exports);\n\n// reflection/advanced-features.ts\nvar AdvancedFeatures = /* @__PURE__ */ ((AdvancedFeatures2) => {\n  AdvancedFeatures2[\"AdvancedArrayFeatures\"] = \"1\";\n  AdvancedFeatures2[\"AdvancedUnionFeatures\"] = \"2\";\n  AdvancedFeatures2[\"OptionalScalars\"] = \"4\";\n  AdvancedFeatures2[\"DefaultVectorsAndStrings\"] = \"8\";\n  return AdvancedFeatures2;\n})(AdvancedFeatures || {});\n\n// reflection/base-type.js\nvar BaseType;\n(function(BaseType2) {\n  BaseType2[BaseType2[\"None\"] = 0] = \"None\";\n  BaseType2[BaseType2[\"UType\"] = 1] = \"UType\";\n  BaseType2[BaseType2[\"Bool\"] = 2] = \"Bool\";\n  BaseType2[BaseType2[\"Byte\"] = 3] = \"Byte\";\n  BaseType2[BaseType2[\"UByte\"] = 4] = \"UByte\";\n  BaseType2[BaseType2[\"Short\"] = 5] = \"Short\";\n  BaseType2[BaseType2[\"UShort\"] = 6] = \"UShort\";\n  BaseType2[BaseType2[\"Int\"] = 7] = \"Int\";\n  BaseType2[BaseType2[\"UInt\"] = 8] = \"UInt\";\n  BaseType2[BaseType2[\"Long\"] = 9] = \"Long\";\n  BaseType2[BaseType2[\"ULong\"] = 10] = \"ULong\";\n  BaseType2[BaseType2[\"Float\"] = 11] = \"Float\";\n  BaseType2[BaseType2[\"Double\"] = 12] = \"Double\";\n  BaseType2[BaseType2[\"String\"] = 13] = \"String\";\n  BaseType2[BaseType2[\"Vector\"] = 14] = \"Vector\";\n  BaseType2[BaseType2[\"Obj\"] = 15] = \"Obj\";\n  BaseType2[BaseType2[\"Union\"] = 16] = \"Union\";\n  BaseType2[BaseType2[\"Array\"] = 17] = \"Array\";\n  BaseType2[BaseType2[\"MaxBaseType\"] = 18] = \"MaxBaseType\";\n})(BaseType = BaseType || (BaseType = {}));\n\n// reflection/enum.js\nvar flatbuffers4 = __toESM(require(\"flatbuffers\"), 1);\n\n// reflection/enum-val.js\nvar flatbuffers3 = __toESM(require(\"flatbuffers\"), 1);\n\n// reflection/key-value.js\nvar flatbuffers = __toESM(require(\"flatbuffers\"), 1);\nvar KeyValue = class {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsKeyValue(bb, obj) {\n    return (obj || new KeyValue()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsKeyValue(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new KeyValue()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  key(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  value(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  static getFullyQualifiedName() {\n    return \"reflection_KeyValue\";\n  }\n  static startKeyValue(builder) {\n    builder.startObject(2);\n  }\n  static addKey(builder, keyOffset) {\n    builder.addFieldOffset(0, keyOffset, 0);\n  }\n  static addValue(builder, valueOffset) {\n    builder.addFieldOffset(1, valueOffset, 0);\n  }\n  static endKeyValue(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4);\n    return offset;\n  }\n  static createKeyValue(builder, keyOffset, valueOffset) {\n    KeyValue.startKeyValue(builder);\n    KeyValue.addKey(builder, keyOffset);\n    KeyValue.addValue(builder, valueOffset);\n    return KeyValue.endKeyValue(builder);\n  }\n  unpack() {\n    return new KeyValueT(this.key(), this.value());\n  }\n  unpackTo(_o) {\n    _o.key = this.key();\n    _o.value = this.value();\n  }\n};\nvar KeyValueT = class {\n  constructor(key = null, value = null) {\n    this.key = key;\n    this.value = value;\n  }\n  pack(builder) {\n    const key = this.key !== null ? builder.createString(this.key) : 0;\n    const value = this.value !== null ? builder.createString(this.value) : 0;\n    return KeyValue.createKeyValue(builder, key, value);\n  }\n};\n\n// reflection/type.js\nvar flatbuffers2 = __toESM(require(\"flatbuffers\"), 1);\nvar Type = class {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsType(bb, obj) {\n    return (obj || new Type()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsType(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers2.SIZE_PREFIX_LENGTH);\n    return (obj || new Type()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  baseType() {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.readInt8(this.bb_pos + offset) : BaseType.None;\n  }\n  mutate_base_type(value) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, value);\n    return true;\n  }\n  element() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.readInt8(this.bb_pos + offset) : BaseType.None;\n  }\n  mutate_element(value) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, value);\n    return true;\n  }\n  index() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : -1;\n  }\n  mutate_index(value) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  fixedLength() {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.readUint16(this.bb_pos + offset) : 0;\n  }\n  mutate_fixed_length(value) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint16(this.bb_pos + offset, value);\n    return true;\n  }\n  baseSize() {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.readUint32(this.bb_pos + offset) : 4;\n  }\n  mutate_base_size(value) {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint32(this.bb_pos + offset, value);\n    return true;\n  }\n  elementSize() {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.readUint32(this.bb_pos + offset) : 0;\n  }\n  mutate_element_size(value) {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint32(this.bb_pos + offset, value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return \"reflection_Type\";\n  }\n  static startType(builder) {\n    builder.startObject(6);\n  }\n  static addBaseType(builder, baseType) {\n    builder.addFieldInt8(0, baseType, BaseType.None);\n  }\n  static addElement(builder, element) {\n    builder.addFieldInt8(1, element, BaseType.None);\n  }\n  static addIndex(builder, index) {\n    builder.addFieldInt32(2, index, -1);\n  }\n  static addFixedLength(builder, fixedLength) {\n    builder.addFieldInt16(3, fixedLength, 0);\n  }\n  static addBaseSize(builder, baseSize) {\n    builder.addFieldInt32(4, baseSize, 4);\n  }\n  static addElementSize(builder, elementSize) {\n    builder.addFieldInt32(5, elementSize, 0);\n  }\n  static endType(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static createType(builder, baseType, element, index, fixedLength, baseSize, elementSize) {\n    Type.startType(builder);\n    Type.addBaseType(builder, baseType);\n    Type.addElement(builder, element);\n    Type.addIndex(builder, index);\n    Type.addFixedLength(builder, fixedLength);\n    Type.addBaseSize(builder, baseSize);\n    Type.addElementSize(builder, elementSize);\n    return Type.endType(builder);\n  }\n  unpack() {\n    return new TypeT(this.baseType(), this.element(), this.index(), this.fixedLength(), this.baseSize(), this.elementSize());\n  }\n  unpackTo(_o) {\n    _o.baseType = this.baseType();\n    _o.element = this.element();\n    _o.index = this.index();\n    _o.fixedLength = this.fixedLength();\n    _o.baseSize = this.baseSize();\n    _o.elementSize = this.elementSize();\n  }\n};\nvar TypeT = class {\n  constructor(baseType = BaseType.None, element = BaseType.None, index = -1, fixedLength = 0, baseSize = 4, elementSize = 0) {\n    this.baseType = baseType;\n    this.element = element;\n    this.index = index;\n    this.fixedLength = fixedLength;\n    this.baseSize = baseSize;\n    this.elementSize = elementSize;\n  }\n  pack(builder) {\n    return Type.createType(builder, this.baseType, this.element, this.index, this.fixedLength, this.baseSize, this.elementSize);\n  }\n};\n\n// reflection/enum-val.js\nvar EnumVal = class {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsEnumVal(bb, obj) {\n    return (obj || new EnumVal()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsEnumVal(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers3.SIZE_PREFIX_LENGTH);\n    return (obj || new EnumVal()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  name(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  value() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.readInt64(this.bb_pos + offset) : BigInt(\"0\");\n  }\n  mutate_value(value) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt64(this.bb_pos + offset, value);\n    return true;\n  }\n  unionType(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? (obj || new Type()).__init(this.bb.__indirect(this.bb_pos + offset), this.bb) : null;\n  }\n  documentation(index, optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.__string(this.bb.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n  }\n  documentationLength() {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  attributes(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? (obj || new KeyValue()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  attributesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  static getFullyQualifiedName() {\n    return \"reflection_EnumVal\";\n  }\n  static startEnumVal(builder) {\n    builder.startObject(6);\n  }\n  static addName(builder, nameOffset) {\n    builder.addFieldOffset(0, nameOffset, 0);\n  }\n  static addValue(builder, value) {\n    builder.addFieldInt64(1, value, BigInt(\"0\"));\n  }\n  static addUnionType(builder, unionTypeOffset) {\n    builder.addFieldOffset(3, unionTypeOffset, 0);\n  }\n  static addDocumentation(builder, documentationOffset) {\n    builder.addFieldOffset(4, documentationOffset, 0);\n  }\n  static createDocumentationVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startDocumentationVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addAttributes(builder, attributesOffset) {\n    builder.addFieldOffset(5, attributesOffset, 0);\n  }\n  static createAttributesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startAttributesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static endEnumVal(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4);\n    return offset;\n  }\n  unpack() {\n    return new EnumValT(this.name(), this.value(), this.unionType() !== null ? this.unionType().unpack() : null, this.bb.createScalarList(this.documentation.bind(this), this.documentationLength()), this.bb.createObjList(this.attributes.bind(this), this.attributesLength()));\n  }\n  unpackTo(_o) {\n    _o.name = this.name();\n    _o.value = this.value();\n    _o.unionType = this.unionType() !== null ? this.unionType().unpack() : null;\n    _o.documentation = this.bb.createScalarList(this.documentation.bind(this), this.documentationLength());\n    _o.attributes = this.bb.createObjList(this.attributes.bind(this), this.attributesLength());\n  }\n};\nvar EnumValT = class {\n  constructor(name = null, value = BigInt(\"0\"), unionType = null, documentation = [], attributes = []) {\n    this.name = name;\n    this.value = value;\n    this.unionType = unionType;\n    this.documentation = documentation;\n    this.attributes = attributes;\n  }\n  pack(builder) {\n    const name = this.name !== null ? builder.createString(this.name) : 0;\n    const unionType = this.unionType !== null ? this.unionType.pack(builder) : 0;\n    const documentation = EnumVal.createDocumentationVector(builder, builder.createObjectOffsetList(this.documentation));\n    const attributes = EnumVal.createAttributesVector(builder, builder.createObjectOffsetList(this.attributes));\n    EnumVal.startEnumVal(builder);\n    EnumVal.addName(builder, name);\n    EnumVal.addValue(builder, this.value);\n    EnumVal.addUnionType(builder, unionType);\n    EnumVal.addDocumentation(builder, documentation);\n    EnumVal.addAttributes(builder, attributes);\n    return EnumVal.endEnumVal(builder);\n  }\n};\n\n// reflection/enum.js\nvar Enum = class {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsEnum(bb, obj) {\n    return (obj || new Enum()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsEnum(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers4.SIZE_PREFIX_LENGTH);\n    return (obj || new Enum()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  name(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  values(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? (obj || new EnumVal()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  valuesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  isUnion() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false;\n  }\n  mutate_is_union(value) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n  underlyingType(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? (obj || new Type()).__init(this.bb.__indirect(this.bb_pos + offset), this.bb) : null;\n  }\n  attributes(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? (obj || new KeyValue()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  attributesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  documentation(index, optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.__string(this.bb.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n  }\n  documentationLength() {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  declarationFile(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  static getFullyQualifiedName() {\n    return \"reflection_Enum\";\n  }\n  static startEnum(builder) {\n    builder.startObject(7);\n  }\n  static addName(builder, nameOffset) {\n    builder.addFieldOffset(0, nameOffset, 0);\n  }\n  static addValues(builder, valuesOffset) {\n    builder.addFieldOffset(1, valuesOffset, 0);\n  }\n  static createValuesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startValuesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addIsUnion(builder, isUnion) {\n    builder.addFieldInt8(2, +isUnion, 0);\n  }\n  static addUnderlyingType(builder, underlyingTypeOffset) {\n    builder.addFieldOffset(3, underlyingTypeOffset, 0);\n  }\n  static addAttributes(builder, attributesOffset) {\n    builder.addFieldOffset(4, attributesOffset, 0);\n  }\n  static createAttributesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startAttributesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addDocumentation(builder, documentationOffset) {\n    builder.addFieldOffset(5, documentationOffset, 0);\n  }\n  static createDocumentationVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startDocumentationVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addDeclarationFile(builder, declarationFileOffset) {\n    builder.addFieldOffset(6, declarationFileOffset, 0);\n  }\n  static endEnum(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4);\n    builder.requiredField(offset, 6);\n    builder.requiredField(offset, 10);\n    return offset;\n  }\n  unpack() {\n    return new EnumT(this.name(), this.bb.createObjList(this.values.bind(this), this.valuesLength()), this.isUnion(), this.underlyingType() !== null ? this.underlyingType().unpack() : null, this.bb.createObjList(this.attributes.bind(this), this.attributesLength()), this.bb.createScalarList(this.documentation.bind(this), this.documentationLength()), this.declarationFile());\n  }\n  unpackTo(_o) {\n    _o.name = this.name();\n    _o.values = this.bb.createObjList(this.values.bind(this), this.valuesLength());\n    _o.isUnion = this.isUnion();\n    _o.underlyingType = this.underlyingType() !== null ? this.underlyingType().unpack() : null;\n    _o.attributes = this.bb.createObjList(this.attributes.bind(this), this.attributesLength());\n    _o.documentation = this.bb.createScalarList(this.documentation.bind(this), this.documentationLength());\n    _o.declarationFile = this.declarationFile();\n  }\n};\nvar EnumT = class {\n  constructor(name = null, values = [], isUnion = false, underlyingType = null, attributes = [], documentation = [], declarationFile = null) {\n    this.name = name;\n    this.values = values;\n    this.isUnion = isUnion;\n    this.underlyingType = underlyingType;\n    this.attributes = attributes;\n    this.documentation = documentation;\n    this.declarationFile = declarationFile;\n  }\n  pack(builder) {\n    const name = this.name !== null ? builder.createString(this.name) : 0;\n    const values = Enum.createValuesVector(builder, builder.createObjectOffsetList(this.values));\n    const underlyingType = this.underlyingType !== null ? this.underlyingType.pack(builder) : 0;\n    const attributes = Enum.createAttributesVector(builder, builder.createObjectOffsetList(this.attributes));\n    const documentation = Enum.createDocumentationVector(builder, builder.createObjectOffsetList(this.documentation));\n    const declarationFile = this.declarationFile !== null ? builder.createString(this.declarationFile) : 0;\n    Enum.startEnum(builder);\n    Enum.addName(builder, name);\n    Enum.addValues(builder, values);\n    Enum.addIsUnion(builder, this.isUnion);\n    Enum.addUnderlyingType(builder, underlyingType);\n    Enum.addAttributes(builder, attributes);\n    Enum.addDocumentation(builder, documentation);\n    Enum.addDeclarationFile(builder, declarationFile);\n    return Enum.endEnum(builder);\n  }\n};\n\n// reflection/field.js\nvar flatbuffers5 = __toESM(require(\"flatbuffers\"), 1);\nvar Field = class {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsField(bb, obj) {\n    return (obj || new Field()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsField(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers5.SIZE_PREFIX_LENGTH);\n    return (obj || new Field()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  name(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  type(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? (obj || new Type()).__init(this.bb.__indirect(this.bb_pos + offset), this.bb) : null;\n  }\n  id() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? this.bb.readUint16(this.bb_pos + offset) : 0;\n  }\n  mutate_id(value) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint16(this.bb_pos + offset, value);\n    return true;\n  }\n  offset() {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.readUint16(this.bb_pos + offset) : 0;\n  }\n  mutate_offset(value) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint16(this.bb_pos + offset, value);\n    return true;\n  }\n  defaultInteger() {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.readInt64(this.bb_pos + offset) : BigInt(\"0\");\n  }\n  mutate_default_integer(value) {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt64(this.bb_pos + offset, value);\n    return true;\n  }\n  defaultReal() {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.readFloat64(this.bb_pos + offset) : 0;\n  }\n  mutate_default_real(value) {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeFloat64(this.bb_pos + offset, value);\n    return true;\n  }\n  deprecated() {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false;\n  }\n  mutate_deprecated(value) {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n  required() {\n    const offset = this.bb.__offset(this.bb_pos, 18);\n    return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false;\n  }\n  mutate_required(value) {\n    const offset = this.bb.__offset(this.bb_pos, 18);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n  key() {\n    const offset = this.bb.__offset(this.bb_pos, 20);\n    return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false;\n  }\n  mutate_key(value) {\n    const offset = this.bb.__offset(this.bb_pos, 20);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n  attributes(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 22);\n    return offset ? (obj || new KeyValue()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  attributesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 22);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  documentation(index, optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 24);\n    return offset ? this.bb.__string(this.bb.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n  }\n  documentationLength() {\n    const offset = this.bb.__offset(this.bb_pos, 24);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  optional() {\n    const offset = this.bb.__offset(this.bb_pos, 26);\n    return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false;\n  }\n  mutate_optional(value) {\n    const offset = this.bb.__offset(this.bb_pos, 26);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n  padding() {\n    const offset = this.bb.__offset(this.bb_pos, 28);\n    return offset ? this.bb.readUint16(this.bb_pos + offset) : 0;\n  }\n  mutate_padding(value) {\n    const offset = this.bb.__offset(this.bb_pos, 28);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint16(this.bb_pos + offset, value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return \"reflection_Field\";\n  }\n  static startField(builder) {\n    builder.startObject(13);\n  }\n  static addName(builder, nameOffset) {\n    builder.addFieldOffset(0, nameOffset, 0);\n  }\n  static addType(builder, typeOffset) {\n    builder.addFieldOffset(1, typeOffset, 0);\n  }\n  static addId(builder, id) {\n    builder.addFieldInt16(2, id, 0);\n  }\n  static addOffset(builder, offset) {\n    builder.addFieldInt16(3, offset, 0);\n  }\n  static addDefaultInteger(builder, defaultInteger) {\n    builder.addFieldInt64(4, defaultInteger, BigInt(\"0\"));\n  }\n  static addDefaultReal(builder, defaultReal) {\n    builder.addFieldFloat64(5, defaultReal, 0);\n  }\n  static addDeprecated(builder, deprecated) {\n    builder.addFieldInt8(6, +deprecated, 0);\n  }\n  static addRequired(builder, required) {\n    builder.addFieldInt8(7, +required, 0);\n  }\n  static addKey(builder, key) {\n    builder.addFieldInt8(8, +key, 0);\n  }\n  static addAttributes(builder, attributesOffset) {\n    builder.addFieldOffset(9, attributesOffset, 0);\n  }\n  static createAttributesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startAttributesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addDocumentation(builder, documentationOffset) {\n    builder.addFieldOffset(10, documentationOffset, 0);\n  }\n  static createDocumentationVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startDocumentationVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addOptional(builder, optional) {\n    builder.addFieldInt8(11, +optional, 0);\n  }\n  static addPadding(builder, padding) {\n    builder.addFieldInt16(12, padding, 0);\n  }\n  static endField(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4);\n    builder.requiredField(offset, 6);\n    return offset;\n  }\n  unpack() {\n    return new FieldT(this.name(), this.type() !== null ? this.type().unpack() : null, this.id(), this.offset(), this.defaultInteger(), this.defaultReal(), this.deprecated(), this.required(), this.key(), this.bb.createObjList(this.attributes.bind(this), this.attributesLength()), this.bb.createScalarList(this.documentation.bind(this), this.documentationLength()), this.optional(), this.padding());\n  }\n  unpackTo(_o) {\n    _o.name = this.name();\n    _o.type = this.type() !== null ? this.type().unpack() : null;\n    _o.id = this.id();\n    _o.offset = this.offset();\n    _o.defaultInteger = this.defaultInteger();\n    _o.defaultReal = this.defaultReal();\n    _o.deprecated = this.deprecated();\n    _o.required = this.required();\n    _o.key = this.key();\n    _o.attributes = this.bb.createObjList(this.attributes.bind(this), this.attributesLength());\n    _o.documentation = this.bb.createScalarList(this.documentation.bind(this), this.documentationLength());\n    _o.optional = this.optional();\n    _o.padding = this.padding();\n  }\n};\nvar FieldT = class {\n  constructor(name = null, type = null, id = 0, offset = 0, defaultInteger = BigInt(\"0\"), defaultReal = 0, deprecated = false, required = false, key = false, attributes = [], documentation = [], optional = false, padding = 0) {\n    this.name = name;\n    this.type = type;\n    this.id = id;\n    this.offset = offset;\n    this.defaultInteger = defaultInteger;\n    this.defaultReal = defaultReal;\n    this.deprecated = deprecated;\n    this.required = required;\n    this.key = key;\n    this.attributes = attributes;\n    this.documentation = documentation;\n    this.optional = optional;\n    this.padding = padding;\n  }\n  pack(builder) {\n    const name = this.name !== null ? builder.createString(this.name) : 0;\n    const type = this.type !== null ? this.type.pack(builder) : 0;\n    const attributes = Field.createAttributesVector(builder, builder.createObjectOffsetList(this.attributes));\n    const documentation = Field.createDocumentationVector(builder, builder.createObjectOffsetList(this.documentation));\n    Field.startField(builder);\n    Field.addName(builder, name);\n    Field.addType(builder, type);\n    Field.addId(builder, this.id);\n    Field.addOffset(builder, this.offset);\n    Field.addDefaultInteger(builder, this.defaultInteger);\n    Field.addDefaultReal(builder, this.defaultReal);\n    Field.addDeprecated(builder, this.deprecated);\n    Field.addRequired(builder, this.required);\n    Field.addKey(builder, this.key);\n    Field.addAttributes(builder, attributes);\n    Field.addDocumentation(builder, documentation);\n    Field.addOptional(builder, this.optional);\n    Field.addPadding(builder, this.padding);\n    return Field.endField(builder);\n  }\n};\n\n// reflection/object.js\nvar flatbuffers6 = __toESM(require(\"flatbuffers\"), 1);\nvar Object_ = class {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsObject(bb, obj) {\n    return (obj || new Object_()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsObject(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers6.SIZE_PREFIX_LENGTH);\n    return (obj || new Object_()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  name(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  fields(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? (obj || new Field()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  fieldsLength() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  isStruct() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false;\n  }\n  mutate_is_struct(value) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n  minalign() {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n  }\n  mutate_minalign(value) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  bytesize() {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n  }\n  mutate_bytesize(value) {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  attributes(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? (obj || new KeyValue()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  attributesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  documentation(index, optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    return offset ? this.bb.__string(this.bb.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n  }\n  documentationLength() {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  declarationFile(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 18);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  static getFullyQualifiedName() {\n    return \"reflection_Object\";\n  }\n  static startObject(builder) {\n    builder.startObject(8);\n  }\n  static addName(builder, nameOffset) {\n    builder.addFieldOffset(0, nameOffset, 0);\n  }\n  static addFields(builder, fieldsOffset) {\n    builder.addFieldOffset(1, fieldsOffset, 0);\n  }\n  static createFieldsVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startFieldsVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addIsStruct(builder, isStruct) {\n    builder.addFieldInt8(2, +isStruct, 0);\n  }\n  static addMinalign(builder, minalign) {\n    builder.addFieldInt32(3, minalign, 0);\n  }\n  static addBytesize(builder, bytesize) {\n    builder.addFieldInt32(4, bytesize, 0);\n  }\n  static addAttributes(builder, attributesOffset) {\n    builder.addFieldOffset(5, attributesOffset, 0);\n  }\n  static createAttributesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startAttributesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addDocumentation(builder, documentationOffset) {\n    builder.addFieldOffset(6, documentationOffset, 0);\n  }\n  static createDocumentationVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startDocumentationVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addDeclarationFile(builder, declarationFileOffset) {\n    builder.addFieldOffset(7, declarationFileOffset, 0);\n  }\n  static endObject(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4);\n    builder.requiredField(offset, 6);\n    return offset;\n  }\n  static createObject(builder, nameOffset, fieldsOffset, isStruct, minalign, bytesize, attributesOffset, documentationOffset, declarationFileOffset) {\n    Object_.startObject(builder);\n    Object_.addName(builder, nameOffset);\n    Object_.addFields(builder, fieldsOffset);\n    Object_.addIsStruct(builder, isStruct);\n    Object_.addMinalign(builder, minalign);\n    Object_.addBytesize(builder, bytesize);\n    Object_.addAttributes(builder, attributesOffset);\n    Object_.addDocumentation(builder, documentationOffset);\n    Object_.addDeclarationFile(builder, declarationFileOffset);\n    return Object_.endObject(builder);\n  }\n  unpack() {\n    return new Object_T(this.name(), this.bb.createObjList(this.fields.bind(this), this.fieldsLength()), this.isStruct(), this.minalign(), this.bytesize(), this.bb.createObjList(this.attributes.bind(this), this.attributesLength()), this.bb.createScalarList(this.documentation.bind(this), this.documentationLength()), this.declarationFile());\n  }\n  unpackTo(_o) {\n    _o.name = this.name();\n    _o.fields = this.bb.createObjList(this.fields.bind(this), this.fieldsLength());\n    _o.isStruct = this.isStruct();\n    _o.minalign = this.minalign();\n    _o.bytesize = this.bytesize();\n    _o.attributes = this.bb.createObjList(this.attributes.bind(this), this.attributesLength());\n    _o.documentation = this.bb.createScalarList(this.documentation.bind(this), this.documentationLength());\n    _o.declarationFile = this.declarationFile();\n  }\n};\nvar Object_T = class {\n  constructor(name = null, fields = [], isStruct = false, minalign = 0, bytesize = 0, attributes = [], documentation = [], declarationFile = null) {\n    this.name = name;\n    this.fields = fields;\n    this.isStruct = isStruct;\n    this.minalign = minalign;\n    this.bytesize = bytesize;\n    this.attributes = attributes;\n    this.documentation = documentation;\n    this.declarationFile = declarationFile;\n  }\n  pack(builder) {\n    const name = this.name !== null ? builder.createString(this.name) : 0;\n    const fields = Object_.createFieldsVector(builder, builder.createObjectOffsetList(this.fields));\n    const attributes = Object_.createAttributesVector(builder, builder.createObjectOffsetList(this.attributes));\n    const documentation = Object_.createDocumentationVector(builder, builder.createObjectOffsetList(this.documentation));\n    const declarationFile = this.declarationFile !== null ? builder.createString(this.declarationFile) : 0;\n    return Object_.createObject(builder, name, fields, this.isStruct, this.minalign, this.bytesize, attributes, documentation, declarationFile);\n  }\n};\n\n// reflection/rpccall.js\nvar flatbuffers7 = __toESM(require(\"flatbuffers\"), 1);\nvar RPCCall = class {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsRPCCall(bb, obj) {\n    return (obj || new RPCCall()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsRPCCall(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers7.SIZE_PREFIX_LENGTH);\n    return (obj || new RPCCall()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  name(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  request(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? (obj || new Object_()).__init(this.bb.__indirect(this.bb_pos + offset), this.bb) : null;\n  }\n  response(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? (obj || new Object_()).__init(this.bb.__indirect(this.bb_pos + offset), this.bb) : null;\n  }\n  attributes(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? (obj || new KeyValue()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  attributesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  documentation(index, optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.__string(this.bb.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n  }\n  documentationLength() {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  static getFullyQualifiedName() {\n    return \"reflection_RPCCall\";\n  }\n  static startRPCCall(builder) {\n    builder.startObject(5);\n  }\n  static addName(builder, nameOffset) {\n    builder.addFieldOffset(0, nameOffset, 0);\n  }\n  static addRequest(builder, requestOffset) {\n    builder.addFieldOffset(1, requestOffset, 0);\n  }\n  static addResponse(builder, responseOffset) {\n    builder.addFieldOffset(2, responseOffset, 0);\n  }\n  static addAttributes(builder, attributesOffset) {\n    builder.addFieldOffset(3, attributesOffset, 0);\n  }\n  static createAttributesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startAttributesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addDocumentation(builder, documentationOffset) {\n    builder.addFieldOffset(4, documentationOffset, 0);\n  }\n  static createDocumentationVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startDocumentationVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static endRPCCall(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4);\n    builder.requiredField(offset, 6);\n    builder.requiredField(offset, 8);\n    return offset;\n  }\n  unpack() {\n    return new RPCCallT(this.name(), this.request() !== null ? this.request().unpack() : null, this.response() !== null ? this.response().unpack() : null, this.bb.createObjList(this.attributes.bind(this), this.attributesLength()), this.bb.createScalarList(this.documentation.bind(this), this.documentationLength()));\n  }\n  unpackTo(_o) {\n    _o.name = this.name();\n    _o.request = this.request() !== null ? this.request().unpack() : null;\n    _o.response = this.response() !== null ? this.response().unpack() : null;\n    _o.attributes = this.bb.createObjList(this.attributes.bind(this), this.attributesLength());\n    _o.documentation = this.bb.createScalarList(this.documentation.bind(this), this.documentationLength());\n  }\n};\nvar RPCCallT = class {\n  constructor(name = null, request = null, response = null, attributes = [], documentation = []) {\n    this.name = name;\n    this.request = request;\n    this.response = response;\n    this.attributes = attributes;\n    this.documentation = documentation;\n  }\n  pack(builder) {\n    const name = this.name !== null ? builder.createString(this.name) : 0;\n    const request = this.request !== null ? this.request.pack(builder) : 0;\n    const response = this.response !== null ? this.response.pack(builder) : 0;\n    const attributes = RPCCall.createAttributesVector(builder, builder.createObjectOffsetList(this.attributes));\n    const documentation = RPCCall.createDocumentationVector(builder, builder.createObjectOffsetList(this.documentation));\n    RPCCall.startRPCCall(builder);\n    RPCCall.addName(builder, name);\n    RPCCall.addRequest(builder, request);\n    RPCCall.addResponse(builder, response);\n    RPCCall.addAttributes(builder, attributes);\n    RPCCall.addDocumentation(builder, documentation);\n    return RPCCall.endRPCCall(builder);\n  }\n};\n\n// reflection/schema.js\nvar flatbuffers10 = __toESM(require(\"flatbuffers\"), 1);\n\n// reflection/schema-file.js\nvar flatbuffers8 = __toESM(require(\"flatbuffers\"), 1);\nvar SchemaFile = class {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsSchemaFile(bb, obj) {\n    return (obj || new SchemaFile()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsSchemaFile(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers8.SIZE_PREFIX_LENGTH);\n    return (obj || new SchemaFile()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  filename(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  includedFilenames(index, optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.__string(this.bb.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n  }\n  includedFilenamesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  static getFullyQualifiedName() {\n    return \"reflection_SchemaFile\";\n  }\n  static startSchemaFile(builder) {\n    builder.startObject(2);\n  }\n  static addFilename(builder, filenameOffset) {\n    builder.addFieldOffset(0, filenameOffset, 0);\n  }\n  static addIncludedFilenames(builder, includedFilenamesOffset) {\n    builder.addFieldOffset(1, includedFilenamesOffset, 0);\n  }\n  static createIncludedFilenamesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startIncludedFilenamesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static endSchemaFile(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4);\n    return offset;\n  }\n  static createSchemaFile(builder, filenameOffset, includedFilenamesOffset) {\n    SchemaFile.startSchemaFile(builder);\n    SchemaFile.addFilename(builder, filenameOffset);\n    SchemaFile.addIncludedFilenames(builder, includedFilenamesOffset);\n    return SchemaFile.endSchemaFile(builder);\n  }\n  unpack() {\n    return new SchemaFileT(this.filename(), this.bb.createScalarList(this.includedFilenames.bind(this), this.includedFilenamesLength()));\n  }\n  unpackTo(_o) {\n    _o.filename = this.filename();\n    _o.includedFilenames = this.bb.createScalarList(this.includedFilenames.bind(this), this.includedFilenamesLength());\n  }\n};\nvar SchemaFileT = class {\n  constructor(filename = null, includedFilenames = []) {\n    this.filename = filename;\n    this.includedFilenames = includedFilenames;\n  }\n  pack(builder) {\n    const filename = this.filename !== null ? builder.createString(this.filename) : 0;\n    const includedFilenames = SchemaFile.createIncludedFilenamesVector(builder, builder.createObjectOffsetList(this.includedFilenames));\n    return SchemaFile.createSchemaFile(builder, filename, includedFilenames);\n  }\n};\n\n// reflection/service.js\nvar flatbuffers9 = __toESM(require(\"flatbuffers\"), 1);\nvar Service = class {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsService(bb, obj) {\n    return (obj || new Service()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsService(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers9.SIZE_PREFIX_LENGTH);\n    return (obj || new Service()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  name(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  calls(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? (obj || new RPCCall()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  callsLength() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  attributes(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? (obj || new KeyValue()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  attributesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  documentation(index, optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.__string(this.bb.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n  }\n  documentationLength() {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  declarationFile(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  static getFullyQualifiedName() {\n    return \"reflection_Service\";\n  }\n  static startService(builder) {\n    builder.startObject(5);\n  }\n  static addName(builder, nameOffset) {\n    builder.addFieldOffset(0, nameOffset, 0);\n  }\n  static addCalls(builder, callsOffset) {\n    builder.addFieldOffset(1, callsOffset, 0);\n  }\n  static createCallsVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startCallsVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addAttributes(builder, attributesOffset) {\n    builder.addFieldOffset(2, attributesOffset, 0);\n  }\n  static createAttributesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startAttributesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addDocumentation(builder, documentationOffset) {\n    builder.addFieldOffset(3, documentationOffset, 0);\n  }\n  static createDocumentationVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startDocumentationVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addDeclarationFile(builder, declarationFileOffset) {\n    builder.addFieldOffset(4, declarationFileOffset, 0);\n  }\n  static endService(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4);\n    return offset;\n  }\n  static createService(builder, nameOffset, callsOffset, attributesOffset, documentationOffset, declarationFileOffset) {\n    Service.startService(builder);\n    Service.addName(builder, nameOffset);\n    Service.addCalls(builder, callsOffset);\n    Service.addAttributes(builder, attributesOffset);\n    Service.addDocumentation(builder, documentationOffset);\n    Service.addDeclarationFile(builder, declarationFileOffset);\n    return Service.endService(builder);\n  }\n  unpack() {\n    return new ServiceT(this.name(), this.bb.createObjList(this.calls.bind(this), this.callsLength()), this.bb.createObjList(this.attributes.bind(this), this.attributesLength()), this.bb.createScalarList(this.documentation.bind(this), this.documentationLength()), this.declarationFile());\n  }\n  unpackTo(_o) {\n    _o.name = this.name();\n    _o.calls = this.bb.createObjList(this.calls.bind(this), this.callsLength());\n    _o.attributes = this.bb.createObjList(this.attributes.bind(this), this.attributesLength());\n    _o.documentation = this.bb.createScalarList(this.documentation.bind(this), this.documentationLength());\n    _o.declarationFile = this.declarationFile();\n  }\n};\nvar ServiceT = class {\n  constructor(name = null, calls = [], attributes = [], documentation = [], declarationFile = null) {\n    this.name = name;\n    this.calls = calls;\n    this.attributes = attributes;\n    this.documentation = documentation;\n    this.declarationFile = declarationFile;\n  }\n  pack(builder) {\n    const name = this.name !== null ? builder.createString(this.name) : 0;\n    const calls = Service.createCallsVector(builder, builder.createObjectOffsetList(this.calls));\n    const attributes = Service.createAttributesVector(builder, builder.createObjectOffsetList(this.attributes));\n    const documentation = Service.createDocumentationVector(builder, builder.createObjectOffsetList(this.documentation));\n    const declarationFile = this.declarationFile !== null ? builder.createString(this.declarationFile) : 0;\n    return Service.createService(builder, name, calls, attributes, documentation, declarationFile);\n  }\n};\n\n// reflection/schema.js\nvar Schema = class {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsSchema(bb, obj) {\n    return (obj || new Schema()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsSchema(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers10.SIZE_PREFIX_LENGTH);\n    return (obj || new Schema()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static bufferHasIdentifier(bb) {\n    return bb.__has_identifier(\"BFBS\");\n  }\n  objects(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? (obj || new Object_()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  objectsLength() {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  enums(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? (obj || new Enum()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  enumsLength() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  fileIdent(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  fileExt(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  rootTable(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? (obj || new Object_()).__init(this.bb.__indirect(this.bb_pos + offset), this.bb) : null;\n  }\n  services(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? (obj || new Service()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  servicesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  advancedFeatures() {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    return offset ? this.bb.readUint64(this.bb_pos + offset) : BigInt(\"0\");\n  }\n  mutate_advanced_features(value) {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint64(this.bb_pos + offset, value);\n    return true;\n  }\n  fbsFiles(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 18);\n    return offset ? (obj || new SchemaFile()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  fbsFilesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 18);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  static getFullyQualifiedName() {\n    return \"reflection_Schema\";\n  }\n  static startSchema(builder) {\n    builder.startObject(8);\n  }\n  static addObjects(builder, objectsOffset) {\n    builder.addFieldOffset(0, objectsOffset, 0);\n  }\n  static createObjectsVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startObjectsVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addEnums(builder, enumsOffset) {\n    builder.addFieldOffset(1, enumsOffset, 0);\n  }\n  static createEnumsVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startEnumsVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addFileIdent(builder, fileIdentOffset) {\n    builder.addFieldOffset(2, fileIdentOffset, 0);\n  }\n  static addFileExt(builder, fileExtOffset) {\n    builder.addFieldOffset(3, fileExtOffset, 0);\n  }\n  static addRootTable(builder, rootTableOffset) {\n    builder.addFieldOffset(4, rootTableOffset, 0);\n  }\n  static addServices(builder, servicesOffset) {\n    builder.addFieldOffset(5, servicesOffset, 0);\n  }\n  static createServicesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startServicesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addAdvancedFeatures(builder, advancedFeatures) {\n    builder.addFieldInt64(6, advancedFeatures, BigInt(\"0\"));\n  }\n  static addFbsFiles(builder, fbsFilesOffset) {\n    builder.addFieldOffset(7, fbsFilesOffset, 0);\n  }\n  static createFbsFilesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startFbsFilesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static endSchema(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4);\n    builder.requiredField(offset, 6);\n    return offset;\n  }\n  static finishSchemaBuffer(builder, offset) {\n    builder.finish(offset, \"BFBS\");\n  }\n  static finishSizePrefixedSchemaBuffer(builder, offset) {\n    builder.finish(offset, \"BFBS\", true);\n  }\n  unpack() {\n    return new SchemaT(this.bb.createObjList(this.objects.bind(this), this.objectsLength()), this.bb.createObjList(this.enums.bind(this), this.enumsLength()), this.fileIdent(), this.fileExt(), this.rootTable() !== null ? this.rootTable().unpack() : null, this.bb.createObjList(this.services.bind(this), this.servicesLength()), this.advancedFeatures(), this.bb.createObjList(this.fbsFiles.bind(this), this.fbsFilesLength()));\n  }\n  unpackTo(_o) {\n    _o.objects = this.bb.createObjList(this.objects.bind(this), this.objectsLength());\n    _o.enums = this.bb.createObjList(this.enums.bind(this), this.enumsLength());\n    _o.fileIdent = this.fileIdent();\n    _o.fileExt = this.fileExt();\n    _o.rootTable = this.rootTable() !== null ? this.rootTable().unpack() : null;\n    _o.services = this.bb.createObjList(this.services.bind(this), this.servicesLength());\n    _o.advancedFeatures = this.advancedFeatures();\n    _o.fbsFiles = this.bb.createObjList(this.fbsFiles.bind(this), this.fbsFilesLength());\n  }\n};\nvar SchemaT = class {\n  constructor(objects = [], enums = [], fileIdent = null, fileExt = null, rootTable = null, services = [], advancedFeatures = BigInt(\"0\"), fbsFiles = []) {\n    this.objects = objects;\n    this.enums = enums;\n    this.fileIdent = fileIdent;\n    this.fileExt = fileExt;\n    this.rootTable = rootTable;\n    this.services = services;\n    this.advancedFeatures = advancedFeatures;\n    this.fbsFiles = fbsFiles;\n  }\n  pack(builder) {\n    const objects = Schema.createObjectsVector(builder, builder.createObjectOffsetList(this.objects));\n    const enums = Schema.createEnumsVector(builder, builder.createObjectOffsetList(this.enums));\n    const fileIdent = this.fileIdent !== null ? builder.createString(this.fileIdent) : 0;\n    const fileExt = this.fileExt !== null ? builder.createString(this.fileExt) : 0;\n    const rootTable = this.rootTable !== null ? this.rootTable.pack(builder) : 0;\n    const services = Schema.createServicesVector(builder, builder.createObjectOffsetList(this.services));\n    const fbsFiles = Schema.createFbsFilesVector(builder, builder.createObjectOffsetList(this.fbsFiles));\n    Schema.startSchema(builder);\n    Schema.addObjects(builder, objects);\n    Schema.addEnums(builder, enums);\n    Schema.addFileIdent(builder, fileIdent);\n    Schema.addFileExt(builder, fileExt);\n    Schema.addRootTable(builder, rootTable);\n    Schema.addServices(builder, services);\n    Schema.addAdvancedFeatures(builder, this.advancedFeatures);\n    Schema.addFbsFiles(builder, fbsFiles);\n    return Schema.endSchema(builder);\n  }\n};\n"
  },
  {
    "path": "tests/ts/relative_imports/relative_imports.fbs",
    "content": "namespace Transit.One;\n\ntable Info {\n  timestamp:ulong;\n}\n\nnamespace Transit.Two;\n\ntable Identity {\n  id:uint;\n}\n\nnamespace Transit.Three;\n\ntable Header {\n  info:Transit.One.Info;\n  id:Transit.Two.Identity;\n}\n\nroot_type Header;\n"
  },
  {
    "path": "tests/ts/required-strings/foo.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\nimport * as flatbuffers from 'flatbuffers';\nexport class Foo {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsFoo(bb, obj) {\n    return (obj || new Foo())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsFoo(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new Foo())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  strA(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) :\n                    null;\n  }\n  strB(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) :\n                    null;\n  }\n  static startFoo(builder) {\n    builder.startObject(2);\n  }\n  static addStrA(builder, strAOffset) {\n    builder.addFieldOffset(0, strAOffset, 0);\n  }\n  static addStrB(builder, strBOffset) {\n    builder.addFieldOffset(1, strBOffset, 0);\n  }\n  static endFoo(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4);  // str_a\n    builder.requiredField(offset, 6);  // str_b\n    return offset;\n  }\n  static createFoo(builder, strAOffset, strBOffset) {\n    Foo.startFoo(builder);\n    Foo.addStrA(builder, strAOffset);\n    Foo.addStrB(builder, strBOffset);\n    return Foo.endFoo(builder);\n  }\n}\n"
  },
  {
    "path": "tests/ts/required-strings/foo.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\nimport * as flatbuffers from 'flatbuffers';\n\nexport class Foo {\n  bb: flatbuffers.ByteBuffer | null = null;\n  bb_pos = 0;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Foo {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n\n  static getRootAsFoo(bb: flatbuffers.ByteBuffer, obj?: Foo): Foo {\n    return (obj || new Foo()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  static getSizePrefixedRootAsFoo(bb: flatbuffers.ByteBuffer, obj?: Foo): Foo {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new Foo()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  strA(): string | null;\n  strA(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  strA(optionalEncoding?: any): string | Uint8Array | null {\n    const offset = this.bb!.__offset(this.bb_pos, 4);\n    return offset\n      ? this.bb!.__string(this.bb_pos + offset, optionalEncoding)\n      : null;\n  }\n\n  strB(): string | null;\n  strB(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  strB(optionalEncoding?: any): string | Uint8Array | null {\n    const offset = this.bb!.__offset(this.bb_pos, 6);\n    return offset\n      ? this.bb!.__string(this.bb_pos + offset, optionalEncoding)\n      : null;\n  }\n\n  static startFoo(builder: flatbuffers.Builder) {\n    builder.startObject(2);\n  }\n\n  static addStrA(builder: flatbuffers.Builder, strAOffset: flatbuffers.Offset) {\n    builder.addFieldOffset(0, strAOffset, 0);\n  }\n\n  static addStrB(builder: flatbuffers.Builder, strBOffset: flatbuffers.Offset) {\n    builder.addFieldOffset(1, strBOffset, 0);\n  }\n\n  static endFoo(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4); // str_a\n    builder.requiredField(offset, 6); // str_b\n    return offset;\n  }\n\n  static createFoo(\n    builder: flatbuffers.Builder,\n    strAOffset: flatbuffers.Offset,\n    strBOffset: flatbuffers.Offset,\n  ): flatbuffers.Offset {\n    Foo.startFoo(builder);\n    Foo.addStrA(builder, strAOffset);\n    Foo.addStrB(builder, strBOffset);\n    return Foo.endFoo(builder);\n  }\n}\n"
  },
  {
    "path": "tests/ts/required_strings_generated.js",
    "content": "'use strict';\n// automatically generated by the FlatBuffers compiler, do not modify\n"
  },
  {
    "path": "tests/ts/required_strings_generated.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n"
  },
  {
    "path": "tests/ts/table-a.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nimport {TableB, TableBT} from './my-game/other-name-space/table-b.js';\nexport declare class TableA implements flatbuffers.IUnpackableObject<TableAT> {\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): TableA;\n  static getRootAsTableA(bb: flatbuffers.ByteBuffer, obj?: TableA): TableA;\n  static getSizePrefixedRootAsTableA(\n    bb: flatbuffers.ByteBuffer,\n    obj?: TableA,\n  ): TableA;\n  b(obj?: TableB): TableB | null;\n  static getFullyQualifiedName(): string;\n  static startTableA(builder: flatbuffers.Builder): void;\n  static addB(builder: flatbuffers.Builder, bOffset: flatbuffers.Offset): void;\n  static endTableA(builder: flatbuffers.Builder): flatbuffers.Offset;\n  static createTableA(\n    builder: flatbuffers.Builder,\n    bOffset: flatbuffers.Offset,\n  ): flatbuffers.Offset;\n  serialize(): Uint8Array;\n  static deserialize(buffer: Uint8Array): TableA;\n  unpack(): TableAT;\n  unpackTo(_o: TableAT): void;\n}\nexport declare class TableAT implements flatbuffers.IGeneratedObject {\n  b: TableBT | null;\n  constructor(b?: TableBT | null);\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/table-a.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\n\nimport {TableB} from './my-game/other-name-space/table-b.js';\n\nexport class TableA {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsTableA(bb, obj) {\n    return (obj || new TableA())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsTableA(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new TableA())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  b(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ?\n        (obj || new TableB())\n            .__init(this.bb.__indirect(this.bb_pos + offset), this.bb) :\n        null;\n  }\n  static getFullyQualifiedName() {\n    return 'TableA';\n  }\n  static startTableA(builder) {\n    builder.startObject(1);\n  }\n  static addB(builder, bOffset) {\n    builder.addFieldOffset(0, bOffset, 0);\n  }\n  static endTableA(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static createTableA(builder, bOffset) {\n    TableA.startTableA(builder);\n    TableA.addB(builder, bOffset);\n    return TableA.endTableA(builder);\n  }\n  serialize() {\n    return this.bb.bytes();\n  }\n  static deserialize(buffer) {\n    return TableA.getRootAsTableA(new flatbuffers.ByteBuffer(buffer));\n  }\n  unpack() {\n    return new TableAT((this.b() !== null ? this.b().unpack() : null));\n  }\n  unpackTo(_o) {\n    _o.b = (this.b() !== null ? this.b().unpack() : null);\n  }\n}\nexport class TableAT {\n  constructor(b = null) {\n    this.b = b;\n  }\n  pack(builder) {\n    const b = (this.b !== null ? this.b.pack(builder) : 0);\n    return TableA.createTableA(builder, b);\n  }\n}\n"
  },
  {
    "path": "tests/ts/table-a.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport {TableB, TableBT} from './my-game/other-name-space/table-b.js';\n\nexport class TableA implements flatbuffers.IUnpackableObject<TableAT> {\n  bb: flatbuffers.ByteBuffer | null = null;\n  bb_pos = 0;\n  __init(i: number, bb: flatbuffers.ByteBuffer): TableA {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n\n  static getRootAsTableA(bb: flatbuffers.ByteBuffer, obj?: TableA): TableA {\n    return (obj || new TableA()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  static getSizePrefixedRootAsTableA(\n    bb: flatbuffers.ByteBuffer,\n    obj?: TableA,\n  ): TableA {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new TableA()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  b(obj?: TableB): TableB | null {\n    const offset = this.bb!.__offset(this.bb_pos, 4);\n    return offset\n      ? (obj || new TableB()).__init(\n          this.bb!.__indirect(this.bb_pos + offset),\n          this.bb!,\n        )\n      : null;\n  }\n\n  static getFullyQualifiedName(): string {\n    return 'TableA';\n  }\n\n  static startTableA(builder: flatbuffers.Builder) {\n    builder.startObject(1);\n  }\n\n  static addB(builder: flatbuffers.Builder, bOffset: flatbuffers.Offset) {\n    builder.addFieldOffset(0, bOffset, 0);\n  }\n\n  static endTableA(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const offset = builder.endObject();\n    return offset;\n  }\n\n  static createTableA(\n    builder: flatbuffers.Builder,\n    bOffset: flatbuffers.Offset,\n  ): flatbuffers.Offset {\n    TableA.startTableA(builder);\n    TableA.addB(builder, bOffset);\n    return TableA.endTableA(builder);\n  }\n\n  serialize(): Uint8Array {\n    return this.bb!.bytes();\n  }\n\n  static deserialize(buffer: Uint8Array): TableA {\n    return TableA.getRootAsTableA(new flatbuffers.ByteBuffer(buffer));\n  }\n\n  unpack(): TableAT {\n    return new TableAT(this.b() !== null ? this.b()!.unpack() : null);\n  }\n\n  unpackTo(_o: TableAT): void {\n    _o.b = this.b() !== null ? this.b()!.unpack() : null;\n  }\n}\n\nexport class TableAT implements flatbuffers.IGeneratedObject {\n  constructor(public b: TableBT | null = null) {}\n\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const b = this.b !== null ? this.b!.pack(builder) : 0;\n\n    return TableA.createTableA(builder, b);\n  }\n}\n"
  },
  {
    "path": "tests/ts/test_dir/BUILD.bazel",
    "content": "load(\"@aspect_rules_js//js:defs.bzl\", \"js_test\")\nload(\"//:typescript.bzl\", \"flatbuffer_ts_library\")\n\nflatbuffer_ts_library(\n    name = \"typescript_transitive_ts_fbs\",\n    srcs = [\"typescript_transitive_include.fbs\"],\n    visibility = [\"//visibility:public\"],\n)\n\nflatbuffer_ts_library(\n    name = \"include_ts_fbs\",\n    srcs = [\"typescript_include.fbs\"],\n    visibility = [\"//visibility:public\"],\n    deps = [\":typescript_transitive_ts_fbs\"],\n)\n\njs_test(\n    name = \"import_test\",\n    chdir = package_name(),\n    data = [\n        \"package.json\",\n        \":include_ts_fbs\",\n        \"//tests/ts:node_modules/flatbuffers\",\n    ],\n    entry_point = \"import_test.js\",\n)\n"
  },
  {
    "path": "tests/ts/test_dir/import_test.js",
    "content": "import assert from 'assert'\nimport * as flatbuffers from 'flatbuffers'\n\nimport typescript_include from './typescript_include_generated.cjs'\n\nconst foobar = typescript_include.foobar;\n\nfunction main() {\n  // Validate the enums.\n  assert.strictEqual(foobar.Abc.a, 0);\n  assert.strictEqual(foobar.class_.arguments_, 0);\n\n  // Validate building a table.\n  var fbb = new flatbuffers.Builder(1);\n  var name = fbb.createString('Foo Bar');\n\n  foobar.Tab.startTab(fbb);\n  foobar.Tab.addAbc(fbb, foobar.Abc.a);\n  foobar.Tab.addArg(fbb, foobar.class_.arguments_);\n  foobar.Tab.addName(fbb, name);\n  var tab = foobar.Tab.endTab(fbb);\n\n  fbb.finish(tab);\n\n  // Call as a sanity check. Would be better to validate actual output here.\n  fbb.asUint8Array();\n\n  console.log('FlatBuffers Bazel Import test: completed successfully');\n}\n\nmain();\n"
  },
  {
    "path": "tests/ts/test_dir/package.json",
    "content": "{\n    \"type\": \"module\",\n    \"dependencies\": {\n        \"flatbuffers\": \"../../../\"\n    }\n}\n"
  },
  {
    "path": "tests/ts/test_dir/typescript_include.fbs",
    "content": "include 'typescript_transitive_include.fbs';\n\nnamespace foobar;\n\nenum class: int {\n  arguments,\n}\n\ntable Tab {\n  abc:Abc;\n  arg:class;\n  name:string;\n}\n"
  },
  {
    "path": "tests/ts/test_dir/typescript_transitive_include.fbs",
    "content": "namespace foobar;\n\nenum Abc: int {\n  a,\n}\n"
  },
  {
    "path": "tests/ts/ts-undefined-for-optionals/optional-scalars/optional-byte.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport enum OptionalByte {\n  None = 0,\n  One = 1,\n  Two = 2\n}\n"
  },
  {
    "path": "tests/ts/ts-undefined-for-optionals/optional-scalars/scalar-stuff.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport { OptionalByte } from '../optional-scalars/optional-byte.js';\n\n\nexport class ScalarStuff implements flatbuffers.IUnpackableObject<ScalarStuffT> {\n  bb: flatbuffers.ByteBuffer|undefined = undefined;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):ScalarStuff {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\nstatic getRootAsScalarStuff(bb:flatbuffers.ByteBuffer, obj?:ScalarStuff):ScalarStuff {\n  return (obj || new ScalarStuff()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic getSizePrefixedRootAsScalarStuff(bb:flatbuffers.ByteBuffer, obj?:ScalarStuff):ScalarStuff {\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n  return (obj || new ScalarStuff()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic bufferHasIdentifier(bb:flatbuffers.ByteBuffer):boolean {\n  return bb.__has_identifier('NULL');\n}\n\njustI8():number {\n  const offset = this.bb!.__offset(this.bb_pos, 4);\n  return offset ? this.bb!.readInt8(this.bb_pos + offset) : 0;\n}\n\nmaybeI8():number|undefined {\n  const offset = this.bb!.__offset(this.bb_pos, 6);\n  return offset ? this.bb!.readInt8(this.bb_pos + offset) : undefined;\n}\n\ndefaultI8():number {\n  const offset = this.bb!.__offset(this.bb_pos, 8);\n  return offset ? this.bb!.readInt8(this.bb_pos + offset) : 42;\n}\n\njustU8():number {\n  const offset = this.bb!.__offset(this.bb_pos, 10);\n  return offset ? this.bb!.readUint8(this.bb_pos + offset) : 0;\n}\n\nmaybeU8():number|undefined {\n  const offset = this.bb!.__offset(this.bb_pos, 12);\n  return offset ? this.bb!.readUint8(this.bb_pos + offset) : undefined;\n}\n\ndefaultU8():number {\n  const offset = this.bb!.__offset(this.bb_pos, 14);\n  return offset ? this.bb!.readUint8(this.bb_pos + offset) : 42;\n}\n\njustI16():number {\n  const offset = this.bb!.__offset(this.bb_pos, 16);\n  return offset ? this.bb!.readInt16(this.bb_pos + offset) : 0;\n}\n\nmaybeI16():number|undefined {\n  const offset = this.bb!.__offset(this.bb_pos, 18);\n  return offset ? this.bb!.readInt16(this.bb_pos + offset) : undefined;\n}\n\ndefaultI16():number {\n  const offset = this.bb!.__offset(this.bb_pos, 20);\n  return offset ? this.bb!.readInt16(this.bb_pos + offset) : 42;\n}\n\njustU16():number {\n  const offset = this.bb!.__offset(this.bb_pos, 22);\n  return offset ? this.bb!.readUint16(this.bb_pos + offset) : 0;\n}\n\nmaybeU16():number|undefined {\n  const offset = this.bb!.__offset(this.bb_pos, 24);\n  return offset ? this.bb!.readUint16(this.bb_pos + offset) : undefined;\n}\n\ndefaultU16():number {\n  const offset = this.bb!.__offset(this.bb_pos, 26);\n  return offset ? this.bb!.readUint16(this.bb_pos + offset) : 42;\n}\n\njustI32():number {\n  const offset = this.bb!.__offset(this.bb_pos, 28);\n  return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;\n}\n\nmaybeI32():number|undefined {\n  const offset = this.bb!.__offset(this.bb_pos, 30);\n  return offset ? this.bb!.readInt32(this.bb_pos + offset) : undefined;\n}\n\ndefaultI32():number {\n  const offset = this.bb!.__offset(this.bb_pos, 32);\n  return offset ? this.bb!.readInt32(this.bb_pos + offset) : 42;\n}\n\njustU32():number {\n  const offset = this.bb!.__offset(this.bb_pos, 34);\n  return offset ? this.bb!.readUint32(this.bb_pos + offset) : 0;\n}\n\nmaybeU32():number|undefined {\n  const offset = this.bb!.__offset(this.bb_pos, 36);\n  return offset ? this.bb!.readUint32(this.bb_pos + offset) : undefined;\n}\n\ndefaultU32():number {\n  const offset = this.bb!.__offset(this.bb_pos, 38);\n  return offset ? this.bb!.readUint32(this.bb_pos + offset) : 42;\n}\n\njustI64():bigint {\n  const offset = this.bb!.__offset(this.bb_pos, 40);\n  return offset ? this.bb!.readInt64(this.bb_pos + offset) : BigInt('0');\n}\n\nmaybeI64():bigint|undefined {\n  const offset = this.bb!.__offset(this.bb_pos, 42);\n  return offset ? this.bb!.readInt64(this.bb_pos + offset) : undefined;\n}\n\ndefaultI64():bigint {\n  const offset = this.bb!.__offset(this.bb_pos, 44);\n  return offset ? this.bb!.readInt64(this.bb_pos + offset) : BigInt('42');\n}\n\njustU64():bigint {\n  const offset = this.bb!.__offset(this.bb_pos, 46);\n  return offset ? this.bb!.readUint64(this.bb_pos + offset) : BigInt('0');\n}\n\nmaybeU64():bigint|undefined {\n  const offset = this.bb!.__offset(this.bb_pos, 48);\n  return offset ? this.bb!.readUint64(this.bb_pos + offset) : undefined;\n}\n\ndefaultU64():bigint {\n  const offset = this.bb!.__offset(this.bb_pos, 50);\n  return offset ? this.bb!.readUint64(this.bb_pos + offset) : BigInt('42');\n}\n\njustF32():number {\n  const offset = this.bb!.__offset(this.bb_pos, 52);\n  return offset ? this.bb!.readFloat32(this.bb_pos + offset) : 0.0;\n}\n\nmaybeF32():number|undefined {\n  const offset = this.bb!.__offset(this.bb_pos, 54);\n  return offset ? this.bb!.readFloat32(this.bb_pos + offset) : undefined;\n}\n\ndefaultF32():number {\n  const offset = this.bb!.__offset(this.bb_pos, 56);\n  return offset ? this.bb!.readFloat32(this.bb_pos + offset) : 42.0;\n}\n\njustF64():number {\n  const offset = this.bb!.__offset(this.bb_pos, 58);\n  return offset ? this.bb!.readFloat64(this.bb_pos + offset) : 0.0;\n}\n\nmaybeF64():number|undefined {\n  const offset = this.bb!.__offset(this.bb_pos, 60);\n  return offset ? this.bb!.readFloat64(this.bb_pos + offset) : undefined;\n}\n\ndefaultF64():number {\n  const offset = this.bb!.__offset(this.bb_pos, 62);\n  return offset ? this.bb!.readFloat64(this.bb_pos + offset) : 42.0;\n}\n\njustBool():boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 64);\n  return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false;\n}\n\nmaybeBool():boolean|undefined {\n  const offset = this.bb!.__offset(this.bb_pos, 66);\n  return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : undefined;\n}\n\ndefaultBool():boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 68);\n  return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : true;\n}\n\njustEnum():OptionalByte {\n  const offset = this.bb!.__offset(this.bb_pos, 70);\n  return offset ? this.bb!.readInt8(this.bb_pos + offset) : OptionalByte.None;\n}\n\nmaybeEnum():OptionalByte|undefined {\n  const offset = this.bb!.__offset(this.bb_pos, 72);\n  return offset ? this.bb!.readInt8(this.bb_pos + offset) : undefined;\n}\n\ndefaultEnum():OptionalByte {\n  const offset = this.bb!.__offset(this.bb_pos, 74);\n  return offset ? this.bb!.readInt8(this.bb_pos + offset) : OptionalByte.One;\n}\n\nstatic startScalarStuff(builder:flatbuffers.Builder) {\n  builder.startObject(36);\n}\n\nstatic addJustI8(builder:flatbuffers.Builder, justI8:number) {\n  builder.addFieldInt8(0, justI8, 0);\n}\n\nstatic addMaybeI8(builder:flatbuffers.Builder, maybeI8:number) {\n  builder.addFieldInt8(1, maybeI8, undefined);\n}\n\nstatic addDefaultI8(builder:flatbuffers.Builder, defaultI8:number) {\n  builder.addFieldInt8(2, defaultI8, 42);\n}\n\nstatic addJustU8(builder:flatbuffers.Builder, justU8:number) {\n  builder.addFieldInt8(3, justU8, 0);\n}\n\nstatic addMaybeU8(builder:flatbuffers.Builder, maybeU8:number) {\n  builder.addFieldInt8(4, maybeU8, undefined);\n}\n\nstatic addDefaultU8(builder:flatbuffers.Builder, defaultU8:number) {\n  builder.addFieldInt8(5, defaultU8, 42);\n}\n\nstatic addJustI16(builder:flatbuffers.Builder, justI16:number) {\n  builder.addFieldInt16(6, justI16, 0);\n}\n\nstatic addMaybeI16(builder:flatbuffers.Builder, maybeI16:number) {\n  builder.addFieldInt16(7, maybeI16, undefined);\n}\n\nstatic addDefaultI16(builder:flatbuffers.Builder, defaultI16:number) {\n  builder.addFieldInt16(8, defaultI16, 42);\n}\n\nstatic addJustU16(builder:flatbuffers.Builder, justU16:number) {\n  builder.addFieldInt16(9, justU16, 0);\n}\n\nstatic addMaybeU16(builder:flatbuffers.Builder, maybeU16:number) {\n  builder.addFieldInt16(10, maybeU16, undefined);\n}\n\nstatic addDefaultU16(builder:flatbuffers.Builder, defaultU16:number) {\n  builder.addFieldInt16(11, defaultU16, 42);\n}\n\nstatic addJustI32(builder:flatbuffers.Builder, justI32:number) {\n  builder.addFieldInt32(12, justI32, 0);\n}\n\nstatic addMaybeI32(builder:flatbuffers.Builder, maybeI32:number) {\n  builder.addFieldInt32(13, maybeI32, undefined);\n}\n\nstatic addDefaultI32(builder:flatbuffers.Builder, defaultI32:number) {\n  builder.addFieldInt32(14, defaultI32, 42);\n}\n\nstatic addJustU32(builder:flatbuffers.Builder, justU32:number) {\n  builder.addFieldInt32(15, justU32, 0);\n}\n\nstatic addMaybeU32(builder:flatbuffers.Builder, maybeU32:number) {\n  builder.addFieldInt32(16, maybeU32, undefined);\n}\n\nstatic addDefaultU32(builder:flatbuffers.Builder, defaultU32:number) {\n  builder.addFieldInt32(17, defaultU32, 42);\n}\n\nstatic addJustI64(builder:flatbuffers.Builder, justI64:bigint) {\n  builder.addFieldInt64(18, justI64, BigInt('0'));\n}\n\nstatic addMaybeI64(builder:flatbuffers.Builder, maybeI64:bigint) {\n  builder.addFieldInt64(19, maybeI64, undefined);\n}\n\nstatic addDefaultI64(builder:flatbuffers.Builder, defaultI64:bigint) {\n  builder.addFieldInt64(20, defaultI64, BigInt('42'));\n}\n\nstatic addJustU64(builder:flatbuffers.Builder, justU64:bigint) {\n  builder.addFieldInt64(21, justU64, BigInt('0'));\n}\n\nstatic addMaybeU64(builder:flatbuffers.Builder, maybeU64:bigint) {\n  builder.addFieldInt64(22, maybeU64, undefined);\n}\n\nstatic addDefaultU64(builder:flatbuffers.Builder, defaultU64:bigint) {\n  builder.addFieldInt64(23, defaultU64, BigInt('42'));\n}\n\nstatic addJustF32(builder:flatbuffers.Builder, justF32:number) {\n  builder.addFieldFloat32(24, justF32, 0.0);\n}\n\nstatic addMaybeF32(builder:flatbuffers.Builder, maybeF32:number) {\n  builder.addFieldFloat32(25, maybeF32, undefined);\n}\n\nstatic addDefaultF32(builder:flatbuffers.Builder, defaultF32:number) {\n  builder.addFieldFloat32(26, defaultF32, 42.0);\n}\n\nstatic addJustF64(builder:flatbuffers.Builder, justF64:number) {\n  builder.addFieldFloat64(27, justF64, 0.0);\n}\n\nstatic addMaybeF64(builder:flatbuffers.Builder, maybeF64:number) {\n  builder.addFieldFloat64(28, maybeF64, undefined);\n}\n\nstatic addDefaultF64(builder:flatbuffers.Builder, defaultF64:number) {\n  builder.addFieldFloat64(29, defaultF64, 42.0);\n}\n\nstatic addJustBool(builder:flatbuffers.Builder, justBool:boolean) {\n  builder.addFieldInt8(30, +justBool, +false);\n}\n\nstatic addMaybeBool(builder:flatbuffers.Builder, maybeBool:boolean) {\n  builder.addFieldInt8(31, +maybeBool, undefined);\n}\n\nstatic addDefaultBool(builder:flatbuffers.Builder, defaultBool:boolean) {\n  builder.addFieldInt8(32, +defaultBool, +true);\n}\n\nstatic addJustEnum(builder:flatbuffers.Builder, justEnum:OptionalByte) {\n  builder.addFieldInt8(33, justEnum, OptionalByte.None);\n}\n\nstatic addMaybeEnum(builder:flatbuffers.Builder, maybeEnum:OptionalByte) {\n  builder.addFieldInt8(34, maybeEnum, undefined);\n}\n\nstatic addDefaultEnum(builder:flatbuffers.Builder, defaultEnum:OptionalByte) {\n  builder.addFieldInt8(35, defaultEnum, OptionalByte.One);\n}\n\nstatic endScalarStuff(builder:flatbuffers.Builder):flatbuffers.Offset {\n  const offset = builder.endObject();\n  return offset;\n}\n\nstatic finishScalarStuffBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) {\n  builder.finish(offset, 'NULL');\n}\n\nstatic finishSizePrefixedScalarStuffBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) {\n  builder.finish(offset, 'NULL', true);\n}\n\nstatic createScalarStuff(builder:flatbuffers.Builder, justI8:number, maybeI8:number|undefined, defaultI8:number, justU8:number, maybeU8:number|undefined, defaultU8:number, justI16:number, maybeI16:number|undefined, defaultI16:number, justU16:number, maybeU16:number|undefined, defaultU16:number, justI32:number, maybeI32:number|undefined, defaultI32:number, justU32:number, maybeU32:number|undefined, defaultU32:number, justI64:bigint, maybeI64:bigint|undefined, defaultI64:bigint, justU64:bigint, maybeU64:bigint|undefined, defaultU64:bigint, justF32:number, maybeF32:number|undefined, defaultF32:number, justF64:number, maybeF64:number|undefined, defaultF64:number, justBool:boolean, maybeBool:boolean|undefined, defaultBool:boolean, justEnum:OptionalByte, maybeEnum:OptionalByte|undefined, defaultEnum:OptionalByte):flatbuffers.Offset {\n  ScalarStuff.startScalarStuff(builder);\n  ScalarStuff.addJustI8(builder, justI8);\n  if (maybeI8 !== undefined)\n    ScalarStuff.addMaybeI8(builder, maybeI8);\n  ScalarStuff.addDefaultI8(builder, defaultI8);\n  ScalarStuff.addJustU8(builder, justU8);\n  if (maybeU8 !== undefined)\n    ScalarStuff.addMaybeU8(builder, maybeU8);\n  ScalarStuff.addDefaultU8(builder, defaultU8);\n  ScalarStuff.addJustI16(builder, justI16);\n  if (maybeI16 !== undefined)\n    ScalarStuff.addMaybeI16(builder, maybeI16);\n  ScalarStuff.addDefaultI16(builder, defaultI16);\n  ScalarStuff.addJustU16(builder, justU16);\n  if (maybeU16 !== undefined)\n    ScalarStuff.addMaybeU16(builder, maybeU16);\n  ScalarStuff.addDefaultU16(builder, defaultU16);\n  ScalarStuff.addJustI32(builder, justI32);\n  if (maybeI32 !== undefined)\n    ScalarStuff.addMaybeI32(builder, maybeI32);\n  ScalarStuff.addDefaultI32(builder, defaultI32);\n  ScalarStuff.addJustU32(builder, justU32);\n  if (maybeU32 !== undefined)\n    ScalarStuff.addMaybeU32(builder, maybeU32);\n  ScalarStuff.addDefaultU32(builder, defaultU32);\n  ScalarStuff.addJustI64(builder, justI64);\n  if (maybeI64 !== undefined)\n    ScalarStuff.addMaybeI64(builder, maybeI64);\n  ScalarStuff.addDefaultI64(builder, defaultI64);\n  ScalarStuff.addJustU64(builder, justU64);\n  if (maybeU64 !== undefined)\n    ScalarStuff.addMaybeU64(builder, maybeU64);\n  ScalarStuff.addDefaultU64(builder, defaultU64);\n  ScalarStuff.addJustF32(builder, justF32);\n  if (maybeF32 !== undefined)\n    ScalarStuff.addMaybeF32(builder, maybeF32);\n  ScalarStuff.addDefaultF32(builder, defaultF32);\n  ScalarStuff.addJustF64(builder, justF64);\n  if (maybeF64 !== undefined)\n    ScalarStuff.addMaybeF64(builder, maybeF64);\n  ScalarStuff.addDefaultF64(builder, defaultF64);\n  ScalarStuff.addJustBool(builder, justBool);\n  if (maybeBool !== undefined)\n    ScalarStuff.addMaybeBool(builder, maybeBool);\n  ScalarStuff.addDefaultBool(builder, defaultBool);\n  ScalarStuff.addJustEnum(builder, justEnum);\n  if (maybeEnum !== undefined)\n    ScalarStuff.addMaybeEnum(builder, maybeEnum);\n  ScalarStuff.addDefaultEnum(builder, defaultEnum);\n  return ScalarStuff.endScalarStuff(builder);\n}\n\nunpack(): ScalarStuffT {\n  return new ScalarStuffT(\n    this.justI8(),\n    this.maybeI8(),\n    this.defaultI8(),\n    this.justU8(),\n    this.maybeU8(),\n    this.defaultU8(),\n    this.justI16(),\n    this.maybeI16(),\n    this.defaultI16(),\n    this.justU16(),\n    this.maybeU16(),\n    this.defaultU16(),\n    this.justI32(),\n    this.maybeI32(),\n    this.defaultI32(),\n    this.justU32(),\n    this.maybeU32(),\n    this.defaultU32(),\n    this.justI64(),\n    this.maybeI64(),\n    this.defaultI64(),\n    this.justU64(),\n    this.maybeU64(),\n    this.defaultU64(),\n    this.justF32(),\n    this.maybeF32(),\n    this.defaultF32(),\n    this.justF64(),\n    this.maybeF64(),\n    this.defaultF64(),\n    this.justBool(),\n    this.maybeBool(),\n    this.defaultBool(),\n    this.justEnum(),\n    this.maybeEnum(),\n    this.defaultEnum()\n  );\n}\n\n\nunpackTo(_o: ScalarStuffT): void {\n  _o.justI8 = this.justI8();\n  _o.maybeI8 = this.maybeI8();\n  _o.defaultI8 = this.defaultI8();\n  _o.justU8 = this.justU8();\n  _o.maybeU8 = this.maybeU8();\n  _o.defaultU8 = this.defaultU8();\n  _o.justI16 = this.justI16();\n  _o.maybeI16 = this.maybeI16();\n  _o.defaultI16 = this.defaultI16();\n  _o.justU16 = this.justU16();\n  _o.maybeU16 = this.maybeU16();\n  _o.defaultU16 = this.defaultU16();\n  _o.justI32 = this.justI32();\n  _o.maybeI32 = this.maybeI32();\n  _o.defaultI32 = this.defaultI32();\n  _o.justU32 = this.justU32();\n  _o.maybeU32 = this.maybeU32();\n  _o.defaultU32 = this.defaultU32();\n  _o.justI64 = this.justI64();\n  _o.maybeI64 = this.maybeI64();\n  _o.defaultI64 = this.defaultI64();\n  _o.justU64 = this.justU64();\n  _o.maybeU64 = this.maybeU64();\n  _o.defaultU64 = this.defaultU64();\n  _o.justF32 = this.justF32();\n  _o.maybeF32 = this.maybeF32();\n  _o.defaultF32 = this.defaultF32();\n  _o.justF64 = this.justF64();\n  _o.maybeF64 = this.maybeF64();\n  _o.defaultF64 = this.defaultF64();\n  _o.justBool = this.justBool();\n  _o.maybeBool = this.maybeBool();\n  _o.defaultBool = this.defaultBool();\n  _o.justEnum = this.justEnum();\n  _o.maybeEnum = this.maybeEnum();\n  _o.defaultEnum = this.defaultEnum();\n}\n}\n\nexport class ScalarStuffT implements flatbuffers.IGeneratedObject {\nconstructor(\n  public justI8: number = 0,\n  public maybeI8: number|undefined = undefined,\n  public defaultI8: number = 42,\n  public justU8: number = 0,\n  public maybeU8: number|undefined = undefined,\n  public defaultU8: number = 42,\n  public justI16: number = 0,\n  public maybeI16: number|undefined = undefined,\n  public defaultI16: number = 42,\n  public justU16: number = 0,\n  public maybeU16: number|undefined = undefined,\n  public defaultU16: number = 42,\n  public justI32: number = 0,\n  public maybeI32: number|undefined = undefined,\n  public defaultI32: number = 42,\n  public justU32: number = 0,\n  public maybeU32: number|undefined = undefined,\n  public defaultU32: number = 42,\n  public justI64: bigint = BigInt('0'),\n  public maybeI64: bigint|undefined = undefined,\n  public defaultI64: bigint = BigInt('42'),\n  public justU64: bigint = BigInt('0'),\n  public maybeU64: bigint|undefined = undefined,\n  public defaultU64: bigint = BigInt('42'),\n  public justF32: number = 0.0,\n  public maybeF32: number|undefined = undefined,\n  public defaultF32: number = 42.0,\n  public justF64: number = 0.0,\n  public maybeF64: number|undefined = undefined,\n  public defaultF64: number = 42.0,\n  public justBool: boolean = false,\n  public maybeBool: boolean|undefined = undefined,\n  public defaultBool: boolean = true,\n  public justEnum: OptionalByte = OptionalByte.None,\n  public maybeEnum: OptionalByte|undefined = undefined,\n  public defaultEnum: OptionalByte = OptionalByte.One\n){}\n\n\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n  return ScalarStuff.createScalarStuff(builder,\n    this.justI8,\n    this.maybeI8,\n    this.defaultI8,\n    this.justU8,\n    this.maybeU8,\n    this.defaultU8,\n    this.justI16,\n    this.maybeI16,\n    this.defaultI16,\n    this.justU16,\n    this.maybeU16,\n    this.defaultU16,\n    this.justI32,\n    this.maybeI32,\n    this.defaultI32,\n    this.justU32,\n    this.maybeU32,\n    this.defaultU32,\n    this.justI64,\n    this.maybeI64,\n    this.defaultI64,\n    this.justU64,\n    this.maybeU64,\n    this.defaultU64,\n    this.justF32,\n    this.maybeF32,\n    this.defaultF32,\n    this.justF64,\n    this.maybeF64,\n    this.defaultF64,\n    this.justBool,\n    this.maybeBool,\n    this.defaultBool,\n    this.justEnum,\n    this.maybeEnum,\n    this.defaultEnum\n  );\n}\n}\n"
  },
  {
    "path": "tests/ts/ts-undefined-for-optionals/optional-scalars.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport { OptionalByte } from './optional-scalars/optional-byte.js';\nexport { ScalarStuff, ScalarStuffT } from './optional-scalars/scalar-stuff.js';\n"
  },
  {
    "path": "tests/ts/ts-undefined-for-optionals/optional_scalars.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport * as optional_scalars from './optional-scalars.js';\n"
  },
  {
    "path": "tests/ts/ts-undefined-for-optionals/optional_scalars_generated.cjs",
    "content": "\"use strict\";\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n  for (var name in all)\n    __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n  if (from && typeof from === \"object\" || typeof from === \"function\") {\n    for (let key of __getOwnPropNames(from))\n      if (!__hasOwnProp.call(to, key) && key !== except)\n        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n  }\n  return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n  // If the importer is in node compatibility mode or this is not an ESM\n  // file that has been converted to a CommonJS file using a Babel-\n  // compatible transform (i.e. \"__esModule\" has not been set), then set\n  // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n  isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n  mod\n));\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// ts-undefined-for-optionals/optional_scalars.ts\nvar optional_scalars_exports2 = {};\n__export(optional_scalars_exports2, {\n  optional_scalars: () => optional_scalars_exports\n});\nmodule.exports = __toCommonJS(optional_scalars_exports2);\n\n// ts-undefined-for-optionals/optional-scalars.ts\nvar optional_scalars_exports = {};\n__export(optional_scalars_exports, {\n  OptionalByte: () => OptionalByte,\n  ScalarStuff: () => ScalarStuff,\n  ScalarStuffT: () => ScalarStuffT\n});\n\n// ts-undefined-for-optionals/optional-scalars/optional-byte.ts\nvar OptionalByte = /* @__PURE__ */ ((OptionalByte2) => {\n  OptionalByte2[OptionalByte2[\"None\"] = 0] = \"None\";\n  OptionalByte2[OptionalByte2[\"One\"] = 1] = \"One\";\n  OptionalByte2[OptionalByte2[\"Two\"] = 2] = \"Two\";\n  return OptionalByte2;\n})(OptionalByte || {});\n\n// ts-undefined-for-optionals/optional-scalars/scalar-stuff.ts\nvar flatbuffers = __toESM(require(\"flatbuffers\"), 1);\nvar ScalarStuff = class _ScalarStuff {\n  constructor() {\n    this.bb = void 0;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsScalarStuff(bb, obj) {\n    return (obj || new _ScalarStuff()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsScalarStuff(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new _ScalarStuff()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static bufferHasIdentifier(bb) {\n    return bb.__has_identifier(\"NULL\");\n  }\n  justI8() {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.readInt8(this.bb_pos + offset) : 0;\n  }\n  maybeI8() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.readInt8(this.bb_pos + offset) : void 0;\n  }\n  defaultI8() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? this.bb.readInt8(this.bb_pos + offset) : 42;\n  }\n  justU8() {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.readUint8(this.bb_pos + offset) : 0;\n  }\n  maybeU8() {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.readUint8(this.bb_pos + offset) : void 0;\n  }\n  defaultU8() {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.readUint8(this.bb_pos + offset) : 42;\n  }\n  justI16() {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    return offset ? this.bb.readInt16(this.bb_pos + offset) : 0;\n  }\n  maybeI16() {\n    const offset = this.bb.__offset(this.bb_pos, 18);\n    return offset ? this.bb.readInt16(this.bb_pos + offset) : void 0;\n  }\n  defaultI16() {\n    const offset = this.bb.__offset(this.bb_pos, 20);\n    return offset ? this.bb.readInt16(this.bb_pos + offset) : 42;\n  }\n  justU16() {\n    const offset = this.bb.__offset(this.bb_pos, 22);\n    return offset ? this.bb.readUint16(this.bb_pos + offset) : 0;\n  }\n  maybeU16() {\n    const offset = this.bb.__offset(this.bb_pos, 24);\n    return offset ? this.bb.readUint16(this.bb_pos + offset) : void 0;\n  }\n  defaultU16() {\n    const offset = this.bb.__offset(this.bb_pos, 26);\n    return offset ? this.bb.readUint16(this.bb_pos + offset) : 42;\n  }\n  justI32() {\n    const offset = this.bb.__offset(this.bb_pos, 28);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n  }\n  maybeI32() {\n    const offset = this.bb.__offset(this.bb_pos, 30);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : void 0;\n  }\n  defaultI32() {\n    const offset = this.bb.__offset(this.bb_pos, 32);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : 42;\n  }\n  justU32() {\n    const offset = this.bb.__offset(this.bb_pos, 34);\n    return offset ? this.bb.readUint32(this.bb_pos + offset) : 0;\n  }\n  maybeU32() {\n    const offset = this.bb.__offset(this.bb_pos, 36);\n    return offset ? this.bb.readUint32(this.bb_pos + offset) : void 0;\n  }\n  defaultU32() {\n    const offset = this.bb.__offset(this.bb_pos, 38);\n    return offset ? this.bb.readUint32(this.bb_pos + offset) : 42;\n  }\n  justI64() {\n    const offset = this.bb.__offset(this.bb_pos, 40);\n    return offset ? this.bb.readInt64(this.bb_pos + offset) : BigInt(\"0\");\n  }\n  maybeI64() {\n    const offset = this.bb.__offset(this.bb_pos, 42);\n    return offset ? this.bb.readInt64(this.bb_pos + offset) : void 0;\n  }\n  defaultI64() {\n    const offset = this.bb.__offset(this.bb_pos, 44);\n    return offset ? this.bb.readInt64(this.bb_pos + offset) : BigInt(\"42\");\n  }\n  justU64() {\n    const offset = this.bb.__offset(this.bb_pos, 46);\n    return offset ? this.bb.readUint64(this.bb_pos + offset) : BigInt(\"0\");\n  }\n  maybeU64() {\n    const offset = this.bb.__offset(this.bb_pos, 48);\n    return offset ? this.bb.readUint64(this.bb_pos + offset) : void 0;\n  }\n  defaultU64() {\n    const offset = this.bb.__offset(this.bb_pos, 50);\n    return offset ? this.bb.readUint64(this.bb_pos + offset) : BigInt(\"42\");\n  }\n  justF32() {\n    const offset = this.bb.__offset(this.bb_pos, 52);\n    return offset ? this.bb.readFloat32(this.bb_pos + offset) : 0;\n  }\n  maybeF32() {\n    const offset = this.bb.__offset(this.bb_pos, 54);\n    return offset ? this.bb.readFloat32(this.bb_pos + offset) : void 0;\n  }\n  defaultF32() {\n    const offset = this.bb.__offset(this.bb_pos, 56);\n    return offset ? this.bb.readFloat32(this.bb_pos + offset) : 42;\n  }\n  justF64() {\n    const offset = this.bb.__offset(this.bb_pos, 58);\n    return offset ? this.bb.readFloat64(this.bb_pos + offset) : 0;\n  }\n  maybeF64() {\n    const offset = this.bb.__offset(this.bb_pos, 60);\n    return offset ? this.bb.readFloat64(this.bb_pos + offset) : void 0;\n  }\n  defaultF64() {\n    const offset = this.bb.__offset(this.bb_pos, 62);\n    return offset ? this.bb.readFloat64(this.bb_pos + offset) : 42;\n  }\n  justBool() {\n    const offset = this.bb.__offset(this.bb_pos, 64);\n    return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false;\n  }\n  maybeBool() {\n    const offset = this.bb.__offset(this.bb_pos, 66);\n    return offset ? !!this.bb.readInt8(this.bb_pos + offset) : void 0;\n  }\n  defaultBool() {\n    const offset = this.bb.__offset(this.bb_pos, 68);\n    return offset ? !!this.bb.readInt8(this.bb_pos + offset) : true;\n  }\n  justEnum() {\n    const offset = this.bb.__offset(this.bb_pos, 70);\n    return offset ? this.bb.readInt8(this.bb_pos + offset) : 0 /* None */;\n  }\n  maybeEnum() {\n    const offset = this.bb.__offset(this.bb_pos, 72);\n    return offset ? this.bb.readInt8(this.bb_pos + offset) : void 0;\n  }\n  defaultEnum() {\n    const offset = this.bb.__offset(this.bb_pos, 74);\n    return offset ? this.bb.readInt8(this.bb_pos + offset) : 1 /* One */;\n  }\n  static startScalarStuff(builder) {\n    builder.startObject(36);\n  }\n  static addJustI8(builder, justI8) {\n    builder.addFieldInt8(0, justI8, 0);\n  }\n  static addMaybeI8(builder, maybeI8) {\n    builder.addFieldInt8(1, maybeI8, void 0);\n  }\n  static addDefaultI8(builder, defaultI8) {\n    builder.addFieldInt8(2, defaultI8, 42);\n  }\n  static addJustU8(builder, justU8) {\n    builder.addFieldInt8(3, justU8, 0);\n  }\n  static addMaybeU8(builder, maybeU8) {\n    builder.addFieldInt8(4, maybeU8, void 0);\n  }\n  static addDefaultU8(builder, defaultU8) {\n    builder.addFieldInt8(5, defaultU8, 42);\n  }\n  static addJustI16(builder, justI16) {\n    builder.addFieldInt16(6, justI16, 0);\n  }\n  static addMaybeI16(builder, maybeI16) {\n    builder.addFieldInt16(7, maybeI16, void 0);\n  }\n  static addDefaultI16(builder, defaultI16) {\n    builder.addFieldInt16(8, defaultI16, 42);\n  }\n  static addJustU16(builder, justU16) {\n    builder.addFieldInt16(9, justU16, 0);\n  }\n  static addMaybeU16(builder, maybeU16) {\n    builder.addFieldInt16(10, maybeU16, void 0);\n  }\n  static addDefaultU16(builder, defaultU16) {\n    builder.addFieldInt16(11, defaultU16, 42);\n  }\n  static addJustI32(builder, justI32) {\n    builder.addFieldInt32(12, justI32, 0);\n  }\n  static addMaybeI32(builder, maybeI32) {\n    builder.addFieldInt32(13, maybeI32, void 0);\n  }\n  static addDefaultI32(builder, defaultI32) {\n    builder.addFieldInt32(14, defaultI32, 42);\n  }\n  static addJustU32(builder, justU32) {\n    builder.addFieldInt32(15, justU32, 0);\n  }\n  static addMaybeU32(builder, maybeU32) {\n    builder.addFieldInt32(16, maybeU32, void 0);\n  }\n  static addDefaultU32(builder, defaultU32) {\n    builder.addFieldInt32(17, defaultU32, 42);\n  }\n  static addJustI64(builder, justI64) {\n    builder.addFieldInt64(18, justI64, BigInt(\"0\"));\n  }\n  static addMaybeI64(builder, maybeI64) {\n    builder.addFieldInt64(19, maybeI64, void 0);\n  }\n  static addDefaultI64(builder, defaultI64) {\n    builder.addFieldInt64(20, defaultI64, BigInt(\"42\"));\n  }\n  static addJustU64(builder, justU64) {\n    builder.addFieldInt64(21, justU64, BigInt(\"0\"));\n  }\n  static addMaybeU64(builder, maybeU64) {\n    builder.addFieldInt64(22, maybeU64, void 0);\n  }\n  static addDefaultU64(builder, defaultU64) {\n    builder.addFieldInt64(23, defaultU64, BigInt(\"42\"));\n  }\n  static addJustF32(builder, justF32) {\n    builder.addFieldFloat32(24, justF32, 0);\n  }\n  static addMaybeF32(builder, maybeF32) {\n    builder.addFieldFloat32(25, maybeF32, void 0);\n  }\n  static addDefaultF32(builder, defaultF32) {\n    builder.addFieldFloat32(26, defaultF32, 42);\n  }\n  static addJustF64(builder, justF64) {\n    builder.addFieldFloat64(27, justF64, 0);\n  }\n  static addMaybeF64(builder, maybeF64) {\n    builder.addFieldFloat64(28, maybeF64, void 0);\n  }\n  static addDefaultF64(builder, defaultF64) {\n    builder.addFieldFloat64(29, defaultF64, 42);\n  }\n  static addJustBool(builder, justBool) {\n    builder.addFieldInt8(30, +justBool, 0);\n  }\n  static addMaybeBool(builder, maybeBool) {\n    builder.addFieldInt8(31, +maybeBool, void 0);\n  }\n  static addDefaultBool(builder, defaultBool) {\n    builder.addFieldInt8(32, +defaultBool, 1);\n  }\n  static addJustEnum(builder, justEnum) {\n    builder.addFieldInt8(33, justEnum, 0 /* None */);\n  }\n  static addMaybeEnum(builder, maybeEnum) {\n    builder.addFieldInt8(34, maybeEnum, void 0);\n  }\n  static addDefaultEnum(builder, defaultEnum) {\n    builder.addFieldInt8(35, defaultEnum, 1 /* One */);\n  }\n  static endScalarStuff(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static finishScalarStuffBuffer(builder, offset) {\n    builder.finish(offset, \"NULL\");\n  }\n  static finishSizePrefixedScalarStuffBuffer(builder, offset) {\n    builder.finish(offset, \"NULL\", true);\n  }\n  static createScalarStuff(builder, justI8, maybeI8, defaultI8, justU8, maybeU8, defaultU8, justI16, maybeI16, defaultI16, justU16, maybeU16, defaultU16, justI32, maybeI32, defaultI32, justU32, maybeU32, defaultU32, justI64, maybeI64, defaultI64, justU64, maybeU64, defaultU64, justF32, maybeF32, defaultF32, justF64, maybeF64, defaultF64, justBool, maybeBool, defaultBool, justEnum, maybeEnum, defaultEnum) {\n    _ScalarStuff.startScalarStuff(builder);\n    _ScalarStuff.addJustI8(builder, justI8);\n    if (maybeI8 !== void 0)\n      _ScalarStuff.addMaybeI8(builder, maybeI8);\n    _ScalarStuff.addDefaultI8(builder, defaultI8);\n    _ScalarStuff.addJustU8(builder, justU8);\n    if (maybeU8 !== void 0)\n      _ScalarStuff.addMaybeU8(builder, maybeU8);\n    _ScalarStuff.addDefaultU8(builder, defaultU8);\n    _ScalarStuff.addJustI16(builder, justI16);\n    if (maybeI16 !== void 0)\n      _ScalarStuff.addMaybeI16(builder, maybeI16);\n    _ScalarStuff.addDefaultI16(builder, defaultI16);\n    _ScalarStuff.addJustU16(builder, justU16);\n    if (maybeU16 !== void 0)\n      _ScalarStuff.addMaybeU16(builder, maybeU16);\n    _ScalarStuff.addDefaultU16(builder, defaultU16);\n    _ScalarStuff.addJustI32(builder, justI32);\n    if (maybeI32 !== void 0)\n      _ScalarStuff.addMaybeI32(builder, maybeI32);\n    _ScalarStuff.addDefaultI32(builder, defaultI32);\n    _ScalarStuff.addJustU32(builder, justU32);\n    if (maybeU32 !== void 0)\n      _ScalarStuff.addMaybeU32(builder, maybeU32);\n    _ScalarStuff.addDefaultU32(builder, defaultU32);\n    _ScalarStuff.addJustI64(builder, justI64);\n    if (maybeI64 !== void 0)\n      _ScalarStuff.addMaybeI64(builder, maybeI64);\n    _ScalarStuff.addDefaultI64(builder, defaultI64);\n    _ScalarStuff.addJustU64(builder, justU64);\n    if (maybeU64 !== void 0)\n      _ScalarStuff.addMaybeU64(builder, maybeU64);\n    _ScalarStuff.addDefaultU64(builder, defaultU64);\n    _ScalarStuff.addJustF32(builder, justF32);\n    if (maybeF32 !== void 0)\n      _ScalarStuff.addMaybeF32(builder, maybeF32);\n    _ScalarStuff.addDefaultF32(builder, defaultF32);\n    _ScalarStuff.addJustF64(builder, justF64);\n    if (maybeF64 !== void 0)\n      _ScalarStuff.addMaybeF64(builder, maybeF64);\n    _ScalarStuff.addDefaultF64(builder, defaultF64);\n    _ScalarStuff.addJustBool(builder, justBool);\n    if (maybeBool !== void 0)\n      _ScalarStuff.addMaybeBool(builder, maybeBool);\n    _ScalarStuff.addDefaultBool(builder, defaultBool);\n    _ScalarStuff.addJustEnum(builder, justEnum);\n    if (maybeEnum !== void 0)\n      _ScalarStuff.addMaybeEnum(builder, maybeEnum);\n    _ScalarStuff.addDefaultEnum(builder, defaultEnum);\n    return _ScalarStuff.endScalarStuff(builder);\n  }\n  unpack() {\n    return new ScalarStuffT(\n      this.justI8(),\n      this.maybeI8(),\n      this.defaultI8(),\n      this.justU8(),\n      this.maybeU8(),\n      this.defaultU8(),\n      this.justI16(),\n      this.maybeI16(),\n      this.defaultI16(),\n      this.justU16(),\n      this.maybeU16(),\n      this.defaultU16(),\n      this.justI32(),\n      this.maybeI32(),\n      this.defaultI32(),\n      this.justU32(),\n      this.maybeU32(),\n      this.defaultU32(),\n      this.justI64(),\n      this.maybeI64(),\n      this.defaultI64(),\n      this.justU64(),\n      this.maybeU64(),\n      this.defaultU64(),\n      this.justF32(),\n      this.maybeF32(),\n      this.defaultF32(),\n      this.justF64(),\n      this.maybeF64(),\n      this.defaultF64(),\n      this.justBool(),\n      this.maybeBool(),\n      this.defaultBool(),\n      this.justEnum(),\n      this.maybeEnum(),\n      this.defaultEnum()\n    );\n  }\n  unpackTo(_o) {\n    _o.justI8 = this.justI8();\n    _o.maybeI8 = this.maybeI8();\n    _o.defaultI8 = this.defaultI8();\n    _o.justU8 = this.justU8();\n    _o.maybeU8 = this.maybeU8();\n    _o.defaultU8 = this.defaultU8();\n    _o.justI16 = this.justI16();\n    _o.maybeI16 = this.maybeI16();\n    _o.defaultI16 = this.defaultI16();\n    _o.justU16 = this.justU16();\n    _o.maybeU16 = this.maybeU16();\n    _o.defaultU16 = this.defaultU16();\n    _o.justI32 = this.justI32();\n    _o.maybeI32 = this.maybeI32();\n    _o.defaultI32 = this.defaultI32();\n    _o.justU32 = this.justU32();\n    _o.maybeU32 = this.maybeU32();\n    _o.defaultU32 = this.defaultU32();\n    _o.justI64 = this.justI64();\n    _o.maybeI64 = this.maybeI64();\n    _o.defaultI64 = this.defaultI64();\n    _o.justU64 = this.justU64();\n    _o.maybeU64 = this.maybeU64();\n    _o.defaultU64 = this.defaultU64();\n    _o.justF32 = this.justF32();\n    _o.maybeF32 = this.maybeF32();\n    _o.defaultF32 = this.defaultF32();\n    _o.justF64 = this.justF64();\n    _o.maybeF64 = this.maybeF64();\n    _o.defaultF64 = this.defaultF64();\n    _o.justBool = this.justBool();\n    _o.maybeBool = this.maybeBool();\n    _o.defaultBool = this.defaultBool();\n    _o.justEnum = this.justEnum();\n    _o.maybeEnum = this.maybeEnum();\n    _o.defaultEnum = this.defaultEnum();\n  }\n};\nvar ScalarStuffT = class {\n  constructor(justI8 = 0, maybeI8 = void 0, defaultI8 = 42, justU8 = 0, maybeU8 = void 0, defaultU8 = 42, justI16 = 0, maybeI16 = void 0, defaultI16 = 42, justU16 = 0, maybeU16 = void 0, defaultU16 = 42, justI32 = 0, maybeI32 = void 0, defaultI32 = 42, justU32 = 0, maybeU32 = void 0, defaultU32 = 42, justI64 = BigInt(\"0\"), maybeI64 = void 0, defaultI64 = BigInt(\"42\"), justU64 = BigInt(\"0\"), maybeU64 = void 0, defaultU64 = BigInt(\"42\"), justF32 = 0, maybeF32 = void 0, defaultF32 = 42, justF64 = 0, maybeF64 = void 0, defaultF64 = 42, justBool = false, maybeBool = void 0, defaultBool = true, justEnum = 0 /* None */, maybeEnum = void 0, defaultEnum = 1 /* One */) {\n    this.justI8 = justI8;\n    this.maybeI8 = maybeI8;\n    this.defaultI8 = defaultI8;\n    this.justU8 = justU8;\n    this.maybeU8 = maybeU8;\n    this.defaultU8 = defaultU8;\n    this.justI16 = justI16;\n    this.maybeI16 = maybeI16;\n    this.defaultI16 = defaultI16;\n    this.justU16 = justU16;\n    this.maybeU16 = maybeU16;\n    this.defaultU16 = defaultU16;\n    this.justI32 = justI32;\n    this.maybeI32 = maybeI32;\n    this.defaultI32 = defaultI32;\n    this.justU32 = justU32;\n    this.maybeU32 = maybeU32;\n    this.defaultU32 = defaultU32;\n    this.justI64 = justI64;\n    this.maybeI64 = maybeI64;\n    this.defaultI64 = defaultI64;\n    this.justU64 = justU64;\n    this.maybeU64 = maybeU64;\n    this.defaultU64 = defaultU64;\n    this.justF32 = justF32;\n    this.maybeF32 = maybeF32;\n    this.defaultF32 = defaultF32;\n    this.justF64 = justF64;\n    this.maybeF64 = maybeF64;\n    this.defaultF64 = defaultF64;\n    this.justBool = justBool;\n    this.maybeBool = maybeBool;\n    this.defaultBool = defaultBool;\n    this.justEnum = justEnum;\n    this.maybeEnum = maybeEnum;\n    this.defaultEnum = defaultEnum;\n  }\n  pack(builder) {\n    return ScalarStuff.createScalarStuff(\n      builder,\n      this.justI8,\n      this.maybeI8,\n      this.defaultI8,\n      this.justU8,\n      this.maybeU8,\n      this.defaultU8,\n      this.justI16,\n      this.maybeI16,\n      this.defaultI16,\n      this.justU16,\n      this.maybeU16,\n      this.defaultU16,\n      this.justI32,\n      this.maybeI32,\n      this.defaultI32,\n      this.justU32,\n      this.maybeU32,\n      this.defaultU32,\n      this.justI64,\n      this.maybeI64,\n      this.defaultI64,\n      this.justU64,\n      this.maybeU64,\n      this.defaultU64,\n      this.justF32,\n      this.maybeF32,\n      this.defaultF32,\n      this.justF64,\n      this.maybeF64,\n      this.defaultF64,\n      this.justBool,\n      this.maybeBool,\n      this.defaultBool,\n      this.justEnum,\n      this.maybeEnum,\n      this.defaultEnum\n    );\n  }\n};\n"
  },
  {
    "path": "tests/ts/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2020\",\n    \"lib\": [\n      \"ES2020\",\n      \"DOM\"\n    ],\n    \"module\": \"NodeNext\",\n    \"declaration\": true,\n    \"strict\": true\n  },\n  \"include\": [\n    \"monster_test.ts\",\n    \"typescript_keywords.ts\",\n    \"my-game/**/*.ts\",\n    \"typescript/**/*.ts\",\n    \"optional_scalars/**/*.ts\",\n    \"namespace_test/**/*.ts\",\n    \"union_vector/**/*.ts\",\n    \"arrays_test_complex/**/*.ts\",\n    \"union_underlying_type_test.ts\",\n    \"long-namespace/**/*.ts\",\n    \"longer-namespace/**/*.ts\",\n    \"relative_imports/**/*.ts\"\n  ]\n}"
  },
  {
    "path": "tests/ts/tsconfig.node.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2020\",\n    \"lib\": [\"ES2020\", \"DOM\"],\n    \"moduleResolution\": \"node\",\n    \"declaration\": true,\n    \"strict\": true\n  },\n  \"include\": [\n    \"no_import_ext/**/*.ts\"\n  ]\n}\n"
  },
  {
    "path": "tests/ts/typescript/class.d.ts",
    "content": "export declare enum class_ {\n  new_ = 0,\n  instanceof_ = 1,\n}\n"
  },
  {
    "path": "tests/ts/typescript/class.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nexport var class_;\n(function(class_) {\nclass_[class_['new_'] = 0] = 'new_';\nclass_[class_['instanceof_'] = 1] = 'instanceof_';\n})(class_ || (class_ = {}));\n"
  },
  {
    "path": "tests/ts/typescript/class.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport enum class_ {\n  new_ = 0,\n  instanceof_ = 1,\n}\n"
  },
  {
    "path": "tests/ts/typescript/object.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nimport {Abc} from '../foobar/abc.js';\nimport {class_ as foobar_class_} from '../foobar/class.js';\nimport {Schema, SchemaT} from '../reflection/schema.js';\nimport {class_} from '../typescript/class.js';\nexport declare class Object_\n  implements flatbuffers.IUnpackableObject<Object_T>\n{\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Object_;\n  static getRootAsObject(bb: flatbuffers.ByteBuffer, obj?: Object_): Object_;\n  static getSizePrefixedRootAsObject(\n    bb: flatbuffers.ByteBuffer,\n    obj?: Object_,\n  ): Object_;\n  return_(): number;\n  mutate_return(value: number): boolean;\n  if_(): number;\n  mutate_if(value: number): boolean;\n  switch_(): number;\n  mutate_switch(value: number): boolean;\n  enum_(): class_;\n  mutate_enum(value: class_): boolean;\n  enum2(): foobar_class_;\n  mutate_enum2(value: foobar_class_): boolean;\n  enum3(): Abc;\n  mutate_enum3(value: Abc): boolean;\n  reflect(obj?: Schema): Schema | null;\n  static getFullyQualifiedName(): string;\n  static startObject(builder: flatbuffers.Builder): void;\n  static addReturn(builder: flatbuffers.Builder, return_: number): void;\n  static addIf(builder: flatbuffers.Builder, if_: number): void;\n  static addSwitch(builder: flatbuffers.Builder, switch_: number): void;\n  static addEnum(builder: flatbuffers.Builder, enum_: class_): void;\n  static addEnum2(builder: flatbuffers.Builder, enum2: foobar_class_): void;\n  static addEnum3(builder: flatbuffers.Builder, enum3: Abc): void;\n  static addReflect(\n    builder: flatbuffers.Builder,\n    reflectOffset: flatbuffers.Offset,\n  ): void;\n  static endObject(builder: flatbuffers.Builder): flatbuffers.Offset;\n  unpack(): Object_T;\n  unpackTo(_o: Object_T): void;\n}\nexport declare class Object_T implements flatbuffers.IGeneratedObject {\n  return_: number;\n  if_: number;\n  switch_: number;\n  enum_: class_;\n  enum2: foobar_class_;\n  enum3: Abc;\n  reflect: SchemaT | null;\n  constructor(\n    return_?: number,\n    if_?: number,\n    switch_?: number,\n    enum_?: class_,\n    enum2?: foobar_class_,\n    enum3?: Abc,\n    reflect?: SchemaT | null,\n  );\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/typescript/object.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\n\nimport {Abc} from '../foobar/abc.js';\nimport {class_ as foobar_class_} from '../foobar/class.js';\nimport {Schema} from '../reflection/schema.js';\nimport {class_} from '../typescript/class.js';\n\nexport class Object_ {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsObject(bb, obj) {\n    return (obj || new Object_())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsObject(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new Object_())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  return_() {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n  }\n  mutate_return(value) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  if_() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n  }\n  mutate_if(value) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  switch_() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n  }\n  mutate_switch(value) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  enum_() {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : class_.new_;\n  }\n  mutate_enum(value) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  enum2() {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) :\n                    foobar_class_.arguments_;\n  }\n  mutate_enum2(value) {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  enum3() {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : Abc.a;\n  }\n  mutate_enum3(value) {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  reflect(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    return offset ?\n        (obj || new Schema())\n            .__init(this.bb.__indirect(this.bb_pos + offset), this.bb) :\n        null;\n  }\n  static getFullyQualifiedName() {\n    return 'typescript.Object';\n  }\n  static startObject(builder) {\n    builder.startObject(7);\n  }\n  static addReturn(builder, return_) {\n    builder.addFieldInt32(0, return_, 0);\n  }\n  static addIf(builder, if_) {\n    builder.addFieldInt32(1, if_, 0);\n  }\n  static addSwitch(builder, switch_) {\n    builder.addFieldInt32(2, switch_, 0);\n  }\n  static addEnum(builder, enum_) {\n    builder.addFieldInt32(3, enum_, class_.new_);\n  }\n  static addEnum2(builder, enum2) {\n    builder.addFieldInt32(4, enum2, foobar_class_.arguments_);\n  }\n  static addEnum3(builder, enum3) {\n    builder.addFieldInt32(5, enum3, Abc.a);\n  }\n  static addReflect(builder, reflectOffset) {\n    builder.addFieldOffset(6, reflectOffset, 0);\n  }\n  static endObject(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  unpack() {\n    return new Object_T(\n        this.return_(), this.if_(), this.switch_(), this.enum_(), this.enum2(),\n        this.enum3(),\n        (this.reflect() !== null ? this.reflect().unpack() : null));\n  }\n  unpackTo(_o) {\n    _o.return_ = this.return_();\n    _o.if_ = this.if_();\n    _o.switch_ = this.switch_();\n    _o.enum_ = this.enum_();\n    _o.enum2 = this.enum2();\n    _o.enum3 = this.enum3();\n    _o.reflect = (this.reflect() !== null ? this.reflect().unpack() : null);\n  }\n}\nexport class Object_T {\n  constructor(\n      return_ = 0, if_ = 0, switch_ = 0, enum_ = class_.new_,\n      enum2 = foobar_class_.arguments_, enum3 = Abc.a, reflect = null) {\n    this.return_ = return_;\n    this.if_ = if_;\n    this.switch_ = switch_;\n    this.enum_ = enum_;\n    this.enum2 = enum2;\n    this.enum3 = enum3;\n    this.reflect = reflect;\n  }\n  pack(builder) {\n    const reflect = (this.reflect !== null ? this.reflect.pack(builder) : 0);\n    Object_.startObject(builder);\n    Object_.addReturn(builder, this.return_);\n    Object_.addIf(builder, this.if_);\n    Object_.addSwitch(builder, this.switch_);\n    Object_.addEnum(builder, this.enum_);\n    Object_.addEnum2(builder, this.enum2);\n    Object_.addEnum3(builder, this.enum3);\n    Object_.addReflect(builder, reflect);\n    return Object_.endObject(builder);\n  }\n}\n"
  },
  {
    "path": "tests/ts/typescript/object.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport {Abc} from '../foobar/abc.js';\nimport {class_ as foobar_class_} from '../foobar/class.js';\nimport {Schema, SchemaT} from '../reflection/schema.js';\nimport {class_} from '../typescript/class.js';\n\nexport class Object_ implements flatbuffers.IUnpackableObject<Object_T> {\n  bb: flatbuffers.ByteBuffer | null = null;\n  bb_pos = 0;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Object_ {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n\n  static getRootAsObject(bb: flatbuffers.ByteBuffer, obj?: Object_): Object_ {\n    return (obj || new Object_()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  static getSizePrefixedRootAsObject(\n    bb: flatbuffers.ByteBuffer,\n    obj?: Object_,\n  ): Object_ {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new Object_()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  return_(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 4);\n    return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;\n  }\n\n  mutate_return(value: number): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 4);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n\n  if_(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 6);\n    return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;\n  }\n\n  mutate_if(value: number): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 6);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n\n  switch_(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 8);\n    return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;\n  }\n\n  mutate_switch(value: number): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 8);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n\n  enum_(): class_ {\n    const offset = this.bb!.__offset(this.bb_pos, 10);\n    return offset ? this.bb!.readInt32(this.bb_pos + offset) : class_.new_;\n  }\n\n  mutate_enum(value: class_): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 10);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n\n  enum2(): foobar_class_ {\n    const offset = this.bb!.__offset(this.bb_pos, 12);\n    return offset\n      ? this.bb!.readInt32(this.bb_pos + offset)\n      : foobar_class_.arguments_;\n  }\n\n  mutate_enum2(value: foobar_class_): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 12);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n\n  enum3(): Abc {\n    const offset = this.bb!.__offset(this.bb_pos, 14);\n    return offset ? this.bb!.readInt32(this.bb_pos + offset) : Abc.a;\n  }\n\n  mutate_enum3(value: Abc): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 14);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n\n  reflect(obj?: Schema): Schema | null {\n    const offset = this.bb!.__offset(this.bb_pos, 16);\n    return offset\n      ? (obj || new Schema()).__init(\n          this.bb!.__indirect(this.bb_pos + offset),\n          this.bb!,\n        )\n      : null;\n  }\n\n  static getFullyQualifiedName(): string {\n    return 'typescript.Object';\n  }\n\n  static startObject(builder: flatbuffers.Builder) {\n    builder.startObject(7);\n  }\n\n  static addReturn(builder: flatbuffers.Builder, return_: number) {\n    builder.addFieldInt32(0, return_, 0);\n  }\n\n  static addIf(builder: flatbuffers.Builder, if_: number) {\n    builder.addFieldInt32(1, if_, 0);\n  }\n\n  static addSwitch(builder: flatbuffers.Builder, switch_: number) {\n    builder.addFieldInt32(2, switch_, 0);\n  }\n\n  static addEnum(builder: flatbuffers.Builder, enum_: class_) {\n    builder.addFieldInt32(3, enum_, class_.new_);\n  }\n\n  static addEnum2(builder: flatbuffers.Builder, enum2: foobar_class_) {\n    builder.addFieldInt32(4, enum2, foobar_class_.arguments_);\n  }\n\n  static addEnum3(builder: flatbuffers.Builder, enum3: Abc) {\n    builder.addFieldInt32(5, enum3, Abc.a);\n  }\n\n  static addReflect(\n    builder: flatbuffers.Builder,\n    reflectOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(6, reflectOffset, 0);\n  }\n\n  static endObject(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const offset = builder.endObject();\n    return offset;\n  }\n\n  unpack(): Object_T {\n    return new Object_T(\n      this.return_(),\n      this.if_(),\n      this.switch_(),\n      this.enum_(),\n      this.enum2(),\n      this.enum3(),\n      this.reflect() !== null ? this.reflect()!.unpack() : null,\n    );\n  }\n\n  unpackTo(_o: Object_T): void {\n    _o.return_ = this.return_();\n    _o.if_ = this.if_();\n    _o.switch_ = this.switch_();\n    _o.enum_ = this.enum_();\n    _o.enum2 = this.enum2();\n    _o.enum3 = this.enum3();\n    _o.reflect = this.reflect() !== null ? this.reflect()!.unpack() : null;\n  }\n}\n\nexport class Object_T implements flatbuffers.IGeneratedObject {\n  constructor(\n    public return_: number = 0,\n    public if_: number = 0,\n    public switch_: number = 0,\n    public enum_: class_ = class_.new_,\n    public enum2: foobar_class_ = foobar_class_.arguments_,\n    public enum3: Abc = Abc.a,\n    public reflect: SchemaT | null = null,\n  ) {}\n\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const reflect = this.reflect !== null ? this.reflect!.pack(builder) : 0;\n\n    Object_.startObject(builder);\n    Object_.addReturn(builder, this.return_);\n    Object_.addIf(builder, this.if_);\n    Object_.addSwitch(builder, this.switch_);\n    Object_.addEnum(builder, this.enum_);\n    Object_.addEnum2(builder, this.enum2);\n    Object_.addEnum3(builder, this.enum3);\n    Object_.addReflect(builder, reflect);\n\n    return Object_.endObject(builder);\n  }\n}\n"
  },
  {
    "path": "tests/ts/typescript.d.ts",
    "content": "export {class_} from './typescript/class.js';\nexport {Object_} from './typescript/object.js';\n"
  },
  {
    "path": "tests/ts/typescript.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nexport {class_} from './typescript/class.js';\nexport {Object_} from './typescript/object.js';\n"
  },
  {
    "path": "tests/ts/typescript.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport {class_} from './typescript/class.js';\nexport {Object_} from './typescript/object.js';\n"
  },
  {
    "path": "tests/ts/typescript_include.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport * as foobar from './foobar.js';\n"
  },
  {
    "path": "tests/ts/typescript_include_generated.cjs",
    "content": "\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n  for (var name in all)\n    __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n  if (from && typeof from === \"object\" || typeof from === \"function\") {\n    for (let key of __getOwnPropNames(from))\n      if (!__hasOwnProp.call(to, key) && key !== except)\n        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n  }\n  return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// foobar.ts\nvar foobar_exports = {};\n__export(foobar_exports, {\n  Abc: () => Abc\n});\nmodule.exports = __toCommonJS(foobar_exports);\n\n// foobar/abc.js\nvar Abc;\n(function(Abc2) {\n  Abc2[Abc2[\"a\"] = 0] = \"a\";\n})(Abc = Abc || (Abc = {}));\n"
  },
  {
    "path": "tests/ts/typescript_keywords.d.ts",
    "content": "export * as foobar from './foobar.js';\nexport * as reflection from './reflection.js';\nexport * as typescript from './typescript.js';\n"
  },
  {
    "path": "tests/ts/typescript_keywords.fbs",
    "content": "include 'test_dir/typescript_include.fbs';\ninclude 'reflection/reflection.fbs';\n\n// This file includes a variety of keywords meant to deliberately interfere\n// with typescript keywords.\nnamespace typescript;\n\nenum class: int {\n  new,\n  instanceof,\n}\n\ntable Object {\n  return:int;\n  if:int;\n  switch:int;\n  enum:class;\n  enum2:foobar.class;\n  enum3:foobar.Abc;\n  reflect:reflection.Schema;\n}\n"
  },
  {
    "path": "tests/ts/typescript_keywords.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nexport * as foobar from './foobar.js';\nexport * as reflection from './reflection.js';\nexport * as typescript from './typescript.js';\n"
  },
  {
    "path": "tests/ts/typescript_keywords.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport * as foobar from './foobar.js';\nexport * as reflection from './reflection.js';\nexport * as typescript from './typescript.js';\n"
  },
  {
    "path": "tests/ts/typescript_keywords_generated.cjs",
    "content": "\"use strict\";\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n  for (var name in all)\n    __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n  if (from && typeof from === \"object\" || typeof from === \"function\") {\n    for (let key of __getOwnPropNames(from))\n      if (!__hasOwnProp.call(to, key) && key !== except)\n        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n  }\n  return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n  // If the importer is in node compatibility mode or this is not an ESM\n  // file that has been converted to a CommonJS file using a Babel-\n  // compatible transform (i.e. \"__esModule\" has not been set), then set\n  // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n  isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n  mod\n));\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// typescript_keywords.ts\nvar typescript_keywords_exports = {};\n__export(typescript_keywords_exports, {\n  foobar: () => foobar_exports,\n  reflection: () => reflection_exports,\n  typescript: () => typescript_exports\n});\nmodule.exports = __toCommonJS(typescript_keywords_exports);\n\n// foobar.js\nvar foobar_exports = {};\n__export(foobar_exports, {\n  Abc: () => Abc\n});\n\n// foobar/abc.js\nvar Abc;\n(function(Abc2) {\n  Abc2[Abc2[\"a\"] = 0] = \"a\";\n})(Abc || (Abc = {}));\n\n// reflection.js\nvar reflection_exports = {};\n__export(reflection_exports, {\n  AdvancedFeatures: () => AdvancedFeatures,\n  BaseType: () => BaseType,\n  Enum: () => Enum,\n  EnumT: () => EnumT,\n  EnumVal: () => EnumVal,\n  EnumValT: () => EnumValT,\n  Field: () => Field,\n  FieldT: () => FieldT,\n  KeyValue: () => KeyValue,\n  KeyValueT: () => KeyValueT,\n  Object_: () => Object_,\n  RPCCall: () => RPCCall,\n  RPCCallT: () => RPCCallT,\n  Schema: () => Schema,\n  SchemaFile: () => SchemaFile,\n  SchemaFileT: () => SchemaFileT,\n  SchemaT: () => SchemaT,\n  Service: () => Service,\n  ServiceT: () => ServiceT,\n  Type: () => Type,\n  TypeT: () => TypeT\n});\n\n// reflection/advanced-features.js\nvar AdvancedFeatures;\n(function(AdvancedFeatures2) {\n  AdvancedFeatures2[\"AdvancedArrayFeatures\"] = \"1\";\n  AdvancedFeatures2[\"AdvancedUnionFeatures\"] = \"2\";\n  AdvancedFeatures2[\"OptionalScalars\"] = \"4\";\n  AdvancedFeatures2[\"DefaultVectorsAndStrings\"] = \"8\";\n})(AdvancedFeatures || (AdvancedFeatures = {}));\n\n// reflection/base-type.js\nvar BaseType;\n(function(BaseType2) {\n  BaseType2[BaseType2[\"None\"] = 0] = \"None\";\n  BaseType2[BaseType2[\"UType\"] = 1] = \"UType\";\n  BaseType2[BaseType2[\"Bool\"] = 2] = \"Bool\";\n  BaseType2[BaseType2[\"Byte\"] = 3] = \"Byte\";\n  BaseType2[BaseType2[\"UByte\"] = 4] = \"UByte\";\n  BaseType2[BaseType2[\"Short\"] = 5] = \"Short\";\n  BaseType2[BaseType2[\"UShort\"] = 6] = \"UShort\";\n  BaseType2[BaseType2[\"Int\"] = 7] = \"Int\";\n  BaseType2[BaseType2[\"UInt\"] = 8] = \"UInt\";\n  BaseType2[BaseType2[\"Long\"] = 9] = \"Long\";\n  BaseType2[BaseType2[\"ULong\"] = 10] = \"ULong\";\n  BaseType2[BaseType2[\"Float\"] = 11] = \"Float\";\n  BaseType2[BaseType2[\"Double\"] = 12] = \"Double\";\n  BaseType2[BaseType2[\"String\"] = 13] = \"String\";\n  BaseType2[BaseType2[\"Vector\"] = 14] = \"Vector\";\n  BaseType2[BaseType2[\"Obj\"] = 15] = \"Obj\";\n  BaseType2[BaseType2[\"Union\"] = 16] = \"Union\";\n  BaseType2[BaseType2[\"Array\"] = 17] = \"Array\";\n  BaseType2[BaseType2[\"Vector64\"] = 18] = \"Vector64\";\n  BaseType2[BaseType2[\"MaxBaseType\"] = 19] = \"MaxBaseType\";\n})(BaseType || (BaseType = {}));\n\n// reflection/enum.js\nvar flatbuffers4 = __toESM(require(\"flatbuffers\"), 1);\n\n// reflection/enum-val.js\nvar flatbuffers3 = __toESM(require(\"flatbuffers\"), 1);\n\n// reflection/key-value.js\nvar flatbuffers = __toESM(require(\"flatbuffers\"), 1);\nvar KeyValue = class _KeyValue {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsKeyValue(bb, obj) {\n    return (obj || new _KeyValue()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsKeyValue(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new _KeyValue()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  key(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  value(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  static getFullyQualifiedName() {\n    return \"reflection.KeyValue\";\n  }\n  static startKeyValue(builder) {\n    builder.startObject(2);\n  }\n  static addKey(builder, keyOffset) {\n    builder.addFieldOffset(0, keyOffset, 0);\n  }\n  static addValue(builder, valueOffset) {\n    builder.addFieldOffset(1, valueOffset, 0);\n  }\n  static endKeyValue(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4);\n    return offset;\n  }\n  static createKeyValue(builder, keyOffset, valueOffset) {\n    _KeyValue.startKeyValue(builder);\n    _KeyValue.addKey(builder, keyOffset);\n    _KeyValue.addValue(builder, valueOffset);\n    return _KeyValue.endKeyValue(builder);\n  }\n  unpack() {\n    return new KeyValueT(this.key(), this.value());\n  }\n  unpackTo(_o) {\n    _o.key = this.key();\n    _o.value = this.value();\n  }\n};\nvar KeyValueT = class {\n  constructor(key = null, value = null) {\n    this.key = key;\n    this.value = value;\n  }\n  pack(builder) {\n    const key = this.key !== null ? builder.createString(this.key) : 0;\n    const value = this.value !== null ? builder.createString(this.value) : 0;\n    return KeyValue.createKeyValue(builder, key, value);\n  }\n};\n\n// reflection/type.js\nvar flatbuffers2 = __toESM(require(\"flatbuffers\"), 1);\nvar Type = class _Type {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsType(bb, obj) {\n    return (obj || new _Type()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsType(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers2.SIZE_PREFIX_LENGTH);\n    return (obj || new _Type()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  baseType() {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.readInt8(this.bb_pos + offset) : BaseType.None;\n  }\n  mutate_base_type(value) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, value);\n    return true;\n  }\n  element() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.readInt8(this.bb_pos + offset) : BaseType.None;\n  }\n  mutate_element(value) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, value);\n    return true;\n  }\n  index() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : -1;\n  }\n  mutate_index(value) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  fixedLength() {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.readUint16(this.bb_pos + offset) : 0;\n  }\n  mutate_fixed_length(value) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint16(this.bb_pos + offset, value);\n    return true;\n  }\n  /**\n   * The size (octets) of the `base_type` field.\n   */\n  baseSize() {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.readUint32(this.bb_pos + offset) : 4;\n  }\n  mutate_base_size(value) {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint32(this.bb_pos + offset, value);\n    return true;\n  }\n  /**\n   * The size (octets) of the `element` field, if present.\n   */\n  elementSize() {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.readUint32(this.bb_pos + offset) : 0;\n  }\n  mutate_element_size(value) {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint32(this.bb_pos + offset, value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return \"reflection.Type\";\n  }\n  static startType(builder) {\n    builder.startObject(6);\n  }\n  static addBaseType(builder, baseType) {\n    builder.addFieldInt8(0, baseType, BaseType.None);\n  }\n  static addElement(builder, element) {\n    builder.addFieldInt8(1, element, BaseType.None);\n  }\n  static addIndex(builder, index) {\n    builder.addFieldInt32(2, index, -1);\n  }\n  static addFixedLength(builder, fixedLength) {\n    builder.addFieldInt16(3, fixedLength, 0);\n  }\n  static addBaseSize(builder, baseSize) {\n    builder.addFieldInt32(4, baseSize, 4);\n  }\n  static addElementSize(builder, elementSize) {\n    builder.addFieldInt32(5, elementSize, 0);\n  }\n  static endType(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static createType(builder, baseType, element, index, fixedLength, baseSize, elementSize) {\n    _Type.startType(builder);\n    _Type.addBaseType(builder, baseType);\n    _Type.addElement(builder, element);\n    _Type.addIndex(builder, index);\n    _Type.addFixedLength(builder, fixedLength);\n    _Type.addBaseSize(builder, baseSize);\n    _Type.addElementSize(builder, elementSize);\n    return _Type.endType(builder);\n  }\n  unpack() {\n    return new TypeT(this.baseType(), this.element(), this.index(), this.fixedLength(), this.baseSize(), this.elementSize());\n  }\n  unpackTo(_o) {\n    _o.baseType = this.baseType();\n    _o.element = this.element();\n    _o.index = this.index();\n    _o.fixedLength = this.fixedLength();\n    _o.baseSize = this.baseSize();\n    _o.elementSize = this.elementSize();\n  }\n};\nvar TypeT = class {\n  constructor(baseType = BaseType.None, element = BaseType.None, index = -1, fixedLength = 0, baseSize = 4, elementSize = 0) {\n    this.baseType = baseType;\n    this.element = element;\n    this.index = index;\n    this.fixedLength = fixedLength;\n    this.baseSize = baseSize;\n    this.elementSize = elementSize;\n  }\n  pack(builder) {\n    return Type.createType(builder, this.baseType, this.element, this.index, this.fixedLength, this.baseSize, this.elementSize);\n  }\n};\n\n// reflection/enum-val.js\nvar EnumVal = class _EnumVal {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsEnumVal(bb, obj) {\n    return (obj || new _EnumVal()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsEnumVal(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers3.SIZE_PREFIX_LENGTH);\n    return (obj || new _EnumVal()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  name(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  value() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.readInt64(this.bb_pos + offset) : BigInt(\"0\");\n  }\n  mutate_value(value) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt64(this.bb_pos + offset, value);\n    return true;\n  }\n  unionType(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? (obj || new Type()).__init(this.bb.__indirect(this.bb_pos + offset), this.bb) : null;\n  }\n  documentation(index, optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.__string(this.bb.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n  }\n  documentationLength() {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  attributes(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? (obj || new KeyValue()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  attributesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  static getFullyQualifiedName() {\n    return \"reflection.EnumVal\";\n  }\n  static startEnumVal(builder) {\n    builder.startObject(6);\n  }\n  static addName(builder, nameOffset) {\n    builder.addFieldOffset(0, nameOffset, 0);\n  }\n  static addValue(builder, value) {\n    builder.addFieldInt64(1, value, BigInt(\"0\"));\n  }\n  static addUnionType(builder, unionTypeOffset) {\n    builder.addFieldOffset(3, unionTypeOffset, 0);\n  }\n  static addDocumentation(builder, documentationOffset) {\n    builder.addFieldOffset(4, documentationOffset, 0);\n  }\n  static createDocumentationVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startDocumentationVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addAttributes(builder, attributesOffset) {\n    builder.addFieldOffset(5, attributesOffset, 0);\n  }\n  static createAttributesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startAttributesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static endEnumVal(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4);\n    return offset;\n  }\n  unpack() {\n    return new EnumValT(this.name(), this.value(), this.unionType() !== null ? this.unionType().unpack() : null, this.bb.createScalarList(this.documentation.bind(this), this.documentationLength()), this.bb.createObjList(this.attributes.bind(this), this.attributesLength()));\n  }\n  unpackTo(_o) {\n    _o.name = this.name();\n    _o.value = this.value();\n    _o.unionType = this.unionType() !== null ? this.unionType().unpack() : null;\n    _o.documentation = this.bb.createScalarList(this.documentation.bind(this), this.documentationLength());\n    _o.attributes = this.bb.createObjList(this.attributes.bind(this), this.attributesLength());\n  }\n};\nvar EnumValT = class {\n  constructor(name = null, value = BigInt(\"0\"), unionType = null, documentation = [], attributes = []) {\n    this.name = name;\n    this.value = value;\n    this.unionType = unionType;\n    this.documentation = documentation;\n    this.attributes = attributes;\n  }\n  pack(builder) {\n    const name = this.name !== null ? builder.createString(this.name) : 0;\n    const unionType = this.unionType !== null ? this.unionType.pack(builder) : 0;\n    const documentation = EnumVal.createDocumentationVector(builder, builder.createObjectOffsetList(this.documentation));\n    const attributes = EnumVal.createAttributesVector(builder, builder.createObjectOffsetList(this.attributes));\n    EnumVal.startEnumVal(builder);\n    EnumVal.addName(builder, name);\n    EnumVal.addValue(builder, this.value);\n    EnumVal.addUnionType(builder, unionType);\n    EnumVal.addDocumentation(builder, documentation);\n    EnumVal.addAttributes(builder, attributes);\n    return EnumVal.endEnumVal(builder);\n  }\n};\n\n// reflection/enum.js\nvar Enum = class _Enum {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsEnum(bb, obj) {\n    return (obj || new _Enum()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsEnum(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers4.SIZE_PREFIX_LENGTH);\n    return (obj || new _Enum()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  name(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  values(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? (obj || new EnumVal()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  valuesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  isUnion() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false;\n  }\n  mutate_is_union(value) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n  underlyingType(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? (obj || new Type()).__init(this.bb.__indirect(this.bb_pos + offset), this.bb) : null;\n  }\n  attributes(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? (obj || new KeyValue()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  attributesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  documentation(index, optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.__string(this.bb.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n  }\n  documentationLength() {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  declarationFile(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  static getFullyQualifiedName() {\n    return \"reflection.Enum\";\n  }\n  static startEnum(builder) {\n    builder.startObject(7);\n  }\n  static addName(builder, nameOffset) {\n    builder.addFieldOffset(0, nameOffset, 0);\n  }\n  static addValues(builder, valuesOffset) {\n    builder.addFieldOffset(1, valuesOffset, 0);\n  }\n  static createValuesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startValuesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addIsUnion(builder, isUnion) {\n    builder.addFieldInt8(2, +isUnion, 0);\n  }\n  static addUnderlyingType(builder, underlyingTypeOffset) {\n    builder.addFieldOffset(3, underlyingTypeOffset, 0);\n  }\n  static addAttributes(builder, attributesOffset) {\n    builder.addFieldOffset(4, attributesOffset, 0);\n  }\n  static createAttributesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startAttributesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addDocumentation(builder, documentationOffset) {\n    builder.addFieldOffset(5, documentationOffset, 0);\n  }\n  static createDocumentationVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startDocumentationVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addDeclarationFile(builder, declarationFileOffset) {\n    builder.addFieldOffset(6, declarationFileOffset, 0);\n  }\n  static endEnum(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4);\n    builder.requiredField(offset, 6);\n    builder.requiredField(offset, 10);\n    return offset;\n  }\n  unpack() {\n    return new EnumT(this.name(), this.bb.createObjList(this.values.bind(this), this.valuesLength()), this.isUnion(), this.underlyingType() !== null ? this.underlyingType().unpack() : null, this.bb.createObjList(this.attributes.bind(this), this.attributesLength()), this.bb.createScalarList(this.documentation.bind(this), this.documentationLength()), this.declarationFile());\n  }\n  unpackTo(_o) {\n    _o.name = this.name();\n    _o.values = this.bb.createObjList(this.values.bind(this), this.valuesLength());\n    _o.isUnion = this.isUnion();\n    _o.underlyingType = this.underlyingType() !== null ? this.underlyingType().unpack() : null;\n    _o.attributes = this.bb.createObjList(this.attributes.bind(this), this.attributesLength());\n    _o.documentation = this.bb.createScalarList(this.documentation.bind(this), this.documentationLength());\n    _o.declarationFile = this.declarationFile();\n  }\n};\nvar EnumT = class {\n  constructor(name = null, values = [], isUnion = false, underlyingType = null, attributes = [], documentation = [], declarationFile = null) {\n    this.name = name;\n    this.values = values;\n    this.isUnion = isUnion;\n    this.underlyingType = underlyingType;\n    this.attributes = attributes;\n    this.documentation = documentation;\n    this.declarationFile = declarationFile;\n  }\n  pack(builder) {\n    const name = this.name !== null ? builder.createString(this.name) : 0;\n    const values = Enum.createValuesVector(builder, builder.createObjectOffsetList(this.values));\n    const underlyingType = this.underlyingType !== null ? this.underlyingType.pack(builder) : 0;\n    const attributes = Enum.createAttributesVector(builder, builder.createObjectOffsetList(this.attributes));\n    const documentation = Enum.createDocumentationVector(builder, builder.createObjectOffsetList(this.documentation));\n    const declarationFile = this.declarationFile !== null ? builder.createString(this.declarationFile) : 0;\n    Enum.startEnum(builder);\n    Enum.addName(builder, name);\n    Enum.addValues(builder, values);\n    Enum.addIsUnion(builder, this.isUnion);\n    Enum.addUnderlyingType(builder, underlyingType);\n    Enum.addAttributes(builder, attributes);\n    Enum.addDocumentation(builder, documentation);\n    Enum.addDeclarationFile(builder, declarationFile);\n    return Enum.endEnum(builder);\n  }\n};\n\n// reflection/field.js\nvar flatbuffers5 = __toESM(require(\"flatbuffers\"), 1);\nvar Field = class _Field {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsField(bb, obj) {\n    return (obj || new _Field()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsField(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers5.SIZE_PREFIX_LENGTH);\n    return (obj || new _Field()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  name(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  type(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? (obj || new Type()).__init(this.bb.__indirect(this.bb_pos + offset), this.bb) : null;\n  }\n  id() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? this.bb.readUint16(this.bb_pos + offset) : 0;\n  }\n  mutate_id(value) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint16(this.bb_pos + offset, value);\n    return true;\n  }\n  offset() {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.readUint16(this.bb_pos + offset) : 0;\n  }\n  mutate_offset(value) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint16(this.bb_pos + offset, value);\n    return true;\n  }\n  defaultInteger() {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.readInt64(this.bb_pos + offset) : BigInt(\"0\");\n  }\n  mutate_default_integer(value) {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt64(this.bb_pos + offset, value);\n    return true;\n  }\n  defaultReal() {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.readFloat64(this.bb_pos + offset) : 0;\n  }\n  mutate_default_real(value) {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeFloat64(this.bb_pos + offset, value);\n    return true;\n  }\n  deprecated() {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false;\n  }\n  mutate_deprecated(value) {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n  required() {\n    const offset = this.bb.__offset(this.bb_pos, 18);\n    return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false;\n  }\n  mutate_required(value) {\n    const offset = this.bb.__offset(this.bb_pos, 18);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n  key() {\n    const offset = this.bb.__offset(this.bb_pos, 20);\n    return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false;\n  }\n  mutate_key(value) {\n    const offset = this.bb.__offset(this.bb_pos, 20);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n  attributes(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 22);\n    return offset ? (obj || new KeyValue()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  attributesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 22);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  documentation(index, optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 24);\n    return offset ? this.bb.__string(this.bb.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n  }\n  documentationLength() {\n    const offset = this.bb.__offset(this.bb_pos, 24);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  optional() {\n    const offset = this.bb.__offset(this.bb_pos, 26);\n    return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false;\n  }\n  mutate_optional(value) {\n    const offset = this.bb.__offset(this.bb_pos, 26);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n  /**\n   * Number of padding octets to always add after this field. Structs only.\n   */\n  padding() {\n    const offset = this.bb.__offset(this.bb_pos, 28);\n    return offset ? this.bb.readUint16(this.bb_pos + offset) : 0;\n  }\n  mutate_padding(value) {\n    const offset = this.bb.__offset(this.bb_pos, 28);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint16(this.bb_pos + offset, value);\n    return true;\n  }\n  /**\n   * If the field uses 64-bit offsets.\n   */\n  offset64() {\n    const offset = this.bb.__offset(this.bb_pos, 30);\n    return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false;\n  }\n  mutate_offset64(value) {\n    const offset = this.bb.__offset(this.bb_pos, 30);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return \"reflection.Field\";\n  }\n  static startField(builder) {\n    builder.startObject(14);\n  }\n  static addName(builder, nameOffset) {\n    builder.addFieldOffset(0, nameOffset, 0);\n  }\n  static addType(builder, typeOffset) {\n    builder.addFieldOffset(1, typeOffset, 0);\n  }\n  static addId(builder, id) {\n    builder.addFieldInt16(2, id, 0);\n  }\n  static addOffset(builder, offset) {\n    builder.addFieldInt16(3, offset, 0);\n  }\n  static addDefaultInteger(builder, defaultInteger) {\n    builder.addFieldInt64(4, defaultInteger, BigInt(\"0\"));\n  }\n  static addDefaultReal(builder, defaultReal) {\n    builder.addFieldFloat64(5, defaultReal, 0);\n  }\n  static addDeprecated(builder, deprecated) {\n    builder.addFieldInt8(6, +deprecated, 0);\n  }\n  static addRequired(builder, required) {\n    builder.addFieldInt8(7, +required, 0);\n  }\n  static addKey(builder, key) {\n    builder.addFieldInt8(8, +key, 0);\n  }\n  static addAttributes(builder, attributesOffset) {\n    builder.addFieldOffset(9, attributesOffset, 0);\n  }\n  static createAttributesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startAttributesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addDocumentation(builder, documentationOffset) {\n    builder.addFieldOffset(10, documentationOffset, 0);\n  }\n  static createDocumentationVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startDocumentationVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addOptional(builder, optional) {\n    builder.addFieldInt8(11, +optional, 0);\n  }\n  static addPadding(builder, padding) {\n    builder.addFieldInt16(12, padding, 0);\n  }\n  static addOffset64(builder, offset64) {\n    builder.addFieldInt8(13, +offset64, 0);\n  }\n  static endField(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4);\n    builder.requiredField(offset, 6);\n    return offset;\n  }\n  unpack() {\n    return new FieldT(this.name(), this.type() !== null ? this.type().unpack() : null, this.id(), this.offset(), this.defaultInteger(), this.defaultReal(), this.deprecated(), this.required(), this.key(), this.bb.createObjList(this.attributes.bind(this), this.attributesLength()), this.bb.createScalarList(this.documentation.bind(this), this.documentationLength()), this.optional(), this.padding(), this.offset64());\n  }\n  unpackTo(_o) {\n    _o.name = this.name();\n    _o.type = this.type() !== null ? this.type().unpack() : null;\n    _o.id = this.id();\n    _o.offset = this.offset();\n    _o.defaultInteger = this.defaultInteger();\n    _o.defaultReal = this.defaultReal();\n    _o.deprecated = this.deprecated();\n    _o.required = this.required();\n    _o.key = this.key();\n    _o.attributes = this.bb.createObjList(this.attributes.bind(this), this.attributesLength());\n    _o.documentation = this.bb.createScalarList(this.documentation.bind(this), this.documentationLength());\n    _o.optional = this.optional();\n    _o.padding = this.padding();\n    _o.offset64 = this.offset64();\n  }\n};\nvar FieldT = class {\n  constructor(name = null, type = null, id = 0, offset = 0, defaultInteger = BigInt(\"0\"), defaultReal = 0, deprecated = false, required = false, key = false, attributes = [], documentation = [], optional = false, padding = 0, offset64 = false) {\n    this.name = name;\n    this.type = type;\n    this.id = id;\n    this.offset = offset;\n    this.defaultInteger = defaultInteger;\n    this.defaultReal = defaultReal;\n    this.deprecated = deprecated;\n    this.required = required;\n    this.key = key;\n    this.attributes = attributes;\n    this.documentation = documentation;\n    this.optional = optional;\n    this.padding = padding;\n    this.offset64 = offset64;\n  }\n  pack(builder) {\n    const name = this.name !== null ? builder.createString(this.name) : 0;\n    const type = this.type !== null ? this.type.pack(builder) : 0;\n    const attributes = Field.createAttributesVector(builder, builder.createObjectOffsetList(this.attributes));\n    const documentation = Field.createDocumentationVector(builder, builder.createObjectOffsetList(this.documentation));\n    Field.startField(builder);\n    Field.addName(builder, name);\n    Field.addType(builder, type);\n    Field.addId(builder, this.id);\n    Field.addOffset(builder, this.offset);\n    Field.addDefaultInteger(builder, this.defaultInteger);\n    Field.addDefaultReal(builder, this.defaultReal);\n    Field.addDeprecated(builder, this.deprecated);\n    Field.addRequired(builder, this.required);\n    Field.addKey(builder, this.key);\n    Field.addAttributes(builder, attributes);\n    Field.addDocumentation(builder, documentation);\n    Field.addOptional(builder, this.optional);\n    Field.addPadding(builder, this.padding);\n    Field.addOffset64(builder, this.offset64);\n    return Field.endField(builder);\n  }\n};\n\n// reflection/object.js\nvar flatbuffers6 = __toESM(require(\"flatbuffers\"), 1);\nvar Object_ = class _Object_ {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsObject(bb, obj) {\n    return (obj || new _Object_()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsObject(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers6.SIZE_PREFIX_LENGTH);\n    return (obj || new _Object_()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  name(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  fields(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? (obj || new Field()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  fieldsLength() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  isStruct() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false;\n  }\n  mutate_is_struct(value) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n  minalign() {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n  }\n  mutate_minalign(value) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  bytesize() {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n  }\n  mutate_bytesize(value) {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  attributes(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? (obj || new KeyValue()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  attributesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  documentation(index, optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    return offset ? this.bb.__string(this.bb.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n  }\n  documentationLength() {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  declarationFile(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 18);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  static getFullyQualifiedName() {\n    return \"reflection.Object\";\n  }\n  static startObject(builder) {\n    builder.startObject(8);\n  }\n  static addName(builder, nameOffset) {\n    builder.addFieldOffset(0, nameOffset, 0);\n  }\n  static addFields(builder, fieldsOffset) {\n    builder.addFieldOffset(1, fieldsOffset, 0);\n  }\n  static createFieldsVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startFieldsVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addIsStruct(builder, isStruct) {\n    builder.addFieldInt8(2, +isStruct, 0);\n  }\n  static addMinalign(builder, minalign) {\n    builder.addFieldInt32(3, minalign, 0);\n  }\n  static addBytesize(builder, bytesize) {\n    builder.addFieldInt32(4, bytesize, 0);\n  }\n  static addAttributes(builder, attributesOffset) {\n    builder.addFieldOffset(5, attributesOffset, 0);\n  }\n  static createAttributesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startAttributesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addDocumentation(builder, documentationOffset) {\n    builder.addFieldOffset(6, documentationOffset, 0);\n  }\n  static createDocumentationVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startDocumentationVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addDeclarationFile(builder, declarationFileOffset) {\n    builder.addFieldOffset(7, declarationFileOffset, 0);\n  }\n  static endObject(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4);\n    builder.requiredField(offset, 6);\n    return offset;\n  }\n  static createObject(builder, nameOffset, fieldsOffset, isStruct, minalign, bytesize, attributesOffset, documentationOffset, declarationFileOffset) {\n    _Object_.startObject(builder);\n    _Object_.addName(builder, nameOffset);\n    _Object_.addFields(builder, fieldsOffset);\n    _Object_.addIsStruct(builder, isStruct);\n    _Object_.addMinalign(builder, minalign);\n    _Object_.addBytesize(builder, bytesize);\n    _Object_.addAttributes(builder, attributesOffset);\n    _Object_.addDocumentation(builder, documentationOffset);\n    _Object_.addDeclarationFile(builder, declarationFileOffset);\n    return _Object_.endObject(builder);\n  }\n  unpack() {\n    return new Object_T(this.name(), this.bb.createObjList(this.fields.bind(this), this.fieldsLength()), this.isStruct(), this.minalign(), this.bytesize(), this.bb.createObjList(this.attributes.bind(this), this.attributesLength()), this.bb.createScalarList(this.documentation.bind(this), this.documentationLength()), this.declarationFile());\n  }\n  unpackTo(_o) {\n    _o.name = this.name();\n    _o.fields = this.bb.createObjList(this.fields.bind(this), this.fieldsLength());\n    _o.isStruct = this.isStruct();\n    _o.minalign = this.minalign();\n    _o.bytesize = this.bytesize();\n    _o.attributes = this.bb.createObjList(this.attributes.bind(this), this.attributesLength());\n    _o.documentation = this.bb.createScalarList(this.documentation.bind(this), this.documentationLength());\n    _o.declarationFile = this.declarationFile();\n  }\n};\nvar Object_T = class {\n  constructor(name = null, fields = [], isStruct = false, minalign = 0, bytesize = 0, attributes = [], documentation = [], declarationFile = null) {\n    this.name = name;\n    this.fields = fields;\n    this.isStruct = isStruct;\n    this.minalign = minalign;\n    this.bytesize = bytesize;\n    this.attributes = attributes;\n    this.documentation = documentation;\n    this.declarationFile = declarationFile;\n  }\n  pack(builder) {\n    const name = this.name !== null ? builder.createString(this.name) : 0;\n    const fields = Object_.createFieldsVector(builder, builder.createObjectOffsetList(this.fields));\n    const attributes = Object_.createAttributesVector(builder, builder.createObjectOffsetList(this.attributes));\n    const documentation = Object_.createDocumentationVector(builder, builder.createObjectOffsetList(this.documentation));\n    const declarationFile = this.declarationFile !== null ? builder.createString(this.declarationFile) : 0;\n    return Object_.createObject(builder, name, fields, this.isStruct, this.minalign, this.bytesize, attributes, documentation, declarationFile);\n  }\n};\n\n// reflection/rpccall.js\nvar flatbuffers7 = __toESM(require(\"flatbuffers\"), 1);\nvar RPCCall = class _RPCCall {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsRPCCall(bb, obj) {\n    return (obj || new _RPCCall()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsRPCCall(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers7.SIZE_PREFIX_LENGTH);\n    return (obj || new _RPCCall()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  name(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  request(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? (obj || new Object_()).__init(this.bb.__indirect(this.bb_pos + offset), this.bb) : null;\n  }\n  response(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? (obj || new Object_()).__init(this.bb.__indirect(this.bb_pos + offset), this.bb) : null;\n  }\n  attributes(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? (obj || new KeyValue()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  attributesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  documentation(index, optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.__string(this.bb.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n  }\n  documentationLength() {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  static getFullyQualifiedName() {\n    return \"reflection.RPCCall\";\n  }\n  static startRPCCall(builder) {\n    builder.startObject(5);\n  }\n  static addName(builder, nameOffset) {\n    builder.addFieldOffset(0, nameOffset, 0);\n  }\n  static addRequest(builder, requestOffset) {\n    builder.addFieldOffset(1, requestOffset, 0);\n  }\n  static addResponse(builder, responseOffset) {\n    builder.addFieldOffset(2, responseOffset, 0);\n  }\n  static addAttributes(builder, attributesOffset) {\n    builder.addFieldOffset(3, attributesOffset, 0);\n  }\n  static createAttributesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startAttributesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addDocumentation(builder, documentationOffset) {\n    builder.addFieldOffset(4, documentationOffset, 0);\n  }\n  static createDocumentationVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startDocumentationVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static endRPCCall(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4);\n    builder.requiredField(offset, 6);\n    builder.requiredField(offset, 8);\n    return offset;\n  }\n  unpack() {\n    return new RPCCallT(this.name(), this.request() !== null ? this.request().unpack() : null, this.response() !== null ? this.response().unpack() : null, this.bb.createObjList(this.attributes.bind(this), this.attributesLength()), this.bb.createScalarList(this.documentation.bind(this), this.documentationLength()));\n  }\n  unpackTo(_o) {\n    _o.name = this.name();\n    _o.request = this.request() !== null ? this.request().unpack() : null;\n    _o.response = this.response() !== null ? this.response().unpack() : null;\n    _o.attributes = this.bb.createObjList(this.attributes.bind(this), this.attributesLength());\n    _o.documentation = this.bb.createScalarList(this.documentation.bind(this), this.documentationLength());\n  }\n};\nvar RPCCallT = class {\n  constructor(name = null, request = null, response = null, attributes = [], documentation = []) {\n    this.name = name;\n    this.request = request;\n    this.response = response;\n    this.attributes = attributes;\n    this.documentation = documentation;\n  }\n  pack(builder) {\n    const name = this.name !== null ? builder.createString(this.name) : 0;\n    const request = this.request !== null ? this.request.pack(builder) : 0;\n    const response = this.response !== null ? this.response.pack(builder) : 0;\n    const attributes = RPCCall.createAttributesVector(builder, builder.createObjectOffsetList(this.attributes));\n    const documentation = RPCCall.createDocumentationVector(builder, builder.createObjectOffsetList(this.documentation));\n    RPCCall.startRPCCall(builder);\n    RPCCall.addName(builder, name);\n    RPCCall.addRequest(builder, request);\n    RPCCall.addResponse(builder, response);\n    RPCCall.addAttributes(builder, attributes);\n    RPCCall.addDocumentation(builder, documentation);\n    return RPCCall.endRPCCall(builder);\n  }\n};\n\n// reflection/schema.js\nvar flatbuffers10 = __toESM(require(\"flatbuffers\"), 1);\n\n// reflection/schema-file.js\nvar flatbuffers8 = __toESM(require(\"flatbuffers\"), 1);\nvar SchemaFile = class _SchemaFile {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsSchemaFile(bb, obj) {\n    return (obj || new _SchemaFile()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsSchemaFile(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers8.SIZE_PREFIX_LENGTH);\n    return (obj || new _SchemaFile()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  filename(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  includedFilenames(index, optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.__string(this.bb.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n  }\n  includedFilenamesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  static getFullyQualifiedName() {\n    return \"reflection.SchemaFile\";\n  }\n  static startSchemaFile(builder) {\n    builder.startObject(2);\n  }\n  static addFilename(builder, filenameOffset) {\n    builder.addFieldOffset(0, filenameOffset, 0);\n  }\n  static addIncludedFilenames(builder, includedFilenamesOffset) {\n    builder.addFieldOffset(1, includedFilenamesOffset, 0);\n  }\n  static createIncludedFilenamesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startIncludedFilenamesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static endSchemaFile(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4);\n    return offset;\n  }\n  static createSchemaFile(builder, filenameOffset, includedFilenamesOffset) {\n    _SchemaFile.startSchemaFile(builder);\n    _SchemaFile.addFilename(builder, filenameOffset);\n    _SchemaFile.addIncludedFilenames(builder, includedFilenamesOffset);\n    return _SchemaFile.endSchemaFile(builder);\n  }\n  unpack() {\n    return new SchemaFileT(this.filename(), this.bb.createScalarList(this.includedFilenames.bind(this), this.includedFilenamesLength()));\n  }\n  unpackTo(_o) {\n    _o.filename = this.filename();\n    _o.includedFilenames = this.bb.createScalarList(this.includedFilenames.bind(this), this.includedFilenamesLength());\n  }\n};\nvar SchemaFileT = class {\n  constructor(filename = null, includedFilenames = []) {\n    this.filename = filename;\n    this.includedFilenames = includedFilenames;\n  }\n  pack(builder) {\n    const filename = this.filename !== null ? builder.createString(this.filename) : 0;\n    const includedFilenames = SchemaFile.createIncludedFilenamesVector(builder, builder.createObjectOffsetList(this.includedFilenames));\n    return SchemaFile.createSchemaFile(builder, filename, includedFilenames);\n  }\n};\n\n// reflection/service.js\nvar flatbuffers9 = __toESM(require(\"flatbuffers\"), 1);\nvar Service = class _Service {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsService(bb, obj) {\n    return (obj || new _Service()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsService(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers9.SIZE_PREFIX_LENGTH);\n    return (obj || new _Service()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  name(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  calls(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? (obj || new RPCCall()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  callsLength() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  attributes(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? (obj || new KeyValue()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  attributesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  documentation(index, optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.__string(this.bb.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n  }\n  documentationLength() {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  declarationFile(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  static getFullyQualifiedName() {\n    return \"reflection.Service\";\n  }\n  static startService(builder) {\n    builder.startObject(5);\n  }\n  static addName(builder, nameOffset) {\n    builder.addFieldOffset(0, nameOffset, 0);\n  }\n  static addCalls(builder, callsOffset) {\n    builder.addFieldOffset(1, callsOffset, 0);\n  }\n  static createCallsVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startCallsVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addAttributes(builder, attributesOffset) {\n    builder.addFieldOffset(2, attributesOffset, 0);\n  }\n  static createAttributesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startAttributesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addDocumentation(builder, documentationOffset) {\n    builder.addFieldOffset(3, documentationOffset, 0);\n  }\n  static createDocumentationVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startDocumentationVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addDeclarationFile(builder, declarationFileOffset) {\n    builder.addFieldOffset(4, declarationFileOffset, 0);\n  }\n  static endService(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4);\n    return offset;\n  }\n  static createService(builder, nameOffset, callsOffset, attributesOffset, documentationOffset, declarationFileOffset) {\n    _Service.startService(builder);\n    _Service.addName(builder, nameOffset);\n    _Service.addCalls(builder, callsOffset);\n    _Service.addAttributes(builder, attributesOffset);\n    _Service.addDocumentation(builder, documentationOffset);\n    _Service.addDeclarationFile(builder, declarationFileOffset);\n    return _Service.endService(builder);\n  }\n  unpack() {\n    return new ServiceT(this.name(), this.bb.createObjList(this.calls.bind(this), this.callsLength()), this.bb.createObjList(this.attributes.bind(this), this.attributesLength()), this.bb.createScalarList(this.documentation.bind(this), this.documentationLength()), this.declarationFile());\n  }\n  unpackTo(_o) {\n    _o.name = this.name();\n    _o.calls = this.bb.createObjList(this.calls.bind(this), this.callsLength());\n    _o.attributes = this.bb.createObjList(this.attributes.bind(this), this.attributesLength());\n    _o.documentation = this.bb.createScalarList(this.documentation.bind(this), this.documentationLength());\n    _o.declarationFile = this.declarationFile();\n  }\n};\nvar ServiceT = class {\n  constructor(name = null, calls = [], attributes = [], documentation = [], declarationFile = null) {\n    this.name = name;\n    this.calls = calls;\n    this.attributes = attributes;\n    this.documentation = documentation;\n    this.declarationFile = declarationFile;\n  }\n  pack(builder) {\n    const name = this.name !== null ? builder.createString(this.name) : 0;\n    const calls = Service.createCallsVector(builder, builder.createObjectOffsetList(this.calls));\n    const attributes = Service.createAttributesVector(builder, builder.createObjectOffsetList(this.attributes));\n    const documentation = Service.createDocumentationVector(builder, builder.createObjectOffsetList(this.documentation));\n    const declarationFile = this.declarationFile !== null ? builder.createString(this.declarationFile) : 0;\n    return Service.createService(builder, name, calls, attributes, documentation, declarationFile);\n  }\n};\n\n// reflection/schema.js\nvar Schema = class _Schema {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsSchema(bb, obj) {\n    return (obj || new _Schema()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsSchema(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers10.SIZE_PREFIX_LENGTH);\n    return (obj || new _Schema()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static bufferHasIdentifier(bb) {\n    return bb.__has_identifier(\"BFBS\");\n  }\n  objects(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? (obj || new Object_()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  objectsLength() {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  enums(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? (obj || new Enum()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  enumsLength() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  fileIdent(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  fileExt(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n  }\n  rootTable(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? (obj || new Object_()).__init(this.bb.__indirect(this.bb_pos + offset), this.bb) : null;\n  }\n  services(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? (obj || new Service()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  servicesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  advancedFeatures() {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    return offset ? this.bb.readUint64(this.bb_pos + offset) : BigInt(\"0\");\n  }\n  mutate_advanced_features(value) {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeUint64(this.bb_pos + offset, value);\n    return true;\n  }\n  /**\n   * All the files used in this compilation. Files are relative to where\n   * flatc was invoked.\n   */\n  fbsFiles(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 18);\n    return offset ? (obj || new SchemaFile()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n  }\n  fbsFilesLength() {\n    const offset = this.bb.__offset(this.bb_pos, 18);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  static getFullyQualifiedName() {\n    return \"reflection.Schema\";\n  }\n  static startSchema(builder) {\n    builder.startObject(8);\n  }\n  static addObjects(builder, objectsOffset) {\n    builder.addFieldOffset(0, objectsOffset, 0);\n  }\n  static createObjectsVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startObjectsVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addEnums(builder, enumsOffset) {\n    builder.addFieldOffset(1, enumsOffset, 0);\n  }\n  static createEnumsVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startEnumsVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addFileIdent(builder, fileIdentOffset) {\n    builder.addFieldOffset(2, fileIdentOffset, 0);\n  }\n  static addFileExt(builder, fileExtOffset) {\n    builder.addFieldOffset(3, fileExtOffset, 0);\n  }\n  static addRootTable(builder, rootTableOffset) {\n    builder.addFieldOffset(4, rootTableOffset, 0);\n  }\n  static addServices(builder, servicesOffset) {\n    builder.addFieldOffset(5, servicesOffset, 0);\n  }\n  static createServicesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startServicesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addAdvancedFeatures(builder, advancedFeatures) {\n    builder.addFieldInt64(6, advancedFeatures, BigInt(\"0\"));\n  }\n  static addFbsFiles(builder, fbsFilesOffset) {\n    builder.addFieldOffset(7, fbsFilesOffset, 0);\n  }\n  static createFbsFilesVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startFbsFilesVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static endSchema(builder) {\n    const offset = builder.endObject();\n    builder.requiredField(offset, 4);\n    builder.requiredField(offset, 6);\n    return offset;\n  }\n  static finishSchemaBuffer(builder, offset) {\n    builder.finish(offset, \"BFBS\");\n  }\n  static finishSizePrefixedSchemaBuffer(builder, offset) {\n    builder.finish(offset, \"BFBS\", true);\n  }\n  unpack() {\n    return new SchemaT(this.bb.createObjList(this.objects.bind(this), this.objectsLength()), this.bb.createObjList(this.enums.bind(this), this.enumsLength()), this.fileIdent(), this.fileExt(), this.rootTable() !== null ? this.rootTable().unpack() : null, this.bb.createObjList(this.services.bind(this), this.servicesLength()), this.advancedFeatures(), this.bb.createObjList(this.fbsFiles.bind(this), this.fbsFilesLength()));\n  }\n  unpackTo(_o) {\n    _o.objects = this.bb.createObjList(this.objects.bind(this), this.objectsLength());\n    _o.enums = this.bb.createObjList(this.enums.bind(this), this.enumsLength());\n    _o.fileIdent = this.fileIdent();\n    _o.fileExt = this.fileExt();\n    _o.rootTable = this.rootTable() !== null ? this.rootTable().unpack() : null;\n    _o.services = this.bb.createObjList(this.services.bind(this), this.servicesLength());\n    _o.advancedFeatures = this.advancedFeatures();\n    _o.fbsFiles = this.bb.createObjList(this.fbsFiles.bind(this), this.fbsFilesLength());\n  }\n};\nvar SchemaT = class {\n  constructor(objects = [], enums = [], fileIdent = null, fileExt = null, rootTable = null, services = [], advancedFeatures = BigInt(\"0\"), fbsFiles = []) {\n    this.objects = objects;\n    this.enums = enums;\n    this.fileIdent = fileIdent;\n    this.fileExt = fileExt;\n    this.rootTable = rootTable;\n    this.services = services;\n    this.advancedFeatures = advancedFeatures;\n    this.fbsFiles = fbsFiles;\n  }\n  pack(builder) {\n    const objects = Schema.createObjectsVector(builder, builder.createObjectOffsetList(this.objects));\n    const enums = Schema.createEnumsVector(builder, builder.createObjectOffsetList(this.enums));\n    const fileIdent = this.fileIdent !== null ? builder.createString(this.fileIdent) : 0;\n    const fileExt = this.fileExt !== null ? builder.createString(this.fileExt) : 0;\n    const rootTable = this.rootTable !== null ? this.rootTable.pack(builder) : 0;\n    const services = Schema.createServicesVector(builder, builder.createObjectOffsetList(this.services));\n    const fbsFiles = Schema.createFbsFilesVector(builder, builder.createObjectOffsetList(this.fbsFiles));\n    Schema.startSchema(builder);\n    Schema.addObjects(builder, objects);\n    Schema.addEnums(builder, enums);\n    Schema.addFileIdent(builder, fileIdent);\n    Schema.addFileExt(builder, fileExt);\n    Schema.addRootTable(builder, rootTable);\n    Schema.addServices(builder, services);\n    Schema.addAdvancedFeatures(builder, this.advancedFeatures);\n    Schema.addFbsFiles(builder, fbsFiles);\n    return Schema.endSchema(builder);\n  }\n};\n\n// typescript.js\nvar typescript_exports = {};\n__export(typescript_exports, {\n  Object_: () => Object_2,\n  class_: () => class_2\n});\n\n// typescript/object.js\nvar flatbuffers11 = __toESM(require(\"flatbuffers\"), 1);\n\n// foobar/class.js\nvar class_;\n(function(class_3) {\n  class_3[class_3[\"arguments_\"] = 0] = \"arguments_\";\n})(class_ || (class_ = {}));\n\n// typescript/class.js\nvar class_2;\n(function(class_3) {\n  class_3[class_3[\"new_\"] = 0] = \"new_\";\n  class_3[class_3[\"instanceof_\"] = 1] = \"instanceof_\";\n})(class_2 || (class_2 = {}));\n\n// typescript/object.js\nvar Object_2 = class _Object_ {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsObject(bb, obj) {\n    return (obj || new _Object_()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsObject(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers11.SIZE_PREFIX_LENGTH);\n    return (obj || new _Object_()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  return_() {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n  }\n  mutate_return(value) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  if_() {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n  }\n  mutate_if(value) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  switch_() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n  }\n  mutate_switch(value) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  enum_() {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : class_2.new_;\n  }\n  mutate_enum(value) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  enum2() {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : class_.arguments_;\n  }\n  mutate_enum2(value) {\n    const offset = this.bb.__offset(this.bb_pos, 12);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  enum3() {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : Abc.a;\n  }\n  mutate_enum3(value) {\n    const offset = this.bb.__offset(this.bb_pos, 14);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  reflect(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 16);\n    return offset ? (obj || new Schema()).__init(this.bb.__indirect(this.bb_pos + offset), this.bb) : null;\n  }\n  static getFullyQualifiedName() {\n    return \"typescript.Object\";\n  }\n  static startObject(builder) {\n    builder.startObject(7);\n  }\n  static addReturn(builder, return_) {\n    builder.addFieldInt32(0, return_, 0);\n  }\n  static addIf(builder, if_) {\n    builder.addFieldInt32(1, if_, 0);\n  }\n  static addSwitch(builder, switch_) {\n    builder.addFieldInt32(2, switch_, 0);\n  }\n  static addEnum(builder, enum_) {\n    builder.addFieldInt32(3, enum_, class_2.new_);\n  }\n  static addEnum2(builder, enum2) {\n    builder.addFieldInt32(4, enum2, class_.arguments_);\n  }\n  static addEnum3(builder, enum3) {\n    builder.addFieldInt32(5, enum3, Abc.a);\n  }\n  static addReflect(builder, reflectOffset) {\n    builder.addFieldOffset(6, reflectOffset, 0);\n  }\n  static endObject(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  unpack() {\n    return new Object_T2(this.return_(), this.if_(), this.switch_(), this.enum_(), this.enum2(), this.enum3(), this.reflect() !== null ? this.reflect().unpack() : null);\n  }\n  unpackTo(_o) {\n    _o.return_ = this.return_();\n    _o.if_ = this.if_();\n    _o.switch_ = this.switch_();\n    _o.enum_ = this.enum_();\n    _o.enum2 = this.enum2();\n    _o.enum3 = this.enum3();\n    _o.reflect = this.reflect() !== null ? this.reflect().unpack() : null;\n  }\n};\nvar Object_T2 = class {\n  constructor(return_ = 0, if_ = 0, switch_ = 0, enum_ = class_2.new_, enum2 = class_.arguments_, enum3 = Abc.a, reflect = null) {\n    this.return_ = return_;\n    this.if_ = if_;\n    this.switch_ = switch_;\n    this.enum_ = enum_;\n    this.enum2 = enum2;\n    this.enum3 = enum3;\n    this.reflect = reflect;\n  }\n  pack(builder) {\n    const reflect = this.reflect !== null ? this.reflect.pack(builder) : 0;\n    Object_2.startObject(builder);\n    Object_2.addReturn(builder, this.return_);\n    Object_2.addIf(builder, this.if_);\n    Object_2.addSwitch(builder, this.switch_);\n    Object_2.addEnum(builder, this.enum_);\n    Object_2.addEnum2(builder, this.enum2);\n    Object_2.addEnum3(builder, this.enum3);\n    Object_2.addReflect(builder, reflect);\n    return Object_2.endObject(builder);\n  }\n};\n"
  },
  {
    "path": "tests/ts/typescript_transitive_include.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport * as foobar from './foobar.js';\n"
  },
  {
    "path": "tests/ts/typescript_transitive_include_generated.cjs",
    "content": "\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n  for (var name in all)\n    __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n  if (from && typeof from === \"object\" || typeof from === \"function\") {\n    for (let key of __getOwnPropNames(from))\n      if (!__hasOwnProp.call(to, key) && key !== except)\n        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n  }\n  return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// foobar.ts\nvar foobar_exports = {};\n__export(foobar_exports, {\n  Abc: () => Abc\n});\nmodule.exports = __toCommonJS(foobar_exports);\n\n// foobar/abc.js\nvar Abc;\n(function(Abc2) {\n  Abc2[Abc2[\"a\"] = 0] = \"a\";\n})(Abc = Abc || (Abc = {}));\n"
  },
  {
    "path": "tests/ts/union-underlying-type/a.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nexport declare class A implements flatbuffers.IUnpackableObject<AT> {\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): A;\n  static getRootAsA(bb: flatbuffers.ByteBuffer, obj?: A): A;\n  static getSizePrefixedRootAsA(bb: flatbuffers.ByteBuffer, obj?: A): A;\n  a(): number;\n  mutate_a(value: number): boolean;\n  static getFullyQualifiedName(): string;\n  static startA(builder: flatbuffers.Builder): void;\n  static addA(builder: flatbuffers.Builder, a: number): void;\n  static endA(builder: flatbuffers.Builder): flatbuffers.Offset;\n  static createA(builder: flatbuffers.Builder, a: number): flatbuffers.Offset;\n  unpack(): AT;\n  unpackTo(_o: AT): void;\n}\nexport declare class AT implements flatbuffers.IGeneratedObject {\n  a: number;\n  constructor(a?: number);\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/union-underlying-type/a.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\nexport class A {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsA(bb, obj) {\n    return (obj || new A())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsA(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new A())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  a() {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n  }\n  mutate_a(value) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return 'UnionUnderlyingType.A';\n  }\n  static startA(builder) {\n    builder.startObject(1);\n  }\n  static addA(builder, a) {\n    builder.addFieldInt32(0, a, 0);\n  }\n  static endA(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static createA(builder, a) {\n    A.startA(builder);\n    A.addA(builder, a);\n    return A.endA(builder);\n  }\n  unpack() {\n    return new AT(this.a());\n  }\n  unpackTo(_o) {\n    _o.a = this.a();\n  }\n}\nexport class AT {\n  constructor(a = 0) {\n    this.a = a;\n  }\n  pack(builder) {\n    return A.createA(builder, this.a);\n  }\n}\n"
  },
  {
    "path": "tests/ts/union-underlying-type/a.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nexport class A implements flatbuffers.IUnpackableObject<AT> {\n  bb: flatbuffers.ByteBuffer | null = null;\n  bb_pos = 0;\n  __init(i: number, bb: flatbuffers.ByteBuffer): A {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n\n  static getRootAsA(bb: flatbuffers.ByteBuffer, obj?: A): A {\n    return (obj || new A()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  static getSizePrefixedRootAsA(bb: flatbuffers.ByteBuffer, obj?: A): A {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new A()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  a(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 4);\n    return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;\n  }\n\n  mutate_a(value: number): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 4);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n\n  static getFullyQualifiedName(): string {\n    return 'UnionUnderlyingType.A';\n  }\n\n  static startA(builder: flatbuffers.Builder) {\n    builder.startObject(1);\n  }\n\n  static addA(builder: flatbuffers.Builder, a: number) {\n    builder.addFieldInt32(0, a, 0);\n  }\n\n  static endA(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const offset = builder.endObject();\n    return offset;\n  }\n\n  static createA(builder: flatbuffers.Builder, a: number): flatbuffers.Offset {\n    A.startA(builder);\n    A.addA(builder, a);\n    return A.endA(builder);\n  }\n\n  unpack(): AT {\n    return new AT(this.a());\n  }\n\n  unpackTo(_o: AT): void {\n    _o.a = this.a();\n  }\n}\n\nexport class AT implements flatbuffers.IGeneratedObject {\n  constructor(public a: number = 0) {}\n\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset {\n    return A.createA(builder, this.a);\n  }\n}\n"
  },
  {
    "path": "tests/ts/union-underlying-type/abc.d.ts",
    "content": "import {A} from '../union-underlying-type/a.js';\nimport {B} from '../union-underlying-type/b.js';\nimport {C} from '../union-underlying-type/c.js';\nexport declare enum ABC {\n  NONE = 0,\n  A = 555,\n  B = 666,\n  C = 777,\n}\nexport declare function unionToAbc(\n  type: ABC,\n  accessor: (obj: A | B | C) => A | B | C | null,\n): A | B | C | null;\nexport declare function unionListToAbc(\n  type: ABC,\n  accessor: (index: number, obj: A | B | C) => A | B | C | null,\n  index: number,\n): A | B | C | null;\n"
  },
  {
    "path": "tests/ts/union-underlying-type/abc.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport {A} from '../union-underlying-type/a.js';\nimport {B} from '../union-underlying-type/b.js';\nimport {C} from '../union-underlying-type/c.js';\nexport var ABC;\n(function(ABC) {\nABC[ABC['NONE'] = 0] = 'NONE';\nABC[ABC['A'] = 555] = 'A';\nABC[ABC['B'] = 666] = 'B';\nABC[ABC['C'] = 777] = 'C';\n})(ABC || (ABC = {}));\nexport function unionToAbc(type, accessor) {\n  switch (ABC[type]) {\n    case 'NONE':\n      return null;\n    case 'A':\n      return accessor(new A());\n    case 'B':\n      return accessor(new B());\n    case 'C':\n      return accessor(new C());\n    default:\n      return null;\n  }\n}\nexport function unionListToAbc(type, accessor, index) {\n  switch (ABC[type]) {\n    case 'NONE':\n      return null;\n    case 'A':\n      return accessor(index, new A());\n    case 'B':\n      return accessor(index, new B());\n    case 'C':\n      return accessor(index, new C());\n    default:\n      return null;\n  }\n}\n"
  },
  {
    "path": "tests/ts/union-underlying-type/abc.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport {A, AT} from '../union-underlying-type/a.js';\nimport {B, BT} from '../union-underlying-type/b.js';\nimport {C, CT} from '../union-underlying-type/c.js';\n\nexport enum ABC {\n  NONE = 0,\n  A = 555,\n  B = 666,\n  C = 777,\n}\n\nexport function unionToAbc(\n  type: ABC,\n  accessor: (obj: A | B | C) => A | B | C | null,\n): A | B | C | null {\n  switch (ABC[type]) {\n    case 'NONE':\n      return null;\n    case 'A':\n      return accessor(new A())! as A;\n    case 'B':\n      return accessor(new B())! as B;\n    case 'C':\n      return accessor(new C())! as C;\n    default:\n      return null;\n  }\n}\n\nexport function unionListToAbc(\n  type: ABC,\n  accessor: (index: number, obj: A | B | C) => A | B | C | null,\n  index: number,\n): A | B | C | null {\n  switch (ABC[type]) {\n    case 'NONE':\n      return null;\n    case 'A':\n      return accessor(index, new A())! as A;\n    case 'B':\n      return accessor(index, new B())! as B;\n    case 'C':\n      return accessor(index, new C())! as C;\n    default:\n      return null;\n  }\n}\n"
  },
  {
    "path": "tests/ts/union-underlying-type/b.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nexport declare class B implements flatbuffers.IUnpackableObject<BT> {\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): B;\n  static getRootAsB(bb: flatbuffers.ByteBuffer, obj?: B): B;\n  static getSizePrefixedRootAsB(bb: flatbuffers.ByteBuffer, obj?: B): B;\n  b(): string | null;\n  b(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  static getFullyQualifiedName(): string;\n  static startB(builder: flatbuffers.Builder): void;\n  static addB(builder: flatbuffers.Builder, bOffset: flatbuffers.Offset): void;\n  static endB(builder: flatbuffers.Builder): flatbuffers.Offset;\n  static createB(\n    builder: flatbuffers.Builder,\n    bOffset: flatbuffers.Offset,\n  ): flatbuffers.Offset;\n  unpack(): BT;\n  unpackTo(_o: BT): void;\n}\nexport declare class BT implements flatbuffers.IGeneratedObject {\n  b: string | Uint8Array | null;\n  constructor(b?: string | Uint8Array | null);\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/union-underlying-type/b.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\nexport class B {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsB(bb, obj) {\n    return (obj || new B())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsB(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new B())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  b(optionalEncoding) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) :\n                    null;\n  }\n  static getFullyQualifiedName() {\n    return 'UnionUnderlyingType.B';\n  }\n  static startB(builder) {\n    builder.startObject(1);\n  }\n  static addB(builder, bOffset) {\n    builder.addFieldOffset(0, bOffset, 0);\n  }\n  static endB(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static createB(builder, bOffset) {\n    B.startB(builder);\n    B.addB(builder, bOffset);\n    return B.endB(builder);\n  }\n  unpack() {\n    return new BT(this.b());\n  }\n  unpackTo(_o) {\n    _o.b = this.b();\n  }\n}\nexport class BT {\n  constructor(b = null) {\n    this.b = b;\n  }\n  pack(builder) {\n    const b = (this.b !== null ? builder.createString(this.b) : 0);\n    return B.createB(builder, b);\n  }\n}\n"
  },
  {
    "path": "tests/ts/union-underlying-type/b.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nexport class B implements flatbuffers.IUnpackableObject<BT> {\n  bb: flatbuffers.ByteBuffer | null = null;\n  bb_pos = 0;\n  __init(i: number, bb: flatbuffers.ByteBuffer): B {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n\n  static getRootAsB(bb: flatbuffers.ByteBuffer, obj?: B): B {\n    return (obj || new B()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  static getSizePrefixedRootAsB(bb: flatbuffers.ByteBuffer, obj?: B): B {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new B()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  b(): string | null;\n  b(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n  b(optionalEncoding?: any): string | Uint8Array | null {\n    const offset = this.bb!.__offset(this.bb_pos, 4);\n    return offset\n      ? this.bb!.__string(this.bb_pos + offset, optionalEncoding)\n      : null;\n  }\n\n  static getFullyQualifiedName(): string {\n    return 'UnionUnderlyingType.B';\n  }\n\n  static startB(builder: flatbuffers.Builder) {\n    builder.startObject(1);\n  }\n\n  static addB(builder: flatbuffers.Builder, bOffset: flatbuffers.Offset) {\n    builder.addFieldOffset(0, bOffset, 0);\n  }\n\n  static endB(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const offset = builder.endObject();\n    return offset;\n  }\n\n  static createB(\n    builder: flatbuffers.Builder,\n    bOffset: flatbuffers.Offset,\n  ): flatbuffers.Offset {\n    B.startB(builder);\n    B.addB(builder, bOffset);\n    return B.endB(builder);\n  }\n\n  unpack(): BT {\n    return new BT(this.b());\n  }\n\n  unpackTo(_o: BT): void {\n    _o.b = this.b();\n  }\n}\n\nexport class BT implements flatbuffers.IGeneratedObject {\n  constructor(public b: string | Uint8Array | null = null) {}\n\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const b = this.b !== null ? builder.createString(this.b!) : 0;\n\n    return B.createB(builder, b);\n  }\n}\n"
  },
  {
    "path": "tests/ts/union-underlying-type/c.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nexport declare class C implements flatbuffers.IUnpackableObject<CT> {\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): C;\n  static getRootAsC(bb: flatbuffers.ByteBuffer, obj?: C): C;\n  static getSizePrefixedRootAsC(bb: flatbuffers.ByteBuffer, obj?: C): C;\n  c(): boolean;\n  mutate_c(value: boolean): boolean;\n  static getFullyQualifiedName(): string;\n  static startC(builder: flatbuffers.Builder): void;\n  static addC(builder: flatbuffers.Builder, c: boolean): void;\n  static endC(builder: flatbuffers.Builder): flatbuffers.Offset;\n  static createC(builder: flatbuffers.Builder, c: boolean): flatbuffers.Offset;\n  unpack(): CT;\n  unpackTo(_o: CT): void;\n}\nexport declare class CT implements flatbuffers.IGeneratedObject {\n  c: boolean;\n  constructor(c?: boolean);\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/union-underlying-type/c.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\nexport class C {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsC(bb, obj) {\n    return (obj || new C())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsC(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new C())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  c() {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false;\n  }\n  mutate_c(value) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return 'UnionUnderlyingType.C';\n  }\n  static startC(builder) {\n    builder.startObject(1);\n  }\n  static addC(builder, c) {\n    builder.addFieldInt8(0, +c, +false);\n  }\n  static endC(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static createC(builder, c) {\n    C.startC(builder);\n    C.addC(builder, c);\n    return C.endC(builder);\n  }\n  unpack() {\n    return new CT(this.c());\n  }\n  unpackTo(_o) {\n    _o.c = this.c();\n  }\n}\nexport class CT {\n  constructor(c = false) {\n    this.c = c;\n  }\n  pack(builder) {\n    return C.createC(builder, this.c);\n  }\n}\n"
  },
  {
    "path": "tests/ts/union-underlying-type/c.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nexport class C implements flatbuffers.IUnpackableObject<CT> {\n  bb: flatbuffers.ByteBuffer | null = null;\n  bb_pos = 0;\n  __init(i: number, bb: flatbuffers.ByteBuffer): C {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n\n  static getRootAsC(bb: flatbuffers.ByteBuffer, obj?: C): C {\n    return (obj || new C()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  static getSizePrefixedRootAsC(bb: flatbuffers.ByteBuffer, obj?: C): C {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new C()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  c(): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 4);\n    return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false;\n  }\n\n  mutate_c(value: boolean): boolean {\n    const offset = this.bb!.__offset(this.bb_pos, 4);\n\n    if (offset === 0) {\n      return false;\n    }\n\n    this.bb!.writeInt8(this.bb_pos + offset, +value);\n    return true;\n  }\n\n  static getFullyQualifiedName(): string {\n    return 'UnionUnderlyingType.C';\n  }\n\n  static startC(builder: flatbuffers.Builder) {\n    builder.startObject(1);\n  }\n\n  static addC(builder: flatbuffers.Builder, c: boolean) {\n    builder.addFieldInt8(0, +c, +false);\n  }\n\n  static endC(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const offset = builder.endObject();\n    return offset;\n  }\n\n  static createC(builder: flatbuffers.Builder, c: boolean): flatbuffers.Offset {\n    C.startC(builder);\n    C.addC(builder, c);\n    return C.endC(builder);\n  }\n\n  unpack(): CT {\n    return new CT(this.c());\n  }\n\n  unpackTo(_o: CT): void {\n    _o.c = this.c();\n  }\n}\n\nexport class CT implements flatbuffers.IGeneratedObject {\n  constructor(public c: boolean = false) {}\n\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset {\n    return C.createC(builder, this.c);\n  }\n}\n"
  },
  {
    "path": "tests/ts/union-underlying-type/d.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nimport {AT} from '../union-underlying-type/a.js';\nimport {ABC} from '../union-underlying-type/abc.js';\nimport {BT} from '../union-underlying-type/b.js';\nimport {CT} from '../union-underlying-type/c.js';\nexport declare class D implements flatbuffers.IUnpackableObject<DT> {\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): D;\n  static getRootAsD(bb: flatbuffers.ByteBuffer, obj?: D): D;\n  static getSizePrefixedRootAsD(bb: flatbuffers.ByteBuffer, obj?: D): D;\n  testUnionType(): ABC;\n  testUnion<T extends flatbuffers.Table>(obj: any): any | null;\n  testVectorOfUnionType(index: number): ABC | null;\n  testVectorOfUnionTypeLength(): number;\n  testVectorOfUnionTypeArray(): Int32Array | null;\n  testVectorOfUnion(index: number, obj: any): any | null;\n  testVectorOfUnionLength(): number;\n  static getFullyQualifiedName(): string;\n  static startD(builder: flatbuffers.Builder): void;\n  static addTestUnionType(\n    builder: flatbuffers.Builder,\n    testUnionType: ABC,\n  ): void;\n  static addTestUnion(\n    builder: flatbuffers.Builder,\n    testUnionOffset: flatbuffers.Offset,\n  ): void;\n  static addTestVectorOfUnionType(\n    builder: flatbuffers.Builder,\n    testVectorOfUnionTypeOffset: flatbuffers.Offset,\n  ): void;\n  static createTestVectorOfUnionTypeVector(\n    builder: flatbuffers.Builder,\n    data: ABC[],\n  ): flatbuffers.Offset;\n  static startTestVectorOfUnionTypeVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addTestVectorOfUnion(\n    builder: flatbuffers.Builder,\n    testVectorOfUnionOffset: flatbuffers.Offset,\n  ): void;\n  static createTestVectorOfUnionVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset;\n  static startTestVectorOfUnionVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static endD(builder: flatbuffers.Builder): flatbuffers.Offset;\n  static createD(\n    builder: flatbuffers.Builder,\n    testUnionType: ABC,\n    testUnionOffset: flatbuffers.Offset,\n    testVectorOfUnionTypeOffset: flatbuffers.Offset,\n    testVectorOfUnionOffset: flatbuffers.Offset,\n  ): flatbuffers.Offset;\n  unpack(): DT;\n  unpackTo(_o: DT): void;\n}\nexport declare class DT implements flatbuffers.IGeneratedObject {\n  testUnionType: ABC;\n  testUnion: AT | BT | CT | null;\n  testVectorOfUnionType: ABC[];\n  testVectorOfUnion: (AT | BT | CT)[];\n  constructor(\n    testUnionType?: ABC,\n    testUnion?: AT | BT | CT | null,\n    testVectorOfUnionType?: ABC[],\n    testVectorOfUnion?: (AT | BT | CT)[],\n  );\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/union-underlying-type/d.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\n\nimport {ABC, unionListToAbc, unionToAbc} from '../union-underlying-type/abc.js';\n\nexport class D {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsD(bb, obj) {\n    return (obj || new D())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsD(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new D())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  testUnionType() {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : ABC.NONE;\n  }\n  testUnion(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.__union(obj, this.bb_pos + offset) : null;\n  }\n  testVectorOfUnionType(index) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ?\n        this.bb.readInt32(this.bb.__vector(this.bb_pos + offset) + index * 4) :\n        null;\n  }\n  testVectorOfUnionTypeLength() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  testVectorOfUnionTypeArray() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ?\n        new Int32Array(\n            this.bb.bytes().buffer,\n            this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset),\n            this.bb.__vector_len(this.bb_pos + offset)) :\n        null;\n  }\n  testVectorOfUnion(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ?\n        this.bb.__union(\n            obj, this.bb.__vector(this.bb_pos + offset) + index * 4) :\n        null;\n  }\n  testVectorOfUnionLength() {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  static getFullyQualifiedName() {\n    return 'UnionUnderlyingType.D';\n  }\n  static startD(builder) {\n    builder.startObject(4);\n  }\n  static addTestUnionType(builder, testUnionType) {\n    builder.addFieldInt32(0, testUnionType, ABC.NONE);\n  }\n  static addTestUnion(builder, testUnionOffset) {\n    builder.addFieldOffset(1, testUnionOffset, 0);\n  }\n  static addTestVectorOfUnionType(builder, testVectorOfUnionTypeOffset) {\n    builder.addFieldOffset(2, testVectorOfUnionTypeOffset, 0);\n  }\n  static createTestVectorOfUnionTypeVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addInt32(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startTestVectorOfUnionTypeVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static addTestVectorOfUnion(builder, testVectorOfUnionOffset) {\n    builder.addFieldOffset(3, testVectorOfUnionOffset, 0);\n  }\n  static createTestVectorOfUnionVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startTestVectorOfUnionVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static endD(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static createD(\n      builder, testUnionType, testUnionOffset, testVectorOfUnionTypeOffset,\n      testVectorOfUnionOffset) {\n    D.startD(builder);\n    D.addTestUnionType(builder, testUnionType);\n    D.addTestUnion(builder, testUnionOffset);\n    D.addTestVectorOfUnionType(builder, testVectorOfUnionTypeOffset);\n    D.addTestVectorOfUnion(builder, testVectorOfUnionOffset);\n    return D.endD(builder);\n  }\n  unpack() {\n    return new DT(\n        this.testUnionType(), (() => {\n          const temp =\n              unionToAbc(this.testUnionType(), this.testUnion.bind(this));\n          if (temp === null) {\n            return null;\n          }\n          return temp.unpack();\n        })(),\n        this.bb.createScalarList(\n            this.testVectorOfUnionType.bind(this),\n            this.testVectorOfUnionTypeLength()),\n        (() => {\n          const ret = [];\n          for (let targetEnumIndex = 0;\n               targetEnumIndex < this.testVectorOfUnionTypeLength();\n               ++targetEnumIndex) {\n            const targetEnum = this.testVectorOfUnionType(targetEnumIndex);\n            if (targetEnum === null || ABC[targetEnum] === 'NONE') {\n              continue;\n            }\n            const temp = unionListToAbc(\n                targetEnum, this.testVectorOfUnion.bind(this), targetEnumIndex);\n            if (temp === null) {\n              continue;\n            }\n            ret.push(temp.unpack());\n          }\n          return ret;\n        })());\n  }\n  unpackTo(_o) {\n    _o.testUnionType = this.testUnionType();\n    _o.testUnion = (() => {\n      const temp = unionToAbc(this.testUnionType(), this.testUnion.bind(this));\n      if (temp === null) {\n        return null;\n      }\n      return temp.unpack();\n    })();\n    _o.testVectorOfUnionType = this.bb.createScalarList(\n        this.testVectorOfUnionType.bind(this),\n        this.testVectorOfUnionTypeLength());\n    _o.testVectorOfUnion = (() => {\n      const ret = [];\n      for (let targetEnumIndex = 0;\n           targetEnumIndex < this.testVectorOfUnionTypeLength();\n           ++targetEnumIndex) {\n        const targetEnum = this.testVectorOfUnionType(targetEnumIndex);\n        if (targetEnum === null || ABC[targetEnum] === 'NONE') {\n          continue;\n        }\n        const temp = unionListToAbc(\n            targetEnum, this.testVectorOfUnion.bind(this), targetEnumIndex);\n        if (temp === null) {\n          continue;\n        }\n        ret.push(temp.unpack());\n      }\n      return ret;\n    })();\n  }\n}\nexport class DT {\n  constructor(\n      testUnionType = ABC.NONE, testUnion = null, testVectorOfUnionType = [],\n      testVectorOfUnion = []) {\n    this.testUnionType = testUnionType;\n    this.testUnion = testUnion;\n    this.testVectorOfUnionType = testVectorOfUnionType;\n    this.testVectorOfUnion = testVectorOfUnion;\n  }\n  pack(builder) {\n    const testUnion = builder.createObjectOffset(this.testUnion);\n    const testVectorOfUnionType = D.createTestVectorOfUnionTypeVector(\n        builder, this.testVectorOfUnionType);\n    const testVectorOfUnion = D.createTestVectorOfUnionVector(\n        builder, builder.createObjectOffsetList(this.testVectorOfUnion));\n    return D.createD(\n        builder, this.testUnionType, testUnion, testVectorOfUnionType,\n        testVectorOfUnion);\n  }\n}\n"
  },
  {
    "path": "tests/ts/union-underlying-type/d.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport {A, AT} from '../union-underlying-type/a.js';\nimport {ABC, unionListToAbc, unionToAbc} from '../union-underlying-type/abc.js';\nimport {B, BT} from '../union-underlying-type/b.js';\nimport {C, CT} from '../union-underlying-type/c.js';\n\nexport class D implements flatbuffers.IUnpackableObject<DT> {\n  bb: flatbuffers.ByteBuffer | null = null;\n  bb_pos = 0;\n  __init(i: number, bb: flatbuffers.ByteBuffer): D {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n\n  static getRootAsD(bb: flatbuffers.ByteBuffer, obj?: D): D {\n    return (obj || new D()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  static getSizePrefixedRootAsD(bb: flatbuffers.ByteBuffer, obj?: D): D {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new D()).__init(\n      bb.readInt32(bb.position()) + bb.position(),\n      bb,\n    );\n  }\n\n  testUnionType(): ABC {\n    const offset = this.bb!.__offset(this.bb_pos, 4);\n    return offset ? this.bb!.readInt32(this.bb_pos + offset) : ABC.NONE;\n  }\n\n  testUnion<T extends flatbuffers.Table>(obj: any): any | null {\n    const offset = this.bb!.__offset(this.bb_pos, 6);\n    return offset ? this.bb!.__union(obj, this.bb_pos + offset) : null;\n  }\n\n  testVectorOfUnionType(index: number): ABC | null {\n    const offset = this.bb!.__offset(this.bb_pos, 8);\n    return offset\n      ? this.bb!.readInt32(this.bb!.__vector(this.bb_pos + offset) + index * 4)\n      : null;\n  }\n\n  testVectorOfUnionTypeLength(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 8);\n    return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n  }\n\n  testVectorOfUnionTypeArray(): Int32Array | null {\n    const offset = this.bb!.__offset(this.bb_pos, 8);\n    return offset\n      ? new Int32Array(\n          this.bb!.bytes().buffer,\n          this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset),\n          this.bb!.__vector_len(this.bb_pos + offset),\n        )\n      : null;\n  }\n\n  testVectorOfUnion(index: number, obj: any): any | null {\n    const offset = this.bb!.__offset(this.bb_pos, 10);\n    return offset\n      ? this.bb!.__union(\n          obj,\n          this.bb!.__vector(this.bb_pos + offset) + index * 4,\n        )\n      : null;\n  }\n\n  testVectorOfUnionLength(): number {\n    const offset = this.bb!.__offset(this.bb_pos, 10);\n    return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n  }\n\n  static getFullyQualifiedName(): string {\n    return 'UnionUnderlyingType.D';\n  }\n\n  static startD(builder: flatbuffers.Builder) {\n    builder.startObject(4);\n  }\n\n  static addTestUnionType(builder: flatbuffers.Builder, testUnionType: ABC) {\n    builder.addFieldInt32(0, testUnionType, ABC.NONE);\n  }\n\n  static addTestUnion(\n    builder: flatbuffers.Builder,\n    testUnionOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(1, testUnionOffset, 0);\n  }\n\n  static addTestVectorOfUnionType(\n    builder: flatbuffers.Builder,\n    testVectorOfUnionTypeOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(2, testVectorOfUnionTypeOffset, 0);\n  }\n\n  static createTestVectorOfUnionTypeVector(\n    builder: flatbuffers.Builder,\n    data: ABC[],\n  ): flatbuffers.Offset {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addInt32(data[i]!);\n    }\n    return builder.endVector();\n  }\n\n  static startTestVectorOfUnionTypeVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ) {\n    builder.startVector(4, numElems, 4);\n  }\n\n  static addTestVectorOfUnion(\n    builder: flatbuffers.Builder,\n    testVectorOfUnionOffset: flatbuffers.Offset,\n  ) {\n    builder.addFieldOffset(3, testVectorOfUnionOffset, 0);\n  }\n\n  static createTestVectorOfUnionVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]!);\n    }\n    return builder.endVector();\n  }\n\n  static startTestVectorOfUnionVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ) {\n    builder.startVector(4, numElems, 4);\n  }\n\n  static endD(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const offset = builder.endObject();\n    return offset;\n  }\n\n  static createD(\n    builder: flatbuffers.Builder,\n    testUnionType: ABC,\n    testUnionOffset: flatbuffers.Offset,\n    testVectorOfUnionTypeOffset: flatbuffers.Offset,\n    testVectorOfUnionOffset: flatbuffers.Offset,\n  ): flatbuffers.Offset {\n    D.startD(builder);\n    D.addTestUnionType(builder, testUnionType);\n    D.addTestUnion(builder, testUnionOffset);\n    D.addTestVectorOfUnionType(builder, testVectorOfUnionTypeOffset);\n    D.addTestVectorOfUnion(builder, testVectorOfUnionOffset);\n    return D.endD(builder);\n  }\n\n  unpack(): DT {\n    return new DT(\n      this.testUnionType(),\n      (() => {\n        const temp = unionToAbc(\n          this.testUnionType(),\n          this.testUnion.bind(this),\n        );\n        if (temp === null) {\n          return null;\n        }\n        return temp.unpack();\n      })(),\n      this.bb!.createScalarList<ABC>(\n        this.testVectorOfUnionType.bind(this),\n        this.testVectorOfUnionTypeLength(),\n      ),\n      (() => {\n        const ret: (AT | BT | CT)[] = [];\n        for (\n          let targetEnumIndex = 0;\n          targetEnumIndex < this.testVectorOfUnionTypeLength();\n          ++targetEnumIndex\n        ) {\n          const targetEnum = this.testVectorOfUnionType(targetEnumIndex);\n          if (targetEnum === null || ABC[targetEnum!] === 'NONE') {\n            continue;\n          }\n\n          const temp = unionListToAbc(\n            targetEnum,\n            this.testVectorOfUnion.bind(this),\n            targetEnumIndex,\n          );\n          if (temp === null) {\n            continue;\n          }\n          ret.push(temp.unpack());\n        }\n        return ret;\n      })(),\n    );\n  }\n\n  unpackTo(_o: DT): void {\n    _o.testUnionType = this.testUnionType();\n    _o.testUnion = (() => {\n      const temp = unionToAbc(this.testUnionType(), this.testUnion.bind(this));\n      if (temp === null) {\n        return null;\n      }\n      return temp.unpack();\n    })();\n    _o.testVectorOfUnionType = this.bb!.createScalarList<ABC>(\n      this.testVectorOfUnionType.bind(this),\n      this.testVectorOfUnionTypeLength(),\n    );\n    _o.testVectorOfUnion = (() => {\n      const ret: (AT | BT | CT)[] = [];\n      for (\n        let targetEnumIndex = 0;\n        targetEnumIndex < this.testVectorOfUnionTypeLength();\n        ++targetEnumIndex\n      ) {\n        const targetEnum = this.testVectorOfUnionType(targetEnumIndex);\n        if (targetEnum === null || ABC[targetEnum!] === 'NONE') {\n          continue;\n        }\n\n        const temp = unionListToAbc(\n          targetEnum,\n          this.testVectorOfUnion.bind(this),\n          targetEnumIndex,\n        );\n        if (temp === null) {\n          continue;\n        }\n        ret.push(temp.unpack());\n      }\n      return ret;\n    })();\n  }\n}\n\nexport class DT implements flatbuffers.IGeneratedObject {\n  constructor(\n    public testUnionType: ABC = ABC.NONE,\n    public testUnion: AT | BT | CT | null = null,\n    public testVectorOfUnionType: ABC[] = [],\n    public testVectorOfUnion: (AT | BT | CT)[] = [],\n  ) {}\n\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset {\n    const testUnion = builder.createObjectOffset(this.testUnion);\n    const testVectorOfUnionType = D.createTestVectorOfUnionTypeVector(\n      builder,\n      this.testVectorOfUnionType,\n    );\n    const testVectorOfUnion = D.createTestVectorOfUnionVector(\n      builder,\n      builder.createObjectOffsetList(this.testVectorOfUnion),\n    );\n\n    return D.createD(\n      builder,\n      this.testUnionType,\n      testUnion,\n      testVectorOfUnionType,\n      testVectorOfUnion,\n    );\n  }\n}\n"
  },
  {
    "path": "tests/ts/union-underlying-type.d.ts",
    "content": "export {A, AT} from './union-underlying-type/a.js';\nexport {ABC} from './union-underlying-type/abc.js';\nexport {B, BT} from './union-underlying-type/b.js';\nexport {C, CT} from './union-underlying-type/c.js';\nexport {D, DT} from './union-underlying-type/d.js';\n"
  },
  {
    "path": "tests/ts/union-underlying-type.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nexport {A, AT} from './union-underlying-type/a.js';\nexport {ABC} from './union-underlying-type/abc.js';\nexport {B, BT} from './union-underlying-type/b.js';\nexport {C, CT} from './union-underlying-type/c.js';\nexport {D, DT} from './union-underlying-type/d.js';\n"
  },
  {
    "path": "tests/ts/union-underlying-type.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport {A, AT} from './union-underlying-type/a.js';\nexport {ABC} from './union-underlying-type/abc.js';\nexport {B, BT} from './union-underlying-type/b.js';\nexport {C, CT} from './union-underlying-type/c.js';\nexport {D, DT} from './union-underlying-type/d.js';\n"
  },
  {
    "path": "tests/ts/union_underlying_type_test.d.ts",
    "content": "export * as UnionUnderlyingType from './union-underlying-type.js';\n"
  },
  {
    "path": "tests/ts/union_underlying_type_test.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nexport * as UnionUnderlyingType from './union-underlying-type.js';\n"
  },
  {
    "path": "tests/ts/union_underlying_type_test.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport * as UnionUnderlyingType from './union-underlying-type.js';\n"
  },
  {
    "path": "tests/ts/union_vector/attacker.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nexport declare class Attacker\n  implements flatbuffers.IUnpackableObject<AttackerT>\n{\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Attacker;\n  static getRootAsAttacker(\n    bb: flatbuffers.ByteBuffer,\n    obj?: Attacker,\n  ): Attacker;\n  static getSizePrefixedRootAsAttacker(\n    bb: flatbuffers.ByteBuffer,\n    obj?: Attacker,\n  ): Attacker;\n  swordAttackDamage(): number;\n  mutate_sword_attack_damage(value: number): boolean;\n  static getFullyQualifiedName(): string;\n  static startAttacker(builder: flatbuffers.Builder): void;\n  static addSwordAttackDamage(\n    builder: flatbuffers.Builder,\n    swordAttackDamage: number,\n  ): void;\n  static endAttacker(builder: flatbuffers.Builder): flatbuffers.Offset;\n  static createAttacker(\n    builder: flatbuffers.Builder,\n    swordAttackDamage: number,\n  ): flatbuffers.Offset;\n  unpack(): AttackerT;\n  unpackTo(_o: AttackerT): void;\n}\nexport declare class AttackerT implements flatbuffers.IGeneratedObject {\n  swordAttackDamage: number;\n  constructor(swordAttackDamage?: number);\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/union_vector/attacker.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\nexport class Attacker {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsAttacker(bb, obj) {\n    return (obj || new Attacker())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsAttacker(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new Attacker())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  swordAttackDamage() {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n  }\n  mutate_sword_attack_damage(value) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return 'Attacker';\n  }\n  static startAttacker(builder) {\n    builder.startObject(1);\n  }\n  static addSwordAttackDamage(builder, swordAttackDamage) {\n    builder.addFieldInt32(0, swordAttackDamage, 0);\n  }\n  static endAttacker(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static createAttacker(builder, swordAttackDamage) {\n    Attacker.startAttacker(builder);\n    Attacker.addSwordAttackDamage(builder, swordAttackDamage);\n    return Attacker.endAttacker(builder);\n  }\n  unpack() {\n    return new AttackerT(this.swordAttackDamage());\n  }\n  unpackTo(_o) {\n    _o.swordAttackDamage = this.swordAttackDamage();\n  }\n}\nexport class AttackerT {\n  constructor(swordAttackDamage = 0) {\n    this.swordAttackDamage = swordAttackDamage;\n  }\n  pack(builder) {\n    return Attacker.createAttacker(builder, this.swordAttackDamage);\n  }\n}\n"
  },
  {
    "path": "tests/ts/union_vector/attacker.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\n\n\nexport class Attacker implements flatbuffers.IUnpackableObject<AttackerT> {\n  bb: flatbuffers.ByteBuffer|null = null;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):Attacker {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\nstatic getRootAsAttacker(bb:flatbuffers.ByteBuffer, obj?:Attacker):Attacker {\n  return (obj || new Attacker()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic getSizePrefixedRootAsAttacker(bb:flatbuffers.ByteBuffer, obj?:Attacker):Attacker {\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n  return (obj || new Attacker()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nswordAttackDamage():number {\n  const offset = this.bb!.__offset(this.bb_pos, 4);\n  return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;\n}\n\nmutate_sword_attack_damage(value:number):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 4);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeInt32(this.bb_pos + offset, value);\n  return true;\n}\n\nstatic getFullyQualifiedName(): \"Attacker\" {\n  return 'Attacker';\n}\n\nstatic startAttacker(builder:flatbuffers.Builder) {\n  builder.startObject(1);\n}\n\nstatic addSwordAttackDamage(builder:flatbuffers.Builder, swordAttackDamage:number) {\n  builder.addFieldInt32(0, swordAttackDamage, 0);\n}\n\nstatic endAttacker(builder:flatbuffers.Builder):flatbuffers.Offset {\n  const offset = builder.endObject();\n  return offset;\n}\n\nstatic createAttacker(builder:flatbuffers.Builder, swordAttackDamage:number):flatbuffers.Offset {\n  Attacker.startAttacker(builder);\n  Attacker.addSwordAttackDamage(builder, swordAttackDamage);\n  return Attacker.endAttacker(builder);\n}\n\nunpack(): AttackerT {\n  return new AttackerT(\n    this.swordAttackDamage()\n  );\n}\n\n\nunpackTo(_o: AttackerT): void {\n  _o.swordAttackDamage = this.swordAttackDamage();\n}\n}\n\nexport class AttackerT implements flatbuffers.IGeneratedObject {\nconstructor(\n  public swordAttackDamage: number = 0\n){}\n\n\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n  return Attacker.createAttacker(builder,\n    this.swordAttackDamage\n  );\n}\n}\n"
  },
  {
    "path": "tests/ts/union_vector/book-reader.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nexport declare class BookReader\n  implements flatbuffers.IUnpackableObject<BookReaderT>\n{\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): BookReader;\n  booksRead(): number;\n  mutate_books_read(value: number): boolean;\n  static getFullyQualifiedName(): string;\n  static sizeOf(): number;\n  static createBookReader(\n    builder: flatbuffers.Builder,\n    books_read: number,\n  ): flatbuffers.Offset;\n  unpack(): BookReaderT;\n  unpackTo(_o: BookReaderT): void;\n}\nexport declare class BookReaderT implements flatbuffers.IGeneratedObject {\n  booksRead: number;\n  constructor(booksRead?: number);\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/union_vector/book-reader.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\nexport class BookReader {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  booksRead() {\n    return this.bb.readInt32(this.bb_pos);\n  }\n  mutate_books_read(value) {\n    this.bb.writeInt32(this.bb_pos + 0, value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return 'BookReader';\n  }\n  static sizeOf() {\n    return 4;\n  }\n  static createBookReader(builder, books_read) {\n    builder.prep(4, 4);\n    builder.writeInt32(books_read);\n    return builder.offset();\n  }\n  unpack() {\n    return new BookReaderT(this.booksRead());\n  }\n  unpackTo(_o) {\n    _o.booksRead = this.booksRead();\n  }\n}\nexport class BookReaderT {\n  constructor(booksRead = 0) {\n    this.booksRead = booksRead;\n  }\n  pack(builder) {\n    return BookReader.createBookReader(builder, this.booksRead);\n  }\n}\n"
  },
  {
    "path": "tests/ts/union_vector/book-reader.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\n\n\nexport class BookReader implements flatbuffers.IUnpackableObject<BookReaderT> {\n  bb: flatbuffers.ByteBuffer|null = null;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):BookReader {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\nbooksRead():number {\n  return this.bb!.readInt32(this.bb_pos);\n}\n\nmutate_books_read(value:number):boolean {\n  this.bb!.writeInt32(this.bb_pos + 0, value);\n  return true;\n}\n\nstatic getFullyQualifiedName(): \"BookReader\" {\n  return 'BookReader';\n}\n\nstatic sizeOf():number {\n  return 4;\n}\n\nstatic createBookReader(builder:flatbuffers.Builder, books_read: number):flatbuffers.Offset {\n  builder.prep(4, 4);\n  builder.writeInt32(books_read);\n  return builder.offset();\n}\n\n\nunpack(): BookReaderT {\n  return new BookReaderT(\n    this.booksRead()\n  );\n}\n\n\nunpackTo(_o: BookReaderT): void {\n  _o.booksRead = this.booksRead();\n}\n}\n\nexport class BookReaderT implements flatbuffers.IGeneratedObject {\nconstructor(\n  public booksRead: number = 0\n){}\n\n\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n  return BookReader.createBookReader(builder,\n    this.booksRead\n  );\n}\n}\n"
  },
  {
    "path": "tests/ts/union_vector/character.d.ts",
    "content": "import {Attacker} from './attacker.js';\nimport {BookReader} from './book-reader.js';\nimport {Rapunzel} from './rapunzel.js';\nexport declare enum Character {\n  NONE = 0,\n  MuLan = 1,\n  Rapunzel = 2,\n  Belle = 3,\n  BookFan = 4,\n  Other = 5,\n  Unused = 6,\n}\nexport declare function unionToCharacter(\n  type: Character,\n  accessor: (\n    obj: Attacker | BookReader | Rapunzel | string,\n  ) => Attacker | BookReader | Rapunzel | string | null,\n): Attacker | BookReader | Rapunzel | string | null;\nexport declare function unionListToCharacter(\n  type: Character,\n  accessor: (\n    index: number,\n    obj: Attacker | BookReader | Rapunzel | string,\n  ) => Attacker | BookReader | Rapunzel | string | null,\n  index: number,\n): Attacker | BookReader | Rapunzel | string | null;\n"
  },
  {
    "path": "tests/ts/union_vector/character.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport {Attacker} from './attacker.js';\nimport {BookReader} from './book-reader.js';\nimport {Rapunzel} from './rapunzel.js';\nexport var Character;\n(function(Character) {\nCharacter[Character['NONE'] = 0] = 'NONE';\nCharacter[Character['MuLan'] = 1] = 'MuLan';\nCharacter[Character['Rapunzel'] = 2] = 'Rapunzel';\nCharacter[Character['Belle'] = 3] = 'Belle';\nCharacter[Character['BookFan'] = 4] = 'BookFan';\nCharacter[Character['Other'] = 5] = 'Other';\nCharacter[Character['Unused'] = 6] = 'Unused';\n})(Character || (Character = {}));\nexport function unionToCharacter(type, accessor) {\n  switch (Character[type]) {\n    case 'NONE':\n      return null;\n    case 'MuLan':\n      return accessor(new Attacker());\n    case 'Rapunzel':\n      return accessor(new Rapunzel());\n    case 'Belle':\n      return accessor(new BookReader());\n    case 'BookFan':\n      return accessor(new BookReader());\n    case 'Other':\n      return accessor('');\n    case 'Unused':\n      return accessor('');\n    default:\n      return null;\n  }\n}\nexport function unionListToCharacter(type, accessor, index) {\n  switch (Character[type]) {\n    case 'NONE':\n      return null;\n    case 'MuLan':\n      return accessor(index, new Attacker());\n    case 'Rapunzel':\n      return accessor(index, new Rapunzel());\n    case 'Belle':\n      return accessor(index, new BookReader());\n    case 'BookFan':\n      return accessor(index, new BookReader());\n    case 'Other':\n      return accessor(index, '');\n    case 'Unused':\n      return accessor(index, '');\n    default:\n      return null;\n  }\n}\n"
  },
  {
    "path": "tests/ts/union_vector/character.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport { Attacker, AttackerT } from './attacker.js';\nimport { BookReader, BookReaderT } from './book-reader.js';\nimport { Rapunzel, RapunzelT } from './rapunzel.js';\n\n\nexport enum Character {\n  NONE = 0,\n  MuLan = 1,\n  Rapunzel = 2,\n  Belle = 3,\n  BookFan = 4,\n  Other = 5,\n  Unused = 6\n}\n\nexport function unionToCharacter(\n  type: Character,\n  accessor: (obj:Attacker|BookReader|Rapunzel|string) => Attacker|BookReader|Rapunzel|string|null\n): Attacker|BookReader|Rapunzel|string|null {\n  switch(Character[type]) {\n    case 'NONE': return null; \n    case 'MuLan': return accessor(new Attacker())! as Attacker;\n    case 'Rapunzel': return accessor(new Rapunzel())! as Rapunzel;\n    case 'Belle': return accessor(new BookReader())! as BookReader;\n    case 'BookFan': return accessor(new BookReader())! as BookReader;\n    case 'Other': return accessor('') as string;\n    case 'Unused': return accessor('') as string;\n    default: return null;\n  }\n}\n\nexport function unionListToCharacter(\n  type: Character, \n  accessor: (index: number, obj:Attacker|BookReader|Rapunzel|string) => Attacker|BookReader|Rapunzel|string|null, \n  index: number\n): Attacker|BookReader|Rapunzel|string|null {\n  switch(Character[type]) {\n    case 'NONE': return null; \n    case 'MuLan': return accessor(index, new Attacker())! as Attacker;\n    case 'Rapunzel': return accessor(index, new Rapunzel())! as Rapunzel;\n    case 'Belle': return accessor(index, new BookReader())! as BookReader;\n    case 'BookFan': return accessor(index, new BookReader())! as BookReader;\n    case 'Other': return accessor(index, '') as string;\n    case 'Unused': return accessor(index, '') as string;\n    default: return null;\n  }\n}\n"
  },
  {
    "path": "tests/ts/union_vector/falling-tub.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nexport declare class FallingTub\n  implements flatbuffers.IUnpackableObject<FallingTubT>\n{\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): FallingTub;\n  weight(): number;\n  mutate_weight(value: number): boolean;\n  static getFullyQualifiedName(): string;\n  static sizeOf(): number;\n  static createFallingTub(\n    builder: flatbuffers.Builder,\n    weight: number,\n  ): flatbuffers.Offset;\n  unpack(): FallingTubT;\n  unpackTo(_o: FallingTubT): void;\n}\nexport declare class FallingTubT implements flatbuffers.IGeneratedObject {\n  weight: number;\n  constructor(weight?: number);\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/union_vector/falling-tub.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\nexport class FallingTub {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  weight() {\n    return this.bb.readInt32(this.bb_pos);\n  }\n  mutate_weight(value) {\n    this.bb.writeInt32(this.bb_pos + 0, value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return 'FallingTub';\n  }\n  static sizeOf() {\n    return 4;\n  }\n  static createFallingTub(builder, weight) {\n    builder.prep(4, 4);\n    builder.writeInt32(weight);\n    return builder.offset();\n  }\n  unpack() {\n    return new FallingTubT(this.weight());\n  }\n  unpackTo(_o) {\n    _o.weight = this.weight();\n  }\n}\nexport class FallingTubT {\n  constructor(weight = 0) {\n    this.weight = weight;\n  }\n  pack(builder) {\n    return FallingTub.createFallingTub(builder, this.weight);\n  }\n}\n"
  },
  {
    "path": "tests/ts/union_vector/falling-tub.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\n\n\nexport class FallingTub implements flatbuffers.IUnpackableObject<FallingTubT> {\n  bb: flatbuffers.ByteBuffer|null = null;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):FallingTub {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\nweight():number {\n  return this.bb!.readInt32(this.bb_pos);\n}\n\nmutate_weight(value:number):boolean {\n  this.bb!.writeInt32(this.bb_pos + 0, value);\n  return true;\n}\n\nstatic getFullyQualifiedName(): \"FallingTub\" {\n  return 'FallingTub';\n}\n\nstatic sizeOf():number {\n  return 4;\n}\n\nstatic createFallingTub(builder:flatbuffers.Builder, weight: number):flatbuffers.Offset {\n  builder.prep(4, 4);\n  builder.writeInt32(weight);\n  return builder.offset();\n}\n\n\nunpack(): FallingTubT {\n  return new FallingTubT(\n    this.weight()\n  );\n}\n\n\nunpackTo(_o: FallingTubT): void {\n  _o.weight = this.weight();\n}\n}\n\nexport class FallingTubT implements flatbuffers.IGeneratedObject {\nconstructor(\n  public weight: number = 0\n){}\n\n\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n  return FallingTub.createFallingTub(builder,\n    this.weight\n  );\n}\n}\n"
  },
  {
    "path": "tests/ts/union_vector/gadget.d.ts",
    "content": "import {FallingTub} from './falling-tub.js';\nimport {HandFan} from './hand-fan.js';\nexport declare enum Gadget {\n  NONE = 0,\n  FallingTub = 1,\n  HandFan = 2,\n}\nexport declare function unionToGadget(\n  type: Gadget,\n  accessor: (obj: FallingTub | HandFan) => FallingTub | HandFan | null,\n): FallingTub | HandFan | null;\nexport declare function unionListToGadget(\n  type: Gadget,\n  accessor: (\n    index: number,\n    obj: FallingTub | HandFan,\n  ) => FallingTub | HandFan | null,\n  index: number,\n): FallingTub | HandFan | null;\n"
  },
  {
    "path": "tests/ts/union_vector/gadget.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport {FallingTub} from './falling-tub.js';\nimport {HandFan} from './hand-fan.js';\nexport var Gadget;\n(function(Gadget) {\nGadget[Gadget['NONE'] = 0] = 'NONE';\nGadget[Gadget['FallingTub'] = 1] = 'FallingTub';\nGadget[Gadget['HandFan'] = 2] = 'HandFan';\n})(Gadget || (Gadget = {}));\nexport function unionToGadget(type, accessor) {\n  switch (Gadget[type]) {\n    case 'NONE':\n      return null;\n    case 'FallingTub':\n      return accessor(new FallingTub());\n    case 'HandFan':\n      return accessor(new HandFan());\n    default:\n      return null;\n  }\n}\nexport function unionListToGadget(type, accessor, index) {\n  switch (Gadget[type]) {\n    case 'NONE':\n      return null;\n    case 'FallingTub':\n      return accessor(index, new FallingTub());\n    case 'HandFan':\n      return accessor(index, new HandFan());\n    default:\n      return null;\n  }\n}\n"
  },
  {
    "path": "tests/ts/union_vector/gadget.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport { FallingTub, FallingTubT } from './falling-tub.js';\nimport { HandFan, HandFanT } from './hand-fan.js';\n\n\nexport enum Gadget {\n  NONE = 0,\n  FallingTub = 1,\n  HandFan = 2\n}\n\nexport function unionToGadget(\n  type: Gadget,\n  accessor: (obj:FallingTub|HandFan) => FallingTub|HandFan|null\n): FallingTub|HandFan|null {\n  switch(Gadget[type]) {\n    case 'NONE': return null; \n    case 'FallingTub': return accessor(new FallingTub())! as FallingTub;\n    case 'HandFan': return accessor(new HandFan())! as HandFan;\n    default: return null;\n  }\n}\n\nexport function unionListToGadget(\n  type: Gadget, \n  accessor: (index: number, obj:FallingTub|HandFan) => FallingTub|HandFan|null, \n  index: number\n): FallingTub|HandFan|null {\n  switch(Gadget[type]) {\n    case 'NONE': return null; \n    case 'FallingTub': return accessor(index, new FallingTub())! as FallingTub;\n    case 'HandFan': return accessor(index, new HandFan())! as HandFan;\n    default: return null;\n  }\n}\n"
  },
  {
    "path": "tests/ts/union_vector/hand-fan.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nexport declare class HandFan\n  implements flatbuffers.IUnpackableObject<HandFanT>\n{\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): HandFan;\n  static getRootAsHandFan(bb: flatbuffers.ByteBuffer, obj?: HandFan): HandFan;\n  static getSizePrefixedRootAsHandFan(\n    bb: flatbuffers.ByteBuffer,\n    obj?: HandFan,\n  ): HandFan;\n  length(): number;\n  mutate_length(value: number): boolean;\n  static getFullyQualifiedName(): string;\n  static startHandFan(builder: flatbuffers.Builder): void;\n  static addLength(builder: flatbuffers.Builder, length: number): void;\n  static endHandFan(builder: flatbuffers.Builder): flatbuffers.Offset;\n  static createHandFan(\n    builder: flatbuffers.Builder,\n    length: number,\n  ): flatbuffers.Offset;\n  unpack(): HandFanT;\n  unpackTo(_o: HandFanT): void;\n}\nexport declare class HandFanT implements flatbuffers.IGeneratedObject {\n  length: number;\n  constructor(length?: number);\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/union_vector/hand-fan.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\nexport class HandFan {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsHandFan(bb, obj) {\n    return (obj || new HandFan())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsHandFan(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new HandFan())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  length() {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n  }\n  mutate_length(value) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return 'HandFan';\n  }\n  static startHandFan(builder) {\n    builder.startObject(1);\n  }\n  static addLength(builder, length) {\n    builder.addFieldInt32(0, length, 0);\n  }\n  static endHandFan(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static createHandFan(builder, length) {\n    HandFan.startHandFan(builder);\n    HandFan.addLength(builder, length);\n    return HandFan.endHandFan(builder);\n  }\n  unpack() {\n    return new HandFanT(this.length());\n  }\n  unpackTo(_o) {\n    _o.length = this.length();\n  }\n}\nexport class HandFanT {\n  constructor(length = 0) {\n    this.length = length;\n  }\n  pack(builder) {\n    return HandFan.createHandFan(builder, this.length);\n  }\n}\n"
  },
  {
    "path": "tests/ts/union_vector/hand-fan.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\n\n\nexport class HandFan implements flatbuffers.IUnpackableObject<HandFanT> {\n  bb: flatbuffers.ByteBuffer|null = null;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):HandFan {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\nstatic getRootAsHandFan(bb:flatbuffers.ByteBuffer, obj?:HandFan):HandFan {\n  return (obj || new HandFan()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic getSizePrefixedRootAsHandFan(bb:flatbuffers.ByteBuffer, obj?:HandFan):HandFan {\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n  return (obj || new HandFan()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nlength():number {\n  const offset = this.bb!.__offset(this.bb_pos, 4);\n  return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;\n}\n\nmutate_length(value:number):boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 4);\n\n  if (offset === 0) {\n    return false;\n  }\n\n  this.bb!.writeInt32(this.bb_pos + offset, value);\n  return true;\n}\n\nstatic getFullyQualifiedName(): \"HandFan\" {\n  return 'HandFan';\n}\n\nstatic startHandFan(builder:flatbuffers.Builder) {\n  builder.startObject(1);\n}\n\nstatic addLength(builder:flatbuffers.Builder, length:number) {\n  builder.addFieldInt32(0, length, 0);\n}\n\nstatic endHandFan(builder:flatbuffers.Builder):flatbuffers.Offset {\n  const offset = builder.endObject();\n  return offset;\n}\n\nstatic createHandFan(builder:flatbuffers.Builder, length:number):flatbuffers.Offset {\n  HandFan.startHandFan(builder);\n  HandFan.addLength(builder, length);\n  return HandFan.endHandFan(builder);\n}\n\nunpack(): HandFanT {\n  return new HandFanT(\n    this.length()\n  );\n}\n\n\nunpackTo(_o: HandFanT): void {\n  _o.length = this.length();\n}\n}\n\nexport class HandFanT implements flatbuffers.IGeneratedObject {\nconstructor(\n  public length: number = 0\n){}\n\n\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n  return HandFan.createHandFan(builder,\n    this.length\n  );\n}\n}\n"
  },
  {
    "path": "tests/ts/union_vector/movie.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nimport {AttackerT} from './attacker.js';\nimport {BookReaderT} from './book-reader.js';\nimport {Character} from './character.js';\nimport {RapunzelT} from './rapunzel.js';\nexport declare class Movie implements flatbuffers.IUnpackableObject<MovieT> {\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Movie;\n  static getRootAsMovie(bb: flatbuffers.ByteBuffer, obj?: Movie): Movie;\n  static getSizePrefixedRootAsMovie(\n    bb: flatbuffers.ByteBuffer,\n    obj?: Movie,\n  ): Movie;\n  static bufferHasIdentifier(bb: flatbuffers.ByteBuffer): boolean;\n  mainCharacterType(): Character;\n  mainCharacter<T extends flatbuffers.Table>(\n    obj: any | string,\n  ): any | string | null;\n  charactersType(index: number): Character | null;\n  charactersTypeLength(): number;\n  charactersTypeArray(): Uint8Array | null;\n  characters(index: number, obj: any | string): any | string | null;\n  charactersLength(): number;\n  static getFullyQualifiedName(): string;\n  static startMovie(builder: flatbuffers.Builder): void;\n  static addMainCharacterType(\n    builder: flatbuffers.Builder,\n    mainCharacterType: Character,\n  ): void;\n  static addMainCharacter(\n    builder: flatbuffers.Builder,\n    mainCharacterOffset: flatbuffers.Offset,\n  ): void;\n  static addCharactersType(\n    builder: flatbuffers.Builder,\n    charactersTypeOffset: flatbuffers.Offset,\n  ): void;\n  static createCharactersTypeVector(\n    builder: flatbuffers.Builder,\n    data: Character[],\n  ): flatbuffers.Offset;\n  static startCharactersTypeVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static addCharacters(\n    builder: flatbuffers.Builder,\n    charactersOffset: flatbuffers.Offset,\n  ): void;\n  static createCharactersVector(\n    builder: flatbuffers.Builder,\n    data: flatbuffers.Offset[],\n  ): flatbuffers.Offset;\n  static startCharactersVector(\n    builder: flatbuffers.Builder,\n    numElems: number,\n  ): void;\n  static endMovie(builder: flatbuffers.Builder): flatbuffers.Offset;\n  static finishMovieBuffer(\n    builder: flatbuffers.Builder,\n    offset: flatbuffers.Offset,\n  ): void;\n  static finishSizePrefixedMovieBuffer(\n    builder: flatbuffers.Builder,\n    offset: flatbuffers.Offset,\n  ): void;\n  static createMovie(\n    builder: flatbuffers.Builder,\n    mainCharacterType: Character,\n    mainCharacterOffset: flatbuffers.Offset,\n    charactersTypeOffset: flatbuffers.Offset,\n    charactersOffset: flatbuffers.Offset,\n  ): flatbuffers.Offset;\n  unpack(): MovieT;\n  unpackTo(_o: MovieT): void;\n}\nexport declare class MovieT implements flatbuffers.IGeneratedObject {\n  mainCharacterType: Character;\n  mainCharacter: AttackerT | BookReaderT | RapunzelT | string | null;\n  charactersType: Character[];\n  characters: (AttackerT | BookReaderT | RapunzelT | string)[];\n  constructor(\n    mainCharacterType?: Character,\n    mainCharacter?: AttackerT | BookReaderT | RapunzelT | string | null,\n    charactersType?: Character[],\n    characters?: (AttackerT | BookReaderT | RapunzelT | string)[],\n  );\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/union_vector/movie.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nimport * as flatbuffers from 'flatbuffers';\n\nimport {Character, unionListToCharacter, unionToCharacter} from './character.js';\n\nexport class Movie {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsMovie(bb, obj) {\n    return (obj || new Movie())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsMovie(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new Movie())\n        .__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static bufferHasIdentifier(bb) {\n    return bb.__has_identifier('MOVI');\n  }\n  mainCharacterType() {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.readUint8(this.bb_pos + offset) : Character.NONE;\n  }\n  mainCharacter(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.__union_with_string(obj, this.bb_pos + offset) :\n                    null;\n  }\n  charactersType(index) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ?\n        this.bb.readUint8(this.bb.__vector(this.bb_pos + offset) + index) :\n        null;\n  }\n  charactersTypeLength() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  charactersTypeArray() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ?\n        new Uint8Array(\n            this.bb.bytes().buffer,\n            this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset),\n            this.bb.__vector_len(this.bb_pos + offset)) :\n        null;\n  }\n  characters(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ?\n        this.bb.__union_with_string(\n            obj, this.bb.__vector(this.bb_pos + offset) + index * 4) :\n        null;\n  }\n  charactersLength() {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  static getFullyQualifiedName() {\n    return 'Movie';\n  }\n  static startMovie(builder) {\n    builder.startObject(4);\n  }\n  static addMainCharacterType(builder, mainCharacterType) {\n    builder.addFieldInt8(0, mainCharacterType, Character.NONE);\n  }\n  static addMainCharacter(builder, mainCharacterOffset) {\n    builder.addFieldOffset(1, mainCharacterOffset, 0);\n  }\n  static addCharactersType(builder, charactersTypeOffset) {\n    builder.addFieldOffset(2, charactersTypeOffset, 0);\n  }\n  static createCharactersTypeVector(builder, data) {\n    builder.startVector(1, data.length, 1);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addInt8(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startCharactersTypeVector(builder, numElems) {\n    builder.startVector(1, numElems, 1);\n  }\n  static addCharacters(builder, charactersOffset) {\n    builder.addFieldOffset(3, charactersOffset, 0);\n  }\n  static createCharactersVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startCharactersVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static endMovie(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static finishMovieBuffer(builder, offset) {\n    builder.finish(offset, 'MOVI');\n  }\n  static finishSizePrefixedMovieBuffer(builder, offset) {\n    builder.finish(offset, 'MOVI', true);\n  }\n  static createMovie(\n      builder, mainCharacterType, mainCharacterOffset, charactersTypeOffset,\n      charactersOffset) {\n    Movie.startMovie(builder);\n    Movie.addMainCharacterType(builder, mainCharacterType);\n    Movie.addMainCharacter(builder, mainCharacterOffset);\n    Movie.addCharactersType(builder, charactersTypeOffset);\n    Movie.addCharacters(builder, charactersOffset);\n    return Movie.endMovie(builder);\n  }\n  unpack() {\n    return new MovieT(\n        this.mainCharacterType(), (() => {\n          const temp = unionToCharacter(\n              this.mainCharacterType(), this.mainCharacter.bind(this));\n          if (temp === null) {\n            return null;\n          }\n          if (typeof temp === 'string') {\n            return temp;\n          }\n          return temp.unpack();\n        })(),\n        this.bb.createScalarList(\n            this.charactersType.bind(this), this.charactersTypeLength()),\n        (() => {\n          const ret = [];\n          for (let targetEnumIndex = 0;\n               targetEnumIndex < this.charactersTypeLength();\n               ++targetEnumIndex) {\n            const targetEnum = this.charactersType(targetEnumIndex);\n            if (targetEnum === null || Character[targetEnum] === 'NONE') {\n              continue;\n            }\n            const temp = unionListToCharacter(\n                targetEnum, this.characters.bind(this), targetEnumIndex);\n            if (temp === null) {\n              continue;\n            }\n            if (typeof temp === 'string') {\n              ret.push(temp);\n              continue;\n            }\n            ret.push(temp.unpack());\n          }\n          return ret;\n        })());\n  }\n  unpackTo(_o) {\n    _o.mainCharacterType = this.mainCharacterType();\n    _o.mainCharacter = (() => {\n      const temp = unionToCharacter(\n          this.mainCharacterType(), this.mainCharacter.bind(this));\n      if (temp === null) {\n        return null;\n      }\n      if (typeof temp === 'string') {\n        return temp;\n      }\n      return temp.unpack();\n    })();\n    _o.charactersType = this.bb.createScalarList(\n        this.charactersType.bind(this), this.charactersTypeLength());\n    _o.characters = (() => {\n      const ret = [];\n      for (let targetEnumIndex = 0;\n           targetEnumIndex < this.charactersTypeLength(); ++targetEnumIndex) {\n        const targetEnum = this.charactersType(targetEnumIndex);\n        if (targetEnum === null || Character[targetEnum] === 'NONE') {\n          continue;\n        }\n        const temp = unionListToCharacter(\n            targetEnum, this.characters.bind(this), targetEnumIndex);\n        if (temp === null) {\n          continue;\n        }\n        if (typeof temp === 'string') {\n          ret.push(temp);\n          continue;\n        }\n        ret.push(temp.unpack());\n      }\n      return ret;\n    })();\n  }\n}\nexport class MovieT {\n  constructor(\n      mainCharacterType = Character.NONE, mainCharacter = null,\n      charactersType = [], characters = []) {\n    this.mainCharacterType = mainCharacterType;\n    this.mainCharacter = mainCharacter;\n    this.charactersType = charactersType;\n    this.characters = characters;\n  }\n  pack(builder) {\n    const mainCharacter = builder.createObjectOffset(this.mainCharacter);\n    const charactersType =\n        Movie.createCharactersTypeVector(builder, this.charactersType);\n    const characters = Movie.createCharactersVector(\n        builder, builder.createObjectOffsetList(this.characters));\n    return Movie.createMovie(\n        builder, this.mainCharacterType, mainCharacter, charactersType,\n        characters);\n  }\n}\n"
  },
  {
    "path": "tests/ts/union_vector/movie.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport { Attacker, AttackerT } from './attacker.js';\nimport { BookReader, BookReaderT } from './book-reader.js';\nimport { Character, unionToCharacter, unionListToCharacter } from './character.js';\nimport { Rapunzel, RapunzelT } from './rapunzel.js';\n\n\nexport class Movie implements flatbuffers.IUnpackableObject<MovieT> {\n  bb: flatbuffers.ByteBuffer|null = null;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):Movie {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\nstatic getRootAsMovie(bb:flatbuffers.ByteBuffer, obj?:Movie):Movie {\n  return (obj || new Movie()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic getSizePrefixedRootAsMovie(bb:flatbuffers.ByteBuffer, obj?:Movie):Movie {\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n  return (obj || new Movie()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic bufferHasIdentifier(bb:flatbuffers.ByteBuffer):boolean {\n  return bb.__has_identifier('MOVI');\n}\n\nmainCharacterType():Character {\n  const offset = this.bb!.__offset(this.bb_pos, 4);\n  return offset ? this.bb!.readUint8(this.bb_pos + offset) : Character.NONE;\n}\n\nmainCharacter<T extends flatbuffers.Table>(obj:any|string):any|string|null {\n  const offset = this.bb!.__offset(this.bb_pos, 6);\n  return offset ? this.bb!.__union_with_string(obj, this.bb_pos + offset) : null;\n}\n\ncharactersType(index: number):Character|null {\n  const offset = this.bb!.__offset(this.bb_pos, 8);\n  return offset ? this.bb!.readUint8(this.bb!.__vector(this.bb_pos + offset) + index) : null;\n}\n\ncharactersTypeLength():number {\n  const offset = this.bb!.__offset(this.bb_pos, 8);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\ncharactersTypeArray():Uint8Array|null {\n  const offset = this.bb!.__offset(this.bb_pos, 8);\n  return offset ? new Uint8Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\n}\n\ncharacters(index: number, obj:any|string):any|string|null {\n  const offset = this.bb!.__offset(this.bb_pos, 10);\n  return offset ? this.bb!.__union_with_string(obj, this.bb!.__vector(this.bb_pos + offset) + index * 4) : null;\n}\n\ncharactersLength():number {\n  const offset = this.bb!.__offset(this.bb_pos, 10);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\nstatic getFullyQualifiedName(): \"Movie\" {\n  return 'Movie';\n}\n\nstatic startMovie(builder:flatbuffers.Builder) {\n  builder.startObject(4);\n}\n\nstatic addMainCharacterType(builder:flatbuffers.Builder, mainCharacterType:Character) {\n  builder.addFieldInt8(0, mainCharacterType, Character.NONE);\n}\n\nstatic addMainCharacter(builder:flatbuffers.Builder, mainCharacterOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(1, mainCharacterOffset, 0);\n}\n\nstatic addCharactersType(builder:flatbuffers.Builder, charactersTypeOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(2, charactersTypeOffset, 0);\n}\n\nstatic createCharactersTypeVector(builder:flatbuffers.Builder, data:Character[]):flatbuffers.Offset {\n  builder.startVector(1, data.length, 1);\n  for (let i = data.length - 1; i >= 0; i--) {\n    builder.addInt8(data[i]!);\n  }\n  return builder.endVector();\n}\n\nstatic startCharactersTypeVector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(1, numElems, 1);\n}\n\nstatic addCharacters(builder:flatbuffers.Builder, charactersOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(3, charactersOffset, 0);\n}\n\nstatic createCharactersVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {\n  builder.startVector(4, data.length, 4);\n  for (let i = data.length - 1; i >= 0; i--) {\n    builder.addOffset(data[i]!);\n  }\n  return builder.endVector();\n}\n\nstatic startCharactersVector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(4, numElems, 4);\n}\n\nstatic endMovie(builder:flatbuffers.Builder):flatbuffers.Offset {\n  const offset = builder.endObject();\n  return offset;\n}\n\nstatic finishMovieBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) {\n  builder.finish(offset, 'MOVI');\n}\n\nstatic finishSizePrefixedMovieBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) {\n  builder.finish(offset, 'MOVI', true);\n}\n\nstatic createMovie(builder:flatbuffers.Builder, mainCharacterType:Character, mainCharacterOffset:flatbuffers.Offset, charactersTypeOffset:flatbuffers.Offset, charactersOffset:flatbuffers.Offset):flatbuffers.Offset {\n  Movie.startMovie(builder);\n  Movie.addMainCharacterType(builder, mainCharacterType);\n  Movie.addMainCharacter(builder, mainCharacterOffset);\n  Movie.addCharactersType(builder, charactersTypeOffset);\n  Movie.addCharacters(builder, charactersOffset);\n  return Movie.endMovie(builder);\n}\n\nunpack(): MovieT {\n  return new MovieT(\n    this.mainCharacterType(),\n    (() => {\n      const temp = unionToCharacter(this.mainCharacterType(), this.mainCharacter.bind(this));\n      if(temp === null) { return null; }\n      if(typeof temp === 'string') { return temp; }\n      return temp.unpack()\n  })(),\n    this.bb!.createScalarList<Character>(this.charactersType.bind(this), this.charactersTypeLength()),\n    (() => {\n    const ret: (AttackerT|BookReaderT|RapunzelT|string)[] = [];\n    for(let targetEnumIndex = 0; targetEnumIndex < this.charactersTypeLength(); ++targetEnumIndex) {\n      const targetEnum = this.charactersType(targetEnumIndex);\n      if(targetEnum === null || Character[targetEnum!] === 'NONE') { continue; }\n\n      const temp = unionListToCharacter(targetEnum, this.characters.bind(this), targetEnumIndex);\n      if(temp === null) { continue; }\n      if(typeof temp === 'string') { ret.push(temp); continue; }\n      ret.push(temp.unpack());\n    }\n    return ret;\n  })()\n  );\n}\n\n\nunpackTo(_o: MovieT): void {\n  _o.mainCharacterType = this.mainCharacterType();\n  _o.mainCharacter = (() => {\n      const temp = unionToCharacter(this.mainCharacterType(), this.mainCharacter.bind(this));\n      if(temp === null) { return null; }\n      if(typeof temp === 'string') { return temp; }\n      return temp.unpack()\n  })();\n  _o.charactersType = this.bb!.createScalarList<Character>(this.charactersType.bind(this), this.charactersTypeLength());\n  _o.characters = (() => {\n    const ret: (AttackerT|BookReaderT|RapunzelT|string)[] = [];\n    for(let targetEnumIndex = 0; targetEnumIndex < this.charactersTypeLength(); ++targetEnumIndex) {\n      const targetEnum = this.charactersType(targetEnumIndex);\n      if(targetEnum === null || Character[targetEnum!] === 'NONE') { continue; }\n\n      const temp = unionListToCharacter(targetEnum, this.characters.bind(this), targetEnumIndex);\n      if(temp === null) { continue; }\n      if(typeof temp === 'string') { ret.push(temp); continue; }\n      ret.push(temp.unpack());\n    }\n    return ret;\n  })();\n}\n}\n\nexport class MovieT implements flatbuffers.IGeneratedObject {\nconstructor(\n  public mainCharacterType: Character = Character.NONE,\n  public mainCharacter: AttackerT|BookReaderT|RapunzelT|string|null = null,\n  public charactersType: (Character)[] = [],\n  public characters: (AttackerT|BookReaderT|RapunzelT|string)[] = []\n){}\n\n\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n  const mainCharacter = builder.createObjectOffset(this.mainCharacter);\n  const charactersType = Movie.createCharactersTypeVector(builder, this.charactersType);\n  const characters = Movie.createCharactersVector(builder, builder.createObjectOffsetList(this.characters));\n\n  return Movie.createMovie(builder,\n    this.mainCharacterType,\n    mainCharacter,\n    charactersType,\n    characters\n  );\n}\n}\n"
  },
  {
    "path": "tests/ts/union_vector/rapunzel.d.ts",
    "content": "import * as flatbuffers from 'flatbuffers';\nexport declare class Rapunzel\n  implements flatbuffers.IUnpackableObject<RapunzelT>\n{\n  bb: flatbuffers.ByteBuffer | null;\n  bb_pos: number;\n  __init(i: number, bb: flatbuffers.ByteBuffer): Rapunzel;\n  hairLength(): number;\n  mutate_hair_length(value: number): boolean;\n  static getFullyQualifiedName(): string;\n  static sizeOf(): number;\n  static createRapunzel(\n    builder: flatbuffers.Builder,\n    hair_length: number,\n  ): flatbuffers.Offset;\n  unpack(): RapunzelT;\n  unpackTo(_o: RapunzelT): void;\n}\nexport declare class RapunzelT implements flatbuffers.IGeneratedObject {\n  hairLength: number;\n  constructor(hairLength?: number);\n  pack(builder: flatbuffers.Builder): flatbuffers.Offset;\n}\n"
  },
  {
    "path": "tests/ts/union_vector/rapunzel.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\nexport class Rapunzel {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  hairLength() {\n    return this.bb.readInt32(this.bb_pos);\n  }\n  mutate_hair_length(value) {\n    this.bb.writeInt32(this.bb_pos + 0, value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return 'Rapunzel';\n  }\n  static sizeOf() {\n    return 4;\n  }\n  static createRapunzel(builder, hair_length) {\n    builder.prep(4, 4);\n    builder.writeInt32(hair_length);\n    return builder.offset();\n  }\n  unpack() {\n    return new RapunzelT(this.hairLength());\n  }\n  unpackTo(_o) {\n    _o.hairLength = this.hairLength();\n  }\n}\nexport class RapunzelT {\n  constructor(hairLength = 0) {\n    this.hairLength = hairLength;\n  }\n  pack(builder) {\n    return Rapunzel.createRapunzel(builder, this.hairLength);\n  }\n}\n"
  },
  {
    "path": "tests/ts/union_vector/rapunzel.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\n\n\nexport class Rapunzel implements flatbuffers.IUnpackableObject<RapunzelT> {\n  bb: flatbuffers.ByteBuffer|null = null;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):Rapunzel {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\nhairLength():number {\n  return this.bb!.readInt32(this.bb_pos);\n}\n\nmutate_hair_length(value:number):boolean {\n  this.bb!.writeInt32(this.bb_pos + 0, value);\n  return true;\n}\n\nstatic getFullyQualifiedName(): \"Rapunzel\" {\n  return 'Rapunzel';\n}\n\nstatic sizeOf():number {\n  return 4;\n}\n\nstatic createRapunzel(builder:flatbuffers.Builder, hair_length: number):flatbuffers.Offset {\n  builder.prep(4, 4);\n  builder.writeInt32(hair_length);\n  return builder.offset();\n}\n\n\nunpack(): RapunzelT {\n  return new RapunzelT(\n    this.hairLength()\n  );\n}\n\n\nunpackTo(_o: RapunzelT): void {\n  _o.hairLength = this.hairLength();\n}\n}\n\nexport class RapunzelT implements flatbuffers.IGeneratedObject {\nconstructor(\n  public hairLength: number = 0\n){}\n\n\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n  return Rapunzel.createRapunzel(builder,\n    this.hairLength\n  );\n}\n}\n"
  },
  {
    "path": "tests/ts/union_vector/union_vector.d.ts",
    "content": "export {Attacker, AttackerT} from './attacker.js';\nexport {BookReader, BookReaderT} from './book-reader.js';\nexport {Character} from './character.js';\nexport {FallingTub, FallingTubT} from './falling-tub.js';\nexport {Gadget} from './gadget.js';\nexport {HandFan, HandFanT} from './hand-fan.js';\nexport {Movie, MovieT} from './movie.js';\nexport {Rapunzel, RapunzelT} from './rapunzel.js';\n"
  },
  {
    "path": "tests/ts/union_vector/union_vector.js",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any,\n * @typescript-eslint/no-non-null-assertion */\nexport {Attacker, AttackerT} from './attacker.js';\nexport {BookReader, BookReaderT} from './book-reader.js';\nexport {Character} from './character.js';\nexport {FallingTub, FallingTubT} from './falling-tub.js';\nexport {Gadget} from './gadget.js';\nexport {HandFan, HandFanT} from './hand-fan.js';\nexport {Movie, MovieT} from './movie.js';\nexport {Rapunzel, RapunzelT} from './rapunzel.js';\n"
  },
  {
    "path": "tests/ts/union_vector/union_vector.ts",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport { Attacker, AttackerT } from './attacker.js';\nexport { BookReader, BookReaderT } from './book-reader.js';\nexport { Character } from './character.js';\nexport { FallingTub, FallingTubT } from './falling-tub.js';\nexport { Gadget } from './gadget.js';\nexport { HandFan, HandFanT } from './hand-fan.js';\nexport { Movie, MovieT } from './movie.js';\nexport { Rapunzel, RapunzelT } from './rapunzel.js';\n"
  },
  {
    "path": "tests/ts/union_vector/union_vector_generated.cjs",
    "content": "\"use strict\";\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n  for (var name in all)\n    __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n  if (from && typeof from === \"object\" || typeof from === \"function\") {\n    for (let key of __getOwnPropNames(from))\n      if (!__hasOwnProp.call(to, key) && key !== except)\n        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n  }\n  return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n  // If the importer is in node compatibility mode or this is not an ESM\n  // file that has been converted to a CommonJS file using a Babel-\n  // compatible transform (i.e. \"__esModule\" has not been set), then set\n  // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n  isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n  mod\n));\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// union_vector/union_vector.ts\nvar union_vector_exports = {};\n__export(union_vector_exports, {\n  Attacker: () => Attacker,\n  AttackerT: () => AttackerT,\n  BookReader: () => BookReader,\n  BookReaderT: () => BookReaderT,\n  Character: () => Character,\n  FallingTub: () => FallingTub,\n  FallingTubT: () => FallingTubT,\n  Gadget: () => Gadget,\n  HandFan: () => HandFan,\n  HandFanT: () => HandFanT,\n  Movie: () => Movie,\n  MovieT: () => MovieT,\n  Rapunzel: () => Rapunzel,\n  RapunzelT: () => RapunzelT\n});\nmodule.exports = __toCommonJS(union_vector_exports);\n\n// union_vector/attacker.js\nvar flatbuffers = __toESM(require(\"flatbuffers\"), 1);\nvar Attacker = class _Attacker {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsAttacker(bb, obj) {\n    return (obj || new _Attacker()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsAttacker(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n    return (obj || new _Attacker()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  swordAttackDamage() {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n  }\n  mutate_sword_attack_damage(value) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return \"Attacker\";\n  }\n  static startAttacker(builder) {\n    builder.startObject(1);\n  }\n  static addSwordAttackDamage(builder, swordAttackDamage) {\n    builder.addFieldInt32(0, swordAttackDamage, 0);\n  }\n  static endAttacker(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static createAttacker(builder, swordAttackDamage) {\n    _Attacker.startAttacker(builder);\n    _Attacker.addSwordAttackDamage(builder, swordAttackDamage);\n    return _Attacker.endAttacker(builder);\n  }\n  unpack() {\n    return new AttackerT(this.swordAttackDamage());\n  }\n  unpackTo(_o) {\n    _o.swordAttackDamage = this.swordAttackDamage();\n  }\n};\nvar AttackerT = class {\n  constructor(swordAttackDamage = 0) {\n    this.swordAttackDamage = swordAttackDamage;\n  }\n  pack(builder) {\n    return Attacker.createAttacker(builder, this.swordAttackDamage);\n  }\n};\n\n// union_vector/book-reader.js\nvar BookReader = class {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  booksRead() {\n    return this.bb.readInt32(this.bb_pos);\n  }\n  mutate_books_read(value) {\n    this.bb.writeInt32(this.bb_pos + 0, value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return \"BookReader\";\n  }\n  static sizeOf() {\n    return 4;\n  }\n  static createBookReader(builder, books_read) {\n    builder.prep(4, 4);\n    builder.writeInt32(books_read);\n    return builder.offset();\n  }\n  unpack() {\n    return new BookReaderT(this.booksRead());\n  }\n  unpackTo(_o) {\n    _o.booksRead = this.booksRead();\n  }\n};\nvar BookReaderT = class {\n  constructor(booksRead = 0) {\n    this.booksRead = booksRead;\n  }\n  pack(builder) {\n    return BookReader.createBookReader(builder, this.booksRead);\n  }\n};\n\n// union_vector/rapunzel.js\nvar Rapunzel = class {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  hairLength() {\n    return this.bb.readInt32(this.bb_pos);\n  }\n  mutate_hair_length(value) {\n    this.bb.writeInt32(this.bb_pos + 0, value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return \"Rapunzel\";\n  }\n  static sizeOf() {\n    return 4;\n  }\n  static createRapunzel(builder, hair_length) {\n    builder.prep(4, 4);\n    builder.writeInt32(hair_length);\n    return builder.offset();\n  }\n  unpack() {\n    return new RapunzelT(this.hairLength());\n  }\n  unpackTo(_o) {\n    _o.hairLength = this.hairLength();\n  }\n};\nvar RapunzelT = class {\n  constructor(hairLength = 0) {\n    this.hairLength = hairLength;\n  }\n  pack(builder) {\n    return Rapunzel.createRapunzel(builder, this.hairLength);\n  }\n};\n\n// union_vector/character.js\nvar Character;\n(function(Character2) {\n  Character2[Character2[\"NONE\"] = 0] = \"NONE\";\n  Character2[Character2[\"MuLan\"] = 1] = \"MuLan\";\n  Character2[Character2[\"Rapunzel\"] = 2] = \"Rapunzel\";\n  Character2[Character2[\"Belle\"] = 3] = \"Belle\";\n  Character2[Character2[\"BookFan\"] = 4] = \"BookFan\";\n  Character2[Character2[\"Other\"] = 5] = \"Other\";\n  Character2[Character2[\"Unused\"] = 6] = \"Unused\";\n})(Character || (Character = {}));\nfunction unionToCharacter(type, accessor) {\n  switch (Character[type]) {\n    case \"NONE\":\n      return null;\n    case \"MuLan\":\n      return accessor(new Attacker());\n    case \"Rapunzel\":\n      return accessor(new Rapunzel());\n    case \"Belle\":\n      return accessor(new BookReader());\n    case \"BookFan\":\n      return accessor(new BookReader());\n    case \"Other\":\n      return accessor(\"\");\n    case \"Unused\":\n      return accessor(\"\");\n    default:\n      return null;\n  }\n}\nfunction unionListToCharacter(type, accessor, index) {\n  switch (Character[type]) {\n    case \"NONE\":\n      return null;\n    case \"MuLan\":\n      return accessor(index, new Attacker());\n    case \"Rapunzel\":\n      return accessor(index, new Rapunzel());\n    case \"Belle\":\n      return accessor(index, new BookReader());\n    case \"BookFan\":\n      return accessor(index, new BookReader());\n    case \"Other\":\n      return accessor(index, \"\");\n    case \"Unused\":\n      return accessor(index, \"\");\n    default:\n      return null;\n  }\n}\n\n// union_vector/falling-tub.js\nvar FallingTub = class {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  weight() {\n    return this.bb.readInt32(this.bb_pos);\n  }\n  mutate_weight(value) {\n    this.bb.writeInt32(this.bb_pos + 0, value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return \"FallingTub\";\n  }\n  static sizeOf() {\n    return 4;\n  }\n  static createFallingTub(builder, weight) {\n    builder.prep(4, 4);\n    builder.writeInt32(weight);\n    return builder.offset();\n  }\n  unpack() {\n    return new FallingTubT(this.weight());\n  }\n  unpackTo(_o) {\n    _o.weight = this.weight();\n  }\n};\nvar FallingTubT = class {\n  constructor(weight = 0) {\n    this.weight = weight;\n  }\n  pack(builder) {\n    return FallingTub.createFallingTub(builder, this.weight);\n  }\n};\n\n// union_vector/hand-fan.js\nvar flatbuffers2 = __toESM(require(\"flatbuffers\"), 1);\nvar HandFan = class _HandFan {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsHandFan(bb, obj) {\n    return (obj || new _HandFan()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsHandFan(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers2.SIZE_PREFIX_LENGTH);\n    return (obj || new _HandFan()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  length() {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n  }\n  mutate_length(value) {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    if (offset === 0) {\n      return false;\n    }\n    this.bb.writeInt32(this.bb_pos + offset, value);\n    return true;\n  }\n  static getFullyQualifiedName() {\n    return \"HandFan\";\n  }\n  static startHandFan(builder) {\n    builder.startObject(1);\n  }\n  static addLength(builder, length) {\n    builder.addFieldInt32(0, length, 0);\n  }\n  static endHandFan(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static createHandFan(builder, length) {\n    _HandFan.startHandFan(builder);\n    _HandFan.addLength(builder, length);\n    return _HandFan.endHandFan(builder);\n  }\n  unpack() {\n    return new HandFanT(this.length());\n  }\n  unpackTo(_o) {\n    _o.length = this.length();\n  }\n};\nvar HandFanT = class {\n  constructor(length = 0) {\n    this.length = length;\n  }\n  pack(builder) {\n    return HandFan.createHandFan(builder, this.length);\n  }\n};\n\n// union_vector/gadget.js\nvar Gadget;\n(function(Gadget2) {\n  Gadget2[Gadget2[\"NONE\"] = 0] = \"NONE\";\n  Gadget2[Gadget2[\"FallingTub\"] = 1] = \"FallingTub\";\n  Gadget2[Gadget2[\"HandFan\"] = 2] = \"HandFan\";\n})(Gadget || (Gadget = {}));\n\n// union_vector/movie.js\nvar flatbuffers3 = __toESM(require(\"flatbuffers\"), 1);\nvar Movie = class _Movie {\n  constructor() {\n    this.bb = null;\n    this.bb_pos = 0;\n  }\n  __init(i, bb) {\n    this.bb_pos = i;\n    this.bb = bb;\n    return this;\n  }\n  static getRootAsMovie(bb, obj) {\n    return (obj || new _Movie()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static getSizePrefixedRootAsMovie(bb, obj) {\n    bb.setPosition(bb.position() + flatbuffers3.SIZE_PREFIX_LENGTH);\n    return (obj || new _Movie()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n  }\n  static bufferHasIdentifier(bb) {\n    return bb.__has_identifier(\"MOVI\");\n  }\n  mainCharacterType() {\n    const offset = this.bb.__offset(this.bb_pos, 4);\n    return offset ? this.bb.readUint8(this.bb_pos + offset) : Character.NONE;\n  }\n  mainCharacter(obj) {\n    const offset = this.bb.__offset(this.bb_pos, 6);\n    return offset ? this.bb.__union_with_string(obj, this.bb_pos + offset) : null;\n  }\n  charactersType(index) {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? this.bb.readUint8(this.bb.__vector(this.bb_pos + offset) + index) : 0;\n  }\n  charactersTypeLength() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  charactersTypeArray() {\n    const offset = this.bb.__offset(this.bb_pos, 8);\n    return offset ? new Uint8Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null;\n  }\n  characters(index, obj) {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.__union_with_string(obj, this.bb.__vector(this.bb_pos + offset) + index * 4) : null;\n  }\n  charactersLength() {\n    const offset = this.bb.__offset(this.bb_pos, 10);\n    return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n  }\n  static getFullyQualifiedName() {\n    return \"Movie\";\n  }\n  static startMovie(builder) {\n    builder.startObject(4);\n  }\n  static addMainCharacterType(builder, mainCharacterType) {\n    builder.addFieldInt8(0, mainCharacterType, Character.NONE);\n  }\n  static addMainCharacter(builder, mainCharacterOffset) {\n    builder.addFieldOffset(1, mainCharacterOffset, 0);\n  }\n  static addCharactersType(builder, charactersTypeOffset) {\n    builder.addFieldOffset(2, charactersTypeOffset, 0);\n  }\n  static createCharactersTypeVector(builder, data) {\n    builder.startVector(1, data.length, 1);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addInt8(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startCharactersTypeVector(builder, numElems) {\n    builder.startVector(1, numElems, 1);\n  }\n  static addCharacters(builder, charactersOffset) {\n    builder.addFieldOffset(3, charactersOffset, 0);\n  }\n  static createCharactersVector(builder, data) {\n    builder.startVector(4, data.length, 4);\n    for (let i = data.length - 1; i >= 0; i--) {\n      builder.addOffset(data[i]);\n    }\n    return builder.endVector();\n  }\n  static startCharactersVector(builder, numElems) {\n    builder.startVector(4, numElems, 4);\n  }\n  static endMovie(builder) {\n    const offset = builder.endObject();\n    return offset;\n  }\n  static finishMovieBuffer(builder, offset) {\n    builder.finish(offset, \"MOVI\");\n  }\n  static finishSizePrefixedMovieBuffer(builder, offset) {\n    builder.finish(offset, \"MOVI\", true);\n  }\n  static createMovie(builder, mainCharacterType, mainCharacterOffset, charactersTypeOffset, charactersOffset) {\n    _Movie.startMovie(builder);\n    _Movie.addMainCharacterType(builder, mainCharacterType);\n    _Movie.addMainCharacter(builder, mainCharacterOffset);\n    _Movie.addCharactersType(builder, charactersTypeOffset);\n    _Movie.addCharacters(builder, charactersOffset);\n    return _Movie.endMovie(builder);\n  }\n  unpack() {\n    return new MovieT(this.mainCharacterType(), (() => {\n      const temp = unionToCharacter(this.mainCharacterType(), this.mainCharacter.bind(this));\n      if (temp === null) {\n        return null;\n      }\n      if (typeof temp === \"string\") {\n        return temp;\n      }\n      return temp.unpack();\n    })(), this.bb.createScalarList(this.charactersType.bind(this), this.charactersTypeLength()), (() => {\n      const ret = [];\n      for (let targetEnumIndex = 0; targetEnumIndex < this.charactersTypeLength(); ++targetEnumIndex) {\n        const targetEnum = this.charactersType(targetEnumIndex);\n        if (targetEnum === null || Character[targetEnum] === \"NONE\") {\n          continue;\n        }\n        const temp = unionListToCharacter(targetEnum, this.characters.bind(this), targetEnumIndex);\n        if (temp === null) {\n          continue;\n        }\n        if (typeof temp === \"string\") {\n          ret.push(temp);\n          continue;\n        }\n        ret.push(temp.unpack());\n      }\n      return ret;\n    })());\n  }\n  unpackTo(_o) {\n    _o.mainCharacterType = this.mainCharacterType();\n    _o.mainCharacter = (() => {\n      const temp = unionToCharacter(this.mainCharacterType(), this.mainCharacter.bind(this));\n      if (temp === null) {\n        return null;\n      }\n      if (typeof temp === \"string\") {\n        return temp;\n      }\n      return temp.unpack();\n    })();\n    _o.charactersType = this.bb.createScalarList(this.charactersType.bind(this), this.charactersTypeLength());\n    _o.characters = (() => {\n      const ret = [];\n      for (let targetEnumIndex = 0; targetEnumIndex < this.charactersTypeLength(); ++targetEnumIndex) {\n        const targetEnum = this.charactersType(targetEnumIndex);\n        if (targetEnum === null || Character[targetEnum] === \"NONE\") {\n          continue;\n        }\n        const temp = unionListToCharacter(targetEnum, this.characters.bind(this), targetEnumIndex);\n        if (temp === null) {\n          continue;\n        }\n        if (typeof temp === \"string\") {\n          ret.push(temp);\n          continue;\n        }\n        ret.push(temp.unpack());\n      }\n      return ret;\n    })();\n  }\n};\nvar MovieT = class {\n  constructor(mainCharacterType = Character.NONE, mainCharacter = null, charactersType = [], characters = []) {\n    this.mainCharacterType = mainCharacterType;\n    this.mainCharacter = mainCharacter;\n    this.charactersType = charactersType;\n    this.characters = characters;\n  }\n  pack(builder) {\n    const mainCharacter = builder.createObjectOffset(this.mainCharacter);\n    const charactersType = Movie.createCharactersTypeVector(builder, this.charactersType);\n    const characters = Movie.createCharactersVector(builder, builder.createObjectOffsetList(this.characters));\n    return Movie.createMovie(builder, this.mainCharacterType, mainCharacter, charactersType, characters);\n  }\n};\n"
  },
  {
    "path": "tests/type_field_collsion/Collision.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace type_field_collsion\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct Collision : IFlatbufferObject\n{\n  private Table __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_25_12_19(); }\n  public static Collision GetRootAsCollision(ByteBuffer _bb) { return GetRootAsCollision(_bb, new Collision()); }\n  public static Collision GetRootAsCollision(ByteBuffer _bb, Collision obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }\n  public static bool VerifyCollision(ByteBuffer _bb) {Google.FlatBuffers.Verifier verifier = new Google.FlatBuffers.Verifier(_bb); return verifier.VerifyBuffer(\"\", false, CollisionVerify.Verify); }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }\n  public Collision __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public int Collision_ { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } }\n\n  public static Offset<type_field_collsion.Collision> CreateCollision(FlatBufferBuilder builder,\n      int collision = 0) {\n    builder.StartTable(1);\n    Collision.AddCollision(builder, collision);\n    return Collision.EndCollision(builder);\n  }\n\n  public static void StartCollision(FlatBufferBuilder builder) { builder.StartTable(1); }\n  public static void AddCollision(FlatBufferBuilder builder, int collision) { builder.AddInt(0, collision, 0); }\n  public static Offset<type_field_collsion.Collision> EndCollision(FlatBufferBuilder builder) {\n    int o = builder.EndTable();\n    return new Offset<type_field_collsion.Collision>(o);\n  }\n  public static void FinishCollisionBuffer(FlatBufferBuilder builder, Offset<type_field_collsion.Collision> offset) { builder.Finish(offset.Value); }\n  public static void FinishSizePrefixedCollisionBuffer(FlatBufferBuilder builder, Offset<type_field_collsion.Collision> offset) { builder.FinishSizePrefixed(offset.Value); }\n  public CollisionT UnPack() {\n    var _o = new CollisionT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(CollisionT _o) {\n    _o.Collision_ = this.Collision_;\n  }\n  public static Offset<type_field_collsion.Collision> Pack(FlatBufferBuilder builder, CollisionT _o) {\n    if (_o == null) return default(Offset<type_field_collsion.Collision>);\n    return CreateCollision(\n      builder,\n      _o.Collision_);\n  }\n}\n\npublic class CollisionT\n{\n  public int Collision_ { get; set; }\n\n  public CollisionT() {\n    this.Collision_ = 0;\n  }\n  public static CollisionT DeserializeFromBinary(byte[] fbBuffer) {\n    return Collision.GetRootAsCollision(new ByteBuffer(fbBuffer)).UnPack();\n  }\n  public byte[] SerializeToBinary() {\n    var fbb = new FlatBufferBuilder(0x10000);\n    Collision.FinishCollisionBuffer(fbb, Collision.Pack(fbb, this));\n    return fbb.DataBuffer.ToSizedArray();\n  }\n}\n\n\nstatic public class CollisionVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos)\n  {\n    return verifier.VerifyTableStart(tablePos)\n      && verifier.VerifyField(tablePos, 4 /*Collision*/, 4 /*int*/, 4, false)\n      && verifier.VerifyTableEnd(tablePos);\n  }\n}\n\n}\n"
  },
  {
    "path": "tests/type_field_collsion.fbs",
    "content": "namespace type_field_collsion;\n\n// This table tests collsions of identifiers.\ntable Collision {\n  collision : int;\n}\n\nroot_type Collision;\n"
  },
  {
    "path": "tests/unicode_test.json",
    "content": "{\n  \"name\": \"unicode_test\",\n  \"testarrayofstring\": [\n    \"Цлїςσδε\",\n    \"ﾌﾑｱﾑｶﾓｹﾓ\",\n    \"フムヤムカモケモ\",\n    \"㊀㊁㊂㊃㊄\",\n    \"☳☶☲\",\n    \"𡇙𝌆\"\n  ],\n  \"testarrayoftables\": [\n    {\n      \"name\": \"Цлїςσδε\"\n    },\n    {\n      \"name\": \"☳☶☲\"\n    },\n    {\n      \"name\": \"フムヤムカモケモ\"\n    },\n    {\n      \"name\": \"㊀㊁㊂㊃㊄\"\n    },\n    {\n      \"name\": \"ﾌﾑｱﾑｶﾓｹﾓ\"\n    },\n    {\n      \"name\": \"𡇙𝌆\"\n    }\n  ]\n}\n"
  },
  {
    "path": "tests/union_name_test/Bar.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: union_name_test\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\nclass Bar(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = Bar()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsBar(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    # Bar\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # Bar\n    def Name(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.String(o + self._tab.Pos)\n        return None\n\ndef BarStart(builder):\n    builder.StartObject(1)\n\ndef Start(builder):\n    BarStart(builder)\n\ndef BarAddName(builder, name):\n    builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(name), 0)\n\ndef AddName(builder, name):\n    BarAddName(builder, name)\n\ndef BarEnd(builder):\n    return builder.EndObject()\n\ndef End(builder):\n    return BarEnd(builder)\n\n\nclass BarT(object):\n\n    # BarT\n    def __init__(\n        self,\n        name = None,\n    ):\n        self.name = name  # type: Optional[str]\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        bar = Bar()\n        bar.Init(buf, pos)\n        return cls.InitFromObj(bar)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, bar):\n        x = BarT()\n        x._UnPack(bar)\n        return x\n\n    # BarT\n    def _UnPack(self, bar):\n        if bar is None:\n            return\n        self.name = bar.Name()\n\n    # BarT\n    def Pack(self, builder):\n        if self.name is not None:\n            name = builder.CreateString(self.name)\n        BarStart(builder)\n        if self.name is not None:\n            BarAddName(builder, name)\n        bar = BarEnd(builder)\n        return bar\n"
  },
  {
    "path": "tests/union_name_test/Container.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: union_name_test\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\nclass Container(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = Container()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsContainer(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    # Container\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # Container\n    def UType(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos)\n        return 0\n\n    # Container\n    def U(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))\n        if o != 0:\n            from flatbuffers.table import Table\n            obj = Table(bytearray(), 0)\n            self._tab.Union(obj, o)\n            return obj\n        return None\n\ndef ContainerStart(builder):\n    builder.StartObject(2)\n\ndef Start(builder):\n    ContainerStart(builder)\n\ndef ContainerAddUType(builder, uType):\n    builder.PrependUint8Slot(0, uType, 0)\n\ndef AddUType(builder, uType):\n    ContainerAddUType(builder, uType)\n\ndef ContainerAddU(builder, u):\n    builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(u), 0)\n\ndef AddU(builder, u):\n    ContainerAddU(builder, u)\n\ndef ContainerEnd(builder):\n    return builder.EndObject()\n\ndef End(builder):\n    return ContainerEnd(builder)\n\nimport union_name_test.Bar\nimport union_name_test.Foo\nimport union_name_test.my_test_union\ntry:\n    from typing import Union\nexcept:\n    pass\n\nclass ContainerT(object):\n\n    # ContainerT\n    def __init__(\n        self,\n        uType = 0,\n        u = None,\n    ):\n        self.uType = uType  # type: int\n        self.u = u  # type: Union[None, 'union_name_test.Foo.FooT', 'union_name_test.Bar.BarT']\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        container = Container()\n        container.Init(buf, pos)\n        return cls.InitFromObj(container)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, container):\n        x = ContainerT()\n        x._UnPack(container)\n        return x\n\n    # ContainerT\n    def _UnPack(self, container):\n        if container is None:\n            return\n        self.uType = container.UType()\n        self.u = union_name_test.my_test_union.MyTestUnionCreator(self.uType, container.U())\n\n    # ContainerT\n    def Pack(self, builder):\n        if self.u is not None:\n            u = self.u.Pack(builder)\n        ContainerStart(builder)\n        ContainerAddUType(builder, self.uType)\n        if self.u is not None:\n            ContainerAddU(builder, u)\n        container = ContainerEnd(builder)\n        return container\n"
  },
  {
    "path": "tests/union_name_test/Foo.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: union_name_test\n\nimport flatbuffers\nfrom flatbuffers.compat import import_numpy\nnp = import_numpy()\n\nclass Foo(object):\n    __slots__ = ['_tab']\n\n    @classmethod\n    def GetRootAs(cls, buf, offset=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)\n        x = Foo()\n        x.Init(buf, n + offset)\n        return x\n\n    @classmethod\n    def GetRootAsFoo(cls, buf, offset=0):\n        \"\"\"This method is deprecated. Please switch to GetRootAs.\"\"\"\n        return cls.GetRootAs(buf, offset)\n    # Foo\n    def Init(self, buf, pos):\n        self._tab = flatbuffers.table.Table(buf, pos)\n\n    # Foo\n    def Val(self):\n        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))\n        if o != 0:\n            return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos)\n        return 0\n\ndef FooStart(builder):\n    builder.StartObject(1)\n\ndef Start(builder):\n    FooStart(builder)\n\ndef FooAddVal(builder, val):\n    builder.PrependInt32Slot(0, val, 0)\n\ndef AddVal(builder, val):\n    FooAddVal(builder, val)\n\ndef FooEnd(builder):\n    return builder.EndObject()\n\ndef End(builder):\n    return FooEnd(builder)\n\n\nclass FooT(object):\n\n    # FooT\n    def __init__(\n        self,\n        val = 0,\n    ):\n        self.val = val  # type: int\n\n    @classmethod\n    def InitFromBuf(cls, buf, pos):\n        foo = Foo()\n        foo.Init(buf, pos)\n        return cls.InitFromObj(foo)\n\n    @classmethod\n    def InitFromPackedBuf(cls, buf, pos=0):\n        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)\n        return cls.InitFromBuf(buf, pos+n)\n\n    @classmethod\n    def InitFromObj(cls, foo):\n        x = FooT()\n        x._UnPack(foo)\n        return x\n\n    # FooT\n    def _UnPack(self, foo):\n        if foo is None:\n            return\n        self.val = foo.Val()\n\n    # FooT\n    def Pack(self, builder):\n        FooStart(builder)\n        FooAddVal(builder, self.val)\n        foo = FooEnd(builder)\n        return foo\n"
  },
  {
    "path": "tests/union_name_test/__init__.py",
    "content": ""
  },
  {
    "path": "tests/union_name_test/my_test_union.py",
    "content": "# automatically generated by the FlatBuffers compiler, do not modify\n\n# namespace: union_name_test\n\nclass my_test_union(object):\n    NONE = 0\n    Foo = 1\n    Bar = 2\n\ndef MyTestUnionCreator(unionType, table):\n    from flatbuffers.table import Table\n    if not isinstance(table, Table):\n        return None\n    if unionType == my_test_union.Foo:\n        import union_name_test.Foo\n        return union_name_test.Foo.FooT.InitFromBuf(table.Bytes, table.Pos)\n    if unionType == my_test_union.Bar:\n        import union_name_test.Bar\n        return union_name_test.Bar.BarT.InitFromBuf(table.Bytes, table.Pos)\n    return None\n"
  },
  {
    "path": "tests/union_name_test.fbs",
    "content": "// Test for union creator naming consistency (issue #8843).\n// Uses non-UpperCamel union name to verify that Function() naming\n// is used consistently for both definition and call site.\n\nnamespace union_name_test;\n\ntable Foo {\n  val: int;\n}\n\ntable Bar {\n  name: string;\n}\n\nunion my_test_union { Foo, Bar }\n\ntable Container {\n  u: my_test_union;\n}\n\nroot_type Container;\n"
  },
  {
    "path": "tests/union_underlying_type_test.fbs",
    "content": "\nnamespace UnionUnderlyingType;\n\ntable A {\n    a: int;\n}\ntable B {\n    b: string;\n}\ntable C {\n    c: bool;\n}\nunion ABC: int { A = 555, B = 666, C = 777}\ntable D {\n    test_union: ABC;\n    test_vector_of_union: [ABC];\n}\n"
  },
  {
    "path": "tests/union_value_collision.fbs",
    "content": "namespace union_value_collsion;\n\ntable IntValue {\n\tvalue:int;\n}\ntable Collide {\n\tcollide: string (key);\n\tvalue: string;\n}\n\nunion Value { IntValue }\n\nunion Other { IntValue }\n\n// This table tests collsions of Unions and fields named value.\ntable Collision {\n  some_value : Value;\n  value : Other;\n  collide : [Collision];\n}\n\nroot_type Collision;"
  },
  {
    "path": "tests/union_value_collsion/union_value_collision_generated.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nnamespace union_value_collsion\n{\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\n[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]\npublic enum Value : byte\n{\n  NONE = 0,\n  IntValue = 1,\n};\n\npublic class ValueUnion {\n  public Value Type { get; set; }\n  public object Value_ { get; set; }\n\n  public ValueUnion() {\n    this.Type = Value.NONE;\n    this.Value_ = null;\n  }\n\n  public T As<T>() where T : class { return this.Value_ as T; }\n  public union_value_collsion.IntValueT AsIntValue() { return this.As<union_value_collsion.IntValueT>(); }\n  public static ValueUnion FromIntValue(union_value_collsion.IntValueT _intvalue) { return new ValueUnion{ Type = Value.IntValue, Value_ = _intvalue }; }\n\n  public static int Pack(Google.FlatBuffers.FlatBufferBuilder builder, ValueUnion _o) {\n    switch (_o.Type) {\n      default: return 0;\n      case Value.IntValue: return union_value_collsion.IntValue.Pack(builder, _o.AsIntValue()).Value;\n    }\n  }\n}\n\npublic class ValueUnion_JsonConverter : Newtonsoft.Json.JsonConverter {\n  public override bool CanConvert(System.Type objectType) {\n    return objectType == typeof(ValueUnion) || objectType == typeof(System.Collections.Generic.List<ValueUnion>);\n  }\n  public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) {\n    var _olist = value as System.Collections.Generic.List<ValueUnion>;\n    if (_olist != null) {\n      writer.WriteStartArray();\n      foreach (var _o in _olist) { this.WriteJson(writer, _o, serializer); }\n      writer.WriteEndArray();\n    } else {\n      this.WriteJson(writer, value as ValueUnion, serializer);\n    }\n  }\n  public void WriteJson(Newtonsoft.Json.JsonWriter writer, ValueUnion _o, Newtonsoft.Json.JsonSerializer serializer) {\n    if (_o == null) return;\n    serializer.Serialize(writer, _o.Value_);\n  }\n  public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) {\n    var _olist = existingValue as System.Collections.Generic.List<ValueUnion>;\n    if (_olist != null) {\n      for (var _j = 0; _j < _olist.Count; ++_j) {\n        reader.Read();\n        _olist[_j] = this.ReadJson(reader, _olist[_j], serializer);\n      }\n      reader.Read();\n      return _olist;\n    } else {\n      return this.ReadJson(reader, existingValue as ValueUnion, serializer);\n    }\n  }\n  public ValueUnion ReadJson(Newtonsoft.Json.JsonReader reader, ValueUnion _o, Newtonsoft.Json.JsonSerializer serializer) {\n    if (_o == null) return null;\n    switch (_o.Type) {\n      default: break;\n      case Value.IntValue: _o.Value_ = serializer.Deserialize<union_value_collsion.IntValueT>(reader); break;\n    }\n    return _o;\n  }\n}\n\n\n\nstatic public class ValueVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)\n  {\n    bool result = true;\n    switch((Value)typeId)\n    {\n      case Value.IntValue:\n        result = union_value_collsion.IntValueVerify.Verify(verifier, tablePos);\n        break;\n      default: result = true;\n        break;\n    }\n    return result;\n  }\n}\n\n[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]\npublic enum Other : byte\n{\n  NONE = 0,\n  IntValue = 1,\n};\n\npublic class OtherUnion {\n  public Other Type { get; set; }\n  public object Value { get; set; }\n\n  public OtherUnion() {\n    this.Type = Other.NONE;\n    this.Value = null;\n  }\n\n  public T As<T>() where T : class { return this.Value as T; }\n  public union_value_collsion.IntValueT AsIntValue() { return this.As<union_value_collsion.IntValueT>(); }\n  public static OtherUnion FromIntValue(union_value_collsion.IntValueT _intvalue) { return new OtherUnion{ Type = Other.IntValue, Value = _intvalue }; }\n\n  public static int Pack(Google.FlatBuffers.FlatBufferBuilder builder, OtherUnion _o) {\n    switch (_o.Type) {\n      default: return 0;\n      case Other.IntValue: return union_value_collsion.IntValue.Pack(builder, _o.AsIntValue()).Value;\n    }\n  }\n}\n\npublic class OtherUnion_JsonConverter : Newtonsoft.Json.JsonConverter {\n  public override bool CanConvert(System.Type objectType) {\n    return objectType == typeof(OtherUnion) || objectType == typeof(System.Collections.Generic.List<OtherUnion>);\n  }\n  public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) {\n    var _olist = value as System.Collections.Generic.List<OtherUnion>;\n    if (_olist != null) {\n      writer.WriteStartArray();\n      foreach (var _o in _olist) { this.WriteJson(writer, _o, serializer); }\n      writer.WriteEndArray();\n    } else {\n      this.WriteJson(writer, value as OtherUnion, serializer);\n    }\n  }\n  public void WriteJson(Newtonsoft.Json.JsonWriter writer, OtherUnion _o, Newtonsoft.Json.JsonSerializer serializer) {\n    if (_o == null) return;\n    serializer.Serialize(writer, _o.Value);\n  }\n  public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) {\n    var _olist = existingValue as System.Collections.Generic.List<OtherUnion>;\n    if (_olist != null) {\n      for (var _j = 0; _j < _olist.Count; ++_j) {\n        reader.Read();\n        _olist[_j] = this.ReadJson(reader, _olist[_j], serializer);\n      }\n      reader.Read();\n      return _olist;\n    } else {\n      return this.ReadJson(reader, existingValue as OtherUnion, serializer);\n    }\n  }\n  public OtherUnion ReadJson(Newtonsoft.Json.JsonReader reader, OtherUnion _o, Newtonsoft.Json.JsonSerializer serializer) {\n    if (_o == null) return null;\n    switch (_o.Type) {\n      default: break;\n      case Other.IntValue: _o.Value = serializer.Deserialize<union_value_collsion.IntValueT>(reader); break;\n    }\n    return _o;\n  }\n}\n\n\n\nstatic public class OtherVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)\n  {\n    bool result = true;\n    switch((Other)typeId)\n    {\n      case Other.IntValue:\n        result = union_value_collsion.IntValueVerify.Verify(verifier, tablePos);\n        break;\n      default: result = true;\n        break;\n    }\n    return result;\n  }\n}\n\npublic struct IntValue : IFlatbufferObject\n{\n  private Table __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_25_12_19(); }\n  public static IntValue GetRootAsIntValue(ByteBuffer _bb) { return GetRootAsIntValue(_bb, new IntValue()); }\n  public static IntValue GetRootAsIntValue(ByteBuffer _bb, IntValue obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }\n  public IntValue __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public int Value { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } }\n\n  public static Offset<union_value_collsion.IntValue> CreateIntValue(FlatBufferBuilder builder,\n      int value = 0) {\n    builder.StartTable(1);\n    IntValue.AddValue(builder, value);\n    return IntValue.EndIntValue(builder);\n  }\n\n  public static void StartIntValue(FlatBufferBuilder builder) { builder.StartTable(1); }\n  public static void AddValue(FlatBufferBuilder builder, int value) { builder.AddInt(0, value, 0); }\n  public static Offset<union_value_collsion.IntValue> EndIntValue(FlatBufferBuilder builder) {\n    int o = builder.EndTable();\n    return new Offset<union_value_collsion.IntValue>(o);\n  }\n  public IntValueT UnPack() {\n    var _o = new IntValueT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(IntValueT _o) {\n    _o.Value = this.Value;\n  }\n  public static Offset<union_value_collsion.IntValue> Pack(FlatBufferBuilder builder, IntValueT _o) {\n    if (_o == null) return default(Offset<union_value_collsion.IntValue>);\n    return CreateIntValue(\n      builder,\n      _o.Value);\n  }\n}\n\npublic class IntValueT\n{\n  [Newtonsoft.Json.JsonProperty(\"value\")]\n  public int Value { get; set; }\n\n  public IntValueT() {\n    this.Value = 0;\n  }\n}\n\n\nstatic public class IntValueVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos)\n  {\n    return verifier.VerifyTableStart(tablePos)\n      && verifier.VerifyField(tablePos, 4 /*Value*/, 4 /*int*/, 4, false)\n      && verifier.VerifyTableEnd(tablePos);\n  }\n}\npublic struct Collide : IFlatbufferObject\n{\n  private Table __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_25_12_19(); }\n  public static Collide GetRootAsCollide(ByteBuffer _bb) { return GetRootAsCollide(_bb, new Collide()); }\n  public static Collide GetRootAsCollide(ByteBuffer _bb, Collide obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }\n  public Collide __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public string Collide_ { get { int o = __p.__offset(4); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } }\n#if ENABLE_SPAN_T\n  public Span<byte> GetCollideBytes() { return __p.__vector_as_span<byte>(4, 1); }\n#else\n  public ArraySegment<byte>? GetCollideBytes() { return __p.__vector_as_arraysegment(4); }\n#endif\n  public byte[] GetCollideArray() { return __p.__vector_as_array<byte>(4); }\n  public string Value { get { int o = __p.__offset(6); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } }\n#if ENABLE_SPAN_T\n  public Span<byte> GetValueBytes() { return __p.__vector_as_span<byte>(6, 1); }\n#else\n  public ArraySegment<byte>? GetValueBytes() { return __p.__vector_as_arraysegment(6); }\n#endif\n  public byte[] GetValueArray() { return __p.__vector_as_array<byte>(6); }\n\n  public static Offset<union_value_collsion.Collide> CreateCollide(FlatBufferBuilder builder,\n      StringOffset collideOffset = default(StringOffset),\n      StringOffset valueOffset = default(StringOffset)) {\n    builder.StartTable(2);\n    Collide.AddValue(builder, valueOffset);\n    Collide.AddCollide(builder, collideOffset);\n    return Collide.EndCollide(builder);\n  }\n\n  public static void StartCollide(FlatBufferBuilder builder) { builder.StartTable(2); }\n  public static void AddCollide(FlatBufferBuilder builder, StringOffset collideOffset) { builder.AddOffset(0, collideOffset.Value, 0); }\n  public static void AddValue(FlatBufferBuilder builder, StringOffset valueOffset) { builder.AddOffset(1, valueOffset.Value, 0); }\n  public static Offset<union_value_collsion.Collide> EndCollide(FlatBufferBuilder builder) {\n    int o = builder.EndTable();\n    builder.Required(o, 4);  // collide\n    return new Offset<union_value_collsion.Collide>(o);\n  }\n\n  public static VectorOffset CreateSortedVectorOfCollide(FlatBufferBuilder builder, Offset<Collide>[] offsets) {\n    Array.Sort(offsets,\n      (Offset<Collide> o1, Offset<Collide> o2) =>\n        string.CompareOrdinal(new Collide().__assign(builder.DataBuffer.Length - o1.Value, builder.DataBuffer).Collide_, new Collide().__assign(builder.DataBuffer.Length - o2.Value, builder.DataBuffer).Collide_));\n    return builder.CreateVectorOfTables(offsets);\n  }\n\n  public static Collide? __lookup_by_key(int vectorLocation, string key, ByteBuffer bb) {\n    Collide obj_ = new Collide();\n    int span = bb.GetInt(vectorLocation - 4);\n    int start = 0;\n    while (span != 0) {\n      int middle = span / 2;\n      int tableOffset = Table.__indirect(vectorLocation + 4 * (start + middle), bb);\n      obj_.__assign(tableOffset, bb);\n      int comp = string.CompareOrdinal(obj_.Collide_, key);\n      if (comp > 0) {\n        span = middle;\n      } else if (comp < 0) {\n        middle++;\n        start += middle;\n        span -= middle;\n      } else {\n        return obj_;\n      }\n    }\n    return null;\n  }\n  public CollideT UnPack() {\n    var _o = new CollideT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(CollideT _o) {\n    _o.Collide_ = this.Collide_;\n    _o.Value = this.Value;\n  }\n  public static Offset<union_value_collsion.Collide> Pack(FlatBufferBuilder builder, CollideT _o) {\n    if (_o == null) return default(Offset<union_value_collsion.Collide>);\n    var _collide = _o.Collide_ == null ? default(StringOffset) : builder.CreateString(_o.Collide_);\n    var _value = _o.Value == null ? default(StringOffset) : builder.CreateString(_o.Value);\n    return CreateCollide(\n      builder,\n      _collide,\n      _value);\n  }\n}\n\npublic class CollideT\n{\n  [Newtonsoft.Json.JsonProperty(\"collide\")]\n  public string Collide_ { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"value\")]\n  public string Value { get; set; }\n\n  public CollideT() {\n    this.Collide_ = null;\n    this.Value = null;\n  }\n}\n\n\nstatic public class CollideVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos)\n  {\n    return verifier.VerifyTableStart(tablePos)\n      && verifier.VerifyString(tablePos, 4 /*Collide*/, true)\n      && verifier.VerifyString(tablePos, 6 /*Value*/, false)\n      && verifier.VerifyTableEnd(tablePos);\n  }\n}\npublic struct Collision : IFlatbufferObject\n{\n  private Table __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_25_12_19(); }\n  public static Collision GetRootAsCollision(ByteBuffer _bb) { return GetRootAsCollision(_bb, new Collision()); }\n  public static Collision GetRootAsCollision(ByteBuffer _bb, Collision obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }\n  public static bool VerifyCollision(ByteBuffer _bb) {Google.FlatBuffers.Verifier verifier = new Google.FlatBuffers.Verifier(_bb); return verifier.VerifyBuffer(\"\", false, CollisionVerify.Verify); }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }\n  public Collision __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public union_value_collsion.Value SomeValueType { get { int o = __p.__offset(4); return o != 0 ? (union_value_collsion.Value)__p.bb.Get(o + __p.bb_pos) : union_value_collsion.Value.NONE; } }\n  public TTable? SomeValue<TTable>() where TTable : struct, IFlatbufferObject { int o = __p.__offset(6); return o != 0 ? (TTable?)__p.__union<TTable>(o + __p.bb_pos) : null; }\n  public union_value_collsion.IntValue SomeValueAsIntValue() { return SomeValue<union_value_collsion.IntValue>().Value; }\n  public union_value_collsion.Other ValueType { get { int o = __p.__offset(8); return o != 0 ? (union_value_collsion.Other)__p.bb.Get(o + __p.bb_pos) : union_value_collsion.Other.NONE; } }\n  public TTable? Value<TTable>() where TTable : struct, IFlatbufferObject { int o = __p.__offset(10); return o != 0 ? (TTable?)__p.__union<TTable>(o + __p.bb_pos) : null; }\n  public union_value_collsion.IntValue ValueAsIntValue() { return Value<union_value_collsion.IntValue>().Value; }\n  public union_value_collsion.Collision? Collide(int j) { int o = __p.__offset(12); return o != 0 ? (union_value_collsion.Collision?)(new union_value_collsion.Collision()).__assign(__p.__indirect(__p.__vector(o) + j * 4), __p.bb) : null; }\n  public int CollideLength { get { int o = __p.__offset(12); return o != 0 ? __p.__vector_len(o) : 0; } }\n\n  public static Offset<union_value_collsion.Collision> CreateCollision(FlatBufferBuilder builder,\n      union_value_collsion.Value some_value_type = union_value_collsion.Value.NONE,\n      int some_valueOffset = 0,\n      union_value_collsion.Other value_type = union_value_collsion.Other.NONE,\n      int valueOffset = 0,\n      VectorOffset collideOffset = default(VectorOffset)) {\n    builder.StartTable(5);\n    Collision.AddCollide(builder, collideOffset);\n    Collision.AddValue(builder, valueOffset);\n    Collision.AddSomeValue(builder, some_valueOffset);\n    Collision.AddValueType(builder, value_type);\n    Collision.AddSomeValueType(builder, some_value_type);\n    return Collision.EndCollision(builder);\n  }\n\n  public static void StartCollision(FlatBufferBuilder builder) { builder.StartTable(5); }\n  public static void AddSomeValueType(FlatBufferBuilder builder, union_value_collsion.Value someValueType) { builder.AddByte(0, (byte)someValueType, 0); }\n  public static void AddSomeValue(FlatBufferBuilder builder, int someValueOffset) { builder.AddOffset(1, someValueOffset, 0); }\n  public static void AddValueType(FlatBufferBuilder builder, union_value_collsion.Other valueType) { builder.AddByte(2, (byte)valueType, 0); }\n  public static void AddValue(FlatBufferBuilder builder, int valueOffset) { builder.AddOffset(3, valueOffset, 0); }\n  public static void AddCollide(FlatBufferBuilder builder, VectorOffset collideOffset) { builder.AddOffset(4, collideOffset.Value, 0); }\n  public static VectorOffset CreateCollideVector(FlatBufferBuilder builder, Offset<union_value_collsion.Collision>[] data) { builder.StartVector(4, data.Length, 4); for (int i = data.Length - 1; i >= 0; i--) builder.AddOffset(data[i].Value); return builder.EndVector(); }\n  public static VectorOffset CreateCollideVectorBlock(FlatBufferBuilder builder, Offset<union_value_collsion.Collision>[] data) { builder.StartVector(4, data.Length, 4); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateCollideVectorBlock(FlatBufferBuilder builder, ArraySegment<Offset<union_value_collsion.Collision>> data) { builder.StartVector(4, data.Count, 4); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateCollideVectorBlock(FlatBufferBuilder builder, IntPtr dataPtr, int sizeInBytes) { builder.StartVector(1, sizeInBytes, 1); builder.Add<Offset<union_value_collsion.Collision>>(dataPtr, sizeInBytes); return builder.EndVector(); }\n  public static void StartCollideVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 4); }\n  public static Offset<union_value_collsion.Collision> EndCollision(FlatBufferBuilder builder) {\n    int o = builder.EndTable();\n    return new Offset<union_value_collsion.Collision>(o);\n  }\n  public static void FinishCollisionBuffer(FlatBufferBuilder builder, Offset<union_value_collsion.Collision> offset) { builder.Finish(offset.Value); }\n  public static void FinishSizePrefixedCollisionBuffer(FlatBufferBuilder builder, Offset<union_value_collsion.Collision> offset) { builder.FinishSizePrefixed(offset.Value); }\n  public CollisionT UnPack() {\n    var _o = new CollisionT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(CollisionT _o) {\n    _o.SomeValue = new union_value_collsion.ValueUnion();\n    _o.SomeValue.Type = this.SomeValueType;\n    switch (this.SomeValueType) {\n      default: break;\n      case union_value_collsion.Value.IntValue:\n        _o.SomeValue.Value_ = this.SomeValue<union_value_collsion.IntValue>().HasValue ? this.SomeValue<union_value_collsion.IntValue>().Value.UnPack() : null;\n        break;\n    }\n    _o.Value = new union_value_collsion.OtherUnion();\n    _o.Value.Type = this.ValueType;\n    switch (this.ValueType) {\n      default: break;\n      case union_value_collsion.Other.IntValue:\n        _o.Value.Value = this.Value<union_value_collsion.IntValue>().HasValue ? this.Value<union_value_collsion.IntValue>().Value.UnPack() : null;\n        break;\n    }\n    _o.Collide = new List<union_value_collsion.CollisionT>();\n    for (var _j = 0; _j < this.CollideLength; ++_j) {_o.Collide.Add(this.Collide(_j).HasValue ? this.Collide(_j).Value.UnPack() : null);}\n  }\n  public static Offset<union_value_collsion.Collision> Pack(FlatBufferBuilder builder, CollisionT _o) {\n    if (_o == null) return default(Offset<union_value_collsion.Collision>);\n    var _some_value_type = _o.SomeValue == null ? union_value_collsion.Value.NONE : _o.SomeValue.Type;\n    var _some_value = _o.SomeValue == null ? 0 : union_value_collsion.ValueUnion.Pack(builder, _o.SomeValue);\n    var _value_type = _o.Value == null ? union_value_collsion.Other.NONE : _o.Value.Type;\n    var _value = _o.Value == null ? 0 : union_value_collsion.OtherUnion.Pack(builder, _o.Value);\n    var _collide = default(VectorOffset);\n    if (_o.Collide != null) {\n      var __collide = new Offset<union_value_collsion.Collision>[_o.Collide.Count];\n      for (var _j = 0; _j < __collide.Length; ++_j) { __collide[_j] = union_value_collsion.Collision.Pack(builder, _o.Collide[_j]); }\n      _collide = CreateCollideVector(builder, __collide);\n    }\n    return CreateCollision(\n      builder,\n      _some_value_type,\n      _some_value,\n      _value_type,\n      _value,\n      _collide);\n  }\n}\n\npublic class CollisionT\n{\n  [Newtonsoft.Json.JsonProperty(\"some_value_type\")]\n  private union_value_collsion.Value SomeValueType {\n    get {\n      return this.SomeValue != null ? this.SomeValue.Type : union_value_collsion.Value.NONE;\n    }\n    set {\n      this.SomeValue = new union_value_collsion.ValueUnion();\n      this.SomeValue.Type = value;\n    }\n  }\n  [Newtonsoft.Json.JsonProperty(\"some_value\")]\n  [Newtonsoft.Json.JsonConverter(typeof(union_value_collsion.ValueUnion_JsonConverter))]\n  public union_value_collsion.ValueUnion SomeValue { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"value_type\")]\n  private union_value_collsion.Other ValueType {\n    get {\n      return this.Value != null ? this.Value.Type : union_value_collsion.Other.NONE;\n    }\n    set {\n      this.Value = new union_value_collsion.OtherUnion();\n      this.Value.Type = value;\n    }\n  }\n  [Newtonsoft.Json.JsonProperty(\"value\")]\n  [Newtonsoft.Json.JsonConverter(typeof(union_value_collsion.OtherUnion_JsonConverter))]\n  public union_value_collsion.OtherUnion Value { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"collide\")]\n  public List<union_value_collsion.CollisionT> Collide { get; set; }\n\n  public CollisionT() {\n    this.SomeValue = null;\n    this.Value = null;\n    this.Collide = null;\n  }\n\n  public static CollisionT DeserializeFromJson(string jsonText) {\n    return Newtonsoft.Json.JsonConvert.DeserializeObject<CollisionT>(jsonText);\n  }\n  public string SerializeToJson() {\n    return Newtonsoft.Json.JsonConvert.SerializeObject(this, Newtonsoft.Json.Formatting.Indented);\n  }\n  public static CollisionT DeserializeFromBinary(byte[] fbBuffer) {\n    return Collision.GetRootAsCollision(new ByteBuffer(fbBuffer)).UnPack();\n  }\n  public byte[] SerializeToBinary() {\n    var fbb = new FlatBufferBuilder(0x10000);\n    Collision.FinishCollisionBuffer(fbb, Collision.Pack(fbb, this));\n    return fbb.DataBuffer.ToSizedArray();\n  }\n}\n\n\nstatic public class CollisionVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos)\n  {\n    return verifier.VerifyTableStart(tablePos)\n      && verifier.VerifyField(tablePos, 4 /*SomeValueType*/, 1 /*union_value_collsion.Value*/, 1, false)\n      && verifier.VerifyUnion(tablePos, 4, 6 /*SomeValue*/, union_value_collsion.ValueVerify.Verify, false)\n      && verifier.VerifyField(tablePos, 8 /*ValueType*/, 1 /*union_value_collsion.Other*/, 1, false)\n      && verifier.VerifyUnion(tablePos, 8, 10 /*Value*/, union_value_collsion.OtherVerify.Verify, false)\n      && verifier.VerifyVectorOfTables(tablePos, 12 /*Collide*/, union_value_collsion.CollisionVerify.Verify, false)\n      && verifier.VerifyTableEnd(tablePos);\n  }\n}\n\n}\n"
  },
  {
    "path": "tests/union_vector/Attacker.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct Attacker : IFlatbufferObject\n{\n  private Table __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_25_12_19(); }\n  public static Attacker GetRootAsAttacker(ByteBuffer _bb) { return GetRootAsAttacker(_bb, new Attacker()); }\n  public static Attacker GetRootAsAttacker(ByteBuffer _bb, Attacker obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }\n  public Attacker __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public int SwordAttackDamage { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } }\n  public bool MutateSwordAttackDamage(int sword_attack_damage) { int o = __p.__offset(4); if (o != 0) { __p.bb.PutInt(o + __p.bb_pos, sword_attack_damage); return true; } else { return false; } }\n\n  public static Offset<Attacker> CreateAttacker(FlatBufferBuilder builder,\n      int sword_attack_damage = 0) {\n    builder.StartTable(1);\n    Attacker.AddSwordAttackDamage(builder, sword_attack_damage);\n    return Attacker.EndAttacker(builder);\n  }\n\n  public static void StartAttacker(FlatBufferBuilder builder) { builder.StartTable(1); }\n  public static void AddSwordAttackDamage(FlatBufferBuilder builder, int swordAttackDamage) { builder.AddInt(0, swordAttackDamage, 0); }\n  public static Offset<Attacker> EndAttacker(FlatBufferBuilder builder) {\n    int o = builder.EndTable();\n    return new Offset<Attacker>(o);\n  }\n  public AttackerT UnPack() {\n    var _o = new AttackerT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(AttackerT _o) {\n    _o.SwordAttackDamage = this.SwordAttackDamage;\n  }\n  public static Offset<Attacker> Pack(FlatBufferBuilder builder, AttackerT _o) {\n    if (_o == null) return default(Offset<Attacker>);\n    return CreateAttacker(\n      builder,\n      _o.SwordAttackDamage);\n  }\n}\n\npublic class AttackerT\n{\n  [Newtonsoft.Json.JsonProperty(\"sword_attack_damage\")]\n  public int SwordAttackDamage { get; set; }\n\n  public AttackerT() {\n    this.SwordAttackDamage = 0;\n  }\n}\n\n\nstatic public class AttackerVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos)\n  {\n    return verifier.VerifyTableStart(tablePos)\n      && verifier.VerifyField(tablePos, 4 /*SwordAttackDamage*/, 4 /*int*/, 4, false)\n      && verifier.VerifyTableEnd(tablePos);\n  }\n}\n"
  },
  {
    "path": "tests/union_vector/Attacker.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class Attacker extends com.google.flatbuffers.Table {\n  public static void ValidateVersion() { Constants.FLATBUFFERS_25_12_19(); }\n  public static Attacker getRootAsAttacker(ByteBuffer _bb) { return getRootAsAttacker(_bb, new Attacker()); }\n  public static Attacker getRootAsAttacker(ByteBuffer _bb, Attacker obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public Attacker __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public int swordAttackDamage() { int o = __offset(4); return o != 0 ? bb.getInt(o + bb_pos) : 0; }\n  public boolean mutateSwordAttackDamage(int sword_attack_damage) { int o = __offset(4); if (o != 0) { bb.putInt(o + bb_pos, sword_attack_damage); return true; } else { return false; } }\n\n  public static int createAttacker(FlatBufferBuilder builder,\n      int swordAttackDamage) {\n    builder.startTable(1);\n    Attacker.addSwordAttackDamage(builder, swordAttackDamage);\n    return Attacker.endAttacker(builder);\n  }\n\n  public static void startAttacker(FlatBufferBuilder builder) { builder.startTable(1); }\n  public static void addSwordAttackDamage(FlatBufferBuilder builder, int swordAttackDamage) { builder.addInt(0, swordAttackDamage, 0); }\n  public static int endAttacker(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    return o;\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public Attacker get(int j) { return get(new Attacker(), j); }\n    public Attacker get(Attacker obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); }\n  }\n  public AttackerT unpack() {\n    AttackerT _o = new AttackerT();\n    unpackTo(_o);\n    return _o;\n  }\n  public void unpackTo(AttackerT _o) {\n    int _oSwordAttackDamage = swordAttackDamage();\n    _o.setSwordAttackDamage(_oSwordAttackDamage);\n  }\n  public static int pack(FlatBufferBuilder builder, AttackerT _o) {\n    if (_o == null) return 0;\n    return createAttacker(\n      builder,\n      _o.getSwordAttackDamage());\n  }\n}\n\n"
  },
  {
    "path": "tests/union_vector/Attacker.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\nimport com.google.flatbuffers.BaseVector\nimport com.google.flatbuffers.BooleanVector\nimport com.google.flatbuffers.ByteVector\nimport com.google.flatbuffers.Constants\nimport com.google.flatbuffers.DoubleVector\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.FloatVector\nimport com.google.flatbuffers.LongVector\nimport com.google.flatbuffers.StringVector\nimport com.google.flatbuffers.Struct\nimport com.google.flatbuffers.Table\nimport com.google.flatbuffers.UnionVector\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport kotlin.math.sign\n\n@Suppress(\"unused\")\nclass Attacker : Table() {\n\n    fun __init(_i: Int, _bb: ByteBuffer)  {\n        __reset(_i, _bb)\n    }\n    fun __assign(_i: Int, _bb: ByteBuffer) : Attacker {\n        __init(_i, _bb)\n        return this\n    }\n    val swordAttackDamage : Int\n        get() {\n            val o = __offset(4)\n            return if(o != 0) bb.getInt(o + bb_pos) else 0\n        }\n    fun mutateSwordAttackDamage(swordAttackDamage: Int) : Boolean {\n        val o = __offset(4)\n        return if (o != 0) {\n            bb.putInt(o + bb_pos, swordAttackDamage)\n            true\n        } else {\n            false\n        }\n    }\n    companion object {\n        fun validateVersion() = Constants.FLATBUFFERS_25_12_19()\n        fun getRootAsAttacker(_bb: ByteBuffer): Attacker = getRootAsAttacker(_bb, Attacker())\n        fun getRootAsAttacker(_bb: ByteBuffer, obj: Attacker): Attacker {\n            _bb.order(ByteOrder.LITTLE_ENDIAN)\n            return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb))\n        }\n        fun createAttacker(builder: FlatBufferBuilder, swordAttackDamage: Int) : Int {\n            builder.startTable(1)\n            addSwordAttackDamage(builder, swordAttackDamage)\n            return endAttacker(builder)\n        }\n        fun startAttacker(builder: FlatBufferBuilder) = builder.startTable(1)\n        fun addSwordAttackDamage(builder: FlatBufferBuilder, swordAttackDamage: Int) = builder.addInt(0, swordAttackDamage, 0)\n        fun endAttacker(builder: FlatBufferBuilder) : Int {\n            val o = builder.endTable()\n            return o\n        }\n    }\n}\n"
  },
  {
    "path": "tests/union_vector/Attacker.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nuse \\Google\\FlatBuffers\\Struct;\nuse \\Google\\FlatBuffers\\Table;\nuse \\Google\\FlatBuffers\\ByteBuffer;\nuse \\Google\\FlatBuffers\\FlatBufferBuilder;\n\nclass Attacker extends Table\n{\n    /**\n     * @param ByteBuffer $bb\n     * @return Attacker\n     */\n    public static function getRootAsAttacker(ByteBuffer $bb)\n    {\n        $obj = new Attacker();\n        return ($obj->init($bb->getInt($bb->getPosition()) + $bb->getPosition(), $bb));\n    }\n\n    public static function AttackerIdentifier()\n    {\n        return \"MOVI\";\n    }\n\n    public static function AttackerBufferHasIdentifier(ByteBuffer $buf)\n    {\n        return self::__has_identifier($buf, self::AttackerIdentifier());\n    }\n\n    /**\n     * @param int $_i offset\n     * @param ByteBuffer $_bb\n     * @return Attacker\n     **/\n    public function init($_i, ByteBuffer $_bb)\n    {\n        $this->bb_pos = $_i;\n        $this->bb = $_bb;\n        return $this;\n    }\n\n    /**\n     * @return int\n     */\n    public function getSwordAttackDamage()\n    {\n        $o = $this->__offset(4);\n        return $o != 0 ? $this->bb->getInt($o + $this->bb_pos) : 0;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return void\n     */\n    public static function startAttacker(FlatBufferBuilder $builder)\n    {\n        $builder->StartObject(1);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return Attacker\n     */\n    public static function createAttacker(FlatBufferBuilder $builder, $sword_attack_damage)\n    {\n        $builder->startObject(1);\n        self::addSwordAttackDamage($builder, $sword_attack_damage);\n        $o = $builder->endObject();\n        return $o;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int\n     * @return void\n     */\n    public static function addSwordAttackDamage(FlatBufferBuilder $builder, $swordAttackDamage)\n    {\n        $builder->addIntX(0, $swordAttackDamage, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return int table offset\n     */\n    public static function endAttacker(FlatBufferBuilder $builder)\n    {\n        $o = $builder->endObject();\n        return $o;\n    }\n}\n"
  },
  {
    "path": "tests/union_vector/AttackerT.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\npublic class AttackerT {\n  private int swordAttackDamage;\n\n  public int getSwordAttackDamage() { return swordAttackDamage; }\n\n  public void setSwordAttackDamage(int swordAttackDamage) { this.swordAttackDamage = swordAttackDamage; }\n\n\n  public AttackerT() {\n    this.swordAttackDamage = 0;\n  }\n}\n\n"
  },
  {
    "path": "tests/union_vector/BookReader.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct BookReader : IFlatbufferObject\n{\n  private Struct __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Struct(_i, _bb); }\n  public BookReader __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public int BooksRead { get { return __p.bb.GetInt(__p.bb_pos + 0); } }\n  public void MutateBooksRead(int books_read) { __p.bb.PutInt(__p.bb_pos + 0, books_read); }\n\n  public static Offset<BookReader> CreateBookReader(FlatBufferBuilder builder, int BooksRead) {\n    builder.Prep(4, 4);\n    builder.PutInt(BooksRead);\n    return new Offset<BookReader>(builder.Offset);\n  }\n  public BookReaderT UnPack() {\n    var _o = new BookReaderT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(BookReaderT _o) {\n    _o.BooksRead = this.BooksRead;\n  }\n  public static Offset<BookReader> Pack(FlatBufferBuilder builder, BookReaderT _o) {\n    if (_o == null) return default(Offset<BookReader>);\n    return CreateBookReader(\n      builder,\n      _o.BooksRead);\n  }\n}\n\npublic class BookReaderT\n{\n  [Newtonsoft.Json.JsonProperty(\"books_read\")]\n  public int BooksRead { get; set; }\n\n  public BookReaderT() {\n    this.BooksRead = 0;\n  }\n}\n\n"
  },
  {
    "path": "tests/union_vector/BookReader.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class BookReader extends Struct {\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public BookReader __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public int booksRead() { return bb.getInt(bb_pos + 0); }\n  public void mutateBooksRead(int books_read) { bb.putInt(bb_pos + 0, books_read); }\n\n  public static int createBookReader(FlatBufferBuilder builder, int booksRead) {\n    builder.prep(4, 4);\n    builder.putInt(booksRead);\n    return builder.offset();\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public BookReader get(int j) { return get(new BookReader(), j); }\n    public BookReader get(BookReader obj, int j) {  return obj.__assign(__element(j), bb); }\n  }\n  public BookReaderT unpack() {\n    BookReaderT _o = new BookReaderT();\n    unpackTo(_o);\n    return _o;\n  }\n  public void unpackTo(BookReaderT _o) {\n    int _oBooksRead = booksRead();\n    _o.setBooksRead(_oBooksRead);\n  }\n  public static int pack(FlatBufferBuilder builder, BookReaderT _o) {\n    if (_o == null) return 0;\n    return createBookReader(\n      builder,\n      _o.getBooksRead());\n  }\n}\n\n"
  },
  {
    "path": "tests/union_vector/BookReader.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\nimport com.google.flatbuffers.BaseVector\nimport com.google.flatbuffers.BooleanVector\nimport com.google.flatbuffers.ByteVector\nimport com.google.flatbuffers.Constants\nimport com.google.flatbuffers.DoubleVector\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.FloatVector\nimport com.google.flatbuffers.LongVector\nimport com.google.flatbuffers.StringVector\nimport com.google.flatbuffers.Struct\nimport com.google.flatbuffers.Table\nimport com.google.flatbuffers.UnionVector\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport kotlin.math.sign\n\n@Suppress(\"unused\")\nclass BookReader : Struct() {\n\n    fun __init(_i: Int, _bb: ByteBuffer)  {\n        __reset(_i, _bb)\n    }\n    fun __assign(_i: Int, _bb: ByteBuffer) : BookReader {\n        __init(_i, _bb)\n        return this\n    }\n    val booksRead : Int get() = bb.getInt(bb_pos + 0)\n    fun mutateBooksRead(booksRead: Int) : ByteBuffer = bb.putInt(bb_pos + 0, booksRead)\n    companion object {\n        fun createBookReader(builder: FlatBufferBuilder, booksRead: Int) : Int {\n            builder.prep(4, 4)\n            builder.putInt(booksRead)\n            return builder.offset()\n        }\n    }\n}\n"
  },
  {
    "path": "tests/union_vector/BookReader.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nuse \\Google\\FlatBuffers\\Struct;\nuse \\Google\\FlatBuffers\\Table;\nuse \\Google\\FlatBuffers\\ByteBuffer;\nuse \\Google\\FlatBuffers\\FlatBufferBuilder;\n\nclass BookReader extends Struct\n{\n    /**\n     * @param int $_i offset\n     * @param ByteBuffer $_bb\n     * @return BookReader\n     **/\n    public function init($_i, ByteBuffer $_bb)\n    {\n        $this->bb_pos = $_i;\n        $this->bb = $_bb;\n        return $this;\n    }\n\n    /**\n     * @return int\n     */\n    public function GetBooksRead()\n    {\n        return $this->bb->getInt($this->bb_pos + 0);\n    }\n\n\n    /**\n     * @return int offset\n     */\n    public static function createBookReader(FlatBufferBuilder $builder, $booksRead)\n    {\n        $builder->prep(4, 4);\n        $builder->putInt($booksRead);\n        return $builder->offset();\n    }\n}\n"
  },
  {
    "path": "tests/union_vector/BookReaderT.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\npublic class BookReaderT {\n  private int booksRead;\n\n  public int getBooksRead() { return booksRead; }\n\n  public void setBooksRead(int booksRead) { this.booksRead = booksRead; }\n\n\n  public BookReaderT() {\n    this.booksRead = 0;\n  }\n}\n\n"
  },
  {
    "path": "tests/union_vector/Character.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\n[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]\npublic enum Character : byte\n{\n  NONE = 0,\n  MuLan = 1,\n  Rapunzel = 2,\n  Belle = 3,\n  BookFan = 4,\n  Other = 5,\n  Unused = 6,\n};\n\npublic class CharacterUnion {\n  public Character Type { get; set; }\n  public object Value { get; set; }\n\n  public CharacterUnion() {\n    this.Type = Character.NONE;\n    this.Value = null;\n  }\n\n  public T As<T>() where T : class { return this.Value as T; }\n  public AttackerT AsMuLan() { return this.As<AttackerT>(); }\n  public static CharacterUnion FromMuLan(AttackerT _mulan) { return new CharacterUnion{ Type = Character.MuLan, Value = _mulan }; }\n  public RapunzelT AsRapunzel() { return this.As<RapunzelT>(); }\n  public static CharacterUnion FromRapunzel(RapunzelT _rapunzel) { return new CharacterUnion{ Type = Character.Rapunzel, Value = _rapunzel }; }\n  public BookReaderT AsBelle() { return this.As<BookReaderT>(); }\n  public static CharacterUnion FromBelle(BookReaderT _belle) { return new CharacterUnion{ Type = Character.Belle, Value = _belle }; }\n  public BookReaderT AsBookFan() { return this.As<BookReaderT>(); }\n  public static CharacterUnion FromBookFan(BookReaderT _bookfan) { return new CharacterUnion{ Type = Character.BookFan, Value = _bookfan }; }\n  public string AsOther() { return this.As<string>(); }\n  public static CharacterUnion FromOther(string _other) { return new CharacterUnion{ Type = Character.Other, Value = _other }; }\n  public string AsUnused() { return this.As<string>(); }\n  public static CharacterUnion FromUnused(string _unused) { return new CharacterUnion{ Type = Character.Unused, Value = _unused }; }\n\n  public static int Pack(Google.FlatBuffers.FlatBufferBuilder builder, CharacterUnion _o) {\n    switch (_o.Type) {\n      default: return 0;\n      case Character.MuLan: return Attacker.Pack(builder, _o.AsMuLan()).Value;\n      case Character.Rapunzel: return Rapunzel.Pack(builder, _o.AsRapunzel()).Value;\n      case Character.Belle: return BookReader.Pack(builder, _o.AsBelle()).Value;\n      case Character.BookFan: return BookReader.Pack(builder, _o.AsBookFan()).Value;\n      case Character.Other: return builder.CreateString(_o.AsOther()).Value;\n      case Character.Unused: return builder.CreateString(_o.AsUnused()).Value;\n    }\n  }\n}\n\npublic class CharacterUnion_JsonConverter : Newtonsoft.Json.JsonConverter {\n  public override bool CanConvert(System.Type objectType) {\n    return objectType == typeof(CharacterUnion) || objectType == typeof(System.Collections.Generic.List<CharacterUnion>);\n  }\n  public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) {\n    var _olist = value as System.Collections.Generic.List<CharacterUnion>;\n    if (_olist != null) {\n      writer.WriteStartArray();\n      foreach (var _o in _olist) { this.WriteJson(writer, _o, serializer); }\n      writer.WriteEndArray();\n    } else {\n      this.WriteJson(writer, value as CharacterUnion, serializer);\n    }\n  }\n  public void WriteJson(Newtonsoft.Json.JsonWriter writer, CharacterUnion _o, Newtonsoft.Json.JsonSerializer serializer) {\n    if (_o == null) return;\n    serializer.Serialize(writer, _o.Value);\n  }\n  public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) {\n    var _olist = existingValue as System.Collections.Generic.List<CharacterUnion>;\n    if (_olist != null) {\n      for (var _j = 0; _j < _olist.Count; ++_j) {\n        reader.Read();\n        _olist[_j] = this.ReadJson(reader, _olist[_j], serializer);\n      }\n      reader.Read();\n      return _olist;\n    } else {\n      return this.ReadJson(reader, existingValue as CharacterUnion, serializer);\n    }\n  }\n  public CharacterUnion ReadJson(Newtonsoft.Json.JsonReader reader, CharacterUnion _o, Newtonsoft.Json.JsonSerializer serializer) {\n    if (_o == null) return null;\n    switch (_o.Type) {\n      default: break;\n      case Character.MuLan: _o.Value = serializer.Deserialize<AttackerT>(reader); break;\n      case Character.Rapunzel: _o.Value = serializer.Deserialize<RapunzelT>(reader); break;\n      case Character.Belle: _o.Value = serializer.Deserialize<BookReaderT>(reader); break;\n      case Character.BookFan: _o.Value = serializer.Deserialize<BookReaderT>(reader); break;\n      case Character.Other: _o.Value = serializer.Deserialize<string>(reader); break;\n      case Character.Unused: _o.Value = serializer.Deserialize<string>(reader); break;\n    }\n    return _o;\n  }\n}\n\n\n\nstatic public class CharacterVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)\n  {\n    bool result = true;\n    switch((Character)typeId)\n    {\n      case Character.MuLan:\n        result = AttackerVerify.Verify(verifier, tablePos);\n        break;\n      case Character.Rapunzel:\n        result = verifier.VerifyUnionData(tablePos, 4, 4);\n        break;\n      case Character.Belle:\n        result = verifier.VerifyUnionData(tablePos, 4, 4);\n        break;\n      case Character.BookFan:\n        result = verifier.VerifyUnionData(tablePos, 4, 4);\n        break;\n      case Character.Other:\n       result = verifier.VerifyUnionString(tablePos);\n        break;\n      case Character.Unused:\n       result = verifier.VerifyUnionString(tablePos);\n        break;\n      default: result = true;\n        break;\n    }\n    return result;\n  }\n}\n\n"
  },
  {
    "path": "tests/union_vector/Character.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n@SuppressWarnings(\"unused\")\npublic final class Character {\n  private Character() { }\n  public static final byte NONE = 0;\n  public static final byte MuLan = 1;\n  public static final byte Rapunzel = 2;\n  public static final byte Belle = 3;\n  public static final byte BookFan = 4;\n  public static final byte Other = 5;\n  public static final byte Unused = 6;\n\n  public static final String[] names = { \"NONE\", \"MuLan\", \"Rapunzel\", \"Belle\", \"BookFan\", \"Other\", \"Unused\", };\n\n  public static String name(int e) { return names[e]; }\n}\n\n"
  },
  {
    "path": "tests/union_vector/Character.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n@Suppress(\"unused\")\nclass Character_ private constructor() {\n    companion object {\n        const val NONE: UByte = 0u\n        const val MuLan: UByte = 1u\n        const val Rapunzel: UByte = 2u\n        const val Belle: UByte = 3u\n        const val BookFan: UByte = 4u\n        const val Other: UByte = 5u\n        const val Unused: UByte = 6u\n        val names : Array<String> = arrayOf(\"NONE\", \"MuLan\", \"Rapunzel\", \"Belle\", \"BookFan\", \"Other\", \"Unused\")\n        fun name(e: Int) : String = names[e]\n    }\n}\n"
  },
  {
    "path": "tests/union_vector/Character.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nclass Character\n{\n    const NONE = 0;\n    const MuLan = 1;\n    const Rapunzel = 2;\n    const Belle = 3;\n    const BookFan = 4;\n    const Other = 5;\n    const Unused = 6;\n\n    private static $names = array(\n        Character::NONE=>\"NONE\",\n        Character::MuLan=>\"MuLan\",\n        Character::Rapunzel=>\"Rapunzel\",\n        Character::Belle=>\"Belle\",\n        Character::BookFan=>\"BookFan\",\n        Character::Other=>\"Other\",\n        Character::Unused=>\"Unused\",\n    );\n\n    public static function Name($e)\n    {\n        if (!isset(self::$names[$e])) {\n            throw new \\Exception();\n        }\n        return self::$names[$e];\n    }\n}\n"
  },
  {
    "path": "tests/union_vector/CharacterUnion.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\nimport com.google.flatbuffers.FlatBufferBuilder;\n\npublic class CharacterUnion {\n  private byte type;\n  private Object value;\n\n  public byte getType() { return type; }\n\n  public void setType(byte type) { this.type = type; }\n\n  public Object getValue() { return value; }\n\n  public void setValue(Object value) { this.value = value; }\n\n  public CharacterUnion() {\n    this.type = Character.NONE;\n    this.value = null;\n  }\n\n  public AttackerT asMuLan() { return (AttackerT) value; }\n  public RapunzelT asRapunzel() { return (RapunzelT) value; }\n  public BookReaderT asBelle() { return (BookReaderT) value; }\n  public BookReaderT asBookFan() { return (BookReaderT) value; }\n  public String asOther() { return (String) value; }\n  public String asUnused() { return (String) value; }\n\n  public static int pack(FlatBufferBuilder builder, CharacterUnion _o) {\n    switch (_o.type) {\n      case Character.MuLan: return Attacker.pack(builder, _o.asMuLan());\n      case Character.Rapunzel: return Rapunzel.pack(builder, _o.asRapunzel());\n      case Character.Belle: return BookReader.pack(builder, _o.asBelle());\n      case Character.BookFan: return BookReader.pack(builder, _o.asBookFan());\n      case Character.Other: return builder.createString(_o.asOther());\n      case Character.Unused: return builder.createString(_o.asUnused());\n      default: return 0;\n    }\n  }\n}\n\n"
  },
  {
    "path": "tests/union_vector/FallingTub.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct FallingTub : IFlatbufferObject\n{\n  private Struct __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Struct(_i, _bb); }\n  public FallingTub __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public int Weight { get { return __p.bb.GetInt(__p.bb_pos + 0); } }\n  public void MutateWeight(int weight) { __p.bb.PutInt(__p.bb_pos + 0, weight); }\n\n  public static Offset<FallingTub> CreateFallingTub(FlatBufferBuilder builder, int Weight) {\n    builder.Prep(4, 4);\n    builder.PutInt(Weight);\n    return new Offset<FallingTub>(builder.Offset);\n  }\n  public FallingTubT UnPack() {\n    var _o = new FallingTubT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(FallingTubT _o) {\n    _o.Weight = this.Weight;\n  }\n  public static Offset<FallingTub> Pack(FlatBufferBuilder builder, FallingTubT _o) {\n    if (_o == null) return default(Offset<FallingTub>);\n    return CreateFallingTub(\n      builder,\n      _o.Weight);\n  }\n}\n\npublic class FallingTubT\n{\n  [Newtonsoft.Json.JsonProperty(\"weight\")]\n  public int Weight { get; set; }\n\n  public FallingTubT() {\n    this.Weight = 0;\n  }\n}\n\n"
  },
  {
    "path": "tests/union_vector/FallingTub.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class FallingTub extends Struct {\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public FallingTub __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public int weight() { return bb.getInt(bb_pos + 0); }\n  public void mutateWeight(int weight) { bb.putInt(bb_pos + 0, weight); }\n\n  public static int createFallingTub(FlatBufferBuilder builder, int weight) {\n    builder.prep(4, 4);\n    builder.putInt(weight);\n    return builder.offset();\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public FallingTub get(int j) { return get(new FallingTub(), j); }\n    public FallingTub get(FallingTub obj, int j) {  return obj.__assign(__element(j), bb); }\n  }\n  public FallingTubT unpack() {\n    FallingTubT _o = new FallingTubT();\n    unpackTo(_o);\n    return _o;\n  }\n  public void unpackTo(FallingTubT _o) {\n    int _oWeight = weight();\n    _o.setWeight(_oWeight);\n  }\n  public static int pack(FlatBufferBuilder builder, FallingTubT _o) {\n    if (_o == null) return 0;\n    return createFallingTub(\n      builder,\n      _o.getWeight());\n  }\n}\n\n"
  },
  {
    "path": "tests/union_vector/FallingTub.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\nimport com.google.flatbuffers.BaseVector\nimport com.google.flatbuffers.BooleanVector\nimport com.google.flatbuffers.ByteVector\nimport com.google.flatbuffers.Constants\nimport com.google.flatbuffers.DoubleVector\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.FloatVector\nimport com.google.flatbuffers.LongVector\nimport com.google.flatbuffers.StringVector\nimport com.google.flatbuffers.Struct\nimport com.google.flatbuffers.Table\nimport com.google.flatbuffers.UnionVector\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport kotlin.math.sign\n\n@Suppress(\"unused\")\nclass FallingTub : Struct() {\n\n    fun __init(_i: Int, _bb: ByteBuffer)  {\n        __reset(_i, _bb)\n    }\n    fun __assign(_i: Int, _bb: ByteBuffer) : FallingTub {\n        __init(_i, _bb)\n        return this\n    }\n    val weight : Int get() = bb.getInt(bb_pos + 0)\n    fun mutateWeight(weight: Int) : ByteBuffer = bb.putInt(bb_pos + 0, weight)\n    companion object {\n        fun createFallingTub(builder: FlatBufferBuilder, weight: Int) : Int {\n            builder.prep(4, 4)\n            builder.putInt(weight)\n            return builder.offset()\n        }\n    }\n}\n"
  },
  {
    "path": "tests/union_vector/FallingTub.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nuse \\Google\\FlatBuffers\\Struct;\nuse \\Google\\FlatBuffers\\Table;\nuse \\Google\\FlatBuffers\\ByteBuffer;\nuse \\Google\\FlatBuffers\\FlatBufferBuilder;\n\nclass FallingTub extends Struct\n{\n    /**\n     * @param int $_i offset\n     * @param ByteBuffer $_bb\n     * @return FallingTub\n     **/\n    public function init($_i, ByteBuffer $_bb)\n    {\n        $this->bb_pos = $_i;\n        $this->bb = $_bb;\n        return $this;\n    }\n\n    /**\n     * @return int\n     */\n    public function GetWeight()\n    {\n        return $this->bb->getInt($this->bb_pos + 0);\n    }\n\n\n    /**\n     * @return int offset\n     */\n    public static function createFallingTub(FlatBufferBuilder $builder, $weight)\n    {\n        $builder->prep(4, 4);\n        $builder->putInt($weight);\n        return $builder->offset();\n    }\n}\n"
  },
  {
    "path": "tests/union_vector/FallingTubT.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\npublic class FallingTubT {\n  private int weight;\n\n  public int getWeight() { return weight; }\n\n  public void setWeight(int weight) { this.weight = weight; }\n\n\n  public FallingTubT() {\n    this.weight = 0;\n  }\n}\n\n"
  },
  {
    "path": "tests/union_vector/Gadget.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\n[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]\npublic enum Gadget : byte\n{\n  NONE = 0,\n  FallingTub = 1,\n  HandFan = 2,\n};\n\npublic class GadgetUnion {\n  public Gadget Type { get; set; }\n  public object Value { get; set; }\n\n  public GadgetUnion() {\n    this.Type = Gadget.NONE;\n    this.Value = null;\n  }\n\n  public T As<T>() where T : class { return this.Value as T; }\n  public FallingTubT AsFallingTub() { return this.As<FallingTubT>(); }\n  public static GadgetUnion FromFallingTub(FallingTubT _fallingtub) { return new GadgetUnion{ Type = Gadget.FallingTub, Value = _fallingtub }; }\n  public HandFanT AsHandFan() { return this.As<HandFanT>(); }\n  public static GadgetUnion FromHandFan(HandFanT _handfan) { return new GadgetUnion{ Type = Gadget.HandFan, Value = _handfan }; }\n\n  public static int Pack(Google.FlatBuffers.FlatBufferBuilder builder, GadgetUnion _o) {\n    switch (_o.Type) {\n      default: return 0;\n      case Gadget.FallingTub: return FallingTub.Pack(builder, _o.AsFallingTub()).Value;\n      case Gadget.HandFan: return HandFan.Pack(builder, _o.AsHandFan()).Value;\n    }\n  }\n}\n\npublic class GadgetUnion_JsonConverter : Newtonsoft.Json.JsonConverter {\n  public override bool CanConvert(System.Type objectType) {\n    return objectType == typeof(GadgetUnion) || objectType == typeof(System.Collections.Generic.List<GadgetUnion>);\n  }\n  public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) {\n    var _olist = value as System.Collections.Generic.List<GadgetUnion>;\n    if (_olist != null) {\n      writer.WriteStartArray();\n      foreach (var _o in _olist) { this.WriteJson(writer, _o, serializer); }\n      writer.WriteEndArray();\n    } else {\n      this.WriteJson(writer, value as GadgetUnion, serializer);\n    }\n  }\n  public void WriteJson(Newtonsoft.Json.JsonWriter writer, GadgetUnion _o, Newtonsoft.Json.JsonSerializer serializer) {\n    if (_o == null) return;\n    serializer.Serialize(writer, _o.Value);\n  }\n  public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) {\n    var _olist = existingValue as System.Collections.Generic.List<GadgetUnion>;\n    if (_olist != null) {\n      for (var _j = 0; _j < _olist.Count; ++_j) {\n        reader.Read();\n        _olist[_j] = this.ReadJson(reader, _olist[_j], serializer);\n      }\n      reader.Read();\n      return _olist;\n    } else {\n      return this.ReadJson(reader, existingValue as GadgetUnion, serializer);\n    }\n  }\n  public GadgetUnion ReadJson(Newtonsoft.Json.JsonReader reader, GadgetUnion _o, Newtonsoft.Json.JsonSerializer serializer) {\n    if (_o == null) return null;\n    switch (_o.Type) {\n      default: break;\n      case Gadget.FallingTub: _o.Value = serializer.Deserialize<FallingTubT>(reader); break;\n      case Gadget.HandFan: _o.Value = serializer.Deserialize<HandFanT>(reader); break;\n    }\n    return _o;\n  }\n}\n\n\n\nstatic public class GadgetVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)\n  {\n    bool result = true;\n    switch((Gadget)typeId)\n    {\n      case Gadget.FallingTub:\n        result = verifier.VerifyUnionData(tablePos, 4, 4);\n        break;\n      case Gadget.HandFan:\n        result = HandFanVerify.Verify(verifier, tablePos);\n        break;\n      default: result = true;\n        break;\n    }\n    return result;\n  }\n}\n\n"
  },
  {
    "path": "tests/union_vector/Gadget.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n@SuppressWarnings(\"unused\")\npublic final class Gadget {\n  private Gadget() { }\n  public static final byte NONE = 0;\n  public static final byte FallingTub = 1;\n  public static final byte HandFan = 2;\n\n  public static final String[] names = { \"NONE\", \"FallingTub\", \"HandFan\", };\n\n  public static String name(int e) { return names[e]; }\n}\n\n"
  },
  {
    "path": "tests/union_vector/Gadget.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\n@Suppress(\"unused\")\nclass Gadget private constructor() {\n    companion object {\n        const val NONE: UByte = 0u\n        const val FallingTub: UByte = 1u\n        const val HandFan: UByte = 2u\n        val names : Array<String> = arrayOf(\"NONE\", \"FallingTub\", \"HandFan\")\n        fun name(e: Int) : String = names[e]\n    }\n}\n"
  },
  {
    "path": "tests/union_vector/Gadget.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nclass Gadget\n{\n    const NONE = 0;\n    const FallingTub = 1;\n    const HandFan = 2;\n\n    private static $names = array(\n        Gadget::NONE=>\"NONE\",\n        Gadget::FallingTub=>\"FallingTub\",\n        Gadget::HandFan=>\"HandFan\",\n    );\n\n    public static function Name($e)\n    {\n        if (!isset(self::$names[$e])) {\n            throw new \\Exception();\n        }\n        return self::$names[$e];\n    }\n}\n"
  },
  {
    "path": "tests/union_vector/GadgetUnion.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\nimport com.google.flatbuffers.FlatBufferBuilder;\n\npublic class GadgetUnion {\n  private byte type;\n  private Object value;\n\n  public byte getType() { return type; }\n\n  public void setType(byte type) { this.type = type; }\n\n  public Object getValue() { return value; }\n\n  public void setValue(Object value) { this.value = value; }\n\n  public GadgetUnion() {\n    this.type = Gadget.NONE;\n    this.value = null;\n  }\n\n  public FallingTubT asFallingTub() { return (FallingTubT) value; }\n  public HandFanT asHandFan() { return (HandFanT) value; }\n\n  public static int pack(FlatBufferBuilder builder, GadgetUnion _o) {\n    switch (_o.type) {\n      case Gadget.FallingTub: return FallingTub.pack(builder, _o.asFallingTub());\n      case Gadget.HandFan: return HandFan.pack(builder, _o.asHandFan());\n      default: return 0;\n    }\n  }\n}\n\n"
  },
  {
    "path": "tests/union_vector/HandFan.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct HandFan : IFlatbufferObject\n{\n  private Table __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_25_12_19(); }\n  public static HandFan GetRootAsHandFan(ByteBuffer _bb) { return GetRootAsHandFan(_bb, new HandFan()); }\n  public static HandFan GetRootAsHandFan(ByteBuffer _bb, HandFan obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }\n  public HandFan __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public int Length { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } }\n  public bool MutateLength(int length) { int o = __p.__offset(4); if (o != 0) { __p.bb.PutInt(o + __p.bb_pos, length); return true; } else { return false; } }\n\n  public static Offset<HandFan> CreateHandFan(FlatBufferBuilder builder,\n      int length = 0) {\n    builder.StartTable(1);\n    HandFan.AddLength(builder, length);\n    return HandFan.EndHandFan(builder);\n  }\n\n  public static void StartHandFan(FlatBufferBuilder builder) { builder.StartTable(1); }\n  public static void AddLength(FlatBufferBuilder builder, int length) { builder.AddInt(0, length, 0); }\n  public static Offset<HandFan> EndHandFan(FlatBufferBuilder builder) {\n    int o = builder.EndTable();\n    return new Offset<HandFan>(o);\n  }\n  public HandFanT UnPack() {\n    var _o = new HandFanT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(HandFanT _o) {\n    _o.Length = this.Length;\n  }\n  public static Offset<HandFan> Pack(FlatBufferBuilder builder, HandFanT _o) {\n    if (_o == null) return default(Offset<HandFan>);\n    return CreateHandFan(\n      builder,\n      _o.Length);\n  }\n}\n\npublic class HandFanT\n{\n  [Newtonsoft.Json.JsonProperty(\"length\")]\n  public int Length { get; set; }\n\n  public HandFanT() {\n    this.Length = 0;\n  }\n}\n\n\nstatic public class HandFanVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos)\n  {\n    return verifier.VerifyTableStart(tablePos)\n      && verifier.VerifyField(tablePos, 4 /*Length*/, 4 /*int*/, 4, false)\n      && verifier.VerifyTableEnd(tablePos);\n  }\n}\n"
  },
  {
    "path": "tests/union_vector/HandFan.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class HandFan extends com.google.flatbuffers.Table {\n  public static void ValidateVersion() { Constants.FLATBUFFERS_25_12_19(); }\n  public static HandFan getRootAsHandFan(ByteBuffer _bb) { return getRootAsHandFan(_bb, new HandFan()); }\n  public static HandFan getRootAsHandFan(ByteBuffer _bb, HandFan obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public HandFan __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public int length() { int o = __offset(4); return o != 0 ? bb.getInt(o + bb_pos) : 0; }\n  public boolean mutateLength(int length) { int o = __offset(4); if (o != 0) { bb.putInt(o + bb_pos, length); return true; } else { return false; } }\n\n  public static int createHandFan(FlatBufferBuilder builder,\n      int length) {\n    builder.startTable(1);\n    HandFan.addLength(builder, length);\n    return HandFan.endHandFan(builder);\n  }\n\n  public static void startHandFan(FlatBufferBuilder builder) { builder.startTable(1); }\n  public static void addLength(FlatBufferBuilder builder, int length) { builder.addInt(0, length, 0); }\n  public static int endHandFan(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    return o;\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public HandFan get(int j) { return get(new HandFan(), j); }\n    public HandFan get(HandFan obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); }\n  }\n  public HandFanT unpack() {\n    HandFanT _o = new HandFanT();\n    unpackTo(_o);\n    return _o;\n  }\n  public void unpackTo(HandFanT _o) {\n    int _oLength = length();\n    _o.setLength(_oLength);\n  }\n  public static int pack(FlatBufferBuilder builder, HandFanT _o) {\n    if (_o == null) return 0;\n    return createHandFan(\n      builder,\n      _o.getLength());\n  }\n}\n\n"
  },
  {
    "path": "tests/union_vector/HandFan.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\nimport com.google.flatbuffers.BaseVector\nimport com.google.flatbuffers.BooleanVector\nimport com.google.flatbuffers.ByteVector\nimport com.google.flatbuffers.Constants\nimport com.google.flatbuffers.DoubleVector\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.FloatVector\nimport com.google.flatbuffers.LongVector\nimport com.google.flatbuffers.StringVector\nimport com.google.flatbuffers.Struct\nimport com.google.flatbuffers.Table\nimport com.google.flatbuffers.UnionVector\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport kotlin.math.sign\n\n@Suppress(\"unused\")\nclass HandFan : Table() {\n\n    fun __init(_i: Int, _bb: ByteBuffer)  {\n        __reset(_i, _bb)\n    }\n    fun __assign(_i: Int, _bb: ByteBuffer) : HandFan {\n        __init(_i, _bb)\n        return this\n    }\n    val length : Int\n        get() {\n            val o = __offset(4)\n            return if(o != 0) bb.getInt(o + bb_pos) else 0\n        }\n    fun mutateLength(length: Int) : Boolean {\n        val o = __offset(4)\n        return if (o != 0) {\n            bb.putInt(o + bb_pos, length)\n            true\n        } else {\n            false\n        }\n    }\n    companion object {\n        fun validateVersion() = Constants.FLATBUFFERS_25_12_19()\n        fun getRootAsHandFan(_bb: ByteBuffer): HandFan = getRootAsHandFan(_bb, HandFan())\n        fun getRootAsHandFan(_bb: ByteBuffer, obj: HandFan): HandFan {\n            _bb.order(ByteOrder.LITTLE_ENDIAN)\n            return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb))\n        }\n        fun createHandFan(builder: FlatBufferBuilder, length: Int) : Int {\n            builder.startTable(1)\n            addLength(builder, length)\n            return endHandFan(builder)\n        }\n        fun startHandFan(builder: FlatBufferBuilder) = builder.startTable(1)\n        fun addLength(builder: FlatBufferBuilder, length: Int) = builder.addInt(0, length, 0)\n        fun endHandFan(builder: FlatBufferBuilder) : Int {\n            val o = builder.endTable()\n            return o\n        }\n    }\n}\n"
  },
  {
    "path": "tests/union_vector/HandFan.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nuse \\Google\\FlatBuffers\\Struct;\nuse \\Google\\FlatBuffers\\Table;\nuse \\Google\\FlatBuffers\\ByteBuffer;\nuse \\Google\\FlatBuffers\\FlatBufferBuilder;\n\nclass HandFan extends Table\n{\n    /**\n     * @param ByteBuffer $bb\n     * @return HandFan\n     */\n    public static function getRootAsHandFan(ByteBuffer $bb)\n    {\n        $obj = new HandFan();\n        return ($obj->init($bb->getInt($bb->getPosition()) + $bb->getPosition(), $bb));\n    }\n\n    public static function HandFanIdentifier()\n    {\n        return \"MOVI\";\n    }\n\n    public static function HandFanBufferHasIdentifier(ByteBuffer $buf)\n    {\n        return self::__has_identifier($buf, self::HandFanIdentifier());\n    }\n\n    /**\n     * @param int $_i offset\n     * @param ByteBuffer $_bb\n     * @return HandFan\n     **/\n    public function init($_i, ByteBuffer $_bb)\n    {\n        $this->bb_pos = $_i;\n        $this->bb = $_bb;\n        return $this;\n    }\n\n    /**\n     * @return int\n     */\n    public function getLength()\n    {\n        $o = $this->__offset(4);\n        return $o != 0 ? $this->bb->getInt($o + $this->bb_pos) : 0;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return void\n     */\n    public static function startHandFan(FlatBufferBuilder $builder)\n    {\n        $builder->StartObject(1);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return HandFan\n     */\n    public static function createHandFan(FlatBufferBuilder $builder, $length)\n    {\n        $builder->startObject(1);\n        self::addLength($builder, $length);\n        $o = $builder->endObject();\n        return $o;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int\n     * @return void\n     */\n    public static function addLength(FlatBufferBuilder $builder, $length)\n    {\n        $builder->addIntX(0, $length, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return int table offset\n     */\n    public static function endHandFan(FlatBufferBuilder $builder)\n    {\n        $o = $builder->endObject();\n        return $o;\n    }\n}\n"
  },
  {
    "path": "tests/union_vector/HandFanT.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\npublic class HandFanT {\n  private int length;\n\n  public int getLength() { return length; }\n\n  public void setLength(int length) { this.length = length; }\n\n\n  public HandFanT() {\n    this.length = 0;\n  }\n}\n\n"
  },
  {
    "path": "tests/union_vector/Movie.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct Movie : IFlatbufferObject\n{\n  private Table __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_25_12_19(); }\n  public static Movie GetRootAsMovie(ByteBuffer _bb) { return GetRootAsMovie(_bb, new Movie()); }\n  public static Movie GetRootAsMovie(ByteBuffer _bb, Movie obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }\n  public static bool MovieBufferHasIdentifier(ByteBuffer _bb) { return Table.__has_identifier(_bb, \"MOVI\"); }\n  public static bool VerifyMovie(ByteBuffer _bb) {Google.FlatBuffers.Verifier verifier = new Google.FlatBuffers.Verifier(_bb); return verifier.VerifyBuffer(\"MOVI\", false, MovieVerify.Verify); }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }\n  public Movie __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public Character MainCharacterType { get { int o = __p.__offset(4); return o != 0 ? (Character)__p.bb.Get(o + __p.bb_pos) : Character.NONE; } }\n  public TTable? MainCharacter<TTable>() where TTable : struct, IFlatbufferObject { int o = __p.__offset(6); return o != 0 ? (TTable?)__p.__union<TTable>(o + __p.bb_pos) : null; }\n  public string MainCharacterAsString() { int o = __p.__offset(6); return o != 0 ? __p.__string(o + __p.bb_pos) : null; }\n  public Attacker MainCharacterAsMuLan() { return MainCharacter<Attacker>().Value; }\n  public Rapunzel MainCharacterAsRapunzel() { return MainCharacter<Rapunzel>().Value; }\n  public BookReader MainCharacterAsBelle() { return MainCharacter<BookReader>().Value; }\n  public BookReader MainCharacterAsBookFan() { return MainCharacter<BookReader>().Value; }\n  public string MainCharacterAsOther() { return MainCharacterAsString(); }\n  public string MainCharacterAsUnused() { return MainCharacterAsString(); }\n  public Character CharactersType(int j) { int o = __p.__offset(8); return o != 0 ? (Character)__p.bb.Get(__p.__vector(o) + j * 1) : (Character)0; }\n  public int CharactersTypeLength { get { int o = __p.__offset(8); return o != 0 ? __p.__vector_len(o) : 0; } }\n#if ENABLE_SPAN_T\n  public Span<Character> GetCharactersTypeBytes() { return __p.__vector_as_span<Character>(8, 1); }\n#else\n  public ArraySegment<byte>? GetCharactersTypeBytes() { return __p.__vector_as_arraysegment(8); }\n#endif\n  public Character[] GetCharactersTypeArray() { int o = __p.__offset(8); if (o == 0) return null; int p = __p.__vector(o); int l = __p.__vector_len(o); Character[] a = new Character[l]; for (int i = 0; i < l; i++) { a[i] = (Character)__p.bb.Get(p + i * 1); } return a; }\n  public TTable? Characters<TTable>(int j) where TTable : struct, IFlatbufferObject { int o = __p.__offset(10); return o != 0 ? (TTable?)__p.__union<TTable>(__p.__vector(o) + j * 4) : null; }\n  public string CharactersAsString(int j) { int o = __p.__offset(10); return o != 0 ? __p.__string(__p.__vector(o) + j * 4) : null; }\n  public int CharactersLength { get { int o = __p.__offset(10); return o != 0 ? __p.__vector_len(o) : 0; } }\n\n  public static Offset<Movie> CreateMovie(FlatBufferBuilder builder,\n      Character main_character_type = Character.NONE,\n      int main_characterOffset = 0,\n      VectorOffset characters_typeOffset = default(VectorOffset),\n      VectorOffset charactersOffset = default(VectorOffset)) {\n    builder.StartTable(4);\n    Movie.AddCharacters(builder, charactersOffset);\n    Movie.AddCharactersType(builder, characters_typeOffset);\n    Movie.AddMainCharacter(builder, main_characterOffset);\n    Movie.AddMainCharacterType(builder, main_character_type);\n    return Movie.EndMovie(builder);\n  }\n\n  public static void StartMovie(FlatBufferBuilder builder) { builder.StartTable(4); }\n  public static void AddMainCharacterType(FlatBufferBuilder builder, Character mainCharacterType) { builder.AddByte(0, (byte)mainCharacterType, 0); }\n  public static void AddMainCharacter(FlatBufferBuilder builder, int mainCharacterOffset) { builder.AddOffset(1, mainCharacterOffset, 0); }\n  public static void AddCharactersType(FlatBufferBuilder builder, VectorOffset charactersTypeOffset) { builder.AddOffset(2, charactersTypeOffset.Value, 0); }\n  public static VectorOffset CreateCharactersTypeVector(FlatBufferBuilder builder, Character[] data) { builder.StartVector(1, data.Length, 1); for (int i = data.Length - 1; i >= 0; i--) builder.AddByte((byte)data[i]); return builder.EndVector(); }\n  public static VectorOffset CreateCharactersTypeVectorBlock(FlatBufferBuilder builder, Character[] data) { builder.StartVector(1, data.Length, 1); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateCharactersTypeVectorBlock(FlatBufferBuilder builder, ArraySegment<Character> data) { builder.StartVector(1, data.Count, 1); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateCharactersTypeVectorBlock(FlatBufferBuilder builder, IntPtr dataPtr, int sizeInBytes) { builder.StartVector(1, sizeInBytes, 1); builder.Add<Character>(dataPtr, sizeInBytes); return builder.EndVector(); }\n  public static void StartCharactersTypeVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(1, numElems, 1); }\n  public static void AddCharacters(FlatBufferBuilder builder, VectorOffset charactersOffset) { builder.AddOffset(3, charactersOffset.Value, 0); }\n  public static VectorOffset CreateCharactersVector(FlatBufferBuilder builder, int[] data) { builder.StartVector(4, data.Length, 4); for (int i = data.Length - 1; i >= 0; i--) builder.AddOffset(data[i]); return builder.EndVector(); }\n  public static VectorOffset CreateCharactersVectorBlock(FlatBufferBuilder builder, int[] data) { builder.StartVector(4, data.Length, 4); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateCharactersVectorBlock(FlatBufferBuilder builder, ArraySegment<int> data) { builder.StartVector(4, data.Count, 4); builder.Add(data); return builder.EndVector(); }\n  public static VectorOffset CreateCharactersVectorBlock(FlatBufferBuilder builder, IntPtr dataPtr, int sizeInBytes) { builder.StartVector(1, sizeInBytes, 1); builder.Add<int>(dataPtr, sizeInBytes); return builder.EndVector(); }\n  public static void StartCharactersVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 4); }\n  public static Offset<Movie> EndMovie(FlatBufferBuilder builder) {\n    int o = builder.EndTable();\n    return new Offset<Movie>(o);\n  }\n  public static void FinishMovieBuffer(FlatBufferBuilder builder, Offset<Movie> offset) { builder.Finish(offset.Value, \"MOVI\"); }\n  public static void FinishSizePrefixedMovieBuffer(FlatBufferBuilder builder, Offset<Movie> offset) { builder.FinishSizePrefixed(offset.Value, \"MOVI\"); }\n  public MovieT UnPack() {\n    var _o = new MovieT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(MovieT _o) {\n    _o.MainCharacter = new CharacterUnion();\n    _o.MainCharacter.Type = this.MainCharacterType;\n    switch (this.MainCharacterType) {\n      default: break;\n      case Character.MuLan:\n        _o.MainCharacter.Value = this.MainCharacter<Attacker>().HasValue ? this.MainCharacter<Attacker>().Value.UnPack() : null;\n        break;\n      case Character.Rapunzel:\n        _o.MainCharacter.Value = this.MainCharacter<Rapunzel>().HasValue ? this.MainCharacter<Rapunzel>().Value.UnPack() : null;\n        break;\n      case Character.Belle:\n        _o.MainCharacter.Value = this.MainCharacter<BookReader>().HasValue ? this.MainCharacter<BookReader>().Value.UnPack() : null;\n        break;\n      case Character.BookFan:\n        _o.MainCharacter.Value = this.MainCharacter<BookReader>().HasValue ? this.MainCharacter<BookReader>().Value.UnPack() : null;\n        break;\n      case Character.Other:\n        _o.MainCharacter.Value = this.MainCharacterAsString();\n        break;\n      case Character.Unused:\n        _o.MainCharacter.Value = this.MainCharacterAsString();\n        break;\n    }\n    _o.Characters = new List<CharacterUnion>();\n    for (var _j = 0; _j < this.CharactersLength; ++_j) {\n      var _o_Characters = new CharacterUnion();\n      _o_Characters.Type = this.CharactersType(_j);\n      switch (this.CharactersType(_j)) {\n        default: break;\n        case Character.MuLan:\n          _o_Characters.Value = this.Characters<Attacker>(_j).HasValue ? this.Characters<Attacker>(_j).Value.UnPack() : null;\n          break;\n        case Character.Rapunzel:\n          _o_Characters.Value = this.Characters<Rapunzel>(_j).HasValue ? this.Characters<Rapunzel>(_j).Value.UnPack() : null;\n          break;\n        case Character.Belle:\n          _o_Characters.Value = this.Characters<BookReader>(_j).HasValue ? this.Characters<BookReader>(_j).Value.UnPack() : null;\n          break;\n        case Character.BookFan:\n          _o_Characters.Value = this.Characters<BookReader>(_j).HasValue ? this.Characters<BookReader>(_j).Value.UnPack() : null;\n          break;\n        case Character.Other:\n          _o_Characters.Value = this.CharactersAsString(_j);\n          break;\n        case Character.Unused:\n          _o_Characters.Value = this.CharactersAsString(_j);\n          break;\n      }\n      _o.Characters.Add(_o_Characters);\n    }\n  }\n  public static Offset<Movie> Pack(FlatBufferBuilder builder, MovieT _o) {\n    if (_o == null) return default(Offset<Movie>);\n    var _main_character_type = _o.MainCharacter == null ? Character.NONE : _o.MainCharacter.Type;\n    var _main_character = _o.MainCharacter == null ? 0 : CharacterUnion.Pack(builder, _o.MainCharacter);\n    var _characters_type = default(VectorOffset);\n    if (_o.Characters != null) {\n      var __characters_type = new Character[_o.Characters.Count];\n      for (var _j = 0; _j < __characters_type.Length; ++_j) { __characters_type[_j] = _o.Characters[_j].Type; }\n      _characters_type = CreateCharactersTypeVector(builder, __characters_type);\n    }\n    var _characters = default(VectorOffset);\n    if (_o.Characters != null) {\n      var __characters = new int[_o.Characters.Count];\n      for (var _j = 0; _j < __characters.Length; ++_j) { __characters[_j] = CharacterUnion.Pack(builder,  _o.Characters[_j]); }\n      _characters = CreateCharactersVector(builder, __characters);\n    }\n    return CreateMovie(\n      builder,\n      _main_character_type,\n      _main_character,\n      _characters_type,\n      _characters);\n  }\n}\n\npublic class MovieT\n{\n  [Newtonsoft.Json.JsonProperty(\"main_character_type\")]\n  private Character MainCharacterType {\n    get {\n      return this.MainCharacter != null ? this.MainCharacter.Type : Character.NONE;\n    }\n    set {\n      this.MainCharacter = new CharacterUnion();\n      this.MainCharacter.Type = value;\n    }\n  }\n  [Newtonsoft.Json.JsonProperty(\"main_character\")]\n  [Newtonsoft.Json.JsonConverter(typeof(CharacterUnion_JsonConverter))]\n  public CharacterUnion MainCharacter { get; set; }\n  [Newtonsoft.Json.JsonProperty(\"characters_type\")]\n  private Character[] CharactersType {\n    get {\n      if (this.Characters == null) return null;\n      var _o = new Character[this.Characters.Count];\n      for (var _j = 0; _j < _o.Length; ++_j) { _o[_j] = this.Characters[_j].Type; }\n      return _o;\n    }\n    set {\n      this.Characters = new List<CharacterUnion>();\n      for (var _j = 0; _j < value.Length; ++_j) {\n        var _o = new CharacterUnion();\n        _o.Type = value[_j];\n        this.Characters.Add(_o);\n      }\n    }\n  }\n  [Newtonsoft.Json.JsonProperty(\"characters\")]\n  [Newtonsoft.Json.JsonConverter(typeof(CharacterUnion_JsonConverter))]\n  public List<CharacterUnion> Characters { get; set; }\n\n  public MovieT() {\n    this.MainCharacter = null;\n    this.Characters = null;\n  }\n\n  public static MovieT DeserializeFromJson(string jsonText) {\n    return Newtonsoft.Json.JsonConvert.DeserializeObject<MovieT>(jsonText);\n  }\n  public string SerializeToJson() {\n    return Newtonsoft.Json.JsonConvert.SerializeObject(this, Newtonsoft.Json.Formatting.Indented);\n  }\n  public static MovieT DeserializeFromBinary(byte[] fbBuffer) {\n    return Movie.GetRootAsMovie(new ByteBuffer(fbBuffer)).UnPack();\n  }\n  public byte[] SerializeToBinary() {\n    var fbb = new FlatBufferBuilder(0x10000);\n    Movie.FinishMovieBuffer(fbb, Movie.Pack(fbb, this));\n    return fbb.DataBuffer.ToSizedArray();\n  }\n}\n\n\nstatic public class MovieVerify\n{\n  static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos)\n  {\n    return verifier.VerifyTableStart(tablePos)\n      && verifier.VerifyField(tablePos, 4 /*MainCharacterType*/, 1 /*Character*/, 1, false)\n      && verifier.VerifyUnion(tablePos, 4, 6 /*MainCharacter*/, CharacterVerify.Verify, false)\n      && verifier.VerifyVectorOfData(tablePos, 8 /*CharactersType*/, 1 /*Character*/, false)\n      && verifier.VerifyTableEnd(tablePos);\n  }\n}\n"
  },
  {
    "path": "tests/union_vector/Movie.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class Movie extends com.google.flatbuffers.Table {\n  public static void ValidateVersion() { Constants.FLATBUFFERS_25_12_19(); }\n  public static Movie getRootAsMovie(ByteBuffer _bb) { return getRootAsMovie(_bb, new Movie()); }\n  public static Movie getRootAsMovie(ByteBuffer _bb, Movie obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }\n  public static boolean MovieBufferHasIdentifier(ByteBuffer _bb) { return __has_identifier(_bb, \"MOVI\"); }\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public Movie __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public byte mainCharacterType() { int o = __offset(4); return o != 0 ? bb.get(o + bb_pos) : 0; }\n  public com.google.flatbuffers.Table mainCharacter(com.google.flatbuffers.Table obj) { int o = __offset(6); return o != 0 ? __union(obj, o + bb_pos) : null; }\n  public byte charactersType(int j) { int o = __offset(8); return o != 0 ? bb.get(__vector(o) + j * 1) : 0; }\n  public int charactersTypeLength() { int o = __offset(8); return o != 0 ? __vector_len(o) : 0; }\n  public ByteVector charactersTypeVector() { return charactersTypeVector(new ByteVector()); }\n  public ByteVector charactersTypeVector(ByteVector obj) { int o = __offset(8); return o != 0 ? obj.__assign(__vector(o), bb) : null; }\n  public ByteBuffer charactersTypeAsByteBuffer() { return __vector_as_bytebuffer(8, 1); }\n  public ByteBuffer charactersTypeInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 8, 1); }\n  public com.google.flatbuffers.Table characters(com.google.flatbuffers.Table obj, int j) { int o = __offset(10); return o != 0 ? __union(obj, __vector(o) + j * 4) : null; }\n  public int charactersLength() { int o = __offset(10); return o != 0 ? __vector_len(o) : 0; }\n  public UnionVector charactersVector() { return charactersVector(new UnionVector()); }\n  public UnionVector charactersVector(UnionVector obj) { int o = __offset(10); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }\n\n  public static int createMovie(FlatBufferBuilder builder,\n      byte mainCharacterType,\n      int mainCharacterOffset,\n      int charactersTypeOffset,\n      int charactersOffset) {\n    builder.startTable(4);\n    Movie.addCharacters(builder, charactersOffset);\n    Movie.addCharactersType(builder, charactersTypeOffset);\n    Movie.addMainCharacter(builder, mainCharacterOffset);\n    Movie.addMainCharacterType(builder, mainCharacterType);\n    return Movie.endMovie(builder);\n  }\n\n  public static void startMovie(FlatBufferBuilder builder) { builder.startTable(4); }\n  public static void addMainCharacterType(FlatBufferBuilder builder, byte mainCharacterType) { builder.addByte(0, mainCharacterType, 0); }\n  public static void addMainCharacter(FlatBufferBuilder builder, int mainCharacterOffset) { builder.addOffset(1, mainCharacterOffset, 0); }\n  public static void addCharactersType(FlatBufferBuilder builder, int charactersTypeOffset) { builder.addOffset(2, charactersTypeOffset, 0); }\n  public static int createCharactersTypeVector(FlatBufferBuilder builder, byte[] data) { builder.startVector(1, data.length, 1); for (int i = data.length - 1; i >= 0; i--) builder.addByte(data[i]); return builder.endVector(); }\n  public static void startCharactersTypeVector(FlatBufferBuilder builder, int numElems) { builder.startVector(1, numElems, 1); }\n  public static void addCharacters(FlatBufferBuilder builder, int charactersOffset) { builder.addOffset(3, charactersOffset, 0); }\n  public static int createCharactersVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }\n  public static void startCharactersVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }\n  public static int endMovie(FlatBufferBuilder builder) {\n    int o = builder.endTable();\n    return o;\n  }\n  public static void finishMovieBuffer(FlatBufferBuilder builder, int offset) { builder.finish(offset, \"MOVI\"); }\n  public static void finishSizePrefixedMovieBuffer(FlatBufferBuilder builder, int offset) { builder.finishSizePrefixed(offset, \"MOVI\"); }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public Movie get(int j) { return get(new Movie(), j); }\n    public Movie get(Movie obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); }\n  }\n  public MovieT unpack() {\n    MovieT _o = new MovieT();\n    unpackTo(_o);\n    return _o;\n  }\n  public void unpackTo(MovieT _o) {\n    CharacterUnion _oMainCharacter = new CharacterUnion();\n    byte _oMainCharacterType = mainCharacterType();\n    _oMainCharacter.setType(_oMainCharacterType);\n    com.google.flatbuffers.Table _oMainCharacterValue;\n    switch (_oMainCharacterType) {\n      case Character.MuLan:\n        _oMainCharacterValue = mainCharacter(new Attacker());\n        _oMainCharacter.setValue(_oMainCharacterValue != null ? ((Attacker) _oMainCharacterValue).unpack() : null);\n        break;\n      default: break;\n    }\n    _o.setMainCharacter(_oMainCharacter);\n    CharacterUnion[] _oCharacters = new CharacterUnion[charactersLength()];\n    for (int _j = 0; _j < charactersLength(); ++_j) {\n      CharacterUnion _oCharactersElement = new CharacterUnion();\n      byte _oCharactersElementType = charactersType(_j);\n      _oCharactersElement.setType(_oCharactersElementType);\n      com.google.flatbuffers.Table _oCharactersElementValue;\n      switch (_oCharactersElementType) {\n        case Character.MuLan:\n          _oCharactersElementValue = characters(new Attacker(), _j);\n          _oCharactersElement.setValue(_oCharactersElementValue != null ? ((Attacker) _oCharactersElementValue).unpack() : null);\n          break;\n        default: break;\n      }\n      _oCharacters[_j] = _oCharactersElement;\n    }\n    _o.setCharacters(_oCharacters);\n  }\n  public static int pack(FlatBufferBuilder builder, MovieT _o) {\n    if (_o == null) return 0;\n    byte _mainCharacterType = _o.getMainCharacter() == null ? Character.NONE : _o.getMainCharacter().getType();\n    int _mainCharacter = _o.getMainCharacter() == null ? 0 : CharacterUnion.pack(builder, _o.getMainCharacter());\n    int _charactersType = 0;\n    if (_o.getCharacters() != null) {\n      byte[] __charactersType = new byte[_o.getCharacters().length];\n      int _j = 0;\n      for (CharacterUnion _e : _o.getCharacters()) { __charactersType[_j] = _o.getCharacters()[_j].getType(); _j++;}\n      _charactersType = createCharactersTypeVector(builder, __charactersType);\n    }\n    int _characters = 0;\n    if (_o.getCharacters() != null) {\n      int[] __characters = new int[_o.getCharacters().length];\n      int _j = 0;\n      for (CharacterUnion _e : _o.getCharacters()) { __characters[_j] = CharacterUnion.pack(builder,  _o.getCharacters()[_j]); _j++;}\n      _characters = createCharactersVector(builder, __characters);\n    }\n    return createMovie(\n      builder,\n      _mainCharacterType,\n      _mainCharacter,\n      _charactersType,\n      _characters);\n  }\n}\n\n"
  },
  {
    "path": "tests/union_vector/Movie.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\nimport com.google.flatbuffers.BaseVector\nimport com.google.flatbuffers.BooleanVector\nimport com.google.flatbuffers.ByteVector\nimport com.google.flatbuffers.Constants\nimport com.google.flatbuffers.DoubleVector\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.FloatVector\nimport com.google.flatbuffers.LongVector\nimport com.google.flatbuffers.StringVector\nimport com.google.flatbuffers.Struct\nimport com.google.flatbuffers.Table\nimport com.google.flatbuffers.UnionVector\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport kotlin.math.sign\n\n@Suppress(\"unused\")\nclass Movie : Table() {\n\n    fun __init(_i: Int, _bb: ByteBuffer)  {\n        __reset(_i, _bb)\n    }\n    fun __assign(_i: Int, _bb: ByteBuffer) : Movie {\n        __init(_i, _bb)\n        return this\n    }\n    val mainCharacterType : UByte\n        get() {\n            val o = __offset(4)\n            return if(o != 0) bb.get(o + bb_pos).toUByte() else 0u\n        }\n    fun mutateMainCharacterType(mainCharacterType: UByte) : Boolean {\n        val o = __offset(4)\n        return if (o != 0) {\n            bb.put(o + bb_pos, mainCharacterType.toByte())\n            true\n        } else {\n            false\n        }\n    }\n    fun mainCharacter(obj: Table) : Table? {\n        val o = __offset(6); return if (o != 0) __union(obj, o + bb_pos) else null\n    }\n    fun charactersType(j: Int) : UByte {\n        val o = __offset(8)\n        return if (o != 0) {\n            bb.get(__vector(o) + j * 1).toUByte()\n        } else {\n            0u\n        }\n    }\n    val charactersTypeLength : Int\n        get() {\n            val o = __offset(8); return if (o != 0) __vector_len(o) else 0\n        }\n    val charactersTypeAsByteBuffer : ByteBuffer? get() = __vector_as_bytebuffer(8, 1)\n    fun charactersTypeInByteBuffer(_bb: ByteBuffer) : ByteBuffer? = __vector_in_bytebuffer(_bb, 8, 1)\n    fun mutateCharactersType(j: Int, charactersType: UByte) : Boolean {\n        val o = __offset(8)\n        return if (o != 0) {\n            bb.put(__vector(o) + j * 1, charactersType.toByte())\n            true\n        } else {\n            false\n        }\n    }\n    fun characters(obj: Table, j: Int) : Table? {\n        val o = __offset(10)\n        return if (o != 0) {\n            __union(obj, __vector(o) + j * 4)\n        } else {\n            null\n        }\n    }\n    val charactersLength : Int\n        get() {\n            val o = __offset(10); return if (o != 0) __vector_len(o) else 0\n        }\n    companion object {\n        fun validateVersion() = Constants.FLATBUFFERS_25_12_19()\n        fun getRootAsMovie(_bb: ByteBuffer): Movie = getRootAsMovie(_bb, Movie())\n        fun getRootAsMovie(_bb: ByteBuffer, obj: Movie): Movie {\n            _bb.order(ByteOrder.LITTLE_ENDIAN)\n            return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb))\n        }\n        fun MovieBufferHasIdentifier(_bb: ByteBuffer) : Boolean = __has_identifier(_bb, \"MOVI\")\n        fun createMovie(builder: FlatBufferBuilder, mainCharacterType: UByte, mainCharacterOffset: Int, charactersTypeOffset: Int, charactersOffset: Int) : Int {\n            builder.startTable(4)\n            addCharacters(builder, charactersOffset)\n            addCharactersType(builder, charactersTypeOffset)\n            addMainCharacter(builder, mainCharacterOffset)\n            addMainCharacterType(builder, mainCharacterType)\n            return endMovie(builder)\n        }\n        fun startMovie(builder: FlatBufferBuilder) = builder.startTable(4)\n        fun addMainCharacterType(builder: FlatBufferBuilder, mainCharacterType: UByte) = builder.addByte(0, mainCharacterType.toByte(), 0)\n        fun addMainCharacter(builder: FlatBufferBuilder, mainCharacter: Int) = builder.addOffset(1, mainCharacter, 0)\n        fun addCharactersType(builder: FlatBufferBuilder, charactersType: Int) = builder.addOffset(2, charactersType, 0)\n        @kotlin.ExperimentalUnsignedTypes\n        fun createCharactersTypeVector(builder: FlatBufferBuilder, data: UByteArray) : Int {\n            builder.startVector(1, data.size, 1)\n            for (i in data.size - 1 downTo 0) {\n                builder.addByte(data[i].toByte())\n            }\n            return builder.endVector()\n        }\n        fun startCharactersTypeVector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(1, numElems, 1)\n        fun addCharacters(builder: FlatBufferBuilder, characters: Int) = builder.addOffset(3, characters, 0)\n        fun createCharactersVector(builder: FlatBufferBuilder, data: IntArray) : Int {\n            builder.startVector(4, data.size, 4)\n            for (i in data.size - 1 downTo 0) {\n                builder.addOffset(data[i])\n            }\n            return builder.endVector()\n        }\n        fun startCharactersVector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(4, numElems, 4)\n        fun endMovie(builder: FlatBufferBuilder) : Int {\n            val o = builder.endTable()\n            return o\n        }\n        fun finishMovieBuffer(builder: FlatBufferBuilder, offset: Int) = builder.finish(offset, \"MOVI\")\n        fun finishSizePrefixedMovieBuffer(builder: FlatBufferBuilder, offset: Int) = builder.finishSizePrefixed(offset, \"MOVI\")\n    }\n}\n"
  },
  {
    "path": "tests/union_vector/Movie.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nuse \\Google\\FlatBuffers\\Struct;\nuse \\Google\\FlatBuffers\\Table;\nuse \\Google\\FlatBuffers\\ByteBuffer;\nuse \\Google\\FlatBuffers\\FlatBufferBuilder;\n\nclass Movie extends Table\n{\n    /**\n     * @param ByteBuffer $bb\n     * @return Movie\n     */\n    public static function getRootAsMovie(ByteBuffer $bb)\n    {\n        $obj = new Movie();\n        return ($obj->init($bb->getInt($bb->getPosition()) + $bb->getPosition(), $bb));\n    }\n\n    public static function MovieIdentifier()\n    {\n        return \"MOVI\";\n    }\n\n    public static function MovieBufferHasIdentifier(ByteBuffer $buf)\n    {\n        return self::__has_identifier($buf, self::MovieIdentifier());\n    }\n\n    /**\n     * @param int $_i offset\n     * @param ByteBuffer $_bb\n     * @return Movie\n     **/\n    public function init($_i, ByteBuffer $_bb)\n    {\n        $this->bb_pos = $_i;\n        $this->bb = $_bb;\n        return $this;\n    }\n\n    /**\n     * @return byte\n     */\n    public function getMainCharacterType()\n    {\n        $o = $this->__offset(4);\n        return $o != 0 ? $this->bb->getByte($o + $this->bb_pos) : \\Character::NONE;\n    }\n\n    /**\n     * @returnint\n     */\n    public function getMainCharacter($obj)\n    {\n        $o = $this->__offset(6);\n        return $o != 0 ? $this->__union($obj, $o) : null;\n    }\n\n    /**\n     * @param int offset\n     * @return byte\n     */\n    public function getCharactersType($j)\n    {\n        $o = $this->__offset(8);\n        return $o != 0 ? $this->bb->getByte($this->__vector($o) + $j * 1) : \\Character::NONE;\n    }\n\n    /**\n     * @return int\n     */\n    public function getCharactersTypeLength()\n    {\n        $o = $this->__offset(8);\n        return $o != 0 ? $this->__vector_len($o) : 0;\n    }\n\n    /**\n     * @param int offset\n     * @return Table\n     */\n    public function getCharacters($j, $obj)\n    {\n        $o = $this->__offset(10);\n        return $o != 0 ? $this->__union($obj, $this->__vector($o) + $j * 4 - $this->bb_pos) : null;\n    }\n\n    /**\n     * @return int\n     */\n    public function getCharactersLength()\n    {\n        $o = $this->__offset(10);\n        return $o != 0 ? $this->__vector_len($o) : 0;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return void\n     */\n    public static function startMovie(FlatBufferBuilder $builder)\n    {\n        $builder->StartObject(4);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return Movie\n     */\n    public static function createMovie(FlatBufferBuilder $builder, $main_character_type, $main_character, $characters_type, $characters)\n    {\n        $builder->startObject(4);\n        self::addMainCharacterType($builder, $main_character_type);\n        self::addMainCharacter($builder, $main_character);\n        self::addCharactersType($builder, $characters_type);\n        self::addCharacters($builder, $characters);\n        $o = $builder->endObject();\n        return $o;\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param byte\n     * @return void\n     */\n    public static function addMainCharacterType(FlatBufferBuilder $builder, $mainCharacterType)\n    {\n        $builder->addByteX(0, $mainCharacterType, 0);\n    }\n\n    public static function addMainCharacter(FlatBufferBuilder $builder, $offset)\n    {\n        $builder->addOffsetX(1, $offset, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addCharactersType(FlatBufferBuilder $builder, $charactersType)\n    {\n        $builder->addOffsetX(2, $charactersType, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param array offset array\n     * @return int vector offset\n     */\n    public static function createCharactersTypeVector(FlatBufferBuilder $builder, array $data)\n    {\n        $builder->startVector(1, count($data), 1);\n        for ($i = count($data) - 1; $i >= 0; $i--) {\n            $builder->putByte($data[$i]);\n        }\n        return $builder->endVector();\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int $numElems\n     * @return void\n     */\n    public static function startCharactersTypeVector(FlatBufferBuilder $builder, $numElems)\n    {\n        $builder->startVector(1, $numElems, 1);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param VectorOffset\n     * @return void\n     */\n    public static function addCharacters(FlatBufferBuilder $builder, $characters)\n    {\n        $builder->addOffsetX(3, $characters, 0);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param array offset array\n     * @return int vector offset\n     */\n    public static function createCharactersVector(FlatBufferBuilder $builder, array $data)\n    {\n        $builder->startVector(4, count($data), 4);\n        for ($i = count($data) - 1; $i >= 0; $i--) {\n            $builder->putOffset($data[$i]);\n        }\n        return $builder->endVector();\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @param int $numElems\n     * @return void\n     */\n    public static function startCharactersVector(FlatBufferBuilder $builder, $numElems)\n    {\n        $builder->startVector(4, $numElems, 4);\n    }\n\n    /**\n     * @param FlatBufferBuilder $builder\n     * @return int table offset\n     */\n    public static function endMovie(FlatBufferBuilder $builder)\n    {\n        $o = $builder->endObject();\n        return $o;\n    }\n\n    public static function finishMovieBuffer(FlatBufferBuilder $builder, $offset)\n    {\n        $builder->finish($offset, \"MOVI\");\n    }\n}\n"
  },
  {
    "path": "tests/union_vector/MovieT.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\npublic class MovieT {\n  private CharacterUnion mainCharacter;\n  private CharacterUnion[] characters;\n\n  public CharacterUnion getMainCharacter() { return mainCharacter; }\n\n  public void setMainCharacter(CharacterUnion mainCharacter) { this.mainCharacter = mainCharacter; }\n\n  public CharacterUnion[] getCharacters() { return characters; }\n\n  public void setCharacters(CharacterUnion[] characters) { this.characters = characters; }\n\n\n  public MovieT() {\n    this.mainCharacter = null;\n    this.characters = null;\n  }\n  public static MovieT deserializeFromBinary(byte[] fbBuffer) {\n    return Movie.getRootAsMovie(ByteBuffer.wrap(fbBuffer)).unpack();\n  }\n  public byte[] serializeToBinary() {\n    FlatBufferBuilder fbb = new FlatBufferBuilder();\n    Movie.finishMovieBuffer(fbb, Movie.pack(fbb, this));\n    return fbb.sizedByteArray();\n  }\n}\n\n"
  },
  {
    "path": "tests/union_vector/Rapunzel.cs",
    "content": "// <auto-generated>\n//  automatically generated by the FlatBuffers compiler, do not modify\n// </auto-generated>\n\nusing global::System;\nusing global::System.Collections.Generic;\nusing global::Google.FlatBuffers;\n\npublic struct Rapunzel : IFlatbufferObject\n{\n  private Struct __p;\n  public ByteBuffer ByteBuffer { get { return __p.bb; } }\n  public void __init(int _i, ByteBuffer _bb) { __p = new Struct(_i, _bb); }\n  public Rapunzel __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public int HairLength { get { return __p.bb.GetInt(__p.bb_pos + 0); } }\n  public void MutateHairLength(int hair_length) { __p.bb.PutInt(__p.bb_pos + 0, hair_length); }\n\n  public static Offset<Rapunzel> CreateRapunzel(FlatBufferBuilder builder, int HairLength) {\n    builder.Prep(4, 4);\n    builder.PutInt(HairLength);\n    return new Offset<Rapunzel>(builder.Offset);\n  }\n  public RapunzelT UnPack() {\n    var _o = new RapunzelT();\n    this.UnPackTo(_o);\n    return _o;\n  }\n  public void UnPackTo(RapunzelT _o) {\n    _o.HairLength = this.HairLength;\n  }\n  public static Offset<Rapunzel> Pack(FlatBufferBuilder builder, RapunzelT _o) {\n    if (_o == null) return default(Offset<Rapunzel>);\n    return CreateRapunzel(\n      builder,\n      _o.HairLength);\n  }\n}\n\npublic class RapunzelT\n{\n  [Newtonsoft.Json.JsonProperty(\"hair_length\")]\n  public int HairLength { get; set; }\n\n  public RapunzelT() {\n    this.HairLength = 0;\n  }\n}\n\n"
  },
  {
    "path": "tests/union_vector/Rapunzel.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n@SuppressWarnings(\"unused\")\npublic final class Rapunzel extends Struct {\n  public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }\n  public Rapunzel __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }\n\n  public int hairLength() { return bb.getInt(bb_pos + 0); }\n  public void mutateHairLength(int hair_length) { bb.putInt(bb_pos + 0, hair_length); }\n\n  public static int createRapunzel(FlatBufferBuilder builder, int hairLength) {\n    builder.prep(4, 4);\n    builder.putInt(hairLength);\n    return builder.offset();\n  }\n\n  public static final class Vector extends BaseVector {\n    public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }\n\n    public Rapunzel get(int j) { return get(new Rapunzel(), j); }\n    public Rapunzel get(Rapunzel obj, int j) {  return obj.__assign(__element(j), bb); }\n  }\n  public RapunzelT unpack() {\n    RapunzelT _o = new RapunzelT();\n    unpackTo(_o);\n    return _o;\n  }\n  public void unpackTo(RapunzelT _o) {\n    int _oHairLength = hairLength();\n    _o.setHairLength(_oHairLength);\n  }\n  public static int pack(FlatBufferBuilder builder, RapunzelT _o) {\n    if (_o == null) return 0;\n    return createRapunzel(\n      builder,\n      _o.getHairLength());\n  }\n}\n\n"
  },
  {
    "path": "tests/union_vector/Rapunzel.kt",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\nimport com.google.flatbuffers.BaseVector\nimport com.google.flatbuffers.BooleanVector\nimport com.google.flatbuffers.ByteVector\nimport com.google.flatbuffers.Constants\nimport com.google.flatbuffers.DoubleVector\nimport com.google.flatbuffers.FlatBufferBuilder\nimport com.google.flatbuffers.FloatVector\nimport com.google.flatbuffers.LongVector\nimport com.google.flatbuffers.StringVector\nimport com.google.flatbuffers.Struct\nimport com.google.flatbuffers.Table\nimport com.google.flatbuffers.UnionVector\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\nimport kotlin.math.sign\n\n@Suppress(\"unused\")\nclass Rapunzel : Struct() {\n\n    fun __init(_i: Int, _bb: ByteBuffer)  {\n        __reset(_i, _bb)\n    }\n    fun __assign(_i: Int, _bb: ByteBuffer) : Rapunzel {\n        __init(_i, _bb)\n        return this\n    }\n    val hairLength : Int get() = bb.getInt(bb_pos + 0)\n    fun mutateHairLength(hairLength: Int) : ByteBuffer = bb.putInt(bb_pos + 0, hairLength)\n    companion object {\n        fun createRapunzel(builder: FlatBufferBuilder, hairLength: Int) : Int {\n            builder.prep(4, 4)\n            builder.putInt(hairLength)\n            return builder.offset()\n        }\n    }\n}\n"
  },
  {
    "path": "tests/union_vector/Rapunzel.php",
    "content": "<?php\n// automatically generated by the FlatBuffers compiler, do not modify\n\nuse \\Google\\FlatBuffers\\Struct;\nuse \\Google\\FlatBuffers\\Table;\nuse \\Google\\FlatBuffers\\ByteBuffer;\nuse \\Google\\FlatBuffers\\FlatBufferBuilder;\n\nclass Rapunzel extends Struct\n{\n    /**\n     * @param int $_i offset\n     * @param ByteBuffer $_bb\n     * @return Rapunzel\n     **/\n    public function init($_i, ByteBuffer $_bb)\n    {\n        $this->bb_pos = $_i;\n        $this->bb = $_bb;\n        return $this;\n    }\n\n    /**\n     * @return int\n     */\n    public function GetHairLength()\n    {\n        return $this->bb->getInt($this->bb_pos + 0);\n    }\n\n\n    /**\n     * @return int offset\n     */\n    public static function createRapunzel(FlatBufferBuilder $builder, $hairLength)\n    {\n        $builder->prep(4, 4);\n        $builder->putInt($hairLength);\n        return $builder->offset();\n    }\n}\n"
  },
  {
    "path": "tests/union_vector/RapunzelT.java",
    "content": "// automatically generated by the FlatBuffers compiler, do not modify\n\nimport com.google.flatbuffers.BaseVector;\nimport com.google.flatbuffers.BooleanVector;\nimport com.google.flatbuffers.ByteVector;\nimport com.google.flatbuffers.Constants;\nimport com.google.flatbuffers.DoubleVector;\nimport com.google.flatbuffers.FlatBufferBuilder;\nimport com.google.flatbuffers.FloatVector;\nimport com.google.flatbuffers.IntVector;\nimport com.google.flatbuffers.LongVector;\nimport com.google.flatbuffers.ShortVector;\nimport com.google.flatbuffers.StringVector;\nimport com.google.flatbuffers.Struct;\nimport com.google.flatbuffers.UnionVector;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\npublic class RapunzelT {\n  private int hairLength;\n\n  public int getHairLength() { return hairLength; }\n\n  public void setHairLength(int hairLength) { this.hairLength = hairLength; }\n\n\n  public RapunzelT() {\n    this.hairLength = 0;\n  }\n}\n\n"
  },
  {
    "path": "tests/union_vector/union_vector.fbs",
    "content": "// Demonstrates the ability to have vectors of unions, and also to\n// store structs and strings in unions.\n\ntable Attacker {\n  sword_attack_damage: int;\n}\n\nstruct Rapunzel {\n  hair_length: int;\n}\n\nstruct BookReader {\n  books_read: int;\n}\n\nunion Character {\n  MuLan: Attacker,  // Can have name be different from type.\n  Rapunzel,         // Or just both the same, as before.\n  Belle: BookReader,\n  BookFan: BookReader,\n  Other: string,\n  Unused: string\n}\n\nstruct FallingTub {\n  weight: int;\n}\n\ntable HandFan {\n  length: int;\n}\n\nunion Gadget {\n  FallingTub,\n  HandFan,\n}\n\ntable Movie {\n  main_character: Character;\n  characters: [Character];\n}\n\nroot_type Movie;\nfile_identifier \"MOVI\";\n"
  },
  {
    "path": "tests/union_vector/union_vector.json",
    "content": "{\n  \"main_character_type\": \"Rapunzel\",\n  \"main_character\": {\n    \"hair_length\": 6\n  },\n  \"characters_type\": [\n    \"Belle\",\n    \"MuLan\",\n    \"BookFan\",\n    \"Other\",\n    \"Unused\"\n  ],\n  \"characters\": [\n    {\n      \"books_read\": 7\n    },\n    {\n      \"sword_attack_damage\": 5\n    },\n    {\n      \"books_read\": 2\n    },\n    \"Other\",\n    \"Unused\"\n  ]\n}\n"
  },
  {
    "path": "tests/util_test.cpp",
    "content": "#include \"util_test.h\"\n\n#include \"flatbuffers/util.h\"\n#include \"test_assert.h\"\n\nnamespace flatbuffers {\nnamespace tests {\nnamespace {\n\ntemplate <typename T>\nvoid NumericUtilsTestInteger(const char* lower, const char* upper) {\n  T x;\n  TEST_EQ(flatbuffers::StringToNumber(\"1q\", &x), false);\n  TEST_EQ(x, 0);\n  TEST_EQ(flatbuffers::StringToNumber(upper, &x), false);\n  TEST_EQ(x, flatbuffers::numeric_limits<T>::max());\n  TEST_EQ(flatbuffers::StringToNumber(lower, &x), false);\n  auto expval = flatbuffers::is_unsigned<T>::value\n                    ? flatbuffers::numeric_limits<T>::max()\n                    : flatbuffers::numeric_limits<T>::lowest();\n  TEST_EQ(x, expval);\n}\n\ntemplate <typename T>\nvoid NumericUtilsTestFloat(const char* lower, const char* upper) {\n  T f;\n  TEST_EQ(flatbuffers::StringToNumber(\"\", &f), false);\n  TEST_EQ(flatbuffers::StringToNumber(\"1q\", &f), false);\n  TEST_EQ(f, 0);\n  TEST_EQ(flatbuffers::StringToNumber(upper, &f), true);\n  TEST_EQ(f, +flatbuffers::numeric_limits<T>::infinity());\n  TEST_EQ(flatbuffers::StringToNumber(lower, &f), true);\n  TEST_EQ(f, -flatbuffers::numeric_limits<T>::infinity());\n}\n}  // namespace\n\nvoid NumericUtilsTest() {\n  NumericUtilsTestInteger<uint64_t>(\"-1\", \"18446744073709551616\");\n  NumericUtilsTestInteger<uint8_t>(\"-1\", \"256\");\n  NumericUtilsTestInteger<int64_t>(\"-9223372036854775809\",\n                                   \"9223372036854775808\");\n  NumericUtilsTestInteger<int8_t>(\"-129\", \"128\");\n  NumericUtilsTestFloat<float>(\"-3.4029e+38\", \"+3.4029e+38\");\n  NumericUtilsTestFloat<float>(\"-1.7977e+308\", \"+1.7977e+308\");\n}\n\nvoid IsAsciiUtilsTest() {\n  char c = -128;\n  for (int cnt = 0; cnt < 256; cnt++) {\n    auto alpha = (('a' <= c) && (c <= 'z')) || (('A' <= c) && (c <= 'Z'));\n    auto dec = (('0' <= c) && (c <= '9'));\n    auto hex = (('a' <= c) && (c <= 'f')) || (('A' <= c) && (c <= 'F'));\n    TEST_EQ(flatbuffers::is_alpha(c), alpha);\n    TEST_EQ(flatbuffers::is_alnum(c), alpha || dec);\n    TEST_EQ(flatbuffers::is_digit(c), dec);\n    TEST_EQ(flatbuffers::is_xdigit(c), dec || hex);\n    c += 1;\n  }\n}\n\nvoid UtilConvertCase() {\n  {\n    struct TestCase {\n      std::string input;\n      flatbuffers::Case output_case;\n      std::string expected_output;\n    };\n\n    std::vector<TestCase> cases;\n\n    // Tests for the common cases\n    cases.push_back({\"the_quick_brown_fox\", flatbuffers::Case::kUpperCamel,\n                     \"TheQuickBrownFox\"});\n    cases.push_back({\"the_quick_brown_fox\", flatbuffers::Case::kLowerCamel,\n                     \"theQuickBrownFox\"});\n    cases.push_back({\"the_quick_brown_fox\", flatbuffers::Case::kSnake,\n                     \"the_quick_brown_fox\"});\n    cases.push_back({\"the_quick_brown_fox\", flatbuffers::Case::kScreamingSnake,\n                     \"THE_QUICK_BROWN_FOX\"});\n    cases.push_back({\"the_quick_brown_fox\", flatbuffers::Case::kAllLower,\n                     \"the_quick_brown_fox\"});\n    cases.push_back({\"the_quick_brown_fox\", flatbuffers::Case::kAllUpper,\n                     \"THE_QUICK_BROWN_FOX\"});\n    cases.push_back({\"the_quick_brown_fox\", flatbuffers::Case::kUnknown,\n                     \"the_quick_brown_fox\"});\n    cases.push_back({\"the_quick_brown_fox\", flatbuffers::Case::kKeep,\n                     \"the_quick_brown_fox\"});\n    cases.push_back({\"the_quick_brown_fox\", flatbuffers::Case::kSnake2,\n                     \"the_quick_brown_fox\"});\n\n    // Tests for some snake_cases where the _ is oddly placed or\n    // missing.\n    cases.push_back({\"single\", flatbuffers::Case::kUpperCamel, \"Single\"});\n    cases.push_back({\"Single\", flatbuffers::Case::kUpperCamel, \"Single\"});\n    cases.push_back({\"_leading\", flatbuffers::Case::kUpperCamel, \"_Leading\"});\n    cases.push_back({\"trailing_\", flatbuffers::Case::kUpperCamel, \"Trailing_\"});\n    cases.push_back({\"double__underscore\", flatbuffers::Case::kUpperCamel,\n                     \"Double_underscore\"});\n    cases.push_back({\"single\", flatbuffers::Case::kLowerCamel, \"single\"});\n    cases.push_back({\"Single\", flatbuffers::Case::kLowerCamel, \"single\"});\n    cases.push_back({\"_leading\", flatbuffers::Case::kLowerCamel, \"_Leading\"});\n    cases.push_back({\"trailing_\", flatbuffers::Case::kLowerCamel, \"trailing_\"});\n    cases.push_back({\"double__underscore\", flatbuffers::Case::kLowerCamel,\n                     \"double_underscore\"});\n\n    // Tests for some output snake_cases\n    cases.push_back({\"single\", flatbuffers::Case::kSnake, \"single\"});\n    cases.push_back({\"single\", flatbuffers::Case::kScreamingSnake, \"SINGLE\"});\n    cases.push_back(\n        {\"_leading\", flatbuffers::Case::kScreamingSnake, \"_LEADING\"});\n    cases.push_back(\n        {\"trailing_\", flatbuffers::Case::kScreamingSnake, \"TRAILING_\"});\n    cases.push_back({\"double__underscore\", flatbuffers::Case::kScreamingSnake,\n                     \"DOUBLE__UNDERSCORE\"});\n\n    for (auto& test_case : cases) {\n      TEST_EQ(test_case.expected_output,\n              flatbuffers::ConvertCase(test_case.input, test_case.output_case));\n    }\n  }\n\n  // Tests for the non snake_case inputs.\n  {\n    struct TestCase {\n      flatbuffers::Case input_case;\n      std::string input;\n      flatbuffers::Case output_case;\n      std::string expected_output;\n    };\n\n    std::vector<TestCase> cases;\n\n    cases.push_back({flatbuffers::Case::kUpperCamel, \"TheQuickBrownFox\",\n                     flatbuffers::Case::kSnake, \"the_quick_brown_fox\"});\n    cases.push_back({flatbuffers::Case::kLowerCamel, \"theQuickBrownFox\",\n                     flatbuffers::Case::kSnake, \"the_quick_brown_fox\"});\n    cases.push_back({flatbuffers::Case::kSnake, \"the_quick_brown_fox\",\n                     flatbuffers::Case::kSnake, \"the_quick_brown_fox\"});\n    cases.push_back({flatbuffers::Case::kScreamingSnake, \"THE_QUICK_BROWN_FOX\",\n                     flatbuffers::Case::kSnake, \"THE_QUICK_BROWN_FOX\"});\n    cases.push_back({flatbuffers::Case::kAllUpper, \"SINGLE\",\n                     flatbuffers::Case::kSnake, \"SINGLE\"});\n    cases.push_back({flatbuffers::Case::kAllLower, \"single\",\n                     flatbuffers::Case::kSnake, \"single\"});\n    cases.push_back({flatbuffers::Case::kUpperCamel, \"ABCtest\",\n                     flatbuffers::Case::kSnake, \"abctest\"});\n    cases.push_back({flatbuffers::Case::kUpperCamel, \"tHe_qUiCk_BrOwN_fOx\",\n                     flatbuffers::Case::kKeep, \"tHe_qUiCk_BrOwN_fOx\"});\n    cases.push_back({flatbuffers::Case::kLowerCamel, \"theQuick12345Fox\",\n                     flatbuffers::Case::kSnake, \"the_quick_12345_fox\"});\n    cases.push_back({flatbuffers::Case::kLowerCamel, \"a12b34c45\",\n                     flatbuffers::Case::kSnake, \"a_12b_34c_45\"});\n    cases.push_back({flatbuffers::Case::kLowerCamel, \"a12b34c45\",\n                     flatbuffers::Case::kSnake2, \"a12_b34_c45\"});\n    cases.push_back({flatbuffers::Case::kUpperCamel, \"Int32Stamped\",\n                     flatbuffers::Case::kSnake, \"int_32_stamped\"});\n    cases.push_back({flatbuffers::Case::kUpperCamel, \"101DogsTest\",\n                     flatbuffers::Case::kSnake, \"101_dogs_test\"});\n    cases.push_back({flatbuffers::Case::kUpperCamel, \"Int32Stamped\",\n                     flatbuffers::Case::kScreamingSnake, \"INT_32_STAMPED\"});\n    cases.push_back({flatbuffers::Case::kUpperCamel, \"101DogsTest\",\n                     flatbuffers::Case::kScreamingSnake, \"101_DOGS_TEST\"});\n\n    for (auto& test_case : cases) {\n      TEST_EQ(test_case.expected_output,\n              flatbuffers::ConvertCase(test_case.input, test_case.output_case,\n                                       test_case.input_case));\n    }\n  }\n}\n\n}  // namespace tests\n}  // namespace flatbuffers\n"
  },
  {
    "path": "tests/util_test.h",
    "content": "#ifndef TESTS_UTIL_TEST_H\n#define TESTS_UTIL_TEST_H\n\nnamespace flatbuffers {\nnamespace tests {\n\nvoid NumericUtilsTest();\nvoid IsAsciiUtilsTest();\nvoid UtilConvertCase();\n\n}  // namespace tests\n}  // namespace flatbuffers\n\n#endif\n"
  },
  {
    "path": "tests/vector_has_test.fbs",
    "content": "namespace Swift.Tests;\n\ntable Vectors\n{\n  none:[ulong];\n  empty:[ulong];\n  array:[ulong];\n}\n\nroot_type Vectors;\n"
  },
  {
    "path": "tests/vector_table_naked_ptr.fbs",
    "content": "table B {\n  id: int32;\n}\n\ntable A {\n  b: [B];\n}\n\nroot_type A;\n"
  },
  {
    "path": "tests/vector_table_naked_ptr_test.cpp",
    "content": "#include \"vector_table_naked_ptr_test.h\"\n\n#include \"test_assert.h\"\n#include \"vector_table_naked_ptr/vector_table_naked_ptr_generated.h\"\n\nnamespace flatbuffers {\nnamespace tests {\n\nvoid VectorTableNakedPtrTest() {\n  // ---------------------------------------\n  // 1) Build original native objects\n  // ---------------------------------------\n  auto* b1 = new BT();\n  auto* b2 = new BT();\n  b1->id = 777;\n  b2->id = 888;\n\n  AT a_src;\n  a_src.b.push_back(b1);\n  a_src.b.push_back(b2);\n\n  // ---------------------------------------\n  // 2) Pack into FlatBuffer\n  // ---------------------------------------\n  flatbuffers::FlatBufferBuilder fbb;\n  auto a_offset = A::Pack(fbb, &a_src);\n  FinishABuffer(fbb, a_offset);\n\n  const void* buf = fbb.GetBufferPointer();\n  const A* a_fb = GetA(buf);\n\n  // ---------------------------------------\n  // 3) Pre-allocate destination with garbage\n  // ---------------------------------------\n  AT a_dst;\n\n  // Pre-fill with wrong pointers to ensure UnPackTo overwrites correctly\n  a_dst.b.resize(2);\n  a_dst.b[0] = new BT();\n  a_dst.b[1] = new BT();\n  a_dst.b[0]->id = -1;\n  a_dst.b[1]->id = -1;\n\n  // ---------------------------------------\n  // 4) Call the function under test: UnPackTo\n  // ---------------------------------------\n  a_fb->UnPackTo(&a_dst, nullptr);\n\n  // ---------------------------------------\n  // 5) Validate overwrite + deep copy\n  // ---------------------------------------\n  TEST_ASSERT(a_dst.b.size() == 2);\n\n  TEST_ASSERT(a_dst.b[0] != nullptr);\n  TEST_ASSERT(a_dst.b[1] != nullptr);\n\n  TEST_ASSERT(a_dst.b[0]->id == 777);\n  TEST_ASSERT(a_dst.b[1]->id == 888);\n\n  // Ensure original pointers were not reused\n  TEST_ASSERT(a_dst.b[0] != b1);\n  TEST_ASSERT(a_dst.b[1] != b2);\n\n  // ---------------------------------------\n  // 6) Clean up ownership\n  // ---------------------------------------\n  delete a_dst.b[0];\n  delete a_dst.b[1];\n\n  delete b1;\n  delete b2;\n}\n\n}  // namespace tests\n}  // namespace flatbuffers\n"
  },
  {
    "path": "tests/vector_table_naked_ptr_test.h",
    "content": "#ifndef VECTOR_TABLE_NAKED_PTR_TEST_H\n#define VECTOR_TABLE_NAKED_PTR_TEST_H\n\n#include <string>\n\nnamespace flatbuffers {\nnamespace tests {\n\nvoid VectorTableNakedPtrTest();\n\n}  // namespace tests\n}  // namespace flatbuffers\n\n#endif\n"
  },
  {
    "path": "ts/BUILD.bazel",
    "content": "load(\"@aspect_rules_js//npm:defs.bzl\", \"npm_package\")\nload(\"@aspect_rules_ts//ts:defs.bzl\", \"ts_project\")\nload(\"@flatbuffers_npm//:defs.bzl\", \"npm_link_all_packages\")\nload(\"@rules_shell//shell:sh_binary.bzl\", \"sh_binary\")\n\nfilegroup(\n    name = \"distribution\",\n    srcs = [\n        \"BUILD.bazel\",\n        \"compile_flat_file.sh\",\n        \"pnpm-lock.yaml\",\n    ] + glob([\n        \"*.ts\",\n    ]),\n    visibility = [\"//visibility:public\"],\n)\n\nnpm_link_all_packages(name = \"node_modules\")\n\n# Add an index to emulate the top-level package.json's \"main\" entry.\ngenrule(\n    name = \"generate_index.ts\",\n    outs = [\"index.ts\"],\n    cmd = \"\"\"echo \"export * from './flatbuffers.js'\" > $(OUTS)\"\"\",\n)\n\nts_project(\n    name = \"flatbuffers_ts\",\n    srcs = [\n        \"builder.ts\",\n        \"byte-buffer.ts\",\n        \"constants.ts\",\n        \"encoding.ts\",\n        \"flatbuffers.ts\",\n        \"types.ts\",\n        \"utils.ts\",\n        \":index.ts\",\n    ],\n    declaration = True,\n    tsconfig = {\n        \"compilerOptions\": {\n            \"module\": \"commonjs\",\n            \"declaration\": True,\n            \"moduleResolution\": \"node\",\n            \"lib\": [\n                \"ES2015\",\n                \"ES2020.BigInt\",\n                \"DOM\",\n            ],\n            \"types\": [\"node\"],\n            \"strict\": True,\n        },\n    },\n    visibility = [\"//visibility:public\"],\n    deps = [\n        \":node_modules/@types/node\",\n    ],\n)\n\nnpm_package(\n    name = \"flatbuffers\",\n    srcs = [\":flatbuffers_ts\"],\n    include_external_repositories = [\"*\"],\n    package = \"flatbuffers\",\n    visibility = [\"//visibility:public\"],\n)\n\nsh_binary(\n    name = \"compile_flat_file\",\n    srcs = [\"compile_flat_file.sh\"],\n    data = [\n        \"//:flatc\",\n        \"@nodejs_linux_amd64//:node_bin\",\n    ],\n    # We just depend directly on the linux amd64 nodejs binary, so only support\n    # running this script on amd64 for now.\n    target_compatible_with = [\n        \"@platforms//cpu:x86_64\",\n        \"@platforms//os:linux\",\n    ],\n    visibility = [\"//visibility:public\"],\n    deps = [\"@bazel_tools//tools/bash/runfiles\"],\n)\n"
  },
  {
    "path": "ts/builder.ts",
    "content": "import {ByteBuffer} from './byte-buffer.js';\nimport {\n  FILE_IDENTIFIER_LENGTH,\n  SIZE_PREFIX_LENGTH,\n  SIZEOF_INT,\n  SIZEOF_SHORT,\n} from './constants.js';\nimport {IGeneratedObject, Offset} from './types.js';\n\nexport class Builder {\n  private bb: ByteBuffer;\n  /** Remaining space in the ByteBuffer. */\n  private space: number;\n  /** Minimum alignment encountered so far. */\n  private minalign = 1;\n  /** The vtable for the current table. */\n  private vtable: number[] | null = null;\n  /** The amount of fields we're actually using. */\n  private vtable_in_use = 0;\n  /** Whether we are currently serializing a table. */\n  private isNested = false;\n  /** Starting offset of the current struct/table. */\n  private object_start = 0;\n  /** List of offsets of all vtables. */\n  private vtables: number[] = [];\n  /** For the current vector being built. */\n  private vector_num_elems = 0;\n  /** False omits default values from the serialized data */\n  private force_defaults = false;\n\n  private string_maps: Map<string | Uint8Array, number> | null = null;\n  private text_encoder = new TextEncoder();\n\n  /**\n   * Create a FlatBufferBuilder.\n   */\n  constructor(opt_initial_size?: number) {\n    let initial_size: number;\n\n    if (!opt_initial_size) {\n      initial_size = 1024;\n    } else {\n      initial_size = opt_initial_size;\n    }\n\n    /**\n     * @type {ByteBuffer}\n     * @private\n     */\n    this.bb = ByteBuffer.allocate(initial_size);\n    this.space = initial_size;\n  }\n\n  clear(): void {\n    this.bb.clear();\n    this.space = this.bb.capacity();\n    this.minalign = 1;\n    this.vtable = null;\n    this.vtable_in_use = 0;\n    this.isNested = false;\n    this.object_start = 0;\n    this.vtables = [];\n    this.vector_num_elems = 0;\n    this.force_defaults = false;\n    this.string_maps = null;\n  }\n\n  /**\n   * In order to save space, fields that are set to their default value\n   * don't get serialized into the buffer. Forcing defaults provides a\n   * way to manually disable this optimization.\n   *\n   * @param forceDefaults true always serializes default values\n   */\n  forceDefaults(forceDefaults: boolean): void {\n    this.force_defaults = forceDefaults;\n  }\n\n  /**\n   * Get the ByteBuffer representing the FlatBuffer. Only call this after you've\n   * called finish(). The actual data starts at the ByteBuffer's current position,\n   * not necessarily at 0.\n   */\n  dataBuffer(): ByteBuffer {\n    return this.bb;\n  }\n\n  /**\n   * Get the bytes representing the FlatBuffer. Only call this after you've\n   * called finish().\n   */\n  asUint8Array(): Uint8Array {\n    return this.bb\n      .bytes()\n      .subarray(this.bb.position(), this.bb.position() + this.offset());\n  }\n\n  /**\n   * Prepare to write an element of `size` after `additional_bytes` have been\n   * written, e.g. if you write a string, you need to align such the int length\n   * field is aligned to 4 bytes, and the string data follows it directly. If all\n   * you need to do is alignment, `additional_bytes` will be 0.\n   *\n   * @param size This is the of the new element to write\n   * @param additional_bytes The padding size\n   */\n  prep(size: number, additional_bytes: number): void {\n    // Track the biggest thing we've ever aligned to.\n    if (size > this.minalign) {\n      this.minalign = size;\n    }\n\n    // Find the amount of alignment needed such that `size` is properly\n    // aligned after `additional_bytes`\n    const align_size =\n      (~(this.bb.capacity() - this.space + additional_bytes) + 1) & (size - 1);\n\n    // Reallocate the buffer if needed.\n    while (this.space < align_size + size + additional_bytes) {\n      const old_buf_size = this.bb.capacity();\n      this.bb = Builder.growByteBuffer(this.bb);\n      this.space += this.bb.capacity() - old_buf_size;\n    }\n\n    this.pad(align_size);\n  }\n\n  pad(byte_size: number): void {\n    for (let i = 0; i < byte_size; i++) {\n      this.bb.writeInt8(--this.space, 0);\n    }\n  }\n\n  writeInt8(value: number): void {\n    this.bb.writeInt8((this.space -= 1), value);\n  }\n\n  writeInt16(value: number): void {\n    this.bb.writeInt16((this.space -= 2), value);\n  }\n\n  writeInt32(value: number): void {\n    this.bb.writeInt32((this.space -= 4), value);\n  }\n\n  writeInt64(value: bigint): void {\n    this.bb.writeInt64((this.space -= 8), value);\n  }\n\n  writeFloat32(value: number): void {\n    this.bb.writeFloat32((this.space -= 4), value);\n  }\n\n  writeFloat64(value: number): void {\n    this.bb.writeFloat64((this.space -= 8), value);\n  }\n\n  /**\n   * Add an `int8` to the buffer, properly aligned, and grows the buffer (if necessary).\n   * @param value The `int8` to add the buffer.\n   */\n  addInt8(value: number): void {\n    this.prep(1, 0);\n    this.writeInt8(value);\n  }\n\n  /**\n   * Add an `int16` to the buffer, properly aligned, and grows the buffer (if necessary).\n   * @param value The `int16` to add the buffer.\n   */\n  addInt16(value: number): void {\n    this.prep(2, 0);\n    this.writeInt16(value);\n  }\n\n  /**\n   * Add an `int32` to the buffer, properly aligned, and grows the buffer (if necessary).\n   * @param value The `int32` to add the buffer.\n   */\n  addInt32(value: number): void {\n    this.prep(4, 0);\n    this.writeInt32(value);\n  }\n\n  /**\n   * Add an `int64` to the buffer, properly aligned, and grows the buffer (if necessary).\n   * @param value The `int64` to add the buffer.\n   */\n  addInt64(value: bigint): void {\n    this.prep(8, 0);\n    this.writeInt64(value);\n  }\n\n  /**\n   * Add a `float32` to the buffer, properly aligned, and grows the buffer (if necessary).\n   * @param value The `float32` to add the buffer.\n   */\n  addFloat32(value: number): void {\n    this.prep(4, 0);\n    this.writeFloat32(value);\n  }\n\n  /**\n   * Add a `float64` to the buffer, properly aligned, and grows the buffer (if necessary).\n   * @param value The `float64` to add the buffer.\n   */\n  addFloat64(value: number): void {\n    this.prep(8, 0);\n    this.writeFloat64(value);\n  }\n\n  addFieldInt8(\n    voffset: number,\n    value: number,\n    defaultValue: number | null | undefined,\n  ): void {\n    if (this.force_defaults || value != defaultValue) {\n      this.addInt8(value);\n      this.slot(voffset);\n    }\n  }\n\n  addFieldInt16(\n    voffset: number,\n    value: number,\n    defaultValue: number | null | undefined,\n  ): void {\n    if (this.force_defaults || value != defaultValue) {\n      this.addInt16(value);\n      this.slot(voffset);\n    }\n  }\n\n  addFieldInt32(\n    voffset: number,\n    value: number,\n    defaultValue: number | null | undefined,\n  ): void {\n    if (this.force_defaults || value != defaultValue) {\n      this.addInt32(value);\n      this.slot(voffset);\n    }\n  }\n\n  addFieldInt64(\n    voffset: number,\n    value: bigint,\n    defaultValue: bigint | null | undefined,\n  ): void {\n    if (this.force_defaults || value !== defaultValue) {\n      this.addInt64(value);\n      this.slot(voffset);\n    }\n  }\n\n  addFieldFloat32(\n    voffset: number,\n    value: number,\n    defaultValue: number | null | undefined,\n  ): void {\n    if (this.force_defaults || value != defaultValue) {\n      this.addFloat32(value);\n      this.slot(voffset);\n    }\n  }\n\n  addFieldFloat64(\n    voffset: number,\n    value: number,\n    defaultValue: number | null | undefined,\n  ): void {\n    if (this.force_defaults || value != defaultValue) {\n      this.addFloat64(value);\n      this.slot(voffset);\n    }\n  }\n\n  addFieldOffset(voffset: number, value: Offset, defaultValue: Offset): void {\n    if (this.force_defaults || value != defaultValue) {\n      this.addOffset(value);\n      this.slot(voffset);\n    }\n  }\n\n  /**\n   * Structs are stored inline, so nothing additional is being added. `d` is always 0.\n   */\n  addFieldStruct(voffset: number, value: Offset, defaultValue: Offset): void {\n    if (value != defaultValue) {\n      this.nested(value);\n      this.slot(voffset);\n    }\n  }\n\n  /**\n   * Structures are always stored inline, they need to be created right\n   * where they're used.  You'll get this assertion failure if you\n   * created it elsewhere.\n   */\n  nested(obj: Offset): void {\n    if (obj != this.offset()) {\n      throw new TypeError('FlatBuffers: struct must be serialized inline.');\n    }\n  }\n\n  /**\n   * Should not be creating any other object, string or vector\n   * while an object is being constructed\n   */\n  notNested(): void {\n    if (this.isNested) {\n      throw new TypeError(\n        'FlatBuffers: object serialization must not be nested.',\n      );\n    }\n  }\n\n  /**\n   * Set the current vtable at `voffset` to the current location in the buffer.\n   */\n  slot(voffset: number): void {\n    if (this.vtable !== null) this.vtable[voffset] = this.offset();\n  }\n\n  /**\n   * @returns Offset relative to the end of the buffer.\n   */\n  offset(): Offset {\n    return this.bb.capacity() - this.space;\n  }\n\n  /**\n   * Doubles the size of the backing ByteBuffer and copies the old data towards\n   * the end of the new buffer (since we build the buffer backwards).\n   *\n   * @param bb The current buffer with the existing data\n   * @returns A new byte buffer with the old data copied\n   * to it. The data is located at the end of the buffer.\n   *\n   * uint8Array.set() formally takes {Array<number>|ArrayBufferView}, so to pass\n   * it a uint8Array we need to suppress the type check:\n   * @suppress {checkTypes}\n   */\n  static growByteBuffer(bb: ByteBuffer): ByteBuffer {\n    const old_buf_size = bb.capacity();\n\n    // Ensure we don't grow beyond what fits in an int.\n    if (old_buf_size & 0xc0000000) {\n      throw new Error('FlatBuffers: cannot grow buffer beyond 2 gigabytes.');\n    }\n\n    const new_buf_size = old_buf_size << 1;\n    const nbb = ByteBuffer.allocate(new_buf_size);\n    nbb.setPosition(new_buf_size - old_buf_size);\n    nbb.bytes().set(bb.bytes(), new_buf_size - old_buf_size);\n    return nbb;\n  }\n\n  /**\n   * Adds on offset, relative to where it will be written.\n   *\n   * @param offset The offset to add.\n   */\n  addOffset(offset: Offset): void {\n    this.prep(SIZEOF_INT, 0); // Ensure alignment is already done.\n    this.writeInt32(this.offset() - offset + SIZEOF_INT);\n  }\n\n  /**\n   * Start encoding a new object in the buffer.  Users will not usually need to\n   * call this directly. The FlatBuffers compiler will generate helper methods\n   * that call this method internally.\n   */\n  startObject(numfields: number): void {\n    this.notNested();\n    if (this.vtable == null) {\n      this.vtable = [];\n    }\n    this.vtable_in_use = numfields;\n    for (let i = 0; i < numfields; i++) {\n      this.vtable[i] = 0; // This will push additional elements as needed\n    }\n    this.isNested = true;\n    this.object_start = this.offset();\n  }\n\n  /**\n   * Finish off writing the object that is under construction.\n   *\n   * @returns The offset to the object inside `dataBuffer`\n   */\n  endObject(): Offset {\n    if (this.vtable == null || !this.isNested) {\n      throw new Error('FlatBuffers: endObject called without startObject');\n    }\n\n    this.addInt32(0);\n    const vtableloc = this.offset();\n\n    // Trim trailing zeroes.\n    let i = this.vtable_in_use - 1;\n    // eslint-disable-next-line no-empty\n    for (; i >= 0 && this.vtable[i] == 0; i--) {}\n    const trimmed_size = i + 1;\n\n    // Write out the current vtable.\n    for (; i >= 0; i--) {\n      // Offset relative to the start of the table.\n      this.addInt16(this.vtable[i] != 0 ? vtableloc - this.vtable[i] : 0);\n    }\n\n    const standard_fields = 2; // The fields below:\n    this.addInt16(vtableloc - this.object_start);\n    const len = (trimmed_size + standard_fields) * SIZEOF_SHORT;\n    this.addInt16(len);\n\n    // Search for an existing vtable that matches the current one.\n    let existing_vtable = 0;\n    const vt1 = this.space;\n    outer_loop: for (i = 0; i < this.vtables.length; i++) {\n      const vt2 = this.bb.capacity() - this.vtables[i];\n      if (len == this.bb.readInt16(vt2)) {\n        for (let j = SIZEOF_SHORT; j < len; j += SIZEOF_SHORT) {\n          if (this.bb.readInt16(vt1 + j) != this.bb.readInt16(vt2 + j)) {\n            continue outer_loop;\n          }\n        }\n        existing_vtable = this.vtables[i];\n        break;\n      }\n    }\n\n    if (existing_vtable) {\n      // Found a match:\n      // Remove the current vtable.\n      this.space = this.bb.capacity() - vtableloc;\n\n      // Point table to existing vtable.\n      this.bb.writeInt32(this.space, existing_vtable - vtableloc);\n    } else {\n      // No match:\n      // Add the location of the current vtable to the list of vtables.\n      this.vtables.push(this.offset());\n\n      // Point table to current vtable.\n      this.bb.writeInt32(\n        this.bb.capacity() - vtableloc,\n        this.offset() - vtableloc,\n      );\n    }\n\n    this.isNested = false;\n    return vtableloc as Offset;\n  }\n\n  /**\n   * Finalize a buffer, poiting to the given `root_table`.\n   */\n  finish(\n    root_table: Offset,\n    opt_file_identifier?: string,\n    opt_size_prefix?: boolean,\n  ): void {\n    const size_prefix = opt_size_prefix ? SIZE_PREFIX_LENGTH : 0;\n    if (opt_file_identifier) {\n      const file_identifier = opt_file_identifier;\n      this.prep(\n        this.minalign,\n        SIZEOF_INT + FILE_IDENTIFIER_LENGTH + size_prefix,\n      );\n      if (file_identifier.length != FILE_IDENTIFIER_LENGTH) {\n        throw new TypeError(\n          'FlatBuffers: file identifier must be length ' +\n            FILE_IDENTIFIER_LENGTH,\n        );\n      }\n      for (let i = FILE_IDENTIFIER_LENGTH - 1; i >= 0; i--) {\n        this.writeInt8(file_identifier.charCodeAt(i));\n      }\n    }\n    this.prep(this.minalign, SIZEOF_INT + size_prefix);\n    this.addOffset(root_table);\n    if (size_prefix) {\n      this.addInt32(this.bb.capacity() - this.space);\n    }\n    this.bb.setPosition(this.space);\n  }\n\n  /**\n   * Finalize a size prefixed buffer, pointing to the given `root_table`.\n   */\n  finishSizePrefixed(\n    this: Builder,\n    root_table: Offset,\n    opt_file_identifier?: string,\n  ): void {\n    this.finish(root_table, opt_file_identifier, true);\n  }\n\n  /**\n   * This checks a required field has been set in a given table that has\n   * just been constructed.\n   */\n  requiredField(table: Offset, field: number): void {\n    const table_start = this.bb.capacity() - table;\n    const vtable_start = table_start - this.bb.readInt32(table_start);\n    const ok =\n      field < this.bb.readInt16(vtable_start) &&\n      this.bb.readInt16(vtable_start + field) != 0;\n\n    // If this fails, the caller will show what field needs to be set.\n    if (!ok) {\n      throw new TypeError('FlatBuffers: field ' + field + ' must be set');\n    }\n  }\n\n  /**\n   * Start a new array/vector of objects.  Users usually will not call\n   * this directly. The FlatBuffers compiler will create a start/end\n   * method for vector types in generated code.\n   *\n   * @param elem_size The size of each element in the array\n   * @param num_elems The number of elements in the array\n   * @param alignment The alignment of the array\n   */\n  startVector(elem_size: number, num_elems: number, alignment: number): void {\n    this.notNested();\n    this.vector_num_elems = num_elems;\n    this.prep(SIZEOF_INT, elem_size * num_elems);\n    this.prep(alignment, elem_size * num_elems); // Just in case alignment > int.\n  }\n\n  /**\n   * Finish off the creation of an array and all its elements. The array must be\n   * created with `startVector`.\n   *\n   * @returns The offset at which the newly created array\n   * starts.\n   */\n  endVector(): Offset {\n    this.writeInt32(this.vector_num_elems);\n    return this.offset();\n  }\n\n  /**\n   * Encode the string `s` in the buffer using UTF-8. If the string passed has\n   * already been seen, we return the offset of the already written string\n   *\n   * @param s The string to encode\n   * @return The offset in the buffer where the encoded string starts\n   */\n  createSharedString(s: string | Uint8Array): Offset {\n    if (!s) {\n      return 0;\n    }\n\n    if (!this.string_maps) {\n      this.string_maps = new Map();\n    }\n\n    if (this.string_maps.has(s)) {\n      return this.string_maps.get(s) as Offset;\n    }\n    const offset = this.createString(s);\n    this.string_maps.set(s, offset);\n    return offset;\n  }\n\n  /**\n   * Encode the string `s` in the buffer using UTF-8. If a Uint8Array is passed\n   * instead of a string, it is assumed to contain valid UTF-8 encoded data.\n   *\n   * @param s The string to encode\n   * @return The offset in the buffer where the encoded string starts\n   */\n  createString(s: string | Uint8Array | null | undefined): Offset {\n    if (s === null || s === undefined) {\n      return 0;\n    }\n\n    let utf8: string | Uint8Array | number[];\n    if (s instanceof Uint8Array) {\n      utf8 = s;\n    } else {\n      utf8 = this.text_encoder.encode(s);\n    }\n\n    this.addInt8(0);\n    this.startVector(1, utf8.length, 1);\n    this.bb.setPosition((this.space -= utf8.length));\n    this.bb.bytes().set(utf8, this.space);\n    return this.endVector();\n  }\n\n  /**\n   * Create a byte vector.\n   *\n   * @param v The bytes to add\n   * @returns The offset in the buffer where the byte vector starts\n   */\n  createByteVector(v: Uint8Array | null | undefined): Offset {\n    if (v === null || v === undefined) {\n      return 0;\n    }\n\n    this.startVector(1, v.length, 1);\n    this.bb.setPosition((this.space -= v.length));\n    this.bb.bytes().set(v, this.space);\n    return this.endVector();\n  }\n\n  /**\n   * A helper function to pack an object\n   *\n   * @returns offset of obj\n   */\n  createObjectOffset(obj: string | IGeneratedObject | null | undefined): Offset {\n    if (obj === null || obj === undefined) {\n      return 0;\n    }\n\n    if (typeof obj === 'string') {\n      return this.createString(obj);\n    } else {\n      return obj.pack(this);\n    }\n  }\n\n  /**\n   * A helper function to pack a list of object\n   *\n   * @returns list of offsets of each non null/undefined object\n   */\n  createObjectOffsetList(list: (string | IGeneratedObject)[]): Offset[] {\n    const ret: number[] = [];\n\n    for (let i = 0; i < list.length; ++i) {\n      const val = list[i];\n\n      if (val !== null && val !== undefined) {\n        ret.push(this.createObjectOffset(val));\n      } else {\n        throw new TypeError(\n          'FlatBuffers: Argument for createObjectOffsetList cannot contain null or undefined.',\n        );\n      }\n    }\n\n    return ret;\n  }\n\n  createStructOffsetList(\n    list: (string | IGeneratedObject)[],\n    startFunc: (builder: Builder, length: number) => void,\n  ): Offset {\n    startFunc(this, list.length);\n    this.createObjectOffsetList(list.slice().reverse());\n    return this.endVector();\n  }\n}\n"
  },
  {
    "path": "ts/byte-buffer.ts",
    "content": "import {FILE_IDENTIFIER_LENGTH, SIZEOF_INT} from './constants.js';\nimport {Encoding} from './encoding.js';\nimport {IGeneratedObject, IUnpackableObject, Offset, Table} from './types.js';\nimport {float32, float64, int32, isLittleEndian} from './utils.js';\n\nexport class ByteBuffer {\n  private position_ = 0;\n  private text_decoder_ = new TextDecoder();\n\n  /**\n   * Create a new ByteBuffer with a given array of bytes (`Uint8Array`)\n   */\n  constructor(private bytes_: Uint8Array) {}\n\n  /**\n   * Create and allocate a new ByteBuffer with a given size.\n   */\n  static allocate(byte_size: number): ByteBuffer {\n    return new ByteBuffer(new Uint8Array(byte_size));\n  }\n\n  clear(): void {\n    this.position_ = 0;\n  }\n\n  /**\n   * Get the underlying `Uint8Array`.\n   */\n  bytes(): Uint8Array {\n    return this.bytes_;\n  }\n\n  /**\n   * Get the buffer's position.\n   */\n  position(): number {\n    return this.position_;\n  }\n\n  /**\n   * Set the buffer's position.\n   */\n  setPosition(position: number): void {\n    this.position_ = position;\n  }\n\n  /**\n   * Get the buffer's capacity.\n   */\n  capacity(): number {\n    return this.bytes_.length;\n  }\n\n  readInt8(offset: number): number {\n    return (this.readUint8(offset) << 24) >> 24;\n  }\n\n  readUint8(offset: number): number {\n    return this.bytes_[offset];\n  }\n\n  readInt16(offset: number): number {\n    return (this.readUint16(offset) << 16) >> 16;\n  }\n\n  readUint16(offset: number): number {\n    return this.bytes_[offset] | (this.bytes_[offset + 1] << 8);\n  }\n\n  readInt32(offset: number): number {\n    return (\n      this.bytes_[offset] |\n      (this.bytes_[offset + 1] << 8) |\n      (this.bytes_[offset + 2] << 16) |\n      (this.bytes_[offset + 3] << 24)\n    );\n  }\n\n  readUint32(offset: number): number {\n    return this.readInt32(offset) >>> 0;\n  }\n\n  readInt64(offset: number): bigint {\n    return BigInt.asIntN(\n      64,\n      BigInt(this.readUint32(offset)) +\n        (BigInt(this.readUint32(offset + 4)) << BigInt(32)),\n    );\n  }\n\n  readUint64(offset: number): bigint {\n    return BigInt.asUintN(\n      64,\n      BigInt(this.readUint32(offset)) +\n        (BigInt(this.readUint32(offset + 4)) << BigInt(32)),\n    );\n  }\n\n  readFloat32(offset: number): number {\n    int32[0] = this.readInt32(offset);\n    return float32[0];\n  }\n\n  readFloat64(offset: number): number {\n    int32[isLittleEndian ? 0 : 1] = this.readInt32(offset);\n    int32[isLittleEndian ? 1 : 0] = this.readInt32(offset + 4);\n    return float64[0];\n  }\n\n  writeInt8(offset: number, value: number): void {\n    this.bytes_[offset] = value;\n  }\n\n  writeUint8(offset: number, value: number): void {\n    this.bytes_[offset] = value;\n  }\n\n  writeInt16(offset: number, value: number): void {\n    this.bytes_[offset] = value;\n    this.bytes_[offset + 1] = value >> 8;\n  }\n\n  writeUint16(offset: number, value: number): void {\n    this.bytes_[offset] = value;\n    this.bytes_[offset + 1] = value >> 8;\n  }\n\n  writeInt32(offset: number, value: number): void {\n    this.bytes_[offset] = value;\n    this.bytes_[offset + 1] = value >> 8;\n    this.bytes_[offset + 2] = value >> 16;\n    this.bytes_[offset + 3] = value >> 24;\n  }\n\n  writeUint32(offset: number, value: number): void {\n    this.bytes_[offset] = value;\n    this.bytes_[offset + 1] = value >> 8;\n    this.bytes_[offset + 2] = value >> 16;\n    this.bytes_[offset + 3] = value >> 24;\n  }\n\n  writeInt64(offset: number, value: bigint): void {\n    this.writeInt32(offset, Number(BigInt.asIntN(32, value)));\n    this.writeInt32(offset + 4, Number(BigInt.asIntN(32, value >> BigInt(32))));\n  }\n\n  writeUint64(offset: number, value: bigint): void {\n    this.writeUint32(offset, Number(BigInt.asUintN(32, value)));\n    this.writeUint32(\n      offset + 4,\n      Number(BigInt.asUintN(32, value >> BigInt(32))),\n    );\n  }\n\n  writeFloat32(offset: number, value: number): void {\n    float32[0] = value;\n    this.writeInt32(offset, int32[0]);\n  }\n\n  writeFloat64(offset: number, value: number): void {\n    float64[0] = value;\n    this.writeInt32(offset, int32[isLittleEndian ? 0 : 1]);\n    this.writeInt32(offset + 4, int32[isLittleEndian ? 1 : 0]);\n  }\n\n  /**\n   * Return the file identifier.   Behavior is undefined for FlatBuffers whose\n   * schema does not include a file_identifier (likely points at padding or the\n   * start of a the root vtable).\n   */\n  getBufferIdentifier(): string {\n    if (\n      this.bytes_.length <\n      this.position_ + SIZEOF_INT + FILE_IDENTIFIER_LENGTH\n    ) {\n      throw new Error(\n        'FlatBuffers: ByteBuffer is too short to contain an identifier.',\n      );\n    }\n    let result = '';\n    for (let i = 0; i < FILE_IDENTIFIER_LENGTH; i++) {\n      result += String.fromCharCode(\n        this.readInt8(this.position_ + SIZEOF_INT + i),\n      );\n    }\n    return result;\n  }\n\n  /**\n   * Look up a field in the vtable, return an offset into the object, or 0 if the\n   * field is not present.\n   */\n  __offset(bb_pos: number, vtable_offset: number): Offset {\n    const vtable = bb_pos - this.readInt32(bb_pos);\n    return vtable_offset < this.readUint16(vtable)\n      ? this.readUint16(vtable + vtable_offset)\n      : 0;\n  }\n\n  /**\n   * Initialize any Table-derived type to point to the union at the given offset.\n   */\n  __union(t: Table, offset: number): Table {\n    t.bb_pos = offset + this.readInt32(offset);\n    t.bb = this;\n    return t;\n  }\n\n  /**\n   * Create a JavaScript string from UTF-8 data stored inside the FlatBuffer.\n   * This allocates a new string and converts to wide chars upon each access.\n   *\n   * To avoid the conversion to string, pass Encoding.UTF8_BYTES as the\n   * \"optionalEncoding\" argument. This is useful for avoiding conversion when\n   * the data will just be packaged back up in another FlatBuffer later on.\n   *\n   * @param offset\n   * @param opt_encoding Defaults to UTF16_STRING\n   */\n  __string(offset: number, opt_encoding?: Encoding): string | Uint8Array {\n    offset += this.readInt32(offset);\n    const length = this.readInt32(offset);\n    offset += SIZEOF_INT;\n    const utf8bytes = this.bytes_.subarray(offset, offset + length);\n    if (opt_encoding === Encoding.UTF8_BYTES) return utf8bytes;\n    else return this.text_decoder_.decode(utf8bytes);\n  }\n\n  /**\n   * Handle unions that can contain string as its member, if a Table-derived type then initialize it,\n   * if a string then return a new one\n   *\n   * WARNING: strings are immutable in JS so we can't change the string that the user gave us, this\n   * makes the behaviour of __union_with_string different compared to __union\n   */\n  __union_with_string(o: Table | string, offset: number): Table | string {\n    if (typeof o === 'string') {\n      return this.__string(offset) as string;\n    }\n    return this.__union(o, offset);\n  }\n\n  /**\n   * Retrieve the relative offset stored at \"offset\"\n   */\n  __indirect(offset: Offset): Offset {\n    return offset + this.readInt32(offset);\n  }\n\n  /**\n   * Get the start of data of a vector whose offset is stored at \"offset\" in this object.\n   */\n  __vector(offset: Offset): Offset {\n    return offset + this.readInt32(offset) + SIZEOF_INT; // data starts after the length\n  }\n\n  /**\n   * Get the length of a vector whose offset is stored at \"offset\" in this object.\n   */\n  __vector_len(offset: Offset): Offset {\n    return this.readInt32(offset + this.readInt32(offset));\n  }\n\n  __has_identifier(ident: string): boolean {\n    if (ident.length != FILE_IDENTIFIER_LENGTH) {\n      throw new Error(\n        'FlatBuffers: file identifier must be length ' + FILE_IDENTIFIER_LENGTH,\n      );\n    }\n    for (let i = 0; i < FILE_IDENTIFIER_LENGTH; i++) {\n      if (\n        ident.charCodeAt(i) != this.readInt8(this.position() + SIZEOF_INT + i)\n      ) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * A helper function for generating list for obj api\n   */\n  createScalarList<T>(\n    listAccessor: (i: number) => T | null,\n    listLength: number,\n  ): T[] {\n    const ret: T[] = [];\n    for (let i = 0; i < listLength; ++i) {\n      const val = listAccessor(i);\n      if (val !== null) {\n        ret.push(val);\n      }\n    }\n    return ret;\n  }\n\n  /**\n   * A helper function for generating list for obj api\n   * @param listAccessor function that accepts an index and return data at that index\n   * @param listLength listLength\n   * @param res result list\n   */\n  createObjList<T1 extends IUnpackableObject<T2>, T2 extends IGeneratedObject>(\n    listAccessor: (i: number) => T1 | null,\n    listLength: number,\n  ): T2[] {\n    const ret: T2[] = [];\n    for (let i = 0; i < listLength; ++i) {\n      const val = listAccessor(i);\n      if (val !== null) {\n        ret.push(val.unpack());\n      }\n    }\n    return ret;\n  }\n}\n"
  },
  {
    "path": "ts/compile_flat_file.sh",
    "content": "#!/bin/bash\n# This is a script used by the typescript flatbuffer bazel rules to compile\n# a flatbuffer schema (.fbs file) to typescript and then use esbuild to\n# generate a single output.\n# Note: This relies on parsing the stdout of flatc to figure out how to\n# run esbuild.\n# --- begin runfiles.bash initialization v2 ---\n# Copy-pasted from the Bazel Bash runfiles library v2.\nset -uo pipefail; set +e; f=bazel_tools/tools/bash/runfiles/runfiles.bash\nsource \"${RUNFILES_DIR:-/dev/null}/$f\" 2>/dev/null || \\\n  source \"$(grep -sm1 \"^$f \" \"${RUNFILES_MANIFEST_FILE:-/dev/null}\" | cut -f2- -d' ')\" 2>/dev/null || \\\n  source \"$0.runfiles/$f\" 2>/dev/null || \\\n  source \"$(grep -sm1 \"^$f \" \"$0.runfiles_manifest\" | cut -f2- -d' ')\" 2>/dev/null || \\\n  source \"$(grep -sm1 \"^$f \" \"$0.exe.runfiles_manifest\" | cut -f2- -d' ')\" 2>/dev/null || \\\n  { echo>&2 \"ERROR: cannot find $f\"; exit 1; }; f=; set -e\n# --- end runfiles.bash initialization v2 ---\nset -eu\nrunfiles_export_envvars\nFLATC=$(rlocation com_github_google_flatbuffers/flatc)\nTS_FILE=$(${FLATC}  $@  | grep  \"Entry point.*generated\" | grep -o \"bazel-out.*ts\")\nexport PATH=\"$(rlocation nodejs_linux_amd64/bin/nodejs/bin):${PATH}\"\n${ESBUILD_BIN} ${TS_FILE} --format=cjs --bundle --outfile=\"${OUTPUT_FILE}\"  --external:flatbuffers --log-level=warning\n"
  },
  {
    "path": "ts/constants.ts",
    "content": "export const SIZEOF_SHORT = 2;\nexport const SIZEOF_INT = 4;\nexport const FILE_IDENTIFIER_LENGTH = 4;\nexport const SIZE_PREFIX_LENGTH = 4;\n"
  },
  {
    "path": "ts/encoding.ts",
    "content": "export enum Encoding {\n  UTF8_BYTES = 1,\n  UTF16_STRING = 2,\n}\n"
  },
  {
    "path": "ts/flatbuffers.ts",
    "content": "export {\n  FILE_IDENTIFIER_LENGTH,\n  SIZEOF_INT,\n  SIZEOF_SHORT,\n  SIZE_PREFIX_LENGTH,\n} from './constants.js';\n\nexport {IGeneratedObject, IUnpackableObject, Offset, Table} from './types.js';\n\nexport {float32, float64, int32, isLittleEndian} from './utils.js';\n\nexport {Builder} from './builder.js';\nexport {ByteBuffer} from './byte-buffer.js';\nexport {Encoding} from './encoding.js';\n"
  },
  {
    "path": "ts/flexbuffers/bit-width-util.ts",
    "content": "import {BitWidth} from './bit-width.js';\n\nexport function toByteWidth(bitWidth: BitWidth): number {\n  return 1 << bitWidth;\n}\n\nexport function iwidth(value: number | bigint): BitWidth {\n  if (value >= -128 && value <= 127) return BitWidth.WIDTH8;\n  if (value >= -32768 && value <= 32767) return BitWidth.WIDTH16;\n  if (value >= -2147483648 && value <= 2147483647) return BitWidth.WIDTH32;\n  return BitWidth.WIDTH64;\n}\n\nexport function fwidth(value: number): BitWidth {\n  return value === Math.fround(value) ? BitWidth.WIDTH32 : BitWidth.WIDTH64;\n}\n\nexport function uwidth(value: number): BitWidth {\n  if (value <= 255) return BitWidth.WIDTH8;\n  if (value <= 65535) return BitWidth.WIDTH16;\n  if (value <= 4294967295) return BitWidth.WIDTH32;\n  return BitWidth.WIDTH64;\n}\n\nexport function fromByteWidth(value: number): BitWidth {\n  if (value === 1) return BitWidth.WIDTH8;\n  if (value === 2) return BitWidth.WIDTH16;\n  if (value === 4) return BitWidth.WIDTH32;\n  return BitWidth.WIDTH64;\n}\n\nexport function paddingSize(bufSize: number, scalarSize: number): number {\n  return (~bufSize + 1) & (scalarSize - 1);\n}\n"
  },
  {
    "path": "ts/flexbuffers/bit-width.ts",
    "content": "export enum BitWidth {\n  WIDTH8 = 0,\n  WIDTH16 = 1,\n  WIDTH32 = 2,\n  WIDTH64 = 3,\n}\n"
  },
  {
    "path": "ts/flexbuffers/builder.ts",
    "content": "import {\n  fromByteWidth,\n  fwidth,\n  iwidth,\n  paddingSize,\n  toByteWidth,\n  uwidth,\n} from './bit-width-util.js';\nimport {BitWidth} from './bit-width.js';\nimport {toUTF8Array} from './flexbuffers-util.js';\nimport {StackValue} from './stack-value.js';\nimport {\n  isNumber,\n  isTypedVectorElement,\n  toTypedVector,\n} from './value-type-util.js';\nimport {ValueType} from './value-type.js';\n\ninterface StackPointer {\n  stackPosition: number;\n  isVector: boolean;\n  presorted?: boolean;\n}\n\nexport class Builder {\n  buffer: ArrayBuffer;\n  view: DataView;\n\n  readonly stack: Array<StackValue> = [];\n  readonly stackPointers: Array<StackPointer> = [];\n  offset = 0;\n  finished = false;\n  readonly stringLookup: Record<string, StackValue> = {};\n  readonly keyLookup: Record<string, StackValue> = {};\n  readonly keyVectorLookup: Record<string, StackValue> = {};\n  readonly indirectIntLookup: Record<number, StackValue> = {};\n  readonly indirectUIntLookup: Record<number, StackValue> = {};\n  readonly indirectFloatLookup: Record<number, StackValue> = {};\n\n  constructor(\n    size = 2048,\n    private dedupStrings = true,\n    private dedupKeys = true,\n    private dedupKeyVectors = true,\n  ) {\n    this.buffer = new ArrayBuffer(size > 0 ? size : 2048);\n    this.view = new DataView(this.buffer);\n  }\n\n  private align(width: BitWidth) {\n    const byteWidth = toByteWidth(width);\n    this.offset += paddingSize(this.offset, byteWidth);\n    return byteWidth;\n  }\n\n  computeOffset(newValueSize: number): number {\n    const targetOffset = this.offset + newValueSize;\n    let size = this.buffer.byteLength;\n    const prevSize = size;\n    while (size < targetOffset) {\n      size <<= 1;\n    }\n    if (prevSize < size) {\n      const prevBuffer = this.buffer;\n      this.buffer = new ArrayBuffer(size);\n      this.view = new DataView(this.buffer);\n      new Uint8Array(this.buffer).set(new Uint8Array(prevBuffer), 0);\n    }\n    return targetOffset;\n  }\n\n  pushInt(value: number, width: BitWidth): void {\n    if (width === BitWidth.WIDTH8) {\n      this.view.setInt8(this.offset, value);\n    } else if (width === BitWidth.WIDTH16) {\n      this.view.setInt16(this.offset, value, true);\n    } else if (width === BitWidth.WIDTH32) {\n      this.view.setInt32(this.offset, value, true);\n    } else if (width === BitWidth.WIDTH64) {\n      this.view.setBigInt64(this.offset, BigInt(value), true);\n    } else {\n      throw `Unexpected width: ${width} for value: ${value}`;\n    }\n  }\n\n  pushUInt(value: number, width: BitWidth): void {\n    if (width === BitWidth.WIDTH8) {\n      this.view.setUint8(this.offset, value);\n    } else if (width === BitWidth.WIDTH16) {\n      this.view.setUint16(this.offset, value, true);\n    } else if (width === BitWidth.WIDTH32) {\n      this.view.setUint32(this.offset, value, true);\n    } else if (width === BitWidth.WIDTH64) {\n      this.view.setBigUint64(this.offset, BigInt(value), true);\n    } else {\n      throw `Unexpected width: ${width} for value: ${value}`;\n    }\n  }\n\n  private writeInt(value: number, byteWidth: number) {\n    const newOffset = this.computeOffset(byteWidth);\n    this.pushInt(value, fromByteWidth(byteWidth));\n    this.offset = newOffset;\n  }\n\n  private writeUInt(value: number, byteWidth: number) {\n    const newOffset = this.computeOffset(byteWidth);\n    this.pushUInt(value, fromByteWidth(byteWidth));\n    this.offset = newOffset;\n  }\n\n  private writeBlob(arrayBuffer: ArrayBuffer) {\n    const length = arrayBuffer.byteLength;\n    const bitWidth = uwidth(length);\n    const byteWidth = this.align(bitWidth);\n    this.writeUInt(length, byteWidth);\n    const blobOffset = this.offset;\n    const newOffset = this.computeOffset(length);\n    new Uint8Array(this.buffer).set(new Uint8Array(arrayBuffer), blobOffset);\n    this.stack.push(\n      this.offsetStackValue(blobOffset, ValueType.BLOB, bitWidth),\n    );\n    this.offset = newOffset;\n  }\n\n  private writeString(str: string): void {\n    if (\n      this.dedupStrings &&\n      Object.prototype.hasOwnProperty.call(this.stringLookup, str)\n    ) {\n      this.stack.push(this.stringLookup[str]);\n      return;\n    }\n    const utf8 = toUTF8Array(str);\n    const length = utf8.length;\n    const bitWidth = uwidth(length);\n    const byteWidth = this.align(bitWidth);\n    this.writeUInt(length, byteWidth);\n    const stringOffset = this.offset;\n    const newOffset = this.computeOffset(length + 1);\n    new Uint8Array(this.buffer).set(utf8, stringOffset);\n    const stackValue = this.offsetStackValue(\n      stringOffset,\n      ValueType.STRING,\n      bitWidth,\n    );\n    this.stack.push(stackValue);\n    if (this.dedupStrings) {\n      this.stringLookup[str] = stackValue;\n    }\n    this.offset = newOffset;\n  }\n\n  private writeKey(str: string): void {\n    if (\n      this.dedupKeys &&\n      Object.prototype.hasOwnProperty.call(this.keyLookup, str)\n    ) {\n      this.stack.push(this.keyLookup[str]);\n      return;\n    }\n    const utf8 = toUTF8Array(str);\n    const length = utf8.length;\n    const newOffset = this.computeOffset(length + 1);\n    new Uint8Array(this.buffer).set(utf8, this.offset);\n    const stackValue = this.offsetStackValue(\n      this.offset,\n      ValueType.KEY,\n      BitWidth.WIDTH8,\n    );\n    this.stack.push(stackValue);\n    if (this.dedupKeys) {\n      this.keyLookup[str] = stackValue;\n    }\n    this.offset = newOffset;\n  }\n\n  private writeStackValue(value: StackValue, byteWidth: number): void {\n    const newOffset = this.computeOffset(byteWidth);\n    if (value.isOffset()) {\n      const relativeOffset = this.offset - value.offset;\n      if (\n        byteWidth === 8 ||\n        BigInt(relativeOffset) < BigInt(1) << BigInt(byteWidth * 8)\n      ) {\n        this.writeUInt(relativeOffset, byteWidth);\n      } else {\n        throw `Unexpected size ${byteWidth}. This might be a bug. Please create an issue https://github.com/google/flatbuffers/issues/new`;\n      }\n    } else {\n      value.writeToBuffer(byteWidth);\n    }\n    this.offset = newOffset;\n  }\n\n  private integrityCheckOnValueAddition() {\n    if (this.finished) {\n      throw 'Adding values after finish is prohibited';\n    }\n    if (\n      this.stackPointers.length !== 0 &&\n      this.stackPointers[this.stackPointers.length - 1].isVector === false\n    ) {\n      if (this.stack[this.stack.length - 1].type !== ValueType.KEY) {\n        throw 'Adding value to a map before adding a key is prohibited';\n      }\n    }\n  }\n\n  private integrityCheckOnKeyAddition() {\n    if (this.finished) {\n      throw 'Adding values after finish is prohibited';\n    }\n    if (\n      this.stackPointers.length === 0 ||\n      this.stackPointers[this.stackPointers.length - 1].isVector\n    ) {\n      throw 'Adding key before starting a map is prohibited';\n    }\n  }\n\n  startVector(): void {\n    this.stackPointers.push({stackPosition: this.stack.length, isVector: true});\n  }\n\n  startMap(presorted = false): void {\n    this.stackPointers.push({\n      stackPosition: this.stack.length,\n      isVector: false,\n      presorted: presorted,\n    });\n  }\n\n  private endVector(stackPointer: StackPointer) {\n    const vecLength = this.stack.length - stackPointer.stackPosition;\n    const vec = this.createVector(stackPointer.stackPosition, vecLength, 1);\n    this.stack.splice(stackPointer.stackPosition, vecLength);\n    this.stack.push(vec);\n  }\n\n  private endMap(stackPointer: StackPointer) {\n    if (!stackPointer.presorted) {\n      this.sort(stackPointer);\n    }\n    let keyVectorHash = '';\n    for (let i = stackPointer.stackPosition; i < this.stack.length; i += 2) {\n      keyVectorHash += `,${this.stack[i].offset}`;\n    }\n    const vecLength = (this.stack.length - stackPointer.stackPosition) >> 1;\n\n    if (\n      this.dedupKeyVectors &&\n      !Object.prototype.hasOwnProperty.call(this.keyVectorLookup, keyVectorHash)\n    ) {\n      this.keyVectorLookup[keyVectorHash] = this.createVector(\n        stackPointer.stackPosition,\n        vecLength,\n        2,\n      );\n    }\n    const keysStackValue = this.dedupKeyVectors\n      ? this.keyVectorLookup[keyVectorHash]\n      : this.createVector(stackPointer.stackPosition, vecLength, 2);\n    const valuesStackValue = this.createVector(\n      stackPointer.stackPosition + 1,\n      vecLength,\n      2,\n      keysStackValue,\n    );\n    this.stack.splice(stackPointer.stackPosition, vecLength << 1);\n    this.stack.push(valuesStackValue);\n  }\n\n  private sort(stackPointer: StackPointer) {\n    const view = this.view;\n    const stack = this.stack;\n\n    function shouldFlip(v1: StackValue, v2: StackValue) {\n      if (v1.type !== ValueType.KEY || v2.type !== ValueType.KEY) {\n        throw `Stack values are not keys ${v1} | ${v2}. Check if you combined [addKey] with add... method calls properly.`;\n      }\n      let c1, c2;\n      let index = 0;\n      do {\n        c1 = view.getUint8(v1.offset + index);\n        c2 = view.getUint8(v2.offset + index);\n        if (c2 < c1) return true;\n        if (c1 < c2) return false;\n        index += 1;\n      } while (c1 !== 0 && c2 !== 0);\n      return false;\n    }\n\n    function swap(stack: Array<StackValue>, flipIndex: number, i: number) {\n      if (flipIndex === i) return;\n      const k = stack[flipIndex];\n      const v = stack[flipIndex + 1];\n      stack[flipIndex] = stack[i];\n      stack[flipIndex + 1] = stack[i + 1];\n      stack[i] = k;\n      stack[i + 1] = v;\n    }\n\n    function selectionSort() {\n      for (let i = stackPointer.stackPosition; i < stack.length; i += 2) {\n        let flipIndex = i;\n        for (let j = i + 2; j < stack.length; j += 2) {\n          if (shouldFlip(stack[flipIndex], stack[j])) {\n            flipIndex = j;\n          }\n        }\n        if (flipIndex !== i) {\n          swap(stack, flipIndex, i);\n        }\n      }\n    }\n\n    function smaller(v1: StackValue, v2: StackValue) {\n      if (v1.type !== ValueType.KEY || v2.type !== ValueType.KEY) {\n        throw `Stack values are not keys ${v1} | ${v2}. Check if you combined [addKey] with add... method calls properly.`;\n      }\n      if (v1.offset === v2.offset) {\n        return false;\n      }\n      let c1, c2;\n      let index = 0;\n      do {\n        c1 = view.getUint8(v1.offset + index);\n        c2 = view.getUint8(v2.offset + index);\n        if (c1 < c2) return true;\n        if (c2 < c1) return false;\n        index += 1;\n      } while (c1 !== 0 && c2 !== 0);\n      return false;\n    }\n\n    function quickSort(left: number, right: number) {\n      if (left < right) {\n        const mid = left + ((right - left) >> 2) * 2;\n        const pivot = stack[mid];\n        let left_new = left;\n        let right_new = right;\n\n        do {\n          while (smaller(stack[left_new], pivot)) {\n            left_new += 2;\n          }\n          while (smaller(pivot, stack[right_new])) {\n            right_new -= 2;\n          }\n          if (left_new <= right_new) {\n            swap(stack, left_new, right_new);\n            left_new += 2;\n            right_new -= 2;\n          }\n        } while (left_new <= right_new);\n\n        quickSort(left, right_new);\n        quickSort(left_new, right);\n      }\n    }\n\n    let sorted = true;\n    for (\n      let i = stackPointer.stackPosition;\n      i < this.stack.length - 2;\n      i += 2\n    ) {\n      if (shouldFlip(this.stack[i], this.stack[i + 2])) {\n        sorted = false;\n        break;\n      }\n    }\n\n    if (!sorted) {\n      if (this.stack.length - stackPointer.stackPosition > 40) {\n        quickSort(stackPointer.stackPosition, this.stack.length - 2);\n      } else {\n        selectionSort();\n      }\n    }\n  }\n\n  end(): void {\n    if (this.stackPointers.length < 1) return;\n    const pointer = this.stackPointers.pop() as StackPointer;\n    if (pointer.isVector) {\n      this.endVector(pointer);\n    } else {\n      this.endMap(pointer);\n    }\n  }\n\n  private createVector(\n    start: number,\n    vecLength: number,\n    step: number,\n    keys: StackValue | null = null,\n  ) {\n    let bitWidth = uwidth(vecLength);\n    let prefixElements = 1;\n    if (keys !== null) {\n      const elementWidth = keys.elementWidth(this.offset, 0);\n      if (elementWidth > bitWidth) {\n        bitWidth = elementWidth;\n      }\n      prefixElements += 2;\n    }\n    let vectorType = ValueType.KEY;\n    let typed = keys === null;\n    for (let i = start; i < this.stack.length; i += step) {\n      const elementWidth = this.stack[i].elementWidth(\n        this.offset,\n        i + prefixElements,\n      );\n      if (elementWidth > bitWidth) {\n        bitWidth = elementWidth;\n      }\n      if (i === start) {\n        vectorType = this.stack[i].type;\n        typed = typed && isTypedVectorElement(vectorType);\n      } else {\n        if (vectorType !== this.stack[i].type) {\n          typed = false;\n        }\n      }\n    }\n    const byteWidth = this.align(bitWidth);\n    const fix =\n      typed && isNumber(vectorType) && vecLength >= 2 && vecLength <= 4;\n    if (keys !== null) {\n      this.writeStackValue(keys, byteWidth);\n      this.writeUInt(1 << keys.width, byteWidth);\n    }\n    if (!fix) {\n      this.writeUInt(vecLength, byteWidth);\n    }\n    const vecOffset = this.offset;\n    for (let i = start; i < this.stack.length; i += step) {\n      this.writeStackValue(this.stack[i], byteWidth);\n    }\n    if (!typed) {\n      for (let i = start; i < this.stack.length; i += step) {\n        this.writeUInt(this.stack[i].storedPackedType(), 1);\n      }\n    }\n    if (keys !== null) {\n      return this.offsetStackValue(vecOffset, ValueType.MAP, bitWidth);\n    }\n    if (typed) {\n      const vType = toTypedVector(vectorType, fix ? vecLength : 0);\n      return this.offsetStackValue(vecOffset, vType, bitWidth);\n    }\n    return this.offsetStackValue(vecOffset, ValueType.VECTOR, bitWidth);\n  }\n\n  private nullStackValue() {\n    return new StackValue(this, ValueType.NULL, BitWidth.WIDTH8);\n  }\n\n  private boolStackValue(value: boolean) {\n    return new StackValue(this, ValueType.BOOL, BitWidth.WIDTH8, value);\n  }\n\n  private intStackValue(value: number | bigint) {\n    return new StackValue(this, ValueType.INT, iwidth(value), value as number);\n  }\n\n  private uintStackValue(value: number) {\n    return new StackValue(this, ValueType.UINT, uwidth(value), value);\n  }\n\n  private floatStackValue(value: number) {\n    return new StackValue(this, ValueType.FLOAT, fwidth(value), value);\n  }\n\n  private offsetStackValue(\n    offset: number,\n    valueType: ValueType,\n    bitWidth: BitWidth,\n  ): StackValue {\n    return new StackValue(this, valueType, bitWidth, null, offset);\n  }\n\n  private finishBuffer() {\n    if (this.stack.length !== 1) {\n      throw `Stack has to be exactly 1, but it is ${this.stack.length}. You have to end all started vectors and maps before calling [finish]`;\n    }\n    const value = this.stack[0];\n    const byteWidth = this.align(value.elementWidth(this.offset, 0));\n    this.writeStackValue(value, byteWidth);\n    this.writeUInt(value.storedPackedType(), 1);\n    this.writeUInt(byteWidth, 1);\n    this.finished = true;\n  }\n\n  add(\n    value:\n      | undefined\n      | null\n      | boolean\n      | bigint\n      | number\n      | DataView\n      | string\n      | Array<unknown>\n      | Record<string, unknown>\n      | unknown,\n  ): void {\n    this.integrityCheckOnValueAddition();\n    if (typeof value === 'undefined') {\n      throw 'You need to provide a value';\n    }\n    if (value === null) {\n      this.stack.push(this.nullStackValue());\n    } else if (typeof value === 'boolean') {\n      this.stack.push(this.boolStackValue(value));\n    } else if (typeof value === 'bigint') {\n      this.stack.push(this.intStackValue(value));\n    } else if (typeof value == 'number') {\n      if (Number.isInteger(value)) {\n        this.stack.push(this.intStackValue(value));\n      } else {\n        this.stack.push(this.floatStackValue(value));\n      }\n    } else if (ArrayBuffer.isView(value)) {\n      this.writeBlob(value.buffer);\n    } else if (typeof value === 'string' || value instanceof String) {\n      this.writeString(value as string);\n    } else if (Array.isArray(value)) {\n      this.startVector();\n      for (let i = 0; i < value.length; i++) {\n        this.add(value[i]);\n      }\n      this.end();\n    } else if (typeof value === 'object') {\n      const properties = Object.getOwnPropertyNames(value).sort();\n      this.startMap(true);\n      for (let i = 0; i < properties.length; i++) {\n        const key = properties[i];\n        this.addKey(key);\n        this.add((value as Record<string, unknown>)[key]);\n      }\n      this.end();\n    } else {\n      throw `Unexpected value input ${value}`;\n    }\n  }\n\n  finish(): Uint8Array {\n    if (!this.finished) {\n      this.finishBuffer();\n    }\n    const result = this.buffer.slice(0, this.offset);\n    return new Uint8Array(result);\n  }\n\n  isFinished(): boolean {\n    return this.finished;\n  }\n\n  addKey(key: string): void {\n    this.integrityCheckOnKeyAddition();\n    this.writeKey(key);\n  }\n\n  addInt(value: number, indirect = false, deduplicate = false): void {\n    this.integrityCheckOnValueAddition();\n    if (!indirect) {\n      this.stack.push(this.intStackValue(value));\n      return;\n    }\n    if (\n      deduplicate &&\n      Object.prototype.hasOwnProperty.call(this.indirectIntLookup, value)\n    ) {\n      this.stack.push(this.indirectIntLookup[value]);\n      return;\n    }\n    const stackValue = this.intStackValue(value);\n    const byteWidth = this.align(stackValue.width);\n    const newOffset = this.computeOffset(byteWidth);\n    const valueOffset = this.offset;\n    stackValue.writeToBuffer(byteWidth);\n    const stackOffset = this.offsetStackValue(\n      valueOffset,\n      ValueType.INDIRECT_INT,\n      stackValue.width,\n    );\n    this.stack.push(stackOffset);\n    this.offset = newOffset;\n    if (deduplicate) {\n      this.indirectIntLookup[value] = stackOffset;\n    }\n  }\n\n  addUInt(value: number, indirect = false, deduplicate = false): void {\n    this.integrityCheckOnValueAddition();\n    if (!indirect) {\n      this.stack.push(this.uintStackValue(value));\n      return;\n    }\n    if (\n      deduplicate &&\n      Object.prototype.hasOwnProperty.call(this.indirectUIntLookup, value)\n    ) {\n      this.stack.push(this.indirectUIntLookup[value]);\n      return;\n    }\n    const stackValue = this.uintStackValue(value);\n    const byteWidth = this.align(stackValue.width);\n    const newOffset = this.computeOffset(byteWidth);\n    const valueOffset = this.offset;\n    stackValue.writeToBuffer(byteWidth);\n    const stackOffset = this.offsetStackValue(\n      valueOffset,\n      ValueType.INDIRECT_UINT,\n      stackValue.width,\n    );\n    this.stack.push(stackOffset);\n    this.offset = newOffset;\n    if (deduplicate) {\n      this.indirectUIntLookup[value] = stackOffset;\n    }\n  }\n\n  addFloat(value: number, indirect = false, deduplicate = false): void {\n    this.integrityCheckOnValueAddition();\n    if (!indirect) {\n      this.stack.push(this.floatStackValue(value));\n      return;\n    }\n    if (\n      deduplicate &&\n      Object.prototype.hasOwnProperty.call(this.indirectFloatLookup, value)\n    ) {\n      this.stack.push(this.indirectFloatLookup[value]);\n      return;\n    }\n    const stackValue = this.floatStackValue(value);\n    const byteWidth = this.align(stackValue.width);\n    const newOffset = this.computeOffset(byteWidth);\n    const valueOffset = this.offset;\n    stackValue.writeToBuffer(byteWidth);\n    const stackOffset = this.offsetStackValue(\n      valueOffset,\n      ValueType.INDIRECT_FLOAT,\n      stackValue.width,\n    );\n    this.stack.push(stackOffset);\n    this.offset = newOffset;\n    if (deduplicate) {\n      this.indirectFloatLookup[value] = stackOffset;\n    }\n  }\n}\n"
  },
  {
    "path": "ts/flexbuffers/flexbuffers-util.ts",
    "content": "export function fromUTF8Array(data: BufferSource): string {\n  const decoder = new TextDecoder();\n  return decoder.decode(data);\n}\n\nexport function toUTF8Array(str: string): Uint8Array {\n  const encoder = new TextEncoder();\n  return encoder.encode(str);\n}\n"
  },
  {
    "path": "ts/flexbuffers/reference-util.ts",
    "content": "import {fromByteWidth, toByteWidth} from './bit-width-util.js';\nimport {BitWidth} from './bit-width.js';\nimport {fromUTF8Array, toUTF8Array} from './flexbuffers-util.js';\n\nexport function validateOffset(\n  dataView: DataView,\n  offset: number,\n  width: number,\n): void {\n  if (\n    dataView.byteLength <= offset + width ||\n    (offset & (toByteWidth(width) - 1)) !== 0\n  ) {\n    throw 'Bad offset: ' + offset + ', width: ' + width;\n  }\n}\n\nexport function readInt(\n  dataView: DataView,\n  offset: number,\n  width: number,\n): number | bigint {\n  if (width < 2) {\n    if (width < 1) {\n      return dataView.getInt8(offset);\n    } else {\n      return dataView.getInt16(offset, true);\n    }\n  } else {\n    if (width < 3) {\n      return dataView.getInt32(offset, true);\n    } else {\n      if (dataView.setBigInt64 === undefined) {\n        return (\n          BigInt(dataView.getUint32(offset, true)) +\n          (BigInt(dataView.getUint32(offset + 4, true)) << BigInt(32))\n        );\n      }\n      return dataView.getBigInt64(offset, true);\n    }\n  }\n}\n\nexport function readUInt(\n  dataView: DataView,\n  offset: number,\n  width: number,\n): number | bigint {\n  if (width < 2) {\n    if (width < 1) {\n      return dataView.getUint8(offset);\n    } else {\n      return dataView.getUint16(offset, true);\n    }\n  } else {\n    if (width < 3) {\n      return dataView.getUint32(offset, true);\n    } else {\n      if (dataView.getBigUint64 === undefined) {\n        return (\n          BigInt(dataView.getUint32(offset, true)) +\n          (BigInt(dataView.getUint32(offset + 4, true)) << BigInt(32))\n        );\n      }\n      return dataView.getBigUint64(offset, true);\n    }\n  }\n}\n\nexport function readFloat(\n  dataView: DataView,\n  offset: number,\n  width: number,\n): number {\n  if (width < BitWidth.WIDTH32) {\n    throw 'Bad width: ' + width;\n  }\n  if (width === BitWidth.WIDTH32) {\n    return dataView.getFloat32(offset, true);\n  }\n  return dataView.getFloat64(offset, true);\n}\n\nexport function indirect(\n  dataView: DataView,\n  offset: number,\n  width: number,\n): number {\n  const step = readUInt(dataView, offset, width) as number;\n  return offset - step;\n}\n\nexport function keyIndex(\n  key: string,\n  dataView: DataView,\n  offset: number,\n  parentWidth: number,\n  byteWidth: number,\n  length: number,\n): number | null {\n  const input = toUTF8Array(key);\n  const keysVectorOffset =\n    indirect(dataView, offset, parentWidth) - byteWidth * 3;\n  const bitWidth = fromByteWidth(byteWidth);\n  const indirectOffset =\n    keysVectorOffset - Number(readUInt(dataView, keysVectorOffset, bitWidth));\n  const _byteWidth = Number(\n    readUInt(dataView, keysVectorOffset + byteWidth, bitWidth),\n  );\n  let low = 0;\n  let high = length - 1;\n  while (low <= high) {\n    const mid = (high + low) >> 1;\n    const dif = diffKeys(input, mid, dataView, indirectOffset, _byteWidth);\n    if (dif === 0) return mid;\n    if (dif < 0) {\n      high = mid - 1;\n    } else {\n      low = mid + 1;\n    }\n  }\n  return null;\n}\n\nexport function diffKeys(\n  input: Uint8Array,\n  index: number,\n  dataView: DataView,\n  offset: number,\n  width: number,\n): number {\n  const keyOffset = offset + index * width;\n  const keyIndirectOffset =\n    keyOffset - Number(readUInt(dataView, keyOffset, fromByteWidth(width)));\n  for (let i = 0; i < input.length; i++) {\n    const dif = input[i] - dataView.getUint8(keyIndirectOffset + i);\n    if (dif !== 0) {\n      return dif;\n    }\n  }\n  return dataView.getUint8(keyIndirectOffset + input.length) === 0 ? 0 : -1;\n}\n\nexport function keyForIndex(\n  index: number,\n  dataView: DataView,\n  offset: number,\n  parentWidth: number,\n  byteWidth: number,\n): string {\n  const keysVectorOffset =\n    indirect(dataView, offset, parentWidth) - byteWidth * 3;\n  const bitWidth = fromByteWidth(byteWidth);\n  const indirectOffset =\n    keysVectorOffset - Number(readUInt(dataView, keysVectorOffset, bitWidth));\n  const _byteWidth = Number(\n    readUInt(dataView, keysVectorOffset + byteWidth, bitWidth),\n  );\n  const keyOffset = indirectOffset + index * _byteWidth;\n  const keyIndirectOffset =\n    keyOffset -\n    Number(readUInt(dataView, keyOffset, fromByteWidth(_byteWidth)));\n  let length = 0;\n  while (dataView.getUint8(keyIndirectOffset + length) !== 0) {\n    length++;\n  }\n  return fromUTF8Array(\n    new Uint8Array(dataView.buffer, keyIndirectOffset, length),\n  );\n}\n"
  },
  {
    "path": "ts/flexbuffers/reference.ts",
    "content": "import {fromByteWidth} from './bit-width-util.js';\nimport {BitWidth} from './bit-width.js';\nimport {fromUTF8Array} from './flexbuffers-util.js';\nimport {\n  indirect,\n  keyForIndex,\n  keyIndex,\n  readFloat,\n  readInt,\n  readUInt,\n} from './reference-util.js';\nimport {\n  fixedTypedVectorElementSize,\n  fixedTypedVectorElementType,\n  isAVector,\n  isFixedTypedVector,\n  isIndirectNumber,\n  isNumber,\n  isTypedVector,\n  packedType,\n  typedVectorElementType,\n} from './value-type-util.js';\nimport {ValueType} from './value-type.js';\n\nexport function toReference(buffer: ArrayBuffer): Reference {\n  const len = buffer.byteLength;\n\n  if (len < 3) {\n    throw new Error('Buffer needs to be bigger than 3 bytes');\n  }\n\n  const dataView = new DataView(buffer);\n  const rootByteWidth = dataView.getUint8(len - 1);\n  const packedType = dataView.getUint8(len - 2);\n\n  let parentWidth = fromByteWidth(rootByteWidth);\n  let offset = len - rootByteWidth - 2;\n\n  const rootValueType = packedType >> 2;\n  if (\n    rootValueType === ValueType.VECTOR ||\n    rootValueType === ValueType.MAP ||\n    rootValueType === ValueType.BLOB ||\n    rootValueType === ValueType.STRING\n  ) {\n    // Ensure parent width is wide enough to address the buffer\n    let w = 1;\n    while ((1 << (w * 8)) <= len && w < 8) w <<= 1;\n    parentWidth = fromByteWidth(w);\n    offset = len - w - 2; // no extra hacks\n  }\n\n  return new Reference(dataView, offset, parentWidth, packedType, '/');\n}\n\nfunction valueForIndexWithKey(\n  index: number,\n  key: string,\n  dataView: DataView,\n  offset: number,\n  parentWidth: number,\n  byteWidth: number,\n  length: number,\n  path: string,\n): Reference {\n  const _indirect = indirect(dataView, offset, parentWidth);\n  const elementOffset = _indirect + index * byteWidth;\n  const packedType = dataView.getUint8(_indirect + length * byteWidth + index);\n  return new Reference(\n    dataView,\n    elementOffset,\n    fromByteWidth(byteWidth),\n    packedType,\n    `${path}/${key}`,\n  );\n}\n\nexport class Reference {\n  private readonly byteWidth: number;\n  private readonly valueType: ValueType;\n  private _length = -1;\n  constructor(\n    private dataView: DataView,\n    private offset: number,\n    private parentWidth: number,\n    private packedType: ValueType,\n    private path: string,\n  ) {\n    this.byteWidth = 1 << (packedType & 3);\n    this.valueType = packedType >> 2;\n  }\n\n  isNull(): boolean {\n    return this.valueType === ValueType.NULL;\n  }\n  isNumber(): boolean {\n    return isNumber(this.valueType) || isIndirectNumber(this.valueType);\n  }\n  isFloat(): boolean {\n    return (\n      ValueType.FLOAT === this.valueType ||\n      ValueType.INDIRECT_FLOAT === this.valueType\n    );\n  }\n  isInt(): boolean {\n    return this.isNumber() && !this.isFloat();\n  }\n  isString(): boolean {\n    return (\n      ValueType.STRING === this.valueType || ValueType.KEY === this.valueType\n    );\n  }\n  isBool(): boolean {\n    return ValueType.BOOL === this.valueType;\n  }\n  isBlob(): boolean {\n    return ValueType.BLOB === this.valueType;\n  }\n  isVector(): boolean {\n    return isAVector(this.valueType);\n  }\n  isMap(): boolean {\n    return ValueType.MAP === this.valueType;\n  }\n\n  boolValue(): boolean | null {\n    if (this.isBool()) {\n      return readInt(this.dataView, this.offset, this.parentWidth) > 0;\n    }\n    return null;\n  }\n\n  intValue(): number | bigint | null {\n    if (this.valueType === ValueType.INT) {\n      return readInt(this.dataView, this.offset, this.parentWidth);\n    }\n    if (this.valueType === ValueType.UINT) {\n      return readUInt(this.dataView, this.offset, this.parentWidth);\n    }\n    if (this.valueType === ValueType.INDIRECT_INT) {\n      return readInt(\n        this.dataView,\n        indirect(this.dataView, this.offset, this.parentWidth),\n        fromByteWidth(this.byteWidth),\n      );\n    }\n    if (this.valueType === ValueType.INDIRECT_UINT) {\n      return readUInt(\n        this.dataView,\n        indirect(this.dataView, this.offset, this.parentWidth),\n        fromByteWidth(this.byteWidth),\n      );\n    }\n    return null;\n  }\n\n  floatValue(): number | null {\n    if (this.valueType === ValueType.FLOAT) {\n      return readFloat(this.dataView, this.offset, this.parentWidth);\n    }\n    if (this.valueType === ValueType.INDIRECT_FLOAT) {\n      return readFloat(\n        this.dataView,\n        indirect(this.dataView, this.offset, this.parentWidth),\n        fromByteWidth(this.byteWidth),\n      );\n    }\n    return null;\n  }\n\n  numericValue(): number | bigint | null {\n    return this.floatValue() || this.intValue();\n  }\n\n  stringValue(): string | null {\n    if (\n      this.valueType === ValueType.STRING ||\n      this.valueType === ValueType.KEY\n    ) {\n      const begin = indirect(this.dataView, this.offset, this.parentWidth);\n      return fromUTF8Array(\n        new Uint8Array(this.dataView.buffer, begin, this.length()),\n      );\n    }\n    return null;\n  }\n\n  blobValue(): Uint8Array | null {\n    if (this.isBlob()) {\n      const begin = indirect(this.dataView, this.offset, this.parentWidth);\n      return new Uint8Array(this.dataView.buffer, begin, this.length());\n    }\n    return null;\n  }\n\n  get(key: number): Reference {\n    const length = this.length();\n    if (Number.isInteger(key) && isAVector(this.valueType)) {\n      if (key >= length || key < 0) {\n        throw new Error(`Key: [${key}] is not applicable on ${this.path} of ${this.valueType} length: ${length}`);\n      }\n      const _indirect = indirect(this.dataView, this.offset, this.parentWidth);\n      const elementOffset = _indirect + key * this.byteWidth;\n\n      let _packedType: ValueType;\n\n      if (isTypedVector(this.valueType)) {\n      // Root typed vector: derive type instead of reading from buffer\n      const _valueType = typedVectorElementType(this.valueType);\n      _packedType = packedType(_valueType, BitWidth.WIDTH8);\n    } else if (isFixedTypedVector(this.valueType)) {\n      const _valueType = fixedTypedVectorElementType(this.valueType);\n      _packedType = packedType(_valueType, BitWidth.WIDTH8);\n    } else {\n      // Only read packed type from buffer if it exists\n      const typeOffset = _indirect + length * this.byteWidth + key;\n      if (typeOffset < this.dataView.byteLength) {\n        _packedType = this.dataView.getUint8(typeOffset);\n      } else {\n        // fallback for edge cases (e.g., root vectors)\n        _packedType = this.packedType;\n      }\n      }\n\n      return new Reference(\n        this.dataView,\n        elementOffset,\n        fromByteWidth(this.byteWidth),\n        _packedType,\n        `${this.path}[${key}]`,\n      );\n    }\n\n    if (typeof key === 'string') {\n      const index = keyIndex(\n        key,\n        this.dataView,\n        this.offset,\n        this.parentWidth,\n        this.byteWidth,\n        length,\n      );\n      if (index !== null) {\n        return valueForIndexWithKey(\n          index,\n          key,\n          this.dataView,\n          this.offset,\n          this.parentWidth,\n          this.byteWidth,\n          length,\n          this.path,\n        );\n      }\n    }\n\n    throw new Error(`Key [${key}] is not applicable on ${this.path} of ${this.valueType}`);\n  }\n\n  length(): number {\n    let size;\n    if (this._length > -1) {\n      return this._length;\n    }\n    if (isFixedTypedVector(this.valueType)) {\n      this._length = fixedTypedVectorElementSize(this.valueType);\n    } else if (\n      this.valueType === ValueType.BLOB ||\n      this.valueType === ValueType.MAP ||\n      isAVector(this.valueType)\n    ) {\n      this._length = readUInt(\n        this.dataView,\n        indirect(this.dataView, this.offset, this.parentWidth) - this.byteWidth,\n        fromByteWidth(this.byteWidth),\n      ) as number;\n    } else if (this.valueType === ValueType.NULL) {\n      this._length = 0;\n    } else if (this.valueType === ValueType.STRING) {\n      const _indirect = indirect(this.dataView, this.offset, this.parentWidth);\n      let sizeByteWidth = this.byteWidth;\n      size = readUInt(\n        this.dataView,\n        _indirect - sizeByteWidth,\n        fromByteWidth(this.byteWidth),\n      );\n      while (this.dataView.getInt8(_indirect + (size as number)) !== 0) {\n        sizeByteWidth <<= 1;\n        size = readUInt(\n          this.dataView,\n          _indirect - sizeByteWidth,\n          fromByteWidth(this.byteWidth),\n        );\n      }\n      this._length = size as number;\n    } else if (this.valueType === ValueType.KEY) {\n      const _indirect = indirect(this.dataView, this.offset, this.parentWidth);\n      size = 1;\n      while (this.dataView.getInt8(_indirect + size) !== 0) {\n        size++;\n      }\n      this._length = size;\n    } else {\n      this._length = 1;\n    }\n    return Number(this._length);\n  }\n\n  toObject(): unknown {\n    const length = this.length();\n    if (this.isVector()) {\n      const result = [];\n      for (let i = 0; i < length; i++) {\n        result.push(this.get(i).toObject());\n      }\n      return result;\n    }\n    if (this.isMap()) {\n      const result: Record<string, unknown> = {};\n      for (let i = 0; i < length; i++) {\n        const key = keyForIndex(\n          i,\n          this.dataView,\n          this.offset,\n          this.parentWidth,\n          this.byteWidth,\n        );\n        result[key] = valueForIndexWithKey(\n          i,\n          key,\n          this.dataView,\n          this.offset,\n          this.parentWidth,\n          this.byteWidth,\n          length,\n          this.path,\n        ).toObject();\n      }\n      return result;\n    }\n    if (this.isNull()) {\n      return null;\n    }\n    if (this.isBool()) {\n      return this.boolValue();\n    }\n    if (this.isNumber()) {\n      return this.numericValue();\n    }\n    return this.blobValue() || this.stringValue();\n  }\n}\n"
  },
  {
    "path": "ts/flexbuffers/stack-value.ts",
    "content": "import {fromByteWidth, paddingSize, uwidth} from './bit-width-util.js';\nimport {BitWidth} from './bit-width.js';\nimport {Builder} from './builder.js';\nimport {isInline, packedType} from './value-type-util.js';\nimport {ValueType} from './value-type.js';\n\nexport class StackValue {\n  constructor(\n    private builder: Builder,\n    public type: ValueType,\n    public width: number,\n    public value: number | boolean | null = null,\n    public offset: number = 0,\n  ) {}\n\n  elementWidth(size: number, index: number): BitWidth {\n    if (isInline(this.type)) return this.width;\n    for (let i = 0; i < 4; i++) {\n      const width = 1 << i;\n      const offsetLoc = size + paddingSize(size, width) + index * width;\n      const offset = offsetLoc - this.offset;\n      const bitWidth = uwidth(offset);\n      if (1 << bitWidth === width) {\n        return bitWidth;\n      }\n    }\n    throw `Element is unknown. Size: ${size} at index: ${index}. This might be a bug. Please create an issue https://github.com/google/flatbuffers/issues/new`;\n  }\n\n  writeToBuffer(byteWidth: number): void {\n    const newOffset = this.builder.computeOffset(byteWidth);\n    if (this.type === ValueType.FLOAT) {\n      if (this.width === BitWidth.WIDTH32) {\n        this.builder.view.setFloat32(\n          this.builder.offset,\n          this.value as number,\n          true,\n        );\n      } else {\n        this.builder.view.setFloat64(\n          this.builder.offset,\n          this.value as number,\n          true,\n        );\n      }\n    } else if (this.type === ValueType.INT) {\n      const bitWidth = fromByteWidth(byteWidth);\n      this.builder.pushInt(this.value as number, bitWidth);\n    } else if (this.type === ValueType.UINT) {\n      const bitWidth = fromByteWidth(byteWidth);\n      this.builder.pushUInt(this.value as number, bitWidth);\n    } else if (this.type === ValueType.NULL) {\n      this.builder.pushInt(0, this.width);\n    } else if (this.type === ValueType.BOOL) {\n      this.builder.pushInt(this.value ? 1 : 0, this.width);\n    } else {\n      throw `Unexpected type: ${this.type}. This might be a bug. Please create an issue https://github.com/google/flatbuffers/issues/new`;\n    }\n    this.offset = newOffset;\n  }\n\n  storedWidth(width = BitWidth.WIDTH8): BitWidth {\n    return isInline(this.type) ? Math.max(width, this.width) : this.width;\n  }\n\n  storedPackedType(width = BitWidth.WIDTH8): ValueType {\n    return packedType(this.type, this.storedWidth(width));\n  }\n\n  isOffset(): boolean {\n    return !isInline(this.type);\n  }\n}\n"
  },
  {
    "path": "ts/flexbuffers/value-type-util.ts",
    "content": "import {ValueType} from './value-type.js';\n\nexport function isInline(value: ValueType): boolean {\n  return value === ValueType.BOOL || value <= ValueType.FLOAT;\n}\n\nexport function isNumber(value: ValueType): boolean {\n  return value >= ValueType.INT && value <= ValueType.FLOAT;\n}\n\nexport function isIndirectNumber(value: ValueType): boolean {\n  return value >= ValueType.INDIRECT_INT && value <= ValueType.INDIRECT_FLOAT;\n}\n\nexport function isTypedVectorElement(value: ValueType): boolean {\n  return (\n    value === ValueType.BOOL ||\n    (value >= ValueType.INT && value <= ValueType.STRING)\n  );\n}\n\nexport function isTypedVector(value: ValueType): boolean {\n  return (\n    value === ValueType.VECTOR_BOOL ||\n    (value >= ValueType.VECTOR_INT &&\n      value <= ValueType.VECTOR_STRING_DEPRECATED)\n  );\n}\n\nexport function isFixedTypedVector(value: ValueType): boolean {\n  return value >= ValueType.VECTOR_INT2 && value <= ValueType.VECTOR_FLOAT4;\n}\n\nexport function isAVector(value: ValueType): boolean {\n  return (\n    isTypedVector(value) ||\n    isFixedTypedVector(value) ||\n    value === ValueType.VECTOR\n  );\n}\n\nexport function toTypedVector(valueType: ValueType, length: number): ValueType {\n  if (length === 0) return valueType - ValueType.INT + ValueType.VECTOR_INT;\n  if (length === 2) return valueType - ValueType.INT + ValueType.VECTOR_INT2;\n  if (length === 3) return valueType - ValueType.INT + ValueType.VECTOR_INT3;\n  if (length === 4) return valueType - ValueType.INT + ValueType.VECTOR_INT4;\n  throw 'Unexpected length ' + length;\n}\n\nexport function typedVectorElementType(valueType: ValueType): ValueType {\n  return valueType - ValueType.VECTOR_INT + ValueType.INT;\n}\n\nexport function fixedTypedVectorElementType(valueType: ValueType): ValueType {\n  return ((valueType - ValueType.VECTOR_INT2) % 3) + ValueType.INT;\n}\n\nexport function fixedTypedVectorElementSize(valueType: ValueType): ValueType {\n  // The x / y >> 0 trick is to have an int division. Suppose to be faster than Math.floor()\n  return (((valueType - ValueType.VECTOR_INT2) / 3) >> 0) + 2;\n}\n\nexport function packedType(valueType: ValueType, bitWidth: number): ValueType {\n  return bitWidth | (valueType << 2);\n}\n"
  },
  {
    "path": "ts/flexbuffers/value-type.ts",
    "content": "export enum ValueType {\n  NULL = 0,\n  INT = 1,\n  UINT = 2,\n  FLOAT = 3,\n  KEY = 4,\n  STRING = 5,\n  INDIRECT_INT = 6,\n  INDIRECT_UINT = 7,\n  INDIRECT_FLOAT = 8,\n  MAP = 9,\n  VECTOR = 10,\n  VECTOR_INT = 11,\n  VECTOR_UINT = 12,\n  VECTOR_FLOAT = 13,\n  VECTOR_KEY = 14,\n  VECTOR_STRING_DEPRECATED = 15,\n  VECTOR_INT2 = 16,\n  VECTOR_UINT2 = 17,\n  VECTOR_FLOAT2 = 18,\n  VECTOR_INT3 = 19,\n  VECTOR_UINT3 = 20,\n  VECTOR_FLOAT3 = 21,\n  VECTOR_INT4 = 22,\n  VECTOR_UINT4 = 23,\n  VECTOR_FLOAT4 = 24,\n  BLOB = 25,\n  BOOL = 26,\n  VECTOR_BOOL = 36,\n}\n"
  },
  {
    "path": "ts/flexbuffers.ts",
    "content": "import {Builder} from './flexbuffers/builder.js';\nimport {toReference} from './flexbuffers/reference.js';\nexport {toReference} from './flexbuffers/reference.js';\n\nexport function builder(): Builder {\n  return new Builder();\n}\n\nexport function toObject(buffer: ArrayBuffer): unknown {\n  return toReference(buffer).toObject();\n}\n\nexport function encode(\n  object: unknown,\n  size = 2048,\n  deduplicateStrings = true,\n  deduplicateKeys = true,\n  deduplicateKeyVectors = true,\n): Uint8Array {\n  const builder = new Builder(\n    size > 0 ? size : 2048,\n    deduplicateStrings,\n    deduplicateKeys,\n    deduplicateKeyVectors,\n  );\n  builder.add(object);\n  return builder.finish();\n}\n"
  },
  {
    "path": "ts/types.ts",
    "content": "import {Builder} from './builder.js';\nimport {ByteBuffer} from './byte-buffer.js';\n\nexport type Offset = number;\n\nexport type Table = {\n  bb: ByteBuffer;\n  bb_pos: number;\n};\n\nexport interface IGeneratedObject {\n  pack(builder: Builder): Offset;\n}\n\nexport interface IUnpackableObject<T> {\n  unpack(): T;\n}\n"
  },
  {
    "path": "ts/utils.ts",
    "content": "export const int32 = new Int32Array(2);\nexport const float32 = new Float32Array(int32.buffer);\nexport const float64 = new Float64Array(int32.buffer);\nexport const isLittleEndian =\n  new Uint16Array(new Uint8Array([1, 0]).buffer)[0] === 1;\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"es2020\",\n    \"module\": \"commonjs\",\n    \"lib\": [\"ES2020\", \"DOM\"],\n    \"declaration\": true,\n    \"outDir\": \"./js\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"forceConsistentCasingInFileNames\": true\n  },\n  \"include\": [\n    \"ts/**/*.ts\"\n  ]\n}\n"
  },
  {
    "path": "tsconfig.mjs.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"es2020\",\n    \"module\": \"es2020\",\n    \"moduleResolution\": \"Bundler\",\n    \"lib\": [\"ES2020\", \"DOM\"],\n    \"declaration\": true,\n    \"outDir\": \"./mjs\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"forceConsistentCasingInFileNames\": true\n  },\n  \"include\": [\n    \"ts/**/*.ts\"\n  ]\n}\n"
  },
  {
    "path": "typescript.bzl",
    "content": "\"\"\"\nRules for building typescript flatbuffers with Bazel.\n\"\"\"\n\nload(\"@aspect_rules_js//js:defs.bzl\", \"js_library\")\nload(\":build_defs.bzl\", \"flatbuffer_library_public\")\n\nDEFAULT_FLATC_TS_ARGS = [\n    \"--gen-object-api\",\n    \"--gen-mutable\",\n    \"--reflect-names\",\n    \"--gen-name-strings\",\n    \"--ts-flat-files\",\n    \"--keep-prefix\",\n]\n\ndef flatbuffer_ts_library(\n        name,\n        srcs,\n        compatible_with = None,\n        target_compatible_with = None,\n        deps = [],\n        include_paths = None,\n        flatc_args = DEFAULT_FLATC_TS_ARGS,\n        visibility = None,\n        restricted_to = None,\n        gen_reflections = False):\n    \"\"\"Generates a ts_library rule for a given flatbuffer definition.\n\n    Args:\n      name: Name of the generated ts_library rule.\n      srcs: Source .fbs file(s).\n      deps: Other flatbuffer_ts_library's to depend on. Note that currently\n            you must specify all your transitive dependencies manually.\n      include_paths: Optional, list of paths the includes files can be found in.\n      flatc_args: Optional list of additional arguments to pass to flatc\n          (e.g. --gen-mutable).\n      visibility: The visibility of the generated cc_library. By default, use the\n          default visibility of the project.\n      compatible_with: Optional, The list of environments this rule can be built\n        for, in addition to default-supported environments.\n      restricted_to: Optional, The list of environments this rule can be built\n        for, instead of default-supported environments.\n      target_compatible_with: Optional, The list of target platform constraints\n        to use.\n      gen_reflections: Optional, if true this will generate the flatbuffer\n        reflection binaries for the schemas.\n    \"\"\"\n    srcs_lib = \"%s_srcs\" % (name)\n    out_base = [native.package_relative_label(s).name.removesuffix(\".fbs\") for s in srcs]\n\n    if len(srcs) != 1:\n        fail(\"flatbuffer_ts_library only supports one .fbs file per target currently.\")\n\n    outs = [\"%s_generated.cjs\" % s for s in out_base]\n    includes = [d + \"_includes\" for d in deps]\n    reflection_name = \"%s_reflection\" % name if gen_reflections else \"\"\n    flatbuffer_library_public(\n        name = srcs_lib,\n        srcs = srcs,\n        outs = outs,\n        language_flag = \"--ts\",\n        includes = includes,\n        include_paths = include_paths,\n        extra_env = \"ESBUILD_BIN=$(ESBUILD_BIN)\",\n        flatc_args = flatc_args + [\"--filename-suffix _generated\"],\n        compatible_with = compatible_with,\n        restricted_to = restricted_to,\n        reflection_name = reflection_name,\n        reflection_visibility = visibility,\n        target_compatible_with = target_compatible_with,\n        flatc_path = Label(\"//ts:compile_flat_file\"),\n        toolchains = [\"@aspect_rules_esbuild//esbuild:resolved_toolchain\"],\n        tools = [\"@aspect_rules_esbuild//esbuild:resolved_toolchain\"],\n    )\n    js_library(\n        name = name,\n        visibility = visibility,\n        compatible_with = compatible_with,\n        restricted_to = restricted_to,\n        target_compatible_with = target_compatible_with,\n        srcs = outs,\n    )\n    native.filegroup(\n        name = \"%s_includes\" % (name),\n        srcs = srcs + includes,\n        compatible_with = compatible_with,\n        restricted_to = restricted_to,\n        visibility = visibility,\n    )\n"
  }
]